培训计划达成率报表、课程/课程场景分析更新至宝连通

master
xiaochanghai 2 weeks ago
parent 3b8d99db66
commit 71e9864773
  1. BIN
      Lib/Tiobon.Core.dll
  2. 570
      Lib/Tiobon.Core.xml
  3. 1
      Tiobon.CodeGenerator/Program.cs
  4. 2
      Tiobon.Core.Api/Controllers/Authorize/AuthorizeController.cs
  5. 2
      Tiobon.Core.Api/Controllers/LoginController.cs
  6. 2
      Tiobon.Core.Api/Program.cs
  7. 3
      Tiobon.Core.Api/Views/Ghrh_ResumeTemplatePreview/Index.cshtml
  8. 190
      Tiobon.Core.Common/App.cs
  9. 44
      Tiobon.Core.Common/Core/InternalApp.cs
  10. 18
      Tiobon.Core.Common/Extensions/HttpContextExtension.cs
  11. 83
      Tiobon.Core.Common/Extensions/RuntimeExtension.cs
  12. 51
      Tiobon.Core.Common/GlobalVar/GlobalVars.cs
  13. 88
      Tiobon.Core.Common/Helper/Appsettings.cs
  14. 50
      Tiobon.Core.Common/Helper/Console/ConsoleHelper.cs
  15. 38
      Tiobon.Core.Common/Helper/Console/Table/ColumnShowFormat.cs
  16. 327
      Tiobon.Core.Common/Helper/Console/Table/ConsoleTable.cs
  17. 32
      Tiobon.Core.Common/Helper/Console/Table/DrawTableInfo.cs
  18. 148
      Tiobon.Core.Common/Helper/Console/Table/TableExtension.cs
  19. 56
      Tiobon.Core.Common/Helper/Console/Table/TableStyle.cs
  20. 177
      Tiobon.Core.Common/HttpContextUser/AspNetUser.cs
  21. 26
      Tiobon.Core.Common/HttpContextUser/IUser.cs
  22. 60
      Tiobon.Core.Common/Option/Core/ConfigurableOptions.cs
  23. 11
      Tiobon.Core.Common/Option/Core/IConfigurableOptions.cs
  24. 24
      Tiobon.Core.Common/Option/RedisOptions.cs
  25. 18
      Tiobon.Core.Common/Option/SeqOptions.cs
  26. 51
      Tiobon.Core.Common/Swagger/SwaggerContextExtension.cs
  27. 1
      Tiobon.Core.Common/Tiobon.Core.Common.csproj
  28. 7
      Tiobon.Core.EventBus/Tiobon.Core.EventBus.csproj
  29. 2
      Tiobon.Core.Extensions/Authorizations/Behaviors/UserBehaviorService.cs
  30. 2
      Tiobon.Core.Extensions/Authorizations/Policys/ApiResponseHandler.cs
  31. 5
      Tiobon.Core.Extensions/Authorizations/Policys/PermissionHandler.cs
  32. 3
      Tiobon.Core.Extensions/Middlewares/RecordAccessLogsMiddleware.cs
  33. 2
      Tiobon.Core.Extensions/Middlewares/SwaggerAuthMiddleware.cs
  34. 3
      Tiobon.Core.Extensions/ServiceExtensions/AllOptionRegister.cs
  35. 3
      Tiobon.Core.Extensions/ServiceExtensions/CacheSetup.cs
  36. 2
      Tiobon.Core.Extensions/ServiceExtensions/HttpContextSetup.cs
  37. 3
      Tiobon.Core.Extensions/ServiceExtensions/SerilogSetup.cs
  38. 7
      Tiobon.Core.Gateway/Controllers/UserController.cs
  39. 19
      Tiobon.Core.Services/Ghre/Ghre_SurveyServices.cs

Binary file not shown.

