15 Commits

Author SHA1 Message Date
tk
e48b425121 chore(release): 1.5.0 2024-07-26 17:47:40 +08:00
faaf5aa0fc feat: 登录日志独立存储 (#161)
请求日志自动分表
[skip ci]

Co-authored-by: tk <fiyne1a@dingtalk.com>
2024-07-26 17:46:56 +08:00
e1bea2ec31 chore: 🔨 更换ip归属地查询接口 (#160)
Co-authored-by: tk <fiyne1a@dingtalk.com>
2024-07-23 09:38:07 +08:00
33e60a5bd7 style: 💄 code format (#159)
Co-authored-by: tk <fiyne1a@dingtalk.com>
2024-07-23 09:34:57 +08:00
1a28e8d5a6 feat: 框架代码同步 (#158)
[skip ci]

Co-authored-by: tk <fiyne1a@dingtalk.com>
2024-07-22 12:58:10 +08:00
60ec6ea2c1 chore: 🔨 默认过滤禁用数据 (#157)
[skip ci]

Co-authored-by: tk <fiyne1a@dingtalk.com>
2024-07-11 16:17:15 +08:00
6d4ccf3445 feat: cron表达式的自然语言表达 (#156)
Co-authored-by: tk <fiyne1a@dingtalk.com>
2024-07-09 14:17:17 +08:00
1733802e02 fix: 🐛 error CS0117: 'Numbers' does not contain a definition for 'SECS_CACHE_DIC_CATALOG_CODE' (#155)
Co-authored-by: tk <fiyne1a@dingtalk.com>
2024-07-08 21:25:33 +08:00
aaea28389a feat: 请求日志增加TraceId (#154)
Co-authored-by: tk <fiyne1a@dingtalk.com>
2024-07-08 20:50:53 +08:00
be5b9a160d feat: logoBar显示程序版本号 (#153)
[skip ci]

Co-authored-by: tk <fiyne1a@dingtalk.com>
2024-07-04 21:14:16 +08:00
67eaa5b783 refactor: ♻️ 抽取公共导出方法 (#152)
[skip ci]

Co-authored-by: tk <fiyne1a@dingtalk.com>
2024-07-04 09:29:18 +08:00
8b01112f42 Merge pull request #151 from nsnail/release
chore(release): 1.4.0
2024-07-03 22:11:37 +08:00
tk
d6a479b693 chore(release): 1.4.0 2024-07-03 22:11:18 +08:00
e1b0030193 feat: 框架代码同步 (#150)
Co-authored-by: tk <fiyne1a@dingtalk.com>
2024-07-03 22:09:58 +08:00
beba4124b0 Merge pull request #149 from nsnail/release
chore(release): 1.3.0
2024-06-24 16:06:05 +08:00
355 changed files with 5071 additions and 1619 deletions

View File

@ -2,6 +2,29 @@
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
## [1.5.0](https://github.com/nsnail/NetAdmin/compare/v1.4.0...v1.5.0) (2024-07-26)
### Features
* ✨ 登录日志独立存储 ([#161](https://github.com/nsnail/NetAdmin/issues/161)) ([faaf5aa](https://github.com/nsnail/NetAdmin/commit/faaf5aa0fc5299633ca4f384d6287171bb241ff4))
* ✨ 框架代码同步 ([#158](https://github.com/nsnail/NetAdmin/issues/158)) ([1a28e8d](https://github.com/nsnail/NetAdmin/commit/1a28e8d5a62aeab7e4fda5049b4f733a16480b67))
* ✨ 请求日志增加TraceId ([#154](https://github.com/nsnail/NetAdmin/issues/154)) ([aaea283](https://github.com/nsnail/NetAdmin/commit/aaea28389a56566e055b6651cf48a89194a72cb7))
* ✨ cron表达式的自然语言表达 ([#156](https://github.com/nsnail/NetAdmin/issues/156)) ([6d4ccf3](https://github.com/nsnail/NetAdmin/commit/6d4ccf344595e128a445f1cb7596a7a1c28fd4cd))
* ✨ logoBar显示程序版本号 ([#153](https://github.com/nsnail/NetAdmin/issues/153)) ([be5b9a1](https://github.com/nsnail/NetAdmin/commit/be5b9a160d1f06cfdf36cea4e5eb95908523fed2))
### Bug Fixes
* 🐛 error CS0117: 'Numbers' does not contain a definition for 'SECS_CACHE_DIC_CATALOG_CODE' ([#155](https://github.com/nsnail/NetAdmin/issues/155)) ([1733802](https://github.com/nsnail/NetAdmin/commit/1733802e02b7e69e4c8646f259da5098b87888f7))
## [1.4.0](https://github.com/nsnail/NetAdmin/compare/v1.3.0...v1.4.0) (2024-07-03)
### Features
* ✨ 框架代码同步 ([#150](https://github.com/nsnail/NetAdmin/issues/150)) ([e1b0030](https://github.com/nsnail/NetAdmin/commit/e1b0030193556fa0564ea059657b4b43c98085c2))
## [1.3.0](https://github.com/nsnail/NetAdmin/compare/v1.2.0...v1.3.0) (2024-06-24)

View File

@ -1,4 +1,4 @@
FROM mcr.microsoft.com/dotnet/aspnet:9.0.0-preview.5 AS base
FROM mcr.microsoft.com/dotnet/aspnet:9.0.0-preview.6 AS base
WORKDIR /app
EXPOSE 8080
RUN apt update

View File

@ -9,12 +9,13 @@
## 在线预览
http://na.yaopy.com 演示站点仅300kbps带宽访问较慢
http://47.110.248.163:12000
## 一键运行
```shell
docker run -p 8080:8080 nsnail/netadmin
# 需翻墙
```
## 构建步骤

View File

@ -1,3 +1,7 @@
上次执行时间
上次执行状态
上次执行耗时
下次执行时间
不为其中之一
不以什么开始
不以什么结束
@ -8,8 +12,11 @@
中专
中共党员
为其中之一
人工审核
以什么开始
以什么结束
作业名称
作业状态
保密
信息
倒序排序
@ -17,6 +24,7 @@
公告
共青团员
出生证
创建时间
初中
删除
包含
@ -24,13 +32,19 @@
博士后
发送失败
同步数据库结构
响应体
响应状态码
唯一编码
备注
外国人居留证
外部错误
大专
大于
大于等于
字典内容导出
宕机
客户端IP
小于
小于等于
小学
@ -41,14 +55,29 @@
并且
成功
或者
所属角色
所属部门
手机
手机号
执行耗时
执行计划
护照
指定部门数据
按钮
排序
接口名称
接口导出
接口描述
接口路径
插入种子数据
操作系统
数据范围
无效操作
无效输入
无限权限
日期范围
是否启用
显示仪表板
未处理异常
未婚
未读
@ -59,13 +88,23 @@
框架
比较数据库结构
注册
消息主题
消息摘要
消息类型
港澳台通行证
用户代理
用户名
用户导出
电子邮箱
登录
登录名
登录日志导出
硕士
示例导出
离异
空闲
站内信导出
等于
等待发送
管理模块
@ -76,16 +115,32 @@
自定义
范围
菜单
角色名称
角色导出
解绑手机号码
警告
计划作业导出
计划作业执行记录导出
请求方式
请求日志导出
调试
跟踪
跟踪标识
跟踪编号
身份证
运行
通知
邮箱号
部门名称
部门导出
配置导出
重设密码
链接
错误
随机排序
项值
项名
顺序排序
高中
默认角色
默认部门

View File

@ -93,6 +93,9 @@ XML注释文件不存在
配置文件初始化完毕
键值不能为空
键名称不能为空
随机延时结束时间不正确
随机延时起始时间不正确
非JSON字符串
验证数据不能为空
验证码不正确
验证码不能为空

View File

@ -9,7 +9,7 @@
"Sort": 100
},
{
"DataScope": 1,
"DataScope": 4,
"Enabled": true,
"Id": 371729946431493,
"Name": "普通用户",

View File

@ -1,11 +1,9 @@
[
{
"Id": 396423792566281,
"MenuId": 373837717815301,
"RoleId": 371729946431493
},
{
"Id": 396423792566282,
"MenuId": 374967228141573,
"RoleId": 371729946431493
}

View File

@ -1,8 +1,10 @@
[
{
"Id": 370942943322181
"Id": 370942943322181,
"AppConfig": "[]"
},
{
"Id": 560217289236492
"Id": 560217289236492,
"AppConfig": "[]"
}
]

View File

@ -15,7 +15,7 @@
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.VisualStudio.Threading.Analyzers" Version="17.10.48">
<PackageReference Include="Microsoft.VisualStudio.Threading.Analyzers" Version="17.11.19-preview">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
@ -23,7 +23,7 @@
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="SonarAnalyzer.CSharp" Version="9.27.0.93347">
<PackageReference Include="SonarAnalyzer.CSharp" Version="9.30.0.95878">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>

View File

@ -1,9 +1,9 @@
{
"version": "1.3.0",
"version": "1.5.0",
"devDependencies": {
"cz-git": "^1.9.2",
"cz-git": "^1.9.3",
"commitizen": "^4.3.0",
"prettier": "^3.3.0",
"prettier": "^3.3.3",
"standard-version": "^9.5.0"
},
"config": {

View File

@ -1,4 +1,4 @@
#r "nuget: NSExt, 2.1.0"
#r "nuget: NSExt, 2.2.0"
using NSExt.Extensions;
Console.WriteLine("请输入原始名称NetAdmin");

View File

@ -10,11 +10,11 @@
"packages": [
{
"packageName": "FreeSql.NS",
"version": "3.2.821-ns1"
"version": "3.2.833-preview20260627-ns1"
},
{
"packageName": "FreeSql.DbContext.NS",
"version": "3.2.821-ns1"
"version": "3.2.833-preview20260627-ns1"
}
]
}

View File

@ -9,7 +9,7 @@
"packages": [
{
"packageName": "Furion.Pure.NS",
"version": "4.9.4-ns1"
"version": "4.9.4.6-ns4"
}
]
}

View File

@ -9,7 +9,7 @@
"packages": [
{
"packageName": "NSExt",
"version": "2.1.0"
"version": "2.2.0"
}
]
}

View File

@ -65,6 +65,16 @@ global using NetAdmin.Infrastructure.Utils;
global using NSExt.Attributes;
global using NSExt.Extensions;
#if !INFRAS
global using CsvHelper.Configuration.Attributes;
global using NetAdmin.Domain.Attributes;
global using NetAdmin.Domain.Attributes.DataValidation;
global using NetAdmin.Domain.DbMaps.Dependency;
global using NetAdmin.Domain.DbMaps.Dependency.Fields;
global using NetAdmin.Domain.DbMaps.Sys;
global using CsvIgnore = CsvHelper.Configuration.Attributes.IgnoreAttribute;
global using CsvIndex = CsvHelper.Configuration.Attributes.IndexAttribute;
global using CsvName = CsvHelper.Configuration.Attributes.NameAttribute;
global using DynamicFilterInfo = NetAdmin.Domain.Dto.Dependency.DynamicFilterInfo;
global using DynamicFilterOperators = NetAdmin.Domain.Enums.DynamicFilterOperators;
global using SqlIndex = FreeSql.DataAnnotations.IndexAttribute;
#endif

View File

@ -0,0 +1,2 @@
<wpf:ResourceDictionary xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xml:space="preserve">
<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=services_005Cadm_005Cpartial/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>

View File

@ -1,6 +1,5 @@
using NetAdmin.AdmServer.Host.Filters;
using NetAdmin.Domain.Contexts;
using NetAdmin.Domain.DbMaps.Dependency.Fields;
using NetAdmin.Domain.Enums.Sys;
using NetAdmin.Host.Extensions;

View File

@ -229,6 +229,14 @@ public class AllTests(WebApplicationFactory<Startup> factory, ITestOutputHelper
return default;
}
/// <inheritdoc />
[InlineData(default)]
[Theory]
public Task<long> CountRecordAsync(QueryReq<QueryJobRecordReq> req)
{
return default;
}
/// <inheritdoc />
[InlineData(default)]
[Theory]
@ -629,6 +637,166 @@ public class AllTests(WebApplicationFactory<Startup> factory, ITestOutputHelper
return default;
}
/// <inheritdoc />
[InlineData(default)]
[Theory]
public Task<IActionResult> ExportAsync(QueryReq<QueryJobReq> req)
{
return default;
}
/// <inheritdoc />
[InlineData(default)]
[Theory]
public Task<IActionResult> ExportAsync(QueryReq<QueryVerifyCodeReq> req)
{
return default;
}
/// <inheritdoc />
[InlineData(default)]
[Theory]
public Task<IActionResult> ExportAsync(QueryReq<QueryUserProfileReq> req)
{
return default;
}
/// <inheritdoc />
[InlineData(default)]
[Theory]
public Task<IActionResult> ExportAsync(QueryReq<QueryUserReq> req)
{
return default;
}
/// <inheritdoc />
[InlineData(default)]
[Theory]
public Task<IActionResult> ExportAsync(QueryReq<QuerySiteMsgUserReq> req)
{
return default;
}
/// <inheritdoc />
[InlineData(default)]
[Theory]
public Task<IActionResult> ExportAsync(QueryReq<QuerySiteMsgRoleReq> req)
{
return default;
}
/// <inheritdoc />
[InlineData(default)]
[Theory]
public Task<IActionResult> ExportAsync(QueryReq<QuerySiteMsgReq> req)
{
return default;
}
/// <inheritdoc />
[InlineData(default)]
[Theory]
public Task<IActionResult> ExportAsync(QueryReq<QuerySiteMsgFlagReq> req)
{
return default;
}
/// <inheritdoc />
[InlineData(default)]
[Theory]
public Task<IActionResult> ExportAsync(QueryReq<QuerySiteMsgDeptReq> req)
{
return default;
}
/// <inheritdoc />
[InlineData(default)]
[Theory]
public Task<IActionResult> ExportAsync(QueryReq<QueryRoleReq> req)
{
return default;
}
/// <inheritdoc />
[InlineData(default)]
[Theory]
public Task<IActionResult> ExportAsync(QueryReq<QueryRequestLogReq> req)
{
return default;
}
/// <inheritdoc />
[InlineData(default)]
[Theory]
public Task<IActionResult> ExportAsync(QueryReq<QueryMenuReq> req)
{
return default;
}
/// <inheritdoc />
[InlineData(default)]
[Theory]
public Task<IActionResult> ExportAsync(QueryReq<QueryJobRecordReq> req)
{
return default;
}
/// <inheritdoc />
[InlineData(default)]
[Theory]
public Task<IActionResult> ExportAsync(QueryReq<QueryDicContentReq> req)
{
return default;
}
/// <inheritdoc />
[InlineData(default)]
[Theory]
public Task<IActionResult> ExportAsync(QueryReq<QueryDicCatalogReq> req)
{
return default;
}
/// <inheritdoc />
[InlineData(default)]
[Theory]
public Task<IActionResult> ExportAsync(QueryReq<QueryDeptReq> req)
{
return default;
}
/// <inheritdoc />
[InlineData(default)]
[Theory]
public Task<IActionResult> ExportAsync(QueryReq<QueryConfigReq> req)
{
return default;
}
/// <inheritdoc />
[InlineData(default)]
[Theory]
public Task<IActionResult> ExportAsync(QueryReq<QueryApiReq> req)
{
return default;
}
/// <inheritdoc />
[InlineData(default)]
[Theory]
public Task<IActionResult> ExportContentAsync(QueryReq<QueryDicContentReq> req)
{
return default;
}
/// <inheritdoc />
[InlineData(default)]
[Theory]
public Task<IActionResult> ExportRecordAsync(QueryReq<QueryJobRecordReq> req)
{
return default;
}
/// <inheritdoc />
[InlineData(default)]
[Theory]
@ -655,11 +823,14 @@ public class AllTests(WebApplicationFactory<Startup> factory, ITestOutputHelper
/// <inheritdoc />
[InlineData(default)]
[Theory]
public async Task<PagedQueryRsp<GetAllEntriesRsp>> GetAllEntriesAsync(PagedQueryReq<GetAllEntriesReq> req)
public Task<IEnumerable<GetEntryRsp>> GetAllEntriesAsync(GetAllEntriesReq req)
{
var rsp = await PostAsync("/api/sys/cache/get.all.entries"
, JsonContent.Create(new PagedQueryReq<GetAllEntriesReq>()))
.ConfigureAwait(true);
var rsp = PostAsync("/api/sys/cache/get.all.entries", JsonContent.Create(new GetAllEntriesReq()))
.ConfigureAwait(true)
.GetAwaiter()
#pragma warning disable xUnit1031
.GetResult();
#pragma warning restore xUnit1031
Assert.Equal(HttpStatusCode.OK, rsp.StatusCode);
return default;
}
@ -811,7 +982,7 @@ public class AllTests(WebApplicationFactory<Startup> factory, ITestOutputHelper
/// <inheritdoc />
[InlineData(default)]
[Theory]
public Task<IOrderedEnumerable<GetBarChartRsp>> GetBarChartAsync(QueryReq<QueryRequestLogReq> req)
public Task<IEnumerable<GetBarChartRsp>> GetBarChartAsync(QueryReq<QueryRequestLogReq> req)
{
return default;
}
@ -861,6 +1032,12 @@ public class AllTests(WebApplicationFactory<Startup> factory, ITestOutputHelper
return default;
}
/// <inheritdoc />
public Task<GetEntryRsp> GetEntryAsync(GetEntriesReq req)
{
return default;
}
/// <inheritdoc />
[Fact]
public IDictionary<string, Dictionary<string, string[]>> GetEnums()
@ -907,7 +1084,7 @@ public class AllTests(WebApplicationFactory<Startup> factory, ITestOutputHelper
/// <inheritdoc />
[InlineData(default)]
[Theory]
public Task<IOrderedEnumerable<GetPieChartRsp>> GetPieChartByApiSummaryAsync(QueryReq<QueryRequestLogReq> req)
public Task<IEnumerable<GetPieChartRsp>> GetPieChartByApiSummaryAsync(QueryReq<QueryRequestLogReq> req)
{
return default;
}
@ -915,7 +1092,7 @@ public class AllTests(WebApplicationFactory<Startup> factory, ITestOutputHelper
/// <inheritdoc />
[InlineData(default)]
[Theory]
public Task<IOrderedEnumerable<GetPieChartRsp>> GetPieChartByHttpStatusCodeAsync(QueryReq<QueryRequestLogReq> req)
public Task<IEnumerable<GetPieChartRsp>> GetPieChartByHttpStatusCodeAsync(QueryReq<QueryRequestLogReq> req)
{
return default;
}
@ -923,7 +1100,7 @@ public class AllTests(WebApplicationFactory<Startup> factory, ITestOutputHelper
/// <inheritdoc />
[InlineData(default)]
[Theory]
public Task<IOrderedEnumerable<GetBarChartRsp>> GetRecordBarChartAsync(QueryReq<QueryJobRecordReq> req)
public Task<QueryJobRecordRsp> GetRecordAsync(QueryJobRecordReq req)
{
return default;
}
@ -931,8 +1108,7 @@ public class AllTests(WebApplicationFactory<Startup> factory, ITestOutputHelper
/// <inheritdoc />
[InlineData(default)]
[Theory]
public Task<IOrderedEnumerable<GetPieChartRsp>> GetRecordPieChartByHttpStatusCodeAsync(
QueryReq<QueryJobRecordReq> req)
public Task<IEnumerable<GetBarChartRsp>> GetRecordBarChartAsync(QueryReq<QueryJobRecordReq> req)
{
return default;
}
@ -940,7 +1116,15 @@ public class AllTests(WebApplicationFactory<Startup> factory, ITestOutputHelper
/// <inheritdoc />
[InlineData(default)]
[Theory]
public Task<IOrderedEnumerable<GetPieChartRsp>> GetRecordPieChartByNameAsync(QueryReq<QueryJobRecordReq> req)
public Task<IEnumerable<GetPieChartRsp>> GetRecordPieChartByHttpStatusCodeAsync(QueryReq<QueryJobRecordReq> req)
{
return default;
}
/// <inheritdoc />
[InlineData(default)]
[Theory]
public Task<IEnumerable<GetPieChartRsp>> GetRecordPieChartByNameAsync(QueryReq<QueryJobRecordReq> req)
{
return default;
}
@ -1154,6 +1338,14 @@ public class AllTests(WebApplicationFactory<Startup> factory, ITestOutputHelper
return default;
}
/// <inheritdoc />
[InlineData(default)]
[Theory]
public Task<PagedQueryRsp<QueryJobRecordRsp>> PagedQueryRecordAsync(PagedQueryReq<QueryJobRecordReq> req)
{
return default;
}
/// <inheritdoc />
[InlineData(default)]
[Theory]
@ -1322,22 +1514,6 @@ public class AllTests(WebApplicationFactory<Startup> factory, ITestOutputHelper
return default;
}
/// <inheritdoc />
[InlineData(default)]
[Theory]
public Task<QueryJobRecordRsp> RecordGetAsync(QueryJobRecordReq req)
{
return default;
}
/// <inheritdoc />
[InlineData(default)]
[Theory]
public Task<PagedQueryRsp<QueryJobRecordRsp>> RecordPagedQueryAsync(PagedQueryReq<QueryJobRecordReq> req)
{
return default;
}
/// <inheritdoc />
[InlineData(default)]
[Theory]

View File

@ -4,6 +4,6 @@
<ProjectReference Include="../NetAdmin.AdmServer.Host/NetAdmin.AdmServer.Host.csproj"/>
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.10.0"/>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.11.0-release-24352-06"/>
</ItemGroup>
</Project>

View File

@ -43,6 +43,11 @@ public interface ICrudModule<in TCreateReq, TCreateRsp, TQueryReq, TQueryRsp, TD
/// </summary>
Task<bool> ExistAsync(QueryReq<TQueryReq> req);
/// <summary>
/// 导出实体
/// </summary>
Task<IActionResult> ExportAsync(QueryReq<TQueryReq> req);
/// <summary>
/// 获取单个实体
/// </summary>

View File

@ -1,5 +1,4 @@
using NetAdmin.Domain.Contexts;
using NetAdmin.Domain.DbMaps.Dependency;
namespace NetAdmin.Application.Repositories;

View File

@ -1,5 +1,4 @@
using NetAdmin.Application.Repositories;
using NetAdmin.Domain.DbMaps.Dependency;
using RedLockNet;
namespace NetAdmin.Application.Services;
@ -13,19 +12,39 @@ public abstract class RedLockerService<TEntity, TPrimary, TLogger>(
where TEntity : EntityBase<TPrimary> //
where TPrimary : IEquatable<TPrimary>
{
/// <summary>
/// 获取锁
/// </summary>
protected Task<IRedLock> GetLockerAsync(string lockName)
{
return GetLockerAsync(lockName, TimeSpan.FromSeconds(Numbers.SECS_RED_LOCK_WAIT)
, TimeSpan.FromSeconds(Numbers.SECS_RED_LOCK_RETRY_INTERVAL));
}
/// <summary>
/// 获取锁
/// </summary>
/// <exception cref="NetAdminGetLockerException">NetAdminGetLockerException</exception>
protected async Task<IRedLock> GetLockerAsync(string lockName)
protected async Task<IRedLock> GetLockerAsync(string lockName, TimeSpan waitTime, TimeSpan retryInterval)
{
// 加锁
var redLock = await redLocker.RedLockFactory.CreateLockAsync( //
lockName, TimeSpan.FromSeconds(Numbers.SECS_RED_LOCK_EXPIRY)
, TimeSpan.FromSeconds(Numbers.SECS_RED_LOCK_WAIT)
, TimeSpan.FromSeconds(Numbers.SECS_RED_LOCK_RETRY))
.ConfigureAwait(false);
var lockTask = waitTime == default || retryInterval == default
? redLocker.RedLockFactory.CreateLockAsync(lockName, TimeSpan.FromSeconds(Numbers.SECS_RED_LOCK_EXPIRY))
: redLocker.RedLockFactory.CreateLockAsync( //
lockName, TimeSpan.FromSeconds(Numbers.SECS_RED_LOCK_EXPIRY), waitTime, retryInterval);
var redLock = await lockTask.ConfigureAwait(false);
return redLock.IsAcquired ? redLock : throw new NetAdminGetLockerException();
}
/// <summary>
/// 获取锁
/// </summary>
/// <remarks>
/// 不重试,失败直接抛出异常
/// </remarks>
protected Task<IRedLock> GetLockerOnceAsync(string lockName)
{
return GetLockerAsync(lockName, default, default);
}
}

View File

@ -1,6 +1,8 @@
using CsvHelper;
using Microsoft.Net.Http.Headers;
using NetAdmin.Application.Repositories;
using NetAdmin.Domain.DbMaps.Dependency;
using NetAdmin.Domain.DbMaps.Dependency.Fields;
using NetAdmin.Domain;
using NetAdmin.Domain.Dto.Dependency;
namespace NetAdmin.Application.Services;
@ -28,6 +30,46 @@ public abstract class RepositoryService<TEntity, TPrimary, TLogger>(BasicReposit
set => Rpo.DbContextOptions.EnableCascadeSave = value;
}
/// <summary>
/// 导出实体
/// </summary>
protected async Task<IActionResult> ExportAsync<TQuery, TExport>( //
Func<QueryReq<TQuery>, ISelect<TEntity>> selector, QueryReq<TQuery> query, string fileName
, Expression<Func<TEntity, object>> listExp = null)
where TQuery : DataAbstraction, new()
{
var select = selector(query)
#if DBTYPE_SQLSERVER
.WithLock(SqlServerLock.NoLock | SqlServerLock.NoWait)
#endif
.Take(Numbers.MAX_LIMIT_EXPORT);
object list = listExp == null
? await select.ToListAsync().ConfigureAwait(false)
: await select.ToListAsync(listExp).ConfigureAwait(false);
var listTyped = list.Adapt<List<TExport>>();
var stream = new MemoryStream();
var writer = new StreamWriter(stream);
var csv = new CsvWriter(writer, CultureInfo.InvariantCulture);
csv.WriteHeader<TExport>();
await csv.NextRecordAsync().ConfigureAwait(false);
foreach (var item in listTyped) {
csv.WriteRecord(item);
await csv.NextRecordAsync().ConfigureAwait(false);
}
await csv.FlushAsync().ConfigureAwait(false);
_ = stream.Seek(0, SeekOrigin.Begin);
App.HttpContext.Response.Headers.ContentDisposition
= new ContentDispositionHeaderValue(Chars.FLG_HTTP_HEADER_VALUE_ATTACHMENT) {
FileNameStar = $"{fileName}_{DateTime.Now:yyyy.MM.dd-HH.mm.ss}.csv"
}.ToString();
return new FileStreamResult(stream, Chars.FLG_HTTP_HEADER_VALUE_APPLICATION_OCTET_STREAM);
}
/// <summary>
/// 更新实体
/// </summary>

View File

@ -70,7 +70,8 @@ public abstract class DistributedCache<TService>(IDistributedCache cache, TServi
, TimeSpan? slideLifeTime = null)
{
var cacheRead = await GetAsync<T>(key).ConfigureAwait(false);
if (cacheRead is not null) {
if (cacheRead is not null && App.HttpContext?.Request.Headers.CacheControl.FirstOrDefault() !=
Chars.FLG_HTTP_HEADER_VALUE_NO_CACHE) {
return cacheRead;
}

View File

@ -0,0 +1,16 @@
namespace NetAdmin.Domain.Attributes.DataValidation;
/// <summary>
/// JSON文本验证器
/// </summary>
[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property | AttributeTargets.Parameter)]
public sealed class JsonStringAttribute : ValidationAttribute
{
/// <inheritdoc />
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
return (value as string).IsJsonString()
? ValidationResult.Success
: new ValidationResult(Ln.JSON字符串, new[] { validationContext.MemberName });
}
}

View File

@ -10,5 +10,5 @@ public sealed class IndicatorAttribute(string indicate) : Attribute
/// <summary>
/// 状态指示
/// </summary>
public string Indicate { get; init; } = indicate;
public string Indicate { get; } = indicate;
}

View File

@ -7,6 +7,12 @@ namespace NetAdmin.Domain.Contexts;
/// </summary>
public sealed record ContextUserToken : DataAbstraction
{
/// <summary>
/// 部门编号
/// </summary>
/// ReSharper disable once MemberCanBePrivate.Global
public long DeptId { get; init; }
/// <summary>
/// 用户编号
/// </summary>
@ -39,6 +45,18 @@ public sealed record ContextUserToken : DataAbstraction
/// </summary>
public static ContextUserToken Create(QueryUserRsp user)
{
return new ContextUserToken { Id = user.Id, Token = user.Token, UserName = user.UserName };
return new ContextUserToken {
Id = user.Id, Token = user.Token, UserName = user.UserName, DeptId = user.DeptId
};
}
/// <summary>
/// 从 Json Web Token 创建上下文用户
/// </summary>
public static ContextUserToken Create(string jwt)
{
var claim = JWTEncryption.ReadJwtToken(jwt.TrimPrefix($"{Chars.FLG_HTTP_HEADER_VALUE_AUTH_SCHEMA} "))
?.Claims.FirstOrDefault(x => x.Type == nameof(ContextUserToken));
return claim?.Value.ToObject<ContextUserToken>();
}
}

View File

@ -0,0 +1,12 @@
namespace NetAdmin.Domain.DbMaps.Dependency.Fields;
/// <summary>
/// 创建者客户端IP字段接口
/// </summary>
public interface IFieldCreatedClientIp
{
/// <summary>
/// 创建者客户端IP
/// </summary>
int? CreatedClientIp { get; init; }
}

View File

@ -1,15 +1,10 @@
namespace NetAdmin.Domain.DbMaps.Dependency.Fields;
/// <summary>
/// 创建者客户端字段接口
/// 创建者客户端用户代理字段接口
/// </summary>
public interface IFieldCreatedClient
public interface IFieldCreatedClientUserAgent
{
/// <summary>
/// 创建者客户端IP
/// </summary>
int? CreatedClientIp { get; init; }
/// <summary>
/// 创建者客户端用户代理
/// </summary>

View File

@ -0,0 +1,12 @@
namespace NetAdmin.Domain.DbMaps.Dependency.Fields;
/// <summary>
/// 修改客户端IP字段接口
/// </summary>
public interface IFieldModifiedClientIp
{
/// <summary>
/// 客户端IP
/// </summary>
int ModifiedClientIp { get; init; }
}

View File

@ -1,15 +1,10 @@
namespace NetAdmin.Domain.DbMaps.Dependency.Fields;
/// <summary>
/// 修改客户端字段接口
/// 修改客户端用户代理字段接口
/// </summary>
public interface IFieldModifiedClient
public interface IFieldModifiedClientUserAgent
{
/// <summary>
/// 客户端IP
/// </summary>
int ModifiedClientIp { get; init; }
/// <summary>
/// 客户端用户代理
/// </summary>

View File

@ -1,6 +1,3 @@
using NetAdmin.Domain.Attributes;
using NetAdmin.Domain.DbMaps.Dependency.Fields;
namespace NetAdmin.Domain.DbMaps.Dependency;
/// <inheritdoc />
@ -8,6 +5,7 @@ public abstract record ImmutableEntity : ImmutableEntity<long>
{
/// <inheritdoc cref="EntityBase{T}.Id" />
[Column(IsIdentity = false, IsPrimary = true, Position = 1)]
[CsvIgnore]
[Snowflake]
public override long Id { get; init; }
}
@ -21,15 +19,18 @@ public abstract record ImmutableEntity<T> : LiteImmutableEntity<T>, IFieldCreate
{
/// <inheritdoc cref="IFieldCreatedUser.CreatedUserId" />
[Column(CanUpdate = false, Position = -1)]
[CsvIgnore]
[JsonIgnore]
public long? CreatedUserId { get; init; }
/// <inheritdoc cref="IFieldCreatedUser.CreatedUserName" />
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_31, CanUpdate = false, Position = -1)]
[CsvIgnore]
[JsonIgnore]
public virtual string CreatedUserName { get; init; }
/// <inheritdoc cref="EntityBase{T}.Id" />
[Column(IsIdentity = false, IsPrimary = true, Position = 1)]
[CsvIgnore]
public override T Id { get; init; }
}

View File

@ -1,6 +1,3 @@
using NetAdmin.Domain.Attributes;
using NetAdmin.Domain.DbMaps.Dependency.Fields;
namespace NetAdmin.Domain.DbMaps.Dependency;
/// <inheritdoc />
@ -8,6 +5,7 @@ public abstract record LiteImmutableEntity : LiteImmutableEntity<long>
{
/// <inheritdoc cref="EntityBase{T}.Id" />
[Column(IsIdentity = false, IsPrimary = true, Position = 1)]
[CsvIgnore]
[Snowflake]
public override long Id { get; init; }
}
@ -21,11 +19,13 @@ public abstract record LiteImmutableEntity<T> : EntityBase<T>, IFieldCreatedTime
{
/// <inheritdoc cref="IFieldCreatedTime.CreatedTime" />
[Column(ServerTime = DateTimeKind.Local, CanUpdate = false, Position = -1)]
[CsvIgnore]
[JsonIgnore]
public virtual DateTime CreatedTime { get; init; }
/// <inheritdoc cref="EntityBase{T}.Id" />
[Column(IsIdentity = false, IsPrimary = true, Position = 1)]
[CsvIgnore]
[JsonIgnore]
public override T Id { get; init; }
}

View File

@ -1,6 +1,3 @@
using NetAdmin.Domain.Attributes;
using NetAdmin.Domain.DbMaps.Dependency.Fields;
namespace NetAdmin.Domain.DbMaps.Dependency;
/// <inheritdoc />
@ -8,6 +5,7 @@ public abstract record LiteMutableEntity : LiteMutableEntity<long>
{
/// <inheritdoc cref="EntityBase{T}.Id" />
[Column(IsIdentity = false, IsPrimary = true, Position = 1)]
[CsvIgnore]
[Snowflake]
public override long Id { get; init; }
}
@ -20,10 +18,12 @@ public abstract record LiteMutableEntity<T> : LiteImmutableEntity<T>, IFieldModi
{
/// <inheritdoc cref="EntityBase{T}.Id" />
[Column(IsIdentity = false, IsPrimary = true, Position = 1)]
[CsvIgnore]
public override T Id { get; init; }
/// <inheritdoc cref="IFieldModifiedTime.ModifiedTime" />
[Column(ServerTime = DateTimeKind.Local, CanInsert = false, Position = -1)]
[CsvIgnore]
[JsonIgnore]
public virtual DateTime? ModifiedTime { get; init; }
}

View File

@ -1,6 +1,3 @@
using NetAdmin.Domain.Attributes;
using NetAdmin.Domain.DbMaps.Dependency.Fields;
namespace NetAdmin.Domain.DbMaps.Dependency;
/// <inheritdoc />
@ -8,6 +5,7 @@ public abstract record LiteVersionEntity : LiteVersionEntity<long>
{
/// <inheritdoc cref="EntityBase{T}.Id" />
[Column(IsIdentity = false, IsPrimary = true, Position = 1)]
[CsvIgnore]
[Snowflake]
public override long Id { get; init; }
}
@ -20,10 +18,13 @@ public abstract record LiteVersionEntity<T> : LiteMutableEntity<T>, IFieldVersio
{
/// <inheritdoc cref="EntityBase{T}.Id" />
[Column(IsIdentity = false, IsPrimary = true, Position = 1)]
[CsvIgnore]
[Snowflake]
public override T Id { get; init; }
/// <inheritdoc cref="IFieldVersion.Version" />
[Column(IsVersion = true, Position = -1)]
[CsvIgnore]
[JsonIgnore]
public virtual long Version { get; init; }
}

View File

@ -1,6 +1,3 @@
using NetAdmin.Domain.Attributes;
using NetAdmin.Domain.DbMaps.Dependency.Fields;
namespace NetAdmin.Domain.DbMaps.Dependency;
/// <inheritdoc />
@ -8,6 +5,7 @@ public abstract record MutableEntity : MutableEntity<long>
{
/// <inheritdoc cref="EntityBase{T}.Id" />
[Column(IsIdentity = false, IsPrimary = true, Position = 1)]
[CsvIgnore]
[Snowflake]
public override long Id { get; init; }
}
@ -20,15 +18,18 @@ public abstract record MutableEntity<T> : LiteMutableEntity<T>, IFieldModifiedUs
{
/// <inheritdoc cref="EntityBase{T}.Id" />
[Column(IsIdentity = false, IsPrimary = true, Position = 1)]
[CsvIgnore]
public override T Id { get; init; }
/// <inheritdoc cref="IFieldModifiedUser.ModifiedUserId" />
[Column(CanInsert = false, Position = -1)]
[CsvIgnore]
[JsonIgnore]
public long? ModifiedUserId { get; init; }
/// <inheritdoc cref="IFieldModifiedUser.ModifiedUserName" />
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_31, CanInsert = false, Position = -1)]
[CsvIgnore]
[JsonIgnore]
public string ModifiedUserName { get; init; }
}

View File

@ -1,5 +1,3 @@
using NetAdmin.Domain.Attributes;
namespace NetAdmin.Domain.DbMaps.Dependency;
/// <inheritdoc />
@ -7,6 +5,7 @@ public abstract record SimpleEntity : SimpleEntity<long>
{
/// <inheritdoc cref="EntityBase{T}.Id" />
[Column(IsIdentity = false, IsPrimary = true, Position = 1)]
[CsvIgnore]
[Snowflake]
public override long Id { get; init; }
}

View File

@ -1,6 +1,3 @@
using NetAdmin.Domain.Attributes;
using NetAdmin.Domain.DbMaps.Dependency.Fields;
namespace NetAdmin.Domain.DbMaps.Dependency;
/// <inheritdoc />
@ -8,6 +5,7 @@ public abstract record VersionEntity : VersionEntity<long>
{
/// <inheritdoc cref="EntityBase{T}.Id" />
[Column(IsIdentity = false, IsPrimary = true, Position = 1)]
[CsvIgnore]
[Snowflake]
public override long Id { get; init; }
}
@ -20,25 +18,30 @@ public abstract record VersionEntity<T> : LiteVersionEntity<T>, IFieldModifiedUs
{
/// <inheritdoc />
[Column(CanUpdate = false, Position = -1)]
[CsvIgnore]
[JsonIgnore]
public virtual long? CreatedUserId { get; init; }
/// <inheritdoc />
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_31, CanUpdate = false, Position = -1)]
[CsvIgnore]
[JsonIgnore]
public virtual string CreatedUserName { get; init; }
/// <inheritdoc cref="EntityBase{T}.Id" />
[Column(IsIdentity = false, IsPrimary = true, Position = 1)]
[CsvIgnore]
public override T Id { get; init; }
/// <inheritdoc cref="IFieldModifiedUser.ModifiedUserId" />
[Column(CanInsert = false, Position = -1)]
[CsvIgnore]
[JsonIgnore]
public virtual long? ModifiedUserId { get; init; }
/// <inheritdoc cref="IFieldModifiedUser.ModifiedUserName" />
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_31, CanInsert = false, Position = -1)]
[CsvIgnore]
[JsonIgnore]
public virtual string ModifiedUserName { get; init; }
}

View File

@ -1,23 +1,23 @@
using NetAdmin.Domain.DbMaps.Dependency;
using NetAdmin.Domain.DbMaps.Dependency.Fields;
namespace NetAdmin.Domain.DbMaps.Sys;
/// <summary>
/// Api接口表
/// </summary>
[Table(Name = Chars.FLG_DB_TABLE_NAME_PREFIX + nameof(Sys_Api))]
[SqlIndex(Chars.FLG_DB_INDEX_PREFIX + nameof(PathCrc32), nameof(PathCrc32), true)]
public record Sys_Api : ImmutableEntity<string>, IFieldSummary
{
/// <summary>
/// 子节点
/// </summary>
[CsvIgnore]
[JsonIgnore]
[Navigate(nameof(ParentId))]
public IEnumerable<Sys_Api> Children { get; init; }
/// <inheritdoc cref="EntityBase{T}.Id" />
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_127, IsIdentity = false, IsPrimary = true, Position = 1)]
[CsvIgnore]
[JsonIgnore]
public override string Id { get; init; }
@ -25,6 +25,7 @@ public record Sys_Api : ImmutableEntity<string>, IFieldSummary
/// 请求方式
/// </summary>
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_15)]
[CsvIgnore]
[JsonIgnore]
public virtual string Method { get; init; }
@ -32,6 +33,7 @@ public record Sys_Api : ImmutableEntity<string>, IFieldSummary
/// 服务名称
/// </summary>
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_63)]
[CsvIgnore]
[JsonIgnore]
public virtual string Name { get; init; }
@ -39,6 +41,7 @@ public record Sys_Api : ImmutableEntity<string>, IFieldSummary
/// 命名空间
/// </summary>
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_31)]
[CsvIgnore]
[JsonIgnore]
#pragma warning disable CA1716
public virtual string Namespace { get; init; }
@ -48,12 +51,22 @@ public record Sys_Api : ImmutableEntity<string>, IFieldSummary
/// 父编号
/// </summary>
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_127)]
[CsvIgnore]
[JsonIgnore]
public virtual string ParentId { get; init; }
/// <summary>
/// 路径CRC32
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public virtual int PathCrc32 { get; init; }
/// <summary>
/// 角色集合
/// </summary>
[CsvIgnore]
[JsonIgnore]
[Navigate(ManyToMany = typeof(Sys_RoleApi))]
public ICollection<Sys_Role> Roles { get; init; }
@ -62,6 +75,7 @@ public record Sys_Api : ImmutableEntity<string>, IFieldSummary
/// 服务描述
/// </summary>
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_63)]
[CsvIgnore]
[JsonIgnore]
public virtual string Summary { get; init; }
}

View File

@ -1,6 +1,3 @@
using NetAdmin.Domain.DbMaps.Dependency;
using NetAdmin.Domain.DbMaps.Dependency.Fields;
namespace NetAdmin.Domain.DbMaps.Sys;
/// <summary>
@ -13,6 +10,7 @@ public record Sys_Config : VersionEntity, IFieldEnabled
/// 是否启用
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public virtual bool Enabled { get; init; }
@ -20,12 +18,14 @@ public record Sys_Config : VersionEntity, IFieldEnabled
/// 用户注册是否需要人工确认
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public virtual bool UserRegisterConfirm { get; init; }
/// <summary>
/// 用户注册默认部门
/// </summary>
[CsvIgnore]
[JsonIgnore]
[Navigate(nameof(UserRegisterDeptId))]
public Sys_Dept UserRegisterDept { get; init; }
@ -34,12 +34,14 @@ public record Sys_Config : VersionEntity, IFieldEnabled
/// 用户注册默认部门编号
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public virtual long UserRegisterDeptId { get; init; }
/// <summary>
/// 用户注册默认角色
/// </summary>
[CsvIgnore]
[JsonIgnore]
[Navigate(nameof(UserRegisterRoleId))]
public Sys_Role UserRegisterRole { get; init; }
@ -48,6 +50,7 @@ public record Sys_Config : VersionEntity, IFieldEnabled
/// 用户注册默认角色编号
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public virtual long UserRegisterRoleId { get; init; }
}

View File

@ -1,6 +1,3 @@
using NetAdmin.Domain.DbMaps.Dependency;
using NetAdmin.Domain.DbMaps.Dependency.Fields;
namespace NetAdmin.Domain.DbMaps.Sys;
/// <summary>
@ -12,6 +9,7 @@ public record Sys_Dept : VersionEntity, IFieldEnabled, IFieldSummary, IFieldSort
/// <summary>
/// 子节点
/// </summary>
[CsvIgnore]
[JsonIgnore]
[Navigate(nameof(ParentId))]
public IEnumerable<Sys_Dept> Children { get; init; }
@ -20,6 +18,7 @@ public record Sys_Dept : VersionEntity, IFieldEnabled, IFieldSummary, IFieldSort
/// 是否启用
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public virtual bool Enabled { get; init; }
@ -27,6 +26,7 @@ public record Sys_Dept : VersionEntity, IFieldEnabled, IFieldSummary, IFieldSort
/// 部门名称
/// </summary>
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_31)]
[CsvIgnore]
[JsonIgnore]
public virtual string Name { get; init; }
@ -34,12 +34,14 @@ public record Sys_Dept : VersionEntity, IFieldEnabled, IFieldSummary, IFieldSort
/// 父编号
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public virtual long ParentId { get; init; }
/// <summary>
/// 角色集合
/// </summary>
[CsvIgnore]
[JsonIgnore]
[Navigate(ManyToMany = typeof(Sys_RoleDept))]
public ICollection<Sys_Role> Roles { get; init; }
@ -47,6 +49,7 @@ public record Sys_Dept : VersionEntity, IFieldEnabled, IFieldSummary, IFieldSort
/// <summary>
/// 发送给此部门的站内信集合
/// </summary>
[CsvIgnore]
[JsonIgnore]
[Navigate(ManyToMany = typeof(Sys_SiteMsgDept))]
public ICollection<Sys_SiteMsg> SiteMsgs { get; init; }
@ -55,6 +58,7 @@ public record Sys_Dept : VersionEntity, IFieldEnabled, IFieldSummary, IFieldSort
/// 排序值,越大越前
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public virtual long Sort { get; init; }
@ -62,6 +66,7 @@ public record Sys_Dept : VersionEntity, IFieldEnabled, IFieldSummary, IFieldSort
/// 部门描述
/// </summary>
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)]
[CsvIgnore]
[JsonIgnore]
public virtual string Summary { get; init; }
}

View File

@ -1,17 +1,16 @@
using NetAdmin.Domain.DbMaps.Dependency;
namespace NetAdmin.Domain.DbMaps.Sys;
/// <summary>
/// 字典目录表
/// </summary>
[Index(Chars.FLG_DB_INDEX_PREFIX + nameof(Code), nameof(Code), true)]
[SqlIndex(Chars.FLG_DB_INDEX_PREFIX + nameof(Code), nameof(Code), true)]
[Table(Name = Chars.FLG_DB_TABLE_NAME_PREFIX + nameof(Sys_DicCatalog))]
public record Sys_DicCatalog : VersionEntity
{
/// <summary>
/// 子节点
/// </summary>
[CsvIgnore]
[JsonIgnore]
[Navigate(nameof(ParentId))]
public IEnumerable<Sys_DicCatalog> Children { get; init; }
@ -19,13 +18,15 @@ public record Sys_DicCatalog : VersionEntity
/// <summary>
/// 字典编码
/// </summary>
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_31)]
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_63)]
[CsvIgnore]
[JsonIgnore]
public virtual string Code { get; init; }
/// <summary>
/// 字典内容集合
/// </summary>
[CsvIgnore]
[JsonIgnore]
[Navigate(nameof(Sys_DicContent.CatalogId))]
public ICollection<Sys_DicContent> Contents { get; init; }
@ -33,7 +34,8 @@ public record Sys_DicCatalog : VersionEntity
/// <summary>
/// 字典名称
/// </summary>
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_31)]
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_63)]
[CsvIgnore]
[JsonIgnore]
public virtual string Name { get; init; }
@ -41,6 +43,7 @@ public record Sys_DicCatalog : VersionEntity
/// 父编号
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public virtual long ParentId { get; init; }
}

