# 手账站开发与运行

## 访问地址

| 环境 | 手账站 | Django Admin |
|------|--------|----------------|
| 本地开发 | http://localhost:5173 | http://localhost:8963/admin/ |
| Docker | http://localhost:8080 | http://localhost:8963/admin/ |

---

## 本地开发（推荐）

前后端各开一个终端。前端 Vite 会把 `/api`、`/media` 代理到 `http://127.0.0.1:8963`，需先启动后端。

### 后端（Django）

在项目根目录 `mwy` 下：

```powershell
cd backend
python -m venv .venv
.\.venv\Scripts\Activate.ps1
pip install -r requirements.txt
python manage.py migrate
python manage.py runserver 8963
```

首次使用 Admin 可创建超级用户：

```powershell
python manage.py createsuperuser
```

导入示例时间线数据（会清空现有 `Memory` 记录）：

```powershell
python manage.py seed_nepal_story
```

### 前端（Vue + Vite）

另开终端，在项目根目录下：

```powershell
cd frontend
npm install
npm run dev
```

浏览器打开 Vite 提示的地址（默认 http://localhost:5173）。

可选：指定 API 地址（一般不必，默认走代理 `/api`）

```powershell
# .env 或 .env.local
# VITE_API_BASE_URL=http://127.0.0.1:8963/api
```

### 生产构建预览（可选）

```powershell
cd frontend
npm run build
npm run preview
```

---

## Docker 一键启动

在项目根目录：

```powershell
docker compose up --build
```

- 手账站：http://localhost:8080  
- Admin：http://localhost:8963/admin/  

数据与媒体挂在 Docker 卷 `backend_data`（SQLite、`media`）。

---

## FRP 内网穿透（frpc）

通过 [frp](https://github.com/fatedier/frp) 把本机 Docker 里的手账站暴露到公网（需你已有 **frps** 服务端）。

1. 复制环境变量模板并填写 frps 信息：

```powershell
cp .env.example .env
# 编辑 .env：FRP_SERVER_ADDR、FRP_SERVER_PORT、FRP_TOKEN、FRP_CUSTOM_DOMAIN、FRP_PUBLIC_ORIGIN
```

2. 先启动应用，再启用 frpc（`frp` profile，默认不启动）：

```powershell
docker compose up --build -d
docker compose --profile frp up -d
```

3. 在 frps 上为域名 `FRP_CUSTOM_DOMAIN` 配置 HTTP 入口后，用 `FRP_PUBLIC_ORIGIN` 访问手账站；Admin 为 `{FRP_PUBLIC_ORIGIN 的 host}/admin/` 需经同一 HTTP 代理（当前穿透的是 frontend:80，已包含 `/api`、`/media`）。

配置文件：`frpc/frpc.toml`。无域名时可在该文件中改用 TCP 代理（见文件内注释），并设置 `FRP_REMOTE_PORT`。

---

## 常用命令速查

```powershell
# 后端目录 backend/ 下，且已激活虚拟环境
python manage.py migrate
python manage.py runserver 8963
python manage.py seed_nepal_story
python manage.py createsuperuser

# 前端目录 frontend/ 下
npm run dev
npm run build
```
