当前位置:   article > 正文

《黑马头条》 ElectricSearch 分词器 联想词 MangoDB day08-平台管理[实战]作业

《黑马头条》 ElectricSearch 分词器 联想词 MangoDB day08-平台管理[实战]作业

07 app端文章搜索

1) 今日内容介绍

1.1)App端搜索-效果图

1.2)今日内容

2) 搭建ElasticSearch环境

2.1) 拉取镜像

docker pull elasticsearch:7.4.0

2.2) 创建容器

docker run -id --name elasticsearch -d --restart=always -p 9200:9200 -p 9300:9300 -v /usr/share/elasticsearch/plugins:/usr/share/elasticsearch/plugins -e "discovery.type=single-node" elasticsearch:7.4.0

2.3) 配置中文分词器 ik

因为在创建elasticsearch容器的时候,映射了目录,所以可以在宿主机上进行配置ik中文分词器

在去选择ik分词器的时候,需要与elasticsearch的版本好对应上

把资料中的elasticsearch-analysis-ik-7.4.0.zip上传到服务器上,放到对应目录(plugins)解压

  1. #切换目录
  2. cd /usr/share/elasticsearch/plugins
  3. #新建目录
  4. mkdir analysis-ik
  5. cd analysis-ik
  6. #root根目录中拷贝文件
  7. mv elasticsearch-analysis-ik-7.4.0.zip /usr/share/elasticsearch/plugins/analysis-ik
  8. #解压文件
  9. cd /usr/share/elasticsearch/plugins/analysis-ik
  10. unzip elasticsearch-analysis-ik-7.4.0.zip

2.4) 使用postman测试

  1. 192.168.200.130:9200/_analyze
  2. {
  3. "analyzer":"ik_max_word",
  4. "text":"欢迎来到黑马程序员学习"
  5. }

3) app端文章搜索

3.1) 需求分析

  • 用户输入关键可搜索文章列表

  • 关键词高亮显示

  • 文章列表展示与home展示一样,当用户点击某一篇文章,可查看文章详情

3.2) 思路分析

为了加快检索的效率,在查询的时候不会直接从数据库中查询文章,需要在elasticsearch中进行高速检索。

3.3) 创建索引和映射

使用postman添加映射

put请求 : http://192.168.200.130:9200/app_info_article

  1. {
  2. "mappings":{
  3. "properties":{
  4. "id":{
  5. "type":"long"
  6. },
  7. "publishTime":{
  8. "type":"date"
  9. },
  10. "layout":{
  11. "type":"integer"
  12. },
  13. "images":{
  14. "type":"keyword",
  15. "index": false
  16. },
  17. "staticUrl":{
  18. "type":"keyword",
  19. "index": false
  20. },
  21. "authorId": {
  22. "type": "long"
  23. },
  24. "authorName": {
  25. "type": "text"
  26. },
  27. "title":{
  28. "type":"text",
  29. "analyzer":"ik_smart"
  30. },
  31. "content":{
  32. "type":"text",
  33. "analyzer":"ik_smart"
  34. }
  35. }
  36. }
  37. }

GET请求查询映射:http://192.168.200.130:9200/app_info_article

DELETE请求,删除索引及映射:http://192.168.200.130:9200/app_info_article

GET请求,查询所有文档:http://192.168.200.130:9200/app_info_article/_search

3.4) 数据初始化到索引库

3.4.1)导入es-init到heima-leadnews-test工程下
3.4.1)查询所有的文章信息,批量导入到es索引库中
  1. package com.heima.es;
  2. import java.util.List;
  3. @SpringBootTest
  4. @RunWith(SpringRunner.class)
  5. public class ApArticleTest {
  6. @Autowired
  7. private ApArticleMapper apArticleMapper;
  8. @Autowired
  9. private RestHighLevelClient restHighLevelClient;
  10. /**
  11. * 注意:数据量的导入,如果数据量过大,需要分页导入
  12. * @throws Exception
  13. */
  14. @Test
  15. public void init() throws Exception {
  16. //1.查询所有符合条件的文章数据
  17. List<SearchArticleVo> searchArticleVos = apArticleMapper.loadArticleList();
  18. //2.批量导入到es索引库
  19. BulkRequest bulkRequest = new BulkRequest("app_info_article");
  20. for (SearchArticleVo searchArticleVo : searchArticleVos) {
  21. IndexRequest indexRequest = new IndexRequest().id(searchArticleVo.getId().toString())
  22. .source(JSON.toJSONString(searchArticleVo), XContentType.JSON);
  23. //批量添加数据
  24. bulkRequest.add(indexRequest);
  25. }
  26. restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
  27. }
  28. }
3.4.3)测试

postman查询所有的es中数据 GET请求: http://192.168.200.130:9200/app_info_article/_search

3.5) 文章搜索功能实现

3.5.1)搭建搜索微服务

(1)导入 heima-leadnews-search

(2)在heima-leadnews-service的pom中添加依赖

  1. <!--elasticsearch-->
  2. <dependency>
  3. <groupId>org.elasticsearch.client</groupId>
  4. <artifactId>elasticsearch-rest-high-level-client</artifactId>
  5. <version>7.4.0</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>org.elasticsearch.client</groupId>
  9. <artifactId>elasticsearch-rest-client</artifactId>
  10. <version>7.4.0</version>
  11. </dependency>
  12. <dependency>
  13. <groupId>org.elasticsearch</groupId>
  14. <artifactId>elasticsearch</artifactId>
  15. <version>7.4.0</version>
  16. </dependency>

(3)nacos配置中心leadnews-search

  1. spring:
  2. autoconfigure:
  3. exclude: org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
  4. elasticsearch:
  5. host: 192.168.200.130
  6. port: 9200
3.5.2) 搜索接口定义
  1. package com.heima.search.controller.v1;
  2. import java.io.IOException;
  3. @RestController
  4. @RequestMapping("/api/v1/article/search")
  5. public class ArticleSearchController {
  6. @PostMapping("/search")
  7. public ResponseResult search(@RequestBody UserSearchDto dto) throws IOException {
  8. return null;
  9. }
  10. }

