# 萌芽导航 - 前后端分离版

- **前端**：静态 PWA，部署到 **Cloudflare Pages**
- **后端**：API Worker，部署到 **Cloudflare Workers**（目录 `cf-nav-backend`）

## 一、后端（Cloudflare Worker）

1. 进入后端目录并安装依赖、部署：

```bash
cd cf-nav-backend
npm install
npm run deploy
```

2. 修改 `cf-nav-backend/wrangler.toml`：
   - 如需新 KV：`wrangler kv:namespace create "NAV_KV"`，将返回的 `id` 填入 `[[kv_namespaces]]` 的 `id`
   - 修改 `[vars]` 中的 `ADMIN_PASSWORD`，或使用 `wrangler secret put ADMIN_PASSWORD` 设置密钥

3. 部署成功后记下 Worker 地址，例如：  
   `https://cf-nav-backend.你的子域.workers.dev`

## 二、前端（Cloudflare Pages）

1. **配置 API 地址**  
   编辑项目根目录下的 `config.js`，将 `window.API_BASE` 改为你的后端 Worker 地址，例如：

```javascript
window.API_BASE = 'https://cf-nav-backend.你的子域.workers.dev';
```

2. **部署到 Pages**

   - **方式 A - Git 推送**  
     - 在 Cloudflare Dashboard → Pages → 创建项目 → 连接 Git  
     - 构建：**无**（或留空）  
     - 输出目录：`/`（根目录）  
     - 部署后前端即可通过你的 `*.pages.dev` 或自定义域名访问  

   - **方式 B - 直接上传**  
     - Pages → 创建项目 → 直接上传  
     - 将当前仓库根目录下所有前端文件（含 `config.js`、`index.html`、`app.js`、`admin.html`、`admin.js`、`styles.css`、`sw.js`、`manifest.webmanifest`、`logo.png`、`favicon.ico`、`offline.html`、`_redirects`）打包上传  

3. **本地预览**

```bash
npm install
npm run dev
```

浏览器打开 `http://localhost:3000`。本地未配置同源 API 时，需在 `config.js` 中填写后端 Worker 地址才能正常请求数据。

## 三、目录结构说明

```
mengya-nav/
├── index.html          # 首页
├── admin.html          # 后台
├── app.js              # 首页逻辑
├── admin.js            # 后台逻辑
├── config.js           # API 地址（部署前必改）
├── styles.css
├── sw.js               # PWA Service Worker
├── manifest.webmanifest
├── offline.html
├── logo.png / favicon.ico
├── _redirects          # 后台请直接访问 /admin.html（勿用 /admin 避免重定向）
├── package.json        # 前端脚本
└── cf-nav-backend/     # 后端 Worker
    ├── worker.js       # 仅 API，无静态资源
    ├── wrangler.toml
    └── package.json
```

## 四、CORS 与安全

- 后端 Worker 已设置 `Access-Control-Allow-Origin: *`，Pages 域名可正常请求。
- 生产环境建议在 Worker 中把 `Access-Control-Allow-Origin` 改为你的 Pages 域名，并务必修改/保管好 `ADMIN_PASSWORD`。

## 五、数据迁移

若之前已用旧版单 Worker 部署并使用了 KV，只需在 `cf-nav-backend/wrangler.toml` 中沿用原来的 KV namespace `id`，即可继续使用同一份数据，无需迁移。
