diff --git a/Directory.Build.props b/Directory.Build.props
index 2cd061c5..d2892df0 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -10,8 +10,8 @@
nsnail
$(SolutionDir)/dist/backend/$(MSBuildProjectName)/obj
$(SolutionDir)/dist/backend/$(MSBuildProjectName)/bin
- © 2006-2023 nsnail
- 通用后台权限管理系统、快速开发框架(基于C#12/.NET9、Vue3/Vite、Element Plus等现代技术构建,具有十分整洁、优雅的编码规范)
+ © 2006-2024 nsnail
+ 通用后台权限管理系统、快速开发框架(基于C#13/.NET9、Vue3/Vite、ElementPlus等现代技术构建,具有十分整洁、优雅的编码规范)
false
true
enable
diff --git a/README.md b/README.md
index 0851439a..e23fbc4e 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
# NetAdmin
-通用后台权限管理系统、快速开发框架(基于C#12/.NET9、Vue3/Vite、Element Plus等现代技术构建,具有十分整洁、优雅的编码规范)
+通用后台权限管理系统、快速开发框架(基于C#13/.NET9、Vue3/Vite、ElementPlus等现代技术构建,具有十分整洁、优雅的编码规范)
[](https://github.com/nsnail/NetAdmin/actions/workflows/nightly-build.yml)
[](https://github.com/nsnail/NetAdmin/blob/main/LICENSE)
@@ -110,7 +110,7 @@ biz-infra-->infra
| C# | 自动化版本管理 | [MinVer](https://github.com/adamralph/minver) |
| TypeScript | SPA基础框架 | [Vue](https://github.com/vuejs/core) |
| TypeScript | 前端构建工具 | [Vite](https://github.com/vitejs/vite) |
-| TypeScript | UI控件库 | [Element Plus](https://github.com/element-plus/element-plus) |
+| TypeScript | UI控件库 | [ElementPlus](https://github.com/element-plus/element-plus) |
| TypeScript | CSS解析器 | [Sass](https://github.com/sass/sass) |
| TypeScript | 图表和数据可视化 | [ECharts](https://github.com/apache/echarts) |
| JavaScript | 后台管理界面 | [SCUI](https://gitee.com/lolicode/scui) |
diff --git a/assets/seed-data/Sys_SiteMsg.json b/assets/seed-data/Sys_SiteMsg.json
index 755b8a97..68276b7c 100644
--- a/assets/seed-data/Sys_SiteMsg.json
+++ b/assets/seed-data/Sys_SiteMsg.json
@@ -1,10 +1,10 @@
[
{
- "Content": "
尊敬的用户:
\n欢迎您使用 NetAdmin 后台管理系统!NetAdmin 是一款通用后台权限管理系统和快速开发框架,它基于 C#12/.NET9、Vue3/Vite、Element Plus 等现代技术构建,具有十分整洁、优雅的编码规范。
\nNetAdmin 致力于为企业提供高效、安全、易用的解决方案,帮助您快速构建出符合业务需求的应用程序。系统提供了丰富的功能模块,包括用户管理、权限管理、日志管理、文件上传等,可以满足您日常管理的需求。
\n在使用 NetAdmin 的过程中,我们真诚地希望您能够遵守以下规定:
\n1. 不得利用 NetAdmin 进行非法活动或者侵犯他人权益;
\n2. 不得对 NetAdmin 系统进行恶意攻击或者破坏;
\n3. 不得将 NetAdmin 系统的任何部分用于商业目的或者未经授权的访问。
\n4. 为了更好地为您提供服务,NetAdmin 将不断进行优化和升级,同时也欢迎您提出宝贵的意见和建议。如果您在使用过程中遇到任何问题,可以通过官方网站或者技术支持团队进行咨询和解决。
\n再次感谢您对 NetAdmin 的信任和支持!我们相信,在您的使用过程中,NetAdmin 一定会成为您的得力助手,为您的事业发展提供强有力的支持!
\nNetAdmin 开发团队
",
+ "Content": "尊敬的用户:
\n欢迎您使用 NetAdmin 后台管理系统!NetAdmin 是一款通用后台权限管理系统和快速开发框架,它基于 C#13/.NET9、Vue3/Vite、ElementPlus 等现代技术构建,具有十分整洁、优雅的编码规范。
\nNetAdmin 致力于为企业提供高效、安全、易用的解决方案,帮助您快速构建出符合业务需求的应用程序。系统提供了丰富的功能模块,包括用户管理、权限管理、日志管理、文件上传等,可以满足您日常管理的需求。
\n在使用 NetAdmin 的过程中,我们真诚地希望您能够遵守以下规定:
\n1. 不得利用 NetAdmin 进行非法活动或者侵犯他人权益;
\n2. 不得对 NetAdmin 系统进行恶意攻击或者破坏;
\n3. 不得将 NetAdmin 系统的任何部分用于商业目的或者未经授权的访问。
\n4. 为了更好地为您提供服务,NetAdmin 将不断进行优化和升级,同时也欢迎您提出宝贵的意见和建议。如果您在使用过程中遇到任何问题,可以通过官方网站或者技术支持团队进行咨询和解决。
\n再次感谢您对 NetAdmin 的信任和支持!我们相信,在您的使用过程中,NetAdmin 一定会成为您的得力助手,为您的事业发展提供强有力的支持!
\nNetAdmin 开发团队
",
"CreatedUserId": 370942943322181,
"CreatedUserName": "root",
"MsgType": 2,
- "Summary": "尊敬的用户:\n欢迎您使用 NetAdmin 后台管理系统!NetAdmin 是一款通用后台权限管理系统和快速开发框架,它基于 C#12/.NET9、Vue3/Vite、Element Plus 等现代",
+ "Summary": "尊敬的用户:\n欢迎您使用 NetAdmin 后台管理系统!NetAdmin 是一款通用后台权限管理系统和快速开发框架,它基于 C#13/.NET9、Vue3/Vite、ElementPlus 等现代",
"Title": "欢迎使用 NetAdmin 后台管理系统",
}
]
\ No newline at end of file
diff --git a/package.json b/package.json
index f8e36dc0..6aa73167 100644
--- a/package.json
+++ b/package.json
@@ -11,4 +11,4 @@
"path": "node_modules/cz-git"
}
}
-}
+}
\ No newline at end of file
diff --git a/scripts/5.git.update.submodule.ps1 b/scripts/5.git.update.submodule.ps1
new file mode 100644
index 00000000..b07399a8
--- /dev/null
+++ b/scripts/5.git.update.submodule.ps1
@@ -0,0 +1,3 @@
+git submodule update --progress --init --recursive --force --remote -- "../refs/Gurion"
+git submodule update --progress --init --recursive --force --remote -- "../refs/NetAdmin.FreeSql"
+git submodule update --progress --init --recursive --force --remote -- "../refs/ns-ext"
\ No newline at end of file
diff --git a/src/backend/NetAdmin/NetAdmin.Infrastructure/Extensions/ISelectExtensions.cs b/src/backend/NetAdmin/NetAdmin.Infrastructure/Extensions/ISelectExtensions.cs
index bacc02cf..0917b2fb 100644
--- a/src/backend/NetAdmin/NetAdmin.Infrastructure/Extensions/ISelectExtensions.cs
+++ b/src/backend/NetAdmin/NetAdmin.Infrastructure/Extensions/ISelectExtensions.cs
@@ -1,4 +1,4 @@
-namespace NetAdmin.Infrastructure.Extensions;
+namespace NetAdmin.Infrastructure.Extensions;
///
/// ISelect 扩展方法
diff --git a/src/backend/NetAdmin/NetAdmin.Infrastructure/NetAdmin.Infrastructure.csproj b/src/backend/NetAdmin/NetAdmin.Infrastructure/NetAdmin.Infrastructure.csproj
index f507faa4..4b61a84c 100644
--- a/src/backend/NetAdmin/NetAdmin.Infrastructure/NetAdmin.Infrastructure.csproj
+++ b/src/backend/NetAdmin/NetAdmin.Infrastructure/NetAdmin.Infrastructure.csproj
@@ -10,7 +10,6 @@
-
diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/RequestLogCache.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/RequestLogCache.cs
index 3ed1dc15..8ba12863 100644
--- a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/RequestLogCache.cs
+++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/RequestLogCache.cs
@@ -18,7 +18,7 @@ public sealed class RequestLogCache(IDistributedCache cache, IRequestLogService
public async Task CountAsync(QueryReq req)
#else
public Task CountAsync(QueryReq req)
- #endif
+ #endif
{
#if !DEBUG
var ret = await GetOrCreateAsync( //
diff --git a/src/backend/UnitTests/Sys/DocTests.cs b/src/backend/UnitTests/Sys/DocTests.cs
new file mode 100644
index 00000000..f885a15d
--- /dev/null
+++ b/src/backend/UnitTests/Sys/DocTests.cs
@@ -0,0 +1,183 @@
+using NetAdmin.Domain.Dto.Sys.Doc.Catalog;
+using NetAdmin.Domain.Dto.Sys.Doc.Content;
+
+namespace UnitTests.Sys;
+
+///
+/// 文档测试
+///
+[SuppressMessage("Usage", "xUnit1026:Theory methods should use all of their parameters")]
+[SuppressMessage("Usage", "xUnit1028:Test method must have valid return type")]
+public class DocTests(WebTestApplicationFactory factory, ITestOutputHelper testOutputHelper)
+ : WebApiTestBase(factory, testOutputHelper), IDocModule
+{
+ ///
+ [InlineData(default)]
+ [Theory]
+ public async Task BulkDeleteCatalogAsync(BulkReq req)
+ {
+ var rsp = await PostJsonAsync(typeof(DocController), req);
+ Assert.True(rsp.IsSuccessStatusCode);
+ return default;
+ }
+
+ ///
+ [InlineData(default)]
+ [Theory]
+ public async Task BulkDeleteContentAsync(BulkReq req)
+ {
+ var rsp = await PostJsonAsync(typeof(DocController), req);
+ Assert.True(rsp.IsSuccessStatusCode);
+ return default;
+ }
+
+ ///
+ [InlineData(default)]
+ [Theory]
+ public async Task CreateCatalogAsync(CreateDocCatalogReq req)
+ {
+ var rsp = await PostJsonAsync(typeof(DocController), req);
+ Assert.True(rsp.IsSuccessStatusCode);
+ return default;
+ }
+
+ ///
+ [InlineData(default)]
+ [Theory]
+ public async Task CreateContentAsync(CreateDocContentReq req)
+ {
+ var rsp = await PostJsonAsync(typeof(DocController), req);
+ Assert.True(rsp.IsSuccessStatusCode);
+ return default;
+ }
+
+ ///
+ [InlineData(default)]
+ [Theory]
+ public async Task DeleteCatalogAsync(DelReq req)
+ {
+ var rsp = await PostJsonAsync(typeof(DocController), req);
+ Assert.True(rsp.IsSuccessStatusCode);
+ return default;
+ }
+
+ ///
+ [InlineData(default)]
+ [Theory]
+ public async Task DeleteContentAsync(DelReq req)
+ {
+ var rsp = await PostJsonAsync(typeof(DocController), req);
+ Assert.True(rsp.IsSuccessStatusCode);
+ return default;
+ }
+
+ ///
+ [InlineData(default)]
+ [Theory]
+ public async Task EditCatalogAsync(EditDocCatalogReq req)
+ {
+ var rsp = await PostJsonAsync(typeof(DocController), req);
+ Assert.True(rsp.IsSuccessStatusCode);
+ return default;
+ }
+
+ ///
+ [InlineData(default)]
+ [Theory]
+ public async Task EditContentAsync(EditDocContentReq req)
+ {
+ var rsp = await PostJsonAsync(typeof(DocController), req);
+ Assert.True(rsp.IsSuccessStatusCode);
+ return default;
+ }
+
+ ///
+ [InlineData(default)]
+ [Theory]
+ public async Task ExportContentAsync(QueryReq req)
+ {
+ var rsp = await PostJsonAsync(typeof(DocController), req);
+ Assert.True(rsp.IsSuccessStatusCode);
+ return default;
+ }
+
+ ///
+ [InlineData(default)]
+ [Theory]
+ public async Task GetCatalogAsync(QueryDocCatalogReq req)
+ {
+ var rsp = await PostJsonAsync(typeof(DocController), req);
+ Assert.True(rsp.IsSuccessStatusCode);
+ return default;
+ }
+
+ ///
+ [InlineData(default)]
+ [Theory]
+ public async Task GetContentAsync(QueryDocContentReq req)
+ {
+ var rsp = await PostJsonAsync(typeof(DocController), req);
+ Assert.True(rsp.IsSuccessStatusCode);
+ return default;
+ }
+
+ ///
+ [InlineData(default)]
+ [Theory]
+ public async Task> PagedQueryCatalogAsync(PagedQueryReq req)
+ {
+ var rsp = await PostJsonAsync(typeof(DocController), req);
+ Assert.True(rsp.IsSuccessStatusCode);
+ return default;
+ }
+
+ ///
+ [InlineData(default)]
+ [Theory]
+ public async Task> PagedQueryContentAsync(PagedQueryReq req)
+ {
+ var rsp = await PostJsonAsync(typeof(DocController), req);
+ Assert.True(rsp.IsSuccessStatusCode);
+ return default;
+ }
+
+ ///
+ [InlineData(default)]
+ [Theory]
+ public async Task> QueryCatalogAsync(QueryReq req)
+ {
+ var rsp = await PostJsonAsync(typeof(DocController), req);
+ Assert.True(rsp.IsSuccessStatusCode);
+ return default;
+ }
+
+ ///
+ [InlineData(default)]
+ [Theory]
+ public async Task> QueryContentAsync(QueryReq req)
+ {
+ var rsp = await PostJsonAsync(typeof(DocController), req);
+ Assert.True(rsp.IsSuccessStatusCode);
+ return default;
+ }
+
+ ///
+ [InlineData(default)]
+ [Theory]
+ public async Task SetEnabledAsync(SetDocContentEnabledReq req)
+ {
+ var rsp = await PostJsonAsync(typeof(DocController), req);
+ Assert.True(rsp.IsSuccessStatusCode);
+ return default;
+ }
+
+ ///
+ [InlineData(default)]
+ [Theory]
+ public async Task ViewContentAsync(QueryDocContentReq req)
+ {
+ var rsp = await PostJsonAsync(typeof(DocController), req);
+ Assert.True(rsp.IsSuccessStatusCode);
+ return default;
+ }
+}
\ No newline at end of file
diff --git a/src/backend/YourSolution.AdmServer.Application/YourSolution.AdmServer.Application.csproj b/src/backend/YourSolution.AdmServer.Application/YourSolution.AdmServer.Application.csproj
index 2fe4f666..3aa4c463 100644
--- a/src/backend/YourSolution.AdmServer.Application/YourSolution.AdmServer.Application.csproj
+++ b/src/backend/YourSolution.AdmServer.Application/YourSolution.AdmServer.Application.csproj
@@ -4,7 +4,4 @@
-
-
-
\ No newline at end of file
diff --git a/src/frontend/admin/src/components/naColUser/index.vue b/src/frontend/admin/src/components/naColUser/index.vue
index db8e15dd..ccac418b 100644
--- a/src/frontend/admin/src/components/naColUser/index.vue
+++ b/src/frontend/admin/src/components/naColUser/index.vue
@@ -11,7 +11,7 @@
{{ $TOOL.getNestedProperty(row, $attrs.nestProp2) }}
-
+
diff --git a/src/frontend/admin/src/components/scCron/index.vue b/src/frontend/admin/src/components/scCron/index.vue
index 3b527449..bbe62b28 100644
--- a/src/frontend/admin/src/components/scCron/index.vue
+++ b/src/frontend/admin/src/components/scCron/index.vue
@@ -293,7 +293,7 @@
- {{ $t('取消') }}
+ {{ $t('取消') }}
{{ $t('确认') }}
diff --git a/src/frontend/admin/src/components/scIconSelect/index.vue b/src/frontend/admin/src/components/scIconSelect/index.vue
index ba111c17..a487dfe3 100644
--- a/src/frontend/admin/src/components/scIconSelect/index.vue
+++ b/src/frontend/admin/src/components/scIconSelect/index.vue
@@ -49,7 +49,7 @@
{{ $t('清除') }}
- {{ $t('取消') }}
+ {{ $t('取消') }}
diff --git a/src/frontend/admin/src/components/scTable/fieldFilter.vue b/src/frontend/admin/src/components/scTable/fieldFilter.vue
index 455b29f9..18590055 100644
--- a/src/frontend/admin/src/components/scTable/fieldFilter.vue
+++ b/src/frontend/admin/src/components/scTable/fieldFilter.vue
@@ -13,7 +13,7 @@
- {{ $t('取消') }}
+ {{ $t('取消') }}
{{ $t('确定') }}
diff --git a/src/frontend/admin/src/components/scTable/index.vue b/src/frontend/admin/src/components/scTable/index.vue
index c04f30fc..f373d50b 100644
--- a/src/frontend/admin/src/components/scTable/index.vue
+++ b/src/frontend/admin/src/components/scTable/index.vue
@@ -90,8 +90,8 @@
:hide-after="0"
:title="$t('列设置')"
:width="500"
- @after-leave="(customColumnShow = false)"
- @show="(customColumnShow = true)"
+ @after-leave="customColumnShow = false"
+ @show="customColumnShow = true"
placement="top"
trigger="click">
diff --git a/src/frontend/admin/src/components/scUpload/index.vue b/src/frontend/admin/src/components/scUpload/index.vue
index e574ff3b..f2c4700f 100644
--- a/src/frontend/admin/src/components/scUpload/index.vue
+++ b/src/frontend/admin/src/components/scUpload/index.vue
@@ -51,7 +51,7 @@
- {{ $t('取消') }}
+ {{ $t('取消') }}
{{ $t('确定') }}
diff --git a/src/frontend/admin/src/layout/components/tasks.vue b/src/frontend/admin/src/layout/components/tasks.vue
index e0474b03..fde415da 100644
--- a/src/frontend/admin/src/layout/components/tasks.vue
+++ b/src/frontend/admin/src/layout/components/tasks.vue
@@ -53,7 +53,7 @@
-
+