页面访问
请求路径 | user/control/editUser.htm
请求方式 | GET
返回值 | 用户 | 变量：user 类型：User
用户角色集合 | 变量：userRoleList 类型：List<UserRole>
用户自定义注册功能项 | 变量：userCustomList 类型：List<UserCustom>

页面访问 - AJAX方式
请求路径 | user/control/editUser.htm
请求方式 | GET
自定义请求头 | 协议头：X-Requested-With 值：XMLHttpRequest
请求成功返回 | JSON格式值 类型:Map<String,Object> | 键参数：userRoleList 值内容说明：用户角色集合 值类型：List<UserRole>
键参数：userCustomList 值内容说明：用户自定义注册功能项 值类型：List<UserCustom>
键参数：user 值内容说明：用户 值类型：User

用户 user
变量 | 类型 | 说明
--- | --- | ---
id | long | Id
userName | String | 会员用户名
account | String | 账号
nickname | String | 呢称
allowUserDynamic | Boolean | 是否允许显示用户动态
email | String | 邮箱地址
issue | String | 密码提示问题
registrationDate | Date | 注册日期
point | Long | 当前积分
avatarPath | String | 头像路径 | 页面上显示200*200头像示例${user.avatarPath}${user.avatarName} 显示100*100头像示例${user.avatarPath}100x100/${user.avatarName}
avatarName | String | 头像名称
type | Integer | 用户类型 10:本地账号密码用户 20: 手机用户 30: 邮箱用户 40:微信用户
platformUserId | String | 平台用户Id 本地账号密码用户类型为'会员用户名'; 手机用户类型为'手机号-mobile'; 邮箱用户类型为'邮箱-email'; 第三方用户类型的为'第三方用户Id-第三方平台标记',例如微信为'unionid-weixin'

用户自定义注册功能项 UserCustom
变量 | 类型 | 说明
--- | --- | ---
id | Integer | Id
name | String | 注册项名称
required | boolean | 是否必填
chooseType | Integer | 选框类型 1.输入框 2.单选按钮 3.多选按钮 4.下拉列表 5.文本域textarea
itemValue | Map<String,String> | 参数值
size | Integer | 输入框的宽度
maxlength | Integer | 输入框中字符的最大长度
multiple | boolean | 是否可选择多个选项 true: multiple='multiple' false:
selete_size | Integer | 下拉列表中可见选项的数目
rows | Integer | 文本域内的可见行数
cols | Integer | 文本域内的可见宽度
tip | String | 提示
userInputValueList | List<UserInputValue> | 用户自定义注册功能项用户输入值

用户自定义注册功能项用户输入值 UserInputValue
变量 | 类型 | 说明
--- | --- | ---
id | Long | Id
userId | Long | 用户Id
userCustomId | Integer | 用户自定义注册功能项Id
content | String | 用户输入内容
options | String | 选项值

用户角色 UserRoleList
变量 | 类型 | 说明
--- | --- | ---
id | Long | Id
name | String | 角色名称
validPeriodEnd | Date | 有效期结束

提交 会员修改 - 默认方式
请求路径 | user/control/editUser.htm
请求方式 | POST
请求参数 | 参数表
提交成功返回 | 默认跳转到jump模板页显示提交成功信息；跳转路径参数jumpUrl有值时按参数值路径跳转
提交失败返回 | 错误值 | 变量：error 类型：Map<String,String>
用户自定义注册功能项 | 变量：userCustomList 类型：List<UserCustom>

提交 会员修改 - AJAX方式
请求路径 | user/control/editUser.htm
请求方式 | POST
自定义请求头 | 协议头：X-Requested-With 值：XMLHttpRequest
请求参数 | 参数表
提交返回 | JSON格式值 类型:Map<String,Object> | 键参数：success 值内容说明：成功返回true 失败返回false 值类型：String
键参数：error 值内容说明：错误值集合 值类型：Map<String,String>
键参数：systemUser 值内容说明：登录用户；success为true时有值 值类型：AccessUser
键参数：accessToken 值内容说明：访问令牌
键参数：refreshToken 值内容说明：刷新令牌

用户 AccessUser
变量 | 类型 | 说明
--- | --- | ---
id | long | Id
userName | String | 会员用户名
account | String | 账号
nickname | String | 呢称
avatarPath | String | 头像路径 | 页面上显示200*200头像示例${systemUser.avatarPath}${systemUser.avatarName} 显示100*100头像示例${systemUser.avatarPath}100x100/${systemUser.avatarName}
avatarName | String | 头像名称

会员修改 错误值 error
变量 | 类型 | 说明
--- | --- | ---
userCustom_用户自定义注册功能项Id | String | 用户自定义注册功能项参数值错误
nickname | String | 呢称错误
allowUserDynamic | String | 允许显示用户动态错误
password | String | 新密码错误
oldPassword | String | 旧密码错误
user | String | 用户错误
token | String | 令牌错误