@ -4,6 +4,199 @@
<name>Tiobon.Core</name> <name>Tiobon.Core</name>
</assembly> </assembly>
<members> <members>
<member name="P:Tiobon.Core.App.IsBuild">
<summary>是否正在运行</summary>
</member>
<member name="F:Tiobon.Core.App.Assemblies">
<summary>应用有效程序集</summary>
</member>
<member name="F:Tiobon.Core.App.EffectiveTypes">
<summary>有效程序集类型</summary>
</member>
<member name="P:Tiobon.Core.App.RootServices">
<summary>优先使用App.GetService()手动获取服务</summary>
</member>
<member name="P:Tiobon.Core.App.WebHostEnvironment">
<summary>获取Web主机环境,如,是否是开发环境,生产环境等</summary>
</member>
<member name="P:Tiobon.Core.App.HostEnvironment">
<summary>获取泛型主机环境,如,是否是开发环境,生产环境等</summary>
</member>
<member name="P:Tiobon.Core.App.Configuration">
<summary>全局配置选项</summary>
</member>
<member name="P:Tiobon.Core.App.HttpContext">
<summary>
获取请求上下文
</summary>
</member>
<member name="M:Tiobon.Core.App.GetServiceProvider(System.Type,System.Boolean,System.Boolean)">
<summary>解析服务提供器</summary>
<param name="serviceType"></param>
<param name="mustBuild"></param>
<param name="throwException"></param>
<returns></returns>
</member>
<member name="M:Tiobon.Core.App.GetService``1(System.IServiceProvider,System.Boolean)">
<summary>获取请求生存周期的服务</summary>
<typeparam name="TService"></typeparam>
<param name="serviceProvider"></param>
<param name="mustBuild"></param>
<returns></returns>
</member>
<member name="M:Tiobon.Core.App.GetService(System.Type,System.IServiceProvider,System.Boolean)">
<summary>获取请求生存周期的服务</summary>
<param name="type"></param>
<param name="serviceProvider"></param>
<param name="mustBuild"></param>
<returns></returns>
</member>
<member name="M:Tiobon.Core.App.GetTypes(System.Reflection.Assembly)">
<summary>加载程序集中的所有类型</summary>
<param name="ass"></param>
<returns></returns>
</member>
<member name="M:Tiobon.Core.App.GetConfig``1">
<summary>获取配置</summary>
<typeparam name="TOptions">强类型选项类</typeparam>
<returns>TOptions</returns>
</member>
<member name="M:Tiobon.Core.App.GetOptions``1(System.IServiceProvider)">
<summary>获取选项</summary>
<typeparam name="TOptions">强类型选项类</typeparam>
<param name="serviceProvider"></param>
<returns>TOptions</returns>
</member>
<member name="M:Tiobon.Core.App.GetOptionsMonitor``1(System.IServiceProvider)">
<summary>获取选项</summary>
<typeparam name="TOptions">强类型选项类</typeparam>
<param name="serviceProvider"></param>
<returns>TOptions</returns>
</member>
<member name="M:Tiobon.Core.App.GetOptionsSnapshot``1(System.IServiceProvider)">
<summary>获取选项</summary>
<typeparam name="TOptions">强类型选项类</typeparam>
<param name="serviceProvider"></param>
<returns>TOptions</returns>
</member>
<member name="T:Tiobon.Core.Core.InternalApp">
<summary>
内部只用于初始化使用
</summary>
</member>
<member name="F:Tiobon.Core.Core.InternalApp.RootServices">
<summary>根服务</summary>
</member>
<member name="F:Tiobon.Core.Core.InternalApp.WebHostEnvironment">
<summary>获取Web主机环境</summary>
</member>
<member name="F:Tiobon.Core.Core.InternalApp.HostEnvironment">
<summary>获取泛型主机环境</summary>
</member>
<member name="F:Tiobon.Core.Core.InternalApp.Configuration">
<summary>配置对象</summary>
</member>
<member name="M:Tiobon.Core.Extensions.RuntimeExtension.GetAllAssemblies">
<summary>
获取项目程序集,排除所有的系统程序集(Microsoft.***、System.***等)、Nuget下载包
</summary>
<returns></returns>
</member>
<member name="T:Tiobon.Core.Permissions">
<summary>
权限变量配置
</summary>
</member>
<member name="F:Tiobon.Core.Permissions.GWName">
<summary>
测试网关授权
可以使用Tiobon.Core项目中的test用户
账号:test
密码:test
</summary>
</member>
<!-- Badly formed XML comment ignored for member "F:Tiobon.Core.Permissions.IsUseIds4" -->
<!-- Badly formed XML comment ignored for member "F:Tiobon.Core.Permissions.IsUseAuthing" -->
<member name="T:Tiobon.Core.RoutePrefix">
<summary>
路由变量前缀配置
</summary>
</member>
<member name="F:Tiobon.Core.RoutePrefix.Name">
<summary>
前缀名
如果不需要,尽量留空,不要修改
除非一定要在所有的 api 前统一加上特定前缀
前缀在appsettings.json中配置
</summary>
</member>
<member name="T:Tiobon.Core.RedisMqKey">
<summary>
RedisMqKey
</summary>
</member>
<member name="T:Tiobon.Core.AppSettings">
<summary>
appsettings.json操作类
</summary>
</member>
<member name="M:Tiobon.Core.AppSettings.app(System.String[])">
<summary>
封装要操作的字符
</summary>
<param name="sections">节点配置</param>
<returns></returns>
</member>
<member name="M:Tiobon.Core.AppSettings.app``1(System.String[])">
<summary>
递归获取配置信息数组
</summary>
<typeparam name="T"></typeparam>
<param name="sections"></param>
<returns></returns>
</member>
<member name="M:Tiobon.Core.AppSettings.GetValue(System.String)">
<summary>
根据路径 configuration["App:Name"];
</summary>
<param name="sectionsPath"></param>
<returns></returns>
</member>
<member name="M:Tiobon.Core.ConsoleHelper.WriteColorLine(System.String,System.ConsoleColor)">
<summary>
在控制台输出
</summary>
<param name="str">文本</param>
<param name="color">前颜色</param>
</member>
<member name="M:Tiobon.Core.ConsoleHelper.WriteErrorLine(System.String,System.ConsoleColor)">
<summary>
打印错误信息
</summary>
<param name="str">待打印的字符串</param>
<param name="color">想要打印的颜色</param>
</member>
<member name="M:Tiobon.Core.ConsoleHelper.WriteWarningLine(System.String,System.ConsoleColor)">
<summary>
打印警告信息
</summary>
<param name="str">待打印的字符串</param>
<param name="color">想要打印的颜色</param>
</member>
<member name="M:Tiobon.Core.ConsoleHelper.WriteInfoLine(System.String,System.ConsoleColor)">
<summary>
打印正常信息
</summary>
<param name="str">待打印的字符串</param>
<param name="color">想要打印的颜色</param>
</member>
<member name="M:Tiobon.Core.ConsoleHelper.WriteSuccessLine(System.String,System.ConsoleColor)">
<summary>
打印成功的信息
</summary>
<param name="str">待打印的字符串</param>
<param name="color">想要打印的颜色</param>
</member>
<member name="M:Tiobon.Core.Helper.DateHelper.ToLocalTimeDateBySeconds(System.Int64)"> <member name="M:Tiobon.Core.Helper.DateHelper.ToLocalTimeDateBySeconds(System.Int64)">
<summary> <summary>
时间戳转本地时间-时间戳精确到秒 时间戳转本地时间-时间戳精确到秒
@ -433,6 +626,18 @@
<param name="thisValue"></param> <param name="thisValue"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="T:Tiobon.Core.HttpContextUser.AspNetUser">
<summary>
</summary>
</member>
<member name="M:Tiobon.Core.HttpContextUser.AspNetUser.#ctor(Microsoft.AspNetCore.Http.IHttpContextAccessor,Microsoft.Extensions.Logging.ILogger{Tiobon.Core.HttpContextUser.AspNetUser})">
<summary>
</summary>
<param name="accessor"></param>
<param name="logger"></param>
</member>
<member name="P:Tiobon.Core.Model.Entity.BasePoco.Id"> <member name="P:Tiobon.Core.Model.Entity.BasePoco.Id">
<summary> <summary>
表主键 表主键
@ -652,5 +857,370 @@
返回信息 返回信息
</summary> </summary>
</member> </member>
<member name="M:Tiobon.Core.Option.Core.ConfigurableOptions.AddConfigurableOptions``1(Microsoft.Extensions.DependencyInjection.IServiceCollection)">
<summary>添加选项配置</summary>
<typeparam name="TOptions">选项类型</typeparam>
<param name="services">服务集合</param>
<returns>服务集合</returns>
</member>
<member name="M:Tiobon.Core.Option.Core.ConfigurableOptions.GetConfigurationPath(System.Type)">
<summary>获取配置路径</summary>
<param name="optionsType">选项类型</param>
<returns></returns>
</member>
<member name="T:Tiobon.Core.Option.Core.IConfigurableOptions">
<summary>
应用选项依赖接口 <br/>
自动注入配置文件 <br/>
文件名为Option或Options结尾
</summary>
</member>
<member name="T:Tiobon.Core.Option.RedisOptions">
<summary>
缓存配置选项
</summary>
</member>
<member name="P:Tiobon.Core.Option.RedisOptions.Enable">
<summary>
是否启用
</summary>
</member>
<member name="P:Tiobon.Core.Option.RedisOptions.ConnectionString">
<summary>
Redis连接
</summary>
</member>
<member name="P:Tiobon.Core.Option.RedisOptions.InstanceName">
<summary>
键值前缀
</summary>
</member>
<member name="P:Tiobon.Core.Option.SeqOptions.Enabled">
<summary>
是否启用
</summary>
</member>
<member name="P:Tiobon.Core.Option.SeqOptions.Address">
<summary>
地址
</summary>
</member>
<member name="T:Tiobon.Core.Swagger.SwaggerContextExtension">
<summary>
</summary>
</member>
<member name="F:Tiobon.Core.Swagger.SwaggerContextExtension.SwaggerCodeKey">
<summary>
</summary>
</member>
<member name="F:Tiobon.Core.Swagger.SwaggerContextExtension.SwaggerJwt">
<summary>
</summary>
</member>
<member name="T:System.ColumnShowFormat">
<summary>
列显示格式信息
</summary>
</member>
<member name="P:System.ColumnShowFormat.Index">
<summary>
索引,第几列数据
</summary>
</member>
<member name="P:System.ColumnShowFormat.Alignment">
<summary>
对其方式
</summary>
</member>
<member name="P:System.ColumnShowFormat.StrLength">
<summary>
一列字符串长度
</summary>
</member>
<member name="T:System.Alignment">
<summary>
对其方式
</summary>
</member>
<member name="P:System.ConsoleTable.TitleString">
<summary>
表格头部字符串
</summary>
</member>
<member name="P:System.ConsoleTable.Columns">
<summary>
表格的列
</summary>
</member>
<member name="P:System.ConsoleTable.Rows">
<summary>
</summary>
</member>
<member name="P:System.ConsoleTable.ColumnWides">
<summary>
列宽
</summary>
</member>
<member name="P:System.ConsoleTable.ColumnBlankNum">
<summary>
空白字符数量
</summary>
</member>
<member name="P:System.ConsoleTable.Alignment">
<summary>
对其方式
</summary>
</member>
<member name="P:System.ConsoleTable.EnableCount">
<summary>
是否显示行数
</summary>
</member>
<member name="P:System.ConsoleTable.TableStyle">
<summary>
表格显示样式
每次设置样子后就会重置 StyleInfo
</summary>
</member>
<member name="P:System.ConsoleTable.FormatInfo">
<summary>
通过 Format 获得到表格显示样式
</summary>
</member>
<member name="P:System.ConsoleTable.FinalColumnWides">
<summary>
每一列的宽度
</summary>
</member>
<member name="P:System.ConsoleTable.ColumnShowFormats">
<summary>
每一列显示的基本信息
</summary>
</member>
<member name="M:System.ConsoleTable.AddColumn(System.String,System.Int32)">
<summary>
添加列
</summary>
<param name="columnName">列明</param>
<param name="columnWide">列的宽</param>
<returns></returns>
</member>
<member name="M:System.ConsoleTable.AddRow(System.String[])">
<summary>
添加行
</summary>
<param name="values">该行数据</param>
<returns></returns>
</member>
<member name="M:System.ConsoleTable.From``1(System.Collections.Generic.IEnumerable{``0})">
<summary>
加载 List 对象的数据
</summary>
<typeparam name="T"></typeparam>
<param name="values"></param>
<returns></returns>
</member>
<member name="M:System.ConsoleTable.ToString">
<summary>
获取表格字符串
</summary>
<returns></returns>
</member>
<member name="M:System.ConsoleTable.Writer(System.ConsoleColor)">
<summary>
绘制表格
</summary>
<param name="format">样式</param>
<param name="color">title颜色</param>
</member>
<member name="M:System.ConsoleTable.GetHeader">
<summary>
获取完成头
</summary>
<returns></returns>
</member>
<member name="M:System.ConsoleTable.GetExistData">
<summary>
获取现有数据
</summary>
<returns></returns>
</member>
<member name="M:System.ConsoleTable.GetNewRow(System.String[])">
<summary>
获取新行数据
</summary>
<param name="row"></param>
<returns></returns>
</member>
<member name="M:System.ConsoleTable.GetEnd">
<summary>
获取底
</summary>
<returns></returns>
</member>
<member name="M:System.ConsoleTable.GetColumns``1">
<summary>
获取列名
</summary>
<typeparam name="T"></typeparam>
<returns></returns>
</member>
<member name="M:System.ConsoleTable.GetColumnValue``1(``0,System.String)">
<summary>
获取列值
</summary>
<typeparam name="T">类型</typeparam>
<param name="obj">数据</param>
<param name="column">列名</param>
<returns></returns>
</member>
<member name="T:System.DrawTableInfo">
<summary>
绘制表格需要的信息
</summary>
</member>
<member name="P:System.DrawTableInfo.Top_DownDivider">
<summary>
顶部和底部字符串分隔线
</summary>
</member>
<member name="P:System.DrawTableInfo.Divider">
<summary>
分隔线
</summary>
</member>
<member name="P:System.DrawTableInfo.Title">
<summary>
标题
</summary>
</member>
<member name="P:System.DrawTableInfo.Header">
<summary>
头部
</summary>
</member>
<member name="P:System.DrawTableInfo.Data">
<summary>
数据
</summary>
</member>
<member name="M:System.TableExtension.GetColumnWides(System.Collections.Generic.IList{System.String},System.Collections.Generic.IList{System.String[]})">
<summary>
按照现有数据计算每列最大宽度
</summary>
<param name="columns">列信息</param>
<param name="rows">现有行数据</param>
<returns>每一列显示宽度</returns>
</member>
<member name="M:System.TableExtension.FillFormatTostring(System.Collections.Generic.List{System.ColumnShowFormat},System.String[],System.String,System.Int32)">
<summary>
将填充格式转成字符串
表头和数据行会用到
</summary>
<param name="format">一行的显示格式信息</param>
<param name="objs">一行要显示的数据</param>
<param name="delimiterStr">间隔符</param>
<param name="columnBlankNum">每列留白数</param>
<returns></returns>
</member>
<member name="M:System.TableExtension.GetTitleStr(System.Collections.Generic.List{System.Int32},System.String,System.Int32,System.String)">
<summary>
获取title 字符串
</summary>
<param name="columnWides">></param>
<param name="titleStr">标题字符串信息</param>
<param name="columnBlankNum">列两端留白数</param>
<param name="delimiterStr">每列之间分割字符串</param>
<returns></returns>
</member>
<member name="M:System.TableExtension.GetDivider(System.Collections.Generic.List{System.Int32},System.String,System.Int32)">
<summary>
获取每行之间的分割行字符串
</summary>
<param name="columnWides">列宽信息</param>
<param name="angleStr">每列之间分割字符串</param>
<param name="columnBlankNum">列两端留白数</param>
<returns></returns>
</member>
<member name="M:System.TableExtension.GetTopAndDwon(System.Collections.Generic.List{System.Int32},System.String,System.Int32)">
<summary>
获取头部和底部字符串
</summary>
<param name="columnWides">列宽信息</param>
<param name="angleStr">每列之间分割字符串</param>
<param name="columnBlankNum">列两端留白数</param>
<returns></returns>
</member>
<member name="M:System.TableExtension.GetFormatInfo(System.TableStyle)">
<summary>
获取表格显示样式
</summary>
<param name="format"></param>
<returns></returns>
</member>
<member name="M:System.TableExtension.FullHalfLength(System.String)">
<summary>
获取文本长度,区分全角半角
全角算两个字符
</summary>
<returns></returns>
</member>
<member name="M:System.TableExtension.GetChineseText(System.String)">
<summary>
获取中文文本
</summary>
<param name="text"></param>
<returns></returns>
</member>
<member name="T:System.TableStyle">
<summary>
表格显示样式
</summary>
</member>
<member name="F:System.TableStyle.Default">
<summary>
默认格式的表格
</summary>
</member>
<member name="F:System.TableStyle.MarkDown">
<summary>
Markdwon格式的表格
</summary>
</member>
<member name="F:System.TableStyle.Alternative">
<summary>
交替格式的表格
</summary>
</member>
<member name="F:System.TableStyle.Minimal">
<summary>
最简格式的表格
</summary>
</member>
<member name="T:System.StyleInfo">
<summary>
表格显示样式信息
通过 Format 获取到的
</summary>
</member>
<member name="P:System.StyleInfo.DelimiterStr">
<summary>
每一列数据之间的间隔字符串
</summary>
</member>
<member name="P:System.StyleInfo.IsShowTop_Down_DataBorder">
<summary>
是否显示顶部,底部,和每一行数据之间的横向边框
</summary>
</member>
<member name="P:System.StyleInfo.AngleStr">
<summary>
边角字符串
</summary>
</member>
</members> </members>
</doc> </doc>

