feat: Phase 4 多租户隔离 + 四阶段升级测试 + CSS 统一化

Phase 4: org_id 注入 JWT/API 过滤/组织管理 CRUD/前端组织列
测试: tests/test_phase_upgrades.py 97项全覆盖
CSS: theme-modern.css 共享 mobile-card-list/status-dot/search-bar 等模式
修复: initial_data.py LLM配置 NOT NULL 约束, TopicResponse 含 org_id
This commit is contained in:
Yuzhiran Dev
2026-05-17 06:56:53 +08:00
parent 301dc3e438
commit 9c37c9a574
45 changed files with 3707 additions and 1366 deletions
+15 -8
View File
@@ -114,6 +114,7 @@ class Writer:
### 价值
- 回答读者一个具体问题或解决一个困惑
- 每个论点配真实案例或数据,不写空话
- **所有数据必须使用2025-2026年最新数据**,禁用过时数据
- 结束时读者要有「学到了」的感觉
### 真人感
@@ -186,11 +187,12 @@ class Writer:
## 改写要求
- 用第三人称或「我们」视角,不要用「我」
- 不要编个人经历——知乎读者在意的是分析质量
- 每个主要观点配1个数据或案例支撑
- 每个主要观点配1个数据或案例支撑**必须使用2025-2026年最新数据**,禁用超过2年的过时数据
- 段落之间空行分隔,逻辑递进
- 避免「总的来说」「综上所述」「值得注意的是」
- 结尾可用引导性提问
- 字数:{cfg['max_chars']}字以内
- 直接输出改写后的正文,不要输出任何思考过程、解释或额外说明
## 原文
{markdown[:3000]}
@@ -211,10 +213,11 @@ class Writer:
- 用「你」视角,**通篇不允许出现「我」字**
- 把原文中所有「我」改成「你」或「很多人」或「有人」
- 结构可完全不同——抓住1-2个痛点打透,不用全面分析
- 可删减原文,保留最有力的观点和最打动人的案例
- 可删减原文,保留最有力的观点和最打动人的案例**必须使用2025-2026年最新数据**
- 适当加粗核心观点(不要整段加粗)
- 避免「综上所述」「值得注意的是」「换言之」
- 字数:{cfg['max_chars']}字以内
- 直接输出改写后的正文,不要输出任何思考过程、解释或额外说明
## 原文
{markdown[:3000]}
@@ -238,7 +241,8 @@ class Writer:
- 正文每段1-2句,可完全打乱原文结构
- emoji每段最多1个(✨💡✅🔸选1-2个用),不堆砌
- 结尾加3-5个#话题标签:1-2个流量大标签+1-2个精准标签
- 深度分析全部砍掉,只留最 actionable 的内容
- 深度分析全部砍掉,只留最 actionable 的内容**使用2025-2026年最新数据**
- 直接输出笔记正文+标签,不要输出任何思考过程或额外说明
## 原文
{markdown[:3000]}
@@ -298,15 +302,15 @@ class Writer:
core = self.topic.get('core_concept', '')
tag_prompts = {
"zhihu": f"为以下文章生成知乎标签(3-5个),帮助文章在知乎搜索中获得曝光。包含1-2个宽泛大标签(获取流量)+1-2个精准标签(精准触达)。标题:{title} 领域:{field} 核心观点:{core} 每个2-4字。直接输出标签,空格分隔。",
"wechat": f"为以下文章生成公众号标签(3-5个),帮助文章在微信搜一搜中获得排名。包含1-2个高搜索量标签+1-2个长尾标签。标题:{title} 领域:{field} 核心观点:{core} 每个2-4字。直接输出标签,空格分隔。",
"xiaohongshu": f"为以下文章生成小红书标签(3-5个),帮助笔记在搜索中获得曝光。包含1个流量大标签+2-3个精准场景标签。标题:{title} 领域:{field} 核心观点:{core} 每个2-4字。直接输出标签,空格分隔。",
"zhihu": f"为以下文章生成知乎标签(3-5个)。标题:{title} 领域:{field} 核心观点:{core} 每个2-4字。直接输出标签,空格分隔。不要输出思考过程。",
"wechat": f"为以下文章生成公众号标签(3-5个)。标题:{title} 领域:{field} 核心观点:{core} 每个2-4字。直接输出标签,空格分隔。不要输出思考过程。",
"xiaohongshu": f"为以下文章生成小红书标签(3-5个)。标题:{title} 领域:{field} 核心观点:{core} 每个2-4字。直接输出标签,空格分隔。不要输出思考过程。",
}
if HAVE_LLM:
prompt = tag_prompts.get(platform, f"根据文章信息生成适合{platform}的标签。标题:{title} 领域:{field} 核心观点:{core} 直接输出标签,空格分隔。")
try:
tags_text = call_llm(prompt, temperature=0.2, max_tokens=100)
tags_text = call_llm(prompt, temperature=0.2, max_tokens=500)
if tags_text:
tags = [t.strip('#') for t in tags_text.strip().split() if t.strip('#')]
if tags:
@@ -358,6 +362,7 @@ class Writer:
- 20字以内
- 参考知乎真实高赞标题,不要套路句式
- 避免「如何…」废句式、「XXX指南/手册/全攻略」
- 直接输出3个标题选项,每行一个,不要输出思考过程
生成 3 个选项,每行一个。""",
@@ -372,6 +377,7 @@ class Writer:
- 口语化,不要书面腔
- 不要感叹号堆砌,不要「重磅/震惊/紧急」
- 字数15-25字最佳
- 直接输出3个标题选项,每行一个,不要输出思考过程
生成 3 个选项,每行一个。""",
@@ -388,13 +394,14 @@ class Writer:
- 有场景感/结果感
- 不要「必看/收藏/码住」
- 像真实用户写的,不是运营写的
- 直接输出3个标题选项,每行一个,不要输出思考过程
生成 3 个选项,每行一个。""",
}
prompt = title_templates.get(platform, f"给以下文章改个吸引人的{platform}标题:{original}")
try:
resp = call_llm(prompt, temperature=0.7, max_tokens=200)
resp = call_llm(prompt, temperature=0.7, max_tokens=500)
titles = []
for line in resp.strip().split('\n'):
line = line.strip()