View File

@ -1,18 +1,16 @@
using NetAdmin.Domain.DbMaps.Dependency;
namespace NetAdmin.Domain.DbMaps.Sys;
/// <summary>
/// 字典内容表
/// </summary>
[Index($"{Chars.FLG_DB_INDEX_PREFIX}{nameof(CatalogId)}_{nameof(Key)}", $"{nameof(CatalogId)},{nameof(Key)}", true)]
[Index($"{Chars.FLG_DB_INDEX_PREFIX}{nameof(CatalogId)}_{nameof(Value)}", $"{nameof(CatalogId)},{nameof(Value)}", true)]
[SqlIndex($"{Chars.FLG_DB_INDEX_PREFIX}{nameof(CatalogId)}_{nameof(Key)}", $"{nameof(CatalogId)},{nameof(Key)}", true)]
[Table(Name = Chars.FLG_DB_TABLE_NAME_PREFIX + nameof(Sys_DicContent))]
public record Sys_DicContent : VersionEntity
{
/// <summary>
/// 字典目录
/// </summary>
[CsvIgnore]
[JsonIgnore]
[Navigate(nameof(CatalogId))]
public Sys_DicCatalog Catalog { get; init; }
@ -21,6 +19,7 @@ public record Sys_DicContent : VersionEntity
/// 字典目录编号
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public virtual long CatalogId { get; init; }
@ -28,6 +27,7 @@ public record Sys_DicContent : VersionEntity
/// 键名称
/// </summary>
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_63)]
[CsvIgnore]
[JsonIgnore]
public virtual string Key { get; init; }
@ -35,6 +35,7 @@ public record Sys_DicContent : VersionEntity
/// 键值
/// </summary>
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)]
[CsvIgnore]
[JsonIgnore]
public virtual string Value { get; init; }
}

