diff --git a/.gitignore b/.gitignore index e1026774..50f8f8ef 100644 --- a/.gitignore +++ b/.gitignore @@ -1,36 +1,264 @@ -################################################################################ -# 此 .gitignore 文件已由 Microsoft(R) Visual Studio 自动创建。 -################################################################################ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. -/OpenAuth.Mvc/bin -/OpenAuth.Repository/bin/Debug -/OpenAuth.Repository/obj/Debug -/OpenAuth.UnitTest/bin/Debug -/OpenAuth.UnitTest/obj/Debug -/OpenAuth.WebApi/bin -/OpenAuth.WebTest/bin -/OpenAuth.WebTest/obj/Debug -/packages -/OpenAuth.WebApi/obj/Debug -/OpenAuth.Mvc/log -/OpenAuth.Mvc/obj/Debug +# User-specific files +*.suo *.user -/OpenAuth.Domain/obj/Debug -/OpenAuth.App/obj/Debug -/OpenAuth.Domain/bin/Debug -/OpenAuth.App/bin -/Infrastructure/bin/Debug -/Infrastructure/obj/Debug -/.vs -/OpenAuth.sln.GhostDoc.xml -/类结构.mdj -/数据库设计关系图/OpenAuthDB.pdb -/OpenAuth.WebTest/obj/Release -/OpenAuth.UnitTest/obj/Release -/OpenAuth.WebApi/obj/Release -/OpenAuth.Repository/bin/Release -/OpenAuth.Repository/obj/Release -/OpenAuth.Mvc/obj/Release -/OpenAuth.App/obj/Release -/Infrastructure/bin/Release -/Infrastructure/obj/Release +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ + +# Visual Studio 2015 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# DNX +project.lock.json +project.fragment.lock.json +artifacts/ + +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# TODO: Comment the next line if you want to checkin your web deploy settings +# but database connection strings (with potential passwords) will be unencrypted +#*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/packages/* +# except build/, which is used as an MSBuild target. +!**/packages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/packages/repositories.config +# NuGet v3's project.json files produces more ignoreable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +node_modules/ +orleans.codegen.cs + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +*.mdf +*.ldf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# JetBrains Rider +.idea/ +*.sln.iml + +# CodeRush +.cr/ + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc +/OpenAuth.Mvc/Properties/PublishProfiles +*.pubxml +/OpenAuth.WebApi/temp-keys diff --git a/OpenAuth.App/AppManager.cs b/OpenAuth.App/AppManager.cs index 8332c5e6..f200e689 100644 --- a/OpenAuth.App/AppManager.cs +++ b/OpenAuth.App/AppManager.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using OpenAuth.App.Interface; using OpenAuth.App.Request; using OpenAuth.Repository.Domain; @@ -28,7 +29,7 @@ namespace OpenAuth.App } - public List GetList(QueryAppListReq request) + public async Task> GetList(QueryAppListReq request) { var applications = UnitWork.Find(null) ; diff --git a/OpenAuth.App/AuthContextFactory.cs b/OpenAuth.App/AuthContextFactory.cs index c897472b..8952e951 100644 --- a/OpenAuth.App/AuthContextFactory.cs +++ b/OpenAuth.App/AuthContextFactory.cs @@ -50,7 +50,7 @@ namespace OpenAuth.App else { service = _normalAuthStrategy; - service.User = _unitWork.FindSingle(u => u.Account == username); + service.User = _unitWork.FirstOrDefault(u => u.Account == username); } return new AuthStrategyContext(service); diff --git a/OpenAuth.App/BaseApp.cs b/OpenAuth.App/BaseApp.cs index f0525be9..173361b1 100644 --- a/OpenAuth.App/BaseApp.cs +++ b/OpenAuth.App/BaseApp.cs @@ -18,13 +18,12 @@ namespace OpenAuth.App /// /// 用于普通的数据库操作 /// - /// The repository. protected IRepository Repository; /// /// 用于事务操作 + /// 使用详见:http://doc.openauth.me/core/unitwork.html /// - /// The unit work. protected IUnitWork UnitWork; protected IAuth _auth; @@ -47,7 +46,7 @@ namespace OpenAuth.App if (loginUser.User.Account == Define.SYSTEM_USERNAME) return UnitWork.Find(null); //超级管理员特权 var moduleName = typeof(T).Name; - var rule = UnitWork.FindSingle(u => u.SourceCode == moduleName); + var rule = UnitWork.FirstOrDefault(u => u.SourceCode == moduleName); if (rule == null) return UnitWork.Find(null); //没有设置数据规则,那么视为该资源允许被任何主体查看 if (rule.PrivilegeRules.Contains(Define.DATAPRIVILEGE_LOGINUSER) || rule.PrivilegeRules.Contains(Define.DATAPRIVILEGE_LOGINROLE)|| @@ -82,7 +81,7 @@ namespace OpenAuth.App public T Get(string id) { - return Repository.FindSingle(u => u.Id == id); + return Repository.FirstOrDefault(u => u.Id == id); } /// @@ -104,7 +103,7 @@ namespace OpenAuth.App if (!string.IsNullOrEmpty(entity.ParentId)) { - var parentOrg = UnitWork.FindSingle(o => o.Id == entity.ParentId); + var parentOrg = UnitWork.FirstOrDefault(o => o.Id == entity.ParentId); if (parentOrg != null) { cascadeId = parentOrg.CascadeId + currentCascadeId + "."; diff --git a/OpenAuth.App/BaseTreeApp.cs b/OpenAuth.App/BaseTreeApp.cs index f6383c73..31297c99 100644 --- a/OpenAuth.App/BaseTreeApp.cs +++ b/OpenAuth.App/BaseTreeApp.cs @@ -29,7 +29,7 @@ namespace OpenAuth.App CaculateCascade(obj); //获取旧的的CascadeId - var cascadeId = Repository.FindSingle(o => o.Id == obj.Id).CascadeId; + var cascadeId = Repository.FirstOrDefault(o => o.Id == obj.Id).CascadeId; //根据CascadeId查询子部门 var objs = Repository.Find(u => u.CascadeId.Contains(cascadeId) && u.Id != obj.Id) .OrderBy(u => u.CascadeId).ToList(); diff --git a/OpenAuth.App/BuilderTableApp.cs b/OpenAuth.App/BuilderTableApp.cs index 9f03c85a..56f7a926 100644 --- a/OpenAuth.App/BuilderTableApp.cs +++ b/OpenAuth.App/BuilderTableApp.cs @@ -6,6 +6,7 @@ using System.Linq; using System.Reflection; using System.Runtime.Loader; using System.Text; +using System.Threading.Tasks; using Infrastructure; using Infrastructure.Extensions; using Infrastructure.Helpers; @@ -76,7 +77,7 @@ namespace OpenAuth.App /// /// 加载列表 /// - public TableResp Load(QueryBuilderTableListReq request) + public async Task> Load(QueryBuilderTableListReq request) { var loginContext = _auth.GetCurrentUser(); if (loginContext == null) @@ -192,9 +193,12 @@ namespace OpenAuth.App /// public void DelTableAndcolumns(string[] ids) { - UnitWork.Delete(u => ids.Contains(u.Id)); - UnitWork.Delete(u => ids.Contains(u.TableId)); - UnitWork.Save(); + UnitWork.ExecuteWithTransaction(() => + { + UnitWork.Delete(u => ids.Contains(u.Id)); + UnitWork.Delete(u => ids.Contains(u.TableId)); + UnitWork.Save(); + }); } @@ -204,7 +208,7 @@ namespace OpenAuth.App /// public void CreateEntity(CreateEntityReq req) { - var sysTableInfo = Repository.FindSingle(u => u.Id == req.Id); + var sysTableInfo = Repository.FirstOrDefault(u => u.Id == req.Id); var tableColumns = _builderTableColumnApp.Find(req.Id); if (sysTableInfo == null || tableColumns == null @@ -223,7 +227,7 @@ namespace OpenAuth.App /// public void CreateBusiness(CreateBusiReq req) { - var sysTableInfo = Repository.FindSingle(u => u.Id == req.Id); + var sysTableInfo = Repository.FirstOrDefault(u => u.Id == req.Id); var tableColumns = _builderTableColumnApp.Find(req.Id); if (sysTableInfo == null || tableColumns == null @@ -512,7 +516,7 @@ namespace OpenAuth.App { throw new Exception("请提供vue项目的根目录,如:C:\\OpenAuth.Pro\\Client"); } - var sysTableInfo = Repository.FindSingle(u => u.Id == req.Id); + var sysTableInfo = Repository.FirstOrDefault(u => u.Id == req.Id); var tableColumns = _builderTableColumnApp.Find(req.Id); if (sysTableInfo == null || tableColumns == null @@ -617,7 +621,7 @@ namespace OpenAuth.App .Replace("{Temp}", tempBuilder.ToString()) .Replace("{DialogFormItem}", dialogStrBuilder.ToString()); - FileHelper.WriteFile(Path.Combine(req.VueProjRootPath, $"src/views/{sysTableInfo.ClassName.ToCamelCase()}s/"), + FileHelper.WriteFile(Path.Combine(req.VueProjRootPath, $"src/views/{sysTableInfo.ClassName.ToLower()}s/"), $"index.vue", domainContent); } @@ -633,7 +637,7 @@ namespace OpenAuth.App { throw new Exception("请提供vue项目的根目录,如:C:\\OpenAuth.Pro\\Client"); } - var sysTableInfo = Repository.FindSingle(u => u.Id == req.Id); + var sysTableInfo = Repository.FirstOrDefault(u => u.Id == req.Id); var tableColumns = _builderTableColumnApp.Find(req.Id); if (sysTableInfo == null || tableColumns == null diff --git a/OpenAuth.App/BuilderTableColumnApp.cs b/OpenAuth.App/BuilderTableColumnApp.cs index 679182dc..8b7994a8 100644 --- a/OpenAuth.App/BuilderTableColumnApp.cs +++ b/OpenAuth.App/BuilderTableColumnApp.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using Infrastructure; using OpenAuth.App.Interface; using OpenAuth.App.Request; @@ -21,7 +22,7 @@ namespace OpenAuth.App /// /// 加载列表 /// - public TableResp Load(QueryBuilderTableColumnListReq request) + public async Task> Load(QueryBuilderTableColumnListReq request) { if (string.IsNullOrEmpty(request.BuilderTableId)) { diff --git a/OpenAuth.App/CategoryApp.cs b/OpenAuth.App/CategoryApp.cs index 4803fb1e..8b3a1537 100644 --- a/OpenAuth.App/CategoryApp.cs +++ b/OpenAuth.App/CategoryApp.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using Infrastructure; using OpenAuth.App.Interface; using OpenAuth.App.Request; @@ -16,7 +17,7 @@ namespace OpenAuth.App /// /// 加载列表 /// - public TableData Load(QueryCategoryListReq request) + public async Task Load(QueryCategoryListReq request) { var loginContext = _auth.GetCurrentUser(); if (loginContext == null) diff --git a/OpenAuth.App/CategoryTypeApp.cs b/OpenAuth.App/CategoryTypeApp.cs index 69b3be71..f75544d7 100644 --- a/OpenAuth.App/CategoryTypeApp.cs +++ b/OpenAuth.App/CategoryTypeApp.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using Infrastructure; using OpenAuth.App.Interface; using OpenAuth.App.Request; @@ -18,7 +19,7 @@ namespace OpenAuth.App /// /// 加载列表 /// - public TableData Load(QueryCategoryTypeListReq request) + public async Task Load(QueryCategoryTypeListReq request) { var result = new TableData(); var objs = UnitWork.Find(null); @@ -56,9 +57,13 @@ namespace OpenAuth.App public new void Delete(string[] ids) { - UnitWork.Delete(u=>ids.Contains(u.Id)); - UnitWork.Delete(u=>ids.Contains(u.TypeId)); - UnitWork.Save(); + UnitWork.ExecuteWithTransaction(() => + { + UnitWork.Delete(u=>ids.Contains(u.Id)); + UnitWork.Delete(u=>ids.Contains(u.TypeId)); + UnitWork.Save(); + }); + } public List AllTypes() diff --git a/OpenAuth.App/DataPrivilegeRuleApp.cs b/OpenAuth.App/DataPrivilegeRuleApp.cs index c762167f..9e3353ae 100644 --- a/OpenAuth.App/DataPrivilegeRuleApp.cs +++ b/OpenAuth.App/DataPrivilegeRuleApp.cs @@ -1,5 +1,6 @@ using System; using System.Linq; +using System.Threading.Tasks; using Infrastructure; using OpenAuth.App.Interface; using OpenAuth.App.Request; @@ -16,7 +17,7 @@ namespace OpenAuth.App /// /// 加载列表 /// - public TableData Load(QueryDataPrivilegeRuleListReq request) + public async Task Load(QueryDataPrivilegeRuleListReq request) { var loginContext = _auth.GetCurrentUser(); if (loginContext == null) @@ -51,7 +52,7 @@ namespace OpenAuth.App public void Add(AddOrUpdateDataPriviReq req) { - if (Repository.IsExist(u => u.SourceCode == req.SourceCode)) + if (Repository.Any(u => u.SourceCode == req.SourceCode)) { throw new Exception($"已经存在{req.SourceCode}的数据规则,如果想调整规制请直接修改"); } @@ -85,7 +86,7 @@ namespace OpenAuth.App public DataPrivilegeRule GetByModuleName(string moduleName) { - return Repository.FindSingle(u=>u.SourceCode == moduleName); + return Repository.FirstOrDefault(u=>u.SourceCode == moduleName); } public void Clear() diff --git a/OpenAuth.App/DbExtension.cs b/OpenAuth.App/DbExtension.cs index e77289e4..d1003c1c 100644 --- a/OpenAuth.App/DbExtension.cs +++ b/OpenAuth.App/DbExtension.cs @@ -134,7 +134,7 @@ namespace OpenAuth.App END AS EntityType, case WHEN CHARACTER_MAXIMUM_LENGTH>8000 THEN 0 ELSE CHARACTER_MAXIMUM_LENGTH end AS Maxlength, CASE - WHEN COLUMN_KEY <> '' THEN + WHEN COLUMN_KEY = 'PRI' THEN 1 ELSE 0 END AS IsKey, CASE diff --git a/OpenAuth.App/FlowInstanceApp.cs b/OpenAuth.App/FlowInstanceApp.cs index d010ff3f..78dbbfcb 100644 --- a/OpenAuth.App/FlowInstanceApp.cs +++ b/OpenAuth.App/FlowInstanceApp.cs @@ -24,6 +24,7 @@ using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Net.Http; +using System.Threading.Tasks; using Infrastructure.Helpers; namespace OpenAuth.App @@ -472,7 +473,7 @@ namespace OpenAuth.App Repository.Update(flowScheme); } - public TableData Load(QueryFlowInstanceListReq request) + public async Task Load(QueryFlowInstanceListReq request) { var result = new TableData(); var user = _auth.GetCurrentUser(); diff --git a/OpenAuth.App/FlowSchemeApp.cs b/OpenAuth.App/FlowSchemeApp.cs index 562409c0..ed166723 100644 --- a/OpenAuth.App/FlowSchemeApp.cs +++ b/OpenAuth.App/FlowSchemeApp.cs @@ -1,5 +1,6 @@ using System; using System.Linq; +using System.Threading.Tasks; using OpenAuth.App.Interface; using OpenAuth.App.Request; using OpenAuth.App.Response; @@ -12,7 +13,7 @@ namespace OpenAuth.App { public void Add(FlowScheme flowScheme) { - if (Repository.IsExist(u => u.SchemeName == flowScheme.SchemeName)) + if (Repository.Any(u => u.SchemeName == flowScheme.SchemeName)) { throw new Exception("流程名称已经存在"); } @@ -25,12 +26,12 @@ namespace OpenAuth.App public FlowScheme FindByCode(string code) { - return Repository.FindSingle(u => u.SchemeCode == code); + return Repository.FirstOrDefault(u => u.SchemeCode == code); } public void Update(FlowScheme flowScheme) { - if (Repository.IsExist(u => u.SchemeName == flowScheme.SchemeName && u.Id != flowScheme.Id)) + if (Repository.Any(u => u.SchemeName == flowScheme.SchemeName && u.Id != flowScheme.Id)) { throw new Exception("流程名称已经存在"); } @@ -48,7 +49,7 @@ namespace OpenAuth.App }); } - public TableData Load(QueryFlowSchemeListReq request) + public async Task Load(QueryFlowSchemeListReq request) { var result = new TableData(); var objs = GetDataPrivilege("u"); diff --git a/OpenAuth.App/FormApp.cs b/OpenAuth.App/FormApp.cs index 57ae53e1..8f7d1ae6 100644 --- a/OpenAuth.App/FormApp.cs +++ b/OpenAuth.App/FormApp.cs @@ -1,5 +1,6 @@ using System; using System.Linq; +using System.Threading.Tasks; using Infrastructure; using Microsoft.Extensions.Options; using OpenAuth.App.Interface; @@ -18,7 +19,7 @@ namespace OpenAuth.App /// /// 加载列表 /// - public TableData Load(QueryFormListReq request) + public async Task Load(QueryFormListReq request) { var result = new TableData(); var forms = GetDataPrivilege("u"); diff --git a/OpenAuth.App/FrmLeaveReqApp.cs b/OpenAuth.App/FrmLeaveReqApp.cs index 44ad8755..f64ca87a 100644 --- a/OpenAuth.App/FrmLeaveReqApp.cs +++ b/OpenAuth.App/FrmLeaveReqApp.cs @@ -1,4 +1,5 @@ -using Infrastructure; +using System.Threading.Tasks; +using Infrastructure; using OpenAuth.App.Interface; using OpenAuth.App.Request; using OpenAuth.App.Response; @@ -15,11 +16,11 @@ namespace OpenAuth.App /// /// 加载列表 /// - public TableData Load(QueryFrmLeaveReqListReq request) + public async Task Load(QueryFrmLeaveReqListReq request) { return new TableData { - count = Repository.GetCount(null), + count = Repository.Count(null), data = Repository.Find(request.page, request.limit, "Id desc") }; } diff --git a/OpenAuth.App/ModuleManagerApp.cs b/OpenAuth.App/ModuleManagerApp.cs index cee93922..e224a864 100644 --- a/OpenAuth.App/ModuleManagerApp.cs +++ b/OpenAuth.App/ModuleManagerApp.cs @@ -8,9 +8,10 @@ using OpenAuth.Repository.Interface; namespace OpenAuth.App { - public class ModuleManagerApp :BaseTreeApp + public class ModuleManagerApp : BaseTreeApp { private RevelanceManagerApp _revelanceApp; + public void Add(Module model) { var loginContext = _auth.GetCurrentUser(); @@ -18,20 +19,22 @@ namespace OpenAuth.App { throw new CommonException("登录已过期", Define.INVALID_TOKEN); } + CaculateCascade(model); - + Repository.Add(model); + + AddDefaultMenus(model); //当前登录用户的所有角色自动分配模块 loginContext.Roles.ForEach(u => - { + { _revelanceApp.Assign(new AssignReq { - type=Define.ROLEMODULE, + type = Define.ROLEMODULE, firstId = u.Id, - secIds = new[]{model.Id} + secIds = new[] {model.Id} }); }); - } public void Update(Module obj) @@ -40,10 +43,8 @@ namespace OpenAuth.App } - #region 用户/角色分配模块 - /// /// 加载特定角色的模块 /// @@ -67,7 +68,7 @@ namespace OpenAuth.App var query = UnitWork.Find(u => elementIds.Contains(u.Id)); if (!string.IsNullOrEmpty(moduleId)) { - query = query.Where(u => u.ModuleId == moduleId); + query = query.Where(u => u.ModuleId == moduleId); } return query; @@ -77,6 +78,7 @@ namespace OpenAuth.App #region 菜单操作 + /// /// 删除指定的菜单 /// @@ -87,6 +89,7 @@ namespace OpenAuth.App UnitWork.Save(); } + public void AddMenu(ModuleElement model) { var loginContext = _auth.GetCurrentUser(); @@ -94,21 +97,24 @@ namespace OpenAuth.App { throw new CommonException("登录已过期", Define.INVALID_TOKEN); } - UnitWork.Add(model); - - //当前登录用户的所有角色自动分配菜单 - loginContext.Roles.ForEach(u => - { - _revelanceApp.Assign(new AssignReq + + UnitWork.ExecuteWithTransaction(() => + { + UnitWork.Add(model); + + //当前登录用户的所有角色自动分配菜单 + loginContext.Roles.ForEach(u => { - type=Define.ROLEELEMENT, - firstId = u.Id, - secIds = new[]{model.Id} + _revelanceApp.Assign(new AssignReq + { + type = Define.ROLEELEMENT, + firstId = u.Id, + secIds = new[] {model.Id} + }); }); + UnitWork.Save(); }); - UnitWork.Save(); } - #endregion public void UpdateMenu(ModuleElement model) { @@ -116,8 +122,51 @@ namespace OpenAuth.App UnitWork.Save(); } + //添加默认按钮 + private void AddDefaultMenus(Module module) + { + AddMenu(new ModuleElement + { + ModuleId = module.Id, + DomId = "btnAdd", + Script = "add()", + Name = "添加", + Sort = 1, + Icon = "xinzeng", + Class = "success", + Remark = "新增" + module.Name + }); + AddMenu(new ModuleElement + { + ModuleId = module.Id, + DomId = "btnEdit", + Script = "edit()", + Name = "编辑", + Sort = 2, + Icon = "bianji-copy", + Class = "primary", + Remark = "修改" + module.Name + }); + AddMenu(new ModuleElement + { + ModuleId = module.Id, + DomId = "btnDel", + Script = "del()", + Name = "删除", + Sort = 3, + Icon = "shanchu", + Class = "danger", + Remark = "删除" + module.Name + }); + + //todo:可以自己添加更多默认按钮 + } + + #endregion + + public ModuleManagerApp(IUnitWork unitWork, IRepository repository - ,RevelanceManagerApp app,IAuth auth) : base(unitWork, repository, auth) + , RevelanceManagerApp app, IAuth auth) : base(unitWork, repository, auth) { _revelanceApp = app; } diff --git a/OpenAuth.App/OpenJobApp.cs b/OpenAuth.App/OpenJobApp.cs index fa1182c4..05d51f2d 100644 --- a/OpenAuth.App/OpenJobApp.cs +++ b/OpenAuth.App/OpenJobApp.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using Infrastructure; using Microsoft.Extensions.Logging; using OpenAuth.App.Interface; @@ -23,7 +24,7 @@ namespace OpenAuth.App /// /// 加载列表 /// - public TableData Load(QueryOpenJobListReq request) + public async Task Load(QueryOpenJobListReq request) { var result = new TableData(); var objs = Repository.Find(null); @@ -86,7 +87,7 @@ namespace OpenAuth.App public void ChangeJobStatus(ChangeJobStatusReq req) { - var job = Repository.FindSingle(u => u.Id == req.Id); + var job = Repository.FirstOrDefault(u => u.Id == req.Id); if (job == null) { throw new Exception("任务不存在"); @@ -140,7 +141,7 @@ namespace OpenAuth.App /// public void RecordRun(string jobId) { - var job = Repository.FindSingle(u =>u.Id == jobId); + var job = Repository.FirstOrDefault(u =>u.Id == jobId); if (job == null) { _sysLogApp.Add(new SysLog diff --git a/OpenAuth.App/ResourceApp.cs b/OpenAuth.App/ResourceApp.cs index 464c1481..da2946ad 100644 --- a/OpenAuth.App/ResourceApp.cs +++ b/OpenAuth.App/ResourceApp.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using Infrastructure; using OpenAuth.App.Interface; using OpenAuth.App.Request; @@ -47,7 +48,7 @@ namespace OpenAuth.App return UnitWork.Find(u => elementIds.Contains(u.Id) && (appId == null || appId =="" || u.AppId == appId)); } - public TableData Load(QueryResourcesReq request) + public async Task Load(QueryResourcesReq request) { var loginContext = _auth.GetCurrentUser(); if (loginContext == null) diff --git a/OpenAuth.App/SSO/LoginParse.cs b/OpenAuth.App/SSO/LoginParse.cs index 318e315f..95678b03 100644 --- a/OpenAuth.App/SSO/LoginParse.cs +++ b/OpenAuth.App/SSO/LoginParse.cs @@ -51,7 +51,7 @@ namespace OpenAuth.App.SSO } else { - userInfo = _app.FindSingle(u =>u.Account == model.Account); + userInfo = _app.FirstOrDefault(u =>u.Account == model.Account); } if (userInfo == null) @@ -63,6 +63,11 @@ namespace OpenAuth.App.SSO throw new Exception("密码错误"); } + if (userInfo.Status != 0) + { + throw new Exception("账号状态异常,可能已停用"); + } + var currentSession = new UserAuthSession { Account = model.Account, diff --git a/OpenAuth.App/SysLogApp.cs b/OpenAuth.App/SysLogApp.cs index ac9b1758..8ada043d 100644 --- a/OpenAuth.App/SysLogApp.cs +++ b/OpenAuth.App/SysLogApp.cs @@ -1,5 +1,6 @@ using System.Linq; using System.Reflection; +using System.Threading.Tasks; using OpenAuth.App.Request; using OpenAuth.App.Response; using OpenAuth.Repository.Domain; @@ -14,7 +15,7 @@ namespace OpenAuth.App /// /// 加载列表 /// - public TableData Load(QuerySysLogListReq request) + public async Task Load(QuerySysLogListReq request) { var result = new TableData(); var objs = UnitWork.Find(null); diff --git a/OpenAuth.App/SysMessageApp.cs b/OpenAuth.App/SysMessageApp.cs index e660ee40..97102cc7 100644 --- a/OpenAuth.App/SysMessageApp.cs +++ b/OpenAuth.App/SysMessageApp.cs @@ -1,4 +1,5 @@ using System.Linq; +using System.Threading.Tasks; using Infrastructure; using OpenAuth.App.Interface; using OpenAuth.App.Request; @@ -16,7 +17,7 @@ namespace OpenAuth.App /// /// 加载列表 /// - public TableData Load(QuerySysMessageListReq request) + public async Task Load(QuerySysMessageListReq request) { var loginContext = _auth.GetCurrentUser(); if (loginContext == null) diff --git a/OpenAuth.App/Test/TestAsync.cs b/OpenAuth.App/Test/TestAsync.cs new file mode 100644 index 00000000..59f31665 --- /dev/null +++ b/OpenAuth.App/Test/TestAsync.cs @@ -0,0 +1,68 @@ +using System; +using System.Threading; +using System.Threading.Tasks; +using Infrastructure.Cache; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.DependencyInjection; +using Moq; +using NUnit.Framework; +using OpenAuth.App.Request; +using OpenAuth.App.SSO; +using OpenAuth.Repository.Domain; +using OpenAuth.Repository.Interface; + +namespace OpenAuth.App.Test +{ + public class TestDynamic : TestBase + { + public override ServiceCollection GetService() + { + var services = new ServiceCollection(); + + var cachemock = new Mock(); + cachemock.Setup(x => x.Get("tokentest")) + .Returns(new UserAuthSession { Account = "System" }); + services.AddScoped(x => cachemock.Object); + + var httpContextAccessorMock = new Mock(); + httpContextAccessorMock.Setup(x => x.HttpContext.Request.Query[Define.TOKEN_NAME]) + .Returns("tokentest"); + + services.AddScoped(x => httpContextAccessorMock.Object); + + return services; + } + + [Test] + public void Async() + { + Console.WriteLine($"开始异步测试"); + + AddOrUpdate(); + + Console.WriteLine("异步测试结束"); + + //延长主线程,防止程序退出 + Thread.Sleep(3000); + } + + private async Task AddOrUpdate() + { + var repository = _autofacServiceProvider.GetService>(); + + var account = "user_" + DateTime.Now.ToString("yyyy_MM_dd HH:mm:ss"); + + var user = new User + { + Account = account, + Name = account + }; + await repository.AddAsync(user); + + user.Account = "new_" + user.Account; + + await repository.UpdateAsync(user); + Console.WriteLine($"更新完成"); + } + } +} diff --git a/OpenAuth.App/UserManagerApp.cs b/OpenAuth.App/UserManagerApp.cs index 270ac048..c714c2a2 100644 --- a/OpenAuth.App/UserManagerApp.cs +++ b/OpenAuth.App/UserManagerApp.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using Castle.Core.Internal; using OpenAuth.App.Interface; using OpenAuth.App.Request; @@ -25,14 +26,14 @@ namespace OpenAuth.App public User GetByAccount(string account) { - return Repository.FindSingle(u => u.Account == account); + return Repository.FirstOrDefault(u => u.Account == account); } /// /// 加载当前登录用户可访问的一个部门及子部门全部用户 /// 如果请求的request.OrgId为空,则可以获取到已被删除机构的用户(即:没有分配任何机构的用户) /// - public TableData Load(QueryUserListReq request) + public async Task Load(QueryUserListReq request) { var loginUser = _auth.GetCurrentUser(); @@ -120,7 +121,7 @@ namespace OpenAuth.App requser.CreateId = _auth.GetCurrentUser().User.Id; if (string.IsNullOrEmpty(request.Id)) { - if (UnitWork.IsExist(u => u.Account == request.Account)) + if (UnitWork.Any(u => u.Account == request.Account)) { throw new Exception("用户账号已存在"); } @@ -191,7 +192,7 @@ namespace OpenAuth.App /// /// /// - public TableData LoadByRole(QueryUserListByRoleReq request) + public async Task LoadByRole(QueryUserListByRoleReq request) { var users = from userRole in UnitWork.Find(u => u.SecondId == request.roleId && u.Key == Define.USERROLE) @@ -211,7 +212,7 @@ namespace OpenAuth.App /// /// /// - public TableData LoadByOrg(QueryUserListByOrgReq request) + public async Task LoadByOrg(QueryUserListByOrgReq request) { var users = from userRole in UnitWork.Find(u => u.SecondId == request.orgId && u.Key == Define.USERORG) diff --git a/OpenAuth.App/WmsInboundOrderDtblApp.cs b/OpenAuth.App/WmsInboundOrderDtblApp.cs index 24e97a3a..3c1b9a1c 100644 --- a/OpenAuth.App/WmsInboundOrderDtblApp.cs +++ b/OpenAuth.App/WmsInboundOrderDtblApp.cs @@ -1,5 +1,6 @@ using System; using System.Linq; +using System.Threading.Tasks; using Infrastructure; using OpenAuth.App.Interface; using OpenAuth.App.Request; @@ -18,7 +19,7 @@ namespace OpenAuth.App /// /// 加载列表 /// - public TableData Load(QueryWmsInboundOrderDtblListReq request) + public async Task Load(QueryWmsInboundOrderDtblListReq request) { var loginContext = _auth.GetCurrentUser(); diff --git a/OpenAuth.App/WmsInboundOrderTblApp.cs b/OpenAuth.App/WmsInboundOrderTblApp.cs index 9d010b70..7cb88501 100644 --- a/OpenAuth.App/WmsInboundOrderTblApp.cs +++ b/OpenAuth.App/WmsInboundOrderTblApp.cs @@ -1,5 +1,6 @@ using System; using System.Linq; +using System.Threading.Tasks; using Infrastructure; using OpenAuth.App.Interface; using OpenAuth.App.Request; @@ -18,7 +19,7 @@ namespace OpenAuth.App /// /// 加载列表 /// - public TableData Load(QueryWmsInboundOrderTblListReq request) + public async Task Load(QueryWmsInboundOrderTblListReq request) { var loginContext = _auth.GetCurrentUser(); if (loginContext == null) @@ -67,69 +68,71 @@ namespace OpenAuth.App _wmsInboundOrderDtblApp.AddNoSave(detail); } } - + UnitWork.Save(); } - public void Update(AddOrUpdateWmsInboundOrderTblReq obj) + public void Update(AddOrUpdateWmsInboundOrderTblReq obj) { var user = _auth.GetCurrentUser().User; - - if (obj.WmsInboundOrderDtblReqs != null && obj.WmsInboundOrderDtblReqs.Any()) - { - //id为空的添加 - foreach (var detail in obj.WmsInboundOrderDtblReqs.Where(u =>string.IsNullOrEmpty(u.Id))) - { - detail.OrderId = obj.Id; - _wmsInboundOrderDtblApp.AddNoSave(detail); - } - - //id比数据库少的,删除 - var containids = obj.WmsInboundOrderDtblReqs.Select(u => u.Id) - .Where(u =>!string.IsNullOrEmpty(u)).ToList(); - if (containids.Any()) - { - UnitWork.Delete(u =>(!containids.Contains(u.Id)) && u.OrderId == obj.Id); - } - - - //更新id相同的 - foreach (var detail in obj.WmsInboundOrderDtblReqs.Where(u =>!string.IsNullOrEmpty(u.Id))) - { - _wmsInboundOrderDtblApp.Update(detail); - } - } - - UnitWork.Update(u => u.Id == obj.Id, u => new WmsInboundOrderTbl - { - ExternalNo = obj.ExternalNo, - ExternalType = obj.ExternalType, - Status = obj.Status, - OrderType = obj.OrderType, - GoodsType = obj.GoodsType, - PurchaseNo = obj.PurchaseNo, - StockId = obj.StockId, - OwnerId = obj.OwnerId, - ShipperId = obj.ShipperId, - SupplierId = obj.SupplierId, - ScheduledInboundTime = obj.ScheduledInboundTime, - Remark = obj.Remark, - Enable = obj.Enable, - TransferType = obj.TransferType, - InBondedArea = obj.InBondedArea, - ReturnBoxNum = obj.ReturnBoxNum, - UpdateTime = DateTime.Now, - UpdateUserId = user.Id, - UpdateUserName = user.Name - //todo:补充或调整自己需要的字段 - }); - - UnitWork.Save(); + UnitWork.ExecuteWithTransaction(() => + { + if (obj.WmsInboundOrderDtblReqs != null && obj.WmsInboundOrderDtblReqs.Any()) + { + //id为空的添加 + foreach (var detail in obj.WmsInboundOrderDtblReqs.Where(u => string.IsNullOrEmpty(u.Id))) + { + detail.OrderId = obj.Id; + _wmsInboundOrderDtblApp.AddNoSave(detail); + } + + //id比数据库少的,删除 + var containids = obj.WmsInboundOrderDtblReqs.Select(u => u.Id) + .Where(u => !string.IsNullOrEmpty(u)).ToList(); + if (containids.Any()) + { + UnitWork.Delete(u => (!containids.Contains(u.Id)) && u.OrderId == obj.Id); + } + + //更新id相同的 + foreach (var detail in obj.WmsInboundOrderDtblReqs.Where(u => !string.IsNullOrEmpty(u.Id))) + { + _wmsInboundOrderDtblApp.Update(detail); + } + } + + UnitWork.Update(u => u.Id == obj.Id, u => new WmsInboundOrderTbl + { + ExternalNo = obj.ExternalNo, + ExternalType = obj.ExternalType, + Status = obj.Status, + OrderType = obj.OrderType, + GoodsType = obj.GoodsType, + PurchaseNo = obj.PurchaseNo, + StockId = obj.StockId, + OwnerId = obj.OwnerId, + ShipperId = obj.ShipperId, + SupplierId = obj.SupplierId, + ScheduledInboundTime = obj.ScheduledInboundTime, + Remark = obj.Remark, + Enable = obj.Enable, + TransferType = obj.TransferType, + InBondedArea = obj.InBondedArea, + ReturnBoxNum = obj.ReturnBoxNum, + UpdateTime = DateTime.Now, + UpdateUserId = user.Id, + UpdateUserName = user.Name + //todo:补充或调整自己需要的字段 + }); + + UnitWork.Save(); + }); } public WmsInboundOrderTblApp(IUnitWork unitWork, IRepository repository, - RevelanceManagerApp app, IAuth auth, WmsInboundOrderDtblApp wmsInboundOrderDtblApp) : base(unitWork, repository,auth) + RevelanceManagerApp app, IAuth auth, WmsInboundOrderDtblApp wmsInboundOrderDtblApp) : base(unitWork, + repository, auth) { _revelanceApp = app; _wmsInboundOrderDtblApp = wmsInboundOrderDtblApp; diff --git a/OpenAuth.Mvc/Controllers/ApplicationsController.cs b/OpenAuth.Mvc/Controllers/ApplicationsController.cs index 0c5b39f6..c1e538e5 100644 --- a/OpenAuth.Mvc/Controllers/ApplicationsController.cs +++ b/OpenAuth.Mvc/Controllers/ApplicationsController.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Threading.Tasks; using Infrastructure; using Microsoft.AspNetCore.Mvc; using OpenAuth.App; @@ -14,12 +15,12 @@ namespace OpenAuth.Mvc.Controllers private readonly AppManager _app; - public string GetList([FromQuery]QueryAppListReq request) + public async Task GetList([FromQuery]QueryAppListReq request) { var resp = new Response>(); try { - resp.Result = _app.GetList(request); + resp.Result = await _app.GetList(request); } catch (Exception e) { diff --git a/OpenAuth.Mvc/Controllers/CategoriesController.cs b/OpenAuth.Mvc/Controllers/CategoriesController.cs index bce70727..5de095f8 100644 --- a/OpenAuth.Mvc/Controllers/CategoriesController.cs +++ b/OpenAuth.Mvc/Controllers/CategoriesController.cs @@ -1,4 +1,5 @@ using System; +using System.Threading.Tasks; using Infrastructure; using Microsoft.AspNetCore.Mvc; using OpenAuth.App; @@ -25,10 +26,10 @@ namespace OpenAuth.Mvc.Controllers return View(); } - public string All([FromQuery]QueryCategoryListReq request) + public async Task All([FromQuery]QueryCategoryListReq request) { TableData data = new TableData(); - data = _app.Load(request); + data = await _app.Load(request); return JsonHelper.Instance.Serialize(data); } diff --git a/OpenAuth.Mvc/Controllers/UserManagerController.cs b/OpenAuth.Mvc/Controllers/UserManagerController.cs index 81b857b5..c69cfbe4 100644 --- a/OpenAuth.Mvc/Controllers/UserManagerController.cs +++ b/OpenAuth.Mvc/Controllers/UserManagerController.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Threading.Tasks; using Infrastructure; using Microsoft.AspNetCore.Mvc; using OpenAuth.App; @@ -95,9 +96,10 @@ namespace OpenAuth.Mvc.Controllers /// /// 加载组织下面的所有用户 /// - public string Load([FromQuery]QueryUserListReq request) + public async Task Load([FromQuery]QueryUserListReq request) { - return JsonHelper.Instance.Serialize(_app.Load(request)); + var load = await _app.Load(request); + return JsonHelper.Instance.Serialize(load); } [HttpPost] @@ -120,11 +122,11 @@ namespace OpenAuth.Mvc.Controllers /// /// 获取用户可访问的账号 - /// 李玉宝于2017-02-28 15:12:19 /// - public string GetAccessedUsers() + public async Task GetAccessedUsers() { - IEnumerable users = _app.Load(new QueryUserListReq()).data; + var data = await _app.Load(new QueryUserListReq()); + IEnumerable users = data.data; var result = new Dictionary(); foreach (var user in users) { diff --git a/OpenAuth.Mvc/Views/UserManager/Index.cshtml b/OpenAuth.Mvc/Views/UserManager/Index.cshtml index ca74864e..341f60a9 100644 --- a/OpenAuth.Mvc/Views/UserManager/Index.cshtml +++ b/OpenAuth.Mvc/Views/UserManager/Index.cshtml @@ -107,4 +107,4 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/OpenAuth.Mvc/wwwroot/js/droptree.js b/OpenAuth.Mvc/wwwroot/js/droptree.js index cf251103..d393f2bc 100644 --- a/OpenAuth.Mvc/wwwroot/js/droptree.js +++ b/OpenAuth.Mvc/wwwroot/js/droptree.js @@ -121,6 +121,9 @@ layui.config({ $(that.config.idDOM).val(ids.join(",")); $(that.config.nameDOM).val(names.join(",")); + if(options.callback){ + options.callback(ids.join(","), names.join(",")); + } $(that.config.idDOM).change(); if(flag){ layer.close(index); @@ -135,14 +138,17 @@ layui.config({ text: 'Name', key: 'Id', parentKey: 'ParentId', + callback:null, //选中后的回调 selectedMulti: true //默认是多选 + }; - exports('droptree', function (url, name, id, selectedMulti) { + exports('droptree', function (url, name, id, selectedMulti,callback) { var options = { nameDOM: name, //显示的文本框ID,如:"#catetoryName" idDOM: id, //隐藏的文本框,如:"#categoryId" - url: url, + url: url, + callback:callback, //选中后的回调 selectedMulti: selectedMulti //是否为多选 } inst = new DropTree(options); diff --git a/OpenAuth.Mvc/wwwroot/js/iconPicker.js b/OpenAuth.Mvc/wwwroot/js/iconPicker.js index ba16d8e2..6457d242 100644 --- a/OpenAuth.Mvc/wwwroot/js/iconPicker.js +++ b/OpenAuth.Mvc/wwwroot/js/iconPicker.js @@ -385,6 +385,10 @@ layui.define(['laypage', 'form'], function (exports) { IconPicker.prototype.checkIcon = function (filter, iconName){ var p = $('*[lay-filter='+ filter +']').next().find('.layui-iconpicker-item .layui-icon'), c = iconName; + + if(c == undefined){ + return; + } if (c.indexOf('#xe') > 0){ p.html(c); diff --git a/OpenAuth.Mvc/wwwroot/userJs/modules.js b/OpenAuth.Mvc/wwwroot/userJs/modules.js index 65fbf702..89514255 100644 --- a/OpenAuth.Mvc/wwwroot/userJs/modules.js +++ b/OpenAuth.Mvc/wwwroot/userJs/modules.js @@ -6,12 +6,57 @@ layui.config({ $ = layui.jquery; var iconPicker = layui.iconPicker; var btnIconPicker = layui.iconPicker; + var vmMenu = new Vue({ + el: "#mfromEdit", + data(){ + return { + tmp: {} + } + }, + watch:{ + tmp(val){ + this.$nextTick(function () { + form.render(); //刷新select等 + btnIconPicker.checkIcon('btnIconPicker', this.tmp.Icon); + }) + } + }, + mounted(){ + form.render(); + } + }); + var vmModule = new Vue({ + el: "#formEdit", + data(){ + return { + tmp: {} //使用一个tmp封装一下,后面可以直接用vm.tmp赋值 + } + }, + watch:{ + tmp(val){ + this.$nextTick(function () { + form.render(); //刷新select等 + layui.droptree("/UserSession/GetModules", "#ParentName", "#ParentId", false); + + iconPicker.checkIcon('iconPicker', this.tmp.IconName); + }) + } + }, + mounted(){ + form.render(); + layui.droptree("/UserSession/GetModules", "#ParentName", "#ParentId", false); + } + }); iconPicker.render({ // 选择器,推荐使用input elem: '#IconName', type: 'fontClass', // 每个图标格子的宽度:'43px'或'20%' cellWidth: '43px', + // 点击回调 + click: function (data) { + vmModule.tmp.IconName = data.icon; + } }); btnIconPicker.render({ //按钮的图标 // 选择器,推荐使用input @@ -19,6 +64,10 @@ layui.config({ type: 'fontClass', // 每个图标格子的宽度:'43px'或'20%' cellWidth: '43px', + // 点击回调 + click: function (data) { + vmMenu.tmp.Icon = data.icon; + } }); var table = layui.table; @@ -98,7 +147,6 @@ layui.config({ $("#tree").height($("div.layui-table-view").height()); //添加(编辑)模块对话框 var editDlg = function() { - var vm; var update = false; //是否为更新 var show = function (data) { var title = update ? "编辑信息" : "添加"; @@ -108,34 +156,12 @@ layui.config({ type: 1, content: $('#divEdit'), success: function() { - if(vm == undefined){ - vm = new Vue({ - el: "#formEdit", - data(){ - return { - tmp:data //使用一个tmp封装一下,后面可以直接用vm.tmp赋值 - } - }, - watch:{ - tmp(val){ - this.$nextTick(function () { - form.render(); //刷新select等 - layui.droptree("/UserSession/GetModules", "#ParentName", "#ParentId", false); - - iconPicker.checkIcon('iconPicker', this.tmp.IconName); - }) - } - }, - mounted(){ - form.render(); - layui.droptree("/UserSession/GetModules", "#ParentName", "#ParentId", false); - - iconPicker.checkIcon('iconPicker', data.IconName); + if(data.Id ==''){ + for(var key in vmModule.tmp){ + delete vmModule.tmp[key]; } - }); - }else{ - vm.tmp = Object.assign({}, vm.tmp,data) - } + } + vmModule.tmp = Object.assign({}, vmModule.tmp,data) }, end: mainList }); @@ -176,7 +202,6 @@ layui.config({ //添加菜单对话框 var meditDlg = function () { - var vm ; var update = false; //是否为更新 var show = function (data) { var title = update ? "编辑信息" : "添加"; @@ -186,30 +211,12 @@ layui.config({ type: 1, content: $('#divMenuEdit'), success: function () { - if(vm == undefined){ - vm = new Vue({ - el: "#mfromEdit", - data(){ - return { - tmp:data //使用一个tmp封装一下,后面可以直接用vm.tmp赋值 - } - }, - watch:{ - tmp(val){ - this.$nextTick(function () { - form.render(); //刷新select等 - btnIconPicker.checkIcon('btnIconPicker', this.tmp.Icon); - }) - } - }, - mounted(){ - form.render(); - btnIconPicker.checkIcon('btnIconPicker', data.Icon); - } - }); - }else{ - vm.tmp = Object.assign({}, vm.tmp,data) - } + if(data.Id ==''){ + for(var key in vmMenu.tmp){ + delete vmMenu.tmp[key]; + } + } + vmMenu.tmp = Object.assign({}, vmMenu.tmp,data) }, end: menuList }); @@ -235,7 +242,8 @@ layui.config({ show({ Id: "", ModuleId:moduleId, - Sort: 1 + Sort: 1, + Icon:'layui-icon-app' }); }, update: function (data) { //弹出编辑框 diff --git a/OpenAuth.Mvc/wwwroot/userJs/orgs.js b/OpenAuth.Mvc/wwwroot/userJs/orgs.js index 205bb8c8..34e4919f 100644 --- a/OpenAuth.Mvc/wwwroot/userJs/orgs.js +++ b/OpenAuth.Mvc/wwwroot/userJs/orgs.js @@ -93,7 +93,11 @@ }, mounted(){ form.render(); - layui.droptree("/UserSession/GetOrgs", "#ParentName", "#ParentId", false); + var _this = this; + layui.droptree("/UserSession/GetOrgs", "#ParentName", "#ParentId", false,function (ids, names) { + _this.tmp.ParentId = ids; + _this.tmp.ParentName = names; + }); } }); diff --git a/OpenAuth.Mvc/wwwroot/userJs/users.js b/OpenAuth.Mvc/wwwroot/userJs/users.js index 0d2212c2..d2ee7043 100644 --- a/OpenAuth.Mvc/wwwroot/userJs/users.js +++ b/OpenAuth.Mvc/wwwroot/userJs/users.js @@ -90,13 +90,17 @@ layui.config({ tmp(val){ this.$nextTick(function () { form.render(); //刷新select等 - layui.droptree("/UserSession/GetOrgs", "#Organizations", "#OrganizationIds"); + //layui.droptree("/UserSession/GetOrgs", "#Organizations", "#OrganizationIds"); }) } }, mounted(){ form.render(); - layui.droptree("/UserSession/GetOrgs", "#Organizations", "#OrganizationIds"); + var _this = this; + layui.droptree("/UserSession/GetOrgs", "#Organizations", "#OrganizationIds", true,function (ids, names) { + _this.tmp.OrganizationIds = ids; + _this.tmp.Organizations = names; + }); } }); }else{ diff --git a/OpenAuth.Repository/BaseRepository.cs b/OpenAuth.Repository/BaseRepository.cs index 0851fc4e..f20dd832 100644 --- a/OpenAuth.Repository/BaseRepository.cs +++ b/OpenAuth.Repository/BaseRepository.cs @@ -2,6 +2,7 @@ using System.ComponentModel.DataAnnotations; using System.Linq; using System.Linq.Expressions; +using System.Threading.Tasks; using Infrastructure; using Microsoft.EntityFrameworkCore; using OpenAuth.Repository.Core; @@ -29,7 +30,7 @@ namespace OpenAuth.Repository return Filter(exp); } - public bool IsExist(Expression> exp) + public bool Any(Expression> exp) { return _context.Set().Any(exp); } @@ -37,7 +38,7 @@ namespace OpenAuth.Repository /// /// 查找单个,且不被上下文所跟踪 /// - public T FindSingle(Expression> exp) + public T FirstOrDefault(Expression> exp) { return _context.Set().AsNoTracking().FirstOrDefault(exp); } @@ -61,7 +62,7 @@ namespace OpenAuth.Repository /// /// 根据过滤条件获取记录数 /// - public int GetCount(Expression> exp = null) + public int Count(Expression> exp = null) { return Filter(exp).Count(); } @@ -116,7 +117,6 @@ namespace OpenAuth.Repository Save(); } - /// /// 实现按需要只更新部分更新 /// 如:Update(u =>u.Id==1,u =>new User{Name="ok"}); @@ -132,7 +132,7 @@ namespace OpenAuth.Repository { _context.Set().Where(exp).Delete(); } - + public void Save() { try @@ -169,7 +169,7 @@ namespace OpenAuth.Repository return dbSet; } - public int ExecuteSql(string sql) + public int ExecuteSqlRaw(string sql) { return _context.Database.ExecuteSqlRaw(sql); } @@ -193,5 +193,129 @@ namespace OpenAuth.Repository { return _context.Query().FromSqlRaw(sql, parameters); } + + #region 异步实现 + + /// + /// 异步执行sql + /// + /// + /// + public async Task ExecuteSqlRawAsync(string sql) + { + return await _context.Database.ExecuteSqlRawAsync(sql); + } + + public async Task AddAsync(T entity) + { + if (entity.KeyIsNull()) + { + entity.GenerateDefaultKeyVal(); + } + + _context.Set().Add(entity); + return await SaveAsync(); + //_context.Entry(entity).State = EntityState.Detached; + } + + public async Task BatchAddAsync(T[] entities) + { + foreach (var entity in entities) + { + if (entity.KeyIsNull()) + { + entity.GenerateDefaultKeyVal(); + } + } + + await _context.Set().AddRangeAsync(entities); + return await SaveAsync(); + } + + /// + /// 异步更新 + /// + /// + /// + public async Task UpdateAsync(T entity) + { + var entry = this._context.Entry(entity); + entry.State = EntityState.Modified; + + //如果数据没有发生变化 + if (!this._context.ChangeTracker.HasChanges()) + { + return 0; + } + + return await SaveAsync(); + } + + /// + /// 异步删除 + /// + /// + /// + public async Task DeleteAsync(T entity) + { + _context.Set().Remove(entity); + return await SaveAsync(); + } + + /// + /// 异步保存 + /// + /// + /// + public async Task SaveAsync() + { + try + { + var entities = _context.ChangeTracker.Entries() + .Where(e => e.State == EntityState.Added + || e.State == EntityState.Modified) + .Select(e => e.Entity); + + foreach (var entity in entities) + { + var validationContext = new ValidationContext(entity); + Validator.ValidateObject(entity, validationContext, validateAllProperties: true); + } + + return await _context.SaveChangesAsync(); + } + catch (ValidationException exc) + { + Console.WriteLine($"{nameof(Save)} validation exception: {exc?.Message}"); + throw (exc.InnerException as Exception ?? exc); + } + catch (Exception ex) //DbUpdateException + { + throw (ex.InnerException as Exception ?? ex); + } + } + + /// + /// 根据过滤条件获取记录数 + /// + public async Task CountAsync(Expression> exp = null) + { + return await Filter(exp).CountAsync(); + } + + public async Task AnyAsync(Expression> exp) + { + return await _context.Set().AnyAsync(exp); + } + + /// + /// 查找单个,且不被上下文所跟踪 + /// + public async Task FirstOrDefaultAsync(Expression> exp) + { + return await _context.Set().AsNoTracking().FirstOrDefaultAsync(exp); + } + + #endregion } } \ No newline at end of file diff --git a/OpenAuth.Repository/Interface/IRepository.cs b/OpenAuth.Repository/Interface/IRepository.cs index e1b74dc0..318a57de 100644 --- a/OpenAuth.Repository/Interface/IRepository.cs +++ b/OpenAuth.Repository/Interface/IRepository.cs @@ -15,29 +15,30 @@ using System; using System.Linq; using System.Linq.Expressions; +using System.Threading.Tasks; namespace OpenAuth.Repository.Interface { public interface IRepository where T : class { - T FindSingle(Expression> exp = null); - bool IsExist(Expression> exp); + /// + /// 返回一个单独的实体,如果记录多于1个则取第一个 + /// + T FirstOrDefault(Expression> exp = null); + /// + /// 判断指定条件的记录是否存在 + /// + bool Any(Expression> exp); IQueryable Find(Expression> exp = null); - IQueryable Find(int pageindex = 1, int pagesize = 10, string orderby = "", Expression> exp = null); - - int GetCount(Expression> exp = null); - + int Count(Expression> exp = null); void Add(T entity); - void BatchAdd(T[] entities); - /// /// 更新一个实体的所有属性 /// void Update(T entity); - void Delete(T entity); @@ -48,6 +49,7 @@ namespace OpenAuth.Repository.Interface /// 更新条件 /// 更新后的实体 void Update(Expression> where, Expression> entity); + /// /// 批量删除 /// @@ -55,19 +57,35 @@ namespace OpenAuth.Repository.Interface void Save(); - int ExecuteSql(string sql); - - /// + int ExecuteSqlRaw(string sql); + + /// /// 使用SQL脚本查询 /// /// T为数据库实体 /// IQueryable FromSql(string sql, params object[] parameters); - /// - /// 使用SQL脚本查询 - /// - /// T为非数据库实体,需要在DbContext中增加对应的DbQuery - /// + + /// + /// 使用SQL脚本查询 + /// + /// T为非数据库实体,需要在DbContext中增加对应的DbQuery + /// IQueryable Query(string sql, params object[] parameters); + + + #region 异步接口 + + Task ExecuteSqlRawAsync(string sql); + Task AddAsync(T entity); + Task BatchAddAsync(T[] entities); + Task UpdateAsync(T entity); + Task DeleteAsync(T entity); + Task SaveAsync(); + Task CountAsync(Expression> exp = null); + Task AnyAsync(Expression> exp); + Task FirstOrDefaultAsync(Expression> exp); + + #endregion } } \ No newline at end of file diff --git a/OpenAuth.Repository/Interface/IUnitWork.cs b/OpenAuth.Repository/Interface/IUnitWork.cs index bc9472f6..93aa8798 100644 --- a/OpenAuth.Repository/Interface/IUnitWork.cs +++ b/OpenAuth.Repository/Interface/IUnitWork.cs @@ -4,7 +4,7 @@ // Created : 04-29-2016 // // Last Modified By : yubaolee -// Last Modified On : 04-29-2016 +// Last Modified On : 12-15-2020 // Contact : Microsoft // File: IUnitWork.cs // *********************************************************************** @@ -12,12 +12,14 @@ using System; using System.Linq; using System.Linq.Expressions; +using System.Threading.Tasks; using OpenAuth.Repository.Core; namespace OpenAuth.Repository.Interface { /// /// 工作单元接口 + /// 使用详见:http://doc.openauth.me/core/unitwork.html /// 适合在一下情况使用: /// 1 在同一事务中进行多表操作 /// 2 需要多表联合查询 @@ -25,18 +27,39 @@ namespace OpenAuth.Repository.Interface /// public interface IUnitWork { + /// + /// EF默认情况下,每调用一次SaveChanges()都会执行一个单独的事务 + /// 本接口实现在一个事务中可以多次执行SaveChanges()方法 + /// + void ExecuteWithTransaction(Action action); + /// + /// 返回DbContext,用于多线程等极端情况 + /// + /// OpenAuthDBContext GetDbContext(); - T FindSingle(Expression> exp = null) where T:class; - bool IsExist(Expression> exp) where T:class; + /// + /// 返回一个单独的实体,如果记录多于1个则取第一个 + /// + T FirstOrDefault(Expression> exp = null) where T:class; + /// + /// 判断指定条件的记录是否存在 + /// + bool Any(Expression> exp) where T:class; IQueryable Find(Expression> exp = null) where T:class; IQueryable Find(int pageindex = 1, int pagesize = 10, string orderby = "", Expression> exp = null) where T:class; - int GetCount(Expression> exp = null) where T:class; + int Count(Expression> exp = null) where T:class; + /// + /// 新增对象,如果Id为空,则会自动创建默认Id + /// void Add(T entity) where T:BaseEntity; + /// + /// 批量新增对象,如果对象Id为空,则会自动创建默认Id + /// void BatchAdd(T[] entities) where T:BaseEntity; /// @@ -49,18 +72,25 @@ namespace OpenAuth.Repository.Interface /// /// 实现按需要只更新部分更新 - /// 如:Update(u =>u.Id==1,u =>new User{Name="ok"}) where T:class; + /// 如:Update<User>(u =>u.Id==1,u =>new User{Name="ok"}) + /// 该方法内部自动调用了SaveChanges(),需要ExecuteWithTransaction配合才能实现事务控制 /// /// 更新条件 /// 更新后的实体 void Update(Expression> where, Expression> entity) where T:class; /// /// 批量删除 + /// 该方法内部自动调用了SaveChanges(),需要ExecuteWithTransaction配合才能实现事务控制 /// void Delete(Expression> exp) where T:class; void Save(); - + + /// + /// 该方法不支持EF自带的事务,需要ExecuteWithTransaction配合才能实现事务控制,详见:http://doc.openauth.me/core/unitwork.html + /// + /// + /// int ExecuteSql(string sql); /// @@ -75,5 +105,15 @@ namespace OpenAuth.Repository.Interface /// T为非数据库实体,需要在DbContext中增加对应的DbQuery /// IQueryable Query(string sql, params object[] parameters) where T : class; + + #region 异步接口 + + Task ExecuteSqlRawAsync(string sql); + Task SaveAsync(); + Task CountAsync(Expression> exp = null) where T : class; + Task AnyAsync(Expression> exp) where T : class; + Task FirstOrDefaultAsync(Expression> exp) where T : class; + + #endregion } } diff --git a/OpenAuth.Repository/Test/TestBase.cs b/OpenAuth.Repository/Test/TestBase.cs index 79280fb5..1104fad0 100644 --- a/OpenAuth.Repository/Test/TestBase.cs +++ b/OpenAuth.Repository/Test/TestBase.cs @@ -8,6 +8,10 @@ using OpenAuth.Repository.Interface; namespace OpenAuth.Repository.Test { + /// + /// Repository测试基类 + /// 测试用于测试DbContext、UnitWork、Repository,如果需要测试业务逻辑,请使用OpenAuth.App里面的单元测试 + /// public class TestBase { protected AutofacServiceProvider _autofacServiceProvider; @@ -19,6 +23,7 @@ namespace OpenAuth.Repository.Test serviceCollection.AddMemoryCache(); serviceCollection.AddOptions(); serviceCollection.AddScoped(typeof(IRepository<>), typeof(BaseRepository<>)); + serviceCollection.AddScoped(typeof(IUnitWork), typeof(UnitWork)); serviceCollection.AddDbContext(options => options.UseSqlServer("Data Source=.;Initial Catalog=OpenAuthDB;User=sa;Password=000000;Integrated Security=True")); @@ -28,7 +33,6 @@ namespace OpenAuth.Repository.Test //注册repository层 builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()); - // builder.RegisterGeneric(typeof(BaseRepository<>)).As(typeof(IRepository<>)).PropertiesAutowired(); builder.Populate(serviceCollection); var _container = builder.Build(); diff --git a/OpenAuth.Repository/Test/TestDbContext.cs b/OpenAuth.Repository/Test/TestDbContext.cs index 5a7c7ae7..30780b39 100644 --- a/OpenAuth.Repository/Test/TestDbContext.cs +++ b/OpenAuth.Repository/Test/TestDbContext.cs @@ -94,24 +94,24 @@ namespace OpenAuth.Repository.Test Id = id }); - var user = repository.FindSingle(u => u.Id == id); + var user = repository.FirstOrDefault(u => u.Id == id); Assert.NotNull(user); //修改一个实体 account = "newuser_" + DateTime.Now.ToString("yyyy_MM_dd HH:mm:ss"); user.Account = account; repository.Update(user); - var newuser = repository.FindSingle(u => u.Account == account); + var newuser = repository.FirstOrDefault(u => u.Account == account); Assert.NotNull(newuser); //批量修改 repository.Update(u => u.Id == id, u =>new User{ Name = account}); - newuser = repository.FindSingle(u => u.Name == account); + newuser = repository.FirstOrDefault(u => u.Name == account); Assert.NotNull(newuser); //删除 repository.Delete(u =>u.Id == id); - newuser = repository.FindSingle(u => u.Id == id); + newuser = repository.FirstOrDefault(u => u.Id == id); Assert.IsNull(newuser); } } diff --git a/OpenAuth.Repository/Test/TestTransaction.cs b/OpenAuth.Repository/Test/TestTransaction.cs new file mode 100644 index 00000000..fa488d76 --- /dev/null +++ b/OpenAuth.Repository/Test/TestTransaction.cs @@ -0,0 +1,86 @@ +using System; +using NUnit.Framework; +using Microsoft.Extensions.DependencyInjection; +using OpenAuth.Repository.Domain; +using OpenAuth.Repository.Interface; + +namespace OpenAuth.Repository.Test +{ + /// + /// 测试事务 + /// + class TestTransaction : TestBase + { + /// + /// 测试事务正常提交 + /// + [Test] + public void NormalSubmit() + { + var unitWork = _autofacServiceProvider.GetService(); + unitWork.ExecuteWithTransaction(() => + { + var account = "user_" + DateTime.Now.ToString("yyyy_MM_dd HH:mm:ss"); + + AddAndUpdate(account, unitWork); + }); + + } + + /// + /// 测试事务回滚 + /// + [Test] + public void SubmitWithRollback() + { + var unitWork = _autofacServiceProvider.GetService(); + var account = "user_" + DateTime.Now.ToString("yyyy_MM_dd HH:mm:ss"); + try + { + unitWork.ExecuteWithTransaction(() => + { + AddAndUpdate(account, unitWork); + + throw new Exception("模拟异常"); + }); + } + catch (Exception e) + { + Console.WriteLine(e); + } + + //如果没有插入成功,表示事务发生了回滚 + Assert.IsFalse(unitWork.Any( u=>u.Id == account)); + + } + + /// + /// 测试添加,单个修改,Z.EntityFramework.Plus条件修改 + /// + private void AddAndUpdate(string account, IUnitWork unitWork) + { + var user = new User + { + Id = account, + Account = account, + Name = account, + }; + + unitWork.Add(user); + + unitWork.Save(); + + + user.Account = "Trans_" + user.Account; + user.Name = "Trans_" + user.Name; + unitWork.Update(user); + + unitWork.Save(); + + unitWork.Update(u => u.Id == account, u => new User + { + Account = "Trans2_" + user.Account + }); + } + } +} \ No newline at end of file diff --git a/OpenAuth.Repository/UnitWork.cs b/OpenAuth.Repository/UnitWork.cs index a9f9d996..3b4a3468 100644 --- a/OpenAuth.Repository/UnitWork.cs +++ b/OpenAuth.Repository/UnitWork.cs @@ -2,8 +2,10 @@ using System.ComponentModel.DataAnnotations; using System.Linq; using System.Linq.Expressions; +using System.Threading.Tasks; using Infrastructure; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Storage; using OpenAuth.Repository.Core; using OpenAuth.Repository.Interface; using Z.EntityFramework.Plus; @@ -18,6 +20,31 @@ namespace OpenAuth.Repository { _context = context; } + + /// + /// EF默认情况下,每调用一次SaveChanges()都会执行一个单独的事务 + /// 本接口实现在一个事务中可以多次执行SaveChanges()方法 + /// + public void ExecuteWithTransaction(Action action) + { + using (IDbContextTransaction transaction = _context.Database.BeginTransaction()) + { + try + { + action(); + transaction.Commit(); + } + catch (Exception ex) + { + transaction.Rollback(); + throw ex; + } + } + } + + /// + /// 返回DbContext,用于多线程等极端情况 + /// public OpenAuthDBContext GetDbContext() { return _context; @@ -32,7 +59,7 @@ namespace OpenAuth.Repository return Filter(exp); } - public bool IsExist(Expression> exp) where T : class + public bool Any(Expression> exp) where T : class { return _context.Set().Any(exp); } @@ -40,7 +67,7 @@ namespace OpenAuth.Repository /// /// 查找单个 /// - public T FindSingle(Expression> exp) where T:class + public T FirstOrDefault(Expression> exp) where T:class { return _context.Set().AsNoTracking().FirstOrDefault(exp); } @@ -63,11 +90,14 @@ namespace OpenAuth.Repository /// /// 根据过滤条件获取记录数 /// - public int GetCount(Expression> exp = null) where T : class + public int Count(Expression> exp = null) where T : class { return Filter(exp).Count(); } + /// + /// 新增对象,如果Id为空,则会自动创建默认Id + /// public void Add(T entity) where T : BaseEntity { if (entity.KeyIsNull()) @@ -78,9 +108,8 @@ namespace OpenAuth.Repository } /// - /// 批量添加 + /// 批量新增对象,如果对象Id为空,则会自动创建默认Id /// - /// The entities. public void BatchAdd(T[] entities) where T : BaseEntity { foreach (var entity in entities) @@ -113,18 +142,23 @@ namespace OpenAuth.Repository /// /// 实现按需要只更新部分更新 - /// 如:Update(u =>u.Id==1,u =>new User{Name="ok"}); + /// 如:Update<User>(u =>u.Id==1,u =>new User{Name="ok"}) + /// 该方法内部自动调用了SaveChanges(),需要ExecuteWithTransaction配合才能实现事务控制 /// - /// The where. - /// The entity. + /// 更新条件 + /// 更新后的实体 public void Update(Expression> where, Expression> entity) where T:class { _context.Set().Where(where).Update(entity); } + /// + /// 批量删除 + /// 该方法内部自动调用了SaveChanges(),需要ExecuteWithTransaction配合才能实现事务控制 + /// public virtual void Delete(Expression> exp) where T : class { - _context.Set().RemoveRange(Filter(exp)); + _context.Set().Where(exp).Delete(); } public void Save() @@ -178,5 +212,74 @@ namespace OpenAuth.Repository { return _context.Query().FromSqlRaw(sql, parameters); } + + #region 异步实现 + + /// + /// 异步执行sql + /// + /// + /// + public async Task ExecuteSqlRawAsync(string sql) + { + return await _context.Database.ExecuteSqlRawAsync(sql); + } + + + /// + /// 异步保存 + /// + /// + /// + public async Task SaveAsync() + { + try + { + var entities = _context.ChangeTracker.Entries() + .Where(e => e.State == EntityState.Added + || e.State == EntityState.Modified) + .Select(e => e.Entity); + + foreach (var entity in entities) + { + var validationContext = new ValidationContext(entity); + Validator.ValidateObject(entity, validationContext, validateAllProperties: true); + } + + return await _context.SaveChangesAsync(); + } + catch (ValidationException exc) + { + Console.WriteLine($"{nameof(Save)} validation exception: {exc?.Message}"); + throw (exc.InnerException as Exception ?? exc); + } + catch (Exception ex) //DbUpdateException + { + throw (ex.InnerException as Exception ?? ex); + } + } + + /// + /// 根据过滤条件获取记录数 + /// + public async Task CountAsync(Expression> exp = null) where T : class + { + return await Filter(exp).CountAsync(); + } + + public async Task AnyAsync(Expression> exp) where T : class + { + return await _context.Set().AnyAsync(exp); + } + + /// + /// 查找单个,且不被上下文所跟踪 + /// + public async Task FirstOrDefaultAsync(Expression> exp) where T : class + { + return await _context.Set().AsNoTracking().FirstOrDefaultAsync(exp); + } + + #endregion } } diff --git a/OpenAuth.WebApi/Controllers/ApplicationsController.cs b/OpenAuth.WebApi/Controllers/ApplicationsController.cs index d04617e2..7271297e 100644 --- a/OpenAuth.WebApi/Controllers/ApplicationsController.cs +++ b/OpenAuth.WebApi/Controllers/ApplicationsController.cs @@ -1,4 +1,5 @@ -using Microsoft.AspNetCore.Mvc; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; using OpenAuth.App; using OpenAuth.App.Request; using OpenAuth.App.Response; @@ -23,9 +24,9 @@ namespace OpenAuth.WebApi.Controllers /// /// [HttpGet] - public TableData Load([FromQuery]QueryAppListReq request) + public async Task Load([FromQuery]QueryAppListReq request) { - var applications = _app.GetList(request); + var applications =await _app.GetList(request); return new TableData { data = applications, diff --git a/OpenAuth.WebApi/Controllers/BuilderTableColumnsController.cs b/OpenAuth.WebApi/Controllers/BuilderTableColumnsController.cs index d0078cbb..6f888928 100644 --- a/OpenAuth.WebApi/Controllers/BuilderTableColumnsController.cs +++ b/OpenAuth.WebApi/Controllers/BuilderTableColumnsController.cs @@ -1,4 +1,5 @@ using System; +using System.Threading.Tasks; using Infrastructure; using Microsoft.AspNetCore.Mvc; using OpenAuth.App; @@ -59,9 +60,10 @@ namespace OpenAuth.WebApi.Controllers /// 加载列表 /// [HttpGet] - public TableResp Load([FromQuery]QueryBuilderTableColumnListReq request) + public async Task> Load([FromQuery]QueryBuilderTableColumnListReq request) { - return _app.Load(request); + var tableResp = await _app.Load(request); + return tableResp; } /// diff --git a/OpenAuth.WebApi/Controllers/BuilderTablesController.cs b/OpenAuth.WebApi/Controllers/BuilderTablesController.cs index 8e7aeb34..57bd53dd 100644 --- a/OpenAuth.WebApi/Controllers/BuilderTablesController.cs +++ b/OpenAuth.WebApi/Controllers/BuilderTablesController.cs @@ -1,4 +1,5 @@ using System; +using System.Threading.Tasks; using Infrastructure; using Microsoft.AspNetCore.Mvc; using OpenAuth.App; @@ -67,9 +68,9 @@ namespace OpenAuth.WebApi.Controllers /// 加载列表 /// [HttpGet] - public TableResp Load([FromQuery]QueryBuilderTableListReq request) + public async Task> Load([FromQuery]QueryBuilderTableListReq request) { - return _app.Load(request); + return await _app.Load(request); } /// diff --git a/OpenAuth.WebApi/Controllers/CategoryTypesController.cs b/OpenAuth.WebApi/Controllers/CategoryTypesController.cs index c03521b9..b3c0e817 100644 --- a/OpenAuth.WebApi/Controllers/CategoryTypesController.cs +++ b/OpenAuth.WebApi/Controllers/CategoryTypesController.cs @@ -1,5 +1,6 @@ using System; -using Infrastructure; + using System.Threading.Tasks; + using Infrastructure; using Microsoft.AspNetCore.Mvc; using OpenAuth.App; using OpenAuth.App.Request; @@ -58,9 +59,9 @@ using OpenAuth.App.Response; /// 加载列表 /// [HttpGet] - public TableData Load([FromQuery]QueryCategoryTypeListReq request) + public async Task Load([FromQuery]QueryCategoryTypeListReq request) { - return _app.Load(request); + return await _app.Load(request); } /// diff --git a/OpenAuth.WebApi/Controllers/CategorysController.cs b/OpenAuth.WebApi/Controllers/CategorysController.cs index 3e4bd5b7..44e61b68 100644 --- a/OpenAuth.WebApi/Controllers/CategorysController.cs +++ b/OpenAuth.WebApi/Controllers/CategorysController.cs @@ -1,4 +1,5 @@ using System; +using System.Threading.Tasks; using Infrastructure; using Microsoft.AspNetCore.Mvc; using OpenAuth.App; @@ -87,9 +88,9 @@ namespace OpenAuth.WebApi.Controllers /// 加载列表 /// [HttpGet] - public TableData Load([FromQuery]QueryCategoryListReq request) + public async Task Load([FromQuery]QueryCategoryListReq request) { - return _app.Load(request); + return await _app.Load(request); } /// diff --git a/OpenAuth.WebApi/Controllers/DataPrivilegeRulesController.cs b/OpenAuth.WebApi/Controllers/DataPrivilegeRulesController.cs index a4ab2723..5a879afb 100644 --- a/OpenAuth.WebApi/Controllers/DataPrivilegeRulesController.cs +++ b/OpenAuth.WebApi/Controllers/DataPrivilegeRulesController.cs @@ -1,4 +1,5 @@ using System; +using System.Threading.Tasks; using Infrastructure; using Microsoft.AspNetCore.Mvc; using OpenAuth.App; @@ -86,9 +87,9 @@ namespace OpenAuth.WebApi.Controllers /// 加载列表 /// [HttpGet] - public TableData Load([FromQuery]QueryDataPrivilegeRuleListReq request) + public async Task Load([FromQuery]QueryDataPrivilegeRuleListReq request) { - return _app.Load(request); + return await _app.Load(request); } /// diff --git a/OpenAuth.WebApi/Controllers/FlowInstancesController.cs b/OpenAuth.WebApi/Controllers/FlowInstancesController.cs index 371f5b01..e7d98253 100644 --- a/OpenAuth.WebApi/Controllers/FlowInstancesController.cs +++ b/OpenAuth.WebApi/Controllers/FlowInstancesController.cs @@ -7,6 +7,7 @@ using System; using System.Collections.Generic; +using System.Threading.Tasks; using Infrastructure; using Microsoft.AspNetCore.Mvc; using OpenAuth.App; @@ -128,9 +129,9 @@ namespace OpenAuth.WebApi.Controllers /// 加载列表 /// [HttpGet] - public TableData Load([FromQuery]QueryFlowInstanceListReq request) + public async Task Load([FromQuery]QueryFlowInstanceListReq request) { - return _app.Load(request); + return await _app.Load(request); } [HttpPost] diff --git a/OpenAuth.WebApi/Controllers/FlowSchemesController.cs b/OpenAuth.WebApi/Controllers/FlowSchemesController.cs index c2e4794a..d2269ce1 100644 --- a/OpenAuth.WebApi/Controllers/FlowSchemesController.cs +++ b/OpenAuth.WebApi/Controllers/FlowSchemesController.cs @@ -1,4 +1,5 @@ using System; +using System.Threading.Tasks; using Infrastructure; using Microsoft.AspNetCore.Mvc; using OpenAuth.App; @@ -76,9 +77,9 @@ namespace OpenAuth.WebApi.Controllers /// 加载列表 /// [HttpGet] - public TableData Load([FromQuery]QueryFlowSchemeListReq request) + public async Task Load([FromQuery]QueryFlowSchemeListReq request) { - return _app.Load(request); + return await _app.Load(request); } [HttpPost] diff --git a/OpenAuth.WebApi/Controllers/FormsController.cs b/OpenAuth.WebApi/Controllers/FormsController.cs index 7248c242..fd15d629 100644 --- a/OpenAuth.WebApi/Controllers/FormsController.cs +++ b/OpenAuth.WebApi/Controllers/FormsController.cs @@ -1,4 +1,5 @@ using System; +using System.Threading.Tasks; using Infrastructure; using Microsoft.AspNetCore.Mvc; using OpenAuth.App; @@ -76,9 +77,9 @@ namespace OpenAuth.WebApi.Controllers /// 加载列表 /// [HttpGet] - public TableData Load([FromQuery]QueryFormListReq request) + public async Task Load([FromQuery]QueryFormListReq request) { - return _app.Load(request); + return await _app.Load(request); } [HttpPost] diff --git a/OpenAuth.WebApi/Controllers/OpenJobsController.cs b/OpenAuth.WebApi/Controllers/OpenJobsController.cs index 8d553dce..36351190 100644 --- a/OpenAuth.WebApi/Controllers/OpenJobsController.cs +++ b/OpenAuth.WebApi/Controllers/OpenJobsController.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; + using System.Threading.Tasks; using Infrastructure; using Microsoft.AspNetCore.Mvc; using OpenAuth.App; @@ -87,9 +88,9 @@ namespace OpenAuth.WebApi.Controllers /// 加载列表 /// [HttpGet] - public TableData Load([FromQuery]QueryOpenJobListReq request) + public async Task Load([FromQuery]QueryOpenJobListReq request) { - return _app.Load(request); + return await _app.Load(request); } /// diff --git a/OpenAuth.WebApi/Controllers/ResourcesController.cs b/OpenAuth.WebApi/Controllers/ResourcesController.cs index e9b4bc48..d5607804 100644 --- a/OpenAuth.WebApi/Controllers/ResourcesController.cs +++ b/OpenAuth.WebApi/Controllers/ResourcesController.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using Infrastructure; using Microsoft.AspNetCore.Mvc; using OpenAuth.App; @@ -25,9 +26,9 @@ namespace OpenAuth.WebApi.Controllers _app = app; } [HttpGet] - public TableData Load([FromQuery]QueryResourcesReq request) + public async Task Load([FromQuery]QueryResourcesReq request) { - return _app.Load(request); + return await _app.Load(request); } [HttpPost] diff --git a/OpenAuth.WebApi/Controllers/SysLogsController.cs b/OpenAuth.WebApi/Controllers/SysLogsController.cs index 4368b75b..34ade206 100644 --- a/OpenAuth.WebApi/Controllers/SysLogsController.cs +++ b/OpenAuth.WebApi/Controllers/SysLogsController.cs @@ -1,4 +1,5 @@ using System; +using System.Threading.Tasks; using Infrastructure; using Microsoft.AspNetCore.Mvc; using OpenAuth.App; @@ -81,9 +82,9 @@ namespace OpenAuth.WebApi.Controllers /// 加载列表 /// [HttpGet] - public TableData Load([FromQuery]QuerySysLogListReq request) + public async Task Load([FromQuery]QuerySysLogListReq request) { - return _app.Load(request); + return await _app.Load(request); } /// diff --git a/OpenAuth.WebApi/Controllers/SysMessagesController.cs b/OpenAuth.WebApi/Controllers/SysMessagesController.cs index 536f5c60..55f0970e 100644 --- a/OpenAuth.WebApi/Controllers/SysMessagesController.cs +++ b/OpenAuth.WebApi/Controllers/SysMessagesController.cs @@ -1,4 +1,5 @@ using System; +using System.Threading.Tasks; using Infrastructure; using Microsoft.AspNetCore.Mvc; using OpenAuth.App; @@ -77,9 +78,9 @@ namespace OpenAuth.WebApi.Controllers /// 加载列表 /// [HttpGet] - public TableData Load([FromQuery]QuerySysMessageListReq request) + public async Task Load([FromQuery]QuerySysMessageListReq request) { - return _app.Load(request); + return await _app.Load(request); } /// diff --git a/OpenAuth.WebApi/Controllers/UsersController.cs b/OpenAuth.WebApi/Controllers/UsersController.cs index 85882e18..aa9c0352 100644 --- a/OpenAuth.WebApi/Controllers/UsersController.cs +++ b/OpenAuth.WebApi/Controllers/UsersController.cs @@ -1,4 +1,5 @@ using System; +using System.Threading.Tasks; using Infrastructure; using Microsoft.AspNetCore.Mvc; using OpenAuth.App; @@ -104,9 +105,9 @@ namespace OpenAuth.WebApi.Controllers /// 获取当前登录用户可访问的一个部门及子部门全部用户 /// [HttpGet] - public TableData Load([FromQuery]QueryUserListReq request) + public async Task Load([FromQuery]QueryUserListReq request) { - return _app.Load(request); + return await _app.Load(request); } [HttpPost] @@ -131,9 +132,9 @@ namespace OpenAuth.WebApi.Controllers /// 加载指定角色的用户 /// [HttpGet] - public TableData LoadByRole([FromQuery]QueryUserListByRoleReq request) + public async Task LoadByRole([FromQuery]QueryUserListByRoleReq request) { - return _app.LoadByRole(request); + return await _app.LoadByRole(request); } /// @@ -141,9 +142,9 @@ namespace OpenAuth.WebApi.Controllers /// 不包含下级部门的用户 /// [HttpGet] - public TableData LoadByOrg([FromQuery]QueryUserListByOrgReq request) + public async Task LoadByOrg([FromQuery]QueryUserListByOrgReq request) { - return _app.LoadByOrg(request); + return await _app.LoadByOrg(request); } public UsersController(UserManagerApp app) diff --git a/OpenAuth.WebApi/Controllers/WmsInboundOrderDtblsController.cs b/OpenAuth.WebApi/Controllers/WmsInboundOrderDtblsController.cs index 1e8d5f99..91810e24 100644 --- a/OpenAuth.WebApi/Controllers/WmsInboundOrderDtblsController.cs +++ b/OpenAuth.WebApi/Controllers/WmsInboundOrderDtblsController.cs @@ -1,4 +1,5 @@ using System; +using System.Threading.Tasks; using Infrastructure; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; @@ -83,9 +84,9 @@ namespace OpenAuth.WebApi.Controllers /// [HttpGet] [AllowAnonymous] - public TableData Load([FromQuery]QueryWmsInboundOrderDtblListReq request) + public async Task Load([FromQuery]QueryWmsInboundOrderDtblListReq request) { - return _app.Load(request); + return await _app.Load(request); } /// diff --git a/OpenAuth.WebApi/Controllers/WmsInboundOrderTblsController.cs b/OpenAuth.WebApi/Controllers/WmsInboundOrderTblsController.cs index d90e47d9..8e718117 100644 --- a/OpenAuth.WebApi/Controllers/WmsInboundOrderTblsController.cs +++ b/OpenAuth.WebApi/Controllers/WmsInboundOrderTblsController.cs @@ -1,4 +1,5 @@ using System; +using System.Threading.Tasks; using Infrastructure; using Microsoft.AspNetCore.Mvc; using OpenAuth.App; @@ -88,9 +89,9 @@ namespace OpenAuth.WebApi.Controllers /// 加载列表 /// [HttpGet] - public TableData Load([FromQuery]QueryWmsInboundOrderTblListReq request) + public async Task Load([FromQuery]QueryWmsInboundOrderTblListReq request) { - return _app.Load(request); + return await _app.Load(request); } /// diff --git a/OpenAuth.WebApi/Template/BuildApp.html b/OpenAuth.WebApi/Template/BuildApp.html index 1850d30d..303de167 100644 --- a/OpenAuth.WebApi/Template/BuildApp.html +++ b/OpenAuth.WebApi/Template/BuildApp.html @@ -16,7 +16,7 @@ namespace OpenAuth.App /// /// 加载列表 /// - public TableData Load(Query{ClassName}ListReq request) + public async Task Load(Query{ClassName}ListReq request) { var loginContext = _auth.GetCurrentUser(); if (loginContext == null) @@ -35,7 +35,7 @@ namespace OpenAuth.App var objs = GetDataPrivilege("u"); if (!string.IsNullOrEmpty(request.key)) { - objs = objs.Where(u => u.Name.Contains(request.key) || u.Id.Contains(request.key)); + objs = objs.Where(u => u.Id.Contains(request.key)); } var propertyStr = string.Join(',', properties.Select(u => u.Key)); diff --git a/OpenAuth.WebApi/Template/BuildControllerApi.html b/OpenAuth.WebApi/Template/BuildControllerApi.html index c9d933a8..a371084a 100644 --- a/OpenAuth.WebApi/Template/BuildControllerApi.html +++ b/OpenAuth.WebApi/Template/BuildControllerApi.html @@ -77,9 +77,9 @@ namespace OpenAuth.WebApi.Controllers /// 加载列表 /// [HttpGet] - public TableData Load([FromQuery]Query{ClassName}ListReq request) + public async Task Load([FromQuery]Query{ClassName}ListReq request) { - return _app.Load(request); + return await _app.Load(request); } /// diff --git a/README.md b/README.md index 2b9de99f..4489af02 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ## ❤❤❤郑重声明❤❤❤ -已成功在.Net SDK 5.0.100-rc.2.20479.15 运行 +主分支main运行环境为 **.Net SDK 5.0.100** 需要.Net 4.0/4.5开发环境的同学请查看本项目4.0分支 diff --git a/global.json b/global.json index 262f9755..ed8ca68f 100644 --- a/global.json +++ b/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "5.0.100-rc.2.20479.15" + "version": "5.0.100" } } \ No newline at end of file