SpringBoot 2.7 + Vue3 フロントエンド・バックエンド分離の高速開発フレームワーク
プロジェクト概要
本プロジェクトは、継続的に更新される完全無料のオープンソースエンタープライズ級アプリケーション開発フレームワークであり、フロントエンドとバックエンドの分離アーキテクチャを採用し、業務開発における非機能要件のサポート向上に焦点を当てています。フロントエンドはVueとElement UIに基づいて構築され、バックエンドはSpring Boot、Spring Security、Redis、JWTなどの技術スタックを採用し、完全な権限認証メカニズムを統合し、マルチ端末ログインと身元認証をサポートしています。
システムはインターネットシナリオ向けに設計され、BtoBとBtoCの両方のユーザーニーズに対応し、高い拡張性と適応性を備えています。エンタープライズ開発で一般的に使用されるミドルウェアとコンポーネントをプラグイン方式で統合し、モジュール設計は高凝集・低結合の原則に従い、構造が明確で拡張が容易です。コードは規範的で整理され、アーキテクチャは簡潔明瞭であり、学習参考に適しているだけでなく、企業の実際のプロジェクト開発にも使用できます。
組み込みモジュール
ユーザー管理:システム操作者を管理し、ユーザーアカウントの作成、権限割り当て、情報維持を完了します。
部門管理:会社、部門の多階層組織構造を設定し、ツリー構造で直感的に表示し、データ権限による分離をサポートします。
メニュー管理:システムナビゲーションメニュー、操作機能権限、ボタンレベルの権限識別子を設定し、詳細なアクセス制御を実現します。
ロール管理:異なるロールにメニューと操作権限を割り当て、組織構造に基づくデータ権限範囲の分割をサポートします。
辞書管理:システムで頻繁に使用され比較的固定された分類、タグなどの基本データを維持し、データの一貫性と保守性を向上させます。
パラメータ管理:システムの実行に必要な動的パラメータを集中設定・管理し、リアルタイム調整と即時適用をサポートします。
通知公告:システム内の通知と公告情報を発行・維持し、ユーザーが重要な動向をタイムリーに取得できるようにします。
操作ログ:システムの正常な操作ログと異常情報ログを記録・照会し、監査と障害調査を容易にします。
ログインログ:ユーザーのログイン記録を照会し、成功および異常なログイン行動を含み、システムの安全な管理を保証します。
オンラインユーザー:システム内の現在アクティブなユーザーのログイン状態と操作行動をリアルタイムで監視します。
開発説明
実行環境
| ツール | バージョン |
|---|---|
| Java | 8 + |
| Maven | 3.6.3 + |
| Redis | 5 + |
| PostgreSQL | 12.16 |
| IDE | IDEA、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-boot | 2.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 | メインフレームワークバージョンと同じ | 検証フレームワーク |
| lombok | 1.18.24 | 開発ツールライブラリ |
| mybatis-plus-boot-starter | 3.5.1 | 永続層フレームワーク |
| mybatis-plus-extension | 3.5.1 | 永続層フレームワーク |
| mybatis-plus | 3.5.1 | 永続層フレームワーク |
| postgresql | 42.3.5 | データベースドライバ |
| springdoc-openapi-ui | 1.7.0 | ドキュメントツール |
| springdoc-openapi-security | 1.7.0 | ドキュメントツール |
| jasypt-spring-boot-starter | 3.0.5 | 設定暗号化ツール |
| bcprov-jdk15to18 | 1.73 | 暗号化ライブラリ |
| fastjson2 | 2.0.58 | jsonパーサー |
| mapstruct | 1.5.1.Final | コード生成ツール |
| mapstruct-processor | 1.5.1.Final | コード生成ツール |
| poi-ooxml | 4.1.2 | excelツール |
| commons-io | 2.19.0 | 常用ユーティリティクラス |
| commons-lang3 | 3.12.0 | 常用ユーティリティクラス |
| jjwt | 0.9.0 | JWTサポート |
| fastdfs-client | 1.27.2 | ファイルストレージ |
| aws-java-sdk-s3 | 1.11.792 | ファイルストレージ |
命名規範
すべてのオブジェクトクラス名はパスカルケース(PascalCase)を使用し、アンダースコア、キャメルケース、略語などの非標準命名は許可されません。
| オブジェクト | 使用シーン | 命名規範 |
|---|---|---|
| Form | フロントエンドのPOST/PUTリクエストのJSONデータを受信、@Validated検証と連携 | Formで終了 |
| DTO | サービス間呼び出し、複雑なロジックカプセル化または階層間データ伝送用 | DTOを接尾辞 |
| PO | 永続層オブジェクト、MyBatisマッピング | POを接尾辞 |
| Query | ページングクエリ条件をカプセル化、BaseQueryを継承必須 | Queryを接尾辞 |
| VO | フロントエンドに返すデータビューオブジェクト | VOを接尾辞 |
| Convert | PO ↔ DTO ↔ VO 間の変換を担当 (MapStruct実装) | Convertを接尾辞 |
| Mapper | 永続層、データベース操作メソッドを定義 | Mapperを接尾辞 |
| Service | 業務ロジックインターフェース | Serviceを接尾辞 |
| ServiceImpl | 業務ロジック実装クラス、Mapperを呼び出し、トランザクションを処理 | ServiceImplを接尾辞 |
| Controller | RESTful 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"
}コード規範【未完】
コントローラ層
- マッピング規則 グローバル、各メソッド
- 監査ログ
- フォーム検証
- 返却オブジェクト形式
- 権限制御
- ドキュメントアノテーション
- メソッド定義
- 例外処理
- アクセスレート制限
- エラーコード
- データマスキング
業務層
- 継承関係
- IServiceメソッドリスト
- グローバル共通service追加
- 業務service追加
- トランザクション制御
- ページング
- 例外処理
- キャッシュアノテーション
永続層
- 継承関係
- BaseMapperメソッドリスト
- グローバル共通Mapper追加
- 業務Mapper追加
- MappperでのカスタムSQL使用
- XMLでのカスタムSQL使用
- べき等的新規追加と保存
権限規範【未完】
- 三つの使用シナリオ
- ログインし授权が必要
- ログインは必要だが授权は不要
- ログイン不要(リンク:ホワイトリストの使用説明)
- アノテーション形式
- リソース識別子の維持とテーブル対応関係
- 権限インターセプトメソッドの注入
- 権限インターセプトの関数
開発規範
- ユーザー個人に属するページまたは機能は必ず権限制御検証を行うこと
- ユーザーの機密データは直接表示を禁止し、表示データに対してマスキング処理を必須とする
- ユーザーリクエストで渡されるあらゆるパラメータは有効性検証と長さ検証を必須とする
- 設定ファイル内のパスワードは暗号化が必要
- アップロードファイルにはサイズ制限とヘッダー特徴コード検証を定義
データベース規範
テーブル作成規範
テーブル名、フィールド名は小文字または数字を使用必須、数字始まりは禁止
テーブル名は複数名詞の使用を禁止
業務テーブルはデフォルトフィールドを含む必須
業務テーブルデフォルトフィールド、エンティティはSuperEntityを継承、フレームワークがデータ埋め込みを完了
非業務テーブル、例えばユーザーロール連携テーブル、操作者、時間などの情報を個別に記録する必要がないテーブル、エンティティはSuperBaseEntityを継承
フィールド名 データ型 必須かどうか デフォルト値 説明 id int8 はい 主キー create_user_id int8 はい now() 作成者ID create_time timestamp(6) はい 作成時間 update_user_id int8 更新者ID update_time timestamp(6) 更新時間 del_flag int2 はい 0 削除フラグ(0正常 1削除) データベースでは物理削除操作を使用できず、論理削除を使用すること。
フォームの是非フィールドは
is_xxxの方式での命名を禁止、データ型:int2(1 は はい、0 はいいえ)業務ユニークフィールドはインデックス作成必須
常用フィールド型
以下は常用フィールドの型設定
| フィールド名 | データ型 | Java型 | 説明 |
|---|---|---|---|
| id | int8(64) | Long | 主キー、スノーフレークID保存 |
| login_name | varchar(100) | String | ログインアカウント、文字列 |
| sex | int2(16) | Integer | ユーザー性別(0男 1女) |
| sort_by | int4(32) | Integer | ソート |
| brithday | date | java.util.Date | 日付型 |
| create_time | timestamp | java.util.Date | 時間型 |
| account_balance | numeric(15,2) | BigDecimal | 通貨残高 |
| details | text | String | 大テキスト、アクセスログ |
システム設定クラス
データマスキング設定(SensitiveJsonSerializer.java)
- 使用シナリオ
- アノテーション説明
- コード例
フィルター設定(FilterConfig.java)
XSSフィルター登録## XSS攻撃防止 xss: # フィルタースイッチ enabled: true # 除外リンク(複数はカンマ区切り) excludes: /wechat/callback # マッチリンク urlPatterns: /*Refererフィルター登録## リファラープロテクション設定 referer: # リファラープロテクションスイッチ enabled: false # 許可ドメインリスト allowed-domains: localhost,127.0.0.1
クロスオリジン設定(GlobalCorsConfig.java)
- 使用シナリオ
- 指定ドメインのクロスオリジン設定
シリアライズ設定(JacksonConfig.java)
- 使用シナリオ 時間文字列
- 主キー精度ロス処理
MybatisPlusの自動埋め込み設定(MybatisPlusAutoConfigure.java)
- 自動埋め込み属性説明
- 埋め込みフィールド追加
- 埋め込みロジック実行
MybatisPlus設定(MyBatisPlusConfig.java)
- スキャンパス設定
- プラグイン登録
Redis設定(RedisConfig.java)
RedisTemplateシリアライズ方式設定
keyにはStringシリアライズ、valueにはJSONシリアライズを使用。具体的な使用法は。。。Redisユーティリティクラス参照
レート制限スクリプト設定
これは時間窓アルゴリズムに基づくスクリプトで、具体的な使用法は。。。アクセスレート制限参照
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アノテーションキャッシュ時間設定
アノテーション使用時の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)
有効化と無効化
設定パラメータ説明
## 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)
- 使用シナリオ
- システムデフォルトスレッドプールの名称とパラメータ
- 呼び出しコード例
セキュリティ設定(VjspSecurityConfig.java)
- 注入内容
依存性注入ユーティリティクラス
Redis操作クラス
- 使用シナリオ
- メソッドリスト+コード例
パスワードユーティリティクラス
- 注入位置、どのような暗号化方式があるか
- メソッドリスト+コード例
静的メソッドユーティリティクラス
オブジェクト変換ユーティリティ(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)
デモ図
![]() | ![]() |


