Prechádzať zdrojové kódy

1223 搭建微服务项目

Qing 1 rok pred
rodič
commit
4b683e49e4
22 zmenil súbory, kde vykonal 1075 pridanie a 0 odobranie
  1. 33 0
      novel-cloud-demo/.gitignore
  2. 49 0
      novel-cloud-demo/novel-book/pom.xml
  3. 20 0
      novel-cloud-demo/novel-book/src/main/java/com/sf/NovelBookApplication.java
  4. 21 0
      novel-cloud-demo/novel-book/src/main/java/com/sf/controller/ConfigController.java
  5. 10 0
      novel-cloud-demo/novel-book/src/main/resources/application.yml
  6. 9 0
      novel-cloud-demo/novel-book/src/main/resources/bootstrap.yml
  7. 38 0
      novel-cloud-demo/novel-book/src/test/java/com/sf/AppTest.java
  8. 106 0
      novel-cloud-demo/novel-core/pom.xml
  9. 97 0
      novel-cloud-demo/novel-core/src/main/java/com/sf/novel/core/constant/ApiRouterConsts.java
  10. 201 0
      novel-cloud-demo/novel-core/src/main/java/com/sf/novel/core/constant/DatabaseConsts.java
  11. 152 0
      novel-cloud-demo/novel-core/src/main/java/com/sf/novel/core/constant/ErrorCodeEnum.java
  12. 45 0
      novel-cloud-demo/novel-core/src/main/java/com/sf/novel/core/constant/SystemConfigConsts.java
  13. 87 0
      novel-cloud-demo/novel-core/src/main/java/com/sf/novel/core/resp/RestResp.java
  14. 7 0
      novel-cloud-demo/novel-core/src/main/resources/application-common.yml
  15. 11 0
      novel-cloud-demo/novel-core/src/main/resources/bootstrap-common.yml
  16. 34 0
      novel-cloud-demo/novel-home/pom.xml
  17. 14 0
      novel-cloud-demo/novel-home/src/main/java/com/sf/NovelHomeApplication.java
  18. 15 0
      novel-cloud-demo/novel-home/src/main/java/com/sf/controller/HomeController.java
  19. 6 0
      novel-cloud-demo/novel-home/src/main/resources/application.yml
  20. 5 0
      novel-cloud-demo/novel-home/src/main/resources/bootstrap.yml
  21. 38 0
      novel-cloud-demo/novel-home/src/test/java/com/sf/AppTest.java
  22. 77 0
      novel-cloud-demo/pom.xml

+ 33 - 0
novel-cloud-demo/.gitignore

@@ -0,0 +1,33 @@
+HELP.md
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+### VS Code ###
+.vscode/

+ 49 - 0
novel-cloud-demo/novel-book/pom.xml

@@ -0,0 +1,49 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.sf</groupId>
+        <artifactId>novel-cloud-demo</artifactId>
+        <version>0.0.1-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>novel-book</artifactId>
+    <packaging>jar</packaging>
+
+    <name>novel-book</name>
+    <url>http://maven.apache.org</url>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>3.8.1</version>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-bootstrap</artifactId>
+        </dependency>
+
+    </dependencies>
+</project>

+ 20 - 0
novel-cloud-demo/novel-book/src/main/java/com/sf/NovelBookApplication.java

@@ -0,0 +1,20 @@
+package com.sf;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+import org.springframework.context.ConfigurableApplicationContext;
+
+@EnableDiscoveryClient
+@SpringBootApplication
+public class NovelBookApplication {
+
+    public static void main(String[] args) {
+//        SpringApplication.run(NovelBookApplication.class, args);
+        // 应用程序的启动容器
+        ConfigurableApplicationContext applicationContext =
+                SpringApplication.run(NovelBookApplication.class, args);
+        String userName = applicationContext.getEnvironment().getProperty("user.name");
+        System.err.println("user name :"+userName);
+    }
+}

+ 21 - 0
novel-cloud-demo/novel-book/src/main/java/com/sf/controller/ConfigController.java

@@ -0,0 +1,21 @@
+package com.sf.controller;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.cloud.context.config.annotation.RefreshScope;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/config")
+@RefreshScope
+public class ConfigController {
+
+    @Value("${useLocalCache:false}")
+    private boolean useLocalCache;
+
+    @GetMapping("/get")
+    public boolean get() {
+        return useLocalCache;
+    }
+}

+ 10 - 0
novel-cloud-demo/novel-book/src/main/resources/application.yml

@@ -0,0 +1,10 @@
+server:
+  port: 18080
+
+spring:
+  cloud:
+    nacos:
+      discovery:
+        server-addr: 127.0.0.1:8848
+        username: nacos
+        password: nacos

+ 9 - 0
novel-cloud-demo/novel-book/src/main/resources/bootstrap.yml

@@ -0,0 +1,9 @@
+spring:
+  application:
+    name: novel-book-demo
+  cloud:
+    nacos:
+      config:
+        server-addr: 127.0.0.1:8848
+        username: nacos
+        password: nacos

+ 38 - 0
novel-cloud-demo/novel-book/src/test/java/com/sf/AppTest.java

@@ -0,0 +1,38 @@
+package com.sf;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+/**
+ * Unit test for simple App.
+ */
+public class AppTest 
+    extends TestCase
+{
+    /**
+     * Create the test case
+     *
+     * @param testName name of the test case
+     */
+    public AppTest( String testName )
+    {
+        super( testName );
+    }
+
+    /**
+     * @return the suite of tests being tested
+     */
+    public static Test suite()
+    {
+        return new TestSuite( AppTest.class );
+    }
+
+    /**
+     * Rigourous Test :-)
+     */
+    public void testApp()
+    {
+        assertTrue( true );
+    }
+}

+ 106 - 0
novel-cloud-demo/novel-core/pom.xml

@@ -0,0 +1,106 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.sf</groupId>
+        <artifactId>novel-cloud-demo</artifactId>
+        <version>0.0.1-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>novel-core</artifactId>
+
+    <properties>
+        <maven.compiler.source>17</maven.compiler.source>
+        <maven.compiler.target>17</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+    <dependencies>
+
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-openfeign</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-bootstrap</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+<!--            <scope>test</scope>-->
+        </dependency>
+
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <optional>true</optional>
+        </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>
+
+        <dependency>
+            <groupId>org.mybatis.spring.boot</groupId>
+            <artifactId>mybatis-spring-boot-starter</artifactId>
+            <version>3.0.3</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.mysql</groupId>
+            <artifactId>mysql-connector-j</artifactId>
+            <scope>runtime</scope>
+        </dependency>
+
+<!--        <dependency>-->
+<!--            <groupId>mysql</groupId>-->
+<!--            <artifactId>mysql-connector-java</artifactId>-->
+<!--            <version>5.1.49</version>-->
+<!--        </dependency>-->
+
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+            <version>3.5.4</version>
+        </dependency>
+
+    </dependencies>
+</project>

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

@@ -0,0 +1,97 @@
+package com.sf.novel.core.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;
+
+}

+ 201 - 0
novel-cloud-demo/novel-core/src/main/java/com/sf/novel/core/constant/DatabaseConsts.java

@@ -0,0 +1,201 @@
+package com.sf.novel.core.constant;
+
+import lombok.Getter;
+
+/**
+ * 数据库 常量
+ *
+ * @author xiongxiaoyang
+ * @date 2022/5/12
+ */
+public class DatabaseConsts {
+
+    /**
+     * 用户信息表
+     */
+    public static class UserInfoTable {
+
+        private UserInfoTable() {
+            throw new IllegalStateException(SystemConfigConsts.CONST_INSTANCE_EXCEPTION_MSG);
+        }
+
+        public static final String COLUMN_USERNAME = "username";
+
+    }
+
+    /**
+     * 用户反馈表
+     */
+    public static class UserFeedBackTable {
+
+        private UserFeedBackTable() {
+            throw new IllegalStateException(SystemConfigConsts.CONST_INSTANCE_EXCEPTION_MSG);
+        }
+
+        public static final String COLUMN_USER_ID = "user_id";
+
+    }
+
+    /**
+     * 用户书架表
+     */
+    public static class UserBookshelfTable {
+
+        private UserBookshelfTable() {
+            throw new IllegalStateException(SystemConfigConsts.CONST_INSTANCE_EXCEPTION_MSG);
+        }
+
+        public static final String COLUMN_USER_ID = "user_id";
+
+        public static final String COLUMN_BOOK_ID = "book_id";
+
+    }
+
+    /**
+     * 作家信息表
+     */
+    public static class AuthorInfoTable {
+
+        private AuthorInfoTable() {
+            throw new IllegalStateException(SystemConfigConsts.CONST_INSTANCE_EXCEPTION_MSG);
+        }
+
+        public static final String COLUMN_USER_ID = "user_id";
+
+    }
+
+    /**
+     * 小说类别表
+     */
+    public static class BookCategoryTable {
+
+        private BookCategoryTable() {
+            throw new IllegalStateException(SystemConfigConsts.CONST_INSTANCE_EXCEPTION_MSG);
+        }
+
+        public static final String COLUMN_WORK_DIRECTION = "work_direction";
+
+    }
+
+    /**
+     * 小说表
+     */
+    public static class BookTable {
+
+        private BookTable() {
+            throw new IllegalStateException(SystemConfigConsts.CONST_INSTANCE_EXCEPTION_MSG);
+        }
+
+        public static final String COLUMN_CATEGORY_ID = "category_id";
+
+        public static final String COLUMN_BOOK_NAME = "book_name";
+
+        public static final String AUTHOR_ID = "author_id";
+
+        public static final String COLUMN_VISIT_COUNT = "visit_count";
+
+        public static final String COLUMN_WORD_COUNT = "word_count";
+
+        public static final String COLUMN_LAST_CHAPTER_UPDATE_TIME = "last_chapter_update_time";
+
+    }
+
+    /**
+     * 小说章节表
+     */
+    public static class BookChapterTable {
+
+        private BookChapterTable() {
+            throw new IllegalStateException(SystemConfigConsts.CONST_INSTANCE_EXCEPTION_MSG);
+        }
+
+        public static final String COLUMN_BOOK_ID = "book_id";
+
+        public static final String COLUMN_CHAPTER_NUM = "chapter_num";
+
+        public static final String COLUMN_LAST_CHAPTER_UPDATE_TIME = "last_chapter_update_time";
+
+    }
+
+    /**
+     * 小说内容表
+     */
+    public static class BookContentTable {
+
+        private BookContentTable() {
+            throw new IllegalStateException(SystemConfigConsts.CONST_INSTANCE_EXCEPTION_MSG);
+        }
+
+        public static final String COLUMN_CHAPTER_ID = "chapter_id";
+
+    }
+
+    /**
+     * 小说评论表
+     */
+    public static class BookCommentTable {
+
+        private BookCommentTable() {
+            throw new IllegalStateException(SystemConfigConsts.CONST_INSTANCE_EXCEPTION_MSG);
+        }
+
+        public static final String COLUMN_BOOK_ID = "book_id";
+
+        public static final String COLUMN_USER_ID = "user_id";
+
+    }
+
+    /**
+     * 新闻内容表
+     */
+    public static class NewsContentTable {
+
+        private NewsContentTable() {
+            throw new IllegalStateException(SystemConfigConsts.CONST_INSTANCE_EXCEPTION_MSG);
+        }
+
+        public static final String COLUMN_NEWS_ID = "news_id";
+
+    }
+
+    /**
+     * 通用列枚举类
+     */
+    @Getter
+    public enum CommonColumnEnum {
+
+        ID("id"),
+        SORT("sort"),
+        CREATE_TIME("create_time"),
+        UPDATE_TIME("update_time");
+
+        private String name;
+
+        CommonColumnEnum(String name) {
+            this.name = name;
+        }
+
+    }
+
+
+    /**
+     * SQL语句枚举类
+     */
+    @Getter
+    public enum SqlEnum {
+
+        LIMIT_1("limit 1"),
+        LIMIT_2("limit 2"),
+        LIMIT_5("limit 5"),
+        LIMIT_30("limit 30"),
+        LIMIT_500("limit 500");
+
+        private String sql;
+
+        SqlEnum(String sql) {
+            this.sql = sql;
+        }
+
+    }
+
+}

+ 152 - 0
novel-cloud-demo/novel-core/src/main/java/com/sf/novel/core/constant/ErrorCodeEnum.java

@@ -0,0 +1,152 @@
+package com.sf.novel.core.constant;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 错误码枚举类。
+ * <p>
+ * 错误码为字符串类型,共 5 位,分成两个部分:错误产生来源+四位数字编号。 错误产生来源分为 A/B/C, A 表示错误来源于用户,比如参数错误,用户安装版本过低,用户支付 超时等问题; B
+ * 表示错误来源于当前系统,往往是业务逻辑出错,或程序健壮性差等问题; C 表示错误来源 于第三方服务,比如 CDN 服务出错,消息投递超时等问题;四位数字编号从 0001 到 9999,大类之间的
+ * 步长间距预留 100。
+ * <p>
+ * 错误码分为一级宏观错误码、二级宏观错误码、三级宏观错误码。 在无法更加具体确定的错误场景中,可以直接使用一级宏观错误码。
+ *
+ * @author xiongxiaoyang
+ * @date 2022/5/11
+ */
+@Getter
+@AllArgsConstructor
+public enum ErrorCodeEnum {
+
+    /**
+     * 正确执行后的返回
+     */
+    OK("00000", "一切 ok"),
+
+    /**
+     * 一级宏观错误码,用户端错误
+     */
+    USER_ERROR("A0001", "用户端错误"),
+
+    /**
+     * 二级宏观错误码,用户注册错误
+     */
+    USER_REGISTER_ERROR("A0100", "用户注册错误"),
+
+    /**
+     * 用户未同意隐私协议
+     */
+    USER_NO_AGREE_PRIVATE_ERROR("A0101", "用户未同意隐私协议"),
+
+    /**
+     * 注册国家或地区受限
+     */
+    USER_REGISTER_AREA_LIMIT_ERROR("A0102", "注册国家或地区受限"),
+
+    /**
+     * 用户验证码错误
+     */
+    USER_VERIFY_CODE_ERROR("A0240", "用户验证码错误"),
+
+    /**
+     * 用户名已存在
+     */
+    USER_NAME_EXIST("A0111", "用户名已存在"),
+
+    /**
+     * 用户账号不存在
+     */
+    USER_ACCOUNT_NOT_EXIST("A0201", "用户账号不存在"),
+
+    /**
+     * 用户密码错误
+     */
+    USER_PASSWORD_ERROR("A0210", "用户密码错误"),
+
+    /**
+     * 二级宏观错误码,用户请求参数错误
+     */
+    USER_REQUEST_PARAM_ERROR("A0400", "用户请求参数错误"),
+
+    /**
+     * 用户登录已过期
+     */
+    USER_LOGIN_EXPIRED("A0230", "用户登录已过期"),
+
+    /**
+     * 访问未授权
+     */
+    USER_UN_AUTH("A0301", "访问未授权"),
+
+    /**
+     * 用户请求服务异常
+     */
+    USER_REQ_EXCEPTION("A0500", "用户请求服务异常"),
+
+    /**
+     * 请求超出限制
+     */
+    USER_REQ_MANY("A0501", "请求超出限制"),
+
+    /**
+     * 用户评论异常
+     */
+    USER_COMMENT("A2000", "用户评论异常"),
+
+    /**
+     * 用户评论异常
+     */
+    USER_COMMENTED("A2001", "用户已发表评论"),
+
+    /**
+     * 作家发布异常
+     */
+    AUTHOR_PUBLISH("A3000", "作家发布异常"),
+
+    /**
+     * 小说名已存在
+     */
+    AUTHOR_BOOK_NAME_EXIST("A3001", "小说名已存在"),
+
+    /**
+     * 用户上传文件异常
+     */
+    USER_UPLOAD_FILE_ERROR("A0700", "用户上传文件异常"),
+
+    /**
+     * 用户上传文件类型不匹配
+     */
+    USER_UPLOAD_FILE_TYPE_NOT_MATCH("A0701", "用户上传文件类型不匹配"),
+
+    /**
+     * 一级宏观错误码,系统执行出错
+     */
+    SYSTEM_ERROR("B0001", "系统执行出错"),
+
+    /**
+     * 二级宏观错误码,系统执行超时
+     */
+    SYSTEM_TIMEOUT_ERROR("B0100", "系统执行超时"),
+
+    /**
+     * 一级宏观错误码,调用第三方服务出错
+     */
+    THIRD_SERVICE_ERROR("C0001", "调用第三方服务出错"),
+
+    /**
+     * 一级宏观错误码,中间件服务出错
+     */
+    MIDDLEWARE_SERVICE_ERROR("C0100", "中间件服务出错");
+
+    /**
+     * 错误码
+     */
+    private final String code;
+
+    /**
+     * 中文描述
+     */
+    private final String message;
+
+}

+ 45 - 0
novel-cloud-demo/novel-core/src/main/java/com/sf/novel/core/constant/SystemConfigConsts.java

@@ -0,0 +1,45 @@
+package com.sf.novel.core.constant;
+
+/**
+ * 系统配置相关常量
+ *
+ * @author xiongxiaoyang
+ * @date 2022/5/12
+ */
+public class SystemConfigConsts {
+
+    private SystemConfigConsts() {
+        throw new IllegalStateException(CONST_INSTANCE_EXCEPTION_MSG);
+    }
+
+    /**
+     * Http 请求认证 Header
+     */
+    public static final String HTTP_AUTH_HEADER_NAME = "Authorization";
+
+    /**
+     * 前台门户系统标识
+     */
+    public static final String NOVEL_FRONT_KEY = "front";
+
+    /**
+     * 作家管理系统标识
+     */
+    public static final String NOVEL_AUTHOR_KEY = "author";
+
+    /**
+     * 后台管理系统标识
+     */
+    public static final String NOVEL_ADMIN_KEY = "admin";
+
+    /**
+     * 图片上传目录
+     */
+    public static final String IMAGE_UPLOAD_DIRECTORY = "/image/";
+
+    /**
+     * 常量类实例化异常信息
+     */
+    public static final String CONST_INSTANCE_EXCEPTION_MSG = "Constant class";
+
+}

+ 87 - 0
novel-cloud-demo/novel-core/src/main/java/com/sf/novel/core/resp/RestResp.java

@@ -0,0 +1,87 @@
+package com.sf.novel.core.resp;
+
+import com.sf.novel.core.constant.ErrorCodeEnum;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+
+import java.util.Objects;
+
+/**
+ * Http Rest 响应工具及数据格式封装
+ *
+ * @author xiongxiaoyang
+ * @date 2022/5/11
+ */
+@Getter
+public class RestResp<T> {
+
+    /**
+     * 响应码
+     */
+    @Schema(description = "错误码,00000-没有错误")
+    private String code;
+
+    /**
+     * 响应消息
+     */
+    @Schema(description = "响应消息")
+    private String message;
+
+    /**
+     * 响应数据
+     */
+    @Schema(description = "响应数据")
+    private T data;
+
+    private RestResp() {
+        this.code = ErrorCodeEnum.OK.getCode();
+        this.message = ErrorCodeEnum.OK.getMessage();
+    }
+
+    private RestResp(ErrorCodeEnum errorCode) {
+        this.code = errorCode.getCode();
+        this.message = errorCode.getMessage();
+    }
+
+    private RestResp(T data) {
+        this();
+        this.data = data;
+    }
+
+    /**
+     * 业务处理成功,无数据返回
+     */
+    public static RestResp<Void> ok() {
+        return new RestResp<>();
+    }
+
+    /**
+     * 业务处理成功,有数据返回
+     */
+    public static <T> RestResp<T> ok(T data) {
+        return new RestResp<>(data);
+    }
+
+    /**
+     * 业务处理失败
+     */
+    public static RestResp<Void> fail(ErrorCodeEnum errorCode) {
+        return new RestResp<>(errorCode);
+    }
+
+
+    /**
+     * 系统错误
+     */
+    public static RestResp<Void> error() {
+        return new RestResp<>(ErrorCodeEnum.SYSTEM_ERROR);
+    }
+
+    /**
+     * 判断是否成功
+     */
+    public boolean isOk() {
+        return Objects.equals(this.code, ErrorCodeEnum.OK.getCode());
+    }
+
+}

+ 7 - 0
novel-cloud-demo/novel-core/src/main/resources/application-common.yml

@@ -0,0 +1,7 @@
+spring:
+  cloud:
+    nacos:
+      discovery:
+        server-addr: 127.0.0.1:8848
+        username: nacos
+        password: nacos

+ 11 - 0
novel-cloud-demo/novel-core/src/main/resources/bootstrap-common.yml

@@ -0,0 +1,11 @@
+spring:
+  cloud:
+    nacos:
+      config:
+        server-addr: 127.0.0.1:8848
+        username: nacos
+        password: nacos
+        file-extension: yml
+        extension-configs[0]:
+          data‐id: novel-mysql.yml
+          refresh: true

+ 34 - 0
novel-cloud-demo/novel-home/pom.xml

@@ -0,0 +1,34 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.sf</groupId>
+        <artifactId>novel-cloud-demo</artifactId>
+        <version>0.0.1-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>novel-home</artifactId>
+    <packaging>jar</packaging>
+
+    <name>novel-home</name>
+    <url>http://maven.apache.org</url>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>3.8.1</version>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>com.sf</groupId>
+            <artifactId>novel-core</artifactId>
+            <version>0.0.1-SNAPSHOT</version>
+        </dependency>
+    </dependencies>
+</project>

+ 14 - 0
novel-cloud-demo/novel-home/src/main/java/com/sf/NovelHomeApplication.java

@@ -0,0 +1,14 @@
+package com.sf;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+
+@SpringBootApplication
+@EnableDiscoveryClient
+public class NovelHomeApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(NovelHomeApplication.class, args);
+    }
+}

+ 15 - 0
novel-cloud-demo/novel-home/src/main/java/com/sf/controller/HomeController.java

@@ -0,0 +1,15 @@
+package com.sf.controller;
+
+import com.sf.novel.core.resp.RestResp;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+public class HomeController {
+
+    @GetMapping("/test")
+    public RestResp test(){
+        return null;
+    }
+
+}

+ 6 - 0
novel-cloud-demo/novel-home/src/main/resources/application.yml

@@ -0,0 +1,6 @@
+server:
+  port: 19090
+
+spring:
+  profiles:
+    include: common

+ 5 - 0
novel-cloud-demo/novel-home/src/main/resources/bootstrap.yml

@@ -0,0 +1,5 @@
+spring:
+  application:
+    name: novel-home-demo
+  profiles:
+    include: common

+ 38 - 0
novel-cloud-demo/novel-home/src/test/java/com/sf/AppTest.java

@@ -0,0 +1,38 @@
+package com.sf;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+/**
+ * Unit test for simple App.
+ */
+public class AppTest 
+    extends TestCase
+{
+    /**
+     * Create the test case
+     *
+     * @param testName name of the test case
+     */
+    public AppTest( String testName )
+    {
+        super( testName );
+    }
+
+    /**
+     * @return the suite of tests being tested
+     */
+    public static Test suite()
+    {
+        return new TestSuite( AppTest.class );
+    }
+
+    /**
+     * Rigourous Test :-)
+     */
+    public void testApp()
+    {
+        assertTrue( true );
+    }
+}

+ 77 - 0
novel-cloud-demo/pom.xml

@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>3.2.0</version>
+        <relativePath/> <!-- lookup parent from repository -->
+    </parent>
+
+    <groupId>com.sf</groupId>
+    <artifactId>novel-cloud-demo</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <packaging>pom</packaging>
+
+    <name>novel-cloud-demo</name>
+    <description>novel-cloud-demo</description>
+    <modules>
+        <module>novel-core</module>
+        <module>novel-book</module>
+        <module>novel-home</module>
+    </modules>
+    <properties>
+        <java.version>17</java.version>
+        <spring.cloud.version>2023.0.0</spring.cloud.version>
+        <spring.cloud.alibaba.version>2022.0.0.0-RC2</spring.cloud.alibaba.version>
+        <spring-cloud-starter-bootstrap.version>4.1.0</spring-cloud-starter-bootstrap.version>
+    </properties>
+
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.springframework.cloud</groupId>
+                <artifactId>spring-cloud-dependencies</artifactId>
+                <version>${spring.cloud.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+
+            <dependency>
+                <groupId>com.alibaba.cloud</groupId>
+                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
+                <version>${spring.cloud.alibaba.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+
+            <dependency>
+                <groupId>org.springframework.cloud</groupId>
+                <artifactId>spring-cloud-starter-bootstrap</artifactId>
+                <version>${spring-cloud-starter-bootstrap.version}</version>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+        </plugins>
+    </build>
+
+<!--    <repositories>-->
+<!--        <repository>-->
+<!--            <id>aliyunmaven</id>-->
+<!--            <name>阿里云公共仓库</name>-->
+<!--            <url>https://maven.aliyun.com/repository/public</url>-->
+<!--            <layout>default</layout>-->
+<!--            <snapshots>-->
+<!--                <enabled>false</enabled>-->
+<!--            </snapshots>-->
+<!--        </repository>-->
+<!--    </repositories>-->
+</project>