2.7 KiB
2.7 KiB
个人反馈后端接入方案
更新时间:2026-05-08
目标
/profile/feedback 不再停留在前端成功态,提交时必须经过 api-server 鉴权、spacetime-client facade、spacetime-module procedure,并持久化到 SpacetimeDB。
接口
- 路由:
POST /api/profile/feedback - 鉴权:必须登录,用户 ID 取
AuthenticatedAccessToken,前端不得上传或伪造userId。 - 请求体:
description:必填,trim 后 10 至 200 字符。contactPhone:选填,trim 后最多 40 字符。evidenceItems:选填,最多 4 张图片。- 每张凭证包含
fileName、contentType、sizeBytes、dataUrl。
- 响应体:
feedback.feedbackIdfeedback.statusfeedback.createdAtfeedback.evidenceItems只回传凭证元数据,不回显 Data URL。
表结构
新增私有表 profile_feedback_submission:
feedback_id PK: Stringuser_id: Stringdescription: Stringcontact_phone: Option<String>evidence_json: Stringstatus: RuntimeProfileFeedbackStatuscreated_at: Timestampupdated_at: Timestamp- 索引:
user_id、(user_id, created_at)
evidence_json 保存首版图片凭证快照,后续如果迁移 OSS,应保持 HTTP 契约不变,仅替换内部 evidence 存储字段。
分层落点
shared-contracts:冻结 HTTP DTO。module-runtime:负责输入归一化、长度限制、图片数量/大小/Data URL 前缀校验、反馈 ID 和 evidence ID 生成、响应记录组装。spacetime-module:新增 table 与submit_profile_feedback_and_returnprocedure;只做事务写入和表到快照映射。spacetime-client:新增submit_profile_feedbackfacade,不让api-server直接依赖生成绑定。api-server:新增鉴权 POST route,并对该 route 单独放宽 JSON body 上限。- 前端:
PlatformFeedbackView只负责临时表单状态、图片预览和调用 profile client;正式提交结果以后端返回为准。 - 绑定生成:Windows 本地如遇
sccache远端缓存被网络沙箱拦截,可临时使用仓库内短路径GENARRATIVE_BINDGEN_TEMP_ROOT并设置CARGO_BUILD_RUSTC_WRAPPER到本地 rustc passthrough wrapper 后重跑生成,不修改server-rs/.cargo/config.toml。
验收
- 图片选择后能在页面看到缩略图。
- 有效表单调用
POST /api/profile/feedback并写入profile_feedback_submission。 - 未登录提交返回
401。 - 超过图片数量、单张大小、总大小或非法 Data URL 时返回清晰校验错误。
migration.rs、SpacetimeDB 表目录、生成绑定同步更新。- 定向前端测试、Rust 领域测试和 API 认证测试通过。