# 宇之然项目目录结构说明

## 整体布局

```
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 助手小然
