返回值调用说明
说明 | 示例
--- | ---
布局类型为'默认页'或'更多'的返回值可以直接调用 | <#-- '默认页'修改会员返回值调用 --> ${user.userName}
布局类型为'更多'的返回值和'默认页'更多的返回值相同 | <#-- 默认页在线帮助'更多'的返回值变量 --> more_help_page <#-- 布局添加在线帮助'更多'的返回值变量 --> more_help_page
'布局 -- 版块'的调用方式为'引用代码'时,版块代码块必须由<@function></@function>标签包裹 | <@function> 版块返回对象 例如【评论列表】【分页】${topicRelated_comment_page.totalpage} </@function>
'布局 -- 版块'的调用方式为'调用对象'时,对象代码块必须由<@object action=""></@object>标签包裹 | action参数的值由系统自动生成 <@object action="${topicRelated_tag_1}"> 版块返回对象 例如【标签列表】【集合】 <#list topicRelated_tag_collection as tag> 标签名称：${tag.name} </#list> </@object>
'布局 -- 版块'的调用方式为'引用代码'时,引入本代码块的标签为<@include action=""/> | action参数的值由系统自动生成 引入【标签】版块 <@include action="${topicRelated_tag_1}"/>

公共对象
变量 | 类型 | 说明
--- | --- | ---
baseURL | String | 系统路径
commonPath | String | 资源路径
contextPath | String | 系统虚拟目录
suffix | String | 站点后缀名
templateDir | String | 模板目录名称
title | String | 站点名称
keywords | String | 站点关键词
description | String | 站点描述
systemUser | AccessUser | 登录用户
baseURI | String | 系统资源标识符
token | String | 令牌
identificationNumber | String | 识别号：用来区别每次请求
weixin_oa_appid | String | 微信公众号应用唯一标识
fileStorageSystem | int | 文件存储系统 0.本地系统 10.SeaweedFS 20.MinIO 30.阿里云OSS

用户 AccessUser
变量 | 类型 | 说明
--- | --- | ---
id | long | Id
userName | String | 会员用户名
account | String | 账号
nickname | String | 呢称
avatarPath | String | 头像路径 | 页面上显示200*200头像示例${accessUser.avatarPath}${accessUser.avatarName} 显示100*100头像示例${accessUser.avatarPath}100x100/${accessUser.avatarName}
avatarName | String | 头像名称
openId | String | 第三方用户的唯一标识 例如微信的openid
loginInterface | Integer | 登录接口 0.本地 10.微信 50.其他开放平台

模板引擎内置函数
| 参数 | 说明
--- | --- | ---
List集合 | <#list sequence as item> </#list> | 遍历集合
${item_index} | 当前迭代项在所有迭代项中的位置
${item_has_next} | 用于判断当前迭代项是否是所有迭代项中的最后一项
sequence?first | 获取集合第一个元素
sequence?last | 获取集合最后一个元素
sequence?size | 获取队列长度
Map集合 | <#list hash as key, value> </#list> | 遍历集合
${key} | 获取集合的键
${value} | 获取集合的值

模板引擎比较符号
参数 | 说明
--- | ---
lt | 小于( < )
gt | 大于( > )
lte | 小于或等于( <= )
gte | 大于或等于( >= )

模板引擎判断空值
参数 | 说明 | 示例
--- | --- | ---
?? | 空值判断 | 变量name判断是否为空 <#if name??> 有值 <#else> 没有值 </#if> 当服务器返回Map变量时不能先定义变量再判断,例如 <#assign error = returnValue['error']> <#if error?? && error?size gt 0> <#list returnValue['error'] as key, value> ${value} </#list> <#else> 没有可以领取的优惠券 </#if> 以上的写法会抛出错误 正确的写法是拿返回值直接判断 如下： <#if returnValue['error']?? && returnValue['error']?size gt 0> <#list returnValue['error'] as key, value> ${value} </#list> <#else> 没有可以领取的优惠券 </#if>
?size | 集合大小判断 | <textarea name="exampleCode"> <#if returnValue['error']?? && returnValue['error']?size gt 0> <#list returnValue['error'] as key, value> ${value} </#list> <#else> 没有可以领取的优惠券 </#if>

Ajax方式请求/返回 处理
| 参数 | 说明
--- | --- | ---
请求 | 自定义请求头 协议头：X-Requested-With 值：XMLHttpRequest | zepto.js和jquery.js等前端框架默认包含此参数 xhr.setRequestHeader("X-Requested-With","XMLHttpRequest");
返回 | 400状态码 | 表示请求错误
403状态码 | 权限不足
508状态码 | 服务器处理请求时检测到一个无限循环。当用户未登陆时在登录页面/login使用Ajax请求/user/开头的URL,会出现此错误
响应头jumpPath | 值为登录页路径。未登录时访问登录页面会返回此参数值 xhr.getResponseHeader("jumpPath")

