建材商城系统20241014
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.

385 lines
8.0 KiB

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