Kaynağa Gözat

优化代码规范

ZaiZai 2 yıl önce
ebeveyn
işleme
d18adb39dd

+ 1 - 0
.eslintignore

@@ -4,6 +4,7 @@ public
 scripts
 zip
 assets
+styles
 README.md
 yarn.lock
 !.*

+ 12 - 12
src/App.vue

@@ -1,16 +1,16 @@
 <template>
     <HcAppConfig>
-        <router-view/>
+        <router-view />
     </HcAppConfig>
 </template>
 
 <script setup>
-import {nextTick, ref, watch} from "vue";
-import {useAppStore} from "~src/store";
-import {useOsTheme} from 'hc-vue3-ui'
-import {setElementMainColor, getObjValue} from "js-fast-way"
-import {getStoreValue, setStoreValue} from "~uti/storage";
-import {getVersionJson} from "~api/other";
+import { nextTick, ref, watch } from 'vue'
+import { useAppStore } from '~src/store'
+import { useOsTheme } from 'hc-vue3-ui'
+import { getObjValue, setElementMainColor } from 'js-fast-way'
+import { getStoreValue, setStoreValue } from '~uti/storage'
+import { getVersionJson } from '~api/other'
 
 //初始变量
 const appStore = useAppStore()
@@ -20,7 +20,7 @@ const UserTheme = ref(appStore.getTheme)
 watch(() => [
     appStore.getTheme,
     appStore.getThemeVal,
-    appStore.getColor
+    appStore.getColor,
 ], ([Theme, ThemeVal, ColorVal]) => {
     UserTheme.value = Theme
     setUserTheme(ThemeVal, ColorVal)
@@ -46,7 +46,7 @@ nextTick(() => {
 //获取版本更新信息
 const getVersionJsonApi = async () => {
     const cache_version = getStoreValue('version')
-    const {res} = await getVersionJson()
+    const { res } = await getVersionJson()
     const version = getObjValue(res)?.value
     setStoreValue('version', version)
     if (cache_version && cache_version !== version) {
@@ -60,7 +60,7 @@ const getVersionJsonApi = async () => {
                     //刷新页面
                     window.location.reload()
                 }
-            }
+            },
         })
     }
 }
