a389879406d7bb6d8a6fde3815d3853c4872184d
EST-DSX 信息网络布线仿真测试平台
一个基于 Next.js 的仿真与竞赛平台,用于模拟信息网络布线测试(铜缆与光纤)、连接配置、过程记录与赛后统计。前端提供可视化场景与操作界面,后端 Express 服务提供连接图与比赛数据 API。
项目概览
- 前端:Next.js 15、React、Tailwind CSS 4、Zustand 状态管理、Headless UI、Chart.js/ECharts、JsPlumb 等
- 典型端口:
3003前端开发端口(npm run dev)
目录结构(简要)
src/pages:核心页面(index仿真、admin管理、competition统计)src/components:场景与功能组件(Office/Industry/DataCenter/WorldSkill、连接/测试组件等)src/store:Zustand 状态与测试数据(COPPER/FIBERJSON 等)src/config/api.js:前端 API 基址与路径server/app.js:主要 API 服务(连接图、竞赛)server/server.js:静态下载与作为前端默认基地址(需要代理/dsxapi到 3007)public/:图片与静态资源
环境要求
- Node.js ≥ 18.18(推荐 20+ LTS)
- npm ≥ 9
快速开始(本地开发)
- 安装依赖
- 在根目录:
npm install - 在
server/目录(后端有独立package.json):cd server && npm install
- 启动后端 API(默认 3007)
- 在根目录或
server/:node server/app.js
- 启动网关/静态服务(默认 3000)
- 在根目录或
server/:node server/server.js - 说明:前端默认将请求发到
http://<host>:3000/dsxapi/api/*。需要代理/dsxapi到http://localhost:3007才能正常调用后端。
- 启动前端(默认 3003)
- 在根目录:
npm run dev
- 访问
- 仿真主页(
/)仅支持在 iframe 中访问且需要token(见下文“鉴权与嵌入”);本地调试请优先使用/admin与/competition页面。 - 管理页:
http://localhost:3003/admin - 统计页:
http://localhost:3003/competition
代理与 API 配置
- 前端 API 路径位于
src/config/api.js:默认BASE_URL指向http(s)://<host>:3000,并使用/dsxapi/api/*路由。 - 本地开发有两种方式:
- 方式 A(推荐):在 3000 端口上配置反向代理,将
/dsxapi代理到http://localhost:3007。 - 方式 B(快速):临时修改
src/config/api.js,将BASE_URL设置为http://localhost:3007并移除/dsxapi前缀,使前端直接访问http://localhost:3007/api/*。
- 方式 A(推荐):在 3000 端口上配置反向代理,将
- 注:
/verify-admin、/check-auth路由由外部系统提供,仓库中未实现。如需本地验证,可在前端暂时跳过或模拟。
前端页面与功能
- 仿真页面(
/):- 仅 iframe 嵌入访问(会校验是否处于 iframe 且携带
token) - 场景:Office、Industry、DataCenter、WorldSkill 以及对应任务页;支持设备/模块安装、连接物品、故障场景、结果展示等
- 仅 iframe 嵌入访问(会校验是否处于 iframe 且携带
- 管理页面(
/admin):- 选择场景并编辑连接映射;限制部分端口不可配置;支持保存、初始化、导入/导出 JSON
- 统计页面(
/competition):- 实时拉取参赛席位数据,按条件排序与计算评分;支持导出 Excel
后端 API(server/app.js,默认 3007)
- 连接映射
GET /api/connectionMap?scene=<scene>:返回pass场景与指定场景合并后的连接图POST /api/connectionMap:提交{ <scene>: { ...connections } }更新并持久化到server/connection_maps/connectionMap.json(禁止修改pass)POST /api/initConnectionMap:重置为内置初始映射并持久化
- 竞赛
POST /api/competition/start:开始比赛,返回UUID;每分钟备份编码.est(server/competition_tmp/<UUID>/)POST /api/competition/end:结束比赛并保存编码.est到server/competition_data/,返回uuid与数据GET /api/competition/status:返回比赛状态与开始时间/UUID(如在运行)POST /api/competition/data:提交{ UUID, fingerprint, timestamp, data },以指纹为键保存最新数据GET /api/competition/data:返回当前所有参赛数据快照
构建与部署
- 构建:
npm run build - 生产启动:
npm run start(默认 3003) - 部署建议:
- 在生产网关(3000)上反代
/dsxapi到后端 API(3007) - 按需提供外部鉴权服务(
/check-auth、/verify-admin)并在 iframe 中嵌入主页
- 在生产网关(3000)上反代
常见问题
- 主页显示 502/拒绝访问:未在 iframe 中或缺少
token;用于集成环境,请从外部系统携带token打开。 - 前端请求 404:未配置
/dsxapi代理;参见上文“代理与 API 配置”。 - 管理页保存失败:确保未修改
pass场景;检查后端是否启动并可写server/connection_maps/。
开发记录
Description
Languages
JavaScript
99%
Python
0.9%