用于从 MySQL 历史表建模并生成模拟数据,支持前端调度、多配置管理、配置可视化编辑,以及后端常驻任务(前端关闭后任务可继续运行)。
- 从 MySQL 拉取历史数据建模(数值分布 + 分类频率)
- 按配置执行单轮生成并写回目标表
- 后端常驻调度任务:前端仅负责发启停指令与查看状态
- 多配置文件管理:新建、重命名、别名展示
- 字段可视化编辑:数值/分类字段、关联字段组、固定值键值对
- 任务数据预览:支持查看最新生成数据及字段类型
main.py:启动入口(默认 API 模式)simulator_api.py:后端接口(配置管理 + 任务控制 + 数据预览)simulator_pipeline.py:核心模拟引擎config/:配置文件目录frontend/:Vue3 调度前端
pip install -r requirements.txtcd frontend
npm installpython main.py默认监听:http://127.0.0.1:8000
可选参数:
python main.py --mode api --host 0.0.0.0 --port 8000cd frontend
npm run dev默认访问:http://127.0.0.1:5173
如果不使用前端调度,可直接跑 pipeline:
python main.py --mode pipeline --config config/config1.yaml
python main.py --mode pipeline --config config
python main.py --mode pipeline --config "config/*.yaml"项目已提供 Docker 打包文件:
Dockerfile.backend:后端 FastAPI 镜像frontend/Dockerfile:前端 Vue 构建 + Nginx 静态托管镜像frontend/nginx.conf:前端容器内 Nginx 配置(含/api/反向代理)docker-compose.yml:一键编排前后端
docker compose builddocker compose up -d- 前端:
http://<服务器IP>:8080 - 后端 API:
http://<服务器IP>:8000
docker compose logs -f backend
docker compose logs -f frontenddocker compose downdocker-compose.yml 已将宿主机 ./config 挂载到容器 /app/config,你在宿主机修改配置文件后,容器内会直接生效(重启任务即可读取新配置)。
- 配置管理:
- 配置别名:编辑
meta.alias,列表优先显示别名 - 新建配置文件:输入文件名/别名即可创建
- 重命名配置文件:只改文件名,不改内容
- 配置别名:编辑
- 可视化字段编辑:
numeric_cols、categorical_cols:逐项增删linked_categorical_pairs:成对增删linked_categorical_groups:按组增删fixed_values:键值对增删(自动识别布尔/数字/字符串)
- 任务调度:
- 启动/停止任务(后端线程运行)
- 执行一次(手动触发单轮)
- 查看数据(展示最近写入记录与字段类型)
GET /api/configs:配置列表(返回path+alias)GET /api/config-data?config_path=...:读取配置对象POST /api/save-config-data:保存配置对象POST /api/config-create:新建配置文件POST /api/config-rename:重命名配置文件
POST /api/run-once:按配置执行单轮生成并写回POST /api/service-start:启动后端常驻任务POST /api/service-stop:停止后端常驻任务GET /api/service-status:获取全部任务状态
GET /api/generated-preview?config_path=...&limit=50- 返回目标表最新数据(默认 50 行,最大 500 行)
- 返回字段列表
columns - 返回字段类型
column_types
meta.alias:前端展示别名mysql.url:后端实际连接串tables.source_table:历史表tables.target_table:回写目标表fields.timestamp_col:主时间字段fields.system_fields.event_id_col:自动补 UUID 字段fields.system_fields.receive_time_col:接收时间字段fields.system_fields.event_time_col:事件时间字段fields.numeric_cols:数值建模字段(可为空;为空时跳过数值建模)fields.categorical_cols:分类抽样字段fields.linked_categorical_pairs:字段对关联采样fields.linked_categorical_groups:字段组关联采样fields.fixed_values:固定覆盖字段history.lookback_rows:历史窗口大小generation.rows_per_run:单轮生成行数generation.frequency_minutes:时间步长(分钟)generation.start_time:起始时间(latest/now/ 时间字符串)generation.strict_frequency:是否固定步长service.duration_minutes:服务运行时长(0 表示不限时)service.interval_seconds:循环间隔秒数service.randomize_interval:是否随机间隔
以下为推荐的标准部署方式(前后端分离 + 反向代理)。
cd /opt/simulator
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt新建 /etc/systemd/system/simulator-api.service:
[Unit]
Description=Simulator FastAPI Service
After=network.target
[Service]
Type=simple
User=www-data
WorkingDirectory=/opt/simulator
Environment=PYTHONUNBUFFERED=1
ExecStart=/opt/simulator/.venv/bin/python main.py --mode api --host 127.0.0.1 --port 8000
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.target生效并启动:
sudo systemctl daemon-reload
sudo systemctl enable simulator-api
sudo systemctl start simulator-api
sudo systemctl status simulator-api查看日志:
journalctl -u simulator-api -fcd /opt/simulator/frontend
npm ci
npm run build构建产物默认在 frontend/dist/。
新建站点配置(如 /etc/nginx/conf.d/simulator.conf):
server {
listen 80;
server_name your-domain.com;
root /opt/simulator/frontend/dist;
index index.html;
location / {
try_files $uri $uri/ /index.html;
}
location /api/ {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}校验并重载:
sudo nginx -t
sudo systemctl reload nginx- 后端建议使用 NSSM / WinSW 将
python main.py --mode api --host 127.0.0.1 --port 8000注册为系统服务 - 前端使用
npm run build后,将frontend/dist托管到 IIS/Nginx - 通过 IIS/Nginx 反向代理
/api/到127.0.0.1:8000
- 后端健康检查:
GET /api/configs返回 200 - 前端页面可正常加载并显示配置列表
- 启动任务后关闭前端,任务仍持续执行
- “查看数据”可返回最近记录与字段类型
- 重启机器后服务自动拉起(systemd/Windows 服务)
- 修改后端代码后需要重启后端进程(开发模式除外)
- 修改前端代码后需要重新构建
frontend/dist generated-preview查询依赖目标表可访问,且配置中的表名/时间字段正确- 若
fields.numeric_cols为空,系统不会再自动推断数值列