解决文件本地上传报错问题,速率限制独立配置文件,解决通知公告修改删除报错,nlog增加速率限制日志文件写入,增加业务单号模块,生成业务单号工具类,IIS部署用web.config
This commit is contained in:
parent
5174fc9ec0
commit
99d2ebcbe8
@ -17,6 +17,8 @@
|
||||
<PackageReference Include="Microsoft.Extensions.DependencyModel" Version="7.0.0" />
|
||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
|
||||
<PackageReference Include="RulesEngine" Version="5.0.2" />
|
||||
<PackageReference Include="SqlSugar.IOC" Version="2.0.0" />
|
||||
<PackageReference Include="SqlSugarCoreNoDrive" Version="5.1.4.109" />
|
||||
<PackageReference Include="UAParser" Version="3.1.47" />
|
||||
<PackageReference Include="IPTools.China" Version="1.6.0" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="7.0.7" />
|
||||
|
||||
@ -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");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -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
|
||||
|
||||
45
ZR.Admin.WebApi/Controllers/System/BaseCodeRuleController.cs
Normal file
45
ZR.Admin.WebApi/Controllers/System/BaseCodeRuleController.cs
Normal file
@ -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<IActionResult> AddBaseCodeRule([FromBody] BaseCodeRule baseCodeRule)
|
||||
{
|
||||
var result = await _baseCodeRuleService.InsertBaseCodeRuleAsync(baseCodeRule);
|
||||
return SUCCESS(result);
|
||||
}
|
||||
|
||||
[HttpDelete("deleteBaseCodeRule/{code}")]
|
||||
public async Task<IActionResult> DeleteBaseCodeRule(string code)
|
||||
{
|
||||
var result = await _baseCodeRuleService.DeleteBaseCodeRuleAsync(code);
|
||||
return SUCCESS(result);
|
||||
}
|
||||
|
||||
[HttpPut("updateBaseCodeRule")]
|
||||
public async Task<IActionResult> 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);
|
||||
}
|
||||
}
|
||||
@ -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
|
||||
{
|
||||
|
||||
@ -22,12 +22,12 @@ namespace ZR.Admin.WebApi.Controllers.System
|
||||
/// <summary>
|
||||
/// 通知公告表接口
|
||||
/// </summary>
|
||||
private readonly ISysNoticeService _SysNoticeService;
|
||||
private readonly ISysNoticeService _sysNoticeService;
|
||||
private readonly IHubContext<MessageHub> _hubContext;
|
||||
|
||||
public SysNoticeController(ISysNoticeService SysNoticeService, IHubContext<MessageHub> hubContext)
|
||||
public SysNoticeController(ISysNoticeService sysNoticeService, IHubContext<MessageHub> hubContext)
|
||||
{
|
||||
_SysNoticeService = SysNoticeService;
|
||||
_sysNoticeService = sysNoticeService;
|
||||
_hubContext = hubContext;
|
||||
}
|
||||
|
||||
@ -41,7 +41,7 @@ namespace ZR.Admin.WebApi.Controllers.System
|
||||
var predicate = Expressionable.Create<SysNotice>();
|
||||
|
||||
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<SysNotice> response = _SysNoticeService.GetPageList(parm);
|
||||
PagedInfo<SysNotice> response = _sysNoticeService.GetPageList(parm);
|
||||
return SUCCESS(response);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查询通知公告表详情
|
||||
/// </summary>
|
||||
/// <param name="NoticeId"></param>
|
||||
/// <param name="noticeId"></param>
|
||||
/// <returns></returns>
|
||||
[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<SysNotice>(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
|
||||
/// 发送通知公告表
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[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);
|
||||
}
|
||||
|
||||
@ -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 });
|
||||
|
||||
47
ZR.Admin.WebApi/IpRateLimitConfig.json
Normal file
47
ZR.Admin.WebApi/IpRateLimitConfig.json
Normal file
@ -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": [
|
||||
]
|
||||
}
|
||||
}
|
||||
@ -71,7 +71,18 @@
|
||||
<!--写入黑洞-->
|
||||
<target name="blackhole" xsi:type="Null" />
|
||||
|
||||
<target name="ipRateLimit" xsi:type="ColoredConsole" useDefaultRowHighlightingRules="false"
|
||||
<target name="ipRateLimitFile" xsi:type="File"
|
||||
fileName="${basedir}/adminlogs/ipratelimit.txt"
|
||||
archiveFileName="${basedir}/adminlogs/bak/ipratelimit/ipratelimit{###}.txt"
|
||||
archiveEvery="Day"
|
||||
archiveNumbering="DateAndSequence"
|
||||
archiveAboveSize="20000000"
|
||||
maxArchiveFiles="30"
|
||||
keepFileOpen="false"
|
||||
layout="${date:format=MM-dd HH\:mm\:ss} | ${aspnet-request-url} ${newline} ${message}"
|
||||
/>
|
||||
<!-- 速率限制日志写入控制台 -->
|
||||
<target name="consoleIpRateLimit" xsi:type="ColoredConsole" useDefaultRowHighlightingRules="false"
|
||||
layout="${date:format=MM-dd HH\:mm\:ss} | ${aspnet-request-url} ${newline} ${message}">
|
||||
<highlight-row condition="level == LogLevel.Info" foregroundColor="Blue" />
|
||||
</target>
|
||||
@ -88,7 +99,7 @@
|
||||
<logger name="*.SqlSugar.SqlSugarSetup" final="true" writeTo="consoleSql,sqlfile"/>
|
||||
<logger name="*" minLevel="Trace" writeTo="allfile" />
|
||||
<logger name="*.GlobalExceptionMiddleware" final="true" writeTo="consoleSql,errorfile"/>
|
||||
<logger name="ZR.Admin.WebApi.Middleware.CustomIpRateLimitMiddleware" final="true" writeTo="ipRateLimit" />
|
||||
<logger name="ZR.Admin.WebApi.Middleware.CustomIpRateLimitMiddleware" final="true" writeTo="consoleIpRateLimit,ipRateLimitFile" />
|
||||
<!--Skip non-critical Microsoft logs and so log only own logs-->
|
||||
<logger name="Microsoft.*,Quartz.Core.QuartzSchedulerThread" maxlevel="Info" final="true" />
|
||||
</rules>
|
||||
|
||||
@ -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"));
|
||||
|
||||
@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
18
ZR.Admin.WebApi/web.config
Normal file
18
ZR.Admin.WebApi/web.config
Normal file
@ -0,0 +1,18 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<configuration>
|
||||
<location path="." inheritInChildApplications="false">
|
||||
<system.webServer>
|
||||
<handlers>
|
||||
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
|
||||
</handlers>
|
||||
<aspNetCore processPath="dotnet" arguments=".\ZR.Admin.WebApi.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="inprocess" />
|
||||
</system.webServer>
|
||||
</location>
|
||||
<system.webServer>
|
||||
<security>
|
||||
<requestFiltering>
|
||||
<requestLimits maxQueryString="2097151" maxAllowedContentLength="1073741824" />
|
||||
</requestFiltering>
|
||||
</security>
|
||||
</system.webServer>
|
||||
</configuration>
|
||||
269
ZR.Common/IdUtils.cs
Normal file
269
ZR.Common/IdUtils.cs
Normal file
@ -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<string>("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<CodeRule>()
|
||||
.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<CodeRule>()
|
||||
.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
|
||||
{
|
||||
/// <summary>
|
||||
/// 代码
|
||||
/// </summary>
|
||||
[SugarColumn(IsPrimaryKey = true)]
|
||||
public string Code { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 名称
|
||||
/// </summary>
|
||||
public string Name { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 类型
|
||||
/// </summary>
|
||||
public string Type { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 前缀
|
||||
/// </summary>
|
||||
public string Prefix { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 宽度
|
||||
/// </summary>
|
||||
public int Width { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 初始值
|
||||
/// </summary>
|
||||
public int IniVal { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 增量
|
||||
/// </summary>
|
||||
public int Step { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 终止值
|
||||
/// </summary>
|
||||
public int? FinishVal { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 循环
|
||||
/// </summary>
|
||||
public int Cycle { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 后缀
|
||||
/// </summary>
|
||||
public string Sufix { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 分隔符
|
||||
/// </summary>
|
||||
public string JoinChar { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 填充符
|
||||
/// </summary>
|
||||
public string FillChar { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 类型值
|
||||
/// </summary>
|
||||
public string TypeVal { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 循环号
|
||||
/// </summary>
|
||||
public int? CycleVal { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 当前值
|
||||
/// </summary>
|
||||
public int? CurrVal { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 版本号
|
||||
/// </summary>
|
||||
public int Version { get; set; }
|
||||
}
|
||||
@ -12,7 +12,5 @@
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Mapster" Version="7.3.0" />
|
||||
<PackageReference Include="MySqlConnector" Version="2.2.6" />
|
||||
<PackageReference Include="SqlSugar.IOC" Version="2.0.0" />
|
||||
<PackageReference Include="SqlSugarCoreNoDrive" Version="5.1.4.109" />
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
|
||||
89
ZR.ServiceCore/Model/BaseCodeRule.cs
Normal file
89
ZR.ServiceCore/Model/BaseCodeRule.cs
Normal file
@ -0,0 +1,89 @@
|
||||
namespace ZR.Model.System;
|
||||
/// <summary>
|
||||
/// 编码规则表
|
||||
/// </summary>
|
||||
[SugarTable("base_coderule")]
|
||||
[Tenant("0")]
|
||||
public class BaseCodeRule
|
||||
{
|
||||
/// <summary>
|
||||
/// 代码
|
||||
/// </summary>
|
||||
[SugarColumn(IsPrimaryKey = true)]
|
||||
public string Code { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 名称
|
||||
/// </summary>
|
||||
public string Name { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 类型
|
||||
/// </summary>
|
||||
public string Type { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 前缀
|
||||
/// </summary>
|
||||
public string Prefix { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 宽度
|
||||
/// </summary>
|
||||
public int Width { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 初始值
|
||||
/// </summary>
|
||||
public int IniVal { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 增量
|
||||
/// </summary>
|
||||
public int Step { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 终止值
|
||||
/// </summary>
|
||||
public int FinishVal { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 循环
|
||||
/// </summary>
|
||||
public int Cycle { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 后缀
|
||||
/// </summary>
|
||||
public string Sufix { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 分隔符
|
||||
/// </summary>
|
||||
public string JoinChar { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 填充符
|
||||
/// </summary>
|
||||
public string FillChar { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 类型值
|
||||
/// </summary>
|
||||
public string TypeVal { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 循环号
|
||||
/// </summary>
|
||||
public int CycleVal { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 当前值
|
||||
/// </summary>
|
||||
public int CurrVal { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 版本号
|
||||
/// </summary>
|
||||
public int Version { get; set; }
|
||||
}
|
||||
@ -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; }
|
||||
}
|
||||
|
||||
|
||||
@ -39,9 +39,13 @@
|
||||
/// </summary>
|
||||
public string FileExt { get; set; }
|
||||
/// <summary>
|
||||
/// 创建人
|
||||
/// 创建者
|
||||
/// </summary>
|
||||
public string Create_by { get; set; }
|
||||
public long Create_by { get; set; }
|
||||
/// <summary>
|
||||
/// 创建者名称
|
||||
/// </summary>
|
||||
public string Create_name { get; set; }
|
||||
/// <summary>
|
||||
/// 上传时间
|
||||
/// </summary>
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
33
ZR.ServiceCore/Services/BaseCodeRuleService.cs
Normal file
33
ZR.ServiceCore/Services/BaseCodeRuleService.cs
Normal file
@ -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<BaseCodeRule>, IBaseCodeRuleService
|
||||
{
|
||||
public Task<int> InsertBaseCodeRuleAsync(BaseCodeRule baseCodeRule)
|
||||
{
|
||||
return Insertable(baseCodeRule).ExecuteCommandAsync();
|
||||
}
|
||||
|
||||
public Task<int> DeleteBaseCodeRuleAsync(string code)
|
||||
{
|
||||
return Deleteable().Where(m => m.Code == code).ExecuteCommandAsync();
|
||||
}
|
||||
|
||||
public Task<int> UpdateBaseCodeRule(BaseCodeRule baseCodeRule)
|
||||
{
|
||||
return Updateable(baseCodeRule).ExecuteCommandAsync();
|
||||
}
|
||||
|
||||
public PagedInfo<BaseCodeRule> SelectBaseCodeRulePage(BaseCodeRule baseCodeRule, PagerInfo pager)
|
||||
{
|
||||
var exp = Expressionable.Create<BaseCodeRule>();
|
||||
return GetPages(exp.ToExpression(), pager);
|
||||
}
|
||||
}
|
||||
16
ZR.ServiceCore/Services/IService/IBaseCodeRuleService.cs
Normal file
16
ZR.ServiceCore/Services/IService/IBaseCodeRuleService.cs
Normal file
@ -0,0 +1,16 @@
|
||||
using ZR.Model;
|
||||
using ZR.Model.System;
|
||||
using ZR.Service;
|
||||
|
||||
namespace ZR.ServiceCore.Services.IService;
|
||||
|
||||
public interface IBaseCodeRuleService : IBaseService<BaseCodeRule>
|
||||
{
|
||||
public Task<int> InsertBaseCodeRuleAsync(BaseCodeRule baseCodeRule);
|
||||
|
||||
public Task<int> DeleteBaseCodeRuleAsync(string code);
|
||||
|
||||
public Task<int> UpdateBaseCodeRule(BaseCodeRule baseCodeRule);
|
||||
|
||||
public PagedInfo<BaseCodeRule> SelectBaseCodeRulePage(BaseCodeRule baseCodeRule, PagerInfo pager);
|
||||
}
|
||||
@ -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<SysFile>
|
||||
{
|
||||
@ -19,7 +17,8 @@ namespace ZR.Service.System.IService
|
||||
/// <param name="rootPath"></param>
|
||||
/// <param name="userName"></param>
|
||||
/// <returns>文件对象</returns>
|
||||
Task<SysFile> SaveFileToLocal(string rootPath, string fileName, string fileDir, string userName, IFormFile formFile, string uploadUrl);
|
||||
Task<SysFile> SaveFileToLocal(string rootPath, string fileName, string fileDir, long userId, string userName,
|
||||
IFormFile formFile, string uploadUrl);
|
||||
|
||||
Task<SysFile> SaveFileToAliyun(SysFile file, IFormFile formFile);
|
||||
/// <summary>
|
||||
|
||||
@ -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
|
||||
{
|
||||
/// <summary>
|
||||
/// 文件管理
|
||||
@ -38,7 +39,8 @@ namespace ZR.Service.System
|
||||
/// <param name="formFile">上传的文件流</param>
|
||||
/// <param name="userName"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<SysFile> SaveFileToLocal(string rootPath, string fileName, string fileDir, string userName, IFormFile formFile, string uploadUrl)
|
||||
public async Task<SysFile> 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,
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user