前端新人们,这个聊天全栈项目不能错过,支持群聊和群音视频!

better-chat

vite react typescript express mysql

websocket webrtc

1、项目介绍

1.1 项目概括

本项目是一个前端基于vitereactts,后端基于expressmysql,并依赖websocketwebrtc实现的局域网实时聊天全栈项目,且持续开源和维护

先放在开头:

🚀 项目Github地址:https://github.com/XC0703/better-chat

👉 项目演示视频地址:https://www.bilibili.com/video/BV1mi421C7Ym

🔨 项目说明文档掘金地址:https://juejin.cn/post/7362756601726746663

(希望各位看官给新人 up 主一键三连 + 给本菜鸡的项目点个 star⭐,不胜感激。)

1.2 为什么要开发这个项目?

先写在前面:本项目是个人学习过程中开发的项目,功能简单、界面简洁,各方面的考虑较为粗糙,适合正在练习上述技术栈的小白进行学习和巩固,代码量极少且逻辑清晰。(大佬勿喷)
注意:本人后面计划整理出项目核心功能的开发教程,发表在本人的掘金博客上,确保对上述技术栈几乎陌生的小白,跟着教程也完全可以从 0 到 1 实现项目。因此希望各位同学点点关注。

1.3 谁需要这个项目?

本项目适合以下同学:

  • 学习了vitereactts等技术栈而没有找到一个好的项目进行实践。

  • 想不局限于前端,希望了解后端一些基本知识应用的同学。(如果有写JavaGo等语言的后端同学需要找项目进行实践,也可对该项目的后端用Java进行重构升级,目前的项目后端部分只是为前端提供了简单服务而已,很多东西没有考虑到。)

  • 想扩展自己的技术视野,了解 websocketwebrtc 等知识的基本应用的同学。

  • 想提高自己的代码能力、工程能力的同学:

    • 该系统主要可以分为三个模块共40个功能点,系统结构如下图所示:
      alt

    • 工作量展示如下(已排除引用的第三方代码):

      前端 后端 其它 总
      代码行数 11482 4093 1336 16911
    • 同时,本项目的开发严格进行了工程化配置,前后进行了十次代码治理,降低系统“屎山代码”发生的可能性:
      altalt

  • 找实习、正式的校招前端同学,正在为简历上没有好的项目而苦恼(B 站大学的很多免费项目都是些烂大街的后台管理系统、仿 XX 商城等,面试官都看腻了)。本项目是本人校招时简历上的个人项目之一,伴随着本人校招拿到了阿里、美团、华为、OPPO 等七个中大厂 offer。本人亲测,该项目的存在会让面试官与你的可聊点变多,让你在千篇一律的简历海中脱颖而出,增加面试通过率。

1.4 项目亮点?

  • 使用 ESLint+Prettier+Husky+Commitlint+Lint-staged 等工具统一代码和 Git 提交规范,较为完备的前端工程化配置。
  • 项目目录结构合理、清晰,组件和方法抽象程度高,代码耦合度低,且配备较为完善的文档说明。
  • 依赖React Router和高阶组件实现了前端路由系统,包含路由配置、路由守卫、路由重定向等功能,且结合JWT实现鉴权。
  • 借助 MySQLExpress 完成了 7 张表、25 个接口的设计与开发,锻炼全栈能力。
  • 基于 WebSocket 协议、WebRTC 协议实现了局域网通信和音视频通话功能,且支持群聊和群音视频。
  • 实现了本地文件系统,针对大文件传输场景,作出分片上传处理。

1.5 一定要从 0 到 1 实现一次本项目吗?

先说回答:不是。上面提到本项目的功能点众多,工作量不少,如果从 0 到 1实现一次本项目固然收获不少,但对于部分基础好的同学来说太耗时了,也没有必要这样做。本人认为,了解本项目的架构以及核心功能的实现逻辑即可,然后对项目进行二次开发,即完成下面所提到的待完成功能会收获更大。

1.5.1 本项目的核心功能

  • 前端路由系统(React Router的实践)
  • 登录鉴权(jwt鉴权的实践)
  • 建立聊天(websocket的实践)
  • 音视频通话(借助websocket完成webrtc连接建立需要的一些信令交互)
  • 文件上传(本地文件系统的实现)

