diff --git a/im-platform/src/main/java/com/bx/implatform/dto/LoginDTO.java b/im-platform/src/main/java/com/bx/implatform/dto/LoginDTO.java index 30b240e..d0a231e 100644 --- a/im-platform/src/main/java/com/bx/implatform/dto/LoginDTO.java +++ b/im-platform/src/main/java/com/bx/implatform/dto/LoginDTO.java @@ -17,11 +17,11 @@ public class LoginDTO { @Schema(description = "登录终端 0:web 1:app 2:pc") private Integer terminal; - @NotEmpty(message = "用户名不可为空") +// @NotEmpty(message = "用户名不可为空") @Schema(description = "用户名") private String userName; - @NotEmpty(message = "用户密码不可为空") +// @NotEmpty(message = "用户密码不可为空") @Schema(description = "用户密码") private String password; diff --git a/im-platform/src/main/java/com/bx/implatform/service/impl/UserServiceImpl.java b/im-platform/src/main/java/com/bx/implatform/service/impl/UserServiceImpl.java index 1172c10..d1d5466 100644 --- a/im-platform/src/main/java/com/bx/implatform/service/impl/UserServiceImpl.java +++ b/im-platform/src/main/java/com/bx/implatform/service/impl/UserServiceImpl.java @@ -50,38 +50,107 @@ public class UserServiceImpl extends ServiceImpl implements Us private final IMClient imClient; private final SensitiveFilterUtil sensitiveFilterUtil; +// @Override +// public LoginVO login(LoginDTO dto) { +// User user = this.findUserByUserName(dto.getUserName()); +// if (Objects.isNull(user)) { +// throw new GlobalException("用户不存在"); +// } +// if(user.getIsCustomer() == 2){ +// throw new GlobalException("用户不存在"); +// } +// if (user.getIsBanned()) { +// String tip = String.format("您的账号因'%s'已被管理员封禁,请联系客服!",user.getReason()); +// throw new GlobalException(tip); +// } +// if (!passwordEncoder.matches(dto.getPassword(), user.getPassword())) { +// throw new GlobalException(ResultCode.PASSWOR_ERROR); +// } +// // 生成token +// UserSession session = BeanUtils.copyProperties(user, UserSession.class); +// session.setUserId(user.getId()); +// session.setTerminal(dto.getTerminal()); +// String strJson = JSON.toJSONString(session); +// String accessToken = JwtUtil.sign(user.getId(), strJson, jwtProperties.getAccessTokenExpireIn(), +// jwtProperties.getAccessTokenSecret()); +// String refreshToken = JwtUtil.sign(user.getId(), strJson, jwtProperties.getRefreshTokenExpireIn(), +// jwtProperties.getRefreshTokenSecret()); +// LoginVO vo = new LoginVO(); +// vo.setAccessToken(accessToken); +// vo.setAccessTokenExpiresIn(jwtProperties.getAccessTokenExpireIn()); +// vo.setRefreshToken(refreshToken); +// vo.setRefreshTokenExpiresIn(jwtProperties.getRefreshTokenExpireIn()); +// return vo; +// } + @Override public LoginVO login(LoginDTO dto) { - User user = this.findUserByUserName(dto.getUserName()); - if (Objects.isNull(user)) { - throw new GlobalException("用户不存在"); - } - if(user.getIsCustomer() == 2){ - throw new GlobalException("用户不存在"); - } - if (user.getIsBanned()) { - String tip = String.format("您的账号因'%s'已被管理员封禁,请联系客服!",user.getReason()); - throw new GlobalException(tip); - } - if (!passwordEncoder.matches(dto.getPassword(), user.getPassword())) { - throw new GlobalException(ResultCode.PASSWOR_ERROR); - } - // 生成token - UserSession session = BeanUtils.copyProperties(user, UserSession.class); - session.setUserId(user.getId()); - session.setTerminal(dto.getTerminal()); - String strJson = JSON.toJSONString(session); - String accessToken = JwtUtil.sign(user.getId(), strJson, jwtProperties.getAccessTokenExpireIn(), - jwtProperties.getAccessTokenSecret()); - String refreshToken = JwtUtil.sign(user.getId(), strJson, jwtProperties.getRefreshTokenExpireIn(), - jwtProperties.getRefreshTokenSecret()); + // 生成游客唯一标识UUID + String guestUuid = UUID.randomUUID().toString(); + + // 生成游客用户名,例如 guest_随机6位数字 + String guestUserName = "guest_" + UUID.randomUUID().toString().substring(0, 6); + + // 创建游客用户记录 + User guestUser = new User(); + guestUser.setUserName(guestUserName); + guestUser.setNickName(guestUserName); // 默认昵称为“游客” + guestUser.setPassword(""); // 游客无需密码,可为空 + guestUser.setUuid(guestUuid); // 保存唯一标识 +// guestUser.setCreateTime(LocalDateTime.now()); + // 保存到数据库 + this.save(guestUser); + Long customerServiceId = this.getRandomCustomerServiceId(); + + + // 创建会话信息 + UserSession guestSession = new UserSession(); + guestSession.setUserId(guestUser.getId()); + guestSession.setUserName(guestUser.getUserName()); + guestSession.setTerminal(dto.getTerminal()); +// guestSession.setUuid(guestUuid); + + // 生成Token + String guestJson = JSON.toJSONString(guestSession); + String accessToken = JwtUtil.sign( + guestSession.getUserId(), + guestJson, + jwtProperties.getAccessTokenExpireIn(), + jwtProperties.getAccessTokenSecret() + ); + String refreshToken = JwtUtil.sign( + guestSession.getUserId(), + guestJson, + jwtProperties.getRefreshTokenExpireIn(), + jwtProperties.getRefreshTokenSecret() + ); + + // 返回LoginVO LoginVO vo = new LoginVO(); vo.setAccessToken(accessToken); vo.setAccessTokenExpiresIn(jwtProperties.getAccessTokenExpireIn()); vo.setRefreshToken(refreshToken); vo.setRefreshTokenExpiresIn(jwtProperties.getRefreshTokenExpireIn()); + vo.setCustomerServiceId(customerServiceId == null ? -1 : customerServiceId); + // 设置当前登录的游客用户信息 + vo.setUser(guestUser); + + log.info("游客登录成功,userId:{}, uuid:{}", guestUser.getId(), guestUuid); return vo; } + public Long getRandomCustomerServiceId() { + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); + // 条件:is_customer = 2 表示客服 + queryWrapper.eq(User::getIsCustomer, 2); + // 只查id字段,提升效率 + queryWrapper.select(User::getId); + // 随机排序(mysql用rand()) + queryWrapper.last("ORDER BY RAND() LIMIT 1"); + + User customerService = this.getOne(queryWrapper, false); // false=无结果不抛异常 + + return customerService == null ? null : customerService.getId(); + } @Override public LoginVO loginCustom(LoginDTO dto) { diff --git a/im-platform/src/main/java/com/bx/implatform/vo/LoginVO.java b/im-platform/src/main/java/com/bx/implatform/vo/LoginVO.java index ba9f9a2..b662700 100644 --- a/im-platform/src/main/java/com/bx/implatform/vo/LoginVO.java +++ b/im-platform/src/main/java/com/bx/implatform/vo/LoginVO.java @@ -1,5 +1,6 @@ package com.bx.implatform.vo; +import com.bx.implatform.entity.User; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @@ -19,4 +20,10 @@ public class LoginVO { @Schema(description = "refreshToken过期时间(秒)") private Integer refreshTokenExpiresIn; + @Schema(description = "分配的客服ID") + private Long customerServiceId; + + @Schema(description = "当前登录用户信息") + private User user; + } diff --git a/im-uniapp/App.vue b/im-uniapp/App.vue index afd6fa9..4b9d4a4 100644 --- a/im-uniapp/App.vue +++ b/im-uniapp/App.vue @@ -468,8 +468,11 @@ export default { this.refreshToken(loginInfo).then(() => { // #ifdef H5 // 跳转到聊天页 - uni.switchTab({ - url: "/pages/chat/chat" + // uni.switchTab({ + // url: "/pages/chat/chat" + // }) + uni.navigateTo({ + url: "/pages/chat/chat-box?chatIdx=0" }) // #endif // 初始化 diff --git a/im-uniapp/package.json b/im-uniapp/package.json index 602b736..fc44384 100644 --- a/im-uniapp/package.json +++ b/im-uniapp/package.json @@ -9,4 +9,4 @@ "quill-image-resize-mp": "^3.0.1", "vconsole": "^3.15.1" } -} \ No newline at end of file +} diff --git a/im-uniapp/pages/login/login.vue b/im-uniapp/pages/login/login.vue index ea2a6ca..54d0327 100644 --- a/im-uniapp/pages/login/login.vue +++ b/im-uniapp/pages/login/login.vue @@ -1,57 +1,14 @@