UserSearchDto

  1. package com.heima.model.search.dtos;
  2. import lombok.Data;
  3. import java.util.Date;
  4. @Data
  5. public class UserSearchDto {
  6. /**
  7. * 搜索关键字
  8. */
  9. String searchWords;
  10. /**
  11. * 当前页
  12. */
  13. int pageNum;
  14. /**
  15. * 分页条数
  16. */
  17. int pageSize;
  18. /**
  19. * 最小时间
  20. */
  21. Date minBehotTime;
  22. public int getFromIndex(){
  23. if(this.pageNum<1)return 0;
  24. if(this.pageSize<1) this.pageSize = 10;
  25. return this.pageSize * (pageNum-1);
  26. }
  27. }
3.5.3) 业务层实现

创建业务层接口:ApArticleSearchService

  1. package com.heima.search.service;
  2. import java.io.IOException;
  3. public interface ArticleSearchService {
  4. /**
  5. ES文章分页搜索
  6. @return
  7. */
  8. ResponseResult search(UserSearchDto userSearchDto) throws IOException;
  9. }

实现类:

  1. package com.heima.search.service.impl;
  2. import java.util.Map;
  3. @Service
  4. @Slf4j
  5. public class ArticleSearchServiceImpl implements ArticleSearchService {
  6. @Autowired
  7. private RestHighLevelClient restHighLevelClient;
  8. /**
  9. * es文章分页检索
  10. *
  11. * @param dto
  12. * @return
  13. */
  14. @Override
  15. public ResponseResult search(UserSearchDto dto) throws IOException {
  16. //1.检查参数
  17. if(dto == null || StringUtils.isBlank(dto.getSearchWords())){
  18. return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
  19. }
  20. //2.设置查询条件
  21. SearchRequest searchRequest = new SearchRequest("app_info_article");
  22. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  23. //布尔查询
  24. BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
  25. //关键字的分词之后查询
  26. QueryStringQueryBuilder queryStringQueryBuilder = QueryBuilders.queryStringQuery(dto.getSearchWords()).field("title").field("content").defaultOperator(Operator.OR);
  27. boolQueryBuilder.must(queryStringQueryBuilder);
  28. //查询小于mindate的数据
  29. RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("publishTime").lt(dto.getMinBehotTime().getTime());
  30. boolQueryBuilder.filter(rangeQueryBuilder);
  31. //分页查询
  32. searchSourceBuilder.from(0);
  33. searchSourceBuilder.size(dto.getPageSize());
  34. //按照发布时间倒序查询
  35. searchSourceBuilder.sort("publishTime", SortOrder.DESC);
  36. //设置高亮 title
  37. HighlightBuilder highlightBuilder = new HighlightBuilder();
  38. highlightBuilder.field("title");
  39. highlightBuilder.preTags("<font style='color: red; font-size: inherit;'>");
  40. highlightBuilder.postTags("</font>");
  41. searchSourceBuilder.highlighter(highlightBuilder);
  42. searchSourceBuilder.query(boolQueryBuilder);
  43. searchRequest.source(searchSourceBuilder);
  44. SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
  45. //3.结果封装返回
  46. List<Map> list = new ArrayList<>();
  47. SearchHit[] hits = searchResponse.getHits().getHits();
  48. for (SearchHit hit : hits) {
  49. String json = hit.getSourceAsString();
  50. Map map = JSON.parseObject(json, Map.class);
  51. //处理高亮
  52. if(hit.getHighlightFields() != null && hit.getHighlightFields().size() > 0){
  53. Text[] titles = hit.getHighlightFields().get("title").getFragments();
  54. String title = StringUtils.join(titles);
  55. //高亮标题
  56. map.put("h_title",title);
  57. }else {
  58. //原始标题
  59. map.put("h_title",map.get("title"));
  60. }
  61. list.add(map);
  62. }
  63. return ResponseResult.okResult(list);
  64. }
  65. }
3.5.4) 控制层实现

新建控制器ArticleSearchController

  1. package com.heima.search.controller.v1;
  2. import java.io.IOException;
  3. @RestController
  4. @RequestMapping("/api/v1/article/search")
  5. public class ArticleSearchController {
  6. @Autowired
  7. private ArticleSearchService articleSearchService;
  8. @PostMapping("/search")
  9. public ResponseResult search(@RequestBody UserSearchDto dto) throws IOException {
  10. return articleSearchService.search(dto);
  11. }
  12. }
3.5.5) 测试

需要在app的网关中添加搜索微服务的路由配置

  1. #搜索微服务
  2. - id: leadnews-search
  3. uri: lb://leadnews-search
  4. predicates:
  5. - Path=/search/**
  6. filters:
  7. - StripPrefix= 1

启动项目进行测试,至少要启动文章微服务,用户微服务,搜索微服务,app网关微服务,app前端工程

3.6) 文章自动审核构建索引

3.6.1)思路分析
3.6.2)文章微服务发送消息

1.把SearchArticleVo放到model工程下

  1. package com.heima.model.search.vos;
  2. import lombok.Data;
  3. import java.util.Date;
  4. @Data
  5. public class SearchArticleVo {
  6. // 文章id
  7. private Long id;
  8. // 文章标题
  9. private String title;
  10. // 文章发布时间
  11. private Date publishTime;
  12. // 文章布局
  13. private Integer layout;
  14. // 封面
  15. private String images;
  16. // 作者id
  17. private Long authorId;
  18. // 作者名词
  19. private String authorName;
  20. //静态url
  21. private String staticUrl;
  22. //文章内容
  23. private String content;
  24. }

2.文章微服务的ArticleFreemarkerService中的buildArticleToMinIO方法中收集数据并发送消息

完整代码如下:

  1. package com.heima.article.service.impl;
  2. import java.util.Map;
  3. @Service
  4. @Slf4j
  5. @Transactional
  6. public class ArticleFreemarkerServiceImpl implements ArticleFreemarkerService {
  7. ***前面没变
  8. //4.4 修改ap_article表,保存static_url字段
  9. apArticleService.update(Wrappers.<ApArticle>lambdaUpdate().eq(ApArticle::getId,apArticle.getId())
  10. .set(ApArticle::getStaticUrl,path));
  11. //发送消息,创建索引
  12. createArticleESIndex(apArticle,content,path);
  13. }
  14. }
  15. @Autowired
  16. private KafkaTemplate<String,String> kafkaTemplate;
  17. /**
  18. * 送消息,创建索引
  19. * @param apArticle
  20. * @param content
  21. * @param path
  22. */
  23. private void createArticleESIndex(ApArticle apArticle, String content, String path) {
  24. SearchArticleVo vo = new SearchArticleVo();
  25. BeanUtils.copyProperties(apArticle,vo);
  26. vo.setContent(content);
  27. vo.setStaticUrl(path);
  28. kafkaTemplate.send(ArticleConstants.ARTICLE_ES_SYNC_TOPIC, JSON.toJSONString(vo));
  29. }
  30. }