View File

@ -1,5 +1,3 @@
using NetAdmin.Domain.DbMaps.Dependency;
using NetAdmin.Domain.DbMaps.Dependency.Fields;
using NetAdmin.Domain.Enums.Sys;
using HttpMethods = NetAdmin.Domain.Enums.HttpMethods;
@ -13,6 +11,7 @@ public record Sys_Job : VersionEntity, IFieldEnabled, IFieldSummary
{
/// <inheritdoc cref="IFieldEnabled.Enabled" />
[Column]
[CsvIgnore]
[JsonIgnore]
public virtual bool Enabled { get; init; }
@ -20,6 +19,7 @@ public record Sys_Job : VersionEntity, IFieldEnabled, IFieldSummary
/// 执行时间计划
/// </summary>
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_31)]
[CsvIgnore]
[JsonIgnore]
public virtual string ExecutionCron { get; init; }
@ -27,6 +27,7 @@ public record Sys_Job : VersionEntity, IFieldEnabled, IFieldSummary
/// 请求方法
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public virtual HttpMethods HttpMethod { get; init; }
@ -34,6 +35,7 @@ public record Sys_Job : VersionEntity, IFieldEnabled, IFieldSummary
/// 作业名称
/// </summary>
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_63)]
[CsvIgnore]
[JsonIgnore]
public virtual string JobName { get; init; }
@ -41,6 +43,7 @@ public record Sys_Job : VersionEntity, IFieldEnabled, IFieldSummary
/// 上次执行耗时
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public virtual long? LastDuration { get; init; }
@ -48,6 +51,7 @@ public record Sys_Job : VersionEntity, IFieldEnabled, IFieldSummary
/// 上次执行时间
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public virtual DateTime? LastExecTime { get; init; }
@ -55,13 +59,15 @@ public record Sys_Job : VersionEntity, IFieldEnabled, IFieldSummary
/// 上次执行状态
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public virtual HttpStatusCode? LastStatusCode { get; init; }
public HttpStatusCode? LastStatusCode { get; init; }
/// <summary>
/// 下次执行时间
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public virtual DateTime? NextExecTime { get; init; }
@ -69,9 +75,26 @@ public record Sys_Job : VersionEntity, IFieldEnabled, IFieldSummary
/// 下次执行时间编号
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public virtual long? NextTimeId { get; init; }
/// <summary>
/// 随机延时起始值(毫秒)
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public virtual int? RandomDelayBegin { get; init; }
/// <summary>
/// 随机延时结束值(毫秒)
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public virtual int? RandomDelayEnd { get; init; }
/// <summary>
/// 请求体
/// </summary>
@ -80,6 +103,7 @@ public record Sys_Job : VersionEntity, IFieldEnabled, IFieldSummary
#else
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)]
#endif
[CsvIgnore]
[JsonIgnore]
public virtual string RequestBody { get; init; }
@ -91,6 +115,7 @@ public record Sys_Job : VersionEntity, IFieldEnabled, IFieldSummary
#else
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)]
#endif
[CsvIgnore]
[JsonIgnore]
public virtual string RequestHeader { get; init; }
@ -102,6 +127,7 @@ public record Sys_Job : VersionEntity, IFieldEnabled, IFieldSummary
#else
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)]
#endif
[CsvIgnore]
[JsonIgnore]
public virtual string RequestUrl { get; init; }
@ -109,6 +135,7 @@ public record Sys_Job : VersionEntity, IFieldEnabled, IFieldSummary
/// 作业状态
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public virtual JobStatues Status { get; init; }
@ -118,12 +145,14 @@ public record Sys_Job : VersionEntity, IFieldEnabled, IFieldSummary
#else
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)]
#endif
[CsvIgnore]
[JsonIgnore]
public virtual string Summary { get; init; }
/// <summary>
/// 执行用户
/// </summary>
[CsvIgnore]
[JsonIgnore]
[Navigate(nameof(UserId))]
public Sys_User User { get; init; }
@ -132,6 +161,7 @@ public record Sys_Job : VersionEntity, IFieldEnabled, IFieldSummary
/// 执行用户编号
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public virtual long UserId { get; init; }
}

