Qing 1 рік тому
батько
коміт
53b940909c

+ 6 - 0
novel-demo/pom.xml

@@ -123,6 +123,12 @@
             <version>2.15.3</version>
         </dependency>
 
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-amqp</artifactId>
+        </dependency>
+
+
     </dependencies>
 
     <build>

+ 38 - 0
novel-demo/src/main/java/com/sf/config/AmqpConfig.java

@@ -0,0 +1,38 @@
+package com.sf.config;
+
+import com.sf.constant.AmqpConsts;
+import org.springframework.amqp.core.Binding;
+import org.springframework.amqp.core.BindingBuilder;
+import org.springframework.amqp.core.FanoutExchange;
+import org.springframework.amqp.core.Queue;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class AmqpConfig {
+
+    /**
+     * 小说信息改变交换机
+     */
+    @Bean
+    public FanoutExchange bookChangeExchange() {
+        return new FanoutExchange(AmqpConsts.BookChangeMq.EXCHANGE_NAME);
+    }
+
+    /**
+     * Elasticsearch book 索引更新队列
+     */
+    @Bean
+    public Queue esBookUpdateQueue() {
+        return new Queue(AmqpConsts.BookChangeMq.QUEUE_ES_UPDATE);
+    }
+
+    /**
+     * Elasticsearch book 索引更新队列绑定到小说信息改变交换机
+     */
+    @Bean
+    public Binding esBookUpdateQueueBinding() {
+        return BindingBuilder.bind(esBookUpdateQueue()).to(bookChangeExchange());
+    }
+
+}

+ 97 - 0
novel-demo/src/main/java/com/sf/constant/ApiRouterConsts.java

@@ -0,0 +1,97 @@
+package com.sf.constant;
+
+/**
+ * API 路由常量
+ *
+ * @author xiongxiaoyang
+ * @date 2022/5/12
+ */
+public class ApiRouterConsts {
+
+    private ApiRouterConsts() {
+        throw new IllegalStateException(SystemConfigConsts.CONST_INSTANCE_EXCEPTION_MSG);
+    }
+
+    /**
+     * API请求路径前缀
+     */
+    public static final String API_URL_PREFIX = "/api";
+
+    /**
+     * 前台门户系统请求路径前缀
+     */
+    public static final String API_FRONT_URL_PREFIX = API_URL_PREFIX + "/front";
+
+    /**
+     * 作家管理系统请求路径前缀
+     */
+    public static final String API_AUTHOR_URL_PREFIX = API_URL_PREFIX + "/author";
+
+    /**
+     * 平台后台管理系统请求路径前缀
+     */
+    public static final String API_ADMIN_URL_PREFIX = API_URL_PREFIX + "/admin";
+
+    /**
+     * 首页模块请求路径前缀
+     */
+    public static final String HOME_URL_PREFIX = "/home";
+
+    /**
+     * 首页模块请求路径前缀
+     */
+    public static final String NEWS_URL_PREFIX = "/news";
+
+    /**
+     * 小说模块请求路径前缀
+     */
+    public static final String BOOK_URL_PREFIX = "/book";
+
+    /**
+     * 会员模块请求路径前缀
+     */
+    public static final String USER_URL_PREFIX = "/user";
+
+    /**
+     * 资源(图片/视频/文档)模块请求路径前缀
+     */
+    public static final String RESOURCE_URL_PREFIX = "/resource";
+
+    /**
+     * 搜索模块请求路径前缀
+     */
+    public static final String SEARCH_URL_PREFIX = "/search";
+
+    /**
+     * 前台门户首页API请求路径前缀
+     */
+    public static final String API_FRONT_HOME_URL_PREFIX = API_FRONT_URL_PREFIX + HOME_URL_PREFIX;
+
+    /**
+     * 前台门户新闻相关API请求路径前缀
+     */
+    public static final String API_FRONT_NEWS_URL_PREFIX = API_FRONT_URL_PREFIX + NEWS_URL_PREFIX;
+
+    /**
+     * 前台门户小说相关API请求路径前缀
+     */
+    public static final String API_FRONT_BOOK_URL_PREFIX = API_FRONT_URL_PREFIX + BOOK_URL_PREFIX;
+
+    /**
+     * 前台门户会员相关API请求路径前缀
+     */
+    public static final String API_FRONT_USER_URL_PREFIX = API_FRONT_URL_PREFIX + USER_URL_PREFIX;
+
+    /**
+     * 前台门户资源(图片/视频/文档)相关API请求路径前缀
+     */
+    public static final String API_FRONT_RESOURCE_URL_PREFIX =
+        API_FRONT_URL_PREFIX + RESOURCE_URL_PREFIX;
+
+    /**
+     * 前台门户搜索相关API请求路径前缀
+     */
+    public static final String API_FRONT_SEARCH_URL_PREFIX =
+        API_FRONT_URL_PREFIX + SEARCH_URL_PREFIX;
+
+}

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

@@ -1,6 +1,7 @@
 package com.sf.controller;
 
 import com.sf.common.resp.RestResp;
+import com.sf.dto.req.BookVisitReqDto;
 import com.sf.dto.resp.BookChapterRespDto;
 import com.sf.dto.resp.BookContentAboutRespDto;
 import com.sf.dto.resp.BookInfoRespDto;
@@ -60,4 +61,10 @@ public class BookInfoController {
         return bookInfoService.getBookById(bookId);
     }
 
+    @Operation(summary = "增加小说点击量接口")
+    @PostMapping("visit")
+    public RestResp<Void> addVisitCount(@Parameter(description = "小说ID")
+                                        @RequestBody BookVisitReqDto reqDto) {
+        return bookInfoService.addVisitCount(Long.valueOf(reqDto.getBookId()));
+    }
 }

+ 49 - 0
novel-demo/src/main/java/com/sf/controller/HomeController.java

@@ -0,0 +1,49 @@
+package com.sf.controller;
+
+import com.sf.common.resp.RestResp;
+import com.sf.constant.ApiRouterConsts;
+import com.sf.dto.resp.HomeBookRespDto;
+import com.sf.dto.resp.HomeFriendLinkRespDto;
+import com.sf.service.IHomeBookService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * 前台门户-首页模块 API 控制器
+ *
+ * @author xiongxiaoyang
+ * @date 2022/5/12
+ */
+@Tag(name = "HomeController", description = "前台门户-首页模块")
+@RestController
+@RequestMapping(ApiRouterConsts.API_FRONT_HOME_URL_PREFIX)
+@RequiredArgsConstructor
+public class HomeController {
+
+    private final IHomeBookService homeService;
+
+    /**
+     * 首页小说推荐查询接口
+     */
+    @Operation(summary = "首页小说推荐查询接口")
+    @GetMapping("books")
+    public RestResp<List<HomeBookRespDto>> listHomeBooks() {
+        return homeService.listHomeBooks();
+    }
+
+    /**
+     * 首页友情链接列表查询接口
+     */
+    @Operation(summary = "首页友情链接列表查询接口")
+    @GetMapping("friend_Link/list")
+    public RestResp<List<HomeFriendLinkRespDto>> listHomeFriendLinks() {
+        return homeService.listHomeFriendLinks();
+    }
+
+}

+ 8 - 0
novel-demo/src/main/java/com/sf/dto/req/BookVisitReqDto.java

@@ -0,0 +1,8 @@
+package com.sf.dto.req;
+
+import lombok.Data;
+
+@Data
+public class BookVisitReqDto {
+    private String bookId;
+}

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

@@ -0,0 +1,51 @@
+package com.sf.dto.resp;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * 首页小说推荐 响应DTO
+ *
+ * @author xiongxiaoyang
+ * @date 2022/5/13
+ */
+@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;
+
+}

+ 32 - 0
novel-demo/src/main/java/com/sf/dto/resp/HomeFriendLinkRespDto.java

@@ -0,0 +1,32 @@
+package com.sf.dto.resp;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * 首页友情链接 响应DTO
+ *
+ * @author xiongxiaoyang
+ * @date 2022/5/14
+ */
+@Data
+public class HomeFriendLinkRespDto implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 链接名
+     */
+    @Schema(description = "链接名")
+    private String linkName;
+
+    /**
+     * 链接url
+     */
+    @Schema(description = "链接url")
+    private String linkUrl;
+}

+ 47 - 0
novel-demo/src/main/java/com/sf/manager/AmqpMsgManager.java

