longz
2026-04-21 89a4dbd3221695ce295c9335f5f918cc998bed38
gitignore
2个文件已添加
93 ■■■■■ 已修改文件
.gitignore 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
README.md 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.gitignore
New file
@@ -0,0 +1,10 @@
backend/target/
.idea/
*.iml
.DS_Store
*/node_modules/
*/dist/
*.log
.env
.env.local
frontend-h5/
README.md
New file
@@ -0,0 +1,83 @@
# 访客预约系统(管理端 + 后端)
模块化单体:**Spring Boot 3 + MyBatis-Plus + Sa-Token**,管理前端 **Vue3 + Vite + Element Plus**。数据库脚本在 `backend/src/main/resources/db/migration/`,**需自行在 MySQL 中按 `V1`、`V2`… 顺序手动执行**。小程序端由其他团队对接 `/api` 契约。
## 环境要求
- **JDK 17+**(Spring Boot 3 必需)
- **Node.js 18+**
- **MySQL 5.7/8.0**(创建库 `appointment`)
- **Redis 6+**(Sa-Token 使用 **独立连接** `sa-token.alone-redis`,默认库索引 `1`)
### Sa-Token 独立 Redis
会话与 token 持久化走 **`sa-token-alone-redis`**,与业务侧将来可能使用的 `spring.data.redis` **互不影响**。
| 环境变量 | 说明 | 默认 |
|----------|------|------|
| `SATOKEN_REDIS_HOST` | Redis 地址 | `127.0.0.1` |
| `SATOKEN_REDIS_PORT` | 端口 | `6379` |
| `SATOKEN_REDIS_PASSWORD` | 密码(无则留空) | 空 |
| `SATOKEN_REDIS_DATABASE` | 逻辑库(建议单独给 token) | `1` |
本地可执行:`docker compose up -d redis`(见仓库根目录 `docker-compose.yml`)。
## 后端
```bash
cd backend
# 修改 src/main/resources/application.yml 中数据源
# 首次部署请在库 appointment 中手动执行 db/migration 下 SQL(按版本号顺序)
mvn spring-boot:run
```
- API:`http://localhost:8080/api`
- OpenAPI:`http://localhost:8080/swagger-ui/index.html`
### 双登录体系(重要)
| 端 | 路径前缀 | 认证方式 | 说明 |
|----|-----------|----------|------|
| **平台管理后台** | `/api/auth/login`、除 `/api/mini/**` 外的受保护接口 | `sys_user` **用户名+密码**(BCrypt) | 与小程序密码**不共用** |
| **微信小程序** | `/api/mini/auth/login`、`/api/mini/**` | `wx.login` 的 **js_code** + 手机号按钮的 **phoneCode** → 服务端 **code2session**、**access_token**、**getuserphonenumber** | 分 **访客** / **员工**(`loginIntent`);`WECHAT_MINI_STUB=false` 且配置 `app-id`/`secret` 时走真微信 |
- 员工首次使用小程序:需在 **`mp_user`** 中写入 `user_type=EMPLOYEE`、**`dept_id`**、**`dept_leader_flag`**(0/1,是否部门负责人)及与微信一致的手机号;与 **`sys_user` 无任何绑定**(由运维 SQL 或后续管理功能维护)。
- 访客首次:`loginIntent=VISITOR` 时若无记录会自动注册为访客。
- 两类 token 均可放在请求头 **`Authorization`**,但**不可混用**(分别由 `StpUtil` 与 `StpLogic("mini")` 校验)。
**小程序登录请求体示例**:`{ "wxCode": "<wx.login>", "phoneCode": "<getPhoneNumber 回调 e.detail.code>", "loginIntent": "VISITOR" }`。
### 默认账号(`V1__init.sql` 等脚本中的种子数据)
| 用户     | 密码       | 说明                          |
|----------|------------|-------------------------------|
| admin    | password   | 管理员                        |
| handler  | password   | 经办人(一级审批)            |
| leader   | password   | 部门负责人(二级)+ 经办角色  |
> 密码哈希为常见测试值(`password`),**生产环境必须重置**。
### RabbitMQ(可选)
默认已排除 `RabbitAutoConfiguration`,无 MQ 时仍可启动;导出接口会仅打日志并返回 `taskId`。接入 MQ 时删除 `application.yml` 中的 `spring.autoconfigure.exclude` 对应项并启动 Rabbit。
## 前端(管理后台)
```bash
cd frontend-admin
npm install
npm run dev
```
浏览器访问 `http://localhost:5173`,登录后走 Vite 代理调用后端。
## 模块与分层
- 包根:`com.sinata.appointment`
- **Controller** 仅入参/返回,**禁止**直接注入 Mapper
- 业务在 `*ApplicationService`,审批编排见 `ApprovalEngineService`
- 统一响应:`Result` / `ResultUtil`;实体基类:`BaseEntity`
## 文档
- [安全与性能基线](docs/SECURITY-PERF.md)