feat: 新增首页 & 论坛 API接口

This commit is contained in:
TIAN 2025-05-15 00:13:41 +08:00
parent 2f9a3cdbac
commit d7f8a56a53
14 changed files with 517 additions and 12 deletions

BIN
.DS_Store vendored Normal file

Binary file not shown.

BIN
src/.DS_Store vendored Normal file

Binary file not shown.

View File

@ -36,14 +36,13 @@ import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.util.Arrays;
import java.util.List;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.RejectedExecutionException;
import java.util.concurrent.ThreadPoolExecutor;
/**
* 帖子接口
* 图表接口
*
* @author <a href="https://github.com/liyupi">程序员鱼皮</a>
* @from <a href="https://yupi.icu">编程导航知识星球</a>
@ -70,6 +69,366 @@ public class ChartController {
@Resource
private ThreadPoolExecutor threadPoolExecutor;
/**
* 获取本周每天图表生成成功数
*
* @param request
* @return
*/
@GetMapping("/week/success/count")
public BaseResponse<List<Integer>> getWeekChartSuccessCount(HttpServletRequest request) {
// 获取本周的开始日期周一和结束日期周日
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
Date weekStart = calendar.getTime();
calendar.add(Calendar.DATE, 6);
calendar.set(Calendar.HOUR_OF_DAY, 23);
calendar.set(Calendar.MINUTE, 59);
calendar.set(Calendar.SECOND, 59);
calendar.set(Calendar.MILLISECOND, 999);
Date weekEnd = calendar.getTime();
// 创建存储每天成功数量的列表
List<Integer> dailySuccessCounts = new ArrayList<>();
// 查询本周每天的成功图表数量
calendar.setTime(weekStart);
for (int i = 0; i < 7; i++) {
Date dayStart = calendar.getTime();
calendar.set(Calendar.HOUR_OF_DAY, 23);
calendar.set(Calendar.MINUTE, 59);
calendar.set(Calendar.SECOND, 59);
calendar.set(Calendar.MILLISECOND, 999);
Date dayEnd = calendar.getTime();
// 查询当天成功的图表数量
QueryWrapper<Chart> successQuery = new QueryWrapper<>();
successQuery.in("status", Arrays.asList("succeed", "success"));
successQuery.between("createTime", dayStart, dayEnd);
successQuery.eq("isDelete", false);
long successCount = chartService.count(successQuery);
dailySuccessCounts.add((int) successCount);
// 移动到下一天
calendar.add(Calendar.DATE, 1);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
}
return ResultUtils.success(dailySuccessCounts);
}
/**
* 获取当前用户本周每天图表生成成功数
*
* @param request
* @return
*/
@GetMapping("/my/week/success/count")
public BaseResponse<List<Integer>> getMyWeekChartSuccessCount(HttpServletRequest request) {
User loginUser = userService.getLoginUser(request);
// 获取本周的开始日期周一和结束日期周日
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
Date weekStart = calendar.getTime();
calendar.add(Calendar.DATE, 6);
calendar.set(Calendar.HOUR_OF_DAY, 23);
calendar.set(Calendar.MINUTE, 59);
calendar.set(Calendar.SECOND, 59);
calendar.set(Calendar.MILLISECOND, 999);
Date weekEnd = calendar.getTime();
// 创建存储每天成功数量的列表
List<Integer> dailySuccessCounts = new ArrayList<>();
// 查询本周每天的成功图表数量
calendar.setTime(weekStart);
for (int i = 0; i < 7; i++) {
Date dayStart = calendar.getTime();
calendar.set(Calendar.HOUR_OF_DAY, 23);
calendar.set(Calendar.MINUTE, 59);
calendar.set(Calendar.SECOND, 59);
calendar.set(Calendar.MILLISECOND, 999);
Date dayEnd = calendar.getTime();
// 查询当天成功的图表数量
QueryWrapper<Chart> successQuery = new QueryWrapper<>();
successQuery.in("status", Arrays.asList("succeed", "success"));
successQuery.between("createTime", dayStart, dayEnd);
successQuery.eq("userId", loginUser.getId());
successQuery.eq("isDelete", false);
long successCount = chartService.count(successQuery);
dailySuccessCounts.add((int) successCount);
// 移动到下一天
calendar.add(Calendar.DATE, 1);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
}
return ResultUtils.success(dailySuccessCounts);
}
/**
* 获取今日图表生成个数
*
* @param request
* @return
*/
@GetMapping("/today/count")
public BaseResponse<Long> getTodayChartCount(HttpServletRequest request) {
// 获取今天的开始时间00:00:00和结束时间23:59:59
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
Date todayStart = calendar.getTime();
calendar.set(Calendar.HOUR_OF_DAY, 23);
calendar.set(Calendar.MINUTE, 59);
calendar.set(Calendar.SECOND, 59);
calendar.set(Calendar.MILLISECOND, 999);
Date todayEnd = calendar.getTime();
// 创建查询条件
QueryWrapper<Chart> queryWrapper = new QueryWrapper<>();
queryWrapper.between("createTime", todayStart, todayEnd);
queryWrapper.eq("isDelete", false);
// 查询今日创建的图表数量
long count = chartService.count(queryWrapper);
return ResultUtils.success(count);
}
/**
* 获取当前用户今日图表生成个数
*
* @param request
* @return
*/
@GetMapping("/my/today/count")
public BaseResponse<Long> getMyTodayChartCount(HttpServletRequest request) {
User loginUser = userService.getLoginUser(request);
// 获取今天的开始时间00:00:00和结束时间23:59:59
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
Date todayStart = calendar.getTime();
calendar.set(Calendar.HOUR_OF_DAY, 23);
calendar.set(Calendar.MINUTE, 59);
calendar.set(Calendar.SECOND, 59);
calendar.set(Calendar.MILLISECOND, 999);
Date todayEnd = calendar.getTime();
// 创建查询条件
QueryWrapper<Chart> queryWrapper = new QueryWrapper<>();
queryWrapper.between("createTime", todayStart, todayEnd);
queryWrapper.eq("userId", loginUser.getId());
queryWrapper.eq("isDelete", false);
// 查询当前用户今日创建的图表数量
long count = chartService.count(queryWrapper);
return ResultUtils.success(count);
}
/**
* 获取图表生成的成功率
*
* @param request
* @return
*/
@GetMapping("/gen/success-rate")
// @AuthCheck(mustRole = UserConstant.ADMIN_ROLE)
public BaseResponse<Double> getChartGenerationSuccessRate(HttpServletRequest request) {
// 只允许管理员访问
// 查询所有已完成的任务状态为succeed或failed
QueryWrapper<Chart> completedQuery = new QueryWrapper<>();
completedQuery.in("status", Arrays.asList("succeed", "failed", "success"));
completedQuery.eq("isDelete", false);
long completedCount = chartService.count(completedQuery);
if (completedCount == 0) {
// 如果没有完成的任务返回0或null
return ResultUtils.success(0.0);
}
// 查询成功的任务
QueryWrapper<Chart> successQuery = new QueryWrapper<>();
successQuery.in("status", Arrays.asList("succeed", "success"));
successQuery.eq("isDelete", false);
long successCount = chartService.count(successQuery);
// 计算成功率
double successRate = (double) successCount / completedCount;
return ResultUtils.success(successRate);
}
/**
* 获取当前用户图表生成的成功率
*
* @param request
* @return
*/
@GetMapping("/my/gen/success-rate")
public BaseResponse<Double> getMyChartGenerationSuccessRate(HttpServletRequest request) {
User loginUser = userService.getLoginUser(request);
// 查询当前用户所有已完成的任务
QueryWrapper<Chart> completedQuery = new QueryWrapper<>();
completedQuery.in("status", Arrays.asList("succeed", "failed", "success"));
completedQuery.eq("userId", loginUser.getId());
completedQuery.eq("isDelete", false);
long completedCount = chartService.count(completedQuery);
if (completedCount == 0) {
// 如果没有完成的任务返回0
return ResultUtils.success(0.0);
}
// 查询当前用户成功的任务
QueryWrapper<Chart> successQuery = new QueryWrapper<>();
successQuery.in("status", Arrays.asList("succeed", "success"));
successQuery.eq("userId", loginUser.getId());
successQuery.eq("isDelete", false);
long successCount = chartService.count(successQuery);
// 计算成功率
double successRate = (double) successCount / completedCount;
return ResultUtils.success(successRate);
}
/**
* 获取详细的图表生成统计信息
*
* @param request
* @return
*/
@GetMapping("/gen/stats")
//@AuthCheck(mustRole = UserConstant.ADMIN_ROLE)
public BaseResponse<Map<String, Object>> getChartGenerationStats(HttpServletRequest request) {
// 只允许管理员访问
Map<String, Object> statsMap = new HashMap<>();
// 查询总任务数
QueryWrapper<Chart> totalQuery = new QueryWrapper<>();
totalQuery.eq("isDelete", false);
long totalCount = chartService.count(totalQuery);
statsMap.put("totalCount", totalCount);
// 查询等待中的任务数
QueryWrapper<Chart> waitingQuery = new QueryWrapper<>();
waitingQuery.eq("status", "wait");
waitingQuery.eq("isDelete", false);
long waitingCount = chartService.count(waitingQuery);
statsMap.put("waitingCount", waitingCount);
// 查询运行中的任务数
QueryWrapper<Chart> runningQuery = new QueryWrapper<>();
runningQuery.eq("status", "running");
runningQuery.eq("isDelete", false);
long runningCount = chartService.count(runningQuery);
statsMap.put("runningCount", runningCount);
// 查询成功的任务数
QueryWrapper<Chart> successQuery = new QueryWrapper<>();
successQuery.in("status", Arrays.asList("succeed", "success"));
successQuery.eq("isDelete", false);
long successCount = chartService.count(successQuery);
statsMap.put("successCount", successCount);
// 查询失败的任务数
QueryWrapper<Chart> failedQuery = new QueryWrapper<>();
failedQuery.eq("status", "failed");
failedQuery.eq("isDelete", false);
long failedCount = chartService.count(failedQuery);
statsMap.put("failedCount", failedCount);
// 计算成功率
double successRate = totalCount > 0 ? (double) successCount / totalCount : 0;
statsMap.put("successRate", successRate);
// 计算已完成任务的成功率
long completedCount = successCount + failedCount;
double completedSuccessRate = completedCount > 0 ? (double) successCount / completedCount : 0;
statsMap.put("completedSuccessRate", completedSuccessRate);
return ResultUtils.success(statsMap);
}
/**
* 获取图表总数
*
* @param request
* @return
*/
@GetMapping("/count")
public BaseResponse<Long> countCharts(HttpServletRequest request) {
// 只允许管理员访问
// @AuthCheck(mustRole = UserConstant.ADMIN_ROLE)
// 创建查询条件
QueryWrapper<Chart> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("isDelete", false);
// 如果只需要查询当前用户的图表总数可以取消注释以下代码
// User loginUser = userService.getLoginUser(request);
// queryWrapper.eq("userId", loginUser.getId());
long count = chartService.count(queryWrapper);
return ResultUtils.success(count);
}
/**
* 获取当前用户的图表总数
*
* @param request
* @return
*/
@GetMapping("/my/count")
public BaseResponse<Long> countMyCharts(HttpServletRequest request) {
User loginUser = userService.getLoginUser(request);
QueryWrapper<Chart> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("userId", loginUser.getId());
queryWrapper.eq("isDelete", false);
long count = chartService.count(queryWrapper);
return ResultUtils.success(count);
}
/**
* 创建
*

View File

@ -1,4 +1,5 @@
package com.yupi.springbootinit.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@ -49,6 +50,62 @@ public class PostController {
// region 增删改查
@GetMapping("/list/all")
public BaseResponse<List<PostVO>> listAllPosts(HttpServletRequest request) {
// 创建查询条件
QueryWrapper<Post> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("isDelete", false);
queryWrapper.orderByDesc("createTime"); // 按创建时间降序排序
queryWrapper.last("limit 100"); // 限制最多返回100条记录
// 查询所有帖子
List<Post> postList = postService.list(queryWrapper);
// 将帖子列表转换为 PostVO 列表
List<PostVO> postVOList = postService.getPostVOList(postList, request);
return ResultUtils.success(postVOList);
}
/**
* 获取帖子总数
*
* @param request
* @return
*/
@GetMapping("/count")
public BaseResponse<Long> countPosts(HttpServletRequest request) {
// 创建查询条件
QueryWrapper<Post> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("isDelete", false);
// 查询帖子总数
long count = postService.count(queryWrapper);
return ResultUtils.success(count);
}
/**
* 获取当前用户的帖子总数
*
* @param request
* @return
*/
@GetMapping("/my/count")
public BaseResponse<Long> countMyPosts(HttpServletRequest request) {
User loginUser = userService.getLoginUser(request);
// 创建查询条件
QueryWrapper<Post> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("userId", loginUser.getId());
queryWrapper.eq("isDelete", false);
// 查询当前用户的帖子总数
long count = postService.count(queryWrapper);
return ResultUtils.success(count);
}
/**
* 创建
*
@ -260,4 +317,6 @@ public class PostController {
return ResultUtils.success(result);
}
}

View File

@ -290,4 +290,21 @@ public class UserController {
ThrowUtils.throwIf(!result, ErrorCode.OPERATION_ERROR);
return ResultUtils.success(true);
}
/**
* 获取用户总数
*
* @param request
* @return
*/
@GetMapping("/count")
//@AuthCheck(mustRole = UserConstant.ADMIN_ROLE)
public BaseResponse<Long> countUsers(HttpServletRequest request) {
// 默认只有管理员可以查看用户总数
long count = userService.count();
return ResultUtils.success(count);
}
}

