Skip to content

SpringBoot 2.7 + Vue3 フロントエンド・バックエンド分離の高速開発フレームワーク

プロジェクト概要

本プロジェクトは、継続的に更新される完全無料のオープンソースエンタープライズ級アプリケーション開発フレームワークであり、フロントエンドとバックエンドの分離アーキテクチャを採用し、業務開発における非機能要件のサポート向上に焦点を当てています。フロントエンドはVueとElement UIに基づいて構築され、バックエンドはSpring Boot、Spring Security、Redis、JWTなどの技術スタックを採用し、完全な権限認証メカニズムを統合し、マルチ端末ログインと身元認証をサポートしています。

システムはインターネットシナリオ向けに設計され、BtoBとBtoCの両方のユーザーニーズに対応し、高い拡張性と適応性を備えています。エンタープライズ開発で一般的に使用されるミドルウェアとコンポーネントをプラグイン方式で統合し、モジュール設計は高凝集・低結合の原則に従い、構造が明確で拡張が容易です。コードは規範的で整理され、アーキテクチャは簡潔明瞭であり、学習参考に適しているだけでなく、企業の実際のプロジェクト開発にも使用できます。

組み込みモジュール

  1. ユーザー管理:システム操作者を管理し、ユーザーアカウントの作成、権限割り当て、情報維持を完了します。

  2. 部門管理:会社、部門の多階層組織構造を設定し、ツリー構造で直感的に表示し、データ権限による分離をサポートします。

  3. メニュー管理:システムナビゲーションメニュー、操作機能権限、ボタンレベルの権限識別子を設定し、詳細なアクセス制御を実現します。

  4. ロール管理:異なるロールにメニューと操作権限を割り当て、組織構造に基づくデータ権限範囲の分割をサポートします。

  5. 辞書管理:システムで頻繁に使用され比較的固定された分類、タグなどの基本データを維持し、データの一貫性と保守性を向上させます。

  6. パラメータ管理:システムの実行に必要な動的パラメータを集中設定・管理し、リアルタイム調整と即時適用をサポートします。

  7. 通知公告:システム内の通知と公告情報を発行・維持し、ユーザーが重要な動向をタイムリーに取得できるようにします。

  8. 操作ログ:システムの正常な操作ログと異常情報ログを記録・照会し、監査と障害調査を容易にします。

  9. ログインログ:ユーザーのログイン記録を照会し、成功および異常なログイン行動を含み、システムの安全な管理を保証します。

  10. オンラインユーザー:システム内の現在アクティブなユーザーのログイン状態と操作行動をリアルタイムで監視します。

開発説明

実行環境

ツールバージョン
Java8 +
Maven3.6.3 +
Redis5 +
PostgreSQL12.16
IDEIDEA、Eclipse 、VS Code等

プロジェクト構造

├── java
│   └── net
│       └── vjsp
│           ├── common				-- 	共通ファイル
│           │   ├── constant			--	グローバル定数
│           │   ├── enums				--	グローバル列挙型 
│           │   ├── exception			--	グローバル例外
│           │   ├── model				--	共通カプセル化オブジェクトエンティティ
│           │   └── util				-- 	静的ユーティリティクラス
│           ├── framework			--	システムフレームワーク
│           │   ├── aspectj				--	業務アノテーション
│           │   │   ├── annotation		--  アノテーション実装
│           │   ├── config				--	設定クラス
│           │   ├── filter				--	フィルター
│           │   ├── handler				--	設定ファイルで参照される実行ハンドラ
│           │   ├── model				--	フレームワークオブジェクトエンティティ
│           │   ├── security			--	権限フレームワークコンポーネントと実装
│           │   └── service				--	グローバル動的ユーティリティクラスと共通メソッド
│           ├── modules				--	業務モジュール
│           │   ├── controller			--	コントローラ層
│           │   ├── domain				--	エンティティクラス
│           │   │   ├── convert			--	変換クラス、階層間連携伝達用
│           │   │   ├── dto				--	サードパーティ呼び出しデータカプセル化
│           │   │   ├── form			--	送信フォームオブジェクト
│           │   │   ├── po				--	永続層オブジェクト
│           │   │   ├── query			--	クエリオブジェクト
│           │   │   └── vo				--	クエリリストエンティティ
│           │   ├── mapper				--	永続化実装
│           │   └── service				--	業務ロジック実装
│           ├── system				--	システムモジュール
│           │   ├── common				--	共通コントローラ層:ログイン、アップロード、ダウンロード、認証コード
│           │   ├── controller			--	コントローラ層
│           │   ├── domain				--	エンティティクラス
│           │   │   ├── convert			--	変換クラス、階層間連携伝達用
│           │   │   ├── dto				--	サードパーティ呼び出しデータカプセル化
│           │   │   ├── form			--	送信フォームオブジェクト
│           │   │   ├── po				--	永続層オブジェクト
│           │   │   ├── query			--	クエリオブジェクト
│           │   │   └── vo				--	クエリリストエンティティ
│           │   ├── mapper				--	永続化実装
│           │   └── service				--	業務ロジック実装
│           ├── workflow			--	ワークフロー		
│           └── VjspApplication.java	--	システム起動クラス	
└── resources							--	設定ファイル

