zhangchong %!s(int64=2) %!d(string=hai) anos
pai
achega
63ef37568b

+ 19 - 9
src/api/system/roles.ts

@@ -96,7 +96,7 @@ export const getUserListByIds = (params: any) => {
  */
  export const dataAuthList = () => {
 	return request({
-		url: `/api/v1/Role/datatable-list`,
+		url: `/api/v1/Role/tables`,
 		method: 'get',
 	});
 };
@@ -107,7 +107,7 @@ export const getUserListByIds = (params: any) => {
  */
  export const addDataAuth = (data: object) => {
 	return request({
-		url: `/api/v1/Role/add-data-authority`,
+		url: `/api/v1/Role/accesslevel`,
 		method: 'post',
 		data
 	});
@@ -119,8 +119,8 @@ export const getUserListByIds = (params: any) => {
  */
  export const editDataAuth = (data: object) => {
 	return request({
-		url: `/api/v1/Role/update-data-authority`,
-		method: 'post',
+		url: `/api/v1/Role/accesslevel`,
+		method: 'put',
 		data
 	});
 };
@@ -131,19 +131,29 @@ export const getUserListByIds = (params: any) => {
  */
  export const deleteDataAuth = (id: string) => {
 	return request({
-		url: `/api/v1/Role/remove-data-authority/${id}`,
+		url: `/api/v1/Role/accesslevel/${id}`,
 		method: 'delete',
 	});
 };
 /**
  * @description: 获取角色所有数据权限设置
- * @param {object} params  
+ * @param {string} roleId  
  * @return {*}
  */
- export const getdataauthoritybyrole = (params: object) => {
+ export const getdataauthoritybyrole = (roleId: string| any[]) => {
 	return request({
-		url: `/api/v1/Role/getdataauthoritybyrole`,
+		url: `/api/v1/Role/${roleId}/accesslevels`,
+		method: 'get',
+	});
+};
+/**
+ * @description: 获取角色所有数据权限基础数据
+ * @param 
+ * @return {*}
+ */
+ export const baseData = () => {
+	return request({
+		url: `/api/v1/Role/base-data`,
 		method: 'get',
-		params
 	});
 };

+ 12 - 5
src/layout/navBars/breadcrumb/user.vue

@@ -132,7 +132,7 @@
 							</el-icon>
 						</template>
 					</el-input>
-					<div class="intensity login-animation4">
+					<div class="intensity">
 						<span class="psdText">密码强度:{{ modes === 1 ? '弱' : modes === 2 ? '中' : modes === 3 ? '强' : '' }}</span>
 						<span class="line ruo" :class="modes === 1 ? 'low' : ''"></span>
 						<span class="line zhong" :class="modes === 2 ? 'middle' : ''"></span>
@@ -248,6 +248,9 @@ const checkPassword = (rule: any, value: string, callback: any) => {
 	if (modes.value == 0 || modes.value == 1) {
 		return callback('提示:密码不得少于8位数,且必须包含字母大小写和特殊字符'); //弱密码
 	}
+	if (value === state.dutyForm.currentPassword) {
+		return callback('新密码不能与旧密码一致,请重新输入');
+	}
 	return callback();
 };
 // 检查输入密码是否一致
@@ -452,15 +455,19 @@ const save = () => {
 			loading.value = true;
 			changePwd(state.dutyForm)
 				.then(async () => {
-					//
-					// 清楚缓存
-					Session.clear();
-					router.push('/');
 					ElNotification({
 						title: '成功',
 						type: 'success',
 						message: '密码修改成功,请重新登录',
 					});
+					setTimeout(() => {
+						loading.value = false;
+						// 使用 reload 时,不需要调用 resetRoute() 重置路由
+						window.location.reload();
+						// 清楚缓存
+						Session.clear();
+						Local.clear();
+					}, 1000);
 				})
 				.catch(() => {
 					showDutyDialog.value = false;

+ 4 - 3
src/router/backEnd.ts

@@ -56,7 +56,7 @@ const getAppConfigFn = async () => {
 const checkPwd = () => {
 	pwdCheck().then((res: any) => {
 		if (!res.result) {
-			router.replace('/changePwd');
+			router.replace('/resetPwd');
 		}
 	})
 }
@@ -75,6 +75,7 @@ export async function initBackEndControlRoutes() {
 	if (window.nextLoading === undefined) NextLoading.start();
 	// 无 token 停止执行下一步
 	if (!Session.get('token')) return false;
+	
 	let resRouter = null;
 	if (Local.get('requestOldRoutes')) { //获取到缓存
 		resRouter = Local.get('requestOldRoutes');
@@ -94,11 +95,11 @@ export async function initBackEndControlRoutes() {
 		useRequestOldRoutes().setRequestOldRoutes(JSON.parse(JSON.stringify(resRouter)));
 		// 存入缓存
 		Local.set('requestOldRoutes', resRouter);
-		// 检查是否修改过密码
-		checkPwd();
 		// 获取系统配置
 		getAppConfigFn();
 	}
+	// 检查是否修改过密码
+	checkPwd();
 	// 触发初始化用户信息 pinia
 	await useUserInfo().setUserInfos();
 	// 处理路由(component),替换 dynamicRoutes(/@/router/route)第一个顶级 children 的路由

+ 1 - 1
src/router/frontEnd.ts

@@ -14,7 +14,7 @@ import { pwdCheck } from '/@/api/login';
 function checkPwd(){
 	pwdCheck().then((res:any)=>{
 		if(!res.result){
-			router.replace('/changePwd');
+			router.replace('/resetPwd');
 		}
 	})
 }

+ 50 - 11
src/router/index.ts

@@ -89,22 +89,18 @@ export function formatTwoStageRoutes(arr: any) {
 	});
 	return newArr;
 }
+
+const whiteList = ['/login', '/forgetPwd']//称为白名单,意思就是不需要有token,就可以访问到的路径
 // 路由加载前
 router.beforeEach(async (to, from, next) => {
 	NProgress.configure({ showSpinner: false });
 	if (to.meta.title) NProgress.start();
 	const token = Session.get('token');
-	if (to.path === '/login' && !token) {
-		next();
-		NProgress.done();
-	} else {
-		if (!token) {
-			next(`/login?redirect=${to.path}&params=${JSON.stringify(to.query ? to.query : to.params)}`);
-			Session.clear();
-			Local.clear();
-			NProgress.done();
-		} else if (token && to.path === '/login') {
-			next('/home');
+	if (token) {
+		// 如果有token
+		if (to.path === '/login') {
+			// 如果有token,且要去登录,强制跳转到首页
+			next('/home')
 			NProgress.done();
 		} else {
 			const storesRoutesList = useRoutesList(pinia);
@@ -124,7 +120,50 @@ router.beforeEach(async (to, from, next) => {
 				next();
 			}
 		}
+	} else {
+		// 如果无token
+		// 假如在白名单,则直接放行,不在则直接强制跳转到登录
+		if (!whiteList.includes(to.path)) {
+			next(`/login?redirect=${to.path}&params=${JSON.stringify(to.query ? to.query : to.params)}`);
+			NProgress.done();
+		} else {
+			next();
+			Session.clear();
+			Local.clear();
+			NProgress.done();
+		}
 	}
+	// if (to.path === '/login' && !token) {
+	// 	next();
+	// 	NProgress.done();
+	// } else {
+	// 	if (!token) {
+	// 		next(`/login?redirect=${to.path}&params=${JSON.stringify(to.query ? to.query : to.params)}`);
+	// 		Session.clear();
+	// 		Local.clear();
+	// 		NProgress.done();
+	// 	} else if (token && to.path === '/login') {
+	// 		next('/home');
+	// 		NProgress.done();
+	// 	} else {
+	// 		const storesRoutesList = useRoutesList(pinia);
+	// 		const { routesList } = storeToRefs(storesRoutesList);
+	// 		if (routesList.value.length === 0) {
+	// 			if (isRequestRoutes) {
+	// 				// 后端控制路由:路由数据初始化,防止刷新时丢失
+	// 				await initBackEndControlRoutes();
+	// 				// 解决刷新时,一直跳 404 页面问题,关联问题 No match found for location with path 'xxx'
+	// 				next({ path: to.path, query: to.query });
+	// 			} else {
+	// 				// https://gitee.com/lyt-top/vue-next-admin/issues/I5F1HP
+	// 				await initFrontEndControlRoutes();
+	// 				next({ path: to.path, query: to.query });
+	// 			}
+	// 		} else {
+	// 			next();
+	// 		}
+	// 	}
+	// }
 });
 
 // 路由加载后

+ 11 - 3
src/router/route.ts

@@ -106,11 +106,19 @@ export const staticRoutes: Array<RouteRecordRaw> = [
 		},
 	},
 	{
-		path: '/changePwd',
-		name: 'changePwd',
-		component: () => import('/@/views/changePwd/index.vue'),
+		path: '/forgetPwd',
+		name: 'forgetPwd',
+		component: () => import('/@/views/forgetPwd/index.vue'),
 		meta: {
 			title: '修改密码',
 		},
+	},
+	{
+		path: '/resetPwd',
+		name: 'resetPwd',
+		component: () => import('/@/views/resetPwd/index.vue'),
+		meta: {
+			title: '重置密码',
+		},
 	}
 ];

+ 0 - 2
src/theme/app.scss

@@ -11,7 +11,6 @@
 	--hotline-color-white: #ffffff;
 	// 整体背景颜色
 	--hotline-bg-main-color: #f0f4ff;
-
 	--hotline-bg-color: #f5f5ff;
 	--hotline-border-color-light: #f1f2f3;
 	--hotline-color-primary-lighter: #ecf5ff;
@@ -23,7 +22,6 @@
 	--hotline-color-seting-main: #e9eef3;
 	--hotline-color-seting-aside: #d3dce6;
 	--hotline-color-seting-header: #b3c0d1;
-	--hotline--login-text-color: #4564e9;
 	--hotline-bg-grey-color: #999;
 	// 主题字体颜色
 	--hotline-color-text-main: #333;

+ 267 - 0
src/views/forgetPwd/component/forgetPwd.vue

@@ -0,0 +1,267 @@
+<template>
+	<el-form class="forgetPwd-content-form" ref="forgetRef" :model="state.ruleForm" :rules="rules" label-position="top" label-width="100px">
+		<el-form-item prop="currentPassword" class="login-animation1" label="旧密码">
+			<el-input
+				class="inputDeep"
+				clearable
+				type="password"
+				show-password
+				placeholder="请输旧就密码"
+				v-model="state.ruleForm.currentPassword"
+				autocomplete="off"
+			>
+				<template #prefix>
+					<el-icon class="el-input__icon">
+						<ele-Unlock />
+					</el-icon>
+				</template>
+			</el-input>
+		</el-form-item>
+		<el-form-item prop="newPassword" label="新密码" class="login-animation2">
+			<el-input
+				class="inputDeep"
+				clearable
+				type="password"
+				show-password
+				placeholder="请输入新密码"
+				v-model="state.ruleForm.newPassword"
+				autocomplete="off"
+			>
+				<template #prefix>
+					<el-icon class="el-input__icon">
+						<ele-Unlock />
+					</el-icon>
+				</template>
+			</el-input>
+			<div class="intensity">
+				<span class="psdText">密码强度:{{ modes === 1 ? '弱' : modes === 2 ? '中' : modes === 3 ? '强' : '' }}</span>
+				<span class="line ruo" :class="modes === 1 ? 'low' : ''"></span>
+				<span class="line zhong" :class="modes === 2 ? 'middle' : ''"></span>
+				<span class="line qiang" :class="modes === 3 ? 'high' : ''"></span>
+			</div>
+		</el-form-item>
+		<el-form-item prop="confirmPassword" label="确认密码" class="login-animation3">
+			<el-input
+				class="inputDeep"
+				clearable
+				type="password"
+				show-password
+				placeholder="请再次输入密码"
+				v-model="state.ruleForm.confirmPassword"
+				autocomplete="off"
+			>
+				<template #prefix>
+					<el-icon class="el-input__icon">
+						<ele-Unlock />
+					</el-icon>
+				</template>
+			</el-input>
+		</el-form-item>
+		<el-button
+			type="primary"
+			class="forgetPwd-content-submit login-animation3"
+			round
+			@click="onChangeConfirm(forgetPwdRef)"
+			v-waves="'light'"
+			:loading="state.loading"
+			>确认修改</el-button
+		>
+		<div class="font12 mt10 forgetPwd-msg login-animation4">提示:密码不得少于8位数,且必须包含数字、字母大小写和特殊字符</div>
+		<div class="login-msg login-animation4">
+			<span></span>
+			<el-button link type="primary" class="font16" @click="goLogin">返回登录</el-button>
+		</div>
+	</el-form>
+</template> 
+
+<script setup lang="ts" name="forgetPwdComponent">
+import { reactive, ref } from 'vue';
+import { useRouter } from 'vue-router';
+import { ElNotification } from 'element-plus';
+import type { FormInstance } from 'element-plus';
+import { Session } from '/@/utils/storage';
+import { changePwd } from '/@/api/login/user';
+// 修改密码参数类型
+interface ChangePwdState {
+	currentPassword: string;
+	newPassword: string;
+	confirmPassword: string;
+}
+// 定义变量
+const router = useRouter();
+const state = reactive({
+	ruleForm: <ChangePwdState>{
+		currentPassword: '',
+		newPassword: '',
+		confirmPassword: '',
+	},
+	loading: false,
+});
+const forgetPwdRef = ref<FormInstance>();
+// 确认重置
+const onChangeConfirm = async (formEl: FormInstance | undefined) => {
+	if (!formEl) return;
+	await formEl.validate((valid) => {
+		if (valid) {
+			state.loading = true;
+			changePwd(state.ruleForm)
+				.then(async () => {
+					//
+					// 清楚缓存
+					Session.clear();
+					router.push('/');
+					ElNotification({
+						title: '成功',
+						type: 'success',
+						message: '密码重置成功,请重新登录',
+					});
+				})
+				.catch(() => {
+					state.loading = false;
+				});
+		}
+	});
+};
+//  检查密码强度
+let modes = ref<number>(0);
+const checkPassword = (rule: any, value: string, callback: any) => {
+	if (!value) {
+		modes.value = 0;
+		return callback('新密码不能为空');
+	}
+	if (value.length < 8) {
+		modes.value = 0;
+		return callback('新密码不少于8位');
+	}
+	/*
+    最短8位, {6,}
+    可以包含小写大母 [a-z] 和大写字母 [A-Z]
+    可以包含数字 [0-9]
+    可以包含下划线 [ _ ] 和减号 [ - ]
+  */
+	if (/^[\w_-]{6,}$/.test(state.ruleForm.newPassword)) {
+		modes.value = 1;
+	}
+	/*
+    最短8位, {8,}
+    必须包含1个数字
+    必须包含1个小写字母
+    必须包含1个大写字母
+    必须包含1个特殊字符
+  */
+	if (/^\S*(?=\S{8,})(?=\S*\d)(?=\S*[A-Z])(?=\S*[a-z])(?=\S*[!@#$%^&*.?])\S*$/.test(state.ruleForm.newPassword)) modes.value = 2; //中等
+	/*
+    最短8位, {8,}
+    必须包含1个数字
+    必须包含1个小写字母
+    必须包含1个大写字母
+    必须包含2个特殊字符
+  */
+	if (/^\S*(?=\S{8,})(?=\S*\d)(?=\S*[A-Z])(?=\S*[a-z])(?=\S*[!@#$%^&*.?]{2,})\S*$/.test(state.ruleForm.newPassword)) modes.value = 3; //强密码
+	if (modes.value == 0 || modes.value == 1) {
+		return callback('提示:密码不得少于8位数,且必须包含字母大小写和特殊字符'); //弱密码
+	}
+	if (value === state.ruleForm.currentPassword) {
+		return callback('新密码不能与旧密码一致,请重新输入');
+	}
+	return callback();
+};
+// 检查输入密码是否一致
+const checkConfirmPassword = (rule: any, value: any, callback: any) => {
+	if (!value) {
+		return callback('请再次输入密码');
+	}
+	if (value != state.ruleForm.newPassword) {
+		return callback('两次密码输入不一致,请重新输入');
+	}
+	return callback();
+};
+const rules = reactive({
+	currentPassword: [{ required: true, message: '请输入旧密码', trigger: ['change', 'blur'] }],
+	newPassword: [{ required: true, validator: checkPassword, trigger: ['change', 'blur'] }],
+	confirmPassword: [{ required: true, validator: checkConfirmPassword, trigger: 'blur' }],
+});
+// 返回登录
+const goLogin = ()=>{
+	router.push({
+		path:'/login'
+	})
+}
+</script>
+
+<style scoped lang="scss">
+.forgetPwd-content-form {
+	@for $i from 1 through 4 {
+		.login-animation#{$i} {
+			opacity: 0;
+			animation-name: error-num;
+			animation-duration: 0.5s;
+			animation-fill-mode: forwards;
+			animation-delay: calc($i/10) + s;
+		}
+	}
+	.forgetPwd-content-submit {
+		width: 100%;
+		font-weight: 300;
+		background: linear-gradient(-90deg, #3c7ee0 0%, #3c50e0 100%);
+		border: none;
+		border-radius: 8px;
+		height: 40px;
+		margin-top: 20px;
+	}
+
+	.forgetPwd-msg {
+		color: var(--el-text-color-placeholder);
+	}
+	.login-msg {
+		margin-top: 10px;
+		display: flex;
+		justify-content: space-between;
+		align-items: center;
+		color: var(--el-color-primary);
+		b {
+			color: #999;
+			padding-left: 4px;
+		}
+	}
+	.intensity {
+		.psdText {
+			font-size: 14px;
+			margin-right: 10px;
+			color: #5a5a5a;
+		}
+
+		.line {
+			display: inline-block;
+			width: 48px;
+			height: 10px;
+			background: #d8d8d8;
+			margin-right: 2px;
+
+			&.ruo {
+				border-radius: 6px 0 0 6px;
+			}
+
+			&.low {
+				background: #bfcdff;
+			}
+
+			&.middle {
+				background: #93a6fa;
+			}
+
+			&.high {
+				background: #3c50e0;
+			}
+
+			&.qiang {
+				border-radius: 0 6px 6px 0;
+			}
+		}
+
+		.level {
+			margin: 0 16px 0 8px;
+		}
+	}
+}
+</style>

+ 131 - 0
src/views/forgetPwd/index.vue

@@ -0,0 +1,131 @@
+<template>
+	<div class="login-container w100 h100">
+		<div class="login-content">
+			<div class="login-content-main">
+				<h4 class="login-content-title">修改密码</h4>
+				<div v-if="!state.isScan">
+					<el-tabs v-model="state.tabsActiveName">
+						<ForgetPwd />
+					</el-tabs>
+				</div>
+			</div>
+		</div>
+	</div>
+</template>
+
+<script setup lang="ts" name="loginIndex">
+import { defineAsyncComponent, reactive, onMounted, computed } from 'vue';
+import { storeToRefs } from 'pinia';
+import { useThemeConfig } from '/@/stores/themeConfig';
+import { NextLoading } from '/@/utils/loading';
+import { Local } from '/@/utils/storage';
+import Watermark from '/@/utils/watermark';
+import { getImageUrl } from '/@/utils/tools';
+// 定义接口来定义对象的类型
+interface LoginState {
+	tabsActiveName: string;
+	isScan: boolean;
+}
+
+// 引入组件
+const ForgetPwd = defineAsyncComponent(() => import('/@/views/forgetPwd/component/forgetPwd.vue'));
+
+const storesThemeConfig = useThemeConfig();
+const { themeConfig } = storeToRefs(storesThemeConfig);
+const state = reactive<LoginState>({
+	tabsActiveName: 'account',
+	isScan: false,
+});
+let bgImg = themeConfig.value.loginImage ?? `url(${getImageUrl('login/bg.png')})`;
+// 获取布局配置信息
+const getThemeConfig = computed(() => {
+	return themeConfig.value;
+});
+// 页面加载时
+onMounted(async () => {
+	NextLoading.done();
+	Watermark.del(); // 清除水印
+	themeConfig.value.isWatermark = false;
+	themeConfig.value.watermarkText = '';
+	Local.set('themeConfig', themeConfig.value);
+});
+</script>
+
+<style scoped lang="scss">
+.login-container {
+	position: relative;
+	background-image: v-bind(bgImg);
+	background-repeat: no-repeat;
+	background-size: calc(100vw + 1px) calc(100vh + 1px);
+
+	.login-content {
+		width: 500px;
+		padding: 83px 80px 60px 80px;
+		position: absolute;
+		right: 10vw;
+		top: 50vh;
+		transform: translateY(-50%) translate3d(0, 0, 0);
+		background-color: var(--el-color-white);
+		border-radius: 20px;
+		overflow: hidden;
+		z-index: 1;
+		box-shadow: 0 0 20px 0 rgba(26, 64, 144, 0.46);
+
+		.login-content-main {
+			margin: 0 auto;
+
+			.login-content-title {
+				color: var(--el-color-primary);
+				font-size: 28px;
+				font-weight: 500;
+				line-height: 48px;
+				text-align: center;
+				letter-spacing: 4px;
+				white-space: nowrap;
+				z-index: 5;
+				position: relative;
+				transition: all 0.3s ease;
+			}
+		}
+
+		.login-content-main-scan {
+			position: absolute;
+			top: 0;
+			right: 0;
+			width: 50px;
+			height: 50px;
+			overflow: hidden;
+			cursor: pointer;
+			transition: all ease 0.3s;
+			color: var(--el-text-color-primary);
+
+			&-delta {
+				position: absolute;
+				width: 35px;
+				height: 70px;
+				z-index: 2;
+				top: 2px;
+				right: 21px;
+				background: var(--el-color-white);
+				transform: rotate(-45deg);
+			}
+
+			&:hover {
+				opacity: 1;
+				transition: all ease 0.3s;
+				color: var(--el-color-primary) !important;
+			}
+
+			i {
+				width: 47px;
+				height: 50px;
+				display: inline-block;
+				font-size: 48px;
+				position: absolute;
+				right: 2px;
+				top: -1px;
+			}
+		}
+	}
+}
+</style>

+ 11 - 17
src/views/login/component/account.vue

@@ -45,14 +45,13 @@
 		</el-form-item>
 		<!-- <el-form-item class="login-animation3">
 			<el-col :span="15">
-				<el-input type="text" maxlength="4" placeholder="请输入验证码" v-model="ruleForm.code" clearable autocomplete="off">
+				<el-input type="text" maxlength="4" placeholder="请输入验证码" v-model="state.ruleForm.code" clearable autocomplete="off">
 					<template #prefix>
 						<el-icon class="el-input__icon"><ele-Position /></el-icon>
 					</template>
 				</el-input>
 			</el-col>
-			<el-col :span="1"></el-col>
-			<el-col :span="8">
+			<el-col :span="8" :offset=1>
 				<el-button class="login-content-code">1234</el-button>
 			</el-col>
 		</el-form-item> -->
@@ -66,7 +65,7 @@
 		</div> -->
 		<div class="login-msg login-animation4">
 			<div>联系管理员<b>重置密码</b></div>
-			<div>忘记密码</div>
+			<!-- <el-button link type="primary" class="font16" @click="forgetPwd">忘记密码</el-button> -->
 		</div>
 	</el-form>
 </template>
@@ -85,22 +84,12 @@ import { NextLoading } from '/@/utils/loading';
 import Watermark from '/@/utils/watermark';
 import type { FormInstance } from 'element-plus';
 import { signIn } from '/@/api/login';
-// 登录参数类型
-interface LoginState {
-	isShowPassword: boolean;
-	ruleForm: {
-		userName: string;
-		password: string;
-	};
-	loading: boolean;
-}
-
 // 定义变量内容
 const storesThemeConfig = useThemeConfig();
 const { themeConfig } = storeToRefs(storesThemeConfig);
 const route = useRoute();
 const router = useRouter();
-const state = reactive<LoginState>({
+const state = reactive<any>({
 	isShowPassword: false,
 	ruleForm: {
 		userName: '',
@@ -188,6 +177,12 @@ const signInSuccess = (isNopower: boolean | undefined) => {
 		NextLoading.start();
 	}
 };
+// 忘记密码
+// const forgetPwd = ()=>{
+// 	router.push({
+// 		path:'/forgetPwd'
+// 	})
+// }
 </script>
 
 <style scoped lang="scss">
@@ -253,8 +248,7 @@ const signInSuccess = (isNopower: boolean | undefined) => {
 		display: flex;
 		justify-content: space-between;
 		align-items: center;
-		color: var(--hotline--login-text-color);
-
+		color: var(--el-color-primary);
 		b {
 			color: #999;
 			padding-left: 4px;

+ 1 - 1
src/views/login/index.vue

@@ -87,7 +87,7 @@ onMounted(async () => {
 			margin: 0 auto;
 
 			.login-content-title {
-				color: var(--hotline--login-text-color);
+				color: var(--el-color-primary);
 				font-size: 28px;
 				font-weight: 500;
 				line-height: 48px;

+ 25 - 39
src/views/changePwd/component/changePwd.vue → src/views/resetPwd/component/resetPwd.vue

@@ -1,9 +1,9 @@
 <template>
-	<el-form class="login-content-form" ref="changePwdRef" :model="state.ruleForm" :rules="rules" label-position="top" label-width="100px">
-		<p class="currentAccount login-animation4">
+	<el-form class="resetPwd-content-form" ref="resetPwdRef" :model="state.ruleForm" :rules="rules" label-position="top" label-width="100px">
+		<p class="currentAccount">
 			账号 <span>{{ userName }}</span>
 		</p>
-		<el-form-item prop="currentPassword" label="旧密码" class="login-animation2">
+		<el-form-item prop="currentPassword" label="旧密码">
 			<el-input
 				class="inputDeep"
 				clearable
@@ -20,7 +20,7 @@
 				</template>
 			</el-input>
 		</el-form-item>
-		<el-form-item class="login-animation2" prop="newPassword" label="新密码">
+		<el-form-item prop="newPassword" label="新密码">
 			<el-input
 				class="inputDeep"
 				clearable
@@ -36,14 +36,14 @@
 					</el-icon>
 				</template>
 			</el-input>
-			<div class="intensity login-animation4">
+			<div class="intensity">
 				<span class="psdText">密码强度:{{ modes === 1 ? '弱' : modes === 2 ? '中' : modes === 3 ? '强' : '' }}</span>
 				<span class="line ruo" :class="modes === 1 ? 'low' : ''"></span>
 				<span class="line zhong" :class="modes === 2 ? 'middle' : ''"></span>
 				<span class="line qiang" :class="modes === 3 ? 'high' : ''"></span>
 			</div>
 		</el-form-item>
-		<el-form-item prop="confirmPassword" label="确认密码" class="login-animation2">
+		<el-form-item prop="confirmPassword" label="确认密码">
 			<el-input
 				class="inputDeep"
 				clearable
@@ -60,20 +60,14 @@
 				</template>
 			</el-input>
 		</el-form-item>
-		<el-button
-			type="primary"
-			class="login-content-submit login-animation4"
-			round
-			@click="onChangeConfirm(changePwdRef)"
-			v-waves="'light'"
-			:loading="state.loading"
-			>确认修改</el-button
-		>
-		<div class="font12 mt10 login-animation4 login-msg">提示:密码不得少于8位数,且必须包含数字、字母大小写和特殊字符</div>
+        <el-button type="primary" class="resetPwd-content-submit" round @click="onChangeConfirm(resetPwdRef)" :loading="state.loading"
+				>确认重置</el-button
+			>
+		<div class="font12 mt10 resetPwd-msg">提示:密码不得少于8位数,且必须包含数字、字母大小写和特殊字符</div>
 	</el-form>
 </template>
 
-<script setup lang="ts" name="changePwdComponent">
+<script setup lang="ts" name="resetPwdComponent">
 import { reactive, computed, ref } from 'vue';
 import { useRouter } from 'vue-router';
 import { ElNotification } from 'element-plus';
@@ -83,7 +77,7 @@ import { changePwd } from '/@/api/login/user';
 import { storeToRefs } from 'pinia';
 import { useUserInfo } from '/@/stores/userInfo';
 // 修改密码参数类型
-interface ChangePwdState {
+interface ResetPwdState {
 	currentPassword: string;
 	newPassword: string;
 	confirmPassword: string;
@@ -91,20 +85,20 @@ interface ChangePwdState {
 // 定义变量
 const router = useRouter();
 const state = reactive({
-	ruleForm: <ChangePwdState>{
+	ruleForm: <ResetPwdState>{
 		currentPassword: '',
 		newPassword: '',
 		confirmPassword: '',
 	},
 	loading: false,
 });
-const changePwdRef = ref<FormInstance>();
+const resetPwdRef = ref<FormInstance>();
 const storesUserInfo = useUserInfo();
 const { userInfos } = storeToRefs(storesUserInfo);
 const userName = computed(() => {
 	return userInfos.value.name;
 });
-// 确认修改
+// 确认重置
 const onChangeConfirm = async (formEl: FormInstance | undefined) => {
 	if (!formEl) return;
 	await formEl.validate((valid) => {
@@ -119,7 +113,7 @@ const onChangeConfirm = async (formEl: FormInstance | undefined) => {
 					ElNotification({
 						title: '成功',
 						type: 'success',
-						message: '密码修改成功,请重新登录',
+						message: '密码重置成功,请重新登录',
 					});
 				})
 				.catch(() => {
@@ -167,6 +161,9 @@ const checkPassword = (rule: any, value: string, callback: any) => {
 	if (modes.value == 0 || modes.value == 1) {
 		return callback('提示:密码不得少于8位数,且必须包含字母大小写和特殊字符'); //弱密码
 	}
+	if (value === state.ruleForm.currentPassword) {
+		return callback('新密码不能与旧密码一致,请重新输入');
+	}
 	return callback();
 };
 // 检查输入密码是否一致
@@ -187,9 +184,9 @@ const rules = reactive({
 </script>
 
 <style scoped lang="scss">
-.login-content-form {
+.resetPwd-content-form {
 	.currentAccount {
-		margin: 40px 0 10px 0;
+		margin: 40px 0 20px 0;
 		font-size: var(--el-form-label-font-size);
 		color: var(--el-text-color-regular);
 
@@ -199,18 +196,7 @@ const rules = reactive({
 	}
 
 	margin-top: 20px;
-
-	@for $i from 1 through 4 {
-		.login-animation#{$i} {
-			opacity: 0;
-			animation-name: error-num;
-			animation-duration: 0.5s;
-			animation-fill-mode: forwards;
-			animation-delay: calc($i/10) + s;
-		}
-	}
-
-	.login-content-password {
+	.resetPwd-content-password {
 		display: inline-block;
 		width: 20px;
 		cursor: pointer;
@@ -220,14 +206,14 @@ const rules = reactive({
 		}
 	}
 
-	.login-content-code {
+	.resetPwd-content-code {
 		width: 100%;
 		padding: 0;
 		font-weight: bold;
 		letter-spacing: 5px;
 	}
 
-	.login-content-submit {
+	.resetPwd-content-submit {
 		width: 100%;
 		font-weight: 300;
 		background: linear-gradient(-90deg, #3c7ee0 0%, #3c50e0 100%);
@@ -237,7 +223,7 @@ const rules = reactive({
 		margin-top: 20px;
 	}
 
-	.login-msg {
+	.resetPwd-msg {
 		color: var(--el-text-color-placeholder);
 	}
 

+ 4 - 4
src/views/changePwd/index.vue → src/views/resetPwd/index.vue

@@ -6,14 +6,14 @@
 		</div>
 		<div class="login-content">
 			<div class="login-content-main">
-				<p class="login-content-title">修改密码</p>
-				<ChangePwd />
+				<p class="login-content-title">密码重置</p>
+				<ResetPwd />
 			</div>
 		</div>
 	</div>
 </template>
 
-<script setup lang="ts" name="changePwd">
+<script setup lang="ts" name="resetPwd">
 import { defineAsyncComponent, onMounted } from 'vue';
 import { storeToRefs } from 'pinia';
 import { useThemeConfig } from '/@/stores/themeConfig';
@@ -24,7 +24,7 @@ import { useRouter } from 'vue-router';
 import { getImageUrl } from '/@/utils/tools';
 
 // 引入组件
-const ChangePwd = defineAsyncComponent(() => import('/@/views/changePwd/component/changePwd.vue'));
+const ResetPwd = defineAsyncComponent(() => import('/@/views/resetPwd/component/resetPwd.vue'));
 
 // 定义变量
 const storesThemeConfig = useThemeConfig();

+ 23 - 30
src/views/system/dataAuth/component/AddAuth.vue

@@ -4,16 +4,16 @@
 			<el-form :model="state.ruleForm" label-width="90px" ref="ruleFormRef">
 				<el-row :gutter="10">
 					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
-						<el-form-item label="数据表" prop="tableId" :rules="[{ required: true, message: '请选择数据表', trigger: 'change' }]">
-                            <el-select v-model="state.ruleForm.tableId" placeholder="请选择数据表" class="w100">
-								<el-option v-for="item in state.tableData" :key="item.id" :label="item.displayName" :value="item.id" />
+						<el-form-item label="数据表" prop="table" :rules="[{ required: true, message: '请选择数据表', trigger: 'change' }]">
+							<el-select v-model="state.ruleForm.table" placeholder="请选择数据表" class="w100" value-key="key">
+								<el-option v-for="item in state.tableData" :key="item.key" :label="item.value" :value="item" />
 							</el-select>
 						</el-form-item>
 					</el-col>
 					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
-						<el-form-item label="权限方式" prop="authorityType" :rules="[{ required: true, message: '请选择权限方式', trigger: 'change' }]">
-							<el-select v-model="state.ruleForm.authorityType" placeholder="请选择权限方式" class="w100">
-								<el-option v-for="item in state.options" :key="item.value" :label="item.label" :value="item.value" />
+						<el-form-item label="可见等级" prop="accessLevel" :rules="[{ required: true, message: '请选择可见等级', trigger: 'change' }]">
+							<el-select v-model="state.ruleForm.accessLevel" placeholder="请选择可见等级" class="w100">
+								<el-option v-for="item in state.accessLevelOptions" :key="item.key" :label="item.value" :value="item.key" />
 							</el-select>
 						</el-form-item>
 					</el-col>
@@ -43,38 +43,22 @@ const emit = defineEmits(['updateList']);
 const state = reactive<any>({
 	isShowDialog: false,
 	ruleForm: {
-		roleId: '', // 手机号
-		roleCode: 0, //性别
-		authorityType: '',
-		tableId: '',
+		roleId: '', // 角色id
+		roleCode: 0, // 角色code
+		accessLevel: '',
+		tableName: '',
 	},
 	tableData: [],
 	loading: false,
-	options: [
-		{
-			label: '全部可见',
-			value: 0,
-		},
-		{
-			label: '本部',
-			value: 1,
-		},
-		{
-			label: '本部及以下',
-			value: 2,
-		},
-		{
-			label: '创建人',
-			value: 3,
-		},
-	], //可用组织
+	accessLevelOptions: [],
 });
 const route = useRoute();
 // 打开弹窗
 const ruleFormRef = ref();
-const openDialog = async () => {
+const openDialog = async (accessLevelOptions: any) => {
 	ruleFormRef.value?.clearValidate();
 	ruleFormRef.value?.resetFields();
+	state.accessLevelOptions = accessLevelOptions;
 	const res: any = await dataAuthList();
 	state.tableData = res.result ?? [];
 	state.isShowDialog = true;
@@ -92,7 +76,15 @@ const onSubmit = throttle(() => {
 	ruleFormRef.value.validate((valid: boolean) => {
 		if (valid) {
 			state.loading = true;
-			addDataAuth(state.ruleForm)
+			const req = {
+				roleId: state.ruleForm.roleId, // 角色id
+				roleCode: state.ruleForm.roleCode, // 角色code
+				accessLevel: state.ruleForm.accessLevel,
+				tableName: state.ruleForm.table.key,
+				tableDisplay: state.ruleForm.table.value,
+				roleDisplay:state.ruleForm.roleDisplay,
+			};
+			addDataAuth(req)
 				.then(() => {
 					ElMessage({
 						message: '新增成功',
@@ -115,6 +107,7 @@ const onSubmit = throttle(() => {
 onMounted(() => {
 	state.ruleForm.roleId = route.query.id;
 	state.ruleForm.roleCode = route.query.code;
+	state.ruleForm.roleDisplay = route.query.roleDisplay;
 });
 // 暴露变量
 defineExpose({

+ 30 - 32
src/views/system/dataAuth/component/EditAuth.vue

@@ -4,16 +4,16 @@
 			<el-form :model="state.ruleForm" label-width="90px" ref="ruleFormRef">
 				<el-row :gutter="10">
 					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
-						<el-form-item label="数据表" prop="tableId" :rules="[{ required: true, message: '请选择数据表', trigger: 'change' }]">
-							<el-select v-model="state.ruleForm.tableId" placeholder="请选择数据表" class="w100">
-								<el-option v-for="item in state.tableData" :key="item.id" :label="item.displayName" :value="item.id" />
+						<el-form-item label="数据表" prop="table" :rules="[{ required: true, message: '请选择数据表', trigger: 'change' }]">
+							<el-select v-model="state.ruleForm.table" placeholder="请选择数据表" class="w100" value-key="key" disabled>
+								<el-option v-for="item in state.tableData" :key="item.key" :label="item.value" :value="item" />
 							</el-select>
 						</el-form-item>
 					</el-col>
 					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
-						<el-form-item label="权限方式" prop="authorityType" :rules="[{ required: true, message: '请选择权限方式', trigger: 'change' }]">
-							<el-select v-model="state.ruleForm.authorityType" placeholder="请选择权限方式" class="w100">
-								<el-option v-for="item in state.options" :key="item.value" :label="item.label" :value="item.value" />
+						<el-form-item label="可见等级" prop="accessLevel" :rules="[{ required: true, message: '请选择可见等级', trigger: 'change' }]">
+							<el-select v-model="state.ruleForm.accessLevel" placeholder="请选择可见等级" class="w100">
+								<el-option v-for="item in state.accessLevelOptions" :key="item.key" :label="item.value" :value="item.key" />
 							</el-select>
 						</el-form-item>
 					</el-col>
@@ -22,7 +22,7 @@
 			<template #footer>
 				<span class="dialog-footer">
 					<el-button @click="onCancel" class="default-button">取 消</el-button>
-					<el-button type="primary" @click="onSubmit()" :loading="state.loading">确 定</el-button>
+					<el-button type="primary" @click="onSubmit" :loading="state.loading">确 定</el-button>
 				</span>
 			</template>
 		</el-dialog>
@@ -43,39 +43,27 @@ const emit = defineEmits(['updateList']);
 const state = reactive<any>({
 	isShowDialog: false,
 	ruleForm: {
-		roleId: '', // 手机号
-		roleCode: 0, //性别
-		authorityType: '',
-		tableId: '',
+		roleId: '', // 角色id
+		roleCode: 0, // 角色code
+		accessLevel: '',
+		tableName: '',
 	},
 	tableData: [],
 	loading: false,
-	options: [
-		{
-			label: '全部可见',
-			value: 0,
-		},
-		{
-			label: '本部',
-			value: 1,
-		},
-		{
-			label: '本部及以下',
-			value: 2,
-		},
-		{
-			label: '创建人',
-			value: 3,
-		},
-	], //可用组织
+	accessLevelOptions: [],
 });
 const route = useRoute();
 // 打开弹窗
 const ruleFormRef = ref();
-const openDialog = async (row: any) => {
+const openDialog = async (row: any, accessLevelOptions: any) => {
 	state.ruleForm = row;
+	state.accessLevelOptions = accessLevelOptions;
 	const res: any = await dataAuthList();
 	state.tableData = res.result ?? [];
+	state.ruleForm.table = {
+		key:row.tableName,
+		value:row.tableDisplay
+	}
 	state.isShowDialog = true;
 };
 // 关闭弹窗
@@ -91,10 +79,19 @@ const onSubmit = throttle(() => {
 	ruleFormRef.value.validate((valid: boolean) => {
 		if (valid) {
 			state.loading = true;
-			editDataAuth(state.ruleForm)
+			const req = {
+				roleId: state.ruleForm.roleId, // 角色id
+				roleCode: state.ruleForm.roleCode, // 角色code
+				accessLevel: state.ruleForm.accessLevel,
+				tableName: state.ruleForm.table.key,
+				tableDisplay: state.ruleForm.table.value,
+				roleDisplay:state.ruleForm.RoleDisplay,
+				id: state.ruleForm.id
+			};
+			editDataAuth(req)
 				.then(() => {
 					ElMessage({
-						message: '新增成功',
+						message: '操作成功',
 						type: 'success',
 					});
 					state.loading = false;
@@ -114,6 +111,7 @@ const onSubmit = throttle(() => {
 onMounted(() => {
 	state.ruleForm.roleId = route.query.id;
 	state.ruleForm.roleCode = route.query.code;
+	state.ruleForm.roleDisplay = route.query.roleDisplay;
 });
 // 暴露变量
 defineExpose({

+ 38 - 49
src/views/system/dataAuth/index.vue

@@ -2,7 +2,7 @@
 	<div class="system-dataAuth-container layout-padding">
 		<div class="layout-padding-auto layout-padding-view pd20">
 			<!-- 正常 -->
-			<template v-if="state.queryParams.roleid">
+			<template v-if="state.roleId">
 				<div class="flex-center-between mb20">
 					<p class="table-title">信息列表</p>
 					<div>
@@ -15,15 +15,11 @@
 				<el-table :data="state.tableData" v-loading="state.loading" row-key="id" @selection-change="handleSelectionChange">
 					<el-table-column type="selection" width="55" :reserve-selection="true" />
 					<el-table-column type="index" width="60" label="序号" />
-					<el-table-column prop="role.displayName" label="角色名称" show-overflow-tooltip></el-table-column>
-					<el-table-column prop="role.name" label="角色编码" show-overflow-tooltip></el-table-column>
-					<el-table-column prop="role.description" label="角色说明" show-overflow-tooltip width="400"></el-table-column>
-					<el-table-column prop="table.displayName" label="数据表" show-overflow-tooltip width="100"> </el-table-column>
-					<el-table-column prop="authorityType" label="权限方式" show-overflow-tooltip width="100">
-						<template #default="scope">
-							{{ state.options[scope.row.authorityType].label }}
-						</template>
-					</el-table-column>
+					<el-table-column prop="tableName" label="表编码" show-overflow-tooltip></el-table-column>
+					<el-table-column prop="tableDisplay" label="表名称" show-overflow-tooltip> </el-table-column>
+					<el-table-column prop="roleDisplay" label="角色名称" show-overflow-tooltip></el-table-column>
+					<el-table-column prop="roleCode" label="角色编码" show-overflow-tooltip></el-table-column>
+					<el-table-column prop="accessLevelText" label="可见等级" show-overflow-tooltip width="100"> </el-table-column>
 					<el-table-column label="操作" width="130" fixed="right" align="center">
 						<template #default="scope">
 							<el-button link type="primary" @click="onEditAuth(scope.row)" v-auth="'100207'" title="修改">
@@ -55,9 +51,11 @@ import { ElMessageBox, ElMessage } from 'element-plus';
 import { useRoute } from 'vue-router';
 import table2excel from 'js-table2excel';
 import { formatDate } from '/@/utils/formatTime';
+import { storeToRefs } from 'pinia';
+import { useThemeConfig } from '/@/stores/themeConfig';
 import { auth } from '/@/utils/authFunction';
 import { throttle } from '/@/utils/tools';
-import { getdataauthoritybyrole, deleteDataAuth } from '/@/api/system/roles';
+import { getdataauthoritybyrole, deleteDataAuth, baseData } from '/@/api/system/roles';
 
 // 引入组件
 const AddAuth = defineAsyncComponent(() => import('/@/views/system/dataAuth/component/AddAuth.vue'));
@@ -65,45 +63,26 @@ const EditAuth = defineAsyncComponent(() => import('/@/views/system/dataAuth/com
 
 // 定义接口来定义对象的类型
 interface QueryState {
-	queryParams: {
-		roleid: string | any[];
-	};
+	roleId: string | any[];
 	tableData: Array<any>;
 	loading: boolean;
 	multipleSelection: Array<any>;
-	options: Array<any>;
+	accessLevelOptions: Array<any>;
 }
 
 // 定义变量内容
 const state = reactive<QueryState>({
-	queryParams: {
-		roleid: '',
-	},
+	roleId: '',
 	tableData: [],
 	loading: false,
 	multipleSelection: [],
-	options: [
-		{
-			label: '全部可见',
-			value: 0,
-		},
-		{
-			label: '本部',
-			value: 1,
-		},
-		{
-			label: '本部及以下',
-			value: 2,
-		},
-		{
-			label: '创建人',
-			value: 3,
-		},
-	], //可用组织
+	accessLevelOptions: <any>[], //可用组织
 });
 const addAuthRef = ref(); //新增数据权限
 const editAuthRef = ref(); //修改数据权限
 const route = useRoute();
+const storesThemeConfig = useThemeConfig();
+const { themeConfig } = storeToRefs(storesThemeConfig);
 /** 搜索按钮操作 节流操作 */
 const handleQuery = throttle(() => {
 	getList();
@@ -113,7 +92,7 @@ const getList = () => {
 	if (!auth('100209')) ElMessage.error('抱歉,您没有获取数据权限的权限!');
 	else {
 		state.loading = true;
-		getdataauthoritybyrole(state.queryParams)
+		getdataauthoritybyrole(state.roleId)
 			.then((response: any) => {
 				state.tableData = response?.result ?? [];
 				state.loading = false;
@@ -126,7 +105,7 @@ const getList = () => {
 
 // 新增数据权限
 const onAddAuth = () => {
-	addAuthRef.value.openDialog();
+	addAuthRef.value.openDialog(state.accessLevelOptions);
 };
 // 表格多选
 const handleSelectionChange = (val: any) => {
@@ -135,7 +114,7 @@ const handleSelectionChange = (val: any) => {
 
 // 打开修改数据权限弹窗
 const onEditAuth = (row: any) => {
-	editAuthRef.value.openDialog(row);
+	editAuthRef.value.openDialog(row, state.accessLevelOptions);
 };
 // 删除数据权限
 const onRowDel = (row: any) => {
@@ -157,21 +136,31 @@ const onRowDel = (row: any) => {
 // 导出表格
 const onImportTable = () => {
 	const tabeHeader = [
-		{ key: 'name', colWidth: '', title: '姓名', type: 'text', isCheck: true },
-		{ key: 'userName', colWidth: '', title: '账号', type: 'text', isCheck: true },
-		{ key: 'orgName', colWidth: '', title: '所属部门', type: 'text', isCheck: true },
-		{ key: 'roles', colWidth: '', title: '角色', type: 'text', isCheck: true },
-		{ key: 'phoneNo', colWidth: '', title: '电话号码', type: 'text', isCheck: true },
-		{ key: 'staffNo', colWidth: '', title: '工号', type: 'text', isCheck: true },
-		{ key: 'defaultTelNo', colWidth: '', title: '默认分机', type: 'text', isCheck: true },
-		{ key: 'creationTime', colWidth: '', title: '更新时间', type: 'text', isCheck: true },
+		{ key: 'tableName', colWidth: '', title: '表编码', type: 'text', isCheck: true },
+		{ key: 'tableDisplay', colWidth: '', title: '表名称', type: 'text', isCheck: true },
+		{ key: 'roleDisplay', colWidth: '', title: '角色名称', type: 'text', isCheck: true },
+		{ key: 'roleCode', colWidth: '', title: '角色编码', type: 'text', isCheck: true },
+		{ key: 'accessLevelText', colWidth: '', title: '可见等级', type: 'text', isCheck: true },
 	];
-	table2excel(tabeHeader, state.multipleSelection, `用户信息 ${formatDate(new Date(), 'YYYY-mm-dd HH-MM')}`);
+	table2excel(
+		tabeHeader,
+		state.multipleSelection,
+		`${themeConfig.value.globalTitle}-${route.meta.title} ${formatDate(new Date(), 'YYYY-mm-dd HH-MM')}`
+	);
+};
+const getBaseData = async () => {
+	try {
+		const res: any = await baseData();
+		state.accessLevelOptions = res.result.accessLevelOptions ?? [];
+	} catch (error) {
+		console.log(error);
+	}
 };
 onMounted(() => {
 	if (route.query.id) {
-		state.queryParams.roleid = route.query.id;
+		state.roleId = route.query.id;
 		getList();
+		getBaseData();
 	}
 });
 </script>

+ 12 - 2
src/views/system/roles/index.vue

@@ -74,7 +74,9 @@
 import { defineAsyncComponent, reactive, onMounted, ref } from 'vue';
 import { ElMessageBox, ElMessage } from 'element-plus';
 import type { FormInstance } from 'element-plus';
-import { useRouter } from 'vue-router';
+import { useRouter,useRoute } from 'vue-router';
+import { storeToRefs } from 'pinia';
+import { useThemeConfig } from '/@/stores/themeConfig';
 import { throttle } from '/@/utils/tools';
 import { formatDate } from '/@/utils/formatTime';
 import { getRoleListPaged, delRole } from '/@/api/system/roles';
@@ -91,6 +93,9 @@ const editRoleRef = ref();
 const PermissionRoleRef = ref();
 const UserListRef = ref();
 const ruleFormRef = ref<FormInstance>();
+const storesThemeConfig = useThemeConfig();
+const { themeConfig } = storeToRefs(storesThemeConfig);
+const route = useRoute();
 const state = reactive<any>({
 	tableData: {
 		data: [],
@@ -163,6 +168,7 @@ const onDataAuth = (row: any) => {
 		query: {
 			id: row.id,
 			code: row.name,
+			roleDisplay:row.displayName,
 			tagsViewName: '数据权限 ' + row.displayName,
 		},
 	});
@@ -196,7 +202,11 @@ const onImportTable = () => {
 		{ key: 'description', colWidth: '', title: '角色说明', type: 'text', isCheck: true },
 		{ key: 'state', colWidth: '', title: '状态', type: 'text', isCheck: true },
 	];
-	table2excel(tabeHeader, state.multipleSelection, `角色信息 ${formatDate(new Date(), 'YYYY-mm-dd HH-MM')}`);
+	table2excel(
+		tabeHeader,
+		state.multipleSelection,
+		`${themeConfig.value.globalTitle}-${route.meta.title} ${formatDate(new Date(), 'YYYY-mm-dd HH-MM')}`
+	);
 };
 // 页面加载时
 onMounted(() => {

+ 17 - 2
src/views/system/user/index.vue

@@ -105,12 +105,15 @@
 </template>
 
 <script lang="ts" setup name="systemUser">
-import { defineAsyncComponent, ref, reactive, onMounted, watch } from 'vue';
+import { defineAsyncComponent, ref, reactive, onMounted, watch,onActivated } from 'vue';
 import { ElMessageBox, ElMessage } from 'element-plus';
 import type { FormInstance } from 'element-plus';
 import table2excel from 'js-table2excel';
 import { formatDate } from '/@/utils/formatTime';
 import { throttle } from '/@/utils/tools';
+import { useRoute } from 'vue-router';
+import { storeToRefs } from 'pinia';
+import { useThemeConfig } from '/@/stores/themeConfig';
 import { delUser, getUserListPaged, restPwd, getRoles } from '/@/api/system/user';
 import { getOrgList } from '/@/api/system/organize';
 
@@ -161,6 +164,9 @@ const addUserRef = ref(); //新增用户
 const editUserRef = ref(); //修改用户信息
 const setRoleRef = ref(); //设置角色
 const rightScrollRef = ref();
+const storesThemeConfig = useThemeConfig();
+const { themeConfig } = storeToRefs(storesThemeConfig);
+const route = useRoute();
 
 const filterOrg = ref('');
 const treRef = ref();
@@ -292,13 +298,22 @@ const onImportTable = () => {
 		{ key: 'defaultTelNo', colWidth: '', title: '默认分机', type: 'text', isCheck: true },
 		{ key: 'creationTime', colWidth: '', title: '更新时间', type: 'text', isCheck: true },
 	];
-	table2excel(tabeHeader, state.multipleSelection, `用户信息 ${formatDate(new Date(), 'YYYY-mm-dd HH-MM')}`);
+	table2excel(
+		tabeHeader,
+		state.multipleSelection,
+		`${themeConfig.value.globalTitle}-${route.meta.title} ${formatDate(new Date(), 'YYYY-mm-dd HH-MM')}`
+	);
 };
 onMounted(() => {
 	getRolesFn();
 	getList();
 	getOrgListApi();
 });
+onActivated(()=>{
+	getRolesFn();
+	getList();
+	getOrgListApi();
+})
 </script>
 <style lang="scss" scoped>
 .system-user-container {