Browse Source

#feat:首页直接新增一个侧边栏AI图片入口
#feat:tab栏 课程资源、艺术广场、艺术视野下所有子路由免登录查看

hpAlivsliu 3 months ago
parent
commit
c5c8c38ad2
5 changed files with 261 additions and 249 deletions
  1. BIN
      public/images/home/fixedAi.png
  2. 20 3
      src/components/CommonHeader/index.vue
  3. 73 4
      src/pages/home/index.vue
  4. 138 116
      src/router/index.js
  5. 30 126
      yarn.lock

BIN
public/images/home/fixedAi.png


+ 20 - 3
src/components/CommonHeader/index.vue

@@ -42,13 +42,27 @@ const navList = [
 ]
 
 const route = useRoute()
-const currentRootRoute = $computed(() => route.matched[0].path.substring(1))
+const currentRootRoute = $computed(() => {
+  // 获取当前路由树中第一个在allowRoutes中的路由名称
+  const matchedRoute = route.matched.find(r => allowRoutes.includes(r.name));
+  return matchedRoute?.name || route.matched[0]?.name;
+});
+
 
 const router = useRouter()
 
 // console.log('local :>> ', localStorage.getItem('userInfo'));
 // console.log('user :>> ', user);
-let loginShow = $ref(currentRootRoute !== 'home' && !user);
+let homeRoutes = ['home']
+let resourceRoutes = ['resource', 'resourceAll', 'resourceChapter', 'resourceChapterList', 'resourceFileReview', 'resourceMovReview']
+let ysgcRoutes = ['ysgc','ysgc_kc','ysgc_stuDetail','ysgc_jsDetail','ysgc_schoolList','ysgc_schoolZp','ysgc_zpDetail']
+let szmsgRoutes =['szmsg','szmsg_tzkc','szmsg_tzkc_detail','szmsg_yslm','szmsg_yswz','szmsg_zjcm']
+
+const allowRoutes = [...homeRoutes, ...resourceRoutes, ...ysgcRoutes, ...szmsgRoutes];
+  
+// 修正登录弹窗显示逻辑:当当前路由不在允许列表且未登录时显示
+let loginShow = $ref(!allowRoutes.includes(currentRootRoute) && !user);
+
 let loginForm = reactive({
   user_name: '',
   user_password: '',
@@ -114,7 +128,10 @@ function handleCommand(command) {
 let tempRoute = undefined
 
 function handleSwitchRoute(name) {
-  if (name === 'home') return routerReplace(name);
+  // 修改为检查整个allowRoutes数组
+  if (allowRoutes.includes(name)) {
+    return routerReplace(name);
+  }
   if (user) {
     routerReplace(name)
   } else {

+ 73 - 4
src/pages/home/index.vue

@@ -4,7 +4,13 @@
     <div class="banner"
          :style="{'background': 'url('+curMenu.img+') top no-repeat','background-size': 'cover'}"></div>
 
+  <!-- 新增浮动图表 -->
+  <div class="fixed-chart" @click="toAi">
+    <div class="chart-content">
+      <img src="/images/home/fixedAi.png"  alt="动态图表">
+    </div>
   </div>
+</div>
   <div class="content-bg pt10 pb80">
     <div class="main pt50">
       <h3 class="title-img m-0"><img src="/images/home/zbkt.png?v=20221024" alt=""></h3>
@@ -68,6 +74,7 @@ import img2 from "/images/home/live2.png";
 import img3 from "/images/home/live3.png";
 import bgImg1 from "/images/home/live-2.png";
 import bgImg2 from "/images/home/live-3.png";
+import fixedAi from "/images/home/fixedAi.png";
 import 'swiper/css/swiper.css';
 import Swiper from 'swiper';
 import {ElMessage} from "element-plus";
@@ -181,11 +188,20 @@ export default {
         img:'/images/home/z-3.png'
       }],
       isTeacher:false,
-      zpList:[]
+      zpList:[],
+      // 新增拖拽相关数据
+      dragPosition: { x: 200, y: 300 }, // 初始位置
+      dragging: false,
+      startX: 0,
+      startY: 0
     }
 
   },
   methods: {
+    toAi() {
+      //跳转到新页面 https://yuanbao.tencent.com/chat/1TegzXiYHGAu/8e6e3263-f8de-4039-84b7-94c2654f70df
+      window.open('https://yuanbao.tencent.com/chat/1TegzXiYHGAu/8e6e3263-f8de-4039-84b7-94c2654f70df');
+    },
     switchImg(item) {
       this.curMenu = item;
     },
@@ -342,20 +358,73 @@ export default {
       } else if (index == 2) {
         this.liveData[1].bgImg = bgImg2;
       }
-    }
+    },
+    // 新增拖拽方法
+    startDrag(e) {
+      this.dragging = true
+      const clientX = e.clientX || e.touches[0].clientX
+      const clientY = e.clientY || e.touches[0].clientY
+      
+      this.startX = clientX - this.dragPosition.x
+      this.startY = clientY - this.dragPosition.y
+      
+      document.addEventListener('mousemove', this.onDrag)
+      document.addEventListener('touchmove', this.onDrag)
+      document.addEventListener('mouseup', this.stopDrag)
+      document.addEventListener('touchend', this.stopDrag)
+    },
+    onDrag(e) {
+      if (!this.dragging) return
+      const clientX = e.clientX || e.touches[0].clientX
+      const clientY = e.clientY || e.touches[0].clientY
+      
+      this.dragPosition.x = clientX - this.startX
+      this.dragPosition.y = clientY - this.startY
+      e.preventDefault()
+    },
+    stopDrag() {
+      this.dragging = false
+      document.removeEventListener('mousemove', this.onDrag)
+      document.removeEventListener('touchmove', this.onDrag)
+    },
+    
   },
   mounted() {
     this.initZpData(1);
-  }
+  },
+ 
 }
 </script>
 <style lang="scss" scoped>
 @import "@/styles/mixin.scss";
 </style>
 <style lang="scss" scoped>
