iZaiZaiA 2 years ago
parent
commit
b3a38995e2

+ 4 - 4
package.json

@@ -17,10 +17,11 @@
         "js-web-screen-shot": "^1.7.1",
         "moment": "^2.29.4",
         "naive-ui": "^2.32.0",
-        "pinia": "^2.0.17",
+        "pinia": "^2.0.18",
         "vue": "^3.2.37",
         "vue-router": "^4.1.3",
-        "vuedraggable": "^4.1.0"
+        "vuedraggable": "^4.1.0",
+        "vue-utils-plus": "^0.0.62"
     },
     "devDependencies": {
         "@vitejs/plugin-vue": "^3.0.1",
@@ -34,7 +35,6 @@
         "unplugin-vue-components": "^0.22.4",
         "vfonts": "^0.0.3",
         "vite": "^3.0.5",
-        "vooks": "^0.2.12",
-        "vue-utils-plus": "^0.0.5-beta.2"
+        "vooks": "^0.2.12"
     }
 }

+ 6 - 6
src/layout/modules/MenuItem.vue

@@ -1,24 +1,24 @@
 <template>
     <template v-for="item in datas">
-        <el-sub-menu :index="item?.key" :popper-offset="10" v-if="item?.children && item?.children.length > 0">
+        <el-sub-menu :index="item?.code" :popper-offset="10" v-if="item?.children && item?.children.length > 0">
             <template #title>
                 <div class="hc-aside-menu-item">
-                    <!-- v-if="item?.icon"-->
-                    <HcIcon name="home" class="hc-menu-icon" :ui="curKey === item?.key?'fill':''"/>
+                    <!-- v-if="item?.source"-->
+                    <HcIcon name="home" class="hc-menu-icon" :ui="curKey === item?.code?'fill':''"/>
                     <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="20" v-if="item?.key === 'tasks'"/>
+                    <el-badge :value="20" v-if="item?.code === 'tasks'"/>
                 </div>
                 <HcIcon name="arrow_drop_down" ui="el-icon el-sub-menu__icon-arrow"/>
             </template>
             <MenuItem :datas="item?.children" :cur="curKey" @change="MenuClick"/>
         </el-sub-menu>
-        <el-menu-item :index="item?.key" v-else @click="MenuClick(item)">
+        <el-menu-item :index="item?.code" v-else @click="MenuClick(item)">
             <div class="hc-aside-menu-item">
                 <HcIcon name="home" class="hc-menu-icon" :ui="curKey === item?.key?'fill':''" v-if="item?.icon"/>
                 <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="12" v-if="item?.key === 'tasks-data' || item?.key === 'message-data'"/>
+                <el-badge :value="12" v-if="item?.code === 'tasks-data' || item?.code === 'message-data'"/>
             </div>
         </el-menu-item>
     </template>

+ 0 - 3
src/layout/router.vue

@@ -1,3 +0,0 @@
-<template>
-    <router-view/>
-</template>

+ 15 - 51
src/router/index.js

@@ -1,71 +1,35 @@
 import * as vueRouter from 'vue-router'
-import baseData  from "./modules/base";
-import tokenData  from "./modules/token";
+import baseData from "./modules/base";
 import config from '~src/config/index'
 import authStore from '~src/api/util/auth'
-import {getRouterData, whiteRouter} from './routers'
+import {getRouterData} from './routers'
+import {utilsArray} from "vue-utils-plus"
 import NProgress from "nprogress";
 import "~src/styles/app/nprogress.scss";
 
+//初始变量
+const { isItem } = utilsArray()
+
+//设置路由数据
 const router = vueRouter.createRouter({
     history: vueRouter.createWebHashHistory(),
     routes: baseData
 });
 
