一个基于 Spring Boot + WebSocket + MySQL + AI 的智能实时双人在线聊天室系统,通过AI内容分析技术,鼓励用户文明聊天,让人们"好好说话"。
┌─────────────────────────────────────────────────────────────────────────────────────────────────┐
│ 🎾 双人在线聊天室系统 - "让人们好好说话" │
│ System Architecture │
└─────────────────────────────────────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────┐
│ 👤 用户层 │
│ (Frontend Layer) │
└─────────────────────────────────┘
│
┌─────────────────────────────────┼─────────────────────────────────┐
│ │ │
┌─────────────────────┐ ┌─────────────────────┐ ┌─────────────────────┐
│ 📱 Web Frontend │ │ 💬 Chat Interface │ │ 🛡️ Security Layer │
│ │ │ │ │ │
│ • login.html │ │ • chat-enhanced.html│ │ • JWT Token Auth │
│ • register.html │ │ • WebSocket Client │ │ • Session Management│
│ • CSS/JS Assets │ │ • Real-time UI │ │ • CORS Config │
│ • Form Validation │ │ • Message Display │ │ • XSS Protection │
└─────────────────────┘ └─────────────────────┘ └─────────────────────┘
│ │ │
└─────────────────────────────────┼─────────────────────────────────┘
│
┌─────────────────────────────────┐
│ 🌐 网络层 │
│ (Network Layer) │
└─────────────────────────────────┘
│
┌─────────────────────────────────┼─────────────────────────────────┐
│ │ │
┌─────────────────────┐ ┌─────────────────────┐ ┌─────────────────────┐
│ 📡 HTTP/REST API │ │ 🔌 WebSocket │ │ 🔒 Authentication │
│ │ │ │ │ │
│ • POST /api/login │ │ • ws://*/ws/chat │ │ • JWT Validation │
│ • POST /api/register│ │ • Real-time Comm │ │ • Token Refresh │
│ • POST /api/chat/* │ │ • Message Broadcast │ │ • User Session │
│ • GET /api/scores/* │ │ • User Join/Leave │ │ • Security Filter │
└─────────────────────┘ └─────────────────────┘ └─────────────────────┘
│ │ │
└─────────────────────────────────┼─────────────────────────────────┘
│
┌─────────────────────────────────┐
│ ⚙️ 控制层 │
│ (Controller Layer) │
└─────────────────────────────────┘
│
┌─────────────────────────────────┼─────────────────────────────────┐
│ │ │
┌─────────────────────┐ ┌─────────────────────┐ ┌─────────────────────┐
│ 👥 User Controller │ │ 💬 Chat Controller │ │ 📊 Score Controller│
│ │ │ │ │ │
│ • LoginController │ │ • ChatRoomController│ │ • ScoreController │
│ • RegisterController│ │ • MessageController │ │ • LeaderboardCtrl │
│ • User Management │ │ • Room Management │ │ • Achievement Mgmt │
│ • JWT Generation │ │ • History Query │ │ • Analytics API │
└─────────────────────┘ └─────────────────────┘ └─────────────────────┘
│ │ │
└─────────────────────────────────┼─────────────────────────────────┘
│
┌─────────────────────────────────┐
│ 🔧 业务层 │
│ (Service Layer) │
└─────────────────────────────────┘
│
┌─────────────────────────────────┼─────────────────────────────────┐
│ │ │
┌─────────────────────┐ ┌─────────────────────┐ ┌─────────────────────┐
│ 🔐 Auth Service │ │ 💬 Chat Service │ │ 🤖 AI Service │
│ │ │ │ │ │
│ • User Auth Logic │ │ • Message Processing│ │ • Content Analysis │
│ • Password Encrypt │ │ • Room Management │ │ • Toxicity Detection│
│ • Session Handling │ │ • History Storage │ │ • Sentiment Analysis│
│ • Security Validation│ │ • Real-time Sync │ │ • Keyword Filter │
└─────────────────────┘ └─────────────────────┘ └─────────────────────┘
│ │ │
│ │ │
┌─────────────────────┐ ┌─────────────────────┐ ┌─────────────────────┐
│ 🏆 Score Service │ │ 📈 Analytics Svc │ │ 🔔 Notification │
│ │ │ │ │ │
│ • Score Calculation │ │ • User Behavior │ │ • Real-time Alert │
│ • Level Management │ │ • Statistics Report │ │ • Achievement Push │
│ • Achievement System│ │ • Trend Analysis │ │ • Warning System │
│ • Leaderboard Logic │ │ • Data Insights │ │ • Progress Update │
└─────────────────────┘ └─────────────────────┘ └─────────────────────┘
│ │ │
└─────────────────────────────────┼─────────────────────────────────┘
│
┌─────────────────────────────────┐
│ 🗃️ 数据层 │
│ (Data Layer) │
└─────────────────────────────────┘
│
┌─────────────────────────────────┼─────────────────────────────────┐
│ │ │
┌─────────────────────┐ ┌─────────────────────┐ ┌─────────────────────┐
│ 📊 Repository │ │ 🔄 MyBatis Mapper │ │ 💾 Cache Layer │
│ │ │ │ │ │
│ • UserRepository │ │ • ControlsMapper │ │ • Redis Cache │
│ • ChatMessageRepo │ │ • LoginMapper │ │ • Session Cache │
│ • ChatRoomRepo │ │ • RegisterMapper │ │ • Message Cache │
│ • ScoreRepository │ │ • ChatRoomMapper │ │ • User State Cache │
└─────────────────────┘ └─────────────────────┘ └─────────────────────┘
│ │ │
└─────────────────────────────────┼─────────────────────────────────┘
│
┌─────────────────────────────────┐
│ 🗄️ 存储层 │
│ (Storage Layer) │
└─────────────────────────────────┘
│
┌─────────────────────────────────┼─────────────────────────────────┐
│ │ │
┌─────────────────────┐ ┌─────────────────────┐ ┌─────────────────────┐
│ 🗃️ MySQL Database │ │ 📁 File Storage │ │ 🔍 Search Engine │
│ │ │ │ │ │
│ • user_information │ │ • Static Assets │ │ • Message Index │
│ • chat_rooms │ │ • User Avatars │ │ • Content Search │
│ • chat_messages │ │ • File Uploads │ │ • History Query │
│ • user_scores │ │ • Log Files │ │ • Analytics Data │
│ • ai_analysis_results│ │ • Backup Files │ │ • Report Generation │
└─────────────────────┘ └─────────────────────┘ └─────────────────────┘
┌─────────────────────────────────┐
│ 🌐 外部服务层 │
│ (External Services) │
└─────────────────────────────────┘
│
┌─────────────────────────────────┼─────────────────────────────────┐
│ │ │
┌─────────────────────┐ ┌─────────────────────┐ ┌─────────────────────┐
│ 🤖 AI/ML Services │ │ 📧 Email Service │ │ 📱 Push Service │
│ │ │ │ │ │
│ • LLM API (DashScope)│ │ • Registration Mail │ │ • Mobile Push │
│ • Toxicity Detection│ │ • Password Reset │ │ • Browser Notify │
│ • Sentiment Analysis│ │ • Notification Mail │ │ • Real-time Alert │
│ • Content Filter │ │ • System Announcements│ │ • Status Update │
└─────────────────────┘ └─────────────────────┘ └─────────────────────┘
好好说话,是一个基于斯坦福商学院提出的 “人际关系网球场理论” 的沟通训练产品,旨在帮助用户提升对话中的自我觉察与边界感,改善人际沟通质量。 该项目以「对话是否越界」为核心识别线索,构建了一套训练机制,通过网页端互动游戏,帮助用户在安全环境中练习好好说话。
很多人际关系的摩擦,源于我们无意识地“越网”发言,比如把自己的观点强加给对方、擅自解读他人的感受、对他人的人生提过度建议等。而这些行为往往在亲密关系、职场沟通、朋友聊天中屡见不鲜。
我们希望借助“网球场”这一可视化隐喻,把“你的场” vs “我的场”变得直观,帮助用户: • 理解哪些表达属于“越网行为” • 学会倾听与回应而不是控制 • 提升与人沟通时的安全感和信任感
✅ 对话越网识别器
识别用户在聊天或提问中的“越网”行为,给予即时反馈。
🎾 网球场模型交互式可视化
基于人际关系网球场理论,构建“你场 / 我场”可视化区域,训练识别边界。
📚 场景化练习关卡
涵盖亲密关系、职场沟通、朋友聊天等典型场景,通过选择题和开放式训练提升敏感度。
📖 沟通建议生成
通过 AI 分析用户表达方式,给出更具同理心、不越界的替代表达建议。
🧠 沉浸式情景学习
结合 AI 角色与真实语境构建“沟通训练场”,在游戏化过程中提升共情力与边界意识。
- Java 17 - 编程语言
- Spring Boot 3.5.0 - 应用框架
- Spring Security - 安全认证框架
- Spring Data JPA - 数据访问层
- MyBatis - ORM框架
- WebSocket - 实时通信
- MySQL 8.0 - 数据库
- Redis - 缓存中间件
- Druid - 数据库连接池
- JWT - 身份认证
- Maven - 项目构建工具
- 大语言模型 - 内容理解和情感分析
- 自然语言处理 - 文本分析和关键词识别
- 情感计算 - 消息情感倾向分析
- 内容分类 - 不当内容自动识别
- 机器学习 - 持续学习和优化分析准确性
- 文本分析API - 高效的内容分析服务
- HTML5 - 页面结构
- CSS3 - 样式设计
- JavaScript - 交互逻辑
- WebSocket API - 实时通信
- Bootstrap - UI框架
- jQuery - JavaScript库
- Swagger - API文档
- Logback - 日志管理
- Lombok - 代码简化
- Java 17+
- MySQL 8.0+
- Maven 3.6+
- Redis 6.0+ (可选)
git clone https://github.com/lingview/tennis-voice-chat.git
cd tennis-voice-chat创建 MySQL 数据库并导入 SQL 文件:
-- 创建数据库
CREATE DATABASE chat CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
-- 导入数据表结构
source chat.sql;修改 src/main/resources/application.yml 配置文件:
spring:
datasource:
url: jdbc:mysql://localhost:3306/chat?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
username: root
password: your_password
driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
hibernate:
ddl-auto: update
show-sql: true
redis:
host: localhost
port: 6379
password: your_redis_password# 安装依赖
mvn clean install
# 运行项目
mvn spring-boot:run- 系统地址:http://localhost:8080
- 登录页面:http://localhost:8080/login.html
- 注册页面:http://localhost:8080/register.html
- 聊天界面:http://localhost:8080/chat-enhanced.html
- API文档:http://localhost:8080/swagger-ui.html
包含用户基本信息和积分系统
CREATE TABLE `user_information` (
`id` int NOT NULL AUTO_INCREMENT COMMENT 'id,自增',
`username` varchar(255) NOT NULL COMMENT '用户名,不能重复',
`email` varchar(255) NOT NULL COMMENT '邮箱',
`password` varchar(255) NOT NULL COMMENT '密码,使用BCrypt加密',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`status` int NOT NULL COMMENT '用户状态,普通用户:1,管理员:0,封禁用户:2',
PRIMARY KEY (`id`),
UNIQUE KEY `username` (`username`)
) ENGINE=InnoDB;CREATE TABLE `chat_room` (
`uuid` varchar(255) NOT NULL COMMENT '房间的唯一id',
`create_user` varchar(255) NOT NULL COMMENT '创建人',
`status` int NOT NULL COMMENT '1为正常 2为关闭',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`uuid`),
KEY `create_user` (`create_user`),
CONSTRAINT `create_user` FOREIGN KEY (`create_user`) REFERENCES `user_information` (`username`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB;CREATE TABLE `chat_messages` (
`id` bigint NOT NULL AUTO_INCREMENT,
`room_uuid` varchar(255) NOT NULL COMMENT '房间UUID',
`sender_username` varchar(255) NOT NULL COMMENT '发送者用户名',
`message_type` int NOT NULL DEFAULT '1' COMMENT '消息类型: 1=文本, 2=系统, 3=图片',
`content` text NOT NULL COMMENT '消息内容',
`send_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '发送时间',
`status` int NOT NULL DEFAULT '1' COMMENT '状态: 1=正常, 2=已删除',
`reply_to_id` bigint DEFAULT NULL COMMENT '回复消息ID',
PRIMARY KEY (`id`),
KEY `idx_room_uuid` (`room_uuid`),
KEY `idx_sender_username` (`sender_username`),
KEY `idx_send_time` (`send_time`)
) ENGINE=InnoDB;记录用户文明聊天积分变化
CREATE TABLE `user_scores` (
`id` bigint NOT NULL AUTO_INCREMENT,
`username` varchar(255) NOT NULL COMMENT '用户名',
`message_id` bigint NOT NULL COMMENT '消息 ID',
`score_change` int NOT NULL COMMENT '积分变化:+1 或 -1',
`reason` varchar(500) NOT NULL COMMENT '变化原因:文明或越网',
`ai_analysis` text COMMENT 'AI分析结果详情',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '记录时间',
`current_total_score` int NOT NULL DEFAULT '0' COMMENT '当前总积分',
PRIMARY KEY (`id`),
KEY `idx_username` (`username`),
KEY `idx_message_id` (`message_id`),
KEY `idx_create_time` (`create_time`),
CONSTRAINT `fk_user_scores_username` FOREIGN KEY (`username`) REFERENCES `user_information` (`username`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB;存储消息的AI分析详细结果
CREATE TABLE `ai_analysis_results` (
`id` bigint NOT NULL AUTO_INCREMENT,
`message_id` bigint NOT NULL COMMENT '消息 ID',
`analysis_type` varchar(50) NOT NULL COMMENT '分析类型:sentiment/toxicity/keywords',
`analysis_result` text NOT NULL COMMENT '分析结果 JSON',
`confidence_score` decimal(3,2) NOT NULL COMMENT '置信度分数 0-1',
`is_violation` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否违规:0=正常 1=越网',
`keywords_detected` text COMMENT '检测到的关键词',
`sentiment_score` decimal(3,2) COMMENT '情感分数 -1到1',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '分析时间',
PRIMARY KEY (`id`),
KEY `idx_message_id` (`message_id`),
KEY `idx_analysis_type` (`analysis_type`),
KEY `idx_is_violation` (`is_violation`),
KEY `idx_create_time` (`create_time`),
CONSTRAINT `fk_ai_analysis_message` FOREIGN KEY (`message_id`) REFERENCES `chat_messages` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB;POST /api/register
Content-Type: application/json
{
"username": "testuser",
"email": "test@example.com",
"password": "password123"
}POST /api/login
Content-Type: application/json
{
"username": "testuser",
"password": "password123"
}响应示例:
{
"success": true,
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"username": "testuser",
"message": "登录成功"
}POST /api/chat/create
Authorization: Bearer <token>POST /api/chat/join
Authorization: Bearer <token>
Content-Type: application/json
{
"roomId": "room-uuid"
}GET /api/chat/history/{roomId}
Authorization: Bearer <token>POST /api/chat/close
Authorization: Bearer <token>
Content-Type: application/json
{
"roomId": "room-uuid"
}GET /api/ai/analysis/{messageId}
Authorization: Bearer <token>响应示例:
{
"success": true,
"data": {
"messageId": 123,
"isViolation": false,
"sentimentScore": 0.8,
"confidenceScore": 0.95,
"analysisType": "sentiment",
"keywordsDetected": ["hello", "good"],
"analysisResult": {
"sentiment": "positive",
"toxicity": "low",
"emotion": "friendly"
}
}
}POST /api/ai/reanalyze
Authorization: Bearer <token>
Content-Type: application/json
{
"messageId": 123
}GET /api/scores/user/{username}
Authorization: Bearer <token>响应示例:
{
"success": true,
"data": {
"username": "testuser",
"totalScore": 85,
"level": "civilized",
"levelName": "文明用户",
"nextLevelScore": 100,
"positiveMsgCount": 90,
"negativeMsgCount": 5,
"achievements": [
{
"name": "文明使者",
"description": "连续30条正面消息",
"unlockedAt": "2025-07-26T10:30:00Z"
}
]
}
}GET /api/scores/history/{username}?page=1&size=20
Authorization: Bearer <token>GET /api/scores/leaderboard?limit=10
Authorization: Bearer <token>响应示例:
{
"success": true,
"data": {
"leaderboard": [
{
"rank": 1,
"username": "civilized_user",
"totalScore": 245,
"level": "exemplary",
"levelName": "模范用户"
},
{
"rank": 2,
"username": "friendly_user",
"totalScore": 189,
"level": "civilized",
"levelName": "文明用户"
}
]
}
}ws://localhost:8080/ws/chat
加入房间:
{
"type": "join",
"roomId": "room-uuid",
"username": "username"
}发送消息:
{
"type": "message",
"roomId": "room-uuid",
"username": "username",
"content": "Hello World!"
}离开房间:
{
"type": "leave",
"roomId": "room-uuid",
"username": "username"
}AI分析结果通知:
{
"type": "aiAnalysis",
"messageId": 123,
"username": "username",
"isViolation": false,
"scoreChange": 1,
"newTotalScore": 86,
"level": "civilized",
"analysisResult": {
"sentiment": "positive",
"confidenceScore": 0.95,
"reason": "正面积极的表达"
}
}积分更新通知:
{
"type": "scoreUpdate",
"username": "username",
"scoreChange": -1,
"newTotalScore": 84,
"level": "normal",
"reason": "检测到不当言论",
"warning": "请注意文明用语,营造健康的聊天环境"
}成就解锁通知:
{
"type": "achievement",
"username": "username",
"achievement": {
"name": "文明使者",
"description": "连续30条正面消息",
"icon": "medal",
"points": 50
}
}- 打开浏览器访问 http://localhost:8080/register.html
- 填写用户名、邮箱和密码进行注册
- 注册成功后自动跳转到登录页面
- 使用注册的用户名和密码登录系统
- 登录成功后进入聊天界面
- 点击"创建房间"按钮
- 系统自动生成房间ID
- 将房间ID分享给其他用户
- 在聊天界面输入房间ID
- 点击"加入房间"按钮
- 成功加入后可以开始聊天
- 在消息输入框中输入要发送的内容
- 按回车键或点击发送按钮
- 消息会实时同步给房间内的所有用户
- 加入房间后会自动加载历史消息
- 支持消息时间戳显示
- 区分不同用户的消息
- 实时分析:发送消息后,AI立即对内容进行分析
- 情感检测:系统会分析消息的情感倾向(正面/负面/中性)
- 内容分类:自动识别消息类型(文明/不当/攻击性)
- 关键词提取:检测消息中的重要关键词和敏感词汇
- 消息旁显示情感指示器(😊 正面、😐 中性、😡 负面)
- 置信度分数展示(高、中、低)
- 对于不当内容,显示警告标识和改进建议
- 文明加分:发送正面、友善、有建设性的消息即可获得 +1分
- 越网扣分:发送不当、攻击性、有害的消息将被扣除 -1分
- 实时反馈:每次发送消息后,系统会实时显示积分变化
- 新手用户 (0-19分):刚入门的用户
- 普通用户 (20-49分):表现良好的用户
- 文明用户 (50-99分):一贯保持文明的用户
- 模范用户 (100-199分):模范作用突出的用户
- 文明大使 (200+分):最高等级,社区文明的引领者
- 文明初心者:连续10条正面消息
- 文明使者:连续30条正面消息
- 文明守护者:连续50条正面消息
- 文明先锋:连续100条正面消息
- 文明大使:连续200条正面消息
- 聊天界面右上角显示当前积分和等级
- 点击积分显示详细的积分历史
- 查看排行榜,了解自己在社区中的排名
- “您好!很高兴认识您。”
- “谢谢分享,这个观点很有趣。”
- “我不同意您的看法,但尊重您的意见。”
- “让我们一起探讨这个问题吧。”
- 人身攻击和侮辱性言论
- 恶意辱骂和粗俗语言
- 歧视性言论和仇恨言论
- 恶意挑衅和网络暴力
- 尊重他人:使用离貌用语,尊重不同意见
- 理性讨论:保持冒静,理性表达自己的观点
- 积极沟通:多使用建设性的语言,少使用破坏性的词汇
- 包容理解:对不同背景的人保持开放和包容的态度
- JWT Token 认证机制
- BCrypt 密码加密
- 登录状态持久化
- SQL 注入防护
- XSS 攻击防护
- CSRF 保护机制
- 连接握手验证
- 消息来源验证
- 自动断线重连
tennis-voice-chat/
├── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── xyz/lingview/chat/
│ │ │ ├── config/ # 配置类
│ │ │ ├── controller/ # 控制器
│ │ │ ├── entity/ # 实体类
│ │ │ ├── repository/ # 数据访问层
│ │ │ ├── service/ # 业务逻辑层
│ │ │ ├── security/ # 安全配置
│ │ │ ├── websocket/ # WebSocket处理
│ │ │ └── StartServer.java # 启动类
│ │ └── resources/
│ │ ├── static/ # 静态资源
│ │ ├── mapper/ # MyBatis映射
│ │ └── application.yml # 配置文件
├── chat.sql # 数据库脚本
├── pom.xml # Maven配置
└── README.md # 项目说明
- 简洁的用户登录表单
- 输入验证和错误提示
- 自动跳转到注册页面
- 现代化的聊天界面设计
- 实时消息显示
- 用户状态指示
- 响应式布局
- 消息气泡显示
- 时间戳标记
- 用户头像显示
- 在线状态指示
A: 请检查 MySQL 服务是否启动,数据库配置是否正确。
A: 确保防火墙允许 WebSocket 连接,检查端口是否被占用。
A: 检查用户名密码是否正确,确认用户状态为正常。
A: 确认用户已正确加入聊天室,检查网络连接状态。
- 合理的索引设计
- 连接池配置优化
- 查询语句优化
- Redis 缓存热点数据
- 会话信息缓存
- 静态资源缓存
- 连接数限制
- 心跳检测机制
- 自动断线重连
- ✅ 基础聊天功能实现
- ✅ 用户认证系统
- ✅ WebSocket 实时通信
- ✅ AI内容分析系统:实时监测消息内容
- ✅ 积分激励机制:文明加分,越网扣分
- ✅ 情感识别:智能分析消息情感倾向
- ✅ 文明等级系统:根据积分划分用户等级
- ✅ 成就系统:文明聊天成就加持
- 更高级的AI分析:支持多语言和方言识别
- 上下文理解:结合对话历史的更准确判断
- 个性化建议:根据用户行为提供定制改进建议
- 实时翻译:支持多语言文明沟通
- 群聊功能:支持多人聊天室的文明管理
- 社区管理:引入管理员和社区规则
- 举报机制:用户可以举报不当行为
- 文明大使系统:高等级用户可以帮助新手
- 文明教育模块:提供网络文明学习资料
- 互动教学:通过游戏化方式学习文明沟通
- 数据分析:为用户提供沟通习惯分析报告
- 文明证书:颁发数字文明证书
- 开放API:为第三方应用提供AI分析服务
- 插件系统:支持各种社交平台集成
- 移动端APP:开发原生移动应用
- 数据可视化:网络文明的数据分析与展示
- 全球化部署:在世界范围内推广文明沟通
- 教育机构合作:与学校、机构合作开展文明教育
- 政策建议:为网络治理提供数据支持和政策建议
- 社会影响力:成为网络文明的标杆平台
- Fork 本项目
- 创建功能分支 (
git checkout -b feature/AmazingFeature) - 提交更改 (
git commit -m 'Add some AmazingFeature') - 推送到分支 (
git push origin feature/AmazingFeature) - 创建 Pull Request
本项目采用 MIT 许可证。详情请参阅 LICENSE 文件。
- 项目维护者:lingview
- 邮箱:official@lingview.xyz
- 项目地址:https://github.com/lingview/tennis-voice-chat
如果这个项目对您有帮助,请给我们一个 ⭐️ Star!您的支持是我们持续改进的动力。