| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702 |
- ---
- alwaysApply: false
- ---
- ### API 设计模式
- #### 统一 API 封装
- **基础请求封装**
- ```javascript
- // utils/request.js
- const BASE_URL = 'https://api.example.com'
- const request = {
- // GET 请求
- get(url, params = {}) {
- return new Promise((resolve, reject) => {
- uni.request({
- url: `${BASE_URL}${url}`,
- method: 'GET',
- data: params,
- header: {
- 'Authorization': uni.getStorageSync('token'),
- 'Content-Type': 'application/json'
- },
- success: (res) => {
- if (res.statusCode === 200) {
- resolve(res.data)
- } else {
- this.handleError(res)
- reject(res)
- }
- },
- fail: (err) => {
- this.handleError(err)
- reject(err)
- }
- })
- })
- },
- // POST 请求
- post(url, data = {}) {
- return new Promise((resolve, reject) => {
- uni.request({
- url: `${BASE_URL}${url}`,
- method: 'POST',
- data: data,
- header: {
- 'Authorization': uni.getStorageSync('token'),
- 'Content-Type': 'application/json'
- },
- success: (res) => {
- if (res.statusCode === 200) {
- resolve(res.data)
- } else {
- this.handleError(res)
- reject(res)
- }
- },
- fail: (err) => {
- this.handleError(err)
- reject(err)
- }
- })
- })
- },
- // 统一错误处理
- handleError(error) {
- let message = '请求失败'
-
- if (error.statusCode) {
- switch (error.statusCode) {
- case 401:
- message = '登录已过期,请重新登录'
- // 跳转到登录页
- uni.navigateTo({ url: '/pages/login/login' })
- break
- case 403:
- message = '没有权限访问'
- break
- case 404:
- message = '请求的资源不存在'
- break
- case 500:
- message = '服务器内部错误'
- break
- default:
- message = error.data?.message || '请求失败'
- }
- }
-
- uni.showToast({
- title: message,
- icon: 'none',
- duration: 2000
- })
- }
- }
- export default request
- ```
- #### API 模块化组织
- **按业务模块组织API**
- ```javascript
- // api/user.js
- import request from '@/utils/request'
- export const userApi = {
- // 登录
- login(data) {
- return request.post('/user/login', data)
- },
-
- // 获取用户信息
- getUserInfo() {
- return request.get('/user/info')
- },
-
- // 更新用户信息
- updateUser(data) {
- return request.post('/user/update', data)
- }
- }
- // api/order.js
- export const orderApi = {
- // 获取订单列表
- getOrderList(params) {
- return request.get('/order/list', params)
- },
-
- // 创建订单
- createOrder(data) {
- return request.post('/order/create', data)
- }
- }
- ```
- #### 数据状态管理模式
- **加载状态处理**
- ```javascript
- // 在页面或组件中
- export default {
- data() {
- return {
- loading: false,
- list: [],
- error: null,
- empty: false
- }
- },
-
- methods: {
- async loadData() {
- this.loading = true
- this.error = null
-
- try {
- const result = await orderApi.getOrderList()
- this.list = result.data || []
- this.empty = this.list.length === 0
- } catch (error) {
- this.error = error.message
- } finally {
- this.loading = false
- }
- }
- }
- }
- ```
- **分页加载模式**
- ```javascript
- export default {
- data() {
- return {
- list: [],
- page: 1,
- pageSize: 20,
- total: 0,
- loading: false,
- loadingMore: false,
- noMore: false
- }
- },
-
- methods: {
- // 初始加载
- async loadData() {
- this.page = 1
- this.loading = true
-
- try {
- const result = await orderApi.getOrderList({
- page: this.page,
- pageSize: this.pageSize
- })
-
- this.list = result.data || []
- this.total = result.total || 0
- this.noMore = this.list.length >= this.total
- } catch (error) {
- console.error('加载失败:', error)
- } finally {
- this.loading = false
- }
- },
-
- // 加载更多
- async loadMore() {
- if (this.loadingMore || this.noMore) return
-
- this.page += 1
- this.loadingMore = true
-
- try {
- const result = await orderApi.getOrderList({
- page: this.page,
- pageSize: this.pageSize
- })
-
- const newData = result.data || []
- this.list = [...this.list, ...newData]
- this.noMore = this.list.length >= result.total
- } catch (error) {
- this.page -= 1 // 回滚页码
- console.error('加载更多失败:', error)
- } finally {
- this.loadingMore = false
- }
- },
-
- // 下拉刷新
- async onRefresh() {
- await this.loadData()
- uni.stopPullDownRefresh()
- }
- }
- }
- ```
- #### 缓存策略
- **数据缓存模式**
- ```javascript
- // utils/cache.js
- export const cache = {
- // 设置缓存
- set(key, data, expire = 3600000) { // 默认1小时
- const item = {
- data,
- expire: Date.now() + expire
- }
- uni.setStorageSync(key, JSON.stringify(item))
- },
-
- // 获取缓存
- get(key) {
- try {
- const item = JSON.parse(uni.getStorageSync(key) || '{}')
- if (item.expire && Date.now() > item.expire) {
- uni.removeStorageSync(key)
- return null
- }
- return item.data
- } catch {
- return null
- }
- },
-
- // 删除缓存
- remove(key) {
- uni.removeStorageSync(key)
- }
- }
- // 在 API 中使用缓存
- export const userApi = {
- async getUserInfo(useCache = true) {
- const cacheKey = 'user_info'
-
- if (useCache) {
- const cached = cache.get(cacheKey)
- if (cached) return cached
- }
-
- const result = await request.get('/user/info')
- cache.set(cacheKey, result)
- return result
- }
- }
- ```
- #### 表单处理模式
- **表单验证和提交**
- ```javascript
- export default {
- data() {
- return {
- form: {
- name: '',
- phone: '',
- email: ''
- },
- rules: {
- name: { required: true, message: '请输入姓名' },
- phone: { required: true, pattern: /^1[3-9]\d{9}$/, message: '请输入正确的手机号' },
- email: { pattern: /^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/, message: '请输入正确的邮箱' }
- },
- submitting: false
- }
- },
-
- methods: {
- // 表单验证
- validateForm() {
- for (const field in this.rules) {
- const rule = this.rules[field]
- const value = this.form[field]
-
- if (rule.required && !value) {
- uni.showToast({ title: rule.message, icon: 'none' })
- return false
- }
-
- if (rule.pattern && value && !rule.pattern.test(value)) {
- uni.showToast({ title: rule.message, icon: 'none' })
- return false
- }
- }
- return true
- },
-
- // 提交表单
- async submitForm() {
- if (!this.validateForm()) return
-
- this.submitting = true
-
- try {
- await userApi.updateUser(this.form)
- uni.showToast({ title: '保存成功' })
- uni.navigateBack()
- } catch (error) {
- console.error('提交失败:', error)
- } finally {
- this.submitting = false
- }
- }
- }
- }
- ```
- ### API 设计模式
- #### 统一 API 封装
- **基础请求封装**
- ```javascript
- // utils/request.js
- const BASE_URL = 'https://api.example.com'
- const request = {
- // GET 请求
- get(url, params = {}) {
- return new Promise((resolve, reject) => {
- uni.request({
- url: `${BASE_URL}${url}`,
- method: 'GET',
- data: params,
- header: {
- 'Authorization': uni.getStorageSync('token'),
- 'Content-Type': 'application/json'
- },
- success: (res) => {
- if (res.statusCode === 200) {
- resolve(res.data)
- } else {
- this.handleError(res)
- reject(res)
- }
- },
- fail: (err) => {
- this.handleError(err)
- reject(err)
- }
- })
- })
- },
- // POST 请求
- post(url, data = {}) {
- return new Promise((resolve, reject) => {
- uni.request({
- url: `${BASE_URL}${url}`,
- method: 'POST',
- data: data,
- header: {
- 'Authorization': uni.getStorageSync('token'),
- 'Content-Type': 'application/json'
- },
- success: (res) => {
- if (res.statusCode === 200) {
- resolve(res.data)
- } else {
- this.handleError(res)
- reject(res)
- }
- },
- fail: (err) => {
- this.handleError(err)
- reject(err)
- }
- })
- })
- },
- // 统一错误处理
- handleError(error) {
- let message = '请求失败'
-
- if (error.statusCode) {
- switch (error.statusCode) {
- case 401:
- message = '登录已过期,请重新登录'
- // 跳转到登录页
- uni.navigateTo({ url: '/pages/login/login' })
- break
- case 403:
- message = '没有权限访问'
- break
- case 404:
- message = '请求的资源不存在'
- break
- case 500:
- message = '服务器内部错误'
- break
- default:
- message = error.data?.message || '请求失败'
- }
- }
-
- uni.showToast({
- title: message,
- icon: 'none',
- duration: 2000
- })
- }
- }
- export default request
- ```
- #### API 模块化组织
- **按业务模块组织API**
- ```javascript
- // api/user.js
- import request from '@/utils/request'
- export const userApi = {
- // 登录
- login(data) {
- return request.post('/user/login', data)
- },
-
- // 获取用户信息
- getUserInfo() {
- return request.get('/user/info')
- },
-
- // 更新用户信息
- updateUser(data) {
- return request.post('/user/update', data)
- }
- }
- // api/order.js
- export const orderApi = {
- // 获取订单列表
- getOrderList(params) {
- return request.get('/order/list', params)
- },
-
- // 创建订单
- createOrder(data) {
- return request.post('/order/create', data)
- }
- }
- ```
- #### 数据状态管理模式
- **加载状态处理**
- ```javascript
- // 在页面或组件中
- export default {
- data() {
- return {
- loading: false,
- list: [],
- error: null,
- empty: false
- }
- },
-
- methods: {
- async loadData() {
- this.loading = true
- this.error = null
-
- try {
- const result = await orderApi.getOrderList()
- this.list = result.data || []
- this.empty = this.list.length === 0
- } catch (error) {
- this.error = error.message
- } finally {
- this.loading = false
- }
- }
- }
- }
- ```
- **分页加载模式**
- ```javascript
- export default {
- data() {
- return {
- list: [],
- page: 1,
- pageSize: 20,
- total: 0,
- loading: false,
- loadingMore: false,
- noMore: false
- }
- },
-
- methods: {
- // 初始加载
- async loadData() {
- this.page = 1
- this.loading = true
-
- try {
- const result = await orderApi.getOrderList({
- page: this.page,
- pageSize: this.pageSize
- })
-
- this.list = result.data || []
- this.total = result.total || 0
- this.noMore = this.list.length >= this.total
- } catch (error) {
- console.error('加载失败:', error)
- } finally {
- this.loading = false
- }
- },
-
- // 加载更多
- async loadMore() {
- if (this.loadingMore || this.noMore) return
-
- this.page += 1
- this.loadingMore = true
-
- try {
- const result = await orderApi.getOrderList({
- page: this.page,
- pageSize: this.pageSize
- })
-
- const newData = result.data || []
- this.list = [...this.list, ...newData]
- this.noMore = this.list.length >= result.total
- } catch (error) {
- this.page -= 1 // 回滚页码
- console.error('加载更多失败:', error)
- } finally {
- this.loadingMore = false
- }
- },
-
- // 下拉刷新
- async onRefresh() {
- await this.loadData()
- uni.stopPullDownRefresh()
- }
- }
- }
- ```
- #### 缓存策略
- **数据缓存模式**
- ```javascript
- // utils/cache.js
- export const cache = {
- // 设置缓存
- set(key, data, expire = 3600000) { // 默认1小时
- const item = {
- data,
- expire: Date.now() + expire
- }
- uni.setStorageSync(key, JSON.stringify(item))
- },
-
- // 获取缓存
- get(key) {
- try {
- const item = JSON.parse(uni.getStorageSync(key) || '{}')
- if (item.expire && Date.now() > item.expire) {
- uni.removeStorageSync(key)
- return null
- }
- return item.data
- } catch {
- return null
- }
- },
-
- // 删除缓存
- remove(key) {
- uni.removeStorageSync(key)
- }
- }
- // 在 API 中使用缓存
- export const userApi = {
- async getUserInfo(useCache = true) {
- const cacheKey = 'user_info'
-
- if (useCache) {
- const cached = cache.get(cacheKey)
- if (cached) return cached
- }
-
- const result = await request.get('/user/info')
- cache.set(cacheKey, result)
- return result
- }
- }
- ```
- #### 表单处理模式
- **表单验证和提交**
- ```javascript
- export default {
- data() {
- return {
- form: {
- name: '',
- phone: '',
- email: ''
- },
- rules: {
- name: { required: true, message: '请输入姓名' },
- phone: { required: true, pattern: /^1[3-9]\d{9}$/, message: '请输入正确的手机号' },
- email: { pattern: /^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/, message: '请输入正确的邮箱' }
- },
- submitting: false
- }
- },
-
- methods: {
- // 表单验证
- validateForm() {
- for (const field in this.rules) {
- const rule = this.rules[field]
- const value = this.form[field]
-
- if (rule.required && !value) {
- uni.showToast({ title: rule.message, icon: 'none' })
- return false
- }
-
- if (rule.pattern && value && !rule.pattern.test(value)) {
- uni.showToast({ title: rule.message, icon: 'none' })
- return false
- }
- }
- return true
- },
-
- // 提交表单
- async submitForm() {
- if (!this.validateForm()) return
-
- this.submitting = true
-
- try {
- await userApi.updateUser(this.form)
- uni.showToast({ title: '保存成功' })
- uni.navigateBack()
- } catch (error) {
- console.error('提交失败:', error)
- } finally {
- this.submitting = false
- }
- }
- }
- }
- ```
|