# 代码对战平台
**Repository Path**: breezewangsz/code-combat-platform
## Basic Information
- **Project Name**: 代码对战平台
- **Description**: 代码对战平台
- **Primary Language**: Unknown
- **License**: MulanPSL-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 6
- **Forks**: 2
- **Created**: 2023-01-18
- **Last Updated**: 2023-05-14
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 代码对战平台
#### 介绍
随着智能技术的快速发展少年学习编程已经是大势所趋。传统的青少年编程学习平台以在线评测系统为主,由于它主要面向参与信息学竞赛的学生题目难度比较大,这往往会抑制学生学习编程的热情。近些年比较流行的图形化编程学习平台颇受青少年的喜爱但是它无法满足初高中学生学习高级编程语言、锻炼算法能力的需求。编程对战平台支持热门语言`java`,不仅有利于算法的学习,而且游戏对战能激发学生们的编程兴趣,非常适合作为青少年的编程学习平台。基上述调研,对编程对战平台进行需求分析、架构设计和数据库表设计。又详细设计各大功能模块;包括用户模块、匹配模块、Bot执行模块、 图片模块、网关模块。在基础对战引擎之上,本项目对战分别提出本地对战引擎和云Bot在线对战引擎,并提出性能更优的基于`API`的在线对战引擎,从而解决在线对战时服务器负载严重的问题。最后,通过对编程对战平台的功能测试和性能测试验证了平台功能的正确性以及各项性能指标的有效性。目前,编程对战平台已部署上线。
## 内置功能
1. 用户模块:该模块负责1.管理用户信息,2.管理bot信息,3.管理文章信息,4.游戏生成,5.对局保存
2. 匹配模块:通过`Fegin`接受用户模块匹配信息根据等待时间和分差进行匹配
3. Bot执行模块:通过`joor-java-8`执行用户发送代码
4. 图片模块:使用阿里云`oss`存储服务
5. 网关模块:注册进`nacos`进行权限验证服务间负载均衡和路由转发
6. 工具模块:抽取公共类以及工具类
## 1.权限控制
使用`SpingSecrity`加`java-jwt`
重写了`UsernamePasswordAuthenticationFilter`以及在其前添加了一个拦截器`CustomAuthorizationFilter`
1.`CustomAuthorizationFilter`的作用:拦截检查请求头携带token是否合法
2.重写了`UsernamePasswordAuthenticationFilter`:用来判断用户验证码是否正确
流程:通过`vc.jpg`生成由`0-9`构成的4位随机字符串保存进`redis`其存储形式为`用户名+code:验证码`的键值对,设置存储时间为3分钟,然后使用的`kaptcha`生成`base64`编码的字符串返回前端生成图片,验证时从`redis去除判断`
## 2.`Game`
作用:存储游戏地图对战者双方,失败者以及相应操作
Game继承Thread采用每局游戏开一个单独线程的形式执行
1. 点击匹配通过`websocket`发送信息到`gateway网关`网关处理完`url`后转发给USER模块的`WebSocketServer`,建立`websocket`服务时将其存储进线程安全的静态的`ConcurrentHashMap`其以`用户Id:websocket-session`为键值对存储
2. 通过`Fegin`调用`BOT模块并使用addBot在匹配池增加一名用户`
3. 当两名用户中等待最久的一位等待时间*10大于对于其分数差时匹配成功
4. 成功时`MATCHING`模块会将匹配成功的用户返回给`USER模块`并且调用其`startGame方法`游戏开始
5. 首先获取游戏状态如果状态为`playing`将操作发送给前端蛇移动继续游戏否则发送消息给游戏双方存储对局状态游戏结束
6. 获取操作流程通过`websocket`更新Game中的`nextStep`
7. 如果其为代码的方式进行操作会调用`BOT`模块的`addBot`为消息队列增加一个`botDto`执行完返回操作指令和用户ID
请求流程
## 3.聊天
1. 建立连接时获取用户信息保存进线程安全的数组并将其`session`存储进线程安全的哈希表`ConcurrentHashMap`其以`用户Id:websocket-session`为键值对存储
2. 然后返回其在线用户列表和其在线好友列表和离线好友列表
3. 前端发送消息为`send-msg`时将信息存进数据库如双发在线则返回给双方,另一方不在时不发送
4. 前端发送消息为`get-msg`获取历史消息时通过双发Id查询消息并通过时间排序发送前端
5. 断开连接时前端会通过接受Id对在线和离线列表操作
## 4.ChatGpt
引入`openai`
## 4.部署
采用docker容器化部署
```yaml
version: "3.0"
networks:
codes:
volumes:
data:
services:
mysql:
image: mysql:8.0.31
ports:
- "3307:3306"
environment:
- "MYSQL_ROOT_PASSWORD=ROOT"
- "MYSQL_DATABASE=codes"
volumes:
- data:/var/lib/mysql
- ./codes.sql:/docker-entrypoint-initdb.d/codes.sql
networks:
- codes
nginx:
image: nginx:1.19.10
ports:
- "80:80"
volumes:
- /home/wsz/codes/nginx/nginx.conf:/etc/nginx/nginx.conf
- /home/wsz/codes/nginx/conf/conf.d:/etc/nginx/conf.d
- /home/wsz/codes/nginx/www/html:/usr/share/nginx/html
- /home/wsz/codes/nginx/logs/nginx:/var/log/nginx
networks:
- codes
bot:
build:
context: ./bot
dockerfile: Dockerfile
ports:
- "4003:4003"
networks:
- codes
matching:
build:
context: ./matching
dockerfile: Dockerfile
ports:
- "4002:4002"
networks:
- codes
oss:
build:
context: ./oss
dockerfile: Dockerfile
ports:
- "4001:4001"
networks:
- codes
user:
build:
context: ./user
dockerfile: Dockerfile
ports:
- "4000:4000"
networks:
- codes
getway:
build:
context: ./gateway
dockerfile: Dockerfile
ports:
- "8888:8888"
networks:
- codes
```
```yaml
version: "3.0"
networks:
cloud:
volumes:
data:
services:
mysql:
image: mysql:8.0.31
ports:
- "3306:3306"
environment:
- "MYSQL_ROOT_PASSWORD=root"
- "MYSQL_DATABASE=cloud"
volumes:
- data:/var/lib/mysql
- ./nacos_config.sql:/docker-entrypoint-initdb.d/nacos_config.sql
networks:
- cloud
nacos:
image: nacos/nacos-server:1.4.2
ports:
- "8848:8848"
environment:
- "MODE=standalone"
- "SPRING_DATASOURCE_PLATFORM=mysql"
- "MYSQL_SERVICE_HOST=192.168.121.135"
- "MYSQL_SERVICE_PORT=3306"
- "MYSQL_SERVICE_USER=root"
- "MYSQL_SERVICE_PASSWORD=cloud"
- "MYSQL_SERVICE_DB_NAME=nacos_config"
- "TIME_ZONE=Asia/Shanghai"
- "JVM_XMS=64m" #-Xms default :2g
- "JVM_XMX=64m" #-Xmx default :2g
- "JVM_XMN=16m" #-Xmn default :1g
- "JVM_MS=8m " #-XX:MetaspaceSize default :128m
- "JVM_MMS=8m" #-XX:MaxMetaspaceSize default :320m
volumes:
- ./nacos/logs:/home/nacos/logs
networks:
- cloud
redis:
image: redis:7.0.4
ports:
- "6379:6379"
volumes:
- /home/cloud/redisData:/data
command: redis-server /data/redis.conf
networks:
- cloud
```