1.5.2 本项目后续待完成的功能

  • 增加其它功能模块或者为现有的功能模块增加其它CRUD操作,如删除好友、删除分组、退出群聊、群成员管理、好友分组管理等。
  • 完善本地文件系统,优化文件分片上传,增加断点续传、秒传、重试机制:
    • 目前项目的文件上传主要用于两处:1、个人/群聊头像上传;2、图片/视频/文件等类型消息的发送。
    • 目前的本地文件系统这块实现较为草率,只实现了最基本的大文件分片上传,且存在很多问题(大图片/视频信息发送会失败、较大较复杂文件会丢失信息乱码等)。
    • 代码里对于文件上传这块涉及的部分书写了TODO,可直接上手完善相关代码,完成后将是一个比较大的亮点:
      alt
  • 完善项目的websocket心跳重连机制,保证持续连接。
  • 前端引入MobX等库进行状态管理,后端进一步利用Redis等缓存进行性能优化。
  • 借助electron打包成桌面应用。
  • 租借云服务器,利用docker进行部署、实现外网通信。

1.6 项目运行截图

1.6.1 用户模块

登录界面:
alt

注册界面:
alt

修改个人信息:
alt

修改密码:
alt

1.6.2 好友模块

好友列表展示、好友信息展示及修改:
alt

查询并添加好友:
alt

1.6.3 聊天模块

群聊列表展示、群聊信息展示及修改:
alt

创建群聊:
alt
alt

聊天界面:
alt

图片消息预览:
alt

视频消息预览:
alt

对好友发起语音通话:
alt

对群友发起语音通话:
alt

好友收到语音通话:
alt

群友收到语音通话:
alt

与好友语音通话中:
alt

与群友语音通话中:
alt

对好友发起视频通话:
alt

对群友发起视频通话:
alt

好友收到视频通话:
alt

群友收到视频通话:
alt

与好友视频通话中:
alt

与群友视频通话中:
alt
alt

2、项目开发教程

2.1 项目如何启动?

  1. 先拉取本项目到本地:

    git clone **********:XC0703/better-chat.git
    
  2. VScode等编辑器打开本项目(无论是用VSCode还是WebStorm进行开发,请提前安装好并配置启用两个插件:ESLintPrettier,用于代码检查与代码格式化。)

  3. 下载根目录下的依赖:

    pnpm install
    
  4. 启动服务端:

    cd server
    
    pnpm install
    
    pnpm start
    
  5. 启动客户端:

    cd client
    
    pnpm install
    
    pnpm start
    
  6. 此时浏览器会自动打开项目页面

注意:

  1. 项目启动前,先确定本地电脑已经配备好相关环境(nodemysqlredispnpm等),推荐用navicat作为数据库管理软件(在里面新建本项目的数据库),用redis desktop manager作为redis管理软件。

    需要先全局安装pnpm,安装命令为:

    npm install -g pnpm

    其中关于为什么用pnpm不用npm或者yarn命令,参考博客:关于现代包管理器的深度思考——为什么现在我更推荐 pnpm 而不是 npm/yarn?

    数据库安装相关:

    1、MySQL8.0.26 安装配置教程 (windows 64 位):https://blog.csdn.net/weixin_52270997/article/details/120066948
    2、Navicat Premium v12.1.9 破解版 _x86_x64:https://blog.csdn.net/juanjuan_01/article/details/84102349
    3、Navicat Premium 基本使用:https://blog.csdn.net/Yangchenju/article/details/80633055

    Redis 安装相关:

    1、Redis 下载和安装(Windows 系统)参考链接:http://c.biancheng.net/redis/windows-installer.html (注意:在执行redis-server.exe --service-start前要把客户端启动关掉,否则端口会被占用)
    2、windows 免费安装 redis desktop manager(上 github 找到免费版最新的是 2018 年的,可以直接下载 exe 执行程序):https://github.com/uglide/RedisDesktopManager/releases/tag/0.9.3

  2. 本项目的数据库配置如下:(见server\config.json文件,根据自己的实际情况作出更改)

    {
    	"host": "127.0.0.1",
    	"port": 3306,
    	"user": "root",
    	"password": "123456",
    	"database": "better-chat"
    }
    

    a. 首先用下面的命令或者Navicat Premium等工具建好数据库: (注意:在 MySQL 中,通常使用反引号来包围数据库、表或列名,特别是当它们包含特殊字符或关键字时。)

    mysql -u root -p
    
    CREATE DATABASE `better-chat`;
    

    b. 然后可以用source命令或者Navicat Premium等工具运行项目下的better-chat.sql文件,方便可以在本地数据库增加一些模拟数据,同时由于静态资源存储在本地没有上传到仓库,所以需要显示的文件会呈现兜底样式,不会报错。(注意:此步可不进行,保持数据库原始空白状态。)

  3. 作者本人的环境配置:

    node:v18.20.2

    npm:v10.5.0

    pnpm:v8.14.3

    mysql:v8.0.29

    redis:v5.0.14

注意:如果项目运行过程中有任何问题,欢迎给项目提交issue,本人尽量第一时间解决。

2.2 具体教程

上面提到本项目的亮点有较为完备的前端工程化配置,项目目录结构合理、清晰,组件和方法抽象程度高、代码耦合度低、文档完善。因此大部分有一点前端基础的同学直接运行并阅读项目源码即可了解整体的架构和具体的功能逻辑,可以很快对项目进行从 0 到 1 复现或者二次开发

2.2.1 项目整体架构

系统的状态变化如图所示:
alt

项目的前端架构如图所示:
alt

项目的后端架构如图所示:
alt

2.2.2 源码目录介绍

前端项目目录介绍
alt

前端项目入口文件为 client\src,主要看这里面即可:

  • assets 文件夹主要存放一些静态资源文件,如图片、图标、表情包、全局样式等
  • components 文件夹主要存放公共组件,如各种弹窗组件、聊天框组件等
  • config 文件夹主要存放服务器相关配置,如服务端接口的 baseURLwebsocketbaseURL
  • hooks 文件夹主要存放一些自定义 hook,如全局提示弹窗 hook
  • pages 文件夹主要存放页面组件,如登录页面、注册页面、首页等
  • router 文件夹主要存放路由相关配置,即用于实现路由守卫的高阶组件
  • utils 文件夹主要存放一些全局通用的工具方法,如封装的 axiosstorage、加密解密函数、时间或文件的格式化方法等

后端项目目录介绍
alt

  • controller 文件夹主要负责处理 API 相关,将接口路由与 services 文件夹中导出的操作函数关联起来
  • models 文件夹负责处理各个表的创建
  • services 文件夹负责各种操作的逻辑实现,并配备了极为清晰的注释
  • utils 文件夹主要存放一些全局通用的工具方法,如创建文件的方法、文件格式化方法等

对于大部分人来说,直接看源码和注释即可。因为上面提到,本项目的亮点之一便是做了较为完备的前端工程化设置,且项目目录结构合理、清晰,组件和方法抽象程度高,代码耦合度低,且配备了注释说明。下面附上几张源码图片进行证明:

client\src\components\VideoModal\index.tsx:(音视频通话的前端处理)
音视频通话-前端主要代码逻辑:
alt 音视频通话-前端建立 WebSocket 连接:
alt 音视频通话-前端建立 WebRTC 连接:
alt

server\services\rtc\index.js:(音视频通话的服务端处理) alt

client\src\utils\file.ts:(前端处理文件的函数集合) alt

