diff --git a/build/code.quality.props b/build/code.quality.props
index 1475dfcf..2bc0b475 100644
--- a/build/code.quality.props
+++ b/build/code.quality.props
@@ -15,7 +15,7 @@
all
runtime; build; native; contentfiles; analyzers; buildtransitive
-
+
all
runtime; build; native; contentfiles; analyzers; buildtransitive
diff --git a/package.json b/package.json
index af132c45..514fcae4 100644
--- a/package.json
+++ b/package.json
@@ -1,9 +1,9 @@
{
"version": "2.3.1",
"devDependencies": {
- "cz-git": "^1.11.0",
+ "cz-git": "^1.11.1",
"commitizen": "^4.3.1",
- "prettier": "^3.5.0",
+ "prettier": "^3.5.3",
"standard-version": "^9.5.0"
},
"config": {
diff --git a/refs/Gurion b/refs/Gurion
index 2f58f329..b16b1a35 160000
--- a/refs/Gurion
+++ b/refs/Gurion
@@ -1 +1 @@
-Subproject commit 2f58f3291ae7a31bf935ed26d23fd587d181fb2b
+Subproject commit b16b1a35559281a9f53d6914f1195a204c9b4185
diff --git a/refs/NetAdmin.FreeSql b/refs/NetAdmin.FreeSql
index f5509a75..15717df4 160000
--- a/refs/NetAdmin.FreeSql
+++ b/refs/NetAdmin.FreeSql
@@ -1 +1 @@
-Subproject commit f5509a75ffb26175f7024fb609579050f6f5250d
+Subproject commit 15717df4499d284ec77c624a281c199a29280a4e
diff --git a/refs/ns-ext b/refs/ns-ext
index d4a92aca..322cbc32 160000
--- a/refs/ns-ext
+++ b/refs/ns-ext
@@ -1 +1 @@
-Subproject commit d4a92aca6f18b68875126f1974baa15fd2ab1fab
+Subproject commit 322cbc32df1363755d4b0588923ee7324676c3b6
diff --git a/scripts/rename.csx b/scripts/rename.csx
index 09b92916..a2b68e38 100644
--- a/scripts/rename.csx
+++ b/scripts/rename.csx
@@ -1,4 +1,4 @@
-#r "nuget: NSExt, 2.3.3"
+#r "nuget: NSExt, 2.3.4"
using NSExt.Extensions;
Console.WriteLine("请输入原始名称(NetAdmin):");
diff --git a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/File/UploadFileRsp.cs b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/File/UploadFileRsp.cs
new file mode 100644
index 00000000..451c662c
--- /dev/null
+++ b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/File/UploadFileRsp.cs
@@ -0,0 +1,17 @@
+namespace NetAdmin.Domain.Dto.Sys.File;
+
+///
+/// 响应:文件上传
+///
+public record UploadFileRsp : DataAbstraction
+{
+ ///
+ /// 文件名
+ ///
+ public string FileName { get; init; }
+
+ ///
+ /// 可访问的url地址
+ ///
+ public string Url { get; init; }
+}
\ No newline at end of file
diff --git a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/Job/EditJobReq.cs b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/Job/EditJobReq.cs
index 2a5f49f1..ad2f639e 100644
--- a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/Job/EditJobReq.cs
+++ b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/Job/EditJobReq.cs
@@ -5,7 +5,7 @@ namespace NetAdmin.Domain.Dto.Sys.Job;
///
public sealed record EditJobReq : CreateJobReq
{
- ///
+ ///
[JsonIgnore(Condition = JsonIgnoreCondition.Never)]
public override long Version { get; init; }
}
\ No newline at end of file
diff --git a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/User/SetAvatarReq.cs b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/User/SetAvatarReq.cs
index 2792a5fe..71f7f48e 100644
--- a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/User/SetAvatarReq.cs
+++ b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/User/SetAvatarReq.cs
@@ -11,7 +11,7 @@ public sealed record SetAvatarReq : Sys_User
[Url(ErrorMessageResourceType = typeof(Ln), ErrorMessageResourceName = nameof(Ln.网络地址不正确))]
public override string Avatar { get; init; }
- ///
+ ///
[JsonIgnore(Condition = JsonIgnoreCondition.Never)]
public override long Version { get; init; }
}
\ No newline at end of file
diff --git a/src/backend/NetAdmin/NetAdmin.Domain/NetAdmin.Domain.csproj b/src/backend/NetAdmin/NetAdmin.Domain/NetAdmin.Domain.csproj
index 8f22ef84..b74283c9 100644
--- a/src/backend/NetAdmin/NetAdmin.Domain/NetAdmin.Domain.csproj
+++ b/src/backend/NetAdmin/NetAdmin.Domain/NetAdmin.Domain.csproj
@@ -4,7 +4,7 @@
-
+
diff --git a/src/backend/NetAdmin/NetAdmin.Host/Controllers/Tpl/ExampleController.cs b/src/backend/NetAdmin/NetAdmin.Host/Controllers/Tpl/ExampleController.cs
index 17f0ef63..4af33d6d 100644
--- a/src/backend/NetAdmin/NetAdmin.Host/Controllers/Tpl/ExampleController.cs
+++ b/src/backend/NetAdmin/NetAdmin.Host/Controllers/Tpl/ExampleController.cs
@@ -34,7 +34,6 @@ public sealed class ExampleController(IExampleCache cache) : ControllerBase
/// 示例分组计数
///
- [NonAction]
public Task, int>>> CountByAsync(QueryReq req)
{
return Cache.CountByAsync(req);
diff --git a/src/backend/NetAdmin/NetAdmin.Infrastructure/NetAdmin.Infrastructure.csproj b/src/backend/NetAdmin/NetAdmin.Infrastructure/NetAdmin.Infrastructure.csproj
index bceaa2ba..b417037a 100644
--- a/src/backend/NetAdmin/NetAdmin.Infrastructure/NetAdmin.Infrastructure.csproj
+++ b/src/backend/NetAdmin/NetAdmin.Infrastructure/NetAdmin.Infrastructure.csproj
@@ -5,10 +5,10 @@
-
+
-
+
diff --git a/src/backend/NetAdmin/NetAdmin.Infrastructure/Utils/MinioHelper.cs b/src/backend/NetAdmin/NetAdmin.Infrastructure/Utils/MinioHelper.cs
index f7d039bc..b5ddb5a5 100644
--- a/src/backend/NetAdmin/NetAdmin.Infrastructure/Utils/MinioHelper.cs
+++ b/src/backend/NetAdmin/NetAdmin.Infrastructure/Utils/MinioHelper.cs
@@ -15,8 +15,8 @@ public sealed class MinioHelper(IOptions uploadOptions) : IScoped
/// 文件流
/// 文件类型
/// 文件大小
- /// 可访问的url地址
- public async Task UploadAsync(string objectName, Stream fileStream, string contentType, long fileSize)
+ /// 文件名,可访问的url地址
+ public async Task<(string FileName, string Url)> UploadAsync(string objectName, Stream fileStream, string contentType, long fileSize)
{
using var minio = new MinioClient().WithEndpoint(uploadOptions.Value.Minio.ServerAddress)
.WithCredentials( //
@@ -38,6 +38,6 @@ public sealed class MinioHelper(IOptions uploadOptions) : IScoped
.WithContentType(contentType);
_ = await minio.PutObjectAsync(putArgs).ConfigureAwait(false);
- return $"{uploadOptions.Value.Minio.AccessUrl}/{uploadOptions.Value.Minio.BucketName}/{objectName}";
+ return (objectName, $"{uploadOptions.Value.Minio.AccessUrl}/{uploadOptions.Value.Minio.BucketName}/{objectName}");
}
}
\ No newline at end of file
diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Modules/Sys/IFileModule.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Modules/Sys/IFileModule.cs
index c6c54631..16537af5 100644
--- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Modules/Sys/IFileModule.cs
+++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Modules/Sys/IFileModule.cs
@@ -1,3 +1,5 @@
+using NetAdmin.Domain.Dto.Sys.File;
+
namespace NetAdmin.SysComponent.Application.Modules.Sys;
///
@@ -8,5 +10,5 @@ public interface IFileModule
///
/// 文件上传
///
- Task UploadAsync(IFormFile file);
+ Task UploadAsync(IFormFile file);
}
\ No newline at end of file
diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/FileService.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/FileService.cs
index 0a4da555..ab3ff341 100644
--- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/FileService.cs
+++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/FileService.cs
@@ -1,3 +1,5 @@
+using NetAdmin.Domain.Dto.Sys.File;
+
namespace NetAdmin.SysComponent.Application.Services.Sys;
///
@@ -8,7 +10,7 @@ public sealed class FileService(IOptions uploadOptions, MinioHelp
/// 文件不能为空
/// 允许上传的文件格式
/// 允许的文件大小
- public async Task UploadAsync(IFormFile file)
+ public async Task UploadAsync(IFormFile file)
{
if (file == null || file.Length < 1) {
throw new NetAdminInvalidOperationException(Ln.文件不能为空);
@@ -22,9 +24,9 @@ public sealed class FileService(IOptions uploadOptions, MinioHelp
throw new NetAdminInvalidOperationException($"{Ln.允许的文件大小} {uploadOptions.Value.MaxSize}");
}
- var fileName = $"{Guid.NewGuid()}{Path.GetExtension(file.FileName)}";
- var objectName = $"{UserToken.Id}/{fileName}";
+ var objectName = $"{UserToken.Id}/{file.FileName}";
await using var fs = file.OpenReadStream();
- return await minioHelper.UploadAsync(objectName, fs, file.ContentType, file.Length).ConfigureAwait(false);
+ var (fileName, url) = await minioHelper.UploadAsync(objectName, fs, file.ContentType, file.Length).ConfigureAwait(false);
+ return new UploadFileRsp { FileName = fileName, Url = url };
}
}
\ No newline at end of file
diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/FileCache.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/FileCache.cs
index 525e6683..83965cdd 100644
--- a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/FileCache.cs
+++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/FileCache.cs
@@ -1,3 +1,5 @@
+using NetAdmin.Domain.Dto.Sys.File;
+
namespace NetAdmin.SysComponent.Cache.Sys;
///
@@ -5,7 +7,7 @@ public sealed class FileCache(IDistributedCache cache, IFileService service) //
: DistributedCache(cache, service), IScoped, IFileCache
{
///
- public Task UploadAsync(IFormFile file)
+ public Task UploadAsync(IFormFile file)
{
return Service.UploadAsync(file);
}
diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/FileController.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/FileController.cs
index 5098e813..14c6b18e 100644
--- a/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/FileController.cs
+++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/FileController.cs
@@ -1,3 +1,5 @@
+using NetAdmin.Domain.Dto.Sys.File;
+
namespace NetAdmin.SysComponent.Host.Controllers.Sys;
///
@@ -10,7 +12,7 @@ public sealed class FileController(IFileCache cache) : ControllerBase
/// 文件上传
///
- public Task UploadAsync(IFormFile file)
+ public Task UploadAsync(IFormFile file)
{
return Cache.UploadAsync(file);
}
diff --git a/src/backend/NetAdmin/NetAdmin.Tests/NetAdmin.Tests.csproj b/src/backend/NetAdmin/NetAdmin.Tests/NetAdmin.Tests.csproj
index b6d18a33..4062810f 100644
--- a/src/backend/NetAdmin/NetAdmin.Tests/NetAdmin.Tests.csproj
+++ b/src/backend/NetAdmin/NetAdmin.Tests/NetAdmin.Tests.csproj
@@ -3,7 +3,7 @@
-
+
runtime; build; native; contentfiles; analyzers; buildtransitive
diff --git a/src/backend/UnitTests/Sys/FileTests.cs b/src/backend/UnitTests/Sys/FileTests.cs
index 4b7940d7..e8a51972 100644
--- a/src/backend/UnitTests/Sys/FileTests.cs
+++ b/src/backend/UnitTests/Sys/FileTests.cs
@@ -1,3 +1,5 @@
+using NetAdmin.Domain.Dto.Sys.File;
+
namespace UnitTests.Sys;
///
@@ -11,7 +13,7 @@ public class FileTests(WebTestApplicationFactory factory, ITestOutputHe
///
[InlineData(null)]
[Theory]
- public async Task UploadAsync(IFormFile file)
+ public async Task UploadAsync(IFormFile file)
{
var rsp = await PostJsonAsync(typeof(FileController), file);
Assert.True(rsp.IsSuccessStatusCode);
diff --git a/src/backend/UnitTests/WebApiTestBase.cs b/src/backend/UnitTests/WebApiTestBase.cs
index db2eb011..1b57a746 100644
--- a/src/backend/UnitTests/WebApiTestBase.cs
+++ b/src/backend/UnitTests/WebApiTestBase.cs
@@ -52,9 +52,9 @@ public abstract class WebApiTestBase(WebTestApplicationFactory factory, IT
var req = new LoginByPwdReq //
{
Password
- = Environment.GetEnvironmentVariable(nameof(WebTestApplicationFactory.TEST_PASSWORD)) ??
+ = Environment.GetEnvironmentVariable(nameof(WebTestApplicationFactory<>.TEST_PASSWORD)) ??
WebTestApplicationFactory.TEST_PASSWORD
- , Account = Environment.GetEnvironmentVariable(nameof(WebTestApplicationFactory.TEST_ACCOUNT)) ??
+ , Account = Environment.GetEnvironmentVariable(nameof(WebTestApplicationFactory<>.TEST_ACCOUNT)) ??
WebTestApplicationFactory.TEST_ACCOUNT
};
var loginAccount = JsonContent.Create(req);
diff --git a/src/frontend/admin/package.json b/src/frontend/admin/package.json
index 5be422c7..ccdd47cf 100644
--- a/src/frontend/admin/package.json
+++ b/src/frontend/admin/package.json
@@ -10,12 +10,12 @@
},
"dependencies": {
"@element-plus/icons-vue": "2.3.1",
- "ace-builds": "1.38.0",
+ "ace-builds": "1.39.0",
"aieditor": "1.3.5",
- "axios": "1.7.9",
+ "axios": "1.8.1",
"crypto-js": "4.2.0",
"echarts": "5.6.0",
- "element-plus": "2.9.4",
+ "element-plus": "2.9.5",
"json-bigint": "1.0.0",
"markdown-it": "14.1.0",
"markdown-it-emoji": "3.0.0",
@@ -23,7 +23,7 @@
"sortablejs": "1.15.6",
"vkbeautify": "0.99.3",
"vue": "3.5.13",
- "vue-i18n": "11.1.1",
+ "vue-i18n": "11.1.2",
"vue-router": "4.5.0",
"vue3-ace-editor": "2.2.4",
"vue3-json-viewer": "2.2.2",
@@ -32,11 +32,11 @@
},
"devDependencies": {
"@vitejs/plugin-vue": "5.2.1",
- "prettier": "3.5.0",
+ "prettier": "3.5.3",
"prettier-plugin-organize-attributes": "1.0.0",
- "sass": "1.84.0",
- "terser": "5.38.2",
- "vite": "6.1.0"
+ "sass": "1.85.1",
+ "terser": "5.39.0",
+ "vite": "6.2.1"
},
"browserslist": [
"> 1%",
diff --git a/src/frontend/admin/src/api/tpl/example.js b/src/frontend/admin/src/api/tpl/example.js
index 22829ade..677adca3 100644
--- a/src/frontend/admin/src/api/tpl/example.js
+++ b/src/frontend/admin/src/api/tpl/example.js
@@ -27,6 +27,17 @@ export default {
},
},
+ /**
+ * 示例分组计数
+ */
+ countBy: {
+ url: `${config.API_URL}/api/tpl/example/count.by`,
+ name: `示例分组计数`,
+ post: async function (data = {}, config = {}) {
+ return await http.post(this.url, data, config)
+ },
+ },
+
/**
* 创建示例
*/
diff --git a/src/frontend/admin/src/components/scUpload/file.vue b/src/frontend/admin/src/components/scUpload/file.vue
index c18518ac..1f176856 100644
--- a/src/frontend/admin/src/components/scUpload/file.vue
+++ b/src/frontend/admin/src/components/scUpload/file.vue
@@ -19,7 +19,7 @@
:on-success="success"
:show-file-list="showFileList">
- Click to upload
+ 点击上传
{{ tip }}
diff --git a/src/frontend/admin/src/components/scUpload/multiple.vue b/src/frontend/admin/src/components/scUpload/multiple.vue
index afc83ce8..ca3a3a4f 100644
--- a/src/frontend/admin/src/components/scUpload/multiple.vue
+++ b/src/frontend/admin/src/components/scUpload/multiple.vue
@@ -134,8 +134,8 @@ export default {
//默认值转换为数组
toArr(str) {
const _arr = []
- const arr = str.split(',')
- arr.forEach((item) => {
+ const arr = str?.split(',')
+ arr?.forEach((item) => {
if (item) {
const urlArr = item.split('/')
const fileName = urlArr[urlArr.length - 1]
diff --git a/src/frontend/admin/src/config/upload.js b/src/frontend/admin/src/config/upload.js
index 60cb3857..7cc467de 100644
--- a/src/frontend/admin/src/config/upload.js
+++ b/src/frontend/admin/src/config/upload.js
@@ -10,8 +10,8 @@ export default {
parseData: function (res) {
return {
code: res.code, //分析状态字段结构
- // fileName: null, //分析文件名称
- src: res.data, //分析图片远程地址结构
+ fileName: res.data.fileName, //分析文件名称
+ src: res.data.url, //分析图片远程地址结构
msg: res.msg, //分析描述字段结构
}
},