Forráskód Böngészése

2022-8-5 登录功能开发

沈永艺 3 éve
szülő
commit
70a8346301

+ 2 - 0
PCS/src/main/java/cn/cslg/permission/common/config/MetaObjectHandlerConfig.java

@@ -1,5 +1,6 @@
 package cn.cslg.permission.common.config;
 
+import cn.dev33.satoken.stp.StpUtil;
 import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.ibatis.reflection.MetaObject;
@@ -15,6 +16,7 @@ public class MetaObjectHandlerConfig implements MetaObjectHandler {
     public void insertFill(MetaObject metaObject) {
         setFieldValByName("createTime", new Date(), metaObject);
         setFieldValByName("updateTime", new Date(), metaObject);
+        setFieldValByName("createUser", StpUtil.getLoginIdAsInt(), metaObject);
     }
 
     @Override

+ 4 - 2
PCS/src/main/java/cn/cslg/permission/common/config/SaTokenConfigure.java

@@ -27,9 +27,11 @@ public class SaTokenConfigure {
                                     Constants.PERMISSION_API + "/oauth2/**",
                                     Constants.PERMISSION_API + "/admin/**",
                                     Constants.PERMISSION_API + "/common/download",
-                                    Constants.PERMISSION_API + "/common/export", Constants.PERMISSION_API + "/common/download"
+                                    Constants.PERMISSION_API + "/common/export",
+                                    Constants.PERMISSION_API + "/common/download",
+                                    Constants.PERMISSION_API + "/admin/login"
                             ).check(StpUtil::checkLogin);
-                    SaRouter.match(Constants.PERMISSION_API + "/admin/**", Constants.PERMISSION_API + "/admin/login", StpAdminUtil::checkLogin);
+                    //SaRouter.match(Constants.PERMISSION_API + "/admin/**", Constants.PERMISSION_API + "/admin/login", StpAdminUtil::checkLogin);
                     System.out.println("---------- 退出sa-token全局认证 -----------");
                 })
                 .setError(e -> Response.error(ResponseEnum.UNAUTHORIZED));

+ 0 - 3
PCS/src/main/java/cn/cslg/permission/common/config/SpringDocConfig.java

@@ -1,10 +1,7 @@
 package cn.cslg.permission.common.config;
 
-import io.swagger.v3.oas.models.ExternalDocumentation;
 import io.swagger.v3.oas.models.OpenAPI;
 import io.swagger.v3.oas.models.info.Info;
-import io.swagger.v3.oas.models.info.License;
-import org.springdoc.core.GroupedOpenApi;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 

+ 34 - 0
PCS/src/main/java/cn/cslg/permission/common/model/vo/LoginVO.java

@@ -0,0 +1,34 @@
+package cn.cslg.permission.common.model.vo;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+/**
+ * @author 沈永艺
+ * @date 2022-8-8
+ * @description 登录 前台对应实体
+ */
+
+@Data
+@Accessors(chain = true)
+public class LoginVO {
+    /**
+     * 验证码
+     */
+    private String code;
+
+    /**
+     * UUID
+     */
+    private String uuid;
+
+    /**
+     * 用户名
+     */
+    private String username;
+
+    /**
+     * 密码
+     */
+    private String password;
+}

+ 17 - 0
PCS/src/main/java/cn/cslg/permission/common/utils/CacheUtils.java

@@ -0,0 +1,17 @@
+package cn.cslg.permission.common.utils;
+
+import cn.cslg.permission.common.core.base.RedisConf;
+import cn.cslg.permission.domain.Personnel;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+
+@Component
+public class CacheUtils {
+    @Resource
+    private RedisUtil redisUtil;
+
+    public void setLoginUser(Personnel personnel) {
+        redisUtil.set(RedisConf.LOGIN_USER + RedisConf.SYMBOL_COLON + personnel.getId(), JsonUtils.objectToJson(personnel));
+    }
+}

