Эх сурвалжийг харах

feat(subPack): 新增多个子页面并优化主页面配置

- 新增 classInspection、classInspectionDetaile、Evaluation 等多个子页面
- 优化 pages.json 中的页面配置,统一导航栏样式
- 更新 App.vue 中的样式,添加全局样式类
- 调整 pages/about/index.vue,移除冗余代码
zhangtao 1 долоо хоног өмнө
parent
commit
ad53ed79d5
49 өөрчлөгдсөн 1148 нэмэгдсэн , 106 устгасан
  1. 2 0
      eslint.config.mjs
  2. 23 21
      pages.config.ts
  3. 22 25
      pnpm-lock.yaml
  4. 10 1
      src/App.vue
  5. 2 0
      src/auto-imports.d.ts
  6. 20 0
      src/components.d.ts
  7. 60 0
      src/components/classItem/index.vue
  8. 25 0
      src/components/commonbtn/index.vue
  9. 41 0
      src/components/course/index.vue
  10. 20 0
      src/components/fixdbtn/index.vue
  11. 95 6
      src/pages.json
  12. 7 7
      src/pages/about/index.vue
  13. 147 4
      src/pages/index/index.vue
  14. BIN
      src/static/index/bk.png
  15. BIN
      src/static/index/hx.png
  16. BIN
      src/static/index/kf.png
  17. BIN
      src/static/index/ls.png
  18. BIN
      src/static/index/msg.png
  19. BIN
      src/static/index/nz.png
  20. BIN
      src/static/index/pj.png
  21. BIN
      src/static/index/pz.png
  22. BIN
      src/static/index/sm.png
  23. BIN
      src/static/index/user.png
  24. BIN
      src/static/index/ye.png
  25. BIN
      src/static/index/yg.png
  26. BIN
      src/static/logo.png
  27. 0 1
      src/static/logo.svg
  28. BIN
      src/static/vite.png
  29. 12 0
      src/store/user.ts
  30. 110 0
      src/subPack/Evaluation/index.vue
  31. 57 0
      src/subPack/ExtensionClass/index.vue
  32. 63 0
      src/subPack/PersonnelView/index.vue
  33. 133 0
      src/subPack/ReservationClass/index.vue
  34. 38 0
      src/subPack/classInspection/index.vue
  35. 86 0
      src/subPack/classInspectionDetaile/index.vue
  36. 43 0
      src/subPack/notification/index.vue
  37. 30 0
      src/subPack/notificationDetailes/index.vue
  38. 30 0
      src/subPack/selectClass/index.vue
  39. BIN
      src/subPack/static/hxmx.png
  40. BIN
      src/subPack/static/hxs.png
  41. BIN
      src/subPack/static/nz.png
  42. BIN
      src/subPack/static/yq.png
  43. BIN
      src/subPack/static/yy.png
  44. 15 0
      src/subPack/writeOff/index.vue
  45. 11 1
      src/uni-pages.d.ts
  46. 3 3
      src/utils/index.ts
  47. 1 1
      tsconfig.json
  48. 7 10
      uno.config.ts
  49. 35 26
      vite.config.ts

+ 2 - 0
eslint.config.mjs

@@ -6,6 +6,8 @@ export default uni(
     rules: {
       'no-console': 'off',
       'eslint-comments/no-unlimited-disable': 'off',
+      'prettier.semi': 'off',
+      "semi": '0'
     },
   },
 )

+ 23 - 21
pages.config.ts

@@ -1,26 +1,25 @@
-
-import { defineUniPages } from '@uni-helper/vite-plugin-uni-pages'
+import { defineUniPages } from "@uni-helper/vite-plugin-uni-pages";
 
 export default defineUniPages({
   pages: [],
   globalStyle: {
     // 导航栏配置
-    navigationBarBackgroundColor: '@navBgColor',
-    navigationBarTextStyle: '@navTxtStyle',
-    navigationBarTitleText: 'Wot-Demo',
+    navigationBarBackgroundColor: "@navBgColor",
+    navigationBarTextStyle: "@navTxtStyle",
+    navigationBarTitleText: "zhangtao",
 
     // 页面背景配置
-    backgroundColor: '@bgColor',
-    backgroundTextStyle: '@bgTxtStyle',
-    backgroundColorTop: '@bgColorTop',
-    backgroundColorBottom: '@bgColorBottom',
+    backgroundColor: "@bgColor",
+    backgroundTextStyle: "@bgTxtStyle",
+    backgroundColorTop: "@bgColorTop",
+    backgroundColorBottom: "@bgColorBottom",
 
     // 下拉刷新配置
     enablePullDownRefresh: false,
     onReachBottomDistance: 50,
 
     // 动画配置
-    animationType: 'pop-in',
+    animationType: "pop-in",
     animationDuration: 300,
   },
   tabBar: {
@@ -30,15 +29,18 @@ export default defineUniPages({
     // 暂时不生效。4.71.2025061206-alpha已修复:https://uniapp.dcloud.net.cn/release-note-alpha.html#_4-71-2025061206-alpha,我们等正式版发布后更新。
     overlay: true,
     // #endif
-    height: '0',
-    color: '@tabColor',
-    selectedColor: '@tabSelectedColor',
-    backgroundColor: '@tabBgColor',
-    borderStyle: '@tabBorderStyle',
-    list: [{
-      pagePath: 'pages/index/index',
-    }, {
-      pagePath: 'pages/about/index',
-    }],
+    height: "0",
+    color: "@tabColor",
+    selectedColor: "@tabSelectedColor",
+    backgroundColor: "@tabBgColor",
+    borderStyle: "@tabBorderStyle",
+    list: [
+      {
+        pagePath: "pages/index/index",
+      },
+      {
+        pagePath: "pages/about/index",
+      },
+    ],
   },
-})
+});

+ 22 - 25
pnpm-lock.yaml

@@ -131,7 +131,7 @@ importers:
         version: 1.0.0-alpha.3(@uni-helper/uni-app-types@1.0.0-alpha.3(typescript@5.5.4)(vue@3.4.38(typescript@5.5.4)))(@uni-helper/uni-cloud-types@1.0.0-alpha.3(typescript@5.5.4)(vue@3.4.38(typescript@5.5.4)))(@uni-helper/uni-ui-types@1.0.0-alpha.3(@uni-helper/uni-app-types@1.0.0-alpha.3(typescript@5.5.4)(vue@3.4.38(typescript@5.5.4)))(typescript@5.5.4)(vue@3.4.38(typescript@5.5.4)))(typescript@5.5.4)(vue@3.4.38(typescript@5.5.4))
       '@uni-helper/unocss-preset-uni':
         specifier: ^0.2.9
-        version: 0.2.9(@unocss/preset-mini@0.62.3)(@unocss/rule-utils@0.62.3)(@unocss/vite@0.62.3(rollup@4.21.1)(vite@5.2.8(@types/node@20.16.2)(sass@1.78.0)(terser@5.31.6)))(unocss-applet@0.8.2(@unocss/core@0.62.3)(@unocss/preset-mini@0.62.3)(@unocss/preset-uno@0.62.3)(magic-string@0.30.17)(unocss@0.62.3(postcss@8.4.41)(rollup@4.21.1)(vite@5.2.8(@types/node@20.16.2)(sass@1.78.0)(terser@5.31.6))))(unocss@0.62.3(postcss@8.4.41)(rollup@4.21.1)(vite@5.2.8(@types/node@20.16.2)(sass@1.78.0)(terser@5.31.6)))
+        version: 0.2.9(@unocss/preset-mini@0.62.3)(@unocss/rule-utils@66.3.3)(@unocss/vite@0.62.3(rollup@4.21.1)(vite@5.2.8(@types/node@20.16.2)(sass@1.78.0)(terser@5.31.6)))(unocss-applet@0.8.2(@unocss/core@66.3.3)(@unocss/preset-mini@0.62.3)(@unocss/preset-uno@0.62.3)(magic-string@0.30.17)(unocss@0.62.3(postcss@8.4.41)(rollup@4.21.1)(vite@5.2.8(@types/node@20.16.2)(sass@1.78.0)(terser@5.31.6))))(unocss@0.62.3(postcss@8.4.41)(rollup@4.21.1)(vite@5.2.8(@types/node@20.16.2)(sass@1.78.0)(terser@5.31.6)))
       '@uni-helper/vite-plugin-uni-components':
         specifier: ^0.1.0
         version: 0.1.0(rollup@4.21.1)
