一次提交

develoop
于鹏飞 5 months ago
commit bea2979765
  1. 8
      package.json
  2. 233
      pnpm-lock.yaml
  3. 40
      src/api/courseChaptersApi.ts
  4. 10
      src/api/user/record.js
  5. BIN
      src/assets/icons/pdf (1).png
  6. BIN
      src/assets/icons/ppt (1).png
  7. BIN
      src/assets/icons/ppt (2).png
  8. BIN
      src/assets/icons/图片 (2).png
  9. BIN
      src/assets/icons/文件.png
  10. BIN
      src/assets/icons/视频 .png
  11. BIN
      src/assets/icons/音频1.png
  12. 10
      src/config/index.js
  13. 1
      src/store/modules/type/types.ts
  14. 9
      src/store/modules/user.ts
  15. 23
      src/utils/oss.js
  16. 2
      src/utils/request.ts
  17. 146
      src/views/MyCourseStudy/learningProcess.vue
  18. 560
      src/views/course/CourseObjectives.vue
  19. 476
      src/views/course/CourseObjectives111.vue
  20. 110
      src/views/course/basicCourseInformation.vue
  21. 244
      src/views/courseResources/componse/resourceAdd.vue
  22. 133
      src/views/courseResources/courseInfo.vue
  23. 806
      src/views/courseResources/index.vue
  24. 142
      src/views/home/components/Info.vue
  25. 2
      src/views/home/index.vue
  26. 40
      vite.config.ts.timestamp-1718268044772-4deaaf3aeef01.mjs

@ -19,22 +19,24 @@
"dependencies": {
"3d-force-graph": "^1.73.3",
"@element-plus/icons-vue": "^2.3.1",
"@vueup/vue-quill": "^1.2.0",
"@vueuse/core": "^10.9.0",
"ali-oss": "^6.20.0",
"axios": "^1.6.8",
"d3": "^5.16.0",
"echarts": "^5.5.0",
"element-plus": "^2.6.0",
"jwt-decode": "^4.0.0",
"nanoid": "^5.0.7",
"echarts-liquidfill": "^3.1.0",
"element-plus": "^2.6.0",
"form-data": "^4.0.0",
"jquery": "^3.7.1",
"jwt-decode": "^4.0.0",
"nanoid": "^5.0.7",
"nprogress": "^0.2.0",
"pinia": "^2.1.7",
"three": "^0.163.0",
"vue": "^3.4.27",
"vue-echarts": "^6.7.2",
"vue-quill": "^1.5.1",
"vue-router": "^4.3.0"
},
"devDependencies": {

@ -1,5 +1,9 @@
lockfileVersion: '6.0'
settings:
autoInstallPeers: true
excludeLinksFromLockfile: false
dependencies:
3d-force-graph:
specifier: ^1.73.3
@ -7,6 +11,9 @@ dependencies:
'@element-plus/icons-vue':
specifier: ^2.3.1
version: 2.3.1(vue@3.4.29)
'@vueup/vue-quill':
specifier: ^1.2.0
version: 1.2.0(vue@3.4.29)
'@vueuse/core':
specifier: ^10.9.0
version: 10.9.0(vue@3.4.29)
@ -55,6 +62,9 @@ dependencies:
vue-echarts:
specifier: ^6.7.2
version: 6.7.3(echarts@5.5.0)(vue@3.4.29)
vue-quill:
specifier: ^1.5.1
version: 1.5.1
vue-router:
specifier: ^4.3.0
version: 4.3.0(vue@3.4.29)
@ -1235,6 +1245,16 @@ packages:
/@vue/shared@3.4.29:
resolution: {integrity: sha512-hQ2gAQcBO/CDpC82DCrinJNgOHI2v+FA7BDW4lMSPeBpQ7sRe2OLHWe5cph1s7D8DUQAwRt18dBDfJJ220APEA==}
/@vueup/vue-quill@1.2.0(vue@3.4.29):
resolution: {integrity: sha512-kd5QPSHMDpycklojPXno2Kw2JSiKMYduKYQckTm1RJoVDA557MnyUXgcuuDpry4HY/Rny9nGNcK+m3AHk94wag==}
peerDependencies:
vue: ^3.2.41
dependencies:
quill: 1.3.7
quill-delta: 4.2.2
vue: 3.4.29(typescript@5.2.2)
dev: false
/@vueuse/core@10.9.0(vue@3.4.29):
resolution: {integrity: sha512-/1vjTol8SXnx6xewDEKfS0Ra//ncg4Hb0DaZiwKf7drgfMsKFExQ+FnnENcN6efPen+1kIzhLQoGSy0eDUVOMg==}
dependencies:
@ -1595,7 +1615,6 @@ packages:
/boolbase@1.0.0:
resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
dev: true
/bowser@1.9.4:
resolution: {integrity: sha512-9IdMmj2KjigRq6oWhmwv1W36pDuA4STQZ8q6YO9um+x07xgYNCD3Oou+WP/3L1HNz7iqythGet3/p4wvc8AAwQ==}
@ -1726,6 +1745,17 @@ packages:
supports-color: 7.2.0
dev: true
/cheerio@0.19.0:
resolution: {integrity: sha512-Fwcm3zkR37STnPC8FepSHeSYJM5Rd596TZOcfDUdojR4Q735aK1Xn+M+ISagNneuCwMjK28w4kX+ETILGNT/UQ==}
engines: {node: '>= 0.6'}
dependencies:
css-select: 1.0.0
dom-serializer: 0.1.1
entities: 1.1.2
htmlparser2: 3.8.3
lodash: 3.10.1
dev: false
/chokidar@3.6.0:
resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
engines: {node: '>= 8.10.0'}
@ -1754,7 +1784,6 @@ packages:
/clone@2.1.2:
resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==}
engines: {node: '>=0.8'}
dev: true
/collection-visit@1.0.0:
resolution: {integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==}
@ -1889,6 +1918,15 @@ packages:
engines: {node: '>=12 || >=16'}
dev: true
/css-select@1.0.0:
resolution: {integrity: sha512-/xPlD7betkfd7ChGkLGGWx5HWyiHDOSn7aACLzdH0nwucPvB0EAm8hMBm7Xn7vGfAeRRN7KZ8wumGm8NoNcMRw==}
dependencies:
boolbase: 1.0.0
css-what: 1.0.0
domutils: 1.4.3
nth-check: 1.0.2
dev: false
/css-select@4.3.0:
resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==}
dependencies:
@ -1915,6 +1953,10 @@ packages:
source-map-js: 1.0.2
dev: true
/css-what@1.0.0:
resolution: {integrity: sha512-60SUMPBreXrLXgvpM8kYpO0AOyMRhdRlXFX5BMQbZq1SIJCyNE56nqFQhmvREQdUJpedbGRYZ5wOyq3/F6q5Zw==}
dev: false
/css-what@6.1.0:
resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==}
engines: {node: '>= 6'}
@ -2300,6 +2342,18 @@ packages:
engines: {node: '>=0.10'}
dev: true
/deep-equal@1.1.2:
resolution: {integrity: sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==}
engines: {node: '>= 0.4'}
dependencies:
is-arguments: 1.1.1
is-date-object: 1.0.5
is-regex: 1.1.4
object-is: 1.1.6
object-keys: 1.1.1
regexp.prototype.flags: 1.5.2
dev: false
/deep-is@0.1.4:
resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
dev: true
@ -2326,7 +2380,6 @@ packages:
define-data-property: 1.1.4
has-property-descriptors: 1.0.2
object-keys: 1.1.1
dev: true
/define-property@0.2.5:
resolution: {integrity: sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==}
@ -2386,12 +2439,18 @@ packages:
esutils: 2.0.3
dev: true
/dom-serializer@0.1.1:
resolution: {integrity: sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==}
dependencies:
domelementtype: 1.3.1
entities: 1.1.2
dev: false
/dom-serializer@0.2.2:
resolution: {integrity: sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==}
dependencies:
domelementtype: 2.3.0
entities: 2.2.0
dev: true
/dom-serializer@1.4.1:
resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==}
@ -2411,11 +2470,15 @@ packages:
/domelementtype@1.3.1:
resolution: {integrity: sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==}
dev: true
/domelementtype@2.3.0:
resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==}
dev: true
/domhandler@2.3.0:
resolution: {integrity: sha512-q9bUwjfp7Eif8jWxxxPSykdRZAb6GkguBGSgvvCrhI9wB71W2K/Kvv4E61CF/mcCfnVJDeDWx/Vb/uAqbDj6UQ==}
dependencies:
domelementtype: 1.3.1
dev: false
/domhandler@2.4.2:
resolution: {integrity: sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==}
@ -2437,6 +2500,19 @@ packages:
domelementtype: 2.3.0
dev: true
/domutils@1.4.3:
resolution: {integrity: sha512-ZkVgS/PpxjyJMb+S2iVHHEZjVnOUtjGp0/zstqKGTE9lrZtNHlNQmLwP/lhLMEApYbzc08BKMx9IFpKhaSbW1w==}
dependencies:
domelementtype: 1.3.1
dev: false
/domutils@1.5.1:
resolution: {integrity: sha512-gSu5Oi/I+3wDENBsOWBiRK1eoGxcywYSqg3rR960/+EfY0CF4EX1VPkgHOZ3WiS/Jg2DtliF6BhWcHlfpYUcGw==}
dependencies:
dom-serializer: 0.2.2
domelementtype: 1.3.1
dev: false
/domutils@1.7.0:
resolution: {integrity: sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==}
dependencies:
@ -2532,13 +2608,15 @@ packages:
engines: {node: '>= 0.11.14'}
dev: false
/entities@1.0.0:
resolution: {integrity: sha512-LbLqfXgJMmy81t+7c14mnulFHJ170cM6E+0vMXR9k/ZiZwgX8i5pNgjTCX3SO4VeUsFLV+8InixoretwU+MjBQ==}
dev: false
/entities@1.1.2:
resolution: {integrity: sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==}
dev: true
/entities@2.2.0:
resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==}
dev: true
/entities@4.5.0:
resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
@ -2968,6 +3046,10 @@ packages:
engines: {node: '>= 0.6'}
dev: true
/eventemitter3@2.0.3:
resolution: {integrity: sha512-jLN68Dx5kyFHaePoXWPsCGW5qdyZQtLYHkxkg02/Mz6g0kYpDx4FyP6XfArhQdlOC4b8Mv+EMxPo/8La7Tzghg==}
dev: false
/expand-brackets@2.1.4:
resolution: {integrity: sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==}
engines: {node: '>=0.10.0'}
@ -2997,6 +3079,10 @@ packages:
is-extendable: 1.0.1
dev: true
/extend@3.0.2:
resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
dev: false
/extglob@2.0.4:
resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==}
engines: {node: '>=0.10.0'}
@ -3017,6 +3103,14 @@ packages:
resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
dev: true
/fast-diff@1.1.2:
resolution: {integrity: sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig==}
dev: false
/fast-diff@1.2.0:
resolution: {integrity: sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==}
dev: false
/fast-diff@1.3.0:
resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==}
dev: true
@ -3208,7 +3302,6 @@ packages:
/functions-have-names@1.2.3:
resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==}
dev: true
/gensync@1.0.0-beta.2:
resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
@ -3376,7 +3469,6 @@ packages:
engines: {node: '>= 0.4'}
dependencies:
has-symbols: 1.0.3
dev: true
/has-value@0.3.1:
resolution: {integrity: sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==}
@ -3436,6 +3528,16 @@ packages:
readable-stream: 3.6.2
dev: true
/htmlparser2@3.8.3:
resolution: {integrity: sha512-hBxEg3CYXe+rPIua8ETe7tmG3XDn9B0edOE/e9wH2nLczxzgdu0m0aNHY+5wFZiviLWLdANPJTssa92dMcXQ5Q==}
dependencies:
domelementtype: 1.3.1
domhandler: 2.3.0
domutils: 1.5.1
entities: 1.0.0
readable-stream: 1.1.14
dev: false
/htmlparser2@8.0.2:
resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==}
dependencies:
@ -3530,6 +3632,14 @@ packages:
hasown: 2.0.1
dev: true
/is-arguments@1.1.1:
resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==}
engines: {node: '>= 0.4'}
dependencies:
call-bind: 1.0.7
has-tostringtag: 1.0.2
dev: false
/is-array-buffer@3.0.4:
resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==}
engines: {node: '>= 0.4'}
@ -3594,7 +3704,6 @@ packages:
engines: {node: '>= 0.4'}
dependencies:
has-tostringtag: 1.0.2
dev: true
/is-descriptor@0.1.7:
resolution: {integrity: sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==}
@ -3692,7 +3801,6 @@ packages:
dependencies:
call-bind: 1.0.7
has-tostringtag: 1.0.2
dev: true
/is-shared-array-buffer@1.0.3:
resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==}
@ -3741,6 +3849,10 @@ packages:
engines: {node: '>=0.10.0'}
dev: true
/isarray@0.0.1:
resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==}
dev: false
/isarray@1.0.0:
resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==}
@ -3936,6 +4048,18 @@ packages:
lodash-es: 4.17.21
dev: false
/lodash.clonedeep@4.5.0:
resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==}
dev: false
/lodash.defaultsdeep@4.6.1:
resolution: {integrity: sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==}
dev: false
/lodash.isequal@4.5.0:
resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==}
dev: false
/lodash.merge@4.6.2:
resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
dev: true
@ -3944,6 +4068,10 @@ packages:
resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==}
dev: true
/lodash@3.10.1:
resolution: {integrity: sha512-9mDDwqVIma6OZX79ZlDACZl8sBm0TEnkf99zV3iMA4GzkIT/9hiqP5mY0HoT1iNLCrKc/R1HByV+yJfRWVJryQ==}
dev: false
/lodash@4.17.21:
resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
@ -4203,6 +4331,12 @@ packages:
resolution: {integrity: sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==}
dev: false
/nth-check@1.0.2:
resolution: {integrity: sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==}
dependencies:
boolbase: 1.0.0
dev: false
/nth-check@2.1.1:
resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
dependencies:
@ -4225,10 +4359,17 @@ packages:
/object-inspect@1.13.1:
resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==}
/object-is@1.1.6:
resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==}
engines: {node: '>= 0.4'}
dependencies:
call-bind: 1.0.7
define-properties: 1.2.1
dev: false
/object-keys@1.1.1:
resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
engines: {node: '>= 0.4'}
dev: true
/object-visit@1.0.1:
resolution: {integrity: sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==}
@ -4337,6 +4478,10 @@ packages:
p-limit: 3.1.0
dev: true
/parchment@1.1.4:
resolution: {integrity: sha512-J5FBQt/pM2inLzg4hEWmzQx/8h8D0CiDxaG3vyp9rKrQRSDgBlhjdP5jQGgosEajXPSQouXGHOmVdgo7QmJuOg==}
dev: false
/parent-module@1.0.1:
resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
engines: {node: '>=6'}
@ -4652,6 +4797,50 @@ packages:
resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
dev: true
/quill-delta@3.6.3:
resolution: {integrity: sha512-wdIGBlcX13tCHOXGMVnnTVFtGRLoP0imqxM696fIPwIf5ODIYUHIvHbZcyvGlZFiFhK5XzDC2lpjbxRhnM05Tg==}
engines: {node: '>=0.10'}
dependencies:
deep-equal: 1.1.2
extend: 3.0.2
fast-diff: 1.1.2
dev: false
/quill-delta@4.2.2:
resolution: {integrity: sha512-qjbn82b/yJzOjstBgkhtBjN2TNK+ZHP/BgUQO+j6bRhWQQdmj2lH6hXG7+nwwLF41Xgn//7/83lxs9n2BkTtTg==}
dependencies:
fast-diff: 1.2.0
lodash.clonedeep: 4.5.0
lodash.isequal: 4.5.0
dev: false
/quill-render@1.0.5:
resolution: {integrity: sha512-PJaOQXaYbVD9GCwR5fVz3S/OuarbNbvzfNu9EZK745qMpyWUAAbt9YUEY+cWWPwVwVIJ00XVJpQQl+xLA1gFEQ==}
dependencies:
cheerio: 0.19.0
escape-html: 1.0.3
dev: false
/quill@1.3.7:
resolution: {integrity: sha512-hG/DVzh/TiknWtE6QmWAF/pxoZKYxfe3J/d/+ShUWkDvvkZQVTPeVmUJVu1uE6DDooC4fWTiCLh84ul89oNz5g==}
dependencies:
clone: 2.1.2
deep-equal: 1.1.2
eventemitter3: 2.0.3
extend: 3.0.2
parchment: 1.1.4
quill-delta: 3.6.3
dev: false
/readable-stream@1.1.14:
resolution: {integrity: sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==}
dependencies:
core-util-is: 1.0.3
inherits: 2.0.4
isarray: 0.0.1
string_decoder: 0.10.31
dev: false
/readable-stream@2.3.8:
resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==}
dependencies:
@ -4700,7 +4889,6 @@ packages:
define-properties: 1.2.1
es-errors: 1.3.0
set-function-name: 2.0.2
dev: true
/regexpp@3.2.0:
resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==}
@ -4919,7 +5107,6 @@ packages:
es-errors: 1.3.0
functions-have-names: 1.2.3
has-property-descriptors: 1.0.2
dev: true
/set-value@2.0.1:
resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==}
@ -5116,6 +5303,10 @@ packages:
es-abstract: 1.22.5
dev: true
/string_decoder@0.10.31:
resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==}
dev: false
/string_decoder@1.1.1:
resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==}
dependencies:
@ -5899,6 +6090,14 @@ packages:
- supports-color
dev: true
/vue-quill@1.5.1:
resolution: {integrity: sha512-4U3pMsBy2Vc4SSanZ6l1hzuB+m6vN9IERZzzOp+U2ziIcA6uGJYoxONmdPJkrMbcHpYYNrATqZOlWBuXqti30w==}
dependencies:
lodash.defaultsdeep: 4.6.1
quill: 1.3.7
quill-render: 1.0.5
dev: false
/vue-router@4.3.0(vue@3.4.29):
resolution: {integrity: sha512-dqUcs8tUeG+ssgWhcPbjHvazML16Oga5w34uCUmsk7i0BcnskoLGwjpa15fqMr2Fa5JgVBrdL2MEgqz6XZ/6IQ==}
peerDependencies:
@ -6037,7 +6236,3 @@ packages:
dependencies:
tslib: 2.3.0
dev: false
settings:
autoInstallPeers: true
excludeLinksFromLockfile: false

