黄琪勇 1 год назад
Родитель
Сommit
4f1a2680ae
67 измененных файлов с 371 добавлено и 122 удалено
  1. 1 1
      .env.production
  2. 0 0
      dist/css/123.85e4bef5.css
  3. 0 0
      dist/css/185.f54f1fa6.css
  4. 0 0
      dist/css/205.3232b409.css
  5. 0 0
      dist/css/331.110ae54c.css
  6. 0 0
      dist/css/456.22f1067d.css
  7. 0 0
      dist/css/648.9b1217ea.css
  8. 0 0
      dist/css/70.4feb1675.css
  9. 0 0
      dist/css/707.544ad7cb.css
  10. 0 0
      dist/css/887.521489f0.css
  11. 0 0
      dist/css/app.f2fa21f6.css
  12. 0 0
      dist/css/app.fa1db349.css
  13. BIN
      dist/img/bg.2556dca4.png
  14. BIN
      dist/img/bg.77027f4a.png
  15. BIN
      dist/img/closeHover.fa7f9d7d.png
  16. BIN
      dist/img/empty1.11055c96.png
  17. BIN
      dist/img/userImg.661e0058.png
  18. BIN
      dist/img/yy.7d0740b0.png
  19. 1 1
      dist/index.html
  20. 0 0
      dist/js/123.f03b5c32.js
  21. 0 0
      dist/js/185.6e59bf48.js
  22. 0 0
      dist/js/185.851774bc.js
  23. 1 0
      dist/js/205.d071dec0.js
  24. 0 0
      dist/js/331.a77874ee.js
  25. 0 1
      dist/js/456.7ce77d06.js
  26. 0 0
      dist/js/528.d8693d0f.js
  27. 0 0
      dist/js/544.2c26baa8.js
  28. 0 0
      dist/js/648.a2968cf4.js
  29. 1 0
      dist/js/70.cac9c20b.js
  30. 0 0
      dist/js/875.4cfa7e4a.js
  31. 0 1
      dist/js/887.a641f969.js
  32. 0 0
      dist/js/app.afe4400b.js
  33. 0 0
      dist/js/app.bc95da51.js
  34. 0 0
      dist/js/chunk-vendors.6e1fffa1.js
  35. 42 0
      src/assets/elementTheme.scss
  36. 76 0
      src/components/ellipsisScroll/ellipsisScroll.vue
  37. 2 0
      src/components/ellipsisScroll/index.ts
  38. 1 1
      src/components/tooltipAutoShow/tooltipAutoShow.vue
  39. 6 3
      src/hooks/useDialogConfirm/dialogConfirm.vue
  40. 1 1
      src/hooks/useDialogConfirm/index.scss
  41. BIN
      src/img/cloudTextbooks/hd.png
  42. BIN
      src/img/cloudTextbooks/hd1.png
  43. BIN
      src/img/cloudTextbooks/yy.png
  44. BIN
      src/img/homePage/bg.png
  45. BIN
      src/img/layout/userImg.png
  46. BIN
      src/img/loginErr/border.png
  47. BIN
      src/img/useDialogConfirm/closeHover.png
  48. 1 1
      src/libs/auth.ts
  49. 11 7
      src/views/cloudTextbooks/chooseDialog.vue
  50. 99 29
      src/views/cloudTextbooks/cloudTextbooks.vue
  51. 1 0
      src/views/coursewarePlay/component/point.module.scss
  52. 9 1
      src/views/coursewarePlay/component/points.tsx
  53. 1 1
      src/views/coursewarePlay/component/tool.tsx
  54. 3 1
      src/views/coursewarePlay/component/video-item/index.module.scss
  55. 5 6
      src/views/coursewarePlay/component/video-item/index.tsx
  56. BIN
      src/views/coursewarePlay/image/iconImageActive.png
  57. BIN
      src/views/coursewarePlay/image/iconLoop.png
  58. BIN
      src/views/coursewarePlay/image/iconLoopActive.png
  59. BIN
      src/views/coursewarePlay/image/iconSongActive.png
  60. BIN
      src/views/coursewarePlay/image/iconVideoActive.png
  61. 1 0
      src/views/coursewarePlay/index.module.scss
  62. 35 25
      src/views/coursewarePlay/index.tsx
  63. 6 1
      src/views/homePage/components/navContainer/navContainer.vue
  64. 15 5
      src/views/homePage/homePage_gym.vue
  65. 15 5
      src/views/homePage/homePage_gyt.vue
  66. 7 6
      src/viewsframe/layout/layout.vue
  67. 30 25
      src/viewsframe/login/login.vue

+ 1 - 1
.env.production

@@ -1,6 +1,6 @@
 # 生产环境
 
-VUE_APP_URL = "https://online.resource.colexiu.com/cbs-app"
+VUE_APP_URL = "https://mec.colexiu.com/cbs-app"
 VUE_APP_URL_GYM = "https://online.dayaedu.com"
 VUE_APP_URL_GYT = "https://online.lexiaoya.cn"
 

Разница между файлами не показана из-за своего большого размера
+ 0 - 0
dist/css/123.85e4bef5.css


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
dist/css/185.f54f1fa6.css


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
dist/css/205.3232b409.css


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
dist/css/331.110ae54c.css


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
dist/css/456.22f1067d.css


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
dist/css/648.9b1217ea.css


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
dist/css/70.4feb1675.css


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
dist/css/707.544ad7cb.css


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
dist/css/887.521489f0.css


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
dist/css/app.f2fa21f6.css


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
dist/css/app.fa1db349.css


BIN
dist/img/bg.2556dca4.png


BIN
dist/img/bg.77027f4a.png


BIN
dist/img/closeHover.fa7f9d7d.png


BIN
dist/img/empty1.11055c96.png


BIN
dist/img/userImg.661e0058.png


BIN
dist/img/yy.7d0740b0.png


+ 1 - 1
dist/index.html

@@ -1,3 +1,3 @@
 <!doctype html><html lang=""><head><meta charset="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="renderer" content="webkit"/><meta name="force-rendering" content="webkit"/><link rel="icon" href="/favicon.ico"/><title>乐教通</title><script>if (!!window.ActiveXObject || "ActiveXObject" in window) {
             window.location.href = "./ieIncompatible/index.html"
