vjsp-boot-form高速開発フレームワーク
プロジェクト概要
vjsp-boot-formは、Spring Bootに基づくバックエンドサービスプロジェクトで、フォーム処理、ワークフロー管理、システム管理などの機能を提供します。このプロジェクトは現代的なJava技術スタックを採用し、複数のデータベースをサポートし、完善されたセキュリティメカニズムとログ記録機能を提供します。
組み込みモジュール
ユーザー管理:システム操作者を管理し、ユーザーアカウントの作成、権限割り当て、情報メンテナンスを完了します。
部門管理:会社、部門の多階層組織構造を設定し、ツリー構造で直感的に表示し、データ権限に基づいて分離をサポートします。
メニュー管理:システムナビゲーションメニュー、操作機能権限、ボタンレベルの権限識別子を設定し、きめ細かいアクセス制御を実現します。
ロール管理:異なるロールにメニューと操作権限を割り当て、組織構造に基づいてデータ権限範囲を分割することをサポートします。
辞書管理:システムで一般的に使用され、比較的固定された分類、タグなどの基本データを維持し、データの一貫性と保守性を向上させます。
システムログ:システムの正常な操作ログと異常情報ログを記録および検索し、監査と障害調査を容易にします。
開発説明
実行環境
| ツール | バージョン |
|---|---|
| Java | 8 |
| Maven | 3.6.3 + |
| Redis | 5 + |
| PostgreSQL | 12.16 |
| IDE | IDEA、Eclipse 、VS Code等 |
プロジェクト構造
vjsp-boot-form
├── src
│ ├── main
│ │ ├── java
│ │ │ └── net
│ │ │ └── vjsp
│ │ │ ├── VjspApplication.java # アプリケーション起動エントリクラス
│ │ │ ├── common # 共通ツールとコンポーネント
│ │ │ ├── framework # フレームワーク核心コンポーネント
│ │ │ ├── log # ログ関連機能
│ │ │ ├── modules # 業務モジュール
│ │ │ ├── starter # ファイルアップロード・ダウンロード設定モジュール
│ │ │ ├── system # システム管理モジュール
│ │ │ └── workflowprocess # ワークフロー処理モジュール
│ │ └── resources
│ │ ├── application.yml # アプリケーション主設定ファイル
│ │ ├── application-dev.yml # 開発環境設定
│ │ ├── template # ページテンプレートファイル
│ │ ├── mapper # MyBatisマッピングファイル
│ │ ├── static # 静的リソース
│ │ │ └── vjsphtml # フロントエンドページ
│ │ └── vjsp-mapping # VJSPマッピング設定
│ └── test
│ └── java # テストコード
└── pom.xml # Mavenプロジェクト設定ファイル
└── sql # データベーススクリプト構造規範
| 一階パッケージパス | 説明 |
|---|---|
| common | 共通ファイルパッケージ、グローバル変数、例外クラス、列挙クラス、静的ツールクラスなど、業務に関係ないグローバルファイル |
| framework | システムファイルパッケージ、権限フレームワーク、設定ファイル、インターセプター、依存注入ツールクラス |
| system | システムモジュール、ユーザー、ロール、メニュー、ログ、ログインなど |
| modules | 業務モジュール、システム組み込みモジュール以外の他の機能モジュール |
| workflowprocess | ワークフローモジュール |
| 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>
<java.version>1.8</java.version>
<skipTests>true</skipTests>
<druid.version>1.1.10</druid.version>
<hutool.version>4.5.7</hutool.version>
<jjwt.version>0.9.0</jjwt.version>
<maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
<mybatis-plus.version>3.3.2</mybatis-plus.version>
<fileupload.version>1.5</fileupload.version>
<poi.version>3.9</poi.version>
<zip4j.version>1.3.2</zip4j.version>
<beanutils.version>1.9.4</beanutils.version>
<collections4.version>4.4</collections4.version>
<bcprov.version>1.73</bcprov.version>
<mail.version>1.6.2</mail.version>
<xmlbeans.version>3.1.0</xmlbeans.version>
<jsqlparser.version>1.4</jsqlparser.version>
<jexl3.version>3.0</jexl3.version>
<vjsp-form.version>3.0-RELEASE</vjsp-form.version>
<fastdfs.version>1.27.2</fastdfs.version>
<s3.version>1.11.792</s3.version>
<mapstruct.version>1.5.1.Final</mapstruct.version>
</properties>JARパッケージリスト
| 名称 | バージョン | 用途 |
|---|---|---|
| javax.servlet-api | 明示的に指定されていない、コンテナが提供 | Servlet API(provided) |
| spring-boot | 2.7.18 | フレームワークメインバージョン |
| 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 | Spring Boot によって管理され、デフォルトで互換性あり | 開発ツールライブラリ |
| mybatis-plus-boot-starter | 3.3.2 | 永続層フレームワーク |
| mybatis-plus-generator | 3.3.2 | 永続層コード生成 |
| postgresql | Spring Boot によって管理 | データベースドライバ(PostgreSQL) |
| bcprov-jdk15to18 | 1.73 | 暗号化ライブラリ |
| jjwt | 0.9.0 | JWTサポート |
| mapstruct | 1.5.1.Final | コード生成ツール |
| mapstruct-processor | 1.5.1.Final | コード生成ツール(アノテーションプロセッサ) |
| poi | 3.9 | Excel ツール(poi-ooxml、poi-scratchpadを含む) |
| commons-beanutils | 1.9.4 | 共通ツールクラス |
| commons-collections4 | 4.4 | 共通ツールクラス |
| poi-ooxml | 4.1.2 | excelツール |
| commons-io | 2.19.0 | 共通ツールクラス |
| commons-lang3 | 3.12.0 | 共通ツールクラス |
| fastdfs-client | 1.27.2 | ファイルストレージ |
| aws-java-sdk-s3 | 1.11.792 | ファイルストレージ |
命名規範
すべてのオブジェクトクラス名は大文字キャメルケース(PascalCase)を使用し、アンダースコア、小文字キャメルケース、略語などの非標準命名は使用できません。
| オブジェクト | 使用場面 | 命名規範 |
|---|---|---|
| Entity | ワークフローエンティティオブジェクト | 接尾辞としてEntityを使用 |
| Controller | コントローラコンポーネント、HTTPリクエストの受信と処理、対応する業務ロジックへのリクエストの分配 | 接尾辞としてControllerを使用 |
| Service | 業務ロジックインターフェース | 接尾辞としてServiceを使用 |
| ServiceImpl | 業務ロジック実装クラス、Mapperを呼び出し、トランザクションを処理 | 接尾辞としてServiceImplを使用 |
| Mapper | 永続層、データベース操作メソッドを定義 | 接尾辞としてMapperを使用 |
| Config | システム設定クラスオブジェクト | 接尾辞としてConfigを使用 |
| Filter | フィルターオブジェクト | 接尾辞としてFilterを使用 |
| Aspect | ロジックアスペクト実装オブジェクト | 接尾辞としてAspectを使用 |
| Properties | プロパティ設定ファイル | 接尾辞としてPropertiesを使用 |
| Convert | PO ↔ DTO ↔ VO 間の変換を担当 (MapStruct実現) | 接尾辞としてConvertを使用 |
| Constants | 定数オブジェクト | 接尾辞としてConstantsを使用 |
| View | サービス間呼び出し、複雑なロジックカプセル化、または階層を跨るデータ伝送に使用 | 接尾辞としてViewを使用 |
リクエストヘッダー形式
認証は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使用
- べき等的新規追加と保存
権限規範
- 三つの使用場面
- ログインし、権限付与が必要
- ログインが必要だが、権限付与は不要
- ログイン不要(リンク:ホワイトリストの使用説明)
- アノテーション形式
- リソース識別子の維持とテーブル対応関係
- 権限インターセプトメソッドの注入
- 権限インターセプトの関数
開発規範
- ユーザー個人に属するページまたは機能は、必ず権限制御検証を実施しなければならない
- ユーザーの機密データは直接表示を禁止し、表示データに対して非可逆なマスキング処理を施さなければならない
- ユーザーリクエストで渡されるパラメータは、すべて有効性検証と長さ検証を実施しなければならない
- 設定ファイル中のパスワードは暗号化が必要
- アップロードファイルにはサイズ制限とヘッダ特徴コード検証を定義する
データベース規範
テーブル作成規範
テーブル名、フィールド名は小文字の英字または数字を使用し、数字で始まることは禁止
テーブル名は複数形の名詞を使用できない
業務テーブルはデフォルトフィールドを含まなければならない
フィールド名 データ型 必須かどうか デフォルト値 説明 id varchar(40) はい 主キー create_user_id int8 はい 作成者ID create_time timestamp(6) はい now() 作成時間 update_user_id int8 いいえ 更新者ID update_time timestamp(6) いいえ 更新時間 is_delete int2 はい 0 削除フラグ(0正常 1削除) データベースでは物理削除操作を使用できず、論理削除を使用する。
業務ユニークフィールドは必ずインデックスを作成する
システム設定クラス
XSSフィルター設定(XSSFilterConfig.java)
XSSフィルターを登録## XSS攻撃防止 xss: # フィルタースイッチ enabled: true # 除外リンク(複数はカンマ区切り) excludes: /wechat/callback # マッチリンク urlPatterns: /*
クロスオリジン設定(GlobalCorsConfig.java)
- 使用場面
- 指定ドメインのクロスオリジン設定
MyBatis設定(MyBatisConfig.java)
- スキャンパス設定
- プラグイン登録
Redis設定(RedisConfig.java)
RedisTemplateのシリアライズ方式を設定
keyにはStringシリアライズ、valueにはJSONシリアライズを使用。具体的な使用方法は。。。Redisツールクラスを参照
セキュリティ設定(SecurityConfig.java)
セキュリティフィルターチェーンを設定 URLアクセス権限、クロスオリジン、CSRF、セッション管理などのセキュリティポリシーを設定
依存注入ツールクラス
Redis操作クラス
- 使用場面
- メソッドリスト+コード例
パスワードツールクラス
- 注入位置、どのような暗号化方式があるか
- メソッドリスト+コード例
静的メソッドツールクラス
Base64ツール(Base64.java)
クロスプラットフォームコマンド実行ツール(CmdUtil.java)
日付ツール(DateUtils.java)
メールツール(EmailUtils.java)
Excelツール(ExcelUtil.java)
ネットワークツール(HttpKeyUtil.java)
Httpリクエストツール(HttpUtil.java)
IPツール(IpUtils.java)
JWTツール(JwtTokenUtil.java)
ログキャッシュ(LogsPool.java)
MD5ツール(MD5Util.java)
RSAツール(RsaUtils.java)
Servletツール(ServletUtils.java)
Springツール(SpringUtil.java)
SSLツール(SSLClient.java)
文字列ツール(StringUtils.java)
3Des暗号化・復号ツール(TripleDes.java)
ファイルツール(VjspFiles.java)
ZIPツール(Zips.java)
実行
データベーススクリプトの初期化、設定ファイルの修正
- 新しいデータベースを作成
- sql/vjsp_form.sql ファイルをインポート
- application-dev.yml ファイルのデータベース接続情報を修正
- application-dev.yml ファイルのRedis接続情報を修正
- フロー設定の修正
src\main\resources\application-dev.yml を開く
vjsp:
run:
# フローリクエストインターフェース秘密鍵、ts_flow_partner テーブルの partnerpass フィールドに対応
partnerpass: TaXxYGBj1idmf4oCVUOK75QqWsZD2cEy
# フローインターフェースurl
vjspFlowUrl: http://127.0.0.1:9090/
# vjsp-mapping フォルダパス
resourcesBaseConfig:
# ログを有効にするかどうか
audit-log:
# true 有効 false 無効
enabled: true
# logger ログフレームワークを使用して出力
# db データベースに保存
log-type: db
# rsa パスワード暗号化
# RsaUtils.java のmainメソッドを使用して新しいkeyを生成アプリケーション起動
プロジェクトのメイン起動クラスは net.vjsp.VjspApplication で、標準的なSpring Bootの起動方法を使用:
@ServletComponentScan
@SpringBootApplication
public class VjspApplication {
public static void main(String[] args) {
SpringApplication.run(VjspApplication.class, args);
}
}アプリケーションワークフロー
アプリケーションパス
expansion-pack/vjsp_workflow
設定ファイル
expansion-pack\vjsp_workflow\config\application.yml
# データベースアドレス
db.url=jdbc:postgresql://xxx.xxx.xxx.xxx:5432/vjsp_form
# データベースドライバ
db.driverClassName=org.postgresql.Driver
# データベースユーザー名
db.username=postgres
# データベースパスワード
db.password=起動
run.bat または run.sh を実行してアプリケーションを起動
ブラウザを開き、以下を入力:http://localhost:8080/index.html
デフォルトアカウント/パスワード: admin / 888
VS Code設定
文字化け問題
ファイル - 基本設定 - 設定 Auto Guess Encoding にチェックを入れる
デプロイ
パッケージング説明
pom.xml にはjarパッケージングプラグインが設定されており、jarにパッケージングしたくないファイルやディレクトリを除外できます。例:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<excludes>
<!-- 例:特定の設定ファイルを除外 -->
<exclude>**/application.yml</exclude>
<exclude>**/application-dev.yml</exclude>
<!-- 例:ディレクトリ全体を除外 -->
<exclude>**/static/**</exclude>
<exclude>**/vjsp-mapping/**</exclude>
</excludes>
</configuration>
</plugin>独立jarデプロイ方式
- application-dev.yml のデータベース接続情報、Redis接続情報、フロー設定などを本番環境情報に修正。
- pom.xmlの以下の部分を削除し、mvn installでパッケージングすると、jarパッケージには設定ファイル、静的リソースファイル、フォームロジックファイルが含まれます。
<!-- 例:特定の設定ファイルを除外 -->
<exclude>**/application.yml</exclude>
<exclude>**/application-dev.yml</exclude>
<!-- 例:ディレクトリ全体を除外 -->
<exclude>**/static/**</exclude>
<exclude>**/vjsp-mapping/**</exclude>パッケージング後のjarパッケージは直接実行できます。例:
java -jar vjsp-boot-form-1.0.2.jar静的ページ独立デプロイ + バックエンドjarパッケージ
application-dev.yml の以下の部分を削除し、jarパッケージが静的ファイルをロードしないようにします。
web:
resources:
# フロントエンドページ、リソースファイル パス
static-locations: classpath:static/vjsphtml/,file:./static/vjsphtml/,- application-dev.yml のデータベース接続情報、Redis接続情報、フロー設定などを本番環境情報に修正。
- pom.xmlの以下の部分を削除し、mvn installでパッケージングすると、jarパッケージには設定ファイル、フォームロジックファイルが含まれます。
<!-- 例:特定の設定ファイルを除外 -->
<exclude>**/application.yml</exclude>
<exclude>**/application-dev.yml</exclude>
<!-- 例:ディレクトリ全体を除外 -->
<exclude>**/vjsp-mapping/**</exclude>
以下をのみ保持
<exclude>**/static/**</exclude>nginx を使用して静的ページと jarパッケージのアクセスアドレスをプロキシします。
ページリクエストのインターフェースアドレスを修正
static/vjsphtml/_vjsp_setting/setting.js のインターフェースアドレスを修正
var _vjsp_inter_domain = getRootPath() + (_vjsp_is_path != 0 ? getContextPath() : '');
以下のように修正
var _vjsp_inter_domain = 'あなた自身のアドレス';パッケージング後のjarパッケージは直接実行できます。例:
java -jar vjsp-boot-form-1.0.2.jar設定ファイル、静的リソース、フォームロジックファイル、jar パッケージを分離デプロイ
pom.xml の jarパッケージングプラグインの設定を保持し、mvn install でパッケージング後、jarパッケージには静的ファイル、フォームロジックファイル、設定ファイルが含まれません。
デプロイディレクトリ構造は以下の通り:
├── config
│ ├── application-dev.yml
│ └── application.yml
├── static
│ └── vjsphtml
├── vjsp-boot-form-1.0.2.jar
└── vjsp-mapping注意事項
static/vjsphtml を nginx がプロキシする場合、application-dev.yml の静的リソースパスと setting.js のインターフェースアドレスを削除する必要があります。
vjsp-mapping が jarパッケージと同じ階層ディレクトリにない場合、application-dev.yml のフォームロジックファイルパスを修正する必要があります。
# vjsp-mapping フォルダパス
# vjsp-mappingのフルパスに修正(vjsp-mapping 自体は含まない)
resourcesBaseConfig: /opt/app/