603 lines
19 KiB
Markdown
603 lines
19 KiB
Markdown
# DataTools Pro 数据库设计文档
|
||
|
||
## 1. 数据库概述
|
||
|
||
### 1.1 数据库架构
|
||
DataTools Pro采用多数据库架构,针对不同的数据存储需求选择最适合的数据库技术:
|
||
|
||
```
|
||
数据库架构图:
|
||
┌─────────────────────────────────────────────────────────┐
|
||
│ DataTools Pro 数据库架构 │
|
||
├─────────────────────────────────────────────────────────┤
|
||
│ 应用层 (Application Layer) │
|
||
│ ┌─────────────────────────────────────────────────────┐ │
|
||
│ │ Flask应用程序 │ │
|
||
│ └─────────────────────────────────────────────────────┘ │
|
||
├─────────────────────────────────────────────────────────┤
|
||
│ 数据访问层 (Data Access Layer) │
|
||
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │
|
||
│ │ Cassandra │ │ Redis │ │ SQLite │ │
|
||
│ │ Driver │ │ Client │ │ Driver │ │
|
||
│ └─────────────┘ └─────────────┘ └─────────────────────┘ │
|
||
├─────────────────────────────────────────────────────────┤
|
||
│ 数据存储层 (Data Storage Layer) │
|
||
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │
|
||
│ │ Apache │ │ Redis │ │ SQLite │ │
|
||
│ │ Cassandra │ │ Cluster │ │ 本地文件 │ │
|
||
│ │ 集群 │ │ │ │ config_groups.db │ │
|
||
│ │ (外部数据源) │ │ (外部数据源) │ │ (配置和历史数据) │ │
|
||
│ └─────────────┘ └─────────────┘ └─────────────────────┘ │
|
||
└─────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
### 1.2 数据库分类
|
||
|
||
#### 1.2.1 外部数据源
|
||
- **Apache Cassandra**: 主要的数据比对源,存储业务数据
|
||
- **Redis Cluster**: 缓存和高性能数据存储,支持多种数据类型
|
||
|
||
#### 1.2.2 内部存储
|
||
- **SQLite**: 轻量级关系数据库,存储系统配置、查询历史和日志
|
||
|
||
### 1.3 设计原则
|
||
- **数据隔离**: 不同类型数据使用不同的存储方案
|
||
- **性能优化**: 根据访问模式选择合适的数据库
|
||
- **易维护**: 简化数据库管理和备份恢复
|
||
- **扩展性**: 支持数据量增长和功能扩展
|
||
|
||
## 2. SQLite数据库设计
|
||
|
||
### 2.1 数据库文件
|
||
- **文件名**: `config_groups.db`
|
||
- **位置**: 项目根目录
|
||
- **编码**: UTF-8
|
||
- **版本**: SQLite 3.x
|
||
|
||
### 2.2 表结构设计
|
||
|
||
#### 2.2.1 config_groups表 - 配置组管理
|
||
```sql
|
||
CREATE TABLE config_groups (
|
||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||
name TEXT NOT NULL UNIQUE, -- 配置组名称
|
||
description TEXT, -- 描述信息
|
||
pro_config TEXT NOT NULL, -- 生产环境配置(JSON)
|
||
test_config TEXT NOT NULL, -- 测试环境配置(JSON)
|
||
query_config TEXT NOT NULL, -- 查询配置(JSON)
|
||
sharding_config TEXT, -- 分表配置(JSON)
|
||
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
||
);
|
||
|
||
-- 索引
|
||
CREATE INDEX idx_config_groups_name ON config_groups(name);
|
||
CREATE INDEX idx_config_groups_created_at ON config_groups(created_at);
|
||
```
|
||
|
||
**字段详解**:
|
||
- `id`: 主键,自增整数
|
||
- `name`: 配置组名称,唯一索引
|
||
- `description`: 配置组描述,可为空
|
||
- `pro_config`: 生产环境Cassandra配置,JSON格式
|
||
- `test_config`: 测试环境Cassandra配置,JSON格式
|
||
- `query_config`: 查询参数配置,JSON格式
|
||
- `sharding_config`: 分表查询配置,JSON格式
|
||
- `created_at`: 创建时间
|
||
- `updated_at`: 更新时间
|
||
|
||
**JSON配置示例**:
|
||
```json
|
||
{
|
||
"pro_config": {
|
||
"cluster_name": "production-cluster",
|
||
"datacenter": "datacenter1",
|
||
"hosts": ["10.0.1.100", "10.0.1.101"],
|
||
"port": 9042,
|
||
"username": "cassandra",
|
||
"password": "encrypted_password",
|
||
"keyspace": "production_ks",
|
||
"table": "user_data"
|
||
},
|
||
"query_config": {
|
||
"keys": ["user_id"],
|
||
"fields_to_compare": ["name", "email", "status"],
|
||
"exclude_fields": ["created_at", "updated_at"]
|
||
},
|
||
"sharding_config": {
|
||
"use_sharding_for_pro": true,
|
||
"use_sharding_for_test": false,
|
||
"interval_seconds": 604800,
|
||
"table_count": 14
|
||
}
|
||
}
|
||
```
|
||
|
||
#### 2.2.2 query_history表 - 查询历史记录
|
||
```sql
|
||
CREATE TABLE query_history (
|
||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||
name TEXT NOT NULL, -- 历史记录名称
|
||
description TEXT, -- 描述信息
|
||
pro_config TEXT NOT NULL, -- 生产环境配置(JSON)
|
||
test_config TEXT NOT NULL, -- 测试环境配置(JSON)
|
||
query_config TEXT NOT NULL, -- 查询配置(JSON)
|
||
query_keys TEXT NOT NULL, -- 查询的键值(JSON Array)
|
||
results_summary TEXT NOT NULL, -- 结果摘要(JSON)
|
||
execution_time REAL NOT NULL, -- 执行时间(秒)
|
||
total_keys INTEGER NOT NULL, -- 总Key数量
|
||
differences_count INTEGER NOT NULL, -- 差异数量
|
||
identical_count INTEGER NOT NULL, -- 相同数量
|
||
query_type TEXT NOT NULL DEFAULT 'single', -- 查询类型(single/sharding)
|
||
sharding_config TEXT, -- 分表配置(JSON)
|
||
raw_results TEXT, -- 完整查询结果(JSON)
|
||
differences_data TEXT, -- 差异详细数据(JSON)
|
||
identical_data TEXT, -- 相同数据详情(JSON)
|
||
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
||
);
|
||
|
||
-- 索引
|
||
CREATE INDEX idx_query_history_name ON query_history(name);
|
||
CREATE INDEX idx_query_history_query_type ON query_history(query_type);
|
||
CREATE INDEX idx_query_history_created_at ON query_history(created_at);
|
||
CREATE INDEX idx_query_history_execution_time ON query_history(execution_time);
|
||
```
|
||
|
||
**字段详解**:
|
||
- `id`: 主键,自增整数
|
||
- `name`: 历史记录名称
|
||
- `description`: 历史记录描述
|
||
- `pro_config`: 生产环境配置快照
|
||
- `test_config`: 测试环境配置快照
|
||
- `query_config`: 查询配置快照
|
||
- `query_keys`: 查询的Key值列表
|
||
- `results_summary`: 查询结果摘要统计
|
||
- `execution_time`: 查询执行时间
|
||
- `total_keys`: 查询的总Key数量
|
||
- `differences_count`: 发现的差异数量
|
||
- `identical_count`: 相同记录数量
|
||
- `query_type`: 查询类型(single/sharding)
|
||
- `sharding_config`: 分表配置(仅分表查询)
|
||
- `raw_results`: 完整的查询结果数据
|
||
- `differences_data`: 差异数据详情
|
||
- `identical_data`: 相同数据详情
|
||
- `created_at`: 创建时间
|
||
|
||
#### 2.2.3 query_logs表 - 查询日志记录
|
||
```sql
|
||
CREATE TABLE query_logs (
|
||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||
batch_id TEXT NOT NULL, -- 批次ID(UUID)
|
||
history_id INTEGER, -- 关联历史记录ID
|
||
timestamp DATETIME NOT NULL, -- 日志时间戳
|
||
level TEXT NOT NULL, -- 日志级别(INFO/WARNING/ERROR)
|
||
message TEXT NOT NULL, -- 日志消息
|
||
query_type TEXT NOT NULL, -- 查询类型标识
|
||
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||
|
||
FOREIGN KEY (history_id) REFERENCES query_history(id) ON DELETE SET NULL
|
||
);
|
||
|
||
-- 索引
|
||
CREATE INDEX idx_query_logs_batch_id ON query_logs(batch_id);
|
||
CREATE INDEX idx_query_logs_history_id ON query_logs(history_id);
|
||
CREATE INDEX idx_query_logs_level ON query_logs(level);
|
||
CREATE INDEX idx_query_logs_timestamp ON query_logs(timestamp);
|
||
CREATE INDEX idx_query_logs_query_type ON query_logs(query_type);
|
||
```
|
||
|
||
**字段详解**:
|
||
- `id`: 主键,自增整数
|
||
- `batch_id`: 批次标识,同一次查询操作的日志共享同一个batch_id
|
||
- `history_id`: 关联的历史记录ID,外键关联
|
||
- `timestamp`: 日志产生的精确时间戳
|
||
- `level`: 日志级别(INFO/WARNING/ERROR)
|
||
- `message`: 日志消息内容
|
||
- `query_type`: 查询类型标识(cassandra_single/cassandra_sharding/redis_compare)
|
||
- `created_at`: 记录创建时间
|
||
|
||
### 2.3 数据库触发器
|
||
|
||
#### 2.3.1 自动更新updated_at触发器
|
||
```sql
|
||
-- 配置组更新时间触发器
|
||
CREATE TRIGGER update_config_groups_updated_at
|
||
AFTER UPDATE ON config_groups
|
||
FOR EACH ROW
|
||
BEGIN
|
||
UPDATE config_groups
|
||
SET updated_at = CURRENT_TIMESTAMP
|
||
WHERE id = NEW.id;
|
||
END;
|
||
```
|
||
|
||
### 2.4 数据库视图
|
||
|
||
#### 2.4.1 查询历史统计视图
|
||
```sql
|
||
CREATE VIEW query_history_stats AS
|
||
SELECT
|
||
query_type,
|
||
COUNT(*) as total_queries,
|
||
AVG(execution_time) as avg_execution_time,
|
||
AVG(total_keys) as avg_keys_per_query,
|
||
AVG(differences_count) as avg_differences,
|
||
AVG(CAST(differences_count AS REAL) / total_keys * 100) as avg_diff_rate,
|
||
MIN(created_at) as first_query,
|
||
MAX(created_at) as last_query
|
||
FROM query_history
|
||
GROUP BY query_type;
|
||
```
|
||
|
||
#### 2.4.2 日志统计视图
|
||
```sql
|
||
CREATE VIEW query_logs_stats AS
|
||
SELECT
|
||
DATE(created_at) as log_date,
|
||
level,
|
||
query_type,
|
||
COUNT(*) as log_count
|
||
FROM query_logs
|
||
GROUP BY DATE(created_at), level, query_type
|
||
ORDER BY log_date DESC, level;
|
||
```
|
||
|
||
## 3. Cassandra数据库设计
|
||
|
||
### 3.1 数据模型理解
|
||
DataTools Pro作为数据比对工具,**不直接管理**Cassandra的数据模型,而是连接到现有的Cassandra集群进行数据查询和比对。
|
||
|
||
### 3.2 支持的Cassandra特性
|
||
|
||
#### 3.2.1 表结构支持
|
||
- **单表查询**: 支持任意Cassandra表结构
|
||
- **分表查询**: 支持TWCS(Time Window Compaction Strategy)分表模式
|
||
- **复合主键**: 支持多字段组合主键
|
||
- **所有数据类型**: text、int、timestamp、uuid、blob等
|
||
|
||
#### 3.2.2 查询模式
|
||
```cql
|
||
-- 单主键查询示例
|
||
SELECT * FROM keyspace.table_name
|
||
WHERE primary_key IN (?, ?, ?);
|
||
|
||
-- 复合主键查询示例
|
||
SELECT * FROM keyspace.table_name
|
||
WHERE (key1='value1' AND key2='value2')
|
||
OR (key1='value3' AND key2='value4');
|
||
|
||
-- 分表查询示例
|
||
SELECT * FROM keyspace.table_name_0
|
||
WHERE primary_key IN (?, ?);
|
||
SELECT * FROM keyspace.table_name_1
|
||
WHERE primary_key IN (?);
|
||
```
|
||
|
||
#### 3.2.3 分表命名规范
|
||
```
|
||
基础表名: user_data
|
||
分表命名: user_data_0, user_data_1, user_data_2, ..., user_data_13
|
||
分表计算: shard_index = timestamp // interval_seconds % table_count
|
||
```
|
||
|
||
### 3.3 连接管理
|
||
```python
|
||
# Cassandra连接配置
|
||
cassandra_config = {
|
||
"cluster_name": "production-cluster",
|
||
"datacenter": "datacenter1",
|
||
"hosts": ["10.0.1.100", "10.0.1.101", "10.0.1.102"],
|
||
"port": 9042,
|
||
"username": "app_user",
|
||
"password": "secure_password",
|
||
"keyspace": "application_data",
|
||
"table": "user_profiles"
|
||
}
|
||
|
||
# 连接池配置
|
||
connection_settings = {
|
||
"connect_timeout": 10,
|
||
"request_timeout": 30,
|
||
"load_balancing_policy": "DCAwareRoundRobinPolicy",
|
||
"retry_policy": "RetryPolicy",
|
||
"compression": "lz4"
|
||
}
|
||
```
|
||
|
||
## 4. Redis数据库设计
|
||
|
||
### 4.1 数据模型理解
|
||
DataTools Pro支持Redis集群的数据比对,**不直接管理**Redis的数据结构,而是连接到现有的Redis集群进行数据查询和比对。
|
||
|
||
### 4.2 支持的Redis数据类型
|
||
|
||
#### 4.2.1 基本数据类型
|
||
- **String**: 字符串类型,最常用的数据类型
|
||
- **Hash**: 哈希表,存储字段-值对
|
||
- **List**: 列表,有序的字符串集合
|
||
- **Set**: 集合,无序的字符串集合
|
||
- **Sorted Set**: 有序集合,带分数的有序字符串集合
|
||
|
||
#### 4.2.2 查询操作
|
||
```python
|
||
# 不同数据类型的查询操作
|
||
redis_operations = {
|
||
"string": "GET key",
|
||
"hash": "HGETALL key",
|
||
"list": "LRANGE key 0 -1",
|
||
"set": "SMEMBERS key",
|
||
"zset": "ZRANGE key 0 -1 WITHSCORES"
|
||
}
|
||
```
|
||
|
||
### 4.3 Redis集群配置
|
||
```python
|
||
# Redis集群连接配置
|
||
redis_config = {
|
||
"cluster_name": "production-redis",
|
||
"nodes": [
|
||
{"host": "10.0.1.100", "port": 6379},
|
||
{"host": "10.0.1.101", "port": 6379},
|
||
{"host": "10.0.1.102", "port": 6379}
|
||
],
|
||
"password": "redis_password",
|
||
"socket_timeout": 3,
|
||
"socket_connect_timeout": 3,
|
||
"max_connections_per_node": 16,
|
||
"skip_full_coverage_check": True,
|
||
"decode_responses": True
|
||
}
|
||
```
|
||
|
||
## 5. 数据迁移和版本管理
|
||
|
||
### 5.1 数据库版本控制
|
||
|
||
#### 5.1.1 版本信息表
|
||
```sql
|
||
CREATE TABLE database_version (
|
||
version TEXT PRIMARY KEY,
|
||
applied_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||
description TEXT
|
||
);
|
||
|
||
INSERT INTO database_version (version, description)
|
||
VALUES ('1.0.0', '初始数据库结构');
|
||
```
|
||
|
||
#### 5.1.2 迁移脚本示例
|
||
```sql
|
||
-- 版本1.0.0 -> 1.1.0 迁移脚本
|
||
-- 添加Redis配置支持
|
||
ALTER TABLE config_groups
|
||
ADD COLUMN redis_config TEXT;
|
||
|
||
INSERT INTO database_version (version, description)
|
||
VALUES ('1.1.0', '添加Redis配置支持');
|
||
```
|
||
|
||
### 5.2 数据备份策略
|
||
|
||
#### 5.2.1 SQLite备份
|
||
```bash
|
||
# 完整备份
|
||
cp config_groups.db config_groups_backup_$(date +%Y%m%d_%H%M%S).db
|
||
|
||
# 增量备份(基于时间戳)
|
||
sqlite3 config_groups.db "
|
||
SELECT * FROM config_groups
|
||
WHERE updated_at > '2024-08-05 00:00:00';" > incremental_backup.sql
|
||
```
|
||
|
||
#### 5.2.2 备份恢复
|
||
```bash
|
||
# 恢复完整备份
|
||
cp config_groups_backup_20240805_100000.db config_groups.db
|
||
|
||
# 恢复增量数据
|
||
sqlite3 config_groups.db < incremental_backup.sql
|
||
```
|
||
|
||
## 6. 性能优化
|
||
|
||
### 6.1 SQLite优化
|
||
|
||
#### 6.1.1 配置优化
|
||
```sql
|
||
-- SQLite性能优化设置
|
||
PRAGMA journal_mode = WAL; -- 写前日志模式
|
||
PRAGMA synchronous = NORMAL; -- 平衡性能和安全
|
||
PRAGMA cache_size = 10000; -- 缓存页面数量
|
||
PRAGMA temp_store = memory; -- 临时表存储在内存
|
||
PRAGMA mmap_size = 268435456; -- 内存映射大小(256MB)
|
||
```
|
||
|
||
#### 6.1.2 查询优化
|
||
```sql
|
||
-- 分页查询优化
|
||
SELECT * FROM query_history
|
||
WHERE created_at >= ?
|
||
ORDER BY created_at DESC
|
||
LIMIT ? OFFSET ?;
|
||
|
||
-- 统计查询优化
|
||
SELECT query_type, COUNT(*), AVG(execution_time)
|
||
FROM query_history
|
||
WHERE created_at >= DATE('now', '-30 days')
|
||
GROUP BY query_type;
|
||
```
|
||
|
||
### 6.2 连接池优化
|
||
|
||
#### 6.2.1 Cassandra连接池
|
||
```python
|
||
# 连接池配置
|
||
cluster = Cluster(
|
||
hosts=['10.0.1.100', '10.0.1.101'],
|
||
port=9042,
|
||
load_balancing_policy=DCAwareRoundRobinPolicy(local_dc='datacenter1'),
|
||
default_retry_policy=RetryPolicy(),
|
||
compression=True,
|
||
protocol_version=4
|
||
)
|
||
|
||
# 会话池管理
|
||
session_pool = cluster.connect()
|
||
session_pool.default_timeout = 30
|
||
```
|
||
|
||
#### 6.2.2 Redis连接池
|
||
```python
|
||
# Redis集群连接池
|
||
from rediscluster import RedisCluster
|
||
|
||
redis_cluster = RedisCluster(
|
||
startup_nodes=[
|
||
{"host": "10.0.1.100", "port": 6379},
|
||
{"host": "10.0.1.101", "port": 6379}
|
||
],
|
||
password="redis_password",
|
||
socket_timeout=3,
|
||
socket_connect_timeout=3,
|
||
max_connections_per_node=16,
|
||
skip_full_coverage_check=True
|
||
)
|
||
```
|
||
|
||
## 7. 数据安全
|
||
|
||
### 7.1 敏感数据处理
|
||
|
||
#### 7.1.1 密码加密
|
||
```python
|
||
# 配置中的密码加密存储
|
||
import base64
|
||
from cryptography.fernet import Fernet
|
||
|
||
def encrypt_password(password, key):
|
||
"""加密密码"""
|
||
f = Fernet(key)
|
||
encrypted_password = f.encrypt(password.encode())
|
||
return base64.b64encode(encrypted_password).decode()
|
||
|
||
def decrypt_password(encrypted_password, key):
|
||
"""解密密码"""
|
||
f = Fernet(key)
|
||
decoded_password = base64.b64decode(encrypted_password.encode())
|
||
return f.decrypt(decoded_password).decode()
|
||
```
|
||
|
||
#### 7.1.2 数据脱敏
|
||
```python
|
||
def mask_sensitive_data(config):
|
||
"""配置数据脱敏显示"""
|
||
masked_config = config.copy()
|
||
if 'password' in masked_config:
|
||
masked_config['password'] = '***masked***'
|
||
return masked_config
|
||
```
|
||
|
||
### 7.2 访问控制
|
||
|
||
#### 7.2.1 数据库权限
|
||
```sql
|
||
-- SQLite访问控制(文件系统级别)
|
||
chmod 600 config_groups.db -- 仅所有者可读写
|
||
chown app:app config_groups.db -- 设置正确的所有者
|
||
```
|
||
|
||
#### 7.2.2 网络安全
|
||
```python
|
||
# Cassandra SSL连接
|
||
from cassandra.auth import PlainTextAuthProvider
|
||
from ssl import SSLContext, PROTOCOL_TLS
|
||
|
||
ssl_context = SSLContext(PROTOCOL_TLS)
|
||
auth_provider = PlainTextAuthProvider(username='app_user', password='password')
|
||
|
||
cluster = Cluster(
|
||
['10.0.1.100'],
|
||
ssl_context=ssl_context,
|
||
auth_provider=auth_provider
|
||
)
|
||
```
|
||
|
||
## 8. 监控和维护
|
||
|
||
### 8.1 数据库监控
|
||
|
||
#### 8.1.1 SQLite监控
|
||
```sql
|
||
-- 数据库大小监控
|
||
SELECT
|
||
(page_count * page_size) / 1024 / 1024 as db_size_mb
|
||
FROM pragma_page_count(), pragma_page_size();
|
||
|
||
-- 表大小统计
|
||
SELECT
|
||
name,
|
||
COUNT(*) as row_count
|
||
FROM sqlite_master sm
|
||
JOIN (
|
||
SELECT 'config_groups' as name, COUNT(*) as cnt FROM config_groups
|
||
UNION ALL
|
||
SELECT 'query_history' as name, COUNT(*) as cnt FROM query_history
|
||
UNION ALL
|
||
SELECT 'query_logs' as name, COUNT(*) as cnt FROM query_logs
|
||
) t ON sm.name = t.name;
|
||
```
|
||
|
||
#### 8.1.2 连接监控
|
||
```python
|
||
# 连接健康检查
|
||
def check_database_health():
|
||
"""检查数据库连接健康状态"""
|
||
health_status = {
|
||
"sqlite": check_sqlite_health(),
|
||
"cassandra": check_cassandra_health(),
|
||
"redis": check_redis_health()
|
||
}
|
||
return health_status
|
||
|
||
def check_sqlite_health():
|
||
"""检查SQLite健康状态"""
|
||
try:
|
||
conn = sqlite3.connect('config_groups.db')
|
||
cursor = conn.cursor()
|
||
cursor.execute("SELECT 1")
|
||
conn.close()
|
||
return {"status": "healthy", "timestamp": datetime.now()}
|
||
except Exception as e:
|
||
return {"status": "unhealthy", "error": str(e)}
|
||
```
|
||
|
||
### 8.2 数据维护
|
||
|
||
#### 8.2.1 数据清理
|
||
```sql
|
||
-- 清理30天前的查询日志
|
||
DELETE FROM query_logs
|
||
WHERE created_at < DATE('now', '-30 days');
|
||
|
||
-- 清理大型历史记录的详细数据
|
||
UPDATE query_history
|
||
SET raw_results = NULL,
|
||
differences_data = NULL,
|
||
identical_data = NULL
|
||
WHERE created_at < DATE('now', '-90 days');
|
||
```
|
||
|
||
#### 8.2.2 数据库维护
|
||
```sql
|
||
-- SQLite数据库优化
|
||
VACUUM; -- 重建数据库文件,回收空间
|
||
ANALYZE; -- 更新查询计划统计信息
|
||
PRAGMA optimize; -- 优化数据库性能
|
||
REINDEX; -- 重建所有索引
|
||
```
|
||
|
||
---
|
||
|
||
**版本**: v1.0
|
||
**更新日期**: 2024-08-05
|
||
**维护者**: DataTools Pro Team |