From 3835cf1ca8d5ac8475052d3876ebeb4a2c4160f1 Mon Sep 17 00:00:00 2001
From: shuishen <1109946754@qq.com>
Date: Mon, 22 Jan 2024 14:22:02 +0800
Subject: [PATCH] 根据角色,动态切换首页,及首页变更的一系列相关调整

---
 src/router/page/index.js               |    9 
 src/config/website.js                  |   43 
 src/permission.js                      |   75 +
 src/views/wel/index.vue                |  219 +++--
 src/page/index/sidebar/sidebarItem.vue |  238 +++---
 src/store/modules/user.js              |  443 +++++++----
 src/cache.js                           |   51 +
 src/router/views/index.js              |  330 +++++----
 src/page/index/tags.vue                |  312 ++++----
 src/router/router.js                   |   34 
 src/mock/menu.js                       |   63 +
 src/views/system/user.vue              |   12 
 src/components/error-page/404.vue      |   27 
 src/store/modules/common.js            |    3 
 src/page/index/top/index.vue           |    5 
 src/page/login/userlogin.vue           |   34 
 src/store/getters.js                   |    4 
 src/store/modules/tags.js              |   75 +-
 src/page/index/sidebar/index.vue       |   72 +-
 19 files changed, 1,141 insertions(+), 908 deletions(-)

