Skip to content

Commit c3a69cc

Browse files
committed
聊天室基本对接完成,修改一些细节,准备部署
1 parent 4c4db97 commit c3a69cc

File tree

7 files changed

+66
-29
lines changed

7 files changed

+66
-29
lines changed

project/Dockerfile

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
# 设置基础镜像
2+
FROM python:3.9.13
3+
# 设置代码文件夹工作目录 /app
4+
WORKDIR /app
5+
# 复制当前代码文件到容器中 /app
6+
ADD . /app
7+
# 设置时间
8+
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
9+
# 安装所需的包,这里的requirements文件名需和项目生成的一致
10+
RUN pip install --trusted-host mirrors.tuna.tsinghua.edu.cn -r requirements.txt -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple/
11+
# 执行入口文件
12+
CMD ["python", "app.py"]

project/api/chat/history.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ class MessageHistory(Resource): # 用户获取历史消息
1212
@check_status([0, 3])
1313
def get(self):
1414
receive_id = request.payload_id
15-
send_id = request.args.get('send_id', type=int)
15+
send_id = request.args.get('send_id', type=str)
1616
# 查询数据库中的历史记录
1717
receive_history = Messages.query.filter(
1818
Messages.send_id == send_id, Messages.receive_id == receive_id, Messages.is_read == 1).order_by(
@@ -25,10 +25,11 @@ def get(self):
2525
message_list = []
2626
# 添加消息到列表中
2727
for message in message_history:
28-
message_dict = {'send_id': str(message.send_id), 'message': message.message, 'message_id': str(message.id),
29-
'type': message.type, 'send_time': time_transform(message.send_time)}
28+
message_dict = {'send_id': str(message.send_id), 'receive_id': str(message.receive_id),
29+
'message': message.message, 'message_id': str(message.id),
30+
'type': message.type, 'send_time': time_transform(message.send_time, True)}
3031
message_list.append(message_dict)
3132
if not message_list:
32-
return make_response(jsonify({'code': 400, 'message': '暂无历史消息'}), 400)
33+
return make_response(jsonify({'code': 404, 'message': '暂无历史消息'}), 404)
3334
logger.debug(f'用户{receive_id}获取与用户{send_id}的历史消息')
3435
return make_response(jsonify({'code': 200, 'message': '获取成功', 'data': message_list}), 200)

project/api/chat/list.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ def get(self):
4343
results.append({'person_id': str(person.id), 'person_nickname': person.nickname,
4444
'person_profile_photo': person.profile_photo, 'last_message_id': str(conversation.id),
4545
'last_message': conversation.message,
46-
'last_message_time': time_transform(conversation.send_time)})
46+
'last_message_time': time_transform(conversation.send_time, True)})
4747
if not results:
4848
return make_response(jsonify({'code': 404, 'message': '暂无消息'}), 404)
4949
logger.debug(f'用户{user_id}获取消息列表')

project/api/chat/message.py

Lines changed: 34 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ class Message(Namespace): # 聊天功能
1515
def on_connect(self):
1616
token = request.headers.get('Authorization')
1717
if user_id := self.verify_token(token):
18-
join_room(user_id) # 将用户添加到以其唯一标识符命名的房间
19-
emit('response', {'code': 1, 'message': '连接成功'})
18+
join_room(f'{user_id}') # 将用户添加到以其唯一标识符命名的房间
19+
emit('response', {'code': 1, 'message': '新消息来咯!', 'user_id': str(user_id)}) # 发送消息给连接的用户
2020
self.send_offline_messages(user_id)
2121
else:
2222
emit('response', {'code': 0, 'message': '你没有权限'})
@@ -35,19 +35,28 @@ def on_message(self, messages):
3535
token = request.headers.get('Authorization')
3636
if sender_id := self.verify_token(token):
3737
messages_dict = json.loads(messages)
38-
receive_id = messages_dict.get('receive_id') # 获取消息的接收者的唯一标识符
39-
message_type = messages_dict.get('type') # 获取消息类型
40-
message = messages_dict.get('message') # 获取消息内容
41-
messages = Messages(id=id_generate('message'), isSystem=0, send_id=sender_id, receive_id=receive_id,
42-
message=message, send_time=datetime.datetime.utcnow(), type=message_type, is_read=0)
43-
db.session.add(messages)
44-
db.session.flush()
45-
db.session.commit()
46-
emit('response', {'code': 200, 'message': message, 'message_id': str(messages.id), 'type': message_type},
47-
room=receive_id) # 发送消息给接收者的房间
38+
try:
39+
receive_id = messages_dict.get('receive_id') # 获取消息的接收者的唯一标识符
40+
message_type = messages_dict.get('type') # 获取消息类型
41+
message = messages_dict.get('message') # 获取消息内容
42+
messages = Messages(id=id_generate('message'), isSystem=0, send_id=sender_id, receive_id=receive_id,
43+
message=message, send_time=datetime.datetime.utcnow(), type=message_type, is_read=0)
44+
db.session.add(messages)
45+
db.session.flush()
46+
db.session.commit()
47+
if str(sender_id) != receive_id:
48+
emit('response',
49+
{'code': 200, 'message': message, 'send_id': str(sender_id), 'receive_id': str(receive_id),
50+
'message_id': str(messages.id), 'type': message_type,
51+
'send_time': time_transform(messages.send_time, True)},
52+
room=f'{receive_id}') # 发送消息给接收者的房间
4853

