# cau_simulation **Repository Path**: ai-edu_tech/cau_simulation ## Basic Information - **Project Name**: cau_simulation - **Description**: 模拟数据 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-06-23 - **Last Updated**: 2026-06-26 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 农场 API 后端服务 基于 Apipost 文档实现农场与首部接口,并提供可维护的管理后台。当前只实现文档中有明确响应示例的接口;没有响应定义的接口暂不处理。 ## 启动 先准备 MySQL 8,下面是本地开发默认配置: ```bash docker run -d --name nongda-mysql \ -e MYSQL_ROOT_PASSWORD=root123456 \ -e MYSQL_DATABASE=nongda_top \ -e MYSQL_USER=nongda \ -e MYSQL_PASSWORD=nongda123456 \ -p 3306:3306 \ mysql:8.0 ``` ```bash npm install npm run migrate:mysql npm run build npm run dev ``` 服务启动时会自动创建多张 `app_state_*` 表。如果 MySQL 里还没有数据,并且 `data/db.json` 存在,会把它作为首次初始化种子拆表导入;也可以手动执行 `npm run migrate:mysql` 迁移已有 JSON 数据。 服务默认运行在 `http://127.0.0.1:3000`,管理后台地址: ```text http://127.0.0.1:3000/admin.html ``` ## 已实现接口 接口同时支持原路径和 `/api` 前缀路径。 ```text POST /passport/login GET /farm/getFarmList POST /passport/selectFarm GET /farm/getFarmInfo GET /irrigation/irrigation_header/:id GET /irrigation/irrigation-header-info GET /irrigation/get-farm-irrigation-tasks GET /irrigation/user-farm-irrigation-header-rigs-state?irrigation_header_id=1078 GET /irrigation/get-irrigation-header-history-tasks?irrigation_header_id=1078 POST /irrigation/create-finished-task GET /irrigation_suggestion/suggestions?irrigation_header_id=1078 GET /irrigation_suggestion/today-sensor-data?rig_id=344 GET /irrigation_suggestion/planting-to-yesterday-sensor-data?rig_id=344 ``` ## 登录联调 固定演示账号: ```text username: demo password: 123456 Auth-Token: mock-authtoken-demo-farm-1025 ``` 调用顺序: ```text 1. POST /passport/login 2. GET /farm/getFarmList 3. POST /passport/selectFarm ``` ## 测试环境部署 接口服务和管理页面一起部署,Express 同时提供 API 和 `public/admin` 静态资源。 ### 方式一:直接用 Node ```bash npm install npm run build PORT=3000 npm run start ``` 启动后: ```text 接口根地址: http://:3000 管理页面: http://:3000/admin/ ``` 如果需要挂到二级目录,构建和启动时使用同一个 `BASE_PATH`: ```bash BASE_PATH=/nongda npm run build BASE_PATH=/nongda PORT=3000 npm run start ``` 启动后: ```text 接口根地址: http://:3000/nongda 接口 /api 地址: http://:3000/nongda/api 管理页面: http://:3000/nongda/admin/ ``` 不设置 `BASE_PATH` 时仍按根路径部署。 建议用 `pm2` 或 `systemd` 守护进程。 ### MySQL 配置 后端通过以下环境变量连接 MySQL: ```text MYSQL_HOST 默认 127.0.0.1 MYSQL_PORT 默认 3306 MYSQL_DATABASE 默认 nongda_top MYSQL_USER 默认 nongda MYSQL_PASSWORD 默认 nongda123456 MYSQL_TABLE 默认 app_state,作为拆分表的表名前缀 MYSQL_SEED_FILE 默认 data/db.json,用于空库首次初始化 MYSQL_CONNECTION_LIMIT 默认 10 ``` 也可以用 `MYSQL_URL` 或 `DATABASE_URL`,格式为: ```text mysql://nongda:nongda123456@127.0.0.1:3306/nongda_top?table=app_state ``` ## 建议列表定时同步 启动脚本和 Docker Compose 已默认配置建议列表同步。默认会每 10 分钟读取一次本地 `http://127.0.0.1:${PORT:-3000}/api/irrigation_suggestion/suggestions`;如果配置了真实上游登录信息,则会先调用 app-key 登录接口拿 token,再用 token 调用 `automatic-rig-irrigation-suggestions?gg_rig_ids=...` 获取灌溉建议。每次响应会和上一次保存的稳定快照比较;如果数据发生变化,会更新当前建议列表,并新增一条同步快照,同时为发生变化的轮灌组追加变化记录。 真实上游接口推荐写入本地 `.env.local`,该文件不会提交到 git: ```text IRRIGATION_SUGGESTION_SYNC_LOGIN_URL="https:///cau_gg/adminapi/v1/login/app-key" IRRIGATION_SUGGESTION_SYNC_URL="https:///cau_gg/adminapi/v1/automatic-rig-irrigation-suggestions" IRRIGATION_SUGGESTION_SYNC_LOGIN_AUTHORIZATION="Bearer <登录接口初始 token>" IRRIGATION_SUGGESTION_SYNC_APP_KEY="" IRRIGATION_SUGGESTION_SYNC_APP_SECRET="" ``` 可选环境变量: ```text IRRIGATION_SUGGESTION_SYNC_RIG_IDS 指定轮灌组 ID,逗号分隔;默认读取本地建议列表轮灌组 IRRIGATION_SUGGESTION_SYNC_INTERVAL_MS 轮询间隔,默认 600000,即 10 分钟 IRRIGATION_SUGGESTION_SYNC_TIMEOUT_MS 单次请求超时,默认 15000 IRRIGATION_SUGGESTION_SYNC_ON_START 启动后是否立即同步一次,默认 true,设为 false 可关闭 IRRIGATION_SUGGESTION_FEEDBACK_URL 建议采纳反馈接口;默认使用同步接口地址追加 /feedback ``` 管理接口: ```text GET /api/admin/irrigation-suggestion-sync POST /api/admin/irrigation-suggestion-sync/run GET /api/admin/irrigation-suggestion-records GET /api/admin/irrigation-suggestion-snapshots ``` 如果需要临时关闭同步,可以把 `IRRIGATION_SUGGESTION_SYNC_URL` 设为空字符串后启动。 ### 方式二:Docker 使用 Docker Compose 同时启动 API 和 MySQL: ```bash docker compose up -d --build ``` MySQL 数据保存在 `mysql-data` volume 中,后端首次启动时会从镜像内的 `/app/data/db.json` 拆分导入初始数据。 ## 管理后台数据 后台维护的数据保存在 MySQL 的多张表中。默认表名前缀是 `app_state`,会生成 `app_state_farm`、`app_state_headers`、`app_state_rigs`、`app_state_history_tasks` 等拆分表。每张表按对象顶层字段建列,嵌套对象或数组保存在对应字段名的 JSON 列中,包含: ```text farm 农场信息 headers 首部列表 rigs 轮灌组状态 farmTasks 农场灌溉任务 historyTasks 历史任务 irrigationSuggestionRigs 建议列表轮灌组 irrigationSuggestionRecords 建议变化记录 irrigationSuggestionSnapshots 建议同步快照 ``` 后台 CRUD 接口: ```text GET /admin/api/:collection POST /admin/api/:collection PUT /admin/api/:collection/:id DELETE /admin/api/:collection/:id POST /admin/api/:collection/bulk ``` ## 外部写入已完成灌溉任务 用于外部系统在灌溉完成后插入一条历史任务。接口同时支持原路径和 `/api` 前缀路径。 ```bash curl -X POST http://:3000/irrigation/create-finished-task \ -H 'Content-Type: application/json' \ -H 'Auth-Token: mock-authtoken-demo-farm-1025' \ -d '{ "rig_id": 344, "real_water_irrigation_volume": 12.5, "real_irrigation_duration": 0.5, "irrigation_rate": 0.42, "real_irrigation_depth": 8 }' ``` 必填字段: ```text rig_id 轮灌组 ID ``` 可选字段包括 `task_id`、`ts`、`irrigation_header_id`、`real_water_irrigation_volume`、`real_irrigation_duration`、`irrigation_rate`、`real_irrigation_depth`。其中 `real_irrigation_duration` 单位为小时。未传时服务端会补默认值,并固定写入 `task_status=2`、`task_status_name=已结束`。