diff --git a/src/cache.js b/src/cache.js
index fdd723d..42d6359 100644
--- a/src/cache.js
+++ b/src/cache.js
@@ -1,30 +1,51 @@
-import Vue from 'vue'
-import store from './store';
+/*
+ * @Author: shuishen 1109946754@qq.com
+ * @Date: 2023-12-14 17:10:00
+ * @LastEditors: shuishen 1109946754@qq.com
+ * @LastEditTime: 2024-01-22 13:23:37
+ * @FilePath: \jczz_web\src\cache.js
+ * @Description:
+ *
+ * Copyright (c) 2024 by shuishen, All Rights Reserved.
+ */
+import Vue from "vue";
+import store from "./store";
 Vue.mixin({
   beforeRouteEnter: function (to, from, next) {
     next(() => {
-      let avueView = document.getElementById('avue-view');
+      let avueView = document.getElementById("avue-view");
       if (avueView && to.meta.savedPosition) {
-        avueView.scrollTop = to.meta.savedPosition
+        avueView.scrollTop = to.meta.savedPosition;
       }
-    })
+    });
   },
   beforeRouteLeave: function (to, from, next) {
-    let avueView = document.getElementById('avue-view');
+    let avueView = document.getElementById("avue-view");
     if (from && from.meta.keepAlive) {
       if (avueView) {
-        from.meta.savedPosition = avueView.scrollTop
+        from.meta.savedPosition = avueView.scrollTop;
       }
-      const result = this.$route.meta.keepAlive === true && store.state.tags.tagList.some(ele => {
-        return ele.value === this.$route.fullPath;
-      });
+      console.log(store.state.tags.tagList, this.$route.fullPath, 909999);
+      const result =
+        this.$route.meta.keepAlive === true &&
+        store.state.tags.tagList.some((ele) => {
+          return ele.value === this.$route.fullPath;
+        });
       if (this.$vnode && !result) {
-        from.meta.savedPosition = 0
-        if (this.$vnode.parent && this.$vnode.parent.componentInstance && this.$vnode.parent.componentInstance.cache) {
+        from.meta.savedPosition = 0;
+        if (
+          this.$vnode.parent &&
+          this.$vnode.parent.componentInstance &&
+          this.$vnode.parent.componentInstance.cache
+        ) {
           if (this.$vnode.componentOptions) {
-            let key = this.$vnode.key == null
-              ? this.$vnode.componentOptions.Ctor.cid + (this.$vnode.componentOptions.tag ? `::${this.$vnode.componentOptions.tag}` : '')
-              : this.$vnode.key;
+            let key =
+              this.$vnode.key == null
+                ? this.$vnode.componentOptions.Ctor.cid +
+                  (this.$vnode.componentOptions.tag
+                    ? `::${this.$vnode.componentOptions.tag}`
+                    : "")
+                : this.$vnode.key;
             let cache = this.$vnode.parent.componentInstance.cache;
             let keys = this.$vnode.parent.componentInstance.keys;
             if (cache[key]) {
diff --git a/src/components/error-page/404.vue b/src/components/error-page/404.vue
index 7ba262e..fc4919e 100644
--- a/src/components/error-page/404.vue
+++ b/src/components/error-page/404.vue
@@ -1,23 +1,22 @@
 <template>
-  <div class="error-page">
-    <div class="img"
-         style=" background-image: url('/img/bg/404.svg');"></div>
-    <div class="content">
-      <h1>404</h1>
-      <div class="desc">抱歉,你访问的页面不存在</div>
-      <div class="actions">
-        <router-link :to="{path:'/'}">
-          <el-button type="primary">返回首页</el-button>
-        </router-link>
-      </div>
+    <div class="error-page">
+        <div class="img" style=" background-image: url('/img/bg/404.svg');"></div>
+        <div class="content">
+            <h1>404</h1>
+            <div class="desc">抱歉,你访问的页面不存在</div>
+            <div class="actions">
+                <router-link :to="{ path: '/' }">
+                    <el-button type="primary">返回首页</el-button>
+                </router-link>
+            </div>
+        </div>
     </div>
-  </div>
 </template>
 
 <script>
 export default {
-  name: "error-404"
-};
+    name: "error-404"
+}
 </script>
 <style lang="scss" scoped>
 @import "./style.scss";
diff --git a/src/config/website.js b/src/config/website.js
index e50bdbf..7747a21 100644
--- a/src/config/website.js
+++ b/src/config/website.js
@@ -4,52 +4,55 @@
 export default {
   title: "saber",
   logo: "S",
-  key: 'saber', //配置主键,目前用于存储
-  indexTitle: '基层智治综合协同平台',
-  clientId: 'saber', // 客户端id
-  clientSecret: 'saber_secret', // 客户端密钥
+  key: "saber", //配置主键,目前用于存储
+  indexTitle: "基层智治综合协同平台",
+  clientId: "saber", // 客户端id
+  clientSecret: "saber_secret", // 客户端密钥
   tenantMode: true, // 是否开启租户模式
   tenantId: "000000", // 管理组租户编号
   captchaMode: true, // 是否开启验证码模式
   switchMode: false, // 是否开启部门切换模式
-  lockPage: '/lock',
+  lockPage: "/lock",
   tokenTime: 3000,
-  tokenHeader: 'Blade-Auth',
+  tokenHeader: "Blade-Auth",
   //http的status默认放行列表
   statusWhiteList: [],
   //配置首页不可关闭
   isFirstPage: false,
+
   fistPage: {
     label: "首页",
     value: "/wel/index",
     params: {},
     query: {},
     meta: {
-      i18n: 'dashboard'
+      i18n: "dashboard",
     },
     group: [],
-    close: false
+    close: false,
   },
+
   //配置菜单的属性
   menu: {
-    iconDefault: 'iconfont icon-caidan',
+    iconDefault: "iconfont icon-caidan",
     props: {
-      label: 'name',
-      path: 'path',
-      icon: 'source',
-      children: 'children'
-    }
+      label: "name",
+      path: "path",
+      icon: "source",
+      children: "children",
+    },
   },
   // 第三方系统授权地址
-  authUrl: 'http://localhost/blade-auth/oauth/render',
+  authUrl: "http://localhost/blade-auth/oauth/render",
   // 报表设计器地址(cloud端口为8108,boot端口为80)
-  reportUrl: 'https://srgdjczzxtpt.com:2080/jczz-ureport/ureport',
+  reportUrl: "https://srgdjczzxtpt.com:2080/jczz-ureport/ureport",
   // reportUrl: 'http://localhost:9528/ureport',
   // 单点登录系统认证(blade-auth服务的地)
-  ssoUrl: 'http://localhost:8100/oauth/authorize?client_id=saber&response_type=code&redirect_uri=',
+  ssoUrl:
+    "http://localhost:8100/oauth/authorize?client_id=saber&response_type=code&redirect_uri=",
   // 单点登录回调地址(Saber服务的地址)
-  redirectUri: 'http://localhost:1888',
+  redirectUri: "http://localhost:1888",
   // redirectUri:'http://192.168.0.102:9528',
   // minio 基础路径
-  minioUrl: 'https://srgdjczzxtpt.com:2080/gminio/jczz/'
-}
+  minioUrl: "https://srgdjczzxtpt.com:2080/gminio/jczz/",
+};
diff --git a/src/mock/menu.js b/src/mock/menu.js
index cef5e78..e2e2f58 100644
--- a/src/mock/menu.js
+++ b/src/mock/menu.js
@@ -1,47 +1,58 @@
-import Mock from 'mockjs'
+/*
+ * @Author: shuishen 1109946754@qq.com
+ * @Date: 2023-12-14 17:10:00
+ * @LastEditors: shuishen 1109946754@qq.com
+ * @LastEditTime: 2024-01-22 10:20:25
+ * @FilePath: \jczz_web\src\mock\menu.js
+ * @Description:
+ *
+ * Copyright (c) 2024 by shuishen, All Rights Reserved.
+ */
+import Mock from "mockjs";
 
-const top = [{
-  label: "首页",
-  path: "/wel/index",
-  icon: 'el-icon-menu',
-  meta: {
-    i18n: 'dashboard',
+const top = [
+  {
+    label: "首页",
+    path: "/wel/index",
+    icon: "el-icon-menu",
+    meta: {
+      i18n: "dashboard",
+    },
+    parentId: 0,
   },
-  parentId: 0
-},
   {
     label: "bladex官网",
-    icon: 'el-icon-document',
+    icon: "el-icon-document",
     meta: {
-      i18n: 'website',
+      i18n: "website",
     },
     path: "https://bladex.cn/#/",
-    parentId: 1
+    parentId: 1,
   },
   {
     label: "avuex官网",
-    icon: 'el-icon-document',
+    icon: "el-icon-document",
     meta: {
-      i18n: 'avuexwebsite',
+      i18n: "avuexwebsite",
     },
     path: "https://avuex.avue.top",
-    parentId: 2
+    parentId: 2,
   },
   {
     label: "测试",
-    icon: 'el-icon-document',
+    icon: "el-icon-document",
     path: "/test/index",
     meta: {
-      i18n: 'test',
+      i18n: "test",
     },
-    parentId: 3
-  }]
-export default ({mock}) => {
+    parentId: 3,
+  },
+];
+export default ({ mock }) => {
   if (!mock) return;
-  Mock.mock('/user/getTopMenu', 'get', () => {
+  Mock.mock("/user/getTopMenu", "get", () => {
     return {
-      data: top
-    }
-  })
-
-}
+      data: top,
+    };
+  });
+};
diff --git a/src/page/index/sidebar/index.vue b/src/page/index/sidebar/index.vue
index 9b883ef..f6e53d7 100644
--- a/src/page/index/sidebar/index.vue
+++ b/src/page/index/sidebar/index.vue
@@ -1,49 +1,51 @@
+<!--
+ * @Author: shuishen 1109946754@qq.com
+ * @Date: 2023-12-14 17:10:00
+ * @LastEditors: shuishen 1109946754@qq.com
+ * @LastEditTime: 2024-01-22 11:32:56
+ * @FilePath: \jczz_web\src\page\index\sidebar\index.vue
+ * @Description: 
+ * 
+ * Copyright (c) 2024 by shuishen, All Rights Reserved. 
+-->
 <template>
-  <div class="avue-sidebar">
-    <logo></logo>
-    <el-scrollbar style="height:100%">
-      <div v-if="validatenull(menu)"
-           class="avue-sidebar--tip">{{$t('menuTip')}}
-      </div>
-      <el-menu unique-opened
-               :default-active="nowTagValue"
-               mode="vertical"
-               :show-timeout="200"
-               :collapse="keyCollapse">
-        <sidebar-item :menu="menu"
-                      :screen="screen"
-                      first
-                      :props="website.menu.props"
-                      :collapse="keyCollapse"></sidebar-item>
-      </el-menu>
-    </el-scrollbar>
-  </div>
+    <div class="avue-sidebar">
+        <logo></logo>
+        <el-scrollbar style="height:100%">
+            <div v-if="validatenull(menu)" class="avue-sidebar--tip">{{ $t('menuTip') }}
+            </div>
+            <el-menu unique-opened :default-active="nowTagValue" mode="vertical" :show-timeout="200"
+                :collapse="keyCollapse">
+                <sidebar-item :menu="menu" :screen="screen" first :props="website.menu.props"
+                    :collapse="keyCollapse"></sidebar-item>
+            </el-menu>
+        </el-scrollbar>
+    </div>
 </template>
 
 <script>
-  import {mapGetters} from "vuex";
-  import logo from "../logo";
-  import sidebarItem from "./sidebarItem";
+import { mapGetters } from "vuex"
+import logo from "../logo"
+import sidebarItem from "./sidebarItem"
 
-  export default {
+export default {
     name: "sidebar",
-    components: {sidebarItem, logo},
+    components: { sidebarItem, logo },
     inject: ["index"],
-    data() {
-      return {};
+    data () {
+        return {}
     },
-    created() {
-      this.index.openMenu();
+    created () {
+        // this.index.openMenu()
     },
     computed: {
-      ...mapGetters(["website", "menu", "tag", "keyCollapse", "screen", "menuId"]),
-      nowTagValue: function () {
-        return this.$router.$avueRouter.getValue(this.$route);
-      }
+        ...mapGetters(["website", "menu", "tag", "keyCollapse", "screen", "menuId"]),
+        nowTagValue: function () {
+            return this.$router.$avueRouter.getValue(this.$route)
+        }
     },
     methods: {}
-  };
+}
 </script>
-<style lang="scss" scoped>
-</style>
+<style lang="scss" scoped></style>
 
diff --git a/src/page/index/sidebar/sidebarItem.vue b/src/page/index/sidebar/sidebarItem.vue
index 2693e31..3564c07 100644
--- a/src/page/index/sidebar/sidebarItem.vue
+++ b/src/page/index/sidebar/sidebarItem.vue
@@ -1,146 +1,134 @@
 <template>
-  <div class="menu-wrapper">
-    <template v-for="item in menu">
-      <el-menu-item v-if="validatenull(item[childrenKey]) && vaildRoles(item)"
-                    :index="item[pathKey]"
-                    @click="open(item)"
-                    :key="item[labelKey]"
-                    :class="{'is-active':vaildActive(item)}">
-        <i :class="item[iconKey]"></i>
-        <span slot="title"
-              :alt="item[pathKey]">{{generateTitle(item)}}</span>
-      </el-menu-item>
-      <el-submenu v-else-if="!validatenull(item[childrenKey])&&vaildRoles(item)"
-                  :index="item[pathKey]"
-                  :key="item[labelKey]">
-        <template slot="title">
-          <i :class="item[iconKey]"></i>
-          <span slot="title"
-                :class="{'el-menu--display':collapse && first}">{{generateTitle(item)}}</span>
-        </template>
-        <template v-for="(child,cindex) in item[childrenKey]">
-          <el-menu-item :index="child[pathKey],cindex"
-                        @click="open(child)"
-                        :class="{'is-active':vaildActive(child)}"
-                        v-if="validatenull(child[childrenKey])"
+    <div class="menu-wrapper">
+        <template v-for="item in menu">
+            <el-menu-item v-if="validatenull(item[childrenKey]) && vaildRoles(item)" :index="item[pathKey]"
+                @click="open(item)" :key="item[labelKey]" :class="{ 'is-active': vaildActive(item) }">
+                <i :class="item[iconKey]"></i>
+                <span slot="title" :alt="item[pathKey]">{{ generateTitle(item) }}</span>
+            </el-menu-item>
+            <el-submenu v-else-if="!validatenull(item[childrenKey]) && vaildRoles(item)" :index="item[pathKey]"
+                :key="item[labelKey]">
+                <template slot="title">
+                    <i :class="item[iconKey]"></i>
+                    <span slot="title" :class="{ 'el-menu--display': collapse && first }">{{ generateTitle(item) }}</span>
+                </template>
+                <template v-for="(child, cindex) in item[childrenKey]">
+                    <el-menu-item :index="child[pathKey], cindex" @click="open(child)"
+                        :class="{ 'is-active': vaildActive(child) }" v-if="validatenull(child[childrenKey])"
                         :key="child[labelKey]">
-            <i :class="child[iconKey]"></i>
-            <span slot="title">{{generateTitle(child)}}</span>
-          </el-menu-item>
-          <sidebar-item v-else
-                        :menu="[child]"
-                        :key="cindex"
-                        :props="props"
-                        :screen="screen"
+                        <i :class="child[iconKey]"></i>
+                        <span slot="title">{{ generateTitle(child) }}</span>
+                    </el-menu-item>
+                    <sidebar-item v-else :menu="[child]" :key="cindex" :props="props" :screen="screen"
                         :collapse="collapse"></sidebar-item>
+                </template>
+            </el-submenu>
         </template>
-      </el-submenu>
-    </template>
-  </div>
+    </div>
 </template>
 <script>
-  import {mapGetters} from "vuex";
-  import {isURL, validatenull} from "@/util/validate";
-  import config from "./config.js";
+import { mapGetters } from "vuex"
+import { isURL, validatenull } from "@/util/validate"
+import config from "./config.js"
 
-  export default {
+export default {
     name: "sidebarItem",
-    data() {
-      return {
-        config: config
-      };
+    data () {
+        return {
+            config: config
+        }
     },
     props: {
-      menu: {
-        type: Array
-      },
-      screen: {
-        type: Number
-      },
-      first: {
-        type: Boolean,
-        default: false
-      },
-      props: {
-        type: Object,
-        default: () => {
-          return {};
+        menu: {
+            type: Array
+        },
+        screen: {
+            type: Number
+        },
+        first: {
+            type: Boolean,
+            default: false
+        },
+        props: {
+            type: Object,
+            default: () => {
+                return {}
+            }
+        },
+        collapse: {
+            type: Boolean
         }
-      },
-      collapse: {
-        type: Boolean
-      }
     },
-    created() {
+    created () {
     },
-    mounted() {
+    mounted () {
     },
     computed: {
-      ...mapGetters(["roles"]),
-      labelKey() {
-        return this.props.label || this.config.propsDefault.label;
-      },
-      pathKey() {
-        return this.props.path || this.config.propsDefault.path;
-      },
-      iconKey() {
-        return this.props.icon || this.config.propsDefault.icon;
-      },
-      childrenKey() {
-        return this.props.children || this.config.propsDefault.children;
-      },
-      isOpenKey() {
-        return this.props.isOpen || this.config.propsDefault.isOpen;
-      },
-      nowTagValue() {
-        return this.$router.$avueRouter.getValue(this.$route);
-      }
+        ...mapGetters(["roles"]),
+        labelKey () {
+            return this.props.label || this.config.propsDefault.label
+        },
+        pathKey () {
+            return this.props.path || this.config.propsDefault.path
+        },
+        iconKey () {
+            return this.props.icon || this.config.propsDefault.icon
+        },
+        childrenKey () {
+            return this.props.children || this.config.propsDefault.children
+        },
+        isOpenKey () {
+            return this.props.isOpen || this.config.propsDefault.isOpen
+        },
+        nowTagValue () {
+            return this.$router.$avueRouter.getValue(this.$route)
+        }
     },
     methods: {
-      generateTitle(item) {
-        return this.$router.$avueRouter.generateTitle(
-          item[this.labelKey],
-          (item.meta || {}).i18n
-        );
-      },
-      vaildActive(item) {
-        if (this.validIsOpen(item)) {
-          return false;
+        generateTitle (item) {
+            return this.$router.$avueRouter.generateTitle(
+                item[this.labelKey],
+                (item.meta || {}).i18n
+            )
+        },
+        vaildActive (item) {
+            if (this.validIsOpen(item)) {
+                return false
+            }
+            const groupFlag = (item["group"] || []).some(ele =>
+                this.$route.path.includes(ele)
+            )
+            return this.nowTagValue === item[this.pathKey] || groupFlag
+        },
+        vaildRoles (item) {
+            item.meta = item.meta || {}
+            return item.meta.roles ? item.meta.roles.includes(this.roles) : true
+        },
+        validatenull (val) {
+            return validatenull(val)
+        },
+        validIsOpen (item) {
+            if (item[this.isOpenKey] === 2 && isURL(item[this.pathKey])) {
+                return true
+            }
+        },
+        open (item) {
+            if (this.screen <= 1) this.$store.commit("SET_COLLAPSE")
+            if (this.validIsOpen(item)) {
+                window.open(item[this.pathKey])
+            } else {
+                this.$router.$avueRouter.group = item.group
+                this.$router.$avueRouter.meta = item.meta
+                this.$router.push({
+                    path: this.$router.$avueRouter.getPath({
+                        name: item[this.labelKey],
+                        src: item[this.pathKey]
+                    }, item.meta),
+                    query: item.query
+                })
+            }
         }
-        const groupFlag = (item["group"] || []).some(ele =>
-          this.$route.path.includes(ele)
-        );
-        return this.nowTagValue === item[this.pathKey] || groupFlag;
-      },
-      vaildRoles(item) {
-        item.meta = item.meta || {};
-        return item.meta.roles ? item.meta.roles.includes(this.roles) : true;
-      },
-      validatenull(val) {
-        return validatenull(val);
-      },
-      validIsOpen(item) {
-        if (item[this.isOpenKey] === 2 && isURL(item[this.pathKey])) {
-          return true;
-        }
-      },
-      open(item) {
-        if (this.screen <= 1) this.$store.commit("SET_COLLAPSE");
-        if (this.validIsOpen(item)) {
-          window.open(item[this.pathKey]);
-        } else {
-          this.$router.$avueRouter.group = item.group;
-          this.$router.$avueRouter.meta = item.meta;
-          this.$router.push({
-            path: this.$router.$avueRouter.getPath({
-              name: item[this.labelKey],
-              src: item[this.pathKey]
-            }, item.meta),
-            query: item.query
-          });
-        }
-      }
     }
-  };
+}
 </script>
 
diff --git a/src/page/index/tags.vue b/src/page/index/tags.vue
index ab14485..ce0a238 100644
--- a/src/page/index/tags.vue
+++ b/src/page/index/tags.vue
@@ -1,186 +1,166 @@
 <template>
-  <div class="avue-tags"
-       v-if="showTag">
-    <!-- tag盒子 -->
-    <div v-if="contextmenuFlag"
-         class="avue-tags__contentmenu"
-         :style="{left:contentmenuX+'px',top:contentmenuY+'px'}">
-      <div class="item"
-           @click="clearCacheTags">{{$t('tagsView.clearCache')}}
-      </div>
-      <div class="item"
-           @click="closeOthersTags">{{$t('tagsView.closeOthers')}}
-      </div>
-      <div class="item"
-           @click="closeAllTags">{{$t('tagsView.closeAll')}}
-      </div>
-    </div>
-    <div class="avue-tags__box"
-         :class="{'avue-tags__box--close':!website.isFirstPage}">
-      <el-tabs v-model="active"
-               type="card"
-               @contextmenu.native="handleContextmenu"
-               :closable="tagLen!==1"
-               @tab-click="openTag"
-               @edit="menuTag">
-        <el-tab-pane :key="item.value"
-                     v-for="item in tagList"
-                     :label="generateTitle(item)"
-                     :name="item.value">
-        </el-tab-pane>
+    <div class="avue-tags" v-if="showTag">
+        <!-- tag盒子 -->
+        <div v-if="contextmenuFlag" class="avue-tags__contentmenu"
+            :style="{ left: contentmenuX + 'px', top: contentmenuY + 'px' }">
+            <div class="item" @click="clearCacheTags">{{ $t('tagsView.clearCache') }}
+            </div>
+            <div class="item" @click="closeOthersTags">{{ $t('tagsView.closeOthers') }}
+            </div>
+            <div class="item" @click="closeAllTags">{{ $t('tagsView.closeAll') }}
+            </div>
+        </div>
+        <div class="avue-tags__box" :class="{ 'avue-tags__box--close': !website.isFirstPage }">
+            <el-tabs v-model="active" type="card" @contextmenu.native="handleContextmenu" :closable="tagLen !== 1"
+                @tab-click="openTag" @edit="menuTag">
+                <el-tab-pane :key="item.value" v-for="item in tagList" :label="generateTitle(item)" :name="item.value">
+                </el-tab-pane>
 
-      </el-tabs>
-      <el-dropdown class="avue-tags__menu">
-        <el-button type="primary"
-                   size="mini">
-          {{$t('tagsView.menu')}}
-          <i class="el-icon-arrow-down el-icon--right"></i>
-        </el-button>
-        <el-dropdown-menu slot="dropdown">
-          <el-dropdown-item @click.native="$parent.isSearch=true">{{$t('tagsView.search')}}</el-dropdown-item>
-          <el-dropdown-item @click.native="closeOthersTags">{{$t('tagsView.closeOthers')}}</el-dropdown-item>
-          <el-dropdown-item @click.native="closeAllTags">{{$t('tagsView.closeAll')}}</el-dropdown-item>
-          <el-dropdown-item @click.native="clearCacheTags">{{$t('tagsView.clearCache')}}</el-dropdown-item>
-        </el-dropdown-menu>
-      </el-dropdown>
+            </el-tabs>
+            <el-dropdown class="avue-tags__menu">
+                <el-button type="primary" size="mini">
+                    {{ $t('tagsView.menu') }}
+                    <i class="el-icon-arrow-down el-icon--right"></i>
+                </el-button>
+                <el-dropdown-menu slot="dropdown">
+                    <el-dropdown-item @click.native="$parent.isSearch = true">{{ $t('tagsView.search') }}</el-dropdown-item>
+                    <el-dropdown-item @click.native="closeOthersTags">{{ $t('tagsView.closeOthers') }}</el-dropdown-item>
+                    <el-dropdown-item @click.native="closeAllTags">{{ $t('tagsView.closeAll') }}</el-dropdown-item>
+                    <el-dropdown-item @click.native="clearCacheTags">{{ $t('tagsView.clearCache') }}</el-dropdown-item>
+                </el-dropdown-menu>
+            </el-dropdown>
+        </div>
     </div>
-
-  </div>
 </template>
 <script>
-  import {mapGetters, mapState} from "vuex";
-  import {clearCache} from "@/api/user";
+import { mapGetters, mapState } from "vuex"
+import { clearCache } from "@/api/user"
 
-  export default {
+export default {
     name: "tags",
-    data() {
-      return {
-        active: "",
-        contentmenuX: "",
-        contentmenuY: "",
-        contextmenuFlag: false
-      };
+    data () {
+        return {
+            active: "",
+            contentmenuX: "",
+            contentmenuY: "",
+            contextmenuFlag: false
+        }
     },
-    created() {
+    created () {
     },
-    mounted() {
-      this.setActive();
+    mounted () {
+        this.setActive()
     },
     watch: {
-      tag() {
-        this.setActive();
-      },
-      contextmenuFlag() {
-        window.addEventListener("mousedown", this.watchContextmenu);
-      }
+        tag () {
+            this.setActive()
+        },
+        contextmenuFlag () {
+            window.addEventListener("mousedown", this.watchContextmenu)
+        }
     },
     computed: {
-      ...mapGetters(["tagWel", "tagList", "tag", "website"]),
-      ...mapState({
-        showTag: state => state.common.showTag
-      }),
-      tagLen() {
-        return this.tagList.length || 0;
-      }
+        ...mapGetters(["tagWel", "tagList", "tag", "website", "homeFirstPage"]),
+        ...mapState({
+            showTag: state => state.common.showTag
+        }),
+        tagLen () {
+            return this.tagList.length || 0
+        }
     },
     methods: {
-      generateTitle(item) {
-        return this.$router.$avueRouter.generateTitle(
-          item.label,
-          (item.meta || {}).i18n
-        );
-      },
-      watchContextmenu(event) {
-        if (!this.$el.contains(event.target) || event.button !== 0) {
-          this.contextmenuFlag = false;
+        generateTitle (item) {
+            return this.$router.$avueRouter.generateTitle(
+                item.label,
+                (item.meta || {}).i18n
+            )
+        },
+        watchContextmenu (event) {
+            if (!this.$el.contains(event.target) || event.button !== 0) {
+                this.contextmenuFlag = false
+            }
+            window.removeEventListener("mousedown", this.watchContextmenu)
+        },
+        handleContextmenu (event) {
+            let target = event.target
+            // 解决 https://github.com/d2-projects/d2-admin/issues/54
+            let flag = false
+            if (target.className.indexOf("el-tabs__item") > -1) flag = true
+            else if (target.parentNode.className.indexOf("el-tabs__item") > -1) {
+                target = target.parentNode
+                flag = true
+            }
+            if (flag) {
+                event.preventDefault()
+                event.stopPropagation()
+                this.contentmenuX = event.clientX
+                this.contentmenuY = event.clientY
+                this.tagName = target.getAttribute("aria-controls").slice(5)
+                this.contextmenuFlag = true
+            }
+        },
+        //激活当前选项
+        setActive () {
+            this.active = this.tag.value
+        },
+        menuTag (value, action) {
+            if (action === "remove") {
+                let { tag, key } = this.findTag(value)
+                this.$store.commit("DEL_TAG", tag)
+                if (tag.value === this.tag.value) {
+                    tag = this.tagList[key === 0 ? key : key - 1] //如果关闭本标签让前推一个
+                    this.openTag(tag)
+                }
+            }
+        },
+        openTag (item) {
+            let tag
+            if (item.name) {
+                tag = this.findTag(item.name).tag
+            } else {
+                tag = item
+            }
+            this.$router.push({
+                path: this.$router.$avueRouter.getPath({
+                    name: tag.label,
+                    src: tag.value
+                }, tag.meta),
+                query: tag.query
+            })
+        },
+        closeOthersTags () {
+            this.contextmenuFlag = false
+            this.$store.commit("DEL_TAG_OTHER")
+        },
+        findTag (value) {
+            let tag, key
+            this.tagList.map((item, index) => {
+                if (item.value === value) {
+                    tag = item
+                    key = index
+                }
+            })
+            return { tag: tag, key: key }
+        },
+        closeAllTags () {
+            this.contextmenuFlag = false
+            this.$store.commit("DEL_ALL_TAG")
+            this.$router.push({ path: this.homeFirstPage })
+        },
+        clearCacheTags () {
+            this.$confirm("是否需要清除缓存?", {
+                confirmButtonText: "确定",
+                cancelButtonText: "取消",
+                type: "warning"
+            }).then(() => {
+                clearCache().then(() => {
+                    this.contextmenuFlag = false
+                    this.$message.success('清除完毕')
+                })
+            })
         }
-        window.removeEventListener("mousedown", this.watchContextmenu);
-      },
-      handleContextmenu(event) {
-        let target = event.target;
-        // 解决 https://github.com/d2-projects/d2-admin/issues/54
-        let flag = false;
-        if (target.className.indexOf("el-tabs__item") > -1) flag = true;
-        else if (target.parentNode.className.indexOf("el-tabs__item") > -1) {
-          target = target.parentNode;
-          flag = true;
-        }
-        if (flag) {
-          event.preventDefault();
-          event.stopPropagation();
-          this.contentmenuX = event.clientX;
-          this.contentmenuY = event.clientY;
-          this.tagName = target.getAttribute("aria-controls").slice(5);
-          this.contextmenuFlag = true;
-        }
-      },
-      //激活当前选项
-      setActive() {
-        this.active = this.tag.value;
-      },
-      menuTag(value, action) {
-        if (action === "remove") {
-          let {tag, key} = this.findTag(value);
-          this.$store.commit("DEL_TAG", tag);
-          if (tag.value === this.tag.value) {
-            tag = this.tagList[key === 0 ? key : key - 1]; //如果关闭本标签让前推一个
-            this.openTag(tag);
-          }
-        }
-      },
-      openTag(item) {
-        let tag;
-        if (item.name) {
-          tag = this.findTag(item.name).tag;
-        } else {
-          tag = item;
-        }
-        this.$router.push({
-          path: this.$router.$avueRouter.getPath({
-            name: tag.label,
-            src: tag.value
-          }, tag.meta),
-          query: tag.query
-        });
-      },
-      closeOthersTags() {
-        this.contextmenuFlag = false;
-        this.$store.commit("DEL_TAG_OTHER");
-      },
-      findTag(value) {
-        let tag, key;
-        this.tagList.map((item, index) => {
-          if (item.value === value) {
-            tag = item;
-            key = index;
-          }
-        });
-        return {tag: tag, key: key};
-      },
-      closeAllTags() {
-        this.contextmenuFlag = false;
-        this.$store.commit("DEL_ALL_TAG");
-        this.$router.push({
-          path: this.$router.$avueRouter.getPath({
-            src: this.tagWel.value
-          }),
-          query: this.tagWel.query
-        });
-      },
-      clearCacheTags() {
-        this.$confirm("是否需要清除缓存?", {
-          confirmButtonText: "确定",
-          cancelButtonText: "取消",
-          type: "warning"
-        }).then(() => {
-          clearCache().then(() => {
-            this.contextmenuFlag = false;
-            this.$message.success('清除完毕');
-          })
-        });
-      }
     }
-  };
+}
 </script>
 
 
diff --git a/src/page/index/top/index.vue b/src/page/index/top/index.vue
index ad8822f..954cb78 100644
--- a/src/page/index/top/index.vue
+++ b/src/page/index/top/index.vue
@@ -170,7 +170,9 @@
                         }],
                     },
                 ]
-            }
+            },
+            showMenu: getStore({ name: "showMenu" }),
+            globalUserInfo: getStore({ name: "userInfo" }),
         }
     },
     filters: {},
@@ -188,7 +190,6 @@
             showFullScren: state => state.common.showFullScren,
             showCollapse: state => state.common.showCollapse,
             showSearch: state => state.common.showSearch,
-            showMenu: state => state.common.showMenu,
             showColor: state => state.common.showColor
         }),
         ...mapGetters([
diff --git a/src/page/login/userlogin.vue b/src/page/login/userlogin.vue
index 57f8a2d..4601aed 100644
--- a/src/page/login/userlogin.vue
+++ b/src/page/login/userlogin.vue
@@ -53,6 +53,7 @@
 </template>
 
 <script>
+import Layout from "@/page/index/"
 import { mapGetters } from "vuex"
 import { info } from "@/api/system/tenant"
 // import {getCaptcha} from "@/api/user";
@@ -176,15 +177,15 @@
     },
     props: [],
     methods: {
-        refreshCode () {
-            if (this.website.captchaMode) {
-                getCaptcha().then(res => {
-                    const data = res.data
-                    this.loginForm.key = data.key
-                    this.loginForm.image = data.image
-                })
-            }
-        },
+        // refreshCode () {
+        //     if (this.website.captchaMode) {
+        //         getCaptcha().then(res => {
+        //             const data = res.data
+        //             this.loginForm.key = data.key
+        //             this.loginForm.image = data.image
+        //         })
+        //     }
+        // },
         showPassword () {
             this.passwordType === ""
                 ? (this.passwordType = "password")
@@ -208,7 +209,7 @@
                         text: '登录中,请稍后。。。',
                         spinner: "el-icon-loading"
                     })
-                    this.$store.dispatch("LoginByUsername", this.loginForm).then(() => {
+                    this.$store.dispatch("LoginByUsername", this.loginForm).then((res) => {
                         if (this.website.switchMode) {
                             const deptId = this.userInfo.dept_id
                             const roleId = this.userInfo.role_id
@@ -222,15 +223,24 @@
                                 return false
                             }
                         }
-                        this.$router.push({ path: this.tagWel.value })
+
+                        if (JSON.stringify(res) == '{}') {
+                            this.$router.push({ path: this.tagWel.value })
+                        } else {
+                            this.$router.$avueRouter.formatRoutes(res.menuData, true)
+
+                            this.$router.push({ path: res.fistMenu.path })
+                        }
+
                         loading.close()
                     }).catch(() => {
                         loading.close()
-                        this.refreshCode()
+                        // this.refreshCode()
                     })
                 }
             })
         },
+
         getTenant () {
             let domain = getTopUrl()
             // 临时指定域名,方便测试
diff --git a/src/permission.js b/src/permission.js
index 2f88c34..172e2b3 100644
--- a/src/permission.js
+++ b/src/permission.js
@@ -1,66 +1,89 @@
+/*
+ * @Author: shuishen 1109946754@qq.com
+ * @Date: 2023-12-14 17:10:00
+ * @LastEditors: shuishen 1109946754@qq.com
+ * @LastEditTime: 2024-01-22 13:30:53
+ * @FilePath: \jczz_web\src\permission.js
+ * @Description:
+ *
+ * Copyright (c) 2024 by shuishen, All Rights Reserved.
+ */
 /**
  * 全站权限配置
  *
  */
-import router from './router/router'
-import store from './store'
-import {validatenull} from '@/util/validate'
-import {getToken} from '@/util/auth'
-import NProgress from 'nprogress' // progress bar
-import 'nprogress/nprogress.css' // progress bar style
-NProgress.configure({showSpinner: false});
+import router from "./router/router";
+import store from "./store";
+import { validatenull } from "@/util/validate";
+import { getToken } from "@/util/auth";
+import NProgress from "nprogress"; // progress bar
+import "nprogress/nprogress.css"; // progress bar style
+import { getStore } from "@/util/store";
+
+NProgress.configure({ showSpinner: false });
 const lockPage = store.getters.website.lockPage; //锁屏页
 router.beforeEach((to, from, next) => {
   const meta = to.meta || {};
   const isMenu = meta.menu === undefined ? to.query.menu : meta.menu;
-  store.commit('SET_IS_MENU', isMenu === undefined);
+  store.commit("SET_IS_MENU", isMenu === undefined);
+
   if (getToken()) {
-    if (store.getters.isLock && to.path !== lockPage) { //如果系统激活锁屏,全部跳转到锁屏页
-      next({path: lockPage})
-    } else if (to.path === '/login') { //如果登录成功访问登录页跳转到主页
-      next({path: '/'})
+    if (store.getters.isLock && to.path !== lockPage) {
+      //如果系统激活锁屏,全部跳转到锁屏页
+      next({ path: lockPage });
+    } else if (to.path === "/login") {
+      //如果登录成功访问登录页跳转到主页
+      next({ path: "/" });
     } else {
       //如果用户信息为空则获取用户信息,获取用户信息失败,跳转到登录页
       if (store.getters.token.length === 0) {
-        store.dispatch('FedLogOut').then(() => {
-          next({path: '/login'})
-        })
+        store.dispatch("FedLogOut").then(() => {
+          next({ path: "/login" });
+        });
       } else {
         const value = to.query.src || to.fullPath;
         const label = to.query.name || to.name;
         const meta = to.meta || router.$avueRouter.meta || {};
         const i18n = to.query.i18n;
         if (to.query.target) {
-          window.open(value)
-        } else if (meta.isTab !== false && !validatenull(value) && !validatenull(label)) {
-          store.commit('ADD_TAG', {
+          window.open(value);
+        } else if (
+          meta.isTab !== false &&
+          !validatenull(value) &&
+          !validatenull(label)
+        ) {
+          store.commit("ADD_TAG", {
             label: label,
             value: value,
             params: to.params,
             query: to.query,
             meta: (() => {
               if (!i18n) {
-                return meta
+                return meta;
               }
               return {
-                i18n: i18n
-              }
+                i18n: i18n,
+              };
             })(),
-            group: router.$avueRouter.group || []
+            group: router.$avueRouter.group || [],
           });
         }
-        next()
+        if (to.path === "/welindex") {
+          next(store.getters.homeFirstPage);
+          return;
+        }
+        next();
       }
     }
   } else {
     //判断是否需要认证,没有登录访问去登录页
     if (meta.isAuth === false) {
-      next()
+      next();
     } else {
-      next('/login')
+      next("/login");
     }
   }
-})
+});
 
 router.afterEach(() => {
   NProgress.done();
diff --git a/src/router/page/index.js b/src/router/page/index.js
index 3fd53b8..e1496b1 100644
--- a/src/router/page/index.js
+++ b/src/router/page/index.js
@@ -2,7 +2,7 @@
  * @Author: shuishen 1109946754@qq.com
  * @Date: 2023-12-14 17:10:00
  * @LastEditors: shuishen 1109946754@qq.com
- * @LastEditTime: 2024-01-19 11:40:51
+ * @LastEditTime: 2024-01-22 12:40:01
  * @FilePath: \jczz_web\src\router\page\index.js
  * @Description:
  *
@@ -79,8 +79,13 @@
   {
     path: "/",
     name: "主页",
-    redirect: "/wel",
+    redirect: "/welindex",
   },
+
+  {
+    path: "/welindex",
+  },
+
   {
     path: "/myiframe",
     component: Layout,
diff --git a/src/router/router.js b/src/router/router.js
index 017af95..0637491 100644
--- a/src/router/router.js
+++ b/src/router/router.js
@@ -6,19 +6,20 @@
  * isTab是否加入到tag导航
  * isAuth是否需要授权
  */
-import Vue from 'vue';
-import VueRouter from 'vue-router';
-import PageRouter from './page/' // 页面路由
-import ViewsRouter from './views/' // 页面路由
-import AvueRouter from './avue-router'; //封装的路由控制方法
-import i18n from '@/lang' // Internationalization 国际化 多语言
-import Store from '../store/'; // vuex
-Vue.use(VueRouter)
+import Vue from "vue";
+import VueRouter from "vue-router";
+import PageRouter from "./page/"; // 页面路由
+import ViewsRouter from "./views/"; // 页面路由
+import AvueRouter from "./avue-router"; //封装的路由控制方法
+import i18n from "@/lang"; // Internationalization 国际化 多语言
+import Store from "../store/"; // vuex
+Vue.use(VueRouter);
 //创建路由
-export const createRouter = () => new VueRouter({
-  routes: [...PageRouter, ...ViewsRouter]
-})
-const Router = createRouter() // 获得 route 实例
+export const createRouter = () =>
+  new VueRouter({
+    routes: [...PageRouter, ...ViewsRouter],
+  });
+const Router = createRouter(); // 获得 route 实例
 // 初始化和注册 AvueRouter
 AvueRouter.install(Vue, {
   router: Router,
@@ -28,9 +29,10 @@
 });
 Router.$avueRouter.formatRoutes(Store.state.user.menuAll, true); // 动态路由核心方法
 Router.addRoutes([...PageRouter, ...ViewsRouter]);
-export function resetRouter () {  // 重置路由 比如用于身份验证失败,需要重新登录时 先清空当前的路有权限
-  const newRouter = createRouter()
-  Router.matcher = newRouter.matcher // reset router
+export function resetRouter() {
+  // 重置路由 比如用于身份验证失败,需要重新登录时 先清空当前的路有权限
+  const newRouter = createRouter();
+  Router.matcher = newRouter.matcher; // reset router
   AvueRouter.install(Vue, {
     router: Router,
     store: Store,
@@ -38,4 +40,4 @@
     keepAlive: false,
   });
 }
-export default Router
+export default Router;
diff --git a/src/router/views/index.js b/src/router/views/index.js
index 231a4c5..9937f59 100644
--- a/src/router/views/index.js
+++ b/src/router/views/index.js
@@ -1,143 +1,189 @@
-import Layout from '@/page/index/'
+import Layout from "@/page/index/";
 
-export default [{
-  path: '/wel',
-  component: Layout,
-  redirect: '/wel/index',
-  children: [{
-    path: 'index',
-    name: '首页',
-    meta: {
-      i18n: 'dashboard'
-    },
-    component: () =>
-      import( /* webpackChunkName: "views" */ '@/views/wel/index')
-  }, {
-    path: 'dashboard',
-    name: '控制台',
-    meta: {
-      i18n: 'dashboard',
-      menu: false,
-    },
-    component: () =>
-      import( /* webpackChunkName: "views" */ '@/views/wel/dashboard')
-  }]
-}, {
-  path: '/test',
-  component: Layout,
-  redirect: '/test/index',
-  children: [{
-    path: 'index',
-    name: '测试页',
-    meta: {
-      i18n: 'test'
-    },
-    component: () =>
-      import( /* webpackChunkName: "views" */ '@/views/util/test')
-  }]
-}, {
-  path: '/dict-horizontal',
-  component: Layout,
-  redirect: '/dict-horizontal/index',
-  children: [{
-    path: 'index',
-    name: '字典管理',
-    meta: {
-      i18n: 'dict'
-    },
-    component: () =>
-      import( /* webpackChunkName: "views" */ '@/views/util/demo/dict-horizontal')
-  }]
-}, {
-  path: '/dict-vertical',
-  component: Layout,
-  redirect: '/dict-vertical/index',
-  children: [{
-    path: 'index',
-    name: '字典管理',
-    meta: {
-      i18n: 'dict'
-    },
-    component: () =>
-      import( /* webpackChunkName: "views" */ '@/views/util/demo/dict-vertical')
-  }]
-}, {
-  path: '/info',
-  component: Layout,
-  redirect: '/info/index',
-  children: [{
-    path: 'index',
-    name: '个人信息',
-    meta: {
-      i18n: 'info'
-    },
-    component: () =>
-      import( /* webpackChunkName: "views" */ '@/views/system/userinfo')
-  }]
-}, {
-  path: '/work/process/leave',
-  component: Layout,
-  redirect: '/work/process/leave/form',
-  children: [{
-    path: 'form/:processDefinitionId',
-    name: '请假流程',
-    meta: {
-      i18n: 'work'
-    },
-    component: () =>
-      import( /* webpackChunkName: "views" */ '@/views/work/process/leave/form')
-  }, {
-    path: 'handle/:taskId/:processInstanceId/:businessId',
-    name: '处理请假流程',
-    meta: {
-      i18n: 'work'
-    },
-    component: () =>
-      import( /* webpackChunkName: "views" */ '@/views/work/process/leave/handle')
-  }, {
-    path: 'detail/:processInstanceId/:businessId',
-    name: '请假流程详情',
-    meta: {
-      i18n: 'work'
-    },
-    component: () =>
-      import( /* webpackChunkName: "views" */ '@/views/work/process/leave/detail')
-  }]
-}, {
-  path: '/work/process/maintenanceFundApply',
-  component: Layout,
-  redirect: '/work/process/maintenanceFundApply/form',
-  children: [{
-    path: 'form/:processDefinitionId',
-    name: '维修基金申请',
-    meta: {
-      i18n: 'work'
-    },
-    component: () =>
-      import( /* webpackChunkName: "views" */ '@/views/work/process/maintenanceFundApply/form')
-  }, {
-    path: 'handle/:taskId/:processInstanceId/:businessId',
-    name: '处理维修基金申请',
-    meta: {
-      i18n: 'work'
-    },
-    component: () =>
-      import( /* webpackChunkName: "views" */ '@/views/work/process/maintenanceFundApply/handle')
-  }, {
-    path: 'detail/:processInstanceId/:businessId',
-    name: '维修基金申请详情',
-    meta: {
-      i18n: 'work'
-    },
-    component: () =>
-      import( /* webpackChunkName: "views" */ '@/views/work/process/maintenanceFundApply/detail')
-  }, {
-    path: 'edit/:taskId/:processInstanceId/:businessId',
-    name: '调整维修基金申请',
-    meta: {
-      i18n: 'work'
-    },
-    component: () =>
-      import( /* webpackChunkName: "views" */ '@/views/work/process/maintenanceFundApply/edit')
-  }]
-}]
\ No newline at end of file
+export default [
+  {
+    path: "/wel",
+    component: Layout,
+    redirect: "/wel/index",
+    children: [
+      {
+        path: "index",
+        name: "首页",
+        meta: {
+          i18n: "dashboard",
+        },
+        component: () =>
+          import(/* webpackChunkName: "views" */ "@/views/wel/index"),
+      },
+      {
+        path: "dashboard",
+        name: "控制台",
+        meta: {
+          i18n: "dashboard",
+          menu: false,
+        },
+        component: () =>
+          import(/* webpackChunkName: "views" */ "@/views/wel/dashboard"),
+      },
+    ],
+  },
+  {
+    path: "/test",
+    component: Layout,
+    redirect: "/test/index",
+    children: [
+      {
+        path: "index",
+        name: "测试页",
+        meta: {
+          i18n: "test",
+        },
+        component: () =>
+          import(/* webpackChunkName: "views" */ "@/views/util/test"),
+      },
+    ],
+  },
+  {
+    path: "/dict-horizontal",
+    component: Layout,
+    redirect: "/dict-horizontal/index",
+    children: [
+      {
+        path: "index",
+        name: "字典管理",
+        meta: {
+          i18n: "dict",
+        },
+        component: () =>
+          import(
+            /* webpackChunkName: "views" */ "@/views/util/demo/dict-horizontal"
+          ),
+      },
+    ],
+  },
+  {
+    path: "/dict-vertical",
+    component: Layout,
+    redirect: "/dict-vertical/index",
+    children: [
+      {
+        path: "index",
+        name: "字典管理",
+        meta: {
+          i18n: "dict",
+        },
+        component: () =>
+          import(
+            /* webpackChunkName: "views" */ "@/views/util/demo/dict-vertical"
+          ),
+      },
+    ],
+  },
+  {
+    path: "/info",
+    component: Layout,
+    redirect: "/info/index",
+    children: [
+      {
+        path: "index",
+        name: "个人信息",
+        meta: {
+          i18n: "info",
+        },
+        component: () =>
+          import(/* webpackChunkName: "views" */ "@/views/system/userinfo"),
+      },
+    ],
+  },
+  {
+    path: "/work/process/leave",
+    component: Layout,
+    redirect: "/work/process/leave/form",
+    children: [
+      {
+        path: "form/:processDefinitionId",
+        name: "请假流程",
+        meta: {
+          i18n: "work",
+        },
+        component: () =>
+          import(
+            /* webpackChunkName: "views" */ "@/views/work/process/leave/form"
+          ),
+      },
+      {
+        path: "handle/:taskId/:processInstanceId/:businessId",
+        name: "处理请假流程",
+        meta: {
+          i18n: "work",
+        },
+        component: () =>
+          import(
+            /* webpackChunkName: "views" */ "@/views/work/process/leave/handle"
+          ),
+      },
+      {
+        path: "detail/:processInstanceId/:businessId",
+        name: "请假流程详情",
+        meta: {
+          i18n: "work",
+        },
+        component: () =>
+          import(
+            /* webpackChunkName: "views" */ "@/views/work/process/leave/detail"
+          ),
+      },
+    ],
+  },
+  {
+    path: "/work/process/maintenanceFundApply",
+    component: Layout,
+    redirect: "/work/process/maintenanceFundApply/form",
+    children: [
+      {
+        path: "form/:processDefinitionId",
+        name: "维修基金申请",
+        meta: {
+          i18n: "work",
+        },
+        component: () =>
+          import(
+            /* webpackChunkName: "views" */ "@/views/work/process/maintenanceFundApply/form"
+          ),
+      },
+      {
+        path: "handle/:taskId/:processInstanceId/:businessId",
+        name: "处理维修基金申请",
+        meta: {
+          i18n: "work",
+        },
+        component: () =>
+          import(
+            /* webpackChunkName: "views" */ "@/views/work/process/maintenanceFundApply/handle"
+          ),
+      },
+      {
+        path: "detail/:processInstanceId/:businessId",
+        name: "维修基金申请详情",
+        meta: {
+          i18n: "work",
+        },
+        component: () =>
+          import(
+            /* webpackChunkName: "views" */ "@/views/work/process/maintenanceFundApply/detail"
+          ),
+      },
+      {
+        path: "edit/:taskId/:processInstanceId/:businessId",
+        name: "调整维修基金申请",
+        meta: {
+          i18n: "work",
+        },
+        component: () =>
+          import(
+            /* webpackChunkName: "views" */ "@/views/work/process/maintenanceFundApply/edit"
+          ),
+      },
+    ],
+  },
+];
diff --git a/src/store/getters.js b/src/store/getters.js
index 90fb411..5af1c6f 100644
--- a/src/store/getters.js
+++ b/src/store/getters.js
@@ -2,7 +2,7 @@
  * @Author: shuishen 1109946754@qq.com
  * @Date: 2023-12-14 17:10:00
  * @LastEditors: shuishen 1109946754@qq.com
- * @LastEditTime: 2024-01-19 15:58:57
+ * @LastEditTime: 2024-01-22 13:12:40
  * @FilePath: \jczz_web\src\store\getters.js
  * @Description:
  *
@@ -28,6 +28,8 @@
   tagWel: (state) => state.tags.tagWel,
   token: (state) => state.user.token,
   roles: (state) => state.user.roles,
+  homeFirstPage: (state) => state.user.homeFirstPage,
+  
   permission: (state) => state.user.permission,
   menu: (state) => state.user.menu,
   menuId: (state) => state.user.menuId,
diff --git a/src/store/modules/common.js b/src/store/modules/common.js
index b0840a7..a0e0295 100644
--- a/src/store/modules/common.js
+++ b/src/store/modules/common.js
@@ -2,7 +2,7 @@
  * @Author: shuishen 1109946754@qq.com
  * @Date: 2023-12-14 17:10:00
  * @LastEditors: shuishen 1109946754@qq.com
- * @LastEditTime: 2024-01-19 16:43:29
+ * @LastEditTime: 2024-01-22 11:00:49
  * @FilePath: \jczz_web\src\store\modules\common.js
  * @Description:
  *
@@ -27,7 +27,6 @@
     showLock: true,
     showFullScren: true,
     showTheme: true,
-    showMenu: true,
     showColor: true,
     colorName: getStore({ name: "colorName" }) || "#409EFF",
     themeName: "theme-white",
diff --git a/src/store/modules/tags.js b/src/store/modules/tags.js
index 5e0cb94..e904ae2 100644
--- a/src/store/modules/tags.js
+++ b/src/store/modules/tags.js
@@ -1,76 +1,81 @@
-import {setStore, getStore} from '@/util/store'
-import {diff} from '@/util/util'
-import website from '@/config/website'
+import { setStore, getStore } from "@/util/store";
+import { diff } from "@/util/util";
+import website from "@/config/website";
+import { Alert } from "element-ui";
+
+import user from "./user";
 
 const isFirstPage = website.isFirstPage;
 const tagWel = website.fistPage;
 const tagObj = {
-  label: '', //标题名称
-  value: '', //标题的路径
-  params: '', //标题的路径参数
-  query: '', //标题的参数
-  meta: {},//额外参数
+  label: "", //标题名称
+  value: "", //标题的路径
+  params: "", //标题的路径参数
+  query: "", //标题的参数
+  meta: {}, //额外参数
   group: [], //分组
-}
+};
 
 //处理首个标签
 function setFistTag(list) {
   if (list.length === 1) {
     list[0].close = false;
   } else {
-    list.forEach(ele => {
+    list.forEach((ele) => {
       if (ele.value === tagWel.value && isFirstPage === false) {
-        ele.close = false
+        ele.close = false;
       } else {
-        ele.close = true
+        ele.close = true;
       }
-    })
+    });
   }
 }
 
-
 const navs = {
   state: {
-    tagList: getStore({name: 'tagList'}) || [],
-    tag: getStore({name: 'tag'}) || tagObj,
-    tagWel: tagWel
+    tagList: getStore({ name: "tagList" }) || [],
+    tag: getStore({ name: "tag" }) || tagObj,
+    tagWel: tagWel,
   },
   actions: {},
   mutations: {
     ADD_TAG: (state, action) => {
       state.tag = action;
-      setStore({name: 'tag', content: state.tag})
-      if (state.tagList.some(ele => diff(ele, action))) return
-      state.tagList.push(action)
+      setStore({ name: "tag", content: state.tag });
+      if (state.tagList.some((ele) => diff(ele, action))) return;
+      state.tagList.push(action);
       setFistTag(state.tagList);
-      setStore({name: 'tagList', content: state.tagList})
+      setStore({ name: "tagList", content: state.tagList });
     },
     DEL_TAG: (state, action) => {
-      state.tagList = state.tagList.filter(item => {
+      state.tagList = state.tagList.filter((item) => {
         return !diff(item, action);
-      })
+      });
       setFistTag(state.tagList);
-      setStore({name: 'tagList', content: state.tagList})
+      setStore({ name: "tagList", content: state.tagList });
     },
     DEL_ALL_TAG: (state) => {
-      state.tagList = [state.tagWel];
-      setStore({name: 'tagList', content: state.tagList})
+      state.tagList = [user.state.homeFirstTagPage];
+      setStore({ name: "tagList", content: state.tagList });
     },
     DEL_TAG_OTHER: (state) => {
-      state.tagList = state.tagList.filter(item => {
+      state.tagList = state.tagList.filter((item) => {
         if (item.value === state.tag.value) {
           return true;
-        } else if (!website.isFirstPage && item.value === website.fistPage.value) {
+        } else if (
+          !website.isFirstPage &&
+          item.value === user.state.homeFirstTagPage.value
+        ) {
           return true;
         }
-      })
+      });
       setFistTag(state.tagList);
-      setStore({name: 'tagList', content: state.tagList})
+      setStore({ name: "tagList", content: state.tagList });
     },
     SET_TAG_LIST(state, tagList) {
       state.tagList = tagList;
-      setStore({name: 'tagList', content: state.tagList})
-    }
-  }
-}
-export default navs
+      setStore({ name: "tagList", content: state.tagList });
+    },
+  },
+};
+export default navs;
diff --git a/src/store/modules/user.js b/src/store/modules/user.js
index f92f525..b71edea 100644
--- a/src/store/modules/user.js
+++ b/src/store/modules/user.js
@@ -1,272 +1,376 @@
-import {setToken, setRefreshToken, removeToken, removeRefreshToken} from '@/util/auth'
-import {Message} from 'element-ui'
-import {setStore, getStore} from '@/util/store'
-import {isURL, validatenull} from '@/util/validate'
-import {deepClone} from '@/util/util'
-import website from '@/config/website'
-import {loginByUsername, loginBySocial, loginBySso, getUserInfo, logout, refreshToken, getButtons} from '@/api/user'
-import {getTopMenu, getRoutes} from '@/api/system/menu'
-import md5 from 'js-md5'
+import {
+  setToken,
+  setRefreshToken,
+  removeToken,
+  removeRefreshToken,
+} from "@/util/auth";
+import { Alert, Message } from "element-ui";
+import { setStore, getStore } from "@/util/store";
+import { isURL, validatenull } from "@/util/validate";
+import { deepClone } from "@/util/util";
+import website from "@/config/website";
+import {
+  loginByUsername,
+  loginBySocial,
+  loginBySso,
+  getUserInfo,
+  logout,
+  refreshToken,
+  getButtons,
+} from "@/api/user";
+import { getTopMenu, getRoutes } from "@/api/system/menu";
+import md5 from "js-md5";
 
+function findChildrenUrl(data) {
+  if ("children" in data[0] && data[0].children.length > 0) {
+    return findChildrenUrl(data[0].children);
+  } else {
+    return data[0];
+  }
+}
 
 function addPath(ele, first) {
   const menu = website.menu;
   const propsConfig = menu.props;
   const propsDefault = {
-    label: propsConfig.label || 'name',
-    path: propsConfig.path || 'path',
-    icon: propsConfig.icon || 'icon',
-    children: propsConfig.children || 'children'
-  }
+    label: propsConfig.label || "name",
+    path: propsConfig.path || "path",
+    icon: propsConfig.icon || "icon",
+    children: propsConfig.children || "children",
+  };
   const icon = ele[propsDefault.icon];
   ele[propsDefault.icon] = validatenull(icon) ? menu.iconDefault : icon;
-  const isChild = ele[propsDefault.children] && ele[propsDefault.children].length !== 0;
+  const isChild =
+    ele[propsDefault.children] && ele[propsDefault.children].length !== 0;
   if (!isChild) ele[propsDefault.children] = [];
   if (!isChild && first && !isURL(ele[propsDefault.path])) {
-    ele[propsDefault.path] = ele[propsDefault.path] + '/index'
+    ele[propsDefault.path] = ele[propsDefault.path] + "/index";
   } else {
-    ele[propsDefault.children].forEach(child => {
+    ele[propsDefault.children].forEach((child) => {
       addPath(child);
-    })
+    });
   }
-
 }
 
 const user = {
   state: {
-    tenantId: getStore({name: 'tenantId'}) || '',
-    userInfo: getStore({name: 'userInfo'}) || [],
-    permission: getStore({name: 'permission'}) || {},
+    tenantId: getStore({ name: "tenantId" }) || "",
+    userInfo: getStore({ name: "userInfo" }) || [],
+    permission: getStore({ name: "permission" }) || {},
     roles: [],
     menuId: {},
-    menu: getStore({name: 'menu'}) || [],
-    menuAll: getStore({name: 'menuAll'}) || [],
-    token: getStore({name: 'token'}) || '',
-    refreshToken: getStore({name: 'refreshToken'}) || '',
+    menu: getStore({ name: "menu" }) || [],
+    menuAll: getStore({ name: "menuAll" }) || [],
+    token: getStore({ name: "token" }) || "",
+    refreshToken: getStore({ name: "refreshToken" }) || "",
+    homeFirstPage: getStore({ name: "firstPage" }) || "",
+    homeFirstTagPage: getStore({ name: "firstTagPage" }) || {},
   },
   actions: {
     //根据用户名登录
-    LoginByUsername({commit}, userInfo) {
+    LoginByUsername({ dispatch, commit }, userInfo) {
       return new Promise((resolve, reject) => {
-        loginByUsername(userInfo.tenantId, userInfo.deptId, userInfo.roleId, userInfo.username, md5(userInfo.password), userInfo.type, userInfo.key, userInfo.code).then(res => {
-          const data = res.data;
-          if (data.error_description) {
-            Message({
-              message: data.error_description,
-              type: 'error'
-            })
-          } else {
-            commit('SET_TOKEN', data.access_token);
-            commit('SET_REFRESH_TOKEN', data.refresh_token);
-            commit('SET_TENANT_ID', data.tenant_id);
-            commit('SET_USER_INFO', data);
-            commit('DEL_ALL_TAG');
-            commit('CLEAR_LOCK');
-          }
-          resolve();
-        }).catch(error => {
-          reject(error);
-        })
-      })
+        loginByUsername(
+          userInfo.tenantId,
+          userInfo.deptId,
+          userInfo.roleId,
+          userInfo.username,
+          md5(userInfo.password),
+          userInfo.type,
+          userInfo.key,
+          userInfo.code
+        )
+          .then((res) => {
+            const data = res.data;
+            if (data.error_description) {
+              Message({
+                message: data.error_description,
+                type: "error",
+              });
+            } else {
+              commit("SET_TOKEN", data.access_token);
+              commit("SET_REFRESH_TOKEN", data.refresh_token);
+              commit("SET_TENANT_ID", data.tenant_id);
+              commit("SET_USER_INFO", data);
+              commit("CLEAR_LOCK");
+              commit("CLEAR_LOCK");
+
+              dispatch("GetMenu").then((menuData) => {
+                let fistMenu = findChildrenUrl(menuData);
+                if (data.role_name == "jdgly" || data.role_name == "sqgly") {
+                  setStore({ name: "showMenu", content: true });
+
+                  commit("SET_HOMEFIRSTTAGPAGE", {
+                    label: "首页",
+                    value: "/wel/index",
+                    params: {},
+                    query: {},
+                    meta: {
+                      i18n: "dashboard",
+                    },
+                    group: [],
+                    close: false,
+                  });
+
+                  commit("SET_HOMEFIRSTPAGE", "/wel");
+
+                  resolve({});
+                } else {
+                  setStore({ name: "showMenu", content: false });
+
+                  commit("SET_HOMEFIRSTTAGPAGE", {
+                    label: fistMenu.name,
+                    value: fistMenu.path,
+                    params: {},
+                    query: {},
+                    meta: {
+                      i18n: "dashboard",
+                    },
+                    group: [],
+                    close: false,
+                  });
+
+                  commit("SET_HOMEFIRSTPAGE", fistMenu.path);
+
+                  resolve({ fistMenu, menuData });
+                }
+
+                commit("DEL_ALL_TAG");
+              });
+            }
+          })
+          .catch((error) => {
+            reject(error);
+          });
+      });
     },
     //根据手机号登录
-    LoginByPhone({commit}, userInfo) {
+    LoginByPhone({ commit }, userInfo) {
       return new Promise((resolve) => {
-        loginByUsername(userInfo.phone, userInfo.code).then(res => {
+        loginByUsername(userInfo.phone, userInfo.code).then((res) => {
           const data = res.data.data;
-          commit('SET_TOKEN', data);
-          commit('DEL_ALL_TAG');
-          commit('CLEAR_LOCK');
+          commit("SET_TOKEN", data);
+          commit("DEL_ALL_TAG");
+          commit("CLEAR_LOCK");
           resolve();
-        })
-      })
+        });
+      });
     },
     //根据第三方信息登录
-    LoginBySocial({commit}, userInfo) {
+    LoginBySocial({ commit }, userInfo) {
       return new Promise((resolve) => {
-        loginBySocial(userInfo.tenantId, userInfo.source, userInfo.code, userInfo.state).then(res => {
+        loginBySocial(
+          userInfo.tenantId,
+          userInfo.source,
+          userInfo.code,
+          userInfo.state
+        ).then((res) => {
           const data = res.data;
           if (data.error_description) {
             Message({
               message: data.error_description,
-              type: 'error'
-            })
+              type: "error",
+            });
           } else {
-            commit('SET_TOKEN', data.access_token);
-            commit('SET_REFRESH_TOKEN', data.refresh_token);
-            commit('SET_USER_INFO', data);
-            commit('SET_TENANT_ID', data.tenant_id);
-            commit('DEL_ALL_TAG');
-            commit('CLEAR_LOCK');
+            commit("SET_TOKEN", data.access_token);
+            commit("SET_REFRESH_TOKEN", data.refresh_token);
+            commit("SET_USER_INFO", data);
+            commit("SET_TENANT_ID", data.tenant_id);
+            commit("DEL_ALL_TAG");
+            commit("CLEAR_LOCK");
           }
           resolve();
-        })
-      })
+        });
+      });
     },
     //根据单点信息登录
