[重大更新] 使用 spring 新特性 HttpServiceClient 替代 Dubbo 降低框架使用难度(半成本 数据权限不好使)

This commit is contained in:
疯狂的狮子Li
2026-03-20 19:56:09 +08:00
parent 9cd198d99d
commit b6d2274b53
127 changed files with 1894 additions and 1496 deletions

View File

@@ -1,12 +1,18 @@
package org.dromara.system.api;
import org.dromara.common.core.annotation.RemoteHttpService;
import org.dromara.system.api.domain.vo.RemoteClientVo;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.service.annotation.GetExchange;
import org.springframework.web.service.annotation.HttpExchange;
/**
* 客户端服务
*
* @author Michelle.Chung
*/
@RemoteHttpService("ruoyi-system")
@HttpExchange("/remote/client")
public interface RemoteClientService {
/**
@@ -15,6 +21,7 @@ public interface RemoteClientService {
* @param clientId 客户端id
* @return 客户端对象
*/
RemoteClientVo queryByClientId(String clientId);
@GetExchange("/query-by-client-id")
RemoteClientVo queryByClientId(@RequestParam String clientId);
}

View File

@@ -2,6 +2,11 @@ package org.dromara.system.api;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.lang.Dict;
import org.dromara.common.core.annotation.RemoteHttpService;
import org.dromara.common.json.utils.JsonUtils;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.service.annotation.GetExchange;
import org.springframework.web.service.annotation.HttpExchange;
import java.math.BigDecimal;
import java.util.List;
@@ -11,12 +16,15 @@ import java.util.List;
*
* @author Michelle.Chung
*/
@RemoteHttpService("ruoyi-system")
@HttpExchange("/remote/config")
public interface RemoteConfigService {
/**
* 获取注册开关
* @return true开启false关闭
*/
@GetExchange("/select-register-enabled")
boolean selectRegisterEnabled();
/**
@@ -25,7 +33,8 @@ public interface RemoteConfigService {
* @param configKey 参数 key
* @return 参数值
*/
String getConfigValue(String configKey);
@GetExchange("/get-config-value")
String getConfigValue(@RequestParam String configKey);
/**
* 根据参数 key 获取布尔值
@@ -73,7 +82,9 @@ public interface RemoteConfigService {
* @param configKey 参数 key
* @return Dict 对象,如果配置为空或无法解析,返回空 Dict
*/
Dict getConfigMap(String configKey);
default Dict getConfigMap(String configKey) {
return JsonUtils.parseMap(getConfigValue(configKey));
}
/**
* 根据参数 key 获取 Map 类型的配置列表
@@ -81,7 +92,9 @@ public interface RemoteConfigService {
* @param configKey 参数 key
* @return Dict 列表,如果配置为空或无法解析,返回空列表
*/
List<Dict> getConfigArrayMap(String configKey);
default List<Dict> getConfigArrayMap(String configKey) {
return JsonUtils.parseArrayMap(getConfigValue(configKey));
}
/**
* 根据参数 key 获取指定类型的配置对象
@@ -91,7 +104,9 @@ public interface RemoteConfigService {
* @param <T> 目标对象泛型
* @return 对象实例,如果配置为空或无法解析,返回 null
*/
<T> T getConfigObject(String configKey, Class<T> clazz);
default <T> T getConfigObject(String configKey, Class<T> clazz) {
return JsonUtils.parseObject(getConfigValue(configKey), clazz);
}
/**
* 根据参数 key 获取指定类型的配置列表
@@ -101,6 +116,8 @@ public interface RemoteConfigService {
* @param <T> 元素类型泛型
* @return 指定类型列表,如果配置为空或无法解析,返回空列表
*/
<T> List<T> getConfigArray(String configKey, Class<T> clazz);
default <T> List<T> getConfigArray(String configKey, Class<T> clazz) {
return JsonUtils.parseArray(getConfigValue(configKey), clazz);
}
}

View File

