mirror of
https://github.com/jeecgboot/JeecgBoot.git
synced 2026-04-21 04:48:10 +00:00
Merge branch 'main' of https://github.com/jeecgboot/jeecg-boot
This commit is contained in:
commit
65c466a132
@ -1,4 +1,4 @@
|
||||
[中文](./README.md) | English
|
||||
[中文](./README.md) | English | [日本語](./README.ja-JP.md)
|
||||
|
||||

|
||||
|
||||
@ -456,4 +456,4 @@ AI Chat Assistant
|
||||
|
||||
If so, buy the author a cup of coffee ☺
|
||||
|
||||

|
||||

|
||||
|
||||
459
README.ja-JP.md
Normal file
459
README.ja-JP.md
Normal file
@ -0,0 +1,459 @@
|
||||
[中文](./README.md) | [English](./README.en-US.md) | 日本語
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
JEECG BOOT AI ローコードプラットフォーム
|
||||
===============
|
||||
|
||||
現在のバージョン:3.9.1(リリース日:2026-01-28)
|
||||
|
||||
|
||||
[](https://github.com/zhangdaiscott/jeecg-boot/blob/master/LICENSE)
|
||||
[](http://www.jeecg.com)
|
||||
[](https://github.com/zhangdaiscott/jeecg-boot)
|
||||
[](https://github.com/zhangdaiscott/jeecg-boot)
|
||||
[](https://github.com/zhangdaiscott/jeecg-boot)
|
||||
|
||||
|
||||
|
||||
プロジェクト紹介
|
||||
-----------------------------------
|
||||
|
||||
<h3 align="center">Java AI ローコードプラットフォーム</h3>
|
||||
|
||||
JeecgBootは、コード`ジェネレーター`を基盤とした`AIローコードプラットフォーム`です!フロントエンドとバックエンドの分離アーキテクチャとして、SpringBoot2.x、SpringCloud、Ant Design & Vue、Mybatis Plus、Shiro、JWTを採用し、マイクロサービスに対応しています。強力なコードジェネレーターにより、フロントエンドとバックエンドのコードを自動生成し、ローコード開発を実現します!JeecgBootは新しいローコード開発パラダイム(OnlineCoding → コードジェネレーター → 手動マージ)を提唱し、Javaプロジェクトにおける70%の重複作業を解消することで、開発をよりビジネスに集中させます。開発効率を迅速に向上させ、研究開発コストを削減するだけでなく、柔軟性も損ないません!
|
||||
|
||||
JeecgBootは、オンライン開発を真のゼロコードにするための一連のローコードモジュールを提供します:オンラインフォーム開発、オンラインレポート、レポート設定機能、オンラインチャート設計、大画面設計、モバイル設定機能、フォームデザイナー、オンラインフロー設計、プロセス自動化設定、プラグイン機能(プラグ可能)など!
|
||||
|
||||
|
||||
JEECGの目的は:シンプルな機能はOnlineCodingの設定で実装し、ゼロコード開発を実現すること。複雑な機能はコードジェネレーターで生成し、手動マージすることでローコード開発を実現し、インテリジェンスと柔軟性の両方を確保します。ローコード開発を実現しつつ、柔軟なコーディングもサポートし、現在のローコード製品に共通する柔軟性の欠如という欠点を解消しています!
|
||||
|
||||
JEECGのビジネスプロセス:ワークフローを使用してタスクインターフェースを実装・拡張し、ビジネスロジックを開発・記述します。フォームは複数のソリューションを提供:フォームデザイナー、オンライン設定フォーム、コーディングフォーム。同時に、プロセスとフォームの分離設計(疎結合)を実現し、タスクノードの柔軟な設定をサポートすることで、企業のプロセスの機密性を確保しつつ、開発者の作業負荷を軽減します。
|
||||
|
||||
AIによるローコードの強化:現在、JeecgBootはChatGPTやDeepSeekなどのAI大規模言語モデルに対応しています。最新バージョンではデフォルトでDeepSeekを使用しており、より高速かつ高品質です。AIチャットアシスタント、AIテーブル作成、AIレポート生成などの機能を提供しています。
|
||||
|
||||
技術サポート
|
||||
-----------------------------------
|
||||
|
||||
使用中の問題やバグは[Issues](https://github.com/jeecgboot/JeecgBoot/issues/new?template=bug_report.md)で報告できます。
|
||||
|
||||
|
||||
##### プロジェクト説明
|
||||
|
||||
| プロジェクト | 説明 |
|
||||
|--------------------|------------------------|
|
||||
| `jeecg-boot` | SpringBootバックエンドソースコード(マイクロサービス対応) |
|
||||
| `jeecgboot-vue3` | Vue3+TS 新フロントエンドソースコード|
|
||||
| `jeecg-uniapp` | [APP開発フレームワーク、一つのコードで複数端末に対応、APP・ミニプログラム・H5をサポート](https://github.com/jeecgboot/jeecg-uniapp) |
|
||||
|
||||
|
||||
### 動画紹介
|
||||
|
||||
[](https://www.bilibili.com/video/BV1Nk4y1o7Qc)
|
||||
|
||||
|
||||
|
||||
その他のソースコードダウンロード
|
||||
-----------------------------------
|
||||
- APPソースコード:https://github.com/jeecgboot/jeecg-uniapp
|
||||
|
||||
|
||||
|
||||
プロジェクトの適用範囲
|
||||
-----------------------------------
|
||||
JeecgBoot AIローコードプラットフォームは、あらゆるJ2EEプロジェクトの開発に適用でき、特にSAASプロジェクト、企業情報管理システム(MIS)、社内オフィスシステム(OA)、企業資源計画システム(ERP)、顧客関係管理システム(CRM)などに適しています。その半インテリジェントな手動マージ開発方式により、開発効率を70%以上大幅に向上させ、開発コストを大幅に削減できます。
|
||||
|
||||
|
||||
プロジェクトの起動
|
||||
-----------------------------------
|
||||
|
||||
> デフォルトのアカウント/パスワード:admin/123456
|
||||
|
||||
- [開発環境のセットアップ](https://help.jeecg.com/java/setup/tools)
|
||||
- [IDEAクイックスタート(シングルモデル)](https://help.jeecg.com/java/setup/idea/startup)
|
||||
- [Dockerクイックスタート(シングルモデル)](https://help.jeecg.com/java/docker/quick)
|
||||
- [IDEAクイックスタート(マイクロサービスモデル)](https://help.jeecg.com/java/springcloud/switchcloud/monomer)
|
||||
- [Dockerクイックスタート(マイクロサービスモデル)](https://help.jeecg.com/java/docker/quickcloud)
|
||||
|
||||
|
||||
技術ドキュメント
|
||||
-----------------------------------
|
||||
|
||||
- 公式サイト:[http://www.jeecg.com](http://www.jeecg.com)
|
||||
- デモ:[オンラインデモ](http://boot3.jeecg.com) | [APP](http://jeecg.com/appIndex)
|
||||
- ドキュメント:[ドキュメントセンター](http://help.jeecg.com) | [AI設定](https://help.jeecg.com/java/ai/aichat)
|
||||
- 初心者ガイド:[クイックスタート](http://www.jeecg.com/doc/quickstart) | [Q&A](http://www.jeecg.com/doc/qa) | [1分間体験](https://my.oschina.net/jeecg/blog/3083313)
|
||||
- QQグループ:964611995、⑩716488839(満)、⑨808791225(満)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
スター推移
|
||||
-----------------------------------
|
||||
|
||||
[](https://star-history.com/#jeecgboot/jeecg-boot)
|
||||
|
||||
|
||||
|
||||
|
||||
バックエンドディレクトリ構成
|
||||
-----------------------------------
|
||||
```
|
||||
プロジェクト構成
|
||||
├─jeecg-boot-parent
|
||||
│ ├─jeecg-boot-base-core
|
||||
│ ├─jeecg-module-demo
|
||||
│ ├─jeecg-module-system
|
||||
│ │ ├─jeecg-system-biz
|
||||
│ │ ├─jeecg-system-start システム(8080)
|
||||
│ │ ├─jeecg-system-api
|
||||
│ │ │ ├─jeecg-system-cloud-api
|
||||
│ │ │ ├─jeecg-system-local-api
|
||||
│ ├─jeecg-server-cloud
|
||||
│ ├─jeecg-cloud-gateway (9999)
|
||||
│ ├─jeecg-cloud-nacos --Nacos(8848)
|
||||
│ ├─jeecg-system-cloud-start --システム(7001)
|
||||
│ ├─jeecg-demo-cloud-start --デモ(7002)
|
||||
│ ├─jeecg-visual
|
||||
│ ├─jeecg-cloud-monitor -- (9111)
|
||||
│ ├─jeecg-cloud-xxljob -- (9080)
|
||||
│ ├─jeecg-cloud-sentinel --sentinel(9000)
|
||||
│ ├─jeecg-cloud-test
|
||||
│ ├─jeecg-cloud-test-more
|
||||
│ ├─jeecg-cloud-test-rabbitmq
|
||||
│ ├─jeecg-cloud-test-seata
|
||||
│ ├─jeecg-cloud-test-shardingsphere
|
||||
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
なぜJeecgBootなのか?
|
||||
-----------------------------------
|
||||
* 最新の主流フロントエンド・バックエンド分離フレームワーク(Springboot+Mybatis+antd)を採用し、使いやすい。コードジェネレーターは低依存で、柔軟な拡張性を持ち、迅速な二次開発が可能。
|
||||
* マイクロサービス SpringCloud Alibaba(Nacos, Gateway, Sentinel, Skywalking)をサポートし、切替メカニズムを提供。シングルサービスとマイクロサービスの自由な切替に対応。
|
||||
* 高い開発効率、コードジェネレーターを使用して、単一テーブル、ツリーリスト、一対多、一対一などのデータモデルの追加・削除・変更・検索機能をワンクリックで生成、メニュー設定でそのまま使用可能。
|
||||
* コードジェネレーターは強力なテンプレートメカニズムを提供し、カスタムテンプレートをサポート。現在4セットのスタイルテンプレートを提供(単一テーブル2セット、ツリーモデル1セット、一対多3セット)。
|
||||
* コードジェネレーターは非常にインテリジェントで、オンラインビジネスモデリング、オンライン設定、WYSIWYG(見たまま編集)で23種類のコントロールをサポート。ワンクリックでフロントエンドとバックエンドのコードを生成し、開発効率を大幅に向上。繰り返し作業の心配はもう不要。
|
||||
* ローコード機能:オンラインフォーム(コーディング不要、オンライン設定でフォームの追加・削除・変更・検索を実現。単一テーブル、ツリー、一対多、一対一モデルをサポートし、誰でもコーディング可能に)
|
||||
* ローコード機能:オンラインレポート(コーディング不要、オンライン設定でデータレポートを実現。迅速なデータ抽出で開発負担を軽減し、誰でもコーディング可能に)
|
||||
* ローコード機能:オンラインチャート(コーディング不要、オンライン設定でグラフ、棒グラフ、データレポートなどを実現。カスタムレイアウトをサポートし、誰でもコーディング可能に)
|
||||
* ユーザー、ロール、メニュー、組織、データ辞書、オンラインスケジュールタスクなどの基本機能を完全にカプセル化。アクセス権限、ボタン権限、データ権限などの機能をサポート。
|
||||
* よく使われる共通パッケージ、各種ツール(スケジュールタスク、SMS連携、メール送信、Excelインポート・エクスポートなど)を搭載し、プロジェクト要件の80%をほぼカバー。
|
||||
* 簡単なExcelインポート・エクスポート、単一テーブルエクスポートと一対多テーブルモードのエクスポートをサポート。生成されたコードにはインポート・エクスポート機能が付属。
|
||||
* シンプルなレポートツールを統合、画像レポートやデータエクスポートが非常に便利。グラフィカルレポート、PDF、Excel、Wordなどのレポートを極めて簡単に生成可能。
|
||||
* フロントエンド・バックエンド分離技術により、ページのUIスタイルは精巧。よく使われるコンポーネントをカプセル化:時間、行テーブルコントロール、切り取り表示コントロール、レポートコンポーネント、エディタなど。
|
||||
* クエリフィルター:クエリ機能を自動生成、バックエンドで動的にSQLをスプライスして追加クエリ条件を生成。複数のマッチングモード(完全一致、あいまい検索、包含検索、不一致検索)をサポート。
|
||||
* データ権限(きめ細かいデータ権限制御、行レベル・リストレベル・フォームフィールドレベルまで制御可能。異なる人が異なるデータを表示し、同じページでも異なる人が異なるフィールドを操作可能)
|
||||
* ページバリデーションを自動生成(必須入力、数値検証、金額検証、日時検証など)。
|
||||
* SAASサービスモデルをサポートし、SaaSマルチテナントアーキテクチャソリューションを提供。
|
||||
* 分散ファイルサービス、Minio、Alibaba OSSなどの優れたサードパーティを統合し、便利なファイルアップロードと管理を提供。ローカルストレージもサポート。
|
||||
* 主流データベース互換性、一つのコードでMySQL、PostgreSQL、Oracle、SQL Server、MariaDB、DM(達夢)などの主流データベースに完全対応。
|
||||
* ワークフローFlowableを統合し、ページ上でのフロー方向の設定のみで実現。BPMワークフローの開発を大幅に簡素化。BPMのプロセスデザイナーでフロー方向を描画すれば、少量のJavaコードでワークフローがほぼ完成。
|
||||
* ローコード機能:オンラインプロセス設計、オープンソースのActivitiプロセスエンジンを使用し、オンラインでプロセスを描画、カスタムフォーム、フォーム添付ファイル、ビジネスフローを実現。
|
||||
* マルチデータソース:シンプルな使用方法、オンラインでデータソースを設定し、他のデータから簡単にデータを取得可能。
|
||||
* シングルサインオンCAS統合ソリューションを提供し、プロジェクト内に完全な連携コードを提供済み。
|
||||
* ローコード機能:フォームデザイナー、ユーザー定義のフォームレイアウトをサポート。単一テーブル、一対多フォームをサポートし、select、radio、checkbox、textarea、date、ポップアップ、リスト、マクロなどのコントロールに対応。
|
||||
* プロフェッショナルなインターフェース連携メカニズム、統一的にRESTfulインターフェースを使用、swagger-uiオンラインインターフェースドキュメントを統合、JWTトークンによるセキュリティ検証で、クライアントの連携が容易。
|
||||
* インターフェースセキュリティメカニズム、きめ細かいインターフェース認可制御が可能。異なるクライアントが自分のデータのみ参照可能な制御を非常に簡単に実現。
|
||||
* 高度な組み合わせクエリ機能、オンライン設定でメインテーブルとサブテーブルの関連クエリをサポート、クエリ履歴の保存が可能。
|
||||
* 各種システム監視を提供、システム稼働状況のリアルタイム追跡(Redis、Tomcat、JVM、サーバー情報、リクエストトラッキング、SQL監視の監視)
|
||||
* メッセージセンター(SMS、メール、WeChat プッシュなどをサポート)
|
||||
* WebSocketメッセージ通知メカニズムを統合
|
||||
* 優れたモバイル対応エフェクト、APPリリーススキームを提供:
|
||||
* 多言語対応、国際化ソリューションを提供
|
||||
* データ変更記録ログ、各データの変更内容を記録可能。バージョン比較機能により過去の変更履歴を確認可能
|
||||
* プラットフォームUIは強力で、モバイル対応を実装
|
||||
* プラットフォームホーム画面スタイル、複数の組み合わせモードを提供、カスタムスタイルをサポート
|
||||
* 使いやすい印刷プラグインを提供、Google Chrome、Firefox、IE11+などのブラウザをサポート
|
||||
* 豊富なサンプルコード、多数の学習用事例を参照として提供
|
||||
* Mavenモジュール開発方式を採用
|
||||
* 動的メニュールーティングをサポート
|
||||
* RBAC(ロールベースアクセス制御)による権限制御を採用
|
||||
* 新しい行編集テーブル JVXETable を提供、様々な複雑なERPレイアウトに容易に対応。より高いパフォーマンス、より柔軟な拡張性、より強力な機能
|
||||
|
||||
|
||||
|
||||
|
||||
技術アーキテクチャ:
|
||||
-----------------------------------
|
||||
|
||||
#### 開発環境
|
||||
|
||||
- 言語:Java デフォルト JDK17(JDK8、JDK21もサポート)
|
||||
|
||||
- IDE(Java):IDEA(lombokプラグインのインストールが必須)
|
||||
|
||||
- IDE(フロントエンド):VSCode、WebStorm、IDEA
|
||||
|
||||
- 依存関係管理:Maven
|
||||
|
||||
- キャッシュ:Redis
|
||||
|
||||
- データベース:MySQL5.7+ [その他のデータベース](https://my.oschina.net/jeecg/blog/4905722)
|
||||
|
||||
|
||||
#### バックエンド
|
||||
|
||||
- 基盤フレームワーク:Spring Boot 2.7.18
|
||||
|
||||
- マイクロサービスフレームワーク:Spring Cloud Alibaba 2021.0.6.2
|
||||
|
||||
- 永続化レイヤーフレームワーク:MybatisPlus 3.5.3.2
|
||||
|
||||
- レポートツール:JimuReport 1.9.5
|
||||
|
||||
- セキュリティフレームワーク:Apache Shiro 1.13.0、Jwt 4.5.0
|
||||
|
||||
- マイクロサービス技術スタック:Spring Cloud Alibaba、Nacos、Gateway、Sentinel、Skywalking
|
||||
|
||||
- データベース接続プール:Alibaba Druid 1.1.24
|
||||
|
||||
- ログ出力:logback
|
||||
|
||||
- その他:autopoi、fastjson、poi、Swagger-ui、quartz、lombok(コード簡素化)など
|
||||
|
||||
|
||||
#### フロントエンド
|
||||
|
||||
- 技術スタック:`Vue3.0+TypeScript+Vite+AntDesignVue+pinia+echarts`
|
||||
|
||||
#### フロントエンド環境要件
|
||||
|
||||
* `Node.js、npm、pnpm`
|
||||
* pnpm `v9+` が必要です。
|
||||
* Node.js 推奨バージョン:`v20.15.0`
|
||||
` (Vite6以降、Node.js 18/20以上が必要です)`
|
||||
|
||||
|
||||
#### 対応データベース
|
||||
|
||||
| データベース | 対応状況 |
|
||||
| --- | --- |
|
||||
| MySQL | √ |
|
||||
| Oracle11g | √ |
|
||||
| SQL Server 2017 | √ |
|
||||
| PostgreSQL | √ |
|
||||
| MariaDB | √ |
|
||||
| 達夢(DM) | √ |
|
||||
| 人大金倉(KingbaseES) | √ |
|
||||
| TiDB | √ |
|
||||
|
||||
|
||||
#### AI対応
|
||||
|
||||
| AIモデル | 対応状況 |
|
||||
| --- | --- |
|
||||
| DeepSeek | √ |
|
||||
| ChatGPT | √ |
|
||||
| Qwq | √ |
|
||||
| 智庫 | √ |
|
||||
| Ollamaローカル大規模モデル | √ |
|
||||
| その他 | √ |
|
||||
|
||||
|
||||
AI設定:https://help.jeecg.com/java/ai/aichat
|
||||
|
||||
AIアプリ:https://help.jeecg.com/aigc
|
||||
|
||||
|
||||
## マイクロサービスソリューション
|
||||
|
||||
- 1. サービス登録と検出 Nacos √
|
||||
- 2. 設定センター Nacos √
|
||||
- 3. ルートゲートウェイ Gateway(3つのロードモード) √
|
||||
- 4. 分散HTTP Feign √
|
||||
- 5. サーキットブレーカー・デグレード・レート制限 Sentinel √
|
||||
- 6. 分散ファイル Minio および Alibaba OSS √
|
||||
- 7. 統一権限制御
|
||||
- 8. サービス監視 SpringBootAdmin √
|
||||
- 9. リンクトレーシング Skywalking [参考ドキュメント](https://help.jeecg.com/java/springcloud/super/skywarking)
|
||||
- 10. メッセージングミドルウェア RabbitMQ √
|
||||
- 11. 分散タスク xxl-job √
|
||||
- 12. 分散トランザクション Seata
|
||||
- 13. 分散ログ Loki+Grafana
|
||||
- 14. docker-compose、k8s、jenkinsに対応
|
||||
- 15. CAS SSO √
|
||||
- 16. ルートレート制限 √
|
||||
|
||||
|
||||
#### マイクロサービスアーキテクチャ図
|
||||

|
||||
|
||||
### JeecgBoot 製品機能ブループリント
|
||||

|
||||
|
||||
### クイックスタート
|
||||
- マイクロサービス開発:[モノリスからマイクロサービスへのアップグレード](https://help.jeecg.com/java/springcloud/switchcloud/monomer)
|
||||
- [Dockerでマイクロサービスバックエンドを起動](https://help.jeecg.com/java/docker/springcloud)
|
||||
|
||||
|
||||
### システム画面
|
||||
|
||||
##### ChatGPT AIダイアログ
|
||||
> JeecgBootのバックエンドホームページに移動し、ホームページ右側中央の「AIアシスタント」をクリックすると、AIアシスタントのダイアログ画面が表示されます。
|
||||

|
||||
|
||||
|
||||
##### PC
|
||||
|
||||
##### AIモデルとアプリケーション管理
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
AIワークフローオーケストレーション
|
||||
|
||||

|
||||
|
||||
MCPとツール管理
|
||||
|
||||

|
||||
|
||||
AIナレッジベース(各種ドキュメント形式に対応、優れたMarkdown互換性)
|
||||
|
||||

|
||||
|
||||
AIツールボックス
|
||||
|
||||

|
||||
|
||||
AIチャットアシスタント
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
##### インタラクティブ
|
||||

|
||||
|
||||

|
||||
|
||||
|
||||
##### プロセスデザイナー
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
##### ミニプロセス
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
##### ダッシュボードデザイナー
|
||||
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
##### レポートデザイナー
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
##### フォームデザイナー
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
##### 大画面デザイナー
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
##### UniApp
|
||||

|
||||
|
||||

|
||||
|
||||
##### ローコードアプリ
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
##### アプリ
|
||||

|
||||

|
||||
|
||||
##### PAD
|
||||

|
||||

|
||||

|
||||
|
||||
|
||||
##### チャート
|
||||

|
||||
|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
##### Swagger
|
||||

|
||||

|
||||
|
||||
|
||||
## 寄付
|
||||
|
||||
よろしければ、作者にコーヒーを一杯おごってください ☺
|
||||
|
||||

|
||||
@ -1,4 +1,4 @@
|
||||
中文 | [English](./README.en-US.md)
|
||||
中文 | [English](./README.en-US.md) | [日本語](./README.ja-JP.md)
|
||||
|
||||
JeecgBoot AI低代码平台
|
||||
===============
|
||||
@ -594,4 +594,4 @@ AI写文章
|
||||
|
||||
如果觉得还不错,请作者喝杯咖啡吧 ☺
|
||||
|
||||

|
||||

|
||||
|
||||
@ -73,24 +73,25 @@ public class TikaDocumentParser {
|
||||
AssertUtils.assertNotEmpty("请选择文件", file);
|
||||
try {
|
||||
// 用于解析(使用FileInputStream避免file.toPath()在Linux非UTF-8环境下中文文件名报错)
|
||||
InputStream isForParsing = new FileInputStream(file);
|
||||
// 使用 Tika 自动检测 MIME 类型
|
||||
String fileName = file.getName().toLowerCase();
|
||||
//后缀
|
||||
String ext = FilenameUtils.getExtension(fileName);
|
||||
if (fileName.endsWith(".txt")
|
||||
|| fileName.endsWith(".md")
|
||||
|| fileName.endsWith(".pdf")) {
|
||||
return extractByTika(isForParsing);
|
||||
//update-begin---author:wangshuai---date:2026-01-09---for:【QQYUN-14261】【AI】AI助手,支持多模态能力- 文档---
|
||||
} else if (FILE_SUFFIX.contains(ext.toLowerCase())) {
|
||||
return parseDocExcelPdfUsingApachePoi(file);
|
||||
//update-end---author:wangshuai---date:2026-01-09---for:【QQYUN-14261】【AI】AI助手,支持多模态能力- 文档---
|
||||
} else {
|
||||
throw new IllegalArgumentException("不支持的文件格式: " + FilenameUtils.getExtension(fileName));
|
||||
try (InputStream isForParsing = new FileInputStream(file)) {
|
||||
// 使用 Tika 自动检测 MIME 类型
|
||||
String fileName = file.getName().toLowerCase();
|
||||
//后缀
|
||||
String ext = FilenameUtils.getExtension(fileName);
|
||||
if (fileName.endsWith(".txt")
|
||||
|| fileName.endsWith(".md")
|
||||
|| fileName.endsWith(".pdf")) {
|
||||
return extractByTika(isForParsing);
|
||||
//update-begin---author:wangshuai---date:2026-01-09---for:【QQYUN-14261】【AI】AI助手,支持多模态能力- 文档---
|
||||
} else if (FILE_SUFFIX.contains(ext.toLowerCase())) {
|
||||
return parseDocExcelPdfUsingApachePoi(file);
|
||||
//update-end---author:wangshuai---date:2026-01-09---for:【QQYUN-14261】【AI】AI助手,支持多模态能力- 文档---
|
||||
} else {
|
||||
throw new IllegalArgumentException("不支持的文件格式: " + FilenameUtils.getExtension(fileName));
|
||||
}
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
package org.jeecg.modules.test.seata.account.controller;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.jeecg.common.api.vo.Result;
|
||||
import org.jeecg.modules.test.seata.account.service.SeataAccountService;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
@ -20,7 +21,7 @@ public class SeataAccountController {
|
||||
private SeataAccountService accountService;
|
||||
|
||||
@PostMapping("/reduceBalance")
|
||||
public void reduceBalance(Long userId, BigDecimal amount) {
|
||||
accountService.reduceBalance(userId, amount);
|
||||
public Result<?> reduceBalance(Long userId, BigDecimal amount) {
|
||||
return accountService.reduceBalance(userId, amount);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,5 +1,7 @@
|
||||
package org.jeecg.modules.test.seata.account.service;
|
||||
|
||||
import org.jeecg.common.api.vo.Result;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
|
||||
/**
|
||||
@ -14,5 +16,5 @@ public interface SeataAccountService {
|
||||
* @param userId 用户 ID
|
||||
* @param amount 扣减金额
|
||||
*/
|
||||
void reduceBalance(Long userId, BigDecimal amount);
|
||||
Result<?> reduceBalance(Long userId, BigDecimal amount);
|
||||
}
|
||||
|
||||
@ -5,6 +5,7 @@ import com.baomidou.dynamic.datasource.annotation.DS;
|
||||
import io.seata.core.context.RootContext;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
import org.jeecg.common.api.vo.Result;
|
||||
import org.jeecg.modules.test.seata.account.entity.SeataAccount;
|
||||
import org.jeecg.modules.test.seata.account.mapper.SeataAccountMapper;
|
||||
import org.jeecg.modules.test.seata.account.service.SeataAccountService;
|
||||
@ -34,7 +35,7 @@ public class SeataAccountServiceImpl implements SeataAccountService {
|
||||
@DS("account")
|
||||
@Override
|
||||
@Transactional(propagation = Propagation.REQUIRES_NEW,rollbackFor = Exception.class)
|
||||
public void reduceBalance(Long userId, BigDecimal amount) {
|
||||
public Result<?> reduceBalance(Long userId, BigDecimal amount) {
|
||||
log.info("xid:"+ RootContext.getXID());
|
||||
log.info("=============ACCOUNT START=================");
|
||||
SeataAccount account = accountMapper.selectById(userId);
|
||||
@ -44,7 +45,7 @@ public class SeataAccountServiceImpl implements SeataAccountService {
|
||||
|
||||
if (balance.compareTo(amount)==-1) {
|
||||
log.warn("用户 {} 余额不足,当前余额:{}", userId, balance);
|
||||
throw new RuntimeException("余额不足");
|
||||
return Result.error("余额不足");
|
||||
}
|
||||
log.info("开始扣减用户 {} 余额", userId);
|
||||
BigDecimal currentBalance = account.getBalance().subtract(amount);
|
||||
@ -52,5 +53,6 @@ public class SeataAccountServiceImpl implements SeataAccountService {
|
||||
accountMapper.updateById(account);
|
||||
log.info("扣减用户 {} 余额成功,扣减后用户账户余额为{}", userId, currentBalance);
|
||||
log.info("=============ACCOUNT END=================");
|
||||
return Result.OK();
|
||||
}
|
||||
}
|
||||
|
||||
@ -4,7 +4,7 @@ spring:
|
||||
data:
|
||||
redis:
|
||||
##redis 单机环境配置
|
||||
host: localhost
|
||||
host: jeecg-boot-redis
|
||||
port: 6379
|
||||
database: 0
|
||||
password:
|
||||
@ -22,7 +22,7 @@ spring:
|
||||
autoconfigure:
|
||||
exclude: com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceAutoConfiguration
|
||||
datasource:
|
||||
url: jdbc:mysql://127.0.0.1:3306/jeecg_account?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&rewriteBatchedStatements=true
|
||||
url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg_account?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
|
||||
username: root
|
||||
password: root
|
||||
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||
@ -30,7 +30,7 @@ spring:
|
||||
init:
|
||||
schema-locations: classpath:sql/schema-account.sql
|
||||
seata:
|
||||
enable-auto-data-source-proxy: false
|
||||
enable-auto-data-source-proxy: true
|
||||
service:
|
||||
grouplist:
|
||||
default: 127.0.0.1:8091
|
||||
|
||||
@ -1,5 +1,6 @@
|
||||
package org.jeecg.modules.test.seata.order.feign;
|
||||
|
||||
import org.jeecg.common.api.vo.Result;
|
||||
import org.springframework.cloud.openfeign.FeignClient;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
@ -19,5 +20,5 @@ public interface AccountClient {
|
||||
* @return
|
||||
*/
|
||||
@PostMapping("/test/seata/account/reduceBalance")
|
||||
String reduceBalance(@RequestParam("userId") Long userId, @RequestParam("amount") BigDecimal amount);
|
||||
Result<?> reduceBalance(@RequestParam("userId") Long userId, @RequestParam("amount") BigDecimal amount);
|
||||
}
|
||||
|
||||
@ -1,5 +1,6 @@
|
||||
package org.jeecg.modules.test.seata.order.feign;
|
||||
|
||||
import org.jeecg.common.api.vo.Result;
|
||||
import org.springframework.cloud.openfeign.FeignClient;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
@ -21,5 +22,5 @@ public interface ProductClient {
|
||||
* @return
|
||||
*/
|
||||
@PostMapping("/test/seata/product/reduceStock")
|
||||
BigDecimal reduceStock(@RequestParam("productId") Long productId, @RequestParam("count") Integer count);
|
||||
Result<BigDecimal> reduceStock(@RequestParam("productId") Long productId, @RequestParam("count") Integer count);
|
||||
}
|
||||
|
||||
@ -5,6 +5,9 @@ import com.baomidou.dynamic.datasource.annotation.DS;
|
||||
import io.seata.core.context.RootContext;
|
||||
import io.seata.spring.annotation.GlobalTransactional;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.jeecg.common.api.vo.Result;
|
||||
import org.jeecg.common.exception.JeecgBootBizTipException;
|
||||
import org.jeecg.common.util.oConvertUtils;
|
||||
import org.jeecg.modules.test.seata.order.dto.PlaceOrderRequest;
|
||||
import org.jeecg.modules.test.seata.order.entity.SeataOrder;
|
||||
import org.jeecg.modules.test.seata.order.enums.OrderStatus;
|
||||
@ -59,13 +62,20 @@ public class SeataOrderServiceImpl implements SeataOrderService {
|
||||
orderMapper.insert(order);
|
||||
log.info("订单一阶段生成,等待扣库存付款中");
|
||||
// 扣减库存并计算总价
|
||||
BigDecimal amount = productClient.reduceStock(productId, count);
|
||||
Result<BigDecimal> productRes = productClient.reduceStock(productId, count);
|
||||
if (!productRes.isSuccess()) {
|
||||
String message = productRes.getMessage();
|
||||
message = oConvertUtils.isEmpty(message) ? "操作失败" : message;
|
||||
throw new JeecgBootBizTipException(message);
|
||||
}
|
||||
BigDecimal amount = productRes.getResult();
|
||||
// 扣减余额
|
||||
String str = accountClient.reduceBalance(userId, amount);
|
||||
Result<?> accountRes = accountClient.reduceBalance(userId, amount);
|
||||
// feign响应被二次封装,判断使主事务回滚
|
||||
JSONObject jsonObject = JSONObject.parseObject(str);
|
||||
if (jsonObject.getInteger("code") != 200) {
|
||||
throw new RuntimeException();
|
||||
if (!accountRes.isSuccess()) {
|
||||
String message = accountRes.getMessage();
|
||||
message = oConvertUtils.isEmpty(message) ? "操作失败" : message;
|
||||
throw new JeecgBootBizTipException(message);
|
||||
}
|
||||
|
||||
order.setStatus(OrderStatus.SUCCESS);
|
||||
|
||||
@ -4,7 +4,7 @@ spring:
|
||||
data:
|
||||
redis:
|
||||
##redis 单机环境配置
|
||||
host: localhost
|
||||
host: jeecg-boot-redis
|
||||
port: 6379
|
||||
database: 0
|
||||
password:
|
||||
@ -23,14 +23,14 @@ spring:
|
||||
exclude: com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceAutoConfiguration
|
||||
datasource:
|
||||
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||
url: jdbc:mysql://127.0.0.1:3306/jeecg_order?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useSSL=false
|
||||
url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg_order?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
|
||||
username: root
|
||||
password: root
|
||||
sql:
|
||||
init:
|
||||
schema-locations: classpath:sql/schema-order.sql
|
||||
seata:
|
||||
enable-auto-data-source-proxy: false
|
||||
enable-auto-data-source-proxy: true
|
||||
service:
|
||||
grouplist:
|
||||
default: 127.0.0.1:8091
|
||||
|
||||
@ -1,5 +1,6 @@
|
||||
package org.jeecg.modules.test.seata.product.controller;
|
||||
|
||||
import org.jeecg.common.api.vo.Result;
|
||||
import org.jeecg.modules.test.seata.product.service.SeataProductService;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
@ -20,7 +21,7 @@ public class SeataProductController {
|
||||
private SeataProductService seataProductService;
|
||||
|
||||
@PostMapping("/reduceStock")
|
||||
public BigDecimal reduceStock(Long productId, Integer count, HttpServletRequest request) {
|
||||
public Result<BigDecimal> reduceStock(Long productId, Integer count, HttpServletRequest request) {
|
||||
return seataProductService.reduceStock(productId, count);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,5 +1,7 @@
|
||||
package org.jeecg.modules.test.seata.product.service;
|
||||
|
||||
import org.jeecg.common.api.vo.Result;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
|
||||
/**
|
||||
@ -16,5 +18,5 @@ public interface SeataProductService {
|
||||
* @param count 扣减数量
|
||||
* @return 商品总价
|
||||
*/
|
||||
BigDecimal reduceStock(Long productId, Integer count);
|
||||
Result<BigDecimal> reduceStock(Long productId, Integer count);
|
||||
}
|
||||
|
||||
@ -5,6 +5,7 @@ import io.seata.core.context.RootContext;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
|
||||
import org.jeecg.common.api.vo.Result;
|
||||
import org.jeecg.modules.test.seata.product.entity.SeataProduct;
|
||||
import org.jeecg.modules.test.seata.product.mapper.SeataProductMapper;
|
||||
import org.jeecg.modules.test.seata.product.service.SeataProductService;
|
||||
@ -35,7 +36,7 @@ public class SeataProductServiceImpl implements SeataProductService {
|
||||
@DS("product")
|
||||
@Transactional(propagation = Propagation.REQUIRES_NEW,rollbackFor = Exception.class)
|
||||
@Override
|
||||
public BigDecimal reduceStock(Long productId, Integer count) {
|
||||
public Result<BigDecimal> reduceStock(Long productId, Integer count) {
|
||||
log.info("xid:"+ RootContext.getXID());
|
||||
log.info("=============PRODUCT START=================");
|
||||
// 检查库存
|
||||
@ -46,7 +47,7 @@ public class SeataProductServiceImpl implements SeataProductService {
|
||||
|
||||
if (stock < count) {
|
||||
log.warn("商品编号为{} 库存不足,当前库存:{}", productId, stock);
|
||||
throw new RuntimeException("库存不足");
|
||||
return Result.error("库存不足");
|
||||
}
|
||||
log.info("开始扣减商品编号为 {} 库存,单价商品价格为{}", productId, product.getPrice());
|
||||
// 扣减库存
|
||||
@ -56,6 +57,6 @@ public class SeataProductServiceImpl implements SeataProductService {
|
||||
BigDecimal totalPrice = product.getPrice().multiply(new BigDecimal(count));
|
||||
log.info("扣减商品编号为 {} 库存成功,扣减后库存为{}, {} 件商品总价为 {} ", productId, currentStock, count, totalPrice);
|
||||
log.info("=============PRODUCT END=================");
|
||||
return totalPrice;
|
||||
return Result.OK(totalPrice);
|
||||
}
|
||||
}
|
||||
@ -1,6 +1,15 @@
|
||||
server:
|
||||
port: 5003
|
||||
spring:
|
||||
data:
|
||||
redis:
|
||||
##redis 单机环境配置
|
||||
host: jeecg-boot-redis
|
||||
port: 6379
|
||||
database: 0
|
||||
password:
|
||||
ssl:
|
||||
enabled: false
|
||||
application:
|
||||
name: seata-product
|
||||
cloud:
|
||||
@ -14,14 +23,14 @@ spring:
|
||||
exclude: com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceAutoConfiguration
|
||||
datasource:
|
||||
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||
url: jdbc:mysql://127.0.0.1:3306/jeecg_product?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useSSL=false
|
||||
url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg_product?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
|
||||
username: root
|
||||
password: root
|
||||
sql:
|
||||
init:
|
||||
schema-locations: classpath:sql/schema-product.sql
|
||||
seata:
|
||||
enable-auto-data-source-proxy: false
|
||||
enable-auto-data-source-proxy: true
|
||||
service:
|
||||
grouplist:
|
||||
default: 127.0.0.1:8091
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user