586 lines
13 KiB
Markdown
586 lines
13 KiB
Markdown
|
|
# 系统架构文档
|
||
|
|
|
||
|
|
## 架构概述
|
||
|
|
|
||
|
|
MobVue 是一个基于 Vue3 的移动端 H5 应用,采用现代化的前端技术栈,具备清晰的模块化设计和可扩展的架构。
|
||
|
|
|
||
|
|
## 技术架构
|
||
|
|
|
||
|
|
### 前端技术栈
|
||
|
|
|
||
|
|
```
|
||
|
|
┌─────────────────────────────────────────────────────────────┐
|
||
|
|
│ MobVue 应用 │
|
||
|
|
├─────────────────────────────────────────────────────────────┤
|
||
|
|
│ Vue 3 + Composition API + TypeScript + Vant UI │
|
||
|
|
├─────────────────────────────────────────────────────────────┤
|
||
|
|
│ Pinia (状态管理) │ Vue Router (路由) │ UnoCSS (样式) │
|
||
|
|
├─────────────────────────────────────────────────────────────┤
|
||
|
|
│ Vite (构建工具) │ Axios (HTTP客户端) │ ESLint (代码规范) │
|
||
|
|
└─────────────────────────────────────────────────────────────┘
|
||
|
|
```
|
||
|
|
|
||
|
|
### 核心依赖关系
|
||
|
|
|
||
|
|
```
|
||
|
|
App.vue
|
||
|
|
├── Layout (布局系统)
|
||
|
|
│ ├── NavBar (导航栏)
|
||
|
|
│ ├── Tabbar (标签栏)
|
||
|
|
│ └── RouterView (页面渲染)
|
||
|
|
├── Pinia Stores (状态管理)
|
||
|
|
│ ├── User Store (用户状态)
|
||
|
|
│ ├── Wx Store (微信状态)
|
||
|
|
│ ├── Product Store (商品状态)
|
||
|
|
│ └── Cart Store (购物车状态)
|
||
|
|
└── Router (路由系统)
|
||
|
|
├── Route Guards (路由守卫)
|
||
|
|
└── Route Configuration (路由配置)
|
||
|
|
```
|
||
|
|
|
||
|
|
## 模块架构
|
||
|
|
|
||
|
|
### 1. 核心模块
|
||
|
|
|
||
|
|
#### 应用入口 (src/main.ts)
|
||
|
|
```typescript
|
||
|
|
// 应用初始化流程
|
||
|
|
1. 创建 Vue 应用实例
|
||
|
|
2. 安装插件系统
|
||
|
|
3. 配置状态管理 (Pinia)
|
||
|
|
4. 配置路由系统 (Vue Router)
|
||
|
|
5. 挂载应用到 DOM
|
||
|
|
```
|
||
|
|
|
||
|
|
#### 应用根组件 (src/App.vue)
|
||
|
|
```typescript
|
||
|
|
// 主要职责
|
||
|
|
1. 全局配置提供器 (ConfigProvider)
|
||
|
|
2. 主题模式管理 (暗黑/亮色)
|
||
|
|
3. 微信回调处理
|
||
|
|
4. 用户认证状态管理
|
||
|
|
5. 布局系统容器
|
||
|
|
```
|
||
|
|
|
||
|
|
### 2. 布局系统 (src/layout/)
|
||
|
|
|
||
|
|
#### 布局组件结构
|
||
|
|
```
|
||
|
|
Layout (主布局)
|
||
|
|
├── NavBar (导航栏)
|
||
|
|
│ ├── 标题显示
|
||
|
|
│ ├── 返回按钮
|
||
|
|
│ └── 操作按钮
|
||
|
|
├── Tabbar (标签栏)
|
||
|
|
│ ├── 首页
|
||
|
|
│ ├── 商品列表
|
||
|
|
│ ├── 审批中心
|
||
|
|
│ └── 个人中心
|
||
|
|
└── RouterView (页面内容)
|
||
|
|
```
|
||
|
|
|
||
|
|
#### 布局配置
|
||
|
|
```typescript
|
||
|
|
interface LayoutConfig {
|
||
|
|
navBar: {
|
||
|
|
showNavBar: boolean; // 是否显示导航栏
|
||
|
|
showLeftArrow: boolean; // 是否显示返回箭头
|
||
|
|
title?: string; // 导航栏标题
|
||
|
|
};
|
||
|
|
tabbar: {
|
||
|
|
showTabbar: boolean; // 是否显示标签栏
|
||
|
|
icon?: string; // 标签图标
|
||
|
|
};
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### 3. 状态管理架构 (src/pinia/)
|
||
|
|
|
||
|
|
#### Store 设计模式
|
||
|
|
```typescript
|
||
|
|
// Store 通用结构
|
||
|
|
export const useXxxStore = defineStore("xxx", () => {
|
||
|
|
// 1. State (状态)
|
||
|
|
const state = ref<StateType>(initialValue);
|
||
|
|
|
||
|
|
// 2. Getters (计算属性)
|
||
|
|
const computedState = computed(() => {
|
||
|
|
return state.value.filter(...);
|
||
|
|
});
|
||
|
|
|
||
|
|
// 3. Actions (操作)
|
||
|
|
const fetchData = async () => {
|
||
|
|
// 异步操作
|
||
|
|
};
|
||
|
|
|
||
|
|
// 4. 返回暴露的属性和方法
|
||
|
|
return { state, computedState, fetchData };
|
||
|
|
});
|
||
|
|
```
|
||
|
|
|
||
|
|
#### Store 依赖关系
|
||
|
|
```
|
||
|
|
User Store
|
||
|
|
├── 用户认证状态
|
||
|
|
├── 用户权限信息
|
||
|
|
└── 用户基本信息
|
||
|
|
|
||
|
|
Wx Store
|
||
|
|
├── 微信认证状态
|
||
|
|
├── 用户 OpenID
|
||
|
|
├── 企业微信信息
|
||
|
|
└── 余额信息
|
||
|
|
|
||
|
|
Product Store
|
||
|
|
├── 商品列表
|
||
|
|
├── 商品详情
|
||
|
|
└── 商品分类
|
||
|
|
|
||
|
|
Cart Store
|
||
|
|
├── 购物车商品
|
||
|
|
├── 选中状态
|
||
|
|
└── 结算信息
|
||
|
|
|
||
|
|
Order Store
|
||
|
|
├── 订单列表
|
||
|
|
├── 订单详情
|
||
|
|
└── 订单状态
|
||
|
|
```
|
||
|
|
|
||
|
|
### 4. 路由架构 (src/router/)
|
||
|
|
|
||
|
|
#### 路由分层设计
|
||
|
|
```typescript
|
||
|
|
// 系统路由 (错误页面等)
|
||
|
|
export const systemRoutes: RouteRecordRaw[] = [
|
||
|
|
{ path: "/403", component: Error403 },
|
||
|
|
{ path: "/404", component: Error404 }
|
||
|
|
];
|
||
|
|
|
||
|
|
// 业务路由 (主要功能页面)
|
||
|
|
export const routes: RouteRecordRaw[] = [
|
||
|
|
{ path: "/", component: ProductList },
|
||
|
|
{ path: "/me", component: UserCenter },
|
||
|
|
{ path: "/order/:id", component: OrderDetail }
|
||
|
|
];
|
||
|
|
```
|
||
|
|
|
||
|
|
#### 路由守卫流程
|
||
|
|
```typescript
|
||
|
|
// 路由导航守卫流程
|
||
|
|
1. 检查白名单 (无需认证的页面)
|
||
|
|
2. 验证用户认证状态
|
||
|
|
3. 检查页面访问权限
|
||
|
|
4. 设置页面标题
|
||
|
|
5. 处理布局配置
|
||
|
|
6. 执行路由跳转
|
||
|
|
```
|
||
|
|
|
||
|
|
### 5. API 架构 (src/common/apis/)
|
||
|
|
|
||
|
|
#### API 模块化组织
|
||
|
|
```
|
||
|
|
apis/
|
||
|
|
├── users/ # 用户相关接口
|
||
|
|
│ ├── index.ts # 接口方法
|
||
|
|
│ └── type.ts # 类型定义
|
||
|
|
├── shop/ # 店铺相关接口
|
||
|
|
├── cabinet/ # 柜机相关接口
|
||
|
|
├── approval/ # 审批相关接口
|
||
|
|
└── ab98/ # AB98系统接口
|
||
|
|
```
|
||
|
|
|
||
|
|
#### HTTP 客户端架构
|
||
|
|
```typescript
|
||
|
|
// Axios 配置层次
|
||
|
|
1. 创建实例配置
|
||
|
|
2. 请求拦截器 (添加 Token 等)
|
||
|
|
3. 响应拦截器 (统一错误处理)
|
||
|
|
4. 业务状态码处理
|
||
|
|
5. 全局错误处理
|
||
|
|
```
|
||
|
|
|
||
|
|
### 6. 工具函数架构 (src/common/utils/)
|
||
|
|
|
||
|
|
#### 工具模块分类
|
||
|
|
```
|
||
|
|
utils/
|
||
|
|
├── cache/ # 缓存工具
|
||
|
|
│ ├── cookies.ts # Cookie 操作
|
||
|
|
│ └── local-storage.ts # 本地存储
|
||
|
|
├── permission.ts # 权限工具
|
||
|
|
├── wx.ts # 微信工具
|
||
|
|
├── validate.ts # 验证工具
|
||
|
|
└── datetime.ts # 日期时间工具
|
||
|
|
```
|
||
|
|
|
||
|
|
### 7. 组合式函数架构 (src/common/composables/)
|
||
|
|
|
||
|
|
#### 可复用逻辑
|
||
|
|
```typescript
|
||
|
|
// 组合式函数设计模式
|
||
|
|
export function useXxx() {
|
||
|
|
// 1. 响应式状态
|
||
|
|
const state = ref(initialValue);
|
||
|
|
|
||
|
|
// 2. 操作方法
|
||
|
|
const action = () => {
|
||
|
|
// 业务逻辑
|
||
|
|
};
|
||
|
|
|
||
|
|
// 3. 生命周期
|
||
|
|
onMounted(() => {
|
||
|
|
// 初始化逻辑
|
||
|
|
});
|
||
|
|
|
||
|
|
// 4. 返回暴露的 API
|
||
|
|
return { state, action };
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
## 数据流架构
|
||
|
|
|
||
|
|
### 1. 组件间通信
|
||
|
|
|
||
|
|
#### Props/Emits (父子组件)
|
||
|
|
```vue
|
||
|
|
<!-- 父组件 -->
|
||
|
|
<ChildComponent
|
||
|
|
:title="parentTitle"
|
||
|
|
@update:title="handleTitleUpdate"
|
||
|
|
/>
|
||
|
|
|
||
|
|
<!-- 子组件 -->
|
||
|
|
<script setup lang="ts">
|
||
|
|
const props = defineProps<{ title: string }>();
|
||
|
|
const emit = defineEmits<{ 'update:title': [value: string] }>();
|
||
|
|
</script>
|
||
|
|
```
|
||
|
|
|
||
|
|
#### Provide/Inject (跨层级组件)
|
||
|
|
```typescript
|
||
|
|
// 祖先组件
|
||
|
|
const theme = ref('light');
|
||
|
|
provide('theme', theme);
|
||
|
|
|
||
|
|
// 后代组件
|
||
|
|
const theme = inject<Ref<string>>('theme');
|
||
|
|
```
|
||
|
|
|
||
|
|
#### Pinia Store (全局状态)
|
||
|
|
```typescript
|
||
|
|
// 在任何组件中使用
|
||
|
|
const userStore = useUserStore();
|
||
|
|
const { token, username } = storeToRefs(userStore);
|
||
|
|
```
|
||
|
|
|
||
|
|
### 2. API 数据流
|
||
|
|
|
||
|
|
#### 数据获取流程
|
||
|
|
```typescript
|
||
|
|
// 1. 组件触发 Action
|
||
|
|
const productStore = useProductStore();
|
||
|
|
|
||
|
|
// 2. Store 调用 API
|
||
|
|
const fetchProducts = async () => {
|
||
|
|
loading.value = true;
|
||
|
|
try {
|
||
|
|
const response = await getProductListApi();
|
||
|
|
if (response.code === 0) {
|
||
|
|
products.value = response.data.products;
|
||
|
|
}
|
||
|
|
} finally {
|
||
|
|
loading.value = false;
|
||
|
|
}
|
||
|
|
};
|
||
|
|
|
||
|
|
// 3. 组件监听状态变化
|
||
|
|
watchEffect(() => {
|
||
|
|
if (productStore.products.length > 0) {
|
||
|
|
// 更新 UI
|
||
|
|
}
|
||
|
|
});
|
||
|
|
```
|
||
|
|
|
||
|
|
### 3. 用户交互流程
|
||
|
|
|
||
|
|
#### 典型用户操作流程
|
||
|
|
```
|
||
|
|
用户打开应用
|
||
|
|
↓
|
||
|
|
微信认证处理
|
||
|
|
↓
|
||
|
|
获取用户信息
|
||
|
|
↓
|
||
|
|
显示商品列表
|
||
|
|
↓
|
||
|
|
用户选择商品
|
||
|
|
↓
|
||
|
|
加入购物车
|
||
|
|
↓
|
||
|
|
创建订单
|
||
|
|
↓
|
||
|
|
支付结算
|
||
|
|
↓
|
||
|
|
订单完成
|
||
|
|
```
|
||
|
|
|
||
|
|
## 安全架构
|
||
|
|
|
||
|
|
### 1. 认证机制
|
||
|
|
|
||
|
|
#### 微信 OAuth2.0 认证流程
|
||
|
|
```typescript
|
||
|
|
// 微信认证流程
|
||
|
|
1. 重定向到微信授权页面
|
||
|
|
2. 用户授权后返回 code
|
||
|
|
3. 使用 code 换取 access_token
|
||
|
|
4. 获取用户 OpenID
|
||
|
|
5. 验证用户权限
|
||
|
|
6. 生成应用内 Token
|
||
|
|
```
|
||
|
|
|
||
|
|
#### Token 管理
|
||
|
|
```typescript
|
||
|
|
// Token 存储策略
|
||
|
|
1. HTTP Only Cookie 存储
|
||
|
|
2. 自动续期机制
|
||
|
|
3. 安全退出清理
|
||
|
|
4. 跨域请求携带
|
||
|
|
```
|
||
|
|
|
||
|
|
### 2. 权限控制
|
||
|
|
|
||
|
|
#### 路由级权限
|
||
|
|
```typescript
|
||
|
|
// 路由守卫权限检查
|
||
|
|
const hasPermission = (route: RouteLocationNormalized) => {
|
||
|
|
if (route.meta?.requiresAuth && !isAuthenticated) {
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
if (route.meta?.roles && !hasRole(route.meta.roles)) {
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
return true;
|
||
|
|
};
|
||
|
|
```
|
||
|
|
|
||
|
|
#### 组件级权限
|
||
|
|
```vue
|
||
|
|
<!-- 权限指令使用 -->
|
||
|
|
<button v-permission="['admin']">管理员操作</button>
|
||
|
|
```
|
||
|
|
|
||
|
|
### 3. 数据安全
|
||
|
|
|
||
|
|
#### 敏感信息保护
|
||
|
|
```typescript
|
||
|
|
// 本地存储加密
|
||
|
|
const encryptData = (data: string) => {
|
||
|
|
return btoa(encodeURIComponent(data));
|
||
|
|
};
|
||
|
|
|
||
|
|
const decryptData = (encrypted: string) => {
|
||
|
|
return decodeURIComponent(atob(encrypted));
|
||
|
|
};
|
||
|
|
```
|
||
|
|
|
||
|
|
## 性能架构
|
||
|
|
|
||
|
|
### 1. 代码分割
|
||
|
|
|
||
|
|
#### 路由级懒加载
|
||
|
|
```typescript
|
||
|
|
// 动态导入组件
|
||
|
|
const ProductList = () => import('@/pages/product/ProductList.vue');
|
||
|
|
```
|
||
|
|
|
||
|
|
#### 第三方库分割
|
||
|
|
```typescript
|
||
|
|
// Vite 配置手动分块
|
||
|
|
manualChunks: {
|
||
|
|
vue: ['vue', 'vue-router', 'pinia']
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### 2. 缓存策略
|
||
|
|
|
||
|
|
#### 组件缓存
|
||
|
|
```vue
|
||
|
|
<!-- KeepAlive 缓存 -->
|
||
|
|
<router-view v-slot="{ Component }">
|
||
|
|
<keep-alive :include="cachedRoutes">
|
||
|
|
<component :is="Component" />
|
||
|
|
</keep-alive>
|
||
|
|
</router-view>
|
||
|
|
```
|
||
|
|
|
||
|
|
#### API 响应缓存
|
||
|
|
```typescript
|
||
|
|
// 接口数据缓存
|
||
|
|
const cache = new Map();
|
||
|
|
|
||
|
|
const getCachedData = async (key: string, fetcher: () => Promise<any>) => {
|
||
|
|
if (cache.has(key)) {
|
||
|
|
return cache.get(key);
|
||
|
|
}
|
||
|
|
const data = await fetcher();
|
||
|
|
cache.set(key, data);
|
||
|
|
return data;
|
||
|
|
};
|
||
|
|
```
|
||
|
|
|
||
|
|
### 3. 资源优化
|
||
|
|
|
||
|
|
#### 图片优化
|
||
|
|
```vue
|
||
|
|
<!-- 图片懒加载 -->
|
||
|
|
<img
|
||
|
|
:src="product.image"
|
||
|
|
loading="lazy"
|
||
|
|
:alt="product.name"
|
||
|
|
/>
|
||
|
|
```
|
||
|
|
|
||
|
|
#### CSS 优化
|
||
|
|
```css
|
||
|
|
/* UnoCSS 原子化类名 */
|
||
|
|
.un-p-4 { padding: 1rem; }
|
||
|
|
.un-bg-white { background-color: white; }
|
||
|
|
.un-rounded-lg { border-radius: 0.5rem; }
|
||
|
|
```
|
||
|
|
|
||
|
|
## 扩展性设计
|
||
|
|
|
||
|
|
### 1. 插件系统
|
||
|
|
|
||
|
|
#### 插件注册机制
|
||
|
|
```typescript
|
||
|
|
// 插件安装函数
|
||
|
|
export const installPlugins = (app: App) => {
|
||
|
|
// 注册全局组件
|
||
|
|
app.component('CustomComponent', CustomComponent);
|
||
|
|
|
||
|
|
// 注册自定义指令
|
||
|
|
app.directive('permission', permissionDirective);
|
||
|
|
|
||
|
|
// 注册全局属性
|
||
|
|
app.config.globalProperties.$utils = utils;
|
||
|
|
};
|
||
|
|
```
|
||
|
|
|
||
|
|
### 2. 配置系统
|
||
|
|
|
||
|
|
#### 环境配置
|
||
|
|
```typescript
|
||
|
|
// 多环境配置支持
|
||
|
|
const config = {
|
||
|
|
development: {
|
||
|
|
baseURL: 'http://localhost:3000',
|
||
|
|
debug: true
|
||
|
|
},
|
||
|
|
production: {
|
||
|
|
baseURL: 'https://api.example.com',
|
||
|
|
debug: false
|
||
|
|
}
|
||
|
|
};
|
||
|
|
```
|
||
|
|
|
||
|
|
### 3. 主题系统
|
||
|
|
|
||
|
|
#### 动态主题切换
|
||
|
|
```typescript
|
||
|
|
// 主题管理
|
||
|
|
const useTheme = () => {
|
||
|
|
const isDark = ref(false);
|
||
|
|
|
||
|
|
const toggleTheme = () => {
|
||
|
|
isDark.value = !isDark.value;
|
||
|
|
document.documentElement.classList.toggle('dark', isDark.value);
|
||
|
|
};
|
||
|
|
|
||
|
|
return { isDark, toggleTheme };
|
||
|
|
};
|
||
|
|
```
|
||
|
|
|
||
|
|
## 监控和调试
|
||
|
|
|
||
|
|
### 1. 开发工具
|
||
|
|
|
||
|
|
#### Vue DevTools 集成
|
||
|
|
```typescript
|
||
|
|
// 开发环境启用
|
||
|
|
if (import.meta.env.DEV) {
|
||
|
|
// 启用 Vue DevTools
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
#### 控制台调试
|
||
|
|
```typescript
|
||
|
|
// VConsole 移动端调试
|
||
|
|
import VConsole from 'vconsole';
|
||
|
|
|
||
|
|
if (import.meta.env.DEV) {
|
||
|
|
new VConsole();
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### 2. 错误监控
|
||
|
|
|
||
|
|
#### 全局错误处理
|
||
|
|
```typescript
|
||
|
|
// Vue 错误处理
|
||
|
|
app.config.errorHandler = (err, instance, info) => {
|
||
|
|
console.error('Vue 错误:', err, info);
|
||
|
|
// 发送错误报告
|
||
|
|
};
|
||
|
|
|
||
|
|
// 未处理 Promise 拒绝
|
||
|
|
window.addEventListener('unhandledrejection', (event) => {
|
||
|
|
console.error('未处理的 Promise 拒绝:', event.reason);
|
||
|
|
});
|
||
|
|
```
|
||
|
|
|
||
|
|
## 部署架构
|
||
|
|
|
||
|
|
### 1. 构建优化
|
||
|
|
|
||
|
|
#### 生产环境构建
|
||
|
|
```typescript
|
||
|
|
// Vite 生产配置
|
||
|
|
build: {
|
||
|
|
rollupOptions: {
|
||
|
|
output: {
|
||
|
|
manualChunks: {
|
||
|
|
vue: ['vue', 'vue-router', 'pinia']
|
||
|
|
}
|
||
|
|
}
|
||
|
|
},
|
||
|
|
reportCompressedSize: false,
|
||
|
|
chunkSizeWarningLimit: 2048
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### 2. CDN 部署
|
||
|
|
|
||
|
|
#### 静态资源优化
|
||
|
|
```typescript
|
||
|
|
// 静态资源 CDN 配置
|
||
|
|
base: process.env.NODE_ENV === 'production'
|
||
|
|
? 'https://cdn.example.com/mobvue/'
|
||
|
|
: '/'
|
||
|
|
```
|
||
|
|
|
||
|
|
## 总结
|
||
|
|
|
||
|
|
MobVue 采用现代化的前端架构设计,具备以下特点:
|
||
|
|
|
||
|
|
1. **模块化设计**: 清晰的模块边界和职责分离
|
||
|
|
2. **类型安全**: 全面的 TypeScript 支持
|
||
|
|
3. **状态管理**: 集中式的状态管理方案
|
||
|
|
4. **性能优化**: 多层次的性能优化策略
|
||
|
|
5. **安全可靠**: 完善的安全机制和错误处理
|
||
|
|
6. **可扩展性**: 灵活的插件和配置系统
|
||
|
|
7. **开发体验**: 优秀的开发工具和调试支持
|
||
|
|
|
||
|
|
这种架构设计确保了项目的可维护性、可扩展性和高性能,为移动端 H5 应用开发提供了坚实的基础。
|