From 419cadfe1ddab97bd415970632d856f94b7577b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A9=99=E5=AD=90?= <454313500@qq.com> Date: Wed, 7 Feb 2024 21:35:24 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E5=A4=9A=E7=A7=9F?= =?UTF-8?q?=E6=88=B7=E7=95=8C=E9=9D=A2=E5=8F=8A=E7=A7=8D=E5=AD=90=E6=95=B0?= =?UTF-8?q?=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DataSeeds/MenuDataSeed.cs | 77 +++++ .../Dtos/TenantCreateInput.cs | 11 +- .../Dtos/TenantGetListInput.cs | 10 +- .../Dtos/TenantGetListOutputDto.cs | 8 + .../Dtos/TenantGetOutputDto.cs | 9 + .../Dtos/TenantUpdateInput.cs | 12 +- ...antManagement.Application.Contracts.csproj | 1 + .../TenantService.cs | 80 ++++- Yi.Abp.Net8/src/Yi.Abp.Web/yi-abp-dev.db | Bin 0 -> 405504 bytes Yi.RuoYi.Vue3/src/api/system/tenant.js | 55 ++++ Yi.RuoYi.Vue3/src/views/system/menu/index.vue | 24 +- .../src/views/system/tenant/index.vue | 299 ++++++++++++++++++ 12 files changed, 555 insertions(+), 31 deletions(-) create mode 100644 Yi.Abp.Net8/src/Yi.Abp.Web/yi-abp-dev.db create mode 100644 Yi.RuoYi.Vue3/src/api/system/tenant.js create mode 100644 Yi.RuoYi.Vue3/src/views/system/tenant/index.vue diff --git a/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.SqlSugarCore/DataSeeds/MenuDataSeed.cs b/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.SqlSugarCore/DataSeeds/MenuDataSeed.cs index 8c4ae728..8e4baa4d 100644 --- a/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.SqlSugarCore/DataSeeds/MenuDataSeed.cs +++ b/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.SqlSugarCore/DataSeeds/MenuDataSeed.cs @@ -571,6 +571,83 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds }; entities.Add(guide); + //租户管理 + MenuEntity tenant = new MenuEntity(_guidGenerator.Create()) + { + MenuName = "租户管理", + PermissionCode = "system:tenant:list", + MenuType = MenuTypeEnum.Menu, + Router = "tenant", + IsShow = true, + IsLink = false, + IsCache = true, + Component = "system/tenant/index", + MenuIcon = "list", + OrderNum = 101, + ParentId = system.Id, + IsDeleted = false + }; + entities.Add(tenant); + + MenuEntity tenantQuery = new MenuEntity(_guidGenerator.Create()) + { + + MenuName = "租户查询", + PermissionCode = "system:tenant:query", + MenuType = MenuTypeEnum.Component, + OrderNum = 100, + ParentId = tenant.Id, + IsDeleted = false + }; + entities.Add(tenantQuery); + + MenuEntity tenantAdd = new MenuEntity(_guidGenerator.Create()) + { + + MenuName = "租户新增", + PermissionCode = "system:tenant:add", + MenuType = MenuTypeEnum.Component, + OrderNum = 100, + ParentId = tenant.Id, + IsDeleted = false + }; + entities.Add(tenantAdd); + + MenuEntity tenantEdit = new MenuEntity(_guidGenerator.Create()) + { + + MenuName = "租户修改", + PermissionCode = "system:tenant:edit", + MenuType = MenuTypeEnum.Component, + OrderNum = 100, + ParentId = tenant.Id, + IsDeleted = false + }; + entities.Add(tenantEdit); + + MenuEntity tenantRemove = new MenuEntity(_guidGenerator.Create()) + { + + MenuName = "租户删除", + PermissionCode = "system:tenant:remove", + MenuType = MenuTypeEnum.Component, + OrderNum = 100, + ParentId = tenant.Id, + IsDeleted = false + }; + entities.Add(tenantRemove); + + + + + + + + + + + + //用户管理 MenuEntity user = new MenuEntity(_guidGenerator.Create()) { diff --git a/Yi.Abp.Net8/module/tenant-management/Yi.Framework.TenantManagement.Application.Contracts/Dtos/TenantCreateInput.cs b/Yi.Abp.Net8/module/tenant-management/Yi.Framework.TenantManagement.Application.Contracts/Dtos/TenantCreateInput.cs index 4d1533c4..93a11715 100644 --- a/Yi.Abp.Net8/module/tenant-management/Yi.Framework.TenantManagement.Application.Contracts/Dtos/TenantCreateInput.cs +++ b/Yi.Abp.Net8/module/tenant-management/Yi.Framework.TenantManagement.Application.Contracts/Dtos/TenantCreateInput.cs @@ -1,12 +1,11 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - + namespace Yi.Framework.TenantManagement.Application.Contracts.Dtos { public class TenantCreateInput { + public string Name { get; set; } + public string TenantConnectionString { get; set; } + + public SqlSugar.DbType DbType { get; set; } } } diff --git a/Yi.Abp.Net8/module/tenant-management/Yi.Framework.TenantManagement.Application.Contracts/Dtos/TenantGetListInput.cs b/Yi.Abp.Net8/module/tenant-management/Yi.Framework.TenantManagement.Application.Contracts/Dtos/TenantGetListInput.cs index 1d863220..ce2fc42d 100644 --- a/Yi.Abp.Net8/module/tenant-management/Yi.Framework.TenantManagement.Application.Contracts/Dtos/TenantGetListInput.cs +++ b/Yi.Abp.Net8/module/tenant-management/Yi.Framework.TenantManagement.Application.Contracts/Dtos/TenantGetListInput.cs @@ -1,12 +1,20 @@ using System; using System.Collections.Generic; +using System.Data; using System.Linq; using System.Text; using System.Threading.Tasks; +using Yi.Framework.Ddd.Application.Contracts; namespace Yi.Framework.TenantManagement.Application.Contracts.Dtos { - public class TenantGetListInput + public class TenantGetListInput: PagedAllResultRequestDto { + public string? Name { get; set; } + //public int? EntityVersion { get; set; } + + //public string? TenantConnectionString { get; set; } + + //public DbType? DbType { get; set; } } } diff --git a/Yi.Abp.Net8/module/tenant-management/Yi.Framework.TenantManagement.Application.Contracts/Dtos/TenantGetListOutputDto.cs b/Yi.Abp.Net8/module/tenant-management/Yi.Framework.TenantManagement.Application.Contracts/Dtos/TenantGetListOutputDto.cs index f1127f18..a9ba762c 100644 --- a/Yi.Abp.Net8/module/tenant-management/Yi.Framework.TenantManagement.Application.Contracts/Dtos/TenantGetListOutputDto.cs +++ b/Yi.Abp.Net8/module/tenant-management/Yi.Framework.TenantManagement.Application.Contracts/Dtos/TenantGetListOutputDto.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Data; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -9,5 +10,12 @@ namespace Yi.Framework.TenantManagement.Application.Contracts.Dtos { public class TenantGetListOutputDto:EntityDto { + public string Name { get; set; } + public int EntityVersion { get; set; } + + public string TenantConnectionString { get; set; } + + public SqlSugar.DbType DbType { get; set; } + public DateTime CreationTime { get; set; } } } diff --git a/Yi.Abp.Net8/module/tenant-management/Yi.Framework.TenantManagement.Application.Contracts/Dtos/TenantGetOutputDto.cs b/Yi.Abp.Net8/module/tenant-management/Yi.Framework.TenantManagement.Application.Contracts/Dtos/TenantGetOutputDto.cs index 6c6f192f..28830803 100644 --- a/Yi.Abp.Net8/module/tenant-management/Yi.Framework.TenantManagement.Application.Contracts/Dtos/TenantGetOutputDto.cs +++ b/Yi.Abp.Net8/module/tenant-management/Yi.Framework.TenantManagement.Application.Contracts/Dtos/TenantGetOutputDto.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Data; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -9,5 +10,13 @@ namespace Yi.Framework.TenantManagement.Application.Contracts.Dtos { public class TenantGetOutputDto:EntityDto { + public string Name { get; set; } + public int EntityVersion { get; set; } + + public string TenantConnectionString { get; set; } + + public SqlSugar.DbType DbType { get; set; } + + public DateTime CreationTime { get; set; } } } diff --git a/Yi.Abp.Net8/module/tenant-management/Yi.Framework.TenantManagement.Application.Contracts/Dtos/TenantUpdateInput.cs b/Yi.Abp.Net8/module/tenant-management/Yi.Framework.TenantManagement.Application.Contracts/Dtos/TenantUpdateInput.cs index 56013886..863ab72d 100644 --- a/Yi.Abp.Net8/module/tenant-management/Yi.Framework.TenantManagement.Application.Contracts/Dtos/TenantUpdateInput.cs +++ b/Yi.Abp.Net8/module/tenant-management/Yi.Framework.TenantManagement.Application.Contracts/Dtos/TenantUpdateInput.cs @@ -1,12 +1,14 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using System.Data; namespace Yi.Framework.TenantManagement.Application.Contracts.Dtos { public class TenantUpdateInput { + public string? Name { get; set; } + public int? EntityVersion { get; set; } + + public string? TenantConnectionString { get; set; } + + public SqlSugar.DbType? DbType { get; set; } } } diff --git a/Yi.Abp.Net8/module/tenant-management/Yi.Framework.TenantManagement.Application.Contracts/Yi.Framework.TenantManagement.Application.Contracts.csproj b/Yi.Abp.Net8/module/tenant-management/Yi.Framework.TenantManagement.Application.Contracts/Yi.Framework.TenantManagement.Application.Contracts.csproj index c12af7cb..b683f5d6 100644 --- a/Yi.Abp.Net8/module/tenant-management/Yi.Framework.TenantManagement.Application.Contracts/Yi.Framework.TenantManagement.Application.Contracts.csproj +++ b/Yi.Abp.Net8/module/tenant-management/Yi.Framework.TenantManagement.Application.Contracts/Yi.Framework.TenantManagement.Application.Contracts.csproj @@ -11,5 +11,6 @@ + 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 43de14cf..f215cdad 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,10 +1,19 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Reflection; using System.Text; using System.Threading.Tasks; +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; @@ -19,9 +28,11 @@ namespace Yi.Framework.TenantManagement.Application public class TenantService : YiCrudAppService, ITenantService { private ISqlSugarRepository _repository; - public TenantService(ISqlSugarRepository repository) : base(repository) + private IDataSeeder _dataSeeder; + public TenantService(ISqlSugarRepository repository, IDataSeeder dataSeeder) : base(repository) { _repository = repository; + _dataSeeder = dataSeeder; } /// @@ -39,9 +50,14 @@ namespace Yi.Framework.TenantManagement.Application /// /// /// - public override Task> GetListAsync(TenantGetListInput input) + public override async Task> GetListAsync(TenantGetListInput input) { - return base.GetListAsync(input); + RefAsync total = 0; + + var entities = await _repository._DbQueryable.WhereIF(!string.IsNullOrEmpty(input.Name), x => x.Name.Contains(input.Name!)) + .WhereIF(input.StartTime is not null && input.EndTime is not null, x => x.CreationTime >= input.StartTime && x.CreationTime <= input.EndTime) + .ToPageListAsync(input.SkipCount, input.MaxResultCount, total); + return new PagedResultDto(total, await MapToGetListOutputDtosAsync(entities)); } /// @@ -49,9 +65,13 @@ namespace Yi.Framework.TenantManagement.Application /// /// /// - public override Task CreateAsync(TenantCreateInput input) + public override async Task CreateAsync(TenantCreateInput input) { - return base.CreateAsync(input); + if (await _repository.IsAnyAsync(x => x.Name == input.Name)) + { + throw new UserFriendlyException("创建失败,当前租户已存在"); + } + return await base.CreateAsync(input); } /// @@ -60,11 +80,17 @@ namespace Yi.Framework.TenantManagement.Application /// /// /// - public override Task UpdateAsync(Guid id, TenantUpdateInput input) + public override async Task UpdateAsync(Guid id, TenantUpdateInput input) { - return base.UpdateAsync(id, input); + if (await _repository.IsAnyAsync(x => x.Name == input.Name && x.Id != id)) + { + throw new UserFriendlyException("更新后租户名已经存在"); + } + + return await base.UpdateAsync(id, input); } + /// /// 租户删除 /// @@ -74,5 +100,45 @@ namespace Yi.Framework.TenantManagement.Application { return base.DeleteAsync(id); } + + + /// + /// 初始化租户 + /// + /// + /// + [HttpPut("tenant/init/{id}")] + public async Task InitAsync([FromRoute]Guid id) + { + using (CurrentTenant.Change(id)) + { + CodeFirst(await _repository.GetDbContextAsync()); + await _dataSeeder.SeedAsync(id); + } + } + + private void CodeFirst(ISqlSugarClient db) + { + + var moduleContainer = ServiceProvider.GetRequiredService(); + + //尝试创建数据库 + db.DbMaintenance.CreateDatabase(); + + List types = new List(); + foreach (var module in moduleContainer.Modules) + { + types.AddRange(module.Assembly.GetTypes() + .Where(x => x.GetCustomAttribute() == null) + .Where(x => x.GetCustomAttribute() != null) + .Where(x=>x.GetCustomAttribute()==null) + .Where(x => x.GetCustomAttribute() is null)); + } + if (types.Count > 0) + { + db.CodeFirst.InitTables(types.ToArray()); + } + + } } } 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 new file mode 100644 index 0000000000000000000000000000000000000000..f46d3d4ef4fbc6385438b1527a56bea71bbaf08b GIT binary patch literal 405504 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 literal 0 HcmV?d00001 diff --git a/Yi.RuoYi.Vue3/src/api/system/tenant.js b/Yi.RuoYi.Vue3/src/api/system/tenant.js new file mode 100644 index 00000000..fbcce7d8 --- /dev/null +++ b/Yi.RuoYi.Vue3/src/api/system/tenant.js @@ -0,0 +1,55 @@ +import request from '@/utils/request' +/* 以下为api的模板,通用的crud,将以下变量替换即可: +tenant : 实体模型 +*/ +// 分页查询 +export function listData(query) { + return request({ + url: '/tenant', + method: 'get', + params: query + }) +} + +// id查询 +export function getData(id) { + return request({ + url: `/tenant/${id}`, + method: 'get' + }) +} + +// 新增 +export function addData(data) { + return request({ + url: '/tenant', + method: 'post', + data: data + }) +} + +// 修改 +export function updateData(id,data) { + return request({ + url: `/tenant/${id}`, + method: 'put', + data: data + }) +} + +// 初始化 +export function InitData(id) { + return request({ + url: `/tenant/init/${id}`, + method: 'put' + }) +} + +// 删除 +export function delData(ids) { + return request({ + url: `/tenant`, + method: 'delete', + params:{id:ids} + }) +} diff --git a/Yi.RuoYi.Vue3/src/views/system/menu/index.vue b/Yi.RuoYi.Vue3/src/views/system/menu/index.vue index d9c84779..e04a697e 100644 --- a/Yi.RuoYi.Vue3/src/views/system/menu/index.vue +++ b/Yi.RuoYi.Vue3/src/views/system/menu/index.vue @@ -117,13 +117,13 @@ - 目录 - 菜单 - 按钮 + 目录 + 菜单 + 按钮 - + - +