[关闭]
@zongwu 2017-06-15T11:01:05.000000Z 字数 3757 阅读 380

优惠券H5项目调整说明

内部资料


说明

优惠券项目(新)基于原生JS的MVC架构

项目内置的依赖项目有:
* 模板渲染引擎 --- nunjucks.js, 原先是template.js 废弃它的主要原因是它只支持对字符串的模板渲染。而 HTML本身缺乏类似于Node中 include 或 require 的能力,template.js不能切割模板文件,这会导致代码的可维护性与复用性均会有较大幅度的降低,故而采用nunjucks.js来避免该问题。
* 内置jquery.js
* 内置 require.js--- 用于模拟node暴露成员方法。

项目基于mvc框架,项目的目录分为:
* app/controller --- 控制器
* app/extend --- 存放扩展的js工具类 , 目前存放的 environment.js
* app/public --- 存放静态文件,诸如:css、image、第三方 js等资源
* app/service --- 存放网络请求类
* app/view/components --- 存放模板文件 此处的文件不允许通过链接直接访问
* app/view/ --- 存放html文件此处的文件允许通过链接访问(不包括components文件夹)
* app/router.js --- 路由管理类,因为原生不具备拦截href的能力,所以选择使用hash作路由管理。原则上页面中不允许出现非路由管理的操作,考虑到框架的易用性允许jquery.jsdom做简单的处理。复杂的逻辑一定要配置到controller中,并通过router管理!!!

项目结构调整

image_1bilk07l411fgfic1cc0174h7939.png-77.4kB

项目结构说明

image_1bill6trv8abfe1sbc12qs14j0m.png-86.7kB

框架约定

以展示优惠券首页的列表举例

配置路由 --- app/router.js

  1. Router.fn.extend({
  2. register: function () {
  3. // 配置访问路径:/home/coupon/list --> 指向控制器方法 home.coupon.list
  4. router.mapping('/home/coupon/list', 'home.coupon.list');
  5. },
  6. ajax: function (path, param) {
  7. if (router.contains(path))
  8. router.callbackImpl(path, param);
  9. else
  10. throw new Error('Must register router uri first before use.');
  11. },
  12. });

配置控制器 --- app/controller.js

  1. Controller.fn.extend({
  2. 'home.coupon.list': function () {
  3. // 通过require 函数拆分js模块 ,这样做的目的主要是为了工程化的管理。
  4. // 所以允许在这里编写一些“足够简单”的实现,比如:页面重定向。
  5. require('../controller/home/coupon.js').list();
  6. }
  7. });

配置控制器实现 --- app/controller/home/coupon.js

  1. require.register('../controller/home/coupon.js', function (module, exports, require) {
  2. // 首页 - 优惠券列表
  3. module.exports.list = function list() {
  4. // 检查登录态
  5. if (!window.iPuDong.checkLogin()) {
  6. window.location.href = 'wxRedirect.html';
  7. return;
  8. }
  9. var user = $._cookies_model.getUser();
  10. // 执行接口请求
  11. iPuDong.post({
  12. _api: 'pd.coupon.search',
  13. _v: '6.0',
  14. _se: user.getSessionId(),
  15. },
  16. '#id-coupon',// 成功情况下的容器id
  17. './components/coupon.html',// 成功情况下的渲染模板
  18. '#id-coupon',// 失败情况下容器id
  19. './components/dialog/warn.html');// 失败情况下的渲染模板
  20. };
  21. });

app/view/components

模板文件代码:

  1. {% for coupon in model %}
  2. {% if coupon.status == 0 %}<!--预热券-->
  3. {% include "/components/coupon/coupon-preheating.html" %}
  4. {% elif coupon.status == 1 %}<!--去领取-->
  5. {% include "/components/coupon/coupon-gain.html" %}
  6. {% elif coupon.status == 2 %}<!--请使用-->
  7. {% include "/components/coupon/coupon-use.html" %}
  8. {% elif coupon.status == 3 %}<!--已使用-->
  9. {% include "/components/coupon/coupon-used.html" %}
  10. {% elif coupon.status == 4 %}<!--已失效-->
  11. {% include "/components/coupon/coupon-lapsed.html" %}
  12. {% elif coupon.status == 5 %}<!--已结束-->
  13. {% include "/components/coupon/coupon-end.html" %}
  14. {% endif %}
  15. {% endfor %}

以上有6种模板情况,此下只列举一种作为示意:

  1. <div class="coupon-item coupon bg-postload"
  2. value={{coupon.status}}
  3. data-id={{coupon.id}}
  4. data-promoCode="{{coupon.promoCode}}"
  5. data-contain-img={{coupon.isProduct}}
  6. data-type={{coupon.category}}>
  7. <div class="content">
  8. <div class="title_info">
  9. <div class="price font-title-disable"><span>{{coupon.num}}</span></div>
  10. </div>
  11. <div class="linelapse"></div>
  12. <div class="down">
  13. <div class="left">
  14. <img src="{{coupon.couponIcon}}" width="64px" height="64px">
  15. </div>
  16. <div class="right">
  17. <div class="content_up">{{coupon.detail}}</div>
  18. <div class="content_down">{{coupon.productName}}</div>
  19. <div class="startTime">{{coupon.className}}</div>
  20. </div>
  21. </div>
  22. </div>
  23. <div class="icon-ended"></div>
  24. </div>

页面渲染完成

到这里页面就可以渲染出来了。这里有一些约定需要补充一下。

1)router下配置的页面uri,和控制器方法 要求一一对应。

  1. router.mapping('/home/coupon/list', 'home.coupon.list');
  2. // 所以这里是 /home/coupon/list --> home.coupon.list 而不是其它(比如:home.coupon.xxx)。

2)控制器的方法home.coupon.list要求与文件目录一一对应。

image_1bilm3vlk142f9koj84eim1ah313.png-116.3kB

说明 --- 配置路由时的参数传递

以显示某个优惠券的详情为例:

方法1,假设访问该页面的url如下:

http://www.domain.com/detail.html?couponId=232&status=2&isProduct=1

则下面 JS 代码表示 表示从url中获取参数并渲染该页面

  1. router.ajax('/home/coupon/detail', [{
  2. couponId: $._href.get('couponId'),
  3. userCouponId: $._href.get('userCouponId')
  4. }]);

方法2:访问以下连接同样可以渲染页面

http://www.domain.com/detail.html#/home/coupon/detail?couponId=232&status=2&isProduct=1

虽然看起来很多此一举,但在Ajax局部刷新时它会非常实用。


如下方代码:查看商品详情,对于 HTML 页面我的原则是尽量保持它干净。

  1. <a href="#/home/page/product?couponId={{model.id}}&status={{model.status}}&isProduct={{model.isProduct}}&promoCode={{model.promoCode}}">
  2. <div id="lookdetail" class="checkask">查看详情</div>
  3. </a>

下面没有了

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