diff --git a/README.md b/README.md new file mode 100644 index 0000000..925c531 --- /dev/null +++ b/README.md @@ -0,0 +1,113 @@ +# est-api + +EST 本地部署的后端 API,包含两个子服务并通过统一入口启动: +- 根路径 `/`:平台框架接口(frameworkapi) +- 前缀 `/dsxapi`:DSX 模拟器相关接口(dsxapi) + +## 快速启动 +```bash +# 安装依赖 +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`: +```ini +# 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 /login` AES(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/network` +- `POST /network-config`(鉴权)更新指定键:`BOOTPROTO`、`IPADDR`、`NETMASK`、`GATEWAY`、`DNS` + - `BOOTPROTO` 仅支持 `dhcp` 或 `static` + - `static` 时必须提供 `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//` +- `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/` 映射到持久卷 + diff --git a/dsxapi/dsxapi.js b/dsxapi/dsxapi.js index 3422aec..73feed0 100644 --- a/dsxapi/dsxapi.js +++ b/dsxapi/dsxapi.js @@ -4,7 +4,6 @@ const fs = require('fs'); const path = require('path'); const app = express(); -const PORT = 3007; // 初始连接映射数据 const initialConnectionMap = {