浏览代码

更新路由菜单

ZaiZai 2 年之前
父节点
当前提交
8e9b79b3f5

+ 3 - 3
package.json

@@ -19,10 +19,10 @@
         "dayjs": "^1.11.8",
         "echarts": "^5.4.2",
         "element-plus": "2.3.6",
-        "hc-vue3-ui": "^1.3.6",
+        "hc-vue3-ui": "^1.3.8",
         "js-base64": "^3.7.5",
         "js-cookie": "^3.0.5",
-        "js-fast-way": "^0.1.0",
+        "js-fast-way": "^0.1.7",
         "js-md5": "^0.7.3",
         "nprogress": "^0.2.0",
         "pinia": "^2.1.3",
@@ -37,7 +37,7 @@
         "autoprefixer": "^10.4.14",
         "cssnano": "^6.0.1",
         "postcss": "^8.4.24",
-        "sass": "^1.63.2",
+        "sass": "^1.63.3",
         "tailwindcss": "3.3.2",
         "vite": "^4.3.9",
         "z-element-plus": "^1.1.3"

+ 7 - 11
src/api/request/httpApi.js

@@ -2,15 +2,11 @@ import request from "./index";
 import {getObjValue} from "js-fast-way"
 
 //封装的请求
-export const httpApi = async (obj, message = true) => {
+export const httpApi = async (obj) => {
     return new Promise((resolve) => {
-        //发起请求
         request(obj).then((response) => {
             resolve(getResData(response, false));
         }).catch((response) => {
-            if (message) {
-                window.$message?.error(getMsgVal(response));
-            }
             resolve(getResData(response, true));
         })
     });
@@ -18,15 +14,15 @@ export const httpApi = async (obj, message = true) => {
 
 //处理数据
 const getResData = (response, error = false) => {
-    const headers = getObjValue(response?.headers)
+    const headers = getObjValue(response?.headers), resData = getObjValue(response?.data);
     return {
         response,
-        res: response?.data,
-        data: response?.data?.data,
-        code: response?.data?.code,
-        msg: response?.data?.msg,
+        res: resData,
+        data: resData?.data,
+        code: resData?.code,
+        msg: resData?.msg,
         status: response?.status,
-        disposition: response?.headers['content-disposition'],
+        disposition: headers['content-disposition'],
         message: getMsgVal(response),
         error: error
     }

+ 1 - 1
src/config/index.json

@@ -1,6 +1,6 @@
 {
     "version": "20230607160059",
-    "target": "http://192.168.0.109:8090",
+    "target": "http://192.168.0.115:8090",
     "smsPhone": "",
     "vite": {
         "port": 5174,

+ 9 - 114
src/layout/index.vue

@@ -1,6 +1,6 @@
 <template>
     <el-container class="hc-layout-box">
-        <el-aside :class="[isCollapse?'is-collapse':'', MenuBarKey]" :width="isCollapse?'90px':'250px'"
+        <el-aside :class="[isCollapse?'is-collapse':'']" :width="isCollapse?'90px':'250px'"
                   class="hc-aside-box">
             <div class="hc-aside-logo-box" @click="logoClick">
                 <template v-if="appLogoIcon">
@@ -11,8 +11,7 @@
             </div>
             <div class="hc-aside-menu-box">
                 <el-scrollbar>
-                    <MenuBar :collapse="isCollapse" :cur="MenuBarKey" :datas="MenuBarData" :msgCount="msgCount"
-                             @change="MenuBarChange"/>
+                    <MenuBar :collapse="isCollapse" :cur="MenuBarKey" :datas="MenuBarData" @change="MenuBarChange"/>
                 </el-scrollbar>
             </div>
             <div class="hc-aside-bar-box">
@@ -24,11 +23,9 @@
                 </div>
             </div>
         </el-aside>
-        <el-container :class="MenuBarKey === 'home-index'?'home':''" class="hc-container-view">
+        <el-container class="hc-container-view">
             <el-header class="hc-header-view">
-                <div id="hc-header-page-name" class="hc-header-page-name">
-                    {{ RoutesTitle }}
-                </div>
+                <div id="hc-header-page-name" class="hc-header-page-name">{{ RoutesTitle }}</div>
                 <div class="hc-header-top-menu-bar">
                     <TopMenuBar/>
                 </div>
@@ -50,8 +47,8 @@
             <el-main id="hc-main-box" class="hc-main-box">
                 <router-view v-if="reloadRouter" v-slot="{ Component }">
                     <transition name="fade-transform">
-                        <keep-alive :max="10" exclude="home,home-index,home-config">
-                            <component :is="Component" :msgCount="msgCount"/>
+                        <keep-alive :max="10" exclude="home">
+                            <component :is="Component"/>
                         </keep-alive>
                     </transition>
                 </router-view>
@@ -95,7 +92,6 @@ const AppColor = ref(useAppState.getColor);
 
 //顶部菜单数据和相关处理
 const MenuBarKey = ref(BarMenuKey);
-const RoutesName = ref(BarMenuKey);
 const RoutesTitle = ref(BarMenuTitle);
 const MenuBarData = ref(useAppState.getMenus)
 const isCollapse = ref(useAppState.getCollapse)
@@ -119,8 +115,6 @@ onMounted(() => {
     const info = useAppState.getProjectContract || []
     projectContractData(info);
     useAppState.barMenuName = BarMenuTitle
-    setIsCollapse(RoutesName.value)
-    setInitSocket()
     setLogoImageColor()
 })
 
@@ -133,11 +127,9 @@ watch(() => [
     useAppState.getCollapse,
 ], ([projectContractArr, userMenus, RouteName, RouteTitle, collapse]) => {
     MenuBarData.value = userMenus
-    RoutesName.value = RouteName ?? 'home-index'
     MenuBarKey.value = RouteName ?? 'home-index'
     RoutesTitle.value = RouteTitle ?? ''
     isCollapse.value = collapse
-    setIsCollapse(RoutesName.value)
     projectContractData(projectContractArr || []);
     useAppState.barMenuName = RouteTitle ?? ''
     setAppName(appTitle.value)
@@ -162,14 +154,6 @@ const setLogoImageColor = () => {
     setImageColorStyle('logo-icon', AppColor.value?.color)
 }
 
-//设置折叠
-const setIsCollapse = (key) => {
-    if (key === 'data-fill-wbs') {
-        isCollapse.value = true
-        useAppState.setCollapse(true)
-    }
-}
-
 //是否折叠
 const collapseChange = (bool) => {
     isCollapse.value = bool
@@ -210,14 +194,10 @@ const projectContractData = (projectContractData) => {
             useAppState.setContractInfo(letContractInfo)
             useAppState.setProjectId(letProjectInfo?.id)
             useAppState.setContractId(letContractInfo?.id)
-            //发送消息
-            socketSend(letProjectInfo?.id + ',' + letContractInfo?.id)
         } else {
             projectValue.value = String(contractId)
             projectInfo.value = UserProjectInfo
             contractInfo.value = UserContractInfo
-            //发送消息
-            socketSend(projectId + ',' + contractId)
         }
     } else {
         projectContract.value = []
@@ -243,8 +223,6 @@ const projectContractChange = (val) => {
         projectInfo.value = UserProjectInfo
         contractInfo.value = UserContractInfo
         window.$message?.info('切换了项目,数据更新中');
-        //发送消息
-        socketSend(val[0] + ',' + val[1])
         //刷新路由
         reloadRouter.value = false
         nextTick(() => {
@@ -256,64 +234,14 @@ const projectContractChange = (val) => {
 //菜单被点击
 const MenuBarChange = (item) => {
     MenuBarKey.value = item?.code;
-    setIsCollapse(item?.code)
     router.push({name: item?.code});
 }
 
 //首页
 const logoClick = () => {
-    router.push({name: 'home-index'});
-}
-
-//消息数量
-const msgCount = ref({
-    allCount: 0,
-    taskCount: 0,
-    messageCount: 0,
-    messageCount_1: 0,
-    messageCount_2: 0,
-    messageCount_3: 0,
-    messageCount_4: 0,
-    messageCount_5: 0,
-})
-
-//推送系统
-let socket;
-const setInitSocket = () => {
-    const user_id = userInfo.value.user_id;
-    socket = new WebSocket(website.socket + user_id);
-    try {
-        socket.onopen = function (evt) {
-            console.log('websocket链接成功');
-        };
-        socket.onclose = function (evt) {
-            console.log('websocket连接已断开')
-        };
-        socket.onmessage = function ({data}) {
-            if (data) {
-                msgCount.value = JSON.parse(data)
-            }
-            console.log(data, '消息信息')
-        };
-        socket.onerror = function ({data}) {
-            console.log('发生错误:', data)
-        };
-    } catch {
-    }
-}
-
-//发送消息
-const socketSend = (msg) => {
-    try {
-        if (socket) {
-            socket.send(msg);
-        } else {
-            setTimeout(() => {
-                socket.send(msg);
-            }, 1000)
-        }
-    } catch {
-    }
+    router.push({
+        name: useAppState.homeUrl
+    });
 }
 </script>
 
@@ -347,39 +275,6 @@ const socketSend = (msg) => {
             font-weight: bold;
         }
     }
-    &.home {
-        .hc-header-view .hc-header-content .hc-header-cascader-box {
-            .el-cascader .el-input .el-input__wrapper {
-                background-color: #00000000;
-                border: 1px solid white;
-                box-shadow: initial;
-                .el-input__inner, .el-input__suffix {
-                    color: white;
-                }
-            }
-            .el-cascader .el-input.is-focus .el-input__wrapper {
-                box-shadow: initial;
-            }
-        }
-        .hc-header-view .hc-header-top-menu-bar {
-            padding-left: 0;
-            .hc-top-menu-bar .bar-menu-content .bar-menu-btn {
-                background: rgba(255, 255, 255, .2);
-                border-color: rgba(255, 255, 255, .2);
-                color: rgba(255, 255, 255, .7);
-                backdrop-filter: blur(20px);
-                -webkit-backdrop-filter: blur(20px);
-                &:hover:not([class*='cur']) {
-                    background: var(--el-color-primary-light-9);
-                    color: #838791;
-                }
-                &:active:not([class*='cur']) {
-                    background: var(--el-color-primary-light-8);
-                    color: #838791;
-                }
-            }
-        }
-    }
 }
 
 </style>

+ 2 - 30
src/layout/layout.scss

@@ -2,27 +2,12 @@
     position: relative;
     height: 100vh;
     width: 100%;
-    .hc-layout-bg-box {
-        position: absolute;
-        bottom: 0;
-        left: 0;
-        right: 0;
-        top: 0;
-        z-index: 0;
-        display: flex;
-        img {
-            width: 100%;
-            height: 100%;
-            object-fit: cover;
-        }
-    }
     .hc-aside-box {
         position: relative;
         color: #838791;
         background: #f1f5f8;
         transition: 0.2s;
         box-shadow: -2px 0 10px 0 rgba(32, 37, 50, 0.03), 0 10px 21px 20px rgba(32, 37, 50, 0.03);
-        border-radius: 0 60px 0 0;
         z-index: 1;
         .hc-aside-logo-box {
             position: relative;
@@ -94,21 +79,8 @@
                 }
             }
         }
-        &.is-collapse {
-            border-radius: 0 50px 0 0;
-            .hc-aside-logo-box {
-                left: initial;
-            }
-        }
-        &.home-index {
-            color: white;
-            background: rgba(255, 255, 255, 0.35);
-            box-shadow: 0 2px 10px 0 rgba(32, 37, 50, 0.03);
-            backdrop-filter: blur(20px);
-            -webkit-backdrop-filter: blur(20px);
-            .hc-aside-menu-box .hc-aside-menu.el-menu {
-                --el-menu-text-color: white;
-            }
+        &.is-collapse .hc-aside-logo-box {
+            left: initial;
         }
     }
     .hc-container-view {

+ 52 - 77
src/layout/modules/MenuBar.vue

@@ -1,21 +1,12 @@
 <template>
     <el-menu :collapse="isCollapse" :default-active="curKey" class="hc-aside-menu" unique-opened>
-        <el-menu-item index="home-index" @click="MenuClick({code: 'home-index'})">
-            <div class="hc-aside-menu-item">
-                <div class="menu---item">
-                    <HcIcon :fill="curKey === 'home-index'" class="hc-menu-icon" name="home-3"/>
-                    <div class="name">首页</div>
-                </div>
-            </div>
-        </el-menu-item>
-        <MenuItem :collapse="isCollapse" :cur="curKey" :datas="datas" :msgCount="msgCount" @change="MenuClick"/>
+        <MenuItem :collapse="isCollapse" :cur="curKey" :datas="datas" @change="MenuClick"/>
     </el-menu>
 </template>
 
 <script setup>
 import {ref, watch} from "vue";
 import MenuItem from "./MenuItem.vue"
-import {getToken} from "~src/api/util/auth";
 
 const props = defineProps({
     datas: {
@@ -30,10 +21,6 @@ const props = defineProps({
         type: Boolean,
         default: false
     },
-    msgCount: {
-        type: Object,
-        default: () => ({})
-    },
 })
 
 //初始变量
@@ -53,29 +40,21 @@ watch(() => [
 //事件
 const emit = defineEmits(['change'])
 const MenuClick = (item) => {
-    if (item?.code === 'to-archives-url') {
-        const token = getToken()
-        //refreshToken, accessToken
-        window.open(item?.path + '/#/auth?token=' + token, '_blank')
-    } else {
-        curKey.value = item?.code || '';
-        emit('change', item)
-    }
+    curKey.value = item?.code || '';
+    emit('change', item)
 }
 </script>
 
 <style lang="scss">
 .hc-aside-menu.el-menu {
-    --el-menu-bg-color: initial;
+    --el-menu-bg-color: transparent;
     --el-menu-text-color: #838791;
     --el-menu-active-color: #ffffff;
-    --el-menu-hover-text-color: var(--el-color-primary);
-    --el-menu-hover-bg-color: initial;
+    --el-menu-hover-text-color: var(--el-menu-text-color);
+    --el-menu-hover-bg-color: var(--el-color-primary-light-8);
     --el-menu-item-font-size: 16px;
     --el-menu-item-height: 48px;
-    margin-left: -10px;
     border-right: 0;
-    padding: 8px 0;
     &.el-menu--vertical:not(.el-menu--collapse):not(.el-menu--popup-container) .el-menu-item,
     &.el-menu--vertical:not(.el-menu--collapse):not(.el-menu--popup-container) .el-menu-item-group__title,
     &.el-menu--vertical:not(.el-menu--collapse):not(.el-menu--popup-container) .el-sub-menu__title {
@@ -83,20 +62,19 @@ const MenuClick = (item) => {
         padding-left: 0;
     }
     &.el-menu--vertical:not(.el-menu--collapse):not(.el-menu--popup-container) .el-sub-menu__title {
-        padding-right: 10px;
+        padding-right: 1px;
+        border: 0;
     }
     .el-sub-menu__title {
         padding: 0;
     }
     .el-menu-item, .el-sub-menu {
-        padding: 15px 0 0 30px !important;
         min-width: initial;
         transition: 0.2s;
         .hc-aside-menu-item {
             flex: 1;
             position: relative;
-            border-radius: 50px 0 0 50px;
-            padding: 0 16px;
+            padding: 0 20px;
             display: flex;
             align-items: center;
             transition: 0.2s;
@@ -104,17 +82,26 @@ const MenuClick = (item) => {
                 display: contents;
             }
             .hc-menu-icon {
-                font-size: 22px;
-                margin-right: 10px;
+                position: relative;
+                font-size: 18px;
+                margin-right: 8px;
                 line-height: initial;
             }
             .name {
                 flex: 1;
                 width: 0;
             }
-            .el-badge, .el-badge .el-badge__content {
-                vertical-align: initial;
-            }
+        }
+    }
+    .el-sub-menu .el-menu .el-menu-item {
+        padding-left: 24px !important;
+        padding-right: 1px;
+        font-size: 14px;
+        height: 46px;
+        line-height: initial;
+        .hc-aside-menu-item .hc-menu-icon {
+            margin-right: 6px;
+            font-size: 14px;
         }
     }
     .el-sub-menu .el-icon {
@@ -131,45 +118,28 @@ const MenuClick = (item) => {
         margin-top: 0;
         vertical-align: initial;
     }
-    .el-sub-menu .el-sub-menu__title .hc-aside-menu-item:hover,
-    .el-menu-item:not(.is-active) .hc-aside-menu-item:hover {
-        color: var(--el-color-primary);
-    }
-    .el-sub-menu.is-active > .el-sub-menu__title > .hc-aside-menu-item {
-        color: var(--el-color-primary);
+    .el-sub-menu.is-active > .el-sub-menu__title {
+        background-color: var(--el-color-primary-light-8);
     }
     .el-menu-item.is-active {
-        .hc-aside-menu-item {
-            --radius-size: 20px;
-            background-color: var(--el-color-primary);
-            box-shadow: 0 2px 8px 0 var(--hc-shadow-color-5);
-            &::before, &::after {
-                content: '';
-                display: block;
-                height: var(--radius-size);
-                width: var(--radius-size);
-                position: absolute;
-                background: radial-gradient(
-                        var(--radius-size) at var(--radius-size) 0px,
-                        transparent var(--radius-size),
-                        var(--el-color-primary) var(--radius-size)
-                );
-            }
-            &::before {
-                right: 0;
-                transform: scaleX(-1);
-                top: calc(-1 * var(--radius-size));
-                z-index: 999;
-            }
-            &::after {
-                right: 0;
-                bottom: calc(-1 * var(--radius-size));
-                transform: scale(-1);
-                z-index: 999;
-            }
+        background-color: var(--el-color-primary-light-5);
+        &::after {
+            content: '';
+            position: absolute;
+            right: 0;
+            top: 0;
+            width: 3px;
+            height: 100%;
+            background-color: white;
         }
     }
+    .el-sub-menu .el-sub-menu__title:hover,
+    .el-menu-item:not(.is-active):hover {
+        background-color: var(--el-color-primary-light-7);
+    }
 }
+
+//折叠状态
 .hc-aside-menu.el-menu--collapse {
     margin-left: 0;
     width: 90px;
@@ -228,7 +198,17 @@ const MenuClick = (item) => {
     .el-menu-item + .el-sub-menu,
     .el-sub-menu + .el-menu-item,
     .el-sub-menu + .el-sub-menu {
-        margin-top: 24px;
+        margin-top: 12px;
+    }
+    .el-sub-menu.is-active > .el-sub-menu__title {
+        background-color: initial;
+    }
+    .el-menu-item.is-active {
+        background-color: initial;
+    }
+    .el-sub-menu .el-sub-menu__title:hover,
+    .el-menu-item:not(.is-active):hover {
+        background-color: initial;
     }
     .el-sub-menu:not(.is-active):hover,
     .el-menu-item:not(.is-active):hover {
@@ -240,12 +220,7 @@ const MenuClick = (item) => {
     .el-menu-item.is-active, .el-sub-menu.is-active {
         .hc-aside-menu-item {
             color: #ffffff !important;
-            background: linear-gradient(90deg, var(--el-color-primary-light-5), var(--el-color-primary) 100%);
-            box-shadow: 0 2px 8px 0 var(--hc-shadow-color-5);
-            &::before, &::after {
-                content: '';
-                display: none;
-            }
+            background: var(--el-color-primary-dark-2);
         }
     }
 }

+ 2 - 18
src/layout/modules/MenuItem.vue

@@ -1,18 +1,17 @@
 <template>
     <template v-for="item in datas">
-        <el-sub-menu :index="item?.code" :popper-offset="0" :popper-class="'aside-menu-popper ' + curKey" v-if="item?.children && item?.children.length > 0">
+        <el-sub-menu :index="item?.code" :popper-offset="0" popper-class="aside-menu-popper" v-if="item?.children && item?.children.length > 0">
             <template #title>
                 <div class="hc-aside-menu-item">
                     <div class="menu---item">
                         <HcIcon :name="item?.source" :fill="curKey === item?.code" class="hc-menu-icon" v-if="item?.source"/>
                         <div class="name truncate" v-if="isCollapse">{{ item?.name.substring(0,2) }}</div>
                         <div class="name truncate" v-else>{{ item?.name }}</div>
-                        <el-badge :value="msgCount.allCount" v-if="item?.code === 'tasks' && msgCount?.allCount > 0"/>
                     </div>
                 </div>
                 <HcIcon name="arrow-down-s" ui="el-icon el-sub-menu__icon-arrow"/>
             </template>
-            <MenuItem :datas="item?.children" :cur="curKey" :msgCount="msgCount" @change="MenuClick"/>
+            <MenuItem :datas="item?.children" @change="MenuClick"/>
         </el-sub-menu>
         <el-menu-item :index="item?.code" v-else @click="MenuClick(item)">
             <div class="hc-aside-menu-item">
@@ -20,8 +19,6 @@
                     <HcIcon :name="item?.source" :fill="curKey === item?.code" class="hc-menu-icon" v-if="item?.source"/>
                     <div class="name truncate" v-if="isCollapse">{{ item?.name.substring(0,2) }}</div>
                     <div class="name truncate" v-else>{{ item?.name }}</div>
-                    <el-badge :value="msgCount.taskCount" v-if="item?.code === 'tasks-data' && msgCount?.taskCount > 0"/>
-                    <el-badge :value="msgCount.messageCount" v-if="item?.code === 'message-data' && msgCount?.messageCount > 0"/>
                 </div>
             </div>
         </el-menu-item>
@@ -44,19 +41,6 @@ const props = defineProps({
         type: Boolean,
         default: false
     },
-    msgCount: {
-        type: Object,
-        default: () => ({
-            allCount: 0,
-            taskCount: 0,
-            messageCount: 0,
-            messageCount_1:0,
-            messageCount_2:0,
-            messageCount_3:0,
-            messageCount_4:0,
-            messageCount_5:0,
-        })
-    },
 })
 //初始变量
 const curKey = ref(props.cur);

+ 1 - 1
src/layout/modules/UserInfoBar.vue

@@ -81,7 +81,7 @@ const options = [
 const emit = defineEmits(['change'])
 const handleSelect = (key) => {
     if (key === 'my') {
-        router.push({name: 'user-index'});
+        //router.push({name: 'user-index'});
     } else if (key === 'logout') {
         LogOut().then();
         window.$message?.info('退出成功');

+ 1 - 0
src/store/index.js

@@ -24,6 +24,7 @@ export const useAppStore = defineStore('main', {
         //菜单信息
         menus: getStoreValue('menus') || [],
         buttons: getStoreValue('buttons') || {},
+        homeUrl: getStoreValue('homeUrl') || 'home', //首页路由
         //项目合同段数据
         projectContract: getStoreValue('projectContract') || [],
         projectInfo: getStoreValue('projectInfo') || {},

+ 3 - 1
src/views/home/index.vue

@@ -1,5 +1,7 @@
 <template>
-    11
+    <div>
+        111
+    </div>
 </template>
 
 <script setup>

+ 16 - 2
src/views/login/index.vue

@@ -42,8 +42,9 @@ import logo from "~src/assets/logo/logo.png";
 import router from '~src/router/index';
 import {useAppStore} from "~src/store";
 import {useAppLogin} from "~sto/user";
-import {formValidate} from "js-fast-way"
+import {formValidate, getArrValue} from "js-fast-way"
 import website from '~src/config/index'
+import {getStoreValue} from "~uti/storage";
 
 const userStore = useAppStore()
 userStore.clearStoreData() //先清理下缓存
@@ -79,12 +80,25 @@ const formValidateClick = async () => {
         useAppLogin(formValue.value).then(() => {
             loading.value = false;
             window?.$message?.success('登录成功');
-            router.push({path: '/home/index'});
+            setHomeRouter();
         }).catch(() => {
             loading.value = false;
         })
     }
 }
+
+//处理作为首页的路由
+const setHomeRouter = () => {
+    const routes = getArrValue(getStoreValue('routes'))
+    let appHomeUrl = 'lar-count-index'
+    if (routes.indexOf(appHomeUrl) === -1) {
+        appHomeUrl = routes[routes.length - 1]
+    }
+    userStore.homeUrl = appHomeUrl
+    router.push({
+        name: appHomeUrl
+    });
+}
 </script>
 
 <style lang="scss" scoped>

+ 13 - 13
yarn.lock

@@ -958,15 +958,15 @@ has@^1.0.3:
   dependencies:
     function-bind "^1.1.1"
 
-hc-vue3-ui@^1.3.6:
-  version "1.3.7"
-  resolved "http://47.110.251.215:9000/hc-vue3-ui/-/hc-vue3-ui-1.3.7.tgz#862b18d0fffb020e44b91995f86cfa25f9fd19a2"
-  integrity sha512-TbCSwXvoFux5j+b2H1oJAcLaj6YE5leMo53cEFpFcTb39Vx2vY3Vvt58hWF5VH6mumUAnp9GBPlYfWNmC7Pneg==
+hc-vue3-ui@^1.3.8:
+  version "1.3.8"
+  resolved "http://47.110.251.215:9000/hc-vue3-ui/-/hc-vue3-ui-1.3.8.tgz#5305ae6001e1740eb44c8e758053c0c6f7932226"
+  integrity sha512-D7XioKnePX8ZukmzZ//GnWrMj7d65a6uohYA0zPbLu3/sH1Qjo3jRvTelodoh4ECuuwUqARgj+DHYRj/aJu7pg==
   dependencies:
     axios "^1.4.0"
     dayjs "^1.11.8"
     element-plus "^2.3.6"
-    js-fast-way "^0.1.0"
+    js-fast-way "^0.1.7"
     js-md5 "^0.7.3"
     simple-uploader.js "^0.6.0"
     sortablejs "^1.15.0"
@@ -1047,10 +1047,10 @@ js-cookie@^3.0.5:
   resolved "http://47.110.251.215:9000/js-cookie/-/js-cookie-3.0.5.tgz#0b7e2fd0c01552c58ba86e0841f94dc2557dcdbc"
   integrity sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==
 
-js-fast-way@^0.1.0:
-  version "0.1.0"
-  resolved "http://47.110.251.215:9000/js-fast-way/-/js-fast-way-0.1.0.tgz#92da060b161e5602c37cb4d2d6d4338958d8b807"
-  integrity sha512-Pv/x/Adk2QVvTpcDQaJ1O3++NsEFAfT3OdwgAfB+mwEx6Q3fmFnT4WdYjNtEcnlNcaAg+k65FTdsEoNsUHedlA==
+js-fast-way@^0.1.7:
+  version "0.1.7"
+  resolved "http://47.110.251.215:9000/js-fast-way/-/js-fast-way-0.1.7.tgz#5ac629bd230e107a99e2d494aebac48844579395"
+  integrity sha512-BYPWO/Apz8QipaVBps1nGwB8xLmHMhQkM89A5JZkZ55JspUNLw7Lb7LWzw7KsZEek18R2T9RqFNGkDzdgWwm2w==
 
 js-md5@^0.7.3:
   version "0.7.3"
@@ -1631,10 +1631,10 @@ safe-buffer@~5.2.0:
   resolved "http://47.110.251.215:9000/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
   integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
 
-sass@^1.63.2:
-  version "1.63.2"
-  resolved "http://47.110.251.215:9000/sass/-/sass-1.63.2.tgz#75f7d9a8e67d1d5b98a989507f4d98b6067b1f75"
-  integrity sha512-u56TU0AIFqMtauKl/OJ1AeFsXqRHkgO7nCWmHaDwfxDo9GUMSqBA4NEh6GMuh1CYVM7zuROYtZrHzPc2ixK+ww==
+sass@^1.63.3:
+  version "1.63.3"
+  resolved "http://47.110.251.215:9000/sass/-/sass-1.63.3.tgz#527746aa43bf2e4eac1ab424f67f6f18a081061a"
+  integrity sha512-ySdXN+DVpfwq49jG1+hmtDslYqpS7SkOR5GpF6o2bmb1RL/xS+wvPmegMvMywyfsmAV6p7TgwXYGrCZIFFbAHg==
   dependencies:
     chokidar ">=3.0.0 <4.0.0"
     immutable "^4.0.0"