From 4f57b65451762c1eed4da3870ed86fd2bb0f09d0 Mon Sep 17 00:00:00 2001 From: owen Date: Sat, 19 Sep 2026 20:37:31 +0800 Subject: [PATCH] ow --- .../SecurityHelpFunctionRequest.auto.cs | 48 +- .../SecurityHelpFunctionService.auto.cs | 401 +++++++++++++- .../Data/SecurityHelpFeatureData.cs | 19 + .../Data/SecurityHelpFunctionData.cs | 2 + .../Data/SecurityHelpFunctionResultData.cs | 19 + .../Policy/SecurityPrefixPolicy.cs | 9 + .../ISecurityHelpFunctionService.auto.cs | 18 +- .../SecurityHelpFunctionController.auto.cs | 186 ++++++- .../security/operation-to-enquiry.ts | 3 + .../security/securityHelpFunctionService.ts | 104 +++- .../src/views/security/FunctionOperation.vue | 2 +- .../security/SecurityHelpFeatureEnquiry.vue | 323 +++++++++++ .../security/SecurityHelpFeatureOperation.vue | 412 ++++++++++++++ .../security/SecurityHelpFunctionEnquiry.vue | 301 ++++++++++ .../SecurityHelpFunctionOperation.vue | 515 ++++++++++++++++++ 15 files changed, 2338 insertions(+), 24 deletions(-) create mode 100644 CloudBuilder/CloudBuilder.Security/Data/SecurityHelpFeatureData.cs create mode 100644 CloudBuilder/CloudBuilder.Security/Data/SecurityHelpFunctionResultData.cs create mode 100644 WebVue/src/views/security/SecurityHelpFeatureEnquiry.vue create mode 100644 WebVue/src/views/security/SecurityHelpFeatureOperation.vue create mode 100644 WebVue/src/views/security/SecurityHelpFunctionEnquiry.vue create mode 100644 WebVue/src/views/security/SecurityHelpFunctionOperation.vue diff --git a/CloudBuilder/CloudBuilder.Request/Security/SecurityHelpFunctionRequest.auto.cs b/CloudBuilder/CloudBuilder.Request/Security/SecurityHelpFunctionRequest.auto.cs index 524b7ed..34dc5d8 100644 --- a/CloudBuilder/CloudBuilder.Request/Security/SecurityHelpFunctionRequest.auto.cs +++ b/CloudBuilder/CloudBuilder.Request/Security/SecurityHelpFunctionRequest.auto.cs @@ -27,26 +27,62 @@ public SecurityHelpFunctionRequest(IServiceRequest serviceRequest) this.serviceRequest = serviceRequest; } - public SecurityHelpFunctionEntity FindByKey(string key) + public SecurityHelpFunctionData FindByKey(string key) { -return Task.Run(() => serviceRequest.PostAsJsonAsync("/SecurityHelpFunction/FindByKey?key=" + key.ToString())).GetAwaiter().GetResult(); } +return Task.Run(() => serviceRequest.PostAsJsonAsync("/SecurityHelpFunction/FindByKey?key=" + key.ToString())).GetAwaiter().GetResult(); } public SecurityHelpFunctionData FindAll() { return Task.Run(() => serviceRequest.PostAsJsonAsync ("/SecurityHelpFunction/FindAll")).GetAwaiter().GetResult(); } - public SecurityHelpFunctionEntity Insert(SecurityHelpFunctionEntity data) + public SecurityHelpFunctionResultData FindBySearchCriteria(SecurityHelpFunctionSearchCriteria criteria) { -return Task.Run(() => serviceRequest.PostAsJsonAsync("/SecurityHelpFunction/Insert" , data)).GetAwaiter().GetResult(); } +return Task.Run(() => serviceRequest.PostAsJsonAsync("/SecurityHelpFunction/FindBySearchCriteria" , criteria)).GetAwaiter().GetResult(); } - public SecurityHelpFunctionEntity Update(SecurityHelpFunctionEntity data) + public SecurityHelpFunctionResultData FindFeatureBySearchCriteria(SecurityHelpFunctionSearchCriteria criteria) { -return Task.Run(() => serviceRequest.PostAsJsonAsync("/SecurityHelpFunction/Update" , data)).GetAwaiter().GetResult(); } +return Task.Run(() => serviceRequest.PostAsJsonAsync("/SecurityHelpFunction/FindFeatureBySearchCriteria" , criteria)).GetAwaiter().GetResult(); } + + public SecurityHelpFunctionData Insert(SecurityHelpFunctionData data) + { +return Task.Run(() => serviceRequest.PostAsJsonAsync("/SecurityHelpFunction/Insert" , data)).GetAwaiter().GetResult(); } + + public SecurityHelpFunctionData Update(SecurityHelpFunctionData data) + { +return Task.Run(() => serviceRequest.PostAsJsonAsync("/SecurityHelpFunction/Update" , data)).GetAwaiter().GetResult(); } public void Delete(string key) { Task.Run(() => serviceRequest.PostAsync("/SecurityHelpFunction/Delete?key=" + key.ToString())).GetAwaiter().GetResult(); } + public SecurityHelpFunctionData FindByFunctionName(string functionName) + { +return Task.Run(() => serviceRequest.PostAsJsonAsync("/SecurityHelpFunction/FindByFunctionName?functionName=" + functionName.ToString())).GetAwaiter().GetResult(); } + + public SecurityHelpFunctionData SaveFunction(SecurityHelpFunctionData data) + { +return Task.Run(() => serviceRequest.PostAsJsonAsync("/SecurityHelpFunction/SaveFunction" , data)).GetAwaiter().GetResult(); } + + public void DeleteByFunctionName(string functionName) + { + Task.Run(() => serviceRequest.PostAsync("/SecurityHelpFunction/DeleteByFunctionName?functionName=" + functionName.ToString())).GetAwaiter().GetResult(); } + + public SecurityHelpFeatureData FindByGroupCode(string groupCode) + { +return Task.Run(() => serviceRequest.PostAsJsonAsync("/SecurityHelpFunction/FindByGroupCode?groupCode=" + groupCode.ToString())).GetAwaiter().GetResult(); } + + public SecurityHelpFeatureData SaveFeatureGroup(SecurityHelpFeatureData data) + { +return Task.Run(() => serviceRequest.PostAsJsonAsync("/SecurityHelpFunction/SaveFeatureGroup" , data)).GetAwaiter().GetResult(); } + + public void DeleteByGroupCode(string groupCode) + { + Task.Run(() => serviceRequest.PostAsync("/SecurityHelpFunction/DeleteByGroupCode?groupCode=" + groupCode.ToString())).GetAwaiter().GetResult(); } + + public SecurityFunctionDisplayData[] FindFunctionNameOptions() + { +return Task.Run(() => serviceRequest.PostAsJsonAsync ("/SecurityHelpFunction/FindFunctionNameOptions")).GetAwaiter().GetResult(); } + } } \ No newline at end of file diff --git a/CloudBuilder/CloudBuilder.Security.Service/SecurityHelpFunctionService.auto.cs b/CloudBuilder/CloudBuilder.Security.Service/SecurityHelpFunctionService.auto.cs index 7c12747..a09724f 100644 --- a/CloudBuilder/CloudBuilder.Security.Service/SecurityHelpFunctionService.auto.cs +++ b/CloudBuilder/CloudBuilder.Security.Service/SecurityHelpFunctionService.auto.cs @@ -1,11 +1,15 @@ using CloudBuilder.Core.DatabaseAccessor; using CloudBuilder.Core.DatabaseAccessor.Entity; +using CloudBuilder.Core.Extensions; +using CloudBuilder.Core.Service; using CloudBuilder.Security.Data; using CloudBuilder.Security.Entity; using CloudBuilder.Security.Policy; using CloudBuilder.Security.SearchCriteria; +using CloudBuilder.Security.Utility; using Microsoft.AspNetCore.Authorization; +using Microsoft.Extensions.DependencyInjection; namespace CloudBuilder.Security.Service { public class SecurityHelpFunctionService : ISecurityHelpFunctionService @@ -20,10 +24,12 @@ namespace CloudBuilder.Security.Service } [PermissionOperate(name: SecurityPermissionPolicy.SecurityHelpFunction, operate: Operate.Find)] - public SecurityHelpFunctionEntity FindByKey(string key) + public SecurityHelpFunctionData FindByKey(string key) { - return repository.DetachedEntities.Where(x => x.HelpFunctionId == key).FirstOrDefault()!; + return FindByFunctionName(key); } + + [AllowAnonymous] public SecurityHelpFunctionData FindAll() { @@ -42,10 +48,103 @@ namespace CloudBuilder.Security.Service return data; } - //[PermissionOperate(name: SecurityPermissionPolicy.SecurityHelpFunction, operate: Operate.Find)] - public dynamic FindBySearchCriteria(SecurityHelpFunctionSearchCriteria criteria) + [PermissionOperate(name: SecurityPermissionPolicy.SecurityHelpFunction, operate: Operate.Find)] + public SecurityHelpFunctionResultData FindBySearchCriteria(SecurityHelpFunctionSearchCriteria criteria) { - throw new NotImplementedException(); + SecurityHelpFunctionResultData data = new SecurityHelpFunctionResultData(); + SecurityHelpFunctionEntity[] list = null; + + Int64 count = 0; + + string sqlWhere = null; + + if (criteria.Filter != null && criteria.Filter.Length > 0) + { + sqlWhere = SearchFilter.ComposeWhereClause(criteria.Filter); + } + + SecurityHelpFunctionEntity entity = SecurityHelpFunctionEntity.GetInstance(repository.GetDbContext().Database.ProviderName); + string sql = entity.GetSelectTopFrom(criteria.limit, criteria.page, criteria.orderby.StringToDbField(), criteria.orderbytag, sqlWhere); + + string err = null; + try + { + list = repository.FromSql(sql).ToArray(); + } + catch (System.Exception ex) + { + err = ex.Message; + } + + if (list != null && list.Length > 0) + { + sql = entity.GetSelectCountFrom(sqlWhere); + count = Convert.ToInt64(repository.ExecuteScalar(sql)); + + data.Datas = list; + } + else + { + data.Datas = null; + } + + data.Limit = criteria.limit; + data.Page = criteria.page; + + data.Total = count; + data.ErrorMessage = err; + return data; + } + + [PermissionOperate(name: SecurityPermissionPolicy.SecurityHelpFunction, operate: Operate.Find)] + public SecurityHelpFunctionResultData FindFeatureBySearchCriteria(SecurityHelpFunctionSearchCriteria criteria) + { + SecurityHelpFunctionResultData data = new SecurityHelpFunctionResultData(); + + IRepository repositoryFeature = repository.GetRepository>(); + + SecurityHelpFeatureEntity[] list = null; + + Int64 count = 0; + + string sqlWhere = null; + + if (criteria.Filter != null && criteria.Filter.Length > 0) + { + sqlWhere = SearchFilter.ComposeWhereClause(criteria.Filter); + } + + SecurityHelpFeatureEntity entity = SecurityHelpFeatureEntity.GetInstance(repositoryFeature.GetDbContext().Database.ProviderName); + string sql = entity.GetSelectTopFrom(criteria.limit, criteria.page, criteria.orderby.StringToDbField(), criteria.orderbytag, sqlWhere); + + string err = null; + try + { + list = repositoryFeature.FromSql(sql).ToArray(); + } + catch (System.Exception ex) + { + err = ex.Message; + } + + if (list != null && list.Length > 0) + { + sql = entity.GetSelectCountFrom(sqlWhere); + count = Convert.ToInt64(repositoryFeature.ExecuteScalar(sql)); + + data.Features = list; + } + else + { + data.Features = null; + } + + data.Limit = criteria.limit; + data.Page = criteria.page; + + data.Total = count; + data.ErrorMessage = err; + return data; } //[PermissionOperate(name: SecurityPermissionPolicy.SecurityHelpFunction, operate: Operate.Print)] @@ -56,14 +155,14 @@ namespace CloudBuilder.Security.Service [PermissionOperate(name: SecurityPermissionPolicy.SecurityHelpFunction, operate: Operate.Insert)] [UnitOfWork] - public SecurityHelpFunctionEntity Insert(SecurityHelpFunctionEntity data) + public SecurityHelpFunctionData Insert(SecurityHelpFunctionData data) { throw new NotImplementedException(); } [PermissionOperate(name: SecurityPermissionPolicy.SecurityHelpFunction, operate: Operate.Update)] [UnitOfWork] - public SecurityHelpFunctionEntity Update(SecurityHelpFunctionEntity data) + public SecurityHelpFunctionData Update(SecurityHelpFunctionData data) { throw new NotImplementedException(); } @@ -74,7 +173,293 @@ namespace CloudBuilder.Security.Service public void Delete(string key) { var ent = repository.DetachedEntities.Where(x => x.HelpFunctionId == key).FirstOrDefault()!; - if (ent != null) { repository.DeleteNow(ent); } + if (ent == null) { throw new ValidatedException("记录不存在."); } + + repository.DeleteNow(ent); + + // 一并清掉关联明细,避免留下孤儿记录 + DeleteSteps(ent.HelpFunctionId); + DeleteFunctionFeatures(ent.FunctionName); + } + + //==================== 帮助文档维护:主表 + 步骤 + 引用的组 ==================== + + [PermissionOperate(name: SecurityPermissionPolicy.SecurityHelpFunction, operate: Operate.Find)] + public SecurityHelpFunctionData FindByFunctionName(string functionName) + { + SecurityHelpFunctionData data = new SecurityHelpFunctionData(); + if (string.IsNullOrEmpty(functionName)) return data; + + SecurityHelpFunctionEntity function = repository.DetachedEntities.Where(x => x.FunctionName == functionName).FirstOrDefault(); + if (function == null) return data; + + data.SecurityHelpFunction = function; + + data.SecurityHelpSteps = repository.GetRepository>() + .DetachedEntities.Where(x => x.HelpFunctionId == function.HelpFunctionId) + .OrderBy(x => x.StepNo).ToArray(); + + data.SecurityHelpFunctionFeatures = repository.GetRepository>() + .DetachedEntities.Where(x => x.FunctionName == functionName) + .OrderBy(x => x.SortNo).ToArray(); + + return data; + } + + [PermissionOperate(name: SecurityPermissionPolicy.SecurityHelpFunction, operate: Operate.Update)] + [UnitOfWork] + public SecurityHelpFunctionData SaveFunction(SecurityHelpFunctionData data) + { + if (data == null || data.SecurityHelpFunction == null) throw new ValidatedException("没有要保存的内容."); + + SecurityHelpFunctionEntity function = data.SecurityHelpFunction; + + ValidateHelper.Validate(service, function, SecurityHelpFunctionEntity.DB_NAME_SECURITY_HELP_FUNCTION); + + SecurityHelpFunctionEntity exist = repository.DetachedEntities.Where(x => x.FunctionName == function.FunctionName).FirstOrDefault(); + + if (exist == null) + { + if (string.IsNullOrEmpty(function.HelpFunctionId)) + { + function.HelpFunctionId = NewId(SecurityPrefixPolicy.SECURITY_HELP_FUNCTION_ID); + } + repository.InsertNow(function); + } + else + { + ObjectCopyHelper.Copy(function, exist); + repository.UpdateNow(exist); + function = exist; + } + + SaveSteps(function.HelpFunctionId, data.SecurityHelpSteps); + SaveFunctionFeatures(function.FunctionName, data.SecurityHelpFunctionFeatures); + + return FindByFunctionName(function.FunctionName); + } + + [PermissionOperate(name: SecurityPermissionPolicy.SecurityHelpFunction, operate: Operate.Delete)] + [UnitOfWork] + public void DeleteByFunctionName(string functionName) + { + SecurityHelpFunctionEntity function = repository.DetachedEntities.Where(x => x.FunctionName == functionName).FirstOrDefault(); + if (function == null) throw new ValidatedException("记录不存在."); + + repository.DeleteNow(function); + + DeleteSteps(function.HelpFunctionId); + DeleteFunctionFeatures(function.FunctionName); + } + + //==================== 功能点组维护:组 + 组内功能点 ==================== + + [PermissionOperate(name: SecurityPermissionPolicy.SecurityHelpFunction, operate: Operate.Find)] + public SecurityHelpFeatureData FindByGroupCode(string groupCode) + { + SecurityHelpFeatureData data = new SecurityHelpFeatureData(); + if (string.IsNullOrEmpty(groupCode)) return data; + + IRepository repositoryGroup = repository.GetRepository>(); + + SecurityHelpFeatureGroupEntity group = repositoryGroup.DetachedEntities.Where(x => x.GroupCode == groupCode).FirstOrDefault(); + if (group == null) return data; + + data.SecurityHelpFeatureGroup = group; + + data.SecurityHelpFeatures = repository.GetRepository>() + .DetachedEntities.Where(x => x.HelpFeatureGroupId == group.HelpFeatureGroupId) + .OrderBy(x => x.SortNo).ToArray(); + + return data; + } + + [PermissionOperate(name: SecurityPermissionPolicy.SecurityHelpFunction, operate: Operate.Update)] + [UnitOfWork] + public SecurityHelpFeatureData SaveFeatureGroup(SecurityHelpFeatureData data) + { + if (data == null || data.SecurityHelpFeatureGroup == null) throw new ValidatedException("没有要保存的内容."); + + IRepository repositoryGroup = repository.GetRepository>(); + + SecurityHelpFeatureGroupEntity group = data.SecurityHelpFeatureGroup; + + SecurityHelpFeatureGroupEntity exist = repositoryGroup.DetachedEntities.Where(x => x.GroupCode == group.GroupCode).FirstOrDefault(); + + if (exist == null) + { + if (string.IsNullOrEmpty(group.HelpFeatureGroupId)) + { + group.HelpFeatureGroupId = NewId(SecurityPrefixPolicy.SECURITY_HELP_FEATURE_GROUP_ID); + } + repositoryGroup.InsertNow(group); + } + else + { + ObjectCopyHelper.Copy(group, exist); + repositoryGroup.UpdateNow(exist); + group = exist; + } + + SaveFeatures(group.HelpFeatureGroupId, data.SecurityHelpFeatures); + + return FindByGroupCode(group.GroupCode); + } + + [PermissionOperate(name: SecurityPermissionPolicy.SecurityHelpFunction, operate: Operate.Delete)] + [UnitOfWork] + public void DeleteByGroupCode(string groupCode) + { + IRepository repositoryGroup = repository.GetRepository>(); + + SecurityHelpFeatureGroupEntity group = repositoryGroup.DetachedEntities.Where(x => x.GroupCode == groupCode).FirstOrDefault(); + if (group == null) throw new ValidatedException("记录不存在."); + + repositoryGroup.DeleteNow(group); + + DeleteFeatures(group.HelpFeatureGroupId); + } + + //==================== 下拉选项 ==================== + + [AllowAnonymous] + public SecurityFunctionDisplayData[] FindFunctionNameOptions() + { + return service.ServiceProvider.GetService()!.FindMenus(); + } + + //==================== 私有辅助 ==================== + + /// + /// 生成主键,走统一的流水号服务 + /// + private string NewId(string subsystemId) + { + ISecurityGeneratorNumberService generatorNumberService = service.ServiceProvider.GetService()!; + + return generatorNumberService.GetNo( + SecurityPrefixPolicy.SECURITY_HELP, + subsystemId, + null, + YesNoPolicy.NO, + SecurityPrefixPolicy.SECURITY_HELP_FORMAT); + } + + /// + /// 步骤整存:先清旧再插新,StepNo 按传入顺序重排 + /// + private void SaveSteps(string helpFunctionId, SecurityHelpStepEntity[]? steps) + { + IRepository repositoryStep = repository.GetRepository>(); + + SecurityHelpStepEntity[] olds = repositoryStep.Entities.Where(x => x.HelpFunctionId == helpFunctionId).ToArray(); + if (olds != null && olds.Length > 0) + { + foreach (SecurityHelpStepEntity old in olds) repositoryStep.DeleteNow(old); + } + + if (steps == null || steps.Length == 0) return; + + int i = 1; + foreach (SecurityHelpStepEntity step in steps.OrderBy(x => x.StepNo).ToArray()) + { + if (string.IsNullOrEmpty(step.HelpStepId)) + { + step.HelpStepId = NewId(SecurityPrefixPolicy.SECURITY_HELP_STEP_ID); + } + step.HelpFunctionId = helpFunctionId; + step.StepNo = i++; + + repositoryStep.InsertNow(step); + } + } + + /// + /// 组合关系整存:先清旧再插新,SortNo 按传入顺序重排 + /// + private void SaveFunctionFeatures(string functionName, SecurityHelpFunctionFeatureEntity[]? functionFeatures) + { + IRepository repositoryFunctionFeature = repository.GetRepository>(); + + SecurityHelpFunctionFeatureEntity[] olds = repositoryFunctionFeature.Entities.Where(x => x.FunctionName == functionName).ToArray(); + if (olds != null && olds.Length > 0) + { + foreach (SecurityHelpFunctionFeatureEntity old in olds) repositoryFunctionFeature.DeleteNow(old); + } + + if (functionFeatures == null || functionFeatures.Length == 0) return; + + int i = 1; + foreach (SecurityHelpFunctionFeatureEntity functionFeature in functionFeatures.OrderBy(x => x.SortNo).ToArray()) + { + if (string.IsNullOrEmpty(functionFeature.HelpFunctionFeatureId)) + { + functionFeature.HelpFunctionFeatureId = NewId(SecurityPrefixPolicy.SECURITY_HELP_FUNCTION_FEATURE_ID); + } + functionFeature.FunctionName = functionName; + functionFeature.SortNo = i++; + + repositoryFunctionFeature.InsertNow(functionFeature); + } + } + + /// + /// 组内功能点整存:先清旧再插新,SortNo 按传入顺序重排 + /// + private void SaveFeatures(string helpFeatureGroupId, SecurityHelpFeatureEntity[]? features) + { + IRepository repositoryFeature = repository.GetRepository>(); + + SecurityHelpFeatureEntity[] olds = repositoryFeature.Entities.Where(x => x.HelpFeatureGroupId == helpFeatureGroupId).ToArray(); + if (olds != null && olds.Length > 0) + { + foreach (SecurityHelpFeatureEntity old in olds) repositoryFeature.DeleteNow(old); + } + + if (features == null || features.Length == 0) return; + + int i = 1; + foreach (SecurityHelpFeatureEntity feature in features.OrderBy(x => x.SortNo).ToArray()) + { + if (string.IsNullOrEmpty(feature.HelpFeatureId)) + { + feature.HelpFeatureId = NewId(SecurityPrefixPolicy.SECURITY_HELP_FEATURE_ID); + } + feature.HelpFeatureGroupId = helpFeatureGroupId; + feature.SortNo = i++; + + repositoryFeature.InsertNow(feature); + } + } + + private void DeleteSteps(string helpFunctionId) + { + IRepository repositoryStep = repository.GetRepository>(); + + SecurityHelpStepEntity[] olds = repositoryStep.Entities.Where(x => x.HelpFunctionId == helpFunctionId).ToArray(); + if (olds == null || olds.Length == 0) return; + + foreach (SecurityHelpStepEntity old in olds) repositoryStep.DeleteNow(old); + } + + private void DeleteFunctionFeatures(string functionName) + { + IRepository repositoryFunctionFeature = repository.GetRepository>(); + + SecurityHelpFunctionFeatureEntity[] olds = repositoryFunctionFeature.Entities.Where(x => x.FunctionName == functionName).ToArray(); + if (olds == null || olds.Length == 0) return; + + foreach (SecurityHelpFunctionFeatureEntity old in olds) repositoryFunctionFeature.DeleteNow(old); + } + + private void DeleteFeatures(string helpFeatureGroupId) + { + IRepository repositoryFeature = repository.GetRepository>(); + + SecurityHelpFeatureEntity[] olds = repositoryFeature.Entities.Where(x => x.HelpFeatureGroupId == helpFeatureGroupId).ToArray(); + if (olds == null || olds.Length == 0) return; + + foreach (SecurityHelpFeatureEntity old in olds) repositoryFeature.DeleteNow(old); } } } diff --git a/CloudBuilder/CloudBuilder.Security/Data/SecurityHelpFeatureData.cs b/CloudBuilder/CloudBuilder.Security/Data/SecurityHelpFeatureData.cs new file mode 100644 index 0000000..8c544ab --- /dev/null +++ b/CloudBuilder/CloudBuilder.Security/Data/SecurityHelpFeatureData.cs @@ -0,0 +1,19 @@ +using CloudBuilder.Core.Authorization; +using CloudBuilder.Security.Entity; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CloudBuilder.Security.Data +{ + + [TypeScript] + public class SecurityHelpFeatureData + { + public SecurityHelpFeatureGroupEntity? SecurityHelpFeatureGroup { get; set; } + + public SecurityHelpFeatureEntity[]? SecurityHelpFeatures { get; set; } + } +} diff --git a/CloudBuilder/CloudBuilder.Security/Data/SecurityHelpFunctionData.cs b/CloudBuilder/CloudBuilder.Security/Data/SecurityHelpFunctionData.cs index 1d347a8..027295d 100644 --- a/CloudBuilder/CloudBuilder.Security/Data/SecurityHelpFunctionData.cs +++ b/CloudBuilder/CloudBuilder.Security/Data/SecurityHelpFunctionData.cs @@ -12,6 +12,8 @@ namespace CloudBuilder.Security.Data [TypeScript] public class SecurityHelpFunctionData { + public SecurityHelpFunctionEntity? SecurityHelpFunction { get; set; } + public SecurityHelpFeatureEntity[]? SecurityHelpFeatures { get; set; } public SecurityHelpFeatureGroupEntity[]? SecurityHelpFeatureGroups { get; set; } diff --git a/CloudBuilder/CloudBuilder.Security/Data/SecurityHelpFunctionResultData.cs b/CloudBuilder/CloudBuilder.Security/Data/SecurityHelpFunctionResultData.cs new file mode 100644 index 0000000..a7fbd6f --- /dev/null +++ b/CloudBuilder/CloudBuilder.Security/Data/SecurityHelpFunctionResultData.cs @@ -0,0 +1,19 @@ +using CloudBuilder.Core.Authorization; +using CloudBuilder.Core.Service; +using CloudBuilder.Security.Entity; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CloudBuilder.Security.Data +{ + [TypeScript] + public class SecurityHelpFunctionResultData : SearchCriteriaResultData + { + public SecurityHelpFunctionEntity[] Datas { get; set; } = null!; + + public SecurityHelpFeatureEntity[] Features { get; set; } = null!; + } +} diff --git a/CloudBuilder/CloudBuilder.Security/Policy/SecurityPrefixPolicy.cs b/CloudBuilder/CloudBuilder.Security/Policy/SecurityPrefixPolicy.cs index 14249c8..6f1712c 100644 --- a/CloudBuilder/CloudBuilder.Security/Policy/SecurityPrefixPolicy.cs +++ b/CloudBuilder/CloudBuilder.Security/Policy/SecurityPrefixPolicy.cs @@ -12,5 +12,14 @@ namespace CloudBuilder.Security.Policy public const string SECURITY_USER_USER_NAME = "USER_NAME"; public const string SECURITY_USER_FORMAT = "000000"; + // 帮助文档相关:用于 SecurityGeneratorNumberService 生成各表主键 + public const string SECURITY_HELP = "SECURITY_HELP"; + public const string SECURITY_HELP_FUNCTION_ID = "HELP_FUNCTION_ID"; + public const string SECURITY_HELP_STEP_ID = "HELP_STEP_ID"; + public const string SECURITY_HELP_FEATURE_GROUP_ID = "HELP_FEATURE_GROUP_ID"; + public const string SECURITY_HELP_FEATURE_ID = "HELP_FEATURE_ID"; + public const string SECURITY_HELP_FUNCTION_FEATURE_ID = "HELP_FUNCTION_FEATURE_ID"; + public const string SECURITY_HELP_FORMAT = "000000"; + } } diff --git a/CloudBuilder/CloudBuilder.Security/Service/ISecurityHelpFunctionService.auto.cs b/CloudBuilder/CloudBuilder.Security/Service/ISecurityHelpFunctionService.auto.cs index fb0ec2a..383ffd5 100644 --- a/CloudBuilder/CloudBuilder.Security/Service/ISecurityHelpFunctionService.auto.cs +++ b/CloudBuilder/CloudBuilder.Security/Service/ISecurityHelpFunctionService.auto.cs @@ -7,8 +7,24 @@ using CloudBuilder.Security.SearchCriteria; namespace CloudBuilder.Security.Service { - public interface ISecurityHelpFunctionService :IServiceBase + public interface ISecurityHelpFunctionService :IServiceBase { SecurityHelpFunctionData FindAll(); + SecurityHelpFunctionResultData FindBySearchCriteria(SecurityHelpFunctionSearchCriteria tc); + + SecurityHelpFunctionResultData FindFeatureBySearchCriteria(SecurityHelpFunctionSearchCriteria tc); + + // 帮助文档维护:主表 + 步骤 + 引用的功能点组 + SecurityHelpFunctionData FindByFunctionName(string functionName); + SecurityHelpFunctionData SaveFunction(SecurityHelpFunctionData data); + void DeleteByFunctionName(string functionName); + + // 功能点组维护:组 + 组内功能点 + SecurityHelpFeatureData FindByGroupCode(string groupCode); + SecurityHelpFeatureData SaveFeatureGroup(SecurityHelpFeatureData data); + void DeleteByGroupCode(string groupCode); + + // 新增帮助文档时,下拉选择「给哪个功能写帮助」 + SecurityFunctionDisplayData[] FindFunctionNameOptions(); } } diff --git a/CloudBuilder/CloudBuilder.Web.Entry/Controllers/Security/SecurityHelpFunctionController.auto.cs b/CloudBuilder/CloudBuilder.Web.Entry/Controllers/Security/SecurityHelpFunctionController.auto.cs index 93f6f14..fc25230 100644 --- a/CloudBuilder/CloudBuilder.Web.Entry/Controllers/Security/SecurityHelpFunctionController.auto.cs +++ b/CloudBuilder/CloudBuilder.Web.Entry/Controllers/Security/SecurityHelpFunctionController.auto.cs @@ -71,12 +71,52 @@ this.securityHelpFunctionService= securityHelpFunctionService; { return new ServiceErrorException(ex); } + } + + [PermissionOperate(name: "SecurityHelpFunction", operate: "Find")] + [HttpPost] + public dynamic FindBySearchCriteria(SecurityHelpFunctionSearchCriteria criteria) + { + try + { + + var result = securityHelpFunctionService.FindBySearchCriteria(criteria); + return result; + } + catch (ValidatedException vex) + { + return vex; + } + catch (Exception ex) + { + return new ServiceErrorException(ex); + } + } + + [PermissionOperate(name: "SecurityHelpFunction", operate: "Find")] + [HttpPost] + public dynamic FindFeatureBySearchCriteria(SecurityHelpFunctionSearchCriteria criteria) + { + try + { + + var result = securityHelpFunctionService.FindFeatureBySearchCriteria(criteria); + return result; + } + catch (ValidatedException vex) + { + return vex; + } + catch (Exception ex) + { + return new ServiceErrorException(ex); + } } [PermissionOperate(name: "SecurityHelpFunction", operate: "Insert")] [HttpPost] [UnitOfWork] - public dynamic Insert(SecurityHelpFunctionEntity data) + public dynamic Insert(SecurityHelpFunctionData data) { try { @@ -97,7 +137,7 @@ this.securityHelpFunctionService= securityHelpFunctionService; [PermissionOperate(name: "SecurityHelpFunction", operate: "Update")] [HttpPost] [UnitOfWork] - public dynamic Update(SecurityHelpFunctionEntity data) + public dynamic Update(SecurityHelpFunctionData data) { try { @@ -135,6 +175,148 @@ this.securityHelpFunctionService= securityHelpFunctionService; } } + [PermissionOperate(name: "SecurityHelpFunction", operate: "Find")] + [HttpPost] + public dynamic FindByFunctionName(string functionName) + { + try + { + + var result = securityHelpFunctionService.FindByFunctionName(functionName); + return result; + } + catch (ValidatedException vex) + { + return vex; + } + catch (Exception ex) + { + return new ServiceErrorException(ex); + } + } + + [PermissionOperate(name: "SecurityHelpFunction", operate: "Update")] + [HttpPost] + [UnitOfWork] + public dynamic SaveFunction(SecurityHelpFunctionData data) + { + try + { + + var result = securityHelpFunctionService.SaveFunction(data); + return result; + } + catch (ValidatedException vex) + { + return vex; + } + catch (Exception ex) + { + return new ServiceErrorException(ex); + } + } + + [PermissionOperate(name: "SecurityHelpFunction", operate: "Delete")] + [HttpPost] + [UnitOfWork] + public dynamic DeleteByFunctionName(string functionName){ + try + { + securityHelpFunctionService.DeleteByFunctionName(functionName); + + return string.Empty; + } + catch (ValidatedException vex) + { + return vex; + } + catch (Exception ex) + { + return new ServiceErrorException(ex); + } + } + + [PermissionOperate(name: "SecurityHelpFunction", operate: "Find")] + [HttpPost] + public dynamic FindByGroupCode(string groupCode) + { + try + { + + var result = securityHelpFunctionService.FindByGroupCode(groupCode); + return result; + } + catch (ValidatedException vex) + { + return vex; + } + catch (Exception ex) + { + return new ServiceErrorException(ex); + } + } + + [PermissionOperate(name: "SecurityHelpFunction", operate: "Update")] + [HttpPost] + [UnitOfWork] + public dynamic SaveFeatureGroup(SecurityHelpFeatureData data) + { + try + { + + var result = securityHelpFunctionService.SaveFeatureGroup(data); + return result; + } + catch (ValidatedException vex) + { + return vex; + } + catch (Exception ex) + { + return new ServiceErrorException(ex); + } + } + + [PermissionOperate(name: "SecurityHelpFunction", operate: "Delete")] + [HttpPost] + [UnitOfWork] + public dynamic DeleteByGroupCode(string groupCode){ + try + { + securityHelpFunctionService.DeleteByGroupCode(groupCode); + + return string.Empty; + } + catch (ValidatedException vex) + { + return vex; + } + catch (Exception ex) + { + return new ServiceErrorException(ex); + } + } + + [AllowAnonymous] + [HttpPost] + public dynamic FindFunctionNameOptions() + { + try + { + + var result = securityHelpFunctionService.FindFunctionNameOptions(); + return result; + } + catch (ValidatedException vex) + { + return vex; + } + catch (Exception ex) + { + return new ServiceErrorException(ex); + } + } + } } \ No newline at end of file diff --git a/WebVue/src/injections/security/operation-to-enquiry.ts b/WebVue/src/injections/security/operation-to-enquiry.ts index 399137f..98fc4aa 100644 --- a/WebVue/src/injections/security/operation-to-enquiry.ts +++ b/WebVue/src/injections/security/operation-to-enquiry.ts @@ -14,6 +14,7 @@ export class OperationToEnquiryModelOption { public isModalPhoto?: boolean = false; public isModalVideo?: boolean = false; public isModalAudio?: boolean = false; + public isModalHelpFunction?: boolean = false; //帮助功能查询 public initBindOptionsUser?: BindOption[] = []; //初始化查询条件的值 public initBindOptionsGroup?: BindOption[] = []; public initBindOptionsActor?: BindOption[] = []; @@ -23,6 +24,7 @@ export class OperationToEnquiryModelOption { public initBindOptionsFunction?: BindOption[] = []; public initBindOptionsTree?: BindOption[] = []; public initBindOptionsPerson?: BindOption[] = []; + public initBindOptionsHelpFunction?: BindOption[] = []; public selectionTypeGroup?: string = "radio"; //记录单选还是多选 public selectionTypeUser?: string = "radio"; public selectionTypeActor?: string = "radio"; @@ -32,6 +34,7 @@ export class OperationToEnquiryModelOption { public selectionTypeFunction?: string = "radio"; public selectionTypeTree?: string = "radio"; public selectionTypePerson?: string = "radio"; + public selectionTypeHelpFunction?: string = "radio"; } //子组件调用父组件的方法================== diff --git a/WebVue/src/service/security/securityHelpFunctionService.ts b/WebVue/src/service/security/securityHelpFunctionService.ts index 15306c8..9ee802e 100644 --- a/WebVue/src/service/security/securityHelpFunctionService.ts +++ b/WebVue/src/service/security/securityHelpFunctionService.ts @@ -1,12 +1,15 @@ import { request } from "@/utils/request"; - import type { SecurityHelpFunctionEntity } from "@/data/auto/securityHelpFunctionEntity"; import type { SecurityHelpFunctionData } from "@/data/auto/securityHelpFunctionData"; + import type { SecurityHelpFunctionSearchCriteria } from "@/data/auto/securityHelpFunctionSearchCriteria"; + import type { SecurityHelpFunctionResultData } from "@/data/auto/securityHelpFunctionResultData"; + import type { SecurityHelpFeatureData } from "@/data/auto/securityHelpFeatureData"; + import type { SecurityFunctionDisplayData } from "@/data/auto/securityFunctionDisplayData"; class SecurityHelpFunctionService{ async FindByKey(data: string) { - return request( + return request( { url: "/SecurityHelpFunction/FindByKey?key="+data, method: "post", @@ -24,8 +27,28 @@ class SecurityHelpFunctionService{ ) }; - async Insert(data: SecurityHelpFunctionEntity) { - return request( + async FindBySearchCriteria(data: SecurityHelpFunctionSearchCriteria) { + return request( + { + url: "/SecurityHelpFunction/FindBySearchCriteria", + method: "post", + data, + } + ) + }; + + async FindFeatureBySearchCriteria(data: SecurityHelpFunctionSearchCriteria) { + return request( + { + url: "/SecurityHelpFunction/FindFeatureBySearchCriteria", + method: "post", + data, + } + ) + }; + + async Insert(data: SecurityHelpFunctionData) { + return request( { url: "/SecurityHelpFunction/Insert", method: "post", @@ -34,8 +57,8 @@ class SecurityHelpFunctionService{ ) }; - async Update(data: SecurityHelpFunctionEntity) { - return request( + async Update(data: SecurityHelpFunctionData) { + return request( { url: "/SecurityHelpFunction/Update", method: "post", @@ -54,6 +77,75 @@ class SecurityHelpFunctionService{ ) }; + async FindByFunctionName(data: string) { + return request( + { + url: "/SecurityHelpFunction/FindByFunctionName?functionName="+data, + method: "post", + data, + } + ) + }; + + async SaveFunction(data: SecurityHelpFunctionData) { + return request( + { + url: "/SecurityHelpFunction/SaveFunction", + method: "post", + data, + } + ) + }; + + async DeleteByFunctionName(data: string) { + return request( + { + url: "/SecurityHelpFunction/DeleteByFunctionName?functionName="+data, + method: "post", + data, + } + ) + }; + + async FindByGroupCode(data: string) { + return request( + { + url: "/SecurityHelpFunction/FindByGroupCode?groupCode="+data, + method: "post", + data, + } + ) + }; + + async SaveFeatureGroup(data: SecurityHelpFeatureData) { + return request( + { + url: "/SecurityHelpFunction/SaveFeatureGroup", + method: "post", + data, + } + ) + }; + + async DeleteByGroupCode(data: string) { + return request( + { + url: "/SecurityHelpFunction/DeleteByGroupCode?groupCode="+data, + method: "post", + data, + } + ) + }; + + async FindFunctionNameOptions() { + return request( + { + url: "/SecurityHelpFunction/FindFunctionNameOptions", + method: "post", + } + ) + }; + } const securityHelpFunctionService= new SecurityHelpFunctionService(); diff --git a/WebVue/src/views/security/FunctionOperation.vue b/WebVue/src/views/security/FunctionOperation.vue index bdacad6..930096c 100644 --- a/WebVue/src/views/security/FunctionOperation.vue +++ b/WebVue/src/views/security/FunctionOperation.vue @@ -53,7 +53,7 @@
功能名称*
diff --git a/WebVue/src/views/security/SecurityHelpFeatureEnquiry.vue b/WebVue/src/views/security/SecurityHelpFeatureEnquiry.vue new file mode 100644 index 0000000..b63594b --- /dev/null +++ b/WebVue/src/views/security/SecurityHelpFeatureEnquiry.vue @@ -0,0 +1,323 @@ + + diff --git a/WebVue/src/views/security/SecurityHelpFeatureOperation.vue b/WebVue/src/views/security/SecurityHelpFeatureOperation.vue new file mode 100644 index 0000000..68e7728 --- /dev/null +++ b/WebVue/src/views/security/SecurityHelpFeatureOperation.vue @@ -0,0 +1,412 @@ + + diff --git a/WebVue/src/views/security/SecurityHelpFunctionEnquiry.vue b/WebVue/src/views/security/SecurityHelpFunctionEnquiry.vue new file mode 100644 index 0000000..d6d8d96 --- /dev/null +++ b/WebVue/src/views/security/SecurityHelpFunctionEnquiry.vue @@ -0,0 +1,301 @@ + + diff --git a/WebVue/src/views/security/SecurityHelpFunctionOperation.vue b/WebVue/src/views/security/SecurityHelpFunctionOperation.vue new file mode 100644 index 0000000..058ac38 --- /dev/null +++ b/WebVue/src/views/security/SecurityHelpFunctionOperation.vue @@ -0,0 +1,515 @@ + +