From dd2576bf9887b29c47d128cd6c070f8d70756865 Mon Sep 17 00:00:00 2001 From: Your Name <123456> Date: 星期四, 21 七月 2022 18:27:13 +0800 Subject: [PATCH] 更新首页登录页 --- src/views/system/menu/index.vue | 361 ++++++----- src/views/system/role/index.vue | 4 src/views/system/user/index.vue | 382 ++++++----- src/assets/style/index.scss | 10 src/views/system/role/component/roleDialog.vue | 250 ++++---- src/utils/request.ts | 30 src/views/system/department/component/deptDialog.vue | 274 ++++---- src/views/homeMenu/homeMenu.vue | 110 ++- src/views/system/user/component/userDialog.vue | 402 ++++++------ src/views/system/department/index.vue | 1 src/main.ts | 2 src/views/system/menu/component/menuDialog.vue | 25 12 files changed, 967 insertions(+), 884 deletions(-) diff --git a/src/assets/style/index.scss b/src/assets/style/index.scss new file mode 100644 index 0000000..f7be0d0 --- /dev/null +++ b/src/assets/style/index.scss @@ -0,0 +1,10 @@ +.input-box{ + width: 200px !important; +} +.basic-line{ + display: inline-block; + padding-left: 10px; +} +.page-position{ + float: right; +} diff --git a/src/main.ts b/src/main.ts index acd3d24..dd69054 100644 --- a/src/main.ts +++ b/src/main.ts @@ -5,7 +5,7 @@ import { directive } from '/@/utils/directive'; import { i18n } from '/@/i18n/index'; import other from '/@/utils/other'; - +import '/@/assets/style/index.scss'; import ElementPlus from 'element-plus'; import 'element-plus/dist/index.css'; import '/@/theme/index.scss'; diff --git a/src/utils/request.ts b/src/utils/request.ts index 9de0cfe..a6c21e4 100644 --- a/src/utils/request.ts +++ b/src/utils/request.ts @@ -29,16 +29,34 @@ ); service.interceptors.response.use( - (response) => { // 对响应数据做点什么 - if(response.data.code && (response.data.code ==='A0215' || response.data.code === 'A0214' || response.data.code === 'A0213')){ - Session.clear() - window.location.href = '/' - return Promise.reject(response) + if (response.data.code && response.data.code === 'A0213') { + ElMessage.error('用户uid不存在'); + setTimeout(() => { + Session.clear(); + window.location.href = '/'; + }, 2000); + } else if (response.data.code && response.data.code === 'A0215') { + ElMessage.error('token失效'); + Session.clear(); + window.location.href = '/'; } // if(response.data.code && response.data.code !== '200'){ - return Promise.resolve(response) + return Promise.resolve(response); + // + // (response) => { + // // 对响应数据做点什么 + // if(response.data.code && (response.data.code ==='A0215' || response.data.code === 'A0214' || response.data.code === 'A0213')){ + // Session.clear() + // window.location.href = '/' + // return Promise.reject(response) + // } + // // if(response.data.code && response.data.code !== '200'){ + // return Promise.resolve(response) + + + // } // Session.clear() // window.location.href = '/' diff --git a/src/views/homeMenu/homeMenu.vue b/src/views/homeMenu/homeMenu.vue index 8326f96..01718e3 100644 --- a/src/views/homeMenu/homeMenu.vue +++ b/src/views/homeMenu/homeMenu.vue @@ -21,11 +21,11 @@ <div class="menuGrid"> <div class="gridCont"> <el-row :gutter="20"> - <el-col :span="6"><div class="grid-content" @click="renderMenu('2')"><div class="itemTit">双重预防系统</div><img class="iconImg" src="../../assets/menu/icon4.png"><img class="bgImg" src="../../assets/menu/card4.png"></div></el-col> - <el-col :span="6"><div class="grid-content" @click="renderMenu('3')"><div class="itemTit">特殊作业系统</div><img class="iconImg" src="../../assets/menu/icon7.png"><img class="bgImg" src="../../assets/menu/card7.png"></div></el-col> - <el-col :span="6"><div class="grid-content" @click="renderMenu('4')"><div class="itemTit">智能巡检系统</div><img class="iconImg" src="../../assets/menu/icon8.png"><img class="bgImg" src="../../assets/menu/card8.png"></div></el-col> + <el-col :span="6"><div class="grid-content" @click="render('2')"><div class="itemTit">双重预防系统</div><img class="iconImg" src="../../assets/menu/icon4.png"><img class="bgImg" src="../../assets/menu/card4.png"></div></el-col> + <el-col :span="6"><div class="grid-content" @click="render('3')"><div class="itemTit">特殊作业系统</div><img class="iconImg" src="../../assets/menu/icon7.png"><img class="bgImg" src="../../assets/menu/card7.png"></div></el-col> + <el-col :span="6"><div class="grid-content" @click="render('4')"><div class="itemTit">智能巡检系统</div><img class="iconImg" src="../../assets/menu/icon8.png"><img class="bgImg" src="../../assets/menu/card8.png"></div></el-col> <el-col :span="6"> - <div class="grid-content" @click="renderMenu('5')"> + <div class="grid-content" @click="render('5')"> <div class="itemTit">安全风险综合 <br>预警预报平台 </div> @@ -35,15 +35,15 @@ </el-col> </el-row> <el-row :gutter="20"> - <el-col :span="6"><div class="grid-content grid-content-2" @click="renderMenu('6')"><div class="itemTit">应急管理系统</div><img class="iconImg" src="../../assets/menu/icon5.png"><img class="bgImg" src="../../assets/menu/card5.png"></div></el-col> - <el-col :span="6"><div class="grid-content grid-content-2" @click="renderMenu('7')"><div class="itemTit">目标责任管理系统</div><img class="iconImg" src="../../assets/menu/icon2.png"><img class="bgImg" src="../../assets/menu/card2.png"></div></el-col> - <el-col :span="6"><div class="grid-content grid-content-2" @click="renderMenu('8')"><div class="itemTit">事故管理系统</div><img class="iconImg" src="../../assets/menu/icon6.png"><img class="bgImg" src="../../assets/menu/card6.png"></div></el-col> - <el-col :span="6"><div class="grid-content grid-content-2" @click="renderMenu('9')"><div class="itemTit">设备综合管控系统</div><img class="iconImg" src="../../assets/menu/icon9.png"><img class="bgImg" src="../../assets/menu/card9.png"></div></el-col> + <el-col :span="6"><div class="grid-content grid-content-2" @click="render('6')"><div class="itemTit">应急管理系统</div><img class="iconImg" src="../../assets/menu/icon5.png"><img class="bgImg" src="../../assets/menu/card5.png"></div></el-col> + <el-col :span="6"><div class="grid-content grid-content-2" @click="render('7')"><div class="itemTit">目标责任管理系统</div><img class="iconImg" src="../../assets/menu/icon2.png"><img class="bgImg" src="../../assets/menu/card2.png"></div></el-col> + <el-col :span="6"><div class="grid-content grid-content-2" @click="render('8')"><div class="itemTit">事故管理系统</div><img class="iconImg" src="../../assets/menu/icon6.png"><img class="bgImg" src="../../assets/menu/card6.png"></div></el-col> + <el-col :span="6"><div class="grid-content grid-content-2" @click="render('9')"><div class="itemTit">设备综合管控系统</div><img class="iconImg" src="../../assets/menu/icon9.png"><img class="bgImg" src="../../assets/menu/card9.png"></div></el-col> </el-row> <el-row :gutter="20"> - <el-col :span="6"><div class="grid-content grid-content-3" @click="renderMenu('10')"><div class="itemTit">安全知识图谱系统</div><img class="iconImg" src="../../assets/menu/icon3.png"><img class="bgImg" src="../../assets/menu/card3.png"></div></el-col> - <el-col :span="9"><div class="grid-content grid-content-3" @click="renderMenu('11')"><div class="itemTit">危险化学品全生命周期安全<br>管理系统</div><img class="iconImg" src="../../assets/menu/icon10.png"><img class="bgImg" src="../../assets/menu/card10.png"></div></el-col> - <el-col :span="9"><div class="grid-content grid-content-3" @click="renderMenu('1')"><div class="itemTit">基础数据权限管理系统</div><img class="iconImg" src="../../assets/menu/icon11.png"><img class="bgImg" src="../../assets/menu/card11.png"></div></el-col> + <el-col :span="6"><div class="grid-content grid-content-3" @click="render('10')"><div class="itemTit">安全知识图谱系统</div><img class="iconImg" src="../../assets/menu/icon3.png"><img class="bgImg" src="../../assets/menu/card3.png"></div></el-col> + <el-col :span="9"><div class="grid-content grid-content-3" @click="render('11')"><div class="itemTit">危险化学品全生命周期安全<br>管理系统</div><img class="iconImg" src="../../assets/menu/icon10.png"><img class="bgImg" src="../../assets/menu/card10.png"></div></el-col> + <el-col :span="9"><div class="grid-content grid-content-3" @click="render('1')"><div class="itemTit">基础数据权限管理系统</div><img class="iconImg" src="../../assets/menu/icon11.png"><img class="bgImg" src="../../assets/menu/card11.png"></div></el-col> </el-row> </div> </div> @@ -66,27 +66,30 @@ import { useRoutesList } from '/@/stores/routesList'; // 定义接口来定义对象的类型 - interface LoginState { - tabsActiveName: string; - isScan: boolean; - } + interface LoginState { + tabsActiveName: string; + isScan: boolean; + count: number; + projectId: string; + } - export default defineComponent({ - name: 'loginIndex', - components: {}, - setup() { - const route = useRoute(); - const router = useRouter(); - const userInfo = useUserInfo() - const { userInfos } = storeToRefs(userInfo); + export default defineComponent({ + name: 'loginIndex', + components: {}, + setup() { + const router = useRouter(); + const userInfo = useUserInfo(); + const { userInfos } = storeToRefs(userInfo); const routeToStore = useRoutesList(pinia); const { routesList } = storeToRefs(routeToStore); - const storesThemeConfig = useThemeConfig(); - const { themeConfig } = storeToRefs(storesThemeConfig); - const state = reactive<LoginState>({ - tabsActiveName: 'account', - isScan: false, - }); + const storesThemeConfig = useThemeConfig(); + const { themeConfig } = storeToRefs(storesThemeConfig); + const state = reactive<LoginState>({ + tabsActiveName: 'account', + isScan: false, + count: 0, + projectId: '1' + }); // 获取布局配置信息 const getThemeConfig = computed(() => { return themeConfig.value; @@ -95,9 +98,40 @@ const onLoginOut = () => { console.log('退出登录') }; - const renderMenu = async (value: string) => { - Session.set('projectId', value); - userInfos.value.projectId = value; + //选择菜单 + const render = (value: string) => { + state.projectId = value; + renderMenu(); + }; + + const throttle = (renderMenu: any, delay: number) => { + let flag = true; + let count = 0; + return function () { + if (!flag) return; + flag = false; + if (count === 0) { + renderMenu.apply(); + count++; + flag = true; + } else { + setTimeout(() => { + renderMenu.apply(); + flag = true; + }, delay); + } + }; + }; + + //调用菜单方法 + const renderMenu = throttle(() => { + renderFun(); + }, 2000); + + //调后台菜单接口 + const renderFun = async () => { + Session.set('projectId', state.projectId); + userInfos.value.projectId = state.projectId; await initBackEndControlRoutes().then(() => { let linkToMenu = [...routesList.value]; if (linkToMenu && linkToMenu.length > 1) { @@ -127,12 +161,12 @@ // loginApp() }); return { - logoMini, - loginIconTwo, - getThemeConfig, - renderMenu, - toSpecialWorkSys, - ...toRefs(state), + render, + logoMini, + onLoginOut, + loginIconTwo, + getThemeConfig, + ...toRefs(state) }; }, }); diff --git a/src/views/system/department/component/deptDialog.vue b/src/views/system/department/component/deptDialog.vue index 1c2bf4a..03bbef1 100644 --- a/src/views/system/department/component/deptDialog.vue +++ b/src/views/system/department/component/deptDialog.vue @@ -1,154 +1,152 @@ <template> - <div class="system-add-dept-container"> - <el-dialog :title="title" v-model="isShowDialog" width="600px"> - <el-form :model="departmentForm" size="default" label-width="90px"> - <el-row :gutter="35"> - <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20"> - <el-form-item label="上级部门"> - <el-cascader - :options="deptData" - :props="{ emitPath: false, checkStrictly: true, value: 'depId', label: 'depName' }" - placeholder="请选择部门" - clearable - class="w100" - v-model="departmentForm.parentDepId" - > - </el-cascader> - </el-form-item> - </el-col> - <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20"> - <el-form-item label="部门名称"> - <el-input v-model="departmentForm.depName" placeholder="请输入部门名称" clearable></el-input> - </el-form-item> - </el-col> - <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20"> - <el-form-item label="部门描述"> - <el-input v-model="departmentForm.depInfo" type="textarea" placeholder="请输入部门描述" maxlength="150"></el-input> - </el-form-item> - </el-col> - </el-row> - </el-form> - <template #footer> - <span class="dialog-footer"> - <el-button @click="onCancel" size="default">取 消</el-button> - <el-button type="primary" @click="onSubmit" size="default">确 定</el-button> - </span> - </template> - </el-dialog> - </div> + <div class="system-add-dept-container"> + <el-dialog :title="title" v-model="isShowDialog" width="600px"> + <el-form :model="departmentForm" size="default" label-width="90px"> + <el-row :gutter="35"> + <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20"> + <el-form-item label="上级部门"> + <el-cascader + :options="deptData" + :props="{ emitPath: false, checkStrictly: true, value: 'depId', label: 'depName' }" + placeholder="请选择部门" + clearable + class="w100" + v-model="departmentForm.parentDepId" + > + </el-cascader> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20"> + <el-form-item label="部门名称"> + <el-input v-model="departmentForm.depName" placeholder="请输入部门名称" clearable></el-input> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20"> + <el-form-item label="部门描述"> + <el-input v-model="departmentForm.depInfo" type="textarea" placeholder="请输入部门描述" maxlength="150"></el-input> + </el-form-item> + </el-col> + </el-row> + </el-form> + <template #footer> + <span class="dialog-footer"> + <el-button @click="onCancel" size="default">取 消</el-button> + <el-button type="primary" v-throttle @click="onSubmit" size="default">确 定</el-button> + </span> + </template> + </el-dialog> + </div> </template> <script lang="ts"> import { ElMessage } from 'element-plus'; import { reactive, toRefs, onMounted, defineComponent } from 'vue'; -import { departmentApi } from "/@/api/system/department"; +import { departmentApi } from '/@/api/system/department'; // 定义接口来定义对象的类型 interface TableDataRow { - name:string, - info:string, - parentId:string, - id:number, + name: string; + info: string; + parentId: string; + id: number; } interface DeptSate { - title:string; - isShowDialog: boolean; - departmentForm: { - depName:string, - depInfo:string, - parentDepId:string - }; - deptData: Array<TableDataRow>; + title: string; + isShowDialog: boolean; + departmentForm: { + depName: string; + depInfo: string; + parentDepId: string; + }; + deptData: Array<TableDataRow>; } export default defineComponent({ - name: 'systemAddDept', - setup(prop,context) { - const state = reactive<DeptSate>({ - title:'', - isShowDialog: false, - departmentForm: { - depName:'', - parentDepId:'', - depInfo:'', - }, - deptData: [], // 部门数据 - }); - // 打开弹窗 - const openDialog = (type:string, value: any,departmentList: []) => { - state.isShowDialog = true; - state.deptData = JSON.parse(JSON.stringify(departmentList)) - if(type === '新增'){ - state.title = '新增部门' - state.departmentForm = { - depName:'', - parentDepId:'', - depInfo:'', - } - }else{ - state.title = '修改部门' - state.departmentForm = JSON.parse(JSON.stringify(value)) - } - }; - // 关闭弹窗 - const closeDialog = () => { - state.isShowDialog = false; - }; - // 取消 - const onCancel = () => { - closeDialog(); - }; - // 新增 - const onSubmit = async () => { - if(state.title === '新增部门'){ - let res = await departmentApi().addDepartment(state.departmentForm) - if(res.data.code === '200'){ - ElMessage({ - type:'success', - message:'部门新增成功', - duration:2000 - }) - closeDialog(); - context.emit('getDepartmentList') - }else{ - ElMessage({ - type:'warning', - message:res.data.msg - }) - } - }else{ - let res = await departmentApi().modDepartment(state.departmentForm) - if(res.data.code === '200'){ - ElMessage({ - type:'success', - message:'部门修改成功', - duration:2000 - }) - closeDialog(); - context.emit('getDepartmentList') - }else{ - ElMessage({ - type:'warning', - message:res.data.msg - }) - } - } - }; - // 初始化部门数据 - const initTableData = () => { - - }; - // 页面加载时 - onMounted(() => { - initTableData(); - }); - return { - openDialog, - closeDialog, - onCancel, - onSubmit, - ...toRefs(state), - }; - }, + name: 'systemAddDept', + setup(prop, context) { + const state = reactive<DeptSate>({ + title: '', + isShowDialog: false, + departmentForm: { + depName: '', + parentDepId: '', + depInfo: '' + }, + deptData: [] // 部门数据 + }); + // 打开弹窗 + const openDialog = (type: string, value: any, departmentList: []) => { + state.isShowDialog = true; + state.deptData = JSON.parse(JSON.stringify(departmentList)); + if (type === '新增') { + state.title = '新增部门'; + state.departmentForm = { + depName: '', + parentDepId: '', + depInfo: '' + }; + } else { + state.title = '修改部门'; + state.departmentForm = JSON.parse(JSON.stringify(value)); + } + }; + // 关闭弹窗 + const closeDialog = () => { + state.isShowDialog = false; + }; + // 取消 + const onCancel = () => { + closeDialog(); + }; + // 新增 + const onSubmit = async () => { + if (state.title === '新增部门') { + let res = await departmentApi().addDepartment(state.departmentForm); + if (res.data.code === '200') { + ElMessage({ + type: 'success', + message: '部门新增成功', + duration: 2000 + }); + closeDialog(); + context.emit('getDepartmentList'); + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + } else { + let res = await departmentApi().modDepartment(state.departmentForm); + if (res.data.code === '200') { + ElMessage({ + type: 'success', + message: '部门修改成功', + duration: 2000 + }); + closeDialog(); + context.emit('getDepartmentList'); + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + } + }; + // 初始化部门数据 + const initTableData = () => {}; + // 页面加载时 + onMounted(() => { + initTableData(); + }); + return { + openDialog, + closeDialog, + onCancel, + onSubmit, + ...toRefs(state) + }; + } }); </script> diff --git a/src/views/system/department/index.vue b/src/views/system/department/index.vue index 610f52a..8e85911 100644 --- a/src/views/system/department/index.vue +++ b/src/views/system/department/index.vue @@ -42,7 +42,6 @@ import { ElMessageBox, ElMessage } from 'element-plus'; import deptDialog from '/@/views/system/department/component/deptDialog.vue'; import {departmentApi} from "/@/api/system/department"; -import {useRoleApi} from "/@/api/system/role"; // 定义接口来定义对象的类型 interface TableDataRow { diff --git a/src/views/system/menu/component/menuDialog.vue b/src/views/system/menu/component/menuDialog.vue index 960a05d..eb7e633 100644 --- a/src/views/system/menu/component/menuDialog.vue +++ b/src/views/system/menu/component/menuDialog.vue @@ -18,40 +18,39 @@ </el-col> <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20"> <el-form-item label="菜单名称"> - <el-input v-model="ruleForm.meta.title" placeholder="格式:message.router.xxx" clearable></el-input> + <el-input v-model.trim="ruleForm.meta.title" placeholder="格式:message.router.xxx" clearable></el-input> </el-form-item> </el-col> <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20"> <el-form-item label="路由名称"> - <el-input v-model="ruleForm.name" placeholder="路由中的 name 值" clearable></el-input> + <el-input v-model.trim="ruleForm.name" placeholder="路由中的 name 值" clearable></el-input> </el-form-item> </el-col> <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20"> <el-form-item label="路由路径"> - <el-input v-model="ruleForm.path" placeholder="路由中的 path 值" clearable></el-input> + <el-input v-model.trim="ruleForm.path" placeholder="路由中的 path 值" clearable></el-input> </el-form-item> </el-col> <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20"> <el-form-item label="重定向"> - <el-input v-model="ruleForm.redirect" placeholder="请输入路由重定向" clearable></el-input> + <el-input v-model.trim="ruleForm.redirect" placeholder="请输入路由重定向" clearable></el-input> </el-form-item> </el-col> <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20"> <el-form-item label="菜单图标"> - <el-input placeholder="请输入菜单图标" v-model="ruleForm.meta.icon" type="all" /> + <el-input placeholder="请输入菜单图标" v-model.trim="ruleForm.meta.icon" type="all" /> <!-- <IconSelector placeholder="请输入菜单图标" v-model="ruleForm.meta.icon" type="all" />--> </el-form-item> </el-col> <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20"> <el-form-item label="组件路径"> - <el-input v-model="ruleForm.component" placeholder="组件路径" clearable></el-input> + <el-input v-model.trim="ruleForm.component" placeholder="组件路径" clearable></el-input> </el-form-item> </el-col> <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20"> <el-form-item label="权限标识"> <el-select v-model="ruleForm.meta.roles" multiple placeholder="取角色管理" clearable class="w100"> - <el-option label="admin" value="admin"></el-option> - <el-option label="common" value="common"></el-option> + <el-option v-for="item in roleList" :key="item.roleId" :value="item.roleCode" :label="item.roleName"></el-option> </el-select> </el-form-item> </el-col> @@ -86,7 +85,7 @@ <template #footer> <span class="dialog-footer"> <el-button @click="onCancel" size="default">取 消</el-button> - <el-button type="primary" @click="onSubmit" size="default">{{ buttonName }}</el-button> + <el-button type="primary" v-throttle @click="onSubmit" size="default">{{ buttonName }}</el-button> </span> </template> </el-dialog> @@ -97,12 +96,10 @@ import { reactive, toRefs, onMounted, defineComponent } from 'vue'; import { storeToRefs } from 'pinia'; import { useRoutesList } from '/@/stores/routesList'; -import { i18n } from '/@/i18n/index'; import IconSelector from '/@/components/iconSelector/index.vue'; import { useMenuApi } from '/@/api/system/menu/index'; import { ElMessageBox, ElMessage } from 'element-plus'; -import { Session } from '/@/utils/storage'; -// import { setBackEndControlRefreshRoutes } from "/@/router/backEnd"; + export default defineComponent({ name: 'systemAddMenu', @@ -137,6 +134,7 @@ }, btnPower: '' // 菜单类型为按钮时,权限标识 }, + roleList: [], menuData: [], // 上级菜单数据 projectList: [] }); @@ -152,8 +150,9 @@ return arr; }; // 打开弹窗 - const openDialog = (type: string, value: any, projectList: any, projectId: string) => { + const openDialog = (type: string, value: any, projectList: any, projectId: string, roleList: []) => { state.projectList = JSON.parse(JSON.stringify(projectList)); + state.roleList = roleList; state.isShowDialog = true; if (type === '新增') { state.buttonName = '新增'; diff --git a/src/views/system/menu/index.vue b/src/views/system/menu/index.vue index 652beff..f20befb 100644 --- a/src/views/system/menu/index.vue +++ b/src/views/system/menu/index.vue @@ -1,177 +1,200 @@ <template> - <div class="system-menu-container"> - <el-card shadow="hover"> - <div class="system-menu-search mb15"> - <el-select size="default" v-model="projectId" placeholder="请选择项目名称" style="max-width: 180px" @change="getMenuList()"> - <el-option - v-for="item in projectList" - :key="item.key" - :value="item.id" - :label="item.name" - > - </el-option> - </el-select> - <el-button size="default" type="primary" class="ml10" @click="getMenuList"> - <el-icon> - <ele-Search /> - </el-icon> - 查询 - </el-button> - <el-button size="default" type="success" class="ml10" @click="onOpenMenuDialog('新增')"> - <el-icon> - <ele-FolderAdd /> - </el-icon> - 新增菜单 - </el-button> - </div> - <el-table :data="menuTableData" style="width: 100%" row-key="path" :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"> - <el-table-column label="菜单名称" show-overflow-tooltip> - <template #default="scope"> - <SvgIcon :name="scope.row.meta.icon" /> - <span class="ml10">{{ scope.row.meta.title }}</span> - </template> - </el-table-column> - <el-table-column prop="path" label="路由路径" show-overflow-tooltip></el-table-column> - <el-table-column label="组件路径" show-overflow-tooltip> - <template #default="scope"> - <span>{{ scope.row.component }}</span> - </template> - </el-table-column> - <el-table-column label="权限标识" show-overflow-tooltip> - <template #default="scope"> - <span>{{ scope.row.meta.roles }}</span> - </template> - </el-table-column> - <el-table-column label="排序" show-overflow-tooltip width="80"> - <template #default="scope"> - {{ scope.$index }} - </template> - </el-table-column> - <el-table-column label="类型" show-overflow-tooltip width="80"> - <template #default="scope"> - <el-tag type="success" size="small">{{ scope.row.xx }}菜单</el-tag> - </template> - </el-table-column> - <el-table-column label="操作" show-overflow-tooltip width="140"> - <template #default="scope"> - <el-button size="small" text type="primary" @click="onOpenMenuDialog('新增')">新增</el-button> - <el-button size="small" text type="primary" @click="onOpenMenuDialog('修改',scope.row)">修改</el-button> - <el-button size="small" text type="primary" @click="deleteMenu(scope.row)">删除</el-button> - </template> - </el-table-column> - </el-table> - </el-card> - <menuDialog ref="menuDialog" @getMenuList="getMenuList"/> - </div> + <div class="system-menu-container"> + <el-card shadow="hover"> + <div class="system-menu-search mb15"> + <el-select size="default" v-model="projectId" placeholder="请选择项目名称" style="max-width: 180px" @change="getMenuList()"> + <el-option v-for="item in projectList" :key="item.key" :value="item.id" :label="item.name"> </el-option> + </el-select> + <el-button size="default" type="primary" class="ml10" @click="getMenuList"> + <el-icon> + <ele-Search /> + </el-icon> + 查询 + </el-button> + <el-button size="default" type="success" class="ml10" @click="onOpenMenuDialog('新增')"> + <el-icon> + <ele-FolderAdd /> + </el-icon> + 新增菜单 + </el-button> + </div> + <el-table :data="menuTableData" style="width: 100%" row-key="path" :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"> + <el-table-column label="菜单名称" show-overflow-tooltip> + <template #default="scope"> + <SvgIcon :name="scope.row.meta.icon" /> + <span class="ml10">{{ scope.row.meta.title }}</span> + </template> + </el-table-column> + <el-table-column prop="path" label="路由路径" show-overflow-tooltip></el-table-column> + <el-table-column label="组件路径" show-overflow-tooltip> + <template #default="scope"> + <span>{{ scope.row.component }}</span> + </template> + </el-table-column> + <el-table-column label="权限标识" show-overflow-tooltip> + <template #default="scope"> + <span>{{ parseRole(scope.row.meta.roles) }}</span> + </template> + </el-table-column> + <el-table-column label="排序" show-overflow-tooltip width="80"> + <template #default="scope"> + {{ scope.$index }} + </template> + </el-table-column> + <el-table-column label="类型" show-overflow-tooltip width="80"> + <template #default="scope"> + <el-tag type="success" size="small">{{ scope.row.xx }}菜单</el-tag> + </template> + </el-table-column> + <el-table-column label="操作" show-overflow-tooltip width="140"> + <template #default="scope"> + <el-button size="small" text type="primary" @click="onOpenMenuDialog('新增')">新增</el-button> + <el-button size="small" text type="primary" @click="onOpenMenuDialog('修改', scope.row)">修改</el-button> + <el-button size="small" text type="primary" @click="deleteMenu(scope.row)">删除</el-button> + </template> + </el-table-column> + </el-table> + </el-card> + <menuDialog ref="menuDialog" @getMenuList="getMenuList" /> + </div> </template> <script lang="ts"> - import { ref, toRefs, reactive, computed, onMounted, defineComponent } from 'vue'; - import { RouteRecordRaw } from 'vue-router'; - import { ElMessageBox, ElMessage } from 'element-plus'; - import { storeToRefs } from 'pinia'; - import { useRoutesList } from '/@/stores/routesList'; - import menuDialog from '/@/views/system/menu/component/menuDialog.vue'; - import {useMenuApi} from "/@/api/system/menu"; - import {Session} from "/@/utils/storage"; - import pinia from "/@/stores"; - import {dynamicRoutes} from "/@/router/route"; - import {useUserInfo} from "/@/stores/userInfo"; - import {initBackEndControlRoutes} from "/@/router/backEnd"; +import { ref, toRefs, reactive, onMounted, defineComponent } from 'vue'; +import { ElMessageBox, ElMessage } from 'element-plus'; +import { useRoutesList } from '/@/stores/routesList'; +import menuDialog from '/@/views/system/menu/component/menuDialog.vue'; +import { useMenuApi } from '/@/api/system/menu'; +import { Session } from '/@/utils/storage'; +import { initBackEndControlRoutes } from '/@/router/backEnd'; +import { useRoleApi } from '/@/api/system/role'; - export default defineComponent({ - name: 'systemMenu', - components: { menuDialog }, - setup() { - const menuDialog = ref(); - const storesRoutesList = useRoutesList(); - const state = reactive({ - projectId:'1', - menuData:[], - menuTableData:[], - projectList:[ - { id: '1', name: '基础数据权限管理系统', key: 0 }, - { id: '2', name: '双重预防系统', key: 1 }, - { id: '3', name: '特殊作业系统', key: 2 }, - { id: '4', name: '智能巡检系统', key: 3 }, - { id: '5', name: '安全风险综合预警预报平台', key: 4 }, - { id: '6', name: '应急管理系统', key: 5 }, - { id: '7', name: '目标责任管理系统', key: 6 }, - { id: '8', name: '事故管理系统', key: 7 }, - { id: '9', name: '设备综合管控系统', key: 8 }, - { id: '10', name: '安全知识图谱系统', key: 9 }, - { id: '11', name: '危险化学品全生命周期安全', key: 10 } - ], - }); - // // 获取 vuex 中的路由 - // const menuTableData = computed(() => { - // return routesList.value; - // }); - // 打开新增菜单弹窗 - const onOpenMenuDialog = (type: string,value: any) => { - menuDialog.value.openDialog(type,value,state.projectList,state.projectId); - }; - // 打开编辑菜单弹窗 - // 删除当前行 - const deleteMenu = (row: any) => { - ElMessageBox.confirm(`此操作将永久删除路由:${row.path}, 是否继续?`, '提示', { - confirmButtonText: '删除', - cancelButtonText: '取消', - type: 'warning', - }).then(async () => { - let res = await useMenuApi().deleteMenu({id:row.id}) - if(res.data.code ==='200'){ - ElMessage({ - type:'success', - duration:2000, - message:'删除成功' - }) - await getMenuList() - if(Session.get('projectId') == state.projectId) await initBackEndControlRoutes() - }else{ - ElMessage({ - type:'warning', - message:res.data.msg - }) - } - }).catch(() => {}); - }; - const getMenuList = async () => { - let res = await useMenuApi().getMenuAdmin(state.projectId) - if(res.data.code === '200'){ - state.menuTableData = res.data.data - if(Session.get('projectId') == state.projectId) await initBackEndControlRoutes() - }else{ - ElMessage({ - type:'warning', - message:res.data.msg - }) - } - }; +export default defineComponent({ + name: 'systemMenu', + components: { menuDialog }, + filters: { + parseRole: (roles: Array<string>) => { + return ['1', '2']; + } + }, + setup() { + const menuDialog = ref(); + const storesRoutesList = useRoutesList(); + const state = reactive({ + projectId: '1', + menuData: [], + roleList: [], + menuTableData: [], + projectList: [ + { id: '1', name: '基础数据权限管理系统', key: 0 }, + { id: '2', name: '双重预防系统', key: 1 }, + { id: '3', name: '特殊作业系统', key: 2 }, + { id: '4', name: '智能巡检系统', key: 3 }, + { id: '5', name: '安全风险综合预警预报平台', key: 4 }, + { id: '6', name: '应急管理系统', key: 5 }, + { id: '7', name: '目标责任管理系统', key: 6 }, + { id: '8', name: '事故管理系统', key: 7 }, + { id: '9', name: '设备综合管控系统', key: 8 }, + { id: '10', name: '安全知识图谱系统', key: 9 }, + { id: '11', name: '危险化学品全生命周期安全', key: 10 } + ] + }); + // // 获取 vuex 中的路由 + // const menuTableData = computed(() => { + // return routesList.value; + // }); + // 打开新增菜单弹窗 + const onOpenMenuDialog = (type: string, value: any) => { + menuDialog.value.openDialog(type, value, state.projectList, state.projectId, state.roleList); + }; - const getProjectList = async () => { - let res = await useMenuApi().getProjectList() - if(res.data.code === '200'){ - state.menuTableData = res.data.data - if(Session.get('projectId') == state.projectId) await initBackEndControlRoutes() - }else{ - ElMessage({ - type:'warning', - message:res.data.msg - }) - } - }; + // 删除当前行 + const deleteMenu = (row: any) => { + ElMessageBox.confirm(`此操作将永久删除路由:${row.path}, 是否继续?`, '提示', { + confirmButtonText: '删除', + cancelButtonText: '取消', + type: 'warning' + }) + .then(async () => { + let res = await useMenuApi().deleteMenu({ id: row.id }); + if (res.data.code === '200') { + ElMessage({ + type: 'success', + duration: 2000, + message: '删除成功' + }); + await getMenuList(); + if (Session.get('projectId') == state.projectId) await initBackEndControlRoutes(); + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + }) + .catch(() => {}); + }; + const getMenuList = async () => { + let res = await useMenuApi().getMenuAdmin(state.projectId); + if (res.data.code === '200') { + state.menuTableData = res.data.data; + if (Session.get('projectId') == state.projectId) await initBackEndControlRoutes(); + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + }; - onMounted( () => { - getMenuList() - }); - return { - getMenuList, - menuDialog, - onOpenMenuDialog, - deleteMenu, - ...toRefs(state), - }; - }, - }); + const getRoleList = async () => { + let res = await useRoleApi().getRoleList(); + if (res.data.code === '200') { + state.roleList = res.data.data; + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + }; + + const getProjectList = async () => { + let res = await useMenuApi().getProjectList(); + if (res.data.code === '200') { + state.menuTableData = res.data.data; + if (Session.get('projectId') == state.projectId) await initBackEndControlRoutes(); + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + }; + + const parseRole = (roles: Array<string>) => { + let role = roles.map((item) => { + for (let i in state.roleList) { + if (state.roleList[i].roleCode === item) { + return state.roleList[i].roleName; + } + } + }); + return role; + }; + + onMounted(() => { + getMenuList(); + getRoleList(); + }); + return { + parseRole, + getMenuList, + menuDialog, + onOpenMenuDialog, + deleteMenu, + ...toRefs(state) + }; + } +}); </script> diff --git a/src/views/system/role/component/roleDialog.vue b/src/views/system/role/component/roleDialog.vue index fc4539a..6786c29 100644 --- a/src/views/system/role/component/roleDialog.vue +++ b/src/views/system/role/component/roleDialog.vue @@ -1,150 +1,150 @@ <template> - <div class="system-add-role-container"> - <el-dialog :title="title" v-model="isShowRoleDialog" width="769px"> - <el-form :model="roleForm" size="default" label-width="90px"> - <el-row :gutter="35"> - <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20"> - <el-form-item label="角色名称"> - <el-input v-model="roleForm.roleName" placeholder="请输入角色名称" clearable></el-input> - </el-form-item> - </el-col> - <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20"> - <el-form-item label="角色标识"> - <el-input v-model="roleForm.roleCode" placeholder="请输入角色标识" clearable></el-input> - </el-form-item> - </el-col> - <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20"> - <el-form-item label="角色描述"> - <el-input v-model="roleForm.roleInfo" type="textarea" placeholder="请输入角色描述" maxlength="150"></el-input> - </el-form-item> - </el-col> - </el-row> - </el-form> - <template #footer> - <span class="dialog-footer"> - <el-button @click="isShowRoleDialog = !isShowRoleDialog" size="default">取 消</el-button> - <el-button type="primary" @click="onSubmit" size="default">{{ buttonName }}</el-button> - </span> - </template> - </el-dialog> - </div> + <div class="system-add-role-container"> + <el-dialog :title="title" v-model="isShowRoleDialog" width="769px"> + <el-form :model="roleForm" size="default" label-width="90px"> + <el-row :gutter="35"> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20"> + <el-form-item label="角色名称"> + <el-input v-model="roleForm.roleName" placeholder="请输入角色名称" clearable></el-input> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20"> + <el-form-item label="角色标识"> + <el-input v-model="roleForm.roleCode" placeholder="请输入角色标识" clearable></el-input> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20"> + <el-form-item label="角色描述"> + <el-input v-model="roleForm.roleInfo" type="textarea" placeholder="请输入角色描述" maxlength="150"></el-input> + </el-form-item> + </el-col> + </el-row> + </el-form> + <template #footer> + <span class="dialog-footer"> + <el-button @click="isShowRoleDialog = !isShowRoleDialog" size="default">取 消</el-button> + <el-button type="primary" @click="onSubmit" v-throttle size="default">{{ buttonName }}</el-button> + </span> + </template> + </el-dialog> + </div> </template> <script lang="ts"> import { ElMessage } from 'element-plus'; import { reactive, toRefs, defineComponent } from 'vue'; -import {useRoleApi} from "/@/api/system/role"; +import { useRoleApi } from '/@/api/system/role'; // 定义接口来定义对象的类型 interface MenuDataTree { - id: number; - label: string; - children?: MenuDataTree[]; + id: number; + label: string; + children?: MenuDataTree[]; } interface RoleState { - title:string, - buttonName:string, - isShowRoleDialog: boolean; - roleForm: { - roleName: string; + title: string; + buttonName: string; + isShowRoleDialog: boolean; + roleForm: { + roleName: string; roleCode: string; roleInfo: string; - }; - menuData: Array<MenuDataTree>; - menuProps: { - children: string; - label: string; - }; + }; + menuData: Array<MenuDataTree>; + menuProps: { + children: string; + label: string; + }; } export default defineComponent({ - name: 'systemAddRole', - setup(prop,context) { - const state = reactive<RoleState>({ - isShowRoleDialog: false, - title:'', - buttonName:'', - roleForm: { + name: 'systemAddRole', + setup(prop, context) { + const state = reactive<RoleState>({ + isShowRoleDialog: false, + title: '', + buttonName: '', + roleForm: { roleName: '', // 角色名称 roleCode: '', // 角色标识 - roleInfo: '', // 排序 - }, - menuData: [], - menuProps: { - children: 'children', - label: 'label', - }, - }); - // 打开弹窗 - const openDialog = (type: string, value: any) => { - state.isShowRoleDialog = true; - if(type === '新增'){ - state.title = '新增角色' - state.buttonName = '新增' - state.roleForm = { - roleName:'', - roleCode:'', - roleInfo:'', - } - }else{ - state.title = '修改角色' - state.buttonName = '修改' - state.roleForm = JSON.parse(JSON.stringify(value)) - } - }; - // 新增 - const onSubmit = async () => { - if(state.title === '新增角色'){ - let res = await useRoleApi().addRole(state.roleForm) - if(res.data.code === '200'){ - ElMessage({ - type:'success', - message:'角色新增成功', - duration:2000 - }) - state.isShowRoleDialog = false - context.emit('refreshRoleList') - }else{ - ElMessage({ - type:'warning', - message:res.data.msg - }) - } - }else{ - let res = await useRoleApi().modRole(state.roleForm) - if(res.data.code === '200'){ - ElMessage({ - type:'success', - message:'角色修改成功', - duration:2000 - }) - state.isShowRoleDialog = false - context.emit('refreshRoleList') - }else{ - ElMessage({ - type:'warning', - message:res.data.msg - }) - } - } - }; - // 获取菜单结构数据 - return { - onSubmit, - openDialog, - ...toRefs(state), - }; - }, + roleInfo: '' // 排序 + }, + menuData: [], + menuProps: { + children: 'children', + label: 'label' + } + }); + // 打开弹窗 + const openDialog = (type: string, value: any) => { + state.isShowRoleDialog = true; + if (type === '新增') { + state.title = '新增角色'; + state.buttonName = '新增'; + state.roleForm = { + roleName: '', + roleCode: '', + roleInfo: '' + }; + } else { + state.title = '修改角色'; + state.buttonName = '修改'; + state.roleForm = JSON.parse(JSON.stringify(value)); + } + }; + // 新增 + const onSubmit = async () => { + if (state.title === '新增角色') { + let res = await useRoleApi().addRole(state.roleForm); + if (res.data.code === '200') { + ElMessage({ + type: 'success', + message: '角色新增成功', + duration: 2000 + }); + state.isShowRoleDialog = false; + context.emit('refreshRoleList'); + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + } else { + let res = await useRoleApi().modRole(state.roleForm); + if (res.data.code === '200') { + ElMessage({ + type: 'success', + message: '角色修改成功', + duration: 2000 + }); + state.isShowRoleDialog = false; + context.emit('refreshRoleList'); + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + } + }; + // 获取菜单结构数据 + return { + onSubmit, + openDialog, + ...toRefs(state) + }; + } }); </script> <style scoped lang="scss"> .system-add-role-container { - .menu-data-tree { - width: 100%; - border: 1px solid var(--el-border-color); - border-radius: var(--el-input-border-radius, var(--el-border-radius-base)); - padding: 5px; - } + .menu-data-tree { + width: 100%; + border: 1px solid var(--el-border-color); + border-radius: var(--el-input-border-radius, var(--el-border-radius-base)); + padding: 5px; + } } </style> diff --git a/src/views/system/role/index.vue b/src/views/system/role/index.vue index 6624a39..e60a5a7 100644 --- a/src/views/system/role/index.vue +++ b/src/views/system/role/index.vue @@ -40,9 +40,7 @@ import { ElMessageBox, ElMessage } from 'element-plus'; import roleDialog from '/@/views/system/role/component/roleDialog.vue'; import {useRoleApi} from "/@/api/system/role"; -import {useMenuApi} from "/@/api/system/menu"; -import {Session} from "/@/utils/storage"; -import {initBackEndControlRoutes} from "/@/router/backEnd"; + // 定义接口来定义对象的类型 interface TableData { diff --git a/src/views/system/user/component/userDialog.vue b/src/views/system/user/component/userDialog.vue index 0faf127..3851ccc 100644 --- a/src/views/system/user/component/userDialog.vue +++ b/src/views/system/user/component/userDialog.vue @@ -1,221 +1,213 @@ <template> - <div class="system-add-user-container"> - <el-dialog :title="title" v-model="isShowUserDialog" width="769px"> - <el-form :model="userForm" size="default" label-width="90px"> - <el-row :gutter="35"> - <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20"> - <el-form-item label="账户名称"> - <el-input v-model="userForm.username" placeholder="请输入账户名称" clearable></el-input> - </el-form-item> - </el-col> - <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20"> - <el-form-item label="用户昵称"> - <el-input v-model="userForm.realName" placeholder="请输入用户昵称" clearable></el-input> - </el-form-item> - </el-col> - <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20"> - <el-form-item label="关联角色"> - <el-select v-model="userForm.roleId" placeholder="请选择" clearable class="w100"> - <el-option - v-for="item in roleData" - :key="item.id" - :label="item.name" - :value="item.id" - > - </el-option> - </el-select> - </el-form-item> - </el-col> - <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20"> - <el-form-item label="部门"> - <el-cascader - :options="departmentData" - :props="{ emitPath: false, checkStrictly: true, value: 'id', label: 'name' }" - placeholder="请选择部门" - clearable - class="w100" - v-model="userForm.depId" - > - </el-cascader> - </el-form-item> - </el-col> - <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20"> - <el-form-item label="手机号"> - <el-input v-model="userForm.phone" placeholder="请输入手机号" clearable></el-input> - </el-form-item> - </el-col> - <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20"> - <el-form-item label="邮箱"> - <el-input v-model="userForm.email" placeholder="请输入" clearable></el-input> - </el-form-item> - </el-col> - <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20"> - <el-form-item label="性别"> - <el-select v-model="userForm.sex" placeholder="请选择" clearable class="w100"> - <el-option - v-for="item in sexList" - :key="item.id" - :value="item.id" - :label="item.name" - > - </el-option> - </el-select> - </el-form-item> - </el-col> - <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20"> - <el-form-item label="账户密码"> - <el-input v-model="userForm.password" placeholder="请输入" type="password" clearable></el-input> - </el-form-item> - </el-col> - <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20"> - <el-form-item label="账户过期"> - <el-date-picker v-model="userForm.expireTime" type="date" placeholder="请选择" class="w100"> </el-date-picker> - </el-form-item> - </el-col> -<!-- <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">--> -<!-- <el-form-item label="用户状态">--> -<!-- <el-switch v-model="userForm.status" inline-prompt active-value = 1 inactive-value= 0 active-text="启" inactive-text="禁"></el-switch>--> -<!-- </el-form-item>--> -<!-- </el-col>--> - </el-row> - </el-form> - <template #footer> - <span class="dialog-footer"> - <el-button @click="isShowUserDialog = !isShowUserDialog" size="default">取 消</el-button> - <el-button type="primary" @click="onSubmit" size="default">新 增</el-button> - </span> - </template> - </el-dialog> - </div> + <div class="system-add-user-container"> + <el-dialog :title="title" v-model="isShowUserDialog" width="769px"> + <el-form :model="userForm" size="default" label-width="90px"> + <el-row :gutter="35"> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20"> + <el-form-item label="账户名称"> + <el-input v-model="userForm.username" placeholder="请输入账户名称" clearable></el-input> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20"> + <el-form-item label="用户昵称"> + <el-input v-model="userForm.realName" placeholder="请输入用户昵称" clearable></el-input> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20"> + <el-form-item label="关联角色"> + <el-select v-model="userForm.roleId" placeholder="请选择" clearable class="w100"> + <el-option v-for="item in roleData" :key="item.roleId" :label="item.roleName" :value="item.roleId"> </el-option> + </el-select> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20"> + <el-form-item label="部门"> + <el-cascader + :options="departmentData" + :props="{ emitPath: false, checkStrictly: true, value: 'depId', label: 'depName' }" + placeholder="请选择部门" + clearable + class="w100" + v-model="userForm.depId" + > + </el-cascader> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20"> + <el-form-item label="手机号"> + <el-input v-model="userForm.phone" placeholder="请输入手机号" clearable></el-input> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20"> + <el-form-item label="身份证"> + <el-input v-model="userForm.identify" placeholder="请输入身份证" clearable></el-input> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20"> + <el-form-item label="邮箱"> + <el-input v-model="userForm.email" placeholder="请输入" clearable></el-input> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20"> + <el-form-item label="性别"> + <el-select v-model="userForm.gender" placeholder="请选择" clearable class="w100"> + <el-option v-for="item in sexList" :key="item.id" :value="item.id" :label="item.name"> </el-option> + </el-select> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20"> + <el-form-item label="账户密码"> + <el-input v-model="userForm.password" placeholder="请输入" type="password" clearable></el-input> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20"> + <el-form-item label="账户过期"> + <el-date-picker v-model="userForm.expireTime" type="date" placeholder="请选择" class="w100"> </el-date-picker> + </el-form-item> + </el-col> + <!-- <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">--> + <!-- <el-form-item label="用户状态">--> + <!-- <el-switch v-model="userForm.status" inline-prompt active-value = 1 inactive-value= 0 active-text="启" inactive-text="禁"></el-switch>--> + <!-- </el-form-item>--> + <!-- </el-col>--> + </el-row> + </el-form> + <template #footer> + <span class="dialog-footer"> + <el-button @click="isShowUserDialog = !isShowUserDialog" size="default">取 消</el-button> + <el-button type="primary" v-throttle @click="onSubmit" size="default">新 增</el-button> + </span> + </template> + </el-dialog> + </div> </template> <script lang="ts"> import { reactive, toRefs, onMounted, defineComponent } from 'vue'; import { ElMessageBox, ElMessage } from 'element-plus'; -import {userApi} from "/@/api/system/user"; +import { userApi } from '/@/api/system/user'; // 定义接口来定义对象的类型 -interface DeptData { -} -interface roleData{ - -} -interface sexData{ - -} +interface DeptData {} +interface roleData {} +interface sexData {} interface UserState { - title:string, - isShowUserDialog: boolean; - userForm: { - username: string; - realName: string; - roleId: number | null; - depId: number | null; - phone: string; - email: string; - sex: number | null; - password: string; - expireTime: string; - status: number; - }; - departmentData: Array<DeptData>; - roleData: Array<roleData>; - sexList:Array<sexData>, + title: string; + isShowUserDialog: boolean; + userForm: { + username: string; + realName: string; + roleId: number | null; + depId: number | null; + phone: string; + email: string; + gender: number | null; + password: string; + expireTime: string; + status: number; + identify: string; + }; + departmentData: Array<DeptData>; + roleData: Array<roleData>; + sexList: Array<sexData>; } export default defineComponent({ - name: 'user', - setup(props,context) { - const state = reactive<UserState>({ - title:'', - isShowUserDialog: false, - userForm: { - username: '', // 账户名称 - realName: '', // 用户昵称 - roleId: null, // 关联角色 - depId:null, // 部门 - phone: '', // 手机号 - email: '', // 邮箱 - sex: null, // 性别 - password: '', // 账户密码 - expireTime: '', // 账户过期 - status: 1, // 用户状态 - }, - departmentData: [], // 部门数据 - roleData:[],//角色数据 - sexList:[{id:1,name:'男'},{id:0,name:'女'}] - }); - // 打开弹窗 - const openDialog = (type: string,value: any,departmentList:[], roleList: []) => { - state.isShowUserDialog = true; - state.departmentData = departmentList; - state.roleData = roleList; - if(type === '新增'){ - state.title = '新增用户' - state.userForm = { - username: '', - realName: '', - roleId: null, - depId: null, - phone: '', - email: '', - sex: null, - password: '', - expireTime: '', - status: 1, - } - }else{ - state.title = '修改用户' - state.userForm = JSON.parse(JSON.stringify(value)) - } - }; + name: 'user', + setup(props, context) { + const state = reactive<UserState>({ + title: '', + isShowUserDialog: false, + userForm: { + username: '', // 账户名称 + realName: '', // 用户昵称 + roleId: null, // 关联角色 + depId: null, // 部门 + phone: '', // 手机号 + email: '', // 邮箱 + identify: '', + gender: null, // 性别 + password: '', // 账户密码 + expireTime: '', // 账户过期 + status: 1 // 用户状态 + }, + departmentData: [], // 部门数据 + roleData: [], //角色数据 + sexList: [ + { id: 1, name: '男' }, + { id: 0, name: '女' } + ] + }); + // 打开弹窗 + const openDialog = (type: string, value: any, departmentList: [], roleList: []) => { + state.isShowUserDialog = true; + state.departmentData = departmentList; + state.roleData = roleList; + if (type === '新增') { + state.title = '新增用户'; + state.userForm = { + username: '', + realName: '', + roleId: null, + depId: null, + phone: '', + email: '', + identify: '', + gender: null, + password: '', + expireTime: '', + status: 1 + }; + } else { + state.title = '修改用户'; + state.userForm = JSON.parse(JSON.stringify(value)); + } + }; + // 新增修改 + const onSubmit = async () => { + if (state.title === '新增用户') { + let res = await userApi().addUser(state.userForm); + if (res.data.code === '200') { + ElMessage({ + type: 'success', + message: '用户新增成功', + duration: 2000 + }); + state.isShowUserDialog = false; + context.emit('getUserList'); + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + } else { + let res = await userApi().modUser(state.userForm); + if (res.data.code === '200') { + ElMessage({ + type: 'success', + message: '用户修改成功', + duration: 2000 + }); + state.isShowUserDialog = false; + context.emit('getUserList'); + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + } + }; - // 新增修改 - const onSubmit = async () => { - if(state.title === '新增用户'){ - let res = await userApi().addUser(state.userForm) - if(res.data.code === '200'){ - ElMessage({ - type:'success', - message:'用户新增成功', - duration:2000 - }) - state.isShowUserDialog = false; - context.emit('getUserList') - }else{ - ElMessage({ - type:'warning', - message:res.data.msg - }) - } - }else{ - let res = await userApi().modUser(state.userForm) - if(res.data.code === '200'){ - ElMessage({ - type:'success', - message:'用户修改成功', - duration:2000 - }) - state.isShowUserDialog = false; - context.emit('getUserList') - }else{ - ElMessage({ - type:'warning', - message:res.data.msg - }) - } - } - }; - - // 页面加载时 - onMounted(() => { - }); - return { - openDialog, - onSubmit, - ...toRefs(state), - }; - }, + // 页面加载时 + onMounted(() => {}); + return { + openDialog, + onSubmit, + ...toRefs(state) + }; + } }); </script> diff --git a/src/views/system/user/index.vue b/src/views/system/user/index.vue index f15ec18..4e5946d 100644 --- a/src/views/system/user/index.vue +++ b/src/views/system/user/index.vue @@ -1,206 +1,218 @@ <template> - <div class="system-user-container"> - <el-card shadow="hover"> - <div class="system-user-search mb15"> - <el-input size="default" placeholder="请输入用户名称" style="max-width: 180px"> </el-input> - <el-button size="default" type="primary" class="ml10"> - <el-icon> - <ele-Search /> - </el-icon> - 查询 - </el-button> - <el-button size="default" type="success" class="ml10" @click="onOpenUserDialog('新增','')"> - <el-icon> - <ele-FolderAdd /> - </el-icon> - 新增用户 - </el-button> - </div> - <el-table :data="userTableData.data" style="width: 100%"> - <el-table-column type="index" label="序号" width="60" /> - <el-table-column prop="username" label="账户名称" show-overflow-tooltip></el-table-column> - <el-table-column prop="realName" label="用户昵称" show-overflow-tooltip></el-table-column> - <el-table-column prop="sex" label="性别" show-overflow-tooltip></el-table-column> - <el-table-column prop="role.name" label="关联角色" show-overflow-tooltip></el-table-column> - <el-table-column prop="department.name" label="部门" show-overflow-tooltip></el-table-column> - <el-table-column prop="phone" label="手机号" show-overflow-tooltip></el-table-column> - <el-table-column prop="email" label="邮箱" show-overflow-tooltip></el-table-column> - <el-table-column prop="status" label="用户状态" show-overflow-tooltip> - <template #default="scope"> - <el-tag type="success" v-if="scope.row.status">启用</el-tag> - <el-tag type="info" v-else>禁用</el-tag> - </template> - </el-table-column> - <el-table-column prop="gmtCreate" label="创建时间" show-overflow-tooltip></el-table-column> - <el-table-column label="操作" width="100"> - <template #default="scope"> - <el-button :disabled="scope.row.userName === 'admin'" size="small" text type="primary" @click="onOpenUserDialog('修改',scope.row)">修改</el-button> - <el-button :disabled="scope.row.userName === 'admin'" size="small" text type="primary" @click="onRowDel(scope.row)">删除</el-button> - </template> - </el-table-column> - </el-table> - <el-pagination - @size-change="onHandleSizeChange" - @current-change="onHandleCurrentChange" - class="mt15" - :pager-count="5" - :page-sizes="[10, 20, 30]" - v-model:current-page="userTableData.listQuery.pageIndex" - background - v-model:page-size="userTableData.listQuery.pageSize" - layout="total, sizes, prev, pager, next, jumper" - :total="userTableData.total" - > - </el-pagination> - </el-card> - <userDialog ref="userRef" @getUserList = "initUserTableData"/> - </div> + <div class="system-user-container"> + <el-card shadow="hover"> + <div class="system-user-search mb15"> + <el-input size="default" placeholder="请输入用户名称" style="max-width: 180px"> </el-input> + <el-button size="default" type="primary" class="ml10"> + <el-icon> + <ele-Search /> + </el-icon> + 查询 + </el-button> + <el-button size="default" type="success" class="ml10" @click="onOpenUserDialog('新增', '')"> + <el-icon> + <ele-FolderAdd /> + </el-icon> + 新增用户 + </el-button> + </div> + <el-table :data="userTableData.data" style="width: 100%"> + <el-table-column type="index" label="序号" width="60" /> + <el-table-column prop="username" label="账户名称" show-overflow-tooltip></el-table-column> + <el-table-column prop="realName" label="用户昵称" show-overflow-tooltip></el-table-column> + <el-table-column prop="sex" label="性别" show-overflow-tooltip></el-table-column> + <el-table-column prop="role.name" label="关联角色" show-overflow-tooltip></el-table-column> + <el-table-column prop="department.name" label="部门" show-overflow-tooltip></el-table-column> + <el-table-column prop="phone" label="手机号" show-overflow-tooltip></el-table-column> + <el-table-column prop="email" label="邮箱" show-overflow-tooltip></el-table-column> + <el-table-column prop="status" label="用户状态" show-overflow-tooltip> + <template #default="scope"> + <el-tag type="success" v-if="scope.row.status">启用</el-tag> + <el-tag type="info" v-else>禁用</el-tag> + </template> + </el-table-column> + <el-table-column prop="gmtCreate" label="创建时间" show-overflow-tooltip></el-table-column> + <el-table-column label="操作" width="100"> + <template #default="scope"> + <el-button + :disabled="scope.row.userName === 'admin'" + size="small" + text + type="primary" + @click="onOpenUserDialog('修改', scope.row)" + >修改</el-button + > + <el-button :disabled="scope.row.userName === 'admin'" size="small" text type="primary" @click="onRowDel(scope.row)"> + 删除 + </el-button> + </template> + </el-table-column> + </el-table> + <br /> + <el-pagination + @size-change="onHandleSizeChange" + @current-change="onHandleCurrentChange" + class="page-position" + :pager-count="5" + :page-sizes="[10, 20, 30]" + v-model:current-page="userTableData.listQuery.pageIndex" + background + v-model:page-size="userTableData.listQuery.pageSize" + layout="total, sizes, prev, pager, next, jumper" + :total="userTableData.total" + > + </el-pagination> + <br /> + <br /> + </el-card> + <userDialog ref="userRef" @getUserList="initUserTableData" /> + </div> </template> <script lang="ts"> import { toRefs, reactive, onMounted, ref, defineComponent } from 'vue'; import { ElMessageBox, ElMessage } from 'element-plus'; import userDialog from '/@/views/system/user/component/userDialog.vue'; -import {userApi} from "/@/api/system/user"; -import {departmentApi} from "/@/api/system/department"; -import {useRoleApi} from "/@/api/system/role"; +import { userApi } from '/@/api/system/user'; +import { departmentApi } from '/@/api/system/department'; +import { useRoleApi } from '/@/api/system/role'; // 定义接口来定义对象的类型 interface TableDataRow { - userName: string; - userNickname: string; - roleSign: string; - department: string[]; - phone: string; - email: string; - sex: string; - password: string; - overdueTime: Date; - status: boolean; - describe: string; - createTime: string; + userName: string; + userNickname: string; + roleSign: string; + department: string[]; + phone: string; + email: string; + sex: string; + password: string; + overdueTime: Date; + status: boolean; + describe: string; + createTime: string; } -interface DepartmentDataRow{ - -} +interface DepartmentDataRow {} interface TableDataState { - userTableData: { - data: Array<TableDataRow>; - total: number; - loading: boolean; - listQuery: { - searchParams:{ - username:string, - realName:string, - }, - pageIndex: number; - pageSize: number; - }; - }; - departmentList:[]; - roleList:[]; + userTableData: { + data: Array<TableDataRow>; + total: number; + loading: boolean; + listQuery: { + searchParams: { + username: string; + realName: string; + }; + pageIndex: number; + pageSize: number; + }; + }; + departmentList: []; + roleList: []; } export default defineComponent({ - name: 'systemUser', - components: { userDialog }, - setup() { - const userRef = ref(); - const state = reactive<TableDataState>({ - userTableData: { - data: [], - total: 0, - loading: false, - listQuery: { - searchParams:{ - username:'', - realName:'', - }, - pageIndex: 1, - pageSize: 10, - }, - }, - departmentList:[], - roleList:[], - }); - // 初始化表格数据 - const initUserTableData = async () => { - let res = await userApi().getUserList(state.userTableData.listQuery) - if(res.data.code === '200'){ - state.userTableData.data = res.data.data; - state.userTableData.total = res.data.data.length; - }else{ - ElMessage({ - type:'warning', - message:res.data.msg - }) - } - }; + name: 'systemUser', + components: { userDialog }, + setup() { + const userRef = ref(); + const state = reactive<TableDataState>({ + userTableData: { + data: [], + total: 0, + loading: false, + listQuery: { + searchParams: { + username: '', + realName: '' + }, + pageIndex: 1, + pageSize: 10 + } + }, + departmentList: [], + roleList: [] + }); + // 初始化表格数据 + const initUserTableData = async () => { + let res = await userApi().getUserList(state.userTableData.listQuery); + if (res.data.code === '200') { + state.userTableData.data = res.data.data; + state.userTableData.total = res.data.total; + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + }; - const getDepartmentData = async () => { - let res = await departmentApi().getDepartmentList() - if(res.data.code === '200'){ - state.departmentList = res.data.data - }else{ - ElMessage({ - type:'warning', - message:res.data.msg - }) - } - } + const getDepartmentData = async () => { + let res = await departmentApi().getDepartmentList(); + if (res.data.code === '200') { + state.departmentList = res.data.data; + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + }; - const getRoleData = async () => { - let res = await useRoleApi().getRoleList() - if(res.data.code === '200'){ - state.roleList = res.data.data - }else{ - ElMessage({ - type:'warning', - message:res.data.msg - }) - } - } + const getRoleData = async () => { + let res = await useRoleApi().getRoleList(); + if (res.data.code === '200') { + state.roleList = res.data.data; + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + }; - // 打开新增修改用户弹窗 - const onOpenUserDialog = (type: string,value: any) => { - userRef.value.openDialog(type, value, state.departmentList,state.roleList); - }; + // 打开新增修改用户弹窗 + const onOpenUserDialog = (type: string, value: any) => { + userRef.value.openDialog(type, value, state.departmentList, state.roleList); + }; - // 删除用户 - const onRowDel = (row: TableDataRow) => { - ElMessageBox.confirm(`此操作将永久删除账户名称:“${row.userName}”,是否继续?`, '提示', { - confirmButtonText: '确认', - cancelButtonText: '取消', - type: 'warning', - }).then(() => { - ElMessage.success('删除成功'); - }).catch(() => {}); - }; - // 分页改变 - const onHandleSizeChange = (val: number) => { - state.userTableData.listQuery.pageSize = val; - initUserTableData() - }; - // 分页改变 - const onHandleCurrentChange = (val: number) => { - state.userTableData.listQuery.pageSize = val; - initUserTableData() - }; - // 页面加载时 - onMounted(() => { - initUserTableData(); - getDepartmentData(); - getRoleData(); - }); - return { - userRef, - onOpenUserDialog, - onRowDel, - onHandleSizeChange, - initUserTableData, - onHandleCurrentChange, - ...toRefs(state), - }; - }, + // 删除用户 + const onRowDel = (row: TableDataRow) => { + ElMessageBox.confirm(`此操作将永久删除账户名称:“${row.userName}”,是否继续?`, '提示', { + confirmButtonText: '确认', + cancelButtonText: '取消', + type: 'warning' + }) + .then(() => { + ElMessage.success('删除成功'); + }) + .catch(() => {}); + }; + // 分页改变 + const onHandleSizeChange = (val: number) => { + state.userTableData.listQuery.pageSize = val; + initUserTableData(); + }; + // 分页改变 + const onHandleCurrentChange = (val: number) => { + state.userTableData.listQuery.pageIndex = val; + initUserTableData(); + }; + // 页面加载时 + onMounted(() => { + initUserTableData(); + getDepartmentData(); + getRoleData(); + }); + return { + userRef, + onOpenUserDialog, + onRowDel, + onHandleSizeChange, + initUserTableData, + onHandleCurrentChange, + ...toRefs(state) + }; + } }); </script> -- Gitblit v1.9.2