Merge pull request ' perf(Core): 代码优化' (#409) from jasondom/Admin.NET.Pro:v2-2 into v2

Reviewed-on: https://code.adminnet.top/Admin.NET/Admin.NET.Pro/pulls/409
This commit is contained in:
zuohuaijun 2025-08-20 02:22:19 +08:00
commit 3705a89419
14 changed files with 158 additions and 90 deletions

View File

@ -79,7 +79,7 @@ public class AppAuthService : IDynamicApiController, ITransient
throw Oops.Oh(ErrorCodeEnum.Z1003);
// 账号是否存在
var user = await _sysUserRep.AsQueryable().Includes(t => t.SysOrg).ClearFilter().FirstAsync(u => u.Account.Equals(input.Account));
var user = await _sysUserRep.AsQueryable().Includes(t => t.SysOrg).IgnoreTenant().FirstAsync(u => u.Account.Equals(input.Account));
_ = user ?? throw Oops.Oh(ErrorCodeEnum.D0009);
// 账号是否被冻结
@ -147,7 +147,7 @@ public class AppAuthService : IDynamicApiController, ITransient
throw Oops.Oh("验证码错误!");
// 账号是否存在
var user = await _sysUserRep.AsQueryable().Includes(u => u.SysOrg).ClearFilter().FirstAsync(u => u.Phone.Equals(input.Phone));
var user = await _sysUserRep.AsQueryable().Includes(u => u.SysOrg).IgnoreTenant().FirstAsync(u => u.Phone.Equals(input.Phone));
_ = user ?? throw Oops.Oh(ErrorCodeEnum.D0009);
return await CreateToken(user);

View File

@ -33,6 +33,7 @@ public abstract class EntityBase : EntityBaseId, IDeletedFilter
/// <summary>
/// 更新时间
/// </summary>
[IgnoreUpdateSeedColumn]
[SugarColumn(ColumnDescription = "更新时间")]
public virtual DateTime? UpdateTime { get; set; }
@ -60,6 +61,7 @@ public abstract class EntityBase : EntityBaseId, IDeletedFilter
/// <summary>
/// 修改者Id
/// </summary>
[IgnoreUpdateSeedColumn]
[SugarColumn(ColumnDescription = "修改者Id")]
public virtual long? UpdateUserId { get; set; }
@ -74,12 +76,14 @@ public abstract class EntityBase : EntityBaseId, IDeletedFilter
/// <summary>
/// 修改者姓名
/// </summary>
[IgnoreUpdateSeedColumn]
[SugarColumn(ColumnDescription = "修改者姓名", Length = 64)]
public virtual string? UpdateUserName { get; set; }
/// <summary>
/// 软删除
/// </summary>
[IgnoreUpdateSeedColumn]
[SugarColumn(ColumnDescription = "软删除")]
public virtual bool IsDelete { get; set; } = false;
}

View File

@ -370,6 +370,8 @@ public static class RepositoryExtension
//});
}
#region
/// <summary>
/// 忽略租户
/// </summary>
@ -381,6 +383,63 @@ public static class RepositoryExtension
return ignore ? queryable.ClearFilter<ITenantIdFilter>() : queryable;
}
/// <summary>
/// 忽略租户
/// </summary>
/// <param name="queryable"></param>
/// <param name="ignore">是否忽略 默认true</param>
/// <returns> </returns>
public static ISugarQueryable<T, T2> IgnoreTenant<T, T2>(this ISugarQueryable<T, T2> queryable, bool ignore = true)
{
return ignore ? queryable.ClearFilter<ITenantIdFilter>() : queryable;
}
/// <summary>
/// 忽略租户
/// </summary>
/// <param name="queryable"></param>
/// <param name="ignore">是否忽略 默认true</param>
/// <returns> </returns>
public static ISugarQueryable<T, T2, T3> IgnoreTenant<T, T2, T3>(this ISugarQueryable<T, T2, T3> queryable, bool ignore = true)
{
return ignore ? queryable.ClearFilter<ITenantIdFilter>() : queryable;
}
/// <summary>
/// 忽略租户
/// </summary>
/// <param name="queryable"></param>
/// <param name="ignore">是否忽略 默认true</param>
/// <returns> </returns>
public static ISugarQueryable<T, T2, T3, T4> IgnoreTenant<T, T2, T3, T4>(this ISugarQueryable<T, T2, T3, T4> queryable, bool ignore = true)
{
return ignore ? queryable.ClearFilter<ITenantIdFilter>() : queryable;
}
/// <summary>
/// 忽略租户
/// </summary>
/// <param name="queryable"></param>
/// <param name="ignore">是否忽略 默认true</param>
/// <returns> </returns>
public static ISugarQueryable<T, T2, T3, T4, T5> IgnoreTenant<T, T2, T3, T4, T5>(this ISugarQueryable<T, T2, T3, T4, T5> queryable, bool ignore = true)
{
return ignore ? queryable.ClearFilter<ITenantIdFilter>() : queryable;
}
/// <summary>
/// 忽略租户
/// </summary>
/// <param name="queryable"></param>
/// <param name="ignore">是否忽略 默认true</param>
/// <returns> </returns>
public static ISugarQueryable<T, T2, T3, T4, T5, T6> IgnoreTenant<T, T2, T3, T4, T5, T6>(this ISugarQueryable<T, T2, T3, T4, T5, T6> queryable, bool ignore = true)
{
return ignore ? queryable.ClearFilter<ITenantIdFilter>() : queryable;
}
#endregion
/// <summary>
/// 只更新某些列
/// </summary>

View File

@ -114,7 +114,7 @@ public class SysAuthService : IDynamicApiController, ITransient
//}
// 判断账号是否存在
var user = await _sysUserRep.AsQueryable().Includes(t => t.SysOrg).ClearFilter()
var user = await _sysUserRep.AsQueryable().Includes(t => t.SysOrg).IgnoreTenant()
//.WhereIF(tenantId > 0, u => u.TenantId == tenantId)
.WhereIF(!string.IsNullOrWhiteSpace(account), u => u.Account.Equals(account))
.WhereIF(!string.IsNullOrWhiteSpace(phone), u => u.Phone.Equals(phone))

View File