構造規範

第一階層パッケージパス説明
common共通ファイルパッケージ、グローバル変数、例外クラス、列挙型クラス、静的ユーティリティクラスなど業務に関係ないグローバルファイル
frameworkシステムファイルパッケージ、権限フレームワーク、設定ファイル、インターセプター、依存性注入ユーティリティクラス
systemシステムモジュール、ユーザー、ロール、メニュー、ログ、ログインなど
modules業務モジュール、システム組み込みモジュール以外のその他の機能モジュール
workflowワークフローモジュール
resources設定ファイル

Maven規範

springbootメインバージョンが提供する依存jarパッケージを使用する場合、バージョン番号を記述する必要はありません。springbootメインバージョンが提供しない依存jarパッケージの場合、バージョン番号の宣言はプロパティファイルに抽出されます。

現在のシステムで使用されているspringbootメインバージョンが提供しない依存jarパッケージは以下の通りです:

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <skipTests>true</skipTests>
    <java.version>1.8</java.version>
    <mapstruct.version>1.5.1.Final</mapstruct.version>
    <springdoc.version>1.7.0</springdoc.version>
    <postgresql.version>42.2.20</postgresql.version>
    <mybatis-plus-boot-starter.version>3.5.1</mybatis-plus-boot-starter.version>
    <commons.io.version>2.19.0</commons.io.version>
    <jasypt.version>3.0.5</jasypt.version>
    <bcprov.version>1.73</bcprov.version>
    <poi.version>4.1.2</poi.version>
    <jjwt.version>0.9.0</jjwt.version>
    <fastjson.version>2.0.58</fastjson.version>
    <fastdfs.version>1.27.2</fastdfs.version>
    <s3.version>1.11.792</s3.version>
</properties>

spring-boot-starter-parentバージョン番号:2.7.0、他のバージョンへの変更は推奨されません。設定の互換性の問題が存在する可能性があります。

JARパッケージリスト

名称バージョン用途
spring-boot2.7.0フレームワークメインバージョン
spring-boot-starter-webメインフレームワークバージョンと同じWebコンテナ
spring-boot-starter-testメインフレームワークバージョンと同じテスト
spring-boot-configuration-processorメインフレームワークバージョンと同じメタデータ補完
spring-boot-starter-aopメインフレームワークバージョンと同じインターセプター
spring-boot-devtoolsメインフレームワークバージョンと同じホットコンパイルツール
spring-boot-starter-securityメインフレームワークバージョンと同じセキュリティ認証
spring-boot-starter-data-redisメインフレームワークバージョンと同じデータキャッシュ
spring-boot-starter-validationメインフレームワークバージョンと同じ検証フレームワーク
lombok1.18.24開発ツールライブラリ
mybatis-plus-boot-starter3.5.1永続層フレームワーク
mybatis-plus-extension3.5.1永続層フレームワーク
mybatis-plus3.5.1永続層フレームワーク
postgresql42.3.5データベースドライバ
springdoc-openapi-ui1.7.0ドキュメントツール
springdoc-openapi-security1.7.0ドキュメントツール
jasypt-spring-boot-starter3.0.5設定暗号化ツール
bcprov-jdk15to181.73暗号化ライブラリ
fastjson22.0.58jsonパーサー
mapstruct1.5.1.Finalコード生成ツール
mapstruct-processor1.5.1.Finalコード生成ツール
poi-ooxml4.1.2excelツール
commons-io2.19.0常用ユーティリティクラス
commons-lang33.12.0常用ユーティリティクラス
jjwt0.9.0JWTサポート
fastdfs-client1.27.2ファイルストレージ
aws-java-sdk-s31.11.792ファイルストレージ

命名規範

すべてのオブジェクトクラス名はパスカルケース(PascalCase)を使用し、アンダースコア、キャメルケース、略語などの非標準命名は許可されません。

オブジェクト使用シーン命名規範
FormフロントエンドのPOST/PUTリクエストのJSONデータを受信、@Validated検証と連携Formで終了
DTOサービス間呼び出し、複雑なロジックカプセル化または階層間データ伝送用DTOを接尾辞
PO永続層オブジェクト、MyBatisマッピングPOを接尾辞
Queryページングクエリ条件をカプセル化、BaseQueryを継承必須Queryを接尾辞
VOフロントエンドに返すデータビューオブジェクトVOを接尾辞
ConvertPO ↔ DTO ↔ VO 間の変換を担当 (MapStruct実装)Convertを接尾辞
Mapper永続層、データベース操作メソッドを定義Mapperを接尾辞
Service業務ロジックインターフェースServiceを接尾辞
ServiceImpl業務ロジック実装クラス、Mapperを呼び出し、トランザクションを処理ServiceImplを接尾辞
ControllerRESTful APIインターフェースを提供、Serviceを呼び出し、CommonResult<?>を返すControllerを接尾辞
FilterフィルターオブジェクトFilterを接尾辞
Configシステム設定クラスオブジェクトConfigを接尾辞
Aspectロジックアスペクト実装オブジェクトAspectを接尾辞
Propertiesプロパティ設定ファイルPropertiesを接尾辞
Constants定数オブジェクトConstantsを接尾辞
Enum列挙型オブジェクトEnumを接尾辞

インターフェース規範

RESTful APIを設計する際に従うべき主要な規範

  • GET /users/123 -> IDが123のユーザー情報を取得。
  • POST /users -> 新しいユーザーを作成。
  • PUT /users/123 -> IDが123のユーザー情報を完全更新。
  • DELETE /users/123 -> IDが123のユーザーを削除。

API命名規範

リソース命名規則:リソースは名詞でなければならず、動詞は許可されません。

メソッド命名規則:

  • POST save -> 新規追加メソッド
  • DELETE remove -> 削除メソッド
  • DELETE batchRemove -> 一括削除メソッド
  • UPDATE edit -> 修正メソッド
  • GET get -> 詳細照会
  • GET page -> ページング照会
  • GET listAll -> 全件照会(ページングなし)
  • GET export -> エクスポートメソッド

リクエストヘッダー形式

身元認証はJWTで実装され、ユーザー照会を例に、伝達形式:

POST http://127.0.0.1/system/users/listAll
Content-Type: application/json
Authorization: Bearer <jwt_token>

{
  "loginName": "zhangsan"
}

コード規範【未完】

コントローラ層

  1. マッピング規則 グローバル、各メソッド
  2. 監査ログ
  3. フォーム検証
  4. 返却オブジェクト形式
  5. 権限制御
  6. ドキュメントアノテーション
  7. メソッド定義
  8. 例外処理
  9. アクセスレート制限
  10. エラーコード
  11. データマスキング

業務層

  1. 継承関係
  2. IServiceメソッドリスト
  3. グローバル共通service追加
  4. 業務service追加
  5. トランザクション制御
  6. ページング
  7. 例外処理
  8. キャッシュアノテーション

永続層

  1. 継承関係
  2. BaseMapperメソッドリスト
  3. グローバル共通Mapper追加
  4. 業務Mapper追加
  5. MappperでのカスタムSQL使用
  6. XMLでのカスタムSQL使用
  7. べき等的新規追加と保存

権限規範【未完】

  1. 三つの使用シナリオ
    1. ログインし授权が必要
    2. ログインは必要だが授权は不要
    3. ログイン不要(リンク:ホワイトリストの使用説明)
  2. アノテーション形式
  3. リソース識別子の維持とテーブル対応関係
  4. 権限インターセプトメソッドの注入
  5. 権限インターセプトの関数

