Sfoglia il codice sorgente

fix: 修复部分已知bug

喵你个旺呀 1 anno fa
parent
commit
20f6c9705a

+ 11 - 18
Admin.NET/Admin.NET.Core/SeedData/SysRoleMenuSeedData.cs

@@ -17,27 +17,20 @@ public class SysRoleMenuSeedData : ISqlSugarEntitySeedData<SysRoleMenu>
     /// <returns></returns>
     public IEnumerable<SysRoleMenu> HasData()
     {
-        var id = 1300000000000;
+        var roleMenuList = new List<SysRoleMenu>();
+
         var roleList = new SysRoleSeedData().HasData().ToList();
         var menuList = new SysMenuSeedData().HasData().ToList();
-        
-        var dashboardMenus = menuList.ToChildList(u => u.Id, u => u.Pid, u => u.Type == MenuTypeEnum.Menu && u.Title == "工作台");
-        var systemMenu = menuList.First(u => u.Type == MenuTypeEnum.Dir && u.Title == "系统管理");
-        var orgMenus = menuList.ToChildList(u => u.Id, u => u.Pid, u => u.Type == MenuTypeEnum.Menu && u.Title == "机构管理");
-        var personMenus = menuList.ToChildList(u => u.Id, u => u.Pid, u => u.Type == MenuTypeEnum.Menu && u.Title == "个人中心");
+        var defaultMenuList = new SysTenantMenuSeedData().HasData().ToList();
+
+        // 第一个角色拥有全部默认租户菜单
+        roleMenuList.AddRange(defaultMenuList.Select(u => new SysRoleMenu { Id=u.MenuId+(roleList[0].Id % 1300000000000), RoleId=roleList[0].Id, MenuId=u.MenuId}));
+
+        // 其他角色权限:工作台、系统管理、个人中心、帮助文档、关于项目
+        var otherRoleMenuList = menuList.ToChildList(u => u.Id, u => u.Pid, u => new[] { "工作台", "帮助文档", "关于项目", "个人中心" }.Contains(u.Title)).ToList();
+        otherRoleMenuList.Add(menuList.First(u => u.Type == MenuTypeEnum.Dir && u.Title == "系统管理"));
+        foreach (var role in roleList.Skip(1)) roleMenuList.AddRange(otherRoleMenuList.Select(u => new SysRoleMenu { Id = u.Id + (role.Id % 1300000000000), RoleId = role.Id, MenuId = u.Id }));
 
-        var roleMenuList = new List<SysRoleMenu>();
-        foreach (var role in roleList)
-        {
-            // 工作台
-            dashboardMenus.ForEach(m => roleMenuList.Add(new SysRoleMenu { Id=id+=100, RoleId=role.Id, MenuId=m.Id }));
-            // 系统管理
-            roleMenuList.Add(new SysRoleMenu { Id=id+=100, RoleId=role.Id, MenuId=systemMenu.Id });
-            // 机构管理
-            orgMenus.ForEach(m => roleMenuList.Add(new SysRoleMenu { Id=id+=100, RoleId=role.Id, MenuId=m.Id }));
-            // 个人中心
-            personMenus.ForEach(m => roleMenuList.Add(new SysRoleMenu { Id=id+=100, RoleId=role.Id, MenuId=m.Id }));
-        }
         return roleMenuList;
     }
 }

+ 3 - 3
Admin.NET/Admin.NET.Core/Service/Dict/SysDictTypeService.cs

@@ -183,8 +183,8 @@ public class SysDictTypeService : IDynamicApiController, ITransient
     [NonAction]
     public List<long> GetTenantIdList()
     {
-        List<long> tenantIdList = new() { SqlSugarConst.DefaultTenantId };
-        if (_userManager.TenantId > 0) tenantIdList.Add(_userManager.TenantId);
-        return tenantIdList;
+        return SqlSugarConst.DefaultTenantId != _userManager.TenantId
+            ? new() { SqlSugarConst.DefaultTenantId, _userManager.TenantId }
+            : new() { SqlSugarConst.DefaultTenantId };
     }
 }

+ 29 - 0
Admin.NET/Admin.NET.Core/Service/Menu/SysMenuService.cs

@@ -4,6 +4,7 @@
 //
 // 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
 
+using DocumentFormat.OpenXml.Office2010.ExcelAc;
 using OfficeOpenXml.FormulaParsing.Excel.Functions.Text;
 
 namespace Admin.NET.Core.Service;
@@ -307,4 +308,32 @@ public class SysMenuService : IDynamicApiController, ITransient
         var roleIdList = await _sysUserRoleService.GetUserRoleIdList(_userManager.UserId);
         return await _sysRoleMenuService.GetRoleMenuIdList(roleIdList);
     }
