⽤Springboot&WebScoket再造⼀个类似的聊天⼩程序
(附源码)
基于Springboot和WebScoket写的⼀个⼩程序
项⽬说明
此项⽬为⼀个聊天的⼩demo,采⽤springboot+websocket+vue开发。
其中有⼀个接⼝为添加好友接⼝,添加好友会判断是否已经是好友。
聊天的时候:A给B发送消息如果B的聊天窗⼝不是A,则B处会提醒A发来⼀条消息。
聊天内容的输⼊框采⽤layui的富⽂本编辑器,⽬前不⽀持回车发送内容。
聊天可以发送图⽚,图⽚默认存储在D:/chat/⽬录下。
点击聊天内容中的图⽚会弹出预览,这个预览弹出此条消息中的所有图⽚。
在发送语⾳的时候,语⾳默认发送给当前聊天窗⼝的⽤户,所以录制语⾳的时候务必保证当前聊天窗⼝有选择的⽤户。
知道⽤户的账号可以添加好友,⽬前是如果账号存在,可以直接添加成功
⽼规矩,还是先看看项⽬的⽬录结构:
⼀、先引⼊pom⽂件
这⾥就只放了⼀点点代码(代码太长了)
<dependency>            <groupId>commons-io</groupId>            <artifactId>commons-io</artifactId>            <version>2.4</version>        </dependency>    ⼆、创建对应的yml配置⽂件
spring:
profiles:
active: prod
spring:
datasource:    username: root    password: root    url: jdbc:mysql://localhost:3306/chat?useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL    driver-class-name: sql.jdbc.Driver    #指定数据源    type: com.alibaba.druid.pool.DruidDataSource
# 数据源其他配置    initialSize: 5
minIdle: 5
maxActive: 20
maxWait: 60000
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
#  配置监控统计拦截的filters,去掉后监控界⾯sql⽆法统计,'wall'⽤于防⽕墙
filters: stat,log4j    maxPoolPreparedStatementPerConnectionSize: 20
useGlobalDataSourceStat: true
connectionProperties: Sql=true;druid.stat.slowSqlMillis=500
thymeleaf:    suffix: .html    prefix:      classpath: /templates/    cache: false
jackson: #返回的⽇期字段的格式    date-format: yyyy-MM-dd HH:mm:ss
spring到底是干啥的time-zone: GMT+8
serialization:      write-dates-as-timestamps: false # true 使⽤时间戳显⽰时间
http:    multipart:      max-file-size: 1000Mb
max-request-size: 1000Mb
#配置⽂件式开发mybatis:  #全局配置⽂件的位置  config-location: classpath:l
#所有sql映射配置⽂件的位置  mapper-locations: classpath:mybatis/mapper/**/*.xmlserver:  session:    timeout: 7200
三、创建实体类
这⾥就不再多说了,有 Login,Userinfo,ChatMsg,ChatFriends
四、创建对应的mapper(即dao层)还有对应的mapper映射⽂件
(这⾥就举出了⼀个,不再多说)
public interface ChatFriendsMapper {
//查询所有的好友
List<ChatFriends> LookUserAllFriends(String userid);
//插⼊好友
void InsertUserFriend(ChatFriends chatFriends);
//判断是否加好友
Integer JustTwoUserIsFriend(ChatFriends chatFriends);
//查询⽤户的信息
Userinfo LkUserinfoByUserid(String userid);
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-////DTD Mapper 3.0//EN" "/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.chat.mapper.ChatFriendsMapper">
<select id="LookUserAllFriends" resultType="com.chat.bean.ChatFriends" parameterType="java.lang.String">
select userid,nickname,uimg from userinfo where userid in (select a.fuserid from chat_friends a where a.userid=#{userid})    </select>    <insert id="InsertUserFriend" parameterType="com.chat.bean.ChatFriends">
insert into chat_friends (userid, fuserid) value (#{userid},#{fuserid})    </insert>
<select id="JustTwoUserIsFriend" parameterType="com.chat.bean.ChatFriends" resultType="java.lang.Integer">
select id from chat_friends where userid=#{userid} and fuserid=#{fuserid}    </select>
<select id="LkUserinfoByUserid" parameterType="java.lang.String" resultType="com.chat.bean.Userinfo">
select * from userinfo where userid=#{userid}    </select>
</mapper>
五、创建对应的业务类(即service)
(同样的业务层这⾥也就指出⼀个)
@Service
public class ChatFriendsService {
@Autowired
ChatFriendsMapper chatFriendsMapper;    public List<ChatFriends> LookUserAllFriends(String userid){
return chatFriendsMapper.LookUserAllFriends(userid);
}    public void InsertUserFriend(ChatFriends chatFriends){
chatFriendsMapper.InsertUserFriend(chatFriends);    }    public Integer JustTwoUserIsFriend(ChatFriends chatFriends){
return chatFriendsMapper.JustTwoUserIsFriend(chatFriends);
}    public Userinfo LkUserinfoByUserid(String userid){
return chatFriendsMapper.LkUserinfoByUserid(userid);
}}
六、创建对应的控制器
这⾥再说说项⽬的接⼝
1. /chat/upimg
聊天图⽚上传接⼝
2. /chat/lkuser
这个接⼝⽤来添加好友的时候:查询⽤户,如果⽤户存在返回⽤户信息,如果不存在返回不存在
3. /chat/adduser/
这个接⼝是添加好友接⼝,会判断添加的好友是否是⾃⼰,如果添加的好友已经存在则直接返回
4. /chat/ct
跳转到聊天界⾯
5. /chat/lkfriends
查询⽤户的好友
6. /chat/lkuschatmsg/
这个接⼝是查询两个⽤户之间的聊天信息的接⼝,传⼊⽤户的userid,查询当前登录⽤户和该⽤户的聊天记录。
7. /chat/audio
这个接⼝是Ajax上传web界⾯js录制的⾳频数据⽤的接⼝
(同样就只写⼀个)
@Controller
public class LoginCtrl {
@Autowired
LoginService loginService;    @GetMapping("/")
public String tologin(){
return "user/login";
}    /**
* 登陆
* */
@PostMapping("/justlogin")
@ResponseBody
public R login(@RequestBody Login login, HttpSession session){
login.setPassword(Md5Util.Password()));        String userid = loginService.justLogin(login);        if(userid==null){            ().message("账号或者密码错误");
}        session.setAttribute("userid",userid);
return R.ok().message("登录成功");
}}
七、创建对应的⼯具类以及⾃定义异常类
1. 表情过滤⼯具类
public class EmojiFilter {
private static boolean isEmojiCharacter(char codePoint) {
return (codePoint == 0x0) || (codePoint == 0x9) || (codePoint == 0xA)
|| (codePoint == 0xD)
|| ((codePoint >= 0x20) && (codePoint <= 0xD7FF))
|| ((codePoint >= 0xE000) && (codePoint <= 0xFFFD))
|| ((codePoint >= 0x10000) && (codePoint <= 0x10FFFF));
}    @Test
public void testA(){
String s = EmojiFilter.filterEmoji("您好:smile:,你好啊");
System.out.println(s);    }
1. Md5数据加密类
static String[] chars = {"0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"};
/**
* 将普通字符串⽤md5加密,并转化为16进制字符串
* @param str
* @return
*/
public static String StringInMd5(String str) {        // 消息签名(摘要)
MessageDigest md5 = null;        try {            // 参数代表的是算法名称
md5 = Instance("md5");
byte[] result = md5.Bytes());            StringBuilder sb = new StringBuilder(32);
// 将结果转为16进制字符  0~9 A~F
for (int i = 0; i < result.length; i++) {
// ⼀个字节对应两个字符
byte x = result[i];                // 取得⾼位
int h = 0x0f & (x >>> 4);
// 取得低位
int l = 0x0f & x;
sb.append(chars[h]).append(chars[l]);            }            String();
} catch (NoSuchAlgorithmException e) {            throw new RuntimeException(e);        }    }
1. 测试数据加密类

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。