Files
smart_grid_iot/database/README.md
T
andyesfly 3d7eb12103 feat: 初始化智能物联网设备管理系统前后端基础项目
完成项目整体结构搭建,包含:
1. 前端Vue3+TS+Vite+Antd项目基础配置与核心依赖
2. 后端MidwayJS+TypeORM+JWT权限认证框架
3. 完整的用户、角色、权限、日志数据库表结构
4. 核心业务模块API与基础服务实现
5. 全局样式、路由、状态管理配置
2026-05-28 16:23:15 +08:00

8.8 KiB

智能电网物联网设备后台管理系统 - 数据库文档

数据库基本信息

  • 数据库名称: smart_grid_iot
  • 字符集: utf8mb4 (支持完整Unicode,包括emoji表情)
  • 排序规则: utf8mb4_unicode_ci
  • 存储引擎: InnoDB (支持事务、外键约束、行级锁)
  • MySQL版本要求: 5.7+ / 8.0+ (推荐8.0+)

表清单

核心业务表(6张)

序号 表名 中文名称 说明
1 users 用户表 存储系统用户信息,包括管理员和普通用户
2 roles 角色表 存储系统角色信息,用于RBAC权限控制
3 permissions 权限表 存储权限信息,支持菜单、按钮、API三种类型,支持树形结构
4 user_roles 用户角色关联表 用户与角色的多对多关联关系
5 role_permissions 角色权限关联表 角色与权限的多对多关联关系
6 operation_logs 操作日志表 记录用户操作行为,用于审计和安全追踪

表结构详细说明

1. users (用户表)

用途: 存储系统所有用户的基本信息和认证信息

主要字段:

  • id: 主键,自增bigint
  • username: 用户名,唯一索引
  • password: bcrypt加密密码
  • nickname: 昵称/显示名称
  • email: 邮箱地址
  • phone: 手机号码
  • avatar: 头像URL
  • status: 账户状态(0-禁用, 1-启用)
  • last_login_at: 最后登录时间
  • last_login_ip: 最后登录IP(支持IPv6)

索引:

  • PRIMARY KEY (id)
  • UNIQUE KEY uk_username (username)
  • KEY idx_status (status) - 按状态筛选用户
  • KEY idx_created_at (created_at) - 按时间排序

2. roles (角色表)

用途: 定义系统中的角色,实现基于角色的访问控制(RBAC)

主要字段:

  • id: 主键
  • name: 角色显示名称
  • code: 角色编码(唯一标识符,如 super_admin)
  • description: 角色描述
  • status: 启用状态
  • sort_order: 排序权重

初始角色:

  1. 超级管理员 (super_admin) - 拥有系统所有权限
  2. 普通管理员 (admin) - 拥有大部分管理权限
  3. 运维人员 (operator) - 拥有设备管理和查看权限

3. permissions (权限表)

用途: 定义系统中的细粒度权限,支持树形菜单结构

权限类型:

  • menu: 菜单权限(对应前端路由页面)
  • button: 按钮权限(控制界面按钮显隐)
  • api: API接口权限(控制后端接口访问)

主要字段:

  • parent_id: 父权限ID(NULL表示一级菜单)
  • route: 前端路由路径
  • component: Vue组件路径
  • icon: 菜单图标

初始权限结构:

├── 仪表盘 (dashboard)
├── 系统管理 (system)
│   ├── 用户管理 (user:list)
│   │   ├── 新增用户 (user:create)
│   │   ├── 编辑用户 (user:update)
│   │   ├── 删除用户 (user:delete)
│   │   └── 重置密码 (user:resetPwd)
│   └── 角色管理 (role:list)
│       ├── 新增角色 (role:create)
│       ├── 编辑角色 (role:update)
│       ├── 删除角色 (role:delete)
│       └── 分配权限 (role:assignPermission)
├── 系统设置 (settings)
│   ├── 基本设置 (system:basicSetting)
│   └── 安全设置 (system:securitySetting)
└── 操作日志 (log:operation)

4. user_roles (用户角色关联表)

用途: 实现用户与角色的多对多关系

特点:

  • 联合唯一索引 (user_id, role_id) 防止重复分配
  • 支持一个用户拥有多个角色
  • 支持一个角色分配给多个用户

5. role_permissions (角色权限关联表)

用途: 实现角色与权限的多对多关系

