diff --git a/config/application-local.yml b/config/application-local.yml index d66f3ea..8de3de0 100644 --- a/config/application-local.yml +++ b/config/application-local.yml @@ -24,9 +24,13 @@ spring : add-mappings: false jackson : - date-format: yyyy-MM-dd HH:mm:ss.SSS - timezone: GMT+8 + date-format : yyyy-MM-dd HH:mm:ss.SSS + timezone : GMT+8 default-property-inclusion: non_null + mapper : + default-view-inclusion: true + deserialization : + fail-on-unknown-properties: false datasource: #url : jdbc:mysql://xajhuang.com:3307/common_framework?serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=convertToNull&useUnicode=true diff --git a/src/main/java/com/cmhi/cf/controller/SystemDictController.java b/src/main/java/com/cmhi/cf/controller/SystemDictController.java index da96ec2..262a78a 100644 --- a/src/main/java/com/cmhi/cf/controller/SystemDictController.java +++ b/src/main/java/com/cmhi/cf/controller/SystemDictController.java @@ -8,6 +8,7 @@ import com.cmhi.cf.restapi.annotation.OperationLogAnnotation; import com.cmhi.cf.restapi.pojo.base.BasePageResultResp; import com.cmhi.cf.restapi.pojo.base.BasePagedReq; import com.cmhi.cf.restapi.pojo.base.BaseRespStatus; +import com.cmhi.cf.restapi.pojo.dto.AddDictContentReq; import com.cmhi.cf.restapi.pojo.dto.DictContentReq; import com.cmhi.cf.restapi.pojo.dto.NewUserDictReq; import com.cmhi.cf.restapi.pojo.dto.ProtocolReq; @@ -20,7 +21,9 @@ import com.cmhi.cf.restapi.pojo.vo.DictTypeResp; import com.cmhi.cf.restapi.pojo.vo.NewUserDictResp; import com.cmhi.cf.restapi.pojo.vo.ProtocolResp; import com.cmhi.cf.service.DictionaryService; +import com.cmhi.cf.validation.group.JsonViewGroups; import com.cmhi.cf.validation.group.ValidGroups; +import com.fasterxml.jackson.annotation.JsonView; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; @@ -161,16 +164,17 @@ public class SystemDictController { } } - @PostMapping("/user/dictContent") + @PostMapping("/user/getDictContent") @ResponseBody @EncryptionProtocol @DecryptionProtocol - @OperationLogAnnotation(OperationModule = "字典模块", OperationType = "读取", OperationDesc = "获取所有用户字典") + @JsonView(JsonViewGroups.DictContentResponse.class) + @OperationLogAnnotation(OperationModule = "字典模块", OperationType = "读取", OperationDesc = "获取用户字典内容项") public ProtocolResp getUserDictionaryContent(@RequestBody ProtocolReq mr) { List validate = HelperUtils.validate(mr, ValidGroups.ProtocolCommonValid.class, ValidGroups.DictReqValid.class); // 如果校验通过,validate为空;否则,validate包含未校验通过项 if (validate.isEmpty()) { - DictContentReq req = mr.getMsgContent(); + DictContentReq req = mr.getMsgContent(); List ret = dictionaryService.getUserDictionaryContent(req.getDictTpe()); return ProtocolResp.result(DictContentResp.builder() @@ -182,23 +186,24 @@ public class SystemDictController { } } -// @PutMapping("/user/addDictContent") -// @ResponseBody -// @EncryptionProtocol -// @DecryptionProtocol -// @OperationLogAnnotation(OperationModule = "字典模块", OperationType = "创建", OperationDesc = "新增用户字典内容项") -// public ProtocolResp createNewDictionaryContent(@RequestBody ProtocolReq mr) { -// List validate = HelperUtils.validate(mr, ValidGroups.ProtocolCommonValid.class, ValidGroups.DictReqValid.class); -// // 如果校验通过,validate为空;否则,validate包含未校验通过项 -// if (validate.isEmpty()) { -// NewUserDictReq req = mr.getMsgContent(); -// dictionaryService.addNewUserDictionary(req.getDictName(), req.getDictAlias(), req.getDictRemark()); -// return ProtocolResp.result(NewUserDictResp.builder() -// .dictName(req.getDictName()) -// .build()); -// } else { -// return ProtocolResp.result(ErrorCode.ERR_PARAMEXCEPTION, ErrorCode.ERR_PARAMEXCEPTION.getHttpCode(), -// validate.toArray(new String[0])); -// } -// } + @PutMapping("/user/addDictContent") + @ResponseBody + @EncryptionProtocol + @DecryptionProtocol + @OperationLogAnnotation(OperationModule = "字典模块", OperationType = "创建", OperationDesc = "新增用户字典内容项") + public ProtocolResp createNewDictionaryContent(@RequestBody ProtocolReq mr) { + List validate = HelperUtils.validate(mr, ValidGroups.ProtocolCommonValid.class, ValidGroups.DictReqValid.class, + ValidGroups.DictReqContentValid.class); + // 如果校验通过,validate为空;否则,validate包含未校验通过项 + if (validate.isEmpty()) { + AddDictContentReq req = mr.getMsgContent(); + //dictionaryService.addNewUserDictionary(req.getDictName(), req.getDictAlias(), req.getDictRemark()); + return ProtocolResp.result(NewUserDictResp.builder() + .dictName(req.getDictName()) + .build()); + } else { + return ProtocolResp.result(ErrorCode.ERR_PARAMEXCEPTION, ErrorCode.ERR_PARAMEXCEPTION.getHttpCode(), + validate.toArray(new String[0])); + } + } } diff --git a/src/main/java/com/cmhi/cf/database/common/entity/DictData.java b/src/main/java/com/cmhi/cf/database/common/entity/DictData.java index dbfd02d..0ba9012 100644 --- a/src/main/java/com/cmhi/cf/database/common/entity/DictData.java +++ b/src/main/java/com/cmhi/cf/database/common/entity/DictData.java @@ -92,7 +92,7 @@ public class DictData { */ @Schema(description = "创建时间") @Column(value = "create_time") - private java.util.Date createTime; + private Timestamp createTime; /** * 更新者 @@ -106,7 +106,7 @@ public class DictData { */ @Schema(description = "更新时间") @Column(value = "update_time") - private java.util.Date updateTime; + private Timestamp updateTime; /** * 备注 diff --git a/src/main/java/com/cmhi/cf/misc/HelperUtils.java b/src/main/java/com/cmhi/cf/misc/HelperUtils.java index 3c9a90d..0883dbd 100644 --- a/src/main/java/com/cmhi/cf/misc/HelperUtils.java +++ b/src/main/java/com/cmhi/cf/misc/HelperUtils.java @@ -4,7 +4,6 @@ import com.cmhi.cf.restapi.pojo.base.BaseRespStatus; import com.cmhi.cf.restapi.pojo.vo.ProtocolResp; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.servlet.ServletInputStream; import jakarta.servlet.http.HttpServletRequest; @@ -39,8 +38,7 @@ import java.util.Stack; public class HelperUtils { public static final String UN_EXPECT_REGEX_CHARS = "^((?!(--|\\s|\\*|%|\\+|'|;])).)*$"; - private static final ObjectMapper OBJ_MAPPER = new ObjectMapper().disable( - DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); + private static final ObjectMapper OBJ_MAPPER = ObjectMapperProvider.getMapper(); public static String truncateString(String orgString, int maxLength) { if (!stringNotEmptyOrNull(orgString) || orgString.length() <= maxLength) { @@ -182,7 +180,7 @@ public class HelperUtils { } public static ProtocolResp jsonGetProtocolResp(String jsonString, - Class[] subClass) throws JsonProcessingException { + Class[] subClass) throws JsonProcessingException { return OBJ_MAPPER.readValue(jsonString, new TypeReference<>() { @Override public Type getType() { @@ -217,6 +215,10 @@ public class HelperUtils { return str != null && !str.isEmpty(); } + public static String meagreDbStringValue(String str) { + return stringNotEmptyOrNull(str) ? str : null; + } + public static String getHttpRequestHeaders(HttpServletRequest request) throws JsonProcessingException { if (request != null) { Map headerMap = new HashMap<>(15); diff --git a/src/main/java/com/cmhi/cf/misc/ObjectMapperProvider.java b/src/main/java/com/cmhi/cf/misc/ObjectMapperProvider.java new file mode 100644 index 0000000..290b2b7 --- /dev/null +++ b/src/main/java/com/cmhi/cf/misc/ObjectMapperProvider.java @@ -0,0 +1,20 @@ +package com.cmhi.cf.misc; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.stereotype.Component; + +@Component +public class ObjectMapperProvider implements ApplicationContextAware { + private static ApplicationContext context; + + @Override + public void setApplicationContext(ApplicationContext applicationContext) { + ObjectMapperProvider.context = applicationContext; + } + + public static ObjectMapper getMapper() { + return context.getBean(ObjectMapper.class); + } +} diff --git a/src/main/java/com/cmhi/cf/restapi/pojo/dto/AddDictContentReq.java b/src/main/java/com/cmhi/cf/restapi/pojo/dto/AddDictContentReq.java new file mode 100644 index 0000000..375e56c --- /dev/null +++ b/src/main/java/com/cmhi/cf/restapi/pojo/dto/AddDictContentReq.java @@ -0,0 +1,31 @@ +package com.cmhi.cf.restapi.pojo.dto; + +import com.cmhi.cf.restapi.pojo.po.DictDetails; +import com.cmhi.cf.validation.group.ValidGroups; +import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Schema(name = "AddDictContentReq", description = "新增用户字典内容请求参数") +@JsonInclude(JsonInclude.Include.NON_NULL) +public class AddDictContentReq { + @NotBlank(message = "dictTpe 字典名称不能为空", groups = ValidGroups.DictReqValid.class) + private String dictName; + + @NotNull(message = "dictContent 字典内容值不能为 NULL", groups = ValidGroups.DictReqValid.class) + @Size(min = 1, max = 100, message = "字典内容至少需要指定 1 个,最多只能指定 100 个", groups = ValidGroups.DictReqValid.class) + private List<@NotNull(message = "dictContent 字典内容列表包含的对象不能为 NULL", + groups = ValidGroups.DictReqContentValid.class) DictDetails> dictContent; +} diff --git a/src/main/java/com/cmhi/cf/restapi/pojo/po/DictDetails.java b/src/main/java/com/cmhi/cf/restapi/pojo/po/DictDetails.java index 1058631..75f8c2e 100644 --- a/src/main/java/com/cmhi/cf/restapi/pojo/po/DictDetails.java +++ b/src/main/java/com/cmhi/cf/restapi/pojo/po/DictDetails.java @@ -1,20 +1,44 @@ package com.cmhi.cf.restapi.pojo.po; +import com.cmhi.cf.validation.group.JsonViewGroups; +import com.cmhi.cf.validation.group.ValidGroups; import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import com.fasterxml.jackson.annotation.JsonView; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import java.sql.Timestamp; + @Data @Builder @AllArgsConstructor @NoArgsConstructor -@JsonPropertyOrder({"id", "title", "value", "sorted", "disabled"}) +@JsonPropertyOrder({"id", "title", "value", "sorted", "cssClass", "listClass", "isDefault", "remark", "disabled"}) public class DictDetails { + @JsonView(JsonViewGroups.DictContentResponse.class) private Long id; + @JsonView(JsonViewGroups.DictContentResponse.class) + private Boolean disabled; + @JsonView(JsonViewGroups.DictContentResponse.class) + private String createBy; + @JsonView(JsonViewGroups.DictContentResponse.class) + private Timestamp createTime; + @JsonView(JsonViewGroups.DictContentResponse.class) + private String upgradeBy; + @JsonView(JsonViewGroups.DictContentResponse.class) + private Timestamp upgradeTime; + + @NotBlank(message = "title 字典内容不能为空", groups = ValidGroups.DictReqContentValid.class) private String title; + @NotNull(message = "value 字典内容值不能为 NULL", groups = ValidGroups.DictReqContentValid.class) private Integer value; private Integer sorted; - private Boolean disabled; + private String cssClass; + private String listClass; + private Boolean isDefault; + private String remark; } diff --git a/src/main/java/com/cmhi/cf/service/impl/DictionaryServiceImpl.java b/src/main/java/com/cmhi/cf/service/impl/DictionaryServiceImpl.java index 433e01b..8d05952 100644 --- a/src/main/java/com/cmhi/cf/service/impl/DictionaryServiceImpl.java +++ b/src/main/java/com/cmhi/cf/service/impl/DictionaryServiceImpl.java @@ -6,6 +6,7 @@ import com.cmhi.cf.database.common.entity.DictType; import com.cmhi.cf.database.common.mapper.DictDataMapper; import com.cmhi.cf.database.common.mapper.DictTypeMapper; import com.cmhi.cf.exception.CommonErrorCodeException; +import com.cmhi.cf.misc.HelperUtils; import com.cmhi.cf.restapi.misc.ApiContextUtils; import com.cmhi.cf.restapi.pojo.po.DictContent; import com.cmhi.cf.restapi.pojo.po.DictDetails; @@ -181,6 +182,13 @@ public class DictionaryServiceImpl implements DictionaryService { .title(m.getDictLabel()) .value(m.getDictValue()) .sorted(m.getDictSort()) + .cssClass(HelperUtils.meagreDbStringValue(m.getCssClass())) + .listClass(HelperUtils.meagreDbStringValue(m.getListClass())) + .isDefault("Y".equals(m.getIsDefault())) + .createBy(m.getCreateBy()) + .createTime(m.getCreateTime()) + .upgradeBy(HelperUtils.meagreDbStringValue(m.getUpdateBy())) + .upgradeTime(m.getUpdateTime()) .disabled(false) .build())); diff --git a/src/main/java/com/cmhi/cf/validation/group/JsonViewGroups.java b/src/main/java/com/cmhi/cf/validation/group/JsonViewGroups.java new file mode 100644 index 0000000..cdb028f --- /dev/null +++ b/src/main/java/com/cmhi/cf/validation/group/JsonViewGroups.java @@ -0,0 +1,7 @@ +package com.cmhi.cf.validation.group; + +public class JsonViewGroups { + public static class CommonView {} + public static class DictContentResponse extends CommonView {} + public static class DictContentRequest extends CommonView {} +} diff --git a/src/main/java/com/cmhi/cf/validation/group/ValidGroups.java b/src/main/java/com/cmhi/cf/validation/group/ValidGroups.java index dc74879..0959ab4 100644 --- a/src/main/java/com/cmhi/cf/validation/group/ValidGroups.java +++ b/src/main/java/com/cmhi/cf/validation/group/ValidGroups.java @@ -38,4 +38,7 @@ public interface ValidGroups { interface DictReqValid extends BaseProtocolValid { } + + interface DictReqContentValid extends BaseProtocolValid { + } } diff --git a/src/main/resources/rbac/data.sql b/src/main/resources/rbac/data.sql index 1b30623..2916ae1 100644 --- a/src/main/resources/rbac/data.sql +++ b/src/main/resources/rbac/data.sql @@ -44,7 +44,11 @@ INSERT IGNORE INTO rbac_resource_data VALUES (402, 'C083F441-9624-AF2C-B353-0768 INSERT IGNORE INTO rbac_resource_data VALUES (403, '953cea37-cc7a-4e7e-bd86-cb3c14daa8c4', '/api/dict/user/upgrade', '修改用户字典', 'POST', 0); INSERT IGNORE INTO rbac_resource_data VALUES (404, '247674fb-759d-4b01-8d35-2c0436d2ed99', '/api/dict/user/delete', '删除用户字典', 'DELETE', 0); INSERT IGNORE INTO rbac_resource_data VALUES (405, '54b43614-45c6-4672-a1d8-fa8f326d5e53', '/api/dict/user/allDict', '分页获取所有用户字典', 'POST', 0); -INSERT IGNORE INTO rbac_resource_data VALUES (406, 'e441dbb4-b844-461c-a5f8-07ee3fa658cc', '/api/dict/user/dictContent', '获取用户字典详细信息', 'POST', 0); +INSERT IGNORE INTO rbac_resource_data VALUES (406, 'e441dbb4-b844-461c-a5f8-07ee3fa658cc', '/api/dict/user/getDictContent', '获取用户字典详细信息', 'POST', 0); +INSERT IGNORE INTO rbac_resource_data VALUES (407, 'c803571e-ba0d-4f3d-bcc8-76488b1af22a', '/api/dict/user/addDictContent', '新增用户字典详细信息', 'PUT', 0); +INSERT IGNORE INTO rbac_resource_data VALUES (408, '99106f7a-6c4e-4438-ad40-65ed9417d0b4', '/api/dict/user/upgradeDictContent', '更新用户字典详细信息', 'POST', 0); +INSERT IGNORE INTO rbac_resource_data VALUES (409, 'a4c04e8f-d495-46ca-b67e-79cc9a91d623', '/api/dict/user/deleteDictContent', '删除用户字典详细信息', 'DELETE', 0); + -- ---------------------------- -- Records of role_resource -- (role_id, resource_id, authorize) @@ -70,6 +74,10 @@ INSERT IGNORE INTO rbac_role_resource VALUES (1, 403, 1); INSERT IGNORE INTO rbac_role_resource VALUES (1, 404, 1); INSERT IGNORE INTO rbac_role_resource VALUES (1, 405, 1); INSERT IGNORE INTO rbac_role_resource VALUES (1, 406, 1); +INSERT IGNORE INTO rbac_role_resource VALUES (1, 407, 1); +INSERT IGNORE INTO rbac_role_resource VALUES (1, 408, 1); +INSERT IGNORE INTO rbac_role_resource VALUES (1, 409, 1); + # INSERT IGNORE INTO role_resource (role_id, resource_id, authorize) VALUES (2, 1, 1); # INSERT IGNORE INTO role_resource (role_id, resource_id, authorize) VALUES (2, 2, 1); # INSERT IGNORE INTO role_resource (role_id, resource_id, authorize) VALUES (2, 3, 1);