@@ -0,0 +1,47 @@
+package com.sf.manager;
+
+import com.sf.constant.AmqpConsts;
+import lombok.RequiredArgsConstructor;
+import org.springframework.amqp.core.AmqpTemplate;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.support.TransactionSynchronization;
+import org.springframework.transaction.support.TransactionSynchronizationManager;
+
+@Component
+@RequiredArgsConstructor
+public class AmqpMsgManager {
+
+    private final AmqpTemplate amqpTemplate;
+
+    @Value("${spring.amqp.enabled:false}")
+    private boolean amqpEnabled;
+
+    /**
+     * 发送小说信息改变消息
+     */
+    public void sendBookChangeMsg(Long bookId) {
+        if (amqpEnabled) {
+            sendAmqpMessage(amqpTemplate, AmqpConsts.BookChangeMq.EXCHANGE_NAME, null, bookId);
+        }
+    }
+
+    private void sendAmqpMessage(AmqpTemplate amqpTemplate, String exchange, String routingKey,
+                                 Object message) {
+        System.out.println("rabbitmq run start");
+        // 如果在事务中则在事务执行完成后再发送,否则可以直接发送
+        if (TransactionSynchronizationManager.isActualTransactionActive()) {
+            TransactionSynchronizationManager.registerSynchronization(
+                    new TransactionSynchronization() {
+                        @Override
+                        public void afterCommit() {
+                            amqpTemplate.convertAndSend(exchange, routingKey, message);
+                        }
+                    });
+            return;
+        }
+        amqpTemplate.convertAndSend(exchange, routingKey, message);
+        System.out.println("rabbitmq run end");
+    }
+
+}

+ 0 - 12
novel-demo/src/main/java/com/sf/manager/cache/BookCacheManager.java

@@ -24,8 +24,6 @@ import org.springframework.stereotype.Component;
 //@RequiredArgsConstructor
 public class BookCacheManager {
 
-
-
     @Autowired
     private BookContentMapper bookContentMapper;
 
@@ -52,15 +50,6 @@ public class BookCacheManager {
                 .chapterWordCount(bookChapter.getWordCount())
                 .chapterUpdateTime(bookChapter.getUpdateTime()).build();
         BeanUtils.copyProperties(bookChapter,bookChapterDto);
-//        BookChapterRespDto bookChapterDto = BookChapterRespDto.builder()
-//                .id(chapterId)
-//                .bookId(bookChapter.getBookId())
-//                .chapterNum(bookChapter.getChapterNum().intValue())
-//                .chapterName(bookChapter.getChapterName())
-//                .chapterWordCount(bookChapter.getWordCount())
-////                .chapterUpdateTime(bookChapter.getUpdateTime())
-//                .isVip(bookChapter.getIsVip().intValue())
-//                .build();
         return bookChapterDto;
     }
 
@@ -70,5 +59,4 @@ public class BookCacheManager {
         // 调用此方法自动清除小说内容信息的缓存
     }
 
-
 }

+ 102 - 0
novel-demo/src/main/java/com/sf/po/HomeBook.java

@@ -0,0 +1,102 @@
+package com.sf.po;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * <p>
+ * 小说推荐
+ * </p>
+ *
+ * @author Qing
+ * @since 2023-12-19
+ */
+@TableName("home_book")
+@ApiModel(value = "HomeBook对象", description = "小说推荐")
+public class HomeBook implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @ApiModelProperty("推荐类型;0-轮播图 1-顶部栏 2-本周强推 3-热门推荐 4-精品推荐")
+    private Byte type;
+
+    @ApiModelProperty("推荐排序")
+    private Byte sort;
+
+    @ApiModelProperty("推荐小说ID")
+    private Long bookId;
+
+    @ApiModelProperty("创建时间")
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("更新时间")
+    private LocalDateTime updateTime;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Byte getType() {
+        return type;
+    }
+
+    public void setType(Byte type) {
+        this.type = type;
+    }
+
+    public Byte getSort() {
+        return sort;
+    }
+
+    public void setSort(Byte sort) {
+        this.sort = sort;
+    }
+
+    public Long getBookId() {
+        return bookId;
+    }
+
+    public void setBookId(Long bookId) {
+        this.bookId = bookId;
+    }
+
+    public LocalDateTime getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(LocalDateTime createTime) {
+        this.createTime = createTime;
+    }
+
+    public LocalDateTime getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(LocalDateTime updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    @Override
+    public String toString() {
+        return "HomeBook{" +
+            "id = " + id +
+            ", type = " + type +
+            ", sort = " + sort +
+            ", bookId = " + bookId +
+            ", createTime = " + createTime +
+            ", updateTime = " + updateTime +
+        "}";
+    }
+}

