同步OpenAuth.Core最新代码

This commit is contained in:
yubaolee
2020-12-17 23:04:04 +08:00
parent 7ce8a219cf
commit 7217e7a924
61 changed files with 1112 additions and 315 deletions

296
.gitignore vendored
View File

@@ -1,36 +1,264 @@
################################################################################ ## Ignore Visual Studio temporary files, build results, and
# 此 .gitignore 文件已由 Microsoft(R) Visual Studio 自动创建。 ## files generated by popular Visual Studio add-ons.
################################################################################
/OpenAuth.Mvc/bin # User-specific files
/OpenAuth.Repository/bin/Debug *.suo
/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 *.user
/OpenAuth.Domain/obj/Debug *.userosscache
/OpenAuth.App/obj/Debug *.sln.docstates
/OpenAuth.Domain/bin/Debug
/OpenAuth.App/bin # User-specific files (MonoDevelop/Xamarin Studio)
/Infrastructure/bin/Debug *.userprefs
/Infrastructure/obj/Debug
/.vs # Build results
/OpenAuth.sln.GhostDoc.xml [Dd]ebug/
/类结构.mdj [Dd]ebugPublic/
/数据库设计关系图/OpenAuthDB.pdb [Rr]elease/
/OpenAuth.WebTest/obj/Release [Rr]eleases/
/OpenAuth.UnitTest/obj/Release x64/
/OpenAuth.WebApi/obj/Release x86/
/OpenAuth.Repository/bin/Release bld/
/OpenAuth.Repository/obj/Release [Bb]in/
/OpenAuth.Mvc/obj/Release [Oo]bj/
/OpenAuth.App/obj/Release [Ll]og/
/Infrastructure/bin/Release
/Infrastructure/obj/Release # 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

View File

