rhb-server/mes-ui/rhb-app/utils/README.md
2025-10-20 11:14:41 +08:00

477 lines
10 KiB
Markdown
Raw Permalink 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.

# HTTP工具类使用说明
本项目提供了基于Vue2和uni-app的HTTP请求工具类用于统一管理API请求。
## 文件结构
```
utils/
├── https.js # HTTP工具类核心文件
├── config.js # 配置文件
├── api.js # API接口配置
├── api-demo.js # API调用示例
├── UserUtil.js # 用户信息管理工具类
├── UserUtil-demo.js # UserUtil使用示例
└── README.md # 使用说明
```
## 快速开始
### 1. 引入HTTP工具类
在需要使用API的组件中引入
```javascript
// 引入具体的API模块
import { userApi, householdApi } from '../../utils/api.js'
// 或者引入所有API
import api from '../../utils/api.js'
```
### 2. 引入用户信息管理工具类
```javascript
// 引入UserUtil
import userUtil from '@/utils/UserUtil.js'
```
### 2. 基本使用
```javascript
export default {
data() {
return {
userInfo: null,
householdList: []
}
},
async mounted() {
// 获取用户信息
try {
this.userInfo = await userApi.getUserInfo()
} catch (error) {
console.error('获取用户信息失败:', error)
}
},
methods: {
// 创建家庭登记
async createHousehold() {
try {
const data = {
householdName: '张三家庭',
contactPhone: '13800138000',
address: '北京市朝阳区xxx街道'
}
const result = await householdApi.createHousehold(data)
console.log('创建成功:', result)
uni.showToast({
title: '创建成功',
icon: 'success'
})
} catch (error) {
console.error('创建失败:', error)
}
}
}
}
```
## 配置说明
### 环境配置
`config.js` 中配置不同环境的API地址
```javascript
const ENV = {
development: {
baseURL: 'http://localhost:8080/admin-api',
uploadURL: 'http://localhost:8080/admin-api/upload'
},
production: {
baseURL: 'https://your-production-domain.com/admin-api',
uploadURL: 'https://your-production-domain.com/admin-api/upload'
}
}
```
### 请求拦截器
HTTP工具类自动添加了以下拦截器功能
1. **自动拼接基础URL**非http开头的请求会自动拼接baseURL
2. **请求超时设置**默认1000000ms
3. **请求头设置**自动添加tenant-id和Authorization
4. **Token管理**自动从本地存储获取token
### 响应处理
- **成功响应**:自动提取 `res.data.data` 作为返回结果
- **错误处理**:自动显示错误提示
- **401错误**:自动跳转到登录页
- **网络错误**:显示网络错误提示
## API接口说明
### 用户相关接口
```javascript
import { userApi } from '../../utils/api.js'
// 用户登录
const loginResult = await userApi.login({
username: 'admin',
password: '123456'
})
// 获取用户信息
const userInfo = await userApi.getUserInfo()
// 用户登出
await userApi.logout()
```
### 家庭登记相关接口
```javascript
import { householdApi } from '../../utils/api.js'
// 获取家庭列表
const list = await householdApi.getHouseholdList({
page: 1,
size: 10,
status: 'PENDING'
})
// 创建家庭登记
const result = await householdApi.createHousehold({
householdName: '张三家庭',
contactPhone: '13800138000',
address: '北京市朝阳区'
})
// 上传签名
const uploadResult = await householdApi.uploadSignature(
filePath,
{ signatureType: 'HOLDER' }
)
```
### 文件上传接口
```javascript
import { uploadApi } from '../../utils/api.js'
// 上传图片
const imageResult = await uploadApi.uploadImage(filePath, {
type: 'household_photo'
})
// 上传文档
const docResult = await uploadApi.uploadDocument(filePath, {
type: 'household_document'
})
```
## 错误处理
### 全局错误处理
HTTP工具类已经内置了错误处理机制
```javascript
// 自动处理常见错误
try {
const result = await userApi.getUserInfo()
} catch (error) {
// 错误已经被自动处理,这里可以添加额外逻辑
console.error('自定义错误处理:', error)
}
```
### 自定义错误处理
```javascript
// 在组件中自定义错误处理
methods: {
async handleRequest() {
try {
const result = await householdApi.createHousehold(this.formData)
// 成功处理
this.handleSuccess(result)
} catch (error) {
// 自定义错误处理
if (error.statusCode === 403) {
uni.showModal({
title: '权限不足',
content: '您没有权限执行此操作'
})
} else {
uni.showToast({
title: '操作失败',
icon: 'none'
})
}
}
}
}
```
## 文件上传
### 选择并上传图片
```javascript
methods: {
selectAndUploadImage() {
uni.chooseImage({
count: 1,
sizeType: ['compressed'],
sourceType: ['album', 'camera'],
success: async (res) => {
const filePath = res.tempFilePaths[0]
try {
const result = await uploadApi.uploadImage(filePath, {
type: 'household_photo'
})
console.log('上传成功:', result)
} catch (error) {
console.error('上传失败:', error)
}
}
})
}
}
```
### 上传签名
```javascript
methods: {
async uploadSignature(signatureBase64) {
try {
// 将base64转换为文件路径
const filePath = await this.base64ToFilePath(signatureBase64)
const result = await householdApi.uploadSignature(filePath, {
signatureType: 'HOLDER'
})
console.log('签名上传成功:', result)
} catch (error) {
console.error('签名上传失败:', error)
}
}
}
```
## 最佳实践
### 1. 组件中的使用
```javascript
export default {
data() {
return {
loading: false,
data: null
}
},
async mounted() {
await this.loadData()
},
methods: {
async loadData() {
this.loading = true
try {
this.data = await api.household.getHouseholdList()
} catch (error) {
// 错误已被自动处理
} finally {
this.loading = false
}
}
}
}
```
### 2. 表单提交
```javascript
methods: {
async submitForm() {
try {
// 表单验证
await this.validateForm()
// 提交数据
const result = await householdApi.createHousehold(this.formData)
// 成功处理
uni.showToast({ title: '提交成功', icon: 'success' })
uni.navigateBack()
} catch (error) {
// 错误处理
}
}
}
```
### 3. 并行请求
```javascript
methods: {
async loadInitialData() {
try {
const [userInfo, householdList, dictData] = await Promise.all([
userApi.getUserInfo(),
householdApi.getHouseholdList(),
systemApi.getDictData('household_type')
])
this.userInfo = userInfo
this.householdList = householdList
this.dictData = dictData
} catch (error) {
console.error('加载数据失败:', error)
}
}
}
```
## 注意事项
1. **Token管理**确保登录后正确保存token到本地存储
2. **错误处理**:虽然工具类会自动处理常见错误,但建议在关键操作中添加自定义错误处理
3. **文件上传**:注意文件大小限制和格式要求
4. **网络状态**:在弱网环境下注意请求超时设置
5. **数据格式**确保提交的数据格式符合后端API要求
## 用户信息管理 (UserUtil)
### 基本使用
```javascript
import userUtil from '@/utils/UserUtil.js'
// 保存登录信息
userUtil.setLoginInfo({
accessToken: 'token123',
refreshToken: 'refresh123',
userId: 'user123',
username: 'admin',
userInfo: { name: '张三', role: 'admin' }
})
// 检查登录状态
const isLoggedIn = userUtil.isLoggedIn()
// 获取用户信息
const userInfo = userUtil.getFullUserInfo()
const loginInfo = userUtil.getLoginInfo()
const accessToken = userUtil.getAccessToken()
// 清除用户信息
userUtil.clearAll()
```
### 登录流程示例
```javascript
export default {
methods: {
async handleLogin() {
try {
// 调用登录接口
const loginResult = await userApi.login(this.loginForm)
// 保存登录信息
userUtil.setLoginInfo({
accessToken: loginResult.accessToken,
refreshToken: loginResult.refreshToken,
userId: loginResult.userId,
username: this.loginForm.username,
userInfo: loginResult.userInfo
})
// 保存用户名密码(可选)
userUtil.setCredentials(this.loginForm.username, this.loginForm.password)
// 跳转到主页
uni.reLaunch({ url: '/pages/index/index' })
} catch (error) {
console.error('登录失败:', error)
}
}
}
}
```
### 用户信息管理
```javascript
// 更新用户信息
userUtil.updateUserInfo({
nickname: '新昵称',
avatar: 'new-avatar.jpg'
})
// 保存字典信息
userUtil.setDictInfo([
{ dictType: 'household_type', dictLabel: '家庭', dictValue: 'FAMILY' }
])
// 获取字典信息
const dictInfo = userUtil.getDictInfo()
```
### 自动登录
```javascript
export default {
async mounted() {
// 检查是否有保存的凭据
const credentials = userUtil.getCredentials()
if (credentials.username && credentials.password) {
try {
// 尝试自动登录
await this.autoLogin(credentials.username, credentials.password)
} catch (error) {
// 自动登录失败,清除凭据
userUtil.clearCredentials()
}
}
},
methods: {
async autoLogin(username, password) {
const loginResult = await userApi.login({ username, password })
userUtil.setLoginInfo({
accessToken: loginResult.accessToken,
userId: loginResult.userId,
username: username,
userInfo: loginResult.userInfo
})
}
}
}
```
## 更新日志
- v1.0.0: 初始版本支持基本的HTTP请求和文件上传
- 支持Vue2语法和uni-app框架
- 内置请求拦截器和响应处理
- 统一的错误处理机制
- v1.1.0: 新增UserUtil用户信息管理工具类