wet 2 years ago
parent 0606caee98
commit b32ba66dd7

@ -232,7 +232,7 @@ namespace djy.Service.Ams
List<string> houseid = dto.HouseDto.Select(x => x.GID).ToList();
DbBus.Get(DbList.AMSCenter).Delete<AMS_House>().Where(w => w.PID == master.GID && !houseid.Contains(w.GID)).ExecuteAffrows();
DbBus.Get(DbList.AMSCenter).Delete<AMS_Cntrno>().Where(w => w.PID == master.GID && !houseid.Contains(w.HID)).ExecuteAffrows();
DbBus.Get(DbList.AMSCenter).Delete<AMS_Cntrno>().Where(w => w.PID == master.GID).ExecuteAffrows();
foreach (var item in dto.HouseDto)
{
@ -263,37 +263,14 @@ namespace djy.Service.Ams
{
foreach (var it in item.CntrnoDto)
{
var cntrno = DbBus.Get(DbList.AMSCenter).Select<AMS_Cntrno>().Where(w => w.GID == it.GID).ToOne();
if (cntrno != null)
{
cntrno.CNTRNO = it.CNTRNO;
cntrno.SEALNO = it.SEALNO;
cntrno.CTNALL = it.CTNALL;
cntrno.HSCode = it.HSCode;
cntrno.ProductName = it.ProductName;
cntrno.MARKS = it.MARKS;
cntrno.PKGS = it.PKGS;
cntrno.KINDPKGS = it.KINDPKGS;
cntrno.KGS = it.KGS;
cntrno.CBM = it.CBM;
cntrno.DUNNO = it.DUNNO;
cntrno.LINKMAN = it.LINKMAN;
cntrno.KINDPKGSCode = it.KINDPKGSCode;
cntrno.OriginCountry = it.OriginCountry;
cntrno.OriginCountryCode = it.OriginCountryCode;
cntrno.LINKMANTel = it.LINKMANTel;
cntrno.DangerGrade = it.DangerGrade;
DbBus.Get(DbList.AMSCenter).Update<AMS_Cntrno>().SetSource(cntrno).ExecuteAffrows();
}
else
{
var cntrno = new AMS_Cntrno();
cntrno = it.MapTo<AMS_Cntrno>();
cntrno.GID = Guid.NewGuid().ToString("N");
cntrno.PID = master.GID;
cntrno.HID = house.GID;
cntrno.IsDel = false;
DbBus.Get(DbList.AMSCenter).Insert(cntrno).ExecuteAffrows();
}
}
}
}
@ -363,7 +340,7 @@ namespace djy.Service.Ams
master.LoadingPort = DbBus.Get(DbList.Common).Select<CodePortLoad>().Where(x => x.EdiCode == master.LoadingPortCode).ToList().Select(x => x.EnName).FirstOrDefault();
master.LastNoUsPort = DbBus.Get(DbList.Common).Select<CodePort>().Where(x => x.Code == master.LastNoUsPortCode).ToList().Select(x => x.EnName).FirstOrDefault();
DbBus.Get(DbList.AMSCenter).Update<AMS_Master>().SetSource(master).ExecuteAffrows();
DbBus.Get(DbList.AMSCenter).Delete<AMS_Cntrno>().Where(w => w.PID == master.GID).ExecuteAffrows();
List<string> houseid = dto.HouseDto.Select(x => x.GID).ToList();
foreach (var item in dto.HouseDto)
@ -394,36 +371,14 @@ namespace djy.Service.Ams
if (item.CntrnoDto != null && item.CntrnoDto.Count() > 0) {
foreach (var it in item.CntrnoDto)
{
var cntrno = DbBus.Get(DbList.AMSCenter).Select<AMS_Cntrno>().Where(w => w.GID == it.GID).ToOne();
if (cntrno != null)
{
cntrno.CNTRNO = it.CNTRNO;
cntrno.SEALNO = it.SEALNO;
cntrno.CTNALL = it.CTNALL;
cntrno.HSCode = it.HSCode;
cntrno.ProductName = it.ProductName;
cntrno.MARKS = it.MARKS;
cntrno.PKGS = it.PKGS;
cntrno.KINDPKGS = it.KINDPKGS;
cntrno.KGS = it.KGS;
cntrno.CBM = it.CBM;
cntrno.DUNNO = it.DUNNO;
cntrno.LINKMAN = it.LINKMAN;
cntrno.KINDPKGSCode= it.KINDPKGSCode;
cntrno.OriginCountry = it.OriginCountry;
cntrno.OriginCountryCode = it.OriginCountryCode;
cntrno.LINKMANTel = it.LINKMANTel;
cntrno.DangerGrade = it.DangerGrade;
DbBus.Get(DbList.AMSCenter).Update<AMS_Cntrno>().SetSource(cntrno).ExecuteAffrows();
}
else {
var cntrno = new AMS_Cntrno();
cntrno = it.MapTo<AMS_Cntrno>();
cntrno.GID = Guid.NewGuid().ToString("N");
cntrno.PID = master.GID;
cntrno.HID = house.GID;
cntrno.IsDel = false;
DbBus.Get(DbList.AMSCenter).Insert(cntrno).ExecuteAffrows();
}
}
}
}

@ -5,6 +5,6 @@ https://go.microsoft.com/fwlink/?LinkID=208121.
<Project>
<PropertyGroup>
<_PublishTargetUrl>C:\Project\DJYAMS\djyweb_ams\web\djy.WebApi\bin\Release\net5.0\publish\</_PublishTargetUrl>
<History>True|2022-07-14T09:10:22.0747703Z;True|2022-07-12T16:27:25.6510813+08:00;True|2022-07-12T16:05:05.4184759+08:00;True|2022-07-12T10:39:59.0985811+08:00;True|2022-07-12T10:33:46.3867816+08:00;True|2022-07-08T17:01:30.6693134+08:00;True|2022-07-08T12:06:36.3838761+08:00;True|2022-07-07T16:23:24.9970320+08:00;True|2022-07-07T16:13:59.0482365+08:00;True|2022-07-07T11:23:54.2426892+08:00;True|2022-07-05T16:20:17.0177653+08:00;True|2022-07-05T16:19:13.8760086+08:00;True|2022-07-05T11:23:47.7031600+08:00;</History>
<History>True|2022-07-19T09:20:07.4699599Z;True|2022-07-19T16:29:46.7683567+08:00;True|2022-07-19T15:11:18.0356950+08:00;True|2022-07-19T10:58:31.2175373+08:00;True|2022-07-14T17:10:22.0747703+08:00;True|2022-07-12T16:27:25.6510813+08:00;True|2022-07-12T16:05:05.4184759+08:00;True|2022-07-12T10:39:59.0985811+08:00;True|2022-07-12T10:33:46.3867816+08:00;True|2022-07-08T17:01:30.6693134+08:00;True|2022-07-08T12:06:36.3838761+08:00;True|2022-07-07T16:23:24.9970320+08:00;True|2022-07-07T16:13:59.0482365+08:00;True|2022-07-07T11:23:54.2426892+08:00;True|2022-07-05T16:20:17.0177653+08:00;True|2022-07-05T16:19:13.8760086+08:00;True|2022-07-05T11:23:47.7031600+08:00;</History>
</PropertyGroup>
</Project>

@ -39,7 +39,7 @@ namespace djy_Isfpi.Controllers.ISF
return result;
}
return ser.Load(request, user);
return ser.Load(request, user, aut);
}
#endregion

