Files
srdb/examples/webui/README.md
bourdon ae87c38776 Initial commit: SRDB - High-performance LSM-Tree database
- Core engine with MemTable, SST, WAL
- B+Tree indexing for SST files  
- Leveled compaction strategy
- Multi-table database management
- Schema validation and secondary indexes
- Query builder with complex conditions
- Web UI with HTMX for data visualization
- Command-line tools for diagnostics
2025-10-08 06:38:28 +08:00

255 lines
6.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# SRDB Web UI Example
这个示例展示了如何使用 SRDB 的内置 Web UI 来可视化查看数据库中的表和数据。
## 功能特性
- 📊 **表列表展示** - 左侧显示所有表及其行数
- 🔍 **Schema 查看** - 点击箭头展开查看表的字段定义
- 📋 **数据分页浏览** - 右侧以表格形式展示数据,支持分页
- 🎨 **响应式设计** - 现代化的界面设计
-**零构建** - 使用 HTMX 从 CDN 加载,无需构建步骤
- 💾 **大数据优化** - 自动截断显示,悬停查看,点击弹窗查看完整内容
- 📏 **数据大小显示** - 超过 1KB 的单元格自动显示大小标签
- 🔄 **后台数据插入** - 自动生成 2KB~512KB 的测试数据(每秒一条)
## 运行示例
```bash
# 进入示例目录
cd examples/webui
# 运行
go run main.go
```
程序会:
1. 创建/打开数据库目录 `./data`
2. 创建三个示例表:`users``products``logs`
3. 插入初始示例数据
4. **启动后台协程** - 每秒向 `logs` 表插入一条 2KB~512KB 的随机数据
5. 启动 Web 服务器在 `http://localhost:8080`
## 使用界面
打开浏览器访问 `http://localhost:8080`,你将看到:
### 左侧边栏
- 显示所有表的列表
- 显示每个表的字段数量
- 点击 ▶ 图标展开查看字段信息
- 点击表名选择要查看的表(蓝色高亮显示当前选中)
### 右侧主区域
- **Schema 区域**:显示表结构和字段定义
- **Data 区域**:以表格形式显示数据
- 支持分页浏览(每页 20 条)
- 显示系统字段_seq, _time和用户字段
- **自动截断长数据**:超过 400px 的内容显示省略号
- **鼠标悬停**:悬停在单元格上查看完整内容
- **点击查看**:点击单元格在弹窗中查看完整内容
- **大小指示**:超过 1KB 的数据显示大小标签
### 大数据查看
1. **表格截断**:单元格最大宽度 400px超长显示 `...`
2. **悬停展开**:鼠标悬停自动展开,黄色背景高亮
3. **模态框**:点击单元格弹出窗口
- 等宽字体显示(适合查看十六进制数据)
- 显示数据大小
- 支持滚动查看超长内容
## API 端点
Web UI 提供了以下 HTTP API
### 获取所有表
```
GET /api/tables
```
返回示例:
```json
[
{
"name": "users",
"rowCount": 5,
"dir": "./data/users"
}
]
```
### 获取表的 Schema
```
GET /api/tables/{name}/schema
```
返回示例:
```json
{
"fields": [
{"name": "name", "type": "string", "required": true},
{"name": "email", "type": "string", "required": true},
{"name": "age", "type": "int", "required": false}
]
}
```
### 获取表数据(分页)
```
GET /api/tables/{name}/data?page=1&pageSize=20
```
参数:
- `page` - 页码,从 1 开始默认1
- `pageSize` - 每页行数,最大 100默认20
返回示例:
```json
{
"page": 1,
"pageSize": 20,
"totalRows": 5,
"totalPages": 1,
"rows": [
{
"_seq": 1,
"_time": 1234567890,
"name": "Alice",
"email": "alice@example.com",
"age": 30
}
]
}
```
### 获取表基本信息
```
GET /api/tables/{name}
```
## 在你的应用中使用
你可以在自己的应用中轻松集成 Web UI
```go
package main
import (
"net/http"
"code.tczkiot.com/srdb"
)
func main() {
// 打开数据库
db, _ := database.Open("./mydb")
defer db.Close()
// 获取 HTTP Handler
handler := db.WebUI()
// 启动服务器
http.ListenAndServe(":8080", handler)
}
```
或者将其作为现有 Web 应用的一部分:
```go
mux := http.NewServeMux()
// 你的其他路由
mux.HandleFunc("/api/myapp", myHandler)
// 挂载 SRDB Web UI 到 /admin/db 路径
mux.Handle("/admin/db/", http.StripPrefix("/admin/db", db.WebUI()))
http.ListenAndServe(":8080", mux)
```
## 技术栈
- **后端**: Go + 标准库 `net/http`
- **前端**: [HTMX](https://htmx.org/) + 原生 JavaScript + CSS
- **渲染**: 服务端 HTML 渲染Go 模板生成)
- **字体**: Google Fonts (Inter)
- **无构建**: 直接从 CDN 加载 HTMX无需 npm、webpack 等工具
- **部署**: 所有静态资源通过 `embed.FS` 嵌入到二进制文件中
## 测试大数据
### logs 表自动生成
程序会在后台持续向 `logs` 表插入大数据:
- **频率**:每秒一条
- **大小**2KB ~ 512KB 随机
- **格式**:十六进制字符串
- **字段**
- `timestamp` - 插入时间
- `data` - 随机数据(十六进制)
- `size_bytes` - 数据大小(字节)
你可以选择 `logs` 表来测试大数据的显示效果:
1. 单元格会显示数据大小标签(如 `245.12 KB`
2. 内容被自动截断,显示省略号
3. 点击单元格在弹窗中查看完整数据
终端会实时输出插入日志:
```
Inserted record #1, size: 245.12 KB
Inserted record #2, size: 128.50 KB
Inserted record #3, size: 487.23 KB
```
## 注意事项
- Web UI 是只读的,不提供数据修改功能
- 适合用于开发、调试和数据查看
- 生产环境建议添加身份验证和访问控制
- 大数据量表的分页查询性能取决于数据分布
- `logs` 表会持续增长,可手动删除 `./data/logs` 目录重置
## Compaction 状态
由于后台持续插入大数据,会产生大量 SST 文件。SRDB 会自动运行 compaction 合并这些文件。
### 检查 Compaction 状态
```bash
# 查看 SST 文件分布
./check_sst.sh
# 观察 webui 日志中的 [Compaction] 信息
```
### Compaction 改进
- **触发阈值**: L0 文件数量 ≥2 就触发(之前是 4
- **运行频率**: 每 10 秒自动检查
- **日志增强**: 显示详细的 compaction 状态和统计
详细说明请查看 [COMPACTION.md](./COMPACTION.md)
## 常见问题
### `invalid header` 错误
如果看到类似错误:
```
failed to open table logs: invalid header
```
**快速修复**
```bash
./fix_corrupted_table.sh logs
```
详见:[QUICK_FIX.md](./QUICK_FIX.md) 或 [TROUBLESHOOTING.md](./TROUBLESHOOTING.md)
## 更多信息
- [FEATURES.md](./FEATURES.md) - 详细功能说明
- [COMPACTION.md](./COMPACTION.md) - Compaction 机制和诊断
- [TROUBLESHOOTING.md](./TROUBLESHOOTING.md) - 故障排除指南
- [QUICK_FIX.md](./QUICK_FIX.md) - 快速修复常见错误