@ -187,7 +187,7 @@ public class SysDictDataService : IDynamicApiController, ITransient
if (dictDataList == null)
{
dictDataList = await _sysDictDataRep.Change<SysDictType>().AsQueryable()
.LeftJoin<SysDictData>((u, a) => u.Id == a.DictTypeId).ClearFilter()
.LeftJoin<SysDictData>((u, a) => u.Id == a.DictTypeId).IgnoreTenant()
.WhereIF(!string.IsNullOrWhiteSpace(code), u => u.Code == code)
.WhereIF(typeId != null && typeId > 0, u => u.Id == typeId)
.Where((u, a) => u.Status == StatusEnum.Enable && a.Status == StatusEnum.Enable)

View File

@ -163,7 +163,7 @@ public class SysDictTypeService : IDynamicApiController, ITransient
public async Task<dynamic> GetAllDictList()
{
var ds = await _sysDictTypeRep.AsQueryable()
.InnerJoin<SysDictData>((u, a) => u.Id == a.DictTypeId).ClearFilter()
.InnerJoin<SysDictData>((u, a) => u.Id == a.DictTypeId).IgnoreTenant()
.Where((u, a) => u.Status == StatusEnum.Enable && a.Status == StatusEnum.Enable)
.Select((u, a) => new { TypeCode = u.Code, a.Label, a.Value, a.Code, a.Remark, a.OrderNo, a.TagType, a.ExtData })
.ToListAsync();

View File

@ -61,7 +61,7 @@ public class SysFileService : IDynamicApiController, ITransient
public async Task<SqlSugarPagedList<SysFile>> Page(PageFileInput input)
{
// 获取所有公开文件
var publicList = _sysFileRep.AsQueryable().ClearFilter().Where(u => u.IsPublic == true);
var publicList = _sysFileRep.AsQueryable().IgnoreTenant().Where(u => u.IsPublic == true);
// 获取私有文件
var privateList = _sysFileRep.AsQueryable().Where(u => u.IsPublic == false);
// 合并公开和私有并分页
@ -179,7 +179,7 @@ public class SysFileService : IDynamicApiController, ITransient
[DisplayName("下载指定文件Base64格式")]
public async Task<string> DownloadFileBase64([FromBody] string url)
{
var sysFile = await _sysFileRep.AsQueryable().ClearFilter().FirstAsync(u => u.Url == url) ?? throw Oops.Oh($"文件不存在");
var sysFile = await _sysFileRep.AsQueryable().IgnoreTenant().FirstAsync(u => u.Url == url) ?? throw Oops.Oh($"文件不存在");
return await _customFileProvider.DownloadFileBase64Async(sysFile);
}
@ -222,7 +222,7 @@ public class SysFileService : IDynamicApiController, ITransient
public async Task<SysFile> GetFile([FromQuery] long id, [FromQuery] bool isClearFilter = false)
{
var file = isClearFilter
? await _sysFileRep.CopyNew().AsQueryable().ClearFilter().FirstAsync(u => u.Id == id)
? await _sysFileRep.CopyNew().AsQueryable().IgnoreTenant().FirstAsync(u => u.Id == id)
: await _sysFileRep.CopyNew().GetByIdAsync(id);
return file ?? throw Oops.Oh(ErrorCodeEnum.D8000);
}
@ -456,7 +456,7 @@ public class SysFileService : IDynamicApiController, ITransient
public async Task<List<SysFile>> GetFileListByDataId([FromQuery] long dataId, [FromQuery] bool isClearFilter = false)
{
return isClearFilter
? await _sysFileRep.CopyNew().AsQueryable().ClearFilter().Where(u => u.DataId == dataId).ToListAsync()
? await _sysFileRep.CopyNew().AsQueryable().IgnoreTenant().Where(u => u.DataId == dataId).ToListAsync()
: await _sysFileRep.CopyNew().GetListAsync(u => u.DataId == dataId);
}

View File

@ -85,7 +85,7 @@ public class SysOAuthService : IDynamicApiController, ITransient
}
// 若账号不存在则新建
var wechatUser = await _sysOAuthUserRep.AsQueryable().Includes(u => u.SysUser).ClearFilter().FirstAsync(u => u.OpenId == openIdClaim.Value);
var wechatUser = await _sysOAuthUserRep.AsQueryable().Includes(u => u.SysUser).IgnoreTenant().FirstAsync(u => u.OpenId == openIdClaim.Value);
if (wechatUser == null)
{
var userId = await App.GetRequiredService<SysUserService>().AddUser(new AddUserInput()
@ -109,7 +109,7 @@ public class SysOAuthService : IDynamicApiController, ITransient
PlatformType = platformType
});
wechatUser = await _sysOAuthUserRep.AsQueryable().Includes(u => u.SysUser).ClearFilter().FirstAsync(u => u.OpenId == openIdClaim.Value);
wechatUser = await _sysOAuthUserRep.AsQueryable().Includes(u => u.SysUser).IgnoreTenant().FirstAsync(u => u.OpenId == openIdClaim.Value);
}
// 构建Token令牌默认回调登录为PC模式

View File

@ -130,7 +130,7 @@ public class SysReportDataSourceService : IDynamicApiController, ITransient
// 从租户获取数据源
var tenantList = await _tenantRep.AsQueryable()
.LeftJoin<SysOrg>((u, o) => u.OrgId == o.Id).ClearFilter()
.LeftJoin<SysOrg>((u, o) => u.OrgId == o.Id).IgnoreTenant()
.Where((u, o) => u.TenantType == TenantTypeEnum.Db)
.Select((u, o) => new { u.Id, o.Name, u.DbType, u.Connection })
.ToListAsync();

View File

@ -66,12 +66,12 @@ public class SysTenantService : IDynamicApiController, ITransient
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[DisplayName("获取租户分页列表")]
[DisplayName("获取租户分页列表")]
public async Task<SqlSugarPagedList<TenantOutput>> Page(PageTenantInput input)
{
return await _sysTenantRep.AsQueryable()
.LeftJoin<SysUser>((u, a) => u.UserId == a.Id).ClearFilter()
.LeftJoin<SysOrg>((u, a, b) => u.OrgId == b.Id).ClearFilter()
.LeftJoin<SysUser>((u, a) => u.UserId == a.Id).IgnoreTenant()
.LeftJoin<SysOrg>((u, a, b) => u.OrgId == b.Id).IgnoreTenant()
.WhereIF(!string.IsNullOrWhiteSpace(input.Phone), (u, a) => a.Phone.Contains(input.Phone.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.Name), (u, a, b) => b.Name.Contains(input.Name.Trim()))
.WhereIF(!input.IncludeDefault, u => u.Id.ToString() != SqlSugarConst.MainConfigId) // 排除默认主库/主租户
@ -112,26 +112,26 @@ public class SysTenantService : IDynamicApiController, ITransient
/// <returns></returns>
[UnitOfWork]
[ApiDescriptionSettings(Name = "Add"), HttpPost]
[DisplayName("增加租户")]
[DisplayName("增加租户")]
public async Task AddTenant(AddTenantInput input)
{
if (string.IsNullOrWhiteSpace(input.Connection))
throw Oops.Oh(ErrorCodeEnum.Z1004);
{
if (string.IsNullOrWhiteSpace(input.Connection))
throw Oops.Oh(ErrorCodeEnum.Z1004);
if (await _sysOrgRep.IsAnyAsync(u => u.Name == input.Name))
if (await _sysOrgRep.IsAnyAsync(u => u.Name == input.Name))
throw Oops.Oh(ErrorCodeEnum.D1300);
if (await _sysUserRep.AsQueryable().ClearFilter().AnyAsync(u => u.Account == input.AdminAccount))
if (await _sysUserRep.AsQueryable().IgnoreTenant().AnyAsync(u => u.Account == input.AdminAccount))
throw Oops.Oh(ErrorCodeEnum.D1301);
// 从库配置判断
if (input.TenantType == TenantTypeEnum.Db && !string.IsNullOrWhiteSpace(input.SlaveConnections) && !JSON.IsValid(input.SlaveConnections, true))
throw Oops.Oh(ErrorCodeEnum.D1302);
// 以租户Id作为库标识
input.Id = YitIdHelper.NextId();
input.ConfigId = input.Id.ToString();
throw Oops.Oh(ErrorCodeEnum.D1302);
// 以租户Id作为库标识
input.Id = YitIdHelper.NextId();
input.ConfigId = input.Id.ToString();
var tenant = input.Adapt<TenantOutput>();
await _sysTenantRep.InsertAsync(tenant);
await InitNewTenant(tenant);
@ -144,7 +144,7 @@ public class SysTenantService : IDynamicApiController, ITransient
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[DisplayName("设置租户状态")]
[DisplayName("设置租户状态")]
public async Task<int> SetStatus(TenantInput input)
{
var tenant = await _sysTenantRep.GetByIdAsync(input.Id);
@ -187,7 +187,7 @@ public class SysTenantService : IDynamicApiController, ITransient
TenantId = tenantId,
Name = tenantMark,
Code = CommonConst.SysAdminRole,
DataScope = DataScopeEnum.All,
DataScope = DataScopeEnum.All,
SysFlag = YesNoEnum.Y,
Remark = tenantMark
};
@ -237,7 +237,7 @@ public class SysTenantService : IDynamicApiController, ITransient
// 默认租户管理员角色菜单集合(工作台、账号管理、角色管理、机构管理、职位管理、个人中心、通知公告)
var menuPidList = new List<long> { 1300000000101, 1310000000111, 1310000000131, 1310000000141, 1310000000151, 1310000000161, 1310000000171 };
var menuIdList = await _sysMenuRep.AsQueryable().ClearFilter()
var menuIdList = await _sysMenuRep.AsQueryable().IgnoreTenant()
.Where(u => menuPidList.Contains(u.Id) || menuPidList.Contains(u.Pid)).Select(u => u.Id).ToListAsync();
await _sysRoleMenuService.GrantRoleMenu(new RoleMenuInput() { Id = newRole.Id, MenuIdList = menuIdList });
@ -251,7 +251,7 @@ public class SysTenantService : IDynamicApiController, ITransient
/// <param name="input"></param>
/// <returns></returns>
[ApiDescriptionSettings(Name = "Delete"), HttpPost]
[DisplayName("删除租户")]
[DisplayName("删除租户")]
public async Task DeleteTenant(DeleteTenantInput input)
{
// 禁止删除默认租户
@ -268,7 +268,7 @@ public class SysTenantService : IDynamicApiController, ITransient
await CacheTenant(input.Id);
// 删除与租户相关的表数据
var users = await _sysUserRep.AsQueryable().ClearFilter().Where(u => u.TenantId == input.Id).ToListAsync();
var users = await _sysUserRep.AsQueryable().IgnoreTenant().Where(u => u.TenantId == input.Id).ToListAsync();
var userIds = users.Select(u => u.Id).ToList();
await _sysUserRep.AsDeleteable().Where(u => userIds.Contains(u.Id)).ExecuteCommandAsync();
@ -278,7 +278,7 @@ public class SysTenantService : IDynamicApiController, ITransient
await _sysRoleRep.AsDeleteable().Where(u => u.TenantId == input.Id).ExecuteCommandAsync();
var roleIds = await _sysRoleRep.AsQueryable().ClearFilter().Where(u => u.TenantId == input.Id).Select(u => u.Id).ToListAsync();
var roleIds = await _sysRoleRep.AsQueryable().IgnoreTenant().Where(u => u.TenantId == input.Id).Select(u => u.Id).ToListAsync();
await _sysRoleMenuRep.AsDeleteable().Where(u => roleIds.Contains(u.RoleId)).ExecuteCommandAsync();
await _sysOrgRep.AsDeleteable().Where(u => u.TenantId == input.Id).ExecuteCommandAsync();
@ -295,17 +295,17 @@ public class SysTenantService : IDynamicApiController, ITransient
/// <param name="input"></param>
/// <returns></returns>
[ApiDescriptionSettings(Name = "Update"), HttpPost]
[DisplayName("更新租户")]
[DisplayName("更新租户")]
public async Task UpdateTenant(UpdateTenantInput input)
{
if (string.IsNullOrWhiteSpace(input.Connection))
throw Oops.Oh(ErrorCodeEnum.Z1004);
{
if (string.IsNullOrWhiteSpace(input.Connection))
throw Oops.Oh(ErrorCodeEnum.Z1004);
if (await _sysOrgRep.IsAnyAsync(u => u.Name == input.Name && u.Id != input.OrgId))
throw Oops.Oh(ErrorCodeEnum.D1300);
if (await _sysUserRep.IsAnyAsync(u => u.Account == input.AdminAccount && u.Id != input.UserId))
throw Oops.Oh(ErrorCodeEnum.D1301);
throw Oops.Oh(ErrorCodeEnum.D1301);
// 从库配置判断
if (input.TenantType == TenantTypeEnum.Db && !string.IsNullOrWhiteSpace(input.SlaveConnections) && !JSON.IsValid(input.SlaveConnections, true))
@ -332,11 +332,11 @@ public class SysTenantService : IDynamicApiController, ITransient
/// <param name="input"></param>
/// <returns></returns>
[UnitOfWork]
[DisplayName("授权租户管理员角色菜单")]
[DisplayName("授权租户管理员角色菜单")]
public async Task GrantMenu(RoleMenuInput input)
{
// 获取租户管理员角色【sys_admin】
var adminRole = await _sysRoleRep.AsQueryable().ClearFilter()
var adminRole = await _sysRoleRep.AsQueryable().IgnoreTenant()
.FirstAsync(u => u.Code == CommonConst.SysAdminRole && u.TenantId == input.Id && u.IsDelete == false);
if (adminRole == null) return;
@ -351,7 +351,7 @@ public class SysTenantService : IDynamicApiController, ITransient
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[DisplayName("获取租户管理员角色拥有菜单Id集合")]
[DisplayName("获取租户管理员角色拥有菜单Id集合")]
public async Task<List<long>> GetOwnMenuList([FromQuery] TenantUserInput input)
{
var roleIds = await _sysUserRoleService.GetUserRoleIdList(input.UserId);
@ -363,7 +363,7 @@ public class SysTenantService : IDynamicApiController, ITransient
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[DisplayName("重置租户管理员密码")]
[DisplayName("重置租户管理员密码")]
public async Task<string> ResetPwd(TenantUserInput input)
{
var password = await _sysConfigService.GetConfigValueByCode<string>(ConfigConst.SysPassword);
@ -376,7 +376,7 @@ public class SysTenantService : IDynamicApiController, ITransient
/// 同步所有租户数据库 🔖
/// </summary>
/// <returns></returns>
[DisplayName("同步所有租户数据库")]
[DisplayName("同步所有租户数据库")]
public async Task SyncTenantDb()
{
var tenantList = await _sysTenantRep.GetListAsync();
@ -391,7 +391,7 @@ public class SysTenantService : IDynamicApiController, ITransient
/// </summary>
/// <param name="tenantId"></param>
/// <returns></returns>
[NonAction]
[NonAction]
public async Task CacheTenant(long tenantId = 0)
{
// 移除 ISqlSugarClient 中的库连接并排除默认主库
@ -414,7 +414,7 @@ public class SysTenantService : IDynamicApiController, ITransient
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[DisplayName("创建租户数据库")]
[DisplayName("创建租户数据库")]
public async Task InitTenantDb(TenantInput input)
{
var tenant = await _sysTenantRep.GetByIdAsync(input.Id);
@ -450,7 +450,7 @@ public class SysTenantService : IDynamicApiController, ITransient
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[DisplayName("创建租户数据")]
[DisplayName("创建租户数据")]
public async Task InitTenantData(TenantInput input)
{
var tenant = await _sysTenantRep.GetByIdAsync(input.Id);
@ -467,38 +467,38 @@ public class SysTenantService : IDynamicApiController, ITransient
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[DisplayName("获取租户下的用户列表")]
[DisplayName("获取租户下的用户列表")]
public async Task<List<SysUser>> UserList(TenantIdInput input)
{
return await _sysUserRep.AsQueryable().ClearFilter().Where(u => u.TenantId == input.TenantId).ToListAsync();
}
return await _sysUserRep.AsQueryable().IgnoreTenant().Where(u => u.TenantId == input.TenantId).ToListAsync();
}
/// <summary>
/// 获取所有租户数据库列表 🔖
/// </summary>
/// <returns></returns>
[DisplayName("获取所有租户数据库列表")]
[DisplayName("获取所有租户数据库列表")]
public async Task<List<DbOutput>> GetTenantDbList()
{
var tenantDbList = await _sysTenantRep.AsQueryable().ClearFilter()
.LeftJoin<SysOrg>((u, a) => u.OrgId == a.Id)
//.GroupBy(u => new { u.DbType, u.Connection })
.Where(u => u.Status == StatusEnum.Enable)
.OrderBy(u => u.ConfigId)
.Select((u, a) => new DbOutput()
{
DbName = a.Name,
ConfigId = u.ConfigId.ToString(),
DbType = u.DbType,
Connection = u.Connection
}).ToListAsync();
//// 获取数据库名称
//foreach (var tenantDb in tenantDbList)
//{
// tenantDb.DbName = _sysTenantRep.AsTenant().GetConnectionScope(tenantDb.ConfigId).Ado.Connection.Database;
//}
{
var tenantDbList = await _sysTenantRep.AsQueryable().IgnoreTenant()
.LeftJoin<SysOrg>((u, a) => u.OrgId == a.Id)
//.GroupBy(u => new { u.DbType, u.Connection })
.Where(u => u.Status == StatusEnum.Enable)
.OrderBy(u => u.ConfigId)
.Select((u, a) => new DbOutput()
{
DbName = a.Name,
ConfigId = u.ConfigId.ToString(),
DbType = u.DbType,
Connection = u.Connection
}).ToListAsync();
//// 获取数据库名称
//foreach (var tenantDb in tenantDbList)
//{
// tenantDb.DbName = _sysTenantRep.AsTenant().GetConnectionScope(tenantDb.ConfigId).Ado.Connection.Database;
//}
return tenantDbList;
}
@ -506,7 +506,7 @@ public class SysTenantService : IDynamicApiController, ITransient
/// 获取租户数据库连接
/// </summary>
/// <returns></returns>
[NonAction]
[NonAction]
public SqlSugarScopeProvider GetTenantDbConnectionScope(long tenantId)
{
var iTenant = _sysTenantRep.AsTenant();
@ -554,7 +554,7 @@ public class SysTenantService : IDynamicApiController, ITransient
/// <returns></returns>
[SuppressMonitor]
[AllowAnonymous]
[DisplayName("获取系统信息")]
[DisplayName("获取系统信息")]
public async Task<dynamic> GetSysInfo(long tenantId)
{
//// 还可以根据域名判断租户
@ -562,9 +562,9 @@ public class SysTenantService : IDynamicApiController, ITransient
if (tenantId < 1) tenantId = long.Parse(App.User?.FindFirst(ClaimConst.TenantId)?.Value ?? "0");
if (tenantId < 1) tenantId = SqlSugarConst.DefaultTenantId;
var tenant = await _sysTenantRep.GetFirstAsync(u => u.Id == tenantId) ?? throw Oops.Oh($"租户信息不存在:{tenantId}");
// 若租户系统标题为空,则获取默认租户系统信息(兼容已有未配置的租户)
var tenant = await _sysTenantRep.GetFirstAsync(u => u.Id == tenantId) ?? throw Oops.Oh($"租户信息不存在:{tenantId}");
// 若租户系统标题为空,则获取默认租户系统信息(兼容已有未配置的租户)
if (string.IsNullOrWhiteSpace(tenant.Title))
tenant = await _sysTenantRep.GetFirstAsync(u => u.Id == SqlSugarConst.DefaultTenantId);
@ -610,20 +610,20 @@ public class SysTenantService : IDynamicApiController, ITransient
/// </summary>
/// <returns></returns>
[UnitOfWork]
[DisplayName("保存系统信息")]
[DisplayName("保存系统信息")]
public async Task SaveSysInfo(SysInfoInput input)
{
{
input.TenantId = input.TenantId < 1 ? long.Parse(App.User?.FindFirst(ClaimConst.TenantId)?.Value ?? "0") : input.TenantId;
var tenant = await _sysTenantRep.GetFirstAsync(u => u.Id == input.TenantId) ?? throw Oops.Oh(ErrorCodeEnum.D1002);
tenant = input.Adapt<SysTenant>();
tenant.Id = input.TenantId;
// 先清空轮播图再更新
var carouselFileIds = await _sysTenantRep.ChangeRepository<SqlSugarRepository<SysFile>>().AsQueryable()
.WhereIF(input.CarouselFileIds != null && input.CarouselFileIds.Count != 0, u => !input.CarouselFileIds.Contains(u.Id))
.Where(u => u.FileType == "Carousel" && u.DataId == input.TenantId)
.Select(u => u.Id).ToListAsync();
foreach (var fileId in carouselFileIds)
tenant.Id = input.TenantId;
// 先清空轮播图再更新
var carouselFileIds = await _sysTenantRep.ChangeRepository<SqlSugarRepository<SysFile>>().AsQueryable()
.WhereIF(input.CarouselFileIds != null && input.CarouselFileIds.Count != 0, u => !input.CarouselFileIds.Contains(u.Id))
.Where(u => u.FileType == "Carousel" && u.DataId == input.TenantId)
.Select(u => u.Id).ToListAsync();
foreach (var fileId in carouselFileIds)
await App.GetRequiredService<SysFileService>().DeleteFile(new BaseIdInput { Id = fileId });
await _sysTenantRep.AsUpdateable(tenant).UpdateColumns(u => new

View File

@ -109,7 +109,7 @@ public class SysUserService : IDynamicApiController, ITransient
// 是否有权操作此账号
if (!_userManager.SuperAdmin && input.AccountType is AccountTypeEnum.SuperAdmin) throw Oops.Oh(ErrorCodeEnum.D1033);
var query = _sysUserRep.AsQueryable().ClearFilter();
var query = _sysUserRep.AsQueryable().IgnoreTenant();
if (await query.AnyAsync(u => u.Account == input.Account)) throw Oops.Oh(ErrorCodeEnum.D1003);
if (!string.IsNullOrWhiteSpace(input.Phone) && await query.AnyAsync(u => u.Phone == input.Phone)) throw Oops.Oh(ErrorCodeEnum.D1032);
@ -142,7 +142,7 @@ public class SysUserService : IDynamicApiController, ITransient
[DisplayName("更新用户")]
public virtual async Task UpdateUser(UpdateUserInput input)
{
var query = _sysUserRep.AsQueryable().ClearFilter().Where(u => u.Id != input.Id);
var query = _sysUserRep.AsQueryable().IgnoreTenant().Where(u => u.Id != input.Id);
if (await query.AnyAsync(u => u.Account == input.Account)) throw Oops.Oh(ErrorCodeEnum.D1003);
if (!string.IsNullOrWhiteSpace(input.Phone) && await query.AnyAsync(u => u.Phone == input.Phone)) throw Oops.Oh(ErrorCodeEnum.D1032);

View File

@ -46,6 +46,11 @@ public class SqlSugarPagedList<TEntity>
/// 是否有下一页
/// </summary>
public bool HasNextPage { get; set; }
/// <summary>
/// 统计数据
/// </summary>
public dynamic TotalInfo { get; set; }
}
/// <summary>

View File

@ -81,6 +81,6 @@ public static class SeedDataHelper
/// <returns></returns>
private static IEnumerable<Type> SeedOrder(this IEnumerable<Type> types)
{
return types.OrderBy(u => u.GetCustomAttribute<SeedDataAttribute>(false)?.Order ?? 0).ToList();
return types.OrderBy(u => u.GetCustomAttribute<SeedDataAttribute>(false)?.Order ?? 0);
}
}

View File

@ -57,7 +57,7 @@ public class GoViewSysService : IDynamicApiController
tenant.Captcha = true;
_sysCacheService.Set(CacheConst.KeyTenant, tenantList);
var sysUser = await _sysUserRep.AsQueryable().ClearFilter().FirstAsync(u => u.Account.Equals(input.Username));
var sysUser = await _sysUserRep.AsQueryable().IgnoreTenant().FirstAsync(u => u.Account.Equals(input.Username));
return new GoViewLoginOutput()
{
Userinfo = new GoViewLoginUserInfo