mirror of
https://gitee.com/dotnetchina/OpenAuth.Net.git
synced 2025-07-17 19:37:45 +08:00
fix issue #I42IFB 获取Oracle结构异常
fix issue #I462OD JSON解析异常 增加主表ParentId,可以同时添加主、从表结构 可以动态控制复杂界面显示编辑权限,采用代码生成的表定义来控制
This commit is contained in:
parent
8397786566
commit
4d7af5bedf
@ -15,6 +15,7 @@
|
|||||||
// </summary>
|
// </summary>
|
||||||
// ***********************************************************************
|
// ***********************************************************************
|
||||||
|
|
||||||
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using Infrastructure;
|
using Infrastructure;
|
||||||
using OpenAuth.App.Response;
|
using OpenAuth.App.Response;
|
||||||
@ -62,12 +63,27 @@ namespace OpenAuth.App
|
|||||||
{
|
{
|
||||||
get { return _strategy.Orgs; }
|
get { return _strategy.Orgs; }
|
||||||
}
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// 获取角色可以访问的字段信息,只是单纯的获取数据库
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="moduleCode"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
[Obsolete("请使用GetTableColumns代替")]
|
||||||
public List<KeyDescription> GetProperties(string moduleCode)
|
public List<KeyDescription> GetProperties(string moduleCode)
|
||||||
{
|
{
|
||||||
return _strategy.GetProperties(moduleCode);
|
return _strategy.GetProperties(moduleCode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取角色可以访问的字段信息
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="moduleCode"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public List<BuilderTableColumn> GetTableColumns(string moduleCode)
|
||||||
|
{
|
||||||
|
return _strategy.GetTableColumns(moduleCode);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -141,6 +141,24 @@ namespace OpenAuth.App
|
|||||||
return allprops.Where(u => props.Contains(u.Key)).ToList();
|
return allprops.Where(u => props.Contains(u.Key)).ToList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<BuilderTableColumn> GetTableColumns(string moduleCode)
|
||||||
|
{
|
||||||
|
var allprops = UnitWork.Find<BuilderTableColumn>(u => u.TableName.ToLower() == moduleCode.ToLower());
|
||||||
|
|
||||||
|
//如果是系统模块,直接返回所有字段。防止开发者把模块配置成系统模块,还在外层调用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();
|
||||||
|
}
|
||||||
|
|
||||||
//用户角色
|
//用户角色
|
||||||
|
|
||||||
public NormalAuthStrategy(IUnitWork<OpenAuthDBContext> unitWork, IRepository<User,OpenAuthDBContext> repository, DbExtension dbExtension) : base(unitWork, repository,null)
|
public NormalAuthStrategy(IUnitWork<OpenAuthDBContext> unitWork, IRepository<User,OpenAuthDBContext> repository, DbExtension dbExtension) : base(unitWork, repository,null)
|
||||||
|
@ -97,6 +97,11 @@ namespace OpenAuth.App
|
|||||||
return _dbExtension.GetProperties(moduleCode);
|
return _dbExtension.GetProperties(moduleCode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<BuilderTableColumn> GetTableColumns(string moduleCode)
|
||||||
|
{
|
||||||
|
return UnitWork.Find<BuilderTableColumn>(u => u.TableName.ToLower() == moduleCode.ToLower()).ToList();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public SystemAuthStrategy(IUnitWork<OpenAuthDBContext> unitWork, IRepository<User,OpenAuthDBContext> repository, DbExtension dbExtension) : base(unitWork, repository, null)
|
public SystemAuthStrategy(IUnitWork<OpenAuthDBContext> unitWork, IRepository<User,OpenAuthDBContext> repository, DbExtension dbExtension) : base(unitWork, repository, null)
|
||||||
{
|
{
|
||||||
|
@ -12,8 +12,10 @@
|
|||||||
// <summary>layui datatable数据返回</summary>
|
// <summary>layui datatable数据返回</summary>
|
||||||
// ***********************************************************************
|
// ***********************************************************************
|
||||||
|
|
||||||
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using Infrastructure;
|
using Infrastructure;
|
||||||
|
using OpenAuth.Repository.Domain;
|
||||||
|
|
||||||
namespace OpenAuth.App.Response
|
namespace OpenAuth.App.Response
|
||||||
{
|
{
|
||||||
@ -37,10 +39,17 @@ namespace OpenAuth.App.Response
|
|||||||
public int count { get; set; }
|
public int count { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 返回的列表头信息
|
/// 返回的列表头信息(已过时,请使用columnFields代替)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[Obsolete("请使用ColumnFields以获得更丰富的配置信息")]
|
||||||
public List<KeyDescription> columnHeaders;
|
public List<KeyDescription> columnHeaders;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 返回的表格列定义
|
||||||
|
/// 该属性基于代码生成使用的列定义
|
||||||
|
/// </summary>
|
||||||
|
public List<BuilderTableColumn> columnFields;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 数据内容
|
/// 数据内容
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -51,6 +60,7 @@ namespace OpenAuth.App.Response
|
|||||||
code = 200;
|
code = 200;
|
||||||
msg = "加载成功";
|
msg = "加载成功";
|
||||||
columnHeaders = new List<KeyDescription>();
|
columnHeaders = new List<KeyDescription>();
|
||||||
|
columnFields = new List<BuilderTableColumn>();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -117,13 +117,32 @@ namespace OpenAuth.App
|
|||||||
throw new Exception("命名空间不能为空");
|
throw new Exception("命名空间不能为空");
|
||||||
}
|
}
|
||||||
|
|
||||||
var columns = _dbExtension.GetDbTableStructure(req.TableName);
|
var obj = AddTableAndColumns(req.MapTo<BuilderTable>());
|
||||||
if (!columns.Any())
|
|
||||||
|
//创建子表
|
||||||
|
if (!string.IsNullOrEmpty(req.DetailTableName))
|
||||||
{
|
{
|
||||||
throw new Exception($"未能找到{req.TableName}表结构定义");
|
AddTableAndColumns(new BuilderTable
|
||||||
|
{
|
||||||
|
TableName = req.DetailTableName,
|
||||||
|
ParentTableId = obj.Id,
|
||||||
|
Namespace = "OpenAuth.Repository.Domain",
|
||||||
|
ModuleName = req.DetailTableName,
|
||||||
|
Folder = req.Folder,
|
||||||
|
TypeId = req.TypeId,
|
||||||
|
TypeName = req.TypeName
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
var obj = req.MapTo<BuilderTable>();
|
UnitWork.Save();
|
||||||
|
return obj.Id;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 添加表结构及字段结构记录
|
||||||
|
/// </summary>
|
||||||
|
private BuilderTable AddTableAndColumns(BuilderTable obj)
|
||||||
|
{
|
||||||
if (string.IsNullOrEmpty(obj.ClassName)) obj.ClassName = obj.TableName;
|
if (string.IsNullOrEmpty(obj.ClassName)) obj.ClassName = obj.TableName;
|
||||||
if (string.IsNullOrEmpty(obj.ModuleCode)) obj.ModuleCode = obj.TableName;
|
if (string.IsNullOrEmpty(obj.ModuleCode)) obj.ModuleCode = obj.TableName;
|
||||||
|
|
||||||
@ -134,6 +153,11 @@ namespace OpenAuth.App
|
|||||||
obj.CreateUserName = user.Name;
|
obj.CreateUserName = user.Name;
|
||||||
UnitWork.Add(obj);
|
UnitWork.Add(obj);
|
||||||
|
|
||||||
|
var columns = _dbExtension.GetDbTableStructure(obj.TableName);
|
||||||
|
if (!columns.Any())
|
||||||
|
{
|
||||||
|
throw new Exception($"未能找到{obj.TableName}表结构定义");
|
||||||
|
}
|
||||||
foreach (var column in columns)
|
foreach (var column in columns)
|
||||||
{
|
{
|
||||||
var builderColumn = new BuilderTableColumn
|
var builderColumn = new BuilderTableColumn
|
||||||
@ -160,8 +184,7 @@ namespace OpenAuth.App
|
|||||||
UnitWork.Add(builderColumn);
|
UnitWork.Add(builderColumn);
|
||||||
}
|
}
|
||||||
|
|
||||||
UnitWork.Save();
|
return obj;
|
||||||
return obj.Id;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Update(AddOrUpdateBuilderTableReq obj)
|
public void Update(AddOrUpdateBuilderTableReq obj)
|
||||||
@ -181,6 +204,8 @@ namespace OpenAuth.App
|
|||||||
Options = obj.Options,
|
Options = obj.Options,
|
||||||
TypeId = obj.TypeId,
|
TypeId = obj.TypeId,
|
||||||
TypeName = obj.TypeName,
|
TypeName = obj.TypeName,
|
||||||
|
IsDynamicHeader = obj.IsDynamicHeader,
|
||||||
|
ForeignKey = obj.ForeignKey,
|
||||||
UpdateTime = DateTime.Now,
|
UpdateTime = DateTime.Now,
|
||||||
UpdateUserId = user.Id,
|
UpdateUserId = user.Id,
|
||||||
UpdateUserName = user.Name
|
UpdateUserName = user.Name
|
||||||
|
@ -74,5 +74,16 @@ namespace OpenAuth.App.Request
|
|||||||
/// 分类名称
|
/// 分类名称
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string TypeName { get; set; }
|
public string TypeName { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 是否动态加载表头信息
|
||||||
|
/// </summary>
|
||||||
|
public bool IsDynamicHeader { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 子表外键
|
||||||
|
/// </summary>
|
||||||
|
public string ForeignKey { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -114,17 +114,79 @@ namespace OpenAuth.App
|
|||||||
{
|
{
|
||||||
return GetMySqlStructure(tableName);
|
return GetMySqlStructure(tableName);
|
||||||
}
|
}
|
||||||
else
|
else if (dbtype == Define.DBTYPE_SQLSERVER)
|
||||||
{
|
{
|
||||||
return GetSqlServerStructure(tableName);
|
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.Query<SysTableColumn>().FromSqlRaw(sql);
|
||||||
|
var columnList = columns?.ToList();
|
||||||
|
if (columnList != null && columnList.Any())
|
||||||
|
{
|
||||||
|
return columnList;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return new List<SysTableColumn>();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 获取Mysql表结构信息
|
/// 获取Mysql表结构信息
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="tableName"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
private IList<SysTableColumn> GetMySqlStructure(string tableName)
|
private IList<SysTableColumn> GetMySqlStructure(string tableName)
|
||||||
{
|
{
|
||||||
var sql = $@"SELECT DISTINCT
|
var sql = $@"SELECT DISTINCT
|
||||||
|
@ -17,7 +17,15 @@ namespace OpenAuth.App.Response
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public string FrmHtml
|
public string FrmHtml
|
||||||
{
|
{
|
||||||
get { return FormUtil.GetHtml(this.FrmContentData, this.FrmContentParse, this.FrmData, "",this.CanWriteFormItemIds); }
|
get
|
||||||
|
{
|
||||||
|
if (this.FrmType != 0) //只有开原版动态表单才需要转换
|
||||||
|
{
|
||||||
|
return string.Empty;
|
||||||
|
}
|
||||||
|
|
||||||
|
return FormUtil.GetHtml(this.FrmContentData, this.FrmContentParse, this.FrmData, "",this.CanWriteFormItemIds);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
// ***********************************************************************
|
// ***********************************************************************
|
||||||
|
|
||||||
|
|
||||||
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using Infrastructure;
|
using Infrastructure;
|
||||||
using OpenAuth.App.Response;
|
using OpenAuth.App.Response;
|
||||||
@ -44,7 +45,15 @@ namespace OpenAuth.App
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="moduleCode"></param>
|
/// <param name="moduleCode"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
|
[Obsolete("请使用GetTableColumns代替")]
|
||||||
List<KeyDescription> GetProperties(string moduleCode);
|
List<KeyDescription> GetProperties(string moduleCode);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取角色可以访问的字段信息
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="moduleCode"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
List<BuilderTableColumn> GetTableColumns(string moduleCode);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -29,10 +29,11 @@ namespace OpenAuth.App
|
|||||||
throw new CommonException("登录已过期", Define.INVALID_TOKEN);
|
throw new CommonException("登录已过期", Define.INVALID_TOKEN);
|
||||||
}
|
}
|
||||||
|
|
||||||
//todo:普通账号如何分配明细的字段????先写死😰
|
var properties = loginContext.GetTableColumns("WmsInboundOrderDtbl");
|
||||||
|
if (properties == null || properties.Count == 0)
|
||||||
var properties = _dbExtension.GetProperties("WmsInboundOrderDtbl");
|
{
|
||||||
|
throw new Exception("请在代码生成界面配置WmsInboundOrderDtbl表的字段属性");
|
||||||
|
}
|
||||||
var result = new TableData();
|
var result = new TableData();
|
||||||
var objs = UnitWork.Find<WmsInboundOrderDtbl>(null);
|
var objs = UnitWork.Find<WmsInboundOrderDtbl>(null);
|
||||||
if (!string.IsNullOrEmpty(request.InboundOrderId))
|
if (!string.IsNullOrEmpty(request.InboundOrderId))
|
||||||
@ -45,8 +46,8 @@ namespace OpenAuth.App
|
|||||||
objs = objs.Where(u => u.GoodsId.Contains(request.key));
|
objs = objs.Where(u => u.GoodsId.Contains(request.key));
|
||||||
}
|
}
|
||||||
|
|
||||||
var propertyStr = string.Join(',', properties.Select(u => u.Key));
|
var propertyStr = string.Join(',', properties.Select(u => u.ColumnName));
|
||||||
result.columnHeaders = properties;
|
result.columnFields = properties;
|
||||||
result.data = objs.OrderBy(u => u.Id)
|
result.data = objs.OrderBy(u => u.Id)
|
||||||
.Skip((request.page - 1) * request.limit)
|
.Skip((request.page - 1) * request.limit)
|
||||||
.Take(request.limit).Select($"new ({propertyStr})");
|
.Take(request.limit).Select($"new ({propertyStr})");
|
||||||
|
@ -29,22 +29,28 @@ namespace OpenAuth.App
|
|||||||
}
|
}
|
||||||
|
|
||||||
var properties = loginContext.GetProperties("WmsInboundOrderTbl");
|
var properties = loginContext.GetProperties("WmsInboundOrderTbl");
|
||||||
|
|
||||||
if (properties == null || properties.Count == 0)
|
if (properties == null || properties.Count == 0)
|
||||||
{
|
{
|
||||||
throw new Exception("当前登录用户没有访问该模块字段的权限,请联系管理员配置");
|
throw new Exception("当前登录用户没有访问该模块字段的权限,请联系管理员配置");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var columns = loginContext.GetTableColumns("WmsInboundOrderTbl");
|
||||||
|
if (columns == null || columns.Count == 0)
|
||||||
|
{
|
||||||
|
throw new Exception("请在代码生成界面配置WmsInboundOrderTbl表的字段属性");
|
||||||
|
}
|
||||||
|
|
||||||
var result = new TableData();
|
var result = new TableData();
|
||||||
|
|
||||||
|
result.columnHeaders = properties;
|
||||||
|
result.columnFields = columns;
|
||||||
|
|
||||||
var objs = GetDataPrivilege("u");
|
var objs = GetDataPrivilege("u");
|
||||||
if (!string.IsNullOrEmpty(request.key))
|
if (!string.IsNullOrEmpty(request.key))
|
||||||
{
|
{
|
||||||
objs = objs.Where(u => u.Id.Contains(request.key));
|
objs = objs.Where(u => u.Id.Contains(request.key));
|
||||||
}
|
}
|
||||||
|
|
||||||
var propertyStr = string.Join(',', properties.Select(u => u.Key));
|
var propertyStr = string.Join(',', properties.Select(u => u.Key));
|
||||||
result.columnHeaders = properties;
|
|
||||||
result.data = objs.OrderBy(u => u.Id)
|
result.data = objs.OrderBy(u => u.Id)
|
||||||
.Skip((request.page - 1) * request.limit)
|
.Skip((request.page - 1) * request.limit)
|
||||||
.Take(request.limit).Select($"new ({propertyStr})");
|
.Take(request.limit).Select($"new ({propertyStr})");
|
||||||
|
@ -138,5 +138,24 @@ namespace OpenAuth.Repository.Domain
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
[Description("创建人姓名")]
|
[Description("创建人姓名")]
|
||||||
public string CreateUserName { get; set; }
|
public string CreateUserName { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 是否动态加载表头信息
|
||||||
|
/// </summary>
|
||||||
|
[Description("是否动态加载表头信息")]
|
||||||
|
public bool IsDynamicHeader { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 字表外键
|
||||||
|
/// </summary>
|
||||||
|
[Description("字表外键")]
|
||||||
|
public string ForeignKey { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 主表ID,如果为空表示为主表
|
||||||
|
/// </summary>
|
||||||
|
[Description("主表ID,如果为空表示为主表")]
|
||||||
|
public string ParentTableId { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user