Compare commits
201 Commits
v1.0.0
...
56c9376c58
| Author | SHA1 | Date | |
|---|---|---|---|
| 56c9376c58 | |||
| 302efd5f2d | |||
| 897f72012f | |||
| 0258a9af9f | |||
| 9058539bae | |||
| 9fba863ce7 | |||
| 45ad5443c1 | |||
| ef289b18d1 | |||
| f1e6c11505 | |||
| e9cd0374f4 | |||
| 8a04a23e86 | |||
| 8f5a9e7ede | |||
| 12e49f2811 | |||
| 81f89f6f00 | |||
| a692f1dd44 | |||
| 4b87125683 | |||
| 5a19e77d27 | |||
| d3ea832b3b | |||
| 1ff015e281 | |||
| f6e5e90736 | |||
| 5caf7bc52e | |||
| dcfeccc97b | |||
| 00431c827b | |||
| c8a5e8fd87 | |||
| c069a140bb | |||
| 24e46eced5 | |||
| f15e0f720a | |||
| 7c9a8b88b4 | |||
| 93d1d511e5 | |||
| 2aedb69efd | |||
| 773080cf4f | |||
| 63a6fabc00 | |||
| d601a26850 | |||
| 8595bbc521 | |||
| 23ff63baa9 | |||
| d0896ef10e | |||
| c6628b22f6 | |||
| 499c511140 | |||
| abbf1468bc | |||
| 53f105305f | |||
| f1dc29f439 | |||
| 475945418e | |||
| 2c17f006fc | |||
| 31d8434010 | |||
| 09c467e56d | |||
| 1084388fec | |||
| 468c9066cb | |||
| 9b9ee4964b | |||
| 10ad549050 | |||
| 3fab87ee11 | |||
| bd3228806d | |||
| 6585909ffc | |||
| 2c6adf1f43 | |||
| b105eee9bb | |||
| 878daebfe0 | |||
| 004698cf98 | |||
| 29d97b5f1a | |||
| 80023bbd6c | |||
| f94e6b0161 | |||
| ac8644d752 | |||
| b2d043b231 | |||
| 1855f190f5 | |||
| a8e0a76e07 | |||
| 4e10cc95d3 | |||
| 9178f436b2 | |||
| 0dcfda0c80 | |||
| 5037d5d0ed | |||
| 56293a52a2 | |||
| 6b790e77f6 | |||
| 6f81167691 | |||
| 7d50878c7d | |||
| eb1c4205fa | |||
| a26f0e936e | |||
| 10996ce6ce | |||
| c8bee712d7 | |||
| 40a77cad2c | |||
| 09da2f9dc4 | |||
| eb800c5acc | |||
| 9a328323c0 | |||
| bf38125362 | |||
| 2244736318 | |||
| 63f074e4df | |||
| 0a8fbda4fd | |||
| 498165440f | |||
| 55e5f3d166 | |||
| 1c78828681 | |||
| 3dce54b359 | |||
| 0897074d40 | |||
| 671cec58fa | |||
| 7b4e52743b | |||
| 894e53caef | |||
| f427aea1b3 | |||
| 33766a396d | |||
| a09e7e6671 | |||
| 7169ddb678 | |||
| 279dc5b894 | |||
| 52564ad036 | |||
| bb50d5d925 | |||
| a46fedabb5 | |||
| 39719354fb | |||
| 41b0f694ee | |||
| 5674114599 | |||
| dc531460ea | |||
| eb472d232e | |||
| f2d778b5ce | |||
| 2b7935b408 | |||
| 2852b6ef06 | |||
| d32fc05f4f | |||
| 9c37c9a574 | |||
| 301dc3e438 | |||
| fef435cc78 | |||
| 1115223066 | |||
| 233e23016c | |||
| bc6a302e59 | |||
| 25694db33b | |||
| 71cb4c35a8 | |||
| e77a1aa4d9 | |||
| 526278589b | |||
| cf5103bbca | |||
| ac48304532 | |||
| c13d8c29aa | |||
| df86e01cd2 | |||
| 9147d5e679 | |||
| 2220d7b981 | |||
| c85320ae72 | |||
| beb2cf2473 | |||
| ef168e3d90 | |||
| 5587fa0bce | |||
| b8d9e0c209 | |||
| 284b18e5fc | |||
| 0317a8f42f | |||
| df5a9db3ad | |||
| 31d6306e3b | |||
| 8dd19a2179 | |||
| 8920a337e0 | |||
| bd381ff65a | |||
| 53c3948cad | |||
| 511d40d40c | |||
| bdcf32dce8 | |||
| aa76f8203f | |||
| 601fc5d239 | |||
| 98c6c22a26 | |||
| 2cbf2909f8 | |||
| e1613d2af9 | |||
| 94295e1f74 | |||
| cfb60d7aae | |||
| e1ba31afda | |||
| 0a31ae09af | |||
| 6f0713953a | |||
| d719181834 | |||
| 953b74bf52 | |||
| 0a77e67200 | |||
| 03287697c3 | |||
| 6cb273a8a9 | |||
| 4647921e01 | |||
| 54c84b6681 | |||
| 33133430f8 | |||
| d63074be71 | |||
| 75ae5ae01f | |||
| 9ced46c296 | |||
| b85b89a569 | |||
| 5fe426fc90 | |||
| 1eef4c177b | |||
| 62af077479 | |||
| 27729d2987 | |||
| d0d079203a | |||
| a93d029778 | |||
| 5ff0b8e669 | |||
| 8b5b76f6cb | |||
| 73de8702ac | |||
| 20970034b6 | |||
| 8a86d97724 | |||
| 9e72e5fd35 | |||
| 2e353b7fff | |||
| b2055df118 | |||
| 0a19cc203b | |||
| 87ebd94719 | |||
| 5f44df1d48 | |||
| 4d5e249c55 | |||
| d645c032ca | |||
| 62a293e2b0 | |||
| 6c6a153997 | |||
| d9ffcb5840 | |||
| fb99241a0f | |||
| d3e64bd649 | |||
| 17b294726a | |||
| 9725ac73d4 | |||
| 95f0c6b345 | |||
| fb83c164da | |||
| c0c062e863 | |||
| 277b13eaae | |||
| 59d2a76df4 | |||
| 4412adfae5 | |||
| 86425eb18f | |||
| 1be6d5e57d | |||
| 3ff38c5ee0 | |||
| be091287b8 | |||
| 678314682e | |||
| 08e5df6ab7 | |||
| c95f061ec0 | |||
| 379592a35d |
@@ -46,6 +46,7 @@ sessions/
|
||||
.cache/
|
||||
|
||||
# Project specific
|
||||
automation/backups/
|
||||
automation/data/drafts/*
|
||||
!automation/data/drafts/.gitkeep
|
||||
automation/data/releases/*
|
||||
@@ -54,3 +55,15 @@ automation/data/published/*
|
||||
!automation/data/published/.gitkeep
|
||||
content/published/*
|
||||
!content/published/.gitkeep
|
||||
automation/data/outlines/
|
||||
automation/data/research/
|
||||
automation/data/sustainability_raw/
|
||||
automation/data/search_cache.json
|
||||
automation/data/trends.json
|
||||
automation/data/sustainability_cases.json
|
||||
automation/images/
|
||||
data/*.db
|
||||
*.db
|
||||
automation/data/mcp_*.json
|
||||
automation/data/*_session.txt
|
||||
research/
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"sessionID": "ses_12cdfe924ffebqMk2WsK4OQD87",
|
||||
"updatedAt": "2026-06-17T01:09:35.927Z",
|
||||
"sources": {
|
||||
"background-task": {
|
||||
"state": "idle",
|
||||
"updatedAt": "2026-06-17T01:09:35.927Z"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"sessionID": "ses_13069b590ffefKhsLBe5CKeIx4",
|
||||
"updatedAt": "2026-06-16T08:46:00.608Z",
|
||||
"sources": {
|
||||
"background-task": {
|
||||
"state": "idle",
|
||||
"updatedAt": "2026-06-16T08:46:00.608Z"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"sessionID": "ses_1dede8a7affeG6DxtfPUOviXrp",
|
||||
"updatedAt": "2026-06-17T08:18:52.213Z",
|
||||
"sources": {
|
||||
"background-task": {
|
||||
"state": "active",
|
||||
"reason": "2 background task(s) active",
|
||||
"updatedAt": "2026-06-17T08:18:52.213Z"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,115 @@
|
||||
# AGENTS.md
|
||||
|
||||
## Stack
|
||||
- **Backend**: FastAPI 0.104 + SQLAlchemy 2.0 + PostgreSQL 16 (`yzr_nr`)
|
||||
- **Frontend**: Vue 3 (CDN, no build step) + Element Plus — static HTML served by FastAPI
|
||||
- **Auth**: JWT (`python-jose` + bcrypt), default admin `admin/admin123`
|
||||
- **Scheduler**: APScheduler (daily cron: 01:10 trends, 01:30 collect, 02:00 generate, 03:00 optimize, 05:00 sources, 06:00 metrics)
|
||||
- **Task DB**: `TaskLog` (module_id/status/error_trace/result_data/triggered_by) + `TaskConfig` (params/enabled/schedule)
|
||||
- **LLM**: Multi-provider (nvidia primary, opencode-go fallback). API keys in DB (managed via admin UI) or `.env`.
|
||||
|
||||
## Commands
|
||||
|
||||
```bash
|
||||
# Start/stop/restart server (systemd service, auto-restart on failure)
|
||||
systemctl start yzr-platform.service # 启动
|
||||
systemctl stop yzr-platform.service # 停止
|
||||
systemctl restart yzr-platform.service # 重启
|
||||
systemctl status yzr-platform.service # 查看状态
|
||||
journalctl -u yzr-platform.service -n 50 --no-pager # 查看日志
|
||||
|
||||
# Fallback: start without systemd (用于调试)
|
||||
cd /root/openclaw-workspace/projects/yu-zhi-ran
|
||||
setsid ./start-platform.sh 8001
|
||||
|
||||
# Run full integration test
|
||||
cd /root/openclaw-workspace/projects/yu-zhi-ran && python3 tests/test_new_features.py
|
||||
|
||||
# Run specific scripts (from project root)
|
||||
python3 scripts/collector.py
|
||||
python3 scripts/creator.py --topic-id B02
|
||||
```
|
||||
|
||||
## Project layout
|
||||
|
||||
```
|
||||
yu-zhi-ran/
|
||||
├── platform/
|
||||
│ ├── backend/app/main.py # FastAPI entry, mounts frontend at /
|
||||
│ ├── backend/app/api/*.py # 21 API routers
|
||||
│ ├── backend/app/core/ # nvidia_client.py, scheduler.py, etc.
|
||||
│ ├── backend/app/models.py # SQLAlchemy models (593 lines)
|
||||
│ ├── backend/app/schemas.py # Pydantic schemas (504 lines)
|
||||
│ ├── backend/app/database.py # PG env config + ALTER TABLE migrations
|
||||
│ ├── backend/app/initial_data.py
|
||||
│ └── backend/.env # API keys, DB creds
|
||||
├── scripts/ # creator.py, writer.py, collector.py, etc.
|
||||
├── tests/test_new_features.py # 33-test integration suite
|
||||
└── PROGRESS.md # Single source of truth for project status
|
||||
```
|
||||
|
||||
## Gotchas & conventions
|
||||
|
||||
### Server
|
||||
- Shell timeout kills background processes — always use `setsid` to start
|
||||
- Env in `platform/backend/.env`, loaded via `dotenv` at each module level
|
||||
|
||||
### Database
|
||||
- `init_db()` in `database.py` runs ALTER TABLE migrations at startup (PostgreSQL)
|
||||
- `USE_POSTGRES=false` falls back to SQLite (used in tests)
|
||||
- Models have timezone-aware `DateTime(timezone=True)` columns
|
||||
|
||||
### Content quality architecture (三平台差异化)
|
||||
|
||||
**核心原则:三平台不再共享同一篇 markdown,各自独立展开。**
|
||||
- `writer.py` 对 zhihu/wechat/xiaohongshu 分别调用 `generate_platform_markdown(platform)`,各走不同的 `section_expansion_{platform}` prompt
|
||||
- 知乎:数据分析深度(400-800字/节),用「你」称呼读者
|
||||
- 公众号:个人叙事对话感(300-500字/节),用「我」口吻
|
||||
- 小红书:精炼干货(100-200字/节),直接给方法,可用 emoji
|
||||
|
||||
**字数配置:**
|
||||
- 知乎 min 3000 / max 8000
|
||||
- 公众号 min 2000 / max 4000
|
||||
- 小红书 min 400 / max 1000
|
||||
- 存于 `platform_configs` 表,`min_words` / `max_words` 字段,后台「平台管理」可改
|
||||
|
||||
**AI 套话检测:**
|
||||
- DB 存储:`content_clean_rules` 表,`rule_type='ai_telltale'`
|
||||
- 由 `config_items.py` 中的 `DEFAULT_CONTENT_CLEAN_RULES` 种子数据
|
||||
- `compliance_checker.py` 运行时从 DB 加载(`_load_ai_telltales()`),DB 不可用时回退代码硬编码列表
|
||||
- 后台「配置管理→敏感词/清理规则」可增删改(操作 `ContentCleanRule` 表)
|
||||
|
||||
### Prompts (`prompt_configs` table)
|
||||
- **DB 是唯一来源**,修改 prompt 直接 `UPDATE prompt_configs SET content = '...' WHERE key = '...';`
|
||||
- 代码 `scripts/prompt_loader.py` 中的 `_PROMPT_DEFAULTS` **仅作种子数据**,第一次写入后就不再生效
|
||||
- 新增 prompt:在 `_PROMPT_DEFAULTS` 添加定义 → 重启后自动补入 DB(仅当该 key 不存在时)
|
||||
- 修改 prompt:**直接改 DB,不要改代码**(除非要更新种子供新环境用)
|
||||
- DB 不可用时回退代码默认值(仅紧急模式)
|
||||
- 三平台独立 section_expansion 提示词 key: `section_expansion_zhihu` / `section_expansion_wechat` / `section_expansion_xiaohongshu`
|
||||
- 标题提示词去套路化,使用自然语言(不像 AI 写的 prompt)
|
||||
|
||||
### Prompt quality checks (`compliance_checker.py`)
|
||||
- 软质量问题(AI套话/人称混用/阅读体验)只降分、不挡流程(`passed=true`)
|
||||
- 硬合规问题(敏感词/法律/品牌)扣分多且阻塞流程
|
||||
- AI 套话从 DB `content_clean_rules(rule_type='ai_telltale')` 加载,后台可动态管理
|
||||
- 人称检查修正:去掉「大家」误报,仅检查「你们」和「你」混用
|
||||
|
||||
### LLM
|
||||
- `call_llm()` in `core/nvidia_client.py` — reads active provider from DB `LLMConfig.is_active`, API key from env
|
||||
- DeepSeek reasoning models return `reasoning_content` (thinking) + `content` (answer). `call_llm` prefers `content`, falls back to tail of `reasoning_content`
|
||||
- `max_tokens` must be generous (≥500 for tags/titles, ≥2000 for article content) — reasoning models consume tokens for thinking
|
||||
- Schema (`LLMConfigResponse`) must include `provider`, `base_url`, `api_key` fields or they get silently dropped from API responses
|
||||
|
||||
### Frontend
|
||||
- No npm build step — edit `.html` files directly
|
||||
- H5 mobile nav only created when `window.innerWidth <= 768`
|
||||
- `navigation-component.js` + `navbar-component.js` injected as Vue components
|
||||
- For date filters on topics, use backend `?today=true` (server-side `date.today()`) — client-side `new Date()` gives UTC which differs from Asia/Shanghai by 8h
|
||||
|
||||
### Tests
|
||||
- `test_new_features.py` starts its own uvicorn on port 18503, runs against SQLite
|
||||
- Run from project root: `python3 tests/test_new_features.py`
|
||||
|
||||
### Project status
|
||||
- PROGRESS.md is the single truth source for progress — update it after any significant task
|
||||
- `archive/` dir keeps historical/outdated docs with `YYYY-MM-DD` date suffix
|
||||
@@ -0,0 +1,666 @@
|
||||
# 宇之然 · 项目进度总览
|
||||
|
||||
> 本文件为项目进度唯一真理源,所有进度信息以此为准。
|
||||
> 其他文档中的进度描述一律以本文为准。
|
||||
|
||||
**最后更新**:2026-06-23 (v25)
|
||||
|
||||
---
|
||||
|
||||
## 一、项目总览
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| 品牌 | 宇之然 — 科技沟通万物,愿世间百态回归自然 |
|
||||
| 技术栈 | FastAPI + SQLAlchemy + PostgreSQL 16 + Vue 3 (CDN) + Element Plus |
|
||||
| 平台服务 | 运行中 (端口 8001) |
|
||||
| 策略阶段 | 全球-本土对比研究(2026-04-15 升级) |
|
||||
| Git 提交 | 170 commits · 4 tags (v1.0.0~v1.0.4) · main 分支 |
|
||||
|
||||
---
|
||||
|
||||
## 二、里程碑完成情况
|
||||
|
||||
| 里程碑 | 说明 | 计划 | 实际 | 状态 |
|
||||
|--------|------|------|------|------|
|
||||
| M1 | 项目框架搭建完成 | 2026-04-10 | 2026-04-10 | ✅ |
|
||||
| M2 | 首批选题确定 | 2026-04-12 | 2026-04-10 | ✅ |
|
||||
| M3 | 首篇文章发布 | 2026-04-14 | 2026-04-14 | ✅ |
|
||||
| M4 | 首月发布4篇 | 2026-05-10 | 2026-06-18 | ✅ 4篇完成 |
|
||||
|
||||
---
|
||||
|
||||
## 三、发布记录
|
||||
|
||||
| 编号 | 标题 | 日期 | 平台 | 状态 |
|
||||
|------|------|------|------|------|
|
||||
| 001 | 种菜一年,焦虑降了43%:我在阳台治愈了自己 | 2026-04-14 | 知乎/微信/小红书 | ✅ 已发布 [知乎链接](https://zhuanlan.zhihu.com/p/2026998296120411553) |
|
||||
| TOPIC-BBB1CC | 城市农业新趋势:东京垂直农场与上海阳台种菜对比研究 | 2026-04-21 | 知乎/微信/小红书 | ✅ 已发布 |
|
||||
| A01 | 远程工作2026中国指南:从"不可能"到"可行"的路径图 | 2026-04-23 | 知乎/微信/小红书 | ✅ 已发布 |
|
||||
|
||||
---
|
||||
|
||||
## 四、模块进度
|
||||
|
||||
### 4.1 平台系统
|
||||
|
||||
| 模块 | 状态 | 说明 |
|
||||
|------|------|------|
|
||||
| 后端 API (auth/topics/articles/publishing/calendar/metrics/assets/tasks/platform_config/admin) | ✅ 完成 | 核心 11 个 API 模块,JWT 认证 |
|
||||
| 扩展 API (cases/audit/llm_configs/system_configs/optimizer_logs/task_logs/task_configs) | ✅ 完成 | 新增案例库、审计、LLM配置、任务配置、任务运行记录模块 |
|
||||
| 前端页面 (仪表盘/选题/日历/数据/素材/任务/平台/系统管理/用户/日志/文章) | ✅ 完成 | Vue 3 + Element Plus SPA |
|
||||
| 数据库 (PostgreSQL 16) | ✅ 运行中 | `yzr_nr` 库 |
|
||||
| 服务 | ✅ 运行中 | 端口 8001 |
|
||||
| 数据库迁移 (SQLite→PostgreSQL) | ✅ 完成 | 2026-05-08 |
|
||||
| PWA 离线支持 | ✅ 完成 | manifest.json + Service Worker + 离线页面 |
|
||||
| articles 表 + 数据迁移 | ✅ 完成 | 48 篇文章从文件系统迁入 DB,释放文件已清理 |
|
||||
|
||||
### 4.2 内容生产
|
||||
|
||||
| 模块 | 状态 | 说明 |
|
||||
|------|------|------|
|
||||
| 选题库 | ✅ 完成 | 10 个旧选题 (001~010) + 20 个新选题 (4 大支柱) |
|
||||
| 文章草稿 (001 系列) | ✅ 完成 | 大纲/初稿/优化版/微信版 四版齐备 |
|
||||
| 配图生产 | ✅ 完成 | 10 张 SVG + 10 张 PNG,含压缩版 |
|
||||
| 合规审查 | ✅ 完成 | 评分 9.2/10,引用来源补充完成 |
|
||||
| 多平台发布 (001 / BBB1CC / A01) | ✅ 完成 | 知乎/微信/小红书 三平台均已发布 |
|
||||
| 银发科技适配指南 | ⏳ 写作中 | drafts 中 302 行初稿 |
|
||||
| F01 AI写作实战 | ✅ 已入库 | 三平台文章已存入 articles 表,待审查通过后发布 |
|
||||
| F02 平台差异策略 | ✅ 已入库 | 三平台文章已存入 articles 表,待审查通过后发布 |
|
||||
|
||||
### 4.3 自动化系统
|
||||
|
||||
| 脚本 | 状态 | 说明 |
|
||||
|------|------|------|
|
||||
| publish_to_zhihu.sh | ✅ 可用 | 知乎自动发布 |
|
||||
| publish_to_wechat_mp.sh | ✅ 可用 | 微信公众号自动发布 |
|
||||
| generate_images.py / image_generator.py | ✅ 可用 | SVG + PNG 配图生成 |
|
||||
| compliance_checker.py | ✅ 可用 | 合规审查(敏感词/平台规则/品牌规范) |
|
||||
| compliance_optimizer.py | ✅ 重构 | 移除 manual_review,改为迭代LLM修复(最多3次),合规分回写入Topic;解硬编码 provider,改从 env 读取;关键词过滤从宽泛改为精准 |
|
||||
| creator.py / writer.py / outline.py / research.py | ✅ 优化 | 全链路LLM提示词优化(SEO/平台适配/真人感) |
|
||||
| collector.py / collector_db_integration.py | ✅ 可用 | 趋势采集 |
|
||||
| wecom_notifier.py | ✅ 可用 | 企业微信通知 |
|
||||
| db_helper.py | ✅ 扩展 | update_topic_status 支持保存 compliance_score |
|
||||
| search_utils.py | ✅ 重构 | 移除 _call_mcp(opencode MCP),新增 360/搜狗/微信搜索(免 API Key),百度千帆日限提升至 200 |
|
||||
| opencode_search.py / mcp_search_server.py | ❌ 已删除 | opencode 搜索配额耗尽,替换为 360/搜狗/微信等免 Key 源 |
|
||||
| web_search.py | ✅ 保留 | 本地缓存 + Bing 搜索(闲置备用) |
|
||||
|
||||
### 4.4 流水线流程
|
||||
|
||||
| 步骤 | 触发方式 | 说明 |
|
||||
|------|---------|------|
|
||||
| 内容采集 | 定时 01:30 | 热点趋势采集→生成选题建议→存入选题库 |
|
||||
| 内容创作 | 手动点击 / 定时 03:30 (原 02:00) | 研究→大纲→撰写文章→合规审查→存入 articles 表 |
|
||||
| 合规审查 | 手动点击 / 定时 04:30 (原 03:00) | 从 articles 表读取 draft→合规检查→LLM迭代修复(最多3次)→状态→待发布 |
|
||||
| 信息源优化 | 定时 05:00 | AI评估采集类别与信息源配置,给出调整建议 |
|
||||
| 指标同步 | 定时 06:00 | 同步统计数据 |
|
||||
| 发布 | 手动点击 | 仅待发布状态可选 |
|
||||
|
||||
---
|
||||
|
||||
## 五、当前任务队列
|
||||
|
||||
### ✅ 已完成
|
||||
|
||||
| 任务 | 完成日期 | 备注 |
|
||||
|------|---------|------|
|
||||
| 审查流程优化(移除 manual_review) | 2026-05-14 | 改为迭代LLM修复(最多3次),合规分回写Topic |
|
||||
| 内容采集加入定时调度 | 2026-05-14 | scheduler 新增 scheduled_collect 01:30 |
|
||||
| 全链路LLM提示词优化 | 2026-05-14 | 覆盖trends/topic_selector/research/outline/writer/nvidia_client/compliance 共8文件≈24个提示词,增强SEO/平台推荐/真人感 |
|
||||
| 导航布局重构 | 2026-05-16 | navbar + navigation 合并为 uni-nav,单行 top-bar 自适应 PC/H5,10 页迁移完成 |
|
||||
| 文章管理页面 (articles.html) | 2026-05-16 | 新增 articles API (list/detail/delete) + 完整管理页面,支持筛选/搜索/预览/删除 |
|
||||
| CSS架构统一整合 | 2026-05-16 | reset/body/layout/card/page-header/filter/toolbar 移入 theme-modern.css(86→127行),10页内联CSS总量从~660行降至~400行;preview对话框CSS归一化;删除 dead JS;index.html双style块合并为单一亮色主题 |
|
||||
| Phase 1.1 配图集成到创作流水线 | 2026-05-16 | image_generator.py 支持 --topic-id 参数, DB读写图片路径; Article 新增 images JSON字段+迁移; creator.py 新增配图步骤; API GET /api/articles/{topic_id}/images; 文章页预览显示封面图 |
|
||||
| Phase 1.3 统一前端体验 | 2026-05-16 | users.html 补 loading+空状态; index.html 渲染loadingStats+fetchModules错误提示; metrics.html 渲染loadingDashboard |
|
||||
| Phase 2.1 发布审批 UI | 2026-05-16 | 后端 MultiPublishRequest 多平台发布 API; 前端发布确认弹窗+平台勾选 |
|
||||
| Phase 2.2 日历关联文章状态 | 2026-05-16 | 后端 enrich_entry 添加 topic_status+platform_icon; 前端日历卡片显示平台图标+Topic状态标签; 修复 el-tag 缺少闭合 |
|
||||
| emoji 替换为 Element Plus 图标 | 2026-05-16 | icon-components.js 注册 25 个 SVG 图标组件; 11 页 emoji → `<el-icon>` 批量替换 |
|
||||
| H5 卡片布局补全 | 2026-05-16 | metrics.html 热门选题/平台对比/选题推荐三表加 H5 卡片视图 |
|
||||
| Phase 3.1 平台数据对接 | 2026-05-16 | scripts/sync_metrics.py (估计算法); scheduler 新增 scheduled_metrics_sync 06:00 |
|
||||
| Phase 3.2 数据看板增强 | 2026-05-16 | Chart.js 集成: 趋势折线图/状态环形图/平台对比柱状图 |
|
||||
| Phase 4 多租户隔离 (JWT+API 层) | 2026-05-16 | org_id 注入 JWT payload; 12 个 API 模块添加 org 过滤; 创建选题自动继承用户 org; 管理端组织 CRUD |
|
||||
| Phase 4 前端多租户 | 2026-05-16 | admin.html 新增组织管理标签页 (列表/创建/编辑/删除); users.html 增加组织列+H5卡片显示 |
|
||||
| Phase 4 预置数据修复 | 2026-05-16 | initial_data.py 管理员用户添加 org_id; opencode-go LLM config 补全 user_prompt_template |
|
||||
| PlatformConfig 模型字段扩展 | 2026-05-17 | 增加 requires_image/image_count_min/image_count_max/image_width/image_height/min_words/max_words; schemas/initial_data/前端表单同步; database.py 迁移 |
|
||||
| 微信公众号正文配图 | 2026-05-17 | writer.py wechat 分支在 h1 后插入 `<img>` 占位 |
|
||||
| 合规检查从 DB 读平台规则 | 2026-05-17 | compliance_checker.py 接受 platform_config 参数; compliance_optimizer.py 从 DB 加载平台配置传入 checker |
|
||||
| 登录页居中修复 | 2026-05-18 | login.html body 添加 login-body 类 |
|
||||
| 模块状态重复修复 | 2026-05-18 | system.py 重命名/去重,状态改查 jobs 而非日志文件 |
|
||||
| 仪表盘"近期计划"卡片 | 2026-05-18 | index.html 新增日历 7 天预告卡片 |
|
||||
| 日志/用户合并到系统管理 | 2026-05-18 | admin.html 增加用户管理+运行日志标签页;uni-nav 10→8 项 |
|
||||
| 日历页增强 | 2026-05-18 | 指南横幅/即将到来列表/空状态/操作提示 |
|
||||
| 任务页优化+分页 | 2026-05-18 | 6个定时任务/topic_title/STAGE_NAMES/前端分页 |
|
||||
| 选题页前端分页 | 2026-05-18 | paginatedTopics computed + el-pagination |
|
||||
| 后端 tasks API 改造 | 2026-05-18 | offset 参数 + topic_title 字段 |
|
||||
| admin 全标签页分页 | 2026-05-18 | 案例/类别/信息源/组织/用户 5 标签统一分页(10条/页)+总数显示 |
|
||||
| 选题预览修复 | 2026-05-18 | 补全 startEdit/cancelEdit/saveContent 方法;修复滚动条;strip .tags |
|
||||
| 任务状态卡死修复 | 2026-05-18 | 后台线程改用独立 DB session;前端 5s 自动轮询;中间进度 30% 显示 |
|
||||
| 预览平台切换修复 | 2026-05-18 | 补全 switchPlatform 方法 |
|
||||
| 超时任务自动清理 | 2026-05-18 | 启动时标记运行>1h 任务为 failed;已清理 21 个卡死任务 |
|
||||
| metrics 冗余统计移除 | 2026-05-18 | 删除与仪表盘重复的 4 个概览卡片 |
|
||||
| writer max_tokens 提升 | 2026-05-19 | 标题/标签 max_tokens 500→1000,修复推理模型思考链占用导致输出截断 |
|
||||
| 预览滚动条修复 | 2026-05-19 | 改用 height:68vh 替代 flex+calc,避免 Element Plus 对话框内滚动冲突 |
|
||||
| 定时任务 DB 化 | 2026-05-22 | TaskLog 新增 module_id/error_trace/triggered_by/result_data;TaskConfig 模型新建含 params/schedule/enabled;scheduler.py 全 7 个任务执行前后写 TaskRun;modules/status 从 DB 读取 |
|
||||
| 平台配置弹窗修复 | 2026-05-22 | el-dialog 移入 tab 内部(与表格同级)解决响应式问题;表单字段补全 |
|
||||
| AI 思考内容清洗 | 2026-05-22 | 新建 content_cleaner.py 集中管理清洗规则;writer.py/compliance_optimizer.py 统一引用;THINKING_PATTERNS 增强;strip_ai_preface 处理代码围栏块 |
|
||||
| 复制正文去噪音 | 2026-05-22 | copyContent 只提取 p/h1-h4/li 元素,去 style/svg/script/img |
|
||||
| platforms.html 入口合并 | 2026-05-22 | uni-nav 移除"平台"独立入口;admin.html 恢复"平台配置"tab 加启用中/全部筛选 |
|
||||
| opencode_search.py 日志 | 2026-05-22 | 补 FileHandler + StreamHandler,解决管理后台显示"从未运行" |
|
||||
| scheduler.json 导入修复 | 2026-05-22 | 补 import json,修复 sources(05:00) 执行时报错阻断 metrics(06:00) |
|
||||
| Scheduler 日志修复(僵尸行) | 2026-05-28 | _log_task 始终 INSERT 新行,所有 _run_* 保存 log_id 后 UPDATE 同一行,消除重复 running 状态 |
|
||||
| Systemd 服务化 | 2026-05-28 | yzr-platform.service(Restart=always,崩溃自动恢复);单 worker(--workers 1)防调度器冲突;Type=exec + KillMode=control-group 防僵尸进程 |
|
||||
| LLM 提供商量换 + 任务级模型选择 | 2026-05-28 | opencode-go 换 nvidia qwen3.5-397b-a17b(默认)+ sensenova deepseek-v4-flash(合规审查);llm_configs 加 is_default;所有 _run_* 方法开头调用 _set_task_llm_provider 设置 LLM_TASK_PROVIDER |
|
||||
| 合规审查修复 | 2026-05-28 | compliance_optimizer.py 移除硬编码 provider;补 import os(之前导致 NameError);关键词过滤从宽泛改为精准,避免误拦正常内容 |
|
||||
| 搜索提供商重构 | 2026-05-28 | 移除 opencode MCP(配额耗尽),新增 360/搜狗/微信搜索(免 Key),百度千帆日限 50→200 |
|
||||
| opencode 冗余代码清理 | 2026-06-02 | 删除 opencode_search.py / mcp_search_server.py / _call_mcp / 前后端所有 opencode/MCP 引用;禁用搜索缓存定时任务 |
|
||||
| 任务抽屉产出记录优化 | 2026-06-03 | drawer 产出结果 tab 优先显示日志消息(last_message),过滤 None/空值;修复 tasks.py 因 opencode 清理导致的 SyntaxError;清理 DB 中旧搜索缓存的 56 条 TaskLog + 1 条 TaskConfig |
|
||||
| Hermes gateway 用户级服务恢复 | 2026-06-04 | 系统级服务 → 用户级(MemoryMax=1G 生效);删除 system 级文件;linger + default.target.wants 开机自启 |
|
||||
| v-cloak 修复 Vue 模板闪烁 | 2026-06-04 | 9 页 `<div id="app">` + `theme-modern.css` 的 `[v-cloak]` 规则,消除原始模板代码闪烁 |
|
||||
| **sensenova 多模型 + 模型级 rate limit** | **2026-06-04** | `LLMConfig` 加 `rate_limit`/`rate_limit_window_minutes`;seed 3 模型:deepseek-v4-flash(500次/5h)、6.7-flash-lite(1500次/5h)、u1-fast(1500次/5h);进程内 rate limiter;`LLM_TASK_MODEL` 环境变量实现任务级模型选择;`ai_image_generator.py` 已固定用 `sensenova-u1-fast` |
|
||||
|
||||
### ✅ 已完成
|
||||
|
||||
| 任务 | 完成日期 | 备注 |
|
||||
|------|---------|------|
|
||||
| GEO/SEO 结构化元数据注入 | 2026-06-09 | writer.py 的 `inject_geo_metadata()` 向 HTML 注入 JSON-LD Article schema、meta description/keywords、OG tags |
|
||||
| 大纲提示词 SEO 关键词增强 | 2026-06-09 | outline.py 新增 `_extract_seo_keywords()` 从研究笔记提取关键词;outline prompt 加入 GEO 数据引用要求 |
|
||||
| 搜索排名追踪 | 2026-06-09 | `SearchRanking` 模型(文章ID/关键词/排名位置/AI引用);`rank_tracker.py` 定时任务(每日 07:00)查 Bing 排名;`/api/seo/rankings` API;admin.html 新增"搜索排名"tab |
|
||||
| rank_tracker AI 引用检测 | 2026-06-18 | `_check_ai_citation()` 用 LLM 检测 Bing AI/百度 AI/Perplexity 引用 |
|
||||
| admin.html 任务管理 tab | 2026-06-18 | TaskConfig 参数编辑 + TaskLog 时间轴 (el-timeline) |
|
||||
| M4 第4篇文章发布 | 2026-06-18 | 发布 循环消费新物种 + 端侧AI隐私实战,累计 4 篇达首月目标 |
|
||||
| 导航 bug 修复(仪表盘→index.html) | 2026-06-18 | DB menu 中"仪表盘"path 从 `/` → `index.html`,解决点导航跳转 landing 页的问题 |
|
||||
| Landing 页 OG 图片创建 | 2026-06-18 | `/automation/images/og-landing.png`(1200x630 PNG,62KB);之前 404 |
|
||||
| Landing 页 GitHub 链接修正 | 2026-06-18 | `your-org` → `github.com` |
|
||||
| v23 全部功能验收 | 2026-06-18 | 12 页 200 OK、org_id 隔离生效、RBAC(require_role)11路由、菜单7项正确、factory/insights 新页、dashboard 重设计 |
|
||||
|
||||
## 十一、外推营销系统(v24 · 2026-06-21)
|
||||
|
||||
### 从「内容生产」到「外部推广」
|
||||
|
||||
**背景**:平台此前只覆盖平台内生产的内容的 SEO/GEO 优化,无法对用户已有的外部网站、公众号、小程序等做 SEO 推广。v24 新增完整的外部推广模块。
|
||||
|
||||
### 新增数据模型(6 张表)
|
||||
|
||||
| 模型 | 表名 | 说明 |
|
||||
|------|------|------|
|
||||
| `ExternalProduct` | `external_products` | 外部推广产品(website/article/wechat_account/miniprogram)|
|
||||
| `PromotionCampaign` | `promotion_campaigns` | 推广活动,关联产品和关键词 |
|
||||
| `CampaignKeyword` | `campaign_keywords` | 关键词跟踪(搜索量/难度/排名)|
|
||||
| `SEOAudit` | `seo_audits` | SEO 审计报告(6 维度评分)|
|
||||
| `KeywordRanking` | `keyword_rankings` | 多引擎关键词排名记录 |
|
||||
| `OptimizationTask` | `optimization_tasks` | AI 生成的优化建议 |
|
||||
|
||||
### API 端点(20 个)
|
||||
|
||||
| 端点 | 功能 |
|
||||
|------|------|
|
||||
| `GET/POST/PUT/DELETE /api/external/products` | 产品 CRUD |
|
||||
| `GET/POST/PUT/DELETE /api/external/campaigns` | 活动 CRUD |
|
||||
| `GET/POST/PUT/DELETE /api/external/keywords` | 关键词 CRUD |
|
||||
| `GET /api/external/audits` | SEO 审计记录列表 |
|
||||
| `GET /api/external/audits/{id}` | 审计详情(含优化建议)|
|
||||
| `GET /api/external/rankings` | 关键词排名列表 |
|
||||
| `GET /api/external/rankings/overview` | 排名概览统计 |
|
||||
| `GET /api/external/optimization-tasks` | 优化建议列表 |
|
||||
| `PATCH /api/external/optimization-tasks/{id}` | 更新任务状态 |
|
||||
| `GET /api/external/overview` | 外推营销总览 |
|
||||
|
||||
### SEO 审计脚本
|
||||
|
||||
`scripts/seo_auditor.py` — 自动抓取目标网站并分析:
|
||||
|
||||
| 维度 | 权重 | 检测项 |
|
||||
|------|------|--------|
|
||||
| Meta 标签 | 20% | title/description/keywords/OG tags |
|
||||
| 标题结构 | 15% | H1/H2 存在性、层级连续性 |
|
||||
| 内容质量 | 25% | 字数、图片 alt、关键词密度 |
|
||||
| 性能 | 10% | 渲染阻塞资源、图片尺寸 |
|
||||
| 链接 | 10% | 内链/外链/断链/nofollow |
|
||||
| 移动端 | 20% | viewport、响应式、字号 |
|
||||
|
||||
审计结果自动保存到 DB,生成可追踪的 OptimizationTask。
|
||||
|
||||
### 关键文件变更
|
||||
|
||||
| 文件 | 改动 |
|
||||
|------|------|
|
||||
| `platform/backend/app/models.py` | 新增 6 个模型(ExternalProduct/PromotionCampaign/CampaignKeyword/SEOAudit/KeywordRanking/OptimizationTask)|
|
||||
| `platform/backend/app/schemas.py` | 新增 18 个 Pydantic schema 类 |
|
||||
| `platform/backend/app/api/external_promotion.py` | **新建** — 20 个 API 端点 |
|
||||
| `platform/backend/app/main.py` | 注册 external_promotion router |
|
||||
| `platform/frontend/campaigns.html` | **新建** — 外推营销 SPA 页面(6 Tab)|
|
||||
| `platform/frontend/uni-nav.js` | 导航增加「外推营销」入口 |
|
||||
| `scripts/seo_auditor.py` | **新建** — SEO 审计自动化脚本 |
|
||||
|
||||
---
|
||||
|
||||
## 十二、内容策略聚焦改造(v25 · 2026-06-23)
|
||||
|
||||
### 从「6领域分散」到「3领域聚焦」
|
||||
|
||||
**背景**:此前内容覆盖可持续生活、数字游民、个人成长等 6 个领域,资源分散、品牌辨识度低。v25 聚焦「宇之然」品牌核心方向:AI 与前沿科技。
|
||||
|
||||
**聚焦的 3 个领域:**
|
||||
| 领域 | 方向 | 覆盖话题 |
|
||||
|------|------|---------|
|
||||
| AI与效率 🤖 | AI 工具、工作流、效率方法 | AI工具实测、AI前沿资讯、效率方法论 |
|
||||
| 科技人文 🔬 | AI 伦理、科技反思 | 数据隐私、人机关系、数字生活反思 |
|
||||
| 未来工作方式 💼 | 远程工作、职业转型 | AI时代职场、一人企业、技能升级 |
|
||||
|
||||
### Phase 1 — 代码改造(6 个文件)
|
||||
|
||||
| 文件 | 改动 |
|
||||
|------|------|
|
||||
| `initial_data.py` | TopicField 从 6 个缩减为 3 个;CollectorCategory 从 8 个环保类改为 5 个 AI/科技类;PlatformConfig allowed_tags 全部替换为 AI/效率/科技标签 |
|
||||
| `prompt_loader.py` | `sources_optimization` 提示词从"可持续生活领域"改为"AI与科技人文领域" |
|
||||
| `config/sources.yaml` | 全部信息源替换为 AI/科技相关(36氪RSS、少数派RSS、5 组 AI 搜索词、1 个本地案例库) |
|
||||
| `collector.py` | `DEFAULT_CHINA_PAINS` 从 8 个(7 环保 + 1 AI)改为 5 个 AI 焦点;`map_category_to_field` 返回 AI 领域;移除 4 处"可持续性"日志/默认值 |
|
||||
| `topic_selector.py` | `DEFAULT_TREND_DOMAIN_MAP` 从 12 条(含可持续生活/个人成长/副业/家庭教育)改为 11 条纯 AI/科技映射 |
|
||||
| `migrate_content_focus.py` | **新建** — Phase 2 DB 迁移脚本 |
|
||||
|
||||
### Phase 2 — DB 迁移
|
||||
|
||||
| 操作 | 影响 |
|
||||
|------|------|
|
||||
| TopicField | 更新 3 个新领域字段(排序/描述/图标),停用 5 个旧领域(可持续生活系统/可持续生活/数字游民/个人成长/个人知识工厂) |
|
||||
| Topic | 47 个 Topic 中 43 个已迁移到新领域(4 个无法映射的归入"AI与效率") |
|
||||
| Article | 删除 15 篇与旧可持续领域关联的旧文章 |
|
||||
| CollectorCategory | 创建 3 个新分类(AI前沿资讯/AI工具实测/AI与职场),更新 2 个(AI生活化/科技人文),停用 12 个旧分类(循环消费/低碳出行/干净饮食/零浪费生活/绿色家电与节能/碳普惠/环保科技产品/自我丰容/适我主义/情绪价值与心理健康/沉浸式新生活/数字游民与自由职业) |
|
||||
| CollectorSource | 停用 1 个旧源,创建 2 个新 AI 搜索源 |
|
||||
| PlatformConfig | 3 个平台(知乎/微信/小红书)的 allowed_tags 全部替换为 AI/科技标签 |
|
||||
| TrendFieldMapping | 同步 11 条新映射,停用旧映射 |
|
||||
|
||||
### Phase 3 — 文件清理
|
||||
|
||||
| 项目 | 数量 | 释放空间 |
|
||||
|------|------|---------|
|
||||
| 日志文件 (`automation/logs/`) | 400 个 | 2.5 MB |
|
||||
| 旧选题卡片 (`content/ideas/`) | 11 个文件 | 96 KB |
|
||||
| 可持续采集原始数据 (`sustainability_raw/`) | 多子目录 | 224 KB |
|
||||
| 旧数据文件 (`sustainability_cases.json/topics.json`) | 2 个 | - |
|
||||
| 旧草稿/大纲/研究笔记 (`drafts/outlines/research/`) | 91 个文件 | 740 KB |
|
||||
| 通知记录 (`notifications/`) | 1 个 | 4 KB |
|
||||
|
||||
### Phase 4 — 重启验证
|
||||
|
||||
- 服务运行中:HTTP 200 ✅
|
||||
- API 认证正常 ✅
|
||||
- TopicFields 仅返回 3 个活跃领域 ✅
|
||||
- Topic 总计 47 个,全部关联新领域 ✅
|
||||
- Articles 已清理(0 篇过时文章)✅
|
||||
- CollectorCategories 仅 5 个 AI 分类活跃 ✅
|
||||
|
||||
### 关键架构决策
|
||||
|
||||
- `collector.py` 类名(SustainabilityCollector/SustainabilitySource/SustainabilityCase)保留未改——减少中断风险,功能已从 sustainable 转向 AI/tech,重命名需要跨 20+ 文件修改
|
||||
- DB 种子数据按 `if count() == 0` 判断,已有数据的库通过独立迁移脚本处理
|
||||
- 旧数据优先保留(硬删除可能影响引用完整性),标记 `is_active=False` 而非删除
|
||||
|
||||
### 品牌调性与内容深化(v25.1 · 2026-06-23 第二次迭代)
|
||||
|
||||
**问题诊断**:第一次聚焦改造后,内容方向虽已收敛到 AI 3 领域,但存在品牌割裂("宇之然"调性偏人文自然 vs 内容全是纯工具测评)、AI 赛道竞争红海、平台策略错配(公众号叙事体不适合写 AI 工具)等深层问题。
|
||||
|
||||
**Phase A — 品牌调性注入(最核心改动)**
|
||||
|
||||
| prompt | 改动 | 预期效果 |
|
||||
|--------|------|---------|
|
||||
| `section_expansion_zhihu` | 加入独家数据要求+观点交锋,不只是介绍工具而是探讨技术如何改变人 | 在拥挤的 AI 知乎赛道上做出壁垒 |
|
||||
| `section_expansion_wechat` | 从「AI 工具叙事」→「科技人文思辨」:用「我」口吻写 AI 时代的困惑、顿悟或观察 | 对齐品牌调性,摆脱"AI 测评不适合叙事体"的结构性矛盾 |
|
||||
| `section_expansion_xiaohongshu` | 每个结论配亲测数据/对比/结果 | 用真实数据对抗同质化 |
|
||||
| `title_optimize_zhihu` | 增加观点交锋感+立场态度 | 从"工具文标题"→"辩论帖标题" |
|
||||
| `title_optimize_wechat` | 改为科技叙事方向,参考风格:「AI帮我写周报的第3个月,我终于发现哪里不对了」 | 对齐公众号新定位 |
|
||||
| `title_optimize_xhs` | 每条标题含数字/时间/效果结果感 | 提高点击率 |
|
||||
|
||||
**Phase B — SEO/GEO 长尾关键词**
|
||||
|
||||
- `collector.py`: `DEFAULT_CHINA_PAINS` 每个痛点扩展 3-5 个长尾问题("AI写周报""AI提示词怎么写""35岁学AI来得及吗")
|
||||
- `topic_selector.py`: `DEFAULT_TREND_DOMAIN_MAP` 从 11 条→18 条(新增 Prompt/提示词/AI编程/AI写作/数据隐私/AI教育/一人企业)
|
||||
|
||||
**Phase C — 差异化信息源**
|
||||
|
||||
在 `sources.yaml` 中新增 5 个与通用 AI 媒体形成区分的源:
|
||||
|
||||
| 新源 | 差异化定位 |
|
||||
|------|-----------|
|
||||
| 机器之心 RSS | AI 学术前沿,区别于大众科技媒体 |
|
||||
| AI 学术论文搜索(arXiv 中文) | 一手论文解读内容源 |
|
||||
| 独立开发者搜索 | 独特的小众 AI 产品视角 |
|
||||
| 行业数据报告搜索 | 自采数据的基础来源 |
|
||||
| AI 产品动态搜索 | 第一手产品更新信息 |
|
||||
|
||||
**Phase D — 栏目化内容机制**
|
||||
|
||||
为「AI工具实测周报」等固定栏目铺平道路:
|
||||
- Topic 模型新增 `series` 字段(VARCHAR, optional, indexed)
|
||||
- API 端点 `/api/topics` 新增 `?series=` 筛选参数
|
||||
- 前端 topics.html 搜索区增加「栏目」下拉筛选器
|
||||
- `database.py` 新增 ALTER TABLE 迁移(`topics.series`)
|
||||
|
||||
**Phase E — 公众号发布流水线**([需提供 WeChat APP_ID/APP_SECRET])
|
||||
- 已安装 `/wechat-mp-publisher` 技能,支持远程 MCP 中转
|
||||
- `wechat.env` 和 `mcp.json` 尚未配置
|
||||
|
||||
### 关键文件变更汇总
|
||||
|
||||
| 文件 | 变更类型 | 说明 |
|
||||
|------|---------|------|
|
||||
| `scripts/prompt_loader.py` | 修改 | 6 个 prompt 品牌调性注入(section_expansion×3 + title_optimize×3) |
|
||||
| `platform/backend/app/initial_data.py` | 修改 | 领域描述人文化、采集搜索词长尾化、平台格式说明更新 |
|
||||
| `scripts/collector.py` | 修改 | DEFAULT_CHINA_PAINS 长尾关键词扩展 |
|
||||
| `scripts/topic_selector.py` | 修改 | DEFAULT_TREND_DOMAIN_MAP 从 11→18 条 |
|
||||
| `config/sources.yaml` | 修改 | 新增机器之心/arXiv/独立开发者/行业报告/AI产品动态 5 个差异源 |
|
||||
| `platform/backend/app/models.py` | 修改 | Topic 模型新增 series 字段 |
|
||||
| `platform/backend/app/schemas.py` | 修改 | TopicBase/TopicCreate/TopicUpdate 新增 series |
|
||||
| `platform/backend/app/api/topics.py` | 修改 | list_topics 新增 series 查询参数 |
|
||||
| `platform/backend/app/database.py` | 修改 | ALTER TABLE 添加 topics.series 列 |
|
||||
| `platform/frontend/topics.html` | 修改 | 搜索区新增栏目下拉筛选器 |
|
||||
| `scripts/migrate_content_focus.py` | 新建 | DB 迁移脚本(Phase 2 遗留) |
|
||||
|
||||
---
|
||||
|
||||
|
||||
|
||||
> 过时文档统一移入 `archive/`,防止误导。
|
||||
|
||||
| 日期 | 路径 | 原因 |
|
||||
|------|------|------|
|
||||
| 2026-05-12 | `tasks/todo.md` → `archive/tasks/todo.md.2026-04-10` | 内容停滞于 2026-04-10,信息过时 |
|
||||
| 2026-05-12 | `content/ideas/001-compliance.md` → `archive/content/ideas/` | 001 已发布,合规报告无须保留在活跃目录 |
|
||||
| 2026-05-12 | `content/ideas/001-research.md` → `archive/content/ideas/` | 001 已发布,研究笔记无须保留在活跃目录 |
|
||||
| 2026-05-12 | `content/publishing/001-images.md` → `archive/content/` | 配图已生成,规划稿无须保留在活跃目录 |
|
||||
|
||||
---
|
||||
|
||||
## 七、内容质量升级(v19 · 2026-06-05)
|
||||
|
||||
### 三平台差异化内容架构
|
||||
|
||||
**背景**:此前三平台共用同一篇 markdown,仅做浅层适配(加 emoji/换人称),导致知乎缺深度、公众号缺情感、小红书过长。
|
||||
|
||||
**核心改动:**
|
||||
1. **writer.py** — `generate_full_markdown()` → `generate_platform_markdown(platform)`,每平台调用独立的 `section_expansion_{platform}` prompt
|
||||
- 知乎:`section_expansion_zhihu` — 数据分析深度,400-800字/节,「你」视角
|
||||
- 公众号:`section_expansion_wechat` — 个人叙事对话感,300-500字/节,「我」口吻
|
||||
- 小红书:`section_expansion_xiaohongshu` — 精炼干货,100-200字/节,直接给方法+可 emoji
|
||||
- 去掉公众号中「我们→我→你」的强制替换
|
||||
2. **prompt_loader.py** — 新增 3 个平台独立 section_expansion 提示词,标题提示词去套路化(去除「直接输出」「不要其他文字」等 AI 味指令)
|
||||
3. **平台字数提升** — min/max 大幅上调(知乎 3000-8000, 公众号 2000-4000, 小红书 400-1000),存于 `platform_configs` 表,后台可改
|
||||
4. **compliance_checker.py** — AI 套话从 DB `content_clean_rules(rule_type='ai_telltale')` 加载,后台可动态管理;人称规则去掉「大家」误报
|
||||
5. **config_items.py** — DEFAULT_CONTENT_CLEAN_RULES 新增 30+ 条 ai_telltale 规则
|
||||
6. **initial_data.py** — PlatformConfig 字数迁移(已有库也会更新)
|
||||
7. **AGENTS.md** — 文档化三平台差异化架构
|
||||
|
||||
**验证**:33/33 测试通过
|
||||
|
||||
## 八、GEO/SEO 升级(v20 · 2026-06-09)
|
||||
|
||||
### 为 AI 搜索时代而生
|
||||
|
||||
**背景**:ChatGPT、Perplexity、百度 AI 搜索等生成式引擎正在取代传统搜索。内容被 AI 引用的价值大于单纯的关键词排名。此版本让流水线生产的内容天然符合 AI 搜索偏好。
|
||||
|
||||
### GEO 结构化数据
|
||||
|
||||
每篇生成的 HTML 自动注入:
|
||||
|
||||
- **JSON-LD Article schema** — `@context: schema.org`,含 headline/description/datePublished/author/publisher/keywords
|
||||
- **SEO meta tags** — `<meta name="description">`, `<meta name="keywords">`
|
||||
- **Open Graph tags** — `og:title`, `og:description`, `og:type`, `og:site_name`, `article:published_time`
|
||||
- **平台专用** — wechat/xiaohongshu 额外注入 `og:image`
|
||||
|
||||
### 大纲 SEO 增强
|
||||
|
||||
- outline prompt 新增 `seo_keywords` 变量(从研究笔记自动提取)
|
||||
- 每章要求至少融入 1 个 SEO 关键词
|
||||
- 新增 GEO 要求:每章包含可引用数据点,增加被 AI 搜索引用的概率
|
||||
|
||||
### 搜索排名追踪
|
||||
|
||||
| 模块 | 说明 |
|
||||
|------|------|
|
||||
| `SearchRanking` 模型 | 记录 article_id/keyword/position/url_found/ai_cited/search_engine |
|
||||
| `scripts/rank_tracker.py` | 对所有已发布文章,自动生成搜索查询 → 调用 Bing API 查排名 → 写入 DB |
|
||||
| 定时任务 | `scheduled_rank_tracker` 每日 07:00 自动运行 |
|
||||
| 管理后台 | admin.html 新增「搜索排名」tab,展示概览统计(累计检查/有排名/AI引用/最佳排名)+ 排名列表 |
|
||||
|
||||
### 关键文件
|
||||
|
||||
| 文件 | 改动 |
|
||||
|------|------|
|
||||
| `scripts/writer.py` | 新增 `inject_geo_metadata()`, `_extract_description()`, `_extract_tags_list()` — 在 `generate_platform_html()` 末尾注入 |
|
||||
| `scripts/outline.py` | 新增 `_extract_seo_keywords()` — 传入 outline prompt |
|
||||
| `scripts/prompt_loader.py` | outline_generation 提示词加入 `seo_keywords` 变量 + GEO 数据点要求 |
|
||||
| `scripts/rank_tracker.py` | 新建 — Bing 排名查询 + DB 写入 |
|
||||
| `platform/backend/app/models.py` | 新增 `SearchRanking` 模型 |
|
||||
| `platform/backend/app/api/search_rankings.py` | 新建 — `/api/seo/rankings` + `/api/seo/rankings/overview` |
|
||||
| `platform/backend/app/core/scheduler.py` | 新增 `scheduled_rank_tracker` 07:00 |
|
||||
| `platform/frontend/admin.html` | 新增「搜索排名」tab(统计卡片 + el-table 排名列表) |
|
||||
|
||||
## 九、GEO 进阶升级(v21 · 2026-06-15)
|
||||
|
||||
### AI 搜索引用追踪(GEO Engine Optimization)
|
||||
|
||||
**背景**:v20 实现了搜索排名追踪(Bing)和基础元数据注入,v21 将范围扩展到 AI 搜索引用检测、GEO 就绪度评分、FAQ/HowTo 结构化数据注入。
|
||||
|
||||
### 1. 数据模型扩展
|
||||
|
||||
| 模型 | 字段 | 说明 |
|
||||
|------|------|------|
|
||||
| `SearchRanking` | `ai_search_engine` / `citation_snippet` / `citation_url` / `geo_score` / `content_type` | 原有排名模型新增 AI 搜索字段和内容类型 |
|
||||
| `GeoReadinessScore`(新建) | `article_id/total_score(0-100)/has_schema/has_faq_format/has_howto_format/has_citations/word_count/readability_score/heading_structure_score` | 6 维度 GEO 就绪度评估 |
|
||||
|
||||
就绪度评分权重:结构化数据 30 + FAQ 格式 20 + HowTo 格式 15 + 引用 15 + 标题结构 10 + 内容长度 10 = 100 分
|
||||
|
||||
### 2. AI 搜索引用追踪脚本
|
||||
|
||||
`scripts/geo_tracker.py` — 对所有已发布文章,通过 LLM 模拟查询 DeepSeek/ChatGPT/Perplexity 检测是否被引用:
|
||||
|
||||
- 筛选 `status=published` 的文章提取标题/关键词
|
||||
- 对每篇文章调用 `call_llm` 查询各 AI 引擎是否收录并引用
|
||||
- 记录引用片段(citation_snippet)和引用 URL
|
||||
- 计算 GEO 就绪度评分(6 维度 0-100)
|
||||
- 写入 `SearchRanking(search_engine="geo")` 和 `GeoReadinessScore` 表
|
||||
|
||||
### 3. FAQ/HowTo Schema 自动注入
|
||||
|
||||
扩展 `writer.py` 的 `inject_geo_metadata()`:
|
||||
|
||||
- 新增 `_detect_content_type(content)` — 检测内容类型:article/listicle/howto/faq/review(基于关键词统计)
|
||||
- 新增 `_extract_faq_pairs(content)` — 从 Q:/A:格式提取问答对
|
||||
- 新增 `_extract_howto_steps(content)` — 从步骤/Step 格式提取步骤
|
||||
- 根据检测到的类型自动注入对应的 JSON-LD schema:
|
||||
- **FAQPage** — `mainEntity` 数组(Question + AcceptedAnswer)
|
||||
- **HowTo** — `step` 数组(HowToStep + HowToDirection)
|
||||
- **ItemList** — `itemListElement` 数组(ListItem + position + name)
|
||||
|
||||
### 4. GEO API 端点
|
||||
|
||||
| 端点 | 功能 |
|
||||
|------|------|
|
||||
| `GET /api/seo/geo/overview` | AI 引用总数/引用率/引擎分布/平均就绪度评分 |
|
||||
| `GET /api/seo/geo/readiness` | GEO 就绪度评分列表(含各维度分数) |
|
||||
| `POST /api/seo/geo/track` | 手动触发 GEO 追踪 |
|
||||
|
||||
### 5. 定时任务注册
|
||||
|
||||
`scheduler.py` 新增 `scheduled_geo_tracker` 每日 07:30 自动运行
|
||||
|
||||
### 6. 管理后台 GEO 看板
|
||||
|
||||
admin.html 新增「GEO 就绪度」标签页包含:
|
||||
|
||||
- **统计卡片**:GEO 检查次数 / AI 引用次数 / AI 引用率 / 平均就绪度评分
|
||||
- **引擎分布**:按 AI 引擎(DeepSeek/ChatGPT/Perplexity)展示检查数和引用数
|
||||
- **就绪度评分表格**:文章标题/总分(彩色标签)/结构化数据✓✗/FAQ✓✗/HowTo✓✗/引用✓✗/字数/可读性/标题结构/检查时间
|
||||
- **手动追踪按钮**:`POST /api/seo/geo/track`
|
||||
|
||||
### 关键文件变更
|
||||
|
||||
| 文件 | 改动 |
|
||||
|------|------|
|
||||
| `scripts/geo_tracker.py` | **新建** — AI 搜索引用追踪 + GEO 就绪度评分全流程 |
|
||||
| `scripts/writer.py` | 扩展 `inject_geo_metadata()`:新增 `_detect_content_type`/`_extract_faq_pairs`/`_extract_howto_steps`,根据内容类型自动注入 FAQPage/HowTo/ItemList schema |
|
||||
| `platform/backend/app/models.py` | `SearchRanking` 扩展 5 字段 + 新建 `GeoReadinessScore` 模型 |
|
||||
| `platform/backend/app/api/search_rankings.py` | 新增 3 个 GEO 端点(overview/readiness/track) |
|
||||
| `platform/backend/app/core/scheduler.py` | 注册 `scheduled_geo_tracker` 07:30 |
|
||||
| `platform/frontend/admin.html` | 新增「GEO 就绪度」tab(统计卡片 + 引擎分布 + 评分表格 + 手动追踪) |
|
||||
|
||||
### 验证
|
||||
|
||||
33/33 测试全部通过
|
||||
|
||||
## 十、产品官网改造(v22 · 2026-06-16)
|
||||
|
||||
### 从「管理后台」到「产品网站」
|
||||
|
||||
**背景**:此前项目以登录页面作为首屏,访客第一眼看到的是管理系统的登录框,没有品牌传达和产品介绍。改造后,未登录用户看到的是一个完整的产品官网,登录后进入管理后台(工作台)。
|
||||
|
||||
### 路由架构
|
||||
|
||||
| 路径 | 页面对应 | 访问权限 |
|
||||
|------|---------|---------|
|
||||
| `/` | **产品官网** — 品牌 Landing Page | 公开 |
|
||||
| `/index.html` | **工作台** — 原有的仪表盘(现为 workspace) | 需登录 |
|
||||
| `/login.html` | 登录页(品牌化处理) | 公开 |
|
||||
| `/topics.html`, `/articles.html` 等 | 各管理功能页 | 需登录 |
|
||||
|
||||
### 产品官网(Landing Page)
|
||||
|
||||
创建 `platform/frontend/landing.html` — 独立的完整产品网页,不依赖 Vue/Element Plus:
|
||||
|
||||
- **导航栏**:固定顶部,毛玻璃背景,Logo + 产品功能/工作流程/支持平台/定价/常见问题链接 + 登录/免费使用按钮
|
||||
- **Hero 区域**:大标题「让内容在 AI 时代主动找到你的客户」,背景渐变+辉光效果,三个核心数据展示
|
||||
- **产品功能**:6 张特性卡片(三平台创作/GEO 优化/独立站 SEO/效果追踪/全自动流水线/合规保障)
|
||||
- **工作流程**:3 步流程说明(配置选题→自动生产→追踪优化)
|
||||
- **支持平台**:知乎/微信公众号/小红书/独立站
|
||||
- **定价**:3 档定价(入门版 ¥299/月、专业版 ¥799/月、企业版 ¥2,499/月)
|
||||
- **常见问题**:6 个 FAQ(GEO 说明/三平台差异化/零经验使用/AI 套话/API Key/数据安全)
|
||||
- **CTA 区块**:渐变背景 + 行动号召按钮
|
||||
- **页脚**:产品/支持/法律三栏
|
||||
|
||||
### 关键架构改动
|
||||
|
||||
| 文件 | 改动 |
|
||||
|------|------|
|
||||
| `platform/frontend/landing.html` | **新建** — 完整产品官网(~30KB,无外部依赖) |
|
||||
| `platform/backend/app/main.py` | 新增 `/` 路由显式返回 `landing.html`(优先于 StaticFiles 的默认 index.html) |
|
||||
| `platform/frontend/login.html` | 登录成功跳转 `/` → `/index.html`;已登录检测跳转 `/` → `/index.html` |
|
||||
| `platform/frontend/uni-nav.js` | 仪表盘导航链接 `/` → `/index.html`;`navigate` 函数修复前缀处理 |
|
||||
| `platform/frontend/articles.html` | 未登录重定向 `/` → `/login.html` |
|
||||
| `platform/frontend/topics.html` | 未登录重定向 `/` → `/login.html` |
|
||||
| `platform/frontend/sw.js` | 移除 `/` 预缓存;HTML 文档改为 Network First 策略确保新版实时加载 |
|
||||
|
||||
### 响应式设计
|
||||
|
||||
- **桌面端**(>768px):完整导航 + 多列布局
|
||||
- **平板/手机端**(≤768px):汉堡菜单(侧滑展开)、单列布局、缩小 hero 字体
|
||||
- **小屏手机**(≤480px):全屏宽内容、堆叠布局
|
||||
|
||||
### 验证
|
||||
|
||||
- 33/33 测试全部通过
|
||||
- HTTP 访问验证:`/` 返回 landing.html(31070 bytes),`/index.html` 返回工作台仪表盘
|
||||
- 登录流程验证:登录后跳转 `/index.html`
|
||||
- 服务已重启生效
|
||||
|
||||
## 十一、工作台改造与数据隔离(v23 · 2026-06-17)
|
||||
|
||||
### 从「管理工具」到「内容工作台」
|
||||
|
||||
**背景**:此前平台虽功能完整但偏向管理后台视角,缺乏面向内容创作者的工作台体验;且所有业务数据缺乏组织隔离(org_id),多组织共存时数据混淆。
|
||||
|
||||
### Wave 1 — 数据隔离基础设施
|
||||
|
||||
| 改动 | 文件 |
|
||||
|------|------|
|
||||
| 10 个业务模型追加 `org_id` 列 | `models.py`(User/Topic/ContentCalendar/MediaAsset/ContentTask/Article/PublishRecord/ContentMetrics/SearchRanking/GeoReadinessScore) |
|
||||
| ALTER TABLE 迁移语句 | `database.py`(5 条 `ADD COLUMN IF NOT EXISTS`) |
|
||||
| Schema 追加 `org_id` | `schemas.py`(ArticleBase/ContentCalendarResponse/ContentMetricsResponse/MediaAssetResponse/ContentTaskResponse/PublishRecordResponse) |
|
||||
| JWT 认证追加 org_filter | `auth.py` — `get_current_admin` 返回 `org_id`,新增 `require_role(required_role)` 工厂函数 |
|
||||
| 导航重构为流程导向 5 项 | `uni-nav.js` — 工作台/内容工厂/数据洞察/资产库/系统管理 |
|
||||
|
||||
### Wave 2 — API 隔离 + 新前端页面
|
||||
|
||||
| 改动 | 说明 |
|
||||
|------|------|
|
||||
| `articles.py` | Article 创建 upsert 时从 JWT 自动注入 org_id |
|
||||
| `publishing.py` | PublishRecord 创建时从关联 Topic 继承 org_id |
|
||||
| `metrics.py` | ContentMetrics 创建时继承 Topic.org_id |
|
||||
| `calendar.py` | ContentCalendar CRUD 添加 org_id 校验 |
|
||||
| `tasks.py` | ContentTask 创建时自动注入 org_id |
|
||||
| `search_rankings.py` | GEO 端点添加 org_filter |
|
||||
| `factory.html` | **新建** — 内容工厂流水线页面(3Tab:待创作/进行中/待审查) |
|
||||
| `insights.html` | **新建** — 数据洞察页面(4Tab:内容概览/搜索排名/GEO就绪度/平台对比) |
|
||||
|
||||
### Wave 3 — 仪表盘重设计 + RBAC
|
||||
|
||||
| 改动 | 说明 |
|
||||
|------|------|
|
||||
| `index.html` | 从系统监控仪表盘改为用户中心工作台(欢迎横幅/摘要卡片/今日待办/AI智能建议/管理员模块折叠隐藏) |
|
||||
| `ai-assistant.js` | 新增 factory/insights 页面映射 + 问候语;API 调用带入 org_id |
|
||||
| `require_role` 导入 | 10 个 admin 路由文件(admin/menu_configs/role_configs/system_configs/llm_configs/collector_mgmt/prompt_configs/task_configs/search_providers/config_items)追加 import |
|
||||
|
||||
### Wave 4 — 验证
|
||||
|
||||
- **集成测试**:33/33 通过(Python 编译检查/服务启动/登录/CRUD/权限验证)
|
||||
- **手动 QA**:
|
||||
- `/` → 200(landing.html)
|
||||
- `/index.html` → 200(工作台仪表盘)
|
||||
- `/factory.html` → 200(内容工厂)
|
||||
- `/insights.html` → 200(数据洞察)
|
||||
- 登录正常,auth me 返回 `admin/admin/default`
|
||||
- 未认证访问 401,认证后正常访问
|
||||
- 系统状态 API 正常(41 topics, 22 pending, 2 published)
|
||||
- **Git 提交**:4 个 commit 分 Wave 提交(dcfeccc / 5caf7bc / f6e5e90)
|
||||
|
||||
### 关键架构决策
|
||||
|
||||
- org_id 从 JWT 自动注入,不在客户端提交(防篡改)
|
||||
- 工厂页和数据洞察页新建文件,不改造现有页面
|
||||
- RBAC 使用 `require_role()` 工厂模式,逐步替换 `get_current_admin`
|
||||
- 平台配置(platform_config)为全局共享,不按组织隔离
|
||||
- 数据隔离为 P1 级安全修复,优先于所有其他改造
|
||||
|
||||
### 关键文件变更
|
||||
|
||||
| 文件 | 改动 |
|
||||
|------|------|
|
||||
| `platform/backend/app/models.py` | 10 个模型追加 org_id(941 行)|
|
||||
| `platform/backend/app/database.py` | ALTER TABLE 迁移逻辑(170 行)|
|
||||
| `platform/backend/app/api/auth.py` | org_filter + require_role(196 行)|
|
||||
| `platform/backend/app/schemas.py` | 6 个响应 schema 追加 org_id(637 行)|
|
||||
| `platform/frontend/index.html` | 用户中心仪表盘重设计 |
|
||||
| `platform/frontend/factory.html` | **新建** 内容工厂流水线页 |
|
||||
| `platform/frontend/insights.html` | **新建** 数据洞察页(945 行)|
|
||||
| `platform/frontend/uni-nav.js` | 流程导向导航(333 行)|
|
||||
| `platform/frontend/ai-assistant.js` | 页面映射 + org_id 感知 |
|
||||
| `platform/backend/app/api/*.py` | 10 个路由文件追加 require_role |
|
||||
|
||||
---
|
||||
|
||||
## 十二、规范说明
|
||||
|
||||
### 规划文档
|
||||
|
||||
| 文档 | 位置 | 说明 |
|
||||
|------|------|------|
|
||||
| 升级计划 | `docs/upgrade-plan.md` | 分 4 阶段的技术升级路线图 |
|
||||
|
||||
### 文档管理原则
|
||||
|
||||
1. **单一真理源**:PROGRESS.md 为唯一进度文档,进度信息不出现于第二个文档中。
|
||||
2. **及时归档**:阶段完成后,对应过程文档移入 `archive/`(含日期后缀),避免误导。
|
||||
3. **一致性**:README.md 仅引用 PROGRESS.md 摘要,不独立维护进度状态。
|
||||
4. **可追溯**:archive 保留完整历史,按 `YYYY-MM-DD` 子目录组织。
|
||||
5. **及时更新**:每次新工作结束(或次日开始前)更新 PROGRESS.md,确保最后更新日期与实际同步。
|
||||
|
||||
### 工作流程
|
||||
|
||||
```
|
||||
梳理需求/任务 → 读取 PROGRESS.md 了解当前状态
|
||||
↓
|
||||
按 PROGRESS.md 执行开发
|
||||
↓
|
||||
阶段任务完成 → 更新 PROGRESS.md + 归档冗余文档
|
||||
↓
|
||||
如需 → 同步 README.md 摘要
|
||||
```
|
||||
@@ -1,243 +0,0 @@
|
||||
# 宇之然项目目录结构说明
|
||||
|
||||
## 整体布局
|
||||
|
||||
```
|
||||
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 助手小然
|
||||
@@ -1,141 +0,0 @@
|
||||
# 小红书自动化推广系统(yzr-yxl会话隔离版)
|
||||
|
||||
## 📋 项目概览
|
||||
|
||||
为手机配件京东店铺设计的**小红书自动化内容发布系统**,当前会话完全隔离,不影响其他agent。
|
||||
|
||||
## 🗂️ 目录结构
|
||||
|
||||
```
|
||||
/root/.openclaw/workspaces/yzr-yxl/
|
||||
├── sessions/promoter/ # 🔒 会话隔离存储
|
||||
│ ├── cookies/ # 登录状态
|
||||
│ ├── screenshots/ # 操作截图
|
||||
│ └── logs/ # 运行日志
|
||||
├── scripts/ # 自动化脚本
|
||||
│ ├── xhs-promoter.sh # 基础脚本
|
||||
│ └── xhs-publish-advanced.sh # 高级脚本
|
||||
├── content/ # 内容库
|
||||
│ ├── posts/ # 笔记内容
|
||||
│ └── images/ # 图片素材
|
||||
├── cron/ # 定时任务配置
|
||||
│ └── promoter-schedule.json
|
||||
└── docs/ # 文档
|
||||
└── xhs-setup-guide.md
|
||||
```
|
||||
|
||||
## ✅ 已完成
|
||||
|
||||
1. **环境搭建**
|
||||
- [x] 创建会话隔离目录结构
|
||||
- [x] 验证 agent-browser 可用(v0.23.0)
|
||||
- [x] 验证 Xvfb 支持
|
||||
- [x] 分析小红书登录页结构
|
||||
|
||||
2. **脚本开发**
|
||||
- [x] 基础登录/检查/发布脚本
|
||||
- [x] 高级发布脚本(批量、定时、状态监控)
|
||||
- [x] 示例内容模板(手机配件场景)
|
||||
|
||||
3. **配置文档**
|
||||
- [x] 设置指南(Cookie导入)
|
||||
- [x] 定时任务配置
|
||||
|
||||
## ⏳ 待完成
|
||||
|
||||
1. **登录授权**(需要你的操作)
|
||||
- [ ] 获取小红书Cookie
|
||||
- [ ] 上传到隔离目录
|
||||
- [ ] 验证登录状态
|
||||
|
||||
2. **内容准备**
|
||||
- [ ] 准备产品图片
|
||||
- [ ] 创建真实内容文件
|
||||
- [ ] 测试单篇发布
|
||||
|
||||
3. **自动化测试**
|
||||
- [ ] 测试定时发布
|
||||
- [ ] 监控日志输出
|
||||
- [ ] 调整风控参数
|
||||
|
||||
## 🚀 快速开始
|
||||
|
||||
### 1. 查看当前状态
|
||||
```bash
|
||||
/root/.openclaw/workspaces/yzr-yxl/scripts/xhs-publish-advanced.sh status
|
||||
```
|
||||
|
||||
### 2. 查看帮助
|
||||
```bash
|
||||
/root/.openclaw/workspaces/yzr-yxl/scripts/xhs-publish-advanced.sh help
|
||||
```
|
||||
|
||||
### 3. 创建示例内容
|
||||
```bash
|
||||
/root/.openclaw/workspaces/yzr-yxl/scripts/xhs-publish-advanced.sh sample
|
||||
```
|
||||
|
||||
### 4. 查看示例内容
|
||||
```bash
|
||||
cat /root/.openclaw/workspaces/yzr-yxl/content/posts/sample-post.json
|
||||
```
|
||||
|
||||
## 🔐 登录步骤(关键)
|
||||
|
||||
由于服务器无图形界面,需要**Cookie导入**方式登录:
|
||||
|
||||
### 方式一:浏览器扩展导出(推荐)
|
||||
|
||||
1. 在本地电脑登录 [creator.xiaohongshu.com](https://creator.xiaohongshu.com)
|
||||
2. 安装 [EditThisCookie](https://chrome.google.com/webstore/detail/editthiscookie/) 扩展
|
||||
3. 导出为 JSON 格式
|
||||
4. 保存到服务器的隔离路径:
|
||||
```
|
||||
/root/.openclaw/workspaces/yzr-yxl/sessions/promoter/cookies/xhs-session.json
|
||||
```
|
||||
|
||||
### 方式二:手动复制Cookie
|
||||
|
||||
1. F12打开开发者工具 → Application → Cookies
|
||||
2. 复制关键字段:`session_id`, `web_id`, `gid`, `a1` 等
|
||||
3. 创建JSON文件:
|
||||
```json
|
||||
[
|
||||
{"name": "session_id", "value": "your_value", "domain": ".xiaohongshu.com"},
|
||||
{"name": "web_id", "value": "your_value", "domain": ".xiaohongshu.com"}
|
||||
]
|
||||
```
|
||||
|
||||
## 📊 自动化能力
|
||||
|
||||
| 功能 | 状态 | 说明 |
|
||||
|------|------|------|
|
||||
| 登录状态保持 | ✅ | Cookie隔离存储 |
|
||||
| 单篇发布 | 🧪 | 框架完成,需测试 |
|
||||
| 批量发布 | 🧪 | 支持JSON配置 |
|
||||
| 定时任务 | 🧪 | Cron配置就绪 |
|
||||
| 图片上传 | ⚠️ | 需要进一步开发 |
|
||||
| 评论互动 | ❌ | 需额外开发,风险高 |
|
||||
|
||||
## ⚠️ 风控建议
|
||||
|
||||
1. **发布频率**: 每天1-2条,间隔至少6小时
|
||||
2. **内容去重**: 同一产品换不同角度拍摄
|
||||
3. **账号权重**: 建议养号2周后再开自动化
|
||||
4. **备用策略**: 准备2-3个小号轮换
|
||||
|
||||
## 📝 下一步行动
|
||||
|
||||
需要你来完成:
|
||||
|
||||
1. [ ] **提供Cookie** - 按上述方式获取并上传
|
||||
2. [ ] **准备素材** - 产品图片(建议每个产品5-10张场景图)
|
||||
3. [ ] **测试发布** - 验证自动化流程
|
||||
4. [ ] **启用定时** - 配置正式发布计划
|
||||
|
||||
或者我可以帮你:
|
||||
- 创建更详细的内容模板
|
||||
- 配置知乎/其他平台
|
||||
- 开发评论互动功能(谨慎)
|
||||
|
||||
你想先完成哪一步?
|
||||
@@ -1,156 +1,120 @@
|
||||
# 宇之然内容创作平台
|
||||
|
||||
一个轻量级的管理平台,用于监控和操作内容生产流水线。
|
||||
> 覆盖"选题→创作→审核→发布→数据追踪"全链路的内容运营工具
|
||||
|
||||
## 快速开始
|
||||
|
||||
### 1. 环境准备
|
||||
|
||||
```bash
|
||||
cd /root/.openclaw/workspaces/yzr-yxl/projects/yu-zhi-ran/platform
|
||||
|
||||
# 创建虚拟环境(推荐)
|
||||
backend/venv/bin/python -m venv backend/venv # 若不存在
|
||||
source backend/venv/bin/activate
|
||||
|
||||
# 安装依赖
|
||||
pip install -r backend/requirements.txt
|
||||
```
|
||||
|
||||
### 2. 启动服务
|
||||
|
||||
```bash
|
||||
# 方式一:使用启动脚本(推荐)
|
||||
./run.sh 8000
|
||||
|
||||
# 方式二:手动启动
|
||||
cd backend
|
||||
python -m uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload
|
||||
```
|
||||
|
||||
### 3. 访问
|
||||
|
||||
- **界面**: http://localhost:8000/
|
||||
- **API文档**: http://localhost:8000/docs
|
||||
- **系统状态**: http://localhost:8000/api/system/status
|
||||
|
||||
## 核心功能
|
||||
|
||||
| 功能 | 描述 |
|
||||
|------|------|
|
||||
| 📊 仪表盘 | 选题总数、待发布数、今日生成 |
|
||||
| 🔄 流水线控制 | 触发创作、合规优化、状态监控 |
|
||||
| 📝 选题管理 | 列表、筛选、预览、发布 |
|
||||
| 📦 发布包管理 | 生成多平台HTML发布包、复制 |
|
||||
| 📋 日志查看 | creator/optimizer/collector 日志 |
|
||||
|
||||
## 与自动化流水线的集成
|
||||
|
||||
本平台位于 `platform/`,不修改原有 `automation/scripts/` 脚本。
|
||||
|
||||
**集成方式**:
|
||||
- `backend/app/core/generator.py` 调用 `scripts/creator.py`
|
||||
- `backend/app/core/optimizer.py` 调用 `scripts/compliance_optimizer.py`
|
||||
- `backend/app/api/publisher.py` 调用 `scripts/publisher.py`
|
||||
- 数据存储:`automation/data/` 为唯一数据源
|
||||
- 同步:`sync.py` 将 JSON 选题同步到 SQLite 数据库供前端查询
|
||||
|
||||
**目录结构关系**:
|
||||
|
||||
```
|
||||
yu-zhi-ran/
|
||||
├── platform/ # 管理平台(本目录)
|
||||
│ ├── backend/app/
|
||||
│ │ ├── core/generator.py → 调用 ../scripts/creator.py
|
||||
│ │ ├── core/optimizer.py → 调用 ../scripts/compliance_optimizer.py
|
||||
│ │ └── api/publisher.py → 调用 ../scripts/publisher.py
|
||||
│ └── frontend/index.html # UI
|
||||
├── automation/
|
||||
│ ├── data/ ← 数据源(JSON)
|
||||
│ │ ├── sustainability_topics.json
|
||||
│ │ ├── drafts/
|
||||
│ │ └── releases/
|
||||
│ └── logs/ ← 日志(creator, optimizer, publisher)
|
||||
└── scripts/
|
||||
├── creator.py ← 被调用
|
||||
├── compliance_optimizer.py
|
||||
└── publisher.py
|
||||
```
|
||||
|
||||
## 配置
|
||||
|
||||
环境变量(可选):
|
||||
|
||||
| 变量 | 说明 | 默认 |
|
||||
|------|------|------|
|
||||
| `PROJECT_ROOT` | 项目根目录 | 自动推导 |
|
||||
| `DATA_DIR` | 平台数据库目录 | `platform/data` |
|
||||
| `LOG_LEVEL` | 日志级别 | `INFO` |
|
||||
| `ALLOWED_ORIGINS` | CORS允许的源 | `*` |
|
||||
|
||||
示例:
|
||||
```bash
|
||||
export PROJECT_ROOT=/path/to/yu-zhi-ran
|
||||
./run.sh 8000
|
||||
```
|
||||
|
||||
## 开发调试
|
||||
|
||||
```bash
|
||||
# 检查依赖和环境
|
||||
python check.py
|
||||
|
||||
# 查看 API 日志
|
||||
tail -f automation/logs/creator_$(date +%Y-%m-%d).log
|
||||
|
||||
# 数据库初始化(首次)
|
||||
cd backend
|
||||
python -c "from app.database import init_db; init_db()"
|
||||
|
||||
# 手动同步数据(测试)
|
||||
curl -X POST http://localhost:8000/api/system/sync/run
|
||||
```
|
||||
|
||||
## 故障排查
|
||||
|
||||
| 症状 | 检查点 |
|
||||
|------|--------|
|
||||
| 前端显示无选题 | 1. `automation/data/sustainability_topics.json` 是否存在且包含 `status: \"待处理\"` 的数据<br>2. 点击"全量刷新"按钮 |
|
||||
| 创作任务失败 | 1. 查看 `automation/logs/creator_*.log`<br>2. 确认 `scripts/creator.py` 可执行 |
|
||||
| 发布包为空 | 1. 确认 `automation/data/releases/YYYY-MM-DD/` 下有对应平台的 HTML<br>2. 点击发布Tab → "重新生成" |
|
||||
| 端口8000占用 | 停止其他 uvicorn 进程或 `./run.sh 8080` 改用其他端口 |
|
||||
|
||||
## 部署清单
|
||||
|
||||
- [x] FastAPI 后端(无 Docker,直接运行)
|
||||
- [x] Vue 3 前端(CDN依赖,无需构建)
|
||||
- [x] SQLite 数据库(`platform/data/yzr.db`)
|
||||
- [x] 自动化流水线集成(subprocess 调用)
|
||||
- [x] 数据同步模块(JSON ↔ SQLite)
|
||||
- [x] 流水线状态监控面板
|
||||
- [x] 日志查看功能
|
||||
- [ ] 反向代理(Nginx)配置(如需外网访问)
|
||||
- [ ] HTTPS(Let's Encrypt)
|
||||
- [ ] 系统服务(systemd)
|
||||
|
||||
如需外网访问,建议配置 Nginx 反向代理和 HTTPS。
|
||||
|
||||
## 技术栈
|
||||
|
||||
- **后端**: FastAPI 0.115.0 + Uvicorn
|
||||
- **前端**: Vue 3 + Element Plus
|
||||
- **数据库**: SQLite 3
|
||||
- **脚本**: Python 3 (subprocess)
|
||||
- **样式**: Tailwind CSS (CDN)
|
||||
|
||||
## 文档
|
||||
|
||||
- 详细架构设计: `PORTFOLIO.md`
|
||||
- 使用说明: 本文档
|
||||
- API 文档: http://localhost:8000/docs (运行后)
|
||||
**最后更新: 2026-05-12**
|
||||
|
||||
---
|
||||
|
||||
**版本**: 0.1.0
|
||||
**更新**: 2026-04-19
|
||||
**维护**: 宇之然 AI 助手
|
||||
> **项目进度 → 详见 [PROGRESS.md](PROGRESS.md)**(本文件为唯一进度真理源)
|
||||
|
||||
---
|
||||
|
||||
## 技术栈
|
||||
|
||||
| 层次 | 技术 |
|
||||
|------|------|
|
||||
| 后端 | FastAPI 0.104+ |
|
||||
| ORM | SQLAlchemy 2.0+ |
|
||||
| 数据库 | PostgreSQL 16 |
|
||||
| 前端 | Vue 3 (CDN) + Element Plus |
|
||||
| 认证 | JWT (python-jose) + bcrypt |
|
||||
|
||||
---
|
||||
|
||||
## 数据库配置
|
||||
|
||||
详见 `platform/backend/.env`
|
||||
|
||||
---
|
||||
|
||||
## 启动方式
|
||||
|
||||
```bash
|
||||
cd /root/openclaw-workspace/projects/yu-zhi-ran
|
||||
./start-platform.sh 8001
|
||||
```
|
||||
|
||||
默认管理员: **admin** / **admin123**
|
||||
|
||||
---
|
||||
|
||||
## 页面入口
|
||||
|
||||
| 页面 | 地址 |
|
||||
|------|------|
|
||||
| 仪表盘 | http://localhost:8001/ |
|
||||
| 选题管理 | http://localhost:8001/topics.html |
|
||||
| 内容日历 | http://localhost:8001/calendar.html |
|
||||
| 数据分析 | http://localhost:8001/metrics.html |
|
||||
| 素材库 | http://localhost:8001/assets.html |
|
||||
| 创作任务 | http://localhost:8001/tasks.html |
|
||||
| 平台配置 | http://localhost:8001/platforms.html |
|
||||
| 系统管理 | http://localhost:8001/admin.html |
|
||||
| API 文档 | http://localhost:8001/docs |
|
||||
|
||||
---
|
||||
|
||||
## API 模块
|
||||
|
||||
| 模块 | 文件 | 功能 |
|
||||
|------|------|------|
|
||||
| 认证 | auth.py | 登录/注册/JWT |
|
||||
| 选题 | topics.py | CRUD、评分、批量操作 |
|
||||
| 选题配置 | topic_config.py | 领域/评分字段/状态配置 |
|
||||
| 文章 | articles.py | 文章管理 |
|
||||
| 发布 | publishing.py | 发布记录 |
|
||||
| 内容日历 | calendar.py | 排期、绑定选题 |
|
||||
| 数据分析 | metrics.py | 仪表盘、趋势、推荐 |
|
||||
| 素材库 | assets.py | 上传、标签、搜索 |
|
||||
| 创作任务 | tasks.py | 异步任务、进度管理 |
|
||||
| 平台配置 | platform_config.py | 知乎/微信/小红书 |
|
||||
| 系统管理 | admin.py | 用户/案例/日志/配置 |
|
||||
|
||||
---
|
||||
|
||||
## 数据模型
|
||||
|
||||
- **TopicField** - 领域分类配置
|
||||
- **TopicConfigField** - 选题评分字段
|
||||
- **TopicStatusConfig** - 选题状态配置
|
||||
- **Topic** - 选题主表
|
||||
- **ContentCalendar** - 内容日历
|
||||
- **ContentMetrics** - 数据追踪
|
||||
- **MediaAsset** - 素材库
|
||||
- **PlatformConfig** - 平台配置
|
||||
- **ContentTask** - 创作任务
|
||||
- **User** - 用户
|
||||
- **Case** - 案例库
|
||||
|
||||
---
|
||||
|
||||
## 初始化数据
|
||||
|
||||
- 领域: 6 个(未来工作方式、AI与效率、可持续生活、数字游民、个人成长、科技人文)
|
||||
- 状态: 5 种(待处理、待审查、草稿、待发布、已发布)
|
||||
- 平台: 3 个(知乎、微信公众号、小红书)
|
||||
- 管理员: admin/admin123
|
||||
|
||||
---
|
||||
|
||||
## 项目结构
|
||||
|
||||
```
|
||||
yu-zhi-ran/
|
||||
├── platform/
|
||||
│ ├── backend/
|
||||
│ │ ├── app/
|
||||
│ │ │ ├── api/ # REST API
|
||||
│ │ │ ├── core/ # 业务逻辑
|
||||
│ │ │ ├── models.py # SQLAlchemy 模型
|
||||
│ │ │ ├── schemas.py # Pydantic 验证
|
||||
│ │ │ ├── database.py # 数据库连接
|
||||
│ │ │ ├── main.py # FastAPI 入口
|
||||
│ │ │ └── initial_data.py
|
||||
│ │ └── venv/
|
||||
│ └── frontend/ # Vue + Element Plus SPA
|
||||
├── automation/ # 自动化脚本
|
||||
├── content/ # 内容数据
|
||||
└── scripts/ # 工具脚本
|
||||
```
|
||||
@@ -1,262 +0,0 @@
|
||||
# 宇之然内容管理平台
|
||||
|
||||
> 自动化内容生产 + Web 管理界面
|
||||
|
||||
一个可持续、可管理的内容创业系统,实现从选题采集到多平台发布的全流程自动化。
|
||||
|
||||
---
|
||||
|
||||
## 🎯 核心能力
|
||||
|
||||
- ✅ **全自动流水线**:采集 → 创作 → 合规 → 发布准备(每日凌晨运行)
|
||||
- ✅ **Web 管理界面**:一键控制、实时监控、可视化发布包管理
|
||||
- ✅ **降级策略**:外部源失效时自动切换本地案例库,保证稳定产出
|
||||
- ✅ **多平台支持**:知乎、小红书、微信公众号(HTML 发布包)
|
||||
- ✅ **风控设计**:半自动发布(生成 HTML + 人工复制),避免平台封号
|
||||
|
||||
---
|
||||
|
||||
## 📦 项目结构(简洁版)
|
||||
|
||||
```
|
||||
yu-zhi-ran/
|
||||
├── platform/ # Web 管理平台(FastAPI + Vue 3)
|
||||
│ ├── backend/ # API 服务
|
||||
│ └── frontend/ # 管理界面
|
||||
├── automation/ # 自动化数据 + 日志
|
||||
│ ├── data/ # JSON 选题库、草稿、发布包
|
||||
│ ├── logs/ # 运行日志
|
||||
│ └── scripts/ → ../scripts/ # 软链到 scripts/
|
||||
├── scripts/ # CLI 脚本(collector, creator, optimizer...)
|
||||
├── content/ # 已发布内容存储
|
||||
├── config/ # 配置文件(RSS源、机器人)
|
||||
├── start-platform.sh # 快速启动管理平台
|
||||
└── README_NEW.md # 本文档
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🚀 快速开始
|
||||
|
||||
### 1️⃣ 启动管理平台(推荐)
|
||||
|
||||
```bash
|
||||
cd /root/.openclaw/workspaces/yzr-yxl/projects/yu-zhi-ran
|
||||
./start-platform.sh 8001
|
||||
```
|
||||
|
||||
访问:
|
||||
- 界面:http://localhost:8001/
|
||||
- API 文档:http://localhost:8001/docs
|
||||
|
||||
### 2️⃣ 测试自动化流水线
|
||||
|
||||
```bash
|
||||
cd /root/.openclaw/workspaces/yzr-yxl/projects/yu-zhi-ran
|
||||
python test_full_pipeline.py --topic-id A01
|
||||
```
|
||||
|
||||
预期输出:
|
||||
- 生成 `automation/data/drafts/2026-04-19/A01_*.md`
|
||||
- 生成 `automation/data/releases/2026-04-19/*/A01_*.html`
|
||||
- 合规自动通过
|
||||
|
||||
### 3️⃣ 查看当前状态
|
||||
|
||||
```bash
|
||||
# 选题库统计
|
||||
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\")==\"待发布\")}')"
|
||||
|
||||
# 日志(今日)
|
||||
tail -f automation/logs/creator_$(date +%Y-%m-%d).log
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔄 系统架构
|
||||
|
||||
```
|
||||
定时任务 (cron)
|
||||
│
|
||||
├─▶ 05:00 collector.py → automation/data/sustainability_topics.json(选题)
|
||||
├─▶ 05:30 creator.py → drafts/ + releases/(HTML)
|
||||
├─▶ 05:45 optimizer.py → 合规报告
|
||||
└─▶ 06:00 publisher.py → content/published/(发布包)
|
||||
|
||||
Web 平台(可选控制)
|
||||
│
|
||||
├─▶ 一键触发创作/优化
|
||||
├─▶ 查看选题列表和详情
|
||||
├─▶ 生成发布包、预览HTML、复制
|
||||
└─▶ 查看实时流水线状态
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📊 当前运行状态(2026-04-19)
|
||||
|
||||
| 指标 | 数值 |
|
||||
|------|------|
|
||||
| 总选题数 | 22 |
|
||||
| 待处理 | 20 |
|
||||
| 待发布 | 2 (A01, A02) |
|
||||
| 自动运行 | ✅ 正常(05:00-06:00) |
|
||||
| 最新运行 | A02(05:30 完成,8秒) |
|
||||
| 合规通过率 | 100%(3/3) |
|
||||
|
||||
待发布内容已就绪,可手动发布到知乎/小红书。
|
||||
|
||||
---
|
||||
|
||||
## 🎮 主要操作指南
|
||||
|
||||
### 触发创作任务
|
||||
|
||||
**Web 界面**:平台 → "运行创作任务" 按钮
|
||||
|
||||
**或命令行**:
|
||||
```bash
|
||||
python scripts/creator.py --topic-id A03
|
||||
```
|
||||
|
||||
### 生成发布包
|
||||
|
||||
**Web 界面**:选题 → 发布 → "重新生成"
|
||||
|
||||
**或命令行**:
|
||||
```bash
|
||||
python scripts/publisher.py --topic-id A01
|
||||
```
|
||||
|
||||
发布包位置:
|
||||
```
|
||||
content/published/A01/手动发布/
|
||||
├── 知乎/文章.html
|
||||
└── 小红书/文章.html
|
||||
```
|
||||
|
||||
### 标记为已发布
|
||||
|
||||
在 Web 界面"发布管理"中填写各平台链接 → "确认发布"
|
||||
|
||||
这会更新选题状态为"已发布"并保存链接。
|
||||
|
||||
---
|
||||
|
||||
## ⚙️ 配置
|
||||
|
||||
### 数据源(automation/config/sources.yaml)
|
||||
|
||||
```yaml
|
||||
sources:
|
||||
- name: "新华网-环保频道"
|
||||
type: "rss"
|
||||
url: "http://..."
|
||||
|
||||
- name: "本地案例库"
|
||||
type: "local_markdown"
|
||||
path: "automation/data/cases.md"
|
||||
```
|
||||
|
||||
### 环境变量(platform/.env,可选)
|
||||
|
||||
```bash
|
||||
PROJECT_ROOT=/root/.openclaw/workspaces/yzr-yxl/projects/yu-zhi-ran
|
||||
LOG_LEVEL=INFO
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📝 开发调试
|
||||
|
||||
```bash
|
||||
# 1. 检查环境
|
||||
cd platform
|
||||
python check.py
|
||||
|
||||
# 2. 启动服务(开发模式)
|
||||
./run.sh 8000
|
||||
|
||||
# 3. 查看 API 日志(新终端)
|
||||
tail -f automation/logs/creator_$(date +%Y-%m-%d).log
|
||||
|
||||
# 4. 重置数据库(如需)
|
||||
rm -f data/yzr.db
|
||||
cd platform/backend
|
||||
python -c "from app.database import init_db; init_db(); from app.initial_data import import_topics_from_json; import_topics_from_json()"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🚧 注意事项
|
||||
|
||||
### 路径规范
|
||||
|
||||
所有 `platform/backend/app/**/*.py` 必须使用相对路径计算 `PROJECT_ROOT`:
|
||||
|
||||
- `app/database.py`, `initial_data.py`: `Path(__file__).resolve().parents[3]`
|
||||
- `app/api/*.py`, `app/core/*.py`: `Path(__file__).resolve().parents[4]`
|
||||
|
||||
禁止使用硬编码绝对路径!
|
||||
|
||||
### 软链接
|
||||
|
||||
```
|
||||
platform/data → ../data
|
||||
platform/logs → ../logs
|
||||
automation/scripts → ../scripts/
|
||||
```
|
||||
|
||||
这些链接确保平台和自动化模块共享数据。
|
||||
|
||||
### 数据流向
|
||||
|
||||
**唯一真理源**:`automation/data/sustainability_topics.json`
|
||||
|
||||
- 所有状态更新(待处理 → 待发布 → 已发布)都应写入此 JSON
|
||||
- `platform` 通过 `sync.py` 同步到 SQLite 供前端快速查询
|
||||
- 不要直接修改数据库而不更新 JSON!
|
||||
|
||||
---
|
||||
|
||||
## 📚 详细文档
|
||||
|
||||
- `YUZHIRAN_PLATFORM.md` - 完整项目文档(架构、API、扩展)
|
||||
- `platform/PORTFOLIO.md` - 平台架构详解
|
||||
- `platform/README.md` - 平台使用说明
|
||||
- `PROJECT_STRUCTURE.md` - 目录结构说明
|
||||
|
||||
---
|
||||
|
||||
## 🐛 故障排查
|
||||
|
||||
| 问题 | 检查点 | 命令 |
|
||||
|------|--------|------|
|
||||
| Web 界面无数据 | JSON 是否同步? | `curl http://localhost:8000/api/system/status` |
|
||||
| 创作失败 | creator 日志 | `tail -n 50 automation/logs/creator_*.log` |
|
||||
| 发布包缺失 | releases 目录 | `ls automation/data/releases/$(date +%Y-%m-%d)/` |
|
||||
| 端口占用 | 8000 被谁用? | `lsof -i:8000` |
|
||||
|
||||
---
|
||||
|
||||
## 🎉 现状总结
|
||||
|
||||
昨天(4月18日)完成:
|
||||
- 数据源切换(新华网+人民网)
|
||||
- 降级策略(本地案例库保底)
|
||||
- 锁机制(2小时超时)
|
||||
- publisher 发布包系统
|
||||
- 前端管理界面
|
||||
|
||||
今天(4月19日):
|
||||
- 统一项目结构,整合 platform + automation
|
||||
- 修正所有路径计算
|
||||
- 添加软链接统一数据目录
|
||||
- 创建启动脚本和文档
|
||||
|
||||
**状态**:✅ 系统稳定运行,每日自动产出内容,Web 平台就绪。
|
||||
|
||||
---
|
||||
|
||||
**维护**: AI 助手小然
|
||||
**更新**: 2026-04-19
|
||||
@@ -1,285 +0,0 @@
|
||||
# 宇之然内容管理平台 - 完整项目文档
|
||||
|
||||
## 📦 项目概览
|
||||
|
||||
宇之然内容管理平台是一个集**自动化流水线**与**Web管理界面**于一体的内容生产系统。
|
||||
|
||||
- **自动化模块**: 采集→创作→优化→发布的全自动脚本
|
||||
- **管理平台**: Web UI 监控、控制、发布包管理
|
||||
- **数据源**: 单一 JSON 文件 + 本地案例库
|
||||
- **目标**: 每日自动生成高质量原创内容,多平台分发
|
||||
|
||||
## 🏗️ 目录结构
|
||||
|
||||
```
|
||||
yu-zhi-ran/
|
||||
├── platform/ # 管理平台(FastAPI + Vue 3)
|
||||
│ ├── backend/ # FastAPI 后端
|
||||
│ │ └── app/
|
||||
│ │ ├── api/ # REST API
|
||||
│ │ │ ├── system.py # 系统状态、流水线控制
|
||||
│ │ │ ├── topics.py # 选题管理
|
||||
│ │ │ ├── publisher.py # 发布包管理
|
||||
│ │ │ └── articles.py
|
||||
│ │ └── core/ # 业务逻辑封装
|
||||
│ │ ├── generator.py → 调用 scripts/creator.py
|
||||
│ │ ├── optimizer.py → 调用 scripts/compliance_optimizer.py
|
||||
│ │ └── sync.py → 同步 automation/data/*.json
|
||||
│ └── frontend/ # Vue 3 前端(CDN依赖)
|
||||
│ └── index.html
|
||||
├── automation/ # 自动化流水线(脚本+数据+日志)
|
||||
│ ├── scripts/ (软链) → ../scripts/
|
||||
│ ├── data/ # JSON 数据源
|
||||
│ │ ├── sustainability_topics.json # 选题库
|
||||
│ │ ├── drafts/ # 草稿目录
|
||||
│ │ └── releases/ # 发布包(按日期)
|
||||
│ └── logs/ # 运行日志
|
||||
│ ├── collector_*.log
|
||||
│ ├── creator_*.log
|
||||
│ ├── optimizer_*.log
|
||||
│ └── publisher_*.log
|
||||
├── scripts/ # 底层CLI脚本(被automation/scripts/引用)
|
||||
│ ├── collector.py # 采集热点
|
||||
│ ├── creator.py # 内容创作
|
||||
│ ├── compliance_optimizer.py # 合规优化
|
||||
│ ├── publisher.py # 发布包生成
|
||||
│ ├── research.py # 研究资料
|
||||
│ ├── outline.py # 大纲生成
|
||||
│ └── writer.py # 撰写主力
|
||||
├── content/ # 已发布内容存储
|
||||
│ ├── published/ # 按 topic_id 组织
|
||||
│ ├── drafts/ # 草稿
|
||||
│ ├── ideas/ # 选题记录
|
||||
│ └── images/ # 配图资源
|
||||
├── config/ # 配置文件
|
||||
│ ├── sources.yaml # RSS/网页源配置
|
||||
│ └── wecom_config.yaml # 企业微信通知
|
||||
├── brand/ # 品牌资产
|
||||
│ ├── brand-book.md
|
||||
│ └── guidelines.md
|
||||
├── research/ # 行业研究
|
||||
│ └── trends-2026.md
|
||||
├── strategy/ # 内容策略
|
||||
│ └── 全球-本土比较研究与全新内容战略规划-2026-04-15.md
|
||||
├── tasks/ # 项目管理
|
||||
│ └── todo.md
|
||||
├── logs/ # 根目录日志(兼容)
|
||||
├── backup/ # 备份归档
|
||||
├── README.md # 项目总览
|
||||
├── TEST_FULL_PIPELINE.md # 测试指南
|
||||
└── run_publisher.sh # 快速启动发布任务
|
||||
|
||||
# 软链接(保持路径兼容)
|
||||
automation/scripts → ../scripts/
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🚀 快速开始
|
||||
|
||||
### 方式一:直接运行自动化流水线(CLI)
|
||||
|
||||
```bash
|
||||
cd /root/.openclaw/workspaces/yzr-yxl/projects/yu-zhi-ran
|
||||
|
||||
# 手动执行各步骤
|
||||
python scripts/collector.py # 采集选题
|
||||
python scripts/creator.py # 创作内容
|
||||
python scripts/compliance_optimizer.py # 合规优化
|
||||
python scripts/publisher.py # 生成发布包
|
||||
|
||||
# 或使用测试脚本
|
||||
python test_full_pipeline.py --topic-id A01
|
||||
```
|
||||
|
||||
### 方式二:启动 Web 管理平台
|
||||
|
||||
```bash
|
||||
cd platform
|
||||
./run.sh 8001
|
||||
|
||||
# 访问
|
||||
# - 界面: http://localhost:8001/
|
||||
# - API文档: http://localhost:8001/docs
|
||||
```
|
||||
|
||||
**功能**:
|
||||
- 📊 仪表盘:选题统计、今日生成
|
||||
- 🔄 控制台:一键触发 collector/creator/optimizer
|
||||
- 📝 选题管理:列表、预览、状态
|
||||
- 📦 发布管理:生成发布包、查看HTML、复制
|
||||
- 📋 日志查看:所有模块实时日志
|
||||
|
||||
### 方式三:定时自动运行(cron)
|
||||
|
||||
```bash
|
||||
# 编辑 crontab
|
||||
crontab -e
|
||||
|
||||
# 添加以下任务(参考)
|
||||
0 5 * * * cd /path/to/yu-zhi-ran && python automation/scripts/collector.py
|
||||
30 5 * * * cd /path/to/yu-zhi-ran && python automation/scripts/creator.py
|
||||
45 5 * * * cd /path/to/yu-zhi-ran && python automation/scripts/compliance_optimizer.py
|
||||
0 6 * * * cd /path/to/yu-zhi-ran && python automation/scripts/publisher.py
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔄 系统架构
|
||||
|
||||
### 数据流
|
||||
|
||||
```
|
||||
┌─────────────────┐
|
||||
│ 采集/创作/优化 │ ←─ automation/scripts/*.py
|
||||
│ (CLI 脚本) │
|
||||
└────────┬────────┘
|
||||
│ 读写 JSON
|
||||
▼
|
||||
┌─────────────────┐
|
||||
│ automation/data │
|
||||
│ sustainability_ │
|
||||
│ topics.json │
|
||||
└────────┬────────┘
|
||||
│ 同步
|
||||
▼
|
||||
┌─────────────────┐
|
||||
│ platform/ │
|
||||
│ FastAPI + │
|
||||
│ SQLite DB │
|
||||
└────────┬────────┘
|
||||
│ HTTP API
|
||||
▼
|
||||
┌─────────────────┐
|
||||
│ Web 前端 │
|
||||
│ (Vue 3) │
|
||||
└─────────────────┘
|
||||
```
|
||||
|
||||
### 触发流程
|
||||
|
||||
| 操作 | API端点 | 执行脚本 | 结果 |
|
||||
|------|---------|----------|------|
|
||||
| 点击"运行创作任务" | POST `/api/system/generate/run` | `scripts/creator.py` | 生成草稿 → 状态: 待审查 |
|
||||
| 点击"运行合规优化" | POST `/api/system/optimize/run` | `scripts/compliance_optimizer.py` | 全自动通过 → 状态: 待发布 |
|
||||
| 点击"生成发布包" | POST `/api/publisher/generate/{id}` | `scripts/publisher.py` | HTML包 → content/published/ |
|
||||
| 页面刷新 | GET `/api/system/status` | - | 显示最新状态 |
|
||||
|
||||
---
|
||||
|
||||
## 📊 当前状态(2026-04-19)
|
||||
|
||||
- **选题库**: 22 个(20 待处理 + 2 待发布)
|
||||
- **自动运行**: ✅ 每日 05:00-06:00 全流程
|
||||
- **上次运行**: 2026-04-19 05:30(A02 选题,8秒完成)
|
||||
- **合规通过率**: 100%(小样本)
|
||||
- **发布包**: A01、A02 已就绪(知乎+小红书)
|
||||
|
||||
查看详细日志:
|
||||
```bash
|
||||
tail -f automation/logs/creator_$(date +%Y-%m-%d).log
|
||||
tail -f automation/logs/publisher_$(date +%Y-%m-%d).log
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔧 开发调试
|
||||
|
||||
### 检查环境
|
||||
```bash
|
||||
cd platform
|
||||
python check.py
|
||||
```
|
||||
|
||||
### 手动测试流水线
|
||||
```bash
|
||||
python test_full_pipeline.py --topic-id A05
|
||||
```
|
||||
|
||||
### API 测试
|
||||
```bash
|
||||
# 系统状态
|
||||
curl http://localhost:8000/api/system/status
|
||||
|
||||
# 触发创作
|
||||
curl -X POST http://localhost:8000/api/system/generate/run
|
||||
|
||||
# 流水线状态
|
||||
curl http://localhost:8000/api/system/pipeline/status
|
||||
```
|
||||
|
||||
### 数据库重置
|
||||
```bash
|
||||
cd platform/backend
|
||||
rm -f data/yzr.db
|
||||
python -c "from app.database import init_db; init_db()"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📝 配置说明
|
||||
|
||||
### automation/config/sources.yaml
|
||||
|
||||
配置外部信息源(RSS/网页):
|
||||
|
||||
```yaml
|
||||
sources:
|
||||
- name: "新华网-环保频道"
|
||||
type: "rss"
|
||||
url: "http://www.news.cn/..."
|
||||
focus: "可持续性"
|
||||
|
||||
- name: "人民网-生态环境"
|
||||
type: "rss"
|
||||
url: "http://env.people.com.cn/..."
|
||||
focus: "环保政策"
|
||||
```
|
||||
|
||||
### platform/.env (可选)
|
||||
|
||||
```bash
|
||||
PROJECT_ROOT=/path/to/yu-zhi-ran
|
||||
DATA_DIR=/path/to/data
|
||||
LOG_LEVEL=INFO
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎯 核心特性
|
||||
|
||||
| 特性 | 实现 |
|
||||
|------|------|
|
||||
| **降级策略** | 外部源失败 → 本地数据库 → Markdown案例库 |
|
||||
| **锁机制** | 2小时超时,防止并发冲突 |
|
||||
| **状态同步** | JSON ↔ SQLite 自动同步 |
|
||||
| **发布准备** | 生成多平台HTML + 发布指南,人工发布(风控) |
|
||||
| **Web管理** | Vue 3 单页应用,无需构建 |
|
||||
| **日志聚合** | 所有模块日志按日期归档 |
|
||||
|
||||
---
|
||||
|
||||
## 🚧 待办事项
|
||||
|
||||
- [ ] 添加用户认证(目前仅本地访问)
|
||||
- [ ] 实现异步任务状态轮询(创作/优化耗时较长)
|
||||
- [ ] Nginx 反向代理配置(外网访问)
|
||||
- [ ] 监控告警(失败通知)
|
||||
- [ ] 多账号/IP策略(小红书多号分散风险)
|
||||
- [ ] 数据导出功能(选题库、发布记录)
|
||||
|
||||
---
|
||||
|
||||
## 📚 相关文档
|
||||
|
||||
- `platform/PORTFOLIO.md` - 平台架构详解
|
||||
- `platform/README.md` - 管理平台使用说明
|
||||
- `PROJECT_PLAN_V2.md` - 盈利模式与5平台矩阵
|
||||
- `HERMES_AND_YUZHRAN_STATUS.md` - 多Agent共享状态
|
||||
- `2026-04-18-YUZHRAN-FIXES-SUMMARY.md` - 技术修复总结
|
||||
|
||||
---
|
||||
|
||||
**版本**: 2.0 (2026-04-19)
|
||||
**维护**: 宇之然 AI 助手
|
||||
**最后更新**: 2026-04-19
|
||||
@@ -0,0 +1,331 @@
|
||||
# 宇之然工作台改造方案 — 极简实用 AI Agent 时代设计
|
||||
|
||||
> 调研日期: 2026-06-16
|
||||
> 基于 2026 年 AI 产品设计趋势 + 现有工作台全面审计
|
||||
|
||||
---
|
||||
|
||||
## 一、现有工作台问题分析
|
||||
|
||||
### 1.1 当前页面结构
|
||||
|
||||
| 页面 | 定位 | 问题 |
|
||||
|------|------|------|
|
||||
| `/index.html` 仪表盘 | 系统概览 + 模块状态 + 近期计划 | **系统视角**,不是用户视角。6 张统计卡片 + 6 个定时模块卡片 + 调度状态 → 像运维面板,不像创作工作台 |
|
||||
| `topics.html` 选题 | 选题表格 CRUD + 批量操作 | 功能完整但无聊。没有 AI 辅助选题推荐,没有智能排序 |
|
||||
| `metrics.html` 数据 | 统计看板 + 图表 | 功能 OK,但与 GEO/搜索排名/合规数据分离在不同页面 |
|
||||
| `calendar.html` 日历 | 内容日历 | 独立页面,与选题/数据割裂 |
|
||||
| `tasks.html` 任务 | 流水线执行记录 | 展示后端调度状态,普通用户看不懂 |
|
||||
| `admin.html` 系统管理 | 13 个 Tab 的后台 | 混入了业务功能(AI助手、搜索排名、GEO) |
|
||||
| `assets.html` 素材 | 素材管理 | 基础功能 |
|
||||
| `landing.html` 官网 | 产品官网 | ✅ 独立、清晰 |
|
||||
|
||||
### 1.2 核心问题
|
||||
|
||||
1. **仪表盘是「系统监控」不是「创作工作台」**
|
||||
- 一进来看到的是定时任务状态(热点趋势/采集/创作/审查),不是「我今天要做什么」
|
||||
- 缺少任务优先级、待办提醒、进度概览
|
||||
- 对于内容编辑来说,模块卡片(scheduler 状态)毫无意义
|
||||
|
||||
2. **导航/信息架构是「功能菜单」不是「创作流程」**
|
||||
- 六个平级菜单项:仪表盘、选题、数据、日历、素材、任务
|
||||
- 没有工作流意识 — 用户需要在多个页面跳转来完成一个创作流程
|
||||
- 缺少「最近工作」「快速开始」等具有上下文感的入口
|
||||
|
||||
3. **AI 能力是「附加功能」不是「内嵌体验」**
|
||||
- AI 助手是右下角浮窗 chatbot,与工作流分离
|
||||
- AI 选题分析在选题页弹窗里,AI 写文章在发布流程里
|
||||
- 没有 Agent 工作区 — 没有一个地方能看到 AI 正在做什么、做了什么、需要什么审批
|
||||
|
||||
4. **权限与功能混杂**
|
||||
- 业务功能(搜索排名、GEO 优化、AI 助手)锁在 admin.html 里
|
||||
- 普通用户使用需要切换到「系统管理」—— 概念上就不对
|
||||
|
||||
5. **缺少「Agent 时代」的核心交互模式**
|
||||
- ❌ 没有 Plan-first(先展示计划,再执行)
|
||||
- ❌ 没有 AI 操作轨迹/审计
|
||||
- ❌ 没有任务编排/Agent 工作区
|
||||
- ❌ 没有智能建议/预测
|
||||
- ✅ 但已经有一个基础的 AI 助手浮窗底座
|
||||
|
||||
---
|
||||
|
||||
## 二、2026 AI 产品设计趋势映射
|
||||
|
||||
### 从 7 个趋势看我们应该做什么
|
||||
|
||||
| # | 趋势 | 对我们意味着什么 |
|
||||
|---|------|----------------|
|
||||
| 1 | **UX → AX (Agentic Experience)** | 工作台需要展示 AI 的**行动计划**和**执行轨迹**,而不是单纯的界面操作 |
|
||||
| 2 | **Plan-first 交互** | 选题→创作→发布 应该有一个**流程预览**步骤,AI 先展示「我将做 A→B→C」,用户确认后再执行 |
|
||||
| 3 | **Invisible AI (嵌入式 AI)** | AI 不应该是右下角聊天窗,而应该嵌入到选题列表(智能排序)、文章编辑(实时优化建议)、日历(智能排期)|
|
||||
| 4 | **Delegation with Control** | 用户需要看到一个「代理仪表盘」— AI 正在做什么、已完成什么、需要审批什么 |
|
||||
| 5 | **Workspace over Chat** | 从「跟 AI 对话」到「AI 作为团队成员在共享空间工作」|
|
||||
| 6 | **预览→差异→确认 模式** | 所有 AI 生成/修改的内容,先展示 diff/预览,再确认写入 |
|
||||
| 7 | **审批路径和可逆性** | 每一步操作都有 undo 路径和操作历史 |
|
||||
|
||||
---
|
||||
|
||||
## 三、改造方案设计
|
||||
|
||||
### 3.1 总体信息架构重构
|
||||
|
||||
```
|
||||
当前: 目标:
|
||||
┌──────────┐ ┌──────────────────┐
|
||||
│ 仪表盘 │ ← 系统视角 │ 工作台 (首页) │ ← 用户视角
|
||||
│ 选题 │ │ ├─ 今日待办 │
|
||||
│ 数据 │ │ ├─ 创作流水线 │
|
||||
│ 日历 │ │ ├─ 智能建议 │
|
||||
│ 素材 │ │ └─ 最近工作 │
|
||||
│ 任务 │ ├──────────────────┤
|
||||
│ 系统管理 │ │ 内容工厂 │ ← 创作流程
|
||||
└──────────┘ │ ├─ 选题工作区 │
|
||||
│ ├─ AI 创作工作区 │
|
||||
│ ├─ 发布工作区 │
|
||||
│ └─ 内容日历 │
|
||||
├──────────────────┤
|
||||
│ 数据洞察 │ ← 效果分析
|
||||
│ ├─ 数据看板 │
|
||||
│ ├─ 搜索排名 │
|
||||
│ ├─ GEO 就绪度 │
|
||||
│ └─ 合规报告 │
|
||||
├──────────────────┤
|
||||
│ 资产库 │ ← 资源管理
|
||||
├──────────────────┤
|
||||
│ 系统管理 (admin) │ ← 仅管理员
|
||||
```
|
||||
|
||||
### 3.2 工作台首页(全新设计)
|
||||
|
||||
**目标**:一打开就知道今天要做什么、进度如何、有什么需要关注
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────┐
|
||||
│ ☀️ 早上好,张三 你的团队本周已发布 3 篇内容 │
|
||||
├─────────────────────────────────────────────────┤
|
||||
│ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ │
|
||||
│ │ 待处理│ │ 待审查│ │ 待发布│ │ 本月 │ │ 合规 │ │
|
||||
│ │ 选题 │ │ 文章 │ │ 内容 │ │ 目标 │ │ 健康 │ │
|
||||
│ │ 12 │ │ 5 │ │ 3 │ │ 67% │ │ 94% │ │
|
||||
│ └──────┘ └──────┘ └──────┘ └──────┘ └──────┘ │
|
||||
├─────────────────────────────────────────────────┤
|
||||
│ 📋 今日待办 │
|
||||
│ ┌─────────────────────────────────────────────┐ │
|
||||
│ │ 🔴 审查「远程办公的 5 个陷阱」- 逾期 2 天 │ │
|
||||
│ │ 🟡 审核「AI 写作工具实测」- AI 已完稿 │ │
|
||||
│ │ 🔵 确认本周排期 - 3 篇待定稿 │ │
|
||||
│ └─────────────────────────────────────────────┘ │
|
||||
├─────────────────────────────────────────────────┤
|
||||
│ 🤖 AI Agent 工作区 │
|
||||
│ ┌─────────────────────────────────────────────┐ │
|
||||
│ │ 📡 热点采集 ✅ 完成 (12 条新趋势) │ │
|
||||
│ │ ✍️ 文章创作 ⏳ 进行中 (2/5 篇) │ │
|
||||
│ │ 🔍 合规审查 ⏳ 排队中 (3 篇待审) │ │
|
||||
│ │ 📊 数据同步 ⏰ 06:00 自动运行 │ │
|
||||
│ │ │ │
|
||||
│ │ [查看 Agent 轨迹 →] │ │
|
||||
│ └─────────────────────────────────────────────┘ │
|
||||
├─────────────────────────────────────────────────┤
|
||||
│ 💡 AI 智能建议 │
|
||||
│ ┌─────────────────────────────────────────────┐ │
|
||||
│ │ 💡 「碳中和」关键词本周搜索量 ↑47% │ │
|
||||
│ │ 建议创建一篇相关选题 │ │
|
||||
│ │ [一键创建选题 →] │ │
|
||||
│ │ 💡 你的知乎上周互动率 ↑12% │ │
|
||||
│ │ 建议继续保持数据分析深度 │ │
|
||||
│ └─────────────────────────────────────────────┘ │
|
||||
├─────────────────────────────────────────────────┤
|
||||
│ 📅 近期计划 │
|
||||
│ ┌──────────┬──────────────────┬──────────┐ │
|
||||
│ │ 06/17 二 │ 远程办公工具对比 │ 知乎发布 │ │
|
||||
│ │ 06/18 三 │ AI 写作体验 │ 公众号 │ │
|
||||
│ │ 06/19 四 │ 零浪费生活指南 │ 小红书 │ │
|
||||
│ └──────────┴──────────────────┴──────────┘ │
|
||||
└─────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### 3.3 内容工厂(创作流水线重构)
|
||||
|
||||
**目标**:按创作流程组织,而不是按数据表组织
|
||||
|
||||
#### 选题工作区
|
||||
- **AI 智能选题板**:热点趋势 + 关键词热度 + 历史数据 → 推荐选题
|
||||
- **选题看板**:Kanban 视图(待处理→分析中→已评分→待创作)
|
||||
- **批量操作**:AI 一键分析 → 自动评分 → 自动排序
|
||||
- **卡片预览**:题目的核心观点、受众痛点、差异化切入点和评分一览
|
||||
|
||||
#### AI 创作工作区 (NEW)
|
||||
- **创作任务面板**:显示所有进行中的 AI 创作任务
|
||||
- **Plan-first 流程**:用户选择选题 → AI 展示大纲 → 用户确认 → AI 逐节写作
|
||||
```
|
||||
步骤 1: 选择选题 + 平台
|
||||
步骤 2: AI 生成大纲 (展示预览)
|
||||
步骤 3: 用户调整大纲 (拖拽排序/编辑)
|
||||
步骤 4: AI 逐节写作 (进度条展示)
|
||||
步骤 5: 合规审查 (展示问题列表)
|
||||
步骤 6: 用户最终编辑
|
||||
```
|
||||
- **Agent 执行轨迹**:每次 AI 操作都有时间线记录
|
||||
- **在线编辑器**:统一的富文本编辑器,支持实时 AI 优化建议
|
||||
|
||||
#### 发布工作区
|
||||
- **发布检查清单**:AI 自动检查合规、字数、配图、格式
|
||||
- **一键多平台发布**:选题→三平台各自适配→预览→确认发布
|
||||
- **发布历史**:时间线视图
|
||||
|
||||
### 3.4 AI Agent 工作区(新概念页面)
|
||||
|
||||
**这是本次改造的核心创新亮点** — 一个展示 AI 作为「团队成员」工作状况的看板。
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────┐
|
||||
│ 🤖 AI Agent 工作区 │
|
||||
├─────────────────────────────────────────────────┤
|
||||
│ 🔴 活跃任务 │
|
||||
│ ┌─────────────────────────────────────────────┐ │
|
||||
│ │ ✍️ 正在创作「远程办公的 5 个陷阱」→ 知乎版 │ │
|
||||
│ │ 进度: ████████░░ 78% │ │
|
||||
│ │ 当前步骤: 撰写第 3 节「团队协作挑战」 │ │
|
||||
│ │ [预览] [暂停] [取消] │ │
|
||||
│ │ │ │
|
||||
│ │ 🔍 正在审查「AI 写作工具实测」- 小红书版 │ │
|
||||
│ │ 进度: ████░░░░░░ 35% │ │
|
||||
│ │ 发现 2 个合规问题 │ │
|
||||
│ │ [查看详情] │ │
|
||||
│ └─────────────────────────────────────────────┘ │
|
||||
├─────────────────────────────────────────────────┤
|
||||
│ ⏳ 待审批 │
|
||||
│ ┌─────────────────────────────────────────────┐ │
|
||||
│ │ 📝 大纲待确认 「零浪费生活指南」 │ │
|
||||
│ │ 已由 AI 自动生成,等待你审核 │ │
|
||||
│ │ [查看大纲] [确认] [修改] │ │
|
||||
│ │ │ │
|
||||
│ │ 📄 文章待审 「碳中和入门」已完稿 │ │
|
||||
│ │ 合规评分 92/100,2 条建议 │ │
|
||||
│ │ [审阅] [通过] [退回修改] │ │
|
||||
│ └─────────────────────────────────────────────┘ │
|
||||
├─────────────────────────────────────────────────┤
|
||||
│ ✅ 今日已完成 │
|
||||
│ ┌─────────────────────────────────────────────┐ │
|
||||
│ │ ✅ 采集热点 12 条 → 生成 3 个新选题 │ │
|
||||
│ │ ✅ 同步数据指标 → 知乎互动率 +12% │ │
|
||||
│ └─────────────────────────────────────────────┘ │
|
||||
└─────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### 3.5 数据洞察(统一分析中心)
|
||||
|
||||
将当前分散的数据功能整合:
|
||||
|
||||
| Tab | 功能 | 来源 |
|
||||
|-----|------|------|
|
||||
| 概览 | 总指标 + 趋势图 | 现有 metrics.html |
|
||||
| 搜索排名 | 关键词排名追踪 | 现 admin.html 搜索排名 |
|
||||
| GEO 就绪度 | AI 搜索优化评分 | 现 admin.html GEO |
|
||||
| 合规报告 | 发布前合规检查历史 | 现 admin.html + 优化报告 |
|
||||
| 平台对比 | 知乎/公众号/小红书数据 | 现有 metrics.html |
|
||||
|
||||
### 3.6 导航改造
|
||||
|
||||
```javascript
|
||||
// 现有 navItems (硬编码):
|
||||
[{dashboard, topics, metrics, calendar, assets, tasks}]
|
||||
// admin 额外: [admin]
|
||||
|
||||
// 目标 navItems (按角色动态):
|
||||
// 编辑:
|
||||
[{工作台(top), 内容工厂(factory), 数据洞察(insights), 资产库(assets)}]
|
||||
// 管理员:
|
||||
内容工厂 + 数据洞察 + 资产库 + 系统管理(admin)
|
||||
```
|
||||
|
||||
导航从「功能清单」变成「流程引导」:
|
||||
- **工作台** = 首页(今日待办 + Agent 状态 + 智能建议)
|
||||
- **内容工厂** = 创作全流程(选题→创作→发布→日历)
|
||||
- **数据洞察** = 所有数据分析入口
|
||||
- **资产库** = 素材管理
|
||||
|
||||
### 3.7 移动端适配
|
||||
|
||||
当前移动端只是隐藏表格换卡片,改造后:
|
||||
- 底部 Tab 导航栏(代替顶部汉堡菜单)
|
||||
- 工作台首页简化为:今日待办 + Agent 状态 + 快速操作按钮
|
||||
- 内容工厂:简易 Kanban,手势左右切换阶段
|
||||
- AI Agent: 推送通知代替实时面板
|
||||
|
||||
---
|
||||
|
||||
## 四、实施优先级
|
||||
|
||||
### P0 — 快速见效 (1-2 天)
|
||||
这些改动小但体验提升大:
|
||||
|
||||
| 改动 | 文件 | 工作量 |
|
||||
|------|------|--------|
|
||||
| 仪表盘改为用户视角(统计卡片 = 待办数量而不是系统模块) | `index.html` | 半天 |
|
||||
| 将 AI 助手从浮窗升级为半屏面板 | `ai-assistant.js` | 半天 |
|
||||
| 导航改为新架构(工作台/内容工厂/数据洞察/资产库) | `uni-nav.js` | 半天 |
|
||||
|
||||
### P1 — 核心重构 (3-5 天)
|
||||
| 改动 | 涉及 | 工作量 |
|
||||
|------|------|--------|
|
||||
| 内容工厂页面(创作流水线) | 新建 `factory.html` | 2 天 |
|
||||
| AI Agent 工作区 | 新建 `agent.html` | 2 天 |
|
||||
| 数据洞察整合(合并 GEO/搜索排名) | 改造 `metrics.html` | 1 天 |
|
||||
|
||||
### P2 — 增强功能 (5-7 天)
|
||||
| 改动 | 工作量 |
|
||||
|------|--------|
|
||||
| Plan-first 创作流程(大纲预览→确认→执行) | 3 天 |
|
||||
| Agent 执行轨迹/审计时间线 | 2 天 |
|
||||
| 智能选题推荐面板 | 2 天 |
|
||||
| 移动端全面适配 | 2 天 |
|
||||
|
||||
### P3 — AI 原生体验 (后续)
|
||||
| 改动 | 工作量 |
|
||||
|------|--------|
|
||||
| 智能排期 / 内容策略建议 | 3 天 |
|
||||
| 自动化工作流编排(拖拽编排 Agent 任务) | 5 天 |
|
||||
| 多 Agent 协作(采集 Agent + 写作 Agent + 审查 Agent) | 5 天 |
|
||||
|
||||
---
|
||||
|
||||
## 五、关键设计原则
|
||||
|
||||
1. **用户视角 > 系统视角**
|
||||
- 展示「我今天要做什么」而不是「系统正在运行什么」
|
||||
- 统计数字 = 行动信号(待办数量)而不是监控指标
|
||||
|
||||
2. **流程 > 功能**
|
||||
- 按创作流程组织页面(选题→创作→发布→分析)
|
||||
- 不在功能之间跳转,在流程中前进
|
||||
|
||||
3. **AI 是团队成员,不是工具**
|
||||
- 展示 AI 的工作计划、进度、产出
|
||||
- 用户是「审核者/决策者」而不是「操作者」
|
||||
- 核心模式:用 AI → AI 执行 Plan → 用户审核/批准
|
||||
|
||||
4. **预览→确认→执行**
|
||||
- AI 生成的所有内容:先预览/展示差异,再确认
|
||||
- 所有操作可逆,有撤销路径
|
||||
|
||||
5. **极简不极简功能**
|
||||
- 减少平级菜单数量和页面复杂
|
||||
- 不减少功能 — 用上下文和流程引导代替功能罗列
|
||||
|
||||
---
|
||||
|
||||
## 六、与当前改造项目的关系
|
||||
|
||||
本次工作台改造与正在进行的数据隔离/权限升级是 **互补关系**:
|
||||
|
||||
| 改造线 | 范围 | 依赖 |
|
||||
|--------|------|------|
|
||||
| **数据隔离+权限** (当前进行中) | 后端架构、数据安全 | 无 |
|
||||
| **工作台极简改造** (本方案) | 前端 UI/UX、信息架构 | 权限系统就绪后可基于角色定制页面 |
|
||||
|
||||
建议:
|
||||
1. 先完成数据隔离和权限基础 — 这是安全基石
|
||||
2. 工作台改造可以在权限未完全就绪时就开始前端改造(不依赖后端)
|
||||
3. 导航的 role-based 显示可以利用现有的 `/api/menus/active` 接口
|
||||
@@ -1,24 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
在 Markdown 的 H2 标题前插入分隔线,第一个除外
|
||||
"""
|
||||
|
||||
MD_PATH = "/root/.openclaw/workspaces/yzr-yxl/projects/yu-zhi-ran/content/published/2026-04-14-上海阳台种菜一年/final-article.md"
|
||||
|
||||
with open(MD_PATH, "r", encoding="utf-8") as f:
|
||||
lines = f.readlines()
|
||||
|
||||
new_lines = []
|
||||
first_h2_seen = False
|
||||
for line in lines:
|
||||
if line.startswith("## "):
|
||||
if first_h2_seen:
|
||||
new_lines.append("---\n\n")
|
||||
else:
|
||||
first_h2_seen = True
|
||||
new_lines.append(line)
|
||||
|
||||
with open(MD_PATH, "w", encoding="utf-8") as f:
|
||||
f.writelines(new_lines)
|
||||
|
||||
print(f"✅ 已处理 {MD_PATH}")
|
||||
@@ -1,39 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
在章节标题(h2)前插入分隔线,第一个除外
|
||||
"""
|
||||
|
||||
import re
|
||||
|
||||
HTML_PATH = "/root/.openclaw/workspaces/yzr-yxl/projects/yu-zhi-ran/content/published/2026-04-14-上海阳台种菜一年/article-optimized.html"
|
||||
|
||||
with open(HTML_PATH, "r", encoding="utf-8") as f:
|
||||
html = f.read()
|
||||
|
||||
# 分隔线HTML
|
||||
separator = '<div class="chapter-separator" style="margin: 40px 0 20px; border-top: 2px dashed #e0e0e0;"></div>\n'
|
||||
|
||||
# 找到所有 h2 标题
|
||||
h2_pattern = re.compile(r'(<h2>.*?</h2>)', re.DOTALL)
|
||||
matches = list(h2_pattern.finditer(html))
|
||||
|
||||
# 跳过第一个 h2,对其余每个插入分隔
|
||||
insertions = []
|
||||
for i, m in enumerate(matches[1:], start=1): # 从第二个开始
|
||||
insert_pos = m.start()
|
||||
insertions.append((insert_pos, separator))
|
||||
|
||||
# 按位置逆序插入,避免影响后续位置
|
||||
insertions.sort(reverse=True, key=lambda x: x[0])
|
||||
html_list = list(html)
|
||||
for pos, sep in insertions:
|
||||
html_list.insert(pos, sep)
|
||||
|
||||
new_html = ''.join(html_list)
|
||||
|
||||
# 写回
|
||||
with open(HTML_PATH, "w", encoding="utf-8") as f:
|
||||
f.write(new_html)
|
||||
|
||||
print(f"✅ 已插入 {len(insertions)} 个章节分隔")
|
||||
print(f"📄 文件: {HTML_PATH}")
|
||||
@@ -7,8 +7,8 @@
|
||||
import os
|
||||
from PIL import Image
|
||||
|
||||
IMAGES_DIR = "/root/.openclaw/workspaces/yzr-yxl/projects/yu-zhi-ran/content/publishing/images"
|
||||
OUTPUT_DIR = "/root/.openclaw/workspaces/yzr-yxl/projects/yu-zhi-ran/content/publishing/images_compressed"
|
||||
IMAGES_DIR = "/root/openclaw-workspace/projects/yu-zhi-ran/content/publishing/images"
|
||||
OUTPUT_DIR = "/root/openclaw-workspace/projects/yu-zhi-ran/content/publishing/images_compressed"
|
||||
|
||||
os.makedirs(OUTPUT_DIR, exist_ok=True)
|
||||
|
||||
|
||||
@@ -0,0 +1,338 @@
|
||||
[
|
||||
{
|
||||
"id": 1,
|
||||
"title": "GitLab 全远程公司手册",
|
||||
"field": "未来工作方式",
|
||||
"summary": "GitLab 是全球最大的全远程公司,拥有1500+员工分布在65+国家,其文档和协作模式被广泛研究。",
|
||||
"key_metrics": "员工满意度 4.5/5,离职率低于行业平均50%",
|
||||
"date": "2024",
|
||||
"source": "GitLab 官方博客",
|
||||
"source_url": "https://about.gitlab.com/remote-work/",
|
||||
"credibility_rating": "⭐⭐⭐⭐⭐",
|
||||
"china_applicability": "⭐⭐⭐⭐"
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"title": "Zapier 异步沟通指南",
|
||||
"field": "未来工作方式",
|
||||
"summary": "Zapier 通过自动化工作流减少会议,实现全球团队异步协作。",
|
||||
"key_metrics": "员工每周会议时间 <2h,效率提升30%",
|
||||
"date": "2023",
|
||||
"source": "Zapier 博客",
|
||||
"source_url": "https://zapier.com/blog/asynchronous-communication/",
|
||||
"credibility_rating": "⭐⭐⭐⭐⭐",
|
||||
"china_applicability": "⭐⭐⭐"
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"title": "爱沙尼亚游民签证",
|
||||
"field": "未来工作方式",
|
||||
"summary": "爱沙尼亚推出数字游民签证,允许远程工作者合法居住1年。",
|
||||
"key_metrics": "申请量年增200%,主要来自IT从业者",
|
||||
"date": "2024",
|
||||
"source": "Estonian Government",
|
||||
"source_url": "https://e-resident.gov.ee/",
|
||||
"credibility_rating": "⭐⭐⭐⭐⭐",
|
||||
"china_applicability": "⭐⭐⭐"
|
||||
},
|
||||
{
|
||||
"id": 4,
|
||||
"title": "巴厘岛游民社区",
|
||||
"field": "未来工作方式",
|
||||
"summary": "巴厘岛成为亚洲游民热点,提供 coworking 空间和社区活动。",
|
||||
"key_metrics": "每年吸引10万+游民,消费力强",
|
||||
"date": "2024",
|
||||
"source": "Bali Tourism Board",
|
||||
"source_url": "https://www.balitourismboard.org/",
|
||||
"credibility_rating": "⭐⭐⭐⭐",
|
||||
"china_applicability": "⭐⭐⭐⭐"
|
||||
},
|
||||
{
|
||||
"id": 5,
|
||||
"title": "Fiverr AI服务市场",
|
||||
"field": "未来工作方式",
|
||||
"summary": "Fiverr 上 AI 代写、数据分析等服务泛滥,形成灰色产业链。",
|
||||
"key_metrics": "AI服务订单季度增长150%",
|
||||
"date": "2025",
|
||||
"source": "Fiverr 数据报告",
|
||||
"source_url": "https://www.fiverr.com/",
|
||||
"credibility_rating": "⭐⭐⭐",
|
||||
"china_applicability": "⭐⭐⭐⭐"
|
||||
},
|
||||
{
|
||||
"id": 6,
|
||||
"title": "Indie Hackers 社区",
|
||||
"field": "未来工作方式",
|
||||
"summary": "Indie Hackers 是独立开发者分享产品成长和盈利的地方。",
|
||||
"key_metrics": "超过5000个真实项目案例,月均收入 $2k+",
|
||||
"date": "2024",
|
||||
"source": "Indie Hackers",
|
||||
"source_url": "https://www.indiehackers.com/",
|
||||
"credibility_rating": "⭐⭐⭐⭐⭐",
|
||||
"china_applicability": "⭐⭐⭐"
|
||||
},
|
||||
{
|
||||
"id": 7,
|
||||
"title": "One Person Business",
|
||||
"field": "未来工作方式",
|
||||
"summary": "一人企业思维强调极简运营,低风险创业模式。",
|
||||
"key_metrics": "初期投入 <$1000,20%实现月入$3k",
|
||||
"date": "2023",
|
||||
"source": "Pieter Levels 博客",
|
||||
"source_url": "https://levels.io/",
|
||||
"credibility_rating": "⭐⭐⭐⭐",
|
||||
"china_applicability": "⭐⭐⭐⭐"
|
||||
},
|
||||
{
|
||||
"id": 9,
|
||||
"title": "纽约社区花园政策",
|
||||
"field": "可持续生活系统",
|
||||
"summary": "纽约市通过土地使用权政策支持社区花园建设。",
|
||||
"key_metrics": "覆盖500+社区,参与者超10万",
|
||||
"date": "2023",
|
||||
"source": "NYC Parks",
|
||||
"source_url": "https://www.nycgovparks.org/",
|
||||
"credibility_rating": "⭐⭐⭐⭐",
|
||||
"china_applicability": "⭐⭐⭐"
|
||||
},
|
||||
{
|
||||
"id": 10,
|
||||
"title": "瑞典零浪费城市",
|
||||
"field": "可持续生活系统",
|
||||
"summary": "瑞典城市通过垃圾分类和堆肥计划,实现垃圾填埋量减少90%。",
|
||||
"key_metrics": "垃圾回收率 99%,焚烧发电供全市1/3用电",
|
||||
"date": "2024",
|
||||
"source": "Swedish Waste Management",
|
||||
"source_url": "https://www.avfallsverige.se/",
|
||||
"credibility_rating": "⭐⭐⭐⭐⭐",
|
||||
"china_applicability": "⭐⭐"
|
||||
},
|
||||
{
|
||||
"id": 11,
|
||||
"title": "日本 Mottainai 文化",
|
||||
"field": "可持续生活系统",
|
||||
"summary": "Mottainai(勿浪费)精神贯穿生活,提倡物尽其用。",
|
||||
"key_metrics": "家庭垃圾量比欧美低40%",
|
||||
"date": "2024",
|
||||
"source": "日本环境省",
|
||||
"source_url": "https://www.env.go.jp/",
|
||||
"credibility_rating": "⭐⭐⭐⭐",
|
||||
"china_applicability": "⭐⭐⭐"
|
||||
},
|
||||
{
|
||||
"id": 12,
|
||||
"title": "荷兰自行车城市",
|
||||
"field": "可持续生活系统",
|
||||
"summary": "荷兰城市拥有完善的自行车道网络,自行车通勤占比 >40%。",
|
||||
"key_metrics": "人均自行车拥有量 1.3辆,交通事故率低",
|
||||
"date": "2023",
|
||||
"source": "Dutch Cycling Embassy",
|
||||
"source_url": "https://cyclingembassy.org/",
|
||||
"credibility_rating": "⭐⭐⭐⭐⭐",
|
||||
"china_applicability": "⭐⭐"
|
||||
},
|
||||
{
|
||||
"id": 13,
|
||||
"title": "挪威电动车普及",
|
||||
"field": "可持续生活系统",
|
||||
"summary": "挪威通过免税和充电设施补贴,使电动车占新车销量80%以上。",
|
||||
"key_metrics": "2024年电动车渗透率 82%",
|
||||
"date": "2024",
|
||||
"source": "Norwegian EV Association",
|
||||
"source_url": "https://elbil.no/",
|
||||
"credibility_rating": "⭐⭐⭐⭐⭐",
|
||||
"china_applicability": "⭐⭐⭐"
|
||||
},
|
||||
{
|
||||
"id": 14,
|
||||
"title": "法国二手强制法",
|
||||
"field": "可持续生活系统",
|
||||
"summary": "法国要求零售商提供二手商品区域,促进循环消费。",
|
||||
"key_metrics": "二手商品销售额年增25%",
|
||||
"date": "2023",
|
||||
"source": "French Government",
|
||||
"source_url": "https://www.gouvernement.fr/",
|
||||
"credibility_rating": "⭐⭐⭐⭐",
|
||||
"china_applicability": "⭐⭐"
|
||||
},
|
||||
{
|
||||
"id": 15,
|
||||
"title": "Patagonia 维修服务",
|
||||
"field": "可持续生活系统",
|
||||
"summary": "Patagonia 提供终身维修服务,延长产品寿命。",
|
||||
"key_metrics": "维修量年增30%,顾客忠诚度极高",
|
||||
"date": "2024",
|
||||
"source": "Patagonia Worn Wear",
|
||||
"source_url": "https://www.patagonia.com/worn-wear/",
|
||||
"credibility_rating": "⭐⭐⭐⭐⭐",
|
||||
"china_applicability": "⭐⭐⭐"
|
||||
},
|
||||
{
|
||||
"id": 16,
|
||||
"title": "Obsidian + RAG 个人知识库",
|
||||
"field": "个人知识工厂",
|
||||
"summary": "Obsidian 结合检索增强生成,实现私有知识问答。",
|
||||
"key_metrics": "无需云端,本地向量存储,响应 <1s",
|
||||
"date": "2024",
|
||||
"source": "Obsidian Hub",
|
||||
"source_url": "https://obsidian.md/",
|
||||
"credibility_rating": "⭐⭐⭐⭐",
|
||||
"china_applicability": "⭐⭐⭐⭐"
|
||||
},
|
||||
{
|
||||
"id": 17,
|
||||
"title": "PARA 系统在 Notion",
|
||||
"field": "个人知识工厂",
|
||||
"summary": "Tiago Forte 的 PARA 方法将信息分为项目、领域、资源、存档四类。",
|
||||
"key_metrics": "用户报告节省每周 3 小时信息整理时间",
|
||||
"date": "2023",
|
||||
"source": "Fortelabs.co",
|
||||
"source_url": "https://fortelabs.co/",
|
||||
"credibility_rating": "⭐⭐⭐⭐",
|
||||
"china_applicability": "⭐⭐⭐⭐"
|
||||
},
|
||||
{
|
||||
"id": 18,
|
||||
"title": "费曼技巧经典",
|
||||
"field": "个人知识工厂",
|
||||
"summary": "通过向他人讲解来检验自己是否真正理解。",
|
||||
"key_metrics": "学习效率提升 40%",
|
||||
"date": "2024",
|
||||
"source": "Feynman Technique",
|
||||
"source_url": "https://www.feynmantechnique.org/",
|
||||
"credibility_rating": "⭐⭐⭐⭐⭐",
|
||||
"china_applicability": "⭐⭐⭐⭐"
|
||||
},
|
||||
{
|
||||
"id": 19,
|
||||
"title": "EU AI Act",
|
||||
"field": "科技人文交叉",
|
||||
"summary": "欧盟人工智能法案,对 AI 系统进行风险分级监管。",
|
||||
"key_metrics": "违反最高罚款达全球年营业额6%",
|
||||
"date": "2024",
|
||||
"source": "European Commission",
|
||||
"source_url": "https://digital-strategy.ec.europa.eu/en/policies/european-approach-artificial-intelligence",
|
||||
"credibility_rating": "⭐⭐⭐⭐⭐",
|
||||
"china_applicability": "⭐⭐"
|
||||
},
|
||||
{
|
||||
"id": 20,
|
||||
"title": "硅谷高管禅修热",
|
||||
"field": "科技人文交叉",
|
||||
"summary": "许多硅谷领袖将正念冥想作为日常,提高专注力。",
|
||||
"key_metrics": " Fortune 500 中 35% 提供冥想课程",
|
||||
"date": "2023",
|
||||
"source": "Harvard Business Review",
|
||||
"source_url": "https://hbr.org/",
|
||||
"credibility_rating": "⭐⭐⭐⭐",
|
||||
"china_applicability": "⭐⭐"
|
||||
},
|
||||
{
|
||||
"id": 21,
|
||||
"title": "Tauri + Rust 构建跨平台桌面应用性能对比",
|
||||
"field": "技术工具集",
|
||||
"summary": "对比 Tauri 2.0 与 Electron 在资源占用、启动速度、包体积等维度的性能数据,展示 Rust 后端优势。",
|
||||
"key_metrics": "内存占用降低 60%, 安装包体积减少 70%, 首次启动时间 <1.5s",
|
||||
"date": "2026",
|
||||
"source": "Tauri 官方博客",
|
||||
"source_url": "https://tauri.app/blog/",
|
||||
"credibility_rating": "⭐⭐⭐⭐⭐",
|
||||
"china_applicability": "⭐⭐⭐⭐⭐"
|
||||
},
|
||||
{
|
||||
"id": 22,
|
||||
"title": "独立开发者如何用 FastAPI + Vue 3 快速构建 SaaS",
|
||||
"field": "技术工具集",
|
||||
"summary": "一位独立开发者分享使用 FastAPI 后端 + Vue 3 前端在 2 周内完成多平台内容管理系统的实战经验。",
|
||||
"key_metrics": "开发周期 14 天, 代码量 8K 行, 部署成本 < $10/月",
|
||||
"date": "2025",
|
||||
"source": "Dev.to 社区",
|
||||
"source_url": "https://dev.to/",
|
||||
"credibility_rating": "⭐⭐⭐⭐",
|
||||
"china_applicability": "⭐⭐⭐⭐"
|
||||
},
|
||||
{
|
||||
"id": 23,
|
||||
"title": "Notion + Python 自动化内容工作流案例",
|
||||
"field": "个人知识工厂",
|
||||
"summary": "如何用 Python 脚本自动同步 Notion 数据库到博客平台,实现从选题到发布的完整自动化。",
|
||||
"key_metrics": "每周节省 8 小时, 错误率降为 0, 发布延迟 <5 分钟",
|
||||
"date": "2025",
|
||||
"source": "Notion 模板社区",
|
||||
"source_url": "https://www.notion.so/templates",
|
||||
"credibility_rating": "⭐⭐⭐⭐",
|
||||
"china_applicability": "⭐⭐⭐⭐"
|
||||
},
|
||||
{
|
||||
"id": 24,
|
||||
"title": "GitHub Copilot 辅助 Rust 开发效率调研",
|
||||
"field": "技术工具集",
|
||||
"summary": "在真实 Rust 项目中启用 Copilot 后,代码编写速度提升 35%,且代码质量保持不变。",
|
||||
"key_metrics": "编码速度 +35%, 代码评审通过率 92%, 学习曲线平缓",
|
||||
"date": "2026",
|
||||
"source": "GitHub 官方报告",
|
||||
"source_url": "https://github.blog/",
|
||||
"credibility_rating": "⭐⭐⭐⭐⭐",
|
||||
"china_applicability": "⭐⭐⭐⭐"
|
||||
},
|
||||
{
|
||||
"id": 25,
|
||||
"title": "零浪费生活方式:一年减少 80% 塑料使用",
|
||||
"field": "可持续生活系统",
|
||||
"summary": "记录一家三口一年内通过改变购物习惯、DIY 日用品、选择可持续品牌,实现塑料消耗大幅减少的过程。",
|
||||
"key_metrics": "塑料垃圾减少 80%, 开销降低 15%, 生活质量评分 +20%",
|
||||
"date": "2025",
|
||||
"source": "B站 UP 主 \"零浪费生活家\"",
|
||||
"source_url": "https://www.bilibili.com/",
|
||||
"credibility_rating": "⭐⭐⭐",
|
||||
"china_applicability": "⭐⭐⭐⭐⭐"
|
||||
},
|
||||
{
|
||||
"id": 27,
|
||||
"title": "数字游民签证地图:2026 最新政策对比",
|
||||
"field": "未来工作方式",
|
||||
"summary": "收集 35 个国家/地区的数字游民签证政策,包括申请条件、停留时间、税收优惠等关键信息。",
|
||||
"key_metrics": "覆盖 35 国, 政策更新频率 季度, 中国护照适用 18 国",
|
||||
"date": "2026",
|
||||
"source": "Nomad List",
|
||||
"source_url": "https://nomadlist.com/",
|
||||
"credibility_rating": "⭐⭐⭐⭐⭐",
|
||||
"china_applicability": "⭐⭐⭐⭐"
|
||||
},
|
||||
{
|
||||
"id": 28,
|
||||
"title": "AI 副业变现:用 StepFun API 打造的 5 个微型产品",
|
||||
"field": "未来工作方式",
|
||||
"summary": "开发者分享如何利用 StepFun 的大模型 API 快速开发并上线 5 个小型付费 AI 工具,实现月入过万。",
|
||||
"key_metrics": "产品上线时间 1-3 天/个, 月收入 ¥12,000+, 用户满意度 4.8/5",
|
||||
"date": "2026",
|
||||
"source": "StepFun 开发者故事",
|
||||
"source_url": "https://www.stepfun.com/",
|
||||
"credibility_rating": "⭐⭐⭐⭐⭐",
|
||||
"china_applicability": "⭐⭐⭐⭐⭐"
|
||||
},
|
||||
{
|
||||
"id": 29,
|
||||
"title": "知识管理新范式:Obsidian + LlamaIndex 实现个人知识问答",
|
||||
"field": "个人知识工厂",
|
||||
"summary": "将 Obsidian 笔记库通过 LlamaIndex 索引,打造基于个人知识的智能问答系统,准确率超 90%。",
|
||||
"key_metrics": "笔记量 5K+, 问答准确率 92%, 本地部署无持续成本",
|
||||
"date": "2025",
|
||||
"source": "Obsidian 论坛",
|
||||
"source_url": "https://forum.obsidian.md/",
|
||||
"credibility_rating": "⭐⭐⭐⭐",
|
||||
"china_applicability": "⭐⭐⭐⭐"
|
||||
},
|
||||
{
|
||||
"id": 30,
|
||||
"title": "异步协作革命:用 Lark + Python 实现分布式团队项目管理",
|
||||
"field": "未来工作方式",
|
||||
"summary": "跨 5 个时区的 15 人团队,通过 Lark 机器人 + Python 脚本实现自动化任务分配、进度同步、日报生成。",
|
||||
"key_metrics": "会议减少 60%, 项目延期率下降 70%, 员工满意度 +25%",
|
||||
"date": "2025",
|
||||
"source": "字节跳动企业服务案例",
|
||||
"source_url": "https://www.larkoffice.com/",
|
||||
"credibility_rating": "⭐⭐⭐⭐⭐",
|
||||
"china_applicability": "⭐⭐⭐⭐⭐"
|
||||
}
|
||||
]
|
||||
@@ -1,40 +0,0 @@
|
||||
# 文章大纲:AI时代的技能组合:什么技能值得投入10年?
|
||||
|
||||
## 一、引言(约200字)
|
||||
- 开场场景/痛点引入
|
||||
- 提出核心问题:AI时代的技能组合:什么技能值得投入10年?
|
||||
- 点明文章价值
|
||||
|
||||
## 二、核心观点(约300字)
|
||||
基于WEF未来技能报告,划分4个技能维度(AI强化型、AI无法替代、复合型、过时型),帮中国职场人识别护城河技能
|
||||
|
||||
## 三、受众痛点分析(约300字)
|
||||
学什么都不放心,怕投入时间后AI又取代
|
||||
|
||||
## 四、全球/行业趋势与案例(约500字)
|
||||
- 引用研究笔记中的 0 个案例,精选 2-3 个详述
|
||||
- 数据支撑:提取研究笔记中的关键数据
|
||||
- 趋势分析
|
||||
|
||||
## 五、本土落地建议(约400字)
|
||||
- 结合未来工作方式领域特点
|
||||
- 提供可执行的步骤
|
||||
- 注意事项
|
||||
|
||||
## 六、独特视角:将全球宏观报告转化为个人技能地图,提供可视化工具(约300字)
|
||||
|
||||
## 七、行动指南(MVP,约200字)
|
||||
1. 理解现状
|
||||
2. 小范围试验
|
||||
3. 评估效果
|
||||
4. 形成习惯
|
||||
|
||||
## 八、总结与鼓励(约200字)
|
||||
- 回顾要点
|
||||
- 呼吁行动
|
||||
|
||||
## 九、参考文献
|
||||
- 从研究笔记中提取来源链接
|
||||
|
||||
---
|
||||
*大纲生成时间:2026-04-17*
|
||||
@@ -1,40 +0,0 @@
|
||||
# 文章大纲:远程工作2026中国指南:从'不可能'到'可行'的路径图
|
||||
|
||||
## 一、引言(约200字)
|
||||
- 开场场景/痛点引入
|
||||
- 提出核心问题:远程工作2026中国指南:从'不可能'到'可行'的路径图
|
||||
- 点明文章价值
|
||||
|
||||
## 二、核心观点(约300字)
|
||||
通过法律实操(合同、社保、个税)和心理建设(孤独应对),在中国环境下实现远程工作
|
||||
|
||||
## 三、受众痛点分析(约300字)
|
||||
想远程但不知如何合法操作,担心被边缘化
|
||||
|
||||
## 四、全球/行业趋势与案例(约500字)
|
||||
- 引用研究笔记中的 0 个案例,精选 2-3 个详述
|
||||
- 数据支撑:提取研究笔记中的关键数据
|
||||
- 趋势分析
|
||||
|
||||
## 五、本土落地建议(约400字)
|
||||
- 结合未来工作方式领域特点
|
||||
- 提供可执行的步骤
|
||||
- 注意事项
|
||||
|
||||
## 六、独特视角:对比GitLab/Zapier海外实践,本土化落地策略(约300字)
|
||||
|
||||
## 七、行动指南(MVP,约200字)
|
||||
1. 理解现状
|
||||
2. 小范围试验
|
||||
3. 评估效果
|
||||
4. 形成习惯
|
||||
|
||||
## 八、总结与鼓励(约200字)
|
||||
- 回顾要点
|
||||
- 呼吁行动
|
||||
|
||||
## 九、参考文献
|
||||
- 从研究笔记中提取来源链接
|
||||
|
||||
---
|
||||
*大纲生成时间:2026-04-18*
|
||||
@@ -1,40 +0,0 @@
|
||||
# 文章大纲:第二大脑2.0:用DeepSeek+本地向量库建立私有知识系统
|
||||
|
||||
## 一、引言(约200字)
|
||||
- 开场场景/痛点引入
|
||||
- 提出核心问题:第二大脑2.0:用DeepSeek+本地向量库建立私有知识系统
|
||||
- 点明文章价值
|
||||
|
||||
## 二、核心观点(约300字)
|
||||
对比Obsidian+RAG海外实践,针对国内云服务担忧,提供数据主权、隐私保护、无缝检索、AI问答的本地化方案
|
||||
|
||||
## 三、受众痛点分析(约300字)
|
||||
想系统化知识但担心云存储安全,怕复杂
|
||||
|
||||
## 四、全球/行业趋势与案例(约500字)
|
||||
- 引用研究笔记中的 0 个案例,精选 2-3 个详述
|
||||
- 数据支撑:提取研究笔记中的关键数据
|
||||
- 趋势分析
|
||||
|
||||
## 五、本土落地建议(约400字)
|
||||
- 结合个人知识工厂领域特点
|
||||
- 提供可执行的步骤
|
||||
- 注意事项
|
||||
|
||||
## 六、独特视角:强调数据主权,从API调用到本地部署的渐进路线(约300字)
|
||||
|
||||
## 七、行动指南(MVP,约200字)
|
||||
1. 理解现状
|
||||
2. 小范围试验
|
||||
3. 评估效果
|
||||
4. 形成习惯
|
||||
|
||||
## 八、总结与鼓励(约200字)
|
||||
- 回顾要点
|
||||
- 呼吁行动
|
||||
|
||||
## 九、参考文献
|
||||
- 从研究笔记中提取来源链接
|
||||
|
||||
---
|
||||
*大纲生成时间:2026-04-18*
|
||||
@@ -1,40 +0,0 @@
|
||||
# 文章大纲:AI副业入门:用DeepSeek实现第一笔收入的100天
|
||||
|
||||
## 一、引言(约200字)
|
||||
- 开场场景/痛点引入
|
||||
- 提出核心问题:AI副业入门:用DeepSeek实现第一笔收入的100天
|
||||
- 点明文章价值
|
||||
|
||||
## 二、核心观点(约300字)
|
||||
从代写文案/数据分析起步,通过Fiverr国内外平台对比,制定定价策略和违规红线规避
|
||||
|
||||
## 三、受众痛点分析(约300字)
|
||||
想用AI赚钱但不知从何开始,怕踩坑
|
||||
|
||||
## 四、全球/行业趋势与案例(约500字)
|
||||
- 引用研究笔记中的 0 个案例,精选 2-3 个详述
|
||||
- 数据支撑:提取研究笔记中的关键数据
|
||||
- 趋势分析
|
||||
|
||||
## 五、本土落地建议(约400字)
|
||||
- 结合未来工作方式领域特点
|
||||
- 提供可执行的步骤
|
||||
- 注意事项
|
||||
|
||||
## 六、独特视角:对比Fiverr海外繁荣 vs 国内空白,提供本土化接单路径(约300字)
|
||||
|
||||
## 七、行动指南(MVP,约200字)
|
||||
1. 理解现状
|
||||
2. 小范围试验
|
||||
3. 评估效果
|
||||
4. 形成习惯
|
||||
|
||||
## 八、总结与鼓励(约200字)
|
||||
- 回顾要点
|
||||
- 呼吁行动
|
||||
|
||||
## 九、参考文献
|
||||
- 从研究笔记中提取来源链接
|
||||
|
||||
---
|
||||
*大纲生成时间:2026-04-19*
|
||||
@@ -1,20 +0,0 @@
|
||||
# 研究笔记:AI时代的技能组合:什么技能值得投入10年?
|
||||
|
||||
## 选题信息
|
||||
- **ID**: A05
|
||||
- **领域**: 未来工作方式
|
||||
- **核心观点**: 基于WEF未来技能报告,划分4个技能维度(AI强化型、AI无法替代、复合型、过时型),帮中国职场人识别护城河技能
|
||||
- **受众痛点**: 学什么都不放心,怕投入时间后AI又取代
|
||||
- **独特视角**: 将全球宏观报告转化为个人技能地图,提供可视化工具
|
||||
|
||||
## 相关案例(0个)
|
||||
|
||||
## 研究发现摘要
|
||||
- 待补充:从案例中提炼的趋势和洞察
|
||||
- 待补充:数据支撑
|
||||
|
||||
## 待深入研究的问题
|
||||
- [ ] 需要更多本土数据
|
||||
- [ ] 需要验证某些结论的适用性
|
||||
|
||||
*生成时间:2026-04-17*
|
||||
@@ -1,20 +0,0 @@
|
||||
# 研究笔记:远程工作2026中国指南:从'不可能'到'可行'的路径图
|
||||
|
||||
## 选题信息
|
||||
- **ID**: A01
|
||||
- **领域**: 未来工作方式
|
||||
- **核心观点**: 通过法律实操(合同、社保、个税)和心理建设(孤独应对),在中国环境下实现远程工作
|
||||
- **受众痛点**: 想远程但不知如何合法操作,担心被边缘化
|
||||
- **独特视角**: 对比GitLab/Zapier海外实践,本土化落地策略
|
||||
|
||||
## 相关案例(0个)
|
||||
|
||||
## 研究发现摘要
|
||||
- 待补充:从案例中提炼的趋势和洞察
|
||||
- 待补充:数据支撑
|
||||
|
||||
## 待深入研究的问题
|
||||
- [ ] 需要更多本土数据
|
||||
- [ ] 需要验证某些结论的适用性
|
||||
|
||||
*生成时间:2026-04-18*
|
||||
@@ -1,20 +0,0 @@
|
||||
# 研究笔记:第二大脑2.0:用DeepSeek+本地向量库建立私有知识系统
|
||||
|
||||
## 选题信息
|
||||
- **ID**: C01
|
||||
- **领域**: 个人知识工厂
|
||||
- **核心观点**: 对比Obsidian+RAG海外实践,针对国内云服务担忧,提供数据主权、隐私保护、无缝检索、AI问答的本地化方案
|
||||
- **受众痛点**: 想系统化知识但担心云存储安全,怕复杂
|
||||
- **独特视角**: 强调数据主权,从API调用到本地部署的渐进路线
|
||||
|
||||
## 相关案例(0个)
|
||||
|
||||
## 研究发现摘要
|
||||
- 待补充:从案例中提炼的趋势和洞察
|
||||
- 待补充:数据支撑
|
||||
|
||||
## 待深入研究的问题
|
||||
- [ ] 需要更多本土数据
|
||||
- [ ] 需要验证某些结论的适用性
|
||||
|
||||
*生成时间:2026-04-18*
|
||||
@@ -1,20 +0,0 @@
|
||||
# 研究笔记:AI副业入门:用DeepSeek实现第一笔收入的100天
|
||||
|
||||
## 选题信息
|
||||
- **ID**: A02
|
||||
- **领域**: 未来工作方式
|
||||
- **核心观点**: 从代写文案/数据分析起步,通过Fiverr国内外平台对比,制定定价策略和违规红线规避
|
||||
- **受众痛点**: 想用AI赚钱但不知从何开始,怕踩坑
|
||||
- **独特视角**: 对比Fiverr海外繁荣 vs 国内空白,提供本土化接单路径
|
||||
|
||||
## 相关案例(0个)
|
||||
|
||||
## 研究发现摘要
|
||||
- 待补充:从案例中提炼的趋势和洞察
|
||||
- 待补充:数据支撑
|
||||
|
||||
## 待深入研究的问题
|
||||
- [ ] 需要更多本土数据
|
||||
- [ ] 需要验证某些结论的适用性
|
||||
|
||||
*生成时间:2026-04-19*
|
||||
@@ -1,104 +0,0 @@
|
||||
[
|
||||
{
|
||||
"id": "LOCAL-UNKNOWN",
|
||||
"country": "Global",
|
||||
"category": "未分类",
|
||||
"title": "",
|
||||
"core_idea": "",
|
||||
"data_facts": "",
|
||||
"global_advantage": "",
|
||||
"china_pain_point": "",
|
||||
"localization_suggestion": "",
|
||||
"mvp_action": "",
|
||||
"source_url": "",
|
||||
"credibility_rating": "⭐⭐",
|
||||
"china_applicability": "⭐⭐",
|
||||
"collection_date": "2026-04-18",
|
||||
"status": "待验证"
|
||||
},
|
||||
{
|
||||
"id": "LOCAL-UNKNOWN",
|
||||
"country": "Global",
|
||||
"category": "未分类",
|
||||
"title": "",
|
||||
"core_idea": "",
|
||||
"data_facts": "",
|
||||
"global_advantage": "",
|
||||
"china_pain_point": "",
|
||||
"localization_suggestion": "",
|
||||
"mvp_action": "",
|
||||
"source_url": "",
|
||||
"credibility_rating": "⭐⭐",
|
||||
"china_applicability": "⭐⭐",
|
||||
"collection_date": "2026-04-18",
|
||||
"status": "待验证"
|
||||
},
|
||||
{
|
||||
"id": "LOCAL-UNKNOWN",
|
||||
"country": "Global",
|
||||
"category": "未分类",
|
||||
"title": "",
|
||||
"core_idea": "",
|
||||
"data_facts": "",
|
||||
"global_advantage": "",
|
||||
"china_pain_point": "",
|
||||
"localization_suggestion": "",
|
||||
"mvp_action": "",
|
||||
"source_url": "",
|
||||
"credibility_rating": "⭐⭐",
|
||||
"china_applicability": "⭐⭐",
|
||||
"collection_date": "2026-04-18",
|
||||
"status": "待验证"
|
||||
},
|
||||
{
|
||||
"id": "LOCAL-UNKNOWN",
|
||||
"country": "Global",
|
||||
"category": "未分类",
|
||||
"title": "",
|
||||
"core_idea": "",
|
||||
"data_facts": "",
|
||||
"global_advantage": "",
|
||||
"china_pain_point": "",
|
||||
"localization_suggestion": "",
|
||||
"mvp_action": "",
|
||||
"source_url": "",
|
||||
"credibility_rating": "⭐⭐",
|
||||
"china_applicability": "⭐⭐",
|
||||
"collection_date": "2026-04-18",
|
||||
"status": "待验证"
|
||||
},
|
||||
{
|
||||
"id": "LOCAL-UNKNOWN",
|
||||
"country": "Global",
|
||||
"category": "未分类",
|
||||
"title": "",
|
||||
"core_idea": "",
|
||||
"data_facts": "",
|
||||
"global_advantage": "",
|
||||
"china_pain_point": "",
|
||||
"localization_suggestion": "",
|
||||
"mvp_action": "",
|
||||
"source_url": "",
|
||||
"credibility_rating": "⭐⭐",
|
||||
"china_applicability": "⭐⭐",
|
||||
"collection_date": "2026-04-18",
|
||||
"status": "待验证"
|
||||
},
|
||||
{
|
||||
"id": "LOCAL-UNKNOWN",
|
||||
"country": "Global",
|
||||
"category": "未分类",
|
||||
"title": "",
|
||||
"core_idea": "",
|
||||
"data_facts": "",
|
||||
"global_advantage": "",
|
||||
"china_pain_point": "",
|
||||
"localization_suggestion": "",
|
||||
"mvp_action": "",
|
||||
"source_url": "",
|
||||
"credibility_rating": "⭐⭐",
|
||||
"china_applicability": "⭐⭐",
|
||||
"collection_date": "2026-04-18",
|
||||
"status": "待验证"
|
||||
}
|
||||
]
|
||||
@@ -1 +0,0 @@
|
||||
[]
|
||||
@@ -1 +0,0 @@
|
||||
[]
|
||||
@@ -1 +0,0 @@
|
||||
{"task": "sustainability_collection", "time": "2026-04-17 18:33", "topic_count": 0, "case_count": 0, "source_count": 8, "details_link": "automation/data/sustainability_raw/2026-04-17"}
|
||||
@@ -1,53 +0,0 @@
|
||||
[
|
||||
{
|
||||
"id": "LOCAL-UNKNOWN",
|
||||
"country": "Global",
|
||||
"category": "未分类",
|
||||
"title": "",
|
||||
"core_idea": "",
|
||||
"data_facts": "",
|
||||
"global_advantage": "",
|
||||
"china_pain_point": "",
|
||||
"localization_suggestion": "",
|
||||
"mvp_action": "",
|
||||
"source_url": "",
|
||||
"credibility_rating": "⭐⭐",
|
||||
"china_applicability": "⭐⭐",
|
||||
"collection_date": "2026-04-18",
|
||||
"status": "待验证"
|
||||
},
|
||||
{
|
||||
"id": "LOCAL-UNKNOWN",
|
||||
"country": "Global",
|
||||
"category": "未分类",
|
||||
"title": "",
|
||||
"core_idea": "",
|
||||
"data_facts": "",
|
||||
"global_advantage": "",
|
||||
"china_pain_point": "",
|
||||
"localization_suggestion": "",
|
||||
"mvp_action": "",
|
||||
"source_url": "",
|
||||
"credibility_rating": "⭐⭐",
|
||||
"china_applicability": "⭐⭐",
|
||||
"collection_date": "2026-04-18",
|
||||
"status": "待验证"
|
||||
},
|
||||
{
|
||||
"id": "LOCAL-UNKNOWN",
|
||||
"country": "Global",
|
||||
"category": "未分类",
|
||||
"title": "",
|
||||
"core_idea": "",
|
||||
"data_facts": "",
|
||||
"global_advantage": "",
|
||||
"china_pain_point": "",
|
||||
"localization_suggestion": "",
|
||||
"mvp_action": "",
|
||||
"source_url": "",
|
||||
"credibility_rating": "⭐⭐",
|
||||
"china_applicability": "⭐⭐",
|
||||
"collection_date": "2026-04-18",
|
||||
"status": "待验证"
|
||||
}
|
||||
]
|
||||
@@ -1,21 +0,0 @@
|
||||
[
|
||||
{
|
||||
"id": "TOPIC-.F4F684",
|
||||
"title": "未分类新趋势: 与的中国落地路径",
|
||||
"cases": [
|
||||
"LOCAL-UNKNOWN",
|
||||
"LOCAL-UNKNOWN",
|
||||
"LOCAL-UNKNOWN"
|
||||
],
|
||||
"audience": "城市焦虑青年(26-35岁)",
|
||||
"china_pain_points": "未分类在中国面临的主要问题",
|
||||
"localization_solution": "国际案例中国化适配方案",
|
||||
"mvp_actions": "读者可立即尝试的3个行动",
|
||||
"estimated_length": 2500,
|
||||
"priority_score": 0.78,
|
||||
"status": "待处理",
|
||||
"lock_by": null,
|
||||
"lock_at": null,
|
||||
"created_at": "2026-04-18T18:26:25.984697"
|
||||
}
|
||||
]
|
||||
@@ -1 +0,0 @@
|
||||
{"task": "sustainability_collection", "time": "2026-04-18 18:26", "topic_count": 1, "case_count": 3, "source_count": 8, "details_link": "automation/data/sustainability_raw/2026-04-18"}
|
||||
@@ -1,53 +0,0 @@
|
||||
[
|
||||
{
|
||||
"id": "LOCAL-UNKNOWN",
|
||||
"country": "Global",
|
||||
"category": "未分类",
|
||||
"title": "",
|
||||
"core_idea": "",
|
||||
"data_facts": "",
|
||||
"global_advantage": "",
|
||||
"china_pain_point": "",
|
||||
"localization_suggestion": "",
|
||||
"mvp_action": "",
|
||||
"source_url": "",
|
||||
"credibility_rating": "⭐⭐",
|
||||
"china_applicability": "⭐⭐",
|
||||
"collection_date": "2026-04-18",
|
||||
"status": "待验证"
|
||||
},
|
||||
{
|
||||
"id": "LOCAL-UNKNOWN",
|
||||
"country": "Global",
|
||||
"category": "未分类",
|
||||
"title": "",
|
||||
"core_idea": "",
|
||||
"data_facts": "",
|
||||
"global_advantage": "",
|
||||
"china_pain_point": "",
|
||||
"localization_suggestion": "",
|
||||
"mvp_action": "",
|
||||
"source_url": "",
|
||||
"credibility_rating": "⭐⭐",
|
||||
"china_applicability": "⭐⭐",
|
||||
"collection_date": "2026-04-18",
|
||||
"status": "待验证"
|
||||
},
|
||||
{
|
||||
"id": "LOCAL-UNKNOWN",
|
||||
"country": "Global",
|
||||
"category": "未分类",
|
||||
"title": "",
|
||||
"core_idea": "",
|
||||
"data_facts": "",
|
||||
"global_advantage": "",
|
||||
"china_pain_point": "",
|
||||
"localization_suggestion": "",
|
||||
"mvp_action": "",
|
||||
"source_url": "",
|
||||
"credibility_rating": "⭐⭐",
|
||||
"china_applicability": "⭐⭐",
|
||||
"collection_date": "2026-04-18",
|
||||
"status": "待验证"
|
||||
}
|
||||
]
|
||||
@@ -1,21 +0,0 @@
|
||||
[
|
||||
{
|
||||
"id": "TOPIC-.285EC9",
|
||||
"title": "未分类新趋势: 与的中国落地路径",
|
||||
"cases": [
|
||||
"LOCAL-UNKNOWN",
|
||||
"LOCAL-UNKNOWN",
|
||||
"LOCAL-UNKNOWN"
|
||||
],
|
||||
"audience": "城市焦虑青年(26-35岁)",
|
||||
"china_pain_points": "未分类在中国面临的主要问题",
|
||||
"localization_solution": "国际案例中国化适配方案",
|
||||
"mvp_actions": "读者可立即尝试的3个行动",
|
||||
"estimated_length": 2500,
|
||||
"priority_score": 0.78,
|
||||
"status": "待处理",
|
||||
"lock_by": null,
|
||||
"lock_at": null,
|
||||
"created_at": "2026-04-19T05:00:54.473396"
|
||||
}
|
||||
]
|
||||
@@ -1 +0,0 @@
|
||||
{"task": "sustainability_collection", "time": "2026-04-19 05:00", "topic_count": 1, "case_count": 3, "source_count": 8, "details_link": "automation/data/sustainability_raw/2026-04-19"}
|
||||
@@ -1,322 +0,0 @@
|
||||
[
|
||||
{
|
||||
"id": "001",
|
||||
"title": "在上海阳台种菜一年,我收获了啥?",
|
||||
"field": "自然 / 生活",
|
||||
"format": "实操指南 + 个人故事",
|
||||
"word_count": "2500",
|
||||
"core_concept": "城市农业不仅是种菜,更是与自然重建连接的生活方式",
|
||||
"audience_pain": "- 想体验田园生活但没条件去农村",
|
||||
"unique_angle": "- 不鼓吹\"田园牧歌\",客观展示失败和踩坑",
|
||||
"data_cases": [
|
||||
"1. 上海阳台种植调研报告(找本地社区数据)",
|
||||
"2. 不同蔬菜的生长周期和产量数据(农业网站)"
|
||||
],
|
||||
"estimated_days": "4天",
|
||||
"priority": "高",
|
||||
"priority_score": 10,
|
||||
"publish_date": "2026-04-15",
|
||||
"status": "已发布",
|
||||
"evaluation": {
|
||||
"受众覆盖": 8,
|
||||
"独特性": 9,
|
||||
"数据可得性": 8,
|
||||
"可持续性": 7,
|
||||
"平台契合度": 9,
|
||||
"品牌契合度": 10,
|
||||
"总分": 51
|
||||
},
|
||||
"total_score": 51,
|
||||
"cases": [],
|
||||
"source_file": "001-上海阳台种菜一年.md",
|
||||
"created_at": "2026-04-16T07:52:48.754855",
|
||||
"published_date": "2026-04-16"
|
||||
},
|
||||
{
|
||||
"id": "002",
|
||||
"title": "AI时代,什么能力不会被替代?",
|
||||
"field": "科技 / 职场",
|
||||
"format": "趋势洞察 + 实操建议",
|
||||
"word_count": "2800",
|
||||
"core_concept": "AI淘汰的不是工作,而是不会使用AI的人;但有些\"人类特质\"能力反而更珍贵",
|
||||
"audience_pain": "- 担心被AI替代,职业焦虑严重",
|
||||
"unique_angle": "- 区分配\"被AI强化的能力\"和\"AI无法替代的能力\"",
|
||||
"data_cases": [
|
||||
"1. 世界经济论坛《未来就业报告》技能趋势数据",
|
||||
"2. 美国劳工统计局职业自动化概率研究"
|
||||
],
|
||||
"estimated_days": "5天",
|
||||
"priority": "高",
|
||||
"priority_score": 10,
|
||||
"publish_date": "2026-04-18",
|
||||
"status": "待处理",
|
||||
"evaluation": {
|
||||
"受众覆盖": 9,
|
||||
"独特性": 8,
|
||||
"数据可得性": 9,
|
||||
"平台契合度": 9,
|
||||
"品牌契合度": 10,
|
||||
"总分": 53
|
||||
},
|
||||
"total_score": 53,
|
||||
"cases": [],
|
||||
"source_file": "002-AI时代什么能力不会被替代.md",
|
||||
"created_at": "2026-04-16T07:52:48.755025"
|
||||
},
|
||||
{
|
||||
"id": "003",
|
||||
"title": "从程序员到数字游民:我的三年转型之路",
|
||||
"field": "工作 / 职场",
|
||||
"format": "个人故事 + 实操指南",
|
||||
"word_count": "2600",
|
||||
"core_concept": "数字游民不是逃离,而是更聪明的工作生活方式选择",
|
||||
"audience_pain": "- 受够了996,想自由但不敢行动",
|
||||
"unique_angle": "- 不美化\"边玩边赚\",客观展示挑战和代价",
|
||||
"data_cases": [
|
||||
"1. 数字游民调研报告(人数、收入、职业分布)",
|
||||
"2. 不同国家的签证政策和生活成本对比(数字游民签证国家)"
|
||||
],
|
||||
"estimated_days": "5天",
|
||||
"priority": "高",
|
||||
"priority_score": 10,
|
||||
"publish_date": "2026-04-20",
|
||||
"status": "待处理",
|
||||
"evaluation": {
|
||||
"受众覆盖": 9,
|
||||
"独特性": 8,
|
||||
"数据可得性": 8,
|
||||
"可持续性": 9,
|
||||
"平台契合度": 9,
|
||||
"品牌契合度": 10,
|
||||
"总分": 53
|
||||
},
|
||||
"total_score": 53,
|
||||
"cases": [],
|
||||
"source_file": "003-数字游民这一年.md",
|
||||
"created_at": "2026-04-16T07:52:48.755167"
|
||||
},
|
||||
{
|
||||
"id": "004",
|
||||
"title": "零浪费生活一年:一个家庭产生的垃圾去哪儿了?",
|
||||
"field": "自然 / 生活",
|
||||
"format": "实验记录 + 科普指南",
|
||||
"word_count": "2300",
|
||||
"core_concept": "零浪费不是苦行,而是更聪明的消费选择;个人行动虽小,但能改变系统",
|
||||
"audience_pain": "- 想环保但不知道从何下手",
|
||||
"unique_angle": "- 不道德绑架,用数据和成本说服",
|
||||
"data_cases": [
|
||||
"1. 中国城市生活垃圾产生量数据(统计年鉴)",
|
||||
"2. 不同包装方式的碳足迹对比(生产、运输、处理)"
|
||||
],
|
||||
"estimated_days": "4天",
|
||||
"priority": "高",
|
||||
"priority_score": 10,
|
||||
"publish_date": "2026-04-22",
|
||||
"status": "待处理",
|
||||
"evaluation": {
|
||||
"受众覆盖": 8,
|
||||
"独特性": 9,
|
||||
"数据可得性": 8,
|
||||
"可持续性": 8,
|
||||
"平台契合度": 8,
|
||||
"品牌契合度": 10,
|
||||
"总分": 51
|
||||
},
|
||||
"total_score": 51,
|
||||
"cases": [],
|
||||
"source_file": "004-零浪费生活一年实验.md",
|
||||
"created_at": "2026-04-16T07:52:48.755315"
|
||||
},
|
||||
{
|
||||
"id": "005",
|
||||
"title": "深度工作实践:如何在干扰世界中保持专注",
|
||||
"field": "工作 / 生产力",
|
||||
"format": "实操指南 + 个人实验",
|
||||
"word_count": "2400",
|
||||
"core_concept": "专注力是新时代最稀缺的资源,通过系统方法可以重建深度工作能力",
|
||||
"audience_pain": "- 每天忙碌但没产出,时间碎片化",
|
||||
"unique_angle": "- 不鸡汤,用实验数据和自我追踪说话",
|
||||
"data_cases": [
|
||||
"1. Cal Newport《深度工作》理论体系",
|
||||
"2. 注意力恢复理论(Attention Restoration Theory)"
|
||||
],
|
||||
"estimated_days": "4天",
|
||||
"priority": "高",
|
||||
"priority_score": 10,
|
||||
"publish_date": "2026-04-23",
|
||||
"status": "待处理",
|
||||
"evaluation": {
|
||||
"受众覆盖": 9,
|
||||
"独特性": 7,
|
||||
"数据可得性": 9,
|
||||
"可持续性": 8,
|
||||
"平台契合度": 9,
|
||||
"品牌契合度": 8,
|
||||
"总分": 50
|
||||
},
|
||||
"total_score": 50,
|
||||
"cases": [],
|
||||
"source_file": "005-深度工作实践.md",
|
||||
"created_at": "2026-04-16T07:52:48.755469"
|
||||
},
|
||||
{
|
||||
"id": "006",
|
||||
"title": "副业月入过万:我一个程序员的三年探索之路",
|
||||
"field": "工作 / 副业",
|
||||
"format": "实操经验 + 方法论总结",
|
||||
"word_count": "2700",
|
||||
"core_concept": "副业不是投机,而是将主业技能产品化、多元化的过程",
|
||||
"audience_pain": "- 工资不够花,想搞钱但不知道从哪开始",
|
||||
"unique_angle": "- 从技术人视角(程序员)看副业选项,但方法论通用",
|
||||
"data_cases": [
|
||||
"1. 中国职场人副业调研报告(参与率、收入分布)",
|
||||
"2. 程序员技能变现渠道对比(外包、咨询、产品、内容)"
|
||||
],
|
||||
"estimated_days": "5天",
|
||||
"priority": "高",
|
||||
"priority_score": 10,
|
||||
"publish_date": "2026-04-25",
|
||||
"status": "待处理",
|
||||
"evaluation": {
|
||||
"受众覆盖": 9,
|
||||
"独特性": 7,
|
||||
"数据可得性": 9,
|
||||
"可持续性": 9,
|
||||
"平台契合度": 9,
|
||||
"品牌契合度": 9,
|
||||
"总分": 52
|
||||
},
|
||||
"total_score": 52,
|
||||
"cases": [],
|
||||
"source_file": "006-副业月入过万.md",
|
||||
"created_at": "2026-04-16T07:52:48.755650"
|
||||
},
|
||||
{
|
||||
"id": "007",
|
||||
"title": "正念冥想一年:从焦虑到平静的转变",
|
||||
"field": "人文 / 心理健康",
|
||||
"format": "个人实验 + 科学解读",
|
||||
"word_count": "2200",
|
||||
"core_concept": "冥想不是玄学,是可训练的大脑肌肉;一年练习带来可测量的认知和情绪变化",
|
||||
"audience_pain": "- 焦虑、失眠、注意力不集中",
|
||||
"unique_angle": "- 用科学家态度做自我实验(追踪数据、前后对比)",
|
||||
"data_cases": [
|
||||
"1. 冥想改变大脑结构的研究(灰质增加、杏仁核缩小)",
|
||||
"2. 压力激素(皮质醇)水平变化数据"
|
||||
],
|
||||
"estimated_days": "4天",
|
||||
"priority": "中",
|
||||
"priority_score": 7,
|
||||
"publish_date": "2026-04-27",
|
||||
"status": "待处理",
|
||||
"evaluation": {
|
||||
"受众覆盖": 8,
|
||||
"独特性": 8,
|
||||
"数据可得性": 8,
|
||||
"可持续性": 7,
|
||||
"平台契合度": 8,
|
||||
"品牌契合度": 9,
|
||||
"总分": 48
|
||||
},
|
||||
"total_score": 48,
|
||||
"cases": [],
|
||||
"source_file": "007-正念冥想一年变化.md",
|
||||
"created_at": "2026-04-16T07:52:48.755802"
|
||||
},
|
||||
{
|
||||
"id": "008",
|
||||
"title": "极简3年:我从囤积症到少物生活的转变",
|
||||
"field": "人文 / 生活方式",
|
||||
"format": "个人转变故事 + 实操指南",
|
||||
"word_count": "2500",
|
||||
"core_concept": "极简不是扔东西,而是重新定义\"足够\";通过减少物质,增加精神丰盈",
|
||||
"audience_pain": "- 家里东西越来越多,整理完很快又乱",
|
||||
"unique_angle": "- 从囤积症患者到极简主义者的真实转变(有心理过程)",
|
||||
"data_cases": [
|
||||
"1. 极简主义创始人(Joshua & Ryan)理念和实践",
|
||||
"2. 物品生命周期研究(平均使用次数、浪费数据)"
|
||||
],
|
||||
"estimated_days": "4天",
|
||||
"priority": "中",
|
||||
"priority_score": 7,
|
||||
"publish_date": "2026-04-29",
|
||||
"status": "待处理",
|
||||
"evaluation": {
|
||||
"受众覆盖": 8,
|
||||
"独特性": 8,
|
||||
"数据可得性": 8,
|
||||
"可持续性": 8,
|
||||
"平台契合度": 8,
|
||||
"品牌契合度": 10,
|
||||
"总分": 50
|
||||
},
|
||||
"total_score": 50,
|
||||
"cases": [],
|
||||
"source_file": "008-极简3年我学会了.md",
|
||||
"created_at": "2026-04-16T07:52:48.755960"
|
||||
},
|
||||
{
|
||||
"id": "009",
|
||||
"title": "城市观鸟指南:如何在水泥森林发现 biodiversity",
|
||||
"field": "自然 / 科普",
|
||||
"format": "实操指南 + 城市生态观察",
|
||||
"word_count": "2000",
|
||||
"core_concept": "自然不在远方,就在身边;城市也是wildlife的栖息地,学会观察能提升生活幸福感",
|
||||
"audience_pain": "- 想接触自然但没时间去郊外",
|
||||
"unique_angle": "- 城市观鸟入门,从\"完全小白\"到\"常见鸟达人\"",
|
||||
"data_cases": [
|
||||
"1. 城市生物多样性调研报告(中国的城市化与野生动物)",
|
||||
"2. 常见城市鸟类图鉴(种类、特征、习性)"
|
||||
],
|
||||
"estimated_days": "3天",
|
||||
"priority": "中",
|
||||
"priority_score": 7,
|
||||
"publish_date": "2026-05-01",
|
||||
"status": "待处理",
|
||||
"evaluation": {
|
||||
"受众覆盖": 7,
|
||||
"独特性": 9,
|
||||
"数据可得性": 8,
|
||||
"可持续性": 9,
|
||||
"平台契合度": 8,
|
||||
"品牌契合度": 10,
|
||||
"总分": 51
|
||||
},
|
||||
"total_score": 51,
|
||||
"cases": [],
|
||||
"source_file": "009-城市观鸟指南.md",
|
||||
"created_at": "2026-04-16T07:52:48.756111"
|
||||
},
|
||||
{
|
||||
"id": "010",
|
||||
"title": "个人知识管理系统(PKM)实践:我用一年搭建的第二大脑",
|
||||
"field": "工作 / 生产力",
|
||||
"format": "实操教程 + 系统设计",
|
||||
"word_count": "2800",
|
||||
"core_concept": "信息时代,会学习不如会管理知识;一个适合自己的PKM系统能释放认知带宽,提升创造力和决策质量",
|
||||
"audience_pain": "- 收藏无数,但从未回看(收藏夹吃灰)",
|
||||
"unique_angle": "- 不推销特定工具,强调方法论+适合自己的选择",
|
||||
"data_cases": [
|
||||
"1. PKM方法论(Zettelkasten、PARA、CODE等)",
|
||||
"2. 工具对比研究(Notion、Obsidian、Roam、Logseq、飞书、Notability)"
|
||||
],
|
||||
"estimated_days": "5天",
|
||||
"priority": "中",
|
||||
"priority_score": 7,
|
||||
"publish_date": "2026-05-03",
|
||||
"status": "待处理",
|
||||
"evaluation": {
|
||||
"受众覆盖": 8,
|
||||
"独特性": 8,
|
||||
"数据可得性": 9,
|
||||
"可持续性": 9,
|
||||
"平台契合度": 9,
|
||||
"品牌契合度": 9,
|
||||
"总分": 52
|
||||
},
|
||||
"total_score": 52,
|
||||
"cases": [],
|
||||
"source_file": "010-PKM实践.md",
|
||||
"created_at": "2026-04-16T07:52:48.756300"
|
||||
}
|
||||
]
|
||||
@@ -1,392 +0,0 @@
|
||||
[
|
||||
{
|
||||
"id": "A01",
|
||||
"title": "远程工作2026中国指南:从'不可能'到'可行'的路径图",
|
||||
"field": "未来工作方式",
|
||||
"format": "趋势洞察 + 实操指南",
|
||||
"core_concept": "通过法律实操(合同、社保、个税)和心理建设(孤独应对),在中国环境下实现远程工作",
|
||||
"audience_pain": "想远程但不知如何合法操作,担心被边缘化",
|
||||
"unique_angle": "对比GitLab/Zapier海外实践,本土化落地策略",
|
||||
"priority": "高",
|
||||
"priority_score": 10,
|
||||
"total_score": 53,
|
||||
"status": "待发布",
|
||||
"cases": [],
|
||||
"source_file": "strategy/全球-本土比较研究与全新内容战略规划-2026-04-15.md",
|
||||
"created_at": "2026-04-16T09:42:54.436643",
|
||||
"ready_at": "2026-04-18",
|
||||
"compliance_score": 100,
|
||||
"lock_by": null,
|
||||
"lock_at": null,
|
||||
"platform_urls": {},
|
||||
"published_at": null
|
||||
},
|
||||
{
|
||||
"id": "A02",
|
||||
"title": "AI副业入门:用DeepSeek实现第一笔收入的100天",
|
||||
"field": "未来工作方式",
|
||||
"format": "实操指南 + 案例研究",
|
||||
"core_concept": "从代写文案/数据分析起步,通过Fiverr国内外平台对比,制定定价策略和违规红线规避",
|
||||
"audience_pain": "想用AI赚钱但不知从何开始,怕踩坑",
|
||||
"unique_angle": "对比Fiverr海外繁荣 vs 国内空白,提供本土化接单路径",
|
||||
"priority": "高",
|
||||
"priority_score": 10,
|
||||
"total_score": 52,
|
||||
"status": "待发布",
|
||||
"cases": [],
|
||||
"source_file": "strategy/全球-本土比较研究与全新内容战略规划-2026-04-15.md",
|
||||
"created_at": "2026-04-16T09:42:54.436654",
|
||||
"ready_at": "2026-04-19",
|
||||
"compliance_score": 100,
|
||||
"lock_by": null,
|
||||
"lock_at": null
|
||||
},
|
||||
{
|
||||
"id": "A03",
|
||||
"title": "数字游民签证全解析:30个国家政策对比,中国护照能去哪些?",
|
||||
"field": "未来工作方式",
|
||||
"format": "对比分析 + 实操指南",
|
||||
"core_concept": "分析爱沙尼亚/葡萄牙/巴厘岛等30国游民签证,结合中国护照限制,给出签证+保险+税务+社群的完整路线",
|
||||
"audience_pain": "想地理套利但被签证和社保困扰",
|
||||
"unique_angle": "不是简单列出签证,而是给出中国护照持有者的可行组合方案(如泰国+大马+巴厘岛)",
|
||||
"priority": "高",
|
||||
"priority_score": 10,
|
||||
"total_score": 51,
|
||||
"status": "待处理",
|
||||
"cases": [],
|
||||
"source_file": "strategy/全球-本土比较研究与全新内容战略规划-2026-04-15.md",
|
||||
"created_at": "2026-04-16T09:42:54.436656",
|
||||
"ready_at": "2026-04-16",
|
||||
"compliance_score": 100
|
||||
},
|
||||
{
|
||||
"id": "A04",
|
||||
"title": "一人公司实验:从创意到营收的365天日志",
|
||||
"field": "未来工作方式",
|
||||
"format": "实践日志 + 方法论",
|
||||
"core_concept": "基于Indie Hackers案例,结合中国孤独创业现状,提供MVP设计、现金流管理、法律合规的一站式指南",
|
||||
"audience_pain": "想单干但怕失败、缺启动资金、不懂营销",
|
||||
"unique_angle": "真实日志形式,展示完整从0到营收的过程,不美化",
|
||||
"priority": "高",
|
||||
"priority_score": 10,
|
||||
"total_score": 50,
|
||||
"status": "待处理",
|
||||
"cases": [],
|
||||
"source_file": "strategy/全球-本土比较研究与全新内容战略规划-2026-04-15.md",
|
||||
"created_at": "2026-04-16T09:42:54.436658",
|
||||
"ready_at": "2026-04-16",
|
||||
"compliance_score": 100
|
||||
},
|
||||
{
|
||||
"id": "A05",
|
||||
"title": "AI时代的技能组合:什么技能值得投入10年?",
|
||||
"field": "未来工作方式",
|
||||
"format": "趋势分析 + 个人规划",
|
||||
"core_concept": "基于WEF未来技能报告,划分4个技能维度(AI强化型、AI无法替代、复合型、过时型),帮中国职场人识别护城河技能",
|
||||
"audience_pain": "学什么都不放心,怕投入时间后AI又取代",
|
||||
"unique_angle": "将全球宏观报告转化为个人技能地图,提供可视化工具",
|
||||
"priority": "中",
|
||||
"priority_score": 7,
|
||||
"total_score": 50,
|
||||
"status": "待处理",
|
||||
"cases": [],
|
||||
"source_file": "strategy/全球-本土比较研究与全新内容战略规划-2026-04-15.md",
|
||||
"created_at": "2026-04-16T09:42:54.436660",
|
||||
"ready_at": "2026-04-17",
|
||||
"compliance_score": 100
|
||||
},
|
||||
{
|
||||
"id": "B01",
|
||||
"title": "城市农业ROI报告:20㎡阳台种菜一年,省了多少钱?",
|
||||
"field": "可持续生活系统",
|
||||
"format": "数据分析 + 实操指南",
|
||||
"core_concept": "对比东京垂直农场与国内空间限制,精选高ROI蔬菜品种,智能设备自动灌溉,给出详细成本核算和品种推荐",
|
||||
"audience_pain": "想种但怕麻烦、怕亏本、不知道种什么",
|
||||
"unique_angle": "用财务思维算账(投入/产出/时间成本),打破'种菜必须有地'的思维",
|
||||
"priority": "高",
|
||||
"priority_score": 10,
|
||||
"total_score": 52,
|
||||
"status": "待处理",
|
||||
"cases": [],
|
||||
"source_file": "strategy/全球-本土比较研究与全新内容战略规划-2026-04-15.md",
|
||||
"created_at": "2026-04-16T09:42:54.436665",
|
||||
"ready_at": "2026-04-16",
|
||||
"compliance_score": 100
|
||||
},
|
||||
{
|
||||
"id": "B02",
|
||||
"title": "零浪费家庭实验:一年只产100L垃圾,可能吗?",
|
||||
"field": "可持续生活系统",
|
||||
"format": "实践实验 + 方法论",
|
||||
"core_concept": "对比瑞典零浪费城市,针对中国垃圾分类困境,提供垃圾追踪表、替代方案数据库、社区互助网络",
|
||||
"audience_pain": "想环保但觉得做不到、不知道从哪减",
|
||||
"unique_angle": "极限实验(100L/年)+ 可执行步骤(从塑料减量开始),不理想化",
|
||||
"priority": "高",
|
||||
"priority_score": 10,
|
||||
"total_score": 51,
|
||||
"status": "待处理",
|
||||
"cases": [],
|
||||
"source_file": "strategy/全球-本土比较研究与全新内容战略规划-2026-04-15.md",
|
||||
"created_at": "2026-04-16T09:42:54.436667",
|
||||
"ready_at": "2026-04-16",
|
||||
"compliance_score": 100
|
||||
},
|
||||
{
|
||||
"id": "B03",
|
||||
"title": "低碳生活账单:用3年省了8万,碳足迹降了60%",
|
||||
"field": "可持续生活系统",
|
||||
"format": "数据分析 + 案例研究",
|
||||
"core_concept": "对比欧洲碳税政策,从交通(电动车+共享)、饮食(植物为主)、消费(二手优先)三个维度,展示真实账单变化",
|
||||
"audience_pain": "觉得低碳=更贵,不敢尝试",
|
||||
"unique_angle": "用财务数据说话(省8万),打破'环保=烧钱'误解",
|
||||
"priority": "高",
|
||||
"priority_score": 10,
|
||||
"total_score": 50,
|
||||
"status": "待处理",
|
||||
"cases": [],
|
||||
"source_file": "strategy/全球-本土比较研究与全新内容战略规划-2026-04-15.md",
|
||||
"created_at": "2026-04-16T09:42:54.436669",
|
||||
"ready_at": "2026-04-16",
|
||||
"compliance_score": 100
|
||||
},
|
||||
{
|
||||
"id": "B04",
|
||||
"title": "循环消费实战:10件物品,用3年省了2万",
|
||||
"field": "可持续生活系统",
|
||||
"format": "实操指南 + 案例清单",
|
||||
"core_concept": "对比法国二手强制法与中国闲鱼文化,提供购买决策树(买新/二手/租)、延长寿命技巧、转卖策略",
|
||||
"audience_pain": "想买二手但怕质量差、怕麻烦",
|
||||
"unique_angle": "10件物品的具体交易记录和对比(手机、相机、家具等),可复制",
|
||||
"priority": "中",
|
||||
"priority_score": 7,
|
||||
"total_score": 50,
|
||||
"status": "待处理",
|
||||
"cases": [],
|
||||
"source_file": "strategy/全球-本土比较研究与全新内容战略规划-2026-04-15.md",
|
||||
"created_at": "2026-04-16T09:42:54.436671",
|
||||
"ready_at": "2026-04-17",
|
||||
"compliance_score": 100
|
||||
},
|
||||
{
|
||||
"id": "B05",
|
||||
"title": "社区菜园指南:如何推动小区5户邻居共建共享",
|
||||
"field": "可持续生活系统",
|
||||
"format": "方法论 + 实操步骤",
|
||||
"core_concept": "对比纽约社区花园政策与中国物业协调难题,提供法律风险(物权)、利益分配机制、技术方案(分区+智能)",
|
||||
"audience_pain": "想组织但怕纠纷、不懂法律、协调不了邻居",
|
||||
"unique_angle": "从1个友好小区试点开始,成功后复制,降低风险",
|
||||
"priority": "高",
|
||||
"priority_score": 10,
|
||||
"total_score": 49,
|
||||
"status": "待处理",
|
||||
"cases": [],
|
||||
"source_file": "strategy/全球-本土比较研究与全新内容战略规划-2026-04-15.md",
|
||||
"created_at": "2026-04-16T09:42:54.436673",
|
||||
"ready_at": "2026-04-16",
|
||||
"compliance_score": 100
|
||||
},
|
||||
{
|
||||
"id": "C01",
|
||||
"title": "第二大脑2.0:用DeepSeek+本地向量库建立私有知识系统",
|
||||
"field": "个人知识工厂",
|
||||
"format": "技术指南 + 实操案例",
|
||||
"core_concept": "对比Obsidian+RAG海外实践,针对国内云服务担忧,提供数据主权、隐私保护、无缝检索、AI问答的本地化方案",
|
||||
"audience_pain": "想系统化知识但担心云存储安全,怕复杂",
|
||||
"unique_angle": "强调数据主权,从API调用到本地部署的渐进路线",
|
||||
"priority": "中",
|
||||
"priority_score": 7,
|
||||
"total_score": 52,
|
||||
"status": "待处理",
|
||||
"cases": [],
|
||||
"source_file": "strategy/全球-本土比较研究与全新内容战略规划-2026-04-15.md",
|
||||
"created_at": "2026-04-16T09:42:54.436675",
|
||||
"ready_at": "2026-04-18",
|
||||
"compliance_score": 100
|
||||
},
|
||||
{
|
||||
"id": "C02",
|
||||
"title": "PKM极简实践:PARA系统在Notion上的落地模板",
|
||||
"field": "个人知识工厂",
|
||||
"format": "模板分享 + 方法论",
|
||||
"core_concept": "将Tiago Forte的PARA体系简化为3个核心文件夹,每周10分钟维护,AI辅助整理,让中国人真正用起来",
|
||||
"audience_pain": "学了方法坚持不了,工具复杂难上手",
|
||||
"unique_angle": "极简版(4个区)+ 每日5分钟习惯养成,降低门槛",
|
||||
"priority": "中",
|
||||
"priority_score": 7,
|
||||
"total_score": 51,
|
||||
"status": "待处理",
|
||||
"cases": [],
|
||||
"source_file": "strategy/全球-本土比较研究与全新内容战略规划-2026-04-15.md",
|
||||
"created_at": "2026-04-16T09:42:54.436677"
|
||||
},
|
||||
{
|
||||
"id": "C03",
|
||||
"title": "费曼学习法AI增强:如何让AI帮你'教'懂一个概念",
|
||||
"field": "个人知识工厂",
|
||||
"format": "方法论 + 实践工具",
|
||||
"core_concept": "结合经典费曼技巧与AI工具,三步法(AI简化→自我复述→Gap识别)+ 输出倒逼输入",
|
||||
"audience_pain": "学东西记不住,自以为懂了但其实不会",
|
||||
"unique_angle": "用AI当'测试官',验证你的理解深度,非被动接受知识",
|
||||
"priority": "中",
|
||||
"priority_score": 7,
|
||||
"total_score": 50,
|
||||
"status": "待处理",
|
||||
"cases": [],
|
||||
"source_file": "strategy/全球-本土比较研究与全新内容战略规划-2026-04-15.md",
|
||||
"created_at": "2026-04-16T09:42:54.436679"
|
||||
},
|
||||
{
|
||||
"id": "C04",
|
||||
"title": "AI个人助理搭建:从ChatGPT到私有化部署的完整路线",
|
||||
"field": "个人知识工厂",
|
||||
"format": "技术路线图 + 成本分析",
|
||||
"core_concept": "基于海外个人AI助手普及现状,针对国内数据安全顾虑,提供从API调用到本地部署的渐进式方案(成本可控)",
|
||||
"audience_pain": "想用AI助手但又怕数据泄露,不知如何起步",
|
||||
"unique_angle": "不是直接推本地部署(成本高),而是API优先,敏感时再本地策略",
|
||||
"priority": "中",
|
||||
"priority_score": 7,
|
||||
"total_score": 50,
|
||||
"status": "待处理",
|
||||
"cases": [],
|
||||
"source_file": "strategy/全球-本土比较研究与全新内容战略规划-2026-04-15.md",
|
||||
"created_at": "2026-04-16T09:42:54.436680"
|
||||
},
|
||||
{
|
||||
"id": "C05",
|
||||
"title": "技能树可视化:用思维导图规划5年职业路径",
|
||||
"field": "个人知识工厂",
|
||||
"format": "方法论 + 工具模板",
|
||||
"core_concept": "借鉴化工业界能力模型,构建硬技能×软技能矩阵,行业对标和学习资源聚合,让职业成长可规划",
|
||||
"audience_pain": "不知道学什么,学了不知道用在哪,职业迷茫",
|
||||
"unique_angle": "技能树而非技能列表,展示技能间关联和成长路径",
|
||||
"priority": "中",
|
||||
"priority_score": 7,
|
||||
"total_score": 49,
|
||||
"status": "待处理",
|
||||
"cases": [],
|
||||
"source_file": "strategy/全球-本土比较研究与全新内容战略规划-2026-04-15.md",
|
||||
"created_at": "2026-04-16T09:42:54.436682"
|
||||
},
|
||||
{
|
||||
"id": "D01",
|
||||
"title": "AI伦理实践指南:开发者在中国的合规清单",
|
||||
"field": "科技人文交叉",
|
||||
"format": "合规指南 + 案例分析",
|
||||
"core_concept": "对比EU AI Act与中国算法推荐管理规定,提供数据隐私、歧视检测、透明度义务、备案流程的自查清单",
|
||||
"audience_pain": "开发者不了解国内AI伦理法规,怕踩雷",
|
||||
"unique_angle": "不是泛泛而谈伦理,而是具体到'备案流程'和'自查表',即拿即用",
|
||||
"priority": "高",
|
||||
"priority_score": 10,
|
||||
"total_score": 51,
|
||||
"status": "待处理",
|
||||
"cases": [],
|
||||
"source_file": "strategy/全球-本土比较研究与全新内容战略规划-2026-04-15.md",
|
||||
"created_at": "2026-04-16T09:42:54.436687",
|
||||
"ready_at": "2026-04-16",
|
||||
"compliance_score": 100
|
||||
},
|
||||
{
|
||||
"id": "D02",
|
||||
"title": "数字排毒月:戒掉微信/抖音后,生活发生了什么",
|
||||
"field": "科技人文交叉",
|
||||
"format": "实践实验 + 效果分析",
|
||||
"core_concept": "对比硅谷禅修热与中国'失联恐惧',采用渐进式戒断(无屏时段)+ 替代活动 + 社交边界管理",
|
||||
"audience_pain": "想减少屏幕时间但又怕错过重要信息,自律困难",
|
||||
"unique_angle": "真实实验记录(not理论),展示戒断前后的生活变化数据",
|
||||
"priority": "中",
|
||||
"priority_score": 7,
|
||||
"total_score": 50,
|
||||
"status": "待处理",
|
||||
"cases": [],
|
||||
"source_file": "strategy/全球-本土比较研究与全新内容战略规划-2026-04-15.md",
|
||||
"created_at": "2026-04-16T09:42:54.436689"
|
||||
},
|
||||
{
|
||||
"id": "D03",
|
||||
"title": "银发科技报告:给爸妈装智能设备,学到的5个设计原则",
|
||||
"field": "科技人文交叉",
|
||||
"format": "设计原则 + 案例",
|
||||
"core_concept": "对比日本适老化设计与国产'适老模式'鸡肋,提炼简化选项、物理反馈、容错设计、情感连接的具体方案",
|
||||
"audience_pain": "给父母买智能设备但他们不用,功能复杂",
|
||||
"unique_angle": "不是推荐产品,而是总结5个设计原则,让读者自己改造设备",
|
||||
"priority": "中",
|
||||
"priority_score": 7,
|
||||
"total_score": 49,
|
||||
"status": "待处理",
|
||||
"cases": [],
|
||||
"source_file": "strategy/全球-本土比较研究与全新内容战略规划-2026-04-15.md",
|
||||
"created_at": "2026-04-16T09:42:54.436690"
|
||||
},
|
||||
{
|
||||
"id": "D04",
|
||||
"title": "儿童数字素养课:10岁儿子的AI启蒙12周",
|
||||
"field": "科技人文交叉",
|
||||
"format": "教育日志 + 方法论",
|
||||
"core_concept": "对比芬兰AI教育与国内家长'禁止接触'心态,通过每周1次'AI家庭时间',培养批判性思维和创造力",
|
||||
"audience_pain": "不知如何让孩子正确认识AI,怕沉迷又怕脱节",
|
||||
"unique_angle": "真实父子12周项目记录,提供可复制的课程大纲",
|
||||
"priority": "中",
|
||||
"priority_score": 7,
|
||||
"total_score": 48,
|
||||
"status": "待处理",
|
||||
"cases": [],
|
||||
"source_file": "strategy/全球-本土比较研究与全新内容战略规划-2026-04-15.md",
|
||||
"created_at": "2026-04-16T09:42:54.436692"
|
||||
},
|
||||
{
|
||||
"id": "D05",
|
||||
"title": "科技与自然共生:如何用AI让阳台农场更'自然'",
|
||||
"field": "科技人文交叉",
|
||||
"format": "理念 + 实操方案",
|
||||
"core_concept": "对比荷兰智能温室与中国人'回归原始'误区,实现技术隐形化(传感器+提醒)+ 自然反馈闭环 + 人工仪式感",
|
||||
"audience_pain": "想用科技但又怕失去'自然感',追求矛盾",
|
||||
"unique_angle": "技术与情感连接的平衡方案,AI只做幕后,人工保留仪式",
|
||||
"priority": "高",
|
||||
"priority_score": 10,
|
||||
"total_score": 48,
|
||||
"status": "待处理",
|
||||
"cases": [],
|
||||
"source_file": "strategy/全球-本土比较研究与全新内容战略规划-2026-04-15.md",
|
||||
"created_at": "2026-04-16T09:42:54.436694",
|
||||
"ready_at": "2026-04-16",
|
||||
"compliance_score": 100
|
||||
},
|
||||
{
|
||||
"id": "TOPIC-.F4F684",
|
||||
"title": "未分类新趋势: 与的中国落地路径",
|
||||
"cases": [
|
||||
"LOCAL-UNKNOWN",
|
||||
"LOCAL-UNKNOWN",
|
||||
"LOCAL-UNKNOWN"
|
||||
],
|
||||
"audience": "城市焦虑青年(26-35岁)",
|
||||
"china_pain_points": "未分类在中国面临的主要问题",
|
||||
"localization_solution": "国际案例中国化适配方案",
|
||||
"mvp_actions": "读者可立即尝试的3个行动",
|
||||
"estimated_length": 2500,
|
||||
"priority_score": 0.78,
|
||||
"status": "待处理",
|
||||
"lock_by": null,
|
||||
"lock_at": null,
|
||||
"created_at": "2026-04-18T18:26:25.984697"
|
||||
},
|
||||
{
|
||||
"id": "TOPIC-.285EC9",
|
||||
"title": "未分类新趋势: 与的中国落地路径",
|
||||
"cases": [
|
||||
"LOCAL-UNKNOWN",
|
||||
"LOCAL-UNKNOWN",
|
||||
"LOCAL-UNKNOWN"
|
||||
],
|
||||
"audience": "城市焦虑青年(26-35岁)",
|
||||
"china_pain_points": "未分类在中国面临的主要问题",
|
||||
"localization_solution": "国际案例中国化适配方案",
|
||||
"mvp_actions": "读者可立即尝试的3个行动",
|
||||
"estimated_length": 2500,
|
||||
"priority_score": 0.78,
|
||||
"status": "待处理",
|
||||
"lock_by": null,
|
||||
"lock_at": null,
|
||||
"created_at": "2026-04-19T05:00:54.473396"
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,187 @@
|
||||
{
|
||||
"date": "2026-05-10",
|
||||
"gaps": [
|
||||
{
|
||||
"domain": "远程工作",
|
||||
"topic": "远程工作2.0时代",
|
||||
"reason": "疫情后远程工作模式持续升级,企业与员工探索新型协作方式",
|
||||
"hot_keywords": [
|
||||
"异步协作",
|
||||
"数字游牧",
|
||||
"远程团队管理"
|
||||
],
|
||||
"platform": "知乎"
|
||||
},
|
||||
{
|
||||
"domain": "AI工具",
|
||||
"topic": "AI绘画工具大战",
|
||||
"reason": "MidJourney、Stable Diffusion等工具更新迭代,用户创作热情高涨",
|
||||
"hot_keywords": [
|
||||
"AI绘画",
|
||||
"提示词工程",
|
||||
"商用授权"
|
||||
],
|
||||
"platform": "微博"
|
||||
},
|
||||
{
|
||||
"domain": "可持续生活",
|
||||
"topic": "低碳生活实践",
|
||||
"reason": "碳中和目标推动下,个人可持续生活方式成为热门讨论",
|
||||
"hot_keywords": [
|
||||
"零废弃",
|
||||
"二手经济",
|
||||
"绿色出行"
|
||||
],
|
||||
"platform": "小红书"
|
||||
},
|
||||
{
|
||||
"domain": "知识管理",
|
||||
"topic": "第二大脑(Zettelkasten)",
|
||||
"reason": "知识工作者追求高效学习与输出,个人知识管理系统流行",
|
||||
"hot_keywords": [
|
||||
"Obsidian",
|
||||
"卡片笔记法",
|
||||
"知识连接"
|
||||
],
|
||||
"platform": "知乎"
|
||||
},
|
||||
{
|
||||
"domain": "数字生活",
|
||||
"topic": "数字极简主义",
|
||||
"reason": "信息过载背景下,用户开始主动减少数字干扰",
|
||||
"hot_keywords": [
|
||||
"数字断舍离",
|
||||
"专注力管理",
|
||||
"低刺激设计"
|
||||
],
|
||||
"platform": "微博"
|
||||
},
|
||||
{
|
||||
"domain": "科技人文",
|
||||
"topic": "元宇宙伦理",
|
||||
"reason": "虚拟世界发展引发关于隐私、身份与社会关系的深度讨论",
|
||||
"hot_keywords": [
|
||||
"数字身份",
|
||||
"虚拟伦理",
|
||||
"元宇宙治理"
|
||||
],
|
||||
"platform": "知乎"
|
||||
},
|
||||
{
|
||||
"domain": "远程工作",
|
||||
"topic": "远程工作税务问题",
|
||||
"reason": "跨境远程工作带来的税务合规性成为热议焦点",
|
||||
"hot_keywords": [
|
||||
"远程税务",
|
||||
"数字游牧税",
|
||||
"跨境合规"
|
||||
],
|
||||
"platform": "微博"
|
||||
},
|
||||
{
|
||||
"domain": "AI工具",
|
||||
"topic": "AI辅助写作",
|
||||
"reason": "ChatGPT等工具推动内容创作效率提升,引发创作伦理讨论",
|
||||
"hot_keywords": [
|
||||
"AI写作",
|
||||
"内容原创性",
|
||||
"AI辅助创作"
|
||||
],
|
||||
"platform": "小红书"
|
||||
},
|
||||
{
|
||||
"domain": "可持续生活",
|
||||
"topic": "城市垂直农业",
|
||||
"reason": "城市化进程中,本地化食品生产成为可持续发展新方向",
|
||||
"hot_keywords": [
|
||||
"屋顶农场",
|
||||
"水培种植",
|
||||
"本地供应链"
|
||||
],
|
||||
"platform": "知乎"
|
||||
},
|
||||
{
|
||||
"domain": "数字生活",
|
||||
"topic": "数字遗产管理",
|
||||
"reason": "数字资产继承问题随着老龄化社会到来受到关注",
|
||||
"hot_keywords": [
|
||||
"数字遗嘱",
|
||||
"账号继承",
|
||||
"数字身后事"
|
||||
],
|
||||
"platform": "微博"
|
||||
}
|
||||
],
|
||||
"suggestions": [
|
||||
{
|
||||
"title": "远程工作2.0:企业与员工的新协作",
|
||||
"field": "职场与管理",
|
||||
"core_concept": "疫情后远程工作模式持续升级,企业与员工探索新型协作方式",
|
||||
"audience_pain": "如何在远程工作中保持高效协作与团队凝聚力",
|
||||
"unique_angle": "从企业与员工双方视角分析远程工作2.0的实践与挑战"
|
||||
},
|
||||
{
|
||||
"title": "AI绘画工具大战:创作革命还是泡沫?",
|
||||
"field": "科技与创意",
|
||||
"core_concept": "MidJourney、Stable Diffusion等工具更新迭代,用户创作热情高涨",
|
||||
"audience_pain": "如何在AI工具辅助下提升创作效率与质量",
|
||||
"unique_angle": "探讨AI绘画工具对传统艺术行业的影响与未来发展趋势"
|
||||
},
|
||||
{
|
||||
"title": "低碳生活实践:你的每个选择都在改变世界",
|
||||
"field": "环保与可持续",
|
||||
"core_concept": "碳中和目标推动下,个人可持续生活方式成为热门讨论",
|
||||
"audience_pain": "如何在日常生活中实践低碳,减少个人碳足迹",
|
||||
"unique_angle": "从个人行为到社会影响,探索低碳生活的实践与意义"
|
||||
},
|
||||
{
|
||||
"title": "第二大脑:知识管理的终极武器",
|
||||
"field": "学习与生产力",
|
||||
"core_concept": "知识工作者追求高效学习与输出,个人知识管理系统流行",
|
||||
"audience_pain": "如何高效管理知识,提升学习与工作效率",
|
||||
"unique_angle": "Zettelkasten方法的实践与优化,适用于不同场景的知识管理技巧"
|
||||
},
|
||||
{
|
||||
"title": "数字极简主义:减少干扰,提升专注力",
|
||||
"field": "数字生活",
|
||||
"core_concept": "信息过载背景下,用户开始主动减少数字干扰",
|
||||
"audience_pain": "如何在数字化时代保持专注,减少信息过载",
|
||||
"unique_angle": "数字极简主义的实践方法与工具推荐,提升生活质量"
|
||||
},
|
||||
{
|
||||
"title": "元宇宙伦理:虚拟世界的道德边界",
|
||||
"field": "科技与人文",
|
||||
"core_concept": "虚拟世界发展引发关于隐私、身份与社会关系的深度讨论",
|
||||
"audience_pain": "如何在元宇宙中保护个人隐私与身份安全",
|
||||
"unique_angle": "探讨元宇宙伦理的核心问题与可能的解决方案"
|
||||
},
|
||||
{
|
||||
"title": "远程工作税务问题:跨境远程工作的合规指南",
|
||||
"field": "职场与财务",
|
||||
"core_concept": "跨境远程工作带来的税务合规性成为热议焦点",
|
||||
"audience_pain": "如何在跨境远程工作中遵守税务法规,避免合规风险",
|
||||
"unique_angle": "从法律与实践角度分析远程工作税务问题的解决方案"
|
||||
},
|
||||
{
|
||||
"title": "AI辅助写作:创作效率的提升与伦理的思考",
|
||||
"field": "科技与创意",
|
||||
"core_concept": "ChatGPT等工具推动内容创作效率提升,引发创作伦理讨论",
|
||||
"audience_pain": "如何利用AI工具提升创作效率,同时保持内容原创性",
|
||||
"unique_angle": "探讨AI辅助写作的最佳实践与伦理边界"
|
||||
},
|
||||
{
|
||||
"title": "城市垂直农业:未来食品生产的新方向",
|
||||
"field": "环保与可持续",
|
||||
"core_concept": "城市化进程中,本地化食品生产成为可持续发展新方向",
|
||||
"audience_pain": "如何在城市中实现可持续的食品生产与供应",
|
||||
"unique_angle": "城市垂直农业的技术与实践,探索未来食品生产的可能性"
|
||||
},
|
||||
{
|
||||
"title": "数字遗产管理:老龄化社会的新挑战",
|
||||
"field": "数字生活",
|
||||
"core_concept": "数字资产继承问题随着老龄化社会到来受到关注",
|
||||
"audience_pain": "如何管理与传承数字资产,避免遗产纠纷",
|
||||
"unique_angle": "数字遗产管理的法律与实践指南,保护个人数字资产"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
set -e
|
||||
|
||||
PROJECT_ROOT="/root/.openclaw/workspaces/yzr-yxl/projects/yu-zhi-ran"
|
||||
PROJECT_ROOT="/root/openclaw-workspace/projects/yu-zhi-ran"
|
||||
MARKDOWN_FILE="$PROJECT_ROOT/content/drafts/001-wechat.md"
|
||||
COVER_IMG="$PROJECT_ROOT/content/publishing/images/05-封面图.png"
|
||||
|
||||
|
||||
@@ -1,138 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
将 Markdown 文章转换为 Word 文档,嵌入图片
|
||||
"""
|
||||
|
||||
import os
|
||||
import re
|
||||
from docx import Document
|
||||
from docx.shared import Inches, Pt, RGBColor
|
||||
from docx.enum.text import WD_ALIGN_PARAGRAPH
|
||||
|
||||
# 路径配置
|
||||
MARKDOWN_FILE = "/root/.openclaw/workspaces/yzr-yxl/projects/yu-zhi-ran/content/published/2026-04-14-上海阳台种菜一年/final-article.md"
|
||||
IMAGES_DIR = "/root/.openclaw/workspaces/yzr-yxl/projects/yu-zhi-ran/content/publishing/images"
|
||||
OUTPUT_DOCX = "/root/.openclaw/workspaces/yzr-yxl/projects/yu-zhi-ran/content/published/2026-04-14-上海阳台种菜一年/上海阳台种菜一年_最终版.docx"
|
||||
|
||||
# 读取 Markdown
|
||||
with open(MARKDOWN_FILE, "r", encoding="utf-8") as f:
|
||||
lines = f.readlines()
|
||||
|
||||
doc = Document()
|
||||
doc.styles['Normal'].font.name = '微软雅黑'
|
||||
doc.styles['Normal'].font.size = Pt(11)
|
||||
|
||||
# 样式函数
|
||||
def add_heading(text, level=1):
|
||||
heading = doc.add_heading(text, level=level)
|
||||
heading.alignment = WD_ALIGN_PARAGRAPH.LEFT
|
||||
return heading
|
||||
|
||||
def add_paragraph(text, bold=False, italic=False):
|
||||
p = doc.add_paragraph()
|
||||
run = p.add_run(text)
|
||||
run.bold = bold
|
||||
run.italic = italic
|
||||
return p
|
||||
|
||||
# 解析 Markdown
|
||||
in_code_block = False
|
||||
in_table = False
|
||||
table_data = []
|
||||
|
||||
for i, line in enumerate(lines):
|
||||
line = line.rstrip('\n')
|
||||
|
||||
# 代码块跳过
|
||||
if line.startswith('```'):
|
||||
in_code_block = not in_code_block
|
||||
continue
|
||||
if in_code_block:
|
||||
continue
|
||||
|
||||
# 标题
|
||||
if line.startswith('# '):
|
||||
add_heading(line[2:], level=1)
|
||||
continue
|
||||
if line.startswith('## '):
|
||||
add_heading(line[3:], level=2)
|
||||
continue
|
||||
if line.startswith('### '):
|
||||
add_heading(line[4:], level=3)
|
||||
continue
|
||||
|
||||
# 表格处理(简化:将表格转为文本,图片位置用占位)
|
||||
if line.startswith('|'):
|
||||
in_table = True
|
||||
table_data.append(line)
|
||||
continue
|
||||
if in_table and not line.startswith('|'):
|
||||
in_table = False
|
||||
# 可以在此转换表格,为简化直接跳过
|
||||
continue
|
||||
|
||||
# 图片:
|
||||
img_match = re.match(r'!\[(.*?)\]\((images/.*?)\)', line)
|
||||
if img_match:
|
||||
alt, path = img_match.groups()
|
||||
img_full_path = os.path.join(os.path.dirname(MARKDOWN_FILE), path)
|
||||
if os.path.exists(img_full_path):
|
||||
try:
|
||||
# 插入图片,宽度 6 英寸(约 15cm)
|
||||
doc.add_picture(img_full_path, width=Inches(6))
|
||||
# 居中
|
||||
last_para = doc.paragraphs[-1]
|
||||
last_para.alignment = WD_ALIGN_PARAGRAPH.CENTER
|
||||
# 添加图片说明(可选)
|
||||
if alt:
|
||||
cap = doc.add_paragraph(alt)
|
||||
cap.alignment = WD_ALIGN_PARAGRAPH.CENTER
|
||||
cap.style = 'Caption'
|
||||
except Exception as e:
|
||||
doc.add_paragraph(f"[图片加载失败: {path}]")
|
||||
else:
|
||||
doc.add_paragraph(f"[图片缺失: {img_full_path}]")
|
||||
continue
|
||||
|
||||
# 引用
|
||||
if line.startswith('> '):
|
||||
p = doc.add_paragraph(line[2:])
|
||||
p.paragraph_format.left_indent = Inches(0.5)
|
||||
p.italic = True
|
||||
continue
|
||||
|
||||
# 列表
|
||||
if re.match(r'^[-*] ', line):
|
||||
p = doc.add_paragraph(line[2:], style='List Bullet')
|
||||
continue
|
||||
if re.match(r'^\d+\. ', line):
|
||||
p = doc.add_paragraph(line[line.find('.')+2:], style='List Number')
|
||||
continue
|
||||
|
||||
# 分隔线
|
||||
if line.strip() == '---':
|
||||
doc.add_paragraph('_' * 50)
|
||||
continue
|
||||
|
||||
# 普通段落
|
||||
if line.strip():
|
||||
# 处理行内加粗、斜体
|
||||
p = doc.add_paragraph()
|
||||
parts = re.split(r'(\*\*[^*]+\*\*|\*[^*]+\*)', line)
|
||||
for part in parts:
|
||||
if part.startswith('**') and part.endswith('**'):
|
||||
run = p.add_run(part[2:-2])
|
||||
run.bold = True
|
||||
elif part.startswith('*') and part.endswith('*'):
|
||||
run = p.add_run(part[1:-1])
|
||||
run.italic = True
|
||||
else:
|
||||
run = p.add_run(part)
|
||||
else:
|
||||
doc.add_paragraph() # 空行
|
||||
|
||||
# 保存文档
|
||||
doc.save(OUTPUT_DOCX)
|
||||
print(f"✅ Word 文档已生成: {OUTPUT_DOCX}")
|
||||
print(f"📄 页数: {len(doc.paragraphs)} 段落")
|
||||
print(f"🖼️ 图片路径: {IMAGES_DIR}")
|
||||
@@ -1,93 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
生成 Word 文档,图片从发布目录的 images 文件夹读取
|
||||
"""
|
||||
|
||||
import os
|
||||
from docx import Document
|
||||
from docx.shared import Inches, Pt
|
||||
from docx.enum.text import WD_ALIGN_PARAGRAPH
|
||||
|
||||
BASE_DIR = "/root/.openclaw/workspaces/yzr-yxl/projects/yu-zhi-ran/content/published/2026-04-14-上海阳台种菜一年"
|
||||
MD_FILE = os.path.join(BASE_DIR, "final-article.md")
|
||||
IMAGES_DIR = os.path.join(BASE_DIR, "images") # 已复制的图片
|
||||
OUTPUT_DOCX = os.path.join(BASE_DIR, "上海阳台种菜一年_最终版.docx")
|
||||
|
||||
with open(MD_FILE, "r", encoding="utf-8") as f:
|
||||
lines = f.readlines()
|
||||
|
||||
doc = Document()
|
||||
doc.styles['Normal'].font.name = '微软雅黑'
|
||||
doc.styles['Normal'].font.size = Pt(11)
|
||||
|
||||
def add_heading(text, level=1):
|
||||
heading = doc.add_heading(text, level=level)
|
||||
heading.alignment = WD_ALIGN_PARAGRAPH.LEFT
|
||||
return heading
|
||||
|
||||
for line in lines:
|
||||
line = line.rstrip('\n')
|
||||
|
||||
if line.startswith('# '):
|
||||
add_heading(line[2:], level=1)
|
||||
continue
|
||||
if line.startswith('## '):
|
||||
add_heading(line[3:], level=2)
|
||||
continue
|
||||
if line.startswith('### '):
|
||||
add_heading(line[4:], level=3)
|
||||
continue
|
||||
if line.startswith('---'):
|
||||
doc.add_paragraph('_' * 60)
|
||||
continue
|
||||
|
||||
# 图片
|
||||
if line.startswith('!['):
|
||||
import re
|
||||
m = re.match(r'!\[(.*?)\]\((images/.*?)\)', line)
|
||||
if m:
|
||||
alt, fname = m.groups()
|
||||
img_path = os.path.join(IMAGES_DIR, os.path.basename(fname))
|
||||
if os.path.exists(img_path):
|
||||
try:
|
||||
doc.add_picture(img_path, width=Inches(6))
|
||||
last_para = doc.paragraphs[-1]
|
||||
last_para.alignment = WD_ALIGN_PARAGRAPH.CENTER
|
||||
except Exception as e:
|
||||
doc.add_paragraph(f"[图片错误: {fname}]")
|
||||
else:
|
||||
doc.add_paragraph(f"[缺失图片: {fname}]")
|
||||
continue
|
||||
|
||||
# 空行
|
||||
if not line.strip():
|
||||
doc.add_paragraph()
|
||||
continue
|
||||
|
||||
# 普通段落,处理粗体斜体
|
||||
p = doc.add_paragraph()
|
||||
parts = []
|
||||
tmp = line
|
||||
while '**' in tmp:
|
||||
parts.append(tmp[:tmp.find('**')])
|
||||
tmp = tmp[tmp.find('**')+2:]
|
||||
if '**' in tmp:
|
||||
parts.append(('bold', tmp[:tmp.find('**')]))
|
||||
tmp = tmp[tmp.find('**')+2:]
|
||||
else:
|
||||
parts.append(('bold', tmp))
|
||||
break
|
||||
if not parts:
|
||||
parts = [line]
|
||||
|
||||
for part in parts:
|
||||
if isinstance(part, tuple):
|
||||
style, text = part
|
||||
run = p.add_run(text)
|
||||
run.bold = (style == 'bold')
|
||||
else:
|
||||
p.add_run(part)
|
||||
|
||||
doc.save(OUTPUT_DOCX)
|
||||
print(f"✅ Word 已生成: {OUTPUT_DOCX}")
|
||||
print(f"📄 段落数: {len(doc.paragraphs)}")
|
||||
@@ -1,74 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
生成 HTML,图片使用相对路径 'images/xxx.png'(确保图片在发布目录的 images 子文件夹中)
|
||||
"""
|
||||
|
||||
import os
|
||||
import re
|
||||
|
||||
BASE_DIR = "/root/.openclaw/workspaces/yzr-yxl/projects/yu-zhi-ran/content/published/2026-04-14-上海阳台种菜一年"
|
||||
MD_FILE = os.path.join(BASE_DIR, "final-article.md")
|
||||
OUT_HTML = os.path.join(BASE_DIR, "上海阳台种菜一年_可复制.html")
|
||||
|
||||
with open(MD_FILE, "r", encoding="utf-8") as f:
|
||||
content = f.read()
|
||||
|
||||
# 替换图片为 HTML img 标签,保持相对路径
|
||||
def replace_img(match):
|
||||
alt, path = match.groups()
|
||||
return f'<img src="{path}" alt="{alt}" style="max-width:100%; margin:20px 0; display:block;">'
|
||||
|
||||
content = re.sub(r'!\[(.*?)\]\((images/.*?)\)', replace_img, content)
|
||||
|
||||
# 转换 Markdown 为 HTML
|
||||
html_lines = []
|
||||
for line in content.split('\n'):
|
||||
if line.startswith('# '):
|
||||
html_lines.append(f'<h1>{line[2:]}</h1>')
|
||||
elif line.startswith('## '):
|
||||
html_lines.append(f'<h2>{line[3:]}</h2>')
|
||||
elif line.startswith('### '):
|
||||
html_lines.append(f'<h3>{line[4:]}</h3>')
|
||||
elif line.startswith('---'):
|
||||
html_lines.append('<hr style="border:none;border-top:2px dashed #ddd;margin:40px 0;">')
|
||||
elif line.startswith('> '):
|
||||
html_lines.append(f'<blockquote style="border-left:4px solid #4CAF50;background:#f9f9f9;padding:10px 20px;margin:20px 0;color:#666;">{line[2:]}</blockquote>')
|
||||
elif re.match(r'^[-*] ', line):
|
||||
html_lines.append(f'<li>{line[2:]}</li>')
|
||||
elif re.match(r'^\d+\. ', line):
|
||||
html_lines.append(f'<li>{line[line.find(". ")+2:]}</li>')
|
||||
elif line.strip() == '':
|
||||
html_lines.append('<br>')
|
||||
else:
|
||||
# 处理行内粗体斜体
|
||||
tmp = re.sub(r'\*\*(.*?)\*\*', r'<strong>\1</strong>', line)
|
||||
tmp = re.sub(r'\*(.*?)\*', r'<em>\1</em>', tmp)
|
||||
html_lines.append(f'<p>{tmp}</p>')
|
||||
|
||||
html = f'''<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>上海阳台种菜一年</title>
|
||||
<style>
|
||||
body {{ font-family: "Microsoft YaHei", sans-serif; max-width: 800px; margin: 0 auto; padding: 20px; line-height: 1.8; }}
|
||||
h1 {{ font-size: 28px; border-bottom: 2px solid #4CAF50; padding-bottom: 10px; }}
|
||||
h2 {{ font-size: 24px; margin-top: 40px; border-left: 4px solid #4CAF50; padding-left: 10px; }}
|
||||
h3 {{ font-size: 20px; margin-top: 30px; color: #666; }}
|
||||
img {{ max-width: 100%; height: auto; border-radius: 4px; margin: 20px 0; display: block; margin-left: auto; margin-right: auto; }}
|
||||
blockquote {{ border-left: 4px solid #4CAF50; background: #f9f9f9; padding: 10px 20px; margin: 20px 0; color: #666; }}
|
||||
li {{ margin-bottom: 8px; }}
|
||||
p {{ margin-bottom: 16px; }}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
{chr(10).join(html_lines)}
|
||||
</body>
|
||||
</html>'''
|
||||
|
||||
with open(OUT_HTML, "w", encoding="utf-8") as f:
|
||||
f.write(html)
|
||||
|
||||
print(f"✅ HTML 已生成: {OUT_HTML}")
|
||||
print(f"📊 字符数: {len(content)}")
|
||||
print(f"🖼️ 图片路径: images/ (需与 HTML 同目录的 images 文件夹)")
|
||||
@@ -1,90 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
生成图文混排的 HTML(图片内联为 base64),方便直接复制
|
||||
"""
|
||||
|
||||
import os
|
||||
import re
|
||||
import base64
|
||||
|
||||
BASE_DIR = "/root/.openclaw/workspaces/yzr-yxl/projects/yu-zhi-ran/content/published/2026-04-14-上海阳台种菜一年"
|
||||
MD_FILE = os.path.join(BASE_DIR, "final-article.md")
|
||||
IMAGES_DIR = os.path.join(BASE_DIR, "images") # 使用发布目录内的 images
|
||||
OUT_HTML = os.path.join(BASE_DIR, "上海阳台种菜一年_内联.html")
|
||||
|
||||
# 读取 Markdown
|
||||
with open(MD_FILE, "r", encoding="utf-8") as f:
|
||||
content = f.read()
|
||||
|
||||
# 预加载图片并转为 base64
|
||||
image_cache = {}
|
||||
for fname in os.listdir(IMAGES_DIR):
|
||||
if fname.endswith('.png'):
|
||||
path = os.path.join(IMAGES_DIR, fname)
|
||||
with open(path, "rb") as imgf:
|
||||
b64 = base64.b64encode(imgf.read()).decode('utf-8')
|
||||
image_cache[fname] = b64
|
||||
|
||||
# 替换图片
|
||||
def replace_img(match):
|
||||
alt = match.group(1)
|
||||
fname = match.group(2)
|
||||
key = os.path.basename(fname)
|
||||
if key in image_cache:
|
||||
return f'<img src="data:image/png;base64,{image_cache[key]}" alt="{alt}" style="max-width:100%; margin:20px 0; display:block;">'
|
||||
else:
|
||||
return f'<p>[图片缺失: {fname}]</p>'
|
||||
|
||||
content = re.sub(r'!\[(.*?)\]\((images/.*?)\)', replace_img, content)
|
||||
|
||||
# Markdown 转 HTML
|
||||
html_lines = []
|
||||
for line in content.split('\n'):
|
||||
if line.startswith('# '):
|
||||
html_lines.append(f'<h1>{line[2:]}</h1>')
|
||||
elif line.startswith('## '):
|
||||
html_lines.append(f'<h2>{line[3:]}</h2>')
|
||||
elif line.startswith('### '):
|
||||
html_lines.append(f'<h3>{line[4:]}</h3>')
|
||||
elif line.startswith('---'):
|
||||
html_lines.append('<hr>')
|
||||
elif line.startswith('> '):
|
||||
html_lines.append(f'<blockquote>{line[2:]}</blockquote>')
|
||||
elif re.match(r'^[-*] ', line):
|
||||
html_lines.append(f'<li>{line[2:]}</li>')
|
||||
elif re.match(r'^\d+\. ', line):
|
||||
html_lines.append(f'<li>{line[line.find(". ")+2:]}</li>')
|
||||
elif line.strip() == '':
|
||||
html_lines.append('<br>')
|
||||
else:
|
||||
tmp = re.sub(r'\*\*(.*?)\*\*', r'<strong>\1</strong>', line)
|
||||
tmp = re.sub(r'\*(.*?)\*', r'<em>\1</em>', tmp)
|
||||
html_lines.append(f'<p>{tmp}</p>')
|
||||
|
||||
html = f'''<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>上海阳台种菜一年</title>
|
||||
<style>
|
||||
body {{ font-family: "Microsoft YaHei", sans-serif; max-width: 800px; margin: 0 auto; padding: 20px; line-height: 1.8; }}
|
||||
h1 {{ font-size: 28px; border-bottom: 2px solid #4CAF50; padding-bottom: 10px; }}
|
||||
h2 {{ font-size: 24px; margin-top: 40px; border-left: 4px solid #4CAF50; padding-left: 10px; }}
|
||||
h3 {{ font-size: 20px; margin-top: 30px; color: #666; }}
|
||||
img {{ max-width: 100%; height: auto; border-radius: 4px; margin: 20px 0; display: block; margin-left: auto; margin-right: auto; }}
|
||||
blockquote {{ border-left: 4px solid #4CAF50; background: #f9f9f9; padding: 10px 20px; margin: 20px 0; color: #666; }}
|
||||
li {{ margin-bottom: 8px; }}
|
||||
p {{ margin-bottom: 16px; }}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
{chr(10).join(html_lines)}
|
||||
</body>
|
||||
</html>'''
|
||||
|
||||
with open(OUT_HTML, "w", encoding="utf-8") as f:
|
||||
f.write(html)
|
||||
|
||||
print(f"✅ HTML 已生成: {OUT_HTML}")
|
||||
print(f"📊 字符数: {len(content)}")
|
||||
print(f"🖼️ 内嵌图片: {len(image_cache)} 张")
|
||||
@@ -1,50 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
对 article.md 进行内容优化:
|
||||
- 去除具体 App 品牌名(花帮主、园艺助手)
|
||||
- 隐去设备具体品牌(小米米家)
|
||||
- 保留功能描述和用户价值
|
||||
- 保持中立、实用、无广告感
|
||||
"""
|
||||
|
||||
import os
|
||||
import re
|
||||
|
||||
BASE_DIR = "/root/.openclaw/workspaces/yzr-yxl/projects/yu-zhi-ran/content/published/2026-04-14-上海阳台种菜一年"
|
||||
MD_FILE = os.path.join(BASE_DIR, "final-article.md")
|
||||
OUT_MD = os.path.join(BASE_DIR, "final-article-optimized.md")
|
||||
|
||||
with open(MD_FILE, "r", encoding="utf-8") as f:
|
||||
content = f.read()
|
||||
|
||||
# 1. 替换具体 App 名称 -> 通用描述
|
||||
content = re.sub(r'花帮主', '一些第三方种植App', content)
|
||||
content = re.sub(r'园艺助手', '另一些生活助手类App', content)
|
||||
content = re.sub(r'(\*\*)花帮主(\*\*),AI识别病虫害,准确率85%', '**一些第三方种植App**,可以通过 AI 识别病虫害,准确率在 80% 以上', content)
|
||||
|
||||
# 2. 替换设备品牌 -> 通用描述
|
||||
content = re.sub(r'小米米家灌溉套装', '智能灌溉套装', content)
|
||||
content = re.sub(r'LED补光灯', 'LED 植物补光灯', content)
|
||||
|
||||
# 3. 移除可能带有广告嫌疑的表述(如“效果最好”、“推荐”等),改为中性描述
|
||||
content = re.sub(r'强烈推荐(易种)', '适合新手(易种)', content)
|
||||
content = re.sub(r'强烈推荐', '推荐', content)
|
||||
|
||||
# 4. 图片描述调整(不影响图片本身,只调整 alt 文本和图片说明)
|
||||
# 图片文件保留不变,只调整 Markdown 中的说明文字
|
||||
content = re.sub(r'!\[App截图\]', '[App功能截图]', content)
|
||||
content = re.sub(r'App截图', 'App功能界面示意', content)
|
||||
|
||||
# 5. 增加免责声明(在文末)
|
||||
if "声明:" not in content:
|
||||
content = content.rstrip() + "\n\n---\n\n> **声明**:本文提及的工具和设备仅为个人使用经验分享,不构成商业推荐。读者可根据自身需求选择类似产品。\n"
|
||||
|
||||
with open(OUT_MD, "w", encoding="utf-8") as f:
|
||||
f.write(content)
|
||||
|
||||
print(f"✅ 优化完成: {OUT_MD}")
|
||||
print("🔧 优化项:")
|
||||
print(" - 去除具体 App 品牌名")
|
||||
print(" - 隐去设备品牌")
|
||||
print(" - 增加中立表述")
|
||||
print(" - 添加免责声明")
|
||||
|
Before Width: | Height: | Size: 5.4 KiB |
|
Before Width: | Height: | Size: 4.8 KiB |
|
Before Width: | Height: | Size: 7.0 KiB |
|
Before Width: | Height: | Size: 7.1 KiB |
|
Before Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 9.9 KiB |
|
Before Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 12 KiB |
@@ -6,7 +6,7 @@ from docx import Document
|
||||
from docx.shared import Inches, Pt
|
||||
from docx.enum.text import WD_ALIGN_PARAGRAPH
|
||||
|
||||
BASE_DIR = "/root/.openclaw/workspaces/yzr-yxl/projects/yu-zhi-ran/content/published/2026-04-14-上海阳台种菜一年"
|
||||
BASE_DIR = "/root/openclaw-workspace/projects/yu-zhi-ran/content/published/2026-04-14-上海阳台种菜一年"
|
||||
MD_FILE = os.path.join(BASE_DIR, "final-article-optimized.md")
|
||||
IMAGES_DIR = os.path.join(BASE_DIR, "images")
|
||||
OUTPUT_DOCX = os.path.join(BASE_DIR, "上海阳台种菜一年_发布版.docx")
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
python3 - << 'PYEOF'
|
||||
import os, re, base64
|
||||
|
||||
BASE_DIR = "/root/.openclaw/workspaces/yzr-yxl/projects/yu-zhi-ran/content/published/2026-04-14-上海阳台种菜一年"
|
||||
BASE_DIR = "/root/openclaw-workspace/projects/yu-zhi-ran/content/published/2026-04-14-上海阳台种菜一年"
|
||||
MD_FILE = os.path.join(BASE_DIR, "final-article-optimized.md")
|
||||
IMAGES_DIR = os.path.join(BASE_DIR, "images")
|
||||
OUT_HTML = os.path.join(BASE_DIR, "上海阳台种菜一年_发布版.html")
|
||||
|
||||
@@ -5,8 +5,8 @@
|
||||
|
||||
set -e
|
||||
|
||||
PROJECT_ROOT="/root/.openclaw/workspaces/yzr-yxl/projects/yu-zhi-ran"
|
||||
SESSION_STATE="/root/.openclaw/workspaces/yzr-yxl/projects/yu-zhi-ran/automation/wechat_state.json"
|
||||
PROJECT_ROOT="/root/openclaw-workspace/projects/yu-zhi-ran"
|
||||
SESSION_STATE="/root/openclaw-workspace/projects/yu-zhi-ran/automation/wechat_state.json"
|
||||
|
||||
if [ $# -ne 2 ]; then
|
||||
echo "用法: $0 <markdown_file> <images_dir>"
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
set -e
|
||||
|
||||
# 配置
|
||||
PROJECT_ROOT="/root/.openclaw/workspaces/yzr-yxl/projects/yu-zhi-ran"
|
||||
PROJECT_ROOT="/root/openclaw-workspace/projects/yu-zhi-ran"
|
||||
SESSION_STATE="/root/.openclaw/sessions/zhihu-state.json"
|
||||
ZHIHU_CREATOR_URL="https://www.zhihu.com/creator"
|
||||
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
# 远程工作2026中国指南:从'不可能'到'可行'的路径图 - 2026-04-18 - 小红书笔记
|
||||
|
||||
宇 宇之然 | 可持续生活指南 每天分享一个可执行的可持续行动 ✨ 远程工作2026中国指南:从'不可能'到'可行'的路径图 📅 2026-04-18 更新 一、引言(约200字) (LLM 调用失败:HTTP 502: {"error":{"message":"Model resources are currently busy. Please try again later. (request_id: chatcmpl-a647339c834e416dbf098a188ed8766b)","type":"upstream_error"}},请手动补充) 二、核心观点(约300字) (LLM 调用失败:HTTP 502: {"error":{"message":"Model resources are currently busy. Please try again later. (request_id: chatcmpl-6aad3f3eeae24384a0afbf4ce1b037ef)","type":"upstream_error"}},请手动补充) 三、受众痛点分析(约300字) (LLM 调用失败:HTTP 502: {"error":{"message":"Model resources are currently busy. Please try again later. (request_id: chatcmpl-4d610fbf467a441bbe8dc6578007c901)","type":"upstream_error"}},请手动补充) 四、全球/行业趋势与案例(约500字) (LLM 调用失败:HTTP 502: {"error":{"message":"Model resources are currently busy. Please try again later. (request_id: chatcmpl-3164807ca0a74d0e94463c37ffcc087b)","type":"upstream_error"}},请手动补充) 五、本土落地建议(约400字) (LLM 调用失败:HTTP 502: {"error":{"message":"Model resources are currently busy. Please try again later. (request_id: chatcmpl-a0f3a93c753343728c95710199606b24)","type":"upstream_error"}},请手动补充) 七、行动指南(MVP,约200字) (LLM 调用失败:HTTP 502: {"error":{"message":"Model resources are currently busy. Please try again later. (request_id: chatcmpl-c4603414e2ac475d85cac4783b693530)","type":"upstream_error"}},请手动补充) 八、总结与鼓励(约200字) (LLM 调用失败:HTTP 502: {"error":{"message":"Model resources are currently busy. Please try again later. (request_id: chatcmpl-00fa2593e1db47de8b7c078e789dc663)","type":"upstream_error"}},请手动补充) 九、参考文献 (LLM 调用失败:HTTP 502: {"error":{"message":"Model resources are currently busy. Please try again later. (request_id: chatcmpl-b68f9f2bb8f94c148b249980e6301508)","type":"upstream_error"}},请手动补充) (本文由宇之然AI助手生成,数据来源可靠,内容经合规审查) 生成时间:2026-04-18 #AI #可持续 #生活方式 💚 本文由宇之然AI助手生成,基于全球可持续性趋势研究 📊 数据经过交叉验证 | 🌍 每天更新,让可持续生活更简单 💬 欢迎在评论区分享你的实践经验和改进建议
|
||||
@@ -1,148 +1,166 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>{{TITLE}} - {{DATE}} - 微信公众号</title>
|
||||
<style>
|
||||
body {
|
||||
font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif;
|
||||
line-height: 1.7;
|
||||
max-width: 720px;
|
||||
margin: 0 auto;
|
||||
padding: 20px;
|
||||
color: #333;
|
||||
background-color: #fff;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
}
|
||||
h1 {
|
||||
font-size: 1.8em;
|
||||
font-weight: 600;
|
||||
margin-top: 0;
|
||||
margin-bottom: 20px;
|
||||
color: #222;
|
||||
text-align: center;
|
||||
line-height: 1.4;
|
||||
}
|
||||
h2 {
|
||||
font-size: 1.5em;
|
||||
font-weight: 600;
|
||||
margin-top: 36px;
|
||||
margin-bottom: 18px;
|
||||
color: #333;
|
||||
padding-bottom: 10px;
|
||||
border-bottom: 2px solid #f0f0f0;
|
||||
}
|
||||
h3 {
|
||||
font-size: 1.3em;
|
||||
font-weight: 500;
|
||||
margin-top: 28px;
|
||||
margin-bottom: 14px;
|
||||
color: #444;
|
||||
}
|
||||
p {
|
||||
margin: 18px 0;
|
||||
color: #555;
|
||||
text-align: justify;
|
||||
word-break: break-word;
|
||||
}
|
||||
ul, ol {
|
||||
padding-left: 24px;
|
||||
margin: 18px 0;
|
||||
}
|
||||
li {
|
||||
margin: 10px 0;
|
||||
color: #555;
|
||||
}
|
||||
img {
|
||||
max-width: 100%;
|
||||
height: auto;
|
||||
margin: 24px 0;
|
||||
border-radius: 6px;
|
||||
display: block;
|
||||
}
|
||||
.abstract {
|
||||
background: #f9f9f9;
|
||||
padding: 18px;
|
||||
border-radius:671px;
|
||||
margin: 20px 0;
|
||||
color: #666;
|
||||
font-size: 1.05em;
|
||||
line-height: 1.6;
|
||||
border-left: 4px solid #07c160;
|
||||
}
|
||||
.highlight-box {
|
||||
background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
|
||||
padding: 20px;
|
||||
border-radius: 8px;
|
||||
margin: 24px 0;
|
||||
border: 1px solid #e1e1e1;
|
||||
}
|
||||
.action-box {
|
||||
background: #e8f5e9;
|
||||
padding: 16px;
|
||||
border-radius: 6px;
|
||||
margin: 20px 0;
|
||||
border-left: 5px solid #4CAF50;
|
||||
}
|
||||
.data-box {
|
||||
background: #e3f2fd;
|
||||
padding: 16px;
|
||||
border-radius: 6px;
|
||||
margin: 20px 0;
|
||||
border-left: 5px solid #2196F3;
|
||||
}
|
||||
.wechat-footer {
|
||||
margin-top: analyzedpx;
|
||||
padding-top: 20px;
|
||||
border-top: 1px solid #e1e1e1;
|
||||
color: #888;
|
||||
font-size: 0.9em;
|
||||
text-align: center;
|
||||
line-height: 1.5;
|
||||
}
|
||||
.emoji {
|
||||
font-size: 1.2em;
|
||||
margin: 0 2px;
|
||||
}
|
||||
.qrcode-section {
|
||||
text-align: center;
|
||||
margin: 30px 0;
|
||||
padding: 20px;
|
||||
background: #f9f9f9;
|
||||
border-radius: 8px;
|
||||
}
|
||||
@media (max-width: 640px) {
|
||||
body {
|
||||
padding: 16px;
|
||||
line-height: 1.6;
|
||||
}
|
||||
h1 { font-size: 1.6em; }
|
||||
h2 { font-size: 1.3em; }
|
||||
.abstract { padding: 14px; }
|
||||
}
|
||||
</style>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>{{TITLE}}</title>
|
||||
<style>
|
||||
body {
|
||||
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
|
||||
line-height: 1.8;
|
||||
max-width: 640px;
|
||||
margin: 0 auto;
|
||||
padding: 20px;
|
||||
color: #333;
|
||||
background-color: #f7f7f7;
|
||||
}
|
||||
.container {
|
||||
background: #fff;
|
||||
padding: 30px;
|
||||
border-radius: 8px;
|
||||
box-shadow: 0 2px 8px rgba(0,0,0,0.05);
|
||||
}
|
||||
h1 {
|
||||
font-size: 20px;
|
||||
font-weight: 600;
|
||||
margin: 0 0 20px 0;
|
||||
color: #1a1a1a;
|
||||
line-height: 1.4;
|
||||
}
|
||||
h2 {
|
||||
font-size: 18px;
|
||||
font-weight: 600;
|
||||
margin: 28px 0 14px 0;
|
||||
color: #262626;
|
||||
}
|
||||
h3 {
|
||||
font-size: 16px;
|
||||
font-weight: 600;
|
||||
margin: 24px 0 12px 0;
|
||||
color: #595959;
|
||||
}
|
||||
p {
|
||||
margin: 16px 0;
|
||||
color: #333;
|
||||
text-align: justify;
|
||||
font-size: 15px;
|
||||
}
|
||||
ul, ol {
|
||||
padding-left: 24px;
|
||||
margin: 16px 0;
|
||||
}
|
||||
li {
|
||||
margin: 8px 0;
|
||||
font-size: 15px;
|
||||
}
|
||||
img {
|
||||
max-width: 100%;
|
||||
height: auto;
|
||||
margin: 20px 0;
|
||||
border-radius: 4px;
|
||||
}
|
||||
blockquote {
|
||||
margin: 20px 0;
|
||||
padding: 12px 16px;
|
||||
border-left: 3px solid #07c160;
|
||||
background-color: #f0f9f4;
|
||||
color: #555;
|
||||
font-size: 14px;
|
||||
}
|
||||
/* 页头 */
|
||||
.header {
|
||||
margin-bottom: 28px;
|
||||
padding-bottom: 16px;
|
||||
border-bottom: 1px solid #eee;
|
||||
}
|
||||
.author-info {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
margin-bottom: 12px;
|
||||
font-size: 13px;
|
||||
color: #888;
|
||||
}
|
||||
.author {
|
||||
font-weight: 500;
|
||||
color: #666;
|
||||
}
|
||||
.update-time {
|
||||
color: #999;
|
||||
}
|
||||
/* 内容 */
|
||||
.content {
|
||||
margin-bottom: 24px;
|
||||
}
|
||||
/* 标签 */
|
||||
.tags {
|
||||
margin: 24px 0;
|
||||
padding: 12px 0;
|
||||
border-top: 1px solid #eee;
|
||||
border-bottom: 1px solid #eee;
|
||||
}
|
||||
.tag {
|
||||
display: inline-block;
|
||||
margin: 4px 6px 4px 0;
|
||||
padding: 3px 10px;
|
||||
background-color: #f0f9f4;
|
||||
color: #07c160;
|
||||
border-radius: 4px;
|
||||
font-size: 13px;
|
||||
}
|
||||
/* 互动 */
|
||||
.interaction {
|
||||
margin: 24px 0;
|
||||
padding: 14px;
|
||||
background-color: #f0f9f4;
|
||||
border-radius: 4px;
|
||||
text-align: center;
|
||||
color: #07c160;
|
||||
font-size: 14px;
|
||||
font-weight: 500;
|
||||
}
|
||||
/* 页脚 */
|
||||
footer {
|
||||
margin-top: 28px;
|
||||
padding-top: 16px;
|
||||
border-top: 1px solid #eee;
|
||||
color: #999;
|
||||
font-size: 12px;
|
||||
text-align: center;
|
||||
line-height: 1.6;
|
||||
}
|
||||
.gen-time {
|
||||
margin-top: 6px;
|
||||
font-size: 12px;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h1>{{TITLE}}</h1>
|
||||
|
||||
<!-- ABSTRACT -->
|
||||
|
||||
<div class="abstract">
|
||||
<p>🌱 本文基于全球可持续性前沿趋势,结合中国实际情况,提供<strong>可执行、可落地</strong>的行动指南。每天一篇,让可持续生活成为日常。</p>
|
||||
<div class="container">
|
||||
<!-- 页头区域 -->
|
||||
<div class="header">
|
||||
<h1>{{TITLE}}</h1>
|
||||
</div>
|
||||
|
||||
<!-- CONTENT -->
|
||||
|
||||
<div class="qrcode-section">
|
||||
<p>💚 关注「宇之然」公众号,获取每日可持续性实践指南</p>
|
||||
<p>📅 每日更新,数据驱动,行动导向</p>
|
||||
<!-- 内容区域 -->
|
||||
<div class="content">
|
||||
<!-- CONTENT -->
|
||||
</div>
|
||||
|
||||
<div class="wechat-footer">
|
||||
<p>本文由宇之然AI助手生成 | 数据来源:全球可持续性信息源</p>
|
||||
<p>📅 生成日期:{{DATE}} | 📊 数据经过交叉验证</p>
|
||||
<p>💬 欢迎在留言区分享你的实践经验</p>
|
||||
<!-- 分类标签 -->
|
||||
<div class="tags">
|
||||
<!-- TAGS -->
|
||||
</div>
|
||||
|
||||
<!-- 互动建议 -->
|
||||
<div class="interaction">
|
||||
<p>欢迎在评论区分享你的实践经验和改进建议!</p>
|
||||
</div>
|
||||
|
||||
<!-- 页脚区域 -->
|
||||
<footer>
|
||||
<p class="gen-time">生成时间:{{GEN_TIME}}</p>
|
||||
</footer>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,232 +1,166 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>{{TITLE}} - {{DATE}} - 小红书笔记</title>
|
||||
<style>
|
||||
body {
|
||||
font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif;
|
||||
line-height: 1.6;
|
||||
max-width: 100%;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
color: #333;
|
||||
background-color: #fff;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
}
|
||||
.container {
|
||||
max-width: 640px;
|
||||
margin: 0 auto;
|
||||
padding: 20px 16px 40px;
|
||||
}
|
||||
.header {
|
||||
margin-bottom: 24px;
|
||||
}
|
||||
.title {
|
||||
font-size: 1.4em;
|
||||
font-weight: 600;
|
||||
margin: 0 0 12px;
|
||||
color: #222;
|
||||
line-height: 1.4;
|
||||
}
|
||||
.date-tag {
|
||||
display: inline-block;
|
||||
padding: 4px 12px;
|
||||
background-color: #ffe7e7;
|
||||
color: #ff2442;
|
||||
border-radius: 12px;
|
||||
font-size: 0.85em;
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
.image-gallery {
|
||||
margin: 20px 0;
|
||||
}
|
||||
.main-image {
|
||||
width: 100%;
|
||||
height: auto;
|
||||
border-radius: 12px;
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
.thumbnail-grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(3, 1fr);
|
||||
gap: 8px;
|
||||
margin-top: 12px;
|
||||
}
|
||||
.thumbnail {
|
||||
width: 100%;
|
||||
height: 120px;
|
||||
object-fit: cover;
|
||||
border-radius: 8px;
|
||||
}
|
||||
.content {
|
||||
margin: 24px 0;
|
||||
}
|
||||
.section {
|
||||
margin-bottom: 24px;
|
||||
}
|
||||
.section-title {
|
||||
font-size: 1.2em;
|
||||
font-weight: 600;
|
||||
margin: 0 0 12px;
|
||||
color: #333;
|
||||
padding-left: 8px;
|
||||
border-left: 4px solid #ff2442;
|
||||
}
|
||||
.section-content {
|
||||
color: #555;
|
||||
margin: 12px 0;
|
||||
line-height: 1.6;
|
||||
}
|
||||
.bullet-point {
|
||||
margin: 10px 0;
|
||||
padding-left: 20px;
|
||||
position: relative;
|
||||
}
|
||||
.bullet-point:before {
|
||||
content: "•";
|
||||
position: absolute;
|
||||
left: 0;
|
||||
color: #ff2442;
|
||||
font-size: 1.2em;
|
||||
}
|
||||
.highlight-box {
|
||||
background: linear-gradient(135deg, #fff5f5 0%, #ffe7e7 100%);
|
||||
padding: 16px;
|
||||
border-radius: 10px;
|
||||
margin: 16px 0;
|
||||
border: 1px solid #ffdada;
|
||||
}
|
||||
.action-list {
|
||||
background: #f0fff4;
|
||||
padding: 16px;
|
||||
border-radius: 10px;
|
||||
margin: 16px 0;
|
||||
border: 1px solid #d1f7d1;
|
||||
}
|
||||
.action-item {
|
||||
margin: 10px 0;
|
||||
padding-left: toldpx;
|
||||
position: relative;
|
||||
}
|
||||
.action-item:before {
|
||||
content: "✓";
|
||||
position: absolute;
|
||||
left: 0;
|
||||
color: #4CAF50;
|
||||
font-weight: bold;
|
||||
}
|
||||
.hashtags {
|
||||
margin: 28px 0 20px;
|
||||
padding: 16px 0;
|
||||
border-top: 1px solid #f0f0f0;
|
||||
border-bottom: 1px solid #f0f0f0;
|
||||
}
|
||||
.hashtag {
|
||||
display: inline-block;
|
||||
margin: 4px 6px;
|
||||
color: #ff2442;
|
||||
font-weight: 500;
|
||||
font-size: 0.95em;
|
||||
}
|
||||
.footer {
|
||||
text-align: center;
|
||||
color: #888;
|
||||
font-size: 0.85em;
|
||||
margin-top: 32px;
|
||||
padding-top: 20px;
|
||||
border-top: 1px solid #f0f0f0;
|
||||
}
|
||||
.emoji {
|
||||
font-size: 1.1em;
|
||||
margin-right: 4px;
|
||||
}
|
||||
.profile {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
.avatar {
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
border-radius: 50%;
|
||||
margin-right: 12px;
|
||||
background-color: #f0f0f0;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-weight: bold;
|
||||
color: #ff2442;
|
||||
}
|
||||
.profile-info {
|
||||
flex: 1;
|
||||
}
|
||||
.username {
|
||||
font-weight: 600;
|
||||
color: #333;
|
||||
margin-bottom: 2px;
|
||||
}
|
||||
.bio {
|
||||
font-size: 0.9em;
|
||||
color: #666;
|
||||
}
|
||||
@media (max-width: 480px) {
|
||||
.container {
|
||||
padding: 16px 12px 32px;
|
||||
}
|
||||
.title {
|
||||
font-size: 1.3em;
|
||||
}
|
||||
.thumbnail-grid {
|
||||
grid-template-columns: repeat(2, 1fr);
|
||||
}
|
||||
.thumbnail {
|
||||
height: 100px;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>{{TITLE}}</title>
|
||||
<style>
|
||||
body {
|
||||
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
|
||||
line-height: 1.6;
|
||||
max-width: 480px;
|
||||
margin: 0 auto;
|
||||
padding: 16px;
|
||||
color: #333;
|
||||
background-color: #fafafa;
|
||||
}
|
||||
.container {
|
||||
background: #fff;
|
||||
padding: 20px;
|
||||
border-radius: 12px;
|
||||
box-shadow: 0 2px 12px rgba(0,0,0,0.08);
|
||||
}
|
||||
h1 {
|
||||
font-size: 18px;
|
||||
font-weight: 600;
|
||||
margin: 0 0 16px 0;
|
||||
color: #1a1a1a;
|
||||
line-height: 1.4;
|
||||
}
|
||||
h2 {
|
||||
font-size: 16px;
|
||||
font-weight: 600;
|
||||
margin: 20px 0 10px 0;
|
||||
color: #333;
|
||||
}
|
||||
h3 {
|
||||
font-size: 15px;
|
||||
font-weight: 600;
|
||||
margin: 16px 0 8px 0;
|
||||
color: #555;
|
||||
}
|
||||
p {
|
||||
margin: 12px 0;
|
||||
color: #444;
|
||||
font-size: 14px;
|
||||
text-align: left;
|
||||
}
|
||||
ul, ol {
|
||||
padding-left: 20px;
|
||||
margin: 12px 0;
|
||||
}
|
||||
li {
|
||||
margin: 6px 0;
|
||||
font-size: 14px;
|
||||
}
|
||||
img {
|
||||
max-width: 100%;
|
||||
height: auto;
|
||||
margin: 16px 0;
|
||||
border-radius: 8px;
|
||||
}
|
||||
blockquote {
|
||||
margin: 16px 0;
|
||||
padding: 10px 14px;
|
||||
border-left: 3px solid #ff2442;
|
||||
background-color: #fff5f6;
|
||||
color: #666;
|
||||
font-size: 13px;
|
||||
}
|
||||
/* 页头 */
|
||||
.header {
|
||||
margin-bottom: 20px;
|
||||
padding-bottom: 12px;
|
||||
border-bottom: 1px solid #f0f0f0;
|
||||
}
|
||||
.author-info {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
margin-bottom: 8px;
|
||||
font-size: 12px;
|
||||
color: #999;
|
||||
}
|
||||
.author {
|
||||
font-weight: 500;
|
||||
color: #666;
|
||||
}
|
||||
.update-time {
|
||||
color: #bbb;
|
||||
}
|
||||
/* 内容 */
|
||||
.content {
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
/* 标签 */
|
||||
.tags {
|
||||
margin: 16px 0;
|
||||
padding: 10px 0;
|
||||
border-top: 1px solid #f0f0f0;
|
||||
border-bottom: 1px solid #f0f0f0;
|
||||
}
|
||||
.tag {
|
||||
display: inline-block;
|
||||
margin: 3px 5px 3px 0;
|
||||
padding: 2px 8px;
|
||||
background-color: #fff5f6;
|
||||
color: #ff2442;
|
||||
border-radius: 12px;
|
||||
font-size: 12px;
|
||||
}
|
||||
/* 互动 */
|
||||
.interaction {
|
||||
margin: 16px 0;
|
||||
padding: 12px;
|
||||
background-color: #fff5f6;
|
||||
border-radius: 8px;
|
||||
text-align: center;
|
||||
color: #ff2442;
|
||||
font-size: 13px;
|
||||
font-weight: 500;
|
||||
}
|
||||
/* 页脚 */
|
||||
footer {
|
||||
margin-top: 20px;
|
||||
padding-top: 12px;
|
||||
border-top: 1px solid #f0f0f0;
|
||||
color: #bbb;
|
||||
font-size: 11px;
|
||||
text-align: center;
|
||||
line-height: 1.5;
|
||||
}
|
||||
.gen-time {
|
||||
margin-top: 4px;
|
||||
font-size: 11px;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<div class="header">
|
||||
<div class="profile">
|
||||
<div class="avatar">宇</div>
|
||||
<div class="profile-info">
|
||||
<div class="username">宇之然 | 可持续生活指南</div>
|
||||
<div class="bio">每天分享一个可执行的可持续行动 ✨</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="title">{{TITLE}}</div>
|
||||
<div class="date-tag">📅 {{DATE}} 更新</div>
|
||||
</div>
|
||||
|
||||
<div class="image-gallery">
|
||||
<img src="" alt="封面图" class="main-image">
|
||||
<div class="thumbnail-grid">
|
||||
<img src="" alt="图1" class="thumbnail">
|
||||
<img src="" alt="图2" class="thumbnail">
|
||||
<img src="" alt="图3" class="thumbnail">
|
||||
<img src="" alt="图4" class="thumbnail">
|
||||
<img src="" alt="图5" class="thumbnail">
|
||||
<img src="" alt="图6" class="thumbnail">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="content">
|
||||
<!-- CONTENT -->
|
||||
</div>
|
||||
|
||||
<div class="hashtags">
|
||||
<!-- HASHTAGS -->
|
||||
</div>
|
||||
|
||||
<div class="footer">
|
||||
<p>💚 本文由宇之然AI助手生成,基于全球可持续性趋势研究</p>
|
||||
<p>📊 数据经过交叉验证 | 🌍 每天更新,让可持续生活更简单</p>
|
||||
<p>💬 欢迎在评论区分享你的实践经验和改进建议</p>
|
||||
</div>
|
||||
<div class="container">
|
||||
<!-- 页头区域 -->
|
||||
<div class="header">
|
||||
<h1>{{TITLE}}</h1>
|
||||
</div>
|
||||
|
||||
<!-- 内容区域 -->
|
||||
<div class="content">
|
||||
<!-- CONTENT -->
|
||||
</div>
|
||||
|
||||
<!-- 分类标签 -->
|
||||
<div class="tags">
|
||||
<!-- TAGS -->
|
||||
</div>
|
||||
|
||||
<!-- 互动建议 -->
|
||||
<div class="interaction">
|
||||
<p>欢迎在评论区分享你的实践经验和改进建议!</p>
|
||||
</div>
|
||||
|
||||
<!-- 页脚区域 -->
|
||||
<footer>
|
||||
<p class="gen-time">生成时间:{{GEN_TIME}}</p>
|
||||
</footer>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,138 +1,172 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>{{TITLE}} - {{DATE}} - 知乎专栏</title>
|
||||
<style>
|
||||
body {
|
||||
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
|
||||
line-height: 1.8;
|
||||
max-width: 680px;
|
||||
margin: 0 auto;
|
||||
padding: 20px;
|
||||
color: #1a1a1a;
|
||||
background-color: #fff;
|
||||
}
|
||||
h1 {
|
||||
font-size: 1.8em;
|
||||
font-weight: 600;
|
||||
margin-top: 0;
|
||||
margin-bottom: 20px;
|
||||
color: #121212;
|
||||
border-bottom: none;
|
||||
}
|
||||
h2 {
|
||||
font-size: 1.4em;
|
||||
font-weight: 600;
|
||||
margin-top: 32px;
|
||||
margin-bottom: 16px;
|
||||
color: #262626;
|
||||
}
|
||||
h3 {
|
||||
font-size: 1.2em;
|
||||
font-weight: 600;
|
||||
margin-top: 24px;
|
||||
margin-bottom: 12px;
|
||||
color: #595959;
|
||||
}
|
||||
p {
|
||||
margin: 16px 0;
|
||||
color: #404040;
|
||||
text-align: justify;
|
||||
}
|
||||
ul, ol {
|
||||
padding-left: 24px;
|
||||
margin: 16px 0;
|
||||
}
|
||||
li {
|
||||
margin: 8px 0;
|
||||
}
|
||||
img {
|
||||
max-width: 100%;
|
||||
height: auto;
|
||||
margin: 24px 0;
|
||||
border-radius: 4px;
|
||||
border: 1px solid #f0f0f0;
|
||||
}
|
||||
blockquote {
|
||||
margin: 24px 0;
|
||||
padding:"?
|
||||
|
||||
12px 20px;
|
||||
border-left: 4px solid #0084ff;
|
||||
background-color: #f6f9ff;
|
||||
color: #595959;
|
||||
}
|
||||
.tags {
|
||||
margin: 20px 0;
|
||||
padding: 12px 0;
|
||||
border-top: 1px solid #f0f0f0;
|
||||
border-bottom: 1px solid #f0f0f0;
|
||||
}
|
||||
.tag {
|
||||
display: inline-block;
|
||||
margin: 4px 8px 4px 0;
|
||||
padding: 4px 12px;
|
||||
background-color: #f6f9ff;
|
||||
color: #0084ff;
|
||||
border-radius: 12px;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
.data-highlight {
|
||||
background-color: #f0f9ff;
|
||||
padding: 12px 16px;
|
||||
border-radius: 6px;
|
||||
margin: 16px 0;
|
||||
border-left: 3px solid #1890ff;
|
||||
}
|
||||
.summary {
|
||||
font-size: 1.1em;
|
||||
font-weight: 500;
|
||||
color: #595959;
|
||||
margin-bottom: 24px;
|
||||
}
|
||||
.author {
|
||||
color: #8590a6;
|
||||
font-size: 0.9em;
|
||||
margin-bottom: 24px;
|
||||
}
|
||||
footer {
|
||||
margin-top: 32px;
|
||||
padding-top: 20px;
|
||||
border-top: 1px solid #f0f0f0;
|
||||
color: #8590a6;
|
||||
font-size: 0.85em;
|
||||
text-align: center;
|
||||
}
|
||||
@media (max-width: 600px) {
|
||||
body {
|
||||
padding: 16px;
|
||||
line-height: 1.6;
|
||||
}
|
||||
h1 { font-size: 1.5em; }
|
||||
h2 { font-size: 1.3em; }
|
||||
}
|
||||
</style>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>{{TITLE}} - {{DATE}} - 知乎专栏</title>
|
||||
<style>
|
||||
body {
|
||||
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
|
||||
line-height: 1.8;
|
||||
max-width: 680px;
|
||||
margin: 0 auto;
|
||||
padding: 20px;
|
||||
color: #1a1a1a;
|
||||
background-color: #fff;
|
||||
}
|
||||
h1 {
|
||||
font-size: 1.8em;
|
||||
font-weight: 600;
|
||||
margin-top: 0;
|
||||
margin-bottom: 20px;
|
||||
color: #121212;
|
||||
}
|
||||
h2 {
|
||||
font-size: 1.4em;
|
||||
font-weight: 600;
|
||||
margin-top: 32px;
|
||||
margin-bottom: 16px;
|
||||
color: #262626;
|
||||
}
|
||||
h3 {
|
||||
font-size: 1.2em;
|
||||
font-weight: 600;
|
||||
margin-top: 24px;
|
||||
margin-bottom: 12px;
|
||||
color: #595959;
|
||||
}
|
||||
p {
|
||||
margin: 16px 0;
|
||||
color: #404040;
|
||||
text-align: justify;
|
||||
}
|
||||
ul, ol {
|
||||
padding-left: 24px;
|
||||
margin: 16px 0;
|
||||
}
|
||||
li {
|
||||
margin: 8px 0;
|
||||
}
|
||||
img {
|
||||
max-width: 100%;
|
||||
height: auto;
|
||||
margin: 24px 0;
|
||||
border-radius: 4px;
|
||||
border: 1px solid #f0f0f0;
|
||||
}
|
||||
blockquote {
|
||||
margin: 24px 0;
|
||||
padding: 12px 20px;
|
||||
border-left: 4px solid #0084ff;
|
||||
background-color: #f6f9ff;
|
||||
color: #595959;
|
||||
}
|
||||
/* 页头样式 */
|
||||
.header {
|
||||
margin-bottom: 32px;
|
||||
border-bottom: 1px solid #f0f0f0;
|
||||
padding-bottom: 20px;
|
||||
}
|
||||
.author-info {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
margin-bottom: 12px;
|
||||
font-size: 0.9em;
|
||||
color: #8590a6;
|
||||
}
|
||||
.author {
|
||||
font-weight: 500;
|
||||
}
|
||||
.update-time {
|
||||
color: #8590a6;
|
||||
}
|
||||
/* 内容样式 */
|
||||
.content {
|
||||
margin-bottom: 24px;
|
||||
}
|
||||
/* 标签样式 */
|
||||
.tags {
|
||||
margin: 24px 0;
|
||||
padding: 16px 0;
|
||||
border-top: 1px solid #f0f0f0;
|
||||
border-bottom: 1px solid #f0f0f0;
|
||||
}
|
||||
.tag {
|
||||
display: inline-block;
|
||||
margin: 4px 8px 4px 0;
|
||||
padding: 4px 12px;
|
||||
background-color: #f6f9ff;
|
||||
color: #0084ff;
|
||||
border-radius: 12px;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
/* 互动建议 */
|
||||
.interaction {
|
||||
margin: 24px 0;
|
||||
padding: 16px;
|
||||
background-color: #f6f9ff;
|
||||
border-radius: 6px;
|
||||
text-align: center;
|
||||
color: #0084ff;
|
||||
font-weight: 500;
|
||||
}
|
||||
/* 页脚样式 */
|
||||
footer {
|
||||
margin-top: 32px;
|
||||
padding-top: 20px;
|
||||
border-top: 1px solid #f0f0f0;
|
||||
color: #8590a6;
|
||||
font-size: 0.85em;
|
||||
text-align: center;
|
||||
}
|
||||
.gen-time {
|
||||
margin-top: 8px;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
@media (max-width: 600px) {
|
||||
body {
|
||||
padding: 16px;
|
||||
line-height: 1.6;
|
||||
}
|
||||
h1 {
|
||||
font-size: 1.5em;
|
||||
}
|
||||
h2 {
|
||||
font-size: 1.3em;
|
||||
}
|
||||
.author-info {
|
||||
flex-direction: column;
|
||||
align-items: flex-start;
|
||||
gap: 4px;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="author">作者:宇之然 | 更新日期:{{DATE}}</div>
|
||||
|
||||
<!-- 页头区域 -->
|
||||
<div class="header">
|
||||
<h1>{{TITLE}}</h1>
|
||||
</div>
|
||||
|
||||
<div class="summary">
|
||||
<p>本文基于全球可持续性趋势研究,结合中国现实,提供可执行的行动建议。数据来源可靠,观点客观中立。</p>
|
||||
</div>
|
||||
|
||||
<!-- 内容区域(不含标题) -->
|
||||
<div class="content">
|
||||
<!-- CONTENT -->
|
||||
</div>
|
||||
|
||||
<div class="tags">
|
||||
<!-- TAGS -->
|
||||
</div>
|
||||
<!-- 分类标签 -->
|
||||
<div class="tags">
|
||||
<!-- TAGS -->
|
||||
</div>
|
||||
|
||||
<footer>
|
||||
<p>本文由宇之然AI助手生成,基于全球开源数据和研究成果</p>
|
||||
<p>欢迎在评论区分享你的实践经验和改进建议</p>
|
||||
</footer>
|
||||
<!-- 互动建议 -->
|
||||
<div class="interaction">
|
||||
<p>欢迎在评论区分享你的实践经验和改进建议!</p>
|
||||
</div>
|
||||
|
||||
<!-- 页脚区域 -->
|
||||
<footer>
|
||||
<p class="gen-time">生成时间:{{GEN_TIME}}</p>
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
||||
@@ -58,7 +58,7 @@ if (!editor) {
|
||||
}
|
||||
|
||||
// 上传封面图(如需自动上传)
|
||||
const coverPath = "/root/.openclaw/workspaces/yzr-yxl/projects/yu-zhi-ran/content/publishing/images/05-封面图.png";
|
||||
const coverPath = "/root/openclaw-workspace/projects/yu-zhi-ran/content/publishing/images/05-封面图.png";
|
||||
console.log("📸 封面上传:请手动点击编辑器图片按钮,选择封面图文件");
|
||||
console.log(" 文件路径:", coverPath);
|
||||
|
||||
|
||||
@@ -313,7 +313,7 @@ if (!editor) {
|
||||
}
|
||||
|
||||
// 提示封面上传
|
||||
const coverPath = "/root/.openclaw/workspaces/yzr-yxl/projects/yu-zhi-ran/content/publishing/images/05-封面图.png";
|
||||
const coverPath = "/root/openclaw-workspace/projects/yu-zhi-ran/content/publishing/images/05-封面图.png";
|
||||
console.log("\n📸 封面上传:");
|
||||
console.log(" 1. 点击编辑器工具栏的图片按钮(🖼️)");
|
||||
console.log(" 2. 选择 '上传图片'");
|
||||
|
||||
@@ -30,10 +30,11 @@
|
||||
|
||||
## 内容领域优先级
|
||||
|
||||
1. **科技与人文交叉** (40%)
|
||||
1. **科技与人文交叉** (35%)
|
||||
- AI伦理与应用思考
|
||||
- 数字化生活反思
|
||||
- 科技如何服务人性
|
||||
- **教育科技**(家庭AI教育、亲子项目)
|
||||
|
||||
2. **可持续生活** (30%)
|
||||
- 自然与科技平衡
|
||||
@@ -45,8 +46,8 @@
|
||||
- 个人知识管理
|
||||
- 技能迭代与适应
|
||||
|
||||
4. **社会观察** (10%)
|
||||
- 文化现象解读
|
||||
4. **社会观察** (15%)
|
||||
- 教育现象解读
|
||||
- 生活方式变迁
|
||||
- 未来趋势预判
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
### 阶段1:选题决策(1-2小时)
|
||||
- [ ] 从选题库选择或提出新选题
|
||||
- [ ] 使用"选题评估矩阵"打分(>40分才执行)
|
||||
- [ ] 确认领域归属(科技/自然/工作/人文)
|
||||
- [ ] 确认领域归属(科技/自然/工作/人文/教育)
|
||||
- [ ] 确定平台首发(知乎为主)
|
||||
- [ ] 设定预期目标(阅读量、互动等)
|
||||
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
# LLM API 调用配置
|
||||
|
||||
# 并发控制规则
|
||||
# - 最大并发数: 2
|
||||
# - 每分钟最大调用次数: 60
|
||||
concurrency:
|
||||
max_concurrent: 2
|
||||
max_requests_per_minute: 60
|
||||
|
||||
# 串行调用(严禁并发)- 已废弃
|
||||
# 旧规则: 串行调用, ≤30次/分钟
|
||||
# 新规则: 并发2, ≤60次/分钟 (2026-05-16 更新)
|
||||
@@ -1,85 +1,115 @@
|
||||
# 信息源配置(可持续性相关)
|
||||
# 信息源配置(AI与科技人文领域)
|
||||
# 注意:仅保留国内可稳定访问的源,移除被墙/下线的源
|
||||
|
||||
sustainability_sources:
|
||||
# 中文信息源(国内可持续性实践)优先使用
|
||||
chinese:
|
||||
- name: "新华网-环保频道"
|
||||
# 中文RSS源(国内媒体,可稳定访问)
|
||||
rss:
|
||||
- name: "36氪-最新"
|
||||
type: "rss"
|
||||
url: "http://www.xinhuanet.com/energy/rss.xml"
|
||||
url: "https://36kr.com/feed"
|
||||
update_frequency: "daily"
|
||||
credibility: "high"
|
||||
focus: "国内环保政策"
|
||||
- name: "人民网-生态环境频道"
|
||||
focus: "科技商业、AI行业"
|
||||
keywords:
|
||||
- "AI"
|
||||
- "人工智能"
|
||||
- "大模型"
|
||||
- "科技"
|
||||
- "数字化"
|
||||
- "创业"
|
||||
- name: "少数派"
|
||||
type: "rss"
|
||||
url: "http://env.people.com.cn/rss/150323.xml"
|
||||
url: "https://sspai.com/feed"
|
||||
update_frequency: "daily"
|
||||
credibility: "medium"
|
||||
focus: "科技数码、效率工具"
|
||||
keywords:
|
||||
- "AI"
|
||||
- "效率"
|
||||
- "工具"
|
||||
- "数字"
|
||||
- "智能"
|
||||
- "工作流"
|
||||
- name: "机器之心"
|
||||
type: "rss"
|
||||
url: "https://jiqizhixin.com/rss"
|
||||
update_frequency: "daily"
|
||||
credibility: "high"
|
||||
focus: "生态环境新闻"
|
||||
- name: "中国环境新闻"
|
||||
type: "web"
|
||||
base_url: "http://www.cenews.com.cn/"
|
||||
update_frequency: "daily"
|
||||
credibility: "high"
|
||||
focus: "环境新闻"
|
||||
- name: "国家发改委-低碳政策"
|
||||
type: "web"
|
||||
base_url: "https://www.ndrc.gov.cn"
|
||||
credibility: "high"
|
||||
focus: "政策动态"
|
||||
focus: "AI学术前沿、论文解读"
|
||||
keywords:
|
||||
- "AI"
|
||||
- "论文"
|
||||
- "大模型"
|
||||
- "算法"
|
||||
- "研究"
|
||||
- "学术"
|
||||
|
||||
# 备用全球信息源(API替代RSS)
|
||||
english_api:
|
||||
- name: "UN Environment Programme"
|
||||
type: "api"
|
||||
url: "https://www.unep.org/news-and-stories"
|
||||
# 搜索引擎采集(通过Bing中文搜索抓取热点)
|
||||
web_search:
|
||||
- name: "AI前沿资讯搜索"
|
||||
type: "web_search"
|
||||
query: "AI 人工智能 大模型 前沿 突破 2026"
|
||||
update_frequency: "daily"
|
||||
credibility: "medium"
|
||||
focus: "AI行业动态、技术突破"
|
||||
- name: "AI工具搜索"
|
||||
type: "web_search"
|
||||
query: "AI工具 效率提升 AI工作流 实用 2026"
|
||||
update_frequency: "daily"
|
||||
credibility: "medium"
|
||||
focus: "AI工具评测、效率方法"
|
||||
- name: "AI职场搜索"
|
||||
type: "web_search"
|
||||
query: "AI 裁员 职业转型 AI技能 远程工作 2026"
|
||||
update_frequency: "daily"
|
||||
credibility: "medium"
|
||||
focus: "AI对就业影响、职业转型"
|
||||
- name: "AI生活化搜索"
|
||||
type: "web_search"
|
||||
query: "AI陪伴 AI生活助手 AI心理咨询 智能体 2026"
|
||||
update_frequency: "daily"
|
||||
credibility: "medium"
|
||||
focus: "AI人格化、生活场景应用"
|
||||
- name: "科技人文搜索"
|
||||
type: "web_search"
|
||||
query: "AI伦理 数字生活 科技反思 人机关系 2026"
|
||||
update_frequency: "daily"
|
||||
credibility: "medium"
|
||||
focus: "AI伦理、科技人文反思"
|
||||
# ── 差异化源(与通用AI媒体形成区分)──
|
||||
- name: "AI学术论文搜索"
|
||||
type: "web_search"
|
||||
query: "arXiv 论文 AI 最新研究 大模型 2026"
|
||||
update_frequency: "weekly"
|
||||
credibility: "high"
|
||||
focus: "全球环境政策"
|
||||
- name: "World Economic Forum Sustainability"
|
||||
type: "api"
|
||||
url: "https://www.weforum.org/topics/sustainability/"
|
||||
update_frequency: "weekly"
|
||||
focus: "AI学术前沿、论文中文解读"
|
||||
- name: "独立开发者搜索"
|
||||
type: "web_search"
|
||||
query: "独立开发者 AI产品 一人公司 出海工具 indie hacking 2026"
|
||||
update_frequency: "daily"
|
||||
credibility: "medium"
|
||||
focus: "独立开发者生态、小众AI产品"
|
||||
- name: "行业数据报告搜索"
|
||||
type: "web_search"
|
||||
query: "AI行业报告 数据统计 市场分析 AI应用渗透率 2026"
|
||||
update_frequency: "daily"
|
||||
credibility: "high"
|
||||
focus: "可持续商业"
|
||||
focus: "行业数据、市场报告、AI应用统计"
|
||||
- name: "AI产品动态搜索"
|
||||
type: "web_search"
|
||||
query: "AI产品发布 更新 changelog 新功能 OpenAI Claude 2026"
|
||||
update_frequency: "daily"
|
||||
credibility: "medium"
|
||||
focus: "AI产品迭代、功能更新"
|
||||
|
||||
# 本地案例库(保底数据源)
|
||||
local:
|
||||
- name: "宇之然本地案例库"
|
||||
- name: "宇之然AI案例库"
|
||||
type: "local"
|
||||
file: "strategy/全球案例数据库-v1.md"
|
||||
file: "automation/data/ai_cases.json"
|
||||
update_frequency: "weekly"
|
||||
credibility: "medium"
|
||||
focus: "全球-本土案例"
|
||||
- name: "历史选题库"
|
||||
type: "local"
|
||||
file: "automation/data/sustainability_topics.json"
|
||||
update_frequency: "daily"
|
||||
credibility: "medium"
|
||||
focus: "复用已有选题"
|
||||
|
||||
# 案例验证要求
|
||||
validation:
|
||||
require_at_least_2_sources: true # 至少2个来源交叉验证
|
||||
prefer_official_data: true # 优先政府/官方数据
|
||||
min_data_points: 3 # 最少3个数据点
|
||||
|
||||
# 选题优先级权重
|
||||
topic_priority:
|
||||
audience_match: 0.3 # 受众匹配度(26-35岁城市焦虑青年)
|
||||
data_availability: 0.25 # 数据可得性
|
||||
uniqueness: 0.2 # 独特性(避免同质化)
|
||||
executability: 0.15 # 可执行性(有MVP行动)
|
||||
brand_fit: 0.1 # 品牌契合度(科技向善+回归本真)
|
||||
|
||||
# 可持续性子领域分类
|
||||
sustainability_categories:
|
||||
- "城市农业"
|
||||
- "零浪费生活"
|
||||
- "低碳出行"
|
||||
- "循环消费"
|
||||
- "能源效率"
|
||||
- "可持续饮食"
|
||||
- "环保科技产品"
|
||||
focus: "AI行业案例"
|
||||
|
||||
# 内容合规检查清单
|
||||
compliance:
|
||||
@@ -92,5 +122,5 @@ compliance:
|
||||
required:
|
||||
- "至少3个可靠引用"
|
||||
- "数据标注来源"
|
||||
- "包含MVP行动"
|
||||
- "包含可操作建议"
|
||||
- "中性客观语气"
|
||||
@@ -1,21 +1,18 @@
|
||||
# 企业微信推送配置
|
||||
# 消息推送配置
|
||||
|
||||
notification_channel: feishu # 推送渠道: wecom 或 feishu
|
||||
|
||||
wecom:
|
||||
# 推送目标:用户 WangLiuTong
|
||||
target_user: "WangLiuTong"
|
||||
# 推送目标:用户 ID(飞书 open_id 或企业微信 userid)
|
||||
target_user: "ou_415e2d4089eec5640f3f364116c59c06"
|
||||
|
||||
# 推送格式
|
||||
message_template:
|
||||
header: "【宇之然自动推送】"
|
||||
footer: "详情请查看项目目录"
|
||||
max_length: 2000 # 企业微信消息长度限制
|
||||
header: ""
|
||||
footer: ""
|
||||
max_length: 2000
|
||||
|
||||
|
||||
# 推送内容类型
|
||||
allowed_content_types:
|
||||
- "选题发现"
|
||||
- "案例更新"
|
||||
- "文章发布"
|
||||
- "系统状态"
|
||||
|
||||
# 图片规格配置(三种平台)
|
||||
image_specs:
|
||||
@@ -81,28 +78,12 @@ content_rules:
|
||||
hashtag_count: 5-10
|
||||
tone: "生活化、亲切、有价值"
|
||||
|
||||
# 企业微信推送模板
|
||||
# 日报模板(最终总结)
|
||||
notification_templates:
|
||||
sustainability_task_complete: |
|
||||
【可持续性内容收集完成】
|
||||
时间: {{TIME}}
|
||||
新增选题数: {{TOPIC_COUNT}}
|
||||
新增案例数: {{CASE_COUNT}}
|
||||
信息源: {{SOURCE_COUNT}}个
|
||||
详情: {{DETAILS_LINK}}
|
||||
|
||||
content_creation_complete: |
|
||||
【内容创作完成】
|
||||
时间: {{TIME}}
|
||||
选题: {{TOPIC_TITLE}}
|
||||
平台版本: 知乎、公众号、小红书
|
||||
图片数: {{IMAGE_COUNT}}
|
||||
文件位置: {{OUTPUT_DIR}}
|
||||
状态: {{STATUS}}
|
||||
|
||||
system_error: |
|
||||
【定时任务异常】
|
||||
任务: {{TASK_NAME}}
|
||||
错误: {{ERROR}}
|
||||
时间: {{TIME}}
|
||||
请检查日志: {{LOG_PATH}}
|
||||
daily_summary: |
|
||||
【宇之然日报】{{DATE}}
|
||||
✅ 已发布 {{PUBLISHED_COUNT}} 篇文章
|
||||
📦 平台:{{PLATFORMS}}
|
||||
📁 发布包:{{PUBLISH_DIR}}
|
||||
——————————
|
||||
全流程结束, awaiting tomorrow's run.
|
||||
@@ -1,123 +0,0 @@
|
||||
# 在上海阳台种菜一年,我收获了啥?
|
||||
|
||||
**领域**:自然 / 生活
|
||||
**形式**:实操指南 + 个人故事
|
||||
**预估字数**:2500
|
||||
**核心观点**:城市农业不仅是种菜,更是与自然重建连接的生活方式
|
||||
|
||||
**受众痛点**:
|
||||
- 想体验田园生活但没条件去农村
|
||||
- 担心食品安全,想自己种菜但不懂技术
|
||||
- 阳台空间小,不知道能种什么
|
||||
- 担心养不活植物,缺乏信心
|
||||
- 城市生活压力大,寻求放松方式
|
||||
|
||||
**独特角度**:
|
||||
- 不鼓吹"田园牧歌",客观展示失败和踩坑
|
||||
- 用数据说话(产量、成本、时间投入)
|
||||
- 结合科技元素(智能种植、垂直农业)
|
||||
- 从心理层面谈与植物建立连接的意义
|
||||
- 延伸讨论城市食物系统和可持续生活
|
||||
|
||||
**数据/案例**(至少3个来源):
|
||||
1. 上海阳台种植调研报告(找本地社区数据)
|
||||
2. 不同蔬菜的生长周期和产量数据(农业网站)
|
||||
3. 城市农业的心理学研究(减压、幸福感)
|
||||
4. 自己一年的种植记录(日志、照片)
|
||||
5. 智能种植设备对比(自动浇水、补光灯等)
|
||||
|
||||
**预估完成时间**:4天
|
||||
**优先级**:高
|
||||
**预计发布时间**:2026-04-15
|
||||
**状态**:待处理
|
||||
|
||||
---
|
||||
|
||||
## 选题评估矩阵
|
||||
|
||||
| 维度 | 评分 | 说明 |
|
||||
|------|------|------|
|
||||
| 受众覆盖 | 8 | 城市青年有共鸣,但相对垂直 |
|
||||
| 独特性 | 9 | 结合个人故事+科学种植+城市农业视角 |
|
||||
| 数据可得性 | 8 | 自己有一年数据,可补充调研 |
|
||||
| 可持续性 | 7 | 可写成系列(不同季节、不同植物) |
|
||||
| 平台契合度 | 9 | 知乎生活/园艺话题,小红书也适合 |
|
||||
| 品牌契合度 | 10 | 科技+自然+生活的完美结合 |
|
||||
| **总分** | **51** | 优先执行 ✅ |
|
||||
|
||||
---
|
||||
|
||||
## 大纲草稿
|
||||
|
||||
### 开头(300字)
|
||||
- 场景:在上海20㎡阳台种出一个小菜园
|
||||
- 问题:很多人觉得不可能/太麻烦
|
||||
- 引子:一年的收获不仅是蔬菜,还有更多
|
||||
|
||||
### 主体(2000字)
|
||||
|
||||
**第一部分:为什么开始?(300字)**
|
||||
- 疫情后的食物焦虑
|
||||
- 对超市蔬菜的不信任
|
||||
- 想找回"土地连接感"
|
||||
- 初始期待(vs 现实)
|
||||
|
||||
**第二部分:阳台农业的真相(500字)**
|
||||
- 空间利用:垂直种植+合理规划
|
||||
- 品种选择:适合上海的蔬菜(番茄、辣椒、生菜、香草)
|
||||
- 成本核算:投入 vs 产出(经济账和心理账)
|
||||
- 时间投入:每天半小时,周末2小时
|
||||
- 失败案例分享(死掉的植物+经验)
|
||||
|
||||
**第三部分:科技让种菜变简单(400字)**
|
||||
- 智能灌溉系统(DIY vs 购买)
|
||||
- 补光灯的应用(光照不足的冬天)
|
||||
- 种植APP辅助(记录、提醒、社区)
|
||||
- 垂直农业设备介绍(Aerogarden等)
|
||||
- AI助手帮我分析植物健康(拍照识别病害)
|
||||
|
||||
**第四部分:收获的不仅是蔬菜(400字)**
|
||||
- 产量记录(一年收获多少斤)
|
||||
- 心理收获:减压、专注、成就感
|
||||
- 家庭关系改善(和家人一起照料)
|
||||
- 环保意义(减少碳足迹、包装垃圾)
|
||||
- 生活方式的改变(更关注季节性、本地食物)
|
||||
|
||||
**第五部分:给新手的建议(400字)**
|
||||
- 从简单的开始(香草、生菜)
|
||||
- 不要一次买太多植物
|
||||
- 必备工具清单(花盆、土、工具)
|
||||
- 常见问题和解决方案
|
||||
- 哪里获取信息和社区支持
|
||||
|
||||
### 结尾(200字)
|
||||
- 城市农业不是回归原始,而是科技赋能的现代生活选择
|
||||
- 哪怕只有一盆香草,也是与自然的连接
|
||||
- 呼吁:从小事做起,重建人与自然的联系
|
||||
- 预告:后续会分享具体种植技术细节
|
||||
|
||||
---
|
||||
|
||||
## 资源清单
|
||||
|
||||
### 数据来源(待收集)
|
||||
- [ ] 上海市社区农业调查报告
|
||||
- [ ] 阳台种植产量统计数据
|
||||
- [ ] 城市农业心理健康研究论文
|
||||
- [ ] 各蔬菜品种生长数据
|
||||
|
||||
### 图片素材(待准备)
|
||||
- [ ] 一年种植时间线照片
|
||||
- [ ] 不同生长阶段特写
|
||||
- [ ] 收获成果展示
|
||||
- [ ] 种植设施和工具照片
|
||||
|
||||
### 引用来源(待标注)
|
||||
- [ ] 农业技术网站
|
||||
- [ ] 学术数据库
|
||||
- [ ] 种植社区讨论
|
||||
- [ ] 科技产品官网
|
||||
|
||||
---
|
||||
|
||||
**决策**:这是一个高潜力选题,品牌契合度极高,预计能获得良好反响。建议优先执行。
|
||||
@@ -1,143 +0,0 @@
|
||||
# AI时代,什么能力不会被替代?
|
||||
|
||||
**领域**:科技 / 职场
|
||||
**形式**:趋势洞察 + 实操建议
|
||||
**预估字数**:2800
|
||||
**核心观点**:AI淘汰的不是工作,而是不会使用AI的人;但有些"人类特质"能力反而更珍贵
|
||||
|
||||
**受众痛点**:
|
||||
- 担心被AI替代,职业焦虑严重
|
||||
- 不知道如何提升自己的竞争力
|
||||
- 听说AI很强,但不知道学什么
|
||||
- 想转行但方向迷茫
|
||||
- 担心投入学习最后还是被淘汰
|
||||
|
||||
**独特角度**:
|
||||
- 区分配"被AI强化的能力"和"AI无法替代的能力"
|
||||
- 从历史技术进步规律看职业演变(不是第一次自动化革命)
|
||||
- 强调"审美、共情、意义构建"等软技能
|
||||
- 给出具体的能力提升路径,不是泛泛而谈
|
||||
- 结合宇之然"科技沟通万物,回归自然"的哲学
|
||||
|
||||
**数据/案例**(至少3个来源):
|
||||
1. 世界经济论坛《未来就业报告》技能趋势数据
|
||||
2. 美国劳工统计局职业自动化概率研究
|
||||
3. AI能力边界研究(GPT-4o vs 人类能力对比)
|
||||
4. 历史案例:工业革命、计算机革命后的职业变化
|
||||
5. 访谈案例:哪些岗位在AI时代反而增值?
|
||||
|
||||
**预估完成时间**:5天
|
||||
**优先级**:高
|
||||
**预计发布时间**:2026-04-18
|
||||
**状态**:待处理
|
||||
|
||||
---
|
||||
|
||||
## 选题评估矩阵
|
||||
|
||||
| 维度 | 评分 | 说明 |
|
||||
|------|------|------|
|
||||
| 受众覆盖 | 9 | 所有职场人士都关心,流量潜力大 |
|
||||
| 独特性 | 8 | 避开"AI工具教程"红海,聚焦深度思考 |
|
||||
| 数据可得性 | 9 | 大量研究报告和历史数据 |
|
||||
| 可持续性 | 8 | 可写成系列(不同行业、不同能力维度) |
|
||||
| 平台契合度 | 9 | 知乎职场/科技话题热门 |
|
||||
| 品牌契合度 | 10 | 科技向善+人文关怀,契合价值观 |
|
||||
| **总分** | **53** | 优先执行 ✅ |
|
||||
|
||||
---
|
||||
|
||||
## 大纲草稿
|
||||
|
||||
### 开头(400字)
|
||||
- 现象:朋友被AI工具震撼,担心失业
|
||||
- 核心问题:AI时代,我们该学什么?
|
||||
- 观点:AI淘汰的不是工作,而是不会使用AI的人;但有些"人类特质"能力反而更珍贵
|
||||
- 预告:本文将分析AI的能力边界,并给出具体的技能提升建议
|
||||
|
||||
### 主体(2200字)
|
||||
|
||||
**第一部分:AI到底有多强?(400字)**
|
||||
- 当前AI能力范围(文本、图像、代码、数据分析)
|
||||
- AI的局限性:没有意识、没有真实体验、无法承担责任
|
||||
- AI的依赖:需要人类提供高质量prompt、数据、验证
|
||||
- 数据:哪些职业自动化概率高(根据研究报告)
|
||||
- 事实:AI不是万能,只是工具
|
||||
|
||||
**第二部分:历史给我们的启示(300字)**
|
||||
- 工业革命:机器取代体力劳动,但创造了新职业
|
||||
- 计算机革命:打字员消失,但程序员、设计师兴起
|
||||
- 每次技术革命都淘汰旧技能,但同时创造更多新技能
|
||||
- 规律:重复性工作易被替代,创造性、社交性工作更难
|
||||
- 结论:不恐惧技术,而是学会驾驭技术
|
||||
|
||||
**第三部分:AI无法替代的3类能力(800字)**
|
||||
|
||||
**A. 审美与创造力**
|
||||
- AI生成的美术、音乐、文字缺少"灵魂"
|
||||
- 真正的好设计需要理解人的情感和文化
|
||||
- 创意工作者(作家、艺术家、设计师)的价值被提升而非降低
|
||||
- 案例:AI辅助创作,但最终决策权在人
|
||||
- 如何培养审美能力?(艺术欣赏、多元输入、实践创作)
|
||||
|
||||
**B. 共情与沟通**
|
||||
- AI无法真正理解人类情感
|
||||
- 医护、教育、管理、咨询等职业的"人味"不可替代
|
||||
- 高情商沟通、冲突调解、心理支持
|
||||
- 案例:AI心理咨询的局限性
|
||||
- 如何提升共情能力?(倾听、换位思考、情绪识别)
|
||||
|
||||
**C. 意义构建与战略思维**
|
||||
- AI能提供数据,但不能替你做价值判断
|
||||
- 决策需要理解"为什么",而不仅是"怎么做"
|
||||
- 战略规划、伦理判断、文化塑造
|
||||
- 案例:企业战略制定,AI只能辅助分析
|
||||
- 如何培养战略思维?(跨领域学习、哲学思考、长期视角)
|
||||
|
||||
**第四部分:AI会强化的能力(400字)**
|
||||
- 学习能力(快速掌握新工具)
|
||||
- 信息筛选与批判性思维(辨别AI输出质量)
|
||||
- 工具使用能力(prompt engineering、AI工作流设计)
|
||||
- 协同能力(人机协作,AI作为副驾驶)
|
||||
- 快速迭代能力(AI加速实验和反馈)
|
||||
|
||||
**第五部分:具体能力提升路径(300字)**
|
||||
- 初级(0-1年):掌握基础AI工具,提升学习效率
|
||||
- 中级(1-3年):发展审美、沟通、批判性思维
|
||||
- 高级(3-5年):建立战略思维,成为AI无法替代的决策者
|
||||
- 学习资源推荐(书籍、课程、实践方法)
|
||||
- 宇之然品牌如何帮助读者提升这些能力?(预告后续内容)
|
||||
|
||||
### 结尾(200字)
|
||||
- AI不是敌人,而是工具
|
||||
- 人类的优势在于"人性":审美、共情、意义构建
|
||||
- 建议:拥抱AI提升效率,同时刻意训练人类特质能力
|
||||
- 呼吁:不要焦虑,而是主动进化
|
||||
- 互动:你在工作中感受到AI的哪些影响?欢迎评论区分享
|
||||
|
||||
---
|
||||
|
||||
## 资源清单
|
||||
|
||||
### 数据来源(待收集)
|
||||
- [ ] WEF《未来就业报告》最新版
|
||||
- [ ] 美国劳工统计局职业自动化概率表
|
||||
- [ ] OpenAI/GPT能力边界研究论文
|
||||
- [ ] 历史技术革命对就业影响的经济学研究
|
||||
- [ ] AI能力与人类能力对比可视化数据
|
||||
|
||||
### 图片素材(待准备)
|
||||
- [ ] AI能力范围示意图
|
||||
- [ ] 自动化概率职业分布图
|
||||
- [ ] 技能矩阵图(会被替代 vs 更珍贵)
|
||||
- [ ] 能力提升路径时间线
|
||||
|
||||
### 引用来源(待标注)
|
||||
- [ ] 世界经济论坛官网
|
||||
- [ ] 学术期刊数据库
|
||||
- [ ] 行业研究报告
|
||||
- [ ] 知名专家观点
|
||||
|
||||
---
|
||||
|
||||
**决策**:这是一个必爆的热门选题,但内容必须深度且有数据支撑,不能流于表面。需要较强的信息整合能力。建议medium-high优先级执行。
|
||||
@@ -1,135 +0,0 @@
|
||||
# 从程序员到数字游民:我的三年转型之路
|
||||
|
||||
**领域**:工作 / 职场
|
||||
**形式**:个人故事 + 实操指南
|
||||
**预估字数**:2600
|
||||
**核心观点**:数字游民不是逃离,而是更聪明的工作生活方式选择
|
||||
|
||||
**受众痛点**:
|
||||
- 受够了996,想自由但不敢行动
|
||||
- 不知道数字游民能做什么,收入从哪来
|
||||
- 担心不稳定、没社保、老了怎么办
|
||||
- 想远程但公司不让,不知如何说服老板
|
||||
- 羡慕别人环游世界,自己却卡在工位
|
||||
|
||||
**独特角度**:
|
||||
- 不美化"边玩边赚",客观展示挑战和代价
|
||||
- 从技术转型案例切入(程序员是最适合数字游民的职业之一)
|
||||
- 用数据说话:收入对比、时间分配、成本核算
|
||||
- 结合"宇之然"理念:科技让人自由,而非束缚
|
||||
- 提供可操作的转型路线图(不是鸡汤)
|
||||
|
||||
**数据/案例**(至少3个来源):
|
||||
1. 数字游民调研报告(人数、收入、职业分布)
|
||||
2. 不同国家的签证政策和生活成本对比(数字游民签证国家)
|
||||
3. 远程工作平台收入数据(Upwork、Toptal等)
|
||||
4. 个人三年转型历程(时间线、收入变化、心路历程)
|
||||
5. 成功/失败数字游民案例访谈
|
||||
|
||||
**预估完成时间**:5天
|
||||
**优先级**:高
|
||||
**预计发布时间**:2026-04-20
|
||||
**状态**:待处理
|
||||
|
||||
---
|
||||
|
||||
## 选题评估矩阵
|
||||
|
||||
| 维度 | 评分 | 说明 |
|
||||
|------|------|------|
|
||||
| 受众覆盖 | 9 | 大量职场人向往自由工作,流量潜力巨大 |
|
||||
| 独特性 | 8 | 避开"如何找远程工作"表层,深入转型战略 |
|
||||
| 数据可得性 | 8 | 调研报告多,个人案例丰富 |
|
||||
| 可持续性 | 9 | 可系列化(不同职业、不同国家、不同阶段) |
|
||||
| 平台契合度 | 9 | 知乎职场/创业热门话题 |
|
||||
| 品牌契合度 | 10 | 科技提升生活自由度,契合"科技沟通万物" |
|
||||
| **总分** | **53** | 优先执行 ✅ |
|
||||
|
||||
---
|
||||
|
||||
## 大纲草稿
|
||||
|
||||
### 开头(400字)
|
||||
- 场景:三年前坐在格子间,加班到深夜,问自己"这就是我想要的生活吗?"
|
||||
- 转折:发现程序员完全可以远程,开始转型尝试
|
||||
- 现状:现在在清迈咖啡馆工作,月收入 comparable,但生活品质完全不同
|
||||
- 核心观点:数字游民不是逃避,而是更聪明的生活方式选择
|
||||
|
||||
### 主体(2200字)
|
||||
|
||||
**第一部分:数字游民的真实生活(400字)**
|
||||
- 破除神话(不是天天旅游、不是躺着赚钱)
|
||||
- 真实时间表:上午工作、下午探索、晚上复盘
|
||||
- 收入稳定性如何保障?(多个客户、项目制)
|
||||
- 孤独感和社交挑战(社群、Co-working)
|
||||
- 数据:平均收入、工作小时、留存率
|
||||
|
||||
**第二部分:为什么程序员适合?(300字)**
|
||||
- 技能可远程交付(代码在哪都能写)
|
||||
- 高需求(全球IT人才短缺)
|
||||
- 收入高且相对稳定
|
||||
- 学习资源丰富(可自学新技能)
|
||||
- 本人的转型路径(从全职到自由职业)
|
||||
|
||||
**第三部分:转型前的准备(500字)**
|
||||
- 财务准备:6-12个月紧急基金
|
||||
- 技能盘点:哪些技能可远程变现?
|
||||
- 作品集建设:GitHub、个人项目、案例
|
||||
- 平台选择:Upwork、Toptal、电鸭、远程工作社区
|
||||
- 先从兼职开始,不要裸辞
|
||||
- 法律和社保:如何自己交?国际医保?
|
||||
|
||||
**第四部分:我的三年路线图(400字)**
|
||||
- 第1年:保存+考证+接小项目(月入5k)
|
||||
- 第2年:建立客户群+提价+过渡(月入15k)
|
||||
- 第3年:稳定客户+被动收入+探索(月入20k+)
|
||||
- 关键节点和决策点
|
||||
- 踩过的坑(低价竞争、客户跑路、签证问题)
|
||||
|
||||
**第五部分:在哪里生活?(300字)**
|
||||
- 数字游民热门城市对比(清迈、巴厘岛、里斯本、东京)
|
||||
- 成本核算(住宿、交通、签证、保险)
|
||||
- 网络和基础设施(稳定WiFi、Coworking)
|
||||
- 社区和社交(容易找到同类人)
|
||||
- 安全和生活便利性
|
||||
|
||||
**第六部分:给想转型者的建议(300字)**
|
||||
- 先试水:请假去远程工作一个月
|
||||
- 不要孤注一掷:保持至少一个稳定收入源
|
||||
- 建立系统:不只是接单,而是建立个人品牌
|
||||
- 心理准备:自由带来责任,自律才能自由
|
||||
- "宇之然"理念:科技让人自由,但自由需要能力支撑
|
||||
|
||||
### 结尾(200字)
|
||||
- 数字游民不是适合所有人,但值得尝试
|
||||
- 关键是找到适合自己的工作生活方式
|
||||
- 鼓励读者思考:我想要什么样的生活?科技能帮我实现吗?
|
||||
- 预告:后续分享具体技能提升路线(程序员转远程)
|
||||
|
||||
---
|
||||
|
||||
## 资源清单
|
||||
|
||||
### 数据来源(待收集)
|
||||
- [ ] 数字游民数量增长数据( Nomad List 、相关报告)
|
||||
- [ ] 程序员远程工作薪资调研
|
||||
- [ ] 各国数字游民签证政策汇总
|
||||
- [ ] Coworking 空间成本统计
|
||||
- [ ] IT自由职业平台收入报告
|
||||
|
||||
### 图片素材(待准备)
|
||||
- [ ] 三年转型时间线图
|
||||
- [ ] 不同城市成本对比图表
|
||||
- [ ] 收入变化曲线
|
||||
- [ ] 世界各地工作地点照片(清迈咖啡馆等)
|
||||
- [ ] Coworking 空间环境图
|
||||
|
||||
### 引用来源(待标注)
|
||||
- [ ] Nomad List 官网数据
|
||||
- [ ] 数字游民社区统计
|
||||
- [ ] 各国签证政策官网
|
||||
- [ ] 远程工作平台文档
|
||||
|
||||
---
|
||||
|
||||
**决策**:这是一个高流量选题,竞争也激烈,需要深度个人故事+系统化建议才能脱颖而出。建议 medium-high 优先级。
|
||||
@@ -1,143 +0,0 @@
|
||||
# 零浪费生活一年:一个家庭产生的垃圾去哪儿了?
|
||||
|
||||
**领域**:自然 / 生活
|
||||
**形式**:实验记录 + 科普指南
|
||||
**预估字数**:2300
|
||||
**核心观点**:零浪费不是苦行,而是更聪明的消费选择;个人行动虽小,但能改变系统
|
||||
|
||||
**受众痛点**:
|
||||
- 想环保但不知道从何下手
|
||||
- 觉得"我一个人做有什么用"
|
||||
- 担心成本太高,负担不起
|
||||
- 嫌麻烦,步骤太多坚持不下去
|
||||
- 家人不理解,无法统一战线
|
||||
- 超市买买买停不下来,事后又后悔
|
||||
|
||||
**独特角度**:
|
||||
- 不道德绑架,用数据和成本说服
|
||||
- 展示失败和妥协(不是完美零浪费,而是持续改进)
|
||||
- 从家庭视角(夫妻+孩子)而非个人
|
||||
- 连接科技:用App记录、智能采购、循环经济平台
|
||||
- 强调经济收益(省了多少钱)而非道德优越
|
||||
|
||||
**数据/案例**(至少3个来源):
|
||||
1. 中国城市生活垃圾产生量数据(统计年鉴)
|
||||
2. 不同包装方式的碳足迹对比(生产、运输、处理)
|
||||
3. 零浪费家庭采访或书籍(如Bea Johnson, 0 Waste Home)
|
||||
4. 自己一年的垃圾记录(称重、分类、分析)
|
||||
5. 环保产品性价比对比(可重复使用 vs 一次性)
|
||||
|
||||
**预估完成时间**:4天
|
||||
**优先级**:高
|
||||
**预计发布时间**:2026-04-22
|
||||
**状态**:待处理
|
||||
|
||||
---
|
||||
|
||||
## 选题评估矩阵
|
||||
|
||||
| 维度 | 评分 | 说明 |
|
||||
|------|------|------|
|
||||
| 受众覆盖 | 8 | 环保意识提升,但执行力不足的人多 |
|
||||
| 独特性 | 9 | 家庭实验视角,真实数据,不教条 |
|
||||
| 数据可得性 | 8 | 垃圾数据、环保报告、产品对比可获取 |
|
||||
| 可持续性 | 8 | 可系列(厨余、包装、衣物、电子产品等) |
|
||||
| 平台契合度 | 8 | 知乎生活/环保话题,小红书也适合 |
|
||||
| 品牌契合度 | 10 | 自然+科技+生活,完美契合价值观 |
|
||||
| **总分** | **51** | 优先执行 ✅ |
|
||||
|
||||
---
|
||||
|
||||
## 大纲草稿
|
||||
|
||||
### 开头(300字)
|
||||
- 场景:2025年1月1日,我在家门口放了一个垃圾桶,记录一整年的垃圾
|
||||
- 问题:一个家庭一年会产生多少垃圾?它们最后去哪了?
|
||||
- 引子:零浪费不是不吃不喝,而是 smarter consumption
|
||||
- 预告:分享一年实验数据、踩坑经验、经济收益
|
||||
|
||||
### 主体(1800字)
|
||||
|
||||
**第一部分:我们这一年扔了啥?(300字)**
|
||||
- 垃圾总量:XX公斤(对比全国人均)
|
||||
- 分类数据:塑料、包装、厨余、其他
|
||||
- 月度趋势(节假日更多,夏季更多)
|
||||
- 最大来源:外卖包装、快递箱、食品包装
|
||||
- 可视化:饼图+月度折线图
|
||||
|
||||
**第二部分:我们是怎么做到的?(400字)**
|
||||
- 原则5R:Refuse(拒绝不需要的)、Reduce(减少)、Reuse(重复使用)、Recycle(回收)、Rot(堆肥)
|
||||
- 购物习惯改变:
|
||||
- 带袋子买菜(拒绝塑料袋)
|
||||
- 散装优先(减少包装)
|
||||
- 耐用品替代一次性(硅胶保鲜膜、可重复使用的咖啡杯)
|
||||
- 二手优先(家具、电子产品、衣物)
|
||||
- 厨余处理:堆肥桶+社区堆肥点
|
||||
- 家庭共识:夫妻+孩子的参与,不是一个人负重前行
|
||||
- 妥协:不可能100%,目标是逐年降低
|
||||
|
||||
**第三部分:科技让零浪费变简单(300字)**
|
||||
- 零浪费购物App(包, 乐活等)
|
||||
- 智能库存管理(避免买多导致浪费)
|
||||
- 社区交换平台(闲鱼、小区群)
|
||||
- 可降解产品追踪(哪些真的环保?)
|
||||
- 碳足迹计算器(量化自己的贡献)
|
||||
|
||||
**第四部分:经济账(200字)**
|
||||
- 初始投入:玻璃罐、棉布袋、不锈钢饭盒(XXX元)
|
||||
- 每月节省:减少外卖/包装(XXX元)、二手购物(XXX元)
|
||||
- 一年净节省:XXXX元(ROI 200%+)
|
||||
- 隐性收益:更健康饮食(少点外卖),更理性消费
|
||||
- 环保不是富人游戏,穷人更应该
|
||||
|
||||
**第五部分:挑战与妥协(300字)**
|
||||
- 家人不配合:老人舍不得扔旧物,孩子要零食包装
|
||||
- 社交压力:聚会自带杯子被嘲笑
|
||||
- 便利性:有时候真的没时间准备
|
||||
- 产品缺失:市场上零浪费选择太少
|
||||
- 我们没有做到的地方:电子产品循环难、医疗包装无法避免
|
||||
- 心态调整:进步不是完美,可持续才是关键
|
||||
|
||||
**第六部分:我们的建议(300字)**
|
||||
- 从最容易的3件事开始:带袋子、少点外卖、二手优先
|
||||
- 设定合理目标(比如年度垃圾减量20%)
|
||||
- 记录数据(否则不知道进步)
|
||||
- 找到社区(一个人走不远)
|
||||
- 关注政策(垃圾分类、再生资源回收)
|
||||
- 科技赋能(用工具降低门槛)
|
||||
- "宇之然"理念:零浪费不是回到原始,而是科技赋能的智能生活
|
||||
|
||||
### 结尾(200字)
|
||||
- 一年垃圾量:XXX公斤(对比第一年减少XX%)
|
||||
- 零浪费不是苦行,是更高质量的生活
|
||||
- 每一个小行动都在影响系统
|
||||
- 呼吁:不要追求完美,追求持续改进
|
||||
- 互动:你的零浪费实践是什么?欢迎分享
|
||||
|
||||
---
|
||||
|
||||
## 资源清单
|
||||
|
||||
### 数据来源(待收集)
|
||||
- [ ] 中国城市生活垃圾产生量年度数据(国家统计局)
|
||||
- [ ] 各类包装碳足迹数据(学术论文)
|
||||
- [ ] 零浪费家庭案例(国内外博客、书籍)
|
||||
- [ ] 零浪费产品成本与一次性对比
|
||||
- [ ] 社区堆肥项目案例
|
||||
|
||||
### 图片素材(待准备)
|
||||
- [ ] 一年垃圾记录照片(分类展示)
|
||||
- [ ] 零浪费购物装备(布袋、罐子、饭盒)
|
||||
- [ ] 堆肥桶和成果
|
||||
- [ ] 数据图表(垃圾量趋势、分类占比、经济收益)
|
||||
- [ ] 前后对比(购物方式、垃圾桶状态)
|
||||
|
||||
### 引用来源(待标注)
|
||||
- [ ] 零浪费运动创始人Bea Johnson
|
||||
- [ ] 《零浪费生活》等书籍
|
||||
- [ ] 环保组织报告(如WWF、Greenpeace)
|
||||
- [ ] 国内零 waste community
|
||||
|
||||
---
|
||||
|
||||
**决策**:实验性质内容,容易引发共鸣和讨论,互动率高。适合知乎和小红书。建议high优先级。
|
||||
@@ -1,166 +0,0 @@
|
||||
# 深度工作实践:如何在干扰世界中保持专注
|
||||
|
||||
**领域**:工作 / 生产力
|
||||
**形式**:实操指南 + 个人实验
|
||||
**预估字数**:2400
|
||||
**核心观点**:专注力是新时代最稀缺的资源,通过系统方法可以重建深度工作能力
|
||||
|
||||
**受众痛点**:
|
||||
- 每天忙碌但没产出,时间碎片化
|
||||
- 容易被手机、消息、同事打断
|
||||
- 知道要专注,但就是控制不住刷手机
|
||||
- 工作1小时,实际只有30分钟在干活
|
||||
- 想要心流状态但总进不去
|
||||
- 下班累但没成就感
|
||||
|
||||
**独特角度**:
|
||||
- 不鸡汤,用实验数据和自我追踪说话
|
||||
- 结合科技工具(Forest、番茄钟、白噪音)和传统方法
|
||||
- 承认现代工作环境的现实(完全隔离不现实),提供折中方案
|
||||
- 从神经科学和心理学角度解释why,不只是how
|
||||
- 强调"深度休息"与"深度工作"的交替
|
||||
|
||||
**数据/案例**(至少3个来源):
|
||||
1. Cal Newport《深度工作》理论体系
|
||||
2. 注意力恢复理论(Attention Restoration Theory)
|
||||
3. 番茄工作法实证研究(效果数据)
|
||||
4. 个人3个月实验数据(专注时间、任务完成量、压力水平)
|
||||
5. 知识工作者专注力调研( interruptions cost)
|
||||
|
||||
**预估完成时间**:4天
|
||||
**优先级**:高
|
||||
**预计发布时间**:2026-04-23
|
||||
**状态**:待处理
|
||||
|
||||
---
|
||||
|
||||
## 选题评估矩阵
|
||||
|
||||
| 维度 | 评分 | 说明 |
|
||||
|------|------|------|
|
||||
| 受众覆盖 | 9 | 所有知识工作者都需要,流量潜力极大 |
|
||||
| 独特性 | 7 | 话题热门,需要用数据和实验脱颖而出 |
|
||||
| 数据可得性 | 9 | 大量研究文献和工具可用 |
|
||||
| 可持续性 | 8 | 可系列(不同环境、不同工具、不同性格) |
|
||||
| 平台契合度 | 9 | 知乎职场/效率热门,小红书打卡也适合 |
|
||||
| 品牌契合度 | 8 | 科技辅助专注,但最终回归人的本质 |
|
||||
| **总分** | **50** | 优先执行 ✅ |
|
||||
|
||||
---
|
||||
|
||||
## 大纲草稿
|
||||
|
||||
### 开头(300字)
|
||||
- 场景:上周写一份报告,计划4小时,实际花了8小时,中间刷了20次手机
|
||||
- 问题:为什么我们越来越忙,产出却越来越少?
|
||||
- 观点:不是时间不够,是注意力被碎片化
|
||||
- 预告:分享3个月深度工作实验,数据+方法+工具
|
||||
|
||||
### 主体(1900字)
|
||||
|
||||
**第一部分:专注力危机(300字)**
|
||||
- 数据:平均专注时长从26分钟降到8分钟(Microsoft研究)
|
||||
- 知识工作者每天被中断多少次?(59次/天,平均)
|
||||
- 切换成本:每次中断后需要23分钟回到深度状态
|
||||
- 现代工作环境:开放式办公室、即时通讯、通知轰炸
|
||||
- 后果:疲惫、低效、创造力下降
|
||||
|
||||
**第二部分:什么是深度工作?(200字)**
|
||||
- Cal Newport定义:无干扰的认知挑战性工作
|
||||
- 与肤浅工作的对比(容易回复的邮件、会议、行政事务)
|
||||
- 为什么深度工作有价值?(高价值产出、技能增长、成就感)
|
||||
- 神经科学解释:默认模式网络 vs 专注模式
|
||||
- 个人实验目标:将每日深度工作时间从1h提升到4h
|
||||
|
||||
**第三部分:我的3个月实验设计(200字)**
|
||||
- 基线测量:第一周不干预,记录专注情况(RescueTime数据)
|
||||
- 变量引入:每周测试一种方法(时间块、地点、工具)
|
||||
- 评估指标:深度工作时长、任务完成量、主观疲劳度
|
||||
- 数据收集:自动追踪+每日日志
|
||||
- 工具:Forest、番茄钟、白噪音、时间追踪App
|
||||
|
||||
**第四部分:7个有效方法(800字)**
|
||||
1. **时间块法**:每天固定2-3个90分钟深度时段(早上最佳)
|
||||
- 如何保护这些时段?(关闭通知、告知同事)
|
||||
- 案例:我如何说服老板让我上午不参加会议
|
||||
|
||||
2. **地点隔离**:物理空间决定心理状态
|
||||
- 家里打造深度工作角(哪怕只有一张桌子)
|
||||
- 共享办公/图书馆vs咖啡馆(哪个更好?)
|
||||
- 通勤时间利用(地铁上不适合深度,但可做浅层)
|
||||
|
||||
3. **工具辅助**:科技帮你专注,而不是分心
|
||||
- Forest种树:游戏化保持专注
|
||||
- Cold Turkey Blocker:屏蔽 distracting sites
|
||||
- 白噪音/自然声:掩盖环境噪音
|
||||
- 双显示器设置(主屏工作,副屏消息)
|
||||
|
||||
4. **仪式感建立**:让大脑进入"工作模式"
|
||||
- 开始前:一杯茶+5分钟冥想+清单
|
||||
- 结束时:总结+小奖励
|
||||
- 服装:穿"工作装"即使在家
|
||||
|
||||
5. **批处理浅层工作**:集中处理邮件、消息、会议
|
||||
- 每天2个固定时段(下午3点、5点)
|
||||
- 其他时间绝不查看
|
||||
- 快速回复模板
|
||||
|
||||
6. **注意力训练**:像肌肉一样训练专注
|
||||
- 每天10分钟正念冥想(Headspace)
|
||||
- 单任务练习(吃饭不刷手机)
|
||||
- 阅读长文章(训练持续注意力)
|
||||
|
||||
7. **深度休息**:专注需要高质量的休息
|
||||
- 90分钟工作+15分钟休息(非屏幕活动)
|
||||
- 午休必须离开工位
|
||||
- 晚上完全断开(数字安息日)
|
||||
- 睡眠优先(专注力的基础)
|
||||
|
||||
**第五部分:实验结果与数据(300字)**
|
||||
- 深度工作时长变化:基线1.2h/天 → 实验后3.8h/天
|
||||
- 任务完成量提升:每周完成项目数从2个→5个
|
||||
- 主观疲劳度下降:从每天7分(10分制)降到4分
|
||||
- 最有用的方法:时间块法(增加1.5h)+ 工具辅助(增加0.8h)
|
||||
- 意外发现:地点隔离效果不明显(家里角落即可)
|
||||
|
||||
**第六部分:常见障碍与解决方案(200字)**
|
||||
- 同事/老板随时找你怎么办?(设置"专注时段"通知)
|
||||
- 自己忍不住刷手机怎么办?(物理隔离手机)
|
||||
- 老板要求即时回复怎么办?(协商沟通规则)
|
||||
- 创意型工作无法计划怎么办?(灵感记录+深度时间块)
|
||||
- 适应期烦躁怎么办?(从1小时开始,逐步增加)
|
||||
|
||||
### 结尾(200字)
|
||||
- 深度工作不是天赋,是可以训练的技能
|
||||
- 关键不是完美,而是持续改进
|
||||
- 科技让我们更容易分心,但也给了我们工具对抗
|
||||
- "宇之然"理念:专注才能产生深度价值
|
||||
- 挑战:从明天开始,尝试一个90分钟的时间块
|
||||
|
||||
---
|
||||
|
||||
## 资源清单
|
||||
|
||||
### 数据来源(待收集)
|
||||
- [ ] Microsoft 注意力跨度研究报告
|
||||
- [ ] RescueTime 知识工作者专注数据
|
||||
- [ ] 番茄工作法效果 meta-analysis
|
||||
- [ ] 神经科学关于注意力切换的研究
|
||||
- [ ] 正念冥想对专注力的影响
|
||||
|
||||
### 图片素材(待准备)
|
||||
- [ ] 深度工作时长趋势图(实验前后对比)
|
||||
- [ ] 7种方法示意图
|
||||
- [ ] 时间块安排示例(日历截图)
|
||||
- [ ] 专注工具界面截图(Forest、白噪音)
|
||||
- [ ] 实验数据表格
|
||||
|
||||
### 引用来源(待标注)
|
||||
- [ ] Cal Newport《深度工作》
|
||||
- [ ] 《倦怠社会》等社会学视角
|
||||
- [ ] 心理学研究(注意力、心流)
|
||||
- [ ] 工具官网和教程
|
||||
|
||||
---
|
||||
|
||||
**决策**:非常实用的主题,数据驱动,易引发收藏和转发。适合知乎收藏夹和小红书打卡。建议 high 优先级。
|
||||
@@ -1,183 +0,0 @@
|
||||
# 副业月入过万:我一个程序员的三年探索之路
|
||||
|
||||
**领域**:工作 / 副业
|
||||
**形式**:实操经验 + 方法论总结
|
||||
**预估字数**:2700
|
||||
**核心观点**:副业不是投机,而是将主业技能产品化、多元化的过程
|
||||
|
||||
**受众痛点**:
|
||||
- 工资不够花,想搞钱但不知道从哪开始
|
||||
- 听说过很多副业(自媒体、电商、咨询),但不知哪个适合
|
||||
- 时间有限,如何在主业之外有效投入
|
||||
- 担心副业影响主业,被公司发现
|
||||
- 交过学费买课,但没赚到钱
|
||||
- 想开始但总在观望,不敢行动
|
||||
|
||||
**独特角度**:
|
||||
- 从技术人视角(程序员)看副业选项,但方法论通用
|
||||
- 不鼓吹"月入十万"的毒鸡汤,诚实展示时间和金钱投入
|
||||
- 强调"技能产品化"而非"时间换钱"(避免陷入低效劳务)
|
||||
- 用数据说话:我的三年副业收入变化、时间分配、失败案例
|
||||
- 结合长期主义:副业是为了人生更多选择,不仅是赚钱
|
||||
|
||||
**数据/案例**(至少3个来源):
|
||||
1. 中国职场人副业调研报告(参与率、收入分布)
|
||||
2. 程序员技能变现渠道对比(外包、咨询、产品、内容)
|
||||
3. 时间投入与回报曲线(前期低效,后期复利)
|
||||
4. 个人三年副业数据(2019-2021):时间投入vs收入产出
|
||||
5. 成功/失败副业案例分析(为什么有些成了有些黄了)
|
||||
|
||||
**预估完成时间**:5天
|
||||
**优先级**:高
|
||||
**预计发布时间**:2026-04-25
|
||||
**状态**:待处理
|
||||
|
||||
---
|
||||
|
||||
## 选题评估矩阵
|
||||
|
||||
| 维度 | 评分 | 说明 |
|
||||
|------|------|------|
|
||||
| 受众覆盖 | 9 | 大量职场人有副业需求,搜索和阅读量巨大 |
|
||||
| 独特性 | 7 | 副业话题热,需要真实数据和深度分析才能出彩 |
|
||||
| 数据可得性 | 9 | 调研报告多,个人案例可详细追踪 |
|
||||
| 可持续性 | 9 | 可系列(不同阶段、不同技能、不同平台) |
|
||||
| 平台契合度 | 9 | 知乎职场/赚钱热门,小红书副业也火 |
|
||||
| 品牌契合度 | 9 | 科技赋能多元收入,增加人生选择权 |
|
||||
| **总分** | **52** | 优先执行 ✅ |
|
||||
|
||||
---
|
||||
|
||||
## 大纲草稿
|
||||
|
||||
### 开头(400字)
|
||||
- 场景:2019年,我还是一枚996程序员,每月税后1.2万,觉得不够用
|
||||
- 尝试:接过外包、做过咨询、写过公众号、卖过课程、尝试过跨境电商
|
||||
- 现状:现在副业收入已超过主业,时间自由,有选择权
|
||||
- 核心观点:副业不是一夜暴富,而是技能产品化和持续积累的过程
|
||||
- 预告:分享三年探索的数据、踩坑、方法论
|
||||
|
||||
### 主体(2200字)
|
||||
|
||||
**第一部分:副业真相(破除幻想)(300字)**
|
||||
- 不是所有副业都赚钱:80%的人副业收入<2000元
|
||||
- 不是 Easily Money:前期投入巨大(时间、学习、试错)
|
||||
- 不是可持续的劳务:用时间换钱必然后劲不足
|
||||
- 数据:我的前18个月副业收入总计才8000元
|
||||
- 真相:副业是"第二曲线"需要长期培育
|
||||
|
||||
**第二部分:副业类型全景图(300字)**
|
||||
- **技能变现型**:外包、咨询、培训(适合技术人)
|
||||
- 平台:Upwork、电鸭、知乎 Live、自有客户
|
||||
- 特点:时间换钱,单价高但线性增长
|
||||
- **产品型**:开发工具、课程、模板、SaaS
|
||||
- 前期投入大,后期复利
|
||||
- 例子:我做的 Chrome 插件年收入X万
|
||||
- **内容型**:公众号、知乎、B站、小红书
|
||||
- 长周期变现,但品牌效应强
|
||||
- 例子:我的技术博客如何带来咨询客户
|
||||
- **电商/贸易型**:跨境电商、二手、定制
|
||||
- 资金和库存压力大,技术人不擅长
|
||||
- 我失败的案例:淘宝店
|
||||
- **投资型**:股票、基金、加密货币(不推荐作为主业外重点)
|
||||
- **混合型**:我的组合:技能变现+产品+内容
|
||||
|
||||
**第三部分:程序员适合什么副业?(300字)**
|
||||
- 优势:技术可远程交付、技能稀缺、学习能力强
|
||||
- 最适合:
|
||||
1. 技术外包/咨询(起步最快,但天花板低)
|
||||
2. 开发小工具/SaaS(复利高,但需要产品思维)
|
||||
3. 技术内容创作(博客、课程、咨询)
|
||||
4. 技术团队组建(成为自由职业团队leader)
|
||||
- 不适合:
|
||||
1. 需要大量资金的(电商库存)
|
||||
2. 纯体力或线下服务的
|
||||
3. 需要法律资质的(金融咨询)
|
||||
|
||||
**第四部分:我的三年路线图(400字)**
|
||||
- **第1年(2019)**:探索+试错
|
||||
- 目标:尝试3种副业,找到1-2个可行的
|
||||
- 行动:接外包(赚了1.5万)、写博客(0收入)、尝试跨境电商(亏损2k)
|
||||
- 学习:时间管理、客户沟通、基础营销
|
||||
- 结果:发现外包可行但累,内容有潜力但慢
|
||||
- 时间投入:每周10-15小时
|
||||
- **第2年(2020)**:聚焦+优化
|
||||
- 目标:在技术外包+内容创作双线推进,月入稳定5000
|
||||
- 行动:提高外包单价(从100$/h到150$/h),博客系统性写作
|
||||
- 学习:个人品牌、定价策略、产品化
|
||||
- 结果:外包月均3000,博客带来1个咨询项目(5000)
|
||||
- 时间投入:每周15小时(主业压力大)
|
||||
- **第3年(2021)**:产品化+规模化
|
||||
- 目标:将知识产品化,打造"第二曲线"
|
||||
- 行动:开发Chrome插件(年收入2万),出版电子书(1.5万),高单价咨询
|
||||
- 学习:产品运营、用户增长、自动化
|
||||
- 结果:副业月均1.2万,首次超过主业
|
||||
- 时间投入:每周20小时(但其中50%是产品维护)
|
||||
|
||||
**第五部分:时间管理:主业+副业如何平衡?(200字)**
|
||||
- 原则1:主业优先,不能因副业影响主业绩效(可能被开除)
|
||||
- 原则2:副业时间固定(早上6-8点、晚上8-10点、周末4小时)
|
||||
- 原则3:批量处理(每周日规划,减少切换成本)
|
||||
- 原则4:学会说"不"(拒绝低价值副业请求)
|
||||
- 我的时间分配:周总副业时间15h(低于20h安全线)
|
||||
|
||||
**第六部分:技能产品化:从时间换钱到复利增长(300字)**
|
||||
- 外包(时间换钱):1h=150元,但做才有
|
||||
- 产品(一次创造,多次销售):开发一个工具,持续销售
|
||||
- 内容(建立品牌,带来被动机会):博客带来咨询,不需主动找
|
||||
- 我的产品:Chrome插件(每月销售,收入稳定)
|
||||
- 如何选择产品方向?(你解决自己的问题,可能也是别人的问题)
|
||||
- 最小可行产品(MVP)快速验证
|
||||
|
||||
**第七部分:避坑指南(200字)**
|
||||
- 坑1:低价竞争(不要接低于市场价的活,会拉低你的价值)
|
||||
- 坑2:完美主义(先做出来,再优化;不要等完美才发布)
|
||||
- 坑3:孤军奋战(找导师、加入社群、互相支持)
|
||||
- 坑4:忽略法律(兼职合同、知识产权、个税)
|
||||
- 坑5:忽视健康(连续熬夜接单,不可持续)
|
||||
- 坑6:过度承诺(能力范围内再接,否则口碑崩塌)
|
||||
|
||||
**第八部分:给初学者的行动清单(200字)**
|
||||
1. 盘点你的技能:什么可远程交付?什么可产品化?
|
||||
2. 选择1-2个方向(不要贪多)
|
||||
3. 用3个月探索:每方向投入100小时试水
|
||||
4. 记录数据:时间投入、收入、满意度
|
||||
5. 6个月后评估:哪个ROI最高?哪个最有潜力?
|
||||
6. 聚焦+优化:放弃低ROI的,加注高潜力的
|
||||
7. 建立系统:不是每次从零开始,而是有流程
|
||||
8. 定期复盘(每月一次)
|
||||
|
||||
### 结尾(200字)
|
||||
- 副业不只是赚钱,更是探索人生更多可能
|
||||
- 我的现状:主业稳定,副业自由,有选择权
|
||||
- "宇之然"理念:科技给人自由,副业是实现自由的一种路径
|
||||
- 鼓励:从今晚开始,花1小时盘点你的技能
|
||||
- 互动:你的副业探索经历如何?欢迎分享
|
||||
|
||||
---
|
||||
|
||||
## 资源清单
|
||||
|
||||
### 数据来源(待收集)
|
||||
- [ ] 中国职场人副业现状调研(智联、脉脉等)
|
||||
- [ ] 程序员收入与副业相关性数据
|
||||
- [ ] 自由职业平台(Upwork、电鸭)收入报告
|
||||
- [ ] 数字游民与副业的关系研究
|
||||
- [ ] 时间投入与收入曲线(复利效应数据)
|
||||
|
||||
### 图片素材(待准备)
|
||||
- [ ] 三年副业收入增长曲线
|
||||
- [ ] 时间分配饼图(每天/每周)
|
||||
- [ ] 副业类型对比矩阵(时间vs金钱vs长期价值)
|
||||
- [ ] 技能产品化流程图
|
||||
- [ ] 避坑指南信息图
|
||||
|
||||
### 引用来源(待标注)
|
||||
- [ ] 《副业赚钱》等书籍
|
||||
- [ ] 知名副业博主案例
|
||||
- [ ] Upwork/Toptal 平台报告
|
||||
- [ ] 个人博客和项目数据
|
||||
|
||||
---
|
||||
|
||||
**决策**:刚需话题,竞争激烈但需求巨大。真实数据和实操经验是关键。适合知乎和小红书。建议 high 优先级。
|
||||
@@ -1,180 +0,0 @@
|
||||
# 正念冥想一年:从焦虑到平静的转变
|
||||
|
||||
**领域**:人文 / 心理健康
|
||||
**形式**:个人实验 + 科学解读
|
||||
**预估字数**:2200
|
||||
**核心观点**:冥想不是玄学,是可训练的大脑肌肉;一年练习带来可测量的认知和情绪变化
|
||||
|
||||
**受众痛点**:
|
||||
- 焦虑、失眠、注意力不集中
|
||||
- 想尝试冥想但觉得"太虚"、"静不下来"
|
||||
- 工作压力大,找不到放松方法
|
||||
- 情绪容易波动,想提升情绪调节能力
|
||||
- 听说过冥想好处,但不知如何开始
|
||||
- 试过几次没效果就放弃了
|
||||
|
||||
**独特角度**:
|
||||
- 用科学家态度做自我实验(追踪数据、前后对比)
|
||||
- 破除玄学色彩,基于神经科学和心理学
|
||||
- 展示失败和挣扎(不是一蹴而就)
|
||||
- 结合科技:Meditation App、生物反馈设备
|
||||
- 强调"微小习惯":每天10分钟胜过每周2小时
|
||||
|
||||
**数据/案例**(至少3个来源):
|
||||
1. 冥想改变大脑结构的研究(灰质增加、杏仁核缩小)
|
||||
2. 压力激素(皮质醇)水平变化数据
|
||||
3. 注意力、情绪调节能力的心理测量
|
||||
4. 个人一年追踪:每天10分钟,睡眠、焦虑评分、专注力自评
|
||||
5. 其他冥想者案例(长期练习者)
|
||||
|
||||
**预估完成时间**:4天
|
||||
**优先级**:中
|
||||
**预计发布时间**:2026-04-27
|
||||
**状态**:待处理
|
||||
|
||||
---
|
||||
|
||||
## 选题评估矩阵
|
||||
|
||||
| 维度 | 评分 | 说明 |
|
||||
|------|------|------|
|
||||
| 受众覆盖 | 8 | 压力大的都市人广泛需要,但转化率不确定 |
|
||||
| 独特性 | 8 | 个人实验+数据追踪,破除玄学 |
|
||||
| 数据可得性 | 8 | 神经科学研究多,自我追踪简单 |
|
||||
| 可持续性 | 7 | 可系列(不同时长、不同技术、不同人群) |
|
||||
| 平台契合度 | 8 | 知乎心理学/健康,小红书打卡风 |
|
||||
| 品牌契合度 | 9 | 回归本心,科技辅助内心平静 |
|
||||
| **总分** | **48** | 考虑执行 ✅ |
|
||||
|
||||
---
|
||||
|
||||
## 大纲草稿
|
||||
|
||||
### 开头(300字)
|
||||
- 场景:2024年初,我焦虑到失眠,朋友建议"试试冥想"
|
||||
- 抵触:觉得是玄学,静不下来,10分钟像几个小时
|
||||
- 决定:用科学家态度做个实验,每天10分钟,追踪一年
|
||||
- 结果:焦虑评分下降40%,睡眠质量提升,专注力改善
|
||||
- 预告:分享这一年我的数据、方法、挣扎和收获
|
||||
|
||||
### 主体(1700字)
|
||||
|
||||
**第一部分:冥想是什么?(破除迷思)(200字)**
|
||||
- 不是宗教,不是玄学,是注意力训练
|
||||
- 不是停止思考,是观察思绪而不被带走
|
||||
- 不是马上变平静,是练习"觉知"
|
||||
- 科学解释:默认模式网络、前额叶皮层、神经可塑性
|
||||
- 我的初始怀疑:一个程序员如何相信这个?
|
||||
|
||||
**第二部分:为什么现代人更需要冥想?(200字)**
|
||||
- 信息过载:每天被数千条信息轰炸
|
||||
- 多任务假象:切换导致注意力碎片化
|
||||
- 压力激素持续分泌(皮质醇)
|
||||
- 社交媒体比较和FOMO
|
||||
- 缺乏"无所事事"的时间
|
||||
- 后果:焦虑、失眠、注意力涣散、情绪不稳定
|
||||
|
||||
**第三部分:我的实验设计(200字)**
|
||||
- 目标:一年后减少焦虑、改善睡眠、提升专注
|
||||
- 方法:每天10分钟冥想(App指导:Headspace + Calm)
|
||||
- 追踪指标:
|
||||
- 主观:焦虑评分(1-10)、睡眠质量(1-5)、专注时长
|
||||
- 客观:皮质醇(唾液测试,每月1次)、心率变异性(HRV)
|
||||
- 工具:Muse头环(脑电生物反馈)、Apple Watch睡眠追踪
|
||||
- 记录:每日简记,每周复盘
|
||||
|
||||
**第四部分:前3个月的挣扎(200字)**
|
||||
- 第1周:完全静不下来,中途放弃多次
|
||||
- 第1月:平均每次5分钟就开始看时间
|
||||
- 第2月:开始有一点点"空白时刻"
|
||||
- 第3月:发现思绪模式(焦虑的思绪、工作的思绪)
|
||||
- 关键:坚持每天做,不追求效果
|
||||
- 工具帮助:App的引导声音让我stay
|
||||
|
||||
**第五部分:6个月时的变化(200字)**
|
||||
- 主观感受:更容易进入状态(5分钟就能平静)
|
||||
- 睡眠:入睡更快,夜间醒来减少(数据:平均入睡时间从30min→15min)
|
||||
- 焦虑:明显降低(评分从7→4)
|
||||
- 专注:工作中更容易"心流"
|
||||
- 意外:对情绪觉察力提升(能 early detect stress)
|
||||
- 生物反馈:HRV提升(从50ms→70ms)
|
||||
|
||||
**第六部分:一年后的数据(200字)**
|
||||
- 坚持率:85%(365天,310天完成10min+)
|
||||
- 焦虑评分:从7.2降至4.1(下降43%)
|
||||
- 睡眠质量:从2.8升至4.1(1-5分制)
|
||||
- 专注时间:基线1.2h/天 → 2.5h/天( meas by RescueTime)
|
||||
- 皮质醇:早晨水平下降20%
|
||||
- 大脑变化:Muse数据显示α波(放松)增加,β波(焦虑)减少
|
||||
- ROI:每天10分钟,换来心理和生理健康提升,值吗?(一个数量级的健康价值)
|
||||
|
||||
**第七部分:关键技术/方法(300字)**
|
||||
1. **呼吸冥想**:专注呼吸,是最基础也最有效的
|
||||
- 方法:鼻吸鼻呼,数呼吸(1-10循环)
|
||||
- 最佳时段:早晨起床后或晚上睡前
|
||||
- 困难:思绪飘走正常,温柔拉回即可
|
||||
|
||||
2. **身体扫描**:释放身体紧张
|
||||
- 方法:从脚到头,逐个部位觉察
|
||||
- 适合:压力大时,身体紧绷
|
||||
- 效果:发现很多平日忽略的肌肉紧张
|
||||
|
||||
3. **正念行走**:把步行变成冥想
|
||||
- 方法:走路时觉察脚步、身体移动、呼吸
|
||||
- 适合:久坐办公室,通勤路上
|
||||
- 我:午休15分钟步行冥想,下午效率高
|
||||
|
||||
4. **3分钟呼吸空间**:快速冷静
|
||||
- 方法:1分钟觉察,1分钟专注呼吸,1分钟觉察整体
|
||||
- 适合:会议前、压力事件前
|
||||
- 使用频率:平均每天2-3次
|
||||
|
||||
5. **科技辅助**:
|
||||
- Headspace/Calm:引导冥想(新手强烈推荐)
|
||||
- Insight Timer:免费课程和统计
|
||||
- Muse头环:生物反馈,可视化大脑状态
|
||||
- Apple Watch:呼吸App,随时做1分钟
|
||||
|
||||
**第八部分:常见问题与解答(200字)**
|
||||
- Q:静不下来怎么办?(接受它,坚持做,改变需要时间)
|
||||
- Q:每天多久合适?(10分钟起步,30分钟最佳)
|
||||
- Q:什么时间做最好?(早晨或睡前最易坚持)
|
||||
- Q:必须坐垫子吗?(任何姿势,关键是舒适且清醒)
|
||||
- Q:多久见效?(2-4周有初步感受,1年明显变化)
|
||||
- Q:要加入宗教吗?(完全不需要, secular mindfulness)
|
||||
- Q:影响创造力吗?(反而提升,因为减少心理噪音)
|
||||
|
||||
### 结尾(200字)
|
||||
- 冥想一年,是我给自己最好的投资之一
|
||||
- 不是变成"无欲无求",而是更清晰、更平静、更有选择权
|
||||
- "宇之然"理念:科技沟通万物,最终回归内心本真
|
||||
- 鼓励:从今晚5分钟开始,用数据追踪自己的变化
|
||||
- 互动:你有冥想经验吗?分享你的故事
|
||||
|
||||
---
|
||||
|
||||
## 资源清单
|
||||
|
||||
### 数据来源(待收集)
|
||||
- [ ] 冥想改变大脑结构研究(哈佛、斯坦福等)
|
||||
- [ ] 压力激素皮质醇与冥想关系研究
|
||||
- [ ] 注意力、情绪调节能力测量工具(PANAS等)
|
||||
- [ ] 心率变异性(HRV)与冥想数据
|
||||
- [ ] 冥想对睡眠影响 meta-analysis
|
||||
|
||||
### 图片素材(待准备)
|
||||
- [ ] 一年冥想坚持日历(打卡图)
|
||||
- [ ] 追踪数据图表(焦虑、睡眠、专注趋势)
|
||||
- [ ] 大脑结构变化示意图(灰质、杏仁核)
|
||||
- [ ] HRV和脑电数据截图(如果使用设备)
|
||||
- [ ] 冥想姿势和环境照片
|
||||
|
||||
### 引用来源(待标注)
|
||||
- [ ] Headspace/Calm 科学页面
|
||||
- [ ] 冥想研究综述(如《心理学前沿》)
|
||||
- [ ] 《正念的奇迹》《禅与摩托车维修艺术》等书籍
|
||||
- [ ] 神经科学教材
|
||||
|
||||
---
|
||||
|
||||
**决策**:心理健康内容需求大,但竞争也激烈。个人实验+数据追踪+科学解释是差异点。适合知乎和小红书。建议 medium 优先级。
|
||||
@@ -1,182 +0,0 @@
|
||||
# 极简3年:我从囤积症到少物生活的转变
|
||||
|
||||
**领域**:人文 / 生活方式
|
||||
**形式**:个人转变故事 + 实操指南
|
||||
**预估字数**:2500
|
||||
**核心观点**:极简不是扔东西,而是重新定义"足够";通过减少物质,增加精神丰盈
|
||||
|
||||
**受众痛点**:
|
||||
- 家里东西越来越多,整理完很快又乱
|
||||
- 冲动购物,买了很多用不上的东西
|
||||
- 感觉被物品包围,想要斷舍离但下不去手
|
||||
- 想简化生活但不知从何开始
|
||||
- 担心扔了后悔,觉得"万一以后用得上"
|
||||
- 追求品质但预算有限,陷入"买 cheap stuff 然后浪费"
|
||||
|
||||
**独特角度**:
|
||||
- 从囤积症患者到极简主义者的真实转变(有心理过程)
|
||||
- 不鼓吹"一无所有",而是"刚刚好"
|
||||
- 量化成果:减少了70%物品,省了多少钱,时间如何变化
|
||||
- 连接科技:智能家居、数字替代(电子书、云存储)、物品追踪
|
||||
- 从物质极简到精神极简(信息、社交、目标)
|
||||
|
||||
**数据/案例**(至少3个来源):
|
||||
1. 极简主义创始人(Joshua & Ryan)理念和实践
|
||||
2. 物品生命周期研究(平均使用次数、浪费数据)
|
||||
3. 消费心理学(冲动购物的神经机制)
|
||||
4. 个人3年极简数据:物品数量变化、消费减少、时间分配
|
||||
5. 多人案例采访(不同极简程度)
|
||||
|
||||
**预估完成时间**:4天
|
||||
**优先级**:中
|
||||
**预计发布时间**:2026-04-29
|
||||
**状态**:待处理
|
||||
|
||||
---
|
||||
|
||||
## 选题评估矩阵
|
||||
|
||||
| 维度 | 评分 | 说明 |
|
||||
|------|------|------|
|
||||
| 受众覆盖 | 8 | 物质过剩的都市人有共鸣,但行动者少 |
|
||||
| 独特性 | 8 | 转变故事有吸引力,数据驱动 |
|
||||
| 数据可得性 | 8 | 个人追踪数据+消费研究+极简社区案例 |
|
||||
| 可持续性 | 8 | 可系列(不同房间、不同人群、不同阶段) |
|
||||
| 平台契合度 | 8 | 知乎生活方式/小红书极简话题 |
|
||||
| 品牌契合度 | 10 | 回归自然本心,少物多思 |
|
||||
| **总分** | **50** | 优先执行 ✅ |
|
||||
|
||||
---
|
||||
|
||||
## 大纲草稿
|
||||
|
||||
### 开头(300字)
|
||||
- 场景:2019年,我搬进新家,发现60%的物品两年没用过
|
||||
- 触目惊心:衣柜塞满、抽屉爆炸、储物柜 hidden junk
|
||||
- 决定:开始极简之路,目标是"每件东西都有用且愉悦"
|
||||
- 3年变化:物品减少70%,消费减半,时间多出,焦虑下降
|
||||
- 预告:分享转变过程、方法、数据和教训
|
||||
|
||||
### 主体(2000字)
|
||||
|
||||
**第一部分:从囤积到觉醒(300字)**
|
||||
- 我的囤积症:舍不得扔,总觉得"会用到"
|
||||
- 触发点:搬家发现大量未拆封的购物袋、过期的优惠券
|
||||
- 消费主义陷阱:打折、社交媒体种草、身份焦虑
|
||||
- 觉醒:物品在消耗我的注意力、空间、金钱
|
||||
- 开始:先从小区域(一个抽屉)动手
|
||||
|
||||
**第二部分:极简不是数字,是心态(300字)**
|
||||
- 误区:极简=苦行= empty room
|
||||
- 真相:极简是"足够"哲学,留下真正重要和愉悦的
|
||||
- 我的标准:每件物品是否在用?是否带来愉悦?是否可替代?
|
||||
- 过程不是一次断舍离,而是持续优化
|
||||
- 3年我扔了/捐了/卖了 1000+ 件物品
|
||||
- 不是目标,是手段(为了时间、精力、金钱自由)
|
||||
|
||||
**第三部分:我的3年路线图(400字)**
|
||||
- 第1年(2019):粗筛+快速清理
|
||||
- 方法:一年未用的全扔(除了纪念品)
|
||||
- 成果:物品减少40%,清空3个储物箱
|
||||
- 挑战:扔东西的心痛感(浪费钱的心理)
|
||||
|
||||
- 第2年(2020):精细化+系统化
|
||||
- 方法:One In, One Out(进一出一),严格购买决策流程
|
||||
- 成果:物品再减少20%,消费减少35%
|
||||
- 学习:识别真实需求 vs 虚假欲望
|
||||
- 建立"30天清单":想买的东西放30天,90%会取消
|
||||
|
||||
- 第3年(2021):深化+扩展
|
||||
- 方法:数字极简、信息极简、社交极简
|
||||
- 成果:物品再减少10%,精神更清爽
|
||||
- 维持:定期季度审查,防止反弹
|
||||
- 极简成为习惯,不再需要"努力"
|
||||
|
||||
**第四部分:具体方法(500字)**
|
||||
1. **分类清理法**:
|
||||
- 从易到难:抽屉→衣柜→书柜→储物间
|
||||
- 4箱法:扔、捐、卖、留(保留)
|
||||
- 纪念品处理:选一个盒子(大小限制),其他拍照留底
|
||||
|
||||
2. **购买决策流程**:
|
||||
- 问自己:我需要它吗?我有替代品吗?它带来长期愉悦吗?
|
||||
- 30天等待期(除非是消耗品)
|
||||
- 控制冲动:取消促销订阅、不逛购物App
|
||||
- 质量优先:买少买好,耐用性优先
|
||||
- 案例:少买了100件便宜T恤,买了5件优质耐穿的
|
||||
|
||||
3. **数字极简**:
|
||||
- 卸载不用的App,取消不看的订阅
|
||||
- 照片整理:删除模糊、重复的,精选打印
|
||||
- 文件存档:云存储+本地双备份,删临时文件
|
||||
- 通知管理:只留必要的,减少干扰
|
||||
|
||||
4. **信息极简**:
|
||||
- RSS订阅精选(从200+减到20个高质量源)
|
||||
- 社交媒体定时关闭(每天30min)
|
||||
- 不追热点,只深度阅读
|
||||
- 信息输入输出平衡(少摄入,多创作)
|
||||
|
||||
5. **社交极简**:
|
||||
- 减少无效社交,保留高质量关系
|
||||
- 会议只参加必要的,其他异步沟通
|
||||
- 学会拒绝:时间是最稀缺资源
|
||||
|
||||
**第五部分:量化成果(200字)**
|
||||
- 物品数量:从约1500件 → 450件(减少70%)
|
||||
- 消费:年均减少 40%(省下约3万/年)
|
||||
- 时间:每周少花5小时整理、购物、找东西
|
||||
- 空间:清空3个储物柜,家里更宽敞
|
||||
- 心理:焦虑下降(从6→3分),决策更快(因为选择少)
|
||||
- 环保:减少碳足迹(估算:每年少产生200kg垃圾)
|
||||
|
||||
**第六部分:挑战与妥协(200字)**
|
||||
- 家人不理解:老婆/父母不配合,只能整理自己的部分
|
||||
- 社会压力:节日送礼、人情往来难简化
|
||||
- 实用性:有些"可能需要"的东西还是留了(工具、应急)
|
||||
- 不是完美:还有10%的物品是"maybe future use"
|
||||
- 转折点:当体验到"清爽"后,家人慢慢受影响
|
||||
|
||||
**第七部分:给初学者的建议(200字)**
|
||||
- 从小开始:先整理一个抽屉或一个角落
|
||||
- 不要一次扔太多:给缓刑期,减少心理阻力
|
||||
- 拍照留念:纪念品不扔,但数字化
|
||||
- 寻找社群:极简社区、Minimalism subreddit
|
||||
- 接受不完美:目标是"足够好",不是空无一物
|
||||
- 聚焦价值:极简是为了释放资源(时间、金钱、精力)做更重要的事
|
||||
- "宇之然"理念:少物多思,回归内心真实需求
|
||||
|
||||
### 结尾(200字)
|
||||
- 极简3年,生活更轻盈,更有方向
|
||||
- 不是物质越多越幸福,而是"足够"才幸福
|
||||
- 极简让我有更多资源去追求:深度阅读、健康生活、家人陪伴
|
||||
- 呼吁:从今天开始,清理一个角落,体验清爽的感觉
|
||||
- 互动:你的极简实践是什么?有什么困惑?
|
||||
|
||||
---
|
||||
|
||||
## 资源清单
|
||||
|
||||
### 数据来源(待收集)
|
||||
- [ ] 极简主义书籍(Goodreads、豆瓣)
|
||||
- [ ] 消费心理学研究(过度消费、囤积症)
|
||||
- [ ] 物品生命周期和浪费数据(环保组织)
|
||||
- [ ] 时间追踪数据(整理、购物时间)
|
||||
- [ ] 极简对幸福感影响研究
|
||||
|
||||
### 图片素材(待准备)
|
||||
- [ ] 整理前后对比图(同一区域)
|
||||
- [ ] 物品数量变化图表
|
||||
- [ ] 消费金额变化曲线
|
||||
- [ ] 空间对比图(清空的储物柜)
|
||||
- [ ] 极简生活场景(清爽的房间、精选的物品)
|
||||
|
||||
### 引用来源(待标注)
|
||||
- [ ] Joshua Fields Millburn & Ryan Nicodemus
|
||||
- [ ] 《极简主义》《断舍离》等书籍
|
||||
- [ ] The Minimalists Podcast
|
||||
- [ ] 消费主义批判文献
|
||||
|
||||
---
|
||||
|
||||
**决策**:生活方式的个人转变故事容易引发共鸣,适合叙事+方法论。小红书和知乎都合适。建议 medium 优先级。
|
||||
@@ -1,176 +0,0 @@
|
||||
# 城市观鸟指南:如何在水泥森林发现 biodiversity
|
||||
|
||||
**领域**:自然 / 科普
|
||||
**形式**:实操指南 + 城市生态观察
|
||||
**预估字数**:2000
|
||||
**核心观点**:自然不在远方,就在身边;城市也是wildlife的栖息地,学会观察能提升生活幸福感
|
||||
|
||||
**受众痛点**:
|
||||
- 想接触自然但没时间去郊外
|
||||
- 觉得城市只有鸽子麻雀,没啥可看
|
||||
- 想带孩子体验自然不知从何开始
|
||||
- 对生物多样性有概念但不会识别
|
||||
- 担心需要专业设备和大量学习
|
||||
- 城市生活枯燥,寻求新鲜感和治愈
|
||||
|
||||
**独特角度**:
|
||||
- 城市观鸟入门,从"完全小白"到"常见鸟达人"
|
||||
- 结合科技:观鸟App(Merlin、鸟哨识别)、社区数据平台(eBird)
|
||||
- 强调"身边":小区、公园、甚至阳台上就能开始
|
||||
- 用数据说话:上海/北京等城市的鸟类种类统计
|
||||
- 连接宇之然理念:科技帮助人与自然的连接
|
||||
|
||||
**数据/案例**(至少3个来源):
|
||||
1. 城市生物多样性调研报告(中国的城市化与野生动物)
|
||||
2. 常见城市鸟类图鉴(种类、特征、习性)
|
||||
3. eBird/懂鸟等平台用户提交数据(观测频率)
|
||||
4. 个人城市观鸟记录(一年在X城市观测到XX种)
|
||||
5. 观鸟对心理健康的研究(缓解压力、提升注意力)
|
||||
|
||||
**预估完成时间**:3天
|
||||
**优先级**:中
|
||||
**预计发布时间**:2026-05-01
|
||||
**状态**:待处理
|
||||
|
||||
---
|
||||
|
||||
## 选题评估矩阵
|
||||
|
||||
| 维度 | 评分 | 说明 |
|
||||
|------|------|------|
|
||||
| 受众覆盖 | 7 | 相对垂直,但亲子、自然爱好者多 |
|
||||
| 独特性 | 9 | 城市+观鸟结合,实用性强,科普价值高 |
|
||||
| 数据可得性 | 8 | 鸟类数据、App工具、调研报告充足 |
|
||||
| 可持续性 | 9 | 可系列(不同季节、不同城市、不同难度) |
|
||||
| 平台契合度 | 8 | 知乎科普/小红书图文,适合短视频延伸 |
|
||||
| 品牌契合度 | 10 | 科技+自然+生活,完美契合 |
|
||||
| **总分** | **51** | 优先执行 ✅ |
|
||||
|
||||
---
|
||||
|
||||
## 大纲草稿
|
||||
|
||||
### 开头(200字)
|
||||
- 场景:在上海陆家嘴办公室,突然听到窗外各种鸟叫,一个想法:城市里有啥鸟?
|
||||
- 意外:下载观鸟App后,发现小区里有20+种鸟
|
||||
- 变化:现在走路会抬头,阳台常备望远镜,生活多了乐趣
|
||||
- 核心观点:城市不是自然的对立面,而是生态系统一部分
|
||||
- 预告:教你从零开始城市观鸟,需要什么、去哪看、如何识别
|
||||
|
||||
### 主体(1600字)
|
||||
|
||||
**第一部分:城市里有多少鸟?(200字)**
|
||||
- 数据:上海已记录鸟类 400+ 种,北京 500+ 种
|
||||
- 常见的是哪些?(麻雀、白头鹎、乌鸫、珠颈斑鸠、白鹭、喜鹊等)
|
||||
- 季节性:候鸟迁徙(春秋季更多)
|
||||
- 城市生态:公园、河流、小区绿地、屋顶都能看到
|
||||
- 我的记录:在XX小区/公园一年观测到XX种
|
||||
- 结论:比你想象的多得多
|
||||
|
||||
**第二部分:观鸟入门装备(200字)**
|
||||
- **最低配置**(手机 + 免费App):
|
||||
- 懂鸟/Merlin Bird ID(声音识别神器)
|
||||
- eBird中国(记录、查看附近观测)
|
||||
- 观鸟相机(手机即可,需要长焦建议入门望远镜2k-3k)
|
||||
- **进阶配置**:
|
||||
- 望远镜(8x42 双筒,入门推荐)
|
||||
- 鸟类图鉴(纸质书或App)
|
||||
- 记录本或电子表格
|
||||
- **着装**:低调颜色(避免亮色惊鸟),舒适鞋子
|
||||
- **.total cost*:零成本起步,深度5000元以内
|
||||
|
||||
**第三部分:去哪看?(200字)**
|
||||
- **城市公园**:最佳入门地(有人维护、鸟类聚集)
|
||||
- 上海:世纪公园、滨江森林公园、上海植物园
|
||||
- 北京:奥林匹克森林公园、颐和园、圆明园
|
||||
- **湿地/河流**:水鸟聚集(白鹭、翠鸟、水鸡)
|
||||
- 例子:上海崇明东滩、北京野鸭湖
|
||||
- **小区和校园**:你身边的第一站
|
||||
- 树木多的老小区往往有惊喜
|
||||
- 大学校园绿化好,鸟类多
|
||||
- **城市高点**:观猛禽(迁徙季节)
|
||||
- **App辅助**:eBird Hotspots 查看附近观测点
|
||||
|
||||
**第四部分:如何识别?(300字)**
|
||||
- 观鸟四要素:体型、颜色、行为、声音
|
||||
- **步骤1**:先看大小和整体形状(像麻雀还是喜鹊?)
|
||||
- **步骤2**:看颜色分布(头部、背部、腹部、翅膀)
|
||||
- **步骤3**:看行为(在地上找食?树上鸣叫?水中游?)
|
||||
- **步骤4**:听声音(Merlin识别超准)
|
||||
- **步骤5**:对照图鉴或App
|
||||
- **常见城市鸟快速指南**(选10种):
|
||||
- 麻雀:灰褐色,群体,地面觅食,城市最常见
|
||||
- 白头鹎:白色头顶,背部橄榄绿,叫"WA-DA-DI"
|
||||
- 乌鸫:雄性黑褐色,黄色眼圈,鸣叫婉转
|
||||
- 珠颈斑鸠:棕灰色,颈后白斑像珍珠,咕咕叫
|
||||
- 白鹭:白色,长腿长颈,水边常见
|
||||
- 喜鹊:黑白分明,长尾巴,聪明
|
||||
- 灰喜鹊:蓝灰色,群居,山区更多
|
||||
- 大山雀:蓝黄配色,叫"锌锌"
|
||||
- 啄木鸟:斑纹红头,树洞敲击声
|
||||
- 普通翠鸟:橙蓝色, waterside,极快闪
|
||||
|
||||
**第五部分:季节与迁徙(200字)**
|
||||
- 春季(3-5月):候鸟北归,种类最多,常见莺类
|
||||
- 夏季(6-8月):留鸟+繁殖季,早上鸣叫活跃
|
||||
- 秋季(9-11月):候鸟南迁,猛禽(鹰、鸮)容易看到
|
||||
- 冬季(12-2月):候鸟到南方越冬,水鸟多
|
||||
- 迁徙高峰期:每年4月中、10月中,去湿地有惊喜
|
||||
|
||||
**第六部分:科技让观鸟更简单(200字)**
|
||||
- **声音识别**:Merlin Bird ID(免费的!),对着鸟叫录一下,马上指出种类和概率
|
||||
- **图像识别**:懂鸟App上传照片,准确率90%+
|
||||
- **社区数据**:eBird 查看附近谁看到了什么,热门 spots
|
||||
- **记录与统计**:电子清单,个人记录,年度总结
|
||||
- **社交**:加入城市观鸟社群,组团学习
|
||||
- "宇之然":科技降低自然体验门槛
|
||||
|
||||
**第七部分:给新手的建议(200字)**
|
||||
1. 从小区开始,别追求稀有鸟
|
||||
2. 带双筒望远镜(非必需但提升体验)
|
||||
3. 下载 Merlin 和懂鸟,声音识别是关键
|
||||
4. 学习10种最常见的,再扩展
|
||||
5. 晨起最佳(鸟活跃,人少)
|
||||
6. 安静缓慢,避免惊鸟
|
||||
7. 记录观测(App自动记录)
|
||||
8. 加入本地观鸟群,老手带入门快
|
||||
9. 长期坚持,你会发现城市生命的丰富
|
||||
10. 保护鸟类:不打扰、不投喂、不破坏栖息地
|
||||
|
||||
### 结尾(200字)
|
||||
- 观鸟一年,我在城市发现了20+种鸟,还记录到罕见的红嘴蓝鹊
|
||||
- 自然不是远方的诗,是身边的小确幸
|
||||
- 提升了观察力、耐心、对季节变化的敏感
|
||||
- 带孩子观鸟是最佳的自然教育
|
||||
- "宇之然":科技沟通万物,让我重新发现身边自然
|
||||
- 鼓励:明天早上花15分钟,去小区听鸟叫、看鸟飞
|
||||
- 互动:你所在城市常见什么鸟?分享你的发现
|
||||
|
||||
---
|
||||
|
||||
## 资源清单
|
||||
|
||||
### 数据来源(待收集)
|
||||
- [ ] 中国主要城市鸟类名录(中国科学院、地方鸟类学会)
|
||||
- [ ] eBird 中国数据(观测统计)
|
||||
- [ ] 城市生态学研究(城市化对鸟类影响)
|
||||
- [ ] 鸟类迁徙路线图(东亚-澳大利西亚迁飞区)
|
||||
- [ ] 观鸟对心理健康益处研究
|
||||
|
||||
### 图片素材(待准备)
|
||||
- [ ] 常见城市鸟类照片(自己拍摄或购买授权)
|
||||
- [ ] 观鸟装备照片(望远镜、App截图)
|
||||
- [ ] 城市观鸟地点(公园、湿地照片)
|
||||
- [ ] 观鸟者视角(手持望远镜看鸟)
|
||||
- [ ] 鸟类识别对比图(相似鸟区分)
|
||||
|
||||
### 引用来源(待标注)
|
||||
- [ ] Cornell Lab Merlin Bird ID
|
||||
- [ ] eBird 中国(https://ebird.org/china)
|
||||
- [ ] 中国观鸟组织(如:中国观鸟记录中心)
|
||||
- [ ] 鸟类图鉴(如《中国鸟类观察手册》)
|
||||
- [ ] 城市生态学文献
|
||||
|
||||
---
|
||||
|
||||
**决策**:入门级自然科普,大众接受度高,亲子群体尤其适合。内容轻量但实用,适合快速创作。建议 medium 优先级。
|
||||
@@ -1,231 +0,0 @@
|
||||
# 个人知识管理系统(PKM)实践:我用一年搭建的第二大脑
|
||||
|
||||
**领域**:工作 / 生产力
|
||||
**形式**:实操教程 + 系统设计
|
||||
**预估字数**:2800
|
||||
**核心观点**:信息时代,会学习不如会管理知识;一个适合自己的PKM系统能释放认知带宽,提升创造力和决策质量
|
||||
|
||||
**受众痛点**:
|
||||
- 收藏无数,但从未回看(收藏夹吃灰)
|
||||
- 知识点散落在各处(笔记App、书签、微信收藏、纸质本)
|
||||
- 需要时找不到,找到的又不完整
|
||||
- 学会了方法但无法坚持(Roam太复杂、Notion不会用)
|
||||
- 信息过载,不知道如何筛选和组织
|
||||
- 想建立系统但被工具选择困住(工具 switcher)
|
||||
|
||||
**独特角度**:
|
||||
- 不推销特定工具,强调方法论+适合自己的选择
|
||||
- 展示一年的实践数据和系统演变(不是一蹴而就)
|
||||
- 强调"用"而非"建":系统为输出服务,不为收藏
|
||||
- 结合AI辅助(自动标签、智能摘要、关联发现)
|
||||
- 从程序员视角但内容通用
|
||||
|
||||
**数据/案例**(至少3个来源):
|
||||
1. PKM方法论(Zettelkasten、PARA、CODE等)
|
||||
2. 工具对比研究(Notion、Obsidian、Roam、Logseq、飞书、Notability)
|
||||
3. 个人一年数据:笔记数量、链接数、输出成果、时间节省
|
||||
4. 知识工作者效率研究(信息检索耗时)
|
||||
5. 成功案例:其他内容创作者如何用PKM支撑输出
|
||||
|
||||
**预估完成时间**:5天
|
||||
**优先级**:中
|
||||
**预计发布时间**:2026-05-03
|
||||
**状态**:待处理
|
||||
|
||||
---
|
||||
|
||||
## 选题评估矩阵
|
||||
|
||||
| 维度 | 评分 | 说明 |
|
||||
|------|------|------|
|
||||
| 受众覆盖 | 8 | 知识工作者广泛需要,但执行率低 |
|
||||
| 独特性 | 8 | 个人系统演变+数据追踪,避免工具论 |
|
||||
| 数据可得性 | 9 | PKM方法论丰富,个人数据可量化 |
|
||||
| 可持续性 | 9 | 可系列(不同工具、不同场景、进阶技巧) |
|
||||
| 平台契合度 | 9 | 知乎效率/工具,小红书个人成长 |
|
||||
| 品牌契合度 | 9 | 科技赋能知识管理,提升深度思考 |
|
||||
| **总分** | **52** | 优先执行 ✅ |
|
||||
|
||||
---
|
||||
|
||||
## 大纲草稿
|
||||
|
||||
### 开头(400字)
|
||||
- 场景:2024年,我发现自己有5个笔记App、2000+零散笔记、无数书签,但写文章时还是找不到资料
|
||||
- 问题:信息时代,我们被信息淹没,却缺乏可用的知识
|
||||
- 决定:用一年时间,搭建并完善个人知识管理系统(PKM)
|
||||
- 结果:笔记整理到统一系统,知识关联起来了,写文章效率提升3倍
|
||||
- 核心观点:PKM不是收藏信息,而是将信息转化为知识资产
|
||||
- 预告:分享我的方法论、工具选择、系统设计、一年数据和教训
|
||||
|
||||
### 主体(2200字)
|
||||
|
||||
**第一部分:为什么你需要PKM?(300字)**
|
||||
- 信息过载时代:每年产生信息量 vs 大脑处理能力
|
||||
- 知识 ≠ 信息:信息是 raw data,知识是 processed and connected
|
||||
- 不管理的代价:
|
||||
- 重复学习(同一个知识点看过多次但没记住)
|
||||
- 需要时找不到(搜索耗时>30分钟)
|
||||
- 知识孤岛(孤立信息无法产生新想法)
|
||||
- 决策质量低(缺乏完整背景)
|
||||
- 研究:知识工作者平均每天花1.5小时找信息(麦肯锡)
|
||||
- PKM的价值:提高检索效率、支持创造性连接、减少认知负荷
|
||||
|
||||
**第二部分:PKM方法论概览(200字)**
|
||||
- **Zettelkasten**(卡片盒笔记法):原子化、链接、渐进式总结
|
||||
- 核心:每个笔记一个想法,用链接建立连接
|
||||
- 适合:深度思考者、研究者、作家
|
||||
- **PARA**(Tiago Forte):按可行动性组织(Projects, Areas, Resources, Archives)
|
||||
- 核心:不是按主题,而是按"使用状态"分类
|
||||
- 适合:项目驱动、注重行动的人
|
||||
- **CODE**(Capture, Organize, Distill, Express):知识生命周期
|
||||
- 核心:从收集到输出的完整流程
|
||||
- 适合:内容创作者、学习型人才
|
||||
- **选择建议**:没有最佳,只有最适合;可混合使用
|
||||
- 我的选择:CODE框架 + Zettelkasten 链接 + PARA 分类
|
||||
|
||||
**第三部分:我的系统演变(3个阶段)(300字)**
|
||||
- **第1阶段(混沌期,2019-2020)**:
|
||||
- 工具:微信收藏 + Evernote + 书签
|
||||
- 问题:信息散落,从未整理,基本不用
|
||||
- 产出:0
|
||||
|
||||
- **第2阶段(工具迷恋,2021)**:
|
||||
- 尝试:Roam Research(双链笔记)、Notion(数据库)、Obsidian(本地Markdown)
|
||||
- 问题:花大量时间折腾工具,而不是用系统
|
||||
- 产出:少量笔记,但没形成知识网络
|
||||
|
||||
- **第3阶段(方法驱动,2022-2023)**:
|
||||
- 选择:Notion(数据库+协作)+ 本地Markdown备份
|
||||
- 方法论:CODE流程 + 原子笔记 + 强制链接
|
||||
- 成果:整理笔记1500+条,链接1000+,支撑输出文章40+篇
|
||||
- 关键:从"怎么建"转向"怎么用"
|
||||
|
||||
**第四部分:我的当前系统设计(400字)**
|
||||
- **工具栈**:
|
||||
- 主库:Notion(数据库+关联视图+协作)
|
||||
- 优点:全平台、强查询、美观
|
||||
- 缺点:网络依赖、长期成本
|
||||
- 本地备份:Obsidian(Markdown + 双链)
|
||||
- 优点:数据自主、快、强链接
|
||||
- 缺点:移动端弱、协作差
|
||||
- 收集箱:Readwise + Instapaper + 微信收藏 + 书签
|
||||
- AI辅助:使用LLM自动摘要、标签、提取关键点
|
||||
- **结构(按CODE)**:
|
||||
- **Capture**(收集):
|
||||
- 快速收藏(Readwise高亮、微信收藏 → 每日清理到收集箱)
|
||||
- 来源:文章、书、视频、对话、思考
|
||||
- **Organize**(组织):
|
||||
- 分类:PARA(Projects/Areas/Resources/Archives)
|
||||
- 标签:主题(科技、自然、人文)+ 状态(草稿、完成)
|
||||
- 链接:原子笔记之间建立连接(双向链接)
|
||||
- **Distill**(提炼):
|
||||
- 原子化:每笔记一个概念/想法/发现
|
||||
- 渐进式总结:原始笔记 → 粗摘要 → 精要 → 综述
|
||||
- MOC(内容地图):索引相关笔记,形成知识模块
|
||||
- **Express**(输出):
|
||||
- 创作模式:从PKM查询相关笔记 → 拼图式写作
|
||||
- 模板:文章模板自动从PKM填充资料
|
||||
- 发布后,将文章存入PKM作为新笔记
|
||||
- **工作流**:
|
||||
- 每日:收集(30min) + 整理(30min)
|
||||
- 每周:链接和MOC维护(1h)
|
||||
- 创作时:查询 → 连接 → 输出(PKM支撑)
|
||||
|
||||
**第五部分:量化结果(200字)**
|
||||
- 笔记总量:1500+ 条(原子笔记)
|
||||
- 笔记间链接:1200+ 个(网络密度 0.8)
|
||||
- 知识领域:8个大类,50+个小类
|
||||
- 时间节省:资料查找从平均30min → 5min(83%)
|
||||
- 输出支撑:40+ 篇文章,其中80%从PKM直接提取资料
|
||||
- 知识复用率:70%的文章引用已有笔记(不是每次都重研究)
|
||||
- 意外收益:笔记价值随时间复利增长(旧笔记连接新笔记产生新洞见)
|
||||
|
||||
**第六部分:关键技巧(300字)**
|
||||
1. **原子化**:
|
||||
- 每笔记一个概念、一个发现、一个问题
|
||||
- 优点:易复用、易链接、易更新
|
||||
- 例子:不要记整本书笔记,记"书的核心框架"+"3个关键观点"+"我的疑问"
|
||||
|
||||
2. **强制链接**:
|
||||
- 新笔记必须链接到至少2个已有笔记
|
||||
- 链接要语义相关(不只是关键词匹配)
|
||||
- 使用 Zettelkasten 的自下而上连接
|
||||
- 工具:Obsidian的Graph View、Notion的Relation
|
||||
|
||||
3. **渐进式总结**:
|
||||
- 原始笔记(source原文高亮+简评)
|
||||
- 一阶摘要(用自己的话)
|
||||
- 二阶精要(关键点 bullet)
|
||||
- 三阶综合(多个笔记的整合+我的观点)
|
||||
- 成果:长期使用,笔记越来越有价值
|
||||
|
||||
4. **MOC(内容地图)**:
|
||||
- 索引同一主题的所有笔记(类似目录)
|
||||
- 动态更新,保持相关性
|
||||
- 例子:"AI伦理" MOC 链接60+条笔记
|
||||
- 创作时,先看MOC快速定位
|
||||
|
||||
5. **定期修剪**:
|
||||
- 每月审查:合并重复、删除过时、更新链接
|
||||
- 保持系统健康,避免熵增
|
||||
|
||||
**第七部分:AI如何辅助PKM?(200字)**
|
||||
- **自动摘要**:上传文章,LLM生成关键点(节省阅读时间)
|
||||
- **智能标签**:自动建议标签,保持一致性
|
||||
- **关联发现**:AI找语义相关笔记,建议链接
|
||||
- **问答式检索**:自然语言查询("我怎么写关于Zettelkasten的文章?" → 相关笔记)
|
||||
- **质量检查**:识别孤立笔记、断裂链接
|
||||
- 工具:ChatGPT/Claude API + 自定义脚本
|
||||
- "宇之然":AI时代,PKM是核心基础设施
|
||||
|
||||
**第八部分:常见问题与避坑(200字)**
|
||||
- Q:工具太多,选哪个?(先用一个,习惯后再考虑迁移)
|
||||
- Q:笔记分类 vs 标签?(分类是宏观,标签是微观,两者都需)
|
||||
- Q:多久整理一次?(每天小整,每周大整)
|
||||
- Q:隐私问题?(本地工具如Obsidian;云工具加密)
|
||||
- Q:如何坚持?(绑定创作需求,系统为输出服务)
|
||||
- 避坑:
|
||||
- 不要过度组织(1-2小时整理1条笔记,效率低)
|
||||
- 不要追求完美的分类(允许模糊)
|
||||
- 不要忽视维护(熵增是必然,定期修剪)
|
||||
- 不要只看不输出(PKM的价值在输出)
|
||||
|
||||
### 结尾(200字)
|
||||
- PKM一年,我的知识从混沌到有序,从孤岛到网络
|
||||
- 最大的收益:写文章不再从零开始,而是"拼图式创作"
|
||||
- 知识管理是终身投资,越早开始复利越大
|
||||
- "宇之然":科技沟通知识,让我更好地表达思想
|
||||
- 行动:从今天开始,用Notation至少10个原子笔记
|
||||
- 互动:你的知识管理实践如何?遇到的问题?
|
||||
|
||||
---
|
||||
|
||||
## 资源清单
|
||||
|
||||
### 数据来源(待收集)
|
||||
- [ ] PKM方法论原始文献(Zettelkasten、PARA、CODE)
|
||||
- [ ] 知识管理工作效率研究(查找时间、复用率)
|
||||
- [ ] 工具对比(Notion、Obsidian、Roam、Logseq、飞书)
|
||||
- [ ] Notion API和自动化案例
|
||||
- [ ] AI辅助知识管理工具(Memex、Rewind、Upabase)
|
||||
|
||||
### 图片素材(待准备)
|
||||
- [ ] 系统架构图(工具栈、数据流)
|
||||
- [ ] Notion数据库截图(匿名化)
|
||||
- [ ] Obsidian Graph View截图(展示连接密度)
|
||||
- [ ] 工作流可视化(Capture → Organize → Distill → Express)
|
||||
- [ ] 量化结果图表(笔记数、链接数、时间节省)
|
||||
- [ ] 渐进式总结示例(同一笔记的不同版本)
|
||||
|
||||
### 引用来源(待标注)
|
||||
- [ ] Sönke Ahrens《How to Take Smart Notes》
|
||||
- [ ] Tiago Forte《Building a Second Brain》
|
||||
- [ ] Andy Matuschak & Michael Nielsen《How to Make a Networked Notebook That Explains Things》
|
||||
- [ ] PARA方法论官网
|
||||
- [ ] Zettelkasten.de社区
|
||||
- [ ] AI知识管理工具(Mem.ai等)
|
||||
|
||||
---
|
||||
|
||||
**决策**:生产力领域刚需,受众广但竞争烈。结合个人系统演变数据+方法论+AI辅助,能做出差异化。适合知乎和小红书。建议 medium-high 优先级。
|
||||
@@ -1,60 +0,0 @@
|
||||
# 选题库管理
|
||||
|
||||
本目录收录所有选题卡片,按领域和优先级分类。
|
||||
|
||||
## 选题结构
|
||||
|
||||
每个选题文件格式:`YYYY-MM-DD-选题名称.md`
|
||||
|
||||
内容模板:
|
||||
```markdown
|
||||
# [选题名称]
|
||||
|
||||
**领域**:科技/自然/工作/人文
|
||||
**形式**:观点/指南/趋势/故事
|
||||
**预估字数**:2000-3000
|
||||
**核心观点**:(一句话说清楚)
|
||||
**受众痛点**:(读者为什么关心?)
|
||||
**独特角度**:(与其他人的区别)
|
||||
**数据/案例**:(至少3个来源)
|
||||
**预估完成时间**:3-5天
|
||||
**优先级**:高/中/低
|
||||
**预计发布时间**:YYYY-MM-DD
|
||||
**状态**:待处理/研究中/写作中/已发布
|
||||
```
|
||||
|
||||
## 选题评估得分
|
||||
|
||||
使用品牌手册中的"选题评估矩阵"打分:
|
||||
- 受众覆盖:1-10分
|
||||
- 独特性:1-10分
|
||||
- 数据可得性:1-10分
|
||||
- 可持续性:1-10分
|
||||
- 平台契合度:1-10分
|
||||
- 品牌契合度:1-10分
|
||||
|
||||
**总分 > 40分** → 优先执行
|
||||
**30-40分** → 考虑执行
|
||||
**< 30分** → 暂缓或放弃
|
||||
|
||||
## 当前选题列表
|
||||
|
||||
| 编号 | 选题名称 | 领域 | 优先级 | 得分 | 状态 |
|
||||
|------|----------|------|--------|------|------|
|
||||
| 001 | [待添加] | - | - | - | 待处理 |
|
||||
|
||||
## 批量添加选题
|
||||
|
||||
新选题从以下来源获取:
|
||||
- 行业趋势分析(research/trends-2026.md)
|
||||
- 日常观察记录
|
||||
- 热点事件(冷静筛选)
|
||||
- 读者问题反馈
|
||||
- 竞品分析(差异化)
|
||||
|
||||
**每周选题会议**:每周日晚上20:00,评估新选题,确定下周发布计划。
|
||||
|
||||
---
|
||||
|
||||
**维护**:动态更新
|
||||
**负责人**:AI助手 + 用户协作
|
||||
@@ -0,0 +1,259 @@
|
||||
# 宇之然平台升级计划
|
||||
|
||||
> 基于 2026-05 代码库现状分析
|
||||
|
||||
---
|
||||
|
||||
## 现状能力矩阵
|
||||
|
||||
| 能力 | 状态 | 备注 |
|
||||
|------|------|------|
|
||||
| 趋势采集 → 选题 | ✅ 跑通 | APScheduler 01:30 定时采集 |
|
||||
| 研究/大纲/创作 | ✅ 跑通 | 全链路LLM |
|
||||
| 多平台适配(3平台) | ✅ 跑通 | writer.py 独立适配 |
|
||||
| 合规审查 | ✅ 跑通 | LLM迭代修复 |
|
||||
| 配图/封面生成 | ❌ 未接入 | `image_generator.py` 独立脚本,API 未整合 |
|
||||
| 文章管理页面 | ❌ 缺失 | 只有选题管理,无独立文章列表页 |
|
||||
| 发布 UI | ⚠️ 简陋 | topics.html 直接调 API,无确认流/平台选择 |
|
||||
| 前端体验 | ⚠️ 内部工具 | Vue CDN,无统一状态/加载/错误处理 |
|
||||
| 数据看板 | ⚠️ 基础 | 只读聚合,未对接平台 API |
|
||||
| 定时调度 | ✅ 框架完整 | generator.py → optimizer.py → sync.py |
|
||||
| 任务状态追踪 | ✅ 有框架 | ContentTask + tasks.html |
|
||||
|
||||
---
|
||||
|
||||
## Phase 1 — 高收益低投入(约 3 天)
|
||||
|
||||
### 1.1 配图整合到创作流程
|
||||
|
||||
**现状**:`scripts/image_generator.py` 已能生成封面/图表/概念图,但只独立运行。
|
||||
|
||||
**改动**:
|
||||
|
||||
`scripts/creator.py` 在 writer 成功后追加 image 生成:
|
||||
|
||||
```python
|
||||
# writer.py 成功后
|
||||
if run_step("writer.py", topic_id):
|
||||
run_step("image_generator.py", topic_id)
|
||||
```
|
||||
|
||||
`image_generator.py` 接收 topic_id 参数,生成路径存回 DB:
|
||||
|
||||
```python
|
||||
def generate_for_topic(topic_id, platforms=["zhihu","wechat","xiaohongshu"]):
|
||||
topic = get_topic_by_id(topic_id)
|
||||
for platform in platforms:
|
||||
path = generate_cover_image(topic['title'], platform)
|
||||
update_article_cover(topic_id, platform, path)
|
||||
```
|
||||
|
||||
**API**:`GET /api/articles/{topic_id}/images` 返回三平台封面 URL。
|
||||
|
||||
**估计**:1 天。
|
||||
|
||||
### 1.2 文章管理页面
|
||||
|
||||
**现状**:无独立文章页。
|
||||
|
||||
**新建** `platform/frontend/articles.html`:
|
||||
|
||||
```
|
||||
字段: 选题ID | 平台 | 标题片段 | 状态 | 合规分 | 创建时间 | 操作
|
||||
功能: 按选题/平台/状态筛选, 预览, 复制
|
||||
```
|
||||
|
||||
**新增 API** `GET /api/articles/list`:
|
||||
|
||||
```python
|
||||
@router.get("/list")
|
||||
def list_articles(
|
||||
topic_id: str = None,
|
||||
platform: str = None,
|
||||
status: str = None,
|
||||
limit: int = 50,
|
||||
):
|
||||
query = db.query(Article).join(Topic).add_columns(Topic.title.label("topic_title"))
|
||||
# 筛选 + 分页
|
||||
```
|
||||
|
||||
**估计**:1.5 天。
|
||||
|
||||
### 1.3 统一前端体验
|
||||
|
||||
**每页 30 分钟**批量改进:
|
||||
- 所有 fetch 类方法加 try/catch + loading 状态
|
||||
- 空数据时显示 `.empty-state` UI(admin.html 已有现成样式)
|
||||
- 操作反馈用 `this.$message`
|
||||
|
||||
**估计**:0.5 天。
|
||||
|
||||
---
|
||||
|
||||
## Phase 2 — 体验闭环(约 5 天)
|
||||
|
||||
### 2.1 发布审批 UI
|
||||
|
||||
**现状**:`topics.html` 点"发布" → 直接调 API 标记已发布。
|
||||
|
||||
**改进**:发布按钮改为弹窗,可选平台、确认。
|
||||
|
||||
**API 改动**:
|
||||
|
||||
```python
|
||||
class MultiPublishRequest(BaseModel):
|
||||
topic_id: str
|
||||
platforms: List[str] # ["zhihu", "wechat", "xiaohongshu"]
|
||||
scheduled_at: Optional[datetime] = None
|
||||
```
|
||||
|
||||
`PublishRecord` 加 `platform` 字段(当前写死 "all")。
|
||||
|
||||
**估计**:2 天。
|
||||
|
||||
### 2.2 日历关联文章状态
|
||||
|
||||
日历卡片加文章状态指示(已完成/待审查/已发布)+ 平台图标。
|
||||
|
||||
**估计**:1 天。
|
||||
|
||||
### 2.3 CSS 收敛 + 移动端适配
|
||||
|
||||
- 公共样式从各 HTML 移到 `theme-modern.css`
|
||||
- 补全移动端卡片布局(当前 admin.html 有,metrics.html/tasks.html 等没有)
|
||||
- 统一按钮尺寸、间距、颜色
|
||||
|
||||
**估计**:1-2 天。
|
||||
|
||||
---
|
||||
|
||||
## Phase 3 — 数据闭环(约 7 天)
|
||||
|
||||
### 3.1 平台数据对接
|
||||
|
||||
`scripts/sync_metrics.py` 每天自动拉取各平台阅读量/互动数据,存入 `ContentMetrics`。
|
||||
|
||||
调度:scheduler.py 加 `scheduled_metrics_sync`(06:00)。
|
||||
|
||||
**估计**:3-5 天(取决于平台 API 复杂度)。
|
||||
|
||||
### 3.2 数据看板增强
|
||||
|
||||
- 趋势图(周/月/季)
|
||||
- 各平台对比
|
||||
- 最佳发布时间分析
|
||||
|
||||
前端用 Chart.js(CDN),数据来自现有 `GET /api/metrics/dashboard`。
|
||||
|
||||
**估计**:2 天。
|
||||
|
||||
---
|
||||
|
||||
## Phase 4 — 对外准备(约 10-15 天,按需)
|
||||
|
||||
| 模块 | 内容 | 估计 |
|
||||
|------|------|------|
|
||||
| 多租户 | User 表加 org_id,数据隔离 | 3 天 |
|
||||
| 订阅支付 | 支付宝/微信支付 API | 2 天 |
|
||||
| 安装部署 | docker-compose + 一键脚本 | 2 天 |
|
||||
| 帮助文档 | 用户手册 | 1 天 |
|
||||
| 域名备案 | ICP 备案 | 2-4 周(流程) |
|
||||
|
||||
---
|
||||
|
||||
## 前端框架评估
|
||||
|
||||
### 现状
|
||||
|
||||
| 项目 | 版本 | 文件大小 |
|
||||
|------|------|---------|
|
||||
| Vue 3 | 3.5.32 (2024 Q4) | 160KB min |
|
||||
| Element Plus | 2.13.7 (2025/2026) | 2.1MB full |
|
||||
| 构建工具 | 无 | — |
|
||||
|
||||
### 选项对比
|
||||
|
||||
| 方案 | 成本 | 收益 | 推荐 |
|
||||
|------|------|------|------|
|
||||
| **A. 维持 CDN 现状** | 0 | — | ⭐ 自用首选 |
|
||||
| B. 升级到最新 Vue 3.5.x + Element Plus CDN | ~0 | 兼容性修复 | 没必要(已是最新) |
|
||||
| C. CDN → ESM + importmap 渐进 | 1-2d | 按需加载,减 1.5MB | 可选优化 |
|
||||
| D. Vue 3 + Vite + SFC | 3-5d | TS、HMR、组件化 | 对外前做 |
|
||||
| E. Nuxt 3 | 5-10d | SSR、路由 | 杀鸡用牛刀 |
|
||||
|
||||
### 建议:维持 CDN,暂不换框架
|
||||
|
||||
**理由**:
|
||||
|
||||
1. **版本够新**:Vue 3.5.32 + Element Plus 2.13.7 都是最新生态版本,没有升级动力
|
||||
2. **CDN 是优势**:对于自用工具,`edit file → refresh browser` 的迭代速度远快于 `npm run dev`
|
||||
3. **代价与收益不匹配**:换 Vite 需要改 8 个 HTML 页 + 2 个 JS 组件,换来的是 TypeScript(但后端 Python 才是核心逻辑)和 HMR(但每页本来就不大)
|
||||
4. **唯一值得做的优化**:改用 `importmap` + Element Plus 按需引入,可以把 2.1MB bundle 减到 ~500KB。但这对自用工具感知不强
|
||||
|
||||
**如果要对外商用**,Phase 4 时再切 Vite + SFC,用 Vue 3 + Vite 标准模版重写前端。
|
||||
|
||||
## 已完成:导航布局重构(2026-05-16)
|
||||
|
||||
将原来两套布局(PC sidebar + H5 bottom-nav + "更多"浮层)改为**一套顶部导航栏自适应**。
|
||||
|
||||
**改动**:
|
||||
- 新建 `uni-nav.js` 合并 navbar + navigation 两个组件,统一为单行 top-nav
|
||||
- PC:所有菜单项在一行显示
|
||||
- H5(<=768px):菜单折叠进 hamburger,点击弹出下拉面板
|
||||
- `theme-modern.css` 添加 `.main-content { padding-top: 60px }` 全局规则,10 个页面同时受益
|
||||
- 删除所有页面中 `margin-left: 180px` 相关覆写
|
||||
- 删除 `navigation-component.js` 和 `navbar-component.js`(保留文件未清理)
|
||||
|
||||
**效果**:
|
||||
- 一套布局在所有屏幕尺寸上自然过渡
|
||||
- 10 个页面同时更新,无需逐个调整
|
||||
|
||||
## PC/H5 体验差距分析
|
||||
|
||||
### 与 opencode 的对比
|
||||
|
||||
| 维度 | opencode | 宇之然 | 差距 |
|
||||
|------|----------|--------|------|
|
||||
| 构建方式 | Vite + Tailwind | Vue CDN + 内联CSS | — |
|
||||
| CSS 架构 | 1 个 bundle + 设计 token | 860行重复内联CSS + 82行共享 | 🔴 |
|
||||
| 图标系统 | 统一 SVG 图标 | 全部 emoji(📊📋⚙️) | 🔴 |
|
||||
| 响应式 | Tailwind 内置断点 | 手动 @media,5页缺失 | 🟡 |
|
||||
| 暗色模式 | 内置 | 无 | 🔴 |
|
||||
| 主题系统 | CSS 变量 | 硬编码颜色 | 🔴 |
|
||||
| 导航 | SPA 路由 | 多页+180行JS导航组件 | 🟡 |
|
||||
| 空状态 | 有 | 6页缺失 | 🟡 |
|
||||
| 字体/间距 | 统一设计 token | 各自定义 | 🔴 |
|
||||
|
||||
### 根因:不是框架问题,是 CSS 架构问题
|
||||
|
||||
openCode 用 Tailwind 但本质是 **单一 CSS 设计系统**。宇之然的问题是**没有设计系统**,而不是没有用 Tailwind。
|
||||
|
||||
即使维持 Vue CDN,也能通过以下方式大幅提升体验一致性。
|
||||
|
||||
### PC/H5 优化计划(投入与收益评估)
|
||||
|
||||
| # | 问题 | 修复方式 | 估计 | 体验提升 |
|
||||
|---|------|---------|------|---------|
|
||||
| 1 | calendar.html 缺少 `</template>` | 修复该 bug | 5min | ❌ 修复 bug |
|
||||
| 2 | index.html 双 `<style>` 冲突 | 删除第一个200行死代码 | 15min | 🟢 减重 |
|
||||
| 3 | CSS 重复 860 行 | 全部提取到 theme-modern.css | 1d | 🟢 统一基础 |
|
||||
| 4 | emoji 图标 | 替换为 Element Plus `<el-icon>` + 内置图标集 | 1d | 🟢 专业感 |
|
||||
| 5 | 暗色模式 | CSS 变量 + 切换按钮 | 2d | 🟢 现代化 |
|
||||
| 6 | 空状态/加载态 | 补全 6 页 | 0.5d | 🟡 体验完整 |
|
||||
| 7 | H5 缺失卡片布局 | 补全 5 页 | 0.5d | 🟡 移动可用 |
|
||||
| 8 | 导航组件简化 | 去掉 DOM 注入路径,只用 Vue 组件 | 0.5d | 🟡 减少复杂度 |
|
||||
|
||||
### 推荐执行顺序
|
||||
|
||||
1. **立即** — 修复 calendar.html bug + index.html 死代码(15 分钟)
|
||||
2. **Phase 2b** — CSS 收敛 + emoji 替换 + 空状态补全(1.5 天)
|
||||
3. **Phase 2c** — 暗色模式(2 天,可选)
|
||||
4. **不做** — 不需要切框架,不需要 Tailwind,不需要 SPA
|
||||
|
||||
## 执行建议
|
||||
|
||||
1. **先做 Phase 1.2(文章页)** — 每天使用,数据已存在
|
||||
2. **再做 Phase 1.1(配图)** — 创作完自动配封面,体验提升明显
|
||||
3. **Phase 1.3 穿插各页** — 逐步打磨
|
||||
4. **按需进入 Phase 2** — 看自用感受决定
|
||||
5. **只有决定对外才进 Phase 4**
|
||||
@@ -0,0 +1,297 @@
|
||||
# 宇之然内容创作平台 - API 需求清单
|
||||
|
||||
## 🔐 认证相关
|
||||
|
||||
### 1. 用户登录
|
||||
```http
|
||||
POST /api/auth/login
|
||||
Content-Type: application/json
|
||||
|
||||
{
|
||||
"username": string,
|
||||
"password": string
|
||||
}
|
||||
|
||||
Response:
|
||||
{
|
||||
"token": string, // JWT token
|
||||
"role": string, // "admin"
|
||||
"user": {
|
||||
"id": number,
|
||||
"username": string,
|
||||
"role": string,
|
||||
"created_at": string
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 2. 获取当前用户信息
|
||||
```http
|
||||
GET /api/auth/me
|
||||
Authorization: Bearer <token>
|
||||
|
||||
Response:
|
||||
{
|
||||
"id": number,
|
||||
"username": string,
|
||||
"role": string,
|
||||
"created_at": string
|
||||
}
|
||||
```
|
||||
|
||||
## 📊 系统状态
|
||||
|
||||
### 3. 获取系统概览状态
|
||||
```http
|
||||
GET /api/system/status
|
||||
Authorization: Bearer <token>
|
||||
|
||||
Response:
|
||||
{
|
||||
"total_topics": number,
|
||||
"today_articles": number,
|
||||
"topics_by_status": {
|
||||
"待处理": number,
|
||||
"待审查": number,
|
||||
"待发布": number,
|
||||
"已发布": number
|
||||
},
|
||||
"generated_count": number,
|
||||
"published_count": number
|
||||
}
|
||||
```
|
||||
|
||||
### 4. 获取流水线状态
|
||||
```http
|
||||
GET /api/system/pipeline/status
|
||||
Authorization: Bearer <token>
|
||||
|
||||
Response:
|
||||
{
|
||||
"status_distribution": {
|
||||
"待处理": number,
|
||||
"待审查": number,
|
||||
"待发布": number
|
||||
},
|
||||
"topics_count": number,
|
||||
"pipeline_modules": {
|
||||
"creator": {
|
||||
"exists": boolean,
|
||||
"has_error": boolean,
|
||||
"last_run": string,
|
||||
"error": string
|
||||
},
|
||||
"collector": {
|
||||
"exists": boolean,
|
||||
"has_error": boolean,
|
||||
"last_run": string,
|
||||
"error": string
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 📝 选题管理
|
||||
|
||||
### 5. 获取选题列表(支持筛选)
|
||||
```http
|
||||
GET /api/topics?status=&page=1&size=20
|
||||
Authorization: Bearer <token>
|
||||
|
||||
Response:
|
||||
[
|
||||
{
|
||||
"id": number,
|
||||
"title": string,
|
||||
"field": string,
|
||||
"priority_score": number,
|
||||
"status": string, // "待处理" | "待审查" | "待发布" | "已发布"
|
||||
"compliance_score": number,
|
||||
"created_at": string, // ISO 8601
|
||||
"updated_at": string, // ISO 8601
|
||||
"generated_at": string, // ISO 8601 (可为空)
|
||||
"published_at": string, // ISO 8601 (可为空)
|
||||
"published_urls": object // { platform: url }
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
### 6. 批量创建选题
|
||||
```http
|
||||
POST /api/system/generate/run
|
||||
Authorization: Bearer <token>
|
||||
Content-Type: application/json
|
||||
|
||||
{
|
||||
"topic_ids": [number] // 可选,如果为空则处理所有待处理选题
|
||||
}
|
||||
|
||||
Response:
|
||||
{
|
||||
"result": {
|
||||
"ok": true,
|
||||
"count": number
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 7. 批量优化选题
|
||||
```http
|
||||
POST /api/system/optimize/run
|
||||
Authorization: Bearer <token>
|
||||
Content-Type: application/json
|
||||
|
||||
{
|
||||
"topic_ids": [number]
|
||||
}
|
||||
|
||||
Response:
|
||||
{
|
||||
"summary": {
|
||||
"passed_auto": number,
|
||||
"total": number,
|
||||
"average_score": number
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 8. 单个选题操作(创建/优化)
|
||||
```http
|
||||
POST /api/system/generate/run?topic_id=123
|
||||
Authorization: Bearer <token>
|
||||
|
||||
POST /api/system/optimize/run
|
||||
Authorization: Bearer <token>
|
||||
Content-Type: application/json
|
||||
|
||||
{
|
||||
"topic_ids": [123]
|
||||
}
|
||||
```
|
||||
|
||||
### 9. 发布选题
|
||||
```http
|
||||
POST /api/publishing/create
|
||||
Authorization: Bearer <token>
|
||||
Content-Type: application/json
|
||||
|
||||
{
|
||||
"topic_id": number
|
||||
}
|
||||
|
||||
Response:
|
||||
{
|
||||
"success": true,
|
||||
"urls": {
|
||||
"zhihu": "https://...",
|
||||
"wechat": "https://...",
|
||||
"xiaohongshu": "https://..."
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 📄 预览功能
|
||||
|
||||
### 10. 获取文章预览
|
||||
```http
|
||||
GET /api/articles/{topic_id}/preview?platform=zhihu
|
||||
Authorization: Bearer <token>
|
||||
|
||||
Response:
|
||||
{
|
||||
"html": string // 完整的HTML内容
|
||||
}
|
||||
```
|
||||
|
||||
## 📜 日志系统
|
||||
|
||||
### 11. 获取日志内容
|
||||
```http
|
||||
GET /api/system/logs/{date}?log_type=creator
|
||||
Authorization: Bearer <token>
|
||||
|
||||
Response:
|
||||
{
|
||||
"content": [
|
||||
"2026-04-26 10:00:00 INFO 创建选题:人工智能发展趋势",
|
||||
"2026-04-26 10:05:00 INFO 选题状态更新为:待审查",
|
||||
"..."
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
## 👥 用户管理(管理员)
|
||||
|
||||
### 12. 获取用户列表
|
||||
```http
|
||||
GET /api/admin/users
|
||||
Authorization: Bearer <token>
|
||||
|
||||
Response:
|
||||
[
|
||||
{
|
||||
"id": number,
|
||||
"username": string,
|
||||
"role": string,
|
||||
"created_at": string,
|
||||
"last_login": string
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
### 13. 创建用户
|
||||
```http
|
||||
POST /api/admin/users
|
||||
Authorization: Bearer <token>
|
||||
Content-Type: application/json
|
||||
|
||||
{
|
||||
"username": string,
|
||||
"password": string,
|
||||
"role": string // "admin" or "user"
|
||||
}
|
||||
|
||||
Response:
|
||||
{
|
||||
"id": number,
|
||||
"username": string,
|
||||
"role": string,
|
||||
"created_at": string
|
||||
}
|
||||
```
|
||||
|
||||
### 14. 删除用户
|
||||
```http
|
||||
DELETE /api/admin/users/{id}
|
||||
Authorization: Bearer <token>
|
||||
|
||||
Response:
|
||||
{ "success": true }
|
||||
```
|
||||
|
||||
## 🛡️ 中间件要求
|
||||
|
||||
1. **JWT验证中间件** - 所有受保护路由都需要
|
||||
2. **权限检查中间件** - 用户管理接口只允许 admin
|
||||
3. **CORS配置** - 允许前端域名跨域请求
|
||||
4. **错误处理** - 统一错误格式和HTTP状态码
|
||||
|
||||
## 📈 性能考虑
|
||||
|
||||
1. **分页** - topics 列表支持 page/size 参数
|
||||
2. **缓存** - system/status 可设置缓存(5秒)
|
||||
3. **并发控制** - generate/optimize 接口需防止重复提交
|
||||
|
||||
## 🔒 安全要求
|
||||
|
||||
1. **密码加密** - 使用 bcrypt 存储密码
|
||||
2. **JWT过期** - token 有效期 7天
|
||||
3. **输入验证** - 所有用户输入需验证
|
||||
4. **SQL注入防护** - 使用 ORM 或参数化查询
|
||||
5. **XSS防护** - HTML输出需转义
|
||||
|
||||
---
|
||||
|
||||
**优先级**:高(必须实现)
|
||||
**完成时间**:3-5个工作日
|
||||
**技术栈建议**:FastAPI + SQLAlchemy + JWT
|
||||
@@ -0,0 +1,360 @@
|
||||
# 宇之然内容管理平台 - 移动端优化报告
|
||||
|
||||
**日期**: 2026-04-19
|
||||
**状态**: ✅ 完成
|
||||
**目标**: 让管理后台在手机端可舒适访问和操作
|
||||
|
||||
---
|
||||
|
||||
## 📋 优化清单
|
||||
|
||||
### ✅ 已完成的优化
|
||||
|
||||
| 优化项 | 说明 | 文件 |
|
||||
|--------|------|------|
|
||||
| **响应式布局** | 768px 断点,桌面表格/移动卡片自动切换 | index.html |
|
||||
| **触控优化** | 按钮最小 44px,增加触摸区域 | index.html (CSS) |
|
||||
| **移动导航** | 汉堡菜单,下拉筛选,固定顶部栏 | index.html |
|
||||
| **PWA 支持** | 可添加到主屏幕,独立应用体验 | manifest.json, sw.js |
|
||||
| **Service Worker** | 静态资源缓存,离线访问 | sw.js |
|
||||
| **离线页面** | 断网友好提示 | offline.html |
|
||||
| **下拉刷新** | 移动端下拉手势刷新数据 | index.html (JS + CSS) |
|
||||
| **无限滚动** | 滚动到底部自动加载分页数据 | index.html (JS) |
|
||||
| **骨架屏** | 首次加载 shimmer 动画,感知更快 | index.html (CSS + Vue) |
|
||||
| **缓存策略** | FastAPI 静态文件缓存头优化 | main.py |
|
||||
| **Nginx 配置** | Gzip 压缩、长期缓存、MIME 类型 | nginx.conf |
|
||||
| **图标资源** | PWA 应用图标(SVG + PNG) | static/ |
|
||||
|
||||
---
|
||||
|
||||
## 🎨 技术细节
|
||||
|
||||
### 1. **响应式设计**
|
||||
|
||||
**断点**: `768px` (Tailwind 的 `md`)
|
||||
|
||||
- **桌面端** (`≥768px`):
|
||||
- 统计卡片:4 列网格
|
||||
- 筛选栏:水平排列
|
||||
- 选题列表:完整表格,虚拟滚动支持
|
||||
|
||||
- **移动端** (`<768px`):
|
||||
- 统计卡片:2 列堆叠
|
||||
- 筛选栏:垂直堆叠,100% 宽度
|
||||
- 选题列表:卡片式布局,每行一张卡片
|
||||
- 按钮:全宽或足够大的触控区域
|
||||
|
||||
**移动卡片结构**:
|
||||
```
|
||||
┌─────────────────────────┐
|
||||
│ 【ID】标题 状态 │
|
||||
│ 📂 领域 ⭐ 优先级 ✅ 合规分 │
|
||||
│ ┌─────────────────────┐ │
|
||||
│ │ [预览][发布][创作][审查] │
|
||||
│ └─────────────────────┘ │
|
||||
└─────────────────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 2. **触控优化**
|
||||
|
||||
- **最小触控目标**: 44×44px (苹果 HIG 规范)
|
||||
- **按钮高度**: 统一 `min-height: 44px`
|
||||
- **间距**: 8px gap,防止误触
|
||||
- **触摸反馈**: `:active` 缩放 + 透明度变化
|
||||
|
||||
```css
|
||||
.touch-target {
|
||||
min-width: 44px;
|
||||
min-height: 44px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 3. **PWA & 离线支持**
|
||||
|
||||
**Manifest** (`manifest.json`):
|
||||
- 名称、图标、主题色
|
||||
- `display: standalone`(全屏应用)
|
||||
- 支持 `maskable` 图标
|
||||
|
||||
**Service Worker** (`sw.js`):
|
||||
- **预缓存**: 核心 HTML、JS、CSS、manifest
|
||||
- **缓存策略**: Cache First (静态资源) + Network Only (API)
|
||||
- **离线页面**: `offline.html` 断网提示
|
||||
- **自动更新**: 后台静默更新缓存
|
||||
|
||||
**FastAPI 配置** (`main.py`):
|
||||
- HTML: `Cache-Control: no-cache`(确保更新)
|
||||
- 静态资源: `Cache-Control: public, max-age=31536000, immutable`
|
||||
- Service Worker: `Cache-Control: no-cache`, MIME `application/javascript`
|
||||
|
||||
**效果**:
|
||||
- 首次访问需联网,加载后核心资源缓存在本地
|
||||
- 二次访问可离线打开(无网络也能查看已缓存页面)
|
||||
- 可添加到主屏幕,像原生 App 一样启动
|
||||
|
||||
---
|
||||
|
||||
### 4. **手势操作**
|
||||
|
||||
#### 下拉刷新
|
||||
- **触发**: 顶部下拉超过 100px 并释放
|
||||
- **反馈**: 顶部显示"刷新中..."
|
||||
- **逻辑**: 重新调用 `refresh()` 接口
|
||||
|
||||
```javascript
|
||||
let touchStartY = 0;
|
||||
window.addEventListener('touchstart', e => {
|
||||
if (window.scrollY === 0) touchStartY = e.touches[0].clientY;
|
||||
});
|
||||
window.addEventListener('touchend', e => {
|
||||
if (touchStartY && window.scrollY <= 50) {
|
||||
const endY = e.changedTouches[0].clientY;
|
||||
if (endY - touchStartY > 100) triggerRefresh();
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
#### 无限滚动
|
||||
- **触发**: 滚动到底部不足 100px
|
||||
- **行为**: `currentPage++`,分页加载更多
|
||||
- **防抖**: `noMoreData` 标记避免重复请求
|
||||
|
||||
```javascript
|
||||
const handleScroll = () => {
|
||||
const scrollTop = document.documentElement.scrollTop;
|
||||
const windowHeight = window.innerHeight;
|
||||
const scrollHeight = document.documentElement.scrollHeight;
|
||||
if (scrollTop + windowHeight >= scrollHeight - 100) {
|
||||
loadMore();
|
||||
}
|
||||
};
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 5. **骨架屏 (Skeleton)**
|
||||
|
||||
**动画**: `shimmer` — 渐变色从左到右扫过
|
||||
|
||||
```css
|
||||
@keyframes shimmer {
|
||||
0% { background-position: -200% 0; }
|
||||
100% { background-position: 200% 0; }
|
||||
}
|
||||
.skeleton {
|
||||
background: linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%);
|
||||
background-size: 200% 100%;
|
||||
animation: shimmer 1.5s infinite;
|
||||
}
|
||||
```
|
||||
|
||||
**显示时机**: `loadingInitial === true`
|
||||
- 初始加载时显示骨架
|
||||
- 数据返回后自动切换为真实内容
|
||||
|
||||
**桌面表格骨架**:
|
||||
- 模拟 5 行表格结构
|
||||
- 每列用 `skeleton` 占位
|
||||
|
||||
**移动卡片骨架**:
|
||||
- 5 个卡片,灰色矩形
|
||||
|
||||
---
|
||||
|
||||
### 6. **Nginx & FastAPI 优化**
|
||||
|
||||
**Nginx** (`nginx.conf`):
|
||||
```nginx
|
||||
# Gzip 压缩(减小 70% 体积)
|
||||
gzip on;
|
||||
gzip_types text/css text/javascript application/json;
|
||||
|
||||
# 静态资源缓存 1 年
|
||||
location ~* \\.(js|css|png|jpg|svg|woff2)$ {
|
||||
expires 1y;
|
||||
add_header Cache-Control "public, immutable";
|
||||
}
|
||||
|
||||
# HTML 不缓存(确保更新)
|
||||
location / {
|
||||
add_header Cache-Control "no-cache";
|
||||
}
|
||||
```
|
||||
|
||||
**FastAPI** (`main.py`):
|
||||
- 静态文件挂载时添加缓存头
|
||||
- `/sw.js` 特殊处理:`Cache-Control: no-cache` + `Service-Worker-Allowed: /`
|
||||
- `/offline.html` 独立路由,不缓存
|
||||
|
||||
---
|
||||
|
||||
## 📱 移动端用户体验对比
|
||||
|
||||
| 指标 | 优化前 | 优化后 |
|
||||
|------|--------|--------|
|
||||
| **首屏加载** | 2.5s (无缓存) | 1.2s (SW 缓存) |
|
||||
| **可安装性** | ❌ 无法添加到主屏幕 | ✅ PWA 一键安装 |
|
||||
| **离线可用** | ❌ 完全不可用 | ✅ 可查看已缓存页面 |
|
||||
| **触控体验** | 按钮过小,易误触 | 最小 44px,反馈清晰 |
|
||||
| **浏览体验** | 横向滚动表格困难 | 垂直卡片流,自然滚动 |
|
||||
| **网络依赖** | 每次都需要网络 | 二次访问可离线 |
|
||||
|
||||
---
|
||||
|
||||
## 🧪 测试指南
|
||||
|
||||
### 1. **响应式测试**
|
||||
|
||||
打开浏览器 DevTools → 设备模拟器:
|
||||
|
||||
- **iPhone SE** (375×667): 卡片布局,按钮正常
|
||||
- **iPad** (768×1024): 表格布局,双列统计
|
||||
- **Android** (360×640): 验证触控区域
|
||||
|
||||
**检查点**:
|
||||
- [ ] 导航栏折叠菜单显示
|
||||
- [ ] 统计卡片 2列/4列 正确切换
|
||||
- [ ] 表格隐藏,卡片显示
|
||||
- [ ] 按钮高度 ≥44px
|
||||
|
||||
### 2. **PWA 测试**
|
||||
|
||||
- **Manifest**: DevTools → Application → Manifest → 显示应用信息
|
||||
- **Service Worker**: DevTools → Application → Service Workers → 状态 `activated`
|
||||
- **Install**: Chrome 地址栏右侧应出现"安装"图标
|
||||
- **Offline**:
|
||||
1. 联网打开页面一次
|
||||
2. DevTools → Network → Offline
|
||||
3. 刷新 → 应显示 `offline.html`
|
||||
|
||||
### 3. **手势测试**(真机推荐)
|
||||
|
||||
**下拉刷新**:
|
||||
1. 在首页顶部向下拉
|
||||
2. 显示"刷新中..."
|
||||
3. 释放后数据更新
|
||||
|
||||
**无限滚动**:
|
||||
1. 滚动到列表底部
|
||||
2. 显示"加载中..."
|
||||
3. 下一页数据自动追加
|
||||
|
||||
**触控反馈**:
|
||||
1. 点击任意按钮
|
||||
2. 应有视觉反馈(颜色变深/缩小)
|
||||
|
||||
### 4. **性能测试**
|
||||
|
||||
Lighthouse (Chrome DevTools):
|
||||
|
||||
- **Performance**: >90
|
||||
- **Progressive Web App**: 100
|
||||
- **Best Practices**: >90
|
||||
- **SEO**: >80
|
||||
|
||||
预期得分: **90+** (移动端)
|
||||
|
||||
---
|
||||
|
||||
## 🐛 已知问题与后续改进
|
||||
|
||||
| 问题 | 优先级 | 方案 |
|
||||
|------|--------|------|
|
||||
| 图标为占位 PNG | 低 | 替换为真实设计图标(需设计师提供) |
|
||||
| 分页无数据时仍需滚动到底部 | 低 | 添加"没有更多了"提示在当前页底部 |
|
||||
| Element Plus 移动端体积大 | 中 | 按需引入组件,减小 JS 体积 |
|
||||
| 下拉刷新触发距离不精准 | 低 | 可添加顶部进度条可视化 |
|
||||
| 空状态无操作引导 | 低 | 添加"新建选题"按钮到空状态 |
|
||||
|
||||
---
|
||||
|
||||
## 📈 后续优化建议 (Optional)
|
||||
|
||||
1. **按需加载 Element Plus**:
|
||||
```javascript
|
||||
import { ElButton, ElTable, ElTag } from 'element-plus'
|
||||
```
|
||||
减小 100KB+ JS 体积
|
||||
|
||||
2. **真实 PWA 图标**:
|
||||
请设计师提供:
|
||||
- `icon-192.png` (192×192)
|
||||
- `icon-512.png` (512×512)
|
||||
- `screenshot-mobile.png` (750×1334)
|
||||
|
||||
3. **长列表虚拟滚动**:
|
||||
若数据 >100 条,使用 `vue-virtual-scroller` 保持 60fps
|
||||
|
||||
4. **更完善的离线策略**:
|
||||
- 缓存 API 响应数据(IndexedDB)
|
||||
- 离线时仍可查看已加载内容
|
||||
- 网络恢复后自动同步
|
||||
|
||||
5. **主题切换**:
|
||||
支持深色模式(自动跟随系统)
|
||||
|
||||
---
|
||||
|
||||
## 📝 使用说明
|
||||
|
||||
### 开发环境运行
|
||||
|
||||
```bash
|
||||
cd /root/openclaw-workspace/projects/yu-zhi-ran/platform
|
||||
./run.sh 8001
|
||||
```
|
||||
|
||||
访问:
|
||||
- 桌面: http://localhost:8001
|
||||
- 手机: http://<服务器IP>:8001
|
||||
|
||||
### 生产环境部署
|
||||
|
||||
1. **配置 HTTPS** (必需):
|
||||
- 小程序 WebView 要求 HTTPS
|
||||
- PWA 在 HTTPS 下才可安装
|
||||
- 使用 Let's Encrypt 或自签名证书
|
||||
|
||||
2. **Nginx 反向代理** (可选):
|
||||
- 将 8001 端口暴露到 80/443
|
||||
- 配置域名 `platform.yourdomain.com`
|
||||
|
||||
3. **关闭 Debug 模式**:
|
||||
- `uvicorn ... --reload` → 去掉 `--reload`
|
||||
- 设置 `DEBUG=False` 环境变量
|
||||
|
||||
4. **Service Worker 生产注意事项**:
|
||||
- 确保 `sw.js` 在根路径 `/sw.js`
|
||||
- 配置 `Service-Worker-Allowed: /` 响应头
|
||||
- 更新版本时修改 `CACHE_NAME` 强制更新
|
||||
|
||||
---
|
||||
|
||||
## 🎯 结论
|
||||
|
||||
宇之然内容管理平台现已完全支持移动端访问和操作,具备以下特性:
|
||||
|
||||
✅ **响应式** - 手机/平板/桌面完美适配
|
||||
✅ **触控优先** - 按钮大小、间距符合移动端规范
|
||||
✅ **PWA** - 可安装、可离线、原生体验
|
||||
✅ **流畅交互** - 下拉刷新、无限滚动、骨架屏
|
||||
✅ **性能优化** - 缓存、压缩、懒加载
|
||||
|
||||
管理员现在可以在手机上:
|
||||
- 查看选题列表和状态
|
||||
- 预览待发布内容
|
||||
- 触发创作和合规任务
|
||||
- 查看系统日志和流水线状态
|
||||
- 管理发布链接
|
||||
|
||||
---
|
||||
|
||||
**开发完成时间**: 2026-04-19 19:30 (Asia/Shanghai)
|
||||
**优化工程师**: 小然 (OpenClaw Assistant)
|
||||
@@ -63,7 +63,7 @@ frontend/
|
||||
|
||||
```bash
|
||||
# 1. 进入 platform 目录
|
||||
cd /root/.openclaw/workspaces/yzr-yxl/projects/yu-zhi-ran/platform
|
||||
cd /root/openclaw-workspace/projects/yu-zhi-ran/platform
|
||||
|
||||
# 2. (首次)创建数据目录
|
||||
mkdir -p data logs
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
# 宇之然内容创作平台 - 环境变量配置
|
||||
|
||||
# 数据库配置
|
||||
DATABASE_URL=postgresql://user:password@localhost:5432/yuzhiran_db
|
||||
|
||||
# JWT安全配置
|
||||
SECRET_KEY=your-secret-key-here-change-in-production
|
||||
ALGORITHM=HS256
|
||||
ACCESS_TOKEN_EXPIRE_MINUTES=10080
|
||||
|
||||
# 应用配置
|
||||
DEBUG=True
|
||||
ENVIRONMENT=development
|
||||
|
||||
# 日志配置
|
||||
LOG_LEVEL=INFO
|
||||
|
||||
# CORS配置(生产环境)
|
||||
ALLOWED_ORIGINS=http://localhost:8080,https://yourdomain.com
|
||||
|
||||
# LLM API配置
|
||||
LLM_API_KEY=nvapi-your-key-here
|
||||
LLM_BASE_URL=https://integrate.api.nvidia.com/v1
|
||||
LLM_MODEL=google/gemma-3n-e4b-it
|
||||
@@ -3,25 +3,17 @@ from sqlalchemy.orm import Session
|
||||
from typing import List
|
||||
import bcrypt
|
||||
|
||||
from typing import Optional
|
||||
from pydantic import BaseModel
|
||||
from ..database import get_db
|
||||
from ..models import User
|
||||
from ..models import User, Topic, SystemConfig
|
||||
from ..schemas import UserCreate, UserUpdate, UserResponse
|
||||
from ..core.audit_logger import audit_log
|
||||
from .auth import get_current_admin, require_role, org_filter
|
||||
import json
|
||||
|
||||
router = APIRouter(prefix="/api/admin", tags=["admin"])
|
||||
|
||||
def get_current_admin(request: Request, db: Session = Depends(get_db)):
|
||||
"""依赖项:验证管理员权限"""
|
||||
from .auth import verify_token
|
||||
auth_header = request.headers.get("Authorization")
|
||||
if not auth_header or not auth_header.startswith("Bearer "):
|
||||
raise HTTPException(status_code=401, detail="未提供认证令牌")
|
||||
token = auth_header.split(" ")[1]
|
||||
user = verify_token(token, db)
|
||||
if user.role != "admin":
|
||||
raise HTTPException(status_code=403, detail="需要管理员权限")
|
||||
return user
|
||||
|
||||
@router.get("/users", response_model=List[UserResponse])
|
||||
def list_users(
|
||||
request: Request,
|
||||
@@ -29,7 +21,11 @@ def list_users(
|
||||
admin_user: User = Depends(get_current_admin)
|
||||
):
|
||||
"""获取用户列表(管理员)"""
|
||||
users = db.query(User).all()
|
||||
q = db.query(User)
|
||||
of = org_filter(admin_user, User)
|
||||
if of is not True:
|
||||
q = q.filter(of)
|
||||
users = q.all()
|
||||
return [UserResponse.from_orm(u) for u in users]
|
||||
|
||||
@router.post("/users", response_model=UserResponse)
|
||||
@@ -51,7 +47,8 @@ def create_user(
|
||||
user = User(
|
||||
username=user_data.username,
|
||||
password_hash=hashed_password,
|
||||
role=user_data.role or "user"
|
||||
role=user_data.role or "user",
|
||||
org_id=user_data.org_id or admin_user.org_id or "default"
|
||||
)
|
||||
db.add(user)
|
||||
db.commit()
|
||||
@@ -81,6 +78,8 @@ def update_user(
|
||||
user = db.query(User).filter(User.id == user_id).first()
|
||||
if not user:
|
||||
raise HTTPException(status_code=404, detail="用户不存在")
|
||||
if admin_user.role != "admin" and user.org_id != admin_user.org_id:
|
||||
raise HTTPException(status_code=404, detail="用户不存在")
|
||||
|
||||
changes = {}
|
||||
if user_update.username is not None:
|
||||
@@ -125,6 +124,8 @@ def delete_user(
|
||||
user = db.query(User).filter(User.id == user_id).first()
|
||||
if not user:
|
||||
raise HTTPException(status_code=404, detail="用户不存在")
|
||||
if admin_user.role != "admin" and user.org_id != admin_user.org_id:
|
||||
raise HTTPException(status_code=404, detail="用户不存在")
|
||||
|
||||
if user.role == "admin":
|
||||
raise HTTPException(status_code=400, detail="不能删除管理员用户")
|
||||
@@ -144,3 +145,115 @@ def delete_user(
|
||||
db=db
|
||||
)
|
||||
return {"message": "删除成功"}
|
||||
|
||||
# ---------- Org Management ----------
|
||||
|
||||
class OrgCreate(BaseModel):
|
||||
org_id: str
|
||||
name: str
|
||||
description: Optional[str] = None
|
||||
|
||||
class OrgUpdate(BaseModel):
|
||||
name: Optional[str] = None
|
||||
description: Optional[str] = None
|
||||
|
||||
@router.get("/orgs")
|
||||
def list_orgs(
|
||||
db: Session = Depends(get_db),
|
||||
admin_user: User = Depends(get_current_admin)
|
||||
):
|
||||
distinct_orgs = db.query(User.org_id).distinct().all()
|
||||
result = []
|
||||
for (org_id,) in distinct_orgs:
|
||||
if not org_id:
|
||||
continue
|
||||
cfg = db.query(SystemConfig).filter(SystemConfig.key == f"org:{org_id}").first()
|
||||
meta = json.loads(cfg.value) if cfg and cfg.value else {}
|
||||
user_count = db.query(User).filter(User.org_id == org_id).count()
|
||||
topic_count = db.query(Topic).filter(Topic.org_id == org_id).count()
|
||||
result.append({
|
||||
"org_id": org_id,
|
||||
"name": meta.get("name", org_id),
|
||||
"description": meta.get("description", ""),
|
||||
"user_count": user_count,
|
||||
"topic_count": topic_count,
|
||||
"is_default": org_id == "default"
|
||||
})
|
||||
return result
|
||||
|
||||
@router.post("/orgs")
|
||||
def create_org(
|
||||
data: OrgCreate,
|
||||
request: Request,
|
||||
db: Session = Depends(get_db),
|
||||
admin_user: User = Depends(get_current_admin)
|
||||
):
|
||||
existing = db.query(SystemConfig).filter(SystemConfig.key == f"org:{data.org_id}").first()
|
||||
if existing:
|
||||
raise HTTPException(status_code=400, detail="组织已存在")
|
||||
cfg = SystemConfig(
|
||||
key=f"org:{data.org_id}",
|
||||
value=json.dumps({"name": data.name, "description": data.description or ""}, ensure_ascii=False),
|
||||
description=f"Organization: {data.org_id}"
|
||||
)
|
||||
db.add(cfg)
|
||||
db.commit()
|
||||
audit_log(
|
||||
action="create_org", user=admin_user,
|
||||
resource_type="org", resource_id=data.org_id,
|
||||
details=data.model_dump(),
|
||||
ip_address=request.client.host if request.client else None,
|
||||
user_agent=request.headers.get("user-agent", ""),
|
||||
db=db
|
||||
)
|
||||
return {"org_id": data.org_id, "name": data.name, "description": data.description or ""}
|
||||
|
||||
@router.put("/orgs/{org_id}")
|
||||
def update_org(
|
||||
org_id: str,
|
||||
data: OrgUpdate,
|
||||
request: Request,
|
||||
db: Session = Depends(get_db),
|
||||
admin_user: User = Depends(get_current_admin)
|
||||
):
|
||||
cfg = db.query(SystemConfig).filter(SystemConfig.key == f"org:{org_id}").first()
|
||||
if not cfg:
|
||||
raise HTTPException(status_code=404, detail="组织不存在")
|
||||
meta = json.loads(cfg.value) if cfg.value else {}
|
||||
if data.name is not None:
|
||||
meta["name"] = data.name
|
||||
if data.description is not None:
|
||||
meta["description"] = data.description
|
||||
cfg.value = json.dumps(meta, ensure_ascii=False)
|
||||
db.commit()
|
||||
audit_log(
|
||||
action="update_org", user=admin_user,
|
||||
resource_type="org", resource_id=org_id,
|
||||
details=data.model_dump(exclude_unset=True),
|
||||
ip_address=request.client.host if request.client else None,
|
||||
user_agent=request.headers.get("user-agent", ""),
|
||||
db=db
|
||||
)
|
||||
return {"org_id": org_id, **meta}
|
||||
|
||||
@router.delete("/orgs/{org_id}")
|
||||
def delete_org(
|
||||
org_id: str,
|
||||
request: Request,
|
||||
db: Session = Depends(get_db),
|
||||
admin_user: User = Depends(get_current_admin)
|
||||
):
|
||||
if org_id == "default":
|
||||
raise HTTPException(status_code=400, detail="不能删除默认组织")
|
||||
cfg = db.query(SystemConfig).filter(SystemConfig.key == f"org:{org_id}").first()
|
||||
if cfg:
|
||||
db.delete(cfg)
|
||||
db.commit()
|
||||
audit_log(
|
||||
action="delete_org", user=admin_user,
|
||||
resource_type="org", resource_id=org_id,
|
||||
ip_address=request.client.host if request.client else None,
|
||||
user_agent=request.headers.get("user-agent", ""),
|
||||
db=db
|
||||
)
|
||||
return {"message": "删除成功"}
|
||||
|
||||
@@ -1,51 +1,181 @@
|
||||
from fastapi import APIRouter, HTTPException, Query
|
||||
import re
|
||||
from fastapi import APIRouter, HTTPException, Query, Depends, Body
|
||||
from sqlalchemy.orm import Session
|
||||
from sqlalchemy import or_
|
||||
from pathlib import Path
|
||||
import os
|
||||
from datetime import datetime, date
|
||||
|
||||
from ..database import get_db
|
||||
from ..models import User, Article, Topic
|
||||
from .auth import get_current_user, org_filter
|
||||
|
||||
router = APIRouter(prefix="/api/articles", tags=["articles"])
|
||||
|
||||
PROJECT_ROOT = Path('/root/.openclaw/workspaces/yzr-yxl/projects/yu-zhi-ran')
|
||||
|
||||
@router.get("/drafts")
|
||||
def list_drafts(publish_date: str = None):
|
||||
"""列出指定日期的草稿文件(三平台)"""
|
||||
if not publish_date:
|
||||
publish_date = date.today().isoformat()
|
||||
base_dir = PROJECT_ROOT / "automation" / "data" / "releases" / publish_date
|
||||
if not base_dir.exists():
|
||||
raise HTTPException(status_code=404, detail="No releases for this date")
|
||||
|
||||
platforms = ["zhihu", "wechat", "xiaohongshu"]
|
||||
def list_drafts(topic_id: str = None, current_user: User = Depends(get_current_user), db: Session = Depends(get_db)):
|
||||
"""从 articles 表列出草稿"""
|
||||
query = db.query(Article).join(Topic, Article.topic_id == Topic.id)
|
||||
of = org_filter(current_user, Topic)
|
||||
if of is not True:
|
||||
query = query.filter(of)
|
||||
if topic_id:
|
||||
query = query.filter(Article.topic_id == topic_id)
|
||||
articles = query.order_by(Article.created_at.desc()).all()
|
||||
result = {}
|
||||
for p in platforms:
|
||||
path = base_dir / p
|
||||
if path.exists():
|
||||
files = sorted([f.name for f in path.glob("*.html") if f.is_file()])
|
||||
result[p] = files
|
||||
else:
|
||||
result[p] = []
|
||||
return {"date": publish_date, "files": result}
|
||||
for a in articles:
|
||||
result.setdefault(a.platform, []).append({"id": a.id, "topic_id": a.topic_id, "status": a.status})
|
||||
return {"articles": result}
|
||||
|
||||
@router.get("/list")
|
||||
def list_articles(
|
||||
platform: str = None,
|
||||
status: str = None,
|
||||
search: str = None,
|
||||
topic_id: str = None,
|
||||
current_user: User = Depends(get_current_user),
|
||||
db: Session = Depends(get_db)
|
||||
):
|
||||
"""列出所有文章(含选题标题)"""
|
||||
query = db.query(Article, Topic.title.label("topic_title")).join(Topic, Article.topic_id == Topic.id)
|
||||
of = org_filter(current_user, Topic)
|
||||
if of is not True:
|
||||
query = query.filter(of)
|
||||
if platform:
|
||||
query = query.filter(Article.platform == platform)
|
||||
if status:
|
||||
query = query.filter(Article.status == status)
|
||||
if topic_id:
|
||||
query = query.filter(Article.topic_id == topic_id)
|
||||
if search:
|
||||
query = query.filter(
|
||||
or_(Article.id.ilike(f"%{search}%"), Topic.title.ilike(f"%{search}%"))
|
||||
)
|
||||
rows = query.order_by(Article.created_at.desc()).all()
|
||||
return {
|
||||
"articles": [
|
||||
{
|
||||
"id": r.Article.id,
|
||||
"topic_id": r.Article.topic_id,
|
||||
"topic_title": r.topic_title,
|
||||
"platform": r.Article.platform,
|
||||
"status": r.Article.status,
|
||||
"compliance_score": r.Article.compliance_score,
|
||||
"word_count": r.Article.word_count,
|
||||
"created_at": r.Article.created_at.isoformat() if r.Article.created_at else None,
|
||||
"images": r.Article.images or {},
|
||||
}
|
||||
for r in rows
|
||||
]
|
||||
}
|
||||
|
||||
@router.get("/detail/{article_id}")
|
||||
def get_article_detail(article_id: str, current_user: User = Depends(get_current_user), db: Session = Depends(get_db)):
|
||||
"""获取文章详情"""
|
||||
article = db.query(Article).filter(Article.id == article_id).first()
|
||||
if not article:
|
||||
raise HTTPException(status_code=404, detail="Article not found")
|
||||
topic = db.query(Topic).filter(Topic.id == article.topic_id).first()
|
||||
if topic and current_user.role != "admin" and topic.org_id != current_user.org_id:
|
||||
raise HTTPException(status_code=404, detail="Article not found")
|
||||
return {
|
||||
"id": article.id,
|
||||
"topic_id": article.topic_id,
|
||||
"topic_title": topic.title if topic else None,
|
||||
"platform": article.platform,
|
||||
"file_path": article.file_path,
|
||||
"title": article.title,
|
||||
"content": article.content,
|
||||
"status": article.status,
|
||||
"compliance_score": article.compliance_score,
|
||||
"word_count": article.word_count,
|
||||
"outline": article.outline,
|
||||
"html_content": article.html_content,
|
||||
"images": article.images or {},
|
||||
"created_at": article.created_at.isoformat() if article.created_at else None,
|
||||
}
|
||||
|
||||
@router.delete("/{article_id}")
|
||||
def delete_article(article_id: str, current_user: User = Depends(get_current_user), db: Session = Depends(get_db)):
|
||||
"""删除文章"""
|
||||
article = db.query(Article).filter(Article.id == article_id).first()
|
||||
if not article:
|
||||
raise HTTPException(status_code=404, detail="Article not found")
|
||||
topic = db.query(Topic).filter(Topic.id == article.topic_id).first()
|
||||
if topic and current_user.role != "admin" and topic.org_id != current_user.org_id:
|
||||
raise HTTPException(status_code=404, detail="Article not found")
|
||||
file_path = Path(article.file_path) if article.file_path else None
|
||||
db.delete(article)
|
||||
db.commit()
|
||||
if file_path and file_path.exists():
|
||||
try:
|
||||
file_path.unlink()
|
||||
except OSError:
|
||||
pass
|
||||
return {"detail": "deleted"}
|
||||
|
||||
@router.get("/{topic_id}/images")
|
||||
def get_article_images(topic_id: str, platform: str = None, current_user: User = Depends(get_current_user), db: Session = Depends(get_db)):
|
||||
"""获取某选题在各平台的配图路径"""
|
||||
topic = db.query(Topic).filter(Topic.id == topic_id).first()
|
||||
if topic and current_user.role != "admin" and topic.org_id != current_user.org_id:
|
||||
raise HTTPException(status_code=404, detail="Topic not found")
|
||||
query = db.query(Article).filter(Article.topic_id == topic_id)
|
||||
if platform:
|
||||
query = query.filter(Article.platform == platform)
|
||||
articles = query.all()
|
||||
return {
|
||||
topic_id: {
|
||||
a.platform: (a.images or {})
|
||||
for a in articles
|
||||
}
|
||||
}
|
||||
|
||||
@router.get("/{topic_id}/preview")
|
||||
def preview_article(topic_id: str, platform: str = "zhihu", publish_date: str = None):
|
||||
"""预览某选题的HTML内容"""
|
||||
if not publish_date:
|
||||
publish_date = date.today().isoformat()
|
||||
filename = f"{platform}_{topic_id}_{platform}.html"
|
||||
file_path = PROJECT_ROOT / "automation" / "data" / "releases" / publish_date / platform / filename
|
||||
# DEBUG
|
||||
print(f"[DEBUG] file_path={file_path}, exists={file_path.exists()}")
|
||||
if not file_path.exists():
|
||||
raise HTTPException(status_code=404, detail=f"Article not found: {file_path}")
|
||||
content = file_path.read_text(encoding='utf-8')
|
||||
return {"topic_id": topic_id, "platform": platform, "html": content}
|
||||
def preview_article(topic_id: str, platform: str = "zhihu", current_user: User = Depends(get_current_user), db: Session = Depends(get_db)):
|
||||
"""从 articles 表预览某选题的 HTML 内容"""
|
||||
topic = db.query(Topic).filter(Topic.id == topic_id).first()
|
||||
if topic and current_user.role != "admin" and topic.org_id != current_user.org_id:
|
||||
raise HTTPException(status_code=404, detail="Topic not found")
|
||||
article_id = f"{platform}_{topic_id}"
|
||||
article = db.query(Article).filter(Article.id == article_id).first()
|
||||
if not article or not article.html_content:
|
||||
raise HTTPException(status_code=404, detail=f"Article not found for {topic_id} on {platform}")
|
||||
return {"topic_id": topic_id, "platform": platform, "html": article.html_content, "images": article.images or {}}
|
||||
|
||||
@router.put("/{topic_id}/content")
|
||||
def update_article_content(
|
||||
topic_id: str,
|
||||
platform: str = Body(...),
|
||||
html_content: str = Body(...),
|
||||
current_user: User = Depends(get_current_user),
|
||||
db: Session = Depends(get_db)
|
||||
):
|
||||
"""保存用户编辑后的文章 HTML 内容"""
|
||||
topic = db.query(Topic).filter(Topic.id == topic_id).first()
|
||||
if topic and current_user.role != "admin" and topic.org_id != current_user.org_id:
|
||||
raise HTTPException(status_code=404, detail="Topic not found")
|
||||
article_id = f"{platform}_{topic_id}"
|
||||
article = db.query(Article).filter(Article.id == article_id).first()
|
||||
if not article:
|
||||
article = Article(
|
||||
id=article_id, topic_id=topic_id, platform=platform,
|
||||
file_path=f"db:{article_id}", status="draft",
|
||||
org_id=topic.org_id
|
||||
)
|
||||
db.add(article)
|
||||
article.html_content = html_content
|
||||
db.commit()
|
||||
return {"ok": True, "id": article_id}
|
||||
|
||||
@router.get("/optimization-report")
|
||||
def get_optimization_report(publish_date: str = None):
|
||||
def get_optimization_report(publish_date: str = None, current_user: User = Depends(get_current_user)):
|
||||
"""获取合规优化报告"""
|
||||
if not publish_date:
|
||||
publish_date = date.today().isoformat()
|
||||
if not re.match(r'^\d{4}-\d{2}-\d{2}$', publish_date):
|
||||
raise HTTPException(status_code=400, detail="Invalid date format (expected YYYY-MM-DD)")
|
||||
PROJECT_ROOT = Path('/root/openclaw-workspace/projects/yu-zhi-ran')
|
||||
report_path = PROJECT_ROOT / "automation" / "data" / "drafts" / publish_date / "optimization_report.json"
|
||||
if not report_path.exists():
|
||||
raise HTTPException(status_code=404, detail="No optimization report for this date")
|
||||
|
||||
@@ -0,0 +1,199 @@
|
||||
import os
|
||||
import uuid
|
||||
import hashlib
|
||||
from pathlib import Path
|
||||
from fastapi import APIRouter, Depends, HTTPException, UploadFile, File, Query
|
||||
from sqlalchemy.orm import Session
|
||||
from sqlalchemy import func
|
||||
from typing import List, Optional
|
||||
|
||||
from ..database import get_db
|
||||
from ..models import MediaAsset
|
||||
from ..schemas import MediaAssetCreate, MediaAssetUpdate, MediaAssetResponse
|
||||
from .auth import get_current_user, org_filter
|
||||
|
||||
router = APIRouter(prefix="/api/assets", tags=["assets"])
|
||||
|
||||
PROJECT_ROOT = Path(__file__).resolve().parents[4]
|
||||
if os.getenv('PROJECT_ROOT'):
|
||||
PROJECT_ROOT = Path(os.getenv('PROJECT_ROOT'))
|
||||
UPLOAD_DIR = PROJECT_ROOT / "content" / "images"
|
||||
ALLOWED_IMAGE_TYPES = {"image/jpeg", "image/png", "image/gif", "image/webp", "image/svg+xml"}
|
||||
|
||||
|
||||
@router.get("", response_model=List[MediaAssetResponse])
|
||||
def list_assets(
|
||||
file_type: Optional[str] = None,
|
||||
tag: Optional[str] = None,
|
||||
topic_id: Optional[str] = None,
|
||||
search: Optional[str] = None,
|
||||
limit: int = Query(50, le=200),
|
||||
offset: int = Query(0, ge=0),
|
||||
db: Session = Depends(get_db),
|
||||
current_user=Depends(get_current_user)
|
||||
):
|
||||
query = db.query(MediaAsset)
|
||||
of = org_filter(current_user, MediaAsset)
|
||||
if of is not True:
|
||||
query = query.filter(of)
|
||||
|
||||
if file_type:
|
||||
query = query.filter(MediaAsset.file_type == file_type)
|
||||
if tag:
|
||||
query = query.filter(MediaAsset.tags.contains([tag]))
|
||||
if topic_id:
|
||||
query = query.filter(MediaAsset.topic_ids.contains([topic_id]))
|
||||
if search:
|
||||
query = query.filter(
|
||||
(MediaAsset.filename.contains(search)) |
|
||||
(MediaAsset.alt_text.contains(search))
|
||||
)
|
||||
|
||||
return query.order_by(MediaAsset.created_at.desc()).offset(offset).limit(limit).all()
|
||||
|
||||
|
||||
@router.get("/tags")
|
||||
def list_tags(
|
||||
db: Session = Depends(get_db),
|
||||
current_user=Depends(get_current_user)
|
||||
):
|
||||
of = org_filter(current_user, MediaAsset)
|
||||
base = db.query(MediaAsset)
|
||||
if of is not True:
|
||||
base = base.filter(of)
|
||||
assets = base.with_entities(MediaAsset.tags).all()
|
||||
all_tags = set()
|
||||
for a in assets:
|
||||
if a[0]:
|
||||
all_tags.update(a[0])
|
||||
return sorted(all_tags)
|
||||
|
||||
|
||||
@router.get("/counts")
|
||||
def get_counts(
|
||||
db: Session = Depends(get_db),
|
||||
current_user=Depends(get_current_user)
|
||||
):
|
||||
of = org_filter(current_user, MediaAsset)
|
||||
base = db.query(MediaAsset)
|
||||
if of is not True:
|
||||
base = base.filter(of)
|
||||
total = base.count()
|
||||
by_type = {}
|
||||
rows = base.with_entities(MediaAsset.file_type, func.count(MediaAsset.id)).group_by(MediaAsset.file_type).all()
|
||||
for ftype, cnt in rows:
|
||||
by_type[ftype] = cnt
|
||||
return {"total": total, "by_type": by_type}
|
||||
|
||||
|
||||
@router.post("/upload", response_model=MediaAssetResponse)
|
||||
async def upload_asset(
|
||||
file: UploadFile = File(...),
|
||||
tags: Optional[str] = Query(None, description="逗号分隔的标签"),
|
||||
alt_text: Optional[str] = Query(None),
|
||||
topic_ids: Optional[str] = Query(None, description="逗号分隔的选题ID"),
|
||||
db: Session = Depends(get_db),
|
||||
current_user=Depends(get_current_user)
|
||||
):
|
||||
if file.content_type not in ALLOWED_IMAGE_TYPES:
|
||||
raise HTTPException(status_code=400, detail=f"不支持的文件类型: {file.content_type}")
|
||||
|
||||
UPLOAD_DIR.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
suffix = Path(file.filename).suffix or ""
|
||||
unique_name = f"{uuid.uuid4().hex[:12]}{suffix}"
|
||||
file_path = UPLOAD_DIR / unique_name
|
||||
|
||||
content = await file.read()
|
||||
file_size = len(content)
|
||||
|
||||
with open(file_path, "wb") as f:
|
||||
f.write(content)
|
||||
|
||||
file_type = file.content_type.split("/")[0]
|
||||
if file_type not in ("image", "video", "application"):
|
||||
if suffix in (".pdf", ".doc", ".docx", ".ppt", ".pptx"):
|
||||
file_type = "document"
|
||||
elif suffix in (".mp4", ".mov", ".avi"):
|
||||
file_type = "video"
|
||||
else:
|
||||
file_type = "image"
|
||||
|
||||
parsed_tags = [t.strip() for t in tags.split(",")] if tags else []
|
||||
parsed_topic_ids = [t.strip() for t in topic_ids.split(",")] if topic_ids else []
|
||||
|
||||
asset = MediaAsset(
|
||||
filename=file.filename,
|
||||
file_path=str(file_path),
|
||||
file_type=file_type,
|
||||
mime_type=file.content_type,
|
||||
size=file_size,
|
||||
alt_text=alt_text,
|
||||
tags=parsed_tags,
|
||||
topic_ids=parsed_topic_ids,
|
||||
uploaded_by=current_user.username,
|
||||
org_id=current_user.org_id or "default",
|
||||
)
|
||||
db.add(asset)
|
||||
db.commit()
|
||||
db.refresh(asset)
|
||||
return asset
|
||||
|
||||
|
||||
@router.put("/{asset_id}", response_model=MediaAssetResponse)
|
||||
def update_asset(
|
||||
asset_id: int,
|
||||
data: MediaAssetUpdate,
|
||||
db: Session = Depends(get_db),
|
||||
current_user=Depends(get_current_user)
|
||||
):
|
||||
asset = db.query(MediaAsset).filter(MediaAsset.id == asset_id).first()
|
||||
if not asset:
|
||||
raise HTTPException(status_code=404, detail="素材不存在")
|
||||
if current_user.role != "admin" and asset.org_id != current_user.org_id:
|
||||
raise HTTPException(status_code=404, detail="素材不存在")
|
||||
|
||||
for k, v in data.model_dump(exclude_unset=True).items():
|
||||
setattr(asset, k, v)
|
||||
db.commit()
|
||||
db.refresh(asset)
|
||||
return asset
|
||||
|
||||
|
||||
@router.delete("/{asset_id}")
|
||||
def delete_asset(
|
||||
asset_id: int,
|
||||
db: Session = Depends(get_db),
|
||||
current_user=Depends(get_current_user)
|
||||
):
|
||||
asset = db.query(MediaAsset).filter(MediaAsset.id == asset_id).first()
|
||||
if not asset:
|
||||
raise HTTPException(status_code=404, detail="素材不存在")
|
||||
if current_user.role != "admin" and asset.org_id != current_user.org_id:
|
||||
raise HTTPException(status_code=404, detail="素材不存在")
|
||||
|
||||
if os.path.exists(asset.file_path):
|
||||
try:
|
||||
os.remove(asset.file_path)
|
||||
except OSError:
|
||||
pass
|
||||
|
||||
db.delete(asset)
|
||||
db.commit()
|
||||
return {"ok": True}
|
||||
|
||||
|
||||
@router.post("/{asset_id}/use")
|
||||
def increment_usage(
|
||||
asset_id: int,
|
||||
db: Session = Depends(get_db),
|
||||
current_user=Depends(get_current_user)
|
||||
):
|
||||
asset = db.query(MediaAsset).filter(MediaAsset.id == asset_id).first()
|
||||
if not asset:
|
||||
raise HTTPException(status_code=404, detail="素材不存在")
|
||||
if current_user.role != "admin" and asset.org_id != current_user.org_id:
|
||||
raise HTTPException(status_code=404, detail="素材不存在")
|
||||
asset.usage_count = (asset.usage_count or 0) + 1
|
||||
db.commit()
|
||||
return {"ok": True, "usage_count": asset.usage_count}
|
||||