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']
|
||||||
|
5720
package-lock.json
generated
5720
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"
|
appStore.tab ? 'has-tab' : '',
|
||||||
:locale="appStore.locale"
|
appStore.collapse ? 'collapse' : '',
|
||||||
>
|
appStore.greyMode ? 'grey-mode' : ''
|
||||||
<lay-layout
|
]">
|
||||||
:class="[
|
|
||||||
appStore.tab ? 'has-tab' : '',
|
|
||||||
appStore.collapse ? 'collapse' : '',
|
|
||||||
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()"
|
? 'layui-icon-screen-restore'
|
||||||
:type="
|
: 'layui-icon-screen-full'
|
||||||
isFullscreen
|
"></lay-icon>
|
||||||
? 'layui-icon-screen-restore'
|
|
||||||
: 'layui-icon-screen-full'
|
|
||||||
"
|
|
||||||
></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>
|
||||||
@ -224,8 +167,8 @@ export default {
|
|||||||
appStore.collapse
|
appStore.collapse
|
||||||
? '60px'
|
? '60px'
|
||||||
: appStore.subfield && appStore.subfieldPosition == 'side'
|
: appStore.subfield && appStore.subfieldPosition == 'side'
|
||||||
? '280px'
|
? '280px'
|
||||||
: '220px'
|
: '220px'
|
||||||
)
|
)
|
||||||
const router = useRouter()
|
const router = useRouter()
|
||||||
|
|
||||||
@ -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')
|
||||||
@ -348,7 +292,7 @@ export default {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*取消默认a标签的padding:0 20px,否则扩大图标后容器变形*/
|
/*取消默认a标签的padding:0 20px,否则扩大图标后容器变形*/
|
||||||
.layui-header .layui-nav-item > a {
|
.layui-header .layui-nav-item>a {
|
||||||
padding: 0 !important;
|
padding: 0 !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -419,25 +363,24 @@ 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;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
@ -446,9 +389,10 @@ export default {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.layui-logo{
|
|
||||||
|
.layui-logo {
|
||||||
color: #fff;
|
color: #fff;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
border-bottom:0px!important;
|
border-bottom: 0px !important;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
@ -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>
|
||||||
@ -83,7 +73,7 @@ function toChangPage(id: any) {
|
|||||||
border-left: none;
|
border-left: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.global-tab > i {
|
.global-tab>i {
|
||||||
width: 40px;
|
width: 40px;
|
||||||
background: white;
|
background: white;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
@ -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;
|
||||||
|
@ -13,24 +13,56 @@ const router = createRouter({
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Router 前置拦截
|
* Router 前置拦截
|
||||||
*
|
*
|
||||||
* 1.验证 token 存在, 并且有效, 否则 -> login.vue
|
* 1.验证 token 存在, 并且有效, 否则 -> login.vue
|
||||||
* 2.验证 permission 存在, 否则 -> 403.vue
|
* 2.验证 permission 存在, 否则 -> 403.vue
|
||||||
* 3.验证 router 是否存在, 否则 -> 404.vue
|
* 3.验证 router 是否存在, 否则 -> 404.vue
|
||||||
*
|
*
|
||||||
* @param to 目标
|
* @param to 目标
|
||||||
* @param from 来至
|
* @param from 来至
|
||||||
*/
|
*/
|
||||||
router.beforeEach((to: RouteLocationNormalized, from: RouteLocationNormalized, next: NavigationGuardNext) => {
|
router.beforeEach((to: RouteLocationNormalized, from: RouteLocationNormalized, next: NavigationGuardNext) => {
|
||||||
NProgress.start();
|
NProgress.start();
|
||||||
|
|
||||||
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'})
|
||||||
} else {
|
} else {
|
||||||
next();
|
next();
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@ -39,4 +71,4 @@ router.afterEach(() => {
|
|||||||
NProgress.done();
|
NProgress.done();
|
||||||
})
|
})
|
||||||
|
|
||||||
export default router
|
export default router
|
||||||
|
@ -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',
|
||||||
|
@ -35,4 +35,4 @@ export const useAppStore = defineStore({
|
|||||||
storage: localStorage,
|
storage: localStorage,
|
||||||
paths: ['tab', 'locale', 'theme', 'logo', 'level', 'inverted', 'breadcrumb', 'sideTheme', 'greyMode', 'accordion', 'keepAliveList', 'themeVariable', 'subfield', 'tagsTheme'],
|
paths: ['tab', 'locale', 'theme', 'logo', 'level', 'inverted', 'breadcrumb', 'sideTheme', 'greyMode', 'accordion', 'keepAliveList', 'themeVariable', 'subfield', 'tagsTheme'],
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
@ -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'],
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
@ -3,9 +3,9 @@
|
|||||||
<div class="login-root">
|
<div class="login-root">
|
||||||
<div class="login-main">
|
<div class="login-main">
|
||||||
<img class="login-one-ball"
|
<img class="login-one-ball"
|
||||||
src="https://assets.codehub.cn/micro-frontend/login/fca1d5960ccf0dfc8e32719d8a1d80d2.png" />
|
src="https://assets.codehub.cn/micro-frontend/login/fca1d5960ccf0dfc8e32719d8a1d80d2.png"/>
|
||||||
<img class="login-two-ball"
|
<img class="login-two-ball"
|
||||||
src="https://assets.codehub.cn/micro-frontend/login/4bcf705dad662b33a4fc24aaa67f6234.png" />
|
src="https://assets.codehub.cn/micro-frontend/login/4bcf705dad662b33a4fc24aaa67f6234.png"/>
|
||||||
<div class="login-container">
|
<div class="login-container">
|
||||||
<div class="login-side">
|
<div class="login-side">
|
||||||
<div class="login-bg-title">
|
<div class="login-bg-title">
|
||||||
@ -24,147 +24,113 @@
|
|||||||
<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>
|
||||||
<!-- <lay-tab-item title="二维码" id="2">-->
|
<!-- <lay-tab-item title="二维码" id="2">-->
|
||||||
<!-- <div style="width: 200px; height: 250px; margin: 0 auto">-->
|
<!-- <div style="width: 200px; height: 250px; margin: 0 auto">-->
|
||||||
<!-- <lay-qrcode text="http://www.layui-vue.com" :width="200" color="#000"-->
|
<!-- <lay-qrcode text="http://www.layui-vue.com" :width="200" color="#000"-->
|
||||||
<!-- style="margin: 10px 0 20px"></lay-qrcode>-->
|
<!-- style="margin: 10px 0 20px"></lay-qrcode>-->
|
||||||
<!-- <div style="text-align: center; cursor: pointer" @click="toRefreshQrcode">-->
|
<!-- <div style="text-align: center; cursor: pointer" @click="toRefreshQrcode">-->
|
||||||
<!-- <lay-icon type="layui-icon-refresh-three"> </lay-icon>-->
|
<!-- <lay-icon type="layui-icon-refresh-three"> </lay-icon>-->
|
||||||
<!-- 刷新二维码-->
|
<!-- 刷新二维码-->
|
||||||
<!-- </div>-->
|
<!-- </div>-->
|
||||||
<!-- </div>-->
|
<!-- </div>-->
|
||||||
<!-- </lay-tab-item>-->
|
<!-- </lay-tab-item>-->
|
||||||
</lay-tab>
|
</lay-tab>
|
||||||
<!-- <lay-line style="margin: 34px 0px;">Other login methods</lay-line>-->
|
<!-- <lay-line style="margin: 34px 0px;">Other login methods</lay-line>-->
|
||||||
<!-- <ul class="other-ways">-->
|
<!-- <ul class="other-ways">-->
|
||||||
<!-- <li>-->
|
<!-- <li>-->
|
||||||
<!-- <div class="line-container">-->
|
<!-- <div class="line-container">-->
|
||||||
<!-- <img class="icon" src="../../assets/login/w.svg" />-->
|
<!-- <img class="icon" src="../../assets/login/w.svg" />-->
|
||||||
<!-- <p class="text">微信</p>-->
|
<!-- <p class="text">微信</p>-->
|
||||||
<!-- </div>-->
|
<!-- </div>-->
|
||||||
<!-- </li>-->
|
<!-- </li>-->
|
||||||
<!-- <li>-->
|
<!-- <li>-->
|
||||||
<!-- <div class="line-container">-->
|
<!-- <div class="line-container">-->
|
||||||
<!-- <img class="icon" src="../../assets/login/q.svg" />-->
|
<!-- <img class="icon" src="../../assets/login/q.svg" />-->
|
||||||
<!-- <p class="text">钉钉</p>-->
|
<!-- <p class="text">钉钉</p>-->
|
||||||
<!-- </div>-->
|
<!-- </div>-->
|
||||||
<!-- </li>-->
|
<!-- </li>-->
|
||||||
<!-- <li>-->
|
<!-- <li>-->
|
||||||
<!-- <div class="line-container">-->
|
<!-- <div class="line-container">-->
|
||||||
<!-- <img class="icon" src="../../assets/login/a.svg" />-->
|
<!-- <img class="icon" src="../../assets/login/a.svg" />-->
|
||||||
<!-- <p class="text">Gitee</p>-->
|
<!-- <p class="text">Gitee</p>-->
|
||||||
<!-- </div>-->
|
<!-- </div>-->
|
||||||
<!-- </li>-->
|
<!-- </li>-->
|
||||||
<!-- <li>-->
|
<!-- <li>-->
|
||||||
<!-- <div class="line-container">-->
|
<!-- <div class="line-container">-->
|
||||||
<!-- <img class="icon" src="../../assets/login/f.svg" />-->
|
<!-- <img class="icon" src="../../assets/login/f.svg" />-->
|
||||||
<!-- <p class="text">Github</p>-->
|
<!-- <p class="text">Github</p>-->
|
||||||
<!-- </div>-->
|
<!-- </div>-->
|
||||||
<!-- </li>-->
|
<!-- </li>-->
|
||||||
<!-- </ul>-->
|
<!-- </ul>-->
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<Vcode :show="isShow" @success="onSuccess"/>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts" setup>
|
||||||
import { login } from '../../api/module/home'
|
import Vcode from 'vue3-puzzle-vcode'
|
||||||
import { verificationImg, loginQrcode } from '../../api/module/commone'
|
import {login} from '../../api/module/home'
|
||||||
import { defineComponent, onMounted, reactive, ref } from 'vue'
|
import {verificationImg, loginQrcode} from '../../api/module/commone'
|
||||||
import { useRouter } from 'vue-router'
|
import {defineComponent, onMounted, reactive, ref} from 'vue'
|
||||||
import { useUserStore } from '../../store/user'
|
import {useRouter} from 'vue-router'
|
||||||
import { layer } from '@layui/layer-vue'
|
import {useUserStore} from '../../store/user'
|
||||||
|
import {layer} from '@layui/layer-vue'
|
||||||
|
|
||||||
export default defineComponent({
|
const onSuccess = () => {
|
||||||
setup() {
|
isShow.value = false;
|
||||||
const router = useRouter()
|
loginSubmit();
|
||||||
const userStore = useUserStore()
|
};
|
||||||
const method = ref('1')
|
const onShowLogin = () => {
|
||||||
const verificationImgUrl = ref('')
|
isShow.value = true;
|
||||||
const loging = ref(false);
|
}
|
||||||
const loginQrcodeText = ref('')
|
const isShow = ref(false);
|
||||||
const remember = ref(false)
|
const router = useRouter()
|
||||||
const loginForm = reactive({
|
const userStore = useUserStore()
|
||||||
username: 'admin',
|
const method = ref('1')
|
||||||
password: 'admin888',
|
const loging = ref(false);
|
||||||
vercode: 'DqJFN'
|
const remember = ref(false)
|
||||||
})
|
const loginForm = reactive({
|
||||||
|
username: '',
|
||||||
const loginSubmit = async () => {
|
password: ''
|
||||||
loging.value = true;
|
|
||||||
login(loginForm).then((res) => {
|
|
||||||
console.log(res)
|
|
||||||
setTimeout(() => {
|
|
||||||
loging.value = false;
|
|
||||||
if (res.code == 1) {
|
|
||||||
layer.msg('登陆成功!', { icon: 1 }, async () => {
|
|
||||||
userStore.token = res.data.token;
|
|
||||||
userStore.userInfo=res.data.user;
|
|
||||||
await userStore.loadMenus()
|
|
||||||
await userStore.loadPermissions()
|
|
||||||
router.push('/home')
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
layer.msg(msg, { icon: 2 })
|
|
||||||
}
|
|
||||||
}, 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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const loginSubmit = async () => {
|
||||||
|
loging.value = true;
|
||||||
|
login(loginForm).then((res) => {
|
||||||
|
console.log(res)
|
||||||
|
setTimeout(() => {
|
||||||
|
loging.value = false;
|
||||||
|
if (res.code == 1) {
|
||||||
|
layer.msg('登陆成功!', {icon: 1}, async () => {
|
||||||
|
userStore.token = res.data.token;
|
||||||
|
userStore.userInfo = res.data.user;
|
||||||
|
await userStore.loadMenus()
|
||||||
|
await userStore.loadPermissions()
|
||||||
|
router.push('/home')
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
layer.msg(res.msg, {icon: 2})
|
||||||
|
}
|
||||||
|
}, 1000)
|
||||||
|
})
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped>
|
<style scoped>
|
||||||
@ -353,7 +319,7 @@ export default defineComponent({
|
|||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
background: #fff;
|
background: #fff;
|
||||||
box-shadow: 0 1px 2px 0 rgb(9 30 66 / 4%), 0 1px 4px 0 rgb(9 30 66 / 10%),
|
box-shadow: 0 1px 2px 0 rgb(9 30 66 / 4%), 0 1px 4px 0 rgb(9 30 66 / 10%),
|
||||||
0 0 1px 0 rgb(9 30 66 / 10%);
|
0 0 1px 0 rgb(9 30 66 / 10%);
|
||||||
}
|
}
|
||||||
|
|
||||||
.line-container .text {
|
.line-container .text {
|
||||||
|
@ -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"
|
||||||
|
@ -4,10 +4,10 @@
|
|||||||
<div :style="{ width: isFold ? `0px` : `300px` }" class="left-tree">
|
<div :style="{ width: isFold ? `0px` : `300px` }" class="left-tree">
|
||||||
<!-- tree -->
|
<!-- tree -->
|
||||||
<div v-show="!isFold">
|
<div v-show="!isFold">
|
||||||
科室列表
|
科室列表
|
||||||
</div>
|
</div>
|
||||||
<lay-tree v-show="!isFold" style="margin-top: 10px" :data="data" v-model:selectedKey="selectedKey"
|
<lay-tree v-show="!isFold" style="margin-top: 10px" :data="data" v-model:selectedKey="selectedKey"
|
||||||
:showLine="false" @node-click="handleClick">
|
:showLine="false" @node-click="handleClick">
|
||||||
<template #title="{ data }">
|
<template #title="{ data }">
|
||||||
<span :class="selectedKey == data.id ? 'isChecked' : ''">
|
<span :class="selectedKey == data.id ? 'isChecked' : ''">
|
||||||
{{ data.name }}
|
{{ data.name }}
|
||||||
@ -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,
|
||||||
@ -160,28 +188,32 @@ const cutOptions = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
const file1 = ref([]);
|
const file1 = ref([]);
|
||||||
const getCutDone=(res)=>{
|
const getCutDone = (res) => {
|
||||||
console.log("getCutDone",res);
|
console.log("getCutDone", res);
|
||||||
cutUrl.value = res.msg;
|
cutUrl.value = res.msg;
|
||||||
};
|
};
|
||||||
|
const getFileDone = (res) => {
|
||||||
const getCutCancel=(res)=>{
|
var date = JSON.parse(res.data);
|
||||||
console.log("getCutCancel",res);
|
console.log("getFileDone", date);
|
||||||
};
|
|
||||||
|
|
||||||
const getFileDone=(res)=>{
|
|
||||||
|
|
||||||
var date= JSON.parse(res.data);
|
|
||||||
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) => {
|
||||||
@ -189,17 +221,18 @@ const getPartyList = () => {
|
|||||||
if (res.code == 1) {
|
if (res.code == 1) {
|
||||||
partyList.value = res.data;
|
partyList.value = res.data;
|
||||||
} else {
|
} else {
|
||||||
layer.msg(res.msg, { icon: 2 })
|
layer.msg(res.msg, {icon: 2})
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
const leftId = ref(0);
|
||||||
const getLeftList = () => {
|
const getLeftList = () => {
|
||||||
userGroupData({}).then((res) => {
|
userGroupData({}).then((res) => {
|
||||||
console.log(res)
|
console.log(res)
|
||||||
if (res.code == 1) {
|
if (res.code == 1) {
|
||||||
data.value = res.data;
|
data.value = res.data;
|
||||||
} else {
|
} else {
|
||||||
layer.msg(res.msg, { icon: 2 })
|
layer.msg(res.msg, {icon: 2})
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@ -210,17 +243,13 @@ const getAuthList = () => {
|
|||||||
if (res.code == 1) {
|
if (res.code == 1) {
|
||||||
authList.value = res.data;
|
authList.value = res.data;
|
||||||
} else {
|
} else {
|
||||||
layer.msg(res.msg, { icon: 2 })
|
layer.msg(res.msg, {icon: 2})
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
//左侧
|
//左侧
|
||||||
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