Skip to content

10.17sso更新信息页面完善

##一、前端

###1.userManager.jsp

####1.按钮昵称修改 =》 信息修改

userManager.jsp 52行
40行
viewResource.properties
viewResource_zh.properties
viewResource_en.properties

usermanager_information_modify=信息修改
usermanager_information_modify=Change information

https://sso.supermap.com/v101/cas/phoneregister?service=https://itest.supermapol.com

2.nicknameModify.jsp

####1.标题昵称修改 =》 信息修改

nicknameModify.jsp 26行
17行
viewResource.properties
viewResource_zh.properties
viewResource_en.properties

information_modify_title=信息修改 
information_modify_title=Change information

2.新增姓名,单位名

nicknameModify.jsp 57,72行
4-5行
viewResource.properties
viewResource_zh.properties
viewResource_en.properties

common_realName=姓名
common_company=单位名
common_realName=RealName
common_company=company

二、后端

D:\supermap\ideaworkspaces\UserAccount\CASManager\src\main\java\com\supermap\icloud\cas\client\AccountManager.java
流程
1.	鼠标移开触发焦点事件,
	1.检验正则和长度
	2.错误提示
	3.正确会校验是否存在
		1.后端ajax校验存在返回状态
			1.成功=》移除错误提示,增加√
			2.错误,出现错误提示
			3.异常,提示网络异常
		2.后端校验
        	 1.接收页面参数对象:AccountManagerParameter,只传了nickname
        	 2.从session获取user
        	 3.页面传的域session对比昵称,一直则返回状态对象
注意:昵称已被使用只是跟自己上一次校验,没有验证数据        
1.保存修改
	1.form提交事件
	2.js检验正则和长度
		1.错误,返回false
		2.正确

###1.相关类

AccountManager.java nicknameModify
AccountManagerService.java  postResponseUserInfo
AccountManagerParameter.java
UpdateUserInfoController.java handleRequestInternal
UserService.java updateUserInfo

###2.AccountManagerParameter.java

java
/**
	 * 用户电话
	 */
private String realName;
/**
	 * 用户电话
	 */
private String company;

###3.CASConstants.java

/**
* 姓名
*/
public final static String REALNAME = "realName";
/**
* 单位名
*/
public final static String COMPANY = "company";

###4.AccountManagerService.java

463
paramsMap.put(AccountManagerConstants.NEWUSERINFO, params.getNewNickname());
paramsMap.put(AccountManagerConstants.NEWUSERINFO, JSON.toJSONString(params));//传对象

###5.UserService.java

java
594,595行
Map<String,String> newInfoMap = JSONObject.parseObject(newInfo, Map.class);
result = updateNickName(uid, newInfoMap);
java
530-572行

    /**
     * 更新昵称
     * @param uid
     * @param newNickname
     * @return
     */
    private UserServiceResult updateNickName(String uid, String newNickname) {
        UserServiceResult result = new UserServiceResult();
        if (StringUtils.isEmpty(uid) || StringUtils.isEmpty(newNickname)) {
            result.setMessageCode(MessageCode.USERSERVICE_NORMAL_REQUESTINCOMPLETE);
            return result;
        }

        ICloudUser user = getUserManager().getICloudUserById(NumberUtils.toInt(uid));
        if (null == user) {
            // 该逻辑受UAManage前端控制,应该不会被调用,以防意外。 byhansj
            result.setMessageCode(MessageCode.USERSERVICE_NORMAL_USERNOTEXIST);
            return result;
        }
        MessageCode validateMessage = validateNickName(newNickname);
        if (null != validateMessage) {
        	result.setMessageCode(validateMessage);
        } else {
            ICloudUser newUser = getUserManager().getICloudUser(newNickname);
        	if (null != newUser && NumberUtils.toInt(uid) != newUser.getUserId()) {
                result.setMessageCode(MessageCode.USERSERVICE_VALIDATENICKNAME_REGISTERED);
                return result;
        	}
            if (newNickname.equals(user.getNickname())) {
                result.setMessageCode(MessageCode.USERSERVICE_UPDATE_FAIL);
            } else {
            	boolean succesed = false;
        		succesed = getUserManager().updateCachedUserById(ICloudUserOperateType.NICKNAME, uid, newNickname);
				if (succesed) {
					result.setMessageCode(MessageCode.USERSERVICE_UPDATE_SUCCESS);
				} else {
					result.setMessageCode(MessageCode.USERSERVICE_UPDATE_FAIL);
				}
                result.setSuccessed(succesed);
            }
        }
        return result;
    }
    

