37 Commits
5.2 ... 5.4

Author SHA1 Message Date
yubaolee
a3a8bd509e 增加vue3单表/多表代码生成器 2022-10-05 17:29:59 +08:00
yubaolee
9412ee4a89 pre fix issue #I4Z9CQ 不能恢复第二节点为运行时选择执行角色/账号的流程 2022-04-01 22:21:07 +08:00
yubaolee
c19802eb55 增加支持Autofac的http单元测试
fix issue #I50DRR
2022-03-31 23:50:04 +08:00
yubaolee
21c1f67d63 fix issue #I4WZE4 工作流审批驳回操作,不应提示选择下一步执行人或角色 2022-03-14 16:17:48 +08:00
yubaolee
502ab43f26 * fix #I4Q1IR 修复自定义表单流程审批时,不能修改数据库记录 2022-03-08 16:23:39 +08:00
yubaolee
f4a8e93de9 fix issue Sequence contains more than one element 2022-03-03 23:17:21 +08:00
yubaolee
44fd165dec 调整获取项目根目录方式 2022-03-03 23:13:33 +08:00
yubaolee
ac0dfef321 fix webapi 未设置代码生成 Load加载数据报错,MVC页面没有代码生成界面 https://gitee.com/yubaolee/OpenAuth.Core/issues/I4RLEP 2022-02-21 00:39:55 +08:00
yubaolee
3f077f5d80 调整组织类[Org]为[SysOrg]防止命名空间冲突 2022-01-21 17:31:34 +08:00
yubaolee
73b2e2aa08 修复表单添加时关联数据库异常 2022-01-19 17:02:35 +08:00
yubaolee
99daa8752f 增加对sql只返回string的支持;
修复添加表单时,如果关联的数据库已存在的bug
2022-01-19 15:49:29 +08:00
yubaolee
636624a872 修复非动态头部生成vue界面时异常 2021-12-10 23:43:07 +08:00
yubaolee
d0253a7fc0 fix issue #I4GZ61 2021-12-09 00:42:10 +08:00
yubaolee
69d0587c83 主从表以ParentId为准,而不是DetailTable 2021-12-08 01:20:47 +08:00
yubaolee
41c1596679 Merge branch 'main' of https://gitee.com/dotnetchina/OpenAuth.Net into main 2021-12-07 01:07:05 +08:00
yubaolee
c8caf9dee3 代码生成器增加同步数据结构;
修复sql server 生成float类型;
修复非system用户【代码生成器中找不到xxx的定义】;
修复用户已处理流程列表中看不到【不同意】的流程;
2021-12-07 01:06:53 +08:00
yubaolee
5c060f8ed9 紧急修复CodeSmith模版 2021-11-04 16:31:38 +08:00
yubaolee
1c699eda26 修复生成业务代码异常
优化代码,删除columnHeaders
2021-10-27 22:47:42 +08:00
yubaolee
9fd0405721 同步openauth.Core:
采用代码生成器的表结构控制前端显示,删除以前按照dbset获取数据库结构
优化注释
升级EF及所有三方的版本
2021-10-18 00:42:29 +08:00
yubaolee
3a70bf8e43 修复模版 2021-09-15 07:48:58 +08:00
yubaolee
8fb9297145 fix {ForeignKeyTemplate}存在无法生成的问题 2021-09-14 23:57:24 +08:00
yubaolee
4f37560dc8 调整为v-model 2021-09-11 12:44:34 +08:00
yubaolee
3c20deb3df 实现主从表结构生成;
提取企业版共用组件AuthForm、AuthTable、AuthSelect;
修复大量已知Bug
2021-09-05 21:37:12 +08:00
yubaolee
4d7af5bedf fix issue #I42IFB 获取Oracle结构异常
fix issue #I462OD JSON解析异常
增加主表ParentId,可以同时添加主、从表结构
可以动态控制复杂界面显示编辑权限,采用代码生成的表定义来控制
2021-08-25 01:42:37 +08:00
yubaolee
8397786566 fix bug 2021-07-22 20:16:20 +08:00
yubaolee
c7acca904a 更新域名
fix issue #I3ZCIX 可以控制流程审批过程中表单项是否可写
2021-07-22 19:33:55 +08:00
yubaolee
154583889a Merge branch 'main' of https://gitee.com/dotnetchina/OpenAuth.Net 2021-07-14 00:55:07 +08:00
yubaolee
05f7833353 大半夜的知道了.me域名被封了,启用全新域名openauth.net.cn 😂 2021-07-14 00:54:08 +08:00
yubaolee
95fe5259c7 fix issue #I3ZCIX 审批过程中可以修改表单内容,并可以控制表单字段读写权限 2021-07-11 15:21:17 +08:00
yubaolee
10e255d0b3 Merge branch 'main' of https://gitee.com/dotnetchina/OpenAuth.Net into main 2021-07-05 21:44:40 +08:00
yubaolee
38a62595ba fix issue #I3YVBH 兼容oracle 11g
add load all users/roles for flowinstance
fix issue #I3W5YR
2021-07-05 21:44:35 +08:00
yubaolee
f9ea57a06c Merge branch 'main' of https://gitee.com/dotnetchina/OpenAuth.Net 2021-06-18 16:53:39 +08:00
yubaolee
7893fe3024 fix issue #I3W5YR 2021-06-18 16:53:28 +08:00
yubaolee
b94fba7c19 update doc 2021-06-11 23:52:56 +08:00
yubaolee
a84c8c57ad 进一步优化swagger分组 2021-06-11 23:40:55 +08:00
yubaolee
804ee3d9d8 update doc 2021-06-11 23:36:15 +08:00
yubaolee
8608ce78f5 流程处理增加消息通知
修复消息标记已读、删除
2021-05-26 17:02:05 +08:00
166 changed files with 6188 additions and 1971 deletions

View File

@@ -40,10 +40,11 @@ namespace OpenAuth.App
{
throw new CommonException("登录已过期", Define.INVALID_TOKEN);
}
var properties = loginContext.GetProperties("<%=Table.Name%>");
if (properties == null || properties.Count == 0)
//如果是WebAPI,请务必改为loginContext.GetTableColumns("<%=Table.Name%>");
var columnFields = loginContext.GetTableColumnsFromDb("<%=Table.Name%>");
if (columnFields == null || columnFields.Count == 0)
{
throw new Exception("当前登录用户没有访问该模块字段的权限,请联系管理员配置");
throw new Exception("请在代码生成界面配置Category表的字段属性");
}
var result = new TableData();
var objs = UnitWork.Find<<%=Table.Name%>>(null);
@@ -51,8 +52,8 @@ namespace OpenAuth.App
{
objs = objs.Where(u => u.Id.Contains(request.key));
}
var propertyStr = string.Join(',', properties.Select(u => u.Key));
result.columnHeaders = properties;
var propertyStr = string.Join(',', columnFields.Select(u =>u.ColumnName));
result.columnFields = columnFields;
result.data = objs.OrderBy(u => u.Id)
.Skip((request.page - 1) * request.limit)
.Take(request.limit).Select($"new ({propertyStr})");

View File

@@ -28,12 +28,12 @@ layui.config({
$.getJSON('/<%=ModuleName%>s/Load',
{ page: 1, limit: 1 },
function (data) {
var columns = data.columnHeaders.map(function (e) {
return {
field: e.Key,
title: e.Description
};
});
var columns = data.columnFields.filter(u => u.IsList ===true).map(function (e) {
return {
field: e.ColumnName,
title: e.Comment
};
});
columns.unshift({
type: 'checkbox',
fixed: 'left'

View File

@@ -27,6 +27,12 @@ namespace Infrastructure.Cache
_memcachedClient = client;
}
/// <summary>
///
/// </summary>
/// <param name="key"></param>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public override T Get<T>(string key)
{
return _memcachedClient.Get<T>(key);

View File

@@ -14,7 +14,6 @@ namespace Infrastructure.Cache
private ConnectionMultiplexer _conn { get; set; }
private IDatabase iDatabase { get; set; }
private AppSetting _appSettings;
public RedisCacheContext(IOptions<AppSetting> options)
{
_conn = ConnectionMultiplexer.Connect(options.Value.RedisConf);

View File

@@ -4,7 +4,7 @@ namespace Infrastructure.Extensions.AutofacManager
{
/// <summary>
/// 提供全局静态获取服务的能力。
/// <para>例AutofacContainerModule.GetService<IPathProvider>()</para>
/// <para>例AutofacContainerModule.GetService&lt;IPathProvider&gt;()</para>
/// </summary>
public class AutofacContainerModule
{

View File

@@ -91,7 +91,7 @@ namespace Infrastructure.Extensions
/// <summary>
/// list转换为json
/// </summary>
/// <typeparam name="T1"></typeparam>
/// <typeparam name="T"></typeparam>
/// <param name="list"></param>
/// <param name="p"></param>
/// <returns></returns>

View File

@@ -26,7 +26,7 @@ namespace Infrastructure.Extensions
/// 获取对象里指定成员名称
/// </summary>
/// <typeparam name="TEntity"></typeparam>
/// <param name="properties"> 格式 Expression<Func<entityt, object>> exp = x => new { x.字段1, x.字段2 };或x=>x.Name</param>
/// <param name="properties"> <![CDATA[格式 Expression<Func<entityt, object>> exp = x => new { x.字段1, x.字段2 };或x=>x.Name]]></param>
/// <returns></returns>
public static string[] GetExpressionProperty<TEntity>(this Expression<Func<TEntity, object>> properties)
{
@@ -132,7 +132,7 @@ namespace Infrastructure.Extensions
colType += "(" + (asType ? ((DisplayFormatAttribute) objAtrr).DataFormatString : "18,5") + ")";
}
///如果是string,根据 varchar或nvarchar判断最大长度
//如果是string,根据 varchar或nvarchar判断最大长度
if (property.PropertyType.ToString() == "System.String")
{
colType = colType.Split("(")[0];
@@ -198,7 +198,6 @@ namespace Infrastructure.Extensions
/// </summary>
/// <param name="array"></param>
/// <param name="fieldType">指定生成的数组值的类型</param>
/// <param name="sql"></param>
/// <returns></returns>
public static string GetArraySql(this object[] array, FieldType fieldType, string sql)
{
@@ -220,7 +219,6 @@ namespace Infrastructure.Extensions
/// <summary>
/// 根据实体获取key的类型用于update或del操作
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public static FieldType GetFieldType(this Type typeEntity)
{
@@ -607,13 +605,9 @@ namespace Infrastructure.Extensions
/// <summary>
/// 判断是否包含某个属性
/// 如 [Editable(true)]
// public string MO { get; set; }包含Editable
/// 判断是否包含某个属性
/// <para>public string MO {get; set; }包含Editable</para>
/// </summary>
/// <param name="propertyInfo"></param>
/// <param name="type"></param>
/// <returns></returns>
public static bool ContainsCustomAttributes(this PropertyInfo propertyInfo, Type type)
{
propertyInfo.GetTypeCustomAttributes(type, out bool contains);
@@ -795,7 +789,7 @@ namespace Infrastructure.Extensions
/// 如果是小数float或Decimal必须对propertyInfo字段加DisplayFormatAttribute属性
/// </param>
/// <param name="value"></param>
/// <returns>IEnumerable<(bool, string, object)> bool成否校验成功,string校验失败信息,object,当前校验的值</returns>
/// <returns>IEnumerable&lt;(bool, string, object)&gt; bool成否校验成功,string校验失败信息,object,当前校验的值</returns>
public static IEnumerable<(bool, string, object)> ValidationValueForDbType(this PropertyInfo propertyInfo,
params object[] values)
{
@@ -1036,7 +1030,7 @@ namespace Infrastructure.Extensions
/// </summary>
/// <param name="member">当前类</param>
/// <param name="type">指定的类</param>
/// <param name="expression">指定属性的值 格式 Expression<Func<entityt, object>> exp = x => new { x.字段1, x.字段2 };</param>
/// <param name="expression">指定属性的值 格式 Expression&lt;Func&lt;entityt, object&gt;&gt; exp = x =&gt; new { x.字段1, x.字段2 };</param>
/// <returns>返回的是字段+value</returns>
public static Dictionary<string, string> GetTypeCustomValues<TEntity>(this MemberInfo member,
Expression<Func<TEntity, object>> expression)
@@ -1066,7 +1060,7 @@ namespace Infrastructure.Extensions
/// </summary>
/// <param name="member">当前类</param>
/// <param name="type">指定的类</param>
/// <param name="expression">指定属性的值 格式 Expression<Func<entityt, object>> exp = x => new { x.字段1, x.字段2 };</param>
/// <param name="expression">指定属性的值 格式 Expression&lt;Func&lt;entityt, object&gt;&gt; exp = x =&gt; new { x.字段1, x.字段2 };</param>
/// <returns></returns>
public static string GetTypeCustomValue<TEntity>(this MemberInfo member,
Expression<Func<TEntity, object>> expression)
@@ -1259,7 +1253,7 @@ namespace Infrastructure.Extensions
}
/// <summary>
/// 将数据源映射到新的数据中,目前只支持List<TSource>映射到List<TResult>或TSource映射到TResult
/// 将数据源映射到新的数据中,目前只支持List&lt;TSource&gt;映射到List&lt;TResult&gt;或TSource映射到TResult
/// 目前只支持Dictionary或实体类型
/// </summary>
/// <typeparam name="TSource"></typeparam>

View File

@@ -1,5 +1,5 @@
// <copyright file="ImgHelper.cs" company="openauth.me">
// Copyright (c) 2019 openauth.me. All rights reserved.
// <copyright file="ImgHelper.cs" company="openauth.net.cn">
// Copyright (c) 2019 openauth.net.cn. All rights reserved.
// </copyright>
// <author>www.cnblogs.com/yubaolee</author>
// <summary>生成缩略图</summary>

View File

@@ -1,7 +1,5 @@
using System.Xml;
/// 这个是用VS2010写的如果用VS2005请去掉System.Linq和System.Xml.Linq的引用
/// 可以将此文件直接编译成dll今后程序只需要引用该dll后开头添加using XmlLibrary;即可。
namespace Infrastructure.Helpers
{
/// <summary>
@@ -371,7 +369,7 @@ namespace Infrastructure.Helpers
else
{
XmlNode xn = GetNode(xns, nodeName);
if (xn != null) return xn; /// V1.0.0.3添加节点判断
if (xn != null) return xn;
}
}
return null;

View File

@@ -6,15 +6,16 @@
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<DocumentationFile>bin\Debug\net5.0\Infrastructure.xml</DocumentationFile>
<NoWarn>1701;1702;1591;1573;1572;1570</NoWarn>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="AutoMapper" Version="9.0.0" />
<PackageReference Include="EnyimMemcachedCore" Version="2.1.5" />
<PackageReference Include="EnyimMemcachedCore" Version="2.5.3" />
<PackageReference Include="log4net" Version="2.0.12" />
<PackageReference Include="Microsoft.AspNetCore.Http" Version="2.2.2" />
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="3.1.2" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="3.1.0" />
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="5.0.0" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="5.0.0" />
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
<PackageReference Include="NUnit" Version="3.13.1" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.5.0" />

View File

@@ -126,18 +126,18 @@ namespace Yitter.IdGenerator
{
return;
if (GenAction == null)
{
return;
}
DoGenIdAction(new OverCostActionArg(
WorkerId,
useTimeTick,
1,
_OverCostCountInOneTerm,
_GenCountInOneTerm,
_TermIndex));
// if (GenAction == null)
// {
// return;
// }
//
// DoGenIdAction(new OverCostActionArg(
// WorkerId,
// useTimeTick,
// 1,
// _OverCostCountInOneTerm,
// _GenCountInOneTerm,
// _TermIndex));
}
private void EndOverCostAction(in long useTimeTick)
@@ -148,54 +148,54 @@ namespace Yitter.IdGenerator
}
return;
if (GenAction == null)
{
return;
}
DoGenIdAction(new OverCostActionArg(
WorkerId,
useTimeTick,
2,
_OverCostCountInOneTerm,
_GenCountInOneTerm,
_TermIndex));
// if (GenAction == null)
// {
// return;
// }
//
// DoGenIdAction(new OverCostActionArg(
// WorkerId,
// useTimeTick,
// 2,
// _OverCostCountInOneTerm,
// _GenCountInOneTerm,
// _TermIndex));
}
private void BeginTurnBackAction(in long useTimeTick)
{
return;
if (GenAction == null)
{
return;
}
DoGenIdAction(new OverCostActionArg(
WorkerId,
useTimeTick,
8,
0,
0,
_TurnBackIndex));
// if (GenAction == null)
// {
// return;
// }
//
// DoGenIdAction(new OverCostActionArg(
// WorkerId,
// useTimeTick,
// 8,
// 0,
// 0,
// _TurnBackIndex));
}
private void EndTurnBackAction(in long useTimeTick)
{
return;
if (GenAction == null)
{
return;
}
DoGenIdAction(new OverCostActionArg(
WorkerId,
useTimeTick,
9,
0,
0,
_TurnBackIndex));
// if (GenAction == null)
// {
// return;
// }
//
// DoGenIdAction(new OverCostActionArg(
// WorkerId,
// useTimeTick,
// 9,
// 0,
// 0,
// _TurnBackIndex));
}
private long NextOverCostId()

View File

@@ -45,7 +45,7 @@ namespace Infrastructure.Utilities
return null;
}
if (directoryInfo.Exists
&& directoryInfo.GetDirectories().Where(x => x.Name.LastIndexOf(".Mvc") != -1).FirstOrDefault() != null)
&& directoryInfo.GetDirectories().Where(x => x.Name.LastIndexOf(".App") != -1).FirstOrDefault() != null)
{
return directoryInfo;
}

View File

@@ -58,17 +58,5 @@ namespace Infrastructure.Utilities
String result = url.ToLower().Replace("&" + fragmentToRemove, string.Empty).Replace("?" + fragmentToRemove, string.Empty);
return result;
}
/// <summary>
/// 根据URL的相对地址获取决定路径
/// <para>eg: /Home/About ==>http://192.168.0.1/Home/About</para>
/// </summary>
/// <returns>System.String.</returns>
//public static string GetAbsolutePathForRelativePath(string relativePath)
//{
// HttpRequest Request = HttpContext.Current.Request;
// string returnUrl = string.Format("{0}{1}",Request.Url.AbsoluteUri.Replace(Request.Url.PathAndQuery, string.Empty) , VirtualPathUtility.ToAbsolute(relativePath));
// return returnUrl;
//}
}
}

View File

@@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using OpenAuth.App.Interface;
using OpenAuth.App.Request;
using OpenAuth.Repository;
@@ -39,7 +40,7 @@ namespace OpenAuth.App
{
var applications = UnitWork.Find<Application>(null);
return applications.ToList();
return await applications.ToListAsync();
}

View File

@@ -7,7 +7,7 @@
// Last Modified On : 07-05-2018
// ***********************************************************************
// <copyright file="AuthContextFactory.cs" company="OpenAuth.App">
// Copyright (c) http://www.openauth.me. All rights reserved.
// Copyright (c) http://www.openauth.net.cn. All rights reserved.
// </copyright>
// <summary>
// 用户权限策略工厂

View File

@@ -15,6 +15,7 @@
// </summary>
// ***********************************************************************
using System;
using System.Collections.Generic;
using Infrastructure;
using OpenAuth.App.Response;
@@ -58,14 +59,30 @@ namespace OpenAuth.App
get { return _strategy.Resources; }
}
public List<Org> Orgs
public List<SysOrg> Orgs
{
get { return _strategy.Orgs; }
}
public List<KeyDescription> GetProperties(string moduleCode)
/// <summary>
/// 获取角色可以访问的字段信息
/// </summary>
/// <param name="moduleCode"></param>
/// <returns></returns>
public List<BuilderTableColumn> GetTableColumns(string moduleCode)
{
return _strategy.GetProperties(moduleCode);
return _strategy.GetTableColumns(moduleCode);
}
/// <summary>
/// 获取角色可访问的字段信息因为MVC版本没有代码生成器所以只能通过直接读取数据库表结构的方式
/// </summary>
/// <param name="moduleCode"></param>
/// <returns></returns>
[Obsolete("获取角色可访问的字段信息因为MVC版本没有代码生成器所以只能通过直接读取数据库表结构的方式")]
public List<BuilderTableColumn> GetTableColumnsFromDb(string moduleCode)
{
return _strategy.GetTableColumnsFromDb(moduleCode);
}
}

View File

@@ -7,7 +7,7 @@
// Last Modified On : 07-04-2018
// ***********************************************************************
// <copyright file="NormalAuthStrategy.cs" company="OpenAuth.App">
// Copyright (c) http://www.openauth.me. All rights reserved.
// Copyright (c) http://www.openauth.net.cn. All rights reserved.
// </copyright>
// <summary>
// 普通用户授权策略
@@ -15,6 +15,7 @@
// ***********************************************************************
using System;
using System.Collections.Generic;
using System.Linq;
using Infrastructure;
@@ -98,13 +99,13 @@ namespace OpenAuth.App
}
}
public List<Org> Orgs
public List<SysOrg> Orgs
{
get
{
var orgids = UnitWork.Find<Relevance>(
u =>u.FirstId == _user.Id && u.Key == Define.USERORG).Select(u => u.SecondId);
return UnitWork.Find<Org>(u => orgids.Contains(u.Id)).ToList();
return UnitWork.Find<SysOrg>(u => orgids.Contains(u.Id)).ToList();
}
}
@@ -117,28 +118,53 @@ namespace OpenAuth.App
_userRoleIds = UnitWork.Find<Relevance>(u => u.FirstId == _user.Id && u.Key == Define.USERROLE).Select(u => u.SecondId).ToList();
}
}
/// <summary>
/// 获取用户可访问的字段列表
/// </summary>
/// <param name="moduleCode">模块的code</param>
/// <returns></returns>
public List<KeyDescription> GetProperties(string moduleCode)
public List<BuilderTableColumn> GetTableColumns(string moduleCode)
{
var allprops = _dbExtension.GetProperties(moduleCode);
var allprops = UnitWork.Find<BuilderTableColumn>(u => u.TableName.ToLower() == moduleCode.ToLower());
//如果是子表,直接返回所有字段
var builderTable = UnitWork.FirstOrDefault<BuilderTable>(u => u.TableName.ToLower() == moduleCode.ToLower());
if (builderTable == null)
{
throw new Exception($"代码生成器中找不到{moduleCode.ToLower()}的定义");
}
//如果是子表,因为不能在模块界面分配,所以直接返回所有字段,后期可以优化。
if (builderTable.ParentTableId != null)
{
return allprops.ToList();
}
//如果是系统模块直接返回所有字段。防止开发者把模块配置成系统模块还在外层调用loginContext.GetProperties("xxxx");
bool? isSysModule = UnitWork.FirstOrDefault<Module>(u => u.Code == moduleCode)?.IsSys;
if (isSysModule!= null && isSysModule.Value)
{
return allprops;
return allprops.ToList();
}
var props =UnitWork.Find<Relevance>(u =>
u.Key == Define.ROLEDATAPROPERTY && _userRoleIds.Contains(u.FirstId) && u.SecondId == moduleCode)
.Select(u => u.ThirdId);
return allprops.Where(u => props.Contains(u.Key)).ToList();
return allprops.Where(u => props.Contains(u.ColumnName)).ToList();
}
public List<BuilderTableColumn> GetTableColumnsFromDb(string moduleCode)
{
var allprops = _dbExtension.GetTableColumnsFromDb(moduleCode);
//如果是系统模块直接返回所有字段。防止开发者把模块配置成系统模块还在外层调用loginContext.GetProperties("xxxx");
bool? isSysModule = UnitWork.FirstOrDefault<Module>(u => u.Code == moduleCode)?.IsSys;
if (isSysModule!= null && isSysModule.Value)
{
return allprops.ToList();
}
var props =UnitWork.Find<Relevance>(u =>
u.Key == Define.ROLEDATAPROPERTY && _userRoleIds.Contains(u.FirstId) && u.SecondId == moduleCode)
.Select(u => u.ThirdId);
return allprops.Where(u => props.Contains(u.ColumnName)).ToList();
}
//用户角色