-let isRouterData = 0;
-
-//验证身份
-const verifyToken = (token, path, router) => {
-    if (token) {
-        //如果已经登录了,并且不是登录页,就提前添加动态路由(也是为了动态显示菜单)
-        if (path !== '/login') {
-            if (isRouterData === 0) {
-                isRouterData = 1
-                getRouterData(router).then()
-            }
-            return true
-        } else {
-            isRouterData = 0
-            return true
-        }
-    } else {
-        //如果没有登录,并且访问的是本地固定路由,验证某些路由,是否需要先登录。
-        if (tokenData.findIndex(item => item === path) !== -1) {
-            return false
-        } else if (path === '/login') {
-            isRouterData = 0
-            return true
-        } else {
-            return true
-        }
-    }
-}
-
 //路由拦截
 router.beforeEach(async (to, from, next) => {
     NProgress.start();
     const token = authStore.getToken()
-    //验证是否为本地固定路由的路径
-    if (whiteRouter().findIndex(item => item === to.path) > -1) {
-        if (verifyToken(token,to.path, router)) {
-            next()
-        } else {
-            isRouterData = 0
-            next('/login')
-        }
+    if (to.path === '/login') {
+        next()
+    } else if (!token) {
+        next('/login')
     } else {
-        //非本地路由,并且当前已经登录
-        if (token) {
-            if (isRouterData === 0) {
-                await getRouterData(router)
-                isRouterData = 1
-                next({ ...to, replace: true });
-            } else {
-                next()
-            }
+        const {routes} = await getRouterData()
+        if (isItem(routes, to.name)) {
+            next()
         } else {
-            isRouterData = 0
-            next('/login')
+            next('/404')
         }
     }
 })

+ 163 - 15
src/router/modules/base.js

@@ -34,17 +34,86 @@ export default [
         ],
     },
     {
-        path: '/other',
-        name: 'other',
-        redirect: '/other/order-service',
-        meta: {title: '其他页面'},
+        path: '/data-fill',
+        name: 'data-fill',
+        redirect: '/data-fill/wbs',
+        meta: {title: '资料管理'},
         component: Layout,
         children: [
             {
-                path: '/other/order-service',
-                name: 'order-service',
-                meta: {title: '工单服务'},
-                component: () => import('~src/views/other/order-service.vue')
+                path: '/data-fill/wbs',
+                name: 'data-fill-wbs',
+                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')
+            }
+        ],
+    },
+    {
+        path: '/ledger',
+        name: 'ledger',
+        redirect: '/ledger/query',
+        meta: {title: '台账日志'},
+        component: Layout,
+        children: [
+            {
+                path: '/ledger/query',
+                name: 'ledger-write',
+                meta: {title: '日志填报'},
+                component: () => import('~src/views/ledger/query.vue')
+            },
+            {
+                path: '/ledger/write',
+                name: 'ledger-query',
+                meta: {title: '台账管理'},
+                component: () => import('~src/views/ledger/write.vue')
+            }
+        ],
+    },
+    {
+        path: '/schedule',
+        name: 'schedule',
+        redirect: '/schedule/write',
+        meta: {title: '进度查询'},
+        component: Layout,
+        children: [
+            {
+                path: '/schedule/write',
+                name: 'schedule-internal',
+                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')
+            },
+            {
+                path: '/schedule/table',
+                name: 'schedule-table',
+                meta: {title: 'WBS节点进度'},
+                component: () => import('~src/views/schedule/hc-table.vue')
+            },
+        ],
+    },
+    {
+        path: '/other-file',
+        name: 'other-file',
+        redirect: '/other-file/image-data',
+        meta: {title: '其他文件'},
+        component: Layout,
+        children: [
+            {
+                path: '/other-file/image-data',
+                name: 'image-data',
+                meta: {title: '影像资料'},
+                component: () => import('~src/views/other-file/image-data.vue')
             },
             {
                 path: '/other-file/image-view',
@@ -58,18 +127,93 @@ export default [
                 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')
+            }
+        ],
+    },
+    {
+        path: '/gauge',
+        name: 'gauge-base',
+        redirect: '/gauge/station',
+        meta: {title: '综合管理'},
+        component: Layout,
+        children: [
+            {
+                path: '/gauge/station',
+                name: 'gauge-station',
+                meta: {title: '测站点'},
+                component: () => import('~src/views/gauge/station.vue')
+            },
+            {
+                path: '/gauge/bezier',
+                name: 'gauge-bezier',
+                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')
+            }
+        ],
+    },
+    {
+        path: '/tasks',
+        name: 'tasks',
+        redirect: '/tasks/data',
+        meta: {title: '任务管理'},
+        component: Layout,
+        children: [
+            {
+                path: '/tasks/hc-data',
+                name: 'tasks-data',
+                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')
+            },
+            {
+                path: '/tasks/sign-admin',
+                name: 'sign-admin',
+                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')
+            }
+        ],
+    },
+    {
+        path: '/other',
+        name: 'other',
+        redirect: '/other/order-service',
+        meta: {title: '其他页面'},
+        component: Layout,
+        children: [
+            {
+                path: '/other/order-service',
+                name: 'order-service',
+                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')
-            },
-            {
-                path: '/schedule/table',
-                name: 'schedule-table',
-                meta: {title: 'WBS节点进度'},
-                component: () => import('~src/views/schedule/hc-table.vue')
-            },
+            }
         ],
     },
     {
@@ -104,5 +248,9 @@ export default [
         name: '500',
         meta: {title: '500'},
         component: () => import('~src/views/error/500.vue')
+    },
+    {
+        path: '/:path(.*)*',
+        redirect: '/404'
     }
 ]

+ 9 - 10
src/router/modules/token.js

@@ -1,13 +1,12 @@
 //内置路由需要验证的
 export default [
-    '/home',
-    '/home/index',
-    '/home/config',
-    '/other',
-    '/other/order-service',
-    '/other-file/image-view',
-    '/other-file/image-form',
-    '/user/index',
-    '/schedule/table',
-    '/test/index'
+    'home',
+    'home-index',
+    'home-config',
+    'other-file-view',
+    'other-file-form',
+    'schedule-table',
+    'order-service',
+    'user-index',
+    'test-index'
 ]

+ 23 - 110
src/router/routers.js

@@ -1,122 +1,35 @@
 import pinia from "~src/store/init"
 import {getRoutes} from '~api/menu';
+import tokenData  from "./modules/token";
+import website from '~src/config/index'
 import {useAppStore} from "~src/store/index";
-import Layout from "~src/layout/index.vue";
-import LayoutRouter from "~src/layout/router.vue";
-import baseData  from "./modules/base";
-import appStore from '~uti/storage'
-const modules = import.meta.glob('../views/**/*.vue')
+import {utilsStore, utilsArray, isType} from "vue-utils-plus"
 
+//变量初始化
 const userStore = useAppStore(pinia)
-
-//路由白名单
-export const whiteRouter = () => {
-    return whiteRouterData(baseData)
-}
-export const whiteRouterData = (res) => {
-    const routers = [];
-    res.forEach(item => {
-        routers.push(item.path)
-        //子路由处理
-        const children = item['children'] || []
-        if (children.length !== 0) {
-            const arr = whiteRouterData(children)
-            arr.forEach(items => {
-                routers.push(items)
-            })
-        }
-    })
-    return routers;
-}
+const { getStoreData, setStoreData } = utilsStore(website.key)
+const { getArrValue, getObjNullValue } = isType()
+const { ArrToOneObj } = utilsArray()
 
 //获取路由菜单
-export const getRouterData = async (router= null, menu = false) => {
-    const value = appStore.getStoreData('routes')
-    if (!value) {
+export const getRouterData = async () => {
+    const route = getObjNullValue(getStoreData('route'))
+    if (!route) {
         //请求接口,获取路由数据
-        const { status, data } = await getRoutes()
-        if (status === 200) {
-            const routesData = data?.data || []
-            appStore.setStoreData('routes',routesData)
-            return formatRoutes(router,routesData, menu)
-        } else {
-            return menu?[]:false
-        }
+        const {data} = await getRoutes()
+        const resData = getArrValue(data?.data)
+        //数据转换
+        let routesObj = {}, routesArr = []
+        await ArrToOneObj(resData, 'code', routesObj, routesArr)
+        const routes = [...tokenData, ...routesArr] //合并
+        //数据缓存
+        userStore.setMenus(resData)
+        setStoreData('route', routesObj)
+        setStoreData('routes', routes)
+        return {route: routesObj, routes}
     } else {
         //加载本地缓存路由
-        return formatRoutes(router, value, menu)
-    }
-}
-
-//动态路由
-export const formatRoutes = (router, res = [], menu) => {
-    const obj = routesFormatData(res);
-    //把路径解析后的菜单数据,缓存。
-    userStore.setMenus(obj.menus)
-    //获取数据的类型
-    if (menu) {
-        return obj.menus
-    } else {
-        //添加动态路由
-        let routers = obj.routers;
-        routers.forEach(item => {
-            router.addRoute(item)
-        })
-        // * 优先级高,最后添加,否则,刷新会跳到404
-        router.addRoute({
-            path: '/:path(.*)*',
-            redirect: '/404'
-        })
-        return true
-    }
-}
-
-//处理路由
-export const routesFormatData = (res = []) => {
-    const routers = [], menus = []
-    // 如果没有权限菜单就结束
-    if (res.length === 0) return
-    // 开始处理menu
-    for (let i = 0; i < res.length; i++) {
-        //是否有子路由
-        const children = res[i]['children'] || []
-        const isChild = children.length !== 0
-        //通用数据
-        const routerData = {
-            path: res[i].path,
-            name: res[i].code,
-            meta: {
-                title: res[i].name,
-                videoUrl: res[i].videoUrl
-            }
-        }
-        //通用数据
-        const menusData = {
-            key: res[i].code,
-            name: res[i].name,
-            icon: res[i].source || ''
-        }
-        //有子路由
-        if (isChild) {
-            routerData['redirect'] = res[i].alias
-            if (res[i].isLayout === 2) {
-                routerData['component'] = Layout
-            } else {
-                routerData['component'] = LayoutRouter
-            }
-            const obj = routesFormatData(children)
-            routerData['children'] = obj.routers
-            menusData['children'] = obj.menus
-        } else {
-            let path = '../views' + res[i].path + '.vue';
-            Object.keys(modules).forEach(key => {
-                if (modules[key].name === path) {
-                    routerData['component'] = modules[key]
-                }
-            })
-        }
-        routers.push(routerData)
-        menus.push(menusData)
+        const routes = getArrValue(getStoreData('routes'))
+        return {route, routes}
     }
-    return {routers, menus};
 }

+ 44 - 42
src/store/index.js

@@ -1,36 +1,38 @@
 import {defineStore} from 'pinia'
 import pinia from "~src/store/init"
+import website from '~src/config/index'
 import appConfig from '~src/config/app';
 import authStore from '~src/api/util/auth'
-import appStore from '~uti/storage'
+import { utilsStore } from "vue-utils-plus"
+const { getStoreData, setStoreData, clearStoreAll } = utilsStore(website.key)
 
 export const useAppStore = defineStore('main', {
     state: () =>({
         //主题信息
-        theme: appStore.getStoreData('theme') || appConfig.theme,    //用户可选择类型:auto,light, dark
-        themeVal: appStore.getStoreData('themeVal') || '',           //实际主题:light, dark
-        color: appStore.getStoreData('color') || appConfig.color,
-        homeTheme: appStore.getStoreData('homeTheme') || appConfig.homeTheme,
+        theme: getStoreData('theme') || appConfig.theme,    //用户可选择类型:auto,light, dark
+        themeVal: getStoreData('themeVal') || '',           //实际主题:light, dark
+        color: getStoreData('color') || appConfig.color,
+        homeTheme: getStoreData('homeTheme') || appConfig.homeTheme,
         //用户信息
-        token: appStore.getStoreData( 'token') || '',
-        refreshToken: appStore.getStoreData('refreshToken') || '',
-        tenantId: appStore.getStoreData('tenantId') || '',
-        userInfo: appStore.getStoreData('userInfo') || {},
+        token: getStoreData( 'token') || '',
+        refreshToken: getStoreData('refreshToken') || '',
+        tenantId: getStoreData('tenantId') || '',
+        userInfo: getStoreData('userInfo') || {},
         //菜单信息
-        menus: appStore.getStoreData('menus') || [],
-        buttons: appStore.getStoreData('buttons') || {},
+        menus: getStoreData('menus') || [],
+        buttons: getStoreData('buttons') || {},
         //项目合同段数据
-        projectContract: appStore.getStoreData('projectContract') || [],
-        projectInfo: appStore.getStoreData('projectInfo') || {},
-        contractInfo: appStore.getStoreData('contractInfo') || {},
-        projectId: appStore.getStoreData('projectId') || '',
-        contractId: appStore.getStoreData('contractId') || '',
+        projectContract: getStoreData('projectContract') || [],
+        projectInfo: getStoreData('projectInfo') || {},
+        contractInfo: getStoreData('contractInfo') || {},
+        projectId: getStoreData('projectId') || '',
+        contractId: getStoreData('contractId') || '',
         //其他配置信息
-        bubble: appStore.getStoreData('bubble') || false,
-        orderServiceTipModal: appStore.getStoreData('orderServiceTipModal') ?? 1, //0不弹出,1弹出
-        shotWebRtc: appStore.getStoreData('shotWebRtc') || 0, //WebRtc截图方式: 0关闭,1开启
-        fullScreen: appStore.getStoreData('fullScreen') || 0, //全屏截图:0关闭,1开启
-        isCollapse: appStore.getStoreData('isCollapse') || false, //菜单折叠
+        bubble: getStoreData('bubble') || false,
+        orderServiceTipModal: getStoreData('orderServiceTipModal') ?? 1, //0不弹出,1弹出
+        shotWebRtc: getStoreData('shotWebRtc') || 0, //WebRtc截图方式: 0关闭,1开启
+        fullScreen: getStoreData('fullScreen') || 0, //全屏截图:0关闭,1开启
+        isCollapse: getStoreData('isCollapse') || false, //菜单折叠
         isScreenShort: false,
     }),
     getters: {
@@ -65,47 +67,47 @@ export const useAppStore = defineStore('main', {
         //主题信息
         setTheme(value) {
             this.theme = value
-            appStore.setStoreData('theme',value)
+            setStoreData('theme',value)
         },
         setThemeVal(value) {
             this.themeVal = value
-            appStore.setStoreData('themeVal',value)
+            setStoreData('themeVal',value)
         },
         setColor(value) {
             this.color = value
-            appStore.setStoreData('color',value)
+            setStoreData('color',value)
         },
         setHomeTheme(value) {
             this.homeTheme = value
-            appStore.setStoreData('homeTheme',value)
+            setStoreData('homeTheme',value)
         },
         //用户信息
         setToken(value){
             this.token = value
             authStore.setToken(value)
-            appStore.setStoreData('token',value)
+            setStoreData('token',value)
         },
         setRefreshToken(value){
             this.refreshToken = value
             authStore.setRefreshToken(value)
-            appStore.setStoreData('refreshToken',value)
+            setStoreData('refreshToken',value)
         },
         setTenantId(value){
             this.tenantId = value
-            appStore.setStoreData('tenantId',value)
+            setStoreData('tenantId',value)
         },
         setUserInfo(value){
             this.userInfo = value
-            appStore.setStoreData('userInfo',value)
+            setStoreData('userInfo',value)
         },
         //菜单信息
         setMenus(value){
             this.menus = value
-            appStore.setStoreData('menus',value)
+            setStoreData('menus',value)
         },
         setButtons(value){
             this.buttons = value
-            appStore.setStoreData('buttons',value)
+            setStoreData('buttons',value)
         },
         getButtonsVal(value) {
             return this.buttons[value] || false;
@@ -113,47 +115,47 @@ export const useAppStore = defineStore('main', {
         //项目合同段数据
         setProjectContract(value) {
             this.projectContract = value
-            appStore.setStoreData('projectContract',value)
+            setStoreData('projectContract',value)
         },
         setProjectInfo(value) {
             this.projectInfo = value
-            appStore.setStoreData('projectInfo',value)
+            setStoreData('projectInfo',value)
         },
         setContractInfo(value) {
             this.contractInfo = value
-            appStore.setStoreData('contractInfo',value)
+            setStoreData('contractInfo',value)
         },
         setProjectId(value) {
             this.projectId = value
-            appStore.setStoreData('projectId',value)
+            setStoreData('projectId',value)
         },
         setContractId(value) {
             this.contractId = value
-            appStore.setStoreData('contractId',value)
+            setStoreData('contractId',value)
         },
         //其他配置信息
         setBubble(value) {
             this.bubble = value
-            appStore.setStoreData('bubble',value)
+            setStoreData('bubble',value)
         },
         setOrderServiceTipModal(value) {
             this.orderServiceTipModal = value
-            appStore.setStoreData('orderServiceTipModal',value)
+            setStoreData('orderServiceTipModal',value)
         },
         setScreenShort(value) {
             this.isScreenShort = value
         },
         setShotWebRtc(value) {
             this.shotWebRtc = value
-            appStore.setStoreData('shotWebRtc',value)
+            setStoreData('shotWebRtc',value)
         },
         setFullScreen(value) {
             this.fullScreen = value
-            appStore.setStoreData('fullScreen',value)
+            setStoreData('fullScreen',value)
         },
         setCollapse(value) { //菜单折叠
             this.isCollapse = value
-            appStore.setStoreData('isCollapse',value)
+            setStoreData('isCollapse',value)
         },
         //清除缓存和token
         clearStoreData() {
@@ -174,7 +176,7 @@ export const useAppStore = defineStore('main', {
             this.fullScreen = null
             this.isCollapse = false
             //清除缓存
-            appStore.clearAllStore()
+            clearStoreAll()
             authStore.removeToken()
             authStore.removeRefreshToken()
         },

+ 12 - 26
src/store/modules/app.js

@@ -1,21 +1,23 @@
 import pinia from "~src/store/init"
 import {useAppStore} from "~src/store/index";
-import appStore from '~uti/storage'
 import {getButtons} from '~api/menu';
 import {getProjectAndContract} from '~api/user';
+import website from '~src/config/index'
+import {utilsStore,utilsArray,isType} from "vue-utils-plus"
+
 const store = useAppStore(pinia)
+const { getStoreData } = utilsStore(website.key)
+const { ArrToOneObj } = utilsArray()
+const { getArrValue } = isType()
 
 //项目合同段初始化
 export const initProjectContract = async () => {
-    const value = appStore.getStoreData('projectContract')
+    const value = getStoreData('projectContract')
     if (!value) {
         try {
             const { data } = await getProjectAndContract();
-            if (data.code === 200) {
-                store.setProjectContract(data.data || [])
-            } else {
-                store.setProjectContract([])
-            }
+            const datas = getArrValue(data?.data)
+            store.setProjectContract(datas)
             return Promise.resolve(data);
         } catch (e) {
             return Promise.reject(e);
@@ -27,11 +29,11 @@ export const initProjectContract = async () => {
 
 //按钮初始化
 export const initButtons = async () => {
-    const value = appStore.getStoreData('buttons')
+    const value = getStoreData('buttons')
     if (!value) {
         try {
             const { data } = await getButtons();
-            const buttons = data?.code === 200 ? data?.data || [] : []
+            const buttons = getArrValue(data?.data)
             const buttonsArr = await setButtonsData(buttons)
             store.setButtons(buttonsArr)
             return Promise.resolve(true);
@@ -46,22 +48,6 @@ export const initButtons = async () => {
 //设置按钮
 const setButtonsData = async (data) => {
     let buttonsArr = {};
-    async function getCode(list) {
-        list.forEach(ele => {
-            if (typeof (ele) === 'object') {
-                if (ele.children) {
-                    getCode(ele.children)
-                } else {
-                    buttonsArr[ele.code] = {
-                        code: ele.code || '',
-                        name: ele.name || '',
-                        textInfo: ele.textInfo || ''
-                    }
-                }
-            }
-        })
-    }
-    await getCode(data);
+    await ArrToOneObj(data,'code', buttonsArr)
     return buttonsArr;
 }
-

+ 10 - 8
src/store/modules/user.js

@@ -4,9 +4,12 @@ import {useAppStore} from "~src/store/index";
 import {userLogin,refreshToken,logout} from '~api/user';
 import {userConfigInfo, userConfigSave} from "~api/other";
 import themeData from '~src/config/theme';
-import {useOsTheme} from "naive-ui";
+import {utilsArray,isType} from "vue-utils-plus"
+import {useOsTheme} from 'vooks'
 
 const store = useAppStore(pinia)
+const { getIndex } = utilsArray()
+const { getObjValue } = isType()
 
 //登录
 export const useAppLogin = async (form) => {
@@ -26,9 +29,9 @@ export const useAppLogin = async (form) => {
 //用户信息初始化
 export const initUserConfigInfo = async () => {
     const {data} = await userConfigInfo();
-    const theme = data.code === 200 ? data?.data?.theme || '' : ''
-    if (theme) {
-        const {theme,color,homeTheme,shotWebRtc,fullScreen,opinionView} = data?.data || {}
+    const res = getObjValue(data?.data)
+    if (res?.theme) {
+        const {theme,color,homeTheme,shotWebRtc,fullScreen,opinionView} = res
         //设置主题
         store.setTheme(theme)
         //设置模式
@@ -39,8 +42,8 @@ export const initUserConfigInfo = async () => {
         }
         //获取主色调和首页主题数据
         let themeColor = themeData.color, themeHome = themeData.home;
-        let colorIndex = themeColor.findIndex(item => item.name === color)
-        let homeIndex = themeHome.findIndex(item => item.name === homeTheme)
+        let colorIndex = getIndex(themeColor,'name',color)
+        let homeIndex = getIndex(themeHome,'name',homeTheme)
         //设置主色调
         if (colorIndex !== -1) {
             store.setColor(themeColor[colorIndex])
@@ -55,7 +58,7 @@ export const initUserConfigInfo = async () => {
         store.setShotWebRtc(fullScreen)
         return true
     } else {
-        userConfigSave({
+        await userConfigSave({
             theme: appConfig?.theme || '',
             color: appConfig?.color?.name || '',
             homeTheme: appConfig?.homeTheme?.name || '',
@@ -67,7 +70,6 @@ export const initUserConfigInfo = async () => {
     }
 }
 
-
 //刷新token
 export const RefreshToken = async () => {
     try {

+ 9 - 9
src/views/gauge/bezier.vue

@@ -251,7 +251,7 @@ import bezier from '~api/gauge/bezier';
 import HcPage from "~com/plugins/naive/HcPage.vue"
 import {getTokenHeader} from '~src/api/request/header';
 import {download} from '~src/utils/lib/tools';
-import {renderTableEditDelButton,renderTableEditInput, renderTableEditInputButton} from "~src/plugins/renderele";
+//import {renderTableEditDelButton,renderTableEditInput, renderTableEditInputButton} from "~src/plugins/renderele";
 
 //初始变量
 const useAppState = useAppStore()
@@ -357,14 +357,14 @@ const createColumns = ({edit,del}) => {
         {title: '半径', key: 'r'},
         {title: "操作", key: "actions", width: 160, align: 'center',
             render(row) {
-                return renderTableEditDelButton({
+                /*return renderTableEditDelButton({
                     bubble: bubbleVal.value,
                     btn_edit: btn_edit.value,
                     btn_del: btn_del.value,
                     edit_event: edit,
                     del_event: del,
                     row:row
-                })
+                })*/
             }
         }
     ];
@@ -460,31 +460,31 @@ const AdminPartColumns = [
         title: '片段名称',
         key: 'name',
         render (row) {
-            return h(renderTableEditInput, {
+            /*return h(renderTableEditInput, {
                 value: row.name,
                 isEdit: row.isEdit,
                 onUpdateValue (val) {
                     row.name = val
                 }
-            })
+            })*/
         }
     },
     {
         title: '桩号前缀',
         key: 'prefix',
         render (row) {
-            return h(renderTableEditInput, {
+            /*return h(renderTableEditInput, {
                 value: row.prefix,
                 isEdit: row.isEdit,
                 onUpdateValue (val) {
                     row.prefix = val
                 }
-            })
+            })*/
         }
     },
     {title: "操作", key: "actions", width: 160, align: 'center',
         render(row,index) {
-            return h(renderTableEditInputButton, {
+            /*return h(renderTableEditInputButton, {
                 row: row,
                 onSave (res) {
                     const reg = /^[A-Z]+$/
@@ -519,7 +519,7 @@ const AdminPartColumns = [
                         AdminPartTableData.value.splice(index, 1)
                     }
                 }
-            })
+            })*/
         }
     }
 ];

+ 5 - 5
src/views/gauge/station.vue

@@ -111,7 +111,7 @@ import {ref,watch,onMounted} from "vue";
 import {useAppStore} from "~src/store/index";
 import HcTabs from "~com/plugins/naive/HcTabs.vue"
 import HcPage from "~com/plugins/naive/HcPage.vue"
-import {renderTableEditDelButton} from "~src/plugins/renderele";
+//import {renderTableEditDelButton} from "~src/plugins/renderele";
 import {getTokenHeader} from '~src/api/request/header';
 import station from '~api/gauge/station';
 import {download} from "~src/utils/lib/tools";
@@ -240,14 +240,14 @@ const createTraverseColumns = ({edit,del}) => {
         {title: '备注', key: 'remark'},
         {title: "操作", key: "actions", width: 160, align: 'center',
             render(row) {
-                return renderTableEditDelButton({
+                /*return renderTableEditDelButton({
                     bubble: bubbleVal.value,
                     btn_edit: btn_edit.value,
                     btn_del: btn_del.value,
                     edit_event: edit,
                     del_event: del,
                     row:row
-                })
+                })*/
             }
         }
     ];
@@ -293,14 +293,14 @@ const createLevelColumns = ({edit,del}) => {
         {title: '备注', key: 'remark'},
         {title: "操作", key: "actions", width: 160, align: 'center',
             render(row) {
-                return renderTableEditDelButton({
+                /*return renderTableEditDelButton({
                     bubble: bubbleVal.value,
                     btn_edit: btn_edit.value,
                     btn_del: btn_del.value,
                     edit_event: edit,
                     del_event: del,
                     row:row
-                })
+                })*/
             }
         }
     ];

+ 3 - 3
src/views/ledger/components/construction.vue

@@ -64,7 +64,7 @@ import {useAppStore} from "~src/store/index";
 import HcPage from "~com/plugins/naive/HcPage.vue"
 import HcTree from "~com/plugins/element/HcTree.vue"
 import {queryWbsTable, updateWbsTable} from '~api/ledger/construction';
-import {smallButton, smallPopover} from "~src/plugins/renderele";
+//import {smallButton, smallPopover} from "~src/plugins/renderele";
 
 const useAppState = useAppStore()
 const projectId = ref(useAppState.getProjectId);
@@ -161,9 +161,9 @@ const createTableColumns = ({edit}) => {
             render(row) {
                 let disabled = !bubbleVal.value || !btn_edit.value?.textInfo;
                 if (btn_edit.value) {
-                    return smallPopover(disabled,btn_edit.value?.textInfo, smallButton("编辑", row, edit))
+                    //return smallPopover(disabled,btn_edit.value?.textInfo, smallButton("编辑", row, edit))
                 } else {
-                    return smallButton("编辑", row, edit);
+                    //return smallButton("编辑", row, edit);
                 }
             }
         }

+ 3 - 3
src/views/ledger/components/weather.vue

@@ -67,7 +67,7 @@
 import {onMounted, ref, watch} from "vue";
 import {useAppStore} from "~src/store/index";
 import HcPage from "~com/plugins/naive/HcPage.vue"
-import {smallButton, smallPopover} from "~src/plugins/renderele";
+//import {smallButton, smallPopover} from "~src/plugins/renderele";
 import { queryWeatherPage, updateWeatherById } from '~api/ledger/weather';
 import {deepClone} from "~src/utils/lib/util";
 
@@ -168,9 +168,9 @@ const createColumns = ({edit}) => {
             render(row) {
                 let disabled = !bubbleVal.value || !btn_edit.value?.textInfo;
                 if (btn_edit.value) {
-                    return smallPopover(disabled,btn_edit.value?.textInfo, smallButton("编辑", row, edit))
+                    //return smallPopover(disabled,btn_edit.value?.textInfo, smallButton("编辑", row, edit))
                 } else {
-                    return smallButton("编辑", row, edit);
+                    //return smallButton("编辑", row, edit);
                 }
             }
         }

+ 2 - 2
src/views/ledger/query.vue

@@ -97,7 +97,7 @@
 <script setup>
 import {ref, watch, onMounted, nextTick} from "vue";
 import {useAppStore} from "~src/store/index";
-import {HcIcon} from "~src/plugins/renderele";
+import {hIconJs} from "~src/plugins/renderele";
 import HcPage from "~com/plugins/naive/HcPage.vue"
 import DateCalendar from "~com/dateCalendar/index.vue"
 import HcReportModal from "~com/reportModal/index.vue"
@@ -165,7 +165,7 @@ const queryLogList = () => {
             newArr.push({
                 key: key,
                 label: res[i].title,
-                icon: res[i]['iconValue']?HcIcon(res[i]['iconValue']):null,
+                icon: res[i]['iconValue']?hIconJs(res[i]['iconValue']):null,
                 children: [
                     {label: "日志填报", key: `${key}-form`, pid: key, type: 'form'},
                     {label: "日志列表查看", key: `${key}-table`, pid: key, type: 'table'},

+ 3 - 3
src/views/other-file/image-data.vue

@@ -53,7 +53,7 @@ import {useRoute} from 'vue-router'
 import router from '~src/router/index';
 import {useAppStore} from "~src/store/index";
 import imageData from '~api/other-file/imageData';
-import {smallButton, smallThinButton} from "~src/plugins/renderele";
+//import {smallButton, smallThinButton} from "~src/plugins/renderele";
 import {removeStore} from "~src/utils/lib/storage";
 
 const useRoutes = useRoute()
@@ -154,9 +154,9 @@ const createColumns = ({toggle}) => {
         {title: "操作", key: "actions", width: 120, align: 'center',
             render(row) {
                 if (row.isShow) {
-                    return smallThinButton("隐藏分类", row, toggle)
+                    //return smallThinButton("隐藏分类", row, toggle)
                 } else {
-                    return smallButton("显示分类", row, toggle)
+                    //return smallButton("显示分类", row, toggle)
                 }
             }
         }

+ 3 - 3
src/views/tasks/flow.vue

@@ -57,7 +57,7 @@ import {ref,watch,onMounted} from "vue";
 import {useAppStore} from "~src/store/index";
 import HcPage from "~com/plugins/naive/HcPage.vue"
 import TasksUser from "~com/tasksUser/index.vue"
-import {smallButton, smallPopover} from "~src/plugins/renderele";
+//import {smallButton, smallPopover} from "~src/plugins/renderele";
 import tasksFlowApi from '~api/tasks/flow';
 
 //初始变量
@@ -112,9 +112,9 @@ const createColumns = ({edit}) => {
             render(row) {
                 let disabled = !bubbleVal.value || !btn_edit.value?.textInfo;
                 if (btn_edit.value) {
-                    return smallPopover(disabled,btn_edit.value?.textInfo, smallButton("编辑", row, edit))
+                    //return smallPopover(disabled,btn_edit.value?.textInfo, smallButton("编辑", row, edit))
                 } else {
-                    return smallButton("编辑", row, edit);
+                    //return smallButton("编辑", row, edit);
                 }
             }
         }

+ 6 - 6
src/views/tasks/message-data.vue

@@ -31,7 +31,7 @@ import {ref,h,watch} from "vue";
 import {useRoute} from 'vue-router'
 import router from '~src/router/index';
 import {useAppStore} from "~src/store/index";
-import {HcIcon} from "~src/plugins/renderele";
+//import {HcIcon} from "~src/plugins/renderele";
 import HcPage from "~com/plugins/naive/HcPage.vue"
 import {NBadge} from "naive-ui";
 
@@ -61,11 +61,11 @@ watch(() => [
 //左侧菜单
 const menuKey = ref(MenuType)
 const menuOptions = ref([
-    {key: 'basic', label: '任务催办', icon: HcIcon('cicon-notice-o')},
-    {key: 'password', label: '监测预警', icon: HcIcon('cicon-eye-o')},
-    {key: 'project', label: '废除通知', icon: HcIcon('cicon-delete-line-o')},
-    {key: 'log', label: '工单反馈', icon: HcIcon('cicon-community-o')},
-    {key: 'recycle', label: '系统消息', icon: HcIcon('cicon-apps')},
+    {key: 'basic', label: '任务催办', icon: ''},
+    {key: 'password', label: '监测预警', icon: ''},
+    {key: 'project', label: '废除通知', icon: ''},
+    {key: 'log', label: '工单反馈', icon: ''},
+    {key: 'recycle', label: '系统消息', icon: ''},
 ]);
 
 //搜索和分页数据

+ 5 - 3
src/views/user/index.vue

@@ -49,7 +49,7 @@
                             </el-col>
                             <el-col :span="12">
                                 <el-form-item label="所属角色">
-                                    <el-input v-model="formUserModel.role_name" placeholder="" disabled/>
+                                    <el-input v-model="formUserModel.roleName" placeholder="" disabled/>
                                 </el-form-item>
                             </el-col>
                             <el-col :span="12">
@@ -59,8 +59,8 @@
                             </el-col>
                             <el-col :span="12">
                                 <el-form-item label="CA签字体">
-                                    <!--el-image style="height: 60px" src="" :preview-src-list="srcList" :initial-index="0" fit="cover"/-->
-                                    开发中...
+                                    <el-image style="height: 60px" :src="formUserModel?.signatureUrl" :preview-src-list="[formUserModel?.signatureUrl]" :initial-index="0" fit="cover" v-if="formUserModel?.signatureUrl"/>
+                                    <span class="text-zinc-400" v-else>无CA签字体</span>
                                 </el-form-item>
                             </el-col>
                         </el-row>
@@ -345,6 +345,8 @@ const queryCurrentUserData = () => {
         if (data.code === 200) {
             formUserModel.value.deptId = data.data?.deptId || ''
             formUserModel.value.idNumber = data.data?.idNumber || ''
+            formUserModel.value.roleName = data.data?.roleName || ''
+            formUserModel.value.signatureUrl = data.data?.signatureUrl || ''
         }
     })
 }

+ 8 - 8
yarn.lock

@@ -994,10 +994,10 @@ pify@^2.3.0:
   resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
   integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==
 
-pinia@^2.0.17:
-  version "2.0.17"
-  resolved "https://registry.yarnpkg.com/pinia/-/pinia-2.0.17.tgz#f925e5e4f73c15e16dfb4838176a9ca50752f26b"
-  integrity sha512-AtwLwEWQgIjofjgeFT+nxbnK5lT2QwQjaHNEDqpsi2AiCwf/NY78uWTeHUyEhiiJy8+sBmw0ujgQMoQbWiZDfA==
+pinia@^2.0.18:
+  version "2.0.18"
+  resolved "https://registry.yarnpkg.com/pinia/-/pinia-2.0.18.tgz#b29ed34bcb4c032b7da7c24c10db18b88d9254d8"
+  integrity sha512-I5MW05UVX6a5Djka136oH3VzYFiZUgeOApBwFjMx6pL91eHtGVlE3adjNUKLgtwGnrxiBRuJ8+4R3LKJKwnyZg==
   dependencies:
     "@vue/devtools-api" "^6.2.1"
     vue-demi "*"
@@ -1355,10 +1355,10 @@ vue-router@^4.1.3:
   dependencies:
     "@vue/devtools-api" "^6.1.4"
 
-vue-utils-plus@^0.0.5-beta.2:
-  version "0.0.5-beta.2"
-  resolved "https://registry.yarnpkg.com/vue-utils-plus/-/vue-utils-plus-0.0.5-beta.2.tgz#6b0e8bc4c024cf2681ceaf5aff881bc969a78ff2"
-  integrity sha512-IY65u6W7XUhtXmhkQHW9CENzOXm4VmbDOExv06RIcFBKLXrSHHGrvy7lll6caYmlI/dwVAaM9E8upE7c6kJ36w==
+vue-utils-plus@^0.0.62:
+  version "0.0.62"
+  resolved "https://registry.yarnpkg.com/vue-utils-plus/-/vue-utils-plus-0.0.62.tgz#e08b6652dc96be495552b702ccd2cbee5445a7d1"
+  integrity sha512-Q27F8fywdXVn4CszwKksMzXXEmQu+Uq0O+6cd9SfttpzuO9wU2hrO7MABP8Ibe+FXqfn9Q9xHi8gChEdrEW2vw==
 
 vue@^3.2.37:
   version "3.2.37"