-         }</script><script defer="defer" src="/js/chunk-vendors.8b78c20f.js"></script><script defer="defer" src="/js/app.afe4400b.js"></script><link href="/css/app.f2fa21f6.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but classroom doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div></body></html>
+         }</script><script defer="defer" src="/js/chunk-vendors.6e1fffa1.js"></script><script defer="defer" src="/js/app.bc95da51.js"></script><link href="/css/app.fa1db349.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but classroom doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div></body></html>

Разница между файлами не показана из-за своего большого размера
+ 0 - 0
dist/js/123.f03b5c32.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
dist/js/185.6e59bf48.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
dist/js/185.851774bc.js


+ 1 - 0
dist/js/205.d071dec0.js

@@ -0,0 +1 @@
+"use strict";(self["webpackChunkclassroom"]=self["webpackChunkclassroom"]||[]).push([[205],{8542:function(e,a,s){s.r(a),s.d(a,{default:function(){return h}});s(7658);var n=s(3396),l=s(4870),i=s(7139),m=s(4539),c=s(2483),t=s(8463);const u={class:"homePage"},o={class:"classTypes"},r=["onClick"],g=["src"],d={class:"courseBoard"},p={class:"details"};var v=(0,n.aZ)({__name:"homePage_gyt",setup(e){const a=(0,c.tv)(),v={img:s(5824)},_=[{name:"主页"}],f=[{img:s(7339),name:"课表",url:""},{img:s(498),name:"课后作业",url:""},{img:s(7619),name:"阶段自测",url:""},{img:s(8712),name:"练习情况",url:""},{img:s(6876),name:"云练习",url:""},{img:s(2341),name:"云教材",url:"/cloudTextbooks"}];function h(e){e?a.push(e):(0,t.Z)({headImg:s(7799),text:"该功能暂未开放,请敬请期待哦~",btnShow:[!0]})}return(e,a)=>{const c=(0,n.up)("el-empty");return(0,n.wg)(),(0,n.j4)((0,l.SU)(m.Z),{class:"navContainer",headImg:v,navs:_},{default:(0,n.w5)((()=>[(0,n._)("div",u,[(0,n._)("div",o,[((0,n.wg)(),(0,n.iD)(n.HY,null,(0,n.Ko)(f,(e=>(0,n._)("div",{class:"classType",key:e.name,onClick:a=>h(e.url)},[(0,n._)("img",{src:e.img},null,8,g),(0,n._)("div",null,(0,i.zw)(e.name),1)],8,r))),64))]),(0,n._)("div",d,[(0,n._)("div",p,[(0,n.Wm)(c,{style:{"margin-top":"50px"},"image-size":360,image:s(5572),description:"您还没有待上课程哦~"},null,8,["image"])])])])])),_:1})}}}),_=s(89);const f=(0,_.Z)(v,[["__scopeId","data-v-1f392ac4"]]);var h=f},7619:function(e,a,s){e.exports=s.p+"img/jdzc.db83d289.png"}}]);

Разница между файлами не показана из-за своего большого размера
+ 0 - 0
dist/js/331.a77874ee.js


+ 0 - 1
dist/js/456.7ce77d06.js

@@ -1 +0,0 @@
-"use strict";(self["webpackChunkclassroom"]=self["webpackChunkclassroom"]||[]).push([[456],{2008:function(e,a,s){s.r(a),s.d(a,{default:function(){return h}});s(7658);var n=s(3396),l=s(4870),i=s(7139),m=s(8197),c=s(2483),u=s(8049);const o={class:"homePage"},r={class:"classTypes"},t=["onClick"],d=["src"],g={class:"courseBoard"},p={class:"details"};var v=(0,n.aZ)({__name:"homePage_gym",setup(e){const a=(0,c.tv)(),v={img:s(5824)},_=[{name:"主页"}],f=[{img:s(7339),name:"课表",url:""},{img:s(498),name:"训练",url:""},{img:s(2796),name:"进度测评",url:""},{img:s(8712),name:"训练统计",url:""},{img:s(6876),name:"云教练",url:""},{img:s(2341),name:"云教程",url:"/cloudTextbooks"}];function h(e){e?a.push(e):(0,u.Z)({headImg:s(7799),text:"该功能暂未开放,请敬请期待哦~",btnShow:[!0]})}return(e,a)=>{const c=(0,n.up)("el-empty");return(0,n.wg)(),(0,n.j4)((0,l.SU)(m.Z),{class:"navContainer",headImg:v,navs:_},{default:(0,n.w5)((()=>[(0,n._)("div",o,[(0,n._)("div",r,[((0,n.wg)(),(0,n.iD)(n.HY,null,(0,n.Ko)(f,(e=>(0,n._)("div",{class:"classType",key:e.name,onClick:a=>h(e.url)},[(0,n._)("img",{src:e.img},null,8,d),(0,n._)("div",null,(0,i.zw)(e.name),1)],8,t))),64))]),(0,n._)("div",g,[(0,n._)("div",p,[(0,n.Wm)(c,{"image-size":360,image:s(9449),description:"您还没有待上课程哦~"},null,8,["image"])])])])])),_:1})}}}),_=s(89);const f=(0,_.Z)(v,[["__scopeId","data-v-5d2e8dbd"]]);var h=f},2796:function(e,a,s){e.exports=s.p+"img/jdcp.99bf4a61.png"}}]);

Разница между файлами не показана из-за своего большого размера
+ 0 - 0
dist/js/528.d8693d0f.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
dist/js/544.2c26baa8.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
dist/js/648.a2968cf4.js


+ 1 - 0
dist/js/70.cac9c20b.js

