From ea9b12465c90fc72c40f3bd87c90785dfc2984e2 Mon Sep 17 00:00:00 2001 From: huliguo <2023611923@qq.com> Date: 星期三, 30 四月 2025 14:57:23 +0800 Subject: [PATCH] 基础代码 --- src/main/java/com/cl/pojo/vo/screen/AssistiveDeviceTypeVO.java | 21 src/main/java/com/cl/service/impl/DataServiceImpl.java | 281 ++++ src/main/java/com/cl/service/impl/InstitutionServiceImpl.java | 103 + src/main/java/com/cl/util/LoginAttempt.java | 17 src/main/java/com/cl/mapper/InstitutionMapper.java | 17 src/main/java/com/cl/pojo/vo/screen/HighSchoolVO.java | 18 src/main/java/com/cl/pojo/vo/screen/SalvationVO.java | 27 src/main/java/com/cl/mapper/UserMapper.java | 15 src/main/java/com/cl/interceptor/JwtTokenInterceptor.java | 99 + src/main/java/com/cl/common/constant/JwtClaimsConstant.java | 9 src/main/java/com/cl/config/WebMvcConfiguration.java | 121 + src/main/java/com/cl/pojo/dto/PasswordDTO.java | 13 src/main/java/com/cl/pojo/dto/AddDataDTO.java | 250 ++++ src/main/java/com/cl/service/DataService.java | 25 src/main/java/com/cl/pojo/dto/AddUserDTO.java | 16 src/main/java/com/cl/common/exception/user/InterceptorException.java | 10 src/main/java/com/cl/common/json/JacksonObjectMapper.java | 51 src/main/java/com/cl/pojo/entity/Institution.java | 46 src/main/java/com/cl/pojo/vo/DataRateVO.java | 233 +++ src/main/java/com/cl/pojo/vo/DataVO.java | 33 src/main/java/com/cl/util/JwtUtil.java | 69 + src/main/resources/mapper/DataMapper.xml | 127 ++ src/main/java/com/cl/common/result/Result.java | 46 src/main/java/com/cl/pojo/entity/DataEntity.java | 263 ++++ src/main/java/com/cl/CanLianScreenApplication.java | 18 src/main/java/com/cl/common/constant/StatusConstant.java | 13 src/main/java/com/cl/pojo/dto/EditInstitutionDTO.java | 12 src/main/java/com/cl/pojo/dto/LoginDTO.java | 16 src/main/java/com/cl/pojo/vo/UserVO.java | 21 src/main/java/com/cl/common/exception/data/DataException.java | 11 src/main/java/com/cl/pojo/entity/User.java | 53 src/main/java/com/cl/pojo/vo/screen/AssistiveDeviceGradeVO.java | 21 src/main/java/com/cl/pojo/vo/screen/ScreenVO.java | 62 + src/main/resources/mapper/InstitutionMapper.xml | 36 src/main/java/com/cl/config/CorsConfig.java | 26 src/main/java/com/cl/pojo/vo/screen/AssistiveDeviceVO.java | 22 src/main/java/com/cl/pojo/vo/screen/RightDownVO.java | 36 src/main/java/com/cl/common/exception/user/LoginErrorException.java | 13 src/main/java/com/cl/common/context/BaseContext.java | 22 src/main/java/com/cl/pojo/vo/EditDataDTO.java | 14 src/main/java/com/cl/common/constant/DelFlagConstant.java | 10 src/main/java/com/cl/pojo/dto/EditUserDTO.java | 16 src/main/java/com/cl/controller/InstitutionController.java | 90 + src/main/java/com/cl/config/MybatisPlusConfig.java | 28 src/main/java/com/cl/service/impl/TokenBlacklistService.java | 25 src/main/java/com/cl/pojo/vo/screen/DrillVO.java | 27 src/main/java/com/cl/controller/UserController.java | 219 +++ pom.xml | 115 + src/main/resources/mapper/UserMapper.xml | 20 src/main/java/com/cl/common/exception/institution/InstitutionException.java | 10 src/main/java/com/cl/pojo/vo/screen/StatutoryCertificateVO.java | 24 src/main/java/com/cl/common/handler/GlobalExceptionHandler.java | 82 + src/main/java/com/cl/service/impl/UserServiceImpl.java | 146 ++ src/main/java/com/cl/util/LoginAttemptService.java | 60 src/main/java/com/cl/common/exception/BaseException.java | 15 src/main/java/com/cl/common/constant/MessageConstant.java | 26 src/main/java/com/cl/service/UserService.java | 27 src/main/java/com/cl/pojo/vo/screen/DifficultyVO.java | 15 src/main/java/com/cl/common/exception/user/AddUserException.java | 10 src/main/java/com/cl/pojo/vo/screen/CertificateVO.java | 30 src/main/java/com/cl/pojo/vo/screen/WorkerVO.java | 27 src/main/java/com/cl/pojo/vo/screen/EmployedVO.java | 24 src/main/java/com/cl/common/exception/user/UserException.java | 10 src/main/java/com/cl/service/InstitutionService.java | 25 src/main/java/com/cl/pojo/vo/screen/EducationVO.java | 36 src/main/java/com/cl/pojo/dto/AddInstitutionDTO.java | 38 src/test/java/DatabaseConnectionTest.java | 39 src/main/java/com/cl/mapper/DataMapper.java | 17 src/main/java/com/cl/pojo/vo/InstitutionVO.java | 20 src/main/java/com/cl/controller/DataController.java | 97 + src/main/java/com/cl/util/BCryptPasswordEncoder.java | 23 src/main/resources/application.yml | 24 src/main/java/com/cl/pojo/vo/DataDetailVO.java | 17 73 files changed, 3,698 insertions(+), 0 deletions(-) diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..5c201b3 --- /dev/null +++ b/pom.xml @@ -0,0 +1,115 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <groupId>com.cl</groupId> + <artifactId>canlian_daping</artifactId> + <version>1.0-SNAPSHOT</version> + <parent> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-parent</artifactId> + <version>2.7.3</version> <!-- 可根据需要调整版本 --> + <relativePath/> + </parent> + <properties> + <maven.compiler.source>8</maven.compiler.source> + <maven.compiler.target>8</maven.compiler.target> + <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> + <mybatis-plus.version>3.5.3.1</mybatis-plus.version> + <swagger.version>3.0.0</swagger.version> + <jjwt.version>0.9.1</jjwt.version> + </properties> + + + <dependencies> + <!-- Spring Boot Starter Web --> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-web</artifactId> + </dependency> + <!-- MySQL Driver --> + <dependency> + <groupId>com.mysql</groupId> + <artifactId>mysql-connector-j</artifactId> + <version>8.2.0</version> + <scope>runtime</scope> + </dependency> + + <!-- MyBatis-Plus Starter --> + <dependency> + <groupId>com.baomidou</groupId> + <artifactId>mybatis-plus-boot-starter</artifactId> + <version>${mybatis-plus.version}</version> + </dependency> + + + <!-- Swagger 3 (OpenAPI) --> + <dependency> + <groupId>io.springfox</groupId> + <artifactId>springfox-boot-starter</artifactId> + <version>${swagger.version}</version> + </dependency> + <dependency> + <groupId>org.springdoc</groupId> + <artifactId>springdoc-openapi-ui</artifactId> + <version>1.6.14</version> + </dependency> + <!-- Lombok (可选但推荐) --> + <dependency> + <groupId>org.projectlombok</groupId> + <artifactId>lombok</artifactId> + <optional>true</optional> + </dependency> + + <!-- JWT --> + <dependency> + <groupId>io.jsonwebtoken</groupId> + <artifactId>jjwt</artifactId> + <version>${jjwt.version}</version> + </dependency> + <!-- Spring Boot Test --> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-test</artifactId> + <scope>test</scope> + </dependency> + + <!--BCrypt--> + <dependency> + <groupId>org.mindrot</groupId> + <artifactId>jbcrypt</artifactId> + <version>0.4</version> + </dependency> + <!-- Apache Commons Codec (MD5加密) --> + <dependency> + <groupId>commons-codec</groupId> + <artifactId>commons-codec</artifactId> + <version>1.15</version> + </dependency> + <dependency> + <groupId>org.hibernate.validator</groupId> + <artifactId>hibernate-validator</artifactId> + <version>6.2.5.Final</version> + </dependency> + + </dependencies> + + <build> + <plugins> + <plugin> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-maven-plugin</artifactId> + <configuration> + <excludes> + <exclude> + <groupId>org.projectlombok</groupId> + <artifactId>lombok</artifactId> + </exclude> + </excludes> + </configuration> + </plugin> + </plugins> + </build> +</project> \ No newline at end of file diff --git a/src/main/java/com/cl/CanLianScreenApplication.java b/src/main/java/com/cl/CanLianScreenApplication.java new file mode 100644 index 0000000..2404867 --- /dev/null +++ b/src/main/java/com/cl/CanLianScreenApplication.java @@ -0,0 +1,18 @@ +package com.cl; + +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; +import springfox.documentation.swagger2.annotations.EnableSwagger2; + +@EnableSwagger2 +@SpringBootApplication +public class CanLianScreenApplication { + public static void main(String[] args) + { + // System.setProperty("spring.devtools.restart.enabled", "false"); + SpringApplication.run(CanLianScreenApplication.class, args); + System.out.println("(♥◠‿◠)ノ゙ 启动成功 ლ(´ڡ`ლ)゙ \n"); + } +} diff --git a/src/main/java/com/cl/common/constant/DelFlagConstant.java b/src/main/java/com/cl/common/constant/DelFlagConstant.java new file mode 100644 index 0000000..a36fe69 --- /dev/null +++ b/src/main/java/com/cl/common/constant/DelFlagConstant.java @@ -0,0 +1,10 @@ +package com.cl.common.constant; + +public class DelFlagConstant { + + //删除 + public static final Integer DELETE = 1; + + //未删除 + public static final Integer UNDELETE = 0; +} diff --git a/src/main/java/com/cl/common/constant/JwtClaimsConstant.java b/src/main/java/com/cl/common/constant/JwtClaimsConstant.java new file mode 100644 index 0000000..df72685 --- /dev/null +++ b/src/main/java/com/cl/common/constant/JwtClaimsConstant.java @@ -0,0 +1,9 @@ +package com.cl.common.constant; + +public class JwtClaimsConstant { + + public static final String USER_PHONE = "phone"; + public static final String USER_ID = "id"; + + +} \ No newline at end of file diff --git a/src/main/java/com/cl/common/constant/MessageConstant.java b/src/main/java/com/cl/common/constant/MessageConstant.java new file mode 100644 index 0000000..ae9a731 --- /dev/null +++ b/src/main/java/com/cl/common/constant/MessageConstant.java @@ -0,0 +1,26 @@ +package com.cl.common.constant; + +/** + * 信息提示常量类 + */ +public class MessageConstant { + + public static final String PASSWORD_ERROR = "密码错误"; + public static final String PHONE_NOT_FOUND = "手机号不存在"; + + public static final String ACCOUNT_LOCKED = "账号被锁定"; + + public static final String PHONE_REPEAT="手机号重复"; + public static final String VERIFICATION_CODE_ERROR="验证码错误"; + public static final String PASSWORD_INCONSISTENCY="两次密码不一致"; + + + public static final String ALREADY_EXISTS="已存在"; + public static final String UNKNOWN_ERROR = "未知错误"; + + public static final String QUESTION_ID_NOT_FOUNT="该问题未找到答案"; + public static final String USER_NOT_LOGIN = "用户未登录"; + public static final String TOKEN_EXPIRED = "token过期"; + + +} \ No newline at end of file diff --git a/src/main/java/com/cl/common/constant/StatusConstant.java b/src/main/java/com/cl/common/constant/StatusConstant.java new file mode 100644 index 0000000..de07d51 --- /dev/null +++ b/src/main/java/com/cl/common/constant/StatusConstant.java @@ -0,0 +1,13 @@ +package com.cl.common.constant; + +/** + * 状态常量,启用或者禁用 + */ +public class StatusConstant { + + //启用 + public static final Integer ENABLE = 0; + + //禁用 + public static final Integer DISABLE = 1; +} \ No newline at end of file diff --git a/src/main/java/com/cl/common/context/BaseContext.java b/src/main/java/com/cl/common/context/BaseContext.java new file mode 100644 index 0000000..1d89600 --- /dev/null +++ b/src/main/java/com/cl/common/context/BaseContext.java @@ -0,0 +1,22 @@ +package com.cl.common.context; + +import com.cl.pojo.entity.User; + +import java.util.Map; + +public class BaseContext { + + public static ThreadLocal<User> threadLocal = new ThreadLocal<>(); + + public static void setCurrentUser(User user) { + threadLocal.set(user); + } + public static User getCurrentUser() { + return threadLocal.get(); + } + + public static void removeCurrentPhone() { + threadLocal.remove(); + } + +} \ No newline at end of file diff --git a/src/main/java/com/cl/common/exception/BaseException.java b/src/main/java/com/cl/common/exception/BaseException.java new file mode 100644 index 0000000..858bbfe --- /dev/null +++ b/src/main/java/com/cl/common/exception/BaseException.java @@ -0,0 +1,15 @@ +package com.cl.common.exception; + +/** + * 业务异常 + */ +public class BaseException extends RuntimeException { + + public BaseException() { + } + + public BaseException(String msg) { + super(msg); + } + +} \ No newline at end of file diff --git a/src/main/java/com/cl/common/exception/data/DataException.java b/src/main/java/com/cl/common/exception/data/DataException.java new file mode 100644 index 0000000..461816d --- /dev/null +++ b/src/main/java/com/cl/common/exception/data/DataException.java @@ -0,0 +1,11 @@ +package com.cl.common.exception.data; + +import com.cl.common.exception.BaseException; + + +public class DataException extends BaseException { + public DataException() {} + public DataException(String message) { + super(message); + } +} diff --git a/src/main/java/com/cl/common/exception/institution/InstitutionException.java b/src/main/java/com/cl/common/exception/institution/InstitutionException.java new file mode 100644 index 0000000..4690815 --- /dev/null +++ b/src/main/java/com/cl/common/exception/institution/InstitutionException.java @@ -0,0 +1,10 @@ +package com.cl.common.exception.institution; + +import com.cl.common.exception.BaseException; + +public class InstitutionException extends BaseException { + public InstitutionException(String message) { + super(message); + } + public InstitutionException() {} +} diff --git a/src/main/java/com/cl/common/exception/user/AddUserException.java b/src/main/java/com/cl/common/exception/user/AddUserException.java new file mode 100644 index 0000000..4587853 --- /dev/null +++ b/src/main/java/com/cl/common/exception/user/AddUserException.java @@ -0,0 +1,10 @@ +package com.cl.common.exception.user; + +import com.cl.common.exception.BaseException; + +public class AddUserException extends BaseException { + public AddUserException(String message) { + super(message); + } + public AddUserException(){} +} diff --git a/src/main/java/com/cl/common/exception/user/InterceptorException.java b/src/main/java/com/cl/common/exception/user/InterceptorException.java new file mode 100644 index 0000000..998eeb0 --- /dev/null +++ b/src/main/java/com/cl/common/exception/user/InterceptorException.java @@ -0,0 +1,10 @@ +package com.cl.common.exception.user; + +import com.cl.common.exception.BaseException; + +public class InterceptorException extends BaseException { + public InterceptorException(String msg) { + super(msg); + } + public InterceptorException() {} +} diff --git a/src/main/java/com/cl/common/exception/user/LoginErrorException.java b/src/main/java/com/cl/common/exception/user/LoginErrorException.java new file mode 100644 index 0000000..0ba91db --- /dev/null +++ b/src/main/java/com/cl/common/exception/user/LoginErrorException.java @@ -0,0 +1,13 @@ +package com.cl.common.exception.user; + +import com.cl.common.exception.BaseException; + +/** + * 登录失败 + */ +public class LoginErrorException extends BaseException { + public LoginErrorException(){} + public LoginErrorException(String msg){ + super(msg); + } +} \ No newline at end of file diff --git a/src/main/java/com/cl/common/exception/user/UserException.java b/src/main/java/com/cl/common/exception/user/UserException.java new file mode 100644 index 0000000..3038be9 --- /dev/null +++ b/src/main/java/com/cl/common/exception/user/UserException.java @@ -0,0 +1,10 @@ +package com.cl.common.exception.user; + +import com.cl.common.exception.BaseException; + +public class UserException extends BaseException { + public UserException(String message) { + super(message); + } + public UserException(){} +} diff --git a/src/main/java/com/cl/common/handler/GlobalExceptionHandler.java b/src/main/java/com/cl/common/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..987f946 --- /dev/null +++ b/src/main/java/com/cl/common/handler/GlobalExceptionHandler.java @@ -0,0 +1,82 @@ +package com.cl.common.handler; + + + +import com.cl.common.constant.MessageConstant; +import com.cl.common.exception.BaseException; +import com.cl.common.result.Result; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.ObjectError; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +import java.sql.SQLIntegrityConstraintViolationException; + +/** + * 全局异常处理器,处理项目中抛出的业务异常 + */ +@RestControllerAdvice +@Slf4j +public class GlobalExceptionHandler { + + + /** + * 捕获业务异常 + * @param ex + * @return + */ + @ExceptionHandler + public Result exceptionHandler(BaseException ex){ + log.error("异常信息:{}", ex.getMessage()); + return Result.error(ex.getMessage()); + } + + + /** + * 数据校验异常 + * @param e + * @return + */ + @ExceptionHandler(value = MethodArgumentNotValidException.class) + public Result errorHandler(MethodArgumentNotValidException e){ +// BindingResult bindingResult=exception.getBindingResult(); + String message=""; +// String message=bindingResult.getAllErrors().stream().map(DefaultMessageSourceResolvable::getDefaultMessage).collect(Collectors.joining()); +// for(ObjectError s:e.getAllErrors()){ +// message+=s.getDefaultMessage(); +// break; +// } + message= String.valueOf(e.getAllErrors().get(0).getDefaultMessage()); + + log.info("数据校验错误:{}",message); + return Result.error(message); + } + + /** + * 处理sql异常 + * @param ex + * @return + */ + @ExceptionHandler + public Result exceptionHandler(SQLIntegrityConstraintViolationException ex){ + + //Duplicate entry 'zhangsan' for key 'idx_username' + String message = ex.getMessage(); + if (message.contains("Duplicate entry")){ + String[] split = message.split(" "); + String username=split[2]; + String msg=username+ MessageConstant.ALREADY_EXISTS; + return Result.error(msg); + }else { + log.error(message,ex); + return Result.error(MessageConstant.UNKNOWN_ERROR); + } + + } + + + + +} \ No newline at end of file diff --git a/src/main/java/com/cl/common/json/JacksonObjectMapper.java b/src/main/java/com/cl/common/json/JacksonObjectMapper.java new file mode 100644 index 0000000..9bcc390 --- /dev/null +++ b/src/main/java/com/cl/common/json/JacksonObjectMapper.java @@ -0,0 +1,51 @@ +package com.cl.common.json; + +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.module.SimpleModule; +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 java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; + +import static com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES; + +/** + * 对象映射器:基于jackson将Java对象转为json,或者将json转为Java对象 + * 将JSON解析为Java对象的过程称为 [从JSON反序列化Java对象] + * 从Java对象生成JSON的过程称为 [序列化Java对象到JSON] + */ +public class JacksonObjectMapper extends ObjectMapper { + + public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd"; + //public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss"; + public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm"; + public static final String DEFAULT_TIME_FORMAT = "HH:mm:ss"; + + public JacksonObjectMapper() { + super(); + //收到未知属性时不报异常 + this.configure(FAIL_ON_UNKNOWN_PROPERTIES, false); + + //反序列化时,属性不存在的兼容处理 + this.getDeserializationConfig().withoutFeatures(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); + + SimpleModule simpleModule = new SimpleModule() + .addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT))) + .addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT))) + .addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT))) + .addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT))) + .addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT))) + .addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT))); + + //注册功能模块 例如,可以添加自定义序列化器和反序列化器 + this.registerModule(simpleModule); + } +} \ No newline at end of file diff --git a/src/main/java/com/cl/common/result/Result.java b/src/main/java/com/cl/common/result/Result.java new file mode 100644 index 0000000..282b161 --- /dev/null +++ b/src/main/java/com/cl/common/result/Result.java @@ -0,0 +1,46 @@ +package com.cl.common.result; + +import lombok.Data; + +import java.io.Serializable; + +/** + * 后端统一返回结果 + * @param <T> + */ +@Data +public class Result<T> implements Serializable { + + private Integer code; //编码:1成功,0和其它数字为失败 + private String message; //错误信息 + private T data; //数据 + + public static <T> Result<T> success() { + Result<T> result = new Result<T>(); + result.code = 200; + return result; + } + + public static <T> Result<T> success(T object) { + Result<T> result = new Result<T>(); + result.data = object; + result.code = 200; + return result; + } + + public static <T> Result<T> success(String message,T object) { + Result<T> result = new Result<T>(); + result.data = object; + result.message=message; + result.code = 200; + return result; + } + + public static <T> Result<T> error(String msg) { + Result result = new Result(); + result.message = msg; + result.code = 500; + return result; + } + +} \ No newline at end of file diff --git a/src/main/java/com/cl/config/CorsConfig.java b/src/main/java/com/cl/config/CorsConfig.java new file mode 100644 index 0000000..6d4f9c1 --- /dev/null +++ b/src/main/java/com/cl/config/CorsConfig.java @@ -0,0 +1,26 @@ +package com.cl.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.cors.CorsConfiguration; +import org.springframework.web.cors.UrlBasedCorsConfigurationSource; +import org.springframework.web.filter.CorsFilter; + +@Configuration +public class CorsConfig { + + // 当前跨域请求最大有效时长。这里默认1天 + private static final long MAX_AGE = 24 * 60 * 60; + + @Bean + public CorsFilter corsFilter() { + UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); + CorsConfiguration corsConfiguration = new CorsConfiguration(); + corsConfiguration.addAllowedOrigin("*"); // 1 设置访问源地址 + corsConfiguration.addAllowedHeader("*"); // 2 设置访问源请求头 + corsConfiguration.addAllowedMethod("*"); // 3 设置访问源请求方法 + corsConfiguration.setMaxAge(MAX_AGE); + source.registerCorsConfiguration("/**", corsConfiguration); // 4 对接口配置跨域设置 + return new CorsFilter(source); + } +} \ No newline at end of file diff --git a/src/main/java/com/cl/config/MybatisPlusConfig.java b/src/main/java/com/cl/config/MybatisPlusConfig.java new file mode 100644 index 0000000..a680759 --- /dev/null +++ b/src/main/java/com/cl/config/MybatisPlusConfig.java @@ -0,0 +1,28 @@ +package com.cl.config; + + +import com.baomidou.mybatisplus.annotation.DbType; +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; +import org.apache.ibatis.session.SqlSessionFactory; +import org.mybatis.spring.SqlSessionTemplate; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +@MapperScan("com.cl.mapper") +public class MybatisPlusConfig { + + /** + * 添加分页插件 + */ + @Bean + public MybatisPlusInterceptor mybatisPlusInterceptor() { + MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); + interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));//如果配置多个插件,切记分页最后添加 + //interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); 如果有多数据源可以不配具体类型 否则都建议配上具体的DbType + return interceptor; + } + +} \ No newline at end of file diff --git a/src/main/java/com/cl/config/WebMvcConfiguration.java b/src/main/java/com/cl/config/WebMvcConfiguration.java new file mode 100644 index 0000000..2bb5780 --- /dev/null +++ b/src/main/java/com/cl/config/WebMvcConfiguration.java @@ -0,0 +1,121 @@ +package com.cl.config; + + + +import com.cl.common.json.JacksonObjectMapper; +import com.cl.interceptor.JwtTokenInterceptor; +import com.cl.util.LoginAttemptService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport; +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.ParameterBuilder; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.schema.ModelRef; +import springfox.documentation.service.ApiInfo; +import springfox.documentation.service.Parameter; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; + +import java.util.ArrayList; +import java.util.List; + +/** + * 配置类,注册web层相关组件 + */ +@Configuration +@Slf4j +public class WebMvcConfiguration extends WebMvcConfigurationSupport { + + @Autowired + private JwtTokenInterceptor jwtTokenInterceptor; + + + + /** + * 注册自定义拦截器 + * + * @param registry + */ + protected void addInterceptors(InterceptorRegistry registry) { + log.info("开始注册自定义拦截器..."); + registry.addInterceptor(jwtTokenInterceptor) + .addPathPatterns("/user/**","/data/**","/institution/**") + .excludePathPatterns("/user/login","user/loginOut"); + } + + /** + * 通过knife4j生成接口文档 + * @return + */ + @Bean + public Docket docket() { + ApiInfo apiInfo = new ApiInfoBuilder() + .title("残联大屏项目接口文档") + .version("3.0") + .description("残联大屏项目接口文档") + .build(); + // 定义请求头参数 + ParameterBuilder tokenParamBuilder = new ParameterBuilder(); + tokenParamBuilder.name("token") // 参数名 + .description("请求头token") // 描述 + .modelRef(new ModelRef("string")) + .parameterType("header") // 参数类型为请求头 + .required(false) // 是否必填 + .build(); + List<Parameter> parameters = new ArrayList<>(); + parameters.add(tokenParamBuilder.build()); + Docket docket = new Docket(DocumentationType.SWAGGER_2) + + .select() + .apis(RequestHandlerSelectors.basePackage("com.cl.controller")) + .paths(PathSelectors.any()) + .build() + .globalOperationParameters(parameters) + .apiInfo(apiInfo); // 全局设置请求头参数; + return docket; + } + + + /** + * 设置静态资源映射 + * @param registry + */ + protected void addResourceHandlers(ResourceHandlerRegistry registry) { + // For Springfox 3.x + registry.addResourceHandler("/swagger-ui/**") + .addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/") + .resourceChain(false); + + } + + /** + * 扩展Spring MVC框架的消息转换器 + * @param converters + */ + @Override + protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) { + log.info("扩展消息转换器"); + //创建一个消息装换器对象 + MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); + //需要为消息转换器设置一个对象转换器,对象装换器可以将java对象序列化为json数据 + converter.setObjectMapper(new JacksonObjectMapper()); + //将自己的消息转换器加入到容器中 + converters.add(0,converter); + } + + /** + * 登录密码错误次数校验 + */ + @Bean + public LoginAttemptService loginAttemptService() { + return new LoginAttemptService(); + } +} \ No newline at end of file diff --git a/src/main/java/com/cl/controller/DataController.java b/src/main/java/com/cl/controller/DataController.java new file mode 100644 index 0000000..84deb62 --- /dev/null +++ b/src/main/java/com/cl/controller/DataController.java @@ -0,0 +1,97 @@ +package com.cl.controller; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.cl.common.result.Result; +import com.cl.pojo.dto.AddDataDTO; + +import com.cl.pojo.entity.DataEntity; + +import com.cl.pojo.vo.DataDetailVO; +import com.cl.pojo.vo.DataVO; +import com.cl.pojo.vo.EditDataDTO; + +import com.cl.pojo.vo.screen.ScreenVO; +import com.cl.service.DataService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; + + +@RestController +@RequestMapping("/data") +@Slf4j +@Api(tags = "数据") +public class DataController { + + @Autowired + private DataService dataService; + /** + * 新增 + */ + @PostMapping("/add") + @ApiOperation("数据上报") + public Result<String> add(@RequestBody @Valid AddDataDTO addDataDTO) { + dataService.add(addDataDTO); + return Result.success("上传成功"); + } + + /** + * 分页 + */ + @GetMapping("/pageList") + @ApiOperation("用户分页查询") + public Result<IPage<DataVO>> selectPageUser(@RequestParam(value = "pageNum",defaultValue = "1")Integer pageNum, + @RequestParam(value = "pageSize",defaultValue = "10")Integer pageSize, + @RequestParam(value = "county",required = false)Integer county, + @RequestParam(value = "name",required = false)String name){ + IPage<DataEntity> page = new Page<>(pageNum, pageSize); + IPage<DataVO> iPage=dataService.pageList(page,county,name); + return Result.success(iPage); + } + + /** + * 查看详情(数据回显) 返回两次数据 查询该id和该id上一次数据 同比增加减少 + */ + @PostMapping("/detail") + @ApiOperation("查看详情") + public Result<DataDetailVO> detail(@RequestParam(value = "id")Integer id) { + + return Result.success( dataService.detail(id)); + } + + /** + * 修改 + */ + @PutMapping("/edit") + @ApiOperation("数据修改") + public Result<String> edit(@RequestBody @Valid EditDataDTO editDataDTO) { + dataService.edit(editDataDTO); + return Result.success("修改成功"); + } + + /** + * 删除 + */ + @DeleteMapping("/delete/{id}") + @ApiOperation("删除数据") + public Result<String> delete(@PathVariable Integer id) { + dataService.delete(id); + return Result.success("删除成功"); + } + + /** + * 大屏数据 + */ + @PostMapping("/screen") + @ApiOperation("大屏数据") + public Result<ScreenVO> screen(@RequestParam(value = "county",required = false)Integer county) { + return Result.success( dataService.screen(county==null?0:county)); + } + + +} diff --git a/src/main/java/com/cl/controller/InstitutionController.java b/src/main/java/com/cl/controller/InstitutionController.java new file mode 100644 index 0000000..04444b5 --- /dev/null +++ b/src/main/java/com/cl/controller/InstitutionController.java @@ -0,0 +1,90 @@ +package com.cl.controller; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.cl.common.result.Result; +import com.cl.pojo.dto.AddInstitutionDTO; +import com.cl.pojo.dto.EditInstitutionDTO; +import com.cl.pojo.entity.Institution; +import com.cl.pojo.vo.InstitutionVO; +import com.cl.service.InstitutionService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.List; + +@RestController +@RequestMapping("/institution") +@Slf4j +@Api(tags = "机构") +@Validated +public class InstitutionController { + @Autowired + private InstitutionService institutionService; + + /** + * 添加 + */ + @PostMapping("/add") + @ApiOperation("添加机构") + public Result<String> add(@RequestBody @Valid AddInstitutionDTO addDTO) { + institutionService.add(addDTO); + return Result.success("添加成功"); + } + + /** + * 分页 + */ + @GetMapping("/pageList") + @ApiOperation("机构分页") + public Result<IPage<InstitutionVO> > pageList(@RequestParam(value = "pageNum",defaultValue = "1")Integer pageNum, + @RequestParam(value = "pageSize",defaultValue = "10")Integer pageSize, + @RequestParam(value = "county",required = false)Integer county,//0-查所有 + @RequestParam(value = "name",required = false)String name) { + IPage<Institution> page = new Page<>(pageNum, pageSize); + return Result.success(institutionService.pageList(page,county,name)); + } + /** + * 编辑回显 + */ + @GetMapping("/read/{id}") + @ApiOperation("详情(回显)") + public Result<InstitutionVO> read(@PathVariable("id")Integer id) { + return Result.success(institutionService.read(id)); + } + + /** + * 编辑 + */ + @PutMapping("/edit") + @ApiOperation("修改机构") + public Result<String> edit(@RequestBody @Valid EditInstitutionDTO editDTO) { + institutionService.edit(editDTO); + return Result.success("修改成功"); + } + /** + * 删除 + */ + @DeleteMapping("/delete/{id}") + @ApiOperation("删除机构") + public Result<String> delete(@PathVariable("id")Integer id) { + institutionService.delete(id); + return Result.success("删除成功"); + } + /** + * 大屏数据 + */ + @GetMapping("/getAll/{county}") + @ApiOperation("大屏滚动数据") + public Result<List<InstitutionVO>> getAll(@PathVariable("county") Integer county) { + return Result.success(institutionService.getAll(county)); + } + + + +} diff --git a/src/main/java/com/cl/controller/UserController.java b/src/main/java/com/cl/controller/UserController.java new file mode 100644 index 0000000..5633681 --- /dev/null +++ b/src/main/java/com/cl/controller/UserController.java @@ -0,0 +1,219 @@ +package com.cl.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.cl.common.constant.DelFlagConstant; +import com.cl.common.constant.StatusConstant; +import com.cl.common.context.BaseContext; +import com.cl.common.exception.user.LoginErrorException; +import com.cl.common.exception.user.UserException; +import com.cl.common.result.Result; +import com.cl.pojo.dto.AddUserDTO; +import com.cl.pojo.dto.EditUserDTO; +import com.cl.pojo.dto.LoginDTO; +import com.cl.pojo.dto.PasswordDTO; +import com.cl.pojo.entity.User; + +import com.cl.pojo.vo.UserVO; +import com.cl.service.UserService; +import com.cl.service.impl.TokenBlacklistService; +import com.cl.util.BCryptPasswordEncoder; +import com.cl.util.JwtUtil; +import com.cl.util.LoginAttemptService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; + +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; + +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.time.LocalDateTime; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +@RestController +@RequestMapping("/user") +@Slf4j +@Api(tags = "用户") +public class UserController { + @Autowired + private UserService userService; + + @Autowired + private LoginAttemptService loginAttemptService; + + @Autowired + private TokenBlacklistService blacklistService; + + + /** + * 登录 + */ + @PostMapping("/login") + @ApiOperation("用户登录") + public Result<Map<String,String>> login(@RequestBody @Valid LoginDTO dto) { + //校验该手机号登录失败是否锁定 + boolean locked = loginAttemptService.isLocked(dto.getPhone()); + if (locked) { + throw new LoginErrorException("连续登录失败,请稍后再试"); + } + //校验手机号是否存在 + User user = userService.getOne(new LambdaQueryWrapper<User>() + .eq(User::getPhone, dto.getPhone()) + .eq(User::getDelFlag, DelFlagConstant.UNDELETE)); + + if (user == null) { + throw new LoginErrorException("用户不存在"); + } + + if (!Objects.equals(user.getStatus(), StatusConstant.ENABLE)){ + throw new LoginErrorException("该账号已被冻结"); + } + //校验密码是否正确 + if (!BCryptPasswordEncoder.matches(dto.getPassword(), user.getPassword())) { + //失败 + //将手机号加入线程中记录 + loginAttemptService.recordFailedAttempt(dto.getPhone()); + throw new LoginErrorException("登录失败,手机号/密码错误"); + } + //成功 + loginAttemptService.clearAttempts(dto.getPhone()); + //token加密 + Map<String, Object> claims=new HashMap<>(); + claims.put("phone", dto.getPhone()); + claims.put("id", user.getId()); + String token = JwtUtil.createJWT(claims); + Map<String,String> map=new HashMap<>(); + map.put("token", token); + map.put("is_first",user.getIsFirst().toString()); + if (1==user.getIsFirst()){ + User user1 = new User(); + user1.setId(user.getId()); + user1.setIsFirst(0); + userService.updateById(user1); + } + return Result.success(map); + } + /** + * 退出登录 + */ + @PostMapping("/logout") + @ApiOperation("退出登录") + public Result<String> logout(@RequestHeader("Authorization") String token) { + // 1. 将令牌加入黑名单 + blacklistService.addToBlacklist(token); + return Result.success("退出成功"); + } + /** + * 修改密码 + */ + @PutMapping("/password") + @ApiOperation("修改密码") + public Result<String> password(@RequestBody @Valid PasswordDTO passwordDTO, + @RequestHeader("Authorization") String token) { + userService.password(passwordDTO,token); + return Result.success("修改成功"); + } + /** + * 添加 + */ + @PostMapping("/addUser") + @ApiOperation("添加用户") + public Result<String> addUser(@RequestBody @Valid AddUserDTO addUserDTO) { + userService.addUser(addUserDTO); + return Result.success("添加成功"); + } + + /** + * 用户列表查询 + */ + @GetMapping("/pageList") + @ApiOperation("用户分页查询") + public Result<IPage<UserVO>> selectPageUser(@RequestParam(value = "pageNum",defaultValue = "1")Integer pageNum, + @RequestParam(value = "pageSize",defaultValue = "10")Integer pageSize, + @RequestParam(value = "name",required = false)String name, + @RequestParam(value = "phone",required = false)String phone){ + IPage<User> page = new Page<>(pageNum, pageSize); + IPage<UserVO> iPage=userService.pageList(page,name,phone); + return Result.success(iPage); + } + /** + * 用户回显 + */ + @GetMapping("/read/{id}") + @ApiOperation("查看用户(编辑回显)") + public Result<UserVO> read(@PathVariable("id")Integer id){ + if (id==1){ + throw new UserException("管理员账号,不可操作"); + } + User user = userService.getById(id); + UserVO userVO=new UserVO(); + BeanUtils.copyProperties(user,userVO); + return Result.success(userVO); + } + /** + * 编辑用户 + */ + @PutMapping("/editUser") + @ApiOperation("编辑用户") + public Result<String> editUser(@RequestBody @Valid EditUserDTO editUserDTO) { + if (editUserDTO.getId()==1){ + throw new UserException("管理员账号,不可操作"); + } + userService.editUser(editUserDTO); + return Result.success("修改成功"); + } + /** + * 冻结/解冻 + */ + @PutMapping("/frozen/{id}") + @ApiOperation("冻结/解冻") + public Result<String> frozen(@PathVariable("id") Integer id) { + if (id==1){ + throw new UserException("管理员账号,不可操作"); + } + userService.frozen(id); + return Result.success("修改成功"); + } + + /** + * 删除 + */ + @DeleteMapping("/delete/{id}") + @ApiOperation("删除用户") + public Result<String> deleteUser(@PathVariable("id")Integer id){ + if (id==1){ + throw new UserException("管理员账号,不可操作"); + } + LambdaQueryWrapper<User> queryWrapper=new LambdaQueryWrapper<>(); + queryWrapper.eq(User::getId,id); + queryWrapper.eq(User::getDelFlag,DelFlagConstant.UNDELETE); + User user = userService.getOne(queryWrapper); + if (null==user){ + throw new UserException("用户不存在"); + } + user.setDelFlag(DelFlagConstant.DELETE); + user.setUpdateBy(BaseContext.getCurrentUser().getId()); + user.setUpdateTime(LocalDateTime.now()); + userService.updateById(user); + return Result.success("删除成功"); + } + /** + * 重置密码 + */ + @PutMapping("/resetPassword/{id}") + @ApiOperation("重置密码") + public Result<String> resetPassword(@PathVariable("id")Integer id){ + if (id==1){ + throw new UserException("管理员账号,不可操作"); + } + userService.resetPassword(id); + return Result.success("删除成功"); + } + +} diff --git a/src/main/java/com/cl/interceptor/JwtTokenInterceptor.java b/src/main/java/com/cl/interceptor/JwtTokenInterceptor.java new file mode 100644 index 0000000..c7c53d1 --- /dev/null +++ b/src/main/java/com/cl/interceptor/JwtTokenInterceptor.java @@ -0,0 +1,99 @@ +package com.cl.interceptor; + + + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.cl.common.constant.DelFlagConstant; +import com.cl.common.constant.JwtClaimsConstant; +import com.cl.common.constant.MessageConstant; +import com.cl.common.constant.StatusConstant; +import com.cl.common.context.BaseContext; +import com.cl.common.exception.user.InterceptorException; +import com.cl.common.exception.user.LoginErrorException; +import com.cl.mapper.UserMapper; +import com.cl.pojo.entity.User; +import com.cl.service.impl.TokenBlacklistService; +import com.cl.util.JwtUtil; +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.ExpiredJwtException; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Component; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.HandlerInterceptor; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.Objects; + +/** + * jwt令牌校验的拦截器 + */ +@Component +@Slf4j +public class JwtTokenInterceptor implements HandlerInterceptor { + + @Autowired + private JwtUtil jwtUtil; + @Autowired + private UserMapper userMapper; + @Autowired + private TokenBlacklistService blacklistService; + + /** + * 校验jwt + * + * @param request + * @param response + * @param handler + * @return + * @throws Exception + */ + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + //判断当前拦截到的是Controller的方法还是其他资源 + if (!(handler instanceof HandlerMethod)) { + //当前拦截到的不是动态方法,直接放行 + return true; + } + //1、从请求头中获取令牌 + String token = request.getHeader(jwtUtil.getTokenName()); + if (token == null || token.isEmpty()) { + log.warn("JWT令牌为空,访问URI: {}", request.getRequestURI()); + throw new LoginErrorException(MessageConstant.USER_NOT_LOGIN); + } + // 检查令牌是否在黑名单中 + if (blacklistService.isBlacklisted(token)) { + response.sendError(HttpStatus.UNAUTHORIZED.value(), "令牌已失效"); + throw new LoginErrorException("您已退出登录"); + } + //2、校验令牌 + try { + log.info("jwt校验:{}", token); + Claims claims = JwtUtil.parseJWT(token); + String phone=String.valueOf(claims.get(JwtClaimsConstant.USER_PHONE).toString()); + String id=String.valueOf(claims.get(JwtClaimsConstant.USER_ID).toString()); + User user = userMapper.selectById(id); + if (user==null || user.getDelFlag().equals(DelFlagConstant.DELETE)){ + throw new InterceptorException("用户不存在"); + } + if (Objects.equals(user.getStatus(), StatusConstant.DISABLE)){ + throw new InterceptorException("该用户已被冻结"); + } + log.info("当前用户phone:{}", phone); + log.info("当前用户id:{}", id); + BaseContext.setCurrentUser(user); + //3、通过,放行 + return true; + }catch (ExpiredJwtException ex) { + log.warn("JWT已过期,Token: {}", token); + throw new LoginErrorException(MessageConstant.TOKEN_EXPIRED); + } catch (InterceptorException ex) { + log.warn("JWT已过期,Token: {}", token); + throw new InterceptorException("该用户已被冻结"); + }catch (Exception ex) { + //4、不通过,响应401状态码 + throw new LoginErrorException(MessageConstant.USER_NOT_LOGIN); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/cl/mapper/DataMapper.java b/src/main/java/com/cl/mapper/DataMapper.java new file mode 100644 index 0000000..11b9a8d --- /dev/null +++ b/src/main/java/com/cl/mapper/DataMapper.java @@ -0,0 +1,17 @@ +package com.cl.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.cl.pojo.entity.DataEntity; +import com.cl.pojo.vo.DataVO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +@Mapper +public interface DataMapper extends BaseMapper<DataEntity> { + DataEntity screen(Integer county); + + IPage<DataVO> pageList(IPage<DataEntity> page, @Param("county") Integer county,@Param("name") String name); + + DataEntity beforeOne(@Param("id") Integer id); +} diff --git a/src/main/java/com/cl/mapper/InstitutionMapper.java b/src/main/java/com/cl/mapper/InstitutionMapper.java new file mode 100644 index 0000000..11ad97a --- /dev/null +++ b/src/main/java/com/cl/mapper/InstitutionMapper.java @@ -0,0 +1,17 @@ +package com.cl.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.cl.pojo.entity.Institution; +import com.cl.pojo.vo.InstitutionVO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +@Mapper +public interface InstitutionMapper extends BaseMapper<Institution> { + IPage<InstitutionVO> pageList(IPage<Institution> page, @Param("county") Integer county, @Param("name") String name); + + List<InstitutionVO> getAll(@Param("county") Integer county); +} diff --git a/src/main/java/com/cl/mapper/UserMapper.java b/src/main/java/com/cl/mapper/UserMapper.java new file mode 100644 index 0000000..5eea1ac --- /dev/null +++ b/src/main/java/com/cl/mapper/UserMapper.java @@ -0,0 +1,15 @@ +package com.cl.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.cl.pojo.entity.User; + +import com.cl.pojo.vo.UserVO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + + +@Mapper +public interface UserMapper extends BaseMapper<User> { + IPage<UserVO> pageList(IPage<User> page, @Param("name") String name, @Param("phone") String phone); +} diff --git a/src/main/java/com/cl/pojo/dto/AddDataDTO.java b/src/main/java/com/cl/pojo/dto/AddDataDTO.java new file mode 100644 index 0000000..f7afd85 --- /dev/null +++ b/src/main/java/com/cl/pojo/dto/AddDataDTO.java @@ -0,0 +1,250 @@ +package com.cl.pojo.dto; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.Max; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; + +@Data +@ApiModel("上传数据DTO") +public class AddDataDTO { + @ApiModelProperty(value = "区县,1-东区,2-西区,3-仁和区,4-米易县,5-盐边县") + @Min(value = 1,message = "区县选择范围为1-5") + @Max(value = 5,message = "区县选择范围为1-5") + @NotNull(message = "区县选择不能为空") + private Integer county; + + @ApiModelProperty(value = "调研时间") + @NotNull(message = "调研时间不能为空") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime investigateTime; + + + @ApiModelProperty(value = "持证残疾人数-视力") + private Integer certificateEyesight = 0; + + @ApiModelProperty(value = "持证残疾人数-智力") + private Integer certificateIntellect = 0; + + @ApiModelProperty(value = "持证残疾人数-肢体") + private Integer certificateLimb = 0; + + @ApiModelProperty(value = "持证残疾人数-言语") + private Integer certificateSpeech = 0; + + @ApiModelProperty(value = "持证残疾人数-听力") + private Integer certificateHearing = 0; + + @ApiModelProperty(value = "持证残疾人数-精神") + private Integer certificateSpirit = 0; + + @ApiModelProperty(value = "持证残疾人数-多重") + private Integer certificateMultiple = 0; + + @ApiModelProperty(value = "残疾人工作者队伍人数-市残联") + private Integer workerCity = 0; + + @ApiModelProperty(value = "残疾人工作者队伍人数-五大专门协会") + private Integer workerAssociation = 0; + + @ApiModelProperty(value = "残疾人工作者队伍人数-攀狮服务队") + private Integer workerServiceCorps = 0; + + @ApiModelProperty(value = "残疾人工作者队伍人数-县区残联") + private Integer workerCounty = 0; + + @ApiModelProperty(value = "残疾人工作者队伍人数-乡镇残联") + private Integer workerTownship = 0; + + @ApiModelProperty(value = "残疾人工作者队伍人数-村社区残联") + private Integer workerVillage = 0; + + @ApiModelProperty(value = "残疾儿童康复训练人数-孤独症") + private Integer drillAutism = 0; + + @ApiModelProperty(value = "残疾儿童康复训练人数-智力") + private Integer drillIntellect = 0; + + @ApiModelProperty(value = "残疾儿童康复训练人数-肢体") + private Integer drillLimb = 0; + + @ApiModelProperty(value = "残疾儿童康复训练人数-言语") + private Integer drillSpeech = 0; + + @ApiModelProperty(value = "残疾儿童康复训练人数-听力") + private Integer drillHearing = 0; + + @ApiModelProperty(value = "残疾儿童康复训练人数-精神") + private Integer drillSpirit = 0; + + @ApiModelProperty(value = "残疾儿童康复救助人数-0-6岁") + private Integer salvationBeforeSeven = 0; + + @ApiModelProperty(value = "残疾儿童康复救助人数-7岁之后") + private Integer salvationAfterSeven = 0; + + @ApiModelProperty(value = "残疾儿童康复救助人数-孤独症") + private Integer salvationAutism = 0; + + @ApiModelProperty(value = "残疾儿童康复救助人数-智力") + private Integer salvationIntellect = 0; + + @ApiModelProperty(value = "残疾儿童康复救助人数-肢体") + private Integer salvationLimb = 0; + + @ApiModelProperty(value = "残疾儿童康复救助人数-言语") + private Integer salvationSpeech = 0; + + @ApiModelProperty(value = "困难精神残疾人医疗救助人数-门诊服药") + private Integer difficultyMedication = 0; + + @ApiModelProperty(value = "困难精神残疾人医疗救助人数-住院治疗") + private Integer difficultyHospitalisation = 0; + + @ApiModelProperty(value = "残疾人基本辅助器具适配补贴人数-补贴总人数") + private Integer assistiveDeviceTotal = 0; + + @ApiModelProperty(value = "残疾人基本辅助器具适配补贴人数-辅具一") + private Integer assistiveDeviceOne = 0; + + @ApiModelProperty(value = "残疾人基本辅助器具适配补贴人数-辅具二") + private Integer assistiveDeviceTwo = 0; + + @ApiModelProperty(value = "残疾人基本辅助器具适配补贴人数-辅具三") + private Integer assistiveDeviceThree = 0; + + @ApiModelProperty(value = "残疾人基本辅助器具适配补贴人数-其他") + private Integer assistiveDeviceOther = 0; + + @ApiModelProperty(value = "残疾人基本辅助器具适配补贴人数-类别一") + private Integer assistiveDeviceTypeOne = 0; + + @ApiModelProperty(value = "残疾人基本辅助器具适配补贴人数-类别二") + private Integer assistiveDeviceTypeTwo = 0; + + @ApiModelProperty(value = "残疾人基本辅助器具适配补贴人数-类别三") + private Integer assistiveDeviceTypeThree = 0; + + @ApiModelProperty(value = "残疾人基本辅助器具适配补贴人数-类别四") + private Integer assistiveDeviceTypeFour = 0; + + @ApiModelProperty(value = "残疾人基本辅助器具适配补贴人数-等级一") + private Integer assistiveDeviceGradeOne = 0; + + @ApiModelProperty(value = "残疾人基本辅助器具适配补贴人数-等级二") + private Integer assistiveDeviceGradeTwo = 0; + + @ApiModelProperty(value = "残疾人基本辅助器具适配补贴人数-等级三") + private Integer assistiveDeviceGradeThree = 0; + + @ApiModelProperty(value = "残疾人基本辅助器具适配补贴人数-等级四") + private Integer assistiveDeviceGradeFour = 0; + + @ApiModelProperty(value = "职业技能和实用技术培训人数") + private Integer technicalTraining = 0; + + @ApiModelProperty(value = "居家灵活就业及一次性创业补贴发放数") + private Integer homeAllowance = 0; + + @ApiModelProperty(value = "法定就业年龄段持证残疾人数占比-视力") + private Integer statutoryCertificateEyesight = 0; + + @ApiModelProperty(value = "法定就业年龄段持证残疾人数占比-智力") + private Integer statutoryCertificateIntellect = 0; + + @ApiModelProperty(value = "法定就业年龄段持证残疾人数占比-肢体") + private Integer statutoryCertificateLimb = 0; + + @ApiModelProperty(value = "法定就业年龄段持证残疾人数占比-言语") + private Integer statutoryCertificateSpeech = 0; + + @ApiModelProperty(value = "法定就业年龄段持证残疾人数占比-听力") + private Integer statutoryCertificateHearing = 0; + + @ApiModelProperty(value = "已就业残疾人数-就业") + private Integer employedEmployment = 0; + + @ApiModelProperty(value = "已就业残疾人数-集中就业") + private Integer employedConcentrated = 0; + + @ApiModelProperty(value = "已就业残疾人数-公益性岗位") + private Integer employedPublicWelfare = 0; + + @ApiModelProperty(value = "已就业残疾人数-辅助性就业") + private Integer employedAuxiliary = 0; + + @ApiModelProperty(value = "已就业残疾人数-个体就业") + private Integer employedIndividual = 0; + + @ApiModelProperty(value = "应届高校残疾毕业生数-就业") + private Integer highSchoolEmployment = 0; + + @ApiModelProperty(value = "应届高校残疾毕业生数-个体就业") + private Integer highSchoolIndividual = 0; + + @ApiModelProperty(value = "应届高校残疾毕业生数-灵活就业") + private Integer highSchoolFlexible = 0; + + @ApiModelProperty(value = "适龄残疾儿童少年义务教育-一年级") + private Integer educationOne = 0; + + @ApiModelProperty(value = "适龄残疾儿童少年义务教育-二年级") + private Integer educationTwo = 0; + + @ApiModelProperty(value = "适龄残疾儿童少年义务教育-三年级") + private Integer educationThree = 0; + + @ApiModelProperty(value = "适龄残疾儿童少年义务教育-四年级") + private Integer educationFour = 0; + + @ApiModelProperty(value = "适龄残疾儿童少年义务教育-五年级") + private Integer educationFive = 0; + + @ApiModelProperty(value = "适龄残疾儿童少年义务教育-六年级") + private Integer educationSix = 0; + + @ApiModelProperty(value = "适龄残疾儿童少年义务教育-七年级") + private Integer educationSeven = 0; + + @ApiModelProperty(value = "适龄残疾儿童少年义务教育-八年级") + private Integer educationEight = 0; + + @ApiModelProperty(value = "适龄残疾儿童少年义务教育-九年级") + private Integer educationNine = 0; + + @ApiModelProperty(value = "九年义务教育在读残疾儿童生活补贴发放数") + private Integer educationSubsidy = 0; + + @ApiModelProperty(value = "公益文体活动-开展次数") + private Integer activityFrequency = 0; + + @ApiModelProperty(value = "公益文体活动-参加人数") + private Integer educationNumber = 0; + + @ApiModelProperty(value = "服务”一件事“办件数") + private Integer matter = 0; + + @ApiModelProperty(value = "家庭医生签约增值服务数") + private Integer doctorApprecitation = 0; + + @ApiModelProperty(value = "困难重度残疾人家庭无障碍改造实施改造户数") + private Integer remould = 0; + + @ApiModelProperty(value = "残疾人接访情况-办公室接访") + private Integer interviewsOffice = 0; + + @ApiModelProperty(value = "残疾人接访情况-电话接访") + private Integer interviewsPhone = 0; + + @ApiModelProperty(value = "残疾人接访情况-上级交办") + private Integer interviewsSuperior = 0; + + @ApiModelProperty(value = "残疾人接访情况-12345交办") + private Integer interviewsHotline = 0; +} diff --git a/src/main/java/com/cl/pojo/dto/AddInstitutionDTO.java b/src/main/java/com/cl/pojo/dto/AddInstitutionDTO.java new file mode 100644 index 0000000..39f119b --- /dev/null +++ b/src/main/java/com/cl/pojo/dto/AddInstitutionDTO.java @@ -0,0 +1,38 @@ +package com.cl.pojo.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.Max; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +@Data +@ApiModel("添加机构") +public class AddInstitutionDTO { + @Min(value = 1,message = "区县选择范围为1-5") + @Max(value = 5,message = "区县选择范围为1-5") + @NotNull(message = "区县选择不能为空") + @ApiModelProperty(value = "区县,1-东区,2-西区,3-仁和区,4-米易县,5-盐边县") + private Integer county; + + @Min(value = 1,message = "机构类型选择范围为1-2") + @Max(value = 2,message = "机构类型选择范围为1-2") + @NotNull(message = "机构类型选择不能为空") + @ApiModelProperty(value = "机构类型,1-残疾人定点康复机构,2-残疾人友好医疗机构") + private Integer type; + + @NotEmpty(message = "机构名称不能为空") + @ApiModelProperty(value = "机构名称") + private String name; + + @NotEmpty(message = "详细地址不能为空") + @ApiModelProperty(value = "详细地址") + private String address; + + @NotEmpty(message = "联系电话不能为空") + @ApiModelProperty(value = "联系电话") + private String phone; +} diff --git a/src/main/java/com/cl/pojo/dto/AddUserDTO.java b/src/main/java/com/cl/pojo/dto/AddUserDTO.java new file mode 100644 index 0000000..dccdf55 --- /dev/null +++ b/src/main/java/com/cl/pojo/dto/AddUserDTO.java @@ -0,0 +1,16 @@ +package com.cl.pojo.dto; + +import lombok.Data; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.Pattern; + +@Data +public class AddUserDTO { + @NotEmpty(message = "姓名不能为空") + private String name; + @NotEmpty(message = "联系方式不能为空") + @Pattern(regexp = "^1[3-9]\\d{9}$", message = "手机号格式不正确") + private String phone; + + private String remark;//备注 +} diff --git a/src/main/java/com/cl/pojo/dto/EditInstitutionDTO.java b/src/main/java/com/cl/pojo/dto/EditInstitutionDTO.java new file mode 100644 index 0000000..cecb460 --- /dev/null +++ b/src/main/java/com/cl/pojo/dto/EditInstitutionDTO.java @@ -0,0 +1,12 @@ +package com.cl.pojo.dto; + +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotNull; +@Getter +@Setter +public class EditInstitutionDTO extends AddInstitutionDTO{ + @NotNull(message = "id不能为空") + private Integer id; +} diff --git a/src/main/java/com/cl/pojo/dto/EditUserDTO.java b/src/main/java/com/cl/pojo/dto/EditUserDTO.java new file mode 100644 index 0000000..58de706 --- /dev/null +++ b/src/main/java/com/cl/pojo/dto/EditUserDTO.java @@ -0,0 +1,16 @@ +package com.cl.pojo.dto; + + +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + + +import javax.validation.constraints.NotNull; + +@Getter +@Setter +public class EditUserDTO extends AddUserDTO { + @NotNull(message = "用户id不能为空") + private Integer id; +} diff --git a/src/main/java/com/cl/pojo/dto/LoginDTO.java b/src/main/java/com/cl/pojo/dto/LoginDTO.java new file mode 100644 index 0000000..14244dc --- /dev/null +++ b/src/main/java/com/cl/pojo/dto/LoginDTO.java @@ -0,0 +1,16 @@ +package com.cl.pojo.dto; + +import io.swagger.annotations.ApiModel; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import java.io.Serializable; +@Data +@ApiModel("登录") +public class LoginDTO implements Serializable { + private static final long serialVersionUID = 1L; + @NotEmpty(message = "手机号不能为空") + private String phone; + @NotEmpty(message = "密码不能为空") + private String password; +} diff --git a/src/main/java/com/cl/pojo/dto/PasswordDTO.java b/src/main/java/com/cl/pojo/dto/PasswordDTO.java new file mode 100644 index 0000000..e17699a --- /dev/null +++ b/src/main/java/com/cl/pojo/dto/PasswordDTO.java @@ -0,0 +1,13 @@ +package com.cl.pojo.dto; + +import lombok.Data; + +import javax.validation.constraints.NotEmpty; + +@Data +public class PasswordDTO { + @NotEmpty(message = "旧密码不能为空") + private String password; + @NotEmpty(message = "新密码不能为空") + private String newPassword; +} diff --git a/src/main/java/com/cl/pojo/entity/DataEntity.java b/src/main/java/com/cl/pojo/entity/DataEntity.java new file mode 100644 index 0000000..490ebc4 --- /dev/null +++ b/src/main/java/com/cl/pojo/entity/DataEntity.java @@ -0,0 +1,263 @@ +package com.cl.pojo.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.Date; + +@Data +@ApiModel("数据上报表") +@TableName("t_data") +public class DataEntity { + @TableId(type = IdType.AUTO) + @ApiModelProperty(value = "主键") + private Integer id; + + @ApiModelProperty(value = "区县,1-东区,2-西区,3-仁和区,4-米易县,5-盐边县") + private Integer county; + + @ApiModelProperty(value = "调研时间") + private LocalDateTime investigateTime; + + @ApiModelProperty(value = "创建者、调研者") + private Integer createBy; + + @ApiModelProperty(value = "创建时间") + private LocalDateTime createTime; + + @ApiModelProperty(value = "更新者") + private Integer updateBy; + + @ApiModelProperty(value = "更新时间") + private LocalDateTime updateTime; + + @ApiModelProperty(value = "删除标志,0-未删除,1-删除") + private Integer delFlag; + + @ApiModelProperty(value = "持证残疾人数-视力") + private Integer certificateEyesight; + + @ApiModelProperty(value = "持证残疾人数-智力") + private Integer certificateIntellect; + + @ApiModelProperty(value = "持证残疾人数-肢体") + private Integer certificateLimb; + + @ApiModelProperty(value = "持证残疾人数-言语") + private Integer certificateSpeech; + + @ApiModelProperty(value = "持证残疾人数-听力") + private Integer certificateHearing; + + @ApiModelProperty(value = "持证残疾人数-精神") + private Integer certificateSpirit; + + @ApiModelProperty(value = "持证残疾人数-多重") + private Integer certificateMultiple; + + @ApiModelProperty(value = "残疾人工作者队伍人数-市残联") + private Integer workerCity; + + @ApiModelProperty(value = "残疾人工作者队伍人数-五大专门协会") + private Integer workerAssociation; + + @ApiModelProperty(value = "残疾人工作者队伍人数-攀狮服务队") + private Integer workerServiceCorps; + + @ApiModelProperty(value = "残疾人工作者队伍人数-县区残联") + private Integer workerCounty; + + @ApiModelProperty(value = "残疾人工作者队伍人数-乡镇残联") + private Integer workerTownship; + + @ApiModelProperty(value = "残疾人工作者队伍人数-村社区残联") + private Integer workerVillage; + + @ApiModelProperty(value = "残疾儿童康复训练人数-孤独症") + private Integer drillAutism; + + @ApiModelProperty(value = "残疾儿童康复训练人数-智力") + private Integer drillIntellect; + + @ApiModelProperty(value = "残疾儿童康复训练人数-肢体") + private Integer drillLimb; + + @ApiModelProperty(value = "残疾儿童康复训练人数-言语") + private Integer drillSpeech; + + @ApiModelProperty(value = "残疾儿童康复训练人数-听力") + private Integer drillHearing; + + @ApiModelProperty(value = "残疾儿童康复训练人数-精神") + private Integer drillSpirit; + + @ApiModelProperty(value = "残疾儿童康复救助人数-0-6岁") + private Integer salvationBeforeSeven; + + @ApiModelProperty(value = "残疾儿童康复救助人数-7岁之后") + private Integer salvationAfterSeven; + + @ApiModelProperty(value = "残疾儿童康复救助人数-孤独症") + private Integer salvationAutism; + + @ApiModelProperty(value = "残疾儿童康复救助人数-智力") + private Integer salvationIntellect; + + @ApiModelProperty(value = "残疾儿童康复救助人数-肢体") + private Integer salvationLimb; + + @ApiModelProperty(value = "残疾儿童康复救助人数-言语") + private Integer salvationSpeech; + + @ApiModelProperty(value = "困难精神残疾人医疗救助人数-门诊服药") + private Integer difficultyMedication; + + @ApiModelProperty(value = "困难精神残疾人医疗救助人数-住院治疗") + private Integer difficultyHospitalisation; + + @ApiModelProperty(value = "残疾人基本辅助器具适配补贴人数-补贴总人数") + private Integer assistiveDeviceTotal; + + @ApiModelProperty(value = "残疾人基本辅助器具适配补贴人数-辅具一") + private Integer assistiveDeviceOne; + + @ApiModelProperty(value = "残疾人基本辅助器具适配补贴人数-辅具二") + private Integer assistiveDeviceTwo; + + @ApiModelProperty(value = "残疾人基本辅助器具适配补贴人数-辅具三") + private Integer assistiveDeviceThree; + + @ApiModelProperty(value = "残疾人基本辅助器具适配补贴人数-其他") + private Integer assistiveDeviceOther; + + @ApiModelProperty(value = "残疾人基本辅助器具适配补贴人数-类别一") + private Integer assistiveDeviceTypeOne; + + @ApiModelProperty(value = "残疾人基本辅助器具适配补贴人数-类别二") + private Integer assistiveDeviceTypeTwo; + + @ApiModelProperty(value = "残疾人基本辅助器具适配补贴人数-类别三") + private Integer assistiveDeviceTypeThree; + + @ApiModelProperty(value = "残疾人基本辅助器具适配补贴人数-类别四") + private Integer assistiveDeviceTypeFour; + + @ApiModelProperty(value = "残疾人基本辅助器具适配补贴人数-等级一") + private Integer assistiveDeviceGradeOne; + + @ApiModelProperty(value = "残疾人基本辅助器具适配补贴人数-等级二") + private Integer assistiveDeviceGradeTwo; + + @ApiModelProperty(value = "残疾人基本辅助器具适配补贴人数-等级三") + private Integer assistiveDeviceGradeThree; + + @ApiModelProperty(value = "残疾人基本辅助器具适配补贴人数-等级四") + private Integer assistiveDeviceGradeFour; + + @ApiModelProperty(value = "职业技能和实用技术培训人数") + private Integer technicalTraining; + + @ApiModelProperty(value = "居家灵活就业及一次性创业补贴发放数") + private Integer homeAllowance; + + @ApiModelProperty(value = "法定就业年龄段持证残疾人数占比-视力") + private Integer statutoryCertificateEyesight; + + @ApiModelProperty(value = "法定就业年龄段持证残疾人数占比-智力") + private Integer statutoryCertificateIntellect; + + @ApiModelProperty(value = "法定就业年龄段持证残疾人数占比-肢体") + private Integer statutoryCertificateLimb; + + @ApiModelProperty(value = "法定就业年龄段持证残疾人数占比-言语") + private Integer statutoryCertificateSpeech; + + @ApiModelProperty(value = "法定就业年龄段持证残疾人数占比-听力") + private Integer statutoryCertificateHearing; + + @ApiModelProperty(value = "已就业残疾人数-就业") + private Integer employedEmployment; + + @ApiModelProperty(value = "已就业残疾人数-集中就业") + private Integer employedConcentrated; + + @ApiModelProperty(value = "已就业残疾人数-公益性岗位") + private Integer employedPublicWelfare; + + @ApiModelProperty(value = "已就业残疾人数-辅助性就业") + private Integer employedAuxiliary; + + @ApiModelProperty(value = "已就业残疾人数-个体就业") + private Integer employedIndividual; + + @ApiModelProperty(value = "应届高校残疾毕业生数-就业") + private Integer highSchoolEmployment; + + @ApiModelProperty(value = "应届高校残疾毕业生数-个体就业") + private Integer highSchoolIndividual; + + @ApiModelProperty(value = "应届高校残疾毕业生数-灵活就业") + private Integer highSchoolFlexible; + + @ApiModelProperty(value = "适龄残疾儿童少年义务教育-一年级") + private Integer educationOne; + + @ApiModelProperty(value = "适龄残疾儿童少年义务教育-二年级") + private Integer educationTwo; + + @ApiModelProperty(value = "适龄残疾儿童少年义务教育-三年级") + private Integer educationThree; + + @ApiModelProperty(value = "适龄残疾儿童少年义务教育-四年级") + private Integer educationFour; + + @ApiModelProperty(value = "适龄残疾儿童少年义务教育-五年级") + private Integer educationFive; + + @ApiModelProperty(value = "适龄残疾儿童少年义务教育-六年级") + private Integer educationSix; + + @ApiModelProperty(value = "适龄残疾儿童少年义务教育-七年级") + private Integer educationSeven; + + @ApiModelProperty(value = "适龄残疾儿童少年义务教育-八年级") + private Integer educationEight; + + @ApiModelProperty(value = "适龄残疾儿童少年义务教育-九年级") + private Integer educationNine; + + @ApiModelProperty(value = "九年义务教育在读残疾儿童生活补贴发放数") + private Integer educationSubsidy; + + @ApiModelProperty(value = "公益文体活动-开展次数") + private Integer activityFrequency; + + @ApiModelProperty(value = "公益文体活动-参加人数") + private Integer educationNumber; + + @ApiModelProperty(value = "服务”一件事“办件数") + private Integer matter; + + @ApiModelProperty(value = "家庭医生签约增值服务数") + private Integer doctorApprecitation; + + @ApiModelProperty(value = "困难重度残疾人家庭无障碍改造实施改造户数") + private Integer remould; + + @ApiModelProperty(value = "残疾人接访情况-办公室接访") + private Integer interviewsOffice; + + @ApiModelProperty(value = "残疾人接访情况-电话接访") + private Integer interviewsPhone; + + @ApiModelProperty(value = "残疾人接访情况-上级交办") + private Integer interviewsSuperior; + + @ApiModelProperty(value = "残疾人接访情况-12345交办") + private Integer interviewsHotline; +} \ No newline at end of file diff --git a/src/main/java/com/cl/pojo/entity/Institution.java b/src/main/java/com/cl/pojo/entity/Institution.java new file mode 100644 index 0000000..f4aaa7e --- /dev/null +++ b/src/main/java/com/cl/pojo/entity/Institution.java @@ -0,0 +1,46 @@ +package com.cl.pojo.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +@ApiModel("机构表") +@TableName("t_institution") +public class Institution { + @ApiModelProperty(value = "机构ID") + private Integer id; + + @ApiModelProperty(value = "区县,1-东区,2-西区,3-仁和区,4-米易县,5-盐边县") + private Integer county; + + @ApiModelProperty(value = "机构类型,1-残疾人定点康复机构,2-残疾人友好医疗机构") + private Integer type; + + @ApiModelProperty(value = "机构名称") + private String name; + + @ApiModelProperty(value = "详细地址") + private String address; + + @ApiModelProperty(value = "联系电话") + private String phone; + + @ApiModelProperty(value = "删除标志(0代表存在 1代表删除)") + private Integer delFlag; + + @ApiModelProperty(value = "创建者") + private Integer createBy; + + @ApiModelProperty(value = "创建时间") + private LocalDateTime createTime; + + @ApiModelProperty(value = "更新者") + private Integer updateBy; + + @ApiModelProperty(value = "更新时间") + private LocalDateTime updateTime; +} diff --git a/src/main/java/com/cl/pojo/entity/User.java b/src/main/java/com/cl/pojo/entity/User.java new file mode 100644 index 0000000..4f5db81 --- /dev/null +++ b/src/main/java/com/cl/pojo/entity/User.java @@ -0,0 +1,53 @@ +package com.cl.pojo.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +@Data +@TableName("t_user") +@ApiModel("用户表") +public class User implements Serializable { + private static final long serialVersionUID = 1L; + @TableId(type = IdType.AUTO) + @ApiModelProperty(value = "用户ID") + private Integer id; + + @ApiModelProperty(value = "手机号") + private String phone; + + @ApiModelProperty(value = "姓名") + private String name; + + @ApiModelProperty(value = "密码") + private String password; + + @ApiModelProperty(value = "帐号状态(0正常 1停用)") + private Integer status; + + @ApiModelProperty(value = "删除标志(0代表存在 1代表删除)") + private Integer delFlag; + + @ApiModelProperty(value = "创建者") + private Integer createBy; + + @ApiModelProperty(value = "创建时间") + private LocalDateTime createTime; + + @ApiModelProperty(value = "更新者") + private Integer updateBy; + + @ApiModelProperty(value = "更新时间") + private LocalDateTime updateTime; + + @ApiModelProperty(value = "备注") + private String remark; + @ApiModelProperty(value = "是否第一次登录/重置密码后登录,0-否,1-是") + private Integer isFirst; +} diff --git a/src/main/java/com/cl/pojo/vo/DataDetailVO.java b/src/main/java/com/cl/pojo/vo/DataDetailVO.java new file mode 100644 index 0000000..527feb1 --- /dev/null +++ b/src/main/java/com/cl/pojo/vo/DataDetailVO.java @@ -0,0 +1,17 @@ +package com.cl.pojo.vo; + + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@ApiModel("查看数据详情VO") +@Data +public class DataDetailVO { + @ApiModelProperty("详情数据") + private EditDataDTO data; + @ApiModelProperty("上次填报") + private EditDataDTO beforeData; + @ApiModelProperty("同比增加减少") + private DataRateVO rateVO; +} diff --git a/src/main/java/com/cl/pojo/vo/DataRateVO.java b/src/main/java/com/cl/pojo/vo/DataRateVO.java new file mode 100644 index 0000000..9d074a8 --- /dev/null +++ b/src/main/java/com/cl/pojo/vo/DataRateVO.java @@ -0,0 +1,233 @@ +package com.cl.pojo.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel("比率VO") +public class DataRateVO { + @ApiModelProperty(value = "持证残疾人数-视力") + private String certificateEyesight; + + @ApiModelProperty(value = "持证残疾人数-智力") + private String certificateIntellect; + + @ApiModelProperty(value = "持证残疾人数-肢体") + private String certificateLimb; + + + @ApiModelProperty(value = "持证残疾人数-言语") + private String certificateSpeech; + + @ApiModelProperty(value = "持证残疾人数-听力") + private String certificateHearing; + + @ApiModelProperty(value = "持证残疾人数-精神") + private String certificateSpirit; + + @ApiModelProperty(value = "持证残疾人数-多重") + private String certificateMultiple; + + @ApiModelProperty(value = "残疾人工作者队伍人数-市残联") + private String workerCity; + + @ApiModelProperty(value = "残疾人工作者队伍人数-五大专门协会") + private String workerAssociation; + + @ApiModelProperty(value = "残疾人工作者队伍人数-攀狮服务队") + private String workerServiceCorps; + + @ApiModelProperty(value = "残疾人工作者队伍人数-县区残联") + private String workerCounty; + + @ApiModelProperty(value = "残疾人工作者队伍人数-乡镇残联") + private String workerTownship; + + @ApiModelProperty(value = "残疾人工作者队伍人数-村社区残联") + private String workerVillage; + + @ApiModelProperty(value = "残疾儿童康复训练人数-孤独症") + private String drillAutism; + + @ApiModelProperty(value = "残疾儿童康复训练人数-智力") + private String drillIntellect; + + @ApiModelProperty(value = "残疾儿童康复训练人数-肢体") + private String drillLimb; + + @ApiModelProperty(value = "残疾儿童康复训练人数-言语") + private String drillSpeech; + + @ApiModelProperty(value = "残疾儿童康复训练人数-听力") + private String drillHearing; + + @ApiModelProperty(value = "残疾儿童康复训练人数-精神") + private String drillSpirit; + + @ApiModelProperty(value = "残疾儿童康复救助人数-0-6岁") + private String salvationBeforeSeven; + + @ApiModelProperty(value = "残疾儿童康复救助人数-7岁之后") + private String salvationAfterSeven; + + @ApiModelProperty(value = "残疾儿童康复救助人数-孤独症") + private String salvationAutism; + + @ApiModelProperty(value = "残疾儿童康复救助人数-智力") + private String salvationIntellect; + + @ApiModelProperty(value = "残疾儿童康复救助人数-肢体") + private String salvationLimb; + + @ApiModelProperty(value = "残疾儿童康复救助人数-言语") + private String salvationSpeech; + + @ApiModelProperty(value = "困难精神残疾人医疗救助人数-门诊服药") + private String difficultyMedication; + + @ApiModelProperty(value = "困难精神残疾人医疗救助人数-住院治疗") + private String difficultyHospitalisation; + + @ApiModelProperty(value = "残疾人基本辅助器具适配补贴人数-补贴总人数") + private String assistiveDeviceTotal; + + @ApiModelProperty(value = "残疾人基本辅助器具适配补贴人数-辅具一") + private String assistiveDeviceOne; + + @ApiModelProperty(value = "残疾人基本辅助器具适配补贴人数-辅具二") + private String assistiveDeviceTwo; + + @ApiModelProperty(value = "残疾人基本辅助器具适配补贴人数-辅具三") + private String assistiveDeviceThree; + + @ApiModelProperty(value = "残疾人基本辅助器具适配补贴人数-其他") + private String assistiveDeviceOther; + + @ApiModelProperty(value = "残疾人基本辅助器具适配补贴人数-类别一") + private String assistiveDeviceTypeOne; + + @ApiModelProperty(value = "残疾人基本辅助器具适配补贴人数-类别二") + private String assistiveDeviceTypeTwo; + + @ApiModelProperty(value = "残疾人基本辅助器具适配补贴人数-类别三") + private String assistiveDeviceTypeThree; + + @ApiModelProperty(value = "残疾人基本辅助器具适配补贴人数-类别四") + private String assistiveDeviceTypeFour; + + @ApiModelProperty(value = "残疾人基本辅助器具适配补贴人数-等级一") + private String assistiveDeviceGradeOne; + + @ApiModelProperty(value = "残疾人基本辅助器具适配补贴人数-等级二") + private String assistiveDeviceGradeTwo; + + @ApiModelProperty(value = "残疾人基本辅助器具适配补贴人数-等级三") + private String assistiveDeviceGradeThree; + + @ApiModelProperty(value = "残疾人基本辅助器具适配补贴人数-等级四") + private String assistiveDeviceGradeFour; + + @ApiModelProperty(value = "职业技能和实用技术培训人数") + private String technicalTraining; + + @ApiModelProperty(value = "居家灵活就业及一次性创业补贴发放数") + private String homeAllowance; + + @ApiModelProperty(value = "法定就业年龄段持证残疾人数占比-视力") + private String statutoryCertificateEyesight; + + @ApiModelProperty(value = "法定就业年龄段持证残疾人数占比-智力") + private String statutoryCertificateIntellect; + + @ApiModelProperty(value = "法定就业年龄段持证残疾人数占比-肢体") + private String statutoryCertificateLimb; + + @ApiModelProperty(value = "法定就业年龄段持证残疾人数占比-言语") + private String statutoryCertificateSpeech; + + @ApiModelProperty(value = "法定就业年龄段持证残疾人数占比-听力") + private String statutoryCertificateHearing; + + @ApiModelProperty(value = "已就业残疾人数-就业") + private String employedEmployment; + + @ApiModelProperty(value = "已就业残疾人数-集中就业") + private String employedConcentrated; + + @ApiModelProperty(value = "已就业残疾人数-公益性岗位") + private String employedPublicWelfare; + + @ApiModelProperty(value = "已就业残疾人数-辅助性就业") + private String employedAuxiliary; + + @ApiModelProperty(value = "已就业残疾人数-个体就业") + private String employedIndividual; + + @ApiModelProperty(value = "应届高校残疾毕业生数-就业") + private String highSchoolEmployment; + + @ApiModelProperty(value = "应届高校残疾毕业生数-个体就业") + private String highSchoolIndividual; + + @ApiModelProperty(value = "应届高校残疾毕业生数-灵活就业") + private String highSchoolFlexible; + + @ApiModelProperty(value = "适龄残疾儿童少年义务教育-一年级") + private String educationOne; + + @ApiModelProperty(value = "适龄残疾儿童少年义务教育-二年级") + private String educationTwo; + + @ApiModelProperty(value = "适龄残疾儿童少年义务教育-三年级") + private String educationThree; + + @ApiModelProperty(value = "适龄残疾儿童少年义务教育-四年级") + private String educationFour; + + @ApiModelProperty(value = "适龄残疾儿童少年义务教育-五年级") + private String educationFive; + + @ApiModelProperty(value = "适龄残疾儿童少年义务教育-六年级") + private String educationSix; + + @ApiModelProperty(value = "适龄残疾儿童少年义务教育-七年级") + private String educationSeven; + + @ApiModelProperty(value = "适龄残疾儿童少年义务教育-八年级") + private String educationEight; + + @ApiModelProperty(value = "适龄残疾儿童少年义务教育-九年级") + private String educationNine; + + @ApiModelProperty(value = "九年义务教育在读残疾儿童生活补贴发放数") + private String educationSubsidy; + + @ApiModelProperty(value = "公益文体活动-开展次数") + private String activityFrequency; + + @ApiModelProperty(value = "公益文体活动-参加人数") + private String educationNumber; + + @ApiModelProperty(value = "服务”一件事“办件数") + private String matter; + + @ApiModelProperty(value = "家庭医生签约增值服务数") + private String doctorApprecitation; + + @ApiModelProperty(value = "困难重度残疾人家庭无障碍改造实施改造户数") + private String remould; + + @ApiModelProperty(value = "残疾人接访情况-办公室接访") + private String interviewsOffice; + + @ApiModelProperty(value = "残疾人接访情况-电话接访") + private String interviewsPhone; + + @ApiModelProperty(value = "残疾人接访情况-上级交办") + private String interviewsSuperior; + + @ApiModelProperty(value = "残疾人接访情况-12345交办") + private String interviewsHotline; + +} diff --git a/src/main/java/com/cl/pojo/vo/DataVO.java b/src/main/java/com/cl/pojo/vo/DataVO.java new file mode 100644 index 0000000..4d02bdb --- /dev/null +++ b/src/main/java/com/cl/pojo/vo/DataVO.java @@ -0,0 +1,33 @@ +package com.cl.pojo.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +@ApiModel("大屏分页VO") +public class DataVO { + @ApiModelProperty(value = "区县,1-东区,2-西区,3-仁和区,4-米易县,5-盐边县") + private Integer county; + + @ApiModelProperty(value = "调研时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime investigateTime; + + @ApiModelProperty(value = "上报时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createTime; + + @ApiModelProperty(value = "上报人") + private String createName; + + @ApiModelProperty(value = "最近更新时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateTime; + + @ApiModelProperty(value = "更新操作人") + private String updateName; +} diff --git a/src/main/java/com/cl/pojo/vo/EditDataDTO.java b/src/main/java/com/cl/pojo/vo/EditDataDTO.java new file mode 100644 index 0000000..37d1593 --- /dev/null +++ b/src/main/java/com/cl/pojo/vo/EditDataDTO.java @@ -0,0 +1,14 @@ +package com.cl.pojo.vo; + +import com.cl.pojo.dto.AddDataDTO; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotNull; + +@Getter +@Setter +public class EditDataDTO extends AddDataDTO { + @NotNull(message = "修改数据id不能为空") + private Integer id; +} diff --git a/src/main/java/com/cl/pojo/vo/InstitutionVO.java b/src/main/java/com/cl/pojo/vo/InstitutionVO.java new file mode 100644 index 0000000..6108db7 --- /dev/null +++ b/src/main/java/com/cl/pojo/vo/InstitutionVO.java @@ -0,0 +1,20 @@ +package com.cl.pojo.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel("机构VO") +public class InstitutionVO { + @ApiModelProperty(value = "机构ID") + private Integer id; + @ApiModelProperty(value = "机构名称") + private String name; + @ApiModelProperty(value = "机构类型,1-残疾人定点康复机构,2-残疾人友好医疗机构") + private Integer type; + @ApiModelProperty(value = "区县,1-东区,2-西区,3-仁和区,4-米易县,5-盐边县") + private Integer county; + @ApiModelProperty(value = "联系电话") + private String phone; +} diff --git a/src/main/java/com/cl/pojo/vo/UserVO.java b/src/main/java/com/cl/pojo/vo/UserVO.java new file mode 100644 index 0000000..0b35c62 --- /dev/null +++ b/src/main/java/com/cl/pojo/vo/UserVO.java @@ -0,0 +1,21 @@ +package com.cl.pojo.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import lombok.Data; + +@Data +@ApiModel("用户VO") +public class UserVO { + @ApiModelProperty("主键") + private Integer id; + @ApiModelProperty("姓名") + private String name; + @ApiModelProperty("联系方式") + private String phone; + @ApiModelProperty("备注") + private String remark; + @ApiModelProperty("状态:0-正常,1-停用") + private Integer status; +} diff --git a/src/main/java/com/cl/pojo/vo/screen/AssistiveDeviceGradeVO.java b/src/main/java/com/cl/pojo/vo/screen/AssistiveDeviceGradeVO.java new file mode 100644 index 0000000..2b70d90 --- /dev/null +++ b/src/main/java/com/cl/pojo/vo/screen/AssistiveDeviceGradeVO.java @@ -0,0 +1,21 @@ +package com.cl.pojo.vo.screen; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@ApiModel("残疾人基本辅助器具适配补贴人数-等级VO") +@Data +public class AssistiveDeviceGradeVO { + @ApiModelProperty(value = "残疾人基本辅助器具适配补贴人数-等级一") + private Integer assistiveDeviceGradeOne; + + @ApiModelProperty(value = "残疾人基本辅助器具适配补贴人数-等级二") + private Integer assistiveDeviceGradeTwo; + + @ApiModelProperty(value = "残疾人基本辅助器具适配补贴人数-等级三") + private Integer assistiveDeviceGradeThree; + + @ApiModelProperty(value = "残疾人基本辅助器具适配补贴人数-等级四") + private Integer assistiveDeviceGradeFour; +} diff --git a/src/main/java/com/cl/pojo/vo/screen/AssistiveDeviceTypeVO.java b/src/main/java/com/cl/pojo/vo/screen/AssistiveDeviceTypeVO.java new file mode 100644 index 0000000..8ba90e2 --- /dev/null +++ b/src/main/java/com/cl/pojo/vo/screen/AssistiveDeviceTypeVO.java @@ -0,0 +1,21 @@ +package com.cl.pojo.vo.screen; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@ApiModel("残疾人基本辅助器具适配补贴人数-各残疾类别VO") +@Data +public class AssistiveDeviceTypeVO { + @ApiModelProperty(value = "残疾人基本辅助器具适配补贴人数-类别一") + private Integer assistiveDeviceTypeOne; + + @ApiModelProperty(value = "残疾人基本辅助器具适配补贴人数-类别二") + private Integer assistiveDeviceTypeTwo; + + @ApiModelProperty(value = "残疾人基本辅助器具适配补贴人数-类别三") + private Integer assistiveDeviceTypeThree; + + @ApiModelProperty(value = "残疾人基本辅助器具适配补贴人数-类别四") + private Integer assistiveDeviceTypeFour; +} diff --git a/src/main/java/com/cl/pojo/vo/screen/AssistiveDeviceVO.java b/src/main/java/com/cl/pojo/vo/screen/AssistiveDeviceVO.java new file mode 100644 index 0000000..a06f59a --- /dev/null +++ b/src/main/java/com/cl/pojo/vo/screen/AssistiveDeviceVO.java @@ -0,0 +1,22 @@ +package com.cl.pojo.vo.screen; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@ApiModel("残疾人基本辅助器具适配补贴人数-各辅具VO") +@Data +public class AssistiveDeviceVO { + @ApiModelProperty(value = "残疾人基本辅助器具适配补贴人数-辅具一") + private Integer assistiveDeviceOne; + + @ApiModelProperty(value = "残疾人基本辅助器具适配补贴人数-辅具二") + private Integer assistiveDeviceTwo; + + @ApiModelProperty(value = "残疾人基本辅助器具适配补贴人数-辅具三") + private Integer assistiveDeviceThree; + + @ApiModelProperty(value = "残疾人基本辅助器具适配补贴人数-其他") + private Integer assistiveDeviceOther; + +} diff --git a/src/main/java/com/cl/pojo/vo/screen/CertificateVO.java b/src/main/java/com/cl/pojo/vo/screen/CertificateVO.java new file mode 100644 index 0000000..f61d68f --- /dev/null +++ b/src/main/java/com/cl/pojo/vo/screen/CertificateVO.java @@ -0,0 +1,30 @@ +package com.cl.pojo.vo.screen; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@ApiModel("持证残疾人数VO") +@Data +public class CertificateVO { + @ApiModelProperty(value = "持证残疾人数-视力") + private Integer certificateEyesight; + + @ApiModelProperty(value = "持证残疾人数-智力") + private Integer certificateIntellect; + + @ApiModelProperty(value = "持证残疾人数-肢体") + private Integer certificateLimb; + + @ApiModelProperty(value = "持证残疾人数-言语") + private Integer certificateSpeech; + + @ApiModelProperty(value = "持证残疾人数-听力") + private Integer certificateHearing; + + @ApiModelProperty(value = "持证残疾人数-精神") + private Integer certificateSpirit; + + @ApiModelProperty(value = "持证残疾人数-多重") + private Integer certificateMultiple; +} diff --git a/src/main/java/com/cl/pojo/vo/screen/DifficultyVO.java b/src/main/java/com/cl/pojo/vo/screen/DifficultyVO.java new file mode 100644 index 0000000..4c1dd2f --- /dev/null +++ b/src/main/java/com/cl/pojo/vo/screen/DifficultyVO.java @@ -0,0 +1,15 @@ +package com.cl.pojo.vo.screen; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@ApiModel("困难精神残疾人医疗救助人数VO") +@Data +public class DifficultyVO { + @ApiModelProperty(value = "困难精神残疾人医疗救助人数-门诊服药") + private Integer difficultyMedication; + + @ApiModelProperty(value = "困难精神残疾人医疗救助人数-住院治疗") + private Integer difficultyHospitalisation; +} diff --git a/src/main/java/com/cl/pojo/vo/screen/DrillVO.java b/src/main/java/com/cl/pojo/vo/screen/DrillVO.java new file mode 100644 index 0000000..ee60f50 --- /dev/null +++ b/src/main/java/com/cl/pojo/vo/screen/DrillVO.java @@ -0,0 +1,27 @@ +package com.cl.pojo.vo.screen; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@ApiModel("残疾儿童康复训练人数VO") +@Data +public class DrillVO { + @ApiModelProperty(value = "残疾儿童康复训练人数-孤独症") + private Integer drillAutism; + + @ApiModelProperty(value = "残疾儿童康复训练人数-智力") + private Integer drillIntellect; + + @ApiModelProperty(value = "残疾儿童康复训练人数-肢体") + private Integer drillLimb; + + @ApiModelProperty(value = "残疾儿童康复训练人数-言语") + private Integer drillSpeech; + + @ApiModelProperty(value = "残疾儿童康复训练人数-听力") + private Integer drillHearing; + + @ApiModelProperty(value = "残疾儿童康复训练人数-精神") + private Integer drillSpirit; +} diff --git a/src/main/java/com/cl/pojo/vo/screen/EducationVO.java b/src/main/java/com/cl/pojo/vo/screen/EducationVO.java new file mode 100644 index 0000000..88ae009 --- /dev/null +++ b/src/main/java/com/cl/pojo/vo/screen/EducationVO.java @@ -0,0 +1,36 @@ +package com.cl.pojo.vo.screen; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@ApiModel("右下角模块数据VO") +@Data +public class EducationVO { + @ApiModelProperty(value = "适龄残疾儿童少年义务教育-一年级") + private Integer educationOne; + + @ApiModelProperty(value = "适龄残疾儿童少年义务教育-二年级") + private Integer educationTwo; + + @ApiModelProperty(value = "适龄残疾儿童少年义务教育-三年级") + private Integer educationThree; + + @ApiModelProperty(value = "适龄残疾儿童少年义务教育-四年级") + private Integer educationFour; + + @ApiModelProperty(value = "适龄残疾儿童少年义务教育-五年级") + private Integer educationFive; + + @ApiModelProperty(value = "适龄残疾儿童少年义务教育-六年级") + private Integer educationSix; + + @ApiModelProperty(value = "适龄残疾儿童少年义务教育-七年级") + private Integer educationSeven; + + @ApiModelProperty(value = "适龄残疾儿童少年义务教育-八年级") + private Integer educationEight; + + @ApiModelProperty(value = "适龄残疾儿童少年义务教育-九年级") + private Integer educationNine; +} diff --git a/src/main/java/com/cl/pojo/vo/screen/EmployedVO.java b/src/main/java/com/cl/pojo/vo/screen/EmployedVO.java new file mode 100644 index 0000000..3873485 --- /dev/null +++ b/src/main/java/com/cl/pojo/vo/screen/EmployedVO.java @@ -0,0 +1,24 @@ +package com.cl.pojo.vo.screen; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@ApiModel("已就业残疾人数VO") +@Data +public class EmployedVO { + @ApiModelProperty(value = "已就业残疾人数-就业") + private Integer employedEmployment; + + @ApiModelProperty(value = "已就业残疾人数-集中就业") + private Integer employedConcentrated; + + @ApiModelProperty(value = "已就业残疾人数-公益性岗位") + private Integer employedPublicWelfare; + + @ApiModelProperty(value = "已就业残疾人数-辅助性就业") + private Integer employedAuxiliary; + + @ApiModelProperty(value = "已就业残疾人数-个体就业") + private Integer employedIndividual; +} diff --git a/src/main/java/com/cl/pojo/vo/screen/HighSchoolVO.java b/src/main/java/com/cl/pojo/vo/screen/HighSchoolVO.java new file mode 100644 index 0000000..abbb634 --- /dev/null +++ b/src/main/java/com/cl/pojo/vo/screen/HighSchoolVO.java @@ -0,0 +1,18 @@ +package com.cl.pojo.vo.screen; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@ApiModel("应届高校残疾毕业生数VO") +@Data +public class HighSchoolVO { + @ApiModelProperty(value = "应届高校残疾毕业生数-就业") + private Integer highSchoolEmployment; + + @ApiModelProperty(value = "应届高校残疾毕业生数-个体就业") + private Integer highSchoolIndividual; + + @ApiModelProperty(value = "应届高校残疾毕业生数-灵活就业") + private Integer highSchoolFlexible; +} diff --git a/src/main/java/com/cl/pojo/vo/screen/RightDownVO.java b/src/main/java/com/cl/pojo/vo/screen/RightDownVO.java new file mode 100644 index 0000000..a0ec9cd --- /dev/null +++ b/src/main/java/com/cl/pojo/vo/screen/RightDownVO.java @@ -0,0 +1,36 @@ +package com.cl.pojo.vo.screen; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@ApiModel("大屏数据") +@Data +public class RightDownVO { + @ApiModelProperty(value = "公益文体活动-开展次数") + private Integer activityFrequency; + + @ApiModelProperty(value = "公益文体活动-参加人数") + private Integer educationNumber; + + @ApiModelProperty(value = "服务”一件事“办件数") + private Integer matter; + + @ApiModelProperty(value = "家庭医生签约增值服务数") + private Integer doctorApprecitation; + + @ApiModelProperty(value = "困难重度残疾人家庭无障碍改造实施改造户数") + private Integer remould; + + @ApiModelProperty(value = "残疾人接访情况-办公室接访") + private Integer interviewsOffice; + + @ApiModelProperty(value = "残疾人接访情况-电话接访") + private Integer interviewsPhone; + + @ApiModelProperty(value = "残疾人接访情况-上级交办") + private Integer interviewsSuperior; + + @ApiModelProperty(value = "残疾人接访情况-12345交办") + private Integer interviewsHotline; +} diff --git a/src/main/java/com/cl/pojo/vo/screen/SalvationVO.java b/src/main/java/com/cl/pojo/vo/screen/SalvationVO.java new file mode 100644 index 0000000..f8b5db4 --- /dev/null +++ b/src/main/java/com/cl/pojo/vo/screen/SalvationVO.java @@ -0,0 +1,27 @@ +package com.cl.pojo.vo.screen; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@ApiModel("残疾儿童康复救助人数VO") +@Data +public class SalvationVO { + @ApiModelProperty(value = "残疾儿童康复救助人数-0-6岁") + private Integer salvationBeforeSeven; + + @ApiModelProperty(value = "残疾儿童康复救助人数-7岁之后") + private Integer salvationAfterSeven; + + @ApiModelProperty(value = "残疾儿童康复救助人数-孤独症") + private Integer salvationAutism; + + @ApiModelProperty(value = "残疾儿童康复救助人数-智力") + private Integer salvationIntellect; + + @ApiModelProperty(value = "残疾儿童康复救助人数-肢体") + private Integer salvationLimb; + + @ApiModelProperty(value = "残疾儿童康复救助人数-言语") + private Integer salvationSpeech; +} diff --git a/src/main/java/com/cl/pojo/vo/screen/ScreenVO.java b/src/main/java/com/cl/pojo/vo/screen/ScreenVO.java new file mode 100644 index 0000000..6850d73 --- /dev/null +++ b/src/main/java/com/cl/pojo/vo/screen/ScreenVO.java @@ -0,0 +1,62 @@ +package com.cl.pojo.vo.screen; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.Date; + +@ApiModel("大屏数据") +@Data +public class ScreenVO { + @ApiModelProperty("持证残疾人数") + private CertificateVO certificateVO; + @ApiModelProperty("残疾人工作者队伍人数") + private WorkerVO workerVO; + @ApiModelProperty("残疾儿童康复训练人数") + private DrillVO drillVO; + @ApiModelProperty("残疾儿童康复救助人数") + private SalvationVO salvationVO; + @ApiModelProperty("困难精神残疾人医疗救助人数") + private DifficultyVO difficultyVO; + + @ApiModelProperty(value = "残疾人基本辅助器具适配补贴人数-补贴总人数") + private Integer assistiveDeviceTotal; + @ApiModelProperty(value = "残疾人基本辅助器具适配补贴人数-旁边时间") + @JsonFormat(pattern = "yyyy") + private LocalDateTime createTime; + + + @ApiModelProperty(value = "残疾人基本辅助器具适配补贴人数-各辅具") + private AssistiveDeviceVO assistiveDeviceVO; + @ApiModelProperty(value = "残疾人基本辅助器具适配补贴人数-各残疾类别") + private AssistiveDeviceTypeVO assistiveDeviceTypeVO; + @ApiModelProperty(value = "残疾人基本辅助器具适配补贴人数-各残疾等级") + private AssistiveDeviceGradeVO assistiveDeviceGradeVO; + + @ApiModelProperty(value = "职业技能和实用技术培训人数") + private Integer technicalTraining; + @ApiModelProperty(value = "居家灵活就业及一次性创业补贴发放数") + private Integer homeAllowance; + + @ApiModelProperty(value = "法定就业年龄段持证残疾人数占比") + private StatutoryCertificateVO statutoryCertificateVO; + @ApiModelProperty(value = "已就业残疾人数") + private EmployedVO employedVO; + @ApiModelProperty(value = "应届高校残疾毕业生数") + private HighSchoolVO highSchoolVO; + @ApiModelProperty(value = "适龄残疾儿童少年义务教育") + private EducationVO educationVO; + + @ApiModelProperty(value = "九年义务教育在读残疾儿童生活补贴发放数") + private Integer educationSubsidy; + + @ApiModelProperty(value = "右下角模块数据") + private RightDownVO rightDownVO; + + + + +} diff --git a/src/main/java/com/cl/pojo/vo/screen/StatutoryCertificateVO.java b/src/main/java/com/cl/pojo/vo/screen/StatutoryCertificateVO.java new file mode 100644 index 0000000..14d5677 --- /dev/null +++ b/src/main/java/com/cl/pojo/vo/screen/StatutoryCertificateVO.java @@ -0,0 +1,24 @@ +package com.cl.pojo.vo.screen; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@ApiModel("法定就业年龄段持证残疾人数占比VO") +@Data +public class StatutoryCertificateVO { + @ApiModelProperty(value = "法定就业年龄段持证残疾人数占比-视力") + private Integer statutoryCertificateEyesight; + + @ApiModelProperty(value = "法定就业年龄段持证残疾人数占比-智力") + private Integer statutoryCertificateIntellect; + + @ApiModelProperty(value = "法定就业年龄段持证残疾人数占比-肢体") + private Integer statutoryCertificateLimb; + + @ApiModelProperty(value = "法定就业年龄段持证残疾人数占比-言语") + private Integer statutoryCertificateSpeech; + + @ApiModelProperty(value = "法定就业年龄段持证残疾人数占比-听力") + private Integer statutoryCertificateHearing; +} diff --git a/src/main/java/com/cl/pojo/vo/screen/WorkerVO.java b/src/main/java/com/cl/pojo/vo/screen/WorkerVO.java new file mode 100644 index 0000000..d167b1d --- /dev/null +++ b/src/main/java/com/cl/pojo/vo/screen/WorkerVO.java @@ -0,0 +1,27 @@ +package com.cl.pojo.vo.screen; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@ApiModel("残疾人工作者队伍人数VO") +@Data +public class WorkerVO { + @ApiModelProperty(value = "残疾人工作者队伍人数-市残联") + private Integer workerCity; + + @ApiModelProperty(value = "残疾人工作者队伍人数-五大专门协会") + private Integer workerAssociation; + + @ApiModelProperty(value = "残疾人工作者队伍人数-攀狮服务队") + private Integer workerServiceCorps; + + @ApiModelProperty(value = "残疾人工作者队伍人数-县区残联") + private Integer workerCounty; + + @ApiModelProperty(value = "残疾人工作者队伍人数-乡镇残联") + private Integer workerTownship; + + @ApiModelProperty(value = "残疾人工作者队伍人数-村社区残联") + private Integer workerVillage; +} diff --git a/src/main/java/com/cl/service/DataService.java b/src/main/java/com/cl/service/DataService.java new file mode 100644 index 0000000..a00caa0 --- /dev/null +++ b/src/main/java/com/cl/service/DataService.java @@ -0,0 +1,25 @@ +package com.cl.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import com.cl.pojo.dto.AddDataDTO; + +import com.cl.pojo.entity.DataEntity; +import com.cl.pojo.vo.DataDetailVO; +import com.cl.pojo.vo.DataVO; +import com.cl.pojo.vo.EditDataDTO; +import com.cl.pojo.vo.screen.ScreenVO; + +public interface DataService extends IService<DataEntity> { + ScreenVO screen(Integer county); + + void add( AddDataDTO addDataDTO); + + IPage<DataVO> pageList(IPage<DataEntity> page, Integer county, String name); + + void delete(Integer id); + + void edit( EditDataDTO editDataDTO); + + DataDetailVO detail(Integer id); +} diff --git a/src/main/java/com/cl/service/InstitutionService.java b/src/main/java/com/cl/service/InstitutionService.java new file mode 100644 index 0000000..16f3d34 --- /dev/null +++ b/src/main/java/com/cl/service/InstitutionService.java @@ -0,0 +1,25 @@ +package com.cl.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import com.cl.pojo.dto.AddInstitutionDTO; +import com.cl.pojo.dto.EditInstitutionDTO; +import com.cl.pojo.entity.Institution; +import com.cl.pojo.vo.InstitutionVO; + +import javax.validation.Valid; +import java.util.List; + +public interface InstitutionService extends IService<Institution> { + void add(@Valid AddInstitutionDTO addDTO); + + IPage<InstitutionVO> pageList(IPage<Institution> page, Integer county, String name); + + InstitutionVO read(Integer id); + + void edit(@Valid EditInstitutionDTO editDTO); + + void delete(Integer id); + + List<InstitutionVO> getAll(Integer county); +} diff --git a/src/main/java/com/cl/service/UserService.java b/src/main/java/com/cl/service/UserService.java new file mode 100644 index 0000000..addf3d7 --- /dev/null +++ b/src/main/java/com/cl/service/UserService.java @@ -0,0 +1,27 @@ +package com.cl.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import com.cl.pojo.dto.AddUserDTO; +import com.cl.pojo.dto.EditUserDTO; +import com.cl.pojo.dto.PasswordDTO; +import com.cl.pojo.entity.User; +import com.cl.pojo.vo.UserVO; + +import javax.validation.Valid; + + + +public interface UserService extends IService<User> { + void addUser(AddUserDTO addUserDTO); + + IPage<UserVO> pageList(IPage<User> page, String name, String phone); + + void editUser(@Valid EditUserDTO editUserDTO); + + void password(PasswordDTO passwordDTO,String token); + + void resetPassword(Integer id); + + void frozen(Integer id); +} diff --git a/src/main/java/com/cl/service/impl/DataServiceImpl.java b/src/main/java/com/cl/service/impl/DataServiceImpl.java new file mode 100644 index 0000000..7ca97a4 --- /dev/null +++ b/src/main/java/com/cl/service/impl/DataServiceImpl.java @@ -0,0 +1,281 @@ +package com.cl.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.cl.common.constant.DelFlagConstant; +import com.cl.common.context.BaseContext; +import com.cl.common.exception.data.DataException; +import com.cl.mapper.DataMapper; +import com.cl.pojo.dto.AddDataDTO; +import com.cl.pojo.entity.DataEntity; +import com.cl.pojo.vo.DataDetailVO; +import com.cl.pojo.vo.DataRateVO; +import com.cl.pojo.vo.DataVO; +import com.cl.pojo.vo.EditDataDTO; +import com.cl.pojo.vo.screen.*; +import com.cl.service.DataService; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import java.text.DecimalFormat; +import java.time.LocalDateTime; + +@Service +public class DataServiceImpl extends ServiceImpl<DataMapper, DataEntity> implements DataService { + + private final DataMapper dataMapper; + + public DataServiceImpl(DataMapper dataMapper) { + this.dataMapper = dataMapper; + } + + @Override + public ScreenVO screen(Integer county) { + ScreenVO screenVO = new ScreenVO(); + DataEntity data =dataMapper.screen(county); + screenVO.setAssistiveDeviceTotal(data.getAssistiveDeviceTotal()); + screenVO.setCreateTime(data.getCreateTime()); + screenVO.setTechnicalTraining(data.getTechnicalTraining()); + screenVO.setHomeAllowance(data.getHomeAllowance()); + screenVO.setEducationSubsidy(data.getEducationSubsidy()); + + CertificateVO certificateVO = new CertificateVO(); + BeanUtils.copyProperties(data,certificateVO); + screenVO.setCertificateVO(certificateVO); + + WorkerVO workerVO = new WorkerVO(); + BeanUtils.copyProperties(data,workerVO); + screenVO.setWorkerVO(workerVO); + + DrillVO drillVO = new DrillVO(); + BeanUtils.copyProperties(data,drillVO); + screenVO.setDrillVO(drillVO); + + SalvationVO salvationVO = new SalvationVO(); + BeanUtils.copyProperties(data,salvationVO); + screenVO.setSalvationVO(salvationVO); + + DifficultyVO difficultyVO = new DifficultyVO(); + BeanUtils.copyProperties(data,difficultyVO); + screenVO.setDifficultyVO(difficultyVO); + + AssistiveDeviceVO assistiveDeviceVO = new AssistiveDeviceVO(); + BeanUtils.copyProperties(data,assistiveDeviceVO); + screenVO.setAssistiveDeviceVO(assistiveDeviceVO); + + AssistiveDeviceTypeVO assistiveDeviceTypeVO = new AssistiveDeviceTypeVO(); + BeanUtils.copyProperties(data,assistiveDeviceTypeVO); + screenVO.setAssistiveDeviceTypeVO(assistiveDeviceTypeVO); + + AssistiveDeviceGradeVO assistiveDeviceGradeVO = new AssistiveDeviceGradeVO(); + BeanUtils.copyProperties(data,assistiveDeviceGradeVO); + screenVO.setAssistiveDeviceGradeVO(assistiveDeviceGradeVO); + + StatutoryCertificateVO statutoryCertificateVO = new StatutoryCertificateVO(); + BeanUtils.copyProperties(data,statutoryCertificateVO); + screenVO.setStatutoryCertificateVO(statutoryCertificateVO); + + EmployedVO employedVO = new EmployedVO(); + BeanUtils.copyProperties(data,employedVO); + screenVO.setEmployedVO(employedVO); + + HighSchoolVO highSchoolVO = new HighSchoolVO(); + BeanUtils.copyProperties(data,highSchoolVO); + screenVO.setHighSchoolVO(highSchoolVO); + + EducationVO educationVO = new EducationVO(); + BeanUtils.copyProperties(data,educationVO); + screenVO.setEducationVO(educationVO); + + RightDownVO rightDownVO = new RightDownVO(); + BeanUtils.copyProperties(data,rightDownVO); + screenVO.setRightDownVO(rightDownVO); + + return screenVO; + } + + @Override + public void add(AddDataDTO addDataDTO) { + DataEntity dataEntity = new DataEntity(); + BeanUtils.copyProperties(addDataDTO,dataEntity); + dataEntity.setCreateTime(LocalDateTime.now()); + dataEntity.setCreateBy(BaseContext.getCurrentUser().getId()); + int insert = dataMapper.insert(dataEntity); + if (insert != 1) { + throw new DataException("保存数据失败"); + } + } + + @Override + public IPage<DataVO> pageList(IPage<DataEntity> page, Integer county, String name) { + return dataMapper.pageList(page,county,name); + } + + @Override + public void delete(Integer id) { + LambdaQueryWrapper<DataEntity> queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(DataEntity::getId,id); + queryWrapper.eq(DataEntity::getDelFlag, DelFlagConstant.UNDELETE); + DataEntity dataEntity = dataMapper.selectOne(queryWrapper); + if (dataEntity == null) { + throw new DataException("删除数据失败,数据不存在"); + } + dataEntity.setDelFlag(DelFlagConstant.DELETE); + dataEntity.setUpdateTime(LocalDateTime.now()); + dataEntity.setUpdateBy(BaseContext.getCurrentUser().getId()); + int i = dataMapper.updateById(dataEntity); + if (i != 1) { + throw new DataException("删除失败"); + } + } + + @Override + public void edit(EditDataDTO editDataDTO) { + LambdaQueryWrapper<DataEntity> queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(DataEntity::getId,editDataDTO.getId()); + queryWrapper.eq(DataEntity::getDelFlag, DelFlagConstant.UNDELETE); + DataEntity data = dataMapper.selectOne(queryWrapper); + if (data == null) { + throw new DataException("修改数据失败,数据id不存在"); + } + DataEntity dataEntity = new DataEntity(); + BeanUtils.copyProperties(editDataDTO,dataEntity); + dataEntity.setUpdateTime(LocalDateTime.now()); + dataEntity.setUpdateBy(BaseContext.getCurrentUser().getId()); + int i = dataMapper.updateById(dataEntity); + if (i != 1) { + throw new DataException("修改失败"); + } + } + + @Override + public DataDetailVO detail(Integer id) { + LambdaQueryWrapper<DataEntity> queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(DataEntity::getId,id); + queryWrapper.eq(DataEntity::getDelFlag, DelFlagConstant.UNDELETE); + DataEntity dataEntity = dataMapper.selectOne(queryWrapper); + if (dataEntity == null) { + throw new DataException("该条数据不存在"); + } + DataDetailVO dataDetailVO = new DataDetailVO(); + //当前数据 + EditDataDTO data=new EditDataDTO(); + BeanUtils.copyProperties(dataEntity,data); + dataDetailVO.setData(data); + //当前数据的前一条数据 + EditDataDTO beforeData=new EditDataDTO(); + DataEntity beforeDataEntity= dataMapper.beforeOne(id); + if (beforeDataEntity != null) { + BeanUtils.copyProperties(beforeDataEntity,beforeData); + } + dataDetailVO.setBeforeData(beforeData); + //计算比率 + DataRateVO dataRateVO = getRateVO(data,beforeData); + dataDetailVO.setRateVO(dataRateVO); + return dataDetailVO; + } + + private DataRateVO getRateVO(EditDataDTO data, EditDataDTO beforeData) { + if (beforeData == null || beforeData.equals(new EditDataDTO())) { + return null; + } + DataRateVO dataRateVO = new DataRateVO(); + //计算每个字段 + dataRateVO.setCertificateEyesight(calcRate(data.getCertificateEyesight(),beforeData.getCertificateEyesight())); + dataRateVO.setCertificateIntellect(calcRate(data.getCertificateIntellect(),beforeData.getCertificateIntellect())); + dataRateVO.setCertificateLimb(calcRate(data.getCertificateLimb(),beforeData.getCertificateLimb())); + dataRateVO.setCertificateSpeech(calcRate(data.getCertificateSpeech(), beforeData.getCertificateSpeech())); + dataRateVO.setCertificateHearing(calcRate(data.getCertificateHearing(), beforeData.getCertificateHearing())); + dataRateVO.setCertificateSpirit(calcRate(data.getCertificateSpirit(), beforeData.getCertificateSpirit())); + dataRateVO.setCertificateMultiple(calcRate(data.getCertificateMultiple(), beforeData.getCertificateMultiple())); + dataRateVO.setWorkerCity(calcRate(data.getWorkerCity(), beforeData.getWorkerCity())); + dataRateVO.setWorkerAssociation(calcRate(data.getWorkerAssociation(), beforeData.getWorkerAssociation())); + dataRateVO.setWorkerServiceCorps(calcRate(data.getWorkerServiceCorps(), beforeData.getWorkerServiceCorps())); + dataRateVO.setWorkerCounty(calcRate(data.getWorkerCounty(), beforeData.getWorkerCounty())); + dataRateVO.setWorkerTownship(calcRate(data.getWorkerTownship(), beforeData.getWorkerTownship())); + dataRateVO.setWorkerVillage(calcRate(data.getWorkerVillage(), beforeData.getWorkerVillage())); + dataRateVO.setDrillAutism(calcRate(data.getDrillAutism(), beforeData.getDrillAutism())); + dataRateVO.setDrillIntellect(calcRate(data.getDrillIntellect(), beforeData.getDrillIntellect())); + dataRateVO.setDrillLimb(calcRate(data.getDrillLimb(), beforeData.getDrillLimb())); + dataRateVO.setDrillSpeech(calcRate(data.getDrillSpeech(), beforeData.getDrillSpeech())); + dataRateVO.setDrillHearing(calcRate(data.getDrillHearing(), beforeData.getDrillHearing())); + dataRateVO.setDrillSpirit(calcRate(data.getDrillSpirit(), beforeData.getDrillSpirit())); + dataRateVO.setSalvationBeforeSeven(calcRate(data.getSalvationBeforeSeven(), beforeData.getSalvationBeforeSeven())); + dataRateVO.setSalvationAfterSeven(calcRate(data.getSalvationAfterSeven(), beforeData.getSalvationAfterSeven())); + dataRateVO.setSalvationAutism(calcRate(data.getSalvationAutism(), beforeData.getSalvationAutism())); + dataRateVO.setSalvationIntellect(calcRate(data.getSalvationIntellect(), beforeData.getSalvationIntellect())); + dataRateVO.setSalvationLimb(calcRate(data.getSalvationLimb(), beforeData.getSalvationLimb())); + dataRateVO.setSalvationSpeech(calcRate(data.getSalvationSpeech(), beforeData.getSalvationSpeech())); + dataRateVO.setDifficultyMedication(calcRate(data.getDifficultyMedication(), beforeData.getDifficultyMedication())); + dataRateVO.setDifficultyHospitalisation(calcRate(data.getDifficultyHospitalisation(), beforeData.getDifficultyHospitalisation())); + dataRateVO.setAssistiveDeviceTotal(calcRate(data.getAssistiveDeviceTotal(), beforeData.getAssistiveDeviceTotal())); + dataRateVO.setAssistiveDeviceOne(calcRate(data.getAssistiveDeviceOne(), beforeData.getAssistiveDeviceOne())); + dataRateVO.setAssistiveDeviceTwo(calcRate(data.getAssistiveDeviceTwo(), beforeData.getAssistiveDeviceTwo())); + dataRateVO.setAssistiveDeviceThree(calcRate(data.getAssistiveDeviceThree(), beforeData.getAssistiveDeviceThree())); + dataRateVO.setAssistiveDeviceOther(calcRate(data.getAssistiveDeviceOther(), beforeData.getAssistiveDeviceOther())); + dataRateVO.setAssistiveDeviceTypeOne(calcRate(data.getAssistiveDeviceTypeOne(), beforeData.getAssistiveDeviceTypeOne())); + dataRateVO.setAssistiveDeviceTypeTwo(calcRate(data.getAssistiveDeviceTypeTwo(), beforeData.getAssistiveDeviceTypeTwo())); + dataRateVO.setAssistiveDeviceTypeThree(calcRate(data.getAssistiveDeviceTypeThree(), beforeData.getAssistiveDeviceTypeThree())); + dataRateVO.setAssistiveDeviceTypeFour(calcRate(data.getAssistiveDeviceTypeFour(), beforeData.getAssistiveDeviceTypeFour())); + dataRateVO.setAssistiveDeviceGradeOne(calcRate(data.getAssistiveDeviceGradeOne(), beforeData.getAssistiveDeviceGradeOne())); + dataRateVO.setAssistiveDeviceGradeTwo(calcRate(data.getAssistiveDeviceGradeTwo(), beforeData.getAssistiveDeviceGradeTwo())); + dataRateVO.setAssistiveDeviceGradeThree(calcRate(data.getAssistiveDeviceGradeThree(), beforeData.getAssistiveDeviceGradeThree())); + dataRateVO.setAssistiveDeviceGradeFour(calcRate(data.getAssistiveDeviceGradeFour(), beforeData.getAssistiveDeviceGradeFour())); + dataRateVO.setTechnicalTraining(calcRate(data.getTechnicalTraining(), beforeData.getTechnicalTraining())); + dataRateVO.setHomeAllowance(calcRate(data.getHomeAllowance(), beforeData.getHomeAllowance())); + dataRateVO.setStatutoryCertificateEyesight(calcRate(data.getStatutoryCertificateEyesight(), beforeData.getStatutoryCertificateEyesight())); + dataRateVO.setStatutoryCertificateIntellect(calcRate(data.getStatutoryCertificateIntellect(), beforeData.getStatutoryCertificateIntellect())); + dataRateVO.setStatutoryCertificateLimb(calcRate(data.getStatutoryCertificateLimb(), beforeData.getStatutoryCertificateLimb())); + dataRateVO.setStatutoryCertificateSpeech(calcRate(data.getStatutoryCertificateSpeech(), beforeData.getStatutoryCertificateSpeech())); + dataRateVO.setStatutoryCertificateHearing(calcRate(data.getStatutoryCertificateHearing(), beforeData.getStatutoryCertificateHearing())); + dataRateVO.setEmployedEmployment(calcRate(data.getEmployedEmployment(), beforeData.getEmployedEmployment())); + dataRateVO.setEmployedConcentrated(calcRate(data.getEmployedConcentrated(), beforeData.getEmployedConcentrated())); + dataRateVO.setEmployedPublicWelfare(calcRate(data.getEmployedPublicWelfare(), beforeData.getEmployedPublicWelfare())); + dataRateVO.setEmployedAuxiliary(calcRate(data.getEmployedAuxiliary(), beforeData.getEmployedAuxiliary())); + dataRateVO.setEmployedIndividual(calcRate(data.getEmployedIndividual(), beforeData.getEmployedIndividual())); + dataRateVO.setHighSchoolEmployment(calcRate(data.getHighSchoolEmployment(), beforeData.getHighSchoolEmployment())); + dataRateVO.setHighSchoolIndividual(calcRate(data.getHighSchoolIndividual(), beforeData.getHighSchoolIndividual())); + dataRateVO.setHighSchoolFlexible(calcRate(data.getHighSchoolFlexible(), beforeData.getHighSchoolFlexible())); + dataRateVO.setEducationOne(calcRate(data.getEducationOne(), beforeData.getEducationOne())); + dataRateVO.setEducationTwo(calcRate(data.getEducationTwo(), beforeData.getEducationTwo())); + dataRateVO.setEducationThree(calcRate(data.getEducationThree(), beforeData.getEducationThree())); + dataRateVO.setEducationFour(calcRate(data.getEducationFour(), beforeData.getEducationFour())); + dataRateVO.setEducationFive(calcRate(data.getEducationFive(), beforeData.getEducationFive())); + dataRateVO.setEducationSix(calcRate(data.getEducationSix(), beforeData.getEducationSix())); + dataRateVO.setEducationSeven(calcRate(data.getEducationSeven(), beforeData.getEducationSeven())); + dataRateVO.setEducationEight(calcRate(data.getEducationEight(), beforeData.getEducationEight())); + dataRateVO.setEducationNine(calcRate(data.getEducationNine(), beforeData.getEducationNine())); + dataRateVO.setEducationSubsidy(calcRate(data.getEducationSubsidy(), beforeData.getEducationSubsidy())); + dataRateVO.setActivityFrequency(calcRate(data.getActivityFrequency(), beforeData.getActivityFrequency())); + dataRateVO.setEducationNumber(calcRate(data.getEducationNumber(), beforeData.getEducationNumber())); + dataRateVO.setMatter(calcRate(data.getMatter(), beforeData.getMatter())); + dataRateVO.setDoctorApprecitation(calcRate(data.getDoctorApprecitation(), beforeData.getDoctorApprecitation())); + dataRateVO.setRemould(calcRate(data.getRemould(), beforeData.getRemould())); + dataRateVO.setInterviewsOffice(calcRate(data.getInterviewsOffice(), beforeData.getInterviewsOffice())); + dataRateVO.setInterviewsPhone(calcRate(data.getInterviewsPhone(), beforeData.getInterviewsPhone())); + dataRateVO.setInterviewsSuperior(calcRate(data.getInterviewsSuperior(), beforeData.getInterviewsSuperior())); + dataRateVO.setInterviewsHotline(calcRate(data.getInterviewsHotline(), beforeData.getInterviewsHotline())); + return dataRateVO; + } + + private String calcRate(Integer currentValue, Integer previousValue) { + //去年的数据为0的情况 + if (previousValue == 0){ + return currentValue == 0 ? "同比持平" : "无同比数据"; + } + // 计算变化率 + double changeRate = (currentValue - previousValue) * 100.0 / previousValue; + // 格式化输出(保留两位小数,带正负号) + DecimalFormat df = new DecimalFormat("0.00"); + String absoluteValue = df.format(Math.abs(changeRate)); + if (changeRate > 0) { + return "同比增加" + absoluteValue + "%"; + } else if (changeRate < 0) { + return "同比减少" + absoluteValue + "%"; + } else { + return "同比持平"; + } + + } + +} diff --git a/src/main/java/com/cl/service/impl/InstitutionServiceImpl.java b/src/main/java/com/cl/service/impl/InstitutionServiceImpl.java new file mode 100644 index 0000000..8181bc4 --- /dev/null +++ b/src/main/java/com/cl/service/impl/InstitutionServiceImpl.java @@ -0,0 +1,103 @@ +package com.cl.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.cl.common.constant.DelFlagConstant; +import com.cl.common.context.BaseContext; +import com.cl.common.exception.institution.InstitutionException; +import com.cl.mapper.InstitutionMapper; +import com.cl.pojo.dto.AddInstitutionDTO; +import com.cl.pojo.dto.EditInstitutionDTO; +import com.cl.pojo.entity.Institution; +import com.cl.pojo.vo.InstitutionVO; +import com.cl.service.InstitutionService; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.util.List; + +@Service +public class InstitutionServiceImpl extends ServiceImpl<InstitutionMapper, Institution> implements InstitutionService { + @Autowired + private InstitutionMapper institutionMapper; + @Override + public void add(AddInstitutionDTO addDTO) { + Institution institution = new Institution(); + BeanUtils.copyProperties(addDTO, institution); + institution.setCreateBy(BaseContext.getCurrentUser().getId()); + institution.setCreateTime(LocalDateTime.now()); + boolean save = this.save(institution); + if (!save) { + throw new InstitutionException("机构新增保存失败"); + } + } + + @Override + public IPage<InstitutionVO> pageList(IPage<Institution> page, Integer county, String name) { + return institutionMapper.pageList(page,county,name); + } + + @Override + public InstitutionVO read(Integer id) { + LambdaQueryWrapper<Institution> queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(Institution::getId, id); + queryWrapper.eq(Institution::getDelFlag, DelFlagConstant.UNDELETE); + Institution institution = institutionMapper.selectOne(queryWrapper); + if (institution == null) { + throw new InstitutionException("机构id不存在"); + } + InstitutionVO institutionVO = new InstitutionVO(); + BeanUtils.copyProperties(institution, institutionVO); + return institutionVO; + } + + @Override + public void edit(EditInstitutionDTO editDTO) { + LambdaQueryWrapper<Institution> queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(Institution::getId, editDTO.getId()); + queryWrapper.eq(Institution::getDelFlag, DelFlagConstant.UNDELETE); + Institution institution = institutionMapper.selectOne(queryWrapper); + if (institution == null) { + throw new InstitutionException("机构id不存在"); + } + institution.setCounty(editDTO.getCounty()); + institution.setType(editDTO.getType()); + institution.setName(editDTO.getName()); + institution.setAddress(editDTO.getAddress()); + institution.setPhone(editDTO.getPhone()); + institution.setUpdateBy(BaseContext.getCurrentUser().getId()); + institution.setUpdateTime(LocalDateTime.now()); + int i = institutionMapper.updateById(institution); + if (i != 1) { + throw new InstitutionException("机构信息更新失败"); + } + } + + @Override + public void delete(Integer id) { + LambdaQueryWrapper<Institution> queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(Institution::getId, id); + queryWrapper.eq(Institution::getDelFlag, DelFlagConstant.UNDELETE); + Institution institution = institutionMapper.selectOne(queryWrapper); + if (institution == null) { + throw new InstitutionException("机构id不存在"); + } + institution.setDelFlag(DelFlagConstant.DELETE); + institution.setUpdateBy(BaseContext.getCurrentUser().getId()); + institution.setUpdateTime(LocalDateTime.now()); + int i = institutionMapper.updateById(institution); + if (i != 1) { + throw new InstitutionException("删除机构信息失败"); + } + } + + @Override + public List<InstitutionVO> getAll(Integer county) { + return institutionMapper.getAll(county); + } + + +} diff --git a/src/main/java/com/cl/service/impl/TokenBlacklistService.java b/src/main/java/com/cl/service/impl/TokenBlacklistService.java new file mode 100644 index 0000000..0db2a84 --- /dev/null +++ b/src/main/java/com/cl/service/impl/TokenBlacklistService.java @@ -0,0 +1,25 @@ +package com.cl.service.impl; + + +import org.springframework.stereotype.Service; + +import java.util.Collections; + +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + + +@Service +public class TokenBlacklistService { + // 使用ConcurrentHashMap或Redis存储黑名单 + private final Set<String> blacklist = Collections.newSetFromMap(new ConcurrentHashMap<>()); + + public void addToBlacklist(String token) { + blacklist.add(token); + } + + public boolean isBlacklisted(String token) { + return blacklist.contains(token); + } + +} \ No newline at end of file diff --git a/src/main/java/com/cl/service/impl/UserServiceImpl.java b/src/main/java/com/cl/service/impl/UserServiceImpl.java new file mode 100644 index 0000000..f29be67 --- /dev/null +++ b/src/main/java/com/cl/service/impl/UserServiceImpl.java @@ -0,0 +1,146 @@ +package com.cl.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.cl.common.constant.DelFlagConstant; +import com.cl.common.constant.StatusConstant; +import com.cl.common.context.BaseContext; +import com.cl.common.exception.user.AddUserException; +import com.cl.common.exception.user.UserException; +import com.cl.mapper.UserMapper; +import com.cl.pojo.dto.AddUserDTO; +import com.cl.pojo.dto.EditUserDTO; +import com.cl.pojo.dto.PasswordDTO; +import com.cl.pojo.entity.User; +import com.cl.pojo.vo.UserVO; +import com.cl.service.UserService; +import com.cl.util.BCryptPasswordEncoder; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.codec.digest.DigestUtils; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.util.Objects; + +@Service +@Slf4j +public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService { + private final UserMapper userMapper; + private final TokenBlacklistService tokenBlacklistService; + + public UserServiceImpl(UserMapper userMapper, TokenBlacklistService tokenBlacklistService) { + this.userMapper = userMapper; + this.tokenBlacklistService = tokenBlacklistService; + } + + @Override + public void addUser(AddUserDTO addUserDTO) { + String phone = addUserDTO.getPhone(); + //查询手机号是否存在 + User user1 = userMapper.selectOne(new LambdaQueryWrapper<User>().eq(User::getPhone, phone) + .eq(User::getDelFlag, DelFlagConstant.UNDELETE)); + if (user1 != null) { + throw new AddUserException("该用户已存在"); + } + log.info("开始添加用户:{}",addUserDTO); + User user = new User(); + user.setPhone(phone); + user.setName(addUserDTO.getName()); + user.setRemark(addUserDTO.getRemark()); + user.setPassword(BCryptPasswordEncoder.encode(DigestUtils.md5Hex(phone.substring(phone.length() - 6)))); + user.setCreateBy(BaseContext.getCurrentUser().getId()); + user.setCreateTime(LocalDateTime.now()); + + boolean save = this.save(user); + if (!save) { + throw new UserException("新增用户失败"); + } + } + + @Override + public IPage<UserVO> pageList(IPage<User> page, String name, String phone) { + return userMapper.pageList(page,name,phone); + + } + + @Override + public void editUser(EditUserDTO editUserDTO) { + User user = userMapper.selectById(editUserDTO.getId()); + if (user == null) { + throw new UserException("该用户不存在"); + } + LambdaUpdateWrapper<User> updateWrapper= new LambdaUpdateWrapper<>(); + updateWrapper.eq(User::getId, editUserDTO.getId()); + updateWrapper.set(User::getName, editUserDTO.getName()); + + User phoneUser = userMapper.selectOne(new LambdaQueryWrapper<User>().eq(User::getPhone, editUserDTO.getPhone()) + .eq(User::getDelFlag, DelFlagConstant.UNDELETE) + .ne(User::getId, editUserDTO.getId())); + if (phoneUser != null) { + throw new UserException("该手机号用户已存在"); + } + updateWrapper.set(User::getPhone, editUserDTO.getPhone()); + + updateWrapper.set(User::getRemark, editUserDTO.getRemark()); + updateWrapper.set(User::getUpdateBy, BaseContext.getCurrentUser().getPhone()); + updateWrapper.set(User::getUpdateTime, LocalDateTime.now()); + + int update = userMapper.update(new User(), updateWrapper); + if (update != 1) { + throw new UserException("修改用户失败"); + } + } + + @Override + public void password(PasswordDTO passwordDTO,String token) { + User user = userMapper.selectById(BaseContext.getCurrentUser().getId()); + //校验原密码 + if (!BCryptPasswordEncoder.matches(passwordDTO.getPassword(), user.getPassword())) { + //不通过 + throw new UserException("原密码错误"); + } + //修改密码 + user.setPassword(BCryptPasswordEncoder.encode(passwordDTO.getNewPassword())); + user.setUpdateBy(user.getId()); + user.setUpdateTime(LocalDateTime.now()); + boolean save = this.save(user); + if (!save) { + throw new UserException("修改密码失败"); + } + //将令牌加入黑名单 + tokenBlacklistService.addToBlacklist(token); + } + + @Override + public void resetPassword(Integer id) { + User user = userMapper.selectById(id); + if (null==user){ + throw new UserException("该用户不存在"); + } + user.setPassword(BCryptPasswordEncoder.encode(DigestUtils.md5Hex(user.getPhone().substring(user.getPhone().length() - 6)))); + user.setIsFirst(1); + user.setUpdateBy(BaseContext.getCurrentUser().getId()); + user.setUpdateTime(LocalDateTime.now()); + boolean save = this.save(user); + if (!save) { + throw new UserException("重置密码失败"); + } + } + + @Override + public void frozen(Integer id) { + User user = userMapper.selectById(id); + if (null==user){ + throw new UserException("用户不存在"); + } + user.setStatus(Objects.equals(user.getStatus(), StatusConstant.DISABLE) ? StatusConstant.ENABLE : StatusConstant.DISABLE); + user.setUpdateBy(BaseContext.getCurrentUser().getId()); + user.setUpdateTime(LocalDateTime.now()); + boolean save = this.save(user); + if (!save) { + throw new UserException("冻结/解冻用户失败"); + } + } +} diff --git a/src/main/java/com/cl/util/BCryptPasswordEncoder.java b/src/main/java/com/cl/util/BCryptPasswordEncoder.java new file mode 100644 index 0000000..e86d62a --- /dev/null +++ b/src/main/java/com/cl/util/BCryptPasswordEncoder.java @@ -0,0 +1,23 @@ +package com.cl.util; + +import org.apache.commons.codec.digest.DigestUtils; +import org.mindrot.jbcrypt.BCrypt; + +public class BCryptPasswordEncoder { + + // 加密密码(自动生成盐值) + public static String encode(String rawPassword) { + return BCrypt.hashpw(rawPassword, BCrypt.gensalt()); + } + + // 验证密码 + public static boolean matches(String rawPassword, String encodedPassword) { + return BCrypt.checkpw(rawPassword, encodedPassword); + } + + public static void main(String[] args) { + BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(); + System.out.println(encoder.encode("123456")); + System.out.println(DigestUtils.md5Hex("111111")); + } +} \ No newline at end of file diff --git a/src/main/java/com/cl/util/JwtUtil.java b/src/main/java/com/cl/util/JwtUtil.java new file mode 100644 index 0000000..c65b5b0 --- /dev/null +++ b/src/main/java/com/cl/util/JwtUtil.java @@ -0,0 +1,69 @@ +package com.cl.util; + +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.JwtBuilder; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import java.nio.charset.StandardCharsets; +import java.util.Date; +import java.util.Map; +@Component +public class JwtUtil { + + /** + * 用户生成jwt令牌相关配置 + */ + private static final String secretKey = "xx"; + private static final long ttl =7200000; + private static final String tokenName = "Authorization"; + + /** + * 生成jwt + * 使用Hs256算法, 私匙使用固定秘钥 + * @param claims 设置的信息 + * @return + */ + + public static String createJWT( Map<String, Object> claims) { + // 指定签名的时候使用的签名算法,也就是header那部分 + SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256; + + // 生成JWT的时间 + long expMillis = System.currentTimeMillis() + ttl; + Date exp = new Date(expMillis); + + // 设置jwt的body + JwtBuilder builder = Jwts.builder() + // 如果有私有声明,一定要先设置这个自己创建的私有的声明,这个是给builder的claim赋值,一旦写在标准的声明赋值之后,就是覆盖了那些标准的声明的 + .setClaims(claims) + // 设置签名使用的签名算法和签名使用的秘钥 + .signWith(signatureAlgorithm, secretKey.getBytes(StandardCharsets.UTF_8)) + // 设置过期时间 + .setExpiration(exp); + + return builder.compact(); + } + + /** + * Token解密 + * @param token 加密后的token + * @return + */ + public static Claims parseJWT( String token) { + // 得到DefaultJwtParser + Claims claims = Jwts.parser() + // 设置签名的秘钥 + .setSigningKey(secretKey.getBytes(StandardCharsets.UTF_8)) + // 设置需要解析的jwt + .parseClaimsJws(token).getBody(); + return claims; + } + + public String getTokenName() { + return tokenName; + } +} \ No newline at end of file diff --git a/src/main/java/com/cl/util/LoginAttempt.java b/src/main/java/com/cl/util/LoginAttempt.java new file mode 100644 index 0000000..b68d6bf --- /dev/null +++ b/src/main/java/com/cl/util/LoginAttempt.java @@ -0,0 +1,17 @@ +package com.cl.util; + +import lombok.Data; + +/** + * 系统缓存密码错误账号 + */ +@Data +public class LoginAttempt { + private final int lockCount;//次数 + private final long lastAttemptTime;//最后一次尝试时间 + + public LoginAttempt(int lockCount, long lastAttemptTime) { + this.lockCount = lockCount; + this.lastAttemptTime = lastAttemptTime; + } +} \ No newline at end of file diff --git a/src/main/java/com/cl/util/LoginAttemptService.java b/src/main/java/com/cl/util/LoginAttemptService.java new file mode 100644 index 0000000..8b1e667 --- /dev/null +++ b/src/main/java/com/cl/util/LoginAttemptService.java @@ -0,0 +1,60 @@ +package com.cl.util; + +import org.springframework.context.annotation.Bean; +import org.springframework.scheduling.annotation.Scheduled; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +// 使用ConcurrentHashMap作为临时存储 + +public class LoginAttemptService { + private static final int MAX_ATTEMPTS = 5; + private static final long LOCK_TIME_MS = 5 * 60 * 1000; // 5分钟 + + private final Map<String, LoginAttempt> attemptsCache = new ConcurrentHashMap<>(); + + /** + * 是否被锁了 + */ + public boolean isLocked(String phone) { + LoginAttempt attempt = attemptsCache.get(phone); + return attempt != null + && attempt.getLockCount() >= MAX_ATTEMPTS + && System.currentTimeMillis() < attempt.getLastAttemptTime() + LOCK_TIME_MS; + } + + /** + * 添加密码错误记录 + */ + public void recordFailedAttempt(String phone) { + attemptsCache.compute(phone, (k, v) -> { + long now = System.currentTimeMillis(); + if (v == null) { + return new LoginAttempt(1, now); + } + + // 如果上次尝试超过锁定时间,则重置 + if (now - v.getLastAttemptTime() > LOCK_TIME_MS) { + return new LoginAttempt(1, now); + } + + return new LoginAttempt(v.getLockCount() + 1, now); + }); + } + + /** + * 清除 + */ + public void clearAttempts(String phone) { + attemptsCache.remove(phone); + } + + @Scheduled(fixedRate = 60 * 60 * 1000) // 每小时清理一次过期记录 + public void cleanupExpiredAttempts() { + long now = System.currentTimeMillis(); + attemptsCache.entrySet().removeIf(entry -> + now - entry.getValue().getLastAttemptTime() > LOCK_TIME_MS * 2 + ); + } +} \ No newline at end of file diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml new file mode 100644 index 0000000..14f5f0d --- /dev/null +++ b/src/main/resources/application.yml @@ -0,0 +1,24 @@ +port: 8080 + +spring: + main: + allow-circular-references: true + datasource: + url: jdbc:mysql://127.0.0.1:3306/canlian?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 123456 + driver-class-name: com.mysql.cj.jdbc.Driver +mybatis-plus: + #mapper配置文件 + mapper-locations: classpath*:/mapper/*.xml + + type-aliases-package: com.cl.pojo.entity + configuration: + #开启驼峰命名 + map-underscore-to-camel-case: true + # 开启SQL日志 + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl +#jwt: +# secret-key: xx +# ttl: 7200000 +# token-name: Authorization \ No newline at end of file diff --git a/src/main/resources/mapper/DataMapper.xml b/src/main/resources/mapper/DataMapper.xml new file mode 100644 index 0000000..29c830f --- /dev/null +++ b/src/main/resources/mapper/DataMapper.xml @@ -0,0 +1,127 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="com.cl.mapper.DataMapper"> + + + <select id="screen" resultType="com.cl.pojo.entity.DataEntity"> + WITH latest_records AS ( + SELECT + *, + ROW_NUMBER() OVER (PARTITION BY county ORDER BY create_time DESC) AS rn + FROM t_data + WHERE county=#{county} or #{county}=0 AND del_flag = 0 + ) + SELECT + create_time, + sum(certificate_eyesight) AS certificate_eyesight, + sum(certificate_intellect) AS certificate_intellect , + sum(certificate_limb) AS certificate_limb , + sum(certificate_speech) AS certificate_speech, + sum(certificate_hearing) AS certificate_hearing, + sum(certificate_spirit) AS certificate_spirit, + sum(certificate_multiple) AS certificate_multiple, + sum(worker_city) AS worker_city, + sum(worker_association) AS worker_association, + sum(worker_service_corps) AS worker_service_corps, + sum(worker_county ) AS worker_county, + sum(worker_township ) AS worker_township, + sum(worker_village ) AS worker_village, + sum(drill_autism ) AS drill_autism, + sum(drill_intellect ) AS drill_intellect, + sum(drill_limb ) AS drill_limb, + sum(drill_speech ) AS drill_speech, + sum(drill_hearing ) AS drill_hearing, + sum(drill_spirit ) AS drill_spirit, + sum(salvation_before_seven ) AS salvation_before_seven, + sum(salvation_after_seven ) AS salvation_after_seven, + sum(salvation_autism ) AS salvation_autism, + sum(salvation_intellect ) AS salvation_intellect, + sum(salvation_limb ) AS salvation_limb, + sum(salvation_speech ) AS salvation_speech, + sum(difficulty_medication ) AS difficulty_medication, + sum(difficulty_hospitalisation ) AS difficulty_hospitalisation, + sum(assistive_device_total ) AS assistive_device_total, + sum(assistive_device_one ) AS assistive_device_one, + sum(assistive_device_two ) AS assistive_device_two, + sum(assistive_device_three ) AS assistive_device_three, + sum(assistive_device_other ) AS assistive_device_other, + sum(assistive_device_type_one ) AS assistive_device_type_one, + sum(assistive_device_type_two ) AS assistive_device_type_two, + sum(assistive_device_type_three ) AS assistive_device_type_three, + sum(assistive_device_type_four ) AS assistive_device_type_four, + sum(assistive_device_grade_one ) AS assistive_device_grade_one , + sum( assistive_device_grade_two) as assistive_device_grade_two, + sum(assistive_device_grade_three ) as assistive_device_grade_three, + sum(assistive_device_grade_four ) as assistive_device_grade_four , + sum(technical_training ) as technical_training , + sum(home_allowance ) as home_allowance , + sum(statutory_certificate_eyesight ) as statutory_certificate_eyesight , + sum(statutory_certificate_intellect ) as statutory_certificate_intellect, + sum(statutory_certificate_limb ) as statutory_certificate_limb, + sum(statutory_certificate_speech ) as statutory_certificate_speech , + sum(statutory_certificate_hearing ) as statutory_certificate_hearing , + sum(employed_employment ) as employed_employment, + sum(employed_concentrated ) as employed_concentrated , + sum(employed_public_welfare ) as employed_public_welfare , + sum(employed_auxiliary ) as employed_auxiliary , + sum(employed_individual ) as employed_individual , + sum(high_school_employment ) as high_school_employment , + sum(high_school_individual ) as high_school_individual , + sum(high_school_flexible ) as high_school_flexible, + sum(education_one ) as education_one, + sum(education_two ) as education_two , + sum( education_three) as education_three , + sum(education_four ) as education_four, + sum(education_five ) as education_five , + sum(education_six ) as education_six , + sum(education_seven ) as education_seven , + sum(education_eight ) as education_eight , + sum(education_nine ) as education_nine , + sum(education_subsidy ) as education_subsidy , + sum(activity_frequency ) as activity_frequency, + sum(education_number ) as education_number, + sum(matter) as matter, + sum(doctor_apprecitation) as doctor_apprecitation, + sum(remould) as remould, + sum(interviews_office) as interviews_office, + sum(interviews_phone) as interviews_phone , + sum(interviews_superior) as interviews_superior, + sum(interviews_hotline) as interviews_hotline + FROM latest_records + WHERE rn = 1; + </select> + <select id="pageList" resultType="com.cl.pojo.vo.DataVO"> + SELECT + d.county, + d.investigate_time, + d.create_time, + creator.name AS createName, + d.update_time, + updater.name AS updateName + FROM + t_data d + LEFT JOIN + t_user creator ON d.create_by = creator.id + LEFT JOIN + t_user updater ON d.update_by = updater.id + WHERE + d.del_flag=0 + <if test="county != null and county != 0"> + and d.county =#{county} + </if> + <if test="name!=null and ''!=name"> + and creator.name like concat('%',#{name},'%') + </if> + </select> + <select id="beforeOne" resultType="com.cl.pojo.entity.DataEntity"> + + SELECT * + FROM t_data + WHERE del_flag = 0 + AND county = (SELECT county FROM t_data WHERE id = #{id} AND del_flag = 0) + AND create_time < (SELECT create_time FROM t_data WHERE id = #{id} AND del_flag = 0) + ORDER BY create_time DESC + LIMIT 1; + + </select> +</mapper> \ No newline at end of file diff --git a/src/main/resources/mapper/InstitutionMapper.xml b/src/main/resources/mapper/InstitutionMapper.xml new file mode 100644 index 0000000..8a9c783 --- /dev/null +++ b/src/main/resources/mapper/InstitutionMapper.xml @@ -0,0 +1,36 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="com.cl.mapper.InstitutionMapper"> + + + <select id="pageList" resultType="com.cl.pojo.vo.InstitutionVO"> + select + id , name, type, county, phone + from + t_institution + where + del_flag=0 + <if test="null!=county and county!=0"> + and county=#{county} + </if> + <if test="null!=phone and ''!=phone"> + and phone like concat('%',#{phone},'%') + </if> + order by id desc + + </select> + + + <select id="getAll" resultType="com.cl.pojo.vo.InstitutionVO"> + select id,type,name,address,phone,county + from + t_institution + where + del_flag=0 + <if test="null!=county and county!=0"> + and county=#{county} + </if> + order by id desc + </select> + +</mapper> \ No newline at end of file diff --git a/src/main/resources/mapper/UserMapper.xml b/src/main/resources/mapper/UserMapper.xml new file mode 100644 index 0000000..88c8258 --- /dev/null +++ b/src/main/resources/mapper/UserMapper.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="com.cl.mapper.UserMapper"> + + + <select id="pageList" resultType="com.cl.pojo.vo.UserVO"> + select id,name,phone,remark,status + from t_user + where + del_flag = 0 + and id != 1 + <if test="null != name and ''!=name"> + and `name` like concat('%',#{name},'%') + </if> + <if test="null!=phone and ''!=phone"> + and phone like concat('%',#{phone},'%') + </if> + ORDER BY id DESC + </select> +</mapper> \ No newline at end of file diff --git a/src/test/java/DatabaseConnectionTest.java b/src/test/java/DatabaseConnectionTest.java new file mode 100644 index 0000000..8728961 --- /dev/null +++ b/src/test/java/DatabaseConnectionTest.java @@ -0,0 +1,39 @@ +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; +import java.text.DecimalFormat; + +public class DatabaseConnectionTest { + public static void main(String[] args) { + /*String url = "jdbc:mysql://localhost:3306/canlian?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8"; + String username = "root"; + String password = "123456"; + + try (Connection connection = DriverManager.getConnection(url, username, password)) { + System.out.println("数据库连接成功!"); + } catch (SQLException e) { + System.out.println("数据库连接失败:" + e.getMessage()); + }*/ + String s = calcRate(5, 4); + System.out.println(s); + } + public static String calcRate(Integer currentValue, Integer previousValue) { + //去年的数据为0的情况 + if (previousValue == 0){ + return currentValue == 0 ? "同比持平" : "无同比数据"; + } + // 计算变化率 + double changeRate = (currentValue - previousValue) * 100.0 / previousValue; + // 格式化输出(保留两位小数,带正负号) + DecimalFormat df = new DecimalFormat("0.00"); + String absoluteValue = df.format(Math.abs(changeRate)); + if (changeRate > 0) { + return "同比增加" + absoluteValue + "%"; + } else if (changeRate < 0) { + return "同比减少" + absoluteValue + "%"; + } else { + return "同比持平"; + } + + } +} \ No newline at end of file -- Gitblit v1.7.1