diff --git a/im-platform/src/main/java/com/bx/implatform/controller/third/ThirdUserController.java b/im-platform/src/main/java/com/bx/implatform/controller/third/ThirdUserController.java new file mode 100644 index 0000000..647c5ca --- /dev/null +++ b/im-platform/src/main/java/com/bx/implatform/controller/third/ThirdUserController.java @@ -0,0 +1,46 @@ +package com.bx.implatform.controller.third; + +import com.bx.implatform.dto.third.ThirdCreateOrUpdateUserDTO; +import com.bx.implatform.dto.third.ThirdGetUserByUserIdDTO; +import com.bx.implatform.dto.third.ThirdLoginDTO; +import com.bx.implatform.result.Result; +import com.bx.implatform.result.ResultUtils; +import com.bx.implatform.service.third.ThirdUserService; +import com.bx.implatform.vo.third.ThirdGetUserByUserIdVo; +import com.bx.implatform.vo.third.ThirdLoginVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +@Slf4j +@RestController +@Tag(name = "第三方/用户") +@RequiredArgsConstructor +public class ThirdUserController { + + private final ThirdUserService thirdUserService; + + @PostMapping("/login") + @Operation(summary = "用户登录", description = "用户登录") + public Result login(@Valid @RequestBody ThirdLoginDTO dto) { + ThirdLoginVO vo = thirdUserService.login(dto); + return ResultUtils.success(vo); + } + + @PostMapping("/getUserByUserId") + @Operation(summary = "根据userId查询用户详情", description = "根据userId查询用户详情") + public Result getUserByUserId(@Valid @RequestBody ThirdGetUserByUserIdDTO dto) { + return ResultUtils.success(thirdUserService.getUserByUserId(dto)); + } + + @PostMapping("/createOrUpdate") + @Operation(summary = "创建或者更新用户", description = "创建或者更新用户") + public Result createOrUpdate(@Valid @RequestBody ThirdCreateOrUpdateUserDTO dto) { + thirdUserService.createOrUpdate(dto); + return ResultUtils.success(); + } + +} diff --git a/im-platform/src/main/java/com/bx/implatform/dto/third/ThirdCreateOrUpdateUserDTO.java b/im-platform/src/main/java/com/bx/implatform/dto/third/ThirdCreateOrUpdateUserDTO.java new file mode 100644 index 0000000..a1c27ab --- /dev/null +++ b/im-platform/src/main/java/com/bx/implatform/dto/third/ThirdCreateOrUpdateUserDTO.java @@ -0,0 +1,41 @@ +package com.bx.implatform.dto.third; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotEmpty; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +@Data +@Schema(description = "third用户注册DTO") +public class ThirdCreateOrUpdateUserDTO { + + @NotEmpty(message = "用户id不可为空") + @Schema(description = "用户id") + private Long userId; + + @Length(max = 20, message = "用户名不能大于20字符") + @NotEmpty(message = "用户名不可为空") + @Schema(description = "用户名") + private String userName; + + @NotEmpty(message = "用户手机号不可为空") + @Schema(description = "用户手机号") + private String phone; + + @Length(min = 5, max = 20, message = "密码长度必须在5-20个字符之间") + @NotEmpty(message = "用户密码不可为空") + @Schema(description = "用户密码") + private String password; + + @Length(max = 20, message = "昵称不能大于20字符") + @Schema(description = "用户昵称") + private String nickName; + + @Schema(description = "用户头像") + private String avatar; + + public String generatePassword() { + return phone + "_123"; + } + +} diff --git a/im-platform/src/main/java/com/bx/implatform/dto/third/ThirdGetUserByUserIdDTO.java b/im-platform/src/main/java/com/bx/implatform/dto/third/ThirdGetUserByUserIdDTO.java new file mode 100644 index 0000000..a6f4fdb --- /dev/null +++ b/im-platform/src/main/java/com/bx/implatform/dto/third/ThirdGetUserByUserIdDTO.java @@ -0,0 +1,15 @@ +package com.bx.implatform.dto.third; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +@Data +@Schema(description = "根据userId查询用户详情") +public class ThirdGetUserByUserIdDTO { + + @NotNull(message = "用户id不能为空") + @Schema(description = "用户id") + private Long userId; + +} diff --git a/im-platform/src/main/java/com/bx/implatform/dto/third/ThirdLoginDTO.java b/im-platform/src/main/java/com/bx/implatform/dto/third/ThirdLoginDTO.java new file mode 100644 index 0000000..f70cade --- /dev/null +++ b/im-platform/src/main/java/com/bx/implatform/dto/third/ThirdLoginDTO.java @@ -0,0 +1,24 @@ +package com.bx.implatform.dto.third; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.Max; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +@Data +@Schema(description = "third用户登录DTO") +public class ThirdLoginDTO { + + @Max(value = 2, message = "登录终端类型取值范围:0,2") + @Min(value = 0, message = "登录终端类型取值范围:0,2") + @NotNull(message = "登录终端类型不可为空") + @Schema(description = "登录终端 0:web 1:app 2:pc") + private Integer terminal; + + @NotEmpty(message = "用户id不存在") + @Schema(description = "用户id") + private Long userId; + +} diff --git a/im-platform/src/main/java/com/bx/implatform/service/third/ThirdUserService.java b/im-platform/src/main/java/com/bx/implatform/service/third/ThirdUserService.java new file mode 100644 index 0000000..7a4cd9d --- /dev/null +++ b/im-platform/src/main/java/com/bx/implatform/service/third/ThirdUserService.java @@ -0,0 +1,28 @@ +package com.bx.implatform.service.third; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.bx.implatform.dto.third.ThirdCreateOrUpdateUserDTO; +import com.bx.implatform.dto.third.ThirdGetUserByUserIdDTO; +import com.bx.implatform.dto.third.ThirdLoginDTO; +import com.bx.implatform.entity.User; +import com.bx.implatform.vo.third.ThirdGetUserByUserIdVo; +import com.bx.implatform.vo.third.ThirdLoginVO; +import jakarta.validation.Valid; + +public interface ThirdUserService extends IService { + + /** + * 用户登录 + */ + ThirdLoginVO login(@Valid ThirdLoginDTO dto); + + /** + * 创建或者更新用户 + */ + void createOrUpdate(@Valid ThirdCreateOrUpdateUserDTO dto); + + /** + * 根据userId查询用户详情 + */ + ThirdGetUserByUserIdVo getUserByUserId(@Valid ThirdGetUserByUserIdDTO dto); +} diff --git a/im-platform/src/main/java/com/bx/implatform/service/third/impl/ThirdUserServiceImpl.java b/im-platform/src/main/java/com/bx/implatform/service/third/impl/ThirdUserServiceImpl.java new file mode 100644 index 0000000..5368e28 --- /dev/null +++ b/im-platform/src/main/java/com/bx/implatform/service/third/impl/ThirdUserServiceImpl.java @@ -0,0 +1,93 @@ +package com.bx.implatform.service.third.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bx.imcommon.util.JwtUtil; +import com.bx.implatform.config.props.JwtProperties; +import com.bx.implatform.dto.third.ThirdCreateOrUpdateUserDTO; +import com.bx.implatform.dto.third.ThirdGetUserByUserIdDTO; +import com.bx.implatform.dto.third.ThirdLoginDTO; +import com.bx.implatform.entity.User; +import com.bx.implatform.exception.GlobalException; +import com.bx.implatform.mapper.UserMapper; +import com.bx.implatform.service.third.ThirdUserService; +import com.bx.implatform.session.UserSession; +import com.bx.implatform.util.BeanUtils; +import com.bx.implatform.vo.third.ThirdGetUserByUserIdVo; +import com.bx.implatform.vo.third.ThirdLoginVO; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Service; + +/** + * 第三方用户 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class ThirdUserServiceImpl extends ServiceImpl implements ThirdUserService { + + private final PasswordEncoder passwordEncoder; + private final JwtProperties jwtProperties; + + /** + * 用户登录 + */ + @Override + public ThirdLoginVO login(ThirdLoginDTO dto) { + User user = baseMapper.selectById(dto.getUserId()); + if (ObjectUtil.isEmpty(user)) { + throw new GlobalException("用户不存在"); + } + // 生成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()); + ThirdLoginVO vo = new ThirdLoginVO(); + vo.setAccessToken(accessToken); + vo.setAccessTokenExpiresIn(jwtProperties.getAccessTokenExpireIn()); + vo.setRefreshToken(refreshToken); + vo.setRefreshTokenExpiresIn(jwtProperties.getRefreshTokenExpireIn()); + return vo; + } + + /** + * 创建或者更新用户 + */ + @Override + public void createOrUpdate(ThirdCreateOrUpdateUserDTO dto) { + // 查询用户 + User user = baseMapper.selectById(dto.getUserId()); + User saveObjUser = new User(); + saveObjUser.setId(dto.getUserId()); + saveObjUser.setUserName(dto.getUserName()); + saveObjUser.setNickName(dto.getNickName()); + saveObjUser.setHeadImage(dto.getAvatar()); + saveObjUser.setHeadImageThumb(dto.getAvatar()); + if (ObjectUtil.isEmpty(user)) { + // 创建用户 + saveObjUser.setPassword(passwordEncoder.encode(dto.getPassword())); + baseMapper.insert(saveObjUser); + } else { + // 更新用户 + baseMapper.updateById(saveObjUser); + } + } + + /** + * 根据userId查询用户详情 + */ + @Override + public ThirdGetUserByUserIdVo getUserByUserId(ThirdGetUserByUserIdDTO dto) { + User user = baseMapper.selectById(dto.getUserId()); + return BeanUtils.copyProperties(user, ThirdGetUserByUserIdVo.class); + } + +} diff --git a/im-platform/src/main/java/com/bx/implatform/vo/third/ThirdGetUserByUserIdVo.java b/im-platform/src/main/java/com/bx/implatform/vo/third/ThirdGetUserByUserIdVo.java new file mode 100644 index 0000000..e1c7d56 --- /dev/null +++ b/im-platform/src/main/java/com/bx/implatform/vo/third/ThirdGetUserByUserIdVo.java @@ -0,0 +1,52 @@ +package com.bx.implatform.vo.third; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +@Data +@Schema(description = "third根据userId查询用户详情VO") +public class ThirdGetUserByUserIdVo { + + @NotNull(message = "用户id不能为空") + @Schema(description = "id") + private Long id; + + @NotEmpty(message = "用户名不能为空") + @Length(max = 20, message = "用户名不能大于20字符") + @Schema(description = "用户名") + private String userName; + + @NotEmpty(message = "用户昵称不能为空") + @Length(max = 20, message = "昵称不能大于20字符") + @Schema(description = "用户昵称") + private String nickName; + + @Schema(description = "性别") + private Integer sex; + + @Schema(description = "用户类型 1:普通用户 2:审核账户") + private Integer type; + + @Length(max = 128, message = "个性签名不能大于128个字符") + @Schema(description = "个性签名") + private String signature; + + @Schema(description = "头像") + private String headImage; + + @Schema(description = "头像缩略图") + private String headImageThumb; + + @Schema(description = "是否在线") + private Boolean online; + + @Schema(description = "账号是否被封禁") + private Boolean isBanned; + + @Schema(description = "被封禁原因") + private String reason; + +} diff --git a/im-platform/src/main/java/com/bx/implatform/vo/third/ThirdLoginVO.java b/im-platform/src/main/java/com/bx/implatform/vo/third/ThirdLoginVO.java new file mode 100644 index 0000000..fbcfd70 --- /dev/null +++ b/im-platform/src/main/java/com/bx/implatform/vo/third/ThirdLoginVO.java @@ -0,0 +1,22 @@ +package com.bx.implatform.vo.third; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +@Schema(description = "third用户登录VO") +public class ThirdLoginVO { + + @Schema(description = "每次请求都必须在header中携带accessToken") + private String accessToken; + + @Schema(description = "accessToken过期时间(秒)") + private Integer accessTokenExpiresIn; + + @Schema(description = "accessToken过期后,通过refreshToken换取新的token") + private String refreshToken; + + @Schema(description = "refreshToken过期时间(秒)") + private Integer refreshTokenExpiresIn; + +} diff --git a/im-platform/src/main/resources/application.yml b/im-platform/src/main/resources/application.yml index fd187ff..ae5abb0 100644 --- a/im-platform/src/main/resources/application.yml +++ b/im-platform/src/main/resources/application.yml @@ -2,7 +2,7 @@ server: port: 8888 spring: profiles: - active: prod # 环境 dev|test|prod + active: dev # 环境 dev|test|prod application: name: im-platform mvc: diff --git a/im-server/src/main/resources/application.yml b/im-server/src/main/resources/application.yml index 6c3f01b..522cbee 100644 --- a/im-server/src/main/resources/application.yml +++ b/im-server/src/main/resources/application.yml @@ -1,12 +1,13 @@ spring: profiles: - active: prod + active: dev application: name: im-server websocket: enable: true - port: 8878 + port: 8876 + # port: 8878 tcpsocket: enable: false # 暂时不开启 diff --git a/im-uniapp/.env.js b/im-uniapp/.env.js index 489c3d3..b5c0783 100644 --- a/im-uniapp/.env.js +++ b/im-uniapp/.env.js @@ -1,27 +1,27 @@ -//设置环境(打包前修改此变量) -const ENV = "DEV"; -const UNI_APP = {} -// 表情包路径 -UNI_APP.EMO_URL = "/static/emoji/"; -// #ifdef MP-WEIXIN -// 微信小程序的本地表情包经常莫名失效,建议将表情放到服务器中 -// UNI_APP.EMO_URL = "https://www.boxim.online/emoji/"; -// #endif - -if(ENV=="DEV"){ - // UNI_APP.BASE_URL = "http://127.0.0.1:8888"; - // UNI_APP.WS_URL = "ws://127.0.0.1:8878/im"; - - UNI_APP.BASE_URL = "http://chatsever.zianxin.com" - UNI_APP.WS_URL = "ws://chatapp.zianxin.com/im" - - // H5 走本地代理解决跨域问题 - // #ifdef H5 - UNI_APP.BASE_URL = "/api"; - // #endif -} -if(ENV=="PROD"){ - UNI_APP.BASE_URL = "https://www.boxim.online/api"; - UNI_APP.WS_URL = "wss://www.boxim.online/im"; -} +//设置环境(打包前修改此变量) +const ENV = "DEV"; +const UNI_APP = {} +// 表情包路径 +UNI_APP.EMO_URL = "/static/emoji/"; +// #ifdef MP-WEIXIN +// 微信小程序的本地表情包经常莫名失效,建议将表情放到服务器中 +// UNI_APP.EMO_URL = "https://www.boxim.online/emoji/"; +// #endif + +if (ENV == "DEV") { + // UNI_APP.BASE_URL = "http://127.0.0.1:8888"; + + UNI_APP.BASE_URL = "http://chatsever.zianxin.com" + // UNI_APP.WS_URL = "ws://chatapp.zianxin.com/im" + UNI_APP.WS_URL = "ws://127.0.0.1:8876/im"; + + // H5 走本地代理解决跨域问题 + // #ifdef H5 + UNI_APP.BASE_URL = "/api"; + // #endif +} +if (ENV == "PROD") { + UNI_APP.BASE_URL = "https://www.boxim.online/api"; + UNI_APP.WS_URL = "wss://www.boxim.online/im"; +} export default UNI_APP \ No newline at end of file diff --git a/im-uniapp/store/chatStore.js b/im-uniapp/store/chatStore.js index 56d8adc..8c49b2c 100644 --- a/im-uniapp/store/chatStore.js +++ b/im-uniapp/store/chatStore.js @@ -471,6 +471,7 @@ export default defineStore('chatStore', { chatsData.chats.push(chat); }) } + console.log("chatsData:",chatsData); this.initChats(chatsData); } resolve()