49-
emit('response', {'code': 200, 'message': message, 'message_id': str(messages.id), 'type': message_type},
50-
room=sender_id) # 发送消息给发送者的房间
54+
# emit('response',
55+
# {'code': 200, 'message': message, 'send_id': str(sender_id), 'receive_id': str(receive_id),
56+
# 'message_id': str(messages.id), 'type': message_type},
57+
# room=f'{sender_id}') # 发送消息给发送者的房间
58+
except Exception as e:
59+
emit('response', {'code': 400, 'message': f'发送失败:{e}'})
5160
else:
5261
emit('response', {'code': 400, 'message': '你没有权限'})
5362

@@ -72,13 +81,18 @@ def verify_token(self, token):
7281
return False
7382

7483
def send_offline_messages(self, receive_id):
75-
# 查询数据库中针对接收者的未读消息
76-
offline_messages = Messages.query.filter_by(receive_id=receive_id, is_read=0).filter(
84+
# 查询未读消息
85+
offline_messages_receive = Messages.query.filter_by(receive_id=receive_id, is_read=0).filter(
7786
Messages.send_id != 6).all()
78-
87+
offline_messages_send = Messages.query.filter_by(send_id=receive_id, is_read=0).filter(
88+
Messages.send_id != 6).all()
89+
offline_messages = list(set(offline_messages_receive + offline_messages_send))
90+
offline_messages = sorted(offline_messages, key=lambda x: x.send_time)
7991
# 将未读消息发送给接收者
8092
for message in offline_messages:
8193
emit('response',
82-
{'code': 200, 'message': message.message, 'send_id': str(message.send_id), 'type': message.type,
83-
'message_id': str(message.id), 'send_time': time_transform(message.send_time)},
84-
room=receive_id)
94+
{'code': 200, 'message': message.message, 'send_id': str(message.send_id),
95+
'receive_id': str(message.receive_id),
96+
'type': message.type, 'message_id': str(message.id),
97+
'send_time': time_transform(message.send_time, True)},
98+
room=f'{receive_id}')

project/api/chat/read.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,7 @@ def put(self):
1616
args = parser.parse_args()
1717
send_id = args.get('send_id')
1818
message_id = args.get('message_id')
19-
message = db.session.query(Messages).filter_by(id=message_id, send_id=send_id, receive_id=request.payload_id,
20-
is_read=0).first()
19+
message = db.session.query(Messages).filter_by(id=message_id, send_id=send_id, is_read=0).first()
2120
if message:
2221
message.is_read = 1
2322
db.session.commit()

project/requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ pytz==2023.3
6464
pywin32-ctypes==0.2.1
6565
PyYAML==6.0
6666
qiniu==7.10.0
67+
redis==4.6.0
6768
requests==2.28.2
6869
shellescape==3.8.1
6970
six==1.16.0

project/utils/Time_Transform.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,17 @@
22
import datetime
33

44

5-
def time_transform(timestamp):
5+
def time_transform(timestamp, is_msg=False):
66
local_time = timestamp + datetime.timedelta(hours=8) # 加上8小时是因为中国位于UTC+8时区
7-
local_time_str = local_time.strftime('%Y-%m-%d %H:%M:%S')
7+
if is_msg:
8+
if local_time.date() == datetime.datetime.now().date():
9+
local_time_str = local_time.strftime('%H:%M')
10+
elif local_time.year == datetime.datetime.now().year:
11+
local_time_str = local_time.strftime('%m-%d')
12+
elif (local_time + datetime.timedelta(days=1)).date() == datetime.datetime.now().date():
13+
local_time_str = local_time.strftime('昨天')
14+
else:
15+
local_time_str = local_time.strftime('%Y-%m-%d')
16+
else:
17+
local_time_str = local_time.strftime('%Y-%m-%d %H:%M:%S')
818
return local_time_str

0 commit comments

Comments
 (0)