news 2026/3/26 9:10:14

easychat项目复盘---获取联系人列表,联系人详细,删除拉黑联系人

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
easychat项目复盘---获取联系人列表,联系人详细,删除拉黑联系人

1.获取联系人列表

效果展示:

思路:联系人不至于用户,还有群聊,所以传参思路很明确了不仅需要当前用户id,还需要查询类型(即我的好友为用户 我的群聊是群组)

controller层:

@RequestMapping("/loadContact") @GlobalInterceptor public ResponseVO loadContact(HttpServletRequest request, @NotEmpty String contactType) { UserContactTypeEnum contactTypeEnum = UserContactTypeEnum.getByName(contactType); if (null == contactTypeEnum) { throw new BusinessException(ResponseCodeEnum.CODE_600); } TokenUserInfoDto tokenUserInfoDto = getTokenUserInfo(request); UserContactQuery contactQuery = new UserContactQuery(); contactQuery.setUserId(tokenUserInfoDto.getUserId()); contactQuery.setContactType(contactTypeEnum.getType()); if (UserContactTypeEnum.USER == contactTypeEnum) { contactQuery.setQueryContactUserInfo(true); } else if (UserContactTypeEnum.GROUP == contactTypeEnum) { contactQuery.setQueryGroupInfo(true); contactQuery.setExcludeMyGroup(true); } contactQuery.setOrderBy("last_update_time desc"); List<UserContact> contactList = userContactService.findListByParam(contactQuery); return getSuccessResponseVO(contactList); }

解释:写法不唯一,如果前端不传入contactType时,就需要后端自己分类,会比较耗费时间,所以前端传入contactType是最优解(前端展示是区分的,即上述图片两个区域分别调用了loadContact方法 但是传入的contactType分别为用户与群组,所以就不需要而外再区分用户与群组的方法)

<select id="selectList" resultMap="base_result_map"> SELECT c.* <if test="query.queryContactUserInfo or query.queryUserInfo"> ,u.nick_name contactName,u.sex sex </if> <if test="query.queryGroupInfo"> ,g.group_name contactName </if> FROM user_contact c <if test="query.queryContactUserInfo"> inner join user_info u on c.contact_id=u.user_id </if> <if test="query.queryUserInfo"> inner join user_info u on c.user_id=u.user_id </if> <if test="query.queryGroupInfo"> inner join group_info g on c.contact_id=g.group_id <if test="query.excludeMyGroup"> and g.group_owner_id!=c.user_id </if> </if> <include refid="query_condition"/> <if test="query.orderBy!=null"> order by ${query.orderBy} </if> <if test="query.simplePage!=null"> limit #{query.simplePage.start},#{query.simplePage.end} </if> </select>

这部分用来解释controller中代码为什么要set那么多true,因为公用一个方法,所以在查询中要区分是查询用户还是群组,有个简单的方法就是直接重构此方法变成两个方法,但是此写法也是mybatis常用写法,只需要在相对于的类中添加boolean类即可,然后在xml文件使用if搭配join就可以达到想要的数据

2.获取联系人详细

效果展示:

思路:从聊天页面点击别人头像就是这个接口,所以需要当前用户id与对象的id是显而易见的 这接口实现简单

controller层:

@RequestMapping("/getContactInfo") @GlobalInterceptor public ResponseVO getContactInfo(HttpServletRequest request, @NotEmpty String contactId) { TokenUserInfoDto tokenUserInfoDto = getTokenUserInfo(request); UserInfo userInfo = userInfoService.getUserInfoByUserId(contactId); UserInfoVO userInfoVO = CopyTools.copy(userInfo, UserInfoVO.class); userInfoVO.setContactStatus(UserContactStatusEnum.NOT_FRIEND.getStatus()); //判断是否是联系人 UserContact userContact = userContactService.getUserContactByUserIdAndContactId(tokenUserInfoDto.getUserId(), contactId); if (userContact != null) { userInfoVO.setContactStatus(userContact.getStatus()); } return getSuccessResponseVO(userInfoVO); }

3.删除联系人

思路:删除联系人不只有直接删除,还有拉黑的状态,所以需要传入删除的类型,所以需要当前用户id,对象,和删除类型

展示:

controller层:

@RequestMapping("/delContact") @GlobalInterceptor public ResponseVO delContact(HttpServletRequest request, @NotEmpty String contactId) { TokenUserInfoDto tokenUserInfoDto = getTokenUserInfo(request); userContactService.removeUserContact(tokenUserInfoDto.getUserId(), contactId, UserContactStatusEnum.DEL); return getSuccessResponseVO(null); }

实现层思路:主要是要修改两次user_contact表 因为互为好友 实现简单不贴代码

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!