277b13eaae
优化内容: 1. 表格布局: - 使用 calc(100vw - 160px) 确保表格不超出视口 - 操作列 fixed='right' 固定在右侧,宽度 300px - 按钮 3 个后自动换行 (max-width: 200px) - 恢复合理列宽,不再过度压缩 2. 批量操作区域: - 容器改为 inline-block,宽度自适应按钮内容 - 背景宽度与按钮总宽度匹配 3. 分类标签: - 显示数量 (如 '待处理 (20)') - 点击切换筛选,去掉误导的 'X' 图标 4. 删除功能: - 操作列增加删除按钮 - 删除前弹出确认对话框 5. 系统日志: - 修复后端日志路径 (parents[4]) - 404 时显示友好提示 6. 其他: - 左侧菜单宽度 160px - 所有功能保留 (登录、用户管理、批量操作等)
116 lines
3.3 KiB
Python
116 lines
3.3 KiB
Python
#!/usr/bin/env python3
|
||
"""
|
||
大纲阶段:基于研究笔记生成文章大纲
|
||
"""
|
||
|
||
import json, datetime, logging, sys
|
||
from pathlib import Path
|
||
from typing import Dict
|
||
|
||
PROJECT_ROOT = Path(__file__).parent.parent
|
||
sys.path.insert(0, str(PROJECT_ROOT))
|
||
|
||
DATA_DIR = PROJECT_ROOT / "automation" / "data"
|
||
TOPICS_FILE = DATA_DIR / "sustainability_topics.json"
|
||
RESEARCH_DIR = DATA_DIR / "research"
|
||
OUTPUT_DIR = DATA_DIR / "outlines"
|
||
LOGS_DIR = PROJECT_ROOT / "automation" / "logs"
|
||
TODAY = datetime.datetime.now().strftime("%Y-%m-%d")
|
||
|
||
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s',
|
||
handlers=[logging.FileHandler(LOGS_DIR / f"outline_{TODAY}.log"), logging.StreamHandler()])
|
||
logger = logging.getLogger(__name__)
|
||
|
||
class Outliner:
|
||
def __init__(self, topic_id: str):
|
||
self.topic_id = topic_id
|
||
self.topic = self._load_topic()
|
||
research_file = RESEARCH_DIR / TODAY / f"{topic_id}_research.md"
|
||
if not research_file.exists():
|
||
raise FileNotFoundError(f"Research notes not found: {research_file}")
|
||
self.research_notes = research_file.read_text(encoding='utf-8')
|
||
self.output_dir = OUTPUT_DIR / TODAY
|
||
self.output_dir.mkdir(parents=True, exist_ok=True)
|
||
|
||
def _load_topic(self) -> Dict:
|
||
topics = json.loads(TOPICS_FILE.read_text(encoding='utf-8'))
|
||
for t in topics:
|
||
if t['id'] == self.topic_id:
|
||
return t
|
||
raise ValueError(f"Topic {self.topic_id} not found")
|
||
|
||
def generate_outline(self) -> str:
|
||
"""生成文章大纲 Markdown(基于模板)"""
|
||
title = self.topic['title']
|
||
field = self.topic.get('field', '')
|
||
core = self.topic.get('core_concept', '')
|
||
pain = self.topic.get('audience_pain', '')
|
||
angle = self.topic.get('unique_angle', '')
|
||
|
||
# 解析研究笔记中的案例数量
|
||
case_count = self.research_notes.count('### 案例')
|
||
|
||
outline = f"""# 文章大纲:{title}
|
||
|
||
## 一、引言
|
||
- 开场场景/痛点引入
|
||
- 提出核心问题:{title}
|
||
- 点明文章价值
|
||
|
||
## 二、核心观点
|
||
{core}
|
||
|
||
## 三、受众痛点分析
|
||
{pain}
|
||
|
||
## 四、全球/行业趋势与案例
|
||
- 引用研究笔记中的 {case_count} 个案例,精选 2-3 个详述
|
||
- 数据支撑:提取研究笔记中的关键数据
|
||
- 趋势分析
|
||
|
||
## 五、本土落地建议
|
||
- 结合{field}领域特点
|
||
- 提供可执行的步骤
|
||
- 注意事项
|
||
|
||
## 六、独特视角:{angle}
|
||
|
||
## 七、行动指南(MVP)
|
||
1. 理解现状
|
||
2. 小范围试验
|
||
3. 评估效果
|
||
4. 形成习惯
|
||
|
||
## 八、总结与鼓励
|
||
- 回顾要点
|
||
- 呼吁行动
|
||
|
||
## 九、参考文献
|
||
- 从研究笔记中提取来源链接
|
||
|
||
---
|
||
*大纲生成时间:{TODAY}*
|
||
"""
|
||
return outline
|
||
|
||
def save(self):
|
||
outline_text = self.generate_outline()
|
||
out_path = self.output_dir / f"{self.topic_id}_outline.md"
|
||
out_path.write_text(outline_text, encoding='utf-8')
|
||
logger.info(f"大纲已保存: {out_path}")
|
||
return out_path
|
||
|
||
def main():
|
||
import argparse
|
||
parser = argparse.ArgumentParser()
|
||
parser.add_argument('--topic-id', required=True, help='选题ID')
|
||
args = parser.parse_args()
|
||
|
||
o = Outliner(args.topic_id)
|
||
o.save()
|
||
print(f"SUCCESS: Outline created for {args.topic_id}")
|
||
sys.exit(0)
|
||
|
||
if __name__ == "__main__":
|
||
main()
|