Quellcode durchsuchen

feat: ✨ 构建页面

zhangtao vor 2 Tagen
Ursprung
Commit
59ac67f8a2

+ 1 - 0
package.json

@@ -72,6 +72,7 @@
     "@dcloudio/uni-quickapp-webview": "3.0.0-4060620250520001",
     "@vueuse/core": "^11.0.3",
     "alova": "^3.3.2",
+    "dayjs": "^1.11.13",
     "pinia": "^2.3.1",
     "vue": "~3.4.38",
     "vue-i18n": "^9.14.0",

+ 25 - 0
pnpm-lock.yaml

@@ -71,6 +71,9 @@ importers:
       alova:
         specifier: ^3.3.2
         version: 3.3.2
+      dayjs:
+        specifier: ^1.11.13
+        version: 1.11.13
       pinia:
         specifier: ^2.3.1
         version: 2.3.1(typescript@5.5.4)(vue@3.4.38(typescript@5.5.4))
@@ -2039,46 +2042,55 @@ packages:
     resolution: {integrity: sha512-sWWgdQ1fq+XKrlda8PsMCfut8caFwZBmhYeoehJ05FdI0YZXk6ZyUjWLrIgbR/VgiGycrFKMMgp7eJ69HOF2pQ==}
     cpu: [arm]
     os: [linux]
+    libc: [glibc]
 
   '@rollup/rollup-linux-arm-musleabihf@4.21.1':
     resolution: {integrity: sha512-9OIiSuj5EsYQlmwhmFRA0LRO0dRRjdCVZA3hnmZe1rEwRk11Jy3ECGGq3a7RrVEZ0/pCsYWx8jG3IvcrJ6RCew==}
     cpu: [arm]
     os: [linux]
+    libc: [musl]
 
   '@rollup/rollup-linux-arm64-gnu@4.21.1':
     resolution: {integrity: sha512-0kuAkRK4MeIUbzQYu63NrJmfoUVicajoRAL1bpwdYIYRcs57iyIV9NLcuyDyDXE2GiZCL4uhKSYAnyWpjZkWow==}
     cpu: [arm64]
     os: [linux]
+    libc: [glibc]
 
   '@rollup/rollup-linux-arm64-musl@4.21.1':
     resolution: {integrity: sha512-/6dYC9fZtfEY0vozpc5bx1RP4VrtEOhNQGb0HwvYNwXD1BBbwQ5cKIbUVVU7G2d5WRE90NfB922elN8ASXAJEA==}
     cpu: [arm64]
     os: [linux]
+    libc: [musl]
 
   '@rollup/rollup-linux-powerpc64le-gnu@4.21.1':
     resolution: {integrity: sha512-ltUWy+sHeAh3YZ91NUsV4Xg3uBXAlscQe8ZOXRCVAKLsivGuJsrkawYPUEyCV3DYa9urgJugMLn8Z3Z/6CeyRQ==}
     cpu: [ppc64]
     os: [linux]
+    libc: [glibc]
 
   '@rollup/rollup-linux-riscv64-gnu@4.21.1':
     resolution: {integrity: sha512-BggMndzI7Tlv4/abrgLwa/dxNEMn2gC61DCLrTzw8LkpSKel4o+O+gtjbnkevZ18SKkeN3ihRGPuBxjaetWzWg==}
     cpu: [riscv64]
     os: [linux]
+    libc: [glibc]
 
   '@rollup/rollup-linux-s390x-gnu@4.21.1':
     resolution: {integrity: sha512-z/9rtlGd/OMv+gb1mNSjElasMf9yXusAxnRDrBaYB+eS1shFm6/4/xDH1SAISO5729fFKUkJ88TkGPRUh8WSAA==}
     cpu: [s390x]
     os: [linux]
+    libc: [glibc]
 
   '@rollup/rollup-linux-x64-gnu@4.21.1':
     resolution: {integrity: sha512-kXQVcWqDcDKw0S2E0TmhlTLlUgAmMVqPrJZR+KpH/1ZaZhLSl23GZpQVmawBQGVhyP5WXIsIQ/zqbDBBYmxm5w==}
     cpu: [x64]
     os: [linux]
+    libc: [glibc]
 
   '@rollup/rollup-linux-x64-musl@4.21.1':
     resolution: {integrity: sha512-CbFv/WMQsSdl+bpX6rVbzR4kAjSSBuDgCqb1l4J68UYsQNalz5wOqLGYj4ZI0thGpyX5kc+LLZ9CL+kpqDovZA==}
     cpu: [x64]
     os: [linux]
+    libc: [musl]
 
   '@rollup/rollup-win32-arm64-msvc@4.21.1':
     resolution: {integrity: sha512-3Q3brDgA86gHXWHklrwdREKIrIbxC0ZgU8lwpj0eEKGBQH+31uPqr0P2v11pn0tSIxHvcdOWxa4j+YvLNx1i6g==}
@@ -2525,41 +2537,49 @@ packages:
     resolution: {integrity: sha512-UYA0MA8ajkEDCFRQdng/FVx3F6szBvk3EPnkTTQuuO9lV1kPGuTB+V9TmbDxy5ikaEgyWKxa4CI3ySjklZ9lFA==}
     cpu: [arm64]
     os: [linux]
+    libc: [glibc]
 
   '@unrs/resolver-binding-linux-arm64-musl@1.9.2':
     resolution: {integrity: sha512-P/CO3ODU9YJIHFqAkHbquKtFst0COxdphc8TKGL5yCX75GOiVpGqd1d15ahpqu8xXVsqP4MGFP2C3LRZnnL5MA==}
     cpu: [arm64]
     os: [linux]
+    libc: [musl]
 
   '@unrs/resolver-binding-linux-ppc64-gnu@1.9.2':
     resolution: {integrity: sha512-uKStFlOELBxBum2s1hODPtgJhY4NxYJE9pAeyBgNEzHgTqTiVBPjfTlPFJkfxyTjQEuxZbbJlJnMCrRgD7ubzw==}
     cpu: [ppc64]
     os: [linux]
+    libc: [glibc]
 
   '@unrs/resolver-binding-linux-riscv64-gnu@1.9.2':
     resolution: {integrity: sha512-LkbNnZlhINfY9gK30AHs26IIVEZ9PEl9qOScYdmY2o81imJYI4IMnJiW0vJVtXaDHvBvxeAgEy5CflwJFIl3tQ==}
     cpu: [riscv64]
     os: [linux]
+    libc: [glibc]
 
   '@unrs/resolver-binding-linux-riscv64-musl@1.9.2':
     resolution: {integrity: sha512-vI+e6FzLyZHSLFNomPi+nT+qUWN4YSj8pFtQZSFTtmgFoxqB6NyjxSjAxEC1m93qn6hUXhIsh8WMp+fGgxCoRg==}
     cpu: [riscv64]
     os: [linux]
+    libc: [musl]
 
   '@unrs/resolver-binding-linux-s390x-gnu@1.9.2':
     resolution: {integrity: sha512-sSO4AlAYhSM2RAzBsRpahcJB1msc6uYLAtP6pesPbZtptF8OU/CbCPhSRW6cnYOGuVmEmWVW5xVboAqCnWTeHQ==}
     cpu: [s390x]
     os: [linux]
+    libc: [glibc]
 
   '@unrs/resolver-binding-linux-x64-gnu@1.9.2':
     resolution: {integrity: sha512-jkSkwch0uPFva20Mdu8orbQjv2A3G88NExTN2oPTI1AJ+7mZfYW3cDCTyoH6OnctBKbBVeJCEqh0U02lTkqD5w==}
     cpu: [x64]
     os: [linux]
+    libc: [glibc]
 
   '@unrs/resolver-binding-linux-x64-musl@1.9.2':
     resolution: {integrity: sha512-Uk64NoiTpQbkpl+bXsbeyOPRpUoMdcUqa+hDC1KhMW7aN1lfW8PBlBH4mJ3n3Y47dYE8qi0XTxy1mBACruYBaw==}
     cpu: [x64]
     os: [linux]