View File

@@ -7,7 +7,7 @@
// Last Modified On : 07-05-2018
// ***********************************************************************
// <copyright file="SystemAuthStrategy.cs" company="OpenAuth.App">
// Copyright (c) http://www.openauth.me. All rights reserved.
// Copyright (c) http://www.openauth.net.cn. All rights reserved.
// </copyright>
// <summary>
// 超级管理员授权策略
@@ -78,9 +78,9 @@ namespace OpenAuth.App
get { return UnitWork.Find<Resource>(null).ToList(); }
}
public List<Org> Orgs
public List<SysOrg> Orgs
{
get { return UnitWork.Find<Org>(null).ToList(); }
get { return UnitWork.Find<SysOrg>(null).ToList(); }
}
public User User
@@ -91,10 +91,16 @@ namespace OpenAuth.App
throw new Exception("超级管理员,禁止设置用户");
}
}
public List<KeyDescription> GetProperties(string moduleCode)
public List<BuilderTableColumn> GetTableColumns(string moduleCode)
{
return _dbExtension.GetProperties(moduleCode);
return UnitWork.Find<BuilderTableColumn>(u => u.TableName.ToLower() == moduleCode.ToLower()).ToList();
}
public List<BuilderTableColumn> GetTableColumnsFromDb(string moduleCode)
{
return _dbExtension.GetTableColumnsFromDb(moduleCode);
}

View File

@@ -18,7 +18,7 @@ namespace OpenAuth.App
/// <summary>
/// 用于事务操作
/// <para>使用详见http://doc.openauth.me/core/unitwork.html</para>
/// <para>使用详见http://doc.openauth.net.cn/core/unitwork.html</para>
/// </summary>
protected IUnitWork<TDbContext> UnitWork;
@@ -34,7 +34,7 @@ namespace OpenAuth.App
/// <summary>
/// 获取当前登录用户的数据访问权限
/// </summary>
/// <param name=""parameterName>linq表达式参数的名称如u=>u.name中的"u"</param>
/// <param name="parametername">linq表达式参数的名称如u=>u.name中的"u"</param>
/// <returns></returns>
protected IQueryable<T> GetDataPrivilege(string parametername)
{

View File

@@ -15,6 +15,7 @@ namespace OpenAuth.App
/// 业务层基类UnitWork用于事务操作Repository用于普通的数据库操作
/// </summary>
/// <typeparam name="T"></typeparam>
/// <typeparam name="TDbContext"></typeparam>
public class BaseIntAutoGenApp<T, TDbContext> :BaseApp<T,TDbContext> where T : IntAutoGenEntity where TDbContext: DbContext
{
public BaseIntAutoGenApp(IUnitWork<TDbContext> unitWork, IRepository<T,TDbContext> repository, IAuth auth) : base(unitWork, repository, auth)

View File

@@ -14,6 +14,7 @@ namespace OpenAuth.App
/// 业务层基类UnitWork用于事务操作Repository用于普通的数据库操作
/// </summary>
/// <typeparam name="T"></typeparam>
/// <typeparam name="TDbContext"></typeparam>
public class BaseLongApp<T, TDbContext> :BaseApp<T,TDbContext> where T : LongEntity where TDbContext: DbContext
{
@@ -27,12 +28,12 @@ namespace OpenAuth.App
/// 按id批量删除
/// </summary>
/// <param name="ids"></param>
public void Delete(long[] ids)
public void Delete(decimal[] ids)
{
Repository.Delete(u => ids.Contains(u.Id));
}
public T Get(long id)
public T Get(decimal id)
{
return Repository.FirstOrDefault(u => u.Id == id);
}

View File

@@ -11,9 +11,10 @@ namespace OpenAuth.App
{
/// <summary>
/// 业务层基类UnitWork用于事务操作Repository用于普通的数据库操作
/// <para>如用户管理Class UserManagerApp:BaseApp<User></para>
/// <para>如用户管理Class UserManagerApp:BaseApp&lt;User&gt;</para>
/// </summary>
/// <typeparam name="T"></typeparam>
/// <typeparam name="TDbContext"></typeparam>
public class BaseStringApp<T, TDbContext> :BaseApp<T,TDbContext> where T : StringEntity where TDbContext: DbContext
{

View File

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

View File

@@ -0,0 +1,14 @@
namespace OpenAuth.App.Request
{
/// <summary>
/// 请求参数中只有Id
/// </summary>
/// <typeparam name="T"></typeparam>
public class IdRequest<T>
{
/// <summary>
/// 操作Id
/// </summary>
public T Id { get; set; }
}
}

View File

@@ -12,8 +12,10 @@
// <summary>layui datatable数据返回</summary>
// ***********************************************************************
using System;
using System.Collections.Generic;
using Infrastructure;
using OpenAuth.Repository.Domain;
namespace OpenAuth.App.Response
{
@@ -36,10 +38,12 @@ namespace OpenAuth.App.Response
/// </summary>
public int count { get; set; }
/// <summary>
/// 返回的列表头信息
/// 返回的表格列定义
/// 该属性基于代码生成使用的列定义
/// </summary>
public List<KeyDescription> columnHeaders;
public List<BuilderTableColumn> columnFields;
/// <summary>
/// 数据内容
@@ -50,7 +54,7 @@ namespace OpenAuth.App.Response
{
code = 200;
msg = "加载成功";
columnHeaders = new List<KeyDescription>();
columnFields = new List<BuilderTableColumn>();
}
}
}

View File

@@ -11,6 +11,7 @@ using Infrastructure;
using Infrastructure.Extensions;
using Infrastructure.Helpers;
using Infrastructure.Utilities;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyModel;
using Microsoft.Extensions.Options;
using OpenAuth.App.Interface;
@@ -29,8 +30,7 @@ namespace OpenAuth.App
private BuilderTableColumnApp _builderTableColumnApp;
private CategoryApp _categoryApp;
private DbExtension _dbExtension;
private string _webProject = null;
private string _apiNameSpace = null;
private string _webProject = string.Empty;
private string _startName = "";
private IOptions<AppSetting> _appConfiguration;
@@ -61,12 +61,12 @@ namespace OpenAuth.App
{
get
{
if (_webProject != null)
if (!string.IsNullOrEmpty(_webProject))
return _webProject;
_webProject = ProjectPath.GetLastIndexOfDirectoryName(".WebApi") ??
ProjectPath.GetLastIndexOfDirectoryName("Api") ??
ProjectPath.GetLastIndexOfDirectoryName(".Mvc");
if (_webProject == null)
if (string.IsNullOrEmpty(_webProject))
{
throw new Exception("未获取到以.WebApi结尾的项目名称,无法创建页面");
}
@@ -93,10 +93,10 @@ namespace OpenAuth.App
objs = objs.Where(u => u.Id.Contains(request.key));
}
result.data = objs.OrderBy(u => u.Id)
result.data =await objs.OrderBy(u => u.Id)
.Skip((request.page - 1) * request.limit)
.Take(request.limit).ToList();
result.count = objs.Count();
.Take(request.limit).ToListAsync();
result.count =await objs.CountAsync();
return result;
}
@@ -117,16 +117,20 @@ namespace OpenAuth.App
throw new Exception("命名空间不能为空");
}
var columns = _dbExtension.GetDbTableStructure(req.TableName);
if (!columns.Any())
{
throw new Exception($"未能找到{req.TableName}表结构定义");
}
var obj = AddTableAndColumns(req.MapTo<BuilderTable>());
UnitWork.Save();
return obj.Id;
}
var obj = req.MapTo<BuilderTable>();
/// <summary>
/// 添加表结构及字段结构记录
/// </summary>
private BuilderTable AddTableAndColumns(BuilderTable obj)
{
if (string.IsNullOrEmpty(obj.ClassName)) obj.ClassName = obj.TableName;
if (string.IsNullOrEmpty(obj.ModuleCode)) obj.ModuleCode = obj.TableName;
//todo:补充或调整自己需要的字段
obj.CreateTime = DateTime.Now;
var user = _auth.GetCurrentUser().User;
@@ -134,6 +138,11 @@ namespace OpenAuth.App
obj.CreateUserName = user.Name;
UnitWork.Add(obj);
var columns = _dbExtension.GetDbTableStructure(obj.TableName);
if (!columns.Any())
{
throw new Exception($"未能找到{obj.TableName}表结构定义");
}
foreach (var column in columns)
{
var builderColumn = new BuilderTableColumn
@@ -160,8 +169,7 @@ namespace OpenAuth.App
UnitWork.Add(builderColumn);
}
UnitWork.Save();
return obj.Id;
return obj;
}
public void Update(AddOrUpdateBuilderTableReq obj)
@@ -171,8 +179,6 @@ namespace OpenAuth.App
{
TableName = obj.TableName,
Comment = obj.Comment,
DetailTableName = obj.DetailTableName,
DetailComment = obj.DetailComment,
ClassName = obj.ClassName,
Namespace = obj.Namespace,
ModuleCode = obj.ModuleCode,
@@ -181,10 +187,12 @@ namespace OpenAuth.App
Options = obj.Options,
TypeId = obj.TypeId,
TypeName = obj.TypeName,
IsDynamicHeader = obj.IsDynamicHeader,
ForeignKey = obj.ForeignKey,
ParentTableId = obj.ParentTableId,
UpdateTime = DateTime.Now,
UpdateUserId = user.Id,
UpdateUserName = user.Name
//todo:补充或调整自己需要的字段
});
}
@@ -229,20 +237,20 @@ namespace OpenAuth.App
public void CreateBusiness(CreateBusiReq req)
{
var sysTableInfo = Repository.FirstOrDefault(u => u.Id == req.Id);
var tableColumns = _builderTableColumnApp.Find(req.Id);
var mainColumns = _builderTableColumnApp.Find(req.Id);
if (sysTableInfo == null
|| tableColumns == null
|| tableColumns.Count == 0)
|| mainColumns == null
|| mainColumns.Count == 0)
throw new Exception("未能找到正确的模版信息");
//生成应用层
GenerateApp(sysTableInfo,tableColumns);
//生成应用层
GenerateApp(sysTableInfo, mainColumns);
//生成应用层的请求参数
GenerateAppReq(sysTableInfo, tableColumns);
GenerateAppReq(sysTableInfo, mainColumns);
//生成WebApI接口
GenerateWebApi(sysTableInfo, tableColumns);
GenerateWebApi(sysTableInfo, mainColumns);
}
/// <summary>
@@ -261,21 +269,40 @@ namespace OpenAuth.App
CheckExistsModule(sysTableInfo.ModuleCode);
string domainContent = FileHelper.ReadFile(@"Template\\BuildApp.html");
string domainContent = string.Empty;
if (sysTableInfo.IsDynamicHeader) //使用动态头部的模版
{
domainContent = FileHelper.ReadFile(@"Template\\SingleTable\\BuildAppWithDynamicHeader.html");
}
else
{
domainContent = FileHelper.ReadFile(@"Template\\SingleTable\\BuildApp.html");
}
domainContent = domainContent
.Replace("{TableName}", sysTableInfo.TableName)
.Replace("{ModuleCode}", sysTableInfo.ModuleCode)
.Replace("{ModuleName}", sysTableInfo.ModuleName)
.Replace("{ClassName}", sysTableInfo.ClassName)
.Replace("{StartName}", StratName);
if (!string.IsNullOrEmpty(sysTableInfo.ForeignKey))
{ //替换外键模版
var foreignTemplate = $"objs = objs.Where(u => u.{sysTableInfo.ForeignKey} == request.{sysTableInfo.ForeignKey});";
domainContent = domainContent
.Replace("{ForeignKeyTemplate}", foreignTemplate);
}
else
{
domainContent = domainContent
.Replace("{ForeignKeyTemplate}", "");
}
var primarykey = sysColumns.FirstOrDefault(u => u.IsKey);
if (primarykey == null)
{
throw new Exception($"未能找到表{sysTableInfo.TableName}的主键字段");
}
if (primarykey.ColumnType == "decimal" || primarykey.ColumnType == "numberic") //是否为数字
if (primarykey.ColumnType == "decimal" || primarykey.ColumnType == "numeric") //是否为数字
{
if(primarykey.IsIncrement) //是否自增
{
@@ -313,6 +340,19 @@ namespace OpenAuth.App
.Replace("{ModuleName}", sysTableInfo.ModuleName)
.Replace("{ClassName}", sysTableInfo.ClassName)
.Replace("{StartName}", StratName);
if (!string.IsNullOrEmpty(sysTableInfo.ForeignKey))
{ //替换外键模版
var foreignTemplate = $" public string {sysTableInfo.ForeignKey} {{ get; set; }}";
domainContent = domainContent
.Replace("{ForeignKeyTemplate}", foreignTemplate);
}
else
{
domainContent = domainContent
.Replace("{ForeignKeyTemplate}", "");
}
FileHelper.WriteFile(Path.Combine(appRootPath, $"{sysTableInfo.ModuleCode}\\Request"), $"Query{sysTableInfo.ClassName}ListReq.cs",
domainContent);
@@ -386,7 +426,7 @@ namespace OpenAuth.App
{
throw new Exception($"未能找到表{sysTableInfo.TableName}的主键字段");
}
if (primarykey.ColumnType == "decimal" || primarykey.ColumnType == "numberic") //是否为数字
if (primarykey.ColumnType == "decimal" || primarykey.ColumnType == "numeric") //是否为数字
{
if(primarykey.IsIncrement) //是否自增
{
@@ -394,7 +434,7 @@ namespace OpenAuth.App
}
else //普通的雪花算法生成id
{
domainContent = domainContent.Replace("{KeyTypeName}", "long");
domainContent = domainContent.Replace("{KeyTypeName}", "decimal");
}
}
else
@@ -458,7 +498,7 @@ namespace OpenAuth.App
{
throw new Exception($"未能找到表{tableInfo.TableName}的主键字段");
}
if (primarykey.ColumnType == "decimal" || primarykey.ColumnType == "numberic") //是否为数字
if (primarykey.ColumnType == "decimal" || primarykey.ColumnType == "numeric") //是否为数字
{
if(primarykey.IsIncrement) //是否自增
{
@@ -506,6 +546,7 @@ namespace OpenAuth.App
,{"string", typeof(string)}
,{"bool", typeof(bool)}
,{"byte", typeof(byte)}
,{"float", typeof(float)}
,{"char", typeof(char)}
,{"decimal", typeof(decimal)}
,{"double", typeof(double)}
@@ -581,115 +622,126 @@ namespace OpenAuth.App
throw new Exception("请提供vue项目的根目录,如C:\\OpenAuth.Pro\\Client");
}
var sysTableInfo = Repository.FirstOrDefault(u => u.Id == req.Id);
if (!string.IsNullOrEmpty(sysTableInfo.ParentTableId))
{
return;
// throw new Exception("子表不能直接生成vue请使用该表对应的父表生成vue或删除该表的父表");
}
var tableColumns = _builderTableColumnApp.Find(req.Id);
if (sysTableInfo == null
|| tableColumns == null
|| tableColumns.Count == 0)
throw new Exception("未能找到正确的模版信息");
var domainContent = FileHelper.ReadFile(@"Template\\BuildVue.html");
StringBuilder dialogStrBuilder = new StringBuilder(); //编辑对话框
StringBuilder tempBuilder = new StringBuilder(); //临时类的默认值属性
var syscolums = tableColumns.OrderByDescending(c => c.Sort).ToList();
string[] eidtTye = new string[] { "select", "selectList", "checkbox" };
if (syscolums.Exists(x => eidtTye.Contains(x.EditType) && string.IsNullOrEmpty(x.DataSource)))
{
throw new Exception($"编辑类型为[{string.Join(',', eidtTye)}]时必须选择数据源");
}
foreach (BuilderTableColumn column in syscolums)
{
if (!column.IsEdit) continue;
tempBuilder.Append($" {column.ColumnName.ToCamelCase()}: ");
dialogStrBuilder.Append($" <el-form-item size=\"small\" :label=\"'{column.Comment}'\" prop=\"{column.ColumnName.ToCamelCase()}\" v-if=\"Object.keys(temp).indexOf('{column.ColumnName.ToCamelCase()}')>=0\">\r\n");
string domainContent = string.Empty;
if (column.EditType == "switch")
//查找是否存在子表额情况
var subTable = Repository.FirstOrDefault(u => u.ParentTableId == req.Id);
if (subTable == null) //如果子表不存在,则用单模版生成
{
if (req.Version == "vue3")
{
dialogStrBuilder.Append($" <el-switch v-model=\"temp.{column.ColumnName.ToCamelCase()}\" ></el-switch>\r\n");
tempBuilder.Append($"false, //{column.Comment} \r\n");
}
else if (column.EditType == "date")
{
dialogStrBuilder.Append($" <el-date-picker v-model=\"temp.{column.ColumnName.ToCamelCase()}\" type=\"date\" placeholder=\"选择日期\"> </el-date-picker>\r\n");
tempBuilder.Append($"'', //{column.Comment} \r\n");
}
else if (column.EditType == "datetime")
{
dialogStrBuilder.Append($" <el-date-picker v-model=\"temp.{column.ColumnName.ToCamelCase()}\" type=\"datetime\" placeholder=\"选择日期时间\"> </el-date-picker>\r\n");
tempBuilder.Append($"'', //{column.Comment} \r\n");
}
else if (column.EditType == "decimal") //小数
{
dialogStrBuilder.Append($" <el-input-number v-model=\"temp.{column.ColumnName.ToCamelCase()}\" :min=\"1\" :max=\"100\" ></el-input-number>\r\n");
tempBuilder.Append($"0, //{column.Comment} \r\n");
}
else if (column.EditType =="number") //整数
{
dialogStrBuilder.Append($" <el-input-number v-model=\"temp.{column.ColumnName.ToCamelCase()}\" :min=\"1\" :max=\"100\" ></el-input-number>\r\n");
tempBuilder.Append($"0, //{column.Comment} \r\n");
}
else if (column.EditType =="textarea")
{
dialogStrBuilder.Append($" <el-input type=\"textarea\" :rows=\"3\" v-model=\"temp.{column.ColumnName.ToCamelCase()}\"></el-input>\r\n");
tempBuilder.Append($"'', //{column.Comment} \r\n");
}
else if (column.EditType =="select")
{
var categories = _categoryApp.LoadByTypeId(column.DataSource);
if (categories.IsNullOrEmpty())
if (sysTableInfo.IsDynamicHeader)
{
throw new Exception($"未能找到{column.DataSource}对应的值,请在分类管理里面添加");
domainContent = FileHelper.ReadFile(@"Template\\SingleTable\\BuildVue3WithDynamicHeader.html");
}
dialogStrBuilder.Append($" <el-select v-model=\"temp.{column.ColumnName.ToCamelCase()}\" placeholder=\"请选择\">\r\n");
foreach (var category in categories)
else
{
dialogStrBuilder.Append($" <el-option label=\"{category.Name}\" value=\"{category.DtValue}\"> </el-option>\r\n");
domainContent = FileHelper.ReadFile(@"Template\\SingleTable\\BuildVue3.html");
}
dialogStrBuilder.Append(" </el-select>\r\n");
tempBuilder.Append($"'', //{column.Comment} \r\n");
}
else if (column.EditType =="checkbox")
{
var categories = _categoryApp.LoadByTypeId(column.DataSource);
if (categories.IsNullOrEmpty())
{
throw new Exception($"未能找到{column.DataSource}对应的值,请在分类管理里面添加");
}
dialogStrBuilder.Append($" <el-checkbox-group v-model=\"temp.{column.ColumnName.ToCamelCase()}\">\r\n");
foreach (var category in categories)
{
dialogStrBuilder.Append($" <el-checkbox label=\"{category.DtValue}\"></el-checkbox>\r\n");
}
dialogStrBuilder.Append(" </el-checkbox-group>\r\n");
tempBuilder.Append($"[], //{column.Comment} \r\n");
}
}
else
{
dialogStrBuilder.Append($" <el-input v-model=\"temp.{column.ColumnName.ToCamelCase()}\"></el-input>\r\n");
tempBuilder.Append($"'', //{column.Comment} \r\n");
}
if (sysTableInfo.IsDynamicHeader)
{
domainContent = FileHelper.ReadFile(@"Template\\SingleTable\\BuildVueWithDynamicHeader.html");
}
else
{
domainContent = FileHelper.ReadFile(@"Template\\SingleTable\\BuildVue.html");
}
}
dialogStrBuilder.Append(" </el-form-item>\r\n");
dialogStrBuilder.Append("\r\n");
domainContent = domainContent.Replace("{ClassName}", sysTableInfo.ClassName)
.Replace("{TableName}", sysTableInfo.ClassName.ToCamelCase())
.Replace("{HeaderList}", BuilderHeader(tableColumns).ToString());
}
else //如果存在子表,则使用主从表生成
{
var subTableColumns = _builderTableColumnApp.Find(subTable.Id);
if (subTableColumns.Count == 0)
throw new Exception($"未找到子表{subTable.ClassName}的字段定义");
if (req.Version == "vue3")
{
if (sysTableInfo.IsDynamicHeader)
{
domainContent = FileHelper.ReadFile(@"Template\\MultiTable\\BuildVue3WithDynamicHeader.html");
}
else
{
domainContent = FileHelper.ReadFile(@"Template\\MultiTable\\BuildVue3.html");
}
}
else
{
if (sysTableInfo.IsDynamicHeader)
{
domainContent = FileHelper.ReadFile(@"Template\\MultiTable\\BuildVueWithDynamicHeader.html");
}
else
{
domainContent = FileHelper.ReadFile(@"Template\\MultiTable\\BuildVue.html");
}
}
domainContent = domainContent.Replace("{ParentTableId}", subTable.ForeignKey.ToCamelCase())
.Replace("{FirstTableName}", sysTableInfo.ClassName.ToCamelCase())
.Replace("{SecondTableName}", subTable.ClassName.ToCamelCase())
.Replace("{FirstHeaderList}", BuilderHeader(tableColumns).ToString())
.Replace("{SecondHeaderList}", BuilderHeader(subTableColumns).ToString());
}
tempBuilder.Append(" nothing:'' //代码生成时的占位符,看不顺眼可以删除 \r\n");
domainContent = domainContent.Replace("{ClassName}", sysTableInfo.ClassName)
.Replace("{TableName}", sysTableInfo.ClassName.ToCamelCase())
.Replace("{Temp}", tempBuilder.ToString())
.Replace("{DialogFormItem}", dialogStrBuilder.ToString());
FileHelper.WriteFile(Path.Combine(req.VueProjRootPath, $"src/views/{sysTableInfo.ClassName.ToLower()}s/"),
$"index.vue",
domainContent);
}
/// <summary>
/// 创建vue动态表头
/// </summary>
/// <returns></returns>
private StringBuilder BuilderHeader(List<BuilderTableColumn> tableColumns)
{
StringBuilder headerListBuilder = new StringBuilder(); //临时类的默认值属性
var syscolums = tableColumns.OrderByDescending(c => c.Sort).ToList();
//string[] eidtTye = new string[] { "select", "selectList", "checkbox" };
//if (syscolums.Exists(x => eidtTye.Contains(x.EditType) && string.IsNullOrEmpty(x.DataSource)))
//{
// throw new Exception($"编辑类型为[{string.Join(',', eidtTye)}]时必须选择数据源");
//}
foreach (BuilderTableColumn column in syscolums)
{
headerListBuilder.Append(
$" new ColumnDefine('{column.ColumnName.ToCamelCase()}', '{column.Comment}', {column.IsEdit.ToString().ToLower()}, {column.IsList.ToString().ToLower()}, '{column.EditType}', '{column.DataSource}', '{column.EntityType}', '{column.ColumnType}', '{column.EntityName}'),");
headerListBuilder.Append("\r\n ");
}
return headerListBuilder;
}
/// <summary>
/// 创建vue接口
/// </summary>
@@ -715,6 +767,24 @@ namespace OpenAuth.App
FileHelper.WriteFile(Path.Combine(req.VueProjRootPath, $"src/api/"),$"{sysTableInfo.ClassName.ToCamelCase()}s.js",
domainContent);
}
/// <summary>
/// 加载所有的主表parentId为空的
/// </summary>
/// <returns></returns>
public async Task<TableData> AllMain()
{
var result = new TableData();
var objs = UnitWork.Find<BuilderTable>(u =>string.IsNullOrEmpty(u.ParentTableId)).Select(u=>new
{
Id= u.Id,
Name = u.TableName
});
result.data =await objs.OrderBy(u => u.Id).ToListAsync();
result.count =await objs.CountAsync();
return result;
}
}
}

View File

@@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Infrastructure;
using Microsoft.EntityFrameworkCore;
using OpenAuth.App.Interface;
using OpenAuth.App.Request;
using OpenAuth.App.Response;
@@ -15,9 +16,12 @@ namespace OpenAuth.App
{
public class BuilderTableColumnApp : BaseStringApp<BuilderTableColumn,OpenAuthDBContext>
{
private DbExtension _dbExtension;
public BuilderTableColumnApp(IUnitWork<OpenAuthDBContext> unitWork, IRepository<BuilderTableColumn,OpenAuthDBContext> repository,
IAuth auth) : base(unitWork, repository,auth)
IAuth auth, DbExtension dbExtension) : base(unitWork, repository,auth)
{
_dbExtension = dbExtension;
}
/// <summary>
@@ -36,10 +40,10 @@ namespace OpenAuth.App
objs = objs.Where(u => u.ColumnName.Contains(request.key));
}
result.data = objs.OrderBy(u => u.ColumnName)
result.data =await objs.OrderBy(u => u.ColumnName)
.Skip((request.page - 1) * request.limit)
.Take(request.limit).ToList();
result.count = objs.Count();
.Take(request.limit).ToListAsync();
result.count =await objs.CountAsync();
return result;
}
@@ -80,6 +84,48 @@ namespace OpenAuth.App
});
}
/// <summary>
/// 同步数据结构
/// <para>读取数据库结构与当前结构的差异,如果数据库有新增的字段,则自动加入</para>
/// </summary>
public void Sync(SyncStructureReq req)
{
var columns = _dbExtension.GetDbTableStructure(req.TableName);
if (!columns.Any())
{
throw new Exception($"未能找到{req.TableName}表结构定义");
}
var exists = Find(req.Id).Select(u=>u.ColumnName);
foreach (var column in columns)
{
if(exists.Contains(column.ColumnName)) continue;
var builderColumn = new BuilderTableColumn
{
ColumnName = column.ColumnName,
Comment = column.Comment,
ColumnType = column.ColumnType,
EntityType = column.EntityType,
EntityName = column.ColumnName,
IsKey = column.IsKey == 1,
IsRequired = column.IsNull != 1,
IsEdit = true,
IsInsert = true,
IsList = true,
MaxLength = column.MaxLength,
TableName = req.TableName,
TableId = req.Id,
CreateTime = DateTime.Now
};
UnitWork.Add(builderColumn);
}
UnitWork.Save();
}

View File

@@ -34,14 +34,12 @@ namespace OpenAuth.App.Request
/// 表描述、中文名称
/// </summary>
public string Comment { get; set; }
/// <summary>
/// 子表英文全称
/// 父表ID
/// </summary>
public string DetailTableName { get; set; }
/// <summary>
/// 子表描述、中文名称
/// </summary>
public string DetailComment { get; set; }
public string ParentTableId { get; set; }
/// <summary>
/// 实体类名称
/// </summary>
@@ -74,5 +72,16 @@ namespace OpenAuth.App.Request
/// 分类名称
/// </summary>
public string TypeName { get; set; }
/// <summary>
/// 是否动态加载表头信息
/// </summary>
public bool IsDynamicHeader { get; set; }
/// <summary>
/// 子表外键
/// </summary>
public string ForeignKey { get; set; }
}
}

View File

@@ -29,5 +29,11 @@ namespace OpenAuth.App.Request
/// vue项目所在的根目录D:\OpenAuth.Pro\Client
/// </summary>
public string VueProjRootPath { get; set; }
/// <summary>
/// 版本信息
/// 值为vue2/vue3默认为vue2
/// </summary>
public string Version { get; set; }
}
}

View File

@@ -0,0 +1,29 @@
//------------------------------------------------------------------------------
// <autogenerated>
// This code was generated by a CodeSmith Template.
//
// DO NOT MODIFY contents of this file. Changes to this
// file will be lost if the code is regenerated.
// Author:Yubao Li
// </autogenerated>
//------------------------------------------------------------------------------
namespace OpenAuth.App.Request
{
/// <summary>
/// 同步表结构
/// </summary>
public class SyncStructureReq
{
/// <summary>
/// Id为空则为添加
/// </summary>
public string Id { get; set; }
/// <summary>
/// 表英文全称
/// </summary>
public string TableName { get; set; }
}
}

View File

@@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Infrastructure;
using Microsoft.EntityFrameworkCore;
using OpenAuth.App.Interface;
using OpenAuth.App.Request;
using OpenAuth.App.Response;
@@ -25,12 +26,11 @@ namespace OpenAuth.App
{
throw new CommonException("登录已过期", Define.INVALID_TOKEN);
}
var properties = loginContext.GetProperties("Category");
if (properties == null || properties.Count == 0)
var columnFields = loginContext.GetTableColumns("Category");
if (columnFields == null || columnFields.Count == 0)
{
throw new Exception("当前登录用户没有访问该模块字段的权限,请联系管理员配置");
throw new Exception("请在代码生成界面配置Category表的字段属性");
}
var result = new TableData();
@@ -45,12 +45,12 @@ namespace OpenAuth.App
objs = objs.Where(u => u.Id.Contains(request.key) || u.Name.Contains(request.key));
}
var propertyStr = string.Join(',', properties.Select(u =>u.Key));
result.columnHeaders = properties;
var propertyStr = string.Join(',', columnFields.Select(u =>u.ColumnName));
result.columnFields = columnFields;
result.data = objs.OrderBy(u => u.DtCode)
.Skip((request.page - 1) * request.limit)
.Take(request.limit).Select($"new ({propertyStr})");
result.count = objs.Count();
result.count = await objs.CountAsync();
return result;
}

View File

@@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Infrastructure;
using Microsoft.EntityFrameworkCore;
using OpenAuth.App.Interface;
using OpenAuth.App.Request;
using OpenAuth.App.Response;
@@ -29,10 +30,10 @@ namespace OpenAuth.App
objs = objs.Where(u => u.Id.Contains(request.key) || u.Name.Contains(request.key));
}
result.data = objs.OrderBy(u => u.Name)
result.data =await objs.OrderBy(u => u.Name)
.Skip((request.page - 1) * request.limit)
.Take(request.limit);
result.count = objs.Count();
.Take(request.limit).ToListAsync();
result.count =await objs.CountAsync();
return result;
}

View File

@@ -0,0 +1,10 @@
using OpenAuth.Repository.Domain;
namespace OpenAuth.App.Response
{
public class CategoryTypeResp : CategoryType
{
public string ParentId { get; set; }
}
}

View File

