膳逸:查询已关注的用户,并根据昵称首字母或拼音首字母排序

查询已关注用户功能实现报告

目标

实现一个查询已关注用户的功能,具体流程如下:

  1. 根据用户ID查询已关注的用户ID。
  2. 根据已关注的用户ID查询用户信息。
  3. 按照置顶排序和昵称首字母或拼音首字母排序返回前端。

逻辑要求

  1. 根据用户ID查询已关注的用户ID。
  2. 根据已关注的用户ID查询用户信息。
  3. 按照置顶排序和昵称首字母或拼音首字母排序返回前端。
  4. 置顶用户优先显示。
  5. 昵称为空或不符合字母规则的用户归类到“#”分类。

开发思路

1. 查询已关注的用户ID

首先,根据用户ID查询用户关注表user_follow中的已关注用户ID。

2. 查询用户信息

根据已关注的用户ID,从用户信息表user_info中查询用户的详细信息。

3. 排序逻辑

  1. 初始化结果集,包含从A到Z的字母分类和一个“#”分类。
  2. 遍历查询到的用户信息,根据用户的置顶状态和昵称首字母或拼音首字母进行分类。
  3. 置顶用户单独分类。
  4. 昵称为空或不符合字母规则的用户归类到“#”分类。

详细实现

使用的依赖

在项目中使用了pinyin4j库来处理中文字符的拼音转换。添加以下依赖到pom.xml文件中:

<dependency>
    <groupId>com.belerweb</groupId>
    <artifactId>pinyin4j</artifactId>
    <version>2.5.1</version>
</dependency>

获取拼音首字母的代码

import net.sourceforge.pinyin4j.PinyinHelper;

