后端dao层,路由层适配数据库优化

pull/49/head
echo 4 months ago
parent 67656905c3
commit 414565706a

@ -1,7 +1,7 @@
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from .routers import auth, health, secure, users, clusters, nodes, metrics, logs, faults, exec_logs, ops, ai, hadoop_logs, sys_exec_logs
from .routers import auth, health, secure, users, clusters, nodes, metrics, faults, ops, ai, hadoop_logs, sys_exec_logs, hadoop_exec_logs
app = FastAPI(title="Hadoop Fault Detecting API", version="v1")
@ -20,10 +20,9 @@ app.include_router(clusters.router, prefix="/api/v1")
app.include_router(nodes.router, prefix="/api/v1")
app.include_router(metrics.router, prefix="/api/v1")
app.include_router(users.router, prefix="/api/v1")
app.include_router(logs.router, prefix="/api/v1")
app.include_router(hadoop_logs.router, prefix="/api/v1")
app.include_router(faults.router, prefix="/api/v1")
app.include_router(exec_logs.router, prefix="/api/v1")
app.include_router(hadoop_exec_logs.router, prefix="/api/v1")
app.include_router(ops.router, prefix="/api/v1")
app.include_router(ai.router, prefix="/api/v1")
app.include_router(hadoop_logs.router, prefix="/api/v1")
app.include_router(sys_exec_logs.router, prefix="/api/v1")