-::v-deep .el-carousel__mask{
+// ::v-deep .el-carousel__mask{
+//   opacity: 0!important;
+// }
+:deep(.el-carousel__mask){
   opacity: 0!important;
 }
+.fixed-chart {
+  position: fixed;
+  top: 40%;
+  right: 4%;
+  z-index: 1000;
+  width: 250px !important;  // 改为固定宽度
+  text-align: right;         // 新增文本右对齐
+  cursor: move; // 添加拖拽光标
+  user-select: none; // 防止选中文本
+  touch-action: none; // 禁用默认触控行为
+  
+  .chart-content {
+    width: 40% !important;  // 改为100%宽度
+    background: #fff;
+    border-radius: 8px;
+    box-shadow: 0 2px 12px rgba(0,0,0,0.1);
+    margin-left: auto;        // 新增右对齐关键属性
+    cursor: pointer;
+  }
+}
 .main {
   width: 1200px;
   margin: 0 auto;

+ 138 - 116
src/router/index.js

@@ -21,7 +21,123 @@ const router = createRouter({
       name: "message",
       component: () => import("~/pages/message/index.vue"),
     },
-    //智慧教研首页
+    
+    
+    // 课程资源
+    {
+      path: "/resource",
+      name: "resource",
+      title: "首页",
+      component: () => import("~/pages/courseResources.vue"),
+    },
+    {
+      path: "/resourceAll",
+      name: "resourceAll",
+      title: "首页",
+      component: () => import("~/pages/courseResourcesAll.vue"),
+    },
+    {
+      path: "/resourceChapter",
+      name: "resourceChapter",
+      title: "课程资源章节",
+      component: () => import("~/pages/courseResourcesChapter.vue"),
+    },
+    {
+      path: "/resourceChapterList",
+      name: "resourceChapterList",
+      title: "课程资源章节",
+      component: () => import("~/pages/courseResourcesChapterList.vue"),
+    },
+    {
+      path: "/resourceFileReview",
+      name: "resourceFileReview",
+      title: "课程资源文件预览",
+      component: () => import("~/pages/resourceFileReview.vue"),
+    },
+    {
+      path: "/resourceMovReview",
+      name: "resourceMovReview",
+      title: "课程资源视频预览",
+      component: () => import("~/pages/resourceMovReview.vue"),
+    },
+    //直播课堂
+    {
+      path: "/zbkt",
+      title: "直播课堂",
+      children: [
+        {
+          path: "",
+          name: "zbkt",
+          component: () => import("~/pages/zbkt/index.vue"),
+        },
+        {
+          path: "ssys",
+          children: [
+            {
+              path: ":status",
+              name: "ssys",
+              component: () => import("~/pages/zbkt/ssys/index.vue"),
+              props: true,
+            },
+            {
+              path: "content/:id/:status",
+              name: "ssys_content",
+              component: () => import("~/pages/zbkt/ssys/content.vue"),
+              props: true,
+            },
+            {
+              path: "rtc/:id",
+              name: "ssys_rtc",
+              component: () => import("~/pages/zbkt/ssys/rtc.vue"),
+              props: true,
+            },
+            {
+              path: "video/:id/:status",
+              name: "ssys_video",
+              component: () => import("~/pages/zbkt/ssys/video.vue"),
+              props: true,
+            },
+          ],
+        },
+        {
+          path: "wlzb",
+
+          children: [
+            {
+              path: "",
+              name: "wlzb",
+              component: () => import("~/pages/zbkt/wlzb/index.vue"),
+            },
+            {
+              path: "content/:id",
+              name: "wlzb_content",
+              component: () => import("~/pages/zbkt/wlzb/content.vue"),
+            },
+            {
+              path: "detail/:id",
+              name: "wlzb_detail",
+              component: () => import("~/pages/zbkt/wlzb/detail.vue"),
+            },
+          ],
+        },
+        {
+          path: "ztzb",
+          children: [
+            {
+              path: "",
+              name: "ztzb",
+              component: () => import("~/pages/zbkt/ztzb/index.vue"),
+            },
+            {
+              path: "content/:id",
+              name: "ztzb_content",
+              component: () => import("~/pages/zbkt/ztzb/content.vue"),
+            },
+          ],
+        },
+      ],
+    },
+    //智慧教研
     {
       path: "/zhjy",
       name: "zhjy",
@@ -85,7 +201,7 @@ const router = createRouter({
     },
     {
       path: "/ysgc_kc/:id",
-      name: "ysgc_kc",
+      name: "ysgc_kc", // 必须与allowRoutes中的名称一致
       component: () => import("~/pages/ysgc/xskc.vue"),
     },
     {
@@ -124,6 +240,8 @@ const router = createRouter({
     // 	name: 'ysgc_detail',
     // 	component: () => import('~/pages/ysgc/ysgc_detail/index.vue')
     // },
+
+    //艺术视野
     {
       path: "/szmsg",
       children: [
@@ -167,119 +285,6 @@ const router = createRouter({
     },
 
     {
-      path: "/resource",
-      name: "resource",
-      title: "首页",
-      component: () => import("~/pages/courseResources.vue"),
-    },
-    {
-      path: "/resourceAll",
-      name: "resourceAll",
-      title: "首页",
-      component: () => import("~/pages/courseResourcesAll.vue"),
-    },
-    {
-      path: "/zbkt",
-      title: "直播课堂",
-      children: [
-        {
-          path: "",
-          name: "zbkt",
-          component: () => import("~/pages/zbkt/index.vue"),
-        },
-        {
-          path: "ssys",
-          children: [
-            {
-              path: ":status",
-              name: "ssys",
-              component: () => import("~/pages/zbkt/ssys/index.vue"),
-              props: true,
-            },
-            {
-              path: "content/:id/:status",
-              name: "ssys_content",
-              component: () => import("~/pages/zbkt/ssys/content.vue"),
-              props: true,
-            },
-            {
-              path: "rtc/:id",
-              name: "ssys_rtc",
-              component: () => import("~/pages/zbkt/ssys/rtc.vue"),
-              props: true,
-            },
-            {
-              path: "video/:id/:status",
-              name: "ssys_video",
-              component: () => import("~/pages/zbkt/ssys/video.vue"),
-              props: true,
-            },
-          ],
-        },
-        {
-          path: "wlzb",
-
-          children: [
-            {
-              path: "",
-              name: "wlzb",
-              component: () => import("~/pages/zbkt/wlzb/index.vue"),
-            },
-            {
-              path: "content/:id",
-              name: "wlzb_content",
-              component: () => import("~/pages/zbkt/wlzb/content.vue"),
-            },
-            {
-              path: "detail/:id",
-              name: "wlzb_detail",
-              component: () => import("~/pages/zbkt/wlzb/detail.vue"),
-            },
-          ],
-        },
-        {
-          path: "ztzb",
-          children: [
-            {
-              path: "",
-              name: "ztzb",
-              component: () => import("~/pages/zbkt/ztzb/index.vue"),
-            },
-            {
-              path: "content/:id",
-              name: "ztzb_content",
-              component: () => import("~/pages/zbkt/ztzb/content.vue"),
-            },
-          ],
-        },
-      ],
-    },
-    {
-      path: "/resourceChapter",
-      name: "resourceChapter",
-      title: "课程资源章节",
-      component: () => import("~/pages/courseResourcesChapter.vue"),
-    },
-    {
-      path: "/resourceChapterList",
-      name: "resourceChapterList",
-      title: "课程资源章节",
-      component: () => import("~/pages/courseResourcesChapterList.vue"),
-    },
-    {
-      path: "/resourceFileReview",
-      name: "resourceFileReview",
-      title: "课程资源文件预览",
-      component: () => import("~/pages/resourceFileReview.vue"),
-    },
-    {
-      path: "/resourceMovReview",
-      name: "resourceMovReview",
-      title: "课程资源视频预览",
-      component: () => import("~/pages/resourceMovReview.vue"),
-    },
-
-    {
       path: "/personal",
       name: "personal",
       title: "个人中心",
@@ -847,8 +852,25 @@ const router = createRouter({
 
 export default router;
 
+
+
 router.beforeEach((to, from, next) => {
-  if ((to.path !== "/" && to.path !== "/home") && !user) {
+  // 允许免登录的路由及其所有子路由
+  // const allowRoutes = ['home', 'resource', 'ysgc', 'szmsg'];
+  //由于这里的路由书写规范不同,这里的很多字路由都是单独书写,在不更改路由结构的前提上只能手动添加白名单免登录
+  let homeRoutes = ['home']
+  let resourceRoutes = ['resource', 'resourceAll', 'resourceChapter', 'resourceChapterList', 'resourceFileReview', 'resourceMovReview']
+  let ysgcRoutes = ['ysgc','ysgc_kc','ysgc_stuDetail','ysgc_jsDetail','ysgc_schoolList','ysgc_schoolZp','ysgc_zpDetail']
+  let szmsgRoutes =['szmsg','szmsg_tzkc','szmsg_tzkc_detail','szmsg_yslm','szmsg_yswz','szmsg_zjcm']
+
+  const allowRoutes = [...homeRoutes, ...resourceRoutes, ...ysgcRoutes, ...szmsgRoutes];
+  
+  // 检查当前路由或父级路由是否在允许名单
+  const isAllowed = to.matched.some(record => 
+    allowRoutes.includes(record.name)
+  );
+
+  if (!isAllowed && !user) {
     ElMessage.info("请先返回首页登录");
     next({ path: "/home" });
   } else {

+ 30 - 126
yarn.lock

@@ -53,7 +53,7 @@
   resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz"
   integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==
 
-"@babel/parser@^7.23.5", "@babel/parser@^7.23.6":
+"@babel/parser@^7.15.8", "@babel/parser@^7.23.5", "@babel/parser@^7.23.6":
   version "7.23.6"
   resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz"
   integrity sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==
@@ -77,16 +77,6 @@
   resolved "https://registry.npmjs.org/@element-plus/icons-vue/-/icons-vue-2.3.1.tgz"
   integrity sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg==
 
-"@esbuild/android-arm@0.15.16":
-  version "0.15.16"
-  resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.15.16.tgz#0642926178b15e3d1545efae6eee05c4f3451d15"
-  integrity sha512-nyB6CH++2mSgx3GbnrJsZSxzne5K0HMyNIWafDHqYy7IwxFc4fd/CgHVZXr8Eh+Q3KbIAcAe3vGyqIPhGblvMQ==
-
-"@esbuild/linux-loong64@0.15.16":
-  version "0.15.16"
-  resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.15.16.tgz#284522de76abe951e4ed2bd24a467e8d49c67933"
-  integrity sha512-SDLfP1uoB0HZ14CdVYgagllgrG7Mdxhkt4jDJOKl/MldKrkQ6vDJMZKl2+5XsEY/Lzz37fjgLQoJBGuAw/x8kQ==
-
 "@floating-ui/core@^1.0.2":
   version "1.0.2"
   resolved "https://registry.npmjs.org/@floating-ui/core/-/core-1.0.2.tgz"
@@ -137,7 +127,7 @@
     "@nodelib/fs.stat" "2.0.5"
     run-parallel "^1.1.9"
 
-"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2":
+"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5":
   version "2.0.5"
   resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz"
   integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
@@ -169,7 +159,7 @@
   resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz"
   integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==
 
-"@types/lodash-es@^4.17.6":
+"@types/lodash-es@*", "@types/lodash-es@^4.17.6":
   version "4.17.6"
   resolved "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.6.tgz"
   integrity sha512-R+zTeVUKDdfoRxpAryaQNRKk3105Rrgx2CFRClIgRGaqDTdjsm8h6IYA8ir584W3ePzkZfst5xIgDwYrlh9HLg==
@@ -220,7 +210,7 @@
     magic-string "^0.30.5"
     unplugin "^1.6.0"
 
-"@vue/compiler-core@3.4.5", "@vue/compiler-core@^3.4.5":
+"@vue/compiler-core@^3.4.5", "@vue/compiler-core@3.4.5":
   version "3.4.5"
   resolved "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.5.tgz"
   integrity sha512-Daka7P1z2AgKjzuueWXhwzIsKu0NkLB6vGbNVEV2iJ8GJTrzraZo/Sk4GWCMRtd/qVi3zwnk+Owbd/xSZbwHtQ==
@@ -239,7 +229,7 @@
     "@vue/compiler-core" "3.4.5"
     "@vue/shared" "3.4.5"
 
-"@vue/compiler-sfc@3.4.5", "@vue/compiler-sfc@^3.3.10":
+"@vue/compiler-sfc@^3.0.2", "@vue/compiler-sfc@^3.3.10", "@vue/compiler-sfc@3.4.5":
   version "3.4.5"
   resolved "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.5.tgz"
   integrity sha512-jauvkDuSSUbP0ebhfNqljhShA90YEfX/0wZ+w40oZF43IjGyWYjqYaJbvMJwGOd+9+vODW6eSvnk28f0SGV7OQ==
@@ -299,12 +289,12 @@
     "@vue/compiler-ssr" "3.4.5"
     "@vue/shared" "3.4.5"
 
-"@vue/shared@3.4.5", "@vue/shared@^3.4.5":
+"@vue/shared@^3.4.5", "@vue/shared@3.4.5":
   version "3.4.5"
   resolved "https://registry.npmjs.org/@vue/shared/-/shared-3.4.5.tgz"
   integrity sha512-6XptuzlMvN4l4cDnDw36pdGEV+9njYkQ1ZE0Q6iZLwrKefKaOJyiFmcP3/KBDHbt72cJZGtllAc1GaHe6XGAyg==
 
-"@vueuse/core@^9.1.0", "@vueuse/core@^9.13.0":
+"@vueuse/core@*", "@vueuse/core@^9.1.0", "@vueuse/core@^9.13.0":
   version "9.13.0"
   resolved "https://registry.npmjs.org/@vueuse/core/-/core-9.13.0.tgz"
   integrity sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==
@@ -436,7 +426,7 @@ braces@^3.0.2, braces@~3.0.2:
   dependencies:
     fill-range "^7.0.1"
 
-"chokidar@>=3.0.0 <4.0.0", chokidar@^3.5.3:
+chokidar@^3.5.3, "chokidar@>=3.0.0 <4.0.0":
   version "3.5.3"
   resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz"
   integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==
@@ -522,106 +512,11 @@ entities@^4.5.0:
   resolved "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz"
   integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==
 
-esbuild-android-64@0.15.16:
-  version "0.15.16"
-  resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.15.16.tgz#0d6a16fa1bea441d5183976f1633183c25a764d5"
-  integrity sha512-Vwkv/sT0zMSgPSVO3Jlt1pUbnZuOgtOQJkJkyyJFAlLe7BiT8e9ESzo0zQSx4c3wW4T6kGChmKDPMbWTgtliQA==
-
-esbuild-android-arm64@0.15.16:
-  version "0.15.16"
-  resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.15.16.tgz#78643bbbf396d26d20ba1f2fcdff3618c7c033e9"
-  integrity sha512-lqfKuofMExL5niNV3gnhMUYacSXfsvzTa/58sDlBET/hCOG99Zmeh+lz6kvdgvGOsImeo6J9SW21rFCogNPLxg==
-
-esbuild-darwin-64@0.15.16:
-  version "0.15.16"
-  resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.15.16.tgz#de3e91809dcd1ffb64409e2f990bb86e33e4ffd8"
-  integrity sha512-wo2VWk/n/9V2TmqUZ/KpzRjCEcr00n7yahEdmtzlrfQ3lfMCf3Wa+0sqHAbjk3C6CKkR3WKK/whkMq5Gj4Da9g==
-
-esbuild-darwin-arm64@0.15.16:
-  version "0.15.16"
-  resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.16.tgz#bc9cc8d51109d8e9db4ffe2c064dd53d1eb5a2a6"
-  integrity sha512-fMXaUr5ou0M4WnewBKsspMtX++C1yIa3nJ5R2LSbLCfJT3uFdcRoU/NZjoM4kOMKyOD9Sa/2vlgN8G07K3SJnw==
-
-esbuild-freebsd-64@0.15.16:
-  version "0.15.16"
-  resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.16.tgz#f8c54c679c16e9b20a1bf860ca91ba700d6c9c5d"
-  integrity sha512-UzIc0xlRx5x9kRuMr+E3+hlSOxa/aRqfuMfiYBXu2jJ8Mzej4lGL7+o6F5hzhLqWfWm1GWHNakIdlqg1ayaTNQ==
-
-esbuild-freebsd-arm64@0.15.16:
-  version "0.15.16"
-  resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.16.tgz#dd28a55df0f062e2c1628266008434c32ddc7adf"
-  integrity sha512-8xyiYuGc0DLZphFQIiYaLHlfoP+hAN9RHbE+Ibh8EUcDNHAqbQgUrQg7pE7Bo00rXmQ5Ap6KFgcR0b4ALZls1g==
-
-esbuild-linux-32@0.15.16:
-  version "0.15.16"
-  resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.15.16.tgz#41eb0b9b49b3430b9cc4577f1ad3d414ef70f806"
-  integrity sha512-iGijUTV+0kIMyUVoynK0v+32Oi8yyp0xwMzX69GX+5+AniNy/C/AL1MjFTsozRp/3xQPl7jVux/PLe2ds10/2w==
-
-esbuild-linux-64@0.15.16:
-  version "0.15.16"
-  resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.15.16.tgz#b2fb0c7d49b7a579b2de26fbf4c7afb1835f2073"
-  integrity sha512-tuSOjXdLw7VzaUj89fIdAaQT7zFGbKBcz4YxbWrOiXkwscYgE7HtTxUavreBbnRkGxKwr9iT/gmeJWNm4djy/g==
-
-esbuild-linux-arm64@0.15.16:
-  version "0.15.16"
-  resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.16.tgz#78fed3745b20251fc3bdc8db35ea0781e9b0e7c6"
-  integrity sha512-mPYksnfHnemNrvjrDhZyixL/AfbJN0Xn9S34ZOHYdh6/jJcNd8iTsv3JwJoEvTJqjMggjMhGUPJAdjnFBHoH8A==
-
-esbuild-linux-arm@0.15.16:
-  version "0.15.16"
-  resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.15.16.tgz#6963f061a2b778aad7df2bfb6fa32d1904313f7f"
-  integrity sha512-XKcrxCEXDTOuoRj5l12tJnkvuxXBMKwEC5j0JISw3ziLf0j4zIwXbKbTmUrKFWbo6ZgvNpa7Y5dnbsjVvH39bQ==
-
-esbuild-linux-mips64le@0.15.16:
-  version "0.15.16"
-  resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.16.tgz#e2aed3527e551f8182c6b0fc8a045726fd98ad87"
-  integrity sha512-kSJO2PXaxfm0pWY39+YX+QtpFqyyrcp0ZeI8QPTrcFVQoWEPiPVtOfTZeS3ZKedfH+Ga38c4DSzmKMQJocQv6A==
-
-esbuild-linux-ppc64le@0.15.16:
-  version "0.15.16"
-  resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.16.tgz#fa3095b24950f63408f46f34b6d9a073ed88d53f"
-  integrity sha512-NimPikwkBY0yGABw6SlhKrtT35sU4O23xkhlrTT/O6lSxv3Pm5iSc6OYaqVAHWkLdVf31bF4UDVFO+D990WpAA==
-
-esbuild-linux-riscv64@0.15.16:
-  version "0.15.16"
-  resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.16.tgz#19c012dcc55c9d6d2a3855aa77c2c5217182cd1e"
-  integrity sha512-ty2YUHZlwFOwp7pR+J87M4CVrXJIf5ZZtU/umpxgVJBXvWjhziSLEQxvl30SYfUPq0nzeWKBGw5i/DieiHeKfw==
-
-esbuild-linux-s390x@0.15.16:
-  version "0.15.16"
-  resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.16.tgz#aa61f64740e5b983cc3ebb4183a03df4b435a873"
-  integrity sha512-VkZaGssvPDQtx4fvVdZ9czezmyWyzpQhEbSNsHZZN0BHvxRLOYAQ7sjay8nMQwYswP6O2KlZluRMNPYefFRs+w==
-
-esbuild-netbsd-64@0.15.16:
-  version "0.15.16"
-  resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.16.tgz#dffdc104c1f2bafc42be3faa21376c0a092f5702"
-  integrity sha512-ElQ9rhdY51et6MJTWrCPbqOd/YuPowD7Cxx3ee8wlmXQQVW7UvQI6nSprJ9uVFQISqSF5e5EWpwWqXZsECLvXg==
-
-esbuild-openbsd-64@0.15.16:
-  version "0.15.16"
-  resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.16.tgz#e5987f8eda55ea5f6ef6258afb1a838158f890bb"
-  integrity sha512-KgxMHyxMCT+NdLQE1zVJEsLSt2QQBAvJfmUGDmgEq8Fvjrf6vSKB00dVHUEDKcJwMID6CdgCpvYNt999tIYhqA==
-
-esbuild-sunos-64@0.15.16:
-  version "0.15.16"
-  resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.15.16.tgz#60a085aa4b74d900e4de8c00a9fce207937320a2"
-  integrity sha512-exSAx8Phj7QylXHlMfIyEfNrmqnLxFqLxdQF6MBHPdHAjT7fsKaX6XIJn+aQEFiOcE4X8e7VvdMCJ+WDZxjSRQ==
-
-esbuild-windows-32@0.15.16:
-  version "0.15.16"
-  resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.15.16.tgz#24f94e5fb243d211c7db9a12985fd2880ba98ca3"
-  integrity sha512-zQgWpY5pUCSTOwqKQ6/vOCJfRssTvxFuEkpB4f2VUGPBpdddZfdj8hbZuFRdZRPIVHvN7juGcpgCA/XCF37mAQ==
-
 esbuild-windows-64@0.15.16:
   version "0.15.16"
   resolved "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.16.tgz"
   integrity sha512-HjW1hHRLSncnM3MBCP7iquatHVJq9l0S2xxsHHj4yzf4nm9TU4Z7k4NkeMlD/dHQ4jPlQQhwcMvwbJiOefSuZw==
 
-esbuild-windows-arm64@0.15.16:
-  version "0.15.16"
-  resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.16.tgz#77e804d60dec0390fe8f21401e39b435d5d1b863"
-  integrity sha512-oCcUKrJaMn04Vxy9Ekd8x23O8LoU01+4NOkQ2iBToKgnGj5eo1vU9i27NQZ9qC8NFZgnQQZg5oZWAejmbsppNA==
-
 esbuild@^0.15.9:
   version "0.15.16"
   resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.15.16.tgz"
@@ -742,11 +637,6 @@ formdata-polyfill@^4.0.7:
   dependencies:
     fetch-blob "^3.1.2"
 
-fsevents@~2.3.2:
-  version "2.3.3"
-  resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6"
-  integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==
-
 function-bind@^1.1.1:
   version "1.1.1"
   resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz"
@@ -857,7 +747,7 @@ locate-path@^6.0.0:
   dependencies:
     p-locate "^5.0.0"
 
-lodash-es@^4.17.21:
+lodash-es@*, lodash-es@^4.17.21:
   version "4.17.21"
   resolved "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz"
   integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==
@@ -867,7 +757,7 @@ lodash-unified@^1.0.2:
   resolved "https://registry.npmjs.org/lodash-unified/-/lodash-unified-1.0.2.tgz"
   integrity sha512-OGbEy+1P+UT26CYi4opY4gebD8cWRDxAT6MAObIVQMiqYdxZr1g3QHWCToVsm31x2NkLS4K3+MC2qInaRMa39g==
 
-lodash@^4.17.21:
+lodash@*, lodash@^4.17.21:
   version "4.17.21"
   resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz"
   integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
@@ -893,7 +783,21 @@ magic-string@^0.27.0:
   dependencies:
     "@jridgewell/sourcemap-codec" "^1.4.13"
 
-magic-string@^0.30.0, magic-string@^0.30.2, magic-string@^0.30.5:
+magic-string@^0.30.0:
+  version "0.30.5"
+  resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz"
+  integrity sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==
+  dependencies:
+    "@jridgewell/sourcemap-codec" "^1.4.15"
+
+magic-string@^0.30.2:
+  version "0.30.5"
+  resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz"
+  integrity sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==
+  dependencies:
+    "@jridgewell/sourcemap-codec" "^1.4.15"
+
+magic-string@^0.30.5:
   version "0.30.5"
   resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz"
   integrity sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==
@@ -1094,7 +998,7 @@ reusify@^1.0.4:
   resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz"
   integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
 
-rollup@^2.79.1:
+rollup@^1.20.0||^2.0.0||^3.0.0||^4.0.0, rollup@^2.79.1:
   version "2.79.1"
   resolved "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz"
   integrity sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==
@@ -1108,7 +1012,7 @@ run-parallel@^1.1.9:
   dependencies:
     queue-microtask "^1.2.2"
 
-sass@^1.69.5:
+sass@*, sass@^1.69.5:
   version "1.69.7"
   resolved "https://registry.npmjs.org/sass/-/sass-1.69.7.tgz"
   integrity sha512-rzj2soDeZ8wtE2egyLXgOOHQvaC2iosZrkF6v3EUG+tBwEvhqUCzm0VP3k9gHF9LXbSrRhT5SksoI56Iw8NPnQ==
@@ -1144,7 +1048,7 @@ signal-exit@^3.0.3:
   resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz"
   integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
 
-"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2:
+source-map-js@^1.0.2, "source-map-js@>=0.6.2 <2.0.0":
   version "1.0.2"
   resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz"
   integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
@@ -1294,7 +1198,7 @@ vite-plugin-windicss@^1.9.2:
     kolorist "^1.8.0"
     windicss "^3.5.6"
 
-vite@^3.2.7:
+"vite@^2.0.1 || ^3.0.0 || ^4.0.0 || ^5.0.0", vite@^3.0.0, vite@^3.0.0-beta.0, vite@^3.2.7:
   version "3.2.7"
   resolved "https://registry.npmjs.org/vite/-/vite-3.2.7.tgz"
   integrity sha512-29pdXjk49xAP0QBr0xXqu2s5jiQIXNvE/xwd0vUizYT2Hzqe4BksNNoWllFVXJf4eLZ+UlVQmXfB4lWrc+t18g==
@@ -1323,7 +1227,7 @@ vue-router@^4.2.5:
   dependencies:
     "@vue/devtools-api" "^6.5.0"
 
-vue@^3.3.13:
+"vue@^2.7.0 || ^3.2.25", vue@^3.0.0, "vue@^3.0.0-0 || ^2.6.0", vue@^3.2.0, vue@^3.2.25, vue@^3.3.13, "vue@2 || 3", vue@3.4.5:
   version "3.4.5"
   resolved "https://registry.npmjs.org/vue/-/vue-3.4.5.tgz"
   integrity sha512-VH6nHFhLPjgu2oh5vEBXoNZxsGHuZNr3qf4PHClwJWw6IDqw6B3x+4J+ABdoZ0aJuT8Zi0zf3GpGlLQCrGWHrw==