增加对数据库自动生成主键的支持;

优化基础业务类结构;
This commit is contained in:
yubaolee 2021-03-13 23:45:10 +08:00
parent f652d533aa
commit 127d86616f
28 changed files with 150 additions and 122 deletions

View File

@ -13,7 +13,7 @@ namespace OpenAuth.App
/// <summary>
/// 分类管理
/// </summary>
public class AppManager : BaseApp<Application,OpenAuthDBContext>
public class AppManager : BaseStringApp<Application,OpenAuthDBContext>
{
public void Add(Application Application)
{

View File

@ -28,7 +28,7 @@ namespace OpenAuth.App
/// <summary>
/// 普通用户授权策略
/// </summary>
public class NormalAuthStrategy :BaseApp<User,OpenAuthDBContext>, IAuthStrategy
public class NormalAuthStrategy :BaseStringApp<User,OpenAuthDBContext>, IAuthStrategy
{
protected User _user;

View File

@ -30,7 +30,7 @@ namespace OpenAuth.App
/// <para>超级管理员权限</para>
/// <para>超级管理员使用guid.empty为ID可以根据需要修改</para>
/// </summary>
public class SystemAuthStrategy : BaseApp<User,OpenAuthDBContext>, IAuthStrategy
public class SystemAuthStrategy : BaseStringApp<User,OpenAuthDBContext>, IAuthStrategy
{
protected User _user;
private DbExtension _dbExtension;

View File

@ -9,12 +9,7 @@ using OpenAuth.Repository.Interface;
namespace OpenAuth.App
{
/// <summary>
/// 业务层基类UnitWork用于事务操作Repository用于普通的数据库操作
/// <para>如用户管理Class UserManagerApp:BaseApp<User></para>
/// </summary>
/// <typeparam name="T"></typeparam>
public class BaseApp<T, TDbContext> where T : StringEntity where TDbContext: DbContext
public abstract class BaseApp<T, TDbContext> where T : class where TDbContext: DbContext
{
/// <summary>
/// 用于普通的数据库操作
@ -70,21 +65,7 @@ namespace OpenAuth.App
return UnitWork.Find<T>(null).GenerateFilter(parametername,
JsonHelper.Instance.Deserialize<FilterGroup>(rule.PrivilegeRules));
}
/// <summary>
/// 按id批量删除
/// </summary>
/// <param name="ids"></param>
public virtual void Delete(string[] ids)
{
Repository.Delete(u => ids.Contains(u.Id));
}
public T Get(string id)
{
return Repository.FirstOrDefault(u => u.Id == id);
}
/// <summary>
/// 计算实体更新的层级信息
/// </summary>

View File

@ -0,0 +1,41 @@
using System;
using System.Linq;
using Infrastructure;
using Microsoft.EntityFrameworkCore;
using OpenAuth.App.Interface;
using OpenAuth.Repository.Core;
using OpenAuth.Repository.Domain;
using OpenAuth.Repository.Interface;
namespace OpenAuth.App
{
/// <summary>
/// 数据库Id为numberic且为数据库自动生成的业务类型
/// <para>该场景通常为SqlServer的自动增长类型和Oracle自带的Sequence</para>
/// 业务层基类UnitWork用于事务操作Repository用于普通的数据库操作
/// </summary>
/// <typeparam name="T"></typeparam>
public class BaseIntAutoGenApp<T, TDbContext> :BaseApp<T,TDbContext> where T : IntAutoGenEntity where TDbContext: DbContext
{
public BaseIntAutoGenApp(IUnitWork<TDbContext> unitWork, IRepository<T,TDbContext> repository, IAuth auth) : base(unitWork, repository, auth)
{
UnitWork = unitWork;
Repository = repository;
_auth = auth;
}
/// <summary>
/// 按id批量删除
/// </summary>
/// <param name="ids"></param>
public void Delete(int[] ids)
{
Repository.Delete(u => ids.Contains(u.Id));
}
public T Get(int id)
{
return Repository.FirstOrDefault(u => u.Id == id);
}
}
}

View File

@ -12,10 +12,9 @@ namespace OpenAuth.App
/// <summary>
/// ⭐⭐数据库Id为numberic类型的数据表相关业务使用该基类⭐⭐
/// 业务层基类UnitWork用于事务操作Repository用于普通的数据库操作
/// <para>如用户管理Class UserManagerApp:BaseApp<User></para>
/// </summary>
/// <typeparam name="T"></typeparam>
public class BaseLongApp<T, TDbContext> where T : LongEntity where TDbContext: DbContext
public class BaseLongApp<T, TDbContext> :BaseApp<T,TDbContext> where T : LongEntity where TDbContext: DbContext
{
/// <summary>
/// 用于普通的数据库操作
@ -30,53 +29,19 @@ namespace OpenAuth.App
protected IAuth _auth;
public BaseLongApp(IUnitWork<TDbContext> unitWork, IRepository<T,TDbContext> repository, IAuth auth)
public BaseLongApp(IUnitWork<TDbContext> unitWork, IRepository<T,TDbContext> repository, IAuth auth) : base(unitWork, repository,auth)
{
UnitWork = unitWork;
Repository = repository;
_auth = auth;
}
/// <summary>
/// 获取当前登录用户的数据访问权限
/// </summary>
/// <param name=""parameterName>linq表达式参数的名称如u=>u.name中的"u"</param>
/// <returns></returns>
protected IQueryable<T> GetDataPrivilege(string parametername)
{
var loginUser = _auth.GetCurrentUser();
if (loginUser.User.Account == Define.SYSTEM_USERNAME) return UnitWork.Find<T>(null); //超级管理员特权
var moduleName = typeof(T).Name;
var rule = UnitWork.FirstOrDefault<DataPrivilegeRule>(u => u.SourceCode == moduleName);
if (rule == null) return UnitWork.Find<T>(null); //没有设置数据规则,那么视为该资源允许被任何主体查看
if (rule.PrivilegeRules.Contains(Define.DATAPRIVILEGE_LOGINUSER) ||
rule.PrivilegeRules.Contains(Define.DATAPRIVILEGE_LOGINROLE)||
rule.PrivilegeRules.Contains(Define.DATAPRIVILEGE_LOGINORG))
{
//即把{loginUser} =='xxxxxxx'换为 loginUser.User.Id =='xxxxxxx'从而把当前登录的用户名与当时设计规则时选定的用户id对比
rule.PrivilegeRules = rule.PrivilegeRules.Replace(Define.DATAPRIVILEGE_LOGINUSER, loginUser.User.Id);
var roles = loginUser.Roles.Select(u => u.Id).ToList();
roles.Sort(); //按字母排序,这样可以进行like操作
rule.PrivilegeRules = rule.PrivilegeRules.Replace(Define.DATAPRIVILEGE_LOGINROLE,
string.Join(',',roles));
var orgs = loginUser.Orgs.Select(u => u.Id).ToList();
orgs.Sort();
rule.PrivilegeRules = rule.PrivilegeRules.Replace(Define.DATAPRIVILEGE_LOGINORG,
string.Join(',',orgs));
}
return UnitWork.Find<T>(null).GenerateFilter(parametername,
JsonHelper.Instance.Deserialize<FilterGroup>(rule.PrivilegeRules));
}
/// <summary>
/// 按id批量删除
/// </summary>
/// <param name="ids"></param>
public virtual void Delete(long[] ids)
public void Delete(long[] ids)
{
Repository.Delete(u => ids.Contains(u.Id));
}
@ -85,44 +50,5 @@ namespace OpenAuth.App
{
return Repository.FirstOrDefault(u => u.Id == id);
}
/// <summary>
/// 计算实体更新的层级信息
/// </summary>
/// <typeparam name="U">U必须是一个继承TreeEntity的结构</typeparam>
/// <param name="entity"></param>
public void CaculateCascade<U>(U entity) where U : TreeEntity
{
if (entity.ParentId == "") entity.ParentId = null;
string cascadeId;
int currentCascadeId = 1; //当前结点的级联节点最后一位
var sameLevels = UnitWork.Find<U>(o => o.ParentId == entity.ParentId && o.Id != entity.Id);
foreach (var obj in sameLevels)
{
int objCascadeId = int.Parse(obj.CascadeId.TrimEnd('.').Split('.').Last());
if (currentCascadeId <= objCascadeId) currentCascadeId = objCascadeId + 1;
}
if (!string.IsNullOrEmpty(entity.ParentId))
{
var parentOrg = UnitWork.FirstOrDefault<U>(o => o.Id == entity.ParentId);
if (parentOrg != null)
{
cascadeId = parentOrg.CascadeId + currentCascadeId + ".";
entity.ParentName = parentOrg.Name;
}
else
{
throw new Exception("未能找到该组织的父节点信息");
}
}
else
{
cascadeId = ".0." + currentCascadeId + ".";
entity.ParentName = "根节点";
}
entity.CascadeId = cascadeId;
}
}
}

View File

@ -0,0 +1,54 @@
using System;
using System.Linq;
using Infrastructure;
using Microsoft.EntityFrameworkCore;
using OpenAuth.App.Interface;
using OpenAuth.Repository.Core;
using OpenAuth.Repository.Domain;
using OpenAuth.Repository.Interface;
namespace OpenAuth.App
{
/// <summary>
/// 业务层基类UnitWork用于事务操作Repository用于普通的数据库操作
/// <para>如用户管理Class UserManagerApp:BaseApp<User></para>
/// </summary>
/// <typeparam name="T"></typeparam>
public class BaseStringApp<T, TDbContext> :BaseApp<T,TDbContext> where T : StringEntity where TDbContext: DbContext
{
/// <summary>
/// 用于普通的数据库操作
/// </summary>
protected IRepository<T, TDbContext> Repository;
/// <summary>
/// 用于事务操作
/// <para>使用详见http://doc.openauth.me/core/unitwork.html</para>
/// </summary>
protected IUnitWork<TDbContext> UnitWork;
protected IAuth _auth;
public BaseStringApp(IUnitWork<TDbContext> unitWork, IRepository<T,TDbContext> repository, IAuth auth) : base(unitWork, repository, auth)
{
UnitWork = unitWork;
Repository = repository;
_auth = auth;
}
/// <summary>
/// 按id批量删除
/// </summary>
/// <param name="ids"></param>
public virtual void Delete(string[] ids)
{
Repository.Delete(u => ids.Contains(u.Id));
}
public T Get(string id)
{
return Repository.FirstOrDefault(u => u.Id == id);
}
}
}

View File

@ -10,7 +10,7 @@ namespace OpenAuth.App
/// 树状结构处理
/// </summary>
/// <typeparam name="T"></typeparam>
public class BaseTreeApp<T,TDbContext> :BaseApp<T,TDbContext> where T : TreeEntity where TDbContext :DbContext
public class BaseTreeApp<T,TDbContext> :BaseStringApp<T,TDbContext> where T : TreeEntity where TDbContext :DbContext
{

View File

@ -24,7 +24,7 @@ using OpenAuth.Repository.Interface;
namespace OpenAuth.App
{
public class BuilderTableApp : BaseApp<BuilderTable,OpenAuthDBContext>
public class BuilderTableApp : BaseStringApp<BuilderTable,OpenAuthDBContext>
{
private BuilderTableColumnApp _builderTableColumnApp;
private CategoryApp _categoryApp;

View File

@ -13,7 +13,7 @@ using OpenAuth.Repository.Interface;
namespace OpenAuth.App
{
public class BuilderTableColumnApp : BaseApp<BuilderTableColumn,OpenAuthDBContext>
public class BuilderTableColumnApp : BaseStringApp<BuilderTableColumn,OpenAuthDBContext>
{
public BuilderTableColumnApp(IUnitWork<OpenAuthDBContext> unitWork, IRepository<BuilderTableColumn,OpenAuthDBContext> repository,
IAuth auth) : base(unitWork, repository,auth)

View File

@ -13,7 +13,7 @@ using OpenAuth.Repository.Interface;
namespace OpenAuth.App
{
public class CategoryApp : BaseApp<Category,OpenAuthDBContext>
public class CategoryApp : BaseStringApp<Category,OpenAuthDBContext>
{
/// <summary>
/// 加载列表

View File

@ -13,7 +13,7 @@ using OpenAuth.Repository.Interface;
namespace OpenAuth.App
{
public class CategoryTypeApp : BaseApp<CategoryType,OpenAuthDBContext>
public class CategoryTypeApp : BaseStringApp<CategoryType,OpenAuthDBContext>
{
private RevelanceManagerApp _revelanceApp;

View File

@ -12,7 +12,7 @@ using OpenAuth.Repository.Interface;
namespace OpenAuth.App
{
public class DataPrivilegeRuleApp : BaseApp<DataPrivilegeRule,OpenAuthDBContext>
public class DataPrivilegeRuleApp : BaseStringApp<DataPrivilegeRule,OpenAuthDBContext>
{
private RevelanceManagerApp _revelanceApp;
/// <summary>

View File

@ -21,7 +21,7 @@ namespace OpenAuth.App
/// <summary>
/// 文件管理
/// </summary>
public class FileApp : BaseApp<UploadFile,OpenAuthDBContext>
public class FileApp : BaseStringApp<UploadFile,OpenAuthDBContext>
{
private ILogger<FileApp> _logger;
private string _filePath;

View File

@ -33,7 +33,7 @@ namespace OpenAuth.App
/// <summary>
/// 工作流实例表操作
/// </summary>
public class FlowInstanceApp : BaseApp<FlowInstance,OpenAuthDBContext>
public class FlowInstanceApp : BaseStringApp<FlowInstance,OpenAuthDBContext>
{
private RevelanceManagerApp _revelanceApp;
private FlowSchemeApp _flowSchemeApp;

View File

@ -10,7 +10,7 @@ using OpenAuth.Repository.Interface;
namespace OpenAuth.App
{
public class FlowSchemeApp :BaseApp<FlowScheme,OpenAuthDBContext>
public class FlowSchemeApp :BaseStringApp<FlowScheme,OpenAuthDBContext>
{
public void Add(FlowScheme flowScheme)
{

View File

@ -13,7 +13,7 @@ using OpenAuth.Repository.Interface;
namespace OpenAuth.App
{
public class FormApp : BaseApp<Form,OpenAuthDBContext>
public class FormApp : BaseStringApp<Form,OpenAuthDBContext>
{
private IAuth _auth;
private IOptions<AppSetting> _appConfiguration;

View File

@ -10,7 +10,7 @@ using OpenAuth.Repository.Interface;
namespace OpenAuth.App
{
public class FrmLeaveReqApp : BaseApp<FrmLeaveReq,OpenAuthDBContext>, ICustomerForm
public class FrmLeaveReqApp : BaseStringApp<FrmLeaveReq,OpenAuthDBContext>, ICustomerForm
{
private RevelanceManagerApp _revelanceApp;

View File

@ -16,7 +16,7 @@ using Quartz;
namespace OpenAuth.App
{
public class OpenJobApp : BaseApp<OpenJob, OpenAuthDBContext>
public class OpenJobApp : BaseStringApp<OpenJob, OpenAuthDBContext>
{
private SysLogApp _sysLogApp;
private IScheduler _scheduler;

View File

@ -15,7 +15,7 @@ namespace OpenAuth.App
/// <summary>
/// 分类管理
/// </summary>
public class ResourceApp:BaseApp<Resource,OpenAuthDBContext>
public class ResourceApp:BaseStringApp<Resource,OpenAuthDBContext>
{
private RevelanceManagerApp _revelanceApp;

View File

@ -11,7 +11,7 @@ using OpenAuth.Repository.Interface;
namespace OpenAuth.App
{
public class RevelanceManagerApp : BaseApp<Relevance,OpenAuthDBContext>
public class RevelanceManagerApp : BaseStringApp<Relevance,OpenAuthDBContext>
{
private readonly ILogger<RevelanceManagerApp> _logger;
public RevelanceManagerApp(IUnitWork<OpenAuthDBContext> unitWork, IRepository<Relevance,OpenAuthDBContext> repository, IAuth auth, ILogger<RevelanceManagerApp> logger) : base(unitWork,

View File

@ -11,7 +11,7 @@ using OpenAuth.Repository;
namespace OpenAuth.App
{
public class RoleApp : BaseApp<Role,OpenAuthDBContext>
public class RoleApp : BaseStringApp<Role,OpenAuthDBContext>
{
private RevelanceManagerApp _revelanceApp;

View File

@ -10,7 +10,7 @@ using OpenAuth.Repository.Interface;
namespace OpenAuth.App
{
public class SysLogApp : BaseApp<SysLog,OpenAuthDBContext>
public class SysLogApp : BaseStringApp<SysLog,OpenAuthDBContext>
{
/// <summary>

View File

@ -11,7 +11,7 @@ using OpenAuth.Repository.Interface;
namespace OpenAuth.App
{
public class SysMessageApp : BaseApp<SysMessage,OpenAuthDBContext>
public class SysMessageApp : BaseStringApp<SysMessage,OpenAuthDBContext>
{
private RevelanceManagerApp _revelanceApp;

View File

@ -15,7 +15,7 @@ using OpenAuth.Repository.Interface;
namespace OpenAuth.App
{
public class UserManagerApp : BaseApp<User,OpenAuthDBContext>
public class UserManagerApp : BaseStringApp<User,OpenAuthDBContext>
{
private RevelanceManagerApp _revelanceApp;
private OrgManagerApp _orgManagerApp;

View File

@ -12,7 +12,7 @@ using OpenAuth.Repository.Interface;
namespace OpenAuth.App
{
public class WmsInboundOrderDtblApp : BaseApp<WmsInboundOrderDtbl,OpenAuthDBContext>
public class WmsInboundOrderDtblApp : BaseStringApp<WmsInboundOrderDtbl,OpenAuthDBContext>
{
private RevelanceManagerApp _revelanceApp;
private DbExtension _dbExtension;

View File

@ -12,7 +12,7 @@ using OpenAuth.Repository.Interface;
namespace OpenAuth.App
{
public class WmsInboundOrderTblApp : BaseApp<WmsInboundOrderTbl,OpenAuthDBContext>
public class WmsInboundOrderTblApp : BaseStringApp<WmsInboundOrderTbl,OpenAuthDBContext>
{
private RevelanceManagerApp _revelanceApp;
private WmsInboundOrderDtblApp _wmsInboundOrderDtblApp;

View File

@ -0,0 +1,26 @@
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace OpenAuth.Repository.Core
{
/// <summary>
/// 数据库Id为numberic且为数据库自动生成的数据实体使用该基类用法同Entity
/// <para>该场景通常为SqlServer的自动增长类型和Oracle自带的Sequence</para>
/// </summary>
public class IntAutoGenEntity :BaseEntity
{
[Browsable(false)]
[Key,DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public override bool KeyIsNull()
{
return Id == 0;
}
public override void GenerateDefaultKeyVal()
{
//主键自动增长类型,可以不用该方法生成主键,设置该方法为空方法即可
}
}
}