소스 검색

账户管理,部分项目管理(删除,查询)

刘一凡 3 년 전
부모
커밋
d08aa39cd6
48개의 변경된 파일2789개의 추가작업 그리고 0개의 파일을 삭제
  1. 170 0
      pom.xml
  2. 15 0
      src/main/java/com/chuanghai/h3c_reporting/H3cReportingApplication.java
  3. 8 0
      src/main/java/com/chuanghai/h3c_reporting/anno/AdminLoginCheck.java
  4. 20 0
      src/main/java/com/chuanghai/h3c_reporting/anno/ParamCheck.java
  5. 14 0
      src/main/java/com/chuanghai/h3c_reporting/anno/UserLoginCheck.java
  6. 115 0
      src/main/java/com/chuanghai/h3c_reporting/aop/LoginCheckAspect.java
  7. 17 0
      src/main/java/com/chuanghai/h3c_reporting/bo/DeleteIds.java
  8. 22 0
      src/main/java/com/chuanghai/h3c_reporting/bo/DeleteReporting.java
  9. 47 0
      src/main/java/com/chuanghai/h3c_reporting/common/exception/BizCodeEnume.java
  10. 129 0
      src/main/java/com/chuanghai/h3c_reporting/common/exception/MyExceptionHandler.java
  11. 65 0
      src/main/java/com/chuanghai/h3c_reporting/common/exception/RRException.java
  12. 37 0
      src/main/java/com/chuanghai/h3c_reporting/common/utils/BaseResult.java
  13. 49 0
      src/main/java/com/chuanghai/h3c_reporting/common/utils/CommonResult.java
  14. 54 0
      src/main/java/com/chuanghai/h3c_reporting/common/utils/MyQuery.java
  15. 33 0
      src/main/java/com/chuanghai/h3c_reporting/common/utils/PageParam.java
  16. 107 0
      src/main/java/com/chuanghai/h3c_reporting/common/utils/PageUtils.java
  17. 51 0
      src/main/java/com/chuanghai/h3c_reporting/common/utils/SQLFilter.java
  18. 23 0
      src/main/java/com/chuanghai/h3c_reporting/config/MybatisPlusPageConfig.java
  19. 79 0
      src/main/java/com/chuanghai/h3c_reporting/controller/InformationReportingController.java
  20. 166 0
      src/main/java/com/chuanghai/h3c_reporting/controller/UserController.java
  21. 29 0
      src/main/java/com/chuanghai/h3c_reporting/controller/request/AdminLoginRequest.java
  22. 35 0
      src/main/java/com/chuanghai/h3c_reporting/controller/request/AdminPasswordUpdateRequest.java
  23. 56 0
      src/main/java/com/chuanghai/h3c_reporting/controller/request/ReportQueryRequest.java
  24. 50 0
      src/main/java/com/chuanghai/h3c_reporting/controller/request/UserQueryRequest.java
  25. 38 0
      src/main/java/com/chuanghai/h3c_reporting/conver/LocalDateTimeConverter.java
  26. 44 0
      src/main/java/com/chuanghai/h3c_reporting/dto/InformationReportingDTO.java
  27. 32 0
      src/main/java/com/chuanghai/h3c_reporting/dto/UserDTO.java
  28. 81 0
      src/main/java/com/chuanghai/h3c_reporting/entity/InformationReporting.java
  29. 79 0
      src/main/java/com/chuanghai/h3c_reporting/entity/User.java
  30. 9 0
      src/main/java/com/chuanghai/h3c_reporting/mapper/InformationReportingMapper.java
  31. 9 0
      src/main/java/com/chuanghai/h3c_reporting/mapper/UserMapper.java
  32. 16 0
      src/main/java/com/chuanghai/h3c_reporting/service/InformationReportingService.java
  33. 26 0
      src/main/java/com/chuanghai/h3c_reporting/service/UserService.java
  34. 44 0
      src/main/java/com/chuanghai/h3c_reporting/service/impl/InformationReportingServiceImpl.java
  35. 157 0
      src/main/java/com/chuanghai/h3c_reporting/service/impl/UserServiceImpl.java
  36. 123 0
      src/main/java/com/chuanghai/h3c_reporting/util/CommonUtil.java
  37. 92 0
      src/main/java/com/chuanghai/h3c_reporting/util/JWTUtil.java
  38. 178 0
      src/main/java/com/chuanghai/h3c_reporting/util/RSAUtils.java
  39. 39 0
      src/main/java/com/chuanghai/h3c_reporting/vo/AddUserVO.java
  40. 51 0
      src/main/java/com/chuanghai/h3c_reporting/vo/UserVO.java
  41. 33 0
      src/main/resources/application.yml
  42. 17 0
      src/main/resources/mapper/InformationReportingMapper.xml
  43. 16 0
      src/main/resources/mapper/UserMapper.xml
  44. 20 0
      src/main/resources/smart-doc.json
  45. 7 0
      src/main/resources/static/doc/AllInOne.css
  46. 131 0
      src/main/resources/static/doc/index.html
  47. 143 0
      src/main/resources/static/doc/search.js
  48. 13 0
      src/test/java/com/chuanghai/h3c_reporting/H3cReportingApplicationTests.java

+ 170 - 0
pom.xml

@@ -0,0 +1,170 @@
+<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>2.6.11</version>
+        <relativePath/> <!-- lookup parent from repository -->
+    </parent>
+    <groupId>com.chuanghai</groupId>
+    <artifactId>h3c_reporting</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <name>h3c_reporting</name>
+    <description>h3c_reporting</description>
+
+    <properties>
+        <java.version>1.8</java.version>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+
+        <!--        后端校验-->
+        <dependency>
+            <groupId>org.hibernate.validator</groupId>
+            <artifactId>hibernate-validator</artifactId>
+            <version>6.2.5.Final</version>
+        </dependency>
+
+        <!-- myBatis-plus-->
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+            <version>3.3.1</version>
+        </dependency>
+
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+            <version>8.0.11</version>
+        </dependency>
+
+        <!-- fastjson-->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>1.2.57</version>
+        </dependency>
+
+        <!--lombok-->
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <version>1.18.24</version>
+        </dependency>
+
+<!--        easyExcel-->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>easyexcel</artifactId>
+            <version>2.2.11</version>
+        </dependency>
+
+
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-annotations</artifactId>
+            <version>2.14.1</version>
+        </dependency>
+<!--        <dependency>-->
+<!--            <groupId>org.springframework</groupId>-->
+<!--            <artifactId>spring-web</artifactId>-->
+<!--            <version>6.0.0</version>-->
+<!--        </dependency>-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+            <version>2.3.7.RELEASE</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.security</groupId>
+            <artifactId>spring-security-crypto</artifactId>
+            <version>5.5.1</version>
+        </dependency>
+        <dependency>
+            <groupId>com.auth0</groupId>
+            <artifactId>java-jwt</artifactId>
+            <version>3.8.2</version>
+        </dependency>
+        <!-- JWT相关 -->
+        <dependency>
+            <groupId>io.jsonwebtoken</groupId>
+            <artifactId>jjwt</artifactId>
+            <version>0.7.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.aspectj</groupId>
+            <artifactId>aspectjrt</artifactId>
+            <version>1.9.1</version>
+        </dependency>
+
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.8.1</version>
+                <configuration>
+                    <source>1.8</source>
+                    <target>1.8</target>
+                    <encoding>UTF-8</encoding>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-jar-plugin</artifactId>
+                <configuration>
+                    <excludes>
+                        <!-- 排除 doc 路径下的api文件 -->
+                        <exclude>**/doc/**</exclude>
+                    </excludes>
+                </configuration>
+            </plugin>
+
+            <!-- smart doc -->
+            <plugin>
+                <groupId>com.github.shalousun</groupId>
+                <artifactId>smart-doc-maven-plugin</artifactId>
+                <version>2.2.2</version>
+                <configuration>
+                    <!--指定生成文档的使用的配置文件,配置文件放在自己的项目中-->
+                    <configFile>./src/main/resources/smart-doc.json</configFile>
+                    <!--指定项目名称-->
+                    <projectName>H3C报备</projectName>
+                </configuration>
+                <executions>
+                    <execution>
+                        <!--如果不需要在执行编译时启动smart-doc,则将phase注释掉-->
+                        <phase>compile</phase>
+                        <goals>
+                            <!--smart-doc提供了html、openapi、markdown等goal,可按需配置-->
+                            <goal>html</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+
+        </plugins>
+    </build>
+
+</project>

+ 15 - 0
src/main/java/com/chuanghai/h3c_reporting/H3cReportingApplication.java

@@ -0,0 +1,15 @@
+package com.chuanghai.h3c_reporting;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cache.annotation.EnableCaching;
+
+@SpringBootApplication
+@EnableCaching
+public class H3cReportingApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(H3cReportingApplication.class, args);
+    }
+
+}

+ 8 - 0
src/main/java/com/chuanghai/h3c_reporting/anno/AdminLoginCheck.java

@@ -0,0 +1,8 @@
+package com.chuanghai.h3c_reporting.anno;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Target;
+
+@Target(ElementType.METHOD)
+public @interface AdminLoginCheck {
+}

+ 20 - 0
src/main/java/com/chuanghai/h3c_reporting/anno/ParamCheck.java

@@ -0,0 +1,20 @@
+package com.chuanghai.h3c_reporting.anno;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * 参数校验
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.METHOD)
+public @interface ParamCheck {
+
+    /**
+     * 需要校验参数索引
+     * @return
+     */
+    int[] index() default {1};
+}

+ 14 - 0
src/main/java/com/chuanghai/h3c_reporting/anno/UserLoginCheck.java

@@ -0,0 +1,14 @@
+package com.chuanghai.h3c_reporting.anno;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Target;
+
+/**
+ * @Author: codingliang
+ * @Description: 用户登录检查
+ * @Date: 2021-05-17 10:53
+ * @Version: V1.0
+ **/
+@Target(ElementType.METHOD)
+public @interface UserLoginCheck {
+}

