# zhuangyuan-java **Repository Path**: shisenlin/zhuangyuan-java ## Basic Information - **Project Name**: zhuangyuan-java - **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-20 - **Last Updated**: 2026-06-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # ๐ŸŽ“ ๅฐ็Šถๅ…ƒ - ๅฎถๅบญๆ™บ่ƒฝๅ‡บ้ข˜ๆ‰นๆ”น็ณป็ปŸ๏ผˆๅŽ็ซฏ๏ผ‰

> ไธ€ๆฌพ้ขๅ‘ๅฎถๅบญ็š„ๆ™บ่ƒฝๆ•ฐๅญฆๅ‡บ้ข˜ไธŽๆ‰นๆ”น็ณป็ปŸๅŽ็ซฏ๏ผŒๆ”ฏๆŒๆŒ‰ๅนด็บง่‡ชๅŠจ็”Ÿๆˆๆ•ฐๅญฆ้ข˜ใ€่‡ชๅŠจๆ‰นๆ”นใ€็งฏๅˆ†ๅฅ–ๅŠฑใ€้”™้ข˜ๆœฌใ€็งฏๅˆ†ๅ•†ๅŸŽ็ญ‰ๅŠŸ่ƒฝใ€‚ --- ## ๐Ÿ“– ็›ฎๅฝ• - [ๅŠŸ่ƒฝ็‰นๆ€ง](#-ๅŠŸ่ƒฝ็‰นๆ€ง) - [ๆŠ€ๆœฏๆžถๆž„](#-ๆŠ€ๆœฏๆžถๆž„) - [้กน็›ฎ็ป“ๆž„](#-้กน็›ฎ็ป“ๆž„) - [็Žฏๅขƒ่ฆๆฑ‚](#-็Žฏๅขƒ่ฆๆฑ‚) - [ไพ่ต–ไธ‹่ฝฝไธŽๅ›ฝๅ†…้•œๅƒ้…็ฝฎ](#-ไพ่ต–ไธ‹่ฝฝไธŽๅ›ฝๅ†…้•œๅƒ้…็ฝฎ) - [ๅฟซ้€ŸๅฏๅŠจ](#-ๅฟซ้€ŸๅฏๅŠจ) - [Docker ้ƒจ็ฝฒ](#-docker-้ƒจ็ฝฒ) - [API ๆŽฅๅฃๆ–‡ๆกฃ](#-api-ๆŽฅๅฃๆ–‡ๆกฃ) - [ๆ•ฐๆฎๅบ“่ฎพ่ฎก](#-ๆ•ฐๆฎๅบ“่ฎพ่ฎก) - [้…็ฝฎ่ฏดๆ˜Ž](#-้…็ฝฎ่ฏดๆ˜Ž) - [ๅธธ่ง้—ฎ้ข˜](#-ๅธธ่ง้—ฎ้ข˜) --- ## โœจ ๅŠŸ่ƒฝ็‰นๆ€ง ### ๐Ÿ” ็”จๆˆท่ฎค่ฏ - ๅฎถ้•ฟๆณจๅ†Œ / ็™ปๅฝ•๏ผˆ็”จๆˆทๅ + ๅฏ†็ ๏ผ‰ - JWT Token ๆ— ็Šถๆ€้‰ดๆƒ - BCrypt ๅฏ†็ ๅŠ ๅฏ†ๅญ˜ๅ‚จ - ่ง’่‰ฒๅŒบๅˆ†๏ผšๅฎถ้•ฟ๏ผˆPARENT๏ผ‰/ ๅญฉๅญ๏ผˆCHILD๏ผ‰ ### ๐Ÿ‘ถ ๅญฉๅญ็ฎก็† - ๆทปๅŠ ๅคšไธชๅญฉๅญ๏ผŒ่ฎพ็ฝฎๅง“ๅใ€ๅนด้พ„ใ€ๅนด็บง - ๆ”ฏๆŒ Emoji ๅคดๅƒ้€‰ๆ‹ฉ - 7 ็งไธป้ข˜้ฃŽๆ ผๅˆ‡ๆข๏ผˆๅญฆ้™ข้ฃŽใ€ๅบ“ๆด›็ฑณใ€ๅ“ชๅ’ใ€ๅ…ฌไธปใ€ๅ†ฐ้›ชๅฅ‡็ผ˜ใ€่‡ช็„ถใ€ๅคช็ฉบ๏ผ‰ - ไธป้ข˜้…็ฝฎๆŒไน…ๅŒ–ๅญ˜ๅ‚จ ### ๐Ÿ“ ๆ™บ่ƒฝๅ‡บ้ข˜ - **ๆŒ‰ๅนด็บง่‡ชๅŠจ็”Ÿๆˆ**๏ผš่ฆ†็›–ไธ€ๅนด็บงๅˆฐๅ››ๅนด็บง็Ÿฅ่ฏ†็‚น - **้ข˜ๅž‹ไธฐๅฏŒ**๏ผšๅŠ ๆณ•ใ€ๅ‡ๆณ•ใ€ไน˜ๆณ•ใ€้™คๆณ•ใ€ๆททๅˆ่ฟ็ฎ—ใ€ๆ‹ฌๅท่ฟ็ฎ—ใ€็™พๅˆ†ๆ•ฐ - **็ปƒไน ๆจกๅผ**๏ผš่‡ช้€‰้ข˜้‡๏ผŒ้šๆ—ถ็ปƒไน  - **ๆญฃๅผ่€ƒ่ฏ•**๏ผšA4 ๆญฃๅ้ขๅ…ฑ 42 ้ข˜๏ผˆๅ‰ 25 ้ข˜ + ๅŽ 17 ้ข˜๏ผ‰๏ผŒๆจกๆ‹Ÿ็œŸๅฎž่€ƒ่ฏ• ### โœ… ่‡ชๅŠจๆ‰นๆ”น - ๆไบค็ญ”ๆกˆๅŽๅณๆ—ถๆ‰นๆ”น - ้€้ข˜ๆ˜พ็คบๆญฃ็กฎ็ญ”ๆกˆไธŽๅฏน้”™ - ๆŒ‰็Ÿฅ่ฏ†็‚นๅฝ’็ฑป้”™้ข˜ ### ๐Ÿ† ็งฏๅˆ†็ณป็ปŸ - ๆญฃๅผ่€ƒ่ฏ•ๆ นๆฎๅพ—ๅˆ†ๅฅ–ๅŠฑ็งฏๅˆ†๏ผˆๆปกๅˆ† 10 ๅˆ†๏ผŒโ‰ฅ90 ๅˆ† 8 ๅˆ†๏ผŒโ‰ฅ80 ๅˆ† 6 ๅˆ†๏ผŒโ‰ฅ70 ๅˆ† 4 ๅˆ†๏ผŒโ‰ฅ60 ๅˆ† 2 ๅˆ†๏ผ‰ - ็งฏๅˆ†ๅކๅฒ่ฎฐๅฝ•่ฟฝ่ธช - ็ปƒไน ๆจกๅผไธ่ฎก็งฏๅˆ† ### ๐Ÿ“• ้”™้ข˜ๆœฌ - ่‡ชๅŠจ่ฎฐๅฝ•ๆ‰€ๆœ‰้”™้ข˜ - ๆŒ‰็Ÿฅ่ฏ†็‚น็ปŸ่ฎก้”™้ข˜ๅˆ†ๅธƒ - ๆ”ฏๆŒ้”™้ข˜ๅผบๅŒ–็ปƒไน  ### ๐ŸŽ ็งฏๅˆ†ๅ•†ๅŸŽ - ๅฎถ้•ฟๆทปๅŠ  / ็ฎก็†็คผๅ“๏ผˆๅ็งฐใ€ไปทๆ ผใ€ๅ›พๆ ‡ใ€ๅบ“ๅญ˜๏ผ‰ - ๅญฉๅญ็”จ็งฏๅˆ†ๅ…‘ๆข็คผๅ“ - ๅฎถ้•ฟๅฎกๆ‰นๆต็จ‹๏ผˆๅพ…ๅฎกๆ‰น โ†’ ้€š่ฟ‡ / ๆ‹’็ป๏ผ‰ - ๆ‹’็ป่‡ชๅŠจ้€€่ฟ˜็งฏๅˆ† --- ## ๐Ÿ— ๆŠ€ๆœฏๆžถๆž„ ``` โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ Flutter App โ”‚ โ”‚ (Android / iOS / Web) โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ HTTP / REST API โ–ผ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ Spring Boot Application โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”‚ Security Layer (JWT) โ”‚ โ”‚ โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ Controller Layer โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ AuthController ChildController โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ ExamController GiftController โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ โ”‚ โ”‚ โ–ผ โ”‚ โ”‚ โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ Service Layer โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ AuthService ExamService GiftService โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ โ”‚ โ”‚ โ–ผ โ”‚ โ”‚ โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ Repository Layer (JPA) โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ User Child Question ExamRecord โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ WrongQuestion Gift RedeemRecord โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ PointsHistory โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ–ผ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ Database โ”‚ โ”‚ H2 (ๅผ€ๅ‘) / PostgreSQL โ”‚ โ”‚ (็”Ÿไบง) โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ ``` ### ๆŠ€ๆœฏๆ ˆ | ็ป„ไปถ | ๆŠ€ๆœฏ | ็‰ˆๆœฌ | ่ฏดๆ˜Ž | |------|------|------|------| | ๆก†ๆžถ | Spring Boot | 3.2.5 | ๅบ”็”จๆก†ๆžถ | | ่ฏญ่จ€ | Java | 17 | LTS ็‰ˆๆœฌ | | ORM | Spring Data JPA + Hibernate | 6.4.4 | ๆ•ฐๆฎๆŒไน…ๅŒ– | | ๅฎ‰ๅ…จ | Spring Security + JWT | 6.2.4 / 0.12.5 | ่ฎค่ฏ้‰ดๆƒ | | ๆ•ฐๆฎๅบ“ | H2 / PostgreSQL | 2.2.224 / 15 | ๅผ€ๅ‘ / ็”Ÿไบง | | ๅทฅๅ…ท | Lombok | ๅ†…็ฝฎ | ็ฎ€ๅŒ–ไปฃ็  | | ๆ˜ ๅฐ„ | ModelMapper | 3.1.1 | DTO ่ฝฌๆข | | ๅฎนๅ™จ | Docker + Docker Compose | - | ๅฎนๅ™จๅŒ–้ƒจ็ฝฒ | --- ## ๐Ÿ“ ้กน็›ฎ็ป“ๆž„ ``` zhuangyuan-java/ โ”œโ”€โ”€ src/main/java/com/zhuangyuan/ โ”‚ โ”œโ”€โ”€ ZhuangYuanApplication.java # ๅฏๅŠจ็ฑป โ”‚ โ”œโ”€โ”€ config/ โ”‚ โ”‚ โ”œโ”€โ”€ SecurityConfig.java # Spring Security + JWT ่ฟ‡ๆปคๅ™จ้…็ฝฎ โ”‚ โ”‚ โ”œโ”€โ”€ JwtUtil.java # JWT ๅทฅๅ…ท็ฑป๏ผˆ็”Ÿๆˆ/่งฃๆž/้ชŒ่ฏ๏ผ‰ โ”‚ โ”‚ โ””โ”€โ”€ GlobalExceptionHandler.java # ๅ…จๅฑ€ๅผ‚ๅธธๅค„็†ๅ™จ โ”‚ โ”œโ”€โ”€ controller/ โ”‚ โ”‚ โ”œโ”€โ”€ AuthController.java # ่ฎค่ฏๆŽฅๅฃ๏ผˆๆณจๅ†Œ/็™ปๅฝ•๏ผ‰ โ”‚ โ”‚ โ”œโ”€โ”€ ChildController.java # ๅญฉๅญ็ฎก็†ๆŽฅๅฃ โ”‚ โ”‚ โ”œโ”€โ”€ ExamController.java # ่€ƒ่ฏ•ๆŽฅๅฃ๏ผˆๅ‡บ้ข˜/ๆไบค๏ผ‰ โ”‚ โ”‚ โ””โ”€โ”€ GiftController.java # ็คผๅ“/ๅ…‘ๆข/้”™้ข˜/็งฏๅˆ†ๆŽฅๅฃ โ”‚ โ”œโ”€โ”€ dto/ โ”‚ โ”‚ โ”œโ”€โ”€ AuthDto.java # ่ฎค่ฏ่ฏทๆฑ‚/ๅ“ๅบ” DTO โ”‚ โ”‚ โ”œโ”€โ”€ ChildDto.java # ๅญฉๅญ็›ธๅ…ณ DTO โ”‚ โ”‚ โ”œโ”€โ”€ ExamDto.java # ่€ƒ่ฏ•็›ธๅ…ณ DTO โ”‚ โ”‚ โ””โ”€โ”€ GiftDto.java # ็คผๅ“็›ธๅ…ณ DTO โ”‚ โ”œโ”€โ”€ entity/ โ”‚ โ”‚ โ”œโ”€โ”€ User.java # ็”จๆˆทๅฎžไฝ“ โ”‚ โ”‚ โ”œโ”€โ”€ Child.java # ๅญฉๅญๅฎžไฝ“ โ”‚ โ”‚ โ”œโ”€โ”€ Question.java # ้ข˜็›ฎๅฎžไฝ“ โ”‚ โ”‚ โ”œโ”€โ”€ ExamRecord.java # ่€ƒ่ฏ•่ฎฐๅฝ•ๅฎžไฝ“ โ”‚ โ”‚ โ”œโ”€โ”€ WrongQuestion.java # ้”™้ข˜ๅฎžไฝ“ โ”‚ โ”‚ โ”œโ”€โ”€ Gift.java # ็คผๅ“ๅฎžไฝ“ โ”‚ โ”‚ โ”œโ”€โ”€ RedeemRecord.java # ๅ…‘ๆข่ฎฐๅฝ•ๅฎžไฝ“ โ”‚ โ”‚ โ””โ”€โ”€ PointsHistory.java # ็งฏๅˆ†ๅކๅฒๅฎžไฝ“ โ”‚ โ”œโ”€โ”€ repository/ # JPA Repository ๆŽฅๅฃ โ”‚ โ””โ”€โ”€ service/ โ”‚ โ”œโ”€โ”€ AuthService.java # ่ฎค่ฏๆœๅŠก โ”‚ โ”œโ”€โ”€ ExamService.java # ่€ƒ่ฏ•ๆœๅŠก๏ผˆๅ‡บ้ข˜/ๆ‰นๆ”น๏ผ‰ โ”‚ โ””โ”€โ”€ GiftService.java # ็คผๅ“/ๅ…‘ๆขๆœๅŠก โ”œโ”€โ”€ src/main/resources/ โ”‚ โ””โ”€โ”€ application.yml # ๅบ”็”จ้…็ฝฎ โ”œโ”€โ”€ Dockerfile # Docker ้•œๅƒๆž„ๅปบ โ”œโ”€โ”€ docker-compose.yml # Docker Compose ็ผ–ๆŽ’ โ”œโ”€โ”€ check_compile.sh # ็ผ–่ฏ‘ๆฃ€ๆŸฅ่„šๆœฌ โ”œโ”€โ”€ start.sh # ไธ€้”ฎๅฏๅŠจ่„šๆœฌ โ””โ”€โ”€ pom.xml # Maven ้…็ฝฎ ``` --- ## ๐Ÿ“‹ ็Žฏๅขƒ่ฆๆฑ‚ | ๅทฅๅ…ท | ๆœ€ไฝŽ็‰ˆๆœฌ | ๆŽจ่็‰ˆๆœฌ | ่ฏดๆ˜Ž | |------|----------|----------|------| | JDK | 17 | 17 LTS | [ไธ‹่ฝฝๅœฐๅ€](#jdk-17) | | Maven | 3.8 | 3.9+ | [ไธ‹่ฝฝๅœฐๅ€](#maven) | | Docker | 20.0+ | ๆœ€ๆ–ฐ | ๅฏ้€‰๏ผŒ็”จไบŽๅฎนๅ™จๅŒ–้ƒจ็ฝฒ | | Docker Compose | 2.0+ | ๆœ€ๆ–ฐ | ๅฏ้€‰๏ผŒ็”จไบŽ็ผ–ๆŽ’ | --- ## ๐Ÿ”ฝ ไพ่ต–ไธ‹่ฝฝไธŽๅ›ฝๅ†…้•œๅƒ้…็ฝฎ ### JDK 17 **ๅฎ˜ๆ–นไธ‹่ฝฝ๏ผš** - Adoptium (Eclipse Temurin): https://adoptium.net/temurin/releases/?version=17 - Azul Zulu: https://www.azul.com/downloads/?version=java-17-lts&os=linux&architecture=x86-64-bit&package=jdk **ๅ›ฝๅ†…้•œๅƒ๏ผš** - ๅŽไธบ้•œๅƒ: https://repo.huaweicloud.com/java/jdk/ - ๆธ…ๅŽ้•œๅƒ: https://mirrors.tuna.tsinghua.edu.cn/Adoptium/ **ๅฟซ้€Ÿๅฎ‰่ฃ…๏ผˆUbuntu/Debian๏ผ‰๏ผš** ```bash # Ubuntu/Debian sudo apt install openjdk-17-jdk # CentOS/RHEL sudo yum install java-17-openjdk-devel # macOS brew install openjdk@17 # ้ชŒ่ฏ java -version ``` ### Maven **ๅฎ˜ๆ–นไธ‹่ฝฝ๏ผš** - https://maven.apache.org/download.cgi **ๅ›ฝๅ†…้•œๅƒ้…็ฝฎ๏ผˆ้‡่ฆ๏ผๅŠ ้€Ÿไพ่ต–ไธ‹่ฝฝ๏ผ‰๏ผš** ๅˆ›ๅปบๆˆ–็ผ–่พ‘ `~/.m2/settings.xml`๏ผš ```xml aliyunmaven * ้˜ฟ้‡Œไบ‘ๅ…ฌๅ…ฑไป“ๅบ“ https://maven.aliyun.com/repository/public ``` **ๅ…ถไป–ๅ›ฝๅ†…้•œๅƒๆบ๏ผš** | ๅ็งฐ | ๅœฐๅ€ | ่ฏดๆ˜Ž | |------|------|------| | ้˜ฟ้‡Œไบ‘ | `https://maven.aliyun.com/repository/public` | ๆŽจ่๏ผŒๆœ€็จณๅฎš | | ่…พ่ฎฏไบ‘ | `https://mirrors.cloud.tencent.com/nexus/repository/maven-public/` | ๅค‡้€‰ | | ๅŽไธบไบ‘ | `https://repo.huaweicloud.com/repository/maven/` | ๅค‡้€‰ | | ไธญๅคฎไป“ๅบ“ | `https://repo.maven.apache.org/maven2` | ๅฎ˜ๆ–นๆบ๏ผˆๆ…ข๏ผ‰ | --- ## ๐Ÿš€ ๅฟซ้€ŸๅฏๅŠจ ### ๆ–นๅผไธ€๏ผš็›ดๆŽฅ่ฟ่กŒ๏ผˆๅผ€ๅ‘ๆŽจ่๏ผ‰ ```bash # 1. ๅ…‹้š†้กน็›ฎ git clone https://gitee.com/shisenlin/zhuangyuan-java.git cd zhuangyuan-java # 2. ็ผ–่ฏ‘ๆ‰“ๅŒ…๏ผˆ่ทณ่ฟ‡ๆต‹่ฏ•๏ผ‰ mvn clean package -DskipTests # 3. ่ฟ่กŒ๏ผˆ้ป˜่ฎคไฝฟ็”จ H2 ๅ†…ๅญ˜ๆ•ฐๆฎๅบ“๏ผŒๆ— ้œ€้ขๅค–ๅฎ‰่ฃ…ๆ•ฐๆฎๅบ“๏ผ‰ java -jar target/zhuangyuan-backend-1.0.0.jar # 4. ่ฎฟ้—ฎ # API: http://localhost:8080 # H2 ๆŽงๅˆถๅฐ: http://localhost:8080/h2-console ``` ### ๆ–นๅผไบŒ๏ผšMaven ็›ดๆŽฅ่ฟ่กŒ ```bash mvn spring-boot:run ``` ### ๆ–นๅผไธ‰๏ผšDocker Compose ไธ€้”ฎ้ƒจ็ฝฒ๏ผˆ็”ŸไบงๆŽจ่๏ผ‰ ```bash # ๅฏๅŠจ๏ผˆๅŒ…ๅซ PostgreSQL ๆ•ฐๆฎๅบ“ + ๅŽ็ซฏๆœๅŠก๏ผ‰ bash start.sh start # ๆˆ–ๆ‰‹ๅŠจ docker compose up -d --build # ๆŸฅ็œ‹ๆ—ฅๅฟ— bash start.sh logs # ๅœๆญข bash start.sh stop ``` --- ## ๐Ÿณ Docker ้ƒจ็ฝฒ ### Dockerfile ```dockerfile # ๆž„ๅปบ้˜ถๆฎต FROM maven:3.9-eclipse-temurin-17-alpine AS build WORKDIR /app COPY pom.xml . RUN mvn dependency:go-offline -B COPY src ./src RUN mvn package -DskipTests -B # ่ฟ่กŒ้˜ถๆฎต FROM eclipse-temurin:17-jre-alpine WORKDIR /app COPY --from=build /app/target/*.jar app.jar RUN mkdir -p data/uploads EXPOSE 8080 ENTRYPOINT ["java", "-jar", "app.jar"] ``` ### docker-compose.yml ```yaml services: db: image: postgres:15-alpine environment: POSTGRES_DB: zhuangyuan POSTGRES_USER: zhuangyuan POSTGRES_PASSWORD: zhuangyuan123 volumes: - pgdata:/var/lib/postgresql/data ports: - "5432:5432" backend: build: . ports: - "8080:8080" environment: DB_HOST: db DB_PORT: 5432 DB_NAME: zhuangyuan DB_USER: zhuangyuan DB_PASS: zhuangyuan123 JWT_SECRET: your-very-long-secret-key-here depends_on: - db volumes: pgdata: ``` ### ๅˆ‡ๆขๅˆฐ PostgreSQL ็”Ÿไบงๆ•ฐๆฎๅบ“ ่ฎพ็ฝฎ็Žฏๅขƒๅ˜้‡ๆˆ–ไฟฎๆ”น `application-prod.yml`๏ผš ```yaml spring: datasource: url: jdbc:postgresql://${DB_HOST}:${DB_PORT}/${DB_NAME} username: ${DB_USER} password: ${DB_PASS} driver-class-name: org.postgresql.Driver jpa: hibernate: ddl-auto: update properties: hibernate: dialect: org.hibernate.dialect.PostgreSQLDialect ``` --- ## ๐Ÿ“ก API ๆŽฅๅฃๆ–‡ๆกฃ ### ่ฎค่ฏๆŽฅๅฃ๏ผˆๆ— ้œ€ Token๏ผ‰ | ๆ–นๆณ• | ่ทฏๅพ„ | ่ฏดๆ˜Ž | ่ฏทๆฑ‚ไฝ“ | |------|------|------|--------| | POST | `/api/auth/register` | ็”จๆˆทๆณจๅ†Œ | `{username, password, nickname}` | | POST | `/api/auth/login` | ็”จๆˆท็™ปๅฝ• | `{username, password}` | ### ๅญฉๅญ็ฎก็†๏ผˆ้œ€่ฆ Token๏ผ‰ | ๆ–นๆณ• | ่ทฏๅพ„ | ่ฏดๆ˜Ž | ่ฏทๆฑ‚ไฝ“ | |------|------|------|--------| | GET | `/api/children` | ่Žทๅ–ๅญฉๅญๅˆ—่กจ | - | | POST | `/api/children` | ๆทปๅŠ ๅญฉๅญ | `{name, age, grade, avatar}` | | PUT | `/api/children/{id}/theme` | ๆ›ดๆ–ฐไธป้ข˜ | `{theme}` | ### ่€ƒ่ฏ•ๆŽฅๅฃ๏ผˆ้œ€่ฆ Token๏ผ‰ | ๆ–นๆณ• | ่ทฏๅพ„ | ่ฏดๆ˜Ž | ่ฏทๆฑ‚ไฝ“ | |------|------|------|--------| | POST | `/api/exam/generate` | ็”Ÿๆˆ็ปƒไน ้ข˜ | `{childId, count}` | | POST | `/api/exam/generate-test` | ็”Ÿๆˆๆญฃๅผ่€ƒ่ฏ•(42้ข˜) | `{childId}` | | POST | `/api/exam/submit` | ๆไบค็ญ”ๆกˆ | `{examId, childId, examType, answers[]}` | ### ็คผๅ“ / ๅ…‘ๆข / ้”™้ข˜ / ็งฏๅˆ†๏ผˆ้œ€่ฆ Token๏ผ‰ | ๆ–นๆณ• | ่ทฏๅพ„ | ่ฏดๆ˜Ž | ่ฏทๆฑ‚ไฝ“ | |------|------|------|--------| | GET | `/api/gifts` | ่Žทๅ–็คผๅ“ๅˆ—่กจ | - | | POST | `/api/gifts` | ๆทปๅŠ ็คผๅ“ | `{name, price, icon, stock}` | | DELETE | `/api/gifts/{id}` | ๅˆ ้™ค็คผๅ“๏ผˆไธ‹ๆžถ๏ผ‰ | - | | POST | `/api/redeem` | ๅ…‘ๆข็คผๅ“ | `{childId, giftId}` | | GET | `/api/redeem/{childId}` | ่Žทๅ–ๅ…‘ๆข่ฎฐๅฝ• | - | | GET | `/api/redeem/pending/list` | ๅพ…ๅฎกๆ‰นๅˆ—่กจ | - | | POST | `/api/redeem/{id}/approve` | ๅฎกๆ‰น้€š่ฟ‡ | - | | POST | `/api/redeem/{id}/reject` | ๅฎกๆ‰นๆ‹’็ป | - | | GET | `/api/wrong/{childId}` | ้”™้ข˜ๅˆ—่กจ | - | | GET | `/api/wrong/stats/{childId}` | ้”™้ข˜็Ÿฅ่ฏ†็‚น็ปŸ่ฎก | - | | GET | `/api/points/{childId}` | ็งฏๅˆ†ๅކๅฒ | - | | GET | `/api/exam-records/{childId}` | ่€ƒ่ฏ•่ฎฐๅฝ• | - | ### ่ฏทๆฑ‚็คบไพ‹ ```bash # ๆณจๅ†Œ curl -X POST http://localhost:8080/api/auth/register \ -H "Content-Type: application/json" \ -d '{"username":"parent1","password":"123456","nickname":"ๅฎถ้•ฟ"}' # ็™ปๅฝ•่Žทๅ– Token curl -X POST http://localhost:8080/api/auth/login \ -H "Content-Type: application/json" \ -d '{"username":"parent1","password":"123456"}' # ไฝฟ็”จ Token ่ฎฟ้—ฎ curl http://localhost:8080/api/children \ -H "Authorization: Bearer " ``` --- ## ๐Ÿ—„ ๆ•ฐๆฎๅบ“่ฎพ่ฎก ### ER ๅ…ณ็ณปๅ›พ ``` User (็”จๆˆท) โ”œโ”€โ”€ 1:N โ”€โ”€ Child (ๅญฉๅญ) โ”‚ โ”œโ”€โ”€ 1:N โ”€โ”€ ExamRecord (่€ƒ่ฏ•่ฎฐๅฝ•) โ”‚ โ”œโ”€โ”€ 1:N โ”€โ”€ WrongQuestion (้”™้ข˜) โ”‚ โ”œโ”€โ”€ 1:N โ”€โ”€ PointsHistory (็งฏๅˆ†ๅކๅฒ) โ”‚ โ””โ”€โ”€ 1:N โ”€โ”€ RedeemRecord (ๅ…‘ๆข่ฎฐๅฝ•) โ””โ”€โ”€ 1:N โ”€โ”€ Gift (็คผๅ“๏ผŒๅˆ›ๅปบ่€…) Question (้ข˜็›ฎๅบ“) โ””โ”€โ”€ ่ขซ ExamRecord ๅผ•็”จ ``` ### ๆ ธๅฟƒ่กจ็ป“ๆž„ | ่กจๅ | ่ฏดๆ˜Ž | ไธป่ฆๅญ—ๆฎต | |------|------|----------| | `users` | ็”จๆˆท่กจ | id, username, password, nickname, role | | `children` | ๅญฉๅญ่กจ | id, parent_id, name, age, grade, avatar, points, theme | | `questions` | ้ข˜็›ฎ่กจ | id, subject, grade_level, knowledge_point, content, answer | | `exam_records` | ่€ƒ่ฏ•่ฎฐๅฝ• | id, child_id, exam_type, question_ids, score, points_earned | | `wrong_questions` | ้”™้ข˜่กจ | id, child_id, question_id, wrong_answer, correct_answer | | `gifts` | ็คผๅ“่กจ | id, name, price, icon, stock, is_active | | `redeem_records` | ๅ…‘ๆข่ฎฐๅฝ• | id, child_id, gift_id, points, status | | `points_history` | ็งฏๅˆ†ๅކๅฒ | id, child_id, type, points, description | --- ## โš™ ้…็ฝฎ่ฏดๆ˜Ž ### application.yml ๆ ธๅฟƒ้…็ฝฎ ```yaml server: port: 8080 # ๆœๅŠก็ซฏๅฃ spring: datasource: url: jdbc:h2:mem:testdb # ๅผ€ๅ‘็”จ H2 ๅ†…ๅญ˜ๆ•ฐๆฎๅบ“ jpa: hibernate: ddl-auto: update # ่‡ชๅŠจๅปบ่กจ๏ผˆ็”Ÿไบง็Žฏๅขƒๅปบ่ฎฎ็”จ flyway๏ผ‰ jwt: secret: xxx # JWT ็ญพๅๅฏ†้’ฅ๏ผˆ็”Ÿไบง็Žฏๅขƒๅฟ…้กปไฟฎๆ”น๏ผ๏ผ‰ expiration: 604800000 # Token ๆœ‰ๆ•ˆๆœŸ 7 ๅคฉ๏ผˆๆฏซ็ง’๏ผ‰ baidu: ocr: api-key: ${BAIDU_OCR_API_KEY:} # ็™พๅบฆ OCR API Key๏ผˆๅฏ้€‰๏ผ‰ secret-key: ${BAIDU_OCR_SECRET_KEY:} upload: dir: ${UPLOAD_DIR:./data/uploads} # ๆ–‡ไปถไธŠไผ ็›ฎๅฝ• ``` ### ็Žฏๅขƒๅ˜้‡ | ๅ˜้‡ | ่ฏดๆ˜Ž | ้ป˜่ฎคๅ€ผ | |------|------|--------| | `DB_HOST` | ๆ•ฐๆฎๅบ“ๅœฐๅ€ | localhost | | `DB_PORT` | ๆ•ฐๆฎๅบ“็ซฏๅฃ | 5432 | | `DB_NAME` | ๆ•ฐๆฎๅบ“ๅ | zhuangyuan | | `DB_USER` | ๆ•ฐๆฎๅบ“็”จๆˆท | zhuangyuan | | `DB_PASS` | ๆ•ฐๆฎๅบ“ๅฏ†็  | zhuangyuan123 | | `JWT_SECRET` | JWT ๅฏ†้’ฅ | ๅ†…็ฝฎๅผ€ๅ‘ๅฏ†้’ฅ | | `BAIDU_OCR_API_KEY` | ็™พๅบฆ OCR Key | ็ฉบ | | `UPLOAD_DIR` | ไธŠไผ ็›ฎๅฝ• | ./data/uploads | --- ## โ“ ๅธธ่ง้—ฎ้ข˜ ### Q: Maven ไธ‹่ฝฝไพ่ต–ๅคชๆ…ข๏ผŸ ้…็ฝฎๅ›ฝๅ†…้•œๅƒ๏ผŒๅ‚่€ƒ [Maven ้•œๅƒ้…็ฝฎ](#maven)ใ€‚ ### Q: ๅฆ‚ไฝ•ๅˆ‡ๆขๅˆฐ PostgreSQL๏ผŸ ่ฎพ็ฝฎ็Žฏๅขƒๅ˜้‡ `DB_HOST`, `DB_PORT`, `DB_NAME`, `DB_USER`, `DB_PASS`๏ผŒๆˆ–ๅˆ›ๅปบ `application-prod.yml` ๅนถๆฟ€ๆดป `prod` profileใ€‚ ### Q: JWT Token ่ฟ‡ๆœŸๆ—ถ้—ดๆ€Žไนˆๆ”น๏ผŸ ไฟฎๆ”น `application.yml` ไธญ็š„ `jwt.expiration`๏ผŒๅ•ไฝๆฏซ็ง’ใ€‚้ป˜่ฎค 604800000๏ผˆ7 ๅคฉ๏ผ‰ใ€‚ ### Q: ๅฆ‚ไฝ•ๆทปๅŠ ๆ–ฐ็š„ๅนด็บง้ข˜ๅž‹๏ผŸ ็ผ–่พ‘ `ExamService.java` ไธญ็š„ `TEMPLATES` Map๏ผŒๆทปๅŠ ๆ–ฐ็š„ๅนด็บงๅ’Œ้ข˜ๅž‹ๆจกๆฟใ€‚ ### Q: ็”Ÿไบง็Žฏๅขƒ้œ€่ฆๆณจๆ„ไป€ไนˆ๏ผŸ 1. ไฟฎๆ”น `jwt.secret` ไธบ้šๆœบ้•ฟๅญ—็ฌฆไธฒ 2. ไฝฟ็”จ PostgreSQL ๆ›ฟไปฃ H2 3. ้…็ฝฎ HTTPS 4. ไฟฎๆ”น `ddl-auto` ไธบ `validate` ๆˆ–ไฝฟ็”จ Flyway 5. ้…็ฝฎๆ—ฅๅฟ—็บงๅˆซ --- ## ๐Ÿ“„ License MIT License