diff --git a/Infrastructure/ZR.Infrastructure.csproj b/Infrastructure/ZR.Infrastructure.csproj index ac986db..869ca58 100644 --- a/Infrastructure/ZR.Infrastructure.csproj +++ b/Infrastructure/ZR.Infrastructure.csproj @@ -17,6 +17,8 @@ + + diff --git a/ZR.Admin.WebApi/Controllers/CommonController.cs b/ZR.Admin.WebApi/Controllers/CommonController.cs index 785b620..9d621bd 100644 --- a/ZR.Admin.WebApi/Controllers/CommonController.cs +++ b/ZR.Admin.WebApi/Controllers/CommonController.cs @@ -1,5 +1,7 @@ using System.Net; using System.Net.Sockets; +using Infrastructure.Helper; +using JinianNet.JNTemplate; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Options; using Newtonsoft.Json; @@ -9,6 +11,7 @@ using ZR.Service.IService; using ZR.Service.System; using ZR.Service.System.IService; using ZR.ServiceCore.Model; +using ZR.ServiceCore.Services.IService; namespace ZR.Admin.WebApi.Controllers { @@ -47,8 +50,11 @@ namespace ZR.Admin.WebApi.Controllers [HttpGet] public IActionResult Index() { - return Ok("看到这里页面说明你已经成功启动了本项目:)\n\n" + - "如果觉得项目有用,打赏作者喝杯咖啡作为奖励\n☛☛http://www.izhaorui.cn/doc/support.html\n"); + var contentTpl = JnHelper.ReadTemplate("", "logo.txt"); + var content = contentTpl?.Render(); + // return Ok("看到这里页面说明你已经成功启动了本项目:)\n\n" + + // $"{content}如果觉得项目有用,打赏作者喝杯咖啡作为奖励\n☛☛http://www.izhaorui.cn/doc/support.html\n"); + return Ok($"{content}\n\n看到这里页面说明你已经成功启动了本项目:)\n"); } /// @@ -160,7 +166,7 @@ namespace ZR.Admin.WebApi.Controllers uploadDto.FileDir = OptionsSetting.Upload.LocalSavePath; } file = await SysFileService.SaveFileToLocal(savePath, uploadDto.FileName, uploadDto.FileDir, - HttpContext.GetName(), formFile, scheme + serverIP); + HttpContext.GetUId(), HttpContext.GetName(), formFile, scheme + serverIP); break; case StoreType.REMOTE: break; @@ -174,7 +180,8 @@ namespace ZR.Admin.WebApi.Controllers { return ToResponse(ResultCode.CUSTOM_ERROR, "上传文件过大,不能超过 " + AlimaxContentLength + " MB"); } - file = new(formFile.FileName, uploadDto.FileName, fileExt, fileSize + "kb", uploadDto.FileDir, HttpContext.GetName()) + file = new(formFile.FileName, uploadDto.FileName, fileExt, fileSize + "kb", + uploadDto.FileDir, HttpContext.GetUId(), HttpContext.GetName()) { StoreType = (int)StoreType.ALIYUN, FileType = formFile.ContentType diff --git a/ZR.Admin.WebApi/Controllers/System/BaseCodeRuleController.cs b/ZR.Admin.WebApi/Controllers/System/BaseCodeRuleController.cs new file mode 100644 index 0000000..347ab91 --- /dev/null +++ b/ZR.Admin.WebApi/Controllers/System/BaseCodeRuleController.cs @@ -0,0 +1,45 @@ +using ZR.Model; +using ZR.Model.System; +using ZR.ServiceCore.Services.IService; + +namespace ZR.Admin.WebApi.Controllers.System; +[Route("base/codeRule")] +public class BaseCodeRuleController : BaseController +{ + private static readonly NLog.Logger Logger = NLog.LogManager.GetCurrentClassLogger(); + + private readonly IBaseCodeRuleService _baseCodeRuleService; + + public BaseCodeRuleController(IBaseCodeRuleService baseCodeRuleService) + { + _baseCodeRuleService = baseCodeRuleService; + } + + [HttpPost("addBaseCodeRule")] + public async Task AddBaseCodeRule([FromBody] BaseCodeRule baseCodeRule) + { + var result = await _baseCodeRuleService.InsertBaseCodeRuleAsync(baseCodeRule); + return SUCCESS(result); + } + + [HttpDelete("deleteBaseCodeRule/{code}")] + public async Task DeleteBaseCodeRule(string code) + { + var result = await _baseCodeRuleService.DeleteBaseCodeRuleAsync(code); + return SUCCESS(result); + } + + [HttpPut("updateBaseCodeRule")] + public async Task UpdateBaseCodeRule([FromBody] BaseCodeRule baseCodeRule) + { + var result = await _baseCodeRuleService.UpdateBaseCodeRule(baseCodeRule); + return SUCCESS(result); + } + + [HttpGet("getBaseCodeRuleList")] + public IActionResult GetBaseCodeRuleList([FromQuery] BaseCodeRule baseCodeRule, [FromQuery] PagerInfo pagerInfo) + { + var result = _baseCodeRuleService.SelectBaseCodeRulePage(baseCodeRule, pagerInfo); + return SUCCESS(result); + } +} \ No newline at end of file diff --git a/ZR.Admin.WebApi/Controllers/System/SysFileController.cs b/ZR.Admin.WebApi/Controllers/System/SysFileController.cs index 4c29154..dd22b6f 100644 --- a/ZR.Admin.WebApi/Controllers/System/SysFileController.cs +++ b/ZR.Admin.WebApi/Controllers/System/SysFileController.cs @@ -5,6 +5,7 @@ using ZR.Model.System; using ZR.Service.System.IService; using ZR.ServiceCore.Model; using ZR.ServiceCore.Model.Dto; +using ZR.ServiceCore.Services.IService; namespace ZR.Admin.WebApi.Controllers { diff --git a/ZR.Admin.WebApi/Controllers/System/SysNoticeController.cs b/ZR.Admin.WebApi/Controllers/System/SysNoticeController.cs index 72f364d..fe71832 100644 --- a/ZR.Admin.WebApi/Controllers/System/SysNoticeController.cs +++ b/ZR.Admin.WebApi/Controllers/System/SysNoticeController.cs @@ -22,12 +22,12 @@ namespace ZR.Admin.WebApi.Controllers.System /// /// 通知公告表接口 /// - private readonly ISysNoticeService _SysNoticeService; + private readonly ISysNoticeService _sysNoticeService; private readonly IHubContext _hubContext; - public SysNoticeController(ISysNoticeService SysNoticeService, IHubContext hubContext) + public SysNoticeController(ISysNoticeService sysNoticeService, IHubContext hubContext) { - _SysNoticeService = SysNoticeService; + _sysNoticeService = sysNoticeService; _hubContext = hubContext; } @@ -41,7 +41,7 @@ namespace ZR.Admin.WebApi.Controllers.System var predicate = Expressionable.Create(); predicate = predicate.And(m => m.Status == 0); - var response = _SysNoticeService.GetPages(predicate.ToExpression(), parm); + var response = _sysNoticeService.GetPages(predicate.ToExpression(), parm); return SUCCESS(response); } @@ -53,19 +53,19 @@ namespace ZR.Admin.WebApi.Controllers.System [ActionPermissionFilter(Permission = "system:notice:list")] public IActionResult QuerySysNotice([FromQuery] SysNoticeQueryDto parm) { - PagedInfo response = _SysNoticeService.GetPageList(parm); + PagedInfo response = _sysNoticeService.GetPageList(parm); return SUCCESS(response); } /// /// 查询通知公告表详情 /// - /// + /// /// - [HttpGet("{NoticeId}")] - public IActionResult GetSysNotice(int NoticeId) + [HttpGet("{noticeId}")] + public IActionResult GetSysNotice(long noticeId) { - var response = _SysNoticeService.GetFirst(x => x.NoticeId == NoticeId); + var response = _sysNoticeService.GetFirst(x => x.NoticeId == noticeId); return SUCCESS(response); } @@ -95,7 +95,7 @@ namespace ZR.Admin.WebApi.Controllers.System // it.Create_time // }); - var result = _SysNoticeService.Insertable(modal).ExecuteReturnSnowflakeId(); + var result = _sysNoticeService.Insertable(modal).ExecuteReturnSnowflakeId(); return SUCCESS(result); } @@ -114,7 +114,7 @@ namespace ZR.Admin.WebApi.Controllers.System .Map(dest => dest.NoticeId, src => src.NoticeId.ParseToLong()); var model = parm.Adapt(config).ToUpdate(HttpContext); - var response = _SysNoticeService.Update(w => w.NoticeId == model.NoticeId, it => new SysNotice() + var response = _sysNoticeService.Update(w => w.NoticeId == model.NoticeId, it => new SysNotice() { NoticeTitle = model.NoticeTitle, NoticeType = model.NoticeType, @@ -132,16 +132,16 @@ namespace ZR.Admin.WebApi.Controllers.System /// 发送通知公告表 /// /// - [HttpPut("send/{NoticeId}")] + [HttpPut("send/{noticeId}")] [ActionPermissionFilter(Permission = "system:notice:update")] [Log(Title = "发送通知公告", BusinessType = BusinessType.OTHER)] - public IActionResult SendNotice(long NoticeId = 0) + public IActionResult SendNotice(long noticeId = 0) { - if (NoticeId <= 0) + if (noticeId <= 0) { throw new CustomException("请求实体不能为空"); } - var response = _SysNoticeService.GetFirst(x => x.NoticeId == NoticeId); + var response = _sysNoticeService.GetFirst(x => x.NoticeId == noticeId); if (response != null && response.Status == 0) { _hubContext.Clients.All.SendAsync(HubsConstant.ReceiveNotice, response.NoticeTitle, response.NoticeContent); @@ -158,10 +158,10 @@ namespace ZR.Admin.WebApi.Controllers.System [Log(Title = "通知公告", BusinessType = BusinessType.DELETE)] public IActionResult DeleteSysNotice(string ids) { - int[] idsArr = Tools.SpitIntArrary(ids); + var idsArr = Tools.SpitLongArrary(ids); if (idsArr.Length <= 0) { return ToResponse(ApiResult.Error($"删除失败Id 不能为空")); } - var response = _SysNoticeService.Delete(idsArr); + var response = _sysNoticeService.Delete(idsArr); return SUCCESS(response); } diff --git a/ZR.Admin.WebApi/Controllers/System/SysProfileController.cs b/ZR.Admin.WebApi/Controllers/System/SysProfileController.cs index eb70c5c..252d985 100644 --- a/ZR.Admin.WebApi/Controllers/System/SysProfileController.cs +++ b/ZR.Admin.WebApi/Controllers/System/SysProfileController.cs @@ -6,6 +6,7 @@ using ZR.Model.System; using ZR.Service.System.IService; using ZR.ServiceCore.Model; using ZR.ServiceCore.Model.Dto; +using ZR.ServiceCore.Services.IService; namespace ZR.Admin.WebApi.Controllers.System { @@ -133,7 +134,7 @@ namespace ZR.Admin.WebApi.Controllers.System } var file = await FileService.SaveFileToLocal(hostEnvironment.WebRootPath, "", "avatar", - HttpContext.GetName(), formFile, serverIP); + HttpContext.GetUId(), HttpContext.GetName(), formFile, serverIP); UserService.UpdatePhoto(new SysUser() { Avatar = file.AccessUrl, UserId = userId }); return SUCCESS(new { imgUrl = file.AccessUrl }); diff --git a/ZR.Admin.WebApi/IpRateLimitConfig.json b/ZR.Admin.WebApi/IpRateLimitConfig.json new file mode 100644 index 0000000..c18ae7f --- /dev/null +++ b/ZR.Admin.WebApi/IpRateLimitConfig.json @@ -0,0 +1,47 @@ +{ + //接口请求限制 + "IpRateLimiting": { + "EnableEndpointRateLimiting": true, + "StackBlockedRequests": false, + "RealIpHeader": "X-Real-IP", + "ClientIdHeader": "X-ClientId", + "HttpStatusCode": 429, + "EndpointWhitelist": [ + "post:/system/dict/data/types", + "*:/msghub/negotiate", + "*:/LogOut", + "*:/common/uploadfile", + "post:/aim/msg/list/sendmsg" + ], + "QuotaExceededResponse": { + "Content": "{{\"code\":429,\"msg\":\"访问过于频繁,请稍后重试\"}}", + "ContentType": "application/json", + "StatusCode": 429 + }, + // "IpWhitelist": [ "127.0.0.1", "::1/10", "192.168.0.0/24" ], + //通用规则,api规则,结尾一定要带* + "GeneralRules": [ + { + "Endpoint": "*:/captchaImage", + //时间段,格式:{数字}{单位};可使用单位:s, m, h, d + "Period": "3s", + "Limit": 5 + }, + { + "Endpoint": "((post)|(put)):*", + "Period": "3s", + "Limit": 1 + }, + { + "Endpoint": "*:/aim/msg/list/SendMsg", + "Period": "1s", + "Limit": 0, + } + ] + }, + "IpRateLimitPolicies": { + //ip规则 + "IpRules": [ + ] + } +} \ No newline at end of file diff --git a/ZR.Admin.WebApi/NLog.config b/ZR.Admin.WebApi/NLog.config index 92b8eba..c633162 100644 --- a/ZR.Admin.WebApi/NLog.config +++ b/ZR.Admin.WebApi/NLog.config @@ -71,7 +71,18 @@ - + + @@ -88,7 +99,7 @@ - + diff --git a/ZR.Admin.WebApi/Program.cs b/ZR.Admin.WebApi/Program.cs index 557fba5..8685327 100644 --- a/ZR.Admin.WebApi/Program.cs +++ b/ZR.Admin.WebApi/Program.cs @@ -19,6 +19,9 @@ using IpRateLimitPolicy = AspNetCoreRateLimit.IpRateLimitPolicy; var builder = WebApplication.CreateBuilder(args); +//load json config by ipRateLimit +builder.Configuration.AddJsonFile("IpRateLimitConfig.json", true, true); + //load json config by loginVerify builder.Configuration.AddJsonFile("loginVerifyConf.json", true, true); @@ -38,7 +41,7 @@ builder.Services.AddCors(builder.Configuration); // Grpc builder.Services.AddGrpc(); // 显示logo -// builder.Services.AddLogo(); +builder.Services.AddLogo(); //消除Error unprotecting the session cookie警告 builder.Services.AddDataProtection() .PersistKeysToFileSystem(new DirectoryInfo(Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar + "DataProtection")); diff --git a/ZR.Admin.WebApi/appsettings.json b/ZR.Admin.WebApi/appsettings.json index ae1d6e5..04f0c9e 100644 --- a/ZR.Admin.WebApi/appsettings.json +++ b/ZR.Admin.WebApi/appsettings.json @@ -103,35 +103,9 @@ "RedisServer": { "open": 1, //是否启用redis "Cache": "8.140.174.251:6379,password=Wyd210213,defaultDatabase=0,poolsize=50,ssl=false,writeBuffer=10240,prefix=cache:", +// "Cache": "127.0.0.1:6379,password=Wyd210213,defaultDatabase=0,poolsize=50,ssl=false,writeBuffer=10240,prefix=cache:", "Session": "8.140.174.251:6379,password=Wyd210213,defaultDatabase=0,poolsize=50,ssl=false,writeBuffer=10240,prefix=session:" - }, - //接口请求限制 - "IpRateLimiting": { - "EnableEndpointRateLimiting": true, - "StackBlockedRequests": false, - "RealIpHeader": "X-Real-IP", - "ClientIdHeader": "X-ClientId", - "HttpStatusCode": 429, - "EndpointWhitelist": [ "post:/system/dict/data/types", "*:/msghub/negotiate", "*:/LogOut", "*:/common/uploadfile", "*:/VerifyScan" ], - "QuotaExceededResponse": { - "Content": "{{\"code\":429,\"msg\":\"访问过于频繁,请稍后重试\"}}", - "ContentType": "application/json", - "StatusCode": 429 - }, - //通用规则,api规则,结尾一定要带* - "GeneralRules": [ - { - "Endpoint": "*:/captchaImage", - //时间段,格式:{数字}{单位};可使用单位:s, m, h, d - "Period": "3s", - "Limit": 5 - }, - { - "Endpoint": "((post)|(put)):*", - "Period": "3s", - "Limit": 1 - } - ] +// "Session": "127.0.0.1:6379,password=Wyd210213,defaultDatabase=0,poolsize=50,ssl=false,writeBuffer=10240,prefix=session:" }, //验证码配置 "CaptchaOptions": { @@ -147,5 +121,8 @@ "BubbleCount": 3, // 气泡数量 "BubbleThickness": 1.0 // 气泡边沿厚度 } + }, + "GrpcUrls": { + "FindTeacher": "http://localhost:5212" } } diff --git a/ZR.Admin.WebApi/web.config b/ZR.Admin.WebApi/web.config new file mode 100644 index 0000000..435c2a3 --- /dev/null +++ b/ZR.Admin.WebApi/web.config @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ZR.Common/IdUtils.cs b/ZR.Common/IdUtils.cs new file mode 100644 index 0000000..4aa8ccd --- /dev/null +++ b/ZR.Common/IdUtils.cs @@ -0,0 +1,269 @@ +using System; +using SqlSugar; +using SqlSugar.IOC; + +namespace ZR.Common; + +public static class IdUtils +{ + // public static string GetSerialNumber(string code) + // { + // var vCode = new SugarParameter("@v_code", code); + // var vSerialNumber = new SugarParameter("@v_serialnumber", null, true); + // vSerialNumber.DbType = System.Data.DbType.String; + // //TODO 会抛异常 + // DbScoped.SugarScope.GetConnectionScope(0).CopyNew().Ado.UseStoredProcedure() + // .GetDataTable("p_get_serialnumber", vCode, vSerialNumber); + // // .SqlQuerySingle("p_get_serialnumber", vCode, vSerialNumber); + // Console.WriteLine(vSerialNumber.Value.ToString()); + // return vSerialNumber.Value.ToString(); + // } + + public static string GetSerialNumber(string code) + { + var serialNumber = string.Empty; + + var tmpVal = string.Empty; + var resStr = string.Empty; + // var sp = string.Empty; + // 当前值(加1) + int? nextValue = 0; + // 目标值(加cnt) + int? destValue = 0; + // 循环值 + int? cycleValue = 0; + // 系统类型值 + var sysTypeValue = string.Empty; + // 类型值 + var typeValue = string.Empty; + + using var db = DbScoped.SugarScope.GetConnectionScope("0"); + try + { + db.Ado.BeginTran(); + var codeRule = db.Queryable() + .TranLock(DbLockType.Wait) + .First(it => it.Code == code); + if (codeRule.CurrVal == 0) + { + nextValue = codeRule.IniVal; + } + else + { + nextValue = codeRule.CurrVal + codeRule.Step; + } + + // cycleValue = codeRule.CycleVal; + typeValue = codeRule.TypeVal; + + cycleValue = codeRule.CycleVal ?? 1; + + switch (codeRule.Type) + { + case "YYYY": + sysTypeValue = DateTime.Now.ToString("yyyy"); + break; + case "YYYYMM": + sysTypeValue = DateTime.Now.ToString("yyyyMM"); + break; + case "YYYYMMDD": + sysTypeValue = DateTime.Now.ToString("yyyyMMdd"); + break; + default: + sysTypeValue = " "; + break; + } + + // 循环类型值改变,初始化类型循环 + if (string.IsNullOrWhiteSpace(sysTypeValue) != string.IsNullOrWhiteSpace(typeValue)) + { + typeValue = sysTypeValue; + cycleValue = 1; + nextValue = codeRule.IniVal; + } + + // 检查是否达到最大值,当达到最大值时抛出异常 + if (codeRule.FinishVal != null) + { + if (codeRule.Cycle != 1) + { + // 不是循环,有循环不会引发最大值错误 + if (codeRule.Step > 0) + { + if (nextValue > codeRule.FinishVal) + { + serialNumber = "-1"; + } + } + else + { + if (nextValue < codeRule.FinishVal) + { + serialNumber = "-1"; + } + } + } + } + + destValue = nextValue; + + // 计算取值,如果非循环,数量不足时把剩下的取出返回,如果循环,则循环取 + + if (codeRule.FinishVal != null) + { + if (codeRule.Step > 0) + { + if (destValue > codeRule.FinishVal) + { + if (codeRule.Cycle == 1) + { + cycleValue = cycleValue + 1; + destValue = codeRule.IniVal; + } + else + { + + } + } + } + else + { + if (destValue < codeRule.FinishVal) + { + if (codeRule.Cycle == 1) + { + cycleValue = cycleValue + 1; + destValue = codeRule.IniVal; + } + else + { + + } + } + } + } + + // 生成值字符串,逗号分割 + tmpVal = $"{typeValue}{destValue.ToString().PadLeft(codeRule.Width, codeRule.FillChar[0])}"; + + if (!string.IsNullOrWhiteSpace(codeRule.Prefix)) + { + tmpVal = $"{codeRule.Prefix}{codeRule.JoinChar ?? string.Empty}{tmpVal}"; + } + + if (!string.IsNullOrWhiteSpace(codeRule.Sufix)) + { + tmpVal = $"{tmpVal}{codeRule.JoinChar ?? string.Empty}{codeRule.Sufix}"; + } + + resStr = tmpVal; + + serialNumber = resStr; + + var foundRows = db.Updateable() + .SetColumns(it => new CodeRule + { + TypeVal = typeValue, + CycleVal = cycleValue, + CurrVal = destValue, + Version = codeRule.Version + 1 + }) + .Where(it => it.Code == code && it.Version == codeRule.Version) + .ExecuteCommand(); + if (foundRows != 0) db.Ado.CommitTran(); + } + catch (Exception e) + { + // 没有对应更新行,说明被别人更新了,重新计算 + serialNumber = "-1"; + db.Ado.RollbackTran(); + throw; + } + return serialNumber; + } +} +[SugarTable("base_coderule")] +[Tenant("0")] +public class CodeRule +{ + /// + /// 代码 + /// + [SugarColumn(IsPrimaryKey = true)] + public string Code { get; set; } + + /// + /// 名称 + /// + public string Name { get; set; } + + /// + /// 类型 + /// + public string Type { get; set; } + + /// + /// 前缀 + /// + public string Prefix { get; set; } + + /// + /// 宽度 + /// + public int Width { get; set; } + + /// + /// 初始值 + /// + public int IniVal { get; set; } + + /// + /// 增量 + /// + public int Step { get; set; } + + /// + /// 终止值 + /// + public int? FinishVal { get; set; } + + /// + /// 循环 + /// + public int Cycle { get; set; } + + /// + /// 后缀 + /// + public string Sufix { get; set; } + + /// + /// 分隔符 + /// + public string JoinChar { get; set; } + + /// + /// 填充符 + /// + public string FillChar { get; set; } + + /// + /// 类型值 + /// + public string TypeVal { get; set; } + + /// + /// 循环号 + /// + public int? CycleVal { get; set; } + + /// + /// 当前值 + /// + public int? CurrVal { get; set; } + + /// + /// 版本号 + /// + public int Version { get; set; } +} \ No newline at end of file diff --git a/ZR.Repository/ZR.Repository.csproj b/ZR.Repository/ZR.Repository.csproj index 0f43c8c..0a69b22 100644 --- a/ZR.Repository/ZR.Repository.csproj +++ b/ZR.Repository/ZR.Repository.csproj @@ -12,7 +12,5 @@ - - diff --git a/ZR.ServiceCore/Model/BaseCodeRule.cs b/ZR.ServiceCore/Model/BaseCodeRule.cs new file mode 100644 index 0000000..0923382 --- /dev/null +++ b/ZR.ServiceCore/Model/BaseCodeRule.cs @@ -0,0 +1,89 @@ +namespace ZR.Model.System; +/// +/// 编码规则表 +/// +[SugarTable("base_coderule")] +[Tenant("0")] +public class BaseCodeRule +{ + /// + /// 代码 + /// + [SugarColumn(IsPrimaryKey = true)] + public string Code { get; set; } + + /// + /// 名称 + /// + public string Name { get; set; } + + /// + /// 类型 + /// + public string Type { get; set; } + + /// + /// 前缀 + /// + public string Prefix { get; set; } + + /// + /// 宽度 + /// + public int Width { get; set; } + + /// + /// 初始值 + /// + public int IniVal { get; set; } + + /// + /// 增量 + /// + public int Step { get; set; } + + /// + /// 终止值 + /// + public int FinishVal { get; set; } + + /// + /// 循环 + /// + public int Cycle { get; set; } + + /// + /// 后缀 + /// + public string Sufix { get; set; } + + /// + /// 分隔符 + /// + public string JoinChar { get; set; } + + /// + /// 填充符 + /// + public string FillChar { get; set; } + + /// + /// 类型值 + /// + public string TypeVal { get; set; } + + /// + /// 循环号 + /// + public int CycleVal { get; set; } + + /// + /// 当前值 + /// + public int CurrVal { get; set; } + + /// + /// 版本号 + /// + public int Version { get; set; } +} \ No newline at end of file diff --git a/ZR.ServiceCore/Model/Dto/SysNoticeDto.cs b/ZR.ServiceCore/Model/Dto/SysNoticeDto.cs index 5167320..01b9162 100644 --- a/ZR.ServiceCore/Model/Dto/SysNoticeDto.cs +++ b/ZR.ServiceCore/Model/Dto/SysNoticeDto.cs @@ -15,6 +15,7 @@ namespace ZR.ServiceCore.Model.Dto public string NoticeContent { get; set; } public int Status { get; set; } public string Remark { get; set; } + public string Create_name { get; set; } public DateTime Create_time { get; set; } } diff --git a/ZR.ServiceCore/Model/SysFile.cs b/ZR.ServiceCore/Model/SysFile.cs index 0f65979..8144663 100644 --- a/ZR.ServiceCore/Model/SysFile.cs +++ b/ZR.ServiceCore/Model/SysFile.cs @@ -39,9 +39,13 @@ /// public string FileExt { get; set; } /// - /// 创建人 + /// 创建者 /// - public string Create_by { get; set; } + public long Create_by { get; set; } + /// + /// 创建者名称 + /// + public string Create_name { get; set; } /// /// 上传时间 /// @@ -56,14 +60,16 @@ public string AccessUrl { get; set; } public SysFile() { } - public SysFile(string originFileName, string fileName, string ext, string fileSize, string storePath, string create_by) + public SysFile(string originFileName, string fileName, string ext, string fileSize, string storePath, + long createBy, string createName) { StorePath = storePath; RealName = originFileName; FileName = fileName; FileExt = ext; FileSize = fileSize; - Create_by = create_by; + Create_by = createBy; + Create_name = createName; Create_time = DateTime.Now; } } diff --git a/ZR.ServiceCore/Services/BaseCodeRuleService.cs b/ZR.ServiceCore/Services/BaseCodeRuleService.cs new file mode 100644 index 0000000..8229802 --- /dev/null +++ b/ZR.ServiceCore/Services/BaseCodeRuleService.cs @@ -0,0 +1,33 @@ +using Infrastructure.Attribute; +using ZR.Model; +using ZR.Model.System; +using ZR.Service; +using ZR.Service.System.IService; +using ZR.ServiceCore.Services.IService; + +namespace ZR.ServiceCore.Services; + +[AppService(ServiceType = typeof(IBaseCodeRuleService), ServiceLifetime = LifeTime.Transient)] +public class BaseCodeRuleService : BaseService, IBaseCodeRuleService +{ + public Task InsertBaseCodeRuleAsync(BaseCodeRule baseCodeRule) + { + return Insertable(baseCodeRule).ExecuteCommandAsync(); + } + + public Task DeleteBaseCodeRuleAsync(string code) + { + return Deleteable().Where(m => m.Code == code).ExecuteCommandAsync(); + } + + public Task UpdateBaseCodeRule(BaseCodeRule baseCodeRule) + { + return Updateable(baseCodeRule).ExecuteCommandAsync(); + } + + public PagedInfo SelectBaseCodeRulePage(BaseCodeRule baseCodeRule, PagerInfo pager) + { + var exp = Expressionable.Create(); + return GetPages(exp.ToExpression(), pager); + } +} \ No newline at end of file diff --git a/ZR.ServiceCore/Services/IService/IBaseCodeRuleService.cs b/ZR.ServiceCore/Services/IService/IBaseCodeRuleService.cs new file mode 100644 index 0000000..57dfa5f --- /dev/null +++ b/ZR.ServiceCore/Services/IService/IBaseCodeRuleService.cs @@ -0,0 +1,16 @@ +using ZR.Model; +using ZR.Model.System; +using ZR.Service; + +namespace ZR.ServiceCore.Services.IService; + +public interface IBaseCodeRuleService : IBaseService +{ + public Task InsertBaseCodeRuleAsync(BaseCodeRule baseCodeRule); + + public Task DeleteBaseCodeRuleAsync(string code); + + public Task UpdateBaseCodeRule(BaseCodeRule baseCodeRule); + + public PagedInfo SelectBaseCodeRulePage(BaseCodeRule baseCodeRule, PagerInfo pager); +} \ No newline at end of file diff --git a/ZR.ServiceCore/Services/IService/ISysFileService.cs b/ZR.ServiceCore/Services/IService/ISysFileService.cs index 6b59bb3..7fc4de9 100644 --- a/ZR.ServiceCore/Services/IService/ISysFileService.cs +++ b/ZR.ServiceCore/Services/IService/ISysFileService.cs @@ -1,10 +1,8 @@ -using Infrastructure.Attribute; -using Microsoft.AspNetCore.Http; -using System.Threading.Tasks; -using ZR.Model.System; +using Microsoft.AspNetCore.Http; +using ZR.Service; using ZR.ServiceCore.Model; -namespace ZR.Service.System.IService +namespace ZR.ServiceCore.Services.IService { public interface ISysFileService : IBaseService { @@ -19,7 +17,8 @@ namespace ZR.Service.System.IService /// /// /// 文件对象 - Task SaveFileToLocal(string rootPath, string fileName, string fileDir, string userName, IFormFile formFile, string uploadUrl); + Task SaveFileToLocal(string rootPath, string fileName, string fileDir, long userId, string userName, + IFormFile formFile, string uploadUrl); Task SaveFileToAliyun(SysFile file, IFormFile formFile); /// diff --git a/ZR.ServiceCore/Services/SysFileService.cs b/ZR.ServiceCore/Services/SysFileService.cs index 0c49caf..90a5330 100644 --- a/ZR.ServiceCore/Services/SysFileService.cs +++ b/ZR.ServiceCore/Services/SysFileService.cs @@ -1,18 +1,19 @@ -using Infrastructure; +using System.Net; +using System.Security.Cryptography; +using System.Text; +using Infrastructure; using Infrastructure.Attribute; using Infrastructure.Enums; using Infrastructure.Model; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Options; -using System.Net; -using System.Security.Cryptography; -using System.Text; using ZR.Common; -using ZR.Model.System; +using ZR.Service; using ZR.Service.System.IService; using ZR.ServiceCore.Model; +using ZR.ServiceCore.Services.IService; -namespace ZR.Service.System +namespace ZR.ServiceCore.Services { /// /// 文件管理 @@ -38,7 +39,8 @@ namespace ZR.Service.System /// 上传的文件流 /// /// - public async Task SaveFileToLocal(string rootPath, string fileName, string fileDir, string userName, IFormFile formFile, string uploadUrl) + public async Task SaveFileToLocal(string rootPath, string fileName, string fileDir, long userId, string userName, + IFormFile formFile, string uploadUrl) { string fileExt = Path.GetExtension(formFile.FileName); fileName = (fileName.IsEmpty() ? HashFileName() : fileName) + fileExt; @@ -58,7 +60,7 @@ namespace ZR.Service.System } // string uploadUrl = OptionsSetting.Upload.UploadUrl; string accessPath = string.Concat(uploadUrl, "/", filePath.Replace("\\", "/"), "/", fileName); - SysFile file = new(formFile.FileName, fileName, fileExt, fileSize + "kb", filePath, userName) + SysFile file = new(formFile.FileName, fileName, fileExt, fileSize + "kb", filePath, userId, userName) { StoreType = (int)StoreType.LOCAL, FileType = formFile.ContentType,