一台主机部署即用,学生用浏览器上传下载、练打字、玩打字游戏; 管理员在一个后台管账号、管文件、管成绩、管游戏。不在同一局域网?客户端一键组网接入。
不用再装 FTP、不用再插 U 盘、不用再找打字软件。打开浏览器就能开始。
拖进浏览器就上传,点一下就下载。支持整文件夹上传,自动去重、同名自动改名。
用真实代码当练习素材,屏幕键盘高亮下一个键,手指提示告诉你该用哪根手指。
单机练手,或者输入同一个房间号和同学实时对战。成绩自动进排行榜。
选一段代码或文章,跟着屏幕敲。平台实时算速度、正确率和输错率, 空行与行首缩进自动跳过,不用把时间浪费在敲空格上。
学生自助注册,不用一个个建账号;谁传了什么、谁练了多少、谁在玩游戏,后台一眼看清。 密码忘了老师直接重置,文件违规一键删除。
学生机在家里、在别的楼层、在另一个网段?把客户端文件夹发过去,点一下「开始连接」就够了—— 自动组网、自动找服务器、自动更新,不需要公网 IP,也不需要配置端口映射。
本软件为闭源软件,但游戏插件开发完全开放。 一个文件夹、三个文件,就是一个能被平台加载、能被学生玩到、成绩能进排行榜的游戏。
game.json —— 元数据:名称、图标、简介、人数、是否联机static/index.html —— 游戏界面,平台自动放进页面里server.py —— 服务端逻辑,联机游戏才需要/api/game/<你的游戏>/…/game/<你的游戏>,各游戏互不干扰// ① game.json —— 告诉平台你是谁
{
"key": "my_game",
"name": "我的游戏",
"icon": "🎲",
"description": "一句话说明玩法",
"has_server": true,
"max_players": 8
}
# ② server.py —— 定义 Game 类即可
from games.base import BaseGame
class Game(BaseGame):
def register_routes(self, bp):
# 地址: /api/game/my_game/hello
@bp.route("/hello")
def hello():
return {"ok": True}
def register_socketio(self, socketio, namespace):
# 频道: /game/my_game
@socketio.on("join", namespace=namespace)
def on_join(data):
socketio.emit("joined", data, namespace=namespace)
# ③ static/index.html —— 你的游戏界面
以打包好的程序形式分发,目标电脑无需安装任何开发环境。
| 项目 | 说明 |
|---|---|
| 运行环境 | Windows 主机一台,免安装运行环境;整个程序文件夹一起拷贝即可 |
| 访问入口 | 浏览器访问 http://服务器地址:8080/,管理后台在同地址加 /admin/login |
| 端口 | 默认 8080,可在启动器里修改;需在防火墙放行该端口 |
| 客户端 | 可选。跨网络使用时发放客户端文件夹 + 配置文件;需整目录拷贝,程序会请求管理员权限以安装虚拟网卡驱动 |
| 账号 | 学生自助注册(姓名 + 密码 + 验证码);管理员首次登录强制改密 |
| 上传限制 | 单次不超过 100 MB;每名学生累计 300 MB;默认拦截 46 类可执行与脚本文件 |
| 数据 | 账号、文件索引、成绩与共享文件都保存在程序目录下,定期备份即可 |
| 组网 | 跨网络接入时由客户端自动完成,无需公网 IP 与端口映射 |
| 开放性 | 软件本体闭源;游戏插件开发接口对外开放 |
从登录到文件落盘,每一环都做了基本防护。
默认拦截 46 类可执行与脚本文件,阻断通过共享目录投放木马的最常见路径,管理员可自行调整。
学生登录与注册均需图形验证码;上传文件、提交成绩都必须先登录。
客户端连接时校验服务端身份,避免学生把数据交到冒充的服务器上。
下载路径做了穿越防护,无法借文件下载读取服务器上的其他内容。
可限制上传下载速度、限制每人占用空间,保证多人同时使用时不被个别大文件拖垮。
超级管理员与普通管理员分离,增删管理员等敏感操作仅超级管理员可执行。
部署包、桌面客户端与解压缩软件统一放在网盘。点开卡片即可跳转;有提取码的点一下按钮就能复制。