+    libc: [musl]
 
   '@unrs/resolver-binding-wasm32-wasi@1.9.2':
     resolution: {integrity: sha512-EpBGwkcjDicjR/ybC0g8wO5adPNdVuMrNalVgYcWi+gYtC1XYNuxe3rufcO7dA76OHGeVabcO6cSkPJKVcbCXQ==}
@@ -3432,6 +3452,9 @@ packages:
   dateformat@3.0.3:
     resolution: {integrity: sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==}
 
+  dayjs@1.11.13:
+    resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==}
+
   de-indent@1.0.2:
     resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==}
 
@@ -11258,6 +11281,8 @@ snapshots:
 
   dateformat@3.0.3: {}
 
+  dayjs@1.11.13: {}
+
   de-indent@1.0.2: {}
 
   debug@2.6.9:

+ 9 - 1
src/App.vue

@@ -1,7 +1,7 @@
 <script setup lang="ts">
 onLaunch(() => {});
 </script>
-<style>
+<style lang="scss">
 .header {
   background: linear-gradient(180deg, #e4efff 0%, #f9fcff 45%, #f6f6f6 100%);
 }
@@ -9,4 +9,12 @@ onLaunch(() => {});
 .bottom-safe-area {
   padding-bottom: env(safe-area-inset-bottom);
 }
+:deep(.wd-divider) {
+  padding: 0 !important;
+}
+.formItem {
+  :deep(.inputClass) {
+    background: none !important;
+  }
+}
 </style>

+ 7 - 0
src/components.d.ts

@@ -10,10 +10,15 @@ declare module 'vue' {
     ClassItem: typeof import('./components/classItem/index.vue')['default']
     Commonbtn: typeof import('./components/commonbtn/index.vue')['default']
     Course: typeof import('./components/course/index.vue')['default']
+    CustomFormItem: typeof import('./components/customFormItem/index.vue')['default']
     Fixdbtn: typeof import('./components/fixdbtn/index.vue')['default']
     WdBadge: typeof import('wot-design-uni/components/wd-badge/wd-badge.vue')['default']
     WdButton: typeof import('wot-design-uni/components/wd-button/wd-button.vue')['default']
+    WdCard: typeof import('wot-design-uni/components/wd-card/wd-card.vue')['default']
+    WdCheckbox: typeof import('wot-design-uni/components/wd-checkbox/wd-checkbox.vue')['default']
+    WdCheckboxGroup: typeof import('wot-design-uni/components/wd-checkbox-group/wd-checkbox-group.vue')['default']
     WdConfigProvider: typeof import('wot-design-uni/components/wd-config-provider/wd-config-provider.vue')['default']
+    WdDatetimePicker: typeof import('wot-design-uni/components/wd-datetime-picker/wd-datetime-picker.vue')['default']
     WdDivider: typeof import('wot-design-uni/components/wd-divider/wd-divider.vue')['default']
     WdDropMenu: typeof import('wot-design-uni/components/wd-drop-menu/wd-drop-menu.vue')['default']
     WdDropMenuItem: typeof import('wot-design-uni/components/wd-drop-menu-item/wd-drop-menu-item.vue')['default']
@@ -23,9 +28,11 @@ declare module 'vue' {
     WdNavbar: typeof import('wot-design-uni/components/wd-navbar/wd-navbar.vue')['default']
     WdNoticeBar: typeof import('wot-design-uni/components/wd-notice-bar/wd-notice-bar.vue')['default']
     WdNotify: typeof import('wot-design-uni/components/wd-notify/wd-notify.vue')['default']
+    WdPopup: typeof import('wot-design-uni/components/wd-popup/wd-popup.vue')['default']
     WdRate: typeof import('wot-design-uni/components/wd-rate/wd-rate.vue')['default']
     WdSearch: typeof import('wot-design-uni/components/wd-search/wd-search.vue')['default']
     WdSelectPicker: typeof import('wot-design-uni/components/wd-select-picker/wd-select-picker.vue')['default']
+    WdSwitch: typeof import('wot-design-uni/components/wd-switch/wd-switch.vue')['default']
     WdTab: typeof import('wot-design-uni/components/wd-tab/wd-tab.vue')['default']
     WdTabbar: typeof import('wot-design-uni/components/wd-tabbar/wd-tabbar.vue')['default']
     WdTabbarItem: typeof import('wot-design-uni/components/wd-tabbar-item/wd-tabbar-item.vue')['default']

+ 7 - 0
src/components/course/index.vue

@@ -32,6 +32,13 @@ interface props {
 const props = defineProps<props>();
 function handleDetailes() {
   if (props.disabled) return;
+  if (props.type == 3) {
+    uni.navigateTo({
+      url: `/subPack/Makeupclass/index`,
+    });
+
+    return;
+  }
   uni.navigateTo({
     url: `/subPack/classInspectionDetaile/index?type=${props.type}`,
   });

+ 21 - 0
src/components/customFormItem/index.vue

@@ -0,0 +1,21 @@
+<template>
+  <view class="mb24rpx formItem">
+    <view class="flex items-center">
+      <view class="text-#FB5B5B font-semibold" v-if="required">*</view>
+      <view class="font-semibold ml20rpx">{{ label }}</view>
+    </view>
+    <view class="bg-#F6F6F6 rounded-16rpx input mt20rpx">
+      <slot></slot>
+    </view>
+  </view>
+</template>
+
+<script setup lang="ts">
+const props = defineProps<{ label: string; required?: boolean }>();
+</script>
+
+<style scoped lang="scss">
+.input {
+  padding: 20rpx 24rpx;
+}
+</style>

+ 1 - 1
src/components/fixdbtn/index.vue

@@ -2,7 +2,7 @@
   <view
     class="bg-white w-full fixed bottom-0 bottom-safe-area px32rpx pt-16rpx box-border rounded-t-32rpx box"
   >
-    <wd-button v-bind="{ ...$attrs, ...props }">
+    <wd-button v-bind="{ ...$attrs, ...props }" @click="$emit('click')">
       <slot></slot>
     </wd-button>
   </view>

+ 5 - 0
src/env.d.ts

@@ -1 +1,6 @@
 /// <reference types="vite/client" />
+declare module "*.vue" {
+  import { ComponentOptions } from "vue";
+  const componentOptions: ComponentOptions;
+  export default componentOptions;
+}

+ 43 - 1
src/pages.json

@@ -6,7 +6,8 @@
       "name": "home",
       "style": {
         "navigationBarTitleText": "首页",
-        "navigationStyle": "custom"
+        "navigationStyle": "custom",
+        "disableScroll": true
       }
     },
     {
@@ -72,6 +73,23 @@
             "navigationStyle": "custom"
           }
         },
+        {
+          "path": "EmployeeList/index",
+          "type": "page",
+          "name": "EmployeeList",
+          "style": {
+            "navigationBarTitleText": "员工管理"
+          }
+        },
+        {
+          "path": "EmployeeListAdd/index",
+          "type": "page",
+          "name": "EmployeeListAdd",
+          "style": {
+            "navigationBarTitleText": "员工管理",
+            "navigationStyle": "custom"
+          }
+        },
         {
           "path": "Evaluation/index",
           "type": "page",
@@ -89,6 +107,14 @@
             "navigationBarTitleText": "填写延期信息"
           }
         },
+        {
+          "path": "Makeupclass/index",
+          "type": "page",
+          "name": "Makeupclass",
+          "style": {
+            "navigationBarTitleText": "补课课表"
+          }
+        },
         {
           "path": "notification/index",
           "type": "page",
@@ -129,6 +155,14 @@
             "navigationBarTitleText": "选择课程"
           }
         },
+        {
+          "path": "Storebalance/index",
+          "type": "page",
+          "name": "Storebalance",
+          "style": {
+            "navigationBarTitleText": "店铺余额"
+          }
+        },
         {
           "path": "writeOff/index",
           "type": "page",
@@ -136,6 +170,14 @@
           "style": {
             "navigationBarTitleText": "扫码核销"
           }
+        },
+        {
+          "path": "writeOffDetaile/index",
+          "type": "page",
+          "name": "writeOffDetaile",
+          "style": {
+            "navigationBarTitleText": "核销明细"
+          }
         }
       ]
     }