@@ -2,6 +2,7 @@ using System;
using System.Linq;
using System.Threading.Tasks;
using Infrastructure;
using Microsoft.EntityFrameworkCore;
using OpenAuth.App.Interface;
using OpenAuth.App.Request;
using OpenAuth.App.Response;
@@ -25,15 +26,13 @@ namespace OpenAuth.App
{
throw new CommonException("登录已过期", Define.INVALID_TOKEN);
}
var properties = loginContext.GetProperties("DataPrivilegeRule");
if (properties == null || properties.Count == 0)
var columnFields = loginContext.GetTableColumns("DataPrivilegeRule");
if (columnFields == null || columnFields.Count == 0)
{
throw new Exception("当前登录用户没有访问该模块字段的权限,请联系管理员配置");
throw new Exception("请在代码生成界面配置DataPrivilegeRule表的字段属性");
}
var result = new TableData();
var objs = UnitWork.Find<DataPrivilegeRule>(null);
if (!string.IsNullOrEmpty(request.key))
@@ -41,13 +40,12 @@ namespace OpenAuth.App
objs = objs.Where(u => u.Id.Contains(request.key) || u.SourceCode.Contains(request.key) || u.Description.Contains(request.key));
}
var propertyStr = string.Join(',', properties.Select(u => u.Key));
result.columnHeaders = properties;
var propertyStr = string.Join(',', columnFields.Select(u => u.ColumnName));
result.columnFields = columnFields;
result.data = objs.OrderBy(u => u.Id)
.Skip((request.page - 1) * request.limit)
.Take(request.limit).Select($"new ({propertyStr})");
result.count = objs.Count();
result.count = await objs.CountAsync();
return result;
}

View File

@@ -34,13 +34,14 @@ namespace OpenAuth.App
}
/// <summary>
/// 获取数据库一个表的所有属性值及属性描述
/// 通过实体获取字段定义因为MVC版本没有代码生成界面只能通过这种方式
/// </summary>
/// <param name="moduleName">模块名称/表名</param>
/// <returns></returns>
public List<KeyDescription> GetProperties(string moduleName)
[Obsolete("因为MVC版本没有代码生成界面只能通过这种方式")]
public List<BuilderTableColumn> GetTableColumnsFromDb(string moduleName)
{
var result = new List<KeyDescription>();
var result = new List<BuilderTableColumn>();
const string domain = "openauth.repository.domain.";
IEntityType entity = null;
_contexts.ForEach(u =>
@@ -67,12 +68,13 @@ namespace OpenAuth.App
{
typeName = Nullable.GetUnderlyingType(property.PropertyType).Name;
}
result.Add(new KeyDescription
result.Add(new BuilderTableColumn
{
Key = property.Name,
Description = description,
Browsable = browsable,
Type = typeName
ColumnName = property.Name,
TableName = moduleName,
Comment = description,
IsList = browsable,
ColumnType = typeName
});
}
@@ -114,17 +116,79 @@ namespace OpenAuth.App
{
return GetMySqlStructure(tableName);
}
else
else if (dbtype == Define.DBTYPE_SQLSERVER)
{
return GetSqlServerStructure(tableName);
}
else
{
return GetOracleStructure(tableName);
}
}
/// <summary>
/// 获取Oracle表结构
/// </summary>
private IList<SysTableColumn> GetOracleStructure(string tableName)
{
var sql = $@"
select utc.column_name as COLUMNNAME,
utc.data_type COLUMNTYPE,
utc.data_length MaxLength,
CASE utc.nullable WHEN 'N' THEN 0 ELSE 1 END IsNull,
utc.data_default DEFAULTVAL,
ucc.comments ""COMMENT"",
UTC.table_name TABLENAME,
CASE UTC.COLUMN_NAME
WHEN (select col.column_name
from user_constraints con,
user_cons_columns col
where con.constraint_name = col.constraint_name
and con.constraint_type = 'P'
and col.table_name = '{ tableName}') THEN 1
ELSE 0 END AS IsKey,
CASE
WHEN data_type IN ('BIT', 'BOOL') THEN
'bool'
WHEN data_type in ('SMALLINT') THEN 'short'
WHEN data_type in ('TINYINT') THEN 'bool'
WHEN data_type IN ('NUMBER', 'CHAR', 'INT', 'Year') THEN
'int'
WHEN data_type in ('BIGINT') THEN
'bigint'
WHEN data_type IN ('FLOAT', 'DOUBLE', 'DECIMAL') THEN
'decimal'
WHEN data_type IN
('CHAR', 'VARCHAR', 'TINY TEXT', 'TEXT', 'MEDIUMTEXT', 'LONGTEXT', 'TINYBLOB', 'BLOB',
'MEDIUMBLOB', 'LONGBLOB', 'Time') THEN
'string'
WHEN data_type IN ('Date', 'DateTime', 'TIMESTAMP(6)') THEN
'DateTime'
ELSE 'string'
END AS EntityType
from user_tab_columns utc,
user_col_comments ucc
where utc.table_name = ucc.table_name
and utc.column_name = ucc.column_name
and utc.table_name = '{ tableName}'
order by column_id; ";
foreach (var context in _contexts)
{
var columns = context.Set<SysTableColumn>().FromSqlRaw(sql);
var columnList = columns?.ToList();
if (columnList != null && columnList.Any())
{
return columnList;
}
}
return new List<SysTableColumn>();
}
/// <summary>
/// 获取Mysql表结构信息
/// </summary>
/// <param name="tableName"></param>
/// <returns></returns>
private IList<SysTableColumn> GetMySqlStructure(string tableName)
{
var sql = $@"SELECT DISTINCT
@@ -176,7 +240,7 @@ namespace OpenAuth.App
foreach (var context in _contexts)
{
var columns = context.Query<SysTableColumn>().FromSqlRaw(sql);
var columns = context.Set<SysTableColumn>().FromSqlRaw(sql);
var columnList = columns?.ToList();
if (columnList != null && columnList.Any())
{
@@ -216,7 +280,7 @@ namespace OpenAuth.App
THEN 'DateTime'
WHEN ColumnType IN('smallmoney', 'DECIMAL', 'numeric',
'money') THEN 'decimal'
WHEN ColumnType = 'float' THEN 'float'
WHEN ColumnType = 'float' THEN 'double'
ELSE 'string'
END as EntityType,
ColumnType,
@@ -282,7 +346,7 @@ namespace OpenAuth.App
foreach (var context in _contexts)
{
var columns = context.Query<SysTableColumn>().FromSqlRaw(sql);
var columns = context.Set<SysTableColumn>().FromSqlRaw(sql);
var columnList = columns?.ToList();
if (columnList != null && columnList.Any())
{

View File

@@ -7,6 +7,7 @@ using Infrastructure;
using Infrastructure.Extensions;
using Infrastructure.Helpers;
using Microsoft.AspNetCore.Http;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using OpenAuth.App.Interface;
@@ -52,10 +53,10 @@ namespace OpenAuth.App
objs = objs.Where(u => u.FileName.Contains(request.key) || u.FilePath.Contains(request.key));
}
result.data = objs.OrderByDescending(u => u.CreateTime)
result.data =await objs.OrderByDescending(u => u.CreateTime)
.Skip((request.page - 1) * request.limit)
.Take(request.limit);
result.count = objs.Count();
.Take(request.limit).ToListAsync();
result.count =await objs.CountAsync();
return result;
}

View File

@@ -1,5 +1,5 @@
// <copyright file="FlowLine.cs" company="openauth.me">
// Copyright (c) 2019 openauth.me. All rights reserved.
// <copyright file="FlowLine.cs" company="openauth.net.cn">
// Copyright (c) 2019 openauth.net.cn. All rights reserved.
// </copyright>
// <author>www.cnblogs.com/yubaolee</author>
// <date>2019-03-05</date>

View File

@@ -79,6 +79,11 @@
/// 会签拒绝的个数
/// </summary>
public int? ConfluenceNo { get; set; }
/// <summary>
/// 可写的表单项ID
/// </summary>
public string[] CanWriteFormItemIds { get; set; }
}
/// <summary>

View File

@@ -7,7 +7,7 @@
// Last Modified On : 07-19-2018
// ***********************************************************************
// <copyright file="FlowRuntime.cs" company="OpenAuth.App">
// Copyright (c) http://www.openauth.me. All rights reserved.
// Copyright (c) http://www.openauth.net.cn. All rights reserved.
// </copyright>
// <summary>
// 一个正在运行中的流程实例

View File

@@ -7,7 +7,7 @@
// Last Modified On : 07-19-2018
// ***********************************************************************
// <copyright file="FlowInstanceApp.cs" company="OpenAuth.App">
// Copyright (c) http://www.openauth.me. All rights reserved.
// Copyright (c) http://www.openauth.net.cn. All rights reserved.
// </copyright>
// <summary></summary>
// ***********************************************************************
@@ -27,6 +27,7 @@ using System.Net.Http;
using System.Threading.Tasks;
using Infrastructure.Const;
using Infrastructure.Helpers;
using Microsoft.EntityFrameworkCore;
using OpenAuth.Repository;
namespace OpenAuth.App
@@ -41,11 +42,13 @@ namespace OpenAuth.App
private FormApp _formApp;
private IHttpClientFactory _httpClientFactory;
private IServiceProvider _serviceProvider;
private SysMessageApp _messageApp;
public FlowInstanceApp(IUnitWork<OpenAuthDBContext> unitWork,
IRepository<FlowInstance, OpenAuthDBContext> repository
, RevelanceManagerApp app, FlowSchemeApp flowSchemeApp, FormApp formApp,
IHttpClientFactory httpClientFactory, IAuth auth, IServiceProvider serviceProvider)
IHttpClientFactory httpClientFactory, IAuth auth, IServiceProvider serviceProvider,
SysMessageApp messageApp)
: base(unitWork, repository, auth)
{
_revelanceApp = app;
@@ -53,6 +56,7 @@ namespace OpenAuth.App
_formApp = formApp;
_httpClientFactory = httpClientFactory;
_serviceProvider = serviceProvider;
_messageApp = messageApp;
}
#region API
@@ -276,12 +280,15 @@ namespace OpenAuth.App
flowInstance.IsFinish = (wfruntime.nextNodeType == 4
? FlowInstanceStatus.Finished
: FlowInstanceStatus.Running);
AddTransHistory(wfruntime);
}
else
{
flowInstance.IsFinish = FlowInstanceStatus.Disagree; //表示该节点不同意
wfruntime.nextNodeId = "-1";
wfruntime.nextNodeType = 4;
}
AddTransHistory(wfruntime);
flowInstanceOperationHistory.Content = "【" + wfruntime.currentNode.name
+ "】【" + DateTime.Now.ToString("yyyy-MM-dd HH:mm")
@@ -293,8 +300,25 @@ namespace OpenAuth.App
flowInstance.SchemeContent = JsonHelper.Instance.Serialize(wfruntime.ToSchemeObj());
if (!string.IsNullOrEmpty(request.FrmData))
{
flowInstance.FrmData = request.FrmData;
if (flowInstance.FrmType == 1) //如果是开发者自定义的表单,更新对应数据库表数据
{
var t = Type.GetType("OpenAuth.App." + flowInstance.DbName + "App");
ICustomerForm icf = (ICustomerForm) _serviceProvider.GetService(t);
icf.Update(flowInstance.Id,flowInstance.FrmData);
}
}
UnitWork.Update(flowInstance);
UnitWork.Add(flowInstanceOperationHistory);
//给流程创建人发送通知信息
_messageApp.SendMsgTo(flowInstance.CreateUserId,
$"你的流程[{flowInstance.CustomName}]已被{user.Name}处理。处理情况如下:{flowInstanceOperationHistory.Content}");
UnitWork.Save();
wfruntime.NotifyThirdParty(_httpClientFactory.CreateClient(), tag);
@@ -378,6 +402,10 @@ namespace OpenAuth.App
+ "】【" + DateTime.Now.ToString("yyyy-MM-dd HH:mm") + "】驳回,备注:"
+ reqest.VerificationOpinion
});
//给流程创建人发送通知信息
_messageApp.SendMsgTo(flowInstance.CreateUserId,
$"你的流程[{flowInstance.CustomName}]已被{user.Name}驳回。备注信息:{reqest.VerificationOpinion}");
UnitWork.Save();
@@ -548,7 +576,11 @@ namespace OpenAuth.App
/// </summary>
public void Verification(VerificationReq request)
{
CheckNodeDesignate(request);
//如果是同意,需要判断是否为运行时选定下一步执行角色/执行人
if (request.VerificationFinally == "1")
{
CheckNodeDesignate(request);
}
bool isReject = TagState.Reject.Equals((TagState) Int32.Parse(request.VerificationFinally));
if (isReject) //驳回
{
@@ -584,9 +616,15 @@ namespace OpenAuth.App
var flowinstance = Get(id);
var resp =flowinstance.MapTo<FlowVerificationResp>();
var runtime = new FlowRuntime(flowinstance);
if (runtime.currentNode != null && runtime.currentNode.setInfo !=null)
{
resp.CanWriteFormItemIds = runtime.currentNode.setInfo.CanWriteFormItemIds;
}
if (runtime.nextNode != null && runtime.nextNode.setInfo !=null && runtime.nextNodeType != 4)
{
resp.NextNodeDesignateType = runtime.nextNode.setInfo.NodeDesignate;
resp.CanWriteFormItemIds = runtime.currentNode.setInfo.CanWriteFormItemIds;
}
return resp;
}
@@ -609,9 +647,9 @@ namespace OpenAuth.App
waitExp = waitExp.And(t => t.CustomName.Contains(request.key));
}
result.count = UnitWork.Find(waitExp).Count();
result.count = await UnitWork.Find(waitExp).CountAsync();
result.data = UnitWork.Find(request.page, request.limit, "CreateDate descending", waitExp).ToList();
result.data =await UnitWork.Find(request.page, request.limit, "CreateDate descending", waitExp).ToListAsync();
}
else if (request.type == "disposed") //已办事项(即我参与过的流程)
{
@@ -627,10 +665,10 @@ namespace OpenAuth.App
query = query.Where(t => t.CustomName.Contains(request.key));
}
result.data = query.OrderByDescending(u => u.CreateDate)
result.data = await query.OrderByDescending(u => u.CreateDate)
.Skip((request.page - 1) * request.limit)
.Take(request.limit).ToList();
result.count = instances.Count();
.Take(request.limit).ToListAsync();
result.count =await instances.CountAsync();
}
else //我的流程
{
@@ -642,9 +680,9 @@ namespace OpenAuth.App
myFlowExp = myFlowExp.And(t => t.CustomName.Contains(request.key));
}
result.count = UnitWork.Find(myFlowExp).Count();
result.data = UnitWork.Find(request.page, request.limit,
"CreateDate descending", myFlowExp).ToList();
result.count =await UnitWork.Find(myFlowExp).CountAsync();
result.data = await UnitWork.Find(request.page, request.limit,
"CreateDate descending", myFlowExp).ToListAsync();
}
return result;
@@ -665,7 +703,7 @@ namespace OpenAuth.App
FromNodeName = wfruntime.currentNode.name,
FromNodeType = wfruntime.currentNodeType,
ToNodeId = wfruntime.nextNodeId,
ToNodeName = wfruntime.nextNode.name,
ToNodeName = wfruntime.nextNode?.name,
ToNodeType = wfruntime.nextNodeType,
IsFinish = wfruntime.nextNodeType == 4 ? FlowInstanceStatus.Finished : FlowInstanceStatus.Running,
TransitionSate = 0
@@ -732,6 +770,12 @@ namespace OpenAuth.App
var wfruntime = new FlowRuntime(flowInstance);
var user = _auth.GetCurrentUser();
if (wfruntime.nextNode.setInfo.NodeDesignate == Setinfo.RUNTIME_SPECIAL_USER
|| wfruntime.nextNode.setInfo.NodeDesignate == Setinfo.RUNTIME_SPECIAL_ROLE)
{
throw new Exception("暂不支持【第二执行节点为运行时指定角色/账号执行】的流程恢复");
}
#region
flowInstance.ActivityId = wfruntime.nextNodeId;
flowInstance.ActivityType = wfruntime.GetNextNodeType();

View File

@@ -25,5 +25,11 @@ namespace OpenAuth.App.Request
/// </summary>
public string NodeRejectType { get; set; }
/// <summary>
/// 新的表单数据
/// 如果该节点有可以修改的表单项时,会提交表单数据信息
/// </summary>
public string FrmData { get; set; }
}
}

View File

@@ -7,15 +7,35 @@ namespace OpenAuth.App.Response
/// <summary>
/// 预览表单数据
/// </summary>
/// <value>The FRM data HTML.</value>
public string FrmPreviewHtml
{
get { return FormUtil.Preview(this); }
}
/// <summary>
/// 预览表单数据表单项包含读写控制权限)
/// </summary>
public string FrmHtml
{
get
{
if (this.FrmType != 0) //只有开原版动态表单才需要转换
{
return string.Empty;
}
return FormUtil.GetHtml(this.FrmContentData, this.FrmContentParse, this.FrmData, "",this.CanWriteFormItemIds);
}
}
/// <summary>
/// 下个节点的执行权限方式
/// </summary>
public string NextNodeDesignateType { get; set; }
/// <summary>
/// 当前节点的可写表单Id
/// </summary>
public string[] CanWriteFormItemIds { get; set; }
}
}

View File

@@ -1,6 +1,7 @@
using System;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using OpenAuth.App.Interface;
using OpenAuth.App.Request;
using OpenAuth.App.Response;
@@ -59,10 +60,10 @@ namespace OpenAuth.App
objs = objs.Where(u => u.SchemeName.Contains(request.key) || u.Id.Contains(request.key));
}
result.data = objs.OrderByDescending(u => u.CreateDate)
result.data = await objs.OrderByDescending(u => u.CreateDate)
.Skip((request.page - 1) * request.limit)
.Take(request.limit).ToList();
result.count = objs.Count();
.Take(request.limit).ToListAsync();
result.count = await objs.CountAsync();
return result;
}

View File

