zhuf vor 1 Jahr
Ursprung
Commit
6160ea85d9

+ 62 - 0
auto-imports.d.ts

@@ -31,13 +31,26 @@ declare global {
   const defineComponent: typeof import('vue')['defineComponent']
   const defineLoader: typeof import('vue-router/auto')['defineLoader']
   const definePage: typeof import('unplugin-vue-router/runtime')['definePage']
+  const deleteEbook: typeof import('./src/composables/ebook')['deleteEbook']
+  const deletedoc: typeof import('./src/composables/doc')['deletedoc']
+  const docDialogVisible: typeof import('./src/composables/doc')['docDialogVisible']
+  const docList: typeof import('./src/composables/doc')['docList']
+  const docListLoading: typeof import('./src/composables/doc')['docListLoading']
+  const docSelectedList: typeof import('./src/composables/doc')['docSelectedList']
+  const downloadFile: typeof import('./src/composables/index')['downloadFile']
   const eagerComputed: typeof import('@vueuse/core')['eagerComputed']
+  const ebookDialogVisible: typeof import('./src/composables/ebook')['ebookDialogVisible']
+  const ebookList: typeof import('./src/composables/ebook')['ebookList']
+  const ebookListLoading: typeof import('./src/composables/ebook')['ebookListLoading']
+  const ebookSelectedList: typeof import('./src/composables/ebook')['ebookSelectedList']
   const effectScope: typeof import('vue')['effectScope']
   const extendRef: typeof import('@vueuse/core')['extendRef']
   const getCurrentInstance: typeof import('vue')['getCurrentInstance']
   const getCurrentScope: typeof import('vue')['getCurrentScope']
+  const getFileType: typeof import('./src/composables/index')['getFileType']
   const h: typeof import('vue')['h']
   const ignorableWatch: typeof import('@vueuse/core')['ignorableWatch']
+  const inDebug: typeof import('./src/composables/index')['inDebug']
   const inject: typeof import('vue')['inject']
   const injectLocal: typeof import('@vueuse/core')['injectLocal']
   const isDark: typeof import('./src/composables/dark')['isDark']
@@ -84,9 +97,16 @@ declare global {
   const refDefault: typeof import('@vueuse/core')['refDefault']
   const refThrottled: typeof import('@vueuse/core')['refThrottled']
   const refWithControl: typeof import('@vueuse/core')['refWithControl']
+  const requestDocList: typeof import('./src/composables/doc')['requestDocList']
+  const requestEbookList: typeof import('./src/composables/ebook')['requestEbookList']
+  const requestWorkList: typeof import('./src/composables/work')['requestWorkList']
+  const requestdocList: typeof import('./src/composables/doc')['requestdocList']
   const resolveComponent: typeof import('vue')['resolveComponent']
   const resolveRef: typeof import('@vueuse/core')['resolveRef']
   const resolveUnref: typeof import('@vueuse/core')['resolveUnref']
+  const sendDoc: typeof import('./src/composables/doc')['sendDoc']
+  const sendWork: typeof import('./src/composables/work')['sendWork']
+  const senddoc: typeof import('./src/composables/doc')['senddoc']
   const shallowReactive: typeof import('vue')['shallowReactive']
   const shallowReadonly: typeof import('vue')['shallowReadonly']
   const shallowRef: typeof import('vue')['shallowRef']
@@ -287,6 +307,10 @@ declare global {
   const watchTriggerable: typeof import('@vueuse/core')['watchTriggerable']
   const watchWithFilter: typeof import('@vueuse/core')['watchWithFilter']
   const whenever: typeof import('@vueuse/core')['whenever']
+  const workDialogVisible: typeof import('./src/composables/work')['workDialogVisible']
+  const workList: typeof import('./src/composables/work')['workList']
+  const workListLoading: typeof import('./src/composables/work')['workListLoading']
+  const workSelectedList: typeof import('./src/composables/work')['workSelectedList']
 }
 // for type re-export
 declare global {
@@ -324,13 +348,25 @@ declare module 'vue' {
     readonly defineAsyncComponent: UnwrapRef<typeof import('vue')['defineAsyncComponent']>
     readonly defineComponent: UnwrapRef<typeof import('vue')['defineComponent']>
     readonly definePage: UnwrapRef<typeof import('unplugin-vue-router/runtime')['definePage']>
+    readonly deleteEbook: UnwrapRef<typeof import('./src/composables/ebook')['deleteEbook']>
+    readonly docDialogVisible: UnwrapRef<typeof import('./src/composables/doc')['docDialogVisible']>
+    readonly docList: UnwrapRef<typeof import('./src/composables/doc')['docList']>
+    readonly docListLoading: UnwrapRef<typeof import('./src/composables/doc')['docListLoading']>
+    readonly docSelectedList: UnwrapRef<typeof import('./src/composables/doc')['docSelectedList']>
+    readonly downloadFile: UnwrapRef<typeof import('./src/composables/index')['downloadFile']>
     readonly eagerComputed: UnwrapRef<typeof import('@vueuse/core')['eagerComputed']>
+    readonly ebookDialogVisible: UnwrapRef<typeof import('./src/composables/ebook')['ebookDialogVisible']>
+    readonly ebookList: UnwrapRef<typeof import('./src/composables/ebook')['ebookList']>
+    readonly ebookListLoading: UnwrapRef<typeof import('./src/composables/ebook')['ebookListLoading']>
+    readonly ebookSelectedList: UnwrapRef<typeof import('./src/composables/ebook')['ebookSelectedList']>
     readonly effectScope: UnwrapRef<typeof import('vue')['effectScope']>
     readonly extendRef: UnwrapRef<typeof import('@vueuse/core')['extendRef']>
     readonly getCurrentInstance: UnwrapRef<typeof import('vue')['getCurrentInstance']>
     readonly getCurrentScope: UnwrapRef<typeof import('vue')['getCurrentScope']>
+    readonly getFileType: UnwrapRef<typeof import('./src/composables/index')['getFileType']>
     readonly h: UnwrapRef<typeof import('vue')['h']>
     readonly ignorableWatch: UnwrapRef<typeof import('@vueuse/core')['ignorableWatch']>
+    readonly inDebug: UnwrapRef<typeof import('./src/composables/index')['inDebug']>
     readonly inject: UnwrapRef<typeof import('vue')['inject']>
     readonly injectLocal: UnwrapRef<typeof import('@vueuse/core')['injectLocal']>
     readonly isDefined: UnwrapRef<typeof import('@vueuse/core')['isDefined']>
@@ -376,9 +412,13 @@ declare module 'vue' {
     readonly refDefault: UnwrapRef<typeof import('@vueuse/core')['refDefault']>
     readonly refThrottled: UnwrapRef<typeof import('@vueuse/core')['refThrottled']>
     readonly refWithControl: UnwrapRef<typeof import('@vueuse/core')['refWithControl']>
+    readonly requestDocList: UnwrapRef<typeof import('./src/composables/doc')['requestDocList']>
+    readonly requestEbookList: UnwrapRef<typeof import('./src/composables/ebook')['requestEbookList']>
+    readonly requestWorkList: UnwrapRef<typeof import('./src/composables/work')['requestWorkList']>
     readonly resolveComponent: UnwrapRef<typeof import('vue')['resolveComponent']>
     readonly resolveRef: UnwrapRef<typeof import('@vueuse/core')['resolveRef']>
     readonly resolveUnref: UnwrapRef<typeof import('@vueuse/core')['resolveUnref']>
+    readonly sendDoc: UnwrapRef<typeof import('./src/composables/doc')['sendDoc']>
     readonly shallowReactive: UnwrapRef<typeof import('vue')['shallowReactive']>
     readonly shallowReadonly: UnwrapRef<typeof import('vue')['shallowReadonly']>
     readonly shallowRef: UnwrapRef<typeof import('vue')['shallowRef']>
@@ -578,6 +618,9 @@ declare module 'vue' {
     readonly watchTriggerable: UnwrapRef<typeof import('@vueuse/core')['watchTriggerable']>
     readonly watchWithFilter: UnwrapRef<typeof import('@vueuse/core')['watchWithFilter']>
     readonly whenever: UnwrapRef<typeof import('@vueuse/core')['whenever']>
+    readonly workDialogVisible: UnwrapRef<typeof import('./src/composables/work')['workDialogVisible']>
+    readonly workList: UnwrapRef<typeof import('./src/composables/work')['workList']>
+    readonly workListLoading: UnwrapRef<typeof import('./src/composables/work')['workListLoading']>
   }
 }
 declare module '@vue/runtime-core' {
@@ -608,13 +651,25 @@ declare module '@vue/runtime-core' {
     readonly defineAsyncComponent: UnwrapRef<typeof import('vue')['defineAsyncComponent']>
     readonly defineComponent: UnwrapRef<typeof import('vue')['defineComponent']>
     readonly definePage: UnwrapRef<typeof import('unplugin-vue-router/runtime')['definePage']>
+    readonly deleteEbook: UnwrapRef<typeof import('./src/composables/ebook')['deleteEbook']>
+    readonly docDialogVisible: UnwrapRef<typeof import('./src/composables/doc')['docDialogVisible']>
+    readonly docList: UnwrapRef<typeof import('./src/composables/doc')['docList']>
+    readonly docListLoading: UnwrapRef<typeof import('./src/composables/doc')['docListLoading']>
+    readonly docSelectedList: UnwrapRef<typeof import('./src/composables/doc')['docSelectedList']>
+    readonly downloadFile: UnwrapRef<typeof import('./src/composables/index')['downloadFile']>
     readonly eagerComputed: UnwrapRef<typeof import('@vueuse/core')['eagerComputed']>
+    readonly ebookDialogVisible: UnwrapRef<typeof import('./src/composables/ebook')['ebookDialogVisible']>
+    readonly ebookList: UnwrapRef<typeof import('./src/composables/ebook')['ebookList']>
+    readonly ebookListLoading: UnwrapRef<typeof import('./src/composables/ebook')['ebookListLoading']>
+    readonly ebookSelectedList: UnwrapRef<typeof import('./src/composables/ebook')['ebookSelectedList']>
     readonly effectScope: UnwrapRef<typeof import('vue')['effectScope']>
     readonly extendRef: UnwrapRef<typeof import('@vueuse/core')['extendRef']>
     readonly getCurrentInstance: UnwrapRef<typeof import('vue')['getCurrentInstance']>
     readonly getCurrentScope: UnwrapRef<typeof import('vue')['getCurrentScope']>
+    readonly getFileType: UnwrapRef<typeof import('./src/composables/index')['getFileType']>
     readonly h: UnwrapRef<typeof import('vue')['h']>
     readonly ignorableWatch: UnwrapRef<typeof import('@vueuse/core')['ignorableWatch']>
+    readonly inDebug: UnwrapRef<typeof import('./src/composables/index')['inDebug']>
     readonly inject: UnwrapRef<typeof import('vue')['inject']>
     readonly injectLocal: UnwrapRef<typeof import('@vueuse/core')['injectLocal']>
     readonly isDefined: UnwrapRef<typeof import('@vueuse/core')['isDefined']>
@@ -660,9 +715,13 @@ declare module '@vue/runtime-core' {
     readonly refDefault: UnwrapRef<typeof import('@vueuse/core')['refDefault']>
     readonly refThrottled: UnwrapRef<typeof import('@vueuse/core')['refThrottled']>
     readonly refWithControl: UnwrapRef<typeof import('@vueuse/core')['refWithControl']>
+    readonly requestDocList: UnwrapRef<typeof import('./src/composables/doc')['requestDocList']>
+    readonly requestEbookList: UnwrapRef<typeof import('./src/composables/ebook')['requestEbookList']>
+    readonly requestWorkList: UnwrapRef<typeof import('./src/composables/work')['requestWorkList']>
     readonly resolveComponent: UnwrapRef<typeof import('vue')['resolveComponent']>
     readonly resolveRef: UnwrapRef<typeof import('@vueuse/core')['resolveRef']>
     readonly resolveUnref: UnwrapRef<typeof import('@vueuse/core')['resolveUnref']>
+    readonly sendDoc: UnwrapRef<typeof import('./src/composables/doc')['sendDoc']>
     readonly shallowReactive: UnwrapRef<typeof import('vue')['shallowReactive']>
     readonly shallowReadonly: UnwrapRef<typeof import('vue')['shallowReadonly']>
     readonly shallowRef: UnwrapRef<typeof import('vue')['shallowRef']>
@@ -862,5 +921,8 @@ declare module '@vue/runtime-core' {
     readonly watchTriggerable: UnwrapRef<typeof import('@vueuse/core')['watchTriggerable']>
     readonly watchWithFilter: UnwrapRef<typeof import('@vueuse/core')['watchWithFilter']>
     readonly whenever: UnwrapRef<typeof import('@vueuse/core')['whenever']>
+    readonly workDialogVisible: UnwrapRef<typeof import('./src/composables/work')['workDialogVisible']>
+    readonly workList: UnwrapRef<typeof import('./src/composables/work')['workList']>
+    readonly workListLoading: UnwrapRef<typeof import('./src/composables/work')['workListLoading']>
   }
 }

+ 2 - 0
components.d.ts

@@ -12,6 +12,8 @@ declare module 'vue' {
     CollapseNav: typeof import('./src/components/collapse-nav.vue')['default']
     copy: typeof import('./src/components/collapse-item.vue')['default']
     ElButton: typeof import('element-plus/es')['ElButton']
+    ElCheckbox: typeof import('element-plus/es')['ElCheckbox']
+    ElCheckboxGroup: typeof import('element-plus/es')['ElCheckboxGroup']
     ElDialog: typeof import('element-plus/es')['ElDialog']
     ElDivider: typeof import('element-plus/es')['ElDivider']
     ElRadio: typeof import('element-plus/es')['ElRadio']

+ 3 - 1
package.json

@@ -14,9 +14,11 @@
   "dependencies": {
     "@element-plus/icons-vue": "^2.3.1",
     "@vueuse/core": "^10.9.0",
+    "axios": "^1.7.2",
     "element-plus": "^2.7.5",
     "vue": "^3.4.27",
-    "vue-router": "^4.3.2"
+    "vue-router": "^4.3.2",
+    "vue-virtual-scroller": "2.0.0-beta.8"
   },
   "devDependencies": {
     "@antfu/eslint-config": "^2.18.1",

+ 68 - 0
pnpm-lock.yaml

@@ -14,6 +14,9 @@ importers:
       '@vueuse/core':
         specifier: ^10.9.0
         version: 10.9.0(vue@3.4.27(typescript@5.4.5))
+      axios:
+        specifier: ^1.7.2
+        version: 1.7.2
       element-plus:
         specifier: ^2.7.5
         version: 2.7.5(vue@3.4.27(typescript@5.4.5))
@@ -23,6 +26,9 @@ importers:
       vue-router:
         specifier: ^4.3.2
         version: 4.3.2(vue@3.4.27(typescript@5.4.5))
+      vue-virtual-scroller:
+        specifier: 2.0.0-beta.8
+        version: 2.0.0-beta.8(vue@3.4.27(typescript@5.4.5))
     devDependencies:
       '@antfu/eslint-config':
         specifier: ^2.18.1
@@ -1227,6 +1233,9 @@ packages:
   asynckit@0.4.0:
     resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
 
+  axios@1.7.2:
+    resolution: {integrity: sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==}
+
   balanced-match@1.0.2:
     resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
 
@@ -1805,6 +1814,15 @@ packages:
   flatted@3.2.9:
     resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==}
 
+  follow-redirects@1.15.6:
+    resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==}
+    engines: {node: '>=4.0'}
+    peerDependencies:
+      debug: '*'
+    peerDependenciesMeta:
+      debug:
+        optional: true
+
   form-data@4.0.0:
     resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==}
     engines: {node: '>= 6'}
@@ -2234,6 +2252,9 @@ packages:
     resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==}
     engines: {node: '>=16 || 14 >=14.17'}
 
+  mitt@2.1.0:
+    resolution: {integrity: sha512-ILj2TpLiysu2wkBbWjAmww7TkZb65aiQO+DkVdUTBpBXq+MHYiETENkKFMtsJZX1Lf4pe4QOrTSjIfUwN5lRdg==}
+
   mlly@1.6.1:
     resolution: {integrity: sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==}
 
@@ -2459,6 +2480,9 @@ packages:
   proto-list@1.2.4:
     resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==}
 
+  proxy-from-env@1.1.0:
+    resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
+
   psl@1.9.0:
     resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==}
 
@@ -2985,6 +3009,16 @@ packages:
     peerDependencies:
       eslint: '>=6.0.0'
 
+  vue-observe-visibility@2.0.0-alpha.1:
+    resolution: {integrity: sha512-flFbp/gs9pZniXR6fans8smv1kDScJ8RS7rEpMjhVabiKeq7Qz3D9+eGsypncjfIyyU84saU88XZ0zjbD6Gq/g==}
+    peerDependencies:
+      vue: ^3.0.0
+
+  vue-resize@2.0.0-alpha.1:
+    resolution: {integrity: sha512-7+iqOueLU7uc9NrMfrzbG8hwMqchfVfSzpVlCMeJQe4pyibqyoifDNbKTZvwxZKDvGkB+PdFeKvnGZMoEb8esg==}
+    peerDependencies:
+      vue: ^3.0.0
+
   vue-router@4.3.2:
     resolution: {integrity: sha512-hKQJ1vDAZ5LVkKEnHhmm1f9pMiWIBNGF5AwU67PdH7TyXCj/a4hTccuUuYCAMgJK6rO/NVYtQIEN3yL8CECa7Q==}
     peerDependencies:
@@ -2999,6 +3033,11 @@ packages:
     peerDependencies:
       typescript: '*'
 
+  vue-virtual-scroller@2.0.0-beta.8:
+    resolution: {integrity: sha512-b8/f5NQ5nIEBRTNi6GcPItE4s7kxNHw2AIHLtDp+2QvqdTjVN0FgONwX9cr53jWRgnu+HRLPaWDOR2JPI5MTfQ==}
+    peerDependencies:
+      vue: ^3.2.0
+
   vue@3.4.27:
     resolution: {integrity: sha512-8s/56uK6r01r1icG/aEOHqyMVxd1bkYcSe9j8HcKtr/xTOFWvnzIVTehNW+5Yt89f+DLBe4A569pnZLS5HzAMA==}
     peerDependencies:
@@ -4473,6 +4512,14 @@ snapshots:
 
   asynckit@0.4.0: {}
 
+  axios@1.7.2:
+    dependencies:
+      follow-redirects: 1.15.6
+      form-data: 4.0.0
+      proxy-from-env: 1.1.0
+    transitivePeerDependencies:
+      - debug
+
   balanced-match@1.0.2: {}
 
   binary-extensions@2.2.0: {}
@@ -5166,6 +5213,8 @@ snapshots:
 
   flatted@3.2.9: {}
 
+  follow-redirects@1.15.6: {}
+
   form-data@4.0.0:
     dependencies:
       asynckit: 0.4.0
@@ -5573,6 +5622,8 @@ snapshots:
     dependencies:
       brace-expansion: 2.0.1
 
+  mitt@2.1.0: {}
+
   mlly@1.6.1:
     dependencies:
       acorn: 8.11.3
@@ -5780,6 +5831,8 @@ snapshots:
 
   proto-list@1.2.4: {}
 
+  proxy-from-env@1.1.0: {}
+
   psl@1.9.0: {}
 
   punycode@2.3.1: {}
@@ -6368,6 +6421,14 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
+  vue-observe-visibility@2.0.0-alpha.1(vue@3.4.27(typescript@5.4.5)):
+    dependencies:
+      vue: 3.4.27(typescript@5.4.5)
+
+  vue-resize@2.0.0-alpha.1(vue@3.4.27(typescript@5.4.5)):
+    dependencies:
+      vue: 3.4.27(typescript@5.4.5)
+
   vue-router@4.3.2(vue@3.4.27(typescript@5.4.5)):
     dependencies:
       '@vue/devtools-api': 6.5.1
@@ -6385,6 +6446,13 @@ snapshots:
       semver: 7.6.2
       typescript: 5.4.5
 
+  vue-virtual-scroller@2.0.0-beta.8(vue@3.4.27(typescript@5.4.5)):
+    dependencies:
+      mitt: 2.1.0
+      vue: 3.4.27(typescript@5.4.5)
+      vue-observe-visibility: 2.0.0-alpha.1(vue@3.4.27(typescript@5.4.5))
+      vue-resize: 2.0.0-alpha.1(vue@3.4.27(typescript@5.4.5))
+
   vue@3.4.27(typescript@5.4.5):
     dependencies:
       '@vue/compiler-dom': 3.4.27

+ 11 - 10
src/components/collapse-bar.vue

@@ -15,14 +15,15 @@ const emits = defineEmits<{
 type TCollapseItem = typeof import('./src/components/collapse-item.vue')['default']
 const CollapseItemRefs = shallowRef<TCollapseItem[]>([])
 const CollapseItemList = [
-  { title: '画笔' },
-  { title: '擦除' },
-  { title: '计时器' },
-  { title: '随机点名' },
-  { title: '互动问答' },
-  { title: '随堂小练' },
-  { title: '学生演示' },
-  { title: '更多' }
+  { title: '画笔', icon: '/mipmap/sc_bottom_brush.png' },
+  { title: '擦除', icon: '/mipmap/sc_bottom_erase.png' },
+  { title: '计时器', icon: '/mipmap/sc_bottom_time.png' },
+  { title: '随机点名', icon: '/mipmap/sc_bottom_random.png' },
+  { title: '互动问答', icon: '/mipmap/sc_bottom_hand.png' },
+  { title: '小组讨论', icon: '/mipmap/sc_bottom_discuss.png' },
+  { title: '随堂小练', icon: '/mipmap/sc_bottom_practice.png' },
+  { title: '作品展示', icon: '/mipmap/sc_bottom_work_show.png' },
+  // { title: '更多' ,icon:'/mipmap/aaaaa.png' }
 ]
 
 let lastSelectedCollapseItem: TCollapseItem | null = null
@@ -69,8 +70,8 @@ onMounted(() => {
         class="flex justify-center items-center px-6 bg-hex-16271F text-white space-x-1 rounded-t-12px overflow-hidden h-96px"
         v-show="!collapsed">
         <!-- <slot /> -->
-        <collapse-item ref="CollapseItemRefs" v-for="({ title }, idx) in CollapseItemList" :title="title"
-          @click="handleClickCollapseItem(idx)"></collapse-item>
+        <collapse-item ref="CollapseItemRefs" v-for="({ title, icon }, idx) in CollapseItemList" :title="title"
+          :icon="icon" @click="handleClickCollapseItem(idx)"></collapse-item>
       </div>
     </Transition>
 

+ 3 - 1
src/components/collapse-item.vue

@@ -23,7 +23,9 @@ defineExpose({
 <template>
   <div ref="itemRef"
     class=" flex flex-col items-center justify-around w-72px h-72px cursor-pointer hover:bg-hex-39393a rounded-10px">
-    <div class="w-26px h-26px"></div>
+    <div class="w-26px h-26px">
+      <img v-if="icon" :src="icon" w-full h-full>
+    </div>
     <div class="text-xs tracking-wider">{{ title }}</div>
   </div>
 </template>

+ 8 - 57
src/components/collapse-nav.vue

@@ -1,52 +1,3 @@
-<!-- <script setup lang='ts'>
-import { ArrowLeft, ArrowRight } from '@element-plus/icons-vue'
-const collapsed = ref(false)
-
-const toggleCollapse = () => {
-  collapsed.value = !collapsed.value
-}
-
-type TCollapseItem = typeof import('./src/components/collapse-item.vue')['default']
-const CollapseItemRefs = shallowRef<TCollapseItem[]>([])
-const CollapseItemList = [
-  { title: '白板' },
-  { title: '电子课本' },
-  { title: '课件' },
-  { title: '讲评' },
-  { title: '文件分发' },
-  { title: '屏幕共享' },
-  { title: '菜单' },
-]
-
-let lastSelectedCollapseItem: TCollapseItem | null = null
-function handleClickCollapseItem(idx: number) {
-  if (lastSelectedCollapseItem) {
-    lastSelectedCollapseItem.unselect()
-  }
-  lastSelectedCollapseItem = CollapseItemRefs.value[idx]
-  lastSelectedCollapseItem.select()
-}
-
-</script> -->
-
-<!-- <template>
-  <div class="absolute right-0 flex items-center">
-    <div class="h-60px w-20px rounded-l-10px flex justify-center bg-hex-16271F text-white cursor-pointer"
-      @click="toggleCollapse">
-      <component :is="collapsed?ArrowLeft:ArrowRight"></component>
-    </div>
-    <Transition mode="out-in">
-      <div
-        class="flex flex-col justify-center items-center py-6 bg-hex-16271F text-white space-y-1 rounded-l-12px overflow-hidden w-96px"
-        v-show="!collapsed">
-        <collapse-item ref="CollapseItemRefs" v-for="({ title }, idx) in CollapseItemList" :title="title"
-          @click="handleClickCollapseItem(idx)"></collapse-item>
-      </div>
-    </Transition>
-
-  </div>
-</template> -->
-
 <script setup lang='ts'>
 import { ArrowLeft, ArrowRight } from '@element-plus/icons-vue'
 const collapsed = ref(false)
@@ -64,13 +15,13 @@ const emits = defineEmits<{
 type TCollapseItem = typeof import('./src/components/collapse-item.vue')['default']
 const CollapseItemRefs = shallowRef<TCollapseItem[]>([])
 const CollapseItemList = [
-  { title: '白板' },
-  { title: '电子课本' },
-  { title: '课件' },
-  { title: '讲评' },
-  { title: '文件分发' },
-  { title: '屏幕共享' },
-  { title: '菜单' },
+  { title: '白板',icon:'/mipmap/sc_slide_whiteboard.png' },
+  { title: '电子课本',icon:'/mipmap/sc_slide_book.png' },
+  { title: '课件',icon:'/mipmap/sc_slide_class.png' },
+  { title: '讲评',icon:'/mipmap/sc_slide_star.png' },
+  // { title: '文件分发',icon:'/mipmap/aaaaa.png' },
+  { title: '屏幕共享',icon:'/mipmap/sc_bottom_discuss.png' },
+  { title: '菜单',icon:'/mipmap/sc_slide_menu.png' },
 ]
 
 let lastSelectedCollapseItem: TCollapseItem | null = null
@@ -110,7 +61,7 @@ onMounted(() => {
       <div
         class="flex flex-col justify-center items-center py-6 bg-hex-16271F text-white space-y-1 rounded-l-12px overflow-hidden w-96px"
         v-show="!collapsed">
-        <collapse-item ref="CollapseItemRefs" v-for="({ title }, idx) in CollapseItemList" :title="title"
+        <collapse-item ref="CollapseItemRefs" v-for="({ title,icon }, idx) in CollapseItemList" :title="title" :icon="icon"
           @click="handleClickCollapseItem(idx)"></collapse-item>
       </div>
     </Transition>

+ 63 - 0
src/composables/doc.ts

@@ -0,0 +1,63 @@
+import request from "~/request/request"
+
+import { user } from "~/store/user"
+
+export const docDialogVisible = ref(false)
+
+export const docListLoading = ref(true)
+
+export const docList = ref<any[]>([])
+
+export function requestDocList(d: any = {}) {
+  docListLoading.value = true
+  return request({
+    url: '/ybk/bkzy/index',
+    data: {
+      limit: 1000,
+      ...d,
+    }
+  }).then((res) => {
+    if (res.code === '1') {
+      docList.value = res.data.page_data
+    }
+  }).catch((error) => {
+    console.error(error)
+  }).finally(() => {
+    docListLoading.value = false
+  })
+}
+
+// requestdocList()
+
+export const docSelectedList = ref<string[]>([])
+
+export function sendDoc() {
+  if (inDebug) {
+    docSelectedList.value = []
+    return
+  }
+
+  return request({
+    url: '/ybk/bkzy_share/add',
+    data: {
+      ybk_bkzy_share: {
+        ykz_id: docSelectedList.value,
+
+        ybzs_send_user_id: user.value?.user_id,
+        ybzs_send_user_realname: user.value?.user_realname,
+        ybzs_receive: [
+          {
+            ybzs_receive_user_id: 278794,
+            ybzs_receive_user_realname: '许胡明'
+          }
+        ],
+      }
+    }
+  }).then((res) => {
+    if (res.code === '1') {
+      docSelectedList.value = []
+    }
+  }).catch((error) => {
+    console.error(error)
+  })
+}

+ 90 - 0
src/composables/ebook.ts

@@ -0,0 +1,90 @@
+import request from "~/request/request"
+
+
+
+export const ebookDialogVisible = ref(false)
+
+export const ebookListLoading = ref(true)
+
+// {
+//   "zem_id": "87",
+//   "zem_keyword": "数学(北师大版八上);978-7-5447-2948-2-36",
+//   "zem_name": "数学(北师大版八上)",
+//   "zem_isbn": "978-7-5447-2948-2-36",
+//   "zem_img": "https://openapi.bozedu.net/data/upload/component/ebook_main/978-7-5447-2948-2-36/1.jpg",
+//   "zem_file": "https://openapi.bozedu.net/data/upload/component/ebook_main/978-7-5447-2948-2-36.zip",
+//   "zem_brief": "",
+//   "zem_type": "图片",
+//   "zem_filesize": "62468417",
+//   "zem_open": "是",
+//   "grade_id": "0",
+//   "grade_name": "",
+//   "subject_id": "0",
+//   "subject_name": "",
+//   "zem_belongto": "个人",
+//   "area_id1": "0",
+//   "area_id2": "0",
+//   "area_id3": "0",
+//   "area_id4": "0",
+//   "sm_id": "0",
+//   "dept_id": "0",
+//   "user_id": "278795",
+//   "create_user_id": "278795",
+//   "modify_user_id": "0",
+//   "create_dateline": "1596987128",
+//   "modify_dateline": "0",
+//   "isdelete": "0",
+//   "zem_type_option_n": "图片",
+//   "zem_type_option_k": "1",
+//   "zem_open_option_n": "是",
+//   "zem_open_option_k": "1",
+//   "zem_belongto_option_n": "个人",
+//   "zem_belongto_option_k": "2"
+// }
+export const ebookList = ref<any[]>([])
+
+export function requestEbookList(d: any = {}) {
+  ebookListLoading.value = true
+  return request({
+    url: '/zhkt/ebook_main/index',
+    data: {
+      limit: 1000,
+      ...d,
+    }
+  }).then((res) => {
+    if (res.code === '1') {
+      ebookList.value = res.data.page_data
+    }
+  }).catch((error) => {
+    console.error(error)
+  }).finally(() => {
+    ebookListLoading.value = false
+  })
+}
+
+// requestEbookList()
+
+export const ebookSelectedList = ref<string[]>([])
+
+export function deleteEbook() {
+  if (inDebug) {
+    ebookList.value = ebookList.value.filter((item) => !ebookSelectedList.value.includes(item.zem_id))
+    ebookSelectedList.value = []
+    return
+  }
+
+  return request({
+    url: '/zhkt/ebook_main/delete',
+    data: {
+      zem_id: ebookSelectedList.value
+    }
+  }).then((res) => {
+    if (res.code === '1') {
+      // requestEbookList()
+      ebookList.value = ebookList.value.filter((item) => !ebookSelectedList.value.includes(item.zem_id))
+      ebookSelectedList.value = []
+    }
+  }).catch((error) => {
+    console.error(error)
+  })
+}

+ 34 - 0
src/composables/index.ts

@@ -0,0 +1,34 @@
+export const inDebug = true
+
+export function downloadFile(file: string, name?: string) {
+  window.open(file)
+  // const a = document.createElement('a')
+  // a.href = file
+  // a.download = name ?? file
+  // a.click()
+}
+
+export function getFileType(ext: string) {
+  if (['doc', 'docx'].includes(ext)) {
+    return 'doc'
+  }
+  if (['xls', 'xlsx'].includes(ext)) {
+    return 'xls'
+  }
+  if (['ppt', 'pptx'].includes(ext)) {
+    return 'ppt'
+  }
+  if (['pdf'].includes(ext)) {
+    return 'pdf'
+  }
+  if (['jpg', 'jpeg', 'png', 'gif', 'bmp'].includes(ext)) {
+    return 'image'
+  }
+  if (['mp4', 'avi', 'rmvb', 'rm', 'asf', 'divx', 'mpg', 'mpeg', 'mpe', 'wmv', 'mkv', 'vob'].includes(ext)) {
+    return 'video'
+  }
+  if (['mp3', 'wma', 'wav', 'midi', 'ape', 'flac', 'aac', 'ogg', 'm4a'].includes(ext)) {
+    return 'music'
+  }
+  return 'unknow'
+}

+ 85 - 0
src/composables/work.ts

@@ -0,0 +1,85 @@
+import request from "~/request/request"
+
+import { user } from "~/store/user"
+
+export const workDialogVisible = ref(false)
+
+export const workListLoading = ref(true)
+
+// {
+//   "zzfs_id": "79",
+//   "zzfs_keyword": "",
+//   "zzf_id": "100",
+//   "zzfs_send_user_id": "278799",
+//   "zzfs_send_user_realname": "赵秀蕊",
+//   "zzfs_receive_user_id": "278794",
+//   "zzfs_receive_user_realname": "yuejuan001",
+//   "zk_id": "0",
+//   "yj_id": "0",
+//   "area_id1": "10",
+//   "area_id2": "166",
+//   "area_id3": "2074",
+//   "area_id4": "0",
+//   "sm_id": "329",
+//   "dept_id": "0",
+//   "user_id": "0",
+//   "create_user_id": "278799",
+//   "modify_user_id": "0",
+//   "create_dateline": "1718591179",
+//   "modify_dateline": "0",
+//   "isdelete": "0",
+//   "zhkt_zpzs_files": {
+//     "zzf_id": "100",
+//     "zzf_keyword": "20240617102614.jpgjpg赵秀蕊2024-06-17 10:26:15",
+//     "zzf_name": "20240617102614.jpg",
+//     "zzf_file": "https://openapi.bozedu.net/data/upload/month_202406/202406171026151386_QE11.jpg",
+//     "zzf_ext": "jpg",
+//     "zzf_filesize": "0",
+//     "zzf_filemd5": "",
+//     "zzf_extinfo": null,
+//     "zzf_user_id": "278799",
+//     "zzf_user_realname": "赵秀蕊",
+//     "zzf_datetime": "2024-06-17 10:26:15",
+//     "zk_id": "0",
+//     "yj_id": "0",
+//     "area_id1": "10",
+//     "area_id2": "166",
+//     "area_id3": "2074",
+//     "area_id4": "0",
+//     "sm_id": "329",
+//     "dept_id": "0",
+//     "user_id": "0",
+//     "create_user_id": "278799",
+//     "modify_user_id": "0",
+//     "create_dateline": "1718591175",
+//     "modify_dateline": "0",
+//     "isdelete": "0",
+//     "subject_id": "0",
+//     "subject_name": "",
+//     "grade_id": "0",
+//     "grade_name": ""
+//   }
+// }
+export const workList = ref<any[]>([])
+
+export function requestWorkList(d: any = {}) {
+  workListLoading.value = true
+  return request({
+    url: '/zhkt/zpzs_files_send/index',
+    data: {
+      limit: 1000,
+      ...d,
+    }
+  }).then((res) => {
+    if (res.code === '1') {
+      workList.value = res.data.page_data
+    }
+  }).catch((error) => {
+    console.error(error)
+  }).finally(() => {
+    workListLoading.value = false
+  })
+}
+
+// requestworkList()
+

+ 120 - 9
src/pages/index.vue

@@ -1,9 +1,24 @@
 <script setup lang="ts" generic="T extends any, O extends any">
 import { Plus, Minus } from '@element-plus/icons-vue'
+import { ebookDialogVisible, requestEbookList, ebookSelectedList, ebookList } from '~/composables/ebook'
+import { docDialogVisible, requestDocList, docList, docSelectedList } from '~/composables/doc'
+import { workDialogVisible, requestWorkList, workList } from '~/composables/work'
+// import request from "~/request/request"
 
 
 // const router = useRouter()
 
+const yj_id = 33951
+
+// request({
+//   url: '/ybk/hdd/index',
+//   params: {
+//     yj_id
+//   }
+// }).then(res => {
+//   console.log('res : ', res)
+// })
+
 type TCollapseBar = typeof import('./src/components/collapse-bar.vue')['default']
 
 
@@ -26,11 +41,11 @@ const PenDefaultConfig = {
     lineWidth: 2,
   }
 }
-const currentBoard = ref('板')
-const currentPen = ref<keyof typeof PenDefaultConfig>('white')
+const currentBoard = ref('板')
+const currentPen = ref<keyof typeof PenDefaultConfig>('black')
 
 const PenConfig = reactive({
-  color: '#000000',
+  color: PenDefaultConfig[currentPen.value].color,
   lineWidth: 2,
   eraserLineWidth: 20,
 })
@@ -97,6 +112,10 @@ function handleBarSelect(idx: number) {
     case 2:
       timerDialogVisible.value = true
       break;
+    case 7:
+      requestWorkList()
+      workDialogVisible.value = true
+      break;
     default:
       break;
   }
@@ -167,9 +186,15 @@ function handleNavSelect(idx: number) {
   switch (idx) {
     case 0:
       boardDialogVisible.value = true
-
       break;
-
+    case 1:
+      requestEbookList()
+      ebookDialogVisible.value = true
+      break;
+    case 2:
+      requestDocList({ yj_id })
+      docDialogVisible.value = true
+      break;
     default:
       break;
   }
@@ -240,12 +265,12 @@ const BoardMap: Record<T_title, {
     image: '/mipmap/sc_board_zbx.png'
   },
   '足球场': {
-    color: 'black',
+    color: 'white',
     title: '足球场',
     image: '/mipmap/sc_board_zqc.png'
   },
   '篮球场': {
-    color: 'black',
+    color: 'white',
     title: '篮球场',
     image: '/mipmap/sc_board_lqc.png'
   }
@@ -269,10 +294,11 @@ const BoardMap: Record<T_title, {
         </div>
         <div class="text-xs tracking-wider">板擦大小</div>
       </div>
-      <collapse-item title="撤销" @click="undo" />
-      <collapse-item title="清空" @click="reset" />
+      <collapse-item title="撤销" icon="/mipmap/sc_erase_undo.png" @click="undo" />
+      <collapse-item title="清空" icon="/mipmap/sc_erase_clear.png" @click="reset" />
     </collapse-bar>
   </div>
+
   <el-dialog v-model="timerDialogVisible" title="计时器">
     <div class="flex space-x-4 items-center justify-center h-200px">
       <div v-for="i in 4" :style="{ order: i * 2 }">
@@ -288,6 +314,27 @@ const BoardMap: Record<T_title, {
     </div>
   </el-dialog>
 
+  <el-dialog v-model="workDialogVisible" fullscreen>
+    <div class="grid! grid-cols-4 gap-8 mt-2vh h-90vh overflow-y-auto pr-4">
+      <div v-for="({ zhkt_zpzs_files: { zzf_id, zzf_name, zzf_datetime, zzf_ext, zzf_file } }) in workList"
+        :value="zzf_id">
+        <div class="shadow-lg h-260px flex flex-col justify-center items-center rounded-16px overflow-hidden">
+          <div h-180px w-full @click="downloadFile(zzf_file, zzf_name)">
+            <img v-if="getFileType(zzf_ext) === 'image'" :src="zzf_file" class="w-full h-full object-cover" />
+            <img v-else-if="getFileType(zzf_ext) === 'music'" src="/mipmap/icon_workshow_music.png"
+              class="w-full h-full object-cover" />
+            <img v-if="getFileType(zzf_ext) === 'video'" src="/mipmap/icon_workshow_video.png"
+              class="w-full h-full object-cover" />
+          </div>
+          <div class="h-80px space-y-2 flex flex-col justify-evenly">
+            <div class="font-bold">{{ zzf_name }}</div>
+            <div class="text-dark-200">{{ zzf_datetime }}</div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </el-dialog>
+
   <el-dialog v-model="boardDialogVisible" fullscreen>
     <el-radio-group v-model="currentBoard" @change="updateBoardConfig" class="grid! grid-cols-4 gap-8">
       <el-radio v-for="({ color, image, title }) in Object.values(BoardMap)" :value="title">
@@ -297,8 +344,61 @@ const BoardMap: Record<T_title, {
         </div>
       </el-radio>
     </el-radio-group>
+  </el-dialog>
 
+  <el-dialog v-model="ebookDialogVisible" fullscreen>
+    <div class="flex flex-col h-92vh">
+      <el-checkbox-group v-model="ebookSelectedList"
+        class="flex-auto overflow-y-scroll grid! grid-cols-3 xl:grid-cols-4 gap-10">
+        <el-checkbox v-for="({ zem_id, zem_name, zem_img, zem_filesize, zem_file }) in ebookList" :key="zem_id"
+          :value="zem_id">
+          <div class="h-full flex flex-col justify-between h-210px">
+            <div class="flex justify-center space-x-2 h-full">
+              <img :src="zem_img" class="w-1/2 h-full" loading="lazy" />
+              <div class="flex flex-col justify-between">
+                <div class="text-wrap text-lg font-700">{{ zem_name }}</div>
+                <div class="text-end">
+                  <div>
+                    课本: {{ (parseFloat(zem_filesize) / 1024 / 1024).toFixed(1) }}MB
+                  </div>
+                  <el-button class="mt-2" @click="downloadFile(zem_file, zem_name)">下载课本</el-button>
+                </div>
+              </div>
+            </div>
+          </div>
+        </el-checkbox>
+      </el-checkbox-group>
+      <div class="px-16 pt-10 flex justify-end items-end">
+        <el-button type="danger" @click="deleteEbook" size="large">删除</el-button>
+      </div>
+    </div>
+  </el-dialog>
+
+  <el-dialog v-model="docDialogVisible" fullscreen>
+    <div class="flex flex-col h-92vh">
+      <el-checkbox-group v-model="docSelectedList"
+        class="flex-auto overflow-y-scroll grid! grid-cols-3 xl:grid-cols-4 gap-10 items-start content-start">
+        <el-checkbox v-for="({ ykz_id, ykz_title, ykz_ext, yzk_bddz_preview }) in docList" :key="ykz_id"
+          :value="ykz_id">
+          <div class="flex flex-col justify-between ">
+            <div class="flex justify-center space-x-2 h-full">
+              <img :src="`/mipmap/file_${getFileType(ykz_ext)}.png`" class="w-1/2 h-full" loading="lazy" />
+              <div class="flex flex-col justify-between">
+                <div class="text-wrap text-lg font-700">{{ ykz_title }}</div>
+                <div class="text-end">
+                  <el-button class="mt-2" @click="downloadFile(yzk_bddz_preview, ykz_title)">下载</el-button>
+                </div>
+              </div>
+            </div>
+          </div>
+        </el-checkbox>
+      </el-checkbox-group>
+      <div class="px-16 pt-10 flex justify-end items-end">
+        <el-button type="primary" @click="sendDoc" size="large">发送</el-button>
+      </div>
+    </div>
   </el-dialog>
+
 </template>
 
 <style scoped>
@@ -324,4 +424,15 @@ const BoardMap: Record<T_title, {
 :deep(.el-radio.is-checked) .radio_content {
   box-shadow: 10px 10px 20px #444444;
 }
+
+:deep(.el-checkbox) {
+  height: auto;
+  align-items: start;
+}
+
+:deep(.el-checkbox .el-checkbox__label) {
+  width: 100%;
+  height: 100%;
+  box-sizing: border-box;
+}
 </style>

+ 72 - 0
src/request/request.ts

@@ -0,0 +1,72 @@
+import axios from 'axios'
+import { ElMessage } from 'element-plus'
+
+const GLOBAL_CONFIG: any = {
+  web_pc: 'https://jltweb.bozedu.net',
+  api: 'https://uc.bozedu.net/',
+  openapi: 'https://openapi.bozedu.net',
+  uc: 'https://uc.bozedu.net/',
+  qqyxt: 'https://qqyxt.bozedu.net',
+}
+import { user } from "~/store/user"
+
+const token = user.value?.token || ''
+
+const instance = axios.create({
+  baseURL: GLOBAL_CONFIG.api,
+  timeout: 60 * 1000,
+  headers: {
+    'Content-Type': 'application/x-www-form-urlencoded',
+  },
+  method: 'post',
+})
+
+instance.interceptors.request.use(
+  async (config: any) => {
+    // console.log('config : ', config)
+    config.api = config.api || 'openapi'
+    config.baseURL = GLOBAL_CONFIG[config.api]
+    if (config.method?.toLocaleLowerCase() === 'get' || config?.data?.file) {
+      config.params = Object.assign({ token }, config.params)
+    }
+    else {
+      config.data = Object.assign(
+        {
+          token: user.value?.token,
+          client: 'web',
+          api: 'json',
+          site: 'qqyxt',
+          apptag: 'zhkt',
+          issubmit: (config.url?.endsWith('add') || config.url?.endsWith('edit')) ? '1' : undefined,
+        },
+        config.data)
+    }
+    return config
+  },
+  (error) => {
+    console.error('request error: ', error)
+    return Promise.reject(error)
+  },
+)
+instance.interceptors.response.use(
+  (response) => {
+
+    if (response.data.code === undefined)
+      return response.data
+
+    response.data.code = response.data?.code?.toString()
+    response.data.msg = response.data.msg.replaceAll(/<.*?>/g, ' ')
+    const { code, msg } = response.data
+    if (code !== '1') {
+      ElMessage.error(msg)
+      return Promise.reject(response.data)
+    }
+    return response.data
+  },
+  (error) => {
+    console.error(`response error: ${error}`)
+    return Promise.reject(error)
+  },
+)
+
+export default (config: any) => instance.request(config) as Promise<any>

+ 82 - 0
src/store/user.d.ts

@@ -0,0 +1,82 @@
+export interface User {
+  about: string
+  address: string
+  area_id1: string
+  area_id2: string
+  area_id3: string
+  area_id4: string
+  create_dateline: string
+  email_token: string
+  email_token_exptime: string
+  email_validation: string
+  gender: string
+  ischeck: string
+  isdelete: string
+  modify_dateline: string
+  openid: string
+  parent_user_id: string
+  phone_validation: string
+  qq: string
+  setting: Setting
+  /**
+   * 用户token
+   */
+  token: string
+  user_abalance: string
+  user_address: { [key: string]: any }
+  user_alipay_account: string
+  /**
+   * 用户头像
+   */
+  user_avatar: string
+  user_birthday: string
+  user_cardno: string
+  user_dcash: string
+  user_detail_id: string
+  user_dqsj: string
+  /**
+   * email
+   */
+  user_email: string
+  user_group_id: string
+  user_id: string
+  user_level: string
+  user_level_id: string
+  /**
+   * 用户名
+   */
+  user_name: string
+  /**
+   * 用户昵称
+   */
+  user_nickname: string
+  user_password: string
+  user_phone: string
+  /**
+   * 用户真实姓名
+   */
+  user_realname: string
+  user_role_id: string
+  user_score: string
+  webchatopenid: string,
+  user_role_id_ext_now: string,
+}
+
+interface Setting {
+  site_address: string
+  site_email: string
+  site_hotphone: string
+  site_icp: string
+  site_linephone: string
+  site_wx_appid: string
+  site_wx_mchid: string
+  site_wx_sp_appid: string
+  site_wx_sp_mchid: string
+  site_wxapp_appid: string
+  sitedomain: string
+  sitefavicon: string
+  sitelogo: string
+  sitename: string
+  siteqrcode: string
+  user_failedlogin_max: string
+}

+ 729 - 0
src/store/user.ts

@@ -0,0 +1,729 @@
+import type { User } from './user.d'
+
+export const user = ref<User | null>({
+  "user_id": "278794",
+  "user_name": "yuejuan001",
+  "email": "yuejuan00151841@mail.com",
+  "lastlogintime": "2024-06-27 13:23:34",
+  "mask_id": "13736363636",
+  "regdate": "2021-03-31 13:56:08",
+  "status": "0",
+  "is_guest": "2",
+  "user_role_id": "75",
+  "user_role_name": "学校教师",
+  "user_avatar": {
+      "big": "https://openapi.bozedu.net/data/upload/month_202311/202311211400415275_N7Sz.png",
+      "middle": "https://openapi.bozedu.net/data/upload/month_202311/202311211400415275_N7Sz.png",
+      "small": "https://openapi.bozedu.net/data/upload/month_202311/202311211400415275_N7Sz.png"
+  },
+  "user_no": {
+      "no_title": "工号",
+      "no": ""
+  },
+  "token": "13b5l5i_a6aWwFcJnnRxODoPw3eUdcOOzIYKUxYH4J4k_bkbLr6SwVuCEGlVlwrA1x8f26G3lYTIIKHaYDESxT1Xo6_ahU",
+  "user_realname": "教师一",
+  "user_phone": "13736363636",
+  "idcard": "",
+  "gender": "1",
+  "gender_char": "男",
+  "position": "",
+  "qq": "无",
+  "nationality": "",
+  "intro": "",
+  "address": "",
+  "education": "",
+  "dw": "博智希望小学",
+  "area_info": {
+      "area_id1": "10",
+      "area_id2": "166",
+      "area_id3": "2074",
+      "area_id4": "0",
+      "area_id1_char": "江苏省",
+      "area_id2_char": "苏州市",
+      "area_id3_char": "相城区",
+      "area_id4_char": "",
+      "area_code1": "320000000000",
+      "area_code2": "320500000000",
+      "area_code3": "320507000000",
+      "area_code4": "",
+      "area_code_dist": "320507000000"
+  },
+  "sm_info": {
+      "sm_id": "329",
+      "adminid": "215210",
+      "sm_name": "博智希望小学",
+      "is_org": "0",
+      "up_org": "0",
+      "area_id1": "10",
+      "area_id2": "166",
+      "area_id3": "2074",
+      "area_id4": "0",
+      "major_mode": "0",
+      "camp": [
+          {
+              "camp_id": "21",
+              "camp_name": "第一学院",
+              "techplace": []
+          }
+      ],
+      "powers": {
+          "vip_shiti": "0",
+          "vip_sucai": "0",
+          "vip_aicheck": "1"
+      }
+  },
+  "cm_info": [
+      {
+          "cm_id": "9757",
+          "sm_id": "329",
+          "pre": "",
+          "cm_name": "初一(21)班",
+          "grade": "7",
+          "gradeClass": "21",
+          "major_id": "",
+          "creatorid": "278794",
+          "subjectid": "0",
+          "is_manage": 1,
+          "major_name": "",
+          "grade_name": "初一",
+          "subject_name": "",
+          "sm_name": "博智希望小学",
+          "teachers": []
+      },
+      {
+          "cm_id": "9758",
+          "sm_id": "329",
+          "pre": "",
+          "cm_name": "初一(22)班",
+          "grade": "7",
+          "gradeClass": "22",
+          "major_id": "",
+          "creatorid": "278794",
+          "subjectid": "0",
+          "is_manage": 1,
+          "major_name": "",
+          "grade_name": "初一",
+          "subject_name": "",
+          "sm_name": "博智希望小学",
+          "teachers": []
+      },
+      {
+          "cm_id": "10244",
+          "sm_id": "329",
+          "pre": "师范2",
+          "cm_name": "高一(1)班",
+          "grade": "11",
+          "gradeClass": "1",
+          "major_id": "",
+          "creatorid": "285376",
+          "subjectid": "1",
+          "is_manage": 0,
+          "major_name": "",
+          "grade_name": "高一",
+          "subject_name": "语文",
+          "sm_name": "博智希望小学",
+          "teachers": []
+      },
+      {
+          "cm_id": "10733",
+          "sm_id": "329",
+          "pre": "",
+          "cm_name": "五年级(1)班",
+          "grade": "5",
+          "gradeClass": "1",
+          "major_id": "",
+          "creatorid": "278794",
+          "subjectid": "0",
+          "is_manage": 1,
+          "major_name": "",
+          "grade_name": "五年级",
+          "subject_name": "",
+          "sm_name": "博智希望小学",
+          "teachers": []
+      }
+  ],
+  "first_cm_id": "9757",
+  "first_cm_name": "初一(21)班",
+  "renke_grade": [
+      {
+          "grade": "1",
+          "subject": "1",
+          "grade_char": "一年级",
+          "subject_char": "语文"
+      },
+      {
+          "grade": "1",
+          "subject": "2",
+          "grade_char": "一年级",
+          "subject_char": "数学"
+      },
+      {
+          "grade": "1",
+          "subject": "3",
+          "grade_char": "一年级",
+          "subject_char": "外语"
+      },
+      {
+          "grade": "2",
+          "subject": "1",
+          "grade_char": "二年级",
+          "subject_char": "语文"
+      },
+      {
+          "grade": "2",
+          "subject": "2",
+          "grade_char": "二年级",
+          "subject_char": "数学"
+      },
+      {
+          "grade": "2",
+          "subject": "3",
+          "grade_char": "二年级",
+          "subject_char": "外语"
+      },
+      {
+          "grade": "3",
+          "subject": "1",
+          "grade_char": "三年级",
+          "subject_char": "语文"
+      },
+      {
+          "grade": "3",
+          "subject": "2",
+          "grade_char": "三年级",
+          "subject_char": "数学"
+      },
+      {
+          "grade": "3",
+          "subject": "3",
+          "grade_char": "三年级",
+          "subject_char": "外语"
+      },
+      {
+          "grade": "4",
+          "subject": "1",
+          "grade_char": "四年级",
+          "subject_char": "语文"
+      },
+      {
+          "grade": "4",
+          "subject": "2",
+          "grade_char": "四年级",
+          "subject_char": "数学"
+      },
+      {
+          "grade": "4",
+          "subject": "3",
+          "grade_char": "四年级",
+          "subject_char": "外语"
+      },
+      {
+          "grade": "5",
+          "subject": "1",
+          "grade_char": "五年级",
+          "subject_char": "语文"
+      },
+      {
+          "grade": "5",
+          "subject": "2",
+          "grade_char": "五年级",
+          "subject_char": "数学"
+      },
+      {
+          "grade": "5",
+          "subject": "3",
+          "grade_char": "五年级",
+          "subject_char": "外语"
+      },
+      {
+          "grade": "6",
+          "subject": "1",
+          "grade_char": "六年级",
+          "subject_char": "语文"
+      },
+      {
+          "grade": "6",
+          "subject": "2",
+          "grade_char": "六年级",
+          "subject_char": "数学"
+      },
+      {
+          "grade": "6",
+          "subject": "3",
+          "grade_char": "六年级",
+          "subject_char": "外语"
+      },
+      {
+          "grade": "7",
+          "subject": "1",
+          "grade_char": "初一",
+          "subject_char": "语文"
+      },
+      {
+          "grade": "7",
+          "subject": "2",
+          "grade_char": "初一",
+          "subject_char": "数学"
+      },
+      {
+          "grade": "7",
+          "subject": "3",
+          "grade_char": "初一",
+          "subject_char": "外语"
+      },
+      {
+          "grade": "7",
+          "subject": "4",
+          "grade_char": "初一",
+          "subject_char": "政治"
+      },
+      {
+          "grade": "7",
+          "subject": "5",
+          "grade_char": "初一",
+          "subject_char": "物理"
+      },
+      {
+          "grade": "7",
+          "subject": "7",
+          "grade_char": "初一",
+          "subject_char": "地理"
+      },
+      {
+          "grade": "7",
+          "subject": "8",
+          "grade_char": "初一",
+          "subject_char": "历史"
+      },
+      {
+          "grade": "7",
+          "subject": "9",
+          "grade_char": "初一",
+          "subject_char": "化学"
+      },
+      {
+          "grade": "7",
+          "subject": "10",
+          "grade_char": "初一",
+          "subject_char": "班会"
+      },
+      {
+          "grade": "7",
+          "subject": "18",
+          "grade_char": "初一",
+          "subject_char": "音乐"
+      },
+      {
+          "grade": "7",
+          "subject": "19",
+          "grade_char": "初一",
+          "subject_char": "美术"
+      },
+      {
+          "grade": "8",
+          "subject": "1",
+          "grade_char": "初二",
+          "subject_char": "语文"
+      },
+      {
+          "grade": "8",
+          "subject": "2",
+          "grade_char": "初二",
+          "subject_char": "数学"
+      },
+      {
+          "grade": "8",
+          "subject": "3",
+          "grade_char": "初二",
+          "subject_char": "外语"
+      },
+      {
+          "grade": "8",
+          "subject": "4",
+          "grade_char": "初二",
+          "subject_char": "政治"
+      },
+      {
+          "grade": "8",
+          "subject": "5",
+          "grade_char": "初二",
+          "subject_char": "物理"
+      },
+      {
+          "grade": "8",
+          "subject": "7",
+          "grade_char": "初二",
+          "subject_char": "地理"
+      },
+      {
+          "grade": "8",
+          "subject": "8",
+          "grade_char": "初二",
+          "subject_char": "历史"
+      },
+      {
+          "grade": "8",
+          "subject": "9",
+          "grade_char": "初二",
+          "subject_char": "化学"
+      },
+      {
+          "grade": "8",
+          "subject": "10",
+          "grade_char": "初二",
+          "subject_char": "班会"
+      },
+      {
+          "grade": "8",
+          "subject": "17",
+          "grade_char": "初二",
+          "subject_char": "思想品德"
+      },
+      {
+          "grade": "8",
+          "subject": "19",
+          "grade_char": "初二",
+          "subject_char": "美术"
+      },
+      {
+          "grade": "9",
+          "subject": "1",
+          "grade_char": "初三",
+          "subject_char": "语文"
+      },
+      {
+          "grade": "9",
+          "subject": "2",
+          "grade_char": "初三",
+          "subject_char": "数学"
+      },
+      {
+          "grade": "9",
+          "subject": "3",
+          "grade_char": "初三",
+          "subject_char": "外语"
+      },
+      {
+          "grade": "9",
+          "subject": "4",
+          "grade_char": "初三",
+          "subject_char": "政治"
+      },
+      {
+          "grade": "9",
+          "subject": "5",
+          "grade_char": "初三",
+          "subject_char": "物理"
+      },
+      {
+          "grade": "9",
+          "subject": "6",
+          "grade_char": "初三",
+          "subject_char": "生物"
+      },
+      {
+          "grade": "9",
+          "subject": "7",
+          "grade_char": "初三",
+          "subject_char": "地理"
+      },
+      {
+          "grade": "9",
+          "subject": "8",
+          "grade_char": "初三",
+          "subject_char": "历史"
+      },
+      {
+          "grade": "9",
+          "subject": "9",
+          "grade_char": "初三",
+          "subject_char": "化学"
+      },
+      {
+          "grade": "9",
+          "subject": "10",
+          "grade_char": "初三",
+          "subject_char": "班会"
+      },
+      {
+          "grade": "9",
+          "subject": "17",
+          "grade_char": "初三",
+          "subject_char": "思想品德"
+      },
+      {
+          "grade": "9",
+          "subject": "18",
+          "grade_char": "初三",
+          "subject_char": "音乐"
+      },
+      {
+          "grade": "9",
+          "subject": "19",
+          "grade_char": "初三",
+          "subject_char": "美术"
+      },
+      {
+          "grade": "11",
+          "subject": "1",
+          "grade_char": "高一",
+          "subject_char": "语文"
+      },
+      {
+          "grade": "11",
+          "subject": "2",
+          "grade_char": "高一",
+          "subject_char": "数学"
+      },
+      {
+          "grade": "11",
+          "subject": "3",
+          "grade_char": "高一",
+          "subject_char": "外语"
+      },
+      {
+          "grade": "12",
+          "subject": "1",
+          "grade_char": "高二",
+          "subject_char": "语文"
+      },
+      {
+          "grade": "12",
+          "subject": "2",
+          "grade_char": "高二",
+          "subject_char": "数学"
+      },
+      {
+          "grade": "12",
+          "subject": "3",
+          "grade_char": "高二",
+          "subject_char": "外语"
+      },
+      {
+          "grade": "13",
+          "subject": "1",
+          "grade_char": "高三",
+          "subject_char": "语文"
+      },
+      {
+          "grade": "13",
+          "subject": "2",
+          "grade_char": "高三",
+          "subject_char": "数学"
+      },
+      {
+          "grade": "13",
+          "subject": "3",
+          "grade_char": "高三",
+          "subject_char": "外语"
+      }
+  ],
+  "renke_subject": {
+      "1": {
+          "subject": "1",
+          "subject_char": "语文"
+      },
+      "2": {
+          "subject": "2",
+          "subject_char": "数学"
+      },
+      "3": {
+          "subject": "3",
+          "subject_char": "外语"
+      },
+      "4": {
+          "subject": "4",
+          "subject_char": "政治"
+      },
+      "5": {
+          "subject": "5",
+          "subject_char": "物理"
+      },
+      "6": {
+          "subject": "6",
+          "subject_char": "生物"
+      },
+      "7": {
+          "subject": "7",
+          "subject_char": "地理"
+      },
+      "8": {
+          "subject": "8",
+          "subject_char": "历史"
+      },
+      "9": {
+          "subject": "9",
+          "subject_char": "化学"
+      },
+      "10": {
+          "subject": "10",
+          "subject_char": "班会"
+      },
+      "17": {
+          "subject": "17",
+          "subject_char": "思想品德"
+      },
+      "18": {
+          "subject": "18",
+          "subject_char": "音乐"
+      },
+      "19": {
+          "subject": "19",
+          "subject_char": "美术"
+      }
+  },
+  "related_desc": "语文",
+  "bind3rd": {
+      "wechat": "1"
+  },
+  "my_org": [],
+  "org_info": {
+      "org": null,
+      "org_id": null,
+      "telephone": "",
+      "telephone_short": "",
+      "is_org": "1",
+      "up_org": null,
+      "up_org_name": null,
+      "up_org_info": {
+          "sm_id": "",
+          "sm_name": ""
+      }
+  },
+  "camp": {
+      "camp_id": "",
+      "camp_name": "",
+      "is_master": "0",
+      "techplace": []
+  },
+  "department": {
+      "is_xqadmin": "0",
+      "top_dept_id": "",
+      "top_dept_name": "",
+      "last_dept_id": "",
+      "last_dept_name": ""
+  },
+  "pan": {
+      "unit": "G",
+      "size": "500",
+      "used": "0.00",
+      "desc": "0.00%"
+  },
+  "user_ext": {
+      "ue_id": "",
+      "ue_tag": "",
+      "ue_badge": "",
+      "ue_badge_display": "",
+      "ue_xxmc": "",
+      "ue_xd": "",
+      "subject_id": "",
+      "subject_name": "",
+      "ue_wdkc": "",
+      "ue_gksl": "",
+      "ue_bgzs": "",
+      "ue_zyzsjs": "",
+      "ue_zym": "",
+      "ue_hot": "",
+      "ue_zy": "",
+      "ue_zgbh": "",
+      "ue_ryxx": "",
+      "ue_mzmc": "",
+      "ue_zzmmbh": "",
+      "ue_zzmmmc": "",
+      "ue_whcdbh": "",
+      "ue_whcdmc": "",
+      "ue_szzbbh": "",
+      "ue_szzbmc": "",
+      "ue_rdsj": "",
+      "ue_bzlxbh": "",
+      "ue_bzlxmc": "",
+      "ue_szdxzbh": "",
+      "ue_szdxzmc": "",
+      "ue_yynlbh": "",
+      "ue_yynlmc": "",
+      "ue_jzglbbh": "",
+      "ue_jzglbmc": "",
+      "ue_xlbj": "",
+      "ue_tc": "",
+      "ue_cym": "",
+      "ue_ssqybh": "",
+      "ue_ssqymc": "",
+      "ue_ssjyjbh": "",
+      "ue_ssjyjmc": "",
+      "ue_bmbh": "",
+      "ue_bmmc": "",
+      "ue_zwmc": "",
+      "grade_id": "",
+      "grade_name": "",
+      "jc_id": "",
+      "ue_jgbh": "",
+      "jc_name": "",
+      "ue_jgmc": "",
+      "ue_sfbzr": "",
+      "ue_sm_id": "",
+      "ue_mzbh": ""
+  },
+  "user_honor": [],
+  "user_working": [],
+  "user_family": [],
+  "update_center": "https://openapi.bozedu.net",
+  "base_url": {
+      "aboutus": "https://openapi.bozedu.net/aboutus",
+      "file": "https://openapi.bozedu.net",
+      "vpn": "http://openapi.bozedu.net",
+      "uc": "https://uc.bozedu.net",
+      "yzy": "https://yzy.bozedu.net",
+      "kzkt": "https://openapi.bozedu.net",
+      "openapi": "https://openapi.bozedu.net",
+      "site_zhkt_api": "http://120.26.51.195:8008",
+      "yxxt": "https://yxxt.bozedu.net"
+  },
+  "role_system": {
+      "kzkt": {
+          "code": "kzkt",
+          "name": "空中课堂",
+          "icon": "",
+          "cate": "1",
+          "type": "1",
+          "url": "https://openapi.bozedu.net"
+      },
+      "yzy": {
+          "code": "yzy",
+          "name": "作业系统",
+          "icon": "",
+          "cate": "1",
+          "type": "1",
+          "url": "https://yzy.bozedu.net"
+      },
+      "zhkt": {
+          "code": "zhkt",
+          "name": "智慧课堂",
+          "icon": "",
+          "cate": "1",
+          "type": "2",
+          "url": "http://120.26.51.195:8008/desadmin.php"
+      }
+  },
+  "product": [
+      "课堂",
+      "直播",
+      "作业"
+  ],
+  "app_url": {
+      "A119": "https://qqyxt.m.bozedu.net/page/course/tskc_more.html",
+      "A120": "https://qqyxt.m.bozedu.net/page/my/msg_hybrid.html?id=31",
+      "A121": "https://qqyxt.m.bozedu.net/page/parent/msg.html",
+      "A122": "https://qqyxt.m.bozedu.net/page/my/integral_hybrid.html",
+      "A123": "https://qqyxt.m.bozedu.net/ktfx/xqbg.html",
+      "A124": "https://qqyxt.m.bozedu.net/page/my/footPrint.html",
+      "A125": "https://qqyxt.m.bozedu.net/page/my/intergralMall.html",
+      "A126": "https://openapi.bozedu.net/component/ebook_main/public?api=html",
+      "A127": "https://qqyxt.m.bozedu.net/Course_registration/transfer.html?v=1",
+      "A128": "https://qqyxt.m.bozedu.net/Course_registration/transfer.html?type=course_after_service",
+      "A129": "https://qqyxt.m.bozedu.net/ktfx/xqbg.html?tab=1",
+      "A130": "https://qqyxt.m.bozedu.net/ktfx/xqbg.html?tab=2",
+      "A131": "https://qqyxt.m.bozedu.net/ktfx/xqbg.html?tab=3",
+      "A132": "https://qqyxt.m.bozedu.net/ktfx/xqbg.html?tab=4"
+  }
+})
+