diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/group/vo/member/ImGroupMemberCreateReqVO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/group/vo/member/ImGroupMemberCreateReqVO.java new file mode 100644 index 0000000..a486190 --- /dev/null +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/group/vo/member/ImGroupMemberCreateReqVO.java @@ -0,0 +1,19 @@ +package cn.iocoder.yudao.module.im.controller.admin.group.vo.member; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +@Schema(description = "管理后台 - 群成员邀请 Request VO") +@Data +public class ImGroupMemberCreateReqVO { + + @Schema(description = "群编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "13279") + @NotNull(message = "群编号不能为空") + private Long groupId; + + @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "21730") + @NotNull(message = "用户编号不能为空") + private Long userId; + +} diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/privates/ImPrivateMessagePageReqVO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/privates/ImPrivateMessagePageReqVO.java new file mode 100644 index 0000000..b353e77 --- /dev/null +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/privates/ImPrivateMessagePageReqVO.java @@ -0,0 +1,21 @@ +package cn.iocoder.yudao.module.im.controller.admin.message.vo.privates; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import jakarta.validation.constraints.NotNull; + +@Schema(description = "管理后台 - 私聊消息分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ImPrivateMessagePageReqVO extends PageParam { + + @Schema(description = "接收人编号(对方)", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + @NotNull(message = "接收人编号不能为空") + private Long receiverId; + +} diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/user/ImUserController.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/user/ImUserController.java deleted file mode 100644 index 3855cd9..0000000 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/user/ImUserController.java +++ /dev/null @@ -1,67 +0,0 @@ -package cn.iocoder.yudao.module.im.controller.admin.user; - -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; -import cn.iocoder.yudao.framework.common.util.object.BeanUtils; -import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; -import cn.iocoder.yudao.module.im.controller.admin.user.vo.ImUserRespVO; -import cn.iocoder.yudao.module.system.api.user.AdminUserApi; -import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.annotation.Resource; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -import java.util.Collections; -import java.util.List; - -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; - -@Tag(name = "管理后台 - IM 用户查询") -@RestController -@RequestMapping("/im/user") -@Validated -public class ImUserController { - - @Resource - private AdminUserApi adminUserApi; - - @GetMapping("/get-self") - @Operation(summary = "获取当前登录用户信息") - public CommonResult getSelfInfo() { - Long userId = SecurityFrameworkUtils.getLoginUserId(); - AdminUserRespDTO user = adminUserApi.getUser(userId); - return success(BeanUtils.toBean(user, ImUserRespVO.class)); - } - - @GetMapping("/get") - @Operation(summary = "按用户编号查询用户(用于点头像弹名片)") - @Parameter(name = "id", description = "用户编号", required = true, example = "2048") - public CommonResult getUser(@RequestParam("id") Long id) { - AdminUserRespDTO user = adminUserApi.getUser(id); - if (user == null) { - return success(null); - } - return success(BeanUtils.toBean(user, ImUserRespVO.class)); - } - - @GetMapping("/list-by-name") - @Operation(summary = "按昵称模糊搜索用户(用于加好友场景)") - @Parameter(name = "name", description = "昵称关键词", required = true, example = "芋道") - public CommonResult> getUserListByName(@RequestParam("name") String name) { - if (name == null || name.trim().isEmpty()) { - return success(Collections.emptyList()); - } - List users = adminUserApi.getUserListByNickname(name.trim()); - // TODO @芋艿:【对齐】这里需要支持按「用户名 or 昵称」搜索; - // AdminUser 按用户名模糊的接口暂未暴露,先仅按昵称。后续可扩 AdminUserApi 加一个 - // `getUserListByUsernameOrNickname(keyword)` 或让前端输入时选搜索模式。 - return success(CollectionUtils.convertList(users, u -> BeanUtils.toBean(u, ImUserRespVO.class))); - } - -} diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/user/vo/ImUserRespVO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/user/vo/ImUserRespVO.java deleted file mode 100644 index 5d6f9e8..0000000 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/user/vo/ImUserRespVO.java +++ /dev/null @@ -1,41 +0,0 @@ -package cn.iocoder.yudao.module.im.controller.admin.user.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -/** - * IM 用户 Response VO(对 AdminUser 的字段窄投影) - *

- * 面向 IM 场景,主要关注 id / userName / nickName / headImage / sex / signature 这些字段; - * 但 yudao 侧 AdminUser 没有 signature 字段,暂不返回(TODO @芋艿:【对齐】后续可加用户扩展表承载)。 - * - * @author 芋道源码 - */ -@Schema(description = "管理后台 - IM 用户 Response VO") -@Data -public class ImUserRespVO { - - @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Long id; - - @Schema(description = "用户名", example = "admin") - private String username; - - @Schema(description = "昵称", example = "芋道") - private String nickname; - - @Schema(description = "头像") - private String avatar; - - @Schema(description = "性别 0=未知 1=男 2=女", example = "1") - private Integer sex; - - @Schema(description = "手机号") - private String mobile; - - /** - * TODO @芋艿:【对齐】个性签名(signature)字段当前缺失,yudao AdminUser 无此字段; - * 如果要对齐,可走 system 模块的用户扩展表,或 IM 模块独立存。 - */ - -} diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserController.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserController.java index 59a4c64..f619898 100644 --- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserController.java +++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserController.java @@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.system.controller.admin.user; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.CommonResult; @@ -27,7 +28,10 @@ import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; -import java.util.*; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Map; import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; @@ -110,27 +114,10 @@ public class UserController { pageResult.getTotal())); } - // TODO @dylan:可以服用 getSimpleUserList 呀。 - @GetMapping("/all") - @Operation(summary = "获得所有用户列表") - @PreAuthorize("@ss.hasPermission('system:user:list')") - public CommonResult> getUserAll() { - List result = userService.getUserListAll(); - if (CollUtil.isEmpty(result)) { - return success(null); - } - // 拼接数据 - Map deptMap = deptService.getDeptMap( - convertList(result, AdminUserDO::getDeptId)); - return success(UserConvert.INSTANCE.convertList(result, deptMap)); - } - - @GetMapping({"/list-all-simple", "/simple-list"}) @Operation(summary = "获取用户精简信息列表", description = "只包含被开启的用户,主要用于前端的下拉选项") public CommonResult> getSimpleUserList(@RequestParam("id") Long deptId) { List list; - if (deptId != null) { List deptIds = Collections.singletonList(deptId); list = userService.getDeptUsers(deptIds); @@ -141,7 +128,6 @@ public class UserController { // 拼接数据 Map deptMap = deptService.getDeptMap( convertList(list, AdminUserDO::getDeptId)); - return success(UserConvert.INSTANCE.convertSimpleList(list, deptMap)); } @@ -201,4 +187,34 @@ public class UserController { return success(userService.importUserList(list, updateSupport)); } + // ==================== 免鉴权接口(用于 IM 点头像弹名片、加好友搜索等场景) ==================== + + @GetMapping("/get-simple") + @Operation(summary = "获得用户精简信息", description = "用于点头像弹名片等场景;免鉴权") + @Parameter(name = "id", description = "用户编号", required = true, example = "1024") + public CommonResult getSimpleUser(@RequestParam("id") Long id) { + AdminUserDO user = userService.getUser(id); + if (user == null) { + return success(null); + } + // 拼接数据 + DeptDO dept = user.getDeptId() != null ? deptService.getDept(user.getDeptId()) : null; + Map deptMap = dept != null ? Collections.singletonMap(dept.getId(), dept) : Collections.emptyMap(); + return success(CollUtil.getFirst(UserConvert.INSTANCE.convertSimpleList( + Collections.singletonList(user), deptMap))); + } + + @GetMapping("/list-by-nickname") + @Operation(summary = "按昵称模糊搜索用户精简信息", description = "用于加好友等场景;免鉴权;当前仅按昵称匹配") + @Parameter(name = "nickname", description = "昵称关键词", required = true, example = "芋道") + public CommonResult> getSimpleUserListByNickname(@RequestParam("nickname") String nickname) { + if (StrUtil.isBlank(nickname)) { + return success(Collections.emptyList()); + } + // 拼接数据 + List list = userService.getUserListByNickname(nickname.trim()); + Map deptMap = deptService.getDeptMap(convertList(list, AdminUserDO::getDeptId)); + return success(UserConvert.INSTANCE.convertSimpleList(list, deptMap)); + } + } diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserSimpleRespVO.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserSimpleRespVO.java index 6dac286..3d19d67 100644 --- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserSimpleRespVO.java +++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserSimpleRespVO.java @@ -17,6 +17,11 @@ public class UserSimpleRespVO { @Schema(description = "用户昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道") private String nickname; + @Schema(description = "头像") + private String avatar; + @Schema(description = "性别", example = "1") + private Integer sex; + @Schema(description = "部门ID", example = "我是一个用户") private Long deptId; @Schema(description = "部门名称", example = "IT 部")