From 99aa7d336166980da1d247d5a01174927cd94792 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=B7=B3?= Date: Wed, 22 Feb 2023 16:49:24 +0800 Subject: [PATCH 1/7] =?UTF-8?q?refactor:=20=E6=8A=BD=E8=B1=A1=E6=93=8D?= =?UTF-8?q?=E4=BD=9C=E6=97=A5=E5=BF=97=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Yi.BBS.Vue2/src/api/accountApi.js | 6 -- Yi.BBS.Vue2/src/permission.js | 20 ++--- Yi.BBS.Vue2/src/store/modules/user.js | 12 +-- Yi.BBS.Vue2/src/utils/myaxios.js | 8 +- Yi.Framework.Net6/Yi.Framework.sln | 7 ++ .../Dtos/PagedAllResultRequestDto.cs | 7 ++ .../Dtos/PagedAndSortedResultRequestDto.cs | 15 ++++ .../YiFrameworkSwaggerDoc.xml | 30 ++++++++ .../GlobalOperLogAttribute.cs | 10 +-- .../IOperationLogService.cs | 5 +- .../Yi.Framework.OperLog}/OperEnum.cs | 2 +- .../Yi.Framework.OperLog}/OperLogAttribute.cs | 8 +- .../OperationLogEntity.cs | 5 +- .../OperationLogGetListInputVo.cs | 3 +- .../OperationLogGetListOutputDto.cs | 3 +- .../OperationLogService.cs | 9 +-- .../Yi.Framework.OperLog.csproj | 19 +++++ .../YiFrameworkOperLogModule.cs | 24 ++++++ .../module/Yi.Framework.Template/Program.cs | 4 +- .../ApplicationSwaggerDoc.xml | 19 ----- .../project/BBS/Yi.BBS.Web/YiBBSWebModule.cs | 4 +- .../project/BBS/Yi.BBS.Web/appsettings.json | 2 +- .../project/BBS/Yi.BBS.Web/yi-sqlsugar-dev.db | Bin 212992 -> 229376 bytes .../ApplicationSwaggerDoc.xml | 19 ----- .../GlobalSetting/TempService.cs | 70 +++++++++--------- .../project/bbs/Yi.BBS.Web/YiBBSWebModule.cs | 4 +- .../project/bbs/Yi.BBS.Web/appsettings.json | 2 +- .../project/bbs/Yi.BBS.Web/yi-sqlsugar-dev.db | Bin 212992 -> 229376 bytes .../ApplicationContractsSwaggerDoc.xml | 55 ++++++++++++-- .../Dtos/User/ProfileUpdateInputVo.cs | 24 ++++++ .../Dtos/Config/ConfigGetListInputVo.cs | 12 ++- .../Dtos/Config/ConfigGetListOutputDto.cs | 24 ++++++ .../ApplicationSwaggerDoc.xml | 19 +++-- .../Identity/UserService.cs | 21 +++++- .../Setting/ConfigService.cs | 5 ++ .../Yi.RBAC.Domain/DataSeeds/UserDataSeed.cs | 68 +++++++++++++++++ .../rbac/Yi.RBAC.Domain/DomainSwaggerDoc.xml | 50 ------------- .../rbac/Yi.RBAC.Domain/Yi.RBAC.Domain.csproj | 2 +- .../rbac/Yi.RBAC.Domain/YiRBACDomainModule.cs | 9 +-- .../rbac/Yi.RBAC.Web/YiRBACWebModule.cs | 2 + .../rbac/Yi.RBAC.Web/yi-sqlsugar-dev.db | Bin 135168 -> 135168 bytes Yi.RuoYi.Vue3/src/api/system/user.js | 6 +- Yi.RuoYi.Vue3/src/utils/request.js | 13 ++-- 43 files changed, 415 insertions(+), 212 deletions(-) rename Yi.Framework.Net6/src/{project/rbac/Yi.RBAC.Domain/Logs => module/Yi.Framework.OperLog}/GlobalOperLogAttribute.cs (93%) rename Yi.Framework.Net6/src/{project/rbac/Yi.RBAC.Application.Contracts/Logs => module/Yi.Framework.OperLog}/IOperationLogService.cs (66%) rename Yi.Framework.Net6/src/{project/rbac/Yi.RBAC.Domain.Shared/Logs => module/Yi.Framework.OperLog}/OperEnum.cs (90%) rename Yi.Framework.Net6/src/{project/rbac/Yi.RBAC.Domain.Shared/Logs => module/Yi.Framework.OperLog}/OperLogAttribute.cs (82%) rename Yi.Framework.Net6/src/{project/rbac/Yi.RBAC.Domain/Logs/Entities => module/Yi.Framework.OperLog}/OperationLogEntity.cs (92%) rename Yi.Framework.Net6/src/{project/rbac/Yi.RBAC.Application.Contracts/Logs/Dtos/OperationLog => module/Yi.Framework.OperLog}/OperationLogGetListInputVo.cs (89%) rename Yi.Framework.Net6/src/{project/rbac/Yi.RBAC.Application.Contracts/Logs/Dtos/OperationLog => module/Yi.Framework.OperLog}/OperationLogGetListOutputDto.cs (89%) rename Yi.Framework.Net6/src/{project/rbac/Yi.RBAC.Application/Logs => module/Yi.Framework.OperLog}/OperationLogService.cs (72%) create mode 100644 Yi.Framework.Net6/src/module/Yi.Framework.OperLog/Yi.Framework.OperLog.csproj create mode 100644 Yi.Framework.Net6/src/module/Yi.Framework.OperLog/YiFrameworkOperLogModule.cs create mode 100644 Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Identity/Dtos/User/ProfileUpdateInputVo.cs create mode 100644 Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/DataSeeds/UserDataSeed.cs diff --git a/Yi.BBS.Vue2/src/api/accountApi.js b/Yi.BBS.Vue2/src/api/accountApi.js index 0540cda7..f0c04757 100644 --- a/Yi.BBS.Vue2/src/api/accountApi.js +++ b/Yi.BBS.Vue2/src/api/accountApi.js @@ -16,12 +16,6 @@ export default { method: 'post', }) }, - logged() { - return myaxios({ - url: '/Account/logged', - method: 'post', - }) - }, register(username, password, email, code) { return myaxios({ url: `/Account/register?code=${code}`, diff --git a/Yi.BBS.Vue2/src/permission.js b/Yi.BBS.Vue2/src/permission.js index 430689bf..9a3f5455 100644 --- a/Yi.BBS.Vue2/src/permission.js +++ b/Yi.BBS.Vue2/src/permission.js @@ -12,14 +12,16 @@ router.beforeEach((to, from, next) => { next({ path: '/login' }); } } else { //如果有user还要向后端请求是否过期 - store.dispatch("Logged").then(resp => { - if (!resp.status) //表示已经过期 - { - store.dispatch("Logout"); - next({ path: '/login' }); - } else { - next(); - } - }) + + next(); + // store.dispatch("Logged").then(resp => { + // if (!resp.status) //表示已经过期 + // { + // store.dispatch("Logout"); + // next({ path: '/login' }); + // } else { + // next(); + // } + // }) } }) \ No newline at end of file diff --git a/Yi.BBS.Vue2/src/store/modules/user.js b/Yi.BBS.Vue2/src/store/modules/user.js index a09eac0c..2d3717a4 100644 --- a/Yi.BBS.Vue2/src/store/modules/user.js +++ b/Yi.BBS.Vue2/src/store/modules/user.js @@ -63,7 +63,7 @@ const actions = { //动作 return new Promise((resolv, reject) => { accountApi.login(form.username.trim(), form.password.trim()).then(resp => { commit('SET_TOKEN', resp.data.token) - commit('SET_USER', resp.data.user) + // commit('SET_USER', resp.data.user) resolv(resp) }).catch(error => { reject(error) @@ -82,16 +82,6 @@ const actions = { //动作 }) }) }, - Logged({ commit }) { - return new Promise((resolv, reject) => { - accountApi.logged().then(resp => { - resolv(resp) - }).catch(error => { - reject(error) - }) - }) - }, - // GetUserInfo({ commit, state }) { // return new Promise((resolv, reject) => { // // getUserInfo(state.token).then(response => { diff --git a/Yi.BBS.Vue2/src/utils/myaxios.js b/Yi.BBS.Vue2/src/utils/myaxios.js index 2e37c708..1f703c8c 100644 --- a/Yi.BBS.Vue2/src/utils/myaxios.js +++ b/Yi.BBS.Vue2/src/utils/myaxios.js @@ -27,7 +27,11 @@ myaxios.interceptors.request.use(function(config) { // 响应拦截器 myaxios.interceptors.response.use(function(response) { - // const resp = response.data + const resp = response.data + if(resp.code!=200) + { + alert(`错误代码:${resp.code},原因:${resp.message}`) + } store.dispatch("closeLoad"); return response; }, function(error) { @@ -35,7 +39,7 @@ myaxios.interceptors.response.use(function(response) { if (resp.code == undefined && resp.msg == undefined) { alert(`错误代码:无,原因:与服务器失去连接`) } else if (resp.code != 200) { - alert(`错误代码:${resp.code},原因:${resp.msg}`) + alert(`错误代码:${resp.code},原因:${resp.message}`) } store.dispatch("closeLoad"); return Promise.reject(error); diff --git a/Yi.Framework.Net6/Yi.Framework.sln b/Yi.Framework.Net6/Yi.Framework.sln index a64529ea..182280d5 100644 --- a/Yi.Framework.Net6/Yi.Framework.sln +++ b/Yi.Framework.Net6/Yi.Framework.sln @@ -95,6 +95,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Version.cs = Version.cs EndProjectSection EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Yi.Framework.OperLog", "src\module\Yi.Framework.OperLog\Yi.Framework.OperLog.csproj", "{8A604A6B-D1FA-4CFF-BCF5-557519B10FCB}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -245,6 +247,10 @@ Global {FC559052-36EC-4379-B447-298FAD6045F4}.Debug|Any CPU.Build.0 = Debug|Any CPU {FC559052-36EC-4379-B447-298FAD6045F4}.Release|Any CPU.ActiveCfg = Release|Any CPU {FC559052-36EC-4379-B447-298FAD6045F4}.Release|Any CPU.Build.0 = Release|Any CPU + {8A604A6B-D1FA-4CFF-BCF5-557519B10FCB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8A604A6B-D1FA-4CFF-BCF5-557519B10FCB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8A604A6B-D1FA-4CFF-BCF5-557519B10FCB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8A604A6B-D1FA-4CFF-BCF5-557519B10FCB}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -289,6 +295,7 @@ Global {0C031C7D-6F80-4559-977C-AC001036EC44} = {07C9E949-DB5E-4315-A497-FF73746667D8} {60E54034-792C-4A90-BCDF-4D5FFB45089E} = {EEF5F221-0E32-4A3D-B647-B4B5E7305806} {FC559052-36EC-4379-B447-298FAD6045F4} = {EEF5F221-0E32-4A3D-B647-B4B5E7305806} + {8A604A6B-D1FA-4CFF-BCF5-557519B10FCB} = {EEF5F221-0E32-4A3D-B647-B4B5E7305806} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {6C1A3808-0F4F-43FB-A9FE-5F27A3BB2ECF} diff --git a/Yi.Framework.Net6/src/framework/Yi.Framework.Ddd/Dtos/PagedAllResultRequestDto.cs b/Yi.Framework.Net6/src/framework/Yi.Framework.Ddd/Dtos/PagedAllResultRequestDto.cs index 45384dfa..0c7a918b 100644 --- a/Yi.Framework.Net6/src/framework/Yi.Framework.Ddd/Dtos/PagedAllResultRequestDto.cs +++ b/Yi.Framework.Net6/src/framework/Yi.Framework.Ddd/Dtos/PagedAllResultRequestDto.cs @@ -10,7 +10,14 @@ namespace Yi.Framework.Ddd.Dtos { public class PagedAllResultRequestDto : PagedAndSortedResultRequestDto, IPagedAllResultRequestDto, IPagedAndSortedResultRequestDto, IPageTimeResultRequestDto { + /// + /// 查询开始时间条件 + /// public DateTime? StartTime { get; set; } + + /// + /// 查询结束时间条件 + /// public DateTime? EndTime { get; set; } } } diff --git a/Yi.Framework.Net6/src/framework/Yi.Framework.Ddd/Dtos/PagedAndSortedResultRequestDto.cs b/Yi.Framework.Net6/src/framework/Yi.Framework.Ddd/Dtos/PagedAndSortedResultRequestDto.cs index cde6606f..d5d114b0 100644 --- a/Yi.Framework.Net6/src/framework/Yi.Framework.Ddd/Dtos/PagedAndSortedResultRequestDto.cs +++ b/Yi.Framework.Net6/src/framework/Yi.Framework.Ddd/Dtos/PagedAndSortedResultRequestDto.cs @@ -9,9 +9,24 @@ namespace Yi.Framework.Ddd.Dtos { public class PagedAndSortedResultRequestDto : IPagedAndSortedResultRequestDto { + /// + /// 查询当前页条件 + /// public int PageNum { get; set; } = 1; + + /// + /// 查询分页大小条件 + /// public int PageSize { get; set; } = int.MaxValue; + + /// + /// 查询排序字段条件 + /// public string? SortBy { get; set; } + + /// + /// 查询排序类别条件 + /// public OrderByEnum SortType { get; set; } = OrderByEnum.Desc; } } diff --git a/Yi.Framework.Net6/src/framework/Yi.Framework.Ddd/YiFrameworkSwaggerDoc.xml b/Yi.Framework.Net6/src/framework/Yi.Framework.Ddd/YiFrameworkSwaggerDoc.xml index 182fbb53..17d6484d 100644 --- a/Yi.Framework.Net6/src/framework/Yi.Framework.Ddd/YiFrameworkSwaggerDoc.xml +++ b/Yi.Framework.Net6/src/framework/Yi.Framework.Ddd/YiFrameworkSwaggerDoc.xml @@ -4,6 +4,36 @@ Yi.Framework.Ddd + + + 查询开始时间条件 + + + + + 查询结束时间条件 + + + + + 查询当前页条件 + + + + + 查询分页大小条件 + + + + + 查询排序字段条件 + + + + + 查询排序类别条件 + + 注释一下,严格意义这里应该protected,但是我认为 简易程度 与 耦合程度 中是需要进行衡量的 diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/Logs/GlobalOperLogAttribute.cs b/Yi.Framework.Net6/src/module/Yi.Framework.OperLog/GlobalOperLogAttribute.cs similarity index 93% rename from Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/Logs/GlobalOperLogAttribute.cs rename to Yi.Framework.Net6/src/module/Yi.Framework.OperLog/GlobalOperLogAttribute.cs index d7cc28a0..c1460a6f 100644 --- a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/Logs/GlobalOperLogAttribute.cs +++ b/Yi.Framework.Net6/src/module/Yi.Framework.OperLog/GlobalOperLogAttribute.cs @@ -10,11 +10,11 @@ using System.Text; using System.Threading.Tasks; using Yi.Framework.AspNetCore.Extensions; using Yi.Framework.Core.CurrentUsers; +using Yi.Framework.Core.Helper; using Yi.Framework.Ddd.Repositories; -using Yi.Framework.Model.RABC.Entitys; -using Yi.RBAC.Domain.Shared.Logs; -namespace Yi.RBAC.Domain.Logs + +namespace Yi.Framework.OperLog { public class GlobalOperLogAttribute : ActionFilterAttribute { @@ -22,11 +22,11 @@ namespace Yi.RBAC.Domain.Logs private IRepository _repository; private ICurrentUser _currentUser; //注入一个日志服务 - public GlobalOperLogAttribute(ILogger logger, IRepository repository,ICurrentUser currentUser) + public GlobalOperLogAttribute(ILogger logger, IRepository repository, ICurrentUser currentUser) { _logger = logger; _repository = repository; - _currentUser=currentUser; + _currentUser = currentUser; } public override async void OnResultExecuted(ResultExecutedContext context) diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Logs/IOperationLogService.cs b/Yi.Framework.Net6/src/module/Yi.Framework.OperLog/IOperationLogService.cs similarity index 66% rename from Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Logs/IOperationLogService.cs rename to Yi.Framework.Net6/src/module/Yi.Framework.OperLog/IOperationLogService.cs index b676a4b0..3a17ed0f 100644 --- a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Logs/IOperationLogService.cs +++ b/Yi.Framework.Net6/src/module/Yi.Framework.OperLog/IOperationLogService.cs @@ -3,15 +3,14 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; -using Yi.RBAC.Application.Contracts.Logs.Dtos; using Yi.Framework.Ddd.Services.Abstract; -namespace Yi.RBAC.Application.Contracts.Logs +namespace Yi.Framework.OperLog { /// /// OperationLog服务抽象 /// - public interface IOperationLogService : ICrudAppService + public interface IOperationLogService : ICrudAppService { } diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain.Shared/Logs/OperEnum.cs b/Yi.Framework.Net6/src/module/Yi.Framework.OperLog/OperEnum.cs similarity index 90% rename from Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain.Shared/Logs/OperEnum.cs rename to Yi.Framework.Net6/src/module/Yi.Framework.OperLog/OperEnum.cs index 188ad1e2..9aa024d3 100644 --- a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain.Shared/Logs/OperEnum.cs +++ b/Yi.Framework.Net6/src/module/Yi.Framework.OperLog/OperEnum.cs @@ -4,7 +4,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace Yi.RBAC.Domain.Shared.Logs +namespace Yi.Framework.OperLog { public enum OperEnum { diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain.Shared/Logs/OperLogAttribute.cs b/Yi.Framework.Net6/src/module/Yi.Framework.OperLog/OperLogAttribute.cs similarity index 82% rename from Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain.Shared/Logs/OperLogAttribute.cs rename to Yi.Framework.Net6/src/module/Yi.Framework.OperLog/OperLogAttribute.cs index 49625d7a..5b1102b5 100644 --- a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain.Shared/Logs/OperLogAttribute.cs +++ b/Yi.Framework.Net6/src/module/Yi.Framework.OperLog/OperLogAttribute.cs @@ -4,10 +4,10 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace Yi.RBAC.Domain.Shared.Logs +namespace Yi.Framework.OperLog { [AttributeUsage(AttributeTargets.Method)] - public class OperLogAttribute : System.Attribute + public class OperLogAttribute : Attribute { /// /// 操作类型 @@ -31,8 +31,8 @@ namespace Yi.RBAC.Domain.Shared.Logs public OperLogAttribute(string title, OperEnum operationType) { - this.Title = title; - this.OperType = operationType; + Title = title; + OperType = operationType; } } } diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/Logs/Entities/OperationLogEntity.cs b/Yi.Framework.Net6/src/module/Yi.Framework.OperLog/OperationLogEntity.cs similarity index 92% rename from Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/Logs/Entities/OperationLogEntity.cs rename to Yi.Framework.Net6/src/module/Yi.Framework.OperLog/OperationLogEntity.cs index ba513734..defd5de9 100644 --- a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/Logs/Entities/OperationLogEntity.cs +++ b/Yi.Framework.Net6/src/module/Yi.Framework.OperLog/OperationLogEntity.cs @@ -5,15 +5,14 @@ using System.Text.Json.Serialization; using SqlSugar; using Yi.Framework.Data.Auditing; using Yi.Framework.Ddd.Entities; -using Yi.RBAC.Domain.Shared.Logs; -namespace Yi.Framework.Model.RABC.Entitys +namespace Yi.Framework.OperLog { /// /// 操作日志表 /// [SugarTable("OperationLog")] - public class OperationLogEntity : IEntity, ICreationAuditedObject + public class OperationLogEntity : IEntity, ICreationAuditedObject { [SugarColumn(ColumnName = "Id", IsPrimaryKey = true)] public long Id { get; set; } diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Logs/Dtos/OperationLog/OperationLogGetListInputVo.cs b/Yi.Framework.Net6/src/module/Yi.Framework.OperLog/OperationLogGetListInputVo.cs similarity index 89% rename from Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Logs/Dtos/OperationLog/OperationLogGetListInputVo.cs rename to Yi.Framework.Net6/src/module/Yi.Framework.OperLog/OperationLogGetListInputVo.cs index dce0661b..c1be7f4f 100644 --- a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Logs/Dtos/OperationLog/OperationLogGetListInputVo.cs +++ b/Yi.Framework.Net6/src/module/Yi.Framework.OperLog/OperationLogGetListInputVo.cs @@ -4,9 +4,8 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using Yi.Framework.Ddd.Dtos; -using Yi.RBAC.Domain.Shared.Logs; -namespace Yi.RBAC.Application.Contracts.Logs.Dtos +namespace Yi.Framework.OperLog { public class OperationLogGetListInputVo : PagedAllResultRequestDto { diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Logs/Dtos/OperationLog/OperationLogGetListOutputDto.cs b/Yi.Framework.Net6/src/module/Yi.Framework.OperLog/OperationLogGetListOutputDto.cs similarity index 89% rename from Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Logs/Dtos/OperationLog/OperationLogGetListOutputDto.cs rename to Yi.Framework.Net6/src/module/Yi.Framework.OperLog/OperationLogGetListOutputDto.cs index 0f727957..1e3191b6 100644 --- a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Logs/Dtos/OperationLog/OperationLogGetListOutputDto.cs +++ b/Yi.Framework.Net6/src/module/Yi.Framework.OperLog/OperationLogGetListOutputDto.cs @@ -4,9 +4,8 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using Yi.Framework.Ddd.Dtos; -using Yi.RBAC.Domain.Shared.Logs; -namespace Yi.RBAC.Application.Contracts.Logs.Dtos +namespace Yi.Framework.OperLog { public class OperationLogGetListOutputDto : IEntityDto { diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/Logs/OperationLogService.cs b/Yi.Framework.Net6/src/module/Yi.Framework.OperLog/OperationLogService.cs similarity index 72% rename from Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/Logs/OperationLogService.cs rename to Yi.Framework.Net6/src/module/Yi.Framework.OperLog/OperationLogService.cs index b267768a..d2843854 100644 --- a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/Logs/OperationLogService.cs +++ b/Yi.Framework.Net6/src/module/Yi.Framework.OperLog/OperationLogService.cs @@ -1,18 +1,15 @@ -using Yi.RBAC.Application.Contracts.Logs; using NET.AutoWebApi.Setting; -using Yi.RBAC.Application.Contracts.Logs.Dtos; -using Yi.RBAC.Domain.Logs.Entities; using Yi.Framework.Ddd.Services; -using Yi.Framework.Model.RABC.Entitys; using Yi.Framework.Ddd.Dtos; +using Yi.Framework.Core.Attributes; -namespace Yi.RBAC.Application.Logs +namespace Yi.Framework.OperLog { /// /// OperationLog服务实现 /// [AppService] - public class OperationLogService : CrudAppService, + public class OperationLogService : CrudAppService, IOperationLogService, IAutoApiService { public override Task> GetListAsync(OperationLogGetListInputVo input) diff --git a/Yi.Framework.Net6/src/module/Yi.Framework.OperLog/Yi.Framework.OperLog.csproj b/Yi.Framework.Net6/src/module/Yi.Framework.OperLog/Yi.Framework.OperLog.csproj new file mode 100644 index 00000000..a77b0b8f --- /dev/null +++ b/Yi.Framework.Net6/src/module/Yi.Framework.OperLog/Yi.Framework.OperLog.csproj @@ -0,0 +1,19 @@ + + + + net6.0 + enable + enable + + + + + + + + + + + + + diff --git a/Yi.Framework.Net6/src/module/Yi.Framework.OperLog/YiFrameworkOperLogModule.cs b/Yi.Framework.Net6/src/module/Yi.Framework.OperLog/YiFrameworkOperLogModule.cs new file mode 100644 index 00000000..ee0db3bc --- /dev/null +++ b/Yi.Framework.Net6/src/module/Yi.Framework.OperLog/YiFrameworkOperLogModule.cs @@ -0,0 +1,24 @@ +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.DependencyInjection; +using StartupModules; +using Yi.Framework.Core; +using Yi.Framework.Core.Attributes; + +namespace Yi.Framework.OperLog +{ + [DependsOn(typeof(YiFrameworkCoreModule))] + public class YiFrameworkOperLogModule : IStartupModule + { + public void Configure(IApplicationBuilder app, ConfigureMiddlewareContext context) + { + } + + public void ConfigureServices(IServiceCollection services, ConfigureServicesContext context) + { + services.AddControllers(options => { + options.Filters.Add(); + }); + services.AddSingleton(); + } + } +} \ No newline at end of file diff --git a/Yi.Framework.Net6/src/module/Yi.Framework.Template/Program.cs b/Yi.Framework.Net6/src/module/Yi.Framework.Template/Program.cs index 1d6c5a27..7ec9ebe8 100644 --- a/Yi.Framework.Net6/src/module/Yi.Framework.Template/Program.cs +++ b/Yi.Framework.Net6/src/module/Yi.Framework.Template/Program.cs @@ -20,9 +20,9 @@ TemplateFactory templateFactory = new(); //string modelName = "Dictionary"; //string nameSpaces = "Yi.RBAC"; //List entityNames = new() { "_", "_" }; -string modelName = "Logs"; +string modelName = "Setting"; string nameSpaces = "Yi.RBAC"; -List entityNames = new() { "_" }; +List entityNames = new() { "File" }; foreach (var entityName in entityNames) diff --git a/Yi.Framework.Net6/src/project/BBS/Yi.BBS.Application/ApplicationSwaggerDoc.xml b/Yi.Framework.Net6/src/project/BBS/Yi.BBS.Application/ApplicationSwaggerDoc.xml index 9dc71566..00dc323b 100644 --- a/Yi.Framework.Net6/src/project/BBS/Yi.BBS.Application/ApplicationSwaggerDoc.xml +++ b/Yi.Framework.Net6/src/project/BBS/Yi.BBS.Application/ApplicationSwaggerDoc.xml @@ -120,25 +120,6 @@ 临时服务,之后用其他模块代替 - - - 登录 - - - - - - - 判断是否有登录 - - - - - - 退出登录 - - - 获取用户信息 diff --git a/Yi.Framework.Net6/src/project/BBS/Yi.BBS.Web/YiBBSWebModule.cs b/Yi.Framework.Net6/src/project/BBS/Yi.BBS.Web/YiBBSWebModule.cs index 9a9129cb..f7417fd2 100644 --- a/Yi.Framework.Net6/src/project/BBS/Yi.BBS.Web/YiBBSWebModule.cs +++ b/Yi.Framework.Net6/src/project/BBS/Yi.BBS.Web/YiBBSWebModule.cs @@ -10,6 +10,7 @@ using Yi.Framework.Core.Autofac; using Yi.RBAC.Application; using Yi.Framework.AspNetCore; using Yi.Framework.Data.Json; +using Yi.Framework.OperLog; namespace Yi.BBS.Web { @@ -31,7 +32,8 @@ namespace Yi.BBS.Web { //NETServiceTest所在程序集添加进动态api配置 opt.CreateConventional(typeof(YiBBSApplicationModule).Assembly, option => option.RootPath = string.Empty); - //opt.CreateConventional(typeof(YiRBACApplicationModule).Assembly, option => option.RootPath = string.Empty); + opt.CreateConventional(typeof(YiRBACApplicationModule).Assembly, option => option.RootPath = string.Empty); + opt.CreateConventional(typeof(YiFrameworkOperLogModule).Assembly, option => option.RootPath = string.Empty); }); //添加swagger diff --git a/Yi.Framework.Net6/src/project/BBS/Yi.BBS.Web/appsettings.json b/Yi.Framework.Net6/src/project/BBS/Yi.BBS.Web/appsettings.json index bf88b491..1d927cdf 100644 --- a/Yi.Framework.Net6/src/project/BBS/Yi.BBS.Web/appsettings.json +++ b/Yi.Framework.Net6/src/project/BBS/Yi.BBS.Web/appsettings.json @@ -16,7 +16,7 @@ "DbConnOptions": { "Url": "DataSource=yi-sqlsugar-dev.db", "DbType": "Sqlite", - "EnabledDbSeed": false, + "EnabledDbSeed": true, "EnabledReadWrite": false, "EnabledCodeFirst": true, "EntityAssembly": null, diff --git a/Yi.Framework.Net6/src/project/BBS/Yi.BBS.Web/yi-sqlsugar-dev.db b/Yi.Framework.Net6/src/project/BBS/Yi.BBS.Web/yi-sqlsugar-dev.db index 4bc8b298f3c68ae4dda27581a7b861743030bbd9..1516839bd898822ba9be143c7fa317f8c9ed5637 100644 GIT binary patch delta 1828 zcmbW1TTI(#6vzG9aV`aH=mkm+ zMqMIa{Kg`90>|we@H7&qWpY;am)l<>ew+FzkT~x%`XZTv%NR6^fxkR747(D@-f`LH^WY*N5NcLOXK{i7#*M zE#E%vq1+yKSM{(?BYDfNk&CMg%_@_HQb>Ev+O8Ibg|rPdG&NcMUWy;T-xwK3!k%fJLJ!Mimd>w7->K1pKT|J;tT9rPZ*WhdFuj@8fHP}qDn))iY!&oD( z@dsQQxkB4+=~bEQsNv2&nX0uz+G=vvd#@XUK8HiSc&g7?z@&CwWY8kS7im5J)??U*Wcr0t{5q>&d zXE+PtrrBeE>k%QzABJ)O1_`wMRep%K%&$YWya3XIW`nCpF*d`vjvN4s(1|#M6-t;6lN3QZwdgcyL z353E@CBZGYCSrMuGQ+fxnKMPaB?gzEu)swJ?!$j^AP5y7e!(hOG4d|SD=01oqj)ke z2l+aG2;ZnXdH(Kp-`cmnD_3l)PnB|Rb`yttjS#Snn z$nG_BgmKRA@N)}0!ca^G;d6LB_6IhB$(a68f(6^rQ(S4@s}~C{l|uPb->XRGvmw<4 zAtp%X6cR*5^0e6!(Yrg*6)|&5M875_$})oak$O)z<+|?Z?_^>Ul7!8+JH5X1&F$UT z`tJHnJ10~7!Ea}nUi2^RAgg~eapZ{jgUJ&G9y}&;I8%HvdiF%($7q8LZR^ycQ&Ih& zw469AY->RAEw(l6;@kKS_*N`W_ytY}9|H7By1ZyM!Ug$Lsd{kIlVtvo)Fj1w&`px@ F{R2X~a5w+} delta 364 zcmYL^%S!@L9EI=i&QqI*6Qn&5O{lbll7a}Ktq2KIgb)NhU}z&m(INzCEQnU6xVRB5 z1SOHOG{I{-*R3O|RsVv!j9wN*2hQd!KE7j`ifPKJ0WF9Sn(Fi~-n4%bf|b=Xm3MZw zer?}YvjJ-|8q=mi3X;GhgtsCinR&rQOKDhCh8RE+7)UKDW#vG=mrulL(aL=ZPs}Ly z2!!PX3U5fGj`tbe_{^T%D^^qtnRL|`iILW?jnteBDJZ8RJ*(+Pe`ZIhGp9l t7AvAD+=wAAEX0{8Csj3@pP|tz_HY;>60hS|`j&-b{#Iw*lzqYPE8oRfWNZKc diff --git a/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Application/ApplicationSwaggerDoc.xml b/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Application/ApplicationSwaggerDoc.xml index 9dc71566..00dc323b 100644 --- a/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Application/ApplicationSwaggerDoc.xml +++ b/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Application/ApplicationSwaggerDoc.xml @@ -120,25 +120,6 @@ 临时服务,之后用其他模块代替 - - - 登录 - - - - - - - 判断是否有登录 - - - - - - 退出登录 - - - 获取用户信息 diff --git a/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Application/GlobalSetting/TempService.cs b/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Application/GlobalSetting/TempService.cs index 48815354..eea37a3d 100644 --- a/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Application/GlobalSetting/TempService.cs +++ b/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Application/GlobalSetting/TempService.cs @@ -14,43 +14,43 @@ namespace Yi.BBS.Application.GlobalSetting [AppService] public class TempService : ApplicationService, IAutoApiService { - /// - /// 登录 - /// - /// - /// - [Route("/api/account/login")] - public Task PostLoginAsync() - { - bool loginSucces = true; - if (!loginSucces) - { - throw new UserFriendlyException("登录失败", (int)BbsHttpStatusEnum.LoginFailed, "用户或者密码错误"); - } - var dto = new LoginDto("token"); - dto.User = new LoginUserInfoDto { Icon = "", Id = 0, Level = 1, UserName = "橙子" }; - return Task.FromResult(dto); - } + ///// + ///// 登录 + ///// + ///// + ///// + //[Route("/api/account/login")] + //public Task PostLoginAsync() + //{ + // bool loginSucces = true; + // if (!loginSucces) + // { + // throw new UserFriendlyException("登录失败", (int)BbsHttpStatusEnum.LoginFailed, "用户或者密码错误"); + // } + // var dto = new LoginDto("token"); + // dto.User = new LoginUserInfoDto { Icon = "", Id = 0, Level = 1, UserName = "橙子" }; + // return Task.FromResult(dto); + //} - /// - /// 判断是否有登录 - /// - /// - [Route("/api/account/logged")] - public Task PostLogged() - { - return Task.FromResult(true); - } + ///// + ///// 判断是否有登录 + ///// + ///// + //[Route("/api/account/logged")] + //public Task PostLogged() + //{ + // return Task.FromResult(true); + //} - /// - /// 退出登录 - /// - /// - [Route("/api/account/logout")] - public Task PostlogOut() - { - return Task.CompletedTask; - } + ///// + ///// 退出登录 + ///// + ///// + //[Route("/api/account/logout")] + //public Task PostlogOut() + //{ + // return Task.CompletedTask; + //} /// /// 获取用户信息 diff --git a/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Web/YiBBSWebModule.cs b/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Web/YiBBSWebModule.cs index 9a9129cb..f7417fd2 100644 --- a/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Web/YiBBSWebModule.cs +++ b/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Web/YiBBSWebModule.cs @@ -10,6 +10,7 @@ using Yi.Framework.Core.Autofac; using Yi.RBAC.Application; using Yi.Framework.AspNetCore; using Yi.Framework.Data.Json; +using Yi.Framework.OperLog; namespace Yi.BBS.Web { @@ -31,7 +32,8 @@ namespace Yi.BBS.Web { //NETServiceTest所在程序集添加进动态api配置 opt.CreateConventional(typeof(YiBBSApplicationModule).Assembly, option => option.RootPath = string.Empty); - //opt.CreateConventional(typeof(YiRBACApplicationModule).Assembly, option => option.RootPath = string.Empty); + opt.CreateConventional(typeof(YiRBACApplicationModule).Assembly, option => option.RootPath = string.Empty); + opt.CreateConventional(typeof(YiFrameworkOperLogModule).Assembly, option => option.RootPath = string.Empty); }); //添加swagger diff --git a/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Web/appsettings.json b/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Web/appsettings.json index bf88b491..1d927cdf 100644 --- a/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Web/appsettings.json +++ b/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Web/appsettings.json @@ -16,7 +16,7 @@ "DbConnOptions": { "Url": "DataSource=yi-sqlsugar-dev.db", "DbType": "Sqlite", - "EnabledDbSeed": false, + "EnabledDbSeed": true, "EnabledReadWrite": false, "EnabledCodeFirst": true, "EntityAssembly": null, diff --git a/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Web/yi-sqlsugar-dev.db b/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Web/yi-sqlsugar-dev.db index 4bc8b298f3c68ae4dda27581a7b861743030bbd9..1516839bd898822ba9be143c7fa317f8c9ed5637 100644 GIT binary patch delta 1828 zcmbW1TTI(#6vzG9aV`aH=mkm+ zMqMIa{Kg`90>|we@H7&qWpY;am)l<>ew+FzkT~x%`XZTv%NR6^fxkR747(D@-f`LH^WY*N5NcLOXK{i7#*M zE#E%vq1+yKSM{(?BYDfNk&CMg%_@_HQb>Ev+O8Ibg|rPdG&NcMUWy;T-xwK3!k%fJLJ!Mimd>w7->K1pKT|J;tT9rPZ*WhdFuj@8fHP}qDn))iY!&oD( z@dsQQxkB4+=~bEQsNv2&nX0uz+G=vvd#@XUK8HiSc&g7?z@&CwWY8kS7im5J)??U*Wcr0t{5q>&d zXE+PtrrBeE>k%QzABJ)O1_`wMRep%K%&$YWya3XIW`nCpF*d`vjvN4s(1|#M6-t;6lN3QZwdgcyL z353E@CBZGYCSrMuGQ+fxnKMPaB?gzEu)swJ?!$j^AP5y7e!(hOG4d|SD=01oqj)ke z2l+aG2;ZnXdH(Kp-`cmnD_3l)PnB|Rb`yttjS#Snn z$nG_BgmKRA@N)}0!ca^G;d6LB_6IhB$(a68f(6^rQ(S4@s}~C{l|uPb->XRGvmw<4 zAtp%X6cR*5^0e6!(Yrg*6)|&5M875_$})oak$O)z<+|?Z?_^>Ul7!8+JH5X1&F$UT z`tJHnJ10~7!Ea}nUi2^RAgg~eapZ{jgUJ&G9y}&;I8%HvdiF%($7q8LZR^ycQ&Ih& zw469AY->RAEw(l6;@kKS_*N`W_ytY}9|H7By1ZyM!Ug$Lsd{kIlVtvo)Fj1w&`px@ F{R2X~a5w+} delta 364 zcmYL^%S!@L9EI=i&QqI*6Qn&5O{lbll7a}Ktq2KIgb)NhU}z&m(INzCEQnU6xVRB5 z1SOHOG{I{-*R3O|RsVv!j9wN*2hQd!KE7j`ifPKJ0WF9Sn(Fi~-n4%bf|b=Xm3MZw zer?}YvjJ-|8q=mi3X;GhgtsCinR&rQOKDhCh8RE+7)UKDW#vG=mrulL(aL=ZPs}Ly z2!!PX3U5fGj`tbe_{^T%D^^qtnRL|`iILW?jnteBDJZ8RJ*(+Pe`ZIhGp9l t7AvAD+=wAAEX0{8Csj3@pP|tz_HY;>60hS|`j&-b{#Iw*lzqYPE8oRfWNZKc diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/ApplicationContractsSwaggerDoc.xml b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/ApplicationContractsSwaggerDoc.xml index e4d97274..cf583a46 100644 --- a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/ApplicationContractsSwaggerDoc.xml +++ b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/ApplicationContractsSwaggerDoc.xml @@ -94,16 +94,61 @@ 登录信息 - - - OperationLog服务抽象 - - Config输入创建对象 + + + 配置查询参数 + + + + + 配置名称 + + + + + 配置键 + + + + + 配置名称 + + + + + 配置主键 + + + + + 配置值 + + + + + 配置类型 + + + + + 排序字段 + + + + + 备注 + + + + + 创建时间 + + Config服务抽象 diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Identity/Dtos/User/ProfileUpdateInputVo.cs b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Identity/Dtos/User/ProfileUpdateInputVo.cs new file mode 100644 index 00000000..f5696f2a --- /dev/null +++ b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Identity/Dtos/User/ProfileUpdateInputVo.cs @@ -0,0 +1,24 @@ +using Mapster; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Yi.RBAC.Domain.Shared.Identity.EnumClasses; + +namespace Yi.RBAC.Application.Contracts.Identity.Dtos.User +{ + public class ProfileUpdateInputVo + { + public string? Name { get; set; } + public int? Age { get; set; } + public string? Icon { get; set; } + public string? Nick { get; set; } + public string? Email { get; set; } + public string? Address { get; set; } + public long? Phone { get; set; } + public string? Introduction { get; set; } + public string? Remark { get; set; } + public SexEnum? Sex { get; set; } + } +} diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Setting/Dtos/Config/ConfigGetListInputVo.cs b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Setting/Dtos/Config/ConfigGetListInputVo.cs index 4d1c0a30..1782cec4 100644 --- a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Setting/Dtos/Config/ConfigGetListInputVo.cs +++ b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Setting/Dtos/Config/ConfigGetListInputVo.cs @@ -7,10 +7,20 @@ using Yi.Framework.Ddd.Dtos; namespace Yi.RBAC.Application.Contracts.Setting.Dtos { + /// + /// òѯ + /// public class ConfigGetListInputVo : PagedAllResultRequestDto { + /// + /// + /// public string? ConfigName { get; set; } + + /// + /// ü + /// public string? ConfigKey { get; set; } - public DateTime CreationTime { get; set; } + } } diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Setting/Dtos/Config/ConfigGetListOutputDto.cs b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Setting/Dtos/Config/ConfigGetListOutputDto.cs index 73819616..1b1da511 100644 --- a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Setting/Dtos/Config/ConfigGetListOutputDto.cs +++ b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Setting/Dtos/Config/ConfigGetListOutputDto.cs @@ -10,12 +10,36 @@ namespace Yi.RBAC.Application.Contracts.Setting.Dtos public class ConfigGetListOutputDto : IEntityDto { public long Id { get; set; } + /// + /// + /// public string ConfigName { get; set; } = string.Empty; + + /// + /// + /// public string ConfigKey { get; set; } = string.Empty; + /// + /// ֵ + /// public string ConfigValue { get; set; } = string.Empty; + /// + /// + /// public string? ConfigType { get; set; } + /// + /// ֶ + /// public int OrderNum { get; set; } + + /// + /// ע + /// public string? Remark { get; set; } + + /// + /// ʱ + /// public DateTime CreationTime { get; set; } } } diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/ApplicationSwaggerDoc.xml b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/ApplicationSwaggerDoc.xml index 75e1f5ac..38916e3c 100644 --- a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/ApplicationSwaggerDoc.xml +++ b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/ApplicationSwaggerDoc.xml @@ -171,6 +171,13 @@ + + + 更新个人中心 + + + + 更新状态 @@ -179,15 +186,17 @@ - - - OperationLog服务实现 - - Config服务实现 + + + 多查 + + + + diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/Identity/UserService.cs b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/Identity/UserService.cs index c41f34d4..aa1ce658 100644 --- a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/Identity/UserService.cs +++ b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/Identity/UserService.cs @@ -12,6 +12,8 @@ using SqlSugar; using Mapster; using Microsoft.AspNetCore.Mvc; using Yi.Framework.Auth.JwtBearer.Authorization; +using Yi.RBAC.Application.Contracts.Identity.Dtos.User; +using Yi.Framework.Core.CurrentUsers; namespace Yi.RBAC.Application.Identity { @@ -31,6 +33,9 @@ namespace Yi.RBAC.Application.Identity [Autowired] private IUserRepository _userRepository { get; set; } + [Autowired] + private ICurrentUser _currentUser { get; set; } + /// /// 查询用户 /// @@ -135,6 +140,20 @@ namespace Yi.RBAC.Application.Identity return await MapToGetOutputDtoAsync(entity); } + /// + /// 更新个人中心 + /// + /// + /// + public async Task UpdateProfileAsync(ProfileUpdateInputVo input) + { + var entity = await _repository.GetByIdAsync(_currentUser.Id); + _mapper.Map(input, entity); + await _repository.UpdateAsync(entity); + var dto = _mapper.Map(entity); + return dto; + } + /// /// 更新状态 /// @@ -142,7 +161,7 @@ namespace Yi.RBAC.Application.Identity /// /// [Route("/api/user/{id}/{state}")] - public async Task UpdateStateAsync([FromRoute] long id,[FromRoute] bool state) + public async Task UpdateStateAsync([FromRoute] long id, [FromRoute] bool state) { var entity = await _repository.GetByIdAsync(id); if (entity is null) diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/Setting/ConfigService.cs b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/Setting/ConfigService.cs index 3cf4e1f8..c996a43a 100644 --- a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/Setting/ConfigService.cs +++ b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/Setting/ConfigService.cs @@ -19,6 +19,11 @@ namespace Yi.RBAC.Application.Setting public class ConfigService : CrudAppService, IConfigService, IAutoApiService { + /// + /// 多查 + /// + /// + /// public override async Task> GetListAsync(ConfigGetListInputVo input) { var entity = await MapToEntityAsync(input); diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/DataSeeds/UserDataSeed.cs b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/DataSeeds/UserDataSeed.cs new file mode 100644 index 00000000..b16193da --- /dev/null +++ b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/DataSeeds/UserDataSeed.cs @@ -0,0 +1,68 @@ +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Yi.Framework.Data.DataSeeds; +using Yi.Framework.Ddd.Repositories; +using Yi.RBAC.Domain.Identity.Entities; +using Yi.RBAC.Domain.Shared.Identity.EnumClasses; + +namespace Yi.RBAC.Domain.DataSeeds +{ + [AppService(typeof(IDataSeed))] + public class UserDataSeed : AbstractDataSeed + { + public UserDataSeed(IRepository repository) : base(repository) + { + } + + public override List GetSeedData() + { + var entities=new List(); + UserEntity user1 = new UserEntity() + { + Id = SnowFlakeSingle.Instance.NextId(), + Name = "大橙子", + UserName = "cc", + Nick = "橙子", + Password = "123456", + Email = "454313500@qq.com", + Phone = 13800000000, + Sex = SexEnum.Male, + Address = "深圳", + Age = 20, + Introduction = "还有谁?", + OrderNum = 999, + Remark = "描述是什么呢?", + State = true + }; + user1.BuildPassword(); + entities.Add(user1); + + UserEntity user2 = new UserEntity() + { + Id = SnowFlakeSingle.Instance.NextId(), + Name = "大测试", + UserName = "test", + Nick = "测试", + Password = "123456", + Email = "454313500@qq.com", + Phone = 15900000000, + Sex = SexEnum.Woman, + Address = "深圳", + Age = 18, + Introduction = "还有我!", + OrderNum = 1, + Remark = "我没有描述!", + State = true + + }; + user2.BuildPassword(); + entities.Add(user2); + + return entities; + } + } +} diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/DomainSwaggerDoc.xml b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/DomainSwaggerDoc.xml index e60d99a5..d7fd7578 100644 --- a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/DomainSwaggerDoc.xml +++ b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/DomainSwaggerDoc.xml @@ -790,55 +790,5 @@ 描述 - - - 操作日志表 - - - - - 操作模块 - - - - - 操作类型 - - - - - 请求方法 - - - - - 操作人员 - - - - - 操作Ip - - - - - 操作地点 - - - - - 操作方法 - - - - - 请求参数 - - - - - 请求结果 - - diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/Yi.RBAC.Domain.csproj b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/Yi.RBAC.Domain.csproj index d8fd344f..3eb4861c 100644 --- a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/Yi.RBAC.Domain.csproj +++ b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/Yi.RBAC.Domain.csproj @@ -12,12 +12,12 @@ - + diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/YiRBACDomainModule.cs b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/YiRBACDomainModule.cs index 5a2e9966..40ecf429 100644 --- a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/YiRBACDomainModule.cs +++ b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/YiRBACDomainModule.cs @@ -10,6 +10,7 @@ using System.Threading.Tasks; using Yi.Framework.Core.Attributes; using Yi.Framework.Data; using Yi.Framework.EventBus; +using Yi.Framework.OperLog; using Yi.Framework.ThumbnailSharp; using Yi.RBAC.Domain.Logs; using Yi.RBAC.Domain.Shared; @@ -20,7 +21,8 @@ namespace Yi.RBAC.Domain typeof(YiRBACDomainSharedModule), typeof(YiFrameworkDataModule), typeof(YiFrameworkThumbnailSharpModule), - typeof(YiFrameworkEventBusModule) + typeof(YiFrameworkEventBusModule), + typeof(YiFrameworkOperLogModule) )] public class YiRBACDomainModule : IStartupModule { @@ -31,10 +33,7 @@ namespace Yi.RBAC.Domain public void ConfigureServices(IServiceCollection services, ConfigureServicesContext context) { services.AddHeiCaptcha(); - services.AddControllers(options => { - options.Filters.Add(); - }); - services.AddSingleton(); + } } } diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Web/YiRBACWebModule.cs b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Web/YiRBACWebModule.cs index de6f4604..275e2fd7 100644 --- a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Web/YiRBACWebModule.cs +++ b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Web/YiRBACWebModule.cs @@ -7,6 +7,7 @@ using Yi.Framework.Core; using Yi.Framework.Core.Attributes; using Yi.Framework.Core.Autofac; using Yi.Framework.Data.Json; +using Yi.Framework.OperLog; using Yi.RBAC.Application; using Yi.RBAC.Sqlsugar; @@ -32,6 +33,7 @@ namespace Yi.RBAC.Web { //NETServiceTest所在程序集添加进动态api配置 opt.CreateConventional(typeof(YiRBACApplicationModule).Assembly, option => option.RootPath = string.Empty); + opt.CreateConventional(typeof(YiFrameworkOperLogModule).Assembly, option => option.RootPath = string.Empty); }); //添加swagger diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Web/yi-sqlsugar-dev.db b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Web/yi-sqlsugar-dev.db index 2ebb7ed8ccf616efd81a43a166437207064ad417..ecff1f8fe80d1f5c63f53a794a6fb9637048ffd6 100644 GIT binary patch delta 559 zcmZozz|pXPV}dke&O{k!#+;1_3-x(<-!ZUqCo%9F^Bv|++RSGV!Y$Mo&n(HtA;=-v zXlW}csm>tDI>}C~zTCpa-#5b1*Rd)x&oekDGRrxm$k)f++0-?uG|J1w+%w6{*)%)1 zq$t-cNY}~9GBGkfFuB;n+|o4L(;zoAGC4gW%QZ65+p;((*dnkbDbv`+($dkx-_oVj z+sioLu+X9^tTZbpEv?ci(AKuNq$o2l9f=f4cPK2>OU}=Qh%qo*p6=Q^d5)d>W*3`P zj4b@h3|A+AvQ^2WuQMl4u#=el-;Sqwh28cQc8oC-d06Aa@V?lL!aYaoAu^AuwSe>RHxX&o=`fSdcr*k&w0;y+nb{QI(>lpx{p?^t6YEgJ* zUP^v>v4WvNa`N+;yPxiz`h4^5=ey@eF(Vsw`p`RwQO0B#HGSQE#<0yS3(oNif!!p) Uz{11K#wa!eWa{=O?-^wj0D{@c4gdfE delta 259 zcmZozz|pXPV}dke`a~IL#`KK|3-x*Vl^IxhTp0L``402G+stPW!aX@b;n8Lnn^lY~ zjX}(klRw$2t;oV zDt7(iU?=wnHUw@x56sYhy1OFHP=lr)e3vM{i&&~^0z_k6zdqx=r E0HfqrFaQ7m diff --git a/Yi.RuoYi.Vue3/src/api/system/user.js b/Yi.RuoYi.Vue3/src/api/system/user.js index bf3f580e..d930f452 100644 --- a/Yi.RuoYi.Vue3/src/api/system/user.js +++ b/Yi.RuoYi.Vue3/src/api/system/user.js @@ -69,7 +69,7 @@ export function changeUserStatus(userId, isDel) { // 查询用户个人信息 export function getUserProfile() { return request({ - url: '/account/getUserAllInfo', + url: '/account', method: 'get' }) } @@ -77,9 +77,9 @@ export function getUserProfile() { // 修改用户个人信息 export function updateUserProfile(data) { return request({ - url: '/user/UpdateProfile', + url: `/user/profile`, method: 'put', - data: { user: data } + data: data }) } diff --git a/Yi.RuoYi.Vue3/src/utils/request.js b/Yi.RuoYi.Vue3/src/utils/request.js index 7903a0a4..29dfbe0b 100644 --- a/Yi.RuoYi.Vue3/src/utils/request.js +++ b/Yi.RuoYi.Vue3/src/utils/request.js @@ -74,14 +74,11 @@ service.interceptors.request.use(config => { // 响应拦截器 service.interceptors.response.use(res => { - // // 未设置状态码则默认成功状态 - // const code = res.data.code || 200; - // // 获取错误信息 - // const msg = errorCode[code] || res.data.message || errorCode['default'] - - const code=200; - const msg="成功"; - + // 未设置状态码则默认成功状态 + const code = res.data.code || 200; + // 获取错误信息 + const msg = errorCode[code] || res.data.message || errorCode['default'] + // 二进制数据则直接返回 if(res.request.responseType === 'blob' || res.request.responseType === 'arraybuffer'){ return res From 232cbad5bd7645d98a93a84214dbac102c9235d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=B7=B3?= Date: Wed, 22 Feb 2023 17:14:30 +0800 Subject: [PATCH 2/7] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=BC=95=E5=85=A5?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/module/Yi.Framework.OperLog/OperationLogService.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Yi.Framework.Net6/src/module/Yi.Framework.OperLog/OperationLogService.cs b/Yi.Framework.Net6/src/module/Yi.Framework.OperLog/OperationLogService.cs index dc57a9aa..8c92681b 100644 --- a/Yi.Framework.Net6/src/module/Yi.Framework.OperLog/OperationLogService.cs +++ b/Yi.Framework.Net6/src/module/Yi.Framework.OperLog/OperationLogService.cs @@ -2,6 +2,8 @@ using NET.AutoWebApi.Setting; using Yi.Framework.Ddd.Services; using Yi.Framework.Ddd.Dtos; using Yi.Framework.Core.Attributes; +using Microsoft.AspNetCore.Mvc; +using SqlSugar; namespace Yi.Framework.OperLog { From 49acf0c7c99136e0d53616bd6c29df33c868a7cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=B7=B3?= Date: Wed, 22 Feb 2023 17:30:20 +0800 Subject: [PATCH 3/7] =?UTF-8?q?feat:=20=E5=AE=8C=E6=88=90=E6=93=8D?= =?UTF-8?q?=E4=BD=9C=E6=97=A5=E5=BF=97=E6=A8=A1=E5=9D=97+=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E6=96=87=E4=BB=B6=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Yi.Framework.Net6/Yi.Framework.sln | 9 ++++++++- .../Yi.Framework.FileManager.csproj | 13 +++++++++++++ .../YiFrameworkFileManagerModule.cs | 7 +++++++ .../GlobalOperLogAttribute.cs | 2 +- .../IOperationLogService.cs | 2 +- .../OperEnum.cs | 2 +- .../OperLogAttribute.cs | 2 +- .../OperationLogEntity.cs | 2 +- .../OperationLogGetListInputVo.cs | 2 +- .../OperationLogGetListOutputDto.cs | 2 +- .../OperationLogService.cs | 2 +- .../Yi.Framework.OperLogManager.csproj} | 0 .../YiFrameworkOperLogManagerModule.cs} | 11 +++++++++-- .../src/project/BBS/Yi.BBS.Web/YiBBSWebModule.cs | 4 +--- .../src/project/bbs/Yi.BBS.Web/YiBBSWebModule.cs | 4 +--- .../rbac/Yi.RBAC.Domain/Yi.RBAC.Domain.csproj | 2 +- .../rbac/Yi.RBAC.Domain/YiRBACDomainModule.cs | 4 ++-- .../src/project/rbac/Yi.RBAC.Web/YiRBACWebModule.cs | 4 ++-- 18 files changed, 52 insertions(+), 22 deletions(-) create mode 100644 Yi.Framework.Net6/src/module/Yi.Framework.FileManager/Yi.Framework.FileManager.csproj create mode 100644 Yi.Framework.Net6/src/module/Yi.Framework.FileManager/YiFrameworkFileManagerModule.cs rename Yi.Framework.Net6/src/module/{Yi.Framework.OperLog => Yi.Framework.OperLogManager}/GlobalOperLogAttribute.cs (98%) rename Yi.Framework.Net6/src/module/{Yi.Framework.OperLog => Yi.Framework.OperLogManager}/IOperationLogService.cs (90%) rename Yi.Framework.Net6/src/module/{Yi.Framework.OperLog => Yi.Framework.OperLogManager}/OperEnum.cs (90%) rename Yi.Framework.Net6/src/module/{Yi.Framework.OperLog => Yi.Framework.OperLogManager}/OperLogAttribute.cs (96%) rename Yi.Framework.Net6/src/module/{Yi.Framework.OperLog => Yi.Framework.OperLogManager}/OperationLogEntity.cs (98%) rename Yi.Framework.Net6/src/module/{Yi.Framework.OperLog => Yi.Framework.OperLogManager}/OperationLogGetListInputVo.cs (89%) rename Yi.Framework.Net6/src/module/{Yi.Framework.OperLog => Yi.Framework.OperLogManager}/OperationLogGetListOutputDto.cs (95%) rename Yi.Framework.Net6/src/module/{Yi.Framework.OperLog => Yi.Framework.OperLogManager}/OperationLogService.cs (97%) rename Yi.Framework.Net6/src/module/{Yi.Framework.OperLog/Yi.Framework.OperLog.csproj => Yi.Framework.OperLogManager/Yi.Framework.OperLogManager.csproj} (100%) rename Yi.Framework.Net6/src/module/{Yi.Framework.OperLog/YiFrameworkOperLogModule.cs => Yi.Framework.OperLogManager/YiFrameworkOperLogManagerModule.cs} (62%) diff --git a/Yi.Framework.Net6/Yi.Framework.sln b/Yi.Framework.Net6/Yi.Framework.sln index 182280d5..8dfb69a5 100644 --- a/Yi.Framework.Net6/Yi.Framework.sln +++ b/Yi.Framework.Net6/Yi.Framework.sln @@ -95,7 +95,9 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Version.cs = Version.cs EndProjectSection EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Yi.Framework.OperLog", "src\module\Yi.Framework.OperLog\Yi.Framework.OperLog.csproj", "{8A604A6B-D1FA-4CFF-BCF5-557519B10FCB}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Yi.Framework.OperLogManager", "src\module\Yi.Framework.OperLogManager\Yi.Framework.OperLogManager.csproj", "{8A604A6B-D1FA-4CFF-BCF5-557519B10FCB}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Yi.Framework.FileManager", "src\module\Yi.Framework.FileManager\Yi.Framework.FileManager.csproj", "{1BF3115D-B027-4805-AF7B-41B3AE9CB355}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -251,6 +253,10 @@ Global {8A604A6B-D1FA-4CFF-BCF5-557519B10FCB}.Debug|Any CPU.Build.0 = Debug|Any CPU {8A604A6B-D1FA-4CFF-BCF5-557519B10FCB}.Release|Any CPU.ActiveCfg = Release|Any CPU {8A604A6B-D1FA-4CFF-BCF5-557519B10FCB}.Release|Any CPU.Build.0 = Release|Any CPU + {1BF3115D-B027-4805-AF7B-41B3AE9CB355}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1BF3115D-B027-4805-AF7B-41B3AE9CB355}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1BF3115D-B027-4805-AF7B-41B3AE9CB355}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1BF3115D-B027-4805-AF7B-41B3AE9CB355}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -296,6 +302,7 @@ Global {60E54034-792C-4A90-BCDF-4D5FFB45089E} = {EEF5F221-0E32-4A3D-B647-B4B5E7305806} {FC559052-36EC-4379-B447-298FAD6045F4} = {EEF5F221-0E32-4A3D-B647-B4B5E7305806} {8A604A6B-D1FA-4CFF-BCF5-557519B10FCB} = {EEF5F221-0E32-4A3D-B647-B4B5E7305806} + {1BF3115D-B027-4805-AF7B-41B3AE9CB355} = {EEF5F221-0E32-4A3D-B647-B4B5E7305806} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {6C1A3808-0F4F-43FB-A9FE-5F27A3BB2ECF} diff --git a/Yi.Framework.Net6/src/module/Yi.Framework.FileManager/Yi.Framework.FileManager.csproj b/Yi.Framework.Net6/src/module/Yi.Framework.FileManager/Yi.Framework.FileManager.csproj new file mode 100644 index 00000000..4317b5b8 --- /dev/null +++ b/Yi.Framework.Net6/src/module/Yi.Framework.FileManager/Yi.Framework.FileManager.csproj @@ -0,0 +1,13 @@ + + + + net6.0 + enable + enable + + + + + + + diff --git a/Yi.Framework.Net6/src/module/Yi.Framework.FileManager/YiFrameworkFileManagerModule.cs b/Yi.Framework.Net6/src/module/Yi.Framework.FileManager/YiFrameworkFileManagerModule.cs new file mode 100644 index 00000000..371a8b6a --- /dev/null +++ b/Yi.Framework.Net6/src/module/Yi.Framework.FileManager/YiFrameworkFileManagerModule.cs @@ -0,0 +1,7 @@ +namespace Yi.Framework.FileManager +{ + public class YiFrameworkFileManagerModule + { + + } +} \ No newline at end of file diff --git a/Yi.Framework.Net6/src/module/Yi.Framework.OperLog/GlobalOperLogAttribute.cs b/Yi.Framework.Net6/src/module/Yi.Framework.OperLogManager/GlobalOperLogAttribute.cs similarity index 98% rename from Yi.Framework.Net6/src/module/Yi.Framework.OperLog/GlobalOperLogAttribute.cs rename to Yi.Framework.Net6/src/module/Yi.Framework.OperLogManager/GlobalOperLogAttribute.cs index c1460a6f..97ce9b78 100644 --- a/Yi.Framework.Net6/src/module/Yi.Framework.OperLog/GlobalOperLogAttribute.cs +++ b/Yi.Framework.Net6/src/module/Yi.Framework.OperLogManager/GlobalOperLogAttribute.cs @@ -14,7 +14,7 @@ using Yi.Framework.Core.Helper; using Yi.Framework.Ddd.Repositories; -namespace Yi.Framework.OperLog +namespace Yi.Framework.OperLogManager { public class GlobalOperLogAttribute : ActionFilterAttribute { diff --git a/Yi.Framework.Net6/src/module/Yi.Framework.OperLog/IOperationLogService.cs b/Yi.Framework.Net6/src/module/Yi.Framework.OperLogManager/IOperationLogService.cs similarity index 90% rename from Yi.Framework.Net6/src/module/Yi.Framework.OperLog/IOperationLogService.cs rename to Yi.Framework.Net6/src/module/Yi.Framework.OperLogManager/IOperationLogService.cs index 3a17ed0f..ccb3019b 100644 --- a/Yi.Framework.Net6/src/module/Yi.Framework.OperLog/IOperationLogService.cs +++ b/Yi.Framework.Net6/src/module/Yi.Framework.OperLogManager/IOperationLogService.cs @@ -5,7 +5,7 @@ using System.Text; using System.Threading.Tasks; using Yi.Framework.Ddd.Services.Abstract; -namespace Yi.Framework.OperLog +namespace Yi.Framework.OperLogManager { /// /// OperationLog服务抽象 diff --git a/Yi.Framework.Net6/src/module/Yi.Framework.OperLog/OperEnum.cs b/Yi.Framework.Net6/src/module/Yi.Framework.OperLogManager/OperEnum.cs similarity index 90% rename from Yi.Framework.Net6/src/module/Yi.Framework.OperLog/OperEnum.cs rename to Yi.Framework.Net6/src/module/Yi.Framework.OperLogManager/OperEnum.cs index 9aa024d3..1c8d0a13 100644 --- a/Yi.Framework.Net6/src/module/Yi.Framework.OperLog/OperEnum.cs +++ b/Yi.Framework.Net6/src/module/Yi.Framework.OperLogManager/OperEnum.cs @@ -4,7 +4,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace Yi.Framework.OperLog +namespace Yi.Framework.OperLogManager { public enum OperEnum { diff --git a/Yi.Framework.Net6/src/module/Yi.Framework.OperLog/OperLogAttribute.cs b/Yi.Framework.Net6/src/module/Yi.Framework.OperLogManager/OperLogAttribute.cs similarity index 96% rename from Yi.Framework.Net6/src/module/Yi.Framework.OperLog/OperLogAttribute.cs rename to Yi.Framework.Net6/src/module/Yi.Framework.OperLogManager/OperLogAttribute.cs index 5b1102b5..d9d3e4b9 100644 --- a/Yi.Framework.Net6/src/module/Yi.Framework.OperLog/OperLogAttribute.cs +++ b/Yi.Framework.Net6/src/module/Yi.Framework.OperLogManager/OperLogAttribute.cs @@ -4,7 +4,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace Yi.Framework.OperLog +namespace Yi.Framework.OperLogManager { [AttributeUsage(AttributeTargets.Method)] public class OperLogAttribute : Attribute diff --git a/Yi.Framework.Net6/src/module/Yi.Framework.OperLog/OperationLogEntity.cs b/Yi.Framework.Net6/src/module/Yi.Framework.OperLogManager/OperationLogEntity.cs similarity index 98% rename from Yi.Framework.Net6/src/module/Yi.Framework.OperLog/OperationLogEntity.cs rename to Yi.Framework.Net6/src/module/Yi.Framework.OperLogManager/OperationLogEntity.cs index defd5de9..4ae76ca9 100644 --- a/Yi.Framework.Net6/src/module/Yi.Framework.OperLog/OperationLogEntity.cs +++ b/Yi.Framework.Net6/src/module/Yi.Framework.OperLogManager/OperationLogEntity.cs @@ -6,7 +6,7 @@ using SqlSugar; using Yi.Framework.Data.Auditing; using Yi.Framework.Ddd.Entities; -namespace Yi.Framework.OperLog +namespace Yi.Framework.OperLogManager { /// /// 操作日志表 diff --git a/Yi.Framework.Net6/src/module/Yi.Framework.OperLog/OperationLogGetListInputVo.cs b/Yi.Framework.Net6/src/module/Yi.Framework.OperLogManager/OperationLogGetListInputVo.cs similarity index 89% rename from Yi.Framework.Net6/src/module/Yi.Framework.OperLog/OperationLogGetListInputVo.cs rename to Yi.Framework.Net6/src/module/Yi.Framework.OperLogManager/OperationLogGetListInputVo.cs index 3c1def75..7fecb292 100644 --- a/Yi.Framework.Net6/src/module/Yi.Framework.OperLog/OperationLogGetListInputVo.cs +++ b/Yi.Framework.Net6/src/module/Yi.Framework.OperLogManager/OperationLogGetListInputVo.cs @@ -5,7 +5,7 @@ using System.Text; using System.Threading.Tasks; using Yi.Framework.Ddd.Dtos; -namespace Yi.Framework.OperLog +namespace Yi.Framework.OperLogManager { public class OperationLogGetListInputVo : PagedAllResultRequestDto { diff --git a/Yi.Framework.Net6/src/module/Yi.Framework.OperLog/OperationLogGetListOutputDto.cs b/Yi.Framework.Net6/src/module/Yi.Framework.OperLogManager/OperationLogGetListOutputDto.cs similarity index 95% rename from Yi.Framework.Net6/src/module/Yi.Framework.OperLog/OperationLogGetListOutputDto.cs rename to Yi.Framework.Net6/src/module/Yi.Framework.OperLogManager/OperationLogGetListOutputDto.cs index 1e3191b6..11af25a2 100644 --- a/Yi.Framework.Net6/src/module/Yi.Framework.OperLog/OperationLogGetListOutputDto.cs +++ b/Yi.Framework.Net6/src/module/Yi.Framework.OperLogManager/OperationLogGetListOutputDto.cs @@ -5,7 +5,7 @@ using System.Text; using System.Threading.Tasks; using Yi.Framework.Ddd.Dtos; -namespace Yi.Framework.OperLog +namespace Yi.Framework.OperLogManager { public class OperationLogGetListOutputDto : IEntityDto { diff --git a/Yi.Framework.Net6/src/module/Yi.Framework.OperLog/OperationLogService.cs b/Yi.Framework.Net6/src/module/Yi.Framework.OperLogManager/OperationLogService.cs similarity index 97% rename from Yi.Framework.Net6/src/module/Yi.Framework.OperLog/OperationLogService.cs rename to Yi.Framework.Net6/src/module/Yi.Framework.OperLogManager/OperationLogService.cs index 8c92681b..5dab47fb 100644 --- a/Yi.Framework.Net6/src/module/Yi.Framework.OperLog/OperationLogService.cs +++ b/Yi.Framework.Net6/src/module/Yi.Framework.OperLogManager/OperationLogService.cs @@ -5,7 +5,7 @@ using Yi.Framework.Core.Attributes; using Microsoft.AspNetCore.Mvc; using SqlSugar; -namespace Yi.Framework.OperLog +namespace Yi.Framework.OperLogManager { /// /// OperationLog服务实现 diff --git a/Yi.Framework.Net6/src/module/Yi.Framework.OperLog/Yi.Framework.OperLog.csproj b/Yi.Framework.Net6/src/module/Yi.Framework.OperLogManager/Yi.Framework.OperLogManager.csproj similarity index 100% rename from Yi.Framework.Net6/src/module/Yi.Framework.OperLog/Yi.Framework.OperLog.csproj rename to Yi.Framework.Net6/src/module/Yi.Framework.OperLogManager/Yi.Framework.OperLogManager.csproj diff --git a/Yi.Framework.Net6/src/module/Yi.Framework.OperLog/YiFrameworkOperLogModule.cs b/Yi.Framework.Net6/src/module/Yi.Framework.OperLogManager/YiFrameworkOperLogManagerModule.cs similarity index 62% rename from Yi.Framework.Net6/src/module/Yi.Framework.OperLog/YiFrameworkOperLogModule.cs rename to Yi.Framework.Net6/src/module/Yi.Framework.OperLogManager/YiFrameworkOperLogManagerModule.cs index ee0db3bc..973f80e5 100644 --- a/Yi.Framework.Net6/src/module/Yi.Framework.OperLog/YiFrameworkOperLogModule.cs +++ b/Yi.Framework.Net6/src/module/Yi.Framework.OperLogManager/YiFrameworkOperLogManagerModule.cs @@ -4,10 +4,10 @@ using StartupModules; using Yi.Framework.Core; using Yi.Framework.Core.Attributes; -namespace Yi.Framework.OperLog +namespace Yi.Framework.OperLogManager { [DependsOn(typeof(YiFrameworkCoreModule))] - public class YiFrameworkOperLogModule : IStartupModule + public class YiFrameworkOperLogManagerModule : IStartupModule { public void Configure(IApplicationBuilder app, ConfigureMiddlewareContext context) { @@ -18,6 +18,13 @@ namespace Yi.Framework.OperLog services.AddControllers(options => { options.Filters.Add(); }); + services.AddAutoApiService(opt => + { + //NETServiceTest所在程序集添加进动态api配置 + opt.CreateConventional(typeof(YiFrameworkOperLogManagerModule).Assembly, option => option.RootPath = string.Empty); + + }); + services.AddSingleton(); } } diff --git a/Yi.Framework.Net6/src/project/BBS/Yi.BBS.Web/YiBBSWebModule.cs b/Yi.Framework.Net6/src/project/BBS/Yi.BBS.Web/YiBBSWebModule.cs index f7417fd2..93d27737 100644 --- a/Yi.Framework.Net6/src/project/BBS/Yi.BBS.Web/YiBBSWebModule.cs +++ b/Yi.Framework.Net6/src/project/BBS/Yi.BBS.Web/YiBBSWebModule.cs @@ -10,7 +10,7 @@ using Yi.Framework.Core.Autofac; using Yi.RBAC.Application; using Yi.Framework.AspNetCore; using Yi.Framework.Data.Json; -using Yi.Framework.OperLog; +using Yi.Framework.OperLogManager; namespace Yi.BBS.Web { @@ -32,8 +32,6 @@ namespace Yi.BBS.Web { //NETServiceTest所在程序集添加进动态api配置 opt.CreateConventional(typeof(YiBBSApplicationModule).Assembly, option => option.RootPath = string.Empty); - opt.CreateConventional(typeof(YiRBACApplicationModule).Assembly, option => option.RootPath = string.Empty); - opt.CreateConventional(typeof(YiFrameworkOperLogModule).Assembly, option => option.RootPath = string.Empty); }); //添加swagger diff --git a/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Web/YiBBSWebModule.cs b/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Web/YiBBSWebModule.cs index f7417fd2..93d27737 100644 --- a/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Web/YiBBSWebModule.cs +++ b/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Web/YiBBSWebModule.cs @@ -10,7 +10,7 @@ using Yi.Framework.Core.Autofac; using Yi.RBAC.Application; using Yi.Framework.AspNetCore; using Yi.Framework.Data.Json; -using Yi.Framework.OperLog; +using Yi.Framework.OperLogManager; namespace Yi.BBS.Web { @@ -32,8 +32,6 @@ namespace Yi.BBS.Web { //NETServiceTest所在程序集添加进动态api配置 opt.CreateConventional(typeof(YiBBSApplicationModule).Assembly, option => option.RootPath = string.Empty); - opt.CreateConventional(typeof(YiRBACApplicationModule).Assembly, option => option.RootPath = string.Empty); - opt.CreateConventional(typeof(YiFrameworkOperLogModule).Assembly, option => option.RootPath = string.Empty); }); //添加swagger diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/Yi.RBAC.Domain.csproj b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/Yi.RBAC.Domain.csproj index 3eb4861c..e4000629 100644 --- a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/Yi.RBAC.Domain.csproj +++ b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/Yi.RBAC.Domain.csproj @@ -17,7 +17,7 @@ - + diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/YiRBACDomainModule.cs b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/YiRBACDomainModule.cs index 40ecf429..06869cdb 100644 --- a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/YiRBACDomainModule.cs +++ b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/YiRBACDomainModule.cs @@ -10,7 +10,7 @@ using System.Threading.Tasks; using Yi.Framework.Core.Attributes; using Yi.Framework.Data; using Yi.Framework.EventBus; -using Yi.Framework.OperLog; +using Yi.Framework.OperLogManager; using Yi.Framework.ThumbnailSharp; using Yi.RBAC.Domain.Logs; using Yi.RBAC.Domain.Shared; @@ -22,7 +22,7 @@ namespace Yi.RBAC.Domain typeof(YiFrameworkDataModule), typeof(YiFrameworkThumbnailSharpModule), typeof(YiFrameworkEventBusModule), - typeof(YiFrameworkOperLogModule) + typeof(YiFrameworkOperLogManagerModule) )] public class YiRBACDomainModule : IStartupModule { diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Web/YiRBACWebModule.cs b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Web/YiRBACWebModule.cs index 275e2fd7..59fcbaad 100644 --- a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Web/YiRBACWebModule.cs +++ b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Web/YiRBACWebModule.cs @@ -7,7 +7,7 @@ using Yi.Framework.Core; using Yi.Framework.Core.Attributes; using Yi.Framework.Core.Autofac; using Yi.Framework.Data.Json; -using Yi.Framework.OperLog; +using Yi.Framework.OperLogManager; using Yi.RBAC.Application; using Yi.RBAC.Sqlsugar; @@ -33,7 +33,7 @@ namespace Yi.RBAC.Web { //NETServiceTest所在程序集添加进动态api配置 opt.CreateConventional(typeof(YiRBACApplicationModule).Assembly, option => option.RootPath = string.Empty); - opt.CreateConventional(typeof(YiFrameworkOperLogModule).Assembly, option => option.RootPath = string.Empty); + }); //添加swagger From 8639372513f3794b5861add1bc503aa0ce2232c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=B7=B3?= Date: Wed, 22 Feb 2023 19:21:21 +0800 Subject: [PATCH 4/7] =?UTF-8?q?feat:=20=E5=AE=8C=E6=88=90=E5=90=88?= =?UTF-8?q?=E5=B9=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Yi.Framework.AspNetCore.csproj | 2 +- .../Yi.Framework.Ddd/Entities/Entity.cs | 3 +-- .../Services/CrudAppService.cs | 2 +- .../OperationLogService.cs | 4 ++-- .../YiFrameworkOperLogManagerModule.cs | 18 +++++++++++------- .../Template/Server/ServiceTemplate.txt | 2 +- .../School/StudentService.cs | 2 +- .../Exhibition/BannerService.cs | 2 +- .../Forum/ArticleService.cs | 2 +- .../Forum/CommentService.cs | 2 +- .../Forum/DiscussService.cs | 2 +- .../Yi.BBS.Application/Forum/MyTypeService.cs | 2 +- .../Yi.BBS.Application/Forum/PlateService.cs | 2 +- .../GlobalSetting/SettingService.cs | 2 +- .../GlobalSetting/TempService.cs | 2 +- .../Dictionary/DictionaryService.cs | 2 +- .../Dictionary/DictionaryTypeService.cs | 2 +- .../Identity/AccountService.cs | 2 +- .../Identity/DeptService.cs | 3 ++- .../Identity/MenuService.cs | 2 +- .../Identity/PostService.cs | 2 +- .../Identity/RoleService.cs | 2 +- .../Identity/UserService.cs | 13 ++++++++++++- .../Logs/LoginLogService.cs | 2 +- .../Setting/ConfigService.cs | 2 +- .../rbac/Yi.RBAC.Application/TestService.cs | 2 +- .../rbac/Yi.RBAC.Web/YiRBACWebModule.cs | 7 +++++-- .../rbac/Yi.RBAC.Web/yi-sqlsugar-dev.db | Bin 135168 -> 135168 bytes .../School/StudentService.cs | 2 +- .../src/views/monitor/operlog/index.vue | 12 ++++++------ 30 files changed, 61 insertions(+), 43 deletions(-) diff --git a/Yi.Framework.Net6/src/framework/Yi.Framework.AspNetCore/Yi.Framework.AspNetCore.csproj b/Yi.Framework.Net6/src/framework/Yi.Framework.AspNetCore/Yi.Framework.AspNetCore.csproj index 20d2b889..c37d68fb 100644 --- a/Yi.Framework.Net6/src/framework/Yi.Framework.AspNetCore/Yi.Framework.AspNetCore.csproj +++ b/Yi.Framework.Net6/src/framework/Yi.Framework.AspNetCore/Yi.Framework.AspNetCore.csproj @@ -7,10 +7,10 @@ + - diff --git a/Yi.Framework.Net6/src/framework/Yi.Framework.Ddd/Entities/Entity.cs b/Yi.Framework.Net6/src/framework/Yi.Framework.Ddd/Entities/Entity.cs index abf618ea..5a05f2dd 100644 --- a/Yi.Framework.Net6/src/framework/Yi.Framework.Ddd/Entities/Entity.cs +++ b/Yi.Framework.Net6/src/framework/Yi.Framework.Ddd/Entities/Entity.cs @@ -1,5 +1,4 @@ -using NET.AutoWebApi.Helper; -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Security.Principal; diff --git a/Yi.Framework.Net6/src/framework/Yi.Framework.Ddd/Services/CrudAppService.cs b/Yi.Framework.Net6/src/framework/Yi.Framework.Ddd/Services/CrudAppService.cs index e71b6b01..007fe9ab 100644 --- a/Yi.Framework.Net6/src/framework/Yi.Framework.Ddd/Services/CrudAppService.cs +++ b/Yi.Framework.Net6/src/framework/Yi.Framework.Ddd/Services/CrudAppService.cs @@ -122,7 +122,7 @@ namespace Yi.Framework.Ddd.Services /// /// /// - public async Task DeleteAsync(string id) + public virtual async Task DeleteAsync(string id) { if (id is null) { diff --git a/Yi.Framework.Net6/src/module/Yi.Framework.OperLogManager/OperationLogService.cs b/Yi.Framework.Net6/src/module/Yi.Framework.OperLogManager/OperationLogService.cs index 5dab47fb..de954789 100644 --- a/Yi.Framework.Net6/src/module/Yi.Framework.OperLogManager/OperationLogService.cs +++ b/Yi.Framework.Net6/src/module/Yi.Framework.OperLogManager/OperationLogService.cs @@ -1,16 +1,16 @@ -using NET.AutoWebApi.Setting; using Yi.Framework.Ddd.Services; using Yi.Framework.Ddd.Dtos; using Yi.Framework.Core.Attributes; using Microsoft.AspNetCore.Mvc; using SqlSugar; +using Cike.AutoWebApi.Setting; namespace Yi.Framework.OperLogManager { /// /// OperationLog服务实现 /// - [AppService] + //[AppService] public class OperationLogService : CrudAppService, IOperationLogService, IAutoApiService { diff --git a/Yi.Framework.Net6/src/module/Yi.Framework.OperLogManager/YiFrameworkOperLogManagerModule.cs b/Yi.Framework.Net6/src/module/Yi.Framework.OperLogManager/YiFrameworkOperLogManagerModule.cs index 973f80e5..653d1a11 100644 --- a/Yi.Framework.Net6/src/module/Yi.Framework.OperLogManager/YiFrameworkOperLogManagerModule.cs +++ b/Yi.Framework.Net6/src/module/Yi.Framework.OperLogManager/YiFrameworkOperLogManagerModule.cs @@ -15,17 +15,21 @@ namespace Yi.Framework.OperLogManager public void ConfigureServices(IServiceCollection services, ConfigureServicesContext context) { - services.AddControllers(options => { + + services.AddControllers(options => + { options.Filters.Add(); }); - services.AddAutoApiService(opt => - { - //NETServiceTest所在程序集添加进动态api配置 - opt.CreateConventional(typeof(YiFrameworkOperLogManagerModule).Assembly, option => option.RootPath = string.Empty); + //services.AddAutoApiService(opt => + //{ + // //NETServiceTest所在程序集添加进动态api配置 + // opt.CreateConventional(typeof(YiFrameworkOperLogManagerModule).Assembly, option => option.RootPath = string.Empty); + + //}); - }); - services.AddSingleton(); + services.AddTransient(); + services.AddTransient(); } } } \ No newline at end of file diff --git a/Yi.Framework.Net6/src/module/Yi.Framework.Template/Template/Server/ServiceTemplate.txt b/Yi.Framework.Net6/src/module/Yi.Framework.Template/Template/Server/ServiceTemplate.txt index e058e170..9daff1d8 100644 --- a/Yi.Framework.Net6/src/module/Yi.Framework.Template/Template/Server/ServiceTemplate.txt +++ b/Yi.Framework.Net6/src/module/Yi.Framework.Template/Template/Server/ServiceTemplate.txt @@ -1,5 +1,5 @@ using #NameSpaces#.Application.Contracts.#ModelName#; -using NET.AutoWebApi.Setting; +using Cike.AutoWebApi.Setting; using #NameSpaces#.Application.Contracts.#ModelName#.Dtos; using #NameSpaces#.Domain.#ModelName#.Entities; using Yi.Framework.Ddd.Services; diff --git a/Yi.Framework.Net6/src/project/Template/Yi.Template.Application/School/StudentService.cs b/Yi.Framework.Net6/src/project/Template/Yi.Template.Application/School/StudentService.cs index 1d851255..cd961206 100644 --- a/Yi.Framework.Net6/src/project/Template/Yi.Template.Application/School/StudentService.cs +++ b/Yi.Framework.Net6/src/project/Template/Yi.Template.Application/School/StudentService.cs @@ -1,5 +1,5 @@ using Yi.Template.Application.Contracts.School; -using NET.AutoWebApi.Setting; +using Cike.AutoWebApi.Setting; using Yi.Template.Application.Contracts.School.Dtos; using Yi.Template.Domain.School.Entities; using Yi.Framework.Ddd.Services; diff --git a/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Application/Exhibition/BannerService.cs b/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Application/Exhibition/BannerService.cs index db630b4e..94b25c30 100644 --- a/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Application/Exhibition/BannerService.cs +++ b/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Application/Exhibition/BannerService.cs @@ -1,5 +1,5 @@ using Yi.BBS.Application.Contracts.Exhibition; -using NET.AutoWebApi.Setting; +using Cike.AutoWebApi.Setting; using Yi.BBS.Application.Contracts.Exhibition.Dtos; using Yi.BBS.Domain.Exhibition.Entities; using Yi.Framework.Ddd.Services; diff --git a/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Application/Forum/ArticleService.cs b/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Application/Forum/ArticleService.cs index 200ef445..12eb207a 100644 --- a/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Application/Forum/ArticleService.cs +++ b/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Application/Forum/ArticleService.cs @@ -1,5 +1,5 @@ using Yi.BBS.Application.Contracts.Forum; -using NET.AutoWebApi.Setting; +using Cike.AutoWebApi.Setting; using Yi.BBS.Application.Contracts.Forum.Dtos; using Yi.BBS.Domain.Forum.Entities; using Yi.Framework.Ddd.Services; diff --git a/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Application/Forum/CommentService.cs b/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Application/Forum/CommentService.cs index 9f12340c..46fc1955 100644 --- a/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Application/Forum/CommentService.cs +++ b/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Application/Forum/CommentService.cs @@ -1,5 +1,5 @@ using Yi.BBS.Application.Contracts.Forum; -using NET.AutoWebApi.Setting; +using Cike.AutoWebApi.Setting; using Yi.BBS.Application.Contracts.Forum.Dtos; using Yi.BBS.Domain.Forum.Entities; using Yi.Framework.Ddd.Services; diff --git a/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Application/Forum/DiscussService.cs b/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Application/Forum/DiscussService.cs index a92e459a..317af4f7 100644 --- a/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Application/Forum/DiscussService.cs +++ b/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Application/Forum/DiscussService.cs @@ -1,5 +1,5 @@ using Yi.BBS.Application.Contracts.Forum; -using NET.AutoWebApi.Setting; +using Cike.AutoWebApi.Setting; using Yi.BBS.Application.Contracts.Forum.Dtos; using Yi.BBS.Domain.Forum.Entities; using Yi.Framework.Ddd.Services; diff --git a/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Application/Forum/MyTypeService.cs b/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Application/Forum/MyTypeService.cs index 903e92c2..ac557727 100644 --- a/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Application/Forum/MyTypeService.cs +++ b/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Application/Forum/MyTypeService.cs @@ -1,5 +1,5 @@ using Yi.BBS.Application.Contracts.Forum; -using NET.AutoWebApi.Setting; +using Cike.AutoWebApi.Setting; using Yi.BBS.Application.Contracts.Forum.Dtos; using Yi.BBS.Domain.Forum.Entities; using Yi.Framework.Ddd.Services; diff --git a/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Application/Forum/PlateService.cs b/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Application/Forum/PlateService.cs index 9d062aee..43a67b8a 100644 --- a/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Application/Forum/PlateService.cs +++ b/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Application/Forum/PlateService.cs @@ -1,5 +1,5 @@ using Yi.BBS.Application.Contracts.Forum; -using NET.AutoWebApi.Setting; +using Cike.AutoWebApi.Setting; using Yi.BBS.Application.Contracts.Forum.Dtos; using Yi.BBS.Domain.Forum.Entities; using Yi.Framework.Ddd.Services; diff --git a/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Application/GlobalSetting/SettingService.cs b/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Application/GlobalSetting/SettingService.cs index 598cffde..0e759e92 100644 --- a/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Application/GlobalSetting/SettingService.cs +++ b/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Application/GlobalSetting/SettingService.cs @@ -1,5 +1,5 @@ using Yi.BBS.Application.Contracts.GlobalSetting; -using NET.AutoWebApi.Setting; +using Cike.AutoWebApi.Setting; using Yi.BBS.Domain.GlobalSetting.Entities; using Yi.Framework.Ddd.Services; diff --git a/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Application/GlobalSetting/TempService.cs b/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Application/GlobalSetting/TempService.cs index eea37a3d..e2e04b84 100644 --- a/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Application/GlobalSetting/TempService.cs +++ b/Yi.Framework.Net6/src/project/bbs/Yi.BBS.Application/GlobalSetting/TempService.cs @@ -1,5 +1,5 @@ using Yi.BBS.Application.Contracts.GlobalSetting; -using NET.AutoWebApi.Setting; +using Cike.AutoWebApi.Setting; using Yi.BBS.Domain.GlobalSetting.Entities; using Yi.Framework.Ddd.Services; using Microsoft.AspNetCore.Mvc; diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/Dictionary/DictionaryService.cs b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/Dictionary/DictionaryService.cs index 419a4448..5dfd2e6c 100644 --- a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/Dictionary/DictionaryService.cs +++ b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/Dictionary/DictionaryService.cs @@ -1,5 +1,5 @@ using Yi.RBAC.Application.Contracts.Dictionary; -using NET.AutoWebApi.Setting; +using Cike.AutoWebApi.Setting; using Yi.RBAC.Application.Contracts.Dictionary.Dtos; using Yi.RBAC.Domain.Dictionary.Entities; using Yi.Framework.Ddd.Services; diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/Dictionary/DictionaryTypeService.cs b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/Dictionary/DictionaryTypeService.cs index f1d7af3d..16071eb1 100644 --- a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/Dictionary/DictionaryTypeService.cs +++ b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/Dictionary/DictionaryTypeService.cs @@ -1,5 +1,5 @@ using Yi.RBAC.Application.Contracts.Dictionary; -using NET.AutoWebApi.Setting; +using Cike.AutoWebApi.Setting; using Yi.RBAC.Application.Contracts.Dictionary.Dtos; using Yi.RBAC.Domain.Dictionary.Entities; using Yi.Framework.Ddd.Services; diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/Identity/AccountService.cs b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/Identity/AccountService.cs index e0ea1e91..399b23e5 100644 --- a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/Identity/AccountService.cs +++ b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/Identity/AccountService.cs @@ -4,7 +4,7 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc; -using NET.AutoWebApi.Setting; +using Cike.AutoWebApi.Setting; using SqlSugar; using System; using System.Collections.Generic; diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/Identity/DeptService.cs b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/Identity/DeptService.cs index 624a2110..0d032dad 100644 --- a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/Identity/DeptService.cs +++ b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/Identity/DeptService.cs @@ -1,11 +1,12 @@ using Yi.RBAC.Application.Contracts.Identity; -using NET.AutoWebApi.Setting; +using Cike.AutoWebApi.Setting; using Yi.RBAC.Application.Contracts.Identity.Dtos; using Yi.RBAC.Domain.Identity.Entities; using Yi.Framework.Ddd.Services; using Yi.Framework.Ddd.Dtos; using SqlSugar; using Microsoft.AspNetCore.Mvc; +using Cike.AutoWebApi.Setting; namespace Yi.RBAC.Application.Identity { diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/Identity/MenuService.cs b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/Identity/MenuService.cs index 1fa8d6ab..036a0a0e 100644 --- a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/Identity/MenuService.cs +++ b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/Identity/MenuService.cs @@ -1,5 +1,5 @@ using Yi.RBAC.Application.Contracts.Identity; -using NET.AutoWebApi.Setting; +using Cike.AutoWebApi.Setting; using Yi.RBAC.Application.Contracts.Identity.Dtos; using Yi.RBAC.Domain.Identity.Entities; using Yi.Framework.Ddd.Services; diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/Identity/PostService.cs b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/Identity/PostService.cs index f2ce0baa..ab2eaccc 100644 --- a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/Identity/PostService.cs +++ b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/Identity/PostService.cs @@ -1,5 +1,5 @@ using Yi.RBAC.Application.Contracts.Identity; -using NET.AutoWebApi.Setting; +using Cike.AutoWebApi.Setting; using Yi.RBAC.Application.Contracts.Identity.Dtos; using Yi.RBAC.Domain.Identity.Entities; using Yi.Framework.Ddd.Services; diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/Identity/RoleService.cs b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/Identity/RoleService.cs index a9af44dc..ddc08fd7 100644 --- a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/Identity/RoleService.cs +++ b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/Identity/RoleService.cs @@ -1,5 +1,5 @@ using Yi.RBAC.Application.Contracts.Identity; -using NET.AutoWebApi.Setting; +using Cike.AutoWebApi.Setting; using Yi.RBAC.Application.Contracts.Identity.Dtos; using Yi.RBAC.Domain.Identity.Entities; using Yi.Framework.Ddd.Services; diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/Identity/UserService.cs b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/Identity/UserService.cs index aa1ce658..91911800 100644 --- a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/Identity/UserService.cs +++ b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/Identity/UserService.cs @@ -1,5 +1,5 @@ using Yi.RBAC.Application.Contracts.Identity; -using NET.AutoWebApi.Setting; +using Cike.AutoWebApi.Setting; using Yi.RBAC.Application.Contracts.Identity.Dtos; using Yi.RBAC.Domain.Identity.Entities; using Yi.Framework.Ddd.Services; @@ -14,6 +14,7 @@ using Microsoft.AspNetCore.Mvc; using Yi.Framework.Auth.JwtBearer.Authorization; using Yi.RBAC.Application.Contracts.Identity.Dtos.User; using Yi.Framework.Core.CurrentUsers; +using Yi.Framework.OperLogManager; namespace Yi.RBAC.Application.Identity { @@ -72,6 +73,7 @@ namespace Yi.RBAC.Application.Identity /// /// /// + [OperLog("添加用户", OperEnum.Insert)] public async override Task CreateAsync(UserCreateInputVo input) { if (string.IsNullOrEmpty(input.Password)) @@ -116,6 +118,7 @@ namespace Yi.RBAC.Application.Identity /// /// /// + [OperLog("更新用户", OperEnum.Update)] public async override Task UpdateAsync(long id, UserUpdateInputVo input) { if (await _repository.IsAnyAsync(u => input.UserName!.Equals(u.UserName) && !id.Equals(u.Id))) @@ -145,6 +148,7 @@ namespace Yi.RBAC.Application.Identity /// /// /// + [OperLog("更新个人信息", OperEnum.Update)] public async Task UpdateProfileAsync(ProfileUpdateInputVo input) { var entity = await _repository.GetByIdAsync(_currentUser.Id); @@ -161,6 +165,7 @@ namespace Yi.RBAC.Application.Identity /// /// [Route("/api/user/{id}/{state}")] + [OperLog("更新用户状态", OperEnum.Update)] public async Task UpdateStateAsync([FromRoute] long id, [FromRoute] bool state) { var entity = await _repository.GetByIdAsync(id); @@ -170,7 +175,13 @@ namespace Yi.RBAC.Application.Identity } entity.State = state; + await _repository.UpdateAsync(entity); return await MapToGetOutputDtoAsync(entity); } + [OperLog("删除用户", OperEnum.Delete)] + public override Task DeleteAsync(string id) + { + return base.DeleteAsync(id); + } } } diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/Logs/LoginLogService.cs b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/Logs/LoginLogService.cs index a0a34d8f..52ba4d68 100644 --- a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/Logs/LoginLogService.cs +++ b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/Logs/LoginLogService.cs @@ -1,5 +1,5 @@ using Microsoft.AspNetCore.Mvc; -using NET.AutoWebApi.Setting; +using Cike.AutoWebApi.Setting; using SqlSugar; using System; using System.Collections.Generic; diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/Setting/ConfigService.cs b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/Setting/ConfigService.cs index c996a43a..aab40d6f 100644 --- a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/Setting/ConfigService.cs +++ b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/Setting/ConfigService.cs @@ -1,5 +1,5 @@ using Yi.RBAC.Application.Contracts.Setting; -using NET.AutoWebApi.Setting; +using Cike.AutoWebApi.Setting; using Yi.RBAC.Application.Contracts.Setting.Dtos; using Yi.RBAC.Domain.Setting.Entities; using Yi.Framework.Ddd.Services; diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/TestService.cs b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/TestService.cs index 5eff6736..5cf13672 100644 --- a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/TestService.cs +++ b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/TestService.cs @@ -1,4 +1,4 @@ -using NET.AutoWebApi.Setting; +using Cike.AutoWebApi.Setting; using System; using System.Collections.Generic; using System.Linq; diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Web/YiRBACWebModule.cs b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Web/YiRBACWebModule.cs index 59fcbaad..6db43adc 100644 --- a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Web/YiRBACWebModule.cs +++ b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Web/YiRBACWebModule.cs @@ -29,13 +29,16 @@ namespace Yi.RBAC.Web opt.JsonSerializerOptions.Converters.Add(new DateTimeJsonConverter("yyyy-MM-dd HH:mm:ss")); }); + + + services.AddAutoApiService(opt => { - //NETServiceTest所在程序集添加进动态api配置 - opt.CreateConventional(typeof(YiRBACApplicationModule).Assembly, option => option.RootPath = string.Empty); + opt.CreateConventional(AssemblyHelper.GetAllLoadAssembly(), option => option.RootPath = string.Empty); }); + //添加swagger services.AddSwaggerServer(); } diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Web/yi-sqlsugar-dev.db b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Web/yi-sqlsugar-dev.db index ecff1f8fe80d1f5c63f53a794a6fb9637048ffd6..3025232ebe007211e35608f9ad9b6d0c23931d86 100644 GIT binary patch delta 1096 zcmZozz|pXPV}dke!9*En#)8I#tqF`v&I_>d*)i~6=U>Mk#P^MF7N6Z_MF%ZD!6-H^ zHe*3`d2vNe2Ck$56Sxvf^3C_UB#Oo;5Tw1%!qqCmR}> z>lpx{p@G8Fw$|r+Cwd0xCl+MtmlmfM=^L6EnHw7#T3DEy7?>EF8(NxK=$90grdBI? zrYKoqk*(KJ@=MH3RkF$}&B@VGa!iLaLxJW&q?EF6_ zY6w)FS5lOpQkq`fswJUfswAEWr&fHm7%4Tk&&L6ftj(Tp(W4+m(+q1aER2K8JQSa8X1_G z85mj^8ylIKTR>#tj?FJFfxA2?KPMH+sWr4TFwiwH1R@0k11m6U_F#m?WiUglJ~%E} zrSQgOJ&BQ-mY7qFJ2pv=%z9v?Q!h42k4#|tLyJwY56O*Al4Fwt7M^y80c?R_wO|3H&kO_(_5csp53UbV4)(JlK;{m&_TB*w T0kZ_4&JUN;?*THi1hD)cx~Ld1 diff --git a/Yi.Framework.Net6/src/project/template/Yi.Template.Application/School/StudentService.cs b/Yi.Framework.Net6/src/project/template/Yi.Template.Application/School/StudentService.cs index 1d851255..cd961206 100644 --- a/Yi.Framework.Net6/src/project/template/Yi.Template.Application/School/StudentService.cs +++ b/Yi.Framework.Net6/src/project/template/Yi.Template.Application/School/StudentService.cs @@ -1,5 +1,5 @@ using Yi.Template.Application.Contracts.School; -using NET.AutoWebApi.Setting; +using Cike.AutoWebApi.Setting; using Yi.Template.Application.Contracts.School.Dtos; using Yi.Template.Domain.School.Entities; using Yi.Framework.Ddd.Services; diff --git a/Yi.RuoYi.Vue3/src/views/monitor/operlog/index.vue b/Yi.RuoYi.Vue3/src/views/monitor/operlog/index.vue index 4e152056..915dd42b 100644 --- a/Yi.RuoYi.Vue3/src/views/monitor/operlog/index.vue +++ b/Yi.RuoYi.Vue3/src/views/monitor/operlog/index.vue @@ -34,8 +34,8 @@ /> - - + + @@ -100,9 +100,9 @@ - + @@ -163,7 +163,7 @@ {{ parseTime(form.createTime) }} - {{ form.errorMsg }} + {{ form.errorMsg }} @@ -202,7 +202,7 @@ const data = reactive({ title: undefined, operUser: undefined, operType: undefined, - isDeleted: undefined + state: undefined } }); From 272466bbbf73bc64f90d7f7ee9a9c33b7c525d6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=B7=B3?= Date: Thu, 23 Feb 2023 14:15:24 +0800 Subject: [PATCH 5/7] =?UTF-8?q?feat:=20=E5=AE=8C=E6=88=90=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E6=A8=A1=E5=9D=97=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Extensions/HttpContextExtensions.cs | 51 ++ .../Yi.Framework.Core/Const/PathConst.cs | 18 + .../Yi.Framework.Core/Enums/FileTypeEnum.cs | 20 + .../Yi.Framework.Core/Helper/MimeHelper.cs | 462 +++++++++--------- .../Yi.Framework.FileManager/FileEntity.cs | 48 ++ .../FileGetListOutputDto.cs | 14 + .../Yi.Framework.FileManager/FileService.cs | 158 ++++++ .../Yi.Framework.FileManager/IFileService.cs | 12 + .../Yi.Framework.FileManager.csproj | 5 + .../YiFrameworkFileManagerModule.cs | 21 +- .../rbac/Yi.RBAC.Domain/Yi.RBAC.Domain.csproj | 1 + .../rbac/Yi.RBAC.Domain/YiRBACDomainModule.cs | 4 +- .../wwwroot/File/1628628277864304640.txt | 28 ++ .../wwwroot/File/1628628396160454656.txt | 28 ++ .../wwwroot/File/1628628415508779008.txt | 28 ++ .../wwwroot/File/1628636925021786112.txt | 28 ++ .../wwwroot/Image/1628639014875697152.jpg | Bin 0 -> 30944 bytes .../wwwroot/Image/1628639326948691968.jpg | Bin 0 -> 30944 bytes .../wwwroot/Thumbnail/1628639326948691968.jpg | Bin 0 -> 10366 bytes .../rbac/Yi.RBAC.Web/yi-sqlsugar-dev.db | Bin 135168 -> 143360 bytes 20 files changed, 698 insertions(+), 228 deletions(-) create mode 100644 Yi.Framework.Net6/src/framework/Yi.Framework.Core/Const/PathConst.cs create mode 100644 Yi.Framework.Net6/src/framework/Yi.Framework.Core/Enums/FileTypeEnum.cs create mode 100644 Yi.Framework.Net6/src/module/Yi.Framework.FileManager/FileEntity.cs create mode 100644 Yi.Framework.Net6/src/module/Yi.Framework.FileManager/FileGetListOutputDto.cs create mode 100644 Yi.Framework.Net6/src/module/Yi.Framework.FileManager/FileService.cs create mode 100644 Yi.Framework.Net6/src/module/Yi.Framework.FileManager/IFileService.cs create mode 100644 Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Web/wwwroot/File/1628628277864304640.txt create mode 100644 Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Web/wwwroot/File/1628628396160454656.txt create mode 100644 Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Web/wwwroot/File/1628628415508779008.txt create mode 100644 Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Web/wwwroot/File/1628636925021786112.txt create mode 100644 Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Web/wwwroot/Image/1628639014875697152.jpg create mode 100644 Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Web/wwwroot/Image/1628639326948691968.jpg create mode 100644 Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Web/wwwroot/Thumbnail/1628639326948691968.jpg diff --git a/Yi.Framework.Net6/src/framework/Yi.Framework.AspNetCore/Extensions/HttpContextExtensions.cs b/Yi.Framework.Net6/src/framework/Yi.Framework.AspNetCore/Extensions/HttpContextExtensions.cs index 759555ed..b16e5509 100644 --- a/Yi.Framework.Net6/src/framework/Yi.Framework.AspNetCore/Extensions/HttpContextExtensions.cs +++ b/Yi.Framework.Net6/src/framework/Yi.Framework.AspNetCore/Extensions/HttpContextExtensions.cs @@ -10,6 +10,57 @@ namespace Yi.Framework.AspNetCore.Extensions { public static class HttpContextExtensions { + /// + /// 设置文件下载名称 + /// + /// + /// + public static void FileInlineHandle(this HttpContext httpContext, string fileName) + { + string encodeFilename = System.Web.HttpUtility.UrlEncode(fileName, Encoding.GetEncoding("UTF-8")); + httpContext.Response.Headers.Add("Content-Disposition", "inline;filename=" + encodeFilename); + + } + + /// + /// 设置文件附件名称 + /// + /// + /// + public static void FileAttachmentHandle(this HttpContext httpContext, string fileName) + { + string encodeFilename = System.Web.HttpUtility.UrlEncode(fileName, Encoding.GetEncoding("UTF-8")); + httpContext.Response.Headers.Add("Content-Disposition", "attachment;filename=" + encodeFilename); + + } + + /// + /// 获取语言种类 + /// + /// + /// + public static string GetLanguage(this HttpContext httpContext) + { + string res = "zh-CN"; + var str = httpContext.Request.Headers["Accept-Language"].FirstOrDefault(); + if (str is not null) + { + res = str.Split(",")[0]; + } + return res; + + } + + /// + /// 判断是否为异步请求 + /// + /// + /// + public static bool IsAjaxRequest(this HttpRequest request) + { + string header = request.Headers["X-Requested-With"]; + return "XMLHttpRequest".Equals(header); + } /// /// 获取客户端IP /// diff --git a/Yi.Framework.Net6/src/framework/Yi.Framework.Core/Const/PathConst.cs b/Yi.Framework.Net6/src/framework/Yi.Framework.Core/Const/PathConst.cs new file mode 100644 index 00000000..ba393ce5 --- /dev/null +++ b/Yi.Framework.Net6/src/framework/Yi.Framework.Core/Const/PathConst.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Yi.Framework.Core.Const +{ + /// + /// 定义公共文件常量 + /// + public class PathConst + { + public const string wwwroot = "wwwroot"; + public const string DataTemplate = "_DataTemplate"; + public const string DataExport = "_DataExport"; + } +} diff --git a/Yi.Framework.Net6/src/framework/Yi.Framework.Core/Enums/FileTypeEnum.cs b/Yi.Framework.Net6/src/framework/Yi.Framework.Core/Enums/FileTypeEnum.cs new file mode 100644 index 00000000..1776d35f --- /dev/null +++ b/Yi.Framework.Net6/src/framework/Yi.Framework.Core/Enums/FileTypeEnum.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Yi.Framework.Core.Enums +{ + /// + /// 定义公共文件路径 + /// + public enum FileTypeEnum + { + File, + Image, + Thumbnail, + Excel, + Temp + } +} diff --git a/Yi.Framework.Net6/src/framework/Yi.Framework.Core/Helper/MimeHelper.cs b/Yi.Framework.Net6/src/framework/Yi.Framework.Core/Helper/MimeHelper.cs index ca0e7c05..c0b5b611 100644 --- a/Yi.Framework.Net6/src/framework/Yi.Framework.Core/Helper/MimeHelper.cs +++ b/Yi.Framework.Net6/src/framework/Yi.Framework.Core/Helper/MimeHelper.cs @@ -4,241 +4,257 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using Yi.Framework.Core.Enums; namespace Yi.Framework.Core.Helper { - public static class MimeHelper + public static class MimeHelper { // 通过自己定义一个静态类 // 将所有的Content Type都扔进去吧 // 调用的时候直接调用静态方法即可。 - - private static Hashtable _mimeMappingTable; - private static void AddMimeMapping(string extension, string MimeType) + public static List ImageType { get; set; } = new List + { + ".jpg",".png",".jpge",".gif" + }; + + private static Hashtable _mimeMappingTable; + + private static void AddMimeMapping(string extension, string MimeType) + { + MimeHelper._mimeMappingTable.Add(extension, MimeType); + } + + public static string GetMimeMapping(string FileName) + { + string text = null!; + int num = FileName.LastIndexOf('.'); + if (0 < num && num > FileName.LastIndexOf('\\')) { - MimeHelper._mimeMappingTable.Add(extension, MimeType); + text = (string)MimeHelper._mimeMappingTable[FileName.Substring(num)]!; } - - public static string GetMimeMapping(string FileName) + if (text == null) { - string text = null!; - int num = FileName.LastIndexOf('.'); - if (0 < num && num > FileName.LastIndexOf('\\')) - { - text = (string)MimeHelper._mimeMappingTable[FileName.Substring(num)]!; - } - if (text == null) - { - text = (string)MimeHelper._mimeMappingTable[".*"]!; - } - return text; + text = (string)MimeHelper._mimeMappingTable[".*"]!; } + return text; + } + + public static FileTypeEnum GetFileType(string fileName) + { + var extension = Path.GetExtension(fileName); + if(ImageType.Contains(extension.ToLower())) + return FileTypeEnum.Image; + return FileTypeEnum.File; + + + } + + static MimeHelper() + { + MimeHelper._mimeMappingTable = new Hashtable(190, StringComparer.CurrentCultureIgnoreCase); + MimeHelper.AddMimeMapping(".323", "text/h323"); + MimeHelper.AddMimeMapping(".asx", "video/x-ms-asf"); + MimeHelper.AddMimeMapping(".acx", "application/internet-property-stream"); + MimeHelper.AddMimeMapping(".ai", "application/postscript"); + MimeHelper.AddMimeMapping(".aif", "audio/x-aiff"); + MimeHelper.AddMimeMapping(".aiff", "audio/aiff"); + MimeHelper.AddMimeMapping(".axs", "application/olescript"); + MimeHelper.AddMimeMapping(".aifc", "audio/aiff"); + MimeHelper.AddMimeMapping(".asr", "video/x-ms-asf"); + MimeHelper.AddMimeMapping(".avi", "video/x-msvideo"); + MimeHelper.AddMimeMapping(".asf", "video/x-ms-asf"); + MimeHelper.AddMimeMapping(".au", "audio/basic"); + MimeHelper.AddMimeMapping(".application", "application/x-ms-application"); + MimeHelper.AddMimeMapping(".bin", "application/octet-stream"); + MimeHelper.AddMimeMapping(".bas", "text/plain"); + MimeHelper.AddMimeMapping(".bcpio", "application/x-bcpio"); + MimeHelper.AddMimeMapping(".bmp", "image/bmp"); + MimeHelper.AddMimeMapping(".cdf", "application/x-cdf"); + MimeHelper.AddMimeMapping(".cat", "application/vndms-pkiseccat"); + MimeHelper.AddMimeMapping(".crt", "application/x-x509-ca-cert"); + MimeHelper.AddMimeMapping(".c", "text/plain"); + MimeHelper.AddMimeMapping(".css", "text/css"); + MimeHelper.AddMimeMapping(".cer", "application/x-x509-ca-cert"); + MimeHelper.AddMimeMapping(".crl", "application/pkix-crl"); + MimeHelper.AddMimeMapping(".cmx", "image/x-cmx"); + MimeHelper.AddMimeMapping(".csh", "application/x-csh"); + MimeHelper.AddMimeMapping(".cod", "image/cis-cod"); + MimeHelper.AddMimeMapping(".cpio", "application/x-cpio"); + MimeHelper.AddMimeMapping(".clp", "application/x-msclip"); + MimeHelper.AddMimeMapping(".crd", "application/x-mscardfile"); + MimeHelper.AddMimeMapping(".deploy", "application/octet-stream"); + MimeHelper.AddMimeMapping(".dll", "application/x-msdownload"); + MimeHelper.AddMimeMapping(".dot", "application/msword"); + MimeHelper.AddMimeMapping(".doc", "application/msword"); + MimeHelper.AddMimeMapping(".dvi", "application/x-dvi"); + MimeHelper.AddMimeMapping(".dir", "application/x-director"); + MimeHelper.AddMimeMapping(".dxr", "application/x-director"); + MimeHelper.AddMimeMapping(".der", "application/x-x509-ca-cert"); + MimeHelper.AddMimeMapping(".dib", "image/bmp"); + MimeHelper.AddMimeMapping(".dcr", "application/x-director"); + MimeHelper.AddMimeMapping(".disco", "text/xml"); + MimeHelper.AddMimeMapping(".exe", "application/octet-stream"); + MimeHelper.AddMimeMapping(".etx", "text/x-setext"); + MimeHelper.AddMimeMapping(".evy", "application/envoy"); + MimeHelper.AddMimeMapping(".eml", "message/rfc822"); + MimeHelper.AddMimeMapping(".eps", "application/postscript"); + MimeHelper.AddMimeMapping(".flr", "x-world/x-vrml"); + MimeHelper.AddMimeMapping(".fif", "application/fractals"); + MimeHelper.AddMimeMapping(".gtar", "application/x-gtar"); + MimeHelper.AddMimeMapping(".gif", "image/gif"); + MimeHelper.AddMimeMapping(".gz", "application/x-gzip"); + MimeHelper.AddMimeMapping(".hta", "application/hta"); + MimeHelper.AddMimeMapping(".htc", "text/x-component"); + MimeHelper.AddMimeMapping(".htt", "text/webviewhtml"); + MimeHelper.AddMimeMapping(".h", "text/plain"); + MimeHelper.AddMimeMapping(".hdf", "application/x-hdf"); + MimeHelper.AddMimeMapping(".hlp", "application/winhlp"); + MimeHelper.AddMimeMapping(".html", "text/html"); + MimeHelper.AddMimeMapping(".htm", "text/html"); + MimeHelper.AddMimeMapping(".hqx", "application/mac-binhex40"); + MimeHelper.AddMimeMapping(".isp", "application/x-internet-signup"); + MimeHelper.AddMimeMapping(".iii", "application/x-iphone"); + MimeHelper.AddMimeMapping(".ief", "image/ief"); + MimeHelper.AddMimeMapping(".ivf", "video/x-ivf"); + MimeHelper.AddMimeMapping(".ins", "application/x-internet-signup"); + MimeHelper.AddMimeMapping(".ico", "image/x-icon"); + MimeHelper.AddMimeMapping(".jpg", "image/jpeg"); + MimeHelper.AddMimeMapping(".jfif", "image/pjpeg"); + MimeHelper.AddMimeMapping(".jpe", "image/jpeg"); + MimeHelper.AddMimeMapping(".jpeg", "image/jpeg"); + MimeHelper.AddMimeMapping(".js", "application/x-javascript"); + MimeHelper.AddMimeMapping(".lsx", "video/x-la-asf"); + MimeHelper.AddMimeMapping(".latex", "application/x-latex"); + MimeHelper.AddMimeMapping(".lsf", "video/x-la-asf"); + MimeHelper.AddMimeMapping(".manifest", "application/x-ms-manifest"); + MimeHelper.AddMimeMapping(".mhtml", "message/rfc822"); + MimeHelper.AddMimeMapping(".mny", "application/x-msmoney"); + MimeHelper.AddMimeMapping(".mht", "message/rfc822"); + MimeHelper.AddMimeMapping(".mid", "audio/mid"); + MimeHelper.AddMimeMapping(".mpv2", "video/mpeg"); + MimeHelper.AddMimeMapping(".man", "application/x-troff-man"); + MimeHelper.AddMimeMapping(".mvb", "application/x-msmediaview"); + MimeHelper.AddMimeMapping(".mpeg", "video/mpeg"); + MimeHelper.AddMimeMapping(".m3u", "audio/x-mpegurl"); + MimeHelper.AddMimeMapping(".mdb", "application/x-msaccess"); + MimeHelper.AddMimeMapping(".mpp", "application/vnd.ms-project"); + MimeHelper.AddMimeMapping(".m1v", "video/mpeg"); + MimeHelper.AddMimeMapping(".mpa", "video/mpeg"); + MimeHelper.AddMimeMapping(".me", "application/x-troff-me"); + MimeHelper.AddMimeMapping(".m13", "application/x-msmediaview"); + MimeHelper.AddMimeMapping(".movie", "video/x-sgi-movie"); + MimeHelper.AddMimeMapping(".m14", "application/x-msmediaview"); + MimeHelper.AddMimeMapping(".mpe", "video/mpeg"); + MimeHelper.AddMimeMapping(".mp2", "video/mpeg"); + MimeHelper.AddMimeMapping(".mov", "video/quicktime"); + MimeHelper.AddMimeMapping(".mp3", "audio/mpeg"); + MimeHelper.AddMimeMapping(".mpg", "video/mpeg"); + MimeHelper.AddMimeMapping(".ms", "application/x-troff-ms"); + MimeHelper.AddMimeMapping(".nc", "application/x-netcdf"); + MimeHelper.AddMimeMapping(".nws", "message/rfc822"); + MimeHelper.AddMimeMapping(".oda", "application/oda"); + MimeHelper.AddMimeMapping(".ods", "application/oleobject"); + MimeHelper.AddMimeMapping(".pmc", "application/x-perfmon"); + MimeHelper.AddMimeMapping(".p7r", "application/x-pkcs7-certreqresp"); + MimeHelper.AddMimeMapping(".p7b", "application/x-pkcs7-certificates"); + MimeHelper.AddMimeMapping(".p7s", "application/pkcs7-signature"); + MimeHelper.AddMimeMapping(".pmw", "application/x-perfmon"); + MimeHelper.AddMimeMapping(".ps", "application/postscript"); + MimeHelper.AddMimeMapping(".p7c", "application/pkcs7-mime"); + MimeHelper.AddMimeMapping(".pbm", "image/x-portable-bitmap"); + MimeHelper.AddMimeMapping(".ppm", "image/x-portable-pixmap"); + MimeHelper.AddMimeMapping(".pub", "application/x-mspublisher"); + MimeHelper.AddMimeMapping(".pnm", "image/x-portable-anymap"); + MimeHelper.AddMimeMapping(".png", "image/png"); + MimeHelper.AddMimeMapping(".pml", "application/x-perfmon"); + MimeHelper.AddMimeMapping(".p10", "application/pkcs10"); + MimeHelper.AddMimeMapping(".pfx", "application/x-pkcs12"); + MimeHelper.AddMimeMapping(".p12", "application/x-pkcs12"); + MimeHelper.AddMimeMapping(".pdf", "application/pdf"); + MimeHelper.AddMimeMapping(".pps", "application/vnd.ms-powerpoint"); + MimeHelper.AddMimeMapping(".p7m", "application/pkcs7-mime"); + MimeHelper.AddMimeMapping(".pko", "application/vndms-pkipko"); + MimeHelper.AddMimeMapping(".ppt", "application/vnd.ms-powerpoint"); + MimeHelper.AddMimeMapping(".pmr", "application/x-perfmon"); + MimeHelper.AddMimeMapping(".pma", "application/x-perfmon"); + MimeHelper.AddMimeMapping(".pot", "application/vnd.ms-powerpoint"); + MimeHelper.AddMimeMapping(".prf", "application/pics-rules"); + MimeHelper.AddMimeMapping(".pgm", "image/x-portable-graymap"); + MimeHelper.AddMimeMapping(".qt", "video/quicktime"); + MimeHelper.AddMimeMapping(".ra", "audio/x-pn-realaudio"); + MimeHelper.AddMimeMapping(".rgb", "image/x-rgb"); + MimeHelper.AddMimeMapping(".ram", "audio/x-pn-realaudio"); + MimeHelper.AddMimeMapping(".rmi", "audio/mid"); + MimeHelper.AddMimeMapping(".ras", "image/x-cmu-raster"); + MimeHelper.AddMimeMapping(".roff", "application/x-troff"); + MimeHelper.AddMimeMapping(".rtf", "application/rtf"); + MimeHelper.AddMimeMapping(".rtx", "text/richtext"); + MimeHelper.AddMimeMapping(".sv4crc", "application/x-sv4crc"); + MimeHelper.AddMimeMapping(".spc", "application/x-pkcs7-certificates"); + MimeHelper.AddMimeMapping(".setreg", "application/set-registration-initiation"); + MimeHelper.AddMimeMapping(".snd", "audio/basic"); + MimeHelper.AddMimeMapping(".stl", "application/vndms-pkistl"); + MimeHelper.AddMimeMapping(".setpay", "application/set-payment-initiation"); + MimeHelper.AddMimeMapping(".stm", "text/html"); + MimeHelper.AddMimeMapping(".shar", "application/x-shar"); + MimeHelper.AddMimeMapping(".sh", "application/x-sh"); + MimeHelper.AddMimeMapping(".sit", "application/x-stuffit"); + MimeHelper.AddMimeMapping(".spl", "application/futuresplash"); + MimeHelper.AddMimeMapping(".sct", "text/scriptlet"); + MimeHelper.AddMimeMapping(".scd", "application/x-msschedule"); + MimeHelper.AddMimeMapping(".sst", "application/vndms-pkicertstore"); + MimeHelper.AddMimeMapping(".src", "application/x-wais-source"); + MimeHelper.AddMimeMapping(".sv4cpio", "application/x-sv4cpio"); + MimeHelper.AddMimeMapping(".tex", "application/x-tex"); + MimeHelper.AddMimeMapping(".tgz", "application/x-compressed"); + MimeHelper.AddMimeMapping(".t", "application/x-troff"); + MimeHelper.AddMimeMapping(".tar", "application/x-tar"); + MimeHelper.AddMimeMapping(".tr", "application/x-troff"); + MimeHelper.AddMimeMapping(".tif", "image/tiff"); + MimeHelper.AddMimeMapping(".txt", "text/plain"); + MimeHelper.AddMimeMapping(".texinfo", "application/x-texinfo"); + MimeHelper.AddMimeMapping(".trm", "application/x-msterminal"); + MimeHelper.AddMimeMapping(".tiff", "image/tiff"); + MimeHelper.AddMimeMapping(".tcl", "application/x-tcl"); + MimeHelper.AddMimeMapping(".texi", "application/x-texinfo"); + MimeHelper.AddMimeMapping(".tsv", "text/tab-separated-values"); + MimeHelper.AddMimeMapping(".ustar", "application/x-ustar"); + MimeHelper.AddMimeMapping(".uls", "text/iuls"); + MimeHelper.AddMimeMapping(".vcf", "text/x-vcard"); + MimeHelper.AddMimeMapping(".wps", "application/vnd.ms-works"); + MimeHelper.AddMimeMapping(".wav", "audio/wav"); + MimeHelper.AddMimeMapping(".wrz", "x-world/x-vrml"); + MimeHelper.AddMimeMapping(".wri", "application/x-mswrite"); + MimeHelper.AddMimeMapping(".wks", "application/vnd.ms-works"); + MimeHelper.AddMimeMapping(".wmf", "application/x-msmetafile"); + MimeHelper.AddMimeMapping(".wcm", "application/vnd.ms-works"); + MimeHelper.AddMimeMapping(".wrl", "x-world/x-vrml"); + MimeHelper.AddMimeMapping(".wdb", "application/vnd.ms-works"); + MimeHelper.AddMimeMapping(".wsdl", "text/xml"); + MimeHelper.AddMimeMapping(".xap", "application/x-silverlight-app"); + MimeHelper.AddMimeMapping(".xml", "text/xml"); + MimeHelper.AddMimeMapping(".xlm", "application/vnd.ms-excel"); + MimeHelper.AddMimeMapping(".xaf", "x-world/x-vrml"); + MimeHelper.AddMimeMapping(".xla", "application/vnd.ms-excel"); + MimeHelper.AddMimeMapping(".xls", "application/vnd.ms-excel"); + MimeHelper.AddMimeMapping(".xlsx", "application/vnd.ms-excel"); + MimeHelper.AddMimeMapping(".xof", "x-world/x-vrml"); + MimeHelper.AddMimeMapping(".xlt", "application/vnd.ms-excel"); + MimeHelper.AddMimeMapping(".xlc", "application/vnd.ms-excel"); + MimeHelper.AddMimeMapping(".xsl", "text/xml"); + MimeHelper.AddMimeMapping(".xbm", "image/x-xbitmap"); + MimeHelper.AddMimeMapping(".xlw", "application/vnd.ms-excel"); + MimeHelper.AddMimeMapping(".xpm", "image/x-xpixmap"); + MimeHelper.AddMimeMapping(".xwd", "image/x-xwindowdump"); + MimeHelper.AddMimeMapping(".xsd", "text/xml"); + MimeHelper.AddMimeMapping(".z", "application/x-compress"); + MimeHelper.AddMimeMapping(".zip", "application/x-zip-compressed"); + MimeHelper.AddMimeMapping(".*", "application/octet-stream"); + } + } + - static MimeHelper() - { - MimeHelper._mimeMappingTable = new Hashtable(190, StringComparer.CurrentCultureIgnoreCase); - MimeHelper.AddMimeMapping(".323", "text/h323"); - MimeHelper.AddMimeMapping(".asx", "video/x-ms-asf"); - MimeHelper.AddMimeMapping(".acx", "application/internet-property-stream"); - MimeHelper.AddMimeMapping(".ai", "application/postscript"); - MimeHelper.AddMimeMapping(".aif", "audio/x-aiff"); - MimeHelper.AddMimeMapping(".aiff", "audio/aiff"); - MimeHelper.AddMimeMapping(".axs", "application/olescript"); - MimeHelper.AddMimeMapping(".aifc", "audio/aiff"); - MimeHelper.AddMimeMapping(".asr", "video/x-ms-asf"); - MimeHelper.AddMimeMapping(".avi", "video/x-msvideo"); - MimeHelper.AddMimeMapping(".asf", "video/x-ms-asf"); - MimeHelper.AddMimeMapping(".au", "audio/basic"); - MimeHelper.AddMimeMapping(".application", "application/x-ms-application"); - MimeHelper.AddMimeMapping(".bin", "application/octet-stream"); - MimeHelper.AddMimeMapping(".bas", "text/plain"); - MimeHelper.AddMimeMapping(".bcpio", "application/x-bcpio"); - MimeHelper.AddMimeMapping(".bmp", "image/bmp"); - MimeHelper.AddMimeMapping(".cdf", "application/x-cdf"); - MimeHelper.AddMimeMapping(".cat", "application/vndms-pkiseccat"); - MimeHelper.AddMimeMapping(".crt", "application/x-x509-ca-cert"); - MimeHelper.AddMimeMapping(".c", "text/plain"); - MimeHelper.AddMimeMapping(".css", "text/css"); - MimeHelper.AddMimeMapping(".cer", "application/x-x509-ca-cert"); - MimeHelper.AddMimeMapping(".crl", "application/pkix-crl"); - MimeHelper.AddMimeMapping(".cmx", "image/x-cmx"); - MimeHelper.AddMimeMapping(".csh", "application/x-csh"); - MimeHelper.AddMimeMapping(".cod", "image/cis-cod"); - MimeHelper.AddMimeMapping(".cpio", "application/x-cpio"); - MimeHelper.AddMimeMapping(".clp", "application/x-msclip"); - MimeHelper.AddMimeMapping(".crd", "application/x-mscardfile"); - MimeHelper.AddMimeMapping(".deploy", "application/octet-stream"); - MimeHelper.AddMimeMapping(".dll", "application/x-msdownload"); - MimeHelper.AddMimeMapping(".dot", "application/msword"); - MimeHelper.AddMimeMapping(".doc", "application/msword"); - MimeHelper.AddMimeMapping(".dvi", "application/x-dvi"); - MimeHelper.AddMimeMapping(".dir", "application/x-director"); - MimeHelper.AddMimeMapping(".dxr", "application/x-director"); - MimeHelper.AddMimeMapping(".der", "application/x-x509-ca-cert"); - MimeHelper.AddMimeMapping(".dib", "image/bmp"); - MimeHelper.AddMimeMapping(".dcr", "application/x-director"); - MimeHelper.AddMimeMapping(".disco", "text/xml"); - MimeHelper.AddMimeMapping(".exe", "application/octet-stream"); - MimeHelper.AddMimeMapping(".etx", "text/x-setext"); - MimeHelper.AddMimeMapping(".evy", "application/envoy"); - MimeHelper.AddMimeMapping(".eml", "message/rfc822"); - MimeHelper.AddMimeMapping(".eps", "application/postscript"); - MimeHelper.AddMimeMapping(".flr", "x-world/x-vrml"); - MimeHelper.AddMimeMapping(".fif", "application/fractals"); - MimeHelper.AddMimeMapping(".gtar", "application/x-gtar"); - MimeHelper.AddMimeMapping(".gif", "image/gif"); - MimeHelper.AddMimeMapping(".gz", "application/x-gzip"); - MimeHelper.AddMimeMapping(".hta", "application/hta"); - MimeHelper.AddMimeMapping(".htc", "text/x-component"); - MimeHelper.AddMimeMapping(".htt", "text/webviewhtml"); - MimeHelper.AddMimeMapping(".h", "text/plain"); - MimeHelper.AddMimeMapping(".hdf", "application/x-hdf"); - MimeHelper.AddMimeMapping(".hlp", "application/winhlp"); - MimeHelper.AddMimeMapping(".html", "text/html"); - MimeHelper.AddMimeMapping(".htm", "text/html"); - MimeHelper.AddMimeMapping(".hqx", "application/mac-binhex40"); - MimeHelper.AddMimeMapping(".isp", "application/x-internet-signup"); - MimeHelper.AddMimeMapping(".iii", "application/x-iphone"); - MimeHelper.AddMimeMapping(".ief", "image/ief"); - MimeHelper.AddMimeMapping(".ivf", "video/x-ivf"); - MimeHelper.AddMimeMapping(".ins", "application/x-internet-signup"); - MimeHelper.AddMimeMapping(".ico", "image/x-icon"); - MimeHelper.AddMimeMapping(".jpg", "image/jpeg"); - MimeHelper.AddMimeMapping(".jfif", "image/pjpeg"); - MimeHelper.AddMimeMapping(".jpe", "image/jpeg"); - MimeHelper.AddMimeMapping(".jpeg", "image/jpeg"); - MimeHelper.AddMimeMapping(".js", "application/x-javascript"); - MimeHelper.AddMimeMapping(".lsx", "video/x-la-asf"); - MimeHelper.AddMimeMapping(".latex", "application/x-latex"); - MimeHelper.AddMimeMapping(".lsf", "video/x-la-asf"); - MimeHelper.AddMimeMapping(".manifest", "application/x-ms-manifest"); - MimeHelper.AddMimeMapping(".mhtml", "message/rfc822"); - MimeHelper.AddMimeMapping(".mny", "application/x-msmoney"); - MimeHelper.AddMimeMapping(".mht", "message/rfc822"); - MimeHelper.AddMimeMapping(".mid", "audio/mid"); - MimeHelper.AddMimeMapping(".mpv2", "video/mpeg"); - MimeHelper.AddMimeMapping(".man", "application/x-troff-man"); - MimeHelper.AddMimeMapping(".mvb", "application/x-msmediaview"); - MimeHelper.AddMimeMapping(".mpeg", "video/mpeg"); - MimeHelper.AddMimeMapping(".m3u", "audio/x-mpegurl"); - MimeHelper.AddMimeMapping(".mdb", "application/x-msaccess"); - MimeHelper.AddMimeMapping(".mpp", "application/vnd.ms-project"); - MimeHelper.AddMimeMapping(".m1v", "video/mpeg"); - MimeHelper.AddMimeMapping(".mpa", "video/mpeg"); - MimeHelper.AddMimeMapping(".me", "application/x-troff-me"); - MimeHelper.AddMimeMapping(".m13", "application/x-msmediaview"); - MimeHelper.AddMimeMapping(".movie", "video/x-sgi-movie"); - MimeHelper.AddMimeMapping(".m14", "application/x-msmediaview"); - MimeHelper.AddMimeMapping(".mpe", "video/mpeg"); - MimeHelper.AddMimeMapping(".mp2", "video/mpeg"); - MimeHelper.AddMimeMapping(".mov", "video/quicktime"); - MimeHelper.AddMimeMapping(".mp3", "audio/mpeg"); - MimeHelper.AddMimeMapping(".mpg", "video/mpeg"); - MimeHelper.AddMimeMapping(".ms", "application/x-troff-ms"); - MimeHelper.AddMimeMapping(".nc", "application/x-netcdf"); - MimeHelper.AddMimeMapping(".nws", "message/rfc822"); - MimeHelper.AddMimeMapping(".oda", "application/oda"); - MimeHelper.AddMimeMapping(".ods", "application/oleobject"); - MimeHelper.AddMimeMapping(".pmc", "application/x-perfmon"); - MimeHelper.AddMimeMapping(".p7r", "application/x-pkcs7-certreqresp"); - MimeHelper.AddMimeMapping(".p7b", "application/x-pkcs7-certificates"); - MimeHelper.AddMimeMapping(".p7s", "application/pkcs7-signature"); - MimeHelper.AddMimeMapping(".pmw", "application/x-perfmon"); - MimeHelper.AddMimeMapping(".ps", "application/postscript"); - MimeHelper.AddMimeMapping(".p7c", "application/pkcs7-mime"); - MimeHelper.AddMimeMapping(".pbm", "image/x-portable-bitmap"); - MimeHelper.AddMimeMapping(".ppm", "image/x-portable-pixmap"); - MimeHelper.AddMimeMapping(".pub", "application/x-mspublisher"); - MimeHelper.AddMimeMapping(".pnm", "image/x-portable-anymap"); - MimeHelper.AddMimeMapping(".png", "image/png"); - MimeHelper.AddMimeMapping(".pml", "application/x-perfmon"); - MimeHelper.AddMimeMapping(".p10", "application/pkcs10"); - MimeHelper.AddMimeMapping(".pfx", "application/x-pkcs12"); - MimeHelper.AddMimeMapping(".p12", "application/x-pkcs12"); - MimeHelper.AddMimeMapping(".pdf", "application/pdf"); - MimeHelper.AddMimeMapping(".pps", "application/vnd.ms-powerpoint"); - MimeHelper.AddMimeMapping(".p7m", "application/pkcs7-mime"); - MimeHelper.AddMimeMapping(".pko", "application/vndms-pkipko"); - MimeHelper.AddMimeMapping(".ppt", "application/vnd.ms-powerpoint"); - MimeHelper.AddMimeMapping(".pmr", "application/x-perfmon"); - MimeHelper.AddMimeMapping(".pma", "application/x-perfmon"); - MimeHelper.AddMimeMapping(".pot", "application/vnd.ms-powerpoint"); - MimeHelper.AddMimeMapping(".prf", "application/pics-rules"); - MimeHelper.AddMimeMapping(".pgm", "image/x-portable-graymap"); - MimeHelper.AddMimeMapping(".qt", "video/quicktime"); - MimeHelper.AddMimeMapping(".ra", "audio/x-pn-realaudio"); - MimeHelper.AddMimeMapping(".rgb", "image/x-rgb"); - MimeHelper.AddMimeMapping(".ram", "audio/x-pn-realaudio"); - MimeHelper.AddMimeMapping(".rmi", "audio/mid"); - MimeHelper.AddMimeMapping(".ras", "image/x-cmu-raster"); - MimeHelper.AddMimeMapping(".roff", "application/x-troff"); - MimeHelper.AddMimeMapping(".rtf", "application/rtf"); - MimeHelper.AddMimeMapping(".rtx", "text/richtext"); - MimeHelper.AddMimeMapping(".sv4crc", "application/x-sv4crc"); - MimeHelper.AddMimeMapping(".spc", "application/x-pkcs7-certificates"); - MimeHelper.AddMimeMapping(".setreg", "application/set-registration-initiation"); - MimeHelper.AddMimeMapping(".snd", "audio/basic"); - MimeHelper.AddMimeMapping(".stl", "application/vndms-pkistl"); - MimeHelper.AddMimeMapping(".setpay", "application/set-payment-initiation"); - MimeHelper.AddMimeMapping(".stm", "text/html"); - MimeHelper.AddMimeMapping(".shar", "application/x-shar"); - MimeHelper.AddMimeMapping(".sh", "application/x-sh"); - MimeHelper.AddMimeMapping(".sit", "application/x-stuffit"); - MimeHelper.AddMimeMapping(".spl", "application/futuresplash"); - MimeHelper.AddMimeMapping(".sct", "text/scriptlet"); - MimeHelper.AddMimeMapping(".scd", "application/x-msschedule"); - MimeHelper.AddMimeMapping(".sst", "application/vndms-pkicertstore"); - MimeHelper.AddMimeMapping(".src", "application/x-wais-source"); - MimeHelper.AddMimeMapping(".sv4cpio", "application/x-sv4cpio"); - MimeHelper.AddMimeMapping(".tex", "application/x-tex"); - MimeHelper.AddMimeMapping(".tgz", "application/x-compressed"); - MimeHelper.AddMimeMapping(".t", "application/x-troff"); - MimeHelper.AddMimeMapping(".tar", "application/x-tar"); - MimeHelper.AddMimeMapping(".tr", "application/x-troff"); - MimeHelper.AddMimeMapping(".tif", "image/tiff"); - MimeHelper.AddMimeMapping(".txt", "text/plain"); - MimeHelper.AddMimeMapping(".texinfo", "application/x-texinfo"); - MimeHelper.AddMimeMapping(".trm", "application/x-msterminal"); - MimeHelper.AddMimeMapping(".tiff", "image/tiff"); - MimeHelper.AddMimeMapping(".tcl", "application/x-tcl"); - MimeHelper.AddMimeMapping(".texi", "application/x-texinfo"); - MimeHelper.AddMimeMapping(".tsv", "text/tab-separated-values"); - MimeHelper.AddMimeMapping(".ustar", "application/x-ustar"); - MimeHelper.AddMimeMapping(".uls", "text/iuls"); - MimeHelper.AddMimeMapping(".vcf", "text/x-vcard"); - MimeHelper.AddMimeMapping(".wps", "application/vnd.ms-works"); - MimeHelper.AddMimeMapping(".wav", "audio/wav"); - MimeHelper.AddMimeMapping(".wrz", "x-world/x-vrml"); - MimeHelper.AddMimeMapping(".wri", "application/x-mswrite"); - MimeHelper.AddMimeMapping(".wks", "application/vnd.ms-works"); - MimeHelper.AddMimeMapping(".wmf", "application/x-msmetafile"); - MimeHelper.AddMimeMapping(".wcm", "application/vnd.ms-works"); - MimeHelper.AddMimeMapping(".wrl", "x-world/x-vrml"); - MimeHelper.AddMimeMapping(".wdb", "application/vnd.ms-works"); - MimeHelper.AddMimeMapping(".wsdl", "text/xml"); - MimeHelper.AddMimeMapping(".xap", "application/x-silverlight-app"); - MimeHelper.AddMimeMapping(".xml", "text/xml"); - MimeHelper.AddMimeMapping(".xlm", "application/vnd.ms-excel"); - MimeHelper.AddMimeMapping(".xaf", "x-world/x-vrml"); - MimeHelper.AddMimeMapping(".xla", "application/vnd.ms-excel"); - MimeHelper.AddMimeMapping(".xls", "application/vnd.ms-excel"); - MimeHelper.AddMimeMapping(".xlsx", "application/vnd.ms-excel"); - MimeHelper.AddMimeMapping(".xof", "x-world/x-vrml"); - MimeHelper.AddMimeMapping(".xlt", "application/vnd.ms-excel"); - MimeHelper.AddMimeMapping(".xlc", "application/vnd.ms-excel"); - MimeHelper.AddMimeMapping(".xsl", "text/xml"); - MimeHelper.AddMimeMapping(".xbm", "image/x-xbitmap"); - MimeHelper.AddMimeMapping(".xlw", "application/vnd.ms-excel"); - MimeHelper.AddMimeMapping(".xpm", "image/x-xpixmap"); - MimeHelper.AddMimeMapping(".xwd", "image/x-xwindowdump"); - MimeHelper.AddMimeMapping(".xsd", "text/xml"); - MimeHelper.AddMimeMapping(".z", "application/x-compress"); - MimeHelper.AddMimeMapping(".zip", "application/x-zip-compressed"); - MimeHelper.AddMimeMapping(".*", "application/octet-stream"); - } - } - - } diff --git a/Yi.Framework.Net6/src/module/Yi.Framework.FileManager/FileEntity.cs b/Yi.Framework.Net6/src/module/Yi.Framework.FileManager/FileEntity.cs new file mode 100644 index 00000000..18c9c58f --- /dev/null +++ b/Yi.Framework.Net6/src/module/Yi.Framework.FileManager/FileEntity.cs @@ -0,0 +1,48 @@ +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Yi.Framework.Data.Auditing; +using Yi.Framework.Ddd.Entities; + +namespace Yi.Framework.FileManager +{ + /// + /// 文件表 + /// + [SugarTable("File")] + public class FileEntity : IEntity,IAuditedObject + { + [SugarColumn(ColumnName = "Id", IsPrimaryKey = true)] + public long Id { get; set; } + /// + /// 文件类型 + /// + [SugarColumn(ColumnName = "FileContentType")] + public string? FileContentType { get; set; } + /// + /// 文件大小 + /// + [SugarColumn(ColumnName = "FileSize")] + public decimal FileSize { get; set; } + /// + /// 文件名 + /// + [SugarColumn(ColumnName = "FileName")] + public string FileName { get; set; } + /// + /// 文件路径 + /// + [SugarColumn(ColumnName = "FilePath")] + public string FilePath { get; set; } + + public DateTime CreationTime { get; set; } + public long? CreatorId { get; set; } + + public long? LastModifierId { get; set; } + + public DateTime? LastModificationTime { get; set; } + } +} diff --git a/Yi.Framework.Net6/src/module/Yi.Framework.FileManager/FileGetListOutputDto.cs b/Yi.Framework.Net6/src/module/Yi.Framework.FileManager/FileGetListOutputDto.cs new file mode 100644 index 00000000..9cc4c5e4 --- /dev/null +++ b/Yi.Framework.Net6/src/module/Yi.Framework.FileManager/FileGetListOutputDto.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Yi.Framework.Ddd.Dtos; + +namespace Yi.Framework.FileManager +{ + public class FileGetListOutputDto:IEntityDto + { + public long Id { get; set; } + } +} diff --git a/Yi.Framework.Net6/src/module/Yi.Framework.FileManager/FileService.cs b/Yi.Framework.Net6/src/module/Yi.Framework.FileManager/FileService.cs new file mode 100644 index 00000000..59f89626 --- /dev/null +++ b/Yi.Framework.Net6/src/module/Yi.Framework.FileManager/FileService.cs @@ -0,0 +1,158 @@ +using Cike.AutoWebApi.Setting; +using Mapster; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Data; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Yi.Framework.AspNetCore.Extensions; +using Yi.Framework.Core.Const; +using Yi.Framework.Core.Enums; +using Yi.Framework.Core.Helper; +using Yi.Framework.Ddd.Repositories; +using Yi.Framework.Ddd.Services; +using Yi.Framework.Ddd.Services.Abstract; +using Yi.Framework.ThumbnailSharp; + +namespace Yi.Framework.FileManager +{ + /// + /// 文件处理 + /// + public class FileService : ApplicationService, IFileService, IAutoApiService + { + private readonly IRepository _repository; + private readonly ThumbnailSharpManager _thumbnailSharpManager; + private readonly HttpContext _httpContext; + public FileService(IRepository repository, ThumbnailSharpManager thumbnailSharpManager, IHttpContextAccessor httpContextAccessor + ) + { + _repository = repository; + _thumbnailSharpManager = thumbnailSharpManager; + if (httpContextAccessor.HttpContext is null) + { + throw new ApplicationException("HttpContext为空"); + } + _httpContext = httpContextAccessor.HttpContext; + } + + /// + /// 下载文件,是否缩略图 + /// + /// + [Route("/api/file/{code}/{isThumbnail?}")] + public async Task Get([FromRoute] long code, [FromRoute] bool? isThumbnail) + { + var file = await _repository.GetByIdAsync(code); + if (file is null) + { + return new NotFoundResult(); + } + + var path = file.FilePath; + //如果为缩略图,需要修改路径 + if (isThumbnail is true) + { + path = $"{PathConst.wwwroot}/{FileTypeEnum.Thumbnail}/{file.Id}{Path.GetExtension(file.FileName)}"; + } + //路径为: 文件路径/文件id+文件扩展名 + + if (!File.Exists(path)) + { + return new NotFoundResult(); + } + + var steam = await File.ReadAllBytesAsync(path); + + //设置附件下载,下载名称 + _httpContext.FileAttachmentHandle(file.FileName); + return new FileContentResult(steam, file.FileContentType ?? @"text/plain"); + } + + /// + /// 上传文件 + /// + /// + public async Task> Post([FromForm] IFormFileCollection file) + { + if (file.Count() == 0) + { + throw new ArgumentException("文件上传为空!"); + } + //批量插入 + List entities = new(); + + foreach (var f in file) + { + FileEntity data = new(); + data.Id = SnowflakeHelper.NextId; + data.FileSize = ((decimal)f.Length) / 1024; + data.FileName = f.FileName; + + + data.FileContentType = MimeHelper.GetMimeMapping(f.FileName); + + + var type = MimeHelper.GetFileType(f.FileName); + + //落盘文件,文件名为雪花id+自己的扩展名 + string filename = data.Id.ToString() + Path.GetExtension(f.FileName); + string typePath = $"{PathConst.wwwroot}/{type}"; + if (!Directory.Exists(typePath)) + { + Directory.CreateDirectory(typePath); + } + + var filePath = Path.Combine(typePath, filename); + data.FilePath = filePath; + + + //生成文件 + using (var stream = new FileStream(filePath, FileMode.CreateNew, FileAccess.ReadWrite)) + { + await f.CopyToAsync(stream); + + //如果是图片类型,还需要生成缩略图,当然,如果图片很小,直接复制过去即可 + if (FileTypeEnum.Image.Equals(type)) + { + string thumbnailPath = $"{PathConst.wwwroot}/{FileTypeEnum.Thumbnail}"; + if (!Directory.Exists(thumbnailPath)) + { + Directory.CreateDirectory(thumbnailPath); + } + //保存至缩略图路径 + byte[] result = null!; + try + { + result = _thumbnailSharpManager.CreateThumbnailBytes(thumbnailSize: 300, imageStream: stream, imageFormat: Format.Jpeg); + } + catch + { + result = new byte[stream.Length]; + stream.Read(result, 0, result.Length); + // 设置当前流的位置为流的开始 + stream.Seek(0, SeekOrigin.Begin); + } + finally + { + + await System.IO.File.WriteAllBytesAsync(Path.Combine(thumbnailPath, filename), result); + } + } + + + }; + entities.Add(data); + } + await _repository.InsertRangeAsync(entities); + return entities.Adapt>(); + + + } + } +} diff --git a/Yi.Framework.Net6/src/module/Yi.Framework.FileManager/IFileService.cs b/Yi.Framework.Net6/src/module/Yi.Framework.FileManager/IFileService.cs new file mode 100644 index 00000000..ad47147f --- /dev/null +++ b/Yi.Framework.Net6/src/module/Yi.Framework.FileManager/IFileService.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Yi.Framework.FileManager +{ + public interface IFileService + { + } +} diff --git a/Yi.Framework.Net6/src/module/Yi.Framework.FileManager/Yi.Framework.FileManager.csproj b/Yi.Framework.Net6/src/module/Yi.Framework.FileManager/Yi.Framework.FileManager.csproj index 4317b5b8..453826c2 100644 --- a/Yi.Framework.Net6/src/module/Yi.Framework.FileManager/Yi.Framework.FileManager.csproj +++ b/Yi.Framework.Net6/src/module/Yi.Framework.FileManager/Yi.Framework.FileManager.csproj @@ -4,10 +4,15 @@ net6.0 enable enable + True + + + + diff --git a/Yi.Framework.Net6/src/module/Yi.Framework.FileManager/YiFrameworkFileManagerModule.cs b/Yi.Framework.Net6/src/module/Yi.Framework.FileManager/YiFrameworkFileManagerModule.cs index 371a8b6a..34d1deb2 100644 --- a/Yi.Framework.Net6/src/module/Yi.Framework.FileManager/YiFrameworkFileManagerModule.cs +++ b/Yi.Framework.Net6/src/module/Yi.Framework.FileManager/YiFrameworkFileManagerModule.cs @@ -1,7 +1,20 @@ -namespace Yi.Framework.FileManager -{ - public class YiFrameworkFileManagerModule - { +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.DependencyInjection; +using StartupModules; +namespace Yi.Framework.FileManager +{ + public class YiFrameworkFileManagerModule : IStartupModule + { + public void Configure(IApplicationBuilder app, ConfigureMiddlewareContext context) + { + + } + + public void ConfigureServices(IServiceCollection services, ConfigureServicesContext context) + { + services.AddTransient(); + services.AddTransient(); + } } } \ No newline at end of file diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/Yi.RBAC.Domain.csproj b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/Yi.RBAC.Domain.csproj index e4000629..5aad5dba 100644 --- a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/Yi.RBAC.Domain.csproj +++ b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/Yi.RBAC.Domain.csproj @@ -17,6 +17,7 @@ + diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/YiRBACDomainModule.cs b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/YiRBACDomainModule.cs index 06869cdb..0c06234c 100644 --- a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/YiRBACDomainModule.cs +++ b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/YiRBACDomainModule.cs @@ -10,6 +10,7 @@ using System.Threading.Tasks; using Yi.Framework.Core.Attributes; using Yi.Framework.Data; using Yi.Framework.EventBus; +using Yi.Framework.FileManager; using Yi.Framework.OperLogManager; using Yi.Framework.ThumbnailSharp; using Yi.RBAC.Domain.Logs; @@ -22,7 +23,8 @@ namespace Yi.RBAC.Domain typeof(YiFrameworkDataModule), typeof(YiFrameworkThumbnailSharpModule), typeof(YiFrameworkEventBusModule), - typeof(YiFrameworkOperLogManagerModule) + typeof(YiFrameworkOperLogManagerModule), + typeof(YiFrameworkFileManagerModule) )] public class YiRBACDomainModule : IStartupModule { diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Web/wwwroot/File/1628628277864304640.txt b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Web/wwwroot/File/1628628277864304640.txt new file mode 100644 index 00000000..119417d4 --- /dev/null +++ b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Web/wwwroot/File/1628628277864304640.txt @@ -0,0 +1,28 @@ +3-5 +一周一次 + +实现涂膜功能 +1:数据存储,Crud +2:后台线程,任务调度 +3:plc通信交互,IM工厂 +4:定时任务界面管控 +5:signlr开发 +6:授权鉴权 +7:用户角色菜单模块 +8:配置文件统一标准化 +9:规范问题 +10:动态api +11:发布订阅 +12:resful +13:dto注释 +14:代码中文 +15:种子数据 + +1:job任务调度的模式,可以在if上的改 +2:Crud,EntityServiceBase,考虑复用的话sqlsugar这块就不用动了、仓储、工作单元、过滤器 +3:IOptionsWritable ,直接可以复用 +4:事件,是否需要,需要的话,用哪个 +5:动态api,是否需要 +6:IM,IVarReader中的IDataChannel工厂 +6:ISignal +7:微软日志扩展,这块是否考虑封装出来,还是直接提供微软日志的扩展,我们提供模板就可以了 diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Web/wwwroot/File/1628628396160454656.txt b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Web/wwwroot/File/1628628396160454656.txt new file mode 100644 index 00000000..119417d4 --- /dev/null +++ b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Web/wwwroot/File/1628628396160454656.txt @@ -0,0 +1,28 @@ +3-5 +一周一次 + +实现涂膜功能 +1:数据存储,Crud +2:后台线程,任务调度 +3:plc通信交互,IM工厂 +4:定时任务界面管控 +5:signlr开发 +6:授权鉴权 +7:用户角色菜单模块 +8:配置文件统一标准化 +9:规范问题 +10:动态api +11:发布订阅 +12:resful +13:dto注释 +14:代码中文 +15:种子数据 + +1:job任务调度的模式,可以在if上的改 +2:Crud,EntityServiceBase,考虑复用的话sqlsugar这块就不用动了、仓储、工作单元、过滤器 +3:IOptionsWritable ,直接可以复用 +4:事件,是否需要,需要的话,用哪个 +5:动态api,是否需要 +6:IM,IVarReader中的IDataChannel工厂 +6:ISignal +7:微软日志扩展,这块是否考虑封装出来,还是直接提供微软日志的扩展,我们提供模板就可以了 diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Web/wwwroot/File/1628628415508779008.txt b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Web/wwwroot/File/1628628415508779008.txt new file mode 100644 index 00000000..119417d4 --- /dev/null +++ b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Web/wwwroot/File/1628628415508779008.txt @@ -0,0 +1,28 @@ +3-5 +一周一次 + +实现涂膜功能 +1:数据存储,Crud +2:后台线程,任务调度 +3:plc通信交互,IM工厂 +4:定时任务界面管控 +5:signlr开发 +6:授权鉴权 +7:用户角色菜单模块 +8:配置文件统一标准化 +9:规范问题 +10:动态api +11:发布订阅 +12:resful +13:dto注释 +14:代码中文 +15:种子数据 + +1:job任务调度的模式,可以在if上的改 +2:Crud,EntityServiceBase,考虑复用的话sqlsugar这块就不用动了、仓储、工作单元、过滤器 +3:IOptionsWritable ,直接可以复用 +4:事件,是否需要,需要的话,用哪个 +5:动态api,是否需要 +6:IM,IVarReader中的IDataChannel工厂 +6:ISignal +7:微软日志扩展,这块是否考虑封装出来,还是直接提供微软日志的扩展,我们提供模板就可以了 diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Web/wwwroot/File/1628636925021786112.txt b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Web/wwwroot/File/1628636925021786112.txt new file mode 100644 index 00000000..119417d4 --- /dev/null +++ b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Web/wwwroot/File/1628636925021786112.txt @@ -0,0 +1,28 @@ +3-5 +一周一次 + +实现涂膜功能 +1:数据存储,Crud +2:后台线程,任务调度 +3:plc通信交互,IM工厂 +4:定时任务界面管控 +5:signlr开发 +6:授权鉴权 +7:用户角色菜单模块 +8:配置文件统一标准化 +9:规范问题 +10:动态api +11:发布订阅 +12:resful +13:dto注释 +14:代码中文 +15:种子数据 + +1:job任务调度的模式,可以在if上的改 +2:Crud,EntityServiceBase,考虑复用的话sqlsugar这块就不用动了、仓储、工作单元、过滤器 +3:IOptionsWritable ,直接可以复用 +4:事件,是否需要,需要的话,用哪个 +5:动态api,是否需要 +6:IM,IVarReader中的IDataChannel工厂 +6:ISignal +7:微软日志扩展,这块是否考虑封装出来,还是直接提供微软日志的扩展,我们提供模板就可以了 diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Web/wwwroot/Image/1628639014875697152.jpg b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Web/wwwroot/Image/1628639014875697152.jpg new file mode 100644 index 0000000000000000000000000000000000000000..57c1f446cb28dd7bdbb3f2f11057650f693e93a5 GIT binary patch literal 30944 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 C(=9jv delta 300 zcmZp8z|pXPV}i6`0RsbrA`ruX@I)PB#)6Fr^Z6M$n*_EAFtRx4urt17V0_7Uo#zVQ zI?n$*t2wMVud!EhaI(&34`8{(n#Cx=xPif+;W__l{?ii|%5V1%U~FY!V$PU;FNAT* z^z-qIhAf=dnC5Su&w7gy$YMCSxt2YWY5TQEMjcj0#>s&SC)kX|*u>oxCvW7Dn7*)s zQG8nhBa?yw1A{2TYX<)7{OyotOPJPUa8xvz6Ci|Q<#mJ znHXL(odlY+bNlNC#y4D(B^YOJFX&-ZWSYLNk&$Qn^)SX{#%&XTo)KW?lB%?WMkvs%)tL;JBI?}O8&_Q{8_i}c+cpe006l@S$F^d From 93de208ac098cb65b34092f7ddd0935575c6b999 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=B7=B3?= Date: Thu, 23 Feb 2023 14:37:33 +0800 Subject: [PATCH 6/7] =?UTF-8?q?feat:=20=E5=89=8D=E7=AB=AF=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E5=AE=8C=E5=96=84=E5=A4=B4=E5=83=8F=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Identity/Dtos/Account/UpdateIconDto.cs | 13 +++++++++++++ .../ApplicationSwaggerDoc.xml | 7 +++++++ .../Identity/AccountService.cs | 15 +++++++++++++++ .../wwwroot/File/1628642335514562560 | Bin 0 -> 21934 bytes .../wwwroot/File/1628645021437792256 | Bin 0 -> 17030 bytes .../rbac/Yi.RBAC.Web/yi-sqlsugar-dev.db | Bin 143360 -> 143360 bytes Yi.RuoYi.Vue3/src/api/file.js | 4 ++-- Yi.RuoYi.Vue3/src/api/system/user.js | 9 +++++++++ .../views/system/user/profile/userAvatar.vue | 11 ++++------- 9 files changed, 50 insertions(+), 9 deletions(-) create mode 100644 Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Identity/Dtos/Account/UpdateIconDto.cs create mode 100644 Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Web/wwwroot/File/1628642335514562560 create mode 100644 Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Web/wwwroot/File/1628645021437792256 diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Identity/Dtos/Account/UpdateIconDto.cs b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Identity/Dtos/Account/UpdateIconDto.cs new file mode 100644 index 00000000..c0e0e2a3 --- /dev/null +++ b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Identity/Dtos/Account/UpdateIconDto.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Yi.RBAC.Application.Contracts.Identity.Dtos.Account +{ + public class UpdateIconDto + { + public string? Icon { get; set; } + } +} diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/ApplicationSwaggerDoc.xml b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/ApplicationSwaggerDoc.xml index 38916e3c..8ef4cb44 100644 --- a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/ApplicationSwaggerDoc.xml +++ b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/ApplicationSwaggerDoc.xml @@ -73,6 +73,13 @@ + + + 更新头像 + + + + Dept服务实现 diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/Identity/AccountService.cs b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/Identity/AccountService.cs index 399b23e5..8d08f302 100644 --- a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/Identity/AccountService.cs +++ b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application/Identity/AccountService.cs @@ -28,6 +28,7 @@ using Yi.RBAC.Domain.Identity.Repositories; using Yi.RBAC.Domain.Shared.Identity.ConstClasses; using Yi.RBAC.Domain.Shared.Identity.Dtos; using Yi.RBAC.Domain.Shared.Identity.Etos; +using System.Net.WebSockets; namespace Yi.RBAC.Application.Identity { @@ -188,5 +189,19 @@ namespace Yi.RBAC.Application.Identity await _accountManager.RestPasswordAsync(userId, input.Password); return true; } + + /// + /// 更新头像 + /// + /// + /// + public async Task UpdateIconAsync(UpdateIconDto input) + { + var entity = await _userRepository.GetByIdAsync(_currentUser.Id); + entity.Icon = input.Icon; + await _userRepository.UpdateAsync(entity); + + return true; + } } } diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Web/wwwroot/File/1628642335514562560 b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Web/wwwroot/File/1628642335514562560 new file mode 100644 index 0000000000000000000000000000000000000000..2d3f458dbae4fb829a59dfc0c49f70b099bd21d0 GIT binary patch literal 21934 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ⅈzr;gb*ns&gEL6RmP|h(h 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 WwxtcMUMwO>OEB*k_vu=+fB)Hf=3qVm literal 0 HcmV?d00001 diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Web/yi-sqlsugar-dev.db b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Web/yi-sqlsugar-dev.db index 578acc3bc08ef488c706cbfe11c49f571fea4f1c..7071674fe5260a1c78dcdac597c0a048f97b8e7f 100644 GIT binary patch delta 1060 zcmZp8z|ru4V}dke{X`jO#`=v3%k(*t8TgI)4s$1O<}(Q4R^@GsW0qv&U|YW8%=@@Fe& zK3zM(#MH#t(Ad<#z@e~EFF8M#fqC1Sx4$=Q+T37NX|zYO0B9@-V6#9NVu6vdv8kz{ ziK!XTe1plFHqy<9?Y1AbV|1J-!ol0dz<-^89e)ttH@;bXcD#>x+cpO(*v~)xfIbr&J4l591IP4b z?-}EGSU6=E_)K|nxGr(Z0FC3})NVFr;bSvo6c&_M)MsebGzOX}{pv)M0K>D{Tb@nZ z@MOoTC%bk%*}w2vJOu;TXM3Jj*@3`ex8z*5*EJ#CH*p!vw@QEUGXoXjB+e_r8zm%=lo^VQ8d&wHViSev@$fXGBDCJG&D0dwX^^lMS{E>?De<8tu|5R37Vb5$(|P|hDnUF!mUp)2{$ZTXyqRUe zIet-SRI%_dvoXSa#XS8vKa;EwJFgrA|1^FbzC(NwykB@bdF6od&B0rr$qJ_Zt{DEY(C(!fC1zz~QO41m!ALYZvHR!L5F0;Z~PoOYRJ!4qXsCegWdmgf2LP$VG_wEz delta 283 zcmZp8z|ru4V}dke`9v9K#`28`%k(*t82F9(4s$1M<}(Q4R%?uBmSp1)=9xnl{qShwZi>wqtahD8$bDh=Kn)|2qC4zHfZ9`0RKe zZ4Oj8!@K>_T}CCQ%`6X=^G{#>o-vYxi6@7F&y*(zD4W2uJ?9VO4Cd`D2N+-QPk+PD pB*DkZ`-Opj8ov(TA-)LSFF-|)c(;F%WfA}y;c$?D`cZu*YXC-eUN8Uv diff --git a/Yi.RuoYi.Vue3/src/api/file.js b/Yi.RuoYi.Vue3/src/api/file.js index 2dc681e9..d80d58e6 100644 --- a/Yi.RuoYi.Vue3/src/api/file.js +++ b/Yi.RuoYi.Vue3/src/api/file.js @@ -1,9 +1,9 @@ import request from '@/utils/request' export function - upload(type,data){ + upload(data){ return request({ - url: `/file/upload/${type}`, + url: `/file`, headers:{"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8"}, method: 'POST', data:data diff --git a/Yi.RuoYi.Vue3/src/api/system/user.js b/Yi.RuoYi.Vue3/src/api/system/user.js index d930f452..8302e52b 100644 --- a/Yi.RuoYi.Vue3/src/api/system/user.js +++ b/Yi.RuoYi.Vue3/src/api/system/user.js @@ -82,6 +82,15 @@ export function updateUserProfile(data) { data: data }) } +// 只修改用户头像 +export function updateUserIcon(data) { + return request({ + url: `/account/icon`, + method: 'put', + data:{icon:data} + }) +} + // 用户密码重置 export function updateUserPwd(oldPassword, newPassword) { diff --git a/Yi.RuoYi.Vue3/src/views/system/user/profile/userAvatar.vue b/Yi.RuoYi.Vue3/src/views/system/user/profile/userAvatar.vue index 7f1c4834..71b1a787 100644 --- a/Yi.RuoYi.Vue3/src/views/system/user/profile/userAvatar.vue +++ b/Yi.RuoYi.Vue3/src/views/system/user/profile/userAvatar.vue @@ -54,7 +54,7 @@ import "vue-cropper/dist/index.css"; import { VueCropper } from "vue-cropper"; import { upload } from "@/api/file"; -import { updateUserProfile } from "@/api/system/user"; +import { updateUserIcon } from "@/api/system/user"; import useUserStore from '@/store/modules/user' const userStore = useUserStore() @@ -116,14 +116,11 @@ function uploadImg() { proxy.$refs.cropper.getCropBlob(data => { let formData = new FormData(); formData.append("file", data); - upload("image",formData).then(response => { + upload(formData).then(response => { open.value = false; - options.img = import.meta.env.VITE_APP_BASE_API +"/file/"+response.data[0]; + options.img = import.meta.env.VITE_APP_BASE_API +"/file/"+response.data[0].id; userStore.avatar = options.img; - - - - updateUserProfile({icon:response.data[0]}).then(response2=>{ + updateUserIcon(response.data[0].id).then(response2=>{ proxy.$modal.msgSuccess("修改成功"); visible.value = false; }) From 05f5122c0b35e8485735f7322f63fa983da720e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=B7=B3?= Date: Thu, 23 Feb 2023 14:38:31 +0800 Subject: [PATCH 7/7] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=A4=B4=E5=83=8F?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=A6=86=E7=9B=96=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Identity/Dtos/User/ProfileUpdateInputVo.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Identity/Dtos/User/ProfileUpdateInputVo.cs b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Identity/Dtos/User/ProfileUpdateInputVo.cs index f5696f2a..8a3b77d4 100644 --- a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Identity/Dtos/User/ProfileUpdateInputVo.cs +++ b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Application.Contracts/Identity/Dtos/User/ProfileUpdateInputVo.cs @@ -12,7 +12,6 @@ namespace Yi.RBAC.Application.Contracts.Identity.Dtos.User { public string? Name { get; set; } public int? Age { get; set; } - public string? Icon { get; set; } public string? Nick { get; set; } public string? Email { get; set; } public string? Address { get; set; }