[关闭]
@hotjp 2017-08-15T09:44:50.000000Z 字数 13621 阅读 5449

Doc

文档


[注]此文档为最新版文档,旧版文档地址

框架中用到的资源

artTemplate
mui
AmazeUI
est
插件:
日历 Simple-Calendar
倒计时 DownCount
二维码相关 qrcode
html2canvas
表单验证 validator
时间处理 momentjs
PC插件:
分页 createPage
放大镜 Magnifier
懒加载 jquery_lazyload
滑动验证 slideunlock
瀑布流 Masonry
图片上传 WebUploader
微信插件:
图片上传 uploadImg
滑动验证 sliderUnlock

通用部分

模板引擎

使用artTemplate-3.0,原生语法版本,文档地址

CSS部分

1. less

使用less,工具库使用百度提供的est,编译less需输出map文件。
在less中定义了一些基本色,字体用5种黑色,

  1. @gray-darker: lighten(#000, 17%); // #2b2b2b
  2. @gray-dark: lighten(#000, 20%); // #333
  3. @gray: lighten(#000, 40%); // #666
  4. @gray-light: lighten(#000, 60%); // #999
  5. @gray-lighter: lighten(#000, 93.5%); // #eee

主色调

  1. @c-main: #4680d1; // 主色调
  2. @c-main-light: #7ca9ea; // 浅主色调

状态色

  1. @c-success: #56d146; // 成功
  2. @c-info: #4680d1; // 信息 default和主色调相同
  3. @c-warn: #f49127; // 警告
  4. @c-error: #df3a3a; // 错误

价格颜色

  1. @c-price: #ff5454;

icon颜色

  1. @c-icon: #ffaa06;

2. 基本工具类

微信端的工具类更多些,可去样式表头部查看

  1. .l{
  2. float: left;
  3. }
  4. .r{
  5. float: right;
  6. }
  7. .fix{
  8. *zoom: 1;
  9. *clear: both;
  10. }
  11. .fix:before, .fix:after {
  12. display: table;
  13. clear: both;
  14. content: '';
  15. }
  16. .pr{
  17. position: relative;
  18. }
  19. .hide{
  20. display: none;
  21. }

3. 图标

除了前端框架的图标外,没有新引入的图标库,项目中用到的图标需切图完成。

JS部分

1. common中的公用方法

1.1 全局变量 page

定义了一个全局变量page作为页面数据命名空间,在其中存放页面中需要用到的变量,减少全局变量的污染。

page.url 对URL的操作

  1. location.href = "http://192.168.50.114:8083/m/ec/goods/index.html?id=1"
  2. // 返回完整url
  3. page.url.url // http://192.168.50.114:8083/m/ec/goods/index.html?id=1
  4. // 返回url参数
  5. page.url.paras // {id: "1"}
  6. // 返回不包含参数的url
  7. page.url.pathname // http://192.168.50.114:8083/m/ec/goods/index.html
  8. // 取URL参数
  9. page.url.get('id') // 1
  10. // 设置URL参数
  11. page.url.set({'kw':'abc'}) // http://192.168.50.114:8083/m/ec/goods/index.html?id=1&kw=abc
  12. // 重构url
  13. page.url.build()
  14. // 移除url参数
  15. page.url.remove('id') // http://192.168.50.114:8083/m/ec/goods/index.html?kw=abc

page.page 页码 默认0,应在success里做自增操作

page.pageSize 每页显示个数,默认10

1.2 getJson(url,param,success,error)

异步json获取

  1. /**
  2. * 异步json获取
  3. * @param {String} url 接口地址
  4. * @param {Object} param 发送数据
  5. * @param {Function} [success] 成功回调
  6. * @param {Function} [error] 错误回调
  7. */
  8. getJson('/ec/goods/doFindGoods.do', {
  9. goodsId: 129
  10. }, function (res) {
  11. if(!res.success){
  12. mui.toast(res.errorMessage);
  13. setTimeout(function(){
  14. mui.back();
  15. },1000);
  16. }
  17. })
1.3 getWidgetData(widgetName,type,success,error)

根据组件名称返回数据
[注] getWidgetData的 接口地址为/comm/widget/doSearchWidgetData.do,部分组件的接口地址不是这个地址,可自行封装。

  1. /**
  2. * @param widgetName 组件中文名
  3. * @param type 组件数据类型
  4. * @param {Function} [success] 成功回调函数(返回data)
  5. * @param {Function} [error] 出错回调
  6. */
  7. getWidgetData('PC-首页顶部轮播下方多图广告位',2, function (res) {
  8. var data = {
  9. vars: vars,
  10. xData: res.data.widgetData
  11. };
  12. renderTmp('#topSilderad', 'topSilderadTpl', data);
  13. lazyLoad.refresh(true);
  14. });
1.4 renderTmp(selector,tmpId,data,callback)

渲染模板,追加数据,传入callback时返回原生dom+html,不做数据追加处理,需手动追加。使用方式:

  1. /**
  2. * @param {String} selector 原生选择器,只处理第一个元素
  3. * @param {String} tmpId 模板id,不需要加 #
  4. * @param {JSON} data 后台返回的json数据
  5. * @param {Function} [callback] 回调函数
  6. */
  7. renderTmp('#topSilderad', 'topSilderadTpl', data);

或者:

  1. renderTmp('#topSilderad', 'topSilderadTpl', datafunction(el,html){
  2. el.innerHTML += Tpl;
  3. if(el.className.indexOf('show') < 0){
  4. el.className += ' show';
  5. }
  6. });
1.5 toNewPage(href,cantBack)

处理页面跳转,

  1. /**
  2. * @param {String} href 要跳转的URL
  3. * @param {Boolean} [cantBack] true 是否禁止页面返回,替换url,默认false,为true时禁止页面返回
  4. */
  5. toNewPage('http://www.baidu.com',true);
1.6 Cookie操作

cookie.set(key, val, dur)
key 键 ,val 值 ,dur过期时间(毫秒)
cookie.get(key)

  1. cookie.set('name','Bob',10000);
  2. cookie.get('name');
1.7 localStorage操作

使用前先判断浏览器支持情况
local.set(key,val,dur); key 键,val 值,dur过期时间(小时)
local.get(key);

  1. local.set('name','Bob',24);
  2. local.get('name');
1.8 imgFormat(url,format,[isZip],[notForImg])

图片格式化集成错误图片替换,返回一个拼接好的URL
,输出时不转义输出,artTemplate需要加#,使用方式:

  1. /**
  2. *@param {String} url 图片路径,
  3. * @param {String}format 后台拦截器裁剪尺寸
  4. *@param {Boolean} isZip 是否使用压缩(否的话原图输出),
  5. *@param {Boolean} notForImg只返回路径,不拼接img标签需要的onerror
  6. */
  7. <img src="<%=#imgFormat(xData[i], '750x750.png',false)%>">
1.9 dateFormat(date, format)

格式化时间

  1. /**
  2. *@param {String} date 时间 格式为"2017-05-25 00:00:00"或"2017/05/25 00:00:00"
  3. *@param {String} format格式 'y'年, 'M'月份, 'd'日, 'h'小时, 'm'分, 's'秒 , 'q'季度 , 'S'毫秒
  4. */
  5. dateFormat("2017-05-25 00:00:00",'yyyy-MM-dd hh:mm:ss')
1.10 moneyFormat(num, [format])

格式化金额,每一个设置价格的地方都必须要使用moneyFormat

  1. /**
  2. * @param num 金额
  3. * @param [format] 需保留的小数,不设置时原样输出
  4. */
  5. moneyFormat(3000,2) // "3,000.00"
1.11 Base64加密解密

toUri(str) 加密
fromUri(str) 解密

  1. toUri(339) // "MzM5"
  2. fromUri("MzM5") // "339"
1.12 checkLogin(toLogin,callback) 判断是否登录
  1. /**
  2. * 判断登录
  3. * @param toLogin 如果未登录,是否进入登录页面,默认false
  4. * @param callback 如果是已登录状态时的回调函数
  5. */
  6. checkLogin(function(){
  7. alert('已登录才执行')
  8. })
1.13 rmoney(s) 价格转换浮点型 把moneyFormat格式化后的金额转成number类型
  1. rmoney('20,100') // 20100
1.14 autoGrow(selector)

textarea内容超出自动扩展,不会出现滚动条

1.15 定位

若为微信端,可使用微信定位,moClient='wx'即可,否则使用百度定位

  1. var moClient = $('#moClient').val();
  2. jsLocation(moClient, function (city) {
  3. $('#userAddr').html(city);
  4. });
1.16 vars 定义路径
  1. var vars = {
  2. root: "${vars.root}", // 根目录
  3. clientRoot: "${vars.clientRoot}", //根目录或根目录\m,包含root
  4. uploadRoot: "${vars.uploadRoot}", //图片上传路径
  5. resourceFolder:"${vars.resourceFolder}", // 资源路径 \resources
  6. theme: {
  7. id: "${vars.theme.id}", //模板id emall-> default
  8. root: "${vars.theme.root}" //资源路径 \resources
  9. }
  10. };

使用方式:

  1. <a href="<%=vars.clientRoot%>/ex/goods/index.html"></a>
  2. <link href="${vars.theme.root}/resources/css/mui.picker.css" rel="stylesheet"/>

2. 插件

2.1 日历插件 Simple-Calendar

无依赖,只有js和css文件。 配置项众多,添加标记的话需要设置option.showMark和mark两项,实例化后追加标记需要调用addmark和updateMark方法。

  1. <div id='container'></div>
  2. <script>
  3. var options = {
  4. width: '500px',
  5. height: '500px',
  6. language: 'CH', //语言
  7. showLunarCalendar: true, //阴历
  8. showHoliday: true, //休假
  9. showFestival: true, //节日
  10. showLunarFestival: true, //农历节日
  11. showSolarTerm: true, //节气
  12. showMark: true, //标记
  13. timeRange: {
  14. startYear: 1900,
  15. endYear: 2049
  16. },
  17. mark: {
  18. '2016-5-5': '上学'
  19. },
  20. theme: { //主题颜色
  21. changeAble: false,
  22. weeks: {
  23. backgroundColor: '#FBEC9C',
  24. fontColor: '#4A4A4A',
  25. fontSize: '20px',
  26. },
  27. days: {
  28. backgroundColor: '#ffffff',
  29. fontColor: '#565555',
  30. fontSize: '24px'
  31. },
  32. todaycolor: 'orange',
  33. activeSelectColor: 'orange',
  34. }
  35. }
  36. var myCalendar = new SimpleCalendar('#container',options);
  37. </script>
2.2 倒计时插件 DownCount

可从天开始,因需要传入服务器时间,在原来插件基础上做了修改:

  1. <p class="countdown">
  2. <span class="hours">00</span>
  3. <span class="minutes">00</span>
  4. <span class="seconds">00</span>
  5. </p>
  6. <!--span上的class为必须-->
  7. <script>
  8. $('.countdown').downCount({
  9. date: date, //结束时间
  10. offset: +8, //时区
  11. now_date: now_date //开始时间、服务器时间
  12. }, function () {
  13. // 倒计时执行完回调函数
  14. });
  15. </script>
2.3 二维码生成

依赖qrcode.js (实现二维码数据计算的核心类)
jquery.qrcode.js(把qrcode用jquery方式封装起来的,用它来实现图形渲染,支持canvas和table两种方式),使用方式:

  1. $('#output').qrcode('http://www.jerei.com')
2.4 html2canvas

html2canvas html转成图片 因直接截图不清晰,所以在源码基础上做了调整,传参时宽高要乘2,html里的图片不要用百分比设置宽高,否则会缩小变形。

  1. var ct = $('.mui-content');
  2. var width = ct.width();
  3. var height = ct.height();
  4. html2canvas(ct, {
  5. timeout: 300,
  6. width: width * 2,
  7. height: height * 2,
  8. onrendered: function (canvas) {
  9. // 回调
  10. }
  11. });
2.5 表单验证

一开始手写验证,随后引入validator.js,支持字符串验证和表单验证,可拓展,相比源码,新增加 is_idCard 身份证验证, 使用如下:

  1. <!--字符串验证-->
  2. <script>
  3. var v = new validator();
  4. v.isEmail('wowohoo@qq.com');
  5. v.isIp('192.168.23.3');
  6. </script>
  7. <!--表单验证-->
  8. <form id="form">
  9. <div>
  10. <label for="email">邮箱验证</label>
  11. <input type="email" name="email" id="email" class="" value="">
  12. </div>
  13. <div>
  14. <input type="radio" name="sex" value="1">
  15. <input type="radio" name="sex" value="2">
  16. </div>
  17. <input type="text" name="phone" value="">
  18. <button type="submit">提交</button>
  19. </form>
  20. <script>
  21. // 表单验证,submit时验证
  22. var v = new Validator('form', [{
  23. //name 字段
  24. name: 'phone',
  25. display: "你输入的{{phone}}不是合法手机号|不能为空|太长|太短",
  26. // 验证条件
  27. rules: 'is_phone|required|min_length(2)|max_length(12)'
  28. },{
  29. //name 字段
  30. name: 'email',
  31. display: "你输入的{{email}}不是合法邮箱|不能为空|太长|太短",
  32. // 验证条件
  33. rules: 'is_email|required|min_length(2)|max_length(12)'
  34. }, {
  35. //name 字段
  36. name: 'sex',
  37. display:"请你选择性别{{sex}}|请输入数字",
  38. regexp_num:/^[0-9]+$/,//增加验证条件
  39. // 验证条件
  40. rules: 'required|regexp_num'
  41. }], function(obj, evt) {
  42. if (obj.errors) {
  43. // 判断是否错误,obj.errors为数组
  44. console.log(obj.errors)
  45. }
  46. });
  47. // 手动验证
  48. v.validate()
  49. </script>
2.6 时间处理函数

momentjs(momentjs中文网),可支持多语言,对时间进行格式化,计算相对时间,日历时间

微信端

前端框架

使用mui作为前端框架,官方文档地址

CSS

使用rem做单位,设计图宽度750px,定义html的font-size为 13.33333333vw,即1rem=100px。body的font-size为0.32rem,即16px。
对mui的hack在mui.util.less中。
使用雪碧图,切图注意rem的小数像素问题。
渲染模板时,被追加数据的元素需要加dataContent的class,主要作用设置透明度为0,追加完数据后会自动加show的class,透明度置为1,使用方式:

  1. <ul class="sort_left dataContent" id="sortListLeft"></ul>

JS部分

1. jQuery版本

jQuery3.1.0 无ajax无animate

2. common中的公用方法

2.1 ajax

若要使用ajax的话,使用mui提供的ajax方法

  1. mui.ajax({
  2. type: 'POST',
  3. url: url,
  4. data: param,
  5. dataType: 'json',
  6. success: function (res) {
  7. },
  8. error:function(msg){
  9. });
2.2 debug

真机调试不方便,引入debug,在原来基础上做了封装,使用时在URL上拼接"_debug=true",js需console要输出的信息

2.3 返回强制刷新

ios端有返回上一级页面不刷新的问题,此方法可强制执行js,但由后端模板引擎渲染的页面无法刷新

  1. window.addEventListener('pagehide', function(e) {
  2. var $body = $(document.body);
  3. $body.children().remove();
  4. // 要等到回调函数完成,用户按返回才执行script标签的代码
  5. setTimeout(function() {
  6. $body.append("<script type='text/javascript'>window.location.reload();<\/script>");
  7. });
  8. });
2.4 loading 进度条

_num 判断进度条显示状态 change 改变进度条状态 check 检查进度条状态
[注]进页面会有默认的loading,若页面有getJson请求,则会在请求完毕后自动关闭,若没有需手动关闭

  1. loading.ing(); // 进度条显示
  2. loading.done();// 进度条隐藏
2.5 reloadPull(selector)

清空重置上拉加载 需要手动设置页码以及清空dom,会自动触发一次上拉

2.6 占位图

可以手动设置在元素上加dataContent和seize的class,然后设置高度,或者用js设置在getJson/getWidgetData时多传一个参数,同时被追加的元素加data-height属性,使用如下:

  1. <ul class="sort_left dataContent seize" id="sortListLeft"></ul>
  2. <style>
  3. .sort_left{height:4rem};
  4. </style>

或者:

  1. <ul class="sort_left dataContent" data-height="4rem" id="sortListLeft"></ul>
  2. <script>
  3. getWidgetData(data.name, data.datatype, function (res) {
  4. var widgetData = {
  5. vars: vars,
  6. xData: res.data.widgetData || null
  7. };
  8. renderTmp(el, data.tplid, widgetData);
  9. lazyLoad.refresh(true);
  10. },'#sortListLeft');
  11. </script>
2.7 toast(message, type) 弹出提示
  1. /**
  2. * toast
  3. * @param {string} message 弹出字符串
  4. * @param {string} type success/info/warn/error 四种类型
  5. */
  6. tosat('some message','success')

3. 插件

3.1 懒加载

使用mui提供的懒加载,每次新增图片都要调用refresh方法更新,初始化懒加载的代码在common中,若要替换图片,可到common中修改:

  1. // common
  2. var lazyLoad = mui('body').imageLazyload({
  3. placeholder: '/resources/images/placeholder.png',
  4. autoDestroy: false
  5. });

使用方式:

  1. <img data-lazyload="image.jpg">
  2. <script>
  3. lazyLoad.refresh(true);
  4. </script>
3.2 图片上传

微信端的图片上传是把图片转成base64格式再上传,依赖jQuery版本为1.11.0,支持裁剪,需要的文件在\include\c_multi_img_upload.ftl中,缺点是如果一次上传多张或图片过大,容易断开连接,可以把压缩比率调小点,使用方式:

  1. $(function () {
  2. uploadComponent._options.width = 350; //裁剪区域宽高
  3. uploadComponent._options.height = 350;
  4. uploadComponent._options.noclip = true; // 是否裁剪
  5. uploadComponent._options.rate = .66; // 压缩比率
  6. uploadComponent.init();
  7. });
3.3 sliderUnlock() 滑动验证

验证后page.flag等于1,否则等于0

  1. <div class="slider" id="range">
  2. <div class="label">向右滑动验证</div>
  3. <div class="track-on" id="track" >
  4. <div class="bg-green">欢迎登陆英纳维胜商城</div>
  5. </div>
  6. <div class="button-on" id="btn" >
  7. <div class="icon" id="icon"></div>
  8. <div class="spinner" id="spinner">成功</div>
  9. </div>
  10. </div>
  11. <script>
  12. sliderUnlock('#range');
  13. </script>

4.其他

4.1 页面js需放在pageInit
  1. function pageInit() {
  2. // 页面代码
  3. }

PC端

前端框架

使用Amaze UI作为前端框架,官方文档地址

CSS部分

相比微信端,PC端less定义的基础样式更多,

  1. @support-ie-version: 8; // 支持的浏览器版本
  2. @support-html5: true; // 支持HTML5
  3. @default-font-size: 16px; // 默认字号
  4. @default-border-width: 1px; // 默认边框宽度
  5. @default-border-radius: 2px; // 默认圆角
  6. @default-transform-duration: .2s; // 默认动画时长
  7. // font 字体
  8. @code: Monaco, Menlo, Consolas, "Courier New", "FontAwesome", monospace;
  9. @sans-serif: "Segoe UI", "Lucida Grande", Helvetica, Arial, "Microsoft YaHei", FreeSans, Arimo, "Droid Sans", "wenquanyi micro hei", "Hiragino Sans GB", "Hiragino Sans GB W3", "FontAwesome", sans-serif;
  10. @serif: Georgia, "Times New Roman", Times, Kai, "Kaiti SC", KaiTi, BiauKai, "FontAwesome", serif;
  11. @body-bg:#f4f4f4; //body

JS部分

1. common中的公用方法

1.1 图片上传

使用百度提供的 WebUploader 0.1.5版本
定义了webupload(btn,list,num)方法,btn 上传按钮 , list 追加图片的列表,每个item中.info存放图片url , num 允许上传图片的个数,使用方式:

  1. <div class="upLoad_list"></div>
  2. <div class="upload_btn">
  3. <span class="icon">+</span>
  4. </div>
  5. <script>
  6. webupload('upload_btn','upLoad_list',3);
  7. </script>

其中,upLoad_list和upload_btn为必要结构,图片上传后的URL存放在每个file-item的span.imgUrl中

2. 插件

2.1 瀑布流

使用Masonry,瀑布流的懒加载使用imagesLoaded

  1. var msny=$('#postingsList').masonry({ //初始化
  2. itemSelector: '.postings_item'
  3. });
  4. // 新增图片后更新
  5. msny.imagesLoaded().progress( function(instance, image) {
  6. if(!image.isLoaded ){
  7. $(image.img).attr('src',vars.theme.root+"/resources/images/placeholder.png").css('height','200px')
  8. }
  9. msny.masonry('layout').masonry('reloadItems');
  10. });
2.2 滑动验证

使用jquery.slideunlock.js,在源码基础上做了调整,增加重置方法,

  1. <div id="range">
  2. <div id="slider_bg"></div>
  3. <span id="label">>></span> <span id="labelTip" data-tip="欢迎登录EMALL商城">拖动滑块验证</span>
  4. </div>
  5. <script>
  6. /**
  7. *el 包裹元素
  8. *[callback] 回调函数
  9. */
  10. sliderUnlock('#range', function (slider) {
  11. // 滑动验证成功
  12. if (!$('#mobile').hasClass('lenPassed')) {
  13. //没填写手机号需填写手机号
  14. toast('请填写手机号', 'warning');
  15. slider.restart(); // 重置
  16. } else if (!$('#mobile').hasClass('passed')) {
  17. toast('手机号格式错误', 'warning');
  18. slider.restart();
  19. } else {
  20. $('.step1 .am-btn').removeClass('am-disabled');
  21. }
  22. });
  23. </script>
2.3 懒加载

使用jquery_lazyload,common中做了处理,使用方式与mui的懒加载基本一致:

  1. <img data-lazyload="image.jpg">
  2. <script>
  3. lazyLoad.refresh();
  4. </script>
2.4 弹出提示 toast(data,[type],[callback])

仿照mui.toast,结合AmazeUI的模态窗

  1. /**
  2. *data 要弹出的内容 ,
  3. *[type] toast样式 success,error,warning,默认success ,
  4. *[callback] 回调,关闭时执行
  5. */
  6. toast('请填写手机号', 'warning');
2.5 放大镜

基于AmazeUI的插件Amaze UI Magnifier

  1. <figure class="am-magnifier">
  2. <img id="small-image" width="480" height="270" src="images/bing-rect.jpg" alt="Bing rect image">
  3. <div></div>
  4. <div class="am-margin-left-sm">
  5. <img width="1920" height="1080" src="images/bing-rect.jpg" alt="Bing rect image">
  6. </div>
  7. </figure>
  8. <script>
  9. $(function() {
  10. $('#small-image').magnify({
  11. shape: 'rect',
  12. width: 120
  13. });
  14. });
  15. </script>
2.6 分页插件
  1. // 分页标志,如果生成过分页则不再重新生成
  2. page.pageFlag = 0;
  3. getJson("/ec/goods/doSearchGoodsByProps.do", {}, function (data) {
  4. // 获取总页数
  5. page.pageCount = data.data.pageCount;
  6. creatPage();
  7. })
  8. function creatPage(){
  9. if(page.pageFlag == 1){
  10. $(".paging").page({
  11. pages:page.pageCount,// 总页数
  12. groups: 5, //连续显示分页数
  13. jump:function(context,first){// 触发分页后的回调
  14. $('#container').empty();
  15. page.page = context.option.curr;
  16. getPageData();
  17. }
  18. });
  19. page.pageFlag = 0;
  20. }
  21. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注