@@ -1,10 +1,17 @@
package org.dromara.system.api;
import org.dromara.common.core.annotation.RemoteHttpService;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.service.annotation.GetExchange;
import org.springframework.web.service.annotation.HttpExchange;
/**
* 数据权限服务
*
* @author Lion Li
*/
@RemoteHttpService("ruoyi-system")
@HttpExchange("/remote/data-scope")
public interface RemoteDataScopeService {
/**
@@ -13,7 +20,8 @@ public interface RemoteDataScopeService {
* @param roleId 角色ID
* @return 返回角色的自定义权限语句,如果没有找到则返回 null
*/
String getRoleCustom(Long roleId);
@GetExchange("/role-custom")
String getRoleCustom(@RequestParam Long roleId);
/**
* 获取部门和下级权限语句
@@ -21,6 +29,7 @@ public interface RemoteDataScopeService {
* @param deptId 部门ID
* @return 返回部门及其下级的权限语句,如果没有找到则返回 null
*/
String getDeptAndChild(Long deptId);
@GetExchange("/dept-and-child")
String getDeptAndChild(@RequestParam Long deptId);
}

View File

@@ -1,6 +1,12 @@
package org.dromara.system.api;
import org.dromara.common.core.annotation.RemoteHttpService;
import org.dromara.system.api.domain.vo.RemoteDeptVo;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.service.annotation.GetExchange;
import org.springframework.web.service.annotation.HttpExchange;
import org.springframework.web.service.annotation.PostExchange;
import java.util.Collection;
import java.util.List;
@@ -11,6 +17,8 @@ import java.util.Map;
*
* @author Lion Li
*/
@RemoteHttpService("ruoyi-system")
@HttpExchange("/remote/dept")
public interface RemoteDeptService {
/**
@@ -19,7 +27,8 @@ public interface RemoteDeptService {
* @param deptIds 部门ID串逗号分隔
* @return 部门名称串逗号分隔
*/
String selectDeptNameByIds(String deptIds);
@GetExchange("/select-dept-name-by-ids")
String selectDeptNameByIds(@RequestParam String deptIds);
/**
* 根据部门ID查询部门负责人
@@ -27,13 +36,15 @@ public interface RemoteDeptService {
* @param deptId 部门ID用于指定需要查询的部门
* @return 返回该部门的负责人ID
*/
Long selectDeptLeaderById(Long deptId);
@GetExchange("/select-dept-leader-by-id")
Long selectDeptLeaderById(@RequestParam Long deptId);
/**
* 查询部门
*
* @return 部门列表
*/
@GetExchange("/select-depts-by-list")
List<RemoteDeptVo> selectDeptsByList();
/**
@@ -42,6 +53,7 @@ public interface RemoteDeptService {
* @param deptIds 部门 ID 列表
* @return Map其中 key 为部门 IDvalue 为对应的部门名称
*/
Map<Long, String> selectDeptNamesByIds(Collection<Long> deptIds);
@PostExchange("/select-dept-names-by-ids")
Map<Long, String> selectDeptNamesByIds(@RequestBody Collection<Long> deptIds);
}

View File

@@ -1,7 +1,11 @@
package org.dromara.system.api;
import org.dromara.common.core.annotation.RemoteHttpService;
import org.dromara.system.api.domain.vo.RemoteDictDataVo;
import org.dromara.system.api.domain.vo.RemoteDictTypeVo;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.service.annotation.GetExchange;
import org.springframework.web.service.annotation.HttpExchange;
import java.util.List;
@@ -10,6 +14,8 @@ import java.util.List;
*
* @author Lion Li
*/
@RemoteHttpService("ruoyi-system")
@HttpExchange("/remote/dict")
public interface RemoteDictService {
/**
@@ -18,7 +24,8 @@ public interface RemoteDictService {
* @param dictType 字典类型
* @return 字典类型
*/
RemoteDictTypeVo selectDictTypeByType(String dictType);
@GetExchange("/select-dict-type-by-type")
RemoteDictTypeVo selectDictTypeByType(@RequestParam String dictType);
/**
* 根据字典类型查询字典数据
@@ -26,6 +33,7 @@ public interface RemoteDictService {
* @param dictType 字典类型
* @return 字典数据集合信息
*/
List<RemoteDictDataVo> selectDictDataByType(String dictType);
@GetExchange("/select-dict-data-by-type")
List<RemoteDictDataVo> selectDictDataByType(@RequestParam String dictType);
}