-    LoginBySso({commit}, userInfo) {
+    LoginBySso({ commit }, userInfo) {
       return new Promise((resolve) => {
-        loginBySso(userInfo.state, userInfo.code).then(res => {
+        loginBySso(userInfo.state, userInfo.code).then((res) => {
           const data = res.data;
           if (data.error_description) {
             Message({
               message: data.error_description,
-              type: 'error'
-            })
+              type: "error",
+            });
           } else {
-            commit('SET_TOKEN', data.access_token);
-            commit('SET_REFRESH_TOKEN', data.refresh_token);
-            commit('SET_USER_INFO', data);
-            commit('SET_TENANT_ID', data.tenant_id);
-            commit('DEL_ALL_TAG');
-            commit('CLEAR_LOCK');
+            commit("SET_TOKEN", data.access_token);
+            commit("SET_REFRESH_TOKEN", data.refresh_token);
+            commit("SET_USER_INFO", data);
+            commit("SET_TENANT_ID", data.tenant_id);
+            commit("DEL_ALL_TAG");
+            commit("CLEAR_LOCK");
           }
           resolve();
-        })
-      })
+        });
+      });
     },
     //获取用户信息
-    GetUserInfo({commit}) {
+    GetUserInfo({ commit }) {
       return new Promise((resolve, reject) => {
-        getUserInfo().then((res) => {
-          const data = res.data.data;
-          commit('SET_ROLES', data.roles);
-          resolve(data);
-        }).catch(err => {
-          reject(err);
-        })
-      })
+        getUserInfo()
+          .then((res) => {
+            const data = res.data.data;
+            commit("SET_ROLES", data.roles);
+            resolve(data);
+          })
+          .catch((err) => {
+            reject(err);
+          });
+      });
     },
     //刷新token