@@ -2039,55 +2039,46 @@ 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==}
@@ -2414,6 +2405,9 @@ packages:
   '@unocss/core@0.62.3':
     resolution: {integrity: sha512-Pfyrj8S7jq9K1QXD6Z5BCeiQavaHpbMN5q958/kmdbNGp57hOg1e346fMJAvgPjLBR+lE/hgZEsDrijtRiZXnw==}
 
+  '@unocss/core@66.3.3':
+    resolution: {integrity: sha512-6WFLd92TJelVQARtCGaF+EgEoHKIVe43gkGXVoWILu0HUDRWdhv+cpcyX0RTJV22Y976AxeneU7/zmhAh+CXNg==}
+
   '@unocss/eslint-config@0.62.3':
     resolution: {integrity: sha512-xj2XMjUP/LVkTESyDE08fo/Ejvt1SuQYvx9WVp4zr5HAoAITNDnenFLHtLgx+4h8sdWkiAhzHLa2plEfktw06Q==}
     engines: {node: '>=14'}
@@ -2465,6 +2459,10 @@ packages:
     resolution: {integrity: sha512-qI37jHH//XzyR5Y2aN3Kpo4lQrQO+CaiXpqPSwMLYh2bIypc2RQVpqGVtU736x0eA6IIx41XEkKzUW+VtvJvmg==}
     engines: {node: '>=14'}
 
+  '@unocss/rule-utils@66.3.3':
+    resolution: {integrity: sha512-QKgVGV5nRRnK44/reUKFLAc5UGyl98vz3hrfk8JI8pVza58vmQWTdAB2rIpNJ5a5j+EkWfDOUlGQaOrIeYGLdg==}
+    engines: {node: '>=14'}
+
   '@unocss/scope@0.62.3':
     resolution: {integrity: sha512-TJGmFfsMrTo8DBJ7CJupIqObpgij+w4jCHMBf1uu0/9jbm63dH6WGcrl3zf5mm6UBTeLmB0RwJ8K4hs7LtrBDQ==}
 
@@ -2527,49 +2525,41 @@ 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==}
@@ -9936,12 +9926,12 @@ snapshots:
       typescript: 5.5.4
       vue: 3.4.38(typescript@5.5.4)
 
-  '@uni-helper/unocss-preset-uni@0.2.9(@unocss/preset-mini@0.62.3)(@unocss/rule-utils@0.62.3)(@unocss/vite@0.62.3(rollup@4.21.1)(vite@5.2.8(@types/node@20.16.2)(sass@1.78.0)(terser@5.31.6)))(unocss-applet@0.8.2(@unocss/core@0.62.3)(@unocss/preset-mini@0.62.3)(@unocss/preset-uno@0.62.3)(magic-string@0.30.17)(unocss@0.62.3(postcss@8.4.41)(rollup@4.21.1)(vite@5.2.8(@types/node@20.16.2)(sass@1.78.0)(terser@5.31.6))))(unocss@0.62.3(postcss@8.4.41)(rollup@4.21.1)(vite@5.2.8(@types/node@20.16.2)(sass@1.78.0)(terser@5.31.6)))':
+  '@uni-helper/unocss-preset-uni@0.2.9(@unocss/preset-mini@0.62.3)(@unocss/rule-utils@66.3.3)(@unocss/vite@0.62.3(rollup@4.21.1)(vite@5.2.8(@types/node@20.16.2)(sass@1.78.0)(terser@5.31.6)))(unocss-applet@0.8.2(@unocss/core@66.3.3)(@unocss/preset-mini@0.62.3)(@unocss/preset-uno@0.62.3)(magic-string@0.30.17)(unocss@0.62.3(postcss@8.4.41)(rollup@4.21.1)(vite@5.2.8(@types/node@20.16.2)(sass@1.78.0)(terser@5.31.6))))(unocss@0.62.3(postcss@8.4.41)(rollup@4.21.1)(vite@5.2.8(@types/node@20.16.2)(sass@1.78.0)(terser@5.31.6)))':
     dependencies:
       '@uni-helper/uni-env': 0.1.4
-      '@unocss/rule-utils': 0.62.3
+      '@unocss/rule-utils': 66.3.3
       unocss: 0.62.3(postcss@8.4.41)(rollup@4.21.1)(vite@5.2.8(@types/node@20.16.2)(sass@1.78.0)(terser@5.31.6))
-      unocss-applet: 0.8.2(@unocss/core@0.62.3)(@unocss/preset-mini@0.62.3)(@unocss/preset-uno@0.62.3)(magic-string@0.30.17)(unocss@0.62.3(postcss@8.4.41)(rollup@4.21.1)(vite@5.2.8(@types/node@20.16.2)(sass@1.78.0)(terser@5.31.6)))
+      unocss-applet: 0.8.2(@unocss/core@66.3.3)(@unocss/preset-mini@0.62.3)(@unocss/preset-uno@0.62.3)(magic-string@0.30.17)(unocss@0.62.3(postcss@8.4.41)(rollup@4.21.1)(vite@5.2.8(@types/node@20.16.2)(sass@1.78.0)(terser@5.31.6)))
     optionalDependencies:
       '@unocss/preset-mini': 0.62.3
       '@unocss/vite': 0.62.3(rollup@4.21.1)(vite@5.2.8(@types/node@20.16.2)(sass@1.78.0)(terser@5.31.6))
@@ -10009,11 +9999,11 @@ snapshots:
       vscode-languageserver-textdocument: 1.0.12
       yaml-language-server: 1.15.0
 
-  '@unocss-applet/preset-applet@0.8.2(@unocss/core@0.62.3)(@unocss/preset-mini@0.62.3)(@unocss/preset-uno@0.62.3)(unocss@0.62.3(postcss@8.4.41)(rollup@4.21.1)(vite@5.2.8(@types/node@20.16.2)(sass@1.78.0)(terser@5.31.6)))':
+  '@unocss-applet/preset-applet@0.8.2(@unocss/core@66.3.3)(@unocss/preset-mini@0.62.3)(@unocss/preset-uno@0.62.3)(unocss@0.62.3(postcss@8.4.41)(rollup@4.21.1)(vite@5.2.8(@types/node@20.16.2)(sass@1.78.0)(terser@5.31.6)))':
     dependencies:
       unocss: 0.62.3(postcss@8.4.41)(rollup@4.21.1)(vite@5.2.8(@types/node@20.16.2)(sass@1.78.0)(terser@5.31.6))
     optionalDependencies:
-      '@unocss/core': 0.62.3
+      '@unocss/core': 66.3.3
       '@unocss/preset-mini': 0.62.3
       '@unocss/preset-uno': 0.62.3
 
@@ -10066,6 +10056,8 @@ snapshots:
 
   '@unocss/core@0.62.3': {}
 
+  '@unocss/core@66.3.3': {}
+
   '@unocss/eslint-config@0.62.3(eslint@9.9.1(jiti@1.21.7))(typescript@5.5.4)':
     dependencies:
       '@unocss/eslint-plugin': 0.62.3(eslint@9.9.1(jiti@1.21.7))(typescript@5.5.4)
@@ -10161,6 +10153,11 @@ snapshots:
       '@unocss/core': 0.62.3
       magic-string: 0.30.11
 
+  '@unocss/rule-utils@66.3.3':
+    dependencies:
+      '@unocss/core': 66.3.3
+      magic-string: 0.30.17
+
   '@unocss/scope@0.62.3': {}
 
   '@unocss/transformer-attributify-jsx-babel@0.62.3':
@@ -14666,9 +14663,9 @@ snapshots:
 
   universalify@2.0.1: {}
 