@@ -0,0 +1,114 @@
using System;
using System.Linq;
using System.Text;
using Infrastructure;
using Newtonsoft.Json.Linq;
using OpenAuth.Repository;
using OpenAuth.Repository.Interface;
using OpenAuth.Repository.QueryObj;
namespace OpenAuth.App
{
/// <summary>
/// 拖动表单,根据表单字段创建数据库表
/// </summary>
public class DragForm: IForm
{
private IUnitWork<OpenAuthDBContext> _unitWork;
public DragForm(IUnitWork<OpenAuthDBContext> unitWork)
{
_unitWork = unitWork;
}
/**
* 功能: 创建表单数据表格基于sql server
*/
public string GetSql(Repository.Domain.Form form, string dbType)
{
if (dbType == Define.DBTYPE_SQLSERVER) //Sql Server
{
// 获取字段并处理
var jsonArray = JsonHelper.Instance.Deserialize<JObject>(form.ContentData)["list"];
// 数据库名称
string tableName = form.DbName;
var exist = _unitWork.FromSql<QueryStringObj>($"select '1' as value from sysobjects where name = '{tableName}' and type = 'U'").SingleOrDefault();
if (exist != null) return string.Empty;
// 创建数据表
StringBuilder sql = new StringBuilder($"CREATE TABLE {tableName} ( [Id] varchar(50) COLLATE Chinese_PRC_CI_AS NOT NULL,"); //主键
string sqlDefault = "";
foreach (var json in jsonArray)
{
string type = json["type"].ToString();
string name = json["model"].ToString();
sql.Append("[" + name + "] " + field_type_sql(type)); //字段拼接
if ("checkboxs" == type)
sqlDefault += field_type_sql_default(tableName, name, "0");
else
sqlDefault += field_type_sql_default(tableName, name, "''");
}
sql.Append(");");
//设置主键
sql.Append("ALTER TABLE " + tableName + " ADD CONSTRAINT [PK_" + form.DbName +
"] PRIMARY KEY NONCLUSTERED ([Id])");
sql.Append(
"WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ");
sql.Append("ON [PRIMARY];");
//主键默认值
sql.Append("ALTER TABLE " + tableName + " ADD DEFAULT (newid()) FOR [Id];");
return sql + sqlDefault;
}
else
{
// 获取字段并处理
var jsonArray = JsonHelper.Instance.Deserialize<JObject>(form.ContentData)["list"];
// 数据库名称
string tableName = form.DbName;
var exist = _unitWork.FromSql<QueryStringObj>($"select distinct table_name as value from information_schema.tables where table_name ='{tableName}'").SingleOrDefault();
if (exist != null) return string.Empty;
// 创建数据表
StringBuilder sql = new StringBuilder($"create table if not exists `{tableName}` ( Id varchar(50) not null primary key,"); //主键
foreach (var json in jsonArray)
{
string type = json["type"].ToString();
string name = json["model"].ToString();
sql.Append("`" + name + "` " + field_type_mysql(type)); //字段拼接
}
var result = sql.ToString().TrimEnd(',') + ");";
return result;
}
}
private string field_type_sql(string leipiplugins)
{
if ("textarea" == leipiplugins || "listctrl" == leipiplugins)
{
return " text NULL ,";
}
else if ("checkboxs" == leipiplugins)
{
return " int NOT NULL ,";
}
else
{
return " varchar(255) NULL ,";
}
}
private string field_type_mysql(string leipiplugins)
{
if ("textarea" == leipiplugins || "listctrl" == leipiplugins)
{
return " varchar(255) null ,";
}
else if ("checkboxs" == leipiplugins)
{
return " tinyint not null ,";
}
else
{
return " varchar(255) NULL ,";
}
}
private string field_type_sql_default(string tablename, string field, string defaultValue)
{
return "ALTER TABLE " + tablename + " ADD DEFAULT (" + defaultValue + ") FOR [" + field + "];";
}
}
}

View File

@@ -4,6 +4,7 @@ using System.Threading.Tasks;
using Infrastructure;
using Infrastructure.Utilities;
using Microsoft.AspNetCore.Http;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Options;
using OpenAuth.App.Interface;
using OpenAuth.App.Request;
@@ -17,7 +18,6 @@ namespace OpenAuth.App
{
public class FormApp : BaseStringApp<Form,OpenAuthDBContext>
{
private IAuth _auth;
private IOptions<AppSetting> _appConfiguration;
private IHttpContextAccessor _httpContextAccessor;
/// <summary>
@@ -35,7 +35,7 @@ namespace OpenAuth.App
result.data = forms.OrderByDescending(u => u.CreateDate)
.Skip((request.page - 1) * request.limit)
.Take(request.limit).ToList();
result.count = forms.Count();
result.count = await forms.CountAsync();
return result;
}
@@ -49,7 +49,7 @@ namespace OpenAuth.App
{
var dbtype = _appConfiguration.Value.DbTypes[_httpContextAccessor.GetTenantId()];
UnitWork.ExecuteSql(FormUtil.GetSql(obj, dbtype));
UnitWork.ExecuteSql(FormFactory.CreateForm(obj, this.UnitWork).GetSql(obj, dbtype));
}
UnitWork.Save();
}
@@ -73,7 +73,7 @@ namespace OpenAuth.App
if (!string.IsNullOrEmpty(obj.DbName))
{
var dbtype = _appConfiguration.Value.DbTypes[_httpContextAccessor.GetTenantId()];
UnitWork.ExecuteSql(FormUtil.GetSql(obj, dbtype));
UnitWork.ExecuteSql(FormFactory.CreateForm(obj,this.UnitWork).GetSql(obj, dbtype));
}
}

View File

@@ -0,0 +1,25 @@
using System;
using OpenAuth.Repository;
using OpenAuth.Repository.Domain;
using OpenAuth.Repository.Interface;
namespace OpenAuth.App
{
public class FormFactory
{
public static IForm CreateForm(Form form, IUnitWork<OpenAuthDBContext> unitWork)
{
if (form.FrmType == 0)
{
return new LeipiForm(unitWork);
}else if (form.FrmType == 1)
{
throw new Exception("自定义表单不需要创建数据库表");
}
else
{
return new DragForm(unitWork);
}
}
}
}

View File

@@ -1,3 +1,4 @@
using System.Linq;
using System.Text;
using Infrastructure;
using Newtonsoft.Json.Linq;
@@ -6,9 +7,12 @@ using OpenAuth.Repository.Domain;
namespace OpenAuth.App
{
public class FormUtil {
public class FormUtil
{
private static string READONLY = "view";
public static string GetHtml(string contentData, string contentParse,string frmData, string action)
public static string GetHtml(string contentData, string contentParse,string frmData, string action,params string[] canWriteFormItemIds)
{
if (string.IsNullOrEmpty(contentData))
{
@@ -30,6 +34,11 @@ namespace OpenAuth.App
else
name = json.GetValue("name").ToString();
if (canWriteFormItemIds != null && canWriteFormItemIds.Length > 0)
{
action = canWriteFormItemIds.Contains(name) ? "":READONLY;
}
string tempHtml = "";
switch (leipiplugins)
{
@@ -79,7 +88,7 @@ namespace OpenAuth.App
return string.Empty;
}
return GetHtml(form.ContentData, form.ContentParse,null, "");
return GetHtml(form.ContentData, form.ContentParse,form.FrmData, "");
}
@@ -98,7 +107,7 @@ namespace OpenAuth.App
}
return GetHtml(flowInstance.FrmContentData, flowInstance.FrmContentParse,
flowInstance.FrmData, "view");
flowInstance.FrmData, READONLY);
}
//text
@@ -118,7 +127,7 @@ namespace OpenAuth.App
value = item.GetValue("value") == null ? "" : item.GetValue("value").ToString();
string style =item.GetValue("style") == null ? "" : item.GetValue("style").ToString();
string tempHtml = string.Format(temp, value, name, style);
if("view"==action)
if(READONLY==action)
return string.Format("<label style=\"{0}\">{1}</label>",style,value);
return tempHtml;
}
@@ -147,7 +156,7 @@ namespace OpenAuth.App
string temp_html = string.Format(temp, name, name, style, script, value);
if("view"==action)
if(READONLY==action)
return string.Format("<label style=\"{0}\">{1}</label>", style, value);
return temp_html;
}
@@ -186,7 +195,7 @@ namespace OpenAuth.App
temp_html += string.Format(temp, name, cvalue, Ischecked, cvalue);
}
return "view"==action ? string.Format("<label style=\"{0}\">{1}</label>", "", value) : temp_html;
return READONLY==action ? string.Format("<label style=\"{0}\">{1}</label>", "", value) : temp_html;
}
//Checkboxs
@@ -229,7 +238,7 @@ namespace OpenAuth.App
}
return "view" == action ? string.Format("<label style=\"{0}\">{1}</label>", "", view_value) : temp_html;
return READONLY == action ? string.Format("<label style=\"{0}\">{1}</label>", "", view_value) : temp_html;
}
//Select(比较特殊)
@@ -254,7 +263,7 @@ namespace OpenAuth.App
content = content.Replace(option, selected); //把选项替换成选中项
}
return "view" == action ? string.Format("<label style=\"{0}\">{1}</label>", "", value) : content;
return READONLY == action ? string.Format("<label style=\"{0}\">{1}</label>", "", value) : content;
}
@@ -295,7 +304,7 @@ namespace OpenAuth.App
temp = orgType + "二维码 <input type=\"text\" name=\"{0}\" value=\"{1}\"/>";
temp_html = string.Format(temp, name, value);
}
else if ("view"==action)
else if (READONLY==action)
{
//可以采用 http://qrcode.leipi.org/
@@ -363,7 +372,7 @@ namespace OpenAuth.App
// {
// if (i == tdCount - 1)
// listTitle.set(i, "操作");
// if ("view"==(action) && i == tdCount - 1) continue;//如果是查看最后一列不显示
// if (ACTION==(action) && i == tdCount - 1) continue;//如果是查看最后一列不显示
// trTitle += string.Format("<th>{0}</th>", listTitle.get(i));
// }
// trTitle = "<tr>" + trTitle + "</tr>";
@@ -419,7 +428,7 @@ namespace OpenAuth.App
// if (i == tdCount - 1)//最后一列不显示
// {
// if ("view"==(action)) continue;
// if (ACTION==(action)) continue;
// //tr += "<td></td>";
// else
// tr += "<td><a href=\"javascript:void(0);\" class=\"delrow \">删除</a></td>";
@@ -427,7 +436,7 @@ namespace OpenAuth.App
// }
// else
// {
// if ("view"==(action))
// if (ACTION==(action))
// {
// tr += string.Format("<td>{0}</td>", tdValue);
// }
@@ -449,7 +458,7 @@ namespace OpenAuth.App
// //region
// if (sum != "")
// {
// if ("view"==(action))
// if (ACTION==(action))
// tdSum += string.Format("<td>合计value{0}{1}</td>", i, listUnit.get(i));
// else
// tdSum += string.Format("<td>合计:<input class=\"input-small\" type=\"text\" value=\"value{0}\" name=\"{1}[total]\" {2}\">{3}</td>", i, tdname, sum, listUnit.get(i));
@@ -476,7 +485,7 @@ namespace OpenAuth.App
// tdSum = string.Format("<tbody class=\"sum\"><tr>{0}</tr></tbody>", tdSum);
// }
// }
// if ("view"==(action))
// if (ACTION==(action))
// theader = string.Format(theader, tdCount, title, "", trTitle);
// else
// theader = string.Format(theader, tdCount, title, btnAdd, trTitle);
@@ -485,142 +494,5 @@ namespace OpenAuth.App
// return temp_html;
// }
/**
* 功能: 创建表单数据表格基于sql server
*/
public static string GetSql(Form form, string dbType){
if (dbType == Define.DBTYPE_SQLSERVER) //Sql Server
{
// 获取字段并处理
var jsonArray = JArray.Parse(form.ContentData);
// 数据库名称
string tableName= form.DbName ;
// 创建数据表
StringBuilder sql =new StringBuilder("if exists ( select * from sysobjects where name = '"
+tableName+"' and type = 'U') drop table "
+ tableName +";") ;
sql.Append("CREATE TABLE "
+ tableName
+ " ( [Id] varchar(50) COLLATE Chinese_PRC_CI_AS NOT NULL,"); //主键
string sqlDefault = "";
foreach (var json in jsonArray)
{
string name;
string type = json["leipiplugins"].ToString();
if ("checkboxs" == type)
name = json["parse_name"].ToString();
else
name = json["name"].ToString();
sql.Append("[" + name + "] " + field_type_sql(type));//字段拼接
if ("checkboxs" == type)
sqlDefault += field_type_sql_default(tableName, name, "0");
else
sqlDefault += field_type_sql_default(tableName, name, "''");
}
sql.Append(");");
//设置主键
sql.Append("ALTER TABLE "+tableName+" ADD CONSTRAINT [PK_"+form.DbName+"] PRIMARY KEY NONCLUSTERED ([Id])");
sql.Append(
"WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ");
sql.Append("ON [PRIMARY];");
//主键默认值
sql.Append("ALTER TABLE "+tableName+" ADD DEFAULT (newid()) FOR [Id];");
return sql+sqlDefault;
}
else
{
// 获取字段并处理
var jsonArray = JArray.Parse(form.ContentData);
// 数据库名称
string tableName= form.DbName ;
// 创建数据表
StringBuilder sql =new StringBuilder("create table if not exists `"
+ tableName
+ "` ( Id varchar(50) not null primary key,") ; //主键
string sqlDefault = "";
foreach (var json in jsonArray)
{
string name;
string type = json["leipiplugins"].ToString();
if ("checkboxs" == type)
name = json["parse_name"].ToString();
else
name = json["name"].ToString();
sql.Append("`" + name + "` " + field_type_mysql(type));//字段拼接
//
// if ("checkboxs" == type)
// sqlDefault += field_type_sql_default(tableName, name, "0");
// else
// sqlDefault += field_type_sql_default(tableName, name, "''");
}
sql.Append(");");
return sql.ToString();
}
}
//获取控件字段类型 的sql
private static string field_type_sql(string leipiplugins)
{
if ("textarea"==leipiplugins || "listctrl"==leipiplugins)
{
return " text NULL ,";
}
else if ("checkboxs"==leipiplugins)
{
return " int NOT NULL ,";
}
else
{
return " varchar(255) NULL ,";
}
}
private static string field_type_mysql(string leipiplugins)
{
if ("textarea"==leipiplugins || "listctrl"==leipiplugins)
{
return " varchar(255) null ,";
}
else if ("checkboxs"==leipiplugins)
{
return " tinyint not null ,";
}
else
{
return " varchar(255) NULL ,";
}
}
private static string field_type_sql_default(string tablename, string field, string defaultValue)
{
return "ALTER TABLE "+tablename+" ADD DEFAULT ("+defaultValue+") FOR ["+field+"];";
}
}
}

View File

@@ -0,0 +1,7 @@
namespace OpenAuth.App
{
public interface IForm
{
string GetSql(Repository.Domain.Form form, string dbType);
}
}

View File

@@ -0,0 +1,122 @@
using System.Linq;
using System.Text;
using Infrastructure;
using Newtonsoft.Json.Linq;
using OpenAuth.Repository;
using OpenAuth.Repository.Interface;
using OpenAuth.Repository.QueryObj;
namespace OpenAuth.App
{
public class LeipiForm : IForm
{
private IUnitWork<OpenAuthDBContext> _unitWork;
public LeipiForm(IUnitWork<OpenAuthDBContext> unitWork)
{
_unitWork = unitWork;
}
/**
* 功能: 创建表单数据表格基于sql server
*/
public string GetSql(Repository.Domain.Form form, string dbType)
{
if (dbType == Define.DBTYPE_SQLSERVER) //Sql Server
{
// 获取字段并处理
var jsonArray = JArray.Parse(form.ContentData);
// 数据库名称
string tableName = form.DbName;
var exist = _unitWork.FromSql<QueryStringObj>($"select '1' as value from sysobjects where name = '{tableName}' and type = 'U'").SingleOrDefault();
if (exist != null) return string.Empty;
// 创建数据表
StringBuilder sql = new StringBuilder($"CREATE TABLE {tableName} ( [Id] varchar(50) COLLATE Chinese_PRC_CI_AS NOT NULL,"); //主键
string sqlDefault = "";
foreach (var json in jsonArray)
{
string name;
string type = json["leipiplugins"].ToString();
if ("checkboxs" == type)
name = json["parse_name"].ToString();
else
name = json["name"].ToString();
sql.Append("[" + name + "] " + field_type_sql(type)); //字段拼接
if ("checkboxs" == type)
sqlDefault += field_type_sql_default(tableName, name, "0");
else
sqlDefault += field_type_sql_default(tableName, name, "''");
}
sql.Append(");");
//设置主键
sql.Append("ALTER TABLE " + tableName + " ADD CONSTRAINT [PK_" + form.DbName +
"] PRIMARY KEY NONCLUSTERED ([Id])");
sql.Append(
"WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ");
sql.Append("ON [PRIMARY];");
//主键默认值
sql.Append("ALTER TABLE " + tableName + " ADD DEFAULT (newid()) FOR [Id];");
return sql + sqlDefault;
}
else
{
// 获取字段并处理
var jsonArray = JArray.Parse(form.ContentData);
// 数据库名称
string tableName = form.DbName;
var exist = _unitWork.FromSql<QueryStringObj>($"select distinct table_name as value from information_schema.tables where table_name ='{tableName}'").SingleOrDefault();
if (exist != null) return string.Empty;
// 创建数据表
StringBuilder sql = new StringBuilder($"create table if not exists `{tableName}` ( Id varchar(50) not null primary key,"); //主键
foreach (var json in jsonArray)
{
string name;
string type = json["leipiplugins"].ToString();
if ("checkboxs" == type)
name = json["parse_name"].ToString();
else
name = json["name"].ToString();
sql.Append("`" + name + "` " + field_type_mysql(type)); //字段拼接
//
// if ("checkboxs" == type)
// sqlDefault += field_type_sql_default(tableName, name, "0");
// else
// sqlDefault += field_type_sql_default(tableName, name, "''");
}
var result = sql.ToString().TrimEnd(',') + ");";
return result;
}
}
private string field_type_sql(string leipiplugins)
{
if ("textarea" == leipiplugins || "listctrl" == leipiplugins)
{
return " text NULL ,";
}
else if ("checkboxs" == leipiplugins)
{
return " int NOT NULL ,";
}
else
{
return " varchar(255) NULL ,";
}
}
private string field_type_mysql(string leipiplugins)
{
if ("textarea" == leipiplugins || "listctrl" == leipiplugins)
{
return " varchar(255) null ,";
}
else if ("checkboxs" == leipiplugins)
{
return " tinyint not null ,";
}
else
{
return " varchar(255) NULL ,";
}
}
private string field_type_sql_default(string tablename, string field, string defaultValue)
{
return "ALTER TABLE " + tablename + " ADD DEFAULT (" + defaultValue + ") FOR [" + field + "];";
}
}
}

View File

@@ -48,6 +48,11 @@ namespace OpenAuth.App.Response
/// 表单原html模板未经处理的
/// </summary>
public string Content { get; set; }
/// <summary>
/// 表单的数据
/// </summary>
public string FrmData { get; set; }
/// <summary>
/// 排序码
@@ -69,5 +74,22 @@ namespace OpenAuth.App.Response
get { return FormUtil.GetHtml(this); }
}
public string[] CanWriteFormItemIds { get; set; }
/// <summary>
/// 用户显示(表单项包含读写控制权限)
/// </summary>
public string HtmlWithCanWriteIds
{
get
{
if (this.FrmType != 0) //只有开原版动态表单才需要转换
{
return string.Empty;
}
return FormUtil.GetHtml(this.ContentData, this.ContentParse, this.FrmData,"",this.CanWriteFormItemIds);
}
}
}
}

View File

