一、后端返回结果实体:Result、PageResult
Result:
package com.admin.result;
import lombok.Data;
import java.io.Serializable;
/**
* 后端统一返回结果
* @param <T>
*/
@Data
public class Result<T> implements Serializable {
private Integer code; //编码:200成功,0和其它数字为失败
private String msg; //错误信息
private T data; //数据
public static <T> Result<T> success() {
Result<T> result = new Result<T>();
result.code = 200;
return result;
}
public static <T> Result<T> success(T object) {
Result<T> result = new Result<T>();
result.data = object;
result.code = 200;
return result;
}
public static <T> Result<T> error(String msg) {
Result result = new Result();
result.msg = msg;
result.code = 0;
return result;
}
}
PageResult:
package com.admin.result;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.List;
/**
* 封装分页查询结果
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class PageResult implements Serializable {
private long total; //总记录数
private List records; //当前页数据集合
}
二、接收前端实体对象:ProjectPageQueryDTO
ProjectPageQueryDTO:
package com.admin.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 分页查询个人中心的项目列表
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ProjectPageQueryDTO implements Serializable {
// selectMenuItem:null,
// //审核状态
// projectSuiting: null,
// //众筹状态
// status: null,
// //项目名称
// title:null,
// pageNum: 1,
// pageSize: 10
/** 接收
* 选择的项 Zc 是支持的项目,Fq 是发起的项目, Xh 是喜欢的项目
*/
private String selectMenuItem;
/**
* 审核状态 1草稿 2通过 3审核中 4未通过
*/
private Integer projectSuiting;
/**
* 众筹状态 1众筹中 2已成功 3未完成
*/
private Integer status;
/**
* title
*/
private String title;
/**
* 第几页
*/
private int page;
/**
* 每页多少条
*/
private int pageSize;
/**
* 当前用户ID
*/
private Integer userId;
}
三、项目实体类:Project
project:
package com.admin.entity;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
/**
* Project表,项目表对象
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Project {
private static final long serialVersionUID = 1l;
/**
* 主键Id
*/
private Integer id;
/**
* 用户Id
*/
private Integer userId;
/**
* 项目名称
*/
private String title;
/**
* 筹资金额
*/
private Integer financing;
/**
* 筹集天数
*/
private Integer raiseDay;
/**
* 类别
* 全部 0、科技 1、艺术 2、设计 3、音乐 4、影视 5、出版 6、动漫 7、公益 8、公开课 9、农业 10、餐饮 11、其他 12、
*/
private Integer category;
/**
* 项目封面
*/
private String cover;
/**
* 项目所在地
*/
private String address;
/**
* 看项目视频地址
*/
private String video;
/**
* 项目简介
*/
private String introduce;
/**
* 项目详情
*/
private String details;
/**
* 项目标签
*/
private String label;
/**
* 项目的审核 1通过 2审核中 3未通过
*/
private Integer projectSuiting;
/**
* 项目状态 1已成功 2筹集中 3未完成
*/
private Integer status;
/**
* 是否删除 1未删除 0删除 逻辑删除
*/
private Integer del_flag;
/**
* 创建时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;
/**
* 修改时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime updateTime;
/**
* 创建人
*/
private String createUser;
/**
* 修改人
*/
private String updateUser;
}
四、单个返回对象:ProjectVO、ProjectDetailScheduleVO
projectVO 、项目基本信息
package com.admin.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
/**
* 返回去的个人中心单个项目的列表信息
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ProjectVO {
private static final long serialVersionUID = 1L;
/**
* 主键Id
*/
private Integer id;
/**
* 项目名称
*/
private String title;
/**
* 项目封面
*/
private String cover;
/**
* 筹资金额
*/
private Integer financing;
/**
* 发布日期
*/
@JsonFormat(pattern = "yyyy-MM-dd")
private LocalDateTime releaseTime;
/**
* 截止日期
*/
@JsonFormat(pattern = "yyyy-MM-dd")
private LocalDateTime endTime;
/**
* 项目支持的总金额
*/
private Integer totalSupportMoney;
/**
* 筹资金额的占比
*/
private String proPortion;
/**
* 审核状态
*/
private Integer projectSuiting;
}
ProjectDetailScheduleVO 项目进度统计返回对象
package com.admin.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 项目明细的统计,进度情况,支持总金额,以及占比
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ProjectDetailScheduleVO {
/**
* 项目Id
*/
private Integer projectId;
/**
* 支持总金额
*/
private Integer totalSupportMoney;
/**
* 占比
*/
private Float proPortion;
/**
* 项目支持的总人数,在首页统计的用该字段
*/
private Integer totalProjectSupport;
/**
* 项目的喜欢 1喜欢 2不喜欢
*/
private Integer projectLike;
}
五、控制层
@ApiOperation("个人中心项目列表")
@GetMapping("/pageSelectByItem")
public Result<PageResult> pageSelectProjectByItem(ProjectPageQueryDTO projectPageQueryDTO){
log.info("个人中心项目列表:{}",projectPageQueryDTO);
projectPageQueryDTO.setUserId(Math.toIntExact(BaseContext.getCurrentId()));
PageResult pageResult = projectService.pageSelectProjectByItem(projectPageQueryDTO);
return Result.success(pageResult);
}
六、服务层和实现层:ProjectService 、ProjectServiceImpl
ProjectService :
package com.admin.service;
import com.admin.dto.BrowseProjectsPageQueryDTO;
import com.admin.dto.ProjectAllDTO;
import com.admin.dto.ProjectInfoDTO;
import com.admin.dto.ProjectPageQueryDTO;
import com.admin.result.PageResult;
import com.admin.vo.ProjectAllVO;
import com.admin.vo.ProjectCountAllVO;
public interface ProjectService {
/**
* 分页查询个人中心的项目列表
* @return
*/
PageResult pageSelectProjectByItem(ProjectPageQueryDTO projectPageQueryDTO);
}
ProjectServiceImpl:
/**
* 分页查询个人中心的项目列表
* @return
*/
@Override
public PageResult pageSelectProjectByItem(ProjectPageQueryDTO projectPageQueryDTO) {
//开始分页
PageHelper.startPage(projectPageQueryDTO.getPage(), projectPageQueryDTO.getPageSize());
Page<Project> page = projectMapper.pageSelectProjectByItem(projectPageQueryDTO);
long total = page.getTotal();
List<Project> result = page.getResult();
//写一个id集合,尽量不在循环里面进行增删改查,
List<Integer> projectIds = new ArrayList<>();
//组成新的集合数据返回给前端
List<ProjectVO> projectVOS = result.stream().map(o -> {
ProjectVO projectVO = new ProjectVO();
BeanUtils.copyProperties(o,projectVO);
//当项目的审核通过之后,更新的时间就是发布时间,再通过筹集天数,算出截止时间
if(o.getProjectSuiting().equals(2)){
LocalDateTime updateTime = o.getUpdateTime();
projectVO.setReleaseTime(updateTime);
// 加上筹集的天数,就是结束时间
LocalDateTime endTime = updateTime.plusDays(o.getRaiseDay());
projectVO.setEndTime(endTime);
projectIds.add(o.getId());
}
return projectVO;
}).collect(Collectors.toList());
if(projectIds.size()>0){
// 批量查询统计项目的支持总金额,计算进度情况
List<ProjectDetailScheduleVO> projectDetailScheduleVOList = projectDetailMapper.getProjectTotalSupportMoney(projectIds);
// 创建一个Map,用于存储projectId和对应的ProjectDetailScheduleVO对象
Map<Integer, ProjectDetailScheduleVO> projectIdToDetailMap = projectDetailScheduleVOList.stream()
.collect(Collectors.toMap(ProjectDetailScheduleVO::getProjectId, Function.identity()));
// 遍历projectVOS集合,根据projectId从Map中获取对应的ProjectDetailScheduleVO对象,并赋值给对应的ProjectVO对象
// 项目的进度待赋值
for (ProjectVO projectVO : projectVOS) {
ProjectDetailScheduleVO detailScheduleVO = projectIdToDetailMap.get(projectVO.getId());
if (detailScheduleVO != null) {
//没有支持金额的时候设置0
if (detailScheduleVO.getTotalSupportMoney() == null) {
detailScheduleVO.setTotalSupportMoney(0);
}
double proPortionResult = ((double) detailScheduleVO.getTotalSupportMoney() / projectVO.getFinancing())*100;
// 使用 DecimalFormat 进行四舍五入并格式化
DecimalFormat df = new DecimalFormat("#.##"); // 保留两位小数
df.setRoundingMode(RoundingMode.HALF_UP); // 设置四舍五入模式
String proPortion = df.format(proPortionResult);
projectVO.setTotalSupportMoney(detailScheduleVO.getTotalSupportMoney());
projectVO.setProPortion(proPortion);
}
}
}
return new PageResult(total,projectVOS);
}
七、Mapper层以及sql :ProjectMapper、ProjectDetailMapper
ProjectMapper:
package com.admin.mapper;
import com.admin.annotaion.AutoFill;
import com.admin.dto.BrowseProjectsPageQueryDTO;
import com.admin.dto.ProjectPageQueryDTO;
import com.admin.entity.Project;
import com.admin.enumeration.OperationType;
import com.github.pagehelper.Page;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import java.util.List;
@Mapper
public interface ProjectMapper {
/**
* 个人中心模块项目列表过滤的分页查询
* @param projectPageQueryDTO
* @return
*/
Page<Project> pageSelectProjectByItem(ProjectPageQueryDTO projectPageQueryDTO);
}
<select id="pageSelectProjectByItem" resultType="com.admin.entity.Project">
select * from project
<where>
<if test="projectSuiting !=null">
and projectSuiting = #{projectSuiting}
</if>
<if test="status !=null">
and status = #{status}
</if>
<if test="title!=null and title !=''">
and title like concat('%',#{title},'%')
</if>
<if test="userId !=null and selectMenuItem !=null and selectMenuItem == 'Zc'">
and id in (SELECT projectId FROM projectdetail where userId = #{userId} and projectSupport = 1)
</if>
<if test="userId !=null and selectMenuItem !=null and selectMenuItem == 'Fq'">
and id in (SELECT projectId FROM projectdetail where userId = #{userId} and projectLaunch = 1)
</if>
<if test="userId !=null and selectMenuItem !=null and selectMenuItem == 'Xh'">
and id in (SELECT projectId FROM projectdetail where userId = #{userId} and projectLike = 1)
</if>
</where>
order by createTime desc
</select>
ProjectDetailMapper:
package com.admin.mapper;
import com.admin.annotaion.AutoFill;
import com.admin.entity.Project;
import com.admin.entity.ProjectDetail;
import com.admin.enumeration.OperationType;
import com.admin.vo.ProjectDetailScheduleVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import java.util.List;
@Mapper
public interface ProjectDetailMapper {
/**
* 查询项目明细的支持总金额情况
* @param projectIds
* @return
*/
List<ProjectDetailScheduleVO> getProjectTotalSupportMoney(List<Integer> projectIds);
}
<select id="getProjectTotalSupportMoney" resultType="com.admin.vo.ProjectDetailScheduleVO">
SELECT projectId,
(SELECT SUM(supportMoney) FROM projectdetail pd2 WHERE pd2.projectId = pd1.projectId) AS totalSupportMoney
FROM projectdetail pd1
WHERE projectId IN
<foreach collection="projectIds" item="projectId" open="(" separator="," close=")">
#{projectId}
</foreach>
</select>
个人建议:做项目的时候,大家尽量建一个文档,从0开始搭建的时候,构建思路以及接口分析都在文档上面进行记录。目前作者正在全栈积累项目经验,从0搭建项目,数据模型分析,接口优化、Redis缓存、前端界面布局,组件封装,做项目的时候没有进行记录,写久了的接口,后面久没回头看,一直边分析边写,没有记录,容易忘记,感觉都不是自己写的东西了。。。