package com.yeshi.buwan.service.imp; import java.io.Serializable; import java.util.Date; import java.util.List; import javax.annotation.Resource; import com.yeshi.buwan.dao.user.LoginUserExtraDao; import com.yeshi.buwan.domain.user.LoginUserExtra; import com.yeshi.buwan.dto.user.LoginInfoDto; import com.yeshi.buwan.exception.user.LoginUserException; import com.yeshi.buwan.exception.user.RegisterUserException; import com.yeshi.buwan.service.inter.LoginUserService; import com.yeshi.buwan.service.inter.system.SystemConfigService; import org.hibernate.HibernateException; import org.hibernate.Session; import org.springframework.cache.annotation.Cacheable; import org.springframework.orm.hibernate4.HibernateCallback; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.yeshi.buwan.dao.user.LoginUserDao; import com.yeshi.buwan.dao.UserDao; import com.yeshi.buwan.domain.user.LoginUser; import com.yeshi.buwan.domain.system.SystemInfo; import com.yeshi.buwan.domain.UserData; import com.yeshi.buwan.domain.UserInfo; import com.yeshi.buwan.util.Constant; import com.yeshi.buwan.util.StringUtil; @Service public class UserService { public UserService() { } @Resource private UserDao userDao; @Resource private LoginUserDao loginUserDao; @Resource private LoginUserExtraDao loginUserExtraDao; @Resource private LoginUserService loginUserService; @Resource private SystemConfigService systemConfigService; // 用户操作 public List getUserList(int system, int page) { return userDao.list("from UserInfo u where u.system.id=? order by u.createtime desc", (page - 1) * Constant.pageCount, Constant.pageCount, new String[]{system + ""}); } //设置昵称 public void setNickName(Long uid, String nickName) { LoginUser update = new LoginUser(); update.setId(uid + ""); update.setName(nickName); loginUserDao.updateSelective(update); } // 获取用户数量 public long getUserInfoCount(int system) { return userDao.getCount("select count(*) from UserInfo u where u.system.id=?", new String[]{system + ""}); } // 获取总的用户数量 public long getUserInfoCount() { return userDao.getCount("select count(*) from UserInfo u"); } // 获取用户的页数 public long getUserInfoPage(int system) { long count = getUserInfoCount(system); return count % Constant.pageCount == 0 ? count / Constant.pageCount : count / Constant.pageCount + 1; } // 获取某个用户的详细信息 @Cacheable(value = "longTimeCache", key = "'getUserInfo'+'-'+#id") public UserInfo getUserInfo(String id) { return userDao.find(UserInfo.class, id); } // 更新用户信息 public void updateUserInfo(UserInfo userInfo) { userDao.update(userInfo); } public void updateLoginUserInfo(LoginUser lu) { loginUserDao.updateSelective(lu); } public String getUid(String device, String system, String imei, String mac, String lat, String lng) { UserInfo info; info = new UserInfo(); info.setDevice(device); if (!StringUtil.isNullOrEmpty(imei)) info.setImei(imei); if (!StringUtil.isNullOrEmpty(mac)) info.setMac(mac); if (!StringUtil.isNullOrEmpty(lat)) info.setLat(lat); if (!StringUtil.isNullOrEmpty(lng)) info.setLng(lng); String s; List list = userDao.list("from UserInfo u where u.device=? and u.system.id=" + system, device); if (list.size() <= 0) {// info.setScore("0"); info.setCreatetime((new StringBuilder(String.valueOf(System.currentTimeMillis()))).toString()); SystemInfo sys = new SystemInfo(); sys.setId(system); info.setSystem(sys); userDao.create(info); s = queryUid(device, system); } else { UserInfo u = (UserInfo) list.get(0); s = u.getId(); if (!StringUtil.isNullOrEmpty(imei)) u.setImei(imei); if (!StringUtil.isNullOrEmpty(mac)) u.setMac(mac); if (!StringUtil.isNullOrEmpty(lat)) u.setLat(lat); if (!StringUtil.isNullOrEmpty(lng)) u.setLng(lng); userDao.update(u); } return s; } @SuppressWarnings("unchecked") public String queryUid(String device, String system) { String s = "0"; List list = userDao.list("from UserInfo u where u.device=? and u.system.id=" + system, new String[]{device}); if (list.size() <= 0) s = "0"; else s = ((UserInfo) list.get(0)).getId(); return s; } @Cacheable(value = "userCache", key = "'getUserData'+'-'+#uid") public UserData getUserData(String uid) { UserData data = new UserData(); data.setCollectCount((new StringBuilder(String.valueOf(userDao.getCount( (new StringBuilder("select count(*) from Collection c where c.user.id=")).append(uid).toString())))) .toString()); data.setWatchCount((new StringBuilder(String.valueOf(userDao.getCount( (new StringBuilder("select count(*) from GetScoreWatch c where c.user.id=")).append(uid).toString())))) .toString()); List user = userDao .list((new StringBuilder("select count(*) from UserInfo u where u.id=")).append(uid).toString()); // if (user != null && user.size() > 0) // data.setScore(((UserInfo) user.get(0)).getScore()); // else // data.setScore("0"); return data; } /** * 登录 * * @param dto * @return * @throws LoginUserException */ public LoginUser login(LoginInfoDto dto) throws LoginUserException { LoginUser loginUser = null; LoginUserExtra loginUserExtra = null; switch (dto.getLoginType()) { case LoginUser.LOGIN_TYPE_EMAIL: { if (StringUtil.isNullOrEmpty(dto.getEmail()) || StringUtil.isNullOrEmpty(dto.getPwd())) { throw new LoginUserException(LoginUserException.CODE_PARAMS_NOT_ENOUGH, "邮箱和密码不能为空"); } List userList = loginUserDao.list("from LoginUser lu where lu.systemId=? and lu.email=? and lu.state=?", dto.getSystemId(), dto.getEmail(), LoginUser.STATE_NORMAL); if (userList == null || userList.size() == 0) { throw new LoginUserException(LoginUserException.CODE_NO_USER, "用户不存在"); } if (!dto.getPwd().equalsIgnoreCase(userList.get(0).getPwd())) { throw new LoginUserException(LoginUserException.CODE_PWD_WRONG, "密码错误"); } loginUser = userList.get(0); loginUserExtra = new LoginUserExtra(loginUser.getId()); loginUserExtra.setEmail(dto.getEmail()); } break; case LoginUser.LOGIN_TYPE_QQ: { if (dto.getQqUserInfo() == null || StringUtil.isNullOrEmpty(dto.getQqUserInfo().getOpenId())) { throw new LoginUserException(LoginUserException.CODE_PARAMS_NOT_ENOUGH, "QQ授权信息为空"); } List userList = loginUserDao.list("from LoginUser lu where lu.systemId=? and lu.qqOpenId=? and lu.state=?", dto.getSystemId(), dto.getQqUserInfo().getOpenId(), LoginUser.STATE_NORMAL); if (userList == null || userList.size() == 0) { throw new LoginUserException(LoginUserException.CODE_NO_USER, "用户不存在"); } loginUser = userList.get(0); loginUserExtra = new LoginUserExtra(loginUser.getId()); loginUserExtra.setQqPortrait(dto.getQqUserInfo().getPortrait()); loginUserExtra.setQqOpenId(dto.getQqUserInfo().getOpenId()); loginUserExtra.setQqNickName(dto.getQqUserInfo().getName()); } break; case LoginUser.LOGIN_TYPE_WX: { if (dto.getWeiXinUser() == null || StringUtil.isNullOrEmpty(dto.getWeiXinUser().getOpenid())) { throw new LoginUserException(LoginUserException.CODE_PARAMS_NOT_ENOUGH, "微信授权信息为空"); } List userList = loginUserDao.list("from LoginUser lu where lu.systemId=? and lu.wxOpenId=? and lu.state=?", dto.getSystemId(), dto.getWeiXinUser().getOpenid(), LoginUser.STATE_NORMAL); if (userList == null || userList.size() == 0) { throw new LoginUserException(LoginUserException.CODE_NO_USER, "用户不存在"); } loginUser = userList.get(0); //更新微信信息 loginUser.setWxUnionId(dto.getWeiXinUser().getUnionid()); loginUserExtra = new LoginUserExtra(loginUser.getId()); loginUserExtra.setWxPortrait(dto.getWeiXinUser().getHeadimgurl()); loginUserExtra.setWxOpenId(dto.getWeiXinUser().getOpenid()); loginUserExtra.setWxNickName(dto.getWeiXinUser().getNickname()); loginUserExtra.setWxSex(dto.getWeiXinUser().getSex()); loginUserExtra.setWxUnionId(dto.getWeiXinUser().getUnionid()); } break; case LoginUser.LOGIN_TYPE_PHONE: { if (StringUtil.isNullOrEmpty(dto.getPhone())) { throw new LoginUserException(LoginUserException.CODE_PARAMS_NOT_ENOUGH, "手机号为空"); } List userList = loginUserDao.list("from LoginUser lu where lu.systemId=? and lu.phone=? and lu.state=?", dto.getSystemId(), dto.getPhone(), LoginUser.STATE_NORMAL); if (userList == null || userList.size() == 0) { throw new LoginUserException(LoginUserException.CODE_NO_USER, "用户不存在"); } loginUser = userList.get(0); loginUserExtra = new LoginUserExtra(loginUser.getId()); } break; } if (loginUser != null) { loginUser.setLoginType(dto.getLoginType()); loginUserDao.updateSelective(loginUser); } if (loginUserExtra != null) { loginUserExtra.setUtdId(dto.getUtdId()); loginUserExtraDao.updateSelective(loginUserExtra); } return loginUser; } /** * 注册 * * @param dto */ public LoginUser register(LoginInfoDto dto) throws RegisterUserException { LoginUser loginUser = null; LoginUserExtra loginUserExtra = null; switch (dto.getLoginType()) { case LoginUser.LOGIN_TYPE_EMAIL: { if (StringUtil.isNullOrEmpty(dto.getEmail()) || StringUtil.isNullOrEmpty(dto.getPwd())) { throw new RegisterUserException(RegisterUserException.CODE_PARAMS_NOT_ENOUGH, "邮箱和密码不能为空"); } List userList = loginUserDao.list("from LoginUser lu where lu.systemId=? and lu.email=? and lu.state=?", dto.getSystemId(), dto.getEmail(), LoginUser.STATE_NORMAL); if (userList != null && userList.size() > 0) { throw new RegisterUserException(RegisterUserException.CODE_USER_EXIST, "用户已存在"); } loginUser = new LoginUser(); loginUser.setLoginType(LoginUser.LOGIN_TYPE_EMAIL); loginUser.setEmail(dto.getEmail()); loginUser.setPwd(dto.getPwd()); loginUser.setName(dto.getNickName()); loginUser.setState(LoginUser.STATE_NORMAL); loginUser.setSystemId(dto.getSystemId()); loginUserExtra = new LoginUserExtra(); loginUserExtra.setEmail(dto.getEmail()); } break; case LoginUser.LOGIN_TYPE_QQ: { if (dto.getQqUserInfo() == null || StringUtil.isNullOrEmpty(dto.getQqUserInfo().getOpenId())) { throw new RegisterUserException(RegisterUserException.CODE_PARAMS_NOT_ENOUGH, "QQ授权信息为空"); } List userList = loginUserDao.list("from LoginUser lu where lu.systemId=? and lu.qqOpenId=? and lu.state=?", dto.getSystemId(), dto.getQqUserInfo().getOpenId(), LoginUser.STATE_NORMAL); if (userList != null && userList.size() > 0) { throw new RegisterUserException(RegisterUserException.CODE_USER_EXIST, "用户已存在"); } loginUser = new LoginUser(); loginUser.setLoginType(LoginUser.LOGIN_TYPE_QQ); loginUser.setQqOpenId(dto.getQqUserInfo().getOpenId()); loginUser.setName(dto.getQqUserInfo().getName()); loginUser.setPortrait(dto.getQqUserInfo().getPortrait()); loginUserExtra = new LoginUserExtra(); loginUserExtra.setQqPortrait(dto.getQqUserInfo().getPortrait()); loginUserExtra.setQqOpenId(dto.getQqUserInfo().getOpenId()); loginUserExtra.setQqNickName(dto.getQqUserInfo().getName()); } break; case LoginUser.LOGIN_TYPE_WX: { if (dto.getWeiXinUser() == null || StringUtil.isNullOrEmpty(dto.getWeiXinUser().getOpenid())) { throw new RegisterUserException(RegisterUserException.CODE_PARAMS_NOT_ENOUGH, "微信授权信息为空"); } List userList = loginUserDao.list("from LoginUser lu where lu.systemId=? and lu.wxOpenId=? and lu.state=?", dto.getSystemId(), dto.getWeiXinUser().getOpenid(), LoginUser.STATE_NORMAL); if (userList != null && userList.size() > 0) { throw new RegisterUserException(RegisterUserException.CODE_USER_EXIST, "用户已存在"); } loginUser = new LoginUser(); loginUser.setLoginType(LoginUser.LOGIN_TYPE_WX); loginUser.setWxUnionId(dto.getWeiXinUser().getUnionid()); loginUser.setName(dto.getWeiXinUser().getNickname()); loginUser.setWxOpenId(dto.getWeiXinUser().getOpenid()); loginUser.setPortrait(dto.getWeiXinUser().getHeadimgurl()); loginUserExtra = new LoginUserExtra(); loginUserExtra.setWxPortrait(dto.getWeiXinUser().getHeadimgurl()); loginUserExtra.setWxOpenId(dto.getWeiXinUser().getOpenid()); loginUserExtra.setWxNickName(dto.getWeiXinUser().getNickname()); loginUserExtra.setWxSex(dto.getWeiXinUser().getSex()); loginUserExtra.setWxUnionId(dto.getWeiXinUser().getUnionid()); } break; case LoginUser.LOGIN_TYPE_PHONE: { if (StringUtil.isNullOrEmpty(dto.getPhone())) { throw new RegisterUserException(RegisterUserException.CODE_PARAMS_NOT_ENOUGH, "手机号为空"); } List userList = loginUserDao.list("from LoginUser lu where lu.systemId=? and lu.phone=? and lu.state=?", dto.getSystemId(), dto.getPhone(), LoginUser.STATE_NORMAL); if (userList != null && userList.size() > 0) { throw new RegisterUserException(RegisterUserException.CODE_USER_EXIST, "用户已存在"); } loginUser = new LoginUser(); loginUser.setLoginType(LoginUser.LOGIN_TYPE_PHONE); loginUser.setName(dto.getNickName()); loginUser.setPhone(dto.getPhone()); loginUserExtra = new LoginUserExtra(); } break; } if (loginUser == null) { throw new RegisterUserException(RegisterUserException.CODE_PARAMS_NOT_ENOUGH, "注册类型出错"); } loginUser.setIpinfo(dto.getIpInfo()); loginUser.setState(LoginUser.STATE_NORMAL); loginUser.setSystemId(dto.getSystemId()); loginUser.setCreatetime(System.currentTimeMillis() + ""); Serializable uid = loginUserDao.save(loginUser); loginUser.setId(uid + ""); if (StringUtil.isNullOrEmpty(loginUser.getName())) { //TODO 昵称前缀 // systemConfigService.getConfigValueByKeyCache(""); //设置默认用户昵称 String nickName = "ID_" + uid; LoginUser update = new LoginUser(); update.setId(uid + ""); update.setName(nickName); loginUserDao.updateSelective(update); } loginUserExtra.setId(loginUser.getId()); loginUserExtra.setCreateTime(new Date()); loginUserService.initExtra(loginUserExtra); return loginUser; } public LoginUser getLoginUser(String id) { return loginUserDao.find(LoginUser.class, id); } public LoginUser getLoginUserByOpenId(String openid) { List list = loginUserDao.list("from LoginUser lu where lu.openid=?", new Serializable[]{openid}); if (list != null && list.size() > 0) return list.get(0); return null; } public LoginUser getValidLoginUserByEmail(String email, String systemId) { List userList = loginUserDao.list("from LoginUser lu where lu.systemId=? and lu.email=? and lu.state=?", systemId, email, LoginUser.STATE_NORMAL); if(userList!=null&&userList.size()>0){ return userList.get(0); } return null; } /** * 用户注销 * * @param uid */ @Transactional public void unRegister(Long uid) throws Exception { LoginUser user = loginUserDao.find(LoginUser.class, uid + ""); if (user == null) { throw new Exception("用户不存在"); } if (user.getState() != LoginUser.STATE_NORMAL) { throw new Exception("账户已被注销"); } user.setState(LoginUser.STATE_UNREGISTER); loginUserDao.updateSelective(user); } // 邮箱注册 public String registerByEmail(final LoginUser user) { return userDao.excute(new HibernateCallback() { @SuppressWarnings("unchecked") public String doInHibernate(Session session) throws HibernateException { List list = session.createQuery("from LoginUser lu where lu.openid=? and lu.loginType=?") .setParameter(0, user.getOpenid()).setParameter(1, user.getLoginType()).list(); if (list != null && list.size() > 0) return "该邮箱已注册"; try { user.setState(LoginUser.STATE_NORMAL); session.getTransaction().begin(); session.save(user); session.flush(); session.getTransaction().commit(); return "注册成功"; } catch (Exception e) { return "注册失败"; } } }) + ""; } /** * 邮箱登录 * * @param user * @return */ public LoginUser loginByEmail(final LoginUser user) { return (LoginUser) userDao.excute(new HibernateCallback() { @SuppressWarnings("unchecked") public LoginUser doInHibernate(Session session) throws HibernateException { List list = session.createQuery("from LoginUser lu where lu.email=?") .setParameter(0, user.getOpenid()).list(); if (list != null && list.size() > 0) { if (list.get(0).getPwd().equalsIgnoreCase(user.getPwd())) return list.get(0); } return null; } }); } }