Skip to content

Commit

Permalink
大文件上传和聊天框优化
Browse files Browse the repository at this point in the history
  • Loading branch information
OblivionTime committed Apr 14, 2023
1 parent 327d7df commit 666e871
Show file tree
Hide file tree
Showing 25 changed files with 562 additions and 159 deletions.
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
.DS_Store
node_modules
/build

/release
uploads
dist
*.zip
*.exe
# local env files
Expand Down
59 changes: 59 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,42 @@
**希望观众老爷给个免费的三连支持一下新人up主**
# ♻️项目基本介绍
``是基于`electron(vue2)``nodejs`实现的简单聊天软件,其中用`websocket``http`进行通讯传递,数据库使用了`mysql`数据库,该项目功能简单,界面简洁,适合正在练习`websocket``vue`的小白查看代码,代码量极少且逻辑清晰,每个功能都会添加相应的逻辑供大家观看学习(大佬勿喷)
# 🧨 部分用户遇到的问题
## 数据库无法连接
![在这里插入图片描述](https://img-blog.csdnimg.cn/f0ffa8532bb84153b8b0033b31d16a41.png)
### 问题分析
可能用户新装的mysql,没有设置数据库访问权限
### 问题解决方案
1. 进入到你的数据库
```shell
mysql -u root -p
```
2. 输入以下命令
```shell
use mysql;
update user set Host="%" where User="root";
flush privileges;
exit;
```
3. 使用连接工具尝试连接mysql数据库(navicat)
## 前端安装依赖出现问题(node-gyp)
![在这里插入图片描述](https://img-blog.csdnimg.cn/8aac61eee61a4a00b9b7451dbb4ab737.png)
### 问题分析
`electron`和nodejs版本不兼容,建议将nodejs版本修改为16.18或者14.20
### 问题解决方案
卸载当前版本的nodejs,然后安装`16.18`版本
#### 16.18
[https://nodejs.org/download/release/v16.18.0/node-v16.18.0-x64.msi](https://nodejs.org/download/release/v16.18.0/node-v16.18.0-x64.msi)
#### 14.20
[https://nodejs.org/download/release/v14.20.0/node-v14.20.0-x64.msi](https://nodejs.org/download/release/v14.20.0/node-v14.20.0-x64.msi)
# 🧨项目目前存在的问题
* 如果在同一台电脑上,进行视频通话,是不成功的,因为会出现摄像头也被占用问题,但是语音通话是可以的
* 目前逻辑是必须双方都在同时相互聊天,才能进行语音和视频通话
* 目前用户可以同时和不同的人同时进行音视频(后期会修改这个逻辑)
* 目前视频通话存在画质模糊问题(待修复)
# 🥑已修复的bug
1. 文件下载出现了白屏
2. 聊天框没有置底
# 👻注意事项
1. 打开软件第一时间修改服务器地址

Expand Down Expand Up @@ -263,6 +294,34 @@ Express-ws支持标准的WebSocket协议和Socket.IO协议,可以通过简单
* created_at: 记录创建时间,时间戳类型,默认值为当前时间戳。
* updated_at: 记录更新时间,时间戳类型,默认值为当前时间戳,在记录更新时自动更新。
该表没有定义外键约束和索引。
## AI密钥存储表(ai_conversation)
![在这里插入图片描述](https://img-blog.csdnimg.cn/c7085feca20c45d2aa5e86545a364856.png)


* id: 主键,自动递增的整数。
* username: 用户名,非空字符串。
* room: 房间名称,非空字符串。
* conversation_id: 会话 ID,非空字符串。
* conversation_signature: 会话签名,非空字符串。
* client_id: 客户端 ID,非空字符串。
* count: 统计使用次数,默认值为 0。
* created_at: 记录创建时间,默认值为当前时间戳。
* updated_at: 记录更新时间,默认值为当前时间戳,在更新时自动更新。

此外,该表还包含一个外键约束,它引用了 user 表中的 username 字段,并在删除或更新时级联操作。
表使用 InnoDB 引擎,并使用 utf8mb4 字符集和 utf8mb4_unicode_ci 校对规则。
## AI消息存储表(ai_conversation)
![在这里插入图片描述](https://img-blog.csdnimg.cn/10a9f89bc8b74ab28318028d1f27cb30.png)* id: 主键,自动递增的整数。
* sender_id: 发送者 ID,非空整数。
* receiver_id: 接收者 ID,非空整数。
* content: 消息内容,非空长文本。
* link_list: 链接列表,JSON 格式,默认值为 NULL。
* room: 房间名称,非空字符串。
* conversation_id: 会话 ID,非空字符串。
* conversation_signature: 会话签名,非空字符串。
* client_id: 客户端 ID,非空字符串。
* invocation_id: 调用ID,非空整数。
* created_at: 记录创建时间,默认值为当前时间戳。

# 🔖项目运行
## 后端运行
Expand Down
26 changes: 0 additions & 26 deletions server/.gitignore

This file was deleted.

23 changes: 21 additions & 2 deletions server/app/app.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,6 @@ const path = require('path');
/**
* 解决跨域
*/
// app.all("*", function );
app.use("/uploads", express.static('uploads'));
const cors = (req, res, next) => {
//设置允许跨域的域名,*代表允许任意域名跨域
res.header("Access-Control-Allow-Origin", "*");
Expand All @@ -28,11 +26,32 @@ const cors = (req, res, next) => {
//跨域允许的请求方式
res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");
res.header("Content-Type", "application/json;charset=utf-8")

if (req.method.toLowerCase() == 'options')
res.sendStatus(200); //让options尝试请求快速结束
else
next();
}
/**
* 静态文件相关
*/
//将静态文件都设为直接下载
const staticDownload = (req, res, next) => {
//设置允许跨域的域名,*代表允许任意域名跨域
res.header("Access-Control-Allow-Origin", "*");
//允许的header类型
res.header("Access-Control-Allow-Headers", "*");
res.header("Access-Control-Allow-Credentials", true);
//跨域允许的请求方式
res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");
res.header("content-type", "application/octet-stream")
if (req.method.toLowerCase() == 'options')
res.sendStatus(200); //让options尝试请求快速结束
else
next();
}
app.use("/uploads", staticDownload, express.static('uploads'));

const bodyParser = require("body-parser");
app.use(bodyParser.json({ limit: '100mb' })); //parse application/json
app.use(bodyParser.urlencoded({ limit: '100mb', extended: true })); //parse application/json
Expand Down
1 change: 1 addition & 0 deletions server/app/routes/auth.js
Original file line number Diff line number Diff line change
Expand Up @@ -34,5 +34,6 @@ module.exports = function () {
router.post('/forget_password', auth.ForgetPassword)
router.post('/updateInfo', authenticateToken, upload.single('avatar'), auth.updateInfo)
router.ws('/login_code', auth.LoginCode)
router.ws('/user_channel', auth.initUserNotification)
return router
}
31 changes: 30 additions & 1 deletion server/container/auth/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@ module.exports = {
Register,
ForgetPassword,
LoginCode,
updateInfo
updateInfo,
initUserNotification
};
const jwt = require('jsonwebtoken');
const secretKey = 'xWbiNA3FqnK77MnVCj5CAcfA-VlXj7xoQLd1QaAme6l_t0Yp1TdHbSw';
Expand Down Expand Up @@ -266,4 +267,32 @@ function getUserInfo(username, callback) {
})
}

/**
* 初始化用户的通知管道,接收一些对方的消息
*/
function initUserNotification(ws, req) {
//获取name
let url = req.url.split("?")[1];
let params = new URLSearchParams(url)
let username = params.get("username")
//如果用户已经登录则强制退出当前用户
if (LoginRooms[username]) {
ws.close()
}
LoginRooms[username] = ws
ws.on('message', function (Resp_data) {
let data = JSON.parse(Resp_data)
//接收者
let receiver_username = data.receiver_username
//对方在线
if (LoginRooms[receiver_username]) {
LoginRooms[receiver_username].send(Resp_data)

}
});
ws.on('close', function () {
if (LoginRooms[username]) {
delete LoginRooms[username]
}
})
}
110 changes: 70 additions & 40 deletions server/container/friend/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,52 @@ function List(req, res) {
return RespData(res, friendList)
})
}
/**
* 发送添加好友通知(待取消)
* 1.先判断当前好友是否已经是自己的好友了
* 2.不存在则插入friend表中
* 3.并将自己也插入到别人的好友列表中
* 4.当前用户向对方发送一条消息,也就是向message表插入一条数据
*/
// async function toApplyForFriend(req, res) {
// //获取当前登录用户的个人信息
// let user = req.user
// //获取自己的分组所有成员
// let info = await getUserInfo(user.username)
// //查询当前用户的分组下所有好友
// let sql = 'select id,name from friend_group where user_id=?'
// let { err, results } = await Query(sql, [info.id])
// //获取到要添加的username和其对应的id
// let { username, id, content } = req.body
// for (const item of results) {
// let group_id = item.id
// //判断用户是否已经是好友
// let friendList = await getFriendList(group_id)
// for (const friend of friendList) {
// if (friend.username == username) {
// return RespError(res, RespExitFriendErr)
// }
// }
// }
// //添加通知
// let notifyInfo = {
// sender_username: user.username,
// receiver_username: username,
// content: content,
// type: "new",
// }
// sql = 'insert into message_notify set ?'
// //添加通知
// let resp = await Query(sql, notifyInfo)
// if (resp.err) {
// return RespError(res, RespCreateErr)
// }
// //如果对方在线,则发送通知
// if (LoginRooms[username]) {
// LoginRooms[username].send(JSON.stringify(notifyInfo))
// }
// return RespSuccess(res)
// }
/**
* 添加好友
* 1.先判断当前好友是否已经是自己的好友了
Expand All @@ -46,7 +92,9 @@ async function AddFriend(req, res) {
//获取当前登录用户的个人信息
let user = req.user
//获取自己的分组所有成员
let info = await getUserInfo(user.username)
const sqlStr = 'select * from user where username=?'
let resp = await Query(sqlStr, [user.username])
let info = resp.results[0]
//查询当前用户的分组下所有好友
let sql = 'select id,name from friend_group where user_id=?'
let { err, results } = await Query(sql, [info.id])
Expand Down Expand Up @@ -74,7 +122,7 @@ async function AddFriend(req, res) {
}
sql = 'insert into friend set ?'
//添加好友
let resp = await Query(sql, friendInfo)
resp = await Query(sql, friendInfo)
if (resp.err) {
return RespError(res, RespCreateErr)
}
Expand All @@ -100,13 +148,16 @@ async function AddFriend(req, res) {
type: 'private',
media_type: 'text',
status: 0,
file_size: 0,
content: "我们已经是好友了!!",
room: uuid
}
sql = 'insert into message set ?'
await Query(sql, message)
sql = 'insert into message_statistics set ?'
await Query(sql, { room: uuid, total: 1 })
//通知对方,让其好友列表进行更新
NotificationUser({ receiver_username: username, name: "friend" })
return RespSuccess(res)
}
/**
Expand Down Expand Up @@ -153,43 +204,22 @@ async function SearchUser(req, res) {
RespData(res, searchList)
}
//查询好友信息
function getFriendList(group_id) {
return new Promise((resolve, reject) => {
const sql = 'select * from friend where group_id=?'
db.query(sql, [group_id], async (err, results) => {
resolve(results)
})
})
}
function getFriendInfo(username, group_id) {
return new Promise((resolve, reject) => {
const sql = 'select * from friend where group_id=? and username=?'
db.query(sql, [group_id, username], async (err, results) => {
resolve(results[0])
})
})
async function getFriendList(group_id) {
const sql = 'select * from friend where group_id=?'
let { results } = await Query(sql, [group_id])
return results
}
function getUserInfo(username) {
return new Promise((resolve, reject) => {
const sql = 'select * from user where username=?'
db.query(sql, [username], async (err, results) => {
resolve(results[0])
})
})
}
function addFriend(friendInfo) {
return new Promise((resolve, reject) => {
const sqlStr = 'insert into friend set ?'
db.query(sqlStr, friendInfo, (err, results) => {
// 执行 SQL 语句失败了
if (err) return err
if (results.affectedRows === 1) {
if (err) return RespError(res, RespServerErr)
if (results.affectedRows === 1) {
return resolve("")
}
return "创建失败"
}
})
})
//添加好友
async function addFriend(friendInfo) {
const sqlStr = 'insert into friend set ?'
let { err, results } = await Query(sqlStr, friendInfo)
// 执行 SQL 语句失败了
if (err) return err
if (results.affectedRows === 1) {
if (err) return RespError(res, RespServerErr)
if (results.affectedRows === 1) {
return ""
}
return "创建失败"
}
}
Loading

0 comments on commit 666e871

Please sign in to comment.