View File

@@ -1,13 +1,19 @@
package org.dromara.system.api;
import org.dromara.common.core.annotation.RemoteHttpService;
import org.dromara.system.api.domain.bo.RemoteLoginInfoBo;
import org.dromara.system.api.domain.bo.RemoteOperLogBo;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.service.annotation.HttpExchange;
import org.springframework.web.service.annotation.PostExchange;
/**
* 日志服务
*
* @author Lion Li
*/
@RemoteHttpService("ruoyi-system")
@HttpExchange("/remote/log")
public interface RemoteLogService {
/**
@@ -15,13 +21,15 @@ public interface RemoteLogService {
*
* @param sysOperLog 日志实体
*/
void saveLog(RemoteOperLogBo sysOperLog);
@PostExchange("/save-log")
void saveLog(@RequestBody RemoteOperLogBo sysOperLog);
/**
* 保存访问记录
*
* @param sysLoginInfo 访问实体
*/
void saveLoginInfo(RemoteLoginInfoBo sysLoginInfo);
@PostExchange("/save-login-info")
void saveLoginInfo(@RequestBody RemoteLoginInfoBo sysLoginInfo);
}

View File

@@ -1,5 +1,10 @@
package org.dromara.system.api;
import org.dromara.common.core.annotation.RemoteHttpService;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.service.annotation.GetExchange;
import org.springframework.web.service.annotation.HttpExchange;
import java.util.Set;
/**
@@ -7,6 +12,8 @@ import java.util.Set;
*
* @author Lion Li
*/
@RemoteHttpService("ruoyi-system")
@HttpExchange("/remote/permission")
public interface RemotePermissionService {
/**
@@ -15,7 +22,8 @@ public interface RemotePermissionService {
* @param userId 用户id
* @return 角色权限信息
*/
Set<String> getRolePermission(Long userId);
@GetExchange("/role-permission")
Set<String> getRolePermission(@RequestParam Long userId);
/**
* 获取菜单数据权限
@@ -23,6 +31,7 @@ public interface RemotePermissionService {
* @param userId 用户id
* @return 菜单权限信息
*/
Set<String> getMenuPermission(Long userId);
@GetExchange("/menu-permission")
Set<String> getMenuPermission(@RequestParam Long userId);
}

View File

@@ -1,7 +1,11 @@
package org.dromara.system.api;
import org.dromara.common.core.annotation.RemoteHttpService;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.service.annotation.HttpExchange;
import org.springframework.web.service.annotation.PostExchange;
import java.util.Collection;
import java.util.List;
import java.util.Map;
/**
@@ -9,6 +13,8 @@ import java.util.Map;
*
* @author Lion Li
*/
@RemoteHttpService("ruoyi-system")
@HttpExchange("/remote/post")
public interface RemotePostService {
/**
@@ -17,6 +23,7 @@ public interface RemotePostService {
* @param postIds 岗位 ID 列表
* @return Map其中 key 为岗位 IDvalue 为对应的岗位名称
*/
Map<Long, String> selectPostNamesByIds(Collection<Long> postIds);
@PostExchange("/select-post-names-by-ids")
Map<Long, String> selectPostNamesByIds(@RequestBody Collection<Long> postIds);
}

View File

@@ -1,7 +1,11 @@
package org.dromara.system.api;
import org.dromara.common.core.annotation.RemoteHttpService;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.service.annotation.HttpExchange;
import org.springframework.web.service.annotation.PostExchange;
import java.util.Collection;
import java.util.List;
import java.util.Map;
/**
@@ -9,6 +13,8 @@ import java.util.Map;
*
* @author Lion Li
*/
@RemoteHttpService("ruoyi-system")
@HttpExchange("/remote/role")
public interface RemoteRoleService {
/**
@@ -17,6 +23,7 @@ public interface RemoteRoleService {
* @param roleIds 角色 ID 列表
* @return Map其中 key 为角色 IDvalue 为对应的角色名称
*/
Map<Long, String> selectRoleNamesByIds(Collection<Long> roleIds);
@PostExchange("/select-role-names-by-ids")
Map<Long, String> selectRoleNamesByIds(@RequestBody Collection<Long> roleIds);
}