@ -1,6 +1,6 @@
from fastapi import APIRouter, Depends, HTTPException, Query
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy import select
from sqlalchemy import select, func, or_
from ..db import get_db
from ..deps.auth import get_current_user
from ..log_reader import log_reader
@ -8,6 +8,8 @@ from ..log_collector import log_collector
from ..ssh_utils import ssh_manager
from ..models.nodes import Node
from ..models.clusters import Cluster
from ..models.hadoop_logs import HadoopLog
from datetime import datetime
from ..schemas import (
LogRequest,
LogResponse,
@ -18,6 +20,69 @@ from ..schemas import (
router = APIRouter()
def _parse_time(s: str | None) -> datetime | None:
if not s:
return None
try:
if s.endswith("Z"):
s = s[:-1] + "+00:00"
return datetime.fromisoformat(s)
except Exception:
return None
@router.get("/logs")
async def list_logs(
user=Depends(get_current_user),
db: AsyncSession = Depends(get_db),
cluster: str | None = Query(None),
node: str | None = Query(None),
source: str | None = Query(None),
time_from: str | None = Query(None),
page: int = Query(1, ge=1),
size: int = Query(10, ge=1, le=100),
):
try:
stmt = select(HadoopLog)
count_stmt = select(func.count(HadoopLog.log_id))
filters = []
if cluster:
filters.append(HadoopLog.cluster_name == cluster)
if node:
filters.append(HadoopLog.node_host == node)
if source:
like = f"%{source}%"
filters.append(or_(HadoopLog.title.ilike(like), HadoopLog.info.ilike(like), HadoopLog.node_host.ilike(like)))
tf = _parse_time(time_from)
if tf:
filters.append(HadoopLog.log_time >= tf)
for f in filters:
stmt = stmt.where(f)
count_stmt = count_stmt.where(f)
stmt = stmt.order_by(HadoopLog.log_time.desc()).offset((page - 1) * size).limit(size)
rows = (await db.execute(stmt)).scalars().all()
total = (await db.execute(count_stmt)).scalar() or 0
items = [
{
"id": r.log_id,
"time": r.log_time.isoformat() if r.log_time else None,
"cluster": r.cluster_name,
"node": r.node_host,
"title": r.title,
"info": r.info,
}
for r in rows
]
return {"items": items, "total": int(total)}
except HTTPException:
raise
except Exception as e:
print(f"Error listing logs: {e}")
raise HTTPException(status_code=500, detail="server_error")
async def get_node_ip(db: AsyncSession, node_name: str) -> str:
result = await db.execute(select(Node.ip_address).where(Node.hostname == node_name))
ip = result.scalar_one_or_none()

@ -1,78 +0,0 @@
from fastapi import APIRouter, Depends, Query, HTTPException
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy import select, func, or_
from ..db import get_db
from ..models.hadoop_logs import HadoopLog
from ..deps.auth import get_current_user
from datetime import datetime, timezone
router = APIRouter()
def _get_username(u) -> str:
return getattr(u, "username", None) or (u.get("username") if isinstance(u, dict) else None)
def _parse_time(s: str | None) -> datetime | None:
if not s:
return None
try:
if s.endswith("Z"):
s = s[:-1] + "+00:00"
return datetime.fromisoformat(s)
except Exception:
return None
@router.get("/logs")
async def list_logs(
user=Depends(get_current_user),
db: AsyncSession = Depends(get_db),
cluster: str | None = Query(None),
node: str | None = Query(None),
source: str | None = Query(None),
time_from: str | None = Query(None),
page: int = Query(1, ge=1),
size: int = Query(10, ge=1, le=100),
):
try:
stmt = select(HadoopLog)
count_stmt = select(func.count(HadoopLog.log_id))
filters = []
if cluster:
filters.append(HadoopLog.cluster_name == cluster)
if node:
filters.append(HadoopLog.node_host == node)
if source:
like = f"%{source}%"
filters.append(or_(HadoopLog.title.ilike(like), HadoopLog.info.ilike(like), HadoopLog.node_host.ilike(like)))
tf = _parse_time(time_from)
if tf:
filters.append(HadoopLog.log_time >= tf)
for f in filters:
stmt = stmt.where(f)
count_stmt = count_stmt.where(f)
stmt = stmt.order_by(HadoopLog.log_time.desc()).offset((page - 1) * size).limit(size)
rows = (await db.execute(stmt)).scalars().all()
total = (await db.execute(count_stmt)).scalar() or 0
items = [
{
"id": r.log_id,
"time": r.log_time.isoformat() if r.log_time else None,
"cluster": r.cluster_name,
"node": r.node_host,
"title": r.title,
"info": r.info,
}
for r in rows
]
return {"items": items, "total": int(total)}
except HTTPException:
raise
except Exception as e:
print(f"Error listing logs: {e}")
raise HTTPException(status_code=500, detail="server_error")

@ -40,12 +40,12 @@ app/
| nodes | /api/v1 | 节点管理 |
| metrics | /api/v1 | 指标监控 |
| users | /api/v1 | 用户管理 |
| logs | /api/v1 | 日志管理 |
| hadoop_logs | /api/v1 | Hadoop日志管理 |
| faults | /api/v1 | 故障检测 |
| exec_logs | /api/v1 | 执行日志 |
| hadoop_exec_logs | /api/v1 | Hadoop执行日志 |
| ops | /api/v1 | 操作管理 |
| ai | /api/v1 | AI智能分析 |
| hadoop_logs | /api/v1 | Hadoop日志分析 |
| sys_exec_logs | /api/v1 | 系统操作日志 |
## 详细API文档
@ -613,109 +613,7 @@ Authorization: Bearer {token}
}
```
### 6. 日志管理 (logs.py)
#### 接口列表
| 方法 | 路径 | 功能描述 | 认证要求 |
|------|------|----------|----------|
| GET | /logs | 获取日志列表,支持多种筛选条件 | 是 |
| GET | /logs/meta | 获取日志元数据(集群、节点、服务列表) | 是 |
#### 详细接口说明
##### GET /logs
**功能描述**
获取日志列表,支持多种筛选条件。
**请求参数**
- level: 日志级别(可选)
- cluster: 集群UUID可选
- node: 节点名称(可选)
- op: 服务名称(可选)
- source: 日志来源(可选)
- time_from: 开始时间ISO格式可选
- page: 页码默认1
- size: 每页条数默认101-100
**请求头**
```
Authorization: Bearer {token}
```
**响应格式**
```json
{
"items": [
{
"id": 0,
"time": "string",
"level": "string",
"cluster": "string",
"node": "string",
"op": "string",
"user": "string",
"source": "string",
"message": "string"
}
],
"total": 0
}
```
**响应示例**
```json
{
"items": [
{
"id": 1,
"time": "2025-12-18T00:00:00+00:00",
"level": "info",
"cluster": "123e4567-e89b-12d3-a456-426614174000",
"node": "hadoop-master",
"op": "NameNode",
"user": "system",
"source": "hadoop",
"message": "NameNode started successfully"
}
],
"total": 1
}
```
##### GET /logs/meta
**功能描述**
获取日志元数据,包括有日志的集群、节点和服务列表。
**请求参数**
**请求头**
```
Authorization: Bearer {token}
```
**响应格式**
```json
{
"clusters": ["string"],
"nodes": ["string"],
"ops": ["string"]
}
```
**响应示例**
```json
{
"clusters": ["123e4567-e89b-12d3-a456-426614174000"],
"nodes": ["hadoop-master", "hadoop-node1"],
"ops": ["NameNode", "DataNode", "ResourceManager"]
}
```
### 7. 故障检测 (faults.py)
### 6. 故障检测 (faults.py)
#### 接口列表
@ -905,26 +803,23 @@ Authorization: Bearer {token}
}
```
### 8. 执行日志 (exec_logs.py)
### 7. Hadoop执行日志 (hadoop_exec_logs.py)
#### 接口列表
| 方法 | 路径 | 功能描述 | 认证要求 |
|------|------|----------|----------|
| GET | /exec-logs | 获取执行日志列表 | 是 |
| POST | /exec-logs | 创建新执行日志 | 是 |
| PUT | /exec-logs/{exec_id} | 更新执行日志 | 是 |
| DELETE | /exec-logs/{exec_id} | 删除执行日志 | 是 |
| GET | /exec-logs | 获取所有执行日志 | 是 |
| POST | /exec-logs | 创建新执行日志 | 是 |
| PUT | /exec-logs/{log_id} | 更新执行日志 | 是 |
| DELETE | /exec-logs/{log_id} | 删除执行日志 | 是 |
#### 详细接口说明
##### GET /exec-logs
**功能描述**
获取执行日志列表,按开始时间倒序排列。
**请求参数**
获取所有执行日志,按开始时间倒序排列。
**请求头**
```
@ -936,40 +831,12 @@ Authorization: Bearer {token}
{
"items": [
{
"exec_id": "string",
"fault_id": "string",
"command_type": "string",
"command_content": "string",
"execution_status": "string",
"id": 0,
"from_user_id": 0,
"cluster_name": "string",
"description": "string",
"start_time": "string",
"end_time": "string",
"duration": 0,
"exit_code": 0,
"operator": "string",
"created_at": "string",
"updated_at": "string"
}
]
}
```
**响应示例**
```json
{
"items": [
{
"exec_id": "exec-123",
"fault_id": "fault-123",
"command_type": "repair",
"command_content": "[auto]",
"execution_status": "completed",
"start_time": "2025-12-18T00:00:00+00:00",
"end_time": "2025-12-18T00:01:00+00:00",
"duration": 60,
"exit_code": 0,
"operator": "admin",
"created_at": "2025-12-18T00:00:00+00:00",
"updated_at": "2025-12-18T00:01:00+00:00"
"end_time": "string"
}
]
}
@ -978,83 +845,37 @@ Authorization: Bearer {token}
##### POST /exec-logs
**功能描述**
创建新执行日志。
**请求头**
```
Authorization: Bearer {token}
```
**请求体**
```json
{
"exec_id": "string",
"fault_id": "string",
"command_type": "string",
"execution_status": "string",
"start_time": "string",
"end_time": "string",
"exit_code": 0
}
```
**请求示例**
```json
{
"exec_id": "exec-123",
"fault_id": "fault-123",
"command_type": "repair",
"execution_status": "completed",
"start_time": "2025-12-18T00:00:00+00:00",
"end_time": "2025-12-18T00:01:00+00:00",
"exit_code": 0
}
```
创建新的执行日志。
**响应格式**
```json
{
"ok": true
}
```
**请求参数**
- from_user_id: 用户ID (必填)
- cluster_name: 集群名称 (必填)
- description: 描述 (可选)
- start_time: 开始时间 (ISO格式可选)
- end_time: 结束时间 (ISO格式可选)
**错误示例**
**响应示例**
```json
{
"detail": "server_error"
"ok": true,
"id": 1
}
```
##### PUT /exec-logs/{exec_id}
##### PUT /exec-logs/{log_id}
**功能描述**
更新执行日志信息。
更新指定的执行日志信息。
**请求参数**
- exec_id: 执行日志ID路径参数必填
**请求头**
```
Authorization: Bearer {token}
```
- log_id: 执行日志ID (路径参数,必填)
**请求体**
```json
{
"fault_id": "string",
"command_type": "string",
"execution_status": "string",
"description": "string",
"start_time": "string",
"end_time": "string",
"exit_code": 0
}
```
**请求示例**
```json
{
"execution_status": "failed",
"exit_code": 1
"end_time": "string"
}
```
@ -1065,25 +886,13 @@ Authorization: Bearer {token}
}
```
**错误示例**
```json
{
"detail": "server_error"
}
```
##### DELETE /exec-logs/{exec_id}
##### DELETE /exec-logs/{log_id}
**功能描述**
删除指定的执行日志。
**请求参数**
- exec_id: 执行日志ID路径参数必填
**请求头**
```
Authorization: Bearer {token}
```
- log_id: 执行日志ID (路径参数,必填)
**响应格式**
```json
@ -1092,14 +901,7 @@ Authorization: Bearer {token}
}
```
**错误示例**
```json
{
"detail": "server_error"
}
```
### 9. 操作管理 (ops.py)
### 8. 操作管理 (ops.py)
#### 接口列表
@ -1178,7 +980,7 @@ Authorization: Bearer {token}
}
```
### 10. AI智能分析 (ai.py)
### 9. AI智能分析 (ai.py)
#### 接口列表
@ -1338,12 +1140,13 @@ Authorization: Bearer {token}
}
```
### 11. Hadoop日志分析 (hadoop_logs.py)
### 10. Hadoop日志管理 (hadoop_logs.py)
#### 接口列表
| 方法 | 路径 | 功能描述 | 认证要求 |
|------|------|----------|----------|
| GET | /logs | 获取Hadoop聚合日志列表 | 是 |
| GET | /hadoop/nodes/ | 获取所有Hadoop节点列表 | 是 |
| GET | /hadoop/logs/{node_name}/{log_type}/ | 获取特定Hadoop节点的日志 | 是 |
| GET | /hadoop/logs/all/{log_type}/ | 获取所有Hadoop节点的日志 | 是 |
@ -1717,7 +1520,7 @@ Authorization: Bearer {token}
}
```
### 12. 用户管理 (users.py)
### 11. 用户管理 (users.py)
#### 接口列表
@ -1915,10 +1718,63 @@ Authorization: Bearer {token}
}
```
### 13. 安全相关 (secure.py)
### 12. 安全相关 (secure.py)
**说明**:安全相关模块当前只包含一个获取当前用户信息的接口,该接口已在身份认证模块中详细描述。
### 13. 系统操作日志 (sys_exec_logs.py)
#### 接口列表
| 方法 | 路径 | 功能描述 | 认证要求 |
|------|------|----------|----------|
| GET | /sys-exec-logs | 获取系统操作日志列表 | 是 |
| POST | /sys-exec-logs | 创建系统操作日志 | 是 |
| DELETE | /sys-exec-logs/{operation_id} | 删除系统操作日志 | 是 |
#### 详细接口说明
##### GET /sys-exec-logs
**功能描述**
获取系统操作日志列表,支持分页。
**请求参数**
- page: 页码 (默认1)
- size: 每页数量 (默认10)
**响应格式**
```json
{
"items": [
{
"operation_id": "string",
"user_id": 0,
"description": "string",
"operation_time": "string"
}
],
"total": 0
}
```
##### POST /sys-exec-logs
**功能描述**
创建系统操作日志。
**请求参数**
- user_id: 用户ID (必填)
- description: 操作描述 (必填)
**响应示例**
```json
{
"ok": true,
"operation_id": "uuid-string"
}
```
## 数据模型
### 用户模型 (User)
@ -1967,47 +1823,36 @@ Authorization: Bearer {token}
| created_at | datetime | 创建时间 |
| updated_at | datetime | 更新时间 |
### 系统日志模型 (SystemLog)
### Hadoop日志模型 (HadoopLog)
| 字段名 | 类型 | 描述 |
|--------|------|------|
| id | int | 日志ID |
| log_id | str | 日志标识 |
| fault_id | str | 关联故障ID |
| cluster_id | int | 所属集群ID |
| timestamp | datetime | 日志时间 |
| host | str | 主机名 |
| service | str | 服务名称 |
| source | str | 日志来源 |
| log_level | str | 日志级别 |
| message | str | 日志内容 |
| exception | str | 异常信息 |
| raw_log | str | 原始日志 |
| processed | bool | 是否已处理 |
| created_at | datetime | 创建时间 |
| log_id | int | 日志ID (主键, 自增) |
| cluster_name | str | 集群名称 |
| node_host | str | 节点主机名 |
| title | str | 日志标题 |
| info | str | 日志详细信息 |
| log_time | datetime | 日志时间 |
### 执行日志模型 (ExecLog)
### Hadoop执行日志模型 (HadoopExecLog)
| 字段名 | 类型 | 描述 |
|--------|------|------|
| id | int | 执行日志ID |
| exec_id | str | 执行ID |
| fault_id | str | 关联故障ID |
| command_type | str | 命令类型 |
| script_path | str | 脚本路径 |
| command_content | str | 命令内容 |
| target_nodes | JSON | 目标节点 |
| risk_level | str | 风险级别 |
| execution_status | str | 执行状态 |
| id | int | 执行日志ID (主键, 自增) |
| from_user_id | int | 操作用户ID |
| cluster_name | str | 集群名称 |
| description | str | 执行描述 |
| start_time | datetime | 开始时间 |
| end_time | datetime | 结束时间 |
| duration | int | 执行时长(秒) |
| stdout_log | str | 标准输出日志 |
| stderr_log | str | 标准错误日志 |
| exit_code | int | 退出码 |
| operator | str | 操作员 |
| created_at | datetime | 创建时间 |
| updated_at | datetime | 更新时间 |
### 系统操作日志模型 (SysExecLog)
| 字段名 | 类型 | 描述 |
|--------|------|------|
| operation_id | UUID | 操作ID (主键, UUID) |
| user_id | int | 用户ID |
| description | str | 操作描述 |
| operation_time | datetime | 操作时间 |
## 认证与授权