@@ -74,10 +74,10 @@ const setUserTheme = (theme, appColor) => {
     //设置主题
     let val = UserTheme.value
     if (val === 'auto') {
-        theme = useOsTheme();
+        theme = useOsTheme()
     }
     if (theme === '') {
-        theme = val;
+        theme = val
     }
     //挂载相关样式
     document.documentElement.setAttribute('class', `${theme} color-${colorName}`)

+ 83 - 75
src/layout/index.vue

@@ -3,58 +3,66 @@
         <div v-show="MenuBarKey === 'home-index'" class="hc-layout-bg-box">
             <img v-if="HomeTheme.bg" id="imagebox" :src="HomeTheme.bg" alt="" crossOrigin="anonymous">
         </div>
-        <el-aside :class="[isCollapse?'is-collapse':'', MenuBarKey]" :width="isCollapse?'90px':'250px'"
-                  class="hc-aside-box">
+        <el-aside
+            :class="[isCollapse ? 'is-collapse' : '', MenuBarKey]" :width="isCollapse ? '90px' : '250px'"
+            class="hc-aside-box"
+        >
             <div class="hc-aside-logo-box" @click="logoClick">
                 <template v-if="appLogoIcon">
-                    <img :src="appLogoIcon" alt="" id="logo-icon">
-                    <img :src="appLogoName" alt="" id="logo-name" v-show="!isCollapse">
+                    <img id="logo-icon" :src="appLogoIcon" alt="">
+                    <img v-show="!isCollapse" id="logo-name" :src="appLogoName" alt="">
                 </template>
-                <div id="logo-icon" v-else></div>
+                <div v-else id="logo-icon" />
             </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" :msg-count="msgCount"
+                        @change="MenuBarChange"
+                    />
                 </el-scrollbar>
             </div>
             <div class="hc-aside-bar-box">
-                <div :class="isCollapse?'':'active'" @click="collapseChange(false)">
-                    <HcIcon name="menu-unfold"/>
+                <div :class="isCollapse ? '' : 'active'" @click="collapseChange(false)">
+                    <HcIcon name="menu-unfold" />
                 </div>
-                <div v-show="!isCollapse" :class="isCollapse?'active':''" @click="collapseChange(true)">
-                    <HcIcon name="menu-fold"/>
+                <div v-show="!isCollapse" :class="isCollapse ? 'active' : ''" @click="collapseChange(true)">
+                    <HcIcon name="menu-fold" />
                 </div>
             </div>
         </el-aside>
-        <el-container :class="MenuBarKey === 'home-index'?'home':''" class="hc-container-view">
+        <el-container :class="MenuBarKey === 'home-index' ? 'home' : ''" class="hc-container-view">
             <el-header class="hc-header-view">
                 <div id="hc-header-page-name" class="hc-header-page-name">
                     {{ RoutesTitle }}
                 </div>
                 <div class="hc-header-top-menu-bar">
-                    <TopMenuBar/>
+                    <TopMenuBar />
                 </div>
                 <div class="hc-header-content">
                     <div class="hc-header-cascader-box">
-                        <div class="project-name-box">{{ projectInfo.projectAlias }} / {{ contractInfo.name }}</div>
-                        <el-cascader ref="ElCascaderRef" v-model="projectValue"
-                                     :clearable="userInfo?.role_id === '1123598816738675201'"
-                                     :filterable="userInfo?.role_id === '1123598816738675201'"
-                                     :options="projectContract"
-                                     :props="projectProps" placeholder="请选择项目"
-                                     @change="projectContractChange"/>
+                        <div class="project-name-box">
+                            {{ projectInfo.projectAlias }} / {{ contractInfo.name }}
+                        </div>
+                        <el-cascader
+                            ref="ElCascaderRef" v-model="projectValue"
+                            :clearable="userInfo?.role_id === '1123598816738675201'"
+                            :filterable="userInfo?.role_id === '1123598816738675201'"
+                            :options="projectContract"
+                            :props="projectProps" placeholder="请选择项目"
+                            @change="projectContractChange"
+                        />
                     </div>
-                    <HelpInfoBar></HelpInfoBar>
-                    <ConfigBar></ConfigBar>
-                    <UserInfoBar></UserInfoBar>
+                    <HelpInfoBar />
+                    <ConfigBar />
+                    <UserInfoBar />
                 </div>
             </el-header>
             <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,other-file-view,other-file-form">
-                            <component :is="Component" :msgCount="msgCount"/>
+                            <component :is="Component" :msg-count="msgCount" />
                         </keep-alive>
                     </transition>
                 </router-view>
@@ -64,18 +72,18 @@
 </template>
 
 <script setup>
-import {onMounted, ref, nextTick, watch} from "vue";
-import {useRouter, useRoute} from 'vue-router'
-import {useAppStore} from "~src/store";
-import MenuBar from "./modules/MenuBar.vue"
-import HelpInfoBar from "./modules/HelpInfoBar.vue"
-import UserInfoBar from "./modules/UserInfoBar.vue"
-import ConfigBar from "./modules/ConfigBar.vue"
-import TopMenuBar from "./modules/TopMenuBar.vue"
-import {initButtons, initProjectContract} from "~sto/app";
+import { nextTick, onMounted, ref, watch } from 'vue'
+import { useRoute, useRouter } from 'vue-router'
+import { useAppStore } from '~src/store'
+import MenuBar from './modules/MenuBar.vue'
+import HelpInfoBar from './modules/HelpInfoBar.vue'
+import UserInfoBar from './modules/UserInfoBar.vue'
+import ConfigBar from './modules/ConfigBar.vue'
+import TopMenuBar from './modules/TopMenuBar.vue'
+import { initButtons, initProjectContract } from '~sto/app'
 import website from '~src/config/index'
-import {setImageColorStyle} from "js-fast-way";
-import {setAppName} from "~uti/tools";
+import { setImageColorStyle } from 'js-fast-way'
+import { setAppName } from '~uti/tools'
 
 //初始组合式
 const router = useRouter()
@@ -83,10 +91,10 @@ const useRoutes = useRoute()
 const useAppState = useAppStore()
 
 //路由参数
-const routerQuery = useRoutes?.query;
+const routerQuery = useRoutes?.query
 const reloadRouter = ref(true)
-const BarMenuKey = useRoutes?.name ?? 'home-index';
-const BarMenuTitle = useRoutes?.meta?.title ?? '';
+const BarMenuKey = useRoutes?.name ?? 'home-index'
+const BarMenuTitle = useRoutes?.meta?.title ?? ''
 
 //系统信息
 const appTitle = ref(useAppState.getTitle)
@@ -94,22 +102,22 @@ const appLogoIcon = ref(useAppState.getLogoIcon)
 const appLogoName = ref(useAppState.getLogoName)
 
 //主题和色调变量
-const HomeTheme = ref(useAppState.getHomeTheme);
-const AppColor = ref(useAppState.getColor);
+const HomeTheme = ref(useAppState.getHomeTheme)
+const AppColor = ref(useAppState.getColor)
 
 //顶部菜单数据和相关处理
-const MenuBarKey = ref(BarMenuKey);
-const RoutesName = ref(BarMenuKey);
-const RoutesTitle = ref(BarMenuTitle);
+const MenuBarKey = ref(BarMenuKey)
+const RoutesName = ref(BarMenuKey)
+const RoutesTitle = ref(BarMenuTitle)
 const MenuBarData = ref(useAppState.getMenus)
 const isCollapse = ref(useAppState.getCollapse)
-const userInfo = ref(useAppState.getUserInfo);
+const userInfo = ref(useAppState.getUserInfo)
 
 //项目合同段
-const projectInfo = ref({});
-const contractInfo = ref({});
+const projectInfo = ref({})
+const contractInfo = ref({})
 const projectContract = ref([])
-const projectValue = ref(null);
+const projectValue = ref(null)
 const projectProps = ref({
     value: 'id',
     label: 'projectAlias',
@@ -121,7 +129,7 @@ onMounted(() => {
     initButtons()
     initProjectContract()
     const info = useAppState.getProjectContract || []
-    projectContractData(info);
+    projectContractData(info)
     useAppState.barMenuName = BarMenuTitle
     setIsCollapse(RoutesName.value)
     setInitSocket()
@@ -145,7 +153,7 @@ watch(() => [
     RoutesTitle.value = RouteTitle ?? ''
     isCollapse.value = collapse
     setIsCollapse(RoutesName.value)
-    projectContractData(projectContractArr || []);
+    projectContractData(projectContractArr || [])
     useAppState.barMenuName = RouteTitle ?? ''
     setAppName(appTitle.value)
 })
@@ -175,8 +183,9 @@ const setLogoNameColor = (theme) => {
         if (theme === 'light') {
             filter = 'invert(0%) sepia(100%) saturate(0%) hue-rotate(235deg) brightness(107%) contrast(103%)'
         }
-        document.getElementById('logo-name').style.filter = filter;
-    } catch {}
+        document.getElementById('logo-name').style.filter = filter
+    } catch {
+    }
 }
 
 //设置折叠
@@ -205,8 +214,8 @@ const projectContractData = (projectContractData) => {
         })
         //处理其他数据
         projectContract.value = projectContractData
-        const projectId = useAppState.getProjectId     //项目ID
-        const contractId = useAppState.getContractId   //合同段ID
+        const projectId = useAppState.getProjectId //项目ID
+        const contractId = useAppState.getContractId //合同段ID
         const UserProjectInfo = useAppState.getProjectInfo
         const UserContractInfo = useAppState.getContractInfo
         //查询缓存的选中ID是否存在
@@ -216,9 +225,9 @@ const projectContractData = (projectContractData) => {
         //如果缓存的选中ID不存在
         if (cid === -1) {
             //取项目数组中的第一个数据
-            let letProjectInfo = projectContractData[0];
+            let letProjectInfo = projectContractData[0]
             let contractInfoList = letProjectInfo?.contractInfoList || []
-            let letContractInfo = contractInfoList[0] || {};
+            let letContractInfo = contractInfoList[0] || {}
             projectValue.value = letContractInfo?.id
             projectInfo.value = letProjectInfo
             contractInfo.value = letContractInfo
@@ -248,9 +257,9 @@ const projectContractData = (projectContractData) => {
 const ElCascaderRef = ref(null)
 const projectContractChange = (val) => {
     if (val) {
-        const Nodes = ElCascaderRef.value.getCheckedNodes();
-        const UserProjectInfo = Nodes[0].parent.data;
-        const UserContractInfo = Nodes[0].data;
+        const Nodes = ElCascaderRef.value.getCheckedNodes()
+        const UserProjectInfo = Nodes[0].parent.data
+        const UserContractInfo = Nodes[0].data
         //缓存项目数据
         useAppState.setProjectId(val[0])
         useAppState.setContractId(val[1])
@@ -259,7 +268,7 @@ const projectContractChange = (val) => {
         //更改界面更新
         projectInfo.value = UserProjectInfo
         contractInfo.value = UserContractInfo
-        window.$message?.info('切换了项目,数据更新中');
+        window.$message?.info('切换了项目,数据更新中')
         //发送消息
         socketSend(val[0] + ',' + val[1])
         //刷新路由
@@ -272,14 +281,14 @@ const projectContractChange = (val) => {
 
 //菜单被点击
 const MenuBarChange = (item) => {
-    MenuBarKey.value = item?.code;
+    MenuBarKey.value = item?.code
     setIsCollapse(item?.code)
-    router.push({name: item?.code});
+    router.push({ name: item?.code })
 }
 
 //首页
 const logoClick = () => {
-    router.push({name: 'home-index'});
+    router.push({ name: 'home-index' })
 }
 
 //消息数量
@@ -295,26 +304,26 @@ const msgCount = ref({
 })
 
 //推送系统
-let socket;
+let socket
 const setInitSocket = () => {
-    const user_id = userInfo.value.user_id;
-    socket = new WebSocket(website.socket + user_id);
+    const user_id = userInfo.value.user_id
+    socket = new WebSocket(website.socket + user_id)
     try {
         socket.onopen = function (evt) {
-            console.log('websocket链接成功');
-        };
+            console.log('websocket链接成功')
+        }
         socket.onclose = function (evt) {
             console.log('websocket连接已断开')
-        };
-        socket.onmessage = function ({data}) {
+        }
+        socket.onmessage = function ({ data }) {
             if (data) {
                 msgCount.value = JSON.parse(data)
             }
             console.log(data, '消息信息')
-        };
-        socket.onerror = function ({data}) {
+        }
+        socket.onerror = function ({ data }) {
             console.log('发生错误:', data)
-        };
+        }
     } catch {
     }
 }
@@ -323,10 +332,10 @@ const setInitSocket = () => {
 const socketSend = (msg) => {
     try {
         if (socket) {
-            socket.send(msg);
+            socket.send(msg)
         } else {
             setTimeout(() => {
-                socket.send(msg);
+                socket.send(msg)
             }, 1000)
         }
     } catch {
@@ -398,5 +407,4 @@ const socketSend = (msg) => {
         }
     }
 }
-
 </style>

+ 3 - 3
src/layout/modules/ConfigBar.vue

@@ -1,6 +1,6 @@
 <template>
     <div class="header-icon-bar" @click="toConfigClick">
-        <HcIcon name="settings" class="header-icon"/>
+        <HcIcon name="settings" class="header-icon" />
     </div>
 </template>
 
@@ -12,8 +12,8 @@ const router = useRouter()
 //跳转到系统设置页面
 const toConfigClick = () => {
     router.push({
-        path: '/home/config'
-    });
+        path: '/home/config',
+    })
 }
 </script>
 

+ 30 - 30
src/layout/modules/HelpInfoBar.vue

@@ -2,32 +2,32 @@
     <el-popover :width="220" placement="bottom" trigger="hover">
         <template #reference>
             <div class="header-icon-bar">
-                <HcIcon class="header-icon" name="question"/>
+                <HcIcon class="header-icon" name="question" />
             </div>
         </template>
         <div class="header-pover-menu-list">
             <div class="list-item">
                 <span class="text">开启功能气泡提示</span>
-                <el-switch v-model="bubbleVal" @change="bubbleUpdate"/>
+                <el-switch v-model="bubbleVal" @change="bubbleUpdate" />
             </div>
             <div v-if="excelUrl" class="list-item" @click="excelPreviewClick">
                 <span class="text">查看系统操作文档</span>
-                <img :src="getAssetsHomeFile('word.png')" alt="" class="icon"/>
-                <img :src="getAssetsHomeFile('word1.png')" alt="" class="icon1"/>
+                <img :src="getAssetsHomeFile('word.png')" alt="" class="icon">
+                <img :src="getAssetsHomeFile('word1.png')" alt="" class="icon1">
             </div>
             <div v-if="videoUrl" class="list-item" @click="videoPreviewModal = true">
                 <span class="text">当前页面功能讲解</span>
-                <img :src="getAssetsHomeFile('video.png')" alt="" class="icon"/>
-                <img :src="getAssetsHomeFile('video1.png')" alt="" class="icon1"/>
+                <img :src="getAssetsHomeFile('video.png')" alt="" class="icon">
+                <img :src="getAssetsHomeFile('video1.png')" alt="" class="icon1">
             </div>
             <div class="list-item" @click="toOrderService">
                 <span class="text">工单服务\需求反馈</span>
-                <img :src="getAssetsHomeFile('screen.png')" alt="" class="icon" @click.stop="screenShortClick"/>
-                <img :src="getAssetsHomeFile('screen1.png')" alt="" class="icon1" @click.stop="screenShortClick"/>
+                <img :src="getAssetsHomeFile('screen.png')" alt="" class="icon" @click.stop="screenShortClick">
+                <img :src="getAssetsHomeFile('screen1.png')" alt="" class="icon1" @click.stop="screenShortClick">
             </div>
         </div>
     </el-popover>
-    <!--当前页面功能讲解-->
+    <!-- 当前页面功能讲解 -->
     <el-dialog v-model="videoPreviewModal" :before-close="videoPreviewModalClose" destroy-on-close width="62rem">
         <video :src="videoUrl" autoplay="autoplay" class="preview-video" controls="controls">
             您的浏览器不支持 video
@@ -36,12 +36,12 @@
 </template>
 
 <script setup>
-import {ref, watch, nextTick} from "vue";
-import {useRouter, useRoute} from 'vue-router'
-import {useAppStore} from "~src/store";
-import ScreenShot from "js-web-screen-shot";
-import {getStoreValue} from '~src/utils/storage'
-import {getObjValue, getToObjVal} from "js-fast-way"
+import { nextTick, ref, watch } from 'vue'
+import { useRoute, useRouter } from 'vue-router'
+import { useAppStore } from '~src/store'
+import ScreenShot from 'js-web-screen-shot'
+import { getStoreValue } from '~src/utils/storage'
+import { getObjValue, getToObjVal } from 'js-fast-way'
 
 //初始变量
 const router = useRouter()
@@ -50,7 +50,7 @@ const useAppState = useAppStore()
 
 //相关变量
 const route = getObjValue(getStoreValue('route'))
-const bubbleVal = ref(useAppState.getBubble);
+const bubbleVal = ref(useAppState.getBubble)
 const videoUrl = ref('')
 const excelUrl = ref('')
 const videoPreviewModal = ref(false)
@@ -97,46 +97,46 @@ const setScreenShotData = (webRtc, fullScreen) => {
 
 //开关值改变
 const bubbleUpdate = (val) => {
-    bubbleVal.value = val;
-    useAppState.setBubble(val);
+    bubbleVal.value = val
+    useAppState.setBubble(val)
 }
 
 //工单服务\需求反馈
 const screenShortClick = () => {
     nextTick(() => {
         new ScreenShot({
-            enableWebRtc: webRtcVal.value,        //截图方式
-            clickCutFullScreen: fullScreenVal.value,   //全屏
-            loadCrossImg: true,         //跨域
+            enableWebRtc: webRtcVal.value, //截图方式
+            clickCutFullScreen: fullScreenVal.value, //全屏
+            loadCrossImg: true, //跨域
             level: 999999,
             completeCallback: getScreenShotImg,
-            noScroll: false
-        });
+            noScroll: false,
+        })
         /*setTimeout(() => {}, 800)*/
     })
 }
 
 //获取裁剪区域图片信息
 const getScreenShotImg = (base64) => {
-    window.sessionStorage.setItem('screenShort-base64', base64);
+    window.sessionStorage.setItem('screenShort-base64', base64)
     //跳转到工单服务\需求反馈
     const useRoutePath = useRoutes.path
     useAppState.setScreenShort(true)
-    if (useRoutePath !== "/other/order-service") {
-        router.push({name: 'order-service'});
+    if (useRoutePath !== '/other/order-service') {
+        router.push({ name: 'order-service' })
     }
 }
 
 //工单服务\需求反馈
 const toOrderService = () => {
-    router.push({name: 'order-service'});
+    router.push({ name: 'order-service' })
 }
 
 // 获取assets静态资源
 const getAssetsHomeFile = (url) => {
-    const path = `../../assets/images/${url}`;
-    const modules = import.meta.globEager("../../assets/images/*");
-    return modules[path].default;
+    const path = `../../assets/images/${url}`
+    const modules = import.meta.globEager('../../assets/images/*')
+    return modules[path].default
 }
 
 //关闭视频弹窗

+ 23 - 21
src/layout/modules/MenuBar.vue

@@ -1,60 +1,62 @@
 <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'})">
+        <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>
+                    <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" :msg-count="msgCount" @change="MenuClick" />
     </el-menu>
 </template>
 
 <script setup>
-import {ref, watch} from "vue";
-import MenuItem from "./MenuItem.vue"
-import {getToken} from "~src/api/util/auth";
-import {getStoreValue} from "~uti/storage";
-import {getTenantDetail} from "~api/other";
-import {getObjValue} from "js-fast-way";
+import { ref, watch } from 'vue'
+import MenuItem from './MenuItem.vue'
+import { getToken } from '~src/api/util/auth'
+import { getStoreValue } from '~uti/storage'
+import { getTenantDetail } from '~api/other'
+import { getObjValue } from 'js-fast-way'
 
 const props = defineProps({
     datas: {
         type: Array,
-        default: () => ([])
+        default: () => ([]),
     },
     cur: {
         type: String,
-        default: 'home-index'
+        default: 'home-index',
     },
     collapse: {
         type: Boolean,
-        default: false
+        default: false,
     },
     msgCount: {
         type: Object,
-        default: () => ({})
+        default: () => ({}),
     },
 })
 
+//事件
+const emit = defineEmits(['change'])
 //初始变量
-const curKey = ref(props.cur);
-const isCollapse = ref(props.collapse);
+const curKey = ref(props.cur)
+const isCollapse = ref(props.collapse)
 
 //监听
 watch(() => [
     props.cur,
-    props.collapse
+    props.collapse,
 ], ([cur, collapse]) => {
     curKey.value = cur
     isCollapse.value = collapse
 })
 
 
-//事件
-const emit = defineEmits(['change'])
 const MenuClick = async (item) => {
     if (item?.code === 'to-archives-url') {
         let token = getToken(), domain = item?.path
@@ -62,7 +64,7 @@ const MenuClick = async (item) => {
         if (tenantId === '000000' || !tenantId) {
             domain = item?.path
         } else {
-            const {error, code, data} = await getTenantDetail(tenantId)
+            const { error, code, data } = await getTenantDetail(tenantId)
             if (!error && code === 200) {
                 const url = getObjValue(data).domainUrl
                 domain = url ? url : item?.path
@@ -70,7 +72,7 @@ const MenuClick = async (item) => {
         }
         window.open(domain + '/#/auth?token=' + token, '_blank')
     } else {
-        curKey.value = item?.code || '';
+        curKey.value = item?.code || ''
         emit('change', item)
     }
 }

+ 55 - 31
src/layout/modules/MenuItem.vue

@@ -1,27 +1,50 @@
 <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">
+    <template v-for="item in datas" :key="item?.code">
+        <el-sub-menu
+            v-if="item?.children && item?.children.length > 0" :index="item?.code" :popper-offset="0"
+            :popper-class="`aside-menu-popper ${curKey}`"
+        >
             <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"/>
+                        <HcIcon
+                            v-if="item?.source" :name="item?.source" :fill="curKey === item?.code"
+                            class="hc-menu-icon"
+                        />
+                        <div v-if="isCollapse" class="name truncate">
+                            {{ item?.name.substring(0, 2) }}
+                        </div>
+                        <div v-else class="name truncate">
+                            {{ item?.name }}
+                        </div>
+                        <el-badge v-if="item?.code === 'tasks' && msgCount?.allCount > 0" :value="msgCount.allCount" />
                     </div>
                 </div>
-                <HcIcon name="arrow-down-s" ui="el-icon el-sub-menu__icon-arrow"/>
+                <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" :cur="curKey" :msg-count="msgCount" @change="MenuClick" />
         </el-sub-menu>
-        <el-menu-item :index="item?.code" v-else @click="MenuClick(item)">
+        <el-menu-item v-else :index="item?.code" @click="MenuClick(item)">
             <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.taskCount" v-if="item?.code === 'tasks-data' && msgCount?.taskCount > 0"/>
-                    <el-badge :value="msgCount.messageCount" v-if="item?.code === 'message-data' && msgCount?.messageCount > 0"/>
+                    <HcIcon
+                        v-if="item?.source" :name="item?.source" :fill="curKey === item?.code"
+                        class="hc-menu-icon"
+                    />
+                    <div v-if="isCollapse" class="name truncate">
+                        {{ item?.name.substring(0, 2) }}
+                    </div>
+                    <div v-else class="name truncate">
+                        {{ item?.name }}
+                    </div>
+                    <el-badge
+                        v-if="item?.code === 'tasks-data' && msgCount?.taskCount > 0"
+                        :value="msgCount.taskCount"
+                    />
+                    <el-badge
+                        v-if="item?.code === 'message-data' && msgCount?.messageCount > 0"
+                        :value="msgCount.messageCount"
+                    />
                 </div>
             </div>
         </el-menu-item>
@@ -29,20 +52,21 @@
 </template>
 
 <script setup>
-import {ref,watch} from "vue";
-import MenuItem from "./MenuItem.vue"
+import { ref, watch } from 'vue'
+import MenuItem from './MenuItem.vue'
+
 const props = defineProps({
     datas: {
         type: Array,
-        default: () => ([])
+        default: () => ([]),
     },
     cur: {
         type: String,
-        default: ''
+        default: '',
     },
     collapse: {
         type: Boolean,
-        default: false
+        default: false,
     },
     msgCount: {
         type: Object,
@@ -50,29 +74,29 @@ const props = defineProps({
             allCount: 0,
             taskCount: 0,
             messageCount: 0,
-            messageCount_1:0,
-            messageCount_2:0,
-            messageCount_3:0,
-            messageCount_4:0,
-            messageCount_5:0,
-        })
+            messageCount_1: 0,
+            messageCount_2: 0,
+            messageCount_3: 0,
+            messageCount_4: 0,
+            messageCount_5: 0,
+        }),
     },
 })
+//事件
+const emit = defineEmits(['change'])
 //初始变量
-const curKey = ref(props.cur);
-const isCollapse = ref(props.collapse);
+const curKey = ref(props.cur)
+const isCollapse = ref(props.collapse)
 
 //监听
 watch(() => [
     props.cur,
-    props.collapse
-], ([cur,collapse]) => {
+    props.collapse,
+], ([cur, collapse]) => {
     curKey.value = cur
     isCollapse.value = collapse
 })
 
-//事件
-const emit = defineEmits(['change'])
 const MenuClick = (item) => {
     emit('change', item)
 }

+ 42 - 39
src/layout/modules/TopMenuBar.vue

@@ -2,26 +2,29 @@
     <div class="hc-top-menu-bar">
         <el-scrollbar always>
             <div class="bar-menu-content">
-                <div v-for="(item, index) in barMenuData" :class="item.key === barRoutes.key?'cur':''"
-                     class="bar-menu-btn"
-                     @click="barMenuClick(item)" @contextmenu.prevent="barMenuContextMenu($event, item, index)">
+                <div
+                    v-for="(item, index) in barMenuData" :key="item.key"
+                    :class="item.key === barRoutes.key ? 'cur' : ''"
+                    class="bar-menu-btn"
+                    @click="barMenuClick(item)" @contextmenu.prevent="barMenuContextMenu($event, item, index)"
+                >
                     <span>{{ item.title }}</span>
                     <div class="bar-close-icon" @click.stop="barMenuCloseClick(item, index)">
-                        <HcIcon name="close"/>
+                        <HcIcon name="close" />
                     </div>
                 </div>
             </div>
         </el-scrollbar>
-        <!--右键菜单-->
-        <HcContextMenu ref="contextMenuRef" :datas="menusData" @item-click="handleMenuSelect"/>
+        <!-- 右键菜单 -->
+        <HcContextMenu ref="contextMenuRef" :datas="menusData" @item-click="handleMenuSelect" />
     </div>
 </template>
 
 <script setup>
-import {onMounted, ref, watch} from "vue";
-import {useAppStore} from "~src/store";
-import {useRouter, useRoute} from 'vue-router'
-import {getStoreValue, setStoreValue} from '~src/utils/storage'
+import { onMounted, ref, watch } from 'vue'
+import { useAppStore } from '~src/store'
+import { useRoute, useRouter } from 'vue-router'
+import { getStoreValue, setStoreValue } from '~src/utils/storage'
 
 //初始组合式
 const router = useRouter()
@@ -29,13 +32,13 @@ const useRoutes = useRoute()
 const useAppState = useAppStore()
 
 //初始变量
-const barMenuData = ref(getStoreValue('bar-menu-datas') || []);
-const barRoutes = ref({key: '', path: '', title: '', query: null});
+const barMenuData = ref(getStoreValue('bar-menu-datas') || [])
+const barRoutes = ref({ key: '', path: '', title: '', query: null })
 
 //渲染完成
 onMounted(() => {
-    const {name, path, meta, query} = useRoutes
-    barRoutes.value = {path, key: name, title: meta?.title, query}
+    const { name, path, meta, query } = useRoutes
+    barRoutes.value = { path, key: name, title: meta?.title, query }
     setBarMenuData()
 })
 
@@ -46,17 +49,17 @@ watch(() => [
     useRoutes?.query,
     useRoutes?.meta?.title,
 ], ([key, path, query, title]) => {
-    barRoutes.value = {path, key, title, query}
+    barRoutes.value = { path, key, title, query }
     setBarMenuData()
 })
 
 //设置菜单数据
 const setBarMenuData = () => {
-    const {key, path, title, query} = barRoutes.value
+    const { key, path, title, query } = barRoutes.value
     if (['home', 'home-index'].indexOf(key) === -1) {
         const index = barMenuData.value.findIndex(item => item.key === key)
         if (index === -1) {
-            barMenuData.value.push({path, key: key, title, query})
+            barMenuData.value.push({ path, key: key, title, query })
         }
         setStoreValue('bar-menu-datas', barMenuData.value)
     }
@@ -64,38 +67,38 @@ const setBarMenuData = () => {
 
 //菜单被点击
 const barMenuClick = (item) => {
-    const {key} = barRoutes.value
+    const { key } = barRoutes.value
     if (key !== item.key) {
-        router.push({name: item.key, query: item.query});
+        router.push({ name: item.key, query: item.query })
     }
 }
 
 //鼠标右键菜单
-const contextMenuRef = ref(null);
-const barItem = ref({});
-const barItemIndex = ref(0);
+const contextMenuRef = ref(null)
+const barItem = ref({})
+const barItemIndex = ref(0)
 const menusData = ref([
-    {label: '关闭当前', key: "close"},
-    {label: '关闭所有', key: "all"},
-    {label: '关闭其它', key: "other"},
-]);
+    { label: '关闭当前', key: 'close' },
+    { label: '关闭所有', key: 'all' },
+    { label: '关闭其它', key: 'other' },
+])
 const barMenuContextMenu = (event, item, index) => {
-    event.preventDefault();
-    barItem.value = item;
-    barItemIndex.value = index;
-    contextMenuRef.value?.showMenu(event);
+    event.preventDefault()
+    barItem.value = item
+    barItemIndex.value = index
+    contextMenuRef.value?.showMenu(event)
 }
 
 //鼠标右键菜单被点击
-const handleMenuSelect = ({key}) => {
+const handleMenuSelect = ({ key }) => {
     if (key === 'close') {
         barMenuCloseClick(barItem.value, barItemIndex.value)
     } else if (key === 'all') {
         barMenuData.value = []
         setStoreValue('bar-menu-datas', [])
-        router.push({name: 'home-index'});
+        router.push({ name: 'home-index' })
     } else if (key === 'other') {
-        const {key} = barRoutes.value
+        const { key } = barRoutes.value
         barMenuData.value = barMenuData.value.filter(item => item.key === key)
         setStoreValue('bar-menu-datas', barMenuData.value)
     }
@@ -103,12 +106,12 @@ const handleMenuSelect = ({key}) => {
 
 //菜单关闭被点击
 const barMenuCloseClick = (item, index) => {
-    const total = barMenuData.value.length - 1;
-    const {key} = barRoutes.value
+    const total = barMenuData.value.length - 1
+    const { key } = barRoutes.value
     barMenuData.value.splice(index, 1)
     if (key === item.key) {
-        let items = {};
-        const indexs = barMenuData.value.length - 1;
+        let items = {}
+        const indexs = barMenuData.value.length - 1
         if (total > index) {
             items = barMenuData.value[index]
         } else if (indexs >= 0) {
@@ -116,11 +119,11 @@ const barMenuCloseClick = (item, index) => {
         }
         if (indexs < 0) {
             setStoreValue('bar-menu-datas', barMenuData.value)
-            router.push({name: 'home-index'});
+            router.push({ name: 'home-index' })
         } else {
             barRoutes.value = items
             setStoreValue('bar-menu-datas', barMenuData.value)
-            router.push({name: items.key, query: items.query});
+            router.push({ name: items.key, query: items.query })
         }
     } else {
         setStoreValue('bar-menu-datas', barMenuData.value)

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

@@ -1,15 +1,15 @@
 <template>
     <el-dropdown size="large">
         <div class="header-bar user-info-bar">
-            <img :alt="userInfo['account']" :src="userInfo['avatar'] || avatarPng" class="user-avatar">
-            <span class="user-name">{{ userInfo['real_name'] }}</span>
-            <HcIcon name="arrow-down-s" ui="arrow-icon"/>
+            <img :alt="userInfo.account" :src="userInfo.avatar || avatarPng" class="user-avatar">
+            <span class="user-name">{{ userInfo.real_name }}</span>
+            <HcIcon name="arrow-down-s" ui="arrow-icon" />
         </div>
         <template #dropdown>
             <el-dropdown-menu>
-                <el-dropdown-item v-for="item in options">
+                <el-dropdown-item v-for="item in options" :key="item.key">
                     <div class="hc-dropdown-item" @click="handleSelect(item.key)">
-                        <HcIcon :name="item.icon" class="icon"/>
+                        <HcIcon :name="item.icon" class="icon" />
                         <span class="label">{{ item.label }}</span>
                     </div>
                 </el-dropdown-item>
@@ -19,24 +19,26 @@
 </template>
 
 <script setup>
-import {onMounted, ref, watch} from "vue";
-import {useRouter} from 'vue-router'
-import {useAppStore} from "~src/store";
-import website from "~src/config/index";
-import avatarPng from '~src/assets/images/avatar.png';
-import {RefreshToken, LogOut} from "~sto/user";
-import {getStoreValue} from '~src/utils/storage'
-import {calcDate, isNullES} from "js-fast-way"
+import { onMounted, ref, watch } from 'vue'
+import { useRouter } from 'vue-router'
+import { useAppStore } from '~src/store'
+import website from '~src/config/index'
+import avatarPng from '~src/assets/images/avatar.png'
+import { LogOut, RefreshToken } from '~sto/user'
+import { getStoreValue } from '~src/utils/storage'
+import { calcDate, isNullES } from 'js-fast-way'
 
+//事件
+const emit = defineEmits(['change'])
 //变量
 const router = useRouter()
 const userStore = useAppStore()
-const userInfo = ref(userStore.getUserInfo);
-const refreshLock = ref(false);
+const userInfo = ref(userStore.getUserInfo)
+const refreshLock = ref(false)
 
 //监听
 watch(() => [
-    userStore.getUserInfo
+    userStore.getUserInfo,
 ], ([info]) => {
     userInfo.value = info
 })
@@ -48,44 +50,42 @@ onMounted(() => {
 //刷新token
 const getRefreshToken = () => {
     setInterval(() => {
-        const token = getStoreValue("token", true) || {};
-        const date = calcDate(token.datetime, new Date().getTime());
-        if (isNullES(date)) return;
+        const token = getStoreValue('token', true) || {}
+        const date = calcDate(token.datetime, new Date().getTime())
+        if (isNullES(date)) return
         if (date.seconds >= website.tokenTime && !refreshLock.value) {
-            refreshLock.value = true;
+            refreshLock.value = true
             console.log('刷新token')
             RefreshToken().then(() => {
-                refreshLock.value = false;
+                refreshLock.value = false
             }).catch(() => {
-                refreshLock.value = false;
-                router.push({name: 'login'});
-            });
+                refreshLock.value = false
+                router.push({ name: 'login' })
+            })
         }
     }, 10000)
 }
 
 const options = [
     {
-        key: "my",
-        label: "个人中心",
-        icon: 'user-3'
+        key: 'my',
+        label: '个人中心',
+        icon: 'user-3',
     },
     {
-        key: "logout",
-        label: "退出登录",
-        icon: 'login-box'
-    }
-];
+        key: 'logout',
+        label: '退出登录',
+        icon: 'login-box',
+    },
+]
 
-//事件
-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('退出成功');
-        router.push({name: 'login'});
+        LogOut().then()
+        window.$message?.info('退出成功')
+        router.push({ name: 'login' })
     }
 }
 </script>

+ 11 - 11
src/main.js

@@ -1,8 +1,8 @@
-import "./styles/app/tailwind.scss"
+import './styles/app/tailwind.scss'
 //主要
-import {createApp} from 'vue'
-import setupPinia from "./store/init"
-import router, {setupRouter} from './router'
+import { createApp } from 'vue'
+import setupPinia from './store/init'
+import router, { setupRouter } from './router'
 import App from './App.vue'
 
 //饿了么UI
@@ -16,7 +16,7 @@ import 'hc-vue3-ui/dist/index.css'
 import 'hc-vue3-ui/style/index.scss'
 
 //挂载全局
-import {setupComponents} from './global/index'
+import { setupComponents } from './global/index'
 
 //导入其它样式
 import './styles/app/main.scss'
@@ -25,16 +25,16 @@ import './styles/app/theme.scss'
 
 //创建实例
 async function bootstrap() {
-    const app = createApp(App);
+    const app = createApp(App)
 
     // 挂载状态管理
     app.use(setupPinia)
 
     // 挂载路由
-    await setupRouter(app);
+    await setupRouter(app)
 
     // 路由准备就绪后挂载APP实例
-    await router.isReady();
+    await router.isReady()
 
     // 饿了么UI框架
     app.use(ElementPlus, {
@@ -45,9 +45,9 @@ async function bootstrap() {
     app.use(HcVue3UI)
 
     // 组件注册全局
-    setupComponents(app);
+    setupComponents(app)
 
-    app.mount('#app');
+    app.mount('#app')
 }
 
-void bootstrap();
+void bootstrap()

+ 72 - 72
src/plugins/HTableForm.js

@@ -1,25 +1,25 @@
-import {createApp} from "vue/dist/vue.esm-bundler.js";
-import {getTokenHeader} from '~src/api/request/header';
-import {toParse, isArray} from "js-fast-way"
+import { createApp } from 'vue/dist/vue.esm-bundler.js'
+import { getTokenHeader } from '~src/api/request/header'
+import { isArray, toParse } from 'js-fast-way'
 
 //自定义组件或二次封装的组件
-import HcTableFormUpload from "~com/plugins/table-form/hc-form-upload.vue"
-import HcFormSelectSearch from "~com/plugins/table-form/hc-form-select-search.vue"
-import HcFormCheckboxGroup from "~com/plugins/table-form/hc-form-checkbox-group.vue"
-import ElTimePicker from "~com/plugins/table-form/hc-time-picker.vue"
-import ElDatePicker from "~com/plugins/table-form/hc-date-picker-1.vue"
-import ElRadioGroup from "~com/plugins/table-form/hc-form-radio-group.vue"
-import HcEchart from "~com/plugins/table-form/echart.vue"
+import HcTableFormUpload from '~com/plugins/table-form/hc-form-upload.vue'
+import HcFormSelectSearch from '~com/plugins/table-form/hc-form-select-search.vue'
+import HcFormCheckboxGroup from '~com/plugins/table-form/hc-form-checkbox-group.vue'
+import ElTimePicker from '~com/plugins/table-form/hc-time-picker.vue'
+import ElDatePicker from '~com/plugins/table-form/hc-date-picker-1.vue'
+import ElRadioGroup from '~com/plugins/table-form/hc-form-radio-group.vue'
+import HcEchart from '~com/plugins/table-form/echart.vue'
 
 //修改过的组件
-import {ElSelect, ElOption} from 'z-element-plus'
+import { ElOption, ElSelect } from 'z-element-plus'
 
 import ElementPlus from 'element-plus'
 import zhCn from 'element-plus/es/locale/lang/zh-cn'
 
 const components = {
     ElSelect, ElOption, ElDatePicker, ElTimePicker, HcTableFormUpload, ElRadioGroup,
-    HcFormSelectSearch, HcFormCheckboxGroup, HcEchart
+    HcFormSelectSearch, HcFormCheckboxGroup, HcEchart,
 }
 
 //表单渲染
@@ -28,20 +28,28 @@ export default class HTableForm {
     static tableFormApp = null
     static tableFormVM = null
 
-    static createForm({template, tableForm, keys, appId, pid, onRight, onBlur, onLeftClick, onFormDataChange, onChartRefs})
-    {
-        const _this = this;
+    static createForm({
+                          template,
+                          tableForm,
+                          keys,
+                          appId,
+                          pid,
+                          onRight,
+                          onBlur,
+                          onLeftClick,
+                          onFormDataChange,
+                          onChartRefs,
+                      }) {
+        const _this = this
         const app = createApp({
+            //自定义组件,需要把饿了么的组件,或者自定义组件手动传递进来绑定,否则渲染时,自定义组件不会生效
+            components,
             data() {
                 return {
                     getTokenHeader: getTokenHeader(),
                     formData: tableForm,
                 }
             },
-            //html标签数据
-            template,
-            //自定义组件,需要把饿了么的组件,或者自定义组件手动传递进来绑定,否则渲染时,自定义组件不会生效
-            components,
             //监听数据,伪双向绑定(v-model)
             watch: {
                 formData: {
@@ -49,7 +57,7 @@ export default class HTableForm {
                         tableForm = obj
                         this.formDataChange(obj)
                     },
-                    deep: true
+                    deep: true,
                 },
             },
             methods: {
@@ -65,14 +73,14 @@ export default class HTableForm {
                 },
                 //鼠标右键菜单
                 contextmenuClick(a, b, c, d, e, f, event) {
-                    event.preventDefault();
+                    event.preventDefault()
                 },
                 //鼠标右键事件
                 RightClick(a, b, c, d, e, f, event) {
                     setTimeout(() => {
                         const KeyName = event?.target?.getAttribute('keyname') || ''
                         if (onRight) {
-                            event.preventDefault();
+                            event.preventDefault()
                             onRight(event, KeyName)
                         }
                     }, 100)
@@ -85,7 +93,7 @@ export default class HTableForm {
                     this.formData[key] = val
                 },
                 //上传完成
-                formUploadSuccess({src, key}) {
+                formUploadSuccess({ src, key }) {
                     this.formData[key] = src
                 },
                 //删除上传的文件
@@ -106,7 +114,7 @@ export default class HTableForm {
                     })
                 },
                 //多选框处理
-                checkboxGroupChange({key, val}) {
+                checkboxGroupChange({ key, val }) {
                     this.formData[key] = val
                 },
                 //键盘事件 上键
@@ -126,7 +134,7 @@ export default class HTableForm {
                     _this.setKeyupData(event, 'right', keys, pid)
                 },
                 //日期时间框键盘事件
-                dateKeydown({type, name}) {
+                dateKeydown({ type, name }) {
                     _this.setKeyupData(name, type, keys, pid)
                 },
                 //输入左键点击事件
@@ -139,8 +147,10 @@ export default class HTableForm {
                 },
                 setChartRefs(el, pKeyId, key) {
                     if (onChartRefs) onChartRefs(el, pKeyId, key)
-                }
-            }
+                },
+            },
+            //html标签数据
+            template,
         })
         // 饿了么UI框架
         app.use(ElementPlus, {
@@ -149,19 +159,18 @@ export default class HTableForm {
         const vm = app.mount(appId)
         this.tableFormApp = app
         this.tableFormVM = vm
-        return {app, vm}
+        return { app, vm }
     }
 
     //处理日期范围数据
-    static setPickerKey(data)
-    {
+    static setPickerKey(data) {
         const pickerKey = data['pickerKey'] || ''
         if (pickerKey) {
             const pickerKeys = pickerKey.split(',')
             for (let i = 0; i < pickerKeys.length; i++) {
                 const val = data[pickerKeys[i]] || ''
                 if (val) {
-                    const dataVal = val.replace(/'/g, '"');
+                    const dataVal = val.replace(/'/g, '"')
                     data[pickerKeys[i]] = toParse(dataVal) || []
                 } else {
                     data[pickerKeys[i]] = []
@@ -172,12 +181,11 @@ export default class HTableForm {
     }
 
     //处理日期时间框的切换事件
-    static setByClassKeyup(keys, pid = '')
-    {
+    static setByClassKeyup(keys, pid = '') {
         try {
             let poppers = document.getElementsByClassName('hc-table-form-date-picker')
             for (let i = 0; i < poppers.length; i++) {
-                let item = poppers[i], key = '';
+                let item = poppers[i], key = ''
                 const ids = item.getAttribute('class').split('-form-id-')
                 if (ids.length >= 1) {
                     key = ids[1]
@@ -193,51 +201,49 @@ export default class HTableForm {
     }
 
     //设置事件
-    static setElementsEvent(elements, key, keys, pid = '')
-    {
+    static setElementsEvent(elements, key, keys, pid = '') {
         if (elements.length > 0) {
-            const _this = this;
-            elements[0].addEventListener("keydown", e => {
+            const _this = this
+            elements[0].addEventListener('keydown', e => {
                 e.stopPropagation()
                 if (e.key === 'ArrowUp') {
-                    _this.setKeyupData({target: {id: key}}, 'up', keys, pid)
+                    _this.setKeyupData({ target: { id: key } }, 'up', keys, pid)
                 } else if (e.key === 'ArrowDown') {
-                    _this.setKeyupData({target: {id: key}}, 'down', keys, pid)
+                    _this.setKeyupData({ target: { id: key } }, 'down', keys, pid)
                 } else if (e.key === 'ArrowLeft') {
-                    _this.setKeyupData({target: {id: key}}, 'left', keys, pid)
+                    _this.setKeyupData({ target: { id: key } }, 'left', keys, pid)
                 } else if (e.key === 'ArrowRight') {
-                    _this.setKeyupData({target: {id: key}}, 'right', keys, pid)
+                    _this.setKeyupData({ target: { id: key } }, 'right', keys, pid)
                 }
             }, {
-                capture: true
-            });
+                capture: true,
+            })
         }
     }
 
     //计算上下左右快捷键的
-    static setKeyupData({target}, type, keys, pid = '')
-    {
+    static setKeyupData({ target }, type, keys, pid = '') {
         const key = target.id
         //处理快捷键数据和事件
         if (key && type && isArray(keys)) {
             //计算当前的位置
-            let left = -1, top = -1;
+            let left = -1, top = -1
             for (let i = 0; i < keys.length; i++) {
                 if (isArray(keys[i])) {
                     const index = keys[i].findIndex(id => id === key)
                     if (index !== -1) {
                         left = index
                         top = i
-                        break;
+                        break
                     }
                 }
             }
             if (type === 'up') {
                 //向上移动
                 if (top > 0) {
-                    let keyId = '';
+                    let keyId = ''
                     const tops = keys[top - 1]
-                    const keyLength = tops.length - 1;
+                    const keyLength = tops.length - 1
                     if (keyLength < left) {
                         keyId = tops[keyLength]
                     } else {
@@ -247,11 +253,11 @@ export default class HTableForm {
                 }
             } else if (type === 'down') {
                 //向下移动
-                const tops = keys.length - 1;
+                const tops = keys.length - 1
                 if (tops > top) {
-                    let keyId = '';
+                    let keyId = ''
                     const tops = keys[top + 1]
-                    const keyLength = tops.length - 1;
+                    const keyLength = tops.length - 1
                     if (keyLength < left) {
                         keyId = tops[keyLength]
                     } else {
@@ -268,7 +274,7 @@ export default class HTableForm {
             } else if (type === 'right') {
                 //向右移动
                 const lefts = keys[top]
-                const leftLength = lefts.length - 1;
+                const leftLength = lefts.length - 1
                 if (leftLength > left) {
                     const keyId = lefts[left + 1]
                     this.setElementFocus(keyId, pid)
@@ -278,20 +284,18 @@ export default class HTableForm {
     }
 
     //设置元素焦点
-    static setElementFocus(key, pid)
-    {
+    static setElementFocus(key, pid) {
         if (key) {
             try {
-                this.getQuerySelector(key, pid)?.focus();
+                this.getQuerySelector(key, pid)?.focus()
             } catch {
             }
         }
     }
 
     //获取表单元素
-    static getQuerySelector(key, pid = '')
-    {
-        let dom;
+    static getQuerySelector(key, pid = '') {
+        let dom
         if (pid) {
             dom = document.querySelector('#' + pid + ' #' + (key + ''))
         } else {
@@ -301,8 +305,7 @@ export default class HTableForm {
     }
 
     //设置表单样式
-    static setFormStyle(key, name = 'hc-red-border', pid = '', add = false)
-    {
+    static setFormStyle(key, name = 'hc-red-border', pid = '', add = false) {
         const dom = this.getQuerySelector(key, pid)
         const parent = dom?.parentElement ?? ''
         if (dom.tagName === 'INPUT') {
@@ -313,8 +316,7 @@ export default class HTableForm {
         }
     }
 
-    static setFormClass(dom, name = 'hc-red-border', add = false)
-    {
+    static setFormClass(dom, name = 'hc-red-border', add = false) {
         const classStr = dom.getAttribute('class')
         const classArr = classStr.split(' ')
         const index = classArr.indexOf(name)
@@ -327,8 +329,7 @@ export default class HTableForm {
     }
 
     //设置选中样式
-    static setCheckKeyStyle(key, pid = '', remove = false)
-    {
+    static setCheckKeyStyle(key, pid = '', remove = false) {
         if (remove) {
             this.setFormStyle(key, 'hc-green-border', pid)
         } else {
@@ -337,12 +338,11 @@ export default class HTableForm {
     }
 
     //设置全局按键监听
-    static setOnEventKey({onCtrlDown, onCtrlDownC, onCtrlDownV, onCtrlUp})
-    {
+    static setOnEventKey({ onCtrlDown, onCtrlDownC, onCtrlDownV, onCtrlUp }) {
         //全局按键按下监听
         document.onkeydown = (event) => {
-            if(onCtrlDown || onCtrlDownC || onCtrlDownV) {
-                const {key, ctrlKey, metaKey} = event
+            if (onCtrlDown || onCtrlDownC || onCtrlDownV) {
+                const { key, ctrlKey, metaKey } = event
                 const isCtrl = window.isMac ? metaKey : window.isWin ? ctrlKey : false
                 //window.$HcLog('全局按键', 'isCtrl', isCtrl)
                 //按下ctrl键 或 control 键
@@ -361,8 +361,8 @@ export default class HTableForm {
         }
         //全局键盘放开监听
         document.onkeyup = (event) => {
-            if(onCtrlUp) {
-                const {key, ctrlKey, metaKey} = event
+            if (onCtrlUp) {
+                const { key, ctrlKey, metaKey } = event
                 const isCtrl = window.isMac ? metaKey : window.isWin ? ctrlKey : false
                 if (!isCtrl && key === window?.isCtrl) {
                     onCtrlUp(event)

+ 2 - 1
src/plugins/IsButtons.js

@@ -1,4 +1,5 @@
-import {useAppStore} from "~src/store";
+import { useAppStore } from '~src/store'
+
 const useAppState = useAppStore()
 
 //是否显示

+ 22 - 22
src/plugins/crypto.js

@@ -2,10 +2,10 @@ import CryptoJS from 'crypto-js'
 
 export default class crypto {
     // 使用AesUtil.genAesKey()生成,需和后端配置保持一致
-    static aesKey = "O2BEeIv399qHQNhD6aGW8R8DEj4bqHXm";
+    static aesKey = 'O2BEeIv399qHQNhD6aGW8R8DEj4bqHXm'
 
     // 使用DesUtil.genDesKey()生成,需和后端配置保持一致
-    static desKey = "jMVCBsFGDQr1USHo";
+    static desKey = 'jMVCBsFGDQr1USHo'
 
     /**
      * aes 加密方法
@@ -13,7 +13,7 @@ export default class crypto {
      * @returns {*}
      */
     static encrypt(data) {
-        return this.encryptAES(data, this.aesKey);
+        return this.encryptAES(data, this.aesKey)
     }
 
     /**
@@ -22,59 +22,59 @@ export default class crypto {
      * @returns {*}
      */
     static decrypt(data) {
-        return this.decryptAES(data, this.aesKey);
+        return this.decryptAES(data, this.aesKey)
     }
 
     /**
      * aes 加密方法,同java:AesUtil.encryptToBase64(text, aesKey);
      */
     static encryptAES(data, key) {
-        const dataBytes = CryptoJS.enc.Utf8.parse(data);
-        const keyBytes = CryptoJS.enc.Utf8.parse(key);
+        const dataBytes = CryptoJS.enc.Utf8.parse(data)
+        const keyBytes = CryptoJS.enc.Utf8.parse(key)
         const encrypted = CryptoJS.AES.encrypt(dataBytes, keyBytes, {
             iv: keyBytes,
             mode: CryptoJS.mode.CBC,
-            padding: CryptoJS.pad.Pkcs7
-        });
-        return CryptoJS.enc.Base64.stringify(encrypted.ciphertext);
+            padding: CryptoJS.pad.Pkcs7,
+        })
+        return CryptoJS.enc.Base64.stringify(encrypted.ciphertext)
     }
 
     /**
      * aes 解密方法,同java:AesUtil.decryptFormBase64ToString(encrypt, aesKey);
      */
     static decryptAES(data, key) {
-        const keyBytes = CryptoJS.enc.Utf8.parse(key);
+        const keyBytes = CryptoJS.enc.Utf8.parse(key)
         const decrypted = CryptoJS.AES.decrypt(data, keyBytes, {
             iv: keyBytes,
             mode: CryptoJS.mode.CBC,
-            padding: CryptoJS.pad.Pkcs7
-        });
-        return CryptoJS.enc.Utf8.stringify(decrypted);
+            padding: CryptoJS.pad.Pkcs7,
+        })
+        return CryptoJS.enc.Utf8.stringify(decrypted)
     }
 
     /**
      * des 加密方法,同java:DesUtil.encryptToBase64(text, desKey)
      */
     static encryptDES(data, key) {
-        const keyHex = CryptoJS.enc.Utf8.parse(key);
+        const keyHex = CryptoJS.enc.Utf8.parse(key)
         const encrypted = CryptoJS.DES.encrypt(data, keyHex, {
             mode: CryptoJS.mode.ECB,
-            padding: CryptoJS.pad.Pkcs7
-        });
-        return encrypted.toString();
+            padding: CryptoJS.pad.Pkcs7,
+        })
+        return encrypted.toString()
     }
 
     /**
      * des 解密方法,同java:DesUtil.decryptFormBase64(encryptBase64, desKey);
      */
     static decryptDES(data, key) {
-        const keyHex = CryptoJS.enc.Utf8.parse(key);
+        const keyHex = CryptoJS.enc.Utf8.parse(key)
         const decrypted = CryptoJS.DES.decrypt({
-            ciphertext: CryptoJS.enc.Base64.parse(data)
+            ciphertext: CryptoJS.enc.Base64.parse(data),
         }, keyHex, {
             mode: CryptoJS.mode.ECB,
-            padding: CryptoJS.pad.Pkcs7
-        });
-        return decrypted.toString(CryptoJS.enc.Utf8);
+            padding: CryptoJS.pad.Pkcs7,
+        })
+        return decrypted.toString(CryptoJS.enc.Utf8)
     }
 }

+ 3 - 3
src/plugins/renderele.js

@@ -1,15 +1,15 @@
 import { h } from 'vue'
 import HcIcon from '../global/components/hc-icon/index.vue'
 
-export const HcIconJs = ({ui, fill, name, line}) => {
+export const HcIconJs = ({ ui, fill, name, line }) => {
     return h(HcIcon, {
         ui: ui ?? '',
         fill: fill || false,
         name: name ?? '',
-        line: line !== false
+        line: line !== false,
     })
 }
 
 export const hIconJs = (obj) => {
-    return () => HcIconJs(obj);
+    return () => HcIconJs(obj)
 }

+ 14 - 14
src/router/index.js

@@ -1,19 +1,19 @@
 import * as vueRouter from 'vue-router'
-import baseData from "./modules/base";
-import {getToken} from '~src/api/util/auth'
-import {getRouterData} from './routers'
-import NProgress from "nprogress";
-import "~src/styles/app/nprogress.scss";
+import baseData from './modules/base'
+import { getToken } from '~src/api/util/auth'
+import { getRouterData } from './routers'
+import NProgress from 'nprogress'
+import '~src/styles/app/nprogress.scss'
 
 //设置路由数据
 const router = vueRouter.createRouter({
     history: vueRouter.createWebHashHistory(),
-    routes: baseData
-});
+    routes: baseData,
+})
 
 //路由拦截
 router.beforeResolve(async (to) => {
-    NProgress.start();
+    NProgress.start()
     const token = getToken()
     if (to.path === '/login') {
         return true
@@ -32,18 +32,18 @@ router.beforeResolve(async (to) => {
 })
 
 router.afterEach((to) => {
-    if (to.path !== "/") {
-        window.document.title = to.meta['title'];
+    if (to.path !== '/') {
+        window.document.title = to.meta['title']
     } else {
-        window.document.title = '';
+        window.document.title = ''
     }
     window.scrollTo(0, 0)
-    NProgress.done();
+    NProgress.done()
 })
 
-export function setupRouter(app){
+export function setupRouter(app) {
     app.use(router)
     return router
 }
 
-export default router;
+export default router

+ 124 - 124
src/router/modules/base.js

@@ -1,41 +1,41 @@
-import Layout from "~src/layout/index.vue";
+import Layout from '~src/layout/index.vue'
 
 //路由菜单系统内置页面配置
 export default [
     {
         path: '/',
-        redirect: '/home/index'
+        redirect: '/home/index',
     },
     {
         path: '/login',
         name: 'login',
-        meta: {title: '登录'},
-        component: () => import('~src/views/login/index.vue')
+        meta: { title: '登录' },
+        component: () => import('~src/views/login/index.vue'),
     },
     {
         path: '/auth',
         name: 'auth',
-        meta: {title: '授权登录'},
-        component: () => import('~src/views/user/auth.vue')
+        meta: { title: '授权登录' },
+        component: () => import('~src/views/user/auth.vue'),
     },
     {
         path: '/home',
         name: 'home',
         redirect: '/home/index',
-        meta: {title: '首页'},
+        meta: { title: '首页' },
         component: Layout,
         children: [
             {
                 path: '/home/index',
                 name: 'home-index',
-                meta: {title: '首页'},
-                component: () => import('~src/views/home/index.vue')
+                meta: { title: '首页' },
+                component: () => import('~src/views/home/index.vue'),
             },
             {
                 path: '/home/config',
                 name: 'home-config',
-                meta: {title: '系统设置'},
-                component: () => import('~src/views/home/config.vue')
+                meta: { title: '系统设置' },
+                component: () => import('~src/views/home/config.vue'),
             },
         ],
     },
@@ -43,74 +43,74 @@ export default [
         path: '/data-fill',
         name: 'data-fill',
         redirect: '/data-fill/wbs',
-        meta: {title: '资料管理'},
+        meta: { title: '资料管理' },
         component: Layout,
         children: [
             {
                 path: '/data-fill/wbs',
                 name: 'data-fill-wbs',
-                meta: {title: '资料填报'},
-                component: () => import('~src/views/data-fill/wbs.vue')
+                meta: { title: '资料填报' },
+                component: () => import('~src/views/data-fill/wbs.vue'),
             },
             {
                 path: '/data-fill/query',
                 name: 'data-query',
-                meta: {title: '资料查询'},
-                component: () => import('~src/views/data-fill/query.vue')
+                meta: { title: '资料查询' },
+                component: () => import('~src/views/data-fill/query.vue'),
             },
             {
                 path: '/data-fill/division',
                 name: 'data-division',
-                meta: {title: '系统分部分项划分'},
-                component: () => import('~src/views/data-fill/division.vue')
-            }
+                meta: { title: '系统分部分项划分' },
+                component: () => import('~src/views/data-fill/division.vue'),
+            },
         ],
     },
     {
         path: '/ledger',
         name: 'ledger',
         redirect: '/ledger/query',
-        meta: {title: '台账日志'},
+        meta: { title: '台账日志' },
         component: Layout,
         children: [
             {
                 path: '/ledger/query',
                 name: 'ledger-write',
-                meta: {title: '日志填报'},
-                component: () => import('~src/views/ledger/query.vue')
+                meta: { title: '日志填报' },
+                component: () => import('~src/views/ledger/query.vue'),
             },
             {
                 path: '/ledger/write',
                 name: 'ledger-query',
-                meta: {title: '台账管理'},
-                component: () => import('~src/views/ledger/write.vue')
-            }
+                meta: { title: '台账管理' },
+                component: () => import('~src/views/ledger/write.vue'),
+            },
         ],
     },
     {
         path: '/schedule',
         name: 'schedule',
         redirect: '/schedule/write',
-        meta: {title: '进度查询'},
+        meta: { title: '进度查询' },
         component: Layout,
         children: [
             {
                 path: '/schedule/write',
                 name: 'schedule-internal',
-                meta: {title: '内外业进度'},
-                component: () => import('~src/views/schedule/write.vue')
+                meta: { title: '内外业进度' },
+                component: () => import('~src/views/schedule/write.vue'),
             },
             {
                 path: '/schedule/data',
                 name: 'schedule-data',
-                meta: {title: '资料进度'},
-                component: () => import('~src/views/schedule/hc-data.vue')
+                meta: { title: '资料进度' },
+                component: () => import('~src/views/schedule/hc-data.vue'),
             },
             {
                 path: '/schedule/table',
                 name: 'schedule-table',
-                meta: {title: 'WBS节点进度'},
-                component: () => import('~src/views/schedule/hc-table.vue')
+                meta: { title: 'WBS节点进度' },
+                component: () => import('~src/views/schedule/hc-table.vue'),
             },
         ],
     },
@@ -118,60 +118,60 @@ export default [
         path: '/other-file',
         name: 'other-file',
         redirect: '/other-file/image-data',
-        meta: {title: '其他文件'},
+        meta: { title: '其他文件' },
         component: Layout,
         children: [
             {
                 path: '/other-file/image-data',
                 name: 'image-data',
-                meta: {title: '影像资料'},
-                component: () => import('~src/views/other-file/image-data.vue')
+                meta: { title: '影像资料' },
+                component: () => import('~src/views/other-file/image-data.vue'),
             },
             {
                 path: '/other-file/image-view',
                 name: 'other-file-view',
-                meta: {title: '查看影像资料'},
-                component: () => import('~src/views/other-file/image-view.vue')
+                meta: { title: '查看影像资料' },
+                component: () => import('~src/views/other-file/image-view.vue'),
             },
             {
                 path: '/other-file/image-form',
                 name: 'other-file-form',
-                meta: {title: '影像资料上传'},
-                component: () => import('~src/views/other-file/image-form.vue')
+                meta: { title: '影像资料上传' },
+                component: () => import('~src/views/other-file/image-form.vue'),
             },
             {
                 path: '/other-file/project-scanning',
                 name: 'project-scanning',
-                meta: {title: '工程文件扫描、上传'},
-                component: () => import('~src/views/other-file/project-scanning.vue')
-            }
+                meta: { title: '工程文件扫描、上传' },
+                component: () => import('~src/views/other-file/project-scanning.vue'),
+            },
         ],
     },
     {
         path: '/gauge',
         name: 'gauge-base',
         redirect: '/gauge/station',
-        meta: {title: '综合管理'},
+        meta: { title: '综合管理' },
         component: Layout,
         children: [
             {
                 path: '/gauge/station',
                 name: 'gauge-station',
-                meta: {title: '测站点'},
-                component: () => import('~src/views/gauge/station.vue')
+                meta: { title: '测站点' },
+                component: () => import('~src/views/gauge/station.vue'),
             },
             {
                 path: '/gauge/bezier',
                 name: 'gauge-bezier',
-                meta: {title: '平曲线'},
-                component: () => import('~src/views/gauge/bezier.vue')
+                meta: { title: '平曲线' },
+                component: () => import('~src/views/gauge/bezier.vue'),
             },
             {
                 path: '/other/first-item',
                 name: 'other-first-item',
-                meta: {title: '首件工程'},
-                component: () => import('~src/views/other/first-item.vue')
-            }
+                meta: { title: '首件工程' },
+                component: () => import('~src/views/other/first-item.vue'),
+            },
             // {
             //     path: '/other/first-item',
             //     name: 'other-first-item',
@@ -184,247 +184,247 @@ export default [
         path: '/tasks',
         name: 'tasks',
         redirect: '/tasks/data',
-        meta: {title: '任务管理'},
+        meta: { title: '任务管理' },
         component: Layout,
         children: [
             {
                 path: '/tasks/hc-data',
                 name: 'tasks-data',
-                meta: {title: '待办任务、已办任务、任务查看'},
-                component: () => import('~src/views/tasks/hc-data.vue')
+                meta: { title: '待办任务、已办任务、任务查看' },
+                component: () => import('~src/views/tasks/hc-data.vue'),
             },
             {
                 path: '/tasks/flow',
                 name: 'tasks-flow',
-                meta: {title: '任务流程设置'},
-                component: () => import('~src/views/tasks/flow.vue')
+                meta: { title: '任务流程设置' },
+                component: () => import('~src/views/tasks/flow.vue'),
             },
             {
                 path: '/tasks/sign-admin',
                 name: 'sign-admin',
-                meta: {title: '电签管理员'},
-                component: () => import('~src/views/tasks/sign-admin.vue')
+                meta: { title: '电签管理员' },
+                component: () => import('~src/views/tasks/sign-admin.vue'),
             },
             {
                 path: '/tasks/message-data',
                 name: 'message-data',
-                meta: {title: '消息提醒'},
-                component: () => import('~src/views/tasks/message-data.vue')
-            }
+                meta: { title: '消息提醒' },
+                component: () => import('~src/views/tasks/message-data.vue'),
+            },
         ],
     },
     {
         path: '/tentative/material',
         name: 'tentative-material',
         redirect: '/tentative/material/approach',
-        meta: {title: '材料管理'},
+        meta: { title: '材料管理' },
         component: Layout,
         children: [
             {
                 path: '/tentative/material/approach',
                 name: 'tentative-material-approach',
-                meta: {title: '材料进场'},
-                component: () => import('~src/views/tentative/material/approach.vue')
+                meta: { title: '材料进场' },
+                component: () => import('~src/views/tentative/material/approach.vue'),
             },
             {
                 path: '/tentative/material/sampling',
                 name: 'tentative-material-sampling',
-                meta: {title: '材料取样'},
-                component: () => import('~src/views/tentative/material/sampling.vue')
-            }
+                meta: { title: '材料取样' },
+                component: () => import('~src/views/tentative/material/sampling.vue'),
+            },
         ],
     },
     {
         path: '/tentative/detect',
         name: 'tentative-detect',
         redirect: '/tentative/detect/approach',
-        meta: {title: '试验检测'},
+        meta: { title: '试验检测' },
         component: Layout,
         children: [
             {
                 path: '/tentative/detect/third',
                 name: 'tentative-detect-third',
-                meta: {title: '外委检测'},
-                component: () => import('~src/views/tentative/detect/third.vue')
+                meta: { title: '外委检测' },
+                component: () => import('~src/views/tentative/detect/third.vue'),
             },
             {
                 path: '/tentative/detect/outside',
                 name: 'tentative-detect-outside',
-                meta: {title: '第三方检测'},
-                component: () => import('~src/views/tentative/detect/outside.vue')
+                meta: { title: '第三方检测' },
+                component: () => import('~src/views/tentative/detect/outside.vue'),
             },
             {
                 path: '/tentative/detect/test',
                 name: 'tentative-detect-test',
-                meta: {title: '试验检测'},
-                component: () => import('~src/views/tentative/detect/test.vue')
+                meta: { title: '试验检测' },
+                component: () => import('~src/views/tentative/detect/test.vue'),
             },
             {
                 path: '/tentative/detect/test-form',
                 name: 'tentative-detect-test-form',
-                meta: {title: '试验检测表单'},
-                component: () => import('~src/views/tentative/detect/test-form.vue')
-            }
+                meta: { title: '试验检测表单' },
+                component: () => import('~src/views/tentative/detect/test-form.vue'),
+            },
         ],
     },
     {
         path: '/tentative/collect',
         name: 'tentative-collect',
         redirect: '/tentative/collect/approach',
-        meta: {title: '汇总管理'},
+        meta: { title: '汇总管理' },
         component: Layout,
         children: [
             {
                 path: '/tentative/collect/test',
                 name: 'tentative-collect-test',
-                meta: {title: '试验汇总'},
-                component: () => import('~src/views/tentative/collect/test.vue')
+                meta: { title: '试验汇总' },
+                component: () => import('~src/views/tentative/collect/test.vue'),
             },
             {
                 path: '/tentative/collect/monthly',
                 name: 'tentative-collect-monthly',
-                meta: {title: '月报汇总'},
-                component: () => import('~src/views/tentative/collect/monthly.vue')
-            }
+                meta: { title: '月报汇总' },
+                component: () => import('~src/views/tentative/collect/monthly.vue'),
+            },
         ],
     },
     {
         path: '/tentative/device',
         name: 'tentative-device',
         redirect: '/tentative/device/approach',
-        meta: {title: '设备管理'},
+        meta: { title: '设备管理' },
         component: Layout,
         children: [
             {
                 path: '/tentative/device/approach',
                 name: 'tentative-device-approach',
-                meta: {title: '设备进场管理'},
-                component: () => import('~src/views/tentative/device/approach.vue')
+                meta: { title: '设备进场管理' },
+                component: () => import('~src/views/tentative/device/approach.vue'),
             },
             {
                 path: '/tentative/device/employ',
                 name: 'tentative-device-employ',
-                meta: {title: '设备使用管理'},
-                component: () => import('~src/views/tentative/device/employ.vue')
+                meta: { title: '设备使用管理' },
+                component: () => import('~src/views/tentative/device/employ.vue'),
             },
             {
                 path: '/tentative/device/overhaul',
                 name: 'tentative-device-overhaul',
-                meta: {title: '设备检修管理'},
-                component: () => import('~src/views/tentative/device/overhaul.vue')
-            }
+                meta: { title: '设备检修管理' },
+                component: () => import('~src/views/tentative/device/overhaul.vue'),
+            },
         ],
     },
     {
         path: '/tentative/parameter',
         name: 'tentative-parameter',
         redirect: '/tentative/parameter/container',
-        meta: {title: '参数设置'},
+        meta: { title: '参数设置' },
         component: Layout,
         children: [
             {
                 path: '/tentative/parameter/container',
                 name: 'tentative-parameter-container',
-                meta: {title: '试验容器'},
-                component: () => import('~src/views/tentative/parameter/container.vue')
+                meta: { title: '试验容器' },
+                component: () => import('~src/views/tentative/parameter/container.vue'),
             },
             {
                 path: '/tentative/parameter/sieve',
                 name: 'tentative-parameter-sieve',
-                meta: {title: '自定义筛孔类型'},
-                component: () => import('~src/views/tentative/parameter/sieve.vue')
+                meta: { title: '自定义筛孔类型' },
+                component: () => import('~src/views/tentative/parameter/sieve.vue'),
             },
             {
                 path: '/tentative/parameter/density',
                 name: 'tentative-parameter-density',
-                meta: {title: '温度及密度参数'},
-                component: () => import('~src/views/tentative/parameter/density.vue')
+                meta: { title: '温度及密度参数' },
+                component: () => import('~src/views/tentative/parameter/density.vue'),
             },
             {
                 path: '/tentative/parameter/compactness',
                 name: 'tentative-parameter-compactness',
-                meta: {title: '压实度评标参数'},
-                component: () => import('~src/views/tentative/parameter/compactness.vue')
-            }
+                meta: { title: '压实度评标参数' },
+                component: () => import('~src/views/tentative/parameter/compactness.vue'),
+            },
         ],
     },
     {
         path: '/tentative/laboratory',
         name: 'tentative-laboratory',
         redirect: '/tentative/laboratory/container',
-        meta: {title: '实验室管理'},
+        meta: { title: '实验室管理' },
         component: Layout,
         children: [
             {
                 path: '/tentative/laboratory/user',
                 name: 'tentative-laboratory-user',
-                meta: {title: '人员档案'},
-                component: () => import('~src/views/tentative/laboratory/user.vue')
+                meta: { title: '人员档案' },
+                component: () => import('~src/views/tentative/laboratory/user.vue'),
             },
             {
                 path: '/tentative/laboratory/print',
                 name: 'tentative-laboratory-print',
-                meta: {title: '打印空表'},
-                component: () => import('~src/views/tentative/laboratory/print.vue')
-            }
+                meta: { title: '打印空表' },
+                component: () => import('~src/views/tentative/laboratory/print.vue'),
+            },
         ],
     },
     {
         path: '/other',
         name: 'other',
         redirect: '/other/order-service',
-        meta: {title: '其他页面'},
+        meta: { title: '其他页面' },
         component: Layout,
         children: [
             {
                 path: '/other/order-service',
                 name: 'order-service',
-                meta: {title: '工单服务'},
-                component: () => import('~src/views/other/order-service.vue')
+                meta: { title: '工单服务' },
+                component: () => import('~src/views/other/order-service.vue'),
             },
             {
                 path: '/user/index',
                 name: 'user-index',
-                meta: {title: '个人中心'},
-                component: () => import('~src/views/user/index.vue')
-            }
+                meta: { title: '个人中心' },
+                component: () => import('~src/views/user/index.vue'),
+            },
         ],
     },
     {
         path: '/hc-test',
         name: 'hc-test',
         redirect: '/test/index',
-        meta: {title: '测试页面'},
+        meta: { title: '测试页面' },
         component: Layout,
         children: [
             {
                 path: '/test/index',
                 name: 'test-index',
-                meta: {title: '测试'},
-                component: () => import('~src/test/index.vue')
-            }
+                meta: { title: '测试' },
+                component: () => import('~src/test/index.vue'),
+            },
         ],
     },
     {
         path: '/403',
         name: '403',
-        meta: {title: '403'},
-        component: () => import('~src/views/error/403.vue')
+        meta: { title: '403' },
+        component: () => import('~src/views/error/403.vue'),
     },
     {
         path: '/404',
         name: '404',
-        meta: {title: '404'},
-        component: () => import('~src/views/error/404.vue')
+        meta: { title: '404' },
+        component: () => import('~src/views/error/404.vue'),
     },
     {
         path: '/500',
         name: '500',
-        meta: {title: '500'},
-        component: () => import('~src/views/error/500.vue')
+        meta: { title: '500' },
+        component: () => import('~src/views/error/500.vue'),
     },
     {
         path: '/:path(.*)*',
-        redirect: '/404'
-    }
+        redirect: '/404',
+    },
 ]

+ 2 - 2
src/router/routers.js

@@ -1,5 +1,5 @@
-import {getStoreValue} from '~src/utils/storage'
-import {getArrValue} from "js-fast-way"
+import { getStoreValue } from '~src/utils/storage'
+import { getArrValue } from 'js-fast-way'
 
 //获取路由菜单
 export const getRouterData = async (toName) => {

+ 12 - 12
src/store/index.js

@@ -1,10 +1,10 @@
-import {defineStore} from 'pinia'
-import pinia from "~src/store/init"
-import appConfig from '~src/config/app';
-import logoIcon from "~src/assets/logo/icon.png";
-import logoName from "~src/assets/logo/name.png";
-import {getStoreValue, setStoreValue, clearStoreAll} from '~src/utils/storage'
-import {setToken, setRefreshToken, removeToken, removeRefreshToken} from '~src/api/util/auth'
+import { defineStore } from 'pinia'
+import pinia from '~src/store/init'
+import appConfig from '~src/config/app'
+import logoIcon from '~src/assets/logo/icon.png'
+import logoName from '~src/assets/logo/name.png'
+import { clearStoreAll, getStoreValue, setStoreValue } from '~src/utils/storage'
+import { removeRefreshToken, removeToken, setRefreshToken, setToken } from '~src/api/util/auth'
 
 export const useAppStore = defineStore('main', {
     state: () => ({
@@ -13,8 +13,8 @@ export const useAppStore = defineStore('main', {
         logoIcon: getStoreValue('logoIcon') || logoIcon,
         logoName: getStoreValue('logoName') || logoName,
         //主题信息
-        theme: getStoreValue('theme') || appConfig.theme,    //用户可选择类型:auto,light, dark
-        themeVal: getStoreValue('themeVal') || '',           //实际主题:light, dark
+        theme: getStoreValue('theme') || appConfig.theme, //用户可选择类型:auto,light, dark
+        themeVal: getStoreValue('themeVal') || '', //实际主题:light, dark
         color: getStoreValue('color') || appConfig.color,
         homeTheme: getStoreValue('homeTheme') || appConfig.homeTheme,
         //用户信息
@@ -134,7 +134,7 @@ export const useAppStore = defineStore('main', {
             setStoreValue('buttons', value)
         },
         getButtonsVal(value) {
-            return this.buttons[value] || false;
+            return this.buttons[value] || false
         },
         //项目合同段数据
         setProjectContract(value) {
@@ -211,9 +211,9 @@ export const useAppStore = defineStore('main', {
             removeToken()
             removeRefreshToken()
         },
-    }
+    },
 })
 
 export default function useUserStoreWidthOut() {
-    return useAppStore(pinia);
+    return useAppStore(pinia)
 }

+ 4 - 3
src/store/init.js

@@ -1,3 +1,4 @@
-import { createPinia } from "pinia";
-const pinia = createPinia();
-export default pinia;
+import { createPinia } from 'pinia'
+
+const pinia = createPinia()
+export default pinia

+ 16 - 16
src/store/modules/app.js

@@ -1,9 +1,9 @@
-import pinia from "~src/store/init"
-import {useAppStore} from "~src/store";
-import {getButtons} from '~api/menu';
-import {getProjectAndContract} from '~api/user';
-import {getStoreValue} from '~src/utils/storage'
-import {ArrToOneObj, getArrValue} from "js-fast-way"
+import pinia from '~src/store/init'
+import { useAppStore } from '~src/store'
+import { getButtons } from '~api/menu'
+import { getProjectAndContract } from '~api/user'
+import { getStoreValue } from '~src/utils/storage'
+import { ArrToOneObj, getArrValue } from 'js-fast-way'
 
 const store = useAppStore(pinia)
 
@@ -11,13 +11,13 @@ const store = useAppStore(pinia)
 export const initProjectContract = async () => {
     const value = getStoreValue('projectContract')
     if (!value) {
-        const {error, data} = await getProjectAndContract();
-        if (error) return Promise.reject('error');
+        const { error, data } = await getProjectAndContract()
+        if (error) return Promise.reject('error')
         const datas = getArrValue(data)
         store.setProjectContract(datas)
-        return Promise.resolve(data);
+        return Promise.resolve(data)
     } else {
-        return Promise.resolve(value);
+        return Promise.resolve(value)
     }
 }
 
@@ -25,20 +25,20 @@ export const initProjectContract = async () => {
 export const initButtons = async () => {
     const value = getStoreValue('buttons')
     if (!value) {
-        const {error, data} = await getButtons();
-        if (error) return Promise.reject('error');
+        const { error, data } = await getButtons()
+        if (error) return Promise.reject('error')
         const buttons = getArrValue(data)
         const buttonsArr = await setButtonsData(buttons)
         store.setButtons(buttonsArr)
-        return Promise.resolve(true);
+        return Promise.resolve(true)
     } else {
-        return Promise.resolve(true);
+        return Promise.resolve(true)
     }
 }
 
 //设置按钮
 const setButtonsData = async (data) => {
-    let buttonsArr = {};
+    let buttonsArr = {}
     await ArrToOneObj(data, 'code', buttonsArr)
-    return buttonsArr;
+    return buttonsArr
 }

+ 35 - 35
src/store/modules/user.js

@@ -1,21 +1,21 @@
-import pinia from "~src/store/init"
-import appConfig from '~src/config/app';
-import {useAppStore} from "~src/store";
-import {getRoutes} from '~api/menu';
-import themeData from '~src/config/theme';
-import tokenData from "~src/router/modules/token";
-import {setStoreValue} from "~src/utils/storage";
-import {userLogin, refreshToken, logout} from '~api/user';
-import {userConfigInfo, userConfigSave} from "~api/other";
-import {ArrToOneObj, getArrValue, arrIndex, getObjValue} from "js-fast-way"
-import {useOsTheme} from 'hc-vue3-ui'
+import pinia from '~src/store/init'
+import appConfig from '~src/config/app'
+import { useAppStore } from '~src/store'
+import { getRoutes } from '~api/menu'
+import themeData from '~src/config/theme'
+import tokenData from '~src/router/modules/token'
+import { setStoreValue } from '~src/utils/storage'
+import { logout, refreshToken, userLogin } from '~api/user'
+import { userConfigInfo, userConfigSave } from '~api/other'
+import { ArrToOneObj, arrIndex, getArrValue, getObjValue } from 'js-fast-way'
+import { useOsTheme } from 'hc-vue3-ui'
 
 //初始变量
 const store = useAppStore(pinia)
 
 //登录
 export const useAppLogin = async (form) => {
-    const {error, status, res} = await userLogin(form);
+    const { error, status, res } = await userLogin(form)
     if (!error && status === 200) {
         store.setTokenVal(res['access_token'])
         store.setRefreshTokenVal(res['refresh_token'])
@@ -23,24 +23,24 @@ export const useAppLogin = async (form) => {
         store.setUserInfo(res)
         const routerRes = await setRouterData()
         if (!routerRes) {
-            return Promise.reject({msg: '路由异常'});
+            return Promise.reject({ msg: '路由异常' })
         }
         await initUserConfigInfo()
-        return Promise.resolve(res);
+        return Promise.resolve(res)
     } else {
-        return Promise.reject(res);
+        return Promise.reject(res)
     }
 }
 
 //用户信息初始化
 export const initUserConfigInfo = async () => {
-    const {error, data} = await userConfigInfo();
+    const { error, data } = await userConfigInfo()
     if (error) {
-        return Promise.reject(false);
+        return Promise.reject(false)
     }
     const res = getObjValue(data)
     if (res?.theme) {
-        const {theme, color, homeTheme, shotWebRtc, fullScreen, opinionView} = res
+        const { theme, color, homeTheme, shotWebRtc, fullScreen, opinionView } = res
         //设置主题
         store.setTheme(theme)
         //设置模式
@@ -50,7 +50,7 @@ export const initUserConfigInfo = async () => {
             store.setThemeVal(theme)
         }
         //获取主色调和首页主题数据
-        let themeColor = themeData.color, themeHome = themeData.home;
+        let themeColor = themeData.color, themeHome = themeData.home
         let colorIndex = arrIndex(themeColor, 'name', color)
         let homeIndex = arrIndex(themeHome, 'name', homeTheme)
         //设置主色调
@@ -65,7 +65,7 @@ export const initUserConfigInfo = async () => {
         store.setOrderServiceTipModal(opinionView ?? 1)
         store.setShotWebRtc(shotWebRtc)
         store.setShotWebRtc(fullScreen)
-        return Promise.resolve(true);
+        return Promise.resolve(true)
     } else {
         await userConfigSave({
             theme: appConfig?.theme || '',
@@ -73,18 +73,18 @@ export const initUserConfigInfo = async () => {
             homeTheme: appConfig?.homeTheme?.name || '',
             shotWebRtc: '0',
             fullScreen: '1',
-            opinionView: 1
+            opinionView: 1,
         })
-        return Promise.resolve(true);
+        return Promise.resolve(true)
     }
 }
 
 //设置路由信息
 export const setRouterData = async () => {
     //请求接口,获取路由数据
-    const {error, data} = await getRoutes()
+    const { error, data } = await getRoutes()
     if (error) {
-        return Promise.reject(false);
+        return Promise.reject(false)
     }
     const resData = getArrValue(data)
     //数据转换
@@ -95,33 +95,33 @@ export const setRouterData = async () => {
     store.setMenus(resData)
     setStoreValue('route', routesObj)
     setStoreValue('routes', routes)
-    return Promise.resolve(true);
+    return Promise.resolve(true)
 }
 
 //刷新token
 export const RefreshToken = async () => {
     try {
-        window.console.log('刷新 token');
-        const {dept_id, role_id} = store.getUserInfo;
-        const refresh = store.getRefreshToken;
-        const tenantId = store.getTenantId;
-        const {error, status, res} = await refreshToken(refresh, tenantId, dept_id, role_id);
+        window.console.log('刷新 token')
+        const { dept_id, role_id } = store.getUserInfo
+        const refresh = store.getRefreshToken
+        const tenantId = store.getTenantId
+        const { error, status, res } = await refreshToken(refresh, tenantId, dept_id, role_id)
         if (!error && status === 200) {
             store.setTokenVal(res['access_token'])
             store.setRefreshTokenVal(res['refresh_token'])
             store.setTenantId(res['tenant_id'])
             store.setUserInfo(res)
-            return Promise.resolve(res);
+            return Promise.resolve(res)
         } else {
-            return Promise.reject(res);
+            return Promise.reject(res)
         }
     } catch (e) {
-        window.console.warn('token 刷新失败: ', e);
-        return Promise.reject(e);
+        window.console.warn('token 刷新失败: ', e)
+        return Promise.reject(e)
     }
 }
 
 //登出
 export const LogOut = async () => {
-    return await logout();
+    return await logout()
 }

+ 1 - 1
src/test/index.vue

@@ -2,7 +2,7 @@
     <HcCard>
         <template #header>
             <el-button size="large" type="primary">
-                <HcIcon name="search-2"/>
+                <HcIcon name="search-2" />
                 <span>搜索</span>
             </el-button>
         </template>

+ 5 - 5
src/test/json.js

@@ -1,8 +1,8 @@
-import {data} from './data.js'
+import { data } from './data.js'
 
 export default {
-    "code": 200,
-    "success": true,
-    "data": data,
-    "msg": "操作成功"
+    code: 200,
+    success: true,
+    data: data,
+    msg: '操作成功',
 }

+ 2 - 2
src/utils/storage.js

@@ -1,4 +1,4 @@
-import {setStoreData, getStoreData, delStoreData, clearStoreAll} from "js-fast-way"
+import { clearStoreAll, delStoreData, getStoreData, setStoreData } from 'js-fast-way'
 import website from '~src/config/index'
 
 //获取缓存
@@ -16,4 +16,4 @@ export const delStoreValue = (key, session = false) => {
     return delStoreData(website.key + '-' + key, session)
 }
 
-export {clearStoreAll}
+export { clearStoreAll }

+ 21 - 21
src/utils/tools.js

@@ -1,13 +1,13 @@
-import {clog, arrIndex} from "js-fast-way"
-import config from "~src/config/index";
+import { arrIndex, clog } from 'js-fast-way'
+import config from '~src/config/index'
 
-import {useAppStore} from "~src/store";
+import { useAppStore } from '~src/store'
 
 const store = useAppStore()
 
 //控制台打印
 export const HcLog = (name, tips, data) => {
-    const title = store.barMenuName ?? '';
+    const title = store.barMenuName ?? ''
     if (config.isLog === 'auto') {
         if (import.meta.env.DEV) {
             clog(title, name, tips, data)
@@ -38,43 +38,43 @@ export const delMessage = (cbk) => {
             if (action === 'confirm') {
                 cbk()
             }
-        }
+        },
     })
 }
 
 //日期格式化
 export const dateFormat = (date, format) => {
-    format = format || 'yyyy-MM-dd hh:mm:ss';
+    format = format || 'yyyy-MM-dd hh:mm:ss'
     if (date !== 'Invalid Date') {
         let o = {
-            "M+": date.getMonth() + 1, //month
-            "d+": date.getDate(), //day
-            "h+": date.getHours(), //hour
-            "m+": date.getMinutes(), //minute
-            "s+": date.getSeconds(), //second
-            "q+": Math.floor((date.getMonth() + 3) / 3), //quarter
-            "S": date.getMilliseconds() //millisecond
+            'M+': date.getMonth() + 1, //month
+            'd+': date.getDate(), //day
+            'h+': date.getHours(), //hour
+            'm+': date.getMinutes(), //minute
+            's+': date.getSeconds(), //second
+            'q+': Math.floor((date.getMonth() + 3) / 3), //quarter
+            'S': date.getMilliseconds(), //millisecond
         }
         if (/(y+)/.test(format)) {
-            format = format.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length));
+            format = format.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length))
         }
         for (let k in o) {
-            if (new RegExp("(" + k + ")").test(format)) {
-                format = format.replace(RegExp.$1, RegExp.$1.length === 1 ? o[k] : ("00" + o[k]).substr(("" + o[k]).length));
+            if (new RegExp('(' + k + ')').test(format)) {
+                format = format.replace(RegExp.$1, RegExp.$1.length === 1 ? o[k] : ('00' + o[k]).substr(('' + o[k]).length))
             }
         }
-        return format;
+        return format
     }
-    return '';
+    return ''
 }
 
 //获取当前域名
 export const getTopUrl = () => {
-    return window.location.href.split('/#/')[0];
+    return window.location.href.split('/#/')[0]
 }
 
 //设置系统名称
 export const setAppName = (name) => {
-    const title = window.document.title;
-    window.document.title = `${title}${name?' - ' + name:''}`;
+    const title = window.document.title
+    window.document.title = `${title}${name ? ' - ' + name : ''}`
 }

+ 11 - 11
src/utils/utils.js

@@ -3,32 +3,32 @@ export const getTreeNodeType = (type, majorDataType) => {
     if (type > 0 && majorDataType > 0) {
         switch (majorDataType) {
             case 1:
-                return '开';
+                return '开'
             case 2:
-                return '评';
+                return '评'
             case 3:
-                return '交';
+                return '交'
             case 4:
-                return '序';
+                return '序'
             default:
                 return ''
         }
     } else if (type > 0 && majorDataType <= 0) {
         switch (type) {
             case 1:
-                return '单';
+                return '单'
             case 2:
-                return '部';
+                return '部'
             case 3:
-                return '部';
+                return '部'
             case 4:
-                return '项';
+                return '项'
             case 5:
-                return '项';
+                return '项'
             case 6:
-                return '序';
+                return '序'
             case 102:
-                return '检';
+                return '检'
             default:
                 return ''
         }