Files
danyang-match/docs/善缘丹阳 V1.1 数据库与API增量设计.md
T

3507 lines
43 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# “善缘丹阳”公益婚恋服务平台
# V1.1 数据库与 API 增量设计
版本:V1.1
设计原则:增量扩展、兼容 V1.0、避免重复建模、保持模块化单体架构
新增覆盖:Banner、善缘服务站、服务预约、婚恋咨询、婚前辅导、婚恋课堂、婚恋反诈、本地资格核验、专项公益服务项目、来源追踪
---
# 第一章 本次增量设计目标
最新项目计划书已经明确,“善缘丹阳”不仅承担公益婚恋交友,还包括婚恋指导、婚前辅导、婚俗新风、反诈科普、固定阵地服务等内容。
同时,万善公园婚姻登记处被明确为项目固定运营阵地。
因此本次 V1.1 必须在现有 V1.0 架构基础上增加:
```text
Banner运营
固定服务阵地
服务预约
婚恋咨询
婚前辅导
公益内容
婚恋反诈
本地资格核验
专项公益服务项目
公益推广来源
```
---
# 第二章 明确不修改的 V1.0 核心表
以下核心表继续保留:
```text
users
user_wechat_accounts
user_identities
user_profiles
user_preferences
preference_rules
user_interests
user_photos
user_privacy_settings
review_tasks
review_items
review_reasons
recommendation_records
user_relations
matches
conversations
conversation_members
messages
activities
activity_registrations
activity_feedback
activity_user_interests
matchmaker_services
matchmaker_recommendations
matchmaker_followups
reports
report_evidences
user_risk_profiles
risk_events
risk_actions
organizations
operators
roles
permissions
operator_roles
role_permissions
audit_logs
sensitive_access_logs
system_configs
match_rule_configs
```
本次不因 V1.1 新业务而重做这些表。
---
# 第三章 本次新增核心实体
建议新增:
```text
home_banners
service_locations
service_appointments
counseling_services
counseling_followups
content_categories
content_articles
user_local_eligibilities
local_eligibility_evidences
service_programs
service_program_members
partner_organizations
source_campaigns
user_acquisition_sources
```
其中部分可根据最终实现合并,但业务语义必须保留。
---
# 第四章 home_banners
用于首页 Banner 运营。
表:
```text
home_banners
```
建议字段:
```text
id
title
subtitle
image_file_id
button_text
target_type
target_value
audience_scope
sort_order
start_at
end_at
status
created_by
updated_by
created_at
updated_at
```
---
# 第五章 Banner TargetType
建议:
```text
activity
matchmaker
counseling
premarital
service_location
article
internal_page
none
```
---
# 第六章 Banner AudienceScope
支持:
```text
all
onboarding
searching
getting_to_know
successful
```
如果未来关系状态命名调整:
> 使用等义业务状态。
---
# 第七章 Banner 状态
技术候选:
```text
draft
scheduled
active
inactive
expired
```
也可以简化为:
```text
status
+
start_at
+
end_at
```
最终状态计算方式可由研发选择。
---
# 第八章 Banner 业务规则
必须满足:
```text
未到start_at
→ 不展示
超过end_at
→ 不展示
status不可用
→ 不展示
用户状态不匹配audience_scope
→ 不展示
```
---
# 第九章 Banner 图片
使用原统一文件系统。
不要单独建:
```text
banner_images
```
只保存:
```text
image_file_id
```
---
# 第十章 Banner 跳转安全
不允许:
```text
target_type = arbitrary_url
```
V1.1 只允许平台内部已知目标。
避免:
- 错误外链
- 恶意跳转
- 内容不可控
---
# 第十一章 Banner API
用户端:
```text
GET /api/v1/home/banners
```
根据当前用户状态自动过滤。
---
# 第十二章 Banner Admin API
```text
GET /api/v1/operator/banners
POST /api/v1/operator/banners
GET /api/v1/operator/banners/{id}
PUT /api/v1/operator/banners/{id}
POST /api/v1/operator/banners/{id}/publish
POST /api/v1/operator/banners/{id}/disable
POST /api/v1/operator/banners/reorder
```
---
# 第十三章 Banner 权限
```text
banner.view
banner.create
banner.edit
banner.publish
banner.disable
banner.reorder
```
---
# 第十四章 service_locations
用于固定公益服务阵地。
当前首个正式服务点:
> 万善公园婚姻登记处。
计划书明确要求建立常态化驻点机制。
---
# 第十五章 service_locations 字段
建议:
```text
id
name
short_name
address
latitude
longitude
contact_phone_enc
contact_phone_display
opening_hours_text
service_description
cover_file_id
status
primary_organization_id
created_at
updated_at
```
---
# 第十六章 地图位置
服务站可保存:
```text
latitude
longitude
```
这是公共服务地点,不属于用户精确定位。
与此前“不采集用户GPS”没有冲突。
---
# 第十七章 opening_hours
V1.1 推荐先使用:
```text
opening_hours_text
```
例如:
```text
周一至周五 09:00—17:00
周末以活动公告为准
```
暂不建设复杂排班引擎。
---
# 第十八章 service_location_services
如果未来一个阵地提供多个服务点配置,建议增加:
```text
service_location_services
```
字段:
```text
service_location_id
service_type
enabled
display_order
```
V1.1 也可以先直接由 Config 管理。
---
# 第十九章 ServiceType
建议:
```text
matchmaker
counseling
premarital
activity_support
anti_fraud
marriage_culture
general_inquiry
```
---
# 第二十章 服务站用户 API
```text
GET /api/v1/service-locations
GET /api/v1/service-locations/{id}
```
当前虽然只有一个服务站:
> 仍使用列表+详情结构。
方便未来扩展。
---
# 第二十一章 服务站 Admin API
```text
GET /api/v1/operator/service-locations
POST /api/v1/operator/service-locations
PUT /api/v1/operator/service-locations/{id}
POST /api/v1/operator/service-locations/{id}/enable
POST /api/v1/operator/service-locations/{id}/disable
```
---
# 第二十二章 service_appointments
用于用户预约:
- 公益红娘
- 婚恋咨询
- 婚前辅导
- 服务站咨询
---
# 第二十三章 service_appointments 字段
建议:
```text
id
user_id
service_location_id
service_type
preferred_date
preferred_time_slot
user_note
status
assigned_operator_id
confirmed_start_at
confirmed_end_at
cancelled_by
cancel_reason
source
created_at
updated_at
```
---
# 第二十四章 AppointmentStatus
推荐:
```text
submitted
pending_confirmation
confirmed
completed
cancelled
```
技术上可以进一步精简。
---
# 第二十五章 用户预约原则
同一用户可以拥有多个历史预约。
不能:
```text
UNIQUE(user_id)
```
只能在必要时限制:
> 同类型同时存在的 Active Appointment 数量。
---
# 第二十六章 服务预约 API
```text
POST /api/v1/service-appointments
GET /api/v1/service-appointments
GET /api/v1/service-appointments/{id}
POST /api/v1/service-appointments/{id}/cancel
```
---
# 第二十七章 后台预约 API
```text
GET /api/v1/operator/service-appointments
GET /api/v1/operator/service-appointments/{id}
POST /api/v1/operator/service-appointments/{id}/confirm
POST /api/v1/operator/service-appointments/{id}/assign
POST /api/v1/operator/service-appointments/{id}/complete
POST /api/v1/operator/service-appointments/{id}/cancel
```
---
# 第二十八章 预约权限
```text
service_appointment.view
service_appointment.assign
service_appointment.confirm
service_appointment.complete
service_appointment.cancel
```
---
# 第二十九章 counseling_services
这是 V1.1 新增的重要业务对象。
计划书明确提出恋爱困惑、情感矛盾、婚恋焦虑以及婚前公益辅导。
但系统定位:
> 公益婚恋指导服务。
不是:
> 医疗诊疗系统。
---
# 第三十章 counseling_services 字段
建议:
```text
id
user_id
service_type
request_source
user_request_summary
organization_id
assigned_operator_id
status
preferred_service_mode
preferred_time
scheduled_start_at
scheduled_end_at
consent_version
consented_at
completed_at
closed_reason
created_at
updated_at
```
---
# 第三十一章 CounselingServiceType
建议:
```text
relationship_guidance
emotional_support
premarital_guidance
anti_fraud_guidance
```
---
# 第三十二章 是否单独建 premarital_services
V1.1 不建议。
婚前辅导继续复用:
```text
counseling_services
```
通过:
```text
service_type = premarital_guidance
```
区分。
减少表数量。
---
# 第三十三章 ServiceMode
建议:
```text
offline
phone
online_other
```
V1.1 不建设咨询即时 IM。
---
# 第三十四章 CounselingStatus
建议:
```text
requested
assigned
scheduled
in_service
completed
closed
cancelled
```
如果希望减少状态:
可采用:
```text
status
+
next_action_type
```
---
# 第三十五章 counseling_followups
用于服务必要记录。
字段:
```text
id
counseling_service_id
operator_id
followup_type
summary
result_code
next_action
next_followup_at
created_at
```
---
# 第三十六章 咨询记录边界
禁止存:
```text
完整逐字聊天记录
录音默认存档
大段私人关系细节
```
仅保存:
```text
服务需求摘要
本次服务结果
后续建议
必要风险转交
```
---
# 第三十七章 用户咨询 API
```text
GET /api/v1/counseling/services
POST /api/v1/counseling/services
GET /api/v1/counseling/services/{id}
POST /api/v1/counseling/services/{id}/cancel
POST /api/v1/counseling/services/{id}/feedback
```
---
# 第三十八章 后台咨询 API
```text
GET /api/v1/operator/counseling/services
GET /api/v1/operator/counseling/services/{id}
POST /api/v1/operator/counseling/services/{id}/assign
POST /api/v1/operator/counseling/services/{id}/schedule
POST /api/v1/operator/counseling/services/{id}/start
POST /api/v1/operator/counseling/services/{id}/followups
POST /api/v1/operator/counseling/services/{id}/complete
POST /api/v1/operator/counseling/services/{id}/close
```
---
# 第三十九章 咨询权限
```text
counseling.service.view
counseling.service.assign
counseling.service.process
counseling.service.complete
counseling.note.view
counseling.note.create
```
---
# 第四十章 Counselor 数据范围
默认:
```text
assigned
```
咨询人员只能访问:
> 明确分配给自己的服务。
不能全平台浏览所有咨询。
---
# 第四十一章 咨询与 Risk 的关系
如果咨询过程中发现:
```text
诈骗
骚扰
安全威胁
严重违法风险
```
通过:
```text
RiskEvent
```
转交。
source:
```text
counseling
```
咨询人员不直接执行封禁。
---
# 第四十二章 content_categories
用于轻量公益内容。
分类建议:
```text
relationship
premarital
marriage_culture
anti_fraud
```
---
# 第四十三章 content_categories 字段
```text
id
code
name
sort_order
status
created_at
updated_at
```
---
# 第四十四章 content_articles
字段:
```text
id
category_id
title
summary
cover_file_id
content
status
publish_at
unpublish_at
created_by
updated_by
created_at
updated_at
```
---
# 第四十五章 ArticleStatus
建议:
```text
draft
published
offline
```
配合时间字段。
---
# 第四十六章 内容格式
V1.1 推荐:
```text
Markdown
```
或:
```text
受控富文本
```
必须做:
> XSS 安全处理。
---
# 第四十七章 内容用户 API
```text
GET /api/v1/content/categories
GET /api/v1/content/articles
GET /api/v1/content/articles/{id}
```
支持:
```text
category
page
pageSize
```
---
# 第四十八章 首页内容 API
可以复用:
```text
GET /api/v1/content/articles?featured=true
```
或者:
```text
GET /api/v1/home/content
```
推荐后者聚合首页。
---
# 第四十九章 内容后台 API
```text
GET /api/v1/operator/content/articles
POST /api/v1/operator/content/articles
GET /api/v1/operator/content/articles/{id}
PUT /api/v1/operator/content/articles/{id}
POST /api/v1/operator/content/articles/{id}/publish
POST /api/v1/operator/content/articles/{id}/offline
```
---
# 第五十章 内容权限
```text
content.view
content.create
content.edit
content.publish
content.offline
```
---
# 第五十一章 不做内容互动表
V1.1 明确不新增:
```text
article_comments
article_likes
article_favorites
followers
```
内容中心不是社区。
---
# 第五十二章 user_local_eligibilities
用于丹阳本地服务资格。
计划书要求项目面向丹阳本地工作、居住、户籍的适龄单身人群。
---
# 第五十三章 user_local_eligibilities 字段
建议:
```text
id
user_id
eligibility_type
declared_region_code
verification_status
review_task_id
verified_at
verified_by
created_at
updated_at
```
---
# 第五十四章 EligibilityType
```text
household_registration
residence
employment
other
```
---
# 第五十五章 LocalVerificationStatus
建议:
```text
declared
needs_evidence
pending_review
verified
rejected
```
---
# 第五十六章 不要求所有用户默认上传佐证
业务流程:
```text
用户声明
↓
系统/人工判断是否需要补充
↓
需要时
↓
上传佐证
↓
人工审核
```
这能降低注册门槛。
---
# 第五十七章 local_eligibility_evidences
字段:
```text
id
local_eligibility_id
file_id
evidence_type
status
created_at
```
---
# 第五十八章 EvidenceType
可以:
```text
employment_proof
residence_proof
household_proof
other
```
最终根据运营实际确认。
---
# 第五十九章 本地资格佐证属于敏感资料
默认:
> 普通红娘、活动人员不可见原文件。
审核员只在:
> 本地资格审核任务
中访问。
---
# 第六十章 本地资格用户 API
```text
GET /api/v1/local-eligibility
POST /api/v1/local-eligibility/declaration
POST /api/v1/local-eligibility/evidences
POST /api/v1/local-eligibility/submit
```
---
# 第六十一章 本地资格后台 API
```text
GET /api/v1/operator/local-eligibility/reviews
GET /api/v1/operator/local-eligibility/reviews/{id}
POST /api/v1/operator/local-eligibility/reviews/{id}/claim
POST /api/v1/operator/local-eligibility/reviews/{id}/approve
POST /api/v1/operator/local-eligibility/reviews/{id}/need-evidence
POST /api/v1/operator/local-eligibility/reviews/{id}/reject
```
---
# 第六十二章 是否复用 review_tasks
强烈建议:
> 复用现有 review_tasks。
新增:
```text
review_type
```
例如:
```text
profile
local_eligibility
photo
other
```
避免重新开发第二套审核工作流。
---
# 第六十三章 人脸核验设计
当前不建议新增自行存储的人脸表。
如果后续启用合规 Provider:
建议只增加到:
```text
user_identities
```
字段:
```text
liveness_verification_status
liveness_verified_at
verification_provider
```
不保存:
```text
face_embedding
face_template
```
除非未来有明确合法、必要且经过专项设计的理由。
---
# 第六十四章 service_programs
用于专项公益服务项目。
例如:
```text
基层职工婚恋关爱
异地务工青年服务
青年公益婚恋计划
```
---
# 第六十五章 service_programs 字段
```text
id
code
name
description
organization_id
start_at
end_at
status
eligibility_description
created_at
updated_at
```
---
# 第六十六章 service_program_members
字段:
```text
id
service_program_id
user_id
join_source
status
joined_at
exited_at
created_at
updated_at
```
---
# 第六十七章 ProgramMember 不做敏感价值标签
不要存:
```text
low_value
difficult_match
disabled_user
poor_family
```
专项服务资格:
> 使用具体 Program Membership 表达。
---
# 第六十八章 service_programs API
用户端:
```text
GET /api/v1/service-programs
GET /api/v1/service-programs/{id}
POST /api/v1/service-programs/{id}/apply
```
后台:
```text
GET /api/v1/operator/service-programs
POST /api/v1/operator/service-programs
PUT /api/v1/operator/service-programs/{id}
GET /api/v1/operator/service-programs/{id}/members
POST /api/v1/operator/service-programs/{id}/members/{userId}/approve
```
---
# 第六十九章 partner_organizations
此前已经有:
```text
organizations
```
因此是否需要 partner_organizations 应谨慎。
推荐:
> 不新增独立表。
直接扩展:
```text
organizations
```
增加:
```text
organization_role
```
或建立关联表:
```text
organization_relationships
```
---
# 第七十章 organization_relationships
建议:
```text
id
organization_id
related_organization_id
relationship_type
start_at
end_at
status
```
---
# 第七十一章 RelationshipType
```text
sponsor
co_sponsor
operator
partner
venue_partner
```
---
# 第七十二章 Activity 与组织关系
原来如果只有:
```text
organizer_org_id
```
建议升级为:
```text
activity_organizations
```
字段:
```text
activity_id
organization_id
role
```
role:
```text
host
organizer
co_organizer
partner
venue_partner
```
这更符合多部门联合活动场景。
---
# 第七十三章 主办单位身份不自动带来数据权限
这是硬规则。
例如:
```text
organization_relationship = sponsor
```
不代表:
```text
operator can view all users
```
数据权限仍由:
```text
Role + Permission + DataScope
```
决定。
---
# 第七十四章 source_campaigns
用于公益来源追踪。
字段:
```text
id
code
name
source_type
organization_id
activity_id
start_at
end_at
status
created_at
```
---
# 第七十五章 SourceType
建议:
```text
service_station
organization
activity
qr_code
official_account
community
enterprise
school
hospital
other
```
---
# 第七十六章 user_acquisition_sources
如果只记录用户首次来源:
可以直接:
```text
users.source_campaign_id
```
但为了未来支持多触点,建议:
```text
user_acquisition_sources
```
字段:
```text
id
user_id
source_campaign_id
source_scene
first_touch
created_at
```
---
# 第七十七章 V1.1 简化建议
为了避免过度设计:
首次上线只实现:
```text
users.registration_source
users.source_campaign_id
```
足够。
未来再独立拆表。
---
# 第七十八章 二维码参数
推荐统一 Scene:
```text
sourceCampaignId
activityId
serviceLocationId
```
不要把:
- 手机号
- 用户ID
- 敏感参数
直接放二维码。
---
# 第七十九章 首页聚合 API
为了减少首页多次请求,建议新增:
```text
GET /api/v1/home
```
返回:
```text
userStatus
banners
quickEntries
recommendations
recommendedServices
upcomingActivities
serviceLocation
featuredContent
safetyNotice
```
---
# 第八十章 为什么需要 Home Aggregate API
否则首页可能请求:
```text
banner
user status
recommendation
activity
service station
content
```
六七次接口。
V1.1 推荐由:
```text
HomeApplicationService
```
聚合。
但各业务模块仍保持自己的 Service。
---
# 第八十一章 Home API DTO
建议:
```json
{
"userState": {},
"banners": [],
"quickEntries": [],
"recommendations": [],
"serviceRecommendations": [],
"activities": [],
"serviceLocation": {},
"articles": [],
"safetyNotice": {}
}
```
---
# 第八十二章 Home API 不应自己实现业务逻辑
Home Service 只负责:
> 聚合。
不能复制:
- Match Eligibility
- Activity Eligibility
- Privacy Rules
必须调用正式业务模块。
---
# 第八十三章 QuickEntry 不需要数据库
8个核心入口已经正式固定。
因此:
> 不建议存 quick_entries 表。
前端/配置常量即可。
后台不允许运营随意重新排序。
---
# 第八十四章 FeatureFlag
可为尚未正式启用的入口配置:
```text
counselingEnabled
premaritalEnabled
serviceLocationEnabled
contentEnabled
```
入口结构固定。
是否启用:
> Config控制。
---
# 第八十五章 Activity 增量字段
现有 activities 建议增加:
```text
activity_type
registration_policy
target_group
industry_scope
post_event_interest_enabled
```
---
# 第八十六章 ActivityType
```text
matchmaking
interest_social
relationship_education
premarital_guidance
marriage_custom_culture
anti_fraud
```
---
# 第八十七章 RegistrationPolicy
不建议只存一个巨大 JSON。
如果规则简单:
```text
requires_identity_verified
requires_local_eligibility
requires_profile_approved
requires_searching_status
requires_manual_review
```
字段或配置快照均可。
---
# 第八十八章 Activity Capacity 修正
不能默认写死:
```text
male_limit
female_limit
```
推荐:
```text
total_capacity
```
配:
```text
activity_capacity_groups
```
字段:
```text
activity_id
group_code
rule_definition
capacity
approved_count
```
只有具体活动需要性别配额时才配置。
---
# 第八十九章 活动互选流程数据库增量
已有:
```text
activity_user_interests
```
继续使用。
新增:
```text
mutual_result_at
```
以及建议新增:
```text
activity_mutual_connection_consents
```
---
# 第九十章 activity_mutual_connection_consents
字段:
```text
id
activity_id
user_a_id
user_b_id
user_a_confirmed_at
user_b_confirmed_at
status
match_id
created_at
updated_at
```
---
# 第九十一章 活动互选正式流程
```text
A选择B
↓
B选择A
↓
形成mutual interest
↓
创建MutualConnectionConsent
↓
通知双方
↓
A确认开启沟通
↓
B确认开启沟通
↓
双方均确认
↓
创建新Match Episode
↓
创建Conversation
```
这是 V1.1 正式建议实现。
---
# 第九十二章 不能直接 mutual interest → Match
这是对早期文档的重要修正。
除非未来用户协议明确把:
> “活动互选”
本身定义为:
> 同意建立线上沟通。
目前采用更安全的:
> 二阶段同意。
---
# 第九十三章 Matchmaker 增量
红娘模块基本不改。
只增加服务转介:
```text
matchmaker → counseling
matchmaker → activity
matchmaker → service_location
```
---
# 第九十四章 Service Referral
可以增加:
```text
service_referrals
```
但 V1.1 不建议新增新表。
直接利用:
```text
source
source_business_id
```
创建相应服务申请即可。
---
# 第九十五章 Counseling来源
例如:
```text
user_self
matchmaker_referral
activity_followup
service_station
operator_assisted
```
---
# 第九十六章 operator_assisted 使用边界
如果线下工作人员协助群众创建服务:
必须记录:
```text
request_source = operator_assisted
created_by_operator_id
user_confirmed_at
```
不能工作人员自己替用户申请而不留痕。
---
# 第九十七章 新增 Operator Roles
建议:
```text
service_station_operator
counselor
counseling_manager
content_editor
```
---
# 第九十八章 角色是否必须独立
如果初期人员少:
一个 Operator 可以同时拥有:
```text
matchmaker
service_station_operator
```
或者:
```text
counselor
content_editor
```
不需要创建多个账号。
---
# 第九十九章 Service Station Operator 权限
建议:
```text
service_location.view
service_appointment.view
service_appointment.process
activity.checkin
service.assisted_registration
```
不拥有:
```text
user.full_search
message.content.review
user.sensitive.identity.full
```
---
# 第一百章 Counselor 权限
```text
counseling.service.view
counseling.service.process
counseling.note.create
```
DataScope:
```text
assigned
```
---
# 第一百零一章 Content Editor 权限
```text
content.view
content.create
content.edit
content.publish
```
默认:
> 无用户数据权限。
---
# 第一百零二章 数据隐私增量要求
以下新增数据属于高敏感/较敏感:
```text
本地资格佐证
咨询申请内容
咨询服务摘要
婚前辅导服务内容
```
需要加入:
> Data Classification。
---
# 第一百零三章 建议分类
```text
L2
服务预约信息
L3
本地资格佐证
L3
婚恋咨询服务信息
L3
婚前辅导记录
```
具体分类可统一到现有安全规范。
---
# 第一百零四章 咨询隐私
普通 Platform Admin:
> 不默认看咨询正文。
管理统计只看:
```text
数量
状态
完成情况
服务时效
```
---
# 第一百零五章 本地资格文件
Signed URL 前必须:
> 权限校验。
不能因为知道 FileId 就能下载。
---
# 第一百零六章 新增审计行为
必须 Audit:
```text
Banner发布/下架
服务站编辑
预约改期
咨询分配
咨询完成
查看本地资格证明
内容发布
专项项目成员审批
```
---
# 第一百零七章 SensitiveAccessLog 增量
至少:
```text
local_eligibility_evidence.view
counseling_sensitive_note.view
```
如果这些数据被定义为高敏感访问。
---
# 第一百零八章 Notification 增量类型
增加:
```text
service_appointment_submitted
service_appointment_confirmed
service_appointment_changed
service_appointment_cancelled
counseling_assigned
counseling_scheduled
counseling_completed
premarital_service_scheduled
local_eligibility_need_evidence
local_eligibility_verified
local_eligibility_rejected
```
---
# 第一百零九章 外部通知文案
微信订阅通知等外部消息:
> 使用中性文案。
例如:
```text
你的公益服务预约已有更新
```
避免:
```text
你的婚恋焦虑心理咨询已安排
```
减少锁屏隐私暴露。
---
# 第一百一十章 Analytics 增量
新增指标:
```text
BANNER_IMPRESSIONS
BANNER_CLICKS
SERVICE_APPOINTMENTS
SERVICE_APPOINTMENTS_COMPLETED
COUNSELING_REQUESTS
COUNSELING_COMPLETED
PREMARITAL_GUIDANCE_REQUESTS
PREMARITAL_GUIDANCE_COMPLETED
SERVICE_STATION_USERS
CONTENT_VIEWS
LOCAL_ELIGIBILITY_VERIFIED_USERS
SERVICE_PROGRAM_USERS
```
---
# 第一百一十一章 服务用户数与服务人次
必须区分。
例如:
```text
UNIQUE_SERVICE_USERS
```
与:
```text
SERVICE_OCCURRENCES
```
一个用户接受4次服务:
```text
用户数 = 1
服务人次 = 4
```
---
# 第一百一十二章 有效交友匹配指标
计划书提出年度“有效交友匹配”。
建议系统定义:
```text
EFFECTIVE_CONNECTION
```
一种推荐口径:
```text
Mutual Match
+
Two-Way Chat Started
```
但这是建议指标口径。
最终对外政府报送口径需要运营方确认后固化。
---
# 第一百一十三章 首页 Analytics
建议事件:
```text
home_banner_impression
home_banner_click
home_quick_entry_click
home_recommendation_impression
home_activity_click
home_service_location_click
home_content_click
```
---
# 第一百一十四章 业务事实仍以后端为准
例如:
```text
counseling completed
```
以:
```text
counseling_services.completed_at
```
为准。
不能只靠:
> 前端埋点。
---
# 第一百一十五章 用户准入 API 修订
原:
```text
/me/status
```
增加:
```text
localEligibilityStatus
```
例如:
```json
{
"loggedIn": true,
"phoneBound": true,
"realNameVerified": true,
"localEligibility": "verified",
"profileCompleted": true,
"profileReview": "approved"
}
```
---
# 第一百一十六章 App Routing 修订
启动路由建议:
```text
登录
↓
手机号
↓
实名
↓
本地资格声明
↓
资料
↓
择偶条件
↓
审核
↓
正常首页
```
---
# 第一百一十七章 本地资格补充佐证不能阻断所有公益内容
例如:
> 婚恋反诈课堂
可以开放。
真正婚恋匹配:
> 按平台 Eligibility 要求决定是否阻断。
---
# 第一百一十八章 Home API Capability
推荐后端返回:
```text
capabilities
```
例如:
```json
{
"canReceiveRecommendations": true,
"canSearchUsers": true,
"canApplyMatchmakingActivity": true,
"canApplyCounseling": true
}
```
前端不要自行推测。
---
# 第一百一十九章 Capability 是统一设计的重要延续
V1.1 新模块加入后:
更应该由:
```text
CapabilityService
```
统一判断。
避免每个页面自己写:
```text
if verified && approved...
```
---
# 第一百二十章 新模块代码目录建议
Backend 增加:
```text
banner/
service_location/
appointment/
counseling/
content/
service_program/
local_eligibility/
```
---
# 第一百二十一章 不新增过度“Service Center”超级模块
虽然用户前台叫:
> 公益服务中心。
后端仍保持独立领域:
```text
Appointment
Counseling
Content
ServiceLocation
```
不要全部塞进:
```text
service/
```
一个巨型模块。
---
# 第一百二十二章 Miniapp Service API
增加:
```text
services/banner.ts
services/serviceLocation.ts
services/appointment.ts
services/counseling.ts
services/content.ts
services/localEligibility.ts
services/serviceProgram.ts
```
---
# 第一百二十三章 Admin Modules
新增:
```text
modules/banner/
modules/counseling/
modules/content/
modules/service-location/
modules/service-program/
```
---
# 第一百二十四章 API 幂等要求
以下 POST 建议支持:
```text
Idempotency-Key
```
包括:
```text
创建服务预约
提交咨询申请
提交本地资格审核
申请专项服务
活动互选确认
```
---
# 第一百二十五章 Service Appointment 并发
同一预约被:
- 用户取消
- 工作人员确认
同时发生。
最终必须:
> 单一合法状态。
---
# 第一百二十六章 Counseling Assign 并发
两名管理员同时给同一咨询分配人员。
必须:
> 原子更新。
---
# 第一百二十七章 Counseling Service 不使用医疗术语
API 内部可以叫:
```text
counseling
```
前台主要使用:
```text
婚恋咨询
公益婚恋指导
```
不要将服务包装成:
> 心理诊断。
---
# 第一百二十八章 API 错误码新增
建议:
```text
BANNER_NOT_AVAILABLE
SERVICE_LOCATION_NOT_AVAILABLE
APPOINTMENT_CONFLICT
APPOINTMENT_ALREADY_CANCELLED
COUNSELING_SERVICE_NOT_AVAILABLE
COUNSELING_ALREADY_CLOSED
LOCAL_ELIGIBILITY_REQUIRED
LOCAL_ELIGIBILITY_EVIDENCE_REQUIRED
LOCAL_ELIGIBILITY_REVIEWING
SERVICE_PROGRAM_NOT_AVAILABLE
SERVICE_PROGRAM_ALREADY_JOINED
```
---
# 第一百二十九章 页面与 API 对照
## 首页 U18
```text
GET /home
```
---
## 服务站 U50
```text
GET /service-locations/{id}
```
---
## 服务预约 U51
```text
POST /service-appointments
```
---
## 我的预约 U52
```text
GET /service-appointments
```
---
## 婚恋课堂 U53
```text
GET /content/articles
```
---
## 内容详情 U54
```text
GET /content/articles/{id}
```
---
## 婚恋咨询 U55/U56/U57
```text
GET /counseling/services
POST /counseling/services
GET /counseling/services/{id}
```
---
## 婚前辅导 U58/U59
复用:
```text
/counseling/services
```
参数:
```text
serviceType = premarital_guidance
```
---
## 婚恋反诈 U60
复用:
```text
/content/articles?category=anti_fraud
```
---
## 本地资格 U62/U63
```text
/local-eligibility
```
---
# 第一百三十章 首页性能要求
Home Aggregate API:
建议:
```text
P95 < 1.5s
```
作为技术目标。
具体上线 SLA 结合实际环境压测确认。
---
# 第一百三十一章 Home Cache
可缓存:
```text
Banner
公开服务站
公开内容
活动摘要
```
不能盲目缓存:
```text
用户Capability
用户推荐
```
涉及用户状态必须正确失效。
---
# 第一百三十二章 首页推荐仍调用 Match Engine
Home API 不能自己写:
```text
SELECT users ORDER BY created_at
```
必须调用:
> RecommendationService。
---
# 第一百三十三章 Banner 定时任务
可:
> 查询时按时间过滤。
不一定需要定时 Job 改状态。
保持简单。
---
# 第一百三十四章 Service Location 当前只有一个阵地
仍然支持:
```text
status
```
未来暂停服务:
> 可立即下线预约入口。
---
# 第一百三十五章 服务站临时公告
建议直接增加:
```text
notice_text
```
或使用 Notification/Content。
V1.1 不需要独立:
```text
service_location_notices
```
除非后续公告很多。
---
# 第一百三十六章 婚前辅导双人参加
如果平台内双方希望共同参加:
可以增加:
```text
counseling_service_participants
```
但 V1.1 第一阶段不强制。
简单方案:
```text
primary_user_id
companion_user_id nullable
companion_confirmed_at
```
---
# 第一百三十七章 不允许一方擅自把对方加入辅导
如果 companion_user_id 是平台用户:
必须:
> 对方确认。
---
# 第一百三十八章 Service Program 与隐私
Program管理员只能看到:
> 服务项目必要信息。
不能因为用户加入某专项项目:
> 自动放开其全部婚恋档案。
---
# 第一百三十九章 内容与主办单位
文章可以增加:
```text
publisher_organization_id
```
例如:
> 乐活公益发布。
但内容展示不必每篇都堆多个组织Logo。
---
# 第一百四十章 用户服务历史统一视图
U64 公益服务记录建议由:
```text
ServiceHistoryQueryService
```
聚合:
```text
MatchmakerService
CounselingService
ActivityRegistration
ServiceAppointment
```
不新建:
```text
user_service_history
```
重复保存所有业务。
---
# 第一百四十一章 服务历史 API
```text
GET /api/v1/me/service-history
```
返回统一结构:
```json
{
"type": "counseling",
"title": "公益婚恋咨询",
"occurredAt": "...",
"status": "completed",
"businessId": "..."
}
```
---
# 第一百四十二章 数据库 Migration 建议顺序
V1.1 建议:
```text
V1xx__add_home_banners
V1xx__add_service_locations
V1xx__add_service_appointments
V1xx__add_counseling_services
V1xx__add_counseling_followups
V1xx__add_content_categories
V1xx__add_content_articles
V1xx__add_local_eligibility
V1xx__add_service_programs
V1xx__extend_activities_v11
V1xx__add_activity_mutual_connection_consent
V1xx__extend_organization_relationships
```
具体编号由当前数据库版本决定。
---
# 第一百四十三章 数据库索引增量
建议:
```text
home_banners(status,start_at,end_at,sort_order)
service_appointments(user_id,status)
service_appointments(service_location_id,preferred_date,status)
counseling_services(user_id,status)
counseling_services(assigned_operator_id,status)
counseling_services(scheduled_start_at)
content_articles(category_id,status,publish_at)
user_local_eligibilities(user_id)
user_local_eligibilities(verification_status)
service_program_members(service_program_id,status)
service_program_members(user_id,status)
```
---
# 第一百四十四章 唯一约束建议
```text
user_local_eligibilities.user_id
```
原则上一个用户一个当前本地资格主体。
Program:
```text
UNIQUE(service_program_id,user_id)
```
预约:
> 不建议做 lifetime unique。
---
# 第一百四十五章 状态历史
重要状态变更可以通过:
> Audit / domain event
保留。
V1.1 不需要给每个小业务都建 status_history 表。
---
# 第一百四十六章 删除规则
Banner:
> soft disable。
ServiceLocation:
> disable。
Counseling:
> close,不物理删除。
Article:
> offline。
ServiceProgram:
> closed/disabled。
Local Evidence:
> 按数据保留政策处理。
---
# 第一百四十七章 数据保留待确认
需要写入:
```text
PENDING_DECISIONS.md
```
包括:
```text
本地资格佐证保留多久
婚恋咨询记录保留多久
婚前辅导记录保留多久
服务预约历史保留多久
```
不得代码硬编码。
---
# 第一百四十八章 V1.1 权限矩阵增量
| 功能 | 平台管理员 | 红娘 | 咨询人员 | 服务站人员 | 内容编辑 | 志愿者 |
|---|---:|---:|---:|---:|---:|---:|
| Banner | 管理 | 否 | 否 | 否 | 按授权 | 否 |
| 服务站 | 管理 | 查看 | 查看 | 是 | 否 | 当前服务必要 |
| 预约 | 管理 | 相关 | 相关 | 是 | 否 | 否 |
| 婚恋咨询 | 管理摘要 | 转介 | 分配服务 | 申请登记 | 否 | 否 |
| 咨询记录 | 默认否 | 否 | Assigned | 否 | 否 | 否 |
| 内容 | 管理 | 查看 | 查看 | 查看 | 是 | 查看 |
| 本地资格证明 | 特殊权限 | 否 | 否 | 否 | 否 | 否 |
| 专项项目 | 管理 | 按服务 | 按服务 | 按服务 | 否 | 否 |
---
# 第一百四十九章 关键隐私测试新增
必须增加:
```text
咨询人员访问未分配服务 → 403
红娘访问咨询记录 → 403
服务站人员访问身份证 → 403
内容编辑访问用户详情 → 403
机构A查看机构B专项项目成员 → 403
普通管理员直接访问本地资格佐证文件 → 403
```
---
# 第一百五十章 首页测试新增
必须测试:
```text
Banner按时间显示
Banner按用户状态显示
已过期Banner不显示
核心8入口顺序固定
未实名用户不返回真实推荐
Paused不返回新推荐
Successful不返回找对象推荐
Service Location停用时入口正确降级
```
---
# 第一百五十一章 咨询流程测试
```text
用户申请
↓
管理员分配
↓
咨询人员查看
↓
排期
↓
完成
```
同时验证:
```text
无权限Operator不能访问
```
---
# 第一百五十二章 本地资格测试
必须:
```text
声明丹阳工作
↓
要求补充佐证
↓
上传
↓
审核
↓
verified
```
以及:
```text
无需补充的规则场景
```
如果运营以后允许。
---
# 第一百五十三章 Activity V1.1 测试重点
必须修订旧测试:
错误旧逻辑:
```text
Activity mutual → Match
```
新逻辑:
```text
Activity mutual
↓
Mutual Result
↓
A confirm communication
↓
B confirm communication
↓
Match
```
---
# 第一百五十四章 如果一方不确认沟通
结果:
> 不创建Conversation。
单向拒绝原因:
> 不向对方详细披露。
---
# 第一百五十五章 Existing Active Match
如果活动双方已经有 Active Match:
> 不创建新 Match。
可以直接:
> 引导已有聊天。
---
# 第一百五十六章 Prior Unmatch
如果双方以前曾 Unmatch:
本次重新形成沟通:
> 创建新的 Match Episode。
不要恢复旧 Episode。
---
# 第一百五十七章 Codex 开发计划影响
原 Phase 01~26 不推翻。
建议调整如下。
---
# 第一百五十八章 在 Phase 04 增加
```text
Local Eligibility基础字段与页面
```
但人脸核验具体 Provider:
> 保持 Pending。
---
# 第一百五十九章 Phase 11 Notification 增加
```text
预约
咨询
本地资格
```
通知。
---
# 第一百六十章 Phase 13 后新增 Phase 13A
```text
公益咨询与婚前辅导
```
---
# 第一百六十一章 Phase 14 Activity 升级
新增:
```text
activity_type
registration_policy
行业专场
多组织关联
```
---
# 第一百六十二章 Phase 16 Activity Mutual 修正
改成:
```text
Mutual Interest
+
双向开启沟通确认
+
Match Episode
```
---
# 第一百六十三章 Phase 19 Admin 增加
```text
Banner
公益咨询
内容
服务站
专项服务项目
```
---
# 第一百六十四章 Phase 20 Analytics 增加
```text
服务站
咨询
婚前辅导
内容
专项项目
来源渠道
```
---
# 第一百六十五章 推荐新增 Phase 19A
如果希望开发计划更清晰,可以在 Phase 19 前增加:
```text
Phase 19A 公益内容与服务站
```
但不是必须。
仍可放 Phase 19。
---
# 第一百六十六章 V1.1 新增配置
建议:
```text
banner.maxActiveCount
localEligibility.enabled
localEligibility.evidencePolicy
counseling.enabled
premarital.enabled
serviceLocation.enabled
content.enabled
activity.mutualConnectionConfirmationEnabled
```
---
# 第一百六十七章 已确认配置
以下功能:
> 已确认进入 V1.1。
```text
Banner
8个核心入口
服务站
婚恋咨询
婚前辅导
婚恋课堂
婚恋反诈
```
所以不是:
```text
PENDING_PRODUCT_SCOPE
```
Feature Flag 只是为了灰度和故障关闭。
---
# 第一百六十八章 仍然待确认
```text
人脸核验是否首发强制
人脸Provider
所有用户是否强制上传工作/居住佐证
佐证触发规则
咨询人员实际组织和资质
服务站开放时间
Banner最大数量
服务预约具体时段规则
```
---
# 第一百六十九章 V1.1 API 模块总览
新增后:
```text
/home
/banners(后台)
/service-locations
/service-appointments
/counseling/services
/content/categories
/content/articles
/local-eligibility
/service-programs
/operator/...
```
---
# 第一百七十章 不需要增加 API Gateway
仍然:
> 单一 Modular Monolith Backend。
所有:
```text
/api/v1
```
统一服务。
---
# 第一百七十一章 不需要为内容单独做CMS服务
Content Module:
> 直接在主后台。
---
# 第一百七十二章 不需要为咨询单独开发App
咨询人员:
> 登录同一 Web 后台。
根据权限看到:
> 公益咨询工作台。
---
# 第一百七十三章 不需要服务站专用App
服务站人员:
> 响应式 Web 后台。
现场手机/平板也能使用。
---
# 第一百七十四章 V1.1数据库最终新增结构
最终建议确认如下:
```text
home_banners
service_locations
service_appointments
counseling_services
counseling_followups
content_categories
content_articles
user_local_eligibilities
local_eligibility_evidences
service_programs
service_program_members
organization_relationships
activity_organizations
activity_mutual_connection_consents
```
这是 V1.1 最合理的增量范围。
---
# 第一百七十五章 明确不新增
```text
community_posts
comments
group_chat
feed
points
user_rankings
financial_budget
donations
face_embeddings
psychological_medical_records
complex_workflow_engine
```
---
# 第一百七十六章 V1.1数据模型核心原则
> **已有业务不重复建表。**
> **新的公益服务尽量复用现有用户、组织、通知、审计、风险和文件模块。**
> **婚前辅导复用 CounselingService,而不是另造一套系统。**
> **婚恋反诈复用 Content + Risk,而不是另造反诈平台。**
> **服务站预约和专业咨询分开:预约是“什么时候来”,咨询是“具体提供什么服务”。**
> **本地资格独立于实名认证,避免把两个不同概念混为一谈。**
> **活动继续共用 Activity,但通过 ActivityType 和 RegistrationPolicy 支持多类型公益活动。**
---
# 第一百七十七章 V1.1 API核心原则
> **所有核心行为继续服务端判断。**
> **Home API只聚合,不复制业务规则。**
> **新增服务必须复用统一Authentication、Permission、DataScope和Audit。**
> **所有敏感文件访问先授权再签名。**
> **所有关键POST考虑幂等。**
> **所有待确认参数配置化。**
---
# 第一百七十八章 最终结论
V1.1 增量后,系统数据库和 API 将从原来的:
```text
用户
+
匹配
+
聊天
+
活动
+
红娘
+
风控
```
正式升级为:
```text
可信用户体系
+
本地资格
+
线上婚恋匹配
+
安全聊天
+
公益红娘
+
多类型公益活动
+
固定线下服务站
+
服务预约
+
婚恋咨询
+
婚前辅导
+
婚恋课堂
+
婚恋反诈
+
专项公益项目
+
多组织协同
+
项目服务统计
```
同时仍然保持:
> 一个 PostgreSQL。
> 一个模块化单体后端。
> 一个微信小程序。
> 一个统一 Web 后台。
没有因为 V1.1 新增公益服务而引入不必要的微服务、工作流引擎、社区系统或大数据架构。
这使“善缘丹阳”既能完整承接最新项目计划书要求的线上线下一体化公益服务,又能保持开发、部署和后期维护成本可控。