Files
easy-next-admin/docs/getting-started.md
laker 8c1f4c7c75 feat: initialize EasyNextAdmin
Publish the current verified project state without local development history or personal-path artifacts.
2026-07-17 17:58:57 +08:00

222 lines
9.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 本地开发
本文说明如何在本地启动 EasyNextAdmin并确认前后端、数据库和接口文档可用。
## 环境要求
| 工具 | 建议版本 | 用途 |
| --- | --- | --- |
| JDK | 17+ | 运行 Spring Boot 3 服务端 |
| Maven | 3.9+ | 后端依赖管理和构建 |
| Node.js | 22 LTS 或 24 LTS | 前端开发和构建;不再建议使用已 EOL 的 Node.js 20 |
| npm | 随 Node.js 安装 | 前端依赖管理 |
| Docker | 24+ | 本地启动 MySQL、Redis |
| Docker Compose | v2 | 编排本地依赖 |
## 根目录配置文件
`.editorconfig` 用于统一不同 IDE 和编辑器的基础格式不需要手动执行。IntelliJ IDEA、WebStorm 通常会自动识别VS Code 需要安装 EditorConfig 插件。当前规则要求 UTF-8、LF 换行、文件末尾保留换行、去除行尾空格,默认 2 空格缩进Java 文件使用 4 空格。
默认启动不需要额外 `.env` 文件。`docker-compose.yml` 已经在 `${变量名:-默认值}` 中写了本地默认值;如果没有 `.env`Docker Compose 会直接使用这些默认值。比如 `${MYSQL_PORT:-3306}:3306` 表示宿主机默认使用 `3306` 端口访问容器内 MySQL。
| 变量 | 默认值 | 说明 |
| --- | --- | --- |
| `MYSQL_IMAGE` | `mysql:8.4` | 本地 MySQL 镜像,固定在 8.4 LTS 通道 |
| `REDIS_IMAGE` | `redis:7.4-alpine` | 本地 Redis 镜像,固定在 7.4 Alpine 通道 |
| `MYSQL_PORT` | `3306` | MySQL 映射到宿主机的端口 |
| `MYSQL_ROOT_PASSWORD` | `123456` | 本地 root 密码,仅用于开发 |
| `REDIS_PORT` | `6379` | Redis 映射到宿主机的端口 |
| `REDIS_PASSWORD` | `111222` | 本地 Redis 密码,仅用于开发 |
临时覆盖端口时,可以直接在命令前加环境变量:
```bash
MYSQL_PORT=13306 REDIS_PORT=16379 docker compose up -d
```
如果经常需要覆盖,也可以自己创建根目录 `.env`,该文件不会提交到仓库:
```dotenv
MYSQL_PORT=13306
REDIS_PORT=16379
MYSQL_ROOT_PASSWORD=123456
REDIS_PASSWORD=111222
```
生产环境应使用部署平台的密钥管理、环境变量或配置中心,不复用本地演示密码。
## 启动依赖
`docker-compose.yml` 只负责本地开发依赖,不启动业务应用:
- MySQL 8.4 LTSDocker 镜像 `mysql:8.4`,默认端口 `3306`,库名 `easy-next-admin`root 密码 `123456`,新数据卷默认使用 `caching_sha2_password`
- Redis 7.4Docker 镜像 `redis:7.4-alpine`,默认端口 `6379`,密码 `111222`
```bash
docker compose up -d
```
停止依赖:
```bash
docker compose down
```
## 启动服务端
```bash
cd easy-next-admin-server
mvn spring-boot:run
```
默认配置:
- 服务端口:`8080`
- 数据库:`jdbc:mysql://localhost:3306/easy-next-admin`;本地默认 URL 带 `createDatabaseIfNotExist=true`
- 默认 profile`local`
- Flyway启动时自动执行 `db/migration/V1__init.sql`
- OpenAPI`http://127.0.0.1:8080/swagger-ui.html`
本地默认使用 root 演示账号,因此数据库不存在时可以自动创建,再由 Flyway 初始化。若通过 `MYSQL_URL` 覆盖默认连接,需要自行保留 `createDatabaseIfNotExist=true`,或者提前创建数据库。这个便利能力只属于 `local` profile生产环境应由 DBA 预建库并给应用账号授予目标 schema 内的最小权限,不授予全局建库权限。
Redis 在当前脚手架中默认启用。`local` profile 会使用 `application-local.yaml` 中的本地连接默认值:`redis://localhost:6379`,密码 `111222`。因此前面执行过 `docker compose up -d` 后,直接 `mvn spring-boot:run` 即可连接本地 Redis。
Redis 连接和能力开关统一放在 `easy` 命名空间下。需要排查连接参数或显式覆盖时,可以这样启动:
```bash
mvn spring-boot:run \
-Dspring-boot.run.arguments="--easy.features.redis=true --easy.spring.redis.password=111222"
```
启用 Redis 后,缓存、会话、验证码、重复请求、幂等、限流和分布式锁会自动切到 Redis/Redisson 实现。临时不想启动 Redis 时,可用启动参数覆盖 `--easy.features.redis=false`,这些运行态能力会回退到本地内存或 MySQL。
Kafka 默认不启用。如果本地需要调试 Kafka 基础设施,启动时增加 `--easy.features.kafka=true --easy.spring.kafka.bootstrap-servers=127.0.0.1:9092`
## 启动前端
```bash
cd easy-next-admin-web
npm ci
npm run dev
```
默认前端启动也不需要额外 `.env` 文件。前端代码默认请求 `/api`Vite 开发服务器默认把 `/api/**``/storage/**` 代理到 `http://localhost:8080`
如果需要长期覆盖前端配置,可以自己创建 `easy-next-admin-web/.env.local`。这套变量只给 Vite 前端使用,和根目录 `.env` 不是一回事:
- 根目录 `.env`:给 Docker Compose 用,控制 MySQL、Redis 镜像、端口和密码。
- `easy-next-admin-web/.env.local`:给前端开发和构建用,控制接口基础路径和本地代理目标。
本地个性化配置建议写入 `easy-next-admin-web/.env.local`,该文件不会提交到仓库:
```bash
cd easy-next-admin-web
touch .env.local
```
如果后端不是 `8080` 端口,改 `.env.local`
```dotenv
VITE_API_BASE_URL=/api
VITE_API_PROXY_TARGET=http://127.0.0.1:8081
```
Vite 默认地址:
```text
http://127.0.0.1:5174
```
前端开发服务器会把 `/api/**` 代理到 `VITE_API_PROXY_TARGET`。也可以临时通过命令行覆盖后端地址:
```bash
VITE_API_PROXY_TARGET=http://127.0.0.1:8081 npm run dev
```
## 演示账号
登录页会从 `GET /api/auth/demo-accounts` 读取演示账号。该接口只在 `local` profile 返回账号清单,非本地环境返回空列表,避免生产登录页暴露初始化密码。
| 角色 | 账号 | 密码 |
| --- | --- | --- |
| 超级管理员 | `admin` | `admin` |
| 部门负责人 | `manager` | `easynext` |
| 普通员工 | `staff` | `easynext` |
| 审计人员 | `auditor` | `easynext` |
这些账号用于本地开发,方便第一次启动后直接验证权限、流程、审计和监控页面。正式生产环境必须替换初始化密码,且不要启用 `local` profile。
首次登录只校验账号密码。同一用户名和客户端 IP 登录失败后,后续登录会要求验证码。
## 本地检查路径
启动完成后按下面顺序检查:
| 检查项 | 地址 |
| --- | --- |
| 前端登录页 | `http://127.0.0.1:5174/login` |
| 工作台 | `http://127.0.0.1:5174/dashboard` |
| 后端健康检查 | `http://127.0.0.1:8080/actuator/health` |
| OpenAPI UI | `http://127.0.0.1:8080/swagger-ui.html` |
| OpenAPI JSON | `http://127.0.0.1:8080/v3/api-docs` |
## 常见问题
### MySQL 端口被占用
调整环境变量后再启动依赖:
```bash
MYSQL_PORT=13306 docker compose up -d
```
然后启动服务端时覆盖数据源地址:
```bash
cd easy-next-admin-server
mvn spring-boot:run \
-Dspring-boot.run.arguments="--spring.datasource.url=jdbc:mysql://localhost:13306/easy-next-admin?serverTimezone=GMT%2B8&characterEncoding=UTF-8&connectionCollation=utf8mb4_unicode_ci&useSSL=false&allowPublicKeyRetrieval=true"
```
### MySQL 提示 mysql_native_password is not loaded
这通常说明当前机器复用了旧 MySQL 数据卷,里面的 root 账号仍绑定 `mysql_native_password`。MySQL 8.4 默认禁用这个旧插件;全新数据卷会使用默认 `caching_sha2_password`,正常不会出现这个错误。
如果这是全新脚手架,本地数据不需要保留,直接删除旧数据卷重新初始化。这个操作会清空本地数据库:
```bash
docker compose down
docker volume rm easy-next-admin_mysqlData
docker compose up -d
```
如果本地数据需要保留,先临时启用旧插件完成账号迁移,迁移后再移除临时配置。可以在本机临时给 MySQL 启动参数追加 `--mysql-native-password=ON`,不要把它作为脚手架默认配置提交。容器启动后先检查账号认证插件:
```bash
docker compose exec mysql mysql -uroot -p123456 -e "SELECT user, host, plugin FROM mysql.user;"
```
确认能登录后,把 root 账号迁移到 MySQL 8.4 默认认证方式:
```bash
docker compose exec mysql mysql -uroot -p123456 -e "ALTER USER 'root'@'%' IDENTIFIED WITH caching_sha2_password BY '123456'; ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY '123456'; FLUSH PRIVILEGES;"
```
### Flyway 校验失败
本地开发库可以直接备份并删除,再让 `local` 默认连接自动建库并由 Flyway 执行单一 V1 基线:
```bash
mkdir -p work/db-backups
docker exec easy-next-admin-mysql mysqldump --default-character-set=utf8mb4 -uroot -p123456 --single-transaction --set-gtid-purged=OFF easy-next-admin > "work/db-backups/easy-next-admin-$(date +%Y%m%d%H%M%S).sql"
docker exec easy-next-admin-mysql mysql -uroot -p123456 -e "DROP DATABASE IF EXISTS \`easy-next-admin\`;"
cd easy-next-admin-server
mvn clean spring-boot:run
```
这里使用 `clean` 是为了同时删除 `target/classes` 中可能残留的旧迁移文件。重建完成后,`flyway_schema_history` 应只有 `V1__init.sql` 一条成功记录。不要再手工导入 V1 后同时启动 Flyway避免初始化来源分叉。
### 前端接口 404 或连接失败
确认后端在 `8080` 端口运行,或通过 `VITE_API_PROXY_TARGET` 指向正确地址。前端 Axios 的业务前缀是 `/api`,不要在页面里直接请求完整后端域名。