View File

@ -7,6 +7,7 @@ import com.yupi.springbootinit.model.dto.post.PostQueryRequest;
import com.yupi.springbootinit.model.entity.Post;
import com.yupi.springbootinit.model.vo.PostVO;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
/**
* 帖子服务
@ -57,4 +58,14 @@ public interface PostService extends IService<Post> {
* @return
*/
Page<PostVO> getPostVOPage(Page<Post> postPage, HttpServletRequest request);
/**
* 获取帖子封装列表
*
* @param postList
* @param request
* @return
*/
List<PostVO> getPostVOList(List<Post> postList, HttpServletRequest request);
}

View File

@ -68,6 +68,62 @@ public class PostServiceImpl extends ServiceImpl<PostMapper, Post> implements Po
@Resource
private ElasticsearchRestTemplate elasticsearchRestTemplate;
/**
* 获取帖子封装列表
*
* @param postList
* @param request
* @return
*/
@Override
public List<PostVO> getPostVOList(List<Post> postList, HttpServletRequest request) {
if (CollUtil.isEmpty(postList)) {
return new ArrayList<>();
}
// 1. 关联查询用户信息
Set<Long> userIdSet = postList.stream().map(Post::getUserId).collect(Collectors.toSet());
Map<Long, List<User>> userIdUserListMap = userService.listByIds(userIdSet).stream()
.collect(Collectors.groupingBy(User::getId));
// 2. 已登录获取用户点赞收藏状态
Map<Long, Boolean> postIdHasThumbMap = new HashMap<>();
Map<Long, Boolean> postIdHasFavourMap = new HashMap<>();
User loginUser = userService.getLoginUserPermitNull(request);
if (loginUser != null) {
Set<Long> postIdSet = postList.stream().map(Post::getId).collect(Collectors.toSet());
// 获取点赞
QueryWrapper<PostThumb> postThumbQueryWrapper = new QueryWrapper<>();
postThumbQueryWrapper.in("postId", postIdSet);
postThumbQueryWrapper.eq("userId", loginUser.getId());
List<PostThumb> postPostThumbList = postThumbMapper.selectList(postThumbQueryWrapper);
postPostThumbList.forEach(postPostThumb -> postIdHasThumbMap.put(postPostThumb.getPostId(), true));
// 获取收藏
QueryWrapper<PostFavour> postFavourQueryWrapper = new QueryWrapper<>();
postFavourQueryWrapper.in("postId", postIdSet);
postFavourQueryWrapper.eq("userId", loginUser.getId());
List<PostFavour> postFavourList = postFavourMapper.selectList(postFavourQueryWrapper);
postFavourList.forEach(postFavour -> postIdHasFavourMap.put(postFavour.getPostId(), true));
}
// 3. 填充信息
return postList.stream().map(post -> {
PostVO postVO = PostVO.objToVo(post);
Long userId = post.getUserId();
User user = null;
if (userIdUserListMap.containsKey(userId)) {
user = userIdUserListMap.get(userId).get(0);
}
postVO.setUser(userService.getUserVO(user));
postVO.setHasThumb(postIdHasThumbMap.getOrDefault(post.getId(), false));
postVO.setHasFavour(postIdHasFavourMap.getOrDefault(post.getId(), false));
return postVO;
}).collect(Collectors.toList());
}
@Override
public void validPost(Post post, boolean add) {
if (post == null) {

View File

@ -8,9 +8,9 @@ spring:
# todo 需替换配置
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/hebi
username: root
password: tianyinmiao
url: jdbc:mysql://110.40.62.21:3306/hebi
username: hebi
password: 123456
# Redis 配置
# todo 需替换配置
redis:

View File

@ -8,9 +8,9 @@ spring:
# todo 需替换配置
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/hebi
username: root
password: tianyinmiao
url: jdbc:mysql://110.40.62.21:3306/hebi
username: hebi
password: 123456
# Redis 配置
# todo 需替换配置
redis:

View File

@ -21,9 +21,9 @@ spring:
# todo 需替换配置
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/hebi
username: root
password: tianyinmiao
url: jdbc:mysql://110.40.62.21:3306/hebi
username: hebi
password: 123456
# Redis 配置
# todo 需替换配置,然后取消注释
redis:

View File

@ -23,3 +23,4 @@
userId,createTime,updateTime,isDelete
</sql>
</mapper>
<!--图表-->

View File

@ -27,3 +27,4 @@
on p.id = pf.postId ${ew.customSqlSegment}
</select>
</mapper>
<!--点赞-->

View File

@ -31,3 +31,4 @@
where updateTime >= #{minUpdateTime}
</select>
</mapper>
<!--帖子-->

BIN
src/test/.DS_Store vendored Normal file

Binary file not shown.