diff --git a/Tiobon.Core.Api/Tiobon.Core.Model.xml b/Tiobon.Core.Api/Tiobon.Core.Model.xml index 99769651..036fd617 100644 --- a/Tiobon.Core.Api/Tiobon.Core.Model.xml +++ b/Tiobon.Core.Api/Tiobon.Core.Model.xml @@ -576,12 +576,12 @@ - GradeNo + 编号 - GradeName + 名称 @@ -1722,6 +1722,11 @@ 表中文名 + + + 是否校验唯一性 + + 以下model 来自ids4项目,多库模式,为了调取ids4数据 diff --git a/Tiobon.Core.Api/Tiobon.Core.xml b/Tiobon.Core.Api/Tiobon.Core.xml index eff44bd1..e2fb8b95 100644 --- a/Tiobon.Core.Api/Tiobon.Core.xml +++ b/Tiobon.Core.Api/Tiobon.Core.xml @@ -278,11 +278,11 @@ 登录管理【无权限】 - + 构造函数注入 - + diff --git a/Tiobon.Core.Api/appsettings.json b/Tiobon.Core.Api/appsettings.json index 38158ebc..c58bbf2f 100644 --- a/Tiobon.Core.Api/appsettings.json +++ b/Tiobon.Core.Api/appsettings.json @@ -107,8 +107,8 @@ "ConnId": "WMTiobon_MSSQL_Main", "DBType": 1, "Enabled": true, - //"Connection": "Data Source=47.99.54.186;User ID=GHR;Password=Tiobon20190101;Database=GHR30;Encrypt=True;TrustServerCertificate=True;", - "Connection": "Data Source=116.204.98.209;User ID=Tiobon;Password=&($!4UGUyU#$2sp9O;Database=Tiobon;Encrypt=True;TrustServerCertificate=True;", + "Connection": "Data Source=47.99.54.186;User ID=GHR;Password=Tiobon20190101;Database=GHR30;Encrypt=True;TrustServerCertificate=True;", + //"Connection": "Data Source=116.204.98.209;User ID=Tiobon;Password=&($!4UGUyU#$2sp9O;Database=Tiobon;Encrypt=True;TrustServerCertificate=True;", "ProviderName": "System.Data.SqlClient" }, { diff --git a/Tiobon.Core.Common/DB/Dapper/Entity/EntityAttribute.cs b/Tiobon.Core.Common/DB/Dapper/Entity/EntityAttribute.cs index af753017..5e24cdcd 100644 --- a/Tiobon.Core.Common/DB/Dapper/Entity/EntityAttribute.cs +++ b/Tiobon.Core.Common/DB/Dapper/Entity/EntityAttribute.cs @@ -1,38 +1,31 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +namespace Tiobon.Core.Common.DB.Dapper.Entity; -namespace Tiobon.Core.Common.DB.Dapper.Entity +public class EntityAttribute : Attribute { - public class EntityAttribute : Attribute - { - /// - /// 真实表名(数据库表名,若没有填写默认实体为表名) - /// - public string TableName { get; set; } - /// - /// 表中文名 - /// - public string TableCnName { get; set; } - /// - /// 子表 - /// - public Type[] DetailTable { get; set; } - /// - /// 子表中文名 - /// - public string DetailTableCnName { get; set; } - /// - /// 数据库 - /// - public string DBServer { get; set; } + /// + /// 真实表名(数据库表名,若没有填写默认实体为表名) + /// + public string TableName { get; set; } + /// + /// 表中文名 + /// + public string TableCnName { get; set; } + /// + /// 子表 + /// + public Type[] DetailTable { get; set; } + /// + /// 子表中文名 + /// + public string DetailTableCnName { get; set; } + /// + /// 数据库 + /// + public string DBServer { get; set; } - //是否开启用户数据权限,true=用户只能操作自己(及下级角色)创建的数据,如:查询、删除、修改等操作 - public bool CurrentUserPermission { get; set; } + //是否开启用户数据权限,true=用户只能操作自己(及下级角色)创建的数据,如:查询、删除、修改等操作 + public bool CurrentUserPermission { get; set; } - public Type ApiInput { get; set; } - public Type ApiOutput { get; set; } - } + public Type ApiInput { get; set; } + public Type ApiOutput { get; set; } } diff --git a/Tiobon.Core.Common/DB/Dapper/Extensions/EntityProperties.cs b/Tiobon.Core.Common/DB/Dapper/Extensions/EntityProperties.cs index a2ed785e..4455b6f6 100644 --- a/Tiobon.Core.Common/DB/Dapper/Extensions/EntityProperties.cs +++ b/Tiobon.Core.Common/DB/Dapper/Extensions/EntityProperties.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.ComponentModel; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using System.Data; @@ -8,6 +9,10 @@ using System.Linq.Expressions; using System.Reflection; using System.Text; using Tiobon.Core.Common.DB.Dapper.Entity; +using static Dapper.SqlMapper; +using Tiobon.Core.Model.Models; +using Tiobon.Core.Model; +using AutoMapper.Execution; namespace Tiobon.Core.Common.DB.Dapper.Extensions; @@ -124,7 +129,7 @@ public static class EntityProperties } return new KeyValuePair(property.Name, colType); } - + /// ///要执行的sql语句如:通过EntityToSqlTempName.Temp_Insert0.ToString()字符串占位,生成的的sql语句会把EntityToSqlTempName.Temp_Insert0.ToString()替换成生成的sql临时表数据 /// string sql = " ;DELETE FROM " + typeEntity.Name + " where " + typeEntity.GetKeyName() + @@ -144,7 +149,7 @@ public static class EntityProperties string columnType = string.Empty; List arrrayEntityList = array.Select(x => new ArrayEntity { column1 = x.ToString() }).ToList(); return arrrayEntityList.GetEntitySql(false, sql, null, null, fieldType); - } + } /// /// 根据实体获取key的类型,用于update或del操作 /// @@ -301,7 +306,7 @@ public static class EntityProperties declareTable.AppendLine("; drop table " + tempTablbe); } return declareTable.ToString(); - } + } public static string GetKeyName(this Type typeinfo) { return typeinfo.GetProperties().GetKeyName(); @@ -524,7 +529,43 @@ public static class EntityProperties } return displayName; } - + + public static string GetDescription(this PropertyInfo type) + { + Attribute attribute = type.GetCustomAttribute(typeof(DescriptionAttribute)); + if (attribute != null && attribute is DescriptionAttribute) + { + return (attribute as DescriptionAttribute).Description ?? type.Name; + } + return type.Name; + } + public static void GetOnlyList(this T entity, out List names, out List values, out List descriptions) + { + + names = new List(); + values = new List(); + descriptions = new List(); + PropertyInfo[] propertyInfo = typeof(T).GetProperties().ToArray(); + + foreach (PropertyInfo property in propertyInfo) + { + //paramsList.Add(property.Name); + object val = property.GetValue(entity); + object objAtrr = property.GetTypeCustomAttributes(typeof(EntityColumnAttribute), out bool asType); + var description = property.GetDescription(); + if (property.ContainsCustomAttributes(typeof(EntityColumnAttribute))) + { + var is1 = ((EntityColumnAttribute)objAtrr).IsOnly; + if (is1) + { + names.Add(property.Name); + values.Add(val); + descriptions.Add(description); + } + } + } + } + /// /// 获取属性的指定属性 /// @@ -589,14 +630,14 @@ public static class EntityProperties /// public static string GetEntityTableName(this Type type) { - Attribute attribute = type.GetCustomAttribute(typeof(EntityAttribute)); - if (attribute != null && attribute is EntityAttribute) + Attribute attribute = type.GetCustomAttribute(typeof(Entity.EntityAttribute)); + if (attribute != null && attribute is Entity.EntityAttribute) { - return (attribute as EntityAttribute).TableName ?? type.Name; + return (attribute as Entity.EntityAttribute).TableName ?? type.Name; } return type.Name; } - + } diff --git a/Tiobon.Core.Common/Enums/ModifyType.cs b/Tiobon.Core.Common/Enums/ModifyType.cs new file mode 100644 index 00000000..246b0568 --- /dev/null +++ b/Tiobon.Core.Common/Enums/ModifyType.cs @@ -0,0 +1,20 @@ +namespace Tiobon.Core.Common.Enums; + +/// +/// 资料修改模式 +/// +public enum ModifyType +{ + /// + /// 新增模式。 + /// + Add, + /// + /// 修改模式。 + /// + Edit, + /// + /// 删除模式 + /// + Delete +} diff --git a/Tiobon.Core.Model/Entity/AttributeManager/EntityAttribute.cs b/Tiobon.Core.Model/Entity/AttributeManager/EntityAttribute.cs index 068259c2..edbee135 100644 --- a/Tiobon.Core.Model/Entity/AttributeManager/EntityAttribute.cs +++ b/Tiobon.Core.Model/Entity/AttributeManager/EntityAttribute.cs @@ -29,4 +29,12 @@ //public Type ApiInput { get; set; } //public Type ApiOutput { get; set; } } + + public class EntityColumnAttribute : Attribute + { + /// + /// 是否校验唯一性 + /// + public bool IsOnly { get; set; } = true; + } } diff --git a/Tiobon.Core.Model/Models/Ghra/Ghra_Grade.cs b/Tiobon.Core.Model/Models/Ghra/Ghra_Grade.cs index fb661223..575e927c 100644 --- a/Tiobon.Core.Model/Models/Ghra/Ghra_Grade.cs +++ b/Tiobon.Core.Model/Models/Ghra/Ghra_Grade.cs @@ -29,15 +29,17 @@ namespace Tiobon.Core.Model.Models { /// - /// GradeNo + /// 编号 /// - [Display(Name = "GradeNo"), Description("GradeNo"), MaxLength(100, ErrorMessage = "GradeNo 不能超过 100 个字符")] + [EntityColumn] + [Display(Name = "GradeNo"), Description("编号"), MaxLength(100, ErrorMessage = "GradeNo 不能超过 100 个字符")] public string GradeNo { get; set; } /// - /// GradeName + /// 名称 /// - [Display(Name = "GradeName"), Description("GradeName"), MaxLength(1000, ErrorMessage = "GradeName 不能超过 1000 个字符")] + [EntityColumn] + [Display(Name = "GradeName"), Description("名称"), MaxLength(1000, ErrorMessage = "GradeName 不能超过 1000 个字符")] public string GradeName { get; set; } /// diff --git a/Tiobon.Core.Services/BASE/BaseServices.cs b/Tiobon.Core.Services/BASE/BaseServices.cs index a2b0bb8b..1dc10bba 100644 --- a/Tiobon.Core.Services/BASE/BaseServices.cs +++ b/Tiobon.Core.Services/BASE/BaseServices.cs @@ -3,10 +3,12 @@ using System.Linq.Expressions; using System.Reflection; using AgileObjects.AgileMapper; using Microsoft.AspNetCore.Http; -using OfficeOpenXml.FormulaParsing.Excel.Functions.Math; +using OfficeOpenXml.FormulaParsing.Excel.Functions.Text; using SqlSugar; using Tiobon.Core.Common; +using Tiobon.Core.Common.DB.Dapper; using Tiobon.Core.Common.DB.Dapper.Extensions; +using Tiobon.Core.Common.Enums; using Tiobon.Core.Common.Extensions; using Tiobon.Core.Common.Helper; using Tiobon.Core.Common.UserManager; @@ -410,7 +412,6 @@ namespace Tiobon.Core.Services.BASE /// public async Task Add(TInsertDto entity) { - var userId = UserContext.Current.User_Id; HttpRequest request = UserContext.Context.Request; var api = request.Path.ObjToString().TrimEnd('/').ToLower(); var ip = GetUserIp(UserContext.Context); @@ -421,6 +422,10 @@ namespace Tiobon.Core.Services.BASE ent.CreateIP = ip; ent.CreateProg = api; + #region 检查是否存在相同值 + CheckOnly(entity1); + #endregion + return await BaseDal.Add(entity1); } @@ -441,6 +446,11 @@ namespace Tiobon.Core.Services.BASE BasePoco ent = entity as BasePoco; ent.CreateIP = ip; ent.CreateProg = api; + + + #region 检查是否存在相同值 + CheckOnly(entity); + #endregion }); return await BaseDal.Add(list); } @@ -464,6 +474,7 @@ namespace Tiobon.Core.Services.BASE BasePoco ent = entity as BasePoco; ent.UpdateIP = ip; ent.UpdateProg = api; + CheckOnly(entity, Id); return await BaseDal.Update(entity); } public async Task Update(Dictionary editModels) @@ -484,6 +495,7 @@ namespace Tiobon.Core.Services.BASE BasePoco ent = entity as BasePoco; ent.UpdateIP = ip; ent.UpdateProg = api; + CheckOnly(entity, keyValuePairs.Key); entities.Add(entity); } @@ -880,6 +892,103 @@ namespace Tiobon.Core.Services.BASE Conditions = string.Empty }; } + + + + public static void CheckOnly(TEntity entity, long? id = null) + { + Type entityType = typeof(TEntity); + var tableName = entityType.GetEntityTableName(); + + var names = new List(); + var values = new List(); + var descriptions = new List(); + entity.GetOnlyList(out names, out values, out descriptions); + for (int i = 0; i < names.Count; i++) + { + CheckCodeExist(tableName, names[i], values[i], id != null ? ModifyType.Edit : ModifyType.Add, descriptions[i]); + } + } + /// + /// 检查表中是否已经存在相同代码的数据 + /// + /// 表名 + /// 字段名 + /// 字段值 + /// ModifyType.Add,ModifyType.Edit + /// ModifyType.Edit时修改记录的ROW_ID值 + /// 判断栏位的提示名称 + public static void CheckCodeExist(string tableName, string fieldName, object fieldValue, ModifyType modifyType, string promptName, long? rowid = null) + { + try + { + CheckCodeExist(tableName, fieldName, fieldValue, modifyType, rowid, promptName, null); + } + catch (Exception) + { + throw; + } + } + + /// + /// 检查表中是否已经存在相同代码的数据 + /// + /// 表名 + /// 字段名 + /// 字段值 + /// 条件 + /// ModifyType.Add,ModifyType.Edit + /// ModifyType.Edit时修改记录的ROW_ID值 + /// 判断栏位的提示名称 + /// Where后的条件,如:IS_ALCON='Y' + public static bool CheckCodeExist(string tableName, string fieldName, object fieldValue, ModifyType modifyType, long? rowid, string promptName, string whereCondition) + { + try + { + bool result = false; + if (modifyType == ModifyType.Add) + { + string sql = string.Empty; + sql = "SELECT COUNT(*) FROM " + tableName + " WHERE " + fieldName + "='" + fieldValue + "' AND IsEnable=1"; + + if (!string.IsNullOrEmpty(whereCondition)) + sql += " AND " + whereCondition; + + int count = Convert.ToInt32(DbAccess.ExecuteScalar(sql)); + if (count > 0) + { + result = true; + throw new Exception(string.Format("{0}【{1}】已经存在!", promptName, fieldValue)); + } + else + result = false; + + } + else if (modifyType == ModifyType.Edit) + { + string sql = string.Empty; + sql = "SELECT COUNT(*) FROM " + tableName + " WHERE " + fieldName + "='" + fieldValue + "' AND IsEnable=1 AND ID!='" + rowid.Value + "'"; + + if (!string.IsNullOrEmpty(whereCondition)) + sql += " AND " + whereCondition; + + int count = Convert.ToInt32(DbAccess.ExecuteScalar(sql)); + if (count > 0) + { + result = true; + throw new Exception(string.Format("{0}【{1}】已经存在!", promptName, fieldValue)); + } + else + result = false; + } + return result; + } + catch (Exception) + { + throw; + } + } + #endregion } } \ No newline at end of file diff --git a/Tiobon.Core/Tiobon.Core.Model.xml b/Tiobon.Core/Tiobon.Core.Model.xml new file mode 100644 index 00000000..036fd617 --- /dev/null +++ b/Tiobon.Core/Tiobon.Core.Model.xml @@ -0,0 +1,2849 @@ + + + + Tiobon.Core.Model + + + + + 表主键 + + + + + 序号 + + + + + 1:有效,0:未生效 + + + + + 是否默认 + + + + + 操作日志ID + + + + + 创建人 + + + + + 创建时间 + + + + + 创建程序 + + + + + 创建IP + + + + + 最后修改人 + + + + + 最后修改时间 + + + + + 最后修改程序 + + + + + 最后修改IP + + + + + 备注 + + + + + 年级 (Dto.Base) + + + + + GradeNo + + + + + GradeName + + + + + MKey + + + + + DataBelongID + + + + + Reverse1 + + + + + Reverse2 + + + + + Reverse3 + + + + + Reverse4 + + + + + Reverse5 + + + + + Reverse6 + + + + + Reverse7 + + + + + Reverse8 + + + + + Reverse9 + + + + + ReverseI1 + + + + + ReverseI2 + + + + + 系统用户 (Dto.Base) + + + + + UserId + + + + + UserNo + + + + + UserName + + + + + UserEname + + + + + Email + + + + + Mobile + + + + + UserStaffID + + + + + PwdComplexityRuleID + + + + + UserPhotoUrl + + + + + APPID + + + + + DingID + + + + + EWeChatID + + + + + WeChatID + + + + + OtherID + + + + + UserLangID + + + + + PageStyle + + + + + UserType + + + + + BeginDate + + + + + EndDate + + + + + SalaryPwd + + + Pwd + + + TempPwd + + + TimeZoneID + + + + + TimeZoneGapMinute + + + + + Reverse1 + + + + + Reverse2 + + + + + Reverse3 + + + + + Reverse4 + + + + + Reverse5 + + + + + Reverse6 + + + + + Reverse7 + + + + + Reverse8 + + + + + Reverse9 + + + + + LockTime + + + + + APPID2 + + + + + 年级 (Dto.EditInput) + + + + + 系统用户 (Dto.EditInput) + + + + + 年级 (Dto.InsertInput) + + + + + 系统用户 (Dto.InsertInput) + + + + + 用户访问趋势日志 + + + + + 用户 + + + + + 次数 + + + + + 更新时间 + + + + + 博客文章 + + + + + 主键 + + 这里之所以没用RootEntity,是想保持和之前的数据库一致,主键是bID,不是Id + + + + 创建人 + + + + + 标题Tiobon + + + + + 类别 + + + + + 内容 + + + + + 访问量 + + + + + 评论数量 + + + + + 修改时间 + + + + + 创建时间 + + + + + 备注 + + + + + 逻辑删除 + + + + + 评论 + + + + + 博客文章 评论 + + + + + 部门表 + + + + + Desc:部门关系编码 + Default: + Nullable:True + + + + + Desc:部门名称 + Default: + Nullable:True + + + + + Desc:负责人 + Default: + Nullable:True + + + + + Desc:排序 + Default: + Nullable:True + + + + + Desc:部门状态(0正常 1停用) + Default:0 + Nullable:True + + + + + Desc:删除标志(0代表存在 2代表删除) + Default:0 + Nullable:True + + + + + Desc:创建者 + Default: + Nullable:True + + + + + Desc:创建时间 + Default: + Nullable:True + + + + + Desc:更新者 + Default: + Nullable:True + + + + + Desc:更新时间 + Default: + Nullable:True + + + + + 用户团队表 + + + + + ID + + + + + HttpContext.TraceIdentifier 事件链路ID(获取或设置一个唯一标识符,用于在跟踪日志中表示此请求。) + + + + + 时间 + + + + + 线程 + + + + + 等级 + + + + + 记录器 + + + + + 日志类型 + + + + + 数据类型 + + + + + 错误信息 + + + + + 异常 + + + + + 年级 (Model) + + + + + 编号 + + + + + 名称 + + + + + MKey + + + + + DataBelongID + + + + + Reverse1 + + + + + Reverse2 + + + + + Reverse3 + + + + + Reverse4 + + + + + Reverse5 + + + + + Reverse6 + + + + + Reverse7 + + + + + Reverse8 + + + + + Reverse9 + + + + + ReverseI1 + + + + + ReverseI2 + + + + + 系统用户 (Model) + + + + + UserId + + + + + UserNo + + + + + UserName + + + + + UserEname + + + + + Email + + + + + Mobile + + + + + UserStaffID + + + + + PwdComplexityRuleID + + + + + UserPhotoUrl + + + + + APPID + + + + + DingID + + + + + EWeChatID + + + + + WeChatID + + + + + OtherID + + + + + UserLangID + + + + + PageStyle + + + + + UserType + + + + + BeginDate + + + + + EndDate + + + + + SalaryPwd + + + Pwd + + + TempPwd + + + TimeZoneID + + + + + TimeZoneGapMinute + + + + + Reverse1 + + + + + Reverse2 + + + + + Reverse3 + + + + + Reverse4 + + + + + Reverse5 + + + + + Reverse6 + + + + + Reverse7 + + + + + Reverse8 + + + + + Reverse9 + + + + + LockTime + + + + + APPID2 + + + + 博客ID + + + + + 创建时间 + + + + + 手机 + + + + + qq + + + + + 留言内容 + + + + + ip地址 + + + + + 是否显示在前台,0否1是 + + + + + + 接口API地址信息表 + + + + + 获取或设置是否禁用,逻辑上的删除,非物理删除 + + + + + 名称 + + + + + 菜单链接地址 + + + + + 区域名称 + + + + + 控制器名称 + + + + + Action名称 + + + + + 图标 + + + + + 菜单编号 + + + + + 排序 + + + + + /描述 + + + + + 是否是右侧菜单 + + + + + 是否激活 + + + + + 创建ID + + + + + 创建者 + + + + + 创建时间 + + + + + 修改ID + + + + + 修改者 + + + + + 修改时间 + + + + + 日志记录 + + + + + 获取或设置是否禁用,逻辑上的删除,非物理删除 + + + + + 区域名 + + + + + 区域控制器名 + + + + + Action名称 + + + + + IP地址 + + + + + 描述 + + + + + 登录时间 + + + + + 登录名称 + + + + + 用户ID + + + + + 密码库表 + + + + + 获取或设置是否禁用,逻辑上的删除,非物理删除 + + + + + 路由菜单表 + + + + + 菜单执行Action名 + + + + + 菜单显示名(如用户页、编辑(按钮)、删除(按钮)) + + + + + 是否是按钮 + + + + + 是否是隐藏菜单 + + + + + 是否keepAlive + + + + + 按钮事件 + + + + + 排序 + + + + + 菜单图标 + + + + + 菜单描述 + + + + + 激活状态 + + + + + 创建ID + + + + + 创建者 + + + + + 创建时间 + + + + + 修改ID + + + + + 修改者 + + + + + 修改时间 + + + + + 获取或设置是否禁用,逻辑上的删除,非物理删除 + + + + + 角色表 + + + + + 获取或设置是否禁用,逻辑上的删除,非物理删除 + + + + + 角色名 + + + + + 描述 + + + + + 排序 + + + + + 自定义权限的部门ids + + + + + 权限范围 + -1 无任何权限;1 自定义权限;2 本部门;3 本部门及以下;4 仅自己;9 全部; + + + + + 是否激活 + + + + + 创建ID + + + + + 创建者 + + + + + 创建时间 + + + + + 修改ID + + + + + 修改者 + + + + + 修改时间 + + + + + 按钮跟权限关联表 + + + + + 获取或设置是否禁用,逻辑上的删除,非物理删除 + + + + + 创建ID + + + + + 创建者 + + + + + 创建时间 + + + + + 修改ID + + + + + 修改者 + + + + + 修改时间 + + + + + 状态
+ 中立字段,某些表可使用某些表不使用 +
+
+ + + 中立字段,某些表可使用某些表不使用
+ 逻辑上的删除,非物理删除
+ 例如:单据删除并非直接删除 +
+
+ + + 中立字段
+ 是否内置数据 +
+
+ + + 创建ID + + + + + 创建者 + + + + + 创建时间 + + + + + 修改ID + + + + + 更新者 + + + + + 修改日期 + + + + + 数据版本 + + + + + 软删除 过滤器 + + + + + 系统租户表
+ 根据TenantType 分为两种方案:
+ 1.按租户字段区分
+ 2.按租户分库
+ +
+ + 注意:
+ 使用租户Id方案,无需配置分库的连接 +
+
+ + + 名称 + + + + + 租户类型 + + + + + 数据库/租户标识 不可重复
+ 使用Id方案,可无需配置 +
+
+ + + 主机
+ 使用Id方案,可无需配置 +
+
+ + + 数据库类型
+ 使用Id方案,可无需配置 +
+
+ + + 数据库连接
+ 使用Id方案,可无需配置 +
+
+ + + 状态 + + + + + 备注 + + + + + 用户信息表 + + + + + 登录账号 + + + + + 登录密码 + + + + + 真实姓名 + + + + + 状态 + + + + + 部门 + + + + + 备注 + + + + + 创建时间 + + + + + 更新时间 + + + + + 关键业务修改时间 + + + + + 最后异常时间 + + + + + 错误次数 + + + + + 登录账号 + + + + + 租户Id + + + + + 任务日志表 + + + + + 任务ID + + + + + 任务耗时 + + + + + 执行结果(0-失败 1-成功) + + + + + 运行时间 + + + + + 结束时间 + + + + + 执行参数 + + + + + 异常信息 + + + + + 异常堆栈 + + + + + 创建ID + + + + + 创建者 + + + + + 创建时间 + + + + + 修改ID + + + + + 修改者 + + + + + 修改时间 + + + + + 任务名称 + + + + + 任务分组 + + + + + 任务计划表 + + + + + 任务名称 + + + + + 任务分组 + + + + + 任务运行时间表达式 + + + + + 任务所在DLL对应的程序集名称 + + + + + 任务所在类 + + + + + 任务描述 + + + + + 执行次数 + + + + + 开始时间 + + + + + 结束时间 + + + + + 触发器类型(0、simple 1、cron) + + + + + 执行间隔时间, 秒为单位 + + + + + 循环执行次数 + + + + + 已循环次数 + + + + + 是否启动 + + + + + 执行传参 + + + + + 创建时间 + + + + + 任务内存中的状态 + + + + + 业务数据
+ 多租户 (Id 隔离) +
+
+ + + 无需手动赋值 + + + + + 名称 + + + + + 金额 + + + + + 多租户-多表方案 业务表 子表
+
+
+ + + 多租户-多表方案 业务表
+
+
+ + + 名称 + + + + + 金额 + + + + + 多租户-多库方案 业务表
+ 公共库无需标记[MultiTenant]特性 +
+
+ + + 名称 + + + + + 金额 + + + + + 用户跟角色关联表 + + + + + 获取或设置是否禁用,逻辑上的删除,非物理删除 + + + + + 创建ID + + + + + 创建者 + + + + + 创建时间 + + + + + 修改ID + + + + + 修改者 + + + + + 修改时间 + + + + + 年级(Dto.View) + + + + + 系统用户(Dto.View) + + + + + 无任何权限 + + + + + 自定义权限 + + + + + 本部门 + + + + + 本部门及以下 + + + + + 仅自己 + + + + + 所有 + + + + + 真实表名(数据库表名,若没有填写默认实体为表名) + + + + + 表中文名 + + + + + 是否校验唯一性 + + + + + 以下model 来自ids4项目,多库模式,为了调取ids4数据 + 角色表 + + + + + 排序 + + + + + 是否激活 + + + + + 创建ID + + + + + 创建者 + + + + + 创建时间 + + + + + 修改ID + + + + + 修改者 + + + + + 修改时间 + + + + + 以下model 来自ids4项目,多库模式,为了调取ids4数据 + 用户表 + + + + + 这是爱 + + + + + id + + + + + 姓名 + + + + + 年龄 + + + + + 部门表 + + + + + 上一级(0表示无上一级) + + + + + 接口API地址信息表 + 父类 + + + + + 父ID + + + + + 路由菜单表 + + + + + 上一级菜单(0表示上一级无菜单) + + + + + 接口api + + + + + 按钮跟权限关联表 + 父类 + + + + + 角色ID + + + + + 菜单ID + + + + + api ID + + + + + ID + 泛型主键Tkey + + + + + 用户信息表 + + + + + Id + 泛型主键Tkey + + + + + 用户跟角色关联表 + 父类 + + + + + 用户ID + + + + + 角色ID + + + + + 通用分页信息类 + + + + + 当前页标 + + + + + 总页数 + + + + + 数据总数 + + + + + 每页大小 + + + + + 返回数据 + + + + + 所需分页参数 + 作者:胡丁文 + 时间:2020-4-3 20:31:26 + + + + + 当前页 + + + + + 每页大小 + + + + + 排序字段(例如:id desc,time asc) + + + + + 查询条件( 例如:id = 1 and name = 小明) + + + + + 无权限 + + + + + 找不到指定资源 + + + + + 找不到指定资源 + + + + + 服务层响应实体(泛型) + + + + + 状态码 + + + + + 操作是否成功 + + + + + 返回信息 + + + + + 开发者信息 + + + + + 返回数据集合 + + + + + 返回成功 + + 消息 + + + + + 返回成功 + + 消息 + 数据 + + + + + 返回失败 + + 消息 + + + + + 返回失败 + + 消息 + 数据 + + + + + 返回消息 + + 失败/成功 + 消息 + 数据 + + + + + 服务层响应实体 + + + + + 状态码 + + + + + 操作是否成功 + + + + + 返回信息 + + + + + 返回数据集合 + + + + + 操作成功 + + + + + + + 操作失败 + + + + + + + + 服务层分页响应实体(泛型) + + + + + 状态码 + + + + + 操作是否成功 + + + + + 返回信息 + + + + + 当前页标 + + + + + 总页数 + + + + + 数据总数 + + + + + 每页大小 + + + + + 返回数据 + + + + + 数据库读取类型 + + + + + 表格数据,支持分页 + + + + + 返回编码 + + + + + 返回信息 + + + + + 记录总数 + + + + + 返回数据集 + + + + + 租户模型接口 + + + + + 租户Id + + + + + 标识 多租户 的业务表
+ 默认设置是多库
+ 公共表无需区分 直接使用主库 各自业务在各自库中
+
+
+ + + 租户隔离方案 + + + + + Id隔离 + + + + + 库隔离 + + + + + 表隔离 + + + + + 博客信息展示类 + + + + + + + + + 创建人 + + + + + 博客标题 + + + + + 摘要 + + + + + + 上一篇 + + + + + 上一篇id + + + + + 下一篇 + + + + + 下一篇id + + + + 类别 + + + + + 内容 + + + + + + 访问量 + + + + + 评论数量 + + + + 修改时间 + + + + + + 创建时间 + + + + 备注 + + + + + + Type Description balabala + + + + + 留言信息展示类 + + + + 留言表 + + + + + 博客ID + + + + + 创建时间 + + + + + 手机 + + + + + qq + + + + + 留言内容 + + + + + ip地址 + + + + + 是否显示在前台,0否1是 + + + + + + 商户号 + + + + + 柜台号 + + + + + 分行号 + + + + + 集团商户信息 + + + + + 交易码 + + + + + 商户类型 + + + + + 终端编号 1 + + + + + 终端编号 2 + + + + + 订单号 + + + + + 码信息(一维码、二维码) + + + + + 订单金额,单位:元 + + + + + 商品名称 + + + + + 备注 1 + + + + + 备注 2 + + + + + 分账信息一 + + + + + 分账信息二 + + + + + 子商户公众账号 ID + + + + + 返回信息位图 + + + + + 实名支付 + + + + + 商品详情 + + + + + 订单优惠标记 + + + + + 公钥 + + + + + 请求地址 + + + + + 是否删除空值 + + + + + 退款参数 + + + + + 订单ID + + + + + 商品名称 + + + + + 支付金额(小数点最多两位) + + + + + 二维码/条码信息 + + + + + 备注信息1 + + + + + 备注信息2 + + + + + 订单参数 + + + + + 订单号 + + + + + 退款金额 + + + + + 退款流水号(可选) + + + + + 退款返回消息 + + + + + 序列号 + + + + + 商户号 + + + + + 交易码 + + + + + 返回码 + + + + + 返回码说明 + + + + + 语言 + + + + + 订单信息 + + + + + 订单信息 + + + + + 订单号 + + + + + 支付金额 + + + + + 退款金额 + + + + + 备注1 + + + + + 备注2 + + + + + 退款返回结果消息 + + + + + 订单号 + + + + + 支付金额 + + + + + 退款金额 + + + + + 序列号 + + + + + 商户号 + + + + + 交易码 + + + + + 返回码 + + + + + 返回码说明 + + + + + 语言 + + + + + 支付结果dto + + + + + 支付结果 + Y:成功 + N:失败 + U:不确定 + Q:待轮询 + + + + + 订单ID + + + + + 支付金额 + + + + + 二维码类型 + 1:龙支付 + 2:微信 + 3:支付宝 + 4:银联 + + + + + 等待时间-轮询等待时间 + + + + + 全局事件跟踪号-建行交易流水号 + + + + + 错误码 + + + + + 错误信息 + + + + + 验证签名-防止伪造攻击 + + + + + 返回支付结果 + + + + + 发起的订单ID + + + + + 返回支付的金额 + + + + + 返回支付的类型 1:龙支付 2:微信 3:支付宝 4:银联 + + + + + 返回建行的流水号 + + + + + 错误代码 + + + + + 错误信息 + + + + + 实现IJob的类 + + + + + 命名空间 + + + + + 类名 + + + + + 备注 + + + + + 服务器VM + + + + + 环境变量 + + + + + 系统架构 + + + + + ContentRootPath + + + + + WebRootPath + + + + + .NET Core版本 + + + + + 内存占用 + + + + + 启动时间 + + + + + 菜单展示model + + + + + 调度任务触发器信息实体 + + + + + 任务ID + + + + + 任务名称 + + + + + 任务分组 + + + + + 触发器ID + + + + + 触发器名称 + + + + + 触发器分组 + + + + + 触发器状态 + + + + + 用来测试 RestSharp Get 请求 + + + + + + + + + + + + + + + 用来测试 RestSharp Post 请求 + + + + + 留言排名展示类 + + + + 博客ID + + + + + + 评论数量 + + + + 博客标题 + + + +
+
diff --git a/Tiobon.Core/Tiobon.Core.xml b/Tiobon.Core/Tiobon.Core.xml new file mode 100644 index 00000000..eff44bd1 --- /dev/null +++ b/Tiobon.Core/Tiobon.Core.xml @@ -0,0 +1,662 @@ + + + + Tiobon.Core.Api + + + + + 登录管理【无权限】 + + + + + 构造函数注入 + + + + + + + + + + 获取JWT的方法1 + + + + + + + + 获取JWT的方法2:给Nuxt提供 + + + + + + + + 获取JWT的方法3:整个系统主要方法 + + + + + + + + 请求刷新Token(以旧换新) + + + + + + + 用户登录 + + + + + + + 用户自动登录 + + + + + + + 增删改查基础服务 + + + + + + + + + + 初始化 (注入) + + + + + 根据条件查询数据 + + 条件 + + + + + 根据Id查询数据 + + 主键ID + + + + + 新增数据 + + + + + + + 批量新增数据 + + + + + + 更新数据 + + 主键ID + + + + + + 批量更新数据 + + + + + + 删除数据 + + 主键ID + + + + + 批量删除数据 + + 主键IDs + + + + + 博客管理 + + + + + 构造函数 + + + + + + + 获取博客列表【无权限】 + + + + + + + + + + 获取博客详情 + + + + + + + 获取详情【无权限】 + + + + + + + 获取博客测试信息 v2版本 + + + + + + 添加博客【无权限】 + + + + + + + + + + + + + + 更新博客信息 + + + + + + + 删除博客 + + + + + + + apache jemeter 压力测试 + 更新接口 + + + + + + 构造函数 + + + + + 获取 整体框架 文件(主库)(一般可用第一次生成) + + + + + + 获取仓储层和服务层(需指定表名和数据库) + + 数据库链接名称 + 需要生成的表名 + + + + + 获取实体(需指定表名和数据库) + + 数据库链接名称 + 需要生成的表名 + + + + + 获取控制器(需指定表名和数据库) + + 数据库链接名称 + 需要生成的表名 + + + + + DbFrist 根据数据库表名 生成整体框架,包含Model层(一般可用第一次生成) + + 数据库链接名称 + 需要生成的表名 + + + + + 获取权限部分Map数据(从库) + 迁移到新库(主库) + + + + + + 权限数据库导出tsv + + + + + + 权限数据库导出excel + + + + + + 登录管理【无权限】 + + + + + 构造函数注入 + + + + + + + + + + + 获取JWT的方法1 + + + + + + + + 获取JWT的方法2:给Nuxt提供 + + + + + + + + 获取JWT的方法3:整个系统主要方法 + + + + + + + + 请求刷新Token(以旧换新) + + + + + + + 获取JWT的方法4:给 JSONP 测试 + + + + + + + + + + + 测试 MD5 加密字符串 + + + + + + + swagger登录 + + + + + + + weixin登录 + + + + + + 分页获取 + + + + + + + + 添加计划任务 + + + + + + + 修改计划任务 + + + + + + + 删除一个任务 + + + + + + + 启动计划任务 + + + + + + + 停止一个计划任务 + + + + + + + 暂停一个计划任务 + + + + + + + 恢复一个计划任务 + + + + + + + 重启一个计划任务 + + + + + + + 获取任务命名空间 + + + + + + 立即执行任务 + + + + + + + 获取任务运行日志 + + + + + + 任务概况 + + + + + + 年级(Controller) + + + + + 系统用户(Controller) + + + + + 缓存管理 + + + + + 获取全部缓存 + + + + + + 获取缓存 + + + + + + 新增 + + + + + + 删除全部缓存 + + + + + + 删除缓存 + + + + + + 数据库管理 + + + + + 获取库配置 + + + + + + 获取表信息 + + 配置Id + 读取类型 + + + + + 获取表字段 + + 表名 + ConfigId + 读取类型 + + + + + 编辑表备注 + + + + + + 编辑列备注 + + + + + + 动态建表 CURD + + + + + 动态type + + + + + + 动态type 继承BaseEntity + + + + + + 测试建表 + + + + + + 测试查询 + + + + + + 测试写入 + + + + + + 全局请求验证 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Summary:全局路由权限公约 + Remarks:目的是针对不同的路由,采用不同的授权过滤器 + 如果 controller 上不加 [Authorize] 特性,默认都是 Permission 策略 + 否则,如果想特例其他授权机制的话,需要在 controller 上带上 [Authorize],然后再action上自定义授权即可,比如 [Authorize(Roles = "Admin")] + + + + + 全局权限过滤器【无效】 + + + + + 全局异常错误日志 + + + + + 自定义返回格式 + + + + + + + + 生产环境的消息 + + + + + 开发环境的消息 + + + + + 全局路由前缀公约 + + + + + 自定义路由 /api/{version}/[controler]/[action] + + + + + 分组名称,是来实现接口 IApiDescriptionGroupNameProvider + + + + + 自定义路由构造函数,继承基类路由 + + + + + + 自定义版本+路由构造函数,继承基类路由 + + + + + +