View File

@ -1,4 +1,3 @@
using NetAdmin.Domain.DbMaps.Dependency;
using HttpMethods = NetAdmin.Domain.Enums.HttpMethods;
namespace NetAdmin.Domain.DbMaps.Sys;
@ -6,10 +5,10 @@ namespace NetAdmin.Domain.DbMaps.Sys;
/// <summary>
/// 计划作业执行记录表
/// </summary>
[Index($"{Chars.FLG_DB_INDEX_PREFIX}{nameof(JobId)}_{nameof(TimeId)}", $"{nameof(JobId)},{nameof(TimeId)}", true)]
[Index(Chars.FLG_DB_INDEX_PREFIX + nameof(CreatedTime), nameof(CreatedTime), false)]
[Index(Chars.FLG_DB_INDEX_PREFIX + nameof(JobId), nameof(JobId), false)]
[Index(Chars.FLG_DB_INDEX_PREFIX + nameof(HttpStatusCode), nameof(HttpStatusCode), false)]
[SqlIndex($"{Chars.FLG_DB_INDEX_PREFIX}{nameof(JobId)}_{nameof(TimeId)}", $"{nameof(JobId)},{nameof(TimeId)}", true)]
[SqlIndex(Chars.FLG_DB_INDEX_PREFIX + nameof(CreatedTime), $"{nameof(CreatedTime)} DESC", false)]
[SqlIndex(Chars.FLG_DB_INDEX_PREFIX + nameof(JobId), nameof(JobId), false)]
[SqlIndex(Chars.FLG_DB_INDEX_PREFIX + nameof(HttpStatusCode), nameof(HttpStatusCode), false)]
[Table(Name = Chars.FLG_DB_TABLE_NAME_PREFIX + nameof(Sys_JobRecord))]
public record Sys_JobRecord : LiteImmutableEntity
{
@ -17,6 +16,7 @@ public record Sys_JobRecord : LiteImmutableEntity
/// 执行耗时(毫秒)
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public virtual long Duration { get; init; }
@ -24,6 +24,7 @@ public record Sys_JobRecord : LiteImmutableEntity
/// 请求方法
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public virtual HttpMethods HttpMethod { get; init; }
@ -31,12 +32,14 @@ public record Sys_JobRecord : LiteImmutableEntity
/// HTTP 状态码
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public int HttpStatusCode { get; init; }
/// <summary>
/// 拥有者信息
/// </summary>
[CsvIgnore]
[JsonIgnore]
[Navigate(nameof(JobId))]
public Sys_Job Job { get; init; }
@ -45,6 +48,7 @@ public record Sys_JobRecord : LiteImmutableEntity
/// 作业编号
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public virtual long JobId { get; init; }
@ -56,6 +60,7 @@ public record Sys_JobRecord : LiteImmutableEntity
#else
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)]
#endif
[CsvIgnore]
[JsonIgnore]
public virtual string RequestBody { get; init; }
@ -67,6 +72,7 @@ public record Sys_JobRecord : LiteImmutableEntity
#else
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)]
#endif
[CsvIgnore]
[JsonIgnore]
public virtual string RequestHeader { get; init; }
@ -74,6 +80,7 @@ public record Sys_JobRecord : LiteImmutableEntity
/// 请求的网络地址
/// </summary>
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_127)]
[CsvIgnore]
[JsonIgnore]
public virtual string RequestUrl { get; init; }
@ -85,6 +92,7 @@ public record Sys_JobRecord : LiteImmutableEntity
#else
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)]
#endif
[CsvIgnore]
[JsonIgnore]
public virtual string ResponseBody { get; init; }
@ -96,6 +104,7 @@ public record Sys_JobRecord : LiteImmutableEntity
#else
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)]
#endif
[CsvIgnore]
[JsonIgnore]
public virtual string ResponseHeader { get; init; }
@ -103,6 +112,7 @@ public record Sys_JobRecord : LiteImmutableEntity
/// 执行时间编号
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public virtual long TimeId { get; init; }
}

View File

@ -0,0 +1,150 @@
namespace NetAdmin.Domain.DbMaps.Sys;
/// <summary>
/// 登录日志表
/// </summary>
[SqlIndex(Chars.FLG_DB_INDEX_PREFIX + nameof(CreatedTime), $"{nameof(CreatedTime)} DESC", false)]
[SqlIndex(Chars.FLG_DB_INDEX_PREFIX + nameof(HttpStatusCode), nameof(HttpStatusCode), false)]
[SqlIndex(Chars.FLG_DB_INDEX_PREFIX + nameof(OwnerId), nameof(OwnerId), false)]
[Table(Name = Chars.FLG_DB_TABLE_NAME_PREFIX + nameof(Sys_LoginLog))]
public record Sys_LoginLog : SimpleEntity, IFieldCreatedTime, IFieldOwner, IFieldCreatedClientIp
, IFieldCreatedClientUserAgent
{
/// <inheritdoc />
[Column]
[CsvIgnore]
[JsonIgnore]
public virtual int? CreatedClientIp { get; init; }
/// <inheritdoc />
[Column(ServerTime = DateTimeKind.Local, CanUpdate = false, Position = -1)]
[CsvIgnore]
[JsonIgnore]
public virtual DateTime CreatedTime { get; init; }
/// <inheritdoc />
#if DBTYPE_SQLSERVER
[Column(Position = -1, DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_1022)]
#else
[Column(Position = -1, DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)]
#endif
[CsvIgnore]
[JsonIgnore]
public virtual string CreatedUserAgent { get; init; }
/// <summary>
/// 执行耗时(毫秒)
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public virtual int Duration { get; init; }
/// <summary>
/// 程序响应码
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public virtual ErrorCodes ErrorCode { get; init; }
/// <summary>
/// HTTP状态码
/// </summary>
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_SMALL_INT)]
[CsvIgnore]
[JsonIgnore]
public virtual int HttpStatusCode { get; init; }
/// <summary>
/// 登录用户名
/// </summary>
[Column(Position = -1, DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_63)]
[CsvIgnore]
[JsonIgnore]
public virtual string LoginUserName { get; init; }
/// <summary>
/// 拥有者
/// </summary>
[CsvIgnore]
[JsonIgnore]
[Navigate(nameof(OwnerId))]
public Sys_User Owner { get; init; }
/// <inheritdoc />
[Column]
[CsvIgnore]
[JsonIgnore]
public virtual long? OwnerDeptId { get; init; }
/// <inheritdoc />
[Column]
[CsvIgnore]
[JsonIgnore]
public virtual long? OwnerId { get; init; }
/// <summary>
/// 请求内容
/// </summary>
#if DBTYPE_SQLSERVER
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_MAX)]
#else
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)]
#endif
[CsvIgnore]
[JsonIgnore]
public virtual string RequestBody { get; init; }
/// <summary>
/// 请求头信息
/// </summary>
#if DBTYPE_SQLSERVER
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_MAX)]
#else
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)]
#endif
[CsvIgnore]
[JsonIgnore]
public virtual string RequestHeaders { get; init; }
/// <summary>
/// 请求地址
/// </summary>
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_127)]
[CsvIgnore]
[JsonIgnore]
public virtual string RequestUrl { get; init; }
/// <summary>
/// 响应内容
/// </summary>
#if DBTYPE_SQLSERVER
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_MAX)]
#else
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)]
#endif
[CsvIgnore]
[JsonIgnore]
public virtual string ResponseBody { get; init; }
/// <summary>
/// 响应头
/// </summary>
#if DBTYPE_SQLSERVER
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_MAX)]
#else
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)]
#endif
[CsvIgnore]
[JsonIgnore]
public virtual string ResponseHeaders { get; init; }
/// <summary>
/// 服务器IP
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public virtual int? ServerIp { get; init; }
}

View File

@ -1,5 +1,3 @@
using NetAdmin.Domain.DbMaps.Dependency;
using NetAdmin.Domain.DbMaps.Dependency.Fields;
using NetAdmin.Domain.Enums.Sys;
namespace NetAdmin.Domain.DbMaps.Sys;
@ -7,7 +5,7 @@ namespace NetAdmin.Domain.DbMaps.Sys;
/// <summary>
/// 菜单表
/// </summary>
[Index(Chars.FLG_DB_INDEX_PREFIX + nameof(Name), nameof(Name), true)]
[SqlIndex(Chars.FLG_DB_INDEX_PREFIX + nameof(Name), nameof(Name), true)]
[Table(Name = Chars.FLG_DB_TABLE_NAME_PREFIX + nameof(Sys_Menu))]
public record Sys_Menu : VersionEntity, IFieldSort
{
@ -15,12 +13,14 @@ public record Sys_Menu : VersionEntity, IFieldSort
/// 子节点或详情页需要高亮的上级菜单路由地址
/// </summary>
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_127)]
[CsvIgnore]
[JsonIgnore]
public virtual string Active { get; init; }
/// <summary>
/// 子节点
/// </summary>
[CsvIgnore]
[JsonIgnore]
[Navigate(nameof(ParentId))]
public IEnumerable<Sys_Menu> Children { get; init; }
@ -29,6 +29,7 @@ public record Sys_Menu : VersionEntity, IFieldSort
/// 背景颜色
/// </summary>
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_7)]
[CsvIgnore]
[JsonIgnore]
public virtual string Color { get; init; }
@ -36,6 +37,7 @@ public record Sys_Menu : VersionEntity, IFieldSort
/// 组件
/// </summary>
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_63)]
[CsvIgnore]
[JsonIgnore]
public virtual string Component { get; init; }
@ -43,6 +45,7 @@ public record Sys_Menu : VersionEntity, IFieldSort
/// 是否整页路由
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public virtual bool FullPageRouting { get; init; }
@ -50,6 +53,7 @@ public record Sys_Menu : VersionEntity, IFieldSort
/// 是否隐藏菜单
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public virtual bool Hidden { get; init; }
@ -57,6 +61,7 @@ public record Sys_Menu : VersionEntity, IFieldSort
/// 是否隐藏面包屑
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public virtual bool HiddenBreadCrumb { get; init; }
@ -64,6 +69,7 @@ public record Sys_Menu : VersionEntity, IFieldSort
/// 图标
/// </summary>
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_31)]
[CsvIgnore]
[JsonIgnore]
public virtual string Icon { get; init; }
@ -71,6 +77,7 @@ public record Sys_Menu : VersionEntity, IFieldSort
/// 菜单名称
/// </summary>
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_63)]
[CsvIgnore]
[JsonIgnore]
public virtual string Name { get; init; }
@ -78,6 +85,7 @@ public record Sys_Menu : VersionEntity, IFieldSort
/// 父编号
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public virtual long ParentId { get; init; }
@ -85,6 +93,7 @@ public record Sys_Menu : VersionEntity, IFieldSort
/// 菜单路径
/// </summary>
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_127)]
[CsvIgnore]
[JsonIgnore]
public virtual string Path { get; init; }
@ -92,12 +101,14 @@ public record Sys_Menu : VersionEntity, IFieldSort
/// 重定向地址
/// </summary>
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_127)]
[CsvIgnore]
[JsonIgnore]
public virtual string Redirect { get; init; }
/// <summary>
/// 拥有此菜单的角色集合
/// </summary>
[CsvIgnore]
[JsonIgnore]
[Navigate(ManyToMany = typeof(Sys_RoleMenu))]
public ICollection<Sys_Role> Roles { get; init; }
@ -106,6 +117,7 @@ public record Sys_Menu : VersionEntity, IFieldSort
/// 排序值,越大越前
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public virtual long Sort { get; init; }
@ -113,6 +125,7 @@ public record Sys_Menu : VersionEntity, IFieldSort
/// 标签
/// </summary>
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_31)]
[CsvIgnore]
[JsonIgnore]
public virtual string Tag { get; init; }
@ -120,6 +133,7 @@ public record Sys_Menu : VersionEntity, IFieldSort
/// 菜单标题
/// </summary>
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_63)]
[CsvIgnore]
[JsonIgnore]
public virtual string Title { get; init; }
@ -127,6 +141,7 @@ public record Sys_Menu : VersionEntity, IFieldSort
/// 菜单类型
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public virtual MenuTypes Type { get; init; }
}

