衍水集团营销人员工资管理系统
Go to file
liuwenxin 927592b472 feat(frontend): 公司设置/二次分配/审批三页接入,参数页编码中文化
- 公司信息页(设置 order7):名称编辑 + logo 上传(png/jpg ≤2MB
  前端先拦)+ 签名元素「登录页实景预览」(缩比登录卡,品牌名/logo
  即时反映,所见即所得)
- 审批管理页(order8):列表筛选(关键词/状态/类型)+ 签名元素
  「竖排节点时间线」(财务复核→领导审核,人工/自动/驳回色区分)+
  在途单通过/驳回动作(驳回必填意见,经 useConfirmAction 确认流)
- 路由扩展 allowedRoles 元数据:菜单按任一列入角色可见 + 守卫双
  过滤(admin 须显式列入集合,不天然放行);审批页对 admin/
  finance/leader 可见(营销后勤待权限清单 #6)
- 业务表单二次分配区:参与人下拉(离职禁用)+比例输入+实时合计条
  (合计≠100% 提示余额归属待业务确认,满额高亮);编辑全量替换、
  空行自动忽略;校验(人员非重/比例两位小数)与后端 NUMERIC(5,2)
  同口径
- 登录页接 /system/settings/public:品牌名与页脚动态,logo 展示,
  失败静默回退默认(登录页必须可用)
- 参数页中文化:维度角色名映射(营销员/营销经理/信息员)、枚举值
  中文(当月全额/余额、含/扣/不计基本工资、开/关)、预览「所用参数」
  由编码直出改中文名(编码括注)
- 验证:pnpm type-check 零错误;pnpm build 通过

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-16 09:38:05 +08:00
backend feat(approval): 审批单/节点状态机与二次分配接入(开关自动通过) 2026-10-15 18:50:38 +08:00
db feat(migration): V6 系统设置/二次分配/审批表与角色参数种子 2026-10-15 17:25:23 +08:00
docker chore: 初始化项目结构与登录鉴权模块 2026-10-09 18:46:36 +08:00
docs feat(frontend): 审批与系统设置模块页面接入及业务列表调整 2026-10-16 09:32:12 +08:00
frontend feat(frontend): 公司设置/二次分配/审批三页接入,参数页编码中文化 2026-10-16 09:38:05 +08:00
.editorconfig chore: 初始化项目结构与登录鉴权模块 2026-10-09 18:46:36 +08:00
.gitattributes chore: 初始化项目结构与登录鉴权模块 2026-10-09 18:46:36 +08:00
.gitignore feat(settings): 公司信息配置与 logo 管理(public 端点供登录页) 2026-10-15 18:22:12 +08:00
.markdownlint.json chore: 初始化项目结构与登录鉴权模块 2026-10-09 18:46:36 +08:00
README.md chore: 修正 gitignore 并同步项目文档 2026-10-10 16:31:45 +08:00

衍水集团营销人员工资管理系统

营销人员绩效工资核算系统。后端 Python/FastAPI,前端 Vue 3,数据存 MySQL,会话与缓存在 Redis。

当前进度:登录鉴权与系统管理(用户/角色/操作日志/日志查询)已完成,前端具备应用布局框架。业务模块(基础数据、业务数据、绩效核算、报表)待需求澄清后开发。

快速开始

0. 前置条件

工具 版本 说明
Docker Desktop — 提供 MySQL 8.0 与 Redis 7,必须先启动
Python 3.12 由 uv 自动获取,无需手动安装
uv ≥ 0.12 Python 依赖与虚拟环境管理
Node.js / pnpm 22 / 12 前端

国内网络建议先配镜像。 直连 pypi.org 实测约 4 KB/s,一次 uv sync 要几分钟。 配在 uv 的用户级配置(%APPDATA%\uv\uv.toml,Linux/macOS 为 ~/.config/uv/uv.toml), 不要写进 pyproject.toml —— 那会被 uv.lock 记录为包来源,仓库就此绑死在该镜像上。

[[index]]
url = "https://pypi.tuna.tsinghua.edu.cn/simple"
default = true

前端已默认走 npmmirror,无需额外配置。

1. 首次准备

# 从模板创建配置文件,填入真实值(.env 不入库)
cp docker/.env.example docker/.env
cp backend/.env.example backend/.env

# 生成后端密钥并填入 backend/.env 的 APP_SECRET_KEY
python -c "import secrets; print(secrets.token_urlsafe(48))"

# 两处 MYSQL_PASSWORD / REDIS_PASSWORD 需保持一致

2. 启动(三步)

# ① 数据库与缓存(首次会自动执行 db/init/init-dev.sql 建表)
docker compose -f docker/docker-compose.dev.yml up -d

# ② 后端:装依赖 → 应用迁移 → 建管理员 → 起服务
cd backend
uv sync
uv run alembic upgrade head
uv run python -m app.cli create-admin --username admin   # 密码交互输入
uv run uvicorn app.main:app --reload --port 8000

# ③ 前端(另开终端)
cd frontend
pnpm install
pnpm dev

打开 http://localhost:5173 即可登录。接口文档在 http://localhost:8000/api/docs。

务必加 --reload:不加的话改了后端代码进程不会重载,而前端仍能正常访问, 会出现「改了没生效但看不出哪里错」的困惑。

日常开发

# 后端测试与代码检查
cd backend
uv run pytest tests/unit -q     # 纯单元,无需容器,秒级
uv run pytest -q                # 全部(集成部分需容器在跑)
uv run ruff check .             # 代码检查
uv run ruff format .            # 代码格式化

# 前端
cd frontend
pnpm dev                        # 开发服务
pnpm type-check                 # 类型检查
pnpm build                      # 类型检查 + 生产构建

# 浏览器端到端(需容器、后端、前端都在运行)
python e2e/login_flow.py           # 登录链路 8 项
python e2e/system_management.py    # 系统管理 13 项

目录结构

.
├── backend/          后端 FastAPI(六层:api/core/models/repositories/schemas/services)
│   ├── app/          应用代码
│   ├── alembic/      数据库迁移
│   ├── tests/        unit(无需容器)/ integration(需容器)
│   └── README.md     模块说明
├── frontend/         前端 Vue 3 + TS
│   ├── src/          应用代码
│   ├── e2e/          Playwright 端到端脚本
│   └── README.md     模块说明(含视觉设计约定)
├── db/
│   ├── init/         开发环境初始化(仅供参考,见下方说明)
│   ├── migration/    生产迁移脚本,按序编号
│   └── queries/      业务 SQL 留存
├── docker/           容器编排
├── docs/             需求文档
└── ai-aux/           AI 辅助上下文(不纳入版本管理)

几个容易踩的点

db/init/init-dev.sql 改了不生效 它只在 MySQL 数据卷为空时的首次启动执行。数据卷已存在时改动它没有任何提示。 需要重置时:docker compose -f docker/docker-compose.dev.yml down -v 再 up -d(会清空数据)。 生产路径是 db/migration/,那个才必须保证正确。

环境变量分两处,重复项要同步改 docker/.env 管编排凭据(数据库 root 密码、业务账号密码、Redis 密码); backend/.env 管应用配置(连接串、密钥、JWT、验证码、T+ 凭据)。 MYSQL_PASSWORD / REDIS_PASSWORD 两处都有,改一处要改两处。

后端 401 与登录失败是两回事 401 只表示「登录态失效」;登录接口自身失败返回 400/403。 前端拦截器把 401 一律当作「清 token + 跳登录页」,两者混用会导致「输错密码就被弹回登录页」。

登录失败后必须刷新验证码 后端用 Redis GETDEL 消费验证码,任何一次提交后它都已失效——前端已自动处理,改动登录页时注意保留。

相关文档

文档 内容
backend/README.md 后端启动、分层约定、接口清单
backend/tests/README.md 测试约定、用例清单、运行记录、已修复缺陷
frontend/README.md 前端版本约束、视觉设计约定、端到端测试
docs/ 需求文档与工资算法方案