You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
5.3 KiB
5.3 KiB
供需发布模块数据结构与功能分析
一、数据结构
-
表:
supply_demands(供需主表)- 字段:
id,user_id,title,type(1=供应,2=需求),content,tag,wechat,mobile,email,status(0待审核/1通过/2拒绝/3退回修改/4永久隐藏),view_count,contact_count,expire_time,public_way(布尔,实际业务含义为1/2/3),file_ids(JSON),contact_name,timestamps,deleted_at - 关系:
user: 发布者(hasOne User(id=user_id))keeps: 收藏(hasMany SupplyDemandKeep(supply_demand_id=id))- 虚拟属性:
files(根据file_ids关联Upload列表)
- 字段:
-
表:
supply_demand_keeps(收藏表)- 字段:
id,user_id,supply_demand_id,timestamps,deleted_at - 关系:
user: 收藏者(hasOne User(id=user_id))supplyDemand: 被收藏的供需(hasOne SupplyDemand(id=supply_demand_id))
- 字段:
-
表:
dialogues(会话表)- 字段:
id,user_id,to_user_id,supply_demand_id,last_content,last_datetime,timestamps,deleted_at - 关系:
user: 会话发起方(hasOne User(id=user_id))toUser: 会话接收方(hasOne User(id=to_user_id))supplyDemand: 关联供需(hasOne SupplyDemand(id=supply_demand_id))
- 字段:
-
表:
messages(消息表)- 字段:
id,dialogue_id,user_id,to_user_id,supply_demand_id,content,is_read,timestamps,deleted_at - 关系:
user/toUser: 发送方/接收方(hasOne User)dialogue: 所属会话(hasOne Dialogue(id=dialogue_id))supplyDemand: 关联供需(hasOne SupplyDemand(id=supply_demand_id))
- 字段:
-
表:
uploads(附件表)- 字段:
id,belongs_type,belongs_id,original_name,folder,name,extension,size,creator_type,creator_id,timestamps,deleted_at - 用途:
supply_demands.file_ids存放附件id列表,模型通过files访问器取回Upload集合
- 字段:
说明:public_way 迁移中为 boolean,但注释为 1/2/3 三种模式(1直接公开/2私信后公开/3不公开)。当前以 0/1 存储,若需完整三态应在后续迁移中改为 tinyInteger。
二、功能说明(SupplyDemandController)
- 列表
index:按类型、状态、关键词、是否只看自己、有效期(有效/失效)筛选,分页排序;关联返回user基本信息。 - 详情
detail:按id查询,返回user,并自增view_count;附带当前用户对该供需的已发私信次数。 - 保存
save:新增或更新(新增时绑定当前用户并短信通知管理员),使用事务保存,支持file_ids、expire_time、contact_name等字段。 - 删除
destroy:按id软删除。 - 发私信
sendMessage:- 若带
supply_demand_id则自增浏览量; - 无会话则创建会话;
- 限流:每天发送条数不超过配置
message_limit; - 反骚扰:自己连续发送后需等待对方回复;
- 保存消息并更新会话最后内容与时间。
- 若带
- 消息列表
messageList:按to_user_id定位当前和对方的会话,分页返回消息(含双方用户信息)。 - 会话列表
dialogues:返回与当前用户相关的会话(发起或接收),含双方用户与关联供需。 - 收藏相关:
keepIndex:我的收藏列表;keepSupplyDemand:收藏,去重创建;unKeepSupplyDemand:取消收藏。
三、核心业务要点
- 审核机制:多状态闭环(待审/通过/拒绝/退回/隐藏)。
- 私信策略:限流 + 反骚扰(需对方回复后再发)。
- 有效期:支持有效/失效筛选。
- 公开模式:当前存储为布尔(0/1),业务含义为三态,后续建议迁移调整。
- 数据统计:浏览数
view_count、联系数contact_count(可按消息交互推导)。 - 附件:
file_idsJSON +files访问器联表读取。
四、测试数据生成目标
以 supply_demands 为起点,为每条主记录自动生成:
- 合理的
uploads附件(0~3 个),file_ids同步写入; - 真实的会话
dialogues(0~2 个),双方用户随机; - 合法的消息序列
messages(1~5 条),严格交替往来确保不违反“需对方回复”约束; - 合理的收藏
supply_demand_keeps(0~5 条,去重); - 统计字段:
view_count≥ 消息条数,contact_count依据消息往来推导。
五、两种生成方式对比
-
方式A:数据库填充(Seeder)
- 优点:
- 一次性执行、可集成到 CI 或初始化流程;
- 可与
DatabaseSeeder串联; - 便于多环境批量重置数据。
- 缺点:
- 运行参数(数量、用户规模)固定或需改代码;
- 无交互,临时性需求需改代码或 env。
- 优点:
-
方式B:Artisan 命令(Console Command)
- 优点:
- 支持运行参数(如
--count、--users),灵活生成规模; - 可多次按需执行,便于演示或局部补数;
- 支持运行参数(如
- 缺点:
- 需要单独维护命令逻辑;
- 不会被自动纳入
db:seed的全局流程。
- 优点:
推荐:开发/演示期使用命令(B)灵活试验;集成测试或初始化环境使用 Seeder(A)。