-  unocss-applet@0.8.2(@unocss/core@0.62.3)(@unocss/preset-mini@0.62.3)(@unocss/preset-uno@0.62.3)(magic-string@0.30.17)(unocss@0.62.3(postcss@8.4.41)(rollup@4.21.1)(vite@5.2.8(@types/node@20.16.2)(sass@1.78.0)(terser@5.31.6))):
+  unocss-applet@0.8.2(@unocss/core@66.3.3)(@unocss/preset-mini@0.62.3)(@unocss/preset-uno@0.62.3)(magic-string@0.30.17)(unocss@0.62.3(postcss@8.4.41)(rollup@4.21.1)(vite@5.2.8(@types/node@20.16.2)(sass@1.78.0)(terser@5.31.6))):
     dependencies:
-      '@unocss-applet/preset-applet': 0.8.2(@unocss/core@0.62.3)(@unocss/preset-mini@0.62.3)(@unocss/preset-uno@0.62.3)(unocss@0.62.3(postcss@8.4.41)(rollup@4.21.1)(vite@5.2.8(@types/node@20.16.2)(sass@1.78.0)(terser@5.31.6)))
+      '@unocss-applet/preset-applet': 0.8.2(@unocss/core@66.3.3)(@unocss/preset-mini@0.62.3)(@unocss/preset-uno@0.62.3)(unocss@0.62.3(postcss@8.4.41)(rollup@4.21.1)(vite@5.2.8(@types/node@20.16.2)(sass@1.78.0)(terser@5.31.6)))
       '@unocss-applet/preset-rem-rpx': 0.8.2(unocss@0.62.3(postcss@8.4.41)(rollup@4.21.1)(vite@5.2.8(@types/node@20.16.2)(sass@1.78.0)(terser@5.31.6)))
       '@unocss-applet/transformer-attributify': 0.8.2(magic-string@0.30.17)(unocss@0.62.3(postcss@8.4.41)(rollup@4.21.1)(vite@5.2.8(@types/node@20.16.2)(sass@1.78.0)(terser@5.31.6)))
       unocss: 0.62.3(postcss@8.4.41)(rollup@4.21.1)(vite@5.2.8(@types/node@20.16.2)(sass@1.78.0)(terser@5.31.6))

+ 10 - 1
src/App.vue

@@ -1,3 +1,12 @@
 <script setup lang="ts">
-onLaunch(() => {})
+onLaunch(() => {});
 </script>
+<style>
+.header {
+  background: linear-gradient(180deg, #e4efff 0%, #f9fcff 45%, #f6f6f6 100%);
+}
+
+.bottom-safe-area {
+  padding-bottom: env(safe-area-inset-bottom);
+}
+</style>

+ 2 - 0
src/auto-imports.d.ts

@@ -309,6 +309,7 @@ declare global {
   const useTransition: typeof import('@vueuse/core')['useTransition']
   const useUrlSearchParams: typeof import('@vueuse/core')['useUrlSearchParams']
   const useUserMedia: typeof import('@vueuse/core')['useUserMedia']
+  const useUserStore: typeof import('./store/user')['useUserStore']
   const useVModel: typeof import('@vueuse/core')['useVModel']
   const useVModels: typeof import('@vueuse/core')['useVModels']
   const useVibrate: typeof import('@vueuse/core')['useVibrate']
@@ -648,6 +649,7 @@ declare module 'vue' {
     readonly useTransition: UnwrapRef<typeof import('@vueuse/core')['useTransition']>
     readonly useUrlSearchParams: UnwrapRef<typeof import('@vueuse/core')['useUrlSearchParams']>
     readonly useUserMedia: UnwrapRef<typeof import('@vueuse/core')['useUserMedia']>
+    readonly useUserStore: UnwrapRef<typeof import('./store/user')['useUserStore']>
     readonly useVModel: UnwrapRef<typeof import('@vueuse/core')['useVModel']>
     readonly useVModels: UnwrapRef<typeof import('@vueuse/core')['useVModels']>
     readonly useVibrate: UnwrapRef<typeof import('@vueuse/core')['useVibrate']>

+ 20 - 0
src/components.d.ts

@@ -7,11 +7,31 @@ export {}
 
 declare module 'vue' {
   export interface GlobalComponents {
+    ClassItem: typeof import('./components/classItem/index.vue')['default']
+    Commonbtn: typeof import('./components/commonbtn/index.vue')['default']
+    Course: typeof import('./components/course/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']
     WdConfigProvider: typeof import('wot-design-uni/components/wd-config-provider/wd-config-provider.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']
+    WdIcon: typeof import('wot-design-uni/components/wd-icon/wd-icon.vue')['default']
+    WdInput: typeof import('wot-design-uni/components/wd-input/wd-input.vue')['default']
     WdMessageBox: typeof import('wot-design-uni/components/wd-message-box/wd-message-box.vue')['default']
+    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']
+    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']
+    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']
+    WdTabs: typeof import('wot-design-uni/components/wd-tabs/wd-tabs.vue')['default']
+    WdText: typeof import('wot-design-uni/components/wd-text/wd-text.vue')['default']
     WdToast: typeof import('wot-design-uni/components/wd-toast/wd-toast.vue')['default']
+    WdUpload: typeof import('wot-design-uni/components/wd-upload/wd-upload.vue')['default']
   }
 }

+ 60 - 0
src/components/classItem/index.vue

@@ -0,0 +1,60 @@
+<template>
+  <view class="bg-white rounded-32rpx p24rpx box-border">
+    <view class="flex items-center">
+      <view class="w-8rpx h-28rpx bg-#0074FF"></view>
+      <view class="ml20rpx text-28rpx">05.06 17:00-19:00</view>
+    </view>
+    <view class="mt20rpx flex items-center justify-between pl20rpx">
+      <view class="text-28rpx">第二节:拍球、握球、传球...</view>
+      <commonbtn
+        bg-color="#0074FF"
+        @click="handleGoPath('/subPack/selectClass/index')"
+        v-if="type == 0"
+        >拍照核销</commonbtn
+      >
+      <commonbtn
+        bg-color="#0074FF"
+        @click="handleGoPath('/subPack/ReservationClass/index')"
+        v-if="type == 1"
+        >预约这节</commonbtn
+      ><commonbtn
+        bg-color="#0074FF"
+        @click="handleGoPath('/subPack/ExtensionClass/index')"
+        v-if="type == 2"
+        >延期这节</commonbtn
+      >
+    </view>
+    <view
+      class="mt20rpx pl20rpx flex items-center text-24rpx"
+      @click="handleGoPath('/subPack/PersonnelView/index')"
+    >
+      <view class="text-[rgb(0,0,0,0.3)] mr20rpx">共20人</view>
+      <view class="text-[rgb(0,0,0,0.3)] mr20rpx"
+        >延课 <text class="text-#0074FF">5</text> 人</view
+      >
+      <view class="text-[rgb(0,0,0,0.3)] mr20rpx"
+        >已核销<text class="text-#0074FF">10</text>人</view
+      >
+      <view class="text-[rgb(0,0,0,0.3)]"
+        >未核销<text class="text-#0074FF">5</text>人</view
+      >
+    </view>
+  </view>
+</template>
+
+<script setup lang="ts">
+interface IProps {
+  /**
+   * 当前组件在什么地方展示,0为验课,1为约课,2为课程延期
+   */
+  type: number;
+}
+const props = defineProps<IProps>();
+function handleGoPath(url: string) {
+  uni.navigateTo({
+    url,
+  });
+}
+</script>
+
+<style scoped></style>

+ 25 - 0
src/components/commonbtn/index.vue

@@ -0,0 +1,25 @@
+<template>
+  <view
+    class="px-34rpx py-4rpx flex items-center justify-center rounded-8rpx text-white text-28rpx"
+    :style="{ background: disabled ? 'rgba(0,0,0,0.1)' : bgColor }"
+    @click="handleClick"
+  >
+    <slot></slot>
+  </view>
+</template>
+
+<script setup lang="ts">
+const props = defineProps<{
+  bgColor: string;
+  disabled?: boolean;
+}>();
+const emit = defineEmits<{
+  (e: "click"): void;
+}>();
+function handleClick() {
+  if (props.disabled) return;
+  emit("click");
+}
+</script>
+
+<style scoped></style>

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

@@ -0,0 +1,41 @@
+<template>
+  <view
+    class="bg-white rounded-32rpx p-24rpx box-border flex items-center"
+    @click="handleDetailes"
+  >
+    <image
+      src="https://pic1.arkoo.com/56D0B40F99F841DF8A2425762AE2565D/picture/o_1i4qop009177v1tgf14db15he1iaj1is.jpg"
+      class="w-200rpx h-200rpx rounded-32rpx min-w-200rpx"
+    />
+    <view class="ml20rpx">
+      <view class="text-#000000 text-32rpx font-semibold"
+        >一对一篮球30分钟室内精...</view
+      >
+      <view class="text-[rgba(0,0,0,0.3)] text-28rpx mt-24rpx"
+        >上课地点:观山湖区第十二小学</view
+      >
+      <view class="text-[rgba(0,0,0,0.3)] text-28rpx mt-24rpx"
+        >10课时 06.26-06.28</view
+      >
+    </view>
+  </view>
+</template>
+
+<script setup lang="ts">
+interface props {
+  /**
+   * 当前组件在什么地方展示,0为验课,1为约课,2为课程延期
+   */
+  type?: number;
+  disabled?: boolean;
+}
+const props = defineProps<props>();
+function handleDetailes() {
+  if (props.disabled) return;
+  uni.navigateTo({
+    url: `/subPack/classInspectionDetaile/index?type=${props.type}`,
+  });
+}
+</script>
+
+<style scoped></style>

+ 20 - 0
src/components/fixdbtn/index.vue

@@ -0,0 +1,20 @@
+<template>
+  <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 }">
+      <slot></slot>
+    </wd-button>
+  </view>
+</template>
+
+<script setup lang="ts">
+import { buttonProps } from "wot-design-uni/components/wd-button/types";
+const props = defineProps(buttonProps);
+</script>
+
+<style scoped>
+.box {
+  box-shadow: 0rpx -6rpx 12rpx 2rpx rgba(0, 0, 0, 0.09);
+}
+</style>

+ 95 - 6
src/pages.json

@@ -4,25 +4,25 @@
       "path": "pages/index/index",
       "type": "home",
       "name": "home",
-      "layout": "tabbar",
       "style": {
-        "navigationBarTitleText": "首页"
+        "navigationBarTitleText": "首页",
+        "navigationStyle": "custom"
       }
     },
     {
       "path": "pages/about/index",
       "type": "page",
       "name": "about",
-      "layout": "tabbar",
       "style": {
-        "navigationBarTitleText": "关于"
+        "navigationBarTitleText": "关于",
+        "navigationStyle": "custom"
       }
     }
   ],
   "globalStyle": {
     "navigationBarBackgroundColor": "@navBgColor",
     "navigationBarTextStyle": "@navTxtStyle",
-    "navigationBarTitleText": "Wot-Demo",
+    "navigationBarTitleText": "zhangtao",
     "backgroundColor": "@bgColor",
     "backgroundTextStyle": "@bgTxtStyle",
     "backgroundColorTop": "@bgColorTop",
@@ -50,5 +50,94 @@
       }
     ]
   },
