diff --git a/coolstore-partner-common/src/main/java/com/cool/store/constants/CommonConstants.java b/coolstore-partner-common/src/main/java/com/cool/store/constants/CommonConstants.java index c54ae5efa..763b31618 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/constants/CommonConstants.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/constants/CommonConstants.java @@ -201,5 +201,23 @@ public class CommonConstants { public static final String WX_SELF_AUTH_URL = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=code&scope=snsapi_base&state=1#wechat_redirect"; + /** + * 密码最大错误次数 + */ + public static final int MAX_ERROR_PASSWORD_COUNT = 5; + /** + * 用户密码 + */ + public static final String USER_AUTH_KEY = "user_auth_key"; + + /** + * accessToken有效期,单位秒 + */ + public static final int ACTION_TOKEN_EXPIRE = 24 * 60 * 60; + + /** + * refreshToken有效期,单位秒 + */ + public static final int REFRESH_TOKEN_EXPIRE = 30 * 24 * 60 * 60; } diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/notice/MatterTypeEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/notice/MatterTypeEnum.java index bcc9697d8..20dc79ba2 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/enums/notice/MatterTypeEnum.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/notice/MatterTypeEnum.java @@ -14,6 +14,7 @@ public enum MatterTypeEnum { SERVICE_PACKAGE(4,"服务包"), RESTOCK(5,"补货"), INVENTORY(6,"盘点"), + REALTIME(7, "即时消息"), ; MatterTypeEnum(Integer code, String message) { diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/notice/ModuleCodeEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/notice/ModuleCodeEnum.java index 3bfa89f8a..aefa1d85c 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/enums/notice/ModuleCodeEnum.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/notice/ModuleCodeEnum.java @@ -16,7 +16,7 @@ public enum ModuleCodeEnum { DISH(3,"菜品",Arrays.asList(MatterTypeEnum.NOTICE)), FRANCHISE(4,"加盟",Arrays.asList(MatterTypeEnum.NOTICE)), //其他(投诉与客户服务、临时通知) - OTHER(5,"其他",Arrays.asList(MatterTypeEnum.NOTICE)), + OTHER(5,"其他",Arrays.asList(MatterTypeEnum.NOTICE, MatterTypeEnum.REALTIME)), ; ModuleCodeEnum(Integer code, String message,List matterTypeEnums) { diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/notice/SceneEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/notice/SceneEnum.java index d5fc87540..abeb053f0 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/enums/notice/SceneEnum.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/notice/SceneEnum.java @@ -18,6 +18,7 @@ public enum SceneEnum { RESTOCK(35, "补货", "", MatterTypeEnum.LOGISTICS), INVENTORY(40, "盘点", "", MatterTypeEnum.LOGISTICS), + REALTIME(45, "即时消息", "", MatterTypeEnum.REALTIME), ; private Integer sceneCode; diff --git a/coolstore-partner-common/src/main/java/com/cool/store/executor/MdcTaskExecutor.java b/coolstore-partner-common/src/main/java/com/cool/store/executor/MdcTaskExecutor.java new file mode 100644 index 000000000..3e6083657 --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/executor/MdcTaskExecutor.java @@ -0,0 +1,96 @@ +package com.cool.store.executor; + + +import com.cool.store.constants.CommonConstants; +import com.cool.store.utils.UUIDUtils; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.slf4j.MDC; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.Callable; +import java.util.concurrent.Future; + + +/** + * @author zhangchenbiao + * @FileName: MdcTaskExecutor + * @Description: + * @date 2021-11-02 21:00 + */ +public class MdcTaskExecutor extends ThreadPoolTaskExecutor { + private Logger log = LoggerFactory.getLogger(MdcTaskExecutor.class); + + @Override + public Future submit(Callable task) { + Map context = MDC.getCopyOfContextMap(); + return super.submit(() -> { + T result; + if (context != null) { + //将父线程的MDC内容传给子线程 + MDC.setContextMap(context); + } + //直接给子线程设置MDC + setTraceIdIfAbsent(); + try { + //执行任务 + result = task.call(); + } finally { + log.info("ThreadMonitor:{}info:ExecutedTasks->{},totalTask->{}, RunningTasks->{}, PendingTasks->{},corePoolSize-{},currentPoolSize->{},LargestPoolSize->{}", + this.getThreadNamePrefix(),this.getThreadPoolExecutor().getCompletedTaskCount(),this.getThreadPoolExecutor().getTaskCount(), + this.getActiveCount(),this.getThreadPoolExecutor().getQueue().size(),this.getCorePoolSize(), + this.getPoolSize(),this.getThreadPoolExecutor().getLargestPoolSize()); + try { + MDC.clear(); + } catch (Exception e) { + log.warn("MDC clear exception", e); + } + } + return result; + }); + } + + @Override + public void execute(Runnable task) { + log.info("mdc thread pool task executor execute"); + Map context = MDC.getCopyOfContextMap(); + super.execute(() -> { + if (context != null) { + //将父线程的MDC内容传给子线程 + MDC.setContextMap(context); + } + //直接给子线程设置MDC + setTraceIdIfAbsent(); + try { + //执行任务 + task.run(); + } finally { + log.info("ThreadMonitor:{}info:ExecutedTasks->{},totalTask->{}, RunningTasks->{}, PendingTasks->{},corePoolSize-{},currentPoolSize->{},LargestPoolSize->{}", + this.getThreadNamePrefix(),this.getThreadPoolExecutor().getCompletedTaskCount(),this.getThreadPoolExecutor().getTaskCount(), + this.getActiveCount(),this.getThreadPoolExecutor().getQueue().size(),this.getCorePoolSize(), + this.getPoolSize(),this.getThreadPoolExecutor().getLargestPoolSize()); + try { + MDC.clear(); + } catch (Exception e) { + log.warn("MDC clear exception", e); + } + } + }); + } + + public static void setTraceIdIfAbsent() { + String key = CommonConstants.REQUEST_ID; + String value = UUIDUtils.get32UUID(); + String k = MDC.get(key); + if (StringUtils.isBlank(value)) { + value = UUID.randomUUID().toString().replace("-", ""); + } + + if (StringUtils.isBlank(k)) { + MDC.put(key, value); + } + } +} diff --git a/coolstore-partner-common/src/main/java/com/cool/store/executor/ThreadPoolTaskConfig.java b/coolstore-partner-common/src/main/java/com/cool/store/executor/ThreadPoolTaskConfig.java new file mode 100644 index 000000000..75bc5a1b2 --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/executor/ThreadPoolTaskConfig.java @@ -0,0 +1,45 @@ +package com.cool.store.executor; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.task.TaskExecutor; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.util.concurrent.ThreadPoolExecutor; + +/** + *

+ * 线程池配置类 + *

+ * + * @author wangff + * @since 2025/9/5 + */ +@Configuration +public class ThreadPoolTaskConfig { + + /** + * 通用线程池 + */ + @Bean + public TaskExecutor generalThreadPool() { + int cores = Runtime.getRuntime().availableProcessors(); + + ThreadPoolTaskExecutor executor = new MdcTaskExecutor(); + // 核心线程数目 + executor.setCorePoolSize(cores*2); + // 指定最大线程数 + executor.setMaxPoolSize(200); + // 队列中最大的数目 + executor.setQueueCapacity(5000); + // 线程名称前缀 + executor.setThreadNamePrefix("generalThreadPool_"); + // 对拒绝task的处理策略 + executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); + // 线程空闲后的最大存活时间 + executor.setKeepAliveSeconds(60); + // 加载 + executor.initialize(); + return executor; + } +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/notice/BatchPublishRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/notice/BatchPublishRequest.java index 2d824e021..832d5c5bd 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/request/notice/BatchPublishRequest.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/notice/BatchPublishRequest.java @@ -22,4 +22,6 @@ public class BatchPublishRequest { @ApiModelProperty( "默认处理人信息 type[person position userGroup organization]") List userInfoList; + @ApiModelProperty("事项类型") + private Integer matterType; } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/EnterpriseServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/EnterpriseServiceImpl.java index 0f07a2505..79b08e9d3 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/EnterpriseServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/EnterpriseServiceImpl.java @@ -1,6 +1,7 @@ package com.cool.store.service.impl; import com.alibaba.fastjson.JSON; +import com.cool.store.constants.CommonConstants; import com.cool.store.constants.RedisConstant; import com.cool.store.dao.EnterpriseUserDAO; import com.cool.store.entity.EnterpriseUserDO; @@ -109,7 +110,7 @@ public class EnterpriseServiceImpl implements EnterpriseService { currentUser.setAppType("qw_self_dkf"); currentUser.setUnionid(enterpriseUser.getUnionid()); currentUser.setUserType(enterpriseUser.getUserType()); - redisUtilPool.setString(RedisConstant.ACCESS_TOKEN_PREFIX + currentUser.getAccessToken(), JSON.toJSONString(currentUser), Constants.ACTION_TOKEN_EXPIRE); + redisUtilPool.setString(RedisConstant.ACCESS_TOKEN_PREFIX + currentUser.getAccessToken(), JSON.toJSONString(currentUser), CommonConstants.ACTION_TOKEN_EXPIRE); return currentUser; } @@ -121,7 +122,7 @@ public class EnterpriseServiceImpl implements EnterpriseService { } String refreshToken = getToken(); RefreshUser refreshUser = new RefreshUser(userId, refreshToken, mobile); - redisUtilPool.setString(RedisConstant.REFRESH_TOKEN_PREFIX + refreshToken, JSON.toJSONString(refreshUser), Constants.REFRESH_TOKEN_EXPIRE); + redisUtilPool.setString(RedisConstant.REFRESH_TOKEN_PREFIX + refreshToken, JSON.toJSONString(refreshUser), CommonConstants.REFRESH_TOKEN_EXPIRE); return refreshUser; } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/MessageIssueService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/MessageIssueService.java new file mode 100644 index 000000000..ba0231f7b --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/MessageIssueService.java @@ -0,0 +1,78 @@ +package com.cool.store.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollStreamUtil; +import cn.hutool.core.util.ArrayUtil; +import com.alibaba.fastjson.JSONObject; +import com.cool.store.dao.MessageTemplateDAO; +import com.cool.store.entity.MessageTemplateDO; +import com.cool.store.entity.StoreMessageDO; +import com.cool.store.enums.ErrorCodeEnum; +import com.cool.store.exception.ServiceException; +import com.cool.store.vo.notice.StoreMessageVO; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.messaging.MessagingException; +import org.springframework.messaging.simp.SimpMessagingTemplate; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; + +import java.util.*; + +/** + *

+ * 消息下发 服务类 + *

+ * + * @author wangff + * @since 2025/9/5 + */ +@Service +@RequiredArgsConstructor +@Slf4j +public class MessageIssueService { + private final MessageTemplateDAO messageTemplateDAO; + private final SimpMessagingTemplate simpMessagingTemplate; + + /** + * 下发即时通知消息 + * + * @param list 门店消息列表 + */ + @Async("generalThreadPool") + public void issueMessage(List list) { + if (CollectionUtils.isEmpty(list)) return; + log.info("下发即时通知, messageList:{}", JSONObject.toJSONString(list)); + try { + Set messageTemplateIds = CollStreamUtil.toSet(list, StoreMessageDO::getMessageTemplateId); + List messageTemplateList = messageTemplateDAO.getByIds(new ArrayList<>(messageTemplateIds)); + Map messageTemplateMap = CollStreamUtil.toMap(messageTemplateList, MessageTemplateDO::getId, v -> v); + + for (StoreMessageDO storeMessageDO : list) { + if (StringUtils.isNotBlank(storeMessageDO.getOperatorList())) { + String[] userIds = storeMessageDO.getOperatorList().split(","); + if (ArrayUtil.isNotEmpty(userIds)) { + MessageTemplateDO messageTemplateDO = messageTemplateMap.get(storeMessageDO.getMessageTemplateId()); + if (Objects.isNull(messageTemplateDO)) { + throw new ServiceException(ErrorCodeEnum.MESSAGE_NOT_EXIST); + } + StoreMessageVO storeMessageVO = BeanUtil.toBean(storeMessageDO, StoreMessageVO.class); + BeanUtil.copyProperties(messageTemplateDO, storeMessageVO); + String message = JSONObject.toJSONString(storeMessageVO); + for (String userId : userIds) { + try { + simpMessagingTemplate.convertAndSend("/queue/message/" + userId, message); + } catch (MessagingException e) { + log.info("即时通知下发异常, userId:{}, error:{}", userId, e.getMessage()); + } + } + } + } + } + } catch (Exception e) { + log.info("即时通知下发异常", e); + } + } +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/MessageTemplateServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/MessageTemplateServiceImpl.java index 4f5b1021f..2ef067c5c 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/MessageTemplateServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/MessageTemplateServiceImpl.java @@ -3,7 +3,6 @@ package com.cool.store.service.impl; import cn.hutool.core.collection.CollUtil; import com.alibaba.fastjson.JSONObject; import com.cool.store.context.LoginUserInfo; -import com.cool.store.context.PartnerUserHolder; import com.cool.store.dao.*; import com.cool.store.dto.notice.CommonDTO; import com.cool.store.dto.notice.MessageTemplateCountDTO; @@ -25,11 +24,9 @@ import com.cool.store.vo.PartnerUserInfoVO; import com.cool.store.vo.notice.*; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; -import com.google.gson.JsonObject; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; -import org.apache.ibatis.annotations.Param; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -65,6 +62,8 @@ public class MessageTemplateServiceImpl implements MessageTemplateService { EnterpriseUserDAO enterpriseUserDAO; @Resource MatterConfigDAO matterConfigDAO; + @Resource + MessageIssueService messageIssueService; @@ -153,6 +152,7 @@ public class MessageTemplateServiceImpl implements MessageTemplateService { log.info("未找到待发布消息模板"); } + List realtimeMessageList = new ArrayList<>(); list.stream().forEach(x -> { List result = new ArrayList<>(); storeAreaDTOS.forEach(y->{ @@ -174,6 +174,9 @@ public class MessageTemplateServiceImpl implements MessageTemplateService { result.add(storeMessageDO); }); storeMessageDAO.batchInsert(result); + if (MatterTypeEnum.REALTIME.getCode().equals(request.getMatterType())) { + realtimeMessageList.addAll(result); + } }); List updateIds = list.stream().map(MessageTemplateDO::getId).collect(Collectors.toList()); @@ -181,6 +184,8 @@ public class MessageTemplateServiceImpl implements MessageTemplateService { JSONObject.toJSONString(request.getStoreInfoList()), JSONObject.toJSONString(request.getUserInfoList()), userId); + // 即时消息下发 + messageIssueService.issueMessage(realtimeMessageList); return Boolean.TRUE; } @@ -271,6 +276,7 @@ public class MessageTemplateServiceImpl implements MessageTemplateService { batchPublishRequest.setIds(Arrays.asList(messageTemplateDO.getId())); batchPublishRequest.setStoreInfoList(JSONObject.parseArray(storeInfo, CommonDTO.class)); batchPublishRequest.setUserInfoList(JSONObject.parseArray(userInfo, CommonDTO.class)); + batchPublishRequest.setMatterType(matterConfig.getMatterType()); try { batchPublishMessageTemplate(batchPublishRequest,""); } catch (ServiceException e) { diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/login/LoginBaseService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/login/LoginBaseService.java index 1243c733c..c7de70b03 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/login/LoginBaseService.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/login/LoginBaseService.java @@ -2,6 +2,7 @@ package com.cool.store.service.login; import cn.hutool.core.bean.BeanUtil; import com.alibaba.fastjson.JSONObject; +import com.cool.store.constants.CommonConstants; import com.cool.store.constants.RedisConstant; import com.cool.store.context.CurrentUserHolder; import com.cool.store.context.LoginUserInfo; @@ -57,7 +58,7 @@ public abstract class LoginBaseService implements LoginStrategy { String errorCount = redisUtilPool.getString(errorPasswordCountKey); //判断密码错误次数 if (StringUtils.isNotBlank(errorCount)) { - if (Integer.parseInt(errorCount) >= Constants.MAX_ERROR_PASSWORD_COUNT) { + if (Integer.parseInt(errorCount) >= CommonConstants.MAX_ERROR_PASSWORD_COUNT) { return ResponseResult.fail(ErrorCodeEnum.PASSWORD_ERROR_MAX_COUNT, errorCount); } } @@ -100,6 +101,6 @@ public abstract class LoginBaseService implements LoginStrategy { CurrentUser currentUser = enterpriseService.getLoginInfo(userLoginDO.getMobile()); UserBaseInfoVO userBAseInfoVO = BeanUtil.toBean(currentUser, UserBaseInfoVO.class); RefreshUser refreshUser = enterpriseService.getRefreshUser(userLoginDO.getUserId(), userLoginDO.getMobile()); - return new UserLoginVO(currentUser.getAccessToken(), refreshUser.getRefreshToken(), Constants.ACTION_TOKEN_EXPIRE, userBAseInfoVO); + return new UserLoginVO(currentUser.getAccessToken(), refreshUser.getRefreshToken(), CommonConstants.ACTION_TOKEN_EXPIRE, userBAseInfoVO); } } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/login/impl/PasswordLoginServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/login/impl/PasswordLoginServiceImpl.java index 31aba4bbf..f863e543d 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/login/impl/PasswordLoginServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/login/impl/PasswordLoginServiceImpl.java @@ -1,6 +1,7 @@ package com.cool.store.service.login.impl; import com.aliyun.core.utils.StringUtils; +import com.cool.store.constants.CommonConstants; import com.cool.store.constants.RedisConstant; import com.cool.store.dto.login.UserLoginDTO; import com.cool.store.entity.login.UserLoginDO; @@ -39,7 +40,7 @@ public class PasswordLoginServiceImpl extends LoginBaseService { if (StringUtils.isBlank(userLoginDO.getPassword())) { return ResponseResult.fail(ErrorCodeEnum.IMPROVE_USER_INFO); } - String password = Md5Utils.md5(param.getPassword() + Constants.USER_AUTH_KEY); + String password = Md5Utils.md5(param.getPassword() + CommonConstants.USER_AUTH_KEY); if (!password.equals(userLoginDO.getPassword())) { String errorPasswordCountKey = MessageFormat.format(RedisConstant.ERROR_PASSWORD_COUNT_KEY, LocalDate.now(), param.getMobile()); Long errorNum = redisUtilPool.incrby(errorPasswordCountKey, 1); diff --git a/coolstore-partner-service/src/main/java/com/cool/store/utils/poi/constant/Constants.java b/coolstore-partner-service/src/main/java/com/cool/store/utils/poi/constant/Constants.java index 1edc16ef9..b08d231e6 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/utils/poi/constant/Constants.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/utils/poi/constant/Constants.java @@ -220,23 +220,4 @@ public class Constants public static final String WANG_LEI_JOB_NUMBER = "19060164"; - /** - * 密码最大错误次数 - */ - public static final int MAX_ERROR_PASSWORD_COUNT = 5; - - /** - * 用户密码 - */ - public static final String USER_AUTH_KEY = "user_auth_key"; - - /** - * accessToken有效期,单位秒 - */ - public static final int ACTION_TOKEN_EXPIRE = 24 * 60 * 60; - - /** - * refreshToken有效期,单位秒 - */ - public static final int REFRESH_TOKEN_EXPIRE = 30 * 24 * 60 * 60; } diff --git a/coolstore-partner-web/pom.xml b/coolstore-partner-web/pom.xml index 22e75fcb9..fe6d27e01 100644 --- a/coolstore-partner-web/pom.xml +++ b/coolstore-partner-web/pom.xml @@ -35,6 +35,65 @@ + + + dev + + dev + + + + dev2 + + dev2 + + + + local + + true + + + local + + + + test + + test + + + + test3 + + test3 + + + + ab + + ab + + + + online + + online + + + + hd + + hd + + + + zcb + + zcb + + + diff --git a/coolstore-partner-web/src/main/java/com/cool/store/config/SignValidateFilter.java b/coolstore-partner-web/src/main/java/com/cool/store/config/SignValidateFilter.java index d96af4e4a..3442d8cfe 100644 --- a/coolstore-partner-web/src/main/java/com/cool/store/config/SignValidateFilter.java +++ b/coolstore-partner-web/src/main/java/com/cool/store/config/SignValidateFilter.java @@ -59,7 +59,8 @@ public class SignValidateFilter implements Filter { "/zxjp/mini/program/v1/partnerManage/openArea/areaApplyQuery", "/zxjp/**/api/audit/result", "/zxjp/**/api/license", - "/zxjp/mini/line/getRegionPayPic" + "/zxjp/mini/line/getRegionPayPic", + "/zxjp/ws/**" ); diff --git a/coolstore-partner-web/src/main/java/com/cool/store/config/TokenValidateFilter.java b/coolstore-partner-web/src/main/java/com/cool/store/config/TokenValidateFilter.java index 801bc0028..93d16ade2 100644 --- a/coolstore-partner-web/src/main/java/com/cool/store/config/TokenValidateFilter.java +++ b/coolstore-partner-web/src/main/java/com/cool/store/config/TokenValidateFilter.java @@ -54,7 +54,8 @@ public class TokenValidateFilter implements Filter { "/zxjp/pc/video/**", "/zxjp/**/api/license", "/zxjp/pc/v3/login/accountLogin", - "/zxjp/pc/v3/login/refreshLogin" + "/zxjp/pc/v3/login/refreshLogin", + "/zxjp/ws/**" ); diff --git a/coolstore-partner-web/src/main/java/com/cool/store/config/websocket/WebSocketConfig.java b/coolstore-partner-web/src/main/java/com/cool/store/config/websocket/WebSocketConfig.java new file mode 100644 index 000000000..77e5f8e56 --- /dev/null +++ b/coolstore-partner-web/src/main/java/com/cool/store/config/websocket/WebSocketConfig.java @@ -0,0 +1,64 @@ +package com.cool.store.config.websocket; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Configuration; +import org.springframework.messaging.Message; +import org.springframework.messaging.MessageChannel; +import org.springframework.messaging.simp.config.ChannelRegistration; +import org.springframework.messaging.simp.config.MessageBrokerRegistry; +import org.springframework.messaging.simp.stomp.StompCommand; +import org.springframework.messaging.simp.stomp.StompHeaderAccessor; +import org.springframework.messaging.support.ChannelInterceptor; +import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker; +import org.springframework.web.socket.config.annotation.StompEndpointRegistry; +import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer; + +/** + *

+ * WebSocket配置类 + *

+ * + * @author wangff + * @since 2025/9/2 + */ +@Configuration +@EnableWebSocketMessageBroker +@Slf4j +public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { + + @Override + public void registerStompEndpoints(StompEndpointRegistry registry) { + registry.addEndpoint("/ws/zxzs") + .setAllowedOrigins("*") + .withSockJS(); // 启用SockJS支持 + } + + @Override + public void configureMessageBroker(MessageBrokerRegistry registry) { + // 配置消息代理 + registry.enableSimpleBroker("/topic", "/queue"); // 启用简单代理,用于广播和点对点消息 + registry.setApplicationDestinationPrefixes("/app"); // 设置应用程序端点前缀 +// registry.setUserDestinationPrefix("/user"); + } + +// @Override +// public void configureClientInboundChannel(ChannelRegistration registration) { +// registration.interceptors(new ChannelInterceptor() { +// @Override +// public Message preSend(Message message, MessageChannel channel) { +// StompHeaderAccessor accessor = StompHeaderAccessor.wrap(message); +// +// if (StompCommand.CONNECT.equals(accessor.getCommand())) { +// // 从STOMP头部获取login字段作为用户标识 +// String login = accessor.getLogin(); +// log.info("用户login:{}", login); +// if (login != null && !login.isEmpty()) { +// // 设置用户身份 +// accessor.setUser(() -> login); +// } +// } +// return message; +// } +// }); +// } +} diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/LoginController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/LoginController.java index 630e0ecce..9eb1b27c7 100644 --- a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/LoginController.java +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/LoginController.java @@ -6,6 +6,7 @@ import com.cool.store.response.ResponseResult; import com.cool.store.service.login.LoginBaseService; import com.cool.store.service.login.LoginStrategy; import com.cool.store.utils.SpringContextUtil; +import com.cool.store.vo.login.UserLoginVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; @@ -28,13 +29,13 @@ public class LoginController { @ApiOperation("账号密码登录") @PostMapping("/accountLogin") - public ResponseResult accountLogin(@RequestBody UserLoginDTO param) { + public ResponseResult accountLogin(@RequestBody UserLoginDTO param) { return SpringContextUtil.getBean(param.getLoginType().getClazzName(), LoginStrategy.class).login(param); } @ApiOperation("refresh登录") @PostMapping("/refreshLogin") - public ResponseResult refreshLogin(@RequestBody UserRefreshLoginDTO param) { + public ResponseResult refreshLogin(@RequestBody UserRefreshLoginDTO param) { return loginBaseService.refreshLogin(param); } diff --git a/pom.xml b/pom.xml index 545c8d7fa..b4d687d85 100644 --- a/pom.xml +++ b/pom.xml @@ -135,7 +135,7 @@ cn.hutool hutool-all - 5.0.7 + 5.7.22 com.aliyun