前言
移动端演示 http://8.146.211.120:8081/#/
前面的文章我们主要完成了笔记的点赞和收藏及留言功能 今天我们讲解点赞关注 im 聊天功能
关注
我们需要有一个关注的操作 这里我们复用个人中心页面
按钮会有三种形式 关注 取消关注 互相关注三种样式
<view class="gui-flex gui-align-items-center gui-justify-content-center" >
<button
v-show="author.isFollow"
@tap="cancelfollowAuthor"
type="default"
class="gui-button-mini xhs-border-radius50 xhs-border-white"
style="width:150rpx;margin-right: 20rpx;background: transparent;backdrop-filter: blur(10px);background-color: rgba(255, 255, 255, 0.1);">
<text class="gui-color-white gui-icons">取消关注</text>
</button>
<button
v-show="!author.isFollow&&author.isFollowMe"
@tap="followAuthor"
type="default"
class="gui-button-mini xhs-border-radius50 "
style="width:150rpx;margin-right: 20rpx;background: transparent;backdrop-filter: blur(10px);background-color: #FF3749;">
<text class="gui-color-white gui-icons">回关</text>
</button>
<button
v-show="!author.isFollow&&!author.isFollowMe"
@tap="followAuthor"
type="default"
class="gui-button-mini xhs-border-radius50 "
style="width:150rpx;margin-right: 20rpx;background: transparent;backdrop-filter: blur(10px);background-color: #FF3749;">
<text class="gui-color-white gui-icons">关注</text>
</button>
关注和点赞功能实现原理大致相同 只不过有一个互相关注
后台先创建一个关注表
CREATE TABLE `business_follow` (
`ID` varchar(32) NOT NULL,
`AUTHOR_ID` varchar(32) DEFAULT NULL COMMENT '被关注id',
`AUTHOR_NAME` varchar(255) DEFAULT NULL COMMENT '被关注名字',
`FOLLOW_ID` varchar(32) DEFAULT NULL COMMENT '关注者',
`FOLLOW_NAME` varchar(255) DEFAULT NULL COMMENT '关注者名字',
`CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='关注表';
关注人id 被关注人id 关注时间 有这三个就能基本实现
点击关注 插入 authorId对方id followId为当前登录人id
但是此时要注意
当你查询粉丝列表时 select xx from business_follow where AUTHOR_ID = #{当前登录人}
这样还不行 因为只查询到了粉丝列表
所以需要加一个子查询 我是否关注了对方 这样才能实现互关效果
<!-- 查询关注我的所有列表信息 并在查询的时候设置子查询 查询当前用户作为关注者的时候有没有关注对方-->
<select id="selectFollowMeList" resultType="com.dd.admin.business.follow.domain.FollowVo">
SELECT
b.AUTHOR_ID,
b.AUTHOR_NAME,
b.AVATAR_URL,
b.DESCRIPTION,
(
SELECT
count(1)
FROM
business_follow
WHERE
follow_id = #{targetId}
AND author_id = b.AUTHOR_ID
) AS isFollow
,
(
SELECT
count(1)
FROM
business_follow
WHERE
follow_id = b.AUTHOR_ID
AND author_id = #{targetId}
) AS isFollowMe
FROM
business_follow a
LEFT JOIN business_author b ON a.follow_id = b.author_id
WHERE
1 = 1
AND a.AUTHOR_ID = #{authorId}
ORDER BY
a.create_time DESC
</select>
有了用户关系 下一步就可以进行聊天了
这是我的聊天记录列表 由于没有通讯录
此列表查询的是所有跟你聊过天的人的列表
下面我们从后台 搭建im 服务器 这里我使用的是tio
pom 加上tio的依赖
<dependency>
<groupId>org.t-io</groupId>
<artifactId>tio-websocket-spring-boot-starter</artifactId>
<!--此版本号跟着tio主版本号一致即可-->
<version>3.3.2.v20190601-RELEASE</version>
</dependency>
配置类
package com.dd.admin.business.webSocket;
import com.alibaba.fastjson.JSON;
import com.dd.admin.common.utils.AddressUtils;
import com.dd.admin.common.utils.IPUtils;
import com.dd.admin.common.utils.StringUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.tio.core.ChannelContext;
import org.tio.core.Tio;
import org.tio.http.common.HttpRequest;
import org.tio.http.common.HttpResponse;
import org.tio.utils.lock.SetWithLock;
import org.tio.websocket.common.WsRequest;
import org.tio.websocket.server.handler.IWsMsgHandler;
import org.tio.websocket.starter.TioWebSocketServerBootstrap;
import javax.annotation.PostConstruct;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
@Component
public class MyWebSocketMsgHandler implements IWsMsgHandler {
MyWebSocketMsgHandler handler;
private static Logger log = LoggerFactory.getLogger(MyWebSocketMsgHandler.class);
@PostConstruct
public void init() {
handler = this;
}
@Autowired
public TioWebSocketServerBootstrap bootstrap;
@Autowired
Map<String, MsgHandlerInterface> handlerInterfaceMap;
@Override
public HttpResponse handshake(HttpRequest request, HttpResponse httpResponse, ChannelContext channelContext) throws Exception {
String authorId = request.getParam("authorId");
String authorName = request.getParam("authorName");
Tio.bindUser(channelContext,authorId);
String ipAddr = request.getClientIp();
String realAddress = AddressUtils.getRealAddress(ipAddr);
System.out.println(authorId+":进入了Tio id:"+authorId+" ip:"+ ipAddr);
SetWithLock<ChannelContext> channelContexts = Tio.getAllChannelContexts(bootstrap.getServerGroupContext());
Set<ChannelContext> contextList = channelContexts.getObj();
System.out.println("当前在线用户:");
for(ChannelContext context:contextList){
System.out.println(context.userid+"\t");