黄琪勇 1 rok temu
rodzic
commit
e0bb695dd3
42 zmienionych plików z 198 dodań i 93 usunięć
  1. 0 0
      dist/css/185.b39ce0c4.css
  2. 0 0
      dist/css/230.ba82a5d0.css
  3. 0 0
      dist/css/522.b83919b0.css
  4. 0 0
      dist/css/581.8f7be4e0.css
  5. 1 0
      dist/css/691.4f343428.css
  6. 0 1
      dist/css/721.5e32f5d3.css
  7. 0 0
      dist/css/app.2b7b596e.css
  8. BIN
      dist/img/404.232499b6.png
  9. BIN
      dist/img/btn.5f428068.png
  10. 1 1
      dist/index.html
  11. 0 0
      dist/js/185.6e59bf48.js
  12. 0 0
      dist/js/185.851774bc.js
  13. 0 0
      dist/js/522.13a5df3a.js
  14. 0 0
      dist/js/581.f75e2f3e.js
  15. 1 0
      dist/js/691.05d2a8e6.js
  16. 0 1
      dist/js/721.8103a789.js
  17. 0 0
      dist/js/763.8cc4fdd8.js
  18. 0 0
      dist/js/app.8aefe869.js
  19. 0 0
      dist/js/app.99e14504.js
  20. 3 0
      src/assets/elementTheme.scss
  21. 3 7
      src/components/ellipsisScroll/ellipsisScroll.vue
  22. 2 0
      src/global.d.ts
  23. BIN
      src/img/loginErr/404.png
  24. BIN
      src/img/loginErr/btn.png
  25. 3 0
      src/registerComponents.ts
  26. 5 4
      src/views/cloudTextbooks/chooseDialog.vue
  27. 32 8
      src/views/cloudTextbooks/cloudTextbooks.vue
  28. 3 0
      src/views/coursewarePlay/component/point.module.scss
  29. 9 1
      src/views/coursewarePlay/component/points.tsx
  30. 1 1
      src/views/coursewarePlay/component/tool.tsx
  31. 3 1
      src/views/coursewarePlay/component/video-item/index.module.scss
  32. 5 6
      src/views/coursewarePlay/component/video-item/index.tsx
  33. BIN
      src/views/coursewarePlay/image/iconImageActive.png
  34. BIN
      src/views/coursewarePlay/image/iconLoop.png
  35. BIN
      src/views/coursewarePlay/image/iconLoopActive.png
  36. BIN
      src/views/coursewarePlay/image/iconSongActive.png
  37. BIN
      src/views/coursewarePlay/image/iconVideoActive.png
  38. 1 0
      src/views/coursewarePlay/index.module.scss
  39. 35 25
      src/views/coursewarePlay/index.tsx
  40. 51 9
      src/viewsframe/errorPage/errorPage.vue
  41. 9 4
      src/viewsframe/layout/layout.vue
  42. 30 24
      src/viewsframe/login/login.vue

Plik diff jest za duży
+ 0 - 0
dist/css/185.b39ce0c4.css


Plik diff jest za duży
+ 0 - 0
dist/css/230.ba82a5d0.css


Plik diff jest za duży
+ 0 - 0
dist/css/522.b83919b0.css


Plik diff jest za duży
+ 0 - 0
dist/css/581.8f7be4e0.css


+ 1 - 0
dist/css/691.4f343428.css