@ -1,301 +1,186 @@
# 故障检测系统数据字典
## 1. 数据字典概述
### 1.1 文档说明
本文档详细描述了故障检测系统数据库中所有表、字段、索引、约束等数据库对象的定义和说明为PowerDesigner建模和系统开发提供参考。
### 1.2 版本信息
- **版本**: v1.2
- **创建日期**: 2025年
- **数据库**: PostgreSQL 14+
- **字符集**: UTF8
## 2. 表结构详细说明
#### 表名: roles (角色表)
**表说明**: 系统角色定义
| 序号 | 字段名 | 数据类型 | 长度 | 精度 | 是否主键 | 是否为空 | 默认值 | 字段说明 | 备注 |
|---|---|---|---|---|---|---|---|---|---|
| 1 | id | BIGINT | - | - | ✓ | NOT NULL | - | 主键ID | |
| 2 | role_name | CHARACTER | - | - | - | NOT NULL | - | 角色名称 | |
| 3 | role_key | CHARACTER | - | - | - | NOT NULL | - | 角色唯一标识 | |
| 4 | description | CHARACTER | - | - | - | NULL | - | 角色描述 | |
| 5 | is_system_role | BOOLEAN | - | - | - | NOT NULL | false | 是否为系统内置角色 | |
| 6 | created_at | TIMESTAMP | - | - | - | NOT NULL | now() | 创建时间 | |
| 7 | updated_at | TIMESTAMP | - | - | - | NOT NULL | now() | 更新时间 | |
**索引信息**:
- PRIMARY KEY: (id)
#### 表名: permissions (权限表)
**表说明**: 系统权限定义
| 序号 | 字段名 | 数据类型 | 长度 | 精度 | 是否主键 | 是否为空 | 默认值 | 字段说明 | 备注 |
|---|---|---|---|---|---|---|---|---|---|
| 1 | id | BIGINT | - | - | ✓ | NOT NULL | - | 主键ID | |
| 2 | permission_name | CHARACTER | - | - | - | NOT NULL | - | 权限名称 | |
| 3 | permission_key | CHARACTER | - | - | - | NOT NULL | - | 权限唯一标识 | |
| 4 | description | CHARACTER | - | - | - | NULL | - | 权限描述 | |
| 5 | created_at | TIMESTAMP | - | - | - | NOT NULL | now() | 创建时间 | |
**索引信息**:
- PRIMARY KEY: (id)
#### 表名: role_permission_mapping (角色-权限映射表)
**表说明**: 角色与权限的多对多关系
| 序号 | 字段名 | 数据类型 | 长度 | 精度 | 是否主键 | 是否为空 | 默认值 | 字段说明 | 备注 |
|---|---|---|---|---|---|---|---|---|---|
| 1 | role_id | BIGINT | - | - | ✓ | NOT NULL | - | 角色ID | |
| 2 | permission_id | BIGINT | - | - | ✓ | NOT NULL | - | 权限ID | |
**索引信息**:
- PRIMARY KEY: (role_id, permission_id)
- FOREIGN KEY: FK(permission_id) -> public.permissions(id)
- FOREIGN KEY: FK(role_id) -> public.roles(id)
#### 表名: user_role_mapping (用户-角色映射表)
**表说明**: 用户与角色的多对多关系
| 序号 | 字段名 | 数据类型 | 长度 | 精度 | 是否主键 | 是否为空 | 默认值 | 字段说明 | 备注 |
|---|---|---|---|---|---|---|---|---|---|
| 1 | user_id | BIGINT | - | - | ✓ | NOT NULL | - | 用户ID | |
| 2 | role_id | BIGINT | - | - | ✓ | NOT NULL | - | 角色ID | |
**索引信息**:
- PRIMARY KEY: (user_id, role_id)
- FOREIGN KEY: FK(role_id) -> public.roles(id)
- FOREIGN KEY: FK(user_id) -> public.users(id)
#### 表名: fault_records (故障记录表)
**表说明**: 存储系统检测到的所有故障信息,是系统的核心业务表
| 序号 | 字段名 | 数据类型 | 长度 | 精度 | 是否主键 | 是否为空 | 默认值 | 字段说明 | 备注 |
|---|---|---|---|---|---|---|---|---|---|
| 1 | id | BIGINT | - | - | ✓ | NOT NULL | IDENTITY | 主键ID | |
| 2 | fault_id | VARCHAR | 32 | - | - | NOT NULL | - | 故障唯一标识 | 格式: FLT-YYYYMMDD-XXXX |
| 3 | cluster_id | BIGINT | - | - | - | NULL | - | 关联集群ID | 外键关联clusters表 |
| 4 | fault_type | VARCHAR | 50 | - | - | NOT NULL | - | 故障类型 | DataNode离线/磁盘不足等 |
| 5 | fault_level | VARCHAR | 20 | - | - | NOT NULL | 'medium' | 故障级别 | low/medium/high/critical |
| 6 | title | VARCHAR | 200 | - | - | NOT NULL | - | 故障标题 | 简短描述 |
| 7 | description | TEXT | - | - | - | NULL | - | 故障详细描述 | 详细说明 |
| 8 | affected_nodes | JSONB | - | - | - | NULL | - | 受影响的节点列表 | JSONB数组 |
| 9 | affected_clusters | JSONB | - | - | - | NULL | - | 受影响的集群列表 | JSONB数组 |
| 10 | root_cause | TEXT | - | - | - | NULL | - | 根本原因分析 | AI分析结果 |
| 11 | repair_suggestion | TEXT | - | - | - | NULL | - | 修复建议 | AI生成的修复建议 |
| 12 | status | VARCHAR | 20 | - | - | - | NOT NULL | 'detected' | 状态 | detected/analyzing/repairing/resolved/failed |
| 12 | assignee | VARCHAR | 50 | - | - | NULL | - | 负责人 | 处理人员 |
| 13 | reporter | VARCHAR | 50 | - | - | NULL | 'system' | 报告人 | 故障发现者 |
| 15 | created_at | TIMESTAMPTZ | - | - | - | NOT NULL | NOW() | 创建时间 | 故障发现时间 |
| 16 | updated_at | TIMESTAMPTZ | - | - | - | NOT NULL | NOW() | 更新时间 | 最后修改时间 |
| 17 | resolved_at | TIMESTAMPTZ | - | - | - | NULL | - | 解决时间 | 故障解决时间 |
**索引信息**:
- PRIMARY KEY: id
- UNIQUE KEY: uk_fault_id (fault_id)
- INDEX: idx_fault_records_type (fault_type)
- INDEX: idx_fault_records_status (status)
- INDEX: idx_fault_records_created_at (created_at)
**外键约束**:
- fk_fault_records_cluster_id: cluster_id → clusters.id
#### 表名: exec_logs (执行日志表)
**表说明**: 记录自动修复脚本的执行过程和结果
| 序号 | 字段名 | 数据类型 | 长度 | 精度 | 是否主键 | 是否为空 | 默认值 | 字段说明 | 备注 |
|---|---|---|---|---|---|---|---|---|---|
| 1 | id | BIGINT | - | - | ✓ | NOT NULL | - | 主键ID | |
| 2 | exec_id | CHARACTER | - | - | - | NOT NULL | - | 执行唯一标识 | |
| 3 | fault_id | CHARACTER | - | - | - | NOT NULL | - | 关联故障标识(无外键) | |
| 4 | command_type | CHARACTER | - | - | - | NOT NULL | - | 命令类型 | |
| 5 | script_path | CHARACTER | - | - | - | NULL | - | 脚本路径 | |
| 6 | command_content | TEXT | - | - | - | NOT NULL | - | 执行的命令内容 | |
| 7 | target_nodes | JSONB | - | - | - | NULL | - | 目标执行节点(JSONB) | |
| 8 | risk_level | CHARACTER | - | - | - | NOT NULL | 'medium'::character | 风险级别(low/medium/high) | |
| 9 | execution_status | CHARACTER | - | - | - | NOT NULL | 'pending'::character | 执行状态(pending/running/success/failed/timeout) | |
| 10 | start_time | TIMESTAMP | - | - | - | NULL | - | 开始执行时间 | |
| 11 | end_time | TIMESTAMP | - | - | - | NULL | - | 结束执行时间 | |
| 12 | duration | INTEGER | - | - | - | NULL | - | 执行时长(秒) | |
| 13 | stdout_log | TEXT | - | - | - | NULL | - | 标准输出日志 | |
| 14 | stderr_log | TEXT | - | - | - | NULL | - | 错误输出日志 | |
| 15 | exit_code | INTEGER | - | - | - | NULL | - | 退出码 | |
| 16 | operator | CHARACTER | - | - | - | NOT NULL | 'system'::character | 操作人 | |
| 17 | created_at | TIMESTAMP | - | - | - | NOT NULL | now() | 创建时间 | |
| 18 | updated_at | TIMESTAMP | - | - | - | NOT NULL | now() | 更新时间 | |
**索引信息**:
- PRIMARY KEY: (id)
- INDEX: idx_exec_logs_end_time (end_time)
- INDEX: idx_exec_logs_fault_id (fault_id)
- INDEX: idx_exec_logs_start_time (start_time)
- INDEX: idx_exec_logs_status (execution_status)
#### 表名: nodes (节点信息表)
**表说明**: 记录集群内各节点的状态信息
| 序号 | 字段名 | 数据类型 | 长度 | 精度 | 是否主键 | 是否为空 | 默认值 | 字段说明 | 备注 |
|---|---|---|---|---|---|---|---|---|---|
| 1 | id | BIGINT | - | - | ✓ | NOT NULL | - | 主键ID | |
| 2 | uuid | UUID | - | - | - | NOT NULL | - | 节点唯一标识(UUID) | |
| 3 | cluster_id | BIGINT | - | - | - | NOT NULL | - | 所属集群ID | |
| 4 | hostname | CHARACTER | - | - | - | NOT NULL | - | 节点主机名 | |
| 5 | ip_address | INET | - | - | - | NOT NULL | - | 节点IP地址(INET, 兼容IPv4/IPv6) | |
| 6 | status | CHARACTER | - | - | - | NOT NULL | 'unknown'::character | 节点健康状态(healthy/unhealthy/warning/unknown) | |
| 7 | last_heartbeat | TIMESTAMP | - | - | - | NULL | - | 最后心跳时间 | |
| 8 | created_at | TIMESTAMP | - | - | - | NOT NULL | now() | 创建时间 | |
| 9 | updated_at | TIMESTAMP | - | - | - | NOT NULL | now() | 更新时间 | |
| 10 | ssh_user | CHARACTER | - | - | - | NULL | - | | |
| 11 | ssh_password | CHARACTER | - | - | - | NULL | - | | |
**索引信息**:
- PRIMARY KEY: (id)
- INDEX: idx_nodes_cluster_id (cluster_id)
- INDEX: idx_nodes_ip_address (ip_address)
- INDEX: idx_nodes_last_heartbeat (last_heartbeat)
- INDEX: idx_nodes_status (status)
- INDEX: uk_cluster_hostname (cluster_id, hostname)
- FOREIGN KEY: FK(cluster_id) -> public.clusters(id)
#### 表名: system_logs (系统日志表)
**表说明**: 存储从Flume采集的原始日志数据
| 序号 | 字段名 | 数据类型 | 长度 | 精度 | 是否主键 | 是否为空 | 默认值 | 字段说明 | 备注 |
|---|---|---|---|---|---|---|---|---|---|
| 1 | id | BIGINT | - | - | ✓ | NOT NULL | - | 主键ID | |
| 2 | log_id | CHARACTER | - | - | - | NOT NULL | - | 日志唯一标识 | |
| 3 | fault_id | CHARACTER | - | - | - | NULL | - | 关联故障标识(无外键) | |
| 4 | cluster_id | BIGINT | - | - | - | NULL | - | 关联集群ID | |
| 5 | host | CHARACTER | - | - | - | NOT NULL | - | 主机名 | |
| 6 | service | CHARACTER | - | - | - | NOT NULL | - | 服务名 | |
| 7 | source | CHARACTER | - | - | - | NULL | - | 来源 | |
| 8 | log_level | CHARACTER | - | - | - | NOT NULL | - | 日志级别(DEBUG/INFO/WARN/ERROR/FATAL) | |
| 9 | message | TEXT | - | - | - | NOT NULL | - | 日志消息 | |
| 10 | exception | TEXT | - | - | - | NULL | - | 异常堆栈 | |
| 11 | raw_log | TEXT | - | - | - | NULL | - | 原始日志内容 | |
| 12 | processed | BOOLEAN | - | - | - | NOT NULL | false | 是否已处理 | |
| 13 | created_at | TIMESTAMP | - | - | - | NOT NULL | now() | 创建时间 | |
**索引信息**:
- PRIMARY KEY: (id)
- INDEX: idx_system_logs_cluster_id (cluster_id)
- INDEX: idx_system_logs_fault_id (fault_id)
- INDEX: idx_system_logs_level (log_level)
- INDEX: idx_system_logs_processed (processed)
- INDEX: idx_system_logs_timestamp ("timestamp")
- FOREIGN KEY: FK(cluster_id) -> public.clusters(id)
#### 表名: clusters (集群信息表)
**表说明**: 存储用户管理的集群信息
| 序号 | 字段名 | 数据类型 | 长度 | 精度 | 是否主键 | 是否为空 | 默认值 | 字段说明 | 备注 |
|---|---|---|---|---|---|---|---|---|---|
| 1 | id | BIGINT | - | - | ✓ | NOT NULL | - | 主键ID | |
| 2 | uuid | UUID | - | - | - | NOT NULL | - | 集群唯一标识(UUID) | |
| 3 | name | CHARACTER | - | - | - | NOT NULL | - | 集群名称 | |
| 4 | type | CHARACTER | - | - | - | NOT NULL | - | 集群类型 | |
| 5 | node_count | INTEGER | - | - | - | NOT NULL | 0 | 集群节点数量 | |
| 6 | health_status | CHARACTER | - | - | - | NOT NULL | 'unknown'::character | 集群健康状态(healthy/warning/error/unknown) | |
| 7 | description | TEXT | - | - | - | NULL | - | 集群描述 | |
| 8 | config_info | JSONB | - | - | - | NULL | - | 集群配置信息(JSONB) | |
| 9 | created_at | TIMESTAMP | - | - | - | NOT NULL | now() | 创建时间 | |
| 10 | updated_at | TIMESTAMP | - | - | - | NOT NULL | now() | 更新时间 | |
| 11 | namenode_ip | INET | - | - | - | NULL | - | | |
| 12 | namenode_psw | CHARACTER | - | - | - | NULL | - | | |
| 13 | rm_ip | INET | - | - | - | NULL | - | | |
| 14 | rm_psw | CHARACTER | - | - | - | NULL | - | | |
**索引信息**:
- PRIMARY KEY: (id)
#### 表名: user_cluster_mapping (用户与集群映射表)
**表说明**: 管理用户和集群的多对多关系
| 序号 | 字段名 | 数据类型 | 长度 | 精度 | 是否主键 | 是否为空 | 默认值 | 字段说明 | 备注 |
|---|---|---|---|---|---|---|---|---|---|
| 1 | id | BIGINT | - | - | ✓ | NOT NULL | - | 主键ID | |
| 2 | user_id | BIGINT | - | - | - | NOT NULL | - | 用户ID | |
| 3 | cluster_id | BIGINT | - | - | - | NOT NULL | - | 集群ID | |
| 4 | role_id | BIGINT | - | - | - | NOT NULL | - | 角色ID | |
| 5 | created_at | TIMESTAMP | - | - | - | NOT NULL | now() | 创建时间 | |
**索引信息**:
- PRIMARY KEY: (id)
- FOREIGN KEY: FK(cluster_id) -> public.clusters(id)
- FOREIGN KEY: FK(role_id) -> public.roles(id)
- FOREIGN KEY: FK(user_id) -> public.users(id)
#### 表名: app_configurations (应用配置表)
**表说明**: 存储系统各类配置信息,包括系统参数、告警规则和通知设置
| 序号 | 字段名 | 数据类型 | 长度 | 精度 | 是否主键 | 是否为空 | 默认值 | 字段说明 | 备注 |
|---|---|---|---|---|---|---|---|---|---|
| 1 | id | BIGINT | - | - | ✓ | NOT NULL | - | 主键ID | |
| 2 | config_type | CHARACTER | - | - | - | NOT NULL | - | 配置类型(system/alert_rule/notification/llm) | |
| 3 | config_key | CHARACTER | - | - | - | NOT NULL | - | 配置键 | |
| 4 | config_value | JSONB | - | - | - | NOT NULL | - | 配置值(JSONB) | |
| 5 | description | CHARACTER | - | - | - | NULL | - | 配置描述 | |
| 6 | is_enabled | BOOLEAN | - | - | - | NOT NULL | true | 是否启用 | |
| 7 | created_at | TIMESTAMP | - | - | - | NOT NULL | now() | 创建时间 | |
| 8 | updated_at | TIMESTAMP | - | - | - | NOT NULL | now() | 更新时间 | |
**索引信息**:
- PRIMARY KEY: (id)
- INDEX: idx_app_config_enabled (is_enabled)
#### 表名: users (用户表)
**表说明**: 系统用户信息
| 序号 | 字段名 | 数据类型 | 长度 | 精度 | 是否主键 | 是否为空 | 默认值 | 字段说明 | 备注 |
|---|---|---|---|---|---|---|---|---|---|
| 1 | id | BIGINT | - | - | ✓ | NOT NULL | - | 主键ID | |
| 2 | username | CHARACTER | - | - | - | NOT NULL | - | 用户名 | |
| 3 | email | CHARACTER | - | - | - | NOT NULL | - | 邮箱 | |
| 4 | password_hash | CHARACTER | - | - | - | NOT NULL | - | 密码哈希 | |
| 5 | full_name | CHARACTER | - | - | - | NOT NULL | - | 姓名 | |
| 6 | is_active | BOOLEAN | - | - | - | NOT NULL | true | 是否激活 | |
| 7 | last_login | TIMESTAMP | - | - | - | NULL | - | 最后登录时间 | |
| 8 | created_at | TIMESTAMP | - | - | - | NOT NULL | now() | 创建时间 | |
| 9 | updated_at | TIMESTAMP | - | - | - | NOT NULL | now() | 更新时间 | |
**索引信息**:
- PRIMARY KEY: (id)
#### 表名: audit_logs (操作审计表)
**表说明**: 记录用户操作审计日志
| 序号 | 字段名 | 数据类型 | 长度 | 精度 | 是否主键 | 是否为空 | 默认值 | 字段说明 | 备注 |
|---|---|---|---|---|---|---|---|---|---|
| 1 | id | BIGINT | - | - | ✓ | NOT NULL | - | 主键ID | |
| 2 | user_id | BIGINT | - | - | - | NULL | - | 用户ID | |
| 3 | cluster_id | BIGINT | - | - | - | NULL | - | 集群ID | |
| 4 | role_id | BIGINT | - | - | - | NULL | - | 角色ID | |
| 5 | username | CHARACTER | - | - | - | NOT NULL | - | 用户名 | |
| 6 | action | CHARACTER | - | - | - | NOT NULL | - | 操作动作 | |
| 7 | resource_type | CHARACTER | - | - | - | NOT NULL | - | 资源类型 | |
| 8 | resource_id | CHARACTER | - | - | - | NULL | - | 资源ID | |
| 9 | ip_address | INET | - | - | - | NOT NULL | - | 请求来源IP(INET, 兼容IPv4/IPv6) | |
| 10 | request_data | JSONB | - | - | - | NULL | - | 请求数据(JSONB) | |
| 11 | response_status | INTEGER | - | - | - | NULL | - | 响应状态码 | |
| 12 | created_at | TIMESTAMP | - | - | - | NOT NULL | now() | 创建时间 | |
**索引信息**:
- PRIMARY KEY: (id)
- INDEX: idx_audit_logs_action (action)
- INDEX: idx_audit_logs_cluster_id (cluster_id)
- INDEX: idx_audit_logs_created_at (created_at)
- INDEX: idx_audit_logs_role_id (role_id)
- INDEX: idx_audit_logs_user_id (user_id)
- FOREIGN KEY: FK(cluster_id) -> public.clusters(id)
- FOREIGN KEY: FK(role_id) -> public.roles(id)
- FOREIGN KEY: FK(user_id) -> public.users(id)
#### 表名: repair_templates (修复模板表)
**表说明**: 存储常见故障的修复模板
| 序号 | 字段名 | 数据类型 | 长度 | 精度 | 是否主键 | 是否为空 | 默认值 | 字段说明 | 备注 |
|---|---|---|---|---|---|---|---|---|---|
| 1 | id | BIGINT | - | - | ✓ | NOT NULL | - | 主键ID | |
| 2 | template_name | CHARACTER | - | - | - | NOT NULL | - | 模板名称 | |
| 3 | fault_type | CHARACTER | - | - | - | NOT NULL | - | 适用故障类型 | |
| 4 | script_content | TEXT | - | - | - | NOT NULL | - | 脚本内容 | |
| 5 | risk_level | CHARACTER | - | - | - | NOT NULL | 'medium'::character | 风险级别(low/medium/high) | |
| 6 | description | TEXT | - | - | - | NULL | - | 模板描述 | |
| 7 | parameters | JSONB | - | - | - | NULL | - | 模板参数定义(JSONB) | |
| 8 | created_by | CHARACTER | - | - | - | NULL | - | 创建人 | |
| 9 | created_at | TIMESTAMP | - | - | - | NOT NULL | now() | 创建时间 | |
| 10 | updated_at | TIMESTAMP | - | - | - | NOT NULL | now() | 更新时间 | |
**索引信息**:
- PRIMARY KEY: (id)
- INDEX: idx_repair_templates_fault_type (fault_type)
# 数据字典
## app_configurations
| 字段名 | 类型 | 说明 |
| :--- | :--- | :--- |
| id | bigint NOT NULL | 主键ID |
| config_type | character varying(20) NOT NULL | 配置类型(system/alert_rule/notification/llm) |
| config_key | character varying(100) NOT NULL | 配置键 |
| config_value | jsonb NOT NULL | 配置值(JSONB) |
| description | character varying(500) | 配置描述 |
| is_enabled | boolean DEFAULT true NOT NULL | 是否启用 |
| created_at | timestamp with time zone DEFAULT now() NOT NULL | 创建时间 |
| updated_at | timestamp with time zone DEFAULT now() NOT NULL | 更新时间 |
## chat_messages
| 字段名 | 类型 | 说明 |
| :--- | :--- | :--- |
| id | integer NOT NULL | |
| session_id | character varying NOT NULL | |
| role | character varying NOT NULL | |
| content | text NOT NULL | |
| created_at | timestamp with time zone | |
| reasoning | text | |
| username | character varying(64) | |
## chat_sessions
| 字段名 | 类型 | 说明 |
| :--- | :--- | :--- |
| id | character varying NOT NULL | |
| user_id | integer | |
| title | character varying | |
| created_at | timestamp with time zone | |
| updated_at | timestamp with time zone | |
## cluster_metrics
| 字段名 | 类型 | 说明 |
| :--- | :--- | :--- |
| id | integer NOT NULL | |
| cluster_id | integer NOT NULL | |
| timestamp | timestamp with time zone NOT NULL | |
| cpu_avg | double precision | |
| mem_used_avg | double precision | |
| mem_free_avg | double precision | |
## clusters
| 字段名 | 类型 | 说明 |
| :--- | :--- | :--- |
| id | bigint NOT NULL | 主键ID |
| uuid | uuid NOT NULL | 集群唯一标识(UUID) |
| name | character varying(100) NOT NULL | 集群名称 |
| type | character varying(50) NOT NULL | 集群类型 |
| node_count | integer DEFAULT 0 NOT NULL | 集群节点数量 |
| health_status | character varying(20) DEFAULT 'unknown'::character varying NOT NULL | 集群健康状态(healthy/warning/error/unknown) |
| description | text | 集群描述 |
| config_info | jsonb | 集群配置信息(JSONB) |
| created_at | timestamp with time zone DEFAULT now() NOT NULL | 创建时间 |
| updated_at | timestamp with time zone DEFAULT now() NOT NULL | 更新时间 |
| namenode_ip | inet | |
| namenode_psw | character varying(255) | |
| rm_ip | inet | |
| rm_psw | character varying(255) | |
## hadoop_exec_logs
| 字段名 | 类型 | 说明 |
| :--- | :--- | :--- |
| id | integer NOT NULL | |
| from_user_id | integer NOT NULL | |
| cluster_name | character varying(255) NOT NULL | |
| description | text | |
| start_time | timestamp with time zone | |
| end_time | timestamp with time zone | |
## hadoop_logs
| 字段名 | 类型 | 说明 |
| :--- | :--- | :--- |
| log_id | integer NOT NULL | |
| cluster_name | character varying(255) NOT NULL | |
| node_host | character varying(100) NOT NULL | |
| title | character varying(255) | |
| info | text | |
| log_time | timestamp with time zone NOT NULL | |
## node_metrics
| 字段名 | 类型 | 说明 |
| :--- | :--- | :--- |
| id | integer NOT NULL | |
| cluster_id | integer | |
| node_name | character varying(100) NOT NULL | |
| timestamp | timestamp with time zone NOT NULL | |
| cpu_usage | double precision | |
| mem_used | double precision | |
| mem_free | double precision | |
## nodes
| 字段名 | 类型 | 说明 |
| :--- | :--- | :--- |
| id | bigint NOT NULL | 主键ID |
| uuid | uuid NOT NULL | 节点唯一标识(UUID) |
| cluster_id | bigint NOT NULL | 所属集群ID |
| hostname | character varying(100) NOT NULL | 节点主机名 |
| ip_address | inet NOT NULL | 节点IP地址(INET, 兼容IPv4/IPv6) |
| status | character varying(20) DEFAULT 'unknown'::character varying NOT NULL | 节点健康状态(healthy/unhealthy/warning/unknown) |
| cpu_usage | numeric(5,2) | CPU使用率(%) |
| memory_usage | numeric(5,2) | 内存使用率(%) |
| disk_usage | numeric(5,2) | 磁盘使用率(%) |
| last_heartbeat | timestamp with time zone | 最后心跳时间 |
| created_at | timestamp with time zone DEFAULT now() NOT NULL | 创建时间 |
| updated_at | timestamp with time zone DEFAULT now() NOT NULL | 更新时间 |
| ssh_user | character varying(50) | |
| ssh_password | character varying(255) | |
## permissions
| 字段名 | 类型 | 说明 |
| :--- | :--- | :--- |
| id | bigint NOT NULL | 主键ID |
| permission_name | character varying(100) NOT NULL | 权限名称 |
| permission_key | character varying(100) NOT NULL | 权限唯一标识 |
| description | character varying(255) | 权限描述 |
| created_at | timestamp with time zone DEFAULT now() NOT NULL | 创建时间 |
## repair_templates
| 字段名 | 类型 | 说明 |
| :--- | :--- | :--- |
| id | bigint NOT NULL | 主键ID |
| template_name | character varying(100) NOT NULL | 模板名称 |
| fault_type | character varying(50) NOT NULL | 适用故障类型 |
| script_content | text NOT NULL | 脚本内容 |
| risk_level | character varying(20) DEFAULT 'medium'::character varying NOT NULL | 风险级别(low/medium/high) |
| description | text | 模板描述 |
| parameters | jsonb | 模板参数定义(JSONB) |
| created_by | character varying(50) | 创建人 |
| created_at | timestamp with time zone DEFAULT now() NOT NULL | 创建时间 |
| updated_at | timestamp with time zone DEFAULT now() NOT NULL | 更新时间 |
## role_permission_mapping
| 字段名 | 类型 | 说明 |
| :--- | :--- | :--- |
| role_id | bigint NOT NULL | 角色ID |
| permission_id | bigint NOT NULL | 权限ID |
## roles
| 字段名 | 类型 | 说明 |
| :--- | :--- | :--- |
| id | bigint NOT NULL | 主键ID |
| role_name | character varying(50) NOT NULL | 角色名称 |
| role_key | character varying(50) NOT NULL | 角色唯一标识 |
| description | character varying(255) | 角色描述 |
| is_system_role | boolean DEFAULT false NOT NULL | 是否为系统内置角色 |
| created_at | timestamp with time zone DEFAULT now() NOT NULL | 创建时间 |
| updated_at | timestamp with time zone DEFAULT now() NOT NULL | 更新时间 |
## sys_exec_logs
| 字段名 | 类型 | 说明 |
| :--- | :--- | :--- |
| operation_id | uuid DEFAULT public.uuid_generate_v4() NOT NULL | |
| user_id | integer NOT NULL | |
| description | text NOT NULL | |
| operation_time | timestamp with time zone DEFAULT now() NOT NULL | |
## user_cluster_mapping
| 字段名 | 类型 | 说明 |
| :--- | :--- | :--- |
| id | bigint NOT NULL | 主键ID |
| user_id | bigint NOT NULL | 用户ID |
| cluster_id | bigint NOT NULL | 集群ID |
| role_id | bigint NOT NULL | 角色ID |
| created_at | timestamp with time zone DEFAULT now() NOT NULL | 创建时间 |
## user_role_mapping
| 字段名 | 类型 | 说明 |
| :--- | :--- | :--- |
| user_id | bigint NOT NULL | 用户ID |
| role_id | bigint NOT NULL | 角色ID |
## users
| 字段名 | 类型 | 说明 |
| :--- | :--- | :--- |
| id | bigint NOT NULL | 主键ID |
| username | character varying(50) NOT NULL | 用户名 |
| email | character varying(100) NOT NULL | 邮箱 |
| password_hash | character varying(255) NOT NULL | 密码哈希 |
| full_name | character varying(100) NOT NULL | 姓名 |
| is_active | boolean DEFAULT true NOT NULL | 是否激活 |
| last_login | timestamp with time zone | 最后登录时间 |
| created_at | timestamp with time zone DEFAULT now() NOT NULL | 创建时间 |
| updated_at | timestamp with time zone DEFAULT now() NOT NULL | 更新时间 |

File diff suppressed because it is too large Load Diff

@ -1,307 +1,242 @@
# 故障检测系统数据库设计文档
<style>
/* 统一本文件所有表格列宽与对齐 */
table {
width: 100%;
table-layout: fixed; /* 固定布局,列宽按百分比分配 */
border-collapse: collapse;
}
table th, table td {
text-align: left; /* 每一列首部对齐(左对齐) */
vertical-align: top; /* 条目从上到下对齐 */
}
/* 六列宽度统一为固定比例,确保从上到下列宽一致 */
table th:nth-child(1), table td:nth-child(1) { width: 16%; }
table th:nth-child(2), table td:nth-child(2) { width: 16%; }
table th:nth-child(3), table td:nth-child(3) { width: 8%; }
table th:nth-child(4), table td:nth-child(4) { width: 12%; }
table th:nth-child(5), table td:nth-child(5) { width: 12%; }
table th:nth-child(6), table td:nth-child(6) { width: 36%; }
</style>
## 1. 数据库概述
### 1.1 设计目标
- 支持Hadoop集群故障检测与自动修复系统
- 提供高效的日志存储和查询能力
- 支持执行日志、集群状态等核心业务数据
- 确保数据一致性和系统性能
### 1.2 技术选型
- **数据库**: PostgreSQL 14+
- **主要类型**: `JSONB`、`UUID`、`INET`、`TIMESTAMPTZ`
- **字符集**: UTF8
- **时区**: 推荐使用UTC并统一为`TIMESTAMPTZ`
- **后端**: `FastAPI` + `Uvicorn` + `Pydantic`
- **数据库访问**: `SQLAlchemy` + `asyncpg`
- **缓存/消息**: `Redis`(状态缓存/速率限制)
- **日志采集**: `Apache Flume`(可选替代:`Fluent Bit`
- **前端**: `Vue3` + `Vite` + `Element Plus` + `ECharts`
- **实时通信**: WebSocket状态与诊断结果推送
- **多智能体编排**: `LangGraph`/`Ray`Diagnosis/Repair/Policy Agent
- **可观测性**: `Prometheus` + `Grafana`API与Agent指标监控
### 1.3 命名规范
- 表名:小写字母+下划线,复数形式
- 字段名:小写字母+下划线
- 索引名idx_表名_字段名
- 外键名fk_表名_字段名
## 2. 数据库结构设计
### 2.1 核心业务表
#### 2.1.1 执行日志表 (exec_logs)
记录自动修复脚本的执行过程和结果
| 字段名 | 数据类型 | 长度 | 是否为空 | 默认值 | 说明 |
| :----- | :------- | :--- | :------ | :----- | :--- |
| id | BIGINT | - | NOT NULL | - | (PK) 主键ID |
| exec_id | CHARACTER | - | NOT NULL | - | 执行唯一标识 |
| fault_id | CHARACTER | - | NOT NULL | - | 关联故障标识(无外键) |
| command_type | CHARACTER | - | NOT NULL | - | 命令类型 |
| script_path | CHARACTER | - | NULL | - | 脚本路径 |
| command_content | TEXT | - | NOT NULL | - | 执行的命令内容 |
| target_nodes | JSONB | - | NULL | - | 目标执行节点(JSONB) |
| risk_level | CHARACTER | - | NOT NULL | 'medium'::character | 风险级别(low/medium/high) |
| execution_status | CHARACTER | - | NOT NULL | 'pending'::character | 执行状态(pending/running/success/failed/timeout) |
| start_time | TIMESTAMP | - | NULL | - | 开始执行时间 |
| end_time | TIMESTAMP | - | NULL | - | 结束执行时间 |
| duration | INTEGER | - | NULL | - | 执行时长(秒) |
| stdout_log | TEXT | - | NULL | - | 标准输出日志 |
| stderr_log | TEXT | - | NULL | - | 错误输出日志 |
| exit_code | INTEGER | - | NULL | - | 退出码 |
| operator | CHARACTER | - | NOT NULL | 'system'::character | 操作人 |
| created_at | TIMESTAMP | - | NOT NULL | now() | 创建时间 |
| updated_at | TIMESTAMP | - | NOT NULL | now() | 更新时间 |
**索引/约束设计:**
- PRIMARY KEY: (id)
- INDEX: idx_exec_logs_end_time (end_time)
- INDEX: idx_exec_logs_fault_id (fault_id)
- INDEX: idx_exec_logs_start_time (start_time)
- INDEX: idx_exec_logs_status (execution_status)
#### 2.1.2 节点信息表 (nodes)
记录集群内各节点的状态信息
| 字段名 | 数据类型 | 长度 | 是否为空 | 默认值 | 说明 |
| :----- | :------- | :--- | :------ | :----- | :--- |
| id | BIGINT | - | NOT NULL | - | (PK) 主键ID |
| uuid | UUID | - | NOT NULL | - | 节点唯一标识(UUID) |
| cluster_id | BIGINT | - | NOT NULL | - | 所属集群ID |
| hostname | CHARACTER | - | NOT NULL | - | 节点主机名 |
| ip_address | INET | - | NOT NULL | - | 节点IP地址(INET, 兼容IPv4/IPv6) |
| status | CHARACTER | - | NOT NULL | 'unknown'::character | 节点健康状态(healthy/unhealthy/warning/unknown) |
| last_heartbeat | TIMESTAMP | - | NULL | - | 最后心跳时间 |
| created_at | TIMESTAMP | - | NOT NULL | now() | 创建时间 |
| updated_at | TIMESTAMP | - | NOT NULL | now() | 更新时间 |
| ssh_user | CHARACTER | - | NULL | - | |
| ssh_password | CHARACTER | - | NULL | - | |
**索引/约束设计:**
- PRIMARY KEY: (id)
- INDEX: idx_nodes_cluster_id (cluster_id)
- INDEX: idx_nodes_ip_address (ip_address)
- INDEX: idx_nodes_last_heartbeat (last_heartbeat)
- INDEX: idx_nodes_status (status)
- INDEX: uk_cluster_hostname (cluster_id, hostname)
- FOREIGN KEY: FK(cluster_id) -> public.clusters(id)
#### 2.1.3 系统日志表 (system_logs)
存储从Flume采集的原始日志数据
| 字段名 | 数据类型 | 长度 | 是否为空 | 默认值 | 说明 |
| :----- | :------- | :--- | :------ | :----- | :--- |
| id | BIGINT | - | NOT NULL | - | (PK) 主键ID |
| log_id | CHARACTER | - | NOT NULL | - | 日志唯一标识 |
| fault_id | CHARACTER | - | NULL | - | 关联故障标识(无外键) |
| cluster_id | BIGINT | - | NULL | - | 关联集群ID |
| host | CHARACTER | - | NOT NULL | - | 主机名 |
| service | CHARACTER | - | NOT NULL | - | 服务名 |
| source | CHARACTER | - | NULL | - | 来源 |
| log_level | CHARACTER | - | NOT NULL | - | 日志级别(DEBUG/INFO/WARN/ERROR/FATAL) |
| message | TEXT | - | NOT NULL | - | 日志消息 |
| exception | TEXT | - | NULL | - | 异常堆栈 |
| raw_log | TEXT | - | NULL | - | 原始日志内容 |
| processed | BOOLEAN | - | NOT NULL | false | 是否已处理 |
| created_at | TIMESTAMP | - | NOT NULL | now() | 创建时间 |
**索引/约束设计:**
- PRIMARY KEY: (id)
- INDEX: idx_system_logs_cluster_id (cluster_id)
- INDEX: idx_system_logs_fault_id (fault_id)
- INDEX: idx_system_logs_level (log_level)
- INDEX: idx_system_logs_processed (processed)
- INDEX: idx_system_logs_timestamp ("timestamp")
- FOREIGN KEY: FK(cluster_id) -> public.clusters(id)
#### 2.2.0 角色表 (roles)
系统角色定义
| 字段名 | 数据类型 | 长度 | 是否为空 | 默认值 | 说明 |
| :----- | :------- | :--- | :------ | :----- | :--- |
| id | BIGINT | - | NOT NULL | - | (PK) 主键ID |
| role_name | CHARACTER | - | NOT NULL | - | 角色名称 |
| role_key | CHARACTER | - | NOT NULL | - | 角色唯一标识 |
| description | CHARACTER | - | NULL | - | 角色描述 |
| is_system_role | BOOLEAN | - | NOT NULL | false | 是否为系统内置角色 |
| created_at | TIMESTAMP | - | NOT NULL | now() | 创建时间 |
| updated_at | TIMESTAMP | - | NOT NULL | now() | 更新时间 |
**索引/约束设计:**
- PRIMARY KEY: (id)
#### 2.2.1 权限表 (permissions)
系统权限定义
| 字段名 | 数据类型 | 长度 | 是否为空 | 默认值 | 说明 |
| :----- | :------- | :--- | :------ | :----- | :--- |
| id | BIGINT | - | NOT NULL | - | (PK) 主键ID |
| permission_name | CHARACTER | - | NOT NULL | - | 权限名称 |
| permission_key | CHARACTER | - | NOT NULL | - | 权限唯一标识 |
| description | CHARACTER | - | NULL | - | 权限描述 |
| created_at | TIMESTAMP | - | NOT NULL | now() | 创建时间 |
**索引/约束设计:**
- PRIMARY KEY: (id)
#### 2.2.2 角色-权限映射表 (role_permission_mapping)
多对多关系的中间表
| 字段名 | 数据类型 | 长度 | 是否为空 | 默认值 | 说明 |
| :----- | :------- | :--- | :------ | :----- | :--- |
| role_id | BIGINT | - | NOT NULL | - | (PK) 角色ID |
| permission_id | BIGINT | - | NOT NULL | - | (PK) 权限ID |
**索引/约束设计:**
- PRIMARY KEY: (role_id, permission_id)
- FOREIGN KEY: FK(permission_id) -> public.permissions(id)
- FOREIGN KEY: FK(role_id) -> public.roles(id)
#### 2.2.1 集群信息表 (clusters)
存储用户管理的集群信息
| 字段名 | 数据类型 | 长度 | 是否为空 | 默认值 | 说明 |
| :----- | :------- | :--- | :------ | :----- | :--- |
| id | BIGINT | - | NOT NULL | - | (PK) 主键ID |
| uuid | UUID | - | NOT NULL | - | 集群唯一标识(UUID) |
| name | CHARACTER | - | NOT NULL | - | 集群名称 |
| type | CHARACTER | - | NOT NULL | - | 集群类型 |
| node_count | INTEGER | - | NOT NULL | 0 | 集群节点数量 |
| health_status | CHARACTER | - | NOT NULL | 'unknown'::character | 集群健康状态(healthy/warning/error/unknown) |
| description | TEXT | - | NULL | - | 集群描述 |
| config_info | JSONB | - | NULL | - | 集群配置信息(JSONB) |
| created_at | TIMESTAMP | - | NOT NULL | now() | 创建时间 |
| updated_at | TIMESTAMP | - | NOT NULL | now() | 更新时间 |
| namenode_ip | INET | - | NULL | - | |
| namenode_psw | CHARACTER | - | NULL | - | |
| rm_ip | INET | - | NULL | - | |
| rm_psw | CHARACTER | - | NULL | - | |
**索引/约束设计:**
- PRIMARY KEY: (id)
#### 2.2.2 用户与集群映射表 (user_cluster_mapping)
管理用户和集群的多对多关系
| 字段名 | 数据类型 | 长度 | 是否为空 | 默认值 | 说明 |
| :----- | :------- | :--- | :------ | :----- | :--- |
| id | BIGINT | - | NOT NULL | - | (PK) 主键ID |
| user_id | BIGINT | - | NOT NULL | - | 用户ID |
| cluster_id | BIGINT | - | NOT NULL | - | 集群ID |
| role_id | BIGINT | - | NOT NULL | - | 角色ID |
| created_at | TIMESTAMP | - | NOT NULL | now() | 创建时间 |
**索引/约束设计:**
- PRIMARY KEY: (id)
- FOREIGN KEY: FK(cluster_id) -> public.clusters(id)
- FOREIGN KEY: FK(role_id) -> public.roles(id)
- FOREIGN KEY: FK(user_id) -> public.users(id)
#### 2.2.3 应用统一配置表 (app_configurations)
统一管理系统配置、告警规则和通知设置
| 字段名 | 数据类型 | 长度 | 是否为空 | 默认值 | 说明 |
| :----- | :------- | :--- | :------ | :----- | :--- |
| id | BIGINT | - | NOT NULL | - | (PK) 主键ID |
| config_type | CHARACTER | - | NOT NULL | - | 配置类型(system/alert_rule/notification/llm) |
| config_key | CHARACTER | - | NOT NULL | - | 配置键 |
| config_value | JSONB | - | NOT NULL | - | 配置值(JSONB) |
| description | CHARACTER | - | NULL | - | 配置描述 |
| is_enabled | BOOLEAN | - | NOT NULL | true | 是否启用 |
| created_at | TIMESTAMP | - | NOT NULL | now() | 创建时间 |
| updated_at | TIMESTAMP | - | NOT NULL | now() | 更新时间 |
**索引/约束设计:**
- PRIMARY KEY: (id)
- INDEX: idx_app_config_enabled (is_enabled)
#### 2.2.4 用户表 (users)
系统用户信息
| 字段名 | 数据类型 | 长度 | 是否为空 | 默认值 | 说明 |
| :----- | :------- | :--- | :------ | :----- | :--- |
| id | BIGINT | - | NOT NULL | - | (PK) 主键ID |
| username | CHARACTER | - | NOT NULL | - | 用户名 |
| email | CHARACTER | - | NOT NULL | - | 邮箱 |
| password_hash | CHARACTER | - | NOT NULL | - | 密码哈希 |
| full_name | CHARACTER | - | NOT NULL | - | 姓名 |
| is_active | BOOLEAN | - | NOT NULL | true | 是否激活 |
| last_login | TIMESTAMP | - | NULL | - | 最后登录时间 |
| created_at | TIMESTAMP | - | NOT NULL | now() | 创建时间 |
| updated_at | TIMESTAMP | - | NOT NULL | now() | 更新时间 |
**索引/约束设计:**
- PRIMARY KEY: (id)
#### 2.2.5 用户-角色映射表 (user_role_mapping)
用户与角色的多对多关系
| 字段名 | 数据类型 | 长度 | 是否为空 | 默认值 | 说明 |
| :----- | :------- | :--- | :------ | :----- | :--- |
| user_id | BIGINT | - | NOT NULL | - | (PK) 用户ID |
| role_id | BIGINT | - | NOT NULL | - | (PK) 角色ID |
**索引/约束设计:**
- PRIMARY KEY: (user_id, role_id)
- FOREIGN KEY: FK(role_id) -> public.roles(id)
- FOREIGN KEY: FK(user_id) -> public.users(id)
#### 2.2.6 操作审计表 (audit_logs)
记录用户操作审计日志
| 字段名 | 数据类型 | 长度 | 是否为空 | 默认值 | 说明 |
| :----- | :------- | :--- | :------ | :----- | :--- |
| id | BIGINT | - | NOT NULL | - | (PK) 主键ID |
| user_id | BIGINT | - | NULL | - | 用户ID |
| cluster_id | BIGINT | - | NULL | - | 集群ID |
| role_id | BIGINT | - | NULL | - | 角色ID |
| username | CHARACTER | - | NOT NULL | - | 用户名 |
| action | CHARACTER | - | NOT NULL | - | 操作动作 |
| resource_type | CHARACTER | - | NOT NULL | - | 资源类型 |
| resource_id | CHARACTER | - | NULL | - | 资源ID |
| ip_address | INET | - | NOT NULL | - | 请求来源IP(INET, 兼容IPv4/IPv6) |
| request_data | JSONB | - | NULL | - | 请求数据(JSONB) |
| response_status | INTEGER | - | NULL | - | 响应状态码 |
| created_at | TIMESTAMP | - | NOT NULL | now() | 创建时间 |
**索引/约束设计:**
- PRIMARY KEY: (id)
- INDEX: idx_audit_logs_action (action)
- INDEX: idx_audit_logs_cluster_id (cluster_id)
- INDEX: idx_audit_logs_created_at (created_at)
- INDEX: idx_audit_logs_role_id (role_id)
- INDEX: idx_audit_logs_user_id (user_id)
- FOREIGN KEY: FK(cluster_id) -> public.clusters(id)
- FOREIGN KEY: FK(role_id) -> public.roles(id)
- FOREIGN KEY: FK(user_id) -> public.users(id)
#### 2.3.1 修复脚本模板表 (repair_templates)
存储用于自动修复的脚本模板
| 字段名 | 数据类型 | 长度 | 是否为空 | 默认值 | 说明 |
| :----- | :------- | :--- | :------ | :----- | :--- |
| id | BIGINT | - | NOT NULL | - | (PK) 主键ID |
| template_name | CHARACTER | - | NOT NULL | - | 模板名称 |
| fault_type | CHARACTER | - | NOT NULL | - | 适用故障类型 |
| script_content | TEXT | - | NOT NULL | - | 脚本内容 |
| risk_level | CHARACTER | - | NOT NULL | 'medium'::character | 风险级别(low/medium/high) |
| description | TEXT | - | NULL | - | 模板描述 |
| parameters | JSONB | - | NULL | - | 模板参数定义(JSONB) |
| created_by | CHARACTER | - | NULL | - | 创建人 |
| created_at | TIMESTAMP | - | NOT NULL | now() | 创建时间 |
| updated_at | TIMESTAMP | - | NOT NULL | now() | 更新时间 |
**索引/约束设计:**
- PRIMARY KEY: (id)
- INDEX: idx_repair_templates_fault_type (fault_type)
# 数据库设计文档
## 1. 数据库概览
本数据库名为 `hadoop_fault_db`,包含核心业务表及系统日志表。
## 2. 表结构详述
### app_configurations (应用配置表)
**表名**: `app_configurations` (应用配置表)
**字段列表**:
| 序号 | 字段名 | 类型 | 说明 |
| :--- | :--- | :--- | :--- |
| 1 | id | bigint NOT NULL | 主键ID |
| 2 | config_type | character varying(20) NOT NULL | 配置类型(system/alert_rule/notification/llm) |
| 3 | config_key | character varying(100) NOT NULL | 配置键 |
| 4 | config_value | jsonb NOT NULL | 配置值(JSONB) |
| 5 | description | character varying(500) | 配置描述 |
| 6 | is_enabled | boolean DEFAULT true NOT NULL | 是否启用 |
| 7 | created_at | timestamp with time zone DEFAULT now() NOT NULL | 创建时间 |
| 8 | updated_at | timestamp with time zone DEFAULT now() NOT NULL | 更新时间 |
### chat_messages
**表名**: `chat_messages`
**字段列表**:
| 序号 | 字段名 | 类型 | 说明 |
| :--- | :--- | :--- | :--- |
| 1 | id | integer NOT NULL | |
| 2 | session_id | character varying NOT NULL | |
| 3 | role | character varying NOT NULL | |
| 4 | content | text NOT NULL | |
| 5 | created_at | timestamp with time zone | |
| 6 | reasoning | text | |
| 7 | username | character varying(64) | |
### chat_sessions
**表名**: `chat_sessions`
**字段列表**:
| 序号 | 字段名 | 类型 | 说明 |
| :--- | :--- | :--- | :--- |
| 1 | id | character varying NOT NULL | |
| 2 | user_id | integer | |
| 3 | title | character varying | |
| 4 | created_at | timestamp with time zone | |
| 5 | updated_at | timestamp with time zone | |
### cluster_metrics (集群指标表)
**表名**: `cluster_metrics` (集群指标表)
**字段列表**:
| 序号 | 字段名 | 类型 | 说明 |
| :--- | :--- | :--- | :--- |
| 1 | id | integer NOT NULL | |
| 2 | cluster_id | integer NOT NULL | |
| 3 | timestamp | timestamp with time zone NOT NULL | |
| 4 | cpu_avg | double precision | |
| 5 | mem_used_avg | double precision | |
| 6 | mem_free_avg | double precision | |
### clusters (集群表)
**表名**: `clusters` (集群表)
**字段列表**:
| 序号 | 字段名 | 类型 | 说明 |
| :--- | :--- | :--- | :--- |
| 1 | id | bigint NOT NULL | 主键ID |
| 2 | uuid | uuid NOT NULL | 集群唯一标识(UUID) |
| 3 | name | character varying(100) NOT NULL | 集群名称 |
| 4 | type | character varying(50) NOT NULL | 集群类型 |
| 5 | node_count | integer DEFAULT 0 NOT NULL | 集群节点数量 |
| 6 | health_status | character varying(20) DEFAULT 'unknown'::character varying NOT NULL | 集群健康状态(healthy/warning/error/unknown) |
| 7 | description | text | 集群描述 |
| 8 | config_info | jsonb | 集群配置信息(JSONB) |
| 9 | created_at | timestamp with time zone DEFAULT now() NOT NULL | 创建时间 |
| 10 | updated_at | timestamp with time zone DEFAULT now() NOT NULL | 更新时间 |
| 11 | namenode_ip | inet | |
| 12 | namenode_psw | character varying(255) | |
| 13 | rm_ip | inet | |
| 14 | rm_psw | character varying(255) | |
### hadoop_exec_logs (Hadoop执行日志表)
**表名**: `hadoop_exec_logs` (Hadoop执行日志表)
**字段列表**:
| 序号 | 字段名 | 类型 | 说明 |
| :--- | :--- | :--- | :--- |
| 1 | id | integer NOT NULL | |
| 2 | from_user_id | integer NOT NULL | |
| 3 | cluster_name | character varying(255) NOT NULL | |
| 4 | description | text | |
| 5 | start_time | timestamp with time zone | |
| 6 | end_time | timestamp with time zone | |
### hadoop_logs
**表名**: `hadoop_logs`
**字段列表**:
| 序号 | 字段名 | 类型 | 说明 |
| :--- | :--- | :--- | :--- |
| 1 | log_id | integer NOT NULL | |
| 2 | cluster_name | character varying(255) NOT NULL | |
| 3 | node_host | character varying(100) NOT NULL | |
| 4 | title | character varying(255) | |
| 5 | info | text | |
| 6 | log_time | timestamp with time zone NOT NULL | |
### node_metrics (节点指标表)
**表名**: `node_metrics` (节点指标表)
**字段列表**:
| 序号 | 字段名 | 类型 | 说明 |
| :--- | :--- | :--- | :--- |
| 1 | id | integer NOT NULL | |
| 2 | cluster_id | integer | |
| 3 | node_name | character varying(100) NOT NULL | |
| 4 | timestamp | timestamp with time zone NOT NULL | |
| 5 | cpu_usage | double precision | |
| 6 | mem_used | double precision | |
| 7 | mem_free | double precision | |
### nodes
**表名**: `nodes`
**字段列表**:
| 序号 | 字段名 | 类型 | 说明 |
| :--- | :--- | :--- | :--- |
| 1 | id | bigint NOT NULL | 主键ID |
| 2 | uuid | uuid NOT NULL | 节点唯一标识(UUID) |
| 3 | cluster_id | bigint NOT NULL | 所属集群ID |
| 4 | hostname | character varying(100) NOT NULL | 节点主机名 |
| 5 | ip_address | inet NOT NULL | 节点IP地址(INET, 兼容IPv4/IPv6) |
| 6 | status | character varying(20) DEFAULT 'unknown'::character varying NOT NULL | 节点健康状态(healthy/unhealthy/warning/unknown) |
| 7 | cpu_usage | numeric(5,2) | CPU使用率(%) |
| 8 | memory_usage | numeric(5,2) | 内存使用率(%) |
| 9 | disk_usage | numeric(5,2) | 磁盘使用率(%) |
| 10 | last_heartbeat | timestamp with time zone | 最后心跳时间 |
| 11 | created_at | timestamp with time zone DEFAULT now() NOT NULL | 创建时间 |
| 12 | updated_at | timestamp with time zone DEFAULT now() NOT NULL | 更新时间 |
| 13 | ssh_user | character varying(50) | |
| 14 | ssh_password | character varying(255) | |
### permissions
**表名**: `permissions`
**字段列表**:
| 序号 | 字段名 | 类型 | 说明 |
| :--- | :--- | :--- | :--- |
| 1 | id | bigint NOT NULL | 主键ID |
| 2 | permission_name | character varying(100) NOT NULL | 权限名称 |
| 3 | permission_key | character varying(100) NOT NULL | 权限唯一标识 |
| 4 | description | character varying(255) | 权限描述 |
| 5 | created_at | timestamp with time zone DEFAULT now() NOT NULL | 创建时间 |
### repair_templates
**表名**: `repair_templates`
**字段列表**:
| 序号 | 字段名 | 类型 | 说明 |
| :--- | :--- | :--- | :--- |
| 1 | id | bigint NOT NULL | 主键ID |
| 2 | template_name | character varying(100) NOT NULL | 模板名称 |
| 3 | fault_type | character varying(50) NOT NULL | 适用故障类型 |
| 4 | script_content | text NOT NULL | 脚本内容 |
| 5 | risk_level | character varying(20) DEFAULT 'medium'::character varying NOT NULL | 风险级别(low/medium/high) |
| 6 | description | text | 模板描述 |
| 7 | parameters | jsonb | 模板参数定义(JSONB) |
| 8 | created_by | character varying(50) | 创建人 |
| 9 | created_at | timestamp with time zone DEFAULT now() NOT NULL | 创建时间 |
| 10 | updated_at | timestamp with time zone DEFAULT now() NOT NULL | 更新时间 |
### role_permission_mapping (角色权限关联表)
**表名**: `role_permission_mapping` (角色权限关联表)
**字段列表**:
| 序号 | 字段名 | 类型 | 说明 |
| :--- | :--- | :--- | :--- |
| 1 | role_id | bigint NOT NULL | 角色ID |
| 2 | permission_id | bigint NOT NULL | 权限ID |
### roles
**表名**: `roles`
**字段列表**:
| 序号 | 字段名 | 类型 | 说明 |
| :--- | :--- | :--- | :--- |
| 1 | id | bigint NOT NULL | 主键ID |
| 2 | role_name | character varying(50) NOT NULL | 角色名称 |
| 3 | role_key | character varying(50) NOT NULL | 角色唯一标识 |
| 4 | description | character varying(255) | 角色描述 |
| 5 | is_system_role | boolean DEFAULT false NOT NULL | 是否为系统内置角色 |
| 6 | created_at | timestamp with time zone DEFAULT now() NOT NULL | 创建时间 |
| 7 | updated_at | timestamp with time zone DEFAULT now() NOT NULL | 更新时间 |
### sys_exec_logs (系统操作日志表)
**表名**: `sys_exec_logs` (系统操作日志表)
**字段列表**:
| 序号 | 字段名 | 类型 | 说明 |
| :--- | :--- | :--- | :--- |
| 1 | operation_id | uuid DEFAULT public.uuid_generate_v4() NOT NULL | |
| 2 | user_id | integer NOT NULL | |
| 3 | description | text NOT NULL | |
| 4 | operation_time | timestamp with time zone DEFAULT now() NOT NULL | |
### user_cluster_mapping
**表名**: `user_cluster_mapping`
**字段列表**:
| 序号 | 字段名 | 类型 | 说明 |
| :--- | :--- | :--- | :--- |
| 1 | id | bigint NOT NULL | 主键ID |
| 2 | user_id | bigint NOT NULL | 用户ID |
| 3 | cluster_id | bigint NOT NULL | 集群ID |
| 4 | role_id | bigint NOT NULL | 角色ID |
| 5 | created_at | timestamp with time zone DEFAULT now() NOT NULL | 创建时间 |
### user_role_mapping (用户角色关联表)
**表名**: `user_role_mapping` (用户角色关联表)
**字段列表**:
| 序号 | 字段名 | 类型 | 说明 |
| :--- | :--- | :--- | :--- |
| 1 | user_id | bigint NOT NULL | 用户ID |
| 2 | role_id | bigint NOT NULL | 角色ID |
### users (用户表)
**表名**: `users` (用户表)
**字段列表**:
| 序号 | 字段名 | 类型 | 说明 |
| :--- | :--- | :--- | :--- |
| 1 | id | bigint NOT NULL | 主键ID |
| 2 | username | character varying(50) NOT NULL | 用户名 |
| 3 | email | character varying(100) NOT NULL | 邮箱 |
| 4 | password_hash | character varying(255) NOT NULL | 密码哈希 |
| 5 | full_name | character varying(100) NOT NULL | 姓名 |
| 6 | is_active | boolean DEFAULT true NOT NULL | 是否激活 |
| 7 | last_login | timestamp with time zone | 最后登录时间 |
| 8 | created_at | timestamp with time zone DEFAULT now() NOT NULL | 创建时间 |
| 9 | updated_at | timestamp with time zone DEFAULT now() NOT NULL | 更新时间 |

Loading…
Cancel
Save