From aaebbb9104e6b938ed9d353382a25ed9ed5b12bb Mon Sep 17 00:00:00 2001 From: lq1405 <2769838458@qq.com> Date: Wed, 21 May 2025 21:28:18 +0800 Subject: [PATCH] =?UTF-8?q?V=201.1.0=20=E6=96=B0=E5=A2=9E=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E4=BF=A1=E6=81=AF=20=E5=AE=8C=E5=96=84=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E4=BF=A1=E6=81=AF=E5=BE=97=E6=9D=83=E9=99=90=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- LMS.Common/Enums/OptionTypeEnum.cs | 10 + LMS.DAO/ApplicationDbContext.cs | 12 + LMS.DAO/UserDAO/UserBasicDAO.cs | 26 +- LMS.Repository/DB/Options.cs | 11 +- .../DTO/OptionDto/OptionSimpleDto.cs | 21 + .../DTO/{ => OptionDto}/OptionsDto.cs | 2 +- LMS.Repository/Options/AddOptionModel .cs | 26 ++ .../Options/ModifyOptionByKeyModel.cs | 20 + LMS.service/Configuration/AutoMapperConfig.cs | 1 + LMS.service/Controllers/OptionsController.cs | 111 +++++ LMS.service/LMS.service.csproj | 2 + LMS.service/Service/OptionsService.cs | 405 +++++++++++++++++- .../Service/UserService/LoginService.cs | 4 +- LMS.service/appsettings.json | 2 +- 14 files changed, 640 insertions(+), 13 deletions(-) create mode 100644 LMS.Repository/DTO/OptionDto/OptionSimpleDto.cs rename LMS.Repository/DTO/{ => OptionDto}/OptionsDto.cs (89%) create mode 100644 LMS.Repository/Options/AddOptionModel .cs create mode 100644 LMS.Repository/Options/ModifyOptionByKeyModel.cs diff --git a/LMS.Common/Enums/OptionTypeEnum.cs b/LMS.Common/Enums/OptionTypeEnum.cs index dbe41be..49d19d6 100644 --- a/LMS.Common/Enums/OptionTypeEnum.cs +++ b/LMS.Common/Enums/OptionTypeEnum.cs @@ -8,6 +8,16 @@ public enum OptionTypeEnum Boolean = 4 } +/// +/// option的分类 +/// +public enum OptionCategory +{ + System = 1, + LaiTool = 2, + NanFengAI = 3, +} + public static class OptionKeyName { /// diff --git a/LMS.DAO/ApplicationDbContext.cs b/LMS.DAO/ApplicationDbContext.cs index 4331606..1c9a317 100644 --- a/LMS.DAO/ApplicationDbContext.cs +++ b/LMS.DAO/ApplicationDbContext.cs @@ -5,6 +5,7 @@ using LMS.Repository.Models.DB; using Microsoft.AspNetCore.Identity.EntityFrameworkCore; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.ChangeTracking; +//using Newtonsoft.Json; using System.Text.Json; namespace LMS.DAO @@ -69,6 +70,17 @@ namespace LMS.DAO ); modelBuilder.Entity() .HasKey(us => new { us.UserId, us.SoftwareId }); + + // Options表的RoleIds字段使用JSON格式存储 + modelBuilder.Entity(entity => + { + entity.Property(e => e.RoleIds) + .HasConversion( + v => Newtonsoft.Json.JsonConvert.SerializeObject(v), // 将 List 序列化为 JSON 字符串 + v => Newtonsoft.Json.JsonConvert.DeserializeObject>(v ?? "[]") ?? new List() // 反序列化 + ) + .HasColumnType("json"); // 指定MySQL字段类型为JSON + }); } } } diff --git a/LMS.DAO/UserDAO/UserBasicDAO.cs b/LMS.DAO/UserDAO/UserBasicDAO.cs index 6724a2f..99d7fbd 100644 --- a/LMS.DAO/UserDAO/UserBasicDAO.cs +++ b/LMS.DAO/UserDAO/UserBasicDAO.cs @@ -1,11 +1,14 @@ using LMS.Repository.Models.DB; using Microsoft.AspNetCore.Identity; +using Microsoft.EntityFrameworkCore; namespace LMS.DAO.UserDAO { - public class UserBasicDao(UserManager userManager) + public class UserBasicDao(UserManager userManager, ApplicationDbContext dbContext) { private readonly UserManager _userManager = userManager; + private readonly ApplicationDbContext _dbContext = dbContext; + /// /// 检查用户是否存在,通过用户ID /// @@ -120,6 +123,27 @@ namespace LMS.DAO.UserDAO } return true; } + + /// + /// 获取用户的所有角色ID + /// + /// + /// + /// + public async Task> GetUserRoleIds(long userId) + { + // 查找用户,若不存在直接抛异常 + User user = await _userManager.FindByIdAsync(userId.ToString()) + ?? throw new Exception("用户不存在"); + + // 直接查询 UserRoles 表获取所有关联的 RoleId + var roleIds = await _dbContext.UserRoles + .Where(ur => ur.UserId == user.Id) + .Select(ur => ur.RoleId) + .ToListAsync(); + + return roleIds; + } } } diff --git a/LMS.Repository/DB/Options.cs b/LMS.Repository/DB/Options.cs index 1672250..5604905 100644 --- a/LMS.Repository/DB/Options.cs +++ b/LMS.Repository/DB/Options.cs @@ -7,6 +7,7 @@ namespace LMS.Repository.DB; public class Options { [Key] + [Required] public required string Key { get; set; } = string.Empty; /// @@ -14,9 +15,17 @@ public class Options /// public string? Value { get; set; } = string.Empty; + [Required] public OptionTypeEnum Type { get; set; } = OptionTypeEnum.String; - // 写一个字段,映射Value,判断是不是json字符串,是的话就解析成对象 + [Required] + public OptionCategory Category { get; set; } = OptionCategory.System; + + [Required] + public List RoleIds { get; set; } = []; + + public DateTime CreatedTime { get; set; } + // 写一个字段,映射Value,判断是不是json字符串,是的话就解析成对象 public T? GetValueObject() { diff --git a/LMS.Repository/DTO/OptionDto/OptionSimpleDto.cs b/LMS.Repository/DTO/OptionDto/OptionSimpleDto.cs new file mode 100644 index 0000000..221b0a0 --- /dev/null +++ b/LMS.Repository/DTO/OptionDto/OptionSimpleDto.cs @@ -0,0 +1,21 @@ +using LMS.Common.Enums; + +namespace LMS.Repository.DTO.OptionDto +{ + public class OptionSimpleDto + { + public required string Key { get; set; } = string.Empty; + + /// + /// Value of the option,这个值是一个json字符串 + /// + public string? Value { get; set; } = string.Empty; + + + public OptionTypeEnum Type { get; set; } = OptionTypeEnum.String; + + public OptionCategory Category { get; set; } = OptionCategory.System; + + public List RoleNames { get; set; } = []; + } +} diff --git a/LMS.Repository/DTO/OptionsDto.cs b/LMS.Repository/DTO/OptionDto/OptionsDto.cs similarity index 89% rename from LMS.Repository/DTO/OptionsDto.cs rename to LMS.Repository/DTO/OptionDto/OptionsDto.cs index fe109b0..aa8acce 100644 --- a/LMS.Repository/DTO/OptionsDto.cs +++ b/LMS.Repository/DTO/OptionDto/OptionsDto.cs @@ -1,6 +1,6 @@ using LMS.Common.Enums; -namespace LMS.Repository.DTO; +namespace LMS.Repository.DTO.OptionDto; public class OptionsDto { diff --git a/LMS.Repository/Options/AddOptionModel .cs b/LMS.Repository/Options/AddOptionModel .cs new file mode 100644 index 0000000..de1b009 --- /dev/null +++ b/LMS.Repository/Options/AddOptionModel .cs @@ -0,0 +1,26 @@ + +using LMS.Common.Enums; +using System.ComponentModel.DataAnnotations; + +namespace LMS.Repository.Options; + +public class AddOptionModel +{ + + [Required] + public required string Key { get; set; } = string.Empty; + + /// + /// Value of the option,这个值是一个json字符串 + /// + public string? Value { get; set; } = string.Empty; + + [Required] + public OptionTypeEnum Type { get; set; } = OptionTypeEnum.String; + + [Required] + public OptionCategory Category { get; set; } = OptionCategory.System; + + [Required] + public List RoleNames { get; set; } +} diff --git a/LMS.Repository/Options/ModifyOptionByKeyModel.cs b/LMS.Repository/Options/ModifyOptionByKeyModel.cs new file mode 100644 index 0000000..f450e5a --- /dev/null +++ b/LMS.Repository/Options/ModifyOptionByKeyModel.cs @@ -0,0 +1,20 @@ + +using LMS.Common.Enums; +using System.ComponentModel.DataAnnotations; + +namespace LMS.Repository.Options; + +public class ModifyOptionByKeyModel +{ + /// + /// Value of the option,这个值是一个json字符串 + /// + + public required string Value { get; set; } = string.Empty; + + public required OptionTypeEnum Type { get; set; } = OptionTypeEnum.String; + + public required OptionCategory Category { get; set; } = OptionCategory.System; + [Required] + public required List RoleNames { get; set; } = []; +} diff --git a/LMS.service/Configuration/AutoMapperConfig.cs b/LMS.service/Configuration/AutoMapperConfig.cs index f4f7b9f..0ac7c49 100644 --- a/LMS.service/Configuration/AutoMapperConfig.cs +++ b/LMS.service/Configuration/AutoMapperConfig.cs @@ -1,6 +1,7 @@ using AutoMapper; using LMS.Repository.DB; using LMS.Repository.DTO; +using LMS.Repository.DTO.OptionDto; using LMS.Repository.DTO.PromptDto; using LMS.Repository.DTO.PromptTypeDto; using LMS.Repository.DTO.UserDto; diff --git a/LMS.service/Controllers/OptionsController.cs b/LMS.service/Controllers/OptionsController.cs index 36e5d99..53dd03d 100644 --- a/LMS.service/Controllers/OptionsController.cs +++ b/LMS.service/Controllers/OptionsController.cs @@ -1,11 +1,13 @@ using LMS.Common.Extensions; using LMS.Repository.DB; using LMS.Repository.DTO; +using LMS.Repository.DTO.OptionDto; using LMS.Repository.Models.DB; using LMS.Repository.Options; using LMS.service.Service; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; +using System.ComponentModel.DataAnnotations; using static LMS.Common.Enums.ResponseCodeEnum; namespace LMS.service.Controllers @@ -29,6 +31,7 @@ namespace LMS.service.Controllers [HttpGet("{optionsKey}")] public async Task>>> GetSimpleOptions(string optionsKey) { + long userId = ConvertExtension.ObjectToLong(HttpContext.Items["UserId"] ?? 0); return await _optionsService.GetSimpleOptions(optionsKey); } @@ -73,5 +76,113 @@ namespace LMS.service.Controllers } #endregion + + + } + + /// + /// Laitool 的配置项控制器 + /// + /// + [Route("lms/[controller]/[action]")] + [ApiController] + public class OptionsController(OptionsService optionsService) : ControllerBase + { + private readonly OptionsService _optionsService = optionsService; + + #region 获取指定的配置项 + /// + /// 获取简单的配置项,无需权限 + /// + /// + /// + [HttpGet("{userId}/{category}/{optionsKey}")] + public async Task>> GetOptionsByKey(long userId, int category, string optionsKey) + { + return await _optionsService.GetOptionsByKey(userId, category, optionsKey); + } + + #endregion + + #region 获取指定的配置项,全部 + /// + /// 获取简单的配置项,无需权限 + /// + /// + /// + [HttpGet("{category}/{optionsKey}")] + [Authorize] + public async Task>> GetAllMessageOptionsByKey(int category, string optionsKey) + { + long userId = ConvertExtension.ObjectToLong(HttpContext.Items["UserId"] ?? 0); + return await _optionsService.GetAllMessageOptionsByKey(category, optionsKey, userId); + } + + #endregion + + + #region 获取指定条件的数据信息集合 + /// + /// 获取简单的配置项,无需权限 + /// + /// + /// + [HttpGet] + [Authorize] + public async Task>>> QueryOptionCollection([Required] int page, [Required] int pageSize, string? key, int? type, int? category, [FromQuery] string[]? roleNames) + { + + long userId = ConvertExtension.ObjectToLong(HttpContext.Items["UserId"] ?? 0); + return await _optionsService.QueryOptionCollection(page, pageSize, key, type, category, roleNames, userId); + } + + #endregion + + #region 修改数据配置项 + + [HttpPost("{key}")] + [Authorize] + public async Task>> ModifyOptionsByKey(string key, [FromBody] ModifyOptionByKeyModel model) + { + if (!ModelState.IsValid) + { + return APIResponseModel.CreateErrorResponseModel(ResponseCode.ParameterError); + } + long userId = ConvertExtension.ObjectToLong(HttpContext.Items["UserId"] ?? 0); + return await _optionsService.ModifyOptionsByKey(key, model, userId); + } + + #endregion + + #region 新增指定的数据项 + + [HttpPost] + [Authorize] + public async Task>> AddOptions([FromBody] AddOptionModel option) + { + if (!ModelState.IsValid) + { + return APIResponseModel.CreateErrorResponseModel(ResponseCode.ParameterError); + } + long userId = ConvertExtension.ObjectToLong(HttpContext.Items["UserId"] ?? 0); + return await _optionsService.AddOptions(option, userId); + } + #endregion + + #region 删除指定的key的数据 + + [HttpDelete("{category}/{key}")] + [Authorize] + public async Task>> DeleteOptionsByKey(int category, string key) + { + if (!ModelState.IsValid) + { + return APIResponseModel.CreateErrorResponseModel(ResponseCode.ParameterError); + } + long userId = ConvertExtension.ObjectToLong(HttpContext.Items["UserId"] ?? 0); + return await _optionsService.DeleteOptionsByKey(category, key, userId); + } + + #endregion } } diff --git a/LMS.service/LMS.service.csproj b/LMS.service/LMS.service.csproj index 4708f52..081d19b 100644 --- a/LMS.service/LMS.service.csproj +++ b/LMS.service/LMS.service.csproj @@ -13,6 +13,7 @@ + @@ -35,6 +36,7 @@ + diff --git a/LMS.service/Service/OptionsService.cs b/LMS.service/Service/OptionsService.cs index d4fea9a..3df6cdf 100644 --- a/LMS.service/Service/OptionsService.cs +++ b/LMS.service/Service/OptionsService.cs @@ -1,5 +1,6 @@ using AutoMapper; using LMS.Common.Dictionary; +using LMS.Common.Enums; using LMS.Common.Templates; using LMS.DAO; using LMS.DAO.UserDAO; @@ -11,14 +12,22 @@ using LMS.service.Extensions.Mail; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Options; +using System.Linq; using static LMS.Common.Enums.ResponseCodeEnum; +using Options = LMS.Repository.DB.Options; +using System.Linq.Dynamic.Core; +using LinqKit; +using LMS.Repository.DTO.OptionDto; +using LMS.Common.Extensions; namespace LMS.service.Service { - public class OptionsService(ApplicationDbContext context, UserManager userManager, IMapper mapper, UserBasicDao userBasicDao, EmailService emailService) + public class OptionsService(ApplicationDbContext context, UserManager userManager, RoleManager roleManager, IMapper mapper, UserBasicDao userBasicDao, EmailService emailService) { private readonly ApplicationDbContext _context = context; private readonly UserManager _userManager = userManager; + private readonly RoleManager _roleManager = roleManager; private readonly IMapper _mapper = mapper; private readonly UserBasicDao _userBasicDao = userBasicDao; private readonly EmailService _emailService = emailService; @@ -129,12 +138,7 @@ namespace LMS.service.Service using var transaction = await _context.Database.BeginTransactionAsync(); try { - User? user = await _userManager.FindByIdAsync(userId.ToString()); - if (user == null) - { - return APIResponseModel.CreateErrorResponseModel(ResponseCode.FindUserByIdFail); - } - bool isAdminOrSuperAdmin = await _userManager.IsInRoleAsync(user, "Admin") || await _userManager.IsInRoleAsync(user, "Super Admin"); + bool isAdminOrSuperAdmin = await _userBasicDao.CheckUserIsAdminOrSuperAdmin(userId); // 判断用户是不是管理员 if (!isAdminOrSuperAdmin) { @@ -200,5 +204,392 @@ namespace LMS.service.Service } #endregion + + #region 获取指定的配置项 + /// + /// 获取指定的配置项,需要判断权限 + /// + /// + /// + /// + /// + public async Task>> GetOptionsByKey(long userId, int category, string optionsKey) + { + try + { + // 判断分类是不是在对应的enum里面 + if (!Enum.IsDefined(typeof(OptionCategory), category)) + { + return APIResponseModel.CreateErrorResponseModel(ResponseCode.ParameterError, "该分类不存在"); + } + + Options? options = await _context.Options.FirstOrDefaultAsync(x => x.Key == optionsKey && (OptionCategory)category == x.Category) ?? throw new Exception("数据不存在"); + + List roleIds = []; + if (userId != 0) + { + roleIds = await _userBasicDao.GetUserRoleIds(userId); + } + + // 数据存在 对比权限 + if (options.RoleIds.Count == 0) + { + // 不需要权限 直接返回 + return APIResponseModel.CreateSuccessResponseModel(_mapper.Map(options)); + } + else + { + // 需要判断权限 判断 roleIds 是不是有权限在 options.RoleIds 里面 + bool hasPermission = false; + foreach (var roleId in roleIds) + { + if (options.RoleIds.Contains(roleId)) + { + hasPermission = true; + break; + } + } + if (!hasPermission) + { + return APIResponseModel.CreateErrorResponseModel(ResponseCode.NotPermissionAction); + } + else + { + return APIResponseModel.CreateSuccessResponseModel(_mapper.Map(options)); + } + } + } + catch (Exception ex) + { + return APIResponseModel.CreateErrorResponseModel(ResponseCode.SystemError, ex.Message); + } + } + + #endregion + + #region 获取指定的数据项 + internal async Task>> ModifyOptionsByKey(string key, ModifyOptionByKeyModel model, long userId) + { + try + { + bool isAdminOrSuperAdmin = await _userBasicDao.CheckUserIsAdminOrSuperAdmin(userId); + // 判断type 和 category 是不是在enum中 + + // 判断分类是不是在对应的enum里面 + if (!Enum.IsDefined(typeof(OptionCategory), model.Category)) + { + return APIResponseModel.CreateErrorResponseModel(ResponseCode.ParameterError, "该分类不存在"); + } + + if (!Enum.IsDefined(typeof(OptionTypeEnum), model.Type)) + { + return APIResponseModel.CreateErrorResponseModel(ResponseCode.ParameterError, "该类型不存在"); + } + + // 判断用户是不是管理员 + if (!isAdminOrSuperAdmin) + { + return APIResponseModel.CreateErrorResponseModel(ResponseCode.NotPermissionAction); + } + Options? options = await _context.Options.FirstOrDefaultAsync(x => x.Key == key); + if (options == null) + { + return APIResponseModel.CreateErrorResponseModel(ResponseCode.FindOptionsFail); + } + + List ids = []; + // 判断所有的roleId是不是都存在 + if (model.RoleNames != null && model.RoleNames.Count > 0) + { + foreach (var roleId in model.RoleNames) + { + Role? role = await _roleManager.FindByNameAsync(roleId.ToString()); + if (role == null) + { + return APIResponseModel.CreateErrorResponseModel(ResponseCode.ParameterError, "角色列表中有部分ID不存在"); + } + ids.Add(role.Id); + } + } + + // 开始修改配置项 + options.Value = model.Value; + options.RoleIds = ids; + options.Type = model.Type; + options.Category = model.Category; + _context.Options.Update(options); + await _context.SaveChangesAsync(); + return APIResponseModel.CreateSuccessResponseModel("修改成功"); + } + catch (Exception ex) + { + return APIResponseModel.CreateErrorResponseModel(ResponseCode.SystemError, ex.Message); + } + } + + #endregion + + #region 查询数据信息的集合 + + /// + /// 查询数据信息的集合 + /// + /// + /// + /// + /// + /// + /// + /// + /// + public async Task>>> QueryOptionCollection(int page, int pageSize, string? key, int? type, int? category, string[]? roleNames, long userId) + { + try + { + bool isAdminOrSuperAdmin = await _userBasicDao.CheckUserIsAdminOrSuperAdmin(userId); + // 判断用户是不是管理员 + if (!isAdminOrSuperAdmin) + { + return APIResponseModel>.CreateErrorResponseModel(ResponseCode.NotPermissionAction); + } + IQueryable query = _context.Options; + if (!string.IsNullOrWhiteSpace(key)) + { + query = query.Where(x => x.Key.Contains(key)); + } + + if (type != null) + { + if (!Enum.IsDefined(typeof(OptionTypeEnum), type)) + { + return APIResponseModel>.CreateErrorResponseModel(ResponseCode.ParameterError, "该类型不存在"); + } + query = query.Where(x => x.Type == (OptionTypeEnum)type); + } + + if (category != null) + { + if (!Enum.IsDefined(typeof(OptionCategory), category)) + { + return APIResponseModel>.CreateErrorResponseModel(ResponseCode.ParameterError, "该分类不存在"); + } + query = query.Where(x => x.Category == (OptionCategory)category); + } + + List ids = []; + if (roleNames != null && roleNames.Length > 0) + { + // 判断所有的roleId是不是都存在 + foreach (var roleId in roleNames) + { + Role? role = await _roleManager.FindByNameAsync(roleId.ToString()); + if (role != null) + { + ids.Add(role.Id); + } + } + } + if (ids.Count > 0) + { + var predicate = PredicateBuilder.New(false); + foreach (var roleId in ids) + { + var localId = roleId; // 闭包捕获 + predicate = predicate.Or(x => EF.Functions.JsonContains(x.RoleIds, localId.ToString())); + // 如果你的 RoleIds 存数字,localId.ToString(),否则加引号 + // predicate = predicate.Or(x => EF.Functions.JsonContains(x.RoleIds, $"\"{localId}\"")); + } + query = query.Where(predicate); + } + + // 查询总数 + int total = await query.CountAsync(); + + // 创建时间倒叙 + query = query.OrderByDescending(x => x.CreatedTime); + + // 分页 + query = query.Skip((page - 1) * pageSize).Take(pageSize); + + + + List? options = await query.ToListAsync(); + List roles = await _context.Roles.ToListAsync(); + List optionDtos = new List(); + foreach (var option in options) + { + OptionSimpleDto optionDto = new() + { + Key = option.Key, + Value = option.Value, + Type = option.Type, + Category = option.Category, + RoleNames = option.RoleIds.Select(x => roles.FirstOrDefault(r => r.Id == x)).Where(r => r != null).Select(r => r.Name).ToList() + }; + optionDtos.Add(optionDto); + } + + + return APIResponseModel>.CreateSuccessResponseModel(new CollectionResponse + { + Total = total, + Collection = optionDtos, + Current = page + }); + } + catch (Exception ex) + { + return APIResponseModel>.CreateErrorResponseModel(ResponseCode.SystemError, ex.Message); + } + } + + #endregion + + #region 新增指定的数据项 + public async Task>> AddOptions(AddOptionModel option, long userId) + { + try + { + bool isSuperAdmin = await _userBasicDao.CheckUserIsSuperAdmin(userId); + + if (!isSuperAdmin) + { + return APIResponseModel.CreateErrorResponseModel(ResponseCode.NotPermissionAction); + } + // 判断type 和 category 是不是在enum中 + + // 判断分类是不是在对应的enum里面 + if (!Enum.IsDefined(typeof(OptionCategory), option.Category)) + { + return APIResponseModel.CreateErrorResponseModel(ResponseCode.ParameterError, "该分类不存在"); + } + + if (!Enum.IsDefined(typeof(OptionTypeEnum), option.Type)) + { + return APIResponseModel.CreateErrorResponseModel(ResponseCode.ParameterError, "该类型不存在"); + } + + List ids = []; + // 判断所有的roleId是不是都存在 + if (option.RoleNames != null && option.RoleNames.Count > 0) + { + foreach (var roleId in option.RoleNames) + { + Role? role = await _roleManager.FindByNameAsync(roleId.ToString()); + if (role == null) + { + return APIResponseModel.CreateErrorResponseModel(ResponseCode.ParameterError, "角色列表中有部分ID不存在"); + } + ids.Add(role.Id); + } + } + // 判断当前的key是不是已经存在 + Options? options = await _context.Options.FirstOrDefaultAsync(x => x.Key == option.Key && x.Category == option.Category); + if (options != null) + { + return APIResponseModel.CreateErrorResponseModel(ResponseCode.ParameterError, "当前分类的key已经存在"); + } + if (string.IsNullOrWhiteSpace(option.Value)) + { + option.Value = string.Empty; + } + + Options options1 = new() + { + Key = option.Key, + Value = option.Value, + Type = option.Type, + Category = option.Category, + RoleIds = ids, + CreatedTime = BeijingTimeExtension.GetBeijingTime() + }; + // 添加数据 + await _context.Options.AddAsync(options1); + await _context.SaveChangesAsync(); + return APIResponseModel.CreateSuccessResponseModel("添加成功"); + } + catch (Exception ex) + { + return APIResponseModel.CreateErrorResponseModel(ResponseCode.SystemError, ex.Message); + } + } + + #endregion + + #region 删除指定的key的数据 + /// + /// 删除指定的数据 + /// + /// + /// + /// + /// + public async Task>> DeleteOptionsByKey(int category, string key, long userId) + { + try + { + var isSuperAdmin = await _userBasicDao.CheckUserIsSuperAdmin(userId); + // 判断用户是不是管理员 + if (!isSuperAdmin) + { + return APIResponseModel.CreateErrorResponseModel(ResponseCode.NotPermissionAction); + } + Options? options = await _context.Options.FirstOrDefaultAsync(x => x.Key == key && x.Category == (OptionCategory)category); + if (options == null) + { + return APIResponseModel.CreateErrorResponseModel(ResponseCode.FindOptionsFail); + } + // 删除数据 + _context.Options.Remove(options); + await _context.SaveChangesAsync(); + return APIResponseModel.CreateSuccessResponseModel("删除成功"); + } + catch (Exception ex) + { + return APIResponseModel.CreateErrorResponseModel(ResponseCode.SystemError, ex.Message); + } + } + + #endregion + + #region 管理员获取完整数据 + internal async Task>> GetAllMessageOptionsByKey(int category, string optionsKey, long userId) + { + try + { + bool isAdminOrSuperAdmin = await _userBasicDao.CheckUserIsAdminOrSuperAdmin(userId); + // 判断用户是不是管理员 + if (!isAdminOrSuperAdmin) + { + return APIResponseModel.CreateErrorResponseModel(ResponseCode.NotPermissionAction); + } + // 判断分类是不是在对应的enum里面 + if (!Enum.IsDefined(typeof(OptionCategory), category)) + { + return APIResponseModel.CreateErrorResponseModel(ResponseCode.ParameterError, "该分类不存在"); + } + + Options? options = await _context.Options.FirstOrDefaultAsync(x => x.Key == optionsKey && (OptionCategory)category == x.Category) ?? throw new Exception("数据不存在"); + + OptionSimpleDto optionSimpleDto = new() + { + Key = options.Key, + Value = options.Value, + Type = options.Type, + Category = options.Category, + RoleNames = options.RoleIds.Select(x => _roleManager.Roles.FirstOrDefault(r => r.Id == x)).Where(r => r != null).Select(r => r.Name).ToList() + }; + // 不需要权限 直接返回 + return APIResponseModel.CreateSuccessResponseModel(optionSimpleDto); + + + } + catch (Exception ex) + { + return APIResponseModel.CreateErrorResponseModel(ResponseCode.SystemError, ex.Message); + } + } + #endregion + } } diff --git a/LMS.service/Service/UserService/LoginService.cs b/LMS.service/Service/UserService/LoginService.cs index 17f2174..c03e62d 100644 --- a/LMS.service/Service/UserService/LoginService.cs +++ b/LMS.service/Service/UserService/LoginService.cs @@ -63,9 +63,9 @@ namespace LMS.service.Service.UserService //设置Token的过期时间 - //DateTime expires = DateTime.Now.AddHours(hours); + DateTime expires = DateTime.Now.AddHours(hours); // 设置过期时间为三分钟 - DateTime expires = DateTime.Now.AddMinutes(3); + //DateTime expires = DateTime.Now.AddMinutes(3); byte[] secBytes = Encoding.UTF8.GetBytes(key); var secKey = new SymmetricSecurityKey(secBytes); diff --git a/LMS.service/appsettings.json b/LMS.service/appsettings.json index eca1a1c..604b119 100644 --- a/LMS.service/appsettings.json +++ b/LMS.service/appsettings.json @@ -68,6 +68,6 @@ } ] }, - "Version": "1.0.9", + "Version": "1.1.0", "AllowedHosts": "*" }