222 lines
7.3 KiB
Markdown
222 lines
7.3 KiB
Markdown
|
|
# 任务001:后端骨架
|
|||
|
|
|
|||
|
|
## 目标
|
|||
|
|
|
|||
|
|
搭建Rust + Axum后端项目骨架,连接MySQL和Redis,建立基础路由框架。
|
|||
|
|
|
|||
|
|
## 技术栈
|
|||
|
|
|
|||
|
|
- Rust + Axum + Tokio
|
|||
|
|
- MySQL (sqlx)
|
|||
|
|
- Redis (redis crate)
|
|||
|
|
|
|||
|
|
## 数据库连接
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
MySQL: 10.8.0.252:3306 (root / Hbhyg731024@)
|
|||
|
|
Redis: 10.8.0.252:6379 (password: Hbhyg731024@, db: 5)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**注意:** 不要动现有的 `AZZCWeChat*` 数据库,新建 `pms_dev` 库。
|
|||
|
|
|
|||
|
|
## 项目结构
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
software/server/
|
|||
|
|
├── Cargo.toml
|
|||
|
|
├── src/
|
|||
|
|
│ ├── main.rs # 启动入口
|
|||
|
|
│ ├── config.rs # 配置管理
|
|||
|
|
│ ├── db/
|
|||
|
|
│ │ ├── mod.rs # MySQL连接池
|
|||
|
|
│ │ └── migrate.rs # 数据库迁移(建表)
|
|||
|
|
│ ├── redis.rs # Redis连接
|
|||
|
|
│ ├── routes/
|
|||
|
|
│ │ ├── mod.rs # 路由注册
|
|||
|
|
│ │ └── health.rs # 健康检查接口
|
|||
|
|
│ ── error.rs # 统一错误处理
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 数据库表
|
|||
|
|
|
|||
|
|
创建 `pms_dev` 库,执行以下建表SQL:
|
|||
|
|
|
|||
|
|
```sql
|
|||
|
|
-- 组织表
|
|||
|
|
CREATE TABLE organizations (
|
|||
|
|
id BIGINT AUTO_INCREMENT PRIMARY KEY,
|
|||
|
|
name VARCHAR(100) NOT NULL COMMENT '组织名称',
|
|||
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|||
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
|
|||
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
|||
|
|
|
|||
|
|
-- 项目表
|
|||
|
|
CREATE TABLE projects (
|
|||
|
|
id BIGINT AUTO_INCREMENT PRIMARY KEY,
|
|||
|
|
organization_id BIGINT NOT NULL,
|
|||
|
|
name VARCHAR(100) NOT NULL COMMENT '项目名称',
|
|||
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|||
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|||
|
|
FOREIGN KEY (organization_id) REFERENCES organizations(id)
|
|||
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
|||
|
|
|
|||
|
|
-- 充电柜表
|
|||
|
|
CREATE TABLE cabinets (
|
|||
|
|
id BIGINT AUTO_INCREMENT PRIMARY KEY,
|
|||
|
|
project_id BIGINT,
|
|||
|
|
abstract_id VARCHAR(20) NOT NULL UNIQUE COMMENT '平台抽象ID,如10-00000000',
|
|||
|
|
imei VARCHAR(15) NOT NULL UNIQUE COMMENT '4G模块IMEI',
|
|||
|
|
auth_str VARCHAR(8) COMMENT '签名安全码',
|
|||
|
|
name VARCHAR(100) COMMENT '柜子名称',
|
|||
|
|
status TINYINT DEFAULT 0 COMMENT '0离线 1在线',
|
|||
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|||
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|||
|
|
FOREIGN KEY (project_id) REFERENCES projects(id)
|
|||
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
|||
|
|
|
|||
|
|
-- 仓控板表
|
|||
|
|
CREATE TABLE cabin_boards (
|
|||
|
|
id BIGINT AUTO_INCREMENT PRIMARY KEY,
|
|||
|
|
cabinet_id BIGINT NOT NULL,
|
|||
|
|
board_id TINYINT NOT NULL COMMENT '仓控板ID 1-6',
|
|||
|
|
status TINYINT DEFAULT 0,
|
|||
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|||
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|||
|
|
FOREIGN KEY (cabinet_id) REFERENCES cabinets(id)
|
|||
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
|||
|
|
|
|||
|
|
-- 仓体表
|
|||
|
|
CREATE TABLE compartments (
|
|||
|
|
id BIGINT AUTO_INCREMENT PRIMARY KEY,
|
|||
|
|
cabin_board_id BIGINT NOT NULL,
|
|||
|
|
channel_id TINYINT NOT NULL COMMENT '通道ID 1-6',
|
|||
|
|
status TINYINT DEFAULT 0 COMMENT '0空闲 1充电中 2故障 3禁用',
|
|||
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|||
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|||
|
|
FOREIGN KEY (cabin_board_id) REFERENCES cabin_boards(id)
|
|||
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
|||
|
|
|
|||
|
|
-- 用户表
|
|||
|
|
CREATE TABLE users (
|
|||
|
|
id BIGINT AUTO_INCREMENT PRIMARY KEY,
|
|||
|
|
phone VARCHAR(11) NOT NULL UNIQUE COMMENT '手机号',
|
|||
|
|
name VARCHAR(50) COMMENT '姓名',
|
|||
|
|
password VARCHAR(100) NOT NULL,
|
|||
|
|
role TINYINT DEFAULT 0 COMMENT '0普通 1企业管理员 2总管理员',
|
|||
|
|
organization_id BIGINT,
|
|||
|
|
status TINYINT DEFAULT 1 COMMENT '0禁用 1启用',
|
|||
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|||
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|||
|
|
FOREIGN KEY (organization_id) REFERENCES organizations(id)
|
|||
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
|||
|
|
|
|||
|
|
-- 充电记录表
|
|||
|
|
CREATE TABLE charge_records (
|
|||
|
|
id BIGINT AUTO_INCREMENT PRIMARY KEY,
|
|||
|
|
compartment_id BIGINT NOT NULL,
|
|||
|
|
cabinet_id BIGINT NOT NULL,
|
|||
|
|
start_time TIMESTAMP,
|
|||
|
|
end_time TIMESTAMP,
|
|||
|
|
energy DECIMAL(10,2) COMMENT '充电量kWh',
|
|||
|
|
max_temperature DECIMAL(5,1) COMMENT '最高温度',
|
|||
|
|
status TINYINT DEFAULT 0 COMMENT '0正常 1异常 2手动停止',
|
|||
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|||
|
|
FOREIGN KEY (compartment_id) REFERENCES compartments(id),
|
|||
|
|
FOREIGN KEY (cabinet_id) REFERENCES cabinets(id)
|
|||
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
|||
|
|
|
|||
|
|
-- 设备日志表
|
|||
|
|
CREATE TABLE device_logs (
|
|||
|
|
id BIGINT AUTO_INCREMENT PRIMARY KEY,
|
|||
|
|
cabinet_id BIGINT NOT NULL,
|
|||
|
|
log_type TINYINT NOT NULL COMMENT '1状态上报 2故障 3告警 4停电',
|
|||
|
|
content TEXT COMMENT '日志内容JSON',
|
|||
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|||
|
|
FOREIGN KEY (cabinet_id) REFERENCES cabinets(id)
|
|||
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
|||
|
|
|
|||
|
|
-- 能耗统计表
|
|||
|
|
CREATE TABLE energy_stats (
|
|||
|
|
id BIGINT AUTO_INCREMENT PRIMARY KEY,
|
|||
|
|
cabinet_id BIGINT NOT NULL,
|
|||
|
|
stat_date DATE NOT NULL,
|
|||
|
|
total_energy DECIMAL(10,2) COMMENT '总能耗kWh',
|
|||
|
|
charge_count INT DEFAULT 0 COMMENT '充电次数',
|
|||
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|||
|
|
FOREIGN KEY (cabinet_id) REFERENCES cabinets(id),
|
|||
|
|
UNIQUE KEY uk_cabinet_date (cabinet_id, stat_date)
|
|||
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
|||
|
|
|
|||
|
|
-- 操作日志表
|
|||
|
|
CREATE TABLE operation_logs (
|
|||
|
|
id BIGINT AUTO_INCREMENT PRIMARY KEY,
|
|||
|
|
user_id BIGINT NOT NULL,
|
|||
|
|
action VARCHAR(100) NOT NULL COMMENT '操作动作',
|
|||
|
|
target_type VARCHAR(50) COMMENT '操作对象类型',
|
|||
|
|
target_id BIGINT COMMENT '操作对象ID',
|
|||
|
|
detail TEXT COMMENT '操作详情',
|
|||
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|||
|
|
FOREIGN KEY (user_id) REFERENCES users(id)
|
|||
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## API路由
|
|||
|
|
|
|||
|
|
注册以下基础路由:
|
|||
|
|
|
|||
|
|
```rust
|
|||
|
|
// 健康检查
|
|||
|
|
GET /api/health → 返回 {"status": "ok"}
|
|||
|
|
|
|||
|
|
// 认证
|
|||
|
|
POST /api/auth/login → 登录
|
|||
|
|
POST /api/auth/logout → 登出
|
|||
|
|
|
|||
|
|
// 组织管理
|
|||
|
|
GET /api/organizations → 组织列表
|
|||
|
|
POST /api/organizations → 创建组织
|
|||
|
|
PUT /api/organizations/:id → 更新组织
|
|||
|
|
DELETE /api/organizations/:id → 删除组织
|
|||
|
|
|
|||
|
|
// 项目管理
|
|||
|
|
GET /api/projects → 项目列表
|
|||
|
|
POST /api/projects → 创建项目
|
|||
|
|
PUT /api/projects/:id → 更新项目
|
|||
|
|
DELETE /api/projects/:id → 删除项目
|
|||
|
|
|
|||
|
|
// 设备管理
|
|||
|
|
GET /api/cabinets → 柜子列表
|
|||
|
|
POST /api/cabinets → 添加柜子(支持批量IMEI)
|
|||
|
|
PUT /api/cabinets/:id → 更新柜子
|
|||
|
|
DELETE /api/cabinets/:id → 删除柜子
|
|||
|
|
POST /api/cabinets/:id/regenerate-auth → 重新生成auth_str
|
|||
|
|
|
|||
|
|
// 充电记录
|
|||
|
|
GET /api/charge-records → 充电记录列表
|
|||
|
|
GET /api/charge-records/export → 导出充电记录
|
|||
|
|
|
|||
|
|
// 设备日志
|
|||
|
|
GET /api/device-logs → 设备日志列表
|
|||
|
|
|
|||
|
|
// 能耗管理
|
|||
|
|
GET /api/energy-stats → 能耗统计
|
|||
|
|
|
|||
|
|
// 用户管理
|
|||
|
|
GET /api/users → 用户列表
|
|||
|
|
POST /api/users → 创建用户
|
|||
|
|
PUT /api/users/:id → 更新用户
|
|||
|
|
PUT /api/users/:id/reset-password → 重置密码
|
|||
|
|
|
|||
|
|
// 操作日志
|
|||
|
|
GET /api/operation-logs → 操作日志列表
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 质量约束
|
|||
|
|
|
|||
|
|
1. 完成代码后执行 `cargo check`,必须零报错、零警告
|
|||
|
|
2. 分层拆分,单函数≤80行,命名语义化,完整注释
|
|||
|
|
3. 所有外部IO/网络请求异常捕获,禁止裸panic
|
|||
|
|
4. 分支逻辑全覆盖,不遗漏兜底分支
|
|||
|
|
5. 常量抽离,不使用废弃API
|
|||
|
|
6. Rust内存安全,合理管理所有权,禁用unsafe无合理理由
|