|
|
1 week geleden | |
|---|---|---|
| .hbuilderx | 2 maanden geleden | |
| api | 1 week geleden | |
| components | 1 week geleden | |
| hooks | 2 maanden geleden | |
| node_modules | 2 maanden geleden | |
| pages | 1 week geleden | |
| settings | 1 week geleden | |
| static | 2 weken geleden | |
| store | 1 maand geleden | |
| uni_modules | 1 maand geleden | |
| unpackage | 2 maanden geleden | |
| utils | 1 week geleden | |
| .gitignore | 2 maanden geleden | |
| App.vue | 1 week geleden | |
| README.md | 2 maanden geleden | |
| index.html | 2 maanden geleden | |
| initConfig.js | 2 maanden geleden | |
| main.js | 2 maanden geleden | |
| manifest.json | 1 maand geleden | |
| package.json | 2 maanden geleden | |
| pages.json | 2 weken geleden | |
| project.config.json | 1 maand geleden | |
| project.private.config.json | 1 maand geleden | |
| routeInterceptor.js | 1 maand geleden | |
| uni.scss | 2 maanden geleden | |
| yarn.lock | 2 maanden geleden |
基于 uni-app 框架开发的微信点餐小程序,使用 Vue 3 + Pinia 构建。
这是一个功能完善的微信点餐小程序,提供完整的点餐流程,包括菜品浏览、购物车管理、优惠券使用、订单确认等功能。项目采用现代化的前端技术栈,代码结构清晰,易于维护和扩展。
@vueuse/core: Vue Composition API 工具库dayjs: 日期处理库lodash-es: JavaScript 工具库uqrcodejs: 二维码生成库WechatApp/
├── api/ # API 接口定义
│ ├── index.js # 通用接口
│ ├── dining.js # 点餐相关接口
│ └── login.js # 登录相关接口
├── components/ # 公共组件
│ ├── Modal/ # 弹窗组件
│ │ ├── BasicModal.vue
│ │ └── ScrollPopup.vue
│ ├── NavBar/ # 导航栏组件
│ │ ├── index.vue
│ │ └── StatusBar.vue
│ ├── Share/ # 分享组件
│ │ ├── hook.js
│ │ └── ShareBtn.vue
│ ├── TabBar.vue # 底部导航栏(首页/扫码点餐/我的)
│ └── Upload/ # 文件上传组件
│ ├── index.vue
│ └── upload.js
├── hooks/ # 自定义 Hooks
│ ├── libs/ # 第三方库
│ │ └── qqmap-wx-jssdk.min.js # 腾讯地图 SDK
│ └── usePay.js # 支付相关 Hook
├── pages/ # 页面目录
│ ├── index/ # 首页(菜品展示)
│ │ └── index.vue
│ ├── numberOfDiners/ # 扫码点餐(选择就餐人数)
│ │ └── index.vue
│ ├── orderFood/ # 点餐页面
│ │ ├── index.vue
│ │ └── components/ # 点餐相关组件
│ │ ├── FoodCard.vue # 菜品卡片
│ │ ├── BottomActionBar.vue # 底部操作栏
│ │ ├── CartModal.vue # 购物车弹窗
│ │ ├── CouponModal.vue # 优惠券弹窗
│ │ └── SelectCouponModal.vue # 选择优惠券弹窗
│ ├── foodDetail/ # 菜品详情页
│ │ └── index.vue
│ ├── placeOrder/ # 确认订单页
│ │ └── index.vue
│ ├── result/ # 订单结果页
│ │ └── index.vue
│ ├── personal/ # 个人中心
│ │ ├── index.vue # 个人中心首页
│ │ ├── userInfo.vue # 个人信息
│ │ └── setPhone.vue # 设置手机号
│ ├── webview/ # WebView 页面
│ │ └── index.vue
│ └── components/ # 页面级组件
│ └── LoginModal.vue # 登录弹窗
├── settings/ # 配置文件
│ ├── enums.js # 枚举常量(存储键名等)
│ └── siteSetting.js # 站点配置(API地址、CDN地址等)
├── store/ # 状态管理(Pinia)
│ ├── app.js # 应用状态
│ └── user.js # 用户状态(登录、用户信息等)
├── utils/ # 工具函数
│ ├── index.js # 工具函数入口
│ ├── request.js # HTTP 请求封装
│ ├── utils.js # 通用工具函数
│ ├── share.js # 分享工具
│ ├── file.js # 文件处理(CDN地址处理等)
│ ├── is.js # 类型判断工具
│ └── uuid.js # UUID 生成
├── static/ # 静态资源
│ └── img/ # 图片资源
│ ├── tabbar/ # 底部导航图标
│ └── orderFood/ # 点餐相关图片
├── uni_modules/ # uni-app 插件模块
│ ├── uni-popup/ # 弹窗组件
│ ├── uni-scss/ # 样式工具
│ └── uni-transition/ # 过渡动画
├── App.vue # 应用入口(全局样式、生命周期)
├── main.js # 主入口文件(应用初始化)
├── initConfig.js # 初始化配置(版本更新检测等)
├── routeInterceptor.js # 路由拦截器(登录验证)
├── pages.json # 页面路由配置
├── manifest.json # 应用配置文件(AppID、权限等)
└── uni.scss # 全局样式变量
# 使用 yarn
yarn install
# 或使用 npm
npm install
或使用命令行:
# 开发环境
npm run dev:mp-weixin
# 生产构建
npm run build:mp-weixin
manifest.json)wxc9598c736783dfa9(当前配置)1.0.0 (versionName) / 100 (versionCode)scope.userLocation: 位置信息权限scope.record: 录音权限urlCheck: false(开发环境可关闭域名校验)在 settings/siteSetting.js 中配置 API 基础地址:
// 开发环境 / 生产环境 API 地址
export const BASE_API_URL = process.env.NODE_ENV === 'development'
? 'http://192.168.1.91:8000/aliendining'
: 'http://192.168.1.91:8000/aliendining';
// 文件上传地址
export const UPLOAD_URL = 'https://api.xxxxxx.cn/File/UploadImg';
// CDN 地址
export const DEFAULT_CDN_URL = 'https://alien-volume.oss-cn-beijing.aliyuncs.com/';
export const UPLOAD = 'https://alien-volume.oss-cn-beijing.aliyuncs.com/';
在 manifest.json 的 h5.sdkConfigs.maps.qqmap 中配置地图 Key(仅 H5 端使用):
{
"h5": {
"sdkConfigs": {
"maps": {
"qqmap": {
"key": ""
}
}
}
}
}
pages.json)主要页面路由:
/pages/index/index - 首页/pages/numberOfDiners/index - 扫码点餐(选择人数)/pages/orderFood/index - 点餐页面/pages/foodDetail/index - 菜品详情/pages/placeOrder/index - 确认订单/pages/result/index - 订单结果/pages/personal/index - 个人中心/pages/personal/userInfo - 个人信息/pages/personal/setPhone - 设置手机号/pages/webview/index - WebView 页面routeInterceptor.js)自动拦截需要登录的页面访问,未登录用户将被引导至登录页,登录成功后自动跳转回原页面。
拦截的路由方法:
uni.navigateTouni.reLaunchuni.redirectTo需要登录的页面列表(在 routeInterceptor.js 中配置)
工作原理:
REDIRECT_KEY 读取原目标地址并跳转utils/request.js)统一的 HTTP 请求处理类,提供以下特性:
请求配置选项:
{
url: string, // 请求路径(相对路径)
params: object, // 请求参数
headers: object, // 自定义请求头
loading: boolean, // 是否显示 loading(默认 true)
timeout: number, // 超时时间(默认 180000ms)
returnResponse: boolean, // 是否返回原生响应(默认 false)
message: boolean, // 是否显示消息提示(默认 true)
hideErrorModal: boolean, // 是否隐藏错误弹窗(默认 false)
customizeUrl: string // 自定义完整 URL
}
响应码处理:
code: 200 - 成功,返回 data 字段code: 400 - 系统异常,弹出错误提示hideErrorModal 决定是否弹出错误提示使用示例:
import { api } from '@/utils/request.js';
// GET 请求
const userInfo = await api.get({
url: '/api/user/info',
params: { id: 1 }
});
// POST 请求
const result = await api.post({
url: '/api/user/update',
params: { name: 'test' },
loading: true, // 显示 loading
hideErrorModal: false // 显示错误弹窗
});
// 静默请求(不显示 loading 和错误提示)
const data = await api.get({
url: '/api/check',
loading: false,
hideErrorModal: true
});
store/user.js)用户状态管理 Store(基于 Pinia),提供以下功能:
uni.setStorageSync)State:
{
userInfo: null, // 用户信息对象
token: undefined, // 用户 token
siteId: undefined, // 站点 ID
openId: undefined // 微信 OpenId
}
Getters:
getUserInfo - 获取用户信息(优先内存,其次本地存储)getToken - 获取 tokengetOpenId - 获取 OpenIdActions:
setUserInfo(e) - 设置用户信息login(e) - 登录(保存用户信息、token、siteId,显示成功提示)beforeLogout() - 退出前确认logout(option) - 退出登录(清除存储,可配置是否跳转首页)使用示例:
import { useUserStore } from '@/store/user.js';
const userStore = useUserStore();
// 获取用户信息
const userInfo = userStore.getUserInfo;
// 获取 token
const token = userStore.getToken;
// 登录
userStore.login({
token: 'xxx',
siteId: 'xxx',
...userData
});
// 退出登录(带确认)
userStore.beforeLogout();
// 直接退出(不确认)
userStore.logout({ redirct: true });
initConfig.js)应用启动时的初始化逻辑(在 App.vue 的 onLaunch 中调用):
功能:
uni.getUpdateManager() 检测小程序更新
更新流程:
启动 → 检测网络 → 检测更新 → 下载更新 → 提示重启 → 应用更新
注意事项:
#ifdef MP-WEIXIN)项目使用 SCSS,全局样式定义在 App.vue 和 uni.scss 中。
.flex: Flex 布局.flex-center: 水平垂直居中.flex-between: 两端对齐.ellipsis: 单行省略.ellipsis-2: 两行省略(支持 2-10 行).safe-area: 底部安全区适配pages/index/index)pages/numberOfDiners/index)pages/orderFood/index)FoodCard: 菜品卡片BottomActionBar: 底部操作栏CartModal: 购物车弹窗CouponModal: 优惠券弹窗SelectCouponModal: 选择优惠券弹窗pages/foodDetail/index)pages/placeOrder/index)pages/result/index)pages/personal/index)pages/personal/userInfo)pages/personal/setPhone)pages/webview/index)pages/components/LoginModal.vue)uni-app 官方弹窗组件,用于各种弹窗场景。
安装: 通过 uni_modules 自动安装
使用:
<uni-popup ref="popup" type="bottom">
<view>弹窗内容</view>
</uni-popup>
uni-app 官方样式工具库,提供统一的样式变量和工具类。
uni-app 官方过渡动画组件,用于页面和组件过渡效果。
@dcloudio/uni-ui: uni-app UI 组件库@vueuse/core: Vue Composition API 工具库(Vue 3 版本)dayjs: 轻量级日期处理库lodash-es: JavaScript 工具库(ES 模块版本)uqrcodejs: 二维码生成库项目使用 HBuilderX 或 Vite 进行构建,具体构建工具根据开发环境而定。
<script setup>)FoodCard.vue)userInfo.vue)utils 目录api 目录components 目录components 目录.flex, .ellipsis 等)scoped建议使用约定式提交(Conventional Commits):
feat: 新功能fix: 修复 bugdocs: 文档更新style: 代码格式调整(不影响代码运行)refactor: 代码重构perf: 性能优化test: 测试相关chore: 构建/工具相关revert: 回滚提交示例:
feat: 添加优惠券选择功能
fix: 修复购物车数量计算错误
docs: 更新 README 文档
style: 调整菜品卡片样式
refactor: 重构请求封装代码
提交代码前请检查:
问题: 小程序如何检测和更新版本?
解答:
initConfig.js 中实现uni.getUpdateManager() API问题: 如何判断用户是否已登录?
解答:
useUserStore().getToken 获取 token问题: 网络请求失败时如何处理?
解答:
问题: 如何正确加载静态图片?
解答:
getFileUrl() 工具函数处理图片路径getFileUrl('img/tabbar/index1.png')问题: 为什么底部导航栏不显示?
解答:
TabBar 组件TabBar 组件的 fixed 属性设置问题: 为什么跳转到某些页面会被拦截?
解答:
routeInterceptor.js 的 loginList 中问题: 如何修改 API 请求地址?
解答:
settings/siteSetting.js 中的 BASE_API_URLprocess.env.NODE_ENV 区分开发/生产环境问题: 在微信开发者工具中运行报错?
解答:
manifest.json 中的 AppID 是否正确urlCheck: false 关闭域名校验问题: 为什么某些样式不生效?
解答:
问题: 如何管理本地存储数据?
解答:
uni.setStorageSync 和 uni.getStorageSyncsettings/enums.js 中项目支持通过环境变量配置不同环境:
NODE_ENV: 环境标识(development / production)settings/siteSetting.js 中配置)wxc9598c736783dfa9MIT License
欢迎提交 Issue 和 Pull Request。
git checkout -b feature/AmazingFeature)git commit -m 'feat: Add some AmazingFeature')git push origin feature/AmazingFeature)如有问题或建议,请联系项目维护者。
注意: