# 风控品控管理系统 — 前端
**Vue 3.5** | **TypeScript 5** | **Element Plus 2.x** | **Vite 5** | **Pinia 2** | **ECharts 5**
企业级安全风险管控与质量管控平台前端项目
---
## 一、项目简介
本仓库是 **风控品控管理系统** 的前端项目,基于开源框架 [plus-ui](https://gitee.com/JavaLionLi/plus-ui)(Vue 3 + TS + Element Plus + Vite)深度定制开发,覆盖 10 大风控业务场景,统一对接后端 RuoYi-Vue-Plus 微服务。
### 核心特性
- 🚀 **现代化** — Vue 3 Composition API + Vite 5 热更新,开发体验流畅
- 🎨 **主题统一** — Element Plus 二次封装,1080P 分辨率 UI 规范
- 🔐 **安全** — 登录 AES 加密、动态 RSA 秘钥交换、Sa-Token 鉴权
- 📱 **响应式** — el-row/el-col 自适应,支持 xs/sm/md/lg/xl 多断点
- 📊 **数据可视化** — ECharts 折线图、饼图、仪表盘
- 🗂️ **文件存储** — MinIO 分片上传/下载/预览
- 📐 **滚动规范** — 长页面统一 `.xxx-page { height: 100%; overflow-y: auto }`
---
## 二、业务模块
| 业务域 | 路径 | 功能 |
|---|---|---|
| 工作台首页 | `/index` | 4 张数据卡片 + 2 张图表 + 三段式(最新隐患 + 培训 + 公告) |
| 安全隐患 | `/risk/hiddenDanger` | 隐患上报、整改、复查、销项闭环 |
| 危险源上报 | `/risk/dangerSource` | 危险源登记、风险等级评估、防控措施 |
| 风险警示 | `/risk/warning` | 风险预警信息发布跟踪 |
| 特种设备 | `/risk/specialEquipment` | 设备台账、检验日期、维护记录 |
| 人员信息 | `/risk/personnel` | 员工档案、岗位、工种 |
| 人员变更 | `/risk/personnelChange` | 岗位/部门/工种变动履历 |
| 人员证书 | `/risk/personnelCert` | 特种作业证、健康证等 |
| 作业上报 | `/risk/workReport` | 高危作业申报、审批、监护 |
| 事故上报 | `/risk/accident` | 事故登记、调查、考核、闭环 |
| 巡检任务 | `/risk/inspectionTask` | 巡检计划、打卡、巡检项/记录/详情 |
| 舆情推送 | `/risk/publicOpinion` | 重大舆情监测、影响范围、定级处置 |
> 所有页面均遵循 `风险模块 1080P 分辨率 UI 统一规范`,搜索框前必须有"关键词"标签,筛选项不折行。
---
## 三、技术栈
| 技术 | 版本 | 用途 |
|---|---|---|
| Vue | 3.5.x | 主框架 |
| TypeScript | 5.x | 类型系统 |
| Vite | 5.x | 构建工具 |
| Element Plus | 2.x | UI 组件库 |
| Pinia | 2.x | 状态管理 |
| Vue Router | 4.x | 路由 |
| ECharts | 5.x | 图表(仪表盘趋势/饼图) |
| Axios | 1.x | HTTP 客户端(含加密拦截器) |
| VueUse | 10.x | 组合式工具集 |
| @vueup/vue-quill | 1.x | 富文本编辑器 |
| @element-plus/icons-vue | 2.x | 图标 |
---
## 四、项目结构
```
plus-ui/
├── public/ # 静态资源
│ └── favicon.ico
│
├── src/
│ ├── api/ # API 接口层
│ │ ├── system/ # 系统模块接口
│ │ ├── monitor/
│ │ ├── tool/
│ │ ├── workflow/
│ │ └── risk/ # ★ 风控业务接口(14 个 ts)
│ │ ├── types.ts
│ │ ├── dashboard.ts
│ │ ├── hiddenDanger.ts
│ │ ├── dangerSource.ts
│ │ ├── warning.ts
│ │ ├── specialEquipment.ts
│ │ ├── personnel.ts
│ │ ├── personnelChange.ts
│ │ ├── personnelCert.ts
│ │ ├── workReport.ts
│ │ ├── accident.ts
│ │ ├── inspectionTask.ts
│ │ ├── inspectionItem.ts
│ │ ├── publicOpinion.ts
│ │ ├── auditFile.ts
│ │ ├── file.ts
│ │ └── equipmentMaintenance.ts
│ │
│ ├── assets/ # 资源(图片、样式)
│ ├── components/ # 通用组件
│ │ ├── FileUpload/ # 文件上传(MinIO)
│ │ ├── ImageUpload/ # 图片上传
│ │ └── ... (20+ 个)
│ │
│ ├── directive/ # 自定义指令
│ ├── enums/ # 枚举
│ ├── hooks/ # 组合式函数
│ ├── lang/ # 国际化
│ ├── layout/ # 布局(侧边栏、头部、面包屑)
│ ├── plugins/ # 插件
│ ├── router/ # 路由 + 动态菜单
│ ├── store/ # Pinia 状态
│ │ └── modules/
│ │ ├── user.ts # 用户/登录/Token
│ │ ├── permission.ts # 动态路由权限
│ │ ├── dict.ts # 字典缓存
│ │ └── ...
│ │
│ ├── types/ # 全局类型声明
│ ├── utils/ # 工具类
│ │ ├── request.ts # axios 封装(含加密)
│ │ ├── auth.ts # Token 工具
│ │ ├── minio.ts # ★ MinIO 文件工具
│ │ └── ... (19 个)
│ │
│ ├── views/ # 页面
│ │ ├── index.vue # 工作台首页
│ │ ├── login.vue # 登录页
│ │ ├── system/ # 系统管理页面
│ │ └── risk/ # ★ 风控业务页面(10 个)
│ │ ├── hiddenDanger/
│ │ ├── dangerSource/
│ │ ├── warning/
│ │ ├── specialEquipment/
│ │ ├── personnel/
│ │ ├── personnelChange/
│ │ ├── workReport/
│ │ ├── accident/
│ │ ├── inspectionTask/
│ │ └── publicOpinion/
│ │
│ ├── App.vue # 根组件
│ ├── main.ts # 入口
│ ├── permission.ts # 路由守卫
│ └── settings.ts # 全局配置
│
├── vite/
│ └── plugins/ # Vite 自定义插件
│ ├── auto-import.ts
│ ├── components.ts
│ ├── compression.ts
│ ├── icons.ts
│ ├── unocss.ts
│ └── ...
│
├── .env.development # 开发环境配置
├── .env.production # 生产环境配置
├── index.html
├── vite.config.ts
├── tsconfig.json
├── uno.config.ts # UnoCSS 原子化样式
├── eslint.config.ts
├── package.json
└── README.md
```
---
## 五、本地开发
### 环境要求
- Node.js 18+(推荐 20+)
- npm 9+ 或 pnpm 8+
### 启动
```bash
# 1. 安装依赖
npm install --registry=https://registry.npmmirror.com
# 2. 启动开发服务器(默认 :80,代理后端 :8080)
npm run dev
# 3. 构建生产环境
npm run build:prod # 输出至 dist/
# 4. 本地预览构建产物
npm run preview
```
### 脚本命令
| 命令 | 说明 |
|---|---|
| `npm run dev` | 开发模式(热更新) |
| `npm run build:prod` | 生产环境构建 |
| `npm run preview` | 预览 dist 产物 |
| `npm run lint` | ESLint 检查 |
| `npm run lint:fix` | ESLint 自动修复 |
---
## 六、环境变量
### `.env.development`(开发环境)
```bash
# API 基础路径(开发时通过 Vite proxy 代理到后端 :8080)
VITE_APP_BASE_API = '/dev-api'
# 登录加密(开发环境关闭以便调试)
VITE_APP_ENCRYPT = 'false'
# 应用标题
VITE_APP_TITLE = '风控品控管理系统'
```
### `.env.production`(生产环境)
```bash
# 生产 API 基础路径(Nginx 反代 /prod-api → 后端 :8080)
VITE_APP_BASE_API = '/prod-api'
# 登录加密(生产必须开启)
VITE_APP_ENCRYPT = 'true'
# 应用标题
VITE_APP_TITLE = '风控品控管理系统'
```
---
## 七、路由与菜单
### 路由结构
- **静态路由**:`src/router/staticRoutes.ts` 定义无需权限的路由(login、404、index)
- **动态路由**:登录后根据 `sys_menu` 表查询用户的菜单权限,动态注入到 `src/router/index.ts`
### 新增业务页面流程
1. 在 `src/api/risk/` 添加 API 接口(参考 `hiddenDanger.ts`)
2. 在 `src/views/risk//index.vue` 实现页面
3. 在 `src/router/index.ts` 注册路由(meta 中配置 title / icon / affix / noCache)
4. 在系统管理 → 菜单管理 新增菜单数据(参考 `sql/risk_menu.sql`)
5. 重新登录,前端按角色拉取菜单权限
### 滚动规范
所有 RuoYi 路由页面(被 `AppMain` 容器 `overflow: hidden` 裁切的)根容器需使用:
```scss
.xxx-page {
padding: 16px;
height: 100%; // 继承父级 .app-main 高度
overflow-y: auto; // 内容超出时出现滚动条
box-sizing: border-box;
}
```
已应用:hiddenDanger / dangerSource / warning / specialEquipment / personnel / personnelChange / workReport / accident / inspectionTask / publicOpinion
---
## 八、HTTP 请求与加密
### 拦截器
`src/utils/request.ts` 统一处理:
- **请求加密**:登录/register 接口 body 使用 `jsencrypt + crypto-js` 进行 AES+RSA 加密
- **响应解密**:根据 `isEncrypt` 配置决定是否解密
- **Token 注入**:自动添加 `Authorization: Bearer xxx` 请求头
- **错误统一处理**:401 → 跳登录;500 → 弹消息
### 加密开关
| 环境 | 加密状态 | 原因 |
|---|---|---|
| 开发 | 关闭 | 便于在浏览器 DevTools 中查看请求体 |
| 生产 | 开启 | 防止中间人攻击、降低可破解性 |
> 前后端配套:`api-decrypt.enabled=true` 必须与前端 `VITE_APP_ENCRYPT=true` 一致。
---
## 九、组件库约定
### 表格(el-table)
- 行点击通过 `row-click` 事件跳转详情页
- 列定义在 `columns` 数组中,状态/等级字段用 `el-tag` 配合 `type` 颜色
- 操作列固定右侧,使用 `` 风格
### 表单(el-form)
- 1080P 适配:`label-width="84px"`(hiddenDanger)或 `label-width="90px"`(其他风险模块)
- 搜索框前必须有"关键词"标签
- 必填项用 `` 标识
### 弹窗(el-dialog)
- 宽度按内容分档:新增/编辑 `600px`,详情 `800px`,富文本 `900px`
- 提交前 `await formRef.value.validate()`
- 关闭时 `formRef.value.resetFields()`
---
## 十、构建与部署
### 构建
```bash
npm run build:prod
# 输出至 dist/
# - dist/index.html
# - dist/assets/*.js
# - dist/assets/*.css
# - dist/assets/*.svg
```
### Nginx 部署示例
```nginx
server {
listen 80;
server_name risk.example.com;
root /var/www/risk-ui/dist;
index index.html;
# 前端 SPA fallback
location / {
try_files $uri $uri/ /index.html;
}
# 反向代理后端 API
location /prod-api/ {
proxy_pass http://127.0.0.1:8080/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 100m;
}
}
```
---
## 十一、配套后端
- **后端仓库**: http://134.175.81.27:3000/yangjingjing/risk_control_platform.git
- **后端框架**: RuoYi-Vue-Plus 5.6.2
- **数据库**: MySQL 8.0(库名 `risk_control_platform`)
- **缓存**: Redis 6.0+
- **对象存储**: MinIO
- **鉴权**: Sa-Token
---
## 十二、版本历史
| 版本 | 日期 | 说明 |
|---|---|---|
| v1.0.0 | 2026-06 | 整合 10 大风控业务模块,首版上线 |
---
## 十三、致谢
基于开源框架 [plus-ui](https://gitee.com/JavaLionLi/plus-ui) 开发,遵循 MIT 协议开源。