@ -5,6 +5,6 @@ https://go.microsoft.com/fwlink/?LinkID=208121.
<Project>
<PropertyGroup>
<_PublishTargetUrl>C:\Project\DJYAMS\djyweb_ams\web\djy_IsfApi\bin\Release\net5.0\publish\</_PublishTargetUrl>
<History>True|2022-07-12T08:28:26.6852287Z;True|2022-07-12T16:07:24.1013785+08:00;True|2022-07-05T11:48:21.5945057+08:00;True|2022-07-05T11:21:19.6041212+08:00;True|2022-07-05T11:19:11.9998954+08:00;</History>
<History>True|2022-07-19T03:08:32.9319219Z;False|2022-07-19T11:00:12.2993715+08:00;True|2022-07-12T16:28:26.6852287+08:00;True|2022-07-12T16:07:24.1013785+08:00;True|2022-07-05T11:48:21.5945057+08:00;True|2022-07-05T11:21:19.6041212+08:00;True|2022-07-05T11:19:11.9998954+08:00;</History>
</PropertyGroup>
</Project>

@ -0,0 +1,305 @@
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Reflection;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Common.DJYModel;
using Common.Extensions;
using Common.Tools;
using djy.IService.Djy;
using Common;
namespace djy_AmsApi.Controllers
{
/// <summary>
/// api接口基类
/// </summary>
[Route("api/[controller]")]
[ApiController]
[Authorize]
public class ApiBase : Controller
{
#region http数据获取
/// <summary>
/// 创建日志
/// </summary>
/// <param name="Message">内容</param>
/// <param name="GroupName"></param>
/// <param name="DataJson"></param>
/// <param name="ObjGid"></param>
/// <param name="ResultJson"></param>
protected void _LogsAdd(string Message, string GroupName = null, object DataJson = null, string ObjGid = null, object ResultJson = null)
{
var toolsserver = IOC.AddServer<IToolsService>();
toolsserver.LogsAdd(Message, GroupName, DataJson, ObjGid, ResultJson);
}
/// <summary>
/// 获取大简云设置权限
/// </summary>
/// <param name="KeyName">keyname标识</param>
/// <returns></returns>
protected DJyUserAuthorityDto GetDJyUserAuthority(string KeyName) {
var _djyserver = IOC.AddServer<IDjyUserService>();
var rs= _djyserver.GetUserAuthority(GetLoginId,KeyName);
if (rs.Status)
{
return rs.Data;
}
else {
return null;
}
}
/// <summary>
/// 获取登录详情信息
/// </summary>
/// <param name="UserGid"></param>
protected User GetUserInfo(Guid? UserGid = null)
{
var _suser = IOC.AddServer<IDjyUserService>();
if (UserGid == null)
{ UserGid = GetLoginId; }
var rs = _suser.GetUserInfo(UserGid.ToString());
if (rs.Status)
{
return rs.Data;
}
else
{ return null; }
}
/// <summary>
/// 统一获取大简云权限查询权限的userid companyid 没有权限则指定userid和companyid 为不存的guid值
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="BindData"></param>
/// <param name="KeyName">模块keyname标识</param>
/// <param name="type">0 查询查看权限 1 操作更新权限 默认 0</param>
/// <returns></returns>
protected UserAuthorityDto GetUserAuthorityToFormDto(string KeyName,int type=0 ) {
//本人的绑定UserId 全部 userid 和 compayid不做绑定 注册公司的 绑定 companyid 没有权限则指定userid和companyid 为不存的guid值
var RetrunData = new UserAuthorityDto();
var _djyserver = IOC.AddServer<IDjyUserService>();
User User;
User = null;
var uuid = GetLoginId.ToString();
var userrs = _djyserver.GetUserInfo(GetLoginId.ToString());
var notguid = Guid.Parse("00000000-0000-0000-0000-000000000001");
RetrunData.CompayId = null;
if (userrs.Status)
{
User = userrs.Data;
RetrunData.CompayId = Guid.Parse(User.CompId);
}
if (User == null)
{
RetrunData.UserId = notguid;
RetrunData.CompayId = notguid;
}
var aut = GetDJyUserAuthority(KeyName);
if (aut != null)
{//根据权限处理 _userid 和 _companyid 值
RetrunData.IsPower = true;
var _useraut= aut.Visiblerange;
if (type == 1) {
_useraut = aut.Operaterange;
}
switch (_useraut) {
case 0://全部
RetrunData.UserId = null;
RetrunData.CompayId = null;
break;
case 1://本公司
RetrunData.UserId = null;
RetrunData.CompayId = Guid.Parse(User.CompId);
break;
case 3://本人
RetrunData.UserId = GetLoginId;
RetrunData.CompayId = null;
break;
case 4://无权限或或默认权限
//_uerid = notguid;
//_companyid = notguid;
RetrunData.UserId = notguid;
RetrunData.CompayId = notguid;
RetrunData.IsPower = false;
break;
case 7://注册公司
RetrunData.UserId = null;
RetrunData.CompayId = Guid.Parse( User.CompId);
break;
default:
RetrunData.UserId = notguid;
RetrunData.CompayId = notguid;
break;
}
}
else
{
RetrunData.UserId = notguid;
RetrunData.CompayId = notguid;
RetrunData.IsPower = false;
}
//if (sysOptionConfig.Webconfig.IsDev)
//{
// RetrunData.UserId = null;
// RetrunData.CompayId =null;
// RetrunData.IsPower = true;
//}
return RetrunData;
}
/// <summary>
/// 获取登录Id
/// </summary>
protected Guid? GetLoginId { get { return Guid.Parse(GetClaimsValue("loginid")); } }
/// <summary>
/// 获取登录类型
/// </summary>
protected EnumUser.UserType GetLoginType
{
get
{
var type = GetClaimsValue("logintype");
if (type.Isint())
{
return (EnumUser.UserType)int.Parse(type);
}
else { return EnumUser.UserType.All; }
}
}
/// <summary>
/// 根据key获取claims值 没有则返回null
/// </summary>
/// <param name="Key"></param>
/// <param name="IsDecrtypt">是否是加密</param>
/// <returns></returns>
protected string GetClaimsValue(string Key, bool IsDecrtypt = true)
{
try
{
var claims = HttpContext.User.Claims;
var id = claims.SingleOrDefault(s => s.Type == Key);
if (id == null)
{
return "0";
}
return IsDecrtypt ? _DecryptDES(id.Value) : id.Value;
}
catch {
return null;
}
}
/// <summary>
/// DES解密
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
protected static string _DecryptDES(string value)
{
return SafeTools.DecryptDES(value, sysOptionConfig.Webconfig.DesKey);
}
#endregion
}
/// <summary>
///api接口基类
/// </summary>
/// <typeparam name="IS">接口类型比如 Iservice</typeparam>
public class ApiBase<IS> : ApiBase
{
/// <summary>
///
/// </summary>
protected IS _server = IOC.AddServer<IS>();
/// <summary>
/// 执行指定的方法
/// </summary>
/// <param name="methodName">方法名称</param>
/// <param name="parameters">参数对象队列</param>
/// <returns></returns>
protected object _InvokeServer(string methodName, object[] parameters)
{
return _server.GetType().GetMethod(methodName).Invoke(_server, parameters);
}
}
/// <summary>
/// api接口基类
/// </summary>
/// <typeparam name="IS">接口类型比如 Iservice</typeparam>
/// <typeparam name="D">Dto Model</typeparam>
/// <typeparam name="T">Tables数据表model</typeparam>
public class ApiBase<IS, D, T> : ApiBase<IS>
{
/// <summary>
/// 根据Id获取实体
/// </summary>
/// <param name="Id"></param>
/// <returns></returns>
protected virtual object _GetId(long Id)
{
return _InvokeServer("GetId", new object[] { Id });
}
/// <summary>
///基础的创建接口 提交创建对象
/// </summary>
/// <param name="Dto"></param>
/// <returns></returns>
protected virtual object _Add(T Dto)
{
return _InvokeServer("Add", new object[] { Dto });
}
/// <summary>
/// 最基础的更新接口 传递要更新的数据对象 必须有Id
/// </summary>
/// <param name="Dto"></param>
/// <returns></returns>
protected virtual object _Up(T Dto)
{
return _InvokeServer("Up", new object[] { Dto, null, null });
}
/// <summary>
/// 最基础的删除接口 [1,2,3]
/// </summary>
/// <param name="Idlist"></param>
/// <returns></returns>
protected virtual object _Del(long[] Idlist)
{
return _InvokeServer("Del", new object[] { Idlist });
}
}
}

