Commit 435834d9 by 段启岩

Merge remote-tracking branch 'origin/qiyanduan0201'

# Conflicts:
#	src/main/java/cn/meteor/beyondclouds/common/vo/PageVO.java
parents ba468eb5 94ef9230
package cn.meteor.beyondclouds.common.handler;
import cn.meteor.beyondclouds.config.properties.BeyondCloudsProperties;
import cn.meteor.beyondclouds.core.api.Response;
import cn.meteor.beyondclouds.common.enums.ErrorCode;
import cn.meteor.beyondclouds.core.exception.ServiceException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.HttpRequestMethodNotSupportedException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
......@@ -15,16 +17,30 @@ import javax.servlet.http.HttpServletRequest;
*/
@RestControllerAdvice
public class GlobalExceptionHandler {
private BeyondCloudsProperties beyondCloudsProperties;
@Autowired
public GlobalExceptionHandler(BeyondCloudsProperties beyondCloudsProperties) {
this.beyondCloudsProperties = beyondCloudsProperties;
}
@ExceptionHandler(value = Exception.class)
public Response<String> exceptionHandler(HttpServletRequest request, Exception e) {
boolean debugMode = beyondCloudsProperties.getDebug();
if (debugMode) {
e.printStackTrace();
}
if (e instanceof ServiceException) {
ServiceException exception = (ServiceException) e;
return Response.error(exception.getErrorCode(), exception.getErrorMsg());
} else if (e instanceof HttpRequestMethodNotSupportedException){
return Response.error(ErrorCode.OPERATION_FAILED.code(), e.getMessage());
} else {
if (debugMode) {
return Response.error(ErrorCode.OPERATION_FAILED.code(), e.getMessage());
} else {
return Response.error();
}
}
}
}
......@@ -27,6 +27,11 @@ public class BeyondCloudsProperties {
}
/**
* debug模式开关
*/
private Boolean debug;
/**
* 认证配置
*/
private AuthProperties auth;
......
package cn.meteor.beyondclouds.modules.blog.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.io.Serializable;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* <p>
* 博客扩展表
......@@ -25,6 +25,7 @@ public class BlogExt implements Serializable {
private static final long serialVersionUID=1L;
@TableId
private String blogId;
@ApiModelProperty(value = "博客详情")
......
package cn.meteor.beyondclouds.modules.blog.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.io.Serializable;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* <p>
* 博客标签表,用来记录博客里面引用了哪些标签
......@@ -26,10 +26,11 @@ public class BlogTag implements Serializable {
private static final long serialVersionUID=1L;
@ApiModelProperty(value = "博客主键")
@TableId(value = "blog_id", type = IdType.ASSIGN_UUID)
@TableId
private String blogId;
@ApiModelProperty(value = "标签主键")
@TableId
private String tagId;
......
package cn.meteor.beyondclouds.modules.news.entity;
package cn.meteor.beyondclouds.modules.content.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.TableId;
import java.io.Serializable;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* <p>
* 新闻资讯
* CMS-栏目
* </p>
*
* @author 段启岩
* @since 2020-01-30
* @since 2020-02-01
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value="News对象", description="新闻资讯表")
public class News implements Serializable {
@ApiModel(value="Channel对象", description="CMS-栏目表")
public class Channel implements Serializable {
private static final long serialVersionUID=1L;
@TableId(value = "news_id", type = IdType.ASSIGN_UUID)
private String newsId;
@TableId(value = "channel_id", type = IdType.AUTO)
private Integer channelId;
@ApiModelProperty(value = "资讯标题")
private String newsTitle;
@ApiModelProperty(value = "父级栏目ID")
private Integer parentId;
@ApiModelProperty(value = "资讯封面图")
private String cover;
@ApiModelProperty(value = "栏目名称")
private String channelName;
@ApiModelProperty(value = "资讯内容")
private String content;
@ApiModelProperty(value = "栏目路径")
private String thread;
private LocalDateTime createTime;
......
package cn.meteor.beyondclouds.modules.content.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* <p>
* CMS-内容表
* </p>
*
* @author 段启岩
* @since 2020-02-01
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value="Content对象", description="CMS-内容表")
public class Content implements Serializable {
private static final long serialVersionUID=1L;
@TableId(value = "content_id", type = IdType.AUTO)
private Integer contentId;
@ApiModelProperty(value = "栏目ID")
private Integer channelId;
@ApiModelProperty(value = "作者")
private String author;
@ApiModelProperty(value = "内容类型-0:幻灯,1:普通文章,3:广告")
private Integer contentType;
@ApiModelProperty(value = "内容标题")
private String title;
@ApiModelProperty(value = "子标题")
private String subTitle;
@ApiModelProperty(value = "访问链接")
private String link;
@ApiModelProperty(value = "封面图")
private String cover;
@ApiModelProperty(value = "图片1")
private String pic1;
@ApiModelProperty(value = "图片2")
private String pic2;
@ApiModelProperty(value = "内容")
private String content;
private LocalDateTime createTime;
private LocalDateTime updateTime;
}
package cn.meteor.beyondclouds.modules.content.entity;
import com.baomidou.mybatisplus.annotation.TableId;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* <p>
* CMS-内容扩展表
* </p>
*
* @author 段启岩
* @since 2020-02-01
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value="ContentExt对象", description="CMS-内容扩展表")
public class ContentExt implements Serializable {
private static final long serialVersionUID=1L;
@TableId
private Integer contentId;
@ApiModelProperty(value = "内容")
private String content;
}
package cn.meteor.beyondclouds.modules.news.mapper;
package cn.meteor.beyondclouds.modules.content.mapper;
import cn.meteor.beyondclouds.modules.news.entity.News;
import cn.meteor.beyondclouds.modules.content.entity.Channel;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* 新闻资讯表 Mapper 接口
* CMS-栏目表 Mapper 接口
* </p>
*
* @author 段启岩
* @since 2020-01-30
* @since 2020-02-01
*/
public interface NewsMapper extends BaseMapper<News> {
public interface ChannelMapper extends BaseMapper<Channel> {
}
package cn.meteor.beyondclouds.modules.content.mapper;
import cn.meteor.beyondclouds.modules.content.entity.ContentExt;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* CMS-内容扩展表 Mapper 接口
* </p>
*
* @author 段启岩
* @since 2020-02-01
*/
public interface ContentExtMapper extends BaseMapper<ContentExt> {
}
package cn.meteor.beyondclouds.modules.content.mapper;
import cn.meteor.beyondclouds.modules.content.entity.Content;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* CMS-内容表 Mapper 接口
* </p>
*
* @author 段启岩
* @since 2020-02-01
*/
public interface ContentMapper extends BaseMapper<Content> {
}
<?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="cn.meteor.beyondclouds.modules.news.mapper.NewsMapper">
<mapper namespace="cn.meteor.beyondclouds.modules.content.mapper.ChannelMapper">
</mapper>
<?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="cn.meteor.beyondclouds.modules.content.mapper.ContentExtMapper">
</mapper>
<?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="cn.meteor.beyondclouds.modules.content.mapper.ContentMapper">
</mapper>
package cn.meteor.beyondclouds.modules.news.service;
package cn.meteor.beyondclouds.modules.content.service;
import cn.meteor.beyondclouds.modules.news.entity.News;
import cn.meteor.beyondclouds.modules.content.entity.Channel;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
* 新闻资讯表 服务类
* CMS-栏目表 服务类
* </p>
*
* @author 段启岩
* @since 2020-01-30
* @since 2020-02-01
*/
public interface INewsService extends IService<News> {
public interface IChannelService extends IService<Channel> {
}
package cn.meteor.beyondclouds.modules.content.service;
import cn.meteor.beyondclouds.modules.content.entity.ContentExt;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
* CMS-内容扩展表 服务类
* </p>
*
* @author 段启岩
* @since 2020-02-01
*/
public interface IContentExtService extends IService<ContentExt> {
}
package cn.meteor.beyondclouds.modules.content.service;
import cn.meteor.beyondclouds.modules.content.entity.Content;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
* CMS-内容表 服务类
* </p>
*
* @author 段启岩
* @since 2020-02-01
*/
public interface IContentService extends IService<Content> {
}
package cn.meteor.beyondclouds.modules.news.service.impl;
package cn.meteor.beyondclouds.modules.content.service.impl;
import cn.meteor.beyondclouds.modules.news.entity.News;
import cn.meteor.beyondclouds.modules.news.mapper.NewsMapper;
import cn.meteor.beyondclouds.modules.news.service.INewsService;
import cn.meteor.beyondclouds.modules.content.entity.Channel;
import cn.meteor.beyondclouds.modules.content.mapper.ChannelMapper;
import cn.meteor.beyondclouds.modules.content.service.IChannelService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* <p>
* 新闻资讯表 服务实现类
* CMS-栏目表 服务实现类
* </p>
*
* @author 段启岩
* @since 2020-01-30
* @since 2020-02-01
*/
@Service
public class NewsServiceImpl extends ServiceImpl<NewsMapper, News> implements INewsService {
public class ChannelServiceImpl extends ServiceImpl<ChannelMapper, Channel> implements IChannelService {
}
package cn.meteor.beyondclouds.modules.content.service.impl;
import cn.meteor.beyondclouds.modules.content.entity.ContentExt;
import cn.meteor.beyondclouds.modules.content.mapper.ContentExtMapper;
import cn.meteor.beyondclouds.modules.content.service.IContentExtService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* <p>
* CMS-内容扩展表 服务实现类
* </p>
*
* @author 段启岩
* @since 2020-02-01
*/
@Service
public class ContentExtServiceImpl extends ServiceImpl<ContentExtMapper, ContentExt> implements IContentExtService {
}
package cn.meteor.beyondclouds.modules.content.service.impl;
import cn.meteor.beyondclouds.modules.content.entity.Content;
import cn.meteor.beyondclouds.modules.content.mapper.ContentMapper;
import cn.meteor.beyondclouds.modules.content.service.IContentService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* <p>
* CMS-内容表 服务实现类
* </p>
*
* @author 段启岩
* @since 2020-02-01
*/
@Service
public class ContentServiceImpl extends ServiceImpl<ContentMapper, Content> implements IContentService {
}
package cn.meteor.beyondclouds.modules.project.api;
import cn.meteor.beyondclouds.common.form.PageForm;
import cn.meteor.beyondclouds.common.vo.PageVO;
import cn.meteor.beyondclouds.core.annotation.Anonymous;
import cn.meteor.beyondclouds.core.annotation.CurrentSubject;
import cn.meteor.beyondclouds.core.api.Response;
import cn.meteor.beyondclouds.core.bean.Subject;
import cn.meteor.beyondclouds.modules.project.bean.ProjectDetail;
import cn.meteor.beyondclouds.modules.project.entity.Project;
import cn.meteor.beyondclouds.modules.project.exception.ProjectServiceException;
import cn.meteor.beyondclouds.modules.project.form.ProjectForm;
import cn.meteor.beyondclouds.modules.project.service.IProjectService;
import com.baomidou.mybatisplus.core.metadata.IPage;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
/**
* 项目接口
* @author 段启岩
*/
@Api(tags = "项目API")
@RestController
public class ProjectApi {
private IProjectService projectService;
@Autowired
public ProjectApi(IProjectService projectService) {
this.projectService = projectService;
}
/**
* 发布项目
* @param projectForm
* @param bindingResult
* @param subject
* @return
*/
@ApiOperation("发布项目")
@PostMapping("/project")
public Response publishProject(@RequestBody @Valid ProjectForm projectForm, BindingResult bindingResult, @CurrentSubject Subject subject) {
if (bindingResult.hasErrors()) {
return Response.fieldError(bindingResult.getFieldError());
}
// 将项目表单转换为项目对象
Project project = new Project();
BeanUtils.copyProperties(projectForm, project);
// 设置用户ID(项目发布者ID)
project.setUserId((String) subject.getId());
// 发布项目
try {
projectService.publishProject(project, projectForm.getProjectDetail());
return Response.success();
} catch (ProjectServiceException e) {
e.printStackTrace();
return Response.error(e);
}
}
/**
* 发布项目
* @param projectForm
* @param bindingResult
* @param subject
* @return
*/
@ApiOperation("修改项目")
@PutMapping("/project/{projectId}")
public Response updateProject(@RequestBody @Valid ProjectForm projectForm, BindingResult bindingResult,
@PathVariable("projectId") Integer projectId, @CurrentSubject Subject subject) {
// 将项目表单转换为项目对象
Project project = new Project();
BeanUtils.copyProperties(projectForm, project);
project.setProjectId(projectId);
// 设置用户ID
project.setUserId((String) subject.getId());
// 更新项目
try {
projectService.updateProject(project, projectForm.getProjectDetail());
return Response.success();
} catch (ProjectServiceException e) {
e.printStackTrace();
return Response.error(e);
}
}
/**
* 删除项目
* @param projectId
* @param subject
* @return
*/
@ApiOperation("删除项目")
@DeleteMapping("/project/{projectId}")
public Response deleteProject(@PathVariable("projectId") String projectId, @CurrentSubject Subject subject) {
// 删除
try {
projectService.deleteProject(projectId, (String) subject.getId());
return Response.success();
} catch (ProjectServiceException e) {
e.printStackTrace();
return Response.error(e);
}
}
/**
* 项目详情
* @param projectId
* @return
*/
@Anonymous
@ApiOperation("项目详情")
@GetMapping("/project/{projectId}")
public Response<ProjectDetail> getProject(@PathVariable("projectId") String projectId) {
try {
// 获取项目详情并返回
ProjectDetail projectDetail = projectService.getProject(projectId);
return Response.success(projectDetail);
} catch (ProjectServiceException e) {
e.printStackTrace();
return Response.error(e);
}
}
/**
* 项目列表
* @param pageForm
* @return
*/
@Anonymous
@ApiOperation("项目列表")
@GetMapping("/projects")
public Response<PageVO<Project>> getProjects(@Valid PageForm pageForm) {
// 获取列表并返回
IPage<Project> projectPage = projectService.getProjectPage(pageForm.getPage(), pageForm.getSize());
PageVO<Project> projectPageVO = new PageVO<>();
projectPageVO.setTotalPage(projectPage.getPages());
projectPageVO.setDataList(projectPage.getRecords());
return Response.success(projectPageVO);
}
/**
* 项目列表
* @param pageForm
* @return
*/
@ApiOperation("我的项目列表")
@GetMapping("/my/projects")
public Response<PageVO<Project>> getMyProjects(@Valid PageForm pageForm, @CurrentSubject Subject subject) {
// 根据用户获取列表并返回
IPage<Project> projectPage = projectService.getProjectPage(pageForm.getPage(), pageForm.getSize(), (String) subject.getId());
PageVO<Project> projectPageVO = new PageVO<>();
projectPageVO.setTotalPage(projectPage.getPages());
projectPageVO.setDataList(projectPage.getRecords());
return Response.success(projectPageVO);
}
/**
* 项目列表
* @param pageForm
* @return
*/
@Anonymous
@ApiOperation("他人项目列表")
@GetMapping("/user/{userId}/projects")
public Response<PageVO<Project>> getOthersProjects(@Valid PageForm pageForm,
@PathVariable("userId") String userId) {
// 根据用户获取列表并返回
IPage<Project> projectPage = projectService.getProjectPage(pageForm.getPage(), pageForm.getSize(), userId);
PageVO<Project> projectPageVO = new PageVO<>();
projectPageVO.setTotalPage(projectPage.getPages());
projectPageVO.setDataList(projectPage.getRecords());
return Response.success(projectPageVO);
}
}
package cn.meteor.beyondclouds.modules.project.api;
import cn.meteor.beyondclouds.common.form.PageForm;
import cn.meteor.beyondclouds.common.vo.PageVO;
import cn.meteor.beyondclouds.core.annotation.Anonymous;
import cn.meteor.beyondclouds.core.annotation.CurrentSubject;
import cn.meteor.beyondclouds.core.api.Response;
import cn.meteor.beyondclouds.core.bean.Subject;
import cn.meteor.beyondclouds.modules.project.entity.ProjectComment;
import cn.meteor.beyondclouds.modules.project.exception.ProjectCommentServiceException;
import cn.meteor.beyondclouds.modules.project.form.ProjectCommentForm;
import cn.meteor.beyondclouds.modules.project.service.IProjectCommentService;
import com.baomidou.mybatisplus.core.metadata.IPage;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
/**
* 项目评论接口
* @author 段启岩
*/
@Api(tags = "项目评论API")
@RestController
public class ProjectCommentApi {
private IProjectCommentService projectCommentService;
@Autowired
public ProjectCommentApi(IProjectCommentService projectCommentService) {
this.projectCommentService = projectCommentService;
}
/**
* 发表评论
* @param projectId
* @param projectCommentForm
* @param bindingResult
* @param subject
* @return
*/
@ApiOperation("发表评论")
@PostMapping("/project/{projectId}/comment")
public Response publishProjectComment(@PathVariable("projectId") Integer projectId,
@RequestBody @Valid ProjectCommentForm projectCommentForm,
BindingResult bindingResult, @CurrentSubject Subject subject) {
if (bindingResult.hasErrors()) {
return Response.fieldError(bindingResult.getFieldError());
}
try {
// 发表评论
projectCommentService.publishComment(projectId, projectCommentForm.getParentId(),
projectCommentForm.getComment(), (String) subject.getId());
return Response.success();
} catch (ProjectCommentServiceException e) {
e.printStackTrace();
return Response.error(e);
}
}
@ApiOperation("删除评论")
@DeleteMapping("/project/comment/{commentId}")
public Response deleterojectComment(@PathVariable("commentId") Integer commentId, @CurrentSubject Subject subject) {
try {
// 删除评论
projectCommentService.deleteComment(commentId, (String) subject.getId());
return Response.success();
} catch (ProjectCommentServiceException e) {
e.printStackTrace();
return Response.error(e);
}
}
@Anonymous
@ApiOperation("评论列表")
@GetMapping("/project/{projectId}/comments")
public Response<PageVO<ProjectComment>> getProjectComments(@PathVariable("projectId") Integer projectId,
@Valid PageForm pageForm,
@RequestParam(value = "parentId" ,required = false) Integer parentId) {
try {
// 根据用户获取列表并返回
IPage<ProjectComment>commentPage = projectCommentService.getCommentPage(pageForm.getPage(), pageForm.getSize(), projectId, parentId);
PageVO<ProjectComment> projectPageVO = new PageVO<>();
projectPageVO.setTotalPage(commentPage.getPages());
projectPageVO.setDataList(commentPage.getRecords());
return Response.success(projectPageVO);
} catch (ProjectCommentServiceException e) {
e.printStackTrace();
return Response.error(e);
}
}
}
package cn.meteor.beyondclouds.modules.project.bean;
import cn.meteor.beyondclouds.modules.project.entity.Project;
import lombok.Data;
/**
* 项目详情
* @author meteor
*/
@Data
public class ProjectDetail extends Project {
/**
* 项目详情
*/
private String projectDetail;
}
......@@ -2,14 +2,15 @@ package cn.meteor.beyondclouds.modules.project.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.time.LocalDateTime;
import java.io.Serializable;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
/**
* <p>
* 项目表
......@@ -68,9 +69,9 @@ public class Project implements Serializable {
@ApiModelProperty(value = "封面图")
private String cover;
private LocalDateTime createTime;
private Date createTime;
private LocalDateTime updateTime;
private Date updateTime;
}
......@@ -2,14 +2,15 @@ package cn.meteor.beyondclouds.modules.project.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.time.LocalDateTime;
import java.io.Serializable;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
/**
* <p>
* 项目评论表
......@@ -46,9 +47,9 @@ public class ProjectComment implements Serializable {
@ApiModelProperty(value = "评论路径 ")
private String thread;
private LocalDateTime createTime;
private Date createTime;
private LocalDateTime updateTime;
private Date updateTime;
}
package cn.meteor.beyondclouds.modules.project.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.io.Serializable;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* <p>
* 项目扩展表
......@@ -25,6 +25,7 @@ public class ProjectExt implements Serializable {
private static final long serialVersionUID=1L;
@TableId
private Integer projectId;
@ApiModelProperty(value = "项目详情")
......
package cn.meteor.beyondclouds.modules.project.enums;
import cn.meteor.beyondclouds.core.IErrorCode;
/**
* @author 段启岩
*/
public enum ProjectCommentErrorCode implements IErrorCode {
PARENT_COMMENT_NOT_FOUND(100001,"父评论不存在"),
COMMENT_NOT_FOUND(100002, "评论不存在"),
NO_DELETE_PRIVILEGES(100003, "无权删除该评论");
private long code;
private String msg;
ProjectCommentErrorCode(long code, String msg) {
this.code = code;
this.msg = msg;
}
@Override
public long code() {
return code;
}
@Override
public String msg() {
return msg;
}
}
package cn.meteor.beyondclouds.modules.project.enums;
import cn.meteor.beyondclouds.core.IErrorCode;
/**
* @author 段启岩
*/
public enum ProjectErrorCode implements IErrorCode {
INCORRECT_CATEGORY(9001,"项目分类错误"),
PROJECT_NOT_FOUND(9002, "找不到该项目");
private long code;
private String msg;
ProjectErrorCode(long code, String msg) {
this.code = code;
this.msg = msg;
}
@Override
public long code() {
return code;
}
@Override
public String msg() {
return msg;
}
}
package cn.meteor.beyondclouds.modules.project.exception;
import cn.meteor.beyondclouds.core.IErrorCode;
import cn.meteor.beyondclouds.core.exception.ServiceException;
/**
* 项目业务异常类
*/
public class ProjectCommentServiceException extends ServiceException {
public ProjectCommentServiceException(long errorCode, String errorMsg) {
super(errorCode, errorMsg);
}
public ProjectCommentServiceException(IErrorCode errorCode) {
super(errorCode);
}
}
package cn.meteor.beyondclouds.modules.project.exception;
import cn.meteor.beyondclouds.core.IErrorCode;
import cn.meteor.beyondclouds.core.exception.ServiceException;
/**
* 项目业务异常类
*/
public class ProjectServiceException extends ServiceException {
public ProjectServiceException(long errorCode, String errorMsg) {
super(errorCode, errorMsg);
}
public ProjectServiceException(IErrorCode errorCode) {
super(errorCode);
}
}
package cn.meteor.beyondclouds.modules.project.form;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
/**
* 项目评论表单
* @author 段启岩
*/
@Data
public class ProjectCommentForm {
private Integer parentId;
@NotEmpty(message = "评论内容不能为空")
private String comment;
}
package cn.meteor.beyondclouds.modules.project.form;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
/**
* @author 段启岩
*/
@ApiModel(value="ProjectForm", description="项目表单")
@Data
public class ProjectForm {
private static final long serialVersionUID=1L;
@NotEmpty(message = "项目名称不能为空")
@ApiModelProperty(value = "项目名称")
private String projectName;
@NotNull(message = "项目类别不能为空")
@ApiModelProperty(value = "项目类别ID")
private Integer categoryId;
@NotEmpty(message = "项目源码链接不能为空")
@ApiModelProperty(value = "项目源码链接")
private String sourceLink;
@ApiModelProperty(value = "项目主页链接")
private String homeLink;
@ApiModelProperty(value = "项目文档链接")
private String docLink;
@ApiModelProperty(value = "项目类型")
private String projectType;
@ApiModelProperty(value = "协议")
private String license;
@ApiModelProperty(value = "项目开发语言")
private String devLang;
@ApiModelProperty(value = "项目运行平台")
private String runtimePlatform;
@ApiModelProperty(value = "项目作者")
private String author;
@NotEmpty(message = "项目描述不能为空")
@ApiModelProperty(value = "项目描述")
private String projectDescription;
@NotEmpty(message = "项目封面图不能为空")
@ApiModelProperty(value = "封面图")
private String cover;
@ApiModelProperty(value = "项目详情")
private String projectDetail;
}
package cn.meteor.beyondclouds.modules.project.service;
import cn.meteor.beyondclouds.modules.project.entity.ProjectComment;
import cn.meteor.beyondclouds.modules.project.exception.ProjectCommentServiceException;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
/**
......@@ -13,4 +15,29 @@ import com.baomidou.mybatisplus.extension.service.IService;
*/
public interface IProjectCommentService extends IService<ProjectComment> {
/**
* 发表评论
* @param projectId
* @param parentId
* @param comment
* @param userId
*/
void publishComment(Integer projectId, Integer parentId, String comment, String userId) throws ProjectCommentServiceException;
/**
* 删除评论
* @param commentId
* @param id
*/
void deleteComment(Integer commentId, String id) throws ProjectCommentServiceException;
/**
* 获取评论分页
* @param page
* @param size
* @param projectId
* @param parentId
* @return
*/
IPage<ProjectComment> getCommentPage(Integer page, Integer size, Integer projectId, Integer parentId) throws ProjectCommentServiceException;
}
package cn.meteor.beyondclouds.modules.project.service;
import cn.meteor.beyondclouds.modules.project.bean.ProjectDetail;
import cn.meteor.beyondclouds.modules.project.entity.Project;
import cn.meteor.beyondclouds.modules.project.exception.ProjectServiceException;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
/**
......@@ -13,4 +16,48 @@ import com.baomidou.mybatisplus.extension.service.IService;
*/
public interface IProjectService extends IService<Project> {
/**
* 发布项目
* @param project
* @param detail
*/
void publishProject(Project project, String detail) throws ProjectServiceException;
/**
* 删除项目
* @param projectId
* @param userId
*/
void deleteProject(String projectId, String userId) throws ProjectServiceException;
/**
* 获取项目
* @param projectId
* @return
*/
ProjectDetail getProject(String projectId) throws ProjectServiceException;
/**
* 获取项目列表
* @return
* @param pageNumber
* @param pageSize
*/
IPage<Project> getProjectPage(Integer pageNumber, Integer pageSize);
/**
* 更新项目
* @param project
* @param projectDetail
*/
void updateProject(Project project, String projectDetail) throws ProjectServiceException;
/**
* 根据用户ID获取项目列表
* @param pageNumber
* @param pageSize
* @param userId
* @return
*/
IPage<Project> getProjectPage(Integer pageNumber, Integer pageSize, String userId);
}
package cn.meteor.beyondclouds.modules.project.service.impl;
import cn.meteor.beyondclouds.modules.project.entity.Project;
import cn.meteor.beyondclouds.modules.project.entity.ProjectComment;
import cn.meteor.beyondclouds.modules.project.enums.ProjectCommentErrorCode;
import cn.meteor.beyondclouds.modules.project.enums.ProjectErrorCode;
import cn.meteor.beyondclouds.modules.project.exception.ProjectCommentServiceException;
import cn.meteor.beyondclouds.modules.project.mapper.ProjectCommentMapper;
import cn.meteor.beyondclouds.modules.project.service.IProjectCommentService;
import cn.meteor.beyondclouds.modules.project.service.IProjectService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
/**
* <p>
......@@ -17,4 +27,116 @@ import org.springframework.stereotype.Service;
@Service
public class ProjectCommentServiceImpl extends ServiceImpl<ProjectCommentMapper, ProjectComment> implements IProjectCommentService {
private IProjectService projectService;
@Autowired
public void setProjectService(IProjectService projectService) {
this.projectService = projectService;
}
@Override
public void publishComment(Integer projectId, Integer parentId, String comment, String userId) throws ProjectCommentServiceException {
Assert.notNull(projectId, "projectId must not be null");
Assert.hasText(comment, "comment must not be empty");
// 1. 查询项目是否存在
Project project = projectService.getById(projectId);
if (null == project) {
throw new ProjectCommentServiceException(ProjectErrorCode.PROJECT_NOT_FOUND);
}
// 2.如果有parentId,查询父级评论在该项目中是否存在
ProjectComment parentComment = null;
if (null != parentId) {
QueryWrapper<ProjectComment> projectCommentQueryWrapper = new QueryWrapper<>();
projectCommentQueryWrapper
.eq("project_id", projectId)
.eq("comment_id", parentId);
parentComment = getOne(projectCommentQueryWrapper);
if (null == parentComment) {
throw new ProjectCommentServiceException(ProjectCommentErrorCode.PARENT_COMMENT_NOT_FOUND);
}
}
// 3.保存评论
ProjectComment projectComment = new ProjectComment();
projectComment.setProjectId(projectId);
projectComment.setUserId(userId);
projectComment.setParentId(parentId);
projectComment.setComment(comment);
save(projectComment);
// 4.更新评论的深度和路径信息
if (null == parentComment) {
// 一级评论
projectComment.setDepth(0);
projectComment.setThread("/" + projectComment.getCommentId());
} else {
// 子级评论
projectComment.setDepth(parentComment.getDepth() + 1);
projectComment.setThread(parentComment.getThread() + "/" + projectComment.getCommentId());
}
updateById(projectComment);
}
@Override
public void deleteComment(Integer commentId, String userId) throws ProjectCommentServiceException {
Assert.notNull(commentId, "commentId must not be null");
Assert.notNull(userId, "userId must not be null");
//1.查找评论是否存在
ProjectComment projectComment = getById(commentId);
if (null == projectComment) {
throw new ProjectCommentServiceException(ProjectCommentErrorCode.COMMENT_NOT_FOUND);
}
/**
* 2.查看是否有权限删除评论
* 自己发布的项目或者自己发布的评论才可以删除
*/
if (!projectComment.getUserId().equals(userId)) {
// 不是自己发布的评论, 再看看是不是自己项目下的评论
Project project = projectService.getById(projectComment.getProjectId());
if (!project.getUserId().equals(userId)) {
// 既不是自己发布的评论, 又不是自己项目下的评论,没有权限删除评论
throw new ProjectCommentServiceException(ProjectCommentErrorCode.NO_DELETE_PRIVILEGES);
}
}
// 3.删除评论及子评论
QueryWrapper<ProjectComment> projectCommentQueryWrapper = new QueryWrapper<>();
projectCommentQueryWrapper.like("thread", projectComment.getThread());
remove(projectCommentQueryWrapper);
}
@Override
public IPage<ProjectComment> getCommentPage(Integer pageNumber, Integer pageSize, Integer projectId, Integer parentId) throws ProjectCommentServiceException {
Assert.notNull(projectId, "projectId must not be null");
IPage<ProjectComment> page = new Page<>(pageNumber, pageSize);
// 1.如果parentId为null,则只获取一级评论
if (null == parentId) {
QueryWrapper<ProjectComment> projectCommentQueryWrapper = new QueryWrapper<>();
projectCommentQueryWrapper.eq("project_id", projectId);
// 只获取一级评论,也就是depth为0
projectCommentQueryWrapper.eq("depth", 0);
projectCommentQueryWrapper.orderByDesc("create_time");
return page(page, projectCommentQueryWrapper);
}
// 1.如果parentId不为null,则获取其子评论
// 判断父评论是否存在,不存在则抛出异常
ProjectComment parentComment = getById(parentId);
if (null == parentComment) {
throw new ProjectCommentServiceException(ProjectCommentErrorCode.COMMENT_NOT_FOUND);
}
// 查询子评论
QueryWrapper<ProjectComment> projectCommentQueryWrapper = new QueryWrapper<>();
projectCommentQueryWrapper.eq("parent_id", parentId);
return page(page, projectCommentQueryWrapper);
}
}
package cn.meteor.beyondclouds.modules.project.service.impl;
import cn.meteor.beyondclouds.modules.project.bean.ProjectDetail;
import cn.meteor.beyondclouds.modules.project.entity.Project;
import cn.meteor.beyondclouds.modules.project.entity.ProjectCategory;
import cn.meteor.beyondclouds.modules.project.entity.ProjectComment;
import cn.meteor.beyondclouds.modules.project.entity.ProjectExt;
import cn.meteor.beyondclouds.modules.project.enums.ProjectErrorCode;
import cn.meteor.beyondclouds.modules.project.exception.ProjectServiceException;
import cn.meteor.beyondclouds.modules.project.mapper.ProjectCategoryMapper;
import cn.meteor.beyondclouds.modules.project.mapper.ProjectMapper;
import cn.meteor.beyondclouds.modules.project.service.IProjectCommentService;
import cn.meteor.beyondclouds.modules.project.service.IProjectExtService;
import cn.meteor.beyondclouds.modules.project.service.IProjectService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
/**
* <p>
......@@ -17,4 +34,139 @@ import org.springframework.stereotype.Service;
@Service
public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> implements IProjectService {
private IProjectExtService projectExtService;
private ProjectCategoryMapper projectCategoryMapper;
private IProjectCommentService projectCommentService;
@Autowired
public ProjectServiceImpl(IProjectExtService projectExtService, ProjectCategoryMapper projectCategoryMapper ) {
this.projectExtService = projectExtService;
this.projectCategoryMapper = projectCategoryMapper;
}
@Autowired
public void setProjectCommentService(IProjectCommentService projectCommentService) {
this.projectCommentService = projectCommentService;
}
@Transactional(rollbackFor = Exception.class)
@Override
public void publishProject(Project project, String detail) throws ProjectServiceException {
Assert.notNull(project, "project must not be null");
Assert.hasText(project.getUserId(), "userId must not be empty");
// 1.检查项目类别是否存在
Integer categoryId = project.getCategoryId();
ProjectCategory projectCategory = projectCategoryMapper.selectById(categoryId);
// 若分类不存在,则抛出异常
if (null == projectCategory) {
throw new ProjectServiceException(ProjectErrorCode.INCORRECT_CATEGORY);
}
// 2.保存项目
save(project);
// 3.保存项目详情
ProjectExt projectExt = new ProjectExt();
projectExt.setProjectId(project.getProjectId());
projectExt.setProjectDetail(detail);
projectExtService.save(projectExt);
}
@Override
public void deleteProject(String projectId, String userId) throws ProjectServiceException {
Assert.notNull(projectId, "projectId must not be null");
Assert.notNull(userId, "userId must not be null");
// 1.判断自己有没有发过这个项目
QueryWrapper<Project> projectQueryWrapper = new QueryWrapper<>();
projectQueryWrapper
.eq("project_id", projectId)
.eq("user_id", userId);
Project project = getOne(projectQueryWrapper);
// 若找不到该用户的该项目,则抛出业务异常
if (null == project) {
throw new ProjectServiceException(ProjectErrorCode.PROJECT_NOT_FOUND);
}
// 2.删除项目的所有评论
QueryWrapper<ProjectComment> projectCommentQueryWrapper = new QueryWrapper<>();
projectCommentQueryWrapper.eq("project_id", projectId);
projectCommentService.remove(projectCommentQueryWrapper);
// 3.删除项目本身
// 删除项目详情
projectExtService.removeById(projectId);
// 删除项目
removeById(projectId);
}
@Override
public ProjectDetail getProject(String projectId) throws ProjectServiceException {
Assert.notNull(projectId, "projectId must not be null");
// 1.获取项目
Project project = getById(projectId);
// 若找不到该项目,则抛出业务异常
if (null == project) {
throw new ProjectServiceException(ProjectErrorCode.PROJECT_NOT_FOUND);
}
// 2.获取项目详情
ProjectExt projectExt = projectExtService.getById(projectId);
// 3.装配并返回查询到的信息
ProjectDetail projectDetail = new ProjectDetail();
BeanUtils.copyProperties(project, projectDetail);
projectDetail.setProjectDetail(projectExt.getProjectDetail());
return projectDetail;
}
@Override
public IPage<Project> getProjectPage(Integer pageNumber, Integer pageSize) {
IPage<Project> page = new Page<>(pageNumber, pageSize);
return page(page);
}
@Override
public void updateProject(Project project, String projectDetail) throws ProjectServiceException {
Assert.notNull(project, "project must not be null");
Assert.hasText(project.getUserId(), "userId must not be empty");
Assert.notNull(project.getProjectId(), "projectId must not be null");
// 1.判断自己有没有发过这个项目
Project projectInDb = getById(project);
// 若找不到该项目,则抛出业务异常
if (null == projectInDb) {
throw new ProjectServiceException(ProjectErrorCode.PROJECT_NOT_FOUND);
}
// 2.更新项目基本信息
updateById(project);
// 3.更新项目详情
if (!StringUtils.isEmpty(projectDetail)) {
ProjectExt projectExt = new ProjectExt();
projectExt.setProjectId(project.getProjectId());
projectExt.setProjectDetail(projectDetail);
projectExtService.updateById(projectExt);
}
}
@Override
public IPage<Project> getProjectPage(Integer pageNumber, Integer pageSize, String userId) {
IPage<Project> page = new Page<>(pageNumber, pageSize);
QueryWrapper<Project> projectQueryWrapper = new QueryWrapper<>();
projectQueryWrapper.eq("user_id", userId);
return page(page, projectQueryWrapper);
}
}
package cn.meteor.beyondclouds.modules.question.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.io.Serializable;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* <p>
* 问题扩展表
......@@ -25,6 +25,7 @@ public class QuestionExt implements Serializable {
private static final long serialVersionUID=1L;
@TableId
private String questionId;
@ApiModelProperty(value = "问题详情")
......
package cn.meteor.beyondclouds.modules.question.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.io.Serializable;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* <p>
* 问题标签表,用来记录问题里面引用的标签
......@@ -26,10 +26,11 @@ public class QuestionTag implements Serializable {
private static final long serialVersionUID=1L;
@ApiModelProperty(value = "标签ID")
@TableId(value = "tag_id", type = IdType.ASSIGN_UUID)
@TableId
private String tagId;
@ApiModelProperty(value = "问题ID")
@TableId
private String questionId;
......
......@@ -27,6 +27,7 @@ mybatis-plus:
mapper-locations: classpath*:cn/meteor/beyondclouds/modules/**/xml/*.xml
beyondclouds:
debug: true
auth:
qq:
client-id: 101846021
......
......@@ -27,6 +27,7 @@ mybatis-plus:
mapper-locations: classpath*:cn/meteor/beyondclouds/modules/**/xml/*.xml
beyondclouds:
debug: true
auth:
qq:
client-id: 101846021
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment