Files
akmon/NEW_CONFIG_SYSTEM_GUIDE.md
2026-01-20 08:04:15 +08:00

296 lines
7.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.
# 新配置系统部署和使用指南
## 概述
本指南说明如何部署和使用新的 `ak_global_config` + `ak_global_config_translations` 配置系统,替代原有的 key 后缀方式。
## 部署步骤
### 1. 数据库部署
#### 创建新表结构
```bash
# 执行新配置表结构脚本
psql -h your-host -U your-user -d your-db -f improved_global_config_with_translation.sql
```
#### 数据迁移(如需要)
```bash
# 如果有现有数据需要迁移
psql -h your-host -U your-user -d your-db -f migrate_global_config_data.sql
```
### 2. 验证数据库函数
执行以下 SQL 验证函数是否正确创建:
```sql
-- 1. 验证批量配置获取函数
SELECT * FROM get_configs_by_language('zh') LIMIT 5;
-- 2. 验证单值配置获取函数
SELECT get_config_value('company_name', 'zh');
-- 3. 验证热门搜索函数
SELECT * FROM get_hot_searches('zh');
-- 4. 验证多语言视图
SELECT * FROM vw_global_config_multilingual
WHERE language_code = 'zh' AND config_category = 'company';
```
### 3. 前端代码部署
前端代码已更新为支持以下回退机制:
1. **主要方法**: `get_configs_by_language(p_language_code)` - 推荐使用
2. **备用方法1**: `get_config_by_language(lang_code)` - 向后兼容
3. **备用方法2**: 直接查询 `vw_global_config_multilingual` 视图
4. **兜底方案**: 使用硬编码的默认配置
## 可用的数据库函数
### 1. 批量配置获取(推荐)
```sql
-- 函数签名
get_configs_by_language(p_language_code VARCHAR(10) DEFAULT 'zh')
-- 返回字段
config_key, config_value, config_type, config_category, sort_order
-- 使用示例
SELECT * FROM get_configs_by_language('zh');
SELECT * FROM get_configs_by_language('en');
```
### 2. 单值配置获取
```sql
-- 函数签名
get_config_value(p_config_key VARCHAR(100), p_language_code VARCHAR(10) DEFAULT 'zh')
-- 使用示例
SELECT get_config_value('company_name', 'zh');
SELECT get_config_value('company_phone', 'en'); -- 无多语言差异的配置
```
### 3. 热门搜索关键词
```sql
-- 函数签名
get_hot_searches(lang_code VARCHAR(10) DEFAULT 'zh')
-- 返回字段
search_term, sort_order
-- 使用示例
SELECT * FROM get_hot_searches('zh');
```
### 4. 多语言配置视图
```sql
-- 视图名称
vw_global_config_multilingual
-- 主要字段
config_key, config_value, config_type, config_category, language_code, is_active
-- 使用示例
SELECT * FROM vw_global_config_multilingual
WHERE language_code = 'zh' AND config_category = 'company';
```
## 前端使用示例
### JavaScript/TypeScript
```javascript
// 使用 Supabase 客户端
const loadConfig = async (languageCode = 'zh') => {
try {
// 方法1: 使用 RPC 函数(推荐)
const { data, error } = await supabase
.rpc('get_configs_by_language', {
p_language_code: languageCode
});
if (data && !error) {
return data;
}
// 方法2: 使用视图查询(备用)
const { data: fallbackData, error: fallbackError } = await supabase
.from('vw_global_config_multilingual')
.select('config_key, config_value, config_type, config_category')
.eq('language_code', languageCode)
.eq('is_active', true);
return fallbackData || [];
} catch (error) {
console.error('配置加载失败:', error);
return [];
}
};
// 获取单个配置值
const getConfigValue = async (key, language = 'zh') => {
try {
const { data, error } = await supabase
.rpc('get_config_value', {
p_config_key: key,
p_language_code: language
});
return data || null;
} catch (error) {
console.error('配置获取失败:', error);
return null;
}
};
// 使用示例
const companyName = await getConfigValue('company_name', 'zh');
const configs = await loadConfig('en');
```
## 配置管理
### 添加新配置项
```sql
-- 1. 添加主配置记录
INSERT INTO ak_global_config (
config_key,
config_category,
is_translatable,
sort_order,
default_value
) VALUES (
'new_config_key',
'category_name',
true, -- 或 false表示是否需要翻译
100,
'default_value'
);
-- 2. 如果需要翻译,添加翻译记录
INSERT INTO ak_global_config_translations (config_id, language_code, translated_value)
SELECT
c.id,
'zh',
'中文值'
FROM ak_global_config c
WHERE c.config_key = 'new_config_key';
-- 重复上述步骤为其他语言添加翻译
```
### 更新配置值
```sql
-- 更新不需要翻译的配置
UPDATE ak_global_config
SET default_value = 'new_value'
WHERE config_key = 'config_key';
-- 更新需要翻译的配置
UPDATE ak_global_config_translations
SET translated_value = 'new_translated_value'
WHERE config_id = (
SELECT id FROM ak_global_config WHERE config_key = 'config_key'
) AND language_code = 'zh';
```
### 添加新语言
```sql
-- 1. 添加语言记录
INSERT INTO ak_languages (code, name, native_name, sort_order)
VALUES ('fr', 'French', 'Français', 5);
-- 2. 为可翻译的配置添加法语翻译
INSERT INTO ak_global_config_translations (config_id, language_code, translated_value)
SELECT
c.id,
'fr',
'French translation here'
FROM ak_global_config c
WHERE c.is_translatable = true;
```
## 调试和故障排除
### 前端调试
页面包含了调试面板(仅在开发环境显示),可以:
1. 查看当前配置状态
2. 测试各种数据库函数
3. 手动重新加载配置
### 数据库调试
```sql
-- 检查配置数量
SELECT
config_category,
COUNT(*) as config_count
FROM ak_global_config
WHERE is_active = true
GROUP BY config_category;
-- 检查翻译完整性
SELECT
c.config_key,
c.is_translatable,
COUNT(t.language_code) as translation_count
FROM ak_global_config c
LEFT JOIN ak_global_config_translations t ON c.id = t.config_id
WHERE c.is_active = true
GROUP BY c.config_key, c.is_translatable
ORDER BY c.config_key;
-- 检查缺失的翻译
SELECT
c.config_key,
l.code as missing_language
FROM ak_global_config c
CROSS JOIN ak_languages l
LEFT JOIN ak_global_config_translations t
ON c.id = t.config_id AND l.code = t.language_code
WHERE c.is_translatable = true
AND c.is_active = true
AND l.is_active = true
AND t.id IS NULL;
```
### 常见问题
1. **函数不存在错误**
- 确认是否执行了 `improved_global_config_with_translation.sql`
- 检查函数是否在正确的 schema 中创建
2. **配置加载失败**
- 检查表是否存在数据
- 验证 `is_active` 字段设置正确
- 检查语言代码是否匹配
3. **翻译缺失**
- 使用调试 SQL 检查翻译完整性
- 确认 `is_translatable` 字段设置正确
## 性能优化
1. **索引优化**
- 确保相关索引已创建(脚本中已包含)
- 监控查询性能
2. **缓存策略**
- 前端可以缓存配置数据
- 考虑使用 Redis 等缓存解决方案
3. **查询优化**
- 优先使用 RPC 函数而非复杂视图查询
- 按需加载配置分类
## 总结
新的配置系统提供了:
- ✅ 更科学的数据结构设计
- ✅ 更灵活的多语言支持
- ✅ 更好的扩展性和维护性
- ✅ 向后兼容的迁移方案
- ✅ 完善的调试和监控工具
通过本指南,您可以成功部署和使用新的全局配置系统。