Ver Fonte

insert account commit and push

renruixin há 3 anos atrás
pai
commit
1bdd8d56c1
37 ficheiros alterados com 1464 adições e 439 exclusões
  1. 28 0
      pom.xml
  2. 0 163
      src/main/java/com/metro/aop/ExceptionAdvice.java
  3. 78 0
      src/main/java/com/metro/aop/GlobalExceptionHandler.java
  4. 0 47
      src/main/java/com/metro/aop/NoRepeatSubmitAop.java
  5. 57 0
      src/main/java/com/metro/baseRe/BaseResponse.java
  6. 0 126
      src/main/java/com/metro/baseRe/Ret.java
  7. 10 0
      src/main/java/com/metro/constant/UserConstant.java
  8. 118 13
      src/main/java/com/metro/controller/AccountController.java
  9. 2 2
      src/main/java/com/metro/controller/AreaController.java
  10. 3 3
      src/main/java/com/metro/controller/CompanyController.java
  11. 3 3
      src/main/java/com/metro/controller/MetroController.java
  12. 3 3
      src/main/java/com/metro/controller/PassreCordsController.java
  13. 48 0
      src/main/java/com/metro/entity/dto/AccountDTO.java
  14. 17 0
      src/main/java/com/metro/entity/error/MsgCode.java
  15. 14 6
      src/main/java/com/metro/entity/po/Account.java
  16. 19 0
      src/main/java/com/metro/entity/ro/account/DeleteAccountReq.java
  17. 20 0
      src/main/java/com/metro/entity/ro/account/DeleteAccountResp.java
  18. 19 0
      src/main/java/com/metro/entity/ro/account/DetailAccountReq.java
  19. 74 0
      src/main/java/com/metro/entity/ro/account/DetailAccountResp.java
  20. 23 10
      src/main/java/com/metro/entity/ro/account/InsertAccountReq.java
  21. 2 0
      src/main/java/com/metro/entity/ro/account/InsertAccountResp.java
  22. 5 0
      src/main/java/com/metro/entity/ro/account/SelectAccountPageResp.java
  23. 65 0
      src/main/java/com/metro/entity/ro/account/UpdateAccountReq.java
  24. 24 0
      src/main/java/com/metro/entity/ro/account/UpdateAccountResp.java
  25. 19 0
      src/main/java/com/metro/entity/ro/account/ValidAccountReq.java
  26. 19 0
      src/main/java/com/metro/entity/ro/account/ValidAccountResp.java
  27. 28 0
      src/main/java/com/metro/enums/UserEnums.java
  28. 34 0
      src/main/java/com/metro/enums/vaildated/IsPhone.java
  29. 38 0
      src/main/java/com/metro/enums/vaildated/impl/IsPhoneImpl.java
  30. 30 0
      src/main/java/com/metro/exception/OpenCommomException.java
  31. 68 4
      src/main/java/com/metro/service/AccountService.java
  32. 2 2
      src/main/java/com/metro/service/AreaService.java
  33. 139 17
      src/main/java/com/metro/service/impl/AccountServiceImpl.java
  34. 4 4
      src/main/java/com/metro/service/impl/AreaServiceImpl.java
  35. 319 0
      src/main/java/com/metro/utils/ExcelUtil.java
  36. 88 0
      src/main/java/com/metro/utils/FileUtils.java
  37. 44 36
      src/main/java/com/metro/utils/MD5UtilNew.java

+ 28 - 0
pom.xml

@@ -78,6 +78,26 @@
             <version>1.19.0</version>
         </dependency>
 
+
+        <!-- xls格式excel依赖包 -->
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi</artifactId>
+            <version>3.17</version>
+        </dependency>
+        <!--xlsx格式excel依赖包-->
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml</artifactId>
+            <version>3.17</version>
+        </dependency>
+        <!-- easyexcel依赖包 -->
+        <dependency>
+        <groupId>com.alibaba</groupId>
+        <artifactId>easyexcel</artifactId>
+        <version>1.1.2-beta5</version>
+        </dependency>
+
         <!-- Sa-Token整合redis (使用jackson序列化方式) -->
         <dependency>
             <groupId>cn.dev33</groupId>
@@ -307,6 +327,14 @@
                 <groupId>org.springframework.boot</groupId>
                 <artifactId>spring-boot-maven-plugin</artifactId>
             </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>9</source>
+                    <target>9</target>
+                </configuration>
+            </plugin>
         </plugins>
     </build>
 </project>

+ 0 - 163
src/main/java/com/metro/aop/ExceptionAdvice.java

@@ -1,163 +0,0 @@
-package com.metro.aop;
-
-import cn.dev33.satoken.exception.NotLoginException;
-import cn.hutool.core.util.StrUtil;
-import com.metro.baseRe.BaseException;
-import com.metro.baseRe.EnvEnum;
-import com.metro.baseRe.ResultCode;
-import com.metro.baseRe.Ret;
-import com.metro.entity.error.CommonRes;
-import com.metro.entity.error.ErrorMsg;
-import lombok.extern.slf4j.Slf4j;
-import org.assertj.core.util.Lists;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.dao.DuplicateKeyException;
-import org.springframework.http.converter.HttpMessageNotReadableException;
-import org.springframework.validation.BindingResult;
-import org.springframework.validation.FieldError;
-import org.springframework.validation.ObjectError;
-import org.springframework.web.bind.MethodArgumentNotValidException;
-import org.springframework.web.bind.MissingServletRequestParameterException;
-import org.springframework.web.bind.annotation.ExceptionHandler;
-import org.springframework.web.bind.annotation.ResponseBody;
-import org.springframework.web.bind.annotation.RestControllerAdvice;
-import springfox.documentation.schema.Maps;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * @author dxy
- * @description: 异常处理类
- * @date 2021/4/5 16:48
- */
-@RestControllerAdvice
-@Slf4j
-public class ExceptionAdvice {
-
-    @Value("${spring.profiles.active}")
-    private String env;
-
-    /**
-     * 参数校验失败时调用,返回json格式
-     * @param e
-     * @return
-     */
-    @ExceptionHandler(MethodArgumentNotValidException.class)
-    public Ret<?> validExceptionHandler(MethodArgumentNotValidException e) {
-        log.error(e.getMessage(),e);
-        FieldError fieldError = e.getBindingResult().getFieldError();
-        assert fieldError != null;
-        return Ret.error(ResultCode.VALIDATE_FAILED.getCode(),"[" + fieldError.getObjectName() + " " + fieldError.getField() + "]" + fieldError.getDefaultMessage());
-    }
-
-    @ExceptionHandler(MissingServletRequestParameterException.class)
-    public Ret<?> bindExceptionHandler(MissingServletRequestParameterException e) {
-        log.error(e.getMessage(),e);
-        return Ret.error(ResultCode.VALIDATE_FAILED.getCode(),e.getMessage());
-    }
-
-    @ExceptionHandler(DuplicateKeyException.class)
-    public Ret<?> bindExceptionHandler(DuplicateKeyException e) {
-        log.error(e.getMessage(),e);
-        return Ret.error(ResultCode.DUPLICATE.getCode(),e.getMessage());
-    }
-
-
-    /**
-     * 通用星互动平台异常发生时调用,返回json格式
-     * @param e
-     * @return
-     */
-    @ExceptionHandler(value = BaseException.class)
-    public Ret<?> handle(BaseException e) {
-        log.error(e.getMessage(),e);
-        if (e.getCode() != null) {
-            return Ret.error(e.getCode(),e.getMessage());
-        }
-        return Ret.error(e.getCode(),e.getMessage());
-    }
-
-    @ExceptionHandler(MethodArgumentNotValidException.class)
-    @ResponseBody
-    public CommonRes exception(MethodArgumentNotValidException e) {
-        BindingResult bindingResult = e.getBindingResult();
-        List<ObjectError> allErrors = bindingResult.getAllErrors();
-        List<ErrorMsg> errorMsgs = Lists.newArrayList();
-
-        allErrors.forEach(objectError -> {
-            ErrorMsg errorMsg = new ErrorMsg();
-            FieldError fieldError = (FieldError) objectError;
-            errorMsg.setField(fieldError.getField());
-            errorMsg.setObjectName(fieldError.getObjectName());
-            errorMsg.setMessage(fieldError.getDefaultMessage());
-            errorMsgs.add(errorMsg);
-        });
-        Map<String,Object> result = new HashMap<>();
-        result.put("errParam", errorMsgs);
-        return CommonRes.builder().code(400).msg("参数错误").result(result).build();
-    }
-
-    /**
-     * 通用异常发生时调用,返回json格式
-     * @param e
-     * @return
-     */
-    @ExceptionHandler
-    public Ret<?> handle(Exception e) {
-        log.error(e.getMessage(),e);
-        String msg = e.getMessage();
-        if (StrUtil.isBlank(msg)) {
-            msg = e.toString();
-        }
-        return Ret.error(10000,"服务器打酱油啦~ 请稍后重试!");
-    }
-
-    @ExceptionHandler(HttpMessageNotReadableException.class)
-    public Ret<?> httperrMsgNotReadableExceptionHandler(HttpMessageNotReadableException e) {
-        log.error("参数格式错误:" + e.getMessage(),e);
-        if (env.equals(EnvEnum.PRODUCT.getCode())) {
-            return Ret.error(10001,"参数错误");
-        } else {
-            return Ret.error(10001,e.getMessage());
-        }
-    }
-
-
-    // 全局异常拦截(拦截项目中的NotLoginException异常)
-    @ExceptionHandler(NotLoginException.class)
-    public Ret<?> handlerNotLoginException(NotLoginException nle, HttpServletRequest request, HttpServletResponse response)
-            throws Exception {
-
-        // 打印堆栈,以供调试
-        nle.printStackTrace();
-
-        // 判断场景值,定制化异常信息
-        String errMsg = "";
-        if(nle.getType().equals(NotLoginException.NOT_TOKEN)) {
-            errMsg = "未提供token";
-        }
-        else if(nle.getType().equals(NotLoginException.INVALID_TOKEN)) {
-            errMsg = "token无效";
-        }
-        else if(nle.getType().equals(NotLoginException.TOKEN_TIMEOUT)) {
-            errMsg = "token已过期";
-        }
-        else if(nle.getType().equals(NotLoginException.BE_REPLACED)) {
-            errMsg = "token已被顶下线";
-        }
-        else if(nle.getType().equals(NotLoginException.KICK_OUT)) {
-            errMsg = "token已被踢下线";
-        }
-        else {
-            errMsg = "当前会话未登录";
-        }
-
-        // 返回给前端
-        return Ret.error(ResultCode.TOKEN_FAILED.getCode(),errMsg);
-    }
-
-}

+ 78 - 0
src/main/java/com/metro/aop/GlobalExceptionHandler.java

@@ -0,0 +1,78 @@
+package com.metro.aop;
+
+
+import com.metro.baseRe.BaseResponse;
+import com.metro.entity.error.CommonRes;
+import com.metro.entity.error.ErrorMsg;
+import com.metro.exception.BusinessException;
+import com.metro.exception.OpenCommomException;
+import org.assertj.core.util.Lists;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.http.HttpStatus;
+import org.springframework.validation.BindException;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.FieldError;
+import org.springframework.validation.ObjectError;
+import org.springframework.web.bind.MethodArgumentNotValidException;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+
+@RestControllerAdvice
+public class GlobalExceptionHandler {
+
+  private static Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);
+
+  @ResponseStatus(HttpStatus.OK)
+  @ExceptionHandler(BusinessException.class)
+  public BaseResponse handleEagleException(HttpServletRequest request, BusinessException exception) {
+
+    if (exception.getCause() != null) {
+      log.info("Request: " + request.getRequestURI() + " raised " + exception.getMessage(), exception.getCause());
+    }
+    return BaseResponse.fail(exception.getMessage());
+  }
+
+    @ResponseStatus(HttpStatus.OK)
+    @ExceptionHandler(OpenCommomException.class)
+    public BaseResponse handleEagleException(HttpServletRequest request, OpenCommomException exception) {
+
+        if (exception.getCause() != null) {
+            log.info("Request: " + request.getRequestURI() + " raised " + exception.getMessage(), exception.getCause());
+        }
+        return BaseResponse.fail(exception.getMessage());
+    }
+
+
+  @ResponseStatus(HttpStatus.OK)
+  @ExceptionHandler(Exception.class)
+  public BaseResponse handleGlobalException(HttpServletRequest request, Exception exception) {
+    exception.printStackTrace();
+    log.info("=======服务异常,e:{}",exception.getMessage());
+    return BaseResponse.fail("服务异常,请联系管理员");
+  }
+
+  @ExceptionHandler({MethodArgumentNotValidException.class, BindException.class})
+  public CommonRes exception(MethodArgumentNotValidException e) {
+    BindingResult bindingResult = e.getBindingResult();
+    List<ObjectError> allErrors = bindingResult.getAllErrors();
+    List<ErrorMsg> errorMsgs = Lists.newArrayList();
+    allErrors.forEach(objectError -> {
+      ErrorMsg errorMsg = new ErrorMsg();
+      FieldError fieldError = (FieldError) objectError;
+      errorMsg.setField(fieldError.getField());
+      errorMsg.setObjectName(fieldError.getObjectName());
+      errorMsg.setMessage(fieldError.getDefaultMessage());
+      errorMsgs.add(errorMsg);
+    });
+    Map<String, Object> result = new HashMap<>();
+    result.put("errParam", errorMsgs);
+    return CommonRes.builder().code(400).msg("参数错误").result(result).build();
+  }
+
+}

+ 0 - 47
src/main/java/com/metro/aop/NoRepeatSubmitAop.java

@@ -1,47 +0,0 @@
-package com.metro.aop;
-
-import com.metro.annotation.NoRepeatSubmit;
-import com.metro.baseRe.Ret;
-import com.metro.cache.CacheUtil;
-import lombok.extern.slf4j.Slf4j;
-import org.aspectj.lang.ProceedingJoinPoint;
-import org.aspectj.lang.annotation.Around;
-import org.aspectj.lang.annotation.Aspect;
-import org.springframework.stereotype.Component;
-import org.springframework.web.context.request.RequestContextHolder;
-import org.springframework.web.context.request.ServletRequestAttributes;
-
-import javax.servlet.http.HttpServletRequest;
-
-@Aspect
-@Component
-@Slf4j
-public class NoRepeatSubmitAop {
-
-    private static final String CACHE_NAME = "";
-
-    @Around("execution(* com.metro..*Controller.*(..)) && @annotation(nrs)")
-    public Object arround(ProceedingJoinPoint pjp, NoRepeatSubmit nrs) throws Throwable{
-        try {
-            ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
-            String sessionId = RequestContextHolder.getRequestAttributes().getSessionId();
-            HttpServletRequest request = attributes.getRequest();
-            String key = sessionId + "-" + request.getServletPath();
-            // 如果缓存中有这个url视为重复提交
-            if (CacheUtil.get(CACHE_NAME, key) == null) {
-                Object o = pjp.proceed();
-                CacheUtil.put(CACHE_NAME, key,0,2);
-                return o;
-            } else {
-                return Ret.error(10003,"请勿频繁提交");
-            }
-        } catch (Throwable e) {
-            e.printStackTrace();
-            log.error("验证重复提交时出现未知异常!",e);
-            throw e;
-        }
-
-    }
-
-
-}

+ 57 - 0
src/main/java/com/metro/baseRe/BaseResponse.java

@@ -0,0 +1,57 @@
+package com.metro.baseRe;
+
+import com.metro.entity.error.MsgCode;
+import lombok.Data;
+
+/**
+ * 通用响应实体
+ * @author lws
+ */
+@Data
+public class BaseResponse<T> {
+
+    /**
+     * 状态码
+     * 0成功,1失败
+     */
+    private Integer code;
+    /**
+     * 描述信息
+     * 成功,或具体错误信息
+     */
+    private String msg;
+    /**
+     * 业务数据
+     */
+    private T data;
+
+    private BaseResponse() {
+    }
+
+    private BaseResponse(Integer code, String msg, T data) {
+        this.code = code;
+        this.msg = msg;
+        this.data = data;
+    }
+
+    public static <T> BaseResponse<T> ok() {
+        return new BaseResponse<>(MsgCode.SUCCESS.code, MsgCode.SUCCESS.desc, null);
+    }
+
+    public static <T> BaseResponse<T> ok(T t) {
+        return new BaseResponse<>(MsgCode.SUCCESS.code, MsgCode.SUCCESS.desc, t);
+    }
+
+    public static <T> BaseResponse<T> ok(String msg) {
+        return new BaseResponse<T>(MsgCode.SUCCESS.code, msg , null);
+    }
+
+    public static <T> BaseResponse<T> fail(String msg) {
+        return new BaseResponse<T>(MsgCode.FAILED.code, msg, null);
+    }
+
+    public static <T> BaseResponse<T> build(Integer code, String msg, T t) {
+        return new BaseResponse<>(code, msg, t);
+    }
+
+}

+ 0 - 126
src/main/java/com/metro/baseRe/Ret.java

@@ -1,126 +0,0 @@
-package com.metro.baseRe;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonInclude;
-import lombok.Getter;
-import org.springframework.util.Assert;
-
-import java.io.Serializable;
-
-/**
- * @author Ye Jianyu
- * @date 2020/11/4
- */
-@Getter
-public final class Ret<T> implements Serializable {
-
-    public static final Integer SUCCESSFUL_CODE = 0;
-    public static final String SUCCESSFUL_errMsg = "成功";
-
-    /**
-     * 错误码
-     *
-     * @see ErrorCode#getCode()
-     */
-    private Integer errCode;
-
-    /**
-     * 错误提示,用户可阅读
-     *
-     * @see ErrorCode#geterrMsg()
-     */
-    private String errMsg;
-    /**
-     * 错误明细,内部调试错误
-     */
-    private String detailerrMsg;
-
-    /**
-     * 返回数据
-     */
-    @JsonInclude(JsonInclude.Include.NON_NULL)
-    private T data;
-
-    /**
-     * 快速创建成功结果并返回结果数据
-     *
-     * @return Result
-     */
-    public static <T> Ret<T> success(T data) {
-        Ret<T> result = new Ret<>();
-        result.errCode = SUCCESSFUL_CODE;
-        result.data = data;
-        result.errMsg = SUCCESSFUL_errMsg;
-        return result;
-    }
-
-
-    public static <T> Ret<T> error(ErrorCode errorCode) {
-        return error(errorCode.getCode(), errorCode.geterrMsg(), null);
-    }
-
-    public static <T> Ret<T> error(Integer code, String errMsg) {
-        return error(code, errMsg, null);
-    }
-
-    public static <T> Ret<T> error(Integer code, String errMsg, String detailerrMsg) {
-        Assert.isTrue(!SUCCESSFUL_CODE.equals(code), "code 必须是错误的!");
-        Ret<T> result = new Ret<>();
-        result.errCode = code;
-        result.errMsg = errMsg;
-        result.detailerrMsg = detailerrMsg;
-        return result;
-    }
-
-    public Ret<T> setDetailerrMsg(String detailerrMsg) {
-        this.detailerrMsg = detailerrMsg;
-        return this;
-    }
-
-    /**
-     * 成功code=0
-     *
-     * @return true/false
-     */
-    @JsonIgnore
-    public boolean isSuccess() {
-        return SUCCESSFUL_CODE.equals(this.errCode);
-    }
-
-    /**
-     * 失败
-     *
-     * @return true/false
-     */
-    @JsonIgnore
-    public boolean isError() {
-        return !isSuccess();
-    }
-
-    /**
-     * 判断是否有异常。如果有,则抛出 {@link BaseException} 异常
-     */
-    public void checkError() throws ServiceException {
-        if (isSuccess()) {
-            return;
-        }
-        // 业务异常
-        throw new ServiceException(errCode, errMsg).setDetailerrMsg(detailerrMsg);
-    }
-
-    public static <T> Ret<T> error(BaseException baseException) {
-        return error(baseException.getCode(), baseException.getMessage(),
-                baseException.getDetailerrMsg());
-    }
-
-    @Override
-    public String toString() {
-        return "CommonResult{" +
-                "errCode=" + errCode +
-                ", data=" + data +
-                ", errMsg='" + errMsg + '\'' +
-                ", detailerrMsg='" + detailerrMsg + '\'' +
-                '}';
-    }
-
-}

+ 10 - 0
src/main/java/com/metro/constant/UserConstant.java

@@ -32,4 +32,14 @@ public class UserConstant implements Serializable {
      */
     public static final Boolean STOP = Boolean.FALSE;
 
+    /**
+     * 注册账号不能为中文
+     */
+    public static final String NOT_CHINESE_ACCOUNT = "账号不能为中文";
+
+    /**
+     * 注册账号不能为中文
+     */
+    public static final String NOT_CHINESE_USERNAME = "姓名不能为非中文";
+
 }

+ 118 - 13
src/main/java/com/metro/controller/AccountController.java

@@ -2,19 +2,25 @@ package com.metro.controller;
 
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.metro.baseRe.Ret;
-import com.metro.entity.ro.account.SelectAccountPageReq;
-import com.metro.entity.ro.account.SelectAccountPageResp;
+import com.metro.baseRe.BaseResponse;
+import com.metro.entity.ro.account.*;
 import com.metro.service.AccountService;
+import com.metro.utils.ExcelUtil;
+import com.metro.utils.FileUtils;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
 import org.springframework.beans.factory.annotation.Autowired;
-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 org.springframework.util.ResourceUtils;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
+import java.io.*;
+import java.net.URLEncoder;
+import java.text.SimpleDateFormat;
 import java.util.List;
 
 /**
@@ -41,18 +47,117 @@ public class AccountController {
      */
     @PostMapping("/page")
     @ApiOperation("账号列表查询")
-    public Ret<IPage<SelectAccountPageResp>> page(@Valid @RequestBody(required = false) SelectAccountPageReq req) {
-        return Ret.success(service.page(req));
+    public BaseResponse<IPage<SelectAccountPageResp>> page(@Valid @RequestBody(required = false) SelectAccountPageReq req) {
+        return BaseResponse.ok(service.page(req));
     }
 
     /**
-     * @param id
-     * @return
+     * 注册账号
+     *
+     * @param req 账号信息
+     * @return 影响行数
      */
     @PostMapping("/add")
     @ApiOperation("注册账号")
-    public Ret add(Integer id) {
-        return service.add(id);
+    public BaseResponse<InsertAccountResp> add(@Valid @RequestBody InsertAccountReq req) {
+        return BaseResponse.ok(service.add(req));
+    }
+
+    /**
+     * 校验账号是否存在
+     *
+     * @param req 账号
+     * @return true/false
+     */
+    @PostMapping("/validAccount")
+    @ApiOperation("校验账号是否存在")
+    public BaseResponse<ValidAccountResp> validAccount(@Valid @RequestBody ValidAccountReq req) {
+        return BaseResponse.ok(service.validAccount(req));
+    }
+
+    /**
+     * 删除账号
+     *
+     * @param req 主键
+     * @return 影响行数
+     */
+    @GetMapping("/delete")
+    @ApiOperation("删除账号")
+    public BaseResponse<DeleteAccountResp> delete(@Valid @RequestBody DeleteAccountReq req) {
+        return BaseResponse.ok(service.delete(req));
+    }
+
+    /**
+     * 账号详情
+     *
+     * @param req 主键
+     * @return 账号详情
+     */
+    @GetMapping("/detail")
+    @ApiOperation("帐号详情")
+    public BaseResponse<DetailAccountResp> detail(@Valid @RequestBody DeleteAccountReq req) {
+        return BaseResponse.ok(service.detail(req));
+    }
+
+    /**
+     * 修改账号
+     *
+     * @param req 主键
+     * @return 影响行数
+     */
+    @GetMapping("/update")
+    @ApiOperation("修改账号")
+    public BaseResponse<UpdateAccountResp> update(@Valid @RequestBody UpdateAccountReq req) {
+        return BaseResponse.ok(service.update(req));
+    }
+
+    /**
+     * 上传文件
+     *
+     * @param file 文件
+     * @return 返回信息
+     */
+    @ApiOperation("上传附件")
+    @PostMapping(value = "/uploadPhoto")
+    public BaseResponse<String> uploadPhoto(@RequestParam("file") @ApiParam(value = "二进制文件流,文件类型后端未做限制,前端只允许上传照片") MultipartFile file) {
+        return service.uploadPhoto(file);
+    }
+
+    /**
+     *  预览照片
+     * @param response response
+     * @param fileUrl fileUrl
+     */
+    @ApiOperation("预览照片")
+    @GetMapping("/showPhoto")
+    public BaseResponse<Integer> showPhoto(HttpServletResponse response, @RequestParam("fileUrl") @ApiParam("文件路径") String fileUrl) {
+        service.showPhoto(response, fileUrl);
+       return BaseResponse.ok();
+    }
+
+    /**
+     * 下载文件:将输入流中的数据循环写入到响应输出流中
+     *
+     * @param path     指想要下载的文件的路径
+     * @param response response
+     */
+    @ApiOperation("下载文件")
+    @GetMapping("/download")
+    public BaseResponse<Integer> downloadLocal(String path, HttpServletResponse response) throws IOException {
+        FileUtils.downLoadPhoto(path, response);
+        return BaseResponse.ok();
+    }
+
+    /**
+     * 导入excel 用户数据
+     * @param file file
+     */
+    @ApiOperation("导入")
+    @GetMapping("/importSheet")
+    public BaseResponse<Integer> importSheet(MultipartFile file) {
+        String filePath = "C:\\Users\\任瑞鑫\\Desktop\\新建 XLSX 工作表.xlsx";
+        service.importSheet(filePath);
+        return BaseResponse.ok();
     }
 
 }

+ 2 - 2
src/main/java/com/metro/controller/AreaController.java

@@ -1,6 +1,6 @@
 package com.metro.controller;
 
-import com.metro.baseRe.Ret;
+import com.metro.baseRe.BaseResponse;
 import com.metro.entity.ro.area.SelectAreaReq;
 import com.metro.entity.ro.area.SelectAreaResp;
 import com.metro.service.AreaService;
@@ -38,7 +38,7 @@ public class AreaController {
      */
     @ApiOperation("查询地区联动")
     @GetMapping("/selectArea")
-    public Ret<List<SelectAreaResp>> selectArea(@Valid @RequestBody SelectAreaReq req) {
+    public BaseResponse<List<SelectAreaResp>> selectArea(@Valid @RequestBody SelectAreaReq req) {
         return service.selectArea(req);
     }
 

+ 3 - 3
src/main/java/com/metro/controller/CompanyController.java

@@ -1,6 +1,6 @@
 package com.metro.controller;
 
-import com.metro.baseRe.Ret;
+import com.metro.baseRe.BaseResponse;
 import com.metro.entity.ro.company.SelectCompanyPageReq;
 import com.metro.entity.ro.company.SelectCompanyPageResp;
 import com.metro.service.CompanyService;
@@ -35,7 +35,7 @@ public class CompanyController {
      */
     @PostMapping("/select")
     @ApiOperation("公安查询")
-    public Ret<List<SelectCompanyPageResp>> selectCompany(@Valid @RequestBody SelectCompanyPageReq req){
-        return Ret.success(service.page(req));
+    public BaseResponse<List<SelectCompanyPageResp>> selectCompany(@Valid @RequestBody SelectCompanyPageReq req){
+        return BaseResponse.ok(service.page(req));
     }
 }

+ 3 - 3
src/main/java/com/metro/controller/MetroController.java

@@ -1,6 +1,6 @@
 package com.metro.controller;
 
-import com.metro.baseRe.Ret;
+import com.metro.baseRe.BaseResponse;
 import com.metro.entity.ro.metro.SelectMetroReq;
 import com.metro.entity.ro.metro.SelectMetroResp;
 import com.metro.service.MetroService;
@@ -35,7 +35,7 @@ public class MetroController {
      */
     @PostMapping("/select")
     @ApiOperation("地铁查询一二级三级")
-    public Ret<List<SelectMetroResp>> selectMetro(@RequestBody @Valid SelectMetroReq req){
-        return Ret.success(service.list(req));
+    public BaseResponse<List<SelectMetroResp>> selectMetro(@RequestBody @Valid SelectMetroReq req){
+        return BaseResponse.ok(service.list(req));
     }
 }

+ 3 - 3
src/main/java/com/metro/controller/PassreCordsController.java

@@ -1,7 +1,7 @@
 package com.metro.controller;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.metro.baseRe.Ret;
+import com.metro.baseRe.BaseResponse;
 import com.metro.entity.ro.passrecords.SelectPassreCordsPageListReq;
 import com.metro.entity.ro.passrecords.SelectPassreCordsPageListResp;
 import com.metro.service.PassreCordsService;
@@ -33,8 +33,8 @@ public class PassreCordsController {
      */
     @PostMapping("/page")
     @ApiOperation("查询公司信息")
-    public Ret<IPage<SelectPassreCordsPageListResp>> page (@Valid @RequestBody SelectPassreCordsPageListReq req) {
-        return Ret.success(passreCordsservice.page(req));
+    public BaseResponse<IPage<SelectPassreCordsPageListResp>> page (@Valid @RequestBody SelectPassreCordsPageListReq req) {
+        return BaseResponse.ok(passreCordsservice.page(req));
     }
 
 }

+ 48 - 0
src/main/java/com/metro/entity/dto/AccountDTO.java

@@ -0,0 +1,48 @@
+package com.metro.entity.dto;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.time.LocalDateTime;
+
+/**
+ * @ClassName: Account
+ * @Description: TODO
+ * @Author: ZS
+ * @CreateName: lws
+ * @Date 2022/3/10 9:56
+ * ...
+ */
+@Data
+@Accessors(chain = true)
+public class AccountDTO {
+
+    /**
+     * 账号名称
+     */
+    private String account;
+
+    /**
+     * 管理员姓名
+     */
+    private String userName;
+
+    /**
+     * 账号密码
+     */
+    private String password;
+
+    /**
+     * 管理员手机号
+     */
+    private String phone;
+
+    /**
+     * 详细地址
+     */
+    private String address;
+
+}

+ 17 - 0
src/main/java/com/metro/entity/error/MsgCode.java

@@ -0,0 +1,17 @@
+package com.metro.entity.error;
+
+public enum MsgCode {
+
+    SUCCESS(0,"成功"),
+    FAILED(1,"失败"),
+    NO_LOGIN(401,"失败"),
+    ;
+
+    public int code;
+    public String desc;
+
+    MsgCode(int code, String desc){
+        this.code = code;
+        this.desc = desc;
+    }
+}

+ 14 - 6
src/main/java/com/metro/entity/po/Account.java

@@ -1,12 +1,16 @@
 package com.metro.entity.po;
 
+import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Builder;
 import lombok.Data;
+import lombok.experimental.Accessors;
 import lombok.experimental.Tolerate;
 
+import java.time.LocalDate;
+import java.time.LocalDateTime;
 import java.time.LocalTime;
 
 /**
@@ -19,12 +23,13 @@ import java.time.LocalTime;
  */
 @Data
 @TableName("j_account")
+@Accessors(chain = true)
 public class Account {
 
     /**
      * id
      */
-    @TableId(value = "id")
+    @TableId(value = "id",type = IdType.AUTO)
     private Integer id;
 
     /**
@@ -50,7 +55,7 @@ public class Account {
     /**
      * 用户类型 1:用户 2:派出所
      */
-    private String type;
+    private Integer type;
 
     /**
      * 省市区
@@ -75,7 +80,10 @@ public class Account {
     /**
      * 创建时间
      */
-    private LocalTime createTime;
+    private LocalDateTime createTime;
+    public void setCreateTime(LocalDateTime createTime) {
+        this.createTime = LocalDateTime.now();
+    }
     /*
     * 创建人
     * */
@@ -85,7 +93,7 @@ public class Account {
     /*
     * 修改时间
     * */
-    private LocalTime updateTime;
+    private LocalDateTime updateTime;
 
     /*
     * 修改人
@@ -95,10 +103,10 @@ public class Account {
     /*
     * 是否删除 true 删除    false 不删除
     * */
-    private boolean isDelete;
+    private Boolean isDelete;
 
     /*
     * 状态  true 正常    false 停用
     * */
-    private boolean status;
+    private Boolean status;
 }

+ 19 - 0
src/main/java/com/metro/entity/ro/account/DeleteAccountReq.java

@@ -0,0 +1,19 @@
+package com.metro.entity.ro.account;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotEmpty;
+import java.io.Serializable;
+
+/**
+ * @author :lws
+ * @date :2022/3/12 19:33
+ */
+@Data
+public class DeleteAccountReq implements Serializable {
+
+    @ApiModelProperty("主键")
+    @NotEmpty(message = "主键为必填项!")
+    private Integer id;
+}

+ 20 - 0
src/main/java/com/metro/entity/ro/account/DeleteAccountResp.java

@@ -0,0 +1,20 @@
+package com.metro.entity.ro.account;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * @author :lws
+ * @date :2022/3/12 19:33
+ */
+@Data
+@Accessors(chain = true)
+public class DeleteAccountResp implements Serializable {
+
+    @ApiModelProperty("影响行数")
+    private Integer count;
+
+}

+ 19 - 0
src/main/java/com/metro/entity/ro/account/DetailAccountReq.java

@@ -0,0 +1,19 @@
+package com.metro.entity.ro.account;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotEmpty;
+import java.io.Serializable;
+
+/**
+ * @author :lws
+ * @date :2022/3/12 19:33
+ */
+@Data
+public class DetailAccountReq implements Serializable {
+
+    @ApiModelProperty("主键")
+    @NotEmpty(message = "主键为必填项!")
+    private Integer id;
+}

+ 74 - 0
src/main/java/com/metro/entity/ro/account/DetailAccountResp.java

@@ -0,0 +1,74 @@
+package com.metro.entity.ro.account;
+
+import com.metro.enums.UserEnums;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * @ClassName: AccountCompanyPageResp
+ * @Description: TODO
+ * @Author: ZS
+ * @CreateName: lws
+ * @Date 2022/3/10 10:14
+ * ...
+ */
+@Data
+@ApiModel
+public class DetailAccountResp implements Serializable {
+
+    @ApiModelProperty(value = "id")
+    private Integer id;
+
+    @ApiModelProperty(value = "账号名称")
+    private String account;
+
+    @ApiModelProperty(value = "管理员姓名")
+    private String userName;
+
+    @ApiModelProperty(value = "管理员手机号")
+    private String phone;
+
+    @ApiModelProperty(value = "地区Id")
+    private Integer areaId;
+
+    @ApiModelProperty(value = "地区中文")
+    private String areaDesc;
+
+    @ApiModelProperty(value = "地区省市区id,用于回显字段地区")
+    private String areaSqe;
+
+    @ApiModelProperty(value = "详细地址")
+    private String address;
+
+    @ApiModelProperty(value = "创建时间")
+    private LocalDateTime createTime;
+
+    @ApiModelProperty(value = "创建人")
+    private LocalDateTime createId;
+
+    @ApiModelProperty(value = "修改时间")
+    private LocalDateTime updateTime;
+
+    @ApiModelProperty(value = "修改人")
+    private LocalDateTime updateId;
+
+    @ApiModelProperty(value = "是否删除")
+    private boolean isDelete;
+    public String getIsDeleteName(){
+        return UserEnums.deleteEnums.getStatusName(this.isDelete);
+    }
+
+    @ApiModelProperty(value = "账号状态码")
+    private boolean status;
+
+    @ApiModelProperty(value = "账号状态")
+    private String statusNme;
+    public String getStatusName(){
+        return UserEnums.statusEnums.getStatusName(this.status);
+    }
+
+}

+ 23 - 10
src/main/java/com/metro/entity/ro/account/InsertAccountReq.java

@@ -1,11 +1,13 @@
 package com.metro.entity.ro.account;
 
+import com.metro.enums.vaildated.IsPhone;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
-import javax.validation.constraints.NotEmpty;
-import javax.validation.constraints.NotNull;
+import javax.sound.sampled.Mixer;
+import javax.validation.constraints.*;
 import java.io.Serializable;
+import java.math.BigDecimal;
 import java.time.LocalDateTime;
 
 /**
@@ -19,31 +21,42 @@ import java.time.LocalDateTime;
 @Data
 public class InsertAccountReq implements Serializable {
 
-
     @ApiModelProperty(value = "账号名称")
+    @NotEmpty(message = "账号名称不能为空")
+    @Size(max = 12,min = 6,message = "账号长度不能小于6、大于12")
     private String account;
 
     @ApiModelProperty(value = "管理员姓名")
+    @NotEmpty(message = "管理员姓名不能为空")
+    @Size(min = 2,max = 12,message = "管理员姓名不能大于12,小于2")
     private String userName;
 
     @ApiModelProperty(value = "管理员手机号")
+    @NotEmpty(message = "管理员手机号不能为空")
+    @IsPhone(message = "手机号格式不正确!")
+    @Size(min = 11,max = 11,message = "手机号格式不正确!")
     private String phone;
 
+    @ApiModelProperty(value = "密码")
+    @NotEmpty(message = "密码不能为空")
+    @Size(max = 12,min = 6,message = "密码长度不能小于6、大于12")
+    private String password;
+
     @ApiModelProperty(value = "地区Id")
     @NotNull(message = "请选择地址!")
     private Integer areaId;
 
     @ApiModelProperty(value = "详细地址")
     @NotEmpty(message = "详细地址不能为空!")
+    @Size(max = 1000 ,min = 1, message = "详细地址不能大于1000个字符,小于1")
     private String address;
 
-    @ApiModelProperty(value = "创建时间")
-    private LocalDateTime createTime;
-
-    @ApiModelProperty(value = "创建人")
-    private LocalDateTime createId;
+    @ApiModelProperty("文件路径")
+    @NotEmpty(message = "请上传文件")
+    private String fileUrl;
 
-    @ApiModelProperty(value = "修改时间")
-    private LocalDateTime updateTime;
+    @ApiModelProperty("警号Id")
+    @NotEmpty(message = "警号Id必填")
+    private String policeId;
 
 }

+ 2 - 0
src/main/java/com/metro/entity/ro/account/InsertAccountResp.java

@@ -2,6 +2,7 @@ package com.metro.entity.ro.account;
 
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
+import lombok.experimental.Accessors;
 
 import java.io.Serializable;
 
@@ -14,6 +15,7 @@ import java.io.Serializable;
  * ...
  */
 @Data
+@Accessors(chain = true)
 public class InsertAccountResp implements Serializable {
 
     @ApiModelProperty("影响行数")

+ 5 - 0
src/main/java/com/metro/entity/ro/account/SelectAccountPageResp.java

@@ -5,6 +5,7 @@ import com.metro.enums.UserEnums;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
+import lombok.experimental.Accessors;
 
 import java.io.Serializable;
 import java.time.LocalDateTime;
@@ -20,6 +21,7 @@ import java.time.LocalTime;
  */
 @Data
 @ApiModel
+@Accessors(chain = true)
 public class SelectAccountPageResp implements Serializable {
 
     @ApiModelProperty(value = "id")
@@ -43,6 +45,9 @@ public class SelectAccountPageResp implements Serializable {
     @ApiModelProperty(value = "地区中文")
     private String areaDesc;
 
+    @ApiModelProperty(value = "地区省市区id,用于回显字段地区")
+    private String areaSqe;
+
     @ApiModelProperty(value = "详细地址")
     private String address;
 

+ 65 - 0
src/main/java/com/metro/entity/ro/account/UpdateAccountReq.java

@@ -0,0 +1,65 @@
+package com.metro.entity.ro.account;
+
+import com.metro.enums.vaildated.IsPhone;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+import java.io.Serializable;
+
+/**
+ * @ClassName: InsertAccountReq
+ * @Description: TODO
+ * @Author: ZS
+ * @CreateName: lws
+ * @Date 2022/3/12 14:13
+ * ...
+ */
+@Data
+public class UpdateAccountReq implements Serializable {
+
+    @ApiModelProperty("主键")
+    @NotNull(message = "主键不能为空")
+    private Integer id;
+
+    @ApiModelProperty(value = "账号名称")
+    @NotEmpty(message = "账号名称不能为空")
+    @Size(max = 12,min = 6,message = "账号长度不能小于6、大于12")
+    private String account;
+
+    @ApiModelProperty(value = "管理员姓名")
+    @NotEmpty(message = "管理员姓名不能为空")
+    @Size(min = 2,max = 12,message = "管理员姓名不能大于12,小于2")
+    private String userName;
+
+    @ApiModelProperty(value = "管理员手机号")
+    @NotEmpty(message = "管理员手机号不能为空")
+    @IsPhone(message = "手机号格式不正确!")
+    @Size(min = 11,max = 11,message = "手机号格式不正确!")
+    private String phone;
+
+    @ApiModelProperty(value = "密码")
+    @NotEmpty(message = "密码不能为空")
+    @Size(max = 12,min = 6,message = "密码长度不能小于6、大于12")
+    private String password;
+
+    @ApiModelProperty(value = "地区Id")
+    @NotNull(message = "请选择地址!")
+    private Integer areaId;
+
+    @ApiModelProperty(value = "详细地址")
+    @NotEmpty(message = "详细地址不能为空!")
+    @Size(max = 1000 ,min = 1, message = "详细地址不能大于1000个字符,小于1")
+    private String address;
+
+    @ApiModelProperty("文件路径")
+    @NotEmpty(message = "请上传文件")
+    private String fileUrl;
+
+    @ApiModelProperty("警号Id")
+    @NotEmpty(message = "警号Id必填")
+    private String policeId;
+
+}

+ 24 - 0
src/main/java/com/metro/entity/ro/account/UpdateAccountResp.java

@@ -0,0 +1,24 @@
+package com.metro.entity.ro.account;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * @ClassName: InsertAccountReq
+ * @Description: TODO
+ * @Author: ZS
+ * @CreateName: lws
+ * @Date 2022/3/12 14:13
+ * ...
+ */
+@Data
+@Accessors(chain = true)
+public class UpdateAccountResp implements Serializable {
+
+    @ApiModelProperty("影响行数")
+    private Integer count;
+
+}

+ 19 - 0
src/main/java/com/metro/entity/ro/account/ValidAccountReq.java

@@ -0,0 +1,19 @@
+package com.metro.entity.ro.account;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotEmpty;
+import java.io.Serializable;
+
+/**
+ * @author :lws
+ * @date :2022/3/12 19:33
+ */
+@Data
+public class ValidAccountReq implements Serializable {
+
+    @ApiModelProperty("账号")
+    @NotEmpty(message = "请输入需要校验的账号!")
+    private String account;
+}

+ 19 - 0
src/main/java/com/metro/entity/ro/account/ValidAccountResp.java

@@ -0,0 +1,19 @@
+package com.metro.entity.ro.account;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * @author :lws
+ * @date :2022/3/12 19:33
+ */
+@Data
+@Accessors(chain = true)
+public class ValidAccountResp implements Serializable {
+
+    @ApiModelProperty("是否存在 true存在 fasle/不存在")
+    private Boolean flag;
+}

+ 28 - 0
src/main/java/com/metro/enums/UserEnums.java

@@ -43,6 +43,34 @@ public class UserEnums implements Serializable {
             }
             return "";
         }
+    }
+
+    /**
+     * 用户状态枚举
+     */
+    @Getter
+    public enum deleteEnums {
+
+        NORMAL(true, "未删除"),
+        STOP(false, "删除");
+
+        private Boolean status;
+
+        private String statusName;
+
+        deleteEnums(Boolean status, String statusName) {
+            this.status = status;
+            this.statusName = statusName;
+        }
 
+        // 获取状态名称
+        public static String getStatusName(Boolean status) {
+            for (statusEnums c : statusEnums.values()) {
+                if (c.getStatus() == status) {
+                    return c.getStatusName();
+                }
+            }
+            return "";
+        }
     }
 }

+ 34 - 0
src/main/java/com/metro/enums/vaildated/IsPhone.java

@@ -0,0 +1,34 @@
+package com.metro.enums.vaildated;
+
+
+
+import com.metro.enums.vaildated.impl.IsPhoneImpl;
+
+import javax.validation.Constraint;
+import javax.validation.Payload;
+import java.lang.annotation.Documented;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import static java.lang.annotation.ElementType.*;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
+@Retention(RUNTIME)
+@Documented
+@Constraint(validatedBy = IsPhoneImpl.class) // 指明自定义注解的实现类
+public @interface IsPhone {
+
+    String message() default "email is invalid";
+
+    Class<?>[] groups() default {};
+
+    Class<? extends Payload>[] payload() default {};
+
+    @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
+    @Retention(RUNTIME)
+    @Documented
+    public @interface List {
+        IsPhone[] value();
+    }
+}

+ 38 - 0
src/main/java/com/metro/enums/vaildated/impl/IsPhoneImpl.java

@@ -0,0 +1,38 @@
+package com.metro.enums.vaildated.impl;
+
+import com.metro.enums.vaildated.IsPhone;
+import org.apache.commons.lang3.StringUtils;
+
+import javax.validation.ConstraintValidator;
+import javax.validation.ConstraintValidatorContext;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class IsPhoneImpl implements ConstraintValidator<IsPhone, String> {
+
+    @Override
+    public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) {
+        if(StringUtils.isBlank(value)){
+            return true;
+        }
+        return isPhoneNumberValid(value);
+    }
+
+    private boolean isPhoneNumberValid(String phoneNumber){
+        phoneNumber = StringUtils.trim(phoneNumber);
+        boolean isValid = false;
+        String expression = "^((13[0-9])|(15[^4,\\D])|(14[0,1-9])|(18[0,1-9])|(17[0,1-9]))\\d{8}$"
+                +"||"+"^\\d{3}-?\\d{3}-?\\d{4}|\\d{3}-?\\d{3}-?\\d{4}&"
+                +"||"+"^\\d{4}-?\\d{8}|\\d{4}-?\\d{8}&"
+                +"||"+"^\\d{4}-?\\d{7}|\\d{4}-?\\d{7}&"
+                +"||"+"^\\d{3}-?\\d{7}|\\d{4}-?\\d{7}&"
+                +"||"+"^\\d{3}-?\\d{8}|\\d{4}-?\\d{8}&";
+        CharSequence inputStr = phoneNumber;
+        Pattern pattern = Pattern.compile(expression);
+        Matcher matcher = pattern.matcher(inputStr);
+        if (matcher.matches()) {
+            isValid = true;
+        }
+        return isValid;
+    }
+}

+ 30 - 0
src/main/java/com/metro/exception/OpenCommomException.java

@@ -0,0 +1,30 @@
+package com.metro.exception;
+
+/**
+ * 业务异常
+ *
+
+ */
+public class OpenCommomException extends RuntimeException
+{
+    private static final long serialVersionUID = 1L;
+
+    protected final String message;
+
+    public OpenCommomException(String message)
+    {
+        this.message = message;
+    }
+
+    public OpenCommomException(String message, Throwable e)
+    {
+        super(message, e);
+        this.message = message;
+    }
+
+    @Override
+    public String getMessage()
+    {
+        return message;
+    }
+}

+ 68 - 4
src/main/java/com/metro/service/AccountService.java

@@ -1,9 +1,11 @@
 package com.metro.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.metro.baseRe.Ret;
-import com.metro.entity.ro.account.SelectAccountPageReq;
-import com.metro.entity.ro.account.SelectAccountPageResp;
+import com.metro.baseRe.BaseResponse;
+import com.metro.entity.ro.account.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
 
 /**
  * @ClassName: AccountService
@@ -17,11 +19,73 @@ public interface AccountService {
 
     /**
      * 账号列表查询
+     *
      * @param req 查询条件
      * @return page列表
      */
     IPage<SelectAccountPageResp> page(SelectAccountPageReq req);
 
+    /**
+     * 注册账号
+     *
+     * @param req 账号信息
+     * @return 影响行数
+     */
+    InsertAccountResp add(InsertAccountReq req);
+
+    /**
+     * 校验账号是否存在
+     *
+     * @param req 账号
+     * @return true/false
+     */
+    ValidAccountResp validAccount(ValidAccountReq req);
+
+    /**
+     * 删除账号
+     *
+     * @param req 主键
+     * @return 影响行数
+     */
+    DeleteAccountResp delete(DeleteAccountReq req);
+
+    /**
+     * 账号详情
+     *
+     * @param req 主键
+     * @return 账号详情
+     */
+    DetailAccountResp detail(DeleteAccountReq req);
+
+    /**
+     * 修改账号
+     *
+     * @param req 主键
+     * @return 影响行数
+     */
+    UpdateAccountResp update(UpdateAccountReq req);
+
+    /**
+     * 上传文件
+     *
+     * @param file 文件
+     * @return 返回信息
+     */
+    BaseResponse<String> uploadPhoto(MultipartFile file);
+
+    /**
+     * 预览照片
+     *
+     * @param response response
+     * @param fileUrl  fileUrl
+     */
+    void showPhoto(HttpServletResponse response, String fileUrl);
+
+    /**
+     * 导入excel 用户数据
+     *
+     * @param filePath filePath
+     */
+    void importSheet(String filePath);
 
-    Ret add(Integer id);
 }

+ 2 - 2
src/main/java/com/metro/service/AreaService.java

@@ -1,6 +1,6 @@
 package com.metro.service;
 
-import com.metro.baseRe.Ret;
+import com.metro.baseRe.BaseResponse;
 import com.metro.entity.ro.area.SelectAreaReq;
 import com.metro.entity.ro.area.SelectAreaResp;
 
@@ -21,6 +21,6 @@ public interface AreaService {
      * @param req 查询条件
      * @return 返回结果list
      */
-    Ret<List<SelectAreaResp>> selectArea(SelectAreaReq req);
+    BaseResponse<List<SelectAreaResp>> selectArea(SelectAreaReq req);
 
 }

+ 139 - 17
src/main/java/com/metro/service/impl/AccountServiceImpl.java

@@ -1,30 +1,40 @@
 package com.metro.service.impl;
 
-import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.metro.baseRe.Ret;
+import com.metro.baseRe.BaseResponse;
 import com.metro.constant.UserConstant;
 import com.metro.entity.po.Account;
 import com.metro.entity.po.Area;
-import com.metro.entity.ro.account.SelectAccountPageReq;
-import com.metro.entity.ro.account.SelectAccountPageResp;
+import com.metro.entity.ro.account.*;
+import com.metro.exception.BusinessException;
 import com.metro.mapper.AccountsMapper;
 import com.metro.mapper.AreaMapper;
 import com.metro.service.AccountService;
-import com.metro.utils.MapperManager;
-import com.metro.utils.StringUtil;
+import com.metro.utils.*;
 import io.github.classgraph.utils.Join;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
+import org.springframework.web.multipart.MultipartFile;
 
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.stream.Collectors;
+import java.util.stream.IntStream;
 import java.util.stream.Stream;
 
 /**
@@ -39,7 +49,7 @@ import java.util.stream.Stream;
 public class AccountServiceImpl implements AccountService {
 
     @Autowired
-    private AccountsMapper AccountsMapper;
+    private AccountsMapper accountsMapper;
     @Autowired
     private AreaMapper areaMapper;
 
@@ -52,20 +62,14 @@ public class AccountServiceImpl implements AccountService {
     @Override
     public IPage<SelectAccountPageResp> page(SelectAccountPageReq req) {
         IPage<SelectAccountPageResp> respPage = new Page<>(req.getPageNo(), req.getPageSize());
-        IPage<Account> selectPage = AccountsMapper.selectPage(new Page<>(req.getPageNo(), req.getPageSize()), pageWrapper(req));
+        IPage<Account> selectPage = accountsMapper.selectPage(new Page<>(req.getPageNo(), req.getPageSize()), pageWrapper(req));
         if (CollectionUtils.isEmpty(selectPage.getRecords())) return respPage;
-        // 从查询结果中过滤出areaId集合
         Set<Integer> areaIdSet = selectPage.getRecords().stream().map(Account::getAreaId).collect(Collectors.toSet());
-
         Map<Integer, String> areaMap = areaMapper.selectList(new LambdaQueryWrapper<Area>().in(Area::getId, areaIdSet)).stream().collect(Collectors.toMap(Area::getId, p ->
-                Join.join("-", areaMapper.selectList(new LambdaQueryWrapper<Area>().eq(Area::getId, StringUtils.split(p.getDistrictSqe(),"."))).stream().map(Area::getName).collect(Collectors.toList()))
+                Join.join("-", areaMapper.selectList(new LambdaQueryWrapper<Area>().eq(Area::getId, StringUtils.split(p.getDistrictSqe(), "."))).stream().map(Area::getName).collect(Collectors.toList()))
         ));
-        return selectPage.convert(p -> MapperManager.mapper(p, SelectAccountPageResp.class, q -> q.setAreaDesc(areaMap.get(p.getAreaId()))));
-    }
-
-    @Override
-    public Ret add(Integer id) {
-        return null;
+        Map<Integer, String> areaSqeMap = areaMapper.selectList(new LambdaQueryWrapper<Area>().in(Area::getId, areaIdSet)).stream().collect(Collectors.toMap(Area::getId, Area::getDistrictSqe, (t1, t2) -> t1));
+        return selectPage.convert(p -> MapperManager.mapper(p, SelectAccountPageResp.class, q -> q.setAreaSqe(areaSqeMap.get(p.getAreaId())).setAreaDesc(areaMap.get(p.getAreaId()))));
     }
 
     // page wrapper 查询条件
@@ -73,9 +77,127 @@ public class AccountServiceImpl implements AccountService {
         LambdaQueryWrapper<Account> wrapper = new LambdaQueryWrapper<>();
         wrapper.like(StringUtils.isNotEmpty(req.getUserName()), Account::getUserName, req.getUserName());
         wrapper.eq(StringUtils.isNotEmpty(req.getPhone()), Account::getPhone, req.getPhone());
+        wrapper.eq(Account::getIsDelete, UserConstant.NOT_DELETE);
         return wrapper;
     }
 
+    /**
+     * 注册账号
+     *
+     * @param req 账号信息
+     * @return 影响行数
+     */
+    @Override
+    public InsertAccountResp add(InsertAccountReq req) {
+        if (StringUtil.isChinese(req.getAccount())) throw new BusinessException(UserConstant.NOT_CHINESE_ACCOUNT);
+        if (!StringUtil.isChinese(req.getUserName())) throw new BusinessException(UserConstant.NOT_CHINESE_USERNAME);
+        Account account = accountsMapper.selectOne(new LambdaQueryWrapper<Account>().eq(Account::getAccount, req.getAccount()).eq(Account::getIsDelete, UserConstant.NOT_DELETE));
+        if (ObjectUtil.isNotEmpty(account)) throw new BusinessException(account.getAccount() + "已经存在!不能注册");
+        return new InsertAccountResp().setCount(accountsMapper.insert(MapperManager.mapper(req, Account.class, p -> p.setPassword(MD5UtilNew.string2MD5(req.getPassword())).setType(1))));
+    }
+
+    /**
+     * 校验账号是否存在
+     *
+     * @param req 账号
+     * @return true/false
+     */
+    @Override
+    public ValidAccountResp validAccount(ValidAccountReq req) {
+        return new ValidAccountResp().setFlag(ObjectUtil.isNotEmpty(accountsMapper.selectOne(new LambdaQueryWrapper<Account>()
+                .eq(Account::getAccount, req.getAccount()).eq(Account::getIsDelete, UserConstant.NOT_DELETE))));
+    }
+
+    /**
+     * 删除账号
+     *
+     * @param req 主键
+     * @return 影响行数
+     */
+    @Override
+    public DeleteAccountResp delete(DeleteAccountReq req) {
+        return new DeleteAccountResp().setCount(accountsMapper.updateById(new Account().setId(req.getId())
+                .setIsDelete(UserConstant.DELETE).setUpdateTime(LocalDateTime.now())));
+    }
 
+    /**
+     * 账号详情
+     *
+     * @param req 主键
+     * @return 账号详情
+     */
+    @Override
+    public DetailAccountResp detail(DeleteAccountReq req) {
+        Account account = accountsMapper.selectById(req.getId());
+        Area area = areaMapper.selectById(account.getAreaId());
+        return MapperManager.mapper(account, DetailAccountResp.class, p -> p.setAreaSqe(area.getDistrictSqe()));
+    }
+
+    /**
+     * 修改账号
+     *
+     * @param req 主键
+     * @return 影响行数
+     */
+    @Override
+    public UpdateAccountResp update(UpdateAccountReq req) {
+        if (StringUtil.isChinese(req.getAccount())) throw new BusinessException(UserConstant.NOT_CHINESE_ACCOUNT);
+        if (!StringUtil.isChinese(req.getUserName())) throw new BusinessException(UserConstant.NOT_CHINESE_USERNAME);
+        Account account = accountsMapper.selectOne(new LambdaQueryWrapper<Account>().eq(Account::getAccount, req.getAccount()).eq(Account::getIsDelete, UserConstant.NOT_DELETE));
+        if (ObjectUtil.isEmpty(account)) throw new BusinessException(account.getAccount() + "不存在!不能修改");
+        return new UpdateAccountResp().setCount(accountsMapper.updateById(MapperManager.mapper(req, Account.class, p -> p.setPassword(MD5UtilNew.string2MD5(req.getPassword()))
+                .setUpdateTime(LocalDateTime.now()).setType(1))));
+    }
+
+    /**
+     * 上传文件
+     *
+     * @param file 文件
+     * @return 返回信息
+     */
+    @Override
+    public BaseResponse<String> uploadPhoto(MultipartFile file) {
+        return FileUtils.uploadPhoto(file);
+    }
+
+    /**
+     * 预览照片
+     *
+     * @param response response
+     * @param fileUrl  fileUrl
+     */
+    @Override
+    public void showPhoto(HttpServletResponse response, String fileUrl) {
+        if (StringUtils.isEmpty(fileUrl)) throw new BusinessException("请输入文件路径");
+        File fileBase = new File(fileUrl);
+        try {
+            if (!fileBase.exists()) throw new BusinessException("文件不存在");
+            ServletOutputStream outputStream = response.getOutputStream();
+            FileInputStream inputStream = new FileInputStream(fileBase);
+            inputStream.transferTo(outputStream);
+            outputStream.close();
+            inputStream.close();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 导入excel 用户数据
+     *
+     * @param filePath filePath
+     */
+    @Override
+    public void importSheet(String filePath) {
+        List<Object> objects = ExcelUtil.readLessThan1000Row(filePath);
+        // 过滤头信息
+        List<Object> finalObjects = objects;
+        List<DetailAccountResp> detailAccountResps = new ArrayList<>();
+        for (int i = 2; i < finalObjects.size(); i++) {
+            Object o = finalObjects.get(i);
+            System.out.println(o);
+        }
+
+    }
 
 }

+ 4 - 4
src/main/java/com/metro/service/impl/AreaServiceImpl.java

@@ -4,7 +4,7 @@ import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.metro.baseRe.Ret;
+import com.metro.baseRe.BaseResponse;
 import com.metro.entity.po.Area;
 import com.metro.entity.ro.area.SelectAreaReq;
 import com.metro.entity.ro.area.SelectAreaResp;
@@ -37,10 +37,10 @@ public class AreaServiceImpl implements AreaService {
      * @return 返回结果list
      */
     @Override
-    public Ret<List<SelectAreaResp>> selectArea(SelectAreaReq req) {
+    public BaseResponse<List<SelectAreaResp>> selectArea(SelectAreaReq req) {
         List<Area> areaList = areaMapper.selectList(selectAreaWrapper(req));
-        if (CollectionUtils.isEmpty(areaList)) return Ret.success(null);
-        return Ret.success(areaList.stream().map(p -> BeanUtil.toBean(p,SelectAreaResp.class)).collect(Collectors.toList()));
+        if (CollectionUtils.isEmpty(areaList)) return BaseResponse.ok(null);
+        return BaseResponse.ok(areaList.stream().map(p -> BeanUtil.toBean(p,SelectAreaResp.class)).collect(Collectors.toList()));
     }
 
     //查询地区联动 warpper

+ 319 - 0
src/main/java/com/metro/utils/ExcelUtil.java

@@ -0,0 +1,319 @@
+package com.metro.utils;
+
+import com.alibaba.excel.EasyExcelFactory;
+import com.alibaba.excel.ExcelWriter;
+import com.alibaba.excel.context.AnalysisContext;
+import com.alibaba.excel.event.AnalysisEventListener;
+import com.alibaba.excel.metadata.BaseRowModel;
+import com.alibaba.excel.metadata.Sheet;
+import com.metro.entity.ro.account.InsertAccountReq;
+import lombok.Data;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * lws
+ */
+@Slf4j
+public class ExcelUtil {
+
+    private static Sheet initSheet;
+
+    static {
+        initSheet = new Sheet(1, 0);
+        initSheet.setSheetName("sheet");
+        //设置自适应宽度
+        initSheet.setAutoWidth(Boolean.TRUE);
+    }
+
+    /**
+     * 读取少于1000行数据
+     *
+     * @param filePath 文件绝对路径
+     * @return
+     */
+    public static List<Object> readLessThan1000Row(String filePath) {
+        return readLessThan1000RowBySheet(filePath, null);
+    }
+
+    /**
+     * 读小于1000行数据, 带样式
+     * filePath 文件绝对路径
+     * initSheet :
+     * sheetNo: sheet页码,默认为1
+     * headLineMun: 从第几行开始读取数据,默认为0, 表示从第一行开始读取
+     * clazz: 返回数据List<Object> 中Object的类名
+     */
+    public static List<Object> readLessThan1000RowBySheet(String filePath, Sheet sheet) {
+        if (!StringUtils.hasText(filePath)) {
+            return null;
+        }
+
+        sheet = sheet != null ? sheet : initSheet;
+
+        InputStream fileStream = null;
+        try {
+            fileStream = new FileInputStream(filePath);
+            return EasyExcelFactory.read(fileStream, sheet);
+        } catch (FileNotFoundException e) {
+            log.info("找不到文件或文件路径错误, 文件:{}", filePath);
+        } finally {
+            try {
+                if (fileStream != null) {
+                    fileStream.close();
+                }
+            } catch (IOException e) {
+                log.info("excel文件读取失败, 失败原因:{}", e);
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 读大于1000行数据
+     *
+     * @param filePath 文件觉得路径
+     * @return
+     */
+    public static List<Object> readMoreThan1000Row(String filePath) {
+        return readMoreThan1000RowBySheet(filePath, null);
+    }
+
+    /**
+     * 读大于1000行数据, 带样式
+     *
+     * @param filePath 文件觉得路径
+     * @return
+     */
+    public static List<Object> readMoreThan1000RowBySheet(String filePath, Sheet sheet) {
+        if (!StringUtils.hasText(filePath)) {
+            return null;
+        }
+
+        sheet = sheet != null ? sheet : initSheet;
+
+        InputStream fileStream = null;
+        try {
+            fileStream = new FileInputStream(filePath);
+            ExcelListener excelListener = new ExcelListener();
+            EasyExcelFactory.readBySax(fileStream, sheet, excelListener);
+            return excelListener.getDatas();
+        } catch (FileNotFoundException e) {
+            log.error("找不到文件或文件路径错误, 文件:{}", filePath);
+        } finally {
+            try {
+                if (fileStream != null) {
+                    fileStream.close();
+                }
+            } catch (IOException e) {
+                log.error("excel文件读取失败, 失败原因:{}", e);
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 生成excle
+     *
+     * @param filePath 绝对路径, 如:/home/chenmingjian/Downloads/aaa.xlsx
+     * @param data     数据源
+     * @param head     表头
+     */
+    public static void writeBySimple(String filePath, List<List<Object>> data, List<String> head) {
+        writeSimpleBySheet(filePath, data, head, null);
+    }
+
+    /**
+     * 生成excle
+     *
+     * @param filePath 绝对路径, 如:/home/chenmingjian/Downloads/aaa.xlsx
+     * @param data     数据源
+     * @param sheet    excle页面样式
+     * @param head     表头
+     */
+    public static void writeSimpleBySheet(String filePath, List<List<Object>> data, List<String> head, Sheet sheet) {
+        sheet = (sheet != null) ? sheet : initSheet;
+
+        if (head != null) {
+            List<List<String>> list = new ArrayList<>();
+            head.forEach(h -> list.add(Collections.singletonList(h)));
+            sheet.setHead(list);
+        }
+
+        OutputStream outputStream = null;
+        ExcelWriter writer = null;
+        try {
+            outputStream = new FileOutputStream(filePath);
+            writer = EasyExcelFactory.getWriter(outputStream);
+            writer.write1(data, sheet);
+        } catch (FileNotFoundException e) {
+            log.error("找不到文件或文件路径错误, 文件:{}", filePath);
+        } finally {
+            try {
+                if (writer != null) {
+                    writer.finish();
+                }
+
+                if (outputStream != null) {
+                    outputStream.close();
+                }
+
+            } catch (IOException e) {
+                log.error("excel文件导出失败, 失败原因:{}", e);
+            }
+        }
+
+    }
+
+    /**
+     * 生成excle
+     *
+     * @param filePath 绝对路径, 如:/home/chenmingjian/Downloads/aaa.xlsx
+     * @param data     数据源
+     */
+    public static void writeWithTemplate(String filePath, List<? extends BaseRowModel> data) {
+        writeWithTemplateAndSheet(filePath, data, null);
+    }
+
+    /**
+     * 生成excle
+     *
+     * @param filePath 绝对路径, 如:/home/chenmingjian/Downloads/aaa.xlsx
+     * @param data     数据源
+     * @param sheet    excle页面样式
+     */
+    public static void writeWithTemplateAndSheet(String filePath, List<? extends BaseRowModel> data, Sheet sheet) {
+        if (CollectionUtils.isEmpty(data)) {
+            return;
+        }
+
+        sheet = (sheet != null) ? sheet : initSheet;
+        sheet.setClazz(data.get(0).getClass());
+
+        OutputStream outputStream = null;
+        ExcelWriter writer = null;
+        try {
+            outputStream = new FileOutputStream(filePath);
+            writer = EasyExcelFactory.getWriter(outputStream);
+            writer.write(data, sheet);
+        } catch (FileNotFoundException e) {
+            log.error("找不到文件或文件路径错误, 文件:{}", filePath);
+        } finally {
+            try {
+                if (writer != null) {
+                    writer.finish();
+                }
+
+                if (outputStream != null) {
+                    outputStream.close();
+                }
+            } catch (IOException e) {
+                log.error("excel文件导出失败, 失败原因:{}", e);
+            }
+        }
+
+    }
+
+    /**
+     * 生成多Sheet的excle
+     *
+     * @param filePath              绝对路径, 如:/home/chenmingjian/Downloads/aaa.xlsx
+     * @param multipleSheelPropetys
+     */
+    public static void writeWithMultipleSheel(String filePath, List<MultipleSheelPropety> multipleSheelPropetys) {
+        if (CollectionUtils.isEmpty(multipleSheelPropetys)) {
+            return;
+        }
+
+        OutputStream outputStream = null;
+        ExcelWriter writer = null;
+        try {
+            outputStream = new FileOutputStream(filePath);
+            writer = EasyExcelFactory.getWriter(outputStream);
+            for (MultipleSheelPropety multipleSheelPropety : multipleSheelPropetys) {
+                Sheet sheet = multipleSheelPropety.getSheet() != null ? multipleSheelPropety.getSheet() : initSheet;
+                if (!CollectionUtils.isEmpty(multipleSheelPropety.getData())) {
+                    sheet.setClazz(multipleSheelPropety.getData().get(0).getClass());
+                }
+                writer.write(multipleSheelPropety.getData(), sheet);
+            }
+
+        } catch (FileNotFoundException e) {
+            log.error("找不到文件或文件路径错误, 文件:{}", filePath);
+        } finally {
+            try {
+                if (writer != null) {
+                    writer.finish();
+                }
+
+                if (outputStream != null) {
+                    outputStream.close();
+                }
+            } catch (IOException e) {
+                log.error("excel文件导出失败, 失败原因:{}", e);
+            }
+        }
+
+    }
+
+
+    /*********************匿名内部类开始,可以提取出去******************************/
+
+    @Data
+    public static class MultipleSheelPropety {
+
+        private List<? extends BaseRowModel> data;
+
+        private Sheet sheet;
+    }
+
+    /**
+     * 解析监听器,
+     * 每解析一行会回调invoke()方法。
+     * 整个excel解析结束会执行doAfterAllAnalysed()方法
+     *
+     * @author: chenmingjian
+     * @date: 19-4-3 14:11
+     */
+    @Getter
+    @Setter
+    public static class ExcelListener extends AnalysisEventListener {
+
+        private List<Object> datas = new ArrayList<>();
+
+        /**
+         * 逐行解析
+         * object : 当前行的数据
+         */
+        @Override
+        public void invoke(Object object, AnalysisContext context) {
+            //当前行
+            // context.getCurrentRowNum()
+            if (object != null) {
+                datas.add(object);
+            }
+        }
+
+
+        /**
+         * 解析完所有数据后会调用该方法
+         */
+        @Override
+        public void doAfterAllAnalysed(AnalysisContext context) {
+            //解析结束销毁不用的资源
+        }
+
+    }
+
+    /************************匿名内部类结束,可以提取出去***************************/
+
+}
+

+ 88 - 0
src/main/java/com/metro/utils/FileUtils.java

@@ -0,0 +1,88 @@
+package com.metro.utils;
+
+import com.metro.baseRe.BaseResponse;
+import com.metro.exception.BusinessException;
+import org.assertj.core.internal.Files;
+import org.springframework.util.ResourceUtils;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletResponse;
+import java.io.*;
+import java.net.URLEncoder;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+/**
+ * @author :rrx
+ * @date :2022/3/12 20:46
+ */
+public class FileUtils {
+
+    public static BaseResponse<String> uploadPhoto(MultipartFile file) {
+        String fileName = file.getOriginalFilename();//获取文件名
+        fileName = getFileName(fileName);
+        String filepath = getUploadPath();
+        if (!file.isEmpty()) {
+            try (BufferedOutputStream out = new BufferedOutputStream(
+                    new FileOutputStream(new File(filepath + File.separator + fileName)))) {
+                out.write(file.getBytes());
+                out.flush();
+                return BaseResponse.ok(fileName);
+            } catch (FileNotFoundException e) {
+                throw new BusinessException("上传文件失败,文件未找到");
+            } catch (IOException e) {
+                throw new BusinessException("上传文件失败,IO异常");
+            }
+        } else {
+            throw new BusinessException("上传文件失败,文件为空");
+        }
+    }
+
+
+    /**
+     * 文件名后缀前添加一个时间戳
+     */
+    private static String getFileName(String fileName) {
+        int index = fileName.lastIndexOf(".");
+        final SimpleDateFormat sDateFormate = new SimpleDateFormat("yyyymmddHHmmss");  //设置时间格式
+        String nowTimeStr = sDateFormate.format(new Date()); // 当前时间
+        fileName = fileName.substring(0, index) + "_" + nowTimeStr + fileName.substring(index);
+        return fileName;
+    }
+
+    /**
+     * 获取当前系统路径
+     */
+    private static String getUploadPath() {
+        File path = null;
+        try {
+            path = new File(ResourceUtils.getURL("classpath:").getPath());
+        } catch (FileNotFoundException e) {
+            e.printStackTrace();
+        }
+        assert path != null;
+        if (!path.exists()) path = new File("");
+        File upload = new File(path.getAbsolutePath(), "static/upload/");
+        if (!upload.exists()) upload.mkdirs();
+        return upload.getAbsolutePath();
+    }
+
+    public static void downLoadPhoto(String path,HttpServletResponse response) throws IOException {
+        // 读到流中
+        InputStream inputStream = new FileInputStream(path);// 文件的存放路径
+        response.reset();
+        response.setContentType("application/octet-stream");
+        String filename = new File(path).getName();
+        response.addHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(filename, "UTF-8"));
+        ServletOutputStream outputStream = response.getOutputStream();
+        byte[] b = new byte[1024];
+        int len;
+//从输入流中读取一定数量的字节,并将其存储在缓冲区字节数组中,读到末尾返回-1
+        while ((len = inputStream.read(b)) > 0) {
+            outputStream.write(b, 0, len);
+        }
+        inputStream.close();
+    }
+
+}

+ 44 - 36
src/main/java/com/metro/utils/MD5UtilNew.java

@@ -12,48 +12,56 @@ import java.security.NoSuchAlgorithmException;
  * description:
  */
 public class MD5UtilNew {
-    private static ThreadLocal<MessageDigest> messageDigestHolder = new
-            ThreadLocal();
-    static Logger log =
-            LoggerFactory.getLogger(MD5UtilNew.class);
-    static final char[] hexDigits = new char[]{'0', '1', '2', '3', '4',
-            '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
-
-    public static String md5(String data) {
-        try {
-            MessageDigest message = (MessageDigest)
-                    messageDigestHolder.get();
-            if (message == null) {
-                message = MessageDigest.getInstance("MD5");
-                messageDigestHolder.set(message);
-            }
-            message.update(data.getBytes());
-            byte[] b = message.digest();
-            String digestHexStr = "";
-            for (int i = 0; i < 16; ++i) {
-                digestHexStr = digestHexStr + byteHEX(b[i]);
-            }
-            return digestHexStr;
-        } catch (Exception var5) {
-            System.out.print("MD5: " + data);
-            return null;
+    /***
+     * MD5加码 生成32位md5码
+     */
+    public static String string2MD5(String inStr){
+        MessageDigest md5 = null;
+        try{
+            md5 = MessageDigest.getInstance("MD5");
+        }catch (Exception e){
+            System.out.println(e.toString());
+            e.printStackTrace();
+            return "";
         }
+        char[] charArray = inStr.toCharArray();
+        byte[] byteArray = new byte[charArray.length];
+
+        for (int i = 0; i < charArray.length; i++)
+            byteArray[i] = (byte) charArray[i];
+        byte[] md5Bytes = md5.digest(byteArray);
+        StringBuffer hexValue = new StringBuffer();
+        for (int i = 0; i < md5Bytes.length; i++){
+            int val = ((int) md5Bytes[i]) & 0xff;
+            if (val < 16)
+                hexValue.append("0");
+            hexValue.append(Integer.toHexString(val));
+        }
+        return hexValue.toString();
+
     }
 
-    private static String byteHEX(byte ib) {
-        char[] ob = new char[]{hexDigits[ib >>> 4 & 15], hexDigits[ib &
-                15]};
-        String s = new String(ob);
+    /**
+     * 加密解密算法 执行一次加密,两次解密
+     */
+    public static String convertMD5(String inStr){
+
+        char[] a = inStr.toCharArray();
+        for (int i = 0; i < a.length; i++){
+            a[i] = (char) (a[i] ^ 't');
+        }
+        String s = new String(a);
         return s;
+
     }
 
-    static {
-        try {
-            MessageDigest message = MessageDigest.getInstance("MD5");
-            messageDigestHolder.set(message);
-        } catch (NoSuchAlgorithmException var1) {
-            System.out.print("java.security.MessageDigest");
-        }
+    // 测试主函数
+    public static void main(String args[]) {
+        String s = new String("1233");
+        System.out.println("原始:" + s);
+        System.out.println("MD5后:" + string2MD5(s));
+        System.out.println("加密的:" + convertMD5(s));
+        System.out.println("解密的:" + convertMD5(convertMD5(s)));
     }
 
 }