@Override
 @Transactional(readOnly = false)
 public int resetPwd(Long loginId) throws Exception {
   SysLogin sysLogin = baseDao.findById(loginId);
   sysLogin.setLoginPwd(MD5Utils.toMD5(CommonConstants.DEFAULT_PWD));
   baseDao.update(sysLogin);
   // 保存系统日志
   String operDesc = "【密码重置】用户名:" + sysLogin.getLoginName();
   sysLogService.save(SysLog.OPERATE_TYPE_UPDATE, operDesc);
   return ResultConstants.UPDATE_SUCCEED;
 }
 /**
  * 根据密码和新密码 进行密码修改
  *
  * @param loginPwd 原来的密码
  * @param newLoginPwd 新密码
  * @return 成功或者失败
  * @throws Exception 抛出异常
  */
 @Override
 @Transactional(readOnly = false, rollbackFor = Throwable.class)
 public int updPassword(String loginPwd, String newLoginPwd, HttpServletRequest request)
     throws Exception {
   LoginToken loginToken =
       (LoginToken) SessionUtils.getObjectAttribute(request, SessionNameConstants.LOGIN_TOKEN);
   if (loginToken.getSysLogin().getLoginPwd().equals(MD5Utils.toMD5(loginPwd))) {
     SysLogin login = loginToken.getSysLogin();
     // 用MD5算法加密
     login.setLoginPwd(MD5Utils.toMD5(newLoginPwd));
     baseDao.update(login);
     // 保存系统日志
     String operDesc = "【修改密码】用户名:" + login.getLoginName();
     sysLogService.save(SysLog.OPERATE_TYPE_UPDATE, operDesc);
     return ResultConstants.UPDATE_SUCCEED;
   } else return ResultConstants.UPDATE_FAILED;
 }
  @Override
  @Transactional(readOnly = false)
  public int save(SysLogin entity, Long[] roleIds, Long deptId) throws Exception {
    String hql = "select count(*) from SysLogin as model where model.loginName= ?)";
    long count = baseDao.findLong(hql, entity.getLoginName());
    if (count > 0) {
      return ResultConstants.SAVE_FAILED_NAME_IS_EXIST;
    }

    hql = "select count(*) from SysLogin as model where model.userCode= ?)";
    count = baseDao.findLong(hql, entity.getUserCode());
    if (count > 0) {
      return ResultConstants.SAVE_FAILED_CODE_IS_EXIST;
    }

    hql = "select count(*) from SysLogin as model where model.idCard= ?)";
    count = baseDao.findLong(hql, entity.getIdCard());
    if (count > 0) {
      return ResultConstants.SAVE_FAILED_NAME_IS_EXIST;
    }

    entity.setLoginPwd(MD5Utils.toMD5(entity.getLoginPwd()));
    baseDao.save(entity);
    sysLoginRoleService.saveLoginRole(entity, roleIds);
    // 保存系统日志
    String operDesc = "【用户新增】用户名:" + entity.getLoginName();
    sysLogService.save(SysLog.OPERATE_TYPE_ADD, operDesc);
    return ResultConstants.SAVE_SUCCEED;
  }
  @Override
  @Transactional(readOnly = false, rollbackFor = Throwable.class)
  public int login(
      String loginName,
      String loginPwd,
      String checkCode,
      Long systemId,
      HttpServletRequest request)
      throws Exception {
    // 检查验证码是否正确
    if (!SessionUtils.checkSessionValue(
        request, SessionNameConstants.IMG_CHECK_CODE, checkCode)) // 验证失败
    {
      return ResultConstants.IMG_CODE_FAILED;
    }

    // 检查登录名和密码是否正确 MD5Utils.toMD5(loginPwd)
    SysLogin sysLogin =
        ((SysLoginDAO) baseDao).login(loginName, MD5Utils.toMD5(loginPwd), systemId);
    if (sysLogin == null) {
      return ResultConstants.LOGIN_INFO_FAILED;
    }
    if (sysLogin.getStatus().equals(CommonConstants.STATUS_INVALID)) {
      return ResultConstants.LOGIN_INFO_INVAILD;
    }

    // 加载登录用户的相关信息到登录令牌
    LoginToken loginToken = this.getAdminLoginToken(sysLogin);
    // 保存登录用户信息到http session
    SessionUtils.setObjectAttribute(request, SessionNameConstants.LOGIN_TOKEN, loginToken);

    // 修改最后登录时间
    sysLogin.setLoginLastTime(DateTimeUtil.getChar14());
    baseDao.update(sysLogin);
    // 保存系统日志
    sysLogService.save(SysLog.OPERATE_TYPE_LOGIN, "【用户登录】用户名:" + sysLogin.getLoginName());
    return ResultConstants.LOGIN_SUCCESS;
  }
  @Override
  @Transactional(readOnly = false)
  public int update(SysLogin entity, Long[] roleIds, String newLoginPwd) throws Exception {
    // editby 孙强伟  at 20130624 , 由于是修改用户信息,此时,用户登陆名称是不可以修改的,国此必须先获得旧的记录将其用户登陆名称赋给新的entity.
    SysLogin oldSysLogin = baseDao.findById(entity.getLoginId());
    if (null == oldSysLogin) {
      return ResultConstants.UPDATE_RECORD_NOT_EXIST;
    }

    entity.setLoginName(oldSysLogin.getLoginName());

    String hql =
        "select count(*) from SysLogin as model where model.loginName= ? and model.loginId != ?)";
    long count = baseDao.findLong(hql, entity.getLoginName(), entity.getLoginId());
    if (count > 0) {
      return ResultConstants.UPDATE_FAILED_NAME_IS_EXIST;
    }

    hql = "select count(*) from SysLogin as model where model.userCode= ? and model.loginId != ?)";
    count = baseDao.findLong(hql, entity.getUserCode(), entity.getLoginId());
    if (count > 0) {
      return ResultConstants.UPDATE_FAILED_CODE_IS_EXIST;
    }

    hql = "select count(*) from SysLogin as model where model.idCard= ? and model.loginId != ?)";
    count = baseDao.findLong(hql, entity.getIdCard(), entity.getLoginId());
    if (count > 0) {
      return ResultConstants.UPDATE_FAILED_IDCARD_IS_EXIST;
    }

    if (newLoginPwd != null && !"".equals(newLoginPwd)) {
      entity.setLoginPwd(MD5Utils.toMD5(newLoginPwd));
    }

    BeanUtils.copyProperties(oldSysLogin, entity);

    baseDao.update(oldSysLogin);
    sysLoginRoleService.updateLoginRole(oldSysLogin, roleIds);
    // 保存系统日志
    String operDesc = "【用户修改】用户名:" + entity.getLoginName();
    sysLogService.save(SysLog.OPERATE_TYPE_UPDATE, operDesc);
    return ResultConstants.UPDATE_SUCCEED;
  }
  /**
   * 加载登录用户的相关信息到登录令牌
   *
   * @param frameSysLogin
   * @return
   */
  public LoginToken getAdminLoginToken(SysLogin sysLogin) throws Exception {
    LoginToken loginToken = new LoginToken();
    loginToken.setSysLogin(sysLogin);
    // 获得该登录者单位信息
    if (sysLogin.getSysCorp() != null) {
      Hibernate.initialize(sysLogin.getSysCorp());
      loginToken.setSysCorp(sysLogin.getSysCorp());
    }
    List<SysRole> roles = new ArrayList<SysRole>();
    if (sysLogin.getSysLoginRoles() != null && sysLogin.getSysLoginRoles().size() > 0) {

      List<SysLoginRole> sysLoginRoles = sysLogin.getSysLoginRoles();
      for (SysLoginRole sysLoginRole : sysLoginRoles) {
        roles.add(sysLoginRole.getSysRole());
      }

    } else {
      SysRole role = new SysRole();
      role.setRoleName("超级管理员");
      roles.add(role);
    }
    loginToken.setSysRoles(roles);
    // 设置登录信息

    Map<Long, SysPermission> menuPermissions = new HashMap<Long, SysPermission>();
    List<SysPermission> menus = null;
    // 如果是超级管理员用户,则显示所有菜单
    if (sysLogin.getUserType().longValue() == SysLogin.USER_TYPE_SUPER_ADMIN) {
      // 获得本系统下所有的菜单项和权限项
      menus = sysPermissionService.findMenuBySystemId(sysLogin.getSystemId());
      for (SysPermission menu : menus) menuPermissions.put(menu.getPermissionId(), menu);

    }
    // 如果不是超级管理员,则根据分配的角色进行权限查询
    else if (sysLogin.getSysLoginRoles() != null) {
      for (SysLoginRole sysLoginRole : sysLogin.getSysLoginRoles()) {
        SysRole sysRole = sysLoginRole.getSysRole();

        for (SysRolePermission rolePermission : sysRole.getSysRolePermissions())
          menuPermissions.put(
              rolePermission.getSysPermission().getPermissionId(),
              rolePermission.getSysPermission());
      }
    }
    loginToken.setMenuPermissions(menuPermissions);

    // 取得数据库中所有一级菜单列表
    List<SysPermission> allLevel1MenuList = sysPermissionService.findLevel1Menu(1);

    List<SysPermission> level1MenuList = new ArrayList<SysPermission>();
    Map<Long, List<SysPermission>> level2MenuMap = new HashMap<Long, List<SysPermission>>();

    if (allLevel1MenuList != null && allLevel1MenuList.size() > 0) {
      for (SysPermission level1Menu : allLevel1MenuList) {
        Long level1MenuId = level1Menu.getPermissionId();

        List<SysPermission> allLevel2Menus =
            sysPermissionService.findMenuByparentIdAndType(
                level1MenuId, SysPermission.PERMISSION_TYPE_1);
        List<SysPermission> level2Menus = new ArrayList<SysPermission>();
        if (allLevel2Menus != null && allLevel2Menus.size() > 0) {
          for (SysPermission level2menu : allLevel2Menus) {
            Long level2MenuId = level2menu.getPermissionId();
            if (menuPermissions.containsKey(level2MenuId)) {
              level2Menus.add(level2menu);
            }
          }
          if (level2Menus.size() > 0) {
            level1MenuList.add(level1Menu);
            level2MenuMap.put(level1MenuId, level2Menus);
          }
        }
      }
    }
    loginToken.setLevel1MenuList(level1MenuList);
    loginToken.setLevel2MenuMap(level2MenuMap);
    return loginToken;
  }