在开发本地生活类应用时,处理用户发布的同城广告信息是常见需求。当用户申请删除自己发布的广告时,系统需要快速、安全地完成数据清理,同时保障数据库完整性和用户体验。
前端触发删除请求
用户在小程序或App中点击“删除”按钮,前端通过封装好的API发送删除请求。通常使用HTTP DELETE方法,携带广告ID和用户身份令牌:
fetch(`/api/ads/${adId}`, {
method: 'DELETE',
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json'
}
})
.then(response => response.json())
.then(data => console.log('删除成功:', data));
后端逻辑处理
接收到删除请求后,服务端需验证用户是否有权操作该广告。常见做法是在数据库查询中加入用户ID条件:
DELETE FROM ads
WHERE id = ? AND user_id = ?;
这样即使攻击者伪造请求删除他人广告,也会因user_id不匹配而失败。
软删除 vs 硬删除
实际项目中建议采用软删除。即不真正从表中移除记录,而是更新一个deleted_at字段:
UPDATE ads
SET deleted_at = NOW()
WHERE id = ? AND user_id = ?;
查询广告时再过滤掉deleted_at非空的记录。这种方式便于后期数据恢复和审计追踪。
关联资源清理
广告可能包含图片、视频等附件。删除主记录时,应异步触发资源清理任务。例如使用Node.js的队列机制:
const deleteJob = queue.create('cleanAdAssets', {
adId: adId,
imageUrls: ['https://cdn.example.com/1.jpg']
}).save();
避免阻塞主流程,提升接口响应速度。
缓存同步更新
如果广告列表被Redis缓存,删除操作后必须清除相关键。比如删除以ad_list:user_123为key的缓存:
await redis.del(`ad_list:user_${userId}`);
否则用户刷新页面仍可能看到旧数据,造成困惑。
日志记录与监控
每次删除操作都应写入操作日志,包含时间、IP、用户ID和广告ID。可借助ELK体系做集中分析,及时发现异常批量删除行为。
防误删机制
对于管理后台的操作,可以增加二次确认或设置回收站功能。普通用户端则可通过Toast提示提供“撤销”窗口期,比如10秒内可取消删除。