diff --git a/acupuncture-admin/src/main/java/com/acupuncture/web/controller/web/DmsLoginController.java b/acupuncture-admin/src/main/java/com/acupuncture/web/controller/web/DmsLoginController.java index 4ff0da1c..ee4d5645 100644 --- a/acupuncture-admin/src/main/java/com/acupuncture/web/controller/web/DmsLoginController.java +++ b/acupuncture-admin/src/main/java/com/acupuncture/web/controller/web/DmsLoginController.java @@ -1,17 +1,23 @@ package com.acupuncture.web.controller.web; +import com.acupuncture.common.annotation.Log; import com.acupuncture.common.constant.Constants; import com.acupuncture.common.core.domain.AjaxResult; +import com.acupuncture.common.core.domain.JsonResponse; import com.acupuncture.common.core.domain.entity.SysUser; import com.acupuncture.common.core.domain.model.LoginBody; import com.acupuncture.common.core.domain.model.LoginUser; +import com.acupuncture.common.enums.BusinessType; import com.acupuncture.common.utils.SecurityUtils; import com.acupuncture.framework.web.service.SysPermissionService; import com.acupuncture.framework.web.service.TokenService; import com.acupuncture.framework.web.service.WebDmsLoginService; +import com.acupuncture.system.domain.vo.DmsLoginUserVo; +import com.acupuncture.system.service.DmsLoginService; import io.swagger.annotations.Api; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; @@ -33,10 +39,10 @@ public class DmsLoginController { private WebDmsLoginService webDmsLoginService; @Resource private SysPermissionService permissionService; - @Resource private TokenService tokenService; - + @Resource + private DmsLoginService dmsLoginService; /** * 登录方法 @@ -76,12 +82,19 @@ public class DmsLoginController { } AjaxResult ajax = AjaxResult.success(); ajax.put("user", user); - ajax.put("roles", roles); - ajax.put("permissions", permissions); ajax.put("tenantId", loginUser.getTenantId()); ajax.put("scoreId", loginUser.getScoreId()); return ajax; } + + @PutMapping("/resetPwd") + public JsonResponse resetPwd(@RequestBody DmsLoginUserVo.DmsUserVo user) + { +// webDmsLoginService.checkUserAllowed(user); +// webDmsLoginService.checkUserDataScope(user.getUserId()); + user.setPassword(SecurityUtils.encryptPassword(user.getPassword())); + return JsonResponse.ok(dmsLoginService.resetPwd(user)); + } } diff --git a/acupuncture-admin/src/main/java/com/acupuncture/web/controller/web/RmsReportController.java b/acupuncture-admin/src/main/java/com/acupuncture/web/controller/web/RmsReportController.java new file mode 100644 index 00000000..b569283c --- /dev/null +++ b/acupuncture-admin/src/main/java/com/acupuncture/web/controller/web/RmsReportController.java @@ -0,0 +1,10 @@ +package com.acupuncture.web.controller.web; + +/** + * @Author zzc + * @Package com.acupuncture.web.controller.web + * @Date 2025/2/10 15:58 + * @description: + */ +public class RmsReportController { +} diff --git a/acupuncture-common/pom.xml b/acupuncture-common/pom.xml index 5c29bf7a..56bc592d 100644 --- a/acupuncture-common/pom.xml +++ b/acupuncture-common/pom.xml @@ -118,6 +118,22 @@ javax.servlet javax.servlet-api + + io.swagger + swagger-annotations + 1.6.2 + compile + + + org.projectlombok + lombok + + + cn.hutool + hutool-all + 5.8.24 + compile + diff --git a/acupuncture-common/src/main/java/com/acupuncture/common/core/domain/BaseDto.java b/acupuncture-common/src/main/java/com/acupuncture/common/core/domain/BaseDto.java new file mode 100644 index 00000000..d3392123 --- /dev/null +++ b/acupuncture-common/src/main/java/com/acupuncture/common/core/domain/BaseDto.java @@ -0,0 +1,40 @@ +package com.acupuncture.common.core.domain; + +import cn.hutool.core.util.StrUtil; +import com.acupuncture.common.utils.StringUtils; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.Valid; +import javax.validation.constraints.NotNull; + +/** + * @author :zzc + * @date :Created in 2022/11/14 17:18 + * @version: + */ +@Data +@ApiModel("通用传参") +public class BaseDto { + @ApiModelProperty("页数 -1代表不分页") + private Integer pageNum = 1; + + @ApiModelProperty("每页条数") + private Integer pageSize = 10; + + @ApiModelProperty("排序 (eg: id asc, nickName desc)") + private String sort; + + @ApiModelProperty("实际参数") + @NotNull(message = "param不能为空") + @Valid + private T param; + + public String getOrderBy() { + if (StrUtil.isNotBlank(sort)) { + return StringUtils.toUnderScoreCase(sort); + } + return ""; + } +} diff --git a/acupuncture-common/src/main/java/com/acupuncture/common/core/domain/JsonResponse.java b/acupuncture-common/src/main/java/com/acupuncture/common/core/domain/JsonResponse.java new file mode 100644 index 00000000..5e48377c --- /dev/null +++ b/acupuncture-common/src/main/java/com/acupuncture/common/core/domain/JsonResponse.java @@ -0,0 +1,66 @@ +package com.acupuncture.common.core.domain; + +import com.acupuncture.common.constant.HttpStatus; +import lombok.Data; + +/** + * @author zhangsan + */ +@Data +public class JsonResponse { + public static final Integer CODE_SUCCESS = HttpStatus.SUCCESS; + public static final Integer CODE_FAIL = HttpStatus.ERROR; + public static final String MSG_SUCCESS = "操作成功"; + public static final String MSG_FAIL = "操作失败"; + private Integer code; + private T data; + private String msg; + + public static JsonResponse ok() { + JsonResponse jsonResponse = new JsonResponse<>(); + jsonResponse.code = CODE_SUCCESS; + jsonResponse.msg = MSG_SUCCESS; + jsonResponse.data = null; + return jsonResponse; + } + + public static JsonResponse ok(T data) { + JsonResponse jsonResponse = new JsonResponse<>(); + jsonResponse.code = CODE_SUCCESS; + jsonResponse.msg = MSG_SUCCESS; + jsonResponse.data = data; + return jsonResponse; + } + + public JsonResponse fail() { + JsonResponse jsonResponse = new JsonResponse<>(); + jsonResponse.code = CODE_FAIL; + jsonResponse.msg = MSG_FAIL; + jsonResponse.data = null; + return jsonResponse; + } + + public JsonResponse fail(String msg) { + JsonResponse jsonResponse = new JsonResponse<>(); + jsonResponse.code = CODE_FAIL; + jsonResponse.msg = msg; + jsonResponse.data = null; + return jsonResponse; + } + + /* + public JsonResponse fail(int code, String msg) { + JsonResponse jsonResponse = new JsonResponse<>(); + jsonResponse.code = code; + jsonResponse.msg = msg; + jsonResponse.data = null; + return jsonResponse; + }*/ + public JsonResponse fail(int code, String msg) { + JsonResponse jsonResponse = new JsonResponse<>(); + jsonResponse.code = code; + jsonResponse.msg = msg; + jsonResponse.data = null; + return jsonResponse; + } +} diff --git a/acupuncture-framework/src/main/java/com/acupuncture/framework/config/ApplicationConfig.java b/acupuncture-framework/src/main/java/com/acupuncture/framework/config/ApplicationConfig.java index 6b0ecbcc..c1d20501 100644 --- a/acupuncture-framework/src/main/java/com/acupuncture/framework/config/ApplicationConfig.java +++ b/acupuncture-framework/src/main/java/com/acupuncture/framework/config/ApplicationConfig.java @@ -1,6 +1,19 @@ package com.acupuncture.framework.config; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; import java.util.TimeZone; + +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer; import org.springframework.context.annotation.Bean; @@ -23,8 +36,33 @@ public class ApplicationConfig * 时区配置 */ @Bean - public Jackson2ObjectMapperBuilderCustomizer jacksonObjectMapperCustomization() - { - return jacksonObjectMapperBuilder -> jacksonObjectMapperBuilder.timeZone(TimeZone.getDefault()); + public Jackson2ObjectMapperBuilderCustomizer jacksonObjectMapperCustomization() { +// return jacksonObjectMapperBuilder -> jacksonObjectMapperBuilder.timeZone(TimeZone.getDefault()); + return jacksonObjectMapperBuilder -> jacksonObjectMapperBuilder.timeZone(TimeZone.getDefault()) + //包装类型Long + .serializerByType(Long.class, ToStringSerializer.instance) + //基本类型long不转换,一般是total之类的字段要用 +// .serializerByType(Long.TYPE, ToStringSerializer.instance) + //日期类型序列化 + .serializerByType(LocalDateTime.class, + new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))) + .serializerByType(LocalDate.class, + new LocalDateSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd"))) + .serializerByType(LocalTime.class, + new LocalTimeSerializer(DateTimeFormatter.ofPattern("HH:mm:ss"))) + //日期类型反序列化 + .deserializerByType(LocalDateTime.class, + new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))) + .deserializerByType(LocalDate.class, + new LocalDateDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd"))) + .deserializerByType(LocalTime.class, + new LocalTimeDeserializer(DateTimeFormatter.ofPattern("HH:mm:ss"))) + .featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) + //不包含空值 + //.serializationInclusion(JsonInclude.Include.NON_NULL) + //指定日期格式 + .simpleDateFormat("yyyy-MM-dd HH:mm:ss") + //忽略未知字段 + .failOnUnknownProperties(false); } } diff --git a/acupuncture-framework/src/main/java/com/acupuncture/framework/web/service/SysPasswordService.java b/acupuncture-framework/src/main/java/com/acupuncture/framework/web/service/SysPasswordService.java index 120fa2c7..c49f75cf 100644 --- a/acupuncture-framework/src/main/java/com/acupuncture/framework/web/service/SysPasswordService.java +++ b/acupuncture-framework/src/main/java/com/acupuncture/framework/web/service/SysPasswordService.java @@ -1,6 +1,8 @@ package com.acupuncture.framework.web.service; import java.util.concurrent.TimeUnit; + +import com.acupuncture.system.domain.vo.DmsLoginUserVo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.security.core.Authentication; @@ -71,11 +73,46 @@ public class SysPasswordService } } + public void validate(DmsLoginUserVo.DataScoreVo user) + { + Authentication usernamePasswordAuthenticationToken = AuthenticationContextHolder.getContext(); + String username = usernamePasswordAuthenticationToken.getName(); + String password = usernamePasswordAuthenticationToken.getCredentials().toString(); + + Integer retryCount = redisCache.getCacheObject(getCacheKey(username)); + + if (retryCount == null) + { + retryCount = 0; + } + + if (retryCount >= Integer.valueOf(maxRetryCount).intValue()) + { + throw new UserPasswordRetryLimitExceedException(maxRetryCount, lockTime); + } + + if (!matches(user, password)) + { + retryCount = retryCount + 1; + redisCache.setCacheObject(getCacheKey(username), retryCount, lockTime, TimeUnit.MINUTES); + throw new UserPasswordNotMatchException(); + } + else + { + clearLoginRecordCache(username); + } + } + public boolean matches(SysUser user, String rawPassword) { return SecurityUtils.matchesPassword(rawPassword, user.getPassword()); } + public boolean matches(DmsLoginUserVo.DataScoreVo user, String rawPassword) + { + return SecurityUtils.matchesPassword(rawPassword, user.getPassword()); + } + public void clearLoginRecordCache(String loginName) { if (redisCache.hasKey(getCacheKey(loginName))) diff --git a/acupuncture-framework/src/main/java/com/acupuncture/framework/web/service/UserDetailsServiceImpl.java b/acupuncture-framework/src/main/java/com/acupuncture/framework/web/service/UserDetailsServiceImpl.java index 5a41ad57..eefd8d6c 100644 --- a/acupuncture-framework/src/main/java/com/acupuncture/framework/web/service/UserDetailsServiceImpl.java +++ b/acupuncture-framework/src/main/java/com/acupuncture/framework/web/service/UserDetailsServiceImpl.java @@ -86,7 +86,7 @@ public class UserDetailsServiceImpl implements UserDetailsService throw new ServiceException(MessageUtils.message("user.blocked")); } -// passwordService.validate(user); + passwordService.validate(dataScoreVo); return createLoginUser(dataScoreVo); } diff --git a/acupuncture-generator/src/main/resources/mbg.xml b/acupuncture-generator/src/main/resources/mbg.xml index 6f5d0673..c187fceb 100644 --- a/acupuncture-generator/src/main/resources/mbg.xml +++ b/acupuncture-generator/src/main/resources/mbg.xml @@ -66,6 +66,7 @@
+