***************************************************************************

        /**
     * 更新昵称,姓名,单位名
     * @param uid
     * @param newInfoMap
     * @return
     */
    private UserServiceResult updateUserNames(String uid, Map<String,String> newInfoMap) {
        UserServiceResult result = new UserServiceResult();
        if (StringUtils.isEmpty(uid) || newInfoMap == null) {
            result.setMessageCode(MessageCode.USERSERVICE_NORMAL_REQUESTINCOMPLETE);
            return result;
        }
        //昵称,姓名,单位名不能为空
        String newNickname = newInfoMap.get("newNickname");
        String realName = newInfoMap.get("realName");
        String company = newInfoMap.get("company");
        if(StringUtils.isEmpty(newNickname) || StringUtils.isEmpty(realName) || StringUtils.isEmpty(company)){
            result.setMessageCode(MessageCode.USERSERVICE_NORMAL_REQUESTINCOMPLETE);
            return result;
        }
        ICloudUser user = getUserManager().getICloudUserById(NumberUtils.toInt(uid));
        if (null == user) {
            // 该逻辑受UAManage前端控制,应该不会被调用,以防意外。 byhansj
            result.setMessageCode(MessageCode.USERSERVICE_NORMAL_USERNOTEXIST);
            return result;
        }

        MessageCode validateMessage = null;
        // 姓名验证
        validateMessage = validateRealName(realName);
        if (null != validateMessage) {
            result.setMessageCode(validateMessage);
            return result;
        }

        // 单位名称验证
        validateMessage = validateCompany(company);
        if (null != validateMessage) {
            result.setMessageCode(validateMessage);
            return result;
        }

        //校验昵称
        validateMessage = validateNickName(newNickname);
        if (null != validateMessage) {
        	result.setMessageCode(validateMessage);
        } else {
            ICloudUser newUser = getUserManager().getICloudUser(newNickname);
        	if (null != newUser && NumberUtils.toInt(uid) != newUser.getUserId()) {
                result.setMessageCode(MessageCode.USERSERVICE_VALIDATENICKNAME_REGISTERED);
                return result;
        	}
        	//与旧昵称一致
            if (newNickname.equals(user.getNickname())) {
                result.setMessageCode(MessageCode.USERSERVICE_UPDATE_FAIL);
            } else {
            	boolean succesed = false;
        		succesed = getUserManager().updateCachedUserInfoById(ICloudUserOperateType.NICKNAME, uid, newInfoMap);
				if (succesed) {
					result.setMessageCode(MessageCode.USERSERVICE_UPDATE_SUCCESS);
				} else {
					result.setMessageCode(MessageCode.USERSERVICE_UPDATE_FAIL);
				}
                result.setSuccessed(succesed);
            }
        }
        return result;
    }

###6.ICloudUserManager.java //缓存有待解决

java
588-618
/**
	 * 通过id来更新用户信息(昵称,姓名,单位名称)并且更新缓存
	 *
	 * @param type
	 * @param uid
	 * @param newInfoMap
	 * @return
	 */
	public boolean updateCachedUserInfoById(ICloudUserOperateType type, String uid, Map<String,String> newInfoMap) {
		boolean isUpdated = false;
		rwl.writeLock().lock();
		// 更新数据库
		isUpdated = UserDao.updateUserNamesById(uid, newInfoMap);
		// 更新缓存
		if (isUpdated) {// 虽然sql执行成功,但是不能避免脏读,所以采用直接更新缓存的方式来避免
			// 直接更新缓存
			LOGGER.info("updateCachedUserById type " + type.toString()
					+ " uid " + uid + " newInfoMap " + newInfoMap);
			//更新缓存待处理
			isUpdated = updateCacheImmediately(type, uid, newInfoMap.get(CASConstants.NICKNAME));
		}
		rwl.writeLock().unlock();
		return isUpdated;
	}

###7.userDao

java
/**
     * 通过id更新用户信息(昵称,姓名,单位名称)
     * @param uid
     * @param newInfoMap
     * @return
     */
    public static boolean updateUserNamesById(String uid, Map<String,String> newInfoMap) {
        String nickname = newInfoMap.get(CASConstants.NICKNAME);
        String realName = newInfoMap.get(CASConstants.REALNAME);
        String company = newInfoMap.get(CASConstants.COMPANY);
        boolean isReseted = false;
        String sql = "update users set " + nickname + "=? "+ realName + "=? "+ company + "=? "+ "where id=?";
        Connection conn = DBManager.getInstance().getConnection();
        try (PreparedStatement stmt = conn.prepareStatement(sql)) {
            stmt.setString(1, nickname);
            stmt.setString(2, realName);
            stmt.setString(3, company);
            stmt.setString(4, uid);
            int updated = stmt.executeUpdate();
            if (updated != 0) {
                isReseted = true;
            }
        } catch (SQLException e) {
            LOGGER.warn("updateUserInfoById " + e.getMessage(),e);
        } finally {
            if (null != conn) {
                DBManager.getInstance().returnConnection(conn);
            }
        }
        return isReseted;
    }

