package com.kingschan.blog.services.impl;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.sf.ehcache.Element;
import net.sf.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.ehcache.EhCacheCacheManager;
import org.springframework.stereotype.Service;
import weibo4j.Users;
import weibo4j.http.AccessToken;
import com.kingschan.blog.common.enums.UserLevel;
import com.kingschan.blog.common.enums.Variable;
import com.kingschan.blog.common.freemarker.util.FreemarkerParseUtil;
import com.kingschan.blog.common.qiniu.QiNiuManagement;
import com.kingschan.blog.model.vo.UserVo;
import com.kingschan.blog.dao.UserDao;
import com.kingschan.blog.po.User;
import com.kingschan.blog.po.WebSite;
import com.kingschan.blog.services.UserService;
import com.kingschan.blog.util.Base64ImgUtil;
import com.kingschan.blog.util.BlogUtil;
import com.kingschan.blog.util.CommomEncrypt;
import com.kingschan.blog.util.CookieUtil;
import com.kingschan.blog.util.DesEncrypt;
import com.kingschan.blog.util.PathUtil;
import com.kingschan.blog.util.RegexUtil;
import com.kingschan.blog.util.StringUtil;
import com.kingschan.blog.util.TimeStampUtil;
@Service
public class UserServiceImpl extends CommonServiceImpl implements UserService {
private Logger log =LoggerFactory.getLogger(UserServiceImpl.class);
@Autowired
private UserDao user_dao;
@Autowired
private QiNiuManagement qiniuMangent;
@Override
public User getUser(String keyword) throws Exception {
return user_dao.getUser(keyword);
}
@Override
public void saveUser(UserVo user) throws Exception {
User u = null;
if (null==user.getId()||user.getId().isEmpty()) {
u=new User();
u.setUserDatetime(TimeStampUtil.getCurrentDate());
u.setUserState((short) 0);
}else{
u=getUser(user.getId());
u.setUserScreenName(user.getUserScreenName());
u.setUserEmail(user.getUserEmail());
}
user_dao.saveUser(u);
}
@Override
public int modifyPsw(String oldpassword, String newpassword, User u)throws Exception {
if (!CommomEncrypt.MD5(oldpassword).equals(u.getUserPsw())) {
throw new Exception("密码不正确!");
}
return user_dao.modifyPsw(CommomEncrypt.MD5(newpassword), u.getId());
}
@Autowired
EhCacheCacheManager em;
@Override
// @Cacheable(value = "userLoginCache", key="#username")
public int getLoginFailures(String username) throws Exception {
Element et= em.getCacheManager().getCache("userLoginCache").get(username);
int value= null==et?0:Integer.valueOf(et.getObjectValue().toString());
return value;
}
@Override
@CachePut(value = "userLoginCache", key = "#username")
public int setLoginFailures(String username) throws Exception {
int total=getLoginFailures(username)+1;
return total;
}
@Override
@CacheEvict(value="userLoginCache",key="#username")
public void clearLoginFailures(String username) throws Exception {
// System.out.println("清空后的次数:"+getLoginFailures(username));
}
@Override
public int userLogin(String username, String psw,boolean isRemember, HttpServletRequest req,HttpServletResponse rep)
throws Exception {
String password=psw.matches("\\w{32}")?psw:CommomEncrypt.MD5(psw);
BlogUtil bu = new BlogUtil(req);
User user = getUser(username);// account, password
if (null == user || !user.getUserPsw().equals(password)) {
//记录错误
addCache("userLoginCache", username, getLoginFailures(username)+1);
return -1;
}
user.setUserLastlogin(TimeStampUtil.getCurrentDate());//记录本次登录时间
CookieUtil cu = new CookieUtil(req, rep);
cu.setCookieAttribute(Variable.COOKIE_JSESSIONID.getKey(), req.getSession().getId(), 60 * 60 * 24 * 3,"/",getShareCookHost());
if (isRemember) {
DesEncrypt des = DesEncrypt.getInstance(Variable.COOKIE_ENCRYPT_KEY.getKey());
cu.setCookieAttribute(Variable.COOKIE_USERNAME_KEY.getKey(), des.getEncString(username), 60 * 60 * 24 * 3,"/",getShareCookHost());
cu.setCookieAttribute(Variable.COOKIE_PSW_KEY.getKey(), des.getEncString(password), 60 * 60 * 24 * 3,"/",getShareCookHost());
}
Iterator<WebSite> itera=user.getWebSites().iterator();
while (itera.hasNext()) {
bu.getSession().setAttribute(Variable.SESSION_BLOG_ADMIN_WEBSITE.getKey(), itera.next());
}
UserVo vo =new UserVo();
BeanUtils.copyProperties(user, vo);
bu.getSession().setAttribute(BlogUtil.CURRENT_USER, vo);
return 1;
}
@Override
public List<UserVo> getUsersVoByEmail(String email) throws Exception {
List<User> users=user_dao.getUsersByEmail(email);
if (null==users||users.size()==0) {
return null;
}
List<UserVo> lis = new ArrayList<UserVo>();
for (User user : users) {
UserVo u = new UserVo();
BeanUtils.copyProperties(user, u);
lis.add(u);
}
return lis;
}
@Override
public String findPswByEmail(String email) throws Exception {
List<User> users=user_dao.getUsersByEmail(email);
if (null==users||users.size()==0) {
throw new Exception("该email不存在!");
}
Map<String, Object> root = new HashMap<String, Object>();
String random=StringUtil.getUUID();
for (User user : users) {
addCache("findPswCache", user.getId(), random);
}
root.put("users", users);
root.put("random", random);
///home/kingschan/apache-tomcat-7.0.62/webapps/ROOT/WEB-INF/\template\
String path=String.format("%s/%s", PathUtil.getWebInfPath(),"/template/");
String result=FreemarkerParseUtil.parserFileTemplate(root, path,"findpsw.html");
return result;
}
@Override
public User existsSinaUser(long uid, boolean login) throws Exception {
User u =user_dao.existsSinaUser(uid);
if (null==u) {
return null;
}
if (login) {
u.setUserLastlogin(TimeStampUtil.getCurrentDate());
}
return u;
}
@Override
public UserVo sinaUserSynchronization(AccessToken token,User user) throws Exception {
Users um = new Users(token.getAccessToken());
weibo4j.model.User sina_user = um.showUserById(token.getUid());
boolean update=null!=user;//是否是更新
User u = null;
if (update) {
u=user;
}else{
u=new User();
u.setId("");
u.setUserName(sina_user.getId());
u.setUserPsw("password");
////性别,m--男,f--女,n--未知
//sina_user.getGender().equals("m")
u.setUserSex(true);
u.setUserEmail("");
u.setUserState((short) 1);
u.setUserDatetime(TimeStampUtil.getCurrentDate());
u.setUserLastlogin(TimeStampUtil.getCurrentDate());
u.setUserEmailActivate(false);
u.setSinaUid(Long.valueOf(sina_user.getId()));
u.setUserLevel(UserLevel.GUEST.toString());
}
u.setUserScreenName(sina_user.getScreenName());
u.setUserProfileImg(sina_user.getAvatarLarge());
u.setSinaToken(token.getAccessToken());
u.setSinaExpireIn(Long.valueOf(token.getExpireIn()));
u.setSinaProfileUrl(sina_user.getUserDomain());
user_dao.saveUser(u);
UserVo vo1 =new UserVo();
BeanUtils.copyProperties(u, vo1);
return vo1;
}
@Override
public boolean canFindPass(String uid, String key) throws Exception {
if (null==uid||null==key||uid.isEmpty()||key.isEmpty()) {
return false;
}
Object token= getCache("findPswCache", uid);
if (null==token||!token.toString().equals(key)) {
return false;
}
return true;
}
@Override
public UserVo resetPass(String password, String uid) throws Exception {
User u =getUser(uid);
String pass=CommomEncrypt.MD5(password);
u.setUserPsw(pass);
user_dao.saveUser(u);
removeCache("findPswCache", uid);
UserVo vo = new UserVo();
BeanUtils.copyProperties(u, vo);
return vo;
}
@Override
public UserVo getUserVoByKeyword(String keyword) throws Exception {
User u = getUser(keyword);
if (null!=u) {
UserVo vo = new UserVo();
BeanUtils.copyProperties(u, vo);
return vo;
}
return null;
}
@Override
public void activeEmail(HttpServletRequest req, String uid)
throws Exception {
User u =getUser(uid);
if (null==u) {
throw new Exception("对象不存在,非法操作!");
}
u.setUserEmailActivate(true);
user_dao.saveUser(u);
UserVo vo = new UserVo();
BeanUtils.copyProperties(u, vo);
BlogUtil bu = new BlogUtil(req);
bu.getSession().setAttribute(BlogUtil.CURRENT_USER, vo);
}
@Override
public Map<String, Object> getUserInfoCard(String username) throws Exception {
//user_info_card
Map<String, Object> data= user_dao.getUserInfoCard(username);
return data;
}
@Override
public String uploadProfile(String userid, String base64) throws Exception {
String[] data=base64.split(",");
//data:image/png;base64
String suffix =RegexUtil.findStrByRegx(data[0], "/\\w+").substring(1);
String fileName=String.format("%s.%s", userid,suffix);
Base64ImgUtil.decodeBase64ToImage(data[1], getFileTempFolder(), fileName);
String path=String.format("%s/%s", getFileTempFolder(),fileName);
if (!new File(path).exists()) {
throw new Exception("img don't exists...");
}
User u = getUser(userid);
if (u.getUserProfileImg().contains("51so.info")) {
String key=RegexUtil.findStrByRegx(u.getUserProfileImg(), "[\\w|-]+$");
try {
qiniuMangent.delRes(key);
} catch (Exception e) {
log.error("uploadProfile",e);
}
}
JSONObject json= qiniuMangent.upload(path, null);
String imgUrl=String.format("http://res.51so.info/%s", json.getString("key"));
u.setUserProfileImg(imgUrl);
return imgUrl;
}
}