+ 1 - 1
PCS/src/main/java/cn/cslg/permission/common/utils/StpAdminUtil.java

@@ -20,7 +20,7 @@ public class StpAdminUtil {
     /**
      * 账号类型标识
      */
-    public static final String TYPE = "admin";
+    public static final String TYPE = "login";
 
     /**
      * 底层的 StpLogic 对象

+ 14 - 7
PCS/src/main/java/cn/cslg/permission/controller/LoginController.java

@@ -1,6 +1,7 @@
 package cn.cslg.permission.controller;
 
 import cn.cslg.permission.common.core.base.Constants;
+import cn.cslg.permission.common.model.vo.LoginVO;
 import cn.cslg.permission.common.model.vo.PersonnelVO;
 import cn.cslg.permission.common.utils.Response;
 import cn.cslg.permission.service.LoginService;
@@ -10,10 +11,10 @@ import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import lombok.RequiredArgsConstructor;
 import org.springframework.context.annotation.Lazy;
-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.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 
 /**
  * @author 沈永艺
@@ -26,12 +27,12 @@ import org.springframework.web.bind.annotation.RestController;
 @RequestMapping(Constants.PERMISSION_API + "/admin")
 @RequiredArgsConstructor(onConstructor_ = {@Lazy})
 public class LoginController {
-    private final LoginService login;
+    private final LoginService loginService;
 
     @PostMapping("/login")
     @Operation(summary = "登录")
-    public String login(@RequestBody PersonnelVO personnelVO) {
-        return login.login(personnelVO);
+    public String login(@RequestBody LoginVO loginVO) {
+        return loginService.login(loginVO);
     }
 
     @PostMapping("/logout")
@@ -40,4 +41,10 @@ public class LoginController {
         StpUtil.logout();
         return Response.success(true);
     }
+
+    @GetMapping("/verifyCode")
+    @Operation(summary = "验证码")
+    public String verifyCode(HttpServletRequest request, HttpServletResponse response) throws Exception {
+        return loginService.verifyCode(request, response);
+    }
 }

+ 6 - 0
PCS/src/main/java/cn/cslg/permission/domain/Application.java

@@ -30,4 +30,10 @@ public class Application extends BaseEntity<Application> {
     @TableField(value = "APPLICATION_DESCRIPTION")
     private String applicationDescription;
 
+    /**
+     * 租户ID
+     */
+    @TableField(value = "TENANT_ID")
+    private Integer tenantId;
+
 }

+ 4 - 3
PCS/src/main/java/cn/cslg/permission/service/ApplicationService.java

@@ -28,7 +28,6 @@ public class ApplicationService extends ServiceImpl<ApplicationMapper, Applicati
             Application application = new Application();
             application.setApplicationName(applicationVO.getName())
                     .setApplicationDescription(applicationVO.getDescribe());
-            System.out.println(StpUtil.getLoginId());
             application.insert();
         } catch (Exception e) {
             TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
@@ -66,7 +65,9 @@ public class ApplicationService extends ServiceImpl<ApplicationMapper, Applicati
     public Object queryPageList(ApplicationVO applicationVO) {
         LambdaQueryWrapper<Application> queryWrapper = new LambdaQueryWrapper<>();
         if (applicationVO.getSize() == null || applicationVO.getCurrent() == null) {
-            queryWrapper.eq(Application::getIsDelete, 0);
+            queryWrapper.eq(Application::getIsDelete, 0)
+                    .eq(Application::getTenantId, StpUtil.getLoginIdAsInt());
+
             return this.list(queryWrapper);
         } else {
             queryWrapper.like(Application::getApplicationDescription, applicationVO.getName());
@@ -74,7 +75,7 @@ public class ApplicationService extends ServiceImpl<ApplicationMapper, Applicati
             queryWrapper.like(Application::getApplicationName, applicationVO.getName());
             queryWrapper.eq(Application::getIsDelete, 0);
 
-            return this.page(new Page<>(applicationVO.getCurrent(), applicationVO.getSize()), queryWrapper);
+            return this.page(new Page<>(applicationVO.getCurrent(), applicationVO.getSize()), queryWrapper).getRecords();
         }
     }
 }