@ -66,4 +66,42 @@ export function getOrogramObjectiveApi() {
setTimeout(() => resolve(data), 500 * Math.random())
})
}
// 获取课程列表
export const getCourseList = (params:any) => {
return request({
url: '/course_objectives/list/' + params.id,
params
})
}
// 添加分目标
export const addCourse = (data:any) => {
return request({
url:'/objective_contents/addcontent',
method:"POST",
data
})
}
// 编辑目标
export const editCourse = (data: any) => {
return request({
url: '/objective_contents/update',
method: "PUT",
data
})
}
//删除课程目标
export const deleteCourse = (params: any) => {
return request({
url: '/objective_contents/' + params.id,
method: "DELETE",
})
}
// /objective_contents/
// 获取详情
export const getCourseInfo = (params: any) => {
return request({
url: '/objective_contents/' + params.id,
method: "get",
params
})
}

@ -1,10 +0,0 @@
import request from '@/utils/request'
//获取浏览记录列表
export const getRecordListService = (params) =>
request.get('http://39.106.16.162:8080/learningrecords/getall', { params })
//删除浏览记录
export function DelRecordService(ids) {
return request.delete(
`http://39.106.16.162:8080/learningrecords/delete?ids=${ids}`,
)
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

@ -0,0 +1,10 @@
import OSS from 'ali-oss'
export const client = new OSS({
bucket: 'wenyu132', //bucket名称
region: 'oss-cn-beijing', //区域
endpoint: 'oss-cn-beijing.aliyuncs.com', //地域节点==>外网访问
accessKeyId: 'LTAI5tPe9x46aWZt8FScytst', //访问键id
accessKeySecret: '0mfxSLzmRgtHMXpD5pCBTl9RfwbmDG', //访问密钥
secure: true, //http就是false,https就是true
})

@ -6,4 +6,5 @@ export interface LoginStoreType {
avatar: string // 用户头像
routes: string
phone: string
userInfo: object
}

@ -18,6 +18,7 @@ import {
userLoginService,
userGetInfoService,
userPhoneLoginService,
userIdenService,
} from '@/api/user/user.js'
const useUserStore = defineStore(
@ -30,6 +31,7 @@ const useUserStore = defineStore(
userName: '', // 用户姓名
avatar: '', // 用户头像
routes: '',
userInfo: {}, // 当前用户相关信息
}
},
actions: {
@ -47,6 +49,7 @@ const useUserStore = defineStore(
this.token = res.data.token as string
SET_TKOEN('TOKEN', this.token)
// localStorage.setItem('TOKEN', this.token)
ElNotification({
type: 'success',
message: '登录成功!',
@ -89,7 +92,11 @@ const useUserStore = defineStore(
async getUserInfo() {
const result = await userGetInfoService(GET_TKOEN('TOKEN'))
if (result.code === 200) {
// console.log(result)
const res = await userIdenService(result.data.id)
this.userInfo = res.data
console.log(this.userInfo, 'this.userInfo')
console.log(result, '123')
this.userName = result.data.username
// this.avatar = result.data.checkUser.avatar
this.routes = result.data.menus.map((item) => {

@ -0,0 +1,23 @@
import { client } from '@/config/index.js'
import { nanoid } from 'nanoid' //随机函数
const tool = {
oss: {
async upload(file) {
// 文件名
const uuid = nanoid()
// 文件后缀名
const index = file.name.lastIndexOf('.')
const suffix = file.name.substring(index + 1)
//完整路径
let fileName = 'wenyu/' + uuid + '.' + suffix
return await client.multipartUpload(fileName, file, {
progress: function (p) {
console.log('进度', p)
},
})
},
},
}
export default tool

@ -11,7 +11,7 @@ const request = axios.create({
request.interceptors.request.use((config) => {
const userStore = useUserStore()
// 设置请求头设置token
config.headers.token = userStore.token
config.headers.Authorization = `Bearer ${userStore.token}`
return config
})
//响应拦截器

@ -1,10 +1,11 @@
<script setup>
// import router from '@/router'
import { ref } from 'vue'
import { getRecordListService, DelRecordService } from '@/api/user/record.js'
import { ElMessageBox, ElMessage } from 'element-plus'
import { useRouter } from 'vue-router'
//
import { LearningRecordsControllerService } from '../../../generated/services/LearningRecordsControllerService'
const total = ref(0)
const recordList = ref([])
const selectedIds = ref([])
@ -18,8 +19,15 @@ const params = ref({
//
const getrecordList = async () => {
//console.log(1111111)
loading.value = true
const res = await getRecordListService(params.value)
// const res = await getRecordListService(params.value)
const res = await LearningRecordsControllerService.getAllUsingGet3(
params.value.userId,
params.value.pagenum,
params.value.pagesize,
)
recordList.value = res.data.records
console.log(res)
//
@ -49,11 +57,22 @@ const onDeleteRecord = async (ids) => {
confirmButtonText: '确认',
cancelButtonText: '取消',
})
await DelRecordService(ids)
//await DelRecordService(ids)
console.log('hello')
await LearningRecordsControllerService.deleteRecordsUsingDelete3(ids)
// console.log(ids)
ElMessage({ type: 'success', message: '删除成功' })
getrecordList()
}
//
const toggleCheckbox = () => {
showCheckbox.value = !showCheckbox.value
if (showCheckbox.value) {
showCheckbox.value = []
}
}
//
// change toggleSelection
// id selectedIds
@ -84,7 +103,9 @@ const deleteSelected = async () => {
})
//
await DelRecordService(selectedIds.value)
await LearningRecordsControllerService.deleteRecordsUsingDelete3(
selectedIds.value,
)
.then(() => {
recordList.value = recordList.value.filter(
(item) => !selectedIds.value.includes(item.id),
@ -103,6 +124,7 @@ const goToAnotherPage = (address) => {
//console.log(address)
router.push(address)
}
//
</script>
<template>
@ -133,38 +155,46 @@ const goToAnotherPage = (address) => {
<ul v-if="recordList.length > 0">
<li v-for="record in recordList" :key="record.id" v-loading="loading">
<input
style="display: flex"
type="checkbox"
:value="record.id"
@change="toggleSelection(record.id)"
v-if="showCheckbox"
/>
<div class="right">
<div class="video">
<img
:src="record.content"
style="width: 100%"
height="100%"
@click="goToAnotherPage(record.address)"
/>
</div>
<div class="info">
<div class="tv">
<div class="name">
{{ record.coursesName }}
</div>
<el-icon
style="float: right"
@click="onDeleteRecord(record.id)"
>
<Delete />
</el-icon>
</div>
<div class="tv">
<div class="time">{{ record.time }}</div>
<div class="views">{{ record.number }} 观看次数</div>
</div>
</div>
<img
class="img"
:src="record.content"
@click="goToAnotherPage(record.address)"
style="margin-bottom: 10px"
/>
<div
style="
display: flex;
justify-content: space-between;
flex-grow: 1;
margin-top: 10px;
margin-bottom: 10px;
"
>
<p>
{{ record.coursesName }}
</p>
<el-icon @click="onDeleteRecord(record.id)">
<Delete />
</el-icon>
</div>
<div
style="
display: flex;
justify-content: space-between;
flex-grow: 1;
margin-top: 10px;
"
>
<p>{{ record.time }}</p>
<p>{{ record.number }} 观看次数</p>
</div>
</li>
</ul>
@ -189,10 +219,6 @@ const goToAnotherPage = (address) => {
</template>
<style scoped>
.right {
float: right;
}
.record {
display: flex;
flex-direction: column;
@ -212,58 +238,34 @@ const goToAnotherPage = (address) => {
margin: 10px 0;
}
ul {
/* flex-wrap: wrap; */
/* margin-bottom: 10px; */
list-style-type: none;
padding: 10;
display: flex;
flex-wrap: wrap;
/* justify-content: space-evenly; */
justify-content: start;
}
li {
/* margin-bottom: 30px; */
transition: filter 0.3s; /* 添加过渡动画 */
flex: 0 0 20%;
/* width: 18%; */
margin-bottom: 10px;
/* flex: 1 0 20%; */
width: calc(20% - 20px);
flex-direction: column;
align-items: center;
text-align: center;
/* margin: 0 15px; */
padding: 10px;
box-sizing: border-box;
/* border: 1px solid #ccc; */
/* border-radius: 4px; */
/* text-align: center; */
transition: box-shadow 0.3s;
cursor: pointer;
}
li:hover {
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.2);
}
.video {
width: 100%;
height: 150px;
background-color: #d7e8f2;
}
.info {
display: flex;
/* overflow: hidden; */
flex-direction: column;
}
.name {
float: left;
margin: 5px;
font-size: 15px;
}
.tv {
/* display: grid */
margin: 5px;
font-size: 10px;
display: flex;
justify-content: space-between;
align-items: center;
}
.time {
float: left;
}
.views {
float: right;
.img {
display: block;
width: 250px;
height: 250px;
}
</style>

@ -1,121 +1,475 @@
<script lang="ts" setup>
import {} from 'vue'
// import allclass from '@/assets/images/allclass.png'
<script setup>
import { ref, onMounted } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
import { id } from 'element-plus/es/locales.mjs'
import * as echarts from 'echarts'
import { useRoute } from 'vue-router'
import { getCourseList, addCourse, editCourse, deleteCourse, getCourseInfo } from '@/api/courseChaptersApi'
const route = useRoute()
// id id
// targetId
const targetList = ref([
{
label: '课程目标一',
id: 1,
disabled: false,
},
{
label: '课程目标二',
disabled: false,
id: 2,
},
{
label: '课程目标三',
id: 3,
disabled: false,
},
])
const formData = ref({
description: '',
})
const activeIndex = ref(0)
const addBook = (id) => {
activeIndex.value = id
dialogVisible.value = true
flog.value = false
// updateDisabledStatus()
}
const text = ref('我是后台获取的值')
const textChange = (val) => {
console.log(text.value)
}
//
const dialogVisible = ref(false)
//
const handleClose = () => {
dialogVisible.value = false
}
//
const submit = async () => {
if (flog.value) {
await editCourse({ id: activeIndex.value, content: formData.value.description })
} else {
await addCourse({ objectiveId: activeIndex.value, content: formData.value.description })
}
getList()
dialogVisible.value = false
formData.value.description = ''
activeIndex.value = ''
// //
// if (flog.value) {
// console.log('', formData.value.target)
// //
// const index = booksList.value.findIndex(
// (item) => formData.value.id == item.id,
// )
// console.log(index, 'index')
// console.log(booksList.value[index])
// booksList.value[index].id = formData.value.id
// booksList.value[index].targetId = formData.value.target
// booksList.value[index].introduce = formData.value.description
// close()
// } else {
// courseList.value[activeIndex.value].booklist.push({
// id: booksList.value.length + 1,
// targetId: formData.value.target,
// introduce: formData.value.description,
// })
// close()
// flog.value = false
}
const close = () => {
formData.value = {
id: null,
target: '',
description: '',
}
dialogVisible.value = false
}
//
const filterTarger = (target) => {
const res = targetList.value.find((item) => {
if (item.id === target) {
console.log(item)
return item
}
})
return res.label
}
//
const flog = ref(false)
const editBook = async (obj) => {
const res = await getCourseInfo({ id: obj.id })
flog.value = true
console.log(obj)
activeIndex.value = res.data.id
// formData.value.id = obj.id
// formData.value.target = obj.targetId
formData.value.description = res.data.content
dialogVisible.value = true
}
const del = async (obj) => {
await ElMessageBox.confirm('你确认要删除该课程目标吗', '温馨提示', {
type: 'warning',
confirmButtonText: '确认',
cancelButtonText: '取消'
})
await deleteCourse({ id: obj.id })
ElMessage.success('删除成功')
getList()
// console.log(id);
// activeIndex.value = id
// courseList.booksList.value = booksList.value.filter((item) => item.id !== id)
}
// const disableChange = (id) => {
// const index = booksList.value.findIndex((item,index) => item.id === id)
// console.log(index);
// if(index){
// targetList.value[index].disabled = false
// }
// }
// targetList disabled
const getList = async () => {
const res = await getCourseList({ id: courseId.value })
data.value = res.data[0]
text.value = res.data[0].name
}
const data = ref({})
const courseId = ref(0)
onMounted(async () => {
courseId.value = route.query.id
console.log(courseId.value);
getList()
console.log(data.value);
let chartDom = document.getElementById('main')
let myChart = echarts.init(chartDom)
let option
option = {
title: {
text: '分目标',
},
legend: {
data: ['Allocated Budget', 'Actual Spending'],
},
radar: {
// shape: 'circle',
indicator: [
{ name: 'Sales', max: 6500 },
{ name: 'Administration', max: 16000 },
{ name: 'Information Technology', max: 30000 },
{ name: 'Customer Support', max: 38000 },
{ name: 'Development', max: 52000 },
{ name: 'Marketing', max: 25000 },
],
},
series: [
{
name: 'Budget vs spending',
type: 'radar',
data: [
{
value: [4200, 3000, 20000, 35000, 50000, 18000],
name: 'Allocated Budget',
},
{
value: [5000, 14000, 28000, 26000, 42000, 21000],
name: 'Actual Spending',
},
],
},
],
}
option && myChart.setOption(option)
})
</script>
<template>
<el-row :gutter="20">
<el-col :span="8">
<div class="grid-content main">
<div class="title"><p>|&nbsp;&nbsp;课程总目标</p></div>
<div class="ac_content">
<div class="ma_content">
通过本课程的学习使学生进一步了解计算机的工作原理更好地理解和应用计算机
握用计算机处理问题的方法和技能:培养学生分析问题解决问题的能力以及编制程序实现算
法的能力
</div>
<div class="container">
<div class="leftContent">
<div class="topContent">
<div class="title">| 课程总目标</div>
<div class="content1">
<textarea class="textarea" @change="textChange" v-model="text">文本内容</textarea>
</div>
</div>
<div class="grid-content picture">
<div class="title"><p>|&nbsp;&nbsp;课程总目标</p></div>
<div class="ac_pic"></div>
<div class="footContent">
<div class="title">| 分目标雷达图</div>
<div class="content3">
<div id="main"></div>
</div>
</div>
</div>
<div class="rightContent">
<div class="title" style="
width: 100%;
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 20px;
height: 60px;">
<div class="left2">| 课程分目标</div>
<div class="right2">
<!-- <el-button type="primary" @click="addBook">新增</el-button> -->
</div>
</div>
</el-col>
<el-col :span="16">
<div class="grid-content object">
<div class="title"><p>|&nbsp;&nbsp;课程分目标</p></div>
<div class="slice"></div>
<div class="content2">
<el-scrollbar height="600px">
<ul class="objectLi">
<li v-for="(item, index) in data.courseObjectivesTrees" :key="item.id">
<div class="courseObject">
<!-- {{ filterTarger(item.targetId) }} -->
<div class="courseObject1">{{ item.name }}</div>
<div class="courseObject2">
<!-- <el-button class="edit" type="text" @click="editBook(item)">
编辑
</el-button> -->
<el-button type="primary" @click="addBook(item.id)">新增</el-button>
</div>
</div>
<div class="smallContent">
<el-scrollbar height="250px">
<ul class="small">
<li v-for="(obj, i) in item.contents" :key="obj.id">
<div class="partObject">
<div class="partObject1">
<!-- {{ item.content }} -->
<!-- {{ item.introduce }} -->
课程目标{{ i + 1 }}
<!-- {{ filterTarger(obj.targetId) }} -->
</div>
<div class="partObject2">
<el-button class="edit" type="text" @click="editBook(obj)">
编辑
</el-button>
<el-button class="destroy" type="text" @click="del(obj)">
删除
</el-button>
</div>
</div>
<div class="partObjectIntroduce">
{{ obj.content }}
</div>
</li>
</ul>
</el-scrollbar>
</div>
</li>
</ul>
</el-scrollbar>
</div>
</el-col>
</el-row>
</div>
</div>
<el-dialog v-if="dialogVisible" v-model="dialogVisible" :title="flog ? '编辑' : '新增'" width="500"
:before-close="handleClose">
<el-form :model="formData" label-width="auto" style="max-width: 600px">
<!-- <el-form-item label="目标" prop="target">
<el-select v-model="formData.target" placeholder="Select" size="large" style="width: 240px">
<el-option v-for="item in targetList" :key="item.id" :label="item.label" :value="item.id"
:disabled="item.disabled" />
</el-select>
</el-form-item> -->
<el-form-item label="内容" prop="description">
<el-input v-model="formData.description" placeholder="请输入内容"></el-input>
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button @click="close">取消</el-button>
<el-button type="primary" @click="submit">确定</el-button>
</div>
</template>
</el-dialog>
</template>
<!-- <script setup>
import {ref} 'vue'
const li
</script> -->
<style scoped>
.el-row {
margin-bottom: 20px;
}
.el-col {
border-radius: 4px;
}
.bg-purple {
background: #d3dce6;
}
.bg-purple-light {
background: #e5e9f2;
<style lang="scss" scoped>
#main {
padding: 15px;
width: 100%;
height: 100%;
}
.grid-content {
border-radius: 4px;
.container {
display: flex;
flex-direction: column;
flex-direction: row;
flex-wrap: nowrap;
width: 100%;
padding: 0 10px 0 10px;
justify-content: space-around;
}
.ac_content {
background: linear-gradient(180deg, #c7e3ff 0%, #ffffff 100%);
border-radius: 29px 29px 29px 29px;
display: flex;
align-items: center;
justify-content: center;
height: 206px;
}
.ma_content {
height: 160px;
font-family: Inter, Inter;
font-weight: 400;
font-size: 16px;
color: #333333;
line-height: 20px;
text-align: left;
font-style: normal;
text-transform: none;
margin-left: 33px;
margin-right: 33px;
}
.ac_pic {
height: 488px;
background: linear-gradient(180deg, #ffe9c7 0%, #ffffff 100%);
border-radius: 29px 29px 29px 29px;
}
img {
order: -1;
}
.object {
height: 857px;
background: linear-gradient(180deg, #4984ff 0%, #74deff 100%);
border-radius: 29px 29px 29px 29px;
}
.slice {
height: 791px;
background: linear-gradient(180deg, #c7e3ff 0%, #ffffff 100%);
border-radius: 29px 29px 29px 29px;
}
.picture {
height: 553px;
margin-top: 28px;
border-radius: 29px 29px 29px 29px;
background-image: linear-gradient(to right, #f9e397, #ffa674);
}
.main {
height: 272px;
border-radius: 29px 29px 29px 29px;
.leftContent {
width: 450px;
height: 730px;
margin: 10px;
.topContent {
border-radius: 20px 20px 0 0px;
height: 280px;
background-color: #74deff;
margin-button: 5px;
background-image: linear-gradient(to right, #4984ff, #74deff);
}
.footContent {
border-radius: 20px;
margin-top: 20px;
height: 430px;
background-color: #ffa674;
background-image: linear-gradient(to right, #f9e397, #ffa674);
}
}
.rightContent {
margin: 10px;
width: 950px;
height: 730px;
background-image: linear-gradient(to right, #4984ff, #74deff);
display: flex;
justify-content: end;
border-radius: 20px;
}
.title {
flex: 1;
display: flex;
align-items: center;
}
p {
height: 29px;
font-family: Inter, Inter;
font-weight: bold;
margin-left: 34px;
padding-left: 30px;
font-size: 24px;
color: #ffffff;
line-height: 28px;
text-align: left;
font-style: normal;
text-transform: none;
font-weight: 600;
color: #fff;
height: 40px;
line-height: 40px;
padding-top: 10px;
}
.content1 {
border-radius: 20px 20px 0 0px;
margin-top: 20px;
width: 100%;
height: 220px;
background-color: #fff;
background-image: linear-gradient(#c7e3ff, #ffffff);
.textarea {
width: 100%;
border: none;
background: transparent;
padding: 20px;
height: 215px;
}
p {
padding: 30px;
font-size: 16px;
}
}
.content2 {
border-radius: 20px;
padding: 10px;
width: 100%;
height: 670px;
background-color: #fff;
background-image: linear-gradient(#c7e3ff, #ffffff);
.objectLi>li {
width: 845px;
height: 250px;
// margin: 40px;
// background-color: #ffffff;
border-radius: 5px;
margin: 20px;
.courseObject {
height: 45px;
line-height: 40px;
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 20px;
border-bottom: 1px solid #e7e7e7;
.courseObject1 {
height: 30px;
line-height: 30px;
font-size: 14px;
background-color: #6093ff;
padding: 0px 16px;
color: #fff;
}
.courseObject2 {
font-size: 14px;
color: #0052d9;
}
}
}
// overflow-y: auto
.smallContent {
// border-radius: 20px;
padding: 10px;
width: 100%;
height: 200px;
background-color: #fff;
background-image: linear-gradient(#c7e3ff, #ffffff);
}
.small>li {
// display: inline-flex;
width: 650px;
height: 150px;
// margin: 40px;
background-color: #ffffff;
border-radius: 5px;
margin: 20px;
.partObject {
height: 45px;
line-height: 40px;
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 20px;
border-bottom: 1px solid #e7e7e7;
.partObject1 {
height: 30px;
line-height: 30px;
font-size: 14px;
background-color: #6093ff;
padding: 0px 16px;
color: #fff;
}
.partObject2 {
font-size: 14px;
color: #0052d9;
}
}
.partObjectIntroduce {
height: 149px;
font-size: 16px;
padding: 15px;
}
}
}
.content3 {
border-radius: 20px;
margin-top: 20px;
width: 100%;
height: 370px;
background-color: #fff;
background-image: linear-gradient(#ffe9c7, #ffffff);
}
</style>

@ -0,0 +1,476 @@
<script setup>
import { ref, onMounted } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
import { id } from 'element-plus/es/locales.mjs'
import * as echarts from 'echarts'
import {useRoute } from 'vue-router'
import { getCourseList } from '@/api/courseChaptersApi'
const route = useRoute()
// id id
// targetId
const booksList = ref([
{ id: 1, targetId: 1, introduce: '内容111111' },
// { id: 3, introduce: '333333' },
// { id: 4, introduce: '333333' },
])
const courseList = ref([
{ id: 1, specific: '思政目标', booklist: [{ id: 1, targetId: 1, introduce: '内容111111' }] },
{ id: 2, specific: '知识目标', booklist: [{ id: 1, targetId: 1, introduce: '内容222222' }] },
{ id: 3, specific: '能力目标', booklist: [{ id: 1, targetId: 1, introduce: '内容333333' }] },
{ id: 4, specific: '素质目标', booklist: [{ id: 1, targetId: 1, introduce: '内容444444' }] },
])
const targetList = ref([
{
label: '课程目标一',
id: 1,
disabled: false,
},
{
label: '课程目标二',
disabled: false,
id: 2,
},
{
label: '课程目标三',
id: 3,
disabled: false,
},
])
const formData = ref({
id: null,
target: '',
description: '',
})
const activeIndex = ref(0)
const addBook = (index) => {
activeIndex.value = index
dialogVisible.value = true
updateDisabledStatus()
}
const text = ref('我是后台获取的值')
const textChange = (val) => {
console.log(text.value)
}
//
const dialogVisible = ref(false)
//
const handleClose = () => {
dialogVisible.value = false
}
//
const submit = () => {
//
if (flog.value) {
console.log('编辑', formData.value.target)
//
const index = booksList.value.findIndex(
(item) => formData.value.id == item.id,
)
console.log(index, 'index')
console.log(booksList.value[index])
booksList.value[index].id = formData.value.id
booksList.value[index].targetId = formData.value.target
booksList.value[index].introduce = formData.value.description
close()
} else {
courseList.value[activeIndex.value].booklist.push({
id: booksList.value.length + 1,
targetId: formData.value.target,
introduce: formData.value.description,
})
close()
flog.value = false
}
}
const close = () => {
formData.value = {
id: null,
target: '',
description: '',
}
dialogVisible.value = false
}
//
const filterTarger = (target) => {
const res = targetList.value.find((item) => {
if (item.id === target) {
console.log(item)
return item
}
})
return res.label
}
//
const flog = ref(false)
const editBook = (obj) => {
updateDisabledStatus()
flog.value = true
console.log(obj)
formData.value.id = obj.id
formData.value.target = obj.targetId
formData.value.description = obj.introduce
dialogVisible.value = true
}
const del = (id) => {
// console.log(id);
courseList.booksList.value = booksList.value.filter((item) => item.id !== id)
}
// const disableChange = (id) => {
// const index = booksList.value.findIndex((item,index) => item.id === id)
// console.log(index);
// if(index){
// targetList.value[index].disabled = false
// }
// }
// targetList disabled
const updateDisabledStatus = () => {
// targetList
targetList.value.forEach((targetItem) => {
// booksList id
const hasIdInBooks = booksList.value.some(
(bookItem) => bookItem.id === targetItem.id,
)
// disabled true
if (hasIdInBooks) {
targetItem.disabled = true
}
})
}
const list=ref([])
const content88=ref()
const courseId = ref(0)
onMounted(async() => {
courseId.value = route.query.id
console.log(courseId.value);
const res = await getCourseList({ id: courseId.value })
console.log(res);
list.value=res.data
console.log(list.value);
content88.value = list.value[0].contents[0].content
console.log(list.value[0].contents[0].content);
console.log(content88.value);
let chartDom = document.getElementById('main')
let myChart = echarts.init(chartDom)
let option
option = {
title: {
text: '分目标',
},
legend: {
data: ['Allocated Budget', 'Actual Spending'],
},
radar: {
// shape: 'circle',
indicator: [
{ name: 'Sales', max: 6500 },
{ name: 'Administration', max: 16000 },
{ name: 'Information Technology', max: 30000 },
{ name: 'Customer Support', max: 38000 },
{ name: 'Development', max: 52000 },
{ name: 'Marketing', max: 25000 },
],
},
series: [
{
name: 'Budget vs spending',
type: 'radar',
data: [
{
value: [4200, 3000, 20000, 35000, 50000, 18000],
name: 'Allocated Budget',
},
{
value: [5000, 14000, 28000, 26000, 42000, 21000],
name: 'Actual Spending',
},
],
},
],
}
option && myChart.setOption(option)
})
</script>
<!-- v-model="text" -->
<template>
<div class="container">
<div class="leftContent">
<div class="topContent">
<div class="title">| 课程总目标</div>
<div class="content1">
<textarea class="textarea" @change="textChange">{{ content88 }}</textarea>
</div>
</div>
<div class="footContent">
<div class="title">| 分目标雷达图</div>
<div class="content3">
<div id="main"></div>
</div>
</div>
</div>
<div class="rightContent">
<div class="title" style="
width: 100%;
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 20px;
height: 60px;">
<div class="left2">| 课程分目标</div>
<div class="right2">
<!-- <el-button type="primary" @click="addBook">新增</el-button> -->
</div>
</div>
<div class="content2">
<el-scrollbar height="600px">
<ul class="objectLi">
<li v-for="(item, index) in courseList" :key="item.id">
<div class="courseObject">
<!-- {{ filterTarger(item.targetId) }} -->
<div class="courseObject1">{{ item.specific }}</div>
<div class="courseObject2">
<!-- <el-button class="edit" type="text" @click="editBook(item)">
编辑
</el-button> -->
<el-button type="primary" @click="addBook(index)">新增</el-button>
</div>
</div>
<div class="smallContent">
<el-scrollbar height="250px">
<ul class="small">
<li v-for="(obj, i) in item.booklist" :key="obj.id">
<div class="partObject">
<div class="partObject1">
<!-- {{ item.introduce }} -->
课程目标{{ i+1 }}
<!-- {{ filterTarger(obj.targetId) }} -->
</div>
<div class="partObject2">
<el-button class="edit" type="text" @click="editBook(obj)">
编辑
</el-button>
<el-button class="destroy" type="text" @click="del(obj.id)">
删除
</el-button>
</div>
</div>
<div class="partObjectIntroduce">
{{ obj.introduce }}
</div>
</li>
</ul>
</el-scrollbar>
</div>
</li>
</ul>
</el-scrollbar>
</div>
</div>
</div>
<el-dialog v-if="dialogVisible" v-model="dialogVisible" title="新增目标" width="500" :before-close="handleClose">
<el-form :model="formData" label-width="auto" style="max-width: 600px">
<!-- <el-form-item label="目标" prop="target">
<el-select v-model="formData.target" placeholder="Select" size="large" style="width: 240px">
<el-option v-for="item in targetList" :key="item.id" :label="item.label" :value="item.id"
:disabled="item.disabled" />
</el-select>
</el-form-item> -->
<el-form-item label="内容" prop="description">
<el-input v-model="formData.description" placeholder="请输入内容"></el-input>
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button @click="close">取消</el-button>
<el-button type="primary" @click="submit">确定</el-button>
</div>
</template>
</el-dialog>
</template>
<!-- <script setup>
import {ref} 'vue'
const li
</script> -->
<style lang="scss" scoped>
#main {
padding: 15px;
width: 100%;
height: 100%;
}
.container {
display: flex;
flex-direction: row;
flex-wrap: nowrap;
width: 100%;
padding: 0 10px 0 10px;
justify-content: space-around;
}
.leftContent {
width: 450px;
height: 730px;
margin: 10px;
.topContent {
border-radius: 20px 20px 0 0px;
height: 280px;
background-color: #74deff;
margin-button: 5px;
background-image: linear-gradient(to right, #4984ff, #74deff);
}
.footContent {
border-radius: 20px;
margin-top: 20px;
height: 430px;
background-color: #ffa674;
background-image: linear-gradient(to right, #f9e397, #ffa674);
}
}
.rightContent {
margin: 10px;
width: 950px;
height: 730px;
background-image: linear-gradient(to right, #4984ff, #74deff);
border-radius: 20px;
}
.title {
padding-left: 30px;
font-size: 24px;
font-weight: 600;
color: #fff;
height: 40px;
line-height: 40px;
padding-top: 10px;
}
.content1 {
border-radius: 20px 20px 0 0px;
margin-top: 20px;
width: 100%;
height: 220px;
background-color: #fff;
background-image: linear-gradient(#c7e3ff, #ffffff);
.textarea {
width: 100%;
border: none;
background: transparent;
padding: 20px;
height: 215px;
}
p {
padding: 30px;
font-size: 16px;
}
}
.content2 {
border-radius: 20px;
padding: 10px;
width: 100%;
height: 670px;
background-color: #fff;
background-image: linear-gradient(#c7e3ff, #ffffff);
.objectLi > li {
width: 845px;
height: 250px;
// margin: 40px;
// background-color: #ffffff;
border-radius: 5px;
margin: 20px;
.courseObject {
height: 45px;
line-height: 40px;
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 20px;
border-bottom: 1px solid #e7e7e7;
.courseObject1 {
height: 30px;
line-height: 30px;
font-size: 14px;
background-color: #6093ff;
padding: 0px 16px;
color: #fff;
}
.courseObject2 {
font-size: 14px;
color: #0052d9;
}
}
}
// overflow-y: auto
.smallContent {
// border-radius: 20px;
padding: 10px;
width: 100%;
height: 200px;
background-color: #fff;
background-image: linear-gradient(#c7e3ff, #ffffff);
}
.small > li {
// display: inline-flex;
width: 750px;
height: 150px;
// margin: 40px;
background-color: #ffffff;
border-radius: 5px;
margin: 20px;
.partObject {
height: 45px;
line-height: 40px;
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 20px;
border-bottom: 1px solid #e7e7e7;
.partObject1 {
height: 30px;
line-height: 30px;
font-size: 14px;
background-color: #6093ff;
padding: 0px 16px;
color: #fff;
}
.partObject2 {
font-size: 14px;
color: #0052d9;
}
}
.partObjectIntroduce {
height: 149px;
font-size: 16px;
padding: 15px;
}
}
}
.content3 {
border-radius: 20px;
margin-top: 20px;
width: 100%;
height: 370px;
background-color: #fff;
background-image: linear-gradient(#ffe9c7, #ffffff);
}
</style>

@ -2,20 +2,22 @@
import { ref, onMounted } from 'vue'
// import axios from 'axios'
import courseEdit from './components/courseEdit.vue'
import { Plus, Search } from '@element-plus/icons-vue'
import { Plus } from '@element-plus/icons-vue'
import {
getCourseListApi,
deleteCourseApi,
getCourseObjectApi,
getTeacherListApi,
} from '../../api/user/crouse'
import { ElMessageBox, ElMessage } from 'element-plus'
// import router from '@/router'
import { useRouter, useRoute } from 'vue-router'
import { useRouter } from 'vue-router'
import useUserStore from '@/store/modules/user'
// import { useRoute } from 'vue-router'
const userStore = useUserStore()
// const userInfo = userStore.userInfo
const router = useRouter()
// const route = useRoute()
// console.log(route)
// import { client } from '@/utils/alioss.js'
//
const courseList = ref([])
@ -31,7 +33,7 @@ const total = ref(0)
const params = ref({
pageNo: 1,
pageSize: 7,
username: 'qiu',
username: userStore.userName,
assessmenttype: '',
category: '',
nature: '',
@ -41,12 +43,14 @@ const loading = ref(false)
//
const getCourseList = async () => {
loading.value = true
console.log(params.value, '11')
const res = await getCourseListApi(params.value)
// console.log(res)
courseList.value = res.data.list
total.value = res.data.total
console.log(res.data.list)
loading.value = false
// console.log(userStore.userName, '1111')
}
//
onMounted(() => {
@ -163,12 +167,15 @@ const CloseCouresNameChangeEvent = () => {
<div class="btn">
<!-- <el-button type="primary" round size="large">全部课程</el-button>
<el-button type="primary" round plain size="large">我的文件夹</el-button> -->
<el-form inline>
<el-form inline v-if="userStore.userInfo.roleId === 1">
<el-form-item label="课程教师:" class="short-form-item">
<el-select v-model="params.teacher">
<el-option v-for="teachers in teacherList" :key="teachers.username" :value="teachers.username"
:label="teachers.name"></el-option>
<el-option
v-for="teachers in teacherList"
:key="teachers.username"
:value="teachers.username"
:label="teachers.name"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="课程类别:" class="short-form-item">
@ -190,22 +197,23 @@ const CloseCouresNameChangeEvent = () => {
<el-option label="考察" value="2"></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onSearch">搜索</el-button>
<el-button type="primary" plain @click="onReset">重置</el-button>
</el-form-item>
</el-form>
<div class="course">
<ul class="course_list">
<li @click="onAddCourse()">
<li
v-if="userStore.userInfo.roleId === 1"
@click="onAddCourse()"
class="add_course"
>
<div class="plus">
<el-icon class="avatar-uploader-icon">
<Plus />
</el-icon>
</div>
<h2 class="course_name">{{ course_name }}</h2>
<!-- <p class="teacher_name">讲师{{ courseList.teacher }}</p>
<p class="credit">
@ -220,7 +228,6 @@ const CloseCouresNameChangeEvent = () => {
<h2 class="course_name" @click="onEditCourse(item)">
{{ item.name }}
</h2>
<p class="teacher_name">讲师{{ item.teacher }}</p>
<p class="credit">
<span>{{ item.classhours }}</span>
@ -231,22 +238,36 @@ const CloseCouresNameChangeEvent = () => {
<el-icon class="del" @click="onDeleteCourse(item.id)">
<Delete />
</el-icon>
<el-button class="object" round plain @click="onGetCourseObject(item.id)">
<el-button
class="object"
round
plain
@click="onGetCourseObject(item.id)"
>
查看课程目标
</el-button>
</li>
</ul>
</div>
<el-pagination v-model:current-page="params.pageNo" v-model:page-size="params.pageSize"
:page-sizes="[2, 5, 7, 10]" :background="true" layout="jumper,total, sizes, prev, pager, next " :total="total"
@size-change="handleSizeChange" @current-change="handleCurrentChange"
style="margin-top: 10px; justify-content: center" />
<el-pagination
v-model:current-page="params.pageNo"
v-model:page-size="params.pageSize"
:page-sizes="[2, 5, 7, 10]"
:background="true"
layout="jumper,total, sizes, prev, pager, next "
:total="total"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
style="margin-top: 10px; justify-content: center"
/>
</div>
<course-edit ref="drawer" @success="onSuccess" @couresNameChange="couresNameChangeEvent"
@CloseCouresNameChange="CloseCouresNameChangeEvent" @creditChange="creditChangeEvent"
@classhoursChange="classhoursChangeEvent" @ClosecreditChange="ClosecreditChangeEvent"
@CloseclasshoursChange="CloseclasshoursChangeEvent" :flog="flog"></course-edit>
<course-edit
ref="drawer"
@success="onSuccess"
@couresNameChange="couresNameChangeEvent"
@CloseCouresNameChange="CloseCouresNameChangeEvent"
:flog="flog"
></course-edit>
</div>
</div>
</template>
@ -274,7 +295,6 @@ const CloseCouresNameChangeEvent = () => {
// // margin: 20px;
// // padding-left: 50px;
// }
.search {
width: 50%;
display: flex;
@ -293,7 +313,6 @@ const CloseCouresNameChangeEvent = () => {
}
.course {
// display: flex;
// flex: 0 0 25%;
// justify-content: space-between;
@ -331,6 +350,9 @@ const CloseCouresNameChangeEvent = () => {
margin-left: 30px;
margin-top: 10px;
font-weight: bold;
&:hover {
cursor: pointer;
}
}
img {
@ -353,19 +375,6 @@ const CloseCouresNameChangeEvent = () => {
color: #0052ff;
}
}
h2 {
font-family: Inter-Bold;
color: #333;
font-size: 24px;
margin-left: 30px;
margin-top: 10px;
font-weight: bold;
&:hover {
cursor: pointer;
}
}
}
.del {
@ -386,17 +395,34 @@ const CloseCouresNameChangeEvent = () => {
.plus {
width: 100%;
height: 178px;
&:hover {
cursor: pointer;
}
// background-position: center center;
.el-icon.avatar-uploader-icon {
font-size: 28px;
font-size: 50px;
color: #8c939d;
width: 100%;
height: 178px;
margin-top: 20px;
text-align: center;
}
}
.add_course {
border: 2px dashed rgb(143, 139, 139);
h2 {
font-size: 40px;
text-align: center;
font-family: Inter-Bold;
color: #535050;
font-weight: bold;
margin-top: 20px;
&:hover {
cursor: pointer;
}
}
}
.short-form-item {
width: 250px;
margin-right: 65px;

@ -0,0 +1,244 @@
<script lang="ts" setup>
import { ref } from 'vue'
// import axios from 'axios'
import { CourseResourceControllerService } from '../../../../generated/services/CourseResourceControllerService'
const props = defineProps(['dafulIndex'])
import { QuillEditor } from '@vueup/vue-quill'
import '@vueup/vue-quill/dist/vue-quill.snow.css'
import { ElMessage } from 'element-plus'
//
const visibleDramwer = ref(false)
//
const defaultForm = {
description: '',
id: '',
img: '',
name: '',
type: '',
path: '',
}
//
const formModel = ref({
...defaultForm,
})
//
const rules = {
name: [
{ required: true, message: '请输入资源名称', trigger: 'blur' },
{ min: 3, max: 10, message: '长度在 3 到 10 个字符', trigger: 'blur' },
],
}
//open
const open = async (row) => {
visibleDramwer.value = true
//console.log(row.id)
if (row.id) {
//row.id
const res = await CourseResourceControllerService.getAllUsingGet1(row.id)
//
formModel.value = res.data.records
console.log(res)
//
//
console.log('编辑回显')
} else {
//
formModel.value = {
...defaultForm,
}
}
}
defineExpose({
open,
})
const selectVal = ref(props.dafulIndex)
const selectOp = ref([
{ label: 'ppt', value: '1' },
{ label: '图片', value: '2' },
{ label: '视频', value: '3' },
{ label: 'PDF', value: '4' },
{ label: '文件', value: '5' },
{ label: '音频', value: '6' },
])
const fileList = ref([])
function clearFileList() {
fileList.value.length = 0
}
const handleSel = () => {
fileList.value.length = 0
}
//
import type { UploadProps } from 'element-plus'
const handleRemove: UploadProps['onRemove'] = (uploadFile, uploadFiles) => {
console.log(uploadFile, uploadFiles)
}
const handlePreview: UploadProps['onPreview'] = (file) => {
console.log(file)
}
const formRef = ref()
function isSubmit() {
formRef.value.validate((valid, fields) => {
if (valid) {
const params = {
name: formModel.value.name,
type: selectVal.value,
img: fileList.value[0]?.raw,
description: formModel.value.description,
}
console.log('根据参数:', params, '去调用接口???')
} else {
console.log('error submit!', fields)
}
})
}
// upd
const beforeAvatarUpload = (rawFile) => {
console.log('执行了')
switch (+selectVal.value) {
case 1:
if (rawFile.type !== 'application/vnd.ms-powerpoint') {
clearFileList()
ElMessage.error('必须是ppt文件!')
} else {
clearFileList()
fileList.value.push(rawFile)
}
break
case 2:
if (!rawFile.type.startsWith('image/')) {
clearFileList()
ElMessage.error('必须是??文件!')
} else {
clearFileList()
fileList.value.push(rawFile)
}
break
// case 3:
// if (false) {
// clearFileList()
// ElMessage.error('??')
// } else {
// clearFileList()
// fileList.value.push(rawFile)
// }
// break
// case 4:
// if (false) {
// clearFileList()
// ElMessage.error('??')
// } else {
// clearFileList()
// fileList.value.push(rawFile)
// }
// break
// case 5:
// if (false) {
// clearFileList()
// ElMessage.error('??')
// } else {
// clearFileList()
// fileList.value.push(rawFile)
// }
// break
// case 6:
// if (false) {
// clearFileList()
// ElMessage.error('??')
// } else {
// clearFileList()
// fileList.value.push(rawFile)
// }
// break
}
}
</script>
<template>
<el-drawer
v-model="visibleDramwer"
:title="formModel.id ? '编辑资源' : '添加资源'"
direction="rtl"
size="50%"
>
<!-- 添加资源表单 -->
<el-form
class="resourceformModel"
:model="formModel"
ref="formRef"
:rules="rules"
label-width="100px"
>
<el-form-item label="资源名称" prop="name">
<el-input
v-model="formModel.name"
placeholder="请输入资源名称"
></el-input>
</el-form-item>
<el-form-item label="资源类型">
<el-select
@change="handleSel"
v-model="selectVal"
placeholder="请选择资源类型"
size="large"
style="width: 100%"
>
<el-option
v-for="item in selectOp"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="上传资源" prop="fileList">
<el-upload
v-model:file-list="fileList"
:limit="1"
class="upload-demo"
action="https://run.mocky.io/v3/9d059bf9-4660-45f2-925d-ce80ad6c4d15"
:on-preview="handlePreview"
:on-remove="handleRemove"
list-type="picture"
:before-upload="beforeAvatarUpload"
>
<el-button type="primary">点击上传资源</el-button>
<template #tip>
<div class="el-upload__tip">
jpg/png files with a size less than 500kb
</div>
</template>
</el-upload>
</el-form-item>
<el-form-item label="资源简介" prop="description">
<div class="editor">
<quill-editor
v-model:content="formModel.description"
content-type="html"
theme="snow"
></quill-editor>
</div>
</el-form-item>
<el-form-item>
<el-button type="primary">取消</el-button>
<el-button type="info" @click="isSubmit">确定</el-button>
</el-form-item>
</el-form>
</el-drawer>
</template>
<style lang="scss" scoped>
.editor {
width: 100%;
:deep(.ql-editor) {
min-height: 200px;
}
}
</style>

@ -1,133 +0,0 @@
<template>
<div class="ch">
<video
src="D:\前端\前端code\vedio\薛之谦 - 病态.mp4"
width="240px"
controls
>
法学
</video>
<div class="ch1">
<p>开课时间2018年11月14日~2023年11月14日</p>
<p>课程类型公共开放课程</p>
<p>学习人数120</p>
</div>
</div>
<div class="ma"></div>
<div class="en"></div>
<div class="ph"></div>
<div class="or"></div>
<div class="warpper"></div>
<div class="vo">
请选择院系专业:
<button>
<select>
<option>国际教育学院</option>
<option>能源工程学院</option>
<option>体育学院</option>
<option>马克思主义学院</option>
<option>智能制造学院</option>
<option>商务英语学院</option>
</select>
</button>
<button>
<select>
<option>01</option>
<option>02</option>
<option>03</option>
<option>04</option>
<option>05</option>
</select>
</button>
<br />
请选择年级:
<button>
<select>
<option>大一</option>
<option>大二</option>
<option>大三</option>
<option>大四</option>
</select>
</button>
<br />
上传学科文件
<input type="file" />
<form>
<button type="submit">提交</button>
<button type="reset">重置</button>
<br />
<div style="width: 100%; display: flex; justify-content: space-between">
<button>上一页</button>
<button>下一页</button>
</div>
</form>
</div>
</template>
<script lang="ts" setup>
import {} from 'vue'
</script>
<style lang="scss" scoped>
.ch {
height: 300px;
width: 240px;
float: left;
line-height: 1.5;
margin-right: 5px;
background-color: rgba(183, 126, 164, 0.17);
box-sizing: border-box;
}
.ma {
height: 300px;
width: 240px;
float: left;
line-height: 1.5;
margin-right: 5px;
background-color: rgba(183, 126, 164, 0.17);
box-sizing: border-box;
}
.en {
height: 300px;
width: 240px;
float: left;
line-height: 1.5;
margin-right: 5px;
background-color: rgba(183, 126, 164, 0.17);
box-sizing: border-box;
}
.ph {
height: 300px;
width: 240px;
float: left;
line-height: 1.5;
margin-right: 5px;
background-color: rgba(183, 126, 164, 0.17);
box-sizing: border-box;
}
.warpper {
width: 1222px;
height: 300px;
float: left;
background-color: rgb(202, 194, 236);
box-sizing: border-box;
}
.or {
height: 300px;
width: 240px;
float: left;
line-height: 1.5;
margin-right: 5px;
background-color: rgba(183, 126, 164, 0.17);
box-sizing: border-box;
}
.vo {
width: 1222px;
height: 130px;
background-color: rgb(250, 225, 243);
border: solid 1px rgb(220, 214, 214);
float: left;
}
.ch.ch1 {
}
</style>

@ -1,569 +1,303 @@
<script setup>
//
import ppt from '@/assets/icons/ppt (1).png'
import image from '@/assets/icons/图片 (2).png'
import video from '@/assets/icons/视频 .png'
import pdf from '@/assets/icons/pdf (1).png'
import test from '@/assets/icons/文件.png'
import audio from '@/assets/icons/音频1.png'
import { ElMessageBox, ElMessage } from 'element-plus'
import { ref } from 'vue'
import { LearningRecordsControllerService } from '../../../generated/services/LearningRecordsControllerService'
import { CourseResourceControllerService } from '../../../generated/services/CourseResourceControllerService'
import resourceAdd from './componse/resourceAdd.vue'
const total = ref(0)
const pptresourceList = ref([])
const loading = ref(false)
const params = ref({
pagesize: '15',
pagenum: '1',
type: '1', //ppt
})
//
const getpptresourceList = async () => {
loading.value = true
const res = await CourseResourceControllerService.getAllUsingGet1(
params.value.pagenum,
params.value.pagesize,
params.value.type,
)
pptresourceList.value = res.data.records
console.log(res)
//
total.value = res.data.total
loading.value = false
}
getpptresourceList()
//type
const changeType = (newtype) => {
params.value.type = newtype
//console.log(params.value.type)
getpptresourceList()
}
//
const onSizeChange = (size) => {
console.log('当前每页条数', size)
//访
//
params.value.pagenum = 1
params.value.pagesize = size
//
getpptresourceList()
}
const onCurrentChange = (page) => {
pptresourceList.value.pagenum = page
getpptresourceList()
}
// -ID
const onDeleteResource = async (ids) => {
console.log(111111111111111)
await ElMessageBox.confirm('你确认删除该条浏览信息吗?', '温馨提示', {
type: 'warning',
confirmButtonText: '确认',
cancelButtonText: '取消',
})
console.log(ids)
await CourseResourceControllerService.deleteRecordsUsingDelete1(ids)
ElMessage({ type: 'success', message: '删除成功' })
getpptresourceList()
}
const param = ref({
coursesId: '',
userId: '1',
open: '1',
download: '0',
content: '',
address: '/portal',
type: '4',
})
//
const generateRecords = async (rescource) => {
param.value.content = rescource.img
param.value.coursesId = rescource.id.toString()
await LearningRecordsControllerService.saveRecordsUsingPost1(param.value)
// console.log(param)
}
const resourceAddRef = ref()
//
const onAddResource = () => {
resourceAddRef.value.open({})
}
//
const onEditResource = (row) => {
resourceAddRef.value.open(row)
}
</script>
<template>
<div>
<div class="top">
<div class="loop active-nav" @click="click($event, 2)">
<img
src="../../assets/icons/课程简介.svg"
alt=""
width="50px"
height="50px"
/>
<p>简介</p>
</div>
<div class="loop" @click="click($event, 1)">
<img
src="../../assets/icons/ppt.svg"
alt=""
width="50px"
height="50px"
/>
<p>ppt</p>
</div>
<div class="loop" @click="click($event, 0)">
<img
src="../../assets/icons/视频.svg"
alt=""
width="50px"
height="50px"
/>
<p>视频</p>
</div>
<div class="loop" @click="click($event, 3)">
<img
src="../../assets/icons/文本.svg"
alt=""
width="50px"
height="50px"
/>
<p>文本</p>
</div>
<div class="loop" @click="click($event, 4)">
<img
src="../../assets/icons/音频.svg"
alt=""
width="50px"
height="50px"
/>
<p>音频</p>
</div>
</div>
<div class="body" v-if="activeIndex == 0">
<ul>
<li v-for="(item, index) in videoList" :key="index">
<video :src="item.url" controls width="390px"></video>
<div class="text1">
软件工程的奥秘
<br />
构建无暇的应用程序关键技巧
</div>
<form action="">
<input
type="file"
multiple
@change="uploadChange"
style="cursor: pointer"
/>
<br />
<button
type="submit"
@click="submitUploadFile"
style="cursor: pointer"
>
上传
</button>
<button>
<a
href="http://ceshi132132.oss-cn-wuhan-lr.aliyuncs.com/img/1c52b390170a4734aba783a5473e891b.jpg?Expires=1717731833&OSSAccessKeyId=LTAI5tFkdu3y5WddxbjgaG2F&Signature=KtuZCTVO7cbwZAdD7ytpphkYhLw%3D"
download=""
>
下载
</a>
</button>
<button type="reset" style="cursor: pointer">重选</button>
</form>
</li>
</ul>
<el-button @click="onAddResource">添加资源</el-button>
</div>
<div class="body">
<div class="nav">
<el-row>
<el-col :span="4" @click="changeType('1')">
<div class="nav-info">
<div class="nav-info-pic">
<img :src="ppt" style="height: 50px" />
</div>
<div class="nav-info-name">ppt</div>
</div>
</el-col>
<el-col :span="4" @click="changeType('2')">
<div class="nav-info">
<div class="nav-info-pic">
<img :src="image" style="height: 50px" />
</div>
<div class="nav-info-name">图片</div>
</div>
</el-col>
<div class="body" v-if="activeIndex == 1">
<ul>
<li v-for="(item, index) in pptList" :key="index">
<img :src="item.url" title="ppt" height="200px" width="390px" />
<div class="text1">
软件工程的奥秘
<br />
构建无暇的应用程序关键技巧
</div>
<form action="">
<input type="file" multiple @change="uploadChange" />
<br />
<button
type="submit"
@click="submitUploadFile"
style="cursor: pointer"
>
上传
</button>
<button>
<a
href="http://ceshi132132.oss-cn-wuhan-lr.aliyuncs.com/img/1c52b390170a4734aba783a5473e891b.jpg?Expires=1717731833&OSSAccessKeyId=LTAI5tFkdu3y5WddxbjgaG2F&Signature=KtuZCTVO7cbwZAdD7ytpphkYhLw%3D"
download=""
>
下载
</a>
</button>
<button type="reset" style="cursor: pointer">重选</button>
</form>
</li>
</ul>
</div>
<div class="body" v-if="activeIndex == 2">
<ul>
<li>
<img
src="../../assets/images/软件1.png"
title="软件工程的奥秘"
width="390px"
height="200px"
/>
<div class="text1">
软件工程的奥秘
<br />
构建无暇的应用程序关键技巧
</div>
<div class="text2">
课程类型:公共任选课
<br />
授课老师:王易系
<br />
报名人数:130
</div>
</li>
<li>
<img
src="../../assets/images/软件2.png"
title="顶级工程师"
width="390px"
height="200px"
/>
<div class="text1">
如何成为顶级工程师
<br />
成功之路解析
</div>
<div class="text2">
课程类型:公共任选课
<br />
授课老师:刘苏杭
<br />
报名人数:126
</div>
</li>
<li>
<img
src="../../assets/images/软件3.png"
title="软件黑科技"
width="390px"
height="200px"
/>
<div class="text1">
软件工程的黑科技
<br />
提高开发效率的秘密技巧大揭秘
</div>
<div class="text2">
课程类型:公共任选课
<br />
授课老师:安书名
<br />
报名人数:117
</div>
</li>
<li>
<img
src="../../assets/images/软件4.png"
title="未来趋势"
width="390px"
height="200px"
/>
<div class="text1">
软件工程界的未来趋势
<br />
AI大数据和区块的巨大影响
</div>
<div class="text2">
课程类型:公共任选课
<br />
授课老师:萨基姆
<br />
报名人数:140
</div>
</li>
<li>
<img
src="../../assets/images/软件5.png"
title="避免陷阱"
width="390px"
height="200px"
/>
<div class="text1">
软件工程中常见的陷阱级如何避免
<br />
优化你的开发过程
</div>
<div class="text2">
课程类型:公共任选课
<br />
授课老师:何舒心
<br />
报名人数:125
</div>
</li>
<li>
<img
src="../../assets/images/软件6.png"
title="必备工具"
width="390px"
height="200px"
/>
<div class="text1">
精通软件工程的必备工具
<br />
代码管理测试和持续集成
</div>
<div class="text2">
课程类型:公共任选课
<br />
授课老师:朱佳娜
<br />
报名人数:121
</div>
</li>
<li>
<img
src="../../assets/images/软件7.png"
title="面试攻略"
width="390px"
height="200px"
/>
<div class="text1">
软件工程师面试攻略
<br />
如何在技术中脱颖而出
</div>
<div class="text2">
课程类型:公共任选课
<br />
授课老师:胡树立
<br />
报名人数:117
</div>
</li>
<li>
<img
src="../../assets/images/软件8.png"
alt="实战经验"
width="390px"
height="200px"
/>
<div class="text1">
软件工程实战经验分析
<br />
高效团队合作的秘密武器
</div>
<div class="text2">
课程类型:公共任选课
<br />
授课老师:张海山
<br />
报名人数:125
</div>
</li>
</ul>
</div>
<div class="body" v-if="activeIndex == 3">
<ul>
<li v-for="(item, index) in textList" :key="index">
<img
src="../../assets/icons/文本1.png"
title="软件工程的奥秘"
width="390px"
height="200px"
/>
<textarea name="" id="">点击输入文本内容:</textarea>
<form action="">
<input
type="file"
multiple
@change="uploadChange"
style="cursor: pointer"
/>
<br />
<button
type="submit"
@click="submitUploadFile"
style="cursor: pointer"
<el-col :span="4" @click="changeType('3')">
<div class="nav-info">
<div class="nav-info-pic">
<img style="height: 50px" :src="video" />
</div>
<div class="nav-info-name">视频</div>
</div>
</el-col>
<el-col :span="4">
<div class="nav-info">
<div class="nav-info-pic" @click="changeType('4')">
<img style="height: 50px" :src="pdf" />
</div>
<div class="nav-info-name">PDF</div>
</div>
</el-col>
<el-col :span="4" @click="changeType('5')">
<div class="nav-info">
<div class="nav-info-pic">
<img style="height: 50px" :src="test" />
</div>
<div class="nav-info-name">文件</div>
</div>
</el-col>
<el-col :span="4" @click="changeType('6')">
<div class="nav-info">
<div class="nav-info-pic">
<img style="height: 50px" :src="audio" />
</div>
<div class="nav-info-name">音频</div>
</div>
</el-col>
</el-row>
</div>
<div class="body">
<!-- ppt资源列表 -->
<div class="courseResourcesList">
<ul v-if="pptresourceList.length > 0">
<li
v-for="resource in pptresourceList"
:key="resource.id"
v-loading="loading"
>
上传
</button>
<button>
<a
href="http://ceshi132132.oss-cn-wuhan-lr.aliyuncs.com/img/1c52b390170a4734aba783a5473e891b.jpg?Expires=1717731833&OSSAccessKeyId=LTAI5tFkdu3y5WddxbjgaG2F&Signature=KtuZCTVO7cbwZAdD7ytpphkYhLw%3D"
download=""
<div
style="
display: flex;
justify-content: space-between;
margin-bottom: 10px;
"
>
下载
</a>
</button>
<button type="reset" style="cursor: pointer">重选</button>
</form>
</li>
</ul>
</div>
<div class="body" v-if="activeIndex == 4">
<ul>
<li v-for="(item, index) in audioList" :key="index">
<img
src="../../assets/icons/音乐.png"
title="软件工程的奥秘"
width="390px"
height="180px"
<el-icon @click="onDeleteResource(resource.id)">
<Delete />
</el-icon>
<el-icon @click="onEditResource(row)">
<Edit />
</el-icon>
</div>
<img
class="img"
@click="generateRecords(resource)"
style="margin-top: 10px; margin-bottom: 10px"
:src="resource.img"
/>
<div class="box" style="display: flex; flex-direction: column">
<p style="margin-bottom: 10px">{{ resource.name }}</p>
<p style="margin-top: 10px">{{ resource.description }}</p>
</div>
</li>
</ul>
</div>
<!-- 分页 -->
<div class="pagination">
<el-pagination
v-model:current-page="currentPage4"
v-model:page-size="pageSize4"
:page-sizes="[1, 2, 3, 4]"
:small="small"
:disabled="disabled"
:background="background"
layout="total, sizes, prev, pager, next, jumper"
:total="total"
@current-change="onCurrentChange"
@size-change="onSizeChange"
style="margin-top: 20px; justify-content: flex-end"
/>
<div class="text1">点击播放软件工程的奥秘</div>
<video
src="../../assets/images/1.mp3"
controls
height="50px"
width="300px"
></video>
<!-- <audio src="../../assets/images/1.mp3" controls></audio> -->
<form action="">
<input
type="file"
multiple
@change="uploadChange"
style="cursor: pointer"
/>
<br />
<button
type="submit"
@click="submitUploadFile"
style="cursor: pointer"
>
上传
</button>
<button>
<a
href="http://ceshi132132.oss-cn-wuhan-lr.aliyuncs.com/img/1c52b390170a4734aba783a5473e891b.jpg?Expires=1717731833&OSSAccessKeyId=LTAI5tFkdu3y5WddxbjgaG2F&Signature=KtuZCTVO7cbwZAdD7ytpphkYhLw%3D"
download=""
>
下载
</a>
</button>
<button type="reset" style="cursor: pointer">重选</button>
</form>
</li>
</ul>
</div>
<div class="" @click="gotoinfo"></div>
<div class="buttom">
<el-pagination
background
layout="prev, pager, next,total"
:page-size="pageSize"
:total="total"
class="pagination"
:pager-count="11"
@current-change="currentChange"
/>
</div>
<!-- 添加编辑的抽屉 -->
<resource-add
:dafulIndex="params.type"
ref="resourceAddRef"
></resource-add>
<!-- -->
</div>
</div>
</div>
</template>
<script setup>
import { ref } from 'vue'
import { useRouter } from 'vue-router'
import { aaaApi } from '../../api/courseChaptersApi'
// import {getVideoUrlApi} from 'src/api/assats'
import { uploadFile } from '../../api/courseChaptersApi'
const activeIndex = ref(0)
const router = useRouter()
const gotoinfo = () => {
console.log(router)
router.push('/courseResourcesManagement/courseInfo')
}
function click(e, index) {
document
.querySelectorAll('.loop')
.forEach((item) => item.classList.remove('active-nav'))
e.currentTarget.classList.add('active-nav')
activeIndex.value = index
}
//====================
const page = ref(1)
const total = ref(50)
const pageSize = ref(8)
const videoList = ref([
{ url: '1' },
{ url: '2' },
{ url: '3' },
{ url: '4' },
{ url: '5' },
{ url: '6' },
{ url: '7' },
{ url: '8' },
])
const pptList = ref([
{ url: '/src/assets/images/0.jpg' },
{
url: 'http://ceshi132132.oss-cn-wuhan-lr.aliyuncs.com/img/1c52b390170a4734aba783a5473e891b.jpg?Expires=1717731833&OSSAccessKeyId=LTAI5tFkdu3y5WddxbjgaG2F&Signature=KtuZCTVO7cbwZAdD7ytpphkYhLw%3D',
},
{ url: '3' },
{ url: '4' },
{ url: '5' },
{ url: '6' },
{ url: '7' },
{ url: '8' },
])
const textList = ref([
{ url: '1' },
{ url: '2' },
{ url: '3' },
{ url: '4' },
{ url: '5' },
{ url: '6' },
{ url: '7' },
{ url: '8' },
])
const audioList = ref([
{ url: '1' },
{ url: '2' },
{ url: '3' },
{ url: '4' },
{ url: '5' },
{ url: '6' },
{ url: '7' },
{ url: '8' },
])
function changePage() {
// aaaApi(`?page=${page.value}&pageSize=${pageSize.value}`).then(res=>{
// // @ts-ignore
// videoList.vlue =res.list
// // @ts-ignore
// total.value = res.total
// })
<style lang="scss" scoped>
.el-row {
margin-bottom: 20px;
background-color: #fff;
height: 70px;
}
function currentChange(number) {
console.log(number, 'num')
page.value = number
changePage()
.el-col {
border-radius: 4px;
}
const file = ref(null)
const uploadChange = (e) => {
console.log(e.target.files[0])
file.value = e.target.files[0]
.nav-info {
display: flex;
text-align: center;
flex-direction: column;
}
const uploadFileEvent = () => {}
const submitUploadFile = async () => {
const formData = new FormData()
formData.append('courseId', 1)
formData.append('file', file.value)
await uploadFile(formData)
.body {
background-color: #fff;
}
//============
</script>
<style lang="scss">
.top {
width: 1620px;
height: 100px;
display: flex;
justify-content: space-around;
border: 1px solid rgb(187, 181, 181);
background-color: rgb(255, 255, 255);
li {
height: 99px !important;
border-bottom: 1px solid;
}
& > * {
transition: 0.1s;
cursor: pointer;
}
.active-nav {
border-bottom: 5px solid blue !important;
}
margin-bottom: 20px;
}
.body {
width: 1620px;
height: 680px;
display: flex;
background-color: rgb(237, 237, 238);
.nav-info-pic .img {
height: 50px;
width: 50px;
}
li {
list-style-type: none;
.bottom-box {
//display: flex
float: right;
}
.body ul {
width: 100%;
ul {
list-style-type: none;
padding: 10;
display: flex;
flex-wrap: wrap;
align-content: space-evenly;
justify-content: space-between;
/* justify-content: space-evenly; */
justify-content: start;
}
li {
transition: filter 0.3s; /* 添加过渡动画 */
width: calc(25% - 25px);
flex-direction: column;
align-items: center;
margin-bottom: 10px;
padding: 10px;
box-sizing: border-box;
.body li {
height: 320px;
width: 390px;
background-color: rgb(237, 237, 238);
transition: box-shadow 0.3s;
cursor: pointer;
}
.loop {
width: 100px;
height: 99px;
text-align: center;
padding: 20px;
border-bottom: 1px solid rgb(187, 181, 181);
background-color: rgb(253, 252, 252);
li:hover {
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.2);
}
.body .text1 {
font-size: 25px;
line-height: 30px;
.body {
display: flex;
flex-direction: column;
min-height: 100vh;
}
.body .text2 {
font-size: 18px;
line-height: 20px;
color: rgb(186, 43, 11);
.courseResourcesList {
flex: 1;
}
.body a {
all: initial;
cursor: pointer;
.pagination {
position: sticky;
bottom: 0;
margin: 0 auto;
}
.buttom {
width: 100%;
display: flex;
justify-content: center;
align-items: center;
// .pagination{
// width: ;
// $height:150px;
// height: $height;
// button,li{
// height: $height !important;
// }
.box p:hover {
font-weight: bold;
}
.img {
display: block;
width: 250px;
height: 250px;
}
</style>
<!-- 上传git
git add .
git commit -m '介绍'
git pull
git push
-->

@ -46,80 +46,80 @@ const cancelEdit = () => {
}
const identInfo = ref()
//
const getInfo = async (id) => {
const res = await userIdenService(id)
identInfo.value = res
return res
}
// const getInfo = async (id) => {
// const res = await userIdenService(id)
// identInfo.value = res
// return res
// }
console.log()
onMounted(() => {
// getInfo(id)
getInfo(id)
.then((res) => {
// 访 getData
console.log(res.data, '000000')
identInfo.value = res.data
//
if (res.data.roleId === 1) {
formModel.value = [
{ par: 'name', name: '姓名', content: res.data.name },
{ par: 'sex', name: '性别', content: res.data.sex },
{ par: 'nationality', name: '民族', content: res.data.nationality },
{ par: 'profession', name: '专业', content: res.data.profession },
{ par: 'education', name: '学历', content: res.data.education },
{ par: 'degree', name: '学位', content: res.data.degree },
{
par: 'professionalTitle',
name: '职称',
content: res.data.professionalTitle,
},
{
par: 'emergencyContact',
name: '手机号',
content: res.data.emergencyContact,
},
{
par: 'joinWorkTime',
name: '参加工作时间',
content: res.data.joinWorkTime,
},
{
par: 'politicalStatus',
name: '政治面貌',
content: res.data.politicalStatus,
},
]
} else if (res.data.roleId === 2) {
formModel.value = [
{ par: 'name', name: '姓名', content: res.data.name },
{ par: 'sex', name: '性别', content: res.data.sex },
{ par: 'nationality', name: '民族', content: res.data.nationality },
{ par: 'number', name: '学号', content: res.data.number },
{ par: 'birthday', name: '生日', content: res.data.birthday },
{ par: 'phone', name: '手机号', content: res.data.phone },
{ par: 'faculty', name: '院系', content: res.data.faculty },
{ par: 'major', name: '专业', content: res.data.major },
{ par: 'year_age', name: '入学年份', content: res.data.year_age },
{ par: 'class_name', name: '班级', content: res.data.class_name },
]
}
// else {
// formModel.value = [
// { name: '', content: res.data.name },
// { name: '', content: res.data.id },
// { name: '', content: 9.9 },
// { name: '', content: 9.9 },
// { name: '', content: 9.9 },
// { name: '', content: 9.9 },
// { name: '', content: 9.9 },
// { name: '', content: 9.9 },
// { name: '', content: 9.9 },
// ]
// }
})
.catch((error) => {
console.error(error)
})
// getInfo(id)
// .then((res) => {
// // 访 getData
// console.log(res.data, '000000')
// identInfo.value = res.data
// //
// if (res.data.roleId === 1) {
// formModel.value = [
// { par: 'name', name: '', content: res.data.name },
// { par: 'sex', name: '', content: res.data.sex },
// { par: 'nationality', name: '', content: res.data.nationality },
// { par: 'profession', name: '', content: res.data.profession },
// { par: 'education', name: '', content: res.data.education },
// { par: 'degree', name: '', content: res.data.degree },
// {
// par: 'professionalTitle',
// name: '',
// content: res.data.professionalTitle,
// },
// {
// par: 'emergencyContact',
// name: '',
// content: res.data.emergencyContact,
// },
// {
// par: 'joinWorkTime',
// name: '',
// content: res.data.joinWorkTime,
// },
// {
// par: 'politicalStatus',
// name: '',
// content: res.data.politicalStatus,
// },
// ]
// } else if (res.data.roleId === 2) {
// formModel.value = [
// { par: 'name', name: '', content: res.data.name },
// { par: 'sex', name: '', content: res.data.sex },
// { par: 'nationality', name: '', content: res.data.nationality },
// { par: 'number', name: '', content: res.data.number },
// { par: 'birthday', name: '', content: res.data.birthday },
// { par: 'phone', name: '', content: res.data.phone },
// { par: 'faculty', name: '', content: res.data.faculty },
// { par: 'major', name: '', content: res.data.major },
// { par: 'year_age', name: '', content: res.data.year_age },
// { par: 'class_name', name: '', content: res.data.class_name },
// ]
// }
// // else {
// // formModel.value = [
// // { name: '', content: res.data.name },
// // { name: '', content: res.data.id },
// // { name: '', content: 9.9 },
// // { name: '', content: 9.9 },
// // { name: '', content: 9.9 },
// // { name: '', content: 9.9 },
// // { name: '', content: 9.9 },
// // { name: '', content: 9.9 },
// // { name: '', content: 9.9 },
// // ]
// // }
// })
// .catch((error) => {
// console.error(error)
// })
})
// 1
const drawer2 = ref(false)

@ -32,7 +32,7 @@ const getData = async () => {
} else {
rightVisible.value = false
}
// console.log(data.value.roles[0], 333333)
console.log(data.value, 333333)
})
.catch((error) => {
console.log(error)

@ -0,0 +1,40 @@
// vite.config.ts
import vue from "file:///D:/aaa/teaching/Teaching_integration_platform_admin_template/node_modules/.pnpm/@vitejs+plugin-vue@5.0.4_vite@5.1.4_vue@3.4.19/node_modules/@vitejs/plugin-vue/dist/index.mjs";
import path from "path";
import { viteMockServe } from "file:///D:/aaa/teaching/Teaching_integration_platform_admin_template/node_modules/.pnpm/vite-plugin-mock@3.0.1_esbuild@0.19.12_mockjs@1.1.0_vite@5.1.4/node_modules/vite-plugin-mock/dist/index.mjs";
import { createSvgIconsPlugin } from "file:///D:/aaa/teaching/Teaching_integration_platform_admin_template/node_modules/.pnpm/vite-plugin-svg-icons@2.0.1_vite@5.1.4/node_modules/vite-plugin-svg-icons/dist/index.mjs";
var vite_config_default = ({ command }) => {
return {
plugins: [
vue(),
viteMockServe({
enable: command === "serve"
}),
createSvgIconsPlugin({
// Specify the icon folder to be cached
iconDirs: [path.resolve(process.cwd(), "src/assets/icons")],
// Specify symbolId format
symbolId: "icon-[dir]-[name]"
})
],
resolve: {
alias: {
"@": path.resolve("./src")
// 相对路径别名配置,使用 @ 代替 src
}
},
// 配置scss
css: {
preprocessorOptions: {
scss: {
javascriptEnabled: true,
additionalData: '@import "./src/styles/variable.scss";'
}
}
}
};
};
export {
vite_config_default as default
};
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidml0ZS5jb25maWcudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCJEOlxcXFxhYWFcXFxcdGVhY2hpbmdcXFxcVGVhY2hpbmdfaW50ZWdyYXRpb25fcGxhdGZvcm1fYWRtaW5fdGVtcGxhdGVcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZmlsZW5hbWUgPSBcIkQ6XFxcXGFhYVxcXFx0ZWFjaGluZ1xcXFxUZWFjaGluZ19pbnRlZ3JhdGlvbl9wbGF0Zm9ybV9hZG1pbl90ZW1wbGF0ZVxcXFx2aXRlLmNvbmZpZy50c1wiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9pbXBvcnRfbWV0YV91cmwgPSBcImZpbGU6Ly8vRDovYWFhL3RlYWNoaW5nL1RlYWNoaW5nX2ludGVncmF0aW9uX3BsYXRmb3JtX2FkbWluX3RlbXBsYXRlL3ZpdGUuY29uZmlnLnRzXCI7aW1wb3J0IHsgZGVmaW5lQ29uZmlnIH0gZnJvbSAndml0ZSdcclxuaW1wb3J0IHZ1ZSBmcm9tICdAdml0ZWpzL3BsdWdpbi12dWUnXHJcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnXHJcbi8vIFx1NUJGQ1x1NTE2NW1vY2tcdTYzRDJcdTRFRjZcclxuaW1wb3J0IHsgdml0ZU1vY2tTZXJ2ZSB9IGZyb20gJ3ZpdGUtcGx1Z2luLW1vY2snXHJcbi8vIFx1NUJGQ1x1NTE2NXN2Z1x1OTE0RFx1N0Y2RVx1NjNEMlx1NEVGNlxyXG5pbXBvcnQgeyBjcmVhdGVTdmdJY29uc1BsdWdpbiB9IGZyb20gJ3ZpdGUtcGx1Z2luLXN2Zy1pY29ucydcclxuLy8gaHR0cHM6Ly92aXRlanMuZGV2L2NvbmZpZy9cclxuZXhwb3J0IGRlZmF1bHQgKHsgY29tbWFuZCB9OiBhbnkpID0+IHtcclxuICByZXR1cm4ge1xyXG4gICAgcGx1Z2luczogW1xyXG4gICAgICB2dWUoKSxcclxuICAgICAgdml0ZU1vY2tTZXJ2ZSh7XHJcbiAgICAgICAgZW5hYmxlOiBjb21tYW5kID09PSAnc2VydmUnLFxyXG4gICAgICB9KSxcclxuICAgICAgY3JlYXRlU3ZnSWNvbnNQbHVnaW4oe1xyXG4gICAgICAgIC8vIFNwZWNpZnkgdGhlIGljb24gZm9sZGVyIHRvIGJlIGNhY2hlZFxyXG4gICAgICAgIGljb25EaXJzOiBbcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksICdzcmMvYXNzZXRzL2ljb25zJyldLFxyXG4gICAgICAgIC8vIFNwZWNpZnkgc3ltYm9sSWQgZm9ybWF0XHJcbiAgICAgICAgc3ltYm9sSWQ6ICdpY29uLVtkaXJdLVtuYW1lXScsXHJcbiAgICAgIH0pLFxyXG4gICAgXSxcclxuICAgIHJlc29sdmU6IHtcclxuICAgICAgYWxpYXM6IHtcclxuICAgICAgICAnQCc6IHBhdGgucmVzb2x2ZSgnLi9zcmMnKSwgLy8gXHU3NkY4XHU1QkY5XHU4REVGXHU1Rjg0XHU1MjJCXHU1NDBEXHU5MTREXHU3RjZFXHVGRjBDXHU0RjdGXHU3NTI4IEAgXHU0RUUzXHU2NkZGIHNyY1xyXG4gICAgICB9LFxyXG4gICAgfSxcclxuICAgIC8vIFx1OTE0RFx1N0Y2RXNjc3NcclxuICAgIGNzczoge1xyXG4gICAgICBwcmVwcm9jZXNzb3JPcHRpb25zOiB7XHJcbiAgICAgICAgc2Nzczoge1xyXG4gICAgICAgICAgamF2YXNjcmlwdEVuYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgICBhZGRpdGlvbmFsRGF0YTogJ0BpbXBvcnQgXCIuL3NyYy9zdHlsZXMvdmFyaWFibGUuc2Nzc1wiOycsXHJcbiAgICAgICAgfSxcclxuICAgICAgfSxcclxuICAgIH0sXHJcbiAgfVxyXG59XHJcbiJdLAogICJtYXBwaW5ncyI6ICI7QUFDQSxPQUFPLFNBQVM7QUFDaEIsT0FBTyxVQUFVO0FBRWpCLFNBQVMscUJBQXFCO0FBRTlCLFNBQVMsNEJBQTRCO0FBRXJDLElBQU8sc0JBQVEsQ0FBQyxFQUFFLFFBQVEsTUFBVztBQUNuQyxTQUFPO0FBQUEsSUFDTCxTQUFTO0FBQUEsTUFDUCxJQUFJO0FBQUEsTUFDSixjQUFjO0FBQUEsUUFDWixRQUFRLFlBQVk7QUFBQSxNQUN0QixDQUFDO0FBQUEsTUFDRCxxQkFBcUI7QUFBQTtBQUFBLFFBRW5CLFVBQVUsQ0FBQyxLQUFLLFFBQVEsUUFBUSxJQUFJLEdBQUcsa0JBQWtCLENBQUM7QUFBQTtBQUFBLFFBRTFELFVBQVU7QUFBQSxNQUNaLENBQUM7QUFBQSxJQUNIO0FBQUEsSUFDQSxTQUFTO0FBQUEsTUFDUCxPQUFPO0FBQUEsUUFDTCxLQUFLLEtBQUssUUFBUSxPQUFPO0FBQUE7QUFBQSxNQUMzQjtBQUFBLElBQ0Y7QUFBQTtBQUFBLElBRUEsS0FBSztBQUFBLE1BQ0gscUJBQXFCO0FBQUEsUUFDbkIsTUFBTTtBQUFBLFVBQ0osbUJBQW1CO0FBQUEsVUFDbkIsZ0JBQWdCO0FBQUEsUUFDbEI7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFDRjsiLAogICJuYW1lcyI6IFtdCn0K
Loading…
Cancel
Save