@ -0,0 +1,65 @@
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.Json;
using System.Threading.Tasks;
using Common;
namespace djy_AmsApi
{
public class Exceptionfilter : ActionFilterAttribute,IExceptionFilter
{
public void OnException(ExceptionContext context)
{
var rs = new ReturnResult<object>();
var response = context.HttpContext.Response;
response.StatusCode = 200;
response.WriteAsync(JsonSerializer.Serialize(rs, new JsonSerializerOptions(JsonSerializerDefaults.Web))).ConfigureAwait(false);
}
//在Action执行之前由 MVC 框架调用。
public new void OnActionExecuting(ActionExecutingContext filterContext)
{
var rs = new ReturnResult<object>();
var response = filterContext.HttpContext.Response;
response.StatusCode = 200;
filterContext.Result = new BadRequestObjectResult(rs);
response.WriteAsync(JsonSerializer.Serialize(rs, new JsonSerializerOptions(JsonSerializerDefaults.Web))).ConfigureAwait(false);
}
//在Action执行之后由 MVC 框架调用。
public new void OnActionExecuted(ActionExecutedContext filterContext)
{
var rs = new ReturnResult<object>();
var response = filterContext.HttpContext.Response;
response.StatusCode = 200;
filterContext.Result = new BadRequestObjectResult(rs);
response.WriteAsync(JsonSerializer.Serialize(rs, new JsonSerializerOptions(JsonSerializerDefaults.Web))).ConfigureAwait(false);
}
//在执行Result之前由 MVC 框架调用。
public new void OnResultExecuting(ResultExecutingContext filterContext)
{
var rs = new ReturnResult<object>();
var response = filterContext.HttpContext.Response;
response.StatusCode = 200;
filterContext.Result = new BadRequestObjectResult(rs);
response.WriteAsync(JsonSerializer.Serialize(rs, new JsonSerializerOptions(JsonSerializerDefaults.Web))).ConfigureAwait(false);
}
//在执行Result后由 MVC 框架调用。
public new void OnResultExecuted(ResultExecutedContext filterContext)
{
var rs = new ReturnResult<object>();
var response = filterContext.HttpContext.Response;
response.StatusCode = 200;
response.WriteAsync(JsonSerializer.Serialize(rs, new JsonSerializerOptions(JsonSerializerDefaults.Web))).ConfigureAwait(false);
}
}
}

@ -0,0 +1,18 @@
using Hangfire.Annotations;
using Hangfire.Dashboard;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace djy_AmsApi
{
public class HangFireAuthorizeFilter : IDashboardAuthorizationFilter
{
public bool Authorize([NotNull] DashboardContext context)
{
//var httpcontext = context.GetHttpContext();
//return httpcontext.User.Identity.IsAuthenticated;
return true;
}
}
}

@ -0,0 +1,35 @@
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc.Filters;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.Json;
using System.Threading.Tasks;
using Common;
namespace djy_AmsApi
{
public class HttpResponseExceptionFilter : IActionFilter, IOrderedFilter
{
public int Order { get; } = int.MaxValue - 10;
public void OnActionExecuted(ActionExecutedContext context)
{
var rs = new ReturnResult<object>();
var response = context.HttpContext.Response;
response.StatusCode = 200;
response.WriteAsync(JsonSerializer.Serialize(rs, new JsonSerializerOptions(JsonSerializerDefaults.Web))).ConfigureAwait(false);
}
public void OnActionExecuting(ActionExecutingContext context)
{
var rs = new ReturnResult<object>();
var response = context.HttpContext.Response;
response.StatusCode = 200;
response.WriteAsync(JsonSerializer.Serialize(rs, new JsonSerializerOptions(JsonSerializerDefaults.Web))).ConfigureAwait(false);
}
}
}

@ -0,0 +1,31 @@
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace djy_AmsApi
{
/// <summary>
/// Ioc封装
/// </summary>
public class IOC
{
/// <summary>
/// IServiceCollection 对象
/// </summary>
public static IServiceCollection container { get; set; }
/// <summary>
/// ICo模式实例化
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public static T AddServer<T>()
{
ServiceProvider provider = container.BuildServiceProvider();
return provider.GetService<T>();
}
}
}

@ -0,0 +1,139 @@
using Microsoft.AspNetCore.Http;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text.Json;
using System.Threading.Tasks;
using Common;
using Common.Tools;
namespace djy_AmsApi
{
/*
使 startup Configure
app.UseMiddleware<MytMiddleware>();
*/
/// <summary>
/// 访问管道
/// </summary>
public class MytMiddleware
{
/// <summary>
///
/// </summary>
private readonly RequestDelegate next;
public MytMiddleware(RequestDelegate next)
{
this.next = next;
}
/// <summary>
///
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
public async Task Invoke(HttpContext context)
{
try
{
await next(context);
}
catch (Exception ex)
{
await HandleExceptionAsync(context, ex);
}
finally
{
var statuscode = context.Response.StatusCode;
var h = context.Response.HasStarted;
ReturnResult<string> rr = new ReturnResult<string>();
if (statuscode == 401|| statuscode == 400)
{
//页面的状态码 根据需求调整是否修改
switch (statuscode)
{
case 400:
rr.Message = "请求错误!";
rr.Code = 400;
break;
case 401:
rr.Message = "授权验证失败或已过期,请重新登录";
rr.Code = 401;
break;
}
rr.Status = false;
var response = context.Response;
try
{ response.StatusCode = 200; }
catch (Exception ex) {
var msg = ex.Message;
}
response.ContentType = "application/json";
await response.WriteAsync(JsonSerializer.Serialize(rr, new JsonSerializerOptions(JsonSerializerDefaults.Web))).ConfigureAwait(false);
}
}
}
/// <summary>
///
/// </summary>
/// <param name="context"></param>
/// <param name="exception"></param>
/// <returns></returns>
private static async Task HandleExceptionAsync(HttpContext context, Exception exception)
{
if (exception == null) return;
await WriteExceptionAsync(context, exception).ConfigureAwait(false);
}
/// <summary>
///
/// </summary>
/// <param name="context"></param>
/// <param name="exception"></param>
/// <returns></returns>
private static async Task WriteExceptionAsync(HttpContext context, Exception exception)
{
//记录日志
//返回友好的提示
var response = context.Response;
//状态码
if (exception is UnauthorizedAccessException)
response.StatusCode = (int)HttpStatusCode.Unauthorized;
else if (exception is Exception)
response.StatusCode = (int)HttpStatusCode.BadRequest;
response.ContentType = context.Request.Headers["Accept"];
response.StatusCode = 200;
string msg = string.Format("内部错误:{0}", exception.GetBaseException().Message);
try
{
var json = JsonSerializer.Serialize(exception.GetBaseException());
Tools.ServerWarnMessageErr(msg + " " + json);
}
catch { }
ReturnResult<string> rr = new ReturnResult<string>();
rr.Code = 400;
rr.Status = false;
rr.Message = msg;
rr.Data = rr.Message;
response.ContentType = "application/json";
await response.WriteAsync(JsonSerializer.Serialize(rr, new JsonSerializerOptions(JsonSerializerDefaults.Web))).ConfigureAwait(false);
}
}
}