@@ -0,0 +1 @@
+"use strict";(self["webpackChunkclassroom"]=self["webpackChunkclassroom"]||[]).push([[70],{3691:function(e,a,s){s.r(a),s.d(a,{default:function(){return h}});s(7658);var n=s(3396),l=s(4870),i=s(7139),m=s(4539),c=s(2483),t=s(8463);const u={class:"homePage"},o={class:"classTypes"},r=["onClick"],g=["src"],d={class:"courseBoard"},p={class:"details"};var v=(0,n.aZ)({__name:"homePage_gym",setup(e){const a=(0,c.tv)(),v={img:s(5824)},_=[{name:"主页"}],f=[{img:s(7339),name:"课表",url:""},{img:s(498),name:"训练",url:""},{img:s(2796),name:"进度测评",url:""},{img:s(8712),name:"训练统计",url:""},{img:s(6876),name:"云教练",url:""},{img:s(2341),name:"云教程",url:"/cloudTextbooks"}];function h(e){e?a.push(e):(0,t.Z)({headImg:s(7799),text:"该功能暂未开放,请敬请期待哦~",btnShow:[!0]})}return(e,a)=>{const c=(0,n.up)("el-empty");return(0,n.wg)(),(0,n.j4)((0,l.SU)(m.Z),{class:"navContainer",headImg:v,navs:_},{default:(0,n.w5)((()=>[(0,n._)("div",u,[(0,n._)("div",o,[((0,n.wg)(),(0,n.iD)(n.HY,null,(0,n.Ko)(f,(e=>(0,n._)("div",{class:"classType",key:e.name,onClick:a=>h(e.url)},[(0,n._)("img",{src:e.img},null,8,g),(0,n._)("div",null,(0,i.zw)(e.name),1)],8,r))),64))]),(0,n._)("div",d,[(0,n._)("div",p,[(0,n.Wm)(c,{style:{"margin-top":"50px"},"image-size":360,image:s(5572),description:"您还没有待上课程哦~"},null,8,["image"])])])])])),_:1})}}}),_=s(89);const f=(0,_.Z)(v,[["__scopeId","data-v-fb8ccea0"]]);var h=f},2796:function(e,a,s){e.exports=s.p+"img/jdcp.99bf4a61.png"}}]);

Разница между файлами не показана из-за своего большого размера
+ 0 - 0
dist/js/875.4cfa7e4a.js


+ 0 - 1
dist/js/887.a641f969.js

@@ -1 +0,0 @@
-"use strict";(self["webpackChunkclassroom"]=self["webpackChunkclassroom"]||[]).push([[887],{546:function(e,a,s){s.r(a),s.d(a,{default:function(){return h}});s(7658);var n=s(3396),l=s(4870),i=s(7139),m=s(8197),c=s(2483),u=s(8049);const t={class:"homePage"},o={class:"classTypes"},r=["onClick"],d=["src"],g={class:"courseBoard"},p={class:"details"};var v=(0,n.aZ)({__name:"homePage_gyt",setup(e){const a=(0,c.tv)(),v={img:s(5824)},_=[{name:"主页"}],f=[{img:s(7339),name:"课表",url:""},{img:s(498),name:"课后作业",url:""},{img:s(7619),name:"阶段自测",url:""},{img:s(8712),name:"练习情况",url:""},{img:s(6876),name:"云练习",url:""},{img:s(2341),name:"云教材",url:"/cloudTextbooks"}];function h(e){e?a.push(e):(0,u.Z)({headImg:s(7799),text:"该功能暂未开放,请敬请期待哦~",btnShow:[!0]})}return(e,a)=>{const c=(0,n.up)("el-empty");return(0,n.wg)(),(0,n.j4)((0,l.SU)(m.Z),{class:"navContainer",headImg:v,navs:_},{default:(0,n.w5)((()=>[(0,n._)("div",t,[(0,n._)("div",o,[((0,n.wg)(),(0,n.iD)(n.HY,null,(0,n.Ko)(f,(e=>(0,n._)("div",{class:"classType",key:e.name,onClick:a=>h(e.url)},[(0,n._)("img",{src:e.img},null,8,d),(0,n._)("div",null,(0,i.zw)(e.name),1)],8,r))),64))]),(0,n._)("div",g,[(0,n._)("div",p,[(0,n.Wm)(c,{"image-size":360,image:s(9449),description:"您还没有待上课程哦~"},null,8,["image"])])])])])),_:1})}}}),_=s(89);const f=(0,_.Z)(v,[["__scopeId","data-v-152defe9"]]);var h=f},7619:function(e,a,s){e.exports=s.p+"img/jdzc.db83d289.png"}}]);

Разница между файлами не показана из-за своего большого размера
+ 0 - 0
dist/js/app.afe4400b.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
dist/js/app.bc95da51.js


+ 0 - 0
dist/js/chunk-vendors.8b78c20f.js → dist/js/chunk-vendors.6e1fffa1.js


+ 42 - 0
src/assets/elementTheme.scss

@@ -25,3 +25,45 @@
    font-size: 22px;
    color: #aaaaaa;
 }
+
+.el-cascader__dropdown {
+   .el-cascader-menu__list {
+      padding: 12px 0;
+   }
+   .el-cascader-node:not(.is-disabled):hover,
+   .el-cascader-node:not(.is-disabled):focus {
+      background-color: transparent;
+   }
+   .el-cascader-menu:last-child .el-cascader-node {
+      padding: 0 8px;
+   }
+   .el-cascader-node__prefix {
+      display: none;
+   }
+   .is-active .el-cascader-node__label {
+      color: #994d1c;
+   }
+   .el-cascader-node__label {
+      font-size: 16px;
+      line-height: 40px;
+      border-radius: 8px;
+      &:hover {
+         color: #994d1c;
+         background: #fff3d7;
+      }
+   }
+}
+
+.el-popper.is-light {
+   box-shadow: rgba(0, 0, 0, 0.08) 0px 2px 17px 0px;
+   border-radius: 12px;
+   border: none;
+   .el-popper__arrow {
+      display: none;
+   }
+}
+
+.el-scrollbar__thumb {
+   opacity: 1;
+   background-color: #ececec;
+}

+ 76 - 0
src/components/ellipsisScroll/ellipsisScroll.vue

