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.
 
 
 
 

480 lines
22 KiB

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
}
}