6.7 KiB
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:
if not ns.get('title_zh'):
return {
'status': False,
'msg': '请传递中文标题'
}
- Step 2: Update add insert fields
Write these fields in ns_dic:
'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:
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:
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:
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:
'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:
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:
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:
git diff -- b/news
Expected: only the requested bilingual endpoint changes plus the user's existing SQL schema update.
- Step 3: Check whitespace
Run:
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:
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:
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.