@ -0,0 +1,42 @@
using djy_AmsApi;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using NLog.Web;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace djy_AmsApi
{
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
}).ConfigureAppConfiguration((ctx, builder) => {
if (ctx.HostingEnvironment.EnvironmentName == Microsoft.AspNetCore.Hosting.EnvironmentName.Production)
{
builder.AddJsonFile("appsettings.json");
}
else
{
builder.AddJsonFile("appsettings.Development.json");
}
}).ConfigureLogging(logging => { //NlogÈÕÖ¾
logging.ClearProviders();
logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace);
logging.AddConsole();
}).UseNLog();
}
}

@ -0,0 +1,37 @@
{
"$schema": "http://json.schemastore.org/launchsettings.json",
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:5002",
"sslPort": 0
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"launchUrl": "swagger/index.html",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"djy_AmsApi": {
"commandName": "Project",
"launchBrowser": true,
"launchUrl": "swagger/index.html",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
"applicationUrl": "http://localhost:5000",
"dotnetRunMessages": "true"
},
"Docker": {
"commandName": "Docker",
"launchBrowser": true,
"launchUrl": "{Scheme}://{ServiceHost}:{ServicePort}/swagger",
"publishAllPorts": true
}
}
}

@ -0,0 +1,184 @@
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.IdentityModel.Logging;
using Microsoft.OpenApi.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Common;
using System.Reflection;
using System.IO;
using Hangfire;
using System.Net.Mime;
using AutoMapper;
using djy_AmsApi;
using djy.Service;
using Common.Extensions;
using djy.Service.DjyService;
using djy.IService.Djy;
namespace djy_AmsApi
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
/// <summary>
///
/// </summary>
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers().ConfigureApiBehaviorOptions(options => {
options.InvalidModelStateResponseFactory = context =>
{
var result = new BadRequestObjectResult(context.HttpContext);
return result;
};
});
services.AddHttpClient();
//读取配置信息
Configuration.Bind("WebConfig", sysOptionConfig.Webconfig);
sysOptionConfig._Configuration = Configuration;
services.AddAuthentication("Bearer").AddJwtBearer("Bearer", option => {
option.Authority = sysOptionConfig.Webconfig.IdentServerUrl;//授权服务的URl地址
option.RequireHttpsMetadata = false;//是否使用了https
option.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters
{ ValidateAudience = false };
IdentityModelEventSource.ShowPII = true;
});
//初始化数据库连接池
DbContext.DbBusInit();
////批量循环依赖注册
var ISList = Assembly.Load("djy.IService").GetTypes().Where(w => w.Name.EndsWith("Service") && w.Name.StartsWith("I"));
var Slist = Assembly.Load("djy.Service").GetTypes().Where(w => w.Name.EndsWith("Service"));
foreach (var Is in ISList)
{
var sname = Slist.FirstOrDefault(w => w.Name == Is.Name.Substring(1));
if (sname != null)
{
services.AddTransient(Is, sname);
}
}
//automapper
services.AddAutoMapper(typeof(AutoMapperConfig));
//任务配置
services.AddHangfire(config => {
config.UseRedisStorage(sysOptionConfig.Webconfig.Redis, new Hangfire.Redis.RedisStorageOptions { Prefix = "hf_" + sysOptionConfig.Webconfig.WebName, InvisibilityTimeout = TimeSpan.FromHours(1) });
});
services.AddHangfireServer();
//CAP 消息队列总线
if (sysOptionConfig.Webconfig.Rbmq_Host.IsNotNull())
{
services.AddCap(x =>
{
x.UseSqlServer(sysOptionConfig.Webconfig.Rbmq_Sqlhost);
x.UseRabbitMQ(options =>
{
var _host = sysOptionConfig.Webconfig.Rbmq_Host.Split(':');
options.HostName = _host[0];
if (_host.Length == 2)
{
options.Port = int.Parse(_host[1]);
}
options.UserName = sysOptionConfig.Webconfig.Rbmq_UserName;
options.Password = sysOptionConfig.Webconfig.Rbmq_Password;
});
x.UseDashboard();
});
}
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo { Title = "djy_AmsApi", Version = "v1" });
var basePath = Path.GetDirectoryName(typeof(Program).Assembly.Location);
var xmlPath = Path.Combine(basePath, "AppServer.xml");
});
//初始化IOC
IOC.container = services;
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
//swagger
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseSwagger();
app.UseSwaggerUI(c => {
c.SwaggerEndpoint("/swagger/v1/swagger.json", "djy_AmsApi v1");
// c.RoutePrefix = "apidoc";
});
}
app.UseMiddleware<MytMiddleware>();//管道
app.UseRouting();
DefaultFilesOptions defaultFiles = new DefaultFilesOptions();
defaultFiles.DefaultFileNames.Clear();
defaultFiles.DefaultFileNames.Add("index.html");
app.UseDefaultFiles(defaultFiles);
app.UseStaticFiles();
app.UseCors(builder => {
builder.AllowAnyHeader();
builder.AllowAnyMethod();
//builder.WithOrigins("http://www.baidu.com");//跨域配置
builder.AllowAnyOrigin();
});
app.UseAuthentication();//认证
app.UseAuthorization();//授权
app.UseHangfireDashboard("/job", new DashboardOptions() { Authorization = new[] { new HangFireAuthorizeFilter() } });
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
//启动运行启动
//_Job(env);
}
/// <summary>
/// 启动任务请求
/// </summary>
private void _Job(IWebHostEnvironment env)
{
//初始化数据字典
var _itool = IOC.AddServer<IToolsService>();
// _itool.bindConfigDict(true, 5);
_itool.AutoJob();
}
}
}

