Selaa lähdekoodia

管理后台功能重构

wangqi49 3 kuukautta sitten
vanhempi
commit
0926966e39
23 muutettua tiedostoa jossa 795 lisäystä ja 26 poistoa
  1. 66 0
      webchat-admin/src/main/java/com/webchat/admin/controller/AccountManagementController.java
  2. 32 17
      webchat-admin/src/main/java/com/webchat/admin/filter/OauthFilter.java
  3. 57 0
      webchat-admin/src/main/java/com/webchat/admin/service/AccountManagementService.java
  4. 52 0
      webchat-admin/src/main/java/com/webchat/admin/service/UserSessionService.java
  5. 2 0
      webchat-client-chat/src/main/java/com/webchat/client/WebchatClientApplication.java
  6. 1 1
      webchat-client-chat/src/main/java/com/webchat/client/chat/controller/FileController.java
  7. 28 0
      webchat-client-chat/src/main/java/com/webchat/client/chat/controller/UserController.java
  8. 113 0
      webchat-client-chat/src/main/java/com/webchat/client/chat/filter/OauthFilter.java
  9. 30 0
      webchat-client-chat/src/main/java/com/webchat/client/chat/service/UserService.java
  10. 52 0
      webchat-client-chat/src/main/java/com/webchat/client/chat/service/UserSessionService.java
  11. 1 1
      webchat-common/src/main/java/com/webchat/common/constants/CookieConstants.java
  12. 2 2
      webchat-common/src/main/java/com/webchat/common/helper/SessionHelper.java
  13. 2 1
      webchat-common/src/main/java/com/webchat/common/service/RedisService.java
  14. 0 0
      webchat-gateway/src/main/resources/application.yml
  15. 56 0
      webchat-remote/src/main/java/com/webchat/rmi/user/UserServiceClient.java
  16. 44 0
      webchat-sso/src/main/java/com/webchat/sso/controller/FileController.java
  17. 17 1
      webchat-sso/src/main/java/com/webchat/sso/controller/SSOServiceController.java
  18. 53 0
      webchat-sso/src/main/java/com/webchat/sso/controller/ValidCodeController.java
  19. 34 0
      webchat-sso/src/main/java/com/webchat/sso/service/SSOCoreService.java
  20. 41 0
      webchat-sso/src/main/java/com/webchat/sso/service/SessionService.java
  21. 42 0
      webchat-sso/src/main/java/com/webchat/sso/service/ValidCodeService.java
  22. 29 0
      webchat-user/src/main/java/com/webchat/user/controller/UserServiceController.java
  23. 41 3
      webchat-user/src/main/java/com/webchat/user/service/UserService.java

+ 66 - 0
webchat-admin/src/main/java/com/webchat/admin/controller/AccountManagementController.java

@@ -0,0 +1,66 @@
+package com.webchat.admin.controller;
+
+
+import com.webchat.admin.service.AccountManagementService;
+import com.webchat.common.bean.APIPageResponseBean;
+import com.webchat.common.bean.APIResponseBean;
+import com.webchat.common.bean.APIResponseBeanUtil;
+import com.webchat.common.helper.SessionHelper;
+import com.webchat.domain.vo.request.CreatePublicAccountRequestVO;
+import com.webchat.domain.vo.request.CreateRobotRequestVO;
+import com.webchat.domain.vo.response.UserBaseResponseInfoVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+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.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/admin-service/account")
+public class AccountManagementController {
+
+
+    @Autowired
+    private AccountManagementService accountManagementService;
+
+    @GetMapping("/page")
+    public APIPageResponseBean<UserBaseResponseInfoVO> page(
+            @RequestParam(value = "roleCode") Integer roleCode,
+            @RequestParam(value = "userId", required = false) String userId,
+            @RequestParam(value = "userName", required = false) String userName,
+            @RequestParam(value = "mobile", required = false) String mobile,
+            @RequestParam(value = "pageNo", required = false, defaultValue = "1") Integer pageNo,
+            @RequestParam(value = "pageSize", required = false, defaultValue = "10") Integer pageSize) {
+
+        return accountManagementService.page(userId, roleCode, userName, mobile, pageNo, pageSize);
+    }
+
+    /**
+     * 创建机器人
+     *
+     * @return
+     */
+    @PostMapping("/createRobot")
+    public APIResponseBean createRobot(@RequestBody CreateRobotRequestVO requestPram) {
+        String userId = SessionHelper.getCurrentUserId();
+        requestPram.setCreateUserId(userId);
+        accountManagementService.createRobot(requestPram);
+        return APIResponseBeanUtil.success("机器人创建成功");
+    }
+
+    /**
+     * 创建公众号
+     * 默认只有管理员可以创建公众号
+     *
+     * @return
+     */
+    @PostMapping("/createPublicAccount")
+    public APIResponseBean createPublicAccount(@RequestBody CreatePublicAccountRequestVO requestPram) {
+        String userId = SessionHelper.getCurrentUserId();
+        requestPram.setCreateUserId(userId);
+        accountManagementService.createPublicAccount(requestPram);
+        return APIResponseBeanUtil.success("公众号创建成功");
+    }
+}

+ 32 - 17
webchat-admin/src/main/java/com/webchat/admin/filter/OauthFilter.java

@@ -1,11 +1,11 @@
 package com.webchat.admin.filter;
 
+import com.webchat.admin.service.UserSessionService;
 import com.webchat.common.config.properties.OauthProperties;
 import com.webchat.common.constants.CookieConstants;
 import com.webchat.common.enums.BaseErrCodeEnum;
 import com.webchat.common.helper.SessionHelper;
 import com.webchat.common.util.JsonUtil;
-import com.webchat.common.util.RemoteIpUtil;
 import com.webchat.rmi.sso.OauthServiceClient;
 import jakarta.servlet.Filter;
 import jakarta.servlet.FilterChain;
@@ -14,7 +14,6 @@ import jakarta.servlet.ServletException;
 import jakarta.servlet.ServletRequest;
 import jakarta.servlet.ServletResponse;
 import jakarta.servlet.annotation.WebFilter;
-import jakarta.servlet.http.Cookie;
 import jakarta.servlet.http.HttpServletRequest;
 import jakarta.servlet.http.HttpServletResponse;
 import lombok.extern.slf4j.Slf4j;
@@ -24,6 +23,7 @@ import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Component;
 
 import java.io.IOException;
+import java.net.URLEncoder;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -43,11 +43,8 @@ public class OauthFilter implements Filter {
     @Autowired
     private OauthServiceClient oauthServiceClient;
 
-    /***
-     * 未登录
-     */
-    private static final String DEFAULT_USER_ID = "访客";
-
+    @Autowired
+    private UserSessionService userSessionService;
 
     @Override
     public void init(FilterConfig filterConfig) throws ServletException {
@@ -59,17 +56,35 @@ public class OauthFilter implements Filter {
         HttpServletRequest request = (HttpServletRequest) servletRequest;
         HttpServletResponse response = (HttpServletResponse) servletResponse;
         // 取集中session服务判断是否已经登录,如果已经登录则直接进入后续方法。
-
-        String oauthCode = request.getParameter("oauth_code");
-
+        String oauthCode = request.getHeader("oauth-code");
+        String userId = userSessionService.getUserIdByRequest(request);
+        if (StringUtils.isNotBlank(userId)) {
+            // 已经登录
+            SessionHelper.setUserId(userId);
+            try {
+                filterChain.doFilter(request, response);
+            } finally {
+                SessionHelper.clear();
+            }
+            return;
+        }
         if (StringUtils.isNotBlank(oauthCode)) {
-            String userId = oauthServiceClient.getUserIdByOauthCode(oauthCode).getData();
-            // TODO..
+            userId = oauthServiceClient.getUserIdByOauthCode(oauthCode).getData();
+            if (StringUtils.isNotBlank(userId)) {
+                userSessionService.createUserLoginSession(response, userId);
+                SessionHelper.setUserId(userId);
+                try {
+                    filterChain.doFilter(request, response);
+                } finally {
+                    SessionHelper.clear();
+                }
+                return;
+            }
         }
-
-        Cookie[] cookies = request.getCookies();
+        /**
+         * 302 重定向到统一登录页面
+         */
         this.unLogin(request, response);
-
     }
 
     private void unLogin(HttpServletRequest request, HttpServletResponse response) {
@@ -88,8 +103,8 @@ public class OauthFilter implements Filter {
 
     private String getRedirectUrl(HttpServletRequest request) {
         String serverUrl = oauthProperties.getServerUrl();
-        String originUrl = request.getHeader("origin_url");
-        return String.format(serverUrl, originUrl);
+        String originUrl = request.getHeader("origin-url");
+        return String.format(serverUrl, URLEncoder.encode(originUrl));
     }
 
     @Override

+ 57 - 0
webchat-admin/src/main/java/com/webchat/admin/service/AccountManagementService.java

@@ -0,0 +1,57 @@
+package com.webchat.admin.service;
+
+import com.webchat.common.bean.APIPageResponseBean;
+import com.webchat.common.bean.APIResponseBean;
+import com.webchat.common.bean.APIResponseBeanUtil;
+import com.webchat.common.constants.WebConstant;
+import com.webchat.common.enums.RedisKeyEnum;
+import com.webchat.common.exception.BusinessException;
+import com.webchat.domain.vo.request.CreatePublicAccountRequestVO;
+import com.webchat.domain.vo.request.CreateRobotRequestVO;
+import com.webchat.domain.vo.response.UserBaseResponseInfoVO;
+import com.webchat.rmi.user.UserServiceClient;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.Assert;
+
+@Service
+public class AccountManagementService {
+
+
+    @Autowired
+    private UserServiceClient userServiceClient;
+
+    public APIPageResponseBean<UserBaseResponseInfoVO> page(String userId, Integer roleCode, String userName, String mobile, Integer pageNo, Integer pageSize) {
+
+        return userServiceClient.page(userId, roleCode, userName, mobile, pageNo, pageSize);
+    }
+
+    /**
+     * 创建机器人
+     *
+     * 复用用户信息表,账号角色为 ROBOT
+     */
+    public void createRobot(CreateRobotRequestVO requestPram) {
+        APIResponseBean apiResponseBean = userServiceClient.createRobot(requestPram);
+        if (APIResponseBeanUtil.isOk(apiResponseBean)) {
+            return;
+        }
+        throw new BusinessException(apiResponseBean.getMsg());
+    }
+
+    /**
+     * 创建公众号
+     *
+     * 复用用户信息表,账号角色为 PUBLIC_ACCOUNT
+     */
+    public void createPublicAccount(CreatePublicAccountRequestVO requestVO) {
+        APIResponseBean apiResponseBean = userServiceClient.createPublicAccount(requestVO);
+        if (APIResponseBeanUtil.isOk(apiResponseBean)) {
+            return;
+        }
+        throw new BusinessException(apiResponseBean.getMsg());
+    }
+
+}

+ 52 - 0
webchat-admin/src/main/java/com/webchat/admin/service/UserSessionService.java

@@ -0,0 +1,52 @@
+package com.webchat.admin.service;
+
+import com.webchat.common.constants.CookieConstants;
+import com.webchat.common.enums.RedisKeyEnum;
+import com.webchat.common.service.RedisService;
+import com.webchat.common.util.DateUtils;
+import com.webchat.common.util.MD5Utils;
+import jakarta.servlet.http.Cookie;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class UserSessionService {
+
+    @Autowired
+    private RedisService redisService;
+
+    public String getUserIdByRequest(HttpServletRequest request) {
+        Cookie[] cookies = request.getCookies();
+        if (cookies != null) {
+            for (Cookie cookie : cookies) {
+                if (CookieConstants.WEB_CHAT_USER_COOKIE_KEY.equals(cookie.getName())) {
+                    String sessionId = cookie.getValue();
+                    return this.getUserIdBySessionId(sessionId);
+                }
+            }
+        }
+        return null;
+    }
+
+    public void createUserLoginSession(HttpServletResponse response, String userId) {
+        String sessionId = MD5Utils.md5(userId + DateUtils.getCurrentFormatDate());
+        this.setUserIdBySessionId(sessionId, userId);
+        // 种浏览器Cookie
+        Cookie cookie = new Cookie(CookieConstants.WEB_CHAT_USER_COOKIE_KEY, sessionId);
+        cookie.setPath("/");
+        cookie.setMaxAge(CookieConstants.COOKIE_OUT_TIME);
+        response.addCookie(cookie);
+    }
+
+    public String getUserIdBySessionId(String sessionId) {
+        String sessionCacheKey = RedisKeyEnum.USER_SESSION_PREFIX.getKey(sessionId);
+        return redisService.get(sessionCacheKey);
+    }
+
+    public void setUserIdBySessionId(String sessionId, String userId) {
+        String sessionCacheKey = RedisKeyEnum.USER_SESSION_PREFIX.getKey(sessionId);
+        redisService.set(sessionCacheKey, userId, RedisKeyEnum.USER_SESSION_PREFIX.getExpireTime());
+    }
+}

+ 2 - 0
webchat-client-chat/src/main/java/com/webchat/client/WebchatClientApplication.java

@@ -2,10 +2,12 @@ package com.webchat.client;
 
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.openfeign.EnableFeignClients;
 import org.springframework.context.annotation.ComponentScan;
 
 @SpringBootApplication
 @ComponentScan("com.webchat")
+@EnableFeignClients("com.webchat.rmi")
 public class WebchatClientApplication {
 
     public static void main(String[] args) {

+ 1 - 1
webchat-client-chat/src/main/java/com/webchat/client/FileController.java → webchat-client-chat/src/main/java/com/webchat/client/chat/controller/FileController.java

@@ -1,4 +1,4 @@
-package com.webchat.client;
+package com.webchat.client.chat.controller;
 
 import com.webchat.common.bean.APIResponseBean;
 import com.webchat.common.bean.APIResponseBeanUtil;

+ 28 - 0
webchat-client-chat/src/main/java/com/webchat/client/chat/controller/UserController.java

@@ -0,0 +1,28 @@
+package com.webchat.client.chat.controller;
+
+
+import com.webchat.client.chat.service.UserService;
+import com.webchat.common.bean.APIResponseBean;
+import com.webchat.common.bean.APIResponseBeanUtil;
+import com.webchat.common.helper.SessionHelper;
+import com.webchat.domain.vo.response.UserBaseResponseInfoVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/client-service/chat/user")
+public class UserController {
+
+
+    @Autowired
+    private UserService userService;
+
+    @GetMapping("/current/info")
+    public APIResponseBean<UserBaseResponseInfoVO> getCurrentUserInfo() {
+        String userId = SessionHelper.getCurrentUserId();
+        return APIResponseBeanUtil.success(userService.userInfo(userId));
+    }
+
+}

+ 113 - 0
webchat-client-chat/src/main/java/com/webchat/client/chat/filter/OauthFilter.java

@@ -0,0 +1,113 @@
+package com.webchat.client.chat.filter;
+
+import com.webchat.client.chat.service.UserSessionService;
+import com.webchat.common.config.properties.OauthProperties;
+import com.webchat.common.enums.BaseErrCodeEnum;
+import com.webchat.common.helper.SessionHelper;
+import com.webchat.common.util.JsonUtil;
+import com.webchat.rmi.sso.OauthServiceClient;
+import jakarta.servlet.Filter;
+import jakarta.servlet.FilterChain;
+import jakarta.servlet.FilterConfig;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
+import jakarta.servlet.annotation.WebFilter;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Component;
+
+import java.io.IOException;
+import java.net.URLEncoder;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @Author: 程序员七七
+ * @Date: 16.11.21 11:26 下午
+ */
+@Slf4j
+@Order(-6)
+@WebFilter(filterName = "oauthFilter", urlPatterns = {"/*"})
+@Component
+public class OauthFilter implements Filter {
+
+    @Autowired
+    private OauthProperties oauthProperties;
+
+    @Autowired
+    private OauthServiceClient oauthServiceClient;
+
+    @Autowired
+    private UserSessionService userSessionService;
+
+    @Override
+    public void init(FilterConfig filterConfig) throws ServletException {
+
+    }
+
+    @Override
+    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
+        HttpServletRequest request = (HttpServletRequest) servletRequest;
+        HttpServletResponse response = (HttpServletResponse) servletResponse;
+        // 取集中session服务判断是否已经登录,如果已经登录则直接进入后续方法。
+        String oauthCode = request.getHeader("oauth-code");
+        String userId = userSessionService.getUserIdByRequest(request);
+        if (StringUtils.isNotBlank(userId)) {
+            // 已经登录
+            SessionHelper.setUserId(userId);
+            try {
+                filterChain.doFilter(request, response);
+            } finally {
+                SessionHelper.clear();
+            }
+            return;
+        }
+        if (StringUtils.isNotBlank(oauthCode)) {
+            userId = oauthServiceClient.getUserIdByOauthCode(oauthCode).getData();
+            if (StringUtils.isNotBlank(userId)) {
+                userSessionService.createUserLoginSession(response, userId);
+                SessionHelper.setUserId(userId);
+                try {
+                    filterChain.doFilter(request, response);
+                } finally {
+                    SessionHelper.clear();
+                }
+                return;
+            }
+        }
+        /**
+         * 302 重定向到统一登录页面
+         */
+        this.unLogin(request, response);
+    }
+
+    private void unLogin(HttpServletRequest request, HttpServletResponse response) {
+        Map<String, Object> responseMap = new HashMap<>();
+        response.setCharacterEncoding("UTF-8"); // 设置字符编码为 UTF-8
+        response.setContentType("application/json;charset=UTF-8"); // 设置内容类型和字符编码
+        responseMap.put("code", BaseErrCodeEnum.UN_LOGIN.getCode());
+        responseMap.put("message", BaseErrCodeEnum.UN_LOGIN.getMessage());
+        responseMap.put("redirect_url", getRedirectUrl(request));
+        try {
+            response.getWriter().println(JsonUtil.toJsonString(responseMap));
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    private String getRedirectUrl(HttpServletRequest request) {
+        String serverUrl = oauthProperties.getServerUrl();
+        String originUrl = request.getHeader("origin-url");
+        return String.format(serverUrl, URLEncoder.encode(originUrl));
+    }
+
+    @Override
+    public void destroy() {
+
+    }
+}

+ 30 - 0
webchat-client-chat/src/main/java/com/webchat/client/chat/service/UserService.java

@@ -0,0 +1,30 @@
+package com.webchat.client.chat.service;
+
+import com.webchat.common.bean.APIResponseBean;
+import com.webchat.common.bean.APIResponseBeanUtil;
+import com.webchat.domain.vo.response.UserBaseResponseInfoVO;
+import com.webchat.rmi.user.UserServiceClient;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class UserService {
+
+    @Autowired
+    private UserServiceClient userServiceClient;
+
+    /**
+     * 获取用户信息
+     *
+     * @param userId
+     * @return
+     */
+    public UserBaseResponseInfoVO userInfo(String userId) {
+        APIResponseBean<UserBaseResponseInfoVO> responseBean = userServiceClient.userInfo(userId);
+        if (APIResponseBeanUtil.isOk(responseBean)) {
+            return responseBean.getData();
+        }
+        return null;
+    }
+
+}

+ 52 - 0
webchat-client-chat/src/main/java/com/webchat/client/chat/service/UserSessionService.java

@@ -0,0 +1,52 @@
+package com.webchat.client.chat.service;
+
+import com.webchat.common.constants.CookieConstants;
+import com.webchat.common.enums.RedisKeyEnum;
+import com.webchat.common.service.RedisService;
+import com.webchat.common.util.DateUtils;
+import com.webchat.common.util.MD5Utils;
+import jakarta.servlet.http.Cookie;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class UserSessionService {
+
+    @Autowired
+    private RedisService redisService;
+
+    public String getUserIdByRequest(HttpServletRequest request) {
+        Cookie[] cookies = request.getCookies();
+        if (cookies != null) {
+            for (Cookie cookie : cookies) {
+                if (CookieConstants.WEB_CHAT_USER_COOKIE_KEY.equals(cookie.getName())) {
+                    String sessionId = cookie.getValue();
+                    return this.getUserIdBySessionId(sessionId);
+                }
+            }
+        }
+        return null;
+    }
+
+    public void createUserLoginSession(HttpServletResponse response, String userId) {
+        String sessionId = MD5Utils.md5(userId + DateUtils.getCurrentFormatDate());
+        this.setUserIdBySessionId(sessionId, userId);
+        // 种浏览器Cookie
+        Cookie cookie = new Cookie(CookieConstants.WEB_CHAT_USER_COOKIE_KEY, sessionId);
+        cookie.setPath("/");
+        cookie.setMaxAge(CookieConstants.COOKIE_OUT_TIME);
+        response.addCookie(cookie);
+    }
+
+    public String getUserIdBySessionId(String sessionId) {
+        String sessionCacheKey = RedisKeyEnum.USER_SESSION_PREFIX.getKey(sessionId);
+        return redisService.get(sessionCacheKey);
+    }
+
+    public void setUserIdBySessionId(String sessionId, String userId) {
+        String sessionCacheKey = RedisKeyEnum.USER_SESSION_PREFIX.getKey(sessionId);
+        redisService.set(sessionCacheKey, userId, RedisKeyEnum.USER_SESSION_PREFIX.getExpireTime());
+    }
+}

+ 1 - 1
webchat-common/src/main/java/com/webchat/common/constants/CookieConstants.java

@@ -8,7 +8,7 @@ public class CookieConstants {
     /***
      * 用户登录Cookie
      */
-    public static final String C_U_USER_COOKIE_KEY = "C_U_NAV_USER_SESSION";
+    public static final String WEB_CHAT_USER_COOKIE_KEY = "WEB_CHAT_USER_SESSION";
 
     /***
      * cookie过期时间 秒为单位,5天

+ 2 - 2
webchat-common/src/main/java/com/webchat/common/helper/SessionHelper.java

@@ -45,7 +45,7 @@ public class SessionHelper {
      */
     public static void setUserId(String userId) {
         if (StringUtils.isNotBlank(userId)) {
-            setAttribute(CookieConstants.C_U_USER_COOKIE_KEY, userId);
+            setAttribute(CookieConstants.WEB_CHAT_USER_COOKIE_KEY, userId);
         }
     }
 
@@ -84,7 +84,7 @@ public class SessionHelper {
      * @return
      */
     public static String getCurrentUserId() {
-        Object userIdObj = getAttribute(CookieConstants.C_U_USER_COOKIE_KEY);
+        Object userIdObj = getAttribute(CookieConstants.WEB_CHAT_USER_COOKIE_KEY);
         return userIdObj == null ? null : userIdObj.toString();
     }
 

+ 2 - 1
webchat-common/src/main/java/com/webchat/common/service/RedisService.java

@@ -4,6 +4,7 @@ import com.alibaba.nacos.common.utils.MapUtil;
 import com.webchat.common.exception.BusinessException;
 import com.webchat.common.util.JsonUtil;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.ObjectUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.*;
@@ -136,7 +137,7 @@ public class RedisService {
                     SafeEncoder.encode("NX"),
                     SafeEncoder.encode("EX"),
                     Protocol.toByteArray(exptime));
-            return obj != null && "OK".equals(new String((byte[]) obj));
+            return ObjectUtils.equals("OK", obj);
         });
         return result;
     }

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
webchat-gateway/src/main/resources/application.yml


+ 56 - 0
webchat-remote/src/main/java/com/webchat/rmi/user/UserServiceClient.java

@@ -1,11 +1,21 @@
 package com.webchat.rmi.user;
 
+import com.webchat.common.bean.APIPageResponseBean;
 import com.webchat.common.bean.APIResponseBean;
+import com.webchat.common.bean.APIResponseBeanUtil;
+import com.webchat.common.helper.SessionHelper;
+import com.webchat.domain.vo.request.CreatePublicAccountRequestVO;
+import com.webchat.domain.vo.request.CreateRobotRequestVO;
+import com.webchat.domain.vo.request.UserRegistryInfoRequestVO;
 import com.webchat.domain.vo.response.UserBaseResponseInfoVO;
 import com.webchat.domain.vo.response.UserBaseResponseVO;
+import org.apache.el.parser.BooleanNode;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestParam;
 
 /**
  * @Author 程序员七七
@@ -33,4 +43,50 @@ public interface UserServiceClient {
      */
     @GetMapping("/user-service/user/mobile/info/{mobile}")
     APIResponseBean<UserBaseResponseVO> userBaseInfo(@PathVariable String mobile);
+
+    /**
+     * 新账号注册
+     *
+     * @param request
+     * @return
+     */
+    @PostMapping("/user-service/user/register")
+    APIResponseBean<Boolean> registry(@RequestBody UserRegistryInfoRequestVO request);
+
+    /**
+     * 账号列表查询
+     *
+     * @param roleCode
+     * @param userName
+     * @param mobile
+     * @param pageNo
+     * @param pageSize
+     * @return
+     */
+    @GetMapping("/user-service/account/page")
+    APIPageResponseBean<UserBaseResponseInfoVO> page(
+            @RequestParam(value = "userId", required = false) String userId,
+            @RequestParam(value = "roleCode") Integer roleCode,
+            @RequestParam(value = "userName", required = false) String userName,
+            @RequestParam(value = "mobile", required = false) String mobile,
+            @RequestParam(value = "pageNo", required = false, defaultValue = "1") Integer pageNo,
+            @RequestParam(value = "pageSize", required = false, defaultValue = "10") Integer pageSize);
+
+
+    /**
+     * 创建机器人
+     *
+     * @return
+     */
+    @PostMapping("/user-service/account/createRobot")
+    APIResponseBean createRobot(@RequestBody CreateRobotRequestVO requestPram);
+
+    /**
+     * 创建公众号
+     * 默认只有管理员可以创建公众号
+     *
+     * @return
+     */
+    @PostMapping("/user-service/account/createPublicAccount")
+    APIResponseBean createPublicAccount(@RequestBody CreatePublicAccountRequestVO requestPram);
 }

+ 44 - 0
webchat-sso/src/main/java/com/webchat/sso/controller/FileController.java

@@ -0,0 +1,44 @@
+package com.webchat.sso.controller;
+
+import com.webchat.common.bean.APIResponseBean;
+import com.webchat.common.bean.APIResponseBeanUtil;
+import com.webchat.common.service.MinioService;
+import com.webchat.common.util.DateUtils;
+import com.webchat.domain.vo.response.UploadResultVO;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.Assert;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.Date;
+
+@RestController
+@RequestMapping("/sso-service/file")
+public class FileController {
+
+    @Autowired
+    private MinioService minioService;
+    @Autowired
+    private HttpServletRequest request;
+
+    @PostMapping("/upload")
+    public APIResponseBean<UploadResultVO> upload(MultipartFile file) {
+        String path = request.getHeader("upload-path");
+        Assert.isTrue(StringUtils.isNotBlank(path), "上传路径不能为空");
+        String timePackage = DateUtils.getDate2String(DateUtils.YYYYMMDD, new Date());
+        UploadResultVO uploadResultDTO = minioService.upload(path + "/" + timePackage, file, true);
+        return APIResponseBeanUtil.success(uploadResultDTO);
+    }
+
+    @GetMapping("/download")
+    public void download(@RequestParam String filename, HttpServletResponse response) {
+        minioService.download(filename, response);
+    }
+}

+ 17 - 1
webchat-sso/src/main/java/com/webchat/sso/controller/SSOServiceController.java

@@ -3,9 +3,10 @@ package com.webchat.sso.controller;
 import com.webchat.common.bean.APIResponseBean;
 import com.webchat.common.bean.APIResponseBeanUtil;
 import com.webchat.domain.vo.request.UserLoginInfoRequestVO;
+import com.webchat.domain.vo.request.UserRegistryInfoRequestVO;
 import com.webchat.rmi.sso.OauthServiceClient;
 import com.webchat.sso.service.SSOCoreService;
-import lombok.Getter;
+import com.webchat.sso.service.ValidCodeService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
@@ -20,6 +21,8 @@ public class SSOServiceController implements OauthServiceClient {
 
     @Autowired
     private SSOCoreService ssoCoreService;
+    @Autowired
+    private ValidCodeService validCodeService;
 
     @PostMapping("/login")
     public APIResponseBean<String> login(@RequestBody UserLoginInfoRequestVO loginInfoRequest) {
@@ -27,6 +30,19 @@ public class SSOServiceController implements OauthServiceClient {
         return APIResponseBeanUtil.success(ssoCoreService.login(loginInfoRequest));
     }
 
+    /**
+     * 用户注册
+     * @param request
+     * @return
+     */
+    @PostMapping("/register")
+    public APIResponseBean register(@RequestBody UserRegistryInfoRequestVO request) {
+        // 数字验证码核验
+        validCodeService.validCode(request.getPicCheckCode());
+        boolean result = ssoCoreService.registry(request);
+        return APIResponseBeanUtil.success(result ? "注册成功" : "测试失败");
+    }
+
     @GetMapping("/userId/{oauthCode}")
     @Override
     public APIResponseBean<String> getUserIdByOauthCode(@PathVariable String oauthCode) {

+ 53 - 0
webchat-sso/src/main/java/com/webchat/sso/controller/ValidCodeController.java

@@ -0,0 +1,53 @@
+package com.webchat.sso.controller;
+
+import com.webchat.common.util.PicValidCodeUtil;
+import com.webchat.common.util.obj.PicValidCodeResult;
+import com.webchat.sso.service.ValidCodeService;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import javax.imageio.ImageIO;
+import java.awt.image.BufferedImage;
+
+/**
+ * 图形验证码
+ */
+@Slf4j
+@RestController
+@RequestMapping("/sso-service/oauth/valid")
+public class ValidCodeController {
+
+    @Autowired
+    private HttpServletResponse response;
+
+    @Autowired
+    private ValidCodeService validCodeService;
+
+    /***
+     * 获取图形验证码
+     */
+    @GetMapping("/code")
+    public void getValidCode() {
+        // 生成图形验证码
+        PicValidCodeResult picValidCodeResult = PicValidCodeUtil.generateCodeAndPic(true);
+        // 刷新验证码
+        validCodeService.refreshCode(picValidCodeResult.getCode());
+        // 返回客户端
+        printValidCodeImage(picValidCodeResult.getImage());
+    }
+
+    private void printValidCodeImage(BufferedImage img) {
+        response.setContentType("image/png");
+        response.setDateHeader("expries", -1);
+        response.setHeader("Cache-Control", "no-cache");
+        response.setHeader("Pragma", "no-cache");
+        try {
+            ImageIO.write(img, "png", response.getOutputStream());
+        } catch (Exception e) {
+            log.error("POSTER IMAGE CREATE ERROR.", e);
+        }
+    }
+}

+ 34 - 0
webchat-sso/src/main/java/com/webchat/sso/service/SSOCoreService.java

@@ -4,17 +4,26 @@ import com.webchat.common.bean.APIResponseBean;
 import com.webchat.common.bean.APIResponseBeanUtil;
 import com.webchat.common.constants.WebConstant;
 import com.webchat.common.enums.RedisKeyEnum;
+import com.webchat.common.enums.RoleCodeEnum;
+import com.webchat.common.enums.UserStatusEnum;
 import com.webchat.common.exception.AuthException;
+import com.webchat.common.exception.BusinessException;
 import com.webchat.common.service.RedisService;
 import com.webchat.common.util.IDGenerateUtil;
 import com.webchat.common.util.MD5Utils;
+import com.webchat.common.util.StringUtil;
+import com.webchat.common.util.TransactionSyncManagerUtil;
 import com.webchat.domain.vo.request.UserLoginInfoRequestVO;
+import com.webchat.domain.vo.request.UserRegistryInfoRequestVO;
 import com.webchat.domain.vo.response.UserBaseResponseVO;
 import com.webchat.rmi.user.UserServiceClient;
 import org.apache.commons.lang3.ObjectUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.regex.Pattern;
 
 @Service
 public class SSOCoreService {
@@ -48,6 +57,31 @@ public class SSOCoreService {
         return genLoginOauthCode(user.getUserId());
     }
 
+    /**
+     * 用户注册
+     *
+     * @param request
+     * @return
+     */
+    // 这里其实不需要事务,因为想分享事务管理器的用法和场景,刻意添加了事务注解
+    public boolean registry(UserRegistryInfoRequestVO request) {
+        APIResponseBean<Boolean> responseBean = userServiceClient.registry(request);
+        if (APIResponseBeanUtil.isOk(responseBean)) {
+            return responseBean.getData();
+        }
+        return false;
+    }
+
+    /**
+     * 判断用户是否存在
+     * @param mobile
+     * @return
+     */
+    private boolean hasUserInfo(String mobile) {
+        UserBaseResponseVO userBaseResponseVO = getUserBaseInfo(mobile);
+        return userBaseResponseVO != null;
+    }
+
     private UserBaseResponseVO getUserBaseInfo(String mobile) {
         APIResponseBean<UserBaseResponseVO> responseMessage = userServiceClient.userBaseInfo(mobile);
         if (APIResponseBeanUtil.isOk(responseMessage)) {

+ 41 - 0
webchat-sso/src/main/java/com/webchat/sso/service/SessionService.java

@@ -0,0 +1,41 @@
+package com.webchat.sso.service;
+
+import jakarta.servlet.http.HttpServletRequest;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * @Author: 程序员七七
+ * @Date: 6.11.18 2:21 上午
+ */
+@Service
+public class SessionService {
+
+    @Autowired
+    private HttpServletRequest request;
+
+    /***
+     * 创建SESSIOn
+     * @param key
+     * @param val
+     * @return
+     */
+    public boolean set(String key, String val) {
+        request.getSession().setAttribute(key, val);
+        return true;
+    }
+
+    /***
+     * 查询SESSION
+     * @param key
+     * @return
+     */
+    public String get(String key) {
+        Object valObj = request.getSession().getAttribute(key);
+        return valObj == null ? null : valObj.toString();
+    }
+
+    public void remove(String key) {
+        request.getSession().removeAttribute(key);
+    }
+}

+ 42 - 0
webchat-sso/src/main/java/com/webchat/sso/service/ValidCodeService.java

@@ -0,0 +1,42 @@
+package com.webchat.sso.service;
+
+import com.webchat.common.constants.WebConstant;
+import com.webchat.common.exception.AuthException;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * @Author: 程序员七七
+ * @Date: 6.11.18 2:21 上午
+ */
+@Service
+public class ValidCodeService {
+
+    @Autowired
+    private SessionService sessionService;
+
+    /***
+     * 刷新验证码
+     */
+    public void refreshCode(String code) {
+        // Session 保存下来
+        sessionService.set(WebConstant.PIC_VALID_CODE_SESSION_KEY, code);
+    }
+
+    /**
+     * 数字验证码核验
+     * @param code
+     */
+    public void validCode(String code) {
+        if(StringUtils.isBlank(code)) {
+            throw new AuthException("图形验证码校验失败");
+        }
+        // Session 保存下来
+        if (code.equals(sessionService.get(WebConstant.PIC_VALID_CODE_SESSION_KEY))) {
+            sessionService.remove(WebConstant.PIC_VALID_CODE_SESSION_KEY);
+            return;
+        }
+        throw new AuthException("图形验证码校验失败");
+    }
+}

+ 29 - 0
webchat-user/src/main/java/com/webchat/user/controller/UserServiceController.java

@@ -1,13 +1,18 @@
 package com.webchat.user.controller;
 
+import com.webchat.common.bean.APIPageResponseBean;
 import com.webchat.common.bean.APIResponseBean;
 import com.webchat.common.bean.APIResponseBeanUtil;
+import com.webchat.domain.vo.request.CreatePublicAccountRequestVO;
+import com.webchat.domain.vo.request.CreateRobotRequestVO;
+import com.webchat.domain.vo.request.UserRegistryInfoRequestVO;
 import com.webchat.domain.vo.response.UserBaseResponseInfoVO;
 import com.webchat.domain.vo.response.UserBaseResponseVO;
 import com.webchat.rmi.user.UserServiceClient;
 import com.webchat.user.service.UserService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RestController;
 
 /**
@@ -33,4 +38,28 @@ public class UserServiceController implements UserServiceClient {
 
         return APIResponseBeanUtil.success(userService.getUserBaseByMobile(mobile));
     }
+
+    @Override
+    public APIResponseBean<Boolean> registry(@RequestBody UserRegistryInfoRequestVO request) {
+        boolean registerResult = userService.registry(request.getPhoto(), request.getUserName(), request.getMobile(), request.getPassword());
+        return APIResponseBeanUtil.success(registerResult);
+    }
+
+    @Override
+    public APIPageResponseBean<UserBaseResponseInfoVO> page(String userId, Integer roleCode, String userName, String mobile, Integer pageNo, Integer pageSize) {
+
+        return userService.page(userId, roleCode, userName, mobile, pageNo, pageSize);
+    }
+
+    @Override
+    public APIResponseBean createRobot(@RequestBody CreateRobotRequestVO requestPram) {
+        userService.createRobot(requestPram);
+        return APIResponseBeanUtil.success("创建成功");
+    }
+
+    @Override
+    public APIResponseBean createPublicAccount(@RequestBody CreatePublicAccountRequestVO requestPram) {
+        userService.createPublicAccount(requestPram);
+        return APIResponseBeanUtil.success("创建成功");
+    }
 }

+ 41 - 3
webchat-user/src/main/java/com/webchat/user/service/UserService.java

@@ -25,6 +25,7 @@ import com.webchat.user.repository.dao.IGroupUserDAO;
 import com.webchat.user.repository.dao.IUserDAO;
 import com.webchat.user.repository.entity.GroupUserEntity;
 import com.webchat.user.repository.entity.UserEntity;
+import jakarta.persistence.criteria.Predicate;
 import jakarta.servlet.http.Cookie;
 import jakarta.servlet.http.HttpServletRequest;
 import jakarta.servlet.http.HttpServletResponse;
@@ -35,6 +36,7 @@ import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageRequest;
 import org.springframework.data.domain.Pageable;
 import org.springframework.data.domain.Sort;
+import org.springframework.data.jpa.domain.Specification;
 import org.springframework.data.redis.core.DefaultTypedTuple;
 import org.springframework.data.redis.core.ZSetOperations;
 import org.springframework.stereotype.Service;
@@ -86,6 +88,41 @@ public class UserService {
         return null;
     }
 
+    public APIPageResponseBean<UserBaseResponseInfoVO> page(String userId, Integer roleCode, String userName, String mobile,
+                                                            int pageNo, int pageSize) {
+
+        Pageable pageable = PageRequest.of(pageNo - 1, pageSize, Sort.by(Sort.Direction.DESC, "id"));
+        Specification<UserEntity> specification = createAccountQuerySpecification(userId, roleCode, userName, mobile);
+        Page<UserEntity> userEntityPage = userDAO.findAll(specification, pageable);
+        List<UserEntity> userEntities = userEntityPage.getContent();
+        List<UserBaseResponseInfoVO> userBaseVoList = new ArrayList<>();
+        if (CollectionUtils.isNotEmpty(userEntities)) {
+            userBaseVoList = userEntities.stream().map(UserService::convertBaseVo).collect(Collectors.toList());
+        }
+        return APIPageResponseBean.success(pageNo, pageSize, userEntityPage.getTotalElements(), userBaseVoList);
+    }
+
+    private Specification createAccountQuerySpecification(String userId, Integer roleCode, String userName, String mobile) {
+         return  ((root, criteriaQuery, criteriaBuilder) -> {
+            List<Predicate> predicates = new ArrayList<>();
+            if (roleCode != null) {
+                predicates.add(criteriaBuilder.equal(root.get("roleCode").as(Integer.class), roleCode));
+            }
+            if (StringUtils.isNotBlank(userId)) {
+                predicates.add(criteriaBuilder.equal(root.get("userId").as(String.class), userId));
+            }
+            if (StringUtils.isNotBlank(userName)) {
+                 predicates.add(criteriaBuilder.like(root.get("userName").as(String.class), "%" + userName + "%"));
+            }
+            if (StringUtils.isNotBlank(mobile)) {
+                predicates.add(criteriaBuilder.equal(root.get("mobile").as(String.class), mobile));
+            }
+            Predicate[] pre = new Predicate[predicates.size()];
+            criteriaQuery.where(predicates.toArray(pre));
+            return criteriaQuery.getRestriction();
+        });
+    }
+
 
     /**
      * 用户登录 - 登录成功返回用户基本信息
@@ -412,7 +449,7 @@ public class UserService {
         // 清理登录Session
         Cookie[] cookies = request.getCookies();
         for(Cookie cookie : cookies) {
-            if (CookieConstants.C_U_USER_COOKIE_KEY.equals(cookie.getName())) {
+            if (CookieConstants.WEB_CHAT_USER_COOKIE_KEY.equals(cookie.getName())) {
                 cookie.setValue(null);
                 cookie.setMaxAge(0);
                 cookie.setPath("/");
@@ -445,6 +482,7 @@ public class UserService {
         userEntity.setPassword(md5Pwd(password));
         userEntity.setRoleCode(RoleCodeEnum.USER.getCode());
         userEntity.setCreateBy(userId);
+        userEntity.setSignature("暂无签名~");
         // 注册用户
         return userDAO.save(userEntity).getUserId();
     }
@@ -712,7 +750,7 @@ public class UserService {
         String sessionKey = RedisKeyEnum.USER_SESSION_PREFIX.getKey(sessionId);
         redisService.set(sessionKey, userId, RedisKeyEnum.USER_SESSION_PREFIX.getExpireTime());
         // 种浏览器Cookie
-        Cookie cookie = new Cookie(CookieConstants.C_U_USER_COOKIE_KEY, sessionId);
+        Cookie cookie = new Cookie(CookieConstants.WEB_CHAT_USER_COOKIE_KEY, sessionId);
         cookie.setPath("/");
         cookie.setMaxAge(CookieConstants.COOKIE_OUT_TIME);
         response.addCookie(cookie);
@@ -789,7 +827,7 @@ public class UserService {
 
     public String getUserLoginCookie(String userId) {
         String sessionId = MD5Utils.md5(userId);
-        return CookieConstants.C_U_USER_COOKIE_KEY.concat("=").concat(sessionId);
+        return CookieConstants.WEB_CHAT_USER_COOKIE_KEY.concat("=").concat(sessionId);
     }
 
     public static UserBaseResponseInfoVO convertBaseVo(UserEntity entity) {

Kaikkia tiedostoja ei voida näyttää, sillä liian monta tiedostoa muuttui tässä diffissä