From da781180a70cc41de19af4d3d53aa7adc33f6cf2 Mon Sep 17 00:00:00 2001 From: heavyrian2012 Date: Fri, 10 Apr 2026 21:53:24 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E4=B8=9A=E5=8A=A1=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=E4=B8=8D=E9=99=90=E5=88=B6=E6=89=8B=E6=9C=BA=E5=8F=B7?= =?UTF-8?q?=E7=A0=81=E9=87=8D=E5=A4=8D=E6=97=B6=EF=BC=8C=E6=A0=B9=E6=8D=AE?= =?UTF-8?q?=E6=89=8B=E6=9C=BA=E5=8F=B7=E7=A0=81=E8=8E=B7=E5=8F=96=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E5=88=97=E8=A1=A8=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../action/admin/GetUsersByMobileAction.java | 65 +++++++++++++ .../moquette/persistence/DatabaseStore.java | 96 +++++++++++++++++++ .../persistence/MemoryMessagesStore.java | 5 + .../java/io/moquette/spi/IMessagesStore.java | 1 + .../java/cn/wildfirechat/common/APIPath.java | 1 + .../main/java/cn/wildfirechat/sdk/Main.java | 11 ++- .../java/cn/wildfirechat/sdk/UserAdmin.java | 17 +++- 7 files changed, 194 insertions(+), 2 deletions(-) create mode 100755 broker/src/main/java/com/xiaoleilu/loServer/action/admin/GetUsersByMobileAction.java diff --git a/broker/src/main/java/com/xiaoleilu/loServer/action/admin/GetUsersByMobileAction.java b/broker/src/main/java/com/xiaoleilu/loServer/action/admin/GetUsersByMobileAction.java new file mode 100755 index 00000000..54ba33f1 --- /dev/null +++ b/broker/src/main/java/com/xiaoleilu/loServer/action/admin/GetUsersByMobileAction.java @@ -0,0 +1,65 @@ +/* + * This file is part of the Wildfire Chat package. + * (c) Heavyrain2012 + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +package com.xiaoleilu.loServer.action.admin; + +import cn.wildfirechat.common.APIPath; +import cn.wildfirechat.common.ErrorCode; +import cn.wildfirechat.pojos.InputGetUserInfo; +import cn.wildfirechat.pojos.InputOutputUserInfo; +import cn.wildfirechat.pojos.OutputUserInfoList; +import cn.wildfirechat.proto.WFCMessage; +import com.xiaoleilu.loServer.RestResult; +import com.xiaoleilu.loServer.annotation.HttpMethod; +import com.xiaoleilu.loServer.annotation.Route; +import com.xiaoleilu.loServer.handler.Request; +import com.xiaoleilu.loServer.handler.Response; +import io.netty.handler.codec.http.FullHttpRequest; +import io.netty.util.internal.StringUtil; + +import java.util.ArrayList; +import java.util.List; + +@Route(APIPath.User_Get_By_Mobile) +@HttpMethod("POST") +public class GetUsersByMobileAction extends AdminAction { + + @Override + public boolean isTransactionAction() { + return true; + } + + @Override + public boolean action(Request request, Response response) { + if (request.getNettyRequest() instanceof FullHttpRequest) { + InputGetUserInfo email = getRequestBody(request.getNettyRequest(), InputGetUserInfo.class); + if (!StringUtil.isNullOrEmpty(email.getMobile())) { + List users = messagesStore.getUserInfosByMobile(email.getMobile(), email.isIncludeDeleted()); + List list = new ArrayList<>(); + for (WFCMessage.User user : users) { + list.add(InputOutputUserInfo.fromPbUser(user)); + } + + RestResult result; + if (list.isEmpty()) { + result = RestResult.resultOf(ErrorCode.ERROR_CODE_NOT_EXIST); + } else { + OutputUserInfoList outputUserInfoList = new OutputUserInfoList(); + outputUserInfoList.userInfos = list; + result = RestResult.ok(outputUserInfoList); + } + + setResponseContent(result, response); + } else { + setResponseContent(RestResult.resultOf(ErrorCode.INVALID_PARAMETER), response); + } + + } + return true; + } +} diff --git a/broker/src/main/java/io/moquette/persistence/DatabaseStore.java b/broker/src/main/java/io/moquette/persistence/DatabaseStore.java index 5c43767e..ec647cd3 100644 --- a/broker/src/main/java/io/moquette/persistence/DatabaseStore.java +++ b/broker/src/main/java/io/moquette/persistence/DatabaseStore.java @@ -3091,6 +3091,102 @@ public class DatabaseStore { return outList; } + List getUserInfosByMobile(String mobile, boolean includeDeleted) { + Connection connection = null; + PreparedStatement statement = null; + ResultSet rs = null; + List outList = new ArrayList<>(); + try { + connection = DBUtil.getConnection(); + String sql = "select `_uid`, `_name`" + + ", `_display_name`" + + ", `_portrait`" + + ", `_mobile`" + + ", `_gender`" + + ", `_email`" + + ", `_address`" + + ", `_company`" + + ", `_social`" + + ", `_extra`" + + ", `_type`" + + ", `_deleted`" + + ", `_dt` from t_user where `_mobile` = ?"; + if(!includeDeleted) { + sql += " and `_deleted` = 0"; + } + statement = connection.prepareStatement(sql); + statement.setString(1, mobile); + + rs = statement.executeQuery(); + while (rs.next()) { + WFCMessage.User.Builder builder = WFCMessage.User.newBuilder(); + int index = 1; + String value = rs.getString(index++); + value = (value == null ? "" : value); + builder.setUid(value); + + value = rs.getString(index++); + value = (value == null ? "" : value); + builder.setName(value); + + value = rs.getString(index++); + value = (value == null ? "" : value); + builder.setDisplayName(value); + + value = rs.getString(index++); + value = (value == null ? "" : value); + builder.setPortrait(value); + + value = rs.getString(index++); + value = (value == null ? "" : value); + builder.setMobile(value); + + int gender = rs.getInt(index++); + builder.setGender(gender); + + value = rs.getString(index++); + value = (value == null ? "" : value); + builder.setEmail(value); + + value = rs.getString(index++); + value = (value == null ? "" : value); + builder.setAddress(value); + + value = rs.getString(index++); + value = (value == null ? "" : value); + builder.setCompany(value); + + value = rs.getString(index++); + value = (value == null ? "" : value); + builder.setSocial(value); + + value = rs.getString(index++); + value = (value == null ? "" : value); + builder.setExtra(value); + + int type = rs.getInt(index++); + builder.setType(type); + + int deleted = rs.getInt(index++); + builder.setDeleted(deleted); + + long longValue = rs.getLong(index++); + if(longValue <= 0) + longValue = 1; + builder.setUpdateDt(longValue); + + outList.add(builder.build()); + } + } catch (SQLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + Utility.printExecption(LOG, e, RDBS_Exception); + } finally { + DBUtil.closeDB(connection, statement, rs); + } + return outList; + } + List getAllUsers(int count, int offset) { Connection connection = null; PreparedStatement statement = null; diff --git a/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java b/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java index 8db21c3e..67c31d0d 100755 --- a/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java +++ b/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java @@ -3272,6 +3272,11 @@ public class MemoryMessagesStore implements IMessagesStore { return databaseStore.getUserInfosByEmail(email); } + @Override + public List getUserInfosByMobile(String mobile, boolean includeDeleted) { + return databaseStore.getUserInfosByMobile(mobile, includeDeleted); + } + @Override public List getUserInfoList(int count, int offset) { return databaseStore.getAllUsers(count, offset); diff --git a/broker/src/main/java/io/moquette/spi/IMessagesStore.java b/broker/src/main/java/io/moquette/spi/IMessagesStore.java index 5fc6ed36..eed1e5ab 100755 --- a/broker/src/main/java/io/moquette/spi/IMessagesStore.java +++ b/broker/src/main/java/io/moquette/spi/IMessagesStore.java @@ -154,6 +154,7 @@ public interface IMessagesStore { WFCMessage.User getUserInfoByName(String name); WFCMessage.User getUserInfoByMobile(String mobile); List getUserInfosByEmail(String email); + List getUserInfosByMobile(String mobile, boolean includeDeleted); ErrorCode searchUser(String userId, String keyword, int searchType, int userType, int page, List users); List getUserInfoList(int count, int offset); diff --git a/common/src/main/java/cn/wildfirechat/common/APIPath.java b/common/src/main/java/cn/wildfirechat/common/APIPath.java index f4b5f108..f56531d6 100644 --- a/common/src/main/java/cn/wildfirechat/common/APIPath.java +++ b/common/src/main/java/cn/wildfirechat/common/APIPath.java @@ -43,6 +43,7 @@ public interface APIPath { String User_Get_Info = "/admin/user/get_info"; String User_Batch_Get_Infos = "/admin/user/batch_get_infos"; String User_Get_Email_Info = "/admin/user/get_info_by_email"; + String User_Get_By_Mobile = "/admin/user/get_info_by_mobile"; String User_Get_All = "/admin/user/all"; String User_Get_Robot_Info = "/admin/user/get_robot_info"; String User_Get_All_Robots = "/admin/user/get_all_robots"; diff --git a/sdk/src/main/java/cn/wildfirechat/sdk/Main.java b/sdk/src/main/java/cn/wildfirechat/sdk/Main.java index 1ed03bf8..1ee89de9 100644 --- a/sdk/src/main/java/cn/wildfirechat/sdk/Main.java +++ b/sdk/src/main/java/cn/wildfirechat/sdk/Main.java @@ -196,7 +196,7 @@ public class Main { userInfo.setUserId("userId1"); //用户名,一般是用户登录帐号,也必须保证唯一性。也就是说所有用户的userId必须不能重复,所有用户的name必须不能重复,但可以同一个用户的userId和name是同一个,一般建议userId使用一个uuid,name是"微信号"且可以修改, userInfo.setName("user1"); - userInfo.setMobile("13900000000"); + userInfo.setMobile("13900000001"); userInfo.setDisplayName("user 1"); // 调用SDK创建用户 @@ -277,6 +277,15 @@ public class Main { System.exit(-1); } + // 通过手机号获取用户信息,如果一个手机号码属于多个用户,这里都会返回。 + IMResult resultGetUsers = UserAdmin.getUsersByMobile("13900000001", false); + if (resultGetUsers != null && resultGetUsers.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) { + System.out.println("Get user success"); + } else { + System.out.println("Create user failure"); + System.exit(-1); + } + // 通过用户ID获取用户信息 IMResult resultGetUserInfo3 = UserAdmin.getUserByUserId(userInfo.getUserId()); if (resultGetUserInfo3 != null && resultGetUserInfo3.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) { diff --git a/sdk/src/main/java/cn/wildfirechat/sdk/UserAdmin.java b/sdk/src/main/java/cn/wildfirechat/sdk/UserAdmin.java index 1cd94112..31f4da07 100644 --- a/sdk/src/main/java/cn/wildfirechat/sdk/UserAdmin.java +++ b/sdk/src/main/java/cn/wildfirechat/sdk/UserAdmin.java @@ -70,6 +70,7 @@ public class UserAdmin { /** * 根据手机号获取用户信息(不包含已删除用户) + * @deprecated 用户手机号码不要求唯一,正常应该业务系统保证电话号码唯一。如果业务系统不限制电话号码唯一,可能一个号码有多个用户,此方法只能返回一个,此时建议使用 {@link #getUsersByMobile(String mobile, boolean includeDeleted)} * @param mobile 手机号 * @return 用户信息 * @throws Exception 请求失败时抛出异常 @@ -79,7 +80,8 @@ public class UserAdmin { } /** - * 根据手机号获取用户信息 + * 根据手机号获取用户信息, + * @deprecated 用户手机号码不要求唯一,正常应该业务系统保证电话号码唯一。如果业务系统不限制电话号码唯一,可能一个号码有多个用户,此方法只能返回一个,此时建议使用 {@link #getUsersByMobile(String mobile, boolean includeDeleted)} * @param mobile 手机号 * @param includeDeleted 是否包含已删除的用户 * @return 用户信息 @@ -91,6 +93,19 @@ public class UserAdmin { return AdminHttpUtils.httpJsonPost(path, getUserInfo, InputOutputUserInfo.class); } + /** + * 根据电话号码获取用户信息列表 + * @param mobile 邮箱地址 + * @param includeDeleted 是否包含已删除的用户 + * @return 用户信息列表 + * @throws Exception 请求失败时抛出异常 + */ + public static IMResult getUsersByMobile(String mobile, boolean includeDeleted) throws Exception { + String path = APIPath.User_Get_By_Mobile; + InputGetUserInfo getUserInfo = new InputGetUserInfo(null, null, mobile, includeDeleted); + return AdminHttpUtils.httpJsonPost(path, getUserInfo, OutputUserInfoList.class); + } + /** * 根据邮箱获取用户信息列表 * @param email 邮箱地址