# 天河基地小程序 - 软件需求文档 **版本**:1.1 **日期**:2026-04-07 **状态**:草稿(已经 Spec Review 修订) --- ## 第一章 项目概述 ### 1.1 项目背景与目标 **项目名称**:天河基地小程序 **委托方**:天河基地(甲方) **开发方**:乙方技术团队 **项目背景**:天河基地是以企业服务为核心的产业园区,需要一个数字化服务平台,整合园区入驻、活动、会场预约、成果对接等服务,并结合 AI 智能能力提升服务效率。 **核心目标**: - 为企业/个人用户提供一站式园区服务入口 - 通过飞书集成实现审批流程数字化 - 通过 AI 能力降低信息填写门槛、提升运营洞察 **交付时间**:合同签订后 **25 个工作日**内提交完整功能初版用于内部测试 --- ### 1.2 技术架构选型 | 层级 | 技术选型 | |------|---------| | 前端 | 微信原生小程序(WXML / WXSS / JavaScript)| | 后端 | Python(建议 FastAPI 或 Django REST Framework)| | 数据库 | MySQL 8.0+(关系型)| | 文件存储 | 腾讯云 COS 或微信云存储 | | AI 能力 | 接入大模型 API(如 GPT / 文心 / 通义)| | OCR | 腾讯云 OCR 或百度 OCR | | 地图 | 微信内置地图 / 腾讯地图 API | | 短信 | 腾讯云短信 / 阿里云短信 | | 第三方集成 | 飞书开放平台 API | | 消息推送 | 微信订阅消息 + 飞书机器人 | --- ### 1.3 开发周期与功能优先级 **优先级定义**: - **P0(必须上线)**:基础功能,影响核心流程 - **P1(应该上线)**:常规功能,提升体验 - **P2(可延后)**:AI 增强功能,迭代优化 **交付计划建议**: | 阶段 | 时间 | 目标 | |------|------|------| | 第1周 | Day 1-5 | 架构搭建、用户认证、首页、关于基地 | | 第2周 | Day 6-10 | 企业服务中心(入驻申请、场地展示、成果供需)+ 飞书集成启动(不可晚于 Day 6,需与客户 IT 团队联调)| | 第3周 | Day 11-15 | 活动与会场预约、飞书集成完成 | | 第4周 | Day 16-20 | 平台管理后台、消息通知、SMS 集成 | | 第5周 | Day 21-25 | AI 功能(P2 项目,可能延期至上线后迭代)、集成测试、联调 | > **注意**:AI 增强功能(P2)时间预算紧张,建议与甲方确认:P2 功能可在正式上线后第一个迭代版本补齐,不影响25日交付验收。 --- ## 第二章 用户角色与权限矩阵 ### 2.1 角色定义 | 角色 | 标识 | 说明 | |------|------|------| | 游客 | GUEST | 未登录用户,只能浏览公开信息 | | 注册用户 | USER | 微信登录后的普通用户 | | 企业用户 | ENTERPRISE | 完成企业认证的用户,可发布需求、申请入驻 | | 社区合伙人 | PARTNER | 审核通过后,拥有部分后台查看权限 | | 管理员 | ADMIN | 后台全权管理,内容审核、数据统计 | ### 2.2 权限矩阵 | 功能模块 | 游客 | 注册用户 | 企业用户 | 合伙人 | 管理员 | |---------|------|---------|---------|-------|-------| | 首页浏览 | ✅ | ✅ | ✅ | ✅ | ✅ | | 活动报名 | ❌ | ✅ | ✅ | ✅ | ✅ | | 活动报名信息查看 | ❌ | ❌ | ❌ | ✅ | ✅ | | 入驻申请 | ❌ | ✅ | ✅ | ✅ | ✅ | | 发布需求(找人才/资金)| ❌ | ❌ | ✅ | ✅ | ✅ | | 提交其他需求 | ❌ | ✅ | ✅ | ✅ | ✅ | | 问题反馈 | ❌ | ✅ | ✅ | ✅ | ✅ | | 会场预约 | ❌ | ✅ | ✅ | ✅ | ✅ | | 收藏/关注内容 | ❌ | ✅ | ✅ | ✅ | ✅ | | 内容审核 | ❌ | ❌ | ❌ | ❌ | ✅ | | 用户管理 | ❌ | ❌ | ❌ | ❌ | ✅ | | 数据统计后台 | ❌ | ❌ | ❌ | ❌ | ✅ | | 评分管理 | ❌ | ❌ | ❌ | ❌ | ✅ | --- ## 第三章 功能模块需求 ### 3.1 平台首页 #### 用户故事 - 作为**游客**,我希望打开小程序就能看到基地动态、活动公告、空间介绍,了解园区 - 作为**注册用户**,我希望首页能展示与我相关的推荐内容 - 作为**企业用户**,我希望快速入口能直达入驻申请、需求发布等核心功能 #### 业务流程 ``` 用户打开小程序 ├── 未登录 → 展示公开内容(Banner/活动/空间) └── 已登录 → 展示个性化内容 + 快捷入口 ├── Banner 轮播(后台配置) ├── 活动公告栏(近2周活动) ├── 空间展示(办公/商业/会场) ├── 科技成果对接入口 ├── 企业需求发布入口 ├── 技术经理人平台入口 └── 申请成为社区合伙人入口 ``` #### 数据模型与字段 **Banner 表(`banner`)** | 字段 | 类型 | 说明 | |------|------|------| | id | INT PK | 主键 | | title | VARCHAR(100) | 标题 | | image_url | VARCHAR(255) | 图片链接 | | link_type | ENUM('page','url','none') | 跳转类型 | | link_target | VARCHAR(255) | 跳转目标路径或 URL | | sort_order | INT | 排序权重 | | is_active | BOOLEAN | 是否启用 | | created_at | DATETIME | 创建时间 | #### API 接口清单 | 方法 | 路径 | 说明 | 优先级 | |------|------|------|-------| | GET | `/api/v1/banners` | 获取首页 Banner 列表 | P0 | | GET | `/api/v1/home/activities` | 获取近2周活动(最多10条)| P0 | | GET | `/api/v1/home/spaces/summary` | 获取空间展示摘要 | P0 | | GET | `/api/v1/home/achievements` | 获取科技成果展示列表 | P0 | | POST | `/api/v1/partner/apply` | 提交社区合伙人申请 | P1 | | GET | `/api/v1/admin/partner-applications` | 后台查看合伙人申请列表 | P1 | | PUT | `/api/v1/admin/partner-applications/{id}/review` | 审核合伙人申请 | P1 | | GET | `/api/v1/admin/activity-registrations` | 合伙人/管理员查看活动报名信息 | P1 | --- ### 3.2 企业服务中心 #### 用户故事 - 作为**企业用户**,我希望在线提交入驻申请,并实时追踪审批进度 - 作为**企业用户**,我希望发布招聘、融资等需求,让其他用户看到 - 作为**企业用户**,我希望对场地/设施问题进行反馈并跟踪处理进度 - 作为**管理员**,我希望在飞书内完成审批,结果自动同步到小程序 #### 业务流程 **入驻申请流程:** ``` 企业用户填写多步骤申请表单 → 上传营业执照等材料(OCR 自动识别填充) → 提交申请 → 飞书审批流程触发(通知审批人) → 审批进度实时同步到小程序 → 审批通过 → 企业状态升级为"入驻企业" → 审批拒绝 → 通知用户并说明原因 ``` **成果供需发布流程:** ``` 企业用户填写需求(找人才/找资金/找政策/找技术) → AI 辅助生成标题和描述(可选) → 提交审核 → 管理员审核通过后公开展示 → 其他用户可查看并联系 ``` **问题反馈流程:** ``` 用户提交反馈(场地/设施/服务) → AI 自动分类工单类型 → 分配给对应处理人 → 处理人更新进度(用户实时可见) → 问题解决 → 用户满意度评价 ``` #### 数据模型与字段 **企业信息表(`enterprise`)** | 字段 | 类型 | 说明 | |------|------|------| | id | INT PK | 主键 | | user_id | INT FK | 关联用户 | | name | VARCHAR(100) | 企业名称 | | unified_credit_code | VARCHAR(50) | 统一社会信用代码 | | industry | VARCHAR(50) | 所属行业 | | scale | ENUM('1-10','11-50','51-200','200+') | 企业规模 | | business_license_url | VARCHAR(255) | 营业执照图片 | | status | ENUM('pending','approved','rejected') | 认证状态 | | created_at | DATETIME | 创建时间 | | updated_at | DATETIME | 更新时间 | **入驻申请表(`settlement_application`)** | 字段 | 类型 | 说明 | |------|------|------| | id | INT PK | 主键 | | user_id | INT FK | 提交用户(直接关联,支持快速查询"我的申请")| | enterprise_id | INT FK | 关联企业 | | project_name | VARCHAR(100) | 项目名称 | | project_desc | TEXT | 项目简介 | | space_type | ENUM('office','commercial') | 需求空间类型 | | space_area | DECIMAL(8,2) | 需求面积(㎡)| | budget | DECIMAL(10,2) | 预算(元/月)| | attachments | JSON | 附件 URL 列表 | | feishu_approval_id | VARCHAR(100) | 飞书审批实例 ID(审批触发后填写)| | status | ENUM('draft','submitted','reviewing','approved','rejected') | 申请状态 | | reject_reason | TEXT | 拒绝原因 | | created_at | DATETIME | 创建时间 | | updated_at | DATETIME | 更新时间 | **场地表(`space`)** | 字段 | 类型 | 说明 | |------|------|------| | id | INT PK | 主键 | | name | VARCHAR(100) | 场地名称 | | type | ENUM('office','commercial') | 场地类型 | | images | JSON | 图片列表 | | floor | VARCHAR(20) | 楼层 | | area | DECIMAL(8,2) | 面积(㎡)| | price_per_month | DECIMAL(10,2) | 月租金(元)| | description | TEXT | 详情描述 | | is_available | BOOLEAN | 是否可租 | | sort_order | INT | 排序 | | created_at | DATETIME | 创建时间 | | updated_at | DATETIME | 更新时间 | **成果供需表(`requirement_post`)** | 字段 | 类型 | 说明 | |------|------|------| | id | INT PK | 主键 | | user_id | INT FK | 发布用户(所有用户可发布"其他需求")| | enterprise_id | INT FK NULLABLE | 发布企业(企业用户发布人才/资金等需求时填写)| | type | ENUM('talent','funding','policy','technology','other') | 需求类型('other' 类型无需企业认证)| | title | VARCHAR(200) | 标题(可 AI 生成)| | description | TEXT | 详细描述(可 AI 生成)| | budget | DECIMAL(10,2) | 预算/金额(可选)| | attachments | JSON | 附件 URL 列表 | | status | ENUM('pending','published','rejected') | 审核状态 | | view_count | INT | 浏览次数 | | created_at | DATETIME | 创建时间 | | updated_at | DATETIME | 更新时间 | > **业务规则**:type 为 'talent'/'funding'/'technology' 时,`enterprise_id` 必填(需企业用户权限);type 为 'other'/'policy' 时,`enterprise_id` 可为 NULL(注册用户即可发布)。 **技术成果表(`tech_achievement`)** | 字段 | 类型 | 说明 | |------|------|------| | id | INT PK | 主键 | | title | VARCHAR(200) | 成果名称 | | institution | VARCHAR(100) | 来源高校/院所 | | description | TEXT | 成果描述 | | images | JSON | 图片列表 | | contact_name | VARCHAR(50) | 联系人 | | contact_phone | VARCHAR(20) | 联系电话 | | status | ENUM('pending','published','archived') | 状态(archived 表示已下架)| | created_at | DATETIME | 创建时间 | | updated_at | DATETIME | 更新时间 | **技术经理人表(`tech_manager`)** | 字段 | 类型 | 说明 | |------|------|------| | id | INT PK | 主键 | | name | VARCHAR(50) | 姓名 | | avatar_url | VARCHAR(255) | 头像 | | title | VARCHAR(100) | 职称/头衔 | | expertise | VARCHAR(200) | 擅长领域 | | description | TEXT | 个人简介 | | contact_phone | VARCHAR(20) | 联系电话 | | is_active | BOOLEAN | 是否展示 | | sort_order | INT | 排序 | | created_at | DATETIME | 创建时间 | | updated_at | DATETIME | 更新时间 | > 技术经理人为管理员维护的静态数据,通过后台 CRUD 管理。 **用户收藏表(`user_favorite`)** | 字段 | 类型 | 说明 | |------|------|------| | id | INT PK | 主键 | | user_id | INT FK | 关联用户 | | target_type | ENUM('activity','requirement','achievement','tech_manager','policy') | 收藏内容类型 | | target_id | INT | 被收藏内容的 ID | | created_at | DATETIME | 收藏时间 | > UNIQUE 约束:`(user_id, target_type, target_id)`,防止重复收藏。 **社区合伙人申请表(`partner_application`)** | 字段 | 类型 | 说明 | |------|------|------| | id | INT PK | 主键 | | user_id | INT FK | 申请用户 | | name | VARCHAR(50) | 姓名 | | company | VARCHAR(100) | 单位 | | reason | TEXT | 申请理由 | | status | ENUM('pending','approved','rejected') | 审核状态 | | reject_reason | TEXT | 拒绝原因 | | created_at | DATETIME | 申请时间 | | updated_at | DATETIME | 更新时间 | **问题工单表(`feedback_ticket`)** | 字段 | 类型 | 说明 | |------|------|------| | id | INT PK | 主键 | | user_id | INT FK | 提交用户 | | category | ENUM('space','facility','service','other') | 问题分类(AI 自动分类)| | title | VARCHAR(200) | 问题标题 | | content | TEXT | 问题详情 | | attachments | JSON | 图片附件 | | assignee_id | INT FK | 处理人 | | status | ENUM('pending','processing','resolved','closed') | 工单状态 | | satisfaction | TINYINT | 满意度评分(1-5)| | created_at | DATETIME | 创建时间 | | resolved_at | DATETIME | 解决时间 | | updated_at | DATETIME | 更新时间 | #### API 接口清单 | 方法 | 路径 | 说明 | 优先级 | |------|------|------|-------| | POST | `/api/v1/settlement/apply` | 提交入驻申请 | P0 | | GET | `/api/v1/settlement/status` | 查询我的申请状态 | P0 | | GET | `/api/v1/spaces` | 获取场地列表 | P0 | | GET | `/api/v1/spaces/{id}` | 获取场地详情 | P0 | | GET | `/api/v1/achievements` | 获取科技成果列表 | P0 | | GET | `/api/v1/tech-managers` | 获取技术经理人列表 | P0 | | GET | `/api/v1/requirements` | 获取成果供需列表 | P0 | | POST | `/api/v1/requirements` | 发布需求(人才/资金等)| P0 | | GET | `/api/v1/requirements/{id}` | 需求详情 | P0 | | POST | `/api/v1/feedback` | 提交问题反馈 | P0 | | GET | `/api/v1/feedback/mine` | 查看我的反馈工单列表 | P0 | | GET | `/api/v1/feedback/{id}` | 查看工单详情及进度 | P0 | | POST | `/api/v1/feedback/{id}/rate` | 提交满意度评价 | P0 | | POST | `/api/v1/favorites` | 添加收藏 | P1 | | DELETE | `/api/v1/favorites/{target_type}/{target_id}` | 取消收藏 | P1 | | GET | `/api/v1/favorites` | 我的收藏列表(可按 target_type 筛选)| P1 | | POST | `/api/v1/ai/generate-content` | AI 辅助生成需求标题/描述 | P2 | | POST | `/api/v1/ocr/business-license` | 营业执照 OCR 识别 | P1 | | POST | `/api/v1/ai/classify-feedback` | AI 自动分类工单 | P2 | | GET | `/api/v1/ai/recommend-spaces` | AI 智能推荐场地(别名同 recommend-venues)| P2 | --- ### 3.3 活动与会场 #### 用户故事 - 作为**注册用户**,我希望浏览活动列表并在线报名,收到活动提醒 - 作为**注册用户**,我希望查看会场详情并在线预约会议室 - 作为**管理员**,我希望审批会场申请并自动推送门禁密码给预约人 #### 业务流程 **活动报名流程:** ``` 用户浏览活动列表(支持卡片/瀑布流) → 查看活动详情(图片/时间/地点定位) → 选择报名方式 ├── 扫二维码报名 └── 小程序内填写信息报名 → 报名成功 → 微信订阅消息通知 → 活动开始前3天自动提醒 ``` **会场预约流程:** ``` 用户浏览会场列表(按时间/容量/设施筛选) → 查看会场详情(图片/规格/租金) → 选择预约类型 ├── 共享会议室 → 直接选时间段预约 └── 大型会场 → 填写申请资料 + 上传文件 → 提交预约 → 管理员审批(大型会场)或直接确认(共享会议室) → 预约成功 → 推送确认通知 + 门禁密码 → 使用后自动统计会场使用率 ``` #### 数据模型与字段 **活动表(`activity`)** | 字段 | 类型 | 说明 | |------|------|------| | id | INT PK | 主键 | | title | VARCHAR(200) | 活动名称 | | cover_image | VARCHAR(255) | 封面图 | | images | JSON | 活动图片列表 | | content | TEXT | 活动详情(富文本)| | start_time | DATETIME | 开始时间 | | end_time | DATETIME | 结束时间 | | location | VARCHAR(200) | 活动地点 | | latitude | DECIMAL(10,7) | 纬度 | | longitude | DECIMAL(10,7) | 经度 | | signup_type | ENUM('qrcode','inapp','both') | 报名方式 | | qrcode_url | VARCHAR(255) | 二维码图片 | | max_participants | INT | 最大报名人数(0为不限)| | current_participants | INT | 当前报名人数 | | status | ENUM('draft','published','cancelled','ended') | 活动状态 | | created_by | INT FK | 创建管理员 | | created_at | DATETIME | 创建时间 | | updated_at | DATETIME | 更新时间 | **活动报名表(`activity_registration`)** | 字段 | 类型 | 说明 | |------|------|------| | id | INT PK | 主键 | | activity_id | INT FK | 关联活动 | | user_id | INT FK | 报名用户 | | name | VARCHAR(50) | 姓名 | | phone | VARCHAR(20) | 手机号 | | company | VARCHAR(100) | 单位(可选)| | extra_info | JSON | 自定义报名字段 | | status | ENUM('registered','cancelled') DEFAULT 'registered' | 报名状态 | | registered_at | DATETIME | 报名时间 | | updated_at | DATETIME | 更新时间 | > UNIQUE 约束:`(activity_id, user_id)`,防止重复报名。取消报名通过 status 字段标记,不删除记录。 **会场表(`venue`)** | 字段 | 类型 | 说明 | |------|------|------| | id | INT PK | 主键 | | name | VARCHAR(100) | 会场名称 | | type | ENUM('meeting_room','conference','hall') | 类型 | | images | JSON | 图片列表 | | capacity | INT | 容纳人数 | | area | DECIMAL(8,2) | 面积(㎡)| | floor | VARCHAR(20) | 楼层 | | price_per_hour | DECIMAL(8,2) | 每小时租金 | | facilities | JSON | 设施列表(投影/白板/空调等)| | is_shared | BOOLEAN | 是否共享会议室(直接预约)| | is_active | BOOLEAN | 是否可预约 | | created_at | DATETIME | 创建时间 | | updated_at | DATETIME | 更新时间 | **会场预约表(`venue_booking`)** | 字段 | 类型 | 说明 | |------|------|------| | id | INT PK | 主键 | | venue_id | INT FK | 关联会场 | | user_id | INT FK | 预约用户 | | enterprise_id | INT FK NULLABLE | 关联企业(可选)| | start_time | DATETIME | 预约开始时间 | | end_time | DATETIME | 预约结束时间 | | purpose | TEXT | 使用目的 | | participants_count | INT | 参与人数 | | attachments | JSON | 申请附件(大型会场)| | feishu_approval_id | VARCHAR(100) NULLABLE | 飞书审批实例 ID(大型会场审批触发后填写)| | access_code | VARCHAR(20) | 门禁密码(审批通过后生成)| | status | ENUM('pending','approved','rejected','cancelled','completed') | 预约状态 | | reject_reason | TEXT | 拒绝原因 | | created_at | DATETIME | 创建时间 | | updated_at | DATETIME | 更新时间 | #### API 接口清单 | 方法 | 路径 | 说明 | 优先级 | |------|------|------|-------| | GET | `/api/v1/activities` | 活动列表(分页+筛选)| P0 | | GET | `/api/v1/activities/{id}` | 活动详情 | P0 | | POST | `/api/v1/activities/{id}/register` | 活动报名 | P0 | | PUT | `/api/v1/activities/{id}/cancel-registration` | 取消报名 | P0 | | GET | `/api/v1/my/activity-registrations` | 我的报名记录 | P0 | | GET | `/api/v1/venues` | 会场列表(支持筛选)| P0 | | GET | `/api/v1/venues/{id}` | 会场详情 | P0 | | GET | `/api/v1/venues/{id}/availability` | 查询会场可用时间段 | P0 | | POST | `/api/v1/venues/{id}/book` | 提交会场预约 | P0 | | GET | `/api/v1/my/venue-bookings` | 我的预约记录 | P0 | | GET | `/api/v1/ai/recommend-activities` | AI 推荐活动 | P2 | --- ### 3.4 AI 智能助手 #### 用户故事 - 作为**用户**,我希望发布需求时 AI 能根据关键词自动生成标题和描述 - 作为**用户**,我希望活动开始前3天收到自动提醒 - 作为**管理员**,我希望 AI 自动分类反馈工单,减少人工分拣 #### AI 能力清单与调用策略 | AI 功能 | 触发时机 | 调用方式 | 降级方案 | 优先级 | |---------|---------|---------|---------|-------| | 智能表单填写 | OCR 识别营业执照后 | 同步调用 | 用户手动填写 | P1 | | 需求内容生成 | 用户输入关键词时 | 异步调用 | 用户自行编写 | P2 | | 智能场地推荐 | 用户进入找场地页面 | 异步调用 | 展示全部列表 | P2 | | 工单自动分类 | 用户提交反馈后 | 异步调用 | 默认分类"其他" | P2 | | 活动智能推荐 | 用户进入活动列表 | 异步调用 | 按时间排序 | P2 | | AI 数据分析报告 | 管理员触发/定时任务 | 异步调用 | 展示原始数据 | P2 | | 满意度分析 | 评价数据积累后 | 定时批处理 | 跳过 | P2 | #### 数据模型与字段 **AI 调用日志表(`ai_call_log`)** | 字段 | 类型 | 说明 | |------|------|------| | id | INT PK | 主键 | | user_id | INT FK | 调用用户 | | feature | VARCHAR(50) | 功能标识 | | input | TEXT | 输入内容 | | output | TEXT | AI 输出内容 | | tokens_used | INT | Token 消耗 | | latency_ms | INT | 响应时长(ms)| | status | ENUM('success','failed','fallback') | 调用状态 | | created_at | DATETIME | 调用时间 | #### API 接口清单 | 方法 | 路径 | 说明 | 优先级 | |------|------|------|-------| | POST | `/api/v1/ai/generate-content` | AI 生成需求标题/描述 | P2 | | POST | `/api/v1/ai/classify-feedback` | AI 分类工单 | P2 | | POST | `/api/v1/ai/recommend-venues` | 智能推荐场地(统一入口)| P2 | | GET | `/api/v1/ai/recommend-activities` | 推荐活动列表 | P2 | | POST | `/api/v1/ai/analysis-report` | 生成数据分析报告 | P2 | --- ### 3.5 系统集成 #### 3.5.1 飞书集成 **审批流程集成**: ``` 入驻申请提交 → 后端调用飞书审批 API 创建审批实例 → 飞书推送审批任务给审批人 → 审批人在飞书完成审批 → 飞书回调 Webhook 通知后端 → 后端更新申请状态 → 微信订阅消息通知申请人结果 ``` **飞书集成配置(环境变量 + 运营配置表)** > **安全说明**:飞书 `app_id` 和 `app_secret` 通过环境变量注入(`FEISHU_APP_ID` / `FEISHU_APP_SECRET`),不存入数据库,与 Section 5.2 安全要求保持一致。 数据库仅存储非敏感运营配置: **飞书运营配置表(`feishu_config`)** | 字段 | 类型 | 说明 | |------|------|------| | id | INT PK | 主键(单行)| | approval_code | VARCHAR(100) | 审批定义 Code | | webhook_token | VARCHAR(100) | 回调验证 Token | | is_active | BOOLEAN | 是否启用飞书集成 | | updated_at | DATETIME | 最后更新时间 | #### 3.5.2 OCR 识别 | 识别场景 | 文件类型 | 提取字段 | |---------|---------|---------| | 营业执照 | 图片/PDF | 企业名称、统一社会信用代码、法人姓名、注册地址 | | 项目计划书 | PDF/Word | 项目名称、团队规模(辅助填写)| #### 3.5.3 短信服务 短信服务用于手机号验证码绑定,作为微信授权的补充渠道。 | 使用场景 | 说明 | |---------|------| | 手机号绑定验证码 | 用户绑定手机号时发送 6 位验证码,有效期 5 分钟 | | 关键审批结果备用通知 | 当用户未订阅微信模板消息时,可通过短信通知审批结果(可选)| **验证码记录表(`sms_verification`)** | 字段 | 类型 | 说明 | |------|------|------| | id | INT PK | 主键 | | phone | VARCHAR(20) | 手机号 | | code | VARCHAR(10) | 验证码 | | purpose | VARCHAR(50) | 用途(当前值:bind_phone;预留扩展)| | is_used | BOOLEAN | 是否已使用 | | expired_at | DATETIME | 过期时间 | | created_at | DATETIME | 创建时间 | #### 3.5.4 消息通知策略 | 通知场景 | 通知方式 | 接收方 | |---------|---------|-------| | 入驻申请审批结果 | 微信订阅消息 | 申请人 | | 新入驻申请待审批 | 飞书消息 | 管理员 | | 活动报名成功 | 微信订阅消息 | 报名人 | | 活动开始前3天提醒 | 微信订阅消息 | 报名人 | | 会场预约审批结果 | 微信订阅消息 | 预约人 | | 会场门禁密码 | 微信订阅消息 | 预约人 | | 反馈工单状态变更 | 微信订阅消息 | 提交人 | | 需求审核结果 | 微信订阅消息 | 发布企业 | | 手机号绑定验证码 | 短信 | 绑定用户 | #### API 接口清单 | 方法 | 路径 | 说明 | 优先级 | |------|------|------|-------| | POST | `/api/v1/feishu/callback` | 飞书审批回调 Webhook | P1 | | POST | `/api/v1/ocr/business-license` | 营业执照 OCR | P1 | | POST | `/api/v1/sms/send` | 发送手机号验证码 | P1 | | POST | `/api/v1/notify/send` | 内部触发通知(系统调用)| P1 | --- ### 3.6 平台管理后台 #### 用户故事 - 作为**管理员**,我希望管理所有用户、审核内容、配置 Banner - 作为**管理员**,我希望看到运营数据看板并生成报告 #### 数据模型与字段 **用户表(`user`)** | 字段 | 类型 | 说明 | |------|------|------| | id | INT PK | 主键 | | openid | VARCHAR(100) UNIQUE | 微信 OpenID(应用维度唯一标识)| | union_id | VARCHAR(100) NULLABLE | 微信 UnionID(跨应用唯一标识,有开放平台时填写)| | nickname | VARCHAR(50) | 微信昵称 | | avatar_url | VARCHAR(255) | 头像 | | phone | VARCHAR(20) | 手机号(加密存储)| | role | ENUM('user','enterprise','partner','admin') | 角色 | | is_active | BOOLEAN | 是否启用 | | created_at | DATETIME | 注册时间 | | last_login_at | DATETIME | 最后登录时间 | **评分配置表(`score_config`)** | 字段 | 类型 | 说明 | |------|------|------| | id | INT PK | 主键 | | category | ENUM('settlement','development') | 评分类别(入驻/发展)| | dimension | VARCHAR(100) | 评分维度名称 | | weight | DECIMAL(5,2) | 权重(%)| | description | TEXT | 维度说明 | **项目评分表(`enterprise_score`)** | 字段 | 类型 | 说明 | |------|------|------| | id | INT PK | 主键 | | enterprise_id | INT FK | 关联企业 | | config_id | INT FK | 评分维度 | | score | DECIMAL(5,2) | 得分 | | remark | TEXT | 备注 | | scored_by | INT FK | 评分管理员 | | scored_at | DATETIME | 评分时间 | | updated_at | DATETIME | 更新时间 | #### API 接口清单(后台) | 方法 | 路径 | 说明 | 优先级 | |------|------|------|-------| | GET | `/api/v1/admin/users` | 用户列表 | P0 | | PUT | `/api/v1/admin/users/{id}/role` | 修改用户角色 | P0 | | GET | `/api/v1/admin/applications` | 入驻申请列表 | P0 | | PUT | `/api/v1/admin/applications/{id}/review` | 审核入驻申请 | P0 | | GET | `/api/v1/admin/requirements` | 需求列表审核 | P0 | | PUT | `/api/v1/admin/requirements/{id}/review` | 审核需求发布 | P0 | | GET | `/api/v1/admin/feedback` | 工单列表 | P0 | | PUT | `/api/v1/admin/feedback/{id}/assign` | 分配工单 | P0 | | PUT | `/api/v1/admin/feedback/{id}/resolve` | 标记工单解决 | P0 | | GET | `/api/v1/admin/bookings` | 会场预约列表 | P0 | | PUT | `/api/v1/admin/bookings/{id}/review` | 审批会场预约 | P0 | | POST | `/api/v1/admin/banners` | 新增 Banner | P0 | | GET | `/api/v1/admin/banners` | 后台 Banner 列表(含未启用)| P0 | | PUT | `/api/v1/admin/banners/{id}` | 编辑 Banner | P0 | | DELETE | `/api/v1/admin/banners/{id}` | 删除 Banner | P0 | | POST | `/api/v1/admin/activities` | 新增活动 | P0 | | PUT | `/api/v1/admin/activities/{id}` | 编辑活动 | P0 | | GET | `/api/v1/admin/stats/overview` | 运营数据概览 | P1 | | GET | `/api/v1/admin/stats/venues` | 会场使用统计 | P1 | | GET | `/api/v1/admin/scores` | 企业评分列表 | P1 | | POST | `/api/v1/admin/scores` | 录入评分 | P1 | | GET | `/api/v1/admin/ai/insight-report` | AI 生成洞察报告 | P2 | | POST | `/api/v1/admin/applications/{id}/export-materials` | 一键生成企业完整申报材料(附件下载)| P1 | | POST | `/api/v1/admin/tech-managers` | 新增技术经理人 | P0 | | PUT | `/api/v1/admin/tech-managers/{id}` | 编辑技术经理人 | P0 | | DELETE | `/api/v1/admin/tech-managers/{id}` | 删除技术经理人 | P0 | | POST | `/api/v1/admin/spaces` | 新增场地 | P0 | | PUT | `/api/v1/admin/spaces/{id}` | 编辑场地 | P0 | | DELETE | `/api/v1/admin/spaces/{id}` | 删除场地 | P0 | | POST | `/api/v1/admin/venues` | 新增会场 | P0 | | PUT | `/api/v1/admin/venues/{id}` | 编辑会场 | P0 | | DELETE | `/api/v1/admin/venues/{id}` | 删除会场 | P0 | | PUT | `/api/v1/admin/activities/{id}/status` | 变更活动状态(发布/取消/结束)| P0 | | POST | `/api/v1/admin/achievements` | 新增科技成果 | P0 | | GET | `/api/v1/admin/achievements` | 后台科技成果列表(含待审核)| P0 | | PUT | `/api/v1/admin/achievements/{id}` | 编辑科技成果 | P0 | | DELETE | `/api/v1/admin/achievements/{id}` | 删除/下架科技成果 | P0 | --- ### 3.7 关于基地 #### 数据模型 **基地信息表(`base_info`)** | 字段 | 类型 | 说明 | |------|------|------| | id | INT PK | 主键(单行配置)| | name | VARCHAR(100) | 基地名称 | | intro | TEXT | 图文介绍(富文本)| | images | JSON | 图片列表 | | contact_phone | VARCHAR(20) | 客服电话 | | address | VARCHAR(200) | 地址 | | latitude | DECIMAL(10,7) | 纬度 | | longitude | DECIMAL(10,7) | 经度 | | updated_at | DATETIME | 最后更新时间 | #### API 接口清单 | 方法 | 路径 | 说明 | 优先级 | |------|------|------|-------| | GET | `/api/v1/base-info` | 获取基地介绍 | P0 | | PUT | `/api/v1/admin/base-info` | 后台更新基地介绍 | P0 | --- ## 第四章 通用能力 ### 4.1 认证与授权 #### 登录流程 ``` 用户点击微信授权登录 → 小程序调用 wx.login() 获取 code → 后端用 code + AppID + AppSecret 换取 openid + session_key(+ union_id 如有) → 后端生成 access_token(7天)和 refresh_token(30天)返回前端 → 前端将两个 token 存入 wx.setStorageSync → 后续请求携带 Authorization: Bearer → access_token 过期 → 前端用 refresh_token 静默换取新 access_token → refresh_token 过期 → 要求用户重新登录 ``` #### JWT Token 设计 **access_token**(有效期7天): | 字段 | 说明 | |------|------| | sub | 用户 ID | | role | 用户角色 | | exp | 过期时间(7天)| | iat | 签发时间 | > 注意:`openid` 不写入 JWT payload(openid 是敏感的稳定标识符,JWT payload 仅 base64 编码非加密;后端通过 `sub` 查 user 表获取 openid)。 **refresh_token**(有效期30天):独立生成的不透明随机字符串,存储于后端 Redis,与 `user_id` 关联。 **`POST /api/v1/auth/refresh` 请求体**: ```json { "refresh_token": "" } ``` 返回新的 `access_token`(不更新 refresh_token)。 #### API 接口清单 | 方法 | 路径 | 说明 | 优先级 | |------|------|------|-------| | POST | `/api/v1/auth/wx-login` | 微信登录,返回 JWT | P0 | | POST | `/api/v1/auth/refresh` | 刷新 Token | P0 | | GET | `/api/v1/auth/profile` | 获取当前用户信息 | P0 | | PUT | `/api/v1/auth/profile` | 更新个人/企业信息 | P0 | | POST | `/api/v1/auth/phone` | 绑定手机号(微信授权)| P0 | #### 权限中间件设计 ```python # 后端统一鉴权中间件 # 装饰器 @require_role(roles=['admin', 'enterprise']) # → 解析 JWT → 校验 role → 通过/拒绝(403) ``` --- ### 4.2 消息通知 #### 微信订阅消息模板 | 消息模板 | 触发事件 | 关键字段 | |---------|---------|---------| | 审批结果通知 | 入驻申请/会场预约审批完成 | 申请类型、结果、时间、备注 | | 活动报名成功 | 用户报名后 | 活动名称、时间、地点 | | 活动提醒 | 活动开始前3天定时任务触发 | 活动名称、开始时间、地点 | | 工单状态变更 | 反馈工单处理进度更新 | 工单编号、状态、处理说明 | | 门禁密码通知 | 会场预约通过后 | 会场名称、使用时间、门禁密码 | **定时任务设计(APScheduler / Celery)**: | 任务 | 触发方式 | 频率 | |------|---------|------| | 活动开始前3天提醒 | Cron 每日上午9点 | 每天 | | AI 数据洞察报告生成 | Cron 每周一 | 每周 | | 会场使用率统计 | Cron 每日凌晨 | 每天 | --- ### 4.3 文件上传 #### 上传策略 ``` 前端直传腾讯云 COS: → 前端请求后端获取预签名 URL → 前端直接上传文件到 COS → 上传成功后将文件 URL 保存到业务字段 支持的文件类型: - 图片:JPG / PNG / WEBP(最大 10MB) - 文档:PDF / DOC / DOCX(最大 20MB) - 压缩包:ZIP(最大 50MB) ``` #### 文件记录表(`file_record`) | 字段 | 类型 | 说明 | |------|------|------| | id | INT PK | 主键 | | user_id | INT FK | 上传用户 | | file_name | VARCHAR(200) | 原始文件名 | | file_url | VARCHAR(255) | COS 存储 URL | | file_size | INT | 文件大小(字节)| | file_type | VARCHAR(50) | 文件 MIME 类型 | | business_type | VARCHAR(50) | 业务用途标识 | | created_at | DATETIME | 上传时间 | #### API 接口清单 | 方法 | 路径 | 说明 | 优先级 | |------|------|------|-------| | POST | `/api/v1/upload/presign` | 获取 COS 预签名上传 URL | P0 | --- ### 4.4 AI 能力集成 #### 集成架构 ``` 业务逻辑层 → AI 服务层(统一封装) ├── 调用大模型 API(GPT / 文心 / 通义,可配置切换) ├── 超时控制(5秒 timeout,在 8秒端到端 SLA 预算内) ├── 失败重试(最多2次) └── 降级处理(返回空结果,前端展示默认态) ``` > **时间预算说明**:AI 接口端到端 SLA 为 ≤ 8s(Section 5.1)。其中大模型调用 timeout 设为 5s,加上重试和降级逻辑,总时间仍在 8s 以内。 #### Prompt 模板 | 功能 | Prompt 策略 | |------|------------| | 生成需求标题/描述 | System: 你是企业服务助手;User: 基于以下关键词生成{type}需求的标题和描述:{keywords} | | 工单自动分类 | System: 对问题反馈进行分类,输出 JSON;User: {feedback_content} | | 场地推荐 | System: 根据企业特��推荐合适场地;User: 企业规模{scale},行业{industry},预算{budget} | | 数据分析报告 | System: 你是数据分析师;User: 基于以下运营数据生成洞察报告:{stats_data} | --- ### 4.5 通用列表接口规范 所有分页列表接口��一使用以下参数和响应格式: **请求查询参数**: | 参数 | 类型 | 默认值 | 说明 | |------|------|-------|------| | page | INT | 1 | 页码(从1开始)| | page_size | INT | 20 | 每页条数(最大50)| **标准响应格式**: ```json { "total": 100, "page": 1, "page_size": 20, "items": [...] } ``` 筛选参数各接口独立定义(如 `status`、`type`、`start_date` 等),在各模块 API 清单中标注。 --- ## 第五章 非功能需求 ### 5.1 性能要求 | 指标 | 要求 | |------|------| | 普通接口响应时间 | ≤ 500ms(P95)| | 列表接口响应时间 | ≤ 1s(P95)| | AI 接口响应时间 | ≤ 8s(含超时降级)| | OCR 接口响应时间 | ≤ 3s | | 并发用户支持 | 初期支持 200 并发 | | 小程序首屏加载 | ≤ 2s(4G 网络)| ### 5.2 安全要求 | 类别 | 要求 | |------|------| | 接口鉴权 | 所有非公开接口必须携带有效 JWT | | 权限校验 | 后端强制校验 role,不依赖前端隐藏 | | 敏感数据 | 飞书 Secret、数据库密码等通过环境变量注入,不写入代码 | | 文件安全 | 上传文件类型白名单校验,限制文件大小 | | SQL 注入 | 使用 ORM(SQLAlchemy)参数化查询,禁止拼接 SQL | | 手机号 | 数据库中加密存储,仅展示时脱敏(138****8888)| | HTTPS | 所有接口强制 HTTPS | | 频率限制 | AI 接口每用户每分钟最多10次 | ### 5.3 兼容性要求 | 类别 | 要求 | |------|------| | 微信基础库 | ≥ 2.20.0 | | 微信版本 | 支持近2年主流版本 | | 手机系统 | iOS 13+ / Android 8+ | | 屏幕适配 | 375px 基准,支持主流机型(iPhone SE ~ Pro Max)| ### 5.4 数据备份 | 类别 | 要求 | |------|------| | 数据库备份 | 每日自动备份,保留30天 | | 文件存储 | COS 开启跨区域复制 | | 备份恢复 | RTO ≤ 4小时,RPO ≤ 24小时 | ### 5.5 部署要求 | 组件 | 建议方案 | |------|---------| | 后端服务 | 腾讯云 CVM / 容器(Docker + Nginx)| | 数据库 | 腾讯云 MySQL(RDS)| | 文件存储 | 腾讯云 COS | | 缓存 | Redis(Session / 接口缓存)| | 任务队列 | Celery + Redis(异步任务 / 定时任务)| | 日志 | 结构化日志 + 腾讯云日志服务 | --- ## 附录:数据库表清单 | 表名 | 说明 | |------|------| | `user` | 用户信息 | | `enterprise` | 企业信息 | | `settlement_application` | 入驻申请 | | `space` | 场地信息 | | `requirement_post` | 成果供需发布 | | `tech_achievement` | 科技成果 | | `tech_manager` | 技术经理人 | | `feedback_ticket` | 问题工单 | | `activity` | 活动信息 | | `activity_registration` | 活动报名 | | `venue` | 会场信息 | | `venue_booking` | 会场预约 | | `banner` | 首页 Banner | | `base_info` | 基地介绍 | | `score_config` | 评分维度配置 | | `enterprise_score` | 企业评分记录 | | `feishu_config` | 飞书运营配置(非敏感字段)| | `file_record` | 文件上传记录 | | `ai_call_log` | AI 调用日志 | | `user_favorite` | 用户收藏/关注 | | `partner_application` | 社区合伙人申请 | | `sms_verification` | 短信验证码记录 |