# 小程序开发指南 ## 版本历史 | 版本 | 日期 | 修改人 | 修改内容 | |------|------|--------|----------| | 1.0.0 | 2024-01-20 | 开发团队 | 初始版本 | ## 1. 小程序矩阵概述 ### 1.1 小程序架构 本项目采用多小程序架构,包含四个独立的小程序: - **员工小程序 (staff-mp)**: 内部员工使用,管理订单、质检、运输等 - **司机小程序 (driver-mp)**: 运输司机使用,管理运输任务和状态更新 - **供应商小程序 (supplier-mp)**: 供应商使用,管理订单接收和牛只信息 - **客户小程序 (client-mp)**: 客户使用,下单、查看订单状态等 ### 1.2 技术栈 - **框架**: uni-app (Vue3 + TypeScript) - **UI组件**: uView Plus - **状态管理**: Pinia - **HTTP请求**: uni.request 封装 - **构建工具**: Vite ## 2. 开发环境搭建 ### 2.1 工具安装 ```bash # 安装 HBuilderX (推荐) # 下载地址: https://www.dcloud.io/hbuilderx.html # 或使用 VS Code + uni-app 插件 # 安装 uni-app 插件 ``` ### 2.2 微信开发者工具 ```bash # 下载微信开发者工具 # 下载地址: https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html # 配置小程序 AppID # 在各小程序的 manifest.json 中配置对应的 AppID ``` ### 2.3 项目初始化 ```bash # 进入小程序目录 cd mini_program/staff-mp # 安装依赖 npm install # 启动开发服务器 npm run dev:mp-weixin ``` ## 3. 项目结构详解 ### 3.1 员工小程序 (staff-mp) ``` staff-mp/ ├── src/ │ ├── pages/ # 页面 │ │ ├── index/ # 首页 │ │ ├── order/ # 订单管理 │ │ │ ├── list.vue # 订单列表 │ │ │ ├── detail.vue # 订单详情 │ │ │ └── create.vue # 创建订单 │ │ ├── quality/ # 质检管理 │ │ ├── transport/ # 运输管理 │ │ └── profile/ # 个人中心 │ ├── components/ # 组件 │ │ ├── OrderCard.vue # 订单卡片 │ │ ├── QualityForm.vue # 质检表单 │ │ └── StatusBadge.vue # 状态标签 │ ├── api/ # API接口 │ │ ├── order.ts # 订单接口 │ │ ├── quality.ts # 质检接口 │ │ └── transport.ts # 运输接口 │ ├── stores/ # 状态管理 │ │ ├── user.ts # 用户状态 │ │ ├── order.ts # 订单状态 │ │ └── app.ts # 应用状态 │ ├── utils/ # 工具函数 │ │ ├── request.ts # 请求封装 │ │ ├── auth.ts # 认证工具 │ │ └── format.ts # 格式化工具 │ ├── static/ # 静态资源 │ ├── App.vue # 应用入口 │ ├── main.ts # 主文件 │ └── pages.json # 页面配置 ├── package.json └── tsconfig.json ``` ### 3.2 司机小程序 (driver-mp) ``` driver-mp/ ├── src/ │ ├── pages/ │ │ ├── index/ # 首页 │ │ ├── task/ # 运输任务 │ │ │ ├── list.vue # 任务列表 │ │ │ ├── detail.vue # 任务详情 │ │ │ └── track.vue # 运输跟踪 │ │ ├── vehicle/ # 车辆管理 │ │ └── profile/ # 个人中心 │ └── ... ``` ### 3.3 供应商小程序 (supplier-mp) ``` supplier-mp/ ├── src/ │ ├── pages/ │ │ ├── index/ # 首页 │ │ ├── order/ # 订单管理 │ │ ├── cattle/ # 牛只管理 │ │ └── profile/ # 个人中心 │ └── ... ``` ### 3.4 客户小程序 (client-mp) ``` client-mp/ ├── src/ │ ├── pages/ │ │ ├── index/ # 首页 │ │ ├── order/ # 订单管理 │ │ ├── payment/ # 支付管理 │ │ └── profile/ # 个人中心 │ └── ... ``` ## 4. 开发规范 ### 4.1 页面开发规范 #### 4.1.1 页面结构 ```vue ``` #### 4.1.2 组件开发规范 ```vue ``` ### 4.2 API 调用规范 #### 4.2.1 请求封装 ```typescript // utils/request.ts import { useUserStore } from '@/stores/user' interface RequestOptions { url: string method?: 'GET' | 'POST' | 'PUT' | 'DELETE' data?: any header?: Record } export function request(options: RequestOptions): Promise { const userStore = useUserStore() return new Promise((resolve, reject) => { uni.request({ url: `${import.meta.env.VITE_API_BASE_URL}${options.url}`, method: options.method || 'GET', data: options.data, header: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${userStore.token}`, ...options.header }, success: (res) => { if (res.statusCode === 200) { resolve(res.data as T) } else { reject(new Error(`请求失败: ${res.statusCode}`)) } }, fail: (err) => { reject(err) } }) }) } ``` #### 4.2.2 API 接口定义 ```typescript // api/order.ts import { request } from '@/utils/request' export interface OrderListParams { page: number pageSize: number status?: string } export interface OrderInfo { id: string customerName: string status: string createTime: string // 其他字段... } // 获取订单列表 export function getOrderList(params: OrderListParams) { return request<{ list: OrderInfo[] total: number }>({ url: '/orders', method: 'GET', data: params }) } // 获取订单详情 export function getOrderDetail(id: string) { return request({ url: `/orders/${id}`, method: 'GET' }) } ``` ### 4.3 状态管理规范 ```typescript // stores/order.ts import { defineStore } from 'pinia' import { ref } from 'vue' import type { OrderInfo } from '@/api/order' export const useOrderStore = defineStore('order', () => { const orderList = ref([]) const currentOrder = ref(null) const loading = ref(false) // 获取订单列表 async function fetchOrderList(params: any) { loading.value = true try { const { getOrderList } = await import('@/api/order') const result = await getOrderList(params) orderList.value = result.list return result } finally { loading.value = false } } // 设置当前订单 function setCurrentOrder(order: OrderInfo) { currentOrder.value = order } return { orderList, currentOrder, loading, fetchOrderList, setCurrentOrder } }) ``` ## 5. 页面开发指南 ### 5.1 员工小程序页面 #### 5.1.1 订单管理页面 ```vue ``` #### 5.1.2 质检管理页面 ```vue ``` ### 5.2 司机小程序页面 #### 5.2.1 运输任务页面 ```vue ``` ## 6. 组件开发 ### 6.1 通用组件 #### 6.1.1 状态标签组件 ```vue ``` #### 6.1.2 订单卡片组件 ```vue ``` ## 7. 工具函数 ### 7.1 认证工具 ```typescript // utils/auth.ts import { useUserStore } from '@/stores/user' // 检查登录状态 export function checkAuth(): boolean { const userStore = useUserStore() return !!userStore.token } // 跳转到登录页 export function redirectToLogin() { uni.navigateTo({ url: '/pages/auth/login' }) } // 登出 export function logout() { const userStore = useUserStore() userStore.clearUserInfo() uni.reLaunch({ url: '/pages/auth/login' }) } // 微信登录 export function wxLogin(): Promise { return new Promise((resolve, reject) => { uni.login({ provider: 'weixin', success: (res) => { resolve(res.code) }, fail: (err) => { reject(err) } }) }) } ``` ### 7.2 格式化工具 ```typescript // utils/format.ts import dayjs from 'dayjs' // 格式化时间 export function formatTime(time: string | Date, format = 'YYYY-MM-DD HH:mm:ss'): string { return dayjs(time).format(format) } // 格式化金额 export function formatMoney(amount: number): string { return `¥${amount.toFixed(2)}` } // 格式化手机号 export function formatPhone(phone: string): string { return phone.replace(/(\d{3})\d{4}(\d{4})/, '$1****$2') } // 格式化文件大小 export function formatFileSize(size: number): string { if (size < 1024) { return `${size}B` } else if (size < 1024 * 1024) { return `${(size / 1024).toFixed(1)}KB` } else { return `${(size / (1024 * 1024)).toFixed(1)}MB` } } ``` ## 8. 调试与测试 ### 8.1 真机调试 ```bash # 生成预览二维码 npm run build:mp-weixin # 在微信开发者工具中预览 ``` ### 8.2 性能监控 ```typescript // utils/performance.ts export function trackPagePerformance(pageName: string) { const startTime = Date.now() return { end: () => { const endTime = Date.now() const duration = endTime - startTime console.log(`页面 ${pageName} 加载耗时: ${duration}ms`) // 上报性能数据 // reportPerformance(pageName, duration) } } } ``` ### 8.3 错误监控 ```typescript // utils/error.ts export function setupErrorHandler() { // 全局错误处理 uni.onError((error) => { console.error('小程序错误:', error) // 上报错误信息 // reportError(error) }) // 未处理的 Promise 错误 uni.onUnhandledRejection((event) => { console.error('未处理的 Promise 错误:', event.reason) // 上报错误信息 // reportError(event.reason) }) } ``` ## 9. 发布部署 ### 9.1 构建配置 ```json // package.json { "scripts": { "dev:mp-weixin": "uni -p mp-weixin", "build:mp-weixin": "uni build -p mp-weixin", "dev:h5": "uni -p h5", "build:h5": "uni build -p h5" } } ``` ### 9.2 发布流程 1. **代码检查** ```bash npm run lint npm run type-check ``` 2. **构建生产版本** ```bash npm run build:mp-weixin ``` 3. **上传代码** - 使用微信开发者工具上传代码 - 填写版本号和更新说明 4. **提交审核** - 在微信公众平台提交审核 - 等待审核通过后发布 ## 10. 常见问题 ### 10.1 开发问题 **Q: 小程序白屏问题** - 检查页面路径配置 - 查看控制台错误信息 - 确认组件引入是否正确 **Q: 网络请求失败** - 检查域名配置 - 确认 HTTPS 证书 - 查看请求参数格式 ### 10.2 性能问题 **Q: 页面加载慢** - 优化图片大小 - 减少组件层级 - 使用分包加载 **Q: 内存占用高** - 及时清理定时器 - 避免内存泄漏 - 优化数据结构 ## 11. 联系信息 - **小程序开发**: miniprogram-dev@company.com - **技术支持**: tech-support@company.com - **文档维护**: docs@company.com ## 相关文档 - [开发指南](./开发指南.md) - [产品需求文档](./产品需求文档.md) - [API接口文档](./API接口文档.md) - [测试指南](./测试指南.md)