提交 81f80204 作者: xiaowang

论坛社区

上级 5ae1e0be
package com.mmc.csf.forum.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.List;
/**
* @Author LW
* @date 2023/5/15 10:29
* 概要:评论信息参数
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class CommentAndReplyVO implements Serializable {
@ApiModelProperty(value = "评论id")
private Integer id;
@ApiModelProperty(value = "动态id")
private Integer dynamicId;
@ApiModelProperty(value = "父级评论id")
private Integer parentId;
@ApiModelProperty(value = "模拟用户id")
private Integer userId;
@ApiModelProperty(value = "评论内容")
private String content;
@ApiModelProperty(value = "评论点赞数")
private Integer likesCount;
private List<CommentAndReplyVO> children;
}
package com.mmc.csf.forum.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* @Author LW
* @date 2023/5/15 10:29
* 概要:评论信息参数
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class CommentVO implements Serializable {
@ApiModelProperty(value = "评论id")
private Integer id;
@ApiModelProperty(value = "动态id")
private Integer dynamicId;
@ApiModelProperty(value = "父级评论id(不传则是评论动态 传了则是回复评论)")
private Integer parentId;
@ApiModelProperty(value = "模拟用户id")
private Integer userId;
@ApiModelProperty(value = "评论内容")
private String content;
}
package com.mmc.csf.forum.vo;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.annotations.ApiParam;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.math.BigDecimal;
/**
* @Author LW
* @date 2023/5/15 10:29
* 概要:动态信息参数
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class DynamicVO implements Serializable {
@ApiModelProperty(value = "模拟用户id")
private Integer userId;
@ApiModelProperty(value = "动态id")
private Integer id;
@ApiModelProperty(value = "动态标题")
private String title;
@ApiModelProperty(value = "动态描述")
private String description;
@ApiModelProperty(value = "位置信息")
private String location;
@ApiModelProperty(value = "纬度")
private BigDecimal lat;
@ApiModelProperty(value = "经度")
private BigDecimal lon;
@ApiModelProperty(value = "图片/视频")
private MediaVO mediaVO;
@ApiModelProperty(value = "点赞数")
private Integer likesCount;
@ApiModelProperty(value = "评论数")
private Integer commentCount;
@ApiModelProperty(value = "是否点赞")
private Boolean likes;
}
package com.mmc.csf.forum.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.List;
/**
* @Author LW
* @date 2023/5/16 10:42
* 概要:图片或影像
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class MediaVO implements Serializable {
@ApiModelProperty("图片")
private List<String> picture;
@ApiModelProperty("视频")
private String videoUrl;
}
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.mmc.csf</groupId>
<artifactId>iuav-ims</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>forum-service</artifactId>
<dependencies>
<!-- 引入 Web 功能 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 健康监控 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- Eureka 客户端, 客户端向 Eureka Server 注册的时候会提供一系列的元数据信息, 例如: 主机, 端口, 健康检查url等
Eureka Server 接受每个客户端发送的心跳信息, 如果在某个配置的超时时间内未接收到心跳信息, 实例会被从注册列表中移除 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<exclusions>
<exclusion>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 引入 Feign, 可以以声明的方式调用微服务 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- 使用okhttp-feign-连接池技术 -->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-okhttp</artifactId>
</dependency>
<!-- 引入服务容错 Hystrix 的依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
<exclusions>
<exclusion>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- mybatis驱动&Druid数据源-start -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- mybatis驱动&Druid数据源-end -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.mmc.csf.common</groupId>
<artifactId>csf-common-model</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.mmc.csf.common</groupId>
<artifactId>csf-common-util</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<!-- RabbitMQ -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<!-- easypoi导出 -->
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-base</artifactId>
</dependency>
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-web</artifactId>
</dependency>
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-annotation</artifactId>
</dependency>
</dependencies>
<!-- SpringBoot的Maven插件, 能够以Maven的方式为应用提供SpringBoot的支持,可以将 SpringBoot应用打包为可执行的jar或war文件,
然后以通常的方式运行SpringBoot应用 -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
<resources>
<!--需要动态添加的资源 -->
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<!--读取打包命令中指定的环境 -->
<include>**/*.yml</include>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
</resource>
</resources>
</build>
</project>
\ No newline at end of file
package com.mmc.csf.forum;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @Author LW
* @date 2023/5/13 10:39
* 概要:
// */
//@EnableFeignClients(basePackages = "com.mmc.csf.starter.client") // 所有FeignClient放在client-feign-springboot-starter里面进行管理
//@EnableCircuitBreaker
//@EnableEurekaClient
@SpringBootApplication
public class ForumApplication {
public static void main(String[] args) {
SpringApplication.run(ForumApplication.class, args);
}
}
package com.mmc.csf.forum.controller;
import com.mmc.csf.common.util.web.ResultBody;
import com.mmc.csf.forum.service.DynamicService;
import com.mmc.csf.forum.vo.CommentAndReplyVO;
import com.mmc.csf.forum.vo.CommentVO;
import com.mmc.csf.forum.vo.DynamicVO;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
/**
* @Author LW
* @date 2023/5/15 10:29
* 概要:动态信息控制层
*/
@RestController
@RequestMapping("/dynamic")
public class DynamicController {
@Resource
private DynamicService dynamicService;
@ApiOperation(value = "动态发布")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = ResultBody.class)})
@PostMapping("/publish")
public ResultBody publishDynamic(@RequestBody DynamicVO dynamicVO) {
return dynamicService.insertDynamic(dynamicVO);
}
@ApiOperation(value = "点赞或取消点赞")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = ResultBody.class)})
@GetMapping("/likeOrCancel")
public ResultBody likeOrCancel(@ApiParam(value = "模拟用户id") @RequestParam Integer userId, @ApiParam(value = "动态id") @RequestParam Integer dynamicId) {
return dynamicService.likeDynamic(userId, dynamicId);
}
@ApiOperation(value = "评论动态或回复评论")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = ResultBody.class)})
@PostMapping("/comment")
public ResultBody commentDynamic(@RequestBody CommentVO commentVO) {
return dynamicService.commentDynamic(commentVO);
}
@ApiOperation(value = "删除评论")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = ResultBody.class)})
@DeleteMapping("/removeComment")
public ResultBody removeComment(@RequestParam Integer id) {
return dynamicService.deleteComment(id);
}
@ApiOperation(value = "根据动态查看评论")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = CommentAndReplyVO.class)})
@GetMapping("/byDynamic")
public ResultBody getCommentsByDynamic(@RequestParam Integer dynamicId) {
return ResultBody.success(dynamicService.getCommentAndReply(dynamicId));
}
@ApiOperation(value = "动态列表")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = DynamicVO.class)})
@GetMapping("/dynamicList")
public ResultBody dynamicList(@RequestParam Integer pageNo, @RequestParam Integer pageSize, @RequestParam Integer userId) {
return ResultBody.success(dynamicService.dynamicList(pageNo, pageSize,userId));
}
}
package com.mmc.csf.forum.dao;
import com.mmc.csf.forum.entity.ForumCommentDO;
import com.mmc.csf.forum.vo.CommentAndReplyVO;
import com.mmc.csf.forum.vo.CommentVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @Author LW
* @date 2023/5/15 10:29
* 概要:动态评论数据访问层
*/
@Mapper
public interface CommentDAO {
/**
* 插入评论
*
* @param userId 用户id
* @param dynamicId 动态id
* @param content 内容
*/
void insertComment(@Param("userId") int userId, @Param("dynamicId") int dynamicId, @Param("content") String content);
/**
* 删除评论
*
* @param id id
* @return int
*/
int deleteComment(int id);
/**
* 插入回复评论
*
* @param userId 用户id
* @param dynamicId 动态id
* @param content 内容
* @param parentId 父id
*/
void insertReplyComment(@Param("userId") int userId, @Param("dynamicId") int dynamicId, @Param("content") String content, @Param("parentId") Integer parentId);
/**
* 查询评论列表
*
* @param dynamicId 动态id
* @return {@link List}<{@link CommentAndReplyVO}>
*/
List<CommentAndReplyVO> selectCommentList(@Param("dynamicId") Integer dynamicId);
/**
* 查询子评论列表
*
* @param parentIds 父id
* @return {@link List}<{@link CommentVO}>
*/
List<CommentVO> selectSubCommentList(List<Integer> parentIds);
}
package com.mmc.csf.forum.dao;
import com.mmc.csf.forum.entity.ForumDynamicDO;
import com.mmc.csf.forum.entity.ForumImageDO;
import com.mmc.csf.forum.entity.ForumVideoDO;
import com.mmc.csf.forum.vo.DynamicVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @Author LW
* @date 2023/5/15 10:29
* 概要:动态信息数据访问层
*/
@Mapper
public interface DynamicDAO {
/**
* 插入动态
*
* @param forumDynamicDO 论坛动态信息
* @return {@link ForumDynamicDO}
*/
void insertDynamic(ForumDynamicDO forumDynamicDO);
/**
* 插入图片
*
* @param dynamicId 动态id
* @param url url
*/
void insertPicture(@Param("dynamicId") Integer dynamicId, @Param("url") String url);
/**
* 插入视频
*
* @param dynamicId 动态id
* @param videoUrl 视频网址
*/
void insertVideo(@Param("dynamicId") Integer dynamicId, @Param("videoUrl") String videoUrl);
/**
* 更新动态点赞数量
*
* @param dynamicId 动态id
* @param pid pid
*/
void updateDynamicLikeCount(@Param("dynamicId") Integer dynamicId, @Param("pid") Integer pid);
/**
* 得到动态信息
*
* @param dynamicId 动态id
* @return {@link ForumDynamicDO}
*/
ForumDynamicDO getDynamicInfo(Integer dynamicId);
/**
* 动态点赞数减
*
* @param dynamicId 动态id
* @param pid pid
*/
void updateSubDynamicLikeCount(Integer dynamicId, Integer pid);
/**
* 更新动态评论数
*
* @param dynamicId 动态id
* @param pid pid
*/
void updateDynamicCommentCount(Integer dynamicId, Integer pid);
/**
* 动态列表计数
*
* @return int
*/
int countDynamicList();
/**
* 动态列表
*
* @param itemIndex 项指数
* @param pageSize 页面大小
* @return {@link List}<{@link ForumDynamicDO}>
*/
List<ForumDynamicDO> dynamicList(int itemIndex, Integer pageSize);
/**
* 列表动态图片
*
* @param ids id
* @return {@link List}<{@link ForumImageDO}>
*/
List<ForumImageDO> listDynamicPicture(List<Integer> ids);
/**
* 动态视频列表
*
* @param ids id
* @return {@link List}<{@link ForumVideoDO}>
*/
List<ForumVideoDO> listDynamicVideo(List<Integer> ids);
}
package com.mmc.csf.forum.dao;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
* @Author LW
* @date 2023/5/15 10:29
* 概要:点赞信息数据访问层
*/
@Mapper
public interface LikeDAO {
/**
* 插入点赞信息
*
* @param userId 用户id
* @param dynamicId 动态id
*/
void insertLike(@Param("userId") int userId, @Param("dynamicId") int dynamicId);
/**
* 删除点赞信息
*
* @param userId 用户id
* @param dynamicId 动态id
* @return int
*/
int deleteLike(@Param("userId") int userId, @Param("dynamicId") int dynamicId);
/**
* 是否是点赞过的
*
* @param userId 用户id
* @param dynamicId 动态id
* @return boolean
*/
boolean isLiked(@Param("userId") int userId, @Param("dynamicId") int dynamicId);
/**
* 点赞数
*
* @param dynamicId 动态id
* @return int
*/
int getLikesCount(int dynamicId);
}
package com.mmc.csf.forum.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.util.Date;
import java.io.Serializable;
/**
* 评论表(ForumCommentDO)实体类
*
* @author lw
* @since 2023-05-16 09:54:25
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
public class ForumCommentDO implements Serializable {
private static final long serialVersionUID = 768897358613182410L;
/**
* 评论id
*/
private Integer id;
/**
* 用户id,外键,关联user表
*/
private Integer userId;
/**
* 动态id,外键,关联dynamic表
*/
private Integer dynamicId;
/**
* 评论内容
*/
private String content;
/**
* 点赞数量
*/
private Integer likesCount;
/**
* 创建时间
*/
private Date createTime;
/**
* 修改时间
*/
private Date updateTime;
/**
* 是否删除,0表示未删除,1表示已删除
*/
private Integer deleted;
}
package com.mmc.csf.forum.entity;
import com.mmc.csf.forum.vo.DynamicVO;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.math.BigDecimal;
import java.util.Date;
import java.io.Serializable;
/**
* 动态信息表(ForumDynamicDO)实体类
*
* @author lw
* @since 2023-05-16 09:50:39
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
public class ForumDynamicDO implements Serializable {
private static final long serialVersionUID = 570379773690905364L;
/**
* 主键,自增长
*/
private Integer id;
/**
* 版本字段pid
*/
private Integer pid;
/**
* 动态标题
*/
private String title;
/**
* 发布用户ID
*/
private Integer userId;
/**
* 动态描述
*/
private String description;
/**
* 发布动态具体位置
*/
private String location;
/**
* 发布动态纬度
*/
private BigDecimal lat;
/**
* 发布动态经度
*/
private BigDecimal lon;
/**
* 点赞数
*/
private Integer likesCount;
/**
* 评论数
*/
private Integer commentsCount;
/**
* 创建时间
*/
private Date createTime;
/**
* 修改时间
*/
private Date updateTime;
/**
* 是否删除,默认为0表示未删除
*/
private Integer deleted;
public ForumDynamicDO(DynamicVO dynamicVO) {
this.title = dynamicVO.getTitle();
this.description = dynamicVO.getDescription();
this.userId = dynamicVO.getUserId();
this.location = dynamicVO.getLocation();
this.lat = dynamicVO.getLat();
this.lon = dynamicVO.getLon();
}
public DynamicVO buildDynamicVO() {
return DynamicVO.builder().id(id).description(description)
.commentCount(commentsCount).likesCount(likesCount)
.lat(lat).lon(lon).location(location).title(title)
.userId(userId).build();
}
}
package com.mmc.csf.forum.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.util.Date;
import java.io.Serializable;
/**
* 动态图片表(ForumImageDO)实体类
*
* @author lw
* @since 2023-05-16 09:57:50
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
public class ForumImageDO implements Serializable {
private static final long serialVersionUID = 678578415154893126L;
/**
* 主键,自增长
*/
private Integer id;
/**
* 动态ID,必填
*/
private Integer dynamicId;
/**
* 图片URL,必填
*/
private String url;
/**
* 创建时间
*/
private Date createTime;
/**
* 修改时间
*/
private Date updateTime;
/**
* 是否删除,默认为0表示未删除
*/
private Integer deleted;
}
package com.mmc.csf.forum.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.util.Date;
import java.io.Serializable;
/**
* 点赞表(ForumLikeDO)实体类
*
* @author lw
* @since 2023-05-16 09:58:14
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
public class ForumLikeDO implements Serializable {
private static final long serialVersionUID = 980171641026737097L;
/**
* 点赞id
*/
private Integer id;
/**
* 用户id,外键,关联user表
*/
private Integer userId;
/**
* 动态id,外键,关联dynamic表
*/
private Integer dynamicId;
/**
* 创建时间
*/
private Date createTime;
}
package com.mmc.csf.forum.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.util.Date;
import java.io.Serializable;
/**
* 动态视频表(ForumVideoDO)实体类
*
* @author lw
* @since 2023-05-16 09:58:33
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
public class ForumVideoDO implements Serializable {
private static final long serialVersionUID = -50745508548714291L;
/**
* 主键,自增长
*/
private Integer id;
/**
* 动态ID,必填
*/
private Integer dynamicId;
/**
* 视频URL,必填
*/
private String url;
/**
* 创建时间
*/
private Date createTime;
/**
* 修改时间
*/
private Date updateTime;
/**
* 是否删除,默认为0表示未删除
*/
private Integer deleted;
}
package com.mmc.csf.forum.service;
import com.mmc.csf.common.util.page.PageResult;
import com.mmc.csf.common.util.web.ResultBody;
import com.mmc.csf.forum.vo.CommentAndReplyVO;
import com.mmc.csf.forum.vo.CommentVO;
import com.mmc.csf.forum.vo.DynamicVO;
import java.util.List;
/**
* @Author LW
* @date 2023/5/15 10:29
* 概要:动态信息service层
*/
public interface DynamicService {
/**
* 插入动态
*
* @param dynamicVO 动态
* @return {@link ResultBody}
*/
ResultBody insertDynamic(DynamicVO dynamicVO);
/**
* 点赞动态
*
* @param userId 用户id
* @param dynamicId 动态id
* @return {@link ResultBody}
*/
ResultBody likeDynamic(Integer userId, Integer dynamicId);
/**
* 评论动态
*
* @param commentVO 评论信息
* @return {@link ResultBody}
*/
ResultBody commentDynamic(CommentVO commentVO);
/**
* 删除评论
*
* @param id id
* @return {@link ResultBody}
*/
ResultBody deleteComment(Integer id);
/**
* 根据动态查看评论
*
* @param dynamicId 动态id
* @return {@link List}<{@link CommentVO}>
*/
List<CommentAndReplyVO> getCommentAndReply(int dynamicId);
/**
* 动态列表
*
* @param pageNo 页面
* @param pageSize 页面大小
* @param userId
* @return {@link List}<{@link DynamicVO}>
*/
PageResult dynamicList(Integer pageNo, Integer pageSize, Integer userId);
}
package com.mmc.csf.forum.service.impl;
import com.mmc.csf.common.util.page.PageResult;
import com.mmc.csf.common.util.web.ResultBody;
import com.mmc.csf.forum.dao.CommentDAO;
import com.mmc.csf.forum.dao.DynamicDAO;
import com.mmc.csf.forum.dao.LikeDAO;
import com.mmc.csf.forum.entity.ForumDynamicDO;
import com.mmc.csf.forum.entity.ForumImageDO;
import com.mmc.csf.forum.entity.ForumVideoDO;
import com.mmc.csf.forum.service.DynamicService;
import com.mmc.csf.forum.vo.CommentAndReplyVO;
import com.mmc.csf.forum.vo.CommentVO;
import com.mmc.csf.forum.vo.DynamicVO;
import com.mmc.csf.forum.vo.MediaVO;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @Author LW
* @date 2023/5/15 10:29
* 概要:动态信息实现层
*/
@Service
public class DynamicServiceImpl implements DynamicService {
@Resource
private DynamicDAO dynamicDAO;
@Resource
private LikeDAO likeDAO;
@Resource
private CommentDAO commentDAO;
@Override
@Transactional(rollbackFor = Exception.class)
public ResultBody insertDynamic(DynamicVO dynamicVO) {
// 插入动态基本信息
ForumDynamicDO forumDynamicDO = new ForumDynamicDO(dynamicVO);
dynamicDAO.insertDynamic(forumDynamicDO);
// 插入动态图片或视频
MediaVO mediaVO = dynamicVO.getMediaVO();
// 插入图片
if (CollectionUtils.isNotEmpty(mediaVO.getPicture())) {
for (String url : mediaVO.getPicture()) {
dynamicDAO.insertPicture(forumDynamicDO.getId(), url);
}
}
// 插入视频
if (mediaVO.getVideoUrl() != null) {
dynamicDAO.insertVideo(forumDynamicDO.getId(), mediaVO.getVideoUrl());
}
return ResultBody.success("动态发布成功");
}
@Override
public ResultBody likeDynamic(Integer userId, Integer dynamicId) {
// 获取动态信息
ForumDynamicDO forumDynamicDO = dynamicDAO.getDynamicInfo(dynamicId);
if (!likeDAO.isLiked(userId, dynamicId)) {
likeDAO.insertLike(userId, dynamicId);
dynamicDAO.updateDynamicLikeCount(dynamicId, forumDynamicDO.getPid());
} else {
likeDAO.deleteLike(userId, dynamicId);
dynamicDAO.updateSubDynamicLikeCount(dynamicId, forumDynamicDO.getPid());
}
return ResultBody.success();
}
@Override
@Transactional(rollbackFor = Exception.class)
public ResultBody commentDynamic(CommentVO commentVO) {
ForumDynamicDO forumDynamicDO = dynamicDAO.getDynamicInfo(commentVO.getDynamicId());
if (forumDynamicDO == null) {
return ResultBody.error("动态不存在或已删除");
}
if (commentVO.getParentId() == null) {
commentDAO.insertComment(commentVO.getUserId(), commentVO.getDynamicId(), commentVO.getContent());
} else {
commentDAO.insertReplyComment(commentVO.getUserId(), commentVO.getDynamicId(), commentVO.getContent(), commentVO.getParentId());
}
dynamicDAO.updateDynamicCommentCount(commentVO.getDynamicId(), forumDynamicDO.getPid());
return ResultBody.success();
}
@Override
public ResultBody deleteComment(Integer id) {
commentDAO.deleteComment(id);
return ResultBody.success();
}
@Override
public List<CommentAndReplyVO> getCommentAndReply(int dynamicId) {
// 获取评论列表
List<CommentAndReplyVO> commentList = commentDAO.selectCommentList(dynamicId);
List<CommentAndReplyVO> topLevelComment = new ArrayList<>();
Map<Integer, CommentAndReplyVO> commentMap = new HashMap<>();
// 将每个数据模型对象添加到Map中,以便在递归过程中查找它们的父母
for (CommentAndReplyVO comment : commentList) {
comment.setChildren(new ArrayList<>());
commentMap.put(comment.getId(), comment);
}
// 构建树结构
for (CommentAndReplyVO comment : commentList) {
if (comment.getParentId() == 0) {
topLevelComment.add(comment);
} else {
CommentAndReplyVO parent = commentMap.get(comment.getParentId());
parent.getChildren().add(comment);
}
}
return topLevelComment;
}
@Override
public PageResult dynamicList(Integer pageNo, Integer pageSize, Integer userId) {
int count = dynamicDAO.countDynamicList();
if (count == 0) {
return PageResult.buildPage(pageNo, pageSize, 0);
}
int itemIndex = (pageNo - 1) * pageSize;
List<ForumDynamicDO> forumDynamicList = dynamicDAO.dynamicList(itemIndex, pageSize);
// 动态id集合
List<Integer> ids = forumDynamicList.stream().map(ForumDynamicDO::getId).collect(Collectors.toList());
// 根据id集合查询图片
List<ForumImageDO> forumImageList = dynamicDAO.listDynamicPicture(ids);
Map<Integer, List<ForumImageDO>> ImageMap = forumImageList.stream().collect(Collectors.groupingBy(ForumImageDO::getDynamicId));
// 获取视频信息
List<ForumVideoDO> forumVideoList = dynamicDAO.listDynamicVideo(ids);
List<DynamicVO> dynamicVOList = forumDynamicList.stream()
.map(d -> {
MediaVO mediaVO = new MediaVO();
if (CollectionUtils.isNotEmpty(ImageMap.get(d.getId()))) {
mediaVO.setPicture(ImageMap.get(d.getId()).stream().map(ForumImageDO::getUrl).collect(Collectors.toList()));
}
for (ForumVideoDO forumVideoDO : forumVideoList) {
if (forumVideoDO.getDynamicId().equals(d.getId())) {
mediaVO.setVideoUrl(forumVideoDO.getUrl());
break;
}
}
DynamicVO dynamicVO = d.buildDynamicVO();
dynamicVO.setMediaVO(mediaVO);
// 设置是否点赞
boolean liked = likeDAO.isLiked(userId, d.getId());
dynamicVO.setLikes(liked);
return dynamicVO;
}).collect(Collectors.toList());
return PageResult.buildPage(pageNo, pageSize, count, dynamicVOList);
}
}
#Application
server:
port: 50002
servlet:
context-path: /uavgoods
#spring
spring:
application:
name: uavgoods
#Database
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://mysql:3306/uav_mall_goods?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8
username: csftester
password: csf-TEST-m1200
# Druid数据源配置
type: com.alibaba.druid.pool.DruidDataSource
druid:
initial-size: 10 #初始化连接池大小
min-idle: 10 #最小大小
max-active: 50 #最大大小
max-wait: 60000 #获取连接时最大等待时间,单位毫秒
time-between-eviction-runs-millis: 60000 #配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
min-evictable-idle-time-millis: 300000 #配置一个连接在池中最小生存的时间,单位是毫秒
validation-query: SELECT 1 FROM DUAL #用来检测连接是否有效的sql
test-while-idle: true #申请连接的时候检测,建议配置为true,不影响性能,并且保证安全性
testOnBorrow: false #获取连接时执行检测,建议关闭,影响性能
testOnReturn: false #归还连接时执行检测,建议关闭,影响性能
pool-prepared-statements: false #是否开启PSCache,PSCache对支持游标的数据库性能提升巨大,oracle建议开启,mysql下建议关闭
filters: stat,wall #配置扩展插件,常用的插件有=>stat:监控统计 log4j:日志 wall:防御sql注入
filter:
wall:
config:
multi-statement-allow: true
db-type: mysql
enabled: true
connection-properties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000 #打开慢sql记录和延迟时间
web-stat-filter:
url-pattern: /*
exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"
enabled: true
stat-view-servlet:
enabled: true
login-username: druid
login-password: druid
#cloud
cloud:
loadbalancer:
retry:
enabled: true
#Redis
redis:
database: 0
host: redis
password: mmc@redis123
port: 6379
#连接池
lettuce:
shutdown-timeout: 1000 # 关闭超时时间-ms
pool:
#最大连接个数
max-active: 30
#等待时间-ms
max-wait: 1000ms
#最大空闲
max-idle: 8
#初始化最小
min-idle: 1
#rabbitMQ
rabbitmq:
host: rabbitmq
port: 5672
username: admin
password: mmc123456
virtual-host: /
listener:
simple:
#acknowledge-mode: manual #设置确认模式手工确认
concurrency: 3 #消费者最小数量
max-concurrency: 10 # 消费者最大数量
# 一般消费者自动签收模式下可以添加下面配置,用于消费抛出异常后进行消息重新投递设置
retry:
enabled: true #是否开启消费者重试(为false时关闭消费者重试)
max-attempts: 3 # 最大重试重新投递消息次数
initial-interval: 900s #重试重新投递消息间隔时间(单位秒)
default-requeue-rejected: false #重试次数超过上面的设置之后是否丢弃(消费者listener抛出异常,是否重回队列,默认true:重回队列, false为不重回队列(结合死信交换机))
#eureka eureka.client.register-with-eureka=true
eureka:
instance:
prefer-ip-address: true
ip-address: mgoods
instance-id: ${eureka.instance.ip-address}:${server.port}@${random.int}
status-page-url: https://testapi.sharefly.mmcuav.cn/${server.servlet.context-path}/swagger-ui.html
client:
fetch-registry: true
service-url:
defaultZone: http://edmin:sharefly1200@eureka:20080/eureka/
#logging
logging:
level:
com:
mmc:
csf: DEBUG
#mybatis
mybatis:
executor-type: simple
mapper-locations: classpath:mapper/**/*.xml
type-aliases-package: com.mmc.csf
configuration:
map-underscore-to-camel-case: true
#feign
feign:
client:
config:
default:
connect-timeout: 3000
read-timeout: 6000
#Okhttp参数配置
httpclient:
enabled: false
okhttp:
enabled: true
hystrix:
enabled: true
hystrix:
command:
default:
execution:
isolation:
thread:
# hystrix 超时时间
timeoutInMilliseconds: 9000
#ribbon-ribbo和hystrix时间取最小的生效,feign和ribbon的超时时间只能选其一生效feign优先级高于ribbon
ribbon:
okhttp:
enabled: true
mmc:
appid: 80001
url: http://121.37.224.147
companycode: MMC
#logstash服务器地址
logstash:
host: 10.86.210.18
#logstash端口
port: 8084
wechat:
sub:
appid: wx5c6a105a0ddca4c5
secret: 96c75255dd26f82f8d55e15b59e101c7
rabbitmq:
enabled: true
exchange: REPOORDER_WX_API_DIRECT_TEST
#Application
server:
port: 20001
servlet:
context-path: /forum
#spring
spring:
application:
name: forum
#Database
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://rm-wz9dd796t4j1giz6t2o.mysql.rds.aliyuncs.com:3306/iuav_ims?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8
username: tmj
password: MMC@2022&MYSQL
# Druid数据源配置
type: com.alibaba.druid.pool.DruidDataSource
druid:
initial-size: 1 #初始化连接池大小
min-idle: 1 #最小大小
max-active: 1 #最大大小
max-wait: 60000 #获取连接时最大等待时间,单位毫秒
time-between-eviction-runs-millis: 60000 #配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
min-evictable-idle-time-millis: 300000 #配置一个连接在池中最小生存的时间,单位是毫秒
validation-query: SELECT 1 FROM DUAL #用来检测连接是否有效的sql
test-while-idle: true #申请连接的时候检测,建议配置为true,不影响性能,并且保证安全性
testOnBorrow: false #获取连接时执行检测,建议关闭,影响性能
testOnReturn: false #归还连接时执行检测,建议关闭,影响性能
pool-prepared-statements: false #是否开启PSCache,PSCache对支持游标的数据库性能提升巨大,oracle建议开启,mysql下建议关闭
filters: stat,wall #配置扩展插件,常用的插件有=>stat:监控统计 log4j:日志 wall:防御sql注入
filter:
wall:
config:
multi-statement-allow: true
db-type: mysql
enabled: true
connection-properties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000 #打开慢sql记录和延迟时间
web-stat-filter:
url-pattern: /*
exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"
enabled: true
stat-view-servlet:
enabled: true
login-username: druid
login-password: druid
#cloud
cloud:
loadbalancer:
retry:
enabled: true
#Redis
redis:
database: 0
host: 119.23.248.181
password: mmc@redis123
port: 6379
#连接池
lettuce:
shutdown-timeout: 1000 # 关闭超时时间-ms
pool:
#最大连接个数
max-active: 30
#等待时间-ms
max-wait: 1000ms
#最大空闲
max-idle: 8
#初始化最小
min-idle: 1
#rabbitMQ
rabbitmq:
host: 119.23.248.181
port: 5672
username: admin
password: mmc123456
virtual-host: /
listener:
simple:
#acknowledge-mode: manual #设置确认模式手工确认
concurrency: 3 #消费者最小数量
max-concurrency: 10 # 消费者最大数量
# 一般消费者自动签收模式下可以添加下面配置,用于消费抛出异常后进行消息重新投递设置
retry:
enabled: true #是否开启消费者重试(为false时关闭消费者重试)
max-attempts: 3 # 最大重试重新投递消息次数
initial-interval: 900s #重试重新投递消息间隔时间(单位秒)
default-requeue-rejected: false #重试次数超过上面的设置之后是否丢弃(消费者listener抛出异常,是否重回队列,默认true:重回队列, false为不重回队列(结合死信交换机))
#eureka eureka.client.register-with-eureka=true
eureka:
instance:
prefer-ip-address: true
ip-address: 127.0.0.1
instance-id: ${eureka.instance.ip-address}:${server.port}@${random.int}
status-page-url: http://${eureka.instance.ip-address}:${server.port}${server.servlet.context-path}/swagger-ui.html
client:
fetch-registry: true
service-url:
defaultZone: http://edmin:sharefly1200@127.0.0.1:20080/eureka/
#logging
logging:
level:
com:
mmc:
csf: DEBUG
#mybatis
mybatis:
executor-type: simple
mapper-locations: classpath:mapper/**/*.xml
type-aliases-package: com.mmc.csf
configuration:
map-underscore-to-camel-case: true
##feign
#feign:
# client:
# config:
# default:
# connect-timeout: 3000
# read-timeout: 6000
# #Okhttp参数配置
# httpclient:
# enabled: false
# okhttp:
# enabled: true
# hystrix:
# enabled: true
#hystrix:
# command:
# default:
# execution:
# isolation:
# thread:
# # hystrix 超时时间
# timeoutInMilliseconds: 9000
##ribbon-ribbo和hystrix时间取最小的生效,feign和ribbon的超时时间只能选其一生效feign优先级高于ribbon
#ribbon:
# okhttp:
# enabled: true
#mmc:
# appid: 80001
# url: http://121.37.224.147
# companycode: MMC
#
##logstash服务器地址
#logstash:
# host: 10.86.210.18
##logstash端口
# port: 8084
#
#
#wechat:
# sub:
# appid: wx5c6a105a0ddca4c5
# secret: 96c75255dd26f82f8d55e15b59e101c7
#
#rabbitmq:
# enabled: false
# exchange: REPOORDER_WX_API_DIRECT_DEV
#
## 查看健康情况-开发分支配置则可-其余分支请勿配置
#management:
# endpoints:
# web:
# exposure:
# include: "*"
\ No newline at end of file
#Application
server:
port: 50002
servlet:
context-path: /uavgoods
#spring
spring:
application:
name: uavgoods
#Database
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://mysql:3306/uav_mall_goods?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8
username: csfmysql
password: csf-DB-m1200
# Druid数据源配置
type: com.alibaba.druid.pool.DruidDataSource
druid:
initial-size: 10 #初始化连接池大小
min-idle: 10 #最小大小
max-active: 50 #最大大小
max-wait: 60000 #获取连接时最大等待时间,单位毫秒
time-between-eviction-runs-millis: 60000 #配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
min-evictable-idle-time-millis: 300000 #配置一个连接在池中最小生存的时间,单位是毫秒
validation-query: SELECT 1 FROM DUAL #用来检测连接是否有效的sql
test-while-idle: true #申请连接的时候检测,建议配置为true,不影响性能,并且保证安全性
testOnBorrow: false #获取连接时执行检测,建议关闭,影响性能
testOnReturn: false #归还连接时执行检测,建议关闭,影响性能
pool-prepared-statements: false #是否开启PSCache,PSCache对支持游标的数据库性能提升巨大,oracle建议开启,mysql下建议关闭
filters: stat,wall #配置扩展插件,常用的插件有=>stat:监控统计 log4j:日志 wall:防御sql注入
filter:
wall:
config:
multi-statement-allow: true
db-type: mysql
enabled: true
connection-properties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000 #打开慢sql记录和延迟时间
web-stat-filter:
url-pattern: /*
exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"
enabled: true
stat-view-servlet:
enabled: true
login-username: druid
login-password: druid
#cloud
cloud:
loadbalancer:
retry:
enabled: true
#Redis
redis:
database: 0
host: redis
password: mmc@redis123
port: 6379
#连接池
lettuce:
shutdown-timeout: 1000 # 关闭超时时间-ms
pool:
#最大连接个数
max-active: 30
#等待时间-ms
max-wait: 1000ms
#最大空闲
max-idle: 8
#初始化最小
min-idle: 1
#rabbitMQ
rabbitmq:
host: 120.25.213.190
port: 5672
username: admin
password: mmc123456
virtual-host: /
listener:
simple:
#acknowledge-mode: manual #设置确认模式手工确认
concurrency: 3 #消费者最小数量
max-concurrency: 10 # 消费者最大数量
# 一般消费者自动签收模式下可以添加下面配置,用于消费抛出异常后进行消息重新投递设置
retry:
enabled: true #是否开启消费者重试(为false时关闭消费者重试)
max-attempts: 3 # 最大重试重新投递消息次数
initial-interval: 900s #重试重新投递消息间隔时间(单位秒)
default-requeue-rejected: false #重试次数超过上面的设置之后是否丢弃(消费者listener抛出异常,是否重回队列,默认true:重回队列, false为不重回队列(结合死信交换机))
#eureka eureka.client.register-with-eureka=true
eureka:
instance:
prefer-ip-address: true
ip-address: mgoods
instance-id: ${eureka.instance.ip-address}:${server.port}@${random.int}
client:
fetch-registry: true
service-url:
defaultZone: http://edmin:sharefly1200@eureka:20080/eureka/
#logging
logging:
level:
com:
mmc:
csf: DEBUG
#mybatis
mybatis:
executor-type: simple
mapper-locations: classpath:mapper/**/*.xml
type-aliases-package: com.mmc.csf
configuration:
map-underscore-to-camel-case: true
#feign
feign:
client:
config:
default:
connect-timeout: 3000
read-timeout: 6000
#Okhttp参数配置
httpclient:
enabled: false
okhttp:
enabled: true
hystrix:
enabled: true
hystrix:
command:
default:
execution:
isolation:
thread:
# hystrix 超时时间
timeoutInMilliseconds: 9000
#ribbon-ribbo和hystrix时间取最小的生效,feign和ribbon的超时时间只能选其一生效feign优先级高于ribbon
ribbon:
okhttp:
enabled: true
mmc:
appid: 80001
url: http://121.37.224.147
companycode: MMC
wechat:
sub:
appid: wx5c6a105a0ddca4c5
secret: 96c75255dd26f82f8d55e15b59e101c7
rabbitmq:
enabled: true
exchange: REPOORDER_WX_API_DIRECT_PROD
spring:
profiles:
active: dev
---
spring:
profiles: dev
---
spring:
profiles: beta
---
spring:
profiles: product
_____ _ __ _
/ ____| | / _| |
| (___ | |__ __ _ _ __ ___ | |_| |_ _
\___ \| '_ \ / _` | '__/ _ \ | _| | | | |
____) | | | | (_| | | | __/ | | | | |_| |
|_____/|_| |_|\__,_|_| \___| |_| |_|\__, |
__/ |
|___/
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/base.xml" />
<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>139.159.142.254:6003</destination>
<!-- 日志输出编码 -->
<encoder charset="UTF-8"
class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
<providers>
<timestamp>
<timeZone>UTC</timeZone>
</timestamp>
<pattern>
<pattern>
{
"logLevel": "%level",
"serviceName": "${springAppName:-}",
"pid": "${PID:-}",
"thread": "%thread",
"class": "%logger{40}",
"rest": "%message"
}
</pattern>
</pattern>
</providers>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="LOGSTASH" />
<appender-ref ref="CONSOLE" />
</root>
</configuration>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mmc.csf.forum.dao.CommentDAO">
<insert id="insertComment" parameterType="com.mmc.csf.forum.vo.CommentVO">
INSERT INTO forum_comment(user_id, dynamic_id, content)
VALUES (#{userId}, #{dynamicId}, #{content})
</insert>
<insert id="insertReplyComment">
INSERT INTO forum_comment(user_id, dynamic_id, content,parent_id)
VALUES (#{userId}, #{dynamicId}, #{content},#{parentId})
</insert>
<update id="deleteComment" parameterType="int">
update forum_comment
set is_deleted = 1
where id = #{id}
</update>
<delete id="deleteCommentsByDynamic" parameterType="int">
DELETE FROM forum_comment WHERE dynamic_id = #{dynamicId}
</delete>
<select id="selectCommentList" resultType="com.mmc.csf.forum.vo.CommentAndReplyVO">
select id,
parent_id,
user_id,
dynamic_id,
content,
likes_count
from forum_comment
where dynamic_id = #{dynamicId} and is_deleted = 0
</select>
<select id="selectSubCommentList" resultType="com.mmc.csf.forum.vo.CommentVO">
select id,
parent_id,
user_id,
dynamic_id,
content,
likes_count
from forum_comment
where parent_id in
<foreach collection="list" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</select>
</mapper>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mmc.csf.forum.dao.DynamicDAO">
<insert id="insertPicture">
insert into forum_image(dynamic_id, url)
values (#{dynamicId}, #{url})
</insert>
<insert id="insertVideo">
insert into forum_video(dynamic_id, url)
values (#{dynamicId}, #{videoUrl})
</insert>
<insert id="insertDynamic" keyProperty="id" useGeneratedKeys="true" parameterType="com.mmc.csf.forum.entity.ForumDynamicDO">
INSERT INTO forum_dynamic(title, user_id, description, location, lat, lon)
VALUES (#{title}, #{userId}, #{description}, #{location}, #{lat}, #{lon})
</insert>
<update id="updateDynamicLikeCount">
update forum_dynamic
set likes_count = likes_count + 1,
pid = pid + 1
where id = #{dynamicId}
and pid = #{pid};
</update>
<update id="updateSubDynamicLikeCount">
update forum_dynamic
set likes_count = likes_count - 1,
pid = pid + 1
where id = #{dynamicId}
and pid = #{pid};
</update>
<update id="updateDynamicCommentCount">
update forum_dynamic
set comments_count = comments_count + 1,
pid = pid + 1
where id = #{dynamicId}
and pid = #{pid};
</update>
<select id="getDynamicInfo" resultType="com.mmc.csf.forum.entity.ForumDynamicDO">
select id,
pid,
title,
user_id,
description,
location,
lat,
lon,
likes_count,
comments_count
from forum_dynamic
where id = #{dynamicId}
</select>
<select id="countDynamicList" resultType="java.lang.Integer">
select count(*)
from forum_dynamic where is_deleted = 0
</select>
<select id="dynamicList" resultType="com.mmc.csf.forum.entity.ForumDynamicDO">
select id,
pid,
title,
user_id,
description,
location,
lat,
lon,
likes_count,
comments_count,
create_time
from forum_dynamic
where is_deleted = 0
order by create_time desc
LIMIT #{itemIndex}, #{pageSize}
</select>
<select id="listDynamicPicture" resultType="com.mmc.csf.forum.entity.ForumImageDO">
select id, url , dynamic_id
from forum_image
where
is_deleted = 0 and dynamic_id in
<foreach collection="list" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</select>
<select id="listDynamicVideo" resultType="com.mmc.csf.forum.entity.ForumVideoDO">
select id, url , dynamic_id
from forum_video
where
is_deleted = 0 and dynamic_id in
<foreach collection="list" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</select>
</mapper>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mmc.csf.forum.dao.LikeDAO">
<insert id="insertLike">
INSERT INTO forum_like(user_id, dynamic_id)
VALUES (#{userId}, #{dynamicId})
</insert>
<delete id="deleteLike">
DELETE
FROM forum_like
WHERE user_id = #{userId}
AND dynamic_id = #{dynamicId}
</delete>
<select id="isLiked" resultType="java.lang.Boolean">
SELECT COUNT(*) > 0
FROM forum_like
WHERE user_id = #{userId}
AND dynamic_id = #{dynamicId}
</select>
<select id="getLikesCount" resultType="java.lang.Integer">
SELECT COUNT(*)
FROM forum_like
WHERE dynamic_id = #{dynamicId}
</select>
</mapper>
\ No newline at end of file
...@@ -199,5 +199,6 @@ ...@@ -199,5 +199,6 @@
<modules> <modules>
<module>flyer-service</module> <module>flyer-service</module>
<module>csf-common</module> <module>csf-common</module>
<module>forum-service</module>
</modules> </modules>
</project> </project>
\ No newline at end of file
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论