+ 36 - 7
PCS/src/main/java/cn/cslg/permission/service/LoginService.java

@@ -1,11 +1,15 @@
 package cn.cslg.permission.service;
 
+import cn.cslg.permission.common.core.base.RedisConf;
+import cn.cslg.permission.common.model.vo.LoginVO;
 import cn.cslg.permission.common.model.vo.PersonnelVO;
-import cn.cslg.permission.common.utils.Response;
-import cn.cslg.permission.common.utils.ResponseEnum;
-import cn.cslg.permission.common.utils.StpAdminUtil;
+import cn.cslg.permission.common.utils.*;
 import cn.cslg.permission.domain.Personnel;
 import cn.cslg.permission.mapper.PersonnelMapper;
+import cn.hutool.captcha.CaptchaUtil;
+import cn.hutool.captcha.CircleCaptcha;
+import cn.hutool.core.img.ImgUtil;
+import cn.hutool.core.lang.UUID;
 import cn.hutool.crypto.SecureUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -13,6 +17,12 @@ import lombok.RequiredArgsConstructor;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
 /**
  * @author 沈永艺
  * @date 2022-8-2
@@ -22,21 +32,40 @@ import org.springframework.stereotype.Service;
 @Service
 @RequiredArgsConstructor(onConstructor_ = {@Lazy})
 public class LoginService extends ServiceImpl<PersonnelMapper, Personnel> {
-    public String login(PersonnelVO personnelVO) {
+    private final RedisUtil redisUtil;
+    private final CacheUtils cacheUtils;
+
+    public String login(LoginVO loginVO) {
+        String tempCode = redisUtil.get(RedisConf.VERIFY_CODE + RedisConf.SYMBOL_COLON + loginVO.getUuid());
+        if (Boolean.TRUE.equals(StringUtils.isEmpty(tempCode)) || !tempCode.equals(loginVO.getCode())) {
+            return Response.error(ResponseEnum.VERIFY_CODE_ERROR);
+        }
         LambdaQueryWrapper<Personnel> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(Personnel::getPersonnelUserName, personnelVO.getUsername());
+        queryWrapper.eq(Personnel::getPersonnelUserName, loginVO.getUsername());
 
         Personnel personnel = this.getOne(queryWrapper);
 
         if (personnel == null) {
             return Response.error(ResponseEnum.USERNAME_ERROR);
         }
-        boolean isPassword = SecureUtil.md5(personnelVO.getPassword()).equals(personnel.getPersonnelPassword());
+        boolean isPassword = SecureUtil.md5(loginVO.getPassword()).equals(personnel.getPersonnelPassword());
         if (!isPassword) {
             return Response.error(ResponseEnum.PASSWORD_ERROR);
         }
         StpAdminUtil.login(personnel.getId());
-        System.out.println(StpAdminUtil.getLoginId());
+        cacheUtils.setLoginUser(personnel);
+        personnel.setPersonnelPassword(null);
         return Response.success(StpAdminUtil.getTokenValue());
     }
+
+    public String verifyCode(HttpServletRequest request, HttpServletResponse response) throws Exception {
+        //定义图形验证码的长、宽、验证码字符数、干扰元素个数
+        CircleCaptcha captcha = CaptchaUtil.createCircleCaptcha(200, 100, 4, 20);
+        String uuid = UUID.fastUUID().toString();
+        Map<String, String> result = new HashMap<>();
+        result.put("captcha", ImgUtil.toBase64DataUri(captcha.getImage(), "png"));
+        result.put("uuid", uuid);
+        redisUtil.setEx(RedisConf.VERIFY_CODE + RedisConf.SYMBOL_COLON + uuid, captcha.getCode(), 60, TimeUnit.SECONDS);
+        return Response.success(result);
+    }
 }