1f1b18441157e9a8c27125810e8fd14b5641343e
- 新增 PayRoll(工资)、Wms(仓储)、Prod(车速/缫丝/考勤/丝片检测/丝片台账/纤检日报/质量日报) 模块 - 新增对应 Domain 实体、Application DTO/Service、Api Controller 与前端页面 - 移除旧 Attendance 考勤模块(Controller/Service/Entity/DTO 及 5 个前端页面),由 Prod/Kaoqin 取代 - 调整路由、仪表盘、Lsjl 流丝记录实体与服务 - 更新业务种子数据与 DbSeeder - 补充工作进度文档 14-27
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. 启动后端
cd backend/F9WebAiTest.Api
dotnet run
后端运行在 http://localhost:3000,Swagger 文档 http://localhost:3000/swagger。
2. 启动前端
cd web
npm install
npm run dev
前端运行在 http://localhost:5173,已配置代理 /api 转发到后端。
3. 生成 API 客户端(NSwag)
后端运行时,用 NSwag 从 OpenAPI 文档自动生成 TypeScript 客户端:
# 先安装 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/ # 操作日志
权限使用示例
<!-- 按钮级权限控制 -->
<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- 审批请假
Languages
C#
55.3%
Vue
35.9%
JavaScript
4.9%
TypeScript
3%
PowerShell
0.6%
Other
0.2%