+ 7 - 0
novel-demo/src/main/java/com/sf/service/IBookInfoService.java

@@ -46,4 +46,11 @@ public interface IBookInfoService extends IService<BookInfo> {
      */
     RestResp<BookContentAboutRespDto> getBookContentAbout(Long chapterId);
 
+    /**
+     * 增加小说点击量
+     *
+     * @param bookId 小说ID
+     * @return 成功状态
+     */
+    RestResp<Void> addVisitCount(Long bookId);
 }

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

@@ -0,0 +1,34 @@
+package com.sf.service;
+
+import com.sf.common.resp.RestResp;
+import com.sf.dto.resp.HomeBookRespDto;
+import com.sf.dto.resp.HomeFriendLinkRespDto;
+import com.sf.po.HomeBook;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 小说推荐 服务类
+ * </p>
+ *
+ * @author Qing
+ * @since 2023-12-19
+ */
+public interface IHomeBookService extends IService<HomeBook> {
+
+    /**
+     * 查询首页小说推荐列表
+     *
+     * @return 首页小说推荐列表的 rest 响应结果
+     */
+    RestResp<List<HomeBookRespDto>> listHomeBooks();
+
+    /**
+     * 首页友情链接列表查询
+     *
+     * @return 友情链接列表
+     */
+    RestResp<List<HomeFriendLinkRespDto>> listHomeFriendLinks();
+}

+ 8 - 2
novel-demo/src/main/java/com/sf/service/impl/BookInfoServiceImpl.java

@@ -163,7 +163,7 @@ public class BookInfoServiceImpl extends ServiceImpl<BookInfoMapper, BookInfo> i
 //        String content = bookContent.getContent();
 
         // 查询小说信息
-//        BookInfoRespDto bookInfo = bookInfoCacheManager.getBookInfo(bookChapter.getBookId());
+//        BookInfoRespDto bookInfo = bookCacheManager.getBookInfo(bookChapter.getBookId());
         // 查询基础信息
         Long id = bookChapterDto.getBookId();
         BookInfo bookInfo = bookInfoMapper.selectById(id);
@@ -200,7 +200,6 @@ public class BookInfoServiceImpl extends ServiceImpl<BookInfoMapper, BookInfo> i
                 .build());
     }
 
-
     @Override
     public RestResp<List<BookChapterRespDto>> listChapters(Long bookId) {
         QueryWrapper<BookChapter> queryWrapper = new QueryWrapper<>();
@@ -219,4 +218,11 @@ public class BookInfoServiceImpl extends ServiceImpl<BookInfoMapper, BookInfo> i
     }
 
 
+    @Override
+    public RestResp<Void> addVisitCount(Long bookId) {
+        bookInfoMapper.addVisitCount(bookId);
+        return RestResp.ok();
+    }
+
+
 }

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

