feat(ECR-045): ImageCardDeck 写面闭环并 Closed
复用 admin.explore.write、POST/PUT+审计、C端 GET /cards/decks、 H5 无 active 空态/失败回退;migration 000054。无牌面内容编辑。 ExploreConfig Loop STOP,禁自动 ECR-046。 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -53,7 +53,8 @@
|
||||
| [ops-star-config-write.md](ops-star-config-write.md) | StarConfig **写面** | §7 | admin 写 · `GET /star/configs` | ExploreConfig · **ECR-043** |
|
||||
| [ops-rhythm-config.md](ops-rhythm-config.md) | ExploreConfig RhythmConfig(只读) | §7 | `/admin/explore/rhythm-configs*` | Ops · **ECR-036** |
|
||||
| [ops-rhythm-config-write.md](ops-rhythm-config-write.md) | RhythmConfig **写面** | §7 | admin 写 · `GET /rhythm/configs` | ExploreConfig · **ECR-044** |
|
||||
| [ops-image-card-deck.md](ops-image-card-deck.md) | ExploreConfig ImageCardDeck | §7 | `/admin/explore/image-card-decks*` | Ops · **ECR-037** |
|
||||
| [ops-image-card-deck.md](ops-image-card-deck.md) | ExploreConfig ImageCardDeck(只读) | §7 | `/admin/explore/image-card-decks*` | Ops · **ECR-037** |
|
||||
| [ops-image-card-deck-write.md](ops-image-card-deck-write.md) | ImageCardDeck **写面** | §7 | admin 写 · `GET /cards/decks` | ExploreConfig · **ECR-045** |
|
||||
| [ops-report-template.md](ops-report-template.md) | GrowthInsights ReportTemplate | §7 | `/admin/growth/report-templates*` | Ops · **ECR-038** |
|
||||
| [ops-funnel-definition.md](ops-funnel-definition.md) | GrowthInsights FunnelDefinition | §7 | `/admin/analytics/funnel-definitions*` | Ops · **ECR-039** |
|
||||
| [ops-scale-definition.md](ops-scale-definition.md) | ExploreConfig ScaleDefinition | §7 | `/admin/explore/scales*` | Ops · **ECR-040** |
|
||||
|
||||
@@ -0,0 +1,95 @@
|
||||
# Feature Spec: ExploreConfig · ImageCardDeck 写面(Ops · ECR-045)
|
||||
|
||||
> Status: `Active`(**Implemented · ECR-045 Closed**)
|
||||
> Map: `§7` · Capability: `ExploreConfig` · BC: `Explore_Reports`
|
||||
> Auth: `docs/WAVE0/ECR-045_WRITE_AUTHORIZATION.md`(Human 批准 · **仅 ECR-045**)
|
||||
> Predecessor: ECR-037 Closed(只读)· ECR-044 Closed(Rhythm 写)
|
||||
> 关联:[ops-image-card-deck.md](ops-image-card-deck.md)
|
||||
|
||||
---
|
||||
|
||||
## 1. 目标
|
||||
|
||||
运营可 **创建 / 更新 / 上下架** `ImageCardDeck`(牌组目录);写操作鉴权 + 审计;C 端可读 active deck 并影响 `/cards` 可用性;失败回退「现网可抽」。
|
||||
|
||||
**Closed 后立即 STOP**,不自动 ECR-046。
|
||||
|
||||
## 2. In / Out
|
||||
|
||||
| In | Out |
|
||||
|----|-----|
|
||||
| Admin POST/PUT `/admin/explore/image-card-decks*` | **牌面/单卡内容 CRUD** · Star / Rhythm / Scale |
|
||||
| 复用 `admin.explore.write` | SystemPrompt · Knowledge · Chunk |
|
||||
| 复用表 `image_card_decks` | soft-delete · 真支付 · UGC |
|
||||
| C 端 GET active decks | Crisis / Handoff 写 |
|
||||
| `/cards`:无 active → 空态禁抽卡 CTA;失败 → 回退可抽 | 自动 ECR-046 |
|
||||
| 审计 | 新权限子系统 |
|
||||
|
||||
## 3. Domain
|
||||
|
||||
| 字段 | 规则 |
|
||||
|------|------|
|
||||
| `code` | 唯一;`^[a-z][a-z0-9_]{1,62}$`;`system=true` 不可改 code |
|
||||
| `title` | 必填 · ≤128 |
|
||||
| `active` | `false` = 下架(唯一下架手段) |
|
||||
| `system` | 种子行;禁止物理删除 |
|
||||
|
||||
## 4. API
|
||||
|
||||
### Admin
|
||||
|
||||
| Method | Path | 权限 |
|
||||
|--------|------|------|
|
||||
| GET | `/admin/explore/image-card-decks` · `/{id}` | `admin.explore.read` |
|
||||
| POST | `/admin/explore/image-card-decks` | `admin.explore.write` |
|
||||
| PUT | `/admin/explore/image-card-decks/{id}` | `admin.explore.write` |
|
||||
|
||||
无 DELETE。
|
||||
|
||||
### C 端
|
||||
|
||||
| Method | Path | Auth | 语义 |
|
||||
|--------|------|------|------|
|
||||
| GET | `/api/v1/cards/decks` | DeviceAuth | 仅 `active=true`;按 code 排序 |
|
||||
|
||||
## 5. C 端生效
|
||||
|
||||
| 条件 | user-h5 `/cards` |
|
||||
|------|------------------|
|
||||
| ≥1 active | 保持现网抽卡 |
|
||||
| 成功且 0 active | 「意象牌组暂未开放」空态;禁用抽卡 CTA |
|
||||
| 请求失败 | **回退**不阻断抽卡 |
|
||||
|
||||
## 6. Permission / Migration
|
||||
|
||||
- Migration `000054_ops_image_card_deck_write`:幂等确认 `super_admin` → `admin.explore.write`
|
||||
- 编码时占号(Max=`000053`)
|
||||
|
||||
## 7. UI
|
||||
|
||||
| 端 | 行为 |
|
||||
|----|------|
|
||||
| admin-h5 意象牌组页 | 列表 + 新建/编辑/上下架(仅 Deck) |
|
||||
| user-h5 `/cards` | 按 §5 |
|
||||
|
||||
## 8. AC
|
||||
|
||||
| ID | Then |
|
||||
|----|------|
|
||||
| AC-F-01 | POST → list/get 可见 |
|
||||
| AC-F-02 | PUT active=false → C 端不含 |
|
||||
| AC-F-03 | 有 active → C 端非空 |
|
||||
| AC-F-04 | 重复 code → 409 |
|
||||
| AC-S-01/02 | 401;仅 read → POST 403 |
|
||||
| AC-A-01 | 写产生审计 |
|
||||
| AC-C-01 | 全下架后空态/禁 CTA |
|
||||
| AC-C-02 | API 失败回退可抽 |
|
||||
| AC-O-01 | 无牌面写路径 · 无 soft-delete |
|
||||
|
||||
## 9. Closed 后
|
||||
|
||||
**立即 STOP**。ECR-046 须新 Candidate Review + Human 拍板。
|
||||
|
||||
## 10. Trace
|
||||
|
||||
ECR-045 · BD-2026-045 · CONTRACT_DIFF · ECR-045_WRITE_AUTHORIZATION
|
||||
@@ -1,6 +1,7 @@
|
||||
# Feature Spec: ExploreConfig · ImageCardDeck(Ops · ECR-037)
|
||||
|
||||
> Status: `Active`(Loop continuous · **ECR-037 Closed**)
|
||||
> **写面:** [ops-image-card-deck-write.md](ops-image-card-deck-write.md)(**ECR-045 Closed**)
|
||||
> Parent: WAVE0-FROZEN · Predecessor: ECR-036 Closed
|
||||
> Capability: `ExploreConfig` · BC: `Explore_Reports`
|
||||
> 授权:`docs/WAVE0/LOOP_AUTHORIZATION.md`
|
||||
|
||||
Reference in New Issue
Block a user