1、框架升级到.Net 5
2、关系型数据库的ORM由Dapper替换为SqlSugar
3、优化整理了WebApi层的代码对很多附件功能进行分类封装,极大减少Startup.cs的配置代码
4、增加上传文件大小可配置功能
5、增加App.Metrics的健康检测(但是需要单独安装其配套软件,默认禁用)
目前本框架支持的数据为:MongoDB、MySql、SqlServer(默认使用的数据库为MongoDB)
ASHermed.Shadow.Code - 存放接口返回结果的统一代码 ASHermed.Shadow.ContractModel - 存放接口统一返回结果的Model(无需改动) ASHermed.Shadow.Entity - 存放与数据库表结构一一对应的实体 ASHermed.Shadow.Enum - 存放所有枚举的地方 ASHermed.Shadow.Exception - 存放所有自定义异常的地方 ASHermed.Shadow.Repository - 存放数据库基础仓储的地方 ASHermed.Shadow.Tools - 存放本系统工具类的地方
ASHermed.Shadow.Api.ContractModel - 存放项目内所有DTO对象的地方
Inside ---- 【对内使用的DTO对象】: 存放仓储层的DTO对象和一些内部使用的DTO对象 External ---- 【对外使用的DTO对象】: 存放Service层、Controller层的DTO对象 Shared ---- 【共享,一般都是存放需要共享的DTO对象或实体】 Framework ---- 【存放所有Framework使用的DTO对象】 结构示例: Inside [对内DTO对象] Order [模块名称,模块下所有类的命名空间到模块为止] Param [存放传入参数的DTO对象,每个模块都有一套,文件结尾以Param命名] Model [存放返回结果的DTO对象,每个模块都有一套,文件结尾以Model命名] Entity [存放入参或返回结果DTO对象中用到的实体,每个模块都有一套,文件结尾以Entity命名]
External [对外DTO对象] Order [模块名称] v1 [接口版本,1代表版本号,模块下所有类的命名空间到模块为止] Param [存放传入参数的DTO对象,每个模块都有一套,文件结尾以Param命名] Model [存放返回结果的DTO对象,每个模块都有一套,文件结尾以Model命名] Entity [存放入参或返回结果DTO对象中用到的实体,每个模块都有一套,文件结尾以Entity命名]
ASHermed.Shadow.Api.IRepository - 存放自定义仓储interface的地方 ASHermed.Shadow.Api.MongoDBRepository - 存放MongoDB自定义数据库仓储的地方 ASHermed.Shadow.Api.MySqlRepository - 存放MySql自定义数据库仓储的地方 ASHermed.Shadow.Api.SqlServerRepository - 存放SqlServer自定义数据库仓储的地方
ASHermed.Shadow.BaseFramework - 存放用户调用第三方接口的HttpClientHelp工具类的层 ASHermed.Shadow.IFramework - 存放Framework 下 interface 的地方 ASHermed.Shadow.LogFramework - 存放接口日志记录的地方(无需改动) ASHermed.SingleSignOnFramework - 存放调用单点登录系统封装的地方
ASHermed.Shadow.Api.IService - 存放 Service 下 interface 的地方 ASHermed.Shadow.Api.Service - 存放Service的地方
ASHermed.Shadow.WebApi - 存放对外Api的地方
操作 | 格式 | 范例 | RDBMS中的类似语句 |
---|---|---|---|
等于 | { key : value } | db.col.find({"by":"破军"}).pretty() | where by = '破军' |
小于 | { key :{$lt: value }} | db.col.find({"likes":{$lt:50}}).pretty() | where likes < 50 |
小于或等于 | { key :{$lte: value }} | db.col.find({"likes":{$lte:50}}).pretty() | where likes <= 50 |
大于 | { key :{$gt: value }} | db.col.find({"likes":{$gt:50}}).pretty() | where likes > 50 |
大于或等于 | { key :{$gte: value }} | db.col.find({"likes":{$gte:50}}).pretty() | where likes >= 50 |
不等于 | { key :{$ne: value }} | db.col.find({"likes":{$ne:50}}).pretty() | where likes != 50 |
{"APIName":{$regex:/cgi-bin\/user\/getuserinfo/,'$options':'i'}}
{"RequestBody":{$regex:/B27532093400375009/}}
db.EvaluateRelation.update(
{"EvaluatorNoId" : "c1363","EvaluatedNoId" : "02255"},
{ $set: {"IsDeleted" : false} },
{multi:true}
)
db.AddedCount.remove(
{"_id" : {$in:["c0553.3","02669.3"]}},
{multi:true}
)
db.APILogs.createIndex({"RequestTime":-1})
db.APILogs.ensureIndex({"APIName":1,"IsError":1})
var filter = Filter.Or(
Filter.Where(x => x.Email.Contains(keyWord.ToLower())),
Filter.Where(x => x.WorkerUserId.Contains(keyWord.ToLower())));
var filter = Filter.Regex(x => x.EnglishName, new MongoDB.Bson.BsonRegularExpression(keyWord, "i"));
var filter = Filter.Or(
Filter.Regex(x => x.EnglishName, new BsonRegularExpression(new Regex(keyWord, RegexOptions.IgnoreCase))),
Filter.Regex(x => x.EnglishName, new BsonRegularExpression(keyWord)));
int skip = (pageNo - 1) * pageSize;
await this.GetListAsync(filter: _filter, sort: Sort.Ascending(x => x.HireDate), limit: pageSize, skip: skip);
//无状态
await this.InsertAsync(surveyAnswers);
//有状态
await this.InsertAsync(surveyAnswers, writeConcern: WriteConcern.Acknowledged);
await this.CountAsync(filter: filter, readPreference: ReadPreference.PrimaryPreferred);
//无状态
this.InsertBatchAsync(surveyAnswers);
//有状态
this.InsertBatchAsync(surveyAnswers, writeConcern: WriteConcern.Acknowledged);
this.FindOneAndUpdateAsync(filter, update);
public class Question : IAutoIncr<int>
{
[BsonId]
public int ID { get; set; }
}
public class RecommendRelation : IEntity<string>
{
[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public string ID { get; set; }
}
var filter = Filter.And(Filter.In(x => x.ID, ids));
People people = new People();
var projection = Projection
.Include(nameof(people.ID))
.Include(nameof(people.EN_Sup_Org_Name))
.Include(nameof(people.CN_Sup_Org_Name));
return this.GetListAsync(filter: filter, projection: projection);
{
"TableName" : "frtest66",
"MenuName" : "test666",
"DOAdmin_MenuId" : "676db672-212f-4876-b164-22ded65f4cbd",
"PermissionList" : [
{
"PmsID" : "0d27cbe577764b72a160bc84c8aa2203",
"PmsTag" : [
"64ef17e8-37fb-47fa-b630-1682c137e463"
],
"Remark" : "test",
"OperateType" : [
1,
2,
4
],
"Status" : 2,
"IsFullData" : false,
"PmsInfos" : [
{
"ColumnName" : "Name",
"ColumnType" : 1,
"ColumnValue" : "张三"
}
]
}
]
}
更新Status字段:通过占位符"$"实现
"update" : { "$set" : { "PermissionList.$.Status" : 1 } }
实现代码:
var filter = Filter.And(
Filter.Eq(nameof(Sys_SingleTableTemplate.PermissionList) + "." + nameof(Sys_Permission.PmsID), param.PermissionID));
var update = Update
.Set(nameof(Sys_SingleTableTemplate.PermissionList) + ".$." + nameof(Sys_Permission.Status), param.Sys_DataState);
return await this.FindOneAndUpdateAsync(filter, update, writeConcern: WriteConcern.Acknowledged);
/// <summary>
/// 投放ID集合
/// </summary>
public List<MPPutInInfo> PICMList { get; set; }
/// <summary>
/// 更新券规则投放数据
/// </summary>
/// <param name="mppicrID">后台发券规则ID</param>
/// <param name="mpPutInInfo">投放ID集合</param>
/// <param name="title">后台发券规则标题</param>
/// <param name="updateID">最后修改人ID</param>
/// <param name="updateName">最后修改人姓名</param>
/// <returns></returns>
public Task UpdateCouponPutIn(long mppicrID, MPPutInInfo mpPutInInfo, string title, long updateID, string updateName)
{
var filter = Filter.And(
Filter.Eq(nameof(MPPutInCouponRule.ID), mppicrID));
var update = Update
.Push(x => x.PICMList, mpPutInInfo)
.Set(nameof(MPPutInCouponRule.Title), title)
.Set(nameof(MPPutInCouponRule.UpdateID), updateID)
.Set(nameof(MPPutInCouponRule.UpdateName), updateName)
.Set(nameof(MPPutInCouponRule.UpdateTime), DateTime.Now);
return this.FindOneAndUpdateAsync(filter, update);
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。