455 lines
11 KiB
Markdown
455 lines
11 KiB
Markdown
---
|
||
name: "python-fullstack-scaffold"
|
||
description: "为 FastAPI + WebSocket + Web 前端系统生成前后端开发框架。用户需要搭建或重构 RK3568 电气量测控平台的 Python 全栈代码结构时调用。"
|
||
---
|
||
|
||
# Python Fullstack Scaffold
|
||
|
||
## 适用场景
|
||
|
||
当用户出现以下意图时,调用此技能:
|
||
|
||
- 要根据需求文档搭建 `FastAPI + WebSocket + Web前端` 的项目骨架
|
||
- 要为 `RK3568 / Ubuntu 20.04 / Python 3.8` 平台设计前后端分层结构
|
||
- 要从接口文档反推后端路由、数据模型、配置存储和前端页面模块
|
||
- 要统一实时数据、设备状态、报警事件、参数配置的代码组织方式
|
||
- 要为嵌入式 C 程序与 Python 服务之间的适配层预留稳定接口
|
||
|
||
如果用户只是修一个接口、改一个组件、补一个测试,不要调用此技能。
|
||
|
||
## 技能目标
|
||
|
||
基于“电气量测控平台系统需求分析与架构设计技术方案”,输出一套可直接落地的前后端开发框架,覆盖:
|
||
|
||
- 后端目录结构
|
||
- 前端目录结构
|
||
- 核心领域模型
|
||
- RESTful API 路由分层
|
||
- WebSocket 推送框架
|
||
- JSON/SQLite 数据存储组织
|
||
- 嵌入式适配层抽象
|
||
- 开发顺序、验收点与最小可运行骨架
|
||
|
||
## 固定技术约束
|
||
|
||
在生成方案或代码时,默认遵循以下约束,除非用户明确要求变更:
|
||
|
||
- 平台:`RK3568`,系统为 `Ubuntu 20.04`
|
||
- 后端:`Python 3.8`、`FastAPI`、`Uvicorn`
|
||
- 前端:Web 前端,优先采用当前项目已有技术栈;若项目未定型,则使用轻量、易部署的前端组织方式
|
||
- 通信:`HTTP RESTful API + WebSocket`
|
||
- 配置存储:`JSON`
|
||
- 报警存储:`SQLite`
|
||
- 实时数据:仅内存缓存,不落盘
|
||
- 实时刷新周期:`0.5 秒`
|
||
- 指令下发响应目标:`1 秒内`
|
||
- 系统需支持 `7 x 24` 连续运行
|
||
|
||
## 总体架构原则
|
||
|
||
始终按下面的职责边界组织代码:
|
||
|
||
1. 硬件层:`RK3568 + AI/AO + 开关量 + 网络/串口 + 显示屏`
|
||
2. 嵌入式 C 程序层:采集、控制执行、状态监测、报警生成
|
||
3. Python 服务层:接口、业务编排、缓存、存储、推送
|
||
4. Web 界面层:配置、状态、实时数据、报警、控制
|
||
|
||
禁止把以下职责混在一起:
|
||
|
||
- 路由层里直接写文件读写和数据库细节
|
||
- WebSocket 推送逻辑散落在多个业务模块中
|
||
- 前端页面组件里直接硬编码接口路径和协议细节
|
||
- C 程序适配逻辑与业务规则耦合
|
||
|
||
## 后端推荐目录
|
||
|
||
当用户要求搭建后端框架时,优先生成或对齐为如下结构:
|
||
|
||
```text
|
||
backend/
|
||
app/
|
||
main.py
|
||
core/
|
||
config.py
|
||
logging.py
|
||
security.py
|
||
response.py
|
||
exceptions.py
|
||
api/
|
||
deps.py
|
||
router.py
|
||
routes/
|
||
realtime.py
|
||
status.py
|
||
config_device.py
|
||
config_channel.py
|
||
config_alarm.py
|
||
config_system.py
|
||
alarms.py
|
||
control.py
|
||
schemas/
|
||
common.py
|
||
realtime.py
|
||
status.py
|
||
device_config.py
|
||
channel_config.py
|
||
alarm_setting.py
|
||
system_config.py
|
||
alarm_event.py
|
||
control.py
|
||
services/
|
||
realtime_service.py
|
||
status_service.py
|
||
config_service.py
|
||
alarm_service.py
|
||
control_service.py
|
||
sync_service.py
|
||
repositories/
|
||
json_config_repo.py
|
||
alarm_repo.py
|
||
adapters/
|
||
c_device_client.py
|
||
mock_device_client.py
|
||
protocol_models.py
|
||
ws/
|
||
manager.py
|
||
realtime_publisher.py
|
||
alarm_publisher.py
|
||
db/
|
||
sqlite.py
|
||
models.py
|
||
cache/
|
||
memory_store.py
|
||
tasks/
|
||
polling.py
|
||
utils/
|
||
time_utils.py
|
||
backup.py
|
||
config/
|
||
device.json
|
||
channel.json
|
||
setting.json
|
||
data/
|
||
alarm.db
|
||
tests/
|
||
```
|
||
|
||
## 前端推荐目录
|
||
|
||
当用户要求搭建前端框架时,优先生成或对齐为如下结构:
|
||
|
||
```text
|
||
frontend/
|
||
src/
|
||
main.ts
|
||
App.vue
|
||
router/
|
||
index.ts
|
||
api/
|
||
http.ts
|
||
realtime.ts
|
||
status.ts
|
||
config.ts
|
||
alarm.ts
|
||
control.ts
|
||
websocket/
|
||
realtime.ts
|
||
alarm.ts
|
||
reconnect.ts
|
||
stores/
|
||
realtime.ts
|
||
status.ts
|
||
alarm.ts
|
||
config.ts
|
||
views/
|
||
RealtimeView.vue
|
||
StatusView.vue
|
||
DeviceConfigView.vue
|
||
ChannelConfigView.vue
|
||
AlarmSettingView.vue
|
||
AlarmHistoryView.vue
|
||
ControlView.vue
|
||
SystemConfigView.vue
|
||
components/
|
||
status/
|
||
realtime/
|
||
alarm/
|
||
config/
|
||
control/
|
||
types/
|
||
api.ts
|
||
realtime.ts
|
||
status.ts
|
||
config.ts
|
||
alarm.ts
|
||
utils/
|
||
format.ts
|
||
validators.ts
|
||
```
|
||
|
||
如果仓库已有前端目录,则优先复用现有技术栈、构建工具和状态管理方式,不要无意义重建。
|
||
|
||
## 领域模型拆分
|
||
|
||
构建代码框架时,必须先把需求拆成以下核心模型:
|
||
|
||
### 1. 实时数据模型
|
||
|
||
- `line_list`
|
||
- `switch`
|
||
- `ai_collect`
|
||
|
||
其中 `line_list` 需要体现:
|
||
|
||
- `line_no`
|
||
- 一次值 `pri_val`
|
||
- 二次值 `sec_val`
|
||
|
||
### 2. 设备状态模型
|
||
|
||
- `self_check`
|
||
- `net1`
|
||
- `net2`
|
||
- `uart1`
|
||
- `uart2`
|
||
|
||
### 3. 设备基础配置模型
|
||
|
||
- 操作密码
|
||
- 硬件版本信息
|
||
- 软件版本信息
|
||
- 网口配置
|
||
- 串口配置
|
||
|
||
### 4. 通道配置模型
|
||
|
||
- `ai_channel`
|
||
- `ao_channel`
|
||
|
||
### 5. 定值与 AI 报警设置模型
|
||
|
||
- 线路告警阈值
|
||
- 故障告警设置
|
||
- AI 通道报警设置
|
||
|
||
### 6. 系统配置模型
|
||
|
||
- 对时设置
|
||
- 亮度设置
|
||
- 屏保时间
|
||
|
||
### 7. 报警事件模型
|
||
|
||
- `alarm_type`
|
||
- `time`
|
||
- `no`
|
||
- `type`
|
||
- `content`
|
||
- `level`
|
||
|
||
### 8. 控制指令模型
|
||
|
||
- `ch`
|
||
- `action`
|
||
|
||
## API 设计规则
|
||
|
||
生成后端接口时,统一遵守以下规范:
|
||
|
||
- 所有 HTTP 接口统一响应结构:`code`、`msg`、`data`
|
||
- 路由层仅负责参数校验、调用服务、返回标准响应
|
||
- `GET /api/real-time-data` 作为实时数据备用查询接口
|
||
- `GET /api/device-status` 用于设备状态读取
|
||
- `POST /api/config/device` 持久化设备基础配置并下发设备
|
||
- `POST /api/config/channel` 持久化 AI/AO 通道配置并下发设备
|
||
- `POST /api/config/line_alarm_setting` 持久化线路定值与故障告警设置
|
||
- `POST /api/config/ai_alarm_setting` 持久化 AI 告警设置
|
||
- `POST /api/config/system` 处理对时、亮度、屏保配置,并实时下发
|
||
- `GET /api/alarm/list` 分页查询报警历史
|
||
- `POST /api/control/switch` 下发开关量控制指令
|
||
|
||
如果用户要求生成代码,优先先搭出路由、Schema、Service、Repository 的闭环,再补设备适配与前端页面。
|
||
|
||
## WebSocket 设计规则
|
||
|
||
必须把 WebSocket 当作一等公民设计,不要退化为轮询替代品。
|
||
|
||
### 实时数据通道
|
||
|
||
- 地址:`/ws/real-time`
|
||
- 推送周期:`0.5 秒`
|
||
- 推送内容:`real_time`
|
||
- 数据来源:内存缓存中的最新采样结果
|
||
|
||
### 报警通道
|
||
|
||
- 地址:`/ws/alarm`
|
||
- 触发方式:报警事件产生即推送
|
||
- 推送内容:单条报警事件或标准化事件消息
|
||
|
||
### WebSocket 实现要求
|
||
|
||
- 统一连接管理器
|
||
- 支持多客户端广播
|
||
- 支持断线清理
|
||
- 前端必须具备自动重连
|
||
- 推送数据结构必须和前端类型定义一致
|
||
|
||
## 存储设计规则
|
||
|
||
### JSON 配置
|
||
|
||
以下配置默认存放在 `config/`:
|
||
|
||
- `device.json`
|
||
- `channel.json`
|
||
- `setting.json`
|
||
|
||
要求:
|
||
|
||
- 保存前先做 Schema 校验
|
||
- 写入时支持原子替换
|
||
- 修改后自动备份旧版本
|
||
- 关键字段变更后调用设备下发接口
|
||
|
||
### SQLite 报警库
|
||
|
||
报警事件单独存放在 SQLite 中,至少包含:
|
||
|
||
- `id`
|
||
- `alarm_type`
|
||
- `time`
|
||
- `no`
|
||
- `type`
|
||
- `content`
|
||
- `level`
|
||
|
||
要求:
|
||
|
||
- 写入逻辑集中在 Repository
|
||
- 查询支持分页
|
||
- 前端历史页调用分页接口,不直接访问数据库
|
||
|
||
### 内存缓存
|
||
|
||
以下数据只保存在内存中:
|
||
|
||
- 实时量测数据
|
||
- 实时设备状态
|
||
- 最近待推送报警缓冲
|
||
|
||
## 嵌入式适配层规则
|
||
|
||
当用户要落地与 C 程序交互的代码框架时,必须建立设备适配层,不要让业务层直接依赖具体协议细节。
|
||
|
||
至少抽象以下能力:
|
||
|
||
- 读取实时数据
|
||
- 读取设备状态
|
||
- 读取报警事件
|
||
- 下发基础配置
|
||
- 下发通道配置
|
||
- 下发系统设置
|
||
- 下发开关控制
|
||
|
||
推荐做法:
|
||
|
||
- 定义统一客户端接口,例如 `DeviceClient`
|
||
- 提供 `MockDeviceClient` 供联调和前端开发使用
|
||
- 提供 `CDeviceClient` 作为真实嵌入式对接实现
|
||
- 通过配置切换 mock / real 模式
|
||
|
||
## 安全与可靠性规则
|
||
|
||
必须纳入以下要求:
|
||
|
||
- 密码不得明文长期存储,至少做哈希处理
|
||
- 配置接口增加基本权限校验能力
|
||
- WebSocket 支持断线重连
|
||
- 配置写入支持备份
|
||
- 服务异常场景需易于接入守护或自动重启机制
|
||
|
||
## 推荐开发顺序
|
||
|
||
当用户要求“开始搭框架”时,按以下顺序推进:
|
||
|
||
1. 先梳理接口、数据模型、目录结构
|
||
2. 再生成后端基础工程:配置、日志、异常、统一响应
|
||
3. 再生成 Schema、Repository、Service、Router
|
||
4. 再搭建内存缓存、轮询任务、WebSocket 管理器
|
||
5. 再补 SQLite 与 JSON 持久化
|
||
6. 再抽象设备适配层和 mock 数据源
|
||
7. 最后生成前端 API 封装、状态管理、页面骨架与 WebSocket 客户端
|
||
|
||
## 输出要求
|
||
|
||
调用本技能后,输出内容应尽量包含以下几项:
|
||
|
||
### 如果用户要“方案”
|
||
|
||
输出:
|
||
|
||
- 建议目录结构
|
||
- 模块职责划分
|
||
- 核心数据模型清单
|
||
- API / WebSocket 对应关系
|
||
- 开发阶段拆分
|
||
|
||
### 如果用户要“直接写代码”
|
||
|
||
输出并执行:
|
||
|
||
- 先识别现有仓库中 `backend/`、`frontend/` 的当前结构
|
||
- 尽量增量修改,不要推倒重来
|
||
- 先落最小可运行骨架,再补细节
|
||
- 优先保证接口契约、模块边界、可测试性
|
||
|
||
## 生成代码时的验收清单
|
||
|
||
生成或修改后,至少检查:
|
||
|
||
- 后端是否存在统一应用入口
|
||
- 路由、服务、仓储、适配层是否职责分离
|
||
- 是否覆盖需求文档中的全部 API
|
||
- 是否存在 `/ws/real-time` 与 `/ws/alarm`
|
||
- 实时数据是否只走内存缓存
|
||
- 报警历史是否落 SQLite
|
||
- 配置是否落 JSON
|
||
- 前端是否拆出页面、API、WebSocket、类型定义
|
||
- 是否保留 mock 联调能力
|
||
|
||
## 常用提示模板
|
||
|
||
### 模板 1:搭建完整框架
|
||
|
||
```text
|
||
请基于当前仓库和需求文档,搭建 RK3568 电气量测控平台的前后端代码框架。
|
||
后端使用 FastAPI,前端沿用仓库现有技术栈。
|
||
要求包含目录结构、统一响应、配置读写、SQLite 告警存储、WebSocket 实时推送、设备适配层与 mock 数据源。
|
||
```
|
||
|
||
### 模板 2:只搭后端骨架
|
||
|
||
```text
|
||
请按 python-fullstack-scaffold 技能,为该项目生成后端骨架。
|
||
要求覆盖 realtime、status、config、alarm、control 五类能力,并预留嵌入式 C 程序适配层。
|
||
```
|
||
|
||
### 模板 3:只搭前端骨架
|
||
|
||
```text
|
||
请按 python-fullstack-scaffold 技能,为该项目生成前端页面骨架和 API/WebSocket 接入层。
|
||
要求覆盖实时数据、设备状态、基础配置、通道配置、报警历史和控制页面。
|
||
```
|
||
|
||
## 执行提醒
|
||
|
||
在实际执行前,先确认以下信息:
|
||
|
||
- 当前仓库是否已经存在 `backend/` 和 `frontend/`
|
||
- 前端当前使用的具体技术栈和构建工具
|
||
- 后端是否已有可复用入口、配置系统和测试结构
|
||
- 用户要的是“技能文件”、 “设计方案” 还是 “直接生成代码”
|
||
|
||
若信息不足,先补充上下文;若仓库已有实现,优先做兼容式演进,而不是重建。
|