2.3 如何参与本项目?

  1. Fork 本仓库
  2. 新建 feat/xxx_feature 分支
  3. 提交代码 (commit 规范可参照这里:https://juejin.cn/post/7264599940537532474#heading-6)
  4. 新建 Pull Request

3、写在最后

本项目到目前为止都靠作者一人独立开发,但上面提到还有许多可扩展的功能点,也有很多缺陷待修复,因此希望更多的人参与进来,继续完善这个项目,实现更好的开源,开源拯救世界

本人最近忙于学习React源码,当学完便会将相关资料和笔记整理出来开源,类似于本人的另一个项目:VueSouceCodeStudy,欢迎各位大佬给本菜鸡的项目点个 star⭐。

🔨 本人掘金博客地址:https://juejin.cn/user/2370998127573751/posts

🎨 本人Github主页地址:https://github.com/XC0703

🏰 本人Gitee主页地址:https://gitee.com/XC0703

👉 项目Github地址:https://github.com/XC0703/better-chat

✨ 项目Gitee地址:https://gitee.com/XC0703/better-chat

上面是一些关于此项目和本人技术社区主页的地址,欢迎各位看官给小弟点个赞,与诸君共勉。

#前端##项目实战##大厂##全栈##简历#
全部评论
墙墙来给你点赞啦,关注四川大学表白墙
1
送花
回复
分享
发布于 05-07 14:45 四川
,收藏了
1
送花
回复
分享
发布于 05-07 15:33 江苏
滴滴
校招火热招聘中
官网直投
nice
1
送花
回复
分享
发布于 05-13 14:08 广东
收藏的友友们欢迎star哦
1
送花
回复
分享
发布于 05-13 16:30 四川

相关推荐

自己稀里糊涂就选了后端方向,还学的go,然后基础又不行,难一点的东西都没啃下来,又只能写写业务目前在某中厂日常实习,确实就是和大家说的一样,绝大部分时间在技术设计、评审、CR、开会上,写代码的很少感觉我这边还多了一个debuff,源码质量很差,我每天是写得真痛苦啊我第一次上手写的时候,直接上去把代码给重构了两天,之后被ld大骂了一顿,都快把我给训抑郁了原来以为去稍微大一点的公司写代码,会是我基本不用考虑什么代码设计,直接照抄一定是最佳实践的代码,慢慢体会好处就行了。没想到实际的体感就是,现有的代码都是垃圾,写得什么都行,不用细想都知道以后一定会出问题,能抄的没眼看;想看看怎么写的一些调用逻辑参考,找不到,结构散得很。到想自己发挥了,直接不敢写了,谁知道他让不让你写,他有有一些不成文固定的很多标准在那里,又不能过于改动现有的结构。当然以上的感觉很可能有我自己的一部分问题,大家可以不用在意语气直接锐评。感觉个人更喜欢写写前端这种更有反馈更有趣味性的东西,主要想走全栈,后续秋招是肯定想准备一下的。然后写后端其实也不排斥,本废物前面还有一段小厂实习在搞中台全栈,也会看看业务代码,感觉确实写得很好。有好多劳动密集型优化,自己手写的框架,有非常复杂而且还挺有意思挺有挑战性的设计,基本都是追求性能的极致。可惜那个时候写点简单代码就够吃力了,没来得及好好学习,最后就被开了。但是现在就是感觉,稍大一点的厂的业务就很不一样。写得业务真的很无聊。最终其实就是能跑就行,但是过程中你还要被各种锐评打击,跟测试产品及其低效地对接。代码上没挑战,业务上感觉都是害人业务,自己没法直接感受到任何正反馈。马斯洛理论最后两层是感到被尊重和自我实现,我觉得做业务好像很难感到被尊重,更后面更是无从谈起。个人其实是很迷茫的,目前比较不确定的规划是,实习大概可能会跑路,尝试往更基础的方向学学go,同时也学学前端,最后可能还会看情况继续学点java。。。感觉也不合理了,其实就是非常迷茫。我喜欢做有挑战的事情,喜欢写工具写有用的东西。想尽量去平衡爱好和工作,又一直觉得爱好和工作是矛盾的。我的缺点又是非常没有耐心,对于业务这种没挑战性还需要细心的方向坚持不下来。唉还是写得思路好乱,流水帐了,不加标签了
点赞 评论 收藏
转发
一、总结虽然很多很常见的题没答出来,特别是一个手写promise.all()脑袋一片空白,叫面试官帮忙写了个开头,结果还是写不出来,也是比较尴尬,但相比第一次好很多了,至少没有第一次那样想逃。。。不过也是服气自己,自己项目相关的iframe,跨源通信等竟然没有准备,白送的几个题没有把握住。再说一下面试官小姐姐,可能也是由于面试官人好,没有压力,我才能好多答不出也没有想着逃跑的(当然第一次那个公司的面试官也很不错,是我自己太紧张了)。所以说真的美团的面试体验很不错,只管我现在太菜了。二、面经自我介绍:1. 自我介绍2. 入职时间,到岗时间3. 学习前端多久4. 学习了哪些内容和学习途径项目:1. 挑一个项目,讲亮点和挑战八股:1. iframe的特点,缺点2. CSRF攻击,XSS攻击,日常中哪些常见场景是用来做防御的3. vue2和vue3的区别,生命周期,响应式原理等4. 跨域,http和https的区别5. 浏览器缓存,进程,怎么获取浏览器信息手写:1. promise.all()2. axios二次封装3. 一个超简单的数组题,大于2的数加1求和(应该是无语我了T_T),结果我还用const的去声明res,还没看出报错。。。真的是紧张啊后面就问了一些最基础的八股和最基础的css,像let,const,var, 解构赋值等,打发时间了...虽然也很尬,凉了,不过至少比第一次好点了--5.12已挂—5.14捞一面
点赞 评论 收藏
转发
17 45 评论
分享
牛客网
牛客企业服务