// Method to get the pinyin first letter of a Chinese character
private static String getPinyinFirstLetter(char chineseCharacter) {
    try {
        // 提取字符的首字母
        String[] pinyinArray = PinyinHelper.toHanyuPinyinStringArray(chineseCharacter);
        return String.valueOf(pinyinArray[0].charAt(0)).toUpperCase();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}
代码解析
  1. String[] pinyinArray = PinyinHelper.toHanyuPinyinStringArray(chineseCharacter); 获取汉字的拼音数组。
  2. return String.valueOf(pinyinArray[0].charAt(0)).toUpperCase(); 返回拼音的首字母并转换为大写。
  3. 捕获异常并返回null。

查询已关注用户的代码

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.Valid;
import java.util.*;

@PostMapping("/searchFollowUser")
@SaCheckLogin
public R searchFollowUser(@RequestBody @Valid SearchFollowUserForm form) {
    Map param = BeanUtil.beanToMap(form);
    ArrayList<HashMap> list = userService.searchFollowUser(param);

    Map<String, List<Map<String, Object>>> result = new HashMap<>();

    // Initialize the result map with keys from A to Z and #
    result.put("pin", new ArrayList<>());
    for (char c = 'A'; c <= 'Z'; c++) {
        result.put(String.valueOf(c), new ArrayList<>());
    }
    result.put("#", new ArrayList<>());

    for (HashMap<String, Object> map : list) {
        Integer pin = (Integer) map.get("pin");
        if (pin == 1){
            result.get("pin").add(map);
            continue;
        }
        String nickName = (String) map.get("nick_name");
        if (nickName != null && !nickName.isEmpty()) {
            char firstChar = nickName.charAt(0);
            String key;

            // Check if the first character is a letter
            if (String.valueOf(firstChar).matches("[A-Za-z]")) {
                key = String.valueOf(firstChar).toUpperCase();
            } else {
                // Convert Chinese character to pinyin first letter
                key = getPinyinFirstLetter(firstChar);

                if (key == null || !key.matches("[A-Za-z]")) {
                    key = "#";
                }
            }

            result.get(key).add(map);
        } else {
            // Handle cases where nick_name is null or empty
            result.get("#").add(map);
        }
    }

    return R.ok().put("result", result);
}
代码解析
  1. Map param = BeanUtil.beanToMap(form); 将表单数据转换为Map。
  2. ArrayList<HashMap> list = userService.searchFollowUser(param); 查询已关注的用户信息。
  3. 初始化结果集,包含从A到Z的字母分类和一个“#”分类。
  4. 遍历查询到的用户信息,根据用户的置顶状态和昵称首字母或拼音首字母进行分类。
  5. 置顶用户单独分类。
  6. 昵称为空或不符合字母规则的用户归类到“#”分类。

数据库表结构

用户关注表 user_follow

-- ----------------------------
-- Table structure for user_follow
-- ----------------------------
DROP TABLE IF EXISTS `user_follow`;
CREATE TABLE `user_follow` (
    `id` int NOT NULL AUTO_INCREMENT COMMENT '主键,自增长',
    `user_id` int NULL DEFAULT NULL COMMENT '外键,关联用户信息表',
    `follow_user_id` int NULL DEFAULT NULL COMMENT '外键,关联用户信息表',
    `pin` tinyint NULL DEFAULT 0 COMMENT '置顶,0为未置顶,1为置顶。默认为0',
    PRIMARY KEY (`id`) USING BTREE
);

用户信息表 user_info

CREATE TABLE `user_info` (
    `uuid` char(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'UUID,当做用户信息卡的编号',
    `name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '姓名',
    `sex` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '性别',
    `phone` char(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '手机号码',
    `email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '电子邮箱',
    `birthday` date NULL DEFAULT NULL COMMENT '出生日期',
    `address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '居住地址',
    `height` varchar(4) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '身高(m),格式1.83'
);

膳逸

Base URLs:

Authentication

shanyi-api

POST 查询已关注的用户

POST /user/searchFollowUser

根据userId查询follow_user_id,再找出user和user_info中的信息,按照置顶排序和昵称首字母或拼音首字母排序返回前端,pin类为置顶。

Body 请求参数

{
  "userId": "4",
  "nickName": "",
  "name": ""
}

请求参数

名称位置类型必选说明
tokenheaderstringnone
bodybodyobjectnone
» userIdbodystringnone
» nickNamebodystringnone
» namebodystringnone

返回示例

成功

{
  "msg": "success",
  "result": {
    "A": [],
    "B": [
      {
        "birthday": "2003-11-01",
        "address": "广东省佛山市",
        "goal": "考",
        "create_time": "2024-04-29",
        "sex": "男",
        "weight": "55.0",
        "diseases": [
          "蚕豆病"
        ],
        "dislikes": [
          "酸菜角"
        ],
        "avatar": "https://thirdwx.qlogo.cn/mmopen/vi_32/6ibtnStKibXDUTibnu052w40ps0DKqcUZBYaAiberiasgSsTGXwCLAicmXng2gE48ZnibYrmnPIiaVlNWjpCYiby85ibgM8Q/132",
        "follow_user_id": 5,
        "pin": 0,
        "user_id": 4,
        "phone": "1362**",
        "nick_name": "绊象",
        "name": "陈**",
        "id": 5,
        "email": "253**@qq.com",
        "status": 1,
        "height": "1.78",
        "bmi": "17.36",
        "likes": [
          "番茄炒鸡蛋"
        ]
      }
    ],
    "C": [],
    "D": [],
    "E": [],
    "F": [],
    "G": [],
    "H": [],
    "I": [],
    "J": [],
    "K": [],
    "L": [
      {
        "birthday": "1901-01-01",
        "address": "山东济南",
        "goal": "增肌",
        "sex": "男",
        "weight": "80.2",
        "diseases": [],
        "dislikes": [
          "湘菜"
        ],
        "avatar": "https://thirdwx.qlogo.cn/mmopen/vi_32/5icHNmy3LXpUEY3JHKrm4P0twqobiaYuemvXr4s6aK2rJKQ7RkVOaPw4nRSkEfwErCIzkSUyvibFicJ37IA5Yppumg/132",
        "follow_user_id": 3,
        "pin": 0,
        "user_id": 4,
        "phone": "155***",
        "nick_name": "LHPlanet",
        "name": "李**",
        "id": 3,
        "email": "752**@qq.com",
        "status": 1,
        "height": "1.94",
        "bmi": "21.31",
        "likes": [
          "大米"
        ]
      }
    ],
    "M": [],
    "N": [],
    "O": [],
    "P": [],
    "Q": [],
    "R": [],
    "S": [],
    "pin": [],
    "T": [],
    "U": [],
    "V": [],
    "W": [],
    "X": [],
    "Y": [],
    "Z": [],
    "#": []
  },
  "code": 200
}

返回结果

状态码状态码含义说明数据模型
200OK成功Inline

返回数据结构

状态码 200

名称类型必选约束中文名说明
» codeintegertruenonenone
» msgstringtruenonenone
» resultobjecttruenonenone
»» A[string]truenonenone
»» B[object]truenonenone
»»» birthdaystringfalsenonenone
»»» addressstringfalsenonenone
»»» goalstringfalsenonenone
»»» create_timestringfalsenonenone
»»» sexstringfalsenonenone
»»» weightstringfalsenonenone
»»» diseases[string]falsenonenone
»»» dislikes[string]falsenonenone
»»» avatarstringfalsenonenone
»»» follow_user_idintegerfalsenonenone
»»» pinintegerfalsenonenone
»»» user_idintegerfalsenonenone
»»» phonestringfalsenonenone
»»» nick_namestringfalsenonenone
»»» namestringfalsenonenone
»»» idintegerfalsenonenone
»»» emailstringfalsenonenone
»»» statusintegerfalsenonenone
»»» heightstringfalsenonenone
»»» bmistringfalsenonenone
»»» likes[string]falsenonenone
»» C[string]truenonenone
»» D[string]truenonenone
»» E[string]truenonenone
»» F[string]truenonenone
»» G[string]truenonenone
»» H[string]truenonenone
»» I[string]truenonenone
»» J[string]truenonenone
»» K[string]truenonenone
»» L[object]truenonenone
»»» birthdaystringfalsenonenone
»»» addressstringfalsenonenone
»»» goalstringfalsenonenone
»»» sexstringfalsenonenone
»»» weightstringfalsenonenone
»»» diseases[string]falsenonenone
»»» dislikes[string]falsenonenone
»»» avatarstringfalsenonenone
»»» follow_user_idintegerfalsenonenone
»»» pinintegerfalsenonenone
»»» user_idintegerfalsenonenone
»»» phonestringfalsenonenone
»»» nick_namestringfalsenonenone
»»» namestringfalsenonenone
»»» idintegerfalsenonenone
»»» emailstringfalsenonenone
»»» statusintegerfalsenonenone
»»» heightstringfalsenonenone
»»» bmistringfalsenonenone
»»» likes[string]falsenonenone
»» M[string]truenonenone
»» N[string]truenonenone
»» O[string]truenonenone
»» P[string]truenonenone
»» Q[string]truenonenone
»» R[string]truenonenone
»» S[string]truenonenone
»» pin[string]truenonenone
»» T[string]truenonenone
»» U[string]truenonenone
»» V[string]truenonenone
»» W[string]truenonenone
»» X[string]truenonenone
»» Y[string]truenonenone
»» Z[string]truenonenone
»» #[string]truenonenone

数据模型

结论

通过上述代码实现了查询已关注用户的功能,确保了用户信息的准确性和排序的合理性。具体好处如下:

  • 准确性:根据用户ID查询已关注的用户ID,并从用户信息表中获取详细信息,确保数据的准确性。
  • 排序合理性:按照置顶状态和昵称首字母或拼音首字母进行分类和排序,确保用户信息的展示顺序合理。
  • 用户体验:通过分类展示已关注的用户信息,提升用户体验。
  • 可维护性:清晰的代码结构和详细的注释,便于后续维护和扩展。
  • 扩展性:使用pinyin4j库处理中文字符的拼音转换,便于后续扩展和修改。

通过这些好处,可以确保查询已关注用户功能的准确、合理和易用,满足用户和系统的需求。

  • 15
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值