一个通用布局的页面

<% layout('/layouts/default.html', {title: '菜单管理', libs: ['validate'], bodyClass: ''}){ %>
<div class="main-content"><div class="box box-main"><div class="box-header with-border"><div class="box-title"><i class="fa icon-book-open"></i> 菜单管理</div><div class="box-tools pull-right"><button type="button" class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button></div></div><div class="box-body"></div><div class="box-footer"></div></div>
</div>
<% } %>

调用默认布局 /layouts/default.html,自动引入页面头部和尾部内容,通过参数设置要加载的css和js类库,参数如下:

title参数: 设置页面的标题名字

libs参数: 设置页面要引入的css和js类库,支持类库如下:

默认引入:layer、select2、WdatePicker

  • zTree:树结构控件
  • tabPage:动态页签插件
  • dataGrid:数据表格组件
  • validate:表单验证组件
  • inputmask:表单格式化工具
  • fileupload:文件上传插件
  • ueditor:富文本编辑器控件

bodyClass参数: 设置body的class属性值

定义常用函数库

常用工具类导入

以下工具类可通过@类型快速调用,如:${@Global.getConfig('key')}

  • Global:全局配置类,全局常量,读取属性文件参数值等
  • EncodeUtils:封装各种格式的编码解码工具类,HEX、Base64、HTML、URL、XSS过滤、SQL过滤等
  • ListUtils:List常用工具类,继承Apache的ListUtils,New工具、快速提取属性值、类型转换等
  • MapUtils:Map常用工具类,继承Apache的MapUtils,New工具、Map与Bean互转等
  • SetUtils:Set常用工具类,继承Apache的SetUtils,New工具等
  • IdGenerate:封装各种生成唯一性ID算法的工具类,生成LongUUID,StringUUID,Code生成等
  • ByteUtils:字节转换工具
  • DateUtils:日期工具类,继承Apache的DateUtils
  • NumberUtils:BigDecimal工具类,继承Apache的NumberUtils类
  • ObjectUtils:对象操作工具类,继承Apache的ObjectUtils类
  • StringUtils:字符串工具类,继承Apache的StringUtils类
  • TimeUtils:时间计算工具类,xx天xx时xx分xx秒,刚刚,xx秒,xx分钟,xx小时前、xx天前
  • WorkDayUtils:工作日计算工具类,计算日期直接的工作日等
  • BeanMapper:简单封装Dozer,对象数据映射
  • JaxbMapper:Jaxb实现XML与Java Object的转换
  • JsonMapper:简单封装Jackson,实现Json与Java Object的转换
  • ClassUtils:Class扫描工具类,根据接口查询类,根据继承查询类等
  • ReflectUtils:反射工具类,方便进行getter/setter方法, 访问私有变量, 调用私有方法
  • ModuleUtils:模块工具类,方便获取系统模块信息
  • UserUtils:用户工具类,方便获取进行用户及相关信息

以下是Beetl函数及扩展函数

  • date:返回一个java.util.Date类型的变量,如 date() 返回一个当前时间(对应java的java.util.Date); ${date( "2011-1-1" , "yyyy-MM-dd" )} 返回指定日期
  • print:打印一个对象 print(user.name);
  • println:打印一个对象以及回车换行符号,回车换号符号使用的是模板本身的,而不是本地系统的.如果仅仅打印一个换行符,则直接调用println() 即可
  • nvl:函数nvl,如果对象为null,则返回第二个参数,否则,返回自己 nvl(user,"不存在")
  • isEmpty:判断变量或者表达式是否为空,变量不存在,变量为null,变量是空字符串,变量是空集合,变量是空数组,此函数都将返回true
  • isNotEmpty:同上,判断对象是否不为空
  • has:变量名为参数,判断是否存在此全局变量,如 has(userList),类似于1.x版本的exist("userList"),但不需要输入引号了
  • assert:如果表达式为false,则抛出异常
  • trim:截取数字或者日期,返回字符,如trim(12.456,2)返回"12.45",trim(date,'yyyyy')返回"2017"
  • trunc:截取数字,保留指定的小数位,如trunc(12.456,2) 输出是12.45.不推荐使用,因为处理float有问题,兼容原因保留了
  • decode:一个简化的if else 结构,如 decode(a,1,"a=1",2,"a=2","不知道了")},如果a是1,这decode输出"a=1",如果a是2,则输出"a==2", 如果是其他值,则输出"不知道了"
  • debug:在控制台输出debug指定的对象以及所在模板文件以及模板中的行数,如debug(1),则输出1 [在3行@/org/beetl/core/lab/hello.txt],也可以输出多个,如debug("hi",a),则输出hi,a=123,[在3行@/org/beetl/core/lab/hello.txt]
  • range:接收三个参数,初始值,结束值,还有步增(可以不需要,则默认为1),返回一个Iterator,常用于循环中,如for(var i in range(1,5)) {print(i)},将依次打印1234.
  • flush:强制io输出。
  • pageCtx:仅仅在web开发中,设置一个变量,然后可以在页面渲染过程中,调用此api获取,如pageCtx("title","用户添加页面"),在其后任何地方,可以pageCtx("title") 获取该变量
  • cookie:返回指定的cookie对象 ,如var userCook = cookie("user"), allCookies = cookie();
  • isBlank:判断对象是否是一个空字符串,${isBlank('str')}
  • isNotBlank:判断对象是否不是一个空字符串,${isBlank('str')}
  • toJson:将对象转Json字符串,${toJson(Object)}
  • fromJson:将Json字符串转换为对象,${fromJson(Object)}
  • hasPermi:判断是否有改权限;单个权限验证:${hasPermi('sys:user:edit')};多个AND关系:${hasPermi('sys:user:view,sys:user:edit', 'and')}; 多个OR关系:${hasPermi('sys:user:view,sys:user:edit', 'or')}
  • cookie:获取cookie值,${cookie(name, isRemove)}

数据类型格式化

日期格式化:

Today is ${date,dateFormat="yyyy-MM-dd"}
Today is ${date,dateFormat}
如果date为日期类型可简写:
${date,“yyyy-MM-dd”}

数值格式化:

Salary is ${salary,numberFormat="##.##"}

基本控件封装(类似Spring MVC表单标签)

form 表单标签

生成一个form标签,支持指定model属性,类似SpringMVC的<form:form modelAttribute=""/>标签的属性,自动给表单内的控件绑定属性值
<#form:form id="inputForm" model="${user}" action="${ctx}/sys/user" method="POST" class="form-horizontal">表单内容
</#form:form>
支持上传文件:
<#form:form id="inputForm" model="${user}" action="${ctx}/sys/user" method="POST" enctype="multipart/form-data" class="form-horizontal">表单内容
</#form:form>

控件属性:

var p = {// 标签参数id: id!,                    // 表单IDmodel: model!,               // 绑定Model对象,例如:${user!}action: action!,          // 表单请求地址method: method!,           // 请求方法,默认 postenctype: enctype!,            // 发送之前进行数据编码,上传文件时指定:multipart/form-data};

input 输入框标签

自动绑定form:form上指定的model下的userName属性,类似SpringMVC的<form:input path=""/>标签的属性
<#form:input path="userName" maxlength="100" class="form-control required "/>
日期格式化:
<#form:input path="userName" maxlength="100" dataFormat="date" class="form-control required "/>
数值格式化:
<#form:input path="userName" maxlength="100" dataFormat="number" class="form-control required "/>
不自动绑定,把path改为name就可以:
<#form:input name="userName" value="${user.userName}" maxlength="100" class="form-control required "/>

控件属性:

var p = {// 标签参数id: id!,                    // 元素ID,如果不填写,则与name相同path: path!,                // 绑定form上model中属性的值name: name!,                // 元素名称,不填写value: value!,                // 元素值type: type!'text',          // 元素的类型,默认textdataFormat: dataFormat!'',  // 数据格式化,支持如下值:// date: 日期;// datetime: 日期时间;// number: 数值类型,保留2位小数};

select 下拉框标签

根据字典类型设置下拉数据:
<#form:select path="userType" dictType="sys_user_type" class="form-control required " />
增加一个空白选项:
<#form:select path="roleType" dictType="sys_role_type" blankOption="true" class="form-control " />
多选下拉列表:
<#form:select path="roleType" dictType="sys_role_type" multiple="true" class="form-control " />
手动设置下拉框值,类似SrpingMVC的<form:options items="" itemLabel="" itemValue=""/>标签的属性:
<#form:select path="moduleCodes" items="${moduleList}" itemLabel="moduleName" itemValue="moduleCode" class="form-control required" />

控件属性:

var p = {// 标签参数id: id!,                    // 元素ID,如果不填写,则与name相同path: path!,                // 绑定form上model中属性的值name: name!,                // 元素名称,不填写value: value!,                // 元素值dictType: dictType!,      // 字典类型,从字典里获取,自动设置items、itemLabel、itemValueitems: items![],          // 列表数据,可接受对象集合,如:List<DictData>itemLabel: itemLabel!'',   // 指定列表数据中的什么属性名作为option的标签名itemValue: itemValue!'',  // 指定列表数据中的什么属性名作为option的value值multiple: multiple!'false', // 是否为多选框blankOption: @ObjectUtils.toBoolean(blankOption!false), // 是否默认有个空白选择项目};

radio 输入框标签

类似<#form:select/>标签的使用方法
<#form:radio path="menuType" dictType="sys_menu_type" class="form-control required" />

控件属性:

var p = {// 标签参数id: id!,                    // 元素ID,如果不填写,则与name相同path: path!,                // 绑定form上model中属性的值name: name!,                // 元素名称,不填写value: value!,                // 元素值dictType: dictType!,      // 字典类型,从字典里获取,自动设置items、itemLabel、itemValueitems: items!([]),            // 列表数据,可接受对象集合,如:List<DictData>itemLabel: itemLabel!'',   // 指定列表数据中的什么属性名作为option的标签名itemValue: itemValue!'',  // 指定列表数据中的什么属性名作为option的value值};

checkbox 复选框标签

类似<#form:select/>标签的使用方法,后台接受moduleCodes为字符串,选择多个自动使用“,”分隔,相比SpringMVC必须是List方便的多
<#form:checkbox path="moduleCodes" items="${moduleList}" itemLabel="moduleName" itemValue="moduleCode" class="form-control required" />
生成一个复选框按钮,后台接受replaceFile为Global.YES或Global.NO值:
<#form:checkbox path="replaceFile" label="是否替换现有文件" class="form-control"/>

控件属性:

var p = {// 标签参数id: id!,                    // 元素ID,如果不填写,则与name相同path: path!,                // 绑定form上model中属性的值name: name!,                // 元素名称,不填写value: value!,                // 元素值dictType: dictType!'',      // 字典类型,从字典里获取,自动设置items、itemLabel、itemValueitems: items!([]),            // 列表数据,可接受对象集合,如:List<DictData>itemLabel: itemLabel!'',   // 指定列表数据中的什么属性名作为option的标签名itemValue: itemValue!'',  // 指定列表数据中的什么属性名作为option的value值label: label!,               // 只有一个复选按钮的情况下设置};

textarea 文本域标签

<#form:textarea path="remarks" rows="3" maxlength="200" class="form-control"/>

控件属性:

var p = {// 标签参数id: id!,                    // 元素ID,如果不填写,则与name相同path: path!,                // 绑定form上model中属性的值name: name!,                // 元素名称,不填写value: value!,                // 元素值};

hidden 隐藏域标签

<#form:hidden path="menuCode" />

控件属性:

var p = {// 标签参数id: id!,                    // 元素ID,如果不填写,则与name相同path: path!,                // 绑定form上model中属性的值name: name!,                // 元素名称,不填写value: value!,                // 元素值type: type!'hidden',        // 元素的类型,默认hidden};

表单组件封装

treeselect 树结构选择

封装layer+zTree实现树结构选择组件,使用场景如:部门选择,行政区划选择,栏目列表选择等

<#form:treeselect id="parent" title="上级菜单"name="parent.id" value="${menu.parent.id!}"labelName="parent.menuName" labelValue="${menu.parent.menuName!}"url="${ctx}/sys/menu/treeData?excludeCode=${menu.menuCode}&sysCode=${menu.sysCode}&isShowCode=2"class="" allowClear="true" canSelectRoot="true" canSelectParent="true"/>

组件属性:

var p = {// 标签参数id: id!,                    // 元素IDname: name!,             // 隐藏域名称value: value!,              // 隐藏域值labelName: labelName!,       // 标签框名称labelValue: labelValue!,    // 标签框值class: class!'',           // 标签框的CSS类名placeholder: placeholder!,  // 标签框的预期值的提示信息dataMsgRequired: thisTag.attrs['data-msg-required'],   // 必填错误提示信息btnClass: btnClass!,     // 标签框后面的按钮CSS类名title: title!'选项',            // 对话框标题boxWidth: boxWidth!300,         // 对话框宽度,默认300像素boxHeight: boxHeight!400,        // 对话框高度,默认400像素url: url!,                   // 树结构,数据源地址 [{id, pid, name}]readonly: @ObjectUtils.toBoolean(readonly!false),     // 是否只读模式allowInput: @ObjectUtils.toBoolean(allowInput!false), // 是否允许label框输入allowClear: @ObjectUtils.toBoolean(allowClear!true),    // 是否允许清空选择内容checkbox: @ObjectUtils.toBoolean(checkbox!false), // 是否显示复选框,是否支持多选,如果设置canSelectParent=true则返回父节点数据expandLevel: @ObjectUtils.toInteger(expandLevel!(-1)),        // 默认展开层次级别(默认:如果有1个根节点,则展开一级节点,否则不展开)canSelectRoot: @ObjectUtils.toBoolean(canSelectRoot!false),      // 可以选择跟节点canSelectParent: @ObjectUtils.toBoolean(canSelectParent!false),  // 可以选择父级节点returnFullName: @ObjectUtils.toBoolean(returnFullName!false),   // 是否返回全路径,包含所有上级信息,以 returnFullNameSplit 参数分隔returnFullNameSplit: returnFullNameSplit!'/',                 // 是否返回全路径,的分隔符,默认“/”};

iconselect 图标选择

<#form:iconselect path="menuIcon" class=""/>

组件属性:

var p = {// 标签参数id: id!,                    // 元素ID,如果不填写,则与name相同path: path!,                // 绑定form上model中属性的值name: name!,                // 元素名称,不填写value: value!,                // 元素值class: class!'',            // 隐藏域和标签框的CSS类名};

validcode 验证码

<#form:validcode name="validCode" isRequired="true" isRemote="true" />

组件属性:

var p = {id: id!name,               // 验证码输入框IDname: name!,             // 验证码输入框名称(必填)isRequired: @ObjectUtils.toBoolean(isRequired!true),  // 是否必填,默认必填dataMsgRequired: thisTag.attrs['data-msg-required'],   // 必填错误提示信息isRemote: @ObjectUtils.toBoolean(isRemote!true),        // 是否支持实时远程验证dataMsgRemote: thisTag.attrs['data-msg-remote'],     // 必填错误提示信息isLazy: @ObjectUtils.toBoolean(isLazy!false),           // 是否懒加载验证码图片,原noRefresh参数};

listselect 列表选择

<#form:listselect id="userSelect" title="用户"url="${ctx}/sys/user/userSelect?userType=${role.userType}" allowClear="false" checkbox="true" itemCode="userCode" itemName="userName"/>

组件属性:

var p = {// 标签参数id: id!,                    // 元素IDpath: path!,             // 绑定form上model中属性的值name: name!,                // 隐藏域名称value: value!,              // 隐藏域值labelPath: labelPath!,       // 绑定form上model中属性的值labelName: labelName!,      // 标签框名称labelValue: labelValue!,    // 标签框值class: class!'',           // 标签框的CSS类名placeholder: placeholder!,  // 标签框的预期值的提示信息dataMsgRequired: thisTag.attrs['data-msg-required'],   // 必填错误提示信息btnClass: btnClass!,     // 标签框后面的按钮CSS类名title: title!'选项',            // 对话框标题boxWidth: boxWidth!'$(top.window).width() - 100',         // 对话框宽度boxHeight: boxHeight!'$(top.window).height() - 100',  // 对话框高度 url: url!,                 // 树结构,数据源地址 [{id, pid, name}]readonly: @ObjectUtils.toBoolean(readonly!false),     // 是否只读模式allowInput: @ObjectUtils.toBoolean(allowInput!false), // 是否允许label框输入allowClear: @ObjectUtils.toBoolean(allowClear!true),    // 是否允许清空选择内容checkbox: @ObjectUtils.toBoolean(checkbox!false), // 是否显示复选框,是否支持多选,如果设置canSelectParent=true则返回父节点数据itemCode: itemCode!,   // 选择后结果集中的Code属性名,返回到隐藏域的值itemName: itemName!,  // 选择后结果集中的Name属性名,返回到输入框的值};

fileupload 文件上传

1、文件上传:
<#form:fileupload id="upload1" bizKey="${user.id}" bizType="user_upload1"uploadType="all" class="required" readonly="false"/>
后台代码:FileUploadUtils.saveFileUpload(user.getId(), "user_upload1");2、图片上传:
<#form:fileupload id="upload2" bizKey="${user.id}" bizType="user_upload2"uploadType="image" class="required" readonly="false"/>
后台代码:FileUploadUtils.saveFileUpload(user.getId(), "user_upload2");3、返回路径:
<#form:fileupload id="upload3" returnPath="true"filePathInputId="upload3Path" fileNameInputId="upload3Name"uploadType="image" readonly="false" maxUploadNum="3" isMini="false"/>
<#form:input name="upload3Path" class="form-control"/>
<#form:input name="upload3Name" class="form-control"/>

组件属性:

var p = {// 标签参数id: id!,                    // 元素IDbizKey: bizKey!,         // 业务表的主键值(与附件关联的业务数据)bizType: bizType!,          // 业务表的上传类型(全网唯一,推荐格式:实体名_上传类型,例如,文章图片:article_photo)returnPath: @ObjectUtils.toBoolean(returnPath!false),    // 是否是返回文件路径到输入框(默认false),可将路径直接保存到某个字段里filePathInputId: filePathInputId!, // 设置文件URL存放的输入框的ID,当returnPath为true的时候,返回文件URL到这个输入框fileNameInputId: fileNameInputId!,   // 设置文件名称存放的输入框的ID,当returnPath为true的时候,返回文件名称到这个输入框uploadType: uploadType!'',           // 上传文件类型:all、file、image、media,若不设置,则自动根据上传文件后缀获取class: class!'',                    // 标签框的CSS类名,设置 required 加入必填验证readonly: @ObjectUtils.toBoolean(readonly!false),        // 是否只读模式,只读模式下为查看模式,只允许下载allowSuffixes: allowSuffixes!'',  // 允许上传的后缀,前台的限制,不能超越file.*AllowSuffixes的设置,例如:.jpg,.png,maxUploadNum: @ObjectUtils.toInteger(maxUploadNum!300),       // 多文件下允许最多上传几个,默认300个,设置-1代表不限制imageMaxWidth: @ObjectUtils.toInteger(imageMaxWidth!1024),   // 图片压缩,最大宽度(uploadType为image生效),设置-1代表不做任何处理imageMaxHeight: @ObjectUtils.toInteger(imageMaxHeight!768),   // 图片压缩,最大宽度(uploadType为image生效),设置-1代表不做任何处理isLazy: @ObjectUtils.toBoolean(isLazy!false),             // 设置为ture需要点击上传按钮才上传文件,否则选择后就直接上传isMini: @ObjectUtils.toBoolean(isMini!false),             // 是否是精简上传窗口,无边距,无边框preview: preview!'',                                        // 是否显示预览按钮,接受参数:weboffice};

imageclip 图片裁剪

<img id="avatarImg" class="profile-user-img img-responsive img-circle"src="${@user.getAvatarUrl().replaceFirst('/ctxPath', ctxPath)}">
<#form:imageclip name="imageBase64" btnText="修改头像" btnClass="btn-block"imageId="avatarImg" imageDefaultSrc="${ctxStatic+'/images/user1.jpg'}"circle="true"/>
后台代码:
// 如果设置了头像,则保存头像
if (StringUtils.isNotBlank(imageBase64)){if ("EMPTY".equals(imageBase64)){user.setAvatar(StringUtils.EMPTY);}else{String imageUrl = "avatar/"+user.getUserCode()+"."+FileUtils.getFileExtensionByImageBase64(imageBase64);String fileName = Global.getUserfilesBaseDir(imageUrl);FileUtils.writeToFileByImageBase64(fileName, imageBase64);user.setAvatar(Global.USERFILES_BASE_URL + imageUrl);}
}

组件属性:

var p = {// 标签参数id: id!,                    // 元素ID,如果不填写,则与name相同path: path!,                // 绑定form上model中属性的值name: name!,                // 元素名称,不填写value: value!,                // 元素值class: class!'',            // 隐藏域的CSS类名btnText: btnText!'选择图片',  // 按钮的名字btnClass: btnClass!'',        // 按钮的CSS类名imageId: imageId!'',                   // 裁剪后base64返回到img的idimageDefaultSrc: imageDefaultSrc!'', // 图片默认地址,清除后使用地址circle: circle!'false',   // 是否圆形图片};

ueditor 富文本在线编辑器

<#form:ueditor name="text" maxlength="10000" height="200" class="required"simpleToolbars="false" readonly="false" outline="false"/>

组件属性:

var p = {// 标签参数id: id!,                // 元素ID,如果不填写,则与name相同path: path!,            // 绑定form上model中属性的值name: name!,            // 元素名称,不填写value: value!,            // 元素值class: class!'',        // 标签框的CSS类名,设置 required 加入必填验证maxlength: maxlength!'',    // 编辑器最大输入字数,为空代表无限制height: height!'200',      // 编辑器的高度,默认200simpleToolbars: @ObjectUtils.toBoolean(simpleToolbars!false), // 是否是简单的工具条readonly: @ObjectUtils.toBoolean(readonly!false),     // 是否只读模式outline: @ObjectUtils.toBoolean(outline!false),   // 大纲视图options: options!'',   // UE附加选项,逗号隔开。};

封装通用JavaScript方法


/*** 输出日志*/
log(msg);/*** 输出错误日志*/
error(msg);/*** URL 编码*/
js.encodeUrl(url);/*** URL 解码*/
js.decodeUrl(url);/*** 得到 IE 版本,如果是IE返回:IE版本号,否则返回:false* if (js.ie && js.ie <= 8){ alert('浏览器版本过低') }*/
js.ie;/*** 安全取值,复杂类型或嵌套类型时,取不到属性中的属性时不抛出异常* js.val(jsonObj, 'user.office.name');*/
js.val(jsonObj, attrName);/*** 返回HashCode唯一值(默认忽略大小写)* @param str 要获取的字符串HashCode值* @param caseSensitive 是否大小写敏感(默认false)* @usage js.hashCode(str);*/
js.hashCode(str, caseSensitive);/*** 异步加载文件,loadFile v1.0* js.loadFile(file文件路径, callback成功回调, error失败回调)* js.loadFile('js/test.js',function(){},function(data){});* js.loadFile(['js/test.js','css/test.css'],function(){},function(data){});*/
js.loadFile(file, callback, error);/*** 打开一个Window窗体*/
js.windowOpen(url, name, width, height);/*** 关闭当前Window窗体*/
js.windowClose();/*** 给URL地址添加参数,如果原来有参数则用&前缀,如果没有则用?前缀*/
js.addParam(url, params);/*** 获取URL地址的参数*/
js.getParam(paramName, url);/*** 查看Object的内容,手机调试用* @param obj*/
js.alertObj(obj);/*** 获取字典标签* js.getDictLabel(${@DictUtils.getDictListJson('sys_menu_type')}, val, '未知', true)*/
js.getDictLabel(dictListJson, value, defaultValue, inCss);/// message dialog/*** 显示加载框* @param message 加载框提示信息* @param ignoreMessageIfExists 如果已经有加载框现在,则忽略message信息的设置* @usage js.loading('正在保存...');*/
js.loading(message, ignoreMessageIfExists);/*** 关闭加载框* @param timeout 关闭延迟时间* @param forceClose 是否强制关闭* @usage js.closeLoading(1000, true);*/
js.closeLoading(timeout, forceClose);/*** 得到layer对话框对象* js.layer.msg();*/
js.layer;/*** 显示提示框* @param message 提示消息* @param title 提示标题* @param type 提示类型(success、error、warning、info)* @param timeout 自动关闭毫秒(默认4000毫秒)*/
js.showMessage(message, title, type, timeout);/*** 显示错误提示框*/
js.showErrorMessage(responseText);/*** 关闭提示框*/
js.closeMessage();/*** 提示对话框* @param message 提示消息* @param options 对话框选项* @param closed 对话框关闭回调方法* @usage js.alert('你好!', function(){})* @usage js.alert('你好!', {icon: 2}, function(){})*/
js.alert(message, options, closed);/*** 确认对话框* @param message 确认信息* @param urlOrFun 确认后的跳转的地址,或调用的方法* @param data 如果urlOrFun是地址,该参数是调用地址的参数信息* @param callback 执行ajax的回调方法,如果为空,则直接通过location=urlOrFun跳转。* @param dataType 返回数据类型(默认json)* @param async 是否异步(默认true)* @param loadingMessage 调用loading(loadingMessage)的提示信息。* @usage js.confirm('确认删除吗?', '$ctx/biz/delete?id=123', function(data){alert('删除成功')}, 'json', true, '正在删除...');* @usage js.confirm('确认删除吗?', '$ctx/biz/delete', {id: '123'}, function(data){alert('删除成功')}, 'json', true, '正在删除...');* @usage js.confirm('确认删除吗?', function(data){alert('删除成功')});*/
js.confirm(message, urlOrFun, data, callback, dataType, async, loadingMessage);/// js template/*** 根据js模板生成代码,使用laytpl引擎* @param id 模板ID* @param data 模板数据(可选)* @param callback 如果填写,则为异步渲染* @usage *       模板格式: <sc ript id="dempTpl" type="text/template">//<!--*                   这里写模块内容...*                //--></sc ript>*       调用方法: js.template('dempTpl', data);*       模版语法:*           输出一个普通字段,不转义html:   {{ d.field }}*            输出一个普通字段,并转义html:   {{= d.field }}*          JavaScript脚本: {{# JavaScript statement }}*/
js.template(id, data, callback);/// ajax form/*** AJAX 提交* js.ajaxSubmit('/sys/user/save', {param: 1}, function(data){})*/
js.ajaxSubmit(url, data, callback, dataType, async, message);/*** AJAX 提交表单(支持文件上传)* js.ajaxSubmitForm($(form), function(data){})*/
js.ajaxSubmitForm(formJqueryObj, callback, dataType, async, message);/// string/*** String两边去空格*/
js.trim(str);/*** String的startWith*/
js.startWith(str, start);/*** String的endWith*/
js.endWith(str, end);/*** 截取字符串,区别汉字和英文*/
js.abbr(name, maxLength);/// number/*** 格式化数值* @param num 待格式化的树* @param cent 保留小数位数* @param isThousand 是否进行千分位格式化*/
js.formatNumber(num, cent, isThousand);/*** 金额格式化(千位符,小数四舍五入)金额每隔三位加一个逗号* @param s 要格式化的数值* @param n 小数位数*/
js.formatMoney(s, n);/*** 数值前补零*/
js.numberPad(num, n);/// date/*** 日期格式化* @param date 日期 new Date()* @param f 格式化字符串 yyyy-MM-dd HH:mm:ss*/
js.formatDate(date, f);/*** 字符串转为日期* @param date*/
js.parseDate(date);/*** 日期加减* @param date* @param dadd 天数*/
js.addDate(date, dadd);/*** 快速选择日期方法* @param type 1今日,2本周,3本月,4本季度,5上月* @param beginDateId 开始日期控件的ID* @param endDateId    结束日期控件的ID*/
js.quickSelectDate(type, beginDateId, endDateId);/// cookie/*** cookie 操作* @param name Cookie名称* @param value Cookie值,填写表示设置,不填写表示获取* @parma options:{expires:7} 如果是数字,则expires单位为天。*/
js.cookie(name, value, options);/// tabPage/*** 得到TabPage对象*/
js.tabPage;/*** 初始化TAB页面* @param id*/
js.initTabPage(id, options);/*** 添加TAB页面* @param $this         点击的对象* @param title        提示标题* @param url           访问的路径* @param closeable        是否有关闭按钮* @param refresh        打开后是否刷新重新加载*/
js.addTabPage($this, title, url, closeable, refresh);/*** 获取当前TAB页面* @param currentTabCallback(contents, contentWindow) 当前页面回调方法,传入当前tab页面的contents和contentWindow*/
js.getCurrentTabPage(currentTabCallback);/*** 获取当前页面的上一个TAB页面,并激活上级页面* @param preTabCallback(contents, contentWindow) 传入上一个tab页面的contents和contentWindow* @param isCloseCurrentTab 是否关闭当前页签*/
js.getPrevTabPage(preTabCallback, isCloseCurrentTab);/*** 关闭当前TAB页面,并激活上级页面* @param preTabCallback(contents, contentWindow) 关闭前的回调方法,传入上一个tab页面的contents和contentWindow*/
js.closeCurrentTabPage(preTabCallback);

封装数据表格组件DataGrid

数据表格是一个必不可少的元素,在选择这个选型的时候尝试了很多开源组件,最终选择jqGrid,只是因为它接近经典思维,用着还算顺手,最主要的是遇见什么问题都可以自行解决和修复问题,有人说jqGrid不好看,这没关系这完全而已自行编写CSS改造它,下面看看一个简单的例子:

<#form:form id="searchForm" model="${config}" action="${ctx}/sys/config/listData" method="post" class="form-inline "data-page-no="${parameter.pageNo}" data-page-size="${parameter.pageSize}" data-order-by="${parameter.orderBy}">参数名称:<#form:input path="configName" maxlength="100" class="form-control" />参数键名:<#form:input path="configKey_like" maxlength="100" class="form-control" /><button type="submit" class="btn btn-primary btn-sm">查询</button><button type="reset" class="btn btn-default btn-sm">重置</button>
</#form:form>
<table id="dataGrid"></table>
<div id="dataGridPage"></div>
// 初始化DataGrid对象
$('#dataGrid').dataGrid({// 查询数据表单searchForm: $('#searchForm'),// 设置数据表格列columnModel: [ {header:'参数名称', name:'configName', index:'a.config_name', width:200, formatter: function(val, obj, row, act){return '<a href="${ctx}/sys/config/form?id='+row.id+'" class="btnList" data-title="编辑参数">'+val+'</a>';}},{header:'参数键名', name:'configKey', index:'a.config_key', width:200},{header:'参数键值', name:'configValue', sortable:false, width:260, classes:"nowrap"},{header:'操作', name:'actions', width:100, sortable:false, title:false, formatter: function(val, obj, row, act){var actions = [];<% if(hasPermi('sys:config:edit')){ %>actions.push('<a href="${ctx}/sys/config/form?id='+row.id+'" class="btnList" title="编辑参数"><i class="fa fa-pencil"></i></a>&nbsp;');<% } %><% if(hasPermi('sys:config:delete')){ %>actions.push('<a href="${ctx}/sys/config/delete?id='+row.id+'" class="btnList" title="删除参数" data-confirm="确认要删除该参数吗?"><i class="fa fa-trash-o"></i></a>&nbsp;');<% } %>return actions.join('');}}],// 加载成功后执行事件ajaxSuccess: function(data){}
});

是不是比你使用foreach方便的多,封装后名字叫dataGrid,这只是展示了冰山一角,它支持所有jqGrid参数,即简化了代码编写,又不失功能

提供丰富的演示例子

  • AdminLTE 2.4
  • Bootstrap 3.3
  • Layer 3.0
  • My97DatePicker 4.8
  • jQurey Select2 4.0
  • jQurey Validation 1.16
  • jQurey zTree API 3.5
  • jQurey zTree Demo 3.5
  • jQuery jqGrid 4.7

JeeSite4 一些前端资料 - 来自作者ThinkGem相关推荐

  1. 七天学会NodeJS (原生NodeJS 学习资料 来自淘宝技术团队)

    NodeJS基础 什么是NodeJS JS是脚本语言,脚本语言都需要一个解析器才能运行.对于写在HTML页面里的JS,浏览器充当了解析器的角色.而对于需要独立运行的JS,NodeJS就是一个解析器. ...

  2. 计算机图形相关资料(来自人人:数学的美学世界小站)

    做机器视觉和图像处理方面的研究工作,最重要的两个问题:其一是要把握住国际上最前沿的内容:其二是所作工作要具备很高的实用背景.解决第一个问题的办法就是找出这个方向公认最高成就的几个超级专家(看看他们都在 ...

  3. 大佬教你如何写出更好的CSS,分享web前端资料

    让我们开门见山:编写优秀的 CSS 代码是件十分痛苦的事情.很多开发人员都不想做 CSS 开发.你让我干什么都行,但是 CSS 还是算了吧. 在我创建应用的时候,从来都无法从 CSS 中享受到乐趣.但 ...

  4. Javascript代码优化的8个知识点,分享web前端资料

    篇文章给大家分享了关Javascript代码优化的8点总结,希望我整理的内容能够帮助到大家.写的十分的全面细致,具有一定的参考价值,对此有需要的朋友可以参考学习下.如有不足之处,欢迎批评指正. 本文将 ...

  5. 前端科普系列(1):很有趣的一篇前端简史,作者有心了~

    一.什么是前端 回答这个问题之前,我想起了一道非常经典的前端面试题:"从输入URL到页面呈现在你面前到底发生了什么?"这个题目可以回答的很简单,但仔细思考,也可以回答的很深,这个过 ...

  6. 碎片化学习前端资料分享~

    大前端学习,关注这几个大佬就够了.他们的文章提供的大前端知识非常完备,也经常推荐大前端面试.个人成长相关的文章,对于你来说,学大前端,关注这些公众号就够了. 不多说,直接看这些大佬的介绍.

  7. 前端资料整理--持续更新中

    前端网站 1.http://www.wufangbo.com/   前端开发-武方博   包含有前端相关的各种文章.资源.开发工具等 2.http://www.w3cfuns.com/   前端网-云 ...

  8. 必备mysql技能(资料来自韩顺平哔哩哔哩)

    MySQL必备技能 1.创建数据库 2.查询.删除数据库 3.备份数据库 3.1 全量备份 3.2 增量备份 4.创建表 4.1 修改表 5.数据类型(列类型.字段类型) 5.1 数值型 5.2 字符 ...

  9. 关于WDM驱动开发的不错资料(来自codeproject)

    1. 详细的介绍如何做一个驱动程序教程: Part 1:  http://www.codeproject.com/Articles/9504/Driver-Development-Part-1-Int ...

最新文章

  1. 51单片机中将变量、数组、函数设置在固定位置,定位到绝对地址
  2. 新手入门深度学习 | 3-3:神经网络层Layers
  3. MySQL触发器简介
  4. 机器学习中梯度下降算法的实际应用和技巧
  5. java实现ftp文件的上传与下载
  6. 5-输入输出系统IO
  7. 基于Kmeans算法的文档聚类(包含Java代码及数据格式)
  8. hdfs中与file数组类似的数组_EXCEL中数组的应用专题之十二:行列数相同数组的运算...
  9. Java后端学习路线(校招前准备)
  10. Java 删除文件夹
  11. 【算法系列】-开根号
  12. 跳槽吗?4月7日18点6大细分领域4家优质名企招聘情报来了
  13. 汉洛塔问题(c解决)
  14. 2023年重庆邮电大学计算机科学与技术(802)初试经验贴
  15. Codeforces - Serge and Dining Room
  16. IT职场人生:学外语
  17. 三种安装httpd的方法
  18. ubuntu10.10+双显卡I卡N卡+bumbleb…
  19. ubuntu删除错误的ATI驱动
  20. phpyun修改userlist标签

热门文章

  1. Android与MVC设计模式相关操作
  2. 在官网上下载慢解决办法
  3. 用python打开桌面应用程序
  4. EF的基本了解(一)
  5. Matplotlib画图的复杂颜色设置(包括fig, ax, spines, tick)
  6. 计算机专业的可迁移技能,动词可迁移技能的发现.PPT
  7. 计算机机房装修效果图,机房装修施工流程是什么? 机房装修效果图
  8. IDEA编译输出/控制台改为英文,运行信息报错信息改为英文
  9. matlab和ansys联合优化,MATLAB与HFSS联合建模与仿真优化详细介绍
  10. 判定被7整除的简易方法