Skip to content

Commit

Permalink
🎨✨ 多租户完善
Browse files Browse the repository at this point in the history
1.完善多租户-多库方案
2.增加租户管理 (实际业务中 也是运维、系统管理员等角色来操作 甚至直接维护数据库而不会开放接口)
  • Loading branch information
LemonNoCry committed Feb 18, 2023
1 parent 2962019 commit d85087c
Show file tree
Hide file tree
Showing 8 changed files with 241 additions and 3 deletions.
44 changes: 44 additions & 0 deletions Blog.Core.Api/Blog.Core.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

14 changes: 13 additions & 1 deletion Blog.Core.Api/Controllers/Tenant/TenantByDbController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
namespace Blog.Core.Api.Controllers.Tenant;

/// <summary>
/// 多租户测试
/// 多租户-多库方案 测试
/// </summary>
[Produces("application/json")]
[Route("api/Tenant/ByDb")]
Expand All @@ -35,4 +35,16 @@ public async Task<MessageModel<List<SubLibraryBusinessTable>>> GetAll()
var data = await _services.Query();
return Success(data);
}

/// <summary>
/// 新增数据
/// </summary>
/// <returns></returns>
[HttpPost]
public async Task<MessageModel> Post(SubLibraryBusinessTable data)
{
await _services.Db.Insertable(data).ExecuteReturnSnowflakeIdAsync();

return Success();
}
}
87 changes: 87 additions & 0 deletions Blog.Core.Api/Controllers/Tenant/TenantManagerController.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
using Blog.Core.Controllers;
using Blog.Core.IServices;
using Blog.Core.Model;
using Blog.Core.Model.Models;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;

namespace Blog.Core.Api.Controllers.Tenant;

/// <summary>
/// 租户管理
/// </summary>
[Produces("application/json")]
[Route("api/TenantManager")]
[Authorize]
public class TenantManagerController : BaseApiController
{
private readonly ITenantService _services;

public TenantManagerController(ITenantService services)
{
_services = services;
}


/// <summary>
/// 获取全部租户
/// </summary>
/// <returns></returns>
[HttpGet]
public async Task<MessageModel<List<SysTenant>>> GetAll()
{
var data = await _services.Query();
return Success(data);
}


/// <summary>
/// 获取租户信息
/// </summary>
/// <returns></returns>
[HttpGet("{id}")]
public async Task<MessageModel<SysTenant>> GetInfo(long id)
{
var data = await _services.QueryById(id);
return Success(data);
}

/// <summary>
/// 新增租户信息 <br/>
/// 此处只做演示,具体要以实际业务为准
/// </summary>
/// <returns></returns>
[HttpPost]
public async Task<MessageModel> Post(SysTenant tenant)
{
await _services.SaveTenant(tenant);
return Success();
}

/// <summary>
/// 修改租户信息 <br/>
/// 此处只做演示,具体要以实际业务为准
/// </summary>
/// <returns></returns>
[HttpPut]
public async Task<MessageModel> Put(SysTenant tenant)
{
await _services.SaveTenant(tenant);
return Success();
}

/// <summary>
/// 删除租户 <br/>
/// 此处只做演示,具体要以实际业务为准
/// </summary>
/// <returns></returns>
[HttpDelete]
public async Task<MessageModel> Delete(long id)
{
//是否删除租户库?
//要根据实际情况而定
//例如直接删除租户库、备份租户库到xx
await _services.DeleteById(id);
return Success();
}
}
5 changes: 4 additions & 1 deletion Blog.Core.Common/DB/BaseDBConfig.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
Expand Down Expand Up @@ -106,6 +107,8 @@ private static MutiDBOperate SpecialDbString(MutiDBOperate mutiDBOperate)

return mutiDBOperate;
}


}


Expand Down
22 changes: 22 additions & 0 deletions Blog.Core.Common/DB/TenantUtil.cs
Original file line number Diff line number Diff line change
@@ -1,18 +1,40 @@
using System;
using System.IO;
using Blog.Core.Model.Models;
using SqlSugar;

namespace Blog.Core.Common.DB;

public static class TenantUtil
{
public static SysTenant DefaultTenantConfig(this SysTenant tenant)
{
tenant.DbType ??= DbType.Sqlite;

//如果没有配置连接
if (tenant.Connection.IsNullOrEmpty())
{
//此处默认配置 Sqlite 地址
//实际业务中 也会有运维、系统管理员等来维护
switch (tenant.DbType.Value)
{
case DbType.Sqlite:
tenant.Connection = $"DataSource={Path.Combine(Environment.CurrentDirectory, tenant.ConfigId)}.db" ;
break;
}
}

return tenant;
}

public static ConnectionConfig GetConnectionConfig(this SysTenant tenant)
{
if (tenant.DbType is null)
{
throw new ArgumentException("Tenant DbType Must");
}


return new ConnectionConfig()
{
ConfigId = tenant.ConfigId,
Expand Down
3 changes: 2 additions & 1 deletion Blog.Core.Common/Seed/DBSeed.cs
Original file line number Diff line number Diff line change
Expand Up @@ -372,7 +372,7 @@ private static async Task SeedDataAsync(ISqlSugarClient db)

return false;
});

if (!seedDataTypes.Any()) return;
foreach (var seedType in seedDataTypes)
{
Expand Down Expand Up @@ -437,6 +437,7 @@ public static async Task TenantSeedAsync(MyContext myContext)

public static async Task InitTenantSeedAsync(ITenant itenant, ConnectionConfig config)
{
itenant.RemoveConnection(config.ConfigId);
itenant.AddConnection(config);

var db = itenant.GetConnectionScope(config.ConfigId);
Expand Down
12 changes: 12 additions & 0 deletions Blog.Core.IServices/ITenantService.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
using System.Threading.Tasks;
using Blog.Core.IServices.BASE;
using Blog.Core.Model.Models;

namespace Blog.Core.IServices;

public interface ITenantService : IBaseServices<SysTenant>
{
public Task SaveTenant(SysTenant tenant);

public Task InitTenantDb(SysTenant tenant);
}
57 changes: 57 additions & 0 deletions Blog.Core.Services/TenantService.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
using Blog.Core.Common.DB;
using Blog.Core.Common.Seed;
using Blog.Core.IServices;
using Blog.Core.Model.Models;
using Blog.Core.Repository.UnitOfWorks;
using Blog.Core.Services.BASE;
using System.Threading.Tasks;

namespace Blog.Core.Services;

public class TenantService : BaseServices<SysTenant>, ITenantService
{
private readonly IUnitOfWorkManage _uowManager;

public TenantService(IUnitOfWorkManage uowManage)
{
this._uowManager = uowManage;
}


public async Task SaveTenant(SysTenant tenant)
{
bool initDb = tenant.Id == 0;
using (var uow = _uowManager.CreateUnitOfWork())
{

tenant.DefaultTenantConfig();

if (tenant.Id == 0)
{
await Db.Insertable(tenant).ExecuteReturnSnowflakeIdAsync();
}
else
{
var oldTenant = await QueryById(tenant.Id);
if (oldTenant.Connection != tenant.Connection)
{
initDb = true;
}

await Db.Updateable(tenant).ExecuteCommandAsync();
}

uow.Commit();
}

if (initDb)
{
await InitTenantDb(tenant);
}
}

public async Task InitTenantDb(SysTenant tenant)
{
await DBSeed.InitTenantSeedAsync(Db.AsTenant(), tenant.GetConnectionConfig());
}
}

0 comments on commit d85087c

Please sign in to comment.