Merge branch 'lyp_comment_model'

# 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.java
main
lyp 10 months ago
commit cb60dcd5e5

@ -34,6 +34,12 @@
<artifactId>spring-cloud-starter-config</artifactId> <artifactId>spring-cloud-starter-config</artifactId>
</dependency> </dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.16</version>
</dependency>
<dependency> <dependency>
<groupId>net.renfei</groupId> <groupId>net.renfei</groupId>
<artifactId>ip2location</artifactId> <artifactId>ip2location</artifactId>
@ -52,6 +58,10 @@
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId> <artifactId>spring-boot-starter-actuator</artifactId>
</dependency> </dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-openfeign-core</artifactId>
</dependency>
</dependencies> </dependencies>
<build> <build>
<finalName>app</finalName> <finalName>app</finalName>

@ -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;
}
}

@ -1,23 +1,25 @@
package com.luoo.comment.controller; package com.luoo.comment.controller;
import com.luoo.comment.pojo.Comment;
import com.luoo.comment.service.CommentService;
import api.PageResult; import api.PageResult;
import api.Result; import api.Result;
import api.StatusCode; import api.StatusCode;
import com.luoo.comment.pojo.Comment;
import java.util.List; import com.luoo.comment.pojo.CommentDto;
import com.luoo.comment.pojo.CommentVo;
import com.luoo.comment.pojo.LoginAuthDto;
import com.luoo.comment.service.CommentService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController @RestController
@CrossOrigin @CrossOrigin
@RequestMapping("/comment") @RequestMapping("/comment")
public class CommentController { public class CommentController extends BaseController{
@Autowired @Autowired
private CommentService commentService; private CommentService commentService;
@ -25,12 +27,6 @@ public class CommentController {
@Autowired @Autowired
private RedisTemplate redisTemplate; private RedisTemplate redisTemplate;
@GetMapping
public Result<List<Comment>> findAll(){
return Result.success(commentService.findAll());
}
@GetMapping("/findByVolid/{volid}") @GetMapping("/findByVolid/{volid}")
public Result<List<Comment>> findByVolid(@PathVariable String volid){ public Result<List<Comment>> findByVolid(@PathVariable String volid){
return Result.success(commentService.findByVolid(volid)); return Result.success(commentService.findByVolid(volid));
@ -43,18 +39,11 @@ public class CommentController {
} }
@PostMapping @PostMapping("/save")
public Result<Void> save(@RequestBody Comment comment){ public Result<Void> save(@RequestBody CommentDto commentDto){
commentService.save(comment); LoginAuthDto loginAuthDto = getLoginAuthDto();
return Result.success(); commentDto.setUserId(loginAuthDto.getUserId());
commentService.save(commentDto);
}
@PutMapping("/{commentId}")
public Result<Void> update(@PathVariable String commentId,@RequestBody Comment comment){
comment.set_id(commentId);
commentService.update(comment);
return Result.success(); return Result.success();
} }
@ -63,24 +52,25 @@ public class CommentController {
public Result<Void> delete(@PathVariable String commentId){ public Result<Void> delete(@PathVariable String commentId){
commentService.deleteById(commentId); commentService.deleteById(commentId);
return Result.success(); return Result.success();
} }
@GetMapping("/{parentid}/{page}/{size}") @GetMapping("/findByParentId")
public Result<PageResult<Comment>> findByParentid(@PathVariable String parentid,@PathVariable int page,@PathVariable int size){ public Result<PageResult<CommentVo>> findByParentId(@RequestParam String parentId,
@RequestParam int page,
Page<Comment> pageData = commentService.findByParentId(parentid,page,size); @RequestParam int size){
return Result.success(new PageResult<Comment>(pageData.getTotalElements(),pageData.getContent())); Page<CommentVo> pageData = commentService.findByParentId(parentId,page,size);
return Result.success(new PageResult<>(pageData.getTotalElements(),pageData.getContent()));
} }
@PutMapping("/thumbup/{commentId}") @PutMapping("/thumbup/{commentId}")
public Result thumbup(@PathVariable String commentId){ public Result thumbup(@PathVariable String commentId){
String userid="111"; LoginAuthDto loginAuthDto = getLoginAuthDto();
if (redisTemplate.opsForValue().get("thumbup_"+userid)!=null){ String userId = loginAuthDto.getUserId();
if (redisTemplate.opsForValue().get("thumbup_"+userId)!=null){
return Result.failed(StatusCode.COMMENT_REPEAT_SUBMIT); return Result.failed(StatusCode.COMMENT_REPEAT_SUBMIT);
} }
commentService.thumbup(commentId); commentService.thumbup(commentId);
redisTemplate.opsForValue().set("thumbup_"+userid,1); redisTemplate.opsForValue().set("thumbup_"+userId,1);
return Result.success(); return Result.success();
} }
} }

@ -9,8 +9,8 @@ import java.util.List;
public interface CommentDao extends MongoRepository<Comment,String> { public interface CommentDao extends MongoRepository<Comment,String> {
public Page<Comment> findByParentid(String parentid, Pageable pageable); Page<Comment> findByParentId(String parentId, Pageable pageable);
public List<Comment> findByArticleid(String articleid); List<Comment> findByArticleId(String articleId);
} }

@ -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;
}
}

@ -1,23 +1,24 @@
package com.luoo.comment.pojo; package com.luoo.comment.pojo;
import lombok.Data;
import org.springframework.beans.BeanUtils;
import org.springframework.data.annotation.Id; import org.springframework.data.annotation.Id;
import java.io.Serializable; import java.io.Serializable;
import java.util.Date; import java.util.Date;
@Data
public class Comment implements Serializable { public class Comment implements Serializable {
@Id @Id
private String _id; private String id;
// 评论内容 // 评论内容
private String content; private String content;
// 发布时间 // 发布时间
private Date publishtime; private Date publishTime;
private String userid;
// 昵称 private String userId;
private String nickname;
// 访问数
private Integer visits;
// 点赞数 // 点赞数
private Integer thumbup; private Integer thumbup;
// 转发数 // 转发数
@ -26,105 +27,30 @@ public class Comment implements Serializable {
private Integer comment; private Integer comment;
// 状态 // 状态
private String state; private Integer state;
private String parentid;
private String articleid;
public String get_id() {
return _id;
}
public void set_id(String _id) {
this._id = _id;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public Date getPublishtime() { /**
return publishtime; * ID
} */
private String parentId;
public void setPublishtime(Date publishtime) { private String articleId;
this.publishtime = publishtime;
}
public String getUserid() { private Integer level;
return userid;
}
public void setUserid(String userid) { private String targetId;
this.userid = userid;
}
public String getNickname() { /**
return nickname; *
} */
private Integer type;
public void setNickname(String nickname) { private String city;
this.nickname = nickname;
}
public Integer getVisits() {
return visits;
}
public void setVisits(Integer visits) {
this.visits = visits;
}
public Integer getThumbup() { public CommentVo convertVo () {
return thumbup; CommentVo commentVo = new CommentVo();
BeanUtils.copyProperties(this, commentVo);
return commentVo;
} }
public void setThumbup(Integer thumbup) {
this.thumbup = thumbup;
}
public Integer getShare() {
return share;
}
public void setShare(Integer share) {
this.share = share;
}
public Integer getComment() {
return comment;
}
public void setComment(Integer comment) {
this.comment = comment;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
public String getParentid() {
return parentid;
}
public void setParentid(String parentid) {
this.parentid = parentid;
}
public String getArticleid() {
return articleid;
}
public void setArticleid(String articleid) {
this.articleid = articleid;
}
} }

@ -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);
}
}

@ -0,0 +1,84 @@
package com.luoo.comment.utils;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import java.util.HashMap;
import java.util.Map;
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class ThreadLocalMap {
/**
* The constant threadContext.
*/
private final static ThreadLocal<Map<String, Object>> THREAD_CONTEXT = new MapThreadLocal();
/**
* Put.
*
* @param key the key
* @param value the value
*/
public static void put(String key, Object value) {
getContextMap().put(key, value);
}
/**
* Remove object.
*
* @param key the key
*
* @return the object
*/
public static Object remove(String key) {
return getContextMap().remove(key);
}
/**
* Get object.
*
* @param key the key
*
* @return the object
*/
public static Object get(String key) {
return getContextMap().get(key);
}
private static class MapThreadLocal extends ThreadLocal<Map<String, Object>> {
/**
* Initial value map.
*
* @return the map
*/
@Override
protected Map<String, Object> initialValue() {
return new HashMap<String, Object>(8) {
private static final long serialVersionUID = 3637958959138295593L;
@Override
public Object put(String key, Object value) {
return super.put(key, value);
}
};
}
}
/**
* thread context Map
*
* @return thread context Map
*/
private static Map<String, Object> getContextMap() {
return THREAD_CONTEXT.get();
}
/**
* 线hold便
*/
public static void remove() {
getContextMap().clear();
}
}
Loading…
Cancel
Save