@@ -0,0 +1,92 @@
+package com.sf.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.sf.common.resp.RestResp;
+import com.sf.constant.DatabaseConsts;
+import com.sf.dto.resp.HomeBookRespDto;
+import com.sf.dto.resp.HomeFriendLinkRespDto;
+import com.sf.mapper.BookInfoMapper;
+import com.sf.po.BookInfo;
+import com.sf.po.HomeBook;
+import com.sf.mapper.HomeBookMapper;
+import com.sf.service.IHomeBookService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 小说推荐 服务实现类
+ * </p>
+ *
+ * @author Qing
+ * @since 2023-12-19
+ */
+@Service
+@RequiredArgsConstructor
+public class HomeBookServiceImpl extends ServiceImpl<HomeBookMapper, HomeBook> implements IHomeBookService {
+    private final HomeBookMapper homeBookMapper;
+
+    private final BookInfoMapper bookInfoMapper;
+
+    @Override
+    public RestResp<List<HomeBookRespDto>> listHomeBooks() {
+        // 从首页小说推荐表中查询出需要推荐的小说
+        QueryWrapper<HomeBook> queryWrapper = new QueryWrapper<>();
+        queryWrapper.orderByAsc(DatabaseConsts.CommonColumnEnum.SORT.getName());
+        List<HomeBook> homeBooks = homeBookMapper.selectList(queryWrapper);
+
+        // 获取推荐小说ID列表
+        if (!CollectionUtils.isEmpty(homeBooks)) {
+            List<Long> bookIds = homeBooks.stream()
+                    .map(HomeBook::getBookId)
+                    .toList();
+
+            // 根据小说ID列表查询相关的小说信息列表
+            QueryWrapper<BookInfo> bookInfoQueryWrapper = new QueryWrapper<>();
+            bookInfoQueryWrapper.in(DatabaseConsts.CommonColumnEnum.ID.getName(), bookIds);
+            List<BookInfo> bookInfos = bookInfoMapper.selectList(bookInfoQueryWrapper);
+
+            // 组装 HomeBookRespDto 列表数据并返回
+            if (!CollectionUtils.isEmpty(bookInfos)) {
+                Map<Long, BookInfo> bookInfoMap = bookInfos.stream()
+                        .collect(Collectors.toMap(BookInfo::getId, Function.identity()));
+                List<HomeBookRespDto> homeBookRespDtoList = homeBooks.stream().map(v -> {
+                    BookInfo bookInfo = bookInfoMap.get(v.getBookId());
+                    HomeBookRespDto bookRespDto = new HomeBookRespDto();
+                    bookRespDto.setType(v.getType().intValue());
+                    bookRespDto.setBookId(v.getBookId());
+                    bookRespDto.setBookName(bookInfo.getBookName());
+                    bookRespDto.setPicUrl(bookInfo.getPicUrl());
+                    bookRespDto.setAuthorName(bookInfo.getAuthorName());
+                    bookRespDto.setBookDesc(bookInfo.getBookDesc());
+                    return bookRespDto;
+                }).toList();
+                return RestResp.ok(homeBookRespDtoList);
+            }
+
+        }
+        return RestResp.ok(Collections.emptyList());
+    }
+
+    @Override
+    public RestResp<List<HomeFriendLinkRespDto>> listHomeFriendLinks() {
+        // 从友情链接表中查询出友情链接列表
+//        QueryWrapper<HomeFriendLink> queryWrapper = new QueryWrapper<>();
+//        queryWrapper.orderByAsc(DatabaseConsts.CommonColumnEnum.SORT.getName());
+//        List<HomeFriendLinkRespDto> friendLinkRespDtos =  friendLinkMapper.selectList(queryWrapper).stream().map(v -> {
+//            HomeFriendLinkRespDto respDto = new HomeFriendLinkRespDto();
+//            respDto.setLinkName(v.getLinkName());
+//            respDto.setLinkUrl(v.getLinkUrl());
+//            return respDto;
+//        }).toList();
+        return RestResp.ok(Collections.emptyList());
+    }
+}

+ 2 - 2
novel-demo/src/main/java/com/sf/util/GeneUtils.java

@@ -44,7 +44,7 @@ public class GeneUtils {
                             .serviceImpl("service.impl")
                             .mapper("mapper")
                             .xml("mapper.xml")
-                            .controller("controller")
+//                            .controller("controller")
 //                            .other("other")
 //                            .pathInfo(Collections.singletonMap(OutputFile.mapperXml, "D://"))
                             .build();
@@ -52,7 +52,7 @@ public class GeneUtils {
                 })
                 .strategyConfig(builder -> {
                     // sys_user  t_user   User  UserMapper  UserService
-                    builder.addInclude("book_chapter"); // 设置需要生成的表名
+                    builder.addInclude("home_book"); // 设置需要生成的表名
 //                            .addTablePrefix("t_", "c_"); // 设置过滤表前缀
                 })
                 .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板

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

@@ -1 +0,0 @@
-server.port=8888

+ 18 - 1
novel-demo/src/main/resources/application.yml

@@ -1,5 +1,5 @@
 server:
-  port: 19090
+  port: 8888
 
 spring:
   datasource:
@@ -11,6 +11,22 @@ spring:
       host: 127.0.0.1
       port: 6379
       password:
+      database: 1
+  amqp:
+    # 是否开启 Spring AMQP:true-开启 false-不开启
+    enabled: false
+    # RabbitMQ 配置
+    rabbitmq:
+      addresses: "amqp://guest:guest@127.0.0.1"
+      virtual-host: novel
+      template:
+        retry:
+          # 开启重试
+          enabled: true
+          # 最大重试次数
+          max-attempts: 3
+          # 第一次和第二次重试之间的持续时间
+          initial-interval: "3s"
 
 novel:
   # 跨域配置
@@ -19,6 +35,7 @@ novel:
     allow-origins:
       - http://localhost:1024
       - http://localhost:8080
+      - http://www.sf.com
 
 ---
 spring: