From efb4569338df5aeeba8317921bb5ee164dc03ed9 Mon Sep 17 00:00:00 2001
From: Your Name <123456>
Date: 星期一, 11 七月 2022 17:49:19 +0800
Subject: [PATCH] 基础模块

---
 src/views/system/role/index.vue                      |   99 +--
 src/api/user/index.ts                                |   37 +
 src/api/role/index.ts                                |   25 
 src/views/system/department/component/deptDialog.vue |   47 -
 src/views/system/user/component/userDialog.vue       |  221 ++++++++
 src/views/system/department/index.vue                |   44 +
 /dev/null                                            |  202 -------
 src/views/system/menu/index.vue                      |   14 
 src/views/system/user/index.vue                      |  153 +++--
 src/views/system/role/component/roleDialog.vue       |  150 +++++
 src/api/department/index.ts                          |   17 
 src/api/menu/index.ts                                |   19 
 src/views/system/menu/component/menuDialog.vue       |  518 +++++++++---------
 13 files changed, 914 insertions(+), 632 deletions(-)

diff --git a/src/api/department/index.ts b/src/api/department/index.ts
index 0ed427c..3733527 100644
--- a/src/api/department/index.ts
+++ b/src/api/department/index.ts
@@ -2,24 +2,35 @@
 
 export function departmentApi() {
     return {
+        // v2
         getDepartmentList: () => {
             return request({
                 url: `/department/list`,
-                method: 'post',
+                method: 'post'
             });
         },
+        // v2
         addDepartment: (data: object) => {
             return request({
                 url: `/department/add`,
                 method: 'post',
-                data:data
+                data: data
             });
         },
+        // v2
         modDepartment: (data: object) => {
             return request({
                 url: `/department/mod`,
                 method: 'post',
-                data:data
+                data: data
+            });
+        },
+        // v1
+        deleteDepartment: (value?: object) => {
+            return request({
+                url: `/department/del`,
+                method: 'post',
+                data: value
             });
         },
     };
diff --git a/src/api/menu/index.ts b/src/api/menu/index.ts
index a8e0864..e5e9291 100644
--- a/src/api/menu/index.ts
+++ b/src/api/menu/index.ts
@@ -8,32 +8,43 @@
  */
 export function useMenuApi() {
 	return {
+		// v2
 		getMenuAdmin: (value?: string) => {
 			return request({
 				url: `/auth/menu?projectId= ${value}`,
-				method: 'post',
+				method: 'post'
 			});
 		},
+		// v1
 		addMenu: (value?: object) => {
 			return request({
 				url: `/menu/add`,
 				method: 'post',
-				data:value
+				data: value
 			});
 		},
+		// v1
 		modMenu: (value?: object) => {
 			return request({
 				url: `/menu/mod`,
 				method: 'post',
-				data:value
+				data: value
 			});
 		},
+		// v1
 		deleteMenu: (value?: object) => {
 			return request({
 				url: `/menu/del`,
 				method: 'post',
-				data:value,
+				data: value
 			});
 		},
+		// v1
+		getProjectList: () => {
+			return request({
+				url: `/project/list`,
+				method: 'post'
+			});
+		}
 	};
 }
diff --git a/src/api/role/index.ts b/src/api/role/index.ts
index 137195d..3b85d45 100644
--- a/src/api/role/index.ts
+++ b/src/api/role/index.ts
@@ -2,10 +2,35 @@
 
 export function useRoleApi() {
     return {
+        // v2
         getRoleList: () => {
             return request({
                 url: `/role/list`,
+                method: 'post'
+            });
+        },
+        // v2
+        addRole: (data: object) => {
+            return request({
+                url: `/role/add`,
                 method: 'post',
+                data: data
+            });
+        },
+        // v2
+        modRole: (data: object) => {
+            return request({
+                url: `/role/mod`,
+                method: 'post',
+                data: data
+            });
+        },
+        // v2
+        deleteRole: (value?: object) => {
+            return request({
+                url: `/role/del`,
+                method: 'post',
+                data: value
             });
         },
     };
diff --git a/src/api/user/index.ts b/src/api/user/index.ts
new file mode 100644
index 0000000..8959ea7
--- /dev/null
+++ b/src/api/user/index.ts
@@ -0,0 +1,37 @@
+import request from '/@/utils/request';
+
+export function userApi() {
+    return {
+        // v1
+        getUserList: (data: any) => {
+            return request({
+                url: `/account/page/list`,
+                method: 'post',
+                data: data
+            });
+        },
+        // v1
+        addUser: (data: object) => {
+            return request({
+                url: `/account/add`,
+                method: 'post',
+                data: data
+            });
+        },
+        // v1
+        modUser: (data: object) => {
+            return request({
+                url: `/account/mod`,
+                method: 'post',
+                data: data
+            });
+        },
+        // v1
+        getUserLByDepartment: (depId: number | null) => {
+            return request({
+                url: `/account/dep/list?depId=${depId}`,
+                method: 'get'
+            });
+        }
+    };
+}
diff --git a/src/views/system/department/component/deptDialog.vue b/src/views/system/department/component/deptDialog.vue
index 0477317..e3757f2 100644
--- a/src/views/system/department/component/deptDialog.vue
+++ b/src/views/system/department/component/deptDialog.vue
@@ -7,23 +7,23 @@
 						<el-form-item label="上级部门">
 							<el-cascader
 								:options="deptData"
-								:props="{ checkStrictly: true, value: 'id', label: 'name' }"
+								:props="{ emitPath: false, checkStrictly: true, value: 'depId', label: 'depName' }"
 								placeholder="请选择部门"
 								clearable
 								class="w100"
-								v-model="departmentForm.struct"
+								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.name" placeholder="请输入部门名称" clearable></el-input>
+							<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.info" type="textarea" placeholder="请输入部门描述" maxlength="150"></el-input>
+							<el-input v-model="departmentForm.depInfo" type="textarea" placeholder="请输入部门描述" maxlength="150"></el-input>
 						</el-form-item>
 					</el-col>
 				</el-row>
@@ -31,7 +31,7 @@
 			<template #footer>
 				<span class="dialog-footer">
 					<el-button @click="onCancel" size="default">取 消</el-button>
-					<el-button type="primary" @click="onSubmit" size="default">新 增</el-button>
+					<el-button type="primary" @click="onSubmit" size="default">确 定</el-button>
 				</span>
 			</template>
 		</el-dialog>
@@ -45,7 +45,6 @@
 
 // 定义接口来定义对象的类型
 interface TableDataRow {
-	struct: Array<string>;
 	name:string,
 	info:string,
 	parentId:string,
@@ -55,10 +54,9 @@
 	title:string;
 	isShowDialog: boolean;
 	departmentForm: {
-		struct: Array<string>;
-		name:string,
-		info:string,
-		parentId:string
+        depName:string,
+        depInfo:string,
+        parentDepId:string
 	};
 	deptData: Array<TableDataRow>;
 }
@@ -70,10 +68,9 @@
 			title:'',
 			isShowDialog: false,
 			departmentForm: {
-				name:'',
-				parentId:'',
-				info:'',
-				struct:[]
+                depName:'',
+                parentDepId:'',
+                depInfo:'',
 			},
 			deptData: [], // 部门数据
 		});
@@ -84,13 +81,13 @@
 			if(type === '新增'){
 				state.title = '新增部门'
 				state.departmentForm = {
-					name:'',
-					parentId:'',
-					info:'',
-					struct:[]
+                    depName:'',
+                    parentDepId:'',
+                    depInfo:'',
 				}
 			}else{
-				state.title = '编辑部门'
+				state.title = '修改部门'
+				state.departmentForm = JSON.parse(JSON.stringify(value))
 			}
 		};
 		// 关闭弹窗
@@ -103,20 +100,16 @@
 		};
 		// 新增
 		const onSubmit = async () => {
-			if(state.departmentForm.struct && state.departmentForm.struct !== []){
-				let departmentId = JSON.parse(JSON.stringify(state.departmentForm.struct))
-				state.departmentForm.parentId = departmentId[departmentId.length - 1]
-			}
 			if(state.title === '新增部门'){
 				let res = await departmentApi().addDepartment(state.departmentForm)
 				if(res.data.code === '200'){
 					ElMessage({
 						type:'success',
-						message:'菜单新增成功',
+						message:'部门新增成功',
 						duration:2000
 					})
 					closeDialog();
-					context.emit('getMenuList')
+					context.emit('getDepartmentList')
 				}else{
 					ElMessage({
 						type:'warning',
@@ -128,11 +121,11 @@
 				if(res.data.code === '200'){
 					ElMessage({
 						type:'success',
-						message:'菜单修改成功',
+						message:'部门修改成功',
 						duration:2000
 					})
 					closeDialog();
-					context.emit('getMenuList')
+					context.emit('getDepartmentList')
 				}else{
 					ElMessage({
 						type:'warning',
diff --git a/src/views/system/department/component/editDept.vue b/src/views/system/department/component/editDept.vue
deleted file mode 100644
index 7b16f44..0000000
--- a/src/views/system/department/component/editDept.vue
+++ /dev/null
@@ -1,179 +0,0 @@
-<template>
-	<div class="system-edit-dept-container">
-		<el-dialog title="修改部门" v-model="isShowDialog" width="769px">
-			<el-form :model="ruleForm" 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="{ checkStrictly: true, value: 'deptName', label: 'deptName' }"
-								placeholder="请选择部门"
-								clearable
-								class="w100"
-								v-model="ruleForm.deptLevel"
-							>
-								<template #default="{ node, data }">
-									<span>{{ data.deptName }}</span>
-									<span v-if="!node.isLeaf"> ({{ data.children.length }}) </span>
-								</template>
-							</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="ruleForm.deptName" 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="ruleForm.person" 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="ruleForm.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="ruleForm.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-input-number v-model="ruleForm.sort" :min="0" :max="999" controls-position="right" placeholder="请输入排序" class="w100" />
-						</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="ruleForm.status" inline-prompt active-text="启" inactive-text="禁"></el-switch>
-						</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="ruleForm.describe" 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>
-</template>
-
-<script lang="ts">
-import { reactive, toRefs, onMounted, defineComponent } from 'vue';
-
-// 定义接口来定义对象的类型
-interface TableDataRow {
-	deptName: string;
-	createTime: string;
-	status: boolean;
-	sort: number;
-	describe: string;
-	id: number;
-	children?: TableDataRow[];
-}
-interface RuleFormState {
-	deptLevel: Array<string>;
-	deptName: string;
-	person: string;
-	phone: string | number;
-	email: string;
-	sort: number;
-	status: boolean;
-	describe: string;
-}
-interface DeptSate {
-	isShowDialog: boolean;
-	ruleForm: RuleFormState;
-	deptData: Array<TableDataRow>;
-}
-
-export default defineComponent({
-	name: 'systemEditDept',
-	setup() {
-		const state = reactive<DeptSate>({
-			isShowDialog: false,
-			ruleForm: {
-				deptLevel: [], // 上级部门
-				deptName: '', // 部门名称
-				person: '', // 负责人
-				phone: '', // 手机号
-				email: '', // 邮箱
-				sort: 0, // 排序
-				status: true, // 部门状态
-				describe: '', // 部门描述
-			},
-			deptData: [], // 部门数据
-		});
-		// 打开弹窗
-		const openDialog = (row: RuleFormState) => {
-			row.deptLevel = ['vueNextAdmin'];
-			row.person = 'lyt';
-			row.phone = '12345678910';
-			row.email = 'vueNextAdmin@123.com';
-			state.ruleForm = row;
-			state.isShowDialog = true;
-		};
-		// 关闭弹窗
-		const closeDialog = () => {
-			state.isShowDialog = false;
-		};
-		// 取消
-		const onCancel = () => {
-			closeDialog();
-		};
-		// 新增
-		const onSubmit = () => {
-			closeDialog();
-		};
-		// 初始化部门数据
-		const initTableData = () => {
-			state.deptData.push({
-				deptName: 'vueNextAdmin',
-				createTime: new Date().toLocaleString(),
-				status: true,
-				sort: Math.random(),
-				describe: '顶级部门',
-				id: Math.random(),
-				children: [
-					{
-						deptName: 'IT外包服务',
-						createTime: new Date().toLocaleString(),
-						status: true,
-						sort: Math.random(),
-						describe: '总部',
-						id: Math.random(),
-					},
-					{
-						deptName: '资本控股',
-						createTime: new Date().toLocaleString(),
-						status: true,
-						sort: Math.random(),
-						describe: '分部',
-						id: Math.random(),
-					},
-				],
-			});
-		};
-		// 页面加载时
-		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 4f33400..28464ce 100644
--- a/src/views/system/department/index.vue
+++ b/src/views/system/department/index.vue
@@ -19,18 +19,11 @@
 			<el-table
 				:data="tableData.data"
 				style="width: 100%"
-				row-key="id"
-				default-expand-all
+				row-key="depId"
 				:tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
 			>
-				<el-table-column prop="name" 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="info" label="部门描述" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="depName" label="部门名称" show-overflow-tooltip> </el-table-column>
+				<el-table-column prop="depInfo" label="部门描述" show-overflow-tooltip></el-table-column>
 				<el-table-column label="操作" show-overflow-tooltip width="140">
 					<template #default="scope">
 						<el-button size="small" text type="primary" @click="onOpenDeptDialog('新增','')">新增</el-button>
@@ -40,7 +33,7 @@
 				</el-table-column>
 			</el-table>
 		</el-card>
-		<deptDialog ref="deptDialog" />
+		<deptDialog ref="deptDialog" @getDepartmentList="initTableData"/>
 	</div>
 </template>
 
@@ -49,6 +42,7 @@
 import { ElMessageBox, ElMessage } from 'element-plus';
 import deptDialog from '/@/views/system/department/component/deptDialog.vue';
 import {departmentApi} from "/@/api/department";
+import {useRoleApi} from "/@/api/role";
 
 // 定义接口来定义对象的类型
 interface TableDataRow {
@@ -56,7 +50,7 @@
 	status: boolean;
 	parentId: number;
 	info: string;
-	id: number;
+    depId: number;
 	children?: TableDataRow[];
 }
 interface TableDataState {
@@ -93,18 +87,31 @@
 			}
 		};
 		// 打开新增菜单弹窗
-		const onOpenDeptDialog = (type: string,value: any) => {
-			deptDialog.value.openDialog(type,value,state.tableData.data);
+		const onOpenDeptDialog = (type: string, value: any) => {
+			deptDialog.value.openDialog(type, value, state.tableData.data);
 		};
 		// 删除当前行
 		const onTabelRowDel = (row: TableDataRow) => {
-			ElMessageBox.confirm(`此操作将永久删除部门:${row.id}, 是否继续?`, '提示', {
+			ElMessageBox.confirm(`此操作将永久删除部门:${row.depId}, 是否继续?`, '提示', {
 				confirmButtonText: '删除',
 				cancelButtonText: '取消',
 				type: 'warning',
-			}).then(() => {
-					ElMessage.success('删除成功');
-			}).catch(() => {});
+			}).then(async () => {
+                let res = await departmentApi().deleteDepartment({depId:row.depId})
+                if(res.data.code ==='200'){
+                    ElMessage({
+                        type:'success',
+                        duration:2000,
+                        message:'删除成功'
+                    })
+                    await initTableData()
+                }else{
+                    ElMessage({
+                        type:'warning',
+                        message:res.data.msg
+                    })
+                }
+            }).catch(() => {});
 		};
 		// 页面加载时
 		onMounted(() => {
@@ -112,6 +119,7 @@
 		});
 		return {
 			deptDialog,
+			initTableData,
 			onOpenDeptDialog,
 			onTabelRowDel,
 			...toRefs(state),
diff --git a/src/views/system/menu/component/menuDialog.vue b/src/views/system/menu/component/menuDialog.vue
index 500a948..f223f93 100644
--- a/src/views/system/menu/component/menuDialog.vue
+++ b/src/views/system/menu/component/menuDialog.vue
@@ -1,267 +1,267 @@
 <template>
-	<div class="system-add-menu-container">
-		<el-dialog :title="title" v-model="isShowDialog" width="769px">
-			<el-form :model="ruleForm" size="default" label-width="80px">
-				<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="menuData"
-									:props="{ checkStrictly: true, value: 'id', label: 'title' }"
-									placeholder="请选择上级菜单"
-									clearable
-									class="w100"
-									v-model="ruleForm.menuSuperior"
-							>
-							</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="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-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-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-form-item>
-					</el-col>
-					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
-						<el-form-item label="菜单图标">
-							<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-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-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-select @change="handelMenu" v-model="ruleForm.projectId" controls-position="right" placeholder="请输入排序" class="w100">
-								<el-option
-										v-for="item in projectList"
-										:key="item.key"
-										: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-number v-model="ruleForm.priority" controls-position="right" placeholder="请输入排序" class="w100"/>
-						</el-form-item>
-					</el-col>
-					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
-						<el-form-item label="是否隐藏">
-							<el-radio-group v-model="ruleForm.meta.isHide">
-								<el-radio :label="true">隐藏</el-radio>
-								<el-radio :label="false">不隐藏</el-radio>
-							</el-radio-group>
-						</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">{{ buttonName }}</el-button>
-				</span>
-			</template>
-		</el-dialog>
-	</div>
+    <div class="system-add-menu-container">
+        <el-dialog :title="title" v-model="isShowDialog" width="769px">
+            <el-form :model="ruleForm" size="default" label-width="80px">
+                <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="menuData"
+                                :props="{ checkStrictly: true, value: 'id', label: 'title' }"
+                                placeholder="请选择上级菜单"
+                                clearable
+                                class="w100"
+                                v-model="ruleForm.menuSuperior"
+                            >
+                            </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="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-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-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-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" />
+                            <!--							<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-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-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-select
+                                @change="handelMenu"
+                                v-model="ruleForm.projectId"
+                                controls-position="right"
+                                placeholder="请输入排序"
+                                class="w100"
+                            >
+                                <el-option v-for="item in projectList" :key="item.key" :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-number v-model="ruleForm.priority" controls-position="right" placeholder="请输入排序" class="w100" />
+                        </el-form-item>
+                    </el-col>
+                    <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+                        <el-form-item label="是否隐藏">
+                            <el-radio-group v-model="ruleForm.meta.isHide">
+                                <el-radio :label="true">隐藏</el-radio>
+                                <el-radio :label="false">不隐藏</el-radio>
+                            </el-radio-group>
+                        </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">{{ buttonName }}</el-button>
+                </span>
+            </template>
+        </el-dialog>
+    </div>
 </template>
 
 <script lang="ts">
-	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/menu/index'
-	import { ElMessageBox, ElMessage } from 'element-plus';
-	import {Session} from "/@/utils/storage";
-	// import { setBackEndControlRefreshRoutes } from "/@/router/backEnd";
+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/menu/index';
+import { ElMessageBox, ElMessage } from 'element-plus';
+import { Session } from '/@/utils/storage';
+// import { setBackEndControlRefreshRoutes } from "/@/router/backEnd";
 
-	export default defineComponent({
-		name: 'systemAddMenu',
-		components: { IconSelector },
-		setup(props,context) {
-			const stores = useRoutesList();
-			const { routesList } = storeToRefs(stores);
-			const state = reactive({
-				isShowDialog: false,
-				title:'',
-				buttonName:'',
-				// 参数请参考 `/src/router/route.ts` 中的 `dynamicRoutes` 路由菜单格式
-				ruleForm: {
-					projectId:'',
-					parentId:0,
-					menuSuperior: [], // 上级菜单
-					menuType: 'menu', // 菜单类型
-					name: '', // 路由名称
-					component: '', // 组件路径
-					priority: 0, // 菜单排序
-					path: '', // 路由路径
-					redirect: '', // 路由重定向,有子集 children 时
-					meta: {
-						title: '', // 菜单名称
-						icon: '', // 菜单图标
-						isHide: false, // 是否隐藏
-						isKeepAlive: true, // 是否缓存
-						isAffix: false, // 是否固定
-						isLink: '', // 外链/内嵌时链接地址(http:xxx.com),开启外链条件,`1、isLink: 链接地址不为空`
-						isIframe: false, // 是否内嵌,开启条件,`1、isIframe:true 2、isLink:链接地址不为空`
-						roles: '', // 权限标识,取角色管理
-					},
-					btnPower: '', // 菜单类型为按钮时,权限标识
-				},
-				menuData: [], // 上级菜单数据
-				projectList:[
-				],
-			});
-			// 获取 vuex 中的路由
-			const getMenuList = (routes: any) => {
-				const arr: any = [];
-				routes.map((val: any) => {
-					val['title'] = val.meta.title;
-					val['id'] = val.id
-					arr.push(val);
-					if (val.children) getMenuList(val.children);
-				});
-				return arr;
-			};
-			// 打开弹窗
-			const openDialog = (type:string,value:any,projectList: any,projectId:string) => {
-				state.projectList = JSON.parse(JSON.stringify(projectList))
-				state.isShowDialog = true;
-				if(type === '新增'){
-					state.buttonName = '新增'
-					state.title = '新增菜单'
-					state.ruleForm = {
-						projectId:projectId,
-						parentId:0,
-						menuSuperior: [],
-						menuType: 'menu',
-						name: '',
-						component: '',
-						priority: 0,
-						path: '',
-						redirect: '',
-						meta: {
-							title: '',
-							icon: '',
-							isHide: false,
-							isKeepAlive: true,
-							isAffix: false,
-							isLink: '',
-							isIframe: false,
-							roles: '',
-						},
-						btnPower: '',
-					}
-				}else{
-					state.buttonName = '修改'
-					state.title = '修改菜单'
-					state.ruleForm = JSON.parse(JSON.stringify(value))
-					state.ruleForm.projectId = projectId.toString()
-				}
-				handelMenu()
-			};
-			// 关闭弹窗
-			const closeDialog = () => {
-				state.isShowDialog = false;
-			};
-			// 是否内嵌下拉改变
-			// const onSelectIframeChange = () => {
-			// 	if (state.ruleForm.meta.isIframe) state.ruleForm.isLink = true;
-			// 	else state.ruleForm.isLink = false;
-			// };
-			// 取消
-			const onCancel = () => {
-				closeDialog();
-			};
-			// 新增
-			const onSubmit = async () => {
-				if(state.ruleForm.menuSuperior && state.ruleForm.menuSuperior !== []){
-					let menuId = JSON.parse(JSON.stringify(state.ruleForm.menuSuperior))
-					state.ruleForm.parentId = menuId[menuId.length - 1]
-				}
-				if(state.title === '新增菜单'){
-					let res = await useMenuApi().addMenu(state.ruleForm)
-					if(res.data.code === '200'){
-						ElMessage({
-							type:'success',
-							message:'菜单新增成功',
-							duration:2000
-						})
-						closeDialog();
-						context.emit('getMenuList')
-					}else{
-						ElMessage({
-							type:'warning',
-							message:res.data.msg
-						})
-					}
-				}else{
-					let res = await useMenuApi().modMenu(state.ruleForm)
-					if(res.data.code === '200'){
-						ElMessage({
-							type:'success',
-							message:'菜单修改成功',
-							duration:2000
-						})
-						closeDialog();
-						context.emit('getMenuList')
-					}else{
-						ElMessage({
-							type:'warning',
-							message:res.data.msg
-						})
-					}
-				}
+export default defineComponent({
+    name: 'systemAddMenu',
+    components: { IconSelector },
+    setup(props, context) {
+        const stores = useRoutesList();
+        const { routesList } = storeToRefs(stores);
+        const state = reactive({
+            isShowDialog: false,
+            title: '',
+            buttonName: '',
+            // 参数请参考 `/src/router/route.ts` 中的 `dynamicRoutes` 路由菜单格式
+            ruleForm: {
+                projectId: '',
+                parentId: 0,
+                menuSuperior: [], // 上级菜单
+                menuType: 'menu', // 菜单类型
+                name: '', // 路由名称
+                component: '', // 组件路径
+                priority: 0, // 菜单排序
+                path: '', // 路由路径
+                redirect: '', // 路由重定向,有子集 children 时
+                meta: {
+                    title: '', // 菜单名称
+                    icon: '', // 菜单图标
+                    isHide: false, // 是否隐藏
+                    isKeepAlive: true, // 是否缓存
+                    isAffix: false, // 是否固定
+                    isLink: '', // 外链/内嵌时链接地址(http:xxx.com),开启外链条件,`1、isLink: 链接地址不为空`
+                    isIframe: false, // 是否内嵌,开启条件,`1、isIframe:true 2、isLink:链接地址不为空`
+                    roles: [] // 权限标识,取角色管理
+                },
+                btnPower: '' // 菜单类型为按钮时,权限标识
+            },
+            menuData: [], // 上级菜单数据
+            projectList: []
+        });
+        // 获取 vuex 中的路由
+        const getMenuList = (routes: any) => {
+            const arr: any = [];
+            routes.map((val: any) => {
+                val['title'] = val.meta.title;
+                val['id'] = val.id;
+                arr.push(val);
+                if (val.children) getMenuList(val.children);
+            });
+            return arr;
+        };
+        // 打开弹窗
+        const openDialog = (type: string, value: any, projectList: any, projectId: string) => {
+            state.projectList = JSON.parse(JSON.stringify(projectList));
+            state.isShowDialog = true;
+            if (type === '新增') {
+                state.buttonName = '新增';
+                state.title = '新增菜单';
+                state.ruleForm = {
+                    projectId: projectId,
+                    parentId: 0,
+                    menuSuperior: [],
+                    menuType: 'menu',
+                    name: '',
+                    component: '',
+                    priority: 0,
+                    path: '',
+                    redirect: '',
+                    meta: {
+                        title: '',
+                        icon: '',
+                        isHide: false,
+                        isKeepAlive: true,
+                        isAffix: false,
+                        isLink: '',
+                        isIframe: false,
+                        roles: []
+                    },
+                    btnPower: ''
+                };
+            } else {
+                state.buttonName = '修改';
+                state.title = '修改菜单';
+                state.ruleForm = JSON.parse(JSON.stringify(value));
+                state.ruleForm.projectId = projectId.toString();
+            }
+            handelMenu();
+        };
+        // 关闭弹窗
+        const closeDialog = () => {
+            state.isShowDialog = false;
+        };
+        // 是否内嵌下拉改变
+        // const onSelectIframeChange = () => {
+        // 	if (state.ruleForm.meta.isIframe) state.ruleForm.isLink = true;
+        // 	else state.ruleForm.isLink = false;
+        // };
+        // 取消
+        const onCancel = () => {
+            closeDialog();
+        };
+        // 新增
+        const onSubmit = async () => {
+            if (state.ruleForm.menuSuperior && state.ruleForm.menuSuperior !== []) {
+                let menuId = JSON.parse(JSON.stringify(state.ruleForm.menuSuperior));
+                state.ruleForm.parentId = menuId[menuId.length - 1];
+            }
+            if (state.title === '新增菜单') {
+                let res = await useMenuApi().addMenu(state.ruleForm);
+                if (res.data.code === '200') {
+                    ElMessage({
+                        type: 'success',
+                        message: '菜单新增成功',
+                        duration: 2000
+                    });
+                    closeDialog();
+                    context.emit('getMenuList');
+                } else {
+                    ElMessage({
+                        type: 'warning',
+                        message: res.data.msg
+                    });
+                }
+            } else {
+                let res = await useMenuApi().modMenu(state.ruleForm);
+                if (res.data.code === '200') {
+                    ElMessage({
+                        type: 'success',
+                        message: '菜单修改成功',
+                        duration: 2000
+                    });
+                    closeDialog();
+                    context.emit('getMenuList');
+                } else {
+                    ElMessage({
+                        type: 'warning',
+                        message: res.data.msg
+                    });
+                }
+            }
 
-				// closeDialog(); // 关闭弹窗
-				// setBackEndControlRefreshRoutes() // 刷新菜单,未进行后端接口测试
-			};
+            // closeDialog(); // 关闭弹窗
+            // setBackEndControlRefreshRoutes() // 刷新菜单,未进行后端接口测试
+        };
 
-			const handelMenu = async () => {
-				let res = await useMenuApi().getMenuAdmin(state.ruleForm.projectId)
-				state.menuData = JSON.parse(JSON.stringify(getMenuList(res.data.data)))
-			}
-			// 页面加载时
-			onMounted(async () => {
-				// let res = await useMenuApi().getMenuAdmin(Session.get('projectId'))
-				// state.menuData = JSON.parse(JSON.stringify(getMenuList(res.data.data)))
-			});
-			return {
-				openDialog,
-				closeDialog,
-				onCancel,
-				onSubmit,
-				handelMenu,
-				...toRefs(state),
-			};
-		},
-	});
+        const handelMenu = async () => {
+            let res = await useMenuApi().getMenuAdmin(state.ruleForm.projectId);
+            state.menuData = JSON.parse(JSON.stringify(getMenuList(res.data.data)));
+        };
+        // 页面加载时
+        onMounted(async () => {
+            // let res = await useMenuApi().getMenuAdmin(Session.get('projectId'))
+            // state.menuData = JSON.parse(JSON.stringify(getMenuList(res.data.data)))
+        });
+        return {
+            openDialog,
+            closeDialog,
+            onCancel,
+            onSubmit,
+            handelMenu,
+            ...toRefs(state)
+        };
+    }
+});
 </script>
diff --git a/src/views/system/menu/index.vue b/src/views/system/menu/index.vue
index 1fc2094..0d0881c 100644
--- a/src/views/system/menu/index.vue
+++ b/src/views/system/menu/index.vue
@@ -146,6 +146,20 @@
 					})
 				}
 			};
+
+			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
+					})
+				}
+			};
+
 			onMounted( () => {
 				getMenuList()
 			});
diff --git a/src/views/system/role/component/addRole.vue b/src/views/system/role/component/addRole.vue
deleted file mode 100644
index adb0e83..0000000
--- a/src/views/system/role/component/addRole.vue
+++ /dev/null
@@ -1,240 +0,0 @@
-<template>
-	<div class="system-add-role-container">
-		<el-dialog title="新增角色" v-model="isShowDialog" width="769px">
-			<el-form :model="ruleForm" 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="ruleForm.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="角色标识">
-							<template #label>
-								<el-tooltip effect="dark" content="用于 `router/route.ts` meta.roles" placement="top-start">
-									<span>角色标识</span>
-								</el-tooltip>
-							</template>
-							<el-input v-model="ruleForm.roleSign" 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-number v-model="ruleForm.sort" :min="0" :max="999" controls-position="right" placeholder="请输入排序" class="w100" />
-						</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="ruleForm.status" inline-prompt active-text="启" inactive-text="禁"></el-switch>
-						</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="ruleForm.describe" type="textarea" placeholder="请输入角色描述" maxlength="150"></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-tree :data="menuData" :props="menuProps" show-checkbox class="menu-data-tree" />
-						</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>
-</template>
-
-<script lang="ts">
-import { reactive, toRefs, defineComponent } from 'vue';
-
-// 定义接口来定义对象的类型
-interface MenuDataTree {
-	id: number;
-	label: string;
-	children?: MenuDataTree[];
-}
-interface RoleState {
-	isShowDialog: boolean;
-	ruleForm: {
-		roleName: string;
-		roleSign: string;
-		sort: number;
-		status: boolean;
-		describe: string;
-	};
-	menuData: Array<MenuDataTree>;
-	menuProps: {
-		children: string;
-		label: string;
-	};
-}
-
-export default defineComponent({
-	name: 'systemAddRole',
-	setup() {
-		const state = reactive<RoleState>({
-			isShowDialog: false,
-			ruleForm: {
-				roleName: '', // 角色名称
-				roleSign: '', // 角色标识
-				sort: 0, // 排序
-				status: true, // 角色状态
-				describe: '', // 角色描述
-			},
-			menuData: [],
-			menuProps: {
-				children: 'children',
-				label: 'label',
-			},
-		});
-		// 打开弹窗
-		const openDialog = () => {
-			state.isShowDialog = true;
-			getMenuData();
-		};
-		// 关闭弹窗
-		const closeDialog = () => {
-			state.isShowDialog = false;
-		};
-		// 取消
-		const onCancel = () => {
-			closeDialog();
-		};
-		// 新增
-		const onSubmit = () => {
-			closeDialog();
-		};
-		// 获取菜单结构数据
-		const getMenuData = () => {
-			state.menuData = [
-				{
-					id: 1,
-					label: '系统管理',
-					children: [
-						{
-							id: 11,
-							label: '菜单管理',
-							children: [
-								{
-									id: 111,
-									label: '菜单新增',
-								},
-								{
-									id: 112,
-									label: '菜单修改',
-								},
-								{
-									id: 113,
-									label: '菜单删除',
-								},
-								{
-									id: 114,
-									label: '菜单查询',
-								},
-							],
-						},
-						{
-							id: 12,
-							label: '角色管理',
-							children: [
-								{
-									id: 121,
-									label: '角色新增',
-								},
-								{
-									id: 122,
-									label: '角色修改',
-								},
-								{
-									id: 123,
-									label: '角色删除',
-								},
-								{
-									id: 124,
-									label: '角色查询',
-								},
-							],
-						},
-						{
-							id: 13,
-							label: '用户管理',
-							children: [
-								{
-									id: 131,
-									label: '用户新增',
-								},
-								{
-									id: 132,
-									label: '用户修改',
-								},
-								{
-									id: 133,
-									label: '用户删除',
-								},
-								{
-									id: 134,
-									label: '用户查询',
-								},
-							],
-						},
-					],
-				},
-				{
-					id: 2,
-					label: '权限管理',
-					children: [
-						{
-							id: 21,
-							label: '前端控制',
-							children: [
-								{
-									id: 211,
-									label: '页面权限',
-								},
-								{
-									id: 212,
-									label: '页面权限',
-								},
-							],
-						},
-						{
-							id: 22,
-							label: '后端控制',
-							children: [
-								{
-									id: 221,
-									label: '页面权限',
-								},
-							],
-						},
-					],
-				},
-			];
-		};
-		return {
-			openDialog,
-			closeDialog,
-			onCancel,
-			onSubmit,
-			...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;
-	}
-}
-</style>
diff --git a/src/views/system/role/component/editRole.vue b/src/views/system/role/component/editRole.vue
deleted file mode 100644
index fc6fe29..0000000
--- a/src/views/system/role/component/editRole.vue
+++ /dev/null
@@ -1,242 +0,0 @@
-<template>
-	<div class="system-edit-role-container">
-		<el-dialog title="修改角色" v-model="isShowDialog" width="769px">
-			<el-form :model="ruleForm" 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="ruleForm.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="角色标识">
-							<template #label>
-								<el-tooltip effect="dark" content="用于 `router/route.ts` meta.roles" placement="top-start">
-									<span>角色标识</span>
-								</el-tooltip>
-							</template>
-							<el-input v-model="ruleForm.roleSign" 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-number v-model="ruleForm.sort" :min="0" :max="999" controls-position="right" placeholder="请输入排序" class="w100" />
-						</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="ruleForm.status" inline-prompt active-text="启" inactive-text="禁"></el-switch>
-						</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="ruleForm.describe" type="textarea" placeholder="请输入角色描述" maxlength="150"></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-tree :data="menuData" :props="menuProps" :default-checked-keys="[112, 113]" node-key="id" show-checkbox class="menu-data-tree" />
-						</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>
-</template>
-
-<script lang="ts">
-import { reactive, toRefs, defineComponent } from 'vue';
-
-// 定义接口来定义对象的类型
-interface MenuDataTree {
-	id: number;
-	label: string;
-	children?: MenuDataTree[];
-}
-interface DialogRow {
-	roleName: string;
-	roleSign: string;
-	sort: number;
-	status: boolean;
-	describe: string;
-}
-interface RoleState {
-	isShowDialog: boolean;
-	ruleForm: DialogRow;
-	menuData: Array<MenuDataTree>;
-	menuProps: {
-		children: string;
-		label: string;
-	};
-}
-
-export default defineComponent({
-	name: 'systemEditRole',
-	setup() {
-		const state = reactive<RoleState>({
-			isShowDialog: false,
-			ruleForm: {
-				roleName: '', // 角色名称
-				roleSign: '', // 角色标识
-				sort: 0, // 排序
-				status: true, // 角色状态
-				describe: '', // 角色描述
-			},
-			menuData: [],
-			menuProps: {
-				children: 'children',
-				label: 'label',
-			},
-		});
-		// 打开弹窗
-		const openDialog = (row: DialogRow) => {
-			state.ruleForm = row;
-			state.isShowDialog = true;
-			getMenuData();
-		};
-		// 关闭弹窗
-		const closeDialog = () => {
-			state.isShowDialog = false;
-		};
-		// 取消
-		const onCancel = () => {
-			closeDialog();
-		};
-		// 新增
-		const onSubmit = () => {
-			closeDialog();
-		};
-		// 获取菜单结构数据
-		const getMenuData = () => {
-			state.menuData = [
-				{
-					id: 1,
-					label: '系统管理',
-					children: [
-						{
-							id: 11,
-							label: '菜单管理',
-							children: [
-								{
-									id: 111,
-									label: '菜单新增',
-								},
-								{
-									id: 112,
-									label: '菜单修改',
-								},
-								{
-									id: 113,
-									label: '菜单删除',
-								},
-								{
-									id: 114,
-									label: '菜单查询',
-								},
-							],
-						},
-						{
-							id: 12,
-							label: '角色管理',
-							children: [
-								{
-									id: 121,
-									label: '角色新增',
-								},
-								{
-									id: 122,
-									label: '角色修改',
-								},
-								{
-									id: 123,
-									label: '角色删除',
-								},
-								{
-									id: 124,
-									label: '角色查询',
-								},
-							],
-						},
-						{
-							id: 13,
-							label: '用户管理',
-							children: [
-								{
-									id: 131,
-									label: '用户新增',
-								},
-								{
-									id: 132,
-									label: '用户修改',
-								},
-								{
-									id: 133,
-									label: '用户删除',
-								},
-								{
-									id: 134,
-									label: '用户查询',
-								},
-							],
-						},
-					],
-				},
-				{
-					id: 2,
-					label: '权限管理',
-					children: [
-						{
-							id: 21,
-							label: '前端控制',
-							children: [
-								{
-									id: 211,
-									label: '页面权限',
-								},
-								{
-									id: 212,
-									label: '页面权限',
-								},
-							],
-						},
-						{
-							id: 22,
-							label: '后端控制',
-							children: [
-								{
-									id: 221,
-									label: '页面权限',
-								},
-							],
-						},
-					],
-				},
-			];
-		};
-		return {
-			openDialog,
-			closeDialog,
-			onCancel,
-			onSubmit,
-			...toRefs(state),
-		};
-	},
-});
-</script>
-
-<style scoped lang="scss">
-.system-edit-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;
-	}
-}
-</style>
diff --git a/src/views/system/role/component/roleDialog.vue b/src/views/system/role/component/roleDialog.vue
new file mode 100644
index 0000000..d3b7c04
--- /dev/null
+++ b/src/views/system/role/component/roleDialog.vue
@@ -0,0 +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>
+</template>
+
+<script lang="ts">
+import { ElMessage } from 'element-plus';
+import { reactive, toRefs, defineComponent } from 'vue';
+import {useRoleApi} from "/@/api/role";
+
+// 定义接口来定义对象的类型
+interface MenuDataTree {
+	id: number;
+	label: string;
+	children?: MenuDataTree[];
+}
+interface RoleState {
+	title:string,
+	buttonName:string,
+	isShowRoleDialog: boolean;
+	roleForm: {
+		roleName: string;
+        roleCode: string;
+        roleInfo: 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: {
+                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),
+		};
+	},
+});
+</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;
+	}
+}
+</style>
diff --git a/src/views/system/role/index.vue b/src/views/system/role/index.vue
index 93ec4b2..93922e3 100644
--- a/src/views/system/role/index.vue
+++ b/src/views/system/role/index.vue
@@ -9,7 +9,7 @@
 					</el-icon>
 					查询
 				</el-button>
-				<el-button size="default" type="success" class="ml10" @click="onOpenAddRole">
+				<el-button size="default" type="success" class="ml10" @click="onOpenDialogRef('新增','')">
 					<el-icon>
 						<ele-FolderAdd />
 					</el-icon>
@@ -18,55 +18,35 @@
 			</div>
 			<el-table :data="tableData.data" style="width: 100%">
 				<el-table-column type="index" label="序号" width="60" />
-				<el-table-column prop="name" label="角色名称" show-overflow-tooltip></el-table-column>
-				<el-table-column prop="code" label="角色标识" show-overflow-tooltip></el-table-column>
-				<el-table-column prop="sort" 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="info" label="角色描述" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="roleName" label="角色名称" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="roleCode" label="角色标识" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="roleInfo" label="角色描述" show-overflow-tooltip></el-table-column>
 				<el-table-column prop="createTime" label="创建时间" show-overflow-tooltip></el-table-column>
-				<el-table-column label="操作" width="100">
+				<el-table-column label="操作" width="150">
 					<template #default="scope">
-						<el-button :disabled="scope.row.roleName === '超级管理员'" size="small" text type="primary" @click="onOpenEditRole(scope.row)"
-							>修改</el-button
-						>
-						<el-button :disabled="scope.row.roleName === '超级管理员'" size="small" text type="primary" @click="onRowDel(scope.row)">删除</el-button>
+						<el-button size="small" text type="primary" @click="onOpenDialogRef('新增','')">新增</el-button>
+						<el-button size="small" text type="primary" @click="onOpenDialogRef('修改',scope.row)">修改</el-button>
+						<el-button 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="tableData.param.pageNum"
-				background
-				v-model:page-size="tableData.param.pageSize"
-				layout="total, sizes, prev, pager, next, jumper"
-				:total="tableData.total"
-			>
-			</el-pagination>
 		</el-card>
-		<AddRole ref="addRoleRef" />
-		<EditRole ref="editRoleRef" />
+		<roleDialog ref="roleDialogRef" @refreshRoleList="initRoleTableData"/>
 	</div>
 </template>
 
 <script lang="ts">
 import { toRefs, reactive, onMounted, ref, defineComponent } from 'vue';
 import { ElMessageBox, ElMessage } from 'element-plus';
-import AddRole from '/@/views/system/role/component/addRole.vue';
-import EditRole from '/@/views/system/role/component/editRole.vue';
+import roleDialog from '/@/views/system/role/component/roleDialog.vue';
 import {useRoleApi} from "/@/api/role";
+import {useMenuApi} from "/@/api/menu";
+import {Session} from "/@/utils/storage";
+import {initBackEndControlRoutes} from "/@/router/backEnd";
 
 // 定义接口来定义对象的类型
 interface TableData {
-	roleName: string;
+    roleName: string;
 	roleSign: string;
 	describe: string;
 	sort: number;
@@ -87,10 +67,9 @@
 
 export default defineComponent({
 	name: 'systemRole',
-	components: { AddRole, EditRole },
+	components: { roleDialog },
 	setup() {
-		const addRoleRef = ref();
-		const editRoleRef = ref();
+		const roleDialogRef = ref();
 		const state = reactive<TableDataState>({
 			tableData: {
 				data: [],
@@ -103,7 +82,7 @@
 			},
 		});
 		// 初始化表格数据
-		const initTableData = async () => {
+		const initRoleTableData = async () => {
 			let res = await useRoleApi().getRoleList()
 			if(res.data.code === '200'){
 				state.tableData.data = res.data.data;
@@ -113,15 +92,10 @@
 					message:res.data.msg
 				})
 			}
-
 		};
 		// 打开新增角色弹窗
-		const onOpenAddRole = () => {
-			addRoleRef.value.openDialog();
-		};
-		// 打开修改角色弹窗
-		const onOpenEditRole = (row: Object) => {
-			editRoleRef.value.openDialog(row);
+		const onOpenDialogRef = (type: string, value: any) => {
+			roleDialogRef.value.openDialog(type, value);
 		};
 		// 删除角色
 		const onRowDel = (row: any) => {
@@ -129,14 +103,25 @@
 				confirmButtonText: '确认',
 				cancelButtonText: '取消',
 				type: 'warning',
-			})
-				.then(() => {
-					ElMessage.success('删除成功');
-				})
-				.catch(() => {});
+			}).then(async () => {
+                let res = await useRoleApi().deleteRole({roleId:row.roleId})
+                if(res.data.code ==='200'){
+                    ElMessage({
+                        type:'success',
+                        duration:2000,
+                        message:'删除成功'
+                    })
+                    await initRoleTableData()
+                }else{
+                    ElMessage({
+                        type:'warning',
+                        message:res.data.msg
+                    })
+                }
+            }).catch(() => {});
 		};
 		const handleSearch = () => {
-			initTableData()
+			initRoleTableData()
 		}
 		// 分页改变
 		const onHandleSizeChange = (val: number) => {
@@ -148,17 +133,17 @@
 		};
 		// 页面加载时
 		onMounted(() => {
-			initTableData();
+			initRoleTableData();
 		});
 		return {
-			addRoleRef,
-			editRoleRef,
-			onOpenAddRole,
-			onOpenEditRole,
 			onRowDel,
+			roleDialog,
+			handleSearch,
+			roleDialogRef,
+			onOpenDialogRef,
+			initRoleTableData,
 			onHandleSizeChange,
 			onHandleCurrentChange,
-			handleSearch,
 			...toRefs(state),
 		};
 	},
diff --git a/src/views/system/user/component/addTeamLeader.vue b/src/views/system/user/component/addTeamLeader.vue
deleted file mode 100644
index 3c2d7ea..0000000
--- a/src/views/system/user/component/addTeamLeader.vue
+++ /dev/null
@@ -1,202 +0,0 @@
-<template>
-  <div class="system-edit-user-container">
-    <el-dialog title="修改用户" v-model="isShowDialog" width="769px">
-      <el-form :model="ruleForm" 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="ruleForm.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="ruleForm.userNickname" 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.roleSign" placeholder="请选择" clearable class="w100">
-                <el-option label="超级管理员" value="admin"></el-option>
-                <el-option label="普通用户" value="common"></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="deptData"
-                  :props="{ checkStrictly: true, value: 'deptName', label: 'deptName' }"
-                  placeholder="请选择部门"
-                  clearable
-                  class="w100"
-                  v-model="ruleForm.department"
-              >
-                <template #default="{ node, data }">
-                  <span>{{ data.deptName }}</span>
-                  <span v-if="!node.isLeaf"> ({{ data.children.length }}) </span>
-                </template>
-              </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="ruleForm.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="ruleForm.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="ruleForm.sex" placeholder="请选择" clearable class="w100">
-                <el-option label="男" value="男"></el-option>
-                <el-option label="女" value="女"></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="ruleForm.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="ruleForm.overdueTime" 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="ruleForm.status" inline-prompt active-text="启" inactive-text="禁"></el-switch>
-            </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="ruleForm.describe" 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>
-</template>
-
-<script lang="ts">
-import { reactive, toRefs, onMounted, defineComponent } from 'vue';
-
-// 定义接口来定义对象的类型
-interface DeptData {
-  deptName: string;
-  createTime: string;
-  status: boolean;
-  sort: number | string;
-  describe: string;
-  id: number;
-  children?: DeptData[];
-}
-interface RuleFormRow {
-  userName: string;
-  userNickname: string;
-  roleSign: string;
-  department: any;
-  phone: string;
-  email: string;
-  sex: string;
-  password: string;
-  overdueTime: string;
-  status: boolean;
-  describe: string;
-}
-interface UserState {
-  isShowDialog: boolean;
-  ruleForm: RuleFormRow;
-  deptData: Array<DeptData>;
-}
-
-export default defineComponent({
-  name: 'systemEditUser',
-  setup() {
-    const state = reactive<UserState>({
-      isShowDialog: false,
-      ruleForm: {
-        userName: '', // 账户名称
-        userNickname: '', // 用户昵称
-        roleSign: '', // 关联角色
-        department: [], // 部门
-        phone: '', // 手机号
-        email: '', // 邮箱
-        sex: '', // 性别
-        password: '', // 账户密码
-        overdueTime: '', // 账户过期
-        status: true, // 用户状态
-        describe: '', // 用户描述
-      },
-      deptData: [], // 部门数据
-    });
-    // 打开弹窗
-    const openDialog = (row: RuleFormRow) => {
-      state.ruleForm = row;
-      state.isShowDialog = true;
-    };
-    // 关闭弹窗
-    const closeDialog = () => {
-      state.isShowDialog = false;
-    };
-    // 取消
-    const onCancel = () => {
-      closeDialog();
-    };
-    // 新增
-    const onSubmit = () => {
-      closeDialog();
-    };
-    // 初始化部门数据
-    const initTableData = () => {
-      state.deptData.push({
-        deptName: 'vueNextAdmin',
-        createTime: new Date().toLocaleString(),
-        status: true,
-        sort: Math.random(),
-        describe: '顶级部门',
-        id: Math.random(),
-        children: [
-          {
-            deptName: 'IT外包服务',
-            createTime: new Date().toLocaleString(),
-            status: true,
-            sort: Math.random(),
-            describe: '总部',
-            id: Math.random(),
-          },
-          {
-            deptName: '资本控股',
-            createTime: new Date().toLocaleString(),
-            status: true,
-            sort: Math.random(),
-            describe: '分部',
-            id: Math.random(),
-          },
-        ],
-      });
-    };
-    // 页面加载时
-    onMounted(() => {
-      initTableData();
-    });
-    return {
-      openDialog,
-      closeDialog,
-      onCancel,
-      onSubmit,
-      ...toRefs(state),
-    };
-  },
-});
-</script>
diff --git a/src/views/system/user/component/addUser.vue b/src/views/system/user/component/addUser.vue
deleted file mode 100644
index 4a78153..0000000
--- a/src/views/system/user/component/addUser.vue
+++ /dev/null
@@ -1,200 +0,0 @@
-<template>
-	<div class="system-add-user-container">
-		<el-dialog title="新增用户" v-model="isShowDialog" width="769px">
-			<el-form :model="ruleForm" 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="ruleForm.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="ruleForm.userNickname" 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.roleSign" placeholder="请选择" clearable class="w100">
-								<el-option label="超级管理员" value="admin"></el-option>
-								<el-option label="普通用户" value="common"></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="deptData"
-								:props="{ checkStrictly: true, value: 'deptName', label: 'deptName' }"
-								placeholder="请选择部门"
-								clearable
-								class="w100"
-								v-model="ruleForm.department"
-							>
-								<template #default="{ node, data }">
-									<span>{{ data.deptName }}</span>
-									<span v-if="!node.isLeaf"> ({{ data.children.length }}) </span>
-								</template>
-							</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="ruleForm.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="ruleForm.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="ruleForm.sex" placeholder="请选择" clearable class="w100">
-								<el-option label="男" value="男"></el-option>
-								<el-option label="女" value="女"></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="ruleForm.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="ruleForm.overdueTime" 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="ruleForm.status" inline-prompt active-text="启" inactive-text="禁"></el-switch>
-						</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="ruleForm.describe" 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>
-</template>
-
-<script lang="ts">
-import { reactive, toRefs, onMounted, defineComponent } from 'vue';
-
-// 定义接口来定义对象的类型
-interface DeptData {
-	deptName: string;
-	createTime: string;
-	status: boolean;
-	sort: number | string;
-	describe: string;
-	id: number;
-	children?: DeptData[];
-}
-interface UserState {
-	isShowDialog: boolean;
-	ruleForm: {
-		userName: string;
-		userNickname: string;
-		roleSign: string;
-		department: any;
-		phone: string;
-		email: string;
-		sex: string;
-		password: string;
-		overdueTime: string;
-		status: boolean;
-		describe: string;
-	};
-	deptData: Array<DeptData>;
-}
-
-export default defineComponent({
-	name: 'systemAddUser',
-	setup() {
-		const state = reactive<UserState>({
-			isShowDialog: false,
-			ruleForm: {
-				userName: '', // 账户名称
-				userNickname: '', // 用户昵称
-				roleSign: '', // 关联角色
-				department: [], // 部门
-				phone: '', // 手机号
-				email: '', // 邮箱
-				sex: '', // 性别
-				password: '', // 账户密码
-				overdueTime: '', // 账户过期
-				status: true, // 用户状态
-				describe: '', // 用户描述
-			},
-			deptData: [], // 部门数据
-		});
-		// 打开弹窗
-		const openDialog = () => {
-			state.isShowDialog = true;
-		};
-		// 关闭弹窗
-		const closeDialog = () => {
-			state.isShowDialog = false;
-		};
-		// 取消
-		const onCancel = () => {
-			closeDialog();
-		};
-		// 新增
-		const onSubmit = () => {
-			closeDialog();
-		};
-		// 初始化部门数据
-		const initTableData = () => {
-			state.deptData.push({
-				deptName: 'vueNextAdmin',
-				createTime: new Date().toLocaleString(),
-				status: true,
-				sort: Math.random(),
-				describe: '顶级部门',
-				id: Math.random(),
-				children: [
-					{
-						deptName: 'IT外包服务',
-						createTime: new Date().toLocaleString(),
-						status: true,
-						sort: Math.random(),
-						describe: '总部',
-						id: Math.random(),
-					},
-					{
-						deptName: '资本控股',
-						createTime: new Date().toLocaleString(),
-						status: true,
-						sort: Math.random(),
-						describe: '分部',
-						id: Math.random(),
-					},
-				],
-			});
-		};
-		// 页面加载时
-		onMounted(() => {
-			initTableData();
-		});
-		return {
-			openDialog,
-			closeDialog,
-			onCancel,
-			onSubmit,
-			...toRefs(state),
-		};
-	},
-});
-</script>
diff --git a/src/views/system/user/component/editUser.vue b/src/views/system/user/component/editUser.vue
deleted file mode 100644
index b7a0793..0000000
--- a/src/views/system/user/component/editUser.vue
+++ /dev/null
@@ -1,202 +0,0 @@
-<template>
-	<div class="system-edit-user-container">
-		<el-dialog title="修改用户" v-model="isShowDialog" width="769px">
-			<el-form :model="ruleForm" 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="ruleForm.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="ruleForm.userNickname" 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.roleSign" placeholder="请选择" clearable class="w100">
-								<el-option label="超级管理员" value="admin"></el-option>
-								<el-option label="普通用户" value="common"></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="deptData"
-								:props="{ checkStrictly: true, value: 'deptName', label: 'deptName' }"
-								placeholder="请选择部门"
-								clearable
-								class="w100"
-								v-model="ruleForm.department"
-							>
-								<template #default="{ node, data }">
-									<span>{{ data.deptName }}</span>
-									<span v-if="!node.isLeaf"> ({{ data.children.length }}) </span>
-								</template>
-							</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="ruleForm.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="ruleForm.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="ruleForm.sex" placeholder="请选择" clearable class="w100">
-								<el-option label="男" value="男"></el-option>
-								<el-option label="女" value="女"></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="ruleForm.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="ruleForm.overdueTime" 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="ruleForm.status" inline-prompt active-text="启" inactive-text="禁"></el-switch>
-						</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="ruleForm.describe" 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>
-</template>
-
-<script lang="ts">
-import { reactive, toRefs, onMounted, defineComponent } from 'vue';
-
-// 定义接口来定义对象的类型
-interface DeptData {
-	deptName: string;
-	createTime: string;
-	status: boolean;
-	sort: number | string;
-	describe: string;
-	id: number;
-	children?: DeptData[];
-}
-interface RuleFormRow {
-	userName: string;
-	userNickname: string;
-	roleSign: string;
-	department: any;
-	phone: string;
-	email: string;
-	sex: string;
-	password: string;
-	overdueTime: string;
-	status: boolean;
-	describe: string;
-}
-interface UserState {
-	isShowDialog: boolean;
-	ruleForm: RuleFormRow;
-	deptData: Array<DeptData>;
-}
-
-export default defineComponent({
-	name: 'systemEditUser',
-	setup() {
-		const state = reactive<UserState>({
-			isShowDialog: false,
-			ruleForm: {
-				userName: '', // 账户名称
-				userNickname: '', // 用户昵称
-				roleSign: '', // 关联角色
-				department: [], // 部门
-				phone: '', // 手机号
-				email: '', // 邮箱
-				sex: '', // 性别
-				password: '', // 账户密码
-				overdueTime: '', // 账户过期
-				status: true, // 用户状态
-				describe: '', // 用户描述
-			},
-			deptData: [], // 部门数据
-		});
-		// 打开弹窗
-		const openDialog = (row: RuleFormRow) => {
-			state.ruleForm = row;
-			state.isShowDialog = true;
-		};
-		// 关闭弹窗
-		const closeDialog = () => {
-			state.isShowDialog = false;
-		};
-		// 取消
-		const onCancel = () => {
-			closeDialog();
-		};
-		// 新增
-		const onSubmit = () => {
-			closeDialog();
-		};
-		// 初始化部门数据
-		const initTableData = () => {
-			state.deptData.push({
-				deptName: 'vueNextAdmin',
-				createTime: new Date().toLocaleString(),
-				status: true,
-				sort: Math.random(),
-				describe: '顶级部门',
-				id: Math.random(),
-				children: [
-					{
-						deptName: 'IT外包服务',
-						createTime: new Date().toLocaleString(),
-						status: true,
-						sort: Math.random(),
-						describe: '总部',
-						id: Math.random(),
-					},
-					{
-						deptName: '资本控股',
-						createTime: new Date().toLocaleString(),
-						status: true,
-						sort: Math.random(),
-						describe: '分部',
-						id: Math.random(),
-					},
-				],
-			});
-		};
-		// 页面加载时
-		onMounted(() => {
-			initTableData();
-		});
-		return {
-			openDialog,
-			closeDialog,
-			onCancel,
-			onSubmit,
-			...toRefs(state),
-		};
-	},
-});
-</script>
diff --git a/src/views/system/user/component/userDialog.vue b/src/views/system/user/component/userDialog.vue
new file mode 100644
index 0000000..5500677
--- /dev/null
+++ b/src/views/system/user/component/userDialog.vue
@@ -0,0 +1,221 @@
+<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>
+</template>
+
+<script lang="ts">
+import { reactive, toRefs, onMounted, defineComponent } from 'vue';
+import { ElMessageBox, ElMessage } from 'element-plus';
+import {userApi} from "/@/api/user";
+
+// 定义接口来定义对象的类型
+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>,
+}
+
+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))
+			}
+		};
+
+
+		// 新增修改
+		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),
+		};
+	},
+});
+</script>
diff --git a/src/views/system/user/index.vue b/src/views/system/user/index.vue
index a120c59..c4123dd 100644
--- a/src/views/system/user/index.vue
+++ b/src/views/system/user/index.vue
@@ -9,19 +9,20 @@
 					</el-icon>
 					查询
 				</el-button>