提交'会员修改'参数
参数 | 类型 | 是否必填 | 说明
--- | --- | --- | ---
nickname | String | 按需填写 | 呢称 设置后不允许再修改
allowUserDynamic | Boolean | 是 | 是否允许显示用户动态
password | String | 按需填写 | 新密码 必须执行sha256一次
oldPassword | String | 按需填写 | 旧密码 必须执行sha256一次
userCustom_用户自定义注册功能项Id | String或String[] | 按需填写 | 用户自定义注册功能项参数值；根据选框类型(chooseType)确定接收类型是String或String[]
token | String | 是 | 令牌
jumpUrl | String | 否 | '提交表单 - 默认方式'提交成功后跳转路径,不填写默认跳转到表单提交页；参数必须经过encodeBase64URL编码后才能提交。例${encodeBase64URL('/index')}

提交 更换头像 - AJAX方式
请求路径 | user/control/updateAvatar.htm
请求方式 | POST
自定义请求头 | 协议头：X-Requested-With 值：XMLHttpRequest
请求参数 | 参数表
提交返回 | JSON格式值 类型:Map<String,Object> | 键参数：success 值内容说明：成功返回true 失败返回false 值类型：String
键参数：error 值内容说明：错误值集合 值类型：Map<String,String>

提交'更换头像'参数
上传方式 | 参数 | 类型 | 是否必填 | 说明
--- | --- | --- | --- | ---
上传Blob类型截图 | imgFile | Blob | 是 | 上传图片文件接收字段；上传后生成图片尺寸为200*200和100*100
上传原图 | imgFile | String | 是 | 上传图片文件接收字段；上传后生成图片尺寸为200*200和100*100
x | Integer | 是 | 截图X轴
y | Integer | 是 | 截图Y轴
width | Integer | 是 | 截图宽度
height | Integer | 是 | 截图高度

更换头像 错误值 error
变量 | 类型 | 说明
--- | --- | ---
x | Integer | 截图X轴错误
y | Integer | 截图Y轴错误
width | Integer | 截图宽度错误
height | Integer | 截图高度错误
imgFile | String | 图片错误

## 示例

