- 需要分析
- データベースモデリング
- インターフェイスのドキュメント
- フルバックエンドサービス
- 単体テスト
テンプレート 1: ChatGPT を使用してゼロから開発し、数万の同時 seckill システムをサポートする
1. 私: 質問する
假设你是Java架构师,请用Java语言开发一个秒杀下单接口,要求如下:
2. 将数据库里的商品库存预先加载到redis里面存储
3. 下单操作时先检查rediss里的商品库存是否足够扣减
4. 如果redis里有足够库存就先扣减库存然后再生产订单
2.ChatGPT: 返信
Java アーキテクトとして、お客様の要件を満たす seckill オーダー インターフェイスを実装する簡単な方法を提供できます。
まず、Java プログラム データベースで Redis と MySQL を接続して操作するために、Redis と MySQL の Java クライアント ライブラリを導入する必要があります。
次に、seckill オーダー インターフェイスの実装を次のように記述できます。
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Transaction;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class SecKillOrderService {
// Redis 连接相关配置
private static final String REDIS_HOST = "localhost";
private static final int REDIS_PORT = 6379;
private static final String REDIS_PASSWORD = null; // 如果 Redis 无密码可以不设置
private static final int REDIS_TIMEOUT = 10000;
// Redis 商品库存 key 前缀
private static final String STOCK_PREFIX = "stock_";
// MySQL 连接相关配置
private static final String MYSQL_URL = "jdbc:mysql://localhost:3306/dbname?useSSL=false";
private static final String MYSQL_USER = "username";
private static final String MYSQL_PASSWORD = "password";
/**
* 秒杀下单接口
*
* @param productId 商品 ID
* @param userId 用户 ID
* @return 下单成功返回订单 ID,库存不足返回 null
*/
public String secKillOrder(long productId, long userId) {
// 初始化 Redis 连接
Jedis jedis = new Jedis(REDIS_HOST, REDIS_PORT, REDIS_TIMEOUT);
if (REDIS_PASSWORD != null) {
jedis.auth(REDIS_PASSWORD);
}
// 构造商品库存 key
String stockKey = STOCK_PREFIX + productId;
// Redis WATCH 操作,用于乐观锁控制并发操作
jedis.watch(stockKey);
int stock = Integer.parseInt(jedis.get(stockKey));
if (stock <= 0) {
// 库存不足
jedis.unwatch();
return null;
}
// Redis MULTI/EXEC 操作,用于原子地扣减库存和创建订单
Transaction tx = jedis.multi();
tx.decr(stockKey);
// 模拟订单生成,插入订单到 MySQL 数据库
String orderId = createOrder(productId, userId);
tx.exec();
return orderId;
}
/**
* 创建订单,插入订单到 MySQL 数据库
*
* @param productId 商品 ID
* @param userId 用户 ID
* @return 订单 ID
*/
private String createOrder(long productId, long userId) {
String orderId = null;
Connection conn = null;
PreparedStatement stmt = null;
try {
// 初始化 MySQL 连接
conn = DriverManager.getConnection(MYSQL_URL, MYSQL_USER, MYSQL_PASSWORD);
// 开始 MySQL 事务
conn.setAutoCommit(false);
// 构造 SQL 插入语句,插入订单
String sql = "INSERT INTO orders (product_id, user_id) VALUES (?, ?)";
stmt = conn.prepareStatement(sql);
stmt.setLong(1, productId);
stmt.setLong(2, userId);
stmt.executeUpdate();
// 获取插入的订单 ID
sql = "SELECT LAST_INSERT_ID()";
3. 私: 質問する
继续
4.ChatGPT: 返信
stmt = conn.prepareStatement(sql);
orderId = stmt.executeQuery().getString(1);
// 提交 MySQL 事务
conn.commit();
} catch (SQLException e) {
// 如果 MySQL 出现异常,则回滚事务
if (conn != null) {
try {
conn.rollback();
} catch (SQLException ex) {
ex.printStackTrace();
}
}
e.printStackTrace();
} finally {
// 关闭 MySQL 连接和语句对象
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return orderId;
}
}
上記のコードでは、Redis を使用して商品在庫を保管し、発注前に Redis 内の商品在庫が十分であるかどうかを確認し、Redis に十分な在庫がある場合は、Redis の WATCH オペレーションを使用して楽観的ロック制御の並行オペレーションを実行し、次に Redis を使用します。 MULTI/EXEC 操作は、在庫のアトミックな控除と注文の作成を実行します。同時に、JDBC を使用して createOrder メソッドで MySQL データベースに接続し、注文を挿入して注文 ID を返します。上記のコードは単なる例であり、実際の seckill シナリオでは、高可用性と分散ロック制御のために Redis クラスターを使用するなど、さらなる最適化と拡張が必要になる場合があることに注意してください。
5. 私: 質問する
注文生成メソッド xxxxx を変更して注文を MQ に送信し、生成された注文をデータに非同期的に消費したいと考えています。
6. 私: 質問する
次に、注文インターフェイスの高可用性を確保する必要があります。注文プロセス中に Redis サービスがハングアップした場合はどうすればよいですか?
7. 私: 質問する
このように対処していただければ幸いです。注文プロセス中に Redis サービスがハングアップした場合、このリクエストをローカル キャッシュまたはファイルにキャッシュし、定期的に Redis へのアクセスを再試行できます。Redis が応答した場合は、注文を続行します。オーダー
8. 私: 質問する
続く
9. 私: 質問する
最初のポイントの最適化を続ける
10. 私: 質問する
注文を出し、MQ を非同期的に使用して注文を生成するためのコードを引き続き生成してください。
。。。。。
テンプレート 2: ChatGPT を使用して給与支払いアプリケーションをゼロから開発する
要件文書
給与支払システム基本仕様
以下は、お客様とシステムについて話し合う際に作成したメモの一部です。
このシステムには、社内のすべての従業員情報のデータベースと、勤務タイム カード データなどの従業員に関連するその他のデータが含まれています。従業員一人ひとりの給与支払いに利用できるシステムです。そして、システムは指定された方法に従って従業員に正しい金額の給与を期限通りに支払わなければなりません。同時に、最終的に従業員に支払われる給与からさまざまな控除を差し引く必要があります。
一部の従業員は時間給労働者です。これらの従業員のデータベース レコードには、時給を記録するために使用されるフィールドがあります。勤務日と勤務時間を記録した勤務タイムカードを毎日提出することが義務付けられています。1日8時間を超えて働いた場合、8時間を超えた時間分の賃金は通常の時給の1.5倍となります。これらの従業員には毎週金曜日に給料が支払われます。
一部の従業員には、毎月固定給が支払われます。これらの従業員には毎月末日に給料が支払われます。これらの従業員のデータベース記録には、毎月の給与を記録するために使用されるフィールドがあります。
営業職に従事する社員もおり、売上に応じて歩合給が支払われます。販売時間と販売金額を記録した販売伝票を提出する必要があります。データベースの記録には、手数料率を記録するフィールドがあります。コミッションは、2週間の毎週金曜日に支払われます。
従業員は給与の支払い方法を自由に選択できます。給与を指定の住所に郵送することも選択でき、給与を一時的にレジ係に預けていつでも引き出すこともでき、給与を指定の銀行口座に直接入金することもできます。
一部の従業員は会社の組合員です。彼らのデータベースレコードには、週ごとの会費を記録するフィールドがあり、会費は給与から差し引かれます。さらに、組合は個々の組合員のサービス料を随時査定する場合もあります。これらのサービス料は組合によって毎週提出され、各従業員の次回の給与から差し引かれる必要があります。
背景を設定する
1. 私: 質問する
あなたが Java アーキテクトで、私が初心者であれば、プログラムの開発を手伝っていただければ幸いです。次に、要件ドキュメントを渡します。まずよく理解しておく必要があります。後であなたの助けが必要になります。私の開発環境を紹介したいと思いますが、私のコンピューターのオペレーティング システムは Mac で、MySQL データベース、JDK、IDEA がインストールされています。研究開発の準備はできています、準備はできていますか?
2.ChatGPT: 返信
わかりました。このプログラムの開発をお手伝いさせていただきます。要件ドキュメントを私に送ってください。私は要件を詳細に読んで理解します。その後、このプログラムを実装するための最良の方法を一緒に話し合うことができます。同時に、Java プログラミングの理解と能力が確実に向上するようにし、開発プロセス中に、このプロジェクトを正常に完了できるよう、関連する技術的なガイダンスや提案を提供します。
3. 私: 質問する
給与支払システム基本仕様
お客様とシステムを検討する際に留意した点を以下に記載します。
- このシステムには、社内のすべての従業員情報のデータベースと、勤務タイム カード データなどの従業員に関連するその他のデータが含まれています。従業員一人ひとりの給与支払いに利用できるシステムです。そして、システムは指定された方法に従って従業員に正しい金額の給与を期限通りに支払わなければなりません。同時に、最終的に従業員に支払われる給与からさまざまな控除を差し引く必要があります。
- 一部の従業員は時間給労働者です。これらの従業員のデータベース レコードには、時給を記録するために使用されるフィールドがあります。勤務日と勤務時間を記録した勤務タイムカードを毎日提出することが義務付けられています。1日8時間を超えて働いた場合、8時間を超えた時間分の賃金は通常の時給の1.5倍となります。これらの従業員には毎週金曜日に給料が支払われます。
- 一部の従業員には、毎月固定給が支払われます。これらの従業員には毎月末日に給料が支払われます。これらの従業員のデータベース記録には、毎月の給与を記録するために使用されるフィールドがあります。
- 営業職に従事する社員もおり、売上に応じて歩合給が支払われます。販売時間と販売金額を記録した販売伝票を提出する必要があります。データベースの記録には、手数料率を記録するフィールドがあります。コミッションは、2週間の毎週金曜日に支払われます。
- 従業員は給与の支払い方法を自由に選択できます。給与を指定の住所に郵送することも選択でき、給与を一時的にレジ係に預けていつでも引き出すこともでき、給与を指定の銀行口座に直接入金することもできます。
- 一部の従業員は会社の組合員です。彼らのデータベースレコードには、週ごとの会費を記録するフィールドがあり、会費は給与から差し引かれます。さらに、組合は個々の組合員のサービス料を随時査定する場合もあります。これらのサービス料は組合によって毎週提出され、各従業員の次回の給与から差し引かれる必要があります。
4.ChatGPT: 返信
要件ドキュメントをありがとうございます。システムに対する私の最初の考えと提案を以下に示します。
- データベース設計
まず、従業員の基本情報、勤務タイムカードデータ、売上伝票、給与支払記録などを含むシステムのデータベースを設計する必要があります。設計にはMySQLデータベースを使用できます。次のテーブルの設計を検討してください。
- 従業員情報フォーム: 従業員番号、氏名、住所、支払方法、組合加入などの従業員の基本情報が含まれます。
- 勤務タイムカードフォーム: 従業員が毎日提出する勤務タイムカードを、従業員番号、日付、勤務時間、その他の情報を含めて記録します。
- 販売伝票フォーム: 営業従業員によって提出された販売伝票を、従業員番号、日付、売上金額、その他の情報を含めて記録します。
- 給与支払記録フォーム: 従業員番号、支払日、支払金額、その他の情報を含む、各給与支払の関連情報を記録します。
- 給与計算
次に、各従業員の給与を計算し、給与支払記録フォームに記録するための Java コードを作成する必要があります。要件文書に記載されているさまざまな支払い方法と給与計算方法に従って、次のアルゴリズムの使用を検討できます。
- 月給が固定の従業員の場合は、月給に基づいて直接計算できます。
- パートタイム労働者の場合は、提出された勤務タイムカードに基づいて給与を計算する必要があります。労働時間が8時間を超える場合、時間外労働手当は通常の時給の1.5倍で計算されます。
- 営業スタッフの場合は、提出した売上伝票に基づいて手数料を計算し、手数料率に基づいて手数料金額を計算する必要があります。
各従業員の給与を計算した後、税金や保険料、組合費などの諸控除を考慮し、控除された給与額を給与支払調書に記録する必要があります。
- 給与支払い方法
要件文書に記載されている給与支払い方法に従って、次のアルゴリズムの使用を検討できます。
- 小切手の郵送または小切手保管を選択した従業員の場合、給与小切手をその場で送付または保管することができ、小切手番号および郵送または保管状況を給与支払記録用紙に記録することができます。
- 給与を銀行口座に入金することを選択した従業員は、Java コードを使用して銀行振込機能を自動化し、給与支払記録フォームに振込ステータスと振込日を記録できます。
- その他の機能
最後に、従業員情報管理、労働組合費の計算、サービス料控除などのその他の機能の実現も検討する必要があります。従業員情報管理では、従業員情報の追加・変更・削除機能を実装でき、組合費の計算では、売上に応じて営業社員の歩合を計算できます。
彼らの売り上げ。従業員データベースには、手数料率を記録するフィールドがあります。2 週間の毎週金曜日に、システムは手数料を計算し、対応する手数料金額を支払います。営業担当者は販売時刻と販売金額を記録した販売伝票を提出する必要があり、これらのデータはデータベースに保存する必要があります。
-
給与支払方法
従業員は給与支払方法を自由に選択できます。給与小切手を指定した住所に郵送することも、給与小切手を一時的にレジ係に保管しておいて、いつでも引き出すこともできます。さらに、従業員は給与を自分の指定した銀行口座に直接振り込むこともできます。これらの機能を実現するには、銀行や郵便事業者のAPIとシステムを連携させる必要があります。 -
組合員の会費とサービス料
組合員は毎週一定の会費を支払う必要があり、これらのデータは従業員データベースに保存する必要があります。さらに、組合は随時、個々の組合員のサービス料を査定することがあります。これらのサービス料は組合によって毎週提出され、各従業員の次回の給与から差し引かれる必要があります。システムは給与計算時にこれらの控除を考慮する必要があります。
以上が給与支払システムの基本仕様の説明であり、その後、具体的な開発・導入計画について議論していきます。
データベースモデリング
- 私はこう尋ねます。
我希望你按照业务数据库建模规范和最佳实践给我写一份数据库建模表格文档,包含表名、列名、数据类型、约束条件、描述、枚举值(用数字代替),ID不是自增,使用雪花ID算法生成,标准字段:create_time、update_time、deleted
- ChatGPT: 返信
- 私はこう尋ねます。
你刚因为回复长度限制问题中断了,我需要你继续回答
- ChatGPT: 返信
- ME の質問: 最初のステップは完了しました。コンピューターに MySQL8 をインストールしました。テーブル構造を設計するときは、システムが将来のデータに耐えられるように、クエリのパフォーマンス、データ サイズ、増加傾向を考慮する必要があります。アクセス負荷、関連するフィールド コメント コメント、テーブル コメント コメント、およびインデックスを作成する必要があるコメントも追加する必要があります。次に、テーブル ステートメントとインデックス ステートメントを作成して、高速化します。
- ChatGPT: 返信
- 私の質問:
你刚因为回复长度限制问题中断了,我需要你继续从
Union_membership继续返回我建表语句
- ChatGPT: 返信
- ME の質問:
我需要员工表、工作时间卡表、销售凭证表、工会会员表。每张表5条左右的测试数据,覆盖了每个字段的情况,特殊字段符合中文风格要求。每条SQL语句都可以直接执行,以插入测试数据。
由于多张表容易发生请求中断情况需要拆分,一张表一张表的创建
従業員テーブルが必要です。テーブルには各フィールドの状況をカバーするテスト データが 5 つほどあり、特殊フィールドは中国式の要件を満たしています。各 SQL ステートメントを直接実行してテスト データを挿入できます。 - ChatGPT: 返信
- 私はこう尋ねます。
你刚因为回复长度限制问题中断了,我需要你继续回答
- SQL ステートメントを MySQL クライアントにコピーしてテーブル検証を作成します
インターフェイスのドキュメント
-
私はこう尋ねます。
按照前面生成的表结构来分析,如果需要你设计一份标准的基于RESTFul接口文档,每一个接口都需要进行分析和论证必要性和设计合理性。预计你会出多少个接口?
-
ChatGPT: 返信
-
私はこう尋ねます。
我需要员工接口的需求文档,你写完发我
-
ChatGPT: 返信
-
私はこう尋ねます。
要求:返回OpenAPI规范JSON格式,描述信息需要中文,有些情况需要分页,考虑数据边界值。接口:添加员工
-
ChatGPT: 返信
导入 https://app.apifox.com/project or postman
バックエンドサービスを完了する
環境に依存する
- 私はこう尋ねます。
接下来我们就进入开发环节,我希望的技术栈是Java17+SpringBoot+MyBatisPlus+Lombok的方式进行开发,你可以一步一步教我如何搭建一个项目吗?
- ChatGPT: 返信
- 私はこう尋ねます。
我需要lombok的pom依赖代码
- ChatGPT: 返信
- 私はこう尋ねます。
我需要mysql8驱动的pom依赖代码
- ChatGPT: 返信
バージョンの更新と Mysql データベース構成は依然として自分で変更する必要があります
エンティティクラス
- 私はこう尋ねます。
基于前面你生成的4张数据库表结构,接下来我们建实体类,我要求:import语句、lombok、字段注解、类注释都需要
- ChatGPT: 返信
- 私はこう尋ねます。
你刚因为回复长度限制问题中断了,我需要你继续回答
- ChatGPT:
IDEA に COPY インポートを返信
マッパー
- 私はこう尋ねます。
基于前面你生成的4个实体类,接下来我们建Mapper层接口,要求继承MyBatisPlus的BaseMapper类,但是不需要写任何接口
- ChatGPT: 返信
- 私はこう尋ねます。
你给的Mapper层代码没有注入Spring
- ChatGPT: 返信
- 私はこう尋ねます。
在Spring中注入Mapper层代码,有全局的方案吗?
- ChatGPT: 返信
サービス
- 私はこう尋ねます。
基于前面的需求文档,接下来我们开始进行核心业务功能设计,要求:利用面向对象的设计原则和设计模式,确保业务功能的实现即健康又易于维护,先不用告诉我代码实现。
- ChatGPT: 返信
- 私はこう尋ねます。
按照你设计的业务功能。我现在需要EmployeeService的接口类和实现类,要求:结合Mybatis-Plus实现, 核心业务必须加上适当的注释
- ChatGPT: 返信
- 私はこう尋ねます。
少了一个查询员工列表(支持分页)的接口方法
- ChatGPT: 返信
- 私はこう尋ねます。
按照你设计的业务功能。我现在需要PaymentService的接口类和实现类,要求:结合Mybatis-Plus实现, 核心业务必须加上适当的注释,需要实现计算员工薪水(支持钟点工、月薪员工、销售员)、需要实现支付员工薪水(支持邮寄支票、暂停支票、银行账号支付)
- ChatGPT: 返信
- 私はこう尋ねます。
在PaymentServiceImpl 当中caculateSalary的方法,我没有所属的三个子类,我也并不想创建,我想直接在里面计算
- ChatGPT: 返信
- 私はこう尋ねます。
在PaymentServiceImpl实现类中getWorkedHours、getTotalSales找不到报错,我需要你给我实现出来
- ChatGPT: 返信
- 私はこう尋ねます。
getTotalWorkedHours要进行修改,钟点工是每周支付一次最近一周的薪水而不是全部薪水,而销售类员工则是按照每月最后一天支付一次当月的销售额的提成。所以SQL需要进行调整
- ChatGPT: 返信
時限タスク
- 私はこう尋ねます。
结合前面的业务需求和已完成的代码,我需要结合SpringBoot创建一个定时任务执行,要求:核心业务代码需要添加必要的注解,每天运行一次、每周五支付钟点工薪水、每月最后一天支付月薪员工薪水、每月最后一天支付销售员佣金
- ChatGPT: 返信
- 私はこう尋ねます。
结合前面的业务需求和已完成的代码,我需要结合SpringBoot创建一个定时任务执行,要求:核心业务代码需要添加必要的注解,每天运行一次、每周五支付钟点工薪水、每月最后一天支付月薪员工薪水、每月最后一天支付销售员佣金,需要结合PaymentServiceImpl中calculateSalary和paySalary方法实现
- ChatGPT: 返信
- 私はこう尋ねます。
在paymentService当中getEmployees()并没有,他应该在EmployeeService当中, 所以需要你修改一下
- ChatGPT: 返信
- 私はこう尋ねます。
在EmployeeService当中getEmployees()方法不存在,我需要你实现出来
- ChatGPT: 返信
駆け上がる
- 私はこう尋ねます。
当我启动SpringBoot服务时出现一个错误:xxxxxxxxx
- ChatGPT: 返信
単体テスト
- 私はこう尋ねます。
基于前面实现的EmployeeService,接下来需要帮我们为所有方法进行单元测试用例的编写,要求:核心代码需要加上适当的中文注释,结合spring-boot-starter-test实现。我需要EmployeeService类中所有的方法写出来可测试的单例,并不是Demo
- ChatGPT: 返信
- 私はこう尋ねます。
你这边缺少了一个单例测试方法listEmployees(Page<Employee> page)。我需要你补充回答
- ChatGPT: 返信
- 私はこう尋ねます。
基于前面实现的PaymentService,接下来需要帮我们为所有方法进行单元测试用例的编写,要求:核心代码需要加上适当的中文注释,结合spring-boot-starter-test实现。我需要PaymentService类中所有的方法写出来可测试的单例,并不是Demo
- ChatGPT: 返信
- 私はこう尋ねます。
基于前面实现的ScheduledTasks,接下来需要帮我们为所有方法进行单元测试用例的编写,要求:核心代码需要加上适当的中文注释,结合spring-boot-starter-test实现。我需要ScheduledTasks类中所有的方法写出来可测试的单例,并不是Demo
- ChatGPT: 返信
ダイアログフロー添付ファイル
ChatGPT-ChatGPT.html を使用して Java フラッシュ注文インターフェイスを最初から開発する
ChatGPT.mhtml を使用して給与アプリケーション ソフトウェアを最初から開発します。