Преглед изворни кода

1.新增登录接口
2.表修改

GouGengquan пре 9 месеци
родитељ
комит
7d26edf9f2

+ 4 - 8
biz-base/src/main/java/com/dayou/controller/AuthController.java

@@ -1,17 +1,13 @@
 package com.dayou.controller;
 
 import cn.hutool.core.util.ObjectUtil;
-import com.dayou.dto.LoginByOADTO;
 import com.dayou.result.Result;
 import com.dayou.result.Status;
 import com.dayou.service.AuthService;
 import com.dayou.vo.UserVO;
 import lombok.extern.slf4j.Slf4j;
 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.web.bind.annotation.*;
 
 @RestController
 @RequestMapping("/auth")
@@ -23,12 +19,12 @@ public class AuthController {
 
     /**
      * 通过oa系统的信息登录到生产力平台,并同步用户信息
-     * @param loginByOADTO 登录信息
+     * @param oaToken oa系统token
      * @return Result<UserVO>
      */
     @PostMapping("/loginByOAInfo")
-    public Result<UserVO> loginByOAInfo(@RequestBody LoginByOADTO loginByOADTO){
-        UserVO userVO = authService.loginByOAInfo(loginByOADTO);
+    public Result<UserVO> loginByOAInfo(String oaToken){
+        UserVO userVO = authService.loginByOAInfo(oaToken);
         if (ObjectUtil.isNotNull(userVO)){
             return Result.build(Status.SUCCESS, userVO);
         }else {

+ 3 - 4
biz-base/src/test/java/com/dayou/BaseApplicationTests.java

@@ -25,14 +25,13 @@ class BaseApplicationTests {
 
     }
 
-    // @Test
+     @Test
     void hutoolPostTest(){
         //链式构建请求
-        String result = HttpRequest.post("localhost:8088/api/auth/checkOaToken?token=eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwiZXhwIjoxNzI5MDc1MTI5LCJpYXQiOjE3Mjg5ODg3Mjl9.KC1n8xRJBfvJL4C0wQXZ9xRQX_opisIznyDkWHW3NxyDvEEM3K-bm7cnJ7BLYNCroOEbaEj6V5OdQ-YK2RGERg")
+        String result = HttpRequest.post("localhost:8088/api/auth/checkOaToken?token=eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwiZXhwIjoxNzI5MzE3MzUyLCJpYXQiOjE3MjkyMzA5NTJ9.6zLI3TXlNGD2XCEMwl7vyYRDKFMRAfxhr8TaC1GEnug4eTnJZTJQRUeLBH7pymniKlQDVtrZD_ZGd359vZid7Q")
                 .timeout(20000)//超时,毫秒
                 .execute().body();
-        Boolean tokenStatus = Boolean.valueOf(result);
-        Console.log(tokenStatus);
+        Console.log(result);
     }
 
     /**

+ 30 - 0
common/src/main/java/com/dayou/auth/RoleEnum.java

@@ -0,0 +1,30 @@
+package com.dayou.auth;
+
+public enum RoleEnum {
+
+    ADMIN("ADMIN", "管理员"),
+    USER("USER", "普通用户");
+
+    private String code;
+
+    private String name;
+
+    RoleEnum(String code, String name) {
+        this.code = code;
+        this.name = name;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    @Override
+    public String toString() {
+        return name + ":" + code;
+    }
+
+}

+ 41 - 0
common/src/main/java/com/dayou/auth/StpInterfaceImpl.java

@@ -0,0 +1,41 @@
+package com.dayou.auth;
+
+import cn.dev33.satoken.stp.StpInterface;
+import cn.dev33.satoken.stp.StpUtil;
+import com.dayou.auth.extra.LoginUserInfo;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Component
+public class StpInterfaceImpl implements StpInterface {
+
+    /**
+     * 暂时用不上
+     */
+    @Override
+    public List<String> getPermissionList(Object loginId, String loginType) {
+        // TODO:有需要校验权限时在这里添加
+        return null;
+    }
+
+    /**
+     * 返回一个账号所拥有的角色标识集合 (权限与角色可分开校验)
+     */
+    @Override
+    public List<String> getRoleList(Object loginId, String loginType) {
+        // 从登录信息中获取用户信息
+        LoginUserInfo loginUserInfo = (LoginUserInfo) StpUtil.getExtra(loginId.toString());
+        List<String> roleList = new ArrayList<String>();
+        // 如果账号是ADMIN,那么拥有所有角色
+        if (loginUserInfo.getRole().equals(RoleEnum.ADMIN.getCode())){
+            roleList.add("ADMIN");
+            roleList.add("USER");
+        }else {
+            roleList.add("USER");
+        }
+        return roleList;
+    }
+
+}

+ 53 - 0
common/src/main/java/com/dayou/auth/extra/LoginUserInfo.java

@@ -0,0 +1,53 @@
+package com.dayou.auth.extra;
+
+import lombok.Data;
+
+@Data
+public class LoginUserInfo {
+
+    /**
+     * 用户id
+     */
+    private Long id;
+
+    /**
+     * 用户在oa系统中的userId
+     */
+    private Long userOaId;
+
+    /**
+     * 姓名
+     */
+    private String name;
+
+    /**
+     * 员工工号
+     */
+    private String staffNo;
+
+    /**
+     * token名字
+     */
+    private String tokenName;
+
+    /**
+     * token值
+     */
+    private String tokenValue;
+
+    /**
+     * 用户角色
+     */
+    private String role;
+
+    /**
+     * 用户的OA系统岗位名称集合
+     */
+    private String postNameList;
+
+    /**
+     * 用户的OA系统部门名称集合
+     */
+    private String departmentNameList;
+
+}

+ 9 - 0
dao/src/main/java/com/dayou/mapper/UserMapper.java

@@ -2,6 +2,8 @@ package com.dayou.mapper;
 
 import com.dayou.entity.User;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.dayou.vo.UserVO;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * <p>
@@ -13,4 +15,11 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  */
 public interface UserMapper extends BaseMapper<User> {
 
+    /**
+     * 根据id获取用户信息
+     * @param id 用户id
+     * @return UserVO
+     */
+    UserVO getUserInfoById(@Param("id") Long id);
+
 }

+ 16 - 0
dao/src/main/java/com/dayou/mapper/UserPostMapper.java

@@ -0,0 +1,16 @@
+package com.dayou.mapper;
+
+import com.dayou.entity.UserPost;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author mybatis-plus-generator
+ * @since 2024-10-18
+ */
+public interface UserPostMapper extends BaseMapper<UserPost> {
+
+}

+ 9 - 0
dao/src/main/resources/mapper/UserMapper.xml

@@ -20,4 +20,13 @@
         name, staff_no, delete_status
     </sql>
 
+    <!--根据id获取用户信息-->
+    <select id="getUserInfoById" resultType="com.dayou.vo.UserVO">
+        SELECT user.id, user.user_oa_id, name, staff_no, role, department_name, post_name
+        FROM user
+        LEFT JOIN user_post ON user_post.user_oa_id = user.user_oa_id AND user_post.delete_status = false
+        WHERE user.id = #{id}
+        AND user.delete_status = false
+    </select>
+
 </mapper>

+ 26 - 0
dao/src/main/resources/mapper/UserPostMapper.xml

@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dayou.mapper.UserPostMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.dayou.entity.UserPost">
+        <result column="id" property="id" />
+        <result column="create_time" property="createTime" />
+        <result column="update_time" property="updateTime" />
+        <result column="delete_status" property="deleteStatus" />
+        <result column="user_oa_id" property="userOaId" />
+        <result column="post_name" property="postName" />
+        <result column="department_name" property="departmentName" />
+        <result column="role" property="role" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id,
+        create_time,
+        update_time,
+        delete_status,
+        user_oa_id, post_name, department_name, role
+    </sql>
+
+</mapper>

+ 0 - 40
domain/src/main/java/com/dayou/dto/LoginByOADTO.java

@@ -1,40 +0,0 @@
-package com.dayou.dto;
-
-import lombok.Data;
-
-import java.util.List;
-
-@Data
-public class LoginByOADTO {
-
-    /**
-     * 用户在oa系统中的userId
-     */
-    private Long userOaId;
-
-    /**
-     * 姓名
-     */
-    private String name;
-
-    /**
-     * 员工工号
-     */
-    private String staffNo;
-
-    /**
-     * 部门id
-     */
-    private List<Long> departmentIds;
-
-    /**
-     * 岗位id
-     */
-    private List<Long> postIds;
-
-    /**
-     * oa系统token
-     */
-    private String oaToken;
-
-}

+ 42 - 0
domain/src/main/java/com/dayou/dto/OALoginDTO.java

@@ -0,0 +1,42 @@
+package com.dayou.dto;
+
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Set;
+
+@Data
+public class OALoginDTO {
+
+    /**
+     * 用户的OA系统userId
+     */
+    private Long userOaId;
+
+    /**
+     * 员工工号
+     */
+    private String staffNo;
+
+    /**
+     * 姓名
+     */
+    private String name;
+
+    /**
+     * 用户的OA系统岗位名称集合
+     */
+    private List<String> postNameList;
+
+    /**
+     * 用户的OA系统部门名称集合
+     */
+    private List<String> departmentNameList;
+
+    /**
+     * 用户的OA系统最后修改用户信息的时间
+     */
+    private Date lastUpdateTime;
+
+}

+ 3 - 0
domain/src/main/java/com/dayou/entity/User.java

@@ -5,6 +5,8 @@ import java.io.Serializable;
 
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
 /**
  * <p>
  * 
@@ -14,6 +16,7 @@ import lombok.EqualsAndHashCode;
  * @since 2024-10-14
  */
 @Data
+@Accessors(chain = true)
 @EqualsAndHashCode(callSuper = true)
 public class User extends BaseEntity implements Serializable {
 

+ 46 - 0
domain/src/main/java/com/dayou/entity/UserPost.java

@@ -0,0 +1,46 @@
+package com.dayou.entity;
+import com.dayou.common.BaseEntity;
+
+import java.io.Serializable;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author mybatis-plus-generator
+ * @since 2024-10-18
+ */
+@Data
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = true)
+public class UserPost extends BaseEntity implements Serializable {
+
+    private static final long serialVersionUID=1L;
+
+    /**
+     * 用户OA id
+     */
+    private Long userId;
+
+    /**
+     * 岗位名称(json)
+     */
+    private String postName;
+
+    /**
+     * 部门名称(json)
+     */
+    private String departmentName;
+
+    /**
+     * 用户角色[ADMIN、USER]
+     */
+    private String role;
+
+
+}

+ 17 - 0
domain/src/main/java/com/dayou/vo/UserVO.java

@@ -2,8 +2,10 @@ package com.dayou.vo;
 
 import com.dayou.entity.User;
 import lombok.Data;
+import lombok.experimental.Accessors;
 
 @Data
+@Accessors(chain = true)
 public class UserVO extends User {
 
     /**
@@ -16,4 +18,19 @@ public class UserVO extends User {
      */
     private String tokenValue;
 
+    /**
+     * 用户角色
+     */
+    private String role;
+
+    /**
+     * 用户的OA系统岗位名称集合
+     */
+    private String postNameList;
+
+    /**
+     * 用户的OA系统部门名称集合
+     */
+    private String departmentNameList;
+
 }

+ 2 - 3
service/src/main/java/com/dayou/service/AuthService.java

@@ -1,15 +1,14 @@
 package com.dayou.service;
 
-import com.dayou.dto.LoginByOADTO;
 import com.dayou.vo.UserVO;
 
 public interface AuthService {
 
     /**
      * 通过oa系统的信息登录到生产力平台,并同步用户信息
-     * @param loginByOADTO 登录信息
+     * @param oaToken oa系统token
      * @return UserVO
      */
-    UserVO loginByOAInfo(LoginByOADTO loginByOADTO);
+    UserVO loginByOAInfo(String oaToken);
 
 }

+ 72 - 29
service/src/main/java/com/dayou/service/impl/AuthServiceImpl.java

@@ -3,16 +3,26 @@ package com.dayou.service.impl;
 import cn.dev33.satoken.stp.SaLoginModel;
 import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.core.bean.BeanUtil;
-import cn.hutool.http.Header;
+import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.http.HttpRequest;
-import com.dayou.dto.LoginByOADTO;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.dayou.auth.RoleEnum;
+import com.dayou.auth.extra.LoginUserInfo;
+import com.dayou.common.BaseEntity;
+import com.dayou.dto.OALoginDTO;
 import com.dayou.entity.User;
+import com.dayou.entity.UserPost;
 import com.dayou.mapper.UserMapper;
+import com.dayou.mapper.UserPostMapper;
 import com.dayou.service.AuthService;
 import com.dayou.vo.UserVO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 @Service
 public class AuthServiceImpl implements AuthService {
@@ -23,41 +33,74 @@ public class AuthServiceImpl implements AuthService {
     @Autowired
     private UserMapper userMapper;
 
+    @Autowired
+    private UserPostMapper userPostMapper;
+
     /**
      * 通过oa系统的信息登录到生产力平台,并同步用户信息
-     * @param loginByOADTO 登录信息
+     * @param oaToken oa系统token
      * @return UserVO
      */
     @Override
-    public UserVO loginByOAInfo(LoginByOADTO loginByOADTO) {
+    @Transactional(rollbackFor = Exception.class)
+    public UserVO loginByOAInfo(String oaToken) {
 
-        // 带上oa系统的token,调用oa系统判断token合法性的接口(返回Boolean)
-        // TODO:改成OA返回用户信息,生产力平台保存,只需要前端提交token
-        String result = HttpRequest.post(oaApiUrl + "/auth/checkOaToken?token=" + loginByOADTO.getOaToken())
+        // 带上oa系统的token,调用oa系统判断token合法性以及获取用户信息
+        String result = HttpRequest.post(oaApiUrl + "/auth/checkOaToken?token=" + oaToken)
                 .timeout(20000)//超时,毫秒
                 .execute().body();
-        boolean tokenStatus = Boolean.parseBoolean(result);
-
-        // 判断token是否过期(true:过期或无效,false:未过期)
-        if (tokenStatus){
-            // 同步oa的user信息
-            User user = BeanUtil.copyProperties(loginByOADTO, User.class);
-            userMapper.insert(user);
-
-            // 在生产力平台登录
-            StpUtil.login(loginByOADTO.getUserOaId(), new SaLoginModel()
-                    .setDevice("PC")                // 此次登录的客户端设备类型, 用于[同端互斥登录]时指定此次登录的设备类型
-                    .setIsLastingCookie(true)        // 是否为持久Cookie(临时Cookie在浏览器关闭时会自动删除,持久Cookie在重新打开后依然存在)
-                    .setToken(loginByOADTO.getOaToken()) // 指定此次登录生成的Token(使用oa系统的token)
-                    .setIsWriteHeader(false)         // 是否在登录后将 Token 写入到响应头
-                    .setActiveTimeout(86400)           // 指定此次登录token的最低活跃频率, 单位:秒,设置此参数需要在配置文件打开dynamicActiveTimeout=true
-            );
-            UserVO userVO = BeanUtil.copyProperties(user, UserVO.class);
-            userVO.setTokenName(StpUtil.getTokenName());
-            userVO.setTokenValue(StpUtil.getTokenValue());
-            return userVO;
-        }else {
-            return null;
+        JSONObject jsonObject = JSONUtil.parseObj(result);
+        OALoginDTO oaLoginDTO = jsonObject.toBean(OALoginDTO.class);
+
+        // 判断是否拿到了登录信息
+        if (ObjectUtil.isNotNull(oaLoginDTO)){
+
+            // 判断生产力平台的该用户是否存在或最后更新信息的时间是否在oa系统之前
+            User user = userMapper.selectOne(new LambdaQueryWrapper<User>().eq(User::getUserOaId, oaLoginDTO.getUserOaId()).eq(BaseEntity::getDeleteStatus, false));
+            if (ObjectUtil.isNull(user)) {
+                // 新增oa的user信息到生产力平台
+                setUserInfo(oaLoginDTO, user);
+                userMapper.insert(user);
+                UserPost userPost = new UserPost().setUserId(user.getId());
+                setUserPostInfo(oaLoginDTO,userPost);
+                userPostMapper.insert(userPost);
+            }else if (user.getUpdateTime().before(oaLoginDTO.getLastUpdateTime())){
+                // 更新oa的user信息到生产力平台
+                setUserInfo(oaLoginDTO, user);
+                userMapper.updateById(user);
+                UserPost userPost = new UserPost().setUserId(user.getId());
+                setUserPostInfo(oaLoginDTO,userPost);
+                userPostMapper.update(userPost, new UpdateWrapper<UserPost>().eq("user_oa_id", oaLoginDTO.getUserOaId()).eq("delete_status", false));
+            }
+            UserVO userVO = userMapper.getUserInfoById(user.getId());
+            if (ObjectUtil.isNotNull(userVO)){
+                // 在生产力平台登录
+                StpUtil.login(userVO.getId(), new SaLoginModel()
+                        .setDevice("PC")                // 此次登录的客户端设备类型, 用于[同端互斥登录]时指定此次登录的设备类型
+                        .setIsLastingCookie(true)       // 是否为持久Cookie(临时Cookie在浏览器关闭时会自动删除,持久Cookie在重新打开后依然存在)
+                        .setToken(oaToken)              // 指定此次登录生成的Token(使用oa系统的token)
+                        .setExtra(userVO.getId().toString(), BeanUtil.toBean(userVO, LoginUserInfo.class)) // 设置额外登录信息
+                );
+                return userVO;
+            }else {
+                throw new RuntimeException("登录失败!Token无效!");
+            }
         }
+        return null;
+    }
+
+    private void setUserInfo(OALoginDTO oaLoginDTO, User user) {
+        user.setUserOaId(oaLoginDTO.getUserOaId())
+                .setName(oaLoginDTO.getName())
+                .setStaffNo(oaLoginDTO.getStaffNo());
+    }
+
+    private void setUserPostInfo(OALoginDTO oaLoginDTO, UserPost userPost){
+        String jsonDepartmentName = JSONUtil.toJsonStr(oaLoginDTO.getDepartmentNameList());
+        String jsonPostName = JSONUtil.toJsonStr(oaLoginDTO.getPostNameList());
+        userPost.setUserId(userPost.getUserId())
+                .setDepartmentName(jsonDepartmentName)
+                .setPostName(jsonPostName)
+                .setRole(jsonPostName.contains("超级管理员岗") ? RoleEnum.ADMIN.getCode() : RoleEnum.USER.getCode());
     }
 }

+ 10 - 1
sql/update_sql.sql

@@ -49,4 +49,13 @@ CREATE TABLE `user_post` (
                              `delete_status` bit(1) NOT NULL DEFAULT b'0' COMMENT '删除状态',
                              PRIMARY KEY (`id`),
                              KEY `user_oa_id` (`user_oa_id`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+/**
+  日期:2024-10-18
+  修改人:苟耕铨
+  未更新到test-env
+ */
+ALTER TABLE user_post MODIFY COLUMN post_name JSON NULL COMMENT '岗位名称(json)';
+ALTER TABLE user_post MODIFY COLUMN department_name JSON NULL COMMENT '部门名称(json)';
+ALTER TABLE user_post CHANGE COLUMN user_oa_id user_id bigint(20) unsigned DEFAULT NULL COMMENT 'user_id';