@@ -0,0 +1,76 @@
+<!--
+* @FileDescription: 文本超出显示省略号 移动鼠标上去滚动显示
+* @Author: 黄琪勇
+* @Date:2024-03-25 11:50:36
+-->
+<template>
+   <div class="xx">
+      <div ref="ellipsisScrollDom" :class="{ isScroll: isScroll }" class="ellipsisScroll">
+         {{ props.title }}
+      </div>
+   </div>
+</template>
+
+<script setup lang="ts">
+import { ref, onMounted, onUnmounted } from "vue"
+
+const props = defineProps<{
+   title: string
+}>()
+
+const ellipsisScrollDom = ref<HTMLElement>()
+const isScroll = ref(false)
+
+onMounted(() => {
+   ellipsisScrollDom.value?.addEventListener("mouseenter", handleIsScroll)
+   ellipsisScrollDom.value?.addEventListener("mouseleave", handleLeaveScroll)
+})
+onUnmounted(() => {
+   ellipsisScrollDom.value?.removeEventListener("mouseenter", handleIsScroll)
+   ellipsisScrollDom.value?.removeEventListener("mouseleave", handleLeaveScroll)
+})
+
+let widthCalc = 0
+
+function handleIsScroll(e: MouseEvent) {
+   const target = e.target as HTMLElement
+   widthCalc = target.scrollWidth - target.clientWidth
+   if (widthCalc > 0) {
+      isScroll.value = true
+   } else {
+      isScroll.value = false
+   }
+}
+function handleLeaveScroll() {
+   isScroll.value = false
+}
+</script>
+
+<style lang="scss" scoped>
+.xx {
+   width: 100%;
+}
+.ellipsisScroll {
+   width: 100%;
+   display: inline-block;
+   white-space: nowrap;
+   text-overflow: ellipsis;
+   overflow: hidden;
+   line-height: 16px;
+   &.isScroll {
+      &:hover {
+         width: auto;
+         overflow: visible;
+         animation: 3s roll linear infinite normal;
+      }
+      @keyframes roll {
+         0% {
+            transform: translateX(0);
+         }
+         100% {
+            transform: translateX(-clac(100% - v-bind(widthCalc + "px")));
+         }
+      }
+   }
+}
+</style>

+ 2 - 0
src/components/ellipsisScroll/index.ts

@@ -0,0 +1,2 @@
+import ellipsisScroll from "./ellipsisScroll.vue"
+export default ellipsisScroll

+ 1 - 1
src/components/tooltipAutoShow/tooltipAutoShow.vue

@@ -6,7 +6,7 @@
 <template>
    <el-tooltip :placement="props.placement" :disabled="disabled">
       <template #content>
-         <div :style="{ maxWidth: `${props.maxWidth}px` }">{{ props.title }}</div>
+         <div :style="{ width: `${props.maxWidth}px` }">{{ props.title }}</div>
       </template>
       <div ref="tooltipDom" class="tooltipAutoShow">{{ props.title }}</div>
    </el-tooltip>

+ 6 - 3
src/hooks/useDialogConfirm/dialogConfirm.vue

@@ -5,9 +5,7 @@
 -->
 <template>
    <div class="dialogConfirm">
-      <div class="close" @click="close">
-         <img src="@/img/useDialogConfirm/close.png" />
-      </div>
+      <div class="close" @click="close"></div>
       <img class="headImg" v-if="props.modalData.headImg" :src="props.modalData.headImg" />
       <div class="textCon">
          <div class="text">{{ props.modalData.text }}</div>
