源码见:"fastapi_study_road-learning_system_online_courses: fastapi框架实战之--在线课程学习系统"
之前我们分享了FastAPI(七十一)实战开发《在线课程学习系统》接口开发-- 查看留言,这次我们分享留言列表开发。
获取列表,也需要登录,根据登录用户来获取对应的留言,逻辑梳理如下:
1.判断用户是否登录
2.根据登录用户查询留言列表
3.留言列表中要根据是留言回复,进行列表重组
首先,在message_method.py中实现主要逻辑
def get_msg_list(db: Session, uid: int):
# 查询留言+回复
return db.query(Message).filter(or_(Message.send_user == uid, Message.accept_user == uid)).filter(Message.status == 0).all()
def list_msg_method(user: UsernameRole, db: Session):
"""获取留言列表"""
db_user = get_by_username(db, user.username)
msg_list = get_msg_list(db, db_user.id) # 获取与当前用户相关留言/回复
to_client = []
main_msg_id_list = []
if msg_list:
for _ in msg_list:
# ① 如果是留言
if _.pid is None:
message_one = MessageOne(
id=_.id,
send_user=get_by_uid(db, _.send_user).username,
accept_user=get_by_uid(db, _.accept_user).username,
read=_.read,
send_time=_.send_time,
add_time=str(_.add_time),
context=_.context
)
main_msg_id_list.append(_.id) # 保存非回复信息的id,即留言信息的id
# 查询该留言信息的所有回复信息,并将回复信息一并返回
all_pid_messages = get_pid_message(db, _.id)
if all_pid_messages:
to_client_pid_msgs = []
for _ in all_pid_messages:
message_pid = MessagePid(
id=_.id,
send_user=get_by_uid(db, _.send_user).username,
accept_user=get_by_uid(db, _.accept_user).username,
read=_.read,
send_time=_.send_time,
add_time=str(_.add_time),
context=_.context,
pid=_.pid
)
to_client_pid_msgs.append(message_pid.dict())
message_one.pid = to_client_pid_msgs
to_client.append(message_one.dict())
# ② 如果是回复,查询该回复信息是否有主留言信息,如果有同上
else:
if _.pid not in main_msg_id_list:
_msg = get_msg_by_id(db, _.pid)
if _msg:
_all_pid_messages = get_pid_message(db, _msg.id)
_message_one = MessageOne(
id=_msg.id,
send_user=get_by_uid(db, _msg.send_user).username,
accept_user=get_by_uid(db, _msg.accept_user).username,
read=_msg.read,
send_time=_msg.send_time,
add_time=str(_msg.add_time),
context=_msg.context
)
if _all_pid_messages:
_pid_list = []
for each in _all_pid_messages:
_message_pid = MessagePid(
id=each.id,
send_user=get_by_uid(db, each.send_user).username,
accept_user=get_by_uid(db, each.accept_user).username,
read=each.read,
send_time=each.send_time,
add_time=str(each.acc_time),
context=each.context,
pid=each.pid
)
_pid_list.append(_message_pid.dict())
_message_one.pid = _pid_list
to_client.append(_message_one.dict())
return response(data=to_client)
然后在message.py中实现接口:
@message_router.get("/list", summary="查询留言列表")
def view_message_list(
user: UsernameRole = Depends(get_current_user),
db: Session = Depends(create_db)
):
return list_msg_method(user, db)
测试
查询留言列表完成