View File

@@ -1,7 +1,13 @@
package org.dromara.system.api;
import org.dromara.common.core.annotation.RemoteHttpService;
import org.dromara.system.api.domain.bo.RemoteSocialBo;
import org.dromara.system.api.domain.vo.RemoteSocialVo;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.service.annotation.GetExchange;
import org.springframework.web.service.annotation.HttpExchange;
import org.springframework.web.service.annotation.PostExchange;
import java.util.List;
@@ -10,6 +16,8 @@ import java.util.List;
*
* @author Michelle.Chung
*/
@RemoteHttpService("ruoyi-system")
@HttpExchange("/remote/social")
public interface RemoteSocialService {
/**
@@ -18,28 +26,32 @@ public interface RemoteSocialService {
* @param authId 认证id
* @return 授权信息
*/
List<RemoteSocialVo> selectByAuthId(String authId);
@GetExchange("/select-by-auth-id")
List<RemoteSocialVo> selectByAuthId(@RequestParam String authId);
/**
* 查询列表
*
* @param bo 社会化关系业务对象
*/
List<RemoteSocialVo> queryList(RemoteSocialBo bo);
@PostExchange("/query-list")
List<RemoteSocialVo> queryList(@RequestBody RemoteSocialBo bo);
/**
* 保存社会化关系
*
* @param bo 社会化关系业务对象
*/
void insertByBo(RemoteSocialBo bo);
@PostExchange("/insert-by-bo")
void insertByBo(@RequestBody RemoteSocialBo bo);
/**
* 更新社会化关系
*
* @param bo 社会化关系业务对象
*/
void updateByBo(RemoteSocialBo bo);
@PostExchange("/update-by-bo")
void updateByBo(@RequestBody RemoteSocialBo bo);
/**
* 删除社会化关系
@@ -47,6 +59,7 @@ public interface RemoteSocialService {
* @param socialId 社会化关系ID
* @return 结果
*/
Boolean deleteWithValidById(Long socialId);
@PostExchange("/delete-with-valid-by-id")
Boolean deleteWithValidById(@RequestParam Long socialId);
}

View File

@@ -1,13 +1,19 @@
package org.dromara.system.api;
import org.dromara.common.core.annotation.RemoteHttpService;
import org.dromara.system.api.domain.bo.RemoteTaskAssigneeBo;
import org.dromara.system.api.domain.vo.RemoteTaskAssigneeVo;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.service.annotation.HttpExchange;
import org.springframework.web.service.annotation.PostExchange;
/**
* 工作流设计器获取任务执行人
*
* @author Lion Li
*/
@RemoteHttpService("ruoyi-system")
@HttpExchange("/remote/task-assignee")
public interface RemoteTaskAssigneeService {
/**
@@ -16,7 +22,8 @@ public interface RemoteTaskAssigneeService {
* @param taskQuery 查询条件
* @return 办理人
*/
RemoteTaskAssigneeVo selectRolesByTaskAssigneeList(RemoteTaskAssigneeBo taskQuery);
@PostExchange("/select-roles")
RemoteTaskAssigneeVo selectRolesByTaskAssigneeList(@RequestBody RemoteTaskAssigneeBo taskQuery);
/**
* 查询岗位并返回任务指派的列表,支持分页
@@ -24,7 +31,8 @@ public interface RemoteTaskAssigneeService {
* @param taskQuery 查询条件
* @return 办理人
*/
RemoteTaskAssigneeVo selectPostsByTaskAssigneeList(RemoteTaskAssigneeBo taskQuery);
@PostExchange("/select-posts")
RemoteTaskAssigneeVo selectPostsByTaskAssigneeList(@RequestBody RemoteTaskAssigneeBo taskQuery);
/**
* 查询部门并返回任务指派的列表,支持分页
@@ -32,7 +40,8 @@ public interface RemoteTaskAssigneeService {
* @param taskQuery 查询条件
* @return 办理人
*/
RemoteTaskAssigneeVo selectDeptsByTaskAssigneeList(RemoteTaskAssigneeBo taskQuery);
@PostExchange("/select-depts")
RemoteTaskAssigneeVo selectDeptsByTaskAssigneeList(@RequestBody RemoteTaskAssigneeBo taskQuery);
/**
* 查询用户并返回任务指派的列表,支持分页
@@ -40,6 +49,7 @@ public interface RemoteTaskAssigneeService {
* @param taskQuery 查询条件
* @return 办理人
*/
RemoteTaskAssigneeVo selectUsersByTaskAssigneeList(RemoteTaskAssigneeBo taskQuery);
@PostExchange("/select-users")
RemoteTaskAssigneeVo selectUsersByTaskAssigneeList(@RequestBody RemoteTaskAssigneeBo taskQuery);
}

