hi,我是熵減,見字如面。
昨天我們用ChatGPT來設計一個賬號系統,並嘗試輸出:模型表,類關係圖,序列圖,狀態圖等常用的架構設計中常用的元素。
今天,我們繼續向更高層級延伸一下,看ChatGPT能不能更進一步釋放工程師的生產力,創造更多的可能性。
所以,這次我們就來嘗試用ChatGPT,來構建賬號系統的C4模型的架構圖啦。
由於ChatGPT不能直接輸出影像,所以我們轉化為用Mermaid的指令碼,透過markdown的方式輸出,再用支援Mermaid渲染的工具,將圖片顯示出來。
生成資料庫初始化SQL
我們首先來試試,生成資料庫初始化SQL吧。
提示:將以上賬號系統的資料模型,生成MySQL資料庫的SQL
ChatGPT:
-- 建立表:Account
CREATE TABLE Account (
id INT PRIMARY KEY,
username VARCHAR(50) NOT NULL,
password VARCHAR(50) NOT NULL,
email VARCHAR(50),
phone_number VARCHAR(20),
state VARCHAR(20),
email_ver BOOLEAN DEFAULT false,
phone_ver BOOLEAN DEFAULT false,
created_at DATETIME,
updated_at DATETIME
);
-- 建立表:EmailVerification
CREATE TABLE EmailVerification (
id INT PRIMARY KEY,
token VARCHAR(50) NOT NULL,
expired_at DATETIME,
account_id INT,
FOREIGN KEY (account_id) REFERENCES Account(id)
);
-- 建立表:PhoneVerification
CREATE TABLE PhoneVerification (
id INT PRIMARY KEY,
token VARCHAR(50) NOT NULL,
expired_at DATETIME,
phone_number VARCHAR(20),
account_id INT,
FOREIGN KEY (account_id) REFERENCES Account(id)
);
-- 建立表:ThirdPartySocialAccount
CREATE TABLE ThirdPartySocialAccount (
id INT PRIMARY KEY,
provider VARCHAR(20) NOT NULL,
provider_id VARCHAR(50) NOT NULL,
account_id INT,
FOREIGN KEY (account_id) REFERENCES Account(id)
);
-- 建立表:LoginRecord
CREATE TABLE LoginRecord (
id INT PRIMARY KEY,
account_id INT,
login_at DATETIME,
FOREIGN KEY (account_id) REFERENCES Account(id)
);
以上SQL語句可以在MySQL資料庫中建立相應的表,包括Account、EmailVerification、PhoneVerification、ThirdPartySocialAccount和LoginRecord五個表,並設定它們之間的關聯關係。
直接輸出C4 Diagram
接下來我們直接嘗試其是否可以輸出系統的C4模型的程式碼吧。
提示:對於系統架構圖,用Mermaid's c4 diagram是非常有效的,接下來,我們需要開始構建c4 模型的Mermaid指令碼,並用markdown
ChatGPT:
好的,以下是用Mermaid's C4 Diagram構建系統架構圖的Mermaid指令碼,並用markdown格式輸出:
## C4 Model for Account System
### Level 1: System Context Diagram
title Account System - System Context Diagram
actor User
User -> AccountSystem: Use
### Level 2: Container Diagram
title Account System - Container Diagram
AccountSystem -> AccountService: Uses
AccountSystem -> EmailService: Uses
AccountSystem -> PhoneService: Uses
AccountSystem -> ThirdPartyService: Uses
AccountSystem -> Database: Uses
AccountService -> Database: Reads/Writes
EmailService -> Database: Reads/Writes
PhoneService -> Database: Reads/Writes
ThirdPartyService -> Database: Reads/Writes
### Level 3: Component Diagram
title Account System - Component Diagram
AccountSystem --> AccountService: Manages Accounts
AccountSystem --> EmailService: Sends Email
AccountSystem --> PhoneService: Sends SMS
AccountSystem --> ThirdPartyService: Interacts with Social Platforms
AccountService --> Account: Accesses Account Data
EmailService --> EmailVerification: Validates Email
PhoneService --> PhoneVerification: Validates Phone Number
Account --> PasswordSecurity: Manages Passwords
Account --> LoginRecord: Records Login Information
雖然給出了完整的程式碼,但在我的vscode的外掛中,無法渲染出正確的結果圖。
我推測由於ChatGPT訓練的時間是21年的,所以其給出的程式碼版較低,而Mermaid近期升級了對C4模型的指令碼規範,所以,我試圖提升ChatGPT升級一下:
提示:這不是最新版的,請用Mermaid的最新版的C4 Diagrams指令碼,再次輸出
ChatGPT:
輸出的結果,依然在我的渲染外掛中無法展示。
所以,我嘗試換了一種方法,來讓其幫我繼續做C4模型圖,這也是我發現的一個大驚喜:
你給ChatGPT一個內容模版,它立馬就會學會應用,而且效果驚人。
下面我們繼續來看新方法的過程。
C4模型實驗
C4Context檢視
我輸入的提示:下面,我要給你一個最新版本的Mermaid C4 Diagrams指令碼案例,你要記住哦
ChatGPT:好的,儘管跟我分享吧。
我將從Mermaid官網上覆制的C4Context程式碼輸入給了ChatGPT:
C4Context
title System Context diagram for Internet Banking System
Enterprise_Boundary(b0, "BankBoundary0") {
Person(customerA, "Banking Customer A", "A customer of the bank, with personal bank accounts.")
Person(customerB, "Banking Customer B")
Person_Ext(customerC, "Banking Customer C", "desc")
Person(customerD, "Banking Customer D", "A customer of the bank, <br/> with personal bank accounts.")
System(SystemAA, "Internet Banking System", "Allows customers to view information about their bank accounts, and make payments.")
Enterprise_Boundary(b1, "BankBoundary") {
SystemDb_Ext(SystemE, "Mainframe Banking System", "Stores all of the core banking information about customers, accounts, transactions, etc.")
System_Boundary(b2, "BankBoundary2") {
System(SystemA, "Banking System A")
System(SystemB, "Banking System B", "A system of the bank, with personal bank accounts. next line.")
}
System_Ext(SystemC, "E-mail system", "The internal Microsoft Exchange e-mail system.")
SystemDb(SystemD, "Banking System D Database", "A system of the bank, with personal bank accounts.")
Boundary(b3, "BankBoundary3", "boundary") {
SystemQueue(SystemF, "Banking System F Queue", "A system of the bank.")
SystemQueue_Ext(SystemG, "Banking System G Queue", "A system of the bank, with personal bank accounts.")
}
}
}
BiRel(customerA, SystemAA, "Uses")
BiRel(SystemAA, SystemE, "Uses")
Rel(SystemAA, SystemC, "Sends e-mails", "SMTP")
Rel(SystemC, customerA, "Sends e-mails to")
UpdateElementStyle(customerA, $fontColor="red", $bgColor="grey", $borderColor="red")
UpdateRelStyle(customerA, SystemAA, $textColor="blue", $lineColor="blue", $offsetX="5")
UpdateRelStyle(SystemAA, SystemE, $textColor="blue", $lineColor="blue", $offsetY="-10")
UpdateRelStyle(SystemAA, SystemC, $textColor="blue", $lineColor="blue", $offsetY="-40", $offsetX="-50")
UpdateRelStyle(SystemC, customerA, $textColor="red", $lineColor="red", $offsetX="-50", $offsetY="20")
UpdateLayoutConfig($c4ShapeInRow="3", $c4BoundaryInRow="1")
ChatGPT:
提示:請按照上面給的案例,輸出我們修改後的賬號系統的C4Context的Mermaid指令碼,用markdown輸出
ChatGPT輸出:
C4Context
title Account System Context Diagram
Enterprise_Boundary(EB, "Account System Boundary") {
System(AccountSystem, "Account System", "Allows users to manage their accounts, passwords, and login sessions.")
User(User, "User", "A user of the account system.")
System_Ext(MailSystem, "Email System", "The internal email system.")
System_Ext(SMS, "SMS System", "The system that sends SMS messages for 2FA.")
AccountSystem --> User
AccountSystem --> MailSystem
AccountSystem --> SMS
}
BiRel(User, AccountSystem, "Uses")
Rel(AccountSystem, MailSystem, "Sends emails")
Rel(AccountSystem, SMS, "Sends SMS messages for 2FA")
UpdateElementStyle(User, $fontColor="red", $bgColor="grey", $borderColor="red")
UpdateRelStyle(User, AccountSystem, $textColor="blue", $lineColor="blue", $offsetX="5")
UpdateRelStyle(AccountSystem, MailSystem, $textColor="blue", $lineColor="blue", $offsetY="-10", $offsetX="-50")
UpdateRelStyle(AccountSystem, SMS, $textColor="blue", $lineColor="blue", $offsetY="10", $offsetX="-50")
程式碼渲染後為:
實驗成功,那接下來的其他的C4模型,就可以如法炮製啦。
C4Container檢視
提供Mermaid官網的demo後,就可以提示:
請按照上面給的案例,輸出我們我們要處理賬號系統C4Container的Mermaid指令碼,用markdown輸出
ChatGPT輸出程式碼為:
C4Container
title Container diagram for Account System
System_Ext(identity_provider, "Identity Provider", "An external identity provider, such as Auth0 or Okta", $tags="v1.0")
Person(user, User, "A user of the system, with a registered account", $tags="v1.0")
Container_Boundary(c1, "Account System") {
Container_Ext(web_app, "Web Application", "Java, Spring MVC", "Delivers the static content and the account system SPA")
Container(spa, "Single-Page App", "JavaScript, Angular", "Provides all the account system functionality to users via their web browser")
ContainerDb(database, "Database", "SQL Database", "Stores user registration information, hashed auth credentials, access logs, etc.")
ContainerDb_Ext(api, "API Application", "Java, Docker Container", "Provides account system functionality via API")
}
Rel(user, web_app, "Uses", "HTTPS")
UpdateRelStyle(user, web_app, $offsetY="60", $offsetX="90")
Rel(user, spa, "Uses", "HTTPS")
UpdateRelStyle(user, spa, $offsetY="-40")
Rel(web_app, spa, "Delivers")
UpdateRelStyle(web_app, spa, $offsetX="130")
Rel(spa, api, "Uses", "async, JSON/HTTPS")
Rel_Back(database, api, "Reads from and writes to", "sync, JDBC")
Rel(identity_provider, user, "Provides authentication for")
UpdateRelStyle(identity_provider, user, $offsetX="-45")
Rel(api, identity_provider, "Uses", "async, OAuth2/OpenID Connect")
UpdateRelStyle(api, identity_provider, $offsetY="-60")
指令碼渲染後圖片為:
C4Component檢視
提供Mermaid官網的demo後,就可以提示:
請按照上面給的案例,輸出我們我們要處理賬號系統C4Component的Mermaid指令碼,用markdown輸出
ChatGPT輸出程式碼渲染後圖片為:
C4Dynamic 檢視
提供Mermaid官網的demo後,就可以提示:
請按照上面給的案例,輸出我們我們要處理賬號系統C4Component的Mermaid指令碼,用markdown輸出
ChatGPT輸出程式碼渲染後圖片為:
C4Deployment檢視
提供Mermaid官網的demo後,就可以提示:
請按照上面給的案例,輸出我們我們要處理賬號系統C4Deployment的Mermaid指令碼,用markdown輸出
ChatGPT輸出程式碼渲染後圖片為:
備註:在ChatGPT熟悉了2-3次過程後,只要輸入模版,其就會自動給出結果啦,連提示都可以省略了,重複工作完全自動化啦。
複雜狀態試圖
在今天的實驗中,最後嘗試做了一個負責的系統狀態轉化圖,具體如下:
提示:在賬號系統中的EmailVerification,PhoneVerification,ThirdPartyBinding的狀態發生變化時,Account中對應資訊變化的 Mermaid 指令碼
ChatGPT:
以下是在賬號系統中的EmailVerification,PhoneVerification,ThirdPartyBinding的狀態發生變化時,Account中對應資訊變化的Mermaid指令碼:
給出的程式碼如下:
stateDiagram-v2
state "Account" as account {
state "EmailVerified" as emailVerified
state "PhoneVerified" as phoneVerified
state "ThirdPartyBound" as thirdPartyBound
[*] --> emailVerified : initialize
[*] --> phoneVerified : initialize
[*] --> thirdPartyBound : initialize
emailVerified --> phoneVerified : Email verified
emailVerified --> thirdPartyBound : Third-party bound
phoneVerified --> thirdPartyBound : Third-party bound
emailVerified --> emailVerified : Re-verify email
phoneVerified --> phoneVerified : Re-verify phone
thirdPartyBound --> thirdPartyBound : Unbind third-party
emailVerified --> * : Email unverified
phoneVerified --> * : Phone unverified
thirdPartyBound --> * : No third-party
}
這個指令碼包含了四個節點,分別表示賬戶,電子郵件驗證,電話驗證和第三方繫結。每個節點有對應的狀態,包括已驗證,無效,已繫結和未繫結。節點之間的關係用箭頭表示,例如賬戶有電子郵件驗證,電話驗證和第三方繫結。在狀態發生變化時,節點的顏色也會相應地改變。
程式碼渲染圖片:
繼續嘗試,輸出以上變化的序列圖,提示:
ChatGPT:
以下是在賬號系統中的EmailVerification,PhoneVerification,ThirdPartyBinding的狀態發生變化時,Account中對應資訊變化的序列圖的Mermaid指令碼:
sequenceDiagram
participant Account
participant EmailVerification
participant PhoneVerification
participant ThirdPartyBinding
Account ->> EmailVerification: VerifyEmail(email, code)
activate EmailVerification
EmailVerification -->> Account: EmailVerified(email)
deactivate EmailVerification
Account ->> PhoneVerification: VerifyPhone(phone, code)
activate PhoneVerification
PhoneVerification -->> Account: PhoneVerified(phone)
deactivate PhoneVerification
Account ->> ThirdPartyBinding: BindThirdParty(thirdPartyAccount)
activate ThirdPartyBinding
ThirdPartyBinding -->> Account: ThirdPartyBound(thirdPartyAccount)
deactivate ThirdPartyBinding
Account ->> ThirdPartyBinding: UnbindThirdParty(thirdPartyAccount)
activate ThirdPartyBinding
ThirdPartyBinding -->> Account: ThirdPartyUnbound(thirdPartyAccount)
deactivate ThirdPartyBinding
上面的序列圖描述了Account物件和三個相關物件(EmailVerification,PhoneVerification和ThirdPartyBinding)之間的互動,以處理EmailVerification,PhoneVerification和ThirdPartyBinding狀態變化的情況。
在這個序列圖中,Account物件向EmailVerification,PhoneVerification和ThirdPartyBinding傳送請求,以更新與它們關聯的資訊。每個參與者在收到請求後執行其操作,並透過訊息傳遞結果將結果返回給Account物件,以通知其資訊已被更新。
渲染後的圖片為:
寫在最後
今天的實驗,就這麼多啦,希望對你有啟發哦。
在日常的系統設計中,創造系統圖表是一件不太容易,也非常繁瑣的事情,而ChatGPT則可以很好的幫我們處理這些問題,讓我們可以節省不少的時間和精力哦。
在實驗的過程中,也可以發現ChatGPT存在這個各種可能性,只要我們能給出不錯的提示,提供有效的上下文,他就可以快速的學習,並將此結果有效的利用在接下來的任務之中。
ChatGPT還有很多未知的能力,值得每一個人去探索,保持好奇心吧。