View File

@ -1,173 +1,104 @@
using NetAdmin.Domain.DbMaps.Dependency;
using NetAdmin.Domain.DbMaps.Dependency.Fields;
using HttpMethods = NetAdmin.Domain.Enums.HttpMethods;
namespace NetAdmin.Domain.DbMaps.Sys;
/// <summary>
/// 请求日志表
/// </summary>
[Index(Chars.FLG_DB_INDEX_PREFIX + nameof(ApiId), nameof(ApiId), false)]
[Index(Chars.FLG_DB_INDEX_PREFIX + nameof(CreatedTime), nameof(CreatedTime), false)]
[Index(Chars.FLG_DB_INDEX_PREFIX + nameof(UserId), nameof(UserId), false)]
[Index(Chars.FLG_DB_INDEX_PREFIX + nameof(HttpStatusCode), nameof(HttpStatusCode), false)]
[Table(Name = Chars.FLG_DB_TABLE_NAME_PREFIX + nameof(Sys_RequestLog))]
public record Sys_RequestLog : SimpleEntity, IFieldCreatedTime, IFieldCreatedClient
[SqlIndex(Chars.FLG_DB_INDEX_PREFIX + nameof(ApiPathCrc32), nameof(ApiPathCrc32), false)]
[SqlIndex(Chars.FLG_DB_INDEX_PREFIX + nameof(CreatedTime), $"{nameof(CreatedTime)} DESC", false)]
[SqlIndex(Chars.FLG_DB_INDEX_PREFIX + nameof(OwnerId), nameof(OwnerId), false)]
[SqlIndex(Chars.FLG_DB_INDEX_PREFIX + nameof(HttpStatusCode), nameof(HttpStatusCode), false)]
[Table( //
Name = $"{Chars.FLG_DB_TABLE_NAME_PREFIX}{nameof(Sys_RequestLog)}_{{yyyyMMdd}}"
, AsTable = $"{nameof(CreatedTime)}=2024-1-1(1 day)")]
public record Sys_RequestLog : SimpleEntity, IFieldCreatedTime, IFieldOwner, IFieldCreatedClientIp
{
/// <summary>
/// 接口
/// </summary>
[CsvIgnore]
[JsonIgnore]
[Navigate(nameof(ApiId))]
[Navigate(nameof(ApiPathCrc32), TempPrimary = nameof(Sys_Api.PathCrc32))]
public Sys_Api Api { get; init; }
/// <summary>
/// 接口编号
/// 接口路径CRC32
/// </summary>
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_127)]
[Column]
[CsvIgnore]
[JsonIgnore]
public virtual string ApiId { get; init; }
public virtual int ApiPathCrc32 { get; init; }
/// <inheritdoc />
[Column(Position = -1)]
[Column]
[CsvIgnore]
[JsonIgnore]
public int? CreatedClientIp { get; init; }
public virtual int? CreatedClientIp { get; init; }
/// <inheritdoc />
[Column(ServerTime = DateTimeKind.Local, CanUpdate = false, Position = -1)]
[CsvIgnore]
[JsonIgnore]
public virtual DateTime CreatedTime { get; init; }
/// <inheritdoc />
#if DBTYPE_SQLSERVER
[Column(Position = -1, DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_1022)]
#else
[Column(Position = -1, DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)]
#endif
/// <summary>
/// 明细
/// </summary>
[CsvIgnore]
[JsonIgnore]
public virtual string CreatedUserAgent { get; init; }
[Navigate(nameof(Id))]
public Sys_RequestLogDetail Detail { get; init; }
/// <summary>
/// 执行耗时(秒)
/// 执行耗时(秒)
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public virtual long Duration { get; init; }
/// <summary>
/// 程序响应码
/// </summary>
[Column]
[JsonIgnore]
public virtual ErrorCodes ErrorCode { get; init; }
/// <summary>
/// 异常信息
/// </summary>
#if DBTYPE_SQLSERVER
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_MAX)]
#else
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)]
#endif
[JsonIgnore]
public virtual string Exception { get; init; }
/// <summary>
/// HTTP状态码
/// </summary>
[Column]
[JsonIgnore]
public virtual int HttpStatusCode { get; init; }
public virtual int Duration { get; init; }
/// <summary>
/// 请求方法
/// </summary>
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_15)]
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_TINY_INT)]
[CsvIgnore]
[JsonIgnore]
public virtual string Method { get; init; }
public virtual HttpMethods HttpMethod { get; init; }
/// <summary>
/// 请求内容
/// HTTP状态码
/// </summary>
#if DBTYPE_SQLSERVER
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_MAX)]
#else
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)]
#endif
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_SMALL_INT)]
[CsvIgnore]
[JsonIgnore]
public virtual string RequestBody { get; init; }
public virtual int HttpStatusCode { get; init; }
/// <summary>
/// 请求content-type
/// 拥有者
/// </summary>
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_63)]
[CsvIgnore]
[JsonIgnore]
public virtual string RequestContentType { get; init; }
[Navigate(nameof(OwnerId))]
public Sys_User Owner { get; init; }
/// <inheritdoc />
[Column]
[CsvIgnore]
[JsonIgnore]
public virtual long? OwnerDeptId { get; init; }
/// <inheritdoc />
[Column]
[CsvIgnore]
[JsonIgnore]
public virtual long? OwnerId { get; init; }
/// <summary>
/// 请求头信息
/// </summary>
#if DBTYPE_SQLSERVER
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_MAX)]
#else
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)]
#endif
[JsonIgnore]
public virtual string RequestHeaders { get; init; }
/// <summary>
/// 请求地址
/// </summary>
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_127)]
[JsonIgnore]
public virtual string RequestUrl { get; init; }
/// <summary>
/// 响应内容
/// </summary>
#if DBTYPE_SQLSERVER
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_MAX)]
#else
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)]
#endif
[JsonIgnore]
public virtual string ResponseBody { get; init; }
/// <summary>
/// 响应content-type
/// </summary>
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_63)]
[JsonIgnore]
public virtual string ResponseContentType { get; init; }
/// <summary>
/// 响应头
/// </summary>
#if DBTYPE_SQLSERVER
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_MAX)]
#else
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)]
#endif
[JsonIgnore]
public virtual string ResponseHeaders { get; init; }
/// <summary>
/// 服务器IP
/// 请求跟踪标识
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public virtual int? ServerIp { get; init; }
/// <summary>
/// 用户
/// </summary>
[JsonIgnore]
[Navigate(nameof(UserId))]
public Sys_User User { get; init; }
/// <summary>
/// 用户编号
/// </summary>
[Column]
[JsonIgnore]
public virtual long? UserId { get; init; }
public virtual Guid TraceId { get; init; }
}

View File

@ -0,0 +1,125 @@
namespace NetAdmin.Domain.DbMaps.Sys;
/// <summary>
/// 请求日志明细表
/// </summary>
[Table(Name = Chars.FLG_DB_TABLE_NAME_PREFIX + nameof(Sys_RequestLogDetail))]
[SqlIndex(Chars.FLG_DB_INDEX_PREFIX + nameof(CreatedTime), $"{nameof(CreatedTime)} DESC", false)]
public record Sys_RequestLogDetail : SimpleEntity, IFieldCreatedTime, IFieldCreatedClientUserAgent
{
/// <inheritdoc />
[Column(ServerTime = DateTimeKind.Local, CanUpdate = false, Position = -1)]
[CsvIgnore]
[JsonIgnore]
public virtual DateTime CreatedTime { get; init; }
/// <inheritdoc />
#if DBTYPE_SQLSERVER
[Column(Position = -1, DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_1022)]
#else
[Column(Position = -1, DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)]
#endif
[CsvIgnore]
[JsonIgnore]
public virtual string CreatedUserAgent { get; init; }
/// <summary>
/// 程序响应码
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public virtual ErrorCodes ErrorCode { get; init; }
/// <summary>
/// 异常信息
/// </summary>
#if DBTYPE_SQLSERVER
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_MAX)]
#else
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)]
#endif
[CsvIgnore]
[JsonIgnore]
public virtual string Exception { get; init; }
/// <summary>
/// 请求内容
/// </summary>
#if DBTYPE_SQLSERVER
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_MAX)]
#else
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)]
#endif
[CsvIgnore]
[JsonIgnore]
public virtual string RequestBody { get; init; }
/// <summary>
/// 请求content-type
/// </summary>
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_63)]
[CsvIgnore]
[JsonIgnore]
public virtual string RequestContentType { get; init; }
/// <summary>
/// 请求头信息
/// </summary>
#if DBTYPE_SQLSERVER
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_MAX)]
#else
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)]
#endif
[CsvIgnore]
[JsonIgnore]
public virtual string RequestHeaders { get; init; }
/// <summary>
/// 请求地址
/// </summary>
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_127)]
[CsvIgnore]
[JsonIgnore]
public virtual string RequestUrl { get; init; }
/// <summary>
/// 响应内容
/// </summary>
#if DBTYPE_SQLSERVER
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_MAX)]
#else
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)]
#endif
[CsvIgnore]
[JsonIgnore]
public virtual string ResponseBody { get; init; }
/// <summary>
/// 响应content-type
/// </summary>
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_63)]
[CsvIgnore]
[JsonIgnore]
public virtual string ResponseContentType { get; init; }
/// <summary>
/// 响应头
/// </summary>
#if DBTYPE_SQLSERVER
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_MAX)]
#else
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)]
#endif
[CsvIgnore]
[JsonIgnore]
public virtual string ResponseHeaders { get; init; }
/// <summary>
/// 服务器IP
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public virtual int? ServerIp { get; init; }
}

View File

@ -1,5 +1,3 @@
using NetAdmin.Domain.DbMaps.Dependency;
using NetAdmin.Domain.DbMaps.Dependency.Fields;
using NetAdmin.Domain.Dto.Sys.Role;
using NetAdmin.Domain.Enums.Sys;
@ -8,27 +6,42 @@ namespace NetAdmin.Domain.DbMaps.Sys;
/// <summary>
/// 角色表
/// </summary>
[Index(Chars.FLG_DB_INDEX_PREFIX + nameof(Name), nameof(Name), true)]
[SqlIndex(Chars.FLG_DB_INDEX_PREFIX + nameof(Name), nameof(Name), true)]
[Table(Name = Chars.FLG_DB_TABLE_NAME_PREFIX + nameof(Sys_Role))]
public record Sys_Role : VersionEntity, IFieldSort, IFieldEnabled, IFieldSummary, IRegister
{
/// <summary>
/// 角色-接口映射
/// </summary>
[CsvIgnore]
[JsonIgnore]
[Navigate(ManyToMany = typeof(Sys_RoleApi))]
public ICollection<Sys_Api> Apis { get; init; }
/// <summary>
/// 仪表板布局
/// </summary>
#if DBTYPE_SQLSERVER
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_MAX)]
#else
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)]
#endif
[CsvIgnore]
[JsonIgnore]
public virtual string DashboardLayout { get; set; }
/// <summary>
/// 数据范围
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public virtual DataScopes DataScope { get; init; }
/// <summary>
/// 角色-部门映射
/// </summary>
[CsvIgnore]
[JsonIgnore]
[Navigate(ManyToMany = typeof(Sys_RoleDept))]
public ICollection<Sys_Dept> Depts { get; init; }
@ -37,6 +50,7 @@ public record Sys_Role : VersionEntity, IFieldSort, IFieldEnabled, IFieldSummary
/// 是否显示仪表板
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public virtual bool DisplayDashboard { get; init; }
@ -44,6 +58,7 @@ public record Sys_Role : VersionEntity, IFieldSort, IFieldEnabled, IFieldSummary
/// 是否启用
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public virtual bool Enabled { get; init; }
@ -51,12 +66,14 @@ public record Sys_Role : VersionEntity, IFieldSort, IFieldEnabled, IFieldSummary
/// 是否忽略权限控制
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public virtual bool IgnorePermissionControl { get; init; }
/// <summary>
/// 角色-菜单映射
/// </summary>
[CsvIgnore]
[JsonIgnore]
[Navigate(ManyToMany = typeof(Sys_RoleMenu))]
public ICollection<Sys_Menu> Menus { get; init; }
@ -65,12 +82,14 @@ public record Sys_Role : VersionEntity, IFieldSort, IFieldEnabled, IFieldSummary
/// 角色名称
/// </summary>
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_31)]
[CsvIgnore]
[JsonIgnore]
public virtual string Name { get; init; }
/// <summary>
/// 发送给此角色的站内信集合
/// </summary>
[CsvIgnore]
[JsonIgnore]
[Navigate(ManyToMany = typeof(Sys_SiteMsgRole))]
public ICollection<Sys_SiteMsg> SiteMsgs { get; init; }
@ -79,6 +98,7 @@ public record Sys_Role : VersionEntity, IFieldSort, IFieldEnabled, IFieldSummary
/// 排序值,越大越前
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public virtual long Sort { get; init; }
@ -86,18 +106,20 @@ public record Sys_Role : VersionEntity, IFieldSort, IFieldEnabled, IFieldSummary
/// 备注
/// </summary>
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)]
[CsvIgnore]
[JsonIgnore]
public virtual string Summary { get; init; }
/// <summary>
/// 此角色下的用户集合
/// </summary>
[CsvIgnore]
[JsonIgnore]
[Navigate(ManyToMany = typeof(Sys_UserRole))]
public ICollection<Sys_User> Users { get; init; }
/// <inheritdoc />
public void Register(TypeAdapterConfig config)
public virtual void Register(TypeAdapterConfig config)
{
_ = config.ForType<CreateRoleReq, Sys_Role>()
.Map( //

View File

@ -1,5 +1,3 @@
using NetAdmin.Domain.DbMaps.Dependency;
namespace NetAdmin.Domain.DbMaps.Sys;
/// <summary>
@ -11,6 +9,7 @@ public record Sys_RoleApi : ImmutableEntity
/// <summary>
/// 关联的接口
/// </summary>
[CsvIgnore]
[JsonIgnore]
public Sys_Api Api { get; init; }
@ -18,12 +17,14 @@ public record Sys_RoleApi : ImmutableEntity
/// 接口编号
/// </summary>
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_127)]
[CsvIgnore]
[JsonIgnore]
public string ApiId { get; init; }
/// <summary>
/// 关联的角色
/// </summary>
[CsvIgnore]
[JsonIgnore]
public Sys_Role Role { get; init; }
@ -31,6 +32,7 @@ public record Sys_RoleApi : ImmutableEntity
/// 角色编号
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public long RoleId { get; init; }
}

