feat(search): 增加笔记发布时间范围筛选功能
- 在 DateConstants 中新增 MM-dd 和 HH:mm 时间格式常量 - 在 DateUtils 中增加 localDateTime2String 和 formatRelativeTime 方法- 新增 NotePublishTimeRangeEnum 枚举类用于定义发布时间范围 - 在搜索服务中实现按发布时间范围筛选逻辑 - 修改 SearchNoteReqVO 添加 publishTimeRange 参数 - 修改 SearchNoteRspVO 将 updateTime 改为字符串类型并新增评论数和收藏数字段 - 更新搜索结果处理逻辑以支持新的时间格式化和数据展示
This commit is contained in:
@@ -0,0 +1,37 @@
|
||||
package com.hanserwei.hannote.search.enums;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
@Getter
|
||||
@AllArgsConstructor
|
||||
public enum NotePublishTimeRangeEnum {
|
||||
|
||||
// 一天内
|
||||
DAY(0),
|
||||
// 一周内
|
||||
WEEK(1),
|
||||
// 半年内
|
||||
HALF_YEAR(2),
|
||||
;
|
||||
|
||||
private final Integer code;
|
||||
|
||||
/**
|
||||
* 根据类型 code 获取对应的枚举
|
||||
*
|
||||
* @param code 类型 code
|
||||
* @return 枚举
|
||||
*/
|
||||
public static NotePublishTimeRangeEnum valueOf(Integer code) {
|
||||
for (NotePublishTimeRangeEnum notePublishTimeRangeEnum : NotePublishTimeRangeEnum.values()) {
|
||||
if (Objects.equals(code, notePublishTimeRangeEnum.getCode())) {
|
||||
return notePublishTimeRangeEnum;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -29,4 +29,9 @@ public class SearchNoteReqVO {
|
||||
*/
|
||||
private Integer sort;
|
||||
|
||||
/**
|
||||
* 发布时间范围:null:不限 / 0:一天内 / 1:一周内 / 2:半年内
|
||||
*/
|
||||
private Integer publishTimeRange;
|
||||
|
||||
}
|
||||
@@ -7,8 +7,6 @@ import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
@Data
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
@@ -51,7 +49,7 @@ public class SearchNoteRspVO {
|
||||
* 最后一次编辑时间
|
||||
*/
|
||||
@JsonAlias("update_time")
|
||||
private LocalDateTime updateTime;
|
||||
private String updateTime;
|
||||
|
||||
/**
|
||||
* 被点赞总数
|
||||
@@ -59,4 +57,14 @@ public class SearchNoteRspVO {
|
||||
@JsonAlias("like_total")
|
||||
private String likeTotal;
|
||||
|
||||
/**
|
||||
* 被评论数
|
||||
*/
|
||||
private String commentTotal;
|
||||
|
||||
/**
|
||||
* 被收藏数
|
||||
*/
|
||||
private String collectTotal;
|
||||
|
||||
}
|
||||
@@ -11,8 +11,11 @@ import co.elastic.clients.elasticsearch.core.search.Highlight;
|
||||
import co.elastic.clients.elasticsearch.core.search.HighlightField;
|
||||
import co.elastic.clients.elasticsearch.core.search.Hit;
|
||||
import co.elastic.clients.util.NamedValue;
|
||||
import com.hanserwei.framework.common.constant.DateConstants;
|
||||
import com.hanserwei.framework.common.response.PageResponse;
|
||||
import com.hanserwei.framework.common.utils.DateUtils;
|
||||
import com.hanserwei.framework.common.utils.NumberUtils;
|
||||
import com.hanserwei.hannote.search.enums.NotePublishTimeRangeEnum;
|
||||
import com.hanserwei.hannote.search.enums.NoteSortTypeEnum;
|
||||
import com.hanserwei.hannote.search.index.NoteIndex;
|
||||
import com.hanserwei.hannote.search.model.vo.SearchNoteReqVO;
|
||||
@@ -20,6 +23,7 @@ import com.hanserwei.hannote.search.model.vo.SearchNoteRspVO;
|
||||
import com.hanserwei.hannote.search.service.NoteService;
|
||||
import jakarta.annotation.Resource;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.io.IOException;
|
||||
@@ -46,6 +50,8 @@ public class NoteServiceImpl implements NoteService {
|
||||
Integer type = searchNoteReqVO.getType();
|
||||
// 排序方式
|
||||
Integer sort = searchNoteReqVO.getSort();
|
||||
// 发布时间范围
|
||||
Integer publishTimeRange = searchNoteReqVO.getPublishTimeRange();
|
||||
|
||||
// --- 2. 分页参数 ---
|
||||
int pageSize = 10;
|
||||
@@ -93,6 +99,31 @@ public class NoteServiceImpl implements NoteService {
|
||||
)
|
||||
);
|
||||
}
|
||||
// 按发布时间范围过滤
|
||||
NotePublishTimeRangeEnum notePublishTimeRangeEnum = NotePublishTimeRangeEnum.valueOf(publishTimeRange);
|
||||
|
||||
if (Objects.nonNull(notePublishTimeRangeEnum)) {
|
||||
// 结束时间
|
||||
String endTime = LocalDateTime.now().format(DateConstants.DATE_FORMAT_Y_M_D_H_M_S);
|
||||
// 开始时间
|
||||
String startTime = null;
|
||||
switch (notePublishTimeRangeEnum) {
|
||||
case DAY -> startTime = DateUtils.localDateTime2String(LocalDateTime.now().minusDays(1)); // 一天之前的时间
|
||||
case WEEK -> startTime = DateUtils.localDateTime2String(LocalDateTime.now().minusWeeks(1)); // 一周之前的时间
|
||||
case HALF_YEAR ->
|
||||
startTime = DateUtils.localDateTime2String(LocalDateTime.now().minusMonths(6)); // 半年之前的时间
|
||||
}
|
||||
// 设置时间范围
|
||||
if (StringUtils.isNoneBlank(startTime)) {
|
||||
String finalStartTime = startTime;
|
||||
boolQueryBuilder.filter(f -> f.range(r -> r
|
||||
.term(t -> t.field(NoteIndex.FIELD_NOTE_CREATE_TIME)
|
||||
.gte(finalStartTime)
|
||||
.lte(endTime)))
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
BoolQuery boolQuery = boolQueryBuilder.build();
|
||||
// --- 4. 构建排序 (Sort) 和 FunctionScore ---
|
||||
Query finalQuery;
|
||||
@@ -238,8 +269,10 @@ public class NoteServiceImpl implements NoteService {
|
||||
String highlightTitle = source.getHighlightTitle();
|
||||
String avatar = source.getAvatar();
|
||||
String nickname = source.getNickname();
|
||||
LocalDateTime updateTime = source.getUpdateTime();
|
||||
String updateTime = source.getUpdateTime();
|
||||
String likeTotal = source.getLikeTotal();
|
||||
String collectTotal = source.getCollectTotal();
|
||||
String commentTotal = source.getCommentTotal();
|
||||
searchNoteRspVOS.add(SearchNoteRspVO.builder()
|
||||
.noteId(noteId)
|
||||
.cover(cover)
|
||||
@@ -247,9 +280,11 @@ public class NoteServiceImpl implements NoteService {
|
||||
.highlightTitle(highlightTitle)
|
||||
.avatar(avatar)
|
||||
.nickname(nickname)
|
||||
.updateTime(updateTime)
|
||||
.updateTime(DateUtils.formatRelativeTime(LocalDateTime.parse(updateTime, DateConstants.DATE_FORMAT_Y_M_D_H_M_S)))
|
||||
.highlightTitle(highlightedTitle)
|
||||
.likeTotal(likeTotal == null ? "0" : NumberUtils.formatNumberString(Long.parseLong(likeTotal)))
|
||||
.collectTotal(collectTotal == null ? "0" : NumberUtils.formatNumberString(Long.parseLong(collectTotal)))
|
||||
.collectTotal(commentTotal == null ? "0" : NumberUtils.formatNumberString(Long.parseLong(commentTotal)))
|
||||
.build());
|
||||
|
||||
}
|
||||
|
||||
@@ -23,4 +23,15 @@ public interface DateConstants {
|
||||
* DateTimeFormatter:年-月
|
||||
*/
|
||||
DateTimeFormatter DATE_FORMAT_Y_M = DateTimeFormatter.ofPattern("yyyy-MM");
|
||||
|
||||
/**
|
||||
* DateTimeFormatter:月-日
|
||||
*/
|
||||
DateTimeFormatter DATE_FORMAT_M_D = DateTimeFormatter.ofPattern("MM-dd");
|
||||
|
||||
|
||||
/**
|
||||
* DateTimeFormatter:时:分
|
||||
*/
|
||||
DateTimeFormatter DATE_FORMAT_H_M = DateTimeFormatter.ofPattern("HH:mm");
|
||||
}
|
||||
|
||||
@@ -1,7 +1,10 @@
|
||||
package com.hanserwei.framework.common.utils;
|
||||
|
||||
import com.hanserwei.framework.common.constant.DateConstants;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.ZoneOffset;
|
||||
import java.time.temporal.ChronoUnit;
|
||||
|
||||
public class DateUtils {
|
||||
|
||||
@@ -14,4 +17,63 @@ public class DateUtils {
|
||||
public static long localDateTime2Timestamp(LocalDateTime localDateTime) {
|
||||
return localDateTime.toInstant(ZoneOffset.UTC).toEpochMilli();
|
||||
}
|
||||
|
||||
/**
|
||||
* LocalDateTime 转 String 字符串
|
||||
*
|
||||
* @param time LocalDateTime
|
||||
* @return String
|
||||
*/
|
||||
public static String localDateTime2String(LocalDateTime time) {
|
||||
return time.format(DateConstants.DATE_FORMAT_Y_M_D_H_M_S);
|
||||
}
|
||||
|
||||
/**
|
||||
* LocalDateTime 转友好的相对时间字符串
|
||||
*
|
||||
* @param dateTime LocalDateTime
|
||||
* @return String友好的相对时间字符串
|
||||
*/
|
||||
public static String formatRelativeTime(LocalDateTime dateTime) {
|
||||
// 当前时间
|
||||
LocalDateTime now = LocalDateTime.now();
|
||||
|
||||
// 计算与当前时间的差距
|
||||
long daysDiff = ChronoUnit.DAYS.between(dateTime, now);
|
||||
long hoursDiff = ChronoUnit.HOURS.between(dateTime, now);
|
||||
long minutesDiff = ChronoUnit.MINUTES.between(dateTime, now);
|
||||
|
||||
if (daysDiff < 1) { // 如果是今天
|
||||
if (hoursDiff < 1) { // 如果是几分钟前
|
||||
return minutesDiff + "分钟前";
|
||||
} else { // 如果是几小时前
|
||||
return hoursDiff + "小时前";
|
||||
}
|
||||
} else if (daysDiff == 1) { // 如果是昨天
|
||||
return "昨天 " + dateTime.format(DateConstants.DATE_FORMAT_H_M);
|
||||
} else if (daysDiff < 7) { // 如果是最近一周
|
||||
return daysDiff + "天前";
|
||||
} else if (dateTime.getYear() == now.getYear()) { // 如果是今年
|
||||
return dateTime.format(DateConstants.DATE_FORMAT_M_D);
|
||||
} else { // 如果是去年或更早
|
||||
return dateTime.format(DateConstants.DATE_FORMAT_Y_M_D);
|
||||
}
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
// 测试示例
|
||||
LocalDateTime dateTime1 = LocalDateTime.now().minusMinutes(10); // 10分钟前
|
||||
LocalDateTime dateTime2 = LocalDateTime.now().minusHours(3); // 3小时前
|
||||
LocalDateTime dateTime3 = LocalDateTime.now().minusDays(1).minusHours(5); // 昨天 20:12
|
||||
LocalDateTime dateTime4 = LocalDateTime.now().minusDays(2); // 2天前
|
||||
LocalDateTime dateTime5 = LocalDateTime.now().minusDays(10); // 11-06
|
||||
LocalDateTime dateTime6 = LocalDateTime.of(2023, 12, 1, 12, 30, 0); // 2023-12-01
|
||||
|
||||
System.out.println(formatRelativeTime(dateTime1)); // 输出 "10分钟前"
|
||||
System.out.println(formatRelativeTime(dateTime2)); // 输出 "3小时前"
|
||||
System.out.println(formatRelativeTime(dateTime3)); // 输出 "昨天 20:12"
|
||||
System.out.println(formatRelativeTime(dateTime4)); // 输出 "2天前"
|
||||
System.out.println(formatRelativeTime(dateTime5)); // 输出 "11-06"
|
||||
System.out.println(formatRelativeTime(dateTime6)); // 输出 "2023-12-01"
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user