@@ -1,5 +1,6 @@
using System.Threading.Tasks;
using Infrastructure;
using Microsoft.EntityFrameworkCore;
using OpenAuth.App.Interface;
using OpenAuth.App.Request;
using OpenAuth.App.Response;
@@ -21,8 +22,8 @@ namespace OpenAuth.App
{
return new TableData
{
count = Repository.Count(null),
data = Repository.Find(request.page, request.limit, "Id desc")
count = await Repository.CountAsync(null),
data = await Repository.Find(request.page, request.limit, "Id desc").ToListAsync()
};
}
@@ -31,15 +32,6 @@ namespace OpenAuth.App
Repository.Add(obj);
}
public void Update(FrmLeaveReq obj)
{
UnitWork.Update<FrmLeaveReq>(u => u.Id == obj.Id, u => new FrmLeaveReq
{
//todo:要修改的字段赋值
});
}
public FrmLeaveReqApp(IUnitWork<OpenAuthDBContext> unitWork, IRepository<FrmLeaveReq,OpenAuthDBContext> repository,
RevelanceManagerApp app,IAuth auth) : base(unitWork, repository, auth)
{
@@ -52,5 +44,17 @@ namespace OpenAuth.App
req.FlowInstanceId = flowInstanceId;
Add(req);
}
public void Update(string flowInstanceId, string frmData)
{
var req = JsonHelper.Instance.Deserialize<FrmLeaveReq>(frmData);
UnitWork.Update<FrmLeaveReq>(u => u.FlowInstanceId == flowInstanceId, u => new FrmLeaveReq
{
UserName = req.UserName,
RequestComment = req.RequestComment,
RequestType = req.RequestType
//补充其他需要更新的字段
});
}
}
}

View File

@@ -7,6 +7,9 @@ using Quartz;
namespace OpenAuth.App.HostedService
{
/// <summary>
/// 自启动服务,本服务用于启动所有状态为【正在运行】的定时任务
/// </summary>
public class QuartzService : IHostedService, IDisposable
{
private readonly ILogger<QuartzService> _logger;
@@ -23,15 +26,15 @@ namespace OpenAuth.App.HostedService
public Task StartAsync(CancellationToken cancellationToken)
{
_scheduler.Start();
_openJobApp.StartAll();
return Task.CompletedTask;
var result = _openJobApp.StartAll();
return result;
}
public Task StopAsync(CancellationToken cancellationToken)
{
_scheduler.Shutdown();
var result =_scheduler.Shutdown();
_logger.LogInformation("关闭定时job");
return Task.CompletedTask;
return result;
}
public void Dispose()

View File

@@ -7,7 +7,7 @@
// Last Modified On : 07-05-2018
// ***********************************************************************
// <copyright file="IAuthStrategy.cs" company="OpenAuth.App">
// Copyright (c) http://www.openauth.me. All rights reserved.
// Copyright (c) http://www.openauth.net.cn. All rights reserved.
// </copyright>
// <summary>
// 授权策略接口
@@ -15,6 +15,7 @@
// ***********************************************************************
using System;
using System.Collections.Generic;
using Infrastructure;
using OpenAuth.App.Response;
@@ -32,19 +33,26 @@ namespace OpenAuth.App
List<Resource> Resources { get; }
List<Org> Orgs { get; }
List<SysOrg> Orgs { get; }
User User
{
get;set;
}
/// <summary>
/// 根据模块id获取可访问的模块字段
/// 获取角色可以访问的字段信息
/// </summary>
/// <param name="moduleCode"></param>
/// <returns></returns>
List<KeyDescription> GetProperties(string moduleCode);
List<BuilderTableColumn> GetTableColumns(string moduleCode);
/// <summary>
/// 获取角色可访问的字段信息因为MVC版本没有代码生成器所以只能通过直接读取数据库表结构的方式
/// </summary>
/// <param name="moduleCode"></param>
/// <returns></returns>
[Obsolete("获取角色可访问的字段信息因为MVC版本没有代码生成器所以只能通过直接读取数据库表结构的方式")]
List<BuilderTableColumn> GetTableColumnsFromDb(string moduleCode);
}
}

View File

@@ -12,5 +12,12 @@
/// <param name="flowInstanceId">表单对应的流程实例ID</param>
/// <param name="frmData">表单数据</param>
void Add(string flowInstanceId, string frmData);
/// <summary>
/// 该接口定义流程自定义表单模式时需实现向数据库更新表单数据
/// </summary>
/// <param name="flowInstanceId">更新的时候前端没有存储Id需要用流程实例ID来关联如果前端设计了Id字段则可以不用</param>
/// <param name="frmData">表单数据</param>
void Update(string flowInstanceId, string frmData);
}
}

View File

@@ -4,6 +4,7 @@ using System.Linq;
using System.Threading.Tasks;
using Infrastructure;
using Infrastructure.Const;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
using OpenAuth.App.Extensions;
using OpenAuth.App.Interface;
@@ -39,10 +40,10 @@ namespace OpenAuth.App
objs = objs.Where(u => u.Id.Contains(request.key));
}
result.data = objs.OrderBy(u => u.Id)
result.data =await objs.OrderBy(u => u.Id)
.Skip((request.page - 1) * request.limit)
.Take(request.limit);
result.count = objs.Count();
.Take(request.limit).ToListAsync();
result.count =await objs.CountAsync();
return result;
}
@@ -53,13 +54,12 @@ namespace OpenAuth.App
/// <returns></returns>
public async Task StartAll()
{
var jobs = Repository.Find(u => u.Status == (int) JobStatus.Running);
var jobs = await Repository.Find(u => u.Status == (int) JobStatus.Running).ToListAsync();
foreach (var job in jobs)
{
job.Start(_scheduler);
}
_logger.LogInformation("所有状态为正在运行的任务已启动");
}
public void Add(AddOrUpdateOpenJobReq req)

View File

@@ -6,6 +6,7 @@
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<DocumentationFile>bin\Debug\net5.0\OpenAuth.App.xml</DocumentationFile>
<NoWarn>1701;1702;1591;1573;1572;1570</NoWarn>
</PropertyGroup>
<ItemGroup>
@@ -15,15 +16,15 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="Autofac" Version="5.1.2" />
<PackageReference Include="Autofac" Version="5.2.0" />
<PackageReference Include="Autofac.Extensions.DependencyInjection" Version="6.0.0" />
<PackageReference Include="Autofac.Extras.Quartz" Version="5.1.0" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="3.1.2" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.OpenIdConnect" Version="3.1.2" />
<PackageReference Include="Microsoft.Extensions.DependencyModel" Version="2.0.4" />
<PackageReference Include="Microsoft.Extensions.Http" Version="3.1.2" />
<PackageReference Include="Microsoft.Extensions.DependencyModel" Version="5.0.0" />
<PackageReference Include="Microsoft.Extensions.Http" Version="5.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging.Log4Net.AspNetCore" Version="3.1.0" />
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="3.1.2" />
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="5.0.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.5.0" />
<PackageReference Include="Moq" Version="4.13.1" />
<PackageReference Include="NUnit" Version="3.13.1" />

View File

@@ -1,4 +1,5 @@
using System.Collections.Generic;
using System;
using System.Collections.Generic;
using System.Linq;
using Infrastructure;
using OpenAuth.App.Interface;
@@ -9,27 +10,27 @@ using OpenAuth.Repository.Interface;
namespace OpenAuth.App
{
public class OrgManagerApp : BaseTreeApp<Org,OpenAuthDBContext>
public class OrgManagerApp : BaseTreeApp<SysOrg,OpenAuthDBContext>
{
private RevelanceManagerApp _revelanceApp;
/// <summary>
/// 添加部门
/// </summary>
/// <param name="org">The org.</param>
/// <param name="sysOrg">The org.</param>
/// <returns>System.Int32.</returns>
/// <exception cref="System.Exception">未能找到该组织的父节点信息</exception>
public string Add(Org org)
public string Add(SysOrg sysOrg)
{
var loginContext = _auth.GetCurrentUser();
if (loginContext == null)
{
throw new CommonException("登录已过期", Define.INVALID_TOKEN);
}
CaculateCascade(org);
CaculateCascade(sysOrg);
UnitWork.ExecuteWithTransaction(() =>
{
UnitWork.Add(org);
UnitWork.Add(sysOrg);
UnitWork.Save();
//如果当前账号不是SYSTEM则直接分配
@@ -39,19 +40,23 @@ namespace OpenAuth.App
{
type = Define.USERORG,
firstId = loginContext.User.Id,
secIds = new[] { org.Id }
secIds = new[] { sysOrg.Id }
});
}
});
return org.Id;
return sysOrg.Id;
}
public string Update(Org org)
public string Update(SysOrg sysOrg)
{
UpdateTreeObj(org);
if (sysOrg.Id == sysOrg.ParentId)
{
throw new Exception("上级节点不能为自己");
}
UpdateTreeObj(sysOrg);
return org.Id;
return sysOrg.Id;
}
/// <summary>
@@ -59,15 +64,15 @@ namespace OpenAuth.App
/// </summary>
public void DelOrgCascade(string[] ids)
{
var delOrgCascadeIds = UnitWork.Find<Org>(u => ids.Contains(u.Id)).Select(u => u.CascadeId).ToArray();
var delOrgCascadeIds = UnitWork.Find<SysOrg>(u => ids.Contains(u.Id)).Select(u => u.CascadeId).ToArray();
var delOrgIds = new List<string>();
foreach (var cascadeId in delOrgCascadeIds)
{
delOrgIds.AddRange(UnitWork.Find<Org>(u=>u.CascadeId.Contains(cascadeId)).Select(u =>u.Id).ToArray());
delOrgIds.AddRange(UnitWork.Find<SysOrg>(u=>u.CascadeId.Contains(cascadeId)).Select(u =>u.Id).ToArray());
}
UnitWork.Delete<Relevance>(u =>u.Key == Define.USERORG && delOrgIds.Contains(u.SecondId));
UnitWork.Delete<Org>(u => delOrgIds.Contains(u.Id));
UnitWork.Delete<SysOrg>(u => delOrgIds.Contains(u.Id));
UnitWork.Save();
}
@@ -76,16 +81,16 @@ namespace OpenAuth.App
/// 加载特定用户的部门
/// </summary>
/// <param name="userId">The user unique identifier.</param>
public List<Org> LoadForUser(string userId)
public List<SysOrg> LoadForUser(string userId)
{
var result = from userorg in UnitWork.Find<Relevance>(null)
join org in UnitWork.Find<Org>(null) on userorg.SecondId equals org.Id
join org in UnitWork.Find<SysOrg>(null) on userorg.SecondId equals org.Id
where userorg.FirstId == userId && userorg.Key == Define.USERORG
select org;
return result.ToList();
}
public OrgManagerApp(IUnitWork<OpenAuthDBContext> unitWork, IRepository<Org,OpenAuthDBContext> repository,IAuth auth,
public OrgManagerApp(IUnitWork<OpenAuthDBContext> unitWork, IRepository<SysOrg,OpenAuthDBContext> repository,IAuth auth,
RevelanceManagerApp revelanceApp) : base(unitWork, repository, auth)
{
_revelanceApp = revelanceApp;

View File

@@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Infrastructure;
using Microsoft.EntityFrameworkCore;
using OpenAuth.App.Interface;
using OpenAuth.App.Request;
using OpenAuth.App.Response;
@@ -33,9 +34,18 @@ namespace OpenAuth.App
public void Update(AddOrUpdateResReq obj)
{
var user = _auth.GetCurrentUser().User;
UnitWork.Update<Category>(u => u.Id == obj.Id, u => new Category
UnitWork.Update<Resource>(u => u.Id == obj.Id, u => new Resource
{
Name = obj.Name,
Disable = obj.Disable,
CascadeId = obj.CascadeId,
AppId = obj.AppId,
AppName = obj.AppName,
ParentId = obj.ParentId,
ParentName = obj.ParentName,
TypeId = obj.TypeId,
TypeName = obj.TypeName,
Description = obj.Description,
UpdateTime = DateTime.Now,
UpdateUserId = user.Id,
UpdateUserName = user.Name
@@ -57,11 +67,10 @@ namespace OpenAuth.App
throw new CommonException("登录已过期", Define.INVALID_TOKEN);
}
var properties = loginContext.GetProperties("Resource");
if (properties == null || properties.Count == 0)
var columnFields = loginContext.GetTableColumns("Resource");
if (columnFields == null || columnFields.Count == 0)
{
throw new Exception("当前登录用户没有访问该模块字段的权限,请联系管理员配置");
throw new Exception("请在代码生成界面配置Resource表的字段属性");
}
@@ -77,12 +86,12 @@ namespace OpenAuth.App
resources = resources.Where(u => u.AppId == request.appId);
}
var propertyStr = string.Join(',', properties.Select(u => u.Key));
result.columnHeaders = properties;
var propertyStr = string.Join(',', columnFields.Select(u => u.ColumnName));
result.columnFields = columnFields;
result.data = resources.OrderBy(u => u.TypeId)
.Skip((request.page - 1) * request.limit)
.Take(request.limit).Select($"new ({propertyStr})");
result.count = resources.Count();
result.count = await resources.CountAsync();
return result;
}

View File

@@ -5,7 +5,9 @@ using OpenAuth.App.Response;
using OpenAuth.Repository.Domain;
using OpenAuth.Repository.Interface;
using System.Linq;
using System.Threading.Tasks;
using Infrastructure;
using Microsoft.EntityFrameworkCore;
using OpenAuth.App.Request;
using OpenAuth.Repository;
@@ -29,6 +31,26 @@ namespace OpenAuth.App
return roles;
}
/// <summary>
/// 获取所有的角色
/// 为了控制权限通常只用于流程实例选择执行角色其他地方请使用Load
/// </summary>
public async Task<TableResp<Role>> LoadAll(QueryRoleListReq request)
{
var result = new TableResp<Role>();
var objs = UnitWork.Find<Role>(null);
if (!string.IsNullOrEmpty(request.key))
{
objs = objs.Where(u => u.Name.Contains(request.key));
}
result.data = await objs.OrderBy(u => u.Name)
.Skip((request.page - 1) * request.limit)
.Take(request.limit).ToListAsync();
result.count = await objs.CountAsync();
return result;
}
/// <summary>
@@ -58,6 +80,21 @@ namespace OpenAuth.App
});
}
/// <summary>
/// 删除角色时,需要删除角色对应的权限
/// </summary>
/// <param name="ids"></param>
public override void Delete(string[] ids)
{
UnitWork.ExecuteWithTransaction(() =>
{
UnitWork.Delete<Relevance>(u=>(u.Key == Define.ROLEMODULE || u.Key == Define.ROLEELEMENT) && ids.Contains(u.FirstId));
UnitWork.Delete<Relevance>(u=>u.Key == Define.USERROLE && ids.Contains(u.SecondId));
UnitWork.Delete<Role>(u =>ids.Contains(u.Id));
UnitWork.Save();
});
}
/// <summary>
/// 更新角色属性
/// </summary>
@@ -80,5 +117,7 @@ namespace OpenAuth.App
{
_revelanceApp = app;
}
}
}

View File

@@ -176,10 +176,12 @@ namespace OpenAuth.App.SSO
_cacheContext.Remove(token);
return true;
}
catch (Exception ex)
catch
{
return false;
}
}
}
}

View File

@@ -5,8 +5,10 @@ namespace OpenAuth.App.SSO
public class PassportLoginRequest
{
/// <example>System</example>
public string Account { get; set; }
/// <example>123456</example>
public string Password { get; set; }
/// <summary>

View File

@@ -1,6 +1,7 @@
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using OpenAuth.App.Request;
using OpenAuth.App.Response;
using OpenAuth.Repository;
@@ -25,10 +26,10 @@ namespace OpenAuth.App
objs = objs.Where(u => u.Content.Contains(request.key) || u.Id.Contains(request.key));
}
result.data = objs.OrderByDescending(u => u.CreateTime)
result.data = await objs.OrderByDescending(u => u.CreateTime)
.Skip((request.page - 1) * request.limit)
.Take(request.limit);
result.count = objs.Count();
.Take(request.limit).ToListAsync();
result.count = await objs.CountAsync();
return result;
}

View File

@@ -2,6 +2,9 @@
{
public class QuerySysMessageListReq : PageReq
{
//todo:添加自己的请求字段
/// <summary>
/// 消息状态 0:未读1已读 999:全部
/// </summary>
public int Status { get; set; }
}
}

View File

@@ -0,0 +1,9 @@
namespace OpenAuth.App.Request
{
/// <summary>
/// 阅读消息请求
/// </summary>
public class ReadMsgReq : IdRequest<string>
{
}
}

View File

@@ -1,6 +1,9 @@
using System.Linq;
using System;
using System.Linq;
using System.Threading.Tasks;
using Infrastructure;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
using OpenAuth.App.Interface;
using OpenAuth.App.Request;
using OpenAuth.App.Response;
@@ -14,6 +17,7 @@ namespace OpenAuth.App
public class SysMessageApp : BaseStringApp<SysMessage,OpenAuthDBContext>
{
private RevelanceManagerApp _revelanceApp;
private readonly ILogger<SysMessageApp> _logger;
/// <summary>
/// 加载列表
@@ -27,17 +31,23 @@ namespace OpenAuth.App
}
var result = new TableData();
var objs = UnitWork.Find<SysMessage>(u =>u.ToId == loginContext.User.Id);
var objs = UnitWork.Find<SysMessage>(u =>u.ToId == loginContext.User.Id && u.ToStatus != -1);
if (!string.IsNullOrEmpty(request.key))
{
objs = objs.Where(u => u.Title.Contains(request.key) || u.Id.Contains(request.key));
}
//过滤消息状态
if (request.Status != 999)
{
objs = objs.Where(u => u.ToStatus == request.Status);
}
result.data = objs.OrderBy(u => u.Id)
result.data =await objs.OrderByDescending(u => u.CreateTime)
.Skip((request.page - 1) * request.limit)
.Take(request.limit);
result.count = objs.Count();
.Take(request.limit).ToListAsync();
result.count = await objs.CountAsync();
return result;
}
@@ -45,20 +55,74 @@ namespace OpenAuth.App
{
Repository.Add(obj);
}
public void Update(SysMessage obj)
/// <summary>
/// 发送指定消息给用户
/// </summary>
/// <param name="user"></param>
/// <param name="message"></param>
public void SendMsgTo(string userId, string message)
{
UnitWork.Update<SysMessage>(u => u.Id == obj.Id, u => new SysMessage
User user = null;
if (userId == Guid.Empty.ToString())
{
//todo:要修改的字段赋值
user = new User
{
Name = Define.SYSTEM_USERNAME,
Id = userId
};
}
else
{
user = UnitWork.FirstOrDefault<User>(u => u.Id == userId);
}
if (user == null)
{
_logger.LogError($"未能找到用户{userId},不能给该用户发送消息");
return;
}
Repository.Add(new SysMessage
{
ToId = user.Id,
ToName = user.Name,
TypeName = "系统消息",
TypeId ="SYS_MSG",
FromId = Guid.Empty.ToString(),
FromName = "系统管理员",
Content = message,
CreateTime = DateTime.Now
});
}
/// <summary>
/// 消息变为已读
/// </summary>
/// <param name="msgid"></param>
public void Read(ReadMsgReq req)
{
UnitWork.Update<SysMessage>(u => u.Id == req.Id, u => new SysMessage
{
ToStatus = 1
});
}
/// <summary>
/// 消息采用逻辑删除
/// </summary>
/// <param name="ids"></param>
public void Del(string[] ids)
{
UnitWork.Update<SysMessage>(u => ids.Contains(u.Id), u => new SysMessage
{
ToStatus = -1 //逻辑删除
});
}
public SysMessageApp(IUnitWork<OpenAuthDBContext> unitWork, IRepository<SysMessage,OpenAuthDBContext> repository,
RevelanceManagerApp app,IAuth auth) : base(unitWork, repository, auth)
RevelanceManagerApp app,IAuth auth, ILogger<SysMessageApp> logger) : base(unitWork, repository, auth)
{
_revelanceApp = app;
_logger = logger;
}
}
}