View File

@ -1,17 +1,16 @@
using NetAdmin.Domain.DbMaps.Dependency;
namespace NetAdmin.Domain.DbMaps.Sys;
/// <summary>
/// 角色-部门映射表
/// </summary>
[Index($"{Chars.FLG_DB_INDEX_PREFIX}{nameof(RoleId)}_{nameof(DeptId)}", $"{nameof(RoleId)},{nameof(DeptId)}", true)]
[SqlIndex($"{Chars.FLG_DB_INDEX_PREFIX}{nameof(RoleId)}_{nameof(DeptId)}", $"{nameof(RoleId)},{nameof(DeptId)}", true)]
[Table(Name = Chars.FLG_DB_TABLE_NAME_PREFIX + nameof(Sys_RoleDept))]
public record Sys_RoleDept : ImmutableEntity
{
/// <summary>
/// 关联的部门
/// </summary>
[CsvIgnore]
[JsonIgnore]
public Sys_Dept Dept { get; init; }
@ -19,12 +18,14 @@ public record Sys_RoleDept : ImmutableEntity
/// 可访问的部门编号
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public long DeptId { get; init; }
/// <summary>
/// 关联的角色
/// </summary>
[CsvIgnore]
[JsonIgnore]
public Sys_Role Role { get; init; }
@ -32,6 +33,7 @@ public record Sys_RoleDept : ImmutableEntity
/// 角色编号
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public long RoleId { get; init; }
}

View File

@ -1,17 +1,16 @@
using NetAdmin.Domain.DbMaps.Dependency;
namespace NetAdmin.Domain.DbMaps.Sys;
/// <summary>
/// 角色-菜单映射表
/// </summary>
[Index($"{Chars.FLG_DB_INDEX_PREFIX}{nameof(RoleId)}_{nameof(MenuId)}", $"{nameof(RoleId)},{nameof(MenuId)}", true)]
[SqlIndex($"{Chars.FLG_DB_INDEX_PREFIX}{nameof(RoleId)}_{nameof(MenuId)}", $"{nameof(RoleId)},{nameof(MenuId)}", true)]
[Table(Name = Chars.FLG_DB_TABLE_NAME_PREFIX + nameof(Sys_RoleMenu))]
public record Sys_RoleMenu : ImmutableEntity
{
/// <summary>
/// 关联的菜单
/// </summary>
[CsvIgnore]
[JsonIgnore]
public Sys_Menu Menu { get; init; }
@ -19,12 +18,14 @@ public record Sys_RoleMenu : ImmutableEntity
/// 菜单编号
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public virtual long MenuId { get; init; }
/// <summary>
/// 关联的角色
/// </summary>
[CsvIgnore]
[JsonIgnore]
public Sys_Role Role { get; init; }
@ -32,6 +33,7 @@ public record Sys_RoleMenu : ImmutableEntity
/// 角色编号
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public virtual long RoleId { get; init; }
}

View File

@ -1,5 +1,3 @@
using NetAdmin.Domain.DbMaps.Dependency;
using NetAdmin.Domain.DbMaps.Dependency.Fields;
using NetAdmin.Domain.Dto.Sys.SiteMsg;
using NetAdmin.Domain.Enums.Sys;
@ -19,12 +17,14 @@ public record Sys_SiteMsg : VersionEntity, IRegister, IFieldSummary
#else
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)]
#endif
[CsvIgnore]
[JsonIgnore]
public virtual string Content { get; init; }
/// <summary>
/// 消息-创建者映射
/// </summary>
[CsvIgnore]
[JsonIgnore]
[Navigate(nameof(CreatedUserId))]
public Sys_User Creator { get; init; }
@ -32,6 +32,7 @@ public record Sys_SiteMsg : VersionEntity, IRegister, IFieldSummary
/// <summary>
/// 消息-部门映射
/// </summary>
[CsvIgnore]
[JsonIgnore]
[Navigate(ManyToMany = typeof(Sys_SiteMsgDept))]
public ICollection<Sys_Dept> Depts { get; init; }
@ -39,6 +40,7 @@ public record Sys_SiteMsg : VersionEntity, IRegister, IFieldSummary
/// <summary>
/// 消息-标记映射
/// </summary>
[CsvIgnore]
[JsonIgnore]
[Navigate(nameof(Sys_SiteMsgFlag.SiteMsgId))]
public ICollection<Sys_SiteMsgFlag> Flags { get; init; }
@ -46,12 +48,14 @@ public record Sys_SiteMsg : VersionEntity, IRegister, IFieldSummary
/// <summary>
/// 消息类型
/// </summary>
[CsvIgnore]
[JsonIgnore]
public virtual SiteMsgTypes MsgType { get; init; }
/// <summary>
/// 消息-角色映射
/// </summary>
[CsvIgnore]
[JsonIgnore]
[Navigate(ManyToMany = typeof(Sys_SiteMsgRole))]
public ICollection<Sys_Role> Roles { get; init; }
@ -60,6 +64,7 @@ public record Sys_SiteMsg : VersionEntity, IRegister, IFieldSummary
/// 消息摘要
/// </summary>
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)]
[CsvIgnore]
[JsonIgnore]
public virtual string Summary { get; init; }
@ -67,12 +72,14 @@ public record Sys_SiteMsg : VersionEntity, IRegister, IFieldSummary
/// 消息主题
/// </summary>
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)]
[CsvIgnore]
[JsonIgnore]
public virtual string Title { get; init; }
/// <summary>
/// 消息-用户映射
/// </summary>
[CsvIgnore]
[JsonIgnore]
[Navigate(ManyToMany = typeof(Sys_SiteMsgUser))]
public ICollection<Sys_User> Users { get; init; }

View File

@ -1,18 +1,17 @@
using NetAdmin.Domain.DbMaps.Dependency;
namespace NetAdmin.Domain.DbMaps.Sys;
/// <summary>
/// 站内信-部门映射表
/// </summary>
[Index($"{Chars.FLG_DB_INDEX_PREFIX}{nameof(DeptId)}_{nameof(SiteMsgId)}", $"{nameof(DeptId)},{nameof(SiteMsgId)}"
, true)]
[SqlIndex($"{Chars.FLG_DB_INDEX_PREFIX}{nameof(DeptId)}_{nameof(SiteMsgId)}", $"{nameof(DeptId)},{nameof(SiteMsgId)}"
, true)]
[Table(Name = Chars.FLG_DB_TABLE_NAME_PREFIX + nameof(Sys_SiteMsgDept))]
public record Sys_SiteMsgDept : ImmutableEntity
{
/// <summary>
/// 关联的部门
/// </summary>
[CsvIgnore]
[JsonIgnore]
public Sys_Dept Dept { get; init; }
@ -20,12 +19,14 @@ public record Sys_SiteMsgDept : ImmutableEntity
/// 部门编号
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public long DeptId { get; init; }
/// <summary>
/// 关联的站内信
/// </summary>
[CsvIgnore]
[JsonIgnore]
public Sys_SiteMsg SiteMsg { get; init; }
@ -33,6 +34,7 @@ public record Sys_SiteMsgDept : ImmutableEntity
/// 站内信编号
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public long SiteMsgId { get; init; }
}

View File

@ -1,4 +1,3 @@
using NetAdmin.Domain.DbMaps.Dependency;
using NetAdmin.Domain.Enums.Sys;
namespace NetAdmin.Domain.DbMaps.Sys;
@ -6,8 +5,8 @@ namespace NetAdmin.Domain.DbMaps.Sys;
/// <summary>
/// 站内信标记表
/// </summary>
[Index($"{Chars.FLG_DB_INDEX_PREFIX}{nameof(SiteMsgId)}_{nameof(UserId)}", $"{nameof(SiteMsgId)},{nameof(UserId)}"
, true)]
[SqlIndex($"{Chars.FLG_DB_INDEX_PREFIX}{nameof(SiteMsgId)}_{nameof(UserId)}", $"{nameof(SiteMsgId)},{nameof(UserId)}"
, true)]
[Table(Name = Chars.FLG_DB_TABLE_NAME_PREFIX + nameof(Sys_SiteMsgFlag))]
public record Sys_SiteMsgFlag : MutableEntity
{
@ -15,6 +14,7 @@ public record Sys_SiteMsgFlag : MutableEntity
/// 站内信编号
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public virtual long SiteMsgId { get; init; }
@ -22,6 +22,7 @@ public record Sys_SiteMsgFlag : MutableEntity
/// 用户编号
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public long UserId { get; init; }
@ -29,6 +30,7 @@ public record Sys_SiteMsgFlag : MutableEntity
/// 用户站内信状态
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public virtual UserSiteMsgStatues UserSiteMsgStatus { get; init; }
}

View File

@ -1,18 +1,17 @@
using NetAdmin.Domain.DbMaps.Dependency;
namespace NetAdmin.Domain.DbMaps.Sys;
/// <summary>
/// 站内信-角色映射表
/// </summary>
[Index($"{Chars.FLG_DB_INDEX_PREFIX}{nameof(RoleId)}_{nameof(SiteMsgId)}", $"{nameof(RoleId)},{nameof(SiteMsgId)}"
, true)]
[SqlIndex($"{Chars.FLG_DB_INDEX_PREFIX}{nameof(RoleId)}_{nameof(SiteMsgId)}", $"{nameof(RoleId)},{nameof(SiteMsgId)}"
, true)]
[Table(Name = Chars.FLG_DB_TABLE_NAME_PREFIX + nameof(Sys_SiteMsgRole))]
public record Sys_SiteMsgRole : ImmutableEntity
{
/// <summary>
/// 关联的角色
/// </summary>
[CsvIgnore]
[JsonIgnore]
public Sys_Role Role { get; init; }
@ -20,12 +19,14 @@ public record Sys_SiteMsgRole : ImmutableEntity
/// 角色编号
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public long RoleId { get; init; }
/// <summary>
/// 关联的站内信
/// </summary>
[CsvIgnore]
[JsonIgnore]
public Sys_SiteMsg SiteMsg { get; init; }
@ -33,6 +34,7 @@ public record Sys_SiteMsgRole : ImmutableEntity
/// 站内信编号
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public long SiteMsgId { get; init; }
}

View File

@ -1,18 +1,17 @@
using NetAdmin.Domain.DbMaps.Dependency;
namespace NetAdmin.Domain.DbMaps.Sys;
/// <summary>
/// 站内信-用户映射表
/// </summary>
[Index($"{Chars.FLG_DB_INDEX_PREFIX}{nameof(UserId)}_{nameof(SiteMsgId)}", $"{nameof(UserId)},{nameof(SiteMsgId)}"
, true)]
[SqlIndex($"{Chars.FLG_DB_INDEX_PREFIX}{nameof(UserId)}_{nameof(SiteMsgId)}", $"{nameof(UserId)},{nameof(SiteMsgId)}"
, true)]
[Table(Name = Chars.FLG_DB_TABLE_NAME_PREFIX + nameof(Sys_SiteMsgUser))]
public record Sys_SiteMsgUser : ImmutableEntity
{
/// <summary>
/// 关联的站内信
/// </summary>
[CsvIgnore]
[JsonIgnore]
public Sys_SiteMsg SiteMsg { get; init; }
@ -20,12 +19,14 @@ public record Sys_SiteMsgUser : ImmutableEntity
/// 站内信编号
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public long SiteMsgId { get; init; }
/// <summary>
/// 关联的用户
/// </summary>
[CsvIgnore]
[JsonIgnore]
public Sys_User User { get; init; }
@ -33,6 +34,7 @@ public record Sys_SiteMsgUser : ImmutableEntity
/// 用户编号
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public long UserId { get; init; }
}

View File