-  "subPackages": []
+  "subPackages": [
+    {
+      "root": "subPack",
+      "pages": [
+        {
+          "path": "classInspection/index",
+          "type": "page",
+          "name": "classInspection",
+          "style": {
+            "navigationBarTitleText": "拍照验课||选择课程",
+            "navigationStyle": "custom"
+          }
+        },
+        {
+          "path": "classInspectionDetaile/index",
+          "type": "page",
+          "name": "classInspectionDetaile",
+          "style": {
+            "navigationBarTitleText": "拍照验课",
+            "navigationStyle": "custom"
+          }
+        },
+        {
+          "path": "Evaluation/index",
+          "type": "page",
+          "name": "Evaluation",
+          "style": {
+            "navigationBarTitleText": "评价",
+            "navigationStyle": "custom"
+          }
+        },
+        {
+          "path": "ExtensionClass/index",
+          "type": "page",
+          "name": "ExtensionClass",
+          "style": {
+            "navigationBarTitleText": "填写延期信息"
+          }
+        },
+        {
+          "path": "notification/index",
+          "type": "page",
+          "name": "notification",
+          "style": {
+            "navigationBarTitleText": "消息通知"
+          }
+        },
+        {
+          "path": "notificationDetailes/index",
+          "type": "page",
+          "name": "notificationDetailes",
+          "style": {
+            "navigationBarTitleText": "消息通知"
+          }
+        },
+        {
+          "path": "PersonnelView/index",
+          "type": "page",
+          "name": "personnelView",
+          "style": {
+            "navigationBarTitleText": "人员查看"
+          }
+        },
+        {
+          "path": "ReservationClass/index",
+          "type": "page",
+          "name": "ReservationClass",
+          "style": {
+            "navigationBarTitleText": "选择课程"
+          }
+        },
+        {
+          "path": "selectClass/index",
+          "type": "page",
+          "name": "selectClass",
+          "style": {
+            "navigationBarTitleText": "选择课程"
+          }
+        },
+        {
+          "path": "writeOff/index",
+          "type": "page",
+          "name": "writeOff",
+          "style": {
+            "navigationBarTitleText": "扫码核销"
+          }
+        }
+      ]
+    }
+  ]
 }

+ 7 - 7
src/pages/about/index.vue

@@ -1,17 +1,17 @@
-<script setup lang="ts">
-
-</script>
-
 <template>
-  <view>5555</view>
+  <view></view>
 </template>
 
+<script setup lang="ts"></script>
+
+<style scoped></style>
+
 <route lang="json">
 {
   "name": "about",
-  "layout": "tabbar",
   "style": {
-    "navigationBarTitleText": "关于"
+    "navigationBarTitleText": "关于",
+    "navigationStyle": "custom"
   }
 }
 </route>

+ 147 - 4
src/pages/index/index.vue

@@ -1,17 +1,160 @@
 <script setup lang="ts">
-
+const { statusBarHeight } = uni.getSystemInfoSync();
+const { isLogin } = storeToRefs(useUserStore());
+const option1 = ref<Record<string, any>[]>([
+  { label: "选择场馆", value: 0 },
+  { label: "选择场馆1", value: 1 },
+  { label: "选择场馆1", value: 2 },
+]);
+function handleCommenPath(url: string) {
+  uni.navigateTo({
+    url: url,
+  });
+}
+function handleScanCode() {
+  // uni.scanCode({
+  //   success: function (res) {
+  //     console.log(res, "扫码信息");
+  //   },
+  // });
+  handleCommenPath("/subPack/writeOff/index");
+}
+const value = ref<number>(0);
 </script>
 
 <template>