###8.casManagerResource.java

29-31
	// userInfo
	USERINFO_MODIFY_ERROR, // 用户修改失败
	USERINFO_MODIFY_SUCCESS,//用户修改成功

###9.casManagerResource.properties

18-20
casManagerResource.properties
casManagerResource_zh.properties
casManagerResource_en.properties
#userInfo
USERINFO_MODIFY_ERROR=信息修改失败
USERINFO_MODIFY_SUCCESS=信息修改成功

#userInfo
USERINFO_MODIFY_ERROR=Failed to change your userInfo
USERINFO_MODIFY_SUCCESS=Change userInfo succeed
Request URL: https://sso.supermap.com/v101/cas/phoneregister?service=https://itest.supermapol.com
Request Method: POST
Status Code: 500 Internal Server Error
Remote Address: 182.92.192.70:443
Referrer Policy: no-referrer-when-downgrade

##三、前端

1.nicknameSuccess.jsp

32,修改成功后,
昵称修改成功 = 》 信息修改成功
23
<label class="logo_title vm"><spring:message code="nickname_modify_title"/></label>

##四、校验

1.去掉新旧验证(pass)

java
AccountManager.java 
checkNicknameParameter方法 300行
 /**
     * 
     * @param params
     * @param user
     * @return
     */
    private AccountManagerResult checkNicknameParameter(AccountManagerParameter params, ICloudUser user){
    	AccountManagerResult result = new AccountManagerResult();
        if (StringUtils.isBlank(params.getNewNickname())) {
			result.status = ResultStatus.EXCEPTION;
			result.message = getMessageSource().getMessage(
					CasManagerResource.NEW_NICKNAME_NOT_NULL);
		}else if (params.getNewNickname().equals(user.getNickname())) {
			result.status = ResultStatus.FAILED;
			result.message = getMessageSource().getMessage(
					CasManagerResource.NICKNAME_NOT_BE_SAME);//新旧昵称一样
		}
        return result;
    }

*********************************************************************
   /**
     * 
     * @param params
     * @param user
     * @return
     */
    private AccountManagerResult checkNicknameParameter(AccountManagerParameter params, ICloudUser user){
    	AccountManagerResult result = new AccountManagerResult();
        if (StringUtils.isBlank(params.getNewNickname())) {
			result.status = ResultStatus.EXCEPTION;
			result.message = getMessageSource().getMessage(
					CasManagerResource.NEW_NICKNAME_NOT_NULL);
		}
//		else if (params.getNewNickname().equals(user.getNickname())) {
//			result.status = ResultStatus.FAILED;
//			result.message = getMessageSource().getMessage(
//					CasManagerResource.NICKNAME_NOT_BE_SAME);//新旧昵称一样
//		}
        return result;
    }

###1.1新旧验证成功(ok)

AccountManager.java 

/**
     * 
     * @param params
     * @param user
     * @return
     */
    private AccountManagerResult checkNicknameParameter(AccountManagerParameter params, ICloudUser user){
    	AccountManagerResult result = new AccountManagerResult();
        if (StringUtils.isBlank(params.getNewNickname())) {
			result.status = ResultStatus.EXCEPTION;
			result.message = getMessageSource().getMessage(
					CasManagerResource.NEW_NICKNAME_NOT_NULL);
		}
		else if (params.getNewNickname().equals(user.getNickname())) {
			result.status = ResultStatus.SUCCESS;
			result.message = getMessageSource().getMessage(
					CasManagerResource.NICKNAME_ASYNVALIDATE_SUCCESS);
		}
        return result;
    }
    
    
 1.  nicknameModify方法和validateUserNickname方法条件改
 if(ResultStatus.SUCCESS.equals(result.status)) {
        	addDatasToModelAndView(mv, ViewConstants.NICKNAMESUCCESS, result.message);
        	user.setNickname(params.getNewNickname());
        }

###2.校验焦点事件还是form提交事件

java
AccountManagerService.java
postResponseUserInfo 450

//判断是昵称焦点移开事件,还是form提交事件
			if(StringUtils.isEmpty(params.getRealName()) && StringUtils.isEmpty(params.getCompany())){
				paramsMap.put(AccountManagerConstants.TYPE, type.name());
				paramsMap.put(AccountManagerConstants.NEWUSERINFO, params.getNewNickname());
			}else {
				paramsMap.put(AccountManagerConstants.TYPE, type.name());
//				paramsMap.put(AccountManagerConstants.NEWUSERINFO, params.getNewNickname());
				paramsMap.put(AccountManagerConstants.NEWUSERINFO, JSON.toJSONString(params));
			}