@ -0,0 +1,71 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
"WebConfig": {
"IdentServerUrl": "http://123.234.225.158:35101",
"WebId": 234,
"IsDev": true,
"Area": "山东省|青岛市|市南区",
"DesKey": "2Fv6I7oV6AlCFEbN",
"jwt_Audience": "admin",
"jwt_Issuer": "shuosoft",
"jwt_Secretkey": "IBFoxBpwAW2rSDIsYiHJL5aZ3Rpr5Uaph4t6Eqm2Fv6I7oV6AlCFEbNWRXyJT653iOFIbWOcOF3sMRSSUelRSbIL6RzOCOfIk3hhxyn9Aj4HxEE08zqlRloA0CWX7MQ0",
"jwt_Expiration": 1440,
"StrFilte": "肏,妈妈,操你妈,草泥马,屌,傻逼,骚逼,王八蛋,你妈的,+,=,-,_,/,*,&,@,.,,,*",
"ShopPower": 1,
"ConnName": "sqldb",
"cache_time": 10,
"WebHostUrl": "https://zh-userapi.jingyiji.net",
"Redis": "192.168.0.80:6379",
"RedisDb": 2,
"Rbmq_Host": "127.0.0.1:13666",
"Rbmq_UserName": "djy_paas",
"Rbmq_Password": "123qwe",
"Rbmq_Sqlhost": "Data Source =192.168.1.205,1433; Initial Catalog=TestDjyLogs; Persist Security Info=True; User ID =test; Password=test123;pooling=true",
"DapperDbString": "Data Source =123.234.225.158,28000; Initial Catalog=DevAMS; Persist Security Info=True; User ID =dev; Password=dev123;pooling=true;",
"DataConnList": [
{
"SysKey": "AMS",
"TitleName": "AMS",
"Index": 100,
"DataType": 1,
"Status": 0,
"ConnString": "Data Source =123.234.225.158,28000; Initial Catalog=DevAMS; Persist Security Info=True; User ID =dev; Password=dev123;pooling=true;"
},
{
"SysKey": "Common",
"TitleName": "Common",
"Index": 100,
"DataType": 1,
"Status": 0,
"ConnString": "Data Source =123.234.225.158,28000; Initial Catalog=DevCommonDB; Persist Security Info=True; User ID =dev; Password=dev123;pooling=true;"
},
{
"SysKey": "djydb",
"TitleName": "pingtai",
"Index": 100,
"DataType": 1,
"Status": 0,
"ConnString": "Data Source =123.234.225.158,28000; Initial Catalog=DevDsPingTai; Persist Security Info=True; User ID =dev; Password=dev123;pooling=true"
},
{
"SysKey": "logsdb",
"TitleName": "日志库",
"Index": 100,
"DataType": 1,
"Status": 0,
"ConnString": "Data Source =123.234.225.158,28000; Initial Catalog=TestDjyLogs; Persist Security Info=True; User ID =test; Password=test123;pooling=true"
}
]
}
}

@ -0,0 +1,73 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
"WebConfig": {
"IdentServerUrl": "http://djy-identity.myshipping.net",
"WebId": 234,
"Area": "山东省|青岛市|市南区",
"DesKey": "2Fv6I7oV6AlCFEbN",
"jwt_Audience": "admin",
"jwt_Issuer": "shuosoft",
"jwt_Secretkey": "IBFoxBpwAW2rSDIsYiHJL5aZ3Rpr5Uaph4t6Eqm2Fv6I7oV6AlCFEbNWRXyJT653iOFIbWOcOF3sMRSSUelRSbIL6RzOCOfIk3hhxyn9Aj4HxEE08zqlRloA0CWX7MQ0",
"jwt_Expiration": 1440,
"StrFilte": "肏,妈妈,操你妈,草泥马,屌,傻逼,骚逼,王八蛋,你妈的,+,=,-,_,/,*,&,@,.,,,*",
"ShopPower": 1,
"ConnName": "sqldb",
"cache_time": 10,
"WebHostUrl": "https://zh-userapi.jingyiji.net",
"Redis": "172.1.0.2:6379",
"RedisDb": 0,
"Rbmq_Host": "172.1.0.3:5672",
"Rbmq_UserName": "admin",
"Rbmq_Password": "admin",
"Rbmq_Sqlhost": "Data Source =172.31.85.154; Initial Catalog=djy_logs; Persist Security Info=True; User ID =sa; Password=QDdjy#2020*;pooling=true",
"DapperDbString": "Data Source =123.234.225.158,28000; Initial Catalog=DevAMS; Persist Security Info=True; User ID =dev; Password=dev123;pooling=true;",
"requesterDea": "nbforwarder",
"DataConnList": [
{
"SysKey": "AMS",
"TitleName": "AMS",
"Index": 100,
"DataType": 1,
"Status": 0,
"ConnString": "Data Source =123.234.225.158,28000; Initial Catalog=DevAMS; Persist Security Info=True; User ID =dev; Password=dev123;pooling=true;"
},
{
"SysKey": "Common",
"TitleName": "Common",
"Index": 100,
"DataType": 1,
"Status": 0,
"ConnString": "Data Source =123.234.225.158,28000; Initial Catalog=DevCommonDB; Persist Security Info=True; User ID =dev; Password=dev123;pooling=true;"
},
{
"SysKey": "djydb",
"TitleName": "pingtai",
"Index": 100,
"DataType": 1,
"Status": 0,
"ConnString": "Data Source =123.234.225.158,28000; Initial Catalog=DevDsPingTai; Persist Security Info=True; User ID =dev; Password=dev123;pooling=true"
},
{
"SysKey": "logsdb",
"TitleName": "日志库",
"Index": 100,
"DataType": 1,
"Status": 0,
"ConnString": "Data Source =172.31.85.154,1433; Initial Catalog=djy_logs; Persist Security Info=True; User ID =sa; Password=QDdjy#2020*;pooling=true"
}
]
}
}

@ -0,0 +1,21 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="IdentityServer4.AccessTokenValidation" Version="3.0.1" />
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.14.0" />
<PackageReference Include="NLog.Web.AspNetCore" Version="4.12.0" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="5.6.3" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Djy.Common\Common.csproj" />
<ProjectReference Include="..\djy.IService\djy.IService.csproj" />
<ProjectReference Include="..\djy.Model\djy.Model.csproj" />
<ProjectReference Include="..\djy.Service\djy.Service.csproj" />
</ItemGroup>
</Project>

