244 lines
9.6 KiB
Markdown
244 lines
9.6 KiB
Markdown
# 宇之然项目目录结构说明
|
||
|
||
## 整体布局
|
||
|
||
```
|
||
yu-zhi-ran/ # 项目根目录
|
||
├── platform/ # ⭐ 管理平台(Web UI + API)
|
||
│ ├── backend/ # FastAPI 后端
|
||
│ │ ├── app/
|
||
│ │ │ ├── main.py # 入口
|
||
│ │ │ ├── database.py # 数据库连接(SQLite)
|
||
│ │ │ ├── models.py # Topic, Article 模型
|
||
│ │ │ ├── schemas.py # Pydantic 验证
|
||
│ │ │ ├── initial_data.py # 初始数据导入
|
||
│ │ │ ├── api/ # REST API 路由
|
||
│ │ │ │ ├── system.py # │ 系统状态、流水线控制、日志
|
||
│ │ │ │ ├── topics.py # │ 选题 CRUD
|
||
│ │ │ │ ├── publisher.py # │ 发布包管理
|
||
│ │ │ │ └── articles.py # │ 文章查看
|
||
│ │ │ └── core/ # │ 业务逻辑封装
|
||
│ │ │ ├── generator.py # │ 调用 scripts/creator.py
|
||
│ │ │ ├── optimizer.py # │ 调用 scripts/compliance_optimizer.py
|
||
│ │ │ └── sync.py # │ 同步 JSON → 数据库
|
||
│ │ └── requirements.txt
|
||
│ ├── frontend/
|
||
│ │ └── index.html # Vue 3 SPA(CDN 依赖)
|
||
│ ├── run.sh # 快速启动脚本
|
||
│ ├── check.py # 部署前检查
|
||
│ ├── README.md # 平台使用文档
|
||
│ └── PORTFOLIO.md # 架构详解
|
||
│
|
||
├── automation/ # 🔄 自动化流水线数据与日志
|
||
│ ├── scripts/ (软链) → ../scripts/ # 实际脚本在 ../scripts/
|
||
│ ├── data/ # 数据存储
|
||
│ │ ├── sustainability_topics.json # ⭐ 核心:选题库
|
||
│ │ ├── drafts/ # 草稿(按日期)
|
||
│ │ │ └── 2026-04-19/
|
||
│ │ │ ├── A02_zhihu.md
|
||
│ │ │ ├── A02_wechat.md
|
||
│ │ │ └── A02_xiaohongshu.md
|
||
│ │ └── releases/ # 发布包(按日期)
|
||
│ │ └── 2026-04-19/
|
||
│ │ ├── zhihu/zhihu_A02_zhihu.html
|
||
│ │ ├── wechat/wechat_A02_wechat.html
|
||
│ │ └── xiaohongshu/
|
||
│ └── logs/ # 运行日志
|
||
│ ├── collector_2026-04-19.log
|
||
│ ├── creator_2026-04-19.log
|
||
│ ├── optimizer_2026-04-19.log
|
||
│ └── publisher_summary_2026-04-19.json
|
||
│
|
||
├── scripts/ # 🛠️ 底层 CLI 脚本(被 automation/scripts/ 调用)
|
||
│ ├── collector.py # 采集热点 + 本地降级
|
||
│ ├── creator.py # 研究→大纲→撰写流水线
|
||
│ ├── compliance_optimizer.py # 合规检查 + 自动修复
|
||
│ ├── publisher.py # 发布包生成(HTML + 指南)
|
||
│ ├── research.py # 资料收集(API + 本地)
|
||
│ ├── outline.py # 大纲生成
|
||
│ ├── writer.py # 核心撰写逻辑
|
||
│ ├── wecom_notifier.py # 企业微信通知(可选)
|
||
│ └── ...(其他辅助脚本)
|
||
│
|
||
├── content/ # 📚 已发布内容存储
|
||
│ ├── published/ # 按 topic_id 组织
|
||
│ │ ├── A01/
|
||
│ │ │ └── 手动发布/
|
||
│ │ │ ├── 知乎/文章.html
|
||
│ │ │ └── 小红书/文章.html
|
||
│ │ └── A02/
|
||
│ ├── drafts/ # 草稿(可选)
|
||
│ ├── ideas/ # 选题记录(Markdown)
|
||
│ └── images/ # 配图资源
|
||
│
|
||
├── config/ # ⚙️ 配置文件
|
||
│ ├── sources.yaml # RSS/网页源配置
|
||
│ └── wecom_config.yaml # 企业微信机器人配置
|
||
│
|
||
├── brand/ # 🏷️ 品牌资产
|
||
│ ├── brand-book.md # 愿景、调性、原则
|
||
│ └── guidelines.md # 内容创作指南
|
||
│
|
||
├── strategy/ # 📈 内容策略
|
||
│ └── 全球-本土比较研究与全新内容战略规划-2026-04-15.md
|
||
│
|
||
├── tasks/ # 📋 项目管理
|
||
│ └── todo.md
|
||
│
|
||
├── research/ # 📊 行业研究
|
||
│ └── trends-2026.md
|
||
│
|
||
├── logs/ # 📝 根目录日志(兼容)
|
||
├── backup/ # 💾 备份归档
|
||
├── README.md # 项目总览
|
||
├── YUZHIRAN_PLATFORM.md # 完整文档(本文件同级)
|
||
├── TEST_FULL_PIPELINE.md # 测试指南
|
||
├── test_full_pipeline.py # 全流程测试脚本
|
||
├── run_publisher.sh # 快速发布脚本
|
||
└── start-platform.sh # 启动管理平台(新增)
|
||
|
||
# 软链接
|
||
automation/scripts → ../scripts/
|
||
```
|
||
|
||
---
|
||
|
||
## 🔗 关键依赖关系
|
||
|
||
### platform/backend/app/core/*.py 的路径计算
|
||
|
||
| 文件 | parents 层数 | PROJECT_ROOT 指向 |
|
||
|------|-------------|-------------------|
|
||
| `database.py` | `parents[3]` | `yu-zhi-ran/` |
|
||
| `initial_data.py` | `parents[3]` | `yu-zhi-ran/` |
|
||
| `generator.py` | `parents[4]` | `yu-zhi-ran/` |
|
||
| `optimizer.py` | `parents[4]` | `yu-zhi-ran/` |
|
||
| `sync.py` | `parents[4]` | `yu-zhi-ran/` |
|
||
| `api/system.py` | `parents[4]` | `yu-zhi-ran/` |
|
||
| `api/publisher.py` | `parents[4]` | `yu-zhi-ran/` |
|
||
|
||
**规律**:
|
||
- 在 `app/` 一级:`parents[3]` → `yu-zhi-ran/`
|
||
- 在 `app/api/` 或 `app/core/`:`parents[4]` → `yu-zhi-ran/`
|
||
|
||
✅ 所有路径已统一修正,可正常工作。
|
||
|
||
---
|
||
|
||
## 🚀 工作流程
|
||
|
||
### 自动流水线(cron)
|
||
|
||
```
|
||
每天 05:00 → collector.py → automation/data/sustainability_topics.json(新增选题)
|
||
每天 05:30 → creator.py → automation/data/drafts/ + HTML 发布包
|
||
每天 05:45 → compliance_optimizer.py → 自动合规检查
|
||
每天 06:00 → publisher.py → content/published/(手动发布包)
|
||
```
|
||
|
||
### Web 平台手动控制
|
||
|
||
```
|
||
前端界面
|
||
│
|
||
├─▶ POST /api/system/generate/run
|
||
│ ↓
|
||
│ core/generator.py → subprocess(scripts/creator.py)
|
||
│ ↓
|
||
│ sync_all_topics() → 更新数据库
|
||
│
|
||
├─▶ POST /api/system/optimize/run
|
||
│ ↓
|
||
│ core/optimizer.py → subprocess(scripts/compliance_optimizer.py)
|
||
│ ↓
|
||
│ 读取 optimization_report.json → 更新数据库
|
||
│
|
||
└─▶ POST /api/publisher/generate/{topic_id}
|
||
↓
|
||
api/publisher.py → subprocess(scripts/publisher.py --topic-id X)
|
||
↓
|
||
复制 HTML 到 content/published/X/手动发布/
|
||
```
|
||
|
||
---
|
||
|
||
## 📁 数据源唯一性
|
||
|
||
**核心数据文件**:`automation/data/sustainability_topics.json`
|
||
|
||
这是系统中**唯一**的选题状态源:
|
||
- `collector.py` 写入新选题(status: "待处理")
|
||
- `creator.py` 更新为"待审查" → "draft"
|
||
- `compliance_optimizer.py` 更新为"待发布"
|
||
- `publisher.py` 更新为"已发布"
|
||
- `platform` 的 `sync.py` 同步此 JSON 到 SQLite 供前端快速查询
|
||
|
||
**不要手动编辑数据库**!应通过脚本或 API 修改 JSON。
|
||
|
||
---
|
||
|
||
## 🎯 部署检查清单
|
||
|
||
- [x] Python 依赖安装 (`platform/backend/requirements.txt`)
|
||
- [x] 虚拟环境创建(可选)
|
||
- [x] 数据目录存在 (`automation/data/`)
|
||
- [x] 日志目录存在 (`automation/logs/`)
|
||
- [x] 选题 JSON 存在 (`automation/data/sustainability_topics.json`)
|
||
- [x] 前端文件就绪 (`platform/frontend/index.html`)
|
||
- [x] 软链接 `automation/scripts → ../scripts/` 正常
|
||
- [x] 端口 8000 可用
|
||
- [ ] cron 定时任务已配置(如需自动运行)
|
||
|
||
---
|
||
|
||
## 🔧 常见命令
|
||
|
||
```bash
|
||
# 1. 启动管理平台
|
||
cd yu-zhi-ran
|
||
./start-platform.sh 8000
|
||
|
||
# 2. 手动运行完整流水线(测试)
|
||
python test_full_pipeline.py --topic-id A05
|
||
|
||
# 3. 查看日志
|
||
tail -f automation/logs/creator_$(date +%Y-%m-%d).log
|
||
tail -f automation/logs/optimizer_$(date +%Y-%m-%d).log
|
||
tail -f automation/logs/publisher_summary_$(date +%Y-%m-%d).json
|
||
|
||
# 4. 查看选题库状态
|
||
python -c "import json; d=json.load(open('automation/data/sustainability_topics.json')); print(f'总:{len(d)}, 待处理:{sum(1 for t in d if t.get(\"status\")==\"待处理\")}, 待发布:{sum(1 for t in d if t.get(\"status\")==\"待发布\")}')"
|
||
|
||
# 5. 触发单步任务
|
||
python scripts/collector.py
|
||
python scripts/creator.py --topic-id A01
|
||
python scripts/publisher.py --topic-id A01
|
||
|
||
# 6. API 测试
|
||
curl http://localhost:8000/api/system/status | python3 -m json.tool
|
||
```
|
||
|
||
---
|
||
|
||
## 📝 说明
|
||
|
||
### 为何保留软链接?
|
||
|
||
`automation/scripts/` 通过软链接指向 `../scripts/`,原因:
|
||
- 历史兼容:部分脚本内部使用了硬编码路径 `PROJECT_ROOT/scripts/`
|
||
- 统一管理:所有脚本集中在一个目录,便于维护
|
||
- 避免复制:减少磁盘占用和同步问题
|
||
|
||
### platform 与 automation 的关系
|
||
|
||
- **platform**: Web 管理界面 + API 服务
|
||
- **automation**: 数据存储 + 日志归档 + 软链接脚本
|
||
- **scripts**: 实际执行逻辑(CLI 工具)
|
||
|
||
platform 通过 `subprocess` 调用 `scripts/` 中的脚本,输出写入 `automation/data/` 和 `automation/logs/`。
|
||
|
||
---
|
||
|
||
**更新日期**: 2026-04-19
|
||
**维护**: AI 助手小然
|