-    refreshToken({state, commit}, userInfo) {
-      window.console.log('handle refresh token');
+    refreshToken({ state, commit }, userInfo) {
       return new Promise((resolve, reject) => {
-        refreshToken(state.refreshToken, state.tenantId,
+        refreshToken(
+          state.refreshToken,
+          state.tenantId,
           !validatenull(userInfo) ? userInfo.deptId : state.userInfo.dept_id,
           !validatenull(userInfo) ? userInfo.roleId : state.userInfo.role_id
-        ).then(res => {
-          const data = res.data;
-          commit('SET_TOKEN', data.access_token);
-          commit('SET_REFRESH_TOKEN', data.refresh_token);
-          commit('SET_USER_INFO', data);
-          resolve();
-        }).catch(error => {
-          reject(error)
-        })
-      })
+        )
+          .then((res) => {
+            const data = res.data;
+            commit("SET_TOKEN", data.access_token);
+            commit("SET_REFRESH_TOKEN", data.refresh_token);
+            commit("SET_USER_INFO", data);
+            resolve();
+          })
+          .catch((error) => {
+            reject(error);
+          });
+      });
     },
     // 登出
-    LogOut({commit}) {
+    LogOut({ commit }) {
       return new Promise((resolve, reject) => {
-        logout().then(() => {
-          commit('SET_TOKEN', '');
-          commit('SET_MENU', []);
-          commit('SET_MENU_ALL_NULL', []);
-          commit('SET_ROLES', []);
-          commit('SET_TAG_LIST', []);
-          commit('DEL_ALL_TAG');
-          commit('CLEAR_LOCK');
-          removeToken();
-          removeRefreshToken();
-          resolve();
-        }).catch(error => {
-          reject(error)
-        })
-      })
+        logout()
+          .then(() => {
+            commit("SET_TOKEN", "");
+            commit("SET_MENU", []);
+            commit("SET_MENU_ALL_NULL", []);
+            commit("SET_ROLES", []);
+            commit("SET_TAG_LIST", []);
+            commit("DEL_ALL_TAG");
+            commit("CLEAR_LOCK");
+
+            removeToken();
+            removeRefreshToken();
+            resolve();
+          })
+          .catch((error) => {
+            reject(error);
+          });
+      });
     },
     //注销session