@ -0,0 +1,71 @@
/* Please see documentation at https://docs.microsoft.com/aspnet/core/client-side/bundling-and-minification
for details on configuring this project to bundle and minify static web assets. */
a.navbar-brand {
white-space: normal;
text-align: center;
word-break: break-all;
}
/* Provide sufficient contrast against white background */
a {
color: #0366d6;
}
.btn-primary {
color: #fff;
background-color: #1b6ec2;
border-color: #1861ac;
}
.nav-pills .nav-link.active, .nav-pills .show > .nav-link {
color: #fff;
background-color: #1b6ec2;
border-color: #1861ac;
}
/* Sticky footer styles
-------------------------------------------------- */
html {
font-size: 14px;
}
@media (min-width: 768px) {
html {
font-size: 16px;
}
}
.border-top {
border-top: 1px solid #e5e5e5;
}
.border-bottom {
border-bottom: 1px solid #e5e5e5;
}
.box-shadow {
box-shadow: 0 .25rem .75rem rgba(0, 0, 0, .05);
}
button.accept-policy {
font-size: 1rem;
line-height: inherit;
}
/* Sticky footer styles
-------------------------------------------------- */
html {
position: relative;
min-height: 100%;
}
body {
/* Margin bottom by footer height */
margin-bottom: 60px;
}
.footer {
position: absolute;
bottom: 0;
width: 100%;
white-space: nowrap;
line-height: 60px; /* Vertically center the text there */
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

@ -0,0 +1,4 @@
// Please see documentation at https://docs.microsoft.com/aspnet/core/client-side/bundling-and-minification
// for details on configuring this project to bundle and minify static web assets.
// Write your JavaScript code.

@ -0,0 +1,22 @@
The MIT License (MIT)
Copyright (c) 2011-2018 Twitter, Inc.
Copyright (c) 2011-2018 The Bootstrap Authors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -0,0 +1,331 @@
/*!
* Bootstrap Reboot v4.3.1 (https://getbootstrap.com/)
* Copyright 2011-2019 The Bootstrap Authors
* Copyright 2011-2019 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)
*/
*,
*::before,
*::after {
box-sizing: border-box;
}
html {
font-family: sans-serif;
line-height: 1.15;
-webkit-text-size-adjust: 100%;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}
article, aside, figcaption, figure, footer, header, hgroup, main, nav, section {
display: block;
}
body {
margin: 0;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
font-size: 1rem;
font-weight: 400;
line-height: 1.5;
color: #212529;
text-align: left;
background-color: #fff;
}
[tabindex="-1"]:focus {
outline: 0 !important;
}
hr {
box-sizing: content-box;
height: 0;
overflow: visible;
}
h1, h2, h3, h4, h5, h6 {
margin-top: 0;
margin-bottom: 0.5rem;
}
p {
margin-top: 0;
margin-bottom: 1rem;
}
abbr[title],
abbr[data-original-title] {
text-decoration: underline;
-webkit-text-decoration: underline dotted;
text-decoration: underline dotted;
cursor: help;
border-bottom: 0;
-webkit-text-decoration-skip-ink: none;
text-decoration-skip-ink: none;
}
address {
margin-bottom: 1rem;
font-style: normal;
line-height: inherit;
}
ol,
ul,
dl {
margin-top: 0;
margin-bottom: 1rem;
}
ol ol,
ul ul,
ol ul,
ul ol {
margin-bottom: 0;
}
dt {
font-weight: 700;
}
dd {
margin-bottom: .5rem;
margin-left: 0;
}
blockquote {
margin: 0 0 1rem;
}
b,
strong {
font-weight: bolder;
}
small {
font-size: 80%;
}
sub,
sup {
position: relative;
font-size: 75%;
line-height: 0;
vertical-align: baseline;
}
sub {
bottom: -.25em;
}
sup {
top: -.5em;
}
a {
color: #007bff;
text-decoration: none;
background-color: transparent;
}
a:hover {
color: #0056b3;
text-decoration: underline;
}
a:not([href]):not([tabindex]) {
color: inherit;
text-decoration: none;
}
a:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus {
color: inherit;
text-decoration: none;
}
a:not([href]):not([tabindex]):focus {
outline: 0;
}
pre,
code,
kbd,
samp {
font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
font-size: 1em;
}
pre {
margin-top: 0;
margin-bottom: 1rem;
overflow: auto;
}
figure {
margin: 0 0 1rem;
}
img {
vertical-align: middle;
border-style: none;
}
svg {
overflow: hidden;
vertical-align: middle;
}
table {
border-collapse: collapse;
}
caption {
padding-top: 0.75rem;
padding-bottom: 0.75rem;
color: #6c757d;
text-align: left;
caption-side: bottom;
}
th {
text-align: inherit;
}
label {
display: inline-block;
margin-bottom: 0.5rem;
}
button {
border-radius: 0;
}
button:focus {
outline: 1px dotted;
outline: 5px auto -webkit-focus-ring-color;
}
input,
button,
select,
optgroup,
textarea {
margin: 0;
font-family: inherit;
font-size: inherit;
line-height: inherit;
}
button,
input {
overflow: visible;
}
button,
select {
text-transform: none;
}
select {
word-wrap: normal;
}
button,
[type="button"],
[type="reset"],
[type="submit"] {
-webkit-appearance: button;
}
button:not(:disabled),
[type="button"]:not(:disabled),
[type="reset"]:not(:disabled),
[type="submit"]:not(:disabled) {
cursor: pointer;
}
button::-moz-focus-inner,
[type="button"]::-moz-focus-inner,
[type="reset"]::-moz-focus-inner,
[type="submit"]::-moz-focus-inner {
padding: 0;
border-style: none;
}
input[type="radio"],
input[type="checkbox"] {
box-sizing: border-box;
padding: 0;
}
input[type="date"],
input[type="time"],
input[type="datetime-local"],
input[type="month"] {
-webkit-appearance: listbox;
}
textarea {
overflow: auto;
resize: vertical;
}
fieldset {
min-width: 0;
padding: 0;
margin: 0;
border: 0;
}
legend {
display: block;
width: 100%;
max-width: 100%;
padding: 0;
margin-bottom: .5rem;
font-size: 1.5rem;
line-height: inherit;
color: inherit;
white-space: normal;
}
progress {
vertical-align: baseline;
}
[type="number"]::-webkit-inner-spin-button,
[type="number"]::-webkit-outer-spin-button {
height: auto;
}
[type="search"] {
outline-offset: -2px;
-webkit-appearance: none;
}
[type="search"]::-webkit-search-decoration {
-webkit-appearance: none;
}
::-webkit-file-upload-button {
font: inherit;
-webkit-appearance: button;
}
output {
display: inline-block;
}
summary {
display: list-item;
cursor: pointer;
}
template {
display: none;
}
[hidden] {
display: none !important;
}
/*# sourceMappingURL=bootstrap-reboot.css.map */

File diff suppressed because one or more lines are too long

@ -0,0 +1,8 @@
/*!
* Bootstrap Reboot v4.3.1 (https://getbootstrap.com/)
* Copyright 2011-2019 The Bootstrap Authors
* Copyright 2011-2019 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)
*/*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}
/*# sourceMappingURL=bootstrap-reboot.min.css.map */

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -0,0 +1,12 @@
Copyright (c) .NET Foundation. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
these files except in compliance with the License. You may obtain a copy of the
License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed
under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
CONDITIONS OF ANY KIND, either express or implied. See the License for the
specific language governing permissions and limitations under the License.