-  <view>12</view>
+  <view
+    class="h-screen box-border header"
+    :style="{ paddingTop: `${statusBarHeight}px` }"
+  >
+    <view class="h-58rpx"></view>
+    <view class="px-32rpx mt-48rpx" v-if="!isLogin">
+      <view
+        class="bg-white rounded-16rpx flex items-center justify-between py-20rpx px-24rpx"
+      >
+        <view>您还未登录,快去登录吧!</view>
+        <commonbtn bg-color="#0074FF">去登录</commonbtn>
+      </view>
+    </view>
+    <view class="relative">
+      <wd-drop-menu>
+        <wd-drop-menu-item :options="option1" v-model="value" />
+      </wd-drop-menu>
+      <view class="absolute top-50% -translate-y-50% right-50rpx">
+        <view class="flex items-center">
+          <image src="@/static/index/user.png" class="w-40rpx h-40rpx"></image>
+          <view class="text-32rpx font-semibold ml-3">xxxx</view>
+        </view>
+      </view>
+    </view>
+    <view class="px-32rpx">
+      <view class="grid grid-cols-2 gap-3">
+        <view
+          class="flex items-center px-40rpx header rounded-2xl h-162rpx"
+          @click="handleCommenPath('/subPack/classInspection/index?type=0')"
+        >
+          <image src="@/static/index/pz.png" class="w-100rpx h-100rpx"></image>
+          <view class="text-32rpx font-semibold">拍照验课</view>
+        </view>
+        <view
+          class="flex items-center px-40rpx ls rounded-2xl h-162rpx"
+          @click="handleCommenPath('/subPack/classInspection/index?type=1')"
+        >
+          <image src="@/static/index/ls.png" class="w-100rpx h-100rpx"></image>
+          <view class="text-32rpx font-semibold">临时约课</view>
+        </view>
+        <view
+          class="flex items-center px-40rpx kc rounded-2xl h-162rpx"
+          @click="handleCommenPath('/subPack/classInspection/index?type=2')"
+        >
+          <image src="@/static/index/nz.png" class="w-100rpx h-100rpx"></image>
+          <view class="text-32rpx font-semibold">课程延期</view>
+        </view>
+        <view
+          class="flex items-center px-40rpx sm rounded-2xl h-162rpx"
+          @click="handleScanCode"
+        >
+          <image src="@/static/index/sm.png" class="w-100rpx h-100rpx"></image>
+          <view class="text-32rpx font-semibold">扫码验券</view>
+        </view>
+      </view>
+      <view class="mt-3">
+        <wd-notice-bar
+          :text="[
+            '这是一条消息提示信息',
+            '这是一条消息提示信息',
+            '这是一条消息提示信息',
+          ]"
+          color="#000000"
+          background-color="#fff"
+          direction="vertical"
+          @click="handleCommenPath('/subPack/notification/index')"
+        >
+          <template #prefix>
+            <image src="@/static/index/msg.png" class="w-30rpx h-30rpx"></image>
+          </template>
+        </wd-notice-bar>
+      </view>
+      <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">
+            <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">
+            <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>
+          <view
+            class="flex items-center justify-center flex-col"
+            @click="handleCommenPath('/subPack/Evaluation/index')"
+          >
+            <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">
+            <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">
+            <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>
+          <view class="flex items-center justify-center flex-col">
+            <image src="@/static/index/kf.png" class="w-52rpx h-52rpx"></image>
+            <view class="text-24rpx text-[rgb(0,0,0,0.6)] mt-3">平台客服</view>
+          </view>
+        </view>
+      </view>
+    </view>
+  </view>
 </template>
 
 <route lang="json">
 {
   "name": "home",
-  "layout": "tabbar",
   "style": {
-    "navigationBarTitleText": "首页"
+    "navigationBarTitleText": "首页",
+    "navigationStyle": "custom"
   }
 }
 </route>
