diff --git a/modules/core/src/main/resources/views/functions/form/attrs.html b/modules/core/src/main/resources/views/functions/form/attrs.html
new file mode 100644
index 00000000..a1c1c30b
--- /dev/null
+++ b/modules/core/src/main/resources/views/functions/form/attrs.html
@@ -0,0 +1,25 @@
+<%/* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
+ * No deletion without permission, or be held responsible to law. */
+
+/**
+ * 编译控件属性
+ * @author ThinkGem
+ * @version 2019-3-5
+ */
+var p = para0;
+
+// 编译除内置属性以外的属性到元素。
+p.attrs = p.attrs!'';
+for (var attr in p.thisTag.attrs){
+ if (attr.key != '$cols' && !@ListUtils.inString(attr.key, p.exclAttrs)){
+ if(attr.key == 'readonly' && !toBoolean(attr.value)){
+ continue;
+ }
+ var s = {
+ %> ${attr.key}="${attr.value}"<%
+ };
+ p.attrs = p.attrs + s;
+ }
+}
+
+%>
\ No newline at end of file
diff --git a/modules/core/src/main/resources/views/functions/form/items.html b/modules/core/src/main/resources/views/functions/form/items.html
new file mode 100644
index 00000000..894405b4
--- /dev/null
+++ b/modules/core/src/main/resources/views/functions/form/items.html
@@ -0,0 +1,27 @@
+<%/* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
+ * No deletion without permission, or be held responsible to law. */
+
+/**
+ * 编译items属性
+ * @author ThinkGem
+ * @version 2017-3-5
+ */
+var p = para0;
+
+// 如果设置了字典,则使用字典数据
+if (isNotEmpty(p.dictType) && type.name(dictType) == 'String'){
+ p.items = @DictUtils.getDictList(p.dictType);
+ if (isBlank(p.itemLabel)){
+ p.itemLabel = 'dictLabel';
+ }
+ if (isBlank(p.itemValue)){
+ p.itemValue = 'dictValue';
+ }
+}
+
+// 如果为空,则赋一个空数组
+if (isEmpty(p.items!)){
+ p.items = [];
+}
+
+%>
\ No newline at end of file
diff --git a/modules/core/src/main/resources/views/functions/form/path.html b/modules/core/src/main/resources/views/functions/form/path.html
new file mode 100644
index 00000000..9e25cff6
--- /dev/null
+++ b/modules/core/src/main/resources/views/functions/form/path.html
@@ -0,0 +1,72 @@
+<%/* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
+ * No deletion without permission, or be held responsible to law. */
+
+/**
+ * 编译path属性,当设置path属性时,自动根据model获取value
+ * @author ThinkGem
+ * @version 2017-3-5
+ */
+var p = para0, tag = p.thisTag;
+
+if (tag != null) {
+ var parent = @tag.getParentByTagName('form');
+ var readonly = parent.attrs.readonly!;
+ if (isNotEmpty(readonly) && toBoolean(readonly)) {
+ p.readonly = toBoolean(readonly!false);
+ p.attrs = p.attrs!'' + 'readonly="'+p.readonly+'"';
+ }
+ // path 优先级高于 name
+ if (isNotEmpty(p.path) || isNotEmpty(p.labelPath)) {
+ var model = parent.attrs.model!;
+ if (isNotEmpty(p.path)){
+ p.name = p.path;
+ if (isNotEmpty(model)){
+ p.value = @ReflectUtils.invokeGetter(model, p.name);
+ if (toBoolean(xss!false) && type.name(p.value) == 'String'){
+ p.value = @EncodeUtils.xssFilter(p.value);
+ }else if (toBoolean(encodeHtml!false) && type.name(p.value) == 'String'){
+ p.value = @EncodeUtils.encodeHtml(p.value);
+ }
+ }
+ }
+ if (isNotEmpty(p.labelPath)){
+ p.labelName = p.labelPath;
+ if (isNotEmpty(model)){
+ p.labelValue = @ReflectUtils.invokeGetter(model, p.labelName);
+ if (toBoolean(xss!false) && type.name(p.value) == 'String'){
+ p.labelValue = @EncodeUtils.xssFilter(p.labelValue);
+ }if (toBoolean(encodeHtml!false) && type.name(p.value) == 'String'){
+ p.labelValue = @EncodeUtils.encodeHtml(p.labelValue);
+ }
+ }
+ }
+ }
+}
+
+// defaultValue 默认值
+if (isNotBlank(p.name)){
+ if (p.defaultValue != null && isBlank(p.value)){
+ p.value = p.defaultValue;
+ }
+}
+if (isNotBlank(p.labelName)) {
+ if (p.defaultLabel != null && isBlank(p.labelValue)){
+ p.labelValue = p.defaultLabel;
+ }
+ if (isBlank(p.labelValue)) {
+ p.labelValue = p.value;
+ }
+}
+
+// 如果没有设置id,则与name相同
+if (isBlank(p.id)){
+ p.id = p.name;
+ // 替换id中的非法字符
+ p.id = @StringUtils.replace(p.id, '.', '_');
+ p.id = @StringUtils.replace(p.id, '\'', '_');
+ p.id = @StringUtils.replace(p.id, '\"', '_');
+ p.id = @StringUtils.replace(p.id, '[', '_');
+ p.id = @StringUtils.replace(p.id, ']', '_');
+}
+
+%>
\ No newline at end of file
diff --git a/modules/core/src/main/resources/views/functions/menu/tree.html b/modules/core/src/main/resources/views/functions/menu/tree.html
new file mode 100644
index 00000000..5101227e
--- /dev/null
+++ b/modules/core/src/main/resources/views/functions/menu/tree.html
@@ -0,0 +1,116 @@
+<%/* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
+ * No deletion without permission, or be held responsible to law. */
+
+/**
+ * 侧边栏菜单
+ * @author ThinkGem
+ * @version 2017-3-5
+ */
+var p = para0; p.html = '';
+p.loadType = p.loadType!'2';
+p.parentCode = p.parentCode!'0';
+p.paddingLeft = p.paddingLeft!14;
+p.paddingInitLeft = p.paddingInitLeft!(@Global.getConfig('sys.index.menuStyle', '1') == '2' ? 0 : p.paddingLeft);
+if (p.loadType == '1'){
+ p.menuList = @UserUtils.getMenuListByParentCode(p.parentCode);
+}else if (p.loadType == '2'){
+ if (p.children!false){
+ p.menuList = p.childList![];
+ }else{
+ if (p.children!true){
+ if (p.parentCode == '0'){
+ p.parentCode = '0,';
+ }else{
+ p.parentCode = '0,' + p.parentCode + ',';
+ }
+ }
+ p.menuList = @UserUtils.getMenuTreeByParentCode(p.parentCode);
+ }
+}
+for (var menu in p.menuList![]){
+ if ((p.loadType == '2' || p.parentCode == menu.parentCode)
+ && menu.isMenu && menu.isShow == @Global.YES){
+ var attrs = ' ', style = '', menuIcon;
+ if (isBlank(menu.menuTarget)){
+ attrs = attrs + 'href="javascript:" data-';
+ }
+ if (isNotBlank(menu.menuUrl)){
+ var href = menu.menuUrl;
+ if (@StringUtils.startsWith(href, "///")){
+ href = @StringUtils.substring(href, 2);
+ } else if (@StringUtils.startsWith(href, "//")){
+ href = @request.getContextPath() + @StringUtils.substring(href, 1);
+ } else if (@StringUtils.startsWith(href, "/")){
+ href = @request.getContextPath() + @Global.getAdminPath() + href;
+ }
+ attrs = attrs + 'href="' + href + '"';
+ }else{
+ attrs = attrs + 'href="blank"';
+ }
+ if (isNotBlank(menu.menuTarget)){
+ attrs = attrs + ' target="' + menu.menuTarget + '"';
+ }
+ if (isBlank(menu.menuTarget)){
+ attrs = attrs + ' class="addTabPage"';
+ }
+ if (isNotBlank(menu.menuColor)){
+ style = style + 'color:' + menu.menuColor + ';';
+ }
+ if (menu.treeLevel > 1) {
+ style = style + 'padding-left:' + (toInteger(menu.treeLevel) * p.paddingLeft + p.paddingInitLeft) + 'px;';
+ }
+ if (style != '') {
+ attrs = attrs + ' style="' + style + '"';
+ }
+ if (isNotBlank(menu.menuTitle)){
+ attrs = attrs + ' title="' + menu.menuTitle + '"';
+ }else{
+ attrs = attrs + ' title="' + menu.menuName + '"';
+ }
+ attrs = attrs + ' data-code="' + menu.menuCode + '"';
+ if (isNotBlank(menu.menuIcon)){
+ if (@StringUtils.contains(menu.menuIcon, '://')){
+ menuIcon = ' ';
+ }else if (@StringUtils.startsWith(menu.menuIcon, '/')){
+ menuIcon = ' ';
+ }else{
+ menuIcon = '';
+ }
+ }else{
+ menuIcon = ' ';
+ }
+ var h = {
+%>
+
<%
+ %>${menuIcon} ${menu.menuName} <%
+ // 输出子节点(递归调用)
+ var p2 = null;
+ if (p.loadType == '1'){
+ p2 = {loadType: '1', children: !menu.isTreeLeaf, parentCode: menu.menuCode,
+ paddingLeft: p.paddingLeft, paddingInitLeft: p.paddingInitLeft};
+ }else if (p.loadType == '2'){
+ p2 = {loadType: '2', children: isNotBlank(menu.childList), childList: menu.childList,
+ paddingLeft: p.paddingLeft, paddingInitLeft: p.paddingInitLeft};
+ }
+ if (p2 != null && p2.children && p.children!true){
+ menu.tree(p2);
+ if (isNotBlank(p2.html)){
+ %>
+ <%
+ }
+ }
+ %> <%
+ if (isNotBlank(p2.html)){
+ %><%
+ }
+%>
+
+<%
+ };
+ p.html = p.html + h;
+ }
+}
+%>
\ No newline at end of file
diff --git a/modules/core/src/main/resources/views/htmltags/form/checkbox.html b/modules/core/src/main/resources/views/htmltags/form/checkbox.html
new file mode 100644
index 00000000..8dae2974
--- /dev/null
+++ b/modules/core/src/main/resources/views/htmltags/form/checkbox.html
@@ -0,0 +1,95 @@
+<%/* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
+ * No deletion without permission, or be held responsible to law. */
+
+/**
+ * 表单控件:单选按钮
+ * @author ThinkGem
+ * @version 2017-3-5
+ */
+var p = {
+
+ // 标签参数
+ id: id!, // 元素ID,如果不填写,则与name相同
+ path: path!, // 绑定form上model中属性的值
+ name: name!, // 元素名称,不填写
+ value: value!, // 元素值
+ defaultValue: defaultValue!,// 默认值 v4.1.5
+
+ dictType: dictType!'', // 字典类型,从字典里获取,自动设置items、itemLabel、itemValue
+
+ items: items!([]), // 列表数据,可接受对象集合,如:List
+ itemLabel: itemLabel!'', // 指定列表数据中的什么属性名作为option的标签名
+ itemValue: itemValue!'', // 指定列表数据中的什么属性名作为option的value值
+
+ label: label!, // 只有一个复选按钮的情况下设置(开关)
+
+ readonly: toBoolean(readonly!false), // 是否只读模式 v4.2.0
+
+ // 内置参数
+ thisTag: thisTag,
+ exclAttrs: ['id', 'path', 'name', 'value', 'defaultValue', 'dictType',
+ 'items', 'itemLabel', 'itemValue', 'label']
+};
+
+// 编译绑定参数
+form.path(p);
+
+// 编译属性参数
+form.attrs(p);
+
+// 编译集合参数
+form.items(p);
+
+// 只有一个复选按钮的情况下
+if (isNotBlank(p.label)){
+ p.items = [{label:p.label,value:'1'}];
+ p.itemLabel = 'label';
+ p.itemValue = 'value';
+}
+
+// 如果不是字符串,则转换为字符串
+if (type.name(p.value) != 'String'){
+ p.value = @ObjectUtils.toString(p.value);
+}
+
+// 转换为字符串数组
+if (type.name(p.value) == 'String'){
+ p.value = @StringUtils.split(p.value, ',');
+}
+
+// 如果只读模式,则禁用,并加默认值为value
+if (p.readonly){
+ p.attrs = p.attrs + ' disabled="true"';
+}
+
+// 输出选项
+var body = {
+ var checked,title;
+ for (var item in p.items){
+ checked = (@StringUtils.inString(item[p.itemValue], p.value) ? ' checked' : '');
+ if (type.name(item) == 'DictData' && isNotBlank(item['description'])){
+ title = ' title="' + item['description'] + '"';
+ }
+ %> ${item[p.itemLabel]} <%
+ }
+ /**
+ * 1.若复选框不被选中时,服务端将不能接受这个参数,也就得不到选择的状态。
+ * 2.如果有一个复选框参数前加“_”时,这个不被选中的参数,将被设置为null。
+ * 3.如果有一个复选框参数前加“!”时,这个不被选中的参数,将被设置为该值,作为默认值。
+ * 4.详见org.springframework.web.bind.WebDataBinder类的Prefix注释。
+ */
+ if (isNotBlank(p.name)){
+ if (p.readonly){
+ for(var val in p.value){
+ %> <%
+ }
+ }else{
+ %> <%
+ }
+ }
+};
+
+%>
+
+${body}
diff --git a/modules/core/src/main/resources/views/htmltags/form/extend.html b/modules/core/src/main/resources/views/htmltags/form/extend.html
new file mode 100644
index 00000000..aecccbef
--- /dev/null
+++ b/modules/core/src/main/resources/views/htmltags/form/extend.html
@@ -0,0 +1,254 @@
+<%/* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
+ * No deletion without permission, or be held responsible to law. */
+
+/**
+ * 表单控件:扩展控件组
+ * @author ThinkGem
+ * @version 2017-3-5
+ */
+var p = {
+
+ // 标签参数
+ collapsed: toBoolean(collapsed!true), // 初始状态是否折叠
+
+ title: text('扩展字段'), // 显示标题、折叠标题,v4.2.3 版本以后版本生效
+
+ extendS1: extendS1!text('String 1'), // extendS1 及以下属性的标签名 v4.2.3 版本以后版本生效
+ extendS2: extendS2!text('String 2'),
+ extendS3: extendS3!text('String 3'),
+ extendS4: extendS4!text('String 4'),
+ extendS5: extendS5!text('String 5'),
+ extendS6: extendS6!text('String 6'),
+ extendS7: extendS7!text('String 7'),
+ extendS8: extendS8!text('String 8'),
+ extendI1: extendI1!text('Integer 1'),
+ extendI2: extendI2!text('Integer 2'),
+ extendI3: extendI3!text('Integer 3'),
+ extendI4: extendI4!text('Integer 4'),
+ extendF1: extendF1!text('Float 1'),
+ extendF2: extendF2!text('Float 2'),
+ extendF3: extendF3!text('Float 3'),
+ extendF4: extendF4!text('Float 4'),
+ extendD1: extendD1!text('Date 1'),
+ extendD2: extendD2!text('Date 2'),
+ extendD3: extendD3!text('Date 3'),
+ extendD4: extendD4!text('Date 4'),
+
+ pathPrefix: (isBlank(pathPrefix!) ? '' : pathPrefix + '.') + 'extend',
+
+ // 内置参数
+ thisTag: thisTag
+};
+
+%>
+
\ No newline at end of file
diff --git a/modules/core/src/main/resources/views/htmltags/form/fileupload.html b/modules/core/src/main/resources/views/htmltags/form/fileupload.html
new file mode 100644
index 00000000..abd3aac9
--- /dev/null
+++ b/modules/core/src/main/resources/views/htmltags/form/fileupload.html
@@ -0,0 +1,205 @@
+<%/* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
+ * No deletion without permission, or be held responsible to law. */
+
+/**
+ * 表单控件:文件上传
+ * @author ThinkGem
+ * @version 2017-3-5
+ */
+var p = {
+
+ // 标签参数
+ id: id!, // 元素ID
+
+ bizKey: bizKey!, // 业务表的主键值(与附件关联的业务数据)
+ bizType: bizType!, // 业务表的上传类型(全网唯一,推荐格式:实体名_上传类型,例如,文章图片:article_photo)
+
+ dataMap: toBoolean(dataMap!false), // 后台接受的 fileUploadIds 是否从 dataMap 中获取(Cloud环境下使用)
+
+ returnPath: 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: readonly!'false', // 是否只读模式,只读模式下为查看模式,只允许下载
+ dataMsgRequired: thisTag.attrs['data-msg-required'], // 必填错误提示信息 v4.2.1
+
+ allowSuffixes: allowSuffixes!'', // 允许上传的后缀,前台的限制,不能超越file.*AllowSuffixes的设置,例如:.jpg,.png,
+ maxFileSize: maxFileSize!'', // 当前控件的文件上传大小设置(500*1024*1024)单位字节,不可超过配置文件设置的文件大小
+ maxUploadNum: @ObjectUtils.toInteger(maxUploadNum!300), // 多文件下允许最多上传几个,默认300个,设置-1代表不限制
+
+ cueWords: cueWords!'', // 提示语,默认:或将照片(文件)拖到这里,最多可选 maxUploadNum 张(个) v4.1.5
+
+ imageMaxWidth: imageMaxWidth!'', // 图片压缩,最大宽度(uploadType为image生效),设置-1代表不做任何处理
+ imageMaxHeight: imageMaxHeight!'', // 图片压缩,最大宽度(uploadType为image生效),设置-1代表不做任何处理
+ imageThumbName: imageThumbName!'', // 如果开启了图片缩略图,这里可以指定缩略图名称,例如:150x150.jpg v5.4.2
+
+ serviceUpload: serviceUpload!(ctxAdmin+'/file/upload'), // 上传文件后台服务 v4.1.5
+ serviceDownload: serviceDownload!(ctxAdmin+'/file/download/'), // 下载文件后台服务 v4.1.5
+ serviceFileList: serviceFileList!(ctxAdmin+'/file/fileList'), // 查询文件后台服务 v4.1.5
+
+ extendParams: extendParams!'', // 提交的上传扩展参数,例如:n1:'v1',n2:'v2',后台接受:fileEntity.getFileUploadParams().getExtend() v4.1.3
+
+ isLazy: toBoolean(isLazy!false), // 设置为ture需要点击上传按钮才上传文件,否则选择后就直接上传
+
+ isMini: toBoolean(isMini!false), // 是否是精简上传窗口,无边距,无边框
+
+ preview: preview!'', // 是否显示预览按钮,接受参数:v4.2.0 之前版本为 weboffice,之后版本为 true,可根据需要扩展预览引擎
+
+ callbackFuncName: callbackFuncName!'fileuploadCallback', // 可自定义回调方法的函数名 v4.2.0
+
+ // 内置参数
+ thisTag: thisTag
+};
+
+// 编译绑定参数
+form.path(p);
+
+// 标题自动生成
+if (isBlank(p.dataMsgRequired)){
+ var title = text('文件');
+ if(p.uploadType=='file'){
+ title = text('文档');
+ }else if(p.uploadType=='image'){
+ title = text('图片');
+ }else if(p.uploadType=='media'){
+ title = text('音频或视频');
+ }
+ p.dataMsgRequired = text('请上传') + title;
+}
+
+// 生成参数名
+p.name = p.bizType;
+p.nameDel = p.bizType + '__del';
+if (p.dataMap){
+ p.name = 'dataMap['+p.name+']';
+ p.nameDel = 'dataMap['+p.nameDel+']';
+}
+
+%>
+
+ <% if(isNotBlank(p.bizType)){ %>
+
+
+ <% } %>
+
+ <% if(p.uploadType == 'image'){ %>
+
+
+ <% if(!p.isMini){ %>
+
+ 0%
+
+
+
+ <% }
+ // 如果是mini界面并上传个数大于1,则显示出来上传信息和继续上传按钮
+ else if(p.maxUploadNum > 1){ %>
+
+ <% } %>
+
+
+
+
+
+
+ <% if(isNotBlank(p.cueWords)){ %>
+
${p.cueWords}
+ <% }else if(!p.isMini){ %>
+
${text('或将照片拖到这里,最多可选 {0\} 张', p.maxUploadNum)}
+ <% } %>
+
+
+
+ <% }else{ %>
+
+
+
+
+
+
+ <% if(isNotBlank(p.cueWords)){ %>
+
${p.cueWords}
+ <% }else{ %>
+
${text('或将文件拖到这里,最多可选 {0\} 个', p.maxUploadNum)}
+ <% } %>
+
+
+
+ <% } %>
+
+
+
\ No newline at end of file
diff --git a/modules/core/src/main/resources/views/htmltags/form/form.html b/modules/core/src/main/resources/views/htmltags/form/form.html
new file mode 100644
index 00000000..3f3ada4d
--- /dev/null
+++ b/modules/core/src/main/resources/views/htmltags/form/form.html
@@ -0,0 +1,27 @@
+<%/* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
+ * No deletion without permission, or be held responsible to law. */
+
+/**
+ * 表单控件:表单标签
+ * @author ThinkGem
+ * @version 2017-3-5
+ */
+var p = {
+
+ // 标签参数
+ id: id!, // 表单ID
+ model: model!, // 绑定Model对象,例如:${user!}
+ action: action!, // 表单请求地址
+ method: method!, // 请求方法,默认 post
+ enctype: enctype!, // 发送之前进行数据编码,上传文件时指定:multipart/form-data
+
+ // 内置参数
+ thisTag: thisTag,
+ exclAttrs: ['id', 'model', 'action', 'method']
+};
+
+// 编译属性参数
+form.attrs(p);
+
+%>
diff --git a/modules/core/src/main/resources/views/htmltags/form/hidden.html b/modules/core/src/main/resources/views/htmltags/form/hidden.html
new file mode 100644
index 00000000..1a4fc64a
--- /dev/null
+++ b/modules/core/src/main/resources/views/htmltags/form/hidden.html
@@ -0,0 +1,29 @@
+<%/* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
+ * No deletion without permission, or be held responsible to law. */
+
+/**
+ * 表单控件:隐藏域
+ * @author ThinkGem
+ * @version 2017-3-5
+ */
+var p = {
+
+ // 标签参数
+ id: id!, // 元素ID,如果不填写,则与name相同
+ path: path!, // 绑定form上model中属性的值
+ name: name!, // 元素名称,不填写
+ value: value!, // 元素值
+ defaultValue: defaultValue!,// 默认值 v4.1.5
+
+ // 内置参数
+ thisTag: thisTag,
+ exclAttrs: ['id', 'path', 'name', 'value', 'defaultValue', 'type']
+};
+
+// 编译绑定参数
+form.path(p);
+
+// 编译属性参数
+form.attrs(p);
+
+%>
diff --git a/modules/core/src/main/resources/views/htmltags/form/iconselect.html b/modules/core/src/main/resources/views/htmltags/form/iconselect.html
new file mode 100644
index 00000000..6b2befbc
--- /dev/null
+++ b/modules/core/src/main/resources/views/htmltags/form/iconselect.html
@@ -0,0 +1,63 @@
+<%/* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
+ * No deletion without permission, or be held responsible to law. */
+
+/**
+ * 表单控件:图标选择控件
+ * @author ThinkGem
+ * @version 2017-3-5
+ */
+var p = {
+
+ // 标签参数
+ id: id!, // 元素ID,如果不填写,则与name相同
+ path: path!, // 绑定form上model中属性的值
+ name: name!, // 元素名称,不填写
+ value: value!, // 元素值
+ defaultValue: defaultValue!,// 默认值 v4.1.5
+
+ class: class!'', // 隐藏域和标签框的CSS类名
+
+ // 内置参数
+ thisTag: thisTag
+};
+
+// 编译绑定参数
+form.path(p);
+
+%>
+
+
\ No newline at end of file
diff --git a/modules/core/src/main/resources/views/htmltags/form/imageclip.html b/modules/core/src/main/resources/views/htmltags/form/imageclip.html
new file mode 100644
index 00000000..67aa366e
--- /dev/null
+++ b/modules/core/src/main/resources/views/htmltags/form/imageclip.html
@@ -0,0 +1,77 @@
+<%/* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
+ * No deletion without permission, or be held responsible to law. */
+
+/**
+ * 表单控件:图片裁剪,返回image/base64
+ * @author ThinkGem
+ * @version 2017-12-16
+ */
+var p = {
+
+ // 标签参数
+ id: id!, // 元素ID,如果不填写,则与name相同
+ path: path!, // 绑定form上model中属性的值
+ name: name!, // 元素名称,不填写
+ value: value!, // 元素值
+ defaultValue: defaultValue!,// 默认值 v4.1.5
+
+ class: class!'', // 隐藏域的CSS类名
+
+ btnText: btnText!text('选择图片'), // 按钮的名字
+ btnClass: btnClass!'', // 按钮的CSS类名
+
+ imageId: imageId!'', // 裁剪后base64返回到img的id
+ imageDefaultSrc: imageDefaultSrc!'', // 图片默认地址,清除后使用地址
+
+ ratio: ratio!'1/1', // 图片裁剪比例 v4.1.7
+ circle: circle!'false', // 是否圆形图片
+
+ maxWidth: maxWidth!'', // 裁剪图片后返回的最大宽度 v4.2.1
+ maxHeight: maxHeight!'', // 裁剪图片后返回的最大高度 v4.2.1
+
+ // 内置参数
+ thisTag: thisTag
+};
+
+// 编译绑定参数
+form.path(p);
+
+%>
+
+${p.btnText}
+
\ No newline at end of file
diff --git a/modules/core/src/main/resources/views/htmltags/form/input.html b/modules/core/src/main/resources/views/htmltags/form/input.html
new file mode 100644
index 00000000..b38153b3
--- /dev/null
+++ b/modules/core/src/main/resources/views/htmltags/form/input.html
@@ -0,0 +1,67 @@
+<%/* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
+ * No deletion without permission, or be held responsible to law. */
+
+/**
+ * 表单控件:输入框
+ * @author ThinkGem
+ * @version 2017-3-5
+ */
+var p = {
+
+ // 标签参数
+ id: id!, // 元素ID,如果不填写,则与name相同
+ path: path!, // 绑定form上model中属性的值
+ name: name!, // 元素名称,不填写
+ value: value!, // 元素值
+ defaultValue: defaultValue!,// 默认值 v4.1.5
+
+ type: type!'text', // 元素的类型,默认text
+
+ dataFormat: dataFormat!'', // 数据格式化,支持如下值:
+ // date: 日期;默认值设置:defaultValue="${date()}"
+ // yyyy: 年;默认值设置:defaultValue="${date('2019','yyyy')}"
+ // yyyy-MM: 年月;默认值设置:defaultValue="${date('2019-11','yyyy-MM')}"
+ // datetime: 日期时间 yyyy-MM-dd HH:mm 格式化
+ // datetime2: 日期时间,带秒 yyyy-MM-dd HH:mm:ss 格式化
+ // 自定义日期 path 改为 name 加 value="${@DateUtils.formatDate(model.field,'yyyyMMdd')}}"
+ // number: 数值类型 #.## 格式化,默认值设置:defaultValue="${0}"
+ // number2: 数值类型 0.00 格式化,默认值设置:defaultValue="${0}" v4.1.8
+ // 自定义数值 path 改为 name 加 value="${@NumberUtils.formatNumber(model.field,'0.0')}}"
+
+ // 内置参数
+ thisTag: thisTag,
+ exclAttrs: ['id', 'path', 'name', 'value', 'defaultValue', 'type', 'dataFormat']
+};
+
+// 编译绑定参数
+form.path(p);
+
+var df = '';
+// 日期类型格式化(后台实体属性必须是 Date 类型的属性)
+if (p.dataFormat == 'date'){
+ df = {%> value="${p.value,dateFormat='yyyy-MM-dd'}"<%};
+}else if (p.dataFormat == 'yyyy'){
+ df = {%> value="${p.value,dateFormat='yyyy'}"<%};
+}else if (p.dataFormat == 'yyyy-MM'){
+ df = {%> value="${p.value,dateFormat='yyyy-MM'}"<%};
+}else if (p.dataFormat == 'MM-dd'){
+ df = {%> value="${p.value,dateFormat='MM-dd'}"<%};
+}else if (p.dataFormat == 'datetime'){
+ df = {%> value="${p.value,dateFormat='yyyy-MM-dd HH:mm'}"<%};
+}else if (p.dataFormat == 'datetime2'){
+ df = {%> value="${p.value,dateFormat='yyyy-MM-dd HH:mm:ss'}"<%};
+}
+// 数值类型格式化(后台实体属性必须是 数值 类型的属性)
+else if (p.dataFormat == 'number'){
+ df = {%> value="${p.value,numberFormat='#.##'}"<%};
+}else if (p.dataFormat == 'number2'){
+ df = {%> value="${p.value,numberFormat='0.00'}"<%};
+}else{
+ df = {%> value="${p.value}"<%};
+}
+p.attrs = p.attrs!'' + df;
+
+// 编译属性参数
+form.attrs(p);
+
+%>
diff --git a/modules/core/src/main/resources/views/htmltags/form/listselect.html b/modules/core/src/main/resources/views/htmltags/form/listselect.html
new file mode 100644
index 00000000..8fd98d4a
--- /dev/null
+++ b/modules/core/src/main/resources/views/htmltags/form/listselect.html
@@ -0,0 +1,258 @@
+<%/* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
+ * No deletion without permission, or be held responsible to law. */
+
+/**
+ * 表单控件:列表选择组件
+ * @author ThinkGem
+ * @version 2017-3-5
+ */
+var p = {
+
+ // 标签参数
+ id: id!, // 元素ID
+ path: path!, // 绑定form上model中属性的值
+ name: name!, // 隐藏域名称
+ value: value!, // 隐藏域值
+ defaultValue: defaultValue!,// 隐藏域默认值 v4.1.5
+
+ labelPath: labelPath!, // 绑定form上model中属性的值
+ labelName: labelName!, // 标签框名称
+ labelValue: labelValue!, // 标签框值
+ defaultLabel: defaultLabel!,// 标签框默认值 v4.1.5
+
+ class: class!'', // 标签框的CSS类名
+ placeholder: placeholder!, // 标签框的预期值的提示信息
+ dataMsgRequired: thisTag.attrs['data-msg-required'], // 必填错误提示信息
+
+ btnClass: btnClass!, // 标签框后面的按钮CSS类名
+
+ title: title!text('选项选择'), // 对话框标题
+ boxWidth: boxWidth!'$(js.window).width() - 100', // 对话框宽度
+ boxHeight: boxHeight!'$(js.window).height() - 100', // 对话框高度
+
+ url: url!, // 列表地址,参考EmpUserController的empUserSelect方法
+
+ readonly: readonly!'false', // 是否只读模式
+
+ allowInput: toBoolean(allowInput!false), // 是否允许label框输入
+ allowClear: toBoolean(allowClear!true), // 是否允许清空选择内容
+
+ checkbox: toBoolean(checkbox!false), // 是否显示复选框,是否支持多选,如果设置canSelectParent=true则返回父节点数据
+
+ itemCode: itemCode!, // 选择后结果集中的Code属性名,返回到隐藏域的值
+ itemName: itemName!, // 选择后结果集中的Name属性名,返回到输入框的值
+
+ getSelectDataFuncName: getSelectDataFuncName!'listselectGetSelectData', // 选择页面,获取已经选择的数据,回显到选择页面 v4.1.5
+ setSelectDataFuncName: setSelectDataFuncName!'listselectSetSelectData', // 选择之后,点击确定,将选择数据设置到业务表单 v4.2.0
+
+ openFuncName: openFuncName!'listselectOpen', // 可自定义弹窗前调用的函数名 v4.2.0
+ checkFuncName: checkFuncName!'listselectCheck', // 可自定义验证方法的函数名 v4.2.0
+ callbackFuncName: callbackFuncName!'listselectCallback', // 可自定义回调方法的函数名 v4.1.5
+
+ // 内置参数
+ thisTag: thisTag
+};
+
+// 编译绑定参数
+form.path(p);
+
+// 标签属性编译
+p.labelAttrs = '';
+if (!p.allowInput){
+ p.labelAttrs = p.labelAttrs + ' readonly="readonly"';
+}
+if (isNotBlank(p.dataMsgRequired)){
+ p.labelAttrs = p.labelAttrs + ' data-msg-required="' + p.dataMsgRequired + '"';
+}
+if (isNotBlank(p.placeholder)){
+ p.labelAttrs = p.labelAttrs + ' placeholder="' + p.placeholder + '"';
+}
+
+// 如果没有设置是否显示“清除”按钮开关,则根据class判断是否为必须字段。
+if (allowClear == null && @StringUtils.contains(p.class, 'required')){
+ allowClear = false;
+}
+
+%>
+
\ No newline at end of file
diff --git a/modules/core/src/main/resources/views/htmltags/form/radio.html b/modules/core/src/main/resources/views/htmltags/form/radio.html
new file mode 100644
index 00000000..a0ac87b7
--- /dev/null
+++ b/modules/core/src/main/resources/views/htmltags/form/radio.html
@@ -0,0 +1,72 @@
+<%/* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
+ * No deletion without permission, or be held responsible to law. */
+
+/**
+ * 表单控件:单选按钮
+ * @author ThinkGem
+ * @version 2017-3-5
+ */
+var p = {
+
+ // 标签参数
+ id: id!, // 元素ID,如果不填写,则与name相同
+ path: path!, // 绑定form上model中属性的值
+ name: name!, // 元素名称,不填写
+ value: value!, // 元素值
+ defaultValue: defaultValue!,// 默认值 v4.1.5
+
+ dictType: dictType!, // 字典类型,从字典里获取,自动设置items、itemLabel、itemValue
+
+ items: items!([]), // 列表数据,可接受对象集合,如:List
+ itemLabel: itemLabel!'', // 指定列表数据中的什么属性名作为option的标签名
+ itemValue: itemValue!'', // 指定列表数据中的什么属性名作为option的value值
+
+ readonly: toBoolean(readonly!false), // 是否只读模式 v4.2.0
+
+ blankOption: toBoolean(blankOption!false), // 是否默认有个空白选择项目 v4.2.0
+ blankOptionValue: blankOptionValue!'', // 给空白选择项目设置一个值,默认:空字符串 v4.2.0
+ blankOptionLabel: blankOptionLabel!'全部', // 给空白选择项目设置一个标签,如:请选择、全部 v4.2.0
+
+ // 内置参数
+ thisTag: thisTag,
+ exclAttrs: ['id', 'path', 'name', 'value', 'defaultValue', 'dictType',
+ 'items', 'itemLabel', 'itemValue']
+};
+
+// 编译绑定参数
+form.path(p);
+
+// 编译属性参数
+form.attrs(p);
+
+// 编译集合参数
+form.items(p);
+
+// 如果只读模式,则禁用,并加默认值为value
+if (p.readonly){
+ p.attrs = p.attrs + ' disabled="true"';
+ %> <%
+}else{
+ %> <%
+}
+
+// 输出选项
+var body = {
+ if (p.blankOption){
+ %> ${p.blankOptionLabel} <%
+ }
+ var checked, title;
+ for (var item in p.items){
+ checked = (@ObjectUtils.toString(p.value) == item[p.itemValue] ? ' checked' : '');
+ if (type.name(item) == 'DictData' && isNotBlank(item['description'])){
+ title = ' title="' + item['description'] + '"';
+ }
+ %> ${item[p.itemLabel]} <%
+ }
+};
+
+%>
+
+${body}
diff --git a/modules/core/src/main/resources/views/htmltags/form/select.html b/modules/core/src/main/resources/views/htmltags/form/select.html
new file mode 100644
index 00000000..b4dc0769
--- /dev/null
+++ b/modules/core/src/main/resources/views/htmltags/form/select.html
@@ -0,0 +1,121 @@
+<%/* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
+ * No deletion without permission, or be held responsible to law. */
+
+/**
+ * 表单控件:下拉选择框
+ * @author ThinkGem
+ * @version 2017-3-5
+ */
+var p = {
+
+ // 标签参数
+ id: id!, // 元素ID,如果不填写,则与name相同
+ path: path!, // 绑定form上model中属性的值
+ name: name!, // 元素名称,不填写
+ value: value!, // 元素值
+ defaultValue: defaultValue!,// 默认值 v4.1.5
+
+ dictType: dictType!, // 字典类型,从字典里获取,自动设置items、itemLabel、itemValue
+ // 字典类型加 __all(双下划线+all) 后缀,则显示停用的字典 v4.2.0
+ dictIcon: toBoolean(dictIcon!true), // 是否加载字典里设置的样式,默认true v4.3.3
+ dictStyle: toBoolean(dictStyle!false), // 是否加载字典里设置的样式,默认false v4.3.3
+
+ items: items![], // 列表数据,可接受对象集合,如:List
+ itemLabel: itemLabel!'', // 指定列表数据中的什么属性名作为option的标签名
+ itemValue: itemValue!'', // 指定列表数据中的什么属性名作为option的value值
+ itemStatus: itemStatus!'', // option 的 disabled,如果是字符串类型(0正常,!0禁用)v4.2.0
+
+ multiple: multiple!'false', // 是否为多选框
+
+ readonly: toBoolean(readonly!false), // 是否只读模式 v4.1.7
+
+ blankOption: toBoolean(blankOption!false), // 是否默认有个空白选择项目
+ blankOptionValue: blankOptionValue!'', // 给空白选择项目设置一个值,默认:空字符串 v4.2.0
+ blankOptionLabel: blankOptionLabel!' ', // 给空白选择项目设置一个标签,如:请选择、全部
+ // data-placeholder: '请选择人员信息', // 下拉选择框的提示信息
+
+ // 内置参数
+ thisTag: thisTag,
+ exclAttrs: ['id', 'path', 'name', 'value', 'defaultValue', 'dictType',
+ 'items', 'itemLabel', 'itemValue', 'multiple', 'blankOption']
+};
+
+// 编译绑定参数
+form.path(p);
+
+// 编译属性参数
+form.attrs(p);
+
+// 编译集合参数
+form.items(p);
+
+// 是否是多选下拉框
+if (toBoolean(p.multiple)){
+ p.attrs = p.attrs + ' multiple="true" data-close-on-select="false"';
+}
+
+// 转换为字符串数组
+if (p.multiple == 'true' && type.name(p.value) == 'String'){
+ // p.value = @ObjectUtils.toString(p.value); 一定是字符串,无需转换
+ p.value = @StringUtils.split(p.value, ',');
+}
+
+// 加一个 type="hidden" 当不选择任何东西的时候,使用该默认值,否则发送null则不会被执行update
+if (p.multiple == 'true' || p.readonly){
+ // 如果只读模式,则禁用,并加默认值为value
+ if (p.readonly){
+ p.attrs = p.attrs + ' disabled="true"';
+ if (p.multiple == 'true'){
+ for (var val in p.value!){
+ %> <%
+ }elsefor{
+ %> <%
+ }
+ }else{
+ %> <%
+ }
+ }else{
+ %> <%
+ }
+}
+
+// 输出下拉选项
+var body = {
+ if (p.blankOption && p.multiple != 'true'){
+ %>${p.blankOptionLabel} <%
+ }
+ for (var item in p.items){
+ var iv = @ObjectUtils.toString(@ReflectUtils.invokeGetter(item, p.itemValue));
+ var il = @ObjectUtils.toString(@ReflectUtils.invokeGetter(item, p.itemLabel));
+ var attr = '';
+ if (p.multiple == 'true'){
+ attr = attr + (@StringUtils.inString(iv, p.value) ? ' selected' : '');
+ }else{
+ attr = attr + (@ObjectUtils.toString(p.value) == iv ? ' selected' : '');
+ }
+ if (type.name(item) == 'DictData'){
+ if (isNotBlank(item['description'])){
+ attr = attr + ' title="' + item['description'] + '"';
+ }
+ if (p.dictIcon && isNotBlank(item['dictIcon'])){
+ attr = attr + ' data-icon="' + item.dictIcon + '"';
+ }
+ if (p.dictStyle && isNotBlank(item['cssStyle'])){
+ attr = attr + ' style="' + item.cssStyle + '"';
+ }
+ if (p.dictStyle && isNotBlank(item['cssClass'])){
+ attr = attr + ' class="' + item.cssClass + '"';
+ }
+ if (isBlank(p.itemStatus)){
+ p.itemStatus = 'status';
+ }
+ }
+ if (isNotBlank(p.itemStatus) && isNotBlank(item[p.itemStatus])){
+ attr = attr + (@ObjectUtils.toString(item[p.itemStatus]) != '0' ? ' disabled' : '');
+ }
+ %>${il} <%
+ }
+};
+%>
+
+${body}
\ No newline at end of file
diff --git a/modules/core/src/main/resources/views/htmltags/form/textarea.html b/modules/core/src/main/resources/views/htmltags/form/textarea.html
new file mode 100644
index 00000000..66ade9d5
--- /dev/null
+++ b/modules/core/src/main/resources/views/htmltags/form/textarea.html
@@ -0,0 +1,29 @@
+<%/* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
+ * No deletion without permission, or be held responsible to law. */
+
+/**
+ * 表单控件:文本域
+ * @author ThinkGem
+ * @version 2017-3-5
+ */
+var p = {
+
+ // 标签参数
+ id: id!, // 元素ID,如果不填写,则与name相同
+ path: path!, // 绑定form上model中属性的值
+ name: name!, // 元素名称,不填写
+ value: value!, // 元素值
+ defaultValue: defaultValue!,// 默认值 v4.1.5
+
+ // 内置参数
+ thisTag: thisTag,
+ exclAttrs: ['id', 'path', 'name', 'value', 'defaultValue', 'type']
+};
+
+// 编译绑定参数
+form.path(p);
+
+// 编译属性参数
+form.attrs(p);
+
+%>
diff --git a/modules/core/src/main/resources/views/htmltags/form/treeselect.html b/modules/core/src/main/resources/views/htmltags/form/treeselect.html
new file mode 100644
index 00000000..9cac5b84
--- /dev/null
+++ b/modules/core/src/main/resources/views/htmltags/form/treeselect.html
@@ -0,0 +1,250 @@
+<%/* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
+ * No deletion without permission, or be held responsible to law. */
+
+/**
+ * 表单控件:树结构选择框
+ * @author ThinkGem
+ * @version 2017-3-5
+ */
+var p = {
+
+ // 标签参数
+ id: id!, // 元素ID
+ path: path!, // 绑定form上model中属性的值
+ name: name!, // 隐藏域名称
+ value: value!, // 隐藏域值
+ defaultValue: defaultValue!,// 隐藏域默认值 v4.1.5
+
+ labelPath: labelPath!, // 绑定form上model中属性的值
+ labelName: labelName!, // 标签框名称
+ labelValue: labelValue!, // 标签框值
+ defaultLabel: defaultLabel!,// 标签框默认值 v4.1.5
+
+ class: class!'', // 标签框的CSS类名
+ placeholder: placeholder!, // 标签框的预期值的提示信息
+ dataMsgRequired: thisTag.attrs['data-msg-required'], // 必填错误提示信息
+
+ btnClass: btnClass!, // 标签框后面的按钮CSS类名
+
+ title: title!text('选项选择'), // 对话框标题
+ boxWidth: boxWidth!300, // 对话框宽度,默认300像素
+ boxHeight: boxHeight!400, // 对话框高度,默认400像素
+
+ url: url!, // 树结构,数据源地址 [{id, pid, name}]
+
+ readonly: readonly!'false', // 是否只读模式
+
+ allowInput: toBoolean(allowInput!false), // 是否允许label框输入
+ allowClear: toBoolean(allowClear!true), // 是否允许清空选择内容
+
+ checkbox: toBoolean(checkbox!false), // 是否显示复选框,是否支持多选,如果设置canSelectParent=true则返回父节点数据
+ chkboxType: chkboxType!'', // 复选框级联选择规则 v4.0.6,默认:{'Y':'ps','N':'ps'}
+ expandLevel: @ObjectUtils.toInteger(expandLevel!(-1)), // 默认展开层次级别(默认:如果有1个根节点,则展开一级节点,否则不展开)
+
+ canSelectRoot: toBoolean(canSelectRoot!false), // 可以选择跟节点
+ canSelectParent: toBoolean(canSelectParent!false), // 可以选择父级节点
+
+ isReturnValue: isReturnValue!'false', // 是否返回树结构的value值,而不是返回id(默认id)
+
+ returnFullName: toBoolean(returnFullName!false), // 是否返回全路径,包含所有上级信息,以 returnFullNameSplit 参数分隔
+ returnFullNameSplit: returnFullNameSplit!'/', // 是否返回全路径,的分隔符,默认“/”
+
+ fastSearch: toBoolean(allowClear!true), // 快速查询,查询框输入后接着进行查询,关闭后,点击查询按钮或回车再查询 v4.5.0 v5.0.2
+
+ openFuncName: openFuncName!'treeselectOpen', // 可自定义弹窗前调用的函数名 v4.2.0
+ checkFuncName: checkFuncName!'treeselectCheck', // 可自定义验证方法的函数名 v4.1.5
+ callbackFuncName: callbackFuncName!'treeselectCallback', // 可自定义回调方法的函数名 v4.1.0
+
+ // 内置参数
+ thisTag: thisTag
+};
+
+// 编译绑定参数
+form.path(p);
+
+// 标签属性编译
+p.labelAttrs = '';
+if (!p.allowInput){
+ p.labelAttrs = p.labelAttrs + ' readonly="readonly"';
+}
+if (isNotBlank(p.dataMsgRequired)){
+ p.labelAttrs = p.labelAttrs + ' data-msg-required="' + p.dataMsgRequired + '"';
+}
+if (isNotBlank(p.placeholder)){
+ p.labelAttrs = p.labelAttrs + ' placeholder="' + p.placeholder + '"';
+}
+
+// 如果没有设置是否显示“清除”按钮开关,则根据class判断是否为必须字段。
+if (allowClear! == null && @StringUtils.contains(p.class, 'required')){
+ p.allowClear = false;
+}
+
+%>
+
\ No newline at end of file
diff --git a/modules/core/src/main/resources/views/htmltags/form/ueditor.html b/modules/core/src/main/resources/views/htmltags/form/ueditor.html
new file mode 100644
index 00000000..08584f72
--- /dev/null
+++ b/modules/core/src/main/resources/views/htmltags/form/ueditor.html
@@ -0,0 +1,174 @@
+<%/* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
+ * No deletion without permission, or be held responsible to law. */
+
+/**
+ * 表单控件:输入框
+ * @author ThinkGem
+ * @version 2017-3-5
+ */
+var p = {
+
+ // 标签参数
+ id: id!, // 元素ID,如果不填写,则与name相同
+ path: path!, // 绑定form上model中属性的值
+ name: name!, // 元素名称,不填写
+ value: value!, // 元素值
+ defaultValue: defaultValue!,// 默认值 v4.1.5
+
+ class: class!'', // 标签框的CSS类名,设置 required 加入必填验证
+
+ maxlength: maxlength!'', // 编辑器最大输入字数,为空代表无限制
+ height: height!'200', // 编辑器的高度,默认200
+ maxHeight: maxHeight!, // 编辑器的最大高度
+
+ simpleToolbars: toBoolean(simpleToolbars!false), // 是否是简单的工具条
+
+ readonly: toBoolean(readonly!false), // 是否只读模式
+
+ outline: toBoolean(outline!false), // 大纲视图
+
+ options: options!'', // UE附加选项,逗号隔开。
+
+ // 内置参数
+ thisTag: thisTag
+};
+
+// 编译绑定参数
+form.path(p);
+
+%>
+<% if(p.outline){ %>
+
+<% }else{ %>
+
+
+<% } %>
+
\ No newline at end of file
diff --git a/modules/core/src/main/resources/views/htmltags/form/validcode.html b/modules/core/src/main/resources/views/htmltags/form/validcode.html
new file mode 100644
index 00000000..0d1141a9
--- /dev/null
+++ b/modules/core/src/main/resources/views/htmltags/form/validcode.html
@@ -0,0 +1,66 @@
+<%/* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
+ * No deletion without permission, or be held responsible to law. */
+
+/**
+ * 表单控件:验证码输入框
+ * @author ThinkGem
+ * @version 2017-3-5
+ */
+var p = {
+
+ id: id!name, // 验证码输入框ID
+ name: name!, // 验证码输入框名称(必填)
+
+ isRequired: toBoolean(isRequired!true), // 是否必填,默认必填
+ dataMsgRequired: thisTag.attrs['data-msg-required'], // 必填错误提示信息
+
+ isRemote: toBoolean(isRemote!true), // 是否支持实时远程验证
+ dataMsgRemote: thisTag.attrs['data-msg-remote'], // 必填错误提示信息
+
+ isLazy: toBoolean(isLazy!false), // 是否懒加载验证码图片,原noRefresh参数
+
+ label: label!text('验证码'), // 控件的标签(V4.2.2)
+ isShowLabel: toBoolean(isShowLabel!true), // 是否显示“验证码”标签,默认true(V4.0.5)
+
+ // 内置参数
+ thisTag: thisTag
+};
+
+// 必填属性HTML
+var require = {
+ if (p.isRequired){
+ %> required="true" data-msg-required="${p.dataMsgRequired!text('请填写验证码')}"<%
+ }
+};
+
+// 远程验证HTML
+var remote = {
+ if (p.isRemote){
+ %> remote="${ctxPath}/validCode" data-msg-remote="${p.dataMsgRemote!text('验证码不正确.')}"<%
+ }
+};
+
+%>
+
+
diff --git a/modules/core/src/main/resources/views/tagsview/form/iconselect.html b/modules/core/src/main/resources/views/tagsview/form/iconselect.html
new file mode 100644
index 00000000..a4be1910
--- /dev/null
+++ b/modules/core/src/main/resources/views/tagsview/form/iconselect.html
@@ -0,0 +1,2459 @@
+<%/* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
+ * No deletion without permission, or be held responsible to law. */ %>
+<% layout('/layouts/default.html', {title: '图标选择', bodyClass: 'box box-main', libs: ['zTree']}){ %>
+
+
+
+
+
+
+
+
+
+ icon-user-following
+
+
+
+ icon-user-unfollow
+
+
+
+ icon-location-pin
+
+
+
+ icon-options-vertical
+
+
+
+ icon-arrow-up-circle
+
+
+
+ icon-arrow-left-circle
+
+
+
+ icon-arrow-right-circle
+
+
+
+ icon-arrow-down-circle
+
+
+
+ icon-organization
+
+
+
+ icon-screen-smartphone
+
+
+
+ icon-screen-desktop
+
+
+
+ icon-screen-tablet
+
+
+
+ icon-game-controller
+
+
+
+ icon-envelope-open
+
+
+
+ icon-envelope-letter
+
+
+
+ icon-basket-loaded
+
+
+
+ icon-size-fullscreen
+
+
+
+ icon-music-tone-alt
+
+
+
+ icon-earphones-alt
+
+
+
+ icon-control-start
+
+
+
+ icon-control-rewind
+
+
+
+ icon-control-play
+
+
+
+ icon-control-pause
+
+
+
+ icon-control-forward
+
+
+
+ icon-cloud-download
+
+
+
+ icon-cloud-upload
+
+
+
+ icon-magnifier-add
+
+
+
+ icon-magnifier-remove
+
+
+
+ icon-symbol-female
+
+
+
+ icon-social-tumblr
+
+
+
+ icon-social-twitter
+
+
+
+ icon-social-facebook
+
+
+
+ icon-social-instagram
+
+
+
+ icon-social-linkedin
+
+
+
+ icon-social-pinterest
+
+
+
+ icon-social-github
+
+
+
+ icon-social-google
+
+
+
+ icon-social-reddit
+
+
+
+ icon-social-skype
+
+
+
+ icon-social-dribbble
+
+
+
+ icon-social-behance
+
+
+
+ icon-social-foursqare
+
+
+
+ icon-social-soundcloud
+
+
+
+ icon-social-spotify
+
+
+
+ icon-social-stumbleupon
+
+
+
+ icon-social-youtube
+
+
+
+ icon-social-dropbox
+
+
+
+ icon-social-vkontakte
+
+
+
+ icon-social-steam
+
+
+
+
+
+
+
+
+
fa-adjust
+
+
fa-anchor
+
fa-archive
+
fa-area-chart
+
fa-arrows
+
fa-arrows-h
+
fa-arrows-v
+
fa-asl-interpreting
+ (alias)
+
fa-assistive-listening-systems
+
fa-asterisk
+
fa-at
+
fa-audio-description
+
fa-automobile
+ (alias)
+
fa-balance-scale
+
fa-ban
+
fa-bank
+ (alias)
+
fa-bar-chart
+
fa-bar-chart-o
+ (alias)
+
fa-barcode
+
fa-bars
+
fa-battery-0
+ (alias)
+
fa-battery-1
+ (alias)
+
fa-battery-2
+ (alias)
+
fa-battery-3
+ (alias)
+
fa-battery-4
+ (alias)
+
fa-battery-empty
+
fa-battery-full
+
fa-battery-half
+
fa-battery-quarter
+
fa-battery-three-quarters
+
fa-bed
+
fa-beer
+
fa-bell
+
fa-bell-o
+
fa-bell-slash
+
fa-bell-slash-o
+
fa-bicycle
+
fa-binoculars
+
fa-birthday-cake
+
fa-blind
+
fa-bluetooth
+
fa-bluetooth-b
+
fa-bolt
+
fa-bomb
+
fa-book
+
fa-bookmark
+
fa-bookmark-o
+
fa-braille
+
fa-briefcase
+
fa-bug
+
fa-building
+
fa-building-o
+
fa-bullhorn
+
fa-bullseye
+
fa-bus
+
fa-cab
+ (alias)
+
fa-calculator
+
fa-calendar
+
fa-calendar-check-o
+
fa-calendar-minus-o
+
fa-calendar-o
+
fa-calendar-plus-o
+
fa-calendar-times-o
+
fa-camera
+
fa-camera-retro
+
fa-car
+
fa-caret-square-o-down
+
fa-caret-square-o-left
+
fa-caret-square-o-right
+
fa-caret-square-o-up
+
fa-cart-arrow-down
+
fa-cart-plus
+
fa-cc
+
fa-certificate
+
fa-check
+
fa-check-circle
+
fa-check-circle-o
+
fa-check-square
+
fa-check-square-o
+
fa-child
+
fa-circle
+
fa-circle-o
+
fa-circle-o-notch
+
fa-circle-thin
+
fa-clock-o
+
fa-clone
+
fa-close
+ (alias)
+
fa-cloud
+
fa-cloud-download
+
fa-cloud-upload
+
fa-code
+
fa-code-fork
+
fa-coffee
+
fa-cog
+
fa-cogs
+
fa-comment
+
fa-comment-o
+
fa-commenting
+
fa-commenting-o
+
fa-comments
+
fa-comments-o
+
fa-compass
+
fa-copyright
+
fa-creative-commons
+
fa-credit-card
+
fa-credit-card-alt
+
fa-crop
+
fa-crosshairs
+
fa-cube
+
fa-cubes
+
fa-cutlery
+
fa-dashboard
+ (alias)
+
fa-database
+
fa-deaf
+
fa-deafness
+ (alias)
+
fa-desktop
+
fa-diamond
+
fa-dot-circle-o
+
fa-download
+
fa-edit
+ (alias)
+
fa-ellipsis-h
+
fa-ellipsis-v
+
fa-envelope
+
fa-envelope-o
+
fa-envelope-square
+
fa-eraser
+
fa-exchange
+
fa-exclamation
+
fa-exclamation-circle
+
fa-exclamation-triangle
+
fa-external-link
+
fa-external-link-square
+
fa-eye
+
fa-eye-slash
+
fa-eyedropper
+
fa-fax
+
fa-feed
+ (alias)
+
fa-female
+
fa-fighter-jet
+
fa-file-archive-o
+
fa-file-audio-o
+
fa-file-code-o
+
fa-file-excel-o
+
fa-file-image-o
+
fa-file-movie-o
+ (alias)
+
fa-file-pdf-o
+
fa-file-photo-o
+ (alias)
+
fa-file-picture-o
+ (alias)
+
fa-file-powerpoint-o
+
fa-file-sound-o
+ (alias)
+
fa-file-video-o
+
fa-file-word-o
+
fa-file-zip-o
+ (alias)
+
fa-film
+
fa-filter
+
fa-fire
+
fa-fire-extinguisher
+
fa-flag
+
fa-flag-checkered
+
fa-flag-o
+
fa-flash
+ (alias)
+
fa-flask
+
fa-folder
+
fa-folder-o
+
fa-folder-open
+
fa-folder-open-o
+
fa-frown-o
+
fa-futbol-o
+
fa-gamepad
+
fa-gavel
+
fa-gear
+ (alias)
+
fa-gears
+ (alias)
+
fa-gift
+
fa-glass
+
fa-globe
+
fa-graduation-cap
+
fa-group
+ (alias)
+
fa-hand-grab-o
+ (alias)
+
fa-hand-lizard-o
+
fa-hand-paper-o
+
fa-hand-peace-o
+
fa-hand-pointer-o
+
fa-hand-rock-o
+
fa-hand-scissors-o
+
fa-hand-spock-o
+
fa-hand-stop-o
+ (alias)
+
fa-hard-of-hearing
+ (alias)
+
fa-hashtag
+
fa-hdd-o
+
fa-headphones
+
fa-heart
+
fa-heart-o
+
fa-heartbeat
+
fa-history
+
fa-home
+
fa-hotel
+ (alias)
+
fa-hourglass
+
fa-hourglass-1
+ (alias)
+
fa-hourglass-2
+ (alias)
+
fa-hourglass-3
+ (alias)
+
fa-hourglass-end
+
fa-hourglass-half
+
fa-hourglass-o
+
fa-hourglass-start
+
fa-i-cursor
+
fa-image
+ (alias)
+
fa-inbox
+
fa-industry
+
fa-info
+
fa-info-circle
+
fa-institution
+ (alias)
+
fa-key
+
fa-keyboard-o
+
fa-language
+
fa-laptop
+
fa-leaf
+
fa-legal
+ (alias)
+
fa-lemon-o
+
fa-level-down
+
fa-level-up
+
fa-life-bouy
+ (alias)
+
fa-life-buoy
+ (alias)
+
fa-life-ring
+
fa-life-saver
+ (alias)
+
fa-lightbulb-o
+
fa-line-chart
+
fa-location-arrow
+
fa-lock
+
fa-low-vision
+
fa-magic
+
fa-magnet
+
fa-mail-forward
+ (alias)
+
fa-mail-reply
+ (alias)
+
fa-mail-reply-all
+ (alias)
+
fa-male
+
fa-map
+
fa-map-marker
+
fa-map-o
+
fa-map-pin
+
fa-map-signs
+
fa-meh-o
+
fa-microphone
+
fa-microphone-slash
+
fa-minus
+
fa-minus-circle
+
fa-minus-square
+
fa-minus-square-o
+
fa-mobile
+
fa-mobile-phone
+ (alias)
+
fa-money
+
fa-moon-o
+
fa-mortar-board
+ (alias)
+
fa-motorcycle
+
fa-mouse-pointer
+
fa-music
+
fa-navicon
+ (alias)
+
fa-newspaper-o
+
fa-object-group
+
fa-object-ungroup
+
fa-paint-brush
+
fa-paper-plane
+
fa-paper-plane-o
+
fa-paw
+
fa-pencil
+
fa-pencil-square
+
fa-pencil-square-o
+
fa-percent
+
fa-phone
+
fa-phone-square
+
fa-photo
+ (alias)
+
fa-picture-o
+
fa-pie-chart
+
fa-plane
+
fa-plug
+
fa-plus
+
fa-plus-circle
+
fa-plus-square
+
fa-plus-square-o
+
fa-power-off
+
fa-print
+
fa-puzzle-piece
+
fa-qrcode
+
fa-question
+
fa-question-circle
+
fa-question-circle-o
+
fa-quote-left
+
fa-quote-right
+
fa-random
+
fa-recycle
+
fa-refresh
+
fa-registered
+
fa-remove
+ (alias)
+
fa-reorder
+ (alias)
+
fa-reply
+
fa-reply-all
+
fa-retweet
+
fa-road
+
fa-rocket
+
fa-rss
+
fa-rss-square
+
fa-search
+
fa-search-minus
+
fa-search-plus
+
fa-send
+ (alias)
+
fa-send-o
+ (alias)
+
fa-server
+
fa-share
+
fa-share-alt
+
fa-share-alt-square
+
fa-share-square
+
fa-share-square-o
+
fa-shield
+
fa-ship
+
fa-shopping-bag
+
fa-shopping-basket
+
fa-shopping-cart
+
fa-sign-in
+
fa-sign-language
+
fa-sign-out
+
fa-signal
+
fa-signing
+ (alias)
+
fa-sitemap
+
fa-sliders
+
fa-smile-o
+
fa-soccer-ball-o
+ (alias)
+
fa-sort
+
fa-sort-alpha-asc
+
fa-sort-alpha-desc
+
fa-sort-amount-asc
+
fa-sort-amount-desc
+
fa-sort-asc
+
fa-sort-desc
+
fa-sort-down
+ (alias)
+
fa-sort-numeric-asc
+
fa-sort-numeric-desc
+
fa-sort-up
+ (alias)
+
fa-space-shuttle
+
fa-spinner
+
fa-spoon
+
fa-square
+
fa-square-o
+
fa-star
+
fa-star-half
+
fa-star-half-empty
+ (alias)
+
fa-star-half-full
+ (alias)
+
fa-star-half-o
+
fa-star-o
+
fa-sticky-note
+
fa-sticky-note-o
+
fa-street-view
+
fa-suitcase
+
fa-sun-o
+
fa-support
+ (alias)
+
fa-tablet
+
fa-tachometer
+
fa-tag
+
fa-tags
+
fa-tasks
+
fa-taxi
+
fa-television
+
fa-terminal
+
fa-thumb-tack
+
fa-thumbs-down
+
fa-thumbs-o-down
+
fa-thumbs-o-up
+
fa-thumbs-up
+
fa-ticket
+
fa-times
+
fa-times-circle
+
fa-times-circle-o
+
fa-tint
+
fa-toggle-down
+ (alias)
+
fa-toggle-left
+ (alias)
+
fa-toggle-off
+
fa-toggle-on
+
fa-toggle-right
+ (alias)
+
fa-toggle-up
+ (alias)
+
fa-trademark
+
fa-trash
+
fa-trash-o
+
fa-tree
+
fa-trophy
+
fa-truck
+
fa-tty
+
fa-tv
+ (alias)
+
fa-umbrella
+
fa-universal-access
+
fa-university
+
fa-unlock
+
fa-unlock-alt
+
fa-unsorted
+ (alias)
+
fa-upload
+
fa-user
+
fa-user-plus
+
fa-user-secret
+
fa-user-times
+
fa-users
+
fa-video-camera
+
fa-volume-control-phone
+
fa-volume-down
+
fa-volume-off
+
fa-volume-up
+
fa-warning
+ (alias)
+
fa-wheelchair
+
fa-wheelchair-alt
+
fa-wifi
+
fa-wrench
+
+
+
+
+
+
fa-asl-interpreting
+ (alias)
+
fa-assistive-listening-systems
+
fa-audio-description
+
fa-blind
+
fa-braille
+
fa-cc
+
fa-deaf
+
fa-deafness
+ (alias)
+
fa-hard-of-hearing
+ (alias)
+
fa-low-vision
+
fa-question-circle-o
+
fa-sign-language
+
fa-signing
+ (alias)
+
fa-tty
+
fa-universal-access
+
fa-volume-control-phone
+
fa-wheelchair
+
fa-wheelchair-alt
+
+
+
+
+
fa-hand-grab-o
+ (alias)
+
fa-hand-lizard-o
+
fa-hand-o-down
+
fa-hand-o-left
+
fa-hand-o-right
+
fa-hand-o-up
+
fa-hand-paper-o
+
fa-hand-peace-o
+
fa-hand-pointer-o
+
fa-hand-rock-o
+
fa-hand-scissors-o
+
fa-hand-spock-o
+
fa-hand-stop-o
+ (alias)
+
fa-thumbs-down
+
fa-thumbs-o-down
+
fa-thumbs-o-up
+
fa-thumbs-up
+
+
+
+
+
fa-ambulance
+
fa-automobile
+ (alias)
+
fa-bicycle
+
fa-bus
+
fa-cab
+ (alias)
+
fa-car
+
fa-fighter-jet
+
fa-motorcycle
+
fa-plane
+
fa-rocket
+
fa-ship
+
fa-space-shuttle
+
fa-subway
+
fa-taxi
+
fa-train
+
fa-truck
+
fa-wheelchair
+
fa-wheelchair-alt
+
+
+
+
+
fa-genderless
+
fa-intersex
+ (alias)
+
fa-mars
+
fa-mars-double
+
fa-mars-stroke
+
fa-mars-stroke-h
+
fa-mars-stroke-v
+
fa-mercury
+
fa-neuter
+
fa-transgender
+
fa-transgender-alt
+
fa-venus
+
fa-venus-double
+
fa-venus-mars
+
+
+
+
+
fa-file
+
fa-file-archive-o
+
fa-file-audio-o
+
fa-file-code-o
+
fa-file-excel-o
+
fa-file-image-o
+
fa-file-movie-o
+ (alias)
+
fa-file-o
+
fa-file-pdf-o
+
fa-file-photo-o
+ (alias)
+
fa-file-picture-o
+ (alias)
+
fa-file-powerpoint-o
+
fa-file-sound-o
+ (alias)
+
fa-file-text
+
fa-file-text-o
+
fa-file-video-o
+
fa-file-word-o
+
fa-file-zip-o
+ (alias)
+
+
+
+
+
+
fa-circle-o-notch
+
fa-cog
+
fa-gear
+ (alias)
+
fa-refresh
+
fa-spinner
+
+
+
+
+
+
fa-cc-amex
+
fa-cc-diners-club
+
fa-cc-discover
+
fa-cc-jcb
+
fa-cc-mastercard
+
fa-cc-paypal
+
fa-cc-stripe
+
fa-cc-visa
+
fa-credit-card
+
fa-credit-card-alt
+
fa-google-wallet
+
fa-paypal
+
+
+
+
+
fa-area-chart
+
fa-bar-chart
+
fa-bar-chart-o
+ (alias)
+
fa-line-chart
+
fa-pie-chart
+
+
+
+
+
fa-bitcoin
+ (alias)
+
fa-btc
+
fa-cny
+ (alias)
+
fa-dollar
+ (alias)
+
fa-eur
+
fa-euro
+ (alias)
+
fa-gbp
+
fa-gg
+
fa-gg-circle
+
fa-ils
+
fa-inr
+
fa-jpy
+
fa-krw
+
fa-money
+
fa-rmb
+ (alias)
+
fa-rouble
+ (alias)
+
fa-rub
+
fa-ruble
+ (alias)
+
fa-rupee
+ (alias)
+
fa-shekel
+ (alias)
+
fa-sheqel
+ (alias)
+
fa-try
+
fa-turkish-lira
+ (alias)
+
fa-usd
+
fa-won
+ (alias)
+
fa-yen
+ (alias)
+
+
+
+
+
+
fa-align-center
+
fa-align-justify
+
fa-align-left
+
fa-align-right
+
fa-bold
+
fa-chain
+ (alias)
+
fa-chain-broken
+
fa-clipboard
+
fa-columns
+
fa-copy
+ (alias)
+
fa-cut
+ (alias)
+
fa-dedent
+ (alias)
+
fa-eraser
+
fa-file
+
fa-file-o
+
fa-file-text
+
fa-file-text-o
+
fa-files-o
+
fa-floppy-o
+
fa-font
+
fa-header
+
fa-indent
+
fa-italic
+
fa-link
+
fa-list
+
fa-list-alt
+
fa-list-ol
+
fa-list-ul
+
fa-outdent
+
fa-paperclip
+
fa-paragraph
+
fa-paste
+ (alias)
+
fa-repeat
+
fa-rotate-left
+ (alias)
+
fa-rotate-right
+ (alias)
+
fa-save
+ (alias)
+
fa-scissors
+
fa-strikethrough
+
fa-subscript
+
fa-superscript
+
fa-table
+
fa-text-height
+
fa-text-width
+
fa-th
+
fa-th-large
+
fa-th-list
+
fa-underline
+
fa-undo
+
fa-unlink
+ (alias)
+
+
+
+
+
+
fa-angle-double-down
+
fa-angle-double-left
+
fa-angle-double-right
+
fa-angle-double-up
+
fa-angle-down
+
fa-angle-left
+
fa-angle-right
+
fa-angle-up
+
fa-arrow-circle-down
+
fa-arrow-circle-left
+
fa-arrow-circle-o-down
+
fa-arrow-circle-o-left
+
fa-arrow-circle-o-right
+
fa-arrow-circle-o-up
+
fa-arrow-circle-right
+
fa-arrow-circle-up
+
fa-arrow-down
+
fa-arrow-left
+
fa-arrow-right
+
fa-arrow-up
+
fa-arrows
+
fa-arrows-alt
+
fa-arrows-h
+
fa-arrows-v
+
fa-caret-down
+
fa-caret-left
+
fa-caret-right
+
fa-caret-square-o-down
+
fa-caret-square-o-left
+
fa-caret-square-o-right
+
fa-caret-square-o-up
+
fa-caret-up
+
fa-chevron-circle-down
+
fa-chevron-circle-left
+
fa-chevron-circle-right
+
fa-chevron-circle-up
+
fa-chevron-down
+
fa-chevron-left
+
fa-chevron-right
+
fa-chevron-up
+
fa-exchange
+
fa-hand-o-down
+
fa-hand-o-left
+
fa-hand-o-right
+
fa-hand-o-up
+
fa-long-arrow-down
+
fa-long-arrow-left
+
fa-long-arrow-right
+
fa-long-arrow-up
+
fa-toggle-down
+ (alias)
+
fa-toggle-left
+ (alias)
+
fa-toggle-right
+ (alias)
+
fa-toggle-up
+ (alias)
+
+
+
+
+
+
fa-arrows-alt
+
fa-backward
+
fa-compress
+
fa-eject
+
fa-expand
+
fa-fast-backward
+
fa-fast-forward
+
fa-forward
+
fa-pause
+
fa-pause-circle
+
fa-pause-circle-o
+
fa-play
+
fa-play-circle
+
fa-play-circle-o
+
fa-random
+
fa-step-backward
+
fa-step-forward
+
fa-stop
+
fa-stop-circle
+
fa-stop-circle-o
+
fa-youtube-play
+
+
+
+
+
fa-500px
+
fa-adn
+
fa-amazon
+
fa-android
+
fa-angellist
+
fa-apple
+
fa-behance
+
fa-behance-square
+
fa-bitbucket
+
fa-bitbucket-square
+
fa-bitcoin
+ (alias)
+
fa-black-tie
+
fa-bluetooth
+
fa-bluetooth-b
+
fa-btc
+
fa-buysellads
+
fa-cc-amex
+
fa-cc-diners-club
+
fa-cc-discover
+
fa-cc-jcb
+
fa-cc-mastercard
+
fa-cc-paypal
+
fa-cc-stripe
+
fa-cc-visa
+
fa-chrome
+
fa-codepen
+
fa-codiepie
+
fa-connectdevelop
+
fa-contao
+
fa-css3
+
fa-dashcube
+
fa-delicious
+
fa-deviantart
+
fa-digg
+
fa-dribbble
+
fa-dropbox
+
fa-drupal
+
fa-edge
+
fa-empire
+
fa-envira
+
fa-expeditedssl
+
fa-fa
+ (alias)
+
fa-facebook
+
fa-facebook-f
+ (alias)
+
fa-facebook-official
+
fa-facebook-square
+
fa-firefox
+
fa-first-order
+
fa-flickr
+
fa-font-awesome
+
fa-fonticons
+
fa-fort-awesome
+
fa-forumbee
+
fa-foursquare
+
fa-ge
+ (alias)
+
fa-get-pocket
+
fa-gg
+
fa-gg-circle
+
fa-git
+
fa-git-square
+
fa-github
+
fa-github-alt
+
fa-github-square
+
fa-gitlab
+
fa-gittip
+ (alias)
+
fa-glide
+
fa-glide-g
+
fa-google
+
fa-google-plus
+
fa-google-plus-circle
+ (alias)
+
fa-google-plus-official
+
fa-google-plus-square
+
fa-google-wallet
+
fa-gratipay
+
fa-hacker-news
+
fa-houzz
+
fa-html5
+
fa-instagram
+
fa-internet-explorer
+
fa-ioxhost
+
fa-joomla
+
fa-jsfiddle
+
fa-lastfm
+
fa-lastfm-square
+
fa-leanpub
+
fa-linkedin
+
fa-linkedin-square
+
fa-linux
+
fa-maxcdn
+
fa-meanpath
+
fa-medium
+
fa-mixcloud
+
fa-modx
+
fa-odnoklassniki
+
fa-odnoklassniki-square
+
fa-opencart
+
fa-openid
+
fa-opera
+
fa-optin-monster
+
fa-pagelines
+
fa-paypal
+
fa-pied-piper
+
fa-pied-piper-alt
+
fa-pied-piper-pp
+
fa-pinterest
+
fa-pinterest-p
+
fa-pinterest-square
+
fa-product-hunt
+
fa-qq
+
fa-ra
+ (alias)
+
fa-rebel
+
fa-reddit
+
fa-reddit-alien
+
fa-reddit-square
+
fa-renren
+
fa-resistance
+ (alias)
+
fa-safari
+
fa-scribd
+
fa-sellsy
+
fa-share-alt
+
fa-share-alt-square
+
fa-shirtsinbulk
+
fa-simplybuilt
+
fa-skyatlas
+
fa-skype
+
fa-slack
+
fa-slideshare
+
fa-snapchat
+
fa-snapchat-ghost
+
fa-snapchat-square
+
fa-soundcloud
+
fa-spotify
+
fa-stack-exchange
+
fa-stack-overflow
+
fa-steam
+
fa-steam-square
+
fa-stumbleupon
+
fa-stumbleupon-circle
+
fa-tencent-weibo
+
fa-themeisle
+
fa-trello
+
fa-tripadvisor
+
fa-tumblr
+
fa-tumblr-square
+
fa-twitch
+
fa-twitter
+
fa-twitter-square
+
fa-usb
+
fa-viacoin
+
fa-viadeo
+
fa-viadeo-square
+
fa-vimeo
+
fa-vimeo-square
+
fa-vine
+
fa-vk
+
fa-wechat
+ (alias)
+
fa-weibo
+
fa-weixin
+
fa-whatsapp
+
fa-wikipedia-w
+
fa-windows
+
fa-wordpress
+
fa-wpbeginner
+
fa-wpforms
+
fa-xing
+
fa-xing-square
+
fa-y-combinator
+
fa-y-combinator-square
+ (alias)
+
fa-yahoo
+
fa-yc
+ (alias)
+
fa-yc-square
+ (alias)
+
fa-yelp
+
fa-yoast
+
fa-youtube
+
fa-youtube-play
+
fa-youtube-square
+
+
+
+
+
fa-ambulance
+
fa-h-square
+
fa-heart
+
fa-heart-o
+
fa-heartbeat
+
fa-hospital-o
+
fa-medkit
+
fa-plus-square
+
fa-stethoscope
+
fa-user-md
+
fa-wheelchair
+
fa-wheelchair-alt
+
+
+
+
+
+<% } %>
+
\ No newline at end of file
diff --git a/modules/core/src/main/resources/views/tagsview/form/imageclip.html b/modules/core/src/main/resources/views/tagsview/form/imageclip.html
new file mode 100644
index 00000000..e4e3085f
--- /dev/null
+++ b/modules/core/src/main/resources/views/tagsview/form/imageclip.html
@@ -0,0 +1,159 @@
+<%/* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
+ * No deletion without permission, or be held responsible to law. */ %>
+<% layout('/layouts/default.html', {title: '图标裁剪', bodyClass: 'nobg', libs: ['']}){ %>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ${text('选择图片')}
+
+
+
+
+
+
+
+
+
+<% } %>
+
+
\ No newline at end of file
diff --git a/modules/core/src/main/resources/views/tagsview/form/treeselect.html b/modules/core/src/main/resources/views/tagsview/form/treeselect.html
new file mode 100644
index 00000000..32556a3d
--- /dev/null
+++ b/modules/core/src/main/resources/views/tagsview/form/treeselect.html
@@ -0,0 +1,177 @@
+<%/* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
+ * No deletion without permission, or be held responsible to law. */ %>
+<% layout('/layouts/default.html', {title: '选项选择', bodyClass: 'box b0', libs: ['zTree']}){ %>
+
+ ︾
+ ︽
+
+
+ ${text('关键字')}:
+ ${text('搜索')}
+
+
+
+<% } %>
+
\ No newline at end of file