移动端统计访问量
请求路径 | statistic/add.htm
请求方式 | GET
请求参数 | 当前访问页面URL | 变量：url 类型：String 是否必填：是
上一访问页面URL | 变量：referrer 类型：String 是否必填：否
提交返回 | 空字符串 |

获取短信验证码 - AJAX方式
请求路径 | smsCode.htm
请求方式 | POST
自定义请求头 | 协议头：X-Requested-With 值：XMLHttpRequest
请求参数 | 参数表
提交返回 | JSON格式值 类型:Map<String,Object> | 键参数：success 值内容说明：成功返回true 失败返回false 值类型：String
键参数：error 值内容说明：错误值集合 值类型：Map<String,String>
键参数：captchaKey 值内容说明：验证码编号 success为false时有值

提交'获取短信验证码'参数
参数 | 类型 | 是否必填 | 说明
--- | --- | --- | ---
mobile | String | 是 | 手机号
module | String | 是 | 模块 100.注册 200.登录 300.找回密码
captchaKey | String | 是 | 验证码编号
captchaValue | String | 是 | 验证码值 同一编号验证码每分钟提交次数不能超过60次,超出时验证码图片返回空字符
token | String | 是 | 令牌

获取短信验证码 错误值 error
变量 | 类型 | 说明
--- | --- | ---
token | String | 令牌错误
captchaValue | String | 验证码错误
mobile | String | 手机号
smsCode | String | 手机验证码
message | String | 获取短信验证码

基本信息
请求路径 | baseInfo.htm
请求方式 | GET
提交返回 | JSON格式值 类型:Map<String,Object> | 键参数：title 值内容说明：站点名称 值类型：String
键参数：keywords 值内容说明：站点关键词 值类型：String
键参数：description 值内容说明：站点描述 值类型：String
键参数：baseURL 值内容说明：系统路径 值类型：String
键参数：commonPath 值内容说明：资源路径 值类型：String
键参数：contextPath 值内容说明：系统虚拟目录 值类型：String
键参数：templateDir 值内容说明：模板目录名称 值类型：String
键参数：systemUser 值内容说明：登录用户 值类型：AccessUser
键参数：baseURI 值内容说明：系统资源标识符 值类型：String
键参数：fileStorageSystem 值内容说明：文件存储系统 0.本地系统 10.SeaweedFS 20.MinIO 30.阿里云OSS 值类型：Integer
键参数：supportAccessDevice 值内容说明：支持访问设备 1.自动识别终端 2.电脑端 3.移动端 值类型：Integer
键参数：weixin_oa_appid 值内容说明：微信公众号appid 值类型：String

会话续期
请求路径 | refreshToken.htm
请求方式 | POST
提交返回 | JSON格式值 类型:Map<String,Object> | 键参数：accessToken 值内容说明：访问令牌 值类型：String
键参数：refreshToken 值内容说明：刷新令牌 值类型：String
键参数：systemUser 值内容说明：登录用户 值类型：AccessUser

恢复微信浏览器会话
请求路径 | recoverWeChatBrowserSession.htm
请求方式 | POST
提交返回 | JSON格式值 类型:Map<String,Object> | 键参数：accessToken 值内容说明：访问令牌 值类型：String
键参数：refreshToken 值内容说明：刷新令牌 值类型：String
键参数：systemUser 值内容说明：登录用户 值类型：AccessUser
键参数：openId 值内容说明：用户的唯一标识 每个用户对每个公众号的OpenID是唯一的。对于不同公众号，同一用户的openid不同 值类型：String

注意事项
JavaScript提交参数除密码框值外建议都用encodeURIComponent()函数进行编码
因为JavaScript中的数字类型不能包含所有的java long值,所以JSON返回值中含有Long都转为String类型
Freemarker模板不支持直接输出布尔类型(boolean),布尔类型对象输出要使用内建函数c将布尔值转换为字符串；例如布尔类型${formCaptcha.showCaptcha}要写成${formCaptcha.showCaptcha?c}才能正确显示；比较${formCaptcha.showCaptcha?c == 'true'}
因为手机版采用单页应用设计,框架不支持加上网页后缀,建议电脑版网页链接不要加上后缀(.htm)，让手机版和网页版URL保持一致
前后端分离模板使用localStorage存储Token时，ajax发送header需要加上Authorization属性验证权限，值格式为“Bearer 访问令牌,刷新令牌”。例如：Authorization: Bearer a7f9ffe9b01c467ea9b1dccfcf5e6951,1024d6e2c9394b489d384a5867620a07