-				<el-button size="default" type="success" class="ml10" @click="onOpenAddUser">
+				<el-button size="default" type="success" class="ml10" @click="onOpenUserDialog('新增','')">
 					<el-icon>
 						<ele-FolderAdd />
 					</el-icon>
 					新增用户
 				</el-button>
 			</div>
-			<el-table :data="tableData.data" style="width: 100%">
+			<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="userNickname" label="用户昵称" show-overflow-tooltip></el-table-column>
-				<el-table-column prop="roleSign" label="关联角色" show-overflow-tooltip></el-table-column>
-				<el-table-column prop="department" label="部门" show-overflow-tooltip></el-table-column>
+				<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>
@@ -30,11 +31,10 @@
 						<el-tag type="info" v-else>禁用</el-tag>
 					</template>
 				</el-table-column>
-				<el-table-column prop="describe" label="用户描述" show-overflow-tooltip></el-table-column>
-				<el-table-column prop="createTime" label="创建时间" show-overflow-tooltip></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="onOpenEditUser(scope.row)">修改</el-button>
+						<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>
@@ -45,24 +45,25 @@
 				class="mt15"
 				:pager-count="5"
 				:page-sizes="[10, 20, 30]"
-				v-model:current-page="tableData.param.pageNum"
+				v-model:current-page="userTableData.listQuery.pageIndex"
 				background
-				v-model:page-size="tableData.param.pageSize"
+				v-model:page-size="userTableData.listQuery.pageSize"
 				layout="total, sizes, prev, pager, next, jumper"
-				:total="tableData.total"
+				:total="userTableData.total"
 			>
 			</el-pagination>
 		</el-card>
-		<AddUer ref="addUserRef" />
-		<EditUser ref="editUserRef" />
+		<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 AddUer from '/@/views/system/user/component/addUser.vue';
-import EditUser from '/@/views/system/user/component/editUser.vue';
+import userDialog from '/@/views/system/user/component/userDialog.vue';
+import {userApi} from "/@/api/user";
+import {departmentApi} from "/@/api/department";
+import {useRoleApi} from "/@/api/role";
 
 // 定义接口来定义对象的类型
 interface TableDataRow {
@@ -79,96 +80,124 @@
 	describe: string;
 	createTime: string;
 }
+interface DepartmentDataRow{
+
+}
 interface TableDataState {
-	tableData: {
+	userTableData: {
 		data: Array<TableDataRow>;
 		total: number;
 		loading: boolean;
-		param: {
-			pageNum: number;
+		listQuery: {
+			searchParams:{
+				username:string,
+				realName:string,
+			},
+			pageIndex: number;
 			pageSize: number;
 		};
 	};
+	departmentList:[];
+	roleList:[];
 }
 
 export default defineComponent({
 	name: 'systemUser',
-	components: { AddUer, EditUser },
+	components: { userDialog },
 	setup() {
-		const addUserRef = ref();
-		const editUserRef = ref();
+		const userRef = ref();
 		const state = reactive<TableDataState>({
-			tableData: {
+			userTableData: {
 				data: [],
 				total: 0,
 				loading: false,
-				param: {
-					pageNum: 1,
+				listQuery: {
+					searchParams:{
+						username:'',
+						realName:'',
+					},
+					pageIndex: 1,
 					pageSize: 10,
 				},
 			},
+			departmentList:[],
+			roleList:[],
 		});
 		// 初始化表格数据
-		const initTableData = () => {
-			const data: Array<TableDataRow> = [];
-			for (let i = 0; i < 2; i++) {
-				data.push({
-					userName: i === 0 ? 'admin' : 'test',
-					userNickname: i === 0 ? '我是管理员' : '我是普通用户',
-					roleSign: i === 0 ? 'admin' : 'common',
-					department: i === 0 ? ['vueNextAdmin', 'IT外包服务'] : ['vueNextAdmin', '资本控股'],
-					phone: '12345678910',
-					email: 'vueNextAdmin@123.com',
-					sex: '女',
-					password: '123456',
-					overdueTime: new Date(),
-					status: true,
-					describe: i === 0 ? '不可删除' : '测试用户',
-					createTime: new Date().toLocaleString(),
-				});
+		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
+				})
 			}
-			state.tableData.data = data;
-			state.tableData.total = state.tableData.data.length;
 		};
-		// 打开新增用户弹窗
-		const onOpenAddUser = () => {
-			addUserRef.value.openDialog();
+
+		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 onOpenUserDialog = (type: string,value: any) => {
+			userRef.value.openDialog(type, value, state.departmentList,state.roleList);
 		};
-		// 打开修改用户弹窗
-		const onOpenEditUser = (row: TableDataRow) => {
-			editUserRef.value.openDialog(row);
-		};
+
 		// 删除用户
 		const onRowDel = (row: TableDataRow) => {
 			ElMessageBox.confirm(`此操作将永久删除账户名称:“${row.userName}”,是否继续?`, '提示', {
 				confirmButtonText: '确认',
 				cancelButtonText: '取消',
 				type: 'warning',
-			})
-				.then(() => {
+			}).then(() => {
 					ElMessage.success('删除成功');
-				})
-				.catch(() => {});
+			}).catch(() => {});
 		};
 		// 分页改变
 		const onHandleSizeChange = (val: number) => {
-			state.tableData.param.pageSize = val;
+			state.userTableData.listQuery.pageSize = val;
+			initUserTableData()
 		};
 		// 分页改变
 		const onHandleCurrentChange = (val: number) => {
-			state.tableData.param.pageNum = val;
+			state.userTableData.listQuery.pageSize = val;
+			initUserTableData()
 		};
 		// 页面加载时
 		onMounted(() => {
-			initTableData();
+			initUserTableData();
+			getDepartmentData();
+			getRoleData();
 		});
 		return {
-			addUserRef,
-			editUserRef,
-			onOpenAddUser,
-			onOpenEditUser,
+			userRef,
+			onOpenUserDialog,
 			onRowDel,
 			onHandleSizeChange,
+			initUserTableData,
 			onHandleCurrentChange,
 			...toRefs(state),
 		};

--
Gitblit v1.9.2