You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
6.5 KiB
6.5 KiB
数据库模型文档
SiteConfigModel
SiteConfigModel 是一个网站配置管理模型,提供了灵活的键值对配置存储和管理功能,支持单个配置项和批量配置操作。
主要特性
- ✅ 键值对配置存储
- ✅ 单个和批量配置操作
- ✅ 自动时间戳管理
- ✅ 配置项唯一性保证
- ✅ 灵活的配置值类型支持
数据库字段
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | integer | 主键,自增 |
| key | string(100) | 配置项键名(必填,唯一,最大长度100) |
| value | text | 配置项值(必填) |
| created_at | timestamp | 创建时间 |
| updated_at | timestamp | 更新时间 |
基本用法
import { SiteConfigModel } from '../models/SiteConfigModel.js'
// 设置单个配置项
await SiteConfigModel.set("site_name", "我的网站")
await SiteConfigModel.set("site_description", "一个优秀的网站")
await SiteConfigModel.set("maintenance_mode", "false")
// 获取单个配置项
const siteName = await SiteConfigModel.get("site_name")
// 返回: "我的网站"
// 批量获取配置项
const configs = await SiteConfigModel.getMany([
"site_name",
"site_description",
"maintenance_mode"
])
// 返回: { site_name: "我的网站", site_description: "一个优秀的网站", maintenance_mode: "false" }
// 获取所有配置
const allConfigs = await SiteConfigModel.getAll()
// 返回所有配置项的键值对对象
核心方法
单个配置操作
get(key)- 获取指定key的配置值set(key, value)- 设置配置项(有则更新,无则插入)
批量配置操作
getMany(keys)- 批量获取多个key的配置值getAll()- 获取所有配置项
配置管理策略
自动更新机制
// set方法会自动处理配置项的创建和更新
static async set(key, value) {
const exists = await db("site_config").where({ key }).first()
if (exists) {
// 如果配置项存在,则更新
await db("site_config").where({ key }).update({
value,
updated_at: db.fn.now()
})
} else {
// 如果配置项不存在,则创建
await db("site_config").insert({ key, value })
}
}
批量获取优化
// 批量获取时使用 whereIn 优化查询性能
static async getMany(keys) {
const rows = await db("site_config").whereIn("key", keys)
const result = {}
rows.forEach(row => {
result[row.key] = row.value
})
return result
}
配置值类型支持
支持多种配置值类型:
字符串配置
await SiteConfigModel.set("site_name", "我的网站")
await SiteConfigModel.set("contact_email", "admin@example.com")
布尔值配置
await SiteConfigModel.set("maintenance_mode", "false")
await SiteConfigModel.set("debug_mode", "true")
数字配置
await SiteConfigModel.set("max_upload_size", "10485760") // 10MB
await SiteConfigModel.set("session_timeout", "3600") // 1小时
JSON配置
await SiteConfigModel.set("social_links", JSON.stringify({
twitter: "https://twitter.com/example",
facebook: "https://facebook.com/example"
}))
使用场景
网站基本信息配置
// 设置网站基本信息
await SiteConfigModel.set("site_name", "我的博客")
await SiteConfigModel.set("site_description", "分享技术和生活")
await SiteConfigModel.set("site_keywords", "技术,博客,编程")
await SiteConfigModel.set("site_author", "张三")
功能开关配置
// 功能开关
await SiteConfigModel.set("enable_comments", "true")
await SiteConfigModel.set("enable_registration", "false")
await SiteConfigModel.set("enable_analytics", "true")
系统配置
// 系统配置
await SiteConfigModel.set("max_login_attempts", "5")
await SiteConfigModel.set("password_min_length", "8")
await SiteConfigModel.set("session_timeout", "3600")
第三方服务配置
// 第三方服务配置
await SiteConfigModel.set("google_analytics_id", "GA-XXXXXXXXX")
await SiteConfigModel.set("recaptcha_site_key", "6LcXXXXXXXX")
await SiteConfigModel.set("smtp_host", "smtp.gmail.com")
配置获取和缓存
基础获取
// 获取网站名称
const siteName = await SiteConfigModel.get("site_name") || "默认网站名称"
// 获取维护模式状态
const isMaintenance = await SiteConfigModel.get("maintenance_mode") === "true"
批量获取优化
// 一次性获取多个配置项,减少数据库查询
const configs = await SiteConfigModel.getMany([
"site_name",
"site_description",
"maintenance_mode"
])
// 使用配置
if (configs.maintenance_mode === "true") {
console.log("网站维护中")
} else {
console.log(`欢迎访问 ${configs.site_name}`)
}
错误处理
所有方法都包含适当的错误处理:
try {
const siteName = await SiteConfigModel.get("site_name")
if (!siteName) {
console.log("网站名称未配置,使用默认值")
return "默认网站名称"
}
return siteName
} catch (error) {
console.error("获取配置失败:", error.message)
return "默认网站名称"
}
性能优化
key字段已添加唯一索引,提高查询性能- 支持批量操作,减少数据库查询次数
- 建议在应用层实现配置缓存机制
迁移和种子
项目包含完整的数据库迁移和种子文件:
20250621013128_site_config.mjs- 创建site_config表20250621013324_site_config_seed.mjs- 示例配置数据
运行迁移和种子
# 运行迁移
npx knex migrate:latest
# 运行种子
npx knex seed:run
扩展建议
可以考虑添加以下功能:
- 配置项分类管理
- 配置项验证规则
- 配置变更历史记录
- 配置导入/导出功能
- 配置项权限控制
- 配置项版本管理
- 配置项依赖关系
- 配置项加密存储
最佳实践
- 配置项命名: 使用清晰的命名规范,如
feature_name或service_config - 配置值类型: 统一配置值的类型,如布尔值统一使用字符串 "true"/"false"
- 配置分组: 使用前缀对配置项进行分组,如
email_,social_,system_ - 默认值处理: 在应用层为配置项提供合理的默认值
- 配置验证: 在设置配置项时验证值的有效性
- 配置缓存: 实现配置缓存机制,减少数据库查询