+ 18 - 5
src/pages/index/index.vue

@@ -98,11 +98,17 @@ const value = ref<number>(0);
       <view class="mt-3 rounded-2xl bg-white p-28rpx">
         <view class="font-semibold text-32rpx">门店经营</view>
         <view class="grid grid-cols-4 gap-3 mt-3">
-          <view class="flex items-center justify-center flex-col">
+          <view
+            class="flex items-center justify-center flex-col"
+            @click="handleCommenPath('/subPack/writeOffDetaile/index')"
+          >
             <image src="@/static/index/hx.png" class="w-52rpx h-52rpx"></image>
             <view class="text-24rpx text-[rgb(0,0,0,0.6)] mt-3">核销明细</view>
           </view>
-          <view class="flex items-center justify-center flex-col">
+          <view
+            class="flex items-center justify-center flex-col"
+            @click="handleCommenPath('/subPack/classInspection/index?type=3')"
+          >
             <image src="@/static/index/bk.png" class="w-52rpx h-52rpx"></image>
             <view class="text-24rpx text-[rgb(0,0,0,0.6)] mt-3">补课课表</view>
           </view>
@@ -113,11 +119,17 @@ const value = ref<number>(0);
             <image src="@/static/index/pj.png" class="w-52rpx h-52rpx"></image>
             <view class="text-24rpx text-[rgb(0,0,0,0.6)] mt-3">评价管理</view>
           </view>
-          <view class="flex items-center justify-center flex-col">
+          <view
+            class="flex items-center justify-center flex-col"
+            @click="handleCommenPath('/subPack/Storebalance/index')"
+          >
             <image src="@/static/index/ye.png" class="w-52rpx h-52rpx"></image>
             <view class="text-24rpx text-[rgb(0,0,0,0.6)] mt-3">店铺余额</view>
           </view>
-          <view class="flex items-center justify-center flex-col">
+          <view
+            class="flex items-center justify-center flex-col"
+            @click="handleCommenPath('/subPack/EmployeeList/index')"
+          >
             <image src="@/static/index/yg.png" class="w-52rpx h-52rpx"></image>
             <view class="text-24rpx text-[rgb(0,0,0,0.6)] mt-3">员工管理</view>
           </view>
@@ -136,7 +148,8 @@ const value = ref<number>(0);
   "name": "home",
   "style": {
     "navigationBarTitleText": "首页",
-    "navigationStyle": "custom"
+    "navigationStyle": "custom",
+    "disableScroll": true
   }
 }
 </route>

+ 59 - 0
src/subPack/EmployeeList/index.vue

@@ -0,0 +1,59 @@
+<template>
+  <view class="px32rpx py-20rpx">
+    <!-- <view class="bg-white p24rpx rounded-32rpx box-border"> </view> -->
+    <wd-card type="rectangle" v-for="item in 10">
+      <template #title>
+        <view class="flex items-center">
+          <view class="font-semibold text-32rpx">昵称 艾卡西亚大暴雨</view>
+          <view class="px16rpx py4rpx text-white ml20rpx">正常</view>
+        </view>
+      </template>
+      <view class="text-[rgb(0,0,0,0.3)]"
+        >观山湖一店、观山湖二店、观山湖三店、观山湖四店、观山
+        湖五店、观山湖六店、</view
+      >
+      <template #footer>
+        <view class="flex items-center justify-between w-full">
+          <wd-switch />
+          <view class="flex items-center">
+            <view class="mr20rpx">
+              <commonbtn bg-color="rgba(255,88,105,0.2)"
+                ><text class="text-#FF5869">删除</text>
+              </commonbtn>
+            </view>
+            <commonbtn bg-color="rgba(0,116,255,0.2)"
+              ><text class="text-#0074FF">修改</text>
+            </commonbtn>
+          </view>
+        </view>
+      </template>
+    </wd-card>
+    <view class="h150rpx"></view>
+  </view>
+  <fixdbtn block size="large" @click="handleAdd">新增员工</fixdbtn>
+</template>
+
+<script setup lang="ts">
+function handleAdd() {
+  uni.navigateTo({
+    url: "/subPack/EmployeeListAdd/index?type=0",
+  });
+}
+</script>
+
+<style scoped>
+:deep(.wd-card) {
+  border-radius: 32rpx !important;
+}
+:deep(.wd-card.is-rectangle .wd-card__content::after) {
+  height: 0 !important;
+}
+</style>
+<route lang="json">
+{
+  "name": "EmployeeList",
+  "style": {
+    "navigationBarTitleText": "员工管理"
+  }
+}
+</route>

+ 632 - 0
src/subPack/EmployeeListAdd/components/tree/index.vue