-    FedLogOut({commit}) {
-      return new Promise(resolve => {
-        commit('SET_TOKEN', '');
-        commit('SET_MENU_ALL_NULL', []);
-        commit('SET_MENU', []);
-        commit('SET_ROLES', []);
-        commit('SET_TAG_LIST', []);
-        commit('DEL_ALL_TAG');
-        commit('CLEAR_LOCK');
+    FedLogOut({ commit }) {
+      return new Promise((resolve) => {
+        commit("SET_TOKEN", "");
+        commit("SET_MENU_ALL_NULL", []);
+        commit("SET_MENU", []);
+        commit("SET_ROLES", []);
+        commit("SET_TAG_LIST", []);
+        commit("DEL_ALL_TAG");
+        commit("CLEAR_LOCK");
+
         removeToken();
         removeRefreshToken();
         resolve();
-      })
+      });
     },
     //获取顶部菜单
     GetTopMenu() {
-      return new Promise(resolve => {
+      return new Promise((resolve) => {
         getTopMenu().then((res) => {
           const data = res.data.data || [];
-          resolve(data)
-        })
-      })
+          resolve(data);
+        });
+      });
     },
     //获取系统菜单
-    GetMenu({commit, dispatch}, topMenuId) {
-      return new Promise(resolve => {
+    GetMenu({ commit, dispatch }, topMenuId) {
+      return new Promise((resolve) => {
         getRoutes(topMenuId).then((res) => {
-          const data = res.data.data
+          const data = res.data.data;
           let menu = deepClone(data);
-          menu.forEach(ele => {
+          menu.forEach((ele) => {
             addPath(ele, true);
           });
-          commit('SET_MENU_ALL', menu)
-          commit('SET_MENU', menu)
-          dispatch('GetButtons');
-          resolve(menu)
-        })
-      })
+          commit("SET_MENU_ALL", menu);
+          commit("SET_MENU", menu);
+          dispatch("GetButtons");
+          resolve(menu);
+        });
+      });
     },
     //获取系统按钮
-    GetButtons({commit}) {
+    GetButtons({ commit }) {
       return new Promise((resolve) => {
-        getButtons().then(res => {
+        getButtons().then((res) => {
           const data = res.data.data;
-          commit('SET_PERMISSION', data);
+          commit("SET_PERMISSION", data);
           resolve();
-        })
-      })
+        });
+      });
     },
   },
   mutations: {
+    SET_HOMEFIRSTPAGE: (state, homeFirstPage) => {
+      setStore({ name: "firstPage", content: homeFirstPage });
+      state.homeFirstPage = homeFirstPage;
+    },
+    SET_HOMEFIRSTTAGPAGE: (state, homeFirstTagPage) => {
+      setStore({
+        name: "firstTagPage",
+        content: homeFirstTagPage,
+      });
+      state.homeFirstTagPage = homeFirstTagPage;
+    },
     SET_TOKEN: (state, token) => {
       setToken(token);
       state.token = token;
-      setStore({name: 'token', content: state.token})
+      setStore({ name: "token", content: state.token });
     },
     SET_MENU_ID(state, menuId) {
       state.menuId = menuId;
     },
     SET_MENU_ALL: (state, menuAll) => {
       let menu = state.menuAll;
-      menuAll.forEach(ele => {
-        if (!menu.find(item => item.label === ele.label && item.path === ele.path)) {
+      menuAll.forEach((ele) => {
+        if (
+          !menu.find(
+            (item) => item.label === ele.label && item.path === ele.path
+          )
+        ) {
           menu.push(ele);
         }
-      })
-      state.menuAll = menu
-      setStore({ name: 'menuAll', content: state.menuAll })
+      });
+      state.menuAll = menu;
+      setStore({ name: "menuAll", content: state.menuAll });
     },
     SET_MENU_ALL_NULL: (state) => {
-      state.menuAll = []
-      setStore({ name: 'menuAll', content: state.menuAll })
+      state.menuAll = [];
+      setStore({ name: "menuAll", content: state.menuAll });
     },
     SET_MENU: (state, menu) => {
-      state.menu = menu
-      setStore({ name: 'menu', content: state.menu })
+      state.menu = menu;
+      setStore({ name: "menu", content: state.menu });
     },
     SET_REFRESH_TOKEN: (state, refreshToken) => {
-      setRefreshToken(refreshToken)
+      setRefreshToken(refreshToken);
       state.refreshToken = refreshToken;
-      setStore({name: 'refreshToken', content: state.refreshToken})
+      setStore({ name: "refreshToken", content: state.refreshToken });
     },
     SET_TENANT_ID: (state, tenantId) => {
       state.tenantId = tenantId;
-      setStore({name: 'tenantId', content: state.tenantId})
+      setStore({ name: "tenantId", content: state.tenantId });
     },
     SET_USER_INFO: (state, userInfo) => {
       if (validatenull(userInfo.avatar)) {
         userInfo.avatar = "/img/bg/img-logo.png";
       }
       state.userInfo = userInfo;
-      setStore({name: 'userInfo', content: state.userInfo})
+      setStore({ name: "userInfo", content: state.userInfo });
     },
     SET_ROLES: (state, roles) => {
       state.roles = roles;
@@ -275,27 +379,26 @@
       let result = [];
 
       function getCode(list) {
-        list.forEach(ele => {
-          if (typeof (ele) === 'object') {
+        list.forEach((ele) => {
+          if (typeof ele === "object") {
             const chiildren = ele.children;
             const code = ele.code;
             if (chiildren) {
-              getCode(chiildren)
+              getCode(chiildren);
             } else {
               result.push(code);
             }
           }
-        })
+        });
       }
 
       getCode(permission);
       state.permission = {};
-      result.forEach(ele => {
+      result.forEach((ele) => {
         state.permission[ele] = true;
       });
-      setStore({name: 'permission', content: state.permission})
-    }
-  }
-
-}
-export default user
+      setStore({ name: "permission", content: state.permission });
+    },
+  },
+};
+export default user;
diff --git a/src/views/system/user.vue b/src/views/system/user.vue
index 5f32427..13eb5b8 100644
--- a/src/views/system/user.vue
+++ b/src/views/system/user.vue
@@ -436,14 +436,14 @@
                             {
                                 label: "所属角色",
                                 prop: "roleId",
-                                multiple: true,
                                 type: "tree",
+                                multiple: true,
+                                checkStrictly: true,
+                                leafOnly: false,
                                 dicData: [],
                                 props: {
                                     label: "title"
                                 },
-                                checkStrictly: true,
-                                slot: true,
                                 rules: [{
                                     required: true,
                                     message: "请选择所属角色",
@@ -456,7 +456,7 @@
                                 type: "tree",
                                 // multiple: true,
                                 dicData: [],
-                                dataType:"string",
+                                dataType: "string",
                                 props: {
                                     label: "title"
                                 },
@@ -699,7 +699,7 @@
             row['userType'] = 1
             row.deptId = func.join(row.deptId)
             row.roleId = func.join(row.roleId)
-            row.postId = func.join(row.postId);
+            row.postId = func.join(row.postId)
             add(row).then(() => {
                 this.initFlag = false
                 this.onLoad(this.page)
@@ -718,7 +718,7 @@
             row['userType'] = 1
             row.deptId = func.join(row.deptId)
             row.roleId = func.join(row.roleId)
-            row.postId = func.join(row.postId);
+            row.postId = func.join(row.postId)
             update(row).then(() => {
                 this.initFlag = false
                 this.onLoad(this.page)
diff --git a/src/views/wel/index.vue b/src/views/wel/index.vue
index 726597f..25ce6a8 100644
--- a/src/views/wel/index.vue
+++ b/src/views/wel/index.vue
@@ -4,25 +4,10 @@
             <span class="h1">{{ webTitle }}</span>
             <span class="h2"></span>
         </div>
-        <div class="homeL-bar">
-            <div class="outS" @click="down1">
-                <div class="down1"><span>住户管理</span></div>
-            </div>
-            <div class="outS" @click="down2">
-                <div class="down2"><span>房屋管理</span></div>
-            </div>
-            <div class="outS" @click="down3">
-                <div class="down3"><span>E呼即办</span></div>
-            </div>
-            <div class="outS" @click="down4">
-                <div class="down4"><span>报事报修</span></div>
-            </div>
-            <div class="outS" @click="down5">
-                <div class="down5"><span>走访日志</span></div>
-            </div>
-            <div class="outS" @click="down6"
-                v-show="globalUserInfo.role_name == 'administrator' || globalUserInfo.role_name.split(',').find(item => item == 'admin')">
-                <div class="down6"><span>驾驶舱</span></div>
+        <div class="homeL-bar" v-if="homeMenuData.length">
+            <div class="outS" v-for="(item, index) in homeMenuData" :key="index" @click="openMenu(item, item.newOpen)">
+                <div :style="{ backgroundImage: `url(${publicPath + item.imageUrl})` }"><span>{{ item.title }}</span>
+                </div>
             </div>
         </div>
     </div>
@@ -39,29 +24,106 @@
             webType: getStore({ name: "webType" }),
             a: 1,
             globalUserInfo: getStore({ name: "userInfo" }),
+
+            publicPath: process.env.BASE_URL,
+            homeMenuData: []
+        }
+    },
+
+    created () {
+        if (this.webType == 'secend') {
+            // 住建局
+            // if (this.globalUserInfo.role_name == 'zjj') {
+            //     this.homeMenuData = [
+            //         {
+            //             imageUrl: 'img/yijianbaoj.png',
+            //             url: '/propertySupervision/residentSupervision',
+            //             title: '居民监管',
+            //             newOpen: false,
+            //         },
+            //         {
+            //             imageUrl: 'img/yijianbaoj.png',
+            //             url: '/propertySupervision/houseHoldSupervision',
+            //             title: '住房监管',
+            //             newOpen: false,
+            //         },
+            //         {
+            //             imageUrl: 'img/yijianbaoj.png',
+            //             url: '/propertySupervision/ownersCommittee',
+            //             title: '业主大会',
+            //             newOpen: false,
+            //         },
+            //         {
+            //             imageUrl: 'img/yijianbaoj.png',
+            //             url: '/propertySupervision/propertyCapitalManage',
+            //             title: '维修基金管理',
+            //             newOpen: false,
+            //         },
+            //     ]
+            // } else {
+            //     // 物业
+            //     this.homeMenuData = [
+            //         {
+            //             imageUrl: 'img/yijianbaoj.png',
+            //             url: '/userHouse/houseHoldList',
+            //             title: '住户管理',
+            //             newOpen: false,
+            //         },
+            //     ]
+            // }
+        } else {
+            this.homeMenuData = [
+                {
+                    imageUrl: 'img/yijianbaoj.png',
+                    url: '/userHouse/houseHoldList',
+                    title: '住户管理',
+                    newOpen: false,
+                },
+                {
+                    imageUrl: 'img/fangyi.png',
+                    url: '/userHouse/houseList',
+                    title: '房屋管理',
+                    newOpen: false,
+                },
+                {
+                    imageUrl: 'img/anjian.png',
+                    url: '/cGovernance/taskECall',
+                    title: 'E呼即办',
+                    newOpen: false,
+                },
+                {
+                    imageUrl: 'img/tiwen.png',
+                    url: '/task/reportForRepairs',
+                    title: '报事报修',
+                    newOpen: false,
+                },
+                {
+                    imageUrl: 'img/tongji.png',
+                    url: '/cGovernance/gridWorkLog',
+                    title: '走访日志',
+                    newOpen: false,
+                }
+            ]
+
+            if (this.globalUserInfo.role_name == 'administrator' || this.globalUserInfo.role_name.split(',').find(item => item == 'admin')) {
+                this.homeMenuData.push({
+                    imageUrl: 'img/jsc.png',
+                    url: `http://srgdjczzxtpt.com:2181/uniform-auth/login?app=app_smart_aoi&Blade-Auth=bearer ${getToken()}`,
+                    title: '驾驶舱',
+                    newOpen: true,
+                })
+            }
         }
     },
 
     methods: {
-        down1 () {
-            this.$router.push({ path: "/userHouse/houseHoldList" })
-        },
-        down2 () {
-            this.$router.push({ path: "/userHouse/houseList" })
-        },
-        down3 () {
-            this.$router.push({ path: "/cGovernance/taskECall" })
-        },
-        down4 () {
-            this.$router.push({ path: "/task/reportForRepairs" })
-        },
-        down5 () {
-            this.$router.push({ path: "/cGovernance/gridWorkLog" })
-        },
-        down6 () {
-            let token = 'bearer ' + getToken()
-            window.open(`http://srgdjczzxtpt.com:2181/uniform-auth/login?app=app_smart_aoi&Blade-Auth=${token}`)
-        },
+        openMenu (data, flag = false) {
+            if (flag) {
+                window.open(data.url)
+            } else {
+                this.$router.push({ path: data.url })
+            }
+        }
     },
     mouted () { },
 }
@@ -118,64 +180,35 @@
             height: 94.6%;
             display: flex;
             justify-content: center;
-        }
 
-        .down1,
-        .down2,
-        .down3,
-        .down4,
-        .down5,
-        .down6 {
-            width: 96%;
-            height: 100%;
-            background-repeat: no-repeat;
-            background-size: 100% 100%;
-            cursor: pointer;
-            display: flex;
-            align-items: center;
-            justify-content: center;
-            border-radius: 5px;
+            &>div {
+                width: 96%;
+                height: 100%;
+                background-repeat: no-repeat;
+                background-size: 100% 100%;
+                cursor: pointer;
+                display: flex;
+                align-items: center;
+                justify-content: center;
+                border-radius: 5px;
 
-            &:hover {
-                width: 99%;
-                height: 99%;
-                transition: all 0.3s ease;
+                &:hover {
+                    width: 99%;
+                    height: 99%;
+                    transition: all 0.3s ease;
+                }
+
+                span {
+                    position: relative;
+                    top: -30px;
+                    left: -50px;
+                    font-weight: 600;
+                    font-size: 30px;
+                    color: #fff;
+                    display: inline-block;
+                    // border: 1px solid rgb(180, 22, 75);
+                }
             }
-
-            span {
-                position: relative;
-                top: -30px;
-                left: -50px;
-                font-weight: 600;
-                font-size: 30px;
-                color: #fff;
-                display: inline-block;
-                // border: 1px solid rgb(180, 22, 75);
-            }
-        }
-
-        .down1 {
-            background-image: url("../../../public/img/yijianbaoj.png");
-        }
-
-        .down2 {
-            background-image: url("../../../public/img/fangyi.png");
-        }
-
-        .down3 {
-            background-image: url("../../../public/img/anjian.png");
-        }
-
-        .down4 {
-            background-image: url("../../../public/img/tiwen.png");
-        }
-
-        .down5 {
-            background-image: url("../../../public/img/tongji.png");
-        }
-
-        .down6 {
-            background-image: url("../../../public/img/jsc.png");
         }
     }
 }

--
Gitblit v1.9.3