# zyf-cms **Repository Path**: zyf_0909/zyf-cms ## Basic Information - **Project Name**: zyf-cms - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-06-06 - **Last Updated**: 2026-06-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # ๐Ÿ˜๏ธ zyfCMS โ€” ็คพๅŒบๅ†…ๅฎน็ฎก็†็ณป็ปŸ > **Spring Boot 3 + Vue 3 + MyBatis Plus ๅ…จๆ ˆ้กน็›ฎ | ๆจกๅ—ๅŒ–ๅ•ไฝ“ๆžถๆž„** --- ## ไธ€ใ€้กน็›ฎ็ฎ€ไป‹ zyfCMS ๆ˜ฏไธ€ไธช้ขๅ‘ๆŠ€ๆœฏ็คพๅŒบ็š„**ๅ†…ๅฎน็ฎก็†็ณป็ปŸ**๏ผŒๆ”ฏๆŒ Markdown ๆ–‡็ซ ๅ‘ๅธƒใ€็›–ๆฅผ่ฏ„่ฎบใ€็‚น่ตžๆ”ถ่—ใ€็”จๆˆทๅ…ณๆณจใ€ๅ…จๆ–‡ๆฃ€็ดขใ€AI ่พ…ๅŠฉๅˆ›ไฝœ็ญ‰ๆ ธๅฟƒๅŠŸ่ƒฝใ€‚้กน็›ฎ้‡‡็”จ**ๆจกๅ—ๅŒ–ๅ•ไฝ“ๆžถๆž„**๏ผŒๆจกๅ—้—ด้€š่ฟ‡ๆŽฅๅฃ่ฐƒ็”จใ€‚ | ็ปดๅบฆ | ่ฏดๆ˜Ž | |------|------| | **ๆžถๆž„้ฃŽๆ ผ** | ๆจกๅ—ๅŒ–ๅ•ไฝ“๏ผˆModular Monolith๏ผ‰ | | **้€‚็”จๅœบๆ™ฏ** | ๆŠ€ๆœฏๅšๅฎข็คพๅŒบ / ไผไธšๅ†…้ƒจ็Ÿฅ่ฏ†ๅบ“ / ๅž‚็›ด้ข†ๅŸŸ่ฎบๅ› | | **ๅŽ็ซฏ** | Spring Boot 3.2.6 + MyBatis Plus 3.5.7 + Spring Security 6.x + JWT | | **ๅ‰็ซฏ** | Vue 3.4 + Vite 5 + Pinia 2 + Element Plus 2.7 + TypeScript 5 | | **ๆ•ฐๆฎๅบ“** | MySQL 8.0 + Flyway ็‰ˆๆœฌ่ฟ็งป | | **็ผ“ๅญ˜** | Redis 7.x | | **้ƒจ็ฝฒ** | Docker Compose ไธ€้”ฎ้ƒจ็ฝฒ๏ผˆMySQL + Redis + Backend + Nginx๏ผ‰ | --- ## ไบŒใ€้กน็›ฎๆผ”็คบ ### 2.1 ๆ–‡็ซ ๅˆ—่กจ ![](./images/home.png) ### 2.2 ๆ–‡็ซ ็‚น่ตž่ฏ„่ฎบ ![](./images/comment.png) ### 2.3 ๆถˆๆฏ้€š็Ÿฅ ![](./images/notification.png) ### 2.4 ็ฎก็†ๅ‘˜็ณป็ปŸโ€”โ€”ๆ•ฐๆฎๅฏ่ง†ๅŒ– ![](./images/echarts_1.png) ![](./images/echarts_2.png) ### 2.5 ไธชไบบไธญๅฟƒ ![](./images/user_center.png) ## ไธ‰ใ€้กน็›ฎๆžถๆž„ ### 3.1 ็ณป็ปŸๆžถๆž„ ``` โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ Vue 3 ๅ‰็ซฏ (zyf-cms-web) โ”‚ โ”‚ Nginx๏ผˆๅๅ‘ไปฃ็† + ้™ๆ€่ต„ๆบ + SPA๏ผ‰ โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ Controller ๅฑ‚๏ผˆREST API๏ผ‰ โ”‚ โ”‚ ๅ‚ๆ•ฐๆ ก้ชŒ๏ผˆJakarta Validation๏ผ‰+ ๆƒ้™ๆณจ่งฃ โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ Service ๅฑ‚๏ผˆไธšๅŠก้€ป่พ‘๏ผ‰ โ”‚ โ”‚ ไบ‹ๅŠก็ฎก็†๏ผˆ@Transactional๏ผ‰+ ็ผ“ๅญ˜็ญ–็•ฅ + AI ่ฐƒ็”จ โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ MyBatis Plus (ORM) โ”‚ Redis๏ผˆ็ผ“ๅญ˜ / ๆต่งˆ้‡่ฎกๆ•ฐ๏ผ‰ โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ MySQL 8.0๏ผˆไธปๆ•ฐๆฎๅบ“ + Flyway ่ฟ็งป๏ผ‰ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ ``` ### 3.2 ไธšๅŠกๆžถๆž„ ``` โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ zyfCMS ไธšๅŠกๆจกๅ— โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ ็”จๆˆท็ณป็ปŸ โ”‚ ๅ†…ๅฎน็ฎก็† โ”‚ ็คพไบคไบ’ๅŠจ โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ ยท ๆณจๅ†Œ/็™ปๅฝ• โ”‚ ยท Markdown โ”‚ ยท ็›–ๆฅผ่ฏ„่ฎบ๏ผˆpath ่ทฏๅพ„ๆ ‘๏ผ‰โ”‚ โ”‚ ยท JWT ๅŒTokenโ”‚ ็ผ–่พ‘ๅ™จ โ”‚ ยท ็‚น่ตž/ๅ–ๆถˆ๏ผˆๅน‚็ญ‰่ฎพ่ฎก๏ผ‰ โ”‚ โ”‚ ยท ไธชไบบไฟกๆฏ โ”‚ ยท ่‰็จฟ/ๅ‘ๅธƒ โ”‚ ยท ๆ”ถ่—ๅคน โ”‚ โ”‚ ยท ๅคดๅƒไธŠไผ  โ”‚ ยท ๆ ‡็ญพๅˆ†็ฑป โ”‚ ยท ๅ…ณๆณจ/ๅ–ๅ…ณ โ”‚ โ”‚ ยท BCrypt ๅŠ ๅฏ† โ”‚ ยท ๅ…จๆ–‡ๆœ็ดข โ”‚ ยท ๆถˆๆฏ้€š็Ÿฅ โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ ็ฎก็†ๅ‘˜็ณป็ปŸ โ”‚ AI ่พ…ๅŠฉ โ”‚ โ”‚ ยท ไปช่กจ็›˜็ปŸ่ฎก๏ผˆECharts๏ผ‰ โ”‚ ยท ็ปญๅ†™/ๆถฆ่‰ฒ/ๆ‘˜่ฆ/ๆ ‡้ข˜ โ”‚ โ”‚ ยท ็”จๆˆท็ฎก็†๏ผˆๅฐ็ฆ/่งฃ็ฆ๏ผ‰ โ”‚ ยท SSE ๆตๅผๆŽจ้€ โ”‚ โ”‚ ยท ๆ–‡็ซ ็ฎก็†๏ผˆ็ฎก็†ๅ‘˜ๅˆ ้™ค๏ผ‰ โ”‚ ยท DeepSeek API ้›†ๆˆ โ”‚ โ”‚ ยท ๆ“ไฝœๆ—ฅๅฟ— โ”‚ โ”‚ โ”‚ ยท PV/UV ่ฎฟ้—ฎ็ปŸ่ฎก โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ ``` --- ## ๅ››ใ€็›ฎๅฝ•็ป“ๆž„ ``` zyf-cms/ โ”œโ”€โ”€ README.md โ”œโ”€โ”€ CLAUDE.md # AI ๅไฝœ่ง„่Œƒ โ”‚ โ”œโ”€โ”€ docker/ # Docker ้ƒจ็ฝฒ โ”‚ โ”œโ”€โ”€ docker-compose.yml # 4 ๆœๅŠก็ผ–ๆŽ’๏ผˆMySQL/Redis/Backend/Nginx๏ผ‰ โ”‚ โ”œโ”€โ”€ .env.example โ”‚ โ”œโ”€โ”€ backend/Dockerfile # ๅŽ็ซฏๅคš้˜ถๆฎตๆž„ๅปบ๏ผˆMaven โ†’ JRE 21๏ผ‰ โ”‚ โ””โ”€โ”€ frontend/ โ”‚ โ”œโ”€โ”€ Dockerfile # ๅ‰็ซฏๅคš้˜ถๆฎตๆž„ๅปบ๏ผˆNode โ†’ Nginx๏ผ‰ โ”‚ โ””โ”€โ”€ default.conf # Nginx ้…็ฝฎ๏ผˆๅๅ‘ไปฃ็† + SPA๏ผ‰ โ”‚ โ”œโ”€โ”€ zyf-cms-server/ # Maven ๆ นๅทฅ็จ‹ โ”‚ โ”œโ”€โ”€ pom.xml # ๆ น POM๏ผˆไพ่ต–็ฎก็†ไธŽ็‰ˆๆœฌๆŽงๅˆถ๏ผ‰ โ”‚ โ”œโ”€โ”€ zyf-common/ # ๅ…ฌๅ…ฑๆจกๅ—๏ผˆๆ— ๆ•ฐๆฎๅบ“ไพ่ต–๏ผ‰ โ”‚ โ”‚ โ””โ”€โ”€ src/.../common/ โ”‚ โ”‚ โ”œโ”€โ”€ constant/ Constants.java โ”‚ โ”‚ โ”œโ”€โ”€ exception/ BusinessException + GlobalExceptionHandler โ”‚ โ”‚ โ”œโ”€โ”€ result/ R.java # ็ปŸไธ€ๅ“ๅบ”ไฝ“ โ”‚ โ”‚ โ””โ”€โ”€ enums/ ArticleStatusEnum โ”‚ โ””โ”€โ”€ zyf-api/ # ไธปๅบ”็”จ๏ผˆๅ…จ้ƒจไธšๅŠก+้…็ฝฎ๏ผ‰ โ”‚ โ””โ”€โ”€ src/main/ โ”‚ โ”œโ”€โ”€ java/com/zyf/ โ”‚ โ”‚ โ”œโ”€โ”€ ZyfCmsApplication.java โ”‚ โ”‚ โ”œโ”€โ”€ config/ # Security / JWT / MyBatisPlus / Redis / Knife4j โ”‚ โ”‚ โ”œโ”€โ”€ controller/ # system/ article/ comment/ search/ + UploadController โ”‚ โ”‚ โ”œโ”€โ”€ entity/ # system/ article/ comment/ โ”‚ โ”‚ โ”œโ”€โ”€ mapper/ # system/ article/ comment/ โ”‚ โ”‚ โ”œโ”€โ”€ service/ # system/ article/ comment/ search/ ai/ + impl/ โ”‚ โ”‚ โ””โ”€โ”€ dto/ # system/ article/ comment/ (DTO + VO) โ”‚ โ””โ”€โ”€ resources/ โ”‚ โ”œโ”€โ”€ application.yml # ๅ…ฌๅ…ฑ้…็ฝฎ โ”‚ โ”œโ”€โ”€ application-dev.yml # ๅผ€ๅ‘็Žฏๅขƒ โ”‚ โ”œโ”€โ”€ application-prod.yml # ็”Ÿไบง็Žฏๅขƒ๏ผˆ็Žฏๅขƒๅ˜้‡ๅ ไฝ็ฌฆ๏ผ‰ โ”‚ โ””โ”€โ”€ db/migration/ # Flyway ่ฟ็งป๏ผˆV1~V3๏ผ‰ โ”‚ โ””โ”€โ”€ zyf-cms-web/ # Vue 3 ๅ‰็ซฏ โ”œโ”€โ”€ vite.config.ts # ๆž„ๅปบ้…็ฝฎ + /api ไปฃ็† โ””โ”€โ”€ src/ โ”œโ”€โ”€ main.ts # ๅ…ฅๅฃ๏ผˆๆณจๅ†Œ v-md-editor ็ญ‰ๆ’ไปถ๏ผ‰ โ”œโ”€โ”€ api/ request.ts, auth.ts, article.ts, comment.ts, user.ts ... โ”œโ”€โ”€ store/ user.ts # Pinia ็Šถๆ€็ฎก็†๏ผˆtoken ๆŒไน…ๅŒ–๏ผ‰ โ”œโ”€โ”€ router/ index.ts # ๆ‡’ๅŠ ่ฝฝ่ทฏ็”ฑ + beforeEach ้‰ดๆƒๅฎˆๅซ โ”œโ”€โ”€ views/ โ”‚ โ”œโ”€โ”€ Layout.vue # ไธปๅธƒๅฑ€ โ”‚ โ”œโ”€โ”€ auth/ Login.vue โ”‚ โ”œโ”€โ”€ admin/ Dashboard / ArticleManagement / UserManagement โ”‚ โ”œโ”€โ”€ article/ ArticleList / ArticleEditor / ArticleDetail / SearchResult โ”‚ โ”œโ”€โ”€ notification/ NotificationList โ”‚ โ””โ”€โ”€ user/ UserCenter / Profile โ””โ”€โ”€ components/ CommentTree.vue # ้€’ๅฝ’่ฏ„่ฎบๆ ‘็ป„ไปถ ``` --- ## ไบ”ใ€ๆŠ€ๆœฏ้€‰ๅž‹ | ๅฑ‚็บง | ๆŠ€ๆœฏ | ็‰ˆๆœฌ | ่ฏดๆ˜Ž | |------|------|------|------| | **ๆก†ๆžถ** | Spring Boot | 3.2.6 | ๅŸบ็ก€ๆก†ๆžถ๏ผŒJava 17 ็ผ–่ฏ‘ | | **ORM** | MyBatis Plus | 3.5.7 | Lambda ๆกไปถๆž„้€ ใ€ๅˆ†้กตๆ’ไปถใ€่‡ชๅŠจๅกซๅ……ใ€้€ป่พ‘ๅˆ ้™ค | | **ๅฎ‰ๅ…จ** | Spring Security + jjwt | 6.x / 0.12.6 | ๆ— ็Šถๆ€ JWT ่ฎค่ฏ๏ผˆAccess + Refresh ๅŒ Token๏ผ‰ | | **ๆ•ฐๆฎๅบ“** | MySQL | 8.0 | InnoDB๏ผŒutf8mb4๏ผŒๅซ FULLTEXT ๅ…จๆ–‡็ดขๅผ• | | **่ฟ็งป** | Flyway | 10.x | ่‡ชๅŠจ็‰ˆๆœฌ็ฎก็†๏ผŒ3 ไธช่ฟ็งปๆ–‡ไปถ | | **็ผ“ๅญ˜** | Redis | 7.x | ๆต่งˆ้‡่ฎกๆ•ฐ | | **API ๆ–‡ๆกฃ** | Knife4j๏ผˆOpenAPI 3๏ผ‰ | 4.5.0 | ่‡ชๅŠจ็”Ÿๆˆ + ๅœจ็บฟ่ฐƒ่ฏ• | | **ๅทฅๅ…ทๅบ“** | Lombok + Hutool + MapStruct | โ€” | ไปฃ็ ็ฎ€ๅŒ– + ๅทฅๅ…ท้›† + ๅฏน่ฑกๆ˜ ๅฐ„ | | **AI ้›†ๆˆ** | DeepSeek API๏ผˆSSE ๆตๅผ๏ผ‰ | โ€” | JDK HttpClient ่ฐƒ็”จ๏ผŒๅผ‚ๆญฅๆตๅผๆŽจ้€ | | **ๅ‰็ซฏ** | Vue 3 + Vite 5 + Pinia 2 | 3.4 / 5.x / 2.x | Composition API + TypeScript | | **UI** | Element Plus | 2.7.x | ็ป„ไปถๅบ“ | | **ๅ›พ่กจ** | ECharts | 5.x | ็ฎก็†ๅŽๅฐ็ปŸ่ฎกๅ›พ่กจ | | **้ƒจ็ฝฒ** | Docker Compose | 3.9 | MySQL + Redis + Backend + Nginx ๅ››ๆœๅŠก็ผ–ๆŽ’ | --- ## ๅ…ญใ€้ƒจ็ฝฒๆต็จ‹ ### ๆ–นๅผไธ€๏ผšDocker Compose ไธ€้”ฎ้ƒจ็ฝฒ๏ผˆๆŽจ่๏ผ‰ ```bash cd docker cp .env.example .env # ๆŒ‰้œ€ไฟฎๆ”น JWT_SECRET ็ญ‰้…็ฝฎ docker-compose up -d --build # ๆž„ๅปบๅนถๅฏๅŠจๅ…จ้ƒจๆœๅŠก ``` ๅฏๅŠจๅŽ่ฎฟ้—ฎ๏ผš | ๆœๅŠก | ๅœฐๅ€ | |------|------| | ๅ‰็ซฏ้กต้ข | http://localhost | | API ๆ–‡ๆกฃ | http://localhost/swagger-ui.html | **้ป˜่ฎค็ฎก็†ๅ‘˜๏ผš** `admin` / `admin123` ### ๆ–นๅผไบŒ๏ผšๆ‰‹ๅŠจๅฏๅŠจ๏ผˆๅผ€ๅ‘่ฐƒ่ฏ•๏ผ‰ ๅ‰็ฝฎๆกไปถ๏ผšJDK 21ใ€Maven 3.9+ใ€Node.js 22+ใ€MySQL 8.0ใ€Redis 7.x ```bash # 1. ๅฏๅŠจไธญ้—ดไปถ๏ผˆๆˆ–ไฝฟ็”จๅทฒๆœ‰ๅฎžไพ‹๏ผ‰ docker run -d --name zyf-mysql -p 3306:3306 \ -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=zyf_cms mysql:8.0 docker run -d --name zyf-redis -p 6379:6379 redis:7-alpine # 2. ๅฏๅŠจๅŽ็ซฏ๏ผˆ8080 ็ซฏๅฃ๏ผŒFlyway ่‡ชๅŠจๅปบ่กจ่ฟ็งป๏ผ‰ cd zyf-cms-server mvn clean install -DskipTests cd zyf-api mvn spring-boot:run -Dspring-boot.run.profiles=dev # 3. ๅฏๅŠจๅ‰็ซฏ๏ผˆ5173 ็ซฏๅฃ๏ผŒVite ไปฃ็† /api โ†’ 8080๏ผ‰ cd zyf-cms-web npm install npm run dev ``` ### Docker ๆœๅŠกๆ‹“ๆ‰‘ ``` ็”จๆˆทๆต่งˆๅ™จ :80 โ”‚ โ–ผ Nginx (Alpine) โ”œโ”€โ”€ / โ†’ ๅ‰็ซฏ้™ๆ€ๆ–‡ไปถ๏ผˆSPA ๅ›ž้€€๏ผ‰ โ”œโ”€โ”€ /api/* โ†’ backend:8080๏ผˆๅๅ‘ไปฃ็†๏ผ‰ โ”œโ”€โ”€ /uploads/* โ†’ ๅ…ฑไบซๅท๏ผˆ้™ๆ€ๆ–‡ไปถ็›ดๆŽฅ่ฟ”ๅ›ž๏ผ‰ โ””โ”€โ”€ /swagger-ui.html โ†’ backend:8080 โ”‚ โ–ผ Backend (Spring Boot 3 + JDK 21) โ”œโ”€โ”€ MySQL:3306๏ผˆFlyway ่‡ชๅŠจ่ฟ็งป๏ผ‰ โ””โ”€โ”€ Redis:6379๏ผˆ็ผ“ๅญ˜๏ผ‰ ```