@@ -0,0 +1 @@
+.errorPage[data-v-0e6edc0c]{width:100%;height:100%;display:flex;justify-content:center;align-items:center}.errorPage .error[data-v-0e6edc0c]{display:flex;flex-direction:column;justify-content:center;align-items:center}.errorPage .error .img[data-v-0e6edc0c]{width:630px;height:514px}.errorPage .error .errName[data-v-0e6edc0c]{margin-top:-100px;font-weight:500;font-size:29px;color:#333;line-height:41px}.errorPage .error .title[data-v-0e6edc0c]{font-weight:400;font-size:22px;color:#aaa;line-height:30px}.errorPage .error .btnCon[data-v-0e6edc0c]{margin-top:50px;display:flex;justify-content:center}.errorPage .error .btnCon .btn[data-v-0e6edc0c]{background:url(/img/btn.5f428068.png) no-repeat;width:170px;height:52px;background-size:100% 100%;font-weight:700;font-size:22px;color:#fff;line-height:52px;text-align:center;letter-spacing:1px;margin-right:25px;cursor:pointer}.errorPage .error .btnCon .btn[data-v-0e6edc0c]:hover{opacity:.8}.errorPage .error .btnCon .btn[data-v-0e6edc0c]:last-child{margin-right:0}

+ 0 - 1
dist/css/721.5e32f5d3.css

@@ -1 +0,0 @@
-.errorPage[data-v-b3d355fa]{width:100%;height:100%;display:flex;justify-content:center;align-items:center}.errorPage .error[data-v-b3d355fa]{width:600px;height:160px;background-color:var(--el-bg-color-page);display:flex;flex-direction:column;justify-content:center;align-items:center}.errorPage .error>div[data-v-b3d355fa]:first-child{font-size:var(--el-font-size-medium);color:var(--el-text-color-regular);margin-bottom:10px}

Plik diff jest za duży
+ 0 - 0
dist/css/app.2b7b596e.css


BIN
dist/img/404.232499b6.png


BIN
dist/img/btn.5f428068.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.c7889e49.js"></script><script defer="defer" src="/js/app.8aefe869.js"></script><link href="/css/app.62672def.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.c7889e49.js"></script><script defer="defer" src="/js/app.99e14504.js"></script><link href="/css/app.2b7b596e.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>

Plik diff jest za duży
+ 0 - 0
dist/js/185.6e59bf48.js


Plik diff jest za duży
+ 0 - 0
dist/js/185.851774bc.js


Plik diff jest za duży
+ 0 - 0
dist/js/522.13a5df3a.js


Plik diff jest za duży
+ 0 - 0
dist/js/581.f75e2f3e.js


+ 1 - 0
dist/js/691.05d2a8e6.js

@@ -0,0 +1 @@
+"use strict";(self["webpackChunkclassroom"]=self["webpackChunkclassroom"]||[]).push([[691],{8910:function(s,c,a){a.r(c),a.d(c,{default:function(){return b}});a(7658);var n=a(3396),e=a.p+"img/404.232499b6.png",r=a(2483);const t=s=>((0,n.dD)("data-v-0e6edc0c"),s=s(),(0,n.Cn)(),s),i={class:"errorPage"},l=t((()=>(0,n._)("img",{class:"img",src:e},null,-1))),o=t((()=>(0,n._)("div",{class:"errName"},"糟糕,页面找不到了",-1))),d=t((()=>(0,n._)("div",{class:"title"},"您可以通过以下方式继续访问",-1)));var u=(0,n.aZ)({__name:"errorPage",setup(s){const c=(0,r.tv)();function a(){c.push({path:"/"})}function e(){c.back()}return(s,c)=>((0,n.wg)(),(0,n.iD)("div",i,[(0,n._)("div",{class:"error"},[l,o,d,(0,n._)("div",{class:"btnCon"},[(0,n._)("div",{class:"btn",onClick:a},"跳转到首页"),(0,n._)("div",{class:"btn",onClick:e},"返回上一步")])])]))}}),v=a(89);const _=(0,v.Z)(u,[["__scopeId","data-v-0e6edc0c"]]);var p=_,b=p}}]);

+ 0 - 1
dist/js/721.8103a789.js

@@ -1 +0,0 @@
-"use strict";(self["webpackChunkclassroom"]=self["webpackChunkclassroom"]||[]).push([[721],{8721:function(r,a,t){t.r(a),t.d(a,{default:function(){return f}});t(7658);var n=t(3396),s=t(2483);const e=r=>((0,n.dD)("data-v-b3d355fa"),r=r(),(0,n.Cn)(),r),o={class:"errorPage"},u={class:"error"},c=e((()=>(0,n._)("div",null,"您访问的页面不存在!",-1)));var d=(0,n.aZ)({__name:"errorPage",setup(r){const a=(0,s.tv)();function t(){a.push({path:"/"})}return(r,a)=>{const s=(0,n.up)("ElButton");return(0,n.wg)(),(0,n.iD)("div",o,[(0,n._)("div",u,[c,(0,n.Wm)(s,{type:"primary",onClick:t},{default:(0,n.w5)((()=>[(0,n.Uk)("返回首页")])),_:1})])])}}}),l=t(89);const i=(0,l.Z)(d,[["__scopeId","data-v-b3d355fa"]]);var p=i,f=p}}]);

Plik diff jest za duży
+ 0 - 0
dist/js/763.8cc4fdd8.js


Plik diff jest za duży
+ 0 - 0
dist/js/app.8aefe869.js


Plik diff jest za duży
+ 0 - 0
dist/js/app.99e14504.js


+ 3 - 0
src/assets/elementTheme.scss

@@ -27,6 +27,9 @@
 }
 
 .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;

