package com.xiaozhi.blog.mongo; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.annotation.PostConstruct; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.codehaus.jackson.map.ObjectMapper; import org.codehaus.jackson.type.TypeReference; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.mongodb.core.MongoOperations; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Update; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.support.atomic.RedisAtomicLong; import org.springframework.stereotype.Repository; import com.mongodb.WriteResult; import com.tianji.test.core.redis.AuthUser; import com.xiaozhi.blog.formbean.UserForm; import com.xiaozhi.blog.utils.Collections3; import com.xiaozhi.blog.utils.KeyUtils; import com.xiaozhi.blog.utils.MD5; import com.xiaozhi.blog.vo.SinaAccessToken; import com.xiaozhi.blog.vo.User; @Repository public class MongoUserDao { private static Log logger = LogFactory.getLog(MongoUserDao.class); private static final Pattern MENTION_REGEX = Pattern.compile("@([-_a-zA-Z0-9\u4e00-\u9fa5]{2,20}+)"); private RedisAtomicLong userIdCounter; @Autowired private MongoOperations mongoTemplate; @Autowired private StringRedisTemplate template; @PostConstruct public void init () { userIdCounter = new RedisAtomicLong(KeyUtils.globalUid(), template.getConnectionFactory()); } /** * 新注册用户 * * @param name * @param password * @param company * @param school * @return */ public boolean addUser(User user) { final String uid = String.valueOf(userIdCounter.incrementAndGet()); user.setId(uid); user.setPass(MD5.calcMD5(user.getPass())); user.setRoles("[\"ROLE_USER\"]"); /** 给新注册用户增加默认用户权限 */ try { this.mongoTemplate.save(user); } catch (Exception e) { logger.error("------------addUser error :" + e.toString(), e); return false; } return true; } /** * 用户名是否重复 * * @param name * @return */ public boolean isNameDuplicate(String name) { User user = this.mongoTemplate.findOne(new Query(Criteria.where("name").is(name)), User.class); return user == null ? false : true; } /** * 用户昵称是否重复 * * @param nickname * @return */ public boolean isNickNameDuplicate(String nickname) { User user = this.mongoTemplate.findOne(new Query(Criteria.where("nickname").is(nickname)), User.class); return user == null ? false : true; } // public User getUserByNickName(String nickname) { // User user = this.mongoTemplate.findOne(new Query(Criteria.where("nickname").is(nickname)), User.class); // return user; // } /** * 通过用户昵称集合一次性获取用户集合 * @param nicknames * @return */ public Map<String, User> getUsersByNickNames(List<String> nicknames){ List<User> users=this.mongoTemplate.find(new Query(Criteria.where("nickname").in(nicknames.toArray())),User.class); return new Collections3<String,User>().extractToMap(users, "nickname"); } /** * 编辑用户信息 * * @param user * @param company * @param school * @return */ public boolean editUser(final String uid, final UserForm userForm) { try { WriteResult result = this.mongoTemplate.updateFirst( new Query(Criteria.where("id").is(uid)), new Update().set("nickname", userForm.getNickname()) .set("company", userForm.getCompany()) .set("school", userForm.getSchool()), User.class); return true; } catch (Exception e) { logger.error("==================> editUser error :" + e.toString()); return false; } } /** * 保存weibo头像 * * @param url * @param uid * @return */ public boolean editPortrait(String url, String uid) { try { WriteResult result = this.mongoTemplate.updateFirst( new Query(Criteria.where("id").is(uid)), new Update().set("portraitUrl", url), User.class); return true; } catch (Exception e) { // TODO: handle exception logger.error("----------------------->error:" + e.toString()); } return false; } /** * 获取用户 * @param user * @return */ public User getUserById(String uid) { return this.mongoTemplate.findOne(new Query(Criteria.where("id").is(uid)), User.class); } /** * 通过登录用户名拿到登录用户 权限列表 * @param user * @return */ public AuthUser getAuthUserByName(String name) { User user = this.mongoTemplate.findOne(new Query(Criteria.where("name").is(name)),User.class); if(user.getRoles()==null)return null; List<String> rolList = new ArrayList<String>(); try { rolList = new ObjectMapper().readValue(user.getRoles(), new TypeReference<List<String>>() {}); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return new AuthUser(name,user.getId(), user.getPass(),rolList); } /** * 保存accessToken * @param accessTokenObj */ public boolean saveAccessToken(String uid,Object accessTokenObj){ try { WriteResult result = this.mongoTemplate.updateFirst( new Query(Criteria.where("id").is(uid)), new Update().set("accessToken", accessTokenObj), User.class); return true; } catch (Exception e) { // TODO: handle exception logger.error("----------------------->error:" + e.toString()); } return false; } /** * 获取用户accesstoken * @param user * @return */ public SinaAccessToken getAccessTokenByUser(String uid){ User user = this.mongoTemplate.findOne(new Query(Criteria.where("id").is(uid)),User.class); return user.getAccessToken(); } /** * 通過登錄名得到用戶id * @param name * @return */ // public String findUid(String name) { // User user = this.mongoTemplate.findOne(new Query(Criteria.where("name").is(name)),User.class); // return user.getId(); // } /** * 通過昵稱獲得用戶id * @param nickname * @return */ // public String findUidByNickname(String nickname) { // User user = this.mongoTemplate.findOne(new Query(Criteria.where("nickname").is(nickname)),User.class); // return user.getId(); // } /** * 通过用户id集合获取用户Map集合 * @param ids * @return */ public Map<String, User> getUsersByIds(List<String> ids){ List<User> users=this.mongoTemplate.find(new Query(Criteria.where("id").in(ids.toArray())),User.class); return new Collections3<String,User>().extractToMap(users, "id"); } public List<User> getUserListByIds(List<String> ids){ List<User> users=this.mongoTemplate.find(new Query(Criteria.where("id").in(ids.toArray())),User.class); return users; } public static Collection<String> findMentions(String content) { Matcher regexMatcher = MENTION_REGEX.matcher(content); List<String> mentions = new ArrayList<String>(); while (regexMatcher.find()) { String name = regexMatcher.group().substring(1); if(!mentions.contains(name))mentions.add(name); } return mentions; } }