@ -1,5 +1,3 @@
using NetAdmin.Domain.DbMaps.Dependency;
using NetAdmin.Domain.DbMaps.Dependency.Fields;
using NetAdmin.Domain.Dto.Sys.User;
namespace NetAdmin.Domain.DbMaps.Sys;
@ -7,9 +5,9 @@ namespace NetAdmin.Domain.DbMaps.Sys;
/// <summary>
/// 用户基本信息表
/// </summary>
[Index(Chars.FLG_DB_INDEX_PREFIX + nameof(Email), nameof(Email), true)]
[Index(Chars.FLG_DB_INDEX_PREFIX + nameof(Mobile), nameof(Mobile), true)]
[Index(Chars.FLG_DB_INDEX_PREFIX + nameof(UserName), nameof(UserName), true)]
[SqlIndex(Chars.FLG_DB_INDEX_PREFIX + nameof(Email), nameof(Email), true)]
[SqlIndex(Chars.FLG_DB_INDEX_PREFIX + nameof(Mobile), nameof(Mobile), true)]
[SqlIndex(Chars.FLG_DB_INDEX_PREFIX + nameof(UserName), nameof(UserName), true)]
[Table(Name = Chars.FLG_DB_TABLE_NAME_PREFIX + nameof(Sys_User))]
public record Sys_User : VersionEntity, IFieldSummary, IFieldEnabled, IRegister
{
@ -17,12 +15,14 @@ public record Sys_User : VersionEntity, IFieldSummary, IFieldEnabled, IRegister
/// 头像链接
/// </summary>
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_127)]
[CsvIgnore]
[JsonIgnore]
public virtual string Avatar { get; init; }
/// <summary>
/// 所属部门
/// </summary>
[CsvIgnore]
[JsonIgnore]
[Navigate(nameof(DeptId))]
public Sys_Dept Dept { get; init; }
@ -31,6 +31,7 @@ public record Sys_User : VersionEntity, IFieldSummary, IFieldEnabled, IRegister
/// 部门编号
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public virtual long DeptId { get; init; }
@ -38,6 +39,7 @@ public record Sys_User : VersionEntity, IFieldSummary, IFieldEnabled, IRegister
/// 邮箱
/// </summary>
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_63)]
[CsvIgnore]
[JsonIgnore]
public virtual string Email { get; init; }
@ -45,6 +47,7 @@ public record Sys_User : VersionEntity, IFieldSummary, IFieldEnabled, IRegister
/// 是否启用
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public virtual bool Enabled { get; init; }
@ -52,6 +55,7 @@ public record Sys_User : VersionEntity, IFieldSummary, IFieldEnabled, IRegister
/// 手机号码
/// </summary>
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_15)]
[CsvIgnore]
[JsonIgnore]
public virtual string Mobile { get; init; }
@ -59,18 +63,21 @@ public record Sys_User : VersionEntity, IFieldSummary, IFieldEnabled, IRegister
/// 密码
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public Guid Password { get; init; }
/// <summary>
/// 用户档案
/// </summary>
[CsvIgnore]
[JsonIgnore]
public Sys_UserProfile Profile { get; init; }
/// <summary>
/// 所属角色
/// </summary>
[CsvIgnore]
[JsonIgnore]
[Navigate(ManyToMany = typeof(Sys_UserRole))]
public ICollection<Sys_Role> Roles { get; init; }
@ -78,6 +85,7 @@ public record Sys_User : VersionEntity, IFieldSummary, IFieldEnabled, IRegister
/// <summary>
/// 发送给此用户的站内信集合
/// </summary>
[CsvIgnore]
[JsonIgnore]
[Navigate(ManyToMany = typeof(Sys_SiteMsgUser))]
public ICollection<Sys_SiteMsg> SiteMsgs { get; init; }
@ -86,6 +94,7 @@ public record Sys_User : VersionEntity, IFieldSummary, IFieldEnabled, IRegister
/// 描述
/// </summary>
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)]
[CsvIgnore]
[JsonIgnore]
public virtual string Summary { get; init; }
@ -93,6 +102,7 @@ public record Sys_User : VersionEntity, IFieldSummary, IFieldEnabled, IRegister
/// 授权验证Token全局唯一可以随时重置强制下线
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public Guid Token { get; init; }
@ -100,11 +110,12 @@ public record Sys_User : VersionEntity, IFieldSummary, IFieldEnabled, IRegister
/// 用户名
/// </summary>
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_31)]
[CsvIgnore]
[JsonIgnore]
public virtual string UserName { get; init; }
/// <inheritdoc />
public void Register(TypeAdapterConfig config)
public virtual void Register(TypeAdapterConfig config)
{
_ = config.ForType<CreateUserReq, Sys_User>()
.Map(d => d.Password, s => s.PasswordText.Pwd().Guid())

View File

@ -1,4 +1,3 @@
using NetAdmin.Domain.DbMaps.Dependency;
using NetAdmin.Domain.Dto.Sys.UserProfile;
namespace NetAdmin.Domain.DbMaps.Sys;
@ -17,13 +16,15 @@ public record Sys_UserProfile : VersionEntity, IRegister
#else
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)]
#endif
[CsvIgnore]
[JsonIgnore]
public virtual string AppConfig { get; init; }
public virtual string AppConfig { get; set; }
/// <summary>
/// 出生日期
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public virtual DateTime? BornDate { get; init; }
@ -31,6 +32,7 @@ public record Sys_UserProfile : VersionEntity, IRegister
/// 证件号码
/// </summary>
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_63)]
[CsvIgnore]
[JsonIgnore]
public virtual string CertificateNumber { get; init; }
@ -38,6 +40,7 @@ public record Sys_UserProfile : VersionEntity, IRegister
/// 证件类型
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public virtual CertificateTypes? CertificateType { get; init; }
@ -45,6 +48,7 @@ public record Sys_UserProfile : VersionEntity, IRegister
/// 工作地址
/// </summary>
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_127)]
[CsvIgnore]
[JsonIgnore]
public virtual string CompanyAddress { get; init; }
@ -52,6 +56,7 @@ public record Sys_UserProfile : VersionEntity, IRegister
/// 工作地区
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public int? CompanyArea { get; init; }
@ -59,6 +64,7 @@ public record Sys_UserProfile : VersionEntity, IRegister
/// 工作单位
/// </summary>
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_31)]
[CsvIgnore]
[JsonIgnore]
public virtual string CompanyName { get; init; }
@ -66,6 +72,7 @@ public record Sys_UserProfile : VersionEntity, IRegister
/// 工作电话
/// </summary>
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_31)]
[CsvIgnore]
[JsonIgnore]
public virtual string CompanyTelephone { get; init; }
@ -73,6 +80,7 @@ public record Sys_UserProfile : VersionEntity, IRegister
/// 文化程度
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public virtual Educations? Education { get; init; }
@ -80,6 +88,7 @@ public record Sys_UserProfile : VersionEntity, IRegister
/// 紧急联系地址
/// </summary>
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_127)]
[CsvIgnore]
[JsonIgnore]
public virtual string EmergencyContactAddress { get; init; }
@ -87,13 +96,15 @@ public record Sys_UserProfile : VersionEntity, IRegister
/// 紧急联系地区
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public int? EmergencyContactArea { get; init; }
/// <summary>
/// 紧急联系人手机号
/// 紧急联系人手机号
/// </summary>
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_15)]
[CsvIgnore]
[JsonIgnore]
public virtual string EmergencyContactMobile { get; init; }
@ -101,6 +112,7 @@ public record Sys_UserProfile : VersionEntity, IRegister
/// 紧急联系人
/// </summary>
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_31)]
[CsvIgnore]
[JsonIgnore]
public virtual string EmergencyContactName { get; init; }
@ -108,6 +120,7 @@ public record Sys_UserProfile : VersionEntity, IRegister
/// 毕业学校
/// </summary>
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_31)]
[CsvIgnore]
[JsonIgnore]
public virtual string GraduateSchool { get; init; }
@ -115,6 +128,7 @@ public record Sys_UserProfile : VersionEntity, IRegister
/// 身高
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public virtual int? Height { get; init; }
@ -122,6 +136,7 @@ public record Sys_UserProfile : VersionEntity, IRegister
/// 住宅地址
/// </summary>
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_127)]
[CsvIgnore]
[JsonIgnore]
public virtual string HomeAddress { get; init; }
@ -129,6 +144,7 @@ public record Sys_UserProfile : VersionEntity, IRegister
/// 住宅地区
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public int? HomeArea { get; init; }
@ -136,6 +152,7 @@ public record Sys_UserProfile : VersionEntity, IRegister
/// 住宅电话
/// </summary>
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_31)]
[CsvIgnore]
[JsonIgnore]
public virtual string HomeTelephone { get; init; }
@ -143,6 +160,7 @@ public record Sys_UserProfile : VersionEntity, IRegister
/// 婚姻状况
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public virtual MarriageStatues? MarriageStatus { get; init; }
@ -151,6 +169,7 @@ public record Sys_UserProfile : VersionEntity, IRegister
/// </summary>
/// 7
[Column]
[CsvIgnore]
[JsonIgnore]
public virtual Nations? Nation { get; init; }
@ -158,6 +177,7 @@ public record Sys_UserProfile : VersionEntity, IRegister
/// 籍贯
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public int? NationArea { get; init; }
@ -165,6 +185,7 @@ public record Sys_UserProfile : VersionEntity, IRegister
/// 政治面貌
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public virtual PoliticalStatues? PoliticalStatus { get; init; }
@ -172,6 +193,7 @@ public record Sys_UserProfile : VersionEntity, IRegister
/// 职业
/// </summary>
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_31)]
[CsvIgnore]
[JsonIgnore]
public virtual string Profession { get; init; }
@ -179,6 +201,7 @@ public record Sys_UserProfile : VersionEntity, IRegister
/// 真实姓名
/// </summary>
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_31)]
[CsvIgnore]
[JsonIgnore]
public virtual string RealName { get; init; }
@ -186,12 +209,14 @@ public record Sys_UserProfile : VersionEntity, IRegister
/// 性别
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public virtual Sexes? Sex { get; init; }
/// <summary>
/// 用户基本信息
/// </summary>
[CsvIgnore]
[JsonIgnore]
public Sys_User User { get; init; }

View File

@ -1,5 +1,3 @@
using NetAdmin.Domain.DbMaps.Dependency;
namespace NetAdmin.Domain.DbMaps.Sys;
/// <summary>
@ -11,6 +9,7 @@ public record Sys_UserRole : VersionEntity
/// <summary>
/// 关联的角色
/// </summary>
[CsvIgnore]
[JsonIgnore]
public Sys_Role Role { get; init; }
@ -18,12 +17,14 @@ public record Sys_UserRole : VersionEntity
/// 角色编号
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public long RoleId { get; init; }
/// <summary>
/// 关联的用户
/// </summary>
[CsvIgnore]
[JsonIgnore]
public Sys_User User { get; init; }
@ -31,6 +32,7 @@ public record Sys_UserRole : VersionEntity
/// 用户编号
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public long UserId { get; init; }
}

View File

@ -1,4 +1,3 @@
using NetAdmin.Domain.DbMaps.Dependency;
using NetAdmin.Domain.Enums.Sys;
namespace NetAdmin.Domain.DbMaps.Sys;
@ -13,6 +12,7 @@ public record Sys_VerifyCode : VersionEntity
/// 验证码
/// </summary>
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_7)]
[CsvIgnore]
[JsonIgnore]
public virtual string Code { get; init; }
@ -20,6 +20,7 @@ public record Sys_VerifyCode : VersionEntity
/// 目标设备
/// </summary>
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_63)]
[CsvIgnore]
[JsonIgnore]
public virtual string DestDevice { get; init; }
@ -27,6 +28,7 @@ public record Sys_VerifyCode : VersionEntity
/// 设备类型
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public virtual VerifyCodeDeviceTypes DeviceType { get; init; }
@ -34,6 +36,7 @@ public record Sys_VerifyCode : VersionEntity
/// 发送报告
/// </summary>
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)]
[CsvIgnore]
[JsonIgnore]
public string Report { get; init; }
@ -41,6 +44,7 @@ public record Sys_VerifyCode : VersionEntity
/// 验证码状态
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public virtual VerifyCodeStatues Status { get; init; }
@ -48,6 +52,7 @@ public record Sys_VerifyCode : VersionEntity
/// 验证码类型
/// </summary>
[Column]
[CsvIgnore]
[JsonIgnore]
public virtual VerifyCodeTypes Type { get; init; }
}

View File

@ -1,5 +1,3 @@
using NetAdmin.Domain.DbMaps.Dependency;
namespace NetAdmin.Domain.DbMaps.Tpl;
/// <summary>

View File

@ -1,5 +1,3 @@
using NetAdmin.Domain.DbMaps.Dependency;
namespace NetAdmin.Domain.Dto.Dependency;
/// <inheritdoc cref="DelReq{T}" />

View File

@ -37,6 +37,47 @@ public sealed record DynamicFilterInfo : DataAbstraction
/// </summary>
public static implicit operator FreeSql.Internal.Model.DynamicFilterInfo(DynamicFilterInfo d)
{
return d.Adapt<FreeSql.Internal.Model.DynamicFilterInfo>();
var ret = d.Adapt<FreeSql.Internal.Model.DynamicFilterInfo>();
ProcessDynamicFilter(ret);
return ret;
}
private static void ProcessDynamicFilter(FreeSql.Internal.Model.DynamicFilterInfo d)
{
if (d?.Filters != null) {
foreach (var filterInfo in d.Filters) {
ProcessDynamicFilter(filterInfo);
}
}
if (new[] { nameof(IFieldCreatedClientIp.CreatedClientIp), nameof(IFieldModifiedClientIp.ModifiedClientIp) }
.Contains(d?.Field, StringComparer.OrdinalIgnoreCase)) {
var val = d!.Value?.ToString();
if (val?.IsIpV4() == true) {
d.Value = val.IpV4ToInt32();
}
}
else if (d?.Operator == DynamicFilterOperator.DateRange) {
var values = ((JsonElement)d.Value).Deserialize<string[]>();
if (!DateTime.TryParse(values[0], CultureInfo.InvariantCulture, out _)) {
var result = values[0]
.ExecuteCSharpCodeAsync<DateTime>([typeof(DateTime).Assembly], nameof(System))
.ConfigureAwait(false)
.GetAwaiter()
.GetResult();
values[0] = $"{result:yyyy-MM-dd HH:mm:ss}";
}
if (!DateTime.TryParse(values[1], CultureInfo.InvariantCulture, out _)) {
var result = values[1]
.ExecuteCSharpCodeAsync<DateTime>([typeof(DateTime).Assembly], nameof(System))
.ConfigureAwait(false)
.GetAwaiter()
.GetResult();
values[1] = $"{result:yyyy-MM-dd HH:mm:ss}";
}
d.Value = values;
}
}
}

View File