在ArticleConstants类中添加新的常量,完整代码如下

  1. package com.heima.common.constants;
  2. public class ArticleConstants {
  3. public static final Short LOADTYPE_LOAD_MORE = 1;
  4. public static final Short LOADTYPE_LOAD_NEW = 2;
  5. public static final String DEFAULT_TAG = "__all__";
  6. public static final String ARTICLE_ES_SYNC_TOPIC = "article.es.sync.topic";
  7. }

3.文章微服务集成kafka发送消息

在文章微服务的nacos的配置中心添加如下配置

  1. kafka:
  2. bootstrap-servers: 192.168.200.130:9092
  3. producer:
  4. retries: 10
  5. key-serializer: org.apache.kafka.common.serialization.StringSerializer
  6. value-serializer: org.apache.kafka.common.serialization.StringSerializer
3.6.3)搜索微服务接收消息并创建索引

1.搜索微服务中添加kafka的配置,nacos配置如下

  1. spring:
  2. kafka:
  3. bootstrap-servers: 192.168.200.130:9092
  4. consumer:
  5. group-id: ${spring.application.name}
  6. key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
  7. value-deserializer: org.apache.kafka.common.serialization.StringDeserializer

2.定义监听接收消息,保存索引数据

  1. package com.heima.search.listener;
  2. import java.io.IOException;
  3. @Component
  4. @Slf4j
  5. public class SyncArticleListener {
  6. @Autowired
  7. private RestHighLevelClient restHighLevelClient;
  8. @KafkaListener(topics = ArticleConstants.ARTICLE_ES_SYNC_TOPIC)
  9. public void onMessage(String message){
  10. if(StringUtils.isNotBlank(message)){
  11. log.info("SyncArticleListener,message={}",message);
  12. SearchArticleVo searchArticleVo = JSON.parseObject(message, SearchArticleVo.class);
  13. IndexRequest indexRequest = new IndexRequest("app_info_article");
  14. indexRequest.id(searchArticleVo.getId().toString());
  15. indexRequest.source(message, XContentType.JSON);
  16. try {
  17. restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT);
  18. } catch (IOException e) {
  19. e.printStackTrace();
  20. log.error("sync es error={}",e);
  21. }
  22. }
  23. }
  24. }

4) app端搜索-搜索记录

4.1) 需求分析

  • 展示用户的搜索记录10条,按照搜索关键词的时间倒序

  • 可以删除搜索记录

  • 保存历史记录,保存10条,多余的则删除最久的历史记录

4.2)数据存储说明

用户的搜索记录,需要给每一个用户都保存一份,数据量较大,要求加载速度快,通常这样的数据存储到mongodb更合适,不建议直接存储到关系型数据库中

4.3)MongoDB安装及集成

4.3.1)安装MongoDB

拉取镜像


<code class="language-plaintext hljs">docker pull mongo</code>

创建容器


<code class="language-plaintext hljs">docker run -di --name mongo-service --restart=always -p 27017:27017 -v ~/data/mongodata:/data mongo</code>
4.3.2)导入资料中的mongo-demo项目到heima-leadnews-test中

其中有三项配置比较关键:

第一:mongo依赖

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-data-mongodb</artifactId>
  4. </dependency>

第二:mongo配置

  1. server:
  2. port: 9998
  3. spring:
  4. data:
  5. mongodb:
  6. host: 192.168.200.130
  7. port: 27017
  8. database: leadnews-history

第三:映射

  1. package com.itheima.mongo.pojo;
  2. import java.io.Serializable;
  3. import java.util.Date;
  4. /**
  5. * <p>
  6. * 联想词表
  7. * </p>
  8. *
  9. * @author itheima
  10. */
  11. @Data
  12. @Document("ap_associate_words")
  13. public class ApAssociateWords implements Serializable {
  14. private static final long serialVersionUID = 1L;
  15. private String id;
  16. /**
  17. * 联想词
  18. */
  19. private String associateWords;
  20. /**
  21. * 创建时间
  22. */
  23. private Date createdTime;
  24. }
4.3.3)核心方法
  1. package com.itheima.mongo.test;
  2. import java.util.Date;
  3. import java.util.List;
  4. @SpringBootTest(classes = MongoApplication.class)
  5. @RunWith(SpringRunner.class)
  6. public class MongoTest {
  7. @Autowired
  8. private MongoTemplate mongoTemplate;
  9. //保存
  10. @Test
  11. public void saveTest(){
  12. /*for (int i = 0; i < 10; i++) {
  13. ApAssociateWords apAssociateWords = new ApAssociateWords();
  14. apAssociateWords.setAssociateWords("黑马头条");
  15. apAssociateWords.setCreatedTime(new Date());
  16. mongoTemplate.save(apAssociateWords);
  17. }*/
  18. ApAssociateWords apAssociateWords = new ApAssociateWords();
  19. apAssociateWords.setAssociateWords("黑马直播");
  20. apAssociateWords.setCreatedTime(new Date());
  21. mongoTemplate.save(apAssociateWords);
  22. }
  23. //查询一个
  24. @Test
  25. public void saveFindOne(){
  26. ApAssociateWords apAssociateWords = mongoTemplate.findById("60bd973eb0c1d430a71a7928", ApAssociateWords.class);
  27. System.out.println(apAssociateWords);
  28. }
  29. //条件查询
  30. @Test
  31. public void testQuery(){
  32. Query query = Query.query(Criteria.where("associateWords").is("黑马头条"))
  33. .with(Sort.by(Sort.Direction.DESC,"createdTime"));
  34. List<ApAssociateWords> apAssociateWordsList = mongoTemplate.find(query, ApAssociateWords.class);
  35. System.out.println(apAssociateWordsList);
  36. }
  37. @Test
  38. public void testDel(){
  39. mongoTemplate.remove(Query.query(Criteria.where("associateWords").is("黑马头条")),ApAssociateWords.class);
  40. }
  41. }