+ 3 - 7
src/components/ellipsisScroll/ellipsisScroll.vue

@@ -4,10 +4,8 @@
 * @Date:2024-03-25 11:50:36
 -->
 <template>
-   <div class="xx">
-      <div ref="ellipsisScrollDom" :class="{ isScroll: isScroll }" class="ellipsisScroll">
-         {{ props.title }}
-      </div>
+   <div ref="ellipsisScrollDom" :class="{ isScroll: isScroll }" class="ellipsisScroll">
+      {{ props.title }}
    </div>
 </template>
 
@@ -31,7 +29,6 @@ onUnmounted(() => {
 })
 
 let widthCalc = 0
-
 function handleIsScroll(e: MouseEvent) {
    const target = e.target as HTMLElement
    widthCalc = target.scrollWidth - target.clientWidth
@@ -56,7 +53,6 @@ function handleLeaveScroll() {
    white-space: nowrap;
    text-overflow: ellipsis;
    overflow: hidden;
-   line-height: 16px;
    &.isScroll {
       &:hover {
          width: auto;
@@ -68,7 +64,7 @@ function handleLeaveScroll() {
             transform: translateX(0);
          }
          100% {
-            transform: translateX(-clac(100% - v-bind(widthCalc + "px")));
+            transform: translateX(-100%);
          }
       }
    }

+ 2 - 0
src/global.d.ts

@@ -4,6 +4,7 @@ import dictionary from "@/components/dictionary"
 import tooltipAutoShow from "@/components/tooltipAutoShow"
 import split from "@/components/split"
 import ellipsis from "@/components/ellipsis"
+import ellipsisScroll from "@/components/ellipsisScroll"
 
 /** 全局组件 */
 declare module "vue" {
@@ -14,5 +15,6 @@ declare module "vue" {
       tooltipAutoShow: typeof tooltipAutoShow
       split: typeof split
       ellipsis: typeof ellipsis
+      ellipsisScroll: typeof ellipsisScroll
    }
 }

BIN
src/img/loginErr/404.png


BIN
src/img/loginErr/btn.png


+ 3 - 0
src/registerComponents.ts

@@ -7,6 +7,7 @@ import dictionary from "@/components/dictionary"
 import tooltipAutoShow from "@/components/tooltipAutoShow"
 import split from "@/components/split"
 import ellipsis from "@/components/ellipsis"
+import ellipsisScroll from "@/components/ellipsisScroll"
 
 export default (app: App<Element>) => {
    //element
@@ -21,4 +22,6 @@ export default (app: App<Element>) => {
    app.component("split", split)
    //ellipsis
    app.component("ellipsis", ellipsis)
+   //ellipsisScroll
+   app.component("ellipsisScroll", ellipsisScroll)
 }

+ 5 - 4
src/views/cloudTextbooks/chooseDialog.vue

@@ -60,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>
 

+ 32 - 8
src/views/cloudTextbooks/cloudTextbooks.vue

@@ -40,20 +40,21 @@
                            <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">共{{ item.courseNum }}课</div>
+                           <div class="courseNum" @click="handleClick(item.id)">共{{ item.courseNum }}课</div>
                         </div>
                         <div class="name">{{ item.name }}</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>
@@ -164,6 +165,7 @@ function handleClick(id: string) {
 .cloudTextbooks {
    width: 100%;
    height: 100%;
+   position: relative;
    .headCon {
       padding: 40px 26px;
       display: flex;
@@ -257,8 +259,8 @@ function handleClick(id: string) {
          display: flex;
          flex-direction: column;
          align-items: center;
-         min-width: 1500px;
          padding-top: 10px;
+         min-width: 1240px;
          .bookshelf {
             width: 1500px;
             padding: 0 116px;
@@ -311,6 +313,7 @@ function handleClick(id: string) {
                      height: 212px;
                   }
                   .courseNum {
+                     cursor: pointer;
                      position: absolute;
                      left: 50%;
                      bottom: 10px;
@@ -334,8 +337,29 @@ function handleClick(id: string) {
                }
             }
          }
+         @media screen and (max-width: 1600px) {
+            .bookshelf {
+               width: 1400px;
+            }
+         }
+         @media screen and (max-width: 1500px) {
+            .bookshelf {
+               width: 1300px;
+            }
+         }
+         @media screen and (max-width: 1400px) {
+            .bookshelf {
+               width: 1200px;
+            }
+         }
       }
    }
+   .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);

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

@@ -46,6 +46,7 @@
    }
    :global {
       .van-cell {
+         cursor: pointer;
          background: transparent;
          font-size: 16px;
          color: rgba(255, 255, 255, 0.5);
@@ -80,6 +81,7 @@
       border-top: 0;
       :global {
          .van-cell {
+            cursor: pointer;
             padding-left: 0;
             font-size: 16px;
          }
@@ -104,6 +106,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>
       )
    }

+ 51 - 9
src/viewsframe/errorPage/errorPage.vue

@@ -6,8 +6,13 @@
 <template>
    <div class="errorPage">
       <div class="error">
-         <div>您访问的页面不存在!</div>
-         <ElButton type="primary" @click="handleGoHome">返回首页</ElButton>
+         <img class="img" src="@/img/loginErr/404.png" />
+         <div class="errName">糟糕,页面找不到了</div>
+         <div class="title">您可以通过以下方式继续访问</div>
+         <div class="btnCon">
+            <div class="btn" @click="handleGoHome">跳转到首页</div>
+            <div class="btn" @click="handleGoBack">返回上一步</div>
+         </div>
       </div>
    </div>
 </template>
@@ -21,6 +26,9 @@ function handleGoHome() {
       path: "/"
    })
 }
+function handleGoBack() {
+   router.back()
+}
 </script>
 
 <style lang="scss" scoped>
@@ -31,17 +39,51 @@ function handleGoHome() {
    justify-content: center;
    align-items: center;
    .error {
-      width: 600px;
-      height: 160px;
-      background-color: $bg-color-page;
       display: flex;
       flex-direction: column;
       justify-content: center;
       align-items: center;
-      & > div:first-child {
-         font-size: $font-size-medium;
-         color: $text-color-regular;
-         margin-bottom: 10px;
+      .img {
+         width: 630px;
+         height: 514px;
+      }
+      .errName {
+         margin-top: -100px;
+         font-weight: 500;
+         font-size: 29px;
+         color: #333333;
+         line-height: 41px;
+      }
+      .title {
+         font-weight: 400;
+         font-size: 22px;
+         color: #aaaaaa;
+         line-height: 30px;
+      }
+      .btnCon {
+         margin-top: 50px;
+         display: flex;
+         justify-content: center;
+         .btn {
+            background: url("@/img/loginErr/btn.png") no-repeat;
+            width: 170px;
+            height: 52px;
+            background-size: 100% 100%;
+            font-weight: bold;
+            font-size: 22px;
+            color: #ffffff;
+            line-height: 52px;
+            text-align: center;
+            letter-spacing: 1px;
+            margin-right: 25px;
+            cursor: pointer;
+            &:hover {
+               opacity: $opacity-hover;
+            }
+            &:last-child {
+               margin-right: 0;
+            }
+         }
       }
    }
 }

+ 9 - 4
src/viewsframe/layout/layout.vue

@@ -10,7 +10,7 @@
             <div class="avatar">
                <div class="imgCon"><el-image class="avatarImg" :src="userInfo.avatar || require('@/img/layout/userImg.png')" /></div>
                <div class="name">
-                  {{ userInfo.username }}
+                  <ellipsisScroll :title="userInfo.username || ''" />
                </div>
                <img class="horn" :class="{ isVisible: visible }" src="@/img/layout/horn.png" />
             </div>
@@ -19,7 +19,7 @@
                   <div class="avatar-item">
                      <el-image class="avatarImg" :src="userInfo.avatar || require('@/img/layout/userImg.png')" />
                      <div class="userInfo">
-                        <div class="realName">{{ userInfo.username }}</div>
+                        <div class="realName"><ellipsisScroll :title="userInfo.username || ''" /></div>
                         <div class="phone">{{ userInfo.phone }}</div>
                      </div>
                   </div>
@@ -67,7 +67,6 @@ function handleLogout() {
 .layout {
    width: 100%;
    height: 100%;
-   min-width: 1200px;
    min-height: 880px;
    background: linear-gradient(180deg, #ffd884 0%, #ffa943 100%);
    box-shadow: 0px 11px 15px 0px #63bd73, inset 0px 1px 14px 0px rgba(255, 255, 255, 0.5);
@@ -107,10 +106,13 @@ function handleLogout() {
          .name {
             margin-left: 6px;
             font-size: 18px;
+            height: 18px;
+            line-height: 18px;
             color: #244b55;
             font-weight: 500;
-            min-width: 56px;
+            width: 56px;
             text-align: center;
+            overflow: hidden;
          }
          .horn {
             margin-left: 8px;
@@ -147,10 +149,13 @@ function handleLogout() {
       }
       .userInfo {
          margin-left: 16px;
+         flex-grow: 1;
+         overflow: hidden;
          .realName {
             font-weight: 600;
             font-size: 20px;
             line-height: 28px;
+            height: 28px;
             color: #333333;
          }
          .phone {

+ 30 - 24
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>
@@ -102,11 +104,17 @@ function handleRefresh() {
    min-height: 100%;
    background: url("@/img/loginErr/bg.png") no-repeat;
    background-size: cover;
-   position: relative;
+   display: flex;
+   align-items: center;
+   justify-content: center;
+   min-width: 1280px;
+   .loginCon {
+      width: 74%;
+      display: flex;
+      justify-content: space-between;
+   }
    .loginBox {
-      position: absolute;
-      top: 166px;
-      right: 280px;
+      margin-top: 8px;
       width: 440px;
       height: 498px;
       background: url("@/img/loginErr/loginBox.png") no-repeat;
@@ -175,9 +183,7 @@ function handleRefresh() {
       }
    }
    .decoration {
-      position: absolute;
-      top: 158px;
-      left: 346px;
+      position: relative;
       width: 522px;
       height: 626px;
       background: url("@/img/loginErr/xiaoren.png") no-repeat;

Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików