AgileBoot

2022-10-26 21:00:34

本專案地址:

本專案說明:AgileBoot - 基於SpringBoot + Vue3的前後端快速開發腳手架

背景介紹

為什麼我們需要內建的資料庫和Redis呢?

優點:

  • 內建的資料庫H2,可以讓我們在無依賴資料庫的情況下,做整合測試。比如我們想測試新增一個學生到資料庫,就需要啟動一臺資料庫來驗證結果。然而使用H2內建資料庫的話,就可以在無依賴資料庫的情況下,進行驗證。
  • 資料庫H2是記憶體級的,如果有大量整合測試(IT:Integration Test)的話,可以縮短測試時間。
  • Embedded Redis同上,使我們在無依賴Redis的情況下,做測試。
  • 還有一個小優點,就是對於新手或者不熟悉後端的前端小夥伴來說,他們在可以不設定Mysql和Redis就直接把整個專案run起來~

缺點:

  • H2並不能相容所有資料庫的功能,比如函數,或者一些特殊索引之類的。使用H2的話,Mysql的表結構不能直接匯入,需要做一些調整。
  • Embeded Redis同樣不能完全相容真正的Redis, 一些特殊用法可能會出錯。

引入H2資料庫程式碼實現

1.引入內建的H2資料庫

因為我想做到使用H2直接啟動專案,所以scope設定為runtime,如果僅用H2做測試用的話,請設定成test

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>runtime</scope>
</dependency>

2.yml檔案內資料庫的設定,改成H2

# 資料來源設定
spring:
    datasource:
        #  驅動
        driver-class-name: org.h2.Driver
        # h2 記憶體資料庫 記憶體模式連線設定 庫名: agileboot
        url: jdbc:h2:mem:agileboot;DB_CLOSE_DELAY=-1
        h2:
            # 開啟console 存取 預設false
            console:
                enabled: true
                settings:
                    #      開啟h2 console 跟蹤 方便偵錯  預設 false
                    trace: true
                    #      允許console 遠端存取 預設false
                    web-allow-others: true
                #  h2 存取路徑上下文
                path: /h2-console

    sql:
        init:
            platform: mysql
            # 初始化資料
            schema-locations: classpath:h2sql/agileboot_schema.sql
            data-locations: classpath:h2sql/agileboot_data.sql

最後兩行是H2資料庫需要的資料庫結構和資料指令碼檔案,放置在resources資料夾下的h2sql目錄裡(你也可以放在其他目錄)
以下是樣本:
schema.sql

create table sys_config
(
    config_id       int auto_increment,
    config_name     varchar(128)  default '' not null comment '設定名稱',
    config_key      varchar(128)  default '' not null comment '設定鍵名',
    config_options  varchar(1024) default '' not null comment '可選的選項',
    config_value    varchar(256)  default '' not null comment '設定值',
    is_allow_change int              not null comment '是否允許修改',
    creator_id      int                   null comment '建立者ID',
    creator_name    varchar(64)   default '' null comment '建立者',
    updater_id      int                   null comment '更新者ID',
    updater_name    varchar(64)   default '' null comment '更新者',
    update_time     datetime                 null comment '更新時間',
    create_time     datetime                 null comment '建立時間',
    remark          varchar(128)             null comment '備註',
    deleted         int    default 0  not null comment '邏輯刪除'
);

data.sql

-- ----------------------------
-- Records of sys_config
-- ----------------------------
INSERT INTO `sys_config` VALUES ('1', '主框架頁-預設面板樣式名稱', 'sys.index.skinName', '["skin-blue","skin-green","skin-purple","skin-red","skin-yellow"]', 'skin-blue', '1', null, 'admin', null, '', '2022-08-28 22:12:19', '2022-05-21 08:30:55', '藍色 skin-blue、綠色 skin-green、紫色 skin-purple、紅色 skin-red、黃色 skin-yellow', '0');
INSERT INTO `sys_config` VALUES ('2', '使用者管理-賬號初始密碼', 'sys.user.initPassword', '', '1234567', '1', null, 'admin', null, '', '2022-08-28 21:54:19', '2022-05-21 08:30:55', '初始化密碼 123456', '0');
INSERT INTO `sys_config` VALUES ('3', '主框架頁-側邊欄主題', 'sys.index.sideTheme', '["theme-dark","theme-light"]', 'theme-dark', '1', null, 'admin', null, '', '2022-08-28 22:12:15', '2022-08-20 08:30:55', '深色主題theme-dark,淺色主題theme-light', '0');
INSERT INTO `sys_config` VALUES ('4', '賬號自助-驗證碼開關', 'sys.account.captchaOnOff', '["true","false"]', 'false', '0', null, 'admin', null, '', '2022-08-28 22:03:37', '2022-05-21 08:30:55', '是否開啟驗證碼功能(true開啟,false關閉)', '0');
INSERT INTO `sys_config` VALUES ('5', '賬號自助-是否開啟使用者註冊功能', 'sys.account.registerUser', '["true","false"]', 'true', '0', null, 'admin', '1', 'admin', '2022-10-05 22:18:57', '2022-05-21 08:30:55', '是否開啟註冊使用者功能(true開啟,false關閉)', '0');

這邊需要注意一點,H2只支援最簡單的建表語句。
比如索引、engine、charset、排序之類的都無法執行。以下是我Mysql的建表語句供你參考

CREATE TABLE `sys_config` (
  `config_id` int NOT NULL AUTO_INCREMENT COMMENT '引數主鍵',
  `config_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '設定名稱',
  `config_key` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '設定鍵名',
  `config_options` varchar(1024) NOT NULL DEFAULT '' COMMENT '可選的選項',
  `config_value` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '設定值',
  `is_allow_change` tinyint(1) NOT NULL COMMENT '是否允許修改',
  `creator_id` bigint DEFAULT NULL COMMENT '建立者ID',
  `creator_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '建立者',
  `updater_id` bigint DEFAULT NULL COMMENT '更新者ID',
  `updater_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新者',
  `update_time` datetime DEFAULT NULL COMMENT '更新時間',
  `create_time` datetime DEFAULT NULL COMMENT '建立時間',
  `remark` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '備註',
  `deleted` tinyint(1) NOT NULL DEFAULT '0' COMMENT '邏輯刪除',
  PRIMARY KEY (`config_id`),
  UNIQUE KEY `config_key_uniq_idx` (`config_key`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=100 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='引數設定表';

可以發現Mysql的建表語句需要刪除一部分特殊用法,才能在H2執行。H2的建表語句顯得很簡單。

3.yml中引入變數控制是否啟用H2資料庫

# 如果需要無Mysql  無Redis直接啟動的話  可以將這個引數置為true, 並且spring.profile.active: dev換成test
agileboot:
  embedded-test: false

因為專案可以選擇使用Mysql啟動也可以使用H2啟動,Spring的設定會有衝突。所以使用agileboot.embedded-test的值來決定啟動Mysql相關的Bean還是H2相關的Bean.
Spring提供了@ConditionalOnExpression註解基於條件來初始化bean


    @Bean
    @ConfigurationProperties("spring.datasource.druid.master")
    @ConditionalOnExpression("'${agileboot.embedded-test}' != 'true'")
    public DataSource masterDataSource(DruidProperties druidProperties) {
        DruidDataSource dataSource = DruidDataSourceBuilder.create().build();
        return druidProperties.dataSource(dataSource);
    }

引入內建Redis程式碼實現

1.引入依賴

<dependency>
   <groupId>it.ozimov</groupId>
    <artifactId>embedded-redis</artifactId>
    <version>0.7.3</version>
    <!-- 不排除掉slf4j的話 會衝突-->
    <exclusions>
        <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
        </exclusion>
    </exclusions>
</dependency>

2.引入Embedded Redis進行啟動

@Configuration
@ConditionalOnExpression("'${agileboot.embedded-test}' == 'true'")
public class EmbeddedRedisConfig {

    @Value("${spring.redis.port}")
    private Integer port;

    private RedisServer redisServer;


    @PostConstruct
    public void postConstruct() {
        RedisServer redisServer = RedisServer.builder().port(port)
            .setting("maxheap 32M")
            .setting("daemonize no")
            .setting("appendonly no").build();
        this.redisServer = redisServer;
        redisServer.start();
    }

    @PreDestroy
    public void preDestroy() {
        redisServer.stop();
    }

}

同理,我們使用agileboot.embedded-test的值來決定啟動內建的Redis.

該設計實現在AgileBoot專案內,有興趣的小夥伴可以專案down下來看下~
幾行指令即可run起前後端專案。
後端專案僅需把yml的這兩個設定改一下即可。

前後端全棧技術交流群:1398880

歡迎前後端萌新大佬加群討論~~