From 36f72c857d8b064fe8e67e2a968b648ad9bdbbc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A9=99=E5=AD=90?= <454313500@qq.com> Date: Thu, 8 Feb 2024 19:48:35 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AE=8C=E6=88=90=E7=A7=9F=E6=88=B7?= =?UTF-8?q?=E5=89=8D=E7=AB=AF=E5=AF=B9=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Yi.Abp.Net8/Yi.Abp.sln | 4 +-- .../Services/AccountService.cs | 1 + .../Services/System/UserService.cs | 10 ++++++ .../Consts/UserConst.cs | 1 + .../Options/RbacOptions.cs | 5 +++ .../Managers/AccountManager.cs | 8 +++-- .../Repositories/UserRepository.cs | 1 + .../Dtos/TenantSelectOutputDto.cs | 14 ++++++++ .../TenantService.cs | 25 +++++++------- Yi.Abp.Net8/src/Yi.Abp.Web/yi-abp-dev.db | Bin 405504 -> 405504 bytes Yi.RuoYi.Vue3/src/api/system/tenant.js | 7 ++++ Yi.RuoYi.Vue3/src/views/login.vue | 31 ++++++++++++++++++ 12 files changed, 92 insertions(+), 15 deletions(-) create mode 100644 Yi.Abp.Net8/module/tenant-management/Yi.Framework.TenantManagement.Application.Contracts/Dtos/TenantSelectOutputDto.cs diff --git a/Yi.Abp.Net8/Yi.Abp.sln b/Yi.Abp.Net8/Yi.Abp.sln index 436ef53f..5c963eaf 100644 --- a/Yi.Abp.Net8/Yi.Abp.sln +++ b/Yi.Abp.Net8/Yi.Abp.sln @@ -100,9 +100,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Framework.AuditLogging.D EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Framework.AuditLogging.Domain.Shared", "module\audit-logging\Yi.Framework.AuditLogging.Domain.Shared\Yi.Framework.AuditLogging.Domain.Shared.csproj", "{9C8C3C53-3DCE-4516-867E-228858E61B26}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Yi.Framework.TenantManagement.Application", "module\tenant-management\Yi.Framework.TenantManagement.Application\Yi.Framework.TenantManagement.Application.csproj", "{17816837-E53B-486B-B796-53C601FE6CD9}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Framework.TenantManagement.Application", "module\tenant-management\Yi.Framework.TenantManagement.Application\Yi.Framework.TenantManagement.Application.csproj", "{17816837-E53B-486B-B796-53C601FE6CD9}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Yi.Framework.TenantManagement.Application.Contracts", "module\tenant-management\Yi.Framework.TenantManagement.Application.Contracts\Yi.Framework.TenantManagement.Application.Contracts.csproj", "{FA735055-CBDD-4EFD-B84B-85810DA1425E}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Framework.TenantManagement.Application.Contracts", "module\tenant-management\Yi.Framework.TenantManagement.Application.Contracts\Yi.Framework.TenantManagement.Application.Contracts.csproj", "{FA735055-CBDD-4EFD-B84B-85810DA1425E}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application/Services/AccountService.cs b/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application/Services/AccountService.cs index c7215b99..3d7c79e2 100644 --- a/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application/Services/AccountService.cs +++ b/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application/Services/AccountService.cs @@ -104,6 +104,7 @@ namespace Yi.Framework.Rbac.Application.Services return new { Token = accessToken, RefreshToken = refreshToken }; } + /// /// 刷新token /// diff --git a/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application/Services/System/UserService.cs b/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application/Services/System/UserService.cs index e96a231c..ca822d31 100644 --- a/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application/Services/System/UserService.cs +++ b/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application/Services/System/UserService.cs @@ -1,5 +1,6 @@ using Microsoft.AspNetCore.Mvc; using SqlSugar; +using TencentCloud.Tcr.V20190924.Models; using Volo.Abp; using Volo.Abp.Application.Dtos; using Volo.Abp.EventBus.Local; @@ -85,6 +86,11 @@ namespace Yi.Framework.Rbac.Application.Services.System [Permission("system:user:add")] public async override Task CreateAsync(UserCreateInputVo input) { + if (input.UserName == UserConst.Admin || input.UserName == UserConst.TenantAdmin) + { + throw new UserFriendlyException(UserConst.Name_Not_Allowed); + } + if (string.IsNullOrEmpty(input.Password)) { throw new UserFriendlyException(UserConst.Login_Passworld_Error); @@ -134,6 +140,10 @@ namespace Yi.Framework.Rbac.Application.Services.System [Permission("system:user:update")] public async override Task UpdateAsync(Guid id, UserUpdateInputVo input) { + if (input.UserName == UserConst.Admin || input.UserName == UserConst.TenantAdmin) + { + throw new UserFriendlyException(UserConst.Name_Not_Allowed); + } if (await _repository.IsAnyAsync(u => input.UserName!.Equals(u.UserName) && !id.Equals(u.Id))) { throw new UserFriendlyException("用户已经存在,更新失败"); diff --git a/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain.Shared/Consts/UserConst.cs b/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain.Shared/Consts/UserConst.cs index be437ab0..18b1c34d 100644 --- a/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain.Shared/Consts/UserConst.cs +++ b/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain.Shared/Consts/UserConst.cs @@ -19,6 +19,7 @@ namespace Yi.Framework.Rbac.Domain.Shared.Consts public const string State_Is_State = "该用户已被禁用,请联系管理员进行恢复"; public const string No_Permission = "登录禁用!该用户分配无任何权限,无意义登录!"; public const string No_Role = "登录禁用!该用户分配无任何角色,无意义登录!"; + public const string Name_Not_Allowed = "用户名被禁止"; //子租户管理员 public const string Admin = "cc"; diff --git a/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain.Shared/Options/RbacOptions.cs b/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain.Shared/Options/RbacOptions.cs index 596594b3..c22becf2 100644 --- a/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain.Shared/Options/RbacOptions.cs +++ b/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain.Shared/Options/RbacOptions.cs @@ -13,6 +13,11 @@ namespace Yi.Framework.Rbac.Domain.Shared.Options /// public string AdminPassword { get; set; } = "123456"; + /// + /// 租户超级管理员默认密码 + /// + public string TenantAdminPassword { get; set; } = "123456"; + /// /// 是否开启登录验证码 /// diff --git a/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain/Managers/AccountManager.cs b/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain/Managers/AccountManager.cs index c4dadb9e..db6d809f 100644 --- a/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain/Managers/AccountManager.cs +++ b/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain/Managers/AccountManager.cs @@ -11,6 +11,7 @@ using Volo.Abp.Domain.Entities; using Volo.Abp.Domain.Services; using Volo.Abp.EventBus.Local; using Volo.Abp.Security.Claims; +using Volo.Abp.Users; using Yi.Framework.Core.Helper; using Yi.Framework.Rbac.Domain.Entities; using Yi.Framework.Rbac.Domain.Repositories; @@ -32,6 +33,7 @@ namespace Yi.Framework.Rbac.Domain.Managers private readonly IUserRepository _repository; private readonly ILocalEventBus _localEventBus; private readonly JwtOptions _jwtOptions; + private readonly RbacOptions _options; private IHttpContextAccessor _httpContextAccessor; private UserManager _userManager; private ISqlSugarRepository _roleRepository; @@ -42,7 +44,8 @@ namespace Yi.Framework.Rbac.Domain.Managers , ILocalEventBus localEventBus , UserManager userManager , IOptions refreshJwtOptions - , ISqlSugarRepository roleRepository) + , ISqlSugarRepository roleRepository + , IOptions options) { _repository = repository; _httpContextAccessor = httpContextAccessor; @@ -51,6 +54,7 @@ namespace Yi.Framework.Rbac.Domain.Managers _userManager = userManager; _roleRepository = roleRepository; _refreshJwtOptions = refreshJwtOptions.Value; + _options = options.Value; } /// @@ -215,7 +219,7 @@ namespace Yi.Framework.Rbac.Domain.Managers dto.PermissionCodes?.ForEach(per => AddToClaim(claims, TokenTypeConst.Permission, per)); dto.RoleCodes?.ForEach(role => AddToClaim(claims, AbpClaimTypes.Role, role)); } - + return claims; } diff --git a/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.SqlSugarCore/Repositories/UserRepository.cs b/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.SqlSugarCore/Repositories/UserRepository.cs index 4d776466..e51cb2ed 100644 --- a/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.SqlSugarCore/Repositories/UserRepository.cs +++ b/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.SqlSugarCore/Repositories/UserRepository.cs @@ -25,6 +25,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.Repositories /// public async Task GetUserAllInfoAsync(Guid userId) { + var userRoleMenu = new UserRoleMenuDto(); //首先获取到该用户全部信息,导航到角色、菜单,(菜单需要去重,完全交给Set来处理即可) diff --git a/Yi.Abp.Net8/module/tenant-management/Yi.Framework.TenantManagement.Application.Contracts/Dtos/TenantSelectOutputDto.cs b/Yi.Abp.Net8/module/tenant-management/Yi.Framework.TenantManagement.Application.Contracts/Dtos/TenantSelectOutputDto.cs new file mode 100644 index 00000000..135ce4cb --- /dev/null +++ b/Yi.Abp.Net8/module/tenant-management/Yi.Framework.TenantManagement.Application.Contracts/Dtos/TenantSelectOutputDto.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Volo.Abp.Application.Dtos; + +namespace Yi.Framework.TenantManagement.Application.Contracts.Dtos +{ + public class TenantSelectOutputDto : EntityDto + { + public string Name { get; set; } + } +} diff --git a/Yi.Abp.Net8/module/tenant-management/Yi.Framework.TenantManagement.Application/TenantService.cs b/Yi.Abp.Net8/module/tenant-management/Yi.Framework.TenantManagement.Application/TenantService.cs index d08b7b98..c5477371 100644 --- a/Yi.Abp.Net8/module/tenant-management/Yi.Framework.TenantManagement.Application/TenantService.cs +++ b/Yi.Abp.Net8/module/tenant-management/Yi.Framework.TenantManagement.Application/TenantService.cs @@ -1,19 +1,11 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using System.Text; -using System.Threading.Tasks; +using System.Reflection; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Options; using SqlSugar; using Volo.Abp; using Volo.Abp.Application.Dtos; using Volo.Abp.Data; -using Volo.Abp.Domain.Repositories; using Volo.Abp.Modularity; -using Volo.Abp.Uow; using Yi.Framework.Ddd.Application; using Yi.Framework.SqlSugarCore.Abstractions; using Yi.Framework.TenantManagement.Application.Contracts; @@ -60,6 +52,17 @@ namespace Yi.Framework.TenantManagement.Application return new PagedResultDto(total, await MapToGetListOutputDtosAsync(entities)); } + /// + /// 租户选项 + /// + /// + public async Task> GetSelectAsync() + { + var entites = await _repository._DbQueryable.ToListAsync(); + return entites.Select(x => new TenantSelectOutputDto { Id = x.Id, Name = x.Name }).ToList(); + } + + /// /// 创建租户 /// @@ -108,11 +111,11 @@ namespace Yi.Framework.TenantManagement.Application /// /// [HttpPut("tenant/init/{id}")] - public async Task InitAsync([FromRoute]Guid id) + public async Task InitAsync([FromRoute] Guid id) { using (CurrentTenant.Change(id)) { - await CodeFirst(this.LazyServiceProvider); + await CodeFirst(this.LazyServiceProvider); await _dataSeeder.SeedAsync(id); } diff --git a/Yi.Abp.Net8/src/Yi.Abp.Web/yi-abp-dev.db b/Yi.Abp.Net8/src/Yi.Abp.Web/yi-abp-dev.db index 6899f4cab6d61909cda8b4e27f54d708da4e08c3..8d01d76f7724be9b69fa3ec65294d9c264155355 100644 GIT binary patch delta 378 zcmZp8AkpwZVuCcI-b5K^M!k&*OWq5ybJsKQNAqpt6Xea|Il-gCUB6jSAd}mtQHh-^ z)LBqnUR+T#)XY33)hIdHP&diMI91ooC@oPp#lkdE*ErG8z%nt(BFVrs*~q}iMAyJb z*T6!-(9+7p!pgu%&)m}3z{1dCa_qk-FGV)4P)DeF$%bYo=9Z}@x+&(VM!IRHmIgp= z#xV0NQY}o)Qc=w_FtjqY)HAX$vNQr4xB28BYi2%nzDErFH~3@u9`U#Fb8qEiyudg8 zKp-QFA2AMQ*I*81B*rCd+fDcxFDMAH^Iu@#|Hc2A{|*0B{(Jn_`7dl1G}y&I{hmD| f8wWcZvmj$~GFv;42gFQ3%nZaV+wa-4Dt!O|OB!h= delta 122 zcmZp8AkpwZVuCcI&O{k!MxBibOWyOb@|Z)3`V9Z{3-*j` W?N96(ftU%1nSq#P`xARsnGXP@4=Pgt diff --git a/Yi.RuoYi.Vue3/src/api/system/tenant.js b/Yi.RuoYi.Vue3/src/api/system/tenant.js index fbcce7d8..c6d6fa2f 100644 --- a/Yi.RuoYi.Vue3/src/api/system/tenant.js +++ b/Yi.RuoYi.Vue3/src/api/system/tenant.js @@ -10,6 +10,13 @@ export function listData(query) { params: query }) } +export function SelectData() { + return request({ + url: '/tenant/select', + method: 'get' + }) +} + // id查询 export function getData(id) { diff --git a/Yi.RuoYi.Vue3/src/views/login.vue b/Yi.RuoYi.Vue3/src/views/login.vue index 208a5bc0..af637836 100644 --- a/Yi.RuoYi.Vue3/src/views/login.vue +++ b/Yi.RuoYi.Vue3/src/views/login.vue @@ -40,6 +40,25 @@ + + 当前租户: + + + + + + + 记住密码 { @@ -148,8 +173,14 @@ function getCookie() { }; } +async function getTenant() +{ + const {data} =await getTenantList(); + tenantList.value= [{name:"defalut"}, ...data]; +} getCode(); getCookie(); +getTenant();