Browse Source

首次提交

lichaoliu 4 năm trước cách đây
commit
56742ca685
49 tập tin đã thay đổi với 2257 bổ sung0 xóa
  1. 234 0
      pom.xml
  2. 11 0
      src/main/java/com/migao/ProjectApplication.java
  3. 31 0
      src/main/java/com/migao/config/authority/AuthUtils.java
  4. 72 0
      src/main/java/com/migao/config/authority/AuthenticationInterceptor.java
  5. 43 0
      src/main/java/com/migao/config/authority/AuthenticationProperties.java
  6. 69 0
      src/main/java/com/migao/config/authority/AuthorityInterceptor.java
  7. 48 0
      src/main/java/com/migao/config/authority/CrossOriginConfig.java
  8. 63 0
      src/main/java/com/migao/config/authority/JWTUtil.java
  9. 90 0
      src/main/java/com/migao/config/authority/LoginUtils.java
  10. 7 0
      src/main/java/com/migao/config/constant/RedisKeys.java
  11. 19 0
      src/main/java/com/migao/config/constant/SecurityNameEnum.java
  12. 50 0
      src/main/java/com/migao/config/constant/SystemConstant.java
  13. 18 0
      src/main/java/com/migao/config/constant/TimeConstant.java
  14. 8 0
      src/main/java/com/migao/config/exception/AuthenticationException.java
  15. 7 0
      src/main/java/com/migao/config/exception/AuthorityException.java
  16. 7 0
      src/main/java/com/migao/config/exception/CustomException.java
  17. 125 0
      src/main/java/com/migao/config/exception/handler/ExceptionController.java
  18. 45 0
      src/main/java/com/migao/config/exception/handler/HttpErrorController.java
  19. 120 0
      src/main/java/com/migao/config/jpa/SnowFlake.java
  20. 18 0
      src/main/java/com/migao/config/jpa/SnowIdentityGenerator.java
  21. 40 0
      src/main/java/com/migao/config/json/JacksonNullStringDeserializer.java
  22. 53 0
      src/main/java/com/migao/config/json/LocalDateTimeToJacksonConfig.java
  23. 14 0
      src/main/java/com/migao/config/mybatis/MybatisPlusConfig.java
  24. 49 0
      src/main/java/com/migao/config/properties/SystemProperties.java
  25. 24 0
      src/main/java/com/migao/config/response/ExceptionInfoEnum.java
  26. 28 0
      src/main/java/com/migao/config/response/PageBean.java
  27. 20 0
      src/main/java/com/migao/config/response/ResponseBean.java
  28. 158 0
      src/main/java/com/migao/config/response/ResponseBuilder.java
  29. 22 0
      src/main/java/com/migao/config/response/ResponseEnum.java
  30. 10 0
      src/main/java/com/migao/config/swagger/SwaggerConfig.java
  31. 4 0
      src/main/java/com/migao/config/validation/Insert.java
  32. 4 0
      src/main/java/com/migao/config/validation/Update.java
  33. 37 0
      src/main/java/com/migao/controller/FileInfoController.java
  34. 44 0
      src/main/java/com/migao/controller/UserController.java
  35. 56 0
      src/main/java/com/migao/entity/po/FileInfo.java
  36. 78 0
      src/main/java/com/migao/entity/po/User.java
  37. 47 0
      src/main/java/com/migao/entity/vo/req/UserInsertReq.java
  38. 21 0
      src/main/java/com/migao/entity/vo/req/UserLoginReq.java
  39. 44 0
      src/main/java/com/migao/entity/vo/res/FileRes.java
  40. 40 0
      src/main/java/com/migao/entity/vo/res/UserLoginRes.java
  41. 7 0
      src/main/java/com/migao/mapper/FileInfoMapper.java
  42. 15 0
      src/main/java/com/migao/mapper/UserMapper.java
  43. 9 0
      src/main/java/com/migao/service/FileService.java
  44. 12 0
      src/main/java/com/migao/service/UserService.java
  45. 89 0
      src/main/java/com/migao/service/impl/FileServiceImpl.java
  46. 86 0
      src/main/java/com/migao/service/impl/UserServiceImpl.java
  47. 17 0
      src/main/java/com/migao/util/EntityUtils.java
  48. 89 0
      src/main/java/com/migao/util/FileUtils.java
  49. 55 0
      src/main/resources/application.yml

+ 234 - 0
pom.xml

@@ -0,0 +1,234 @@
+<?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.migao</groupId>
+    <artifactId>cq-yxfwzx-project-manager-java</artifactId>
+    <version>1.0-SNAPSHOT</version>
+
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>2.2.0.RELEASE</version>
+        <relativePath/>
+    </parent>
+
+    <properties>
+        <java.version>1.8</java.version>
+        <commons.lang3.version>3.8</commons.lang3.version>
+        <commons.collections4.version>4.3</commons.collections4.version>
+        <commons.beanutils.version>1.9.3</commons.beanutils.version>
+        <fastjson.version>1.2.47</fastjson.version>
+        <ansj_seg.version>5.1.1</ansj_seg.version>
+        <easyexcel.version>2.1.6</easyexcel.version>
+        <swagger.version>1.9.1.RELEASE</swagger.version>
+        <jieba-analysis.version>1.0.2</jieba-analysis.version>
+        <mybatis.plus.version>3.3.1</mybatis.plus.version>
+        <commons-compress.version>1.19</commons-compress.version>
+        <swagger-bootstrap-ui.version>1.9.6</swagger-bootstrap-ui.version>
+        <pinyin4j.version>2.5.1</pinyin4j.version>
+        <jsonwebtoken.version>0.9.1</jsonwebtoken.version>
+    </properties>
+
+    <dependencies>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-jpa</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+            <version>${mybatis.plus.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-freemarker</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+
+        <!--<dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+            <scope>runtime</scope>
+        </dependency>-->
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-configuration-processor</artifactId>
+            <optional>true</optional>
+        </dependency>
+
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <optional>true</optional>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>com.spring4all</groupId>
+            <artifactId>swagger-spring-boot-starter</artifactId>
+            <version>${swagger.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.github.xiaoymin</groupId>
+            <artifactId>swagger-bootstrap-ui</artifactId>
+            <version>${swagger-bootstrap-ui.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+            <version>${commons.lang3.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-collections4</artifactId>
+            <version>${commons.collections4.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>commons-beanutils</groupId>
+            <artifactId>commons-beanutils</artifactId>
+            <version>${commons.beanutils.version}</version>
+        </dependency>
+
+        <!--fast-json-->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>${fastjson.version}</version>
+        </dependency>
+
+        <!--分词组件-->
+        <dependency>
+            <groupId>org.ansj</groupId>
+            <artifactId>ansj_seg</artifactId>
+            <version>${ansj_seg.version}</version>
+        </dependency>
+
+        <!--结巴分词 新项目作为备用-->
+        <dependency>
+            <groupId>com.huaban</groupId>
+            <artifactId>jieba-analysis</artifactId>
+            <version>${jieba-analysis.version}</version>
+        </dependency>
+
+        <!--excel解析生成工具-->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>easyexcel</artifactId>
+            <version>${easyexcel.version}</version>
+        </dependency>
+        <!--解压、压缩 zip-->
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-compress</artifactId>
+            <version>${commons-compress.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+            <version>${commons.lang3.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-collections4</artifactId>
+            <version>${commons.collections4.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>commons-beanutils</groupId>
+            <artifactId>commons-beanutils</artifactId>
+            <version>${commons.beanutils.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.belerweb</groupId>
+            <artifactId>pinyin4j</artifactId>
+            <version>${pinyin4j.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-aop</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.seleniumhq.selenium</groupId>
+            <artifactId>selenium-server</artifactId>
+            <version>3.9.1</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.github.xiaoymin</groupId>
+            <artifactId>swagger-bootstrap-ui</artifactId>
+            <version>1.9.6</version>
+        </dependency>
+
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+            <version>5.4.2</version>
+        </dependency>
+
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+            <scope>runtime</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>io.jsonwebtoken</groupId>
+            <artifactId>jjwt</artifactId>
+            <version>${jsonwebtoken.version}</version>
+        </dependency>
+
+    </dependencies>
+
+    <!--阿里云仓库-->
+    <repositories>
+        <repository>
+            <id>nexus-aliyun</id>
+            <name>Nexus aliyun</name>
+            <url>http://maven.aliyun.com/nexus/content/groups/public</url>
+        </repository>
+    </repositories>
+
+    <build>
+        <plugins>
+            <plugin>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.3</version>
+                <configuration>
+                    <source>${java.version}</source>
+                    <target>${java.version}</target>
+                    <encoding>utf-8</encoding>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 11 - 0
src/main/java/com/migao/ProjectApplication.java

@@ -0,0 +1,11 @@
+package com.migao;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class ProjectApplication {
+    public static void main(String[] args) {
+        SpringApplication.run(ProjectApplication.class,args);
+    }
+}

+ 31 - 0
src/main/java/com/migao/config/authority/AuthUtils.java

@@ -0,0 +1,31 @@
+package com.migao.config.authority;
+
+import com.migao.config.response.ResponseBuilder;
+import com.alibaba.fastjson.JSON;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.nio.charset.StandardCharsets;
+
+/**
+ * @version 1.0
+ * @Author mwh
+ * @Date 2020/5/14 10:16
+ */
+public class AuthUtils {
+    
+    public static void writeJson(HttpServletResponse response, String message) {
+        response.setStatus(HttpServletResponse.SC_OK);
+        OutputStream writer = null;
+        try {
+            writer = response.getOutputStream();
+            response.setCharacterEncoding("UTF-8");
+            response.setContentType("application/json; charset=utf-8");
+            writer.write(JSON.toJSONString(ResponseBuilder.fail(message)).getBytes(StandardCharsets.UTF_8));
+            writer.flush();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+}

+ 72 - 0
src/main/java/com/migao/config/authority/AuthenticationInterceptor.java

@@ -0,0 +1,72 @@
+package com.migao.config.authority;
+
+
+
+import com.migao.config.constant.SystemConstant;
+import com.migao.entity.po.User;
+import com.migao.mapper.UserMapper;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.http.HttpMethod;
+import org.springframework.stereotype.Component;
+import org.springframework.web.servlet.HandlerInterceptor;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * @author 认证拦截器
+ * description
+ * createDate     2019/4/15 14:54
+ * updateRemark
+ * version        1.0
+ */
+
+@Slf4j
+@Component
+public class AuthenticationInterceptor implements HandlerInterceptor {
+
+    @Resource
+    private AuthenticationProperties authenticationProperties;
+    @Resource
+    private UserMapper userMapper;
+
+    @Override
+    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
+        if (request.getMethod().equals(HttpMethod.OPTIONS.name())) {
+            response.setStatus(HttpServletResponse.SC_OK);
+            return true;
+        }
+        String token = request.getHeader(authenticationProperties.getHeaderName());
+        //判断token是否存在
+        if (StringUtils.isBlank(token)) {
+            token = request.getParameter(authenticationProperties.getHeaderName());
+            if (StringUtils.isBlank(token)) {
+                AuthUtils.writeJson(response, "请登录");
+                return false;
+            }
+        }
+        String[] split = token.split(SystemConstant.BLANK_STRING);
+        if (split.length != 2) {
+            AuthUtils.writeJson(response, "请登录");
+            return false;
+        }
+        token = split[1];
+        //认证token是否合法
+        Long userId = JWTUtil.getUserId(token);
+        User user = userMapper.selectById(userId);
+        if (user == null) {
+            AuthUtils.writeJson(response, "请登录");
+            return false;
+        }
+        LoginUtils.CURRENT_USER.set(user);
+        if (!JWTUtil.verify(token)) {
+            AuthUtils.writeJson(response, "请登录");
+            return false;
+        }
+        return true;
+    }
+
+
+}

+ 43 - 0
src/main/java/com/migao/config/authority/AuthenticationProperties.java

@@ -0,0 +1,43 @@
+package com.migao.config.authority;
+
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author mwh
+ * description    登录设置项
+ * createDate     2019/4/11 10:26
+ * updateRemark
+ * version        1.0
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Component
+@ConfigurationProperties(prefix = "cn.jihengcc.auth")
+public class AuthenticationProperties {
+    private Long expireTime;
+
+    private String headerName = "Authorization";
+    /**
+     * redis获取当前用户 key
+     */
+    private String loginUserKey = "LOGIN:USERS:";
+
+    private String tokenKey;
+
+    private String tokenPrefix;
+
+    private String defaultNickname;
+
+    private List<String> permitUrlList = new ArrayList<>();
+
+    private List<String> logIgnoreParamList = new ArrayList<>();
+}

+ 69 - 0
src/main/java/com/migao/config/authority/AuthorityInterceptor.java

@@ -0,0 +1,69 @@
+package com.migao.config.authority;
+
+
+import com.migao.config.properties.SystemProperties;
+import com.migao.entity.po.User;
+import com.migao.entity.vo.res.UserLoginRes;
+import com.migao.mapper.UserMapper;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.HttpMethod;
+import org.springframework.stereotype.Component;
+import org.springframework.web.servlet.HandlerInterceptor;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.stream.Collectors;
+
+/**
+ * @author 鉴权拦截器
+ * description
+ * createDate     2019/4/15 14:54
+ * updateRemark
+ * version        1.0
+ */
+
+@Slf4j
+@Component
+public class AuthorityInterceptor implements HandlerInterceptor {
+
+
+    @Resource
+    private AuthenticationProperties authenticationProperties;
+    @Resource
+    private UserMapper userMapper;
+    @Resource
+    private SystemProperties systemProperties;
+
+    @Override
+    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
+        if (request.getMethod().equals(HttpMethod.OPTIONS.name())) {
+            response.setStatus(HttpServletResponse.SC_OK);
+            return true;
+        }
+        String requestUri = request.getRequestURI();
+        if ("/error".equals(requestUri)){
+            return true;
+        }
+        //防止恶意请求
+        /*if (requestMappingListener.getMappings().stream().noneMatch(
+                requestUri::equals
+        ) && !requestUri.contains(systemProperties.getFileStoreDir())) {
+            response.setStatus(HttpServletResponse.SC_OK);
+            OutputStream writer = null;
+            try {
+                writer = response.getOutputStream();
+                response.setCharacterEncoding("UTF-8");
+                response.setContentType("application/json; charset=utf-8");
+                writer.write(JSON.toJSONString(ResponseBuilder.fail("资源不存在")).getBytes(StandardCharsets.UTF_8));
+                writer.flush();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+            return false;
+        }*/
+        return true;
+    }
+
+
+}

+ 48 - 0
src/main/java/com/migao/config/authority/CrossOriginConfig.java

@@ -0,0 +1,48 @@
+package com.migao.config.authority;
+
+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;
+
+/**
+ * @author mwh
+ * @date 2019/10/9 20:59
+ */
+
+@Configuration
+public class CrossOriginConfig {
+
+
+    @Bean
+    public CorsFilter corsFilter() {
+        final UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();
+        final CorsConfiguration corsConfiguration = new CorsConfiguration();
+        corsConfiguration.setAllowCredentials(true);
+        // 设置允许的网站域名,如果全允许则设为 *
+        corsConfiguration.addAllowedOrigin("*");
+        // 如果要限制 HEADER 或 METHOD
+        corsConfiguration.addAllowedHeader("*");
+        corsConfiguration.addAllowedMethod("*");
+        urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration);
+        urlBasedCorsConfigurationSource.registerCorsConfiguration("/download", corsConfiguration);
+        return new CorsFilter(urlBasedCorsConfigurationSource);
+    }
+
+
+    /*@WebFilter(filterName = "CorsFilter ")
+    @Configuration
+    public class CorsFilter implements Filter {
+        @Override
+        public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
+            HttpServletResponse response = (HttpServletResponse) res;
+            response.setHeader("Access-Control-Allow-Origin","*");
+            response.setHeader("Access-Control-Allow-Credentials", "true");
+            response.setHeader("Access-Control-Allow-Methods", "POST, GET, PATCH, DELETE, PUT");
+            response.setHeader("Access-Control-Max-Age", "3600");
+            response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
+            chain.doFilter(req, res);
+        }
+    }*/
+}

+ 63 - 0
src/main/java/com/migao/config/authority/JWTUtil.java

@@ -0,0 +1,63 @@
+package com.migao.config.authority;
+
+
+
+import io.jsonwebtoken.Claims;
+import io.jsonwebtoken.Jws;
+import io.jsonwebtoken.Jwts;
+import io.jsonwebtoken.SignatureAlgorithm;
+import io.jsonwebtoken.impl.crypto.MacProvider;
+
+import java.security.Key;
+
+public class JWTUtil {
+    private static Key key = MacProvider.generateKey();
+    /**
+     * 校验token是否正确
+     *
+     * @param token 密钥
+     * @return
+     */
+    public static boolean verify(String token) {
+        //签名秘钥,和生成的签名的秘钥一模一样
+        Claims claims;
+        try {
+            claims = Jwts.parser()
+                    //得到DefaultJwtParser
+                    .setSigningKey(key)
+                    //设置签名的秘钥
+                    .parseClaimsJws(token).getBody();
+        } catch (Exception e) {
+            claims = null;
+        }//设置需要解析的jwt
+        return claims != null;
+    }
+
+
+    /**
+     * 获取登录id
+     *
+     * @param token
+     * @return
+     */
+    public static Long getUserId(String token) {
+        Jws<Claims> claimsJws = Jwts.parser().setSigningKey(key).parseClaimsJws(token);
+        return Long.parseLong(claimsJws.getBody().getSubject());
+    }
+
+    /**
+     * 生成签名
+     *
+     * @param
+     * @return
+     */
+    public static String sign(Long userId) {
+        // 指定过期时间
+        return Jwts.builder()
+                .setSubject(String.valueOf(userId))
+                .signWith(SignatureAlgorithm.HS512, key)
+                .compact();
+    }
+
+}
+

+ 90 - 0
src/main/java/com/migao/config/authority/LoginUtils.java

@@ -0,0 +1,90 @@
+package com.migao.config.authority;
+
+
+import com.migao.config.constant.SystemConstant;
+import com.migao.config.exception.AuthenticationException;
+import com.migao.entity.po.User;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+
+
+public class LoginUtils {
+
+    public static final ThreadLocal<User> CURRENT_USER = new ThreadLocal<>();
+
+    public static Long getLoginUserId() {
+        ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+        if (requestAttributes == null) {
+            throw new AuthenticationException("请登录");
+        }
+        HttpServletRequest request =
+                requestAttributes.getRequest();
+        String authentication = request.getHeader("Authorization") == null ? (String) request.getServletContext().getAttribute("Authorization") : request.getHeader("Authorization");
+        if (StringUtils.isBlank(authentication)) {
+            throw new AuthenticationException("请登录");
+        }
+        String[] split = authentication.split(SystemConstant.BLANK_STRING);
+        if (split.length != 2) {
+            throw new AuthenticationException("非法令牌");
+        }
+        authentication = split[1];
+        return JWTUtil.getUserId(authentication);
+    }
+
+    public static boolean isLogin() {
+        ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+        if (requestAttributes == null) {
+            return false;
+        }
+        HttpServletRequest request =
+                requestAttributes.getRequest();
+        String authentication = request.getHeader("Authorization") == null ? (String) request.getServletContext().getAttribute("Authorization") : request.getHeader("Authorization");
+        if (StringUtils.isBlank(authentication)) {
+            return false;
+        }
+        String[] split = authentication.split(SystemConstant.BLANK_STRING);
+        if (split.length != 2) {
+            return false;
+        }
+        authentication = split[1];
+        if (StringUtils.isBlank(authentication)) {
+            return false;
+        }
+        return true;
+    }
+
+
+    public static User getUser() {
+        User user = CURRENT_USER.get();
+        if (user != null) {
+            return user;
+        } else {
+            throw new AuthenticationException("请重新登录");
+        }
+    }
+
+    public static String getToken() {
+        ServletRequestAttributes requestAttributes =
+                (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+        if (requestAttributes == null) {
+            throw new AuthenticationException("请登录");
+        }
+        HttpServletRequest request =
+                requestAttributes.getRequest();
+        String authentication = request.getHeader("Authorization") == null ? (String) request.getServletContext().getAttribute("Authorization") : request.getHeader("Authorization");
+        if (StringUtils.isBlank(authentication)) {
+            throw new AuthenticationException("请登录");
+        }
+        String[] split = authentication.split(SystemConstant.BLANK_STRING);
+        if (split.length != 2) {
+            throw new AuthenticationException("非法令牌");
+        }
+        authentication = split[1];
+        JWTUtil.getUserId(authentication);
+        return authentication;
+
+    }
+}

+ 7 - 0
src/main/java/com/migao/config/constant/RedisKeys.java

@@ -0,0 +1,7 @@
+package com.migao.config.constant;
+
+public interface RedisKeys {
+
+   
+
+}

+ 19 - 0
src/main/java/com/migao/config/constant/SecurityNameEnum.java

@@ -0,0 +1,19 @@
+package com.migao.config.constant;
+
+/**
+ * @version 1.0
+ * @Author mwh
+ * @Date 2020/5/14 11:38
+ */
+public enum SecurityNameEnum {
+    COMPANY_MANAGER("COMPANY_MANAGER"),
+    STATION_MANAGER("STATION_MANAGER"),
+    TG_MANAGER("TG_MANAGER"),
+    ;
+    private String name;
+
+    SecurityNameEnum(String name) {
+        this.name = name;
+    }
+
+}

+ 50 - 0
src/main/java/com/migao/config/constant/SystemConstant.java

@@ -0,0 +1,50 @@
+package com.migao.config.constant;
+
+
+public interface SystemConstant {
+
+    /**
+     * 静态资源映射前缀
+     */
+    String WEB_MVC_STATIC_RESOURCE_MAPPING_PREFIX = "file:";
+
+    /**
+     * LOG异常
+     */
+    String EXCEPTION_LOG_PREFIX = "发生异常信息:{}";
+    /**
+     * 文件前后缀分隔符
+     */
+    String FILE_NAME_SPLIT_SYMBOL = "\\.";
+
+    /**
+     * 文件前后缀粘粘
+     */
+    String FILE_NAME_CONCAT_SYMBOL = ".";
+
+    /**
+     * URI分隔符
+     */
+    String URI_CONCAT_SYMBOL = "/";
+
+    String URI_CONCAT_LEFT = "\\";
+
+    /**
+     * URI单层匹配
+     */
+    String URI_SINGLE_PATTERN_SYMBOL = "*";
+
+    /**
+     * URI全匹配
+     */
+    String URI_FULL_PATTERN_SYMBOL = "**";
+
+    /**
+     * IO
+     */
+    int READ_SIZE = 8 * 1024;
+
+    String BLANK_STRING = " ";
+
+    String EXCEL_SUFFIX = ".xlsx";
+}

+ 18 - 0
src/main/java/com/migao/config/constant/TimeConstant.java

@@ -0,0 +1,18 @@
+package com.migao.config.constant;
+
+import java.time.format.DateTimeFormatter;
+
+public interface TimeConstant {
+
+    String DAY = "天";
+
+    String FULL_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss";
+
+    String YEAR_MONTH_DAY_PATTERN = "yyyy-MM-dd";
+
+    String YEAR_MONTH_PATTERN = "yyyy-MM";
+
+    DateTimeFormatter FULL_TIME_FORMATTER = DateTimeFormatter.ofPattern(TimeConstant.FULL_TIME_PATTERN);
+    DateTimeFormatter YEAR_MONTH_DAY_FORMATTER = DateTimeFormatter.ofPattern(TimeConstant.YEAR_MONTH_DAY_PATTERN);
+    DateTimeFormatter YEAR_MONTH_FORMATTER = DateTimeFormatter.ofPattern(TimeConstant.YEAR_MONTH_PATTERN);
+}

+ 8 - 0
src/main/java/com/migao/config/exception/AuthenticationException.java

@@ -0,0 +1,8 @@
+package com.migao.config.exception;
+
+
+public class AuthenticationException extends RuntimeException {
+    public AuthenticationException(String message) {
+        super(message);
+    }
+}

+ 7 - 0
src/main/java/com/migao/config/exception/AuthorityException.java

@@ -0,0 +1,7 @@
+package com.migao.config.exception;
+
+public class AuthorityException extends RuntimeException {
+    public AuthorityException(String message) {
+        super(message);
+    }
+}

+ 7 - 0
src/main/java/com/migao/config/exception/CustomException.java

@@ -0,0 +1,7 @@
+package com.migao.config.exception;
+
+public class CustomException extends RuntimeException {
+    public CustomException(String message) {
+        super(message);
+    }
+}

+ 125 - 0
src/main/java/com/migao/config/exception/handler/ExceptionController.java

@@ -0,0 +1,125 @@
+package com.migao.config.exception.handler;
+
+
+import com.migao.config.exception.AuthenticationException;
+import com.migao.config.exception.AuthorityException;
+import com.migao.config.exception.CustomException;
+import com.migao.config.response.ResponseBean;
+import com.migao.config.response.ResponseBuilder;
+import com.migao.config.response.ResponseEnum;
+import org.springframework.http.HttpStatus;
+import org.springframework.validation.BindException;
+import org.springframework.web.bind.MethodArgumentNotValidException;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseStatus;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+import java.security.SignatureException;
+import java.util.ArrayList;
+import java.util.List;
+
+
+@RestControllerAdvice
+public class ExceptionController {
+
+    /**
+     * 异常
+     */
+    @ResponseStatus(HttpStatus.OK)
+    @ExceptionHandler({
+            Exception.class
+    })
+    public ResponseBean<?> exceptionHandler(Exception e) {
+        e.printStackTrace();
+        return ResponseBuilder.fail(e.getMessage());
+    }
+
+    /**
+     * 自定义异常
+     */
+    @ResponseStatus(HttpStatus.OK)
+    @ExceptionHandler({
+            CustomException.class
+    })
+    public ResponseBean<?> handleCustomException(CustomException e) {
+        e.printStackTrace();
+        return ResponseBuilder.fail(e.getMessage());
+    }
+
+    /**
+     * token 无效
+     */
+    @ResponseStatus(HttpStatus.OK)
+    @ExceptionHandler({
+            SignatureException.class
+    })
+    public ResponseBean<?> handleCustomException(SignatureException e) {
+        e.printStackTrace();
+        return ResponseBuilder.fail(ResponseEnum.UNAUTHORIZED.status, ResponseEnum.UNAUTHORIZED.message);
+    }
+
+    /**
+     * 权限不足
+     */
+    @ResponseStatus(HttpStatus.OK)
+    @ExceptionHandler({
+            AuthorityException.class
+    })
+    public ResponseBean<?> handleAuthorityException(AuthorityException e) {
+        e.printStackTrace();
+        return ResponseBuilder.fail(ResponseEnum.FORBIDDEN.status, ResponseEnum.FORBIDDEN.message);
+    }
+
+    /**
+     * 认证失败
+     */
+    @ResponseStatus(HttpStatus.OK)
+    @ExceptionHandler({
+            AuthenticationException.class
+    })
+    public ResponseBean<?> handleAuthenticationException(AuthenticationException e) {
+        e.printStackTrace();
+        return ResponseBuilder.fail(ResponseEnum.UNAUTHORIZED.status, ResponseEnum.UNAUTHORIZED.message);
+    }
+
+
+    /**
+     * 参数校验
+     *
+     * @param e
+     * @return
+     */
+    @ResponseStatus(HttpStatus.OK)
+    @ExceptionHandler({MethodArgumentNotValidException.class})
+    public ResponseBean<?> handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
+        e.printStackTrace();
+        List<String> errorList = new ArrayList<>();
+        e.getBindingResult().getAllErrors().forEach(
+                objectError -> {
+                    errorList.add(objectError.getDefaultMessage());
+                }
+        );
+        return ResponseBuilder.fail(errorList.toString());
+    }
+
+    /**
+     * 参数校验
+     *
+     * @param e
+     * @return
+     */
+    @ResponseStatus(HttpStatus.OK)
+    @ExceptionHandler({BindException.class})
+    public ResponseBean<?> handleBindException(BindException e) {
+        e.printStackTrace();
+        List<String> errorList = new ArrayList<>();
+        e.getBindingResult().getAllErrors().forEach(
+                objectError -> {
+                    errorList.add(objectError.getDefaultMessage());
+                }
+        );
+        return ResponseBuilder.fail(errorList.toString());
+    }
+
+
+}

+ 45 - 0
src/main/java/com/migao/config/exception/handler/HttpErrorController.java

@@ -0,0 +1,45 @@
+package com.migao.config.exception.handler;
+
+import com.migao.config.response.ResponseBean;
+import com.migao.config.response.ResponseBuilder;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.boot.web.servlet.error.ErrorController;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseStatus;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * @version 1.0
+ * @Author mwh
+ * @Date 2020/5/14 10:19
+ */
+//TODO 项目上线后放开
+@RestController
+@Slf4j
+public class HttpErrorController implements ErrorController {
+
+    private final static String ERROR_PATH = "/error";
+
+    @RequestMapping(path = ERROR_PATH)
+    @ResponseStatus(HttpStatus.OK)
+    public ResponseBean<?> error(HttpServletRequest request, HttpServletResponse response) {
+        log.info("访问/error" + "  错误代码:" + response.getStatus());
+        switch (response.getStatus()) {
+            case 400:
+                return ResponseBuilder.fail("请校验请求参数");
+            case 404:
+                return ResponseBuilder.fail("资源不存在");
+            default:
+                return ResponseBuilder.fail("其他异常,请联系管理员");
+        }
+    }
+
+    @Override
+    public String getErrorPath() {
+        return ERROR_PATH;
+    }
+}

+ 120 - 0
src/main/java/com/migao/config/jpa/SnowFlake.java

@@ -0,0 +1,120 @@
+package com.migao.config.jpa;
+
+/**
+ * Twitter的分布式自增ID雪花算法snowflake
+ * https://juejin.im/post/5c75132f51882562276c5065
+ */
+public class SnowFlake {
+
+    /**
+     * 起始的时间戳:这个时间戳自己随意获取,比如自己代码的时间戳
+     */
+    private final static long START_STMP = 1543903501000L;
+
+    /**
+     * 每一部分占用的位数
+     */
+    private final static long SEQUENCE_BIT = 12; //序列号占用的位数
+    private final static long MACHINE_BIT = 5;  //机器标识占用的位数
+    private final static long DATACENTER_BIT = 5;//数据中心占用的位数
+
+    /**
+     * 每一部分的最大值:先进行左移运算,再同-1进行异或运算;异或:相同位置相同结果为0,不同结果为1
+     */
+    /**
+     * 用位运算计算出最大支持的数据中心数量:31
+     */
+    private final static long MAX_DATACENTER_NUM = -1L ^ (-1L << DATACENTER_BIT);
+
+    /**
+     * 用位运算计算出最大支持的机器数量:31
+     */
+    private final static long MAX_MACHINE_NUM = -1L ^ (-1L << MACHINE_BIT);
+
+    /**
+     * 用位运算计算出12位能存储的最大正整数:4095
+     */
+    private final static long MAX_SEQUENCE = -1L ^ (-1L << SEQUENCE_BIT);
+
+    /**
+     * 每一部分向左的位移
+     */
+
+    /**
+     * 机器标志较序列号的偏移量
+     */
+    private final static long MACHINE_LEFT = SEQUENCE_BIT;
+
+    /**
+     * 数据中心较机器标志的偏移量
+     */
+    private final static long DATACENTER_LEFT = SEQUENCE_BIT + MACHINE_BIT;
+
+    /**
+     * 时间戳较数据中心的偏移量
+     */
+    private final static long TIMESTMP_LEFT = DATACENTER_LEFT + DATACENTER_BIT;
+
+    private static long datacenterId;  //数据中心
+    private static long machineId;    //机器标识
+    private static long sequence = 0L; //序列号
+    private static long lastStmp = -1L;//上一次时间戳
+
+    /**
+     * 此处无参构造私有,同时没有给出有参构造,在于避免以下两点问题:
+     * 1、私有化避免了通过new的方式进行调用,主要是解决了在for循环中通过new的方式调用产生的id不一定唯一问题问题,因为用于			 记录上一次时间戳的lastStmp永远无法得到比对;
+     * 2、没有给出有参构造在第一点的基础上考虑了一套分布式系统产生的唯一序列号应该是基于相同的参数
+     */
+    private SnowFlake() {
+    }
+
+    /**
+     * 产生下一个ID
+     *
+     * @return
+     */
+    public static synchronized long nextId() {
+        /** 获取当前时间戳 */
+        long currStmp = getNewstmp();
+
+        /** 如果当前时间戳小于上次时间戳则抛出异常 */
+        if (currStmp < lastStmp) {
+            throw new RuntimeException("Clock moved backwards.  Refusing to generate id");
+        }
+        /** 相同毫秒内 */
+        if (currStmp == lastStmp) {
+            //相同毫秒内,序列号自增
+            sequence = (sequence + 1) & MAX_SEQUENCE;
+            //同一毫秒的序列数已经达到最大
+            if (sequence == 0L) {
+
+                /** 获取下一时间的时间戳并赋值给当前时间戳 */
+                currStmp = getNextMill();
+            }
+        } else {
+            //不同毫秒内,序列号置为0
+            sequence = 0L;
+        }
+        /** 当前时间戳存档记录,用于下次产生id时对比是否为相同时间戳 */
+        lastStmp = currStmp;
+
+
+        return (currStmp - START_STMP) << TIMESTMP_LEFT //时间戳部分
+                | datacenterId << DATACENTER_LEFT      //数据中心部分
+                | machineId << MACHINE_LEFT            //机器标识部分
+                | sequence;                            //序列号部分
+    }
+
+    private static long getNextMill() {
+        long mill = getNewstmp();
+        while (mill <= lastStmp) {
+            mill = getNewstmp();
+        }
+        return mill;
+    }
+
+    private static long getNewstmp() {
+        return System.currentTimeMillis();
+    }
+
+}

+ 18 - 0
src/main/java/com/migao/config/jpa/SnowIdentityGenerator.java

@@ -0,0 +1,18 @@
+package com.migao.config.jpa;
+
+import org.hibernate.engine.spi.SharedSessionContractImplementor;
+import org.hibernate.id.IdentityGenerator;
+
+import java.io.Serializable;
+
+/**
+ * @version 1.0
+ * @Author mwh
+ * @Date 2020/1/21 10:11
+ */
+public class SnowIdentityGenerator extends IdentityGenerator {
+    @Override
+    public Serializable generate(SharedSessionContractImplementor s, Object obj) {
+        return SnowFlake.nextId();
+    }
+}

+ 40 - 0
src/main/java/com/migao/config/json/JacksonNullStringDeserializer.java

@@ -0,0 +1,40 @@
+package com.migao.config.json;
+
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.databind.JsonSerializer;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializerProvider;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Primary;
+import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
+
+import java.io.IOException;
+
+/**
+ * @author mwh
+ * description    处理掉返回null的情况
+ * createDate     2019/2/13 10:57
+ * updateRemark
+ * version        1.0
+ */
+
+//@Configuration
+public class JacksonNullStringDeserializer {
+
+    @Bean
+    @Primary
+    @ConditionalOnMissingBean(ObjectMapper.class)
+    public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
+        ObjectMapper objectMapper = builder.createXmlMapper(false).build();
+        objectMapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>() {
+            @Override
+            public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
+                jsonGenerator.writeString("");
+            }
+        });
+        return objectMapper;
+    }
+
+
+}

+ 53 - 0
src/main/java/com/migao/config/json/LocalDateTimeToJacksonConfig.java

@@ -0,0 +1,53 @@
+package com.migao.config.json;
+
+import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
+import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
+import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer;
+import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
+import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
+import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer;
+import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.format.DateTimeFormatter;
+
+@Configuration
+public class LocalDateTimeToJacksonConfig {
+
+    /**
+     * LocalDateTime格式化
+     */
+    private static final String LOCAL_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
+    /**
+     * LocalDate格式化
+     */
+    private static final String LOCAL_DATE_FORMAT = "yyyy-MM-dd";
+
+    private static final String LOCAL_TIME_FORMAT = "HH:mm:ss";
+
+    @Bean
+    public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
+        // 序列化
+        LocalDateTimeSerializer localDateTimeSerializer = new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(LOCAL_DATE_TIME_FORMAT));
+        LocalDateSerializer localDateSerializer = new LocalDateSerializer(DateTimeFormatter.ofPattern(LOCAL_DATE_FORMAT));
+        LocalTimeSerializer localTimeSerializer = new LocalTimeSerializer(DateTimeFormatter.ofPattern(LOCAL_TIME_FORMAT));
+        // 反序列化
+        LocalDateTimeDeserializer localDateTimeDeserializer = new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(LOCAL_DATE_TIME_FORMAT));
+        LocalDateDeserializer localDateDeserializer = new LocalDateDeserializer(DateTimeFormatter.ofPattern(LOCAL_DATE_FORMAT));
+        LocalTimeDeserializer localTimeDeserializer = new LocalTimeDeserializer(DateTimeFormatter.ofPattern(LOCAL_TIME_FORMAT));
+        return builder -> builder
+                .serializerByType(LocalDateTime.class, localDateTimeSerializer)
+                .serializerByType(LocalDate.class, localDateSerializer)
+                .serializerByType(LocalTime.class, localTimeSerializer)
+                .deserializerByType(LocalDateTime.class, localDateTimeDeserializer)
+                .deserializerByType(LocalDate.class, localDateDeserializer)
+                .deserializerByType(LocalTime.class, localTimeDeserializer)
+                ;
+    }
+
+
+}

+ 14 - 0
src/main/java/com/migao/config/mybatis/MybatisPlusConfig.java

@@ -0,0 +1,14 @@
+package com.migao.config.mybatis;
+
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @version 1.0
+ * @Author mwh
+ * @Date 2020/4/10 10:42
+ */
+@Configuration
+@MapperScan(value = "com.migao.mapper")
+public class MybatisPlusConfig {
+}

+ 49 - 0
src/main/java/com/migao/config/properties/SystemProperties.java

@@ -0,0 +1,49 @@
+package com.migao.config.properties;
+
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author mwh
+ * description    项目配置
+ * createDate     2019/4/11 10:26
+ * updateRemark
+ * version        1.0
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Component
+@ConfigurationProperties(prefix = "cn.jihengcc.ypd")
+public class SystemProperties {
+
+    /**
+     * 文件下载前缀
+     */
+    public String downloadPrefix;
+
+    /**
+     * 文件文件夹路径
+     */
+    public String fileStoreDir;
+
+    /**
+     * 文件 注意最后的斜杠
+     */
+    public String fileStoreDirPath;
+
+    /**
+     * 文件解压后的路径
+     */
+    public String zipOutDir;
+
+    /**
+     * 文件临时路径
+     */
+    private String fileTempDir;
+
+}

+ 24 - 0
src/main/java/com/migao/config/response/ExceptionInfoEnum.java

@@ -0,0 +1,24 @@
+package com.migao.config.response;
+
+/**
+ * @author dingsong
+ */
+
+public enum ExceptionInfoEnum {
+    /**
+     *
+     */
+    dianliang("发电容量不一致"),
+    hushu("总户数不一致"),
+    ;
+
+    private final String value;
+
+    ExceptionInfoEnum(String value) {
+        this.value = value;
+    }
+
+    public String getValue() {
+        return value;
+    }
+}

+ 28 - 0
src/main/java/com/migao/config/response/PageBean.java

@@ -0,0 +1,28 @@
+package com.migao.config.response;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+/**
+ * 构建统一分页相应
+ *
+ * @param <T>
+ */
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class PageBean<T> {
+
+    private Integer page;
+
+    private Long total;
+
+    private List<T> row;
+
+}

+ 20 - 0
src/main/java/com/migao/config/response/ResponseBean.java

@@ -0,0 +1,20 @@
+package com.migao.config.response;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+public class ResponseBean<T> {
+
+    private Integer status;
+
+    private String massage;
+
+    private T data;
+
+}

+ 158 - 0
src/main/java/com/migao/config/response/ResponseBuilder.java

@@ -0,0 +1,158 @@
+package com.migao.config.response;
+
+
+import org.springframework.data.domain.Page;
+
+import java.util.List;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+
+/**
+ * 构建统一响应格式
+ *
+ * @param <T>
+ */
+
+public class ResponseBuilder<T> {
+
+    /**
+     * 相应单一对象
+     *
+     * @param
+     * @param
+     * @return
+     */
+    public static <T> ResponseBean<T> ok() {
+        return ResponseBean.<T>builder().status(ResponseEnum.OK.status).massage(ResponseEnum.OK.message).build();
+    }
+
+    /**
+     * 相应单一对象
+     *
+     * @param
+     * @param
+     * @return
+     */
+    public static <T> ResponseBean<T> ok(Integer status, String massage) {
+        return ResponseBean.<T>builder().status(status).massage(massage).build();
+    }
+
+    /**
+     * 相应单一对象
+     *
+     * @param data
+     * @param <T>
+     * @return
+     */
+    public static <T> ResponseBean<T> ok(T data) {
+        return ResponseBean.<T>builder().status(ResponseEnum.OK.status).massage(ResponseEnum.OK.message).data(data).build();
+    }
+
+    /**
+     * 相应单一对象
+     *
+     * @param data
+     * @param <T>
+     * @return
+     */
+    public static <T> ResponseBean<T> ok(T data, String message) {
+        return ResponseBean.<T>builder().status(ResponseEnum.OK.status).massage(message).data(data).build();
+    }
+
+
+    /**
+     * 构建分页
+     *
+     * @param function
+     * @param <T>
+     * @param <R>
+     * @return
+     */
+    public static <T, R> ResponseBean<List<R>> ok(List<T> dataList, Function<? super T, ? extends R> function) {
+        return ResponseBean.<List<R>>builder().data(buildBean(dataList, function)).status(ResponseEnum.OK.status).massage(ResponseEnum.OK.message).build();
+    }
+
+    /**
+     * 构建分页
+     *
+     * @param page
+     * @param function
+     * @param <T>
+     * @param <R>
+     * @return
+     */
+    public static <T, R> ResponseBean<PageBean<R>> ok(Page<T> page, Function<? super T, ? extends R> function) {
+        return ResponseBean.<PageBean<R>>builder().data(buildPageBean(page, function)).status(ResponseEnum.OK.status).massage(ResponseEnum.OK.message).build();
+    }
+
+
+    /**
+     * 构建分页
+     *
+     * @param function
+     * @param <T>
+     * @param <R>
+     * @return
+     */
+    public static <T, R> List<R> buildBean(List<T> dataList, Function<? super T, ? extends R> function) {
+        return dataList.stream().map(function).collect(Collectors.toList());
+    }
+
+    /**
+     * 构建分页
+     *
+     * @param page
+     * @param function
+     * @param <T>
+     * @param <R>
+     * @return
+     */
+    public static <T, R> PageBean<R> buildPageBean(Page<T> page, Function<? super T, ? extends R> function) {
+        return PageBean
+                .<R>builder()
+                .row(
+                        page.getContent().stream().map(function).collect(Collectors.toList())
+                )
+                .total(page.getTotalElements())
+                .page(page.getTotalPages())
+                .build();
+    }
+
+    /**
+     * 失败
+     *
+     * @return
+     */
+    public static <T> ResponseBean<T> fail() {
+        return ResponseBean.<T>builder().status(ResponseEnum.FAIL.status).massage(ResponseEnum.FAIL.message).build();
+    }
+
+    /**
+     * 失败
+     */
+    public static <T> ResponseBean<T> fail(Integer status, String message) {
+        return ResponseBean.<T>builder().status(status).massage(message).build();
+    }
+
+    /**
+     * 失败
+     */
+    public static <T> ResponseBean<T> fail(String message) {
+        return ResponseBean.<T>builder().status(ResponseEnum.FAIL.status).massage(message).build();
+    }
+
+    /**
+     * 失败
+     *
+     * @return
+     */
+    public static <T> ResponseBean<T> fail(T data) {
+        return ResponseBean.<T>builder().status(ResponseEnum.FAIL.status).massage(ResponseEnum.FAIL.message).data(data).build();
+    }
+
+    public static <T> ResponseBean<T> fail(ResponseEnum responseEnum) {
+        return ResponseBean.<T>builder().status(responseEnum.status).massage(responseEnum.message).build();
+    }
+
+}

+ 22 - 0
src/main/java/com/migao/config/response/ResponseEnum.java

@@ -0,0 +1,22 @@
+package com.migao.config.response;
+
+public enum ResponseEnum {
+
+    /**
+     *
+     */
+    OK(10000,"成功"),
+    UNAUTHORIZED(30001,"未认证"),
+    FORBIDDEN(30002,"未认证"),
+    NOTFOUND(40000,"未找到资源"),
+    FAIL(50000,"失败");
+
+    public final int status;
+    public final String message;
+
+    ResponseEnum(int status, String message) {
+        this.status = status;
+        this.message = message;
+    }
+
+}

+ 10 - 0
src/main/java/com/migao/config/swagger/SwaggerConfig.java

@@ -0,0 +1,10 @@
+package com.migao.config.swagger;
+
+import com.spring4all.swagger.EnableSwagger2Doc;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+@EnableSwagger2Doc
+public class SwaggerConfig {
+
+}

+ 4 - 0
src/main/java/com/migao/config/validation/Insert.java

@@ -0,0 +1,4 @@
+package com.migao.config.validation;
+
+public interface Insert {
+}

+ 4 - 0
src/main/java/com/migao/config/validation/Update.java

@@ -0,0 +1,4 @@
+package com.migao.config.validation;
+
+public interface Update {
+}

+ 37 - 0
src/main/java/com/migao/controller/FileInfoController.java

@@ -0,0 +1,37 @@
+package com.migao.controller;
+
+
+import com.migao.config.response.ResponseBean;
+import com.migao.entity.vo.res.FileRes;
+import com.migao.service.FileService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestPart;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+
+
+/**
+ *
+ * @author : lcl
+ * @date : 2020/10/14 9:24
+ */
+@Api(tags = "001.统一上传")
+@RestController
+@RequestMapping(value = "/file")
+public class FileInfoController {
+
+    @Resource
+    private FileService fileInfoService;
+
+    @ApiOperation(value = "01.文件统一上传")
+    @PostMapping(value = "/upload")
+    public ResponseBean<FileRes> upload(@RequestPart MultipartFile file) {
+        return fileInfoService.upload(file);
+    }
+
+}

+ 44 - 0
src/main/java/com/migao/controller/UserController.java

@@ -0,0 +1,44 @@
+package com.migao.controller;
+
+import com.migao.config.properties.SystemProperties;
+import com.migao.config.response.ResponseBean;
+import com.migao.config.validation.Insert;
+import com.migao.entity.vo.req.UserInsertReq;
+import com.migao.entity.vo.req.UserLoginReq;
+import com.migao.service.UserService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiOperationSupport;
+import org.springframework.http.ResponseEntity;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+@Api(tags = "001.用户")
+@RestController
+@RequestMapping("/user")
+public class UserController {
+
+    @Resource
+    private UserService userService;
+    @Resource
+    private SystemProperties systemProperties;
+
+    @ApiOperation("新增用户")
+    @PostMapping(value = "/insert")
+    public ResponseBean<?> insert(
+            @Validated(value = {Insert.class}) @RequestBody UserInsertReq userInsertReq
+    ) {
+        return userService.insert(userInsertReq);
+    }
+
+    @ApiOperation("登录")
+    @PostMapping(value = "/login")
+    public ResponseEntity<?> login(@RequestBody UserLoginReq userLoginReq) {
+        return userService.login(userLoginReq);
+    }
+}

+ 56 - 0
src/main/java/com/migao/entity/po/FileInfo.java

@@ -0,0 +1,56 @@
+package com.migao.entity.po;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.hibernate.annotations.GenericGenerator;
+
+import javax.persistence.*;
+
+/**
+ * @version 1.0
+ * @Author mwh
+ * @Date 2020/4/10 9:20
+ */
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+@Entity
+@Table(name = "t_file_info")
+@org.hibernate.annotations.Table(appliesTo = "t_file_info", comment = "文件")
+@TableName("t_file_info")
+public class FileInfo {
+
+    @Id
+    @TableId(type = IdType.ASSIGN_ID)
+    @GeneratedValue(generator = "snowFlake")
+    @GenericGenerator(name = "snowFlake", strategy = "com.migao.config.jpa.SnowIdentityGenerator")
+    @Column(name = "id", columnDefinition = "bigint(20) comment '主键'")
+    private Long id;
+
+    @Column(name = "name", columnDefinition = "varchar(255) comment '文件名称'")
+    private String name;
+
+    @Column(name = "original_name", columnDefinition = "varchar(255) comment '文件原名'")
+    private String originalName;
+
+    @Column(name = "suffix", columnDefinition = "varchar(255) comment '后缀'")
+    private String suffix;
+
+    @Column(name = "uri", columnDefinition = "varchar(255) comment '访问地址'")
+    private String uri;
+
+    @Column(name = "size", columnDefinition = "varchar(255) comment '文件大小'")
+    private Long size;
+
+    @Column(name = "disk_path", columnDefinition = "varchar(255) comment '磁盘路径'")
+    private String diskPath;
+
+    @Column(name = "deleted", columnDefinition = "tinyint(4) comment '逻辑删除 0未删除 1已删除'")
+    private Integer deleted;
+
+}

+ 78 - 0
src/main/java/com/migao/entity/po/User.java

@@ -0,0 +1,78 @@
+package com.migao.entity.po;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.hibernate.annotations.GenericGenerator;
+
+import javax.persistence.*;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * @author : lcl
+ * @date : 2020/4/15 8:50
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+@Entity
+@Table(name = "t_user")
+@org.hibernate.annotations.Table(appliesTo = "t_user", comment = "用户")
+@TableName("t_user")
+public class User implements Serializable {
+
+    @Id
+    @TableId(type = IdType.ASSIGN_ID)
+    @GeneratedValue(generator = "snowFlake")
+    @GenericGenerator(name = "snowFlake", strategy = "com.migao.config.jpa.SnowIdentityGenerator")
+    @Column(name = "id", columnDefinition = "bigint(20) comment '主键'")
+    private Long id;
+
+    @Column(name = "department_id", columnDefinition = "bigint(20) comment '部门id'")
+    private Long departmentId;
+
+    @Column(name = "name", columnDefinition = "varchar(255) comment '姓名'")
+    private String name;
+
+    @Column(name = "username", columnDefinition = "varchar(255) comment '用户/姓名全拼'")
+    private String username;
+
+    @Column(name = "password", columnDefinition = "varchar(255) comment '密码'")
+    private String password;
+
+    @Column(name = "phone", columnDefinition = "varchar(255) comment '注册手机号'")
+    private String phone;
+
+    @Column(name = "email", columnDefinition = "varchar(255) comment '注册邮箱'")
+    private String email;
+
+    @Column(name = "head", columnDefinition = "varchar(255) comment '头像'")
+    private String head;
+
+    @Column(name = "salt", columnDefinition = "varchar(255) comment '加密盐'")
+    private String salt;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    @Column(name = "deleted", columnDefinition = "tinyint(4) comment '逻辑删除 0未删除 1已删除'")
+    private Integer deleted;
+    @TableField(fill = FieldFill.UPDATE)
+    @Column(name = "update_time", columnDefinition = "timestamp DEFAULT CURRENT_TIMESTAMP comment '修改时间'")
+    private LocalDateTime updateTime;
+    @TableField(fill = FieldFill.UPDATE)
+    @JoinColumn(name = "update_user_id", columnDefinition = "bigint(20) comment '最后修改人'")
+    private Long updateUserId;
+    @Column(name = "delete_time", columnDefinition = "timestamp DEFAULT CURRENT_TIMESTAMP comment '删除时间'")
+    private LocalDateTime deleteTime;
+    @JoinColumn(name = "delete_user_id", columnDefinition = "bigint(20) comment '删除人'")
+    private Long deleteUserId;
+    @TableField(fill = FieldFill.INSERT)
+    @Column(name = "create_time", columnDefinition = "timestamp DEFAULT CURRENT_TIMESTAMP comment '创建时间'")
+    private LocalDateTime createTime;
+
+    @JoinColumn(name = "create_user_id", columnDefinition = "bigint(20) comment '新增人'")
+    private Long createUserId;
+}

+ 47 - 0
src/main/java/com/migao/entity/vo/req/UserInsertReq.java

@@ -0,0 +1,47 @@
+package com.migao.entity.vo.req;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.NotEmpty;
+import java.util.List;
+
+
+/**
+ * @version 1.0
+ * @Author mwh
+ * @Date 2020/4/10 14:20
+ */
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+@Data
+public class UserInsertReq {
+
+    @ApiModelProperty(value = "密码")
+    @NotEmpty(message = "密码不能为空")
+    private String password;
+
+    @ApiModelProperty(value = "注册手机号")
+    @NotEmpty(message = "注册手机号不能为空")
+    private String phone;
+
+    @ApiModelProperty(value = "用户")
+    @NotEmpty(message = "用户不能为空")
+    private String username;
+
+    @ApiModelProperty(value = "部门id")
+    @NotEmpty(message = "部门不能为空")
+    @JsonSerialize(using=ToStringSerializer.class)
+    private Long departmentId;
+
+    @ApiModelProperty(value = "角色id")
+    @NotEmpty(message = "角色不能为空")
+    @JsonSerialize(using= ToStringSerializer.class)
+    private List<Long> roles;
+}

+ 21 - 0
src/main/java/com/migao/entity/vo/req/UserLoginReq.java

@@ -0,0 +1,21 @@
+package com.migao.entity.vo.req;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class UserLoginReq {
+
+    @ApiModelProperty(value = "账号",example = "admin")
+    private String username;
+
+    @ApiModelProperty(value = "密码",example = "123456")
+    private String password;
+
+}

+ 44 - 0
src/main/java/com/migao/entity/vo/res/FileRes.java

@@ -0,0 +1,44 @@
+package com.migao.entity.vo.res;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+@ApiModel("统一上传返回")
+public class FileRes implements Serializable {
+    private static final long serialVersionUID = 3625082988216644029L;
+
+    @JsonSerialize(using= ToStringSerializer.class)
+    private Long id;
+
+    @ApiModelProperty(name = "name", example = "1")
+    private String name;
+
+    @ApiModelProperty(name = "name", example = "1")
+    private String originalName;
+
+    @ApiModelProperty(name = "name", example = "1")
+    private String suffix;
+
+    @ApiModelProperty(name = "name", example = "1")
+    private String url;
+
+    @ApiModelProperty(name = "name", example = "1")
+    @JsonSerialize(using= ToStringSerializer.class)
+    private Long size;
+
+    @ApiModelProperty(name = "name", example = "1")
+    private String diskPath;
+
+}

+ 40 - 0
src/main/java/com/migao/entity/vo/res/UserLoginRes.java

@@ -0,0 +1,40 @@
+package com.migao.entity.vo.res;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Set;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class UserLoginRes implements Serializable {
+
+    @JsonSerialize(using= ToStringSerializer.class)
+    private Long id;
+
+    @ApiModelProperty(value = "用户")
+    private String username;
+
+    @ApiModelProperty(value = "注册手机号")
+    private String phone;
+
+    @ApiModelProperty(value = "头像")
+    private String head;
+
+    private String token;
+
+    @ApiModelProperty(value = "部门名字")
+    private String deptName;
+
+}

+ 7 - 0
src/main/java/com/migao/mapper/FileInfoMapper.java

@@ -0,0 +1,7 @@
+package com.migao.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.migao.entity.po.FileInfo;
+
+public interface FileInfoMapper extends BaseMapper<FileInfo> {
+}

+ 15 - 0
src/main/java/com/migao/mapper/UserMapper.java

@@ -0,0 +1,15 @@
+package com.migao.mapper;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.migao.entity.po.User;
+
+/**
+ * @version 1.0
+ * @Author mwh
+ * @Date 2020/4/10 11:00
+ */
+
+public interface UserMapper extends BaseMapper<User> {
+
+}

+ 9 - 0
src/main/java/com/migao/service/FileService.java

@@ -0,0 +1,9 @@
+package com.migao.service;
+
+import com.migao.config.response.ResponseBean;
+import com.migao.entity.vo.res.FileRes;
+import org.springframework.web.multipart.MultipartFile;
+
+public interface FileService {
+    ResponseBean<FileRes> upload(MultipartFile file);
+}

+ 12 - 0
src/main/java/com/migao/service/UserService.java

@@ -0,0 +1,12 @@
+package com.migao.service;
+
+import com.migao.config.response.ResponseBean;
+import com.migao.entity.vo.req.UserInsertReq;
+import com.migao.entity.vo.req.UserLoginReq;
+import org.springframework.http.ResponseEntity;
+
+public interface UserService {
+    ResponseEntity<?> login(UserLoginReq userLoginReq);
+
+    ResponseBean<?> insert(UserInsertReq userInsertReq);
+}

+ 89 - 0
src/main/java/com/migao/service/impl/FileServiceImpl.java

@@ -0,0 +1,89 @@
+package com.migao.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.migao.config.constant.SystemConstant;
+import com.migao.config.jpa.SnowFlake;
+import com.migao.config.properties.SystemProperties;
+import com.migao.config.response.ResponseBean;
+import com.migao.config.response.ResponseBuilder;
+import com.migao.entity.po.FileInfo;
+import com.migao.entity.vo.res.FileRes;
+import com.migao.mapper.FileInfoMapper;
+import com.migao.service.FileService;
+import com.migao.util.EntityUtils;
+import com.migao.util.FileUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import java.io.File;
+import java.io.IOException;
+
+@Slf4j
+@Service
+@Transactional(rollbackFor = {Exception.class})
+public class FileServiceImpl implements FileService {
+    @Resource
+    private SystemProperties systemProperties;
+    @Resource
+    private FileInfoMapper fileInfoMapper;
+    @Override
+    public ResponseBean<FileRes> upload(MultipartFile file) {
+        String originalFilename = file.getOriginalFilename();
+        String prefix = FileUtils.getPrefix(originalFilename, SystemConstant.FILE_NAME_SPLIT_SYMBOL);
+        String suffix = FileUtils.getSuffix(originalFilename, SystemConstant.FILE_NAME_SPLIT_SYMBOL);
+        String fileNo = String.valueOf(SnowFlake.nextId());
+        String uri = StringUtils.join(
+                systemProperties.getFileTempDir(),
+                SystemConstant.URI_CONCAT_SYMBOL,
+                fileNo,
+                SystemConstant.FILE_NAME_CONCAT_SYMBOL,
+                suffix
+        );
+
+        String finalName = StringUtils.join(
+                fileNo,
+                SystemConstant.FILE_NAME_CONCAT_SYMBOL,
+                suffix
+        );
+        System.out.println(finalName);
+        String diskPath = StringUtils.join(
+                systemProperties.getFileStoreDirPath(),
+                systemProperties.getFileTempDir(),
+                File.separator,
+                finalName
+        );
+        String url = StringUtils.join(
+                systemProperties.getDownloadPrefix(),
+                uri
+        );
+        try {
+            //写入文件
+            FileUtils.storeFileByInputStream(
+                    file.getInputStream(),
+                    diskPath
+            );
+        } catch (IOException e) {
+            e.printStackTrace();
+            return ResponseBuilder.fail("文件上传失败");
+        }
+        FileInfo build = FileInfo
+                .builder()
+                .name(finalName)
+                .originalName(prefix)
+                .diskPath(diskPath)
+                .size(file.getSize())
+                .suffix(suffix)
+                .uri(finalName)
+                .deleted(0)
+                .build();
+        fileInfoMapper.insert(build);
+        log.info("上传文件:{}", JSONObject.toJSONString(build));
+        FileRes fileRes = EntityUtils.copyProperties(build, FileRes.class);
+        fileRes.setUrl(url);
+        return ResponseBuilder.ok(fileRes);
+    }
+}

+ 86 - 0
src/main/java/com/migao/service/impl/UserServiceImpl.java

@@ -0,0 +1,86 @@
+package com.migao.service.impl;
+
+import cn.hutool.crypto.digest.BCrypt;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.migao.config.authority.AuthenticationProperties;
+import com.migao.config.authority.JWTUtil;
+import com.migao.config.constant.SystemConstant;
+import com.migao.config.properties.SystemProperties;
+import com.migao.config.response.ResponseBean;
+import com.migao.config.response.ResponseBuilder;
+import com.migao.entity.po.User;
+import com.migao.entity.vo.req.UserInsertReq;
+import com.migao.entity.vo.req.UserLoginReq;
+import com.migao.entity.vo.res.UserLoginRes;
+import com.migao.mapper.UserMapper;
+import com.migao.service.UserService;
+import com.migao.util.EntityUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+
+@Slf4j
+@Service
+@Transactional(rollbackFor = {Exception.class})
+public class UserServiceImpl implements UserService {
+
+    @Resource
+    private AuthenticationProperties authenticationProperties;
+
+    @Resource
+    private UserMapper userMapper;
+    @Resource
+    private SystemProperties systemProperties;
+
+    @Override
+    public ResponseEntity<?> login(UserLoginReq userLoginReq) {
+        LambdaQueryWrapper<User> wrapper = Wrappers.<User>lambdaQuery().eq(User::getUsername, userLoginReq.getUsername());
+        User user = userMapper.selectOne(wrapper);
+        if (user == null) {
+            return ResponseEntity.ok().body(ResponseBuilder.fail("用户名或密码错误"));
+        }
+        UserLoginRes userLoginRes=new UserLoginRes();
+        //校验
+        boolean checkPassword = BCrypt.checkpw(userLoginReq.getPassword(), user.getPassword());
+        if (!checkPassword) {
+            return ResponseEntity.ok().body(ResponseBuilder.fail("用户名或密码错误"));
+        }
+        String sign = JWTUtil.sign(user.getId());
+        sign = StringUtils.join(authenticationProperties.getTokenPrefix(), SystemConstant.BLANK_STRING, sign);
+        userLoginRes.setToken(sign);
+        if (StringUtils.isBlank(user.getHead())) {
+            user.setHead("head.jpg");
+        }
+        userLoginRes.setHead(systemProperties.getDownloadPrefix() + user.getHead());
+        return ResponseEntity.ok().header(authenticationProperties.getHeaderName(), sign).body(ResponseBuilder.ok(userLoginRes));
+
+    }
+
+    @Override
+    public ResponseBean<?> insert(UserInsertReq userInsertReq) {
+//        if (!userInsertReq.getUsername().matches("[\\u4E00-\\u9FA5]+")) {
+//            return ResponseBuilder.fail("用户名必须为中文");
+//        }
+        LambdaQueryWrapper<User> wrapper = Wrappers.<User>lambdaQuery().eq(User::getUsername, userInsertReq.getUsername());
+        User usr = userMapper.selectOne(wrapper);
+        if (usr != null) {
+            return ResponseBuilder.fail("该用户已存在");
+        }
+        User user = EntityUtils.copyProperties(userInsertReq, User.class);
+        String salt = BCrypt.gensalt();
+        user.setSalt(salt);
+        user.setPassword(BCrypt.hashpw(user.getPassword(), salt));
+        user.setHead("head.jpg");
+        user.setName(userInsertReq.getUsername());
+//        //设置账号为姓名全拼
+//        String pinYin = PinyinUtil.getPinYin(userInsertReq.getUsername());
+//        user.setUsername(pinYin);
+        userMapper.insert(user);
+        return ResponseBuilder.ok();
+    }
+}

+ 17 - 0
src/main/java/com/migao/util/EntityUtils.java

@@ -0,0 +1,17 @@
+package com.migao.util;
+
+import org.springframework.beans.BeanUtils;
+
+public class EntityUtils {
+
+    public static <T, E> E copyProperties(T source, Class<E> targetClass) {
+        E targetEntity = null;
+        try {
+            targetEntity = targetClass.newInstance();
+            BeanUtils.copyProperties(source, targetEntity);
+        } catch (InstantiationException | IllegalAccessException e) {
+            e.printStackTrace();
+        }
+        return targetEntity;
+    }
+}

+ 89 - 0
src/main/java/com/migao/util/FileUtils.java

@@ -0,0 +1,89 @@
+package com.migao.util;
+
+import org.apache.commons.lang3.StringUtils;
+
+import java.io.*;
+import java.util.Arrays;
+import java.util.Objects;
+import java.util.UUID;
+
+
+public class FileUtils {
+
+    /**
+     * @param inputStream
+     * @param outputFilePath
+     */
+    public static void storeFileByInputStream(InputStream inputStream, String outputFilePath) {
+        try {
+            File targetFile = new File(outputFilePath);
+            OutputStream outStream = new FileOutputStream(targetFile);
+            byte[] buffer = new byte[1024 * 8];
+            int bytesRead;
+            while ((bytesRead = inputStream.read(buffer)) != -1) {
+                outStream.write(buffer, 0, bytesRead);
+            }
+            outStream.flush();
+            outStream.close();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 防止文件重复
+     *
+     * @return
+     */
+    public static String getFileNo() {
+        return UUID.randomUUID().toString().replaceAll("-", "");
+    }
+
+    /**
+     * 获取后缀
+     *
+     * @return
+     */
+    public static String getSuffix(String fileFullName, String spliter) {
+        if (StringUtils.isNotBlank(fileFullName)) {
+            String[] split = fileFullName.split(spliter);
+            if (split.length > 1) {
+                return split[1];
+            }
+        }
+        return "";
+    }
+
+    /**
+     * 获取前缀
+     *
+     * @return
+     */
+    public static String getPrefix(String fileFullName, String spliter) {
+        if (StringUtils.isNotBlank(fileFullName)) {
+            String[] split = fileFullName.split(spliter);
+            if (split.length > 1) {
+                return split[0];
+            }
+        }
+        return "";
+    }
+
+    public static void deleteDirFiles(String fileDirPath) {
+        File file = new File(fileDirPath);
+        if (file.isDirectory()) {
+            Arrays.asList(Objects.requireNonNull(file.listFiles())).forEach(
+                    File::delete
+            );
+        } else {
+            file.delete();
+        }
+    }
+
+    public static void mkdirs(String fileDirPath) {
+        File file = new File(fileDirPath);
+        if (!file.isDirectory()) {
+            file.mkdirs();
+        }
+    }
+}

+ 55 - 0
src/main/resources/application.yml

@@ -0,0 +1,55 @@
+server:
+  port: 31234
+
+# swagger配置
+swagger:
+  enabled: true
+  title: "项目管理"
+  base-package: com.migao.controller
+  description: "项目管理"
+
+spring:
+  profiles:
+    active:
+  servlet:
+    multipart:
+      max-file-size: 10240MB
+      max-request-size: 10240MB
+
+  datasource:
+    url: jdbc:mysql://localhost:3306/project?serverTimezone=Hongkong&useSSL=false&useUnicode=true&characterEncoding=UTF-8&nullCatalogMeansCurrent=true
+    hikari:
+      username: root
+      password: 1qazxsw2
+      maximum-pool-size: 10
+    driver-class-name: com.mysql.cj.jdbc.Driver
+
+  jpa:
+    show-sql: false
+    hibernate:
+      ddl-auto: update
+    properties:
+      hibernate:
+        format_sql: true
+    open-in-view: false
+    generate-ddl: true
+
+
+mybatis-plus:
+  mapper-locations: classpath*:/mapper/*.xml
+  global-config:
+    db-config:
+      table-prefix: t_
+      table-underline: true
+
+logging:
+  file:
+    path: ./project.log
+    max-size: 100MB
+  level:
+    root: info
+
+com:
+  migao:
+    download-prefix: http://127.0.0.1:${server.port}
+    file-store-dir: download