[关闭]
@hotlp 2017-02-21T13:21:18.000000Z 字数 7366 阅读 780

加华海淘微信端开发总结

未分类


加华海淘微信端从11月中旬开始,到现在一个月有余,从开始的切图做页面到后面的取数据做模版,虽然比较费脑细胞的工作都是由导师完成的,但自己也算是完整的走了一遍电商项目的流程,得到了很多收获,简单的和大家交流下~

HTML

项目中使用了mui框架,很多小组件用起来十分方便~
mui的组件十分丰富,基本满足了搭建页面使用,详细用法见mui官方文档。

但是有一些坑也是亲自踩过才知道。。。最常见的就是和mui的自定义样式相关的问题。
比如:

列表~

img1

  1. <ul class="mui-table-view goods_cont">
  2. <li class="mui-table-view-cell">
  3. <a href="javascript:;" class="mui-navigate-right sku_selector_btn">
  4. <p class="l _title">已选</p>
  5. <p class="_text l"><span id="skuChoosed" class="main_c"></span></p>
  6. </a>
  7. </li>
  8. </ul>

img3

img4





在实现页面的过程中还要注意一些与pc端不同的地方,
比如:a标签的问题~

这种
此处输入图片的描述

和这种
此处输入图片的描述

一眼看去,a链接是加在 ‘此商品满10减11 去凑单’ 和 ‘去凑单’ 上的,
其实。。。








  1. <a href="#" class="add_on">
  2. <span class="add_on_icon">满减</span>
  3. <span class="main_c">此商品满10减11 去凑单></span>
  4. </a>

移动端的点击区域的控制十分重要,一般来说要大于44x44px,小了很容易误触,
此外,移动端的图片宽高一般都可以定死的,但是不建议直接定死在img标签上,错误图片替换会定义图片的宽高。

css

样式的公用十分重要,与pc端相比,移动端样式相近的地方会跟多一点,像商品列表,各种小标签什么的。所以~~提公用样式的时候要更加注意,长得差不多的地方,把共有的样式提出来,有差异的再单独定义,不要把极个别的地方用到的样式提出来,否则每次用都得再重新设置,会增加很多代码量。。。

雪碧图

加华海淘中没有引入其他的图标库,mui自带的用的也很少,各种小图标基本都是切图,切图,切图(不要问我为什么,我也不知道。。。)。
在移动端切雪碧图和pc端最关键的一点,图标间的距离。

pc端用px做单位,所以雪碧图切的挤一点也可以准确定位到相应的位置。
而在移动端,基本都是用rem做单位,用rem单位会产生‘小数像素’的问题:
http://www.tuicool.com/articles/euUbQjI
雪碧图如果切的很紧凑的话就会再该显示一个图标的地方显示一个半图标

而且包裹背景图元素的尺寸也要把握好,大小很合适的话雪碧图会被切掉一部分,要稍微大点。

另外,使用同一张雪碧图的元素应该有一个相同的类,和一个有规律的类,比如前端框架里的那种,这样更好维护。

js

js比较复杂的工作都由导师完成了,我基本是用轮子的那一个,不过还是有一些可以和大家交流的东西~

