更新代码
This commit is contained in:
@@ -155,135 +155,4 @@ func GetPlatformSiteSettingRows() []PlatformSiteSetting {
|
||||
return rows
|
||||
}
|
||||
|
||||
// EnsurePlatformSiteSettingDefaults 补齐已登记但未入库的设置项(缺失时插入空值行)
|
||||
// 注意:须用库中实际行判断,不能用 GetPlatformSiteTagMap —— 它预置了所有默认 tag 的 key,
|
||||
// 会导致「已存在」判断永远成立、一行都插不进去。
|
||||
func EnsurePlatformSiteSettingDefaults() {
|
||||
exist := map[string]bool{}
|
||||
for _, r := range GetPlatformSiteSettingRows() {
|
||||
if r.Tag != "" {
|
||||
exist[r.Tag] = true
|
||||
}
|
||||
}
|
||||
|
||||
now := time.Now()
|
||||
for _, d := range PlatformSiteSettingDefs {
|
||||
if exist[d.Tag] {
|
||||
continue
|
||||
}
|
||||
if _, err := Orm.Insert(&PlatformSiteSetting{
|
||||
Title: d.Title,
|
||||
Tag: d.Tag,
|
||||
Value: "",
|
||||
Remark: d.Remark,
|
||||
UpdateTime: &now,
|
||||
}); err != nil {
|
||||
continue
|
||||
}
|
||||
exist[d.Tag] = true
|
||||
}
|
||||
}
|
||||
|
||||
// EnsurePlatformSiteSettingTable 建表(通用键值结构,CREATE TABLE IF NOT EXISTS,可重复执行)。
|
||||
// 若检测到旧宽表结构(含 logo_dark 列),先把历史数据迁移为键值行,再补齐默认项。
|
||||
func EnsurePlatformSiteSettingTable() {
|
||||
table := new(PlatformSiteSetting).TableName()
|
||||
sql := `CREATE TABLE IF NOT EXISTS ` + table + ` (
|
||||
id bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增主键ID',
|
||||
title varchar(128) NOT NULL DEFAULT '' COMMENT '设置项名称',
|
||||
value text COMMENT '设置项的值',
|
||||
tag varchar(64) NOT NULL DEFAULT '' COMMENT '标签名,模板中写作 {yz:tag}',
|
||||
remark varchar(255) NOT NULL DEFAULT '' COMMENT '备注/填写说明',
|
||||
create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
update_time datetime DEFAULT NULL COMMENT '更新时间',
|
||||
delete_time datetime DEFAULT NULL COMMENT '删除时间(软删除)',
|
||||
PRIMARY KEY (id),
|
||||
UNIQUE KEY uk_tag (tag, delete_time),
|
||||
KEY idx_delete_time (delete_time)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='平台官网站点设置表(通用键值结构)'`
|
||||
if _, err := Orm.Raw(sql).Exec(); err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
// 旧宽表升级场景:CREATE TABLE IF NOT EXISTS 不会改已有表,需补齐通用结构列
|
||||
ensurePlatformSiteSettingColumns(table)
|
||||
|
||||
if hasTableColumn(table, "logo_dark") {
|
||||
migrateLegacyPlatformSiteSetting(table)
|
||||
}
|
||||
EnsurePlatformSiteSettingDefaults()
|
||||
}
|
||||
|
||||
// ensurePlatformSiteSettingColumns 补齐通用结构列(列缺失时新增,已存在则忽略)
|
||||
func ensurePlatformSiteSettingColumns(table string) {
|
||||
cols := []struct{ name, def string }{
|
||||
{"title", "varchar(128) NOT NULL DEFAULT '' COMMENT '设置项名称'"},
|
||||
{"value", "text COMMENT '设置项的值'"},
|
||||
{"tag", "varchar(64) NOT NULL DEFAULT '' COMMENT '标签名,模板中写作 {yz:tag}'"},
|
||||
{"remark", "varchar(255) NOT NULL DEFAULT '' COMMENT '备注/填写说明'"},
|
||||
}
|
||||
for _, c := range cols {
|
||||
if hasTableColumn(table, c.name) {
|
||||
continue
|
||||
}
|
||||
_, _ = Orm.Raw("ALTER TABLE " + table + " ADD COLUMN " + c.def).Exec()
|
||||
}
|
||||
}
|
||||
|
||||
// hasTableColumn 判断表是否存在指定列(表不存在或查询异常时返回 false)
|
||||
func hasTableColumn(table, column string) bool {
|
||||
var cnt int64
|
||||
err := Orm.Raw(
|
||||
"SELECT COUNT(1) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? AND COLUMN_NAME = ?",
|
||||
table, column,
|
||||
).QueryRow(&cnt)
|
||||
return err == nil && cnt > 0
|
||||
}
|
||||
|
||||
// migrateLegacyPlatformSiteSetting 旧宽表结构迁移:
|
||||
// 旧列为 sitename/logo_dark/logo_light/icp/police_icp/copyright/privacy_policy/terms_of_service,
|
||||
// 迁移时仅在目标标签行为空的情况下写入,避免覆盖新配置。
|
||||
func migrateLegacyPlatformSiteSetting(table string) {
|
||||
type legacyRow struct {
|
||||
Sitename string
|
||||
LogoDark string
|
||||
LogoLight string
|
||||
Icp string
|
||||
PoliceIcp string
|
||||
Copyright string
|
||||
Privacy string
|
||||
Terms string
|
||||
Companyname string
|
||||
}
|
||||
var rows []legacyRow
|
||||
if _, err := Orm.Raw(
|
||||
"SELECT IFNULL(sitename,'') sitename, IFNULL(logo_dark,'') logo_dark, IFNULL(logo_light,'') logo_light," +
|
||||
" IFNULL(icp,'') icp, IFNULL(police_icp,'') police_icp, IFNULL(copyright,'') copyright," +
|
||||
" IFNULL(privacy_policy,'') privacy_policy, IFNULL(terms_of_service,'') terms_of_service" +
|
||||
" FROM " + table + " WHERE delete_time IS NULL ORDER BY id LIMIT 1").QueryRows(&rows); err != nil {
|
||||
return
|
||||
}
|
||||
if len(rows) == 0 {
|
||||
return
|
||||
}
|
||||
|
||||
old := rows[0]
|
||||
current := GetPlatformSiteTagMap()
|
||||
pending := map[string]string{
|
||||
"sitename": old.Sitename,
|
||||
"logo": old.LogoDark,
|
||||
"logow": old.LogoLight,
|
||||
"icp": old.Icp,
|
||||
"policeicp": old.PoliceIcp,
|
||||
"copyright": old.Copyright,
|
||||
"privacy": old.Privacy,
|
||||
"terms": old.Terms,
|
||||
}
|
||||
for tag, val := range pending {
|
||||
if val == "" || strings.TrimSpace(current[tag]) != "" {
|
||||
continue
|
||||
}
|
||||
current[tag] = val
|
||||
}
|
||||
_ = SavePlatformSiteSettings(pending)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user