{"id":11687,"date":"2026-05-21T15:55:49","date_gmt":"2026-05-21T07:55:49","guid":{"rendered":"https:\/\/blog.visual-paradigm.com\/vn\/mastering-uml-class-diagrams-a-practical-case-study-in-system-design-with-plantuml\/"},"modified":"2026-05-30T16:12:06","modified_gmt":"2026-05-30T08:12:06","slug":"mastering-uml-class-diagrams-a-practical-case-study-in-system-design-with-plantuml","status":"publish","type":"post","link":"https:\/\/blog.visual-paradigm.com\/vn\/mastering-uml-class-diagrams-a-practical-case-study-in-system-design-with-plantuml\/","title":{"rendered":"Th\u00e0nh th\u1ea1o c\u00e1c s\u01a1 \u0111\u1ed3 l\u1edbp UML: M\u1ed9t nghi\u00ean c\u1ee9u th\u1ef1c t\u1ebf v\u1ec1 thi\u1ebft k\u1ebf h\u1ec7 th\u1ed1ng v\u1edbi PlantUML"},"content":{"rendered":"<h2 data-nodeid=\"111\"><strong data-nodeid=\"293\">Gi\u1edbi thi\u1ec7u<\/strong><\/h2>\n<p data-nodeid=\"112\">Trong b\u1ed1i c\u1ea3nh ph\u00e1t tri\u1ec3n ph\u1ea7n m\u1ec1m ph\u1ee9c t\u1ea1p ng\u00e0y nay, giao ti\u1ebfp r\u00f5 r\u00e0ng v\u00e0 m\u00f4 h\u00ecnh h\u00f3a h\u1ec7 th\u1ed1ng ch\u00ednh x\u00e1c l\u00e0 y\u1ebfu t\u1ed1 then ch\u1ed1t cho th\u00e0nh c\u00f4ng d\u1ef1 \u00e1n. Trong s\u1ed1 nh\u1eefng c\u00f4ng c\u1ee5 m\u1ea1nh m\u1ebd nh\u1ea5t trong b\u1ed9 c\u00f4ng c\u1ee5 c\u1ee7a m\u1ed9t ki\u1ebfn tr\u00fac s\u01b0 ph\u1ea7n m\u1ec1m l\u00e0\u00a0<strong data-nodeid=\"303\">S\u01a1 \u0111\u1ed3 l\u1edbp UML<\/strong>\u2014m\u1ed9t ng\u00f4n ng\u1eef tr\u1ef1c quan gi\u00fap n\u1ed1i li\u1ec1n kho\u1ea3ng c\u00e1ch gi\u1eefa c\u00e1c y\u00eau c\u1ea7u tr\u1eebu t\u01b0\u1ee3ng v\u00e0 tri\u1ec3n khai c\u1ee5 th\u1ec3.<\/p>\n<p data-nodeid=\"113\">Nghi\u00ean c\u1ee9u th\u1ef1c t\u1ebf n\u00e0y kh\u00e1m ph\u00e1 c\u00e1ch c\u00e1c s\u01a1 \u0111\u1ed3 l\u1edbp \u0111\u00f3ng vai tr\u00f2 n\u1ec1n t\u1ea3ng cho thi\u1ebft k\u1ebf h\u01b0\u1edbng \u0111\u1ed1i t\u01b0\u1ee3ng, gi\u00fap c\u00e1c \u0111\u1ed9i ng\u0169 m\u00f4 h\u00ecnh h\u00f3a c\u1ea5u tr\u00fac t\u0129nh c\u1ee7a h\u1ec7 th\u1ed1ng, x\u00e1c \u0111\u1ecbnh c\u00e1c m\u1ed1i quan h\u1ec7 gi\u1eefa c\u00e1c th\u1ef1c th\u1ec3 v\u00e0 thi\u1ebft l\u1eadp c\u00e1c h\u1ee3p \u0111\u1ed3ng r\u00f5 r\u00e0ng cho qu\u00e1 tr\u00ecnh ph\u00e1t tri\u1ec3n. Th\u00f4ng qua m\u1ed9t v\u00ed d\u1ee5 th\u1ef1c t\u1ebf v\u1ec1 h\u1ec7 th\u1ed1ng qu\u1ea3n l\u00fd \u0111\u01a1n h\u00e0ng th\u01b0\u01a1ng m\u1ea1i \u0111i\u1ec7n t\u1eed, ch\u00fang ta s\u1ebd minh h\u1ecda c\u00e1ch tinh ch\u1ec9nh d\u1ea7n c\u00e1c s\u01a1 \u0111\u1ed3 l\u1edbp theo ba g\u00f3c nh\u00ecn ph\u00e1t tri\u1ec3n\u2014kh\u00e1i ni\u1ec7m, c\u1ee5 th\u1ec3 h\u00f3a v\u00e0 tri\u1ec3n khai\u2014\u0111\u1ed3ng th\u1eddi t\u1eadn d\u1ee5ng\u00a0<strong data-nodeid=\"311\">PlantUML<\/strong>\u00a0\u0111\u1ec3 t\u1ea1o t\u00e0i li\u1ec7u c\u00f3 th\u1ec3 th\u1ef1c thi, \u0111\u01b0\u1ee3c ki\u1ec3m so\u00e1t phi\u00ean b\u1ea3n.<\/p>\n<p data-nodeid=\"114\">D\u00f9 b\u1ea1n l\u00e0 m\u1ed9t nh\u00e0 ph\u00e2n t\u00edch kinh doanh m\u00f4 h\u00ecnh h\u00f3a c\u00e1c kh\u00e1i ni\u1ec7m l\u0129nh v\u1ef1c, m\u1ed9t nh\u00e0 ph\u00e1t tri\u1ec3n thi\u1ebft k\u1ebf API, hay m\u1ed9t tr\u01b0\u1edfng nh\u00f3m \u0111\u1ea3m b\u1ea3o t\u00ednh nh\u1ea5t qu\u00e1n ki\u1ebfn tr\u00fac, h\u01b0\u1edbng d\u1eabn n\u00e0y cung c\u1ea5p nh\u1eefng hi\u1ec3u bi\u1ebft thi\u1ebft th\u1ef1c \u0111\u1ec3 t\u1ea1o ra c\u00e1c s\u01a1 \u0111\u1ed3 l\u1edbp th\u00fac \u0111\u1ea9y s\u1ef1 r\u00f5 r\u00e0ng, gi\u1ea3m thi\u1ec3u s\u1ef1 m\u01a1 h\u1ed3 v\u00e0 \u0111\u1ea9y nhanh ti\u1ebfn \u0111\u1ed9 giao h\u00e0ng.<\/p>\n<hr data-nodeid=\"115\"\/>\n<h2 data-nodeid=\"116\"><strong data-nodeid=\"318\">Hi\u1ec3u r\u00f5 s\u01a1 \u0111\u1ed3 l\u1edbp: T\u1ed5ng quan l\u1ea1i c\u00e1c kh\u00e1i ni\u1ec7m c\u1ed1t l\u00f5i<\/strong><\/h2>\n<p data-nodeid=\"117\"><em data-nodeid=\"322\">(T\u00f3m l\u01b0\u1ee3c t\u1eeb ki\u1ebfn th\u1ee9c n\u1ec1n t\u1ea3ng)<\/em><\/p>\n<p data-nodeid=\"118\">M\u1ed9t\u00a0<strong data-nodeid=\"328\">S\u01a1 \u0111\u1ed3 l\u1edbp<\/strong>\u00a0trong UML l\u00e0 m\u1ed9t s\u01a1 \u0111\u1ed3 c\u1ea5u tr\u00fac t\u0129nh, gi\u00fap tr\u1ef1c quan h\u00f3a:<\/p>\n<ul data-nodeid=\"119\">\n<li data-nodeid=\"120\">\n<p data-nodeid=\"121\"><strong data-nodeid=\"333\">L\u1edbp<\/strong>: B\u1ea3n v\u1ebd ph\u00e1c h\u1ecda \u0111\u1ecbnh ngh\u0129a c\u00e1c \u0111\u1ed1i t\u01b0\u1ee3ng v\u1edbi thu\u1ed9c t\u00ednh (tr\u1ea1ng th\u00e1i) v\u00e0 thao t\u00e1c (h\u00e0nh vi)<\/p>\n<\/li>\n<li data-nodeid=\"122\">\n<p data-nodeid=\"123\"><strong data-nodeid=\"338\">M\u1ed1i quan h\u1ec7<\/strong>: K\u1ebf th\u1eeba, li\u00ean k\u1ebft, t\u00edch h\u1ee3p, k\u1ebft h\u1ee3p v\u00e0 ph\u1ee5 thu\u1ed9c<\/p>\n<\/li>\n<li data-nodeid=\"124\">\n<p data-nodeid=\"125\"><strong data-nodeid=\"357\">R\u00e0ng bu\u1ed9c<\/strong>: Quy\u1ec1n truy c\u1eadp (<code data-backticks=\"1\" data-nodeid=\"343\">+<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"345\">-<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"347\">#<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"349\">~<\/code>), b\u1ed9i s\u1ed1 (<code data-backticks=\"1\" data-nodeid=\"351\">1<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"353\">0..*<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"355\">1..5<\/code>), v\u00e0 kh\u1ea3 n\u0103ng \u0111i l\u1ea1i<\/p>\n<\/li>\n<\/ul>\n<h3 data-nodeid=\"126\"><strong data-nodeid=\"361\">C\u00e1c y\u1ebfu t\u1ed1 k\u00fd hi\u1ec7u ch\u00ednh<\/p>\n<p><\/strong><\/h3>\n<p id=\"UHnOxfB\"><img alt=\"\" class=\"alignnone size-full wp-image-24654\" decoding=\"async\" height=\"184\" loading=\"lazy\" sizes=\"auto, (max-width: 424px) 100vw, 424px\" src=\"https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/05\/img_6a0eb9275d5e8.png\" srcset=\"https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/05\/img_6a0eb9275d5e8.png 424w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/05\/img_6a0eb9275d5e8-300x130.png 300w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/05\/img_6a0eb9275d5e8-150x65.png 150w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/05\/img_6a0eb9275d5e8-400x174.png 400w\" width=\"424\"\/><\/p>\n<div class=\"vpascode-viewer-container vpascode-fancy-active\">\n<div class=\"vpascode-header\">\n<span class=\"vpascode-lang-label\">PlantUML<\/span><br \/>\n<a class=\"vpascode-fancy-btn\" href=\"https:\/\/www.vpascode.com#plantuml:HOwn2W8n44JxGFvXonFr1r9TONELWlx0cWqIsCjYiZaGyT_TO64ppBoPOkQcMBMlx5raR0tEbLA5jtS0Hnb-eG1NhRay_ko4cW8C7MmVaMDdIpTHv6bdbVGx_qeaMZIjKpO9SAb2FUe1dleAa8lQU9DCtdsycrCXk_85\" rel=\"noopener noreferrer\" target=\"_blank\"><br \/>\n<svg fill=\"none\" height=\"14\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2.5\" style=\"margin-right: 8px;\" viewbox=\"0 0 24 24\" width=\"14\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"><\/path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"><\/path><\/svg><br \/>\n<span>Ch\u1ec9nh s\u1eeda PlantUML trong VPasCode<\/span><br \/>\n<\/a>\n<\/div>\n<div class=\"vpascode-code-wrapper\">\n            <div class=\"vpascode-viewer-container vpascode-fancy-active\">\r\n                                <div class=\"vpascode-header\">\r\n                    <span class=\"vpascode-lang-label\">PlantUML<\/span>\r\n                    <a href=\"https:\/\/www.vpascode.com#plantuml:HOwn2W8n44JxGFvXonFr1r9TONELWlx0cWqIsCjYiZaGyT_TO64ppBoPOkQcMBMlx5raR0tEbLA5jtS0Hnb-eG1NhRay_ko4cW8C7MmVaMDdIpTHv6bdbVGx_qeaMZIjKpO9SAb2FUe1dleAa8lQU9DCtdsycrCXk_85\" \r\n                       target=\"_blank\" \r\n                       rel=\"noopener noreferrer\" \r\n                       class=\"vpascode-fancy-btn\">\r\n                        <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" style=\"margin-right: 8px;\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"><\/path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"><\/path><\/svg>\r\n                        <span>Edit PlantUML in VPasCode<\/span>\r\n                    <\/a>\r\n                <\/div>\r\n                                <div class=\"vpascode-code-wrapper\">\r\n                    <pre class=\"lang-plantuml\" data-nodeid=\"127\"><code class=\"language-plantuml\" data-language=\"plantuml\" class=\"language-plantuml\">@startuml\r\nclass Order {\r\n  -orderId: String\r\n  -orderDate: Date\r\n  +calculateTotal(): Double\r\n  +addItem(item: Product, qty: int): void\r\n}\r\n@enduml\r\n<\/code><\/pre>                <\/div>\r\n                <div class=\"vpascode-actions\">\r\n                    <a href=\"https:\/\/www.vpascode.com#plantuml:HOwn2W8n44JxGFvXonFr1r9TONELWlx0cWqIsCjYiZaGyT_TO64ppBoPOkQcMBMlx5raR0tEbLA5jtS0Hnb-eG1NhRay_ko4cW8C7MmVaMDdIpTHv6bdbVGx_qeaMZIjKpO9SAb2FUe1dleAa8lQU9DCtdsycrCXk_85\" \r\n                       target=\"_blank\" \r\n                       rel=\"noopener noreferrer\" \r\n                       class=\"vpascode-fancy-btn\">\r\n                        <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" style=\"margin-right: 6px;\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"><\/path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"><\/path><\/svg>\r\n                        <span>Edit PlantUML in VPasCode<\/span>\r\n                    <\/a>\r\n                <\/div>\r\n            <\/div>\r\n            \n<\/p><\/div>\n<div class=\"vpascode-actions\">\n<a class=\"vpascode-fancy-btn\" href=\"https:\/\/www.vpascode.com#plantuml:HOwn2W8n44JxGFvXonFr1r9TONELWlx0cWqIsCjYiZaGyT_TO64ppBoPOkQcMBMlx5raR0tEbLA5jtS0Hnb-eG1NhRay_ko4cW8C7MmVaMDdIpTHv6bdbVGx_qeaMZIjKpO9SAb2FUe1dleAa8lQU9DCtdsycrCXk_85\" rel=\"noopener noreferrer\" target=\"_blank\"><br \/>\n<svg fill=\"none\" height=\"14\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2.5\" style=\"margin-right: 6px;\" viewbox=\"0 0 24 24\" width=\"14\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"><\/path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"><\/path><\/svg><br \/>\n<span>Ch\u1ec9nh s\u1eeda PlantUML trong VPasCode<\/span><br \/>\n<\/a>\n<\/div>\n<\/div>\n<h3 data-nodeid=\"128\"><strong data-nodeid=\"365\">Tham kh\u1ea3o nhanh c\u00e1c lo\u1ea1i m\u1ed1i quan h\u1ec7<\/strong><\/h3>\n<table data-nodeid=\"130\">\n<thead data-nodeid=\"131\">\n<tr data-nodeid=\"132\">\n<th data-nodeid=\"134\">Lo\u1ea1i<\/th>\n<th data-nodeid=\"135\">K\u00fd hi\u1ec7u<\/th>\n<th data-nodeid=\"136\">\u00dd ngh\u0129a<\/th>\n<th data-nodeid=\"137\">V\u00ed d\u1ee5<\/th>\n<\/tr>\n<\/thead>\n<tbody data-nodeid=\"142\">\n<tr data-nodeid=\"143\">\n<td data-nodeid=\"144\"><strong data-nodeid=\"373\">K\u1ebf th\u1eeba<\/strong><\/td>\n<td data-nodeid=\"145\">`\u2013<\/td>\n<td data-nodeid=\"146\">&gt;`<\/td>\n<td data-nodeid=\"147\">\u201cl\u00e0-m\u1ed9t\u201d<\/td>\n<\/tr>\n<tr data-nodeid=\"150\">\n<td data-nodeid=\"151\"><strong data-nodeid=\"384\">Li\u00ean k\u1ebft<\/strong><\/td>\n<td data-nodeid=\"152\"><code data-backticks=\"1\" data-nodeid=\"385\">--<\/code><\/td>\n<td data-nodeid=\"153\">Li\u00ean k\u1ebft c\u1ea5u tr\u00fac<\/td>\n<td data-nodeid=\"154\"><code data-backticks=\"1\" data-nodeid=\"387\">Order -- Customer<\/code><\/td>\n<\/tr>\n<tr data-nodeid=\"155\">\n<td data-nodeid=\"156\"><strong data-nodeid=\"391\">T\u1ed5ng h\u1ee3p<\/strong><\/td>\n<td data-nodeid=\"157\"><code data-backticks=\"1\" data-nodeid=\"392\">o--<\/code><\/td>\n<td data-nodeid=\"158\">\u201cc\u00f3-m\u1ed9t\u201d (y\u1ebfu)<\/td>\n<td data-nodeid=\"159\"><code data-backticks=\"1\" data-nodeid=\"397\">Warehouse o-- Product<\/code><\/td>\n<\/tr>\n<tr data-nodeid=\"160\">\n<td data-nodeid=\"161\"><strong data-nodeid=\"401\">Th\u00e0nh ph\u1ea7n<\/strong><\/td>\n<td data-nodeid=\"162\"><code data-backticks=\"1\" data-nodeid=\"402\">*--<\/code><\/td>\n<td data-nodeid=\"163\">\u201cs\u1edf h\u1eefu-m\u1ed9t\u201d (m\u1ea1nh)<\/td>\n<td data-nodeid=\"164\"><code data-backticks=\"1\" data-nodeid=\"407\">Order *-- OrderItem<\/code><\/td>\n<\/tr>\n<tr data-nodeid=\"165\">\n<td data-nodeid=\"166\"><strong data-nodeid=\"411\">Ph\u1ee5 thu\u1ed9c<\/strong><\/td>\n<td data-nodeid=\"167\"><code data-backticks=\"1\" data-nodeid=\"412\">..&gt;<\/code><\/td>\n<td data-nodeid=\"168\">\u201cs\u1eed d\u1ee5ng\u201d (t\u1ea1m th\u1eddi)<\/td>\n<td data-nodeid=\"169\"><code data-backticks=\"1\" data-nodeid=\"417\">PaymentService ..&gt; Logger<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<hr data-nodeid=\"170\"\/>\n<h2 data-nodeid=\"171\"><strong data-nodeid=\"421\">Nghi\u00ean c\u1ee9u tr\u01b0\u1eddng h\u1ee3p: H\u1ec7 th\u1ed1ng qu\u1ea3n l\u00fd \u0111\u01a1n h\u00e0ng th\u01b0\u01a1ng m\u1ea1i \u0111i\u1ec7n t\u1eed<\/strong><\/h2>\n<h3 data-nodeid=\"172\"><strong data-nodeid=\"425\">Y\u00eau c\u1ea7u kinh doanh<\/strong><\/h3>\n<p data-nodeid=\"173\">M\u1ed9t nh\u00e0 b\u00e1n l\u1ebb tr\u1ef1c tuy\u1ebfn c\u1ea7n m\u1ed9t h\u1ec7 th\u1ed1ng \u0111\u1ec3:<\/p>\n<ol data-nodeid=\"174\">\n<li data-nodeid=\"175\">\n<p data-nodeid=\"176\">Qu\u1ea3n l\u00fd kh\u00e1ch h\u00e0ng, s\u1ea3n ph\u1ea9m v\u00e0 \u0111\u01a1n h\u00e0ng<\/p>\n<\/li>\n<li data-nodeid=\"177\">\n<p data-nodeid=\"178\">H\u1ed7 tr\u1ee3 c\u00e1c m\u1ee5c \u0111\u01a1n h\u00e0ng v\u1edbi s\u1ed1 l\u01b0\u1ee3ng v\u00e0 gi\u00e1 c\u1ea3<\/p>\n<\/li>\n<li data-nodeid=\"179\">\n<p data-nodeid=\"180\">X\u1eed l\u00fd nhi\u1ec1u ph\u01b0\u01a1ng th\u1ee9c thanh to\u00e1n<\/p>\n<\/li>\n<li data-nodeid=\"181\">\n<p data-nodeid=\"182\">Theo d\u00f5i tr\u1ea1ng th\u00e1i \u0111\u01a1n h\u00e0ng qua su\u1ed1t v\u00f2ng \u0111\u1eddi<\/p>\n<\/li>\n<li data-nodeid=\"183\">\n<p data-nodeid=\"184\">Cho ph\u00e9p s\u1ea3n ph\u1ea9m thu\u1ed9c v\u1ec1 c\u00e1c danh m\u1ee5c<\/p>\n<\/li>\n<li data-nodeid=\"185\">\n<p data-nodeid=\"186\">H\u1ed7 tr\u1ee3 thanh to\u00e1n kh\u00e1ch truy c\u1eadp (li\u00ean k\u1ebft kh\u00e1ch h\u00e0ng t\u00f9y ch\u1ecdn)<\/p>\n<\/li>\n<\/ol>\n<h3 data-nodeid=\"187\"><strong data-nodeid=\"436\">Giai \u0111o\u1ea1n 1: M\u00f4 h\u00ecnh kh\u00e1i ni\u1ec7m (g\u00f3c nh\u00ecn mi\u1ec1n)<\/strong><\/h3>\n<p data-nodeid=\"188\"><em data-nodeid=\"440\">\u0110\u1ed9c l\u1eadp ng\u00f4n ng\u1eef, t\u1eadp trung v\u00e0o c\u00e1c kh\u00e1i ni\u1ec7m th\u1ef1c t\u1ebf<\/em><\/p>\n<\/p>\n<p id=\"AjOBHwj\"><img alt=\"\" class=\"alignnone size-full wp-image-24655\" decoding=\"async\" height=\"688\" loading=\"lazy\" sizes=\"auto, (max-width: 865px) 100vw, 865px\" src=\"https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/05\/img_6a0eb958147eb.png\" srcset=\"https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/05\/img_6a0eb958147eb.png 865w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/05\/img_6a0eb958147eb-300x239.png 300w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/05\/img_6a0eb958147eb-768x611.png 768w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/05\/img_6a0eb958147eb-150x119.png 150w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/05\/img_6a0eb958147eb-400x318.png 400w\" width=\"865\"\/><\/p>\n<div class=\"vpascode-viewer-container vpascode-fancy-active\">\n<div class=\"vpascode-header\">\n<span class=\"vpascode-lang-label\">PlantUML<\/span><br \/>\n<a class=\"vpascode-fancy-btn\" href=\"https:\/\/www.vpascode.com#plantuml:VLDDJyCm3BrNwd-mUa526cBN7X3Jne730F4FtCHiaV95uXmcn7_7QJj61U9KEtb-VdvExpDZuk9isx1XIx0DNb7aWXRsGPFjuM6r3SvHKWIxuD3ujcaRPJ5ds9RCGQxWesq0F3ggNnAGhK4-cXYDFsoqJfHpstnUIbzIq4Nnib9JLib4Di7NTC1CByaeMbHkaUaGqkcVqX_evwJF-a8DdueRA7sdEo4RfJ9ooJNYm6WtBXJFluaUcTn4zbxGYsEd6XTlUDOfJ6KOAPRJuicHdwUDKx8dFWOzjapeCwgg_N4ymBczN1b7eit5cUuANibYHLPpHV3t2hfr1wiLTBStDzVTF7OFqQAY37TjCvrKr7M5hI-mSQWULF0isnt1v-tyGJgZCKR2bC7u1Nu2ZWswowPw6CW6VyZYxbBBHShPeXuoiRn43SEfOjl61oP8vd1a26-JY6hDnizJ9eholAGs0uAQ_RWQbnbBKaTvHIAJApbw_TFjjY4vgForpxqayYTy0G00\" rel=\"noopener noreferrer\" target=\"_blank\"><br \/>\n<svg fill=\"none\" height=\"14\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2.5\" style=\"margin-right: 8px;\" viewbox=\"0 0 24 24\" width=\"14\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"><\/path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"><\/path><\/svg><br \/>\n<span>Ch\u1ec9nh s\u1eeda PlantUML trong VPasCode<\/span><br \/>\n<\/a>\n<\/div>\n<div class=\"vpascode-code-wrapper\">\n            <div class=\"vpascode-viewer-container vpascode-fancy-active\">\r\n                                <div class=\"vpascode-header\">\r\n                    <span class=\"vpascode-lang-label\">PlantUML<\/span>\r\n                    <a href=\"https:\/\/www.vpascode.com#plantuml:TLEzQXj14EuFxXs6Qm86cxXL4LmOP7040Ui5DYlbTebkBvRsZ4D8aSg4DBuYXOiG2ME2GW8k0e5RNEsXzvWtySoUXEuSfThT-Vc-cMzsZcPMJ6sHJUB8QZiPmy3_0UL_6GLlbLzeC1hTLTQ30PsV35YrkbyjJ0ePLkIjItQJ6TtlE8eZEH6p6PnIfbGdWi8-n160zJyDd-DCw0bVwXBT5m5IeViCgHOvKSvD6aSVjo1dMDsQLmghPTP5oQX2Iqw-fzel-kXAsKaz5aODqDt9_oMsOkjhQkU4sPlW6Q5jRMmngP-_hw-n-ci3sfGwD-cGrGblT5_f6UJf88SATi6_NDsZkst0wvByVUeYGB4AQWVKK557mzmlJ8FoRZs58Gcub5il-_IeJu8Uay1IRHWta4o1xfkcY0t1Cwwpr71U20Fal8gZrlYImmJszo5vVd2mbxIrwl4CIH5u4KSjCyVlSS9XI7WgGI-CV2augptVBis_MPS5LdSMrFgpJNEoFeLeSWDtqle1FMgvG7SZuO8qs57kjjgMojnUc9AaTBA23URNwBvhneWZazinJ7MgBEHleFjZYFd6jjLYhMXRHatzKkNW7veb8EYi49ll3t3Xvyr2ZC80GQBx8S8gqcCTDJOZO7ekuuWUjBsF\" \r\n                       target=\"_blank\" \r\n                       rel=\"noopener noreferrer\" \r\n                       class=\"vpascode-fancy-btn\">\r\n                        <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" style=\"margin-right: 8px;\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"><\/path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"><\/path><\/svg>\r\n                        <span>Edit PlantUML in VPasCode<\/span>\r\n                    <\/a>\r\n                <\/div>\r\n                                <div class=\"vpascode-code-wrapper\">\r\n                    <pre class=\"lang-plantuml\" data-nodeid=\"189\"><code class=\"language-plantuml\" data-language=\"plantuml\" class=\"language-plantuml\">@startuml\r\ntitle M\u00f4 h\u00ecnh kh\u00e1i ni\u1ec7m: Mi\u1ec1n th\u01b0\u01a1ng m\u1ea1i \u0111i\u1ec7n t\u1eed\r\n\r\nclass Kh\u00e1chHang {\r\n  t\u00ean\r\n  email\r\n  \u0111\u1ecba ch\u1ec9 giao h\u00e0ng\r\n}\r\n\r\nclass S\u1ea3nPh\u1ea9m {\r\n  t\u00ean\r\n  m\u00f4 t\u1ea3\r\n  gi\u00e1G\u1ed1c\r\n}\r\n\r\nclass DanhM\u1ee5c {\r\n  t\u00ean\r\n  m\u00f4 t\u1ea3\r\n}\r\n\r\nclass \u0110\u01a1nH\u00e0ng {\r\n  s\u1ed1\u0110\u01a1nH\u00e0ng\r\n  ng\u00e0y\u0110\u1eb7t\r\n  tr\u1ea1ngTh\u00e1i\r\n  t\u1ed5ngTi\u1ec1n\r\n}\r\n\r\nclass M\u1ee5c\u0110\u01a1nH\u00e0ng {\r\n  s\u1ed1L\u01b0\u1ee3ng\r\n  \u0111\u01a1nGi\u00e1\r\n  th\u00e0nhTi\u1ec1n\r\n}\r\n\r\nclass ThanhTo\u00e1n {\r\n  ph\u01b0\u01a1ngTh\u1ee9cThanhTo\u00e1n\r\n  idGiaoD\u1ecbch\r\n  s\u1ed1Ti\u1ec1n\r\n  th\u1eddiGian\r\n}\r\n\r\n' M\u1ed1i quan h\u1ec7\r\nKh\u00e1chHang \"1\" -- \"0..*\" \u0110\u01a1nH\u00e0ng : \u0111\u1eb7t &gt;\r\n\u0110\u01a1nH\u00e0ng \"1\" *-- \"1..*\" M\u1ee5c\u0110\u01a1nH\u00e0ng : ch\u1ee9a &gt;\r\nS\u1ea3nPh\u1ea9m \"1\" -- \"0..*\" M\u1ee5c\u0110\u01a1nH\u00e0ng : xu\u1ea5t hi\u1ec7n trong &gt;\r\nS\u1ea3nPh\u1ea9m \"0..*\" -- \"1\" DanhM\u1ee5c : thu\u1ed9c v\u1ec1 &gt;\r\n\u0110\u01a1nH\u00e0ng \"1\" -- \"1..*\" ThanhTo\u00e1n : \u0111\u01b0\u1ee3c thanh to\u00e1n b\u1edfi &gt;\r\n\r\nnote right of \u0110\u01a1nH\u00e0ng\r\n  M\u1ed9t \u0110\u01a1nH\u00e0ng \u0111\u1ea1i di\u1ec7n cho \u00fd \u0111\u1ecbnh mua h\u00e0ng\r\n  v\u00e0 giao d\u1ecbch c\u1ee7a kh\u00e1ch h\u00e0ng\r\nend note\r\n\r\n@enduml\r\n<\/code><\/pre>                <\/div>\r\n                <div class=\"vpascode-actions\">\r\n                    <a href=\"https:\/\/www.vpascode.com#plantuml:TLEzQXj14EuFxXs6Qm86cxXL4LmOP7040Ui5DYlbTebkBvRsZ4D8aSg4DBuYXOiG2ME2GW8k0e5RNEsXzvWtySoUXEuSfThT-Vc-cMzsZcPMJ6sHJUB8QZiPmy3_0UL_6GLlbLzeC1hTLTQ30PsV35YrkbyjJ0ePLkIjItQJ6TtlE8eZEH6p6PnIfbGdWi8-n160zJyDd-DCw0bVwXBT5m5IeViCgHOvKSvD6aSVjo1dMDsQLmghPTP5oQX2Iqw-fzel-kXAsKaz5aODqDt9_oMsOkjhQkU4sPlW6Q5jRMmngP-_hw-n-ci3sfGwD-cGrGblT5_f6UJf88SATi6_NDsZkst0wvByVUeYGB4AQWVKK557mzmlJ8FoRZs58Gcub5il-_IeJu8Uay1IRHWta4o1xfkcY0t1Cwwpr71U20Fal8gZrlYImmJszo5vVd2mbxIrwl4CIH5u4KSjCyVlSS9XI7WgGI-CV2augptVBis_MPS5LdSMrFgpJNEoFeLeSWDtqle1FMgvG7SZuO8qs57kjjgMojnUc9AaTBA23URNwBvhneWZazinJ7MgBEHleFjZYFd6jjLYhMXRHatzKkNW7veb8EYi49ll3t3Xvyr2ZC80GQBx8S8gqcCTDJOZO7ekuuWUjBsF\" \r\n                       target=\"_blank\" \r\n                       rel=\"noopener noreferrer\" \r\n                       class=\"vpascode-fancy-btn\">\r\n                        <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" style=\"margin-right: 6px;\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"><\/path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"><\/path><\/svg>\r\n                        <span>Edit PlantUML in VPasCode<\/span>\r\n                    <\/a>\r\n                <\/div>\r\n            <\/div>\r\n            \n<\/p><\/div>\n<div class=\"vpascode-actions\">\n<a class=\"vpascode-fancy-btn\" href=\"https:\/\/www.vpascode.com#plantuml:VLDDJyCm3BrNwd-mUa526cBN7X3Jne730F4FtCHiaV95uXmcn7_7QJj61U9KEtb-VdvExpDZuk9isx1XIx0DNb7aWXRsGPFjuM6r3SvHKWIxuD3ujcaRPJ5ds9RCGQxWesq0F3ggNnAGhK4-cXYDFsoqJfHpstnUIbzIq4Nnib9JLib4Di7NTC1CByaeMbHkaUaGqkcVqX_evwJF-a8DdueRA7sdEo4RfJ9ooJNYm6WtBXJFluaUcTn4zbxGYsEd6XTlUDOfJ6KOAPRJuicHdwUDKx8dFWOzjapeCwgg_N4ymBczN1b7eit5cUuANibYHLPpHV3t2hfr1wiLTBStDzVTF7OFqQAY37TjCvrKr7M5hI-mSQWULF0isnt1v-tyGJgZCKR2bC7u1Nu2ZWswowPw6CW6VyZYxbBBHShPeXuoiRn43SEfOjl61oP8vd1a26-JY6hDnizJ9eholAGs0uAQ_RWQbnbBKaTvHIAJApbw_TFjjY4vgForpxqayYTy0G00\" rel=\"noopener noreferrer\" target=\"_blank\"><br \/>\n<svg fill=\"none\" height=\"14\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2.5\" style=\"margin-right: 6px;\" viewbox=\"0 0 24 24\" width=\"14\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"><\/path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"><\/path><\/svg><br \/>\n<span>Ch\u1ec9nh s\u1eeda PlantUML trong VPasCode<\/span><br \/>\n<\/a>\n<\/div>\n<\/div>\n<p data-nodeid=\"190\"><strong data-nodeid=\"444\">C\u00e1c quy\u1ebft \u0111\u1ecbnh thi\u1ebft k\u1ebf ch\u00ednh:<\/strong><\/p>\n<ul data-nodeid=\"191\">\n<li data-nodeid=\"192\">\n<p data-nodeid=\"193\">Th\u00e0nh ph\u1ea7n (<code data-backticks=\"1\" data-nodeid=\"446\">*--<\/code>) gi\u1eefa\u00a0<code data-backticks=\"1\" data-nodeid=\"448\">\u0110\u01a1nH\u00e0ng<\/code>\u00a0v\u00e0\u00a0<code data-backticks=\"1\" data-nodeid=\"450\">M\u1ee5c\u0110\u01a1nH\u00e0ng<\/code>: C\u00e1c m\u1ee5c kh\u00f4ng th\u1ec3 t\u1ed3n t\u1ea1i m\u00e0 kh\u00f4ng c\u00f3 \u0111\u01a1n h\u00e0ng<\/p>\n<\/li>\n<li data-nodeid=\"194\">\n<p data-nodeid=\"195\">M\u1ed1i quan h\u1ec7 gi\u1eefa\u00a0<code data-backticks=\"1\" data-nodeid=\"453\">S\u1ea3nPh\u1ea9m<\/code>\u00a0v\u00e0\u00a0<code data-backticks=\"1\" data-nodeid=\"455\">Danh m\u1ee5c<\/code>: S\u1ea3n ph\u1ea9m c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c ph\u00e2n lo\u1ea1i l\u1ea1i<\/p>\n<\/li>\n<li data-nodeid=\"196\">\n<p data-nodeid=\"197\">\u0110a d\u1ea1ng\u00a0<code data-backticks=\"1\" data-nodeid=\"458\">0..*<\/code>\u00a0cho Kh\u00e1ch h\u00e0ng-\u0110\u01a1n h\u00e0ng: H\u1ed7 tr\u1ee3 thanh to\u00e1n kh\u00e1ch truy c\u1eadp<\/p>\n<\/li>\n<\/ul>\n<hr data-nodeid=\"198\"\/>\n<h3 data-nodeid=\"199\"><strong data-nodeid=\"463\">Giai \u0111o\u1ea1n 2: M\u00f4 h\u00ecnh \u0110\u1eb7c t\u1ea3 (G\u00f3c nh\u00ecn Giao di\u1ec7n)<\/strong><\/h3>\n<p data-nodeid=\"200\"><em data-nodeid=\"467\">T\u1eadp trung v\u00e0o h\u1ee3p \u0111\u1ed3ng ph\u1ea7n m\u1ec1m, che gi\u1ea5u chi ti\u1ebft tri\u1ec3n khai<\/em><\/p>\n<\/p>\n<p id=\"fNvtqQK\"><img alt=\"\" class=\"alignnone size-full wp-image-24656\" decoding=\"async\" height=\"436\" loading=\"lazy\" sizes=\"auto, (max-width: 1632px) 100vw, 1632px\" src=\"https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/05\/img_6a0eb9a2b0b04.png\" srcset=\"https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/05\/img_6a0eb9a2b0b04.png 1632w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/05\/img_6a0eb9a2b0b04-300x80.png 300w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/05\/img_6a0eb9a2b0b04-1030x275.png 1030w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/05\/img_6a0eb9a2b0b04-768x205.png 768w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/05\/img_6a0eb9a2b0b04-1536x410.png 1536w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/05\/img_6a0eb9a2b0b04-150x40.png 150w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/05\/img_6a0eb9a2b0b04-400x107.png 400w\" width=\"1632\"\/><\/p>\n<p data-nodeid=\"200\"><em data-nodeid=\"467\">\u00a0<\/em><\/p>\n<div class=\"vpascode-viewer-container vpascode-fancy-active\">\n<div class=\"vpascode-header\">\n<span class=\"vpascode-lang-label\">PlantUML<\/span><br \/>\n<a class=\"vpascode-fancy-btn\" href=\"https:\/\/www.vpascode.com#plantuml:TLHBRkCm3DqRy1suQu89SW1Z47I0R0nCqIBf1LIPJeJAb4UY0XZ5t7resSuaZhipoSV7tvEV0olFiR5vneOjmh55RMgZ5Hj7yE8gj0KSqL-CHYY9qTTAOyYpF3EJ1UMhhz1FgAyy0_YXFIh655Zf6DWrwCjAkDWREct0C3QXWDycyC-4AiMnVt_ThGj8jdmdeXFomE8IwaennyMscWeUMN4CyuGDXEGVymQGi7muPr7HqBMoEjg9vzsniWjrNnnXbsT_PrjuKrs3n6_UoOQ2y-Ccsi4UeuzTjKDWZwoCbUv6eCorlXe73D5oelDOHwecDlQAWjBzjMuvLUCYyTYfq1nIqiGoRxoaYt0vtyrEU4Rz-UiYNQaFOmrtAncbYfflA_s9YaGwNG52EDkcno24s5zsuHgt2ZWaP19TZzuz4Cbdm1lKmbKkpbJZRDgg4Axo6CUPPGmZFYWpkRyLPufoBukh2iIneAl7HaQA_wAutsJotYrpK3KP4PJSv5vrJx375gb2qgP_ZVSlSBlTBHorW1Wmm6uH_Q3T0hIJZHcIn_1DqdM_1NZaw2dXyemSevoFPRFWwlk_Gp_K7cj3Gifdb28a4jOCjTHC5u96aJfXtyssHvTDQvELxXuatC55-GvMZT7UXO5t0uqZ9o8zRm1PRzTv9kk1lfM-fMSnv2_t3m00\" rel=\"noopener noreferrer\" target=\"_blank\"><br \/>\n<svg fill=\"none\" height=\"14\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2.5\" style=\"margin-right: 8px;\" viewbox=\"0 0 24 24\" width=\"14\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"><\/path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"><\/path><\/svg><br \/>\n<span>Ch\u1ec9nh s\u1eeda PlantUML trong VPasCode<\/span><br \/>\n<\/a>\n<\/div>\n<div class=\"vpascode-code-wrapper\">\n            <div class=\"vpascode-viewer-container vpascode-fancy-active\">\r\n                                <div class=\"vpascode-header\">\r\n                    <span class=\"vpascode-lang-label\">PlantUML<\/span>\r\n                    <a href=\"https:\/\/www.vpascode.com#plantuml:TLInYjj04Eq5-eVfOXFZ3n31NC0G33dEs2xIxgtshELMkxxTMO49AKAA56bof4gNuqYNL0a4pgJoaV_GdsIqaXrRLXgZcPrvysRcUSuSCei-Lt644fM0y-rFoBRVT0QF7yk7NnomVBXFu8La1b9PRjvh69UR3po3ejnyZQCuaXg5lM9SmEJ2fiBEXIqaMQ_Z2E0fjuAX20yzxXsQNDX9ci0ShTJB0KWKkKlWfNJuB4HDo35UN8pw2GIRlWFGKc2DOaBK7g8TvrVfhk0S6NhNJXY02_uchmuYb4jZb62wPiqKzsg7ip38L4VTSwF5EexUjAOmPUjSQ9nQmuLpnZQJMDLsythAQbK_Z0KogOXT4qXzzVV6J3YlCC1PSULrkaD3oxHZ7ANHXvWiDrvZmvHWPY5fXz8cFj45OHcxRgqm4_pwUK6isALK4jSzQYNr70yhtNYcIK7h10YmDKqh706AQhCTspXKm2n4ij06kKSdGFJfn45KnrOA8zEcDwwOStjvDEsqCkeMJvGPtFyLPtZ5IXPx5P2ZGrUdH1g8Vw8udcJm7WspLhMM92ZQoR7gdi0qexyXOERBpMSUHyT_mU5mrB7L15ov-Guf9UebZ3gJJZISm8egtKgWt_jLTzP-q0cWfRDHdOYtLMWSQOE2LeaqPJ1NnvUYQl3Lzex3uorT5heyTOdA-aG4Rpn1QL3Rt-JwSwVfF7tHos6LjR1qaTvfkCwO1BxzGNCWcymAJMVCGo-Nt1fN5nf0RhGX1MS3A8R5i1z7GgTGSQiudf51b_0l\" \r\n                       target=\"_blank\" \r\n                       rel=\"noopener noreferrer\" \r\n                       class=\"vpascode-fancy-btn\">\r\n                        <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" style=\"margin-right: 8px;\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"><\/path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"><\/path><\/svg>\r\n                        <span>Edit PlantUML in VPasCode<\/span>\r\n                    <\/a>\r\n                <\/div>\r\n                                <div class=\"vpascode-code-wrapper\">\r\n                    <pre class=\"lang-plantuml\" data-nodeid=\"201\"><code class=\"language-plantuml\" data-language=\"plantuml\" class=\"language-plantuml\">@startuml\r\ntitle M\u00f4 h\u00ecnh \u0110\u1eb7c t\u1ea3: Giao di\u1ec7n D\u1ecbch v\u1ee5\r\n\r\ninterface IOrderService {\r\n  +createOrder(customerId: String, items: List&lt;OrderItemDTO&gt;): OrderDTO\r\n  +getOrder(orderId: String): OrderDTO\r\n  +updateOrderStatus(orderId: String, status: OrderStatus): boolean\r\n  +calculateOrderTotal(orderId: String): Money\r\n}\r\n\r\ninterface IPaymentProcessor {\r\n  +processPayment(orderId: String, paymentDetails: PaymentDTO): PaymentResult\r\n  +refundPayment(transactionId: String, amount: Money): RefundResult\r\n}\r\n\r\ninterface IInventoryService {\r\n  +checkAvailability(productId: String, quantity: int): boolean\r\n  +reserveItems(orderId: String, items: List&lt;ReservationItem&gt;): boolean\r\n  +releaseReservation(orderId: String): void\r\n}\r\n\r\nclass OrderDTO {\r\n  +orderId: String\r\n  +customerId: String\r\n  +items: List&lt;OrderItemDTO&gt;\r\n  +total: Money\r\n  +status: OrderStatus\r\n}\r\n\r\nclass OrderItemDTO {\r\n  +productId: String\r\n  +quantity: int\r\n  +unitPrice: Money\r\n}\r\n\r\n' Ph\u1ee5 thu\u1ed9c\r\nIOrderService ..&gt; IInventoryService : s\u1eed d\u1ee5ng &gt;\r\nIOrderService ..&gt; IPaymentProcessor : ph\u1ed1i h\u1ee3p &gt;\r\nIOrderService ..&gt; OrderDTO : tr\u1ea3 v\u1ec1 &gt;\r\n\r\nnote bottom of IOrderService\r\n  X\u00e1c \u0111\u1ecbnh h\u1ee3p \u0111\u1ed3ng qu\u1ea3n l\u00fd \u0111\u01a1n h\u00e0ng.\r\n  Tri\u1ec3n khai c\u00f3 th\u1ec3 kh\u00e1c nhau (microservice, monolith, v.v.)\r\nend note\r\n\r\n@enduml\r\n<\/code><\/pre>                <\/div>\r\n                <div class=\"vpascode-actions\">\r\n                    <a href=\"https:\/\/www.vpascode.com#plantuml:TLInYjj04Eq5-eVfOXFZ3n31NC0G33dEs2xIxgtshELMkxxTMO49AKAA56bof4gNuqYNL0a4pgJoaV_GdsIqaXrRLXgZcPrvysRcUSuSCei-Lt644fM0y-rFoBRVT0QF7yk7NnomVBXFu8La1b9PRjvh69UR3po3ejnyZQCuaXg5lM9SmEJ2fiBEXIqaMQ_Z2E0fjuAX20yzxXsQNDX9ci0ShTJB0KWKkKlWfNJuB4HDo35UN8pw2GIRlWFGKc2DOaBK7g8TvrVfhk0S6NhNJXY02_uchmuYb4jZb62wPiqKzsg7ip38L4VTSwF5EexUjAOmPUjSQ9nQmuLpnZQJMDLsythAQbK_Z0KogOXT4qXzzVV6J3YlCC1PSULrkaD3oxHZ7ANHXvWiDrvZmvHWPY5fXz8cFj45OHcxRgqm4_pwUK6isALK4jSzQYNr70yhtNYcIK7h10YmDKqh706AQhCTspXKm2n4ij06kKSdGFJfn45KnrOA8zEcDwwOStjvDEsqCkeMJvGPtFyLPtZ5IXPx5P2ZGrUdH1g8Vw8udcJm7WspLhMM92ZQoR7gdi0qexyXOERBpMSUHyT_mU5mrB7L15ov-Guf9UebZ3gJJZISm8egtKgWt_jLTzP-q0cWfRDHdOYtLMWSQOE2LeaqPJ1NnvUYQl3Lzex3uorT5heyTOdA-aG4Rpn1QL3Rt-JwSwVfF7tHos6LjR1qaTvfkCwO1BxzGNCWcymAJMVCGo-Nt1fN5nf0RhGX1MS3A8R5i1z7GgTGSQiudf51b_0l\" \r\n                       target=\"_blank\" \r\n                       rel=\"noopener noreferrer\" \r\n                       class=\"vpascode-fancy-btn\">\r\n                        <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" style=\"margin-right: 6px;\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"><\/path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"><\/path><\/svg>\r\n                        <span>Edit PlantUML in VPasCode<\/span>\r\n                    <\/a>\r\n                <\/div>\r\n            <\/div>\r\n            \n<\/p><\/div>\n<div class=\"vpascode-actions\">\n<a class=\"vpascode-fancy-btn\" href=\"https:\/\/www.vpascode.com#plantuml:TLHBRkCm3DqRy1suQu89SW1Z47I0R0nCqIBf1LIPJeJAb4UY0XZ5t7resSuaZhipoSV7tvEV0olFiR5vneOjmh55RMgZ5Hj7yE8gj0KSqL-CHYY9qTTAOyYpF3EJ1UMhhz1FgAyy0_YXFIh655Zf6DWrwCjAkDWREct0C3QXWDycyC-4AiMnVt_ThGj8jdmdeXFomE8IwaennyMscWeUMN4CyuGDXEGVymQGi7muPr7HqBMoEjg9vzsniWjrNnnXbsT_PrjuKrs3n6_UoOQ2y-Ccsi4UeuzTjKDWZwoCbUv6eCorlXe73D5oelDOHwecDlQAWjBzjMuvLUCYyTYfq1nIqiGoRxoaYt0vtyrEU4Rz-UiYNQaFOmrtAncbYfflA_s9YaGwNG52EDkcno24s5zsuHgt2ZWaP19TZzuz4Cbdm1lKmbKkpbJZRDgg4Axo6CUPPGmZFYWpkRyLPufoBukh2iIneAl7HaQA_wAutsJotYrpK3KP4PJSv5vrJx375gb2qgP_ZVSlSBlTBHorW1Wmm6uH_Q3T0hIJZHcIn_1DqdM_1NZaw2dXyemSevoFPRFWwlk_Gp_K7cj3Gifdb28a4jOCjTHC5u96aJfXtyssHvTDQvELxXuatC55-GvMZT7UXO5t0uqZ9o8zRm1PRzTv9kk1lfM-fMSnv2_t3m00\" rel=\"noopener noreferrer\" target=\"_blank\"><br \/>\n<svg fill=\"none\" height=\"14\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2.5\" style=\"margin-right: 6px;\" viewbox=\"0 0 24 24\" width=\"14\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"><\/path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"><\/path><\/svg><br \/>\n<span>Ch\u1ec9nh s\u1eeda PlantUML trong VPasCode<\/span><br \/>\n<\/a>\n<\/div>\n<\/div>\n<p data-nodeid=\"202\"><strong data-nodeid=\"471\">L\u1ee3i \u00edch Ki\u1ebfn tr\u00fac:<\/strong><\/p>\n<ul data-nodeid=\"203\">\n<li data-nodeid=\"204\">\n<p data-nodeid=\"205\">Ph\u00e2n t\u00e1ch giao di\u1ec7n cho ph\u00e9p tri\u1ec3n khai \u0111\u1ed9c l\u1eadp<\/p>\n<\/li>\n<li data-nodeid=\"206\">\n<p data-nodeid=\"207\">DTOs t\u00e1ch bi\u1ec7t c\u00e1c m\u00f4 h\u00ecnh n\u1ed9i b\u1ed9 kh\u1ecfi h\u1ee3p \u0111\u1ed3ng API<\/p>\n<\/li>\n<li data-nodeid=\"208\">\n<p data-nodeid=\"209\">Ph\u1ee5 thu\u1ed9c r\u00f5 r\u00e0ng cho th\u1ea5y ranh gi\u1edbi d\u1ecbch v\u1ee5 cho c\u00e1c microservice<\/p>\n<\/li>\n<\/ul>\n<hr data-nodeid=\"210\"\/>\n<h3 data-nodeid=\"211\"><strong data-nodeid=\"478\">Giai \u0111o\u1ea1n 3: M\u00f4 h\u00ecnh Tri\u1ec3n khai (G\u00f3c nh\u00ecn M\u00e3 ngu\u1ed3n)<\/strong><\/h3>\n<p data-nodeid=\"212\"><em data-nodeid=\"482\">Chi ti\u1ebft \u0111\u1eb7c th\u00f9 c\u00f4ng ngh\u1ec7 cho tri\u1ec3n khai Java\/Spring Boot<\/em><\/p>\n<p id=\"ZSqOdQO\"><img alt=\"\" class=\"alignnone size-full wp-image-24657\" decoding=\"async\" height=\"959\" loading=\"lazy\" sizes=\"auto, (max-width: 1738px) 100vw, 1738px\" src=\"https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/05\/img_6a0eb9e55e69a.png\" srcset=\"https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/05\/img_6a0eb9e55e69a.png 1738w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/05\/img_6a0eb9e55e69a-300x166.png 300w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/05\/img_6a0eb9e55e69a-1030x568.png 1030w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/05\/img_6a0eb9e55e69a-768x424.png 768w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/05\/img_6a0eb9e55e69a-1536x848.png 1536w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/05\/img_6a0eb9e55e69a-150x83.png 150w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/05\/img_6a0eb9e55e69a-400x221.png 400w\" width=\"1738\"\/><\/p>\n<div class=\"vpascode-viewer-container vpascode-fancy-active\">\n<div class=\"vpascode-header\">\n<span class=\"vpascode-lang-label\">PlantUML<\/span><br \/>\n<a class=\"vpascode-fancy-btn\" href=\"https:\/\/www.vpascode.com#plantuml:TLLBRzf04BuZyHz6kTG9uAfNgur2WBQk2450Ufzu9x2AxNNsGOIg_FVEsklmIYwBvptppOCROr5RL-JTZfKs9qYBAgU2IejMgXBkbA0yWJ-unQ_BIijo3RTAMHZbQ0oPRgVRgJ1xnZL1fegO-2b8PnGhBKZ7x4VQ7VphTW0oRmBtdjym00OtgO1QCnK9F3oauvP_X-LkfUvBTkkCLUmpWL7uQdLOkb9UCShGP2Zent0wlGHfgJ09JAMnt-jeAJEkWr4TR8oMM45bcFlFbImeY1aDwzYujblMH91OPJ4V5igLDe5RkHvJ9WlC6sdpzb087okgj18kOxrvyz675xjBG9RsCe6jaYBeS_pCvJu3xpowF7VSAr0_3yro8wkAH7HW_kQV4rXzy2DeFHIV8rjZ4MezbvuM4JHU7DOzhSi9F5TAEzSoeq-HMPDTkaVxSPdlfL3fYaFesrhcazaudVrgYD7zx6Uwk9k4WfQ_q_cy9SQJQVfticZ9qN0scaod3SbHtZuVrmftVkXZGthBXHnExBmHBGyb7ggXi-fLQX8GZ7zn9r-HaPaVqUVwDV0BgfIHLkbTQC6USGGTzo4ZOuBFw6XR-Y2iUe-te1T7ni_OEyDKgZJjS6ynbu9p2j8nMPIvYJvsiH_JWQkyLPrZYqNTdjDSskKvKlfeP7boI3yXWtcCL8jjBzkWNbE4P-lMXmmr1npn6_Bd02kDfS7C7omksULXBdkQdbmf8hiN-sINrf-nFfnxPrUBscJlfPsQBop9wvDeU1VvA3HtxEBR1LmD1lmRnrSN1rkO-Fcg--clw7Mh7yVNf_EKWA2AIc6WKJmH7rYqAF7gjKVQm5QYj-fsIcK9j5nlBAYdVIQ-Y9j9SuQnPANchXTO6R0AkBFuY8Q0VtAAlVPeVqnv8utJP9gR2XLfmrSLNgNTD4FC1fmw-DW-Xnic-B_aFm00\" rel=\"noopener noreferrer\" target=\"_blank\"><br \/>\n<svg fill=\"none\" height=\"14\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2.5\" style=\"margin-right: 8px;\" viewbox=\"0 0 24 24\" width=\"14\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"><\/path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"><\/path><\/svg><br \/>\n<span>Ch\u1ec9nh s\u1eeda PlantUML trong VPasCode<\/span><br \/>\n<\/a>\n<\/div>\n<div class=\"vpascode-code-wrapper\">\n            <div class=\"vpascode-viewer-container vpascode-fancy-active\">\r\n                                <div class=\"vpascode-header\">\r\n                    <span class=\"vpascode-lang-label\">PlantUML<\/span>\r\n                    <a href=\"https:\/\/www.vpascode.com#plantuml:TLKxJnj14Euj-J-CQ682N9Jsb22CxH171YpRfD_iBRuLTxl7FaoiY2e5DMMK8h5GkaYXI1DSf734_xX_ajbxu1SqwvlNDpFVpextj27As3YgLWmt4OF3sMy8Ppz520F5q-bd0MSXuJvqqkdN1DwH4NdHJnGNGzYNqbGhrKf2w1aPCg0ozXWUCLEKUL85J7bC8EeOFbKh03GYMiEnq-SAW9szTW2PPplmuUIatIprXqIC1_9O8ApLHYAc3utYg_H1wq0wnnebcfA0lQvtEfl03Oir5iorUPLbQwDYjmZAaZM9OUWWAOdSvu37h30Z6yPYS1RNpuJ2OgGXKJsMLXWVzlcmoIYFIPHRytEB187BLKkK32n5lsx-iGtdPkm35sRJXv7aGU6F-QcDN0KElBQv3hmL4tLMr_sG9maBQWlXb-vOeTKbNwBMKV4qinaNHQ_hrjKc2ezpIx8xpTefT5PmqrMSiYUP6JBJjn_Cusq-jCA4ZHUfBtlfjewQxQE3N6WS7xrfzmvRHKFzj-rkjnIQhKxxVQjNYetwKQFLwUGYPhbyUbmJCevnM3tDr0WRMPpORcxgBreSLNLhv0LNB80Y-01lye8WCzqbUTq_8xx74gcvaMfSNC5SiKGTtWDbMXUOjQNNiWs1aG_vUkpSCkrcx46X4obqETmZ4l40QogiJMO8ZtJjSOZvcExOn4LbDPPSPDUpMalvU9QS7XjPd1ocJWcIkSnKoUqM3OaQiXfPUsxRG8d2X0qyY_enmK0HeGarN0fisKR5N6ufTcf5K3DpioksRzpwsePrT8JgPI5pb79gdi5XEhtcuCOVmdHwLQtacspZvGOytzd1Nyzxlh7m3dquI-_-6kTyay1kwUzvkwiJvKE2JZ_0X3QTVg4mcdsNBc35RI6ovCi7ix2a4M3s6nSprkZ2gnKX3GF5Xw41UJelpVLr47AWuUmEzbhvYfvDSEL_JEycyEyQwnRm8RsxGJ1wFm6TJhz1a4v_GOJPhgpd41hpdPk5tCHPY0Gwcr28iI6A-ljRR9z2T7zhqV070L4tGGfdtyKGSPW8m9Nfojr30V-9_WC0\" \r\n                       target=\"_blank\" \r\n                       rel=\"noopener noreferrer\" \r\n                       class=\"vpascode-fancy-btn\">\r\n                        <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" style=\"margin-right: 8px;\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"><\/path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"><\/path><\/svg>\r\n                        <span>Edit PlantUML in VPasCode<\/span>\r\n                    <\/a>\r\n                <\/div>\r\n                                <div class=\"vpascode-code-wrapper\">\r\n                    <pre class=\"lang-plantuml\" data-nodeid=\"213\"><code class=\"language-plantuml\" data-language=\"plantuml\" class=\"language-plantuml\">@startuml\r\ntitle M\u00f4 h\u00ecnh Tri\u1ec3n khai: L\u1edbp Java\/Spring Boot\r\n\r\npackage com.ecommerce.order.entity {\r\n  class Order {\r\n    -@Id orderId: UUID\r\n    -@ManyToOne customer: Customer\r\n    -@OneToMany(cascade=ALL) items: List&lt;OrderItem&gt;\r\n    -orderDate: LocalDateTime\r\n    -status: OrderStatus\r\n    -totalAmount: BigDecimal\r\n    \r\n    +addItem(product: Product, qty: int): void\r\n    +calculateTotal(): BigDecimal\r\n    +markAsShipped(): void\r\n  }\r\n  \r\n  class OrderItem {\r\n    -@Id itemId: UUID\r\n    -@ManyToOne order: Order\r\n    -@ManyToOne product: Product\r\n    -quantity: int\r\n    -unitPrice: BigDecimal\r\n    \r\n    +getSubtotal(): BigDecimal\r\n  }\r\n  \r\n  enum OrderStatus {\r\n    PENDING\r\n    CONFIRMED\r\n    SHIPPED\r\n    DELIVERED\r\n    CANCELLED\r\n  }\r\n}\r\n\r\npackage com.ecommerce.payment.service {\r\n  class PaymentService {\r\n    -@Autowired paymentGateway: PaymentGateway\r\n    -@Autowired orderRepository: OrderRepository\r\n    \r\n    +processPayment(orderId: UUID, dto: PaymentRequest): PaymentResponse\r\n    -validatePaymentDetails(dto: PaymentRequest): void\r\n    -updateOrderPaymentStatus(orderId: UUID, status: PaymentStatus): void\r\n  }\r\n  \r\n  interface PaymentGateway {\r\n    +charge(amount: BigDecimal, card: CardDetails): TransactionResult\r\n    +refund(transactionId: String, amount: BigDecimal): RefundResult\r\n  }\r\n}\r\n\r\n' M\u1ed1i quan h\u1ec7\r\nOrder \"1\" *-- \"1..*\" OrderItem : k\u1ebft h\u1ee3p &gt;\r\nOrder ..&gt; PaymentService : ph\u1ee5 thu\u1ed9c v\u00e0o &gt;\r\nPaymentService ..&gt; PaymentGateway : tri\u1ec3n khai th\u00f4ng qua &gt;\r\n\r\nnote right of OrderItem\r\n  Ghi ch\u00fa @Entity \u00e1nh x\u1ea1 \u0111\u1ebfn b\u1ea3ng c\u01a1 s\u1edf d\u1eef li\u1ec7u.\r\n  Cascade=ALL \u0111\u1ea3m b\u1ea3o c\u00e1c m\u1ee5c \u0111\u01b0\u1ee3c l\u01b0u c\u00f9ng \u0111\u01a1n h\u00e0ng.\r\nend note\r\n\r\n@enduml\r\n<\/code><\/pre>                <\/div>\r\n                <div class=\"vpascode-actions\">\r\n                    <a href=\"https:\/\/www.vpascode.com#plantuml:TLKxJnj14Euj-J-CQ682N9Jsb22CxH171YpRfD_iBRuLTxl7FaoiY2e5DMMK8h5GkaYXI1DSf734_xX_ajbxu1SqwvlNDpFVpextj27As3YgLWmt4OF3sMy8Ppz520F5q-bd0MSXuJvqqkdN1DwH4NdHJnGNGzYNqbGhrKf2w1aPCg0ozXWUCLEKUL85J7bC8EeOFbKh03GYMiEnq-SAW9szTW2PPplmuUIatIprXqIC1_9O8ApLHYAc3utYg_H1wq0wnnebcfA0lQvtEfl03Oir5iorUPLbQwDYjmZAaZM9OUWWAOdSvu37h30Z6yPYS1RNpuJ2OgGXKJsMLXWVzlcmoIYFIPHRytEB187BLKkK32n5lsx-iGtdPkm35sRJXv7aGU6F-QcDN0KElBQv3hmL4tLMr_sG9maBQWlXb-vOeTKbNwBMKV4qinaNHQ_hrjKc2ezpIx8xpTefT5PmqrMSiYUP6JBJjn_Cusq-jCA4ZHUfBtlfjewQxQE3N6WS7xrfzmvRHKFzj-rkjnIQhKxxVQjNYetwKQFLwUGYPhbyUbmJCevnM3tDr0WRMPpORcxgBreSLNLhv0LNB80Y-01lye8WCzqbUTq_8xx74gcvaMfSNC5SiKGTtWDbMXUOjQNNiWs1aG_vUkpSCkrcx46X4obqETmZ4l40QogiJMO8ZtJjSOZvcExOn4LbDPPSPDUpMalvU9QS7XjPd1ocJWcIkSnKoUqM3OaQiXfPUsxRG8d2X0qyY_enmK0HeGarN0fisKR5N6ufTcf5K3DpioksRzpwsePrT8JgPI5pb79gdi5XEhtcuCOVmdHwLQtacspZvGOytzd1Nyzxlh7m3dquI-_-6kTyay1kwUzvkwiJvKE2JZ_0X3QTVg4mcdsNBc35RI6ovCi7ix2a4M3s6nSprkZ2gnKX3GF5Xw41UJelpVLr47AWuUmEzbhvYfvDSEL_JEycyEyQwnRm8RsxGJ1wFm6TJhz1a4v_GOJPhgpd41hpdPk5tCHPY0Gwcr28iI6A-ljRR9z2T7zhqV070L4tGGfdtyKGSPW8m9Nfojr30V-9_WC0\" \r\n                       target=\"_blank\" \r\n                       rel=\"noopener noreferrer\" \r\n                       class=\"vpascode-fancy-btn\">\r\n                        <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" style=\"margin-right: 6px;\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"><\/path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"><\/path><\/svg>\r\n                        <span>Edit PlantUML in VPasCode<\/span>\r\n                    <\/a>\r\n                <\/div>\r\n            <\/div>\r\n            \n<\/p><\/div>\n<div class=\"vpascode-actions\">\n<a class=\"vpascode-fancy-btn\" href=\"https:\/\/www.vpascode.com#plantuml:TLLBRzf04BuZyHz6kTG9uAfNgur2WBQk2450Ufzu9x2AxNNsGOIg_FVEsklmIYwBvptppOCROr5RL-JTZfKs9qYBAgU2IejMgXBkbA0yWJ-unQ_BIijo3RTAMHZbQ0oPRgVRgJ1xnZL1fegO-2b8PnGhBKZ7x4VQ7VphTW0oRmBtdjym00OtgO1QCnK9F3oauvP_X-LkfUvBTkkCLUmpWL7uQdLOkb9UCShGP2Zent0wlGHfgJ09JAMnt-jeAJEkWr4TR8oMM45bcFlFbImeY1aDwzYujblMH91OPJ4V5igLDe5RkHvJ9WlC6sdpzb087okgj18kOxrvyz675xjBG9RsCe6jaYBeS_pCvJu3xpowF7VSAr0_3yro8wkAH7HW_kQV4rXzy2DeFHIV8rjZ4MezbvuM4JHU7DOzhSi9F5TAEzSoeq-HMPDTkaVxSPdlfL3fYaFesrhcazaudVrgYD7zx6Uwk9k4WfQ_q_cy9SQJQVfticZ9qN0scaod3SbHtZuVrmftVkXZGthBXHnExBmHBGyb7ggXi-fLQX8GZ7zn9r-HaPaVqUVwDV0BgfIHLkbTQC6USGGTzo4ZOuBFw6XR-Y2iUe-te1T7ni_OEyDKgZJjS6ynbu9p2j8nMPIvYJvsiH_JWQkyLPrZYqNTdjDSskKvKlfeP7boI3yXWtcCL8jjBzkWNbE4P-lMXmmr1npn6_Bd02kDfS7C7omksULXBdkQdbmf8hiN-sINrf-nFfnxPrUBscJlfPsQBop9wvDeU1VvA3HtxEBR1LmD1lmRnrSN1rkO-Fcg--clw7Mh7yVNf_EKWA2AIc6WKJmH7rYqAF7gjKVQm5QYj-fsIcK9j5nlBAYdVIQ-Y9j9SuQnPANchXTO6R0AkBFuY8Q0VtAAlVPeVqnv8utJP9gR2XLfmrSLNgNTD4FC1fmw-DW-Xnic-B_aFm00\" rel=\"noopener noreferrer\" target=\"_blank\"><br \/>\n<svg fill=\"none\" height=\"14\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2.5\" style=\"margin-right: 6px;\" viewbox=\"0 0 24 24\" width=\"14\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"><\/path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"><\/path><\/svg><br \/>\n<span>Ch\u1ec9nh s\u1eeda PlantUML trong VPasCode<\/span><br \/>\n<\/a>\n<\/div>\n<\/div>\n<p data-nodeid=\"214\"><strong data-nodeid=\"486\">\u0110i\u1ec3m n\u1ed5i b\u1eadt Tri\u1ec3n khai:<\/strong><\/p>\n<ul data-nodeid=\"215\">\n<li data-nodeid=\"216\">\n<p data-nodeid=\"217\">Ghi ch\u00fa JPA (<code data-backticks=\"1\" data-nodeid=\"488\">@Entity<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"490\">@ManyToOne<\/code>) \u0111\u1ec3 \u00e1nh x\u1ea1 ORM<\/p>\n<\/li>\n<li data-nodeid=\"218\">\n<p data-nodeid=\"219\">Ch\u00e8n ph\u1ee5 thu\u1ed9c (<code data-backticks=\"1\" data-nodeid=\"493\">@Autowired<\/code>) \u0111\u1ec3 gi\u1ea3m r\u00e0ng bu\u1ed9c<\/p>\n<\/li>\n<li data-nodeid=\"220\">\n<p data-nodeid=\"221\">Enum \u0111\u1ec3 qu\u1ea3n l\u00fd tr\u1ea1ng th\u00e1i \u0111\u01a1n h\u00e0ng an to\u00e0n v\u1ec1 ki\u1ec3u d\u1eef li\u1ec7u<\/p>\n<\/li>\n<li data-nodeid=\"222\">\n<p data-nodeid=\"223\">C\u00e1c ph\u01b0\u01a1ng th\u1ee9c tr\u1ee3 gi\u00fap ri\u00eang t\u01b0 (<code data-backticks=\"1\" data-nodeid=\"497\">-validatePaymentDetails<\/code>) \u0111\u00f3ng g\u00f3i logic<\/p>\n<\/li>\n<\/ul>\n<hr data-nodeid=\"224\"\/>\n<h2 data-nodeid=\"225\"><strong data-nodeid=\"504\">C\u00e1c m\u1eabu n\u00e2ng cao v\u00e0 th\u1ef1c h\u00e0nh t\u1ed1t nh\u1ea5t<\/strong><\/h2>\n<h3 data-nodeid=\"226\"><strong data-nodeid=\"508\">1. X\u1eed l\u00fd t\u00ednh kh\u1ea3 ki\u1ebfn v\u00e0 \u0111\u00f3ng g\u00f3i<\/strong><\/h3>\n<p id=\"CXceEyL\"><img alt=\"\" class=\"alignnone size-full wp-image-24658\" decoding=\"async\" height=\"229\" loading=\"lazy\" sizes=\"auto, (max-width: 975px) 100vw, 975px\" src=\"https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/05\/img_6a0eba223951b.png\" srcset=\"https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/05\/img_6a0eba223951b.png 975w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/05\/img_6a0eba223951b-300x70.png 300w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/05\/img_6a0eba223951b-768x180.png 768w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/05\/img_6a0eba223951b-150x35.png 150w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/05\/img_6a0eba223951b-400x94.png 400w\" width=\"975\"\/><\/p>\n<div class=\"vpascode-viewer-container vpascode-fancy-active\">\n<div class=\"vpascode-header\">\n<span class=\"vpascode-lang-label\">PlantUML<\/span><br \/>\n<a class=\"vpascode-fancy-btn\" href=\"https:\/\/www.vpascode.com#plantuml:PL7DIiH03BuN-Wu1Bolg2nIHxRA81P62uZsTPhjXfncOoQmkeizkseeAUqlcIxwVp3efHisZBmldCINOe1ngvq8MXO-o0BZ2fNlAOqUnWcUDBCEC3AGRz2YELfSLR7ZOakCH_GJUT0jozguH9Q5J3lB0IKCyLV1enUtB7t0tJLuuz2vxL6f4ALBILRIcWZxapjEPuXTFOuA-pZthvEWOk2-Bpx8e2mbA47dOAuJT_v1p46YDaLq5TTl0BaIWzuKAd6SIJRDpQ2CVPmVDZnBOzPIkmTZ1paGfiJdxtVQdEOVjcRfJwYkuD_AKk-NMqvmaoplRXnRT0GUZV-M5vurrpm89Hu8nzDbJMP3qavnLQoljuxu1\" rel=\"noopener noreferrer\" target=\"_blank\"><br \/>\n<svg fill=\"none\" height=\"14\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2.5\" style=\"margin-right: 8px;\" viewbox=\"0 0 24 24\" width=\"14\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"><\/path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"><\/path><\/svg><br \/>\n<span>Ch\u1ec9nh s\u1eeda PlantUML trong VPasCode<\/span><br \/>\n<\/a>\n<\/div>\n<div class=\"vpascode-code-wrapper\">\n            <div class=\"vpascode-viewer-container vpascode-fancy-active\">\r\n                                <div class=\"vpascode-header\">\r\n                    <span class=\"vpascode-lang-label\">PlantUML<\/span>\r\n                    <a href=\"https:\/\/www.vpascode.com#plantuml:PL51IXr14DqFp1qUk36ON608ulyAYH12Y5wWfwUTQUofbfuQuHEIZGlNMKeMKIIRH44mc_nPTl0UVPDKZuk4k2cgwbMzLwzxPs0LUEnTMMYdXW5BHSSBhVr8Z0zb0Mofn-hjsDScL3ZWOAcTaTRmKZb5scm-gx2qxPxHjbSkWo_gH-H9duEYGMcsdbxRWNrOLNWZoSl3ly1sdjpGokdHAJRxn2QOWJU351KQFzREF57yPFCOARSO6ylvebDlcxBuM1PbGPuDWcqxXZ_wr-Hi1Bln9xKuxfIji7Yt3zrvgUALxj35Iu7g-9r0hO-NTdQ1zrOwBVZXhi9XIEkhNCY61QNfmgAM-3npP68EumewhMzFyFlpmrsQhZKuJJ_-fzt0CgslFKxJT5vXJvIx-PG-JLyHX56uN9g-d41xcZtZLRoNctVZlQYdwGpKnHlA-VhRIdIzREZuIw9mN31wtupEb8MX1lbDoc97Kld_Fm00\" \r\n                       target=\"_blank\" \r\n                       rel=\"noopener noreferrer\" \r\n                       class=\"vpascode-fancy-btn\">\r\n                        <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" style=\"margin-right: 8px;\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"><\/path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"><\/path><\/svg>\r\n                        <span>Edit PlantUML in VPasCode<\/span>\r\n                    <\/a>\r\n                <\/div>\r\n                                <div class=\"vpascode-code-wrapper\">\r\n                    <pre class=\"lang-plantuml\" data-nodeid=\"227\"><code class=\"language-plantuml\" data-language=\"plantuml\" class=\"language-plantuml\">@startuml\r\nclass BankAccount {\r\n  +accountNumber: String\r\n  +getBalance(): BigDecimal\r\n  -balance: BigDecimal\r\n  -transactionHistory: List&lt;Transaction&gt;\r\n  #calculateInterest(rate: double): BigDecimal\r\n  ~internalAudit(): void\r\n}\r\n\r\nnote right of BankAccount\r\n  + C\u00f4ng khai: API cho kh\u00e1ch h\u00e0ng b\u00ean ngo\u00e0i\r\n  - Ri\u00eang t\u01b0: Tr\u1ea1ng th\u00e1i n\u1ed9i b\u1ed9, kh\u00f4ng truy c\u1eadp \u0111\u01b0\u1ee3c t\u1eeb b\u00ean ngo\u00e0i\r\n  # B\u1ea3o v\u1ec7: D\u00e0nh cho m\u1edf r\u1ed9ng l\u1edbp con\r\n  ~ G\u00f3i: C\u00f3 th\u1ec3 nh\u00ecn th\u1ea5y trong c\u00f9ng m\u1ed9t module\r\nend note\r\n@enduml\r\n<\/code><\/pre>                <\/div>\r\n                <div class=\"vpascode-actions\">\r\n                    <a href=\"https:\/\/www.vpascode.com#plantuml:PL51IXr14DqFp1qUk36ON608ulyAYH12Y5wWfwUTQUofbfuQuHEIZGlNMKeMKIIRH44mc_nPTl0UVPDKZuk4k2cgwbMzLwzxPs0LUEnTMMYdXW5BHSSBhVr8Z0zb0Mofn-hjsDScL3ZWOAcTaTRmKZb5scm-gx2qxPxHjbSkWo_gH-H9duEYGMcsdbxRWNrOLNWZoSl3ly1sdjpGokdHAJRxn2QOWJU351KQFzREF57yPFCOARSO6ylvebDlcxBuM1PbGPuDWcqxXZ_wr-Hi1Bln9xKuxfIji7Yt3zrvgUALxj35Iu7g-9r0hO-NTdQ1zrOwBVZXhi9XIEkhNCY61QNfmgAM-3npP68EumewhMzFyFlpmrsQhZKuJJ_-fzt0CgslFKxJT5vXJvIx-PG-JLyHX56uN9g-d41xcZtZLRoNctVZlQYdwGpKnHlA-VhRIdIzREZuIw9mN31wtupEb8MX1lbDoc97Kld_Fm00\" \r\n                       target=\"_blank\" \r\n                       rel=\"noopener noreferrer\" \r\n                       class=\"vpascode-fancy-btn\">\r\n                        <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" style=\"margin-right: 6px;\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"><\/path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"><\/path><\/svg>\r\n                        <span>Edit PlantUML in VPasCode<\/span>\r\n                    <\/a>\r\n                <\/div>\r\n            <\/div>\r\n            \n<\/p><\/div>\n<div class=\"vpascode-actions\">\n<a class=\"vpascode-fancy-btn\" href=\"https:\/\/www.vpascode.com#plantuml:PL7DIiH03BuN-Wu1Bolg2nIHxRA81P62uZsTPhjXfncOoQmkeizkseeAUqlcIxwVp3efHisZBmldCINOe1ngvq8MXO-o0BZ2fNlAOqUnWcUDBCEC3AGRz2YELfSLR7ZOakCH_GJUT0jozguH9Q5J3lB0IKCyLV1enUtB7t0tJLuuz2vxL6f4ALBILRIcWZxapjEPuXTFOuA-pZthvEWOk2-Bpx8e2mbA47dOAuJT_v1p46YDaLq5TTl0BaIWzuKAd6SIJRDpQ2CVPmVDZnBOzPIkmTZ1paGfiJdxtVQdEOVjcRfJwYkuD_AKk-NMqvmaoplRXnRT0GUZV-M5vurrpm89Hu8nzDbJMP3qavnLQoljuxu1\" rel=\"noopener noreferrer\" target=\"_blank\"><br \/>\n<svg fill=\"none\" height=\"14\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2.5\" style=\"margin-right: 6px;\" viewbox=\"0 0 24 24\" width=\"14\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"><\/path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"><\/path><\/svg><br \/>\n<span>Ch\u1ec9nh s\u1eeda PlantUML trong VPasCode<\/span><br \/>\n<\/a>\n<\/div>\n<\/div>\n<h3 data-nodeid=\"228\"><strong data-nodeid=\"512\">2. T\u00ednh \u0111a d\u1ea1ng trong c\u00e1c t\u00ecnh hu\u1ed1ng th\u1ef1c t\u1ebf<\/p>\n<p><\/strong><\/h3>\n<p id=\"TInrWNg\"><img alt=\"\" class=\"alignnone size-full wp-image-24659\" decoding=\"async\" height=\"572\" loading=\"lazy\" sizes=\"auto, (max-width: 441px) 100vw, 441px\" src=\"https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/05\/img_6a0eba3fdcfe0.png\" srcset=\"https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/05\/img_6a0eba3fdcfe0.png 441w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/05\/img_6a0eba3fdcfe0-231x300.png 231w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/05\/img_6a0eba3fdcfe0-116x150.png 116w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/05\/img_6a0eba3fdcfe0-400x519.png 400w\" width=\"441\"\/><\/p>\n<h3 data-nodeid=\"228\"><strong data-nodeid=\"512\">\u00a0<\/strong><\/h3>\n<div class=\"vpascode-viewer-container vpascode-fancy-active\">\n<div class=\"vpascode-header\">\n<span class=\"vpascode-lang-label\">PlantUML<\/span><br \/>\n<a class=\"vpascode-fancy-btn\" href=\"https:\/\/www.vpascode.com#plantuml:NPB1JiCm38RlbVeELYziOwlMQoNG1kom0m9fJn1IiqKaSKdSYGeXyImy6a-2sswmSOj__VxzsSeYiWhSE9icsgeOOREZkZP-UoiolAS9mAMggZMZ6zM1gaPp2O_3Omglt9PWF8zBs9EfUdT0HtiyRLXN9MmuIAZudeWiAfyc7sbod7d8Euppok6neHVgOBGeDsPxXzeuPNlL-0sJVlcVU05Bq1sxLXvsQeym1oPmohTW12fsbfNIkxw2WCyOq6kCW6zAissXW0DtcfmT8oiocCncaCtpV9BzGfUWoRCoFi9r1-29KPYOoNMSzurbKrkZ3RSG6eknxEJlpo_eSk0A7cesv9MT3f0ZHr7eoJdouwEr4D_gm4SUnQHyfPX2Epv9AyxIee1RiMA-pQVTJiz6ojfeRWB-9GyGImOveWpkquSM2XM6uMXYHrz1jrkQBEGfF-O7\" rel=\"noopener noreferrer\" target=\"_blank\"><br \/>\n<svg fill=\"none\" height=\"14\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2.5\" style=\"margin-right: 8px;\" viewbox=\"0 0 24 24\" width=\"14\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"><\/path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"><\/path><\/svg><br \/>\n<span>Ch\u1ec9nh s\u1eeda PlantUML trong VPasCode<\/span><br \/>\n<\/a>\n<\/div>\n<div class=\"vpascode-code-wrapper\">\n            <div class=\"vpascode-viewer-container vpascode-fancy-active\">\r\n                                <div class=\"vpascode-header\">\r\n                    <span class=\"vpascode-lang-label\">PlantUML<\/span>\r\n                    <a href=\"https:\/\/www.vpascode.com#plantuml:NL9FInj15Bylx7Tuv69YLSnreIBLYmT1YLzWChFi3CtCR3TlWq64bXvw4l4a7WHZoS63jE2XTFQGmmQ_n_IJzErkej7ByEOtx_VdFMPtY2p3N0_2W0_OS0WzQTDKcMIFO3WB0u0FJ8W3Z7KxpQp8EKPmr1GRy0N74IY3dGX6LecwEukr7SMhX0CHGGyp4gM-lhM3c9amE0-3fUT2Rs5dc8wNX1f8CyK9-QII_PWhpGOrgamFBV_yNd4D3drnWv0eNro2BEzC0hny0fI--5vNsp2_ycvcm4Zg-PQ3zkuFDgqB_hLQ1OdBD73gThESoAKZh0j3xtuQIALt3peCtkojrMt1-kOcjBQtjjPRB_D59EAB1mOxLL9ZCQRmY5PN0ntdOq3lVd5oO22ycvWagXx-VRs7IWS-madvTrnhN9YDb_XjbC-_VN5BeH8AdTA3TrFiBBbT8kx9yj58E2qdd2QhzjFkanT2FwSRxwpuTD_x20hMI49xL3vIj68QGJMyh3SvKI0eoG_pwjYaBIzmILnuljBVh3UpTCwldYUcGKWeDWAg1ON1BfNqF_y3\" \r\n                       target=\"_blank\" \r\n                       rel=\"noopener noreferrer\" \r\n                       class=\"vpascode-fancy-btn\">\r\n                        <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" style=\"margin-right: 8px;\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"><\/path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"><\/path><\/svg>\r\n                        <span>Edit PlantUML in VPasCode<\/span>\r\n                    <\/a>\r\n                <\/div>\r\n                                <div class=\"vpascode-code-wrapper\">\r\n                    <pre class=\"lang-plantuml\" data-nodeid=\"229\"><code class=\"language-plantuml\" data-language=\"plantuml\" class=\"language-plantuml\">@startuml\r\nclass ShoppingCart {\r\n  +addItem(product: Product, qty: int): void\r\n  +removeItem(productId: String): boolean\r\n}\r\n\r\nclass Product {\r\n  +name: String\r\n  +price: BigDecimal\r\n  +inStock: boolean\r\n}\r\n\r\n' M\u1ed9t gi\u1ecf h\u00e0ng c\u00f3 th\u1ec3 c\u00f3 0 \u0111\u1ebfn nhi\u1ec1u m\u1eb7t h\u00e0ng\r\n' M\u1ed7i m\u1eb7t h\u00e0ng tham chi\u1ebfu \u0111\u00fang 1 s\u1ea3n ph\u1ea9m\r\nShoppingCart \"1\" *-- \"0..*\" Product : ch\u1ee9a &gt;\r\n\r\nnote bottom\r\n  Quy t\u1eafc \u0111a d\u1ea1ng:\r\n  \u2022 0..* = T\u00f9y ch\u1ecdn, nhi\u1ec1u (th\u01b0\u1eddng g\u1eb7p nh\u1ea5t)\r\n  \u2022 1 = Ch\u00ednh x\u00e1c m\u1ed9t (b\u1eaft bu\u1ed9c)\r\n  \u2022 0..1 = T\u00f9y ch\u1ecdn, duy nh\u1ea5t (v\u00ed d\u1ee5: \u1ea3nh \u0111\u1ea1i di\u1ec7n)\r\n  \u2022 1..* = \u00cdt nh\u1ea5t m\u1ed9t (v\u00ed d\u1ee5: m\u1eb7t h\u00e0ng trong \u0111\u01a1n h\u00e0ng)\r\nend note\r\n@enduml\r\n<\/code><\/pre>                <\/div>\r\n                <div class=\"vpascode-actions\">\r\n                    <a href=\"https:\/\/www.vpascode.com#plantuml:NL9FInj15Bylx7Tuv69YLSnreIBLYmT1YLzWChFi3CtCR3TlWq64bXvw4l4a7WHZoS63jE2XTFQGmmQ_n_IJzErkej7ByEOtx_VdFMPtY2p3N0_2W0_OS0WzQTDKcMIFO3WB0u0FJ8W3Z7KxpQp8EKPmr1GRy0N74IY3dGX6LecwEukr7SMhX0CHGGyp4gM-lhM3c9amE0-3fUT2Rs5dc8wNX1f8CyK9-QII_PWhpGOrgamFBV_yNd4D3drnWv0eNro2BEzC0hny0fI--5vNsp2_ycvcm4Zg-PQ3zkuFDgqB_hLQ1OdBD73gThESoAKZh0j3xtuQIALt3peCtkojrMt1-kOcjBQtjjPRB_D59EAB1mOxLL9ZCQRmY5PN0ntdOq3lVd5oO22ycvWagXx-VRs7IWS-madvTrnhN9YDb_XjbC-_VN5BeH8AdTA3TrFiBBbT8kx9yj58E2qdd2QhzjFkanT2FwSRxwpuTD_x20hMI49xL3vIj68QGJMyh3SvKI0eoG_pwjYaBIzmILnuljBVh3UpTCwldYUcGKWeDWAg1ON1BfNqF_y3\" \r\n                       target=\"_blank\" \r\n                       rel=\"noopener noreferrer\" \r\n                       class=\"vpascode-fancy-btn\">\r\n                        <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" style=\"margin-right: 6px;\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"><\/path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"><\/path><\/svg>\r\n                        <span>Edit PlantUML in VPasCode<\/span>\r\n                    <\/a>\r\n                <\/div>\r\n            <\/div>\r\n            \n<\/p><\/div>\n<div class=\"vpascode-actions\">\n<a class=\"vpascode-fancy-btn\" href=\"https:\/\/www.vpascode.com#plantuml:NPB1JiCm38RlbVeELYziOwlMQoNG1kom0m9fJn1IiqKaSKdSYGeXyImy6a-2sswmSOj__VxzsSeYiWhSE9icsgeOOREZkZP-UoiolAS9mAMggZMZ6zM1gaPp2O_3Omglt9PWF8zBs9EfUdT0HtiyRLXN9MmuIAZudeWiAfyc7sbod7d8Euppok6neHVgOBGeDsPxXzeuPNlL-0sJVlcVU05Bq1sxLXvsQeym1oPmohTW12fsbfNIkxw2WCyOq6kCW6zAissXW0DtcfmT8oiocCncaCtpV9BzGfUWoRCoFi9r1-29KPYOoNMSzurbKrkZ3RSG6eknxEJlpo_eSk0A7cesv9MT3f0ZHr7eoJdouwEr4D_gm4SUnQHyfPX2Epv9AyxIee1RiMA-pQVTJiz6ojfeRWB-9GyGImOveWpkquSM2XM6uMXYHrz1jrkQBEGfF-O7\" rel=\"noopener noreferrer\" target=\"_blank\"><br \/>\n<svg fill=\"none\" height=\"14\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2.5\" style=\"margin-right: 6px;\" viewbox=\"0 0 24 24\" width=\"14\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"><\/path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"><\/path><\/svg><br \/>\n<span>Ch\u1ec9nh s\u1eeda PlantUML trong VPasCode<\/span><br \/>\n<\/a>\n<\/div>\n<\/div>\n<h3 data-nodeid=\"230\"><strong data-nodeid=\"516\">3. L\u1edbp tr\u1eebu t\u01b0\u1ee3ng so v\u1edbi giao di\u1ec7n<\/strong><\/h3>\n<p id=\"qaBNIMo\"><img alt=\"\" class=\"alignnone size-full wp-image-24660\" decoding=\"async\" height=\"374\" loading=\"lazy\" sizes=\"auto, (max-width: 916px) 100vw, 916px\" src=\"https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/05\/img_6a0eba595e5e4.png\" srcset=\"https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/05\/img_6a0eba595e5e4.png 916w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/05\/img_6a0eba595e5e4-300x122.png 300w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/05\/img_6a0eba595e5e4-768x314.png 768w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/05\/img_6a0eba595e5e4-150x61.png 150w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/05\/img_6a0eba595e5e4-400x163.png 400w\" width=\"916\"\/><\/p>\n<div class=\"vpascode-viewer-container vpascode-fancy-active\">\n<div class=\"vpascode-header\">\n<span class=\"vpascode-lang-label\">PlantUML<\/span><br \/>\n<a class=\"vpascode-fancy-btn\" href=\"https:\/\/www.vpascode.com#plantuml:ZPBDIiGm4CVlWRp3W1UbxWiK3olemOEBq2UOfjDs95yaamLHtzsqu69tz-0jpCTl_ZF_xBDWakAiLjXdIMW4ZCMSuH24HpOe73nyQWLmayXmPFBIGYU9_RH67UMC4_sDDITM9Z_SthNGXs09_PgqONeYoqTA7qlg67ZGwbihhTWBfH4DmRD3jfSIcbpwTp8R0St5Z3DMzzfT8SKvU3eKrrFw1sq3UFZQxIuLNYiw6xsGV122nDCi44ROPW4UDoPKOJCc6g2wLBiQYDKiHWlieYLNdJWrlloksy9RIGGc-1Lq3wvOuLeEx6TABEZhJNA9CIJHgcuBYoIjzlLPFy8F\" rel=\"noopener noreferrer\" target=\"_blank\"><br \/>\n<svg fill=\"none\" height=\"14\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2.5\" style=\"margin-right: 8px;\" viewbox=\"0 0 24 24\" width=\"14\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"><\/path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"><\/path><\/svg><br \/>\n<span>Ch\u1ec9nh s\u1eeda PlantUML trong VPasCode<\/span><br \/>\n<\/a>\n<\/div>\n<div class=\"vpascode-code-wrapper\">\n            <div class=\"vpascode-viewer-container vpascode-fancy-active\">\r\n                                <div class=\"vpascode-header\">\r\n                    <span class=\"vpascode-lang-label\">PlantUML<\/span>\r\n                    <a href=\"https:\/\/www.vpascode.com#plantuml:ZPAzJiCm58NtI7c78x60GbyWOkW0WW6wX1TmKZSsJUp8lgbK0GDYO4OC235L7HXOc9E1eOZty9lWP43qPs2xkkVuEqTN7bfYXkgo20EMMZ8i8sG5inOZJN8YCqPIAro70R1dU2OhoHN5ICX8bVVRablBSlvt5_soB5VZ_OCOgTO5PweN2vqVyqBEk9btqapBSHZSXa4OI4NSJ5Z6SL8oMMnNY6oTNl5ihK2qbR71IYwI7QHAQCL7TPboym_Q6k3ePZ3ORhZBj17TaPGc3YDpGT0JhAl0kMjVAv1nxNiD-lvmxLBbCIwDQnOg1udLGY8JjPyZRvEklLUO2YPHklQ5K0dNlFMaKyaqnjxme6ASUKw5hqVNFlMKkdE1Lity4CArpttY4bFNV7hLXpCeuT_UrIYwHc7WhuAkUXWC_UW_p0y0\" \r\n                       target=\"_blank\" \r\n                       rel=\"noopener noreferrer\" \r\n                       class=\"vpascode-fancy-btn\">\r\n                        <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" style=\"margin-right: 8px;\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"><\/path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"><\/path><\/svg>\r\n                        <span>Edit PlantUML in VPasCode<\/span>\r\n                    <\/a>\r\n                <\/div>\r\n                                <div class=\"vpascode-code-wrapper\">\r\n                    <pre class=\"lang-plantuml\" data-nodeid=\"231\"><code class=\"language-plantuml\" data-language=\"plantuml\" class=\"language-plantuml\">@startuml\r\nabstract class Notification {\r\n  #recipient: String\r\n  #message: String\r\n  +abstract send(): boolean\r\n  +logDelivery(): void\r\n}\r\n\r\ninterface EmailNotification {\r\n  +subject: String\r\n  +send(): boolean\r\n}\r\n\r\ninterface SMSNotification {\r\n  +phoneNumber: String\r\n  +send(): boolean\r\n}\r\n\r\nNotification &lt;|-- EmailNotification\r\nNotification &lt;|-- SMSNotification\r\n\r\nnote right of Notification\r\n  L\u1edbp tr\u1eebu t\u01b0\u1ee3ng: Tr\u1ea1ng th\u00e1i chung + tri\u1ec3n khai m\u1ed9t ph\u1ea7n\r\n  Giao di\u1ec7n: H\u1ee3p \u0111\u1ed3ng thu\u1ea7n t\u00fay, h\u1ed7 tr\u1ee3 k\u1ebf th\u1eeba nhi\u1ec1u l\u1edbp\r\nend note\r\n@enduml\r\n<\/code><\/pre>                <\/div>\r\n                <div class=\"vpascode-actions\">\r\n                    <a href=\"https:\/\/www.vpascode.com#plantuml:ZPAzJiCm58NtI7c78x60GbyWOkW0WW6wX1TmKZSsJUp8lgbK0GDYO4OC235L7HXOc9E1eOZty9lWP43qPs2xkkVuEqTN7bfYXkgo20EMMZ8i8sG5inOZJN8YCqPIAro70R1dU2OhoHN5ICX8bVVRablBSlvt5_soB5VZ_OCOgTO5PweN2vqVyqBEk9btqapBSHZSXa4OI4NSJ5Z6SL8oMMnNY6oTNl5ihK2qbR71IYwI7QHAQCL7TPboym_Q6k3ePZ3ORhZBj17TaPGc3YDpGT0JhAl0kMjVAv1nxNiD-lvmxLBbCIwDQnOg1udLGY8JjPyZRvEklLUO2YPHklQ5K0dNlFMaKyaqnjxme6ASUKw5hqVNFlMKkdE1Lity4CArpttY4bFNV7hLXpCeuT_UrIYwHc7WhuAkUXWC_UW_p0y0\" \r\n                       target=\"_blank\" \r\n                       rel=\"noopener noreferrer\" \r\n                       class=\"vpascode-fancy-btn\">\r\n                        <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" style=\"margin-right: 6px;\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"><\/path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"><\/path><\/svg>\r\n                        <span>Edit PlantUML in VPasCode<\/span>\r\n                    <\/a>\r\n                <\/div>\r\n            <\/div>\r\n            \n<\/p><\/div>\n<div class=\"vpascode-actions\">\n<a class=\"vpascode-fancy-btn\" href=\"https:\/\/www.vpascode.com#plantuml:ZPBDIiGm4CVlWRp3W1UbxWiK3olemOEBq2UOfjDs95yaamLHtzsqu69tz-0jpCTl_ZF_xBDWakAiLjXdIMW4ZCMSuH24HpOe73nyQWLmayXmPFBIGYU9_RH67UMC4_sDDITM9Z_SthNGXs09_PgqONeYoqTA7qlg67ZGwbihhTWBfH4DmRD3jfSIcbpwTp8R0St5Z3DMzzfT8SKvU3eKrrFw1sq3UFZQxIuLNYiw6xsGV122nDCi44ROPW4UDoPKOJCc6g2wLBiQYDKiHWlieYLNdJWrlloksy9RIGGc-1Lq3wvOuLeEx6TABEZhJNA9CIJHgcuBYoIjzlLPFy8F\" rel=\"noopener noreferrer\" target=\"_blank\"><br \/>\n<svg fill=\"none\" height=\"14\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2.5\" style=\"margin-right: 6px;\" viewbox=\"0 0 24 24\" width=\"14\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"><\/path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"><\/path><\/svg><br \/>\n<span>Ch\u1ec9nh s\u1eeda PlantUML trong VPasCode<\/span><br \/>\n<\/a>\n<\/div>\n<\/div>\n<hr data-nodeid=\"232\"\/>\n<h2 data-nodeid=\"233\"><strong data-nodeid=\"522\">Nh\u1eefng sai l\u1ea7m ph\u1ed5 bi\u1ebfn v\u00e0 c\u00e1ch tr\u00e1nh ch\u00fang<\/strong><\/h2>\n<table data-nodeid=\"235\">\n<thead data-nodeid=\"236\">\n<tr data-nodeid=\"237\">\n<th data-nodeid=\"239\">Sai l\u1ea7m<\/th>\n<th data-nodeid=\"240\">Tri\u1ec7u ch\u1ee9ng<\/th>\n<th data-nodeid=\"241\">Gi\u1ea3i ph\u00e1p<\/th>\n<\/tr>\n<\/thead>\n<tbody data-nodeid=\"245\">\n<tr data-nodeid=\"246\">\n<td data-nodeid=\"247\"><strong data-nodeid=\"529\">Thi\u1ebft k\u1ebf qu\u00e1 m\u1ee9c<\/strong><\/td>\n<td data-nodeid=\"248\">S\u01a1 \u0111\u1ed3 v\u1edbi h\u01a1n 50 l\u1edbp, kh\u00f3 \u0111\u1ecdc<\/td>\n<td data-nodeid=\"249\">B\u1eaft \u0111\u1ea7u v\u1edbi m\u00f4 h\u00ecnh kh\u00e1i ni\u1ec7m; chia nh\u1ecf th\u00e0nh nhi\u1ec1u s\u01a1 \u0111\u1ed3 theo ng\u1eef c\u1ea3nh gi\u1edbi h\u1ea1n<\/td>\n<\/tr>\n<tr data-nodeid=\"250\">\n<td data-nodeid=\"251\"><strong data-nodeid=\"535\">Nh\u1ea7m l\u1eabn gi\u1eefa t\u00edch h\u1ee3p v\u00e0 k\u1ebft h\u1ee3p<\/strong><\/td>\n<td data-nodeid=\"252\">Qu\u1ea3n l\u00fd v\u00f2ng \u0111\u1eddi \u0111\u1ed1i t\u01b0\u1ee3ng kh\u00f4ng r\u00f5 r\u00e0ng<\/td>\n<td data-nodeid=\"253\">H\u1ecfi: \u201cN\u1ebfu to\u00e0n b\u1ed9 b\u1ecb h\u1ee7y, c\u00e1c ph\u1ea7n c\u00f3 c\u00f2n t\u1ed3n t\u1ea1i kh\u00f4ng?\u201d N\u1ebfu kh\u00f4ng \u2192 s\u1eed d\u1ee5ng k\u1ebft h\u1ee3p (<code data-backticks=\"1\" data-nodeid=\"542\">*--<\/code>)<\/td>\n<\/tr>\n<tr data-nodeid=\"254\">\n<td data-nodeid=\"255\"><strong data-nodeid=\"547\">B\u1ecf qua kh\u1ea3 n\u0103ng \u0111i\u1ec1u h\u01b0\u1edbng<\/strong><\/td>\n<td data-nodeid=\"256\">M\u0169i t\u00ean hai chi\u1ec1u \u1edf kh\u1eafp n\u01a1i<\/td>\n<td data-nodeid=\"257\">Ch\u1ec9 th\u00eam m\u0169i t\u00ean kh\u1ea3 n\u0103ng \u0111i\u1ec1u h\u01b0\u1edbng \u1edf nh\u1eefng n\u01a1i c\u1ea7n duy\u1ec7t trong m\u00e3 ngu\u1ed3n<\/td>\n<\/tr>\n<tr data-nodeid=\"258\">\n<td data-nodeid=\"259\"><strong data-nodeid=\"553\">Tr\u1ed9n l\u1eabn c\u00e1c m\u1ee9c \u0111\u1ed9 tr\u1eebu t\u01b0\u1ee3ng<\/strong><\/td>\n<td data-nodeid=\"260\">DTOs tr\u1ed9n l\u1eabn v\u1edbi c\u00e1c l\u1edbp th\u1ef1c th\u1ec3 trong c\u00f9ng m\u1ed9t s\u01a1 \u0111\u1ed3<\/td>\n<td data-nodeid=\"261\">T\u00e1ch bi\u1ec7t c\u00e1c s\u01a1 \u0111\u1ed3 theo g\u00f3c nh\u00ecn (kh\u00e1i ni\u1ec7m\/thi\u1ebft k\u1ebf\/th\u1ef1c thi)<\/td>\n<\/tr>\n<tr data-nodeid=\"262\">\n<td data-nodeid=\"263\"><strong data-nodeid=\"559\">B\u1ecf qua ki\u1ec3m so\u00e1t phi\u00ean b\u1ea3n<\/strong><\/td>\n<td data-nodeid=\"264\">C\u00e1c s\u01a1 \u0111\u1ed3 tr\u1edf n\u00ean l\u1ed7i th\u1eddi<\/td>\n<td data-nodeid=\"265\">S\u1eed d\u1ee5ng t\u1ec7p v\u0103n b\u1ea3n PlantUML trong Git; t\u1ea1o h\u00ecnh \u1ea3nh trong pipeline CI\/CD<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<hr data-nodeid=\"266\"\/>\n<h2 data-nodeid=\"267\"><strong data-nodeid=\"565\">G\u1ee3i \u00fd c\u00f4ng c\u1ee5: T\u1ea1i sao l\u1ea1i ch\u1ecdn PlantUML?<\/strong><\/h2>\n<p data-nodeid=\"268\">\u0110\u1ed1i v\u1edbi nghi\u00ean c\u1ee9u tr\u01b0\u1eddng h\u1ee3p \u1edf tr\u00ean,<strong data-nodeid=\"595\">PlantUML<\/strong>\u0111\u00e3 \u0111\u01b0\u1ee3c ch\u1ecdn v\u00ec n\u00f3:<br \/>\n\u2705\u00a0<strong data-nodeid=\"596\">D\u1ef1a tr\u00ean v\u0103n b\u1ea3n<\/strong>: S\u01a1 \u0111\u1ed3 l\u00e0 m\u00e3 ngu\u1ed3n\u2014c\u00f3 th\u1ec3 ki\u1ec3m so\u00e1t phi\u00ean b\u1ea3n, so s\u00e1nh s\u1ef1 kh\u00e1c bi\u1ec7t, xem x\u00e9t<br \/>\n\u2705\u00a0<strong data-nodeid=\"597\">Di \u0111\u1ed9ng<\/strong>: T\u1ea1o h\u00ecnh \u1ea3nh c\u1ee5c b\u1ed9 ho\u1eb7c qua d\u1ecbch v\u1ee5 \u0111\u00e1m m\u00e2y; t\u00edch h\u1ee3p v\u1edbi Confluence, GitHub, VS Code<br \/>\n\u2705\u00a0<strong data-nodeid=\"598\">D\u1ec5 b\u1ea3o tr\u00ec<\/strong>: C\u1eadp nh\u1eadt logic s\u01a1 \u0111\u1ed3 m\u00e0 kh\u00f4ng c\u1ea7n v\u1ebd l\u1ea1i c\u00e1c h\u1ed9p<br \/>\n\u2705\u00a0<strong data-nodeid=\"599\">H\u1ee3p t\u00e1c<\/strong>: Nh\u1eefng ng\u01b0\u1eddi kh\u00f4ng ph\u1ea3i nh\u00e0 thi\u1ebft k\u1ebf c\u00f3 th\u1ec3 \u0111\u00f3ng g\u00f3p th\u00f4ng qua c\u00fa ph\u00e1p \u0111\u01a1n gi\u1ea3n<\/p>\n<p data-nodeid=\"269\"><strong data-nodeid=\"603\">Lu\u1ed3ng c\u00f4ng vi\u1ec7c m\u1eabu:<\/strong><\/p>\n<pre class=\"lang-bash\" data-nodeid=\"270\"><code data-language=\"bash\"># 1. Vi\u1ebft s\u01a1 \u0111\u1ed3 d\u01b0\u1edbi d\u1ea1ng v\u0103n b\u1ea3n\r\necho '@startumlnclass User { +name: String }n@enduml' &gt; UserDiagram.puml\r\n\r\n# 2. T\u1ea1o h\u00ecnh \u1ea3nh PNG\/SVG\r\nplantuml -tpng UserDiagram.puml\r\n\r\n# 3. G\u1eedi c\u1ea3 t\u1ec7p .puml v\u00e0 h\u00ecnh \u1ea3nh \u0111\u00e3 t\u1ea1o v\u00e0o Git\r\ngit add UserDiagram.puml UserDiagram.png\r\n<\/code><\/pre>\n<hr data-nodeid=\"271\"\/>\n<h2 data-nodeid=\"272\"><strong data-nodeid=\"607\">K\u1ebft lu\u1eadn<\/strong><\/h2>\n<p data-nodeid=\"273\">S\u01a1 \u0111\u1ed3 l\u1edbp kh\u00f4ng ch\u1ec9 \u0111\u01a1n thu\u1ea7n l\u00e0 b\u00e0i t\u1eadp h\u1ecdc thu\u1eadt\u2014ch\u00fang l\u00e0 nh\u1eefng t\u00e1c ph\u1ea9m s\u1ed1ng \u0111\u1ed9ng th\u00fac \u0111\u1ea9y s\u1ef1 th\u1ed1ng nh\u1ea5t, gi\u1ea3m n\u1ee3 k\u1ef9 thu\u1eadt v\u00e0 \u0111\u1ea9y nhanh qu\u00e1 tr\u00ecnh l\u00e0m quen v\u1edbi h\u1ec7 th\u1ed1ng trong su\u1ed1t v\u00f2ng \u0111\u1eddi ph\u00e1t tri\u1ec3n ph\u1ea7n m\u1ec1m. Nh\u01b0 \u0111\u00e3 minh ch\u1ee9ng trong nghi\u00ean c\u1ee9u tr\u01b0\u1eddng h\u1ee3p th\u01b0\u01a1ng m\u1ea1i \u0111i\u1ec7n t\u1eed c\u1ee7a ch\u00fang t\u00f4i, s\u1ee9c m\u1ea1nh th\u1ef1c s\u1ef1 c\u1ee7a s\u01a1 \u0111\u1ed3 l\u1edbp th\u1ec3 hi\u1ec7n r\u00f5 khi ch\u00fang ph\u00e1t tri\u1ec3n qua ba g\u00f3c nh\u00ecn then ch\u1ed1t:<\/p>\n<p data-nodeid=\"274\">\ud83d\udd39\u00a0<strong data-nodeid=\"626\">Kh\u00e1i ni\u1ec7m<\/strong>: \u0110\u1eb7t c\u00e1c b\u00ean li\u00ean quan v\u00e0o n\u1ec1n t\u1ea3ng hi\u1ec3u bi\u1ebft chung v\u1ec1 l\u0129nh v\u1ef1c<br \/>\n\ud83d\udd39\u00a0<strong data-nodeid=\"627\">Chu\u1ea9n h\u00f3a<\/strong>: X\u00e1c \u0111\u1ecbnh c\u00e1c giao di\u1ec7n s\u1ea1ch cho ki\u1ebfn tr\u00fac theo m\u00f4-\u0111un<br \/>\n\ud83d\udd39\u00a0<strong data-nodeid=\"628\">Tri\u1ec3n khai<\/strong>: H\u01b0\u1edbng d\u1eabn c\u00e1c nh\u00e0 ph\u00e1t tri\u1ec3n b\u1eb1ng nh\u1eefng b\u1ea3n v\u1ebd chi ti\u1ebft, c\u00f3 \u00fd th\u1ee9c v\u1ec1 c\u00f4ng ngh\u1ec7<\/p>\n<p data-nodeid=\"275\">B\u1eb1ng c\u00e1ch \u00e1p d\u1ee5ng\u00a0<strong data-nodeid=\"638\">PlantUML<\/strong>\u0110\u1ec3 th\u1ef1c hi\u1ec7n c\u00e1c ph\u01b0\u01a1ng ph\u00e1p v\u1ebd s\u01a1 \u0111\u1ed3 d\u01b0\u1edbi d\u1ea1ng m\u00e3, c\u00e1c \u0111\u1ed9i ng\u0169 s\u1ebd c\u00f3 \u0111\u01b0\u1ee3c s\u1ef1 linh ho\u1ea1t \u0111\u1ec3 l\u1eb7p l\u1ea1i thi\u1ebft k\u1ebf song song v\u1edbi m\u00e3 ngu\u1ed3n, \u0111\u1ea3m b\u1ea3o t\u00e0i li\u1ec7u lu\u00f4n \u0111i k\u1ecbp v\u1edbi vi\u1ec7c tri\u1ec3n khai. H\u00e3y nh\u1edb: s\u01a1 \u0111\u1ed3 l\u1edbp t\u1ed1t nh\u1ea5t kh\u00f4ng ph\u1ea3i l\u00e0 s\u01a1 \u0111\u1ed3 chi ti\u1ebft nh\u1ea5t\u2014m\u00e0 l\u00e0 s\u01a1 \u0111\u1ed3 tr\u1ea3 l\u1eddi \u0111\u00fang c\u00e2u h\u1ecfi cho \u0111\u1ed1i t\u01b0\u1ee3ng m\u1ee5c ti\u00eau v\u00e0o \u0111\u00fang th\u1eddi \u0111i\u1ec3m.<\/p>\n<p data-nodeid=\"276\"><strong data-nodeid=\"643\">B\u00e0i h\u1ecdc cu\u1ed1i c\u00f9ng<\/strong>: B\u1eaft \u0111\u1ea7u \u0111\u01a1n gi\u1ea3n, x\u00e1c nh\u1eadn v\u1edbi c\u00e1c b\u00ean li\u00ean quan, tinh ch\u1ec9nh t\u1eebng b\u01b0\u1edbc v\u00e0 lu\u00f4n li\u00ean k\u1ebft c\u00e1c th\u00e0nh ph\u1ea7n s\u01a1 \u0111\u1ed3 v\u1edbi gi\u00e1 tr\u1ecb kinh doanh c\u1ee5 th\u1ec3. Khi s\u01a1 \u0111\u1ed3 l\u1edbp tr\u1edf th\u00e0nh c\u00f4ng c\u1ee5 h\u1ee3p t\u00e1c thay v\u00ec s\u1ea3n ph\u1ea9m giao n\u1ed9p, ch\u00fang s\u1ebd chuy\u1ec3n h\u00f3a t\u1eeb chi ph\u00ed overhead th\u00e0nh ch\u1ea5t x\u00fac t\u00e1c cho ph\u1ea7n m\u1ec1m t\u1ed1t h\u01a1n.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Gi\u1edbi thi\u1ec7u Trong b\u1ed1i c\u1ea3nh ph\u00e1t tri\u1ec3n ph\u1ea7n m\u1ec1m ph\u1ee9c t\u1ea1p ng\u00e0y nay, giao ti\u1ebfp r\u00f5 r\u00e0ng v\u00e0 m\u00f4 h\u00ecnh h\u00f3a h\u1ec7 th\u1ed1ng ch\u00ednh x\u00e1c l\u00e0 y\u1ebfu t\u1ed1 then ch\u1ed1t cho th\u00e0nh c\u00f4ng d\u1ef1 \u00e1n. Trong s\u1ed1 nh\u1eefng c\u00f4ng c\u1ee5 m\u1ea1nh m\u1ebd nh\u1ea5t trong b\u1ed9 c\u00f4ng c\u1ee5 c\u1ee7a m\u1ed9t ki\u1ebfn tr\u00fac s\u01b0 ph\u1ea7n m\u1ec1m l\u00e0\u00a0S\u01a1 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_lmt_disableupdate":"","_lmt_disable":"","footnotes":""},"categories":[65,36],"tags":[],"class_list":["post-11687","post","type-post","status-publish","format-standard","hentry","category-ai","category-uml","loop-entry","clr"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v24.3 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Th\u00e0nh th\u1ea1o c\u00e1c s\u01a1 \u0111\u1ed3 l\u1edbp UML: M\u1ed9t nghi\u00ean c\u1ee9u th\u1ef1c t\u1ebf v\u1ec1 thi\u1ebft k\u1ebf h\u1ec7 th\u1ed1ng v\u1edbi PlantUML - Visual Paradigm Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blog.visual-paradigm.com\/vn\/mastering-uml-class-diagrams-a-practical-case-study-in-system-design-with-plantuml\/\" \/>\n<meta property=\"og:locale\" content=\"vi_VN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Th\u00e0nh th\u1ea1o c\u00e1c s\u01a1 \u0111\u1ed3 l\u1edbp UML: M\u1ed9t nghi\u00ean c\u1ee9u th\u1ef1c t\u1ebf v\u1ec1 thi\u1ebft k\u1ebf h\u1ec7 th\u1ed1ng v\u1edbi PlantUML - Visual Paradigm Blog\" \/>\n<meta property=\"og:description\" content=\"Gi\u1edbi thi\u1ec7u Trong b\u1ed1i c\u1ea3nh ph\u00e1t tri\u1ec3n ph\u1ea7n m\u1ec1m ph\u1ee9c t\u1ea1p ng\u00e0y nay, giao ti\u1ebfp r\u00f5 r\u00e0ng v\u00e0 m\u00f4 h\u00ecnh h\u00f3a h\u1ec7 th\u1ed1ng ch\u00ednh x\u00e1c l\u00e0 y\u1ebfu t\u1ed1 then ch\u1ed1t cho th\u00e0nh c\u00f4ng d\u1ef1 \u00e1n. Trong s\u1ed1 nh\u1eefng c\u00f4ng c\u1ee5 m\u1ea1nh m\u1ebd nh\u1ea5t trong b\u1ed9 c\u00f4ng c\u1ee5 c\u1ee7a m\u1ed9t ki\u1ebfn tr\u00fac s\u01b0 ph\u1ea7n m\u1ec1m l\u00e0\u00a0S\u01a1 [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blog.visual-paradigm.com\/vn\/mastering-uml-class-diagrams-a-practical-case-study-in-system-design-with-plantuml\/\" \/>\n<meta property=\"og:site_name\" content=\"Visual Paradigm Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-05-21T07:55:49+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-05-30T08:12:06+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/05\/img_6a0eb9275d5e8.png\" \/>\n<meta name=\"author\" content=\"Admin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u0110\u01b0\u1ee3c vi\u1ebft b\u1edfi\" \/>\n\t<meta name=\"twitter:data1\" content=\"Admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u01af\u1edbc t\u00ednh th\u1eddi gian \u0111\u1ecdc\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 ph\u00fat\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/blog.visual-paradigm.com\/vn\/mastering-uml-class-diagrams-a-practical-case-study-in-system-design-with-plantuml\/\",\"url\":\"https:\/\/blog.visual-paradigm.com\/vn\/mastering-uml-class-diagrams-a-practical-case-study-in-system-design-with-plantuml\/\",\"name\":\"Th\u00e0nh th\u1ea1o c\u00e1c s\u01a1 \u0111\u1ed3 l\u1edbp UML: M\u1ed9t nghi\u00ean c\u1ee9u th\u1ef1c t\u1ebf v\u1ec1 thi\u1ebft k\u1ebf h\u1ec7 th\u1ed1ng v\u1edbi PlantUML - Visual Paradigm Blog\",\"isPartOf\":{\"@id\":\"https:\/\/blog.visual-paradigm.com\/vn\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/blog.visual-paradigm.com\/vn\/mastering-uml-class-diagrams-a-practical-case-study-in-system-design-with-plantuml\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/blog.visual-paradigm.com\/vn\/mastering-uml-class-diagrams-a-practical-case-study-in-system-design-with-plantuml\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/05\/img_6a0eb9275d5e8.png\",\"datePublished\":\"2026-05-21T07:55:49+00:00\",\"dateModified\":\"2026-05-30T08:12:06+00:00\",\"author\":{\"@id\":\"https:\/\/blog.visual-paradigm.com\/vn\/#\/schema\/person\/a649c442f11a53040710ddec750926c6\"},\"breadcrumb\":{\"@id\":\"https:\/\/blog.visual-paradigm.com\/vn\/mastering-uml-class-diagrams-a-practical-case-study-in-system-design-with-plantuml\/#breadcrumb\"},\"inLanguage\":\"vi\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/blog.visual-paradigm.com\/vn\/mastering-uml-class-diagrams-a-practical-case-study-in-system-design-with-plantuml\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"vi\",\"@id\":\"https:\/\/blog.visual-paradigm.com\/vn\/mastering-uml-class-diagrams-a-practical-case-study-in-system-design-with-plantuml\/#primaryimage\",\"url\":\"https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/05\/img_6a0eb9275d5e8.png\",\"contentUrl\":\"https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/05\/img_6a0eb9275d5e8.png\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/blog.visual-paradigm.com\/vn\/mastering-uml-class-diagrams-a-practical-case-study-in-system-design-with-plantuml\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/blog.visual-paradigm.com\/vn\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Th\u00e0nh th\u1ea1o c\u00e1c s\u01a1 \u0111\u1ed3 l\u1edbp UML: M\u1ed9t nghi\u00ean c\u1ee9u th\u1ef1c t\u1ebf v\u1ec1 thi\u1ebft k\u1ebf h\u1ec7 th\u1ed1ng v\u1edbi PlantUML\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/blog.visual-paradigm.com\/vn\/#website\",\"url\":\"https:\/\/blog.visual-paradigm.com\/vn\/\",\"name\":\"Visual Paradigm Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/blog.visual-paradigm.com\/vn\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"vi\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/blog.visual-paradigm.com\/vn\/#\/schema\/person\/a649c442f11a53040710ddec750926c6\",\"name\":\"Admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"vi\",\"@id\":\"https:\/\/blog.visual-paradigm.com\/vn\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/6b756c36f5e9132f6067fb4d22bef2e3?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/6b756c36f5e9132f6067fb4d22bef2e3?s=96&d=mm&r=g\",\"caption\":\"Admin\"},\"url\":\"https:\/\/blog.visual-paradigm.com\/vn\/author\/vpadminuser\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Th\u00e0nh th\u1ea1o c\u00e1c s\u01a1 \u0111\u1ed3 l\u1edbp UML: M\u1ed9t nghi\u00ean c\u1ee9u th\u1ef1c t\u1ebf v\u1ec1 thi\u1ebft k\u1ebf h\u1ec7 th\u1ed1ng v\u1edbi PlantUML - Visual Paradigm Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blog.visual-paradigm.com\/vn\/mastering-uml-class-diagrams-a-practical-case-study-in-system-design-with-plantuml\/","og_locale":"vi_VN","og_type":"article","og_title":"Th\u00e0nh th\u1ea1o c\u00e1c s\u01a1 \u0111\u1ed3 l\u1edbp UML: M\u1ed9t nghi\u00ean c\u1ee9u th\u1ef1c t\u1ebf v\u1ec1 thi\u1ebft k\u1ebf h\u1ec7 th\u1ed1ng v\u1edbi PlantUML - Visual Paradigm Blog","og_description":"Gi\u1edbi thi\u1ec7u Trong b\u1ed1i c\u1ea3nh ph\u00e1t tri\u1ec3n ph\u1ea7n m\u1ec1m ph\u1ee9c t\u1ea1p ng\u00e0y nay, giao ti\u1ebfp r\u00f5 r\u00e0ng v\u00e0 m\u00f4 h\u00ecnh h\u00f3a h\u1ec7 th\u1ed1ng ch\u00ednh x\u00e1c l\u00e0 y\u1ebfu t\u1ed1 then ch\u1ed1t cho th\u00e0nh c\u00f4ng d\u1ef1 \u00e1n. Trong s\u1ed1 nh\u1eefng c\u00f4ng c\u1ee5 m\u1ea1nh m\u1ebd nh\u1ea5t trong b\u1ed9 c\u00f4ng c\u1ee5 c\u1ee7a m\u1ed9t ki\u1ebfn tr\u00fac s\u01b0 ph\u1ea7n m\u1ec1m l\u00e0\u00a0S\u01a1 [&hellip;]","og_url":"https:\/\/blog.visual-paradigm.com\/vn\/mastering-uml-class-diagrams-a-practical-case-study-in-system-design-with-plantuml\/","og_site_name":"Visual Paradigm Blog","article_published_time":"2026-05-21T07:55:49+00:00","article_modified_time":"2026-05-30T08:12:06+00:00","og_image":[{"url":"https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/05\/img_6a0eb9275d5e8.png","type":"","width":"","height":""}],"author":"Admin","twitter_card":"summary_large_image","twitter_misc":{"\u0110\u01b0\u1ee3c vi\u1ebft b\u1edfi":"Admin","\u01af\u1edbc t\u00ednh th\u1eddi gian \u0111\u1ecdc":"5 ph\u00fat"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/blog.visual-paradigm.com\/vn\/mastering-uml-class-diagrams-a-practical-case-study-in-system-design-with-plantuml\/","url":"https:\/\/blog.visual-paradigm.com\/vn\/mastering-uml-class-diagrams-a-practical-case-study-in-system-design-with-plantuml\/","name":"Th\u00e0nh th\u1ea1o c\u00e1c s\u01a1 \u0111\u1ed3 l\u1edbp UML: M\u1ed9t nghi\u00ean c\u1ee9u th\u1ef1c t\u1ebf v\u1ec1 thi\u1ebft k\u1ebf h\u1ec7 th\u1ed1ng v\u1edbi PlantUML - Visual Paradigm Blog","isPartOf":{"@id":"https:\/\/blog.visual-paradigm.com\/vn\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blog.visual-paradigm.com\/vn\/mastering-uml-class-diagrams-a-practical-case-study-in-system-design-with-plantuml\/#primaryimage"},"image":{"@id":"https:\/\/blog.visual-paradigm.com\/vn\/mastering-uml-class-diagrams-a-practical-case-study-in-system-design-with-plantuml\/#primaryimage"},"thumbnailUrl":"https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/05\/img_6a0eb9275d5e8.png","datePublished":"2026-05-21T07:55:49+00:00","dateModified":"2026-05-30T08:12:06+00:00","author":{"@id":"https:\/\/blog.visual-paradigm.com\/vn\/#\/schema\/person\/a649c442f11a53040710ddec750926c6"},"breadcrumb":{"@id":"https:\/\/blog.visual-paradigm.com\/vn\/mastering-uml-class-diagrams-a-practical-case-study-in-system-design-with-plantuml\/#breadcrumb"},"inLanguage":"vi","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blog.visual-paradigm.com\/vn\/mastering-uml-class-diagrams-a-practical-case-study-in-system-design-with-plantuml\/"]}]},{"@type":"ImageObject","inLanguage":"vi","@id":"https:\/\/blog.visual-paradigm.com\/vn\/mastering-uml-class-diagrams-a-practical-case-study-in-system-design-with-plantuml\/#primaryimage","url":"https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/05\/img_6a0eb9275d5e8.png","contentUrl":"https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/05\/img_6a0eb9275d5e8.png"},{"@type":"BreadcrumbList","@id":"https:\/\/blog.visual-paradigm.com\/vn\/mastering-uml-class-diagrams-a-practical-case-study-in-system-design-with-plantuml\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/blog.visual-paradigm.com\/vn\/"},{"@type":"ListItem","position":2,"name":"Th\u00e0nh th\u1ea1o c\u00e1c s\u01a1 \u0111\u1ed3 l\u1edbp UML: M\u1ed9t nghi\u00ean c\u1ee9u th\u1ef1c t\u1ebf v\u1ec1 thi\u1ebft k\u1ebf h\u1ec7 th\u1ed1ng v\u1edbi PlantUML"}]},{"@type":"WebSite","@id":"https:\/\/blog.visual-paradigm.com\/vn\/#website","url":"https:\/\/blog.visual-paradigm.com\/vn\/","name":"Visual Paradigm Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blog.visual-paradigm.com\/vn\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"vi"},{"@type":"Person","@id":"https:\/\/blog.visual-paradigm.com\/vn\/#\/schema\/person\/a649c442f11a53040710ddec750926c6","name":"Admin","image":{"@type":"ImageObject","inLanguage":"vi","@id":"https:\/\/blog.visual-paradigm.com\/vn\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/6b756c36f5e9132f6067fb4d22bef2e3?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/6b756c36f5e9132f6067fb4d22bef2e3?s=96&d=mm&r=g","caption":"Admin"},"url":"https:\/\/blog.visual-paradigm.com\/vn\/author\/vpadminuser\/"}]}},"modified_by":"Admin","_links":{"self":[{"href":"https:\/\/blog.visual-paradigm.com\/vn\/wp-json\/wp\/v2\/posts\/11687","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.visual-paradigm.com\/vn\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.visual-paradigm.com\/vn\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.visual-paradigm.com\/vn\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.visual-paradigm.com\/vn\/wp-json\/wp\/v2\/comments?post=11687"}],"version-history":[{"count":0,"href":"https:\/\/blog.visual-paradigm.com\/vn\/wp-json\/wp\/v2\/posts\/11687\/revisions"}],"wp:attachment":[{"href":"https:\/\/blog.visual-paradigm.com\/vn\/wp-json\/wp\/v2\/media?parent=11687"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.visual-paradigm.com\/vn\/wp-json\/wp\/v2\/categories?post=11687"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.visual-paradigm.com\/vn\/wp-json\/wp\/v2\/tags?post=11687"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}