kboss/docs/superpowers/plans/2026-07-29-bilingual-enterprise-news.md
2026-07-29 17:36:49 +08:00

234 lines
6.7 KiB
Markdown

# Bilingual Enterprise News Implementation Plan
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** Update enterprise news APIs to store, filter, and return Chinese and English article fields without maintaining legacy content fields.
**Architecture:** Keep the existing DSPY endpoint structure and database table. Add and update endpoints write the eight language-specific columns; search and detail endpoints return those columns directly. Shared publication, image, date, status, and read-count behavior remains unchanged.
**Tech Stack:** DSPY Python endpoints, async DBPools/sor database access, MySQL.
---
### Task 1: Add and update bilingual content
**Files:**
- Modify: `b/news/news_article_add.dspy`
- Modify: `b/news/news_article_update.dspy`
- [ ] **Step 1: Update add validation**
Replace the legacy `title` requirement with:
```python
if not ns.get('title_zh'):
return {
'status': False,
'msg': '请传递中文标题'
}
```
- [ ] **Step 2: Update add insert fields**
Write these fields in `ns_dic`:
```python
'title_zh': ns.get('title_zh'),
'title_en': ns.get('title_en'),
'article_type_zh': ns.get('article_type_zh'),
'article_type_en': ns.get('article_type_en'),
'summary_zh': ns.get('summary_zh'),
'summary_en': ns.get('summary_en'),
'content_zh': ns.get('content_zh'),
'content_en': ns.get('content_en'),
```
Do not write `title`, `article_type`, `summary`, or `content`.
- [ ] **Step 3: Update editable fields**
In `news_article_update.dspy`, loop through the eight bilingual fields and copy only keys present in `ns`:
```python
for field in [
'title_zh', 'title_en', 'article_type_zh', 'article_type_en',
'summary_zh', 'summary_en', 'content_zh', 'content_en'
]:
if field in ns:
ns_dic[field] = ns.get(field)
```
- [ ] **Step 4: Verify static diagnostics**
Run IDE lint diagnostics for both files. Expected: no new errors.
### Task 2: Update backend search and detail
**Files:**
- Modify: `b/news/news_article_search.dspy`
- Verify: `b/news/news_article_detail.dspy`
- [ ] **Step 1: Add bilingual filters**
Build optional conditions for exact type matching and fuzzy title matching:
```python
if ns.get('title_zh'):
conditions.append("title_zh like '%%%%%s%%%%'" % ns.get('title_zh'))
if ns.get('title_en'):
conditions.append("title_en like '%%%%%s%%%%'" % ns.get('title_en'))
if ns.get('article_type_zh'):
conditions.append("article_type_zh = '%s'" % ns.get('article_type_zh'))
if ns.get('article_type_en'):
conditions.append("article_type_en = '%s'" % ns.get('article_type_en'))
```
- [ ] **Step 2: Return bilingual list fields**
Select:
```sql
id, domain_name,
title_zh, title_en,
article_type_zh, article_type_en,
summary_zh, summary_en,
content_zh, content_en,
cover_img, status, publish_time, read_count, update_time, create_at
```
- [ ] **Step 3: Return bilingual type summaries**
Aggregate Chinese and English article types separately and return:
```python
'article_type_summary_zh': article_type_summary_zh,
'article_type_summary_en': article_type_summary_en,
```
Each item keeps `article_type`, `article_count`, and `read_count`.
- [ ] **Step 4: Verify backend detail**
`news_article_detail.dspy` already uses `select *`; confirm it returns the new columns without changing publication behavior.
- [ ] **Step 5: Verify static diagnostics**
Run IDE lint diagnostics for backend search and detail. Expected: no new errors.
### Task 3: Update frontend search and detail
**Files:**
- Modify: `b/news/front_news_search.dspy`
- Modify: `b/news/front_news_detail.dspy`
- [ ] **Step 1: Add bilingual frontend filters**
Support `title_zh`, `title_en`, `article_type_zh`, and `article_type_en` using the same matching rules as backend search.
- [ ] **Step 2: Return bilingual frontend list fields**
Select:
```sql
id, title_zh, title_en, article_type_zh, article_type_en,
summary_zh, summary_en, cover_img, publish_time, read_count
```
- [ ] **Step 3: Return bilingual frontend detail fields**
After incrementing `read_count`, select:
```sql
id, title_zh, title_en, article_type_zh, article_type_en,
summary_zh, summary_en, cover_img, content_zh, content_en,
publish_time, read_count
```
- [ ] **Step 4: Verify publication and read-count behavior**
Confirm both frontend queries retain `status = '1' AND del_flg = '0'`, and detail still increments `read_count` once.
- [ ] **Step 5: Verify static diagnostics**
Run IDE lint diagnostics for both frontend files. Expected: no new errors.
### Task 4: Final verification
**Files:**
- Verify: `b/news/news_article_add.dspy`
- Verify: `b/news/news_article_update.dspy`
- Verify: `b/news/news_article_search.dspy`
- Verify: `b/news/news_article_detail.dspy`
- Verify: `b/news/front_news_search.dspy`
- Verify: `b/news/front_news_detail.dspy`
- [ ] **Step 1: Check legacy-field removal**
Search the six endpoints for writes or selected output fields named exactly `title`, `article_type`, `summary`, or `content`. Expected: none except comments or compatibility-neutral code.
- [ ] **Step 2: Check diff scope**
Run:
```powershell
git diff -- b/news
```
Expected: only the requested bilingual endpoint changes plus the user's existing SQL schema update.
- [ ] **Step 3: Check whitespace**
Run:
```powershell
git diff --check -- b/news
```
Expected: no output and exit code 0.
### Task 5: Add bilingual cover images and publish times
**Files:**
- Modify: `b/news/news_article_add.dspy`
- Modify: `b/news/news_article_update.dspy`
- Modify: `b/news/news_article_publish.dspy`
- Modify: `b/news/news_article_search.dspy`
- Modify: `b/news/front_news_search.dspy`
- Modify: `b/news/front_news_detail.dspy`
- [ ] **Step 1: Replace shared write fields**
Use `cover_img_zh`, `cover_img_en`, `publish_time_zh`, and
`publish_time_en` in add and update. Do not write `cover_img` or
`publish_time`.
- [ ] **Step 2: Apply publication defaults**
When status becomes `1`, set each missing publish-time column with:
```sql
publish_time_zh = ifnull(publish_time_zh, current_date()),
publish_time_en = ifnull(publish_time_en, current_date())
```
- [ ] **Step 3: Update publish endpoint**
Accept both publish-time parameters and use `current_date()` for either
missing value while setting `status = '1'`.
- [ ] **Step 4: Update list and detail output**
Return both cover-image and publish-time columns. Sort lists by:
```sql
greatest(
ifnull(publish_time_zh, '1000-01-01'),
ifnull(publish_time_en, '1000-01-01')
) desc, update_time desc
```
- [ ] **Step 5: Verify**
Run static field-contract checks, IDE diagnostics, and
`git diff --check -- b/news`. Expected: all pass.