mirror of
https://gitee.com/dotnetchina/OpenAuth.Net.git
synced 2026-07-28 22:27:59 +08:00
Compare commits
37 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a3a8bd509e | ||
|
|
9412ee4a89 | ||
|
|
c19802eb55 | ||
|
|
21c1f67d63 | ||
|
|
502ab43f26 | ||
|
|
f4a8e93de9 | ||
|
|
44fd165dec | ||
|
|
ac0dfef321 | ||
|
|
3f077f5d80 | ||
|
|
73b2e2aa08 | ||
|
|
99daa8752f | ||
|
|
636624a872 | ||
|
|
d0253a7fc0 | ||
|
|
69d0587c83 | ||
|
|
41c1596679 | ||
|
|
c8caf9dee3 | ||
|
|
5c060f8ed9 | ||
|
|
1c699eda26 | ||
|
|
9fd0405721 | ||
|
|
3a70bf8e43 | ||
|
|
8fb9297145 | ||
|
|
4f37560dc8 | ||
|
|
3c20deb3df | ||
|
|
4d7af5bedf | ||
|
|
8397786566 | ||
|
|
c7acca904a | ||
|
|
154583889a | ||
|
|
05f7833353 | ||
|
|
95fe5259c7 | ||
|
|
10e255d0b3 | ||
|
|
38a62595ba | ||
|
|
f9ea57a06c | ||
|
|
7893fe3024 | ||
|
|
b94fba7c19 | ||
|
|
a84c8c57ad | ||
|
|
804ee3d9d8 | ||
|
|
8608ce78f5 |
@@ -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})");
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -4,7 +4,7 @@ namespace Infrastructure.Extensions.AutofacManager
|
||||
{
|
||||
/// <summary>
|
||||
/// 提供全局静态获取服务的能力。
|
||||
/// <para>例:AutofacContainerModule.GetService<IPathProvider>()</para>
|
||||
/// <para>例:AutofacContainerModule.GetService<IPathProvider>()</para>
|
||||
/// </summary>
|
||||
public class AutofacContainerModule
|
||||
{
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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<(bool, string, object)> 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<Func<entityt, object>> exp = x => 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<Func<entityt, object>> exp = x => 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<TSource>映射到List<TResult>或TSource映射到TResult
|
||||
/// 目前只支持Dictionary或实体类型
|
||||
/// </summary>
|
||||
/// <typeparam name="TSource"></typeparam>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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" />
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
//}
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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>
|
||||
// 用户权限策略工厂
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
//用户角色
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -11,9 +11,10 @@ namespace OpenAuth.App
|
||||
{
|
||||
/// <summary>
|
||||
/// 业务层基类,UnitWork用于事务操作,Repository用于普通的数据库操作
|
||||
/// <para>如用户管理:Class UserManagerApp:BaseApp<User></para>
|
||||
/// <para>如用户管理:Class UserManagerApp:BaseApp<User></para>
|
||||
/// </summary>
|
||||
/// <typeparam name="T"></typeparam>
|
||||
/// <typeparam name="TDbContext"></typeparam>
|
||||
public class BaseStringApp<T, TDbContext> :BaseApp<T,TDbContext> where T : StringEntity where TDbContext: DbContext
|
||||
{
|
||||
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
|
||||
14
OpenAuth.App/Base/IdRequest.cs
Normal file
14
OpenAuth.App/Base/IdRequest.cs
Normal 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; }
|
||||
}
|
||||
}
|
||||
@@ -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>();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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; }
|
||||
}
|
||||
}
|
||||
@@ -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; }
|
||||
}
|
||||
}
|
||||
29
OpenAuth.App/BuilderTable/Request/SyncStructureReq.cs
Normal file
29
OpenAuth.App/BuilderTable/Request/SyncStructureReq.cs
Normal 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; }
|
||||
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
10
OpenAuth.App/Category/Response/CategoryTypeResp.cs
Normal file
10
OpenAuth.App/Category/Response/CategoryTypeResp.cs
Normal file
@@ -0,0 +1,10 @@
|
||||
using OpenAuth.Repository.Domain;
|
||||
|
||||
namespace OpenAuth.App.Response
|
||||
{
|
||||
public class CategoryTypeResp : CategoryType
|
||||
{
|
||||
public string ParentId { get; set; }
|
||||
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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())
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -79,6 +79,11 @@
|
||||
/// 会签拒绝的个数
|
||||
/// </summary>
|
||||
public int? ConfluenceNo { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 可写的表单项ID
|
||||
/// </summary>
|
||||
public string[] CanWriteFormItemIds { get; set; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -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>
|
||||
// 一个正在运行中的流程实例
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -25,5 +25,11 @@ namespace OpenAuth.App.Request
|
||||
/// </summary>
|
||||
public string NodeRejectType { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 新的表单数据
|
||||
/// 如果该节点有可以修改的表单项时,会提交表单数据信息
|
||||
/// </summary>
|
||||
public string FrmData { get; set; }
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
114
OpenAuth.App/Form/DragForm.cs
Normal file
114
OpenAuth.App/Form/DragForm.cs
Normal 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 + "];";
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
25
OpenAuth.App/Form/FormFactory.cs
Normal file
25
OpenAuth.App/Form/FormFactory.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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+"];";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
7
OpenAuth.App/Form/IForm.cs
Normal file
7
OpenAuth.App/Form/IForm.cs
Normal file
@@ -0,0 +1,7 @@
|
||||
namespace OpenAuth.App
|
||||
{
|
||||
public interface IForm
|
||||
{
|
||||
string GetSql(Repository.Domain.Form form, string dbType);
|
||||
}
|
||||
}
|
||||
122
OpenAuth.App/Form/LeipiForm.cs
Normal file
122
OpenAuth.App/Form/LeipiForm.cs
Normal 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 + "];";
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
//补充其他需要更新的字段
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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()
|
||||
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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" />
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -176,10 +176,12 @@ namespace OpenAuth.App.SSO
|
||||
_cacheContext.Remove(token);
|
||||
return true;
|
||||
}
|
||||
catch (Exception ex)
|
||||
catch
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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>
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -2,6 +2,9 @@
|
||||
{
|
||||
public class QuerySysMessageListReq : PageReq
|
||||
{
|
||||
//todo:添加自己的请求字段
|
||||
/// <summary>
|
||||
/// 消息状态 0:未读;1:已读; 999:全部
|
||||
/// </summary>
|
||||
public int Status { get; set; }
|
||||
}
|
||||
}
|
||||
9
OpenAuth.App/SysMessage/Request/ReadMsgReq.cs
Normal file
9
OpenAuth.App/SysMessage/Request/ReadMsgReq.cs
Normal file
@@ -0,0 +1,9 @@
|
||||
namespace OpenAuth.App.Request
|
||||
{
|
||||
/// <summary>
|
||||
/// 阅读消息请求
|
||||
/// </summary>
|
||||
public class ReadMsgReq : IdRequest<string>
|
||||
{
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -40,7 +40,7 @@ namespace OpenAuth.App.Test
|
||||
{
|
||||
Console.WriteLine($"开始异步测试");
|
||||
|
||||
AddOrUpdate();
|
||||
var result =AddOrUpdate();
|
||||
|
||||
Console.WriteLine("异步测试结束");
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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()
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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[]
|
||||
{
|
||||
|
||||
@@ -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" />
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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")));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
// 异常处理页面
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
// 测试加载用户菜单
|
||||
|
||||
@@ -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>
|
||||
@@ -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【已满】 626433139【已满】 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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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{
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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>查看,开源版预计会在以后的开源版本中发布');
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
@@ -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>查看,开源版预计会在以后的开源版本中发布'
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -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>查看,开源版预计会在以后的开源版本中发布");
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
});
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user