推拿小程序前端代码仓库
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.

417 lines
9.4 KiB

3 months ago
3 months 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. - productItem.vue: 商品列表项
  227. **使用示例:**
  228. ```html
  229. <template>
  230. <view>
  231. <navbar title="商品列表" />
  232. <product-item
  233. v-for="item in list"
  234. :key="item.id"
  235. :product="item"
  236. />
  237. </view>
  238. </template>
  239. ```
  240. #### 3.3 OSS上传模块
  241. **配置说明:**
  242. 项目使用阿里云OSS进行文件存储,相关配置位于config.js中:
  243. **使用示例:**
  244. 1. 单文件上传
  245. ```javascript
  246. export default {
  247. methods: {
  248. onUpload(file) {
  249. this.$Oss.ossUpload(file.path).then(url => {
  250. this.filePath = url
  251. })
  252. }
  253. }
  254. }
  255. ```
  256. 2. 在uv-upload组件中使用
  257. ```html
  258. <template>
  259. <uv-upload
  260. :fileList="fileList"
  261. @afterRead="afterRead"
  262. @delete="deleteImage"
  263. name="1"
  264. multiple
  265. :maxCount="maxCount"
  266. ></uv-upload>
  267. </template>
  268. <script>
  269. export default {
  270. data() {
  271. return {
  272. fileList: [],
  273. maxCount: 9
  274. }
  275. },
  276. methods: {
  277. // 新增图片
  278. afterRead(e) {
  279. e.file.forEach(file => {
  280. this.$Oss.ossUpload(file.url).then(url => {
  281. this.fileList.push({
  282. url
  283. })
  284. })
  285. })
  286. },
  287. // 删除图片
  288. deleteImage(e) {
  289. this.fileList.splice(e.index, 1)
  290. },
  291. }
  292. }
  293. </script>
  294. ```
  295. **注意事项:**
  296. 1. 上传前请确保OSS配置正确
  297. 2. 建议对上传文件大小进行限制
  298. 3. 支持的文件类型:图片、视频、文档等
  299. 4. 上传失败时会抛出异常,请做好错误处理
  300. ## 最佳实践
  301. ### 1. 列表页面开发
  302. ```javascript
  303. // pages/product/list.vue
  304. import listMixin from '@/mixins/list.js'
  305. export default {
  306. mixins: [listMixin],
  307. data() {
  308. return {
  309. mixinsListApi: 'productList',
  310. }
  311. },
  312. methods: {
  313. // 分类切换
  314. onCategoryChange(categoryId) {
  315. this.queryParams.categoryId = categoryId
  316. this.getData()
  317. }
  318. }
  319. }
  320. ```
  321. ### 2. 详情页面开发
  322. ```javascript
  323. // pages/product/detail.vue
  324. import configMixin from '@/mixins/configList.js'
  325. export default {
  326. mixins: [configMixin],
  327. data() {
  328. return {
  329. productId: '',
  330. detail: {}
  331. }
  332. },
  333. onLoad(options) {
  334. this.productId = options.id
  335. this.getDetail()
  336. },
  337. methods: {
  338. getDetail() {
  339. this.$api('productDetail', {
  340. id: this.productId
  341. }, res => {
  342. this.detail = res.result
  343. // 设置分享信息
  344. this.Gshare.title = this.detail.name
  345. this.Gshare.path = `/pages/product/detail?id=${this.productId}`
  346. })
  347. }
  348. }
  349. }
  350. ```
  351. ## 注意事项
  352. 1. 使用mixins时注意命名冲突
  353. 2. API调用建议统一使用this.$api方式
  354. 3. 页面开发建议继承相应的混入来复用通用功能
  355. ## 常见问题
  356. 1. 列表加载失败
  357. - 检查mixinsListApi是否正确配置
  358. - 确认网络请求是否正常
  359. - 查看请求参数格式是否正确