# Conflicts: # luoo_user/src/main/java/com/luoo/user/controller/UserController.java # luoo_user/src/main/java/com/luoo/user/dao/UserDao.java # luoo_user/src/main/java/com/luoo/user/service/UserService.javamain
commit
cb60dcd5e5
@ -0,0 +1,11 @@
|
|||||||
|
package com.luoo.comment.client;
|
||||||
|
|
||||||
|
|
||||||
|
import org.springframework.cloud.openfeign.FeignClient;
|
||||||
|
|
||||||
|
@FeignClient("luoo-user")
|
||||||
|
public interface UserClient {
|
||||||
|
|
||||||
|
//todo 根据用户 IDs 获取用户昵称集合
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,58 @@
|
|||||||
|
package com.luoo.comment.config;
|
||||||
|
|
||||||
|
import com.luoo.comment.constant.GlobalConstant;
|
||||||
|
import com.luoo.comment.pojo.LoginAuthDto;
|
||||||
|
import com.luoo.comment.utils.ThreadLocalMap;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.springframework.http.HttpHeaders;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
import org.springframework.web.servlet.HandlerInterceptor;
|
||||||
|
import org.springframework.web.servlet.ModelAndView;
|
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
@Slf4j
|
||||||
|
public class TokenInterceptor implements HandlerInterceptor {
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
|
||||||
|
return HandlerInterceptor.super.preHandle(request, response, handler);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
|
||||||
|
|
||||||
|
String token = StringUtils.substringAfter(request.getHeader(HttpHeaders.AUTHORIZATION), "Bearer ");
|
||||||
|
LoginAuthDto loginUser= decode(token);
|
||||||
|
if (loginUser == null) {
|
||||||
|
log.error("获取用户信息失败, 不允许操作,需重新登录");
|
||||||
|
throw new RuntimeException("获取用户信息失败, 不允许操作,需重新登录");
|
||||||
|
}
|
||||||
|
log.info("请求uri => {} method => {} user => {} userId => {} token => {}",
|
||||||
|
request.getRequestURI(), request.getMethod(), loginUser.getLoginName(), loginUser.getUserId(),token);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
|
||||||
|
ThreadLocalMap.remove(GlobalConstant.TOKEN_AUTH_DTO);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 解析token
|
||||||
|
* @param token
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static LoginAuthDto decode(String token){
|
||||||
|
// Jwt decode = JwtHelper.decode(token);
|
||||||
|
// return decodeLoginUser(decode);
|
||||||
|
// 解析 token
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,9 @@
|
|||||||
|
package com.luoo.comment.constant;
|
||||||
|
|
||||||
|
public class GlobalConstant {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 全局用户名
|
||||||
|
*/
|
||||||
|
public static final String TOKEN_AUTH_DTO = "CURRENT_USER_DTO";
|
||||||
|
}
|
@ -0,0 +1,21 @@
|
|||||||
|
package com.luoo.comment.controller;
|
||||||
|
|
||||||
|
import cn.hutool.core.util.ObjectUtil;
|
||||||
|
import com.luoo.comment.pojo.LoginAuthDto;
|
||||||
|
import com.luoo.comment.utils.ThreadLocalMap;
|
||||||
|
|
||||||
|
public class BaseController {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 全局用户名
|
||||||
|
*/
|
||||||
|
public static final String TOKEN_AUTH_DTO = "CURRENT_USER_DTO";
|
||||||
|
|
||||||
|
protected LoginAuthDto getLoginAuthDto() {
|
||||||
|
LoginAuthDto loginAuthDto = (LoginAuthDto) ThreadLocalMap.get(TOKEN_AUTH_DTO);
|
||||||
|
if (ObjectUtil.isEmpty(loginAuthDto)) {
|
||||||
|
throw new RuntimeException();
|
||||||
|
}
|
||||||
|
return loginAuthDto;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,29 @@
|
|||||||
|
package com.luoo.comment.enums;
|
||||||
|
|
||||||
|
public enum CommentStatusEnum {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 正常
|
||||||
|
*/
|
||||||
|
NORMAL(1),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除
|
||||||
|
*/
|
||||||
|
DELETE(2),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 审核中
|
||||||
|
*/
|
||||||
|
AUDITING(3);
|
||||||
|
|
||||||
|
private final int value;
|
||||||
|
|
||||||
|
CommentStatusEnum(int value) {
|
||||||
|
this.value = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getValue() {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,37 @@
|
|||||||
|
package com.luoo.comment.pojo;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class CommentDto implements Serializable {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 文章 ID
|
||||||
|
*/
|
||||||
|
private String articleId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 评论内容
|
||||||
|
*/
|
||||||
|
private String content;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 父节点 ID
|
||||||
|
*/
|
||||||
|
private String parentId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 目标 ID
|
||||||
|
*/
|
||||||
|
private String targetId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* IP 地址
|
||||||
|
*/
|
||||||
|
private String ipAddress;
|
||||||
|
|
||||||
|
private String userId;
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,78 @@
|
|||||||
|
package com.luoo.comment.pojo;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class CommentVo {
|
||||||
|
|
||||||
|
private String id;
|
||||||
|
/**
|
||||||
|
* 评论内容
|
||||||
|
*/
|
||||||
|
private String content;
|
||||||
|
/**
|
||||||
|
* 发布时间
|
||||||
|
*/
|
||||||
|
private Date publishTime;
|
||||||
|
/**
|
||||||
|
* 用户 ID
|
||||||
|
*/
|
||||||
|
private String userId;
|
||||||
|
/**
|
||||||
|
* 昵称
|
||||||
|
*/
|
||||||
|
private String nickName;
|
||||||
|
/**
|
||||||
|
* 点赞数
|
||||||
|
*/
|
||||||
|
private Integer thumbup;
|
||||||
|
/**
|
||||||
|
* 转发数
|
||||||
|
*/
|
||||||
|
private Integer share;
|
||||||
|
/**
|
||||||
|
* 评论数量
|
||||||
|
*/
|
||||||
|
private Integer comment;
|
||||||
|
/**
|
||||||
|
* 状态
|
||||||
|
*/
|
||||||
|
private String state;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 父节点 ID
|
||||||
|
*/
|
||||||
|
private String parentId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 文章
|
||||||
|
*/
|
||||||
|
private String articleId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 层级
|
||||||
|
*/
|
||||||
|
private Integer level;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 目标ID
|
||||||
|
*/
|
||||||
|
private String targetId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 目标对象
|
||||||
|
*/
|
||||||
|
private CommentVo targetComment;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 评论类型
|
||||||
|
*/
|
||||||
|
private String type;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 城市
|
||||||
|
*/
|
||||||
|
private String city;
|
||||||
|
}
|
@ -0,0 +1,29 @@
|
|||||||
|
package com.luoo.comment.pojo;
|
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@ApiModel(value = "登录人信息")
|
||||||
|
public class LoginAuthDto implements Serializable {
|
||||||
|
private static final long serialVersionUID = -1137852221455042256L;
|
||||||
|
@ApiModelProperty(value = "用户ID")
|
||||||
|
private String userId;
|
||||||
|
@ApiModelProperty(value = "登录名")
|
||||||
|
private String loginName;
|
||||||
|
@ApiModelProperty(value = "用户名")
|
||||||
|
private String userName;
|
||||||
|
|
||||||
|
public LoginAuthDto() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public LoginAuthDto(String userId, String loginName, String userName) {
|
||||||
|
this.userId = userId;
|
||||||
|
this.loginName = loginName;
|
||||||
|
this.userName = userName;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,87 +1,26 @@
|
|||||||
package com.luoo.comment.service;
|
package com.luoo.comment.service;
|
||||||
|
|
||||||
|
|
||||||
import com.luoo.comment.dao.CommentDao;
|
|
||||||
import com.luoo.comment.pojo.Comment;
|
import com.luoo.comment.pojo.Comment;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import com.luoo.comment.pojo.CommentDto;
|
||||||
|
import com.luoo.comment.pojo.CommentVo;
|
||||||
import org.springframework.data.domain.Page;
|
import org.springframework.data.domain.Page;
|
||||||
import org.springframework.data.domain.PageRequest;
|
|
||||||
import org.springframework.data.domain.Pageable;
|
|
||||||
import org.springframework.data.mongodb.core.MongoTemplate;
|
|
||||||
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.stereotype.Service;
|
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
|
||||||
import util.IdWorker;
|
|
||||||
|
|
||||||
import java.util.Date;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@Service
|
public interface CommentService {
|
||||||
@Transactional
|
|
||||||
public class CommentService {
|
|
||||||
|
|
||||||
@Autowired
|
Comment findById(String id);
|
||||||
private CommentDao commentDao;
|
|
||||||
|
|
||||||
@Autowired
|
void save(CommentDto commentDto);
|
||||||
private IdWorker idWorker;
|
|
||||||
|
|
||||||
@Autowired
|
void update(Comment comment);
|
||||||
private MongoTemplate mongoTemplate;
|
|
||||||
public List<Comment> findAll() {
|
|
||||||
return commentDao.findAll();
|
|
||||||
}
|
|
||||||
|
|
||||||
public Comment findById(String id) {
|
void deleteById(String id);
|
||||||
return commentDao.findById(id).get();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void save(Comment comment){
|
Page<CommentVo> findByParentId(String parentId, int page, int size);
|
||||||
comment.set_id(idWorker.nextId()+"");
|
|
||||||
comment.setPublishtime(new Date());
|
|
||||||
comment.setVisits(0);
|
|
||||||
comment.setShare(0);
|
|
||||||
comment.setThumbup(0);
|
|
||||||
comment.setComment(0);
|
|
||||||
comment.setState("1");
|
|
||||||
// 如果当前添加的吐槽,有父节点,那么父节点的吐槽回复数要加一
|
|
||||||
if (comment.getParentid()!=null && !"".equals(comment.getParentid())) {
|
|
||||||
Query query = new Query();
|
|
||||||
query.addCriteria(Criteria.where("_id").is(comment.getParentid()));
|
|
||||||
Update update = new Update();
|
|
||||||
update.inc("comment",1);
|
|
||||||
mongoTemplate.updateFirst(query,update,"spit");
|
|
||||||
}
|
|
||||||
commentDao.save(comment);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void update(Comment comment) {
|
void thumbup(String commentId);
|
||||||
commentDao.save(comment);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void deleteById(String id) {
|
List<Comment> findByVolid(String volid);
|
||||||
commentDao.deleteById(id);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public Page<Comment> findByParentId(String parentid,int page,int size){
|
|
||||||
|
|
||||||
Pageable pageable = PageRequest.of(page-1,size);
|
|
||||||
return commentDao.findByParentid(parentid,pageable);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void thumbup(String commentId) {
|
|
||||||
|
|
||||||
Query query = new Query();
|
|
||||||
query.addCriteria(Criteria.where("_id").is("1"));
|
|
||||||
Update update = new Update();
|
|
||||||
update.inc("thumbup",1);
|
|
||||||
mongoTemplate.updateFirst(query,update,"spit");
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<Comment> findByVolid(String volid) {
|
|
||||||
return commentDao.findByArticleid(volid);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,136 @@
|
|||||||
|
package com.luoo.comment.service.impl;
|
||||||
|
|
||||||
|
|
||||||
|
import cn.hutool.core.util.ObjectUtil;
|
||||||
|
import com.luoo.comment.dao.CommentDao;
|
||||||
|
import com.luoo.comment.enums.CommentStatusEnum;
|
||||||
|
import com.luoo.comment.pojo.Comment;
|
||||||
|
import com.luoo.comment.pojo.CommentDto;
|
||||||
|
import com.luoo.comment.pojo.CommentVo;
|
||||||
|
import com.luoo.comment.service.CommentService;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.data.domain.*;
|
||||||
|
import org.springframework.data.mongodb.core.MongoTemplate;
|
||||||
|
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.stereotype.Service;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
import util.IdWorker;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.function.Function;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
@Transactional
|
||||||
|
public class CommentServiceImpl implements CommentService {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private CommentDao commentDao;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IdWorker idWorker;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private MongoTemplate mongoTemplate;
|
||||||
|
|
||||||
|
|
||||||
|
public Comment findById(String id) {
|
||||||
|
return commentDao.findById(id).get();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void save(CommentDto commentDto){
|
||||||
|
Comment comment = new Comment();
|
||||||
|
comment.setContent(commentDto.getContent());
|
||||||
|
comment.setPublishTime(new Date());
|
||||||
|
comment.setUserId(commentDto.getUserId());
|
||||||
|
comment.setComment(0);
|
||||||
|
comment.setParentId(commentDto.getParentId());
|
||||||
|
comment.setArticleId(commentDto.getArticleId());
|
||||||
|
comment.setLevel(1);
|
||||||
|
comment.setTargetId(commentDto.getTargetId());
|
||||||
|
comment.setType(0);
|
||||||
|
comment.setCity("上海");
|
||||||
|
comment.setId(String.valueOf(idWorker.nextId()));
|
||||||
|
comment.setShare(0);
|
||||||
|
comment.setThumbup(0);
|
||||||
|
comment.setComment(0);
|
||||||
|
comment.setState(CommentStatusEnum.NORMAL.getValue());
|
||||||
|
// 如果当前添加的吐槽,有父节点,那么父节点的吐槽回复数要加一
|
||||||
|
if (ObjectUtil.isNotEmpty(comment.getParentId())) {
|
||||||
|
// 更新父节点的评论回复数
|
||||||
|
Query query = new Query();
|
||||||
|
query.addCriteria(Criteria.where("_id").is(comment.getParentId()));
|
||||||
|
Update update = new Update();
|
||||||
|
update.inc("comment",1);
|
||||||
|
mongoTemplate.updateFirst(query,update,Comment.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ObjectUtil.isNotEmpty(comment.getTargetId())) {
|
||||||
|
Comment parentIdComment = mongoTemplate.findById(comment.getTargetId(), Comment.class);
|
||||||
|
comment.setLevel(parentIdComment.getLevel()+1);
|
||||||
|
Query query = new Query();
|
||||||
|
query.addCriteria(Criteria.where("_id").is(comment.getTargetId()));
|
||||||
|
Update update = new Update();
|
||||||
|
update.inc("comment",1);
|
||||||
|
mongoTemplate.updateFirst(query,update,Comment.class);
|
||||||
|
}
|
||||||
|
commentDao.save(comment);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void update(Comment comment) {
|
||||||
|
commentDao.save(comment);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void deleteById(String id) {
|
||||||
|
commentDao.deleteById(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public Page<CommentVo> findByParentId(String parentId,int page,int size){
|
||||||
|
Pageable pageable = PageRequest.of(page, size);
|
||||||
|
Query query = new Query();
|
||||||
|
Criteria criteria = Criteria.where("parentId").is(parentId);
|
||||||
|
query.addCriteria(criteria);
|
||||||
|
Sort sort = Sort.by(Sort.Direction.ASC, "age");
|
||||||
|
query.with(sort);
|
||||||
|
query.with(pageable);
|
||||||
|
List<Comment> comments = mongoTemplate.find(query, Comment.class);
|
||||||
|
|
||||||
|
List<CommentVo> commentVos = comments.stream().map(Comment::convertVo).collect(Collectors.toList());
|
||||||
|
|
||||||
|
List<String> targetComments = comments.stream().map(Comment::getTargetId).collect(Collectors.toList());
|
||||||
|
|
||||||
|
Map<String, CommentVo> idCommentMap = commentVos.stream().collect(Collectors.toMap(CommentVo::getId, Function.identity()));
|
||||||
|
|
||||||
|
long total = mongoTemplate.count(query, Comment.class);
|
||||||
|
|
||||||
|
// boolean isChange = targetComments.removeAll(idCommentMap.keySet());
|
||||||
|
|
||||||
|
for (CommentVo commentVo : commentVos) {
|
||||||
|
if (commentVo.getLevel() > 2 && ObjectUtil.isNotEmpty(commentVo.getTargetId())) {
|
||||||
|
CommentVo targetCommentVo = idCommentMap.get(commentVo.getTargetId());
|
||||||
|
if (targetCommentVo != null) {
|
||||||
|
commentVo.setTargetComment(targetCommentVo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return new PageImpl<>(commentVos, pageable, total);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void thumbup(String commentId) {
|
||||||
|
|
||||||
|
Query query = new Query();
|
||||||
|
query.addCriteria(Criteria.where("_id").is("1"));
|
||||||
|
Update update = new Update();
|
||||||
|
update.inc("thumbup",1);
|
||||||
|
mongoTemplate.updateFirst(query,update,"spit");
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Comment> findByVolid(String volid) {
|
||||||
|
return commentDao.findByArticleId(volid);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in new issue