1
This commit is contained in:
		
							parent
							
								
									5c84560c70
								
							
						
					
					
						commit
						4bc0f47b97
					
				
							
								
								
									
										2
									
								
								auto-imports.d.ts
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								auto-imports.d.ts
									
									
									
									
										vendored
									
									
								
							@ -1,5 +1,5 @@
 | 
				
			|||||||
// Generated by 'unplugin-auto-import'
 | 
					// Generated by 'unplugin-auto-import'
 | 
				
			||||||
export {}
 | 
					export {}
 | 
				
			||||||
declare global {
 | 
					declare global {
 | 
				
			||||||
  const layer: typeof import('@layui/layer-vue')['layer']
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										7
									
								
								components.d.ts
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										7
									
								
								components.d.ts
									
									
									
									
										vendored
									
									
								
							@ -12,16 +12,12 @@ declare module 'vue' {
 | 
				
			|||||||
    LayBreadcrumb: typeof import('@layui/layui-vue')['LayBreadcrumb']
 | 
					    LayBreadcrumb: typeof import('@layui/layui-vue')['LayBreadcrumb']
 | 
				
			||||||
    LayBreadcrumbItem: typeof import('@layui/layui-vue')['LayBreadcrumbItem']
 | 
					    LayBreadcrumbItem: typeof import('@layui/layui-vue')['LayBreadcrumbItem']
 | 
				
			||||||
    LayButton: typeof import('@layui/layui-vue')['LayButton']
 | 
					    LayButton: typeof import('@layui/layui-vue')['LayButton']
 | 
				
			||||||
    LayButtonContainer: typeof import('@layui/layui-vue')['LayButtonContainer']
 | 
					 | 
				
			||||||
    LayButtonGroup: typeof import('@layui/layui-vue')['LayButtonGroup']
 | 
					 | 
				
			||||||
    LayCard: typeof import('@layui/layui-vue')['LayCard']
 | 
					    LayCard: typeof import('@layui/layui-vue')['LayCard']
 | 
				
			||||||
    LayCascader: typeof import('@layui/layui-vue')['LayCascader']
 | 
					    LayCascader: typeof import('@layui/layui-vue')['LayCascader']
 | 
				
			||||||
    LayCheckbox: typeof import('@layui/layui-vue')['LayCheckbox']
 | 
					 | 
				
			||||||
    LayCol: typeof import('@layui/layui-vue')['LayCol']
 | 
					    LayCol: typeof import('@layui/layui-vue')['LayCol']
 | 
				
			||||||
    LayConfigProvider: typeof import('@layui/layui-vue')['LayConfigProvider']
 | 
					    LayConfigProvider: typeof import('@layui/layui-vue')['LayConfigProvider']
 | 
				
			||||||
    LayContainer: typeof import('@layui/layui-vue')['LayContainer']
 | 
					    LayContainer: typeof import('@layui/layui-vue')['LayContainer']
 | 
				
			||||||
    LayCountUp: typeof import('@layui/layui-vue')['LayCountUp']
 | 
					    LayCountUp: typeof import('@layui/layui-vue')['LayCountUp']
 | 
				
			||||||
    LayDate: typeof import('@layui/layui-vue')['LayDate']
 | 
					 | 
				
			||||||
    LayDatePicker: typeof import('@layui/layui-vue')['LayDatePicker']
 | 
					    LayDatePicker: typeof import('@layui/layui-vue')['LayDatePicker']
 | 
				
			||||||
    LayDropdown: typeof import('@layui/layui-vue')['LayDropdown']
 | 
					    LayDropdown: typeof import('@layui/layui-vue')['LayDropdown']
 | 
				
			||||||
    LayDropdownMenu: typeof import('@layui/layui-vue')['LayDropdownMenu']
 | 
					    LayDropdownMenu: typeof import('@layui/layui-vue')['LayDropdownMenu']
 | 
				
			||||||
@ -41,11 +37,8 @@ declare module 'vue' {
 | 
				
			|||||||
    LayLogo: typeof import('@layui/layui-vue')['LayLogo']
 | 
					    LayLogo: typeof import('@layui/layui-vue')['LayLogo']
 | 
				
			||||||
    LayMenu: typeof import('@layui/layui-vue')['LayMenu']
 | 
					    LayMenu: typeof import('@layui/layui-vue')['LayMenu']
 | 
				
			||||||
    LayMenuItem: typeof import('@layui/layui-vue')['LayMenuItem']
 | 
					    LayMenuItem: typeof import('@layui/layui-vue')['LayMenuItem']
 | 
				
			||||||
    LayNoticeBar: typeof import('@layui/layui-vue')['LayNoticeBar']
 | 
					 | 
				
			||||||
    LayPopconfirm: typeof import('@layui/layui-vue')['LayPopconfirm']
 | 
					    LayPopconfirm: typeof import('@layui/layui-vue')['LayPopconfirm']
 | 
				
			||||||
    LayProgress: typeof import('@layui/layui-vue')['LayProgress']
 | 
					    LayProgress: typeof import('@layui/layui-vue')['LayProgress']
 | 
				
			||||||
    LayQrcode: typeof import('@layui/layui-vue')['LayQrcode']
 | 
					 | 
				
			||||||
    LayRadio: typeof import('@layui/layui-vue')['LayRadio']
 | 
					 | 
				
			||||||
    LayRow: typeof import('@layui/layui-vue')['LayRow']
 | 
					    LayRow: typeof import('@layui/layui-vue')['LayRow']
 | 
				
			||||||
    LaySelect: typeof import('@layui/layui-vue')['LaySelect']
 | 
					    LaySelect: typeof import('@layui/layui-vue')['LaySelect']
 | 
				
			||||||
    LaySelectOption: typeof import('@layui/layui-vue')['LaySelectOption']
 | 
					    LaySelectOption: typeof import('@layui/layui-vue')['LaySelectOption']
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										5690
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										5690
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@ -19,7 +19,8 @@
 | 
				
			|||||||
    "pinia": "^2.1.7",
 | 
					    "pinia": "^2.1.7",
 | 
				
			||||||
    "pinia-plugin-persistedstate": "^3.2.0",
 | 
					    "pinia-plugin-persistedstate": "^3.2.0",
 | 
				
			||||||
    "vue": "^3.3.4",
 | 
					    "vue": "^3.3.4",
 | 
				
			||||||
    "vue-router": "^4.2.5"
 | 
					    "vue-router": "^4.2.5",
 | 
				
			||||||
 | 
					    "vue3-puzzle-vcode": "^1.1.7"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "devDependencies": {
 | 
					  "devDependencies": {
 | 
				
			||||||
    "@layui/unplugin-vue-components": "^0.0.3",
 | 
					    "@layui/unplugin-vue-components": "^0.0.3",
 | 
				
			||||||
 | 
				
			|||||||
@ -8,9 +8,11 @@ type TAxiosOption = {
 | 
				
			|||||||
    baseURL: string;
 | 
					    baseURL: string;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const baseURL = '/api'  // 设置基础URL前缀
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const config: TAxiosOption = {
 | 
					const config: TAxiosOption = {
 | 
				
			||||||
    timeout: 5000,
 | 
					    timeout: 5000,
 | 
				
			||||||
    baseURL: "/"
 | 
					    baseURL: "http://yfyd.hschool.com.cn",
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Http {
 | 
					class Http {
 | 
				
			||||||
@ -49,7 +51,7 @@ class Http {
 | 
				
			|||||||
                    }});
 | 
					                    }});
 | 
				
			||||||
                    return response.data;
 | 
					                    return response.data;
 | 
				
			||||||
                default:
 | 
					                default:
 | 
				
			||||||
                    break;
 | 
					                    return response.data;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }, error => {
 | 
					        }, error => {
 | 
				
			||||||
            return Promise.reject(error)
 | 
					            return Promise.reject(error)
 | 
				
			||||||
 | 
				
			|||||||
@ -2,6 +2,11 @@ import Http from '../http';
 | 
				
			|||||||
export const login = function(loginForm: any) {
 | 
					export const login = function(loginForm: any) {
 | 
				
			||||||
    return Http.post('/api/backend/login/login', loginForm)
 | 
					    return Http.post('/api/backend/login/login', loginForm)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const getMenu = function(loginForm: any) {
 | 
				
			||||||
 | 
					    return Http.post('/api/backend/login/getAuth', loginForm)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//基础评分项列表
 | 
					//基础评分项列表
 | 
				
			||||||
export const homeGetHierarchicalData = function(date: any) {
 | 
					export const homeGetHierarchicalData = function(date: any) {
 | 
				
			||||||
    return Http.post('/api/backend/basic_rating/getHierarchicalData', date)
 | 
					    return Http.post('/api/backend/basic_rating/getHierarchicalData', date)
 | 
				
			||||||
@ -182,6 +187,25 @@ export const authGroupDataDel= function(date: any) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//人员列表
 | 
				
			||||||
 | 
					export const userData= function(date: any) {
 | 
				
			||||||
 | 
					    return Http.post('/api/backend/user/getUserData', date)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					//人员列表(新增)
 | 
				
			||||||
 | 
					export const userDataAdd= function(date: any) {
 | 
				
			||||||
 | 
					    return Http.post('/api/backend/user/create', date)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					//人员列表(编辑)
 | 
				
			||||||
 | 
					export const userDataEdit= function(date: any) {
 | 
				
			||||||
 | 
					    return Http.post('/api/backend/user/update', date)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					//人员列表(删除)
 | 
				
			||||||
 | 
					export const userDataDel= function(date: any) {
 | 
				
			||||||
 | 
					    return Http.post('/api/backend/user/delete', date)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1,50 +1,24 @@
 | 
				
			|||||||
<template>
 | 
					<template>
 | 
				
			||||||
  <lay-config-provider
 | 
					  <lay-config-provider :themeVariable="appStore.themeVariable" :theme="appStore.theme" :locales="locales"
 | 
				
			||||||
    :themeVariable="appStore.themeVariable"
 | 
					    :locale="appStore.locale">
 | 
				
			||||||
    :theme="appStore.theme"
 | 
					    <lay-layout :class="[
 | 
				
			||||||
    :locales="locales"
 | 
					 | 
				
			||||||
    :locale="appStore.locale"
 | 
					 | 
				
			||||||
  >
 | 
					 | 
				
			||||||
    <lay-layout
 | 
					 | 
				
			||||||
      :class="[
 | 
					 | 
				
			||||||
      appStore.tab ? 'has-tab' : '',
 | 
					      appStore.tab ? 'has-tab' : '',
 | 
				
			||||||
      appStore.collapse ? 'collapse' : '',
 | 
					      appStore.collapse ? 'collapse' : '',
 | 
				
			||||||
      appStore.greyMode ? 'grey-mode' : ''
 | 
					      appStore.greyMode ? 'grey-mode' : ''
 | 
				
			||||||
      ]"
 | 
					    ]">
 | 
				
			||||||
    >
 | 
					 | 
				
			||||||
      <!-- 遮盖层 -->
 | 
					      <!-- 遮盖层 -->
 | 
				
			||||||
      <div
 | 
					      <div v-if="!appStore.collapse" class="layui-layer-shade hidden-sm-and-up" @click="collapse"></div>
 | 
				
			||||||
        v-if="!appStore.collapse"
 | 
					 | 
				
			||||||
        class="layui-layer-shade hidden-sm-and-up"
 | 
					 | 
				
			||||||
        @click="collapse"
 | 
					 | 
				
			||||||
      ></div>
 | 
					 | 
				
			||||||
      <!-- 核心菜单  -->
 | 
					      <!-- 核心菜单  -->
 | 
				
			||||||
      <lay-side
 | 
					      <lay-side :width="sideWidth" :class="appStore.sideTheme == 'dark' ? 'dark changeBgc' : 'light'">
 | 
				
			||||||
        :width="sideWidth"
 | 
					 | 
				
			||||||
        :class="appStore.sideTheme == 'dark' ? 'dark changeBgc' : 'light'"
 | 
					 | 
				
			||||||
      >
 | 
					 | 
				
			||||||
        <lay-logo v-if="appStore.logo">医风医德考评系统</lay-logo>
 | 
					        <lay-logo v-if="appStore.logo">医风医德考评系统</lay-logo>
 | 
				
			||||||
        <div class="side-menu-wrapper">
 | 
					        <div class="side-menu-wrapper">
 | 
				
			||||||
          <div
 | 
					          <div class="side-menu1" v-if="appStore.subfield && appStore.subfieldPosition == 'side'">
 | 
				
			||||||
            class="side-menu1"
 | 
					            <global-main-menu :collapse="true" :menus="mainMenus" :selectedKey="mainSelectedKey"
 | 
				
			||||||
            v-if="appStore.subfield && appStore.subfieldPosition == 'side'"
 | 
					              @changeSelectedKey="changeMainSelectedKey"></global-main-menu>
 | 
				
			||||||
          >
 | 
					 | 
				
			||||||
            <global-main-menu
 | 
					 | 
				
			||||||
              :collapse="true"
 | 
					 | 
				
			||||||
              :menus="mainMenus"
 | 
					 | 
				
			||||||
              :selectedKey="mainSelectedKey"
 | 
					 | 
				
			||||||
              @changeSelectedKey="changeMainSelectedKey"
 | 
					 | 
				
			||||||
            ></global-main-menu>
 | 
					 | 
				
			||||||
          </div>
 | 
					          </div>
 | 
				
			||||||
          <div class="side-menu2">
 | 
					          <div class="side-menu2">
 | 
				
			||||||
            <global-menu
 | 
					            <global-menu :collapse="appStore.collapse" :menus="menus" :openKeys="openKeys" :selectedKey="selectedKey"
 | 
				
			||||||
              :collapse="appStore.collapse"
 | 
					              @changeOpenKeys="changeOpenKeys" @changeSelectedKey="changeSelectedKey"></global-menu>
 | 
				
			||||||
              :menus="menus"
 | 
					 | 
				
			||||||
              :openKeys="openKeys"
 | 
					 | 
				
			||||||
              :selectedKey="selectedKey"
 | 
					 | 
				
			||||||
              @changeOpenKeys="changeOpenKeys"
 | 
					 | 
				
			||||||
              @changeSelectedKey="changeSelectedKey"
 | 
					 | 
				
			||||||
            ></global-menu>
 | 
					 | 
				
			||||||
          </div>
 | 
					          </div>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
      </lay-side>
 | 
					      </lay-side>
 | 
				
			||||||
@ -53,54 +27,33 @@
 | 
				
			|||||||
        <lay-header style="display: flex">
 | 
					        <lay-header style="display: flex">
 | 
				
			||||||
          <lay-menu class="layui-layout-left">
 | 
					          <lay-menu class="layui-layout-left">
 | 
				
			||||||
            <lay-menu-item @click="collapse">
 | 
					            <lay-menu-item @click="collapse">
 | 
				
			||||||
              <lay-icon
 | 
					              <lay-icon v-if="appStore.collapse" type="layui-icon-spread-left"></lay-icon>
 | 
				
			||||||
                v-if="appStore.collapse"
 | 
					 | 
				
			||||||
                type="layui-icon-spread-left"
 | 
					 | 
				
			||||||
              ></lay-icon>
 | 
					 | 
				
			||||||
              <lay-icon v-else type="layui-icon-shrink-right"></lay-icon>
 | 
					              <lay-icon v-else type="layui-icon-shrink-right"></lay-icon>
 | 
				
			||||||
            </lay-menu-item>
 | 
					            </lay-menu-item>
 | 
				
			||||||
            <lay-menu-item class="hidden-xs-only" @click="refresh">
 | 
					            <lay-menu-item class="hidden-xs-only" @click="refresh">
 | 
				
			||||||
              <lay-icon type="layui-icon-refresh-one"></lay-icon>
 | 
					              <lay-icon type="layui-icon-refresh-one"></lay-icon>
 | 
				
			||||||
            </lay-menu-item>
 | 
					            </lay-menu-item>
 | 
				
			||||||
            <lay-menu-item
 | 
					            <lay-menu-item class="hidden-xs-only" v-if="appStore.breadcrumb" style="padding: 0px 15px">
 | 
				
			||||||
              class="hidden-xs-only"
 | 
					 | 
				
			||||||
              v-if="appStore.breadcrumb"
 | 
					 | 
				
			||||||
              style="padding: 0px 15px"
 | 
					 | 
				
			||||||
            >
 | 
					 | 
				
			||||||
              <GlobalBreadcrumb></GlobalBreadcrumb>
 | 
					              <GlobalBreadcrumb></GlobalBreadcrumb>
 | 
				
			||||||
            </lay-menu-item>
 | 
					            </lay-menu-item>
 | 
				
			||||||
          </lay-menu>
 | 
					          </lay-menu>
 | 
				
			||||||
          <!-- 菜单分组 -->
 | 
					          <!-- 菜单分组 -->
 | 
				
			||||||
          <lay-menu
 | 
					          <lay-menu v-if="appStore.subfield && appStore.subfieldPosition == 'head'" class="layui-nav-center"
 | 
				
			||||||
            v-if="appStore.subfield && appStore.subfieldPosition == 'head'"
 | 
					            :selectedKey="mainSelectedKey" @changeSelectedKey="changeMainSelectedKey">
 | 
				
			||||||
            class="layui-nav-center"
 | 
					 | 
				
			||||||
            :selectedKey="mainSelectedKey"
 | 
					 | 
				
			||||||
            @changeSelectedKey="changeMainSelectedKey"
 | 
					 | 
				
			||||||
          >
 | 
					 | 
				
			||||||
            <template v-for="(menu, index) in mainMenus" :key="index">
 | 
					            <template v-for="(menu, index) in mainMenus" :key="index">
 | 
				
			||||||
              <lay-menu-item :id="menu.id" v-if="index < 4">
 | 
					              <lay-menu-item :id="menu.id" v-if="index < 4">
 | 
				
			||||||
                <template #title>{{ menu.title }}</template>
 | 
					                <template #title>{{ menu.title }}</template>
 | 
				
			||||||
              </lay-menu-item>
 | 
					              </lay-menu-item>
 | 
				
			||||||
            </template>
 | 
					            </template>
 | 
				
			||||||
          </lay-menu>
 | 
					          </lay-menu>
 | 
				
			||||||
          <lay-dropdown
 | 
					          <lay-dropdown v-if="appStore.subfield && appStore.subfieldPosition == 'head'" trigger="hover"
 | 
				
			||||||
            v-if="appStore.subfield && appStore.subfieldPosition == 'head'"
 | 
					            placement="bottom">
 | 
				
			||||||
            trigger="hover"
 | 
					            <lay-icon type="layui-icon-more" style="padding: 0px 15px"></lay-icon>
 | 
				
			||||||
            placement="bottom"
 | 
					 | 
				
			||||||
          >
 | 
					 | 
				
			||||||
            <lay-icon
 | 
					 | 
				
			||||||
              type="layui-icon-more"
 | 
					 | 
				
			||||||
              style="padding: 0px 15px"
 | 
					 | 
				
			||||||
            ></lay-icon>
 | 
					 | 
				
			||||||
            <template #content>
 | 
					            <template #content>
 | 
				
			||||||
              <lay-dropdown-menu>
 | 
					              <lay-dropdown-menu>
 | 
				
			||||||
                <template v-for="(menu, index) in mainMenus">
 | 
					                <template v-for="(menu, index) in mainMenus">
 | 
				
			||||||
                  <lay-dropdown-menu-item
 | 
					                  <lay-dropdown-menu-item :key="menu.id" v-if="index >= 4" @click="changeMainSelectedKey(menu.id)">{{
 | 
				
			||||||
                    :key="menu.id"
 | 
					                    menu.title }}</lay-dropdown-menu-item>
 | 
				
			||||||
                    v-if="index >= 4"
 | 
					 | 
				
			||||||
                    @click="changeMainSelectedKey(menu.id)"
 | 
					 | 
				
			||||||
                    >{{ menu.title }}</lay-dropdown-menu-item
 | 
					 | 
				
			||||||
                  >
 | 
					 | 
				
			||||||
                </template>
 | 
					                </template>
 | 
				
			||||||
              </lay-dropdown-menu>
 | 
					              </lay-dropdown-menu>
 | 
				
			||||||
            </template>
 | 
					            </template>
 | 
				
			||||||
@ -108,53 +61,46 @@
 | 
				
			|||||||
          <lay-menu class="layui-layout-right">
 | 
					          <lay-menu class="layui-layout-right">
 | 
				
			||||||
            <lay-menu-item>
 | 
					            <lay-menu-item>
 | 
				
			||||||
              <lay-fullscreen v-slot="{ toggle, isFullscreen }">
 | 
					              <lay-fullscreen v-slot="{ toggle, isFullscreen }">
 | 
				
			||||||
                <lay-icon
 | 
					                <lay-icon @click="toggle()" :type="isFullscreen
 | 
				
			||||||
                  @click="toggle()"
 | 
					 | 
				
			||||||
                  :type="
 | 
					 | 
				
			||||||
                    isFullscreen
 | 
					 | 
				
			||||||
                    ? 'layui-icon-screen-restore'
 | 
					                    ? 'layui-icon-screen-restore'
 | 
				
			||||||
                    : 'layui-icon-screen-full'
 | 
					                    : 'layui-icon-screen-full'
 | 
				
			||||||
                  "
 | 
					                  "></lay-icon>
 | 
				
			||||||
                ></lay-icon>
 | 
					 | 
				
			||||||
              </lay-fullscreen>
 | 
					              </lay-fullscreen>
 | 
				
			||||||
            </lay-menu-item>
 | 
					            </lay-menu-item>
 | 
				
			||||||
            <lay-menu-item>
 | 
					            <!--            <lay-menu-item>-->
 | 
				
			||||||
              <global-message-tab :flag="flag">
 | 
					            <!--              <global-message-tab :flag="flag">-->
 | 
				
			||||||
                <lay-icon
 | 
					            <!--                <lay-icon-->
 | 
				
			||||||
                  type="layui-icon-notice"
 | 
					            <!--                  type="layui-icon-notice"-->
 | 
				
			||||||
                  @click="changeDropdown"
 | 
					            <!--                  @click="changeDropdown"-->
 | 
				
			||||||
                ></lay-icon>
 | 
					            <!--                ></lay-icon>-->
 | 
				
			||||||
              </global-message-tab>
 | 
					            <!--              </global-message-tab>-->
 | 
				
			||||||
            </lay-menu-item>
 | 
					            <!--            </lay-menu-item>-->
 | 
				
			||||||
            <lay-menu-item>
 | 
					            <!--            <lay-menu-item>-->
 | 
				
			||||||
              <lay-dropdown placement="bottom">
 | 
					            <!--              <lay-dropdown placement="bottom">-->
 | 
				
			||||||
                <lay-icon type="layui-icon-website"></lay-icon>
 | 
					            <!--                <lay-icon type="layui-icon-website"></lay-icon>-->
 | 
				
			||||||
                <template #content>
 | 
					            <!--                <template #content>-->
 | 
				
			||||||
                  <lay-dropdown-menu>
 | 
					            <!--                  <lay-dropdown-menu>-->
 | 
				
			||||||
                    <lay-dropdown-menu-item
 | 
					            <!--                    <lay-dropdown-menu-item-->
 | 
				
			||||||
                      @click="() => (appStore.locale = 'zh_CN')"
 | 
					            <!--                      @click="() => (appStore.locale = 'zh_CN')"-->
 | 
				
			||||||
                    >
 | 
					            <!--                    >-->
 | 
				
			||||||
                      <template #default>中文</template>
 | 
					            <!--                      <template #default>中文</template>-->
 | 
				
			||||||
                    </lay-dropdown-menu-item>
 | 
					            <!--                    </lay-dropdown-menu-item>-->
 | 
				
			||||||
                    <lay-dropdown-menu-item
 | 
					            <!--                    <lay-dropdown-menu-item-->
 | 
				
			||||||
                      @click="() => (appStore.locale = 'en_US')"
 | 
					            <!--                      @click="() => (appStore.locale = 'en_US')"-->
 | 
				
			||||||
                    >
 | 
					            <!--                    >-->
 | 
				
			||||||
                      <template #default>英文</template>
 | 
					            <!--                      <template #default>英文</template>-->
 | 
				
			||||||
                    </lay-dropdown-menu-item>
 | 
					            <!--                    </lay-dropdown-menu-item>-->
 | 
				
			||||||
                  </lay-dropdown-menu>
 | 
					            <!--                  </lay-dropdown-menu>-->
 | 
				
			||||||
                </template>
 | 
					            <!--                </template>-->
 | 
				
			||||||
              </lay-dropdown>
 | 
					            <!--              </lay-dropdown>-->
 | 
				
			||||||
            </lay-menu-item>
 | 
					            <!--            </lay-menu-item>-->
 | 
				
			||||||
            <lay-menu-item>
 | 
					            <lay-menu-item>
 | 
				
			||||||
              <lay-dropdown placement="bottom">
 | 
					              <lay-dropdown placement="bottom">
 | 
				
			||||||
                <lay-icon type="layui-icon-username"></lay-icon>
 | 
					                <lay-icon type="layui-icon-username"></lay-icon>
 | 
				
			||||||
                <template #content>
 | 
					                <template #content>
 | 
				
			||||||
                  <lay-dropdown-menu>
 | 
					                  <lay-dropdown-menu>
 | 
				
			||||||
                    <lay-dropdown-menu-item @click="toUserInfo">
 | 
					                    <lay-dropdown-menu-item>
 | 
				
			||||||
                      <template #default>用户信息</template>
 | 
					                      <template #default>{{ userInfoStore.userInfo.nickname }}</template>
 | 
				
			||||||
                    </lay-dropdown-menu-item>
 | 
					 | 
				
			||||||
                    <lay-dropdown-menu-item @click="toSystemSet">
 | 
					 | 
				
			||||||
                      <template #default>系统设置</template>
 | 
					 | 
				
			||||||
                    </lay-dropdown-menu-item>
 | 
					                    </lay-dropdown-menu-item>
 | 
				
			||||||
                    <lay-line></lay-line>
 | 
					                    <lay-line></lay-line>
 | 
				
			||||||
                    <lay-dropdown-menu-item @click="logOut">
 | 
					                    <lay-dropdown-menu-item @click="logOut">
 | 
				
			||||||
@ -164,21 +110,18 @@
 | 
				
			|||||||
                </template>
 | 
					                </template>
 | 
				
			||||||
              </lay-dropdown>
 | 
					              </lay-dropdown>
 | 
				
			||||||
            </lay-menu-item>
 | 
					            </lay-menu-item>
 | 
				
			||||||
            <lay-menu-item @click="changeVisible">
 | 
					            <!--            <lay-menu-item @click="changeVisible">-->
 | 
				
			||||||
              <lay-icon type="layui-icon-more-vertical"></lay-icon>
 | 
					            <!--              <lay-icon type="layui-icon-more-vertical"></lay-icon>-->
 | 
				
			||||||
            </lay-menu-item>
 | 
					            <!--            </lay-menu-item>-->
 | 
				
			||||||
          </lay-menu>
 | 
					          </lay-menu>
 | 
				
			||||||
        </lay-header>
 | 
					        </lay-header>
 | 
				
			||||||
        <lay-body>
 | 
					        <lay-body>
 | 
				
			||||||
          <global-tab
 | 
					          <global-tab :class="appStore.tagsTheme == 'concise'
 | 
				
			||||||
            :class="
 | 
					 | 
				
			||||||
              appStore.tagsTheme == 'concise'
 | 
					 | 
				
			||||||
              ? ''
 | 
					              ? ''
 | 
				
			||||||
              : appStore.tagsTheme == 'underpainting'
 | 
					              : appStore.tagsTheme == 'underpainting'
 | 
				
			||||||
                ? 'underpainting'
 | 
					                ? 'underpainting'
 | 
				
			||||||
                : 'designer'
 | 
					                : 'designer'
 | 
				
			||||||
            "
 | 
					            ">
 | 
				
			||||||
          >
 | 
					 | 
				
			||||||
          </global-tab>
 | 
					          </global-tab>
 | 
				
			||||||
          <global-content></global-content>
 | 
					          <global-content></global-content>
 | 
				
			||||||
        </lay-body>
 | 
					        </lay-body>
 | 
				
			||||||
@ -267,6 +210,7 @@ export default {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    const logOut = () => {
 | 
					    const logOut = () => {
 | 
				
			||||||
      const userInfoStore = useUserStore()
 | 
					      const userInfoStore = useUserStore()
 | 
				
			||||||
 | 
					      userInfoStore.clearVisitedRoutes()
 | 
				
			||||||
      userInfoStore.token = ''
 | 
					      userInfoStore.token = ''
 | 
				
			||||||
      userInfoStore.userInfo = {}
 | 
					      userInfoStore.userInfo = {}
 | 
				
			||||||
      router.push('/login')
 | 
					      router.push('/login')
 | 
				
			||||||
@ -419,24 +363,23 @@ export default {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
.layui-body
 | 
					
 | 
				
			||||||
  > .global-tab
 | 
					.layui-body>.global-tab>.layui-tab>.layui-tab-head>.layui-tab-title>li {
 | 
				
			||||||
  > .layui-tab
 | 
					 | 
				
			||||||
  > .layui-tab-head
 | 
					 | 
				
			||||||
  > .layui-tab-title
 | 
					 | 
				
			||||||
  > li {
 | 
					 | 
				
			||||||
  height: 38px;
 | 
					  height: 38px;
 | 
				
			||||||
  line-height: 38px;
 | 
					  line-height: 38px;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.designer {
 | 
					.designer {
 | 
				
			||||||
  padding-left: 5px;
 | 
					  padding-left: 5px;
 | 
				
			||||||
  box-sizing: border-box;
 | 
					  box-sizing: border-box;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  .layui-tab-head {
 | 
					  .layui-tab-head {
 | 
				
			||||||
    background-color: unset !important;
 | 
					    background-color: unset !important;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  .layui-tab-title {
 | 
					  .layui-tab-title {
 | 
				
			||||||
    background-color: unset !important;
 | 
					    background-color: unset !important;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    >li {
 | 
					    >li {
 | 
				
			||||||
      background-color: #fff;
 | 
					      background-color: #fff;
 | 
				
			||||||
      margin: 5px 0 0 5px;
 | 
					      margin: 5px 0 0 5px;
 | 
				
			||||||
@ -446,6 +389,7 @@ export default {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.layui-logo {
 | 
					.layui-logo {
 | 
				
			||||||
  color: #fff;
 | 
					  color: #fff;
 | 
				
			||||||
  font-weight: 600;
 | 
					  font-weight: 600;
 | 
				
			||||||
 | 
				
			|||||||
@ -50,6 +50,7 @@ export function useMenu() {
 | 
				
			|||||||
      const andParents = getParents(menus.value, route.path);
 | 
					      const andParents = getParents(menus.value, route.path);
 | 
				
			||||||
      if (andParents && andParents.length > 0) {
 | 
					      if (andParents && andParents.length > 0) {
 | 
				
			||||||
        let andParentKeys = andParents.map((item: any) => item.id);
 | 
					        let andParentKeys = andParents.map((item: any) => item.id);
 | 
				
			||||||
 | 
					        console.log(andParentKeys)
 | 
				
			||||||
        if (isAccordion.value) {
 | 
					        if (isAccordion.value) {
 | 
				
			||||||
          openKeys.value = [...andParentKeys];
 | 
					          openKeys.value = [...andParentKeys];
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
 | 
				
			|||||||
@ -12,7 +12,7 @@ export function useTab() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  const tabs: Ref<any> = ref([]);
 | 
					  const tabs: Ref<any> = ref([]);
 | 
				
			||||||
  const tabsCache: string[] = []
 | 
					  const tabsCache: string[] = []
 | 
				
			||||||
 | 
					  console.log(route)
 | 
				
			||||||
  if (routes) {
 | 
					  if (routes) {
 | 
				
			||||||
    routes.forEach(route => {
 | 
					    routes.forEach(route => {
 | 
				
			||||||
      if (route.meta && route.meta.affix) {
 | 
					      if (route.meta && route.meta.affix) {
 | 
				
			||||||
@ -66,6 +66,7 @@ export function useTab() {
 | 
				
			|||||||
        bool = true;
 | 
					        bool = true;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					    console.log(tabs.value);
 | 
				
			||||||
    if (!bool) {
 | 
					    if (!bool) {
 | 
				
			||||||
      tabs.value.push({ id: route.path, title: route.meta.title, name: route?.name });
 | 
					      tabs.value.push({ id: route.path, title: route.meta.title, name: route?.name });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
@ -46,7 +46,7 @@ const changeOpenKeys = (keys: string[]) => {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const changeSelectedKey = (key: string) => {
 | 
					const changeSelectedKey = (key: string) => {
 | 
				
			||||||
  console.log(props.menus)
 | 
					  console.log(key)
 | 
				
			||||||
  emits("changeSelectedKey", key);
 | 
					  emits("changeSelectedKey", key);
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1,11 +1,6 @@
 | 
				
			|||||||
<template>
 | 
					<template>
 | 
				
			||||||
  <div class="global-tab" v-if="appStore.tab">
 | 
					  <div class="global-tab" v-if="appStore.tab">
 | 
				
			||||||
    <lay-tab
 | 
					    <lay-tab :modelValue="currentPath" :allowClose="true" @change="to" @close="close">
 | 
				
			||||||
      :modelValue="currentPath"
 | 
					 | 
				
			||||||
      :allowClose="true"
 | 
					 | 
				
			||||||
      @change="to"
 | 
					 | 
				
			||||||
      @close="close"
 | 
					 | 
				
			||||||
    >
 | 
					 | 
				
			||||||
      <template :key="tab" v-for="tab in tabs">
 | 
					      <template :key="tab" v-for="tab in tabs">
 | 
				
			||||||
        <lay-tab-item :id="tab.id" :title="tab.title" :closable="tab.closable">
 | 
					        <lay-tab-item :id="tab.id" :title="tab.title" :closable="tab.closable">
 | 
				
			||||||
          <template #title>
 | 
					          <template #title>
 | 
				
			||||||
@ -16,22 +11,17 @@
 | 
				
			|||||||
      </template>
 | 
					      </template>
 | 
				
			||||||
    </lay-tab>
 | 
					    </lay-tab>
 | 
				
			||||||
    <lay-dropdown>
 | 
					    <lay-dropdown>
 | 
				
			||||||
      <lay-icon type="layui-icon-down" :class=" appStore.tagsTheme == 'designer' ? 'designer-last-icon' : ''"></lay-icon>
 | 
					      <lay-icon type="layui-icon-down"
 | 
				
			||||||
 | 
					        :class="appStore.tagsTheme == 'designer' ? 'designer-last-icon' : ''"></lay-icon>
 | 
				
			||||||
      <template #content>
 | 
					      <template #content>
 | 
				
			||||||
        <lay-dropdown-menu>
 | 
					        <lay-dropdown-menu>
 | 
				
			||||||
          <lay-dropdown-menu-item @click="closeAll"
 | 
					          <lay-dropdown-menu-item @click="closeAll">关闭全部</lay-dropdown-menu-item>
 | 
				
			||||||
            >关闭全部</lay-dropdown-menu-item
 | 
					 | 
				
			||||||
          >
 | 
					 | 
				
			||||||
        </lay-dropdown-menu>
 | 
					        </lay-dropdown-menu>
 | 
				
			||||||
        <lay-dropdown-menu>
 | 
					        <lay-dropdown-menu>
 | 
				
			||||||
          <lay-dropdown-menu-item @click="closeOther"
 | 
					          <lay-dropdown-menu-item @click="closeOther">关闭其他</lay-dropdown-menu-item>
 | 
				
			||||||
            >关闭其他</lay-dropdown-menu-item
 | 
					 | 
				
			||||||
          >
 | 
					 | 
				
			||||||
        </lay-dropdown-menu>
 | 
					        </lay-dropdown-menu>
 | 
				
			||||||
        <lay-dropdown-menu>
 | 
					        <lay-dropdown-menu>
 | 
				
			||||||
          <lay-dropdown-menu-item @click="closeCurrent"
 | 
					          <lay-dropdown-menu-item @click="closeCurrent">关闭当前</lay-dropdown-menu-item>
 | 
				
			||||||
            >关闭当前</lay-dropdown-menu-item
 | 
					 | 
				
			||||||
          >
 | 
					 | 
				
			||||||
        </lay-dropdown-menu>
 | 
					        </lay-dropdown-menu>
 | 
				
			||||||
      </template>
 | 
					      </template>
 | 
				
			||||||
    </lay-dropdown>
 | 
					    </lay-dropdown>
 | 
				
			||||||
@ -109,6 +99,7 @@ function toChangPage(id: any) {
 | 
				
			|||||||
  background: transparent !important;
 | 
					  background: transparent !important;
 | 
				
			||||||
  color: #e2e2e2 !important;
 | 
					  color: #e2e2e2 !important;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.designer {
 | 
					.designer {
 | 
				
			||||||
  display: flex;
 | 
					  display: flex;
 | 
				
			||||||
  width: calc(100% - 15px);
 | 
					  width: calc(100% - 15px);
 | 
				
			||||||
@ -133,12 +124,14 @@ function toChangPage(id: any) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  box-shadow: unset;
 | 
					  box-shadow: unset;
 | 
				
			||||||
  z-index: 999;
 | 
					  z-index: 999;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  .designer-tab {
 | 
					  .designer-tab {
 | 
				
			||||||
    display: inline-block;
 | 
					    display: inline-block;
 | 
				
			||||||
    flex-grow: 1;
 | 
					    flex-grow: 1;
 | 
				
			||||||
    width: 100%;
 | 
					    width: 100%;
 | 
				
			||||||
    padding-left: 15px;
 | 
					    padding-left: 15px;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  .designer-tab-item {
 | 
					  .designer-tab-item {
 | 
				
			||||||
    display: inline-block;
 | 
					    display: inline-block;
 | 
				
			||||||
    height: 32px !important;
 | 
					    height: 32px !important;
 | 
				
			||||||
@ -149,6 +142,7 @@ function toChangPage(id: any) {
 | 
				
			|||||||
    border-radius: 4px;
 | 
					    border-radius: 4px;
 | 
				
			||||||
    margin-right: 5px;
 | 
					    margin-right: 5px;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  .dot {
 | 
					  .dot {
 | 
				
			||||||
    display: inline-block;
 | 
					    display: inline-block;
 | 
				
			||||||
    background-color: whitesmoke;
 | 
					    background-color: whitesmoke;
 | 
				
			||||||
@ -173,9 +167,11 @@ function toChangPage(id: any) {
 | 
				
			|||||||
    -webkit-transition: all 0.2s;
 | 
					    -webkit-transition: all 0.2s;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.dot-this {
 | 
					.dot-this {
 | 
				
			||||||
  background-color: var(--global-primary-color) !important;
 | 
					  background-color: var(--global-primary-color) !important;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.designer-last-icon {
 | 
					.designer-last-icon {
 | 
				
			||||||
  width: 32px !important;
 | 
					  width: 32px !important;
 | 
				
			||||||
  height: 32px !important;
 | 
					  height: 32px !important;
 | 
				
			||||||
 | 
				
			|||||||
@ -26,7 +26,39 @@ router.beforeEach((to: RouteLocationNormalized, from: RouteLocationNormalized, n
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  const userStore = useUserStore();
 | 
					  const userStore = useUserStore();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // 如果路由需要认证
 | 
				
			||||||
  if(to.meta.requireAuth) {
 | 
					  if(to.meta.requireAuth) {
 | 
				
			||||||
 | 
					    // 检查是否有token
 | 
				
			||||||
 | 
					    if (!userStore.token) {
 | 
				
			||||||
 | 
					      next({ path: '/login' });
 | 
				
			||||||
 | 
					      return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // 检查当前访问的路由是否在用户权限范围内
 | 
				
			||||||
 | 
					    const currentPath = to.path;
 | 
				
			||||||
 | 
					    const menus = userStore.menus;
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    // 递归检查路径是否在菜单中
 | 
				
			||||||
 | 
					    const checkPathInMenus = (menus: any[]): boolean => {
 | 
				
			||||||
 | 
					      for(const menu of menus) {
 | 
				
			||||||
 | 
					        if(menu.id === currentPath) {
 | 
				
			||||||
 | 
					          return true;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if(menu.children && menu.children.length > 0) {
 | 
				
			||||||
 | 
					          if(checkPathInMenus(menu.children)) {
 | 
				
			||||||
 | 
					            return true;
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // 如果路径不在用户菜单中,跳转到403
 | 
				
			||||||
 | 
					    if(!checkPathInMenus(menus)) {
 | 
				
			||||||
 | 
					      next({ path: '/error/403' });
 | 
				
			||||||
 | 
					      return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    next();
 | 
					    next();
 | 
				
			||||||
  } else if(to.matched.length == 0) {
 | 
					  } else if(to.matched.length == 0) {
 | 
				
			||||||
    next({path: '/error/404'})
 | 
					    next({path: '/error/404'})
 | 
				
			||||||
 | 
				
			|||||||
@ -29,33 +29,42 @@ export default [
 | 
				
			|||||||
    path: '/system',
 | 
					    path: '/system',
 | 
				
			||||||
    redirect: '/system/index',
 | 
					    redirect: '/system/index',
 | 
				
			||||||
    component: BasicLayout,
 | 
					    component: BasicLayout,
 | 
				
			||||||
    meta: {title: '系统管理'},
 | 
					    meta: {
 | 
				
			||||||
 | 
					      title: '系统管理',
 | 
				
			||||||
 | 
					      requireAuth: true,
 | 
				
			||||||
 | 
					      permissions: ['sys:user:add']
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    children: [
 | 
					    children: [
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
        path: '/system/index',
 | 
					        path: '/system/index',
 | 
				
			||||||
        name: 'systemIndex',
 | 
					        name: 'systemIndex',
 | 
				
			||||||
        component: () => import('../../views/system/index.vue'),
 | 
					        component: () => import('../../views/system/index.vue'),
 | 
				
			||||||
        meta: {title: '人员管理', requireAuth: true, affix: true, closable: true},
 | 
					        meta: {
 | 
				
			||||||
 | 
					          title: '人员管理', 
 | 
				
			||||||
 | 
					          requireAuth: true,
 | 
				
			||||||
 | 
					          closable: true,
 | 
				
			||||||
 | 
					          permissions: ['sys:user:add']
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
      },{
 | 
					      },{
 | 
				
			||||||
        path: '/system/department',
 | 
					        path: '/system/department',
 | 
				
			||||||
        name: 'systemDepartment',
 | 
					        name: 'systemDepartment',
 | 
				
			||||||
        component: () => import('../../views/system/department.vue'),
 | 
					        component: () => import('../../views/system/department.vue'),
 | 
				
			||||||
        meta: {title: '部门管理', requireAuth: true, affix: true, closable: true},
 | 
					        meta: {title: '部门管理', requireAuth: true, closable: true},
 | 
				
			||||||
      },{
 | 
					      },{
 | 
				
			||||||
        path: '/system/party',
 | 
					        path: '/system/party',
 | 
				
			||||||
        name: 'systemParty',
 | 
					        name: 'systemParty',
 | 
				
			||||||
        component: () => import('../../views/system/party.vue'),
 | 
					        component: () => import('../../views/system/party.vue'),
 | 
				
			||||||
        meta: {title: '党支部管理', requireAuth: true, affix: true, closable: true},
 | 
					        meta: {title: '党支部管理', requireAuth: true,  closable: true},
 | 
				
			||||||
      },{
 | 
					      },{
 | 
				
			||||||
        path: '/system/permission',
 | 
					        path: '/system/permission',
 | 
				
			||||||
        name: 'systemPermission',
 | 
					        name: 'systemPermission',
 | 
				
			||||||
        component: () => import('../../views/system/permission.vue'),
 | 
					        component: () => import('../../views/system/permission.vue'),
 | 
				
			||||||
        meta: {title: '权限管理', requireAuth: true, affix: true, closable: true},
 | 
					        meta: {title: '权限管理', requireAuth: true, closable: true},
 | 
				
			||||||
      },{
 | 
					      },{
 | 
				
			||||||
        path: '/system/menu',
 | 
					        path: '/system/menu',
 | 
				
			||||||
        name: 'systemMenu',
 | 
					        name: 'systemMenu',
 | 
				
			||||||
        component: () => import('../../views/system/menu.vue'),
 | 
					        component: () => import('../../views/system/menu.vue'),
 | 
				
			||||||
        meta: {title: '菜单管理', requireAuth: true, affix: true, closable: true},
 | 
					        meta: {title: '菜单管理', requireAuth: true,  closable: true},
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    ]
 | 
					    ]
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
@ -68,7 +77,7 @@ export default [
 | 
				
			|||||||
        path: '/complaint/index',
 | 
					        path: '/complaint/index',
 | 
				
			||||||
        name: 'Complaint',
 | 
					        name: 'Complaint',
 | 
				
			||||||
        component: () => import('../../views/home/index.vue'),
 | 
					        component: () => import('../../views/home/index.vue'),
 | 
				
			||||||
        meta: { title: '投诉管理', requireAuth: true, affix: true, closable: true },
 | 
					        meta: { title: '投诉管理', requireAuth: true,  closable: true },
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
    ]
 | 
					    ]
 | 
				
			||||||
  },{
 | 
					  },{
 | 
				
			||||||
@ -80,7 +89,7 @@ export default [
 | 
				
			|||||||
        path: '/packet/index',
 | 
					        path: '/packet/index',
 | 
				
			||||||
        name: 'Packet',
 | 
					        name: 'Packet',
 | 
				
			||||||
        component: () => import('../../views/home/index.vue'),
 | 
					        component: () => import('../../views/home/index.vue'),
 | 
				
			||||||
        meta: { title: '拒收红包', requireAuth: true, affix: true, closable: true },
 | 
					        meta: { title: '拒收红包', requireAuth: true,  closable: true },
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
    ]
 | 
					    ]
 | 
				
			||||||
  },{
 | 
					  },{
 | 
				
			||||||
@ -93,12 +102,12 @@ export default [
 | 
				
			|||||||
        path: '/day_evaluation/index',
 | 
					        path: '/day_evaluation/index',
 | 
				
			||||||
        name: 'dayEvaluationIndex',
 | 
					        name: 'dayEvaluationIndex',
 | 
				
			||||||
        component: () => import('../../views/day_evaluation/index.vue'),
 | 
					        component: () => import('../../views/day_evaluation/index.vue'),
 | 
				
			||||||
        meta: {title: '加减分管理', requireAuth: true, affix: true, closable: true},
 | 
					        meta: {title: '加减分管理', requireAuth: true,  closable: true},
 | 
				
			||||||
      },{
 | 
					      },{
 | 
				
			||||||
        path: '/day_evaluation/examine',
 | 
					        path: '/day_evaluation/examine',
 | 
				
			||||||
        name: 'dayEvaluationExamine',
 | 
					        name: 'dayEvaluationExamine',
 | 
				
			||||||
        component: () => import('../../views/day_evaluation/examine.vue'),
 | 
					        component: () => import('../../views/day_evaluation/examine.vue'),
 | 
				
			||||||
        meta: {title: '加减分审核', requireAuth: true, affix: true, closable: true},
 | 
					        meta: {title: '加减分审核', requireAuth: true,  closable: true},
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    ]
 | 
					    ]
 | 
				
			||||||
  },{
 | 
					  },{
 | 
				
			||||||
@ -111,12 +120,12 @@ export default [
 | 
				
			|||||||
        path: '/month_evaluation/index',
 | 
					        path: '/month_evaluation/index',
 | 
				
			||||||
        name: 'monthEvaluationIndex',
 | 
					        name: 'monthEvaluationIndex',
 | 
				
			||||||
        component: () => import('../../views/month_evaluation/index.vue'),
 | 
					        component: () => import('../../views/month_evaluation/index.vue'),
 | 
				
			||||||
        meta: {title: '月度考评填报', requireAuth: true, affix: true, closable: true},
 | 
					        meta: {title: '月度考评填报', requireAuth: true,  closable: true},
 | 
				
			||||||
      },{
 | 
					      },{
 | 
				
			||||||
        path: '/month_evaluation/examine',
 | 
					        path: '/month_evaluation/examine',
 | 
				
			||||||
        name: 'monthEvaluationExamine',
 | 
					        name: 'monthEvaluationExamine',
 | 
				
			||||||
        component: () => import('../../views/month_evaluation/examine.vue'),
 | 
					        component: () => import('../../views/month_evaluation/examine.vue'),
 | 
				
			||||||
        meta: {title: '月度考评管理', requireAuth: true, affix: true, closable: true},
 | 
					        meta: {title: '月度考评管理', requireAuth: true,  closable: true},
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    ]
 | 
					    ]
 | 
				
			||||||
  },{
 | 
					  },{
 | 
				
			||||||
@ -129,12 +138,12 @@ export default [
 | 
				
			|||||||
        path: '/season_evaluation/index',
 | 
					        path: '/season_evaluation/index',
 | 
				
			||||||
        name: 'seasonEvaluationIndex',
 | 
					        name: 'seasonEvaluationIndex',
 | 
				
			||||||
        component: () => import('../../views/season_evaluation/index.vue'),
 | 
					        component: () => import('../../views/season_evaluation/index.vue'),
 | 
				
			||||||
        meta: {title: '季度考评', requireAuth: true, affix: true, closable: true},
 | 
					        meta: {title: '季度考评', requireAuth: true,  closable: true},
 | 
				
			||||||
      },{
 | 
					      },{
 | 
				
			||||||
        path: '/season_evaluation/examine',
 | 
					        path: '/season_evaluation/examine',
 | 
				
			||||||
        name: 'seasonEvaluationExamine',
 | 
					        name: 'seasonEvaluationExamine',
 | 
				
			||||||
        component: () => import('../../views/day_evaluation/examine.vue'),
 | 
					        component: () => import('../../views/day_evaluation/examine.vue'),
 | 
				
			||||||
        meta: {title: '季度考评管理', requireAuth: true, affix: true, closable: true},
 | 
					        meta: {title: '季度考评管理', requireAuth: true,  closable: true},
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    ]
 | 
					    ]
 | 
				
			||||||
  },{
 | 
					  },{
 | 
				
			||||||
@ -147,12 +156,12 @@ export default [
 | 
				
			|||||||
        path: '/outside_evaluation/index',
 | 
					        path: '/outside_evaluation/index',
 | 
				
			||||||
        name: 'outsideEvaluationIndex',
 | 
					        name: 'outsideEvaluationIndex',
 | 
				
			||||||
        component: () => import('../../views/day_evaluation/index.vue'),
 | 
					        component: () => import('../../views/day_evaluation/index.vue'),
 | 
				
			||||||
        meta: {title: '我的院外考评', requireAuth: true, affix: true, closable: true},
 | 
					        meta: {title: '我的院外考评', requireAuth: true,  closable: true},
 | 
				
			||||||
      },{
 | 
					      },{
 | 
				
			||||||
        path: '/outside_evaluation/examine',
 | 
					        path: '/outside_evaluation/examine',
 | 
				
			||||||
        name: 'outsideEvaluationExamine',
 | 
					        name: 'outsideEvaluationExamine',
 | 
				
			||||||
        component: () => import('../../views/day_evaluation/examine.vue'),
 | 
					        component: () => import('../../views/day_evaluation/examine.vue'),
 | 
				
			||||||
        meta: {title: '院外考评管理', requireAuth: true, affix: true, closable: true},
 | 
					        meta: {title: '院外考评管理', requireAuth: true,  closable: true},
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    ]
 | 
					    ]
 | 
				
			||||||
  },{
 | 
					  },{
 | 
				
			||||||
@ -165,12 +174,12 @@ export default [
 | 
				
			|||||||
        path: '/year_evaluation/index',
 | 
					        path: '/year_evaluation/index',
 | 
				
			||||||
        name: 'yearEvaluationIndex',
 | 
					        name: 'yearEvaluationIndex',
 | 
				
			||||||
        component: () => import('../../views/year_evaluation/index.vue'),
 | 
					        component: () => import('../../views/year_evaluation/index.vue'),
 | 
				
			||||||
        meta: {title: '年度考评', requireAuth: true, affix: true, closable: true},
 | 
					        meta: {title: '年度考评', requireAuth: true,  closable: true},
 | 
				
			||||||
      },{
 | 
					      },{
 | 
				
			||||||
        path: '/year_evaluation/examine',
 | 
					        path: '/year_evaluation/examine',
 | 
				
			||||||
        name: 'yearEvaluationExamine',
 | 
					        name: 'yearEvaluationExamine',
 | 
				
			||||||
        component: () => import('../../views/day_evaluation/examine.vue'),
 | 
					        component: () => import('../../views/day_evaluation/examine.vue'),
 | 
				
			||||||
        meta: {title: '年度考评管理', requireAuth: true, affix: true, closable: true},
 | 
					        meta: {title: '年度考评管理', requireAuth: true,  closable: true},
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    ]
 | 
					    ]
 | 
				
			||||||
  },{
 | 
					  },{
 | 
				
			||||||
@ -183,12 +192,12 @@ export default [
 | 
				
			|||||||
        path: '/file_bag/index',
 | 
					        path: '/file_bag/index',
 | 
				
			||||||
        name: 'fileBagIndex',
 | 
					        name: 'fileBagIndex',
 | 
				
			||||||
        component: () => import('../../views/day_evaluation/index.vue'),
 | 
					        component: () => import('../../views/day_evaluation/index.vue'),
 | 
				
			||||||
        meta: {title: '我的档案', requireAuth: true, affix: true, closable: true},
 | 
					        meta: {title: '我的档案', requireAuth: true,  closable: true},
 | 
				
			||||||
      },{
 | 
					      },{
 | 
				
			||||||
        path: '/file_bag/examine',
 | 
					        path: '/file_bag/examine',
 | 
				
			||||||
        name: 'fileBagExamine',
 | 
					        name: 'fileBagExamine',
 | 
				
			||||||
        component: () => import('../../views/day_evaluation/examine.vue'),
 | 
					        component: () => import('../../views/day_evaluation/examine.vue'),
 | 
				
			||||||
        meta: {title: '员工档案', requireAuth: true, affix: true, closable: true},
 | 
					        meta: {title: '员工档案', requireAuth: true,  closable: true},
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    ]
 | 
					    ]
 | 
				
			||||||
  },{
 | 
					  },{
 | 
				
			||||||
@ -201,27 +210,27 @@ export default [
 | 
				
			|||||||
        path: '/census/index',
 | 
					        path: '/census/index',
 | 
				
			||||||
        name: 'censusIndex',
 | 
					        name: 'censusIndex',
 | 
				
			||||||
        component: () => import('../../views/day_evaluation/index.vue'),
 | 
					        component: () => import('../../views/day_evaluation/index.vue'),
 | 
				
			||||||
        meta: {title: '拒收红包报表统计', requireAuth: true, affix: true, closable: true},
 | 
					        meta: {title: '拒收红包报表统计', requireAuth: true,  closable: true},
 | 
				
			||||||
      },{
 | 
					      },{
 | 
				
			||||||
        path: '/census/day',
 | 
					        path: '/census/day',
 | 
				
			||||||
        name: 'censusDay',
 | 
					        name: 'censusDay',
 | 
				
			||||||
        component: () => import('../../views/day_evaluation/examine.vue'),
 | 
					        component: () => import('../../views/day_evaluation/examine.vue'),
 | 
				
			||||||
        meta: {title: '日常考评报表统计', requireAuth: true, affix: true, closable: true},
 | 
					        meta: {title: '日常考评报表统计', requireAuth: true,  closable: true},
 | 
				
			||||||
      },{
 | 
					      },{
 | 
				
			||||||
        path: '/census/month',
 | 
					        path: '/census/month',
 | 
				
			||||||
        name: 'censusMonth',
 | 
					        name: 'censusMonth',
 | 
				
			||||||
        component: () => import('../../views/day_evaluation/examine.vue'),
 | 
					        component: () => import('../../views/day_evaluation/examine.vue'),
 | 
				
			||||||
        meta: {title: '月度考评报表统计', requireAuth: true, affix: true, closable: true},
 | 
					        meta: {title: '月度考评报表统计', requireAuth: true,  closable: true},
 | 
				
			||||||
      },{
 | 
					      },{
 | 
				
			||||||
        path: '/census/season',
 | 
					        path: '/census/season',
 | 
				
			||||||
        name: 'censusSeason',
 | 
					        name: 'censusSeason',
 | 
				
			||||||
        component: () => import('../../views/day_evaluation/examine.vue'),
 | 
					        component: () => import('../../views/day_evaluation/examine.vue'),
 | 
				
			||||||
        meta: {title: '季度考评报表统计', requireAuth: true, affix: true, closable: true},
 | 
					        meta: {title: '季度考评报表统计', requireAuth: true,  closable: true},
 | 
				
			||||||
      },{
 | 
					      },{
 | 
				
			||||||
        path: '/census/year',
 | 
					        path: '/census/year',
 | 
				
			||||||
        name: 'censusYear',
 | 
					        name: 'censusYear',
 | 
				
			||||||
        component: () => import('../../views/day_evaluation/examine.vue'),
 | 
					        component: () => import('../../views/day_evaluation/examine.vue'),
 | 
				
			||||||
        meta: {title: '年度考评报表统计', requireAuth: true, affix: true, closable: true},
 | 
					        meta: {title: '年度考评报表统计', requireAuth: true,  closable: true},
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    ]
 | 
					    ]
 | 
				
			||||||
  },{
 | 
					  },{
 | 
				
			||||||
@ -234,65 +243,37 @@ export default [
 | 
				
			|||||||
        path: '/configuration/index',
 | 
					        path: '/configuration/index',
 | 
				
			||||||
        name: 'configurationIndex',
 | 
					        name: 'configurationIndex',
 | 
				
			||||||
        component: () => import('../../views/day_evaluation/index.vue'),
 | 
					        component: () => import('../../views/day_evaluation/index.vue'),
 | 
				
			||||||
        meta: {title: '登陆日志管理', requireAuth: true, affix: true, closable: true},
 | 
					        meta: {title: '登陆日志管理', requireAuth: true,  closable: true},
 | 
				
			||||||
      },{
 | 
					      },{
 | 
				
			||||||
        path: '/configuration/foundation',
 | 
					        path: '/configuration/foundation',
 | 
				
			||||||
        name: 'configurationFoundation',
 | 
					        name: 'configurationFoundation',
 | 
				
			||||||
        component: () => import('../../views/configuration/foundation.vue'),
 | 
					        component: () => import('../../views/configuration/foundation.vue'),
 | 
				
			||||||
        meta: {title: '基础评分项管理', requireAuth: true, affix: true, closable: true},
 | 
					        meta: {title: '基础评分项管理', requireAuth: true,  closable: true},
 | 
				
			||||||
      },{
 | 
					      },{
 | 
				
			||||||
        path: '/configuration/add',
 | 
					        path: '/configuration/add',
 | 
				
			||||||
        name: 'configurationAdd',
 | 
					        name: 'configurationAdd',
 | 
				
			||||||
        component: () => import('../../views/configuration/add.vue'),
 | 
					        component: () => import('../../views/configuration/add.vue'),
 | 
				
			||||||
        meta: {title: '加减分项管理', requireAuth: true, affix: true, closable: true},
 | 
					        meta: {title: '加减分项管理', requireAuth: true,  closable: true},
 | 
				
			||||||
      },{
 | 
					      },{
 | 
				
			||||||
        path: '/configuration/time',
 | 
					        path: '/configuration/time',
 | 
				
			||||||
        name: 'configurationTime',
 | 
					        name: 'configurationTime',
 | 
				
			||||||
        component: () => import('../../views/configuration/time.vue'),
 | 
					        component: () => import('../../views/configuration/time.vue'),
 | 
				
			||||||
        meta: {title: '考评时间管理', requireAuth: true, affix: true, closable: true},
 | 
					        meta: {title: '考评时间管理', requireAuth: true,  closable: true},
 | 
				
			||||||
      },{
 | 
					      },{
 | 
				
			||||||
        path: '/configuration/level',
 | 
					        path: '/configuration/level',
 | 
				
			||||||
        name: 'configurationLevel',
 | 
					        name: 'configurationLevel',
 | 
				
			||||||
        component: () => import('../../views/day_evaluation/examine.vue'),
 | 
					        component: () => import('../../views/day_evaluation/examine.vue'),
 | 
				
			||||||
        meta: {title: '考评级别管理', requireAuth: true, affix: true, closable: true},
 | 
					        meta: {title: '考评级别管理', requireAuth: true,  closable: true},
 | 
				
			||||||
      },{
 | 
					      },{
 | 
				
			||||||
        path: '/configuration/opinion',
 | 
					        path: '/configuration/opinion',
 | 
				
			||||||
        name: 'configurationOpinion',
 | 
					        name: 'configurationOpinion',
 | 
				
			||||||
        component: () => import('../../views/day_evaluation/examine.vue'),
 | 
					        component: () => import('../../views/day_evaluation/examine.vue'),
 | 
				
			||||||
        meta: {title: '医德征求意见管理', requireAuth: true, affix: true, closable: true},
 | 
					        meta: {title: '医德征求意见管理', requireAuth: true,  closable: true},
 | 
				
			||||||
      },{
 | 
					      },{
 | 
				
			||||||
        path: '/configuration/year',
 | 
					        path: '/configuration/year',
 | 
				
			||||||
        name: 'configurationBase',
 | 
					        name: 'configurationBase',
 | 
				
			||||||
        component: () => import('../../views/day_evaluation/examine.vue'),
 | 
					        component: () => import('../../views/day_evaluation/examine.vue'),
 | 
				
			||||||
        meta: {title: '字典管理', requireAuth: true, affix: true, closable: true},
 | 
					        meta: {title: '字典管理', requireAuth: true,  closable: true},
 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    ]
 | 
					 | 
				
			||||||
  },{
 | 
					 | 
				
			||||||
    path: '/workspace',
 | 
					 | 
				
			||||||
    redirect: '/workspace/workbench',
 | 
					 | 
				
			||||||
    component: BasicLayout,
 | 
					 | 
				
			||||||
    meta: {title: '工作空间'},
 | 
					 | 
				
			||||||
    children: [
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
        path: '/workspace/workbench',
 | 
					 | 
				
			||||||
        name: 'Workbench',
 | 
					 | 
				
			||||||
        component: () => import('../../views/workSpace/workbench/index.vue'),
 | 
					 | 
				
			||||||
        meta: {title: '工作台', requireAuth: true, affix: true, closable: false},
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
        path: '/workspace/console',
 | 
					 | 
				
			||||||
        component: () => import('../../views/workSpace/console/index.vue'),
 | 
					 | 
				
			||||||
        meta: {title: '控制台', requireAuth: true},
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
        path: '/workspace/analysis',
 | 
					 | 
				
			||||||
        component: () => import('../../views/workSpace/analysis/index.vue'),
 | 
					 | 
				
			||||||
        meta: {title: '分析页', requireAuth: true},
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
        path: '/workspace/monitor',
 | 
					 | 
				
			||||||
        component: () => import('../../views/workSpace/monitor/index.vue'),
 | 
					 | 
				
			||||||
        meta: {title: '监控页', requireAuth: true},
 | 
					 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    ]
 | 
					    ]
 | 
				
			||||||
  },{
 | 
					  },{
 | 
				
			||||||
@ -307,8 +288,10 @@ export default [
 | 
				
			|||||||
      },
 | 
					      },
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
        path: '/error/403',
 | 
					        path: '/error/403',
 | 
				
			||||||
        component: () => import('../../views/error/403.vue'),
 | 
					        component: () => import('@/views/error/403.vue'),
 | 
				
			||||||
        meta: { title: '403' },
 | 
					        meta: {
 | 
				
			||||||
 | 
					          requireAuth: false
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
        path: '/error/404',
 | 
					        path: '/error/404',
 | 
				
			||||||
 | 
				
			|||||||
@ -2,21 +2,30 @@ import { defineStore } from 'pinia'
 | 
				
			|||||||
//import { menu, permission } from "../api/module/user";
 | 
					//import { menu, permission } from "../api/module/user";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import  menu  from "../mockjs/user";
 | 
					import  menu  from "../mockjs/user";
 | 
				
			||||||
 | 
					import {getMenu} from "@/api/module/home";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					interface Tab {
 | 
				
			||||||
 | 
					  id: string
 | 
				
			||||||
 | 
					  title: string
 | 
				
			||||||
 | 
					  closable: boolean
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const useUserStore = defineStore({
 | 
					export const useUserStore = defineStore({
 | 
				
			||||||
  id: 'user',
 | 
					  id: 'user',
 | 
				
			||||||
  state: () => {
 | 
					  state: () => {
 | 
				
			||||||
    return {
 | 
					    return {
 | 
				
			||||||
      token: '',
 | 
					      token: '',
 | 
				
			||||||
      userInfo: {},
 | 
					      userInfo: {} as any,
 | 
				
			||||||
      permissions: [],
 | 
					      permissions: [] as string[],
 | 
				
			||||||
      menus: [],
 | 
					      menus: [] as any[],
 | 
				
			||||||
 | 
					      visitedRoutes: [] as Tab[]  // 新增访问记录
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  actions: {
 | 
					  actions: {
 | 
				
			||||||
    async loadMenus(){
 | 
					    async loadMenus(){
 | 
				
			||||||
      this.menus =  menu.menus;
 | 
					      const data = await getMenu({});
 | 
				
			||||||
      console.log(this.menus);
 | 
					      this.menus =  data.data;
 | 
				
			||||||
 | 
					      console.log(data);
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    async loadPermissions(){
 | 
					    async loadPermissions(){
 | 
				
			||||||
      // const { data, code } = await permission();
 | 
					      // const { data, code } = await permission();
 | 
				
			||||||
@ -24,10 +33,31 @@ export const useUserStore = defineStore({
 | 
				
			|||||||
      //
 | 
					      //
 | 
				
			||||||
      // }
 | 
					      // }
 | 
				
			||||||
      this.permissions = ['sys:user:add', 'sys:user:edit', 'sys:user:delete', 'sys:user:import', 'sys:user:export'];
 | 
					      this.permissions = ['sys:user:add', 'sys:user:edit', 'sys:user:delete', 'sys:user:import', 'sys:user:export'];
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    // 添加访问过的路由
 | 
				
			||||||
 | 
					    addVisitedRoute(tab: Tab) {
 | 
				
			||||||
 | 
					      if (!this.visitedRoutes.some(item => item.id === tab.id)) {
 | 
				
			||||||
 | 
					        this.visitedRoutes.push(tab);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    // 移除访问记录
 | 
				
			||||||
 | 
					    removeVisitedRoute(tabId: string) {
 | 
				
			||||||
 | 
					      const index = this.visitedRoutes.findIndex(item => item.id === tabId);
 | 
				
			||||||
 | 
					      if (index > -1) {
 | 
				
			||||||
 | 
					        this.visitedRoutes.splice(index, 1);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    // 清空访问记录
 | 
				
			||||||
 | 
					    clearVisitedRoutes() {
 | 
				
			||||||
 | 
					      // 保留首页
 | 
				
			||||||
 | 
					      this.visitedRoutes = this.visitedRoutes.filter(tab => tab.id === '/home');
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  persist: {
 | 
					  persist: {
 | 
				
			||||||
 | 
					    key: 'user',
 | 
				
			||||||
    storage: localStorage,
 | 
					    storage: localStorage,
 | 
				
			||||||
    paths: ['token', 'userInfo', 'permissions', 'menus' ],
 | 
					    paths: ['token', 'userInfo', 'permissions', 'menus', 'visitedRoutes'],
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
})
 | 
					})
 | 
				
			||||||
 | 
				
			|||||||
@ -24,27 +24,17 @@
 | 
				
			|||||||
              <lay-tab-item title="帐号登陆" id="1">
 | 
					              <lay-tab-item title="帐号登陆" id="1">
 | 
				
			||||||
                <div style="height: 250px">
 | 
					                <div style="height: 250px">
 | 
				
			||||||
                  <lay-form-item :label-width="0">
 | 
					                  <lay-form-item :label-width="0">
 | 
				
			||||||
                    <lay-input :allow-clear="true" prefix-icon="layui-icon-username" placeholder="用户名"
 | 
					                    <lay-input :allow-clear="true" size="lg" prefix-icon="layui-icon-username" placeholder="用户名"
 | 
				
			||||||
                      v-model="loginForm.account"></lay-input>
 | 
					                               v-model="loginForm.username"></lay-input>
 | 
				
			||||||
                  </lay-form-item>
 | 
					                  </lay-form-item>
 | 
				
			||||||
                  <lay-form-item :label-width="0">
 | 
					                  <lay-form-item :label-width="0">
 | 
				
			||||||
                    <lay-input :allow-clear="true" prefix-icon="layui-icon-password" placeholder="密码" password
 | 
					                    <lay-input :allow-clear="true" size="lg" prefix-icon="layui-icon-password" placeholder="密码" password
 | 
				
			||||||
                               type="password" v-model="loginForm.password"></lay-input>
 | 
					                               type="password" v-model="loginForm.password"></lay-input>
 | 
				
			||||||
                  </lay-form-item>
 | 
					                  </lay-form-item>
 | 
				
			||||||
                  <lay-form-item :label-width="0">
 | 
					 | 
				
			||||||
                    <div style="width: 264px; display: inline-block">
 | 
					 | 
				
			||||||
                      <lay-input :allow-clear="true" prefix-icon="layui-icon-vercode" placeholder="验证码"
 | 
					 | 
				
			||||||
                        v-model="loginForm.vercode"></lay-input>
 | 
					 | 
				
			||||||
                    </div>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                    <div class="login-captach" @click="toRefreshImg">
 | 
					 | 
				
			||||||
                      <img style="width: 100%" src="../../assets/login/login-yzm.jpg" alt="获取验证码" />
 | 
					 | 
				
			||||||
                    </div>
 | 
					 | 
				
			||||||
                  </lay-form-item>
 | 
					 | 
				
			||||||
                  <lay-checkbox value="" name="like" v-model="remember" skin="primary" label="1">记住密码</lay-checkbox>
 | 
					 | 
				
			||||||
                  <lay-form-item :label-width="0">
 | 
					                  <lay-form-item :label-width="0">
 | 
				
			||||||
                    <lay-button style="margin-top: 20px" type="primary" :loading="loging" :fluid="true"
 | 
					                    <lay-button style="margin-top: 20px" type="primary" :loading="loging" :fluid="true"
 | 
				
			||||||
                      loadingIcon="layui-icon-loading" @click="loginSubmit">登录</lay-button>
 | 
					                                loadingIcon="layui-icon-loading" @click="onShowLogin">登录
 | 
				
			||||||
 | 
					                    </lay-button>
 | 
				
			||||||
                  </lay-form-item>
 | 
					                  </lay-form-item>
 | 
				
			||||||
                </div>
 | 
					                </div>
 | 
				
			||||||
              </lay-tab-item>
 | 
					              </lay-tab-item>
 | 
				
			||||||
@ -90,10 +80,12 @@
 | 
				
			|||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
      </div>
 | 
					      </div>
 | 
				
			||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
 | 
					    <Vcode :show="isShow" @success="onSuccess"/>
 | 
				
			||||||
  </div>
 | 
					  </div>
 | 
				
			||||||
</template>
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts" setup>
 | 
				
			||||||
 | 
					import Vcode from 'vue3-puzzle-vcode'
 | 
				
			||||||
import {login} from '../../api/module/home'
 | 
					import {login} from '../../api/module/home'
 | 
				
			||||||
import {verificationImg, loginQrcode} from '../../api/module/commone'
 | 
					import {verificationImg, loginQrcode} from '../../api/module/commone'
 | 
				
			||||||
import {defineComponent, onMounted, reactive, ref} from 'vue'
 | 
					import {defineComponent, onMounted, reactive, ref} from 'vue'
 | 
				
			||||||
@ -101,19 +93,22 @@ import { useRouter } from 'vue-router'
 | 
				
			|||||||
import {useUserStore} from '../../store/user'
 | 
					import {useUserStore} from '../../store/user'
 | 
				
			||||||
import {layer} from '@layui/layer-vue'
 | 
					import {layer} from '@layui/layer-vue'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default defineComponent({
 | 
					const onSuccess = () => {
 | 
				
			||||||
  setup() {
 | 
					  isShow.value = false;
 | 
				
			||||||
 | 
					  loginSubmit();
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					const onShowLogin = () => {
 | 
				
			||||||
 | 
					  isShow.value = true;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					const isShow = ref(false);
 | 
				
			||||||
const router = useRouter()
 | 
					const router = useRouter()
 | 
				
			||||||
const userStore = useUserStore()
 | 
					const userStore = useUserStore()
 | 
				
			||||||
const method = ref('1')
 | 
					const method = ref('1')
 | 
				
			||||||
    const verificationImgUrl = ref('')
 | 
					 | 
				
			||||||
const loging = ref(false);
 | 
					const loging = ref(false);
 | 
				
			||||||
    const loginQrcodeText = ref('')
 | 
					 | 
				
			||||||
const remember = ref(false)
 | 
					const remember = ref(false)
 | 
				
			||||||
const loginForm = reactive({
 | 
					const loginForm = reactive({
 | 
				
			||||||
      username: 'admin',
 | 
					  username: '',
 | 
				
			||||||
      password: 'admin888',
 | 
					  password: ''
 | 
				
			||||||
      vercode: 'DqJFN'
 | 
					 | 
				
			||||||
})
 | 
					})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const loginSubmit = async () => {
 | 
					const loginSubmit = async () => {
 | 
				
			||||||
@ -131,40 +126,11 @@ export default defineComponent({
 | 
				
			|||||||
          router.push('/home')
 | 
					          router.push('/home')
 | 
				
			||||||
        })
 | 
					        })
 | 
				
			||||||
      } else {
 | 
					      } else {
 | 
				
			||||||
            layer.msg(msg, { icon: 2 })
 | 
					        layer.msg(res.msg, {icon: 2})
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    }, 1000)
 | 
					    }, 1000)
 | 
				
			||||||
  })
 | 
					  })
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
    const toRefreshImg = async () => {
 | 
					 | 
				
			||||||
      let { data, code, msg } = await verificationImg()
 | 
					 | 
				
			||||||
      if (code == 200) {
 | 
					 | 
				
			||||||
        verificationImgUrl.value = data.data
 | 
					 | 
				
			||||||
      } else {
 | 
					 | 
				
			||||||
        layer.msg(msg, { icon: 2 })
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    const toRefreshQrcode = async () => {
 | 
					 | 
				
			||||||
      let { data, code, msg } = await loginQrcode()
 | 
					 | 
				
			||||||
      if (code == 200) {
 | 
					 | 
				
			||||||
        loginQrcodeText.value = data.data
 | 
					 | 
				
			||||||
      } else {
 | 
					 | 
				
			||||||
        layer.msg(msg, { icon: 2 })
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return {
 | 
					 | 
				
			||||||
      toRefreshQrcode,
 | 
					 | 
				
			||||||
      toRefreshImg,
 | 
					 | 
				
			||||||
      loginSubmit,
 | 
					 | 
				
			||||||
      loginForm,
 | 
					 | 
				
			||||||
      remember,
 | 
					 | 
				
			||||||
      method,
 | 
					 | 
				
			||||||
      loging
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
})
 | 
					 | 
				
			||||||
</script>
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<style scoped>
 | 
					<style scoped>
 | 
				
			||||||
 | 
				
			|||||||
@ -28,7 +28,6 @@
 | 
				
			|||||||
            <lay-button type="primary" size="sm">导出Excel</lay-button>
 | 
					            <lay-button type="primary" size="sm">导出Excel</lay-button>
 | 
				
			||||||
          </div>
 | 
					          </div>
 | 
				
			||||||
          <lay-table
 | 
					          <lay-table
 | 
				
			||||||
              :page="page"
 | 
					 | 
				
			||||||
              :columns="columns"
 | 
					              :columns="columns"
 | 
				
			||||||
              :dataSource="dataSource"
 | 
					              :dataSource="dataSource"
 | 
				
			||||||
              :even="true"
 | 
					              :even="true"
 | 
				
			||||||
 | 
				
			|||||||
@ -28,7 +28,6 @@
 | 
				
			|||||||
            <lay-button type="primary" size="sm">导出Excel</lay-button>
 | 
					            <lay-button type="primary" size="sm">导出Excel</lay-button>
 | 
				
			||||||
          </div>
 | 
					          </div>
 | 
				
			||||||
          <lay-table
 | 
					          <lay-table
 | 
				
			||||||
              :page="page"
 | 
					 | 
				
			||||||
              :columns="columns"
 | 
					              :columns="columns"
 | 
				
			||||||
              :dataSource="dataSource"
 | 
					              :dataSource="dataSource"
 | 
				
			||||||
              :even="true"
 | 
					              :even="true"
 | 
				
			||||||
 | 
				
			|||||||
@ -57,24 +57,25 @@
 | 
				
			|||||||
            </lay-row>
 | 
					            </lay-row>
 | 
				
			||||||
          </lay-form>
 | 
					          </lay-form>
 | 
				
			||||||
        </lay-card>
 | 
					        </lay-card>
 | 
				
			||||||
        <lay-table :page="page" :height="'100%'" :columns="columns" :loading="loading" :default-toolbar="true"
 | 
					        <lay-table :page="page" :height="500" :columns="columns" :loading="loading" :default-toolbar="true"
 | 
				
			||||||
                   :data-source="dataSource" v-model:selected-keys="selectedKeys" @change="change"
 | 
					                   :data-source="dataSource">
 | 
				
			||||||
                   @sortChange="sortChange">
 | 
					 | 
				
			||||||
          <template #status="{ row }">
 | 
					          <template #status="{ row }">
 | 
				
			||||||
            <lay-switch :model-value="row.status" @change="changeStatus($event, row)"></lay-switch>
 | 
					            <lay-tag type="danger" v-if="row.status == 0">已禁用</lay-tag>
 | 
				
			||||||
 | 
					            <lay-tag type="primary" v-if="row.status == 1">正常</lay-tag>
 | 
				
			||||||
          </template>
 | 
					          </template>
 | 
				
			||||||
          <template #role="{ row }">
 | 
					          <template #gender="{ row }">
 | 
				
			||||||
            <lay-tag color="#165DFF" variant="light">{{ row.role }}</lay-tag>
 | 
					            <span v-if="row.gender == 0">未选择</span>
 | 
				
			||||||
 | 
					            <span v-if="row.gender == 1">男</span>
 | 
				
			||||||
 | 
					            <span v-if="row.gender == 2">女</span>
 | 
				
			||||||
          </template>
 | 
					          </template>
 | 
				
			||||||
 | 
					 | 
				
			||||||
          <template v-slot:toolbar>
 | 
					          <template v-slot:toolbar>
 | 
				
			||||||
            <lay-button size="sm" type="primary" @click="changeAddShow()">新增</lay-button>
 | 
					            <lay-button size="sm" type="primary" @click="changeAddShow()">新增</lay-button>
 | 
				
			||||||
            <lay-button size="sm" @click="toRemove">删除</lay-button>
 | 
					 | 
				
			||||||
          </template>
 | 
					          </template>
 | 
				
			||||||
          <template v-slot:operator="{ row }">
 | 
					          <template v-slot:operator="{ row }">
 | 
				
			||||||
            <lay-button size="xs" border="green" border-style="dashed">编辑
 | 
					            <lay-button size="xs" border="green" border-style="dashed" @click="edit(row)">
 | 
				
			||||||
 | 
					              编辑
 | 
				
			||||||
            </lay-button>
 | 
					            </lay-button>
 | 
				
			||||||
            <lay-popconfirm content="确定要删除此用户吗?" @confirm="confirm" @cancel="cancel">
 | 
					            <lay-popconfirm trigger="click" content="确定要删除此用户吗?" @confirm="del(row)">
 | 
				
			||||||
              <lay-button size="xs" border="red" border-style="dashed">删除</lay-button>
 | 
					              <lay-button size="xs" border="red" border-style="dashed">删除</lay-button>
 | 
				
			||||||
            </lay-popconfirm>
 | 
					            </lay-popconfirm>
 | 
				
			||||||
          </template>
 | 
					          </template>
 | 
				
			||||||
@ -85,7 +86,9 @@
 | 
				
			|||||||
      <div style="padding: 20px">
 | 
					      <div style="padding: 20px">
 | 
				
			||||||
        <lay-form :model="model11" ref="layFormRef11" required mode="inline">
 | 
					        <lay-form :model="model11" ref="layFormRef11" required mode="inline">
 | 
				
			||||||
          <lay-form-item label="头像" prop="username">
 | 
					          <lay-form-item label="头像" prop="username">
 | 
				
			||||||
            <lay-upload ref="uploadRef" :number="1" field="file" :size="1000" :headers="{token:userStore.token}" url="/api/common/upload" @cutdone="getCutDone" v-model="file1" :auto="true"  acceptMime="images" @cutcancel="getCutCancel" :cut="false" :cutOptions="cutOptions" @done="getFileDone">
 | 
					            <lay-upload ref="uploadRef" :number="1" field="file" :size="1000" :headers="{ token: userStore.token }"
 | 
				
			||||||
 | 
					                        url="/api/common/upload" @cutdone="getCutDone" v-model="file1" :auto="true" acceptMime="images"
 | 
				
			||||||
 | 
					                        :cut="false" :cutOptions="cutOptions" @done="getFileDone">
 | 
				
			||||||
              <template #preview>
 | 
					              <template #preview>
 | 
				
			||||||
                <div class="easy-wrap" v-if="model11.avatar">
 | 
					                <div class="easy-wrap" v-if="model11.avatar">
 | 
				
			||||||
                  <img :src="model11.avatar" style="width: 100px;height: 100px"/>
 | 
					                  <img :src="model11.avatar" style="width: 100px;height: 100px"/>
 | 
				
			||||||
@ -96,8 +99,8 @@
 | 
				
			|||||||
          <lay-form-item label="账户" prop="username">
 | 
					          <lay-form-item label="账户" prop="username">
 | 
				
			||||||
            <lay-input v-model="model11.username" size="lg" placeholder="请输入账户"></lay-input>
 | 
					            <lay-input v-model="model11.username" size="lg" placeholder="请输入账户"></lay-input>
 | 
				
			||||||
          </lay-form-item>
 | 
					          </lay-form-item>
 | 
				
			||||||
          <lay-form-item label="密码" prop="password" v-if="title === '新增'">
 | 
					          <lay-form-item label="密码" prop="password">
 | 
				
			||||||
            <lay-input type="password" v-model="model11.password" size="lg" placeholder="请输入密码"></lay-input>
 | 
					            <lay-input v-model="model11.password" size="lg" placeholder="请输入密码"></lay-input>
 | 
				
			||||||
          </lay-form-item>
 | 
					          </lay-form-item>
 | 
				
			||||||
          <lay-form-item label="姓名" prop="nickname">
 | 
					          <lay-form-item label="姓名" prop="nickname">
 | 
				
			||||||
            <lay-input v-model="model11.nickname" size="lg" placeholder="请输入姓名"></lay-input>
 | 
					            <lay-input v-model="model11.nickname" size="lg" placeholder="请输入姓名"></lay-input>
 | 
				
			||||||
@ -108,6 +111,10 @@
 | 
				
			|||||||
          <lay-form-item label="身份证号" prop="member_code">
 | 
					          <lay-form-item label="身份证号" prop="member_code">
 | 
				
			||||||
            <lay-input v-model="model11.member_code" size="lg" placeholder="请输入身份证号"></lay-input>
 | 
					            <lay-input v-model="model11.member_code" size="lg" placeholder="请输入身份证号"></lay-input>
 | 
				
			||||||
          </lay-form-item>
 | 
					          </lay-form-item>
 | 
				
			||||||
 | 
					          <lay-form-item label="生日" prop="birthday">
 | 
				
			||||||
 | 
					            <lay-date-picker v-model="model11.birthday" placeholder="请选择生日" allow-clear
 | 
				
			||||||
 | 
					                             style="width:180px;"></lay-date-picker>
 | 
				
			||||||
 | 
					          </lay-form-item>
 | 
				
			||||||
          <lay-form-item label="邮箱" prop="email">
 | 
					          <lay-form-item label="邮箱" prop="email">
 | 
				
			||||||
            <lay-input v-model="model11.email" size="lg" placeholder="请输入邮箱"></lay-input>
 | 
					            <lay-input v-model="model11.email" size="lg" placeholder="请输入邮箱"></lay-input>
 | 
				
			||||||
          </lay-form-item>
 | 
					          </lay-form-item>
 | 
				
			||||||
@ -122,20 +129,27 @@
 | 
				
			|||||||
            </lay-select>
 | 
					            </lay-select>
 | 
				
			||||||
          </lay-form-item>
 | 
					          </lay-form-item>
 | 
				
			||||||
          <lay-form-item label="科室" prop="group_id">
 | 
					          <lay-form-item label="科室" prop="group_id">
 | 
				
			||||||
            <lay-cascader size="lg" style="width:180px;" :options="data" search :replaceFields="{ label:'name',value:'id',children:'children'}" v-model="model11.group_id" placeholder="选择科室" allow-clear></lay-cascader>
 | 
					            <lay-cascader :checkStrictly="false" size="lg" style="width:180px;" :options="data" search
 | 
				
			||||||
 | 
					                          :replaceFields="replaceFields"
 | 
				
			||||||
 | 
					                          v-model="model11.group_id"
 | 
				
			||||||
 | 
					                          placeholder="选择科室" allow-clear></lay-cascader>
 | 
				
			||||||
          </lay-form-item>
 | 
					          </lay-form-item>
 | 
				
			||||||
          <lay-form-item label="党支部" prop="party_id">
 | 
					          <lay-form-item label="党支部" prop="party_id">
 | 
				
			||||||
            <lay-cascader size="lg" style="width:180px;" :options="partyList" search :replaceFields="{ label:'name',value:'id',children:'children'}" v-model="model11.party_id" placeholder="选择党支部" allow-clear></lay-cascader>
 | 
					            <lay-cascader size="lg" style="width:180px;" :options="partyList" search
 | 
				
			||||||
 | 
					                          :replaceFields="replaceFields"
 | 
				
			||||||
 | 
					                          v-model="model11.party_id"
 | 
				
			||||||
 | 
					                          placeholder="选择党支部" allow-clear></lay-cascader>
 | 
				
			||||||
          </lay-form-item>
 | 
					          </lay-form-item>
 | 
				
			||||||
          <lay-form-item label="角色组" prop="auth_group_id">
 | 
					          <lay-form-item label="角色组" prop="auth_group_id">
 | 
				
			||||||
            <lay-select v-model="model11.auth_group_id" style="width:180px;" placeholder="选择党角色组">
 | 
					            <lay-select v-model="model11.auth_group_id" style="width:180px;" placeholder="选择党角色组">
 | 
				
			||||||
              <lay-select-option size="lg" v-for="item in authList" :value="item.id" :label="item.name"></lay-select-option>
 | 
					              <lay-select-option size="lg" v-for="item in authList" :value="item.id"
 | 
				
			||||||
 | 
					                                 :label="item.name"></lay-select-option>
 | 
				
			||||||
            </lay-select>
 | 
					            </lay-select>
 | 
				
			||||||
          </lay-form-item>
 | 
					          </lay-form-item>
 | 
				
			||||||
          <lay-form-item label="状态" prop="status">
 | 
					          <lay-form-item label="状态" prop="status">
 | 
				
			||||||
            <lay-select v-model="model11.status" placeholder="请选择" size="lg" style="width:180px;">
 | 
					            <lay-select v-model="model11.status" placeholder="请选择" size="lg" style="width:180px;">
 | 
				
			||||||
              <lay-select-option :value="1" label="禁用"></lay-select-option>
 | 
					              <lay-select-option :value="0" label="禁用"></lay-select-option>
 | 
				
			||||||
              <lay-select-option :value="2" label="启用"></lay-select-option>
 | 
					              <lay-select-option :value="1" label="启用"></lay-select-option>
 | 
				
			||||||
            </lay-select>
 | 
					            </lay-select>
 | 
				
			||||||
          </lay-form-item>
 | 
					          </lay-form-item>
 | 
				
			||||||
        </lay-form>
 | 
					        </lay-form>
 | 
				
			||||||
@ -146,13 +160,27 @@
 | 
				
			|||||||
<script setup lang="ts">
 | 
					<script setup lang="ts">
 | 
				
			||||||
import {ref, reactive, onMounted} from 'vue'
 | 
					import {ref, reactive, onMounted} from 'vue'
 | 
				
			||||||
import {layer} from '@layui/layui-vue'
 | 
					import {layer} from '@layui/layui-vue'
 | 
				
			||||||
import {authGroupData, menuData, menuDataAdd, menuDataEdit, partyGroupData, userGroupData} from "@/api/module/home";
 | 
					import {
 | 
				
			||||||
 | 
					  authGroupData,
 | 
				
			||||||
 | 
					  userData,
 | 
				
			||||||
 | 
					  userDataAdd,
 | 
				
			||||||
 | 
					  userDataEdit,
 | 
				
			||||||
 | 
					  userDataDel,
 | 
				
			||||||
 | 
					  partyGroupData,
 | 
				
			||||||
 | 
					  userGroupData
 | 
				
			||||||
 | 
					} from "@/api/module/home";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const cutUrl = ref("");
 | 
					const cutUrl = ref("");
 | 
				
			||||||
const uploadRef = ref(null)
 | 
					const uploadRef = ref(null)
 | 
				
			||||||
import {useRouter} from 'vue-router'
 | 
					import {useRouter} from 'vue-router'
 | 
				
			||||||
import {useUserStore} from "@/store/user";
 | 
					import {useUserStore} from "@/store/user";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const userStore = useUserStore()
 | 
					const userStore = useUserStore()
 | 
				
			||||||
const groupList= ref([]);
 | 
					const replaceFields = {
 | 
				
			||||||
 | 
					  label: 'name',
 | 
				
			||||||
 | 
					  value: 'id',
 | 
				
			||||||
 | 
					  children: 'children'
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
const cutOptions = {
 | 
					const cutOptions = {
 | 
				
			||||||
  copperOption: {
 | 
					  copperOption: {
 | 
				
			||||||
    center: false,
 | 
					    center: false,
 | 
				
			||||||
@ -164,24 +192,28 @@ const getCutDone=(res)=>{
 | 
				
			|||||||
  console.log("getCutDone", res);
 | 
					  console.log("getCutDone", res);
 | 
				
			||||||
  cutUrl.value = res.msg;
 | 
					  cutUrl.value = res.msg;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					 | 
				
			||||||
const getCutCancel=(res)=>{
 | 
					 | 
				
			||||||
  console.log("getCutCancel",res);
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const getFileDone = (res) => {
 | 
					const getFileDone = (res) => {
 | 
				
			||||||
 | 
					 | 
				
			||||||
  var date = JSON.parse(res.data);
 | 
					  var date = JSON.parse(res.data);
 | 
				
			||||||
  console.log("getFileDone", date);
 | 
					  console.log("getFileDone", date);
 | 
				
			||||||
  model11.avatar = date.data.fullurl;
 | 
					  model11.avatar = date.data.fullurl;
 | 
				
			||||||
  //uploadRef.value.submit()
 | 
					  //uploadRef.value.submit()
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
onMounted(() => {
 | 
					onMounted(() => {
 | 
				
			||||||
  console.log(userStore.token);
 | 
					  getUserList();
 | 
				
			||||||
  getLeftList();
 | 
					  getLeftList();
 | 
				
			||||||
  getPartyList();
 | 
					  getPartyList();
 | 
				
			||||||
  getAuthList();
 | 
					  getAuthList();
 | 
				
			||||||
})
 | 
					})
 | 
				
			||||||
 | 
					const getUserList = () => {
 | 
				
			||||||
 | 
					  userData({group_id: leftId.value, size: page.limit, page: page.current}).then((res) => {
 | 
				
			||||||
 | 
					    console.log(res)
 | 
				
			||||||
 | 
					    if (res.code == 1) {
 | 
				
			||||||
 | 
					      dataSource.value = res.data;
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					      layer.msg(res.msg, {icon: 2})
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  })
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
const partyList = ref([])
 | 
					const partyList = ref([])
 | 
				
			||||||
const getPartyList = () => {
 | 
					const getPartyList = () => {
 | 
				
			||||||
  partyGroupData({}).then((res) => {
 | 
					  partyGroupData({}).then((res) => {
 | 
				
			||||||
@ -193,6 +225,7 @@ const getPartyList = () => {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
  })
 | 
					  })
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					const leftId = ref(0);
 | 
				
			||||||
const getLeftList = () => {
 | 
					const getLeftList = () => {
 | 
				
			||||||
  userGroupData({}).then((res) => {
 | 
					  userGroupData({}).then((res) => {
 | 
				
			||||||
    console.log(res)
 | 
					    console.log(res)
 | 
				
			||||||
@ -217,10 +250,6 @@ const getAuthList = () => {
 | 
				
			|||||||
//左侧
 | 
					//左侧
 | 
				
			||||||
const data = ref([])
 | 
					const data = ref([])
 | 
				
			||||||
const selectedKey = ref('')
 | 
					const selectedKey = ref('')
 | 
				
			||||||
const selectedNode = ref({
 | 
					 | 
				
			||||||
  id: 0,
 | 
					 | 
				
			||||||
  title: ''
 | 
					 | 
				
			||||||
})
 | 
					 | 
				
			||||||
const isFold = ref(false)
 | 
					const isFold = ref(false)
 | 
				
			||||||
const searchQuery = ref({
 | 
					const searchQuery = ref({
 | 
				
			||||||
  username: '',
 | 
					  username: '',
 | 
				
			||||||
@ -237,83 +266,29 @@ function toReset() {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function handleClick(node: any) {
 | 
					function handleClick(node: any) {
 | 
				
			||||||
  selectedNode.value = JSON.parse(JSON.stringify(node))
 | 
					  console.log(node);
 | 
				
			||||||
  page.current = selectedNode.value.id
 | 
					  leftId.value = node.id
 | 
				
			||||||
  change(page)
 | 
					  getUserList();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const loading = ref(false)
 | 
					const loading = ref(false)
 | 
				
			||||||
const selectedKeys = ref()
 | 
					const page = reactive({current: 1, limit: 10, total: 1})
 | 
				
			||||||
const page = reactive({current: 1, limit: 10, total: 100})
 | 
					 | 
				
			||||||
const columns = ref([
 | 
					const columns = ref([
 | 
				
			||||||
  {title: '选项', width: '55px', type: 'checkbox', fixed: 'left'},
 | 
					  {title: '编号', width: '80px', key: 'id',align: 'center'},
 | 
				
			||||||
  {title: '编号', width: '80px', key: 'id', fixed: 'left', sort: 'id'},
 | 
					  {title: '帐号', width: '100px', key: 'username',align: 'center'},
 | 
				
			||||||
  {title: '用户名', width: '100px', key: 'username', sort: 'username'},
 | 
					  {title: '姓名', width: '100px', key: 'nickname',align: 'center'},
 | 
				
			||||||
  {title: '昵称', width: '100px', key: 'nickname'},
 | 
					  {title: '手机号', width: '120px', key: 'mobile',align: 'center'},
 | 
				
			||||||
  {title: '手机号', width: '120px', key: 'mobile'},
 | 
					  {title: '工号', width: '150px', key: 'work_number',align: 'center'},
 | 
				
			||||||
  {title: '邮箱', width: '150px', key: 'email'},
 | 
					  {title: '性别', width: '80px', key: 'gender', customSlot: 'gender',align: 'center'},
 | 
				
			||||||
  {
 | 
					  {title: '身份证号', width: '180px', key: 'member_code',align: 'center'},
 | 
				
			||||||
    title: '性别', width: '80px', key: 'gender',
 | 
					  {title: '状态', width: '100px', key: 'status', customSlot: 'status',align: 'center'},
 | 
				
			||||||
    customSlot: 'gender',
 | 
					  {title: '操作', width: '150px', customSlot: 'operator', key: 'operator', fixed: 'right',align: 'center'}
 | 
				
			||||||
    render: (row: any) => {
 | 
					 | 
				
			||||||
      return row.gender === 1 ? '男' : row.gender === 2 ? '女' : '未知'
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {title: '身份证号', width: '180px', key: 'member_code'},
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    title: '创建时间', width: '160px', key: 'createtime',
 | 
					 | 
				
			||||||
    render: (row: any) => {
 | 
					 | 
				
			||||||
      return new Date(row.createtime * 1000).toLocaleString()
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {title: '状态', width: '100px', key: 'status', customSlot: 'status'},
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    title: '操作',
 | 
					 | 
				
			||||||
    width: '150px',
 | 
					 | 
				
			||||||
    customSlot: 'operator',
 | 
					 | 
				
			||||||
    key: 'operator',
 | 
					 | 
				
			||||||
    fixed: 'right'
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
])
 | 
					])
 | 
				
			||||||
const change = (page: any) => {
 | 
					const change = (page: any) => {
 | 
				
			||||||
  loading.value = true
 | 
					
 | 
				
			||||||
  setTimeout(() => {
 | 
					 | 
				
			||||||
    dataSource.value = loadDataSource(page.current, page.limit)
 | 
					 | 
				
			||||||
    loading.value = false
 | 
					 | 
				
			||||||
  }, 1000)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
const sortChange = (key: any, sort: number) => {
 | 
					 | 
				
			||||||
  layer.msg(`字段${key} - 排序${sort}, 你可以利用 sort-change 实现服务端排序`)
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
const dataSource = ref([])
 | 
					const dataSource = ref([])
 | 
				
			||||||
const changeStatus = (isChecked: boolean, row: any) => {
 | 
					
 | 
				
			||||||
  dataSource.value.forEach((item) => {
 | 
					 | 
				
			||||||
    if (item.id === row.id) {
 | 
					 | 
				
			||||||
      layer.msg('Success', {icon: 1}, () => {
 | 
					 | 
				
			||||||
        item.status = isChecked
 | 
					 | 
				
			||||||
      })
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  })
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
const remove = () => {
 | 
					 | 
				
			||||||
  layer.msg(selectedKeys.value, {area: '50%'})
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
const loadDataSource = (page: number, pageSize: number) => {
 | 
					 | 
				
			||||||
  var response = []
 | 
					 | 
				
			||||||
  var startIndex = (page - 1) * pageSize + 1
 | 
					 | 
				
			||||||
  var endIndex = page * pageSize
 | 
					 | 
				
			||||||
  for (var i = startIndex; i <= endIndex; i++) {
 | 
					 | 
				
			||||||
    response.push({
 | 
					 | 
				
			||||||
      id: `${i}`,
 | 
					 | 
				
			||||||
      account: `user${i}`,
 | 
					 | 
				
			||||||
      sex: '男',
 | 
					 | 
				
			||||||
      name: `用户${i}`,
 | 
					 | 
				
			||||||
      joinTime: '2022-02-09 18:34:56',
 | 
					 | 
				
			||||||
      role: '普通用户',
 | 
					 | 
				
			||||||
      status: true
 | 
					 | 
				
			||||||
    })
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  return response
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
const model11 = reactive({
 | 
					const model11 = reactive({
 | 
				
			||||||
  username: '',
 | 
					  username: '',
 | 
				
			||||||
  nickname: '',
 | 
					  nickname: '',
 | 
				
			||||||
@ -325,125 +300,115 @@ const model11 = reactive({
 | 
				
			|||||||
  password: '',
 | 
					  password: '',
 | 
				
			||||||
  status: 1,
 | 
					  status: 1,
 | 
				
			||||||
  auth_group_id: '',
 | 
					  auth_group_id: '',
 | 
				
			||||||
  group_id: '',
 | 
					  group_id: [],
 | 
				
			||||||
  party_id: '',
 | 
					  party_id: [],
 | 
				
			||||||
  avatar: ''
 | 
					  avatar: '',
 | 
				
			||||||
 | 
					  birthday: '',
 | 
				
			||||||
 | 
					  group_level: '',
 | 
				
			||||||
 | 
					  party_level: '',
 | 
				
			||||||
})
 | 
					})
 | 
				
			||||||
const layFormRef11 = ref()
 | 
					const layFormRef11 = ref()
 | 
				
			||||||
const addShow = ref(false)
 | 
					const addShow = ref(false)
 | 
				
			||||||
const title = ref('新增')
 | 
					const title = ref('新增')
 | 
				
			||||||
const changeAddShow = () => {
 | 
					const changeAddShow = () => {
 | 
				
			||||||
 | 
					  addIsEdit.value = 1;
 | 
				
			||||||
 | 
					  // 重置表单数据
 | 
				
			||||||
 | 
					  Object.assign(model11, {
 | 
				
			||||||
 | 
					    username: '',
 | 
				
			||||||
 | 
					    nickname: '',
 | 
				
			||||||
 | 
					    mobile: '',
 | 
				
			||||||
 | 
					    email: '',
 | 
				
			||||||
 | 
					    member_code: '',
 | 
				
			||||||
 | 
					    work_number: '',
 | 
				
			||||||
 | 
					    gender: 0,
 | 
				
			||||||
 | 
					    password: '',
 | 
				
			||||||
 | 
					    status: 1,
 | 
				
			||||||
 | 
					    auth_group_id: '',
 | 
				
			||||||
 | 
					    group_id: [],
 | 
				
			||||||
 | 
					    party_id: [],
 | 
				
			||||||
 | 
					    avatar: '',
 | 
				
			||||||
 | 
					    birthday: '',
 | 
				
			||||||
 | 
					    group_level: '',
 | 
				
			||||||
 | 
					    party_level: '',
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
  addShow.value = true;
 | 
					  addShow.value = true;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
const submit11 = function () {
 | 
					 | 
				
			||||||
  layFormRef11.value.validate((isValidate: any, model: any, errors: any) => {
 | 
					 | 
				
			||||||
    layer.open({
 | 
					 | 
				
			||||||
      type: 1,
 | 
					 | 
				
			||||||
      title: '表单提交结果',
 | 
					 | 
				
			||||||
      content: `<div style="padding: 10px"><p>是否通过 : ${isValidate}</p> <p>表单数据 : ${JSON.stringify(
 | 
					 | 
				
			||||||
          model
 | 
					 | 
				
			||||||
      )} </p> <p>错误信息 : ${JSON.stringify(errors)}</p></div>`,
 | 
					 | 
				
			||||||
      shade: false,
 | 
					 | 
				
			||||||
      isHtmlFragment: true,
 | 
					 | 
				
			||||||
      btn: [
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
          text: '确认',
 | 
					 | 
				
			||||||
          callback(index: any) {
 | 
					 | 
				
			||||||
            layer.close(index)
 | 
					 | 
				
			||||||
          }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      ],
 | 
					 | 
				
			||||||
      area: '500px'
 | 
					 | 
				
			||||||
    })
 | 
					 | 
				
			||||||
  })
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
// 清除校验
 | 
					 | 
				
			||||||
const clearValidate11 = function () {
 | 
					 | 
				
			||||||
  layFormRef11.value.clearValidate()
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
// 重置表单
 | 
					 | 
				
			||||||
const reset11 = function () {
 | 
					 | 
				
			||||||
  layFormRef11.value.reset()
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
function toRemove() {
 | 
					const addIsEdit = ref(1)
 | 
				
			||||||
  if (selectedKeys.value.length == 0) {
 | 
					 | 
				
			||||||
    layer.msg('您未选择数据,请先选择要删除的数据', {icon: 3, time: 2000})
 | 
					 | 
				
			||||||
    return
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  layer.confirm('您将删除所有选中的数据?', {
 | 
					 | 
				
			||||||
    title: '提示',
 | 
					 | 
				
			||||||
    btn: [
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
        text: '确定',
 | 
					 | 
				
			||||||
        callback: (id: any) => {
 | 
					 | 
				
			||||||
          layer.msg('您已成功删除')
 | 
					 | 
				
			||||||
          layer.close(id)
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
        text: '取消',
 | 
					 | 
				
			||||||
        callback: (id: any) => {
 | 
					 | 
				
			||||||
          layer.msg('您已取消操作')
 | 
					 | 
				
			||||||
          layer.close(id)
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    ]
 | 
					 | 
				
			||||||
  })
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
function toSubmit() {
 | 
					 | 
				
			||||||
  layer.msg('保存成功!', {icon: 1, time: 1000})
 | 
					 | 
				
			||||||
  visible11.value = false
 | 
					 | 
				
			||||||
  visible22.value = false
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
function toCancel() {
 | 
					 | 
				
			||||||
  visible11.value = false
 | 
					 | 
				
			||||||
  visible22.value = false
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
function confirm() {
 | 
					 | 
				
			||||||
  layer.msg('您已成功删除')
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
function cancel() {
 | 
					 | 
				
			||||||
  layer.msg('您已取消操作')
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const model22 = ref({
 | 
					 | 
				
			||||||
  organization: '',
 | 
					 | 
				
			||||||
  name: '',
 | 
					 | 
				
			||||||
  fullName: '',
 | 
					 | 
				
			||||||
  code: '',
 | 
					 | 
				
			||||||
  type: '',
 | 
					 | 
				
			||||||
  sort: 0,
 | 
					 | 
				
			||||||
  remark: ''
 | 
					 | 
				
			||||||
})
 | 
					 | 
				
			||||||
const visible22 = ref(false)
 | 
					 | 
				
			||||||
const addButton = ref([
 | 
					const addButton = ref([
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    text: "确认",
 | 
					    text: "确认",
 | 
				
			||||||
    callback: async () => {
 | 
					    callback: async () => {
 | 
				
			||||||
      console.log(model11);
 | 
					      console.log(model11);
 | 
				
			||||||
      // if (addData.title == '') {
 | 
					      //return;
 | 
				
			||||||
      //   layer.msg('菜单名称不能为空!', { icon: 2 })
 | 
					      // 字段空值判断
 | 
				
			||||||
 | 
					      // if (!model11.username) {
 | 
				
			||||||
 | 
					      //   layer.msg('用户名不能为空!', {icon: 2});
 | 
				
			||||||
      //   return;
 | 
					      //   return;
 | 
				
			||||||
      // }
 | 
					      // }
 | 
				
			||||||
      // if (addIsEdit.value == 1) {
 | 
					      // if (!model11.nickname) {
 | 
				
			||||||
      //   addData.name=addData.title;
 | 
					      //   layer.msg('姓名不能为空!', {icon: 2});
 | 
				
			||||||
      //   var res = await menuDataAdd(addData);
 | 
					      //   return;
 | 
				
			||||||
      // } else {
 | 
					 | 
				
			||||||
      //   var res = await menuDataEdit(addData);
 | 
					 | 
				
			||||||
      // }
 | 
					      // }
 | 
				
			||||||
      // console.log(res)
 | 
					      // if (!model11.mobile) {
 | 
				
			||||||
      // if (res.code == 1) {
 | 
					      //   layer.msg('手机号不能为空!', {icon: 2});
 | 
				
			||||||
      //   layer.msg('提交成功!', { icon: 1 })
 | 
					      //   return;
 | 
				
			||||||
      //   addShow.value = false;
 | 
					 | 
				
			||||||
      //   getHierarchicalData();
 | 
					 | 
				
			||||||
      // } else {
 | 
					 | 
				
			||||||
      //   layer.msg(res.msg, { icon: 2 })
 | 
					 | 
				
			||||||
      // }
 | 
					      // }
 | 
				
			||||||
 | 
					      // if (!model11.email) {
 | 
				
			||||||
 | 
					      //   layer.msg('邮箱不能为空!', {icon: 2});
 | 
				
			||||||
 | 
					      //   return;
 | 
				
			||||||
 | 
					      // }
 | 
				
			||||||
 | 
					      // if (!model11.member_code) {
 | 
				
			||||||
 | 
					      //   layer.msg('身份证号不能为空!', {icon: 2});
 | 
				
			||||||
 | 
					      //   return;
 | 
				
			||||||
 | 
					      // }
 | 
				
			||||||
 | 
					      // if (!model11.birthday) {
 | 
				
			||||||
 | 
					      //   layer.msg('请选择生日!', {icon: 2});
 | 
				
			||||||
 | 
					      //   return;
 | 
				
			||||||
 | 
					      // }
 | 
				
			||||||
 | 
					      // if (!model11.work_number) {
 | 
				
			||||||
 | 
					      //   layer.msg('工号不能为空!', {icon: 2});
 | 
				
			||||||
 | 
					      //   return;
 | 
				
			||||||
 | 
					      // }
 | 
				
			||||||
 | 
					      // if (!model11.gender) {
 | 
				
			||||||
 | 
					      //   layer.msg('性别不能为空!', {icon: 2});
 | 
				
			||||||
 | 
					      //   return;
 | 
				
			||||||
 | 
					      // }
 | 
				
			||||||
 | 
					      // if (!model11.auth_group_id) {
 | 
				
			||||||
 | 
					      //   layer.msg('角色组不能为空!', {icon: 2});
 | 
				
			||||||
 | 
					      //   return;
 | 
				
			||||||
 | 
					      // }
 | 
				
			||||||
 | 
					      // if (!model11.status) {
 | 
				
			||||||
 | 
					      //   layer.msg('状态不能为空!', {icon: 2});
 | 
				
			||||||
 | 
					      //   return;
 | 
				
			||||||
 | 
					      // }
 | 
				
			||||||
 | 
					      // if (!model11.group_id) {
 | 
				
			||||||
 | 
					      //   layer.msg('科室不能为空!', {icon: 2});
 | 
				
			||||||
 | 
					      //   return;
 | 
				
			||||||
 | 
					      // }
 | 
				
			||||||
 | 
					      // if (!model11.party_id) {
 | 
				
			||||||
 | 
					      //   layer.msg('党支部不能为空!', {icon: 2});
 | 
				
			||||||
 | 
					      //   return;
 | 
				
			||||||
 | 
					      // }
 | 
				
			||||||
 | 
					      model11.group_level = JSON.stringify(model11.group_id);
 | 
				
			||||||
 | 
					      model11.group_id = model11.group_id[model11.group_id.length - 1];
 | 
				
			||||||
 | 
					      console.log(model11.group_id)
 | 
				
			||||||
 | 
					      model11.party_level = JSON.stringify(model11.party_id);
 | 
				
			||||||
 | 
					      model11.party_id = model11.party_id[model11.party_id.length - 1];
 | 
				
			||||||
 | 
					      console.log(model11)
 | 
				
			||||||
 | 
					      if (addIsEdit.value == 1) {
 | 
				
			||||||
 | 
					        var res = await userDataAdd(model11);
 | 
				
			||||||
 | 
					      } else {
 | 
				
			||||||
 | 
					        var res = await userDataEdit(model11);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      console.log(res)
 | 
				
			||||||
 | 
					      if (res.code == 1) {
 | 
				
			||||||
 | 
					        layer.msg('提交成功!', {icon: 1})
 | 
				
			||||||
 | 
					        addShow.value = false;
 | 
				
			||||||
 | 
					        getUserList();
 | 
				
			||||||
 | 
					      } else {
 | 
				
			||||||
 | 
					        layer.msg(res.msg, {icon: 2})
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
@ -453,6 +418,48 @@ const addButton = ref([
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
])
 | 
					])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 搜索功能
 | 
				
			||||||
 | 
					const toSearch = () => {
 | 
				
			||||||
 | 
					  page.current = 1;
 | 
				
			||||||
 | 
					  change(page);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 删除用户
 | 
				
			||||||
 | 
					const del = async (row: any) => {
 | 
				
			||||||
 | 
					  const res = await userDataDel({id: row.id});
 | 
				
			||||||
 | 
					  if (res.code === 1) {
 | 
				
			||||||
 | 
					    layer.msg('删除成功', {icon: 1});
 | 
				
			||||||
 | 
					    getUserList()
 | 
				
			||||||
 | 
					  } else {
 | 
				
			||||||
 | 
					    layer.msg(res.msg, {icon: 2});
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 编辑用户
 | 
				
			||||||
 | 
					const edit = (row: any) => {
 | 
				
			||||||
 | 
					  addIsEdit.value = 2;
 | 
				
			||||||
 | 
					  model11.gender = parseInt(row.gender);
 | 
				
			||||||
 | 
					  model11.status = parseInt(row.status);
 | 
				
			||||||
 | 
					  model11.auth_group_id = parseInt(row.auth_group_id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  model11.group_id = JSON.parse(row.group_level);
 | 
				
			||||||
 | 
					  model11.party_id = JSON.parse(row.party_level);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  model11.username = row.username;
 | 
				
			||||||
 | 
					  model11.nickname = row.nickname;
 | 
				
			||||||
 | 
					  model11.mobile = row.mobile;
 | 
				
			||||||
 | 
					  model11.email = row.email;
 | 
				
			||||||
 | 
					  model11.member_code = row.member_code;
 | 
				
			||||||
 | 
					  model11.work_number = row.work_number;
 | 
				
			||||||
 | 
					  model11.birthday = row.birthday;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  model11.avatar = row.avatar;
 | 
				
			||||||
 | 
					  model11.id = row.id;
 | 
				
			||||||
 | 
					  console.log(model11)
 | 
				
			||||||
 | 
					  addShow.value = true;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
</script>
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<style scoped>
 | 
					<style scoped>
 | 
				
			||||||
 | 
				
			|||||||
@ -11,6 +11,9 @@
 | 
				
			|||||||
          <span v-if="data.status == '1'">启用</span>
 | 
					          <span v-if="data.status == '1'">启用</span>
 | 
				
			||||||
          <span v-if="data.status == '0'">禁用</span>
 | 
					          <span v-if="data.status == '0'">禁用</span>
 | 
				
			||||||
        </template>
 | 
					        </template>
 | 
				
			||||||
 | 
					        <template v-slot:weigh="{ data }">
 | 
				
			||||||
 | 
					          <lay-input v-model="data.weigh" type="number" @input="weighUpdate(data)"/>
 | 
				
			||||||
 | 
					        </template>
 | 
				
			||||||
        <template v-slot:operator="{ data }">
 | 
					        <template v-slot:operator="{ data }">
 | 
				
			||||||
          <lay-space size="lg">
 | 
					          <lay-space size="lg">
 | 
				
			||||||
             <span style="color: #00A394;cursor: pointer" v-if="data.pid==0"
 | 
					             <span style="color: #00A394;cursor: pointer" v-if="data.pid==0"
 | 
				
			||||||
@ -36,6 +39,9 @@
 | 
				
			|||||||
          <lay-form-item required label="菜单URL" prop="url">
 | 
					          <lay-form-item required label="菜单URL" prop="url">
 | 
				
			||||||
            <lay-input v-model="addData.url" placeholder="请输入菜单URL"></lay-input>
 | 
					            <lay-input v-model="addData.url" placeholder="请输入菜单URL"></lay-input>
 | 
				
			||||||
          </lay-form-item>
 | 
					          </lay-form-item>
 | 
				
			||||||
 | 
					          <lay-form-item required label="排序" prop="url">
 | 
				
			||||||
 | 
					            <lay-input v-model="addData.weigh" placeholder="请输入排序"></lay-input>
 | 
				
			||||||
 | 
					          </lay-form-item>
 | 
				
			||||||
          <lay-form-item required label="状态" prop="status">
 | 
					          <lay-form-item required label="状态" prop="status">
 | 
				
			||||||
            <lay-select v-model="addData.status" placeholder="请选择">
 | 
					            <lay-select v-model="addData.status" placeholder="请选择">
 | 
				
			||||||
              <lay-select-option :value="1" label="启用"></lay-select-option>
 | 
					              <lay-select-option :value="1" label="启用"></lay-select-option>
 | 
				
			||||||
@ -70,7 +76,17 @@ const addData = reactive({
 | 
				
			|||||||
  name:'',
 | 
					  name:'',
 | 
				
			||||||
  status: 1,
 | 
					  status: 1,
 | 
				
			||||||
  pid: 0,
 | 
					  pid: 0,
 | 
				
			||||||
 | 
					  weigh:0,
 | 
				
			||||||
})
 | 
					})
 | 
				
			||||||
 | 
					const weighUpdate = async (data) => {
 | 
				
			||||||
 | 
					  console.log(data)
 | 
				
			||||||
 | 
					  var res = await menuDataEdit({id:data.id,weigh:data.weigh});
 | 
				
			||||||
 | 
					  console.log(res)
 | 
				
			||||||
 | 
					  if(res.code==1){
 | 
				
			||||||
 | 
					    layer.msg('提交成功!', { icon: 1 })
 | 
				
			||||||
 | 
					    getHierarchicalData();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
const addShowMsd = (data, pid) => {
 | 
					const addShowMsd = (data, pid) => {
 | 
				
			||||||
  console.log(data);
 | 
					  console.log(data);
 | 
				
			||||||
  addShow.value = true;
 | 
					  addShow.value = true;
 | 
				
			||||||
@ -80,6 +96,7 @@ const addShowMsd = (data, pid) => {
 | 
				
			|||||||
  addData.icon = '';
 | 
					  addData.icon = '';
 | 
				
			||||||
  addData.url = '';
 | 
					  addData.url = '';
 | 
				
			||||||
  addData.status = 1;
 | 
					  addData.status = 1;
 | 
				
			||||||
 | 
					  addData.weigh=0;
 | 
				
			||||||
  addIsEdit.value = 1;
 | 
					  addIsEdit.value = 1;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
const columns6 = [
 | 
					const columns6 = [
 | 
				
			||||||
@ -104,6 +121,12 @@ const columns6 = [
 | 
				
			|||||||
    customSlot: 'status',
 | 
					    customSlot: 'status',
 | 
				
			||||||
    key: "status"
 | 
					    key: "status"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    title: "排序",
 | 
				
			||||||
 | 
					    width: "70px",
 | 
				
			||||||
 | 
					    key: "weigh",
 | 
				
			||||||
 | 
					    customSlot: 'weigh',
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    title: '操作',
 | 
					    title: '操作',
 | 
				
			||||||
    width: '180px',
 | 
					    width: '180px',
 | 
				
			||||||
@ -126,6 +149,7 @@ const openNew = () => {
 | 
				
			|||||||
  addData.icon = '';
 | 
					  addData.icon = '';
 | 
				
			||||||
  addData.url = '';
 | 
					  addData.url = '';
 | 
				
			||||||
  addData.status = 1;
 | 
					  addData.status = 1;
 | 
				
			||||||
 | 
					  addData.weigh = 0;
 | 
				
			||||||
  addShow.value = true;
 | 
					  addShow.value = true;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -149,6 +173,7 @@ const editShowMsd = (data) => {
 | 
				
			|||||||
  addData.name = data.title;
 | 
					  addData.name = data.title;
 | 
				
			||||||
  addData.icon = data.icon;
 | 
					  addData.icon = data.icon;
 | 
				
			||||||
  addData.url = data.url;
 | 
					  addData.url = data.url;
 | 
				
			||||||
 | 
					  addData.weigh = data.weigh;
 | 
				
			||||||
  addData.status = parseInt(data.status);
 | 
					  addData.status = parseInt(data.status);
 | 
				
			||||||
  addIsEdit.value = 2;
 | 
					  addIsEdit.value = 2;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -76,6 +76,7 @@
 | 
				
			|||||||
              :default-expand-all="true"
 | 
					              :default-expand-all="true"
 | 
				
			||||||
              :tail-node-icon="false"
 | 
					              :tail-node-icon="false"
 | 
				
			||||||
              :data="data9"
 | 
					              :data="data9"
 | 
				
			||||||
 | 
					              :check-strictly="true"
 | 
				
			||||||
              :showCheckbox="showCheckbox2"
 | 
					              :showCheckbox="showCheckbox2"
 | 
				
			||||||
              v-model:checkedKeys="addData.rules"
 | 
					              v-model:checkedKeys="addData.rules"
 | 
				
			||||||
              :replaceFields="replaceFields">
 | 
					              :replaceFields="replaceFields">
 | 
				
			||||||
@ -119,7 +120,9 @@ const editDo = (data) => {
 | 
				
			|||||||
  visible11.value = true;
 | 
					  visible11.value = true;
 | 
				
			||||||
  addData.name = data.name;
 | 
					  addData.name = data.name;
 | 
				
			||||||
  addData.describe = data.describe;
 | 
					  addData.describe = data.describe;
 | 
				
			||||||
  addData.rules = data.rules;
 | 
					  addData.rules = data.rules.split(',').map(Number);
 | 
				
			||||||
 | 
					  addData.id = data.id;
 | 
				
			||||||
 | 
					  console.log(addData.rules)
 | 
				
			||||||
  addIsEdit.value = 2;
 | 
					  addIsEdit.value = 2;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
const getList = () => {
 | 
					const getList = () => {
 | 
				
			||||||
 | 
				
			|||||||
@ -28,7 +28,6 @@
 | 
				
			|||||||
            <lay-button type="primary" size="sm">导出Excel</lay-button>
 | 
					            <lay-button type="primary" size="sm">导出Excel</lay-button>
 | 
				
			||||||
          </div>
 | 
					          </div>
 | 
				
			||||||
          <lay-table
 | 
					          <lay-table
 | 
				
			||||||
              :page="page"
 | 
					 | 
				
			||||||
              :columns="columns"
 | 
					              :columns="columns"
 | 
				
			||||||
              :dataSource="dataSource"
 | 
					              :dataSource="dataSource"
 | 
				
			||||||
              :even="true"
 | 
					              :even="true"
 | 
				
			||||||
 | 
				
			|||||||
@ -8,6 +8,7 @@ import { resolve } from "path";
 | 
				
			|||||||
const excludeComponents = ['LightIcon','DarkIcon']
 | 
					const excludeComponents = ['LightIcon','DarkIcon']
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default defineConfig({
 | 
					export default defineConfig({
 | 
				
			||||||
 | 
					  base: '/dist/',
 | 
				
			||||||
  resolve: {
 | 
					  resolve: {
 | 
				
			||||||
    alias: [
 | 
					    alias: [
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
@ -19,14 +20,10 @@ export default defineConfig({
 | 
				
			|||||||
  server: {
 | 
					  server: {
 | 
				
			||||||
    proxy: {
 | 
					    proxy: {
 | 
				
			||||||
      '/api': {
 | 
					      '/api': {
 | 
				
			||||||
        // 用于开发环境下的转发请求
 | 
					        target: 'http://yfyd.hschool.com.cn',
 | 
				
			||||||
        // 更多请参考:https://vitejs.dev/config/#server-proxy
 | 
					 | 
				
			||||||
        target: 'http://192.168.10.158/',
 | 
					 | 
				
			||||||
        pathRewrite: {
 | 
					 | 
				
			||||||
          '^/api': ''
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
        changeOrigin: true,
 | 
					        changeOrigin: true,
 | 
				
			||||||
      },
 | 
					        rewrite: (path) => path.replace(/^\/api/, '')
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  plugins: [
 | 
					  plugins: [
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user