第一点:js方面很大一部分的工作是取数据展示数据的,虽然技术含量不会很高,但有时候还是很磨人的,比如结算页面,没有太多的业务逻辑:

  1. var a;
  2. a = {
  3. "data": {
  4. "mbrAddresses": {
  5. "id": 276,
  6. "status": 1,
  7. "provinceId": 100110,
  8. "cityId": 100430,
  9. "districtId": 100460,
  10. "provinceName": "山东",
  11. "cityName": "烟台市",
  12. "districtName": "莱山区",
  13. "address": "tonghelu26hao",
  14. "postCode": "000000",
  15. "contactName": "liwx",
  16. "contactTel": "18653559609",
  17. "contactTel2": ""
  18. },
  19. "key": "OLY9kxhwxpx6Ykh7GUeqzZ8",
  20. "order": {
  21. "memberId": 1,
  22. "preOrderings": [{
  23. "warehouse": {
  24. "warehouseId": 26,
  25. "warehouseName": "上海仓库",
  26. "warehouseTypeId": 16000091,
  27. "warehouseIconUrl": "upload/20161223/cb74abbd-3a0f-4e63-8373-d255d3f85cd7.jpg"
  28. },
  29. "skus": [{
  30. "cartItemId": 1410,
  31. "skuId": 403,
  32. "skuName": "KF80儿童雾霾口罩13片/盒 防雾霾防PM2.5防尘",
  33. "buyQty": 1,
  34. "skuPrice": 139,
  35. "skuPromoPrice": 139,
  36. "skuIconUrl": "upload/20161209/34427415-96d2-42eb-b1fd-711e15a53af7.jpg",
  37. "skuPropTextList": "13片",
  38. "goodsId": 362,
  39. "catId": 385,
  40. "brandId": 78,
  41. "spec": "1",
  42. "promos": [],
  43. "skuWeight": 0,
  44. "goodsWeight": 0,
  45. "skuVolumn": 0,
  46. "dlvTmplId": 59,
  47. "wareHouseType": 16000091,
  48. "taxTmplId": 2,
  49. "goodsTaxPrice": 17.1,
  50. "deliveryTaxPrice": 0,
  51. "goodsType": 0,
  52. "unitChineseName": "1",
  53. "goodsCashCoupinDiffAmount": 0,
  54. "goodsOrderPromoDiffAmount": 0,
  55. "maxWeightOrderPromo": null,
  56. "freeTax": false,
  57. "freeShipping": false,
  58. "totalPrice": 139
  59. }],
  60. "deliveryTypes": [{"id": 0, "name": "包邮"}],
  61. "memberRebates": null,
  62. "totalPrice": 139,
  63. "deliveryFeeAmount": 0,
  64. "cashCouponDiffAmount": 0,
  65. "orderPromoDiffAmount": 0,
  66. "remark": null,
  67. "invoiceTitle": null,
  68. "freeShippingSkuIds": [403],
  69. "deliveryTaxPrice": 0,
  70. "goodsTaxPrice": 17.1
  71. }, {
  72. "warehouse": {
  73. "warehouseId": 25,
  74. "warehouseName": "新加坡仓库",
  75. "warehouseTypeId": 16000092,
  76. "warehouseIconUrl": null
  77. },
  78. "skus": [{
  79. "cartItemId": 1409,
  80. "skuId": 448,
  81. "skuName": "爱茉莉 Amore白吕洗发水400ml+180ml 防脱发抗老化",
  82. "buyQty": 1,
  83. "skuPrice": 98,
  84. "skuPromoPrice": 98,
  85. "skuIconUrl": "upload/20161209/0e7c3add-9d3a-4559-86ed-374d61af4455.jpg",
  86. "skuPropTextList": "580ml",
  87. "goodsId": 404,
  88. "catId": 347,
  89. "brandId": 92,
  90. "spec": "1",
  91. "promos": [],
  92. "skuWeight": 0,
  93. "goodsWeight": 0,
  94. "skuVolumn": 0,
  95. "dlvTmplId": 60,
  96. "wareHouseType": 16000092,
  97. "taxTmplId": 2,
  98. "goodsTaxPrice": 12.05,
  99. "deliveryTaxPrice": 1.33,
  100. "goodsType": 0,
  101. "unitChineseName": "1",
  102. "goodsCashCoupinDiffAmount": 0,
  103. "goodsOrderPromoDiffAmount": 0,
  104. "maxWeightOrderPromo": null,
  105. "freeTax": false,
  106. "freeShipping": false,
  107. "totalPrice": 98
  108. }, {
  109. "cartItemId": 1377,
  110. "skuId": 431,
  111. "skuName": "泰国Mistine花漾印章腮红性感胭脂粉嫩裸妆防水持久不",
  112. "buyQty": 1,
  113. "skuPrice": 83,
  114. "skuPromoPrice": 83,
  115. "skuIconUrl": "upload/20161209/4c1bb50f-8a38-487c-b74f-33e5e58d194b.jpg",
  116. "skuPropTextList": "02",
  117. "goodsId": 388,
  118. "catId": 389,
  119. "brandId": 85,
  120. "spec": "1",
  121. "promos": [],
  122. "skuWeight": 0.6,
  123. "goodsWeight": 0.01,
  124. "skuVolumn": 0,
  125. "dlvTmplId": 60,
  126. "wareHouseType": 16000092,
  127. "taxTmplId": 2,
  128. "goodsTaxPrice": 10.21,
  129. "deliveryTaxPrice": 1.13,
  130. "goodsType": 0,
  131. "unitChineseName": "1",
  132. "goodsCashCoupinDiffAmount": 0,
  133. "goodsOrderPromoDiffAmount": 0,
  134. "maxWeightOrderPromo": null,
  135. "freeTax": false,
  136. "freeShipping": false,
  137. "totalPrice": 83
  138. }],
  139. "deliveryTypes": [{"id": 1, "name": "快递"}],
  140. "memberRebates": null,
  141. "totalPrice": 201,
  142. "deliveryFeeAmount": 20,
  143. "cashCouponDiffAmount": 0,
  144. "orderPromoDiffAmount": 0,
  145. "remark": null,
  146. "invoiceTitle": null,
  147. "freeShippingSkuIds": [],
  148. "deliveryTaxPrice": 2.46,
  149. "goodsTaxPrice": 22.26
  150. }],
  151. "memberRebates": null,
  152. "totalPrice": 381.82,
  153. "cashCoupons": [{
  154. "id": 0,
  155. "brandId": 0,
  156. "catId": 0,
  157. "goodsId": 0,
  158. "brandName": null,
  159. "catName": null,
  160. "goodsName": null,
  161. "orderMinAmount": 0,
  162. "amount": 0,
  163. "brandUrl": null,
  164. "couponName": null,
  165. "byAll": false,
  166. "byCat": false,
  167. "byGoods": false,
  168. "byBrand": false,
  169. "byShop": false,
  170. "freeTax": false,
  171. "all": false,
  172. "freeShipping": false
  173. }, {
  174. "id": 276,
  175. "brandId": 78,
  176. "catId": 0,
  177. "goodsId": 0,
  178. "brandName": "碧然德 BRITA",
  179. "catName": null,
  180. "goodsName": null,
  181. "orderMinAmount": 50,
  182. "amount": 10,
  183. "brandUrl": null,
  184. "couponName": null,
  185. "byAll": false,
  186. "byCat": false,
  187. "byGoods": false,
  188. "byBrand": true,
  189. "byShop": false,
  190. "freeTax": true,
  191. "all": false,
  192. "freeShipping": true
  193. }],
  194. "activeCashCoupon": {
  195. "id": 0,
  196. "brandId": 0,
  197. "catId": 0,
  198. "goodsId": 0,
  199. "brandName": null,
  200. "catName": null,
  201. "goodsName": null,
  202. "orderMinAmount": 0,
  203. "amount": 0,
  204. "brandUrl": null,
  205. "couponName": null,
  206. "byAll": false,
  207. "byCat": false,
  208. "byGoods": false,
  209. "byBrand": false,
  210. "byShop": false,
  211. "freeTax": false,
  212. "all": false,
  213. "freeShipping": false
  214. },
  215. "cashCouponDiffAmount": 0,
  216. "orderPromos": [],
  217. "freeShippingOrTaxPromos": [],
  218. "activePromo": null,
  219. "orderPromoDiffAmount": 0,
  220. "totalPromoPrice": 0,
  221. "deliveryFeeAmount": 20
  222. }
  223. }, "success": true
  224. };

这是返回的订单数据,虽然看起来很长很复杂,但是和后端沟通好,明确该取的字段后,剩下的就是并不复杂的数组对象for循环了。

看到数据结构后,就要开始做模版了,对网站这边的小伙伴们来说,这一部分的工作应该是技术来完成的,现在,全都自己做~之前做网站,最担心的就是要重新实现,改模版,现在,就不用担心了,因为你自己就是半个技术~

做模版有几个简单的套路,普通的取数据直接往html里塞,复杂点的上拉刷新的列表页,先组织组织数据,再把每一条数据再往html里塞,再复杂点的带业务逻辑的,比如购物车,商品详情等,能找个参考就借鉴一下,学习思路最重要。

先贴一个简单的模版:

  1. <div class="_top fix dataContent" id="sortList"></div>
  2. <#--分类item模板-->
  3. <script id="sortItem" type="text/html">
  4. <%for(i = 0; i < xData.length; i++){%>
  5. <div class="top_item pr l mui-col-xs-4">
  6. <a href="<%=vars.clientRoot%>/ec/goods/sub_sort.html?id=<%=xData[i].id%>">
  7. <h3 class="_tit mui-ellipsis"><%=xData[i].text%></h3>
  8. <p class="_info mui-ellipsis"><%=xData[i].remark%></p>
  9. <div class="item_img">
  10. <img src="<%=#imgFormat(xData[i].iconUrl, '210x168.png')%>"/>
  11. </div>
  12. </a>
  13. </div>
  14. <%}%>
  15. </script>
  1. getJson("/ec/goods/doSearchCatList.do",{},function showSortList(data){
  2. //console.log(data);
  3. data = {
  4. vars: vars,
  5. xData: data.data ? data.data : []
  6. };
  7. renderTmp("#sortList","sortItem",data);
  8. });

做模版用的是artTemplate,语法很简单,
<% %> 里面放js语句
<%= %> 转义输出
<%=# %> 原样输出

模版里,能用的js语句就是if和for,处理数据不要再模版里做,要在js中提前处理

公用方法:
开始项目之前,建议先看一下common中的公用方法。
1、取数据
getJson(url,param,success,error)

getWidgetData(widgetName,success,error)
取组件数据

2、渲染模版
renderTmp(selector,tmpId,data,callback)
取数据的回调中使用,默认追加元素方式是append,
也可以在callback中自己定义。

3、图片处理,集成了错误图片替换
imgFormat(url,format,isZip,notFortpl)
format 尺寸
isZip是否压缩,一般宽度是全屏宽的不用走拦截器
notForTpl,直接输出图片路径
调用的时候要加#防止转义
<%=#imgFormat(url,'.100x100.png')%>

4、时间格式化
dateFormat(date, format)
把日期整理成需要的格式,'yyyy-MM-dd hh:mm:ss'

5、金额格式化
moneyFormat(num, format)

6、表单格式化
formFormat(selector)

7、页面跳转处理
toNewPage(href,cantBack)
cantback,是否允许返回当前页面

a链接,图片src等基本绝对路径,
拼接路径时要注意一点

  1. <a href="<%=vars.clientRoot%>/bbs/bbs_view.html?id=<%=xData.threadId%>"></a>
  2. <div style="background-image: url(${vars.theme.root}/resources/images/center_top.jpg);"></div>

测试

测试的时候压力还是挺大的,测试的过程中一定要注意沟通,因为指派给你的不一定是个前台bug还是后台bug。。。改bug要按照严重程度改,先确保功能,再进行优化。

以上17/01/10
补充:
1、雪碧图 设置好background-size后,可以正常的background-position了,
尺寸大小为雪碧图实际大小,单位为rem

2、rem做单位,height和line-height相同时,安卓端不会垂直居中,ios会垂直居中。可以让line-height稍微小点

3、vars, 后台存的路径
4、模版里不要套模版,script和a标签一样,不能嵌套。可以在一个模版渲染完的回调里渲染另一个模版。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注