<form method="post" autocomplete="off" action="user/control/editUser"> <!-- 令牌标记 --> <input type="hidden" id="token" name="token" value="${token}"> <#-- 账号 --> ${user.account} <#-- 允许显示用户动态 --> <input type="radio" name="allowUserDynamic" value="true" <#if user.allowUserDynamic ==true> checked='checked'</#if>>显示 <input type="radio" name="allowUserDynamic" value="false" <#if user.allowUserDynamic ==false> checked='checked'</#if>>关闭 <#-- 允许显示用户动态错误 --> ${(error['allowUserDynamic'])!} <#-- 旧密码 --> <input type="password" id="oldPassword" name="oldPassword" autocomplete="off" size="25" maxlength="20" /> <#-- 旧密码错误 --> ${(error['oldPassword'])!} <#-- 新密码 --> <input type="password" id="password" name="password" autocomplete="off" size="25" maxlength="20" /> <#-- 新密码错误 --> ${(error['password'])!} <#-- 用户自定义注册功能项 --> <#list userCustomList as userCustom> <#if userCustom.required == true> 必填 </#if> <#-- 用户自定义注册功能项名称 --> ${userCustom.name} <#-- 输入框 --> <#if userCustom.chooseType ==1> <input type="text" name="userCustom_${userCustom.id}" value="<#list userCustom.userInputValueList as userInputValue>${userInputValue.content}</#list>" size="${userCustom.size}" maxlength="${userCustom.maxlength}"> </#if> <#-- 单选按钮 --> <#if userCustom.chooseType ==2> <#if userCustom.itemValue?has_content> <#list userCustom.itemValue?keys as itemValue> <#-- 选中项 --> <#assign _checked = ""> <#list userCustom.userInputValueList as userInputValue> <#if userInputValue.options == itemValue> <#assign _checked=" checked='checked'"> </#if> </#list> <#-- 默认选第一项 --> <#if itemValue_index == 0 && userCustom.userInputValueList?exists && userCustom.userInputValueList?size == 0> <#assign _checked = " checked='checked'"> </#if> <input type="radio" name="userCustom_${userCustom.id}" value="${itemValue}" ${_checked} >${userCustom.itemValue[itemValue]} </#list> </#if> </#if> <#-- 多选按钮 --> <#if userCustom.chooseType ==3> <#if userCustom.itemValue?has_content> <#list userCustom.itemValue?keys as itemValue> <#-- 选中项 --> <#assign _checked = ""> <#list userCustom.userInputValueList as userInputValue> <#if userInputValue.options == itemValue> <#assign _checked=" checked='checked'"> </#if> </#list> <input type="checkbox" name="userCustom_${userCustom.id}" value="${itemValue}" ${_checked}>${userCustom.itemValue[itemValue]} </#list> </#if> </#if> <#-- 下拉列表 --> <#if userCustom.chooseType ==4> <select name="userCustom_${userCustom.id}" <#if userCustom.multiple == true> multiple='multiple'</#if> <#if userCustom.selete_size != null> size='${userCustom.selete_size}'</#if>> <#if userCustom.itemValue?has_content> <#list userCustom.itemValue?keys as itemValue> <#assign _selected = ""> <#list userCustom.userInputValueList as userInputValue> <#if userInputValue.options == itemValue> <#assign _selected=" selected='selected'"> </#if> </#list> <option value="${itemValue}" ${_selected}>${userCustom.itemValue[itemValue]}</option> </#list> </#if> </select> </#if> <#-- 文本域 --> <#if userCustom.chooseType ==5> <textarea name="userCustom_${userCustom.id}" rows="${userCustom.rows}" cols="${userCustom.cols}"><#list userCustom.userInputValueList as userInputValue>${userInputValue.content}</#list></textarea> </#if> <#-- 提示 --> ${userCustom.tip} <#-- 错误 --> <#assign userCustom_id = "userCustom_"+userCustom.id> ${error[userCustom_id]} </#list> <#-- 修改用户错误 --> ${error['user']} <#-- 令牌错误 --> ${error['token']} <#-- 密码如果有值必须使用sha256加密一次才能提交 CryptoJS.SHA256(password) --> <input type="submit" value="默认提交" /> <#-- ajax提交请看下面示例 --> <input type="button" value="ajax提交" onClick="javascript:ajaxSubmit();"> </form> <#-- 组装提交参数 必须引入cryptoJS/core.js 和cryptoJS/sha256.js --> <script type="text/javascript" language="javascript"> //组装参数 function getParameter(){ var parameter = ""; //令牌标记 var token = document.getElementById("token").value; parameter += "&token="+token; var nickname = document.getElementById("nickname"); if(nickname != null){ parameter += "&nickname="+nickname.value; } var allowUserDynamic_radio = document.getElementsByName("allowUserDynamic"); for(var i=0; i<allowUserDynamic_radio.length; i++) { if (allowUserDynamic_radio[i].checked) { parameter += "&allowUserDynamic="+allowUserDynamic_radio[i].value; } } //密码需SHA256加密 var password = document.getElementById("password").value; if(password !=""){ //password在加密前要原始数据，不能进行任何转义 parameter += "&password="+ CryptoJS.SHA256(password); //旧密码 var oldPassword = document.getElementById("oldPassword").value; if(oldPassword != ""){ //oldPassword在加密前要原始数据，不能进行任何转义 parameter += "&oldPassword="+ CryptoJS.SHA256(oldPassword); } } //自定义表单name集合 var array = new Array(); //读取表单所有的input标签 var all_input = document.getElementsByTagName("input"); for(var i=0;i<all_input.length; i++){ var obj = all_input[i]; if(obj.name.substring(0,11) =="userCustom_"){ var isExist = false;//是否已存在数组中 //如果存在，则不添加 for(var j=0;j<array.length; j++){ if(array[j] == all_input[i].name){ isExist = true; break; } } if(isExist == false){ array.push (all_input[i].name); } } } //读取表单所有的select标签 var all_select = document.getElementsByTagName("select"); for(var i=0;i<all_select.length; i++){ var obj = all_select[i]; if(obj.name.substring(0,11) =="userCustom_"){ var isExist = false;//是否已存在数组中 //如果存在，则不添加 for(var j=0;j<array.length; j++){ if(array[j] == all_select[i].name){ isExist = true; break; } } if(isExist == false){ array.push (all_select[i].name); } } } //读取表单所有的textarea标签 var all_textarea = document.getElementsByTagName("textarea"); for(var i=0;i<all_textarea.length; i++){ var obj = all_textarea[i]; if(obj.name.substring(0,11) =="userCustom_"){ var isExist = false;//是否已存在数组中 //如果存在，则不添加 for(var j=0;j<array.length; j++){ if(array[j] == all_textarea[i].name){ isExist = true; break; } } if(isExist == false){ array.push (all_textarea[i].name); } } } for(var i=0;i<array.length; i++){ //读取表单参数 var obj = document.getElementsByName(array[i]); if(obj[0].type == "text"){//输入框 parameter += "&"+obj[0].name+"="+encodeURIComponent(obj[0].value); } if(obj[0].type == "radio"){//单选 for(var j=0;j<obj.length;j++){ if(obj[j].checked){ parameter += "&"+obj[0].name+"="+obj[j].value; break; } } } if(obj[0].type == "checkbox"){//多选 for(var j=0;j<obj.length;j++){ if(obj[j].checked){ parameter += "&"+obj[0].name+"="+obj[j].value; } } } if(obj[0].type.substring(0,6) == "select"){//下拉列表 for(var j=0;j<obj[0].length;j++){ if(obj[0][j].selected){ parameter += "&"+obj[0].name+"="+obj[0][j].value; } } } if(obj[0].type == "textarea"){//表单域 parameter += "&"+obj[0].name+"="+encodeURIComponent(obj[0].value); } } //删除第一个&号,防止因为多了&号而出现警告: Parameters: Invalid chunk ignored.信息 if(parameter.indexOf("&") == 0){ parameter = parameter.substring(1,parameter.length); } return parameter; } </script> <#-- ajax提交示例 --> <script type="text/javascript" language="javascript"> //ajax提交 function ajaxSubmit(){ //直接将组装好的参数提交即可 var parameter = getParameter(); } </script>