4.4)保存搜索记录

4.4.1)实现思路

用户输入关键字进行搜索的异步记录关键字

用户搜索记录对应的集合,对应实体类:

  1. package com.heima.search.pojos;
  2. import lombok.Data;
  3. import org.springframework.data.mongodb.core.mapping.Document;
  4. import java.io.Serializable;
  5. import java.util.Date;
  6. /**
  7. * <p>
  8. * APP用户搜索信息表
  9. * </p>
  10. * @author itheima
  11. */
  12. @Data
  13. @Document("ap_user_search")
  14. public class ApUserSearch implements Serializable {
  15. private static final long serialVersionUID = 1L;
  16. /**
  17. * 主键
  18. */
  19. private String id;
  20. /**
  21. * 用户ID
  22. */
  23. private Integer userId;
  24. /**
  25. * 搜索词
  26. */
  27. private String keyword;
  28. /**
  29. * 创建时间
  30. */
  31. private Date createdTime;
  32. }
4.4.2)实现步骤

1.搜索微服务集成mongodb

①:pom依赖

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-data-mongodb</artifactId>
  4. </dependency>

②:nacos配置

  1. spring:
  2. data:
  3. mongodb:
  4. host: 192.168.200.130
  5. port: 27017
  6. database: leadnews-history

③:在当天资料中找到对应的实体类拷贝到搜索微服务下

2.创建ApUserSearchService新增insert方法

  1. public interface ApUserSearchService {
  2. /**
  3. * 保存用户搜索历史记录
  4. * @param keyword
  5. * @param userId
  6. */
  7. public void insert(String keyword,Integer userId);
  8. }

实现类:

  1. @Service
  2. @Slf4j
  3. public class ApUserSearchServiceImpl implements ApUserSearchService {
  4. @Autowired
  5. private MongoTemplate mongoTemplate;
  6. /**
  7. * 保存用户搜索历史记录
  8. * @param keyword
  9. * @param userId
  10. */
  11. @Override
  12. @Async
  13. public void insert(String keyword, Integer userId) {
  14. //1.查询当前用户的搜索关键词
  15. Query query = Query.query(Criteria.where("userId").is(userId).and("keyword").is(keyword));
  16. ApUserSearch apUserSearch = mongoTemplate.findOne(query, ApUserSearch.class);
  17. //2.存在 更新创建时间
  18. if(apUserSearch != null){
  19. apUserSearch.setCreatedTime(new Date());
  20. mongoTemplate.save(apUserSearch);
  21. return;
  22. }
  23. //3.不存在,判断当前历史记录总数量是否超过10
  24. apUserSearch = new ApUserSearch();
  25. apUserSearch.setUserId(userId);
  26. apUserSearch.setKeyword(keyword);
  27. apUserSearch.setCreatedTime(new Date());
  28. Query query1 = Query.query(Criteria.where("userId").is(userId));
  29. query1.with(Sort.by(Sort.Direction.DESC,"createdTime"));
  30. List<ApUserSearch> apUserSearchList = mongoTemplate.find(query1, ApUserSearch.class);
  31. if(apUserSearchList == null || apUserSearchList.size() < 10){
  32. mongoTemplate.save(apUserSearch);
  33. }else {
  34. ApUserSearch lastUserSearch = apUserSearchList.get(apUserSearchList.size() - 1);
  35. mongoTemplate.findAndReplace(Query.query(Criteria.where("id").is(lastUserSearch.getId())),apUserSearch);
  36. }
  37. }
  38. }

3.参考自媒体相关微服务,在搜索微服务中获取当前登录的用户

4.在ArticleSearchService的search方法中调用保存历史记录

完整代码如下:

  1. package com.heima.search.service.impl;
  2. import java.util.Map;
  3. @Service
  4. @Slf4j
  5. public class ArticleSearchServiceImpl implements ArticleSearchService {
  6. @Autowired
  7. private ApUserSearchService apUserSearchService;
  8. /**
  9. * es文章分页检索
  10. *
  11. * @param dto
  12. * @return
  13. */
  14. @Override
  15. public ResponseResult search(UserSearchDto dto) throws IOException {
  16. //1.检查参数
  17. if(dto == null || StringUtils.isBlank(dto.getSearchWords())){
  18. return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
  19. }
  20. ApUser user = AppThreadLocalUtil.getUser();
  21. //异步调用 保存搜索记录
  22. if(user != null && dto.getFromIndex() == 0){
  23. apUserSearchService.insert(dto.getSearchWords(), user.getId());
  24. }
  25. //2.设置查询条件
  26. SearchRequest searchRequest = new SearchRequest("app_info_article");
  27. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  28.         ****都没变
  29. return ResponseResult.okResult(list);
  30. }
  31. }

5.保存历史记录中开启异步调用,添加注解@Async

6.在搜索微服务引导类上开启异步调用

7.测试,搜索后查看结果

4.5) 加载搜索记录列表

4.5.1) 思路分析

按照当前用户,按照时间倒序查询

说明

接口路径

/api/v1/history/load

请求方式

POST

参数

响应结果

ResponseResult

4.5.2) 接口定义
  1. /**
  2. * <p>
  3. * APP用户搜索信息表 前端控制器
  4. * </p>
  5. *
  6. * @author itheima
  7. */
  8. @Slf4j
  9. @RestController
  10. @RequestMapping("/api/v1/history")
  11. public class ApUserSearchController{
  12. @PostMapping("/load")
  13. @Override
  14. public ResponseResult findUserSearch() {
  15. return null;
  16. }
  17. }
4.5.3) mapper

已定义

4.5.4) 业务层

在ApUserSearchService中新增方法

  1. /**
  2. 查询搜索历史
  3. @return
  4. */
  5. ResponseResult findUserSearch();

实现方法

  1. /**
  2. * 查询搜索历史
  3. *
  4. * @return
  5. */
  6. @Override
  7. public ResponseResult findUserSearch() {
  8. //获取当前用户
  9. ApUser user = AppThreadLocalUtil.getUser();
  10. if(user == null){
  11. return ResponseResult.errorResult(AppHttpCodeEnum.NEED_LOGIN);
  12. }
  13. //根据用户查询数据,按照时间倒序
  14. List<ApUserSearch> apUserSearches = mongoTemplate.find(Query.query(Criteria.where("userId").is(user.getId())).with(Sort.by(Sort.Direction.DESC, "createdTime")), ApUserSearch.class);
  15. return ResponseResult.okResult(apUserSearches);
  16. }
4.5.5) 控制器
  1. /**
  2. * <p>
  3. * APP用户搜索信息表 前端控制器
  4. * </p>
  5. * @author itheima
  6. */
  7. @Slf4j
  8. @RestController
  9. @RequestMapping("/api/v1/history")
  10. public class ApUserSearchController{
  11. @Autowired
  12. private ApUserSearchService apUserSearchService;
  13. @PostMapping("/load")
  14. public ResponseResult findUserSearch() {
  15. return apUserSearchService.findUserSearch();
  16. }
  17. }
4.5.6) 测试

打开app的搜索页面,可以查看搜索记录列表

4.6) 删除搜索记录

4.6.1) 思路分析

按照搜索历史id删除

说明

接口路径

/api/v1/history/del

请求方式

POST

参数

HistorySearchDto

响应结果

ResponseResult

4.6.2) 接口定义

在ApUserSearchController接口新增方法

  1. @PostMapping("/del")
  2. public ResponseResult delUserSearch(@RequestBody HistorySearchDto historySearchDto) {
  3. return null;
  4. }

HistorySearchDto

  1. @Data
  2. public class HistorySearchDto {
  3. /**
  4. * 接收搜索历史记录id
  5. */
  6. String id;
  7. }
4.6.3) 业务层

在ApUserSearchService中新增方法

  1. /**
  2. 删除搜索历史
  3. @param historySearchDto
  4. @return
  5. */
  6. ResponseResult delUserSearch(HistorySearchDto historySearchDto);

实现方法

  1. /**
  2. * 删除历史记录
  3. *
  4. * @param dto
  5. * @return
  6. */
  7. @Override
  8. public ResponseResult delUserSearch(HistorySearchDto dto) {
  9. //1.检查参数
  10. if(dto.getId() == null){
  11. return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
  12. }
  13. //2.判断是否登录
  14. ApUser user = AppThreadLocalUtil.getUser();
  15. if(user == null){
  16. return ResponseResult.errorResult(AppHttpCodeEnum.NEED_LOGIN);
  17. }
  18. //3.删除
  19. mongoTemplate.remove(Query.query(Criteria.where("userId").is(user.getId()).and("id").is(dto.getId())),ApUserSearch.class);
  20. return ResponseResult.okResult(AppHttpCodeEnum.SUCCESS);
  21. }
4.6.4) 控制器

修改ApUserSearchController,补全方法

  1. @PostMapping("/del")
  2. public ResponseResult delUserSearch(@RequestBody HistorySearchDto historySearchDto) {
  3. return apUserSearchService.delUserSearch(historySearchDto);
  4. }
4.6.5) 测试

打开app可以删除搜索记录

5) app端搜索-关键字联想词

5.1 需求分析

  • 根据用户输入的关键字展示联想词

对应实体类

  1. package com.heima.search.pojos;
  2. import lombok.Data;
  3. import org.springframework.data.mongodb.core.mapping.Document;
  4. import java.io.Serializable;
  5. import java.util.Date;
  6. /**
  7. * <p>
  8. * 联想词表
  9. * </p>
  10. *
  11. * @author itheima
  12. */
  13. @Data
  14. @Document("ap_associate_words")
  15. public class ApAssociateWords implements Serializable {
  16. private static final long serialVersionUID = 1L;
  17. private String id;
  18. /**
  19. * 联想词
  20. */
  21. private String associateWords;
  22. /**
  23. * 创建时间
  24. */
  25. private Date createdTime;
  26. }

5.2)搜索词-数据来源

通常是网上搜索频率比较高的一些词,通常在企业中有两部分来源:

第一:自己维护搜索词

通过分析用户搜索频率较高的词,按照排名作为搜索词

第二:第三方获取

关键词规划师(百度)、5118、爱站网

导入资料中的ap_associate_words.js脚本到mongo中

5.3 功能实现

5.3.1 接口定义

说明

接口路径

/api/v1/associate/search

请求方式

POST

参数

UserSearchDto

响应结果

ResponseResult

新建接口

  1. package com.heima.search.controller.v1;
  2. import org.springframework.web.bind.annotation.RestController;
  3. @RestController
  4. @RequestMapping("/api/v1/associate")
  5. public class ApAssociateWordsController {
  6. @PostMapping("/search")
  7. public ResponseResult search(@RequestBody UserSearchDto userSearchDto) {
  8. return null;
  9. }
  10. }
5.3.3 业务层

新建联想词业务层接口

  1. package com.heima.search.service;
  2. import com.heima.model.common.dtos.ResponseResult;
  3. import com.heima.model.search.dtos.UserSearchDto;
  4. /**
  5. * <p>
  6. * 联想词表 服务类
  7. * </p>
  8. *
  9. * @author itheima
  10. */
  11. public interface ApAssociateWordsService {
  12. /**
  13. 联想词
  14. @param userSearchDto
  15. @return
  16. */
  17. ResponseResult findAssociate(UserSearchDto userSearchDto);
  18. }

实现类

  1. package com.heima.search.service.impl;
  2. import java.util.List;
  3. /**
  4. * @Description:
  5. * @Version: V1.0
  6. */
  7. @Service
  8. public class ApAssociateWordsServiceImpl implements ApAssociateWordsService {
  9. @Autowired
  10. MongoTemplate mongoTemplate;
  11. /**
  12. * 联想词
  13. * @param userSearchDto
  14. * @return
  15. */
  16. @Override
  17. public ResponseResult findAssociate(UserSearchDto userSearchDto) {
  18. //1 参数检查
  19. if(userSearchDto == null || StringUtils.isBlank(userSearchDto.getSearchWords())){
  20. return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
  21. }
  22. //分页检查
  23. if (userSearchDto.getPageSize() > 20) {
  24. userSearchDto.setPageSize(20);
  25. }
  26. //3 执行查询 模糊查询
  27. Query query = Query.query(Criteria.where("associateWords").regex(".*?\\" + userSearchDto.getSearchWords() + ".*"));
  28. query.limit(userSearchDto.getPageSize());
  29. List<ApAssociateWords> wordsList = mongoTemplate.find(query, ApAssociateWords.class);
  30. return ResponseResult.okResult(wordsList);
  31. }
  32. }
5.3.4 控制器

新建联想词控制器

  1. package com.heima.search.controller.v1;
  2. /**
  3. * <p>
  4. * 联想词表 前端控制器
  5. * </p>
  6. * @author itheima
  7. */
  8. @Slf4j
  9. @RestController
  10. @RequestMapping("/api/v1/associate")
  11. public class ApAssociateWordsController{
  12. @Autowired
  13. private ApAssociateWordsService apAssociateWordsService;
  14. @PostMapping("/search")
  15. public ResponseResult findAssociate(@RequestBody UserSearchDto userSearchDto) {
  16. return apAssociateWordsService.findAssociate(userSearchDto);
  17. }
  18. }
5.3.5 测试

同样,打开前端联调测试效果


平台管理-需求说明

要求:

  • 每个组长要分配任务,共同完成这些需求

  • 需要创建一个开源项目(每个组创建一个),其他组员共同提交到这个仓库里,最后合并为一个完整的项目

  • 组长创建一个git项目

  • 基础代码是day07完成后的代码

  • 每个组员需要克隆到本地

  • 每个组员创建一个分支去开发

  • 合并为一个完整的项目

28号晚上答辩

  • 展示完成的项目功能

  • 给同学在讲台上,人选:最好是不爱说话或不敢说话的人

0)平台管理前端

查看资料中的admin-web文件夹,使用nginx部署

nginx中的配置为:

  1. upstream heima-admin-gateway{
  2. server localhost:51603;
  3. }
  4. server {
  5. listen 8082;
  6. location / {
  7. root D:/workspace/admin-web/;
  8. index index.html;
  9. }
  10. location ~/service_6001/(.*) {
  11. proxy_pass http://heima-admin-gateway/$1;
  12. proxy_set_header HOST $host; # 不改变源请求头的值
  13. proxy_pass_request_body on; #开启获取请求体
  14. proxy_pass_request_headers on; #开启获取请求头
  15. proxy_set_header X-Real-IP $remote_addr; # 记录真实发出请求的客户端IP
  16. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #记录代理信息
  17. }
  18. }

0 准备工作

0.1数据库和类

数据库导入记得加表名;

给了两个类ApUserRealname、ApUser 按照包名导入就可以啦

0.2 项目结构参考前面的项目

model层、Service层、bootstrap连接nacos

1)登录及网关

1.1)登录

平台管理的表,请查看资料中导入到数据库中 leadnews_admin.sql

  • 用户根据用户名和密码登录

  • 密码需要手动加盐验证

  • 需要返回用户的token和用户信息

1登录接口文档

接口地址:/login/in

请求方式:POST

请求数据类型:application/json

响应数据类型:*/*

接口描述:

请求示例:

  1. {
  2. "name": "",
  3. "password": ""
  4. }

请求参数:

参数名称

参数说明

in

是否必须

数据类型

schema

dto

dto

body

true

AdUserDto

AdUserDto

name

true

string

password

true

string

响应状态:

状态码

说明

schema

200

OK

ResponseResult

201

Created

401

Unauthorized

403

Forbidden

404

Not Found

响应参数:

参数名称

参数说明

类型

schema

code

integer(int32)

integer(int32)

data

object

errorMessage

string

host

string

响应示例:

  1. {
  2. "host":null,
  3. "code":1002,
  4. "errorMessage":"数据不存在",
  5. "data":null
  6. }
  7. {
  8. "host":null,
  9. "code":2,
  10. "errorMessage":"密码错误",
  11. "data":null
  12. }
  13. {
  14. "host":null,
  15. "code":200,
  16. "errorMessage":"操作成功",
  17. "data":{
  18. "user":{
  19. "id":"3",
  20. "name":"guest",
  21. "password":"",
  22. "salt":"",
  23. "nickname":"gu",
  24. "image":null,
  25. "phone":"13412345676",
  26. "status":1,
  27. "email":"guest@qq.com",
  28. "loginTime":1596092403000,
  29. "createdTime":1596092406000
  30. },
  31. "token":"eyJhbGciOiJIUzUxMiIsInppcCI6IkdaSVAifQ.H4sIAAAAAAAAADWLQQrEIAwA_5JzBTUaa3-jNGUtFIRYaFn2700Pe5thmC_so8ECawobbnE2jiubQJlMRe8Mxcghc6aIHiZoZcDiyCePwVqaQM6qt9wy-Hi7iOqH21HUyrmqld6V-er_M9F7Nm34ewAJrbr_gAAAAA.TxoXtzsWAdaqCLWeMUdSnMngZSXndTsoYq6Dz5_r_SDZWcMp8ZS2BJhxoRVHG4KxvOn2ZN3MATemX2EZ4KnrLw"
  32. }
  33. }

1.1参考User的登录写法

AdUSerDto


<code class="language-plaintext hljs">package com.heima.model.admin.dtos;

import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

@Data
public class AdUserDto {
    /**
     * 用户名
     */
    @ApiModelProperty(value = "用户名",required = true)
    private String name;

    /**
     * 密码
     */
    @ApiModelProperty(value = "密码",required = true)
    private String password;
}</code>

AdUserMapper


<code class="language-plaintext hljs">package com.heima.admin.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.heima.model.admin.pojos.AdUser;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface AdUserMapper extends BaseMapper<AdUser> {}</code>

LoginController


<code class="language-plaintext hljs">package com.heima.admin.controller.v1;

import com.heima.admin.service.UserLoginService;
import com.heima.model.admin.pojos.AdUser;
import com.heima.model.common.dtos.ResponseResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/login")
public class LoginController {

    @Autowired
    private UserLoginService userLoginService;

    @PostMapping("/in")
    public ResponseResult login(@RequestBody AdUser user) {
        return userLoginService.login(user);
    }
}</code>

AdminLoginService


<code class="language-plaintext hljs">package com.heima.admin.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.heima.model.admin.pojos.AdUser;
import com.heima.model.common.dtos.ResponseResult;
import com.heima.model.user.pojos.ApUser;

public interface AdminLoginService extends IService<AdUser> {

    /**
     * 登录
     *
     * @param dto
     * @return
     */
    ResponseResult login(AdUser dto);
}</code>

AdminLoginServiceImpl


<code class="language-plaintext hljs">package com.heima.admin.service.impl;

import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.heima.admin.mapper.AdUserMapper;
import com.heima.admin.service.AdminLoginService;
import com.heima.model.admin.pojos.AdUser;
import com.heima.model.common.dtos.ResponseResult;
import com.heima.model.common.enums.AppHttpCodeEnum;
import com.heima.utils.common.AppJwtUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;

import java.util.HashMap;
import java.util.Map;

@Service
@SuppressWarnings("all")
public class AdminLoginServiceImpl extends ServiceImpl<AdUserMapper, AdUser> implements AdminLoginService {

    @Autowired
    private  AdUserMapper adUserMapper;
    /**
     * 登录
     * @param dto
     * @return
     */
    @Override
    public ResponseResult login(AdUser dto) {
        //1.正常登录 用户名和密码
        if(StringUtils.isNotBlank(dto.getPhone()) && StringUtils.isNotBlank(dto.getPassword())){
            //1.1 根据手机号查询用户信息
            AdUser dbUser = getOne(Wrappers.<AdUser>lambdaQuery().eq(AdUser::getName, dto.getName()));
            if(dbUser == null){
                return ResponseResult.errorResult(AppHttpCodeEnum.DATA_NOT_EXIST,"用户信息不存在");
            }

            //1.2 比对密码
            String salt = dbUser.getSalt();
            String password = dto.getPassword();
            String pswd = DigestUtils.md5DigestAsHex((password + salt).getBytes());
            if(!pswd.equals(dbUser.getPassword())){
                return ResponseResult.errorResult(AppHttpCodeEnum.LOGIN_PASSWORD_ERROR);
            }

            //1.3 返回数据  jwt  user
            String token = AppJwtUtil.getToken(dbUser.getId().longValue());
            Map<String,Object> map = new HashMap<>();
            map.put("token",token);
            dbUser.setSalt("");
            dbUser.setPassword("");
            map.put("user",dbUser);

            return ResponseResult.okResult(map);
        }
        else
            return ResponseResult.errorResult(AppHttpCodeEnum.DATA_NOT_EXIST,"用户信息不存在");
    }
}</code>

AdminApplication


<code class="language-plaintext hljs">package com.heima.admin;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

/**
 * 实现后台管理系统
 */
@SpringBootApplication
@EnableDiscoveryClient//集成注册中心
@MapperScan("com.heima.admin.mapper")
public class AdminApplication {
    public static void main(String[] args) {
        SpringApplication.run(AdminApplication.class, args);
    }
}</code>

呵呵 真的逆天,网关不给我端口,让我咋猜;

一直报错502 试都试不了;就在我马上要发疯的时候,发现虽然day12的没有但是day11的有;ok我不急了;

。。。真的逆天,nacos没给,不知道网关咋配的一直登录不上

但是postMan测方法成功;

1.2)网关

平台管理端,是作为平台管理员使用的后台服务,所有后台的请求,都应该经过网关访问,需要创建平台管理的网关,并使用nacos配置

  • 需要校验jwt

  • 路由其他微服务

2)频道管理

2.1)新增
  • 前台输入内容进行频道的保存

  • 频道名词不能重复

2.2)查询列表
  • 查询需要按照创建时间倒序查询

  • 按照频道名称模糊查询

  • 可以按照状态进行精确查找(1:启用 true 0:禁用 false)

  • 分页查询

2.3)修改
  • 点击编辑后可以修改频道

  • 如果频道被引用则不能禁用

2.4)删除

只有禁用的频道才能删除

WmchannelController


<code class="language-plaintext hljs">package com.heima.wemedia.controller.v1;

import com.heima.model.common.dtos.ResponseResult;
import com.heima.model.wemedia.dtos.ChannelDto;
import com.heima.model.wemedia.pojos.WmChannel;
import com.heima.wemedia.service.WmChannelService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api/v1/channel")
public class WmchannelController {

    @Autowired
    private WmChannelService wmChannelService;

    @GetMapping("/channels")
    public ResponseResult findAll(){
        return wmChannelService.findAll();
    }


    @PostMapping("/list")
    public ResponseResult findByNameAndPage(@RequestBody ChannelDto dto){
        return wmChannelService.findByNameAndPage(dto);
    }

    @PostMapping("/save")
    public ResponseResult insert(@RequestBody WmChannel adChannel){
        return wmChannelService.insert(adChannel);
    }

    @PostMapping("/update")
    public ResponseResult update(@RequestBody WmChannel adChannel){
        return wmChannelService.update(adChannel);
    }

    @GetMapping("/del/{id}")
    public ResponseResult delete(@PathVariable("id") Integer id){
        return wmChannelService.delete(id);
    }

}</code>

3)敏感词管理

3.1)新增
  • 弹出的输入框,输入敏感词可直接保存

  • 已存在的敏感词则不能保存

3.2)查询列表
  • 查询需要按照创建时间倒序查询

  • 按照敏感词名称模糊查询

  • 分页查询

3.3)修改
3.4)删除

直接删除即可

WmSensitiveController


<code class="language-plaintext hljs">package com.heima.wemedia.controller.v1;

import com.heima.model.common.dtos.ResponseResult;
import com.heima.model.wemedia.dtos.SensitiveDto;
import com.heima.model.wemedia.pojos.WmSensitive;
import com.heima.wemedia.service.WmSensitiveService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api/v1/sensitive")
public class WmSensitiveController {

    @Autowired
    private WmSensitiveService wmSensitiveService;

    @PostMapping("/list")
    public ResponseResult list(@RequestBody SensitiveDto dto){
        return wmSensitiveService.list(dto);
    }

    @PostMapping("/save")
    public ResponseResult insert(@RequestBody WmSensitive wmSensitive){
        return wmSensitiveService.insert(wmSensitive);
    }

    @PostMapping("/update")
    public ResponseResult update(@RequestBody WmSensitive wmSensitive){
        return wmSensitiveService.update(wmSensitive);
    }

    @DeleteMapping("/del/{id}")
    public ResponseResult delete(@PathVariable("id") Integer id){
        return wmSensitiveService.delete(id);
    }
}</code>

4)用户认证审核

  • 在app端的个人中心用户可以实名认证,需要材料为:姓名、身份证号、身份证正面照、身份证反面照、手持照片、活体照片(通过微笑、眨眼、张嘴、摇头、点头等组合动作,确保操作的为真实活体人脸。),当用户提交审核后就到了后端让运营管理人员进行审核

  • 平台运营端查看用户认证信息,进行审核,其中审核包括了用户身份审核,需要对接公安系统校验身份证信息

  • 用户通过审核后需要开通自媒体账号(该账号的用户名和密码与app一致)

4.1)分页查询认证列表
  • 可根据审核状态条件查询

  • 需要分页查询

4.2)审核

人工审核

拒绝

审核成功

ApUserRealnameController

  1. package com.heima.user.controller.v1;
  2. import com.heima.common.constants.UserConstants;
  3. import com.heima.model.common.dtos.ResponseResult;
  4. import com.heima.model.user.dtos.AuthDto;
  5. import com.heima.user.service.ApUserRealnameService;
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.web.bind.annotation.PostMapping;
  8. import org.springframework.web.bind.annotation.RequestBody;
  9. import org.springframework.web.bind.annotation.RequestMapping;
  10. import org.springframework.web.bind.annotation.RestController;
  11. @RestController
  12. @RequestMapping("/api/v1/auth")
  13. public class ApUserRealnameController {
  14. @Autowired
  15. private ApUserRealnameService apUserRealnameService;
  16. @PostMapping("/list")
  17. public ResponseResult loadListByStatus(@RequestBody AuthDto dto){
  18. return apUserRealnameService.loadListByStatus(dto);
  19. }
  20. @PostMapping("/authPass")
  21. public ResponseResult authPass(@RequestBody AuthDto dto ){
  22. return apUserRealnameService.updateStatus(dto, UserConstants.PASS_AUTH);
  23. }
  24. @PostMapping("/authFail")
  25. public ResponseResult authFail(@RequestBody AuthDto dto ){
  26. return apUserRealnameService.updateStatus(dto, UserConstants.FAIL_AUTH);
  27. }
  28. }

5)文章人工审核

自媒体文章如果没有自动审核成功,而是到了人工审核(自媒体文章状态为3),需要在admin端人工处理文章的审核

  • 平台管理员可以查看待人工审核的文章信息,如果存在违规内容则驳回(状态改为2,文章审核失败)

  • 平台管理员可以查看待人工审核的文章信息,如果不存在违规,则需要创建app端的文章信息,并更新自媒体文章的状态

也可以通过点击查看按钮,查看文章详细信息,查看详情后可以根据内容判断是否需要通过审核

5.1)文章列表查询
  • 分页查询自媒体文章

  • 可以按照标题模糊查询

  • 可以按照审核状态进行精确 检索

  • 文章查询按照创建时间倒序查询

  • 注意:需要展示作者名称

5.2)查询文章详情
  • 可以查看文章详细内容

  • 注意:需要展示作者名称

5.3)人工审核
5.3.1) 拒绝

拒绝以后需要给出原因,并修改文章的状态为2

5.3.2)审核成功

需要创建app端的文章信息,并更新自媒体文章的状态

WmNewsController

  1. package com.heima.wemedia.controller.v1;
  2. import com.heima.common.constants.WemediaConstants;
  3. import com.heima.model.common.dtos.ResponseResult;
  4. import com.heima.model.wemedia.dtos.NewsAuthDto;
  5. import com.heima.model.wemedia.dtos.WmNewsDto;
  6. import com.heima.model.wemedia.dtos.WmNewsPageReqDto;
  7. import com.heima.wemedia.service.WmNewsService;
  8. import org.springframework.beans.factory.annotation.Autowired;
  9. import org.springframework.web.bind.annotation.*;
  10. @RestController
  11. @RequestMapping("/api/v1/news")
  12. public class WmNewsController {
  13. @Autowired
  14. private WmNewsService wmNewsService;
  15. @PostMapping("/list")
  16. public ResponseResult findAll(@RequestBody WmNewsPageReqDto dto){
  17. return wmNewsService.findAll(dto);
  18. }
  19. @PostMapping("/submit")
  20. public ResponseResult submitNews(@RequestBody WmNewsDto dto){
  21. return wmNewsService.submitNews(dto);
  22. }
  23. @GetMapping("/one/{id}")
  24. public ResponseResult findOne(@PathVariable("id") Integer id){
  25. return wmNewsService.findOne(id);
  26. }
  27. @PostMapping("/down_or_up")
  28. public ResponseResult downOrUp(@RequestBody WmNewsDto dto){
  29. return wmNewsService.downOrUp(dto);
  30. }
  31. //------------------上面这四个是之前的
  32. @PostMapping("/list_vo")
  33. public ResponseResult findList(@RequestBody NewsAuthDto dto){
  34. return wmNewsService.findList(dto);
  35. }
  36. @GetMapping("/one_vo/{id}")
  37. public ResponseResult findWmNewsVo(@PathVariable("id") Integer id){
  38. return wmNewsService.findWmNewsVo(id);
  39. }
  40. @PostMapping("/auth_pass")
  41. public ResponseResult authPass(@RequestBody NewsAuthDto dto){
  42. return wmNewsService.updateStatus(WemediaConstants.WM_NEWS_AUTH_PASS,dto);
  43. }
  44. @PostMapping("/auth_fail")
  45. public ResponseResult authFail(@RequestBody NewsAuthDto dto){
  46. return wmNewsService.updateStatus(WemediaConstants.WM_NEWS_AUTH_FAIL,dto);
  47. }
  48. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/988058
推荐阅读
相关标签
  

闽ICP备14008679号