前端架构概览
技术栈
| 技术 | 说明 |
|---|---|
| Vue 3 | 渐进式 JavaScript 框架,使用 Composition API |
| uni-app (Nuxt3) | 跨平台应用开发框架,一套代码编译到多端 |
| TypeScript | 强类型 JavaScript 超集 |
| Pinia | Vue 3 官方状态管理库 |
| SCSS | CSS 预处理器 |
| UVUI (luch-request) | uni-app UI 组件库与 HTTP 请求库 |
目标平台
项目通过 uni-app 条件编译支持以下终端:
| 终端 | 枚举值 | 说明 |
|---|---|---|
| 微信小程序 | 10 | 通过 mp-weixin 条件编译 |
| 微信公众号 | 11 | H5 在微信环境内运行 |
| H5 网页 | 20 | 浏览器访问 |
| 手机 App | 31 | Android / iOS,通过 APP-PLUS 条件编译 |
终端枚举定义在 src/enums/index.ts 的 TerminalEnum,与后端 TerminalEnum 一一对应,用于请求头中标识请求来源。
项目目录结构
live-mall-uniapp/
├── src/
│ ├── common/ # 公共模块
│ │ ├── http/ # HTTP 请求封装(拦截器、Token 刷新)
│ │ └── style/ # 全局公共样式(public.scss)
│ ├── components/ # 全局公共组件(c- 前缀)
│ ├── enums/ # 枚举常量定义
│ ├── hooks/ # 组合式函数(useIM、useCacheClean 等)
│ ├── libs/ # 第三方库封装
│ ├── pages/ # 页面(含分包子包)
│ ├── services/ # API 服务层
│ │ ├── apis/ # 接口调用函数
│ │ └── model/ # TypeScript 类型定义(.d.ts)
│ ├── static/ # 静态资源
│ ├── store/ # Pinia 状态管理
│ ├── types/ # 全局类型声明
│ └── utils/ # 工具函数
│ ├── index.ts # 通用工具方法
│ ├── constants.ts # 业务常量
│ ├── permission.ts # App 权限判断
│ └── permConsts.ts # 权限常量
├── manifest.json # uni-app 应用配置
├── pages.json # 页面路由与分包配置
└── vite.config.js # Vite 构建配置
分包结构
项目采用 uni-app 分包机制,主包仅包含 Tab 页面,业务页面按模块拆分到子包:
| 分包 | 路径前缀 | 功能 |
|---|---|---|
| 主包 | pages/ | 首页、商城、直播、博物馆、我的 |
pkg-common | pages/pkg-common/ | 登录、搜索等公共页 |
pkg-order | pages/pkg-order/ | 订单相关页面 |
pkg-info | pages/pkg-info/ | 资讯详情 |
pkg-live | pages/pkg-live/ | 直播间页面 |
HTTP 请求层
请求层基于 luch-request 封装,核心文件为 src/common/http/index.ts。
请求拦 截
// 自动添加 /app-api/ 前缀
if (!url.includes('/app-api/')) {
config.url = '/app-api/' + url
}
// 自动注入 Authorization、terminal 请求头
config.header.Authorization = getAccessToken()
config.header.terminal = getTerminal()
响应拦截
- code = 0:业务成功,返回
data.data(或完整data,取决于custom.returnFullData) - code = 401:触发 Token 刷新流程,将并发请求加入队列等待
- code ≠ 0:默认 Toast 提示错误信息,返回
Promise.reject
Token 自动刷新机制
请求 A → 401 → 标记 isRefreshToken = true
请求 B → 401 → 加入 requestList 队列
刷新成功 → 回放队列中所有请求 → isRefreshToken = false
刷新失败 → 清空队列 → 跳转登录页
请求方法导出
export const get = (url, params, custom) => http.get(url, { params, custom })
export const post = (url, data, custom) => http.post(url, data, { custom })
export const put = (url, data, custom) => http.put(url, data, { custom })
API 服务层规范
所有接口调用函数集中在 src/services/apis/ 目录,按业务模块拆分文件:
| 文件 | 职责 |
|---|---|
user.ts | 用户信息、登录、Token 刷新 |
order.ts | 订单、售后、物流 |
pay.ts | 支付、钱包、充值 |
mall.ts | 商品、分类、评价 |
cart.ts | 购物车 |
live.ts | 直播相关 |
museum.ts | 博物馆 |
public.ts | 字典、文件上传等公共接口 |
类型定义统一放在 src/services/model/ 目录,使用 .d.ts 声明文件。
条件编译
uni-app 通过注释标记实现条件编译,项目中常见的用法:
// #ifdef APP-PLUS
// 仅在 App 环境执行的代码(如原生权限判断)
// #endif
// #ifdef H5
// 仅在 H5 环境执行的代码(如开发环境代理前缀)
// #endif
// #ifdef APP-PLUS
if (uni.getSystemInfoSync().platform === 'ios') {
isIosApp = true
}
// #endif
全局事件通信
项目通过 uni.$emit / uni.$on 实现跨组件通信,事件枚举定义在 GlobalEventEnum:
| 事件 | 触发场景 |
|---|---|
HOME_PAGE_ON_SHOW | 首页 onShow,通知子组件刷新 |
ORDER_LIST_REFRESH | 订单列表刷新 |
IM_MESSAGE_RECEIVED | IM 消息接收 |
REFRESH_ADDRESS_LIST | 地址列表刷新 |
RECHARGE_SUCCESS | 余额充值成功 |
LIVE_ROOM_SWITCH | 切换直播间 |
sidebar_position: 1 title: ǰ�˼ܹ�����
ǰ�˼ܹ�����
���ĵ����ڽ����У������ڴ���