diff --git a/.specs/plans/user-creator-center-zibll.md b/.specs/plans/user-creator-center-zibll.md new file mode 100644 index 00000000..8537c1a2 --- /dev/null +++ b/.specs/plans/user-creator-center-zibll.md @@ -0,0 +1,104 @@ +# Plan: 用户中心创作中心与文章价格表 + +## Architectural Decisions + +Durable decisions that apply across all phases: + +- **唯一入口使用 `posts`**:将现有“我的文章”面板升级为“创作中心”,不新增重复的 `creator` 面板或路由。 +- **复用用户中心壳**:继续使用 `AKSRT\\User\\Center`、现有 `?tab=posts`、REST panel、运行时配置、侧栏和移动端导航。 +- **复用现有投稿页**:新建和编辑文章继续跳转现有 `page-submit.php`,不把 TinyMCE 编辑器复制到用户中心。 +- **价格使用唯一业务通路**:单篇和批量价格修改必须复用 `FrontSubmitPay::save_pay_meta()`,或先将其抽取为唯一共享价格服务;不复制价格校验逻辑。 +- **价格数据模型不变**:继续使用当前 `aksrt_pay` 及统一付费元数据,订单、购买和收益逻辑无需修改。 +- **服务端权限为最终边界**:每篇文章重新检查作者归属、编辑权限和 `new_post_pay` 能力;前端选择结果不可信。 +- **批量更新采用逐项结果**:服务端返回每篇文章的成功/失败结果,前端不得把部分失败伪装成整体成功。 +- **复杂付费资源继续走完整编辑器**:价格表优先处理价格和基础付费字段;付费下载资源等复杂结构不重复实现。 + +--- + +## Phase 1 — 创作中心文章总览可端到端使用 + +**用户故事**:US1、US2、US3、US8 + +### What to build + +升级现有 `posts` 面板的名称、信息层级和文章管理体验:增加创作中心标题及新建文章主操作,整合状态概览、文章列表、编辑/预览/删除操作,并复用现有文章查询、状态筛选、权限和用户中心 REST 加载机制。 + +### Done when + +- [ ] `src/User/Center.php`、用户中心渲染映射和入口文案仍只注册/渲染 `posts`,不存在第二个重复的 `creator` 文章管理面板。 +- [ ] `profile-posts.php` 展示创作中心标题、新建文章入口、发布/草稿/待审/私密/全部状态数量,并继续使用现有状态筛选参数。 +- [ ] 文章列表展示标题、封面或占位图、状态、更新时间、付费摘要和按权限过滤后的操作按钮。 +- [ ] 编辑、预览和删除按钮分别遵循现有 `can_edit_post()`、文章可访问性和 `can_delete_post()` 判断;删除继续使用现有 nonce/AJAX 语义。 +- [ ] 通过用户中心 REST panel 和 `?tab=posts&post_status=...` 深链访问时,服务端和客户端均能激活正确面板与筛选状态。 + +--- + +## Phase 2 — 新建与编辑文章工作流连通 + +**用户故事**:US3、US8、US9 + +### What to build + +将创作中心的新建/编辑操作与现有前台投稿工作台完整连通,保留 zibll 参考中的双栏创作层级,同时只复用 AKSRT 已有的编辑器、文章参数、封面、草稿、审核和付费配置能力。保存或提交后回到创作中心时保留上下文并反馈结果。 + +### Done when + +- [ ] 新建按钮使用 `aksrt_get_new_post_url()`,编辑按钮传递现有文章 ID,并由 `FrontSubmit::can_submit()`/`can_edit_post()` 控制可用性。 +- [ ] `page-submit.php` 的标题、编辑器、封面、分类、专题、高级筛选、标签、付费侧栏和操作区保持现有 AJAX、nonce 和权限链路。 +- [ ] 草稿保存、提交审核/发布、编辑已有文章和离开页面警告均继续由现有 `FrontSubmit` 与 `front-submit.js` 处理。 +- [ ] 从创作中心进入编辑器后返回时,能够恢复文章列表的状态筛选或分页上下文,并显示保存/提交结果。 +- [ ] 运行 PHP lint 及项目可执行的前端静态检查,确认本阶段未破坏现有投稿页面。 + +--- + +## Phase 3 — 文章价格表支持单篇与批量调价 + +**用户故事**:US4、US5、US6、US9 + +### What to build + +在创作中心增加文章价格表,支持免费/付费阅读/付费资源摘要、现金/积分、普通价格和 VIP 价格展示;实现单篇快速编辑及“选择文章 → 统一价格方案 → 预览 → 确认”的批量调价流程。必要时先抽取共享价格服务,再接入单篇和批量请求。 + +### Done when + +- [ ] 价格表按当前用户可管理文章展示免费、付费类型、现金/积分、普通价、VIP1/VIP2 及购买限制摘要;关闭付费时显示“免费”而不是误显示为 0。 +- [ ] 单篇编辑支持免费开关、支付模式、普通价、VIP1/VIP2、付费类型、购买限制和登录限制;不修改正文、封面或分类。 +- [ ] 单篇保存请求验证登录、作者归属、编辑能力和 `new_post_pay`,并复用 `FrontSubmitPay::save_pay_meta()` 或唯一共享价格服务。 +- [ ] 批量工具支持多选、免费/现金/积分价格方案、影响数量预览、确认和逐项成功/失败反馈;请求大小受控。 +- [ ] 最低/最高价、免费规则、VIP1/VIP2 层级、折扣计算、支付模式和付费类型校验与投稿页一致,且价格失败时保留输入值。 + +--- + +## Phase 4 — 移动端、可访问性与完整验收 + +**用户故事**:US7、US8、US9 + +### What to build + +完成创作中心文章列表和价格表的响应式布局、键盘交互、加载/空数据/失败/部分成功反馈,以及接口和安全边界验收。确保桌面端高密度工作台和移动端卡片/展开式编辑体验都可用。 + +### Done when + +- [ ] 在窄屏下文章列表和价格表转换为卡片或垂直字段布局,无页面级横向溢出,筛选、批量选择、编辑和确认操作均可通过触控完成。 +- [ ] 加载、空数据、请求失败和批量部分失败均有明确文本反馈;失败时不会显示误导性的 0 或清空用户输入。 +- [ ] 关键按钮、价格输入、状态标签和确认弹窗具备语义化结构、可见焦点和键盘操作能力,状态不只依赖颜色。 +- [ ] 所有新增 REST/AJAX 入口具备 `permission_callback` 或 nonce;输入使用项目既有清洗与价格归一化,输出完成转义。 +- [ ] `php tools/audit-admin-contracts.php` 退出码为 0 且无错误,并完成项目可执行的 PHP lint、前端构建或对应静态检查。 + +--- + +## Out of Scope + +- 不复制 zibll 的 PHP 函数、字段名、商品规格模型、订单模型或主题配置 API。 +- 不在用户中心新增独立的 `creator` 页面、第二套文章管理 tab 或第二套前台路由;`posts` 是唯一文章管理入口,界面标题可升级为“创作中心”。 +- 不把完整 TinyMCE 编辑器复制嵌入用户中心;新建/编辑继续跳转 `aksrt_get_new_post_url()` 对应的投稿页面。 +- 不修改文章购买、订单结算、收益分成、优惠码、付费下载实际业务规则。 +- 不新增旧选项双读、旧路由兼容层、数据迁移或新旧 UI 并存实现。 +- 不把日常创作工作台迁入配置型 Admin SPA。 + +## Open Questions + +- 默认将 `posts` 面板的显示标题改为“创作中心”,内部 tab key 保持 `posts`;若产品希望 URL 也改为 `creator`,需在实现前明确选择,因为项目规则不允许长期保留两个重复入口。 +- 默认批量调价采用“选择文章 → 统一价格方案 → 预览 → 确认”的模式;不包含按比例涨跌或价格模板市场。后续如需比例调整,应另立需求。 +- 默认价格表只覆盖安全可复用的价格字段;付费下载资源等复杂结构继续通过完整投稿编辑器维护,除非实现阶段确认现有服务可提供等价的批量契约。 +- 默认创作中心不内嵌完整编辑器;若需要无跳转编辑体验,应另行评估 TinyMCE 生命周期、自动保存和页面性能。