商城点单小程序前端代码仓库
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

411 lines
9.2 KiB

3 weeks ago
  1. # 商城项目文档
  2. ## 项目概述
  3. 本项目是一个基于uni-app开发的商城小程序,采用Vue框架开发,集成了完整的商城功能模块。
  4. ## 目录结构
  5. ```
  6. ├── api # API接口目录
  7. │ ├── api.js # API统一出口
  8. │ ├── http.js # HTTP请求封装
  9. │ └── model # 业务模块API
  10. ├── components # 公共组件
  11. ├── mixins # 混入文件
  12. ├── pages # 页面文件
  13. ├── static # 静态资源
  14. ├── store # Vuex状态管理
  15. ├── utils # 工具函数
  16. └── uni_modules # uni-app插件模块
  17. ```
  18. ## 分包结构说明
  19. ### pages_order分包
  20. 分包是小程序优化加载性能的重要手段,pages_order作为独立分包,包含以下模块:
  21. ```
  22. ├── auth # 认证相关页面
  23. │ ├── loginAndRegisterAndForgetPassword.vue # 登录注册
  24. │ ├── wxLogin.vue # 微信登录
  25. │ └── wxUserInfo.vue # 微信用户信息
  26. ├── components # 分包内公共组件
  27. │ ├── address/ # 地址选择组件
  28. │ ├── areaSelector/ # 区域选择器
  29. │ └── product/ # 商品相关组件
  30. ├── home # 首页相关
  31. │ ├── addEnterprise.vue # 添加企业
  32. │ ├── contact.vue # 联系我们
  33. │ ├── introduce.vue # 介绍页面
  34. │ ├── journalism.vue # 新闻资讯
  35. │ └── notice.vue # 公告
  36. ├── mine # 我的模块
  37. │ ├── address.vue # 收货地址
  38. │ ├── balance.vue # 余额
  39. │ ├── commission.vue # 佣金
  40. │ ├── coupon.vue # 优惠券
  41. │ ├── memberCenter.vue # 会员中心
  42. │ └── more... # 更多功能页面
  43. ├── order # 订单模块
  44. │ ├── createOrder.vue # 创建订单
  45. │ ├── orderDetail.vue # 订单详情
  46. │ └── giftList.vue # 礼品列表
  47. ├── product # 商品模块
  48. │ └── productDetail.vue # 商品详情
  49. └── static # 分包静态资源
  50. ├── address/ # 地址相关图片
  51. ├── auth/ # 认证相关图片
  52. ├── coupon/ # 优惠券图片
  53. └── more... # 其他静态资源
  54. ```
  55. **分包特点:**
  56. - 静态资源就近原则:分包相关的图片等静态资源存放在分包目录下,避免主包体积过大
  57. - 模块化组织:按功能模块划分目录,便于维护和管理
  58. - 组件复用:分包内的通用组件集中管理,提高代码复用性
  59. ## 配置文件说明
  60. ### config.js
  61. 项目核心配置文件,包含以下配置:
  62. **1. 环境配置**
  63. ```javascript
  64. // 当前环境
  65. const type = 'prod'
  66. // 环境配置
  67. const config = {
  68. dev: {
  69. baseUrl: 'http://h5.xzaiyp.top/jewelry-admin',
  70. },
  71. prod: {
  72. baseUrl: 'https://jewelry-admin.hhlm1688.com/jewelry-admin',
  73. }
  74. }
  75. ```
  76. **2. 默认配置**
  77. ```javascript
  78. const defaultConfig = {
  79. // 腾讯地图Key
  80. mapKey: 'XMBBZ-BCPCV-SXPPQ-5Y7MY-PHZXK-YFFVU',
  81. // 阿里云OSS配置
  82. aliOss: {
  83. url: 'https://image.hhlm1688.com/',
  84. config: {
  85. region: 'oss-cn-guangzhou',
  86. accessKeyId: '***',
  87. accessKeySecret: '***',
  88. bucket: 'hanhaiimage',
  89. endpoint: 'oss-cn-shenzhen.aliyuncs.com',
  90. }
  91. }
  92. }
  93. ```
  94. **3. UI框架配置**
  95. ```javascript
  96. uni.$uv.setConfig({
  97. config: {
  98. unit: 'rpx' // 设置默认单位
  99. },
  100. })
  101. // UI文档地址 https://www.uvui.cn/
  102. ```
  103. ## 核心模块详解
  104. ### 1. Mixins 混入
  105. #### 1.1 list.js - 列表数据加载混入
  106. 提供列表数据的加载、分页、下拉刷新、上拉加载更多等功能。
  107. **主要功能:**
  108. - 统一的分页参数处理
  109. - 下拉刷新和上拉加载更多
  110. - 数据加载状态管理
  111. **使用示例:**
  112. ```javascript
  113. // 在页面中使用list混入
  114. import listMixin from '@/mixins/list.js'
  115. export default {
  116. mixins: [listMixin],
  117. data() {
  118. return {
  119. // 指定API接口
  120. mixinsListApi: 'productList'
  121. }
  122. }
  123. }
  124. ```
  125. #### 1.2 configList.js - 全局配置混入
  126. 已全局引入的配置管理混入,无需手动引入即可使用。
  127. **主要功能:**
  128. - 统一的分享配置
  129. - 全局配置管理
  130. - 用户信息关联
  131. **配置参数:**
  132. ```javascript
  133. // 分享配置示例
  134. this.Gshare.title = '分享标题'
  135. this.Gshare.path = '分享路径'
  136. ```
  137. ### 2. API 模块
  138. #### 2.1 http.js - 请求封装
  139. 统一的HTTP请求处理,包含:
  140. - 请求拦截器
  141. - 响应拦截器
  142. - 统一的错误处理
  143. - Token管理
  144. #### 2.2 api.js - 接口管理
  145. 统一管理API接口,支持模块化组织。API模块采用分层结构,便于维护和扩展。
  146. **目录结构:**
  147. ```
  148. api/
  149. ├── api.js # API统一出口
  150. ├── http.js # HTTP请求封装
  151. └── model/ # 业务模块API
  152. ├── product.js # 商品相关接口
  153. ├── order.js # 订单相关接口
  154. └── user.js # 用户相关接口
  155. ```
  156. **接口定义示例:**
  157. ```javascript
  158. // api/model/product.js
  159. export default {
  160. // GET请求示例
  161. list: {
  162. url: '/api/product/list',
  163. method: 'GET',
  164. loading: true // 显示加载提示
  165. },
  166. // POST请求示例
  167. create: {
  168. url: '/api/product/create',
  169. method: 'POST',
  170. loading: true // 显示加载提示
  171. auth : true,//效验登录
  172. debounce : 1000,//接口防抖,1s
  173. limit : 500,//接口限流,0.5s
  174. },
  175. }
  176. ```
  177. **调用接口示例:**
  178. ```javascript
  179. // 第一种写法:callback方式处理响应
  180. this.$api('product.list', {
  181. pageNo: 1,
  182. pageSize: 10,
  183. categoryId: '123'
  184. }, res => {
  185. // 处理列表数据
  186. })
  187. // 第二种写法:Promise方式处理响应
  188. this.$api('product.create', {
  189. name: '商品名称',
  190. price: 99.99,
  191. description: '商品描述'
  192. }).then(res => {
  193. if (res.code === 200) {
  194. // 创建成功
  195. uni.showToast({ title: '创建成功' })
  196. }
  197. })
  198. ```
  199. ### 3. 公共代码
  200. #### 3.1 工具函数 (utils)
  201. - authorize.js: 授权处理
  202. - pay.js: 微信网页支付相关
  203. - utils.js: 通用工具函数
  204. - timeUtils.js: 时间处理
  205. - position.js: 定位与位置计算
  206. - oss-upload: 阿里云OSS上传模块
  207. **使用示例:**
  208. ```javascript
  209. // 授权处理
  210. async preservationImg(img) {
  211. await this.$authorize('scope.writePhotosAlbum')
  212. //在执行$authorize之后,await下面的代码都是确保授权完成的情况下执行
  213. },
  214. // 时间格式化
  215. const formattedTime = this.$timeUtils.formatTime(new Date())
  216. // 项目中在Vue集成了dayjs >>,可以直接使用
  217. // 在utils/index中Vue.prototype.$dayjs
  218. this.$dayjs()
  219. // 微信网页支付调用
  220. import { wxPay } from '@/utils/pay'
  221. wxPay(orderData)
  222. ```
  223. #### 3.2 公共组件
  224. - navbar.vue: 自定义导航栏
  225. - tabbar.vue: 底部导航栏
  226. **使用示例:**
  227. ```html
  228. <template>
  229. <view>
  230. <navbar title="商品列表" />
  231. </view>
  232. </template>
  233. ```
  234. #### 3.3 OSS上传模块
  235. **配置说明:**
  236. 项目使用阿里云OSS进行文件存储,相关配置位于config.js中:
  237. **使用示例:**
  238. 1. 单文件上传
  239. ```javascript
  240. export default {
  241. methods: {
  242. onUpload(file) {
  243. this.$Oss.ossUpload(file.path).then(url => {
  244. this.filePath = url
  245. })
  246. }
  247. }
  248. }
  249. ```
  250. 2. 在uv-upload组件中使用
  251. ```html
  252. <template>
  253. <uv-upload
  254. :fileList="fileList"
  255. @afterRead="afterRead"
  256. @delete="deleteImage"
  257. name="1"
  258. multiple
  259. :maxCount="maxCount"
  260. ></uv-upload>
  261. </template>
  262. <script>
  263. export default {
  264. data() {
  265. return {
  266. fileList: [],
  267. maxCount: 9
  268. }
  269. },
  270. methods: {
  271. // 新增图片
  272. afterRead(e) {
  273. e.file.forEach(file => {
  274. this.$Oss.ossUpload(file.url).then(url => {
  275. this.fileList.push({
  276. url
  277. })
  278. })
  279. })
  280. },
  281. // 删除图片
  282. deleteImage(e) {
  283. this.fileList.splice(e.index, 1)
  284. },
  285. }
  286. }
  287. </script>
  288. ```
  289. **注意事项:**
  290. 1. 上传前请确保OSS配置正确
  291. 2. 建议对上传文件大小进行限制
  292. 3. 支持的文件类型:图片、视频、文档等
  293. 4. 上传失败时会抛出异常,请做好错误处理
  294. ## 最佳实践
  295. ### 1. 列表页面开发
  296. ```javascript
  297. // pages/product/list.vue
  298. import listMixin from '@/mixins/list.js'
  299. export default {
  300. mixins: [listMixin],
  301. data() {
  302. return {
  303. mixinsListApi: 'productList',
  304. }
  305. },
  306. methods: {
  307. // 分类切换
  308. onCategoryChange(categoryId) {
  309. this.queryParams.categoryId = categoryId
  310. this.getData()
  311. }
  312. }
  313. }
  314. ```
  315. ### 2. 详情页面开发
  316. ```javascript
  317. // pages/product/detail.vue
  318. import configMixin from '@/mixins/configList.js'
  319. export default {
  320. mixins: [configMixin],
  321. data() {
  322. return {
  323. productId: '',
  324. detail: {}
  325. }
  326. },
  327. onLoad(options) {
  328. this.productId = options.id
  329. this.getDetail()
  330. },
  331. methods: {
  332. getDetail() {
  333. this.$api('productDetail', {
  334. id: this.productId
  335. }, res => {
  336. this.detail = res.result
  337. // 设置分享信息
  338. this.Gshare.title = this.detail.name
  339. this.Gshare.path = `/pages/product/detail?id=${this.productId}`
  340. })
  341. }
  342. }
  343. }
  344. ```
  345. ## 注意事项
  346. 1. 使用mixins时注意命名冲突
  347. 2. API调用建议统一使用this.$api方式
  348. 3. 页面开发建议继承相应的混入来复用通用功能
  349. ## 常见问题
  350. 1. 列表加载失败
  351. - 检查mixinsListApi是否正确配置
  352. - 确认网络请求是否正常
  353. - 查看请求参数格式是否正确