Files
f9-web-ai-test/README.md
T
2026-10-08 10:43:59 +08:00

170 lines
6.3 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.
# f9-web-ai-test
企业级 RBAC 权限管理系统
一个基于 .NET 8 分层架构 + Vue 3 + Element Plus 的企业内部管理系统,采用经典的面包屑后台布局,实现完整的 RBAC(基于角色的访问控制)权限体系。
## 技术栈
- **后端**:.NET 8(分层架构)+ NSwag(OpenAPI 文档)
- **前端**:Vue 3 + Vite + Element Plus + Pinia + Vue Router(绿色主题)
- **数据库**:SQLite(EF Core)
- **认证**:JWT 双令牌(access token + refresh token)+ BCrypt 密码加密
- **API 客户端**:NSwag 自动生成 TypeScript 客户端(`src/api/client.ts`)
## 后端分层架构
```
backend/
├── F9WebAiTest.Domain/ # 实体层
│ ├── Common/ # 基类 + 仓储接口 IRepository
│ └── Entities/ # 实体(部门/职工/角色/菜单/关联/日志)
├── F9WebAiTest.Infrastructure/ # 仓储实现层
│ ├── Data/ # DbContext + 种子数据
│ └── Repositories/ # Repository 通用实现
├── F9WebAiTest.Application/ # 服务层
│ ├── Common/ # ApiResult / ServiceException
│ ├── Dtos/ # 数据传输对象
│ └── Services/ # 业务逻辑(认证/部门/职工/角色/菜单)
└── F9WebAiTest.Api/ # 表示层(Web API 控制器)
```
依赖方向:`Api → Application → Domain ← Infrastructure`
## RBAC 核心功能
| 模块 | 说明 |
|------|------|
| 认证登录 | JWT 登录、动态菜单、权限标识下发 |
| 部门管理 | 树形部门结构、负责人、子部门、排序 |
| 职工管理 | 职工增删改查、分页搜索、分配角色、重置密码 |
| 角色管理 | 角色增删改查、菜单权限分配(树形勾选) |
| 菜单管理 | 目录/菜单/按钮三级,动态路由、权限标识 |
| 权限控制 | 动态路由 + 按钮级权限指令 v-permission |
| 考勤打卡 | 上班签到/下班签退,迟到/早退自动判定 |
| 我的考勤 | 个人考勤记录 + 月度统计(出勤/迟到/早退/缺勤/请假) |
| 请假管理 | 请假申请、审批(批准/驳回)、多类型(事假/病假/年假等) |
| 考勤记录 | 管理员按日期/部门/姓名查询全员考勤 |
| 工艺庄口 | 庄口基础数据(年度/本地外地/基地外购/产地等) |
| 生丝规格 | 规格指标(中心范围/野纤/内控/劳动竞赛等上下限) |
| 生丝定级指标 | 等级指标(厂标/国标/个人,偏差/大差/清洁/洁净等) |
| 机组车台 | 车间机组与车台号配置 |
## 数据模型关系
```
Department (部门) 1 ── N Employee (职工)
Employee (职工) N ── N Role (角色) via EmployeeRole
Role (角色) N ── N Menu (菜单) via RoleMenu
Menu (菜单) 自引用树形(目录/菜单/按钮)
```
## 启动方式
### 1. 启动后端
```bash
cd backend/F9WebAiTest.Api
dotnet run
```
后端运行在 `http://localhost:3000`,Swagger 文档 `http://localhost:3000/swagger`。
### 2. 启动前端
```bash
cd web
npm install
npm run dev
```
前端运行在 `http://localhost:5173`,已配置代理 `/api` 转发到后端。
### 3. 生成 API 客户端(NSwag)
后端运行时,用 NSwag 从 OpenAPI 文档自动生成 TypeScript 客户端:
```bash
# 先安装 NSwag CLI 工具(只需一次)
dotnet tool install --global NSwag.ConsoleCore
# 生成 TypeScript 客户端到 src/api/client.ts
cd web
npm run gen:api
```
生成的 `src/api/client.ts` 包含所有 DTO 类型和 API 方法,类型安全地调用后端接口。
### 3. 访问系统
打开 `http://localhost:5173`
**默认账号**:`admin` / `123456`(超级管理员,拥有全部权限)
## 前端目录结构
```
web/src/
├── layout/index.vue # 主布局(侧边栏 + 面包屑 + 内容区)
├── router/index.js # 路由 + 动态路由构建
├── store/user.js # 用户状态(Pinia)
├── directives/permission.js # 权限指令 v-permission
├── utils/request.js # axios 封装(拦截器)
└── views/
├── login/ # 登录页
├── dashboard/ # 首页
└── system/
├── department/ # 部门管理
├── employee/ # 职工管理
├── role/ # 角色管理(含菜单分配)
├── menu/ # 菜单管理
└── log/ # 操作日志
```
## 权限使用示例
```vue
<!-- 按钮级权限控制 -->
<el-button v-permission="'system:user:add'">新增</el-button>
<!-- 多权限任一满足 -->
<el-button v-permission="['system:user:add', 'system:user:edit']">操作</el-button>
```
## API 接口
- `POST /api/auth/login` - 登录(返回 access token + refresh token)
- `POST /api/auth/refresh` - 刷新令牌(用 refresh token 换新 access token)
- `POST /api/auth/logout` - 退出(撤销 refresh token)
- `GET /api/auth/me` - 当前用户信息
- `GET /api/auth/menus` - 用户菜单树
- `GET /api/auth/permissions` - 用户权限标识
- `PUT /api/auth/password` - 修改密码
- `PUT /api/auth/profile` - 更新资料
- `GET /api/department/tree` - 部门树
- `POST /api/department` - 新增部门
- `PUT /api/department/:id` - 更新部门
- `DELETE /api/department/:id` - 删除部门
- `GET /api/employee` - 职工分页
- `POST /api/employee` - 新增职工
- `PUT /api/employee/:id` - 更新职工
- `DELETE /api/employee/:id` - 删除职工
- `PUT /api/employee/:id/password` - 重置密码
- `GET /api/role` - 角色列表
- `GET /api/role/:id/menus` - 角色菜单
- `POST /api/role` - 新增角色
- `PUT /api/role/:id` - 更新角色
- `DELETE /api/role/:id` - 删除角色
- `GET /api/menu/tree` - 菜单树
- `POST /api/menu` - 新增菜单
- `PUT /api/menu/:id` - 更新菜单
- `DELETE /api/menu/:id` - 删除菜单
- `POST /api/attendance/punch` - 打卡(签到/签退)
- `GET /api/attendance/my` - 我的考勤记录
- `GET /api/attendance/my/summary` - 我的考勤统计
- `GET /api/attendance` - 全员考勤记录(管理员)
- `POST /api/attendance/leave` - 申请请假
- `GET /api/attendance/leave/my` - 我的请假
- `GET /api/attendance/leave` - 全部请假(管理员)
- `PUT /api/attendance/leave/:id/approve` - 审批请假