# 任务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无合理理由