Commit 7cecb8d3 by 段启岩

发布项目,删除项目,项目详情,项目列表

parent 5e04066c
package cn.meteor.beyondclouds.common.vo;
import lombok.Data;
import java.util.List;
/**
* 分页结果返回
* @author meteor
*/
@Data
public class PageVO<T> {
/**
* 总页数
*/
private Long totalPage;
/**
* 数据
*/
private List<T> dataList;
}
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) {
// 将项目表单转换为项目对象
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 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);
}
}
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;
}
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 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 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.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,32 @@ 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);
}
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;
/**
* <p>
......@@ -17,4 +32,98 @@ 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, IProjectCommentService projectCommentService) {
this.projectExtService = projectExtService;
this.projectCategoryMapper = projectCategoryMapper;
this.projectCommentService = projectCommentService;
}
@Transactional(rollbackFor = Exception.class)
@Override
public void publishProject(Project project, String detail) throws ProjectServiceException {
// 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 {
// 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.删除项目本身
// 删除项目详情
QueryWrapper<ProjectExt> projectExtQueryWrapper = new QueryWrapper<>();
projectExtQueryWrapper.eq("project_id", projectId);
projectExtService.remove(projectExtQueryWrapper);
// 删除项目
removeById(projectId);
}
@Override
public ProjectDetail getProject(String projectId) throws ProjectServiceException {
// 1.获取项目
Project project = getById(projectId);
// 若找不到该项目,则抛出业务异常
if (null == project) {
throw new ProjectServiceException(ProjectErrorCode.PROJECT_NOT_FOUND);
}
// 2.获取项目详情
QueryWrapper<ProjectExt> projectExtQueryWrapper = new QueryWrapper<>();
projectExtQueryWrapper.eq("project_id", projectId);
ProjectExt projectExt = projectExtService.getOne(projectExtQueryWrapper);
// 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);
}
}
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