開発規範

  1. ユーザー個人に属するページまたは機能は必ず権限制御検証を行うこと
  2. ユーザーの機密データは直接表示を禁止し、表示データに対してマスキング処理を必須とする
  3. ユーザーリクエストで渡されるあらゆるパラメータは有効性検証と長さ検証を必須とする
  4. 設定ファイル内のパスワードは暗号化が必要
  5. アップロードファイルにはサイズ制限とヘッダー特徴コード検証を定義

データベース規範

テーブル作成規範

  1. テーブル名、フィールド名は小文字または数字を使用必須、数字始まりは禁止

  2. テーブル名は複数名詞の使用を禁止

  3. 業務テーブルはデフォルトフィールドを含む必須

    業務テーブルデフォルトフィールド、エンティティはSuperEntityを継承、フレームワークがデータ埋め込みを完了

    非業務テーブル、例えばユーザーロール連携テーブル、操作者、時間などの情報を個別に記録する必要がないテーブル、エンティティはSuperBaseEntityを継承

    フィールド名データ型必須かどうかデフォルト値説明
    idint8はい主キー
    create_user_idint8はいnow()作成者ID
    create_timetimestamp(6)はい作成時間
    update_user_idint8更新者ID
    update_timetimestamp(6)更新時間
    del_flagint2はい0削除フラグ(0正常 1削除)
  4. データベースでは物理削除操作を使用できず、論理削除を使用すること。

  5. フォームの是非フィールドはis_xxx の方式での命名を禁止、データ型:int2(1 は はい、0 はいいえ)

  6. 業務ユニークフィールドはインデックス作成必須

常用フィールド型

以下は常用フィールドの型設定

フィールド名データ型Java型説明
idint8(64)Long主キー、スノーフレークID保存
login_namevarchar(100)Stringログインアカウント、文字列
sexint2(16)Integerユーザー性別(0男 1女)
sort_byint4(32)Integerソート
brithdaydatejava.util.Date日付型
create_timetimestampjava.util.Date時間型
account_balancenumeric(15,2)BigDecimal通貨残高
detailstextString大テキスト、アクセスログ

システム設定クラス

データマスキング設定(SensitiveJsonSerializer.java)

  1. 使用シナリオ
  2. アノテーション説明
  3. コード例

フィルター設定(FilterConfig.java)

  1. XSS フィルター登録

    ## XSS攻撃防止
    xss:
       # フィルタースイッチ
       enabled: true
       # 除外リンク(複数はカンマ区切り)
       excludes: /wechat/callback
       # マッチリンク
       urlPatterns: /*
  2. Referer フィルター登録

    ## リファラープロテクション設定
    referer:
       # リファラープロテクションスイッチ
       enabled: false
       # 許可ドメインリスト
       allowed-domains: localhost,127.0.0.1

クロスオリジン設定(GlobalCorsConfig.java)

  1. 使用シナリオ
  2. 指定ドメインのクロスオリジン設定

シリアライズ設定(JacksonConfig.java)

  1. 使用シナリオ 時間文字列
  2. 主キー精度ロス処理

MybatisPlusの自動埋め込み設定(MybatisPlusAutoConfigure.java)

  1. 自動埋め込み属性説明
  2. 埋め込みフィールド追加
  3. 埋め込みロジック実行

MybatisPlus設定(MyBatisPlusConfig.java)

  1. スキャンパス設定
  2. プラグイン登録

Redis設定(RedisConfig.java)

  1. RedisTemplateシリアライズ方式設定

    keyにはStringシリアライズ、valueにはJSONシリアライズを使用。具体的な使用法は。。。Redisユーティリティクラス参照

  2. レート制限スクリプト設定

    これは時間窓アルゴリズムに基づくスクリプトで、具体的な使用法は。。。アクセスレート制限参照

    local key = KEYS[1] -- レート制限リソースKEY
    local now = tonumber(ARGV[1]) -- 現在のタイムスタンプ(通常クライアントから渡される、例:`unixtime * 1000`)
    local ttl = tonumber(ARGV[2]) -- 1つの時間窓のミリ秒数、Keyの有効期限設定用
    local expired = tonumber(ARGV[3]) -- 有効期限切れ時点のタイムスタンプ(now - 時間窓サイズ)
    local max = tonumber(ARGV[4]) -- 時間窓内の最大制限額
    
    -- 1. すべての期限切れデータをクリア(スコアが0からexpiredまでのメンバー)
    redis.call('zremrangebyscore', key, 0, expired)
    
    -- 2. 現在の窓内に残っている要素数を取得(つまり直近の時間窓内のリクエスト数)
    local current = tonumber(redis.call('zcard', key))
    local next = current + 1
    
    -- 3. 制限超過かどうか判断
    if next > max then
      return 0; -- 0 はレート制限されたことを示す
    else
      -- 4. 制限超過でない場合、現在のリクエストのタイムスタンプをメンバーとスコアとしてzsetに追加
      redis.call("zadd", key, now, now)
      -- 5. 全体のzsetの有効期限をリフレッシュ
      redis.call("pexpire", key, ttl)
      return next -- 現在のカウントを返す
    end
  3. アノテーションキャッシュ時間設定

    アノテーション使用時のTTL時間を設定、具体的な使用法は。。。キャッシュアノテーション参照

    ## redisキャッシュルール
    redis:
      cache:
        configs:
          # キャッシュkeyが:vjsp_dictの場合、有効期限は3600秒
          - key: vjsp_dict
            second: 3600
          # キャッシュvjsp_configが:vjsp_dictの場合、有効期限は3600秒
          - key: vjsp_config
            second: 3600

SpringDoc設定クラス(SpringDocConfig.java)

  1. 有効化と無効化

  2. 設定パラメータ説明

    ## SpringDoc 設定
    springdoc:
      api-docs:
        path: /api-docs
        enabled: true
      swagger-ui:
        path: /swagger-ui.html
        enabled: true
        # タグソート方式
        tags-sorter: alpha
        # 操作ソート方式
        operations-sorter: alpha
        # 認証状態維持
        persistAuthorization: true
        # modelsを非表示
        default-models-expand-depth: -1
      packages-to-scan: net.vjsp
      paths-to-match: /**
    
    
    # SpringDocカスタム設定
    app:
      info:
        title: VJSP API
        description: VJSP管理バックエンド開発フレームワーク
        version: 1.0.0
        contact:
          name: VJSP
          email: service@vjsp.cn
          url: https://www.vjsp.net

スレッドプール設定(ThreadPoolConfig.java)

  1. 使用シナリオ
  2. システムデフォルトスレッドプールの名称とパラメータ
  3. 呼び出しコード例

セキュリティ設定(VjspSecurityConfig.java)

  1. 注入内容

依存性注入ユーティリティクラス

Redis操作クラス

  1. 使用シナリオ
  2. メソッドリスト+コード例

パスワードユーティリティクラス

  1. 注入位置、どのような暗号化方式があるか
  2. メソッドリスト+コード例

静的メソッドユーティリティクラス

オブジェクト変換ユーティリティ(Convert.java)

マスキングユーティリティ(DesensitizedUtils.java)

辞書ユーティリティ(DictUtils.java)

HTMLエスケープユーティリティ(EscapeUtils.java)

XSSフィルターユーティリティ(HtmlUtils.java)

Httpリクエストユーティリティ(HttpHelper.java)

文字列ユーティリティ(StringUtils.java)

日付ユーティリティ(DateUtils.java)

ファイルユーティリティ(FileUtils.java)

IPユーティリティ(IpUtils.java)

Jsonユーティリティ(JsonUtils.java)

JWTユーティリティ(JwtUtils.java)

認証ユーティリティ(SecurityUtil.java)

Base64ユーティリティ(Base64.java)

鍵ユーティリティ(KeyGeneratorUtils.java)

MD5ユーティリティ(Md5Utils.java)

RSAユーティリティ(RsaUtils.java)

SM4ユーティリティ(SM4Utils.java)

リフレクションユーティリティ(ReflectUtils.java)

Excelユーティリティ(ExcelUtils.java)

Springユーティリティ(SpringUtils.java)

Servletユーティリティ(ServletUtils.java)

User-Agentユーティリティ(UserAgentUtils.java)

デモ図