Browse Source

对接了用户CRD操作

bfzgs 2 years ago
parent
commit
1db8e768ac

+ 1 - 1
final-common/src/main/java/org/brynhild/graduation/common/constant/AccountConstant.java

@@ -2,7 +2,7 @@ package org.brynhild.graduation.common.constant;
 
 public class AccountConstant {
     public static final Integer ADMIN = 0;
-    public static final Integer SYSTEM = 1;
+    public static final Integer TEACHER = 1;
     public static final Integer USER = 2;
     public static final String DEFAULT_AVATAR = "";
     public static final String DEFAULT_LOGIN_TIME = "";

+ 2 - 0
final-gateway/src/main/java/org/brynhild/graduation/gateway/route/ApplicationGlobalFilter.java

@@ -33,10 +33,12 @@ public class ApplicationGlobalFilter implements GatewayFilter, Ordered {
             return chain.filter(exchange);
         }
         if (!tokenValidRule.permit(exchange)) {
+            System.out.println("invalid token");
             response.setStatusCode(HttpStatus.NON_AUTHORITATIVE_INFORMATION);
             return response.setComplete();
         }
         if (!authorityRule.permit(exchange)) {
+            System.out.println("unauthorized");
             response.setStatusCode(HttpStatus.UNAUTHORIZED);
             return response.setComplete();
         }

+ 5 - 2
final-gateway/src/main/java/org/brynhild/graduation/gateway/rule/AuthorityRule.groovy

@@ -22,11 +22,14 @@ class AuthorityRule implements ApiRule {
         ServerHttpRequest request = exchange.getRequest()
         HttpHeaders headers = request.getHeaders()
         String path = request.getPath().toString()
+        println "visit:${path}"
         try {
             def claims = jwtUtil.parseJWT(headers.getFirst(AccountConstant.ACCOUNT_HEADER))
-            def role = claims.get(AccountConstant.TOKEN_ROLE)
-            if (role instanceof Integer) {
+            def role = claims.get(AccountConstant.TOKEN_ROLE) as String
+            if (role!=null) {
+                role=Integer.parseInt(role)
                 path = StringUtil.stripPrefix(path, 1)
+                println "visit path in app:${path},role:${role}"
                 return authorityMap.permit(path, role)
             } else {
                 return false

+ 20 - 14
final-gateway/src/main/java/org/brynhild/graduation/gateway/rule/TokenValidRule.groovy

@@ -25,24 +25,30 @@ class TokenValidRule implements ApiRule {
         HttpHeaders headers = request.getHeaders()
         String token = headers.getFirst(AccountConstant.ACCOUNT_HEADER)
         if (token == null) {
+            println "token not found"
             return false
         }
+        println "token:${token}"
         try {
             String username = jwtUtil.parseJWT(token).get(AccountConstant.TOKEN_USERNAME, String.class)
-            String savedToken = userTokenMap.get(username)
-            if (token == savedToken) {
-                return true
-            }
-            if (savedToken == null) {
-                Object tokenObject = redisTemplate.opsForValue().get(RedisConstant.USER_ACTIVE_TOKEN + username)
-                if (tokenObject instanceof String) {
-                    savedToken = tokenObject
-                    userTokenMap.put(username, tokenObject)
-                } else {
-                    return false
-                }
-            }
-            return savedToken.equals(token)
+            return true
+//            TODO 没有保证全局唯一
+//            String savedToken = userTokenMap.get(username)
+//            println "savedToken:${savedToken}"
+//            if (token == savedToken) {
+//                return true
+//            }
+//            if (savedToken == null) {
+//                Object tokenObject = redisTemplate.opsForValue().get(RedisConstant.USER_ACTIVE_TOKEN + username)
+//                println "findTokenInRedis:${tokenObject}"
+//                if (tokenObject instanceof String) {
+//                    savedToken = tokenObject
+//                    userTokenMap.put(username, tokenObject)
+//                } else {
+//                    return false
+//                }
+//            }
+//            return savedToken.equals(token)
         } catch (Exception e) {
             e.printStackTrace()
             return false

+ 1 - 1
final-gateway/src/main/java/org/brynhild/graduation/gateway/rule/config/AuthorityMap.groovy

@@ -13,7 +13,7 @@ class AuthorityMap {
 
     private final Map<String, List<Integer>> authorityMap = new HashMap<String, List<Integer>>() {
         {
-            put("/admin", Arrays.asList(AccountConstant.ADMIN, AccountConstant.SYSTEM))
+            put("/admin", Arrays.asList(AccountConstant.ADMIN, AccountConstant.TEACHER))
 //        put("/system",AccountConstant.SYSTEM)
         }
     }

+ 5 - 1
final-transfer/src/main/java/org/brynhild/graduation/transfer/user/vo/AdminDeleteAcademy.java

@@ -2,7 +2,11 @@ package org.brynhild.graduation.transfer.user.vo;
 
 import lombok.Data;
 
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
 @Data
 public class AdminDeleteAcademy {
-    private Long id;
+    @NotNull
+    private List<Long> id;
 }

+ 5 - 1
final-transfer/src/main/java/org/brynhild/graduation/transfer/user/vo/AdminDeleteUser.java

@@ -2,7 +2,11 @@ package org.brynhild.graduation.transfer.user.vo;
 
 import lombok.Data;
 
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
 @Data
 public class AdminDeleteUser {
-    private Long id;
+    @NotNull
+    private List<Long> id;
 }

+ 1 - 0
final-user/src/main/java/org/brynhild/graduation/user/controller/AdminController.java

@@ -32,6 +32,7 @@ public class AdminController {
         if (result.hasErrors()) {
             return verifier.convertToErrors(result);
         }
+        System.out.println(token);
         return adminService.addUser(info, token);
     }
 

+ 1 - 2
final-user/src/main/java/org/brynhild/graduation/user/controller/CommonController.java

@@ -4,7 +4,6 @@ import lombok.RequiredArgsConstructor;
 import org.brynhild.graduation.common.constant.AccountConstant;
 import org.brynhild.graduation.common.transfer.dto.Result;
 import org.brynhild.graduation.common.utils.RequestBodyVerifier;
-import org.brynhild.graduation.common.utils.StringUtil;
 import org.brynhild.graduation.transfer.user.vo.ModifyUser;
 import org.brynhild.graduation.user.service.ICommonService;
 import org.brynhild.graduation.user.service.IDeviceService;
@@ -37,7 +36,7 @@ public class CommonController {
     }
 
     @PostMapping("/info")
-    public Result queryInfo(@RequestHeader(AccountConstant.ACCOUNT_HEADER)String token){
+    public Result queryInfo(@RequestHeader(AccountConstant.ACCOUNT_HEADER) String token) {
         System.out.println(token);
         return commonService.queryInfo(token);
     }

+ 1 - 1
final-user/src/main/java/org/brynhild/graduation/user/factory/OperationLogFactory.groovy

@@ -10,7 +10,7 @@ import org.springframework.stereotype.Component
 
 @Component
 class OperationLogFactory {
-    private final String ln = "\r\n";
+    private final String ln = "\r\n"
 
     OperationLog userOffline(Long id, String name) {
         def log = new OperationLog()

+ 16 - 0
final-user/src/main/java/org/brynhild/graduation/user/handler/BaseExceptionHandler.java

@@ -0,0 +1,16 @@
+package org.brynhild.graduation.user.handler;
+
+import org.brynhild.graduation.common.transfer.dto.Result;
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+@ControllerAdvice
+public class BaseExceptionHandler {
+    @ExceptionHandler(value = Exception.class)
+    @ResponseBody
+    public Result error(Exception e) {
+        e.printStackTrace();
+        return new Result(false, e.getMessage());
+    }
+}

+ 51 - 30
final-user/src/main/java/org/brynhild/graduation/user/service/impl/AdminServiceImpl.groovy

@@ -16,6 +16,7 @@ import org.brynhild.graduation.user.factory.SpecificationFactory
 import org.brynhild.graduation.user.service.IAdminService
 import org.springframework.beans.factory.annotation.Autowired
 import org.springframework.stereotype.Service
+import org.springframework.transaction.annotation.Transactional
 
 @Service
 class AdminServiceImpl implements IAdminService {
@@ -45,7 +46,7 @@ class AdminServiceImpl implements IAdminService {
     @Override
     Result addUser(AdminAddUser info, String token) {
         def claims = jwtUtil.parseJWT(token)
-        def id = Long.parseLong(claims.getId())
+        def id = Long.parseLong(claims.get(AccountConstant.TOKEN_ID) as String)
         def name = claims.get(AccountConstant.TOKEN_NAME)
 
         def user = userRepository.findUserByUsernameOrNo(info.username, info.no)
@@ -68,7 +69,7 @@ class AdminServiceImpl implements IAdminService {
     @Override
     Result modifyUser(AdminModifyUser info, String token) {
         def claims = jwtUtil.parseJWT(token)
-        def id = Long.parseLong(claims.getId())
+        def id = Long.parseLong(claims.get(AccountConstant.TOKEN_ID) as String)
         def name = claims.get(AccountConstant.TOKEN_NAME)
 
         def optional = userRepository.findById(info.id)
@@ -89,24 +90,33 @@ class AdminServiceImpl implements IAdminService {
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     Result deleteUser(AdminDeleteUser info, String token) {
         def claims = jwtUtil.parseJWT(token)
-        def id = Long.parseLong(claims.getId())
+        def id = Long.parseLong(claims.get(AccountConstant.TOKEN_ID) as String)
         def name = claims.get(AccountConstant.TOKEN_NAME)
 
-        def optional = userRepository.findById(info.id)
-        if (optional.isEmpty()) {
-            return new Result(false, "删除失败,无此用户")
+        List<OperationLog> operationLogList = new ArrayList<>()
+        for (Long userId : info.id) {
+            def optional = userRepository.findById(userId)
+            if (optional.isEmpty()) {
+                throw new IllegalArgumentException("没有这个用户")
+            }
+            def user = optional.get()
+            def log = new OperationLog()
+            log.operatorName = name
+            log.operatorId = id
+            log.targetName = user.name
+            log.targetId = user.id
+            log.description = "管理员${id}->${name}删除了用户${user.id}->${user.name}"
+            userRepository.logicDelete(user.id)
+            operationLogList.add(log)
         }
-        def user = optional.get()
-        def log = new OperationLog()
-        log.operatorName = name
-        log.operatorId = id
-        log.targetName = user.name
-        log.targetId = user.id
-        log.description = "管理员${id}->${name}删除了用户${user.id}->${user.name}"
-        userRepository.logicDelete(user.id)
-        logSender.sendOperationLog(log)
+
+        for (OperationLog log : operationLogList) {
+            logSender.sendOperationLog(log)
+        }
+
 
         return new Result(true, "删除成功")
     }
@@ -120,7 +130,7 @@ class AdminServiceImpl implements IAdminService {
     @Override
     Result addAcademy(AdminAddAcademy info, String token) {
         def claims = jwtUtil.parseJWT(token)
-        def id = Long.parseLong(claims.getId())
+        def id = Long.parseLong(claims.get(AccountConstant.TOKEN_ID) as String)
         def name = claims.get(AccountConstant.TOKEN_NAME)
         def academy = academyRepository.findAcademyByNameOrNo(info.name, info.no)
         if (academy != null) {
@@ -141,7 +151,7 @@ class AdminServiceImpl implements IAdminService {
     @Override
     Result modifyAcademy(AdminModifyAcademy info, String token) {
         def claims = jwtUtil.parseJWT(token)
-        def id = Long.parseLong(claims.getId())
+        def id = Long.parseLong(claims.get(AccountConstant.TOKEN_ID) as String)
         def name = claims.get(AccountConstant.TOKEN_NAME)
 
         def optional = academyRepository.findById(info.id)
@@ -162,24 +172,35 @@ class AdminServiceImpl implements IAdminService {
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     Result deleteAcademy(AdminDeleteAcademy info, String token) {
         def claims = jwtUtil.parseJWT(token)
-        def id = Long.parseLong(claims.getId())
+        def id = Long.parseLong(claims.get(AccountConstant.TOKEN_ID) as String)
         def name = claims.get(AccountConstant.TOKEN_NAME)
 
-        def optional = academyRepository.findById(info.id)
-        if (optional.isEmpty()) {
-            return new Result(false, "删除失败,无相关数据")
+        List<OperationLog> logList=new ArrayList<>()
+        for(Long acaId:info.id){
+            def optional = academyRepository.findById(acaId)
+            if (optional.isEmpty()) {
+                throw new IllegalArgumentException("没有这个学院")
+            }
+            def academy = optional.get()
+            def log = new OperationLog()
+            log.operatorName = name
+            log.operatorId = id
+            log.targetName = academy.name
+            log.targetId = academy.id
+            log.description = "管理员${id}->${name}删除了学院${academy.id}->${academy.name}"
+            academyRepository.logicDelete(academy.id)
+            logList.add(log)
         }
-        def academy = optional.get()
-        def log = new OperationLog()
-        log.operatorName = name
-        log.operatorId = id
-        log.targetName = academy.name
-        log.targetId = academy.id
-        log.description = "管理员${id}->${name}删除了学院${academy.id}->${academy.name}"
-        academyRepository.logicDelete(academy.id)
-        logSender.sendOperationLog(log)
+
+        for(OperationLog log:logList){
+            logSender.sendOperationLog(log)
+        }
+
+
+
 
         return new Result(true, "删除成功")
     }

+ 2 - 2
final-user/src/main/java/org/brynhild/graduation/user/service/impl/CommonServiceImpl.groovy

@@ -41,7 +41,7 @@ class CommonServiceImpl implements ICommonService {
         if (!StringUtil.isEmpty(info.password)) {
             user.password = encoder.encode(info.password)
         }
-        if (!StringUtil.isEmpty(info.email)&& info.email != user.email) {
+        if (!StringUtil.isEmpty(info.email) && info.email != user.email) {
             user.state = UserStateConstant.NOT_ACTIVE
         }
         log.operatorId = log.targetId = user.id
@@ -59,7 +59,7 @@ class CommonServiceImpl implements ICommonService {
             return new Result(false, "用户不存在")
         }
         user = user.get()
-        return new Result(true,"查询成功",user)
+        return new Result(true, "查询成功", user)
     }
 
     private Optional<User> findUserByToken(String token) {

+ 8 - 8
final-user/src/main/java/org/brynhild/graduation/user/service/impl/UserServiceImpl.groovy

@@ -94,7 +94,7 @@ class UserServiceImpl implements IUserService {
             return new Result(false, "验证失败,请填写信息来重发激活邮件")
         }
         if (StringUtil.isEmpty(info.password)) {
-            return new Result(true, "信息有效");
+            return new Result(true, "信息有效")
         }
 
         def user = (User) userObject
@@ -157,16 +157,16 @@ class UserServiceImpl implements IUserService {
             return new Result(false, "用户不存在")
         }
         if (user.state != UserStateConstant.READY) {
-            if(user.state==UserStateConstant.NOT_ACTIVE){
-                ResendEmail resendEmail=new ResendEmail()
+            if (user.state == UserStateConstant.NOT_ACTIVE) {
+                ResendEmail resendEmail = new ResendEmail()
                 resendEmail.with {
-                    type=EmailConstant.ACTIVE_EMAIL
-                    email=user.email
-                    username=info.username
+                    type = EmailConstant.ACTIVE_EMAIL
+                    email = user.email
+                    username = info.username
                 }
                 return resend(resendEmail)
             }
-            if(user.state==UserStateConstant.FORBIDDEN){
+            if (user.state == UserStateConstant.FORBIDDEN) {
                 return new Result(false, '该账户已被禁用,请联系管理员', user.state)
             }
             throw new IllegalStateException()
@@ -183,7 +183,7 @@ class UserServiceImpl implements IUserService {
         }
         def token = jwtUtil.createJwt(claims)
 
-        user.lastLogin= TimeUtil.getCurrentTimeString()
+        user.lastLogin = TimeUtil.getCurrentTimeString()
         userRepository.save(user)
 
         def event = new UserSuccessLoginEvent(user.username, token)