@@ -1,6 +1,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading.Tasks;
using OpenAuth.App.Interface; using OpenAuth.App.Interface;
using OpenAuth.App.Request; using OpenAuth.App.Request;
using OpenAuth.Repository.Domain; using OpenAuth.Repository.Domain;
@@ -28,7 +29,7 @@ namespace OpenAuth.App
} }
public List<Application> GetList(QueryAppListReq request) public async Task<List<Application>> GetList(QueryAppListReq request)
{ {
var applications = UnitWork.Find<Application>(null) ; var applications = UnitWork.Find<Application>(null) ;

View File

@@ -50,7 +50,7 @@ namespace OpenAuth.App
else else
{ {
service = _normalAuthStrategy; service = _normalAuthStrategy;
service.User = _unitWork.FindSingle<User>(u => u.Account == username); service.User = _unitWork.FirstOrDefault<User>(u => u.Account == username);
} }
return new AuthStrategyContext(service); return new AuthStrategyContext(service);

View File

@@ -18,13 +18,12 @@ namespace OpenAuth.App
/// <summary> /// <summary>
/// 用于普通的数据库操作 /// 用于普通的数据库操作
/// </summary> /// </summary>
/// <value>The repository.</value>
protected IRepository<T> Repository; protected IRepository<T> Repository;
/// <summary> /// <summary>
/// 用于事务操作 /// 用于事务操作
/// <para>使用详见http://doc.openauth.me/core/unitwork.html</para>
/// </summary> /// </summary>
/// <value>The unit work.</value>
protected IUnitWork UnitWork; protected IUnitWork UnitWork;
protected IAuth _auth; protected IAuth _auth;
@@ -47,7 +46,7 @@ namespace OpenAuth.App
if (loginUser.User.Account == Define.SYSTEM_USERNAME) return UnitWork.Find<T>(null); //超级管理员特权 if (loginUser.User.Account == Define.SYSTEM_USERNAME) return UnitWork.Find<T>(null); //超级管理员特权
var moduleName = typeof(T).Name; var moduleName = typeof(T).Name;
var rule = UnitWork.FindSingle<DataPrivilegeRule>(u => u.SourceCode == moduleName); var rule = UnitWork.FirstOrDefault<DataPrivilegeRule>(u => u.SourceCode == moduleName);
if (rule == null) return UnitWork.Find<T>(null); //没有设置数据规则,那么视为该资源允许被任何主体查看 if (rule == null) return UnitWork.Find<T>(null); //没有设置数据规则,那么视为该资源允许被任何主体查看
if (rule.PrivilegeRules.Contains(Define.DATAPRIVILEGE_LOGINUSER) || if (rule.PrivilegeRules.Contains(Define.DATAPRIVILEGE_LOGINUSER) ||
rule.PrivilegeRules.Contains(Define.DATAPRIVILEGE_LOGINROLE)|| rule.PrivilegeRules.Contains(Define.DATAPRIVILEGE_LOGINROLE)||
@@ -82,7 +81,7 @@ namespace OpenAuth.App
public T Get(string id) public T Get(string id)
{ {
return Repository.FindSingle(u => u.Id == id); return Repository.FirstOrDefault(u => u.Id == id);
} }
/// <summary> /// <summary>
@@ -104,7 +103,7 @@ namespace OpenAuth.App
if (!string.IsNullOrEmpty(entity.ParentId)) if (!string.IsNullOrEmpty(entity.ParentId))
{ {
var parentOrg = UnitWork.FindSingle<U>(o => o.Id == entity.ParentId); var parentOrg = UnitWork.FirstOrDefault<U>(o => o.Id == entity.ParentId);
if (parentOrg != null) if (parentOrg != null)
{ {
cascadeId = parentOrg.CascadeId + currentCascadeId + "."; cascadeId = parentOrg.CascadeId + currentCascadeId + ".";

View File

@@ -29,7 +29,7 @@ namespace OpenAuth.App
CaculateCascade(obj); CaculateCascade(obj);
//获取旧的的CascadeId //获取旧的的CascadeId
var cascadeId = Repository.FindSingle(o => o.Id == obj.Id).CascadeId; var cascadeId = Repository.FirstOrDefault(o => o.Id == obj.Id).CascadeId;
//根据CascadeId查询子部门 //根据CascadeId查询子部门
var objs = Repository.Find(u => u.CascadeId.Contains(cascadeId) && u.Id != obj.Id) var objs = Repository.Find(u => u.CascadeId.Contains(cascadeId) && u.Id != obj.Id)
.OrderBy(u => u.CascadeId).ToList(); .OrderBy(u => u.CascadeId).ToList();

View File

@@ -6,6 +6,7 @@ using System.Linq;
using System.Reflection; using System.Reflection;
using System.Runtime.Loader; using System.Runtime.Loader;
using System.Text; using System.Text;
using System.Threading.Tasks;
using Infrastructure; using Infrastructure;
using Infrastructure.Extensions; using Infrastructure.Extensions;
using Infrastructure.Helpers; using Infrastructure.Helpers;
@@ -76,7 +77,7 @@ namespace OpenAuth.App
/// <summary> /// <summary>
/// 加载列表 /// 加载列表
/// </summary> /// </summary>
public TableResp<BuilderTable> Load(QueryBuilderTableListReq request) public async Task<TableResp<BuilderTable>> Load(QueryBuilderTableListReq request)
{ {
var loginContext = _auth.GetCurrentUser(); var loginContext = _auth.GetCurrentUser();
if (loginContext == null) if (loginContext == null)
@@ -192,9 +193,12 @@ namespace OpenAuth.App
/// <param name="ids"></param> /// <param name="ids"></param>
public void DelTableAndcolumns(string[] ids) public void DelTableAndcolumns(string[] ids)
{ {
UnitWork.Delete<BuilderTable>(u => ids.Contains(u.Id)); UnitWork.ExecuteWithTransaction(() =>
UnitWork.Delete<BuilderTableColumn>(u => ids.Contains(u.TableId)); {
UnitWork.Save(); UnitWork.Delete<BuilderTable>(u => ids.Contains(u.Id));
UnitWork.Delete<BuilderTableColumn>(u => ids.Contains(u.TableId));
UnitWork.Save();
});
} }
@@ -204,7 +208,7 @@ namespace OpenAuth.App
/// <returns></returns> /// <returns></returns>
public void CreateEntity(CreateEntityReq req) 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); var tableColumns = _builderTableColumnApp.Find(req.Id);
if (sysTableInfo == null if (sysTableInfo == null
|| tableColumns == null || tableColumns == null
@@ -223,7 +227,7 @@ namespace OpenAuth.App
/// <returns></returns> /// <returns></returns>
public void CreateBusiness(CreateBusiReq req) 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); var tableColumns = _builderTableColumnApp.Find(req.Id);
if (sysTableInfo == null if (sysTableInfo == null
|| tableColumns == null || tableColumns == null
@@ -512,7 +516,7 @@ namespace OpenAuth.App
{ {
throw new Exception("请提供vue项目的根目录,如C:\\OpenAuth.Pro\\Client"); 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); var tableColumns = _builderTableColumnApp.Find(req.Id);
if (sysTableInfo == null if (sysTableInfo == null
|| tableColumns == null || tableColumns == null
@@ -617,7 +621,7 @@ namespace OpenAuth.App
.Replace("{Temp}", tempBuilder.ToString()) .Replace("{Temp}", tempBuilder.ToString())
.Replace("{DialogFormItem}", dialogStrBuilder.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", $"index.vue",
domainContent); domainContent);
} }
@@ -633,7 +637,7 @@ namespace OpenAuth.App
{ {
throw new Exception("请提供vue项目的根目录,如C:\\OpenAuth.Pro\\Client"); 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); var tableColumns = _builderTableColumnApp.Find(req.Id);
if (sysTableInfo == null if (sysTableInfo == null
|| tableColumns == null || tableColumns == null

View File

@@ -1,6 +1,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading.Tasks;
using Infrastructure; using Infrastructure;
using OpenAuth.App.Interface; using OpenAuth.App.Interface;
using OpenAuth.App.Request; using OpenAuth.App.Request;
@@ -21,7 +22,7 @@ namespace OpenAuth.App
/// <summary> /// <summary>
/// 加载列表 /// 加载列表
/// </summary> /// </summary>
public TableResp<BuilderTableColumn> Load(QueryBuilderTableColumnListReq request) public async Task<TableResp<BuilderTableColumn>> Load(QueryBuilderTableColumnListReq request)
{ {
if (string.IsNullOrEmpty(request.BuilderTableId)) if (string.IsNullOrEmpty(request.BuilderTableId))
{ {

View File

@@ -1,6 +1,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading.Tasks;
using Infrastructure; using Infrastructure;
using OpenAuth.App.Interface; using OpenAuth.App.Interface;
using OpenAuth.App.Request; using OpenAuth.App.Request;
@@ -16,7 +17,7 @@ namespace OpenAuth.App
/// <summary> /// <summary>
/// 加载列表 /// 加载列表
/// </summary> /// </summary>
public TableData Load(QueryCategoryListReq request) public async Task<TableData> Load(QueryCategoryListReq request)
{ {
var loginContext = _auth.GetCurrentUser(); var loginContext = _auth.GetCurrentUser();
if (loginContext == null) if (loginContext == null)

View File

@@ -1,6 +1,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading.Tasks;
using Infrastructure; using Infrastructure;
using OpenAuth.App.Interface; using OpenAuth.App.Interface;
using OpenAuth.App.Request; using OpenAuth.App.Request;
@@ -18,7 +19,7 @@ namespace OpenAuth.App
/// <summary> /// <summary>
/// 加载列表 /// 加载列表
/// </summary> /// </summary>
public TableData Load(QueryCategoryTypeListReq request) public async Task<TableData> Load(QueryCategoryTypeListReq request)
{ {
var result = new TableData(); var result = new TableData();
var objs = UnitWork.Find<CategoryType>(null); var objs = UnitWork.Find<CategoryType>(null);
@@ -56,9 +57,13 @@ namespace OpenAuth.App
public new void Delete(string[] ids) public new void Delete(string[] ids)
{ {
UnitWork.Delete<CategoryType>(u=>ids.Contains(u.Id)); UnitWork.ExecuteWithTransaction(() =>
UnitWork.Delete<Category>(u=>ids.Contains(u.TypeId)); {
UnitWork.Save(); UnitWork.Delete<CategoryType>(u=>ids.Contains(u.Id));
UnitWork.Delete<Category>(u=>ids.Contains(u.TypeId));
UnitWork.Save();
});
} }
public List<CategoryType> AllTypes() public List<CategoryType> AllTypes()

View File

@@ -1,5 +1,6 @@
using System; using System;
using System.Linq; using System.Linq;
using System.Threading.Tasks;
using Infrastructure; using Infrastructure;
using OpenAuth.App.Interface; using OpenAuth.App.Interface;
using OpenAuth.App.Request; using OpenAuth.App.Request;
@@ -16,7 +17,7 @@ namespace OpenAuth.App
/// <summary> /// <summary>
/// 加载列表 /// 加载列表
/// </summary> /// </summary>
public TableData Load(QueryDataPrivilegeRuleListReq request) public async Task<TableData> Load(QueryDataPrivilegeRuleListReq request)
{ {
var loginContext = _auth.GetCurrentUser(); var loginContext = _auth.GetCurrentUser();
if (loginContext == null) if (loginContext == null)
@@ -51,7 +52,7 @@ namespace OpenAuth.App
public void Add(AddOrUpdateDataPriviReq req) 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}的数据规则,如果想调整规制请直接修改"); throw new Exception($"已经存在{req.SourceCode}的数据规则,如果想调整规制请直接修改");
} }
@@ -85,7 +86,7 @@ namespace OpenAuth.App
public DataPrivilegeRule GetByModuleName(string moduleName) public DataPrivilegeRule GetByModuleName(string moduleName)
{ {
return Repository.FindSingle(u=>u.SourceCode == moduleName); return Repository.FirstOrDefault(u=>u.SourceCode == moduleName);
} }
public void Clear() public void Clear()

View File

@@ -134,7 +134,7 @@ namespace OpenAuth.App
END AS EntityType, END AS EntityType,
case WHEN CHARACTER_MAXIMUM_LENGTH>8000 THEN 0 ELSE CHARACTER_MAXIMUM_LENGTH end AS Maxlength, case WHEN CHARACTER_MAXIMUM_LENGTH>8000 THEN 0 ELSE CHARACTER_MAXIMUM_LENGTH end AS Maxlength,
CASE CASE
WHEN COLUMN_KEY <> '' THEN WHEN COLUMN_KEY = 'PRI' THEN
1 ELSE 0 1 ELSE 0
END AS IsKey, END AS IsKey,
CASE CASE

View File

@@ -24,6 +24,7 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Linq.Expressions; using System.Linq.Expressions;
using System.Net.Http; using System.Net.Http;
using System.Threading.Tasks;
using Infrastructure.Helpers; using Infrastructure.Helpers;
namespace OpenAuth.App namespace OpenAuth.App
@@ -472,7 +473,7 @@ namespace OpenAuth.App
Repository.Update(flowScheme); Repository.Update(flowScheme);
} }
public TableData Load(QueryFlowInstanceListReq request) public async Task<TableData> Load(QueryFlowInstanceListReq request)
{ {
var result = new TableData(); var result = new TableData();
var user = _auth.GetCurrentUser(); var user = _auth.GetCurrentUser();

View File

@@ -1,5 +1,6 @@
using System; using System;
using System.Linq; using System.Linq;
using System.Threading.Tasks;
using OpenAuth.App.Interface; using OpenAuth.App.Interface;
using OpenAuth.App.Request; using OpenAuth.App.Request;
using OpenAuth.App.Response; using OpenAuth.App.Response;
@@ -12,7 +13,7 @@ namespace OpenAuth.App
{ {
public void Add(FlowScheme flowScheme) public void Add(FlowScheme flowScheme)
{ {
if (Repository.IsExist(u => u.SchemeName == flowScheme.SchemeName)) if (Repository.Any(u => u.SchemeName == flowScheme.SchemeName))
{ {
throw new Exception("流程名称已经存在"); throw new Exception("流程名称已经存在");
} }
@@ -25,12 +26,12 @@ namespace OpenAuth.App
public FlowScheme FindByCode(string code) public FlowScheme FindByCode(string code)
{ {
return Repository.FindSingle(u => u.SchemeCode == code); return Repository.FirstOrDefault(u => u.SchemeCode == code);
} }
public void Update(FlowScheme flowScheme) 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("流程名称已经存在"); throw new Exception("流程名称已经存在");
} }
@@ -48,7 +49,7 @@ namespace OpenAuth.App
}); });
} }
public TableData Load(QueryFlowSchemeListReq request) public async Task<TableData> Load(QueryFlowSchemeListReq request)
{ {
var result = new TableData(); var result = new TableData();
var objs = GetDataPrivilege("u"); var objs = GetDataPrivilege("u");

View File

@@ -1,5 +1,6 @@
using System; using System;
using System.Linq; using System.Linq;
using System.Threading.Tasks;
using Infrastructure; using Infrastructure;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using OpenAuth.App.Interface; using OpenAuth.App.Interface;
@@ -18,7 +19,7 @@ namespace OpenAuth.App
/// <summary> /// <summary>
/// 加载列表 /// 加载列表
/// </summary> /// </summary>
public TableData Load(QueryFormListReq request) public async Task<TableData> Load(QueryFormListReq request)
{ {
var result = new TableData(); var result = new TableData();
var forms = GetDataPrivilege("u"); var forms = GetDataPrivilege("u");

View File

@@ -1,4 +1,5 @@
using Infrastructure; using System.Threading.Tasks;
using Infrastructure;
using OpenAuth.App.Interface; using OpenAuth.App.Interface;
using OpenAuth.App.Request; using OpenAuth.App.Request;
using OpenAuth.App.Response; using OpenAuth.App.Response;
@@ -15,11 +16,11 @@ namespace OpenAuth.App
/// <summary> /// <summary>
/// 加载列表 /// 加载列表
/// </summary> /// </summary>
public TableData Load(QueryFrmLeaveReqListReq request) public async Task<TableData> Load(QueryFrmLeaveReqListReq request)
{ {
return new TableData return new TableData
{ {
count = Repository.GetCount(null), count = Repository.Count(null),
data = Repository.Find(request.page, request.limit, "Id desc") data = Repository.Find(request.page, request.limit, "Id desc")
}; };
} }

View File

@@ -8,9 +8,10 @@ using OpenAuth.Repository.Interface;
namespace OpenAuth.App namespace OpenAuth.App
{ {
public class ModuleManagerApp :BaseTreeApp<Module> public class ModuleManagerApp : BaseTreeApp<Module>
{ {
private RevelanceManagerApp _revelanceApp; private RevelanceManagerApp _revelanceApp;
public void Add(Module model) public void Add(Module model)
{ {
var loginContext = _auth.GetCurrentUser(); var loginContext = _auth.GetCurrentUser();
@@ -18,20 +19,22 @@ namespace OpenAuth.App
{ {
throw new CommonException("登录已过期", Define.INVALID_TOKEN); throw new CommonException("登录已过期", Define.INVALID_TOKEN);
} }
CaculateCascade(model); CaculateCascade(model);
Repository.Add(model); Repository.Add(model);
AddDefaultMenus(model);
//当前登录用户的所有角色自动分配模块 //当前登录用户的所有角色自动分配模块
loginContext.Roles.ForEach(u => loginContext.Roles.ForEach(u =>
{ {
_revelanceApp.Assign(new AssignReq _revelanceApp.Assign(new AssignReq
{ {
type=Define.ROLEMODULE, type = Define.ROLEMODULE,
firstId = u.Id, firstId = u.Id,
secIds = new[]{model.Id} secIds = new[] {model.Id}
}); });
}); });
} }
public void Update(Module obj) public void Update(Module obj)
@@ -40,10 +43,8 @@ namespace OpenAuth.App
} }
#region / #region /
/// <summary> /// <summary>
/// 加载特定角色的模块 /// 加载特定角色的模块
/// </summary> /// </summary>
@@ -67,7 +68,7 @@ namespace OpenAuth.App
var query = UnitWork.Find<ModuleElement>(u => elementIds.Contains(u.Id)); var query = UnitWork.Find<ModuleElement>(u => elementIds.Contains(u.Id));
if (!string.IsNullOrEmpty(moduleId)) if (!string.IsNullOrEmpty(moduleId))
{ {
query = query.Where(u => u.ModuleId == moduleId); query = query.Where(u => u.ModuleId == moduleId);
} }
return query; return query;
@@ -77,6 +78,7 @@ namespace OpenAuth.App
#region #region
/// <summary> /// <summary>
/// 删除指定的菜单 /// 删除指定的菜单
/// </summary> /// </summary>
@@ -87,6 +89,7 @@ namespace OpenAuth.App
UnitWork.Save(); UnitWork.Save();
} }
public void AddMenu(ModuleElement model) public void AddMenu(ModuleElement model)
{ {
var loginContext = _auth.GetCurrentUser(); var loginContext = _auth.GetCurrentUser();
@@ -94,21 +97,24 @@ namespace OpenAuth.App
{ {
throw new CommonException("登录已过期", Define.INVALID_TOKEN); throw new CommonException("登录已过期", Define.INVALID_TOKEN);
} }
UnitWork.Add(model);
UnitWork.ExecuteWithTransaction(() =>
//当前登录用户的所有角色自动分配菜单 {
loginContext.Roles.ForEach(u => UnitWork.Add(model);
{
_revelanceApp.Assign(new AssignReq //当前登录用户的所有角色自动分配菜单
loginContext.Roles.ForEach(u =>
{ {
type=Define.ROLEELEMENT, _revelanceApp.Assign(new AssignReq
firstId = u.Id, {
secIds = new[]{model.Id} type = Define.ROLEELEMENT,
firstId = u.Id,
secIds = new[] {model.Id}
});
}); });
UnitWork.Save();
}); });
UnitWork.Save();
} }
#endregion
public void UpdateMenu(ModuleElement model) public void UpdateMenu(ModuleElement model)
{ {
@@ -116,8 +122,51 @@ namespace OpenAuth.App
UnitWork.Save(); 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<Module> repository public ModuleManagerApp(IUnitWork unitWork, IRepository<Module> repository
,RevelanceManagerApp app,IAuth auth) : base(unitWork, repository, auth) , RevelanceManagerApp app, IAuth auth) : base(unitWork, repository, auth)
{ {
_revelanceApp = app; _revelanceApp = app;
} }

View File

@@ -1,6 +1,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading.Tasks;
using Infrastructure; using Infrastructure;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using OpenAuth.App.Interface; using OpenAuth.App.Interface;
@@ -23,7 +24,7 @@ namespace OpenAuth.App
/// <summary> /// <summary>
/// 加载列表 /// 加载列表
/// </summary> /// </summary>
public TableData Load(QueryOpenJobListReq request) public async Task<TableData> Load(QueryOpenJobListReq request)
{ {
var result = new TableData(); var result = new TableData();
var objs = Repository.Find(null); var objs = Repository.Find(null);
@@ -86,7 +87,7 @@ namespace OpenAuth.App
public void ChangeJobStatus(ChangeJobStatusReq req) 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) if (job == null)
{ {
throw new Exception("任务不存在"); throw new Exception("任务不存在");
@@ -140,7 +141,7 @@ namespace OpenAuth.App
/// <param name="jobId"></param> /// <param name="jobId"></param>
public void RecordRun(string jobId) public void RecordRun(string jobId)
{ {
var job = Repository.FindSingle(u =>u.Id == jobId); var job = Repository.FirstOrDefault(u =>u.Id == jobId);
if (job == null) if (job == null)
{ {
_sysLogApp.Add(new SysLog _sysLogApp.Add(new SysLog

View File

@@ -1,6 +1,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading.Tasks;
using Infrastructure; using Infrastructure;
using OpenAuth.App.Interface; using OpenAuth.App.Interface;
using OpenAuth.App.Request; using OpenAuth.App.Request;
@@ -47,7 +48,7 @@ namespace OpenAuth.App
return UnitWork.Find<Resource>(u => elementIds.Contains(u.Id) && (appId == null || appId =="" || u.AppId == appId)); return UnitWork.Find<Resource>(u => elementIds.Contains(u.Id) && (appId == null || appId =="" || u.AppId == appId));
} }
public TableData Load(QueryResourcesReq request) public async Task<TableData> Load(QueryResourcesReq request)
{ {
var loginContext = _auth.GetCurrentUser(); var loginContext = _auth.GetCurrentUser();
if (loginContext == null) if (loginContext == null)

View File

@@ -51,7 +51,7 @@ namespace OpenAuth.App.SSO
} }
else else
{ {
userInfo = _app.FindSingle(u =>u.Account == model.Account); userInfo = _app.FirstOrDefault(u =>u.Account == model.Account);
} }
if (userInfo == null) if (userInfo == null)
@@ -63,6 +63,11 @@ namespace OpenAuth.App.SSO
throw new Exception("密码错误"); throw new Exception("密码错误");
} }
if (userInfo.Status != 0)
{
throw new Exception("账号状态异常,可能已停用");
}
var currentSession = new UserAuthSession var currentSession = new UserAuthSession
{ {
Account = model.Account, Account = model.Account,

View File

@@ -1,5 +1,6 @@
using System.Linq; using System.Linq;
using System.Reflection; using System.Reflection;
using System.Threading.Tasks;
using OpenAuth.App.Request; using OpenAuth.App.Request;
using OpenAuth.App.Response; using OpenAuth.App.Response;
using OpenAuth.Repository.Domain; using OpenAuth.Repository.Domain;
@@ -14,7 +15,7 @@ namespace OpenAuth.App
/// <summary> /// <summary>
/// 加载列表 /// 加载列表
/// </summary> /// </summary>
public TableData Load(QuerySysLogListReq request) public async Task<TableData> Load(QuerySysLogListReq request)
{ {
var result = new TableData(); var result = new TableData();
var objs = UnitWork.Find<SysLog>(null); var objs = UnitWork.Find<SysLog>(null);

View File

@@ -1,4 +1,5 @@
using System.Linq; using System.Linq;
using System.Threading.Tasks;
using Infrastructure; using Infrastructure;
using OpenAuth.App.Interface; using OpenAuth.App.Interface;
using OpenAuth.App.Request; using OpenAuth.App.Request;
@@ -16,7 +17,7 @@ namespace OpenAuth.App
/// <summary> /// <summary>
/// 加载列表 /// 加载列表
/// </summary> /// </summary>
public TableData Load(QuerySysMessageListReq request) public async Task<TableData> Load(QuerySysMessageListReq request)
{ {
var loginContext = _auth.GetCurrentUser(); var loginContext = _auth.GetCurrentUser();
if (loginContext == null) if (loginContext == null)

View File

@@ -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<ICacheContext>();
cachemock.Setup(x => x.Get<UserAuthSession>("tokentest"))
.Returns(new UserAuthSession { Account = "System" });
services.AddScoped(x => cachemock.Object);
var httpContextAccessorMock = new Mock<IHttpContextAccessor>();
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<IRepository<User>>();
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($"更新完成");
}
}
}

View File

@@ -1,6 +1,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading.Tasks;
using Castle.Core.Internal; using Castle.Core.Internal;
using OpenAuth.App.Interface; using OpenAuth.App.Interface;
using OpenAuth.App.Request; using OpenAuth.App.Request;
@@ -25,14 +26,14 @@ namespace OpenAuth.App
public User GetByAccount(string account) public User GetByAccount(string account)
{ {
return Repository.FindSingle(u => u.Account == account); return Repository.FirstOrDefault(u => u.Account == account);
} }
/// <summary> /// <summary>
/// 加载当前登录用户可访问的一个部门及子部门全部用户 /// 加载当前登录用户可访问的一个部门及子部门全部用户
/// 如果请求的request.OrgId为空则可以获取到已被删除机构的用户没有分配任何机构的用户 /// 如果请求的request.OrgId为空则可以获取到已被删除机构的用户没有分配任何机构的用户
/// </summary> /// </summary>
public TableData Load(QueryUserListReq request) public async Task<TableData> Load(QueryUserListReq request)
{ {
var loginUser = _auth.GetCurrentUser(); var loginUser = _auth.GetCurrentUser();
@@ -120,7 +121,7 @@ namespace OpenAuth.App
requser.CreateId = _auth.GetCurrentUser().User.Id; requser.CreateId = _auth.GetCurrentUser().User.Id;
if (string.IsNullOrEmpty(request.Id)) if (string.IsNullOrEmpty(request.Id))
{ {
if (UnitWork.IsExist<User>(u => u.Account == request.Account)) if (UnitWork.Any<User>(u => u.Account == request.Account))
{ {
throw new Exception("用户账号已存在"); throw new Exception("用户账号已存在");
} }
@@ -191,7 +192,7 @@ namespace OpenAuth.App
/// </summary> /// </summary>
/// <param name="request"></param> /// <param name="request"></param>
/// <returns></returns> /// <returns></returns>
public TableData LoadByRole(QueryUserListByRoleReq request) public async Task<TableData> LoadByRole(QueryUserListByRoleReq request)
{ {
var users = from userRole in UnitWork.Find<Relevance>(u => var users = from userRole in UnitWork.Find<Relevance>(u =>
u.SecondId == request.roleId && u.Key == Define.USERROLE) u.SecondId == request.roleId && u.Key == Define.USERROLE)
@@ -211,7 +212,7 @@ namespace OpenAuth.App
/// </summary> /// </summary>
/// <param name="request"></param> /// <param name="request"></param>
/// <returns></returns> /// <returns></returns>
public TableData LoadByOrg(QueryUserListByOrgReq request) public async Task<TableData> LoadByOrg(QueryUserListByOrgReq request)
{ {
var users = from userRole in UnitWork.Find<Relevance>(u => var users = from userRole in UnitWork.Find<Relevance>(u =>
u.SecondId == request.orgId && u.Key == Define.USERORG) u.SecondId == request.orgId && u.Key == Define.USERORG)

View File

@@ -1,5 +1,6 @@
using System; using System;
using System.Linq; using System.Linq;
using System.Threading.Tasks;
using Infrastructure; using Infrastructure;
using OpenAuth.App.Interface; using OpenAuth.App.Interface;
using OpenAuth.App.Request; using OpenAuth.App.Request;
@@ -18,7 +19,7 @@ namespace OpenAuth.App
/// <summary> /// <summary>
/// 加载列表 /// 加载列表
/// </summary> /// </summary>
public TableData Load(QueryWmsInboundOrderDtblListReq request) public async Task<TableData> Load(QueryWmsInboundOrderDtblListReq request)
{ {
var loginContext = _auth.GetCurrentUser(); var loginContext = _auth.GetCurrentUser();

View File

@@ -1,5 +1,6 @@
using System; using System;
using System.Linq; using System.Linq;
using System.Threading.Tasks;
using Infrastructure; using Infrastructure;
using OpenAuth.App.Interface; using OpenAuth.App.Interface;
using OpenAuth.App.Request; using OpenAuth.App.Request;
@@ -18,7 +19,7 @@ namespace OpenAuth.App
/// <summary> /// <summary>
/// 加载列表 /// 加载列表
/// </summary> /// </summary>
public TableData Load(QueryWmsInboundOrderTblListReq request) public async Task<TableData> Load(QueryWmsInboundOrderTblListReq request)
{ {
var loginContext = _auth.GetCurrentUser(); var loginContext = _auth.GetCurrentUser();
if (loginContext == null) if (loginContext == null)
@@ -67,69 +68,71 @@ namespace OpenAuth.App
_wmsInboundOrderDtblApp.AddNoSave(detail); _wmsInboundOrderDtblApp.AddNoSave(detail);
} }
} }
UnitWork.Save(); UnitWork.Save();
} }
public void Update(AddOrUpdateWmsInboundOrderTblReq obj) public void Update(AddOrUpdateWmsInboundOrderTblReq obj)
{ {
var user = _auth.GetCurrentUser().User; 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<WmsInboundOrderDtbl>(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<WmsInboundOrderTbl>(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<WmsInboundOrderDtbl>(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<WmsInboundOrderTbl>(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<WmsInboundOrderTbl> repository, public WmsInboundOrderTblApp(IUnitWork unitWork, IRepository<WmsInboundOrderTbl> repository,
RevelanceManagerApp app, IAuth auth, WmsInboundOrderDtblApp wmsInboundOrderDtblApp) : base(unitWork, repository,auth) RevelanceManagerApp app, IAuth auth, WmsInboundOrderDtblApp wmsInboundOrderDtblApp) : base(unitWork,
repository, auth)
{ {
_revelanceApp = app; _revelanceApp = app;
_wmsInboundOrderDtblApp = wmsInboundOrderDtblApp; _wmsInboundOrderDtblApp = wmsInboundOrderDtblApp;

View File

@@ -1,5 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Threading.Tasks;
using Infrastructure; using Infrastructure;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using OpenAuth.App; using OpenAuth.App;
@@ -14,12 +15,12 @@ namespace OpenAuth.Mvc.Controllers
private readonly AppManager _app; private readonly AppManager _app;
public string GetList([FromQuery]QueryAppListReq request) public async Task<string> GetList([FromQuery]QueryAppListReq request)
{ {
var resp = new Response<List<Application>>(); var resp = new Response<List<Application>>();
try try
{ {
resp.Result = _app.GetList(request); resp.Result = await _app.GetList(request);
} }
catch (Exception e) catch (Exception e)
{ {

View File

@@ -1,4 +1,5 @@
using System; using System;
using System.Threading.Tasks;
using Infrastructure; using Infrastructure;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using OpenAuth.App; using OpenAuth.App;
@@ -25,10 +26,10 @@ namespace OpenAuth.Mvc.Controllers
return View(); return View();
} }
public string All([FromQuery]QueryCategoryListReq request) public async Task<string> All([FromQuery]QueryCategoryListReq request)
{ {
TableData data = new TableData(); TableData data = new TableData();
data = _app.Load(request); data = await _app.Load(request);
return JsonHelper.Instance.Serialize(data); return JsonHelper.Instance.Serialize(data);
} }

View File

@@ -1,5 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Threading.Tasks;
using Infrastructure; using Infrastructure;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using OpenAuth.App; using OpenAuth.App;
@@ -95,9 +96,10 @@ namespace OpenAuth.Mvc.Controllers
/// <summary> /// <summary>
/// 加载组织下面的所有用户 /// 加载组织下面的所有用户
/// </summary> /// </summary>
public string Load([FromQuery]QueryUserListReq request) public async Task<string> Load([FromQuery]QueryUserListReq request)
{ {
return JsonHelper.Instance.Serialize(_app.Load(request)); var load = await _app.Load(request);
return JsonHelper.Instance.Serialize(load);
} }
[HttpPost] [HttpPost]
@@ -120,11 +122,11 @@ namespace OpenAuth.Mvc.Controllers
/// <summary> /// <summary>
/// 获取用户可访问的账号 /// 获取用户可访问的账号
/// <para>李玉宝于2017-02-28 15:12:19</para>
/// </summary> /// </summary>
public string GetAccessedUsers() public async Task<string> GetAccessedUsers()
{ {
IEnumerable<UserView> users = _app.Load(new QueryUserListReq()).data; var data = await _app.Load(new QueryUserListReq());
IEnumerable<UserView> users = data.data;
var result = new Dictionary<string, object>(); var result = new Dictionary<string, object>();
foreach (var user in users) foreach (var user in users)
{ {

View File

@@ -107,4 +107,4 @@
</div> </div>
<script type="text/javascript" src="/layui/layui.js"></script> <script type="text/javascript" src="/layui/layui.js"></script>
<script type="text/javascript" src="/userJs/users.js?v1.6"></script> <script type="text/javascript" src="/userJs/users.js?v2.0"></script>

View File

@@ -121,6 +121,9 @@ layui.config({
$(that.config.idDOM).val(ids.join(",")); $(that.config.idDOM).val(ids.join(","));
$(that.config.nameDOM).val(names.join(",")); $(that.config.nameDOM).val(names.join(","));
if(options.callback){
options.callback(ids.join(","), names.join(","));
}
$(that.config.idDOM).change(); $(that.config.idDOM).change();
if(flag){ if(flag){
layer.close(index); layer.close(index);
@@ -135,14 +138,17 @@ layui.config({
text: 'Name', text: 'Name',
key: 'Id', key: 'Id',
parentKey: 'ParentId', parentKey: 'ParentId',
callback:null, //选中后的回调
selectedMulti: true //默认是多选 selectedMulti: true //默认是多选
}; };
exports('droptree', function (url, name, id, selectedMulti) { exports('droptree', function (url, name, id, selectedMulti,callback) {
var options = { var options = {
nameDOM: name, //显示的文本框ID"#catetoryName" nameDOM: name, //显示的文本框ID"#catetoryName"
idDOM: id, //隐藏的文本框,如:"#categoryId" idDOM: id, //隐藏的文本框,如:"#categoryId"
url: url, url: url,
callback:callback, //选中后的回调
selectedMulti: selectedMulti //是否为多选 selectedMulti: selectedMulti //是否为多选
} }
inst = new DropTree(options); inst = new DropTree(options);

View File

@@ -385,6 +385,10 @@ layui.define(['laypage', 'form'], function (exports) {
IconPicker.prototype.checkIcon = function (filter, iconName){ IconPicker.prototype.checkIcon = function (filter, iconName){
var p = $('*[lay-filter='+ filter +']').next().find('.layui-iconpicker-item .layui-icon'), var p = $('*[lay-filter='+ filter +']').next().find('.layui-iconpicker-item .layui-icon'),
c = iconName; c = iconName;
if(c == undefined){
return;
}
if (c.indexOf('#xe') > 0){ if (c.indexOf('#xe') > 0){
p.html(c); p.html(c);

View File

@@ -6,12 +6,57 @@ layui.config({
$ = layui.jquery; $ = layui.jquery;
var iconPicker = layui.iconPicker; var iconPicker = layui.iconPicker;
var btnIconPicker = 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({ iconPicker.render({
// 选择器推荐使用input // 选择器推荐使用input
elem: '#IconName', elem: '#IconName',
type: 'fontClass', type: 'fontClass',
// 每个图标格子的宽度:'43px'或'20%' // 每个图标格子的宽度:'43px'或'20%'
cellWidth: '43px', cellWidth: '43px',
// 点击回调
click: function (data) {
vmModule.tmp.IconName = data.icon;
}
}); });
btnIconPicker.render({ //按钮的图标 btnIconPicker.render({ //按钮的图标
// 选择器推荐使用input // 选择器推荐使用input
@@ -19,6 +64,10 @@ layui.config({
type: 'fontClass', type: 'fontClass',
// 每个图标格子的宽度:'43px'或'20%' // 每个图标格子的宽度:'43px'或'20%'
cellWidth: '43px', cellWidth: '43px',
// 点击回调
click: function (data) {
vmMenu.tmp.Icon = data.icon;
}
}); });
var table = layui.table; var table = layui.table;
@@ -98,7 +147,6 @@ layui.config({
$("#tree").height($("div.layui-table-view").height()); $("#tree").height($("div.layui-table-view").height());
//添加(编辑)模块对话框 //添加(编辑)模块对话框
var editDlg = function() { var editDlg = function() {
var vm;
var update = false; //是否为更新 var update = false; //是否为更新
var show = function (data) { var show = function (data) {
var title = update ? "编辑信息" : "添加"; var title = update ? "编辑信息" : "添加";
@@ -108,34 +156,12 @@ layui.config({
type: 1, type: 1,
content: $('#divEdit'), content: $('#divEdit'),
success: function() { success: function() {
if(vm == undefined){ if(data.Id ==''){
vm = new Vue({ for(var key in vmModule.tmp){
el: "#formEdit", delete vmModule.tmp[key];
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);
} }
}); }
}else{ vmModule.tmp = Object.assign({}, vmModule.tmp,data)
vm.tmp = Object.assign({}, vm.tmp,data)
}
}, },
end: mainList end: mainList
}); });
@@ -176,7 +202,6 @@ layui.config({
//添加菜单对话框 //添加菜单对话框
var meditDlg = function () { var meditDlg = function () {
var vm ;
var update = false; //是否为更新 var update = false; //是否为更新
var show = function (data) { var show = function (data) {
var title = update ? "编辑信息" : "添加"; var title = update ? "编辑信息" : "添加";
@@ -186,30 +211,12 @@ layui.config({
type: 1, type: 1,
content: $('#divMenuEdit'), content: $('#divMenuEdit'),
success: function () { success: function () {
if(vm == undefined){ if(data.Id ==''){
vm = new Vue({ for(var key in vmMenu.tmp){
el: "#mfromEdit", delete vmMenu.tmp[key];
data(){ }
return { }
tmp:data //使用一个tmp封装一下后面可以直接用vm.tmp赋值 vmMenu.tmp = Object.assign({}, vmMenu.tmp,data)
}
},
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)
}
}, },
end: menuList end: menuList
}); });
@@ -235,7 +242,8 @@ layui.config({
show({ show({
Id: "", Id: "",
ModuleId:moduleId, ModuleId:moduleId,
Sort: 1 Sort: 1,
Icon:'layui-icon-app'
}); });
}, },
update: function (data) { //弹出编辑框 update: function (data) { //弹出编辑框

View File

@@ -93,7 +93,11 @@
}, },
mounted(){ mounted(){
form.render(); 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;
});
} }
}); });

View File

@@ -90,13 +90,17 @@ layui.config({
tmp(val){ tmp(val){
this.$nextTick(function () { this.$nextTick(function () {
form.render(); //刷新select等 form.render(); //刷新select等
layui.droptree("/UserSession/GetOrgs", "#Organizations", "#OrganizationIds"); //layui.droptree("/UserSession/GetOrgs", "#Organizations", "#OrganizationIds");
}) })
} }
}, },
mounted(){ mounted(){
form.render(); 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{ }else{

View File

@@ -2,6 +2,7 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.Linq; using System.Linq;
using System.Linq.Expressions; using System.Linq.Expressions;
using System.Threading.Tasks;
using Infrastructure; using Infrastructure;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using OpenAuth.Repository.Core; using OpenAuth.Repository.Core;
@@ -29,7 +30,7 @@ namespace OpenAuth.Repository
return Filter(exp); return Filter(exp);
} }
public bool IsExist(Expression<Func<T, bool>> exp) public bool Any(Expression<Func<T, bool>> exp)
{ {
return _context.Set<T>().Any(exp); return _context.Set<T>().Any(exp);
} }
@@ -37,7 +38,7 @@ namespace OpenAuth.Repository
/// <summary> /// <summary>
/// 查找单个,且不被上下文所跟踪 /// 查找单个,且不被上下文所跟踪
/// </summary> /// </summary>
public T FindSingle(Expression<Func<T, bool>> exp) public T FirstOrDefault(Expression<Func<T, bool>> exp)
{ {
return _context.Set<T>().AsNoTracking().FirstOrDefault(exp); return _context.Set<T>().AsNoTracking().FirstOrDefault(exp);
} }
@@ -61,7 +62,7 @@ namespace OpenAuth.Repository
/// <summary> /// <summary>
/// 根据过滤条件获取记录数 /// 根据过滤条件获取记录数
/// </summary> /// </summary>
public int GetCount(Expression<Func<T, bool>> exp = null) public int Count(Expression<Func<T, bool>> exp = null)
{ {
return Filter(exp).Count(); return Filter(exp).Count();
} }
@@ -116,7 +117,6 @@ namespace OpenAuth.Repository
Save(); Save();
} }
/// <summary> /// <summary>
/// 实现按需要只更新部分更新 /// 实现按需要只更新部分更新
/// <para>如Update(u =>u.Id==1,u =>new User{Name="ok"});</para> /// <para>如Update(u =>u.Id==1,u =>new User{Name="ok"});</para>
@@ -132,7 +132,7 @@ namespace OpenAuth.Repository
{ {
_context.Set<T>().Where(exp).Delete(); _context.Set<T>().Where(exp).Delete();
} }
public void Save() public void Save()
{ {
try try
@@ -169,7 +169,7 @@ namespace OpenAuth.Repository
return dbSet; return dbSet;
} }
public int ExecuteSql(string sql) public int ExecuteSqlRaw(string sql)
{ {
return _context.Database.ExecuteSqlRaw(sql); return _context.Database.ExecuteSqlRaw(sql);
} }
@@ -193,5 +193,129 @@ namespace OpenAuth.Repository
{ {
return _context.Query<T>().FromSqlRaw(sql, parameters); return _context.Query<T>().FromSqlRaw(sql, parameters);
} }
#region
/// <summary>
/// 异步执行sql
/// </summary>
/// <param name="sql"></param>
/// <returns></returns>
public async Task<int> ExecuteSqlRawAsync(string sql)
{
return await _context.Database.ExecuteSqlRawAsync(sql);
}
public async Task<int> AddAsync(T entity)
{
if (entity.KeyIsNull())
{
entity.GenerateDefaultKeyVal();
}
_context.Set<T>().Add(entity);
return await SaveAsync();
//_context.Entry(entity).State = EntityState.Detached;
}
public async Task<int> BatchAddAsync(T[] entities)
{
foreach (var entity in entities)
{
if (entity.KeyIsNull())
{
entity.GenerateDefaultKeyVal();
}
}
await _context.Set<T>().AddRangeAsync(entities);
return await SaveAsync();
}
/// <summary>
/// 异步更新
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public async Task<int> UpdateAsync(T entity)
{
var entry = this._context.Entry(entity);
entry.State = EntityState.Modified;
//如果数据没有发生变化
if (!this._context.ChangeTracker.HasChanges())
{
return 0;
}
return await SaveAsync();
}
/// <summary>
/// 异步删除
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public async Task<int> DeleteAsync(T entity)
{
_context.Set<T>().Remove(entity);
return await SaveAsync();
}
/// <summary>
/// 异步保存
/// </summary>
/// <returns></returns>
/// <exception cref="Exception"></exception>
public async Task<int> 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);
}
}
/// <summary>
/// 根据过滤条件获取记录数
/// </summary>
public async Task<int> CountAsync(Expression<Func<T, bool>> exp = null)
{
return await Filter(exp).CountAsync();
}
public async Task<bool> AnyAsync(Expression<Func<T, bool>> exp)
{
return await _context.Set<T>().AnyAsync(exp);
}
/// <summary>
/// 查找单个,且不被上下文所跟踪
/// </summary>
public async Task<T> FirstOrDefaultAsync(Expression<Func<T, bool>> exp)
{
return await _context.Set<T>().AsNoTracking().FirstOrDefaultAsync(exp);
}
#endregion
} }
} }

View File

@@ -15,29 +15,30 @@
using System; using System;
using System.Linq; using System.Linq;
using System.Linq.Expressions; using System.Linq.Expressions;
using System.Threading.Tasks;
namespace OpenAuth.Repository.Interface namespace OpenAuth.Repository.Interface
{ {
public interface IRepository<T> where T : class public interface IRepository<T> where T : class
{ {
T FindSingle(Expression<Func<T, bool>> exp = null); /// <summary>
bool IsExist(Expression<Func<T, bool>> exp); /// 返回一个单独的实体如果记录多于1个则取第一个
/// </summary>
T FirstOrDefault(Expression<Func<T, bool>> exp = null);
/// <summary>
/// 判断指定条件的记录是否存在
/// </summary>
bool Any(Expression<Func<T, bool>> exp);
IQueryable<T> Find(Expression<Func<T, bool>> exp = null); IQueryable<T> Find(Expression<Func<T, bool>> exp = null);
IQueryable<T> Find(int pageindex = 1, int pagesize = 10, string orderby = "", IQueryable<T> Find(int pageindex = 1, int pagesize = 10, string orderby = "",
Expression<Func<T, bool>> exp = null); Expression<Func<T, bool>> exp = null);
int Count(Expression<Func<T, bool>> exp = null);
int GetCount(Expression<Func<T, bool>> exp = null);
void Add(T entity); void Add(T entity);
void BatchAdd(T[] entities); void BatchAdd(T[] entities);
/// <summary> /// <summary>
/// 更新一个实体的所有属性 /// 更新一个实体的所有属性
/// </summary> /// </summary>
void Update(T entity); void Update(T entity);
void Delete(T entity); void Delete(T entity);
@@ -48,6 +49,7 @@ namespace OpenAuth.Repository.Interface
/// <param name="where">更新条件</param> /// <param name="where">更新条件</param>
/// <param name="entity">更新后的实体</param> /// <param name="entity">更新后的实体</param>
void Update(Expression<Func<T, bool>> where, Expression<Func<T, T>> entity); void Update(Expression<Func<T, bool>> where, Expression<Func<T, T>> entity);
/// <summary> /// <summary>
/// 批量删除 /// 批量删除
/// </summary> /// </summary>
@@ -55,19 +57,35 @@ namespace OpenAuth.Repository.Interface
void Save(); void Save();
int ExecuteSql(string sql); int ExecuteSqlRaw(string sql);
/// <summary> /// <summary>
/// 使用SQL脚本查询 /// 使用SQL脚本查询
/// </summary> /// </summary>
/// <typeparam name="T"> T为数据库实体</typeparam> /// <typeparam name="T"> T为数据库实体</typeparam>
/// <returns></returns> /// <returns></returns>
IQueryable<T> FromSql(string sql, params object[] parameters); IQueryable<T> FromSql(string sql, params object[] parameters);
/// <summary>
/// 使用SQL脚本查询 /// <summary>
/// </summary> /// 使用SQL脚本查询
/// <typeparam name="T"> T为非数据库实体需要在DbContext中增加对应的DbQuery</typeparam> /// </summary>
/// <returns></returns> /// <typeparam name="T"> T为非数据库实体需要在DbContext中增加对应的DbQuery</typeparam>
/// <returns></returns>
IQueryable<T> Query(string sql, params object[] parameters); IQueryable<T> Query(string sql, params object[] parameters);
#region
Task<int> ExecuteSqlRawAsync(string sql);
Task<int> AddAsync(T entity);
Task<int> BatchAddAsync(T[] entities);
Task<int> UpdateAsync(T entity);
Task<int> DeleteAsync(T entity);
Task<int> SaveAsync();
Task<int> CountAsync(Expression<Func<T, bool>> exp = null);
Task<bool> AnyAsync(Expression<Func<T, bool>> exp);
Task<T> FirstOrDefaultAsync(Expression<Func<T, bool>> exp);
#endregion
} }
} }

View File

@@ -4,7 +4,7 @@
// Created : 04-29-2016 // Created : 04-29-2016
// //
// Last Modified By : yubaolee // Last Modified By : yubaolee
// Last Modified On : 04-29-2016 // Last Modified On : 12-15-2020
// Contact : Microsoft // Contact : Microsoft
// File: IUnitWork.cs // File: IUnitWork.cs
// *********************************************************************** // ***********************************************************************
@@ -12,12 +12,14 @@
using System; using System;
using System.Linq; using System.Linq;
using System.Linq.Expressions; using System.Linq.Expressions;
using System.Threading.Tasks;
using OpenAuth.Repository.Core; using OpenAuth.Repository.Core;
namespace OpenAuth.Repository.Interface namespace OpenAuth.Repository.Interface
{ {
/// <summary> /// <summary>
/// 工作单元接口 /// 工作单元接口
/// 使用详见http://doc.openauth.me/core/unitwork.html
/// <para> 适合在一下情况使用:</para> /// <para> 适合在一下情况使用:</para>
/// <para>1 在同一事务中进行多表操作</para> /// <para>1 在同一事务中进行多表操作</para>
/// <para>2 需要多表联合查询</para> /// <para>2 需要多表联合查询</para>
@@ -25,18 +27,39 @@ namespace OpenAuth.Repository.Interface
/// </summary> /// </summary>
public interface IUnitWork public interface IUnitWork
{ {
/// <summary>
/// EF默认情况下每调用一次SaveChanges()都会执行一个单独的事务
/// 本接口实现在一个事务中可以多次执行SaveChanges()方法
/// </summary>
void ExecuteWithTransaction(Action action);
/// <summary>
/// 返回DbContext,用于多线程等极端情况
/// </summary>
/// <returns></returns>
OpenAuthDBContext GetDbContext(); OpenAuthDBContext GetDbContext();
T FindSingle<T>(Expression<Func<T, bool>> exp = null) where T:class; /// <summary>
bool IsExist<T>(Expression<Func<T, bool>> exp) where T:class; /// 返回一个单独的实体如果记录多于1个则取第一个
/// </summary>
T FirstOrDefault<T>(Expression<Func<T, bool>> exp = null) where T:class;
/// <summary>
/// 判断指定条件的记录是否存在
/// </summary>
bool Any<T>(Expression<Func<T, bool>> exp) where T:class;
IQueryable<T> Find<T>(Expression<Func<T, bool>> exp = null) where T:class; IQueryable<T> Find<T>(Expression<Func<T, bool>> exp = null) where T:class;
IQueryable<T> Find<T>(int pageindex = 1, int pagesize = 10, string orderby = "", IQueryable<T> Find<T>(int pageindex = 1, int pagesize = 10, string orderby = "",
Expression<Func<T, bool>> exp = null) where T:class; Expression<Func<T, bool>> exp = null) where T:class;
int GetCount<T>(Expression<Func<T, bool>> exp = null) where T:class; int Count<T>(Expression<Func<T, bool>> exp = null) where T:class;
/// <summary>
/// 新增对象如果Id为空则会自动创建默认Id
/// </summary>
void Add<T>(T entity) where T:BaseEntity; void Add<T>(T entity) where T:BaseEntity;
/// <summary>
/// 批量新增对象如果对象Id为空则会自动创建默认Id
/// </summary>
void BatchAdd<T>(T[] entities) where T:BaseEntity; void BatchAdd<T>(T[] entities) where T:BaseEntity;
/// <summary> /// <summary>
@@ -49,18 +72,25 @@ namespace OpenAuth.Repository.Interface
/// <summary> /// <summary>
/// 实现按需要只更新部分更新 /// 实现按需要只更新部分更新
/// <para>如Update<T>(u =>u.Id==1,u =>new User{Name="ok"}) where T:class;</para> /// <para>如Update&lt;User&gt;(u =>u.Id==1,u =>new User{Name="ok"})</para>
/// <para>该方法内部自动调用了SaveChanges()需要ExecuteWithTransaction配合才能实现事务控制</para>
/// </summary> /// </summary>
/// <param name="where">更新条件</param> /// <param name="where">更新条件</param>
/// <param name="entity">更新后的实体</param> /// <param name="entity">更新后的实体</param>
void Update<T>(Expression<Func<T, bool>> where, Expression<Func<T, T>> entity) where T:class; void Update<T>(Expression<Func<T, bool>> where, Expression<Func<T, T>> entity) where T:class;
/// <summary> /// <summary>
/// 批量删除 /// 批量删除
/// <para>该方法内部自动调用了SaveChanges()需要ExecuteWithTransaction配合才能实现事务控制</para>
/// </summary> /// </summary>
void Delete<T>(Expression<Func<T, bool>> exp) where T:class; void Delete<T>(Expression<Func<T, bool>> exp) where T:class;
void Save(); void Save();
/// <summary>
/// 该方法不支持EF自带的事务,需要ExecuteWithTransaction配合才能实现事务控制,详见http://doc.openauth.me/core/unitwork.html
/// </summary>
/// <param name="sql"></param>
/// <returns></returns>
int ExecuteSql(string sql); int ExecuteSql(string sql);
/// <summary> /// <summary>
@@ -75,5 +105,15 @@ namespace OpenAuth.Repository.Interface
/// <typeparam name="T"> T为非数据库实体需要在DbContext中增加对应的DbQuery</typeparam> /// <typeparam name="T"> T为非数据库实体需要在DbContext中增加对应的DbQuery</typeparam>
/// <returns></returns> /// <returns></returns>
IQueryable<T> Query<T>(string sql, params object[] parameters) where T : class; IQueryable<T> Query<T>(string sql, params object[] parameters) where T : class;
#region
Task<int> ExecuteSqlRawAsync(string sql);
Task<int> SaveAsync();
Task<int> CountAsync<T>(Expression<Func<T, bool>> exp = null) where T : class;
Task<bool> AnyAsync<T>(Expression<Func<T, bool>> exp) where T : class;
Task<T> FirstOrDefaultAsync<T>(Expression<Func<T, bool>> exp) where T : class;
#endregion
} }
} }

View File

@@ -8,6 +8,10 @@ using OpenAuth.Repository.Interface;
namespace OpenAuth.Repository.Test namespace OpenAuth.Repository.Test
{ {
/// <summary>
/// Repository测试基类
/// 测试用于测试DbContext、UnitWork、Repository如果需要测试业务逻辑请使用OpenAuth.App里面的单元测试
/// </summary>
public class TestBase public class TestBase
{ {
protected AutofacServiceProvider _autofacServiceProvider; protected AutofacServiceProvider _autofacServiceProvider;
@@ -19,6 +23,7 @@ namespace OpenAuth.Repository.Test
serviceCollection.AddMemoryCache(); serviceCollection.AddMemoryCache();
serviceCollection.AddOptions(); serviceCollection.AddOptions();
serviceCollection.AddScoped(typeof(IRepository<>), typeof(BaseRepository<>)); serviceCollection.AddScoped(typeof(IRepository<>), typeof(BaseRepository<>));
serviceCollection.AddScoped(typeof(IUnitWork), typeof(UnitWork));
serviceCollection.AddDbContext<OpenAuthDBContext>(options => serviceCollection.AddDbContext<OpenAuthDBContext>(options =>
options.UseSqlServer("Data Source=.;Initial Catalog=OpenAuthDB;User=sa;Password=000000;Integrated Security=True")); options.UseSqlServer("Data Source=.;Initial Catalog=OpenAuthDB;User=sa;Password=000000;Integrated Security=True"));
@@ -28,7 +33,6 @@ namespace OpenAuth.Repository.Test
//注册repository层 //注册repository层
builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()); builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly());
// builder.RegisterGeneric(typeof(BaseRepository<>)).As(typeof(IRepository<>)).PropertiesAutowired();
builder.Populate(serviceCollection); builder.Populate(serviceCollection);
var _container = builder.Build(); var _container = builder.Build();

View File

@@ -94,24 +94,24 @@ namespace OpenAuth.Repository.Test
Id = id Id = id
}); });
var user = repository.FindSingle(u => u.Id == id); var user = repository.FirstOrDefault(u => u.Id == id);
Assert.NotNull(user); Assert.NotNull(user);
//修改一个实体 //修改一个实体
account = "newuser_" + DateTime.Now.ToString("yyyy_MM_dd HH:mm:ss"); account = "newuser_" + DateTime.Now.ToString("yyyy_MM_dd HH:mm:ss");
user.Account = account; user.Account = account;
repository.Update(user); repository.Update(user);
var newuser = repository.FindSingle(u => u.Account == account); var newuser = repository.FirstOrDefault(u => u.Account == account);
Assert.NotNull(newuser); Assert.NotNull(newuser);
//批量修改 //批量修改
repository.Update(u => u.Id == id, u =>new User{ Name = account}); 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); Assert.NotNull(newuser);
//删除 //删除
repository.Delete(u =>u.Id == id); repository.Delete(u =>u.Id == id);
newuser = repository.FindSingle(u => u.Id == id); newuser = repository.FirstOrDefault(u => u.Id == id);
Assert.IsNull(newuser); Assert.IsNull(newuser);
} }
} }

View File

@@ -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
{
/// <summary>
/// 测试事务
/// </summary>
class TestTransaction : TestBase
{
/// <summary>
/// 测试事务正常提交
/// </summary>
[Test]
public void NormalSubmit()
{
var unitWork = _autofacServiceProvider.GetService<IUnitWork>();
unitWork.ExecuteWithTransaction(() =>
{
var account = "user_" + DateTime.Now.ToString("yyyy_MM_dd HH:mm:ss");
AddAndUpdate(account, unitWork);
});
}
/// <summary>
/// 测试事务回滚
/// </summary>
[Test]
public void SubmitWithRollback()
{
var unitWork = _autofacServiceProvider.GetService<IUnitWork>();
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<User>( u=>u.Id == account));
}
/// <summary>
/// 测试添加单个修改Z.EntityFramework.Plus条件修改
/// </summary>
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<User>(u => u.Id == account, u => new User
{
Account = "Trans2_" + user.Account
});
}
}
}

View File

@@ -2,8 +2,10 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.Linq; using System.Linq;
using System.Linq.Expressions; using System.Linq.Expressions;
using System.Threading.Tasks;
using Infrastructure; using Infrastructure;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Storage;
using OpenAuth.Repository.Core; using OpenAuth.Repository.Core;
using OpenAuth.Repository.Interface; using OpenAuth.Repository.Interface;
using Z.EntityFramework.Plus; using Z.EntityFramework.Plus;
@@ -18,6 +20,31 @@ namespace OpenAuth.Repository
{ {
_context = context; _context = context;
} }
/// <summary>
/// EF默认情况下每调用一次SaveChanges()都会执行一个单独的事务
/// 本接口实现在一个事务中可以多次执行SaveChanges()方法
/// </summary>
public void ExecuteWithTransaction(Action action)
{
using (IDbContextTransaction transaction = _context.Database.BeginTransaction())
{
try
{
action();
transaction.Commit();
}
catch (Exception ex)
{
transaction.Rollback();
throw ex;
}
}
}
/// <summary>
/// 返回DbContext,用于多线程等极端情况
/// </summary>
public OpenAuthDBContext GetDbContext() public OpenAuthDBContext GetDbContext()
{ {
return _context; return _context;
@@ -32,7 +59,7 @@ namespace OpenAuth.Repository
return Filter(exp); return Filter(exp);
} }
public bool IsExist<T>(Expression<Func<T, bool>> exp) where T : class public bool Any<T>(Expression<Func<T, bool>> exp) where T : class
{ {
return _context.Set<T>().Any(exp); return _context.Set<T>().Any(exp);
} }
@@ -40,7 +67,7 @@ namespace OpenAuth.Repository
/// <summary> /// <summary>
/// 查找单个 /// 查找单个
/// </summary> /// </summary>
public T FindSingle<T>(Expression<Func<T, bool>> exp) where T:class public T FirstOrDefault<T>(Expression<Func<T, bool>> exp) where T:class
{ {
return _context.Set<T>().AsNoTracking().FirstOrDefault(exp); return _context.Set<T>().AsNoTracking().FirstOrDefault(exp);
} }
@@ -63,11 +90,14 @@ namespace OpenAuth.Repository
/// <summary> /// <summary>
/// 根据过滤条件获取记录数 /// 根据过滤条件获取记录数
/// </summary> /// </summary>
public int GetCount<T>(Expression<Func<T, bool>> exp = null) where T : class public int Count<T>(Expression<Func<T, bool>> exp = null) where T : class
{ {
return Filter(exp).Count(); return Filter(exp).Count();
} }
/// <summary>
/// 新增对象如果Id为空则会自动创建默认Id
/// </summary>
public void Add<T>(T entity) where T : BaseEntity public void Add<T>(T entity) where T : BaseEntity
{ {
if (entity.KeyIsNull()) if (entity.KeyIsNull())
@@ -78,9 +108,8 @@ namespace OpenAuth.Repository
} }
/// <summary> /// <summary>
/// 批量添加 /// 批量新增对象如果对象Id为空则会自动创建默认Id
/// </summary> /// </summary>
/// <param name="entities">The entities.</param>
public void BatchAdd<T>(T[] entities) where T : BaseEntity public void BatchAdd<T>(T[] entities) where T : BaseEntity
{ {
foreach (var entity in entities) foreach (var entity in entities)
@@ -113,18 +142,23 @@ namespace OpenAuth.Repository
/// <summary> /// <summary>
/// 实现按需要只更新部分更新 /// 实现按需要只更新部分更新
/// <para>如Update(u =>u.Id==1,u =>new User{Name="ok"});</para> /// <para>如Update&lt;User&gt;(u =>u.Id==1,u =>new User{Name="ok"})</para>
/// <para>该方法内部自动调用了SaveChanges()需要ExecuteWithTransaction配合才能实现事务控制</para>
/// </summary> /// </summary>
/// <param name="where">The where.</param> /// <param name="where">更新条件</param>
/// <param name="entity">The entity.</param> /// <param name="entity">更新后的实体</param>
public void Update<T>(Expression<Func<T, bool>> where, Expression<Func<T, T>> entity) where T:class public void Update<T>(Expression<Func<T, bool>> where, Expression<Func<T, T>> entity) where T:class
{ {
_context.Set<T>().Where(where).Update(entity); _context.Set<T>().Where(where).Update(entity);
} }
/// <summary>
/// 批量删除
/// <para>该方法内部自动调用了SaveChanges()需要ExecuteWithTransaction配合才能实现事务控制</para>
/// </summary>
public virtual void Delete<T>(Expression<Func<T, bool>> exp) where T : class public virtual void Delete<T>(Expression<Func<T, bool>> exp) where T : class
{ {
_context.Set<T>().RemoveRange(Filter(exp)); _context.Set<T>().Where(exp).Delete();
} }
public void Save() public void Save()
@@ -178,5 +212,74 @@ namespace OpenAuth.Repository
{ {
return _context.Query<T>().FromSqlRaw(sql, parameters); return _context.Query<T>().FromSqlRaw(sql, parameters);
} }
#region
/// <summary>
/// 异步执行sql
/// </summary>
/// <param name="sql"></param>
/// <returns></returns>
public async Task<int> ExecuteSqlRawAsync(string sql)
{
return await _context.Database.ExecuteSqlRawAsync(sql);
}
/// <summary>
/// 异步保存
/// </summary>
/// <returns></returns>
/// <exception cref="Exception"></exception>
public async Task<int> 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);
}
}
/// <summary>
/// 根据过滤条件获取记录数
/// </summary>
public async Task<int> CountAsync<T>(Expression<Func<T, bool>> exp = null) where T : class
{
return await Filter(exp).CountAsync();
}
public async Task<bool> AnyAsync<T>(Expression<Func<T, bool>> exp) where T : class
{
return await _context.Set<T>().AnyAsync(exp);
}
/// <summary>
/// 查找单个,且不被上下文所跟踪
/// </summary>
public async Task<T> FirstOrDefaultAsync<T>(Expression<Func<T, bool>> exp) where T : class
{
return await _context.Set<T>().AsNoTracking().FirstOrDefaultAsync(exp);
}
#endregion
} }
} }

View File

@@ -1,4 +1,5 @@
using Microsoft.AspNetCore.Mvc; using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using OpenAuth.App; using OpenAuth.App;
using OpenAuth.App.Request; using OpenAuth.App.Request;
using OpenAuth.App.Response; using OpenAuth.App.Response;
@@ -23,9 +24,9 @@ namespace OpenAuth.WebApi.Controllers
/// </summary> /// </summary>
/// <returns></returns> /// <returns></returns>
[HttpGet] [HttpGet]
public TableData Load([FromQuery]QueryAppListReq request) public async Task<TableData> Load([FromQuery]QueryAppListReq request)
{ {
var applications = _app.GetList(request); var applications =await _app.GetList(request);
return new TableData return new TableData
{ {
data = applications, data = applications,

View File

@@ -1,4 +1,5 @@
using System; using System;
using System.Threading.Tasks;
using Infrastructure; using Infrastructure;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using OpenAuth.App; using OpenAuth.App;
@@ -59,9 +60,10 @@ namespace OpenAuth.WebApi.Controllers
/// 加载列表 /// 加载列表
/// </summary> /// </summary>
[HttpGet] [HttpGet]
public TableResp<BuilderTableColumn> Load([FromQuery]QueryBuilderTableColumnListReq request) public async Task<TableResp<BuilderTableColumn>> Load([FromQuery]QueryBuilderTableColumnListReq request)
{ {
return _app.Load(request); var tableResp = await _app.Load(request);
return tableResp;
} }
/// <summary> /// <summary>

View File

@@ -1,4 +1,5 @@
using System; using System;
using System.Threading.Tasks;
using Infrastructure; using Infrastructure;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using OpenAuth.App; using OpenAuth.App;
@@ -67,9 +68,9 @@ namespace OpenAuth.WebApi.Controllers
/// 加载列表 /// 加载列表
/// </summary> /// </summary>
[HttpGet] [HttpGet]
public TableResp<BuilderTable> Load([FromQuery]QueryBuilderTableListReq request) public async Task<TableResp<BuilderTable>> Load([FromQuery]QueryBuilderTableListReq request)
{ {
return _app.Load(request); return await _app.Load(request);
} }
/// <summary> /// <summary>

View File

@@ -1,5 +1,6 @@
using System; using System;
using Infrastructure; using System.Threading.Tasks;
using Infrastructure;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using OpenAuth.App; using OpenAuth.App;
using OpenAuth.App.Request; using OpenAuth.App.Request;
@@ -58,9 +59,9 @@ using OpenAuth.App.Response;
/// 加载列表 /// 加载列表
/// </summary> /// </summary>
[HttpGet] [HttpGet]
public TableData Load([FromQuery]QueryCategoryTypeListReq request) public async Task<TableData> Load([FromQuery]QueryCategoryTypeListReq request)
{ {
return _app.Load(request); return await _app.Load(request);
} }
/// <summary> /// <summary>

View File

@@ -1,4 +1,5 @@
using System; using System;
using System.Threading.Tasks;
using Infrastructure; using Infrastructure;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using OpenAuth.App; using OpenAuth.App;
@@ -87,9 +88,9 @@ namespace OpenAuth.WebApi.Controllers
/// 加载列表 /// 加载列表
/// </summary> /// </summary>
[HttpGet] [HttpGet]
public TableData Load([FromQuery]QueryCategoryListReq request) public async Task<TableData> Load([FromQuery]QueryCategoryListReq request)
{ {
return _app.Load(request); return await _app.Load(request);
} }
/// <summary> /// <summary>

View File

@@ -1,4 +1,5 @@
using System; using System;
using System.Threading.Tasks;
using Infrastructure; using Infrastructure;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using OpenAuth.App; using OpenAuth.App;
@@ -86,9 +87,9 @@ namespace OpenAuth.WebApi.Controllers
/// 加载列表 /// 加载列表
/// </summary> /// </summary>
[HttpGet] [HttpGet]
public TableData Load([FromQuery]QueryDataPrivilegeRuleListReq request) public async Task<TableData> Load([FromQuery]QueryDataPrivilegeRuleListReq request)
{ {
return _app.Load(request); return await _app.Load(request);
} }
/// <summary> /// <summary>

View File

@@ -7,6 +7,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Threading.Tasks;
using Infrastructure; using Infrastructure;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using OpenAuth.App; using OpenAuth.App;
@@ -128,9 +129,9 @@ namespace OpenAuth.WebApi.Controllers
/// 加载列表 /// 加载列表
/// </summary> /// </summary>
[HttpGet] [HttpGet]
public TableData Load([FromQuery]QueryFlowInstanceListReq request) public async Task<TableData> Load([FromQuery]QueryFlowInstanceListReq request)
{ {
return _app.Load(request); return await _app.Load(request);
} }
[HttpPost] [HttpPost]

View File

@@ -1,4 +1,5 @@
using System; using System;
using System.Threading.Tasks;
using Infrastructure; using Infrastructure;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using OpenAuth.App; using OpenAuth.App;
@@ -76,9 +77,9 @@ namespace OpenAuth.WebApi.Controllers
/// 加载列表 /// 加载列表
/// </summary> /// </summary>
[HttpGet] [HttpGet]
public TableData Load([FromQuery]QueryFlowSchemeListReq request) public async Task<TableData> Load([FromQuery]QueryFlowSchemeListReq request)
{ {
return _app.Load(request); return await _app.Load(request);
} }
[HttpPost] [HttpPost]

View File

@@ -1,4 +1,5 @@
using System; using System;
using System.Threading.Tasks;
using Infrastructure; using Infrastructure;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using OpenAuth.App; using OpenAuth.App;
@@ -76,9 +77,9 @@ namespace OpenAuth.WebApi.Controllers
/// 加载列表 /// 加载列表
/// </summary> /// </summary>
[HttpGet] [HttpGet]
public TableData Load([FromQuery]QueryFormListReq request) public async Task<TableData> Load([FromQuery]QueryFormListReq request)
{ {
return _app.Load(request); return await _app.Load(request);
} }
[HttpPost] [HttpPost]

View File

@@ -1,5 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Threading.Tasks;
using Infrastructure; using Infrastructure;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using OpenAuth.App; using OpenAuth.App;
@@ -87,9 +88,9 @@ namespace OpenAuth.WebApi.Controllers
/// 加载列表 /// 加载列表
/// </summary> /// </summary>
[HttpGet] [HttpGet]
public TableData Load([FromQuery]QueryOpenJobListReq request) public async Task<TableData> Load([FromQuery]QueryOpenJobListReq request)
{ {
return _app.Load(request); return await _app.Load(request);
} }
/// <summary> /// <summary>

View File

@@ -1,6 +1,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading.Tasks;
using Infrastructure; using Infrastructure;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using OpenAuth.App; using OpenAuth.App;
@@ -25,9 +26,9 @@ namespace OpenAuth.WebApi.Controllers
_app = app; _app = app;
} }
[HttpGet] [HttpGet]
public TableData Load([FromQuery]QueryResourcesReq request) public async Task<TableData> Load([FromQuery]QueryResourcesReq request)
{ {
return _app.Load(request); return await _app.Load(request);
} }
[HttpPost] [HttpPost]

View File

@@ -1,4 +1,5 @@
using System; using System;
using System.Threading.Tasks;
using Infrastructure; using Infrastructure;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using OpenAuth.App; using OpenAuth.App;
@@ -81,9 +82,9 @@ namespace OpenAuth.WebApi.Controllers
/// 加载列表 /// 加载列表
/// </summary> /// </summary>
[HttpGet] [HttpGet]
public TableData Load([FromQuery]QuerySysLogListReq request) public async Task<TableData> Load([FromQuery]QuerySysLogListReq request)
{ {
return _app.Load(request); return await _app.Load(request);
} }
/// <summary> /// <summary>

View File

@@ -1,4 +1,5 @@
using System; using System;
using System.Threading.Tasks;
using Infrastructure; using Infrastructure;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using OpenAuth.App; using OpenAuth.App;
@@ -77,9 +78,9 @@ namespace OpenAuth.WebApi.Controllers
/// 加载列表 /// 加载列表
/// </summary> /// </summary>
[HttpGet] [HttpGet]
public TableData Load([FromQuery]QuerySysMessageListReq request) public async Task<TableData> Load([FromQuery]QuerySysMessageListReq request)
{ {
return _app.Load(request); return await _app.Load(request);
} }
/// <summary> /// <summary>

View File

@@ -1,4 +1,5 @@
using System; using System;
using System.Threading.Tasks;
using Infrastructure; using Infrastructure;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using OpenAuth.App; using OpenAuth.App;
@@ -104,9 +105,9 @@ namespace OpenAuth.WebApi.Controllers
/// 获取当前登录用户可访问的一个部门及子部门全部用户 /// 获取当前登录用户可访问的一个部门及子部门全部用户
/// </summary> /// </summary>
[HttpGet] [HttpGet]
public TableData Load([FromQuery]QueryUserListReq request) public async Task<TableData> Load([FromQuery]QueryUserListReq request)
{ {
return _app.Load(request); return await _app.Load(request);
} }
[HttpPost] [HttpPost]
@@ -131,9 +132,9 @@ namespace OpenAuth.WebApi.Controllers
/// 加载指定角色的用户 /// 加载指定角色的用户
/// </summary> /// </summary>
[HttpGet] [HttpGet]
public TableData LoadByRole([FromQuery]QueryUserListByRoleReq request) public async Task<TableData> LoadByRole([FromQuery]QueryUserListByRoleReq request)
{ {
return _app.LoadByRole(request); return await _app.LoadByRole(request);
} }
/// <summary> /// <summary>
@@ -141,9 +142,9 @@ namespace OpenAuth.WebApi.Controllers
/// 不包含下级部门的用户 /// 不包含下级部门的用户
/// </summary> /// </summary>
[HttpGet] [HttpGet]
public TableData LoadByOrg([FromQuery]QueryUserListByOrgReq request) public async Task<TableData> LoadByOrg([FromQuery]QueryUserListByOrgReq request)
{ {
return _app.LoadByOrg(request); return await _app.LoadByOrg(request);
} }
public UsersController(UserManagerApp app) public UsersController(UserManagerApp app)

View File

@@ -1,4 +1,5 @@
using System; using System;
using System.Threading.Tasks;
using Infrastructure; using Infrastructure;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
@@ -83,9 +84,9 @@ namespace OpenAuth.WebApi.Controllers
/// </summary> /// </summary>
[HttpGet] [HttpGet]
[AllowAnonymous] [AllowAnonymous]
public TableData Load([FromQuery]QueryWmsInboundOrderDtblListReq request) public async Task<TableData> Load([FromQuery]QueryWmsInboundOrderDtblListReq request)
{ {
return _app.Load(request); return await _app.Load(request);
} }
/// <summary> /// <summary>

View File

@@ -1,4 +1,5 @@
using System; using System;
using System.Threading.Tasks;
using Infrastructure; using Infrastructure;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using OpenAuth.App; using OpenAuth.App;
@@ -88,9 +89,9 @@ namespace OpenAuth.WebApi.Controllers
/// 加载列表 /// 加载列表
/// </summary> /// </summary>
[HttpGet] [HttpGet]
public TableData Load([FromQuery]QueryWmsInboundOrderTblListReq request) public async Task<TableData> Load([FromQuery]QueryWmsInboundOrderTblListReq request)
{ {
return _app.Load(request); return await _app.Load(request);
} }
/// <summary> /// <summary>

View File

@@ -16,7 +16,7 @@ namespace OpenAuth.App
/// <summary> /// <summary>
/// 加载列表 /// 加载列表
/// </summary> /// </summary>
public TableData Load(Query{ClassName}ListReq request) public async Task<TableData> Load(Query{ClassName}ListReq request)
{ {
var loginContext = _auth.GetCurrentUser(); var loginContext = _auth.GetCurrentUser();
if (loginContext == null) if (loginContext == null)
@@ -35,7 +35,7 @@ namespace OpenAuth.App
var objs = GetDataPrivilege("u"); var objs = GetDataPrivilege("u");
if (!string.IsNullOrEmpty(request.key)) 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)); var propertyStr = string.Join(',', properties.Select(u => u.Key));

View File

@@ -77,9 +77,9 @@ namespace OpenAuth.WebApi.Controllers
/// 加载列表 /// 加载列表
/// </summary> /// </summary>
[HttpGet] [HttpGet]
public TableData Load([FromQuery]Query{ClassName}ListReq request) public async Task<TableData> Load([FromQuery]Query{ClassName}ListReq request)
{ {
return _app.Load(request); return await _app.Load(request);
} }
/// <summary> /// <summary>

View File

@@ -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分支 需要.Net 4.0/4.5开发环境的同学请查看本项目4.0分支

View File

@@ -1,5 +1,5 @@
{ {
"sdk": { "sdk": {
"version": "5.0.100-rc.2.20479.15" "version": "5.0.100"
} }
} }