@ -6,17 +6,17 @@ namespace NetAdmin.Domain.Dto.Dependency;
public sealed record PagedQueryRsp<T>(int Page, int PageSize, long Total, IEnumerable<T> Rows) : IPagedInfo
where T : DataAbstraction
{
/// <summary>
/// 数据行
/// </summary>
public IEnumerable<T> Rows { get; } = Rows;
/// <inheritdoc cref="IPagedInfo.Page" />
public int Page { get; init; } = Page;
/// <inheritdoc cref="IPagedInfo.PageSize" />
public int PageSize { get; init; } = PageSize;
/// <summary>
/// 数据行
/// </summary>
public IEnumerable<T> Rows { get; init; } = Rows;
/// <summary>
/// 数据总条
/// </summary>

View File

@ -1,5 +1,3 @@
using NetAdmin.Domain.DbMaps.Sys;
namespace NetAdmin.Domain.Dto.Sys.Api;
/// <summary>

View File

@ -0,0 +1,35 @@
namespace NetAdmin.Domain.Dto.Sys.Api;
/// <summary>
/// 响应:导出接口
/// </summary>
public record ExportApiRsp : QueryApiRsp
{
/// <inheritdoc />
[CsvIgnore]
public override IEnumerable<QueryApiRsp> Children { get; init; }
/// <inheritdoc />
[CsvIndex(0)]
[CsvIgnore(false)]
[CsvName(nameof(Ln.接口路径))]
public override string Id { get; init; }
/// <inheritdoc />
[CsvIndex(2)]
[CsvIgnore(false)]
[CsvName(nameof(Ln.请求方式))]
public override string Method { get; init; }
/// <inheritdoc />
[CsvIndex(1)]
[CsvIgnore(false)]
[CsvName(nameof(Ln.接口名称))]
public override string Name { get; init; }
/// <inheritdoc />
[CsvIndex(3)]
[CsvIgnore(false)]
[CsvName(nameof(Ln.接口描述))]
public override string Summary { get; init; }
}

View File

@ -1,5 +1,3 @@
using NetAdmin.Domain.DbMaps.Sys;
namespace NetAdmin.Domain.Dto.Sys.Api;
/// <summary>

View File

@ -1,16 +1,12 @@
using NetAdmin.Domain.DbMaps.Dependency;
using NetAdmin.Domain.DbMaps.Dependency.Fields;
using NetAdmin.Domain.DbMaps.Sys;
namespace NetAdmin.Domain.Dto.Sys.Api;
/// <summary>
/// 响应:查询接口
/// </summary>
public sealed record QueryApiRsp : Sys_Api
public record QueryApiRsp : Sys_Api
{
/// <inheritdoc cref="Sys_Api.Children" />
public new IEnumerable<QueryApiRsp> Children { get; init; }
public new virtual IEnumerable<QueryApiRsp> Children { get; init; }
/// <inheritdoc cref="EntityBase{T}.Id" />
public override string Id { get; init; }
@ -31,6 +27,10 @@ public sealed record QueryApiRsp : Sys_Api
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
public override string ParentId { get; init; }
/// <inheritdoc cref="Sys_Api.PathCrc32" />
[JsonIgnore(Condition = JsonIgnoreCondition.Never)]
public override int PathCrc32 { get; init; }
/// <inheritdoc cref="IFieldSummary.Summary" />
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
public override string Summary { get; init; }

View File

@ -6,7 +6,7 @@ namespace NetAdmin.Domain.Dto.Sys.Cache;
public sealed record GetAllEntriesReq : DataAbstraction
{
/// <summary>
/// 数据库索引号
/// 关键词
/// </summary>
public int DbIndex { get; init; }
public string Keywords { get; init; }
}

View File

@ -1,53 +0,0 @@
namespace NetAdmin.Domain.Dto.Sys.Cache;
/// <summary>
/// 响应:获取所有缓存项
/// </summary>
public sealed record GetAllEntriesRsp : DataAbstraction
{
/// <summary>
/// Initializes a new instance of the <see cref="GetAllEntriesRsp" /> class.
/// </summary>
public GetAllEntriesRsp() { }
/// <summary>
/// Initializes a new instance of the <see cref="GetAllEntriesRsp" /> class.
/// </summary>
public GetAllEntriesRsp(long absExp, string key, long sldExp, string data)
{
AbsExp = absExp;
Key = key;
SldExp = sldExp;
Data = data;
}
/// <summary>
/// 绝对过期时间
/// </summary>
public DateTime? AbsExpTime => AbsExp == -1 ? null : DateTime.FromBinary(AbsExp).ToLocalTime();
/// <summary>
/// 滑动过期时间
/// </summary>
public DateTime? SldExpTime => SldExp == -1 ? null : DateTime.FromBinary(SldExp).ToLocalTime();
/// <summary>
/// 绝对过期时间
/// </summary>
public long AbsExp { get; init; }
/// <summary>
/// 缓存值
/// </summary>
public string Data { get; init; }
/// <summary>
/// 缓存键
/// </summary>
public string Key { get; init; }
/// <summary>
/// 滑动过期时间
/// </summary>
public long SldExp { get; init; }
}

View File

@ -0,0 +1,12 @@
namespace NetAdmin.Domain.Dto.Sys.Cache;
/// <summary>
/// 请求:获取缓存项
/// </summary>
public sealed record GetEntriesReq : DataAbstraction
{
/// <summary>
/// 缓存键
/// </summary>
public string Key { get; init; }
}

View File

@ -0,0 +1,34 @@
using StackExchange.Redis;
namespace NetAdmin.Domain.Dto.Sys.Cache;
/// <summary>
/// 响应:获取所有缓存项
/// </summary>
public sealed record GetEntryRsp : DataAbstraction
{
/// <summary>
/// Initializes a new instance of the <see cref="GetEntryRsp" /> class.
/// </summary>
public GetEntryRsp() { }
/// <summary>
/// 缓存值
/// </summary>
public string Data { get; set; }
/// <summary>
/// 过期时间
/// </summary>
public DateTime? ExpireTime { get; init; }
/// <summary>
/// 缓存键
/// </summary>
public string Key { get; init; }
/// <summary>
/// 数据类型
/// </summary>
public RedisType Type { get; init; }
}

View File

@ -1,6 +1,3 @@
using NetAdmin.Domain.DbMaps.Dependency.Fields;
using NetAdmin.Domain.DbMaps.Sys;
namespace NetAdmin.Domain.Dto.Sys.Config;
/// <summary>

View File

@ -1,5 +1,3 @@
using NetAdmin.Domain.DbMaps.Dependency.Fields;
namespace NetAdmin.Domain.Dto.Sys.Config;
/// <summary>

View File

@ -0,0 +1,60 @@
using NetAdmin.Domain.Dto.Sys.Dept;
using NetAdmin.Domain.Dto.Sys.Role;
namespace NetAdmin.Domain.Dto.Sys.Config;
/// <summary>
/// 响应:导出配置
/// </summary>
public record ExportConfigRsp : QueryConfigRsp, IRegister
{
/// <inheritdoc />
[CsvIndex(6)]
[CsvIgnore(false)]
[CsvName(nameof(Ln.是否启用))]
public override bool Enabled { get; init; }
/// <inheritdoc />
[CsvIndex(0)]
[CsvIgnore(false)]
[CsvName(nameof(Ln.唯一编码))]
public override long Id { get; init; }
/// <inheritdoc />
[CsvIndex(3)]
[CsvIgnore(false)]
[CsvName(nameof(Ln.人工审核))]
public override bool UserRegisterConfirm { get; init; }
/// <inheritdoc />
[CsvIgnore]
public override QueryDeptRsp UserRegisterDept { get; init; }
/// <summary>
/// 默认部门
/// </summary>
[CsvIndex(1)]
[CsvIgnore(false)]
[CsvName(nameof(Ln.默认部门))]
public string UserRegisterDeptName { get; init; }
/// <inheritdoc />
[CsvIgnore]
public override QueryRoleRsp UserRegisterRole { get; init; }
/// <summary>
/// 默认角色
/// </summary>
[CsvIndex(2)]
[CsvIgnore(false)]
[CsvName(nameof(Ln.默认角色))]
public string UserRegisterRoleName { get; init; }
/// <inheritdoc />
public void Register(TypeAdapterConfig config)
{
_ = config.ForType<Sys_Config, ExportConfigRsp>()
.Map(d => d.UserRegisterDeptName, s => s.UserRegisterDept.Name)
.Map(d => d.UserRegisterRoleName, s => s.UserRegisterRole.Name);
}
}

View File

@ -1,7 +1,3 @@
using NetAdmin.Domain.DbMaps.Dependency;
using NetAdmin.Domain.DbMaps.Dependency.Fields;
using NetAdmin.Domain.DbMaps.Sys;
namespace NetAdmin.Domain.Dto.Sys.Config;
/// <summary>

View File

@ -1,6 +1,3 @@
using NetAdmin.Domain.DbMaps.Dependency;
using NetAdmin.Domain.DbMaps.Dependency.Fields;
using NetAdmin.Domain.DbMaps.Sys;
using NetAdmin.Domain.Dto.Sys.Dept;
using NetAdmin.Domain.Dto.Sys.Role;
@ -9,7 +6,7 @@ namespace NetAdmin.Domain.Dto.Sys.Config;
/// <summary>
/// 响应:查询配置
/// </summary>
public sealed record QueryConfigRsp : Sys_Config
public record QueryConfigRsp : Sys_Config
{
/// <inheritdoc cref="IFieldCreatedTime.CreatedTime" />
[JsonIgnore(Condition = JsonIgnoreCondition.Never)]
@ -29,7 +26,7 @@ public sealed record QueryConfigRsp : Sys_Config
/// <inheritdoc cref="Sys_Config.UserRegisterDept" />
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
public new QueryDeptRsp UserRegisterDept { get; init; }
public new virtual QueryDeptRsp UserRegisterDept { get; init; }
/// <inheritdoc cref="Sys_Config.UserRegisterDeptId" />
[JsonIgnore(Condition = JsonIgnoreCondition.Never)]
@ -37,7 +34,7 @@ public sealed record QueryConfigRsp : Sys_Config
/// <inheritdoc cref="Sys_Config.UserRegisterRole" />
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
public new QueryRoleRsp UserRegisterRole { get; init; }
public new virtual QueryRoleRsp UserRegisterRole { get; init; }
/// <inheritdoc cref="Sys_Config.UserRegisterRoleId" />
[JsonIgnore(Condition = JsonIgnoreCondition.Never)]

View File

@ -1,7 +1,3 @@
using NetAdmin.Domain.DbMaps.Dependency;
using NetAdmin.Domain.DbMaps.Dependency.Fields;
using NetAdmin.Domain.DbMaps.Sys;
namespace NetAdmin.Domain.Dto.Sys.Config;
/// <summary>

View File

@ -1,6 +1,3 @@
using NetAdmin.Domain.DbMaps.Dependency.Fields;
using NetAdmin.Domain.DbMaps.Sys;
namespace NetAdmin.Domain.Dto.Sys.Dept;
/// <summary>

View File

@ -1,6 +1,3 @@
using NetAdmin.Domain.DbMaps.Dependency;
using NetAdmin.Domain.DbMaps.Dependency.Fields;
namespace NetAdmin.Domain.Dto.Sys.Dept;
/// <summary>

View File

@ -0,0 +1,47 @@
namespace NetAdmin.Domain.Dto.Sys.Dept;
/// <summary>
/// 响应:导出部门
/// </summary>
public record ExportDeptRsp : QueryDeptRsp
{
/// <inheritdoc />
[CsvIgnore]
public override IEnumerable<QueryDeptRsp> Children { get; init; }
/// <inheritdoc />
[CsvIndex(5)]
[CsvIgnore(false)]
[CsvName(nameof(Ln.创建时间))]
public override DateTime CreatedTime { get; init; }
/// <inheritdoc />
[CsvIndex(4)]
[CsvIgnore(false)]
[CsvName(nameof(Ln.是否启用))]
public override bool Enabled { get; init; }
/// <inheritdoc />
[CsvIndex(0)]
[CsvIgnore(false)]
[CsvName(nameof(Ln.唯一编码))]
public override long Id { get; init; }
/// <inheritdoc />
[CsvIndex(1)]
[CsvIgnore(false)]
[CsvName(nameof(Ln.部门名称))]
public override string Name { get; init; }
/// <inheritdoc />
[CsvIndex(2)]
[CsvIgnore(false)]
[CsvName(nameof(Ln.排序))]
public override long Sort { get; init; }
/// <inheritdoc />
[CsvIndex(3)]
[CsvIgnore(false)]
[CsvName(nameof(Ln.备注))]
public override string Summary { get; init; }
}

View File

@ -1,6 +1,3 @@
using NetAdmin.Domain.DbMaps.Dependency;
using NetAdmin.Domain.DbMaps.Sys;
namespace NetAdmin.Domain.Dto.Sys.Dept;
/// <summary>

View File

@ -1,16 +1,12 @@
using NetAdmin.Domain.DbMaps.Dependency;
using NetAdmin.Domain.DbMaps.Dependency.Fields;
using NetAdmin.Domain.DbMaps.Sys;
namespace NetAdmin.Domain.Dto.Sys.Dept;
/// <summary>
/// 响应:查询部门
/// </summary>
public sealed record QueryDeptRsp : Sys_Dept
public record QueryDeptRsp : Sys_Dept
{
/// <inheritdoc cref="Sys_Dept.Children" />
public new IEnumerable<QueryDeptRsp> Children { get; init; }
public new virtual IEnumerable<QueryDeptRsp> Children { get; init; }
/// <inheritdoc cref="IFieldCreatedTime.CreatedTime" />
[JsonIgnore(Condition = JsonIgnoreCondition.Never)]

View File

@ -1,7 +1,3 @@
using NetAdmin.Domain.DbMaps.Dependency;
using NetAdmin.Domain.DbMaps.Dependency.Fields;
using NetAdmin.Domain.DbMaps.Sys;
namespace NetAdmin.Domain.Dto.Sys.Dept;
/// <summary>

View File

@ -29,6 +29,7 @@ public sealed record IconExportJsInfo : DataAbstraction
/// <summary>
/// Icons
/// </summary>
[JsonInclude]
public ICollection<string> Icons { get; init; }
/// <summary>

View File

@ -1,5 +1,3 @@
using NetAdmin.Domain.DbMaps.Sys;
namespace NetAdmin.Domain.Dto.Sys.Dic.Catalog;
/// <summary>

View File

@ -1,5 +1,3 @@
using NetAdmin.Domain.DbMaps.Dependency.Fields;
namespace NetAdmin.Domain.Dto.Sys.Dic.Catalog;
/// <summary>

View File

@ -1,5 +1,3 @@
using NetAdmin.Domain.DbMaps.Sys;
namespace NetAdmin.Domain.Dto.Sys.Dic.Catalog;
/// <summary>

View File

@ -1,7 +1,3 @@
using NetAdmin.Domain.DbMaps.Dependency;
using NetAdmin.Domain.DbMaps.Dependency.Fields;
using NetAdmin.Domain.DbMaps.Sys;
namespace NetAdmin.Domain.Dto.Sys.Dic.Catalog;
/// <summary>

View File

@ -1,5 +1,3 @@
using NetAdmin.Domain.DbMaps.Sys;
namespace NetAdmin.Domain.Dto.Sys.Dic.Content;
/// <summary>

View File

@ -1,5 +1,3 @@
using NetAdmin.Domain.DbMaps.Dependency.Fields;
namespace NetAdmin.Domain.Dto.Sys.Dic.Content;
/// <summary>

View File

@ -0,0 +1,25 @@
namespace NetAdmin.Domain.Dto.Sys.Dic.Content;
/// <summary>
/// 响应:导出字典内容
/// </summary>
public record ExportDicContentRsp : QueryDicContentRsp
{
/// <inheritdoc />
[CsvIndex(2)]
[CsvIgnore(false)]
[CsvName(nameof(Ln.创建时间))]
public override DateTime CreatedTime { get; init; }
/// <inheritdoc />
[CsvIndex(0)]
[CsvIgnore(false)]
[CsvName(nameof(Ln.项名))]
public override string Key { get; init; }
/// <inheritdoc />
[CsvIndex(1)]
[CsvIgnore(false)]
[CsvName(nameof(Ln.项值))]
public override string Value { get; init; }
}

View File

@ -1,5 +1,3 @@
using NetAdmin.Domain.DbMaps.Sys;
namespace NetAdmin.Domain.Dto.Sys.Dic.Content;
/// <summary>

View File

@ -1,5 +1,3 @@
using NetAdmin.Domain.DbMaps.Sys;
namespace NetAdmin.Domain.Dto.Sys.Dic.Content;
/// <summary>

View File

@ -1,12 +1,9 @@
using NetAdmin.Domain.DbMaps.Dependency.Fields;
using NetAdmin.Domain.DbMaps.Sys;
namespace NetAdmin.Domain.Dto.Sys.Dic.Content;
/// <summary>
/// 响应:查询字典内容
/// </summary>
public sealed record QueryDicContentRsp : Sys_DicContent
public record QueryDicContentRsp : Sys_DicContent
{
/// <inheritdoc cref="Sys_DicContent.CatalogId" />
[JsonIgnore(Condition = JsonIgnoreCondition.Never)]

View File

@ -1,6 +1,3 @@
using NetAdmin.Domain.Attributes.DataValidation;
using NetAdmin.Domain.DbMaps.Dependency.Fields;
using NetAdmin.Domain.DbMaps.Sys;
using NetAdmin.Domain.Enums.Sys;
using HttpMethods = NetAdmin.Domain.Enums.HttpMethods;
@ -35,6 +32,14 @@ public record CreateJobReq : Sys_Job
/// <inheritdoc />
public override long? NextTimeId { get; init; }
/// <inheritdoc />
[Range(1, int.MaxValue, ErrorMessageResourceType = typeof(Ln), ErrorMessageResourceName = nameof(Ln.随机延时起始时间不正确))]
public override int? RandomDelayBegin { get; init; }
/// <inheritdoc />
[Range(1, int.MaxValue, ErrorMessageResourceType = typeof(Ln), ErrorMessageResourceName = nameof(Ln.随机延时结束时间不正确))]
public override int? RandomDelayEnd { get; init; }
/// <inheritdoc cref="Sys_Job.RequestBody" />
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
public override string RequestBody { get; init; }

View File

@ -0,0 +1,81 @@
using NetAdmin.Domain.Dto.Sys.User;
using NetAdmin.Domain.Enums.Sys;
using HttpMethods = NetAdmin.Domain.Enums.HttpMethods;
namespace NetAdmin.Domain.Dto.Sys.Job;
/// <summary>
/// 响应:导出计划作业
/// </summary>
public record ExportJobRsp : QueryJobRsp
{
/// <inheritdoc />
[CsvIndex(5)]
[CsvIgnore(false)]
[CsvName(nameof(Ln.上次执行状态))]
public override string LastStatusCode => base.LastStatusCode;
/// <inheritdoc />
[CsvIndex(10)]
[CsvIgnore(false)]
[CsvName(nameof(Ln.创建时间))]
public override DateTime CreatedTime { get; init; }
/// <inheritdoc />
[CsvIndex(9)]
[CsvIgnore(false)]
[CsvName(nameof(Ln.是否启用))]
public override bool Enabled { get; init; }
/// <inheritdoc />
[CsvIndex(2)]
[CsvIgnore(false)]
[CsvName(nameof(Ln.执行计划))]
public override string ExecutionCron { get; init; }
/// <inheritdoc />
[CsvIndex(4)]
[CsvIgnore(false)]
[CsvName(nameof(Ln.请求方式))]
public override HttpMethods HttpMethod { get; init; }
/// <inheritdoc />
[CsvIndex(0)]
[CsvIgnore(false)]
[CsvName(nameof(Ln.唯一编码))]
public override long Id { get; init; }
/// <inheritdoc />
[CsvIndex(1)]
[CsvIgnore(false)]
[CsvName(nameof(Ln.作业名称))]
public override string JobName { get; init; }
/// <inheritdoc />
[CsvIndex(7)]
[CsvIgnore(false)]
[CsvName(nameof(Ln.上次执行耗时))]
public override long? LastDuration { get; init; }
/// <inheritdoc />
[CsvIndex(6)]
[CsvIgnore(false)]
[CsvName(nameof(Ln.上次执行时间))]
public override DateTime? LastExecTime { get; init; }
/// <inheritdoc />
[CsvIndex(8)]
[CsvIgnore(false)]
[CsvName(nameof(Ln.下次执行时间))]
public override DateTime? NextExecTime { get; init; }
/// <inheritdoc />
[CsvIndex(3)]
[CsvIgnore(false)]
[CsvName(nameof(Ln.作业状态))]
public override JobStatues Status { get; init; }
/// <inheritdoc />
[CsvIgnore]
public override QueryUserRsp User { get; init; }
}

View File

@ -1,5 +1,3 @@
using NetAdmin.Domain.DbMaps.Sys;
namespace NetAdmin.Domain.Dto.Sys.Job;
/// <summary>

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