diff --git a/.github/docker/Dockerfile b/.github/docker/mysql/Dockerfile similarity index 90% rename from .github/docker/Dockerfile rename to .github/docker/mysql/Dockerfile index 68816cc..1c631d2 100644 --- a/.github/docker/Dockerfile +++ b/.github/docker/mysql/Dockerfile @@ -1,7 +1,7 @@ # 该镜像需要依赖的基础镜像 FROM eclipse-temurin:17.0.5_8-jre-jammy # 设置环境变量 -ENV TZ=Asia/Shanghai JAVA_OPTS="-Xms512m -Xmx512m -Dfile.encoding=utf-8" SPRING_CONFIG="--spring.profiles.active=prod" +ENV TZ=Asia/Shanghai JAVA_OPTS="-Xms512m -Xmx512m -Dfile.encoding=utf-8" SPRING_CONFIG="--spring.profiles.active=mysql" # 设置时区 RUN set -eux; \ ln -snf /usr/share/zoneinfo/$TZ /etc/localtime; \ diff --git a/.github/docker/sqlite/Dockerfile b/.github/docker/sqlite/Dockerfile new file mode 100644 index 0000000..2e7bdb9 --- /dev/null +++ b/.github/docker/sqlite/Dockerfile @@ -0,0 +1,14 @@ +# 该镜像需要依赖的基础镜像 +FROM eclipse-temurin:17.0.5_8-jre-jammy +# 设置环境变量 +ENV TZ=Asia/Shanghai JAVA_OPTS="-Xms512m -Xmx512m -Dfile.encoding=utf-8" SPRING_CONFIG="--spring.profiles.active=sqlite" +# 设置时区 +RUN set -eux; \ + ln -snf /usr/share/zoneinfo/$TZ /etc/localtime; \ + echo $TZ > /etc/timezone +# 拷贝jar包,并重命名 +COPY ./diyfile-system/target/diyfile-system.jar /diyfile-system.jar +# 指定docker容器启动时运行jar包 +ENTRYPOINT exec java ${JAVA_OPTS} -jar /diyfile-system.jar ${SPRING_CONFIG} +# 指定维护者的名字 +MAINTAINER besscroft diff --git a/.github/workflows/docker-buildx-mysql.yml b/.github/workflows/docker-buildx-mysql.yml new file mode 100644 index 0000000..6a618cb --- /dev/null +++ b/.github/workflows/docker-buildx-mysql.yml @@ -0,0 +1,43 @@ +name: "Java CI with MySql Multi-arch Docker Image" + +on: + push: + tags: + - 'v*' + +jobs: + docker: + name: Running Compile Java Multi-arch Docker Image + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Get Version + id: get_version + run: echo ::set-output name=VERSION::${GITHUB_REF#refs/tags/} + - name: Setup Java + uses: actions/setup-java@v3 + with: + java-version: '17' + distribution: 'temurin' + cache: 'maven' + - name: Build with Maven + run: mvn -B package -Dmaven.test.skip=true --file pom.xml + - name: Login to Docker Hub + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Set up QEMU + uses: docker/setup-qemu-action@v2 + - name: Set up Docker Buildx + id: buildx + uses: docker/setup-buildx-action@v2 + - name: Build and push diyfile-mysql version + id: docker_build_xanadu_version + uses: docker/build-push-action@v3 + with: + context: ./ + file: ./.github/docker/mysql/Dockerfile + platforms: linux/amd64,linux/arm64,linux/arm/v7,linux/ppc64le,linux/s390x + push: true + tags: ${{ secrets.DOCKERHUB_USERNAME }}/diyfile:${{ steps.get_version.outputs.VERSION }}-mysql diff --git a/.github/workflows/docker-buildx-test.yml b/.github/workflows/docker-buildx-test.yml index 8f4bb5b..9f98baf 100644 --- a/.github/workflows/docker-buildx-test.yml +++ b/.github/workflows/docker-buildx-test.yml @@ -1,4 +1,4 @@ -name: "Java CI with Multi-arch Docker Image Test" +name: "Java CI with Multi-arch Docker Test Image" on: push: @@ -32,12 +32,21 @@ jobs: - name: Set up Docker Buildx id: buildx uses: docker/setup-buildx-action@v2 - - name: Build and push diyfile test + - name: Build and push diyfile sqlite test id: docker_build_xanadu_test uses: docker/build-push-action@v3 with: context: ./ - file: ./.github/docker/Dockerfile + file: ./.github/docker/sqlite/Dockerfile platforms: linux/amd64,linux/arm64,linux/arm/v7,linux/ppc64le,linux/s390x push: true - tags: ${{ secrets.DOCKERHUB_USERNAME }}/diyfile:test + tags: ${{ secrets.DOCKERHUB_USERNAME }}/diyfile:test-sqlite + - name: Build and push diyfile mysql test + id: docker_build_xanadu_test + uses: docker/build-push-action@v3 + with: + context: ./ + file: ./.github/docker/mysql/Dockerfile + platforms: linux/amd64,linux/arm64,linux/arm/v7,linux/ppc64le,linux/s390x + push: true + tags: ${{ secrets.DOCKERHUB_USERNAME }}/diyfile:test-mysql diff --git a/.github/workflows/docker-buildx.yml b/.github/workflows/docker-buildx.yml index a3adbb1..fcc3692 100644 --- a/.github/workflows/docker-buildx.yml +++ b/.github/workflows/docker-buildx.yml @@ -1,4 +1,4 @@ -name: "Java CI with Multi-arch Docker Image" +name: "Java CI with Sqlite Multi-arch Docker Image" on: push: @@ -37,7 +37,7 @@ jobs: uses: docker/build-push-action@v3 with: context: ./ - file: ./.github/docker/Dockerfile + file: ./.github/docker/sqlite/Dockerfile platforms: linux/amd64,linux/arm64,linux/arm/v7,linux/ppc64le,linux/s390x push: true tags: ${{ secrets.DOCKERHUB_USERNAME }}/diyfile:${{ steps.get_version.outputs.VERSION }} @@ -46,7 +46,7 @@ jobs: uses: docker/build-push-action@v3 with: context: ./ - file: ./.github/docker/Dockerfile + file: ./.github/docker/sqlite/Dockerfile platforms: linux/amd64,linux/arm64,linux/arm/v7,linux/ppc64le,linux/s390x push: true tags: ${{ secrets.DOCKERHUB_USERNAME }}/diyfile:latest diff --git a/diyfile-common/src/main/java/com/besscroft/diyfile/common/entity/BaseEntity.java b/diyfile-common/src/main/java/com/besscroft/diyfile/common/entity/BaseEntity.java index 2992c30..bcc823d 100644 --- a/diyfile-common/src/main/java/com/besscroft/diyfile/common/entity/BaseEntity.java +++ b/diyfile-common/src/main/java/com/besscroft/diyfile/common/entity/BaseEntity.java @@ -26,12 +26,12 @@ public class BaseEntity implements Serializable { /** 创建者 */ @Schema(title = "创建者", type = "String") - @TableField(fill = FieldFill.INSERT) + @TableField(fill = FieldFill.INSERT, value = "creator") private String creator; /** 更新者 */ @Schema(title = "更新者", type = "String") - @TableField(fill = FieldFill.INSERT_UPDATE) + @TableField(fill = FieldFill.INSERT_UPDATE, value = "updater") private String updater; /** 创建时间 */ @@ -39,7 +39,7 @@ public class BaseEntity implements Serializable { @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") @JsonDeserialize(using = LocalDateTimeDeserializer.class) @JsonSerialize(using = LocalDateTimeSerializer.class) - @TableField(fill = FieldFill.INSERT) + @TableField(fill = FieldFill.INSERT, value = "create_time") private LocalDateTime createTime; /** 更新时间 */ @@ -47,7 +47,7 @@ public class BaseEntity implements Serializable { @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") @JsonDeserialize(using = LocalDateTimeDeserializer.class) @JsonSerialize(using = LocalDateTimeSerializer.class) - @TableField(fill = FieldFill.INSERT_UPDATE) + @TableField(fill = FieldFill.INSERT_UPDATE, value = "update_time") private LocalDateTime updateTime; /** diff --git a/diyfile-common/src/main/java/com/besscroft/diyfile/common/handler/LocalDateTimeTypeHandlerInjector.java b/diyfile-common/src/main/java/com/besscroft/diyfile/common/handler/LocalDateTimeTypeHandlerInjector.java new file mode 100644 index 0000000..9d56a69 --- /dev/null +++ b/diyfile-common/src/main/java/com/besscroft/diyfile/common/handler/LocalDateTimeTypeHandlerInjector.java @@ -0,0 +1,40 @@ +package com.besscroft.diyfile.common.handler; + +import cn.hutool.core.convert.Convert; +import org.apache.ibatis.type.JdbcType; +import org.apache.ibatis.type.LocalDateTimeTypeHandler; +import org.apache.ibatis.type.MappedJdbcTypes; +import org.apache.ibatis.type.MappedTypes; +import org.springframework.stereotype.Component; + +import java.sql.CallableStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.time.LocalDateTime; + +/** + * @Description LocalDateTime 类型处理器 + * @Author Bess Croft + * @Date 2023/3/2 22:24 + */ +@Component +@MappedTypes(LocalDateTime.class) +@MappedJdbcTypes(value = JdbcType.TIMESTAMP, includeNullJdbcType = true) +public class LocalDateTimeTypeHandlerInjector extends LocalDateTimeTypeHandler { + + @Override + public LocalDateTime getNullableResult(ResultSet rs, String columnName) throws SQLException { + return Convert.toLocalDateTime(rs.getObject(columnName)); + } + + @Override + public LocalDateTime getNullableResult(ResultSet rs, int columnIndex) throws SQLException { + return Convert.toLocalDateTime(rs.getObject(columnIndex)); + } + + @Override + public LocalDateTime getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { + return Convert.toLocalDateTime(cs.getObject(columnIndex)); + } + +} diff --git a/diyfile-system/pom.xml b/diyfile-system/pom.xml index 4e8ff0b..64e98d4 100644 --- a/diyfile-system/pom.xml +++ b/diyfile-system/pom.xml @@ -19,10 +19,14 @@ diyfile-common ${revision} - + - mysql - mysql-connector-java + com.mysql + mysql-connector-j + + + org.xerial + sqlite-jdbc diff --git a/diyfile-system/src/main/resources/application-dev.yml b/diyfile-system/src/main/resources/application-dev.yml index c8d83ea..33bf7ff 100644 --- a/diyfile-system/src/main/resources/application-dev.yml +++ b/diyfile-system/src/main/resources/application-dev.yml @@ -1,6 +1,6 @@ spring: datasource: - driverClassName: com.mysql.jdbc.Driver + driverClassName: com.mysql.cj.jdbc.Driver url: jdbc:mysql://${DB_URL:localhost:3306}/${DB_NAME:diyfile}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=${DB_SSL:false} username: ${DB_USERNAME:root} password: ${DB_PASSWORD:666666} @@ -32,6 +32,9 @@ mybatis: # mybatis-plus 配置 mybatis-plus: + # 启动 mybatis 本身的 log 日志,但是不建议在生产环境使用,这里仅在开发环境启用,方便排查问题! + configuration: + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl global-config: db-config: logic-delete-field: del # 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2) diff --git a/diyfile-system/src/main/resources/application-prod.yml b/diyfile-system/src/main/resources/application-mysql.yml similarity index 98% rename from diyfile-system/src/main/resources/application-prod.yml rename to diyfile-system/src/main/resources/application-mysql.yml index 3e17fb0..38c7442 100644 --- a/diyfile-system/src/main/resources/application-prod.yml +++ b/diyfile-system/src/main/resources/application-mysql.yml @@ -1,6 +1,6 @@ spring: datasource: - driverClassName: com.mysql.jdbc.Driver + driverClassName: com.mysql.cj.jdbc.Driver url: jdbc:mysql://${DB_URL:localhost:3306}/${DB_NAME:diyfile}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=${DB_SSL:false} username: ${DB_USERNAME:root} password: ${DB_PASSWORD:666666} diff --git a/diyfile-system/src/main/resources/application-sqlite.yml b/diyfile-system/src/main/resources/application-sqlite.yml new file mode 100644 index 0000000..89e900f --- /dev/null +++ b/diyfile-system/src/main/resources/application-sqlite.yml @@ -0,0 +1,93 @@ +spring: + datasource: + driverClassName: org.sqlite.JDBC + url: jdbc:sqlite:doc/data/diyfile.db?date_string_format=yyyy-MM-dd HH:mm:ss + hikari: + # 连接池最大连接数 + maximum-pool-size: 20 + # 空闲时保持最小连接数 + minimum-idle: 5 + # 空闲连接存活时间 + idle-timeout: 300000 + # 连接超时时间 + connection-timeout: 5000 + # 检测连接是否有效 + connection-test-query: select 1 + # 缓存 + cache: + type: CAFFEINE + caffeine: + spec: maximumSize=500,initialCapacity=100,expireAfterAccess=600s + +# MyBatis配置 +mybatis: + # 搜索指定包别名 + typeAliasesPackage: com.besscroft.diyfile.common.entity + # 配置mapper的扫描,找到所有的mapper.xml映射文件 + mapperLocations: classpath*:mapper/*Mapper.xml + configuration: + cache-enabled: false + +# mybatis-plus 配置 +mybatis-plus: + global-config: + db-config: + logic-delete-field: del # 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2) + logic-delete-value: 0 # 逻辑已删除值(默认为 1) + logic-not-delete-value: 1 # 逻辑未删除值(默认为 0) + +# Actuator 配置 +management: + endpoints: + web: + exposure: + # 监控项配置 + include: '*' + endpoint: + health: + # 开启显示全部细节 + show-details: always + shutdown: + # 启用接口关闭 SpringBoot + enabled: false + # Micrometer 配置 + metrics: + tags: + application: ${spring.application.name} + +# SpringDoc 配置 +springdoc: + api-docs: + enabled: ${DOC_ENABLE:false} + path: "/api-docs" + swagger-ui: + enabled: ${DOC_ENABLE:false} + path: "/swagger-ui.html" + # 配置扫描的包 + packagesToScan: com.besscroft.diyfile.controller + show-actuator: false + cache: + disabled: false + pre-loading-enabled: true + +sa-token: + # token名称 (同时也是cookie名称) + token-name: Authorization + # token前缀 + token-prefix: Bearer + # token有效期,单位s 默认30天, -1代表永不过期 + timeout: 2592000 + # token临时有效期 (指定时间内无操作就视为token过期) 单位: 秒 + activity-timeout: -1 + # 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录) + is-concurrent: true + # 在多人登录同一账号时,是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token) + is-share: true + # token风格 + token-style: uuid + # 是否输出操作日志 + is-log: false + # Cookie配置 + is-read-cookie: false + # logo打印 + isPrint: false diff --git a/diyfile-system/src/main/resources/mapper/StorageMapper.xml b/diyfile-system/src/main/resources/mapper/StorageMapper.xml index 2e30e12..d1fda36 100644 --- a/diyfile-system/src/main/resources/mapper/StorageMapper.xml +++ b/diyfile-system/src/main/resources/mapper/StorageMapper.xml @@ -134,8 +134,8 @@ remark, creator, updater, - create_time, - update_time, + date(create_time), + date(update_time), del FROM storage diff --git a/doc/data/diyfile.db b/doc/data/diyfile.db new file mode 100644 index 0000000..49b274e Binary files /dev/null and b/doc/data/diyfile.db differ diff --git a/pom.xml b/pom.xml index af7e85e..8ee345a 100644 --- a/pom.xml +++ b/pom.xml @@ -27,7 +27,6 @@ 3.0.2 1.5.3.Final 0.2.0 - 5.1.49 3.5.3.1 2.0.2 1.34.0 @@ -95,12 +94,6 @@ mapstruct ${mapstruct.version} - - - mysql - mysql-connector-java - ${mysql.version} - com.baomidou @@ -187,17 +180,17 @@ - + test - test + mysql - + prod - prod + sqlite