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();