View File

@@ -2,10 +2,16 @@ package org.dromara.system.api;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.exception.user.UserException;
import org.dromara.common.core.annotation.RemoteHttpService;
import org.dromara.system.api.domain.bo.RemoteUserBo;
import org.dromara.system.api.domain.vo.RemoteUserVo;
import org.dromara.system.api.model.LoginUser;
import org.dromara.system.api.model.XcxLoginUser;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.service.annotation.GetExchange;
import org.springframework.web.service.annotation.HttpExchange;
import org.springframework.web.service.annotation.PostExchange;
import java.util.Collection;
import java.util.List;
@@ -16,6 +22,8 @@ import java.util.Map;
*
* @author Lion Li
*/
@RemoteHttpService("ruoyi-system")
@HttpExchange("/remote/user")
public interface RemoteUserService {
/**
@@ -24,7 +32,8 @@ public interface RemoteUserService {
* @param username 用户名
* @return 结果
*/
LoginUser getUserInfo(String username) throws UserException;
@GetExchange("/get-by-username")
LoginUser getUserInfo(@RequestParam String username) throws UserException;
/**
* 通过用户id查询用户信息
@@ -32,7 +41,8 @@ public interface RemoteUserService {
* @param userId 用户id
* @return 结果
*/
LoginUser getUserInfo(Long userId) throws UserException;
@GetExchange("/get-by-id")
LoginUser getUserInfo(@RequestParam Long userId) throws UserException;
/**
* 通过手机号查询用户信息
@@ -40,7 +50,8 @@ public interface RemoteUserService {
* @param phonenumber 手机号
* @return 结果
*/
LoginUser getUserInfoByPhonenumber(String phonenumber) throws UserException;
@GetExchange("/get-by-phonenumber")
LoginUser getUserInfoByPhonenumber(@RequestParam String phonenumber) throws UserException;
/**
* 通过邮箱查询用户信息
@@ -48,7 +59,8 @@ public interface RemoteUserService {
* @param email 邮箱
* @return 结果
*/
LoginUser getUserInfoByEmail(String email) throws UserException;
@GetExchange("/get-by-email")
LoginUser getUserInfoByEmail(@RequestParam String email) throws UserException;
/**
* 通过openid查询用户信息
@@ -56,7 +68,8 @@ public interface RemoteUserService {
* @param openid openid
* @return 结果
*/
XcxLoginUser getUserInfoByOpenid(String openid) throws UserException;
@GetExchange("/get-by-openid")
XcxLoginUser getUserInfoByOpenid(@RequestParam String openid) throws UserException;
/**
* 注册用户信息
@@ -64,7 +77,8 @@ public interface RemoteUserService {
* @param remoteUserBo 用户信息
* @return 结果
*/
Boolean registerUserInfo(RemoteUserBo remoteUserBo) throws UserException, ServiceException;
@PostExchange("/register-user-info")
Boolean registerUserInfo(@RequestBody RemoteUserBo remoteUserBo) throws UserException, ServiceException;
/**
* 通过userId查询用户账户
@@ -72,7 +86,8 @@ public interface RemoteUserService {
* @param userId 用户id
* @return 结果
*/
String selectUserNameById(Long userId);
@GetExchange("/select-username-by-id")
String selectUserNameById(@RequestParam Long userId);
/**
* 通过用户ID查询用户昵称
@@ -80,7 +95,8 @@ public interface RemoteUserService {
* @param userId 用户ID
* @return 用户昵称
*/
String selectNicknameById(Long userId);
@GetExchange("/select-nickname-by-id")
String selectNicknameById(@RequestParam Long userId);
/**
* 通过用户ID查询用户昵称
@@ -88,7 +104,8 @@ public interface RemoteUserService {
* @param userIds 用户ID 多个用逗号隔开
* @return 用户昵称
*/
String selectNicknameByIds(String userIds);
@GetExchange("/select-nickname-by-ids")
String selectNicknameByIds(@RequestParam String userIds);
/**
* 通过用户ID查询用户手机号
@@ -96,7 +113,8 @@ public interface RemoteUserService {
* @param userId 用户id
* @return 用户手机号
*/
String selectPhonenumberById(Long userId);
@GetExchange("/select-phonenumber-by-id")
String selectPhonenumberById(@RequestParam Long userId);
/**
* 通过用户ID查询用户邮箱
@@ -104,7 +122,8 @@ public interface RemoteUserService {
* @param userId 用户id
* @return 用户邮箱
*/
String selectEmailById(Long userId);
@GetExchange("/select-email-by-id")
String selectEmailById(@RequestParam Long userId);
/**
* 更新用户信息
@@ -112,7 +131,8 @@ public interface RemoteUserService {
* @param userId 用户ID
* @param ip IP地址
*/
void recordLoginInfo(Long userId, String ip);
@PostExchange("/record-login-info")
void recordLoginInfo(@RequestParam Long userId, @RequestParam String ip);
/**
* 通过用户ID查询用户列表
@@ -120,7 +140,8 @@ public interface RemoteUserService {
* @param userIds 用户ids
* @return 用户列表
*/
List<RemoteUserVo> selectListByIds(Collection<Long> userIds);
@PostExchange("/select-list-by-ids")
List<RemoteUserVo> selectListByIds(@RequestBody Collection<Long> userIds);
/**
* 通过角色ID查询用户ID
@@ -128,7 +149,8 @@ public interface RemoteUserService {
* @param roleIds 角色ids
* @return 用户ids
*/
List<Long> selectUserIdsByRoleIds(Collection<Long> roleIds);
@PostExchange("/select-user-ids-by-role-ids")
List<Long> selectUserIdsByRoleIds(@RequestBody Collection<Long> roleIds);
/**
* 通过角色ID查询用户
@@ -136,7 +158,8 @@ public interface RemoteUserService {
* @param roleIds 角色ids
* @return 用户
*/
List<RemoteUserVo> selectUsersByRoleIds(Collection<Long> roleIds);
@PostExchange("/select-users-by-role-ids")
List<RemoteUserVo> selectUsersByRoleIds(@RequestBody Collection<Long> roleIds);
/**
* 通过部门ID查询用户
@@ -144,7 +167,8 @@ public interface RemoteUserService {
* @param deptIds 部门ids
* @return 用户
*/
List<RemoteUserVo> selectUsersByDeptIds(Collection<Long> deptIds);
@PostExchange("/select-users-by-dept-ids")
List<RemoteUserVo> selectUsersByDeptIds(@RequestBody Collection<Long> deptIds);
/**
* 通过岗位ID查询用户
@@ -152,7 +176,8 @@ public interface RemoteUserService {
* @param postIds 岗位ids
* @return 用户
*/
List<RemoteUserVo> selectUsersByPostIds(Collection<Long> postIds);
@PostExchange("/select-users-by-post-ids")
List<RemoteUserVo> selectUsersByPostIds(@RequestBody Collection<Long> postIds);
/**
* 根据用户 ID 列表查询用户昵称映射关系
@@ -160,6 +185,7 @@ public interface RemoteUserService {
* @param userIds 用户 ID 列表
* @return Map其中 key 为用户 IDvalue 为对应的用户昵称
*/
Map<Long, String> selectUserNicksByIds(Collection<Long> userIds);
@PostExchange("/select-user-nicks-by-ids")
Map<Long, String> selectUserNicksByIds(@RequestBody Collection<Long> userIds);
}