+
+    /// <summary>
+    /// 排除前端存在全选的父级菜单
+    /// </summary>
+    /// <returns></returns>
+    [NonAction]
+    public async Task<List<long>> ExcludeParentMenuOfFullySelected(List<long> menuIds)
+    {
+        // 获取当前用户菜单
+        var (query, _) = App.GetService<SysMenuService>().GetSugarQueryableAndTenantId(0);
+        var menuList = await query.ToListAsync();
+
+        // 排除列表,防止前端全选问题
+        var exceptList = new List<long>();
+        foreach (var id in menuIds)
+        {
+            // 排除按钮菜单
+            if (menuList.Any(u => u.Id == id && u.Type == MenuTypeEnum.Btn)) continue;
+
+            // 如果没有子集或有全部子集权限
+            var children = menuList.ToChildList(u => u.Id, u => u.Pid, id, false).ToList();
+            if (children.Count == 0 || children.All(u => menuIds.Contains(u.Id))) continue;
+
+            // 排除没有全部子集权限的菜单
+            exceptList.Add(id);
+        }
+        return menuIds.Except(exceptList).ToList();
+    }
 }

+ 3 - 6
Admin.NET/Admin.NET.Core/Service/Role/SysRoleService.cs

@@ -96,14 +96,10 @@ public class SysRoleService : IDynamicApiController, ITransient
     private async Task UpdateRoleMenu(AddRoleInput input)
     {
         if (input.MenuIdList == null || input.MenuIdList.Count < 1) return;
-
-        // 将父节点为0的菜单排除,防止前端全选异常
-        var pMenuIds = await _sysRoleRep.ChangeRepository<SqlSugarRepository<SysMenu>>().AsQueryable().Where(u => input.MenuIdList.Contains(u.Id) && u.Pid == 0).ToListAsync(u => u.Id);
-        var menuIds = input.MenuIdList.Except(pMenuIds); // 差集
         await GrantMenu(new RoleMenuInput()
         {
             Id = input.Id,
-            MenuIdList = menuIds.ToList()
+            MenuIdList = input.MenuIdList.ToList()
         });
     }
 
@@ -222,7 +218,8 @@ public class SysRoleService : IDynamicApiController, ITransient
     [DisplayName("根据角色Id获取菜单Id集合")]
     public async Task<List<long>> GetOwnMenuList([FromQuery] RoleInput input)
     {
-        return await _sysRoleMenuService.GetRoleMenuIdList(new List<long> { input.Id });
+        var menuIds = await _sysRoleMenuService.GetRoleMenuIdList(new List<long> { input.Id });
+        return await App.GetService<SysMenuService>().ExcludeParentMenuOfFullySelected(menuIds);
     }
 
     /// <summary>

+ 6 - 3
Admin.NET/Admin.NET.Core/Service/Tenant/SysTenantService.cs

@@ -313,7 +313,7 @@ public class SysTenantService : IDynamicApiController, ITransient
         menuList.Add(platformMenu);
         menuList.AddRange(allMenuList.ToChildList(u => u.Id, u => u.Pid, u => u.Pid == platformMenu.Id && new[]{ "菜单管理", "字典管理", "系统配置"}.Contains(u.Title)));
         var dictMenu = menuList.First(u => u.Type == MenuTypeEnum.Menu && u.Title == "字典管理");
-        menuList = menuList.Where(u => u.Pid != dictMenu.Id || !new[]{"增加", "编辑", "删除"}.Contains(u.Title)).ToList();
+        menuList = menuList.Where(u => u.Pid != dictMenu.Id || !new[]{"编辑", "删除"}.Contains(u.Title)).ToList();
 
         var logMenu = allMenuList.First(u => u.Type == MenuTypeEnum.Dir && u.Title == "日志管理");
         menuList.Add(logMenu);
@@ -458,9 +458,11 @@ public class SysTenantService : IDynamicApiController, ITransient
         // 检查路由是否重复
         if (menuList.Where(u => !string.IsNullOrWhiteSpace(u.Name)).GroupBy(u => u.Name).Any(u => u.Count() > 1)) 
             throw Oops.Oh(ErrorCodeEnum.D4009);
-        
+
+        // 删除旧记录
         await _sysTenantMenuRep.AsDeleteable().Where(u => u.TenantId == input.Id).ExecuteCommandAsync();
         var sysTenantMenuList = input.MenuIdList.Select(menuId => new SysTenantMenu { TenantId = input.Id, MenuId = menuId }).ToList();
+
         await _sysTenantMenuRep.InsertRangeAsync(sysTenantMenuList);
         
         // 清除菜单权限缓存
@@ -475,7 +477,8 @@ public class SysTenantService : IDynamicApiController, ITransient
     [DisplayName("获取租户菜单Id集合")]
     public async Task<List<long>> GetTenantMenuList([FromQuery] BaseIdInput input)
     {
-        return await _sysTenantMenuRep.AsQueryable().Where(u => u.TenantId == input.Id).Select(u => u.MenuId).ToListAsync();
+        var menuIds = await _sysTenantMenuRep.AsQueryable().Where(u => u.TenantId == input.Id).Select(u => u.MenuId).ToListAsync();
+        return await App.GetService<SysMenuService>().ExcludeParentMenuOfFullySelected(menuIds);
     }
 
     /// <summary>

+ 1 - 1
Web/src/views/login/component/account.vue

@@ -229,7 +229,7 @@ const onSignIn = async () => {
 			const publicKey = window.__env__.VITE_SM_PUBLIC_KEY;
 			const password = sm2.doEncrypt(state.ruleForm.password, publicKey, 1);
 
-			state.ruleForm.tenantId ??= props.tenantInfo.id ?? props.tenantInfo.list[0]?.value;
+			state.ruleForm.tenantId ??= props.tenantInfo.id ?? props.tenantInfo.list[0]?.value ?? -1;
 			console.log(state.ruleForm.tenantId)
 			const [err, res] = await feature(getAPI(SysAuthApi).apiSysAuthLoginPost({ ...state.ruleForm, password: password } as any));
 			if (err) {

+ 2 - 2
Web/src/views/login/component/mobile.vue

@@ -100,8 +100,8 @@ const getSmsCode = async () => {
 
 // 登录
 const onSignIn = async () => {
-	state.ruleForm.tenantId ??= props.tenantInfo.id ?? props.tenantInfo.list[0]?.value;
-	const res = await getAPI(SysAuthApi).apiSysAuthLoginPhonePost({...state.ruleForm, host: host});
+	state.ruleForm.tenantId ??= props.tenantInfo.id ?? props.tenantInfo.list[0]?.value ?? -1;
+	const res = await getAPI(SysAuthApi).apiSysAuthLoginPhonePost(state.ruleForm);
 	if (res.data.result?.accessToken == undefined) {
 		ElMessage.error('登录失败,请检查账号!');
 		return;

+ 1 - 1
Web/src/views/login/component/register.vue

@@ -211,7 +211,7 @@ const onRegister = async () => {
 			const publicKey = window.__env__.VITE_SM_PUBLIC_KEY;
 			const password = state.ruleForm.password ? sm2.doEncrypt(state.ruleForm.password, publicKey, 1) : undefined;
 
-			state.ruleForm.tenantId ??= props.tenantInfo.id ?? props.tenantInfo.list[0]?.value;
+			state.ruleForm.tenantId ??= props.tenantInfo.id ?? props.tenantInfo.list[0]?.value ?? -1;
 			const [err, res] = await feature(getAPI(SysAuthApi).apiSysAuthUserRegistrationPost({...state.ruleForm, password: password } as any));
 
 			if (res?.data?.code === 200) {

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

@@ -112,14 +112,7 @@ onMounted(async () => {
 // 获取租户信息
 const getTenantInfo = async () => {
 	if (themeConfig.value.hideTenantForLogin) {
-		if (!route.query.t) {
-			const query = Object.assign({}, route.query?.params, { t: '-1' });
-			router.push({
-				path: route.path,
-				query: query as any,
-			});
-		}
-		tenantInfo.value.id = parseInt(<string>route.query.t);
+		tenantInfo.value.id = -1;
 		tenantInfo.value.list = [];
 		return tenantInfo.value;
 	}

+ 0 - 1
Web/src/views/system/role/component/editRole.vue

@@ -43,7 +43,6 @@
 								ref="treeRef"
 								:data="state.menuData"
 								node-key="id"
-								check-strictly
 								show-checkbox
 								:props="{ children: 'children', label: 'title', class: treeNodeClass }"
 								icon="ele-Menu"

+ 1 - 2
Web/src/views/system/tenant/component/grantMenu.vue

@@ -14,7 +14,6 @@
 							<el-tree
 								ref="treeRef"
 								:data="state.menuData"
-								check-strictly
 								node-key="id"
 								show-checkbox
 								:props="{ children: 'children', label: 'title', class: treeNodeClass }"
@@ -43,7 +42,7 @@
 </template>
 
 <script lang="ts" setup name="sysGrantMenu">
-import { onMounted, reactive, ref } from 'vue';
+import { reactive, ref } from 'vue';
 import type { ElTree } from 'element-plus';
 
 import { getAPI } from '/@/utils/axios-utils';