You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
481 lines
22 KiB
481 lines
22 KiB
3 weeks ago
|
using DocumentFormat.OpenXml.Spreadsheet;
|
||
|
using DocumentFormat.OpenXml.Vml.Spreadsheet;
|
||
|
using DocumentFormat.OpenXml.Wordprocessing;
|
||
|
using Microsoft.AspNetCore.Http;
|
||
|
using Microsoft.Extensions.Options;
|
||
|
using ReZero.DependencyInjection;
|
||
|
using SqlSugar;
|
||
|
using System;
|
||
|
using System.Collections.Generic;
|
||
|
using System.Data;
|
||
|
using System.IO;
|
||
|
using System.Linq;
|
||
|
using System.Net.Sockets;
|
||
|
using System.Security.Cryptography.Xml;
|
||
|
using System.Security.Policy;
|
||
|
using System.Text;
|
||
|
using static Microsoft.CodeAnalysis.CSharp.SyntaxTokenParser;
|
||
|
|
||
|
namespace ReZero.SuperAPI
|
||
|
{
|
||
|
[Api(InterfaceCategoryInitializerProvider.Id100003)]
|
||
|
internal class InternalInitApi
|
||
|
{
|
||
|
[DI]
|
||
|
public IHttpContextAccessor? contextAccessor { get; set; }
|
||
|
|
||
|
#region Setting
|
||
|
[ApiMethod(nameof(InternalInitApi.SaveLoginConfig), GroupName = PubConst.InitApi_SystemCommon, Url = PubConst.InitApi_SystemSaveConfig)]
|
||
|
public bool SaveLoginConfig(bool enable)
|
||
|
{
|
||
|
var db = App.Db;
|
||
|
var sysSetting = db.Queryable<ZeroSysSetting>().Where(it => it.TypeId == PubConst.Setting_EnableLoginType).First();
|
||
|
if (sysSetting == null)
|
||
|
sysSetting = new ZeroSysSetting() { Id = SqlSugar.SnowFlakeSingle.Instance.NextId(), TypeId = PubConst.Setting_EnableLoginType };
|
||
|
sysSetting.BoolValue = enable;
|
||
|
db.Storageable(sysSetting).ExecuteCommand();
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
[ApiMethod(nameof(InternalInitApi.GetLoginConfig), GroupName = PubConst.InitApi_SystemCommon, Url = PubConst.InitApi_SystemGetInitConfig)]
|
||
|
public object GetLoginConfig()
|
||
|
{
|
||
|
var db = App.Db;
|
||
|
var sysSetting = db.Queryable<ZeroSysSetting>().Where(it => it.TypeId == PubConst.Setting_EnableLoginType).First();
|
||
|
if (sysSetting == null) return false;
|
||
|
return sysSetting.BoolValue;
|
||
|
}
|
||
|
[ApiMethod(nameof(InternalInitApi.VerifyCode), GroupName = PubConst.InitApi_SystemCommon, Url = PubConst.InitApi_VerifyCode)]
|
||
|
|
||
|
#endregion
|
||
|
|
||
|
#region User
|
||
|
public object VerifyCode()
|
||
|
{
|
||
|
var bytes = VerifyCodeSugar.Create();
|
||
|
var base64String = Convert.ToBase64String(bytes.Item2);
|
||
|
return new { Code = Encryption.Encrypt(bytes.Item1?.ToLower() ?? string.Empty), Src = $"data:image/png;base64,{base64String}" };
|
||
|
}
|
||
|
[ApiMethod(nameof(InternalInitApi.SaveUser), GroupName = nameof(ZeroUserInfo), Url = PubConst.InitApi_SaveUser)]
|
||
|
public bool SaveUser(ZeroUserInfo zeroUserInfo)
|
||
|
{
|
||
|
var db = App.Db;
|
||
|
if (zeroUserInfo?.Avatar?.StartsWith("data:image/") == true)
|
||
|
{
|
||
|
var avatarBytes = PubMethod.ConvertBase64ToBytes(zeroUserInfo.Avatar);
|
||
|
var imgId = SqlSugar.SnowFlakeSingle.Instance.NextId();
|
||
|
var avatarDirectory = Path.Combine(AppContext.BaseDirectory, SuperAPIStaticFileMiddleware.GetFilePathByCurrentDirectory(Path.Combine("images", "users")));
|
||
|
if (!Directory.Exists(avatarDirectory))
|
||
|
{
|
||
|
Directory.CreateDirectory(avatarDirectory);
|
||
|
}
|
||
|
var avatarPath = Path.Combine(avatarDirectory, $"{imgId}.jpg");
|
||
|
File.WriteAllBytes(avatarPath, avatarBytes);
|
||
|
zeroUserInfo.Avatar = $"images/users/{imgId}.jpg";
|
||
|
}
|
||
|
if (zeroUserInfo?.Id == 0)
|
||
|
{
|
||
|
if (string.IsNullOrEmpty(zeroUserInfo.UserName))
|
||
|
{
|
||
|
throw new Exception(TextHandler.GetCommonText("用户名不能为空", "Username cannot be empty"));
|
||
|
}
|
||
|
if (string.IsNullOrEmpty(zeroUserInfo.Password))
|
||
|
{
|
||
|
throw new Exception(TextHandler.GetCommonText("密码不能为空", "Password cannot be empty"));
|
||
|
}
|
||
|
if (db.Queryable<ZeroUserInfo>().Any(it => it.UserName == zeroUserInfo.UserName))
|
||
|
{
|
||
|
throw new Exception(TextHandler.GetCommonText("用户名已存在", "The user name already exists"));
|
||
|
}
|
||
|
zeroUserInfo.CreateTime = DateTime.Now;
|
||
|
zeroUserInfo.Creator = DataBaseInitializerProvider.UserName;
|
||
|
zeroUserInfo.CreatorId = 1;
|
||
|
zeroUserInfo.Password = Encryption.Encrypt(zeroUserInfo.Password);
|
||
|
zeroUserInfo.Id = SqlSugar.SnowFlakeSingle.Instance.NextId();
|
||
|
db.Insertable(zeroUserInfo).ExecuteCommand();
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
zeroUserInfo!.Password = Encryption.Encrypt(zeroUserInfo.Password!);
|
||
|
zeroUserInfo.Modifier = DataBaseInitializerProvider.UserName;
|
||
|
db.Updateable(zeroUserInfo).IgnoreColumns(true).ExecuteCommand();
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
[ApiMethod(nameof(InternalInitApi.GetUserById), GroupName = nameof(ZeroUserInfo), Url = PubConst.InitApi_GetUserById)]
|
||
|
public ZeroUserInfo GetUserById(long id)
|
||
|
{
|
||
|
var db = App.Db;
|
||
|
if (id == -1)
|
||
|
{
|
||
|
var userName = DependencyResolver.GetLoggedInUser();
|
||
|
var userInfo = App.Db.Queryable<ZeroUserInfo>().Where(it => it.UserName == userName || it.BusinessAccount == userName)
|
||
|
.First();
|
||
|
return userInfo;
|
||
|
}
|
||
|
return db.Queryable<ZeroUserInfo>().InSingle(id);
|
||
|
}
|
||
|
[ApiMethod(nameof(InternalInitApi.DeleteUserInfo), GroupName = nameof(ZeroUserInfo), Url = PubConst.InitApi_DeleteUserById)]
|
||
|
public bool DeleteUserInfo(long id)
|
||
|
{
|
||
|
var db = App.Db;
|
||
|
var zeroUser = db.Queryable<ZeroUserInfo>().InSingle(id);
|
||
|
if (zeroUser == null) return true;
|
||
|
if (zeroUser.IsInitialized || zeroUser.Id == 1)
|
||
|
{
|
||
|
throw new Exception("初始化数据无法删除");
|
||
|
}
|
||
|
db.Deleteable<ZeroUserInfo>().In(zeroUser.Id).ExecuteCommand();
|
||
|
return true;
|
||
|
}
|
||
|
[ApiMethod(nameof(InternalInitApi.GetUserInfo), GroupName = nameof(ZeroUserInfo), Url = PubConst.InitApi_GetCurrentUser)]
|
||
|
public object GetUserInfo()
|
||
|
{
|
||
|
var userName = DependencyResolver.GetLoggedInUser();
|
||
|
var defaultSrc = "images/users/avatar.jpg";
|
||
|
var defaultUserName = userName??"ReZero";
|
||
|
var userInfo = App.Db.Queryable<ZeroUserInfo>().Where(it => it.UserName == userName || it.BusinessAccount == userName)
|
||
|
.First();
|
||
|
if (userInfo?.Avatar==string.Empty)
|
||
|
{
|
||
|
userInfo.Avatar = defaultSrc;
|
||
|
}
|
||
|
if (userInfo == null)
|
||
|
{
|
||
|
userInfo = new ZeroUserInfo()
|
||
|
{
|
||
|
Avatar= defaultSrc
|
||
|
};
|
||
|
}
|
||
|
return new { IsAdmin= userInfo.IsMasterAdmin, UserName = userInfo?.UserName?? defaultUserName, Avatar = userInfo?.Avatar };
|
||
|
}
|
||
|
[ApiMethod(nameof(InternalInitApi.GetBizUsers), GroupName = nameof(ZeroUserInfo), Url = PubConst.InitApi_GetBizUsers)]
|
||
|
public object GetBizUsers()
|
||
|
{
|
||
|
var db = App.Db;
|
||
|
var options = SuperAPIModule._apiOptions;
|
||
|
var jwt = options?.InterfaceOptions?.Jwt ?? new Configuration.ReZeroJwt();
|
||
|
var isEnable=options?.InterfaceOptions?.Jwt?.Enable==true;
|
||
|
if (string.IsNullOrEmpty(jwt?.UserTableName)|| string.IsNullOrEmpty(jwt?.PasswordFieldName)|| string.IsNullOrEmpty(jwt?.UserNameFieldName))
|
||
|
{
|
||
|
throw new Exception(TextHandler.GetCommonText("JWT用户表或者字段未设置", "The JWT user table or field is not set"));
|
||
|
}
|
||
|
try
|
||
|
{
|
||
|
var result = db.Queryable<object>().AS(jwt.UserTableName)
|
||
|
.Select<string>(SelectModel.Create(
|
||
|
new SelectModel() { FieldName = jwt.UserNameFieldName, AsName = "username" }
|
||
|
)).ToList();
|
||
|
return result;
|
||
|
}
|
||
|
catch (Exception ex)
|
||
|
{
|
||
|
throw new Exception(TextHandler.GetCommonText(ex.Message, ex.Message));
|
||
|
}
|
||
|
}
|
||
|
#endregion
|
||
|
|
||
|
#region Entity
|
||
|
[ApiMethod(nameof(InternalInitApi.ExecTemplateByViewWithoutCreatingFiles), GroupName = nameof(ZeroEntityInfo), Url = PubConst.InitApi_ViewTemplate)]
|
||
|
public string ExecTemplateByViewWithoutCreatingFiles(long databaseId,bool isView, string viewName, long templateId)
|
||
|
{
|
||
|
return new MethodApi().ExecTemplateByViewWithoutCreatingFiles(databaseId, viewName, isView, templateId);
|
||
|
}
|
||
|
#endregion
|
||
|
|
||
|
#region Token
|
||
|
[ApiMethod(nameof(InternalInitApi.AddTokenManage), GroupName = nameof(ZeroJwtTokenManagement), Url = PubConst.InitApi_AddTokenManage)]
|
||
|
public bool AddTokenManage(ZeroJwtTokenManagement zeroJwtTokenManagement)
|
||
|
{
|
||
|
CacheManager<ZeroInterfaceList>.Instance.ClearCache();
|
||
|
var db = App.Db;
|
||
|
var options = SuperAPIModule._apiOptions;
|
||
|
var jwt = options?.InterfaceOptions?.Jwt ?? new Configuration.ReZeroJwt();
|
||
|
if (string.IsNullOrEmpty(jwt.UserTableName) || string.IsNullOrEmpty(jwt.PasswordFieldName) || string.IsNullOrEmpty(jwt.UserNameFieldName))
|
||
|
{
|
||
|
throw new Exception(TextHandler.GetCommonText($"JWT信息没有配置完整表名字段名存在空", $"The JWT information is not fully configured. Table name The field name is empty"));
|
||
|
}
|
||
|
if (string.IsNullOrEmpty(zeroJwtTokenManagement.UserName))
|
||
|
{
|
||
|
throw new Exception(TextHandler.GetCommonText($"用户名必填", $"User name is required"));
|
||
|
}
|
||
|
if (zeroJwtTokenManagement.Expiration == DateTime.MinValue)
|
||
|
{
|
||
|
throw new Exception(TextHandler.GetCommonText($"使用期限必填", $"The usage period is required"));
|
||
|
}
|
||
|
DataTable dt = new DataTable();
|
||
|
try
|
||
|
{
|
||
|
dt = db.Queryable<object>()
|
||
|
.AS(jwt.UserTableName)
|
||
|
.Where(jwt.UserNameFieldName, "=", zeroJwtTokenManagement.UserName)
|
||
|
.ToDataTable();
|
||
|
}
|
||
|
catch (Exception ex)
|
||
|
{
|
||
|
throw ex;
|
||
|
}
|
||
|
if (dt.Rows.Count == 0)
|
||
|
{
|
||
|
throw new Exception(TextHandler.GetCommonText($"JWT用户表没有找到{zeroJwtTokenManagement.UserName}", $" JWT user table not found {zeroJwtTokenManagement.UserName}"));
|
||
|
}
|
||
|
var password = dt.Rows[0][jwt.PasswordFieldName] + "";
|
||
|
var token = new MethodApi() { TokenExpiration=zeroJwtTokenManagement.Expiration }.GetToken(zeroJwtTokenManagement.UserName!,password);
|
||
|
zeroJwtTokenManagement.CreateTime = DateTime.Now;
|
||
|
zeroJwtTokenManagement.Creator = DataBaseInitializerProvider.UserName;
|
||
|
zeroJwtTokenManagement.Id = SqlSugar.SnowFlakeSingle.Instance.NextId();
|
||
|
zeroJwtTokenManagement.Token = token;
|
||
|
db.Insertable(zeroJwtTokenManagement).ExecuteCommand();
|
||
|
return true;
|
||
|
}
|
||
|
[ApiMethod(nameof(InternalInitApi.UpdateTokenManage), GroupName = nameof(ZeroJwtTokenManagement), Url = PubConst.InitApi_UpdateTokenManage)]
|
||
|
public bool UpdateTokenManage(ZeroJwtTokenManagement zeroJwtTokenManagement)
|
||
|
{
|
||
|
CacheManager<ZeroInterfaceList>.Instance.ClearCache();
|
||
|
var db = App.Db;
|
||
|
zeroJwtTokenManagement.UpdateTime = DateTime.Now;
|
||
|
db.Updateable(zeroJwtTokenManagement)
|
||
|
.UpdateColumns(it => new { it.Description,it.EasyDescription ,it.UpdateTime}).ExecuteCommand();
|
||
|
return true;
|
||
|
}
|
||
|
[ApiMethod(nameof(InternalInitApi.DeleteTokenManage), GroupName = nameof(ZeroJwtTokenManagement), Url = PubConst.InitApi_DeleteTokenManage)]
|
||
|
public bool DeleteTokenManage(long Id)
|
||
|
{
|
||
|
CacheManager<ZeroInterfaceList>.Instance.ClearCache();
|
||
|
var db = App.Db;
|
||
|
db.Updateable<ZeroJwtTokenManagement>()
|
||
|
.SetColumns(it => it.IsDeleted == true)
|
||
|
.Where(it => it.Id == Id).ExecuteCommand();
|
||
|
return true;
|
||
|
}
|
||
|
[ApiMethod(nameof(InternalInitApi.GetZeroJwtTokenManagementById), GroupName = nameof(ZeroJwtTokenManagement), Url = PubConst.InitApi_GetTokenManageById)]
|
||
|
public ZeroJwtTokenManagement GetZeroJwtTokenManagementById(long id)
|
||
|
{
|
||
|
var data = App.Db.Queryable<ZeroJwtTokenManagement>().InSingle(id);
|
||
|
return data;
|
||
|
}
|
||
|
#endregion
|
||
|
|
||
|
#region Permission
|
||
|
|
||
|
[ApiMethod(nameof(InternalInitApi.GetPermissionList), GroupName = nameof(ZeroPermissionInfo), Url = PubConst.InitApi_GetPermissionList)]
|
||
|
public object GetPermissionList(int pageNumber,int pageSize,string permissionName,string userName)
|
||
|
{
|
||
|
var db = App.Db;
|
||
|
int count = SetDefaultPageParameters(ref pageNumber, ref pageSize);
|
||
|
var permissions = db.Queryable<ZeroPermissionInfo>()
|
||
|
.WhereIF(!string.IsNullOrEmpty(userName), it => SqlFunc.Subqueryable<ZeroPermissionMapping>().Where(s => s.PermissionInfoId == it.Id && s.UserName == userName).Any())
|
||
|
.WhereIF(!string.IsNullOrEmpty(permissionName), it => it.Name!.Contains(permissionName)).ToPageList(pageNumber, pageSize, ref count);
|
||
|
var columns = new List<ResultGridColumn>
|
||
|
{
|
||
|
new ResultGridColumn { PropertyName = "Id", ColumnDescription = "权限ID" },
|
||
|
new ResultGridColumn { PropertyName = "Name", ColumnDescription = "权限名称" },
|
||
|
new ResultGridColumn { PropertyName = "CreateTime", ColumnDescription = "创建时间"},
|
||
|
new ResultGridColumn { PropertyName = "Creator", ColumnDescription = "创建者"}
|
||
|
};
|
||
|
return GetGridDataList<ZeroPermissionInfo>(pageNumber, pageSize, count, permissions, columns);
|
||
|
}
|
||
|
private static object GetGridDataList<T>(int pageNumber, int pageSize, int count, List<T> permissions, List<ResultGridColumn> columns)
|
||
|
{
|
||
|
return new ResultPageGrid
|
||
|
{
|
||
|
Data = permissions,
|
||
|
Columns = columns,
|
||
|
Page = new ResultPage()
|
||
|
{
|
||
|
TotalCount = count,
|
||
|
PageNumber = pageNumber,
|
||
|
PageSize = pageSize,
|
||
|
TotalPage = (int)Math.Ceiling((double)count / pageSize)
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
private static int SetDefaultPageParameters(ref int pageNumber, ref int pageSize)
|
||
|
{
|
||
|
var count = 0;
|
||
|
if (pageNumber == 0)
|
||
|
pageNumber = 1;
|
||
|
if (pageSize == 0)
|
||
|
pageSize = 10;
|
||
|
return count;
|
||
|
}
|
||
|
|
||
|
[ApiMethod(nameof(InternalInitApi.AddPermission), GroupName = nameof(ZeroPermissionInfo), Url = PubConst.InitApi_AddPermission)]
|
||
|
public bool AddPermission(SavePermissionInfoDetailModel permission)
|
||
|
{
|
||
|
var db = App.Db;
|
||
|
CacheManager<ZeroPermissionInfo>.Instance.ClearCache();
|
||
|
CacheManager<ZeroPermissionMapping>.Instance.ClearCache();
|
||
|
CheckPermissionModel(permission);
|
||
|
// 设置权限基本信息
|
||
|
permission.Id = SqlSugar.SnowFlakeSingle.Instance.NextId();
|
||
|
permission.CreateTime = DateTime.Now;
|
||
|
permission.Creator = DataBaseInitializerProvider.UserName;
|
||
|
|
||
|
// 插入权限信息
|
||
|
db.Insertable((ZeroPermissionInfo)permission).ExecuteCommand();
|
||
|
|
||
|
// 插入权限与接口的映射关系
|
||
|
if (permission.Items != null && permission.Items.Any())
|
||
|
{
|
||
|
var mappings = permission.Items
|
||
|
.Where(item => item.Checked && item.ZeroInterfaceList != null)
|
||
|
.SelectMany(item => permission.Users!.Select(user => new ZeroPermissionMapping
|
||
|
{
|
||
|
Id = SqlSugar.SnowFlakeSingle.Instance.NextId(),
|
||
|
PermissionInfoId = permission.Id,
|
||
|
InterfaceId = item.ZeroInterfaceList!.Id,
|
||
|
UserName = user,
|
||
|
CreateTime = DateTime.Now,
|
||
|
Creator = DataBaseInitializerProvider.UserName,
|
||
|
IsInitialized = false
|
||
|
}))
|
||
|
.ToList();
|
||
|
|
||
|
if (mappings.Any())
|
||
|
{
|
||
|
db.Insertable(mappings).ExecuteCommand();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
[ApiMethod(nameof(InternalInitApi.UpdatePermission), GroupName = nameof(ZeroPermissionInfo), Url = PubConst.InitApi_UpdatePermission)]
|
||
|
public bool UpdatePermission(SavePermissionInfoDetailModel permission)
|
||
|
{
|
||
|
CheckPermissionModel(permission);
|
||
|
var db = App.Db;
|
||
|
CacheManager<ZeroPermissionInfo>.Instance.ClearCache();
|
||
|
CacheManager<ZeroPermissionMapping>.Instance.ClearCache();
|
||
|
// 更新权限基本信息
|
||
|
permission.UpdateTime = DateTime.Now;
|
||
|
db.Updateable((ZeroPermissionInfo)permission)
|
||
|
.IgnoreColumns(it => new { it.CreateTime, it.Creator })
|
||
|
.ExecuteCommand();
|
||
|
|
||
|
// 删除旧的权限映射关系
|
||
|
db.Deleteable<ZeroPermissionMapping>()
|
||
|
.Where(it => it.PermissionInfoId == permission.Id)
|
||
|
.ExecuteCommand();
|
||
|
|
||
|
// 插入新的权限映射关系
|
||
|
if (permission.Items != null && permission.Items.Any())
|
||
|
{
|
||
|
var mappings = permission.Items
|
||
|
.Where(item => item.Checked && item.ZeroInterfaceList != null)
|
||
|
.SelectMany(item => permission.Users!.Select(user => new ZeroPermissionMapping
|
||
|
{
|
||
|
Id = SqlSugar.SnowFlakeSingle.Instance.NextId(),
|
||
|
PermissionInfoId = permission.Id,
|
||
|
InterfaceId = item.ZeroInterfaceList!.Id,
|
||
|
UserName = user,
|
||
|
CreateTime = DateTime.Now,
|
||
|
Creator = DataBaseInitializerProvider.UserName,
|
||
|
IsInitialized=false
|
||
|
}))
|
||
|
.ToList();
|
||
|
|
||
|
if (mappings.Any())
|
||
|
{
|
||
|
db.Insertable(mappings).ExecuteCommand();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
|
||
|
private static void CheckPermissionModel(SavePermissionInfoDetailModel permission)
|
||
|
{
|
||
|
if (string.IsNullOrEmpty(permission.Name))
|
||
|
{
|
||
|
throw new Exception("权限名称不能为空");
|
||
|
}
|
||
|
if (permission.Users?.Any() != true)
|
||
|
{
|
||
|
throw new Exception("用户不能为空");
|
||
|
}
|
||
|
}
|
||
|
[ApiMethod(nameof(InternalInitApi.DeletePermission), GroupName = nameof(ZeroPermissionInfo), Url = PubConst.InitApi_DeletePermission)]
|
||
|
public bool DeletePermission(long id)
|
||
|
{
|
||
|
var db = App.Db;
|
||
|
CacheManager<ZeroPermissionInfo>.Instance.ClearCache();
|
||
|
CacheManager<ZeroPermissionMapping>.Instance.ClearCache();
|
||
|
try
|
||
|
{
|
||
|
db.Ado.BeginTran();
|
||
|
db.Updateable<ZeroPermissionInfo>().In(new object[] { id }).SetColumns(it => it.IsDeleted == true).ExecuteCommand();
|
||
|
var list = db.Queryable<ZeroPermissionMapping>().In(id).ToList();
|
||
|
foreach (var item in list)
|
||
|
{
|
||
|
item.IsDeleted = true;
|
||
|
}
|
||
|
db.Updateable(list).ExecuteCommand();
|
||
|
db.Ado.CommitTran();
|
||
|
}
|
||
|
catch (Exception)
|
||
|
{
|
||
|
db.Ado.RollbackTran();
|
||
|
throw;
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
[ApiMethod(nameof(InternalInitApi.GetSavePermissionModelById), GroupName = nameof(ZeroPermissionInfo), Url = PubConst.InitApi_GetSavePermissionModelById)]
|
||
|
public SavePermissionInfoDetailModel GetSavePermissionModelById(long id)
|
||
|
{
|
||
|
|
||
|
var db = App.Db;
|
||
|
var result = new SavePermissionInfoDetailModel() { Users = new List<string>() { } };
|
||
|
if (id > 0)
|
||
|
{
|
||
|
result=db.Queryable<ZeroPermissionInfo>().In(id).Select<SavePermissionInfoDetailModel>().First();
|
||
|
}
|
||
|
// 一次性加载分类表到内存
|
||
|
var categoryMap = db.Queryable<ZeroInterfaceCategory>()
|
||
|
.ToList()
|
||
|
.ToDictionary(it => it.Id, it => it.Name ?? "未知分类");
|
||
|
|
||
|
// 获取所有接口列表
|
||
|
var interfaces = db.Queryable<ZeroInterfaceList>()
|
||
|
.OrderBy(it => it.SortId)
|
||
|
.OrderBy(it => it.GroupName)
|
||
|
.Where(it => it.IsInitialized == false)
|
||
|
.ToList()
|
||
|
.Select(it => new PermissionInfoInterfaceItem()
|
||
|
{
|
||
|
ZeroInterfaceList = it,
|
||
|
Checked = false, // 默认未选中
|
||
|
TypeName = categoryMap.ContainsKey(it.InterfaceCategoryId) ? categoryMap[it.InterfaceCategoryId] : "未知分类" // 根据分类 ID 设置 TypeName
|
||
|
})
|
||
|
.ToList();
|
||
|
|
||
|
result.Items = interfaces;
|
||
|
|
||
|
// 如果 id > 0,设置 Checked 为 true
|
||
|
if (id > 0)
|
||
|
{
|
||
|
// 获取与当前权限关联的接口 ID 列表
|
||
|
var mappings = db.Queryable<ZeroPermissionMapping>()
|
||
|
.Where(it => it.PermissionInfoId == id).ToList();
|
||
|
var associatedInterfaceIds = mappings
|
||
|
.Select(it => it.InterfaceId)
|
||
|
.ToList();
|
||
|
|
||
|
// 设置关联的接口项的 Checked 为 true
|
||
|
foreach (var item in result.Items)
|
||
|
{
|
||
|
if (item.ZeroInterfaceList != null && associatedInterfaceIds.Contains(item.ZeroInterfaceList.Id))
|
||
|
{
|
||
|
item.Checked = true;
|
||
|
}
|
||
|
}
|
||
|
result.Users = mappings.Select(it => it.UserName).Distinct()!.ToList()!;
|
||
|
}
|
||
|
return result;
|
||
|
}
|
||
|
#endregion
|
||
|
}
|
||
|
}
|