feat(cache): 增加历史记录功能和数据库设计规范
- 在 README.md 中新增数据库设计规范、代码生成配置规范和改进规划的文档链接 - 在 CacheDb 结构体中添加历史记录开关 HistorySet - 实现历史记录的写入逻辑,记录每次缓存的新增和修改 - 更新缓存的获取和设置方法,支持历史记录的管理 - 优化数据库表的初始化和迁移逻辑,确保历史表的创建与管理
This commit is contained in:
@@ -0,0 +1,144 @@
|
||||
---
|
||||
name: 缓存数据库表重构
|
||||
overview: 重构数据库缓存模块,将 cached 表替换为符合设计规范的 hotime_cache 表,支持 MySQL/SQLite/PostgreSQL,修复并发问题,支持可配置的历史记录功能和自动迁移。
|
||||
todos:
|
||||
- id: update-cache-db
|
||||
content: 重构 cache_db.go:新表、UPSERT、历史记录、自动迁移、问题修复
|
||||
status: completed
|
||||
- id: update-cache-go
|
||||
content: 修改 cache.go:添加 HistorySet 配置传递
|
||||
status: completed
|
||||
- id: update-makecode
|
||||
content: 修改 makecode.go:跳过新表名
|
||||
status: completed
|
||||
---
|
||||
|
||||
# 缓存数据库表重构计划
|
||||
|
||||
## 设计概要
|
||||
|
||||
将原 `cached` 表替换为 `hotime_cache` 表,遵循数据库设计规范,支持:
|
||||
|
||||
- 多数据库:MySQL、SQLite、PostgreSQL
|
||||
- 可配置的历史记录功能(仅日志,无读取接口)
|
||||
- 自动迁移旧 cached 表数据
|
||||
|
||||
## 文件改动清单
|
||||
|
||||
| 文件 | 改动 | 状态 |
|
||||
|
||||
|------|------|------|
|
||||
|
||||
| [cache/cache_db.go](cache/cache_db.go) | 完全重构:新表、UPSERT、历史记录、自动迁移 | 待完成 |
|
||||
|
||||
| [cache/cache.go](cache/cache.go) | 添加 `HistorySet: db.GetBool("history")` 配置传递 | 待完成 |
|
||||
|
||||
| [code/makecode.go](code/makecode.go) | 跳过 hotime_cache 和 hotime_cache_history | 已完成 |
|
||||
|
||||
## 表结构设计
|
||||
|
||||
### 主表 `hotime_cache`
|
||||
|
||||
```sql
|
||||
-- MySQL
|
||||
CREATE TABLE `hotime_cache` (
|
||||
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
|
||||
`key` varchar(64) NOT NULL COMMENT '缓存键',
|
||||
`value` text DEFAULT NULL COMMENT '缓存值',
|
||||
`end_time` datetime DEFAULT NULL COMMENT '过期时间',
|
||||
`state` int(2) DEFAULT '0' COMMENT '状态:0-正常,1-异常,2-隐藏',
|
||||
`create_time` datetime DEFAULT NULL COMMENT '创建日期',
|
||||
`modify_time` datetime DEFAULT NULL COMMENT '变更时间',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_key` (`key`),
|
||||
KEY `idx_end_time` (`end_time`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='缓存管理';
|
||||
|
||||
-- SQLite
|
||||
CREATE TABLE "hotime_cache" (
|
||||
"id" INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
"key" TEXT NOT NULL UNIQUE,
|
||||
"value" TEXT,
|
||||
"end_time" TEXT,
|
||||
"state" INTEGER DEFAULT 0,
|
||||
"create_time" TEXT,
|
||||
"modify_time" TEXT
|
||||
);
|
||||
|
||||
-- PostgreSQL
|
||||
CREATE TABLE "hotime_cache" (
|
||||
"id" SERIAL PRIMARY KEY,
|
||||
"key" VARCHAR(64) NOT NULL UNIQUE,
|
||||
"value" TEXT,
|
||||
"end_time" TIMESTAMP,
|
||||
"state" INTEGER DEFAULT 0,
|
||||
"create_time" TIMESTAMP,
|
||||
"modify_time" TIMESTAMP
|
||||
);
|
||||
CREATE INDEX "idx_hotime_cache_end_time" ON "hotime_cache" ("end_time");
|
||||
```
|
||||
|
||||
### 历史表 `hotime_cache_history`(配置开启时创建,创建后永不自动删除)
|
||||
|
||||
与主表结构相同,但 `id` 改为 `hotime_cache_id` 作为外键关联。
|
||||
|
||||
## 问题修复清单
|
||||
|
||||
| 问题 | 原状态 | 修复方案 |
|
||||
|
||||
|------|--------|----------|
|
||||
|
||||
| key 无索引 | 全表扫描 | 唯一索引 uk_key |
|
||||
|
||||
| 并发竞态 | Update+Insert 可能重复 | 使用 UPSERT 语法 |
|
||||
|
||||
| 时间字段混乱 | time(纳秒) + endtime(秒) | 统一 datetime 格式 |
|
||||
|
||||
| value 长度限制 | varchar(2000) | TEXT 类型 |
|
||||
|
||||
| TimeOut=0 立即过期 | 无默认值 | 默认 24 小时 |
|
||||
|
||||
| get 时删除过期数据 | 每次写操作 | 惰性删除,只返回 nil |
|
||||
|
||||
| 旧表 key 重复 | 无约束 | 迁移时取最后一条 |
|
||||
|
||||
| value 包装冗余 | `{"data": value}` | 直接存储 |
|
||||
|
||||
## 主要代码改动点
|
||||
|
||||
### cache_db.go 改动
|
||||
|
||||
1. 新增常量:表名、默认过期时间 24 小时
|
||||
2. 结构体添加 `HistorySet bool`
|
||||
3. 使用 common 包 `Time2Str(time.Now())` 格式化时间
|
||||
4. `initDbTable()`: 支持三种数据库、自动迁移、创建历史表
|
||||
5. `migrateFromCached()`: 去重迁移(取最后一条)、删除旧表
|
||||
6. `writeHistory()`: 查询数据写入历史表(仅日志)
|
||||
7. `set()`: 使用 UPSERT、调用 writeHistory
|
||||
8. `get()`: 惰性删除
|
||||
9. `Cache()`: TimeOut=0 时用默认值
|
||||
|
||||
### cache.go 改动
|
||||
|
||||
第 268 行添加:`HistorySet: db.GetBool("history")`
|
||||
|
||||
## 配置示例
|
||||
|
||||
```json
|
||||
{
|
||||
"cache": {
|
||||
"db": {
|
||||
"db": true,
|
||||
"session": true,
|
||||
"timeout": 72000,
|
||||
"history": false
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 历史记录逻辑
|
||||
|
||||
- 新增/修改后:查询完整数据,id 改为 hotime_cache_id,插入历史表
|
||||
- 删除:不记录历史
|
||||
- 历史表仅日志记录,无读取接口,人工在数据库操作
|
||||
@@ -0,0 +1,103 @@
|
||||
---
|
||||
name: 规范文档创建
|
||||
overview: 创建两个规范文档:一个数据库设计规范文档,一个管理后台配置规范文档(包含admin.json和rule.json的配置说明),并在README.md中添加链接。
|
||||
todos:
|
||||
- id: create-db-doc
|
||||
content: 创建 docs/DatabaseDesign_数据库设计规范.md
|
||||
status: pending
|
||||
- id: create-admin-doc
|
||||
content: 创建 docs/AdminConfig_管理后台配置规范.md
|
||||
status: pending
|
||||
- id: update-readme
|
||||
content: 在 README.md 文档表格中添加两个新文档链接
|
||||
status: pending
|
||||
dependencies:
|
||||
- create-db-doc
|
||||
- create-admin-doc
|
||||
---
|
||||
|
||||
# 创建规范文档
|
||||
|
||||
## 任务概述
|
||||
|
||||
在 `D:\work\hotimev1.5\docs` 目录下创建两个规范文档,并更新 README.md 添加链接。
|
||||
|
||||
---
|
||||
|
||||
## 文档一:数据库设计规范
|
||||
|
||||
**文件**: [docs/DatabaseDesign_数据库设计规范.md](docs/DatabaseDesign_数据库设计规范.md)
|
||||
|
||||
### 内容结构
|
||||
|
||||
| 章节 | 内容 |
|
||||
|
||||
|------|------|
|
||||
|
||||
| 表命名规则 | 不加前缀、可用简称、关联表命名(主表_关联表) |
|
||||
|
||||
| 字段命名规则 | 主键id、外键表名_id、全局唯一性要求、层级字段(parent_id/parent_ids/level) |
|
||||
|
||||
| 注释规则 | select类型格式(`状态:0-正常,1-异常`)、时间用datetime |
|
||||
|
||||
| 必有字段 | state、create_time、modify_time |
|
||||
|
||||
| 示例 | 完整建表SQL示例 |
|
||||
|
||||
---
|
||||
|
||||
## 文档二:管理后台配置规范
|
||||
|
||||
**文件**: [docs/AdminConfig_管理后台配置规范.md](docs/AdminConfig_管理后台配置规范.md)
|
||||
|
||||
### 内容结构
|
||||
|
||||
| 章节 | 内容 |
|
||||
|
||||
|------|------|
|
||||
|
||||
| admin.json 配置 | |
|
||||
|
||||
| - flow配置 | 数据流控制,定义表间权限关系(sql条件、stop标志) |
|
||||
|
||||
| - labelConfig | 操作按钮标签(show/add/delete/edit/info/download) |
|
||||
|
||||
| - label | 菜单/表的显示名称 |
|
||||
|
||||
| - menus配置 | 菜单结构(嵌套menus、icon、table、name、auth) |
|
||||
|
||||
| - auth配置 | 权限数组(show/add/delete/edit/info/download) |
|
||||
|
||||
| - icon配置 | 菜单图标(如Setting) |
|
||||
|
||||
| - table/name配置 | table指定数据表,name用于分组标识 |
|
||||
|
||||
| - stop配置 | 不允许用户修改自身关联数据的表 |
|
||||
|
||||
| rule.json 配置 | |
|
||||
|
||||
| - 字段默认权限 | add/edit/info/list/must/strict/type 各字段含义 |
|
||||
|
||||
| - 内置字段规则 | id、parent_id、create_time、modify_time、password等 |
|
||||
|
||||
| - type类型说明 | select/time/image/file/password/textArea/auth/form等 |
|
||||
|
||||
---
|
||||
|
||||
## 更新 README.md
|
||||
|
||||
在文档表格中添加两个新链接:
|
||||
|
||||
```markdown
|
||||
| [数据库设计规范](docs/DatabaseDesign_数据库设计规范.md) | 表命名、字段命名、注释规则、必有字段 |
|
||||
| [管理后台配置规范](docs/AdminConfig_管理后台配置规范.md) | admin.json、rule.json 配置说明 |
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 关键参考文件
|
||||
|
||||
- [`code/config.go`](code/config.go): RuleConfig 默认规则定义
|
||||
- [`code/makecode.go`](code/makecode.go): 外键自动关联逻辑
|
||||
- [`example/config/admin.json`](example/config/admin.json): 完整配置示例
|
||||
- [`example/config/rule.json`](example/config/rule.json): 字段规则示例
|
||||
Reference in New Issue
Block a user