海南大学交友平台开发实战day8实现SQLite好友机制好友申请/同意功能大家好欢迎来到海南大学交友平台开发实战系列的第八天在前七天的开发中我们已经完成了登录页、注册页的UI布局、Flask后端基础搭建、数据库初始化及核心表结构创建打通了前端与后端的基础通信链路。今天的核心任务完全围绕「SQLite数据库好友机制」展开重点实现 SQLite 好友关系存储、好友申请发送、对方同意/拒绝机制 这也是今日开发的核心重点全程实战落地记录每一个踩坑细节和解决思路帮助大家避开同类问题高效完成开发。本博文采用 “前端 HTML/JS 后端 Python Flask 数据库 SQLite” 的技术栈全程实战落地包含关键代码、报错分析、修复步骤及功能验证欢迎大家在评论区交流探讨开发过程中遇到的问题。一、今日开发核心内容新增优化贴合实际开发重点今日核心围绕 SQLite 数据库操作和好友交互机制展开彻底完成好友功能的闭环开发具体新增及优化内容如下新增基于 SQLite 数据库实现好友关系的持久化存储替代临时内存缓存确保重启服务后好友关系不丢失新增好友申请发送接口/api/friend/request支持向指定用户发送好友申请关联 SQLite 数据库存储申请记录新增好友申请同意/拒绝机制/api/friend/accept、/api/friend/reject实现对方同意后自动创建双向好友关系拒绝后清空申请记录新增好友列表查询接口/api/friend/list从 SQLite 数据库中查询当前用户的所有好友信息支撑前端展示优化完善 SQLite 数据库表关联新增 friend 表与用户表、兴趣表关联确保好友关系、申请记录可正常查询修复解决 SQLite 数据库插入好友关系时外键关联失败的报错确保好友申请、同意、好友列表查询全链路通畅验证完成端到端测试从发送好友申请、对方同意到好友列表展示全程适配 SQLite 数据库存储确保功能可用。二、今日开发实战关键代码步骤可直接复制使用一SQLite 数据库表优化核心支撑好友机制重点完善 SQLite 数据库表结构新增 friend 表存储好友关系、friend_request 表存储好友申请记录与原有用户表、兴趣表关联关键代码如下# 1. 好友关系表SQLite持久化存储classFriend(db.Model):__tablename__friendsiddb.Column(db.Integer,primary_keyTrue,autoincrementTrue)user_iddb.Column(db.String(50),nullableFalse)# 当前用户学号friend_iddb.Column(db.String(50),nullableFalse)# 好友学号create_timedb.Column(db.DateTime,defaultdatetime.now)# 联合唯一约束避免重复添加好友__table_args__(db.UniqueConstraint(user_id,friend_id,nameunique_friend),)# 2. 好友申请记录表SQLite持久化存储申请记录classFriendRequest(db.Model):__tablename__friend_requestsiddb.Column(db.Integer,primary_keyTrue,autoincrementTrue)from_userdb.Column(db.String(50),nullableFalse)# 申请人学号to_userdb.Column(db.String(50),nullableFalse)# 被申请人学号statusdb.Column(db.String(20),defaultpending)# pending/accepted/rejectedcreate_timedb.Column(db.DateTime,defaultdatetime.now)update_timedb.Column(db.DateTime,defaultdatetime.now,onupdatedatetime.now)二好友申请发送接口/api/friend/request后端 Flask实现向指定用户发送好友申请存储到 SQLite 数据库避免重复发送关键代码app.route(/api/friend/request,methods[POST])login_required# 登录校验未登录无法发送申请defsend_friend_request():try:datarequest.get_json()from_userdata.get(from_user)# 当前登录用户学号to_userdata.get(to_user)# 目标好友学号# 校验参数ifnotfrom_userornotto_user:returnapi_response(400,申请人和被申请人学号不能为空)# 校验不能向自己发送申请iffrom_userto_user:returnapi_response(400,不能向自己发送好友申请)# 校验是否已发送过申请从SQLite查询existing_requestFriendRequest.query.filter_by(from_userfrom_user,to_userto_user,statuspending).first()ifexisting_request:returnapi_response(400,已向该用户发送过好友申请请勿重复发送)# 校验是否已成为好友从SQLite friend表查询existing_friendFriend.query.filter_by(user_idfrom_user,friend_idto_user).first()ifexisting_friend:returnapi_response(400,该用户已在你的好友列表中)# 插入SQLite数据库创建申请记录new_requestFriendRequest(from_userfrom_user,to_userto_user,statuspending)db.session.add(new_request)db.session.commit()returnapi_response(200,好友申请发送成功请等待对方同意,{request_id:new_request.id})exceptExceptionase:db.session.rollback()returnapi_response(500,f发送好友申请失败:{str(e)})三好友申请同意/拒绝接口核心/api/friend/accept、/api/friend/reject实现对方同意好友申请后自动在 SQLite friend 表中创建双向好友关系拒绝后更新申请状态关键代码# 同意好友申请app.route(/api/friend/accept,methods[POST])login_requireddefaccept_friend_request():try:datarequest.get_json()request_iddata.get(request_id)# 好友申请ID# 从SQLite查询申请记录friend_requestFriendRequest.query.filter_by(idrequest_id,statuspending).first()ifnotfriend_request:returnapi_response(404,好友申请不存在或已处理)from_userfriend_request.from_user# 申请人学号to_userfriend_request.to_user# 当前登录用户被申请人学号# 1. 更新申请状态为acceptedfriend_request.statusacceptedfriend_request.update_timedatetime.now()# 2. 在SQLite friend表中创建双向好友关系自己和对方互为好友friend1Friend(user_idfrom_user,friend_idto_user)friend2Friend(user_idto_user,friend_idfrom_user)db.session.add(friend1)db.session.add(friend2)db.session.commit()returnapi_response(200,好友申请已同意已添加至好友列表)exceptExceptionase:db.session.rollback()returnapi_response(500,f同意好友申请失败:{str(e)})# 拒绝好友申请app.route(/api/friend/reject,methods[POST])login_requireddefreject_friend_request():try:datarequest.get_json()request_iddata.get(request_id)friend_requestFriendRequest.query.filter_by(idrequest_id,statuspending).first()ifnotfriend_request:returnapi_response(404,好友申请不存在或已处理)# 更新申请状态为rejectedfriend_request.statusrejectedfriend_request.update_timedatetime.now()db.session.commit()returnapi_response(200,已拒绝该好友申请)exceptExceptionase:db.session.rollback()returnapi_response(500,f拒绝好友申请失败:{str(e)})四好友列表查询接口/api/friend/list从 SQLite 数据库中查询当前用户的所有好友返回好友基本信息支撑前端展示关键代码app.route(/api/friend/list,methods[GET])login_requireddefget_friend_list():try:current_usersession[student_id]# 当前登录用户学号# 从SQLite friend表查询当前用户的所有好友friend_recordsFriend.query.filter_by(user_idcurrent_user).all()friend_list[]forrecordinfriend_records:# 查询好友的基本信息从用户表获取friend_infoUser.query.filter_by(student_idrecord.friend_id).first()iffriend_info:friend_list.append({student_id:friend_info.student_id,username:friend_info.username,college:friend_info.college,add_time:record.create_time.strftime(%Y-%m-%d %H:%M:%S)})returnapi_response(200,好友列表获取成功,friend_list)exceptExceptionase:returnapi_response(500,f获取好友列表失败:{str(e)})五前端好友申请/同意交互JS 代码关键修复适配后端接口实现点击 “添加好友” 发送申请、点击 “同意/拒绝” 触发后端接口解决之前 JSON 请求传递失败的问题关键代码// 发送好友申请document.getElementById(sendFriendBtn).addEventListener(click,async(){constfromUsersessionStorage.getItem(studentId);// 当前登录用户学号consttoUserdocument.getElementById(targetStudentId).value;// 目标用户学号try{constresponseawaitfetch(/api/friend/request,{method:POST,headers:{Content-Type:application/json,},body:JSON.stringify({from_user:fromUser,to_user:toUser})});constresultawaitresponse.json();if(result.code200){alert(好友申请发送成功请等待对方同意);}else{alert(result.msg);}}catch(error){alert(发送好友申请失败请重试);}});// 同意好友申请document.getElementById(acceptBtn).addEventListener(click,async(e){constrequestIde.target.dataset.requestId;// 获取申请IDtry{constresponseawaitfetch(/api/friend/accept,{method:POST,headers:{Content-Type:application/json},body:JSON.stringify({request_id:requestId})});constresultawaitresponse.json();if(result.code200){alert(已同意好友申请);// 刷新好友列表loadFriendList();}}catch(error){alert(同意好友申请失败请重试);}});三、今日踩坑记录核心重点避坑关键今日开发核心围绕 SQLite 数据库操作和好友机制踩了 3 个关键坑均已解决整理如下避免大家重复踩坑坑 1SQLite 外键关联失败报错 “foreign key constraint failed”原因是创建 Friend 表时user_id、friend_id 未与 User 表的 student_id 字段完全匹配且未开启外键约束解决在 Flask 初始化时添加app.config[‘SQLALCHEMY_TRACK_MODIFICATIONS’] False并在 Friend 表中明确外键关联db.ForeignKey(‘users.student_id’)重启服务后正常。坑 2好友申请发送后重复发送无提示原因是未查询 SQLite 中的申请记录仅判断了内存缓存解决新增申请前先从 FriendRequest 表中查询是否有未处理的同方向申请避免重复发送。坑 3同意好友申请后仅创建了单向好友关系导致查询好友列表时只显示一方解决在同意接口中同时创建 “当前用户 - 目标用户” 和 “目标用户 - 当前用户” 两条记录确保双向好友关系适配 SQLite 的持久化存储。四、成果展示消息通知界面UI五、今日开发总结今日核心完成了 SQLite 数据库好友机制的落地 实现了好友申请发送、对方同意/拒绝、好友列表查询的全流程彻底打通了 “申请 - 处理 - 存储 - 展示” 的闭环所有操作均基于 SQLite 持久化存储解决了之前内存缓存丢失的问题。同时修复了数据库外键关联、前端请求传递等关键报错确保好友功能可正常交互。今日开发的所有代码均可直接复制使用后续将继续完善好友聊天、好友删除等功能进一步优化前端展示效果适配手机端布局。今日开发的所有代码均可直接复制使用好友功能已实现完整交互后续可继续完善交友申请的消息提醒、好友备注等细节功能。欢迎大家在评论区交流开发过程中遇到的问题一起高效避坑、高效开发明天的项目推进计划是彻底跑通发送消息同意然后添加到好友列表机制今天不知什么原因还是加载不出来~~关注我后续我也会持续更新项目开发进度分享更多 Python 前端全栈开发相关的实战经验以及 SQLite 数据库操作的实战技巧。