# Simple Todo

`simple-todo` 是一个前后端分离的待办/后台管理模板项目。后端基于 AgileBoot 的 Spring Boot 分层架构改造，前端包含 Web 管理端和 Taro 多端应用，根目录提供 Docker Compose 用于本地依赖启动和生产部署。

## 项目架构

### 原仓库地址

当前项目是在以下开源项目基础上改造：

- 后端原仓库：<https://github.com/valarchie/AgileBoot-Back-End>
- Web 前端原仓库：<https://github.com/valarchie/agileboot-front-end-pure>
- Web UI 上游项目：<https://github.com/pure-admin/vue-pure-admin>

### 目录结构

```text
simple-todo
├── backend                 # Spring Boot 后端
│   ├── agileboot-admin     # 后台管理接口启动模块
│   ├── agileboot-api       # 开放接口模块
│   ├── agileboot-common    # 通用工具与基础能力
│   ├── agileboot-domain    # 业务领域模块
│   ├── agileboot-infrastructure # 基础设施、配置、集成能力
│   └── sql                 # 初始化 SQL
├── frontend
│   ├── web                 # Vite + Vue 3 Web 管理端
│   └── app                 # Taro + Vue 3 多端应用
├── docs                    # 项目开发约定
├── docker-compose.yml      # MySQL、Redis、后端、Web 编排
└── .env.example            # Docker Compose 环境变量示例
```

## 基础环境

- JDK 8+
- Maven 3.8+，也可以直接使用 `backend/mvnw` 或 `backend/mvnw.cmd`
- Node.js 22+，推荐配合 Corepack 使用 pnpm
- pnpm，Dockerfile 中使用 `pnpm@11.1.3`
- Docker Desktop 或 Docker Engine + Docker Compose

## 开发启动步骤

### 1. 准备环境变量

Docker Compose 在项目根目录执行时会自动读取 `.env`。可以从示例文件复制：

```bash
cp .env.example .env
```

Windows PowerShell：

```powershell
Copy-Item .env.example .env
```

`.env.example` 默认把 MySQL 和 Redis 映射到宿主机 `3306`、`6379`，与后端 `application-dev.yml` 的本地开发配置保持一致。

### 2. 启动 MySQL 和 Redis

```bash
docker compose up -d mysql redis
```

首次启动 MySQL 容器时，Compose 会把 `backend/sql/agileboot.sql` 挂载到 `/docker-entrypoint-initdb.d/01-agileboot.sql`，由 MySQL 镜像自动初始化数据库。

如果数据库卷已经存在，初始化 SQL 不会重复执行。需要重建本地数据时可以执行：

```bash
docker compose down -v
docker compose up -d mysql redis
```

`docker compose down -v` 会删除本地 MySQL 和 Redis 数据卷，请确认不需要保留本地数据后再执行。

### 3. 启动后端

Windows PowerShell：

```powershell
cd backend
.\mvnw.cmd -pl agileboot-admin spring-boot:run
```

macOS / Linux：

```bash
cd backend
./mvnw -pl agileboot-admin spring-boot:run
```

后端默认地址：

```text
http://localhost:8080
```

接口文档地址：

```text
http://localhost:8080/swagger-ui/index.html
http://localhost:8080/v3/api-docs
```

### 4. 启动 Web 管理端

```bash
cd frontend
pnpm install
pnpm dev:web
```

`frontend/web/.env.development` 默认配置：

```env
VITE_PORT=80
VITE_APP_BASE_API=/dev-api
```

Web 开发服务默认地址：

```text
http://localhost:80
```

如果 80 端口被占用，可以修改 `frontend/web/.env.development` 中的 `VITE_PORT`。

### 5. 启动 App 端，可选

```bash
cd frontend
pnpm dev:app:weapp
```

H5 模式：

```bash
cd frontend
pnpm dev:app:h5
```

## 部署步骤

生产部署推荐使用根目录的 Docker Compose。它会启动 MySQL、Redis、后端服务和 Web Nginx 服务。

### 1. 准备生产环境变量

```bash
cp .env.example .env
```

按实际环境修改 `.env`，至少建议调整：

```env
MYSQL_ROOT_PASSWORD=请替换为强密码
MYSQL_DATABASE=todo_agileboot_pure
MYSQL_APP_USERNAME=todo_app
MYSQL_APP_PASSWORD=请替换为强密码
MYSQL_PORT=13306

REDIS_PASSWORD=请替换为强密码
REDIS_PORT=16379

APP_PORT=8080
WEB_PORT=8081
JAVA_OPTS=-Xms256m -Xmx512m
```

生产环境建议把 `MYSQL_PORT`、`REDIS_PORT` 改成非默认宿主机端口，例如上面的 `13306`、`16379`。这两个变量只影响宿主机暴露端口，不影响容器内部端口；后端容器仍通过 Compose 内部网络访问 MySQL `3306` 和 Redis `6379`。

如果数据库和 Redis 只给后端容器使用，建议进一步通过服务器防火墙限制这些端口的外部访问，或按实际部署需要移除 `docker-compose.yml` 中 MySQL/Redis 的 `ports` 暴露配置。

不要提交真实生产 `.env` 文件。

### 2. 构建并启动完整服务

```bash
docker compose --profile prod up -d --build
```

Compose 会执行以下构建：

- `backend/Dockerfile`：使用 Maven 构建 `agileboot-admin`，运行 Spring Boot Jar。
- `frontend/web/Dockerfile`：构建 Web 静态文件，并用 Nginx 提供访问。

Web 容器中的 Nginx 会把 `/prod-api/` 代理到 Compose 内部的后端服务 `app:8080`。

### 3. 访问服务

默认访问地址：

```text
Web：http://localhost:8081
后端：http://localhost:8080
```

如果修改了 `.env` 中的 `WEB_PORT` 或 `APP_PORT`，以实际端口为准。

### 4. 常用运维命令

查看服务状态：

```bash
docker compose --profile prod ps
```

查看后端日志：

```bash
docker compose --profile prod logs -f app
```

查看 Web 日志：

```bash
docker compose --profile prod logs -f web
```

停止服务：

```bash
docker compose --profile prod down
```

停止并删除数据卷：

```bash
docker compose --profile prod down -v
```

`down -v` 会删除数据库和 Redis 数据，生产环境谨慎使用。
