From 435b24be48df3072fb0576a2946fdd366a1ff851 Mon Sep 17 00:00:00 2001 From: wangff Date: Thu, 4 Sep 2025 14:19:08 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E6=96=B0=E5=A2=9E=E5=B9=B3=E5=8F=B0?= =?UTF-8?q?=E5=BA=93=E6=95=B0=E6=8D=AE=E6=BA=90=20feat:=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E8=B4=A6=E5=AF=86=E7=99=BB=E5=BD=95=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cool/store/annotation/PlatformDB.java | 14 ++++ .../datasource/DataSourceContextHolder.java | 25 +++++++ .../store/datasource/DynamicDataSource.java | 53 +++++++++++++++ .../com/cool/store/enums/ErrorCodeEnum.java | 5 ++ .../com/cool/store/enums/LoginTypeEnum.java | 25 +++++++ .../java/com/cool/store/utils/BeanUtil.java | 41 +++++++++++ .../cool/store/utils/SpringContextUtil.java | 34 ++++++++++ .../com/cool/store/dao/EnterpriseUserDAO.java | 11 ++- .../store/mapper/EnterpriseUserMapper.java | 10 +++ .../resources/mapper/EnterpriseUserMapper.xml | 6 ++ .../cool/store/dto/login/UserLoginDTO.java | 27 ++++++++ .../cool/store/entity/login/UserLoginDO.java | 33 +++++++++ .../com/cool/store/vo/login/UserLoginVO.java | 35 ++++++++++ .../cool/store/aspect/DataSourceAspect.java | 37 ++++++++++ .../store/service/login/LoginBaseService.java | 68 +++++++++++++++++++ .../store/service/login/LoginStrategy.java | 21 ++++++ .../login/impl/PasswordLoginServiceImpl.java | 54 +++++++++++++++ .../store/utils/poi/constant/Constants.java | 9 ++- .../com/cool/store/PartnerWebApplication.java | 12 ++++ .../cool/store/config/SignValidateFilter.java | 3 +- .../store/config/TokenValidateFilter.java | 3 +- .../controller/webb/LoginController.java | 31 +++++++++ .../resources/application-local.properties | 9 +++ 23 files changed, 562 insertions(+), 4 deletions(-) create mode 100644 coolstore-partner-common/src/main/java/com/cool/store/annotation/PlatformDB.java create mode 100644 coolstore-partner-common/src/main/java/com/cool/store/datasource/DataSourceContextHolder.java create mode 100644 coolstore-partner-common/src/main/java/com/cool/store/datasource/DynamicDataSource.java create mode 100644 coolstore-partner-common/src/main/java/com/cool/store/enums/LoginTypeEnum.java create mode 100644 coolstore-partner-common/src/main/java/com/cool/store/utils/BeanUtil.java create mode 100644 coolstore-partner-common/src/main/java/com/cool/store/utils/SpringContextUtil.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/dto/login/UserLoginDTO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/entity/login/UserLoginDO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/vo/login/UserLoginVO.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/aspect/DataSourceAspect.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/service/login/LoginBaseService.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/service/login/LoginStrategy.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/service/login/impl/PasswordLoginServiceImpl.java create mode 100644 coolstore-partner-web/src/main/java/com/cool/store/controller/webb/LoginController.java diff --git a/coolstore-partner-common/src/main/java/com/cool/store/annotation/PlatformDB.java b/coolstore-partner-common/src/main/java/com/cool/store/annotation/PlatformDB.java new file mode 100644 index 000000000..6b1b91fac --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/annotation/PlatformDB.java @@ -0,0 +1,14 @@ +package com.cool.store.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 平台库数据源 + */ +@Target({ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +public @interface PlatformDB { +} diff --git a/coolstore-partner-common/src/main/java/com/cool/store/datasource/DataSourceContextHolder.java b/coolstore-partner-common/src/main/java/com/cool/store/datasource/DataSourceContextHolder.java new file mode 100644 index 000000000..dd0b32ff0 --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/datasource/DataSourceContextHolder.java @@ -0,0 +1,25 @@ +package com.cool.store.datasource; + +/** + *

+ * 数据源上下文 + *

+ * + * @author wangff + * @since 2025/9/4 + */ +public class DataSourceContextHolder { + private static final ThreadLocal contextHolder = new ThreadLocal<>(); + + public static void setDataSourceType(String dataSourceType) { + contextHolder.set(dataSourceType); + } + + public static String getDataSourceType() { + return contextHolder.get(); + } + + public static void clearDataSourceType() { + contextHolder.remove(); + } +} diff --git a/coolstore-partner-common/src/main/java/com/cool/store/datasource/DynamicDataSource.java b/coolstore-partner-common/src/main/java/com/cool/store/datasource/DynamicDataSource.java new file mode 100644 index 000000000..66bf25663 --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/datasource/DynamicDataSource.java @@ -0,0 +1,53 @@ +package com.cool.store.datasource; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Primary; +import org.springframework.jdbc.datasource.AbstractDataSource; +import org.springframework.stereotype.Component; + +import javax.sql.DataSource; +import java.sql.Connection; +import java.sql.SQLException; + +/** + *

+ * 动态数据源 + *

+ * + * @author wangff + * @since 2025/9/4 + */ +@Component +@Primary +public class DynamicDataSource extends AbstractDataSource { + + @Autowired + private DataSource defaultDataSource; + + @Autowired + private DataSource platformDataSource; + + @Override + public Connection getConnection() throws SQLException { + DataSource currentDB = getCurrentDB(); + return currentDB.getConnection(); + } + + @Override + public Connection getConnection(String username, String password) throws SQLException { + DataSource currentDB = getCurrentDB(); + Connection connection = currentDB.getConnection(username, password); + connection.setCatalog(DataSourceContextHolder.getDataSourceType()); + return connection; + } + + protected DataSource getCurrentDB() { + String dbName = DataSourceContextHolder.getDataSourceType(); + if (StringUtils.isBlank(dbName)) { + return defaultDataSource; + } + return platformDataSource; + } + +} diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/ErrorCodeEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/ErrorCodeEnum.java index daa073f85..1e618d8e2 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/enums/ErrorCodeEnum.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/ErrorCodeEnum.java @@ -62,6 +62,11 @@ public enum ErrorCodeEnum { DATA_CONVERT_ERROR(400002, "日期转换异常!", null), PARENT_NODE_NOT_EXIST(400002, "父节点不存在", null), LOGIN_ERROR_MOBILE_ERROR(418, "登录失败 获取手机号失败!!", null), + PASSWORD_ERROR_MAX_COUNT(1021084, "密码错误{0}次,今日账号已锁定",null), + PASSWORD_MISSING(1021085, "密码不能为空!",null), + IMPROVE_USER_INFO(1021086,"请联系管理员,完善用户信息!",null), + PASSWORD_ERROR(1021087, "密码输入错误",null), + PASSWORD_ERROR_MULTI(1021088, "密码错误{0}次,请使用验证码登录",null), //红圈通 HQT_SHOP_DECORATION_ATTRIBUTES(1022000, "获取红圈通装修属性错误", null), HQT_PARAMS_ERROR(1022001, "构建红圈通请求参数错误", null), diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/LoginTypeEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/LoginTypeEnum.java new file mode 100644 index 000000000..f7b95f109 --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/LoginTypeEnum.java @@ -0,0 +1,25 @@ +package com.cool.store.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + *

+ * 登录类型 枚举类 + *

+ * + * @author wangff + * @since 2025/9/4 + */ +@Getter +@AllArgsConstructor +public enum LoginTypeEnum { + + PASSWORD("账号密码", "passwordLoginServiceImpl"), + + ; + + private final String message; + + private final String clazzName; +} diff --git a/coolstore-partner-common/src/main/java/com/cool/store/utils/BeanUtil.java b/coolstore-partner-common/src/main/java/com/cool/store/utils/BeanUtil.java new file mode 100644 index 000000000..7838c1fd5 --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/utils/BeanUtil.java @@ -0,0 +1,41 @@ +package com.cool.store.utils; + +import com.github.pagehelper.PageInfo; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + *

+ * bean转换工具 + *

+ * + * @author wangff + * @since 2025/3/6 + */ +public class BeanUtil extends cn.hutool.core.bean.BeanUtil { + + public static List toList(List list, Class clazz) { + if (list == null || list.isEmpty()) { + return Collections.emptyList(); + } + List result = new ArrayList<>(list.size()); + for (T t : list) { + R r = toBean(t, clazz); + result.add(r); + } + return result; + } + + public static PageInfo toPage(PageInfo page, Class clazz) { + PageInfo newPage = new PageInfo<>(); + newPage.setPages(page.getPages()); + newPage.setTotal(page.getTotal()); + newPage.setPageNum(page.getPageNum()); + newPage.setPageSize(page.getPageSize()); + List list = toList(page.getList(), clazz); + newPage.setList(list); + return newPage; + } +} diff --git a/coolstore-partner-common/src/main/java/com/cool/store/utils/SpringContextUtil.java b/coolstore-partner-common/src/main/java/com/cool/store/utils/SpringContextUtil.java new file mode 100644 index 000000000..183f34d94 --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/utils/SpringContextUtil.java @@ -0,0 +1,34 @@ +package com.cool.store.utils; + +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.stereotype.Component; + +/** + *

+ * Spring上下文工具 + *

+ * + * @author wangff + * @since 2025/9/4 + */ +@Component +public class SpringContextUtil implements ApplicationContextAware { + private static ApplicationContext applicationContext; + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + SpringContextUtil.applicationContext = applicationContext; + } + + /** + * 获取bean + * @param name beanName + * @param clazz bean类型 + * @return bean + */ + public static T getBean(String name, Class clazz) { + return applicationContext.getBean(name, clazz); + } +} diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/EnterpriseUserDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/EnterpriseUserDAO.java index 08d2edf1a..8c2dc3e41 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/dao/EnterpriseUserDAO.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/EnterpriseUserDAO.java @@ -4,8 +4,8 @@ import com.cool.store.constants.CommonConstants; import com.cool.store.dto.UserDTO; import com.cool.store.dto.openPreparation.UserNameDTO; import com.cool.store.entity.EnterpriseUserDO; +import com.cool.store.entity.login.UserLoginDO; import com.cool.store.mapper.EnterpriseUserMapper; -import com.cool.store.response.oppty.UserResponse; import com.cool.store.utils.StringUtil; import com.google.common.collect.Lists; import org.apache.commons.collections4.CollectionUtils; @@ -175,4 +175,13 @@ public class EnterpriseUserDAO { } return enterpriseUserMapper.searchUserByUserIdsAndKeyword(userIdList, keyword); } + + /** + * 从平台库根据唯一id获取用户登录信息 + * @param unionid 唯一id + * @return 用户登录信息 + */ + public UserLoginDO getUserLoginByUnionid(String unionid) { + return enterpriseUserMapper.getUserLoginByUnionid(unionid); + } } \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/EnterpriseUserMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/EnterpriseUserMapper.java index 9a867adcb..ff36560ee 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/EnterpriseUserMapper.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/EnterpriseUserMapper.java @@ -1,8 +1,10 @@ package com.cool.store.mapper; +import com.cool.store.annotation.PlatformDB; import com.cool.store.dto.UserDTO; import com.cool.store.dto.openPreparation.UserNameDTO; import com.cool.store.entity.EnterpriseUserDO; +import com.cool.store.entity.login.UserLoginDO; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -103,4 +105,12 @@ public interface EnterpriseUserMapper { List searchUserByUserIdsAndKeyword( @Param("userIdList") List userIdList, @Param("keyword") String keyword); List getUserIdsByRegionIdList( @Param("regionIdList") List regionIdList); + + /** + * 从平台库根据唯一id获取用户登录信息 + * @param unionid 唯一id + * @return 用户登录信息 + */ + @PlatformDB + UserLoginDO getUserLoginByUnionid(@Param("unionid") String unionid); } \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/resources/mapper/EnterpriseUserMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/EnterpriseUserMapper.xml index cacda592c..d57936709 100644 --- a/coolstore-partner-dao/src/main/resources/mapper/EnterpriseUserMapper.xml +++ b/coolstore-partner-dao/src/main/resources/mapper/EnterpriseUserMapper.xml @@ -229,4 +229,10 @@ + + \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/login/UserLoginDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/login/UserLoginDTO.java new file mode 100644 index 000000000..e309d2826 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/login/UserLoginDTO.java @@ -0,0 +1,27 @@ +package com.cool.store.dto.login; + +import com.cool.store.enums.LoginTypeEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + *

+ * 登录DTO + *

+ * + * @author wangff + * @since 2025/9/3 + */ +@Data +public class UserLoginDTO { + @ApiModelProperty("手机号") + private String mobile; + + @ApiModelProperty("密码") + private String password; + + @NotNull(message = "登录类型不能为空") + private LoginTypeEnum loginType; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/login/UserLoginDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/login/UserLoginDO.java new file mode 100644 index 000000000..c8965d44b --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/login/UserLoginDO.java @@ -0,0 +1,33 @@ +package com.cool.store.entity.login; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + *

+ * 用户登录信息 + *

+ * + * @author wangff + * @since 2025/9/3 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class UserLoginDO { + /** + * 用户id + */ + private String userId; + + /** + * 手机号 + */ + private String mobile; + + /** + * 密码 + */ + private String password; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/login/UserLoginVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/login/UserLoginVO.java new file mode 100644 index 000000000..2b068a6e1 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/login/UserLoginVO.java @@ -0,0 +1,35 @@ +package com.cool.store.vo.login; + +import com.cool.store.vo.point.UserBaseInfoVO; +import lombok.Data; + +/** + *

+ * 用户登录VO + *

+ * + * @author wangff + * @since 2025/9/4 + */ +@Data +public class UserLoginVO { + /** + * 登录token + */ + private String accessToken; + + /** + * 刷新token + */ + private String refreshToken; + + /** + * 是否需要完善用户信息 + */ + private Boolean isNeedImproveUserInfo; + + /** + * 用户信息 + */ + private UserBaseInfoVO userInfo; +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/aspect/DataSourceAspect.java b/coolstore-partner-service/src/main/java/com/cool/store/aspect/DataSourceAspect.java new file mode 100644 index 000000000..87e0f0a85 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/aspect/DataSourceAspect.java @@ -0,0 +1,37 @@ +package com.cool.store.aspect; + +import com.cool.store.annotation.PlatformDB; +import com.cool.store.datasource.DataSourceContextHolder; +import org.aspectj.lang.annotation.After; +import org.aspectj.lang.annotation.AfterThrowing; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.springframework.stereotype.Component; + +/** + *

+ * 数据源切换 切面 + *

+ * + * @author wangff + * @since 2025/9/4 + */ +@Aspect +@Component +public class DataSourceAspect { + + @Before("@annotation(platformDB)") + public void before(PlatformDB platformDB) { + DataSourceContextHolder.setDataSourceType("platform"); + } + + @After("@annotation(platformDB)") + public void after(PlatformDB platformDB) { + DataSourceContextHolder.clearDataSourceType(); + } + + @AfterThrowing("@annotation(platformDB)") + public void afterThrowing(PlatformDB platformDB) { + DataSourceContextHolder.clearDataSourceType(); + } +} 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 new file mode 100644 index 000000000..adc7698d9 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/login/LoginBaseService.java @@ -0,0 +1,68 @@ +package com.cool.store.service.login; + +import com.alibaba.fastjson.JSONObject; +import com.cool.store.constants.RedisConstant; +import com.cool.store.dao.EnterpriseUserDAO; +import com.cool.store.dto.login.UserLoginDTO; +import com.cool.store.entity.EnterpriseUserDO; +import com.cool.store.entity.login.UserLoginDO; +import com.cool.store.enums.ErrorCodeEnum; +import com.cool.store.response.ResponseResult; +import com.cool.store.service.EnterpriseService; +import com.cool.store.utils.RedisUtilPool; +import com.cool.store.utils.poi.constant.Constants; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.time.LocalDate; + +/** + *

+ * 登录基础服务类 + *

+ * + * @author wangff + * @since 2025/9/3 + */ +@Slf4j +public abstract class LoginBaseService implements LoginStrategy { + @Resource + private RedisUtilPool redisUtilPool; + @Resource + private EnterpriseUserDAO enterpriseUserDAO; + @Resource + private EnterpriseService enterpriseService; + + /** + * 策略登录实现方法 + */ + public abstract ResponseResult userLogin(UserLoginDTO param, UserLoginDO userLoginDO); + + @Override + public ResponseResult login(UserLoginDTO param) { + log.info("login:{}", JSONObject.toJSONString(param)); + String errorPasswordCountKey = MessageFormat.format(RedisConstant.ERROR_PASSWORD_COUNT_KEY, LocalDate.now(), param.getMobile()); + String errorCount = redisUtilPool.getString(errorPasswordCountKey); + //判断密码错误次数 + if (StringUtils.isNotBlank(errorCount)) { + if (Integer.parseInt(errorCount) >= Constants.MAX_ERROR_PASSWORD_COUNT) { + return ResponseResult.fail(ErrorCodeEnum.PASSWORD_ERROR_MAX_COUNT, errorCount); + } + } + EnterpriseUserDO enterpriseUserDO = enterpriseUserDAO.selectByMobile(param.getMobile()); + UserLoginDO userLoginDO = enterpriseUserDAO.getUserLoginByUnionid(enterpriseUserDO.getUnionid()); + return userLogin(param, userLoginDO); + } + + /** + * 获取登录accessToken + * + * @param userLoginDO 用户登录信息 + * @return accessToken + */ + public String getAccessToken(UserLoginDO userLoginDO) { + return enterpriseService.getAccessToken(userLoginDO.getMobile()); + } +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/login/LoginStrategy.java b/coolstore-partner-service/src/main/java/com/cool/store/service/login/LoginStrategy.java new file mode 100644 index 000000000..32e475fd7 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/login/LoginStrategy.java @@ -0,0 +1,21 @@ +package com.cool.store.service.login; + +import com.cool.store.dto.login.UserLoginDTO; +import com.cool.store.response.ResponseResult; + +/** + *

+ * 登录策略 + *

+ * + * @author wangff + * @since 2025/9/3 + */ +public interface LoginStrategy { + /** + * 登录基础方法 + * @param param + * @return + */ + ResponseResult login(UserLoginDTO param); +} 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 new file mode 100644 index 000000000..fa7ee68d8 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/login/impl/PasswordLoginServiceImpl.java @@ -0,0 +1,54 @@ +package com.cool.store.service.login.impl; + +import com.aliyun.core.utils.StringUtils; +import com.cool.store.constants.RedisConstant; +import com.cool.store.dto.login.UserLoginDTO; +import com.cool.store.entity.login.UserLoginDO; +import com.cool.store.enums.ErrorCodeEnum; +import com.cool.store.response.ResponseResult; +import com.cool.store.service.login.LoginBaseService; +import com.cool.store.utils.Md5Utils; +import com.cool.store.utils.RedisUtilPool; +import com.cool.store.utils.poi.constant.Constants; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.text.MessageFormat; +import java.time.LocalDate; + +/** + *

+ * 密码登录服务实现类 + *

+ * + * @author wangff + * @since 2025/9/4 + */ +@Service +@Slf4j +@RequiredArgsConstructor +public class PasswordLoginServiceImpl extends LoginBaseService { + private final RedisUtilPool redisUtilPool; + + @Override + public ResponseResult userLogin(UserLoginDTO param, UserLoginDO userLoginDO) { + if (StringUtils.isBlank(param.getPassword())) { + return ResponseResult.fail(ErrorCodeEnum.PASSWORD_MISSING); + } + if (StringUtils.isBlank(userLoginDO.getPassword())) { + return ResponseResult.fail(ErrorCodeEnum.IMPROVE_USER_INFO); + } + String password = Md5Utils.md5(param.getPassword() + Constants.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); + redisUtilPool.expire(errorPasswordCountKey, 24 * 60 * 60); + if(errorNum == 1){ + return ResponseResult.fail(ErrorCodeEnum.PASSWORD_ERROR); + } + return ResponseResult.fail(ErrorCodeEnum.PASSWORD_ERROR_MULTI, errorNum.toString()); + } + return ResponseResult.success(getAccessToken(userLoginDO)); + } +} 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 f4262d9e7..951651be2 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,6 +220,13 @@ 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"; } diff --git a/coolstore-partner-web/src/main/java/com/cool/store/PartnerWebApplication.java b/coolstore-partner-web/src/main/java/com/cool/store/PartnerWebApplication.java index 9f1f66664..05d745b0d 100644 --- a/coolstore-partner-web/src/main/java/com/cool/store/PartnerWebApplication.java +++ b/coolstore-partner-web/src/main/java/com/cool/store/PartnerWebApplication.java @@ -40,4 +40,16 @@ public class PartnerWebApplication { return defaultDataSourceProperties().initializeDataSourceBuilder().type(HikariDataSource.class).build(); } + @Bean + @ConfigurationProperties("platform.datasource") + public DataSourceProperties platformDataSourceProperties() { + return new DataSourceProperties(); + } + + @Bean + @ConfigurationProperties("spring.datasource.hikari") + public DataSource platformDataSource() { + return platformDataSourceProperties().initializeDataSourceBuilder().type(HikariDataSource.class).build(); + } + } 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..0f8fda754 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/v3/login/accountLogin" ); 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 2115f4f26..4e0abfa8f 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 @@ -52,7 +52,8 @@ public class TokenValidateFilter implements Filter { "/zxjp/pc/sysRole/**", "/zxjp/**/api/audit/result", "/zxjp/pc/video/**", - "/zxjp/**/api/license" + "/zxjp/**/api/license", + "/zxjp/v3/login/accountLogin" ); 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 new file mode 100644 index 000000000..5a1fd1f7f --- /dev/null +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/LoginController.java @@ -0,0 +1,31 @@ +package com.cool.store.controller.webb; + +import com.cool.store.dto.login.UserLoginDTO; +import com.cool.store.response.ResponseResult; +import com.cool.store.service.login.LoginStrategy; +import com.cool.store.utils.SpringContextUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 登录 前端控制器 + *

+ * + * @author wangff + * @since 2025/9/4 + */ +@Api(tags = "登录") +@RestController +@RequestMapping("/v3/login") +@RequiredArgsConstructor +public class LoginController { + + @ApiOperation("账号密码登录") + @PostMapping("/accountLogin") + public ResponseResult accountLogin(@RequestBody UserLoginDTO param) { + return SpringContextUtil.getBean(param.getLoginType().getClazzName(), LoginStrategy.class).login(param); + } +} diff --git a/coolstore-partner-web/src/main/resources/application-local.properties b/coolstore-partner-web/src/main/resources/application-local.properties index 12948da5d..5f2552622 100644 --- a/coolstore-partner-web/src/main/resources/application-local.properties +++ b/coolstore-partner-web/src/main/resources/application-local.properties @@ -4,6 +4,10 @@ default.datasource.url=jdbc:mysql://dingpushcoolcollege.mysql.rds.aliyuncs.com:3 default.datasource.username=coolstore default.datasource.password=CSCErYcXniNYm7bT +platform.datasource.url=jdbc:mysql://dingpushcoolcollege.mysql.rds.aliyuncs.com:3306/coolcollege_intelligent_config?useSSL=false&useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&autoReconnect=true +platform.datasource.username=coolstore +platform.datasource.password=CSCErYcXniNYm7bT + #redis redis.host.uri=http://userInfo:Cx111111@tstore-coolcollege-open.redis.rds.aliyuncs.com:6379/0 @@ -133,3 +137,8 @@ special.user.id=wpayJeDAAAhGIFgUJpJN-zg39JuNbYhg_woayJeDAAA0TC8mkCJeXouw94hYA-D3 ask.bot.url=https://test.auth.wx.askbot.cn +hqt.token.url=https://tc.cloud.hecom.cn +hqt.token.username=18161486722 +hqt.token.grant_type=client_credentials +hqt.token.client.id=WrPffdGpcWkcPsbN +hqt.token.client.secret=rYe9Cwug5LwQNIBJAiW0a7weF9CAhYCD \ No newline at end of file