+
+<style scoped lang="scss">
+:deep(.wd-drop-menu__list) {
+  background-color: transparent !important;
+  .wd-drop-menu__item {
+    text-align: left !important;
+  }
+}
+.ls {
+  background: linear-gradient(180deg, #ffecec 0%, #ffffff 100%);
+}
+.kc {
+  background: linear-gradient(180deg, #fff9e5 0%, #ffffff 100%);
+}
+.sm {
+  background: linear-gradient(180deg, #efffff 0%, #ffffff 100%);
+}
+</style>

BIN
src/static/index/bk.png


BIN
src/static/index/hx.png


BIN
src/static/index/kf.png


BIN
src/static/index/ls.png


BIN
src/static/index/msg.png


BIN
src/static/index/nz.png


BIN
src/static/index/pj.png


BIN
src/static/index/pz.png


BIN
src/static/index/sm.png


BIN
src/static/index/user.png


BIN
src/static/index/ye.png


BIN
src/static/index/yg.png


BIN
src/static/logo.png


+ 0 - 1
src/static/logo.svg

@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="512" height="512" viewBox="0 0 512 512"><defs><clipPath id="master_svg0_25_97"><rect x="0" y="0" width="512" height="512" rx="0"/></clipPath><clipPath id="master_svg1_25_11"><rect x="11" y="39" width="490" height="435" rx="0"/></clipPath></defs><g style="mix-blend-mode:passthrough" clip-path="url(#master_svg0_25_97)"><g clip-path="url(#master_svg1_25_11)"><g><path d="M51.4931,294.222767578125L205.214,437.551767578125C211.594,443.498767578125,220.016,446.812767578125,228.778,446.812767578125C237.54,446.812767578125,245.962,443.498767578125,252.342,437.551767578125L254.554,435.512767578125C238.306,411.638767578125,228.778,382.751767578125,228.778,351.655767578125C228.778,269.073767578125,295.812,202.124767578125,378.5,202.124767578125C402.575,202.124767578125,425.288,207.817767578125,445.45,217.842767578125C446.215,212.320767578125,446.556,206.797767578125,446.556,201.19076757812502L446.556,196.262767578125C446.556,136.874967578125,403.595,86.238267578125,344.983,76.467747578125C306.191,70.010717578125,266.719,82.669897578125,238.986,110.36716757812499L228.778,120.562467578125L218.569,110.36716757812499C190.837,82.669897578125,151.365,70.010717578125,112.573,76.467747578125C53.9601,86.238267578125,11,136.874967578125,11,196.262767578125L11,201.19076757812502C11,236.448767578125,25.6319,270.17876757812496,51.4931,294.222767578125ZM378.5,473.999767578125C446.13,473.999767578125,501,419.199767578125,501,351.655767578125C501,284.112767578125,446.13,229.312767578125,378.5,229.312767578125C310.87,229.312767578125,256,284.112767578125,256,351.655767578125C256,419.199767578125,310.87,473.999767578125,378.5,473.999767578125Z" fill="#2B9939" fill-opacity="1"/></g><g style="mix-blend-mode:passthrough"><path d="M322,415L441,415L441,293.5L419,293.5L419,393L344.5,393L344.5,293.5L322,293.5L322,415Z" fill="#FFFFFF" fill-opacity="1"/></g></g></g></svg>

BIN
src/static/vite.png


+ 12 - 0
src/store/user.ts

@@ -0,0 +1,12 @@
+import { defineStore } from "pinia";
+interface UserState {
+  isLogin: boolean;
+}
+export const useUserStore = defineStore({
+  id: "app-user",
+  state: (): UserState => ({
+    isLogin: false,
+  }),
+  getters: {},
+  actions: {},
+});

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

@@ -0,0 +1,110 @@
+<template>
+  <view class="h-screen overflow-y-scroll header box-border">
+    <wd-navbar
+      title="评价管理"
+      fixed
+      placeholder
+      safeAreaInsetTop
+      custom-style="background-color: transparent !important"
+      :bordered="false"
+      leftArrow
+      @click-left="handleClickLeft"
+    ></wd-navbar>
+    <view class="px-32rpx">
+      <view
+        class="bg-white p-24rpx mb-20rpx rounded-32rpx"
+        v-for="item in data"
+        :key="item.id"
+      >
+        <view class="text-[rgba(0,0,0,0.7)] text-28rpx">评价(23)</view>
+        <wd-divider color="#F0F0F0" custom-class="custom-divider"></wd-divider>
+        <view class="flex items-center justify-between mt-2">
+          <view class="flex items-center text-24rpx">
+            <image
+              src="https://pic1.arkoo.com/56D0B40F99F841DF8A2425762AE2565D/picture/o_1i4qop009177v1tgf14db15he1iaj1is.jpg"
+              class="w-60rpx h-60rpx rounded-full"
+            ></image>
+            <view class="ml-20rpx text-[rgba(0,0,0,0.9)]">张三</view>
+            <view class="ml-20rpx text-[rgba(0,0,0,0.3)]">2021-01-01</view>
+          </view>
+          <view
+            class="flex items-center justify-center text-white text-28rpx bg-#0074FF px-23rpx py-4rpx rounded-8rpx"
+            >待审核</view
+          >
+        </view>
+        <view class="flex items-center mt-16rpx">
+          <text class="text-[rgba(0,0,0,0.3)] text-24rpx mr-20rpx">4.0</text>
+          <wd-rate v-model="rate" readonly />
+        </view>
+        <view class="mt-20rpx text-[rgba(0,0,0,0.9)] text-28rpx"
+          >詹姆四对孩子很有耐心,也非常照顾小朋友的情绪, 值得推荐!</view
+        >
+        <view class="mt-20rpx flex items-center justify-between">
+          <image
+            src="https://pic1.arkoo.com/56D0B40F99F841DF8A2425762AE2565D/picture/o_1i4qop009177v1tgf14db15he1iaj1is.jpg"
+            v-for="item in 3"
+            class="w-202rpx h-200rpx rounded-32rpx"
+          ></image>
+        </view>
+        <view class="mt-24rpx">
+          <view class="bg-#F6F6F6 rounded-16rpx flex p-20rpx">
+            <view class="text-[rgba(0,0,0,0.3)] text-24rpx">商家回复:</view>
+            <view
+              class="text-24rpx w-68%"
+              :class="[currentId == item.id ? '' : 'truncate ']"
+              >谢谢您的评价,我们会越来越好,谢谢额外企鹅王企鹅我去额外企鹅轻微青sadsadasdsadasdasdasdasdasd蛙</view
+            >
+            <view
+              class="text-[rgba(0,0,0,0.3)] text-24rpx flex-1 text-center"
+              @click="handleChange(item.id)"
+              >{{ currentId == item.id ? "折叠" : "展开" }}</view
+            >
+          </view>
+        </view>
+        <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"
+            >回复</view
+          >
+        </view>
+      </view>
+    </view>
+  </view>
+</template>
+
+<script setup lang="ts">
+const rate = ref(4);
+const currentId = ref();
+const data = ref([
+  { id: 0 },
+  { id: 1 },
+  { id: 2 },
+  { id: 3 },
+  { id: 4 },
+  { id: 5 },
+  { id: 6 },
+  { id: 7 },
+  { id: 8 },
+]);
+function handleChange(id: number) {
+  currentId.value == id ? (currentId.value = null) : (currentId.value = id);
+}
+function handleClickLeft() {
+  uni.navigateBack();
+}
+</script>
+
+<style>
+.custom-divider {
+  padding: 0 !important;
+}
+</style>
+<route lang="json">
+{
+  "name": "Evaluation",
+  "style": {
+    "navigationBarTitleText": "评价",
+    "navigationStyle": "custom"
+  }
+}
+</route>

+ 57 - 0
src/subPack/ExtensionClass/index.vue

@@ -0,0 +1,57 @@
+<template>
+  <view class="px32rpx py24rpx">
+    <view class="bg-white rounded-16rpx p-24rpx">
+      <wd-select-picker
+        label="补课课时"
+        v-model="value"
+        :columns="columns"
+        placeholder="请选择补课课时"
+        align-right
+        type="radio"
+        safe-area-inset-bottom
+      ></wd-select-picker>
+      <wd-divider color="#F0F0F0"></wd-divider>
+      <view class="flex items-center justify-end mt24rpx">
+        <view class="text-24rpx text-[rgb(0,0,0,0.3)]"
+          >未找到合适的补课课时,<text class="text-#0074FF">去新增</text>
+        </view>
+      </view>
+    </view>
+  </view>
+  <WdButton block size="large">提交</WdButton>
+</template>
+
+<script setup lang="ts">
+const columns = ref<Record<string, any>[]>([
+  {
+    value: "101",
+    label: "男装",
+  },
+  {
+    value: "102",
+    label: "奢侈品",
+  },
+  {
+    value: "103",
+    label: "女装",
+  },
+]);
+const value = ref<string>("101");
+</script>
+
+<style scoped>
+:deep(.wd-select-picker__cell) {
+  padding: 0 !important;
+}
+:deep(.wd-divider) {
+  padding: 0 !important;
+}
+</style>
+<route lang="json">
+{
+  "name": "ExtensionClass",
+  "style": {
+    "navigationBarTitleText": "填写延期信息"
+  }
+}
+</route>

+ 63 - 0
src/subPack/PersonnelView/index.vue

@@ -0,0 +1,63 @@
+<template>
+  <view>
+    <wd-tabs v-model="tab" swipeable sticky>
+      <block v-for="item in tabList" :key="item.id">
+        <wd-tab :title="item.title">
+          <view class="bg-#F6F6F6 px32rpx pt-24rpx bottom-safe-area">
+            <view
+              class="p24rpx box-border bg-white mb24rpx rounded-32rpx"
+              v-for="it in 20"
+            >
+              <view class="flex items-center justify-between">
+                <view class="font-semibold text-22rpx text-#222222"
+                  >杨锦新</view
+                >
+                <commonbtn bg-color="#0074FF">未核销</commonbtn>
+              </view>
+              <view
+                class="flex items-center justify-between text-28rpx mt24rpx"
+              >
+                <view class="text-[rgb(0,0,0,0.3)]">手机号码</view>
+                <view>185659254423</view>
+              </view>
+              <view class="text-[rgb(0,0,0,0.3)] mt24rpx"> 人脸照片 </view>
+              <view class="mt24rpx">
+                <image
+                  src="https://pic1.arkoo.com/56D0B40F99F841DF8A2425762AE2565D/picture/o_1i4qop009177v1tgf14db15he1iaj1is.jpg"
+                  class="w-160rpx h-160rpx rounded-32rpx"
+                />
+              </view>
+              <view class="mt24rpx flex items-center justify-between">
+                <view class="text-28rpx text-[rgb(0,0,0,0.3)]">延课原因</view>
+                <view>生病了无法参与剧烈运动</view>
+              </view>
+            </view>
+          </view>
+        </wd-tab>
+      </block>
+    </wd-tabs>
+  </view>
+</template>
+
+<script setup lang="ts">
+const tab = ref(0);
+const tabList = ref([
+  { title: "全部", id: 0 },
+  { title: "延课(2)", id: 1 },
+  { title: "已核销(12)", id: 2 },
+  { title: "未核销(12)", id: 3 },
+]);
+onReachBottom(() => {
+  console.log("页面触底");
+});
+</script>
+
+<style scoped></style>
+<route lang="json">
+{
+  "name": "personnelView",
+  "style": {
+    "navigationBarTitleText": "人员查看"
+  }
+}
+</route>

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

@@ -0,0 +1,133 @@
+<!-- <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">
+      <view class="text-32rpx font-semibold">选择约课学生</view>
+      <view class="mt28rpx">
+        <view
+          v-if="selectedTags.length"
+          class="flex flex-wrap gap-10rpx mb20rpx"
+        >
+          <view
+            v-for="name in selectedTags"
+            :key="name"
+            class="bg-[rgba(0,0,0,0.1)] text-[rgb(0,0,0,0.9)] text-24rpx px20rpx py10rpx rounded-full flex items-center cursor-pointer"
+            @click="removeTag(name)"
+          >
+            {{ name }}
+            <text class="ml10rpx font-bold">×</text>
+          </view>
+        </view>
+        <view class="flex items-center mt28rpx">
+          <view class="text-28rpx">学生姓名:</view>
+          <wd-input
+            v-model="inputValue"
+            type="text"
+            placeholder="请输入姓名"
+            no-border
+            @focus="handleFocus"
+            @blur="handleBlur"
+          />
+        </view>
+        <view
+          v-if="isFocused && filteredList.length"
+          class="mt10rpx hover:bg-gray-100 py10rpx rounded-xl"
+          v-for="name in filteredList"
+          @click="selectStudent(name)"
+        >
+          <view :key="name" class="text-28rpx">
+            {{ name }}
+          </view>
+          <view class="mt12rpx text-[rgb(0,0,0,0.3)] text-24rpx"
+            >159****6549</view
+          >
+        </view>
+      </view>
+    </view>
+  </view>
+  <fixdbtn block size="large">提交</fixdbtn>
+</template>
+
+<script setup lang="ts">
+import { ref, computed } from "vue";
+
+const inputValue = ref("");
+const selectedTags = ref<string[]>([]);
+const isFocused = ref(false);
+
+// 模拟学生列表
+const studentList = ["张三", "李四", "王五", "赵六", "孙七", "李"];
+
+// 过滤出匹配的学生
+const filteredList = computed(() => {
+  if (!inputValue.value) return [];
+  return studentList.filter((name) => name.includes(inputValue.value));
+});
+
+// 选择学生
+const selectStudent = (name: string) => {
+  if (!selectedTags.value.includes(name)) {
+    selectedTags.value.push(name);
+  }
+  inputValue.value = "";
+  isFocused.value = false;
+};
+
+// 删除 tag
+const removeTag = (name: string) => {
+  selectedTags.value = selectedTags.value.filter((tag) => tag !== name);
+};
+
+// 输入框聚焦/失焦处理
+const handleFocus = () => {
+  isFocused.value = true;
+};
+const handleBlur = () => {
+  // 延迟隐藏,防止点击列表时触发隐藏
+  setTimeout(() => {
+    isFocused.value = false;
+  }, 200);
+};
+</script>
+
+<style scoped>
+.absolute {
+  position: absolute;
+}
+.z-10 {
+  z-index: 10;
+}
+</style>
+
+<route lang="json">
+{
+  "name": "ReservationClass",
+  "style": {
+    "navigationBarTitleText": "选择课程"
+  }
+}
+</route>

+ 38 - 0
src/subPack/classInspection/index.vue

@@ -0,0 +1,38 @@
+<template>
+  <wd-navbar
+    :title="titleArr[type]"
+    fixed
+    placeholder
+    safeAreaInsetTop
+    :bordered="false"
+    leftArrow
+    @click-left="handleClickLeft"
+  ></wd-navbar>
+  <view class="px32rpx py-24rpx">
+    <view v-for="item in 20" class="mb24rpx">
+      <course :type="type"></course>
+    </view>
+  </view>
+</template>
+
+<script setup lang="ts">
+const type = ref(0);
+const titleArr = ["拍照验课", "选择课程", "选择课程延期"];
+onLoad((query: any) => {
+  type.value = query.type;
+});
+function handleClickLeft() {
+  uni.navigateBack();
+}
+</script>
+
+<style scoped></style>
+<route lang="json">
+{
+  "name": "classInspection",
+  "style": {
+    "navigationBarTitleText": "拍照验课||选择课程",
+    "navigationStyle": "custom"
+  }
+}
+</route>

+ 86 - 0
src/subPack/classInspectionDetaile/index.vue

@@ -0,0 +1,86 @@
+<template>
+  <wd-navbar
+    :title="titleArr[type]"
+    fixed
+    placeholder
+    safeAreaInsetTop
+    :bordered="false"
+    leftArrow
+    @click-left="handleClickLeft"
+  ></wd-navbar>
+  <view class="px32rpx py-24rpx">
+    <course disabled></course>
+    <view class="mt24rpx flex items-center">
+      <image src="@/subPack/static/nz.png" class="w-30rpx h30rpx"></image>
+      <view class="text-32rpx ml-3 font-semibold">今日上课</view>
+    </view>
+    <view class="mt24rpx">
+      <ClassItem :type="type"></ClassItem>
+    </view>
+    <view class="title">
+      <view class="mt24rpx mb24rpx flex text-32rpx items-center">
+        <view
+          class="mr28rpx"
+          :class="[tab == 0 ? 'text-#0074FF' : 'text-[rgb(0,0,0,0.3)]']"
+          @click="tab = 0"
+          >正常课(6)</view
+        >
+        <view
+          :class="[tab == 1 ? 'text-#0074FF' : 'text-[rgb(0,0,0,0.3)]']"
+          @click="handleGoView"
+          >补课(5)</view
+        >
+      </view>
+      <view v-for="item in 6" class="mb24rpx">
+        <ClassItem :type="type"></ClassItem>
+      </view>
+      <view class="text-#0074FF mt24rpx mb24rpx view">补课(5)</view>
+      <view v-for="item in 5" class="mb24rpx">
+        <ClassItem :type="type"></ClassItem>
+      </view>
+    </view>
+  </view>
+</template>
+
+<script setup lang="ts">
+import img0 from "@/subPack/static/yy.png";
+import img1 from "@/subPack/static/yq.png";
+const tab = ref(0);
+const type = ref(0);
+const titleArr = ["拍照验课", "选择课程", "选择延期课时"];
+onLoad((query: any) => {
+  type.value = query.type;
+});
+function handleGoView() {
+  tab.value = 1;
+  uni.pageScrollTo({ selector: ".view" });
+}
+uni
+  .createIntersectionObserver(getCurrentInstance())
+  .relativeToViewport(".title")
+  .observe(".view", (res) => {
+    if (res.intersectionRatio == 0) {
+      tab.value = 0;
+    }
+  });
+function handleClickLeft() {
+  uni.navigateBack();
+}
+function getToast(type: number) {
+  uni.showToast({
+    image: type == 1 ? img0 : img1,
+    title: type == 1 ? "预约成功" : "延期成功",
+  });
+}
+</script>
+
+<style scoped></style>
+<route lang="json">
+{
+  "name": "classInspectionDetaile",
+  "style": {
+    "navigationBarTitleText": "拍照验课",
+    "navigationStyle": "custom"
+  }
+}
+</route>

+ 43 - 0
src/subPack/notification/index.vue

@@ -0,0 +1,43 @@
+<template>
+  <view class="px32rpx py20rpx">
+    <view
+      class="bg-white rounded-32rpx px24rpx py28rpx box-border flex items-center justify-between mb24rpx"
+      v-for="item in 5"
+      @click="handleDetailes"
+    >
+      <view>
+        <wd-text
+          color="rgb(0,0,0,0.9)"
+          text="爱护公共场所,请勿吸烟乱扔垃圾爱护公共场所,请312321312ewerwrwe勿吸..."
+          :lines="2"
+          size="32"
+        ></wd-text>
+        <view class="text-24rpx text-[rgb(0,0,0,0.3)] mt24rpx"
+          >全龄运动平台 03-14 10:23</view
+        >
+      </view>
+      <image
+        src="https://pic1.arkoo.com/56D0B40F99F841DF8A2425762AE2565D/picture/o_1i4qop009177v1tgf14db15he1iaj1is.jpg"
+        class="w-160rpx h-160rpx rounded-32rpx min-w-160rpx"
+      />
+    </view>
+  </view>
+</template>
+
+<script setup lang="ts">
+function handleDetailes() {
+  uni.navigateTo({
+    url: "/subPack/notificationDetailes/index",
+  });
+}
+</script>
+
+<style scoped></style>
+<route lang="json">
+{
+  "name": "notification",
+  "style": {
+    "navigationBarTitleText": "消息通知"
+  }
+}
+</route>

+ 30 - 0
src/subPack/notificationDetailes/index.vue

@@ -0,0 +1,30 @@
+<template>
+  <view class="px32rpx py20rpx bg-white h-screen overflow-y-scroll">
+    <view class="text-32rpx"
+      >爱护公共场所,请勿吸烟乱扔垃圾爱护公共场所, 请勿吸烟乱扔</view
+    >
+    <view class="text-[rgb(0,0,0,0.3)] text-24rpx mt24rpx mb24rpx">
+      全龄运动平台 03-14 10:23</view
+    >
+    <view class="text-28rpx"
+      >爱护公共场所,请勿吸烟乱扔垃圾爱护公共场所,请勿
+      吸烟乱扔爱护公共场所,请勿吸烟乱扔垃圾爱护公共场
+      所,请勿吸烟乱扔爱护公共场所,请勿吸烟乱扔垃圾爱
+      护公共场所,请勿吸烟乱扔。</view
+    >
+  </view>
+</template>
+
+<script setup lang="ts">
+function handleDetailes() {}
+</script>
+
+<style scoped></style>
+<route lang="json">
+{
+  "name": "notificationDetailes",
+  "style": {
+    "navigationBarTitleText": "消息通知"
+  }
+}
+</route>

+ 30 - 0
src/subPack/selectClass/index.vue

@@ -0,0 +1,30 @@
+<template>
+  <view class="px32rpx py20rpx">
+    <view class="text-28rpx">未核销<text class="text-#0074FF">18</text>人</view>
+
+    <view
+      class="bg-white rounded-32rpx flex items-center justify-between p24rpx box-border mt20rpx"
+    >
+      <view class="font-semibold text-32rpx">杨锦新</view>
+      <wd-upload image-mode="aspectFill"></wd-upload>
+    </view>
+  </view>
+  <!-- <view
+    class="bg-white w-full fixed bottom-0 bottom-safe-area px32rpx pt-16rpx box-border rounded-t-32rpx box"
+  >
+    <wd-button block size="large">提交</wd-button>
+  </view> -->
+  <fixdbtn block size="large">提交</fixdbtn>
+</template>
+
+<script setup lang="ts"></script>
+
+<style scoped></style>
+<route lang="json">
+{
+  "name": "selectClass",
+  "style": {
+    "navigationBarTitleText": "选择课程"
+  }
+}
+</route>

BIN
src/subPack/static/hxmx.png


BIN
src/subPack/static/hxs.png


BIN
src/subPack/static/nz.png


BIN
src/subPack/static/yq.png


BIN
src/subPack/static/yy.png


+ 15 - 0
src/subPack/writeOff/index.vue

@@ -0,0 +1,15 @@
+<template>
+  <view>123</view>
+</template>
+
+<script setup lang="ts"></script>
+
+<style scoped></style>
+<route lang="json">
+{
+  "name": "writeOff",
+  "style": {
+    "navigationBarTitleText": "扫码核销"
+  }
+}
+</route>

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

@@ -5,7 +5,17 @@
 
 interface NavigateToOptions {
   url: "/pages/index/index" |
-       "/pages/about/index";
+       "/pages/about/index" |
+       "/subPack/classInspection/index" |
+       "/subPack/classInspectionDetaile/index" |
+       "/subPack/Evaluation/index" |
+       "/subPack/ExtensionClass/index" |
+       "/subPack/notification/index" |
+       "/subPack/notificationDetailes/index" |
+       "/subPack/PersonnelView/index" |
+       "/subPack/ReservationClass/index" |
+       "/subPack/selectClass/index" |
+       "/subPack/writeOff/index";
 }
 interface RedirectToOptions extends NavigateToOptions {}
 

+ 3 - 3
src/utils/index.ts

@@ -3,7 +3,7 @@
  * @returns 当前页面路径
  */
 export function getCurrentPath() {
-  const pages = getCurrentPages()
-  const currentPage = pages[pages.length - 1]
-  return currentPage.route || ''
+  const pages = getCurrentPages();
+  const currentPage = pages[pages.length - 1];
+  return currentPage.route || "";
 }

+ 1 - 1
tsconfig.json

@@ -4,7 +4,7 @@
     "lib": ["ESNext", "DOM", "DOM.Iterable"],
     "baseUrl": ".",
     "paths": {
-      "@/*": ["./src/*"]
+      "@/*": ["./src/*"],
     },
     "types": [
       "@dcloudio/types",

+ 7 - 10
uno.config.ts

@@ -3,10 +3,9 @@ import {
   presetIcons,
   transformerDirectives,
   transformerVariantGroup,
-} from 'unocss'
-
-import { presetUni } from '@uni-helper/unocss-preset-uni'
+} from "unocss";
 
+import { presetUni } from "@uni-helper/unocss-preset-uni";
 export default defineConfig({
   presets: [
     presetUni({
@@ -18,8 +17,8 @@ export default defineConfig({
       scale: 1.2,
       warn: true,
       extraProperties: {
-        'display': 'inline-block',
-        'vertical-align': 'middle',
+        display: "inline-block",
+        "vertical-align": "middle",
       },
       // HBuilderX 必须针对要使用的 Collections 做异步导入
       // collections: {
@@ -27,8 +26,6 @@ export default defineConfig({
       // },
     }),
   ],
-  transformers: [
-    transformerDirectives(),
-    transformerVariantGroup(),
-  ],
-})
+
+  transformers: [transformerDirectives(), transformerVariantGroup()],
+});

+ 35 - 26
vite.config.ts

@@ -1,15 +1,15 @@
-import { defineConfig } from 'vite'
-import Uni from '@dcloudio/vite-plugin-uni'
-import UniHelperManifest from '@uni-helper/vite-plugin-uni-manifest'
-import UniHelperPages from '@uni-helper/vite-plugin-uni-pages'
-import UniHelperLayouts from '@uni-helper/vite-plugin-uni-layouts'
-import UniHelperComponents from '@uni-helper/vite-plugin-uni-components'
-import AutoImport from 'unplugin-auto-import/vite'
-import { WotResolver } from '@uni-helper/vite-plugin-uni-components/resolvers'
+import { defineConfig } from "vite";
+import Uni from "@dcloudio/vite-plugin-uni";
+import UniHelperManifest from "@uni-helper/vite-plugin-uni-manifest";
+import UniHelperPages from "@uni-helper/vite-plugin-uni-pages";
+import UniHelperLayouts from "@uni-helper/vite-plugin-uni-layouts";
+import UniHelperComponents from "@uni-helper/vite-plugin-uni-components";
+import AutoImport from "unplugin-auto-import/vite";
+import { WotResolver } from "@uni-helper/vite-plugin-uni-components/resolvers";
 
 // https://vitejs.dev/config/
 export default async () => {
-  const UnoCSS = (await import('unocss/vite')).default
+  const UnoCSS = (await import("unocss/vite")).default;
 
   return defineConfig({
     plugins: [
@@ -17,37 +17,46 @@ export default async () => {
       UniHelperManifest(),
       // https://github.com/uni-helper/vite-plugin-uni-pages
       UniHelperPages({
-        dts: 'src/uni-pages.d.ts',
+        dts: "src/uni-pages.d.ts",
+        subPackages: ["src/subPack"],
       }),
       // https://github.com/uni-helper/vite-plugin-uni-layouts
       UniHelperLayouts(),
       // https://github.com/uni-helper/vite-plugin-uni-components
       UniHelperComponents({
         resolvers: [WotResolver()],
-        dts: 'src/components.d.ts',
-        dirs: ['src/components', 'src/business'],
+        dts: "src/components.d.ts",
+        dirs: ["src/components", "src/business"],
         directoryAsNamespace: true,
       }),
       Uni(),
       // https://github.com/antfu/unplugin-auto-import
       AutoImport({
-        imports: ['vue', '@vueuse/core', 'pinia', 'uni-app', {
-          from: 'uni-mini-router',
-          imports: ['createRouter', 'useRouter', 'useRoute'],
-        }, {
-          from: 'wot-design-uni',
-          imports: ['useToast', 'useMessage', 'useNotify', 'CommonUtil'],
-        }, {
-          from: 'alova/client',
-          imports: ['usePagination', 'useRequest'],
-        }],
-        dts: 'src/auto-imports.d.ts',
-        dirs: ['src/composables', 'src/store', 'src/utils', 'src/api'],
+        imports: [
+          "vue",
+          "@vueuse/core",
+          "pinia",
+          "uni-app",
+          {
+            from: "uni-mini-router",
+            imports: ["createRouter", "useRouter", "useRoute"],
+          },
+          {
+            from: "wot-design-uni",
+            imports: ["useToast", "useMessage", "useNotify", "CommonUtil"],
+          },
+          {
+            from: "alova/client",
+            imports: ["usePagination", "useRequest"],
+          },
+        ],
+        dts: "src/auto-imports.d.ts",
+        dirs: ["src/composables", "src/store", "src/utils", "src/api"],
         vueTemplate: true,
       }),
       // https://github.com/antfu/unocss
       // see unocss.config.ts for config
       UnoCSS(),
     ],
-  })
-}
+  });
+};