@ -1,5 +1,6 @@
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using SqlSugar; using SqlSugar;
using Tiobon.Core;
using Tiobon.Core.Common; using Tiobon.Core.Common;
using Tiobon.Core.Common.DB; using Tiobon.Core.Common.DB;
using Tiobon.Core.Common.DB.Dapper.Extensions; using Tiobon.Core.Common.DB.Dapper.Extensions;

@ -3,7 +3,7 @@ using System.Security.Claims;
using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.Authentication.JwtBearer;
using Tiobon.Core.AuthHelper; using Tiobon.Core.AuthHelper;
using Tiobon.Core.AuthHelper.OverWrite; using Tiobon.Core.AuthHelper.OverWrite;
using Tiobon.Core.Common.Swagger; using Tiobon.Core.Swagger;
namespace Tiobon.Core.Controllers; namespace Tiobon.Core.Controllers;

@ -3,7 +3,7 @@ using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims; using System.Security.Claims;
using Tiobon.Core.AuthHelper; using Tiobon.Core.AuthHelper;
using Tiobon.Core.AuthHelper.OverWrite; using Tiobon.Core.AuthHelper.OverWrite;
using Tiobon.Core.Common.Swagger; using Tiobon.Core.Swagger;
namespace Tiobon.Core.Controllers; namespace Tiobon.Core.Controllers;

@ -10,7 +10,7 @@ using Serilog;
using System.IdentityModel.Tokens.Jwt; using System.IdentityModel.Tokens.Jwt;
using System.Reflection; using System.Reflection;
using Tiobon.Core; using Tiobon.Core;
using Tiobon.Core.Common.Core; using Tiobon.Core.Core;
using Tiobon.Core.Common.DB.Dapper.Extensions; using Tiobon.Core.Common.DB.Dapper.Extensions;
using Tiobon.Core.Extensions; using Tiobon.Core.Extensions;
using Tiobon.Core.Extensions.Apollo; using Tiobon.Core.Extensions.Apollo;

@ -1,4 +1,5 @@
@using Tiobon.Core.Model.ViewModels.Extend @using Tiobon.Core
@using Tiobon.Core.Model.ViewModels.Extend
@{ @{
Layout = "~/Views/Shared/_Layout.cshtml"; Layout = "~/Views/Shared/_Layout.cshtml";

@ -1,190 +0,0 @@
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Options;
using System.Reflection;
using Tiobon.Core.Common.Core;
using Tiobon.Core.Common.Extensions;
using Tiobon.Core.Common.HttpContextUser;
using Tiobon.Core.Common.Option.Core;
namespace Tiobon.Core.Common;
public class App
{
static App()
{
EffectiveTypes = Assemblies.SelectMany(GetTypes);
}
private static bool _isRun;
/// <summary>是否正在运行</summary>
public static bool IsBuild { get; set; }
public static bool IsRun
{
get => _isRun;
set => _isRun = IsBuild = value;
}
/// <summary>应用有效程序集</summary>
public static readonly IEnumerable<Assembly> Assemblies = RuntimeExtension.GetAllAssemblies();
/// <summary>有效程序集类型</summary>
public static readonly IEnumerable<Type> EffectiveTypes;
/// <summary>优先使用App.GetService()手动获取服务</summary>
public static IServiceProvider RootServices => IsRun || IsBuild ? InternalApp.RootServices : null;
/// <summary>获取Web主机环境,如,是否是开发环境,生产环境等</summary>
public static IWebHostEnvironment WebHostEnvironment => InternalApp.WebHostEnvironment;
/// <summary>获取泛型主机环境,如,是否是开发环境,生产环境等</summary>
public static IHostEnvironment HostEnvironment => InternalApp.HostEnvironment;
/// <summary>全局配置选项</summary>
public static IConfiguration Configuration => InternalApp.Configuration;
/// <summary>
/// 获取请求上下文
/// </summary>
public static HttpContext HttpContext => RootServices?.GetService<IHttpContextAccessor>()?.HttpContext;
public static IUser User => GetService<IUser>();
#region Service
/// <summary>解析服务提供器</summary>
/// <param name="serviceType"></param>
/// <param name="mustBuild"></param>
/// <param name="throwException"></param>
/// <returns></returns>
public static IServiceProvider GetServiceProvider(Type serviceType, bool mustBuild = false, bool throwException = true)
{
if (App.HostEnvironment == null || App.RootServices != null &&
InternalApp.InternalServices
.Where((u =>
u.ServiceType ==
(serviceType.IsGenericType ? serviceType.GetGenericTypeDefinition() : serviceType)))
.Any((u => u.Lifetime == ServiceLifetime.Singleton)))
return App.RootServices;
//获取请求生存周期的服务
if (HttpContext?.RequestServices != null)
return HttpContext.RequestServices;
if (App.RootServices != null)
{
IServiceScope scope = RootServices.CreateScope();
return scope.ServiceProvider;
}
if (mustBuild)
{
if (throwException)
{
throw new ApplicationException("当前不可用,必须要等到 WebApplication Build后");
}
return default;
}
ServiceProvider serviceProvider = InternalApp.InternalServices.BuildServiceProvider();
return serviceProvider;
}
public static TService GetService<TService>(bool mustBuild = true) where TService : class =>
App.GetService(typeof(TService), null, mustBuild) as TService;
/// <summary>获取请求生存周期的服务</summary>
/// <typeparam name="TService"></typeparam>
/// <param name="serviceProvider"></param>
/// <param name="mustBuild"></param>
/// <returns></returns>
public static TService GetService<TService>(IServiceProvider serviceProvider, bool mustBuild = true)
where TService : class => (serviceProvider ?? App.GetServiceProvider(typeof(TService), mustBuild, false))?.GetService<TService>();
/// <summary>获取请求生存周期的服务</summary>
/// <param name="type"></param>
/// <param name="serviceProvider"></param>
/// <param name="mustBuild"></param>
/// <returns></returns>
public static object GetService(Type type, IServiceProvider serviceProvider = null, bool mustBuild = true) =>
(serviceProvider ?? App.GetServiceProvider(type, mustBuild, false))?.GetService(type);
#endregion
#region private
/// <summary>加载程序集中的所有类型</summary>
/// <param name="ass"></param>
/// <returns></returns>
private static IEnumerable<Type> GetTypes(Assembly ass)
{
Type[] source = Array.Empty<Type>();
try
{
source = ass.GetTypes();
}
catch
{
$@"Error load `{ass.FullName}` assembly.".WriteErrorLine();
}
return source.Where(u => u.IsPublic);
}
#endregion
#region Options
/// <summary>获取配置</summary>
/// <typeparam name="TOptions">强类型选项类</typeparam>
/// <returns>TOptions</returns>
public static TOptions GetConfig<TOptions>()
where TOptions : class, IConfigurableOptions
{
TOptions instance = App.Configuration
.GetSection(ConfigurableOptions.GetConfigurationPath(typeof(TOptions)))
.Get<TOptions>();
return instance;
}
/// <summary>获取选项</summary>
/// <typeparam name="TOptions">强类型选项类</typeparam>
/// <param name="serviceProvider"></param>
/// <returns>TOptions</returns>
public static TOptions GetOptions<TOptions>(IServiceProvider serviceProvider = null) where TOptions : class, new()
{
IOptions<TOptions> service = App.GetService<IOptions<TOptions>>(serviceProvider ?? App.RootServices, false);
return service?.Value;
}
/// <summary>获取选项</summary>
/// <typeparam name="TOptions">强类型选项类</typeparam>
/// <param name="serviceProvider"></param>
/// <returns>TOptions</returns>
public static TOptions GetOptionsMonitor<TOptions>(IServiceProvider serviceProvider = null)
where TOptions : class, new()
{
IOptionsMonitor<TOptions> service =
App.GetService<IOptionsMonitor<TOptions>>(serviceProvider ?? App.RootServices, false);
return service?.CurrentValue;
}
/// <summary>获取选项</summary>
/// <typeparam name="TOptions">强类型选项类</typeparam>
/// <param name="serviceProvider"></param>
/// <returns>TOptions</returns>
public static TOptions GetOptionsSnapshot<TOptions>(IServiceProvider serviceProvider = null)
where TOptions : class, new()
{
IOptionsSnapshot<TOptions> service = App.GetService<IOptionsSnapshot<TOptions>>(serviceProvider, false);
return service?.Value;
}
#endregion
}

@ -1,44 +0,0 @@
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
namespace Tiobon.Core.Common.Core;
/// <summary>
/// 内部只用于初始化使用
/// </summary>
public static class InternalApp
{
internal static IServiceCollection InternalServices;
/// <summary>根服务</summary>
internal static IServiceProvider RootServices;
/// <summary>获取Web主机环境</summary>
internal static IWebHostEnvironment WebHostEnvironment;
/// <summary>获取泛型主机环境</summary>
internal static IHostEnvironment HostEnvironment;
/// <summary>配置对象</summary>
internal static IConfiguration Configuration;
public static void ConfigureApplication(this WebApplicationBuilder wab)
{
HostEnvironment = wab.Environment;
WebHostEnvironment = wab.Environment;
InternalServices = wab.Services;
}
public static void ConfigureApplication(this IConfiguration configuration)
{
Configuration = configuration;
}
public static void ConfigureApplication(this IHost app)
{
RootServices = app.Services;
}
}

@ -1,18 +0,0 @@
using Microsoft.AspNetCore.Http;
namespace Tiobon.Core.Common.Extensions;
public static class HttpContextExtension
{
public static ISession GetSession(this HttpContext context)
{
try
{
return context.Session;
}
catch (Exception)
{
return default;
}
}
}

@ -1,83 +0,0 @@
using Microsoft.Extensions.DependencyModel;
using Serilog;
using System.Reflection;
using System.Runtime.Loader;
namespace Tiobon.Core.Common.Extensions;
public static class RuntimeExtension
{
/// <summary>
/// 获取项目程序集,排除所有的系统程序集(Microsoft.***、System.***等)、Nuget下载包
/// </summary>
/// <returns></returns>
public static IList<Assembly> GetAllAssemblies()
{
var list = new List<Assembly>();
var deps = DependencyContext.Default;
//只加载项目中的程序集
var libs = deps.CompileLibraries.Where(lib => !lib.Serviceable && lib.Type == "project"); //排除所有的系统程序集、Nuget下载包
foreach (var lib in libs)
{
try
{
var assembly = AssemblyLoadContext.Default.LoadFromAssemblyName(new AssemblyName(lib.Name));
list.Add(assembly);
}
catch (Exception e)
{
Log.Debug(e, "GetAllAssemblies Exception:{ex}", e.Message);
}
}
return list;
}
public static Assembly GetAssembly(string assemblyName)
{
return GetAllAssemblies().FirstOrDefault(assembly => assembly.FullName.Contains(assemblyName));
}
public static IList<Type> GetAllTypes()
{
var list = new List<Type>();
foreach (var assembly in GetAllAssemblies())
{
var typeInfos = assembly.DefinedTypes;
foreach (var typeInfo in typeInfos)
{
list.Add(typeInfo.AsType());
}
}
return list;
}
public static IList<Type> GetTypesByAssembly(string assemblyName)
{
var list = new List<Type>();
var assembly = AssemblyLoadContext.Default.LoadFromAssemblyName(new AssemblyName(assemblyName));
var typeInfos = assembly.DefinedTypes;
foreach (var typeInfo in typeInfos)
{
list.Add(typeInfo.AsType());
}
return list;
}
public static Type GetImplementType(string typeName, Type baseInterfaceType)
{
return GetAllTypes().FirstOrDefault(t =>
{
if (t.Name == typeName &&
t.GetTypeInfo().GetInterfaces().Any(b => b.Name == baseInterfaceType.Name))
{
var typeInfo = t.GetTypeInfo();
return typeInfo.IsClass && !typeInfo.IsAbstract && !typeInfo.IsGenericType;
}
return false;
});
}
}

@ -1,51 +0,0 @@
namespace Tiobon.Core;
/// <summary>
/// 权限变量配置
/// </summary>
public static class Permissions
{
public const string Name = "Permission";
/// <summary>
/// 测试网关授权
/// 可以使用Tiobon.Core项目中的test用户
/// 账号:test
/// 密码:test
/// </summary>
public const string GWName = "GW";
/// <summary>
/// 当前项目是否启用IDS4权限方案
/// true:表示启动IDS4
/// false:表示使用JWT
public static bool IsUseIds4 = false;
/// <summary>
/// 当前项目是否启用Authing权限方案
/// true:表示启动
/// false:表示使用JWT
public static bool IsUseAuthing = false;
}
/// <summary>
/// 路由变量前缀配置
/// </summary>
public static class RoutePrefix
{
/// <summary>
/// 前缀名
/// 如果不需要,尽量留空,不要修改
/// 除非一定要在所有的 api 前统一加上特定前缀
/// 前缀在appsettings.json中配置
/// </summary>
public static string Name = "";
}
/// <summary>
/// RedisMqKey
/// </summary>
public static class RedisMqKey
{
public const string Loging = "Loging";
}

@ -1,88 +0,0 @@
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Configuration.Json;
namespace Tiobon.Core.Common;
/// <summary>
/// appsettings.json操作类
/// </summary>
public class AppSettings
{
public static IConfiguration Configuration { get; set; }
static string contentPath { get; set; }
public AppSettings(string contentPath)
{
string Path = "appsettings.json";
//如果你把配置文件 是 根据环境变量来分开了,可以这样写
//Path = $"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}.json";
Configuration = new ConfigurationBuilder()
.SetBasePath(contentPath)
.Add(new JsonConfigurationSource
{
Path = Path, Optional = false, ReloadOnChange = true
}) //这样的话,可以直接读目录里的json文件,而不是 bin 文件夹下的,所以不用修改复制属性
.Build();
}
public AppSettings(IConfiguration configuration)
{
Configuration = configuration;
}
/// <summary>
/// 封装要操作的字符
/// </summary>
/// <param name="sections">节点配置</param>
/// <returns></returns>
public static string app(params string[] sections)
{
try
{
if (sections.Any())
{
return Configuration[string.Join(":", sections)];
}
}
catch (Exception)
{
}
return "";
}
/// <summary>
/// 递归获取配置信息数组
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="sections"></param>
/// <returns></returns>
public static List<T> app<T>(params string[] sections)
{
List<T> list = new List<T>();
// 引用 Microsoft.Extensions.Configuration.Binder 包
Configuration.Bind(string.Join(":", sections), list);
return list;
}
/// <summary>
/// 根据路径 configuration["App:Name"];
/// </summary>
/// <param name="sectionsPath"></param>
/// <returns></returns>
public static string GetValue(string sectionsPath)
{
try
{
return Configuration[sectionsPath];
}
catch (Exception)
{
}
return "";
}
}

@ -1,50 +0,0 @@
namespace Tiobon.Core.Common;
public static class ConsoleHelper
{
private static readonly object _objLock = new();
/// <summary>
/// 在控制台输出
/// </summary>
/// <param name="str">文本</param>
/// <param name="color">前颜色</param>
public static void WriteColorLine(string str, ConsoleColor color)
{
lock (_objLock)
{
ConsoleColor currentForeColor = Console.ForegroundColor;
Console.ForegroundColor = color;
Console.WriteLine(str);
Console.ForegroundColor = currentForeColor;
}
}
/// <summary>
/// 打印错误信息
/// </summary>
/// <param name="str">待打印的字符串</param>
/// <param name="color">想要打印的颜色</param>
public static void WriteErrorLine(this string str, ConsoleColor color = ConsoleColor.Red)=> WriteColorLine(str, color);
/// <summary>
/// 打印警告信息
/// </summary>
/// <param name="str">待打印的字符串</param>
/// <param name="color">想要打印的颜色</param>
public static void WriteWarningLine(this string str, ConsoleColor color = ConsoleColor.Yellow)=> WriteColorLine(str, color);
/// <summary>
/// 打印正常信息
/// </summary>
/// <param name="str">待打印的字符串</param>
/// <param name="color">想要打印的颜色</param>
public static void WriteInfoLine(this string str, ConsoleColor color = ConsoleColor.White)=> WriteColorLine(str, color);
/// <summary>
/// 打印成功的信息
/// </summary>
/// <param name="str">待打印的字符串</param>
/// <param name="color">想要打印的颜色</param>
public static void WriteSuccessLine(this string str, ConsoleColor color = ConsoleColor.Green)=> WriteColorLine(str, color);
}

@ -1,38 +0,0 @@
namespace System;
/// <summary>
/// 列显示格式信息
/// </summary>
public class ColumnShowFormat
{
public ColumnShowFormat(int index, int strLength, Alignment alignment)
{
Index = index;
StrLength = strLength;
Alignment = alignment;
}
/// <summary>
/// 索引,第几列数据
/// </summary>
public int Index { get; set; }
/// <summary>
/// 对其方式
/// </summary>
public Alignment Alignment { get; set; }
/// <summary>
/// 一列字符串长度
/// </summary>
public int StrLength { get; set; }
}
/// <summary>
/// 对其方式
/// </summary>
public enum Alignment
{
Left,
Right
}

@ -1,327 +0,0 @@
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System.Text;
using Tiobon.Core.Common;
namespace System;
public class ConsoleTable
{
#region 属性
/// <summary>
/// 表格头部字符串
/// </summary>
public string TitleString { get; set; }
/// <summary>
/// 表格的列
/// </summary>
public IList<string> Columns
{
get
{
if (_columns == null) _columns = new List<string>();
return _columns;
}
set
{
_columns = value;
_finalColumnWides = new List<int>();
}
}
/// <summary>
/// 行
/// </summary>
public List<string[]> Rows { get; set; } = new List<string[]>();
/// <summary>
/// 列宽
/// </summary>
public List<int> ColumnWides { get; set; } = new List<int>();
/// <summary>
/// 空白字符数量
/// </summary>
public int ColumnBlankNum { get; set; } = 4;
/// <summary>
/// 对其方式
/// </summary>
public Alignment Alignment { get; set; } = Alignment.Left;
/// <summary>
/// 是否显示行数
/// </summary>
public bool EnableCount { get; set; } = false;
/// <summary>
/// 表格显示样式
/// 每次设置样子后就会重置 StyleInfo
/// </summary>
public TableStyle TableStyle
{
get
{
return _tableStyle;
}
set
{
if (_tableStyle == value) return;
_tableStyle = value;
_formatInfo = null;
}
}
#endregion 属性
#region 私有信息
private IList<string> _columns;
private TableStyle _tableStyle;
private StyleInfo _formatInfo;
private List<ColumnShowFormat> _columnShowFormats = new List<ColumnShowFormat>();
private List<int> _finalColumnWides = new List<int>();
/// <summary>
/// 通过 Format 获得到表格显示样式
/// </summary>
private StyleInfo FormatInfo
{
get
{
if (_formatInfo == null)
_formatInfo = _tableStyle.GetFormatInfo();//得到样式信息
return _formatInfo;
}
set
{
_formatInfo = value;
}
}
/// <summary>
/// 每一列的宽度
/// </summary>
private List<int> FinalColumnWides
{
get
{
if (_finalColumnWides is null || _finalColumnWides.Count < 1)
{
// 得到每一列最大的宽度
List<int> _columnWides = Columns.GetColumnWides(Rows);
// 替换用户输入长度
ColumnWides ??= new List<int>();
for (int i = 0; i < ColumnWides.Count; i++) _columnWides[i] = ColumnWides[i];
_finalColumnWides = _columnWides;
}
return _finalColumnWides;
}
}
/// <summary>
/// 每一列显示的基本信息
/// </summary>
private List<ColumnShowFormat> ColumnShowFormats
{
get
{
if (_columnShowFormats.Count == 0)
{
for (int i = 0; i < Columns.Count; i++) _columnShowFormats.Add(new ColumnShowFormat(i, FinalColumnWides[i], Alignment));
}
return _columnShowFormats;
}
}
#endregion 私有信息
#region 配置数据
/// <summary>
/// 添加列
/// </summary>
/// <param name="columnName">列明</param>
/// <param name="columnWide">列的宽</param>
/// <returns></returns>
public ConsoleTable AddColumn(string columnName, int columnWide = 0)
{
Columns.Add(columnName);
columnWide = columnWide == 0 ? columnName.Length : columnWide;
_finalColumnWides.Add(columnWide);
return this;
}
/// <summary>
/// 添加行
/// </summary>
/// <param name="values">该行数据</param>
/// <returns></returns>
public ConsoleTable AddRow(params string[] values)
{
_ = values ?? throw new ArgumentNullException(nameof(values));
Rows.Add(values);
return this;
}
/// <summary>
/// 加载 List 对象的数据
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="values"></param>
/// <returns></returns>
public static ConsoleTable From<T>(IEnumerable<T> values)
{
ConsoleTable table = new();
List<string> columns = GetColumns<T>().Where(c => !string.IsNullOrWhiteSpace(c)).ToList();
columns.ForEach(c =>
{
table.AddColumn(c);
});
values.ToList().ForEach(value =>
{
table.AddRow(columns.Select(c => GetColumnValue(value, c)).ToArray());
});
return table;
}
#endregion 配置数据
/// <summary>
/// 获取表格字符串
/// </summary>
/// <returns></returns>
public override string ToString()
{
StringBuilder builder = new();
builder.AppendLine(GetHeader());
builder.AppendLine(GetExistData());
builder.AppendLine(GetEnd());
return builder.ToString();
}
/// <summary>
/// 绘制表格
/// </summary>
/// <param name="format">样式</param>
/// <param name="color">title颜色</param>
public void Writer(ConsoleColor color = ConsoleColor.White)
{
ConsoleHelper.WriteColorLine(GetHeader(), color);
ConsoleHelper.WriteInfoLine(GetExistData());
ConsoleHelper.WriteColorLine(GetEnd(), color);
}
#region 帮助方法
/// <summary>
/// 获取完成头
/// </summary>
/// <returns></returns>
public string GetHeader()
{
// 创建顶部和底部分隔线
string top_DownDividerdivider = FinalColumnWides.GetTopAndDwon(FormatInfo.AngleStr, ColumnBlankNum);
// 创建分隔线
string divider = FinalColumnWides.GetDivider(FormatInfo.AngleStr, ColumnBlankNum);
// 获取标题字符串
string tilte = FinalColumnWides.GetTitleStr(TitleString, ColumnBlankNum, FormatInfo.DelimiterStr);
// 得到头部字符串
string headers = ColumnShowFormats.FillFormatTostring(Columns.ToArray(), FormatInfo.DelimiterStr, ColumnBlankNum);
//绘制表格头
StringBuilder top = new();
if (FormatInfo.IsShowTop_Down_DataBorder) top.AppendLine(top_DownDividerdivider);
if (!string.IsNullOrWhiteSpace(tilte))
{
top.AppendLine(tilte);
top.AppendLine(divider);
}
top.AppendLine(headers);
top.AppendLine(divider);
return top.ToString().Trim();
}
/// <summary>
/// 获取现有数据
/// </summary>
/// <returns></returns>
public string GetExistData()
{
// 创建分隔线
string divider = FinalColumnWides.GetDivider(FormatInfo.AngleStr, ColumnBlankNum);
// 得到每行数据的字符串
List<string> rowStrs = Rows.Select(row => ColumnShowFormats.FillFormatTostring(row, FormatInfo.DelimiterStr, ColumnBlankNum)).ToList();
StringBuilder data = new();
for (int i = 0; i < rowStrs.Count; i++)
{
if (FormatInfo.IsShowTop_Down_DataBorder && i != 0) data.AppendLine(divider);
data.AppendLine(rowStrs[i]);
}
return data.ToString().Trim();
}
/// <summary>
/// 获取新行数据
/// </summary>
/// <param name="row"></param>
/// <returns></returns>
public string GetNewRow(string[] row)
{
if (row is null) return "";
Rows.Add(row);
//内容
StringBuilder data = new();
if (Rows.Count > 1) data.AppendLine(FinalColumnWides.GetDivider(FormatInfo.AngleStr, ColumnBlankNum));
data.AppendLine(ColumnShowFormats.FillFormatTostring(row, FormatInfo.DelimiterStr, ColumnBlankNum));
return data.ToString().Trim();
}
/// <summary>
/// 获取底
/// </summary>
/// <returns></returns>
public string GetEnd()
{
StringBuilder down = new();
if (FormatInfo.IsShowTop_Down_DataBorder) down.AppendLine(FinalColumnWides.GetTopAndDwon(FormatInfo.AngleStr, ColumnBlankNum));
if (EnableCount) down.AppendLine($" Count: {Rows.Count}");
return down.ToString().Trim();
}
/// <summary>
/// 获取列名
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
private static IEnumerable<string> GetColumns<T>()
{
return typeof(T).GetProperties().Select(x => x.Name).ToArray();
}
/// <summary>
/// 获取列值
/// </summary>
/// <typeparam name="T">类型</typeparam>
/// <param name="obj">数据</param>
/// <param name="column">列名</param>
/// <returns></returns>
private static string GetColumnValue<T>(T obj, string column)
{
if (obj == null) return null;
JObject o = obj as JObject ?? (JObject)JsonConvert.DeserializeObject(JsonConvert.SerializeObject(obj));
return o.GetValue(column).ToString();
}
#endregion 帮助方法
}

@ -1,32 +0,0 @@
namespace System;
/// <summary>
/// 绘制表格需要的信息
/// </summary>
public class DrawTableInfo
{
/// <summary>
/// 顶部和底部字符串分隔线
/// </summary>
public string Top_DownDivider { get; set; }
/// <summary>
/// 分隔线
/// </summary>
public string Divider { get; set; }
/// <summary>
/// 标题
/// </summary>
public string Title { get; set; }
/// <summary>
/// 头部
/// </summary>
public string Header { get; set; }
/// <summary>
/// 数据
/// </summary>
public List<string> Data { get; set; }
}

@ -1,148 +0,0 @@
using System.Text.RegularExpressions;
using Tiobon.Core;
namespace System;
public static class TableExtension
{
/// <summary>
/// 按照现有数据计算每列最大宽度
/// </summary>
/// <param name="columns">列信息</param>
/// <param name="rows">现有行数据</param>
/// <returns>每一列显示宽度</returns>
public static List<int> GetColumnWides(this IList<string> columns, IList<string[]> rows)
{
List<int> columnLengths = columns.Select((t, i) =>
rows.Select(x => x[i])//得到所有行当前列的数据
.Union(new[] { columns[i] })//连接当前列标题
.Where(x => x != null)
.Select(x => x.ObjToString().FullHalfLength())//得到该列每一行的字符串长度(计算中文占用两格)
.Max())//到该列中长度最大的以列
.ToList();
return columnLengths;
}
/// <summary>
/// 将填充格式转成字符串
/// 表头和数据行会用到
/// </summary>
/// <param name="format">一行的显示格式信息</param>
/// <param name="objs">一行要显示的数据</param>
/// <param name="delimiterStr">间隔符</param>
/// <param name="columnBlankNum">每列留白数</param>
/// <returns></returns>
public static string FillFormatTostring(this List<ColumnShowFormat> format, string[] objs, string delimiterStr, int columnBlankNum)
{
string formatStr = string.Empty;
format.ForEach(f =>
{
string ali = f.Alignment == Alignment.Right ? "" : "-";
string val = objs[f.Index].ObjToString();
if (val.Length > f.StrLength)
{
//val = val[0..f.StrLength];
//val = val[0..(val.Length - val.GetChineseText().Length)];
objs[f.Index] = "...";//标记超出长度
}
if (!string.IsNullOrWhiteSpace(formatStr)) formatStr += $"{"".PadLeft(columnBlankNum, ' ')}";
int alignmentStrLength = Math.Max(f.StrLength - objs[f.Index].ObjToString().GetChineseText().Length, 0);//对其填充空格数量
formatStr += $"{delimiterStr}{"".PadLeft(columnBlankNum, ' ')}{{{f.Index},{ali}{alignmentStrLength}}}";
});
formatStr += $"{"".PadLeft(columnBlankNum, ' ')}{delimiterStr}";
return string.Format(formatStr, objs);
}
/// <summary>
/// 获取title 字符串
/// </summary>
/// <param name="columnWides">></param>
/// <param name="titleStr">标题字符串信息</param>
/// <param name="columnBlankNum">列两端留白数</param>
/// <param name="delimiterStr">每列之间分割字符串</param>
/// <returns></returns>
public static string GetTitleStr(this List<int> columnWides, string titleStr, int columnBlankNum, string delimiterStr)
{
if (string.IsNullOrWhiteSpace(titleStr)) return "";
//一行的宽度
int rowWide = columnWides.Sum() + columnWides.Count * 2 * columnBlankNum + columnWides.Count + 1;
int blankNum = (rowWide - titleStr.FullHalfLength()) / 2 - 1;
string tilte = $"{delimiterStr}{"".PadLeft(blankNum, ' ')}{titleStr}{"".PadLeft(blankNum, ' ')}{delimiterStr}";
if (tilte.FullHalfLength() != rowWide) tilte = tilte.Replace($" {delimiterStr}", $" {delimiterStr}");
return tilte;
}
/// <summary>
/// 获取每行之间的分割行字符串
/// </summary>
/// <param name="columnWides">列宽信息</param>
/// <param name="angleStr">每列之间分割字符串</param>
/// <param name="columnBlankNum">列两端留白数</param>
/// <returns></returns>
public static string GetDivider(this List<int> columnWides, string angleStr, int columnBlankNum)
{
string divider = "";
columnWides.ForEach(i =>
{
divider += $"{angleStr}{"".PadRight(i + columnBlankNum * 2, '-')}";
});
divider += angleStr;
return divider;
}
/// <summary>
/// 获取头部和底部字符串
/// </summary>
/// <param name="columnWides">列宽信息</param>
/// <param name="angleStr">每列之间分割字符串</param>
/// <param name="columnBlankNum">列两端留白数</param>
/// <returns></returns>
public static string GetTopAndDwon(this List<int> columnWides, string angleStr, int columnBlankNum)
{
string top_DownDividerdivider = "";
columnWides.ForEach(i =>
{
if (string.IsNullOrWhiteSpace(top_DownDividerdivider)) top_DownDividerdivider += $"{angleStr}{"".PadRight(i + columnBlankNum * 2, '-')}";
else top_DownDividerdivider += $"{"".PadRight(i + columnBlankNum * 2 + 1, '-')}";
});
top_DownDividerdivider += angleStr;
return top_DownDividerdivider;
}
/// <summary>
/// 获取表格显示样式
/// </summary>
/// <param name="format"></param>
/// <returns></returns>
public static StyleInfo GetFormatInfo(this TableStyle format)
{
return format switch
{
TableStyle.Default => new StyleInfo("|", true, "-"),
TableStyle.MarkDown => new StyleInfo("|", false, "|"),
TableStyle.Alternative => new StyleInfo("|", true, "+"),
TableStyle.Minimal => new StyleInfo("", false, "-"),
_ => new StyleInfo(),
};
}
/// <summary>
/// 获取文本长度,区分全角半角
/// 全角算两个字符
/// </summary>
/// <returns></returns>
public static int FullHalfLength(this string text)
{
return Regex.Replace(text, "[^\x00-\xff]", "**").Length;
//可使用以下方法,不过要看在不同编码中字节数
//return Encoding.Default.GetByteCount(text);
}
/// <summary>
/// 获取中文文本
/// </summary>
/// <param name="text"></param>
/// <returns></returns>
public static string GetChineseText(this string text) => Regex.Replace(text, "[\x00-\xff]", "");
}

@ -1,56 +0,0 @@
namespace System;
/// <summary>
/// 表格显示样式
/// </summary>
public enum TableStyle
{
/// <summary>
/// 默认格式的表格
/// </summary>
Default = 0,
/// <summary>
/// Markdwon格式的表格
/// </summary>
MarkDown = 1,
/// <summary>
/// 交替格式的表格
/// </summary>
Alternative = 2,
/// <summary>
/// 最简格式的表格
/// </summary>
Minimal = 3
}
/// <summary>
/// 表格显示样式信息
/// 通过 Format 获取到的
/// </summary>
public class StyleInfo
{
public StyleInfo(string delimiterStr = "|", bool isShowTop_Down_DataBorder = true, string angleStr = "-")
{
DelimiterStr = delimiterStr;
IsShowTop_Down_DataBorder = isShowTop_Down_DataBorder;
AngleStr = angleStr;
}
/// <summary>
/// 每一列数据之间的间隔字符串
/// </summary>
public string DelimiterStr { get; set; }
/// <summary>
/// 是否显示顶部,底部,和每一行数据之间的横向边框
/// </summary>
public bool IsShowTop_Down_DataBorder { get; set; }
/// <summary>
/// 边角字符串
/// </summary>
public string AngleStr { get; set; }
}

@ -1,177 +0,0 @@
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using Tiobon.Core.Common.Swagger;
using Tiobon.Core.Model.Entity;
namespace Tiobon.Core.Common.HttpContextUser;
public class AspNetUser : IUser
{
private readonly IHttpContextAccessor _accessor;
private readonly ILogger<AspNetUser> _logger;
public AspNetUser(IHttpContextAccessor accessor, ILogger<AspNetUser> logger)
{
_accessor = accessor;
_logger = logger;
}
public string Name => GetName();
private string GetName()
{
if (IsAuthenticated() && _accessor.HttpContext.User.Identity.Name.IsNotEmptyOrNull())
{
return _accessor.HttpContext.User.Identity.Name;
}
else
{
var token = GetToken();
if (!string.IsNullOrEmpty(token))
{
var getNameType = Permissions.IsUseIds4
? "name"
: "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name";
return GetUserInfoFromToken(getNameType, token).FirstOrDefault().ObjToString();
}
}
return "";
}
public int ID => GetClaimValueByType("jti").FirstOrDefault().ObjToInt();
public long TenantId => GetClaimValueByType("TenantId").FirstOrDefault().ObjToLong();
public bool IsAuthenticated()
{
return _accessor.HttpContext?.User?.Identity?.IsAuthenticated ?? false;
}
public string GetToken()
{
var token = _accessor.HttpContext?.Request?.Headers["Authorization"].ObjToString().Replace("Bearer ", "");
if (!token.IsNullOrEmpty())
return token;
//var request = _accessor.HttpContext?.Request;
//if (request != null && request?.Body != null)
//{
// var sr = new StreamReader(request?.Body);
// var BodyData = sr.ReadToEnd();
// var jsonParam = JsonConvert.DeserializeObject<JsonParam>(BodyData);
// if (jsonParam != null && !jsonParam.token.IsNullOrEmpty())
// {
// if (_accessor.HttpContext?.Request?.Headers.Any(x => x.Key == "Authorization") == true)
// _accessor.HttpContext.Request.Headers["Authorization"] = jsonParam.token;
// else
// _accessor.HttpContext.Request.Headers.Add("Authorization", "Bearer " + jsonParam.token);
// return jsonParam.token;
// }
//}
if (_accessor.HttpContext?.IsSuccessSwagger() == true)
{
token = _accessor.HttpContext.GetSuccessSwaggerJwt();
if (token.IsNotEmptyOrNull())
{
if (_accessor.HttpContext.User.Claims.Any(s => s.Type == JwtRegisteredClaimNames.Jti))
return token;
var claims = new ClaimsIdentity(GetClaimsIdentity(token));
_accessor.HttpContext.User.AddIdentity(claims);
return token;
}
}
return token;
}
public List<string> GetUserInfoFromToken(string ClaimType, string token)
{
var jwtHandler = new JwtSecurityTokenHandler();
// token校验
if (token.IsNotEmptyOrNull() && jwtHandler.CanReadToken(token))
{
JwtSecurityToken jwtToken = jwtHandler.ReadJwtToken(token);
return (from item in jwtToken.Claims
where item.Type == ClaimType
select item.Value).ToList();
}
return new List<string>() { };
}
public ServiceResult<string> MessageModel { get; set; }
public IEnumerable<Claim> GetClaimsIdentity()
{
if (_accessor.HttpContext == null) return ArraySegment<Claim>.Empty;
if (!IsAuthenticated()) return GetClaimsIdentity(GetToken());
var claims = _accessor.HttpContext.User.Claims.ToList();
var headers = _accessor.HttpContext.Request.Headers;
foreach (var header in headers)
{
claims.Add(new Claim(header.Key, header.Value));
}
return claims;
}
public IEnumerable<Claim> GetClaimsIdentity(string token)
{
var jwtHandler = new JwtSecurityTokenHandler();
// token校验
if (token.IsNotEmptyOrNull() && jwtHandler.CanReadToken(token))
{
var jwtToken = jwtHandler.ReadJwtToken(token);
return jwtToken.Claims;
}
return new List<Claim>();
}
public List<string> GetClaimValueByType(string ClaimType)
{
return (from item in GetClaimsIdentity()
where item.Type == ClaimType
select item.Value).ToList();
}
public string StaffNo => GetStaffNo();
private string GetStaffNo()
{
return GetClaimValueByType("StaffNo").FirstOrDefault(); ;
}
public string StaffName => GetStaffName();
private string GetStaffName()
{
return GetClaimValueByType("StaffName").FirstOrDefault();
}
public int StaffId => GetStaffId();
private int GetStaffId()
{
return GetClaimValueByType("StaffId").FirstOrDefault().ObjToInt();
}
public int? GetLangId()
{
var langId = _accessor.HttpContext?.Request?.Headers["Langid"].ObjToInt();
if (langId.IsNullOrEmpty())
return 1;
return langId;
}
}

@ -1,26 +0,0 @@
using System.Security.Claims;
using Tiobon.Core.Model.Entity;
namespace Tiobon.Core.Common.HttpContextUser;
public interface IUser
{
string Name { get; }
int ID { get; }
long TenantId { get; }
bool IsAuthenticated();
int StaffId { get; }
string StaffName { get; }
string StaffNo { get; }
IEnumerable<Claim> GetClaimsIdentity();
List<string> GetClaimValueByType(string ClaimType);
string GetToken();
List<string> GetUserInfoFromToken(string ClaimType, string token);
ServiceResult<string> MessageModel { get; set; }
int? GetLangId();
}

@ -1,60 +0,0 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
namespace Tiobon.Core.Common.Option.Core;
public static class ConfigurableOptions
{
/// <summary>添加选项配置</summary>
/// <typeparam name="TOptions">选项类型</typeparam>
/// <param name="services">服务集合</param>
/// <returns>服务集合</returns>
public static IServiceCollection AddConfigurableOptions<TOptions>(this IServiceCollection services)
where TOptions : class, IConfigurableOptions
{
Type optionsType = typeof(TOptions);
string path = GetConfigurationPath(optionsType);
services.Configure<TOptions>(App.Configuration.GetSection(path));
return services;
}
public static IServiceCollection AddConfigurableOptions(this IServiceCollection services, Type type)
{
string path = GetConfigurationPath(type);
var config = App.Configuration.GetSection(path);
Type iOptionsChangeTokenSource = typeof(IOptionsChangeTokenSource<>);
Type iConfigureOptions = typeof(IConfigureOptions<>);
Type configurationChangeTokenSource = typeof(ConfigurationChangeTokenSource<>);
Type namedConfigureFromConfigurationOptions = typeof(NamedConfigureFromConfigurationOptions<>);
iOptionsChangeTokenSource = iOptionsChangeTokenSource.MakeGenericType(type);
iConfigureOptions = iConfigureOptions.MakeGenericType(type);
configurationChangeTokenSource = configurationChangeTokenSource.MakeGenericType(type);
namedConfigureFromConfigurationOptions = namedConfigureFromConfigurationOptions.MakeGenericType(type);
services.AddOptions();
services.AddSingleton(iOptionsChangeTokenSource,
Activator.CreateInstance(configurationChangeTokenSource, Options.DefaultName, config) ?? throw new InvalidOperationException());
return services.AddSingleton(iConfigureOptions,
Activator.CreateInstance(namedConfigureFromConfigurationOptions, Options.DefaultName, config) ?? throw new InvalidOperationException());
}
/// <summary>获取配置路径</summary>
/// <param name="optionsType">选项类型</param>
/// <returns></returns>
public static string GetConfigurationPath(Type optionsType)
{
var endPath = new[] {"Option", "Options"};
var configurationPath = optionsType.Name;
foreach (var s in endPath)
{
if (configurationPath.EndsWith(s))
{
return configurationPath[..^s.Length];
}
}
return configurationPath;
}
}

@ -1,11 +0,0 @@
namespace Tiobon.Core.Common.Option.Core;
/// <summary>
/// 应用选项依赖接口 <br/>
/// 自动注入配置文件 <br/>
/// 文件名为Option或Options结尾
/// </summary>
public interface IConfigurableOptions
{
}

@ -1,24 +0,0 @@
using Tiobon.Core.Common.Option.Core;
namespace Tiobon.Core.Common.Option;
/// <summary>
/// 缓存配置选项
/// </summary>
public sealed class RedisOptions : IConfigurableOptions
{
/// <summary>
/// 是否启用
/// </summary>
public bool Enable { get; set; }
/// <summary>
/// Redis连接
/// </summary>
public string ConnectionString { get; set; }
/// <summary>
/// 键值前缀
/// </summary>
public string InstanceName { get; set; }
}

@ -1,18 +0,0 @@
using Tiobon.Core.Common.Option.Core;
namespace Tiobon.Core.Common.Option;
public class SeqOptions : IConfigurableOptions
{
/// <summary>
/// 是否启用
/// </summary>
public bool Enabled { get; set; }
/// <summary>
/// 地址
/// </summary>
public string Address { get; set; }
public string ApiKey { get; set; }
}

@ -1,51 +0,0 @@
using Tiobon.Core.Common.Extensions;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Extensions;
namespace Tiobon.Core.Common.Swagger;
public static class SwaggerContextExtension
{
public const string SwaggerCodeKey = "swagger-code";
public const string SwaggerJwt = "swagger-jwt";
public static bool IsSuccessSwagger()
{
return App.HttpContext?.GetSession()?.GetString(SwaggerCodeKey) == "success";
}
public static bool IsSuccessSwagger(this HttpContext context)
{
return context.GetSession()?.GetString(SwaggerCodeKey) == "success";
}
public static void SuccessSwagger()
{
App.HttpContext?.GetSession()?.SetString(SwaggerCodeKey, "success");
}
public static void SuccessSwagger(this HttpContext context)
{
context.GetSession()?.SetString(SwaggerCodeKey, "success");
}
public static void SuccessSwaggerJwt(this HttpContext context, string token)
{
context.GetSession()?.SetString(SwaggerJwt, token);
}
public static string GetSuccessSwaggerJwt(this HttpContext context)
{
return context.GetSession()?.GetString(SwaggerJwt);
}
public static void RedirectSwaggerLogin(this HttpContext context, bool IsDevelopment)
{
var returnUrl = context.Request.GetDisplayUrl(); //获取当前url地址
if (IsDevelopment)
context.Response.Redirect("/swg-login.html?returnUrl=" + returnUrl);
else
context.Response.Redirect("/Advanced/swg-login.html?returnUrl=" + returnUrl);
}
}

@ -56,7 +56,6 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Folder Include="Core\" />
<Folder Include="Static\" /> <Folder Include="Static\" />
</ItemGroup> </ItemGroup>

@ -21,4 +21,11 @@
<ProjectReference Include="..\Tiobon.Core.Common\Tiobon.Core.Common.csproj" /> <ProjectReference Include="..\Tiobon.Core.Common\Tiobon.Core.Common.csproj" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<Reference Include="Tiobon.Core">
<HintPath>..\Lib\Tiobon.Core.dll</HintPath>
</Reference>
</ItemGroup>
</Project> </Project>

@ -1,5 +1,5 @@
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Tiobon.Core.Common.HttpContextUser; using Tiobon.Core.HttpContextUser;
using Tiobon.Core.IServices; using Tiobon.Core.IServices;
namespace Tiobon.Core.Extensions.Authorizations.Behaviors; namespace Tiobon.Core.Extensions.Authorizations.Behaviors;

@ -4,7 +4,7 @@ using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using Newtonsoft.Json; using Newtonsoft.Json;
using Tiobon.Core.Common.HttpContextUser; using Tiobon.Core.HttpContextUser;
using Tiobon.Core.Model; using Tiobon.Core.Model;
namespace Tiobon.Core.AuthHelper; namespace Tiobon.Core.AuthHelper;

@ -3,13 +3,12 @@ using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using System.Security.Claims; using System.Security.Claims;
using Tiobon.Core.Common;
using Tiobon.Core.Common.HttpContextUser;
using Tiobon.Core.Common.Swagger;
using Tiobon.Core.Helper; using Tiobon.Core.Helper;
using Tiobon.Core.HttpContextUser;
using Tiobon.Core.IServices; using Tiobon.Core.IServices;
using Tiobon.Core.Model; using Tiobon.Core.Model;
using Tiobon.Core.Model.Models; using Tiobon.Core.Model.Models;
using Tiobon.Core.Swagger;
namespace Tiobon.Core.AuthHelper; namespace Tiobon.Core.AuthHelper;

@ -5,9 +5,8 @@ using Newtonsoft.Json;
using System.Diagnostics; using System.Diagnostics;
using System.Text; using System.Text;
using System.Web; using System.Web;
using Tiobon.Core.Common;
using Tiobon.Core.Common.HttpContextUser;
using Tiobon.Core.Common.LogHelper; using Tiobon.Core.Common.LogHelper;
using Tiobon.Core.HttpContextUser;
using Tiobon.Core.Model; using Tiobon.Core.Model;
namespace Tiobon.Core.Extensions.Middlewares; namespace Tiobon.Core.Extensions.Middlewares;

@ -3,7 +3,7 @@ using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Hosting;
using System.Net; using System.Net;
using Tiobon.Core.Common.Swagger; using Tiobon.Core.Swagger;
namespace Tiobon.Core.Extensions.Middlewares; namespace Tiobon.Core.Extensions.Middlewares;

@ -1,6 +1,5 @@
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Tiobon.Core.Common; using Tiobon.Core.Option.Core;
using Tiobon.Core.Common.Option.Core;
namespace Tiobon.Core.Extensions.ServiceExtensions; namespace Tiobon.Core.Extensions.ServiceExtensions;

@ -1,8 +1,7 @@
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using StackExchange.Redis; using StackExchange.Redis;
using Tiobon.Core.Common;
using Tiobon.Core.Common.Caches; using Tiobon.Core.Common.Caches;
using Tiobon.Core.Common.Option; using Tiobon.Core.Option;
namespace Tiobon.Core.Extensions.ServiceExtensions; namespace Tiobon.Core.Extensions.ServiceExtensions;

@ -1,6 +1,6 @@
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Tiobon.Core.Common.HttpContextUser; using Tiobon.Core.HttpContextUser;
namespace Tiobon.Core.Extensions; namespace Tiobon.Core.Extensions;

@ -2,9 +2,8 @@
using Serilog; using Serilog;
using Serilog.Debugging; using Serilog.Debugging;
using Serilog.Events; using Serilog.Events;
using Tiobon.Core.Common;
using Tiobon.Core.Common.LogHelper; using Tiobon.Core.Common.LogHelper;
using Tiobon.Core.Common.Option; using Tiobon.Core.Option;
using Tiobon.Core.Serilog.Configuration; using Tiobon.Core.Serilog.Configuration;
using Tiobon.Core.Serilog.Extensions; using Tiobon.Core.Serilog.Extensions;

@ -1,9 +1,6 @@
using Tiobon.Core.Common.HttpContextUser; using Microsoft.AspNetCore.Authorization;
using Tiobon.Core.Model;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic; using Tiobon.Core.HttpContextUser;
using System.Linq;
using Tiobon.Core.Model.Entity; using Tiobon.Core.Model.Entity;
namespace Tiobon.Core.Gateway.Controllers namespace Tiobon.Core.Gateway.Controllers

@ -1,5 +1,4 @@
using MathNet.Numerics.Distributions; using System.Text.RegularExpressions;
using System.Text.RegularExpressions;
namespace Tiobon.Core.Services; namespace Tiobon.Core.Services;
@ -812,5 +811,21 @@ public class Ghre_SurveyServices : BaseServices<Ghre_Survey, Ghre_SurveyDto, Ins
obj.Status = 200; obj.Status = 200;
return obj; return obj;
} }
// public async Task<dynamic> QueryRecord(long id)
// {
// var sql = @$"SELECT A.Id,
// A.SurveyClass,
// A.SurveyName,
// A.BeginTime,
// A.EndTime, B.SubmitDate
//FROM Ghre_Survey A
// LEFT JOIN Ghre_SurveyRecord B ON A.Id = B.SurveyId AND B.IsEnable = 1 and B.StaffId=9
//WHERE A.IsEnable = 1 AND A.Status ! = 'Temporary'
// and (9 in (select value from openjson(A.StaffID))
// or 41 in (select value from openjson(A.deptId)))"
// return obj;
// }
} }

Loading…
Cancel
Save