特点:

  • 联合唯一索引 (role_id, permission_id) 防止重复分配
  • 通过批量授权提高效率
  • 支持灵活的权限组合

6. operation_logs (操作日志表)

用途: 记录系统的操作日志,用于安全审计和问题追踪

记录内容:

  • 操作人信息(user_id, username)
  • 操作详情(action, module, method, url)
  • 网络信息(ip_address, user_agent)
  • 请求数据(request_params - JSON)
  • 响应数据(response_data - JSON)
  • 性能指标(duration - 毫秒)
  • 错误信息(error_message - 仅失败时记录)

索引优化:

  • idx_user_id: 按用户查询日志
  • idx_username: 按用户名查询
  • idx_module: 按模块筛选
  • idx_created_at: 按时间范围查询

初始账户信息

管理员账户

  • 用户名: admin
  • 密码: admin123456
  • 角色: 超级管理员
  • 权限: 拥有系统所有权限

⚠️ 重要提示: 首次登录后请立即修改默认密码!

如何执行初始化脚本

方式一: MySQL命令行客户端

# 登录MySQL
mysql -u root -p

# 执行初始化脚本
source /path/to/database/init.sql;

# 或者一行命令
mysql -u root -p < /path/to/database/init.sql

方式二: Navicat/DBeaver等GUI工具

  1. 打开数据库连接工具
  2. 新建查询窗口
  3. 复制 init.sql 的全部内容
  4. 执行SQL脚本(F5或点击执行按钮)

方式三: Node.js程序化执行

const mysql = require('mysql2/promise');
const fs = require('fs');
const path = require('path');

async function initDatabase() {
  const connection = await mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: 'your_password'
  });

  const sql = fs.readFileSync(
    path.join(__dirname, 'database/init.sql'),
    'utf-8'
  );

  await connection.query(sql);
  console.log('数据库初始化完成!');
  await connection.end();
}

initDatabase().catch(console.error);

注意事项

🔐 安全相关

  1. 修改默认密码: 首次登录后立即修改admin账户的默认密码
  2. 密码加密: 所有密码使用bcrypt加密存储(saltRounds=10)
  3. 敏感数据: operation_logs表可能包含敏感信息,注意访问控制
  4. 备份策略: 定期备份数据库,建议每日自动备份

📊 性能优化建议

  1. 索引使用: 已为常用查询字段建立索引,避免全表扫描
  2. 日志清理: operation_logs表会持续增长,建议定期归档或清理历史数据(如保留90天)
  3. 连接池: 应用层使用连接池管理数据库连接
  4. 查询优化: 避免SELECT *,只查询需要的字段

🔧 维护操作

-- 查看表结构和索引
SHOW CREATE TABLE users;
SHOW INDEX FROM users;

-- 查看数据量
SELECT
  table_name,
  table_rows,
  data_length/1024/1024 AS size_mb
FROM information_schema.tables
WHERE table_schema = 'smart_grid_iot';

-- 清理90天前的操作日志(谨慎执行!)
DELETE FROM operation_logs
WHERE created_at < DATE_SUB(NOW(), INTERVAL 90 DAY);

📝 字符集说明

  • 使用 utf8mb4 而非 utf8,因为:
    • utf8mb4支持完整的Unicode字符集(包括emoji)
    • utf8在MySQL中实际是utf8mb3,最多3字节
    • 某些特殊字符(如💡🔧)需要4字节编码

🚀 版本兼容性

  • MySQL 5.7+: 完全兼容
  • MySQL 8.0+: 推荐,支持更多特性(如CTE、窗口函数)
  • MariaDB 10.3+: 基本兼容,但部分语法可能有差异

ER关系图

users (1) ─────< (N) user_roles (N) >───── (1) roles (1) ─────< (N) role_permissions (N) >───── (1) permissions
                                                                                                        │
                                                                                                        ├─ type: menu (菜单)
                                                                                                        ├─ type: button (按钮)
                                                                                                        └─ type: api (接口)

users (1) ─────────────────────────────────────────────────────────────────────────────────────> (N) operation_logs

技术栈对接

后端 (Node.js + Sequelize)

实体文件位置: server/src/entity/

配置文件

数据库连接配置: server/src/config/config.default.ts 或 config.local.ts


最后更新: 2026-05-27 维护者: 开发团队