View File

@@ -40,7 +40,7 @@ namespace OpenAuth.App.Test
{
Console.WriteLine($"开始异步测试");
AddOrUpdate();
var result =AddOrUpdate();
Console.WriteLine("异步测试结束");

View File

@@ -1,4 +1,4 @@
using System;
using System;
using System.IO;
using System.Linq;
using Autofac.Extensions.DependencyInjection;
@@ -27,7 +27,11 @@ namespace OpenAuth.App.Test
serviceCollection.AddOptions();
//读取OpenAuth.WebApi的配置文件用于单元测试
var path = AppContext.BaseDirectory;
int pos = path.LastIndexOf("OpenAuth.");
int pos = path.IndexOf("OpenAuth.App");
if (pos == -1) //如果测试入口是OpenAuth.WebApi
{
pos = path.IndexOf("OpenAuth.WebApi");
}
var basepath = Path.Combine(path.Substring(0,pos) ,"OpenAuth.WebApi");
IConfiguration config = new ConfigurationBuilder()
.SetBasePath(basepath)

View File

@@ -16,7 +16,7 @@ namespace OpenAuth.App.Test
var app = _autofacServiceProvider.GetService<DbExtension>();
var result = app.GetProperties("Category");
var result = app.GetTableColumnsFromDb("Category");
Console.WriteLine(JsonHelper.Instance.Serialize(result));
}

View File

@@ -7,6 +7,7 @@ using Microsoft.Extensions.DependencyInjection;
using Moq;
using OpenAuth.App.Request;
using OpenAuth.App.SSO;
using OpenAuth.Repository.Domain;
namespace OpenAuth.App.Test
{
@@ -41,5 +42,32 @@ namespace OpenAuth.App.Test
});
Console.WriteLine(JsonHelper.Instance.Serialize(result));
}
[Test]
public void Update()
{
var app = _autofacServiceProvider.GetService<FormApp>();
app.Update(new Form()
{
Id = "5815ff07-b457-47a2-8a19-c9080c3575d8",
ContentData = "{\"list\":[{\"type\":\"input\",\"icon\":\"icon-input\",\"name\":\"单行文本\",\"options\":{\"width\":\"100%\",\"defaultValue\":\"\",\"required\":false,\"dataType\":\"string\",\"pattern\":\"\",\"placeholder\":\"\",\"disabled\":false,\"remoteFunc\":\"func_1642332330000_92043\"},\"key\":\"1642332330000_92043\",\"model\":\"Name\",\"rules\":[{\"type\":\"string\",\"message\":\"Name格式不正确\"}]},{\"type\":\"textarea\",\"icon\":\"icon-diy-com-textarea\",\"name\":\"多行文本\",\"options\":{\"width\":\"100%\",\"defaultValue\":\"\",\"required\":false,\"disabled\":false,\"pattern\":\"\",\"placeholder\":\"\",\"remoteFunc\":\"func_1642332331000_66846\"},\"key\":\"1642332331000_66846\",\"model\":\"Price\",\"rules\":[]},{\"type\":\"number\",\"icon\":\"icon-number\",\"name\":\"计数器\",\"options\":{\"width\":\"\",\"required\":false,\"defaultValue\":0,\"min\":0,\"max\":0,\"step\":1,\"disabled\":false,\"controlsPosition\":\"\",\"remoteFunc\":\"func_1642332332000_75553\"},\"key\":\"1642332332000_75553\",\"model\":\"number_1642332332000_75553\",\"rules\":[]},{\"type\":\"text\",\"icon\":\"icon-wenzishezhi-\",\"name\":\"文字\",\"options\":{\"defaultValue\":\"This is a text\",\"customClass\":\"\",\"remoteFunc\":\"func_1642332335000_15010\"},\"key\":\"1642332335000_15010\",\"model\":\"text_1642332335000_15010\",\"rules\":[]},{\"type\":\"textarea\",\"icon\":\"icon-diy-com-textarea\",\"name\":\"多行文本\",\"options\":{\"width\":\"100%\",\"defaultValue\":\"\",\"required\":false,\"disabled\":false,\"pattern\":\"\",\"placeholder\":\"\",\"remoteFunc\":\"func_1642332496000_1253\"},\"key\":\"1642332496000_1253\",\"model\":\"textarea_1642332496000_1253\",\"rules\":[]}],\"config\":{\"labelWidth\":100,\"labelPosition\":\"right\",\"size\":\"small\"}}",
DbName = "stock",
OrgId = "08f41bf6-4388-4b1e-bd3e-2ff538b44b1b",
FrmType = 2
});
}
[Test]
public void Add()
{
var app = _autofacServiceProvider.GetService<FormApp>();
app.Add(new Form()
{
ContentData = "{\"list\":[{\"type\":\"input\",\"icon\":\"icon-input\",\"name\":\"单行文本\",\"options\":{\"width\":\"100%\",\"defaultValue\":\"\",\"required\":false,\"dataType\":\"string\",\"pattern\":\"\",\"placeholder\":\"\",\"disabled\":false,\"remoteFunc\":\"func_1642578757000_60891\"},\"key\":\"1642578757000_60891\",\"model\":\"input_1642578757000_60891\",\"rules\":[{\"type\":\"string\",\"message\":\"input_1642578757000_60891格式不正确\"}]}],\"config\":{\"labelWidth\":100,\"labelPosition\":\"right\",\"size\":\"small\"}}",
DbName = "stock2",
OrgId = "08f41bf6-4388-4b1e-bd3e-2ff538b44b1b",
FrmType = 2
});
}
}
}

View File

@@ -35,7 +35,7 @@ namespace OpenAuth.App.Test
Console.WriteLine(orgname);
var app = _autofacServiceProvider.GetService<OrgManagerApp>();
var id = app.Add(new Org
var id = app.Add(new SysOrg
{
Name = orgname,
ParentId = ""
@@ -63,7 +63,7 @@ namespace OpenAuth.App.Test
Console.WriteLine(orgname);
var app = _autofacServiceProvider.GetService<OrgManagerApp>();
var id = app.Update(new Org
var id = app.Update(new SysOrg
{
Id="543a9fcf-4770-4fd9-865f-030e562be238",
Name = orgname,

View File

@@ -5,6 +5,7 @@ using System.Threading.Tasks;
using Castle.Core.Internal;
using Infrastructure;
using Infrastructure.Extensions;
using Microsoft.EntityFrameworkCore;
using OpenAuth.App.Interface;
using OpenAuth.App.Request;
using OpenAuth.App.Response;
@@ -39,19 +40,18 @@ namespace OpenAuth.App
public async Task<TableData> Load(QueryUserListReq request)
{
var loginUser = _auth.GetCurrentUser();
IQueryable<User> query = UnitWork.Find<User>(null);
if (!string.IsNullOrEmpty(request.key))
{
query = UnitWork.Find<User>(u => u.Name.Contains(request.key) || u.Account.Contains(request.key));
}
var userOrgs = from user in query
join relevance in UnitWork.Find<Relevance>(u =>u.Key=="UserOrg")
join relevance in UnitWork.Find<Relevance>(u => u.Key == "UserOrg")
on user.Id equals relevance.FirstId into temp
from r in temp.DefaultIfEmpty()
join org in UnitWork.Find<Org>(null)
join org in UnitWork.Find<SysOrg>(null)
on r.SecondId equals org.Id into orgtmp
from o in orgtmp.DefaultIfEmpty()
select new
@@ -69,9 +69,9 @@ namespace OpenAuth.App
r.Key,
r.SecondId,
OrgId = o.Id,
OrgName= o.Name
OrgName = o.Name
};
//如果请求的orgId不为空
if (!string.IsNullOrEmpty(request.orgId))
{
@@ -93,7 +93,8 @@ namespace OpenAuth.App
var userViews = userOrgs.ToList().GroupBy(b => b.Account).Select(u =>new UserView
var userViews = (await userOrgs.ToListAsync()).GroupBy(b => b.Account)
.Select(u =>new UserView
{
Id = u.First().Id,
Account = u.Key,
@@ -109,13 +110,79 @@ namespace OpenAuth.App
return new TableData
{
count = userViews.Count(),
data = userViews.OrderBy(u => u.Name)
count =userViews.Count(),
data =userViews.OrderBy(u => u.Name)
.Skip((request.page - 1) * request.limit)
.Take(request.limit),
};
}
/// <summary>
/// 获取所有的用户
/// 为了控制权限通常只用于流程实例选择执行角色其他地方请使用Load
/// </summary>
public async Task<TableResp<UserView>> LoadAll(QueryUserListReq request)
{
IQueryable<User> query = UnitWork.Find<User>(null);
if (!string.IsNullOrEmpty(request.key))
{
query = UnitWork.Find<User>(u => u.Name.Contains(request.key) || u.Account.Contains(request.key));
}
var userOrgs = from user in query
join relevance in UnitWork.Find<Relevance>(u => u.Key == "UserOrg")
on user.Id equals relevance.FirstId into temp
from r in temp.DefaultIfEmpty()
join org in UnitWork.Find<SysOrg>(null)
on r.SecondId equals org.Id into orgtmp
from o in orgtmp.DefaultIfEmpty()
select new
{
user.Account,
user.Name,
user.Id,
user.Sex,
user.Status,
user.BizCode,
user.CreateId,
user.CreateTime,
user.TypeId,
user.TypeName,
r.Key,
r.SecondId,
OrgId = o.Id,
OrgName = o.Name
};
//如果请求的orgId不为空
if (!string.IsNullOrEmpty(request.orgId))
{
userOrgs = userOrgs.Where(u => u.Key == Define.USERORG && u.OrgId == request.orgId);
}
var userViews = (await userOrgs.ToListAsync()).GroupBy(b => b.Account).Select(u =>new UserView
{
Id = u.First().Id,
Account = u.Key,
Name = u.First().Name,
Sex = u.First().Sex,
Status = u.First().Status,
CreateTime = u.First().CreateTime,
CreateUser = u.First().CreateId,
OrganizationIds = string.Join(",", u.Select(x=>x.OrgId))
,Organizations = string.Join(",", u.Select(x=>x.OrgName))
});
return new TableResp<UserView>()
{
count = userViews.Count(),
data = userViews.OrderBy(u => u.Name)
.Skip((request.page - 1) * request.limit)
.Take(request.limit).ToList()
};
}
public void AddOrUpdate(UpdateUserReq request)
{
request.ValidationEntity(u => new {u.Account,u.Name, u.OrganizationIds});
@@ -201,6 +268,7 @@ namespace OpenAuth.App
});
}
/// <summary>
/// 获取指定角色包含的用户列表
/// </summary>
@@ -216,8 +284,8 @@ namespace OpenAuth.App
return new TableData
{
count = users.Count(),
data = users.Skip((request.page - 1) * request.limit).Take(request.limit)
count =await users.CountAsync(),
data =await users.Skip((request.page - 1) * request.limit).Take(request.limit).ToListAsync()
};
}
@@ -228,16 +296,16 @@ namespace OpenAuth.App
/// <returns></returns>
public async Task<TableData> LoadByOrg(QueryUserListByOrgReq request)
{
var users = from userRole in UnitWork.Find<Relevance>(u =>
var users = from userOrg in UnitWork.Find<Relevance>(u =>
u.SecondId == request.orgId && u.Key == Define.USERORG)
join user in UnitWork.Find<User>(null) on userRole.FirstId equals user.Id into temp
join user in UnitWork.Find<User>(null) on userOrg.FirstId equals user.Id into temp
from c in temp.Where(u =>u.Id != null)
select c;
return new TableData
{
count = users.Count(),
data = users.Skip((request.page - 1) * request.limit).Take(request.limit)
count =await users.CountAsync(),
data =await users.Skip((request.page - 1) * request.limit).Take(request.limit).ToListAsync()
};
}

View File

@@ -2,6 +2,7 @@
using System.Linq;
using System.Threading.Tasks;
using Infrastructure;
using Microsoft.EntityFrameworkCore;
using OpenAuth.App.Interface;
using OpenAuth.App.Request;
using OpenAuth.App.Response;
@@ -29,10 +30,11 @@ namespace OpenAuth.App
throw new CommonException("登录已过期", Define.INVALID_TOKEN);
}
//todo:普通账号如何分配明细的字段????先写死😰
var properties = _dbExtension.GetProperties("WmsInboundOrderDtbl");
var properties = loginContext.GetTableColumns("WmsInboundOrderDtbl");
if (properties == null || properties.Count == 0)
{
throw new Exception("请在代码生成界面配置WmsInboundOrderDtbl表的字段属性");
}
var result = new TableData();
var objs = UnitWork.Find<WmsInboundOrderDtbl>(null);
if (!string.IsNullOrEmpty(request.InboundOrderId))
@@ -45,12 +47,12 @@ namespace OpenAuth.App
objs = objs.Where(u => u.GoodsId.Contains(request.key));
}
var propertyStr = string.Join(',', properties.Select(u => u.Key));
result.columnHeaders = properties;
var propertyStr = string.Join(',', properties.Select(u => u.ColumnName));
result.columnFields = properties;
result.data = objs.OrderBy(u => u.Id)
.Skip((request.page - 1) * request.limit)
.Take(request.limit).Select($"new ({propertyStr})");
result.count = objs.Count();
result.count = await objs.CountAsync();
return result;
}

View File

@@ -2,6 +2,7 @@
using System.Linq;
using System.Threading.Tasks;
using Infrastructure;
using Microsoft.EntityFrameworkCore;
using OpenAuth.App.Interface;
using OpenAuth.App.Request;
using OpenAuth.App.Response;
@@ -28,27 +29,27 @@ namespace OpenAuth.App
throw new CommonException("登录已过期", Define.INVALID_TOKEN);
}
var properties = loginContext.GetProperties("WmsInboundOrderTbl");
if (properties == null || properties.Count == 0)
var columns = loginContext.GetTableColumns("WmsInboundOrderTbl");
if (columns == null || columns.Count == 0)
{
throw new Exception("当前登录用户没有访问该模块字段的权限,请联系管理员配置");
throw new Exception("请在代码生成界面配置WmsInboundOrderTbl表的字段属性");
}
var result = new TableData();
result.columnFields = columns;
var objs = GetDataPrivilege("u");
if (!string.IsNullOrEmpty(request.key))
{
objs = objs.Where(u => u.Id.Contains(request.key));
}
var propertyStr = string.Join(',', properties.Select(u => u.Key));
result.columnHeaders = properties;
var propertyStr = string.Join(',', columns.Select(u => u.ColumnName));
result.data = objs.OrderBy(u => u.Id)
.Skip((request.page - 1) * request.limit)
.Take(request.limit).Select($"new ({propertyStr})");
result.count = objs.Count();
result.count = await objs.CountAsync();
return result;
}

View File

@@ -43,7 +43,7 @@ namespace OpenAuth.IdentityServer
var host = "http://localhost";
if (isProduction)
{
host = "http://demo.openauth.me"; //切换为自己的服务器信息
host = "http://demo.openauth.net.cn"; //切换为自己的服务器信息
}
return new[]
{

View File

@@ -3,6 +3,10 @@
<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<NoWarn>1701;1702;1591;1573;1572;1570</NoWarn>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="IdentityServer4" Version="3.0.1" />

View File

@@ -27,7 +27,7 @@ namespace OpenAuth.IdentityServer.Quickstart
// }
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy
var csp = "default-src 'self'; object-src 'none'; frame-ancestors 'none'; sandbox allow-forms allow-same-origin allow-scripts; base-uri 'self';";
// var csp = "default-src 'self'; object-src 'none'; frame-ancestors 'none'; sandbox allow-forms allow-same-origin allow-scripts; base-uri 'self';";
// also consider adding upgrade-insecure-requests once you have HTTPS in place for production
//csp += "upgrade-insecure-requests;";
// also an example if you need client images to be displayed from twitter
@@ -45,7 +45,7 @@ namespace OpenAuth.IdentityServer.Quickstart
// }
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy
var referrer_policy = "no-referrer";
// var referrer_policy = "no-referrer";
// if (!context.HttpContext.Response.Headers.ContainsKey("Referrer-Policy"))
// {
// context.HttpContext.Response.Headers.Add("Referrer-Policy", referrer_policy);

View File

@@ -2,6 +2,7 @@
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
using System;
using System.Linq;
using Autofac;
using Infrastructure;
@@ -49,8 +50,8 @@ namespace OpenAuth.IdentityServer
// {
// origins = new []
// {
// "http://demo.openauth.me:1803",
// "http://demo.openauth.me:52789"
// "http://demo.openauth.net.cn:1803",
// "http://demo.openauth.net.cn:52789"
// };
// }
// services.AddCors(option=>option.AddPolicy("cors", policy =>
@@ -83,12 +84,12 @@ namespace OpenAuth.IdentityServer
else if(dbType == Define.DBTYPE_MYSQL) //mysql
{
services.AddDbContext<OpenAuthDBContext>(options =>
options.UseMySql(Configuration.GetConnectionString("OpenAuthDBContext")));
options.UseMySql(Configuration.GetConnectionString("OpenAuthDBContext"),new MySqlServerVersion(new Version(8, 0, 11))));
}
else //oracle
{
services.AddDbContext<OpenAuthDBContext>(options =>
options.UseOracle(Configuration.GetConnectionString("OpenAuthDBContext")));
options.UseOracle(Configuration.GetConnectionString("OpenAuthDBContext"), o=>o.UseOracleSQLCompatibility("11")));
}
}

View File

@@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Infrastructure;
using Microsoft.AspNetCore.Mvc;
@@ -87,8 +88,18 @@ namespace OpenAuth.Mvc.Controllers
/// <returns></returns>
public string AllTypes()
{
var data = _categoryTypeApp.AllTypes();
return JsonHelper.Instance.Serialize(data);
var resp = new Response<List<CategoryTypeResp>>();
try
{
resp.Result = _categoryTypeApp.AllTypes().MapToList<CategoryTypeResp>();
}
catch (Exception e)
{
resp.Code = 500;
resp.Message = e.Message;
}
return JsonHelper.Instance.Serialize(resp);
}
}

View File

@@ -7,7 +7,7 @@
// Last Modified On : 07-24-2018
// ***********************************************************************
// <copyright file="ErrorController.cs" company="OpenAuth.Mvc">
// Copyright (c) http://www.openauth.me. All rights reserved.
// Copyright (c) http://www.openauth.net.cn. All rights reserved.
// </copyright>
// <summary>
// 异常处理页面

View File

@@ -34,11 +34,11 @@ namespace OpenAuth.Mvc.Controllers
//添加组织提交
[HttpPost]
public string Add(Org org)
public string Add(SysOrg sysOrg)
{
try
{
_orgApp.Add(org);
_orgApp.Add(sysOrg);
}
catch (Exception ex)
{
@@ -50,11 +50,11 @@ namespace OpenAuth.Mvc.Controllers
//编辑
[HttpPost]
public string Update(Org org)
public string Update(SysOrg sysOrg)
{
try
{
_orgApp.Update(org);
_orgApp.Update(sysOrg);
}
catch (Exception ex)
{

View File

@@ -40,22 +40,28 @@ namespace OpenAuth.Mvc.Controllers
}
return JsonHelper.Instance.Serialize(Result);
}
//添加或修改
/// <summary>
/// 阅读消息(即消息置为已读)
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
[HttpPost]
public string Update(SysMessage obj)
public string Read(ReadMsgReq obj)
{
var result = new Response();
try
{
_app.Update(obj);
_app.Read(obj);
}
catch (Exception ex)
{
Result.Code = 500;
Result.Message = ex.Message;
result.Code = 500;
result.Message = ex.InnerException?.Message ?? ex.Message;
}
return JsonHelper.Instance.Serialize(Result);
return JsonHelper.Instance.Serialize(result);
}
/// <summary>

View File

@@ -7,7 +7,7 @@
// Last Modified On : 07-04-2018
// ***********************************************************************
// <copyright file="UserSessionController.cs" company="OpenAuth.Mvc">
// Copyright (c) http://www.openauth.me. All rights reserved.
// Copyright (c) http://www.openauth.net.cn. All rights reserved.
// </copyright>
// <summary>
// 获取登录用户的全部信息
@@ -20,6 +20,7 @@ using System.Collections.Generic;
using System.Linq;
using Infrastructure;
using Infrastructure.Helpers;
using Microsoft.EntityFrameworkCore.Metadata.Internal;
using OpenAuth.App;
using OpenAuth.App.Interface;
using OpenAuth.App.Response;
@@ -117,7 +118,7 @@ namespace OpenAuth.Mvc.Controllers
/// </summary>
public string GetOrgs()
{
var resp = new Response<List<Org>>();
var resp = new Response<List<SysOrg>>();
try
{
resp.Result = _authStrategyContext.Orgs;
@@ -139,7 +140,7 @@ namespace OpenAuth.Mvc.Controllers
{
try
{
var list = _authStrategyContext.GetProperties(moduleCode);
var list = _authStrategyContext.GetTableColumns(moduleCode);
return JsonHelper.Instance.Serialize(new TableData
{
data = list,

View File

@@ -5,6 +5,10 @@
<UseRazorBuildServer>false</UseRazorBuildServer>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<NoWarn>1701;1702;1591;1573;1572;1570</NoWarn>
</PropertyGroup>
<ItemGroup>
<Compile Remove="Views\Base\**" />
<Content Remove="Views\Base\**" />
@@ -16,7 +20,7 @@
<PackageReference Include="Autofac.Extensions.DependencyInjection" Version="6.0.0" />
<PackageReference Include="IdentityServer4.AccessTokenValidation" Version="3.0.1" />
<PackageReference Include="Microsoft.Extensions.Logging.Log4Net.AspNetCore" Version="3.1.0" />
<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="2.1.0" />
<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="3.1.0" />
</ItemGroup>
<ItemGroup>

View File

@@ -7,7 +7,7 @@
// Last Modified On : 07-02-2018
// ***********************************************************************
// <copyright file="UserSessionControllerTest.cs" company="OpenAuth.Mvc">
// Copyright (c) http://www.openauth.me. All rights reserved.
// Copyright (c) http://www.openauth.net.cn. All rights reserved.
// </copyright>
// <summary>
// 测试加载用户菜单

View File

@@ -24,7 +24,7 @@
<div class="layui-form-item">
<label class="layui-form-label">类型标识</label>
<div class="layui-input-block">
<input type="text" name="Id" v-model="tmp.Id" required lay-verify="required"
<input type="text" name="Id" v-model="tmp.Id"
placeholder="请输入类型标识" autocomplete="off" class="layui-input">
</div>
</div>
@@ -63,4 +63,4 @@
</div>
<script type="text/javascript" src="/layui/layui.js"></script>
<script type="text/javascript" src="/userJs/categories.js?v=1.5.1"></script>
<script type="text/javascript" src="/userJs/categories.js?v=3.2"></script>

View File

@@ -1,7 +1,8 @@
@section header
{
<link rel="stylesheet" href="/css/main.css" media="all" />
<link rel="stylesheet" href="/css/main.css" media="all"/>
}
<div class="panel_box row">
<div class="panel col">
<a href="javascript:;" data-url="/orgmanager/index">
@@ -78,8 +79,9 @@
</p>
<p>
<a href="https://gitee.com/yubaolee/OpenAuth.Core" target="_blank" class="layui-btn layui-btn-xs layui-btn-danger">项目地址</a>
<a class="layui-btn layui-btn-xs" target="_blank" href="http://doc.openauth.me">在线文档</a>
<a class="layui-btn layui-btn-xs layui-btn-danger" target="_blank" href="http://demo.openauth.me:1803">企业版入口</a>
<a class="layui-btn layui-btn-xs" target="_blank" href="http://doc.openauth.net.cn">在线文档</a>
<a class="layui-btn layui-btn-xs layui-btn-danger" target="_blank" href="http://demo.openauth.net.cn:1803">企业版/高级版入口</a>
<a class="layui-btn layui-btn-xs layui-btn-danger" target="_blank" href="http://demo.openauth.net.cn:1804">企业版H5入口请使用移动模式或者直接手机查看</a>
<span style="color: #f00;">注【本框架遵循LGPL开源协议企业单位如商用请联系作者授权谢谢】</span>
</p>
<p>技术交流QQ群484498493【已满】 &nbsp; &nbsp; 626433139【已满】 &nbsp;&nbsp; 566344079</p>
@@ -87,14 +89,33 @@
<div class="row">
<div class="sysNotice col">
<blockquote class="layui-elem-quote title">更新日志</blockquote>
<div class="layui-elem-quote layui-quote-nm">
<div class="layui-elem-quote layui-quote-nm">
<h3># 3.2</h3>
<p>* 【新增】增加在swagger界面查看接口调用时间及SQL执行时间</p>
<p>
* 【新增】支持同时配置多个类型数据库的连接字符串:
详见:<a href="http://doc.openauth.net.cn/core/multidbs.html" target="_blank" class="layui-btn layui-btn-xs layui-btn-danger">http://doc.openauth.net.cn/core/multidbs.html</a>
</p>
<p>* 【新增】增加swagger接口分组</p>
<p>* 【新增】增加流程召回功能</p>
<p>* 【新增】增加运行时选定执行人、执行角色功能</p>
<p>* 【新增】增加Redis缓存支持</p>
<p>* 【新增】新增int类型数据库主键并支持雪花算法自动生成</p>
<p>* 【新增】新增附件管理,上传图片支持生成缩略图</p>
</div>
<div class="layui-elem-quote layui-quote-nm">
<h3># 2.0</h3>
<p>* 【新增】框架升级至.net core sdk 3.1.100</p>
<p>* 【新增】增加<a href="javascript:;" data-url="/usermanager/profile"><cite>个人中心</cite></a>页面,可修改个人信息及切换当前默认部门</p>
<p>* 【优化】升级layui至2.5.6</p>
<p>
* 【新增】增加
<a href="javascript:;" data-url="/usermanager/profile">
<cite>个人中心</cite>
</a>页面,可修改个人信息及切换当前默认部门
</p>
<p>* 【优化】升级layui至2.5.6</p>
<p>* 【优化】可以灵活配置用户可访问的机构数据权限</p>
</div>
<div class="layui-elem-quote layui-quote-nm">
</div>
<div class="layui-elem-quote layui-quote-nm">
<h3># 1.6</h3>
<p>* 【新增】日志及用户消息板块</p>
<p>* 【新增】企业版代码生成器,可以快速生成带有头/明细结构的页面</p>
@@ -102,16 +123,16 @@
<p>* 【新增】完整的字段权限控制可以控制字段可见及API是否返回字段值</p>
<p>* 【优化】启用数据字典功能</p>
<p>* 【优化】优化导航排序、支持多级导航</p>
</div>
</div>
<div class="layui-elem-quote layui-quote-nm">
<h3># 1.5 - 2019.7</h3>
<p>* 【优化】升级layui至2.5.4</p>
<p>* 【优化】流程处理页面展示</p>
<p>* 【优化】流程支持角色审批</p>
<p>* 【新增】集成IdentityServer4实现基于OAuth2的登录体系</p>
<p>* 【新增】建立三方对接规范,已有系统可以无缝对接流程引擎,请参考官方<a href="http://doc.openauth.me/thirdparty" target="_top">对接说明</a></p>
<p>* 【新增】建立三方对接规范,已有系统可以无缝对接流程引擎,请参考官方<a href="http://doc.openauth.net.cn/thirdparty" target="_top">对接说明</a></p>
</div>
<div class="layui-elem-quote layui-quote-nm">
<h3># 1.4 - 2019.3</h3>
<p>* 【优化】升级layui至2.4.5</p>
@@ -133,34 +154,34 @@
<col>
</colgroup>
<tbody>
<tr>
<td>当前版本</td>
<td class="version"></td>
</tr>
<tr>
<td>开发作者</td>
<td class="author"></td>
</tr>
<tr>
<td>网站首页</td>
<td class="homePage"></td>
</tr>
<tr>
<td>服务器环境</td>
<td class="server"></td>
</tr>
<tr>
<td>数据库版本</td>
<td class="dataBase"></td>
</tr>
<tr>
<td>最大上传限制</td>
<td class="maxUpload"></td>
</tr>
<tr>
<td>当前用户权限</td>
<td class="userRights"></td>
</tr>
<tr>
<td>当前版本</td>
<td class="version"></td>
</tr>
<tr>
<td>开发作者</td>
<td class="author"></td>
</tr>
<tr>
<td>网站首页</td>
<td class="homePage"></td>
</tr>
<tr>
<td>服务器环境</td>
<td class="server"></td>
</tr>
<tr>
<td>数据库版本</td>
<td class="dataBase"></td>
</tr>
<tr>
<td>最大上传限制</td>
<td class="maxUpload"></td>
</tr>
<tr>
<td>当前用户权限</td>
<td class="userRights"></td>
</tr>
</tbody>
</table>
@@ -168,4 +189,4 @@
</div>
<script type="text/javascript" src="/layui/layui.js"></script>
<script type="text/javascript" src="/userJs/main.js?v=2.0.0"></script>
<script type="text/javascript" src="/userJs/main.js?v=3.2.0"></script>

View File

@@ -31,8 +31,8 @@
<thead>
<tr>
<th lay-data="{checkbox:true, fixed: true}"></th>
<th lay-data="{field:'Description', width:150}">字段描述</th>
<th lay-data="{field:'Key', width:150}">字段代码</th>
<th lay-data="{field:'Comment', width:150}">字段描述</th>
<th lay-data="{field:'ColumnName', width:150}">字段代码</th>
</tr>
</thead>
</table>
@@ -41,4 +41,4 @@
</div>
<script type="text/javascript" src="/layui/layui.js"></script>
<script type="text/javascript" src="/userJs/assignModule.js?v=2.1"></script>
<script type="text/javascript" src="/userJs/assignModule.js?v=3.3"></script>

View File

@@ -68,6 +68,6 @@
</div>
<script type="text/javascript" src="/layui/layui.js"></script>
<script type="text/javascript" src="/userJs/resources.js?v=1.5.1"></script>
<script type="text/javascript" src="/userJs/resources.js?v=3.2.1"></script>

View File

@@ -28,6 +28,6 @@
</div>
<script type="text/javascript" src="/layui/layui.js"></script>
<script type="text/javascript" src="/userJs/sysmessages.js"></script>
<script type="text/javascript" src="/userJs/sysmessages.js?v=3.2.1"></script>

View File

@@ -147,6 +147,6 @@
</div>
<script type="text/javascript" src="/layui/layui.js"></script>
<script type="text/javascript" src="/userJs/wmsinboundordertbls.js?v2.0.0"></script>
<script type="text/javascript" src="/userJs/wmsinboundordertbls.js?v3.2.1"></script>

View File

@@ -10,7 +10,7 @@
"OpenAuthDBContext": "server=127.0.0.1;user id=root;database=openauthdb;password=000000" //my sql
},
"AppSetting": {
"IdentityServerUrl": "http://demo.openauth.me:12796", //IdentityServer服务器地址。如果为空则不启用OAuth认证
"IdentityServerUrl": "http://demo.openauth.net.cn:12796", //IdentityServer服务器地址。如果为空则不启用OAuth认证
// "IdentityServerUrl": "", //IdentityServer服务器地址。如果为空则不启用OAuth认证
"SSOPassport": "http://localhost:52789",
"Version": "demo",

View File

@@ -100,7 +100,7 @@ layui.config({
//循环所有数据找出对应关系设置checkbox选中状态
for (var i = 0; i < res.data.length; i++) {
for (var j = 0; j < props.Result.length; j++) {
if (res.data[i].Key != props.Result[j]) continue;
if (res.data[i].ColumnName != props.Result[j]) continue;
//这里才是真正的有效勾选
res.data[i]["LAY_CHECKED"] = true;

View File

@@ -13,11 +13,11 @@ layui.config({
$.getJSON('/Categories/All',
{ page: 1, limit: 1 },
function(data) {
var columns = data.columnHeaders.filter(u =>u.Browsable ===true).map(function(e) {
return {
field: e.Key,
title: e.Description
};
var columns = data.columnFields.filter(u => u.IsList ===true).map(function (e) {
return {
field: e.ColumnName,
title: e.Comment
};
});
columns.unshift({
type: 'checkbox',
@@ -78,6 +78,11 @@ layui.config({
},
mounted(){
form.render();
var _this = this;
layui.droptree("/Categories/AllTypes", "#TypeName", "#TypeId", false,function (ids, names) {
_this.tmp.TypeName = ids;
_this.tmp.TypeId = names;
});
}
});
}else{

View File

@@ -15,12 +15,12 @@
$.getJSON('/DataPrivilegeRules/Load',
{ page: 1, limit: 1 },
function (data) {
var columns = data.columnHeaders.filter(u =>u.Browsable ===true).map(function (e) {
return {
field: e.Key,
title: e.Description
};
});
var columns = data.columnFields.filter(u => u.IsList ===true).map(function (e) {
return {
field: e.ColumnName,
title: e.Comment
};
});
columns.unshift({
type: 'checkbox',
fixed: 'left'

View File

@@ -95,7 +95,7 @@
if (data.Result.FrmType == 0) {
$("#frmPreview").html(data.Result.Html);
} else {
$("#frmPreview").html('复杂表单暂时只能在<a href="http://demo.openauth.me:1803">企业版</a>查看,开源版预计会在以后的开源版本中发布');
$("#frmPreview").html('复杂表单暂时只能在<a href="http://demo.openauth.net.cn:1803">企业版</a>查看,开源版预计会在以后的开源版本中发布');
}
}
});

View File

@@ -47,7 +47,7 @@
if (data.Result.FrmType == 0) {
_this.frmPreview = data.Result.Html
} else {
_this.frmPreview = '复杂表单暂时只能在<a href="http://demo.openauth.me:1803">企业版</a>查看,开源版预计会在以后的开源版本中发布'
_this.frmPreview = '复杂表单暂时只能在<a href="http://demo.openauth.net.cn:1803">企业版</a>查看,开源版预计会在以后的开源版本中发布'
}
});
}

View File

@@ -58,7 +58,7 @@
if (data.Result.FrmType == 0) {
$("#frmPreview").html(data.Result.Html);
} else {
$("#frmPreview").html("复杂表单暂时只能在<a href='http://demo.openauth.me:1803'>企业版</a>查看,开源版预计会在以后的开源版本中发布");
$("#frmPreview").html("复杂表单暂时只能在<a href='http://demo.openauth.net.cn:1803'>企业版</a>查看,开源版预计会在以后的开源版本中发布");
}
});
});

View File

@@ -51,7 +51,7 @@
if (data.Result.FrmType == 0) {
$("#frmPreview").html(data.Result.FrmPreviewHtml);
} else {
$("#frmPreview").html("复杂表单暂时只能在<a href='http://demo.openauth.me:1803'>企业版</a>查看,开源版预计会在以后的开源版本中发布");
$("#frmPreview").html("复杂表单暂时只能在<a href='http://demo.openauth.net.cn:1803'>企业版</a>查看,开源版预计会在以后的开源版本中发布");
}
flowDesignPanel.reinitSize($(window).width() - 30, $(window).height() - 120);

View File

@@ -278,7 +278,7 @@
if (obj.FrmType === 0) {
ue.setContent(obj.Content);
} else {
ue.setContent("复杂表单暂时只能在<a href='http://demo.openauth.me:1803'>企业版</a>查看,开源版预计会在以后的开源版本中发布");
ue.setContent("复杂表单暂时只能在<a href='http://demo.openauth.net.cn:1803'>企业版</a>查看,开源版预计会在以后的开源版本中发布");
}
}, 500);
});

View File

@@ -59,7 +59,7 @@ layui.config({
})
//系统基本参数
$(".version").text("v2.0"); //当前版本
$(".version").text("v3.2"); //当前版本
$(".author").text("yubaolee"); //开发作者
$(".homePage").text("/Home/Index"); //网站首页
$(".server").text("centos docker"); //服务器环境

Some files were not shown because too many files have changed in this diff Show More