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 + 点击上传