后端 FastAPI 六层结构(api/services/repositories/models/schemas/core), 统一响应信封、全局异常、日志脱敏;6 张表经 Alembic 迁移建库,SQL 留存 db/migration;登录鉴权含图形验证码(Redis GETDEL 防重放)、JWT、登录限流、 登出黑名单(TTL=令牌剩余有效期)、登录日志。 前端 Vue3 + TS + Element Plus 骨架,含登录页、路由守卫、请求封装与 Vite 代理。 工程配置:uv 锁定 Python 3.12、ruff 检查与格式化、editorconfig、gitattributes。 测试 184 项(单元 155 / 集成 29)全绿,浏览器端到端 8 项通过。 Co-Authored-By: Claude Code <noreply@anthropic.com>
56 lines
1.8 KiB
YAML
56 lines
1.8 KiB
YAML
# 开发环境容器编排
|
||
# 启动(在项目根目录执行;Compose 会自动加载同目录的 docker/.env):
|
||
# docker compose -f docker/docker-compose.dev.yml up -d
|
||
#
|
||
# name 显式指定 Compose 项目名。不指定时会取 compose 文件所在目录名(即 docker),
|
||
# 导致网络/卷被命名为 docker_default、docker_mysql-dev-data 这类无意义名称。
|
||
name: ys-payroll
|
||
|
||
services:
|
||
mysql:
|
||
image: mysql:8.0
|
||
container_name: ys-mysql-dev
|
||
restart: unless-stopped
|
||
environment:
|
||
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
|
||
MYSQL_DATABASE: ${MYSQL_DATABASE}
|
||
# 应用连接用专用账号,避免后端以 root 身份连库
|
||
MYSQL_USER: ${MYSQL_USER}
|
||
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
|
||
TZ: Asia/Shanghai
|
||
command: --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci
|
||
volumes:
|
||
- mysql-dev-data:/var/lib/mysql
|
||
# 首次启动自动执行 db/init 下的初始化脚本
|
||
- ../db/init:/docker-entrypoint-initdb.d
|
||
ports:
|
||
- "3306:3306"
|
||
healthcheck:
|
||
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-uroot", "-p${MYSQL_ROOT_PASSWORD}"]
|
||
interval: 10s
|
||
timeout: 5s
|
||
retries: 10
|
||
start_period: 30s
|
||
|
||
redis:
|
||
image: redis:7-alpine
|
||
container_name: ys-redis-dev
|
||
restart: unless-stopped
|
||
environment:
|
||
TZ: Asia/Shanghai
|
||
# appendonly 开启 AOF,容器重启后验证码黑名单等数据不丢
|
||
command: redis-server --appendonly yes --requirepass ${REDIS_PASSWORD}
|
||
volumes:
|
||
- redis-dev-data:/data
|
||
ports:
|
||
- "6379:6379"
|
||
healthcheck:
|
||
test: ["CMD", "redis-cli", "-a", "${REDIS_PASSWORD}", "--no-auth-warning", "ping"]
|
||
interval: 10s
|
||
timeout: 5s
|
||
retries: 10
|
||
|
||
volumes:
|
||
mysql-dev-data:
|
||
redis-dev-data:
|