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; package cn.meteor.beyondclouds.common.handler;
import cn.meteor.beyondclouds.config.properties.BeyondCloudsProperties;
import cn.meteor.beyondclouds.core.api.Response; import cn.meteor.beyondclouds.core.api.Response;
import cn.meteor.beyondclouds.common.enums.ErrorCode; import cn.meteor.beyondclouds.common.enums.ErrorCode;
import cn.meteor.beyondclouds.core.exception.ServiceException; import cn.meteor.beyondclouds.core.exception.ServiceException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.HttpRequestMethodNotSupportedException; import org.springframework.web.HttpRequestMethodNotSupportedException;
import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.web.bind.annotation.RestControllerAdvice;
...@@ -15,16 +17,30 @@ import javax.servlet.http.HttpServletRequest; ...@@ -15,16 +17,30 @@ import javax.servlet.http.HttpServletRequest;
*/ */
@RestControllerAdvice @RestControllerAdvice
public class GlobalExceptionHandler { public class GlobalExceptionHandler {
private BeyondCloudsProperties beyondCloudsProperties;
@Autowired
public GlobalExceptionHandler(BeyondCloudsProperties beyondCloudsProperties) {
this.beyondCloudsProperties = beyondCloudsProperties;
}
@ExceptionHandler(value = Exception.class) @ExceptionHandler(value = Exception.class)
public Response<String> exceptionHandler(HttpServletRequest request, Exception e) { public Response<String> exceptionHandler(HttpServletRequest request, Exception e) {
e.printStackTrace(); boolean debugMode = beyondCloudsProperties.getDebug();
if (debugMode) {
e.printStackTrace();
}
if (e instanceof ServiceException) { if (e instanceof ServiceException) {
ServiceException exception = (ServiceException) e; ServiceException exception = (ServiceException) e;
return Response.error(exception.getErrorCode(), exception.getErrorMsg()); return Response.error(exception.getErrorCode(), exception.getErrorMsg());
} else if (e instanceof HttpRequestMethodNotSupportedException){ } else if (e instanceof HttpRequestMethodNotSupportedException){
return Response.error(ErrorCode.OPERATION_FAILED.code(), e.getMessage()); return Response.error(ErrorCode.OPERATION_FAILED.code(), e.getMessage());
} else { } else {
return Response.error(); if (debugMode) {
return Response.error(ErrorCode.OPERATION_FAILED.code(), e.getMessage());
} else {
return Response.error();
}
} }
} }
} }
...@@ -27,6 +27,11 @@ public class BeyondCloudsProperties { ...@@ -27,6 +27,11 @@ public class BeyondCloudsProperties {
} }
/** /**
* debug模式开关
*/
private Boolean debug;
/**
* 认证配置 * 认证配置
*/ */
private AuthProperties auth; private AuthProperties auth;
......
package cn.meteor.beyondclouds.modules.blog.entity; package cn.meteor.beyondclouds.modules.blog.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import java.io.Serializable;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
import java.io.Serializable;
/** /**
* <p> * <p>
* 博客扩展表 * 博客扩展表
...@@ -25,6 +25,7 @@ public class BlogExt implements Serializable { ...@@ -25,6 +25,7 @@ public class BlogExt implements Serializable {
private static final long serialVersionUID=1L; private static final long serialVersionUID=1L;
@TableId
private String blogId; private String blogId;
@ApiModelProperty(value = "博客详情") @ApiModelProperty(value = "博客详情")
......
package cn.meteor.beyondclouds.modules.blog.entity; package cn.meteor.beyondclouds.modules.blog.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import java.io.Serializable;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
import java.io.Serializable;
/** /**
* <p> * <p>
* 博客标签表,用来记录博客里面引用了哪些标签 * 博客标签表,用来记录博客里面引用了哪些标签
...@@ -26,10 +26,11 @@ public class BlogTag implements Serializable { ...@@ -26,10 +26,11 @@ public class BlogTag implements Serializable {
private static final long serialVersionUID=1L; private static final long serialVersionUID=1L;
@ApiModelProperty(value = "博客主键") @ApiModelProperty(value = "博客主键")
@TableId(value = "blog_id", type = IdType.ASSIGN_UUID) @TableId
private String blogId; private String blogId;
@ApiModelProperty(value = "标签主键") @ApiModelProperty(value = "标签主键")
@TableId
private String tagId; private String tagId;
......
package cn.meteor.beyondclouds.modules.news.entity; package cn.meteor.beyondclouds.modules.content.entity;
import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.IdType;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import java.io.Serializable;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
import java.io.Serializable;
import java.time.LocalDateTime;
/** /**
* <p> * <p>
* 新闻资讯 * CMS-栏目
* </p> * </p>
* *
* @author 段启岩 * @author 段启岩
* @since 2020-01-30 * @since 2020-02-01
*/ */
@Data @Data
@EqualsAndHashCode(callSuper = false) @EqualsAndHashCode(callSuper = false)
@Accessors(chain = true) @Accessors(chain = true)
@ApiModel(value="News对象", description="新闻资讯表") @ApiModel(value="Channel对象", description="CMS-栏目表")
public class News implements Serializable { public class Channel implements Serializable {
private static final long serialVersionUID=1L; private static final long serialVersionUID=1L;
@TableId(value = "news_id", type = IdType.ASSIGN_UUID) @TableId(value = "channel_id", type = IdType.AUTO)
private String newsId; private Integer channelId;
@ApiModelProperty(value = "资讯标题") @ApiModelProperty(value = "父级栏目ID")
private String newsTitle; private Integer parentId;
@ApiModelProperty(value = "资讯封面图") @ApiModelProperty(value = "栏目名称")
private String cover; private String channelName;
@ApiModelProperty(value = "资讯内容") @ApiModelProperty(value = "栏目路径")
private String content; private String thread;
private LocalDateTime createTime; 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; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/** /**
* <p> * <p>
* 新闻资讯表 Mapper 接口 * CMS-栏目表 Mapper 接口
* </p> * </p>
* *
* @author 段启岩 * @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"?> <?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"> <!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> </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; import com.baomidou.mybatisplus.extension.service.IService;
/** /**
* <p> * <p>
* 新闻资讯表 服务类 * CMS-栏目表 服务类
* </p> * </p>
* *
* @author 段启岩 * @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.content.entity.Channel;
import cn.meteor.beyondclouds.modules.news.mapper.NewsMapper; import cn.meteor.beyondclouds.modules.content.mapper.ChannelMapper;
import cn.meteor.beyondclouds.modules.news.service.INewsService; import cn.meteor.beyondclouds.modules.content.service.IChannelService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
/** /**
* <p> * <p>
* 新闻资讯表 服务实现类 * CMS-栏目表 服务实现类
* </p> * </p>
* *
* @author 段启岩 * @author 段启岩
* @since 2020-01-30 * @since 2020-02-01
*/ */
@Service @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; ...@@ -2,14 +2,15 @@ package cn.meteor.beyondclouds.modules.project.entity;
import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import java.time.LocalDateTime;
import java.io.Serializable;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
/** /**
* <p> * <p>
* 项目表 * 项目表
...@@ -68,9 +69,9 @@ public class Project implements Serializable { ...@@ -68,9 +69,9 @@ public class Project implements Serializable {
@ApiModelProperty(value = "封面图") @ApiModelProperty(value = "封面图")
private String cover; 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; ...@@ -2,14 +2,15 @@ package cn.meteor.beyondclouds.modules.project.entity;
import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import java.time.LocalDateTime;
import java.io.Serializable;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
/** /**
* <p> * <p>
* 项目评论表 * 项目评论表
...@@ -46,9 +47,9 @@ public class ProjectComment implements Serializable { ...@@ -46,9 +47,9 @@ public class ProjectComment implements Serializable {
@ApiModelProperty(value = "评论路径 ") @ApiModelProperty(value = "评论路径 ")
private String thread; private String thread;
private LocalDateTime createTime; private Date createTime;
private LocalDateTime updateTime; private Date updateTime;
} }
package cn.meteor.beyondclouds.modules.project.entity; package cn.meteor.beyondclouds.modules.project.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import java.io.Serializable;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
import java.io.Serializable;
/** /**
* <p> * <p>
* 项目扩展表 * 项目扩展表
...@@ -25,6 +25,7 @@ public class ProjectExt implements Serializable { ...@@ -25,6 +25,7 @@ public class ProjectExt implements Serializable {
private static final long serialVersionUID=1L; private static final long serialVersionUID=1L;
@TableId
private Integer projectId; private Integer projectId;
@ApiModelProperty(value = "项目详情") @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; package cn.meteor.beyondclouds.modules.project.service;
import cn.meteor.beyondclouds.modules.project.entity.ProjectComment; 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; import com.baomidou.mybatisplus.extension.service.IService;
/** /**
...@@ -13,4 +15,29 @@ import com.baomidou.mybatisplus.extension.service.IService; ...@@ -13,4 +15,29 @@ import com.baomidou.mybatisplus.extension.service.IService;
*/ */
public interface IProjectCommentService extends IService<ProjectComment> { 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; 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.entity.Project;
import cn.meteor.beyondclouds.modules.project.exception.ProjectServiceException;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
/** /**
...@@ -13,4 +16,48 @@ import com.baomidou.mybatisplus.extension.service.IService; ...@@ -13,4 +16,48 @@ import com.baomidou.mybatisplus.extension.service.IService;
*/ */
public interface IProjectService extends IService<Project> { 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; 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.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.mapper.ProjectCommentMapper;
import cn.meteor.beyondclouds.modules.project.service.IProjectCommentService; 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 com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
/** /**
* <p> * <p>
...@@ -17,4 +27,116 @@ import org.springframework.stereotype.Service; ...@@ -17,4 +27,116 @@ import org.springframework.stereotype.Service;
@Service @Service
public class ProjectCommentServiceImpl extends ServiceImpl<ProjectCommentMapper, ProjectComment> implements IProjectCommentService { 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; 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.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.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 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 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.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
/** /**
* <p> * <p>
...@@ -17,4 +34,139 @@ import org.springframework.stereotype.Service; ...@@ -17,4 +34,139 @@ import org.springframework.stereotype.Service;
@Service @Service
public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> implements IProjectService { 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; package cn.meteor.beyondclouds.modules.question.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import java.io.Serializable;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
import java.io.Serializable;
/** /**
* <p> * <p>
* 问题扩展表 * 问题扩展表
...@@ -25,6 +25,7 @@ public class QuestionExt implements Serializable { ...@@ -25,6 +25,7 @@ public class QuestionExt implements Serializable {
private static final long serialVersionUID=1L; private static final long serialVersionUID=1L;
@TableId
private String questionId; private String questionId;
@ApiModelProperty(value = "问题详情") @ApiModelProperty(value = "问题详情")
......
package cn.meteor.beyondclouds.modules.question.entity; package cn.meteor.beyondclouds.modules.question.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import java.io.Serializable;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
import java.io.Serializable;
/** /**
* <p> * <p>
* 问题标签表,用来记录问题里面引用的标签 * 问题标签表,用来记录问题里面引用的标签
...@@ -26,10 +26,11 @@ public class QuestionTag implements Serializable { ...@@ -26,10 +26,11 @@ public class QuestionTag implements Serializable {
private static final long serialVersionUID=1L; private static final long serialVersionUID=1L;
@ApiModelProperty(value = "标签ID") @ApiModelProperty(value = "标签ID")
@TableId(value = "tag_id", type = IdType.ASSIGN_UUID) @TableId
private String tagId; private String tagId;
@ApiModelProperty(value = "问题ID") @ApiModelProperty(value = "问题ID")
@TableId
private String questionId; private String questionId;
......
...@@ -27,6 +27,7 @@ mybatis-plus: ...@@ -27,6 +27,7 @@ mybatis-plus:
mapper-locations: classpath*:cn/meteor/beyondclouds/modules/**/xml/*.xml mapper-locations: classpath*:cn/meteor/beyondclouds/modules/**/xml/*.xml
beyondclouds: beyondclouds:
debug: true
auth: auth:
qq: qq:
client-id: 101846021 client-id: 101846021
......
...@@ -27,6 +27,7 @@ mybatis-plus: ...@@ -27,6 +27,7 @@ mybatis-plus:
mapper-locations: classpath*:cn/meteor/beyondclouds/modules/**/xml/*.xml mapper-locations: classpath*:cn/meteor/beyondclouds/modules/**/xml/*.xml
beyondclouds: beyondclouds:
debug: true
auth: auth:
qq: qq:
client-id: 101846021 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