ソースを参照

0529 首页和跨域

Qing 11 ヶ月 前
コミット
46565085ab

+ 13 - 0
novel-demo/pom.xml

@@ -72,6 +72,19 @@
             <artifactId>spring-boot-starter-test</artifactId>
             <scope>test</scope>
         </dependency>
+
+        <dependency>
+            <groupId>org.springdoc</groupId>
+            <artifactId>springdoc-openapi-starter-webmvc-api</artifactId>
+            <version>2.0.2</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springdoc</groupId>
+            <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
+            <version>2.0.2</version>
+        </dependency>
+
     </dependencies>
 
     <build>

+ 39 - 0
novel-demo/src/main/java/com/sf/config/CorsConfig.java

@@ -0,0 +1,39 @@
+package com.sf.config;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.cors.CorsConfiguration;
+import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
+import org.springframework.web.filter.CorsFilter;
+
+@Configuration
+// @EnableConfigurationProperties 意思是 让CorsProperties生效
+@EnableConfigurationProperties(CorsProperties.class)
+public class CorsConfig {
+
+    @Autowired
+    private CorsProperties corsProperties;
+
+    // 配置跨域过滤器
+    @Bean
+    public CorsFilter corsFilter() {
+        // 跨域配置
+        CorsConfiguration corsConfiguration = new CorsConfiguration();
+        // 从配置文件中取出  放入跨域配置中
+        corsProperties.getAllowOrigins().forEach(allowedOrigin -> {
+            corsConfiguration.addAllowedOrigin(allowedOrigin);
+        });
+//        corsConfiguration.addAllowedOrigin("http://localhost:1024");
+        corsConfiguration.setAllowCredentials(true);
+        // 允许全部的头信息
+        corsConfiguration.addAllowedHeader("*");
+        // 允许全部的请求方式
+        corsConfiguration.addAllowedMethod("*");
+        // 跨域配置源
+        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
+        source.registerCorsConfiguration("/**", corsConfiguration);
+        return new CorsFilter(source);
+    }
+}

+ 14 - 0
novel-demo/src/main/java/com/sf/config/CorsProperties.java

@@ -0,0 +1,14 @@
+package com.sf.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+import java.util.List;
+
+@Data
+//  @ConfigurationProperties 代表这是对应Properties配置文件的一个类
+@ConfigurationProperties(prefix = "novel.cors")
+public class CorsProperties {
+
+    private List<String> allowOrigins;
+}

+ 1 - 1
novel-demo/src/main/java/com/sf/controller/BookInfoController.java

@@ -25,7 +25,7 @@ public class BookInfoController {
     @Autowired
     private IBookInfoService bookInfoService;
 
-    // http://localhost:8080/bookInfo/list
+    // http://localhost:8888/bookInfo/list
     @GetMapping("/list")
     public List<BookInfo> list(){
         // 不需要编写sql语句  直接进行增删改查操作

+ 27 - 2
novel-demo/src/main/java/com/sf/controller/HomeBookController.java

@@ -1,7 +1,17 @@
 package com.sf.controller;
 
+import com.sf.dto.RestResp;
+import com.sf.dto.resp.HomeBookRespDto;
+import com.sf.service.IHomeBookService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.CrossOrigin;
+import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * <p>
@@ -11,8 +21,23 @@ import org.springframework.stereotype.Controller;
  * @author baomidou
  * @since 2024-05-25
  */
-@Controller
-@RequestMapping("/homeBook")
+@RestController
+@RequestMapping("/api/front/home")
+// 跨域问题
+//@CrossOrigin(originPatterns = "*",allowCredentials = "true")
 public class HomeBookController {
 
+    @Autowired
+    private IHomeBookService homeBookService;
+
+    // 首页接口
+    // http://127.0.0.1:8888/api/front/home/books
+    @GetMapping(value = "/books")
+    public RestResp<List<HomeBookRespDto>> books(){
+        System.out.println("start");
+        // 将实际的数据处理 给到service
+        List<HomeBookRespDto> books = homeBookService.allHomeBook();
+        // code message data
+        return RestResp.ok(books);
+    }
 }

+ 26 - 0
novel-demo/src/main/java/com/sf/dto/RestResp.java

@@ -0,0 +1,26 @@
+package com.sf.dto;
+
+import lombok.Data;
+
+@Data
+public class RestResp<T> {
+
+    private String code;
+    private String message;
+    // 返回数据的类型是动态的
+    private T data;
+
+    // 默认返回是成功的
+    private RestResp(T data){
+        this.code = "00000";
+        this.message = "一切ok";
+        this.data = data;
+    }
+
+    // 用静态方法返回对象
+    // 泛型方法
+    public static <T> RestResp<T> ok(T data){
+        return new RestResp<T>(data);
+    }
+
+}

+ 57 - 0
novel-demo/src/main/java/com/sf/dto/resp/HomeBookRespDto.java

@@ -0,0 +1,57 @@
+package com.sf.dto.resp;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 首页小说推荐 响应DTO
+ *
+ * @author xiongxiaoyang
+ * @date 2022/5/13
+ */
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+public class HomeBookRespDto {
+
+    /**
+     * 类型;0-轮播图 1-顶部栏 2-本周强推 3-热门推荐 4-精品推荐
+     */
+    @Schema(description = "类型;0-轮播图 1-顶部栏 2-本周强推 3-热门推荐 4-精品推荐")
+    private Integer type;
+
+    /**
+     * 推荐小说ID
+     */
+    @Schema(description = "小说ID")
+    private Long bookId;
+
+    /**
+     * 小说封面地址
+     */
+    @Schema(description = "小说封面地址")
+    private String picUrl;
+
+    /**
+     * 小说名
+     */
+    @Schema(description = "小说名")
+    private String bookName;
+
+    /**
+     * 作家名
+     */
+    @Schema(description = "作家名")
+    private String authorName;
+
+    /**
+     * 书籍描述
+     */
+    @Schema(description = "书籍描述")
+    private String bookDesc;
+
+}

+ 4 - 0
novel-demo/src/main/java/com/sf/service/IHomeBookService.java

@@ -1,8 +1,11 @@
 package com.sf.service;
 
+import com.sf.dto.resp.HomeBookRespDto;
 import com.sf.entity.HomeBook;
 import com.baomidou.mybatisplus.extension.service.IService;
 
+import java.util.List;
+
 /**
  * <p>
  * 小说推荐 服务类
@@ -13,4 +16,5 @@ import com.baomidou.mybatisplus.extension.service.IService;
  */
 public interface IHomeBookService extends IService<HomeBook> {
 
+    List<HomeBookRespDto> allHomeBook();
 }

+ 57 - 0
novel-demo/src/main/java/com/sf/service/impl/HomeBookServiceImpl.java

@@ -1,11 +1,21 @@
 package com.sf.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.sf.dto.resp.HomeBookRespDto;
+import com.sf.entity.BookInfo;
 import com.sf.entity.HomeBook;
+import com.sf.mapper.BookInfoMapper;
 import com.sf.mapper.HomeBookMapper;
 import com.sf.service.IHomeBookService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
 /**
  * <p>
  * 小说推荐 服务实现类
@@ -17,4 +27,51 @@ import org.springframework.stereotype.Service;
 @Service
 public class HomeBookServiceImpl extends ServiceImpl<HomeBookMapper, HomeBook> implements IHomeBookService {
 
+    @Autowired
+    private HomeBookMapper homeBookMapper;
+
+    @Autowired
+    private BookInfoMapper bookInfoMapper;
+
+    // 去到home_book表中取数据
+    // 再使用book_id去book_info表中找到关联数据
+    @Override
+    public List<HomeBookRespDto> allHomeBook() {
+        List<HomeBookRespDto> list = new ArrayList<>();
+
+        List<HomeBook> homeBookList = homeBookMapper.selectList(null);
+        // 取出所有的book_id
+        List<Long> bookIdList = new ArrayList<>();
+//        for (HomeBook homeBook : homeBookList) {
+//            bookIdList.add(homeBook.getBookId());
+//        }
+        homeBookList.forEach(homeBook -> {
+            bookIdList.add(homeBook.getBookId());
+        });
+
+        // 使用in
+        // select * from book_info where id in ('','','');
+        LambdaQueryWrapper<BookInfo> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.in(BookInfo::getId, bookIdList);
+        List<BookInfo> bookInfoList = bookInfoMapper.selectList(queryWrapper);
+        // Map<BookId,BookInfo>
+        // 使用了stream流的收集方法collect()  每一个BookInfo中的id作为key  每一个BookInfo自身作为value
+        Map<Long, BookInfo> collected =
+                bookInfoList.stream().collect(Collectors.toMap(BookInfo::getId, t -> t));
+
+        homeBookList.forEach(homeBook -> {
+            BookInfo bookInfo = collected.get(homeBook.getBookId());
+            HomeBookRespDto homeBookRespDto = HomeBookRespDto.builder()
+                    .type(homeBook.getType().intValue())  // byte -> int
+                    .bookId(homeBook.getBookId())
+                    .picUrl(bookInfo.getPicUrl())
+                    .bookName(bookInfo.getBookName())
+                    .authorName(bookInfo.getAuthorName())
+                    .bookDesc(bookInfo.getBookDesc())
+                    .build();
+            list.add(homeBookRespDto);
+        });
+
+        return list;
+    }
 }

+ 0 - 5
novel-demo/src/main/resources/application.properties

@@ -1,5 +0,0 @@
-spring.application.name=novel-demo
-
-spring.datasource.url=jdbc:mysql://localhost:3306/novel-cloud?useUnicode=true&characterEncoding=utf-8&allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=Asia/Shanghai
-spring.datasource.username=root
-spring.datasource.password=root123456

+ 16 - 0
novel-demo/src/main/resources/application.yml

@@ -0,0 +1,16 @@
+novel:
+  # 跨域配置
+  cors:
+    # 允许跨域的域名
+    allow-origins:
+      - http://localhost:1024
+      # - http://localhost:8080
+server:
+  port: 8888
+spring:
+  application:
+    name: novel-demo
+  datasource:
+    password: root123456
+    url: jdbc:mysql://localhost:3306/novel-cloud?useUnicode=true&characterEncoding=utf-8&allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=Asia/Shanghai
+    username: root

+ 9 - 0
novel-demo/src/test/java/com/sf/NovelDemoApplicationTests.java

@@ -2,6 +2,7 @@ package com.sf;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.sf.config.CorsProperties;
 import com.sf.entity.BookInfo;
 import com.sf.mapper.BookInfoMapper;
 import com.sf.service.IBookInfoService;
@@ -20,6 +21,9 @@ class NovelDemoApplicationTests {
     @Autowired
     private BookInfoMapper bookInfoMapper;
 
+    @Autowired
+    private CorsProperties corsProperties;
+
     @Test
     void contextLoads() {
 
@@ -60,4 +64,9 @@ class NovelDemoApplicationTests {
         System.out.println(bookInfos1);
     }
 
+    @Test
+    public void test1(){
+        System.out.println(corsProperties);
+    }
+
 }