# SproutBlog

Cloudflare Worker + D1 + 静态资源（Vite/React SPA）。Worker **仅处理 `/api/*`**，前端构建产物输出到 `dist/`，由 `[assets]` 提供；`wrangler deploy` 一次部署 API + 前端。

## 功能

- 公共博客（React + React Router）
- Markdown（marked + KaTeX + highlight.js + Mermaid，按需动态加载）
- 简单后台 CRUD（Cookie / Basic Auth 与原先一致）
- 评论（cwd-widget）
- 手机与桌面适配（沿用原样式）

## 初始化

1. 创建 D1：`wrangler d1 create sproutblog`，把 `database_id` 写入 `wrangler.toml`。
2. 应用迁移：`wrangler d1 migrations apply sproutblog --remote`
3. 安装依赖：`npm install`

## 开发

- 一体化（会先 `vite build` 再同时拉起 Worker 与前端开发服务器）：
  - `npm run dev`
  - Worker：默认 `http://127.0.0.1:8787`（读取 `dist` 静态资源）
  - 前端：`http://127.0.0.1:5173`，`/api` 代理到 `8787`
- 仅 Worker（需已有 `dist`）：`npm run dev:worker`
- 仅前端 + API 代理：`npm run dev:client`
- 修改 React 后若要在 `8787` 上看到最新静态文件，请再执行 `npm run build`。

## 部署

```bash
npm run deploy
```

等同 `npm run build && wrangler deploy`。

## 环境变量

- `SITE_TITLE` / `SITE_TITLE_EN` / `CWD_API_BASE`：可在 `wrangler.toml` 的 `[vars]` 中配置。
- `ADMIN_PASSWORD`：生产环境建议使用 `wrangler secret put ADMIN_PASSWORD`，勿提交仓库。
- 前端可选：`VITE_CWD_SITE_ID`（构建时注入；否则以 `/api/config` 中的 `CWD_SITE_ID` 为准）。

## API 说明（节选）

| 方法 | 路径 | 说明 |
|------|------|------|
| GET | `/api/config` | 站点公开配置 |
| POST | `/api/admin/session` | 设置后台 Cookie（body: `{ token }`） |
| GET | `/api/posts` | 列表；未登录仅返回已发布文章 |
| GET | `/api/posts/:idOrSlug?bump=1` | 详情；`bump=1` 且匿名访问已发布文章时增加浏览量 |
| POST/PUT/DELETE | `/api/posts` … | 写操作需鉴权（与原先一致） |

## 目录结构（节选）

- `src/worker` — Worker 入口
- `src/api` — 路由与 HTTP 处理
- `src/db` — D1 访问
- `client/` — Vite + React 源码，构建至 `dist/`
- `migrations/` — D1 SQL