@ -0,0 +1,432 @@
// Unobtrusive validation support library for jQuery and jQuery Validate
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
// @version v3.2.11
/*jslint white: true, browser: true, onevar: true, undef: true, nomen: true, eqeqeq: true, plusplus: true, bitwise: true, regexp: true, newcap: true, immed: true, strict: false */
/*global document: false, jQuery: false */
(function (factory) {
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module.
define("jquery.validate.unobtrusive", ['jquery-validation'], factory);
} else if (typeof module === 'object' && module.exports) {
// CommonJS-like environments that support module.exports
module.exports = factory(require('jquery-validation'));
} else {
// Browser global
jQuery.validator.unobtrusive = factory(jQuery);
}
}(function ($) {
var $jQval = $.validator,
adapters,
data_validation = "unobtrusiveValidation";
function setValidationValues(options, ruleName, value) {
options.rules[ruleName] = value;
if (options.message) {
options.messages[ruleName] = options.message;
}
}
function splitAndTrim(value) {
return value.replace(/^\s+|\s+$/g, "").split(/\s*,\s*/g);
}
function escapeAttributeValue(value) {
// As mentioned on http://api.jquery.com/category/selectors/
return value.replace(/([!"#$%&'()*+,./:;<=>?@\[\\\]^`{|}~])/g, "\\$1");
}
function getModelPrefix(fieldName) {
return fieldName.substr(0, fieldName.lastIndexOf(".") + 1);
}
function appendModelPrefix(value, prefix) {
if (value.indexOf("*.") === 0) {
value = value.replace("*.", prefix);
}
return value;
}
function onError(error, inputElement) { // 'this' is the form element
var container = $(this).find("[data-valmsg-for='" + escapeAttributeValue(inputElement[0].name) + "']"),
replaceAttrValue = container.attr("data-valmsg-replace"),
replace = replaceAttrValue ? $.parseJSON(replaceAttrValue) !== false : null;
container.removeClass("field-validation-valid").addClass("field-validation-error");
error.data("unobtrusiveContainer", container);
if (replace) {
container.empty();
error.removeClass("input-validation-error").appendTo(container);
}
else {
error.hide();
}
}
function onErrors(event, validator) { // 'this' is the form element
var container = $(this).find("[data-valmsg-summary=true]"),
list = container.find("ul");
if (list && list.length && validator.errorList.length) {
list.empty();
container.addClass("validation-summary-errors").removeClass("validation-summary-valid");
$.each(validator.errorList, function () {
$("<li />").html(this.message).appendTo(list);
});
}
}
function onSuccess(error) { // 'this' is the form element
var container = error.data("unobtrusiveContainer");
if (container) {
var replaceAttrValue = container.attr("data-valmsg-replace"),
replace = replaceAttrValue ? $.parseJSON(replaceAttrValue) : null;
container.addClass("field-validation-valid").removeClass("field-validation-error");
error.removeData("unobtrusiveContainer");
if (replace) {
container.empty();
}
}
}
function onReset(event) { // 'this' is the form element
var $form = $(this),
key = '__jquery_unobtrusive_validation_form_reset';
if ($form.data(key)) {
return;
}
// Set a flag that indicates we're currently resetting the form.
$form.data(key, true);
try {
$form.data("validator").resetForm();
} finally {
$form.removeData(key);
}
$form.find(".validation-summary-errors")
.addClass("validation-summary-valid")
.removeClass("validation-summary-errors");
$form.find(".field-validation-error")
.addClass("field-validation-valid")
.removeClass("field-validation-error")
.removeData("unobtrusiveContainer")
.find(">*") // If we were using valmsg-replace, get the underlying error
.removeData("unobtrusiveContainer");
}
function validationInfo(form) {
var $form = $(form),
result = $form.data(data_validation),
onResetProxy = $.proxy(onReset, form),
defaultOptions = $jQval.unobtrusive.options || {},
execInContext = function (name, args) {
var func = defaultOptions[name];
func && $.isFunction(func) && func.apply(form, args);
};
if (!result) {
result = {
options: { // options structure passed to jQuery Validate's validate() method
errorClass: defaultOptions.errorClass || "input-validation-error",
errorElement: defaultOptions.errorElement || "span",
errorPlacement: function () {
onError.apply(form, arguments);
execInContext("errorPlacement", arguments);
},
invalidHandler: function () {
onErrors.apply(form, arguments);
execInContext("invalidHandler", arguments);
},
messages: {},
rules: {},
success: function () {
onSuccess.apply(form, arguments);
execInContext("success", arguments);
}
},
attachValidation: function () {
$form
.off("reset." + data_validation, onResetProxy)
.on("reset." + data_validation, onResetProxy)
.validate(this.options);
},
validate: function () { // a validation function that is called by unobtrusive Ajax
$form.validate();
return $form.valid();
}
};
$form.data(data_validation, result);
}
return result;
}
$jQval.unobtrusive = {
adapters: [],
parseElement: function (element, skipAttach) {
/// <summary>
/// Parses a single HTML element for unobtrusive validation attributes.
/// </summary>
/// <param name="element" domElement="true">The HTML element to be parsed.</param>
/// <param name="skipAttach" type="Boolean">[Optional] true to skip attaching the
/// validation to the form. If parsing just this single element, you should specify true.
/// If parsing several elements, you should specify false, and manually attach the validation
/// to the form when you are finished. The default is false.</param>
var $element = $(element),
form = $element.parents("form")[0],
valInfo, rules, messages;
if (!form) { // Cannot do client-side validation without a form
return;
}
valInfo = validationInfo(form);
valInfo.options.rules[element.name] = rules = {};
valInfo.options.messages[element.name] = messages = {};
$.each(this.adapters, function () {
var prefix = "data-val-" + this.name,
message = $element.attr(prefix),
paramValues = {};
if (message !== undefined) { // Compare against undefined, because an empty message is legal (and falsy)
prefix += "-";
$.each(this.params, function () {
paramValues[this] = $element.attr(prefix + this);
});
this.adapt({
element: element,
form: form,
message: message,
params: paramValues,
rules: rules,
messages: messages
});
}
});
$.extend(rules, { "__dummy__": true });
if (!skipAttach) {
valInfo.attachValidation();
}
},
parse: function (selector) {
/// <summary>
/// Parses all the HTML elements in the specified selector. It looks for input elements decorated
/// with the [data-val=true] attribute value and enables validation according to the data-val-*
/// attribute values.
/// </summary>
/// <param name="selector" type="String">Any valid jQuery selector.</param>
// $forms includes all forms in selector's DOM hierarchy (parent, children and self) that have at least one
// element with data-val=true
var $selector = $(selector),
$forms = $selector.parents()
.addBack()
.filter("form")
.add($selector.find("form"))
.has("[data-val=true]");
$selector.find("[data-val=true]").each(function () {
$jQval.unobtrusive.parseElement(this, true);
});
$forms.each(function () {
var info = validationInfo(this);
if (info) {
info.attachValidation();
}
});
}
};
adapters = $jQval.unobtrusive.adapters;
adapters.add = function (adapterName, params, fn) {
/// <summary>Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation.</summary>
/// <param name="adapterName" type="String">The name of the adapter to be added. This matches the name used
/// in the data-val-nnnn HTML attribute (where nnnn is the adapter name).</param>
/// <param name="params" type="Array" optional="true">[Optional] An array of parameter names (strings) that will
/// be extracted from the data-val-nnnn-mmmm HTML attributes (where nnnn is the adapter name, and
/// mmmm is the parameter name).</param>
/// <param name="fn" type="Function">The function to call, which adapts the values from the HTML
/// attributes into jQuery Validate rules and/or messages.</param>
/// <returns type="jQuery.validator.unobtrusive.adapters" />
if (!fn) { // Called with no params, just a function
fn = params;
params = [];
}
this.push({ name: adapterName, params: params, adapt: fn });
return this;
};
adapters.addBool = function (adapterName, ruleName) {
/// <summary>Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where
/// the jQuery Validate validation rule has no parameter values.</summary>
/// <param name="adapterName" type="String">The name of the adapter to be added. This matches the name used
/// in the data-val-nnnn HTML attribute (where nnnn is the adapter name).</param>
/// <param name="ruleName" type="String" optional="true">[Optional] The name of the jQuery Validate rule. If not provided, the value
/// of adapterName will be used instead.</param>
/// <returns type="jQuery.validator.unobtrusive.adapters" />
return this.add(adapterName, function (options) {
setValidationValues(options, ruleName || adapterName, true);
});
};
adapters.addMinMax = function (adapterName, minRuleName, maxRuleName, minMaxRuleName, minAttribute, maxAttribute) {
/// <summary>Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where
/// the jQuery Validate validation has three potential rules (one for min-only, one for max-only, and
/// one for min-and-max). The HTML parameters are expected to be named -min and -max.</summary>
/// <param name="adapterName" type="String">The name of the adapter to be added. This matches the name used
/// in the data-val-nnnn HTML attribute (where nnnn is the adapter name).</param>
/// <param name="minRuleName" type="String">The name of the jQuery Validate rule to be used when you only
/// have a minimum value.</param>
/// <param name="maxRuleName" type="String">The name of the jQuery Validate rule to be used when you only
/// have a maximum value.</param>
/// <param name="minMaxRuleName" type="String">The name of the jQuery Validate rule to be used when you
/// have both a minimum and maximum value.</param>
/// <param name="minAttribute" type="String" optional="true">[Optional] The name of the HTML attribute that
/// contains the minimum value. The default is "min".</param>
/// <param name="maxAttribute" type="String" optional="true">[Optional] The name of the HTML attribute that
/// contains the maximum value. The default is "max".</param>
/// <returns type="jQuery.validator.unobtrusive.adapters" />
return this.add(adapterName, [minAttribute || "min", maxAttribute || "max"], function (options) {
var min = options.params.min,
max = options.params.max;
if (min && max) {
setValidationValues(options, minMaxRuleName, [min, max]);
}
else if (min) {
setValidationValues(options, minRuleName, min);
}
else if (max) {
setValidationValues(options, maxRuleName, max);
}
});
};
adapters.addSingleVal = function (adapterName, attribute, ruleName) {
/// <summary>Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where
/// the jQuery Validate validation rule has a single value.</summary>
/// <param name="adapterName" type="String">The name of the adapter to be added. This matches the name used
/// in the data-val-nnnn HTML attribute(where nnnn is the adapter name).</param>
/// <param name="attribute" type="String">[Optional] The name of the HTML attribute that contains the value.
/// The default is "val".</param>
/// <param name="ruleName" type="String" optional="true">[Optional] The name of the jQuery Validate rule. If not provided, the value
/// of adapterName will be used instead.</param>
/// <returns type="jQuery.validator.unobtrusive.adapters" />
return this.add(adapterName, [attribute || "val"], function (options) {
setValidationValues(options, ruleName || adapterName, options.params[attribute]);
});
};
$jQval.addMethod("__dummy__", function (value, element, params) {
return true;
});
$jQval.addMethod("regex", function (value, element, params) {
var match;
if (this.optional(element)) {
return true;
}
match = new RegExp(params).exec(value);
return (match && (match.index === 0) && (match[0].length === value.length));
});
$jQval.addMethod("nonalphamin", function (value, element, nonalphamin) {
var match;
if (nonalphamin) {
match = value.match(/\W/g);
match = match && match.length >= nonalphamin;
}
return match;
});
if ($jQval.methods.extension) {
adapters.addSingleVal("accept", "mimtype");
adapters.addSingleVal("extension", "extension");
} else {
// for backward compatibility, when the 'extension' validation method does not exist, such as with versions
// of JQuery Validation plugin prior to 1.10, we should use the 'accept' method for
// validating the extension, and ignore mime-type validations as they are not supported.
adapters.addSingleVal("extension", "extension", "accept");
}
adapters.addSingleVal("regex", "pattern");
adapters.addBool("creditcard").addBool("date").addBool("digits").addBool("email").addBool("number").addBool("url");
adapters.addMinMax("length", "minlength", "maxlength", "rangelength").addMinMax("range", "min", "max", "range");
adapters.addMinMax("minlength", "minlength").addMinMax("maxlength", "minlength", "maxlength");
adapters.add("equalto", ["other"], function (options) {
var prefix = getModelPrefix(options.element.name),
other = options.params.other,
fullOtherName = appendModelPrefix(other, prefix),
element = $(options.form).find(":input").filter("[name='" + escapeAttributeValue(fullOtherName) + "']")[0];
setValidationValues(options, "equalTo", element);
});
adapters.add("required", function (options) {
// jQuery Validate equates "required" with "mandatory" for checkbox elements
if (options.element.tagName.toUpperCase() !== "INPUT" || options.element.type.toUpperCase() !== "CHECKBOX") {
setValidationValues(options, "required", true);
}
});
adapters.add("remote", ["url", "type", "additionalfields"], function (options) {
var value = {
url: options.params.url,
type: options.params.type || "GET",
data: {}
},
prefix = getModelPrefix(options.element.name);
$.each(splitAndTrim(options.params.additionalfields || options.element.name), function (i, fieldName) {
var paramName = appendModelPrefix(fieldName, prefix);
value.data[paramName] = function () {
var field = $(options.form).find(":input").filter("[name='" + escapeAttributeValue(paramName) + "']");
// For checkboxes and radio buttons, only pick up values from checked fields.
if (field.is(":checkbox")) {
return field.filter(":checked").val() || field.filter(":hidden").val() || '';
}
else if (field.is(":radio")) {
return field.filter(":checked").val() || '';
}
return field.val();
};
});
setValidationValues(options, "remote", value);
});
adapters.add("password", ["min", "nonalphamin", "regex"], function (options) {
if (options.params.min) {
setValidationValues(options, "minlength", options.params.min);
}
if (options.params.nonalphamin) {
setValidationValues(options, "nonalphamin", options.params.nonalphamin);
}
if (options.params.regex) {
setValidationValues(options, "regex", options.params.regex);
}
});
adapters.add("fileextensions", ["extensions"], function (options) {
setValidationValues(options, "extension", options.params.extensions);
});
$(function () {
$jQval.unobtrusive.parse(document);
});
return $jQval.unobtrusive;
}));

File diff suppressed because one or more lines are too long

@ -0,0 +1,22 @@
The MIT License (MIT)
=====================
Copyright Jörn Zaefferer
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

@ -0,0 +1,36 @@
Copyright JS Foundation and other contributors, https://js.foundation/
This software consists of voluntary contributions made by many
individuals. For exact contribution history, see the revision history
available at https://github.com/jquery/jquery
The following license applies to all parts of this software except as
documented below:
====
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
====
All files located in the node_modules and external directories are
externally maintained libraries used by this software which have their
own licenses; we recommend you read them, as their terms may differ from
the terms above.

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -23,7 +23,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "djy_AmsApi", "djy.WebApi\dj
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "djy.Service", "djy.Service\djy.Service.csproj", "{263A1D6E-4453-419E-8FFB-06F3AC18AAC9}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "djy_IsfApi", "djy_IsfApi\djy_IsfApi.csproj", "{B9B3283E-FA06-4B06-88F1-5680AC4E5F26}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "djy_IsfApi", "djy_IsfApi\djy_IsfApi.csproj", "{B9B3283E-FA06-4B06-88F1-5680AC4E5F26}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "djy_Report", "djy_Report\djy_Report.csproj", "{A201194B-42CA-41BF-8123-7DB5D332C940}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@ -55,6 +57,10 @@ Global
{B9B3283E-FA06-4B06-88F1-5680AC4E5F26}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B9B3283E-FA06-4B06-88F1-5680AC4E5F26}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B9B3283E-FA06-4B06-88F1-5680AC4E5F26}.Release|Any CPU.Build.0 = Release|Any CPU
{A201194B-42CA-41BF-8123-7DB5D332C940}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A201194B-42CA-41BF-8123-7DB5D332C940}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A201194B-42CA-41BF-8123-7DB5D332C940}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A201194B-42CA-41BF-8123-7DB5D332C940}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@ -66,6 +72,7 @@ Global
{84789CC9-B13D-4693-BF4F-6DA3E32736A2} = {E3B4DD84-D374-432C-AEA9-782D33748578}
{263A1D6E-4453-419E-8FFB-06F3AC18AAC9} = {1E6EFB04-DE56-4879-81CB-0DDEAB09EBCB}
{B9B3283E-FA06-4B06-88F1-5680AC4E5F26} = {E3B4DD84-D374-432C-AEA9-782D33748578}
{A201194B-42CA-41BF-8123-7DB5D332C940} = {E3B4DD84-D374-432C-AEA9-782D33748578}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {822B0661-DA88-4792-AAF3-C508FB88AF3B}

Loading…
Cancel
Save