# Tabletop-Link **Repository Path**: grainiarg/tabletop-link ## Basic Information - **Project Name**: Tabletop-Link - **Description**: ๐ŸŽฒ ๆŽท้ชฐ่€… - ๆกŒๆธธ O2O ๅนณๅฐ | Spring Boot 3 + React ๅ‰ๅŽ็ซฏๅˆ†็ฆปๆžถๆž„ | ๆ”ฏๆŒ้ซ˜ๅนถๅ‘็ง’ๆ€ใ€LBS ๅฎšไฝใ€ๅฎžๆ—ถๅŒน้… | ้›†ๆˆ Redis + Kafka + MySQL - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-04-01 - **Last Updated**: 2026-05-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # ๐ŸŽฒ Tabletop-Link (ๆŽท้ชฐ่€…) > ๅž‚็›ด้ข†ๅŸŸๆกŒๆธธ O2O ไธŽ้ซ˜ๅนถๅ‘็ฆๅˆฉ็คพๅŒบๅนณๅฐ [![Java](https://img.shields.io/badge/Java-17-blue.svg)](https://openjdk.java.net/) [![Spring Boot](https://img.shields.io/badge/Spring%20Boot-3.2.3-brightgreen.svg)](https://spring.io/projects/spring-boot) [![MyBatis-Plus](https://img.shields.io/badge/MyBatis--Plus-3.5.5-orange.svg)](https://baomidou.com/) [![Redis](https://img.shields.io/badge/Redis-7.0-red.svg)](https://redis.io/) [![Kafka](https://img.shields.io/badge/Apache%20Kafka-3.4.1-black.svg)](https://kafka.apache.org/) [![React](https://img.shields.io/badge/React-19.2.4-61dafb.svg)](https://react.dev/) [![License](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE) --- ## โœจ ้กน็›ฎ็ฎ€ไป‹ **Tabletop-Link๏ผˆๆŽท้ชฐ่€…๏ผ‰** ๆ˜ฏไธ€ไธชไธ“ๆณจไบŽๆกŒๆธธ้ข†ๅŸŸ็š„ O2O ๅนณๅฐ๏ผŒ่ฟžๆŽฅๆกŒๆธธ็ˆฑๅฅฝ่€…ไธŽๆกŒๆธธๅฎžไฝ“ๅบ—๏ผŒๆไพ›ๅบ—้“บ้ข„่ฎขใ€้ซ˜ๅนถๅ‘็ง’ๆ€ใ€ๅฎžๆ—ถๅŒน้…็ญ‰ๆ ธๅฟƒๅŠŸ่ƒฝใ€‚้กน็›ฎ้‡‡็”จๅ‰ๅŽ็ซฏๅˆ†็ฆปๆžถๆž„๏ผŒๆ”ฏๆŒ้ซ˜ๅนถๅ‘ๅœบๆ™ฏไธ‹็š„็จณๅฎš่ฟ่กŒใ€‚ ### ๐ŸŽฏ ๆ ธๅฟƒไธšๅŠกๅœบๆ™ฏ - **๐Ÿ—บ๏ธ LBS ๅฎšไฝๆ‰พๅบ—** - ๅŸบไบŽ Redis GEO ็š„้™„่ฟ‘ๆกŒๆธธๅบ—ๆŽจ่ - **๐ŸŽซ ไผ˜ๆƒ ๅˆธ็ง’ๆ€** - ๆ”ฏๆ’‘ 5000+ QPS ็š„้ซ˜ๅนถๅ‘็ง’ๆ€็ณป็ปŸ - **โšก ๅฎžๆ—ถ็ป„ๅฑ€ๅŒน้…** - WebSocket ๅฎžๆ—ถ้€šไฟก๏ผŒๅฟซ้€Ÿๆ‰พๅˆฐ็Žฉไผด - **๐Ÿ“… ๅœจ็บฟ้ข„็บฆ่ฎขๅบง** - ๆ™บ่ƒฝๆŽ’็ญไธŽๅบ“ๅญ˜็ฎก็† - **๐Ÿ† ็Žฉๅฎถ็งฏๅˆ†ๆŽ’่กŒ** - ็ซžๆŠ€ๅฏนๆˆ˜ไธŽๆˆๅฐฑ็ณป็ปŸ --- ## ๐Ÿ› ๏ธ ๆŠ€ๆœฏๆžถๆž„ ### **ๅŽ็ซฏๆŠ€ๆœฏๆ ˆ** | ๆŠ€ๆœฏ | ็‰ˆๆœฌ | ็”จ้€” | |------|------|------| | **Java** | 17 | ๅผ€ๅ‘่ฏญ่จ€ | | **Spring Boot** | 3.2.3 | ๆ ธๅฟƒๆก†ๆžถ | | **MyBatis-Plus** | 3.5.5 | ORM ๆŒไน…ๅฑ‚ | | **MySQL** | 8.0 | ๅ…ณ็ณปๅž‹ๆ•ฐๆฎๅบ“ | | **Redis** | 7.0 | ็ผ“ๅญ˜ + GEO + ๅˆ†ๅธƒๅผ้” | | **Redisson** | 3.27.0 | Redis ๅฎขๆˆท็ซฏ + ๅˆ†ๅธƒๅผ้” | | **Apache Kafka** | 3.4.1 | ๆถˆๆฏ้˜Ÿๅˆ—๏ผˆๅ‰Šๅณฐๅกซ่ฐท๏ผ‰ | | **Caffeine** | 3.1.8 | ๆœฌๅœฐ็ผ“ๅญ˜ | | **SpringDoc** | 2.4.0 | OpenAPI ๆ–‡ๆกฃ | ### **ๅ‰็ซฏๆŠ€ๆœฏๆ ˆ** | ๆŠ€ๆœฏ | ็‰ˆๆœฌ | ็”จ้€” | |------|------|------| | **React** | 19.2.4 | UI ๆก†ๆžถ | | **TypeScript** | 5.9+ | ็ฑปๅž‹ๅฎ‰ๅ…จ | | **React Router** | 7.13.2 | ่ทฏ็”ฑ็ฎก็† | | **Vite** | 8.0+ | ๆž„ๅปบๅทฅๅ…ท | ### **้ƒจ็ฝฒไธŽ่ฟ็ปด** | ๆŠ€ๆœฏ | ็”จ้€” | |------|------| | **Docker** | ๅฎนๅ™จๅŒ–้ƒจ็ฝฒ | | **Docker Compose** | ๅคšๅฎนๅ™จ็ผ–ๆŽ’ | | **Nginx** | ๅๅ‘ไปฃ็† + ้™ๆ€่ต„ๆบๆœๅŠกๅ™จ | | **Prometheus** | ็›‘ๆŽงๆŒ‡ๆ ‡ๆ”ถ้›† | | **Grafana** | ๅฏ่ง†ๅŒ–็›‘ๆŽง้ขๆฟ | | **Spring Boot Admin** | ๅบ”็”จๅฅๅบท็›‘ๆŽง | --- ## ๐Ÿ—๏ธ ็ณป็ปŸๆžถๆž„ ``` โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ ็”จๆˆทๅฑ‚ โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”‚ Web โ”‚ โ”‚ ๅฐ็จ‹ๅบ โ”‚ โ”‚ App โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ–ผ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ Nginx ่ดŸ่ฝฝๅ‡่กก โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”‚ ้™ๆ€่ต„ๆบ + API ่ทฏ็”ฑ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ–ผ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ Spring Boot ๅŽ็ซฏ้›†็พค โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”‚ Controller ๅฑ‚ โ”‚ Service ๅฑ‚ โ”‚ Mapper ๅฑ‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”‚ โ”‚ โ”‚ โ”‚ โ€ข ็”จๆˆท่ฎค่ฏ โ”‚ โ€ข ไธšๅŠก้€ป่พ‘ โ”‚ โ€ข ๆ•ฐๆฎ่ฎฟ้—ฎ โ”‚ โ”‚ โ”‚ โ”‚ โ€ข ๅบ—้“บๆŸฅ่ฏข โ”‚ โ€ข ไบ‹ๅŠก็ฎก็† โ”‚ โ€ข SQL ๆ‰ง่กŒ โ”‚ โ”‚ โ”‚ โ”‚ โ€ข ็ง’ๆ€ๆŽฅๅฃ โ”‚ โ€ข ็ผ“ๅญ˜็ญ–็•ฅ โ”‚ โ€ข ็ป“ๆžœๆ˜ ๅฐ„ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ–ผ โ–ผ โ–ผ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ MySQL โ”‚ โ”‚ Redis โ”‚ โ”‚ Kafka โ”‚ โ”‚ ๆ•ฐๆฎๅญ˜ๅ‚จๅฑ‚ โ”‚ โ”‚ ็ผ“ๅญ˜/้”/GEO โ”‚ โ”‚ ๆถˆๆฏ้˜Ÿๅˆ— โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ ``` --- ## ๐Ÿš€ ๆ ธๅฟƒๅŠŸ่ƒฝ็‰นๆ€ง ### **1. ้ซ˜ๅนถๅ‘็ง’ๆ€็ณป็ปŸ** **้—ฎ้ข˜่ƒŒๆ™ฏ**๏ผšไผ ็ปŸๆ•ฐๆฎๅบ“ๆ–นๆกˆๅœจ็ง’ๆ€ๅœบๆ™ฏไธ‹ไผšๅ‡บ็Žฐ่ถ…ๅ–ใ€ๆ€ง่ƒฝ็“ถ้ขˆ็ญ‰้—ฎ้ข˜ใ€‚ **่งฃๅ†ณๆ–นๆกˆ**๏ผš ``` ็”จๆˆท่ฏทๆฑ‚ โ†’ Redis ้ข„ๆ‰ฃๅ‡ๅบ“ๅญ˜ โ†’ Kafka ๅผ‚ๆญฅไธ‹ๅ• โ†’ ๆ•ฐๆฎๅบ“ๆœ€็ปˆไธ€่‡ดๆ€ง ``` **ๆŠ€ๆœฏไบฎ็‚น**๏ผš - โœ… **Redis ๅˆ†ๅธƒๅผ้”** - ้˜ฒๆญข่ถ…ๅ–๏ผŒQPS ๆๅ‡ 10 ๅ€ - โœ… **Kafka ๅ‰Šๅณฐๅกซ่ฐท** - ๅณฐๅ€ผๆต้‡ๅนณๆป‘ๅค„็† - โœ… **ๅบ“ๅญ˜้ข„็ƒญ** - ๆดปๅŠจๅผ€ๅง‹ๅ‰ๅŠ ่ฝฝๅˆฐ Redis - โœ… **้™ๆต็†”ๆ–ญ** - Sentinel ไฟๆŠค็ณป็ปŸไธๅดฉๆบƒ - โœ… **ๅน‚็ญ‰ๆ€ง่ฎพ่ฎก** - ้˜ฒๆญข้‡ๅค่ดญไนฐ **ๆ€ง่ƒฝๆŒ‡ๆ ‡**๏ผš - ๆ”ฏๆ’‘ **5000+ QPS** ๅนถๅ‘ - ๅ“ๅบ”ๆ—ถ้—ด **P99 < 200ms** - ๅบ“ๅญ˜ๅ‡†็กฎ็އ **99.99%** ### **2. LBS ๅœฐ็†ไฝ็ฝฎๆœๅŠก** **ๅŠŸ่ƒฝ**๏ผšๆŸฅๆ‰พ้™„่ฟ‘็š„ๆกŒๆธธๅบ—ๅนถๆŽจ่ **ๆŠ€ๆœฏๅฎž็Žฐ**๏ผš ```java // Redis GEO ๅญ˜ๅ‚จๅบ—้“บไฝ็ฝฎ redisTemplate.opsForGeo().add("shops", new Point(118.796877, 32.060255), "ๅ—ไบฌๆ–ฐ่ก—ๅฃๅบ—"); // ๆŸฅ่ฏขๅ‘จ่พน 5km ๅ†…็š„ๅบ—้“บ Circle within = new Circle( new Point(userLng, userLat), new Distance(5, Metrics.KILOMETERS)); GeoResults> results = redisTemplate.opsForGeo().search("shops", within); ``` **ไผ˜ๅŠฟ**๏ผš - โœ… ๆŸฅ่ฏข้€Ÿๅบฆ **O(1)** ๆ—ถ้—ดๅคๆ‚ๅบฆ - โœ… ๆ”ฏๆŒๅŠจๆ€ๆ›ดๆ–ฐๅบ—้“บไฝ็ฝฎ - โœ… ๅฏ่ฎก็ฎ—่ท็ฆปๅนถๆŽ’ๅบ ### **3. ๅฎžๆ—ถๅŒน้…็ณป็ปŸ** **ๅœบๆ™ฏ**๏ผšๅฟซ้€Ÿๆ‰พๅˆฐ็Žฉไผด๏ผŒ็ป„ๅปบๆธธๆˆๅฑ€ **ๆŠ€ๆœฏๆ–นๆกˆ**๏ผš ``` WebSocket ้•ฟ่ฟžๆŽฅ โ†’ ๅŒน้…ๆฑ ็ฎก็† โ†’ ๅŒน้…็ฎ—ๆณ• โ†’ ๆŽจ้€็ป“ๆžœ ``` **็‰น็‚น**๏ผš - โœ… **ไฝŽๅปถ่ฟŸ** - ๆฏซ็ง’็บงๆถˆๆฏๆŽจ้€ - โœ… **้ซ˜ๅนถๅ‘** - ๅ•ๆœๅŠกๅ™จๆ”ฏๆ’‘ 10 ไธ‡ + ่ฟžๆŽฅ - โœ… **ๅฟƒ่ทณๆฃ€ๆต‹** - ่‡ชๅŠจๆ–ญๅผ€ๅคฑๆ•ˆ่ฟžๆŽฅ ### **4. ๅคš็บง็ผ“ๅญ˜ๆžถๆž„** **ๆžถๆž„่ฎพ่ฎก**๏ผš ``` ๆต่งˆๅ™จ็ผ“ๅญ˜ โ†’ Caffeine ๆœฌๅœฐ็ผ“ๅญ˜ โ†’ Redis ๅˆ†ๅธƒๅผ็ผ“ๅญ˜ โ†’ MySQL ```git **็ผ“ๅญ˜็ญ–็•ฅ**๏ผš - **็ƒญ็‚นๆ•ฐๆฎ** - Caffeine + Redis ๅŒ็ผ“ๅญ˜ - **ไธ€่ˆฌๆ•ฐๆฎ** - Redis ็ผ“ๅญ˜ - **ๅ†ทๆ•ฐๆฎ** - ็›ดๆŽฅๆŸฅๆ•ฐๆฎๅบ“ **ๆ•ˆๆžœ**๏ผš - ๆŽฅๅฃๅ“ๅบ”้€Ÿๅบฆๆๅ‡ **80%** - ๆ•ฐๆฎๅบ“ๅŽ‹ๅŠ›้™ไฝŽ **90%** --- ## ๐Ÿ“ฆ ้กน็›ฎ็ป“ๆž„ ``` Tabletop-Link/ โ”œโ”€โ”€ src/ โ”‚ โ”œโ”€โ”€ main/ โ”‚ โ”‚ โ”œโ”€โ”€ java/org/example/tabletoplink/ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ controller/ # RESTful API ๆŽงๅˆถๅ™จ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ service/ # ไธšๅŠก้€ป่พ‘ๅฑ‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ impl/ # ๆœๅŠกๅฎž็Žฐ็ฑป โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ mapper/ # MyBatis ๆ•ฐๆฎ่ฎฟ้—ฎๅฑ‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ entity/ # ๅฎžไฝ“็ฑป โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ dto/ # ๆ•ฐๆฎไผ ่พ“ๅฏน่ฑก โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ vo/ # ่ง†ๅ›พๅฏน่ฑก โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ config/ # ้…็ฝฎ็ฑป โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ common/ # ๅ…ฌๅ…ฑ็ป„ไปถ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ exception/ # ๅผ‚ๅธธๅค„็† โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ result/ # ็ปŸไธ€่ฟ”ๅ›ž็ป“ๆžœ โ”‚ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ util/ # ๅทฅๅ…ท็ฑป โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ aspect/ # AOP ๅˆ‡้ข โ”‚ โ”‚ โ””โ”€โ”€ resources/ โ”‚ โ”‚ โ”œโ”€โ”€ mapper/ # MyBatis XML ๆ˜ ๅฐ„ๆ–‡ไปถ โ”‚ โ”‚ โ”œโ”€โ”€ application.yml # ้…็ฝฎๆ–‡ไปถ โ”‚ โ”‚ โ””โ”€โ”€ scripts/ # Lua ่„šๆœฌ็ญ‰ โ”‚ โ””โ”€โ”€ test/ # ๆต‹่ฏ•ไปฃ็  โ”œโ”€โ”€ tabletop-link-web/ # ๅ‰็ซฏ้กน็›ฎ โ”‚ โ”œโ”€โ”€ src/ โ”‚ โ”‚ โ”œโ”€โ”€ components/ # React ็ป„ไปถ โ”‚ โ”‚ โ”œโ”€โ”€ pages/ # ้กต้ข โ”‚ โ”‚ โ”œโ”€โ”€ lib/ # ๅทฅๅ…ทๅบ“ โ”‚ โ”‚ โ””โ”€โ”€ assets/ # ้™ๆ€่ต„ๆบ โ”‚ โ””โ”€โ”€ dist/ # ๆž„ๅปบไบง็‰ฉ โ”œโ”€โ”€ docker/ # Docker ้…็ฝฎ โ”‚ โ””โ”€โ”€ docker-compose.yml โ”œโ”€โ”€ jmeter/ # JMeter ๅŽ‹ๆต‹่„šๆœฌ โ”œโ”€โ”€ mock_data.sql # ๆต‹่ฏ•ๆ•ฐๆฎ โ””โ”€โ”€ pom.xml # Maven ้…็ฝฎ ``` --- ## ๐Ÿ”ง ๅฟซ้€Ÿๅผ€ๅง‹ ### **็Žฏๅขƒ่ฆๆฑ‚** - JDK 17+ - Maven 3.9+ - Node.js 18+ - Docker & Docker Compose - MySQL 8.0+ - Redis 7.0+ - Kafka 3.4+ ### **ๆ–นๅผไธ€๏ผšDocker ไธ€้”ฎ้ƒจ็ฝฒ๏ผˆๆŽจ่๏ผ‰** ```bash # 1. ๅ…‹้š†้กน็›ฎ git clone https://github.com/yourusername/tabletop-link.git cd tabletop-link # 2. ๅคๅˆถ็Žฏๅขƒๅ˜้‡ๆ–‡ไปถ cp .env.example .env # 3. ไฟฎๆ”น .env ไธญ็š„ๅฏ†็ ้…็ฝฎ # 4. ๅฏๅŠจๆ‰€ๆœ‰ๆœๅŠก docker-compose up -d # 5. ๆŸฅ็œ‹ๆ—ฅๅฟ— docker-compose logs -f # 6. ่ฎฟ้—ฎๆœๅŠก # ๅ‰็ซฏ๏ผšhttp://localhost # ๅŽ็ซฏ API: http://localhost:8080 # Swagger ๆ–‡ๆกฃ๏ผšhttp://localhost:8080/swagger-ui.html ``` ### **ๆ–นๅผไบŒ๏ผšๆœฌๅœฐๅผ€ๅ‘็Žฏๅขƒ** #### **1. ๅฏๅŠจไธญ้—ดไปถ** ```bash # ไฝฟ็”จ Docker Compose ๅชๅฏๅŠจไพ่ต–ๆœๅŠก cd docker docker-compose up -d mysql redis kafka ``` #### **2. ๅˆๅง‹ๅŒ–ๆ•ฐๆฎๅบ“** ```bash # ๅฏผๅ…ฅ่กจ็ป“ๆž„ mysql -h 127.0.0.1 -P 3307 -u root -p dieroller_db < src/main/resources/db/schema.sql # ๅฏผๅ…ฅๆต‹่ฏ•ๆ•ฐๆฎ mysql -h 127.0.0.1 -P 3307 -u root -p dieroller_db < mock_data.sql ``` #### **3. ๅฏๅŠจๅŽ็ซฏ** ```bash # ็ผ–่ฏ‘้กน็›ฎ ./mvnw clean package -DskipTests # ๅฏๅŠจๅบ”็”จ java -jar target/Tabletop-Link-0.0.1-SNAPSHOT.jar # ๆˆ–็›ดๆŽฅ่ฟ่กŒ๏ผˆๅผ€ๅ‘ๆจกๅผ๏ผ‰ ./mvnw spring-boot:run ``` #### **4. ๅฏๅŠจๅ‰็ซฏ** ```bash cd tabletop-link-web # ๅฎ‰่ฃ…ไพ่ต– npm install # ๅฏๅŠจๅผ€ๅ‘ๆœๅŠกๅ™จ npm run dev # ๆž„ๅปบ็”Ÿไบง็‰ˆๆœฌ npm run build ``` --- ## ๐Ÿ“Š API ๆŽฅๅฃๆ–‡ๆกฃ ### **ไธป่ฆๆŽฅๅฃๅˆ—่กจ** | ๆจกๅ— | ๆŽฅๅฃ | ๆ–นๆณ• | ๆ่ฟฐ | |------|------|------|------| | **็”จๆˆท** | `/api/user/login` | POST | ็”จๆˆท็™ปๅฝ• | | | `/api/user/register` | POST | ็”จๆˆทๆณจๅ†Œ | | | `/api/user/profile` | GET | ่Žทๅ–ไธชไบบไฟกๆฏ | | **ๅบ—้“บ** | `/api/shop/list` | GET | ๅบ—้“บๅˆ—่กจ | | | `/api/shop/{id}` | GET | ๅบ—้“บ่ฏฆๆƒ… | | | `/api/shop/nearby` | GET | ้™„่ฟ‘ๅบ—้“บ๏ผˆLBS๏ผ‰ | | **็ง’ๆ€** | `/api/seckill/execute` | POST | ๆ‰ง่กŒ็ง’ๆ€ | | | `/api/seckill/result` | GET | ๆŸฅ่ฏข็ง’ๆ€็ป“ๆžœ | | **่ฎขๅ•** | `/api/order/create` | POST | ๅˆ›ๅปบ่ฎขๅ• | | | `/api/order/list` | GET | ่ฎขๅ•ๅˆ—่กจ | | **ๅŒน้…** | `/api/match/join` | POST | ๅŠ ๅ…ฅๅŒน้…ๆฑ  | | | `/api/match/cancel` | POST | ๅ–ๆถˆๅŒน้… | ### **่ฐƒ็”จ็คบไพ‹** ```bash # ็™ปๅฝ•ๆŽฅๅฃ curl -X POST http://localhost:8080/api/user/login \ -H "Content-Type: application/json" \ -d '{"phone":"13800138000","code":"123456"}' # ๆŸฅ่ฏข้™„่ฟ‘ๅบ—้“บ curl -X GET "http://localhost:8080/api/shop/nearby?lng=118.79&lat=32.06&radius=5" # ๆ‰ง่กŒ็ง’ๆ€ curl -X POST http://localhost:8080/api/seckill/execute \ -H "Content-Type: application/json" \ -H "Authorization: Bearer " \ -d '{"voucherId":1}' ``` --- ## ๐Ÿงช ๆต‹่ฏ• ### **ๅ•ๅ…ƒๆต‹่ฏ•** ```bash # ่ฟ่กŒๆ‰€ๆœ‰ๆต‹่ฏ• ./mvnw test # ่ฟ่กŒ็‰นๅฎšๆต‹่ฏ•็ฑป ./mvnw test -Dtest=SeckillServiceTest # ็”Ÿๆˆๆต‹่ฏ•่ฆ†็›–็އๆŠฅๅ‘Š ./mvnw clean test jacoco:report ``` ### **ๅŽ‹ๅŠ›ๆต‹่ฏ•** ไฝฟ็”จ JMeter ่ฟ›่กŒ้ซ˜ๅนถๅ‘ๆต‹่ฏ•๏ผš ```bash # ๆ‰“ๅผ€ JMeter jmeter -n -t jmeter/VoucherSeckillTest.jmx -l result.jtl # ๆŸฅ็œ‹ Summary Report jmeter -n -t jmeter/Summary_Report.jmx ``` **ๆต‹่ฏ•็ป“ๆžœ**๏ผˆ4 ๆ ธ 8G ๆœๅŠกๅ™จ๏ผ‰๏ผš - ๅนถๅ‘ๆ•ฐ๏ผš1000 - ๅžๅ้‡๏ผš**5234 TPS** - ้”™่ฏฏ็އ๏ผš**0.01%** - ๅนณๅ‡ๅ“ๅบ”ๆ—ถ้—ด๏ผš**89ms** --- ## ๐Ÿ“ˆ ็›‘ๆŽงไธŽ่ฟ็ปด ### **่ฎฟ้—ฎ Prometheus ็›‘ๆŽง้ขๆฟ** ``` http://localhost:9090 ``` ### **ๅ…ณ้”ฎ็›‘ๆŽงๆŒ‡ๆ ‡** - โœ… JVM ๅ†…ๅญ˜ไฝฟ็”จ็އ - โœ… GC ๆฌกๆ•ฐไธŽ่€—ๆ—ถ - โœ… ๆ•ฐๆฎๅบ“่ฟžๆŽฅๆฑ ็Šถๆ€ - โœ… Redis ่ฟžๆŽฅๆ•ฐ - โœ… Kafka ๆถˆ่ดน็งฏๅŽ‹ - โœ… ๆŽฅๅฃ QPS ไธŽๅ“ๅบ”ๆ—ถ้—ด - โœ… ็ง’ๆ€ๅบ“ๅญ˜ไฝ™้‡ ### **ๆŸฅ็œ‹ๅบ”็”จๆ—ฅๅฟ—** ```bash # ๅŽ็ซฏๆ—ฅๅฟ— docker-compose logs -f backend # MySQL ๆ—ฅๅฟ— docker-compose logs -f mysql # Redis ๆ—ฅๅฟ— docker-compose logs -f redis ``` --- ## ๐Ÿ”’ ๅฎ‰ๅ…จๅฎž่ทต ### **ๅทฒๅฎž็Žฐ็š„ๅฎ‰ๅ…จๆŽชๆ–ฝ** - โœ… **SQL ๆณจๅ…ฅ้˜ฒๆŠค** - MyBatis ๅ‚ๆ•ฐ็ป‘ๅฎš - โœ… **XSS ๆ”ปๅ‡ป้˜ฒๆŠค** - ่พ“ๅ…ฅ่ฟ‡ๆปคไธŽ่ฝฌไน‰ - โœ… **CSRF ้˜ฒๆŠค** - Token ้ชŒ่ฏๆœบๅˆถ - โœ… **ๅฏ†็ ๅŠ ๅฏ†** - BCrypt ๅŠ ๅฏ†ๅญ˜ๅ‚จ - โœ… **ๆ•ๆ„Ÿไฟกๆฏ่„ฑๆ•** - ๆ‰‹ๆœบๅทใ€่บซไปฝ่ฏๅท - โœ… **้™ๆต้˜ฒๅˆท** - ๅ•็”จๆˆท่ฎฟ้—ฎ้ข‘็އ้™ๅˆถ - โœ… **ๅˆ†ๅธƒๅผ้”** - ้˜ฒๆญขๅนถๅ‘็ฏกๆ”นๅบ“ๅญ˜ ### **ๅพ…ๅฎŒๅ–„็š„ๅฎ‰ๅ…จๅŠ ๅ›บ** - โณ HTTPS ่ฏไนฆ้…็ฝฎ - โณ ๆ•ๆ„Ÿๆ“ไฝœไบŒๆฌก้ชŒ่ฏ - โณ IP ้ป‘ๅๅ•ๆœบๅˆถ - โณ ้ฃŽๆŽง็ณป็ปŸๆŽฅๅ…ฅ --- ## ๐Ÿšง ๅŽ็ปญไผ˜ๅŒ–ๆ–นๅ‘ ### **็ŸญๆœŸ่ฎกๅˆ’๏ผˆv1.1๏ผ‰** - [ ] ๆŽฅๅ…ฅ้˜ฟ้‡Œไบ‘ OSS ๅ›พ็‰‡ๅญ˜ๅ‚จ - [ ] ๅฎž็Žฐๆ™บ่ƒฝๆŽจ่็ฎ—ๆณ• - [ ] ๅขžๅŠ ็”จๆˆท่ฏ„ไปท็ณป็ปŸ - [ ] ไผ˜ๅŒ–ๆœ็ดขๅŠŸ่ƒฝ๏ผˆElasticsearch๏ผ‰ ### **ไธญๆœŸ่ฎกๅˆ’๏ผˆv2.0๏ผ‰** - [ ] ๅผ€ๅ‘ๅพฎไฟกๅฐ็จ‹ๅบ็ซฏ - [ ] ๅผ•ๅ…ฅ AI ๅฎขๆœๆœบๅ™จไบบ - [ ] ๆญๅปบๅคงๆ•ฐๆฎๅˆ†ๆžๅนณๅฐ - [ ] ๆ”ฏๆŒๅคšไบบๅœจ็บฟ่ง†้ข‘ๅฏนๆˆ˜ ### **้•ฟๆœŸๆ„ฟๆ™ฏ** - ๆ‰“้€ ๅ…จๅ›ฝๆœ€ๅคง็š„ๆกŒๆธธ็ˆฑๅฅฝ่€…็คพๅŒบ - ่ฟžๆŽฅ 1000+ ๅŸŽๅธ‚ใ€10000+ ๆกŒๆธธๅฎžไฝ“ๅบ— - ๆ—ฅๆดป็”จๆˆท็ช็ ด 100 ไธ‡ --- ## ๐Ÿ‘ฅ ๅ›ข้˜Ÿๅไฝœ ### **Git ๆไบค่ง„่Œƒ** ๆœฌ้กน็›ฎ้ตๅพช [Conventional Commits](https://www.conventionalcommits.org/) ่ง„่Œƒ๏ผš ```bash feat: ๆ–ฐๅŠŸ่ƒฝ fix: ไฟฎๅค bug docs: ๆ–‡ๆกฃๆ›ดๆ–ฐ style: ไปฃ็ ๆ ผๅผ่ฐƒๆ•ด refactor: ้‡ๆž„ไปฃ็  test: ๆต‹่ฏ•็›ธๅ…ณ chore: ๆž„ๅปบ/ๅทฅๅ…ท้“พ็›ธๅ…ณ ``` **็คบไพ‹**๏ผš ```bash git commit -m "feat(seckill): ๆทปๅŠ  Redis ๅˆ†ๅธƒๅผ้”้˜ฒๆญข่ถ…ๅ– ไธบ่งฃๅ†ณ้ซ˜ๅนถๅ‘ๅœบๆ™ฏไธ‹็š„ๅบ“ๅญ˜่ถ…ๅ–้—ฎ้ข˜๏ผŒๅผ•ๅ…ฅ Redisson ๅˆ†ๅธƒๅผ้”ใ€‚ ็›ธๆฏ”ๆ•ฐๆฎๅบ“่กŒ้”ๆ–นๆกˆ๏ผŒๆ€ง่ƒฝๆๅ‡็บฆ 10 ๅ€๏ผŒๆ”ฏๆ’‘ 5000+ QPSใ€‚ Closes #123" ``` ### **ๅผ€ๅ‘ๆต็จ‹** 1. Fork ๆœฌไป“ๅบ“ 2. ๅˆ›ๅปบ็‰นๆ€งๅˆ†ๆ”ฏ (`git checkout -b feature/AmazingFeature`) 3. ๆไบคๆ›ดๆ”น (`git commit -m 'Add some AmazingFeature'`) 4. ๆŽจ้€ๅˆฐๅˆ†ๆ”ฏ (`git push origin feature/AmazingFeature`) 5. ๅผ€ๅฏ Pull Request --- ## ๐Ÿ“„ ๅผ€ๆบๅ่ฎฎ ๆœฌ้กน็›ฎ้‡‡็”จ [MIT License](LICENSE) ๅผ€ๆบๅ่ฎฎ๏ผŒๅ…่ฎธไปปไฝ•ไบบ่‡ช็”ฑไฝฟ็”จใ€ไฟฎๆ”นๅ’Œๅˆ†ๅ‘ใ€‚ --- ## ๐Ÿ™ ่‡ด่ฐข ๆ„Ÿ่ฐขไปฅไธ‹ๅผ€ๆบ้กน็›ฎ๏ผš - [Spring Boot](https://spring.io/projects/spring-boot) - [MyBatis-Plus](https://baomidou.com/) - [Redis](https://redis.io/) - [Apache Kafka](https://kafka.apache.org/) - [React](https://react.dev/) ---
**ๅฆ‚ๆžœ่ฟ™ไธช้กน็›ฎๅฏนไฝ ๆœ‰ๅธฎๅŠฉ๏ผŒ่ฏท็ป™ไธ€ไธช โญ Star๏ผ** ๐ŸŽฒ ๆŽท้ชฐ่€… ยท ่ฎฉๆกŒๆธธๆ›ดๆœ‰่ถฃ