@@ -0,0 +1,632 @@
+<!-- 树形层级选择器-->
+<!-- 1、支持单选、多选 -->
+<template>
+  <view class="tree-view">
+    <block v-for="(item, index) in treeList" :key="index">
+      <view
+        class="tree-item"
+        :style="[
+          {
+            paddingLeft: item.level * 30 + 'rpx',
+          },
+        ]"
+        :class="{
+          itemBorder: border === true,
+          show: item.isShow,
+        }"
+      >
+        <view class="item-label">
+          <view
+            class="item-icon uni-inline-item"
+            @tap.stop="_onItemSwitch(item, index)"
+          >
+            <view
+              v-if="!item.isLastLevel && item.isShowChild"
+              class="switch-on"
+              :style="{ 'border-left-color': switchColor }"
+            >
+            </view>
+            <view
+              v-else-if="!item.isLastLevel && !item.isShowChild"
+              class="switch-off"
+              :style="{ 'border-top-color': switchColor }"
+            >
+            </view>
+            <!-- <view
+              v-else
+              class="item-last-dot"
+              :style="{ 'border-top-color': switchColor }"
+            >
+            </view> -->
+          </view>
+          <view
+            class="flex items-center"
+            @tap.stop="_onItemSelect(item, index)"
+          >
+            <view
+              class="item-check"
+              v-if="selectParent ? true : item.isLastLevel"
+            >
+              <view
+                class="item-check-yes"
+                v-if="item.checkStatus == 1"
+                :class="{ radio: !multiple }"
+                :style="{ 'border-color': confirmColor }"
+              >
+                <view
+                  class="item-check-yes-part"
+                  :style="{ 'background-color': confirmColor }"
+                >
+                </view>
+              </view>
+              <view
+                class="item-check-yes"
+                v-else-if="item.checkStatus == 2"
+                :class="{ radio: !multiple }"
+                :style="{ 'border-color': confirmColor }"
+              >
+                <view
+                  class="item-check-yes-all"
+                  :style="{ 'background-color': confirmColor }"
+                >
+                </view>
+              </view>
+              <view
+                class="item-check-no"
+                v-else
+                :class="{ radio: !multiple }"
+                :style="{ 'border-color': confirmColor }"
+              ></view>
+            </view>
+            <view class="item-name">
+              {{
+                item.name + (item.childCount ? "(" + item.childCount + ")" : "")
+              }}
+            </view>
+          </view>
+        </view>
+      </view>
+    </block>
+  </view>
+</template>
+
+<script>
+export default {
+  emits: ["select-change"],
+  name: "tree-picker",
+  props: {
+    valueKey: {
+      type: String,
+      default: "id",
+    },
+    textKey: {
+      type: String,
+      default: "name",
+    },
+    childrenKey: {
+      type: String,
+      default: "children",
+    },
+    localdata: {
+      type: Array,
+      default: function () {
+        return [];
+      },
+    },
+    localTreeList: {
+      //在已经格式化好的数据
+      type: Array,
+      default: function () {
+        return [];
+      },
+    },
+    selectedData: {
+      type: Array,
+      default: function () {
+        return [];
+      },
+    },
+    title: {
+      type: String,
+      default: "",
+    },
+    multiple: {
+      // 是否可以多选
+      type: Boolean,
+      default: true,
+    },
+    selectParent: {
+      //是否可以选父级
+      type: Boolean,
+      default: true,
+    },
+    confirmColor: {
+      // 确定按钮颜色
+      type: String,
+      default: "", // #0055ff
+    },
+    cancelColor: {
+      // 取消按钮颜色
+      type: String,
+      default: "", // #757575
+    },
+    titleColor: {
+      // 标题颜色
+      type: String,
+      default: "", //
+    },
+    switchColor: {
+      // 节点切换图标颜色
+      type: String,
+      default: "", // #666
+    },
+    border: {
+      // 是否有分割线
+      type: Boolean,
+      default: false,
+    },
+  },
+  data() {
+    return {
+      showDialog: false,
+      treeList: [],
+    };
+  },
+  computed: {},
+  methods: {
+    _show() {
+      this.showDialog = true;
+    },
+    _hide() {
+      this.showDialog = false;
+    },
+    _cancel() {
+      this._hide();
+      this.$emit("cancel", "");
+    },
+    _confirm() {
+      //多选
+      let selectedList = []; //如果子集全部选中,只返回父级 id
+      let selectedNames;
+      let currentLevel = -1;
+      this.treeList.forEach((item, index) => {
+        if (currentLevel >= 0 && item.level > currentLevel) {
+        } else {
+          if (item.checkStatus === 2) {
+            currentLevel = item.level;
+            selectedList.push(item.id);
+            selectedNames = selectedNames
+              ? selectedNames + " / " + item.name
+              : item.name;
+          } else {
+            currentLevel = -1;
+          }
+        }
+      });
+      //console.log('_confirm', selectedList);
+      this._hide();
+      this.$emit("select-change", selectedList, selectedNames);
+    },
+    //格式化原数据(原数据为tree结构)
+    _formatTreeData(list = [], level = 0, parentItem, isShowChild = true) {
+      let nextIndex = 0;
+      let parentId = -1;
+      let initCheckStatus = 0;
+      if (parentItem) {
+        nextIndex =
+          this.treeList.findIndex((item) => item.id === parentItem.id) + 1;
+        parentId = parentItem.id;
+        if (!this.multiple) {
+          //单选
+          initCheckStatus = 0;
+        } else initCheckStatus = parentItem.checkStatus == 2 ? 2 : 0;
+      }
+      list.forEach((item) => {
+        let isLastLevel = true;
+        if (item && item[this.childrenKey]) {
+          let children = item[this.childrenKey];
+          if (Array.isArray(children) && children.length > 0) {
+            isLastLevel = false;
+          }
+        }
+
+        let itemT = {
+          id: item[this.valueKey],
+          name: item[this.textKey],
+          level,
+          isLastLevel,
+          isShow: isShowChild,
+          isShowChild: false,
+          checkStatus: initCheckStatus,
+          orCheckStatus: 0,
+          parentId,
+          children: item[this.childrenKey],
+          childCount: item[this.childrenKey]
+            ? item[this.childrenKey].length
+            : 0,
+          childCheckCount: 0,
+          childCheckPCount: 0,
+        };
+
+        if (this.selectedData.indexOf(itemT.id) >= 0) {
+          itemT.checkStatus = 2;
+          itemT.orCheckStatus = 2;
+          itemT.childCheckCount = itemT.children ? itemT.children.length : 0;
+          this._onItemParentSelect(itemT, nextIndex);
+        }
+
+        this.treeList.splice(nextIndex, 0, itemT);
+        nextIndex++;
+      });
+      //console.log(this.treeList);
+    },
+    // 节点打开、关闭切换
+    _onItemSwitch(item, index) {
+      // console.log(item)
+      //console.log('_itemSwitch')
+      if (item.isLastLevel === true) {
+        return;
+      }
+      item.isShowChild = !item.isShowChild;
+      if (item.children) {
+        this._formatTreeData(item.children, item.level + 1, item);
+        item.children = undefined;
+      } else {
+        this._onItemChildSwitch(item, index);
+      }
+    },
+    _onItemChildSwitch(item, index) {
+      //console.log('_onItemChildSwitch')
+      const firstChildIndex = index + 1;
+      if (firstChildIndex > 0)
+        for (var i = firstChildIndex; i < this.treeList.length; i++) {
+          let itemChild = this.treeList[i];
+          if (itemChild.level > item.level) {
+            if (item.isShowChild) {
+              if (itemChild.parentId === item.id) {
+                itemChild.isShow = item.isShowChild;
+                if (!itemChild.isShow) {
+                  itemChild.isShowChild = false;
+                }
+              }
+            } else {
+              itemChild.isShow = item.isShowChild;
+              itemChild.isShowChild = false;
+            }
+          } else {
+            return;
+          }
+        }
+    },
+    // 节点选中、取消选中
+    _onItemSelect(item, index) {
+      //console.log('_onItemSelect')
+      //console.log(item)
+      if (!this.multiple) {
+        //单选
+        item.checkStatus = item.checkStatus == 0 ? 2 : 0;
+
+        this.treeList.forEach((v, i) => {
+          if (i != index) {
+            this.treeList[i].checkStatus = 0;
+          } else {
+            this.treeList[i].checkStatus = 2;
+          }
+        });
+
+        let selectedList = [];
+        let selectedNames;
+        selectedList.push(item.id);
+        selectedNames = item.name;
+        this._hide();
+        this.$emit("select-change", selectedList, selectedNames);
+        return;
+      }
+
+      let oldCheckStatus = item.checkStatus;
+      switch (oldCheckStatus) {
+        case 0:
+          item.checkStatus = 2;
+          item.childCheckCount = item.childCount;
+          item.childCheckPCount = 0;
+          break;
+        case 1:
+        case 2:
+          item.checkStatus = 0;
+          item.childCheckCount = 0;
+          item.childCheckPCount = 0;
+          break;
+        default:
+          break;
+      }
+      //子节点 全部选中
+      this._onItemChildSelect(item, index);
+      //父节点 选中状态变化
+      this._onItemParentSelect(item, index, oldCheckStatus);
+    },
+    _onItemChildSelect(item, index) {
+      //console.log('_onItemChildSelect')
+      let allChildCount = 0;
+      if (item.childCount && item.childCount > 0) {
+        index++;
+        while (
+          index < this.treeList.length &&
+          this.treeList[index].level > item.level
+        ) {
+          let itemChild = this.treeList[index];
+          itemChild.checkStatus = item.checkStatus;
+          if (itemChild.checkStatus == 2) {
+            itemChild.childCheckCount = itemChild.childCount;
+            itemChild.childCheckPCount = 0;
+          } else if (itemChild.checkStatus == 0) {
+            itemChild.childCheckCount = 0;
+            itemChild.childCheckPCount = 0;
+          }
+          // console.log('>>>>index:', index, 'item:', itemChild.name, '  status:', itemChild
+          // 	.checkStatus)
+          index++;
+        }
+      }
+    },
+    _onItemParentSelect(item, index, oldCheckStatus) {
+      //console.log('_onItemParentSelect')
+      //console.log(item)
+      const parentIndex = this.treeList.findIndex(
+        (itemP) => itemP.id == item.parentId,
+      );
+      //console.log('parentIndex:' + parentIndex)
+      if (parentIndex >= 0) {
+        let itemParent = this.treeList[parentIndex];
+        let count = itemParent.childCheckCount;
+        let oldCheckStatusParent = itemParent.checkStatus;
+
+        if (oldCheckStatus == 1) {
+          itemParent.childCheckPCount -= 1;
+        } else if (oldCheckStatus == 2) {
+          itemParent.childCheckCount -= 1;
+        }
+        if (item.checkStatus == 1) {
+          itemParent.childCheckPCount += 1;
+        } else if (item.checkStatus == 2) {
+          itemParent.childCheckCount += 1;
+        }
+
+        if (
+          itemParent.childCheckCount <= 0 &&
+          itemParent.childCheckPCount <= 0
+        ) {
+          itemParent.childCheckCount = 0;
+          itemParent.childCheckPCount = 0;
+          itemParent.checkStatus = 0;
+        } else if (itemParent.childCheckCount >= itemParent.childCount) {
+          itemParent.childCheckCount = itemParent.childCount;
+          itemParent.childCheckPCount = 0;
+          itemParent.checkStatus = 2;
+        } else {
+          itemParent.checkStatus = 1;
+        }
+        //console.log('itemParent:', itemParent)
+        this._onItemParentSelect(itemParent, parentIndex, oldCheckStatusParent);
+      }
+    },
+    // 重置数据
+    _reTreeList() {
+      this.treeList.forEach((v, i) => {
+        this.treeList[i].checkStatus = v.orCheckStatus;
+      });
+    },
+    _initTree() {
+      this.treeList = [];
+      this._formatTreeData(this.localdata);
+    },
+  },
+  watch: {
+    localdata() {
+      this._initTree();
+    },
+    localTreeList() {
+      this.treeList = this.localTreeList;
+    },
+  },
+  mounted() {
+    this._initTree();
+  },
+};
+</script>
+
+<style scoped>
+.tree-bar {
+  /* background-color: #fff; */
+  height: 90rpx;
+  padding-left: 25rpx;
+  padding-right: 25rpx;
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  box-sizing: border-box;
+  border-bottom-width: 1rpx !important;
+  border-bottom-style: solid;
+  border-bottom-color: #f5f5f5;
+  font-size: 32rpx;
+  color: #757575;
+  line-height: 1;
+}
+
+.tree-bar-confirm {
+  color: #0055ff;
+  padding: 15rpx;
+}
+
+.tree-bar-title {
+}
+
+.tree-bar-cancel {
+  color: #757575;
+  padding: 15rpx;
+}
+
+.tree-view {
+  flex: 1;
+  padding: 20rpx;
+  /* #ifndef APP-NVUE */
+  display: flex;
+  /* #endif */
+  flex-direction: column;
+  overflow: hidden;
+  height: 100%;
+}
+
+.tree-list {
+  flex: 1;
+  height: 100%;
+  overflow: hidden;
+}
+
+.tree-item {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  line-height: 1;
+  height: 0;
+  opacity: 0;
+  transition: 0.2s;
+  overflow: hidden;
+  position: relative;
+}
+
+.tree-item.show {
+  height: 90rpx;
+  opacity: 1;
+}
+
+.tree-item.showchild:before {
+  transform: rotate(90deg);
+}
+
+.tree-item.last:before {
+  opacity: 0;
+}
+
+.switch-on {
+  width: 0;
+  height: 0;
+  border-left: 10rpx solid transparent;
+  border-right: 10rpx solid transparent;
+  border-top: 15rpx solid #666;
+}
+
+.switch-off {
+  width: 0;
+  height: 0;
+  border-bottom: 10rpx solid transparent;
+  border-top: 10rpx solid transparent;
+  border-left: 15rpx solid #666;
+}
+
+.item-last-dot {
+  position: absolute;
+  width: 10rpx;
+  height: 10rpx;
+  border-radius: 100%;
+  background: #666;
+}
+
+.item-icon {
+  width: 26rpx;
+  height: 26rpx;
+  padding-left: 20rpx;
+}
+
+.item-label {
+  flex: 1;
+  display: flex;
+  align-items: center;
+  height: 100%;
+  line-height: 1.2;
+}
+
+.item-name {
+  flex: 1;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  width: 450rpx;
+}
+
+.item-check {
+  width: 40px;
+  height: 40px;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+}
+
+.item-check-yes,
+.item-check-no {
+  width: 20px;
+  height: 20px;
+  border-top-left-radius: 20%;
+  border-top-right-radius: 20%;
+  border-bottom-right-radius: 20%;
+  border-bottom-left-radius: 20%;
+  border-top-width: 1rpx;
+  border-left-width: 1rpx;
+  border-bottom-width: 1rpx;
+  border-right-width: 1rpx;
+  border-style: solid;
+  border-color: rgba(0, 0, 0, 0.3);
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  box-sizing: border-box;
+}
+.item-check-yes {
+  background: #0074ff;
+}
+
+.item-check-yes-part {
+  width: 80%;
+  height: 6rpx;
+  border-top-left-radius: 20%;
+  border-top-right-radius: 20%;
+  border-bottom-right-radius: 20%;
+  border-bottom-left-radius: 20%;
+  background-color: #fff;
+}
+
+.item-check-yes-all {
+  margin-bottom: 5px;
+  border: 2px solid #fff;
+  border-left: 0;
+  border-top: 0;
+  height: 12px;
+  width: 6px;
+  transform-origin: center;
+  /* #ifndef APP-NVUE */
+  transition: all 0.3s;
+  /* #endif */
+  transform: rotate(45deg);
+}
+
+.item-check .radio {
+  border-top-left-radius: 50%;
+  border-top-right-radius: 50%;
+  border-bottom-right-radius: 50%;
+  border-bottom-left-radius: 50%;
+}
+
+.item-check .radio .item-check-yes-b {
+  border-top-left-radius: 50%;
+  border-top-right-radius: 50%;
+  border-bottom-right-radius: 50%;
+  border-bottom-left-radius: 50%;
+}
+
+.hover-c {
+  opacity: 0.6;
+}
+
+.itemBorder {
+  border-bottom: 1px solid #e5e5e5;
+}
+</style>

+ 187 - 0
src/subPack/EmployeeListAdd/index.vue

@@ -0,0 +1,187 @@
+<template>
+  <wd-navbar
+    :title="titleArr[type]"
+    fixed
+    placeholder
+    safeAreaInsetTop
+    :bordered="false"
+    leftArrow
+    @click-left="handleClickLeft"
+  ></wd-navbar>
+  <view class="py20rpx">
+    <view class="bg-white px32rpx py28rpx">
+      <customFormItem label="用户名称" required>
+        <wd-input
+          type="text"
+          placeholder="请输入用户名称"
+          no-border
+          custom-class="inputClass"
+        />
+      </customFormItem>
+      <customFormItem label="归属部门" required>
+        <view @click="handleShow">
+          <wd-input
+            type="text"
+            placeholder="请选择归属部门"
+            no-border
+            custom-class="inputClass"
+            readonly
+          >
+            <template #suffix>
+              <wd-icon
+                name="arrow-down"
+                size="22px"
+                color="rgba(0,0,0,0.3)"
+              ></wd-icon>
+            </template>
+          </wd-input>
+        </view>
+      </customFormItem>
+      <customFormItem label="登录账号" required>
+        <wd-input
+          type="text"
+          placeholder="请输入登录账号"
+          no-border
+          custom-class="inputClass"
+        />
+      </customFormItem>
+      <customFormItem label="登录密码" required>
+        <wd-input
+          show-password
+          placeholder="请输入登录密码"
+          no-border
+          custom-class="inputClass"
+        />
+      </customFormItem>
+    </view>
+  </view>
+
+  <fixdbtn block size="large">确认</fixdbtn>
+  <view class="customPopup">
+    <wd-popup
+      v-model="treeFlage"
+      custom-style="border-radius:32rpx;background: #F6F6F6 !important;"
+      position="bottom"
+      safe-area-inset-bottom
+      lockScroll
+    >
+      <view class="px32rpx py28rpx">
+        <view class="text-32rpx font-semibold text-center">归属部门</view>
+        <view class="mt28rpx bg-white h-700rpx rounded-32rpx overflow-y-scroll">
+          <scroll-view scroll-y>
+            <tree
+              :localdata="data"
+              valueKey="id"
+              textKey="name"
+              childrenKey="children"
+              ref="treePicker"
+            ></tree>
+          </scroll-view>
+        </view>
+        <view class="mt24rpx flex items-center justify-between">
+          <view class="w332rpx">
+            <wd-button type="info" size="large" block>重置</wd-button>
+          </view>
+          <view class="w332rpx">
+            <wd-button size="large" block>确认</wd-button>
+          </view>
+        </view>
+      </view>
+    </wd-popup>
+  </view>
+</template>
+
+<script setup lang="ts">
+import tree from "./components/tree/index.vue";
+const titleArr = ["新增员工", "编辑员工"];
+const treePicker = ref();
+const type = ref(0);
+const treeFlage = ref(false);
+onLoad((query: any) => {
+  type.value = query.type;
+});
+function handleShow() {
+  // treePicker.value._show();
+  treeFlage.value = true;
+  console.log(treePicker.value);
+}
+function handleClickLeft() {
+  uni.navigateBack();
+}
+const data = [
+  {
+    id: 1,
+    name: "公司1",
+    children: [
+      {
+        id: 11,
+        name: "研发部",
+        children: [
+          {
+            id: 111,
+            name: "张三",
+          },
+          {
+            id: 112,
+            name: "李四",
+          },
+        ],
+      },
+      {
+        id: 12,
+        name: "综合部",
+      },
+    ],
+  },
+  {
+    id: 2,
+    name: "公司2",
+    children: [
+      {
+        id: 21,
+        name: "研发部",
+      },
+      {
+        id: 22,
+        name: "综合部",
+      },
+      {
+        id: 23,
+        name: "财务部",
+      },
+    ],
+  },
+  {
+    id: 3,
+    name: "公司3",
+  },
+  {
+    id: 4,
+    name: "公司4",
+    children: [
+      {
+        id: 41,
+        name: "研发部",
+      },
+    ],
+  },
+];
+</script>
+
+<style scoped lang="scss">
+:deep(.wd-card) {
+  border-radius: 32rpx !important;
+}
+:deep(.wd-card.is-rectangle .wd-card__content::after) {
+  height: 0 !important;
+}
+</style>
+<route lang="json">
+{
+  "name": "EmployeeListAdd",
+  "style": {
+    "navigationBarTitleText": "员工管理",
+    "navigationStyle": "custom"
+  }
+}
+</route>

+ 31 - 0
src/subPack/Evaluation/index.vue

@@ -64,15 +64,34 @@
         <view class="flex items-center justify-end mt-3">
           <view
             class="flex items-center justify-center text-white text-28rpx bg-#FDD143 px-23rpx py-4rpx rounded-8rpx"
+            @click="handleHf"
             >回复</view
           >
         </view>
       </view>
     </view>
   </view>
+  <wd-message-box selector="wd-message-box-slot" :closeOnClickModal="false">
+    <view class="flex items-center justify-center w-full">
+      <view
+        class="rounded-32rpx border overflow-hidden w-80% h-236rpx border-#ccc border-solid py-30rpx flex items-center justify-center"
+      >
+        <textarea
+          v-model="msgContent"
+          placeholder="请输入回复内容"
+          :show-confirm-bar="false"
+          :maxlength="-1"
+          class="w-300rpx p-30rpx overflow-y-scroll h-200rpx"
+        />
+      </view>
+    </view>
+  </wd-message-box>
 </template>
 
 <script setup lang="ts">
+import { useMessage } from "wot-design-uni";
+const message = useMessage("wd-message-box-slot");
+const msgContent = ref();
 const rate = ref(4);
 const currentId = ref();
 const data = ref([
@@ -92,6 +111,18 @@ function handleChange(id: number) {
 function handleClickLeft() {
   uni.navigateBack();
 }
+function handleHf() {
+  message
+    .confirm({
+      title: "回复",
+      confirmButtonText: "提交",
+      closeOnClickModal: false,
+    })
+    .then(() => {})
+    .catch((error) => {
+      console.log(error);
+    });
+}
 </script>
 
 <style>

+ 28 - 4
src/subPack/ExtensionClass/index.vue

@@ -17,8 +17,34 @@
         </view>
       </view>
     </view>
+    <view class="mt20rpx bg-white rounded-16rpx p24rpx mb20rpx">
+      <view class="mb20rpx">
+        <wd-checkbox modelValue="shop" size="large" shape="square"
+          ><text class="font-semibold text-32rpx">全选</text>
+        </wd-checkbox>
+      </view>
+      <wd-checkbox-group
+        v-model="checkedAll"
+        inline
+        size="large"
+        shape="square"
+      >
+        <wd-checkbox modelValue="jingmai">张三</wd-checkbox>
+        <wd-checkbox modelValue="shop">李四</wd-checkbox>
+        <wd-checkbox modelValue="shop">李四</wd-checkbox>
+        <wd-checkbox modelValue="shop">李四</wd-checkbox>
+        <wd-checkbox modelValue="shop">李四</wd-checkbox>
+        <wd-checkbox modelValue="shop">李四</wd-checkbox>
+        <wd-checkbox modelValue="shop">李四</wd-checkbox>
+        <wd-checkbox modelValue="shop">李四</wd-checkbox>
+        <wd-checkbox modelValue="shop">李四</wd-checkbox>
+        <wd-checkbox modelValue="shop">李四</wd-checkbox>
+        <wd-checkbox modelValue="shop">李四</wd-checkbox>
+        <wd-checkbox modelValue="shop">李四</wd-checkbox>
+      </wd-checkbox-group>
+    </view>
+    <WdButton block size="large">提交</WdButton>
   </view>
-  <WdButton block size="large">提交</WdButton>
 </template>
 
 <script setup lang="ts">
@@ -37,15 +63,13 @@ const columns = ref<Record<string, any>[]>([
   },
 ]);
 const value = ref<string>("101");
+const checkedAll = ref(["1"]);
 </script>
 
 <style scoped>
 :deep(.wd-select-picker__cell) {
   padding: 0 !important;
 }
-:deep(.wd-divider) {
-  padding: 0 !important;
-}
 </style>
 <route lang="json">
 {

+ 200 - 0
src/subPack/Makeupclass/index.vue

@@ -0,0 +1,200 @@
+<template>
+  <view class="py-20rpx">
+    <view class="bg-white px32rpx py28rpx flex items-center">
+      <view class="text-[rgba(0,0,0,0.3)]">课程名称:</view>
+      <view class="flex-1">
+        <wd-input type="text" placeholder="请输入课程名称" no-border />
+      </view>
+    </view>
+    <view class="mt20rpx bg-white px32rpx py30rpx">
+      <view class="flex items-center justify-between">
+        <view class="flex items-center">
+          <view class="bg-#0074FF w8rpx h28rpx rounded-6rpx"></view>
+          <view class="font-semibold text-32rpx ml12rpx"> 补课课表 </view>
+        </view>
+        <view class="flex items-center">
+          <commonbtn bg-color="#0074FF" @click="handleAddClass">
+            增加课时
+          </commonbtn>
+          <view class="ml20rpx flex items-center" @click="handleAllUp">
+            <view class="text-[rgba(0,0,0,0.3)] mr20rpx"
+              >{{ isAll ? "全部收起" : "全部展开" }}
+            </view>
+            <wd-icon
+              name="arrow-up"
+              size="22px"
+              color="rgba(0,0,0,0.3)"
+              v-if="isAll"
+            ></wd-icon>
+            <wd-icon
+              name="arrow-down"
+              size="22px"
+              color="rgba(0,0,0,0.3)"
+              v-else
+            ></wd-icon>
+          </view>
+        </view>
+      </view>
+      <view
+        class="mt30rpx bg-#F6F6F6 rounded-32rpx px24rpx py28rpx"
+        v-for="(item, idx) in makeupClassList"
+        :key="idx"
+      >
+        <view class="flex items-center justify-between">
+          <view
+            class="bg-#0074FF text-28rpx rounded-full text-white px14rpx box-border py4rpx"
+          >
+            {{ idx + 1 }}</view
+          >
+          <view class="flex items-center">
+            <view
+              @click="handleDelete(idx)"
+              class="text-#FB5B5B font-semibold text-28rpx"
+              v-if="idx > 0"
+              >删除</view
+            >
+            <view
+              class="ml24rpx flex items-center"
+              @click="handleItemDown(idx)"
+            >
+              <view class="text-[rgba(0,0,0,0.3)] mr20rpx">{{
+                isActiveItem.includes(idx) ? "收起" : "展开"
+              }}</view>
+              <wd-icon
+                name="arrow-up"
+                size="22px"
+                color="rgba(0,0,0,0.3)"
+                v-if="isActiveItem.includes(idx)"
+              ></wd-icon>
+              <wd-icon
+                name="arrow-down"
+                size="22px"
+                color="rgba(0,0,0,0.3)"
+                v-else
+              ></wd-icon>
+            </view>
+          </view>
+        </view>
+        <view v-show="isActiveItem.includes(idx)">
+          <view class="mt20rpx">
+            <view class="font-semibold"
+              ><text class="text-#FB5B5B font-semibold">*</text> 开始时间</view
+            >
+            <view class="mt20rpx b-white rounded-16rpx overflow-hidden">
+              <wd-datetime-picker
+                placeholder="请选择开始时间"
+                v-model="item.startTime"
+                :minDate="dayjs().valueOf()"
+              />
+            </view>
+          </view>
+          <view class="mt20rpx">
+            <view class="font-semibold"
+              ><text class="text-#FB5B5B font-semibold">*</text> 结束时间</view
+            >
+            <view class="mt20rpx b-white rounded-16rpx overflow-hidden">
+              <wd-datetime-picker
+                placeholder="请选择结束时间"
+                v-model="item.endTime"
+                :minDate="dayjs().valueOf()"
+              />
+            </view>
+          </view>
+          <view class="mt20rpx">
+            <view class="font-semibold"
+              ><text class="text-#FB5B5B font-semibold">*</text> 课时名称</view
+            >
+            <view
+              class="mt20rpx bg-white rounded-16rpx box-border overflow-hidden px24rpx py18rpx"
+            >
+              <wd-input
+                type="text"
+                placeholder="请输入课时名称"
+                no-border
+                v-model="item.name"
+              />
+            </view>
+          </view>
+        </view>
+      </view>
+      <view class="h150rpx"></view>
+    </view>
+  </view>
+  <fixdbtn block size="large" @click="save">保存</fixdbtn>
+</template>
+
+<script setup lang="ts">
+import dayjs from "dayjs";
+import img1 from "@/subPack/static/del.png";
+import img2 from "@/subPack/static/success.png";
+const isAll = ref(true);
+const isActiveItem = ref([0]);
+const makeupClassList = ref([{ startTime: "", endTime: "", name: "" }]);
+function handleAddClass() {
+  makeupClassList.value.push({ startTime: "", endTime: "", name: "" });
+  isActiveItem.value.push(makeupClassList.value.length - 1);
+}
+function handleItemDown(idx: number) {
+  if (isActiveItem.value.includes(idx)) {
+    isActiveItem.value = isActiveItem.value.filter((item) => item !== idx);
+  } else {
+    isActiveItem.value.push(idx);
+  }
+  if (isActiveItem.value.length == makeupClassList.value.length) {
+    isAll.value = true;
+  }
+  if (isActiveItem.value.length == 0) {
+    isAll.value = false;
+  }
+  console.log(isActiveItem.value, "asdasdas");
+}
+function handleAllUp() {
+  if (isActiveItem.value.length == makeupClassList.value.length) {
+    isActiveItem.value = [];
+  }
+  isAll.value = !isAll.value;
+  makeupClassList.value.forEach((item, index) => {
+    if (isAll.value) {
+      isActiveItem.value.push(index);
+    } else {
+      isActiveItem.value = [];
+    }
+  });
+}
+function save() {
+  console.log(makeupClassList.value, "asdsadsada");
+}
+function handleDelete(idx: number) {
+  console.log("点击");
+
+  uni.showModal({
+    title: "确认操作",
+    content: "是否确认删除这条记录?",
+    success: function (res) {
+      if (res.confirm) {
+        makeupClassList.value.splice(idx, 1);
+        getToast(1);
+      } else if (res.cancel) {
+        console.log("用户点击取消");
+      }
+    },
+  });
+}
+function getToast(type: number) {
+  uni.showToast({
+    image: type == 1 ? img1 : img2,
+    title: type == 1 ? "删除成功" : "保存成功",
+  });
+}
+</script>
+
+<style scoped></style>
+
+<route lang="json">
+{
+  "name": "Makeupclass",
+  "style": {
+    "navigationBarTitleText": "补课课表"
+  }
+}
+</route>

+ 0 - 25
src/subPack/ReservationClass/index.vue

@@ -1,28 +1,3 @@
-<!-- <template>
-  <view class="px32rpx py-20rpx">
-    <view class="bg-white px24rpx py28rpx rounded-32rpx box-border">
-      <view class="text-32rpx font-semibold">选择约课学生</view>
-      <view class="flex items-center mt28rpx">
-        <view class="text-28rpx">学生姓名:</view>
-        <wd-input type="text" placeholder="请输入姓名" no-border />
-      </view>
-      <view></view>
-    </view>
-  </view>
-  <fixdbtn block size="large">提交</fixdbtn>
-</template>
-
-<script setup lang="ts"></script>
-
-<style scoped></style>
-<route lang="json">
-{
-  "name": "ReservationClass",
-  "style": {
-    "navigationBarTitleText": "选择课程"
-  }
-}
-</route> -->
 <template>
   <view class="px32rpx py-20rpx">
     <view class="bg-white px24rpx py28rpx rounded-32rpx box-border">

+ 50 - 0
src/subPack/Storebalance/index.vue

@@ -0,0 +1,50 @@
+<template>
+  <view class="px32rpx py20rpx">
+    <view class="px24rpx py28rpx bg-#F6F6F6 rounded-32rpx">
+      <view class="flex items-center">
+        <view class="text-32rpx mr20rpx">待结算(元)</view>
+        <view class="bg-#0074FF rounded-24rpx px40rpx py4rpx text-white"
+          >冻结</view
+        >
+      </view>
+      <view class="text-[rgb(0,0,0,0.3)] mt20rpx"
+        >用户购买商品后,增加待结算,退款后,减少待结算。</view
+      >
+      <view class="mt20rpx text-48rpx font-semibold">32,124.19</view>
+    </view>
+    <view class="px24rpx py28rpx bg-#F6F6F6 rounded-32rpx mt20rpx">
+      <view class="flex items-center">
+        <view class="text-32rpx mr20rpx">可用余额(元)</view>
+      </view>
+      <view class="text-[rgb(0,0,0,0.3)] mt20rpx"
+        >商品进行分账成功后,增加可用余额。</view
+      >
+      <view class="mt20rpx text-48rpx font-semibold">32,124.19</view>
+    </view>
+    <view class="px24rpx py28rpx bg-#F6F6F6 rounded-32rpx mt20rpx">
+      <view class="flex items-center">
+        <view class="text-32rpx mr20rpx">已到账(元)</view>
+      </view>
+      <view class="text-[rgb(0,0,0,0.3)] mt20rpx"
+        >分账成功后,T+1到账后,增加已到账。</view
+      >
+      <view class="mt20rpx text-48rpx font-semibold">32,124.19</view>
+    </view>
+  </view>
+</template>
+
+<script setup lang="ts"></script>
+
+<style lang="scss">
+.page-wraper {
+  background: #fff !important;
+}
+</style>
+<route lang="json">
+{
+  "name": "Storebalance",
+  "style": {
+    "navigationBarTitleText": "店铺余额"
+  }
+}
+</route>

+ 1 - 1
src/subPack/classInspection/index.vue

@@ -17,7 +17,7 @@
 
 <script setup lang="ts">
 const type = ref(0);
-const titleArr = ["拍照验课", "选择课程", "选择课程延期"];
+const titleArr = ["拍照验课", "选择课程", "选择课程延期",'选择课程'];
 onLoad((query: any) => {
   type.value = query.type;
 });

BIN
src/subPack/static/del.png


BIN
src/subPack/static/green.png


BIN
src/subPack/static/i.png


BIN
src/subPack/static/map.png


BIN
src/subPack/static/red.png


BIN
src/subPack/static/success.png


BIN
src/subPack/static/组 34@3x.png


BIN
src/subPack/static/组 8746@3x.png


BIN
src/subPack/static/组 8747@3x.png


+ 76 - 2
src/subPack/writeOff/index.vue

@@ -1,8 +1,82 @@
 <template>
-  <view>123</view>
+  <view class="px32rpx py20rpx">
+    <view class="flex items-center">
+      <image src="@/subPack/static/map.png" class="w30rpx h30rpx mr20rpx">
+      </image>
+      <view class="font-semibold text-32rpx">体育馆综合训练馆(观山湖店)</view>
+    </view>
+    <view class="mt20rpx bg-white px-24rpx py-28rpx rounded-32rpx">
+      <wd-checkbox-group v-model="checkedAll">
+        <!-- 无固定场 -->
+        <view class="flex items-center">
+          <image
+            src="https://pic1.arkoo.com/56D0B40F99F841DF8A2425762AE2565D/picture/o_1i4qop009177v1tgf14db15he1iaj1is.jpg"
+            class="w200rpx h-200rpx rounded-32rpx min-w-200rpx"
+          />
+          <view class="ml20rpx">
+            <view class="text-32rpx"
+              >一对一篮球30分钟室内精品 课程,一对一篮球30分</view
+            >
+
+            <view class="mt26rpx flex items-center justify-between">
+              <view class="text-#FB5B5B">
+                ¥<text class="text-48rpx">25.9</text>
+              </view>
+              <view class="text-[rgb(0,0,0,0.3)]">×2</view>
+            </view>
+          </view>
+        </view>
+        <view
+          class="flex items-center justify-between mb20rpx mt24rpx"
+          v-for="item in 5"
+        >
+          <view>券号:0017 1712 5994</view>
+          <wd-checkbox
+            :model-value="item"
+            checked-color="#fdd143"
+          ></wd-checkbox>
+        </view>
+
+        <!-- 包场 -->
+
+        <view class="flex justify-between w-full">
+          <view>场次</view>
+          <view class="flex-1">
+            <view
+              class="flex items-center justify-between ml20rpx mb20rpx"
+              v-for="item in 5"
+            >
+              <view class=""> 06-11(今天)16:17 | 羽毛球1 ¥59 </view>
+              <wd-checkbox
+                :model-value="item"
+                checked-color="#fdd143"
+              ></wd-checkbox>
+            </view>
+          </view>
+        </view>
+      </wd-checkbox-group>
+
+      <wd-divider color="#F0F0F0"></wd-divider>
+      <view class="flex items-center justify-between">
+        <view class="text-28rpx">消费张数</view>
+        <view class="font-semibold text-#FB5B5B"
+          >本次核销{{ checkedAll.length }}张</view
+        >
+      </view>
+      <view class="mt12rpx text-#FB5B5B"> 共4张可用</view>
+    </view>
+    <view class="mt20rpx flex items-center">
+      <image src="@/subPack/static/i.png" class="w30rpx h30rpx mr6rpx" />
+      <view>核销前请与顾客确认核销券数</view>
+    </view>
+  </view>
+
+  <fixdbtn block size="large">确认核销(0)</fixdbtn>
 </template>
 
-<script setup lang="ts"></script>
+<script setup lang="ts">
+const checkedAll = ref([]);
+</script>
 
 <style scoped></style>
 <route lang="json">

+ 85 - 0
src/subPack/writeOffDetaile/index.vue

@@ -0,0 +1,85 @@
+<template>
+  <view class="px32rpx py20rpx">
+    <view
+      class="bg-white mb20rpx rounded-32rpx p24rpx box-border"
+      v-for="item in 10"
+    >
+      <!-- 固定场 -->
+      <view class="flex items-center justify-between">
+        <view class="flex items-center">
+          <view class="text-[rgb(0,0,0,0.3)] text-28rpx mr20rpx">场次</view>
+          <view>03-07(今天)16:00-17:00|羽毛球</view>
+        </view>
+        <view class="text-#FB5B5B font-semibold">¥25.9</view>
+      </view>
+      <view class="mt24rpx w152rpx">
+        <commonbtn bg-color="rgba(0,0,0,0.1)">
+          <text class="text-[rgb(0,0,0,0.3)]">已核销</text>
+        </commonbtn>
+      </view>
+
+      <!-- 无固定场 -->
+      <view class="flex items-center justify-between">
+        <image
+          src="https://pic1.arkoo.com/56D0B40F99F841DF8A2425762AE2565D/picture/o_1i4qop009177v1tgf14db15he1iaj1is.jpg"
+          class="w160rpx h-160rpx rounded-32rpx min-w-160rpx mr20rpx"
+        />
+        <view class="flex-1">
+          <view class="flex items-center justify-between">
+            <wd-text text="足球五人制闲时1..." :lines="1"></wd-text>
+            <view class="w152rpx">
+              <commonbtn bg-color="rgba(0,0,0,0.1)">
+                <text class="text-[rgb(0,0,0,0.3)]">已核销</text>
+              </commonbtn>
+            </view>
+          </view>
+          <view class="text-32rpx mt20rpx font-semibold text-#FB5B5B"
+            >¥25.9</view
+          >
+        </view>
+      </view>
+      <wd-divider color="#F0F0F0"></wd-divider>
+      <view class="flex items-center justify-between">
+        <view class="text-[rgb(0,0,0,0.3)]">核验时间</view>
+        <view>2025-05-02 16:14:56</view>
+      </view>
+      <view class="flex items-center justify-between mt20rpx">
+        <view class="text-[rgb(0,0,0,0.3)]">使用人/券号</view>
+        <view>0017 1712 5994</view>
+      </view>
+      <view class="mt24rpx w152rpx">
+        <commonbtn bg-color="#FDD143" @click="handleRevoke">
+          <text class="text-#000000">撤销</text>
+        </commonbtn>
+      </view>
+    </view>
+  </view>
+</template>
+
+<script setup lang="ts">
+import img1 from "@/subPack/static/hxmx.png";
+function handleSuccess() {
+  uni.showToast({
+    image: img1,
+    title: "核销成功",
+  });
+}
+handleSuccess();
+function handleRevoke() {
+  uni.showModal({
+    title: "确认操作",
+    content: "确认要撤销吗?",
+    cancelText: "不撤销",
+  });
+}
+</script>
+
+<style scoped></style>
+<route lang="json">
+{
+  "name": "writeOffDetaile",
+  "style": {
+    "navigationBarTitleText": "核销明细"
+  }
+}
+</route>

+ 6 - 1
src/uni-pages.d.ts

@@ -8,14 +8,19 @@ interface NavigateToOptions {
        "/pages/about/index" |
        "/subPack/classInspection/index" |
        "/subPack/classInspectionDetaile/index" |
+       "/subPack/EmployeeList/index" |
+       "/subPack/EmployeeListAdd/index" |
        "/subPack/Evaluation/index" |
        "/subPack/ExtensionClass/index" |
+       "/subPack/Makeupclass/index" |
        "/subPack/notification/index" |
        "/subPack/notificationDetailes/index" |
        "/subPack/PersonnelView/index" |
        "/subPack/ReservationClass/index" |
        "/subPack/selectClass/index" |
-       "/subPack/writeOff/index";
+       "/subPack/Storebalance/index" |
+       "/subPack/writeOff/index" |
+       "/subPack/writeOffDetaile/index";
 }
 interface RedirectToOptions extends NavigateToOptions {}
 

+ 1 - 0
vite.config.ts

@@ -19,6 +19,7 @@ export default async () => {
       UniHelperPages({
         dts: "src/uni-pages.d.ts",
         subPackages: ["src/subPack"],
+        exclude: ["**/components/**/*.*"],
       }),
       // https://github.com/uni-helper/vite-plugin-uni-layouts
       UniHelperLayouts(),