# API集成与数据处理
**本文引用的文件**
- [frontend/src/api/request.js](file://frontend/src/api/request.js)
- [frontend/src/api/index.js](file://frontend/src/api/index.js)
- [frontend/src/api/auth.js](file://frontend/src/api/auth.js)
- [frontend/src/api/department.js](file://frontend/src/api/department.js)
- [frontend/src/api/staff.js](file://frontend/src/api/staff.js)
- [frontend/src/api/indicator.js](file://frontend/src/api/indicator.js)
- [frontend/src/api/assessment.js](file://frontend/src/api/assessment.js)
- [frontend/src/api/salary.js](file://frontend/src/api/salary.js)
- [frontend/src/api/template.js](file://frontend/src/api/template.js)
- [frontend/src/api/stats.js](file://frontend/src/api/stats.js)
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js)
- [frontend/src/stores/app.js](file://frontend/src/stores/app.js)
- [frontend/src/router/index.js](file://frontend/src/router/index.js)
- [frontend/package.json](file://frontend/package.json)
- [frontend/vite.config.js](file://frontend/vite.config.js)
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考虑](#性能考虑)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本指南围绕前端API集成与数据处理展开,覆盖HTTP请求封装、拦截器配置与错误处理、认证token管理、请求参数与查询条件传递、响应数据处理与状态码判断、分页与筛选排序、以及开发环境代理与生产部署要点。文档同时给出常见问题排查建议,帮助开发者快速理解并扩展该系统的API层。
## 项目结构
前端采用模块化API目录组织,按业务域拆分接口文件,并通过统一的请求封装与拦截器实现跨域代理、鉴权、错误提示等横切能力;Pinia用于状态管理,Vue Router负责路由与鉴权守卫;Vite提供开发服务器与代理配置。
```mermaid
graph TB
subgraph "前端"
VUE["Vue 应用
main.js"]
ROUTER["路由
router/index.js"]
STORE_USER["用户状态
stores/user.js"]
STORE_APP["应用状态
stores/app.js"]
API_INDEX["API聚合
api/index.js"]
API_REQ["请求封装
api/request.js"]
API_AUTH["认证接口
api/auth.js"]
API_DEPT["科室接口
api/department.js"]
API_STAFF["员工接口
api/staff.js"]
API_IND["指标接口
api/indicator.js"]
API_ASSESS["考核接口
api/assessment.js"]
API_SAL["工资接口
api/salary.js"]
API_TPL["模板接口
api/template.js"]
API_STATS["统计接口
api/stats.js"]
end
VUE --> ROUTER
VUE --> STORE_USER
VUE --> STORE_APP
VUE --> API_INDEX
API_INDEX --> API_REQ
API_INDEX --> API_AUTH
API_INDEX --> API_DEPT
API_INDEX --> API_STAFF
API_INDEX --> API_IND
API_INDEX --> API_ASSESS
API_INDEX --> API_SAL
API_INDEX --> API_TPL
API_INDEX --> API_STATS
```
图表来源
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L1-L116)
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L1-L49)
- [frontend/src/stores/app.js](file://frontend/src/stores/app.js#L1-L31)
- [frontend/src/api/index.js](file://frontend/src/api/index.js#L1-L9)
- [frontend/src/api/request.js](file://frontend/src/api/request.js#L1-L66)
- [frontend/src/api/auth.js](file://frontend/src/api/auth.js#L1-L22)
- [frontend/src/api/department.js](file://frontend/src/api/department.js#L1-L32)
- [frontend/src/api/staff.js](file://frontend/src/api/staff.js#L1-L32)
- [frontend/src/api/indicator.js](file://frontend/src/api/indicator.js#L1-L32)
- [frontend/src/api/assessment.js](file://frontend/src/api/assessment.js#L1-L50)
- [frontend/src/api/salary.js](file://frontend/src/api/salary.js#L1-L42)
- [frontend/src/api/template.js](file://frontend/src/api/template.js#L1-L62)
- [frontend/src/api/stats.js](file://frontend/src/api/stats.js#L1-L43)
章节来源
- [frontend/src/api/index.js](file://frontend/src/api/index.js#L1-L9)
- [frontend/src/api/request.js](file://frontend/src/api/request.js#L1-L66)
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L1-L116)
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L1-L49)
- [frontend/src/stores/app.js](file://frontend/src/stores/app.js#L1-L31)
## 核心组件
- 统一请求封装与拦截器
- 基础配置:基础URL、超时、默认Content-Type
- 请求拦截:自动注入Authorization头(Bearer Token)
- 响应拦截:统一错误码判断、状态码分支处理、消息提示与路由跳转
- 认证与会话管理
- 登录、获取当前用户、登出
- Token持久化与路由守卫联动
- 状态管理
- 用户状态:token、userInfo、登录/登出
- 应用状态:侧边栏折叠、科室树加载
- 路由与鉴权
- 全局前置守卫:未登录禁止访问受保护页面
- 开发代理与构建
- Vite代理到后端服务
- 构建脚本与依赖
章节来源
- [frontend/src/api/request.js](file://frontend/src/api/request.js#L1-L66)
- [frontend/src/api/auth.js](file://frontend/src/api/auth.js#L1-L22)
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L1-L49)
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L103-L113)
- [frontend/vite.config.js](file://frontend/vite.config.js#L12-L20)
- [frontend/package.json](file://frontend/package.json#L6-L10)
## 架构总览
下图展示从前端调用到后端服务的整体链路,包括请求拦截、认证、响应处理与错误反馈。
```mermaid
sequenceDiagram
participant View as "视图组件"
participant Store as "Pinia状态"
participant API as "API模块"
participant Req as "请求封装(request.js)"
participant Axios as "Axios实例"
participant Proxy as "Vite代理(/api)"
participant Backend as "后端服务"
View->>Store : 触发动作(如登录/加载数据)
Store->>API : 调用具体接口函数
API->>Req : 发起HTTP请求
Req->>Axios : 配置headers/params/timeout
Axios->>Proxy : 将/api前缀转发
Proxy->>Backend : 代理到后端地址
Backend-->>Proxy : 返回JSON响应
Proxy-->>Axios : 返回响应
Axios-->>Req : 进入响应拦截器
Req-->>API : 统一处理code/status
API-->>Store : 返回标准化数据
Store-->>View : 更新UI
```
图表来源
- [frontend/src/api/request.js](file://frontend/src/api/request.js#L6-L12)
- [frontend/src/api/request.js](file://frontend/src/api/request.js#L14-L26)
- [frontend/src/api/request.js](file://frontend/src/api/request.js#L28-L63)
- [frontend/vite.config.js](file://frontend/vite.config.js#L14-L19)
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L103-L113)
## 详细组件分析
### 统一请求封装与拦截器
- 基础配置
- 基础URL为/api/v1,所有接口以此为前缀
- 默认超时30秒,Content-Type为application/json
- 请求拦截器
- 从localStorage读取token并在请求头Authorization中附加Bearer前缀
- 响应拦截器
- 自定义code字段判断:当code不等于200时,弹出错误消息并reject
- 对常见HTTP状态码进行分支处理:401清理token并跳转登录、403无权限、404资源不存在、500服务器错误
- 其他错误:优先展示后端detail,否则提示网络错误
```mermaid
flowchart TD
Start(["进入响应拦截器"]) --> CheckCode["检查自定义code字段"]
CheckCode --> CodeOK{"code是否为200?"}
CodeOK --> |是| ReturnRes["返回data"]
CodeOK --> |否| ShowMsg["弹出错误消息"]
ShowMsg --> RejectErr["Promise.reject(error)"]
ReturnRes --> End(["结束"])
RejectErr --> End
```
图表来源
- [frontend/src/api/request.js](file://frontend/src/api/request.js#L28-L37)
章节来源
- [frontend/src/api/request.js](file://frontend/src/api/request.js#L6-L12)
- [frontend/src/api/request.js](file://frontend/src/api/request.js#L14-L26)
- [frontend/src/api/request.js](file://frontend/src/api/request.js#L28-L63)
### 认证与会话管理
- 登录
- 使用表单编码提交用户名与密码
- 成功后保存access_token至localStorage并写入store
- 获取当前用户
- 通过受保护接口获取用户信息
- 登出
- 清空token与用户信息,删除localStorage中的token并跳转登录页
- 路由守卫
- 未携带token访问受保护路由时重定向至登录页
```mermaid
sequenceDiagram
participant View as "登录页"
participant Store as "useUserStore"
participant API as "auth.js"
participant Req as "request.js"
participant Router as "router/index.js"
View->>Store : 调用login(username,password)
Store->>API : 调用login接口
API->>Req : POST /auth/login(表单编码)
Req-->>API : 返回{access_token}
API-->>Store : 返回token
Store->>Store : 写入localStorage与store
Store->>Router : 登录成功后继续导航
```
图表来源
- [frontend/src/api/auth.js](file://frontend/src/api/auth.js#L4-L11)
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L11-L20)
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L103-L113)
章节来源
- [frontend/src/api/auth.js](file://frontend/src/api/auth.js#L1-L22)
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L1-L49)
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L103-L113)
### 数据格式与参数传递
- 查询参数
- 多数GET接口通过{ params }传入查询条件,支持分页、筛选、排序等
- 特殊场景
- 批量创建考核时,后端期望重复的查询参数名,前端使用URLSearchParams拼接数组值
- 表单提交
- 登录接口使用application/x-www-form-urlencoded,其余接口默认JSON
章节来源
- [frontend/src/api/department.js](file://frontend/src/api/department.js#L4-L5)
- [frontend/src/api/assessment.js](file://frontend/src/api/assessment.js#L40-L49)
- [frontend/src/api/auth.js](file://frontend/src/api/auth.js#L5-L10)
### 响应数据处理与状态码判断
- 自定义code字段
- 当响应data.code不为200时,统一视为业务错误并提示
- HTTP状态码分支
- 401:清除token并跳转登录
- 403/404/500:分别提示对应错误
- 其他:展示后端detail或网络错误
- 返回值
- 成功时返回data,便于上层直接消费
章节来源
- [frontend/src/api/request.js](file://frontend/src/api/request.js#L28-L63)
### 分页、搜索与排序
- 分页
- 通过查询参数传递页码与每页数量,后端返回总数与列表
- 搜索与过滤
- 通过查询参数传入关键词与筛选条件
- 排序
- 通过查询参数传入排序字段与方向
- 示例接口
- 科室、员工、指标、模板、统计等均支持上述模式
章节来源
- [frontend/src/api/department.js](file://frontend/src/api/department.js#L4-L5)
- [frontend/src/api/staff.js](file://frontend/src/api/staff.js#L4-L5)
- [frontend/src/api/indicator.js](file://frontend/src/api/indicator.js#L4-L5)
- [frontend/src/api/template.js](file://frontend/src/api/template.js#L4-L5)
- [frontend/src/api/stats.js](file://frontend/src/api/stats.js#L4-L16)
### 文件上传与下载
- 上传
- 使用multipart/form-data提交文件,后端返回上传结果
- 下载
- 通过a链接或Blob对象触发浏览器下载
- 进度显示
- 可通过axios上传配置的onUploadProgress回调实现
- 取消请求
- 可使用AbortController在组件卸载或切换时取消未完成请求
说明:当前仓库未发现具体的上传/下载实现代码,以上为通用实践建议。
### Mock数据与开发环境
- 开发代理
- Vite将/api前缀代理到本地后端服务,避免跨域问题
- Mock策略
- 可在开发阶段引入mock库或后端模拟服务,便于联调与前端独立开发
章节来源
- [frontend/vite.config.js](file://frontend/vite.config.js#L12-L20)
### 生产环境部署
- 构建产物
- 使用Vite构建静态资源,输出至dist目录
- 静态部署
- 将dist作为静态站点部署,保持/api前缀不变
- 后端代理
- 生产环境需确保/api请求能正确转发至后端服务
章节来源
- [frontend/package.json](file://frontend/package.json#L6-L10)
- [frontend/vite.config.js](file://frontend/vite.config.js#L12-L20)
## 依赖关系分析
- 组件耦合
- API模块仅依赖统一请求封装,低耦合高内聚
- 路由守卫与状态管理共同保障鉴权
- 外部依赖
- axios:HTTP客户端
- element-plus:消息提示与UI组件
- pinia/vue-router:状态与路由
```mermaid
graph LR
API_REQ["api/request.js"] --> AXIOS["axios"]
API_AUTH["api/auth.js"] --> API_REQ
API_DEPT["api/department.js"] --> API_REQ
API_STAFF["api/staff.js"] --> API_REQ
API_IND["api/indicator.js"] --> API_REQ
API_ASSESS["api/assessment.js"] --> API_REQ
API_SAL["api/salary.js"] --> API_REQ
API_TPL["api/template.js"] --> API_REQ
API_STATS["api/stats.js"] --> API_REQ
STORE_USER["stores/user.js"] --> API_AUTH
STORE_APP["stores/app.js"] --> API_DEPT
ROUTER["router/index.js"] --> STORE_USER
```
图表来源
- [frontend/src/api/request.js](file://frontend/src/api/request.js#L1-L66)
- [frontend/src/api/auth.js](file://frontend/src/api/auth.js#L1-L22)
- [frontend/src/api/department.js](file://frontend/src/api/department.js#L1-L32)
- [frontend/src/api/staff.js](file://frontend/src/api/staff.js#L1-L32)
- [frontend/src/api/indicator.js](file://frontend/src/api/indicator.js#L1-L32)
- [frontend/src/api/assessment.js](file://frontend/src/api/assessment.js#L1-L50)
- [frontend/src/api/salary.js](file://frontend/src/api/salary.js#L1-L42)
- [frontend/src/api/template.js](file://frontend/src/api/template.js#L1-L62)
- [frontend/src/api/stats.js](file://frontend/src/api/stats.js#L1-L43)
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L1-L49)
- [frontend/src/stores/app.js](file://frontend/src/stores/app.js#L1-L31)
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L1-L116)
章节来源
- [frontend/src/api/index.js](file://frontend/src/api/index.js#L1-L9)
- [frontend/src/api/request.js](file://frontend/src/api/request.js#L1-L66)
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L1-L49)
- [frontend/src/stores/app.js](file://frontend/src/stores/app.js#L1-L31)
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L1-L116)
## 性能考虑
- 请求合并与去抖
- 对频繁触发的搜索/筛选操作,可在组件层增加防抖
- 缓存策略
- 对不常变动的数据(如字典、类型列表)可加入内存缓存
- 分页与懒加载
- 列表页使用分页,结合虚拟滚动提升渲染性能
- 体积优化
- 按需引入Element Plus组件,减少打包体积
## 故障排查指南
- 登录后仍被重定向至登录页
- 检查localStorage中token是否存在,确认路由守卫逻辑
- 401错误频繁出现
- 检查请求头Authorization是否正确附加,确认后端token有效期
- 403/404/500错误
- 查看后端日志与接口文档,确认权限与资源存在性
- 网络错误提示
- 检查Vite代理配置与后端服务连通性
- 批量参数传递异常
- 确认后端期望的重复参数名与数值类型
章节来源
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L103-L113)
- [frontend/src/api/request.js](file://frontend/src/api/request.js#L38-L61)
- [frontend/vite.config.js](file://frontend/vite.config.js#L14-L19)
- [frontend/src/api/assessment.js](file://frontend/src/api/assessment.js#L40-L49)
## 结论
该前端API层通过统一的请求封装与拦截器实现了鉴权、错误处理与跨域代理,配合Pinia与路由守卫形成清晰的认证与状态管理闭环。业务接口按模块化组织,查询参数传递规范,具备良好的扩展性。建议在后续迭代中补充文件上传/下载与Mock能力,并完善批量参数与分页的通用工具方法,以进一步提升开发效率与用户体验。
## 附录
- 常用接口一览(示例)
- 认证:登录、获取当前用户、注册
- 基础数据:科室、员工、指标、模板
- 考核与工资:创建、提交、审核、生成、确认
- 统计:部门统计、周期统计、趋势、排名、仪表盘、预警
- 开发与部署
- 开发:npm run dev(Vite启动+代理)
- 构建:npm run build(输出dist)
- 预览:npm run preview
章节来源
- [frontend/src/api/index.js](file://frontend/src/api/index.js#L1-L9)
- [frontend/src/api/auth.js](file://frontend/src/api/auth.js#L1-L22)
- [frontend/src/api/department.js](file://frontend/src/api/department.js#L1-L32)
- [frontend/src/api/staff.js](file://frontend/src/api/staff.js#L1-L32)
- [frontend/src/api/indicator.js](file://frontend/src/api/indicator.js#L1-L32)
- [frontend/src/api/template.js](file://frontend/src/api/template.js#L1-L62)
- [frontend/src/api/assessment.js](file://frontend/src/api/assessment.js#L1-L50)
- [frontend/src/api/salary.js](file://frontend/src/api/salary.js#L1-L42)
- [frontend/src/api/stats.js](file://frontend/src/api/stats.js#L1-L43)
- [frontend/package.json](file://frontend/package.json#L6-L10)
- [frontend/vite.config.js](file://frontend/vite.config.js#L12-L20)