@@ -66,6 +64,11 @@ function ok() {
       width: 42px;
       height: 44px;
       cursor: pointer;
+      background: url("@/img/useDialogConfirm/close.png") no-repeat;
+      &:hover {
+         background: url("@/img/useDialogConfirm/closeHover.png") no-repeat;
+         background-size: cover;
+      }
    }
    .headImg {
       position: absolute;

+ 1 - 1
src/hooks/useDialogConfirm/index.scss

@@ -5,7 +5,7 @@
    }
    .modalFrameBox {
       background: linear-gradient(180deg, #fdfef2 0%, #fdf6de 100%);
-      box-shadow: 0px 7px 10px 0px #6e6e6e, 0px 5px 0px 0px #ca8e2d;
+      box-shadow: 0px 5px 0px 0px #ca8e2d, 0px 7px 10px 0px #6e6e6e;
       border-radius: 20px;
       border: 8px solid #ffdd98;
       position: relative;

BIN
src/img/cloudTextbooks/hd.png


BIN
src/img/cloudTextbooks/hd1.png


BIN
src/img/cloudTextbooks/yy.png


BIN
src/img/homePage/bg.png


BIN
src/img/layout/userImg.png


BIN
src/img/loginErr/border.png


BIN
src/img/useDialogConfirm/closeHover.png


+ 1 - 1
src/libs/auth.ts

@@ -2,7 +2,7 @@ import Cookies from "js-cookie"
 
 /* code */
 // eslint-disable-next-line prefer-const
-export let CODE401 = 401 //没有权限   管乐迷为401  管乐团为5000
+export let CODE401 = 403 //没有权限   管乐迷为403  管乐团为5000
 export function setCODE401(code: number) {
    CODE401 = code
 }

+ 11 - 7
src/views/cloudTextbooks/chooseDialog.vue

@@ -5,9 +5,7 @@
 -->
 <template>
    <div class="chooseDialog">
-      <div class="close" @click="close">
-         <img src="@/img/useDialogConfirm/close.png" />
-      </div>
+      <div class="close" @click="close"></div>
       <div class="chooseCon" v-loading="loading">
          <img class="imgMid" src="@/img/cloudTextbooks/shu.png" />
          <div class="chooseBox" v-for="(listDetails, index) in listDetailData" :key="index">
@@ -62,10 +60,11 @@ function close() {
 }
 
 function handlePaly(id: string) {
-   emits("onClose")
-   router.push({
-      path: "/coursewarePlay/" + id
-   })
+   const url = router.resolve({
+      name: "coursewarePlay",
+      params: { id }
+   }).href
+   window.open(url, "_blank")
 }
 </script>
 
@@ -81,6 +80,11 @@ function handlePaly(id: string) {
       width: 42px;
       height: 44px;
       cursor: pointer;
+      background: url("@/img/useDialogConfirm/close.png") no-repeat;
+      &:hover {
+         background: url("@/img/useDialogConfirm/closeHover.png") no-repeat;
+         background-size: cover;
+      }
    }
    .chooseCon {
       width: 100%;

+ 99 - 29
src/views/cloudTextbooks/cloudTextbooks.vue

@@ -12,11 +12,14 @@
                <el-input
                   @keyup.enter="handleQuery"
                   @input="handleInputQuery"
+                  @focus="handleInputFocus"
+                  @blur="handleInputBlur"
                   v-model="queryStr"
                   style="max-width: 600px"
                   placeholder="请输入教材名称"
                   clearable
                   class="iptSelect"
+                  :class="{ isInputFocus: isInputFocus }"
                >
                   <template #prepend>
                      <img src="@/img/cloudTextbooks/ss.png" />
@@ -32,20 +35,26 @@
                <div class="cloudTextbooksBox">
                   <div class="bookshelf" v-for="(list, index) in listData" :key="index">
                      <div class="book" v-for="item in list" :key="item.id">
-                        <ElImage class="img" :src="item.img" @click="handleClick(item.id)" />
+                        <div class="imgCon">
+                           <ElImage class="img" :src="item.img" @click="handleClick(item.id)" />
+                           <img class="imgbg" src="@/img/cloudTextbooks/yy.png" />
+                           <img class="imgbg1" src="@/img/cloudTextbooks/hd1.png" />
+                           <img class="imgbg2" src="@/img/cloudTextbooks/hd.png" />
+                           <div class="courseNum" @click="handleClick(item.id)">共{{ item.courseNum }}课</div>
+                        </div>
                         <div class="name">{{ item.name }}</div>
-                        <div class="courseNum">共{{ item.courseNum }}课</div>
                      </div>
                   </div>
-                  <el-empty
-                     v-if="!listData.length && !loading"
-                     :image-size="360"
-                     :image="require('@/img/layout/empty.png')"
-                     description="暂无搜索结果"
-                  />
                </div>
             </ElScrollbar>
          </div>
+         <el-empty
+            class="empty"
+            v-if="!listData.length && !loading"
+            :image-size="360"
+            :image="require('@/img/layout/empty.png')"
+            description="暂无搜索结果"
+         />
       </div>
    </navContainer>
 </template>
@@ -81,6 +90,15 @@ const classType = ref("")
 const classTypeOpt = shallowRef<{ value: string; label: string }[]>([])
 const queryStr = ref("")
 
+// 选中样式
+const isInputFocus = ref(false)
+function handleInputFocus() {
+   isInputFocus.value = true
+}
+function handleInputBlur() {
+   isInputFocus.value = false
+}
+
 handleGetClassTypeOpt()
 handleGetList()
 
@@ -147,6 +165,7 @@ function handleClick(id: string) {
 .cloudTextbooks {
    width: 100%;
    height: 100%;
+   position: relative;
    .headCon {
       padding: 40px 26px;
       display: flex;
@@ -166,17 +185,26 @@ function handleClick(id: string) {
             .el-input__wrapper {
                border-radius: 20px;
                box-shadow: none;
-               padding: 1px 26px;
+               padding: 1px 26px 1px 16px;
+               border: 1px solid transparent;
+               &.is-focus {
+                  border-color: #ff8057 !important;
+                  box-shadow: 0px 0px 4px 0px rgba(255, 155, 109) !important;
+               }
                .el-input__inner {
                   --el-input-inner-height: 40px;
-                  text-align: center;
                }
             }
          }
+         .isInputFocus {
+            border-color: #ff8057 !important;
+            box-shadow: 0px 0px 4px 0px rgba(255, 155, 109);
+         }
          & > :deep(.iptSelect) {
+            border: 1px solid transparent;
             margin-left: 12px;
             width: 382px;
-            background: #ffffff;
+            background: #fff;
             border-radius: 21px;
             &.el-input {
                --el-input-text-color: #333;
@@ -232,6 +260,7 @@ function handleClick(id: string) {
          flex-direction: column;
          align-items: center;
          min-width: 1500px;
+         padding-top: 10px;
          .bookshelf {
             width: 1500px;
             padding: 0 116px;
@@ -248,38 +277,79 @@ function handleClick(id: string) {
                width: 20%;
                text-align: center;
                position: relative;
-               .img {
-                  cursor: pointer;
+               padding-top: 4px;
+               .imgCon {
                   width: 172px;
                   height: 212px;
+                  display: inline-block;
+                  position: relative;
                   &:hover {
-                     opacity: $opacity-hover;
+                     transform: translateY(-4px);
+                  }
+                  .img {
+                     cursor: pointer;
+                     width: 172px;
+                     height: 212px;
+                  }
+                  .imgbg {
+                     position: absolute;
+                     top: -20px;
+                     right: -50px;
+                     width: 76px;
+                     height: 247px;
+                  }
+                  .imgbg1 {
+                     position: absolute;
+                     top: 0px;
+                     right: -4px;
+                     width: 4px;
+                     height: 212px;
+                  }
+                  .imgbg2 {
+                     position: absolute;
+                     top: 0px;
+                     left: 0px;
+                     width: 9px;
+                     height: 212px;
+                  }
+                  .courseNum {
+                     cursor: pointer;
+                     position: absolute;
+                     left: 50%;
+                     bottom: 10px;
+                     transform: translateX(-50%);
+                     background: #ffffff;
+                     padding: 0 10px;
+                     border-radius: 13px;
+                     opacity: 0.83;
+                     line-height: 25px;
+                     font-weight: 400;
+                     font-size: 16px;
+                     color: #6b3c2d;
                   }
                }
                .name {
-                  margin-top: 50px;
+                  margin-top: 48px;
                   font-weight: 400;
                   font-size: 19px;
                   color: #393939;
                   line-height: 26px;
                }
-               .courseNum {
-                  position: absolute;
-                  left: 50%;
-                  top: 176px;
-                  transform: translateX(-50%);
-                  background: #ffffff;
-                  padding: 0 10px;
-                  border-radius: 13px;
-                  opacity: 0.83;
-                  line-height: 25px;
-                  font-weight: 400;
-                  font-size: 16px;
-                  color: #6b3c2d;
-               }
             }
          }
       }
    }
+   .empty {
+      position: absolute;
+      top: 50%;
+      left: 50%;
+      transform: translate(-50%, -50%);
+   }
+}
+:global(.headDropdown.el-dropdown__popper.el-popper) {
+   box-shadow: 0px 2px 17px 0px rgba(0, 0, 0, 0.08);
+   background: #ffffff;
+   border-radius: 16px;
+   inset: 84px 54px auto auto !important;
 }
 </style>

+ 1 - 0
src/views/coursewarePlay/component/point.module.scss

@@ -104,6 +104,7 @@
    }
 }
 .item {
+   cursor: pointer;
    display: flex;
    align-items: center;
    justify-content: flex-start;

+ 9 - 1
src/views/coursewarePlay/component/points.tsx

@@ -1,7 +1,15 @@
 import { defineComponent, reactive, watch } from "vue"
 import styles from "./point.module.scss"
 import icons from "../image/icons.json"
-const { iconArrow, iconImage, iconImageActive, iconVideo, iconVideoActive, iconSong, iconSongActive } = icons
+const { iconArrow, iconImage, iconVideo, iconSong } = icons
+
+// eslint-disable-next-line @typescript-eslint/no-var-requires
+const iconVideoActive = require("../image/iconVideoActive.png")
+// eslint-disable-next-line @typescript-eslint/no-var-requires
+const iconImageActive = require("../image/iconImageActive.png")
+// eslint-disable-next-line @typescript-eslint/no-var-requires
+const iconSongActive = require("../image/iconSongActive.png")
+
 import iconZhibo from "../image/icon-load.gif"
 import { Collapse, CollapseItem, Icon, Image } from "vant"
 export default defineComponent({

+ 1 - 1
src/views/coursewarePlay/component/tool.tsx

@@ -3,7 +3,7 @@ import { defineComponent } from "vue"
 import styles from "./tool.module.scss"
 import iconPen from "../image/icon-pen.png"
 
-export type ToolType = "init" | "pen"
+export type ToolType = "init" | "pen" | "white"
 
 export type ToolItem = {
    type: ToolType

+ 3 - 1
src/views/coursewarePlay/component/video-item/index.module.scss

@@ -54,9 +54,11 @@
             width: 100%;
             height: 100%;
          }
+         .plyr__progress input[type="range"] {
+            color: #ff8057 !important;
+         }
       }
    }
-
    .actions {
       display: flex;
       justify-content: space-between;

+ 5 - 6
src/views/coursewarePlay/component/video-item/index.tsx

@@ -6,7 +6,10 @@ import styles from "./index.module.scss"
 import icons from "../../image/icons.json"
 
 const { iconVideoBg, iconPlay, iconPause, iconSpeed } = icons
-
+// eslint-disable-next-line @typescript-eslint/no-var-requires
+const iconLoopActive = require("../../image/iconLoopActive.png")
+// eslint-disable-next-line @typescript-eslint/no-var-requires
+const iconLoop = require("../../image/iconLoop.png")
 import { Slider } from "vant"
 
 export default defineComponent({
@@ -25,10 +28,6 @@ export default defineComponent({
    },
    emits: ["play", "pause", "ended", "close"],
    setup(props, { emit, expose }) {
-      // eslint-disable-next-line @typescript-eslint/no-var-requires
-      const iconLoopActive = require("../../image/iconLoopActive.png")
-      // eslint-disable-next-line @typescript-eslint/no-var-requires
-      const iconLoop = require("../../image/iconLoop.png")
       const { item } = toRefs(props)
       const data = reactive({
          videoContianerRef: null as unknown as HTMLAudioElement,
@@ -122,7 +121,7 @@ export default defineComponent({
                 </div>
                 <div class="${styles.actions}">
                     <div class="${styles.actionWrap}">
-                        <div id="${playBtnId}" class="${styles.actionBtn}">
+                        <div id="${playBtnId}" class="${styles.actionBtn}" style="margin-right: 24px;">
                             <div class="van-loading van-loading--circular" aria-live="polite" aria-busy="true"><span class="van-loading__spinner van-loading__spinner--circular" style="color: rgb(255, 255, 255);"><svg class="van-loading__circular" viewBox="25 25 50 50"><circle cx="50" cy="50" r="20" fill="none"></circle></svg></span></div>
                             <img class="${styles.playIcon}" src="${iconPlay}" />
                             <img class="${styles.playIcon}" src="${iconPause}" />

BIN
src/views/coursewarePlay/image/iconImageActive.png


BIN
src/views/coursewarePlay/image/iconLoop.png


BIN
src/views/coursewarePlay/image/iconLoopActive.png


BIN
src/views/coursewarePlay/image/iconSongActive.png


BIN
src/views/coursewarePlay/image/iconVideoActive.png


+ 1 - 0
src/views/coursewarePlay/index.module.scss

@@ -206,6 +206,7 @@
 }
 
 .btnsWrap {
+   user-select: none;
    background: rgba(51, 51, 51, 0.4);
    border-radius: 6px;
    overflow: hidden;

+ 35 - 25
src/views/coursewarePlay/index.tsx

@@ -11,7 +11,7 @@ const state = {
    platformApi: "/api",
    platformType: "TEACHER"
 }
-import { useRoute, useRouter } from "vue-router"
+import { useRoute } from "vue-router"
 import { postMessage, promisefiyPostMessage } from "./helpers/native-message"
 import MusicScore from "./component/musicScore"
 import iconDian from "./image/icon-dian.svg"
@@ -42,7 +42,6 @@ export default defineComponent({
    setup() {
       const pageVisibility = usePageVisibility()
       const userStoreHook = userStore()
-      const router = useRouter()
       /** 页面显示和隐藏 */
       watch(
          () => pageVisibility.value,
@@ -109,6 +108,7 @@ export default defineComponent({
       onUnmounted(() => {
          handleInit(1)
          window.removeEventListener("message", iframeHandle)
+         window.removeEventListener("keyup", handleEventKeyup)
       })
 
       const route = useRoute()
@@ -342,8 +342,16 @@ export default defineComponent({
          }
          // getCourseSchedule();
          window.addEventListener("message", iframeHandle)
+         window.addEventListener("keyup", handleEventKeyup)
       })
-
+      function handleEventKeyup(event: any) {
+         const key = event.key
+         if (key === "ArrowDown") {
+            handlePreAndNext("down")
+         } else if (key === "ArrowUp") {
+            handlePreAndNext("up")
+         }
+      }
       const playRef = ref()
       // 返回
       const goback = () => {
@@ -353,7 +361,7 @@ export default defineComponent({
             console.log(error)
          }
          postMessage({ api: "goBack" })
-         router.back()
+         window.close()
       }
 
       const popupData = reactive({
@@ -576,8 +584,14 @@ export default defineComponent({
       // 上一个知识点, 下一个知识点
       const handlePreAndNext = (type: string) => {
          if (type === "up") {
+            if (!popupData.activeIndex) {
+               return
+            }
             handleSwipeChange(popupData.activeIndex - 1)
          } else {
+            if (popupData.activeIndex === data.itemList.length - 1) {
+               return
+            }
             handleSwipeChange(popupData.activeIndex + 1)
          }
       }
@@ -596,9 +610,9 @@ export default defineComponent({
          penShow: false
       })
 
-      const isWhite = ref(false)
+      const whiteShow = ref(false)
       /** 打开教学工具 */
-      const openStudyTool = (item: ToolItem, isw?: boolean) => {
+      const openStudyTool = (item: ToolItem) => {
          const activeItem = data.itemList[popupData.activeIndex]
          // 暂停视频和曲谱的播放
          if (activeItem.typeCode === "VIDEO" && data.videoItemRef?.getVideoItem()) {
@@ -610,17 +624,18 @@ export default defineComponent({
          clearModel()
          popupData.toolOpen = false
          studyData.type = item.type
-         isw && (isWhite.value = true)
          switch (item.type) {
             case "pen":
                studyData.penShow = true
                break
+            case "white":
+               whiteShow.value = true
+               break
          }
       }
 
       /** 关闭教学工具 */
       const closeStudyTool = () => {
-         isWhite.value = false
          studyData.type = "init"
          toggleModel()
       }
@@ -792,14 +807,11 @@ export default defineComponent({
                            <div
                               class={[styles.fullBtn, styles.point]}
                               onClick={() =>
-                                 openStudyTool(
-                                    {
-                                       type: "pen",
-                                       icon: iconPen,
-                                       name: "白板"
-                                    },
-                                    true
-                                 )
+                                 openStudyTool({
+                                    type: "white",
+                                    icon: iconPen,
+                                    name: "白板"
+                                 })
                               }
                            >
                               <img src={require("./image/bb.png")} />
@@ -940,14 +952,11 @@ export default defineComponent({
                      <div
                         class={styles.rightBtn}
                         onClick={() => {
-                           openStudyTool(
-                              {
-                                 type: "pen",
-                                 icon: iconPen,
-                                 name: "批注"
-                              },
-                              true
-                           )
+                           openStudyTool({
+                              type: "pen",
+                              icon: iconPen,
+                              name: "批注"
+                           })
                         }}
                      >
                         <img src={iconPen} />
@@ -1003,7 +1012,8 @@ export default defineComponent({
                {/* <OGuide /> */}
             </Popup>
 
-            {studyData.penShow && <Pen isWhite={isWhite.value} show={studyData.type === "pen"} close={() => closeStudyTool()} />}
+            {studyData.penShow && <Pen show={studyData.type === "pen"} close={() => closeStudyTool()} />}
+            {whiteShow.value && <Pen isWhite={whiteShow.value} show={studyData.type === "white"} close={() => closeStudyTool()} />}
          </div>
       )
    }

+ 6 - 1
src/views/homePage/components/navContainer/navContainer.vue

@@ -10,11 +10,11 @@
             <div class="navImg" :class="{ cursor: props.headImg.url }">
                <img :src="props.headImg.img" @click="handleRouter(props.headImg.url)" />
             </div>
+            <img class="horn" src="@/img/layout/jiao.png" />
             <div class="nav" v-for="(nav, index) in navs" :key="nav.name">
                <div class="name" :class="{ cursor: nav.url }" @click="handleRouter(nav.url)">{{ nav.name }}</div>
                <div class="arrow" v-if="navs.length > index + 1">></div>
             </div>
-            <img class="horn" src="@/img/layout/jiao.png" />
          </div>
          <slot></slot>
       </div>
@@ -85,6 +85,9 @@ function handleRouter(url?: string) {
          font-weight: 600;
          font-size: 20px;
          color: #994d1c;
+         &:last-child {
+            margin-right: 10px;
+         }
          .arrow {
             margin: 0 6px;
          }
@@ -93,6 +96,8 @@ function handleRouter(url?: string) {
          position: absolute;
          top: -3px;
          right: -49px;
+         width: 49px;
+         height: 60px;
       }
    }
    .container {

+ 15 - 5
src/views/homePage/homePage_gym.vue

@@ -14,7 +14,7 @@
          </div>
          <div class="courseBoard">
             <div class="details">
-               <el-empty :image-size="360" :image="require('@/img/layout/empty.png')" description="您还没有待上课程哦~" />
+               <el-empty style="margin-top: 50px" :image-size="360" :image="require('@/img/layout/empty1.png')" description="您还没有待上课程哦~" />
             </div>
          </div>
       </div>
@@ -81,8 +81,17 @@ function handleRouter(url?: string) {
 </script>
 
 <style lang="scss" scoped>
-.navContainer :deep(.navImg > img) {
-   top: 72% !important;
+.navContainer :deep(.navCon) {
+   .navImg > img {
+      top: 72% !important;
+   }
+   .nav {
+      font-size: 28px;
+      font-family: AlimamaFangYuanTiVF, AlimamaFangYuanTiVF;
+      &:last-child {
+         margin-right: 30px;
+      }
+   }
 }
 .homePage {
    width: 100%;
@@ -108,7 +117,8 @@ function handleRouter(url?: string) {
          flex-direction: column;
          cursor: pointer;
          &:hover {
-            opacity: $opacity-hover;
+            transform: scale(1.02);
+            box-shadow: 0px 2px 14px 0px #e4d7c2;
          }
          > div {
             margin-top: 10px;
@@ -130,7 +140,7 @@ function handleRouter(url?: string) {
       width: 572px;
       height: calc(100% + 35px);
       background: url("@/img/homePage/bg.png") no-repeat;
-      background-size: cover;
+      background-size: 100% 100%;
       position: relative;
       .details {
          width: 100%;

+ 15 - 5
src/views/homePage/homePage_gyt.vue

@@ -14,7 +14,7 @@
          </div>
          <div class="courseBoard">
             <div class="details">
-               <el-empty :image-size="360" :image="require('@/img/layout/empty.png')" description="您还没有待上课程哦~" />
+               <el-empty style="margin-top: 50px" :image-size="360" :image="require('@/img/layout/empty1.png')" description="您还没有待上课程哦~" />
             </div>
          </div>
       </div>
@@ -81,8 +81,17 @@ function handleRouter(url?: string) {
 </script>
 
 <style lang="scss" scoped>
-.navContainer :deep(.navImg > img) {
-   top: 72% !important;
+.navContainer :deep(.navCon) {
+   .navImg > img {
+      top: 72% !important;
+   }
+   .nav {
+      font-size: 28px;
+      font-family: AlimamaFangYuanTiVF, AlimamaFangYuanTiVF;
+      &:last-child {
+         margin-right: 30px;
+      }
+   }
 }
 .homePage {
    width: 100%;
@@ -108,7 +117,8 @@ function handleRouter(url?: string) {
          flex-direction: column;
          cursor: pointer;
          &:hover {
-            opacity: $opacity-hover;
+            transform: scale(1.02);
+            box-shadow: 0px 2px 14px 0px #e4d7c2;
          }
          > div {
             margin-top: 10px;
@@ -130,7 +140,7 @@ function handleRouter(url?: string) {
       width: 572px;
       height: calc(100% + 35px);
       background: url("@/img/homePage/bg.png") no-repeat;
-      background-size: cover;
+      background-size: 100% 100%;
       position: relative;
       .details {
          width: 100%;

+ 7 - 6
src/viewsframe/layout/layout.vue

@@ -8,16 +8,18 @@
       <div class="head">
          <el-dropdown :popper-options="{}" popper-class="headDropdown" class="avatar-con" trigger="click" @visible-change="visibleChange">
             <div class="avatar">
-               <div class="imgCon"><el-image class="avatarImg" :src="userInfo.avatar" /></div>
-               <div class="name">{{ userInfo.username }}</div>
+               <div class="imgCon"><el-image class="avatarImg" :src="userInfo.avatar || require('@/img/layout/userImg.png')" /></div>
+               <div class="name">
+                  {{ userInfo.username }}
+               </div>
                <img class="horn" :class="{ isVisible: visible }" src="@/img/layout/horn.png" />
             </div>
             <template #dropdown>
                <div class="dropdown">
                   <div class="avatar-item">
-                     <el-image class="avatarImg" :src="userInfo.avatar" />
+                     <el-image class="avatarImg" :src="userInfo.avatar || require('@/img/layout/userImg.png')" />
                      <div class="userInfo">
-                        <div class="realName">{{ userInfo.realName }}</div>
+                        <div class="realName">{{ userInfo.username }}</div>
                         <div class="phone">{{ userInfo.phone }}</div>
                      </div>
                   </div>
@@ -166,12 +168,11 @@ function handleLogout() {
          padding: 0 12px;
          width: 100%;
          height: 50px;
-         background: #f5f6fa;
          border-radius: 10px;
          display: flex;
          align-items: center;
          &:hover {
-            opacity: $opacity-hover;
+            background: #f5f6fa;
          }
          .text {
             margin-left: 20px;

+ 30 - 25
src/viewsframe/login/login.vue

@@ -5,25 +5,27 @@
 -->
 <template>
    <div class="login">
-      <div class="decoration">
-         <img class="star" src="@/img/loginErr/star.png" />
-         <img class="bStar" src="@/img/loginErr/bStar.png" />
-         <img class="music" src="@/img/loginErr/music.png" />
-      </div>
-      <div class="loginBox">
-         <img v-show="qrcodeStatus === 2" class="scanned" src="@/img/loginErr/scanned.png" />
-         <div v-show="qrcodeStatus !== 2" v-loading="!uuid" class="qrcodeBox">
-            <div class="qrCodeCon" :class="{ refresh: qrcodeStatus === 3 }">
-               <qrcode-vue class="qrCode" v-if="uuid" :value="qrcode" :size="164" />
-               <img @click="handleRefresh" src="@/img/loginErr/refresh.png" />
-            </div>
+      <div class="loginCon">
+         <div class="decoration">
+            <img class="star" src="@/img/loginErr/star.png" />
+            <img class="bStar" src="@/img/loginErr/bStar.png" />
+            <img class="music" src="@/img/loginErr/music.png" />
          </div>
-         <div class="dsc">
-            <img src="@/img/loginErr/jiantou1.png" />
-            <div>{{ qrcodeStatus === 2 ? "扫码完成,请在手机上操作" : "使用客户端扫描二维码登录乐教通" }}</div>
-            <img src="@/img/loginErr/jiantou2.png" />
+         <div class="loginBox">
+            <img v-show="qrcodeStatus === 2" class="scanned" src="@/img/loginErr/scanned.png" />
+            <div v-show="qrcodeStatus !== 2" v-loading="!uuid" class="qrcodeBox">
+               <div class="qrCodeCon" :class="{ refresh: qrcodeStatus === 3 }">
+                  <qrcode-vue class="qrCode" v-if="uuid" :value="qrcode" :size="164" />
+                  <img @click="handleRefresh" src="@/img/loginErr/refresh.png" />
+               </div>
+            </div>
+            <div class="dsc">
+               <img src="@/img/loginErr/jiantou1.png" />
+               <div>{{ qrcodeStatus === 2 ? "扫码完成,请在手机上操作" : "使用客户端扫描二维码登录乐教通" }}</div>
+               <img src="@/img/loginErr/jiantou2.png" />
+            </div>
+            <div class="refreshBtn" @click="handleRefresh">{{ qrcodeStatus === 2 ? "重新扫码" : "刷新二维码" }}</div>
          </div>
-         <div class="refreshBtn" @click="handleRefresh">{{ qrcodeStatus === 2 ? "重新扫码" : "刷新二维码" }}</div>
       </div>
    </div>
 </template>
@@ -83,7 +85,7 @@ function handleQrcodeStatus() {
          _time = setTimeout(() => {
             clearTimeout(_time)
             handleQrcodeStatus()
-         }, 1000)
+         }, 3000)
       } else if (res.code === 5440) {
          // 二维码过期
          qrcodeStatus.value = 3
@@ -102,11 +104,16 @@ function handleRefresh() {
    min-height: 100%;
    background: url("@/img/loginErr/bg.png") no-repeat;
    background-size: cover;
-   position: relative;
+   display: flex;
+   justify-content: center;
+   align-items: center;
+   min-width: 1280px;
+   .loginCon {
+      display: flex;
+      justify-content: space-between;
+      width: 80%;
+   }
    .loginBox {
-      position: absolute;
-      top: 166px;
-      right: 280px;
       width: 440px;
       height: 498px;
       background: url("@/img/loginErr/loginBox.png") no-repeat;
@@ -175,9 +182,7 @@ function handleRefresh() {
       }
    }
    .decoration {
-      position: absolute;
-      top: 158px;
-      left: 346px;
+      position: relative;
       width: 522px;
       height: 626px;
       background: url("@/img/loginErr/xiaoren.png") no-repeat;

Некоторые файлы не были показаны из-за большого количества измененных файлов