From eebb35097086ff414788ea02d25352a40c6ab6cc Mon Sep 17 00:00:00 2001 From: sunflower2014 Date: Thu, 26 Jun 2025 17:46:44 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B5=84=E8=AE=AF=E7=B2=BE=E9=80=89=E6=90=9C?= =?UTF-8?q?=E7=B4=A2=E8=B0=83=E6=95=B4=E4=BB=A5=E5=8F=8A=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E6=8A=A5=E9=81=93=E6=97=B6=E9=97=B4=E3=80=81=E5=AA=92=E4=BD=93?= =?UTF-8?q?=E6=9D=A5=E6=BA=90=E7=AD=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/controller/NewsController.java | 10 ++- .../admin/controller/NewsInfoController.java | 4 +- admin/src/main/resources/sql/20250623.sql | 8 +++ .../reference/core/mapper/NewsMapper.java | 53 ++++++++++---- .../reference/core/mapper/TagMapper.java | 3 +- .../reference/core/model/entity/NewsInfo.java | 2 +- .../core/model/vo/news/NewsDetailVO.java | 13 ++++ .../model/vo/newsinfo/NewsInfoDetailVO.java | 1 + .../core/model/vo/newsinfo/NewsInfoVO.java | 2 +- .../core/service/NewsInfoService.java | 70 ++++++++----------- .../reference/core/service/NewsService.java | 28 ++++++-- 11 files changed, 129 insertions(+), 65 deletions(-) create mode 100644 admin/src/main/resources/sql/20250623.sql diff --git a/admin/src/main/java/com/jinrui/reference/admin/controller/NewsController.java b/admin/src/main/java/com/jinrui/reference/admin/controller/NewsController.java index c6e9c3b..c4d7d17 100644 --- a/admin/src/main/java/com/jinrui/reference/admin/controller/NewsController.java +++ b/admin/src/main/java/com/jinrui/reference/admin/controller/NewsController.java @@ -1,7 +1,10 @@ package com.jinrui.reference.admin.controller; +import java.util.Date; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.format.annotation.DateTimeFormat; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; @@ -203,7 +206,10 @@ public class NewsController { @RequestParam(value = "size", required = false, defaultValue = "10") int size, @RequestParam(value = "last", required = false) Integer last, @RequestParam(value = "current", required = false) Integer current, - @RequestParam(value = "orderBy", required = false, defaultValue = "id$asc") String orderBy + @RequestParam(value = "orderBy", required = false, defaultValue = "id$asc") String orderBy, + @RequestParam(value = "mediaId", required = false) Long mediaId, + @RequestParam(value = "dateline_from", required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") Date datelineFrom, + @RequestParam(value = "dateline_to", required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") Date datelineTo ) { if (!StringUtils.hasText(token)) { return PageObject.failedPage("登陆Token为空!"); @@ -228,7 +234,7 @@ public class NewsController { log.error("解析登陆Token出错!", e); return PageObject.failedPage(500, "服务端错误,请联系系统管理员!"); } - return newsService.queryNews(keyword, columnList, status, page, size, last, current, orderBy, minScore, maxScore, tag, industry); + return newsService.queryNews(keyword, columnList, status, page, size, last, current, orderBy, minScore, maxScore, tag, industry, mediaId, datelineFrom, datelineTo); } @GetMapping("/score") diff --git a/admin/src/main/java/com/jinrui/reference/admin/controller/NewsInfoController.java b/admin/src/main/java/com/jinrui/reference/admin/controller/NewsInfoController.java index 459a089..585e0d0 100644 --- a/admin/src/main/java/com/jinrui/reference/admin/controller/NewsInfoController.java +++ b/admin/src/main/java/com/jinrui/reference/admin/controller/NewsInfoController.java @@ -159,15 +159,15 @@ public class NewsInfoController { @GetMapping public PageObject queryNewsInfo(@RequestHeader("auth-token") String token, + @RequestHeader(value = "x-pagination-cursor", required = false) String last, @RequestParam(value = "title", required = false) String title, @RequestParam(value = "content", required = false) String content, @RequestParam(value = "stockcode", required = false) String stockcode, @RequestParam(value = "sourcename", required = false) Long sourcename, @RequestParam(value = "page", required = false, defaultValue = "1") int page, @RequestParam(value = "size", required = false, defaultValue = "10") int size, - @RequestParam(value = "last", required = false) Integer last, @RequestParam(value = "current", required = false) Integer current, - @RequestParam(value = "orderBy", required = false, defaultValue = "createTime") String orderBy, + @RequestParam(value = "orderBy", required = false, defaultValue = "inputDate") String orderBy, @RequestParam(value = "direction", required = false, defaultValue = "asc") String direction ) { if (!StringUtils.hasText(token)) { diff --git a/admin/src/main/resources/sql/20250623.sql b/admin/src/main/resources/sql/20250623.sql new file mode 100644 index 0000000..473eb03 --- /dev/null +++ b/admin/src/main/resources/sql/20250623.sql @@ -0,0 +1,8 @@ +update tag set parent_id = 0 where parent_id is null; +ALTER TABLE `reference`.`tag` +ADD UNIQUE INDEX `IDX_NAME` (`parent_id` ASC, `name` ASC); + +ALTER TABLE `reference`.`news` +CHANGE COLUMN `publish_time` `publish_time` DATETIME NULL DEFAULT NULL COMMENT '报道时间' , +CHANGE COLUMN `update_time` `update_time` DATETIME NOT NULL COMMENT '发布和修改时间' ; + diff --git a/core/src/main/java/com/jinrui/reference/core/mapper/NewsMapper.java b/core/src/main/java/com/jinrui/reference/core/mapper/NewsMapper.java index 24437ae..f8d31a3 100644 --- a/core/src/main/java/com/jinrui/reference/core/mapper/NewsMapper.java +++ b/core/src/main/java/com/jinrui/reference/core/mapper/NewsMapper.java @@ -1,7 +1,8 @@ package com.jinrui.reference.core.mapper; -import com.jinrui.reference.core.model.entity.News; -import com.jinrui.reference.core.model.entity.NewsDraft; +import java.util.Date; +import java.util.List; + import org.apache.ibatis.annotations.Delete; import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.Options; @@ -9,7 +10,8 @@ import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; import org.apache.ibatis.annotations.Update; -import java.util.List; +import com.jinrui.reference.core.model.entity.News; +import com.jinrui.reference.core.model.entity.NewsDraft; public interface NewsMapper { @@ -31,10 +33,10 @@ public interface NewsMapper { "from news where id = #{id}") News getNewsDetail(@Param("id") Long id); - @Update("update news set status = 1 where id = #{id}") + @Update("update news set status = 1, update_time = now() where id = #{id}") void simpleUnpublish(@Param("id") long id); - @Update("update news set status = 2, publish_time = now(), editor_id = #{editorId} where id = #{id}") + @Update("update news set status = 2, update_time = now(), editor_id = #{editorId} where id = #{id}") void simplePublish(@Param("id") long id, @Param("editorId") long editorId); @Update("update news " + @@ -60,8 +62,7 @@ public interface NewsMapper { "content = #{content}," + "content_text = #{contentText}," + "status = #{status}," + - "update_time = now()," + - "publish_time = now() " + + "update_time = now()" + "where id = #{id}") void publishNews(News news); @@ -117,8 +118,17 @@ public interface NewsMapper { "" + " and 1 = 2 " + "" + - "" + - " and news.title like concat('%', #{keyword}, '%') " + + "" + + " and " + + "\n" + + " (news.title like concat('%', #{keyword}, '%') or news.content like concat('%', #{keyword}, '%')) " + + "" + + "" + + "" + + " and news.publish_time >= #{datelineFrom} " + + "" + + "" + + " and news.publish_time < date_add(#{datelineTo}, INTERVAL 1 DAY) " + "" + "" + "and news_column_rel.column_id in (${column}) " + @@ -141,7 +151,7 @@ public interface NewsMapper { "" + "limit ${limit} offset ${offset}" + "") - List queryNews(@Param("keyword") String keyword, + List queryNews(@Param("keywords") List keywords, @Param("minScore") Double minScore, @Param("maxScore") Double maxScore, @Param("column") String columnList, @@ -151,7 +161,9 @@ public interface NewsMapper { @Param("limit") int limit, @Param("offset") int offset, @Param("tags") List tags, - @Param("industries") List industries); + @Param("industries") List industries, + @Param("datelineFrom") Date datelineFrom, + @Param("datelineTo") Date datelineTo); @Select("") - int queryTotal(@Param("keyword") String keyword, + int queryTotal(@Param("keywords") List keywords, @Param("minScore") Double minScore, @Param("maxScore") Double maxScore, @Param("column") String columnParam, @Param("status") Integer status, @Param("tags") List tags, - @Param("industries") List industries); + @Param("industries") List industries, + @Param("datelineFrom") Date datelineFrom, + @Param("datelineTo") Date datelineTo); @Select("select id, title, summary, picture, content, status, " + "create_time as createTime, " + diff --git a/core/src/main/java/com/jinrui/reference/core/mapper/TagMapper.java b/core/src/main/java/com/jinrui/reference/core/mapper/TagMapper.java index 7a8608e..2553538 100644 --- a/core/src/main/java/com/jinrui/reference/core/mapper/TagMapper.java +++ b/core/src/main/java/com/jinrui/reference/core/mapper/TagMapper.java @@ -66,7 +66,8 @@ public interface TagMapper { // void saveTag(@Param("parentId") Long parentId, @Param("name") String name); @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id") - @Insert("insert into tag(parent_id, parent_name, name, level, create_time, update_time) values (#{parentId},#{parentName}, #{name},#{level}, now(), now())") + @Insert("insert into tag(parent_id, parent_name, name, level, create_time, update_time) values (#{parentId},#{parentName}, #{name},#{level}, now(), now()) " + + " on duplicate key update update_time = now()") void saveTag(Tag tag); @Insert("update tag set name=#{name}, update_time=now() where id=#{id}") diff --git a/core/src/main/java/com/jinrui/reference/core/model/entity/NewsInfo.java b/core/src/main/java/com/jinrui/reference/core/model/entity/NewsInfo.java index 0c46b22..19a9dc3 100644 --- a/core/src/main/java/com/jinrui/reference/core/model/entity/NewsInfo.java +++ b/core/src/main/java/com/jinrui/reference/core/model/entity/NewsInfo.java @@ -323,7 +323,7 @@ public class NewsInfo { news.setContent(this.getContent()); news.setStatus(this.getStatus()); news.setSummary(this.getSummary()); - news.setPublishTime(new Date()); + news.setPublishTime(this.getInputDate()); news.setType(1); news.setNewsinfoId(this.getId()); return news; diff --git a/core/src/main/java/com/jinrui/reference/core/model/vo/news/NewsDetailVO.java b/core/src/main/java/com/jinrui/reference/core/model/vo/news/NewsDetailVO.java index 81ce65e..ebcc6b8 100644 --- a/core/src/main/java/com/jinrui/reference/core/model/vo/news/NewsDetailVO.java +++ b/core/src/main/java/com/jinrui/reference/core/model/vo/news/NewsDetailVO.java @@ -1,5 +1,6 @@ package com.jinrui.reference.core.model.vo.news; +import java.util.Date; import java.util.List; import com.jinrui.reference.core.model.entity.News; @@ -23,6 +24,8 @@ public class NewsDetailVO { private List industry; private String content; + + private Date publishTime; public NewsDetailVO() { } @@ -33,6 +36,7 @@ public class NewsDetailVO { this.summary = news.getSummary(); this.picture = news.getPicture(); this.content = news.getContent(); + this.publishTime = news.getPublishTime(); } public NewsDetailVO(NewsDraft newsDraft) { @@ -105,4 +109,13 @@ public class NewsDetailVO { public void setIndustry(List industry) { this.industry = industry; } + + public Date getPublishTime() { + return publishTime; + } + + public void setPublishTime(Date publishTime) { + this.publishTime = publishTime; + } + } diff --git a/core/src/main/java/com/jinrui/reference/core/model/vo/newsinfo/NewsInfoDetailVO.java b/core/src/main/java/com/jinrui/reference/core/model/vo/newsinfo/NewsInfoDetailVO.java index 5d91661..3dc0db8 100644 --- a/core/src/main/java/com/jinrui/reference/core/model/vo/newsinfo/NewsInfoDetailVO.java +++ b/core/src/main/java/com/jinrui/reference/core/model/vo/newsinfo/NewsInfoDetailVO.java @@ -98,6 +98,7 @@ public class NewsInfoDetailVO { this.publishTime = newsInfo.getPublishTime(); this.createTime = newsInfo.getCreateTime(); this.updateTime = newsInfo.getUpdateTime(); + this.inputDate = newsInfo.getInputDate(); } public String getId() { diff --git a/core/src/main/java/com/jinrui/reference/core/model/vo/newsinfo/NewsInfoVO.java b/core/src/main/java/com/jinrui/reference/core/model/vo/newsinfo/NewsInfoVO.java index d4902ce..aef422f 100644 --- a/core/src/main/java/com/jinrui/reference/core/model/vo/newsinfo/NewsInfoVO.java +++ b/core/src/main/java/com/jinrui/reference/core/model/vo/newsinfo/NewsInfoVO.java @@ -74,7 +74,6 @@ public class NewsInfoVO { * 编辑ID - 最后一个点击发布的人的ID */ private Long editorId; - public NewsInfoVO(NewsInfo newsInfo) { this.id = newsInfo.getId(); @@ -86,6 +85,7 @@ public class NewsInfoVO { this.publishTime = newsInfo.getPublishTime(); this.createTime = newsInfo.getCreateTime(); this.updateTime = newsInfo.getUpdateTime(); + this.inputDate = newsInfo.getInputDate(); } public String getId() { diff --git a/core/src/main/java/com/jinrui/reference/core/service/NewsInfoService.java b/core/src/main/java/com/jinrui/reference/core/service/NewsInfoService.java index 1ff6169..b3ee813 100644 --- a/core/src/main/java/com/jinrui/reference/core/service/NewsInfoService.java +++ b/core/src/main/java/com/jinrui/reference/core/service/NewsInfoService.java @@ -49,9 +49,12 @@ import co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders; import co.elastic.clients.elasticsearch._types.query_dsl.TermQuery; import co.elastic.clients.elasticsearch.core.GetResponse; import co.elastic.clients.elasticsearch.core.IndexResponse; +import co.elastic.clients.elasticsearch.core.SearchRequest; import co.elastic.clients.elasticsearch.core.SearchResponse; import co.elastic.clients.elasticsearch.core.search.Hit; import co.elastic.clients.elasticsearch.core.search.HitsMetadata; +import co.elastic.clients.json.JsonpUtils; +import co.elastic.clients.json.jackson.JacksonJsonpMapper; @Service public class NewsInfoService { @@ -159,7 +162,7 @@ public class NewsInfoService { List conceptLabels = newsTags.getConceptLabel(); if (!ObjectUtils.isEmpty(conceptLabels)) { - List tags = tagMapper.queryAll().stream().filter(e -> !ObjectUtils.isEmpty(e.getParentName())).collect(Collectors.toList()); + List tags = tagMapper.queryAll().stream().filter(e -> e.getParentId() >= 6L).collect(Collectors.toList()); for (String conceptLabel: conceptLabels) { boolean existed = false; for (Tag tag:tags) { @@ -196,13 +199,6 @@ public class NewsInfoService { return levelOneTag.getId(); } - public static void main(String[] args) { - String a = "对外开放-出海50"; - String[] tags = a.split("-"); - System.out.println(tags[0]); - System.out.println(tags[1]); - } - public ResultObject detail(String id) { try { @@ -493,7 +489,7 @@ public class NewsInfoService { } public PageObject queryNewsInfo(String title, String content, String stockcode, Long sourcename, int page, int size, - Integer last, Integer current, String orderBy, String direction) { + String last, Integer current, String orderBy, String direction) { if (StringUtils.hasText(orderBy)) { switch (orderBy) { @@ -509,6 +505,10 @@ public class NewsInfoService { orderBy = "create_time"; break; } + case "inputDate": { + orderBy = "input_date"; + break; + } } } @@ -519,11 +519,9 @@ public class NewsInfoService { } int from = offset; long total = 0; - List newsInfoList = new ArrayList<>(); - + List newsInfoList = new ArrayList<>(); try { Query deletedQuery = TermQuery.of(t -> t.field(NewsInfo.DELETED_ES_NAME).value(0L))._toQuery(); -// BoolQuery boolQuery = BoolQuery.of(e -> e.filter(deletedQuery)); // QueryBuilders.bool().build() List conditions = new ArrayList<>(); List filters = new ArrayList<>(); @@ -550,30 +548,36 @@ public class NewsInfoService { } Query resultQuery = new Query.Builder().bool(b -> b.must(conditions).filter(filters)).build(); SortOrder sortOrder = (Objects.equals(direction, SortOrder.Asc.jsonValue()) ?SortOrder.Asc:SortOrder.Desc); - SearchResponse searchResp = elasticsearchClient.search(s -> s.index(NewsInfo.INDEX_NAME) - .from(from) // 分页参数 - .size(size) // 分页参数 - .sort(so -> so.field(f -> f.field("_score").order(SortOrder.Desc).field(orderByField).order(sortOrder))) // 排序字段 - .query(resultQuery) - .highlight(h -> h.preTags("") - .postTags("") - .requireFieldMatch(true) - .fields(NewsInfo.SUMMARY_ES_NAME, hf -> hf.numberOfFragments(0)) - .fields(NewsInfo.CONTENT_ES_NAME, hf -> hf.numberOfFragments(0)) - .fields(NewsInfo.TITLE_ES_NAME, hf -> hf.numberOfFragments(0))), NewsInfo.class); + + SearchRequest request = SearchRequest.of(s -> + s.from(from) + .size(size) // 分页参数 + .trackTotalHits(e -> e.enabled(true)) + .sort(so -> so.field(f -> f.field(orderByField).order(sortOrder))) // 排序字段 + .query(resultQuery).trackScores(true) + .highlight(h -> h.preTags("") + .postTags("") + .requireFieldMatch(true) + .fields(NewsInfo.SUMMARY_ES_NAME, hf -> hf.numberOfFragments(0)) + .fields(NewsInfo.CONTENT_ES_NAME, hf -> hf.numberOfFragments(0)) + .fields(NewsInfo.TITLE_ES_NAME, hf -> hf.numberOfFragments(0))) + ); + + SearchResponse searchResp = elasticsearchClient.search(request, NewsInfo.class); HitsMetadata hits = searchResp.hits(); total = hits.total().value(); + // 当resultSize小于页面size参数的时候关闭pitId for (Hit hit: hits.hits()) { NewsInfo newsInfo = hit.source(); Map> highlight = hit.highlight(); - newsInfo.setTitle(highlight.get(NewsInfo.TITLE_ES_NAME) == null ? newsInfo.getTitle():highlight.get(NewsInfo.TITLE_ES_NAME).get(0)); newsInfo.setSummary(highlight.get(NewsInfo.SUMMARY_ES_NAME) == null ? newsInfo.getSummary():highlight.get(NewsInfo.SUMMARY_ES_NAME).get(0)); newsInfo.setContent(highlight.get(NewsInfo.CONTENT_ES_NAME) == null ? newsInfo.getContent():highlight.get(NewsInfo.CONTENT_ES_NAME).get(0)); - newsInfo.setId(hit.id()); - newsInfoList.add(newsInfo); + + NewsInfoVO newsInfoVO = new NewsInfoVO(newsInfo); + newsInfoList.add(newsInfoVO); } } catch (Exception e) { log.error("搜索新闻异常!", e); @@ -585,19 +589,7 @@ public class NewsInfoService { pageObject.setCode(200); pageObject.setCurrent(page); pageObject.setSize(Math.min(newsInfoList.size(), size)); - if (CollectionUtils.isEmpty(newsInfoList)) { - log.info("搜索结果为空!"); - pageObject.setData(new ArrayList<>()); - return pageObject; - } - - List resultList = new ArrayList<>(); - for (NewsInfo newsInfo : newsInfoList) { - NewsInfoVO newsInfoVO = new NewsInfoVO(newsInfo); - resultList.add(newsInfoVO); - } - - pageObject.setData(resultList); + pageObject.setData(newsInfoList); return pageObject; } } diff --git a/core/src/main/java/com/jinrui/reference/core/service/NewsService.java b/core/src/main/java/com/jinrui/reference/core/service/NewsService.java index 4d812c5..c1645b4 100644 --- a/core/src/main/java/com/jinrui/reference/core/service/NewsService.java +++ b/core/src/main/java/com/jinrui/reference/core/service/NewsService.java @@ -4,6 +4,7 @@ import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.util.ArrayList; +import java.util.Arrays; import java.util.Date; import java.util.HashMap; import java.util.HashSet; @@ -21,6 +22,7 @@ import org.springframework.util.CollectionUtils; import org.springframework.util.ObjectUtils; import org.springframework.util.StringUtils; +import com.aliyun.oss.common.utils.DateUtil; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; @@ -774,8 +776,9 @@ public class NewsService { } public PageObject queryNews(String keyword, String columnParam, Integer status, int page, int size, - Integer last, Integer current, String orderBy, Double minScore, Double maxScore, - String tag, String industry) { + Integer last, Integer current, String orderBy, Double minScore, Double maxScore, + String tag, String industry, Long mediaId, + Date datelineFrom, Date datelineTo) { String orderByClause = null; if (StringUtils.hasText(orderBy)) { String orderByStr = orderBy; @@ -813,6 +816,12 @@ public class NewsService { } List tags = this.getMatchTags(tag); + if (mediaId != null) { + if (ObjectUtils.isEmpty(tags)) { + tags = new ArrayList<>(); + } + tags.add(mediaId); + } List industries = null; if (!ObjectUtils.isEmpty(industry)) { try { @@ -824,10 +833,15 @@ public class NewsService { return PageObject.failedPage(500, "服务器错误,请联系系统管理员!"); } } + + List keywords = new ArrayList<>(); + if (StringUtils.hasText(keyword)) { + keywords.addAll(Arrays.asList(keyword.trim().split("\\s+"))); + } List newsList; try { - newsList = newsMapper.queryNews(keyword, minScore, maxScore, columnParam, status, last, orderByClause, size, offset, tags, industries); + newsList = newsMapper.queryNews(keywords, minScore, maxScore, columnParam, status, last, orderByClause, size, offset, tags, industries, datelineFrom, datelineTo); } catch (Exception e) { log.error("搜索新闻异常!", e); return PageObject.failedPage(500, "服务器错误,请联系系统管理员!"); @@ -836,7 +850,7 @@ public class NewsService { PageObject pageObject = new PageObject<>(); if (page == 1) { try { - int total = newsMapper.queryTotal(keyword,minScore, maxScore, columnParam, status, tags, industries); + int total = newsMapper.queryTotal(keywords,minScore, maxScore, columnParam, status, tags, industries, datelineFrom, datelineTo); pageObject.setTotal(total); } catch (Exception e) { log.error("获取新闻总数异常!", e); @@ -942,4 +956,10 @@ public class NewsService { return result; } + public static void main(String[] args) { + String keyword = "中国 美国 俄罗斯"; + keyword = keyword.replaceAll("\\s+", "%"); + System.out.println(keyword); + } + }