c9a95ca5c8b54064c007ad036064f514004a2e54
est-api
EST 本地部署的后端 API,包含两个子服务并通过统一入口启动:
- 根路径
/:平台框架接口(frameworkapi) - 前缀
/dsxapi:DSX 模拟器相关接口(dsxapi)
快速启动
# 安装依赖
npm install
# 启动统一入口(默认监听 3000)
npm start
- 统一入口:
app.js,将frameworkapi挂载到/,dsxapi挂载到/dsxapi - 端口:默认
3000
目录结构
/app.js统一入口,挂载两个子服务/farmeworkapi/平台框架接口.env环境变量文件(子服务加载)farmeworkapi.js主入口license/存放许可证(.lic)pub.pem/priv.pem公钥/私钥;license_issuer.html颁发页面network宿主机网络配置中转文件
/dsxapi/DSX 模拟器接口dsxapi.js主入口competition_data/结束后持久化的比赛数据(.est)competition_tmp/比赛进行时的临时备份目录connection_maps/connectionMap.json连接映射持久化
配置与环境变量
仅 farmeworkapi 会加载其目录下 .env:
# Database configuration
DB_HOST=est_mysql
DB_PORT=3306
DB_USER=root
DB_PASSWORD=MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDQMYcjqnrMnr9G
DB_NAME=login
# SurveyKing_DB_NAME
SurveyKing_DB_HOST=est_mysql
SurveyKing_DB_PORT=3306
SurveyKing_DB_USER=root
SurveyKing_DB_PASSWORD=MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDQMYcjqnrMnr9G
SurveyKing_DB_NAME=surveyking
# JWT configuration
JWT_SECRET=MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDQMYcjqnrMnr9G
# Server configuration
PORT=3000
路由与接口
以下路径均为统一入口下的最终路径。
frameworkapi(前缀 /)
POST /loginAES(CBC) 加密的登录数据,成功返回token与用户等级GET /check-auth(鉴权)返回当前用户认证状态POST /verify-token校验令牌有效性GET /user-info(鉴权)获取用户信息GET /verify-admin(鉴权)校验是否管理员GET /admin/users(鉴权)列出用户POST /admin/users(鉴权)新增/修改用户DELETE /admin/users/:student_id(鉴权)删除用户GET /online-users(鉴权)在线与历史统计POST /update-activity(鉴权)更新心跳/活跃时间POST /logout(鉴权)登出
许可证相关:
GET /public-key获取 RSA 公钥(用于前端加密)GET /product-model返回产品型号(随许可证状态)POST /upload-license上传.lic文件并验证(form-data)GET /license-status许可证验证状态摘要GET /license-info(鉴权)许可证详细信息
网络配置:
GET /network-config(鉴权)读取farmeworkapi/networkPOST /network-config(鉴权)更新指定键:BOOTPROTO、IPADDR、NETMASK、GATEWAY、DNSBOOTPROTO仅支持dhcp或staticstatic时必须提供IPADDR、NETMASK、GATEWAY、DNS
Survey 数据:
GET /survey-answers读取 SurveyKing 数据库中的问卷答案(具体查询参数以实现为准)
dsxapi(前缀 /dsxapi)
连接映射:
GET /api/connectionMap?scene=XXX返回pass与指定场景合并后的映射POST /api/connectionMap更新某场景映射(禁止修改pass)POST /api/initConnectionMap恢复到初始映射并持久化
比赛流程:
POST /api/competition/start开始比赛,返回UUID,每分钟写入临时备份到competition_tmp/<UUID>/POST /api/competition/end结束比赛,写入编码.est文件到competition_data/GET /api/competition/status查询是否进行中及UUID、开始时间POST /api/competition/data上传统计数据(需携带UUID、fingerprint、data)GET /api/competition/data?UUID=...&fingerprint=...查询指定指纹数据(返回projects)GET /api/competition/data返回当前全部统计数据快照
日志
farmeworkapi/server.log常规日志;farmeworkapi/admin.log管理员操作日志- dsxapi 独立运行时在控制台输出重要提示与告警
Docker 与挂载
- 挂载
farmeworkapi/license/以便导入许可证 - 挂载
farmeworkapi/network供网络配置接口读写 - 挂载
/hardware_serial到容器内,提供硬件序列号以完成许可证绑定 - 可选择将
dsxapi/competition_data/与dsxapi/competition_tmp/映射到持久卷
Webpack 打包与混淆
本项目已集成基于 Webpack 的 Node 端打包与 JavaScript 混淆,适用于生产环境分发与提高代码可读性门槛。
前置条件
- 建议使用 Node.js 18 或 20。
- 安装依赖:
npm install(包含开发依赖用于构建)。
构建与运行
- 构建(打包 + 混淆):
npm run build - 运行打包版本:
npm run start:dist - 构建产物位置:
dist/- 入口:
dist/server.js - 资产:
.env、license/、network/、pub.pem、priv.pem、license_issuer.html、online_data.json、dsxapi/connection_maps、dsxapi/competition_data、dsxapi/competition_tmp(已自动复制)
- 入口:
依赖说明
- 打包时使用了
webpack-node-externals排除了node_modules,因此部署环境仍需安装生产依赖:- 在部署机(或容器)执行:
npm ci --omit=dev - 或者在项目根目录(含
node_modules)内直接运行node dist/server.js
- 在部署机(或容器)执行:
混淆策略
- 已启用
webpack-obfuscator,默认配置:开启字符串数组与 RC4 编码、数组旋转,关闭控制流扁平化以保证稳定性。
路径与持久化
- 打包后
__dirname指向dist,已通过复制插件将运行期必需文件复制到dist,保持现有代码路径逻辑可用。 - 运行时写入(如
server.log、admin.log、competition_tmp/competition_data)默认位于dist下。生产中建议:- 使用外部挂载或卷持久化这些目录;或
- 改为输出到标准输出并配置外部日志采集/轮转。
Description
Languages
JavaScript
84.5%
HTML
15.5%