+ 115 - 0
src/main/java/com/chuanghai/h3c_reporting/aop/LoginCheckAspect.java

@@ -0,0 +1,115 @@
+package com.chuanghai.h3c_reporting.aop;
+
+
+import com.chuanghai.h3c_reporting.common.exception.BizCodeEnume;
+import com.chuanghai.h3c_reporting.common.exception.RRException;
+import com.chuanghai.h3c_reporting.dto.UserDTO;
+import com.chuanghai.h3c_reporting.util.JWTUtil;
+import io.jsonwebtoken.Claims;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
+import org.springframework.web.context.request.RequestAttributes;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * @Author: codingliang
+ * @Description: 登录拦截
+ * @Date: 2021-04-29 15:57
+ * @Version: V1.0
+ **/
+@Aspect
+@Component
+@Order(0)
+public class LoginCheckAspect {
+
+    public static ThreadLocal<UserDTO> threadLocal = new ThreadLocal<>();
+
+    /**
+     * 管理员登录拦截
+     * @param point
+     * @return
+     * @throws Throwable
+     */
+    @Around("@annotation(com.chuanghai.h3c_reporting.anno.AdminLoginCheck)")
+    public Object adminLoginCheck(ProceedingJoinPoint point) throws Throwable {
+        Claims claims = validateToken("admin_token");
+        Object adminIdStr = claims.get("id");
+        if (adminIdStr == null) {
+            throw new RRException(BizCodeEnume.TOKEN_INVALID);
+        }
+        Long adminId = (Long) adminIdStr;
+        UserDTO userVO = UserDTO.builder().id(adminId).build();
+
+        Object proceed;
+        try {
+            threadLocal.set(userVO);
+            proceed = point.proceed();
+        } finally {
+            threadLocal.remove();
+        }
+
+        return proceed;
+    }
+
+    /**
+     * 普通用户登录拦截
+     * @param point
+     * @return
+     * @throws Throwable
+     */
+    @Around("@annotation(com.chuanghai.h3c_reporting.anno.UserLoginCheck)")
+    public Object userLoginCheck(ProceedingJoinPoint point) throws Throwable {
+        // 校验token
+        Claims claims = validateToken("user_token");
+
+        Long id = (Long) claims.get("id");
+        String adminType = (String) claims.get("admin_type");
+
+        if (!StringUtils.hasText(String.valueOf(id))) {
+            throw new RRException(BizCodeEnume.TOKEN_INVALID);
+        }
+        UserDTO userVO = UserDTO.builder().id(id).adminType(Integer.valueOf(adminType)).build();
+        Object proceed;
+        try {
+            threadLocal.set(userVO);
+            proceed = point.proceed();
+        } finally {
+            threadLocal.remove();
+        }
+
+        return proceed;
+    }
+
+    // 检验token
+    private Claims validateToken(String headName) {
+        HttpServletRequest request = getHttpServletRequest();
+        String token = request.getHeader(headName);
+
+        // 验证userToken
+        if (!StringUtils.hasText(token)) {
+            throw new RRException(BizCodeEnume.TOKEN_IS_EMPTY);
+        }
+
+        // 解析token
+        Claims claims = JWTUtil.checkJWT(token);
+        if (claims == null) { // 未登录
+            throw new RRException(BizCodeEnume.TOKEN_INVALID);
+        }
+
+        return claims;
+    }
+
+    // 获取request
+    private HttpServletRequest getHttpServletRequest() {
+        RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
+        ServletRequestAttributes attributes = (ServletRequestAttributes) requestAttributes;
+        return attributes.getRequest();
+    }
+}

+ 17 - 0
src/main/java/com/chuanghai/h3c_reporting/bo/DeleteIds.java

@@ -0,0 +1,17 @@
+package com.chuanghai.h3c_reporting.bo;
+
+import lombok.Data;
+
+/**
+ * @Author 浮生
+ * @Date 2023/3/9 18:26
+ * @PackageName:com.chuanghai.h3c_reporting.bo
+ * @ClassName: DeleteIds
+ * @Description: TODO
+ * @Version 1.0
+ */
+@Data
+public class DeleteIds {
+
+    private Long[] ids;
+}

+ 22 - 0
src/main/java/com/chuanghai/h3c_reporting/bo/DeleteReporting.java

@@ -0,0 +1,22 @@
+package com.chuanghai.h3c_reporting.bo;
+
+import lombok.Data;
+
+/**
+ * @Author 浮生
+ * @Date 2023/3/10 15:46
+ * @PackageName:com.chuanghai.h3c_reporting.bo
+ * @ClassName: DeleteReporting
+ * @Description: TODO
+ * @Version 1.0
+ */
+@Data
+public class DeleteReporting {
+
+    /**
+    * 调用者姓名(管理员 上传信息的人)
+    */
+    private String name;
+
+    private Long[] ids;
+}

+ 47 - 0
src/main/java/com/chuanghai/h3c_reporting/common/exception/BizCodeEnume.java

@@ -0,0 +1,47 @@
+package com.chuanghai.h3c_reporting.common.exception;
+
+/***
+ * 错误码和错误信息定义类
+ *
+ */
+public enum BizCodeEnume {
+    UNKNOW_EXCEPTION(10000,"系统未知异常"),
+    METHOD_NOT_SUPPORT(10001, "请求方法不支持"),
+    REQUEST_HEADER_MISSING(10002, "缺少必要的请求头"),
+    TOKEN_INVALID(10003, "无效的token"),
+    TOKEN_IS_EMPTY(10004, "token为空"),
+    ADMIN_LOGIN_FAIL(10005, "管理员登录失败"),
+    PERMISSION_DENIED(10006, "权限不足"),
+    INVALID_PARAM(11001,"参数格式校验失败"),
+    BODY_IS_EMPTY(11002, "body为空"),
+    PARAMETER_ERROR(11003, "参数异常"),
+    REPEAT_SUBMIT(11004, "重复提交表单"),
+    ORDER_SUBMIT_ERROR(11005, "订单提交失败"),
+    MQ_CONSUME_EXCEPTION(11006,"消费者消费异常"),
+    THIRD_PARTY_SERVICE_CALL_FAILED(11007, "第三方服务调用失败"),
+    JXNXS_ORDER_QUERY_ERROR(11008, "农商行订单状态查询失败"),
+    DATA_IS_EXIST(16000, "数据已存在"),
+    DATA_NOT_EXIST(16000, "数据不存在"),
+    FILE_IS_NOT_EXIT(16006, "临时文件不存在"),
+    FILE_UPLOAD_ERROR(16007, "文件上传失败"),
+    FILE_IS_TOO_BIG(16008, "文件太大"),
+    DATE_ERROR(16009, "只能关闭当天房间"),
+    FILE_IMPORT_ERROR(16010,"导入模板错误"),
+    PASSWORD_ERROR(16011,"密码解析失败"),
+    URL_ERROR(16012,"播放URL生成失败");
+
+    private int code;
+    private String msg;
+    BizCodeEnume(int code, String msg){
+        this.code = code;
+        this.msg = msg;
+    }
+
+    public int getCode() {
+        return code;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+}

+ 129 - 0
src/main/java/com/chuanghai/h3c_reporting/common/exception/MyExceptionHandler.java

@@ -0,0 +1,129 @@
+package com.chuanghai.h3c_reporting.common.exception;
+
+import com.chuanghai.h3c_reporting.common.utils.CommonResult;
+import org.springframework.dao.DuplicateKeyException;
+import org.springframework.http.converter.HttpMessageNotReadableException;
+import org.springframework.web.HttpMediaTypeNotSupportedException;
+import org.springframework.web.HttpRequestMethodNotSupportedException;
+import org.springframework.web.bind.MethodArgumentNotValidException;
+import org.springframework.web.bind.MissingRequestHeaderException;
+import org.springframework.web.bind.MissingServletRequestParameterException;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+import org.springframework.web.multipart.MaxUploadSizeExceededException;
+import org.springframework.web.multipart.MultipartException;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @Author: codingliang
+ * @Description: 统一异常处理
+ * @Date: 2021-01-06 10:07
+ * @Version: V1.0
+ **/
+@RestControllerAdvice
+public class MyExceptionHandler {
+
+    /**
+     * 处理参数校验异常
+     * @param e
+     * @return
+     */
+    @ExceptionHandler(MethodArgumentNotValidException.class)
+    public CommonResult handleValidException(MethodArgumentNotValidException e) {
+        Map<String, String> map = new HashMap<>();
+        e.getBindingResult().getFieldErrors().forEach(item -> {
+            String errMessage = item.getDefaultMessage();
+            String errField = item.getField();
+            map.put(errField, errMessage);
+        });
+        return CommonResult.fail(Integer.toString(BizCodeEnume.INVALID_PARAM.getCode()), BizCodeEnume.INVALID_PARAM.getMsg()).setResult(map);
+    }
+
+    /**
+     * 数据库索引重复
+     * @return
+     */
+    @ExceptionHandler(DuplicateKeyException.class)
+    public CommonResult handleSQLIntegrityConstraintViolationException() {
+        return CommonResult.fail(Integer.toString(BizCodeEnume.DATA_IS_EXIST.getCode()), BizCodeEnume.DATA_IS_EXIST.getMsg());
+    }
+
+    /**
+     * 请求方法不支持
+     * @return
+     */
+    @ExceptionHandler(HttpRequestMethodNotSupportedException.class)
+    public CommonResult handleRequestMethodNotSupported() {
+        return CommonResult.fail(Integer.toString(BizCodeEnume.METHOD_NOT_SUPPORT.getCode()), BizCodeEnume.METHOD_NOT_SUPPORT.getMsg());
+    }
+
+    /**
+     * 缺少请求头
+     * @return
+     */
+    @ExceptionHandler(MissingRequestHeaderException.class)
+    public CommonResult handleRequestHeaderMissing() {
+        return CommonResult.fail(Integer.toString(BizCodeEnume.REQUEST_HEADER_MISSING.getCode()), BizCodeEnume.REQUEST_HEADER_MISSING.getMsg());
+    }
+
+    /**
+     * 参数缺失
+     * @return
+     */
+    @ExceptionHandler(MissingServletRequestParameterException.class)
+    public CommonResult handleMissingServletRequestParameterException() {
+        return CommonResult.fail(Integer.toString(BizCodeEnume.PARAMETER_ERROR.getCode()), BizCodeEnume.PARAMETER_ERROR.getMsg());
+    }
+
+    /**
+     * 文件过大
+     * @return
+     */
+    @ExceptionHandler(MaxUploadSizeExceededException.class)
+    public CommonResult handleMaxUploadSizeExceededException() {
+        return CommonResult.fail(Integer.toString(BizCodeEnume.FILE_IS_TOO_BIG.getCode()), BizCodeEnume.FILE_IS_TOO_BIG.getMsg());
+    }
+
+    @ExceptionHandler(MultipartException.class)
+    public CommonResult handleMultipartException() {
+        return CommonResult.fail(Integer.toString(BizCodeEnume.PARAMETER_ERROR.getCode()), "文件上传异常");
+    }
+
+    /**
+     * body为空
+     * @return
+     */
+    @ExceptionHandler(HttpMessageNotReadableException.class)
+    public CommonResult handleMessageNotReadableException(HttpMessageNotReadableException e) {
+        e.printStackTrace();
+        return CommonResult.fail(Integer.toString(BizCodeEnume.BODY_IS_EMPTY.getCode()), BizCodeEnume.BODY_IS_EMPTY.getMsg());
+    }
+
+    @ExceptionHandler(HttpMediaTypeNotSupportedException.class)
+    public CommonResult handleHttpMediaTypeNotSupportedException(HttpMediaTypeNotSupportedException e) {
+        return CommonResult.fail(Integer.toString(BizCodeEnume.PARAMETER_ERROR.getCode()), "参数类型错误:" + e.getMessage());
+    }
+
+    /**
+     * 自定义异常
+     * @param e
+     * @return
+     */
+    @ExceptionHandler(RRException.class)
+    public CommonResult handleRRException(RRException e) {
+        return CommonResult.fail(Integer.toString(e.getCode()), e.getMsg());
+    }
+
+    /**
+     * 未知异常
+     * @param throwable
+     * @return
+     */
+    @ExceptionHandler(Throwable.class)
+    public CommonResult handleException(Throwable throwable) {
+        throwable.printStackTrace();
+        return CommonResult.fail(Integer.toString(BizCodeEnume.UNKNOW_EXCEPTION.getCode()), BizCodeEnume.UNKNOW_EXCEPTION.getMsg());
+    }
+}

+ 65 - 0
src/main/java/com/chuanghai/h3c_reporting/common/exception/RRException.java

@@ -0,0 +1,65 @@
+package com.chuanghai.h3c_reporting.common.exception;
+
+/**
+ * 自定义异常
+ *
+ * @author Mark sunlightcs@gmail.com
+ */
+public class RRException extends RuntimeException {
+    private static final long serialVersionUID = 1L;
+
+    private String msg;
+    private int code = 500;
+
+    public RRException(String msg) {
+        super(msg);
+        this.msg = msg;
+    }
+
+    public RRException(String msg, Throwable e) {
+        super(msg, e);
+        this.msg = msg;
+    }
+
+    public RRException(String msg, int code) {
+        super(msg);
+        this.msg = msg;
+        this.code = code;
+    }
+
+    public RRException(BizCodeEnume bizCodeEnume) {
+        super(bizCodeEnume.getMsg());
+        this.msg = bizCodeEnume.getMsg();
+        this.code = bizCodeEnume.getCode();
+    }
+
+    public RRException(BizCodeEnume bizCodeEnume, String msg) {
+        super(bizCodeEnume.getMsg());
+        this.msg = msg;
+        this.code = bizCodeEnume.getCode();
+    }
+
+    public RRException(String msg, int code, Throwable e) {
+        super(msg, e);
+        this.msg = msg;
+        this.code = code;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public void setMsg(String msg) {
+        this.msg = msg;
+    }
+
+    public int getCode() {
+        return code;
+    }
+
+    public void setCode(int code) {
+        this.code = code;
+    }
+
+
+}

+ 37 - 0
src/main/java/com/chuanghai/h3c_reporting/common/utils/BaseResult.java

@@ -0,0 +1,37 @@
+package com.chuanghai.h3c_reporting.common.utils;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @Author 浮生
+ * @Date 2023/3/8 14:02
+ * @PackageName:com.chuanghai.h3c_reporting.common.utils
+ * @ClassName: BaseResult
+ * @Description: TODO
+ * @Version 1.0
+ */
+@Data
+public abstract class BaseResult<T> implements Serializable {
+
+    /**
+     * 接口调用结果标识
+     */
+    private boolean success = false;
+
+    /**
+     * 接口调用结果信息
+     */
+    private String message;
+
+    /**
+     * 接口调用业务码
+     */
+    private String code;
+
+    /**
+     * 接口调用返回数据
+     */
+    private T data;
+}

+ 49 - 0
src/main/java/com/chuanghai/h3c_reporting/common/utils/CommonResult.java

@@ -0,0 +1,49 @@
+package com.chuanghai.h3c_reporting.common.utils;
+
+import java.io.Serializable;
+
+/**
+ * @Author 浮生
+ * @Date 2023/3/8 14:00
+ * @PackageName:com.chuanghai.h3c_reporting.common.utils
+ * @ClassName: CommonResult
+ * @Description: TODO
+ * @Version 1.0
+ */
+public class CommonResult<T> extends BaseResult implements Serializable {
+
+    private static final long serialVersionUID = 3616484754899974346L;
+
+    public static CommonResult ok() {
+        return ok("1", "执行成功");
+    }
+
+    public static <T> CommonResult<T> ok(String code, String msg) {
+        return baseCreate(code, msg, true);
+    }
+
+    public static CommonResult fail() {
+        return fail("-1", "执行失败");
+    }
+
+    public static CommonResult fail(String code, String msg) {
+        return baseCreate(code, msg, false);
+    }
+
+    private static <T> CommonResult<T> baseCreate(String code, String msg, boolean success) {
+        CommonResult result = new CommonResult();
+        result.setCode(code);
+        result.setSuccess(success);
+        result.setMessage(msg);
+        return result;
+    }
+
+    public CommonResult<T> setResult(T data) {
+        this.setData(data);
+        return this;
+    }
+
+    public T getData() {
+        return (T) super.getData();
+    }
+}

+ 54 - 0
src/main/java/com/chuanghai/h3c_reporting/common/utils/MyQuery.java

@@ -0,0 +1,54 @@
+package com.chuanghai.h3c_reporting.common.utils;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.metadata.OrderItem;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+
+/**
+ * @Author: codingliang
+ * @Description: 分页参数设置
+ * @Date: 2021-04-29 12:51
+ * @Version: V1.0
+ **/
+public class MyQuery<T> {
+
+    public IPage<T> getPage(PageParam params) {
+        return this.getPage(params, null, false);
+    }
+
+    public IPage<T> getPage(PageParam params, String defaultOrderField, boolean isAsc) {
+
+        //分页对象
+        Page<T> page = new Page<>(params.getCurrPage(), params.getPageSize());
+
+        //排序字段
+        //防止SQL注入(因为sidx、order是通过拼接SQL实现排序的,会有SQL注入风险)
+        String orderField = SQLFilter.sqlInject(params.getOrderField());
+        String order = params.getOrder();
+
+
+        //前端字段排序
+        if(StringUtils.isNotBlank(orderField) && StringUtils.isNotBlank(order)){
+            if("asc".equalsIgnoreCase(order)) {
+                return  page.addOrder(OrderItem.asc(orderField));
+            }else {
+                return page.addOrder(OrderItem.desc(orderField));
+            }
+        }
+
+        // 没有排序字段,则不排序
+        if(StringUtils.isBlank(defaultOrderField)){
+            return page;
+        }
+
+        //默认排序
+        if(isAsc) {
+            page.addOrder(OrderItem.asc(defaultOrderField));
+        }else {
+            page.addOrder(OrderItem.desc(defaultOrderField));
+        }
+
+        return page;
+    }
+}

+ 33 - 0
src/main/java/com/chuanghai/h3c_reporting/common/utils/PageParam.java

@@ -0,0 +1,33 @@
+package com.chuanghai.h3c_reporting.common.utils;
+
+import lombok.Data;
+
+/**
+ * @Author: codingliang
+ * @Description: 分页参数
+ * @Date: 2021-04-29 12:41
+ * @Version: V1.0
+ **/
+@Data
+public class PageParam {
+
+    /**
+     * 当前页,默认1
+     */
+    private Integer currPage = 1;
+
+    /**
+     * 每页大小,默认10
+     */
+    private Integer pageSize = 10;
+
+    /**
+     * 排序字段,可选择值参考返回结果
+     */
+    private String orderField;
+
+    /**
+     * 排序方式,可选值:asc、desc
+     */
+    private String order;
+}

+ 107 - 0
src/main/java/com/chuanghai/h3c_reporting/common/utils/PageUtils.java

@@ -0,0 +1,107 @@
+package com.chuanghai.h3c_reporting.common.utils;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @Author 浮生
+ * @Date 2023/3/8 14:13
+ * @PackageName:com.chuanghai.h3c_reporting.common.utils
+ * @ClassName: PageUtils
+ * @Description: TODO
+ * @Version 1.0
+ */
+@NoArgsConstructor
+public class PageUtils<T> implements Serializable {
+    private static final long serialVersionUID = 1L;
+    /**
+     * 总记录数
+     */
+    private int totalCount;
+    /**
+     * 每页记录数
+     */
+    private int pageSize;
+    /**
+     * 总页数
+     */
+    private int totalPage;
+    /**
+     * 当前页数
+     */
+    private int currPage;
+    /**
+     * 列表数据
+     */
+    private List<T> list;
+
+    /**
+     * 分页
+     * @param list        列表数据
+     * @param totalCount  总记录数
+     * @param pageSize    每页记录数
+     * @param currPage    当前页数
+     */
+    public PageUtils(List<T> list, int totalCount, int pageSize, int currPage) {
+        this.list = list;
+        this.totalCount = totalCount;
+        this.pageSize = pageSize;
+        this.currPage = currPage;
+        this.totalPage = (int)Math.ceil((double)totalCount/pageSize);
+    }
+
+    /**
+     * 分页
+     */
+    public PageUtils(IPage<T> page) {
+        this.list = page.getRecords();
+        this.totalCount = (int)page.getTotal();
+        this.pageSize = (int)page.getSize();
+        this.currPage = (int)page.getCurrent();
+        this.totalPage = (int)page.getPages();
+    }
+
+    public int getTotalCount() {
+        return totalCount;
+    }
+
+    public void setTotalCount(int totalCount) {
+        this.totalCount = totalCount;
+    }
+
+    public int getPageSize() {
+        return pageSize;
+    }
+
+    public void setPageSize(int pageSize) {
+        this.pageSize = pageSize;
+    }
+
+    public int getTotalPage() {
+        return totalPage;
+    }
+
+    public void setTotalPage(int totalPage) {
+        this.totalPage = totalPage;
+    }
+
+    public int getCurrPage() {
+        return currPage;
+    }
+
+    public void setCurrPage(int currPage) {
+        this.currPage = currPage;
+    }
+
+    public List<?> getList() {
+        return list;
+    }
+
+    public void setList(List<T> list) {
+        this.list = list;
+    }
+
+}

+ 51 - 0
src/main/java/com/chuanghai/h3c_reporting/common/utils/SQLFilter.java

@@ -0,0 +1,51 @@
+/**
+ * Copyright (c) 2016-2019 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.chuanghai.h3c_reporting.common.utils;
+
+import com.chuanghai.h3c_reporting.common.exception.RRException;
+import org.springframework.util.StringUtils;
+
+/**
+ * SQL过滤
+ *
+ * @author Mark sunlightcs@gmail.com
+ */
+public class SQLFilter {
+
+    /**
+     * SQL注入过滤
+     * @param str  待验证的字符串
+     */
+    public static String sqlInject(String str){
+        if (StringUtils.hasText(str)) {
+            //去掉'|"|;|\字符
+            str = StringUtils.replace(str, "'", "");
+            str = StringUtils.replace(str, "\"", "");
+            str = StringUtils.replace(str, ";", "");
+            str = StringUtils.replace(str, "\\", "");
+
+            //转换成小写
+            str = str.toLowerCase();
+
+            //非法字符
+            String[] keywords = {"master", "truncate", "insert", "select", "delete", "update", "declare", "alter", "drop"};
+
+            //判断是否包含非法字符
+            for(String keyword : keywords){
+                if(str.indexOf(keyword) != -1){
+                    throw new RRException("包含非法字符");
+                }
+            }
+
+            return str;
+        } else {
+            return null;
+        }
+    }
+}

+ 23 - 0
src/main/java/com/chuanghai/h3c_reporting/config/MybatisPlusPageConfig.java

@@ -0,0 +1,23 @@
+package com.chuanghai.h3c_reporting.config;
+
+import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.pagination.optimize.JsqlParserCountOptimize;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @Author: codingliang
+ * @Description: mp.mybatis 分页配置
+ * @Date: 2021-11-22 9:15
+ * @Version: V1.0
+ **/
+@Configuration
+public class MybatisPlusPageConfig {
+
+    @Bean
+    public PaginationInterceptor paginationInterceptor() {
+        PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
+        paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
+        return paginationInterceptor;
+    }
+}

+ 79 - 0
src/main/java/com/chuanghai/h3c_reporting/controller/InformationReportingController.java

@@ -0,0 +1,79 @@
+package com.chuanghai.h3c_reporting.controller;
+
+import com.chuanghai.h3c_reporting.anno.AdminLoginCheck;
+import com.chuanghai.h3c_reporting.bo.DeleteReporting;
+import com.chuanghai.h3c_reporting.common.utils.CommonResult;
+import com.chuanghai.h3c_reporting.common.utils.PageUtils;
+import com.chuanghai.h3c_reporting.controller.request.ReportQueryRequest;
+import com.chuanghai.h3c_reporting.entity.InformationReporting;
+import com.chuanghai.h3c_reporting.entity.User;
+import com.chuanghai.h3c_reporting.service.InformationReportingService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**  报备模块
+ * @author 27951
+ * @version 1.0
+ * @description: TODO
+ * @date 2023/3/7 17:38
+ */
+@Slf4j
+@RestController
+@RequestMapping("/informationReporting")
+public class InformationReportingController {
+
+    @Autowired
+    private InformationReportingService informationReportingService;
+
+    /**
+    * 信息上传
+    */
+
+    /**
+     * 删除信息
+     */
+    @AdminLoginCheck
+    @DeleteMapping("/delete")
+    public CommonResult<String> delete(@RequestHeader("admin_token") String adminToken,
+                                       @RequestBody DeleteReporting reporting) {
+        List<Long> idList = Arrays.asList(reporting.getIds());
+        List<InformationReporting> reportingList = new ArrayList<>();
+        idList.forEach(id -> {
+            InformationReporting reporting1 = new InformationReporting();
+            reporting1.setId(id);
+            reporting1.setStatus(0);
+            reportingList.add(reporting1);
+        });
+        boolean flag = informationReportingService.updateBatchById(reportingList);
+        if (flag) {
+            log.info("删除信息=========>>> 管理员【{}】成功删除了编号为【{}】的项目信息", reporting.getName(), reporting.getIds());
+            return CommonResult.ok();
+        } else {
+            log.info("删除信息失败=========>>> 管理员【{}】删除编号为【{}】的项目信息失败", reporting.getName(), reporting.getIds());
+            return CommonResult.fail();
+        }
+    }
+
+    /**
+     * 项目列表
+     */
+    @AdminLoginCheck
+    @GetMapping("/list")
+    public CommonResult<PageUtils<User>> list(@RequestHeader("admin_token") String adminToken,
+                                              @Param("userQueryRequest") ReportQueryRequest request) {
+
+        PageUtils page = informationReportingService.queryPage(request);
+        return CommonResult.ok().setResult(page);
+    }
+
+    /**
+     * 信息导出
+     */
+
+}

+ 166 - 0
src/main/java/com/chuanghai/h3c_reporting/controller/UserController.java

@@ -0,0 +1,166 @@
+package com.chuanghai.h3c_reporting.controller;
+
+import com.chuanghai.h3c_reporting.anno.AdminLoginCheck;
+import com.chuanghai.h3c_reporting.anno.ParamCheck;
+import com.chuanghai.h3c_reporting.bo.DeleteIds;
+import com.chuanghai.h3c_reporting.common.exception.BizCodeEnume;
+import com.chuanghai.h3c_reporting.common.exception.RRException;
+import com.chuanghai.h3c_reporting.common.utils.CommonResult;
+import com.chuanghai.h3c_reporting.common.utils.PageUtils;
+import com.chuanghai.h3c_reporting.controller.request.AdminLoginRequest;
+import com.chuanghai.h3c_reporting.controller.request.AdminPasswordUpdateRequest;
+import com.chuanghai.h3c_reporting.controller.request.UserQueryRequest;
+import com.chuanghai.h3c_reporting.entity.User;
+import com.chuanghai.h3c_reporting.service.UserService;
+import com.chuanghai.h3c_reporting.util.RSAUtils;
+import com.chuanghai.h3c_reporting.vo.AddUserVO;
+import com.chuanghai.h3c_reporting.vo.UserVO;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.*;
+
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 账户管理模块
+ */
+@RestController
+@RequestMapping("/user")
+public class UserController {
+
+    @Value("${my-security.private-key}")
+    private String privateKey;
+    @Value("${my-security.public-key}")
+    private String publickey;
+
+    @Autowired
+    private UserService userService;
+
+    /**
+    * 管理员登录
+    */
+    @ParamCheck
+    @PostMapping("/login")
+    public CommonResult<User> login(@RequestBody AdminLoginRequest request) {
+        UserVO vo = userService.login(request);
+        return CommonResult.ok().setResult(vo);
+    }
+
+    /**
+     * 添加管理员
+     */
+    @AdminLoginCheck
+    @ParamCheck(index = {2})
+    @PostMapping("/add")
+    public CommonResult<String> add(@RequestHeader("admin_token") String adminToken,
+                                    @RequestBody AddUserVO staffEntity) {
+        String password = staffEntity.getPassword();
+        if (!StringUtils.hasText(password)) {
+            throw new RRException(BizCodeEnume.PARAMETER_ERROR, "密码不能为空");
+        }
+
+        User user = new User();
+        BeanUtils.copyProperties(staffEntity, user);
+        LocalDateTime localDateTime = LocalDateTime.now();
+        user.setTime(localDateTime);
+        user.setAdminType(2);
+        user.setStatus(1);
+        userService.mySave(user);
+        return CommonResult.ok();
+    }
+
+
+    /**
+     * 删除管理员
+     */
+    @AdminLoginCheck
+    @DeleteMapping("/delete")
+    public CommonResult<String> delete(@RequestHeader("admin_token") String adminToken,
+                                       @RequestBody DeleteIds ids) {
+
+        List<Long> idList = Arrays.asList(ids.getIds());
+        List<User> userList = new ArrayList<>();
+        idList.forEach(id -> {
+            User user = new User();
+            user.setId(id);
+            user.setStatus(0);
+            userList.add(user);
+        });
+        boolean flag = userService.updateBatchById(userList);
+        if (flag) {
+            return CommonResult.ok();
+        } else {
+            return CommonResult.fail();
+        }
+    }
+
+
+    /**
+     * 修改管理员信息
+     */
+    @AdminLoginCheck
+    @ParamCheck(index = 2)
+    @PutMapping("/update")
+    public CommonResult<String> update(@RequestHeader("admin_token") String adminToken,
+                                       @RequestBody AddUserVO staff) {
+        User user = new User();
+        if (staff.getPassword() != null && staff.getPassword().equals("")){
+            staff.setPassword(null);
+        }
+        if (staff.getPassword() != null) {
+            String password;
+            try {
+                // 密码解密
+                password = RSAUtils.decrypt(staff.getPassword(), RSAUtils.getPrivateKey(privateKey));
+
+                // 密码加密存储
+                BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
+                password = passwordEncoder.encode(password);
+            } catch (Exception e) {
+                throw new RRException(BizCodeEnume.UNKNOW_EXCEPTION, "修改用户密码失败-密码解密错误");
+            }
+            staff.setPassword(password);
+        }
+        BeanUtils.copyProperties(staff, user);
+        boolean flag = userService.updateById(user);
+        if (flag) {
+            return CommonResult.ok();
+        } else {
+            return CommonResult.fail();
+        }
+    }
+
+
+    /**
+     * 修改本人密码
+     */
+    @AdminLoginCheck
+    @ParamCheck
+    @PutMapping("/updatePassword")
+    public CommonResult<String> updatePassword(@RequestBody AdminPasswordUpdateRequest request,
+                                               @RequestHeader("admin_token") String adminToken) {
+        userService.updatePassword(request);
+        return CommonResult.ok();
+    }
+
+
+    /**
+     * 管理员列表
+     */
+    @AdminLoginCheck
+    @GetMapping("/list")
+    public CommonResult<PageUtils<User>> list(@RequestHeader("admin_token") String adminToken,
+                                              @Param("userQueryRequest") UserQueryRequest request) {
+
+        PageUtils page = userService.queryPage(request);
+        return CommonResult.ok().setResult(page);
+    }
+    
+}

+ 29 - 0
src/main/java/com/chuanghai/h3c_reporting/controller/request/AdminLoginRequest.java

@@ -0,0 +1,29 @@
+package com.chuanghai.h3c_reporting.controller.request;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * @Author 浮生
+ * @Date 2023/3/8 14:41
+ * @PackageName:com.chuanghai.h3c_reporting.controller.request
+ * @ClassName: AdminLoginRequest
+ * @Description: TODO
+ * @Version 1.0
+ */
+@Data
+public class AdminLoginRequest {
+    /**
+     * 用户名
+     */
+    @NotBlank(message = "用户名不能为空")
+    private String userName;
+
+    /**
+     * 密码
+     */
+    @NotBlank(message = "密码不能为空")
+    private String password;
+
+}

+ 35 - 0
src/main/java/com/chuanghai/h3c_reporting/controller/request/AdminPasswordUpdateRequest.java

@@ -0,0 +1,35 @@
+package com.chuanghai.h3c_reporting.controller.request;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * @Author 浮生
+ * @Date 2023/3/8 22:44
+ * @PackageName:com.chuanghai.h3c_reporting.controller.request
+ * @ClassName: AdminPasswordUpdateRequest
+ * @Description: TODO
+ * @Version 1.0
+ */
+@Data
+public class AdminPasswordUpdateRequest {
+    /**
+     * 当前登录管理员id
+     */
+    private Long id;
+//    /**
+//     * 当前登录管理员id
+//     */
+//    private Long adminId;
+    /**
+     * 原密码,密码使用公钥加密后传输
+     */
+    @NotBlank(message = "密码不能为空")
+    private String password;
+    /**
+     * 新密码,密码使用公钥加密后传输
+     */
+    @NotBlank(message = "密码不能为空")
+    private String newPassword;
+}

+ 56 - 0
src/main/java/com/chuanghai/h3c_reporting/controller/request/ReportQueryRequest.java

@@ -0,0 +1,56 @@
+package com.chuanghai.h3c_reporting.controller.request;
+
+import lombok.Data;
+
+/**
+ * @Author 浮生
+ * @Date 2023/3/10 16:18
+ * @PackageName:com.chuanghai.h3c_reporting.controller.request
+ * @ClassName: ReportQueryRequest
+ * @Description: TODO
+ * @Version 1.0
+ */
+@Data
+public class ReportQueryRequest {
+
+    /**
+     * 姓名
+     */
+    private String name;
+
+    /**
+     * 电话号码
+     */
+    private String phone;
+
+    /**
+     * 单位名称
+     */
+    private String company;
+
+    /**
+     * 创建时间
+     */
+//    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private String time;
+
+    /**
+     * 当前页,默认1
+     */
+    private Integer currPage = 1;
+
+    /**
+     * 每页大小,默认10
+     */
+    private Integer pageSize = 10;
+
+    /**
+     * 排序字段,可选择值参考返回结果
+     */
+    private String orderField;
+
+    /**
+     * 排序方式,可选值:asc、desc
+     */
+    private String order;
+}

+ 50 - 0
src/main/java/com/chuanghai/h3c_reporting/controller/request/UserQueryRequest.java

@@ -0,0 +1,50 @@
+package com.chuanghai.h3c_reporting.controller.request;
+
+import lombok.Data;
+
+/**
+ * @Author 浮生
+ * @Date 2023/3/8 16:03
+ * @PackageName:com.chuanghai.h3c_reporting.controller.request
+ * @ClassName: UserQueryRequest
+ * @Description: TODO
+ * @Version 1.0
+ */
+@Data
+public class UserQueryRequest {
+    /**
+     * 用户名
+     */
+    private String userName;
+
+    /**
+     * 管理员姓名
+     */
+    private String name;
+
+    /**
+     * 创建时间
+     */
+//    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private String time;
+
+    /**
+     * 当前页,默认1
+     */
+    private Integer currPage = 1;
+
+    /**
+     * 每页大小,默认10
+     */
+    private Integer pageSize = 10;
+
+    /**
+     * 排序字段,可选择值参考返回结果
+     */
+    private String orderField;
+
+    /**
+     * 排序方式,可选值:asc、desc
+     */
+    private String order;
+}

+ 38 - 0
src/main/java/com/chuanghai/h3c_reporting/conver/LocalDateTimeConverter.java

@@ -0,0 +1,38 @@
+package com.chuanghai.h3c_reporting.conver;
+
+import com.alibaba.excel.converters.Converter;
+import com.alibaba.excel.enums.CellDataTypeEnum;
+import com.alibaba.excel.metadata.CellData;
+import com.alibaba.excel.metadata.GlobalConfiguration;
+import com.alibaba.excel.metadata.property.ExcelContentProperty;
+
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+
+/**
+ * @author 27951
+ * @version 1.0
+ * @description: TODO
+ * @date 2023/3/7 17:08
+ */
+public class LocalDateTimeConverter implements Converter<LocalDateTime> {
+    @Override
+    public Class supportJavaTypeKey() {
+        return LocalDateTime.class;
+    }
+
+    @Override
+    public CellDataTypeEnum supportExcelTypeKey() {
+        return CellDataTypeEnum.STRING;
+    }
+
+    @Override
+    public LocalDateTime convertToJavaData(CellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
+        return LocalDateTime.parse(cellData.getStringValue(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+    }
+
+    @Override
+    public CellData convertToExcelData(LocalDateTime value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
+        return new CellData<>(value.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+    }
+}

+ 44 - 0
src/main/java/com/chuanghai/h3c_reporting/dto/InformationReportingDTO.java

@@ -0,0 +1,44 @@
+package com.chuanghai.h3c_reporting.dto;
+
+import lombok.Data;
+
+/**
+ * @author 27951
+ * @version 1.0
+ * @description: TODO
+ * @date 2023/3/7 17:26
+ */
+@Data
+public class InformationReportingDTO {
+
+    /**
+     * 姓名
+     */
+    private String name;
+
+    /**
+     * 电话号码
+     */
+    private String phone;
+
+    /**
+     * 微信绑定电话
+     */
+    private String wxPhone;
+
+    /**
+     * 所在公司
+     */
+    private String company;
+
+    /**
+     * 项目
+     */
+    private String item;
+
+    /**
+     * 内容
+     */
+    private String content;
+
+}

+ 32 - 0
src/main/java/com/chuanghai/h3c_reporting/dto/UserDTO.java

@@ -0,0 +1,32 @@
+package com.chuanghai.h3c_reporting.dto;
+
+import lombok.Builder;
+import lombok.Data;
+
+/**
+ * @Author 浮生
+ * @Date 2023/3/8 17:12
+ * @PackageName:com.chuanghai.h3c_reporting.dto
+ * @ClassName: UserDTO
+ * @Description: TODO
+ * @Version 1.0
+ */
+@Builder
+@Data
+public class UserDTO {
+
+    /**
+     * 管理员id
+     */
+    private Long id;
+
+    /**
+     * 用户名
+     */
+    private String userName;
+
+    /**
+     * 角色类别 1超级管理员、2管理员
+     */
+    private Integer adminType;
+}

+ 81 - 0
src/main/java/com/chuanghai/h3c_reporting/entity/InformationReporting.java

@@ -0,0 +1,81 @@
+package com.chuanghai.h3c_reporting.entity;
+
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.chuanghai.h3c_reporting.conver.LocalDateTimeConverter;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.Pattern;
+import java.time.LocalDateTime;
+
+@TableName("information_reporting")
+@NoArgsConstructor
+@AllArgsConstructor
+@Data
+public class InformationReporting {
+    /**
+     * id
+     */
+    @ExcelIgnore
+    @TableId
+    private Long id;
+
+    /**
+     * 姓名
+     */
+    @ExcelProperty("姓名")
+    @ColumnWidth(15)
+    private String name;
+
+    /**
+     * 电话号码
+     */
+    @ExcelProperty("电话号码")
+    @ColumnWidth(15)
+    private String phone;
+
+    /**
+     * 微信绑定电话
+     */
+    @ExcelProperty("微信绑定电话")
+    @ColumnWidth(15)
+    private String wxPhone;
+
+    /**
+     * 单位名称
+     */
+    @ExcelProperty("单位名称")
+    @ColumnWidth(15)
+    private String company;
+
+
+    /**
+     * 内容
+     */
+    @ExcelProperty("内容")
+    @ColumnWidth(35)
+    private String content;
+
+    /**
+     * 创建时间
+     */
+    @ColumnWidth(15)
+    @ExcelProperty(value = "创建时间", converter = LocalDateTimeConverter.class)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime reportingTime;
+
+    /**
+     * 状态:0删除 1正常
+     */
+    @ExcelProperty("状态")
+    @ColumnWidth(15)
+    @Pattern(regexp = "[0-1]", message = "状态只能为0或1")
+    private Integer status;
+
+}

+ 79 - 0
src/main/java/com/chuanghai/h3c_reporting/entity/User.java

@@ -0,0 +1,79 @@
+package com.chuanghai.h3c_reporting.entity;
+
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.chuanghai.h3c_reporting.conver.LocalDateTimeConverter;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.Pattern;
+import java.time.LocalDateTime;
+
+@NoArgsConstructor
+@AllArgsConstructor
+@Data
+public class User {
+    /**
+     * id
+     */
+    @ExcelIgnore
+//    @JsonFormat(shape = JsonFormat.Shape.STRING)
+    @TableId
+    private Long id;
+
+    /**
+     * 用户名
+     */
+    @ExcelProperty("用户名")
+    @ColumnWidth(15)
+    @NotBlank(message = "用户名不能为空")
+    private String userName;
+
+    /**
+     * 管理员姓名
+     */
+    @ExcelProperty("管理员姓名")
+    @ColumnWidth(15)
+    @NotBlank(message = "管理员姓名不能为空")
+    private String name;
+
+    /**
+     * 密码
+     */
+    @ExcelProperty("密码")
+    @ColumnWidth(15)
+    @NotBlank(message = "密码不能为空")
+    private String password;
+
+    /**
+     * 角色类别 1超级管理员、2管理员
+     */
+    @ExcelProperty(value = "角色类别")
+    @ColumnWidth(15)
+    @NotBlank(message = "角色类别不能为空")
+    @Pattern(regexp = "[1-2]", message = "角色类别只能为1或2")
+    private Integer adminType;
+
+    /**
+     * 创建时间
+     */
+    @ColumnWidth(15)
+    @ExcelProperty(value = "创建时间", converter = LocalDateTimeConverter.class)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime time;
+
+    /**
+     * 状态(0停用 1正常)
+     */
+    @ExcelProperty(value = "状态")
+    @ColumnWidth(15)
+    @NotBlank(message = "状态不能为空")
+    @Pattern(regexp = "[0-1]", message = "状态只能为0或1")
+    private Integer status;
+
+}

+ 9 - 0
src/main/java/com/chuanghai/h3c_reporting/mapper/InformationReportingMapper.java

@@ -0,0 +1,9 @@
+package com.chuanghai.h3c_reporting.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.chuanghai.h3c_reporting.entity.InformationReporting;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface InformationReportingMapper extends BaseMapper<InformationReporting> {
+}

+ 9 - 0
src/main/java/com/chuanghai/h3c_reporting/mapper/UserMapper.java

@@ -0,0 +1,9 @@
+package com.chuanghai.h3c_reporting.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.chuanghai.h3c_reporting.entity.User;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface UserMapper extends BaseMapper<User> {
+}

+ 16 - 0
src/main/java/com/chuanghai/h3c_reporting/service/InformationReportingService.java

@@ -0,0 +1,16 @@
+package com.chuanghai.h3c_reporting.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.chuanghai.h3c_reporting.common.utils.PageUtils;
+import com.chuanghai.h3c_reporting.controller.request.ReportQueryRequest;
+import com.chuanghai.h3c_reporting.entity.InformationReporting;
+
+/**
+ * @author 27951
+ * @version 1.0
+ * @description: TODO
+ * @date 2023/3/7 17:41
+ */
+public interface InformationReportingService extends IService<InformationReporting> {
+    PageUtils queryPage(ReportQueryRequest request);
+}

+ 26 - 0
src/main/java/com/chuanghai/h3c_reporting/service/UserService.java

@@ -0,0 +1,26 @@
+package com.chuanghai.h3c_reporting.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.chuanghai.h3c_reporting.common.utils.PageUtils;
+import com.chuanghai.h3c_reporting.controller.request.AdminLoginRequest;
+import com.chuanghai.h3c_reporting.controller.request.AdminPasswordUpdateRequest;
+import com.chuanghai.h3c_reporting.controller.request.UserQueryRequest;
+import com.chuanghai.h3c_reporting.entity.User;
+import com.chuanghai.h3c_reporting.vo.UserVO;
+
+/**
+ * @author 27951
+ * @version 1.0
+ * @description: TODO
+ * @date 2023/3/7 17:41
+ */
+public interface UserService extends IService<User> {
+
+    PageUtils queryPage(UserQueryRequest request);
+
+    UserVO login(AdminLoginRequest request);
+
+    void mySave(User user);
+
+    void updatePassword(AdminPasswordUpdateRequest request);
+}

+ 44 - 0
src/main/java/com/chuanghai/h3c_reporting/service/impl/InformationReportingServiceImpl.java

@@ -0,0 +1,44 @@
+package com.chuanghai.h3c_reporting.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.chuanghai.h3c_reporting.common.utils.MyQuery;
+import com.chuanghai.h3c_reporting.common.utils.PageParam;
+import com.chuanghai.h3c_reporting.common.utils.PageUtils;
+import com.chuanghai.h3c_reporting.controller.request.ReportQueryRequest;
+import com.chuanghai.h3c_reporting.entity.InformationReporting;
+import com.chuanghai.h3c_reporting.mapper.InformationReportingMapper;
+import com.chuanghai.h3c_reporting.service.InformationReportingService;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
+
+/**
+ * @author 27951
+ * @version 1.0
+ * @description: TODO
+ * @date 2023/3/7 17:42
+ */
+@Service("InformationReportingService")
+public class InformationReportingServiceImpl extends ServiceImpl<InformationReportingMapper, InformationReporting> implements InformationReportingService {
+    @Override
+    public PageUtils queryPage(ReportQueryRequest request) {
+        PageParam pageParam = new PageParam();
+        BeanUtils.copyProperties(request, pageParam);
+        QueryWrapper<InformationReporting> queryWrapper = new QueryWrapper<>();
+        queryWrapper.and(
+                e -> e.like(StringUtils.hasText(request.getName()), "name", request.getName())
+                        .like(StringUtils.hasText(request.getPhone()), "phone", request.getPhone())
+                        .like(StringUtils.hasText(request.getCompany()), "company", request.getCompany())
+                        .eq(StringUtils.hasText(request.getTime()), "reporting_time", request.getTime())
+                        .eq("status", "1")
+        );
+        queryWrapper.orderByDesc("reporting_time");
+        IPage<InformationReporting> page = this.page(
+                new MyQuery<InformationReporting>().getPage(pageParam),
+                queryWrapper
+        );
+        return new PageUtils(page);
+    }
+}

+ 157 - 0
src/main/java/com/chuanghai/h3c_reporting/service/impl/UserServiceImpl.java

@@ -0,0 +1,157 @@
+package com.chuanghai.h3c_reporting.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.chuanghai.h3c_reporting.common.exception.BizCodeEnume;
+import com.chuanghai.h3c_reporting.common.exception.RRException;
+import com.chuanghai.h3c_reporting.common.utils.MyQuery;
+import com.chuanghai.h3c_reporting.common.utils.PageParam;
+import com.chuanghai.h3c_reporting.common.utils.PageUtils;
+import com.chuanghai.h3c_reporting.controller.request.AdminLoginRequest;
+import com.chuanghai.h3c_reporting.controller.request.AdminPasswordUpdateRequest;
+import com.chuanghai.h3c_reporting.controller.request.UserQueryRequest;
+import com.chuanghai.h3c_reporting.dto.UserDTO;
+import com.chuanghai.h3c_reporting.entity.User;
+import com.chuanghai.h3c_reporting.mapper.UserMapper;
+import com.chuanghai.h3c_reporting.service.UserService;
+import com.chuanghai.h3c_reporting.util.JWTUtil;
+import com.chuanghai.h3c_reporting.util.RSAUtils;
+import com.chuanghai.h3c_reporting.vo.UserVO;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
+
+/**
+ * @author 27951
+ * @version 1.0
+ * @description: TODO
+ * @date 2023/3/7 17:42
+ */
+@Service("UserService")
+public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
+
+    @Value("${my-security.private-key}")
+    private String privateKey;
+    @Value("${my-security.public-key}")
+    private String publickey;
+
+    @Override
+    public PageUtils queryPage(UserQueryRequest userQueryRequest) {
+        PageParam pageParam = new PageParam();
+        BeanUtils.copyProperties(userQueryRequest, pageParam);
+        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
+        queryWrapper.and(
+                e -> e.like(StringUtils.hasText(userQueryRequest.getUserName()), "user_name", userQueryRequest.getUserName())
+                        .like(StringUtils.hasText(userQueryRequest.getName()), "name", userQueryRequest.getName())
+                        .eq(StringUtils.hasText(userQueryRequest.getTime()), "time", userQueryRequest.getTime())
+                        .eq("status", "1")
+        );
+        queryWrapper.orderByDesc("time");
+        IPage<User> page = this.page(
+                new MyQuery<User>().getPage(pageParam),
+                queryWrapper
+        );
+        return new PageUtils(page);
+    }
+
+    @Override
+    public UserVO login(AdminLoginRequest request) {
+        QueryWrapper<User> wrapper = new QueryWrapper<>();
+        wrapper.eq("user_name", request.getUserName());
+        wrapper.last("limit 1");
+        User staff = this.getOne(wrapper);
+        if (staff == null) {
+            throw new RRException(BizCodeEnume.ADMIN_LOGIN_FAIL);
+        }
+        BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
+        String password;
+        try {
+            password = RSAUtils.decrypt(request.getPassword(), RSAUtils.getPrivateKey(privateKey));
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error("密码解密失败,错误信息【{}】", e.getCause());
+            throw new RRException(BizCodeEnume.ADMIN_LOGIN_FAIL, "密码解密失败");
+        }
+        if (!encoder.matches(password, staff.getPassword())) {
+            throw new RRException(BizCodeEnume.ADMIN_LOGIN_FAIL);
+        }
+        // 登录成功,生成token
+        UserDTO dto = UserDTO.builder().id(staff.getId()).adminType(1).build();
+        String token = JWTUtil.geneJsonWebToken(dto);
+        // 生成vo
+        return UserVO.builder()
+                .token(token)
+                .tokenTtl(JWTUtil.getExpired())
+                .userName(staff.getUserName())
+                .name(staff.getName())
+                .adminType(staff.getAdminType())
+                .time(String.valueOf(staff.getTime()))
+                .status(staff.getStatus())
+                .build();
+    }
+
+    @Override
+    public void mySave(User user) {
+        String password;
+        try {
+            password = RSAUtils.decrypt(user.getPassword(), RSAUtils.getPrivateKey(privateKey));
+        } catch (Exception e) {
+            throw new RRException(BizCodeEnume.UNKNOW_EXCEPTION, "新增用户失败-密码解密错误");
+        }
+        BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
+        user.setPassword(passwordEncoder.encode(password));
+        try {
+            this.save(user);
+        } catch (Exception e) {
+            throw new RRException(BizCodeEnume.DATA_IS_EXIST);
+        }
+    }
+
+    @Override
+    public void updatePassword(AdminPasswordUpdateRequest request) {
+        String password;
+        String newPassword;
+        // 获取当前登录用户信息
+        User user = this.getById(request.getId());
+        if (user == null) {
+            throw new RRException(BizCodeEnume.PERMISSION_DENIED, "无效的用户");
+        }
+        BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
+        try {
+            // 密码解密
+            password = RSAUtils.decrypt(request.getPassword(), RSAUtils.getPrivateKey(privateKey));
+            if (encoder.matches(password, user.getPassword())){
+                newPassword = RSAUtils.decrypt(request.getNewPassword(), RSAUtils.getPrivateKey(privateKey));
+                // 密码加密存储
+                BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
+                password = passwordEncoder.encode(newPassword);
+            }else {
+                throw new RRException(BizCodeEnume.PARAMETER_ERROR, "密码错误");
+            }
+        } catch (Exception e) {
+            throw new RRException(BizCodeEnume.UNKNOW_EXCEPTION, "修改用户密码失败-密码解密错误");
+        }
+        user.setPassword(password);
+        this.updateById(user);
+
+//        if (request.getId() != null) { // 修改他人密码
+//            if (user.getAdminType() != 1) {
+//                throw new RRException(BizCodeEnume.PERMISSION_DENIED, "非超级管理员不能修改他人密码");
+//            }
+//            User admin = this.getById(request.getId());
+//            if (admin == null) {
+//                throw new RRException(BizCodeEnume.PARAMETER_ERROR, "用户不存在");
+//            }
+//
+//            admin.setPassword(password);
+//
+//            this.updateById(admin);
+//        } else { // 修改本人密码
+//            user.setPassword(password);
+//            this.updateById(user);
+//        }
+    }
+}

+ 123 - 0
src/main/java/com/chuanghai/h3c_reporting/util/CommonUtil.java

@@ -0,0 +1,123 @@
+package com.chuanghai.h3c_reporting.util;
+
+import lombok.extern.slf4j.Slf4j;
+
+import java.security.MessageDigest;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.util.Random;
+import java.util.UUID;
+
+/**
+ * 公共工具类
+ **/
+@Slf4j
+public class CommonUtil {
+
+    /**
+     * 获取全部请求头
+     *
+     * @param request
+     * @return
+     */
+//    public static Map<String, String> getAllRequestHeader(HttpServletRequest request) {
+//        Enumeration<String> headerNames = request.getHeaderNames();
+//        Map<String, String> map = new HashMap<>();
+//        while (headerNames.hasMoreElements()) {
+//            String key = headerNames.nextElement();
+//            //根据名称获取请求头的值
+//            String value = request.getHeader(key);
+//            map.put(key, value);
+//        }
+//
+//        return map;
+//    }
+
+
+    /**
+     * MD5加密
+     *
+     * @param data
+     * @return
+     */
+    public static String MD5(String data) {
+        try {
+            MessageDigest md = MessageDigest.getInstance("MD5");
+            byte[] array = md.digest(data.getBytes("UTF-8"));
+            StringBuilder sb = new StringBuilder();
+            for (byte item : array) {
+                sb.append(Integer.toHexString((item & 0xFF) | 0x100).substring(1, 3));
+            }
+
+            return sb.toString().toUpperCase();
+        } catch (Exception exception) {
+        }
+        return null;
+    }
+
+
+    /**
+     * 获取验证码随机数
+     *
+     * @param length
+     * @return
+     */
+    public static String getRandomCode(int length) {
+        String sources = "0123456789";
+        Random random = new Random();
+        StringBuilder sb = new StringBuilder();
+        for (int j = 0; j < length; j++) {
+            sb.append(sources.charAt(random.nextInt(9)));
+        }
+        return sb.toString();
+    }
+
+    /**
+     * 获取当前时间戳
+     *
+     * @return
+     */
+    public static long getCurrentTimestamp() {
+        return System.currentTimeMillis();
+    }
+
+    /**
+     * 生成uuid
+     *
+     * @return
+     */
+    public static String generateUUID() {
+        return UUID.randomUUID().toString().replaceAll("-", "").substring(0, 32);
+    }
+
+    /**
+     * 获取随机长度的串
+     *
+     * @param length
+     * @return
+     */
+    private static final String ALL_CHAR_NUM = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
+
+    public static String getStringNumRandom(int length) {
+        //生成随机数字和字母,
+        Random random = new Random();
+        StringBuilder saltString = new StringBuilder(length);
+        for (int i = 1; i <= length; ++i) {
+            saltString.append(ALL_CHAR_NUM.charAt(random.nextInt(ALL_CHAR_NUM.length())));
+        }
+        return saltString.toString();
+    }
+
+    /**
+     * LocalDate 拼接时间转成 LocalDateTime
+     * @param localDate
+     * @param timeStr HH:mm:ss
+     * @return
+     */
+    public static LocalDateTime localDateToTime(LocalDate localDate, String timeStr) {
+        LocalTime time = LocalTime.parse(timeStr);
+        return LocalDateTime.of(localDate.getYear(), localDate.getMonth(), localDate.getDayOfMonth(),
+                time.getHour(), time.getMinute(), time.getSecond());
+    }
+}

+ 92 - 0
src/main/java/com/chuanghai/h3c_reporting/util/JWTUtil.java

@@ -0,0 +1,92 @@
+package com.chuanghai.h3c_reporting.util;
+
+import com.chuanghai.h3c_reporting.dto.UserDTO;
+import io.jsonwebtoken.Claims;
+import io.jsonwebtoken.Jwts;
+import io.jsonwebtoken.SignatureAlgorithm;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.Date;
+
+/**
+ * jwt 工具
+ **/
+@Slf4j
+public class JWTUtil {
+
+    /**
+     * 主题
+     */
+    private static final String SUBJECT = "chuanghai-ihotel";
+
+    /**
+     * 加密密钥
+     */
+    private static final String SECRET = "chuanghai.ihotel";
+
+    /**
+     * 令牌前缀
+     */
+    private static final String TOKEN_PREFIX = "ihotel";
+
+
+    /**
+     * token过期时间,7天
+     */
+    private static final long EXPIRED = 1000 * 60 * 60 * 24 * 7;
+
+    /**
+     * 获取过期时间
+     *
+     * @return
+     */
+    public static long getExpired() {
+        return EXPIRED;
+    }
+
+    /**
+     * 生成token
+     *
+     * @param userDTO
+     * @return
+     */
+    public static String geneJsonWebToken(UserDTO userDTO) {
+        if (userDTO == null) {
+            throw new NullPointerException("对象为空");
+        }
+
+        String userNameStr = "";
+        if (userDTO.getUserName() != null) {
+            userNameStr = userDTO.getUserName();
+        }
+        String token = Jwts.builder().setSubject(SUBJECT)
+                //配置payload
+                .claim("user_name", userNameStr)
+                .claim("admin_type", userDTO.getAdminType())
+                .setIssuedAt(new Date())
+                .setExpiration(new Date(CommonUtil.getCurrentTimestamp() + EXPIRED))
+                .signWith(SignatureAlgorithm.HS256, SECRET).compact();
+
+        token = TOKEN_PREFIX + token;
+        return token;
+    }
+
+    /**
+     * 解密jwt
+     *
+     * @param token
+     * @return
+     */
+    public static Claims checkJWT(String token) {
+        try {
+            final Claims claims = Jwts.parser().setSigningKey(SECRET).parseClaimsJws(token.replace(TOKEN_PREFIX, "")).getBody();
+            return claims;
+        } catch (Exception e) {
+            return null;
+        }
+    }
+
+    public static void main(String[] args) {
+        System.out.println(geneJsonWebToken(UserDTO.builder().userName("admin").adminType(1).build()));
+    }
+}

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 178 - 0
src/main/java/com/chuanghai/h3c_reporting/util/RSAUtils.java


+ 39 - 0
src/main/java/com/chuanghai/h3c_reporting/vo/AddUserVO.java

@@ -0,0 +1,39 @@
+package com.chuanghai.h3c_reporting.vo;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * @Author 浮生
+ * @Date 2023/3/8 21:32
+ * @PackageName:com.chuanghai.h3c_reporting.vo
+ * @ClassName: AddUserVO
+ * @Description: TODO
+ * @Version 1.0
+ */
+@Data
+public class AddUserVO {
+
+    /**
+     * id
+     */
+    @NotBlank(message = "id不能为空")
+    private Long id;
+
+    /**
+     * 用户名
+     */
+    private String userName;
+
+    /**
+     * 管理员姓名
+     */
+    private String name;
+
+    /**
+     * 密码
+     */
+    private String password;
+
+}

+ 51 - 0
src/main/java/com/chuanghai/h3c_reporting/vo/UserVO.java

@@ -0,0 +1,51 @@
+package com.chuanghai.h3c_reporting.vo;
+
+import lombok.Builder;
+import lombok.Data;
+
+/**
+ * @Author 浮生
+ * @Date 2023/3/8 16:45
+ * @PackageName:com.chuanghai.h3c_reporting.vo
+ * @ClassName: UserVO
+ * @Description: TODO
+ * @Version 1.0
+ */
+@Builder
+@Data
+public class UserVO {
+    /**
+     * 用户名
+     */
+    private String userName;
+
+    /**
+     * 管理员姓名
+     */
+    private String name;
+
+    /**
+     * 角色类别 1超级管理员、2管理员
+     */
+    private Integer adminType;
+
+    /**
+     * 创建时间
+     */
+    private String time;
+
+    /**
+     * 状态(0停用 1正常)
+     */
+    private Integer status;
+
+    /**
+     * 用户token
+     */
+    private String token;
+
+    /**
+     * token过期时间
+     */
+    private long tokenTtl;
+}

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 33 - 0
src/main/resources/application.yml


+ 17 - 0
src/main/resources/mapper/InformationReportingMapper.xml

@@ -0,0 +1,17 @@
+<?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.chuanghai.h3c_reporting.mapper.InformationReportingMapper" >
+  <resultMap id="BaseResultMap" type="com.chuanghai.h3c_reporting.entity.InformationReporting" >
+    <!--
+      WARNING - @mbg.generated
+    -->
+    <id column="id" property="id"/>
+    <result column="name" property="name" jdbcType="VARCHAR" />
+    <result column="phone" property="phone" jdbcType="VARCHAR" />
+    <result column="wx_phone" property="wxPhone" jdbcType="VARCHAR" />
+    <result column="company" property="company" jdbcType="VARCHAR" />
+    <result column="content" property="content" jdbcType="VARCHAR" />
+    <result column="reporting_time" property="reportingTime" jdbcType="TIMESTAMP" />
+    <result column="status" property="status" jdbcType="INTEGER" />
+  </resultMap>
+</mapper>

+ 16 - 0
src/main/resources/mapper/UserMapper.xml

@@ -0,0 +1,16 @@
+<?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.chuanghai.h3c_reporting.mapper.UserMapper" >
+  <resultMap id="BaseResultMap" type="com.chuanghai.h3c_reporting.entity.User" >
+    <!--
+      WARNING - @mbg.generated
+    -->
+    <id column="id" property="id"/>
+    <result column="user_name" property="userName" jdbcType="VARCHAR" />
+    <result column="name" property="name" jdbcType="VARCHAR" />
+    <result column="password" property="password" jdbcType="VARCHAR" />
+    <result column="admin_type" property="adminType" jdbcType="INTEGER" />
+    <result column="time" property="time" jdbcType="TIMESTAMP" />
+    <result column="status" property="status" jdbcType="INTEGER" />
+  </resultMap>
+</mapper>

+ 20 - 0
src/main/resources/smart-doc.json

@@ -0,0 +1,20 @@
+{
+  "serverUrl": "http://localhost:8888/reporting",
+  "isStrict": false,
+  "allInOne": true,
+  "outPath": "./src/main/resources/static/doc",
+  "coverOld": true,
+  "style": "zenburn",
+  "createDebugPage": false,
+  "projectName": "H3C报备",
+  "inlineEnum": true,
+  "revisionLogs": [
+    {
+      "version": "0.0.1",
+      "revisionTime":"2023-03-06 17:25:00",
+      "status": "创建文档",
+      "author": "浮生",
+      "remarks": "初始化接口文档"
+    }
+  ]
+}

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 7 - 0
src/main/resources/static/doc/AllInOne.css


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 131 - 0
src/main/resources/static/doc/index.html


+ 143 - 0
src/main/resources/static/doc/search.js

@@ -0,0 +1,143 @@
+let api = [];
+api.push({
+    alias: 'InformationReportingController',
+    order: '1',
+    link: '报备模块',
+    desc: '报备模块',
+    list: []
+})
+api[0].list.push({
+    order: '1',
+    desc: '删除信息',
+});
+api[0].list.push({
+    order: '2',
+    desc: '项目列表',
+});
+api.push({
+    alias: 'UserController',
+    order: '2',
+    link: '账户管理模块',
+    desc: '账户管理模块',
+    list: []
+})
+api[1].list.push({
+    order: '1',
+    desc: '管理员登录',
+});
+api[1].list.push({
+    order: '2',
+    desc: '添加管理员',
+});
+api[1].list.push({
+    order: '3',
+    desc: '删除管理员',
+});
+api[1].list.push({
+    order: '4',
+    desc: '修改管理员信息',
+});
+api[1].list.push({
+    order: '5',
+    desc: '修改本人密码',
+});
+api[1].list.push({
+    order: '6',
+    desc: '管理员列表',
+});
+api.push({
+    alias: 'dict',
+    order: '3',
+    link: 'dict_list',
+    desc: '数据字典',
+    list: []
+})
+document.onkeydown = keyDownSearch;
+function keyDownSearch(e) {
+    const theEvent = e;
+    const code = theEvent.keyCode || theEvent.which || theEvent.charCode;
+    if (code == 13) {
+        const search = document.getElementById('search');
+        const searchValue = search.value;
+        let searchArr = [];
+        for (let i = 0; i < api.length; i++) {
+            let apiData = api[i];
+            const desc = apiData.desc;
+            if (desc.indexOf(searchValue) > -1) {
+                searchArr.push({
+                    order: apiData.order,
+                    desc: apiData.desc,
+                    link: apiData.link,
+                    list: apiData.list
+                });
+            } else {
+                let methodList = apiData.list || [];
+                let methodListTemp = [];
+                for (let j = 0; j < methodList.length; j++) {
+                    const methodData = methodList[j];
+                    const methodDesc = methodData.desc;
+                    if (methodDesc.indexOf(searchValue) > -1) {
+                        methodListTemp.push(methodData);
+                        break;
+                    }
+                }
+                if (methodListTemp.length > 0) {
+                    const data = {
+                        order: apiData.order,
+                        desc: apiData.desc,
+                        link: apiData.link,
+                        list: methodListTemp
+                    };
+                    searchArr.push(data);
+                }
+            }
+        }
+        let html;
+        if (searchValue == '') {
+            const liClass = "";
+            const display = "display: none";
+            html = buildAccordion(api,liClass,display);
+            document.getElementById('accordion').innerHTML = html;
+        } else {
+            const liClass = "open";
+            const display = "display: block";
+            html = buildAccordion(searchArr,liClass,display);
+            document.getElementById('accordion').innerHTML = html;
+        }
+        const Accordion = function (el, multiple) {
+            this.el = el || {};
+            this.multiple = multiple || false;
+            const links = this.el.find('.dd');
+            links.on('click', {el: this.el, multiple: this.multiple}, this.dropdown);
+        };
+        Accordion.prototype.dropdown = function (e) {
+            const $el = e.data.el;
+            $this = $(this), $next = $this.next();
+            $next.slideToggle();
+            $this.parent().toggleClass('open');
+            if (!e.data.multiple) {
+                $el.find('.submenu').not($next).slideUp("20").parent().removeClass('open');
+            }
+        };
+        new Accordion($('#accordion'), false);
+    }
+}
+
+function buildAccordion(apiData, liClass, display) {
+    let html = "";
+    let doc;
+    if (apiData.length > 0) {
+        for (let j = 0; j < apiData.length; j++) {
+            html += '<li class="'+liClass+'">';
+            html += '<a class="dd" href="#_' + apiData[j].link + '">' + apiData[j].order + '.&nbsp;' + apiData[j].desc + '</a>';
+            html += '<ul class="sectlevel2" style="'+display+'">';
+            doc = apiData[j].list;
+            for (let m = 0; m < doc.length; m++) {
+                html += '<li><a href="#_' + apiData[j].order + '_' + doc[m].order + '_' + doc[m].desc + '">' + apiData[j].order + '.' + doc[m].order + '.&nbsp;' + doc[m].desc + '</a> </li>';
+            }
+            html += '</ul>';
+            html += '</li>';
+        }
+    }
+    return html;
+}

+ 13 - 0
src/test/java/com/chuanghai/h3c_reporting/H3cReportingApplicationTests.java

@@ -0,0 +1,13 @@
+package com.chuanghai.h3c_reporting;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class H3cReportingApplicationTests {
+
+    @Test
+    void contextLoads() {
+    }
+
+}