package models import ( "regexp" "strings" "time" ) // PlatformSiteSetting 平台官网站点设置表 yz_platform_site_setting(通用键值结构) // // 一行一个设置项:title 名称 / value 值 / tag 标签名 / remark 说明。 // 模板里用 {yz:tag} 即可输出对应 value,例如 tag=sitename → {yz:sitename}。 // 新增设置项只需在 PlatformSiteSettingDefs 里登记一条(或直接在表里插一行), // 无需再加表字段,因此该表对所有站点级设置通用。 type PlatformSiteSetting struct { ID uint64 `orm:"column(id);pk;auto" json:"id"` Title string `orm:"column(title);size(128);default('')" json:"title"` // 设置项名称 Value string `orm:"column(value);type(text);null" json:"value"` // 设置项的值 Tag string `orm:"column(tag);size(64);default('')" json:"tag"` // 标签名,模板中写作 {yz:tag} Remark string `orm:"column(remark);size(255);default('')" json:"remark"` // 备注/填写说明 CreateTime time.Time `orm:"column(create_time);type(datetime);auto_now_add;null" json:"create_time"` UpdateTime *time.Time `orm:"column(update_time);type(datetime);auto_now;null" json:"update_time"` DeleteTime *time.Time `orm:"column(delete_time);type(datetime);null" json:"delete_time"` } func (m *PlatformSiteSetting) TableName() string { return "yz_platform_site_setting" } // PlatformSiteSettingDef 站点设置项定义(顺序即 platform 端界面展示顺序) type PlatformSiteSettingDef struct { Tag string // 标签名,模板中 {yz:tag} Title string // 设置项名称 Remark string // 填写说明 } // PlatformSiteSettingDefs 站点设置项定义清单(仅作初始化种子,不限制可新增的设置项) // // 该表现在完全由数据驱动:直接在表里插一行即成为一个新设置项,无需改动任何代码: // - tag 即模板标签名,表里写了什么标签,模板就能用 {yz:tag} // - remark 支持可选标记,用 | 分隔,未识别的片段当作说明文字展示: // group:分组名 决定 platform 端界面落在哪个 tab(缺省归入「基本设置」) // type:控件类型 text(默认,单行输入) / textarea(多行) / image(图片上传) // 例:深色 Logo,用于浅色背景 | group:基本设置 | type:image var PlatformSiteSettingDefs = []PlatformSiteSettingDef{ // 基本设置 {Tag: "sitename", Title: "站点名称", Remark: "常用于 和页头 | group:基本设置"}, {Tag: "subtitle", Title: "副标题", Remark: "站点名称下方的补充说明,常用于页头/首页 | group:基本设置"}, {Tag: "logo", Title: "Logo(深色)", Remark: "深色 Logo,用于浅色背景(如页头) | group:基本设置 | type:image"}, {Tag: "logow", Title: "Logo(浅色)", Remark: "浅色 Logo,用于深色背景(如页脚) | group:基本设置 | type:image"}, // 公司信息 {Tag: "companyname", Title: "公司名称", Remark: "公司全称,常用于页脚与「关于我们」 | group:公司信息"}, {Tag: "phone", Title: "联系电话", Remark: "服务热线,常用于页头与页脚 | group:公司信息"}, {Tag: "email", Title: "电子邮箱", Remark: "商务合作邮箱,可配合 mailto: 使用 | group:公司信息"}, {Tag: "address", Title: "公司地址", Remark: "公司所在地址,展示于页脚/联系页面 | group:公司信息"}, {Tag: "worktime", Title: "工作时间", Remark: "如:工作日 9:00 - 18:00 | group:公司信息"}, // 备案信息 {Tag: "icp", Title: "ICP 备案号", Remark: "如:苏ICP备2026000000号-1,常用于页脚 | group:备案信息"}, {Tag: "policeicp", Title: "公安备案", Remark: "如:苏公网安备32010000000000号,常用于页脚 | group:备案信息"}, {Tag: "copyright", Title: "版权信息", Remark: "如:© 2026 公司名称 版权所有 | group:备案信息"}, // 政策条款 {Tag: "privacy", Title: "隐私政策", Remark: "隐私政策链接,如 /page/privacy | group:政策条款"}, {Tag: "terms", Title: "使用条款", Remark: "使用条款链接,如 /page/terms | group:政策条款"}, } // rePlatformSiteTag 标签名校验:与 tagengine 全局标签正则保持一致 var rePlatformSiteTag = regexp.MustCompile(`^[a-zA-Z_]\w*$`) // platformSiteSettingDef 按 tag 取定义;未登记时返回空定义 func platformSiteSettingDef(tag string) PlatformSiteSettingDef { for _, d := range PlatformSiteSettingDefs { if d.Tag == tag { return d } } return PlatformSiteSettingDef{Tag: tag, Title: tag, Remark: ""} } // GetPlatformSiteTagMap 返回 标签名 -> 值。 // 已登记的定义项必定出现在返回结果中(未配置时为 ""),保证调用方不会缺 key。 func GetPlatformSiteTagMap() map[string]string { out := make(map[string]string, len(PlatformSiteSettingDefs)) for _, d := range PlatformSiteSettingDefs { out[d.Tag] = "" } var rows []PlatformSiteSetting if _, err := Orm.QueryTable(new(PlatformSiteSetting)). Filter("delete_time__isnull", true). All(&rows); err != nil { return out } for _, r := range rows { if r.Tag != "" { out[r.Tag] = r.Value } } return out } // SavePlatformSiteSettings 按标签名批量写入设置项(tag -> value)。 // 已存在则更新 value,不存在则按定义插入;标签名非法的项直接忽略。 func SavePlatformSiteSettings(values map[string]string) error { now := time.Now() for tag, val := range values { tag = strings.TrimSpace(tag) if !rePlatformSiteTag.MatchString(tag) { continue } cnt, err := Orm.QueryTable(new(PlatformSiteSetting)). Filter("tag", tag). Filter("delete_time__isnull", true). Count() if err != nil { return err } if cnt == 0 { def := platformSiteSettingDef(tag) if _, err = Orm.Insert(&PlatformSiteSetting{ Title: def.Title, Tag: tag, Value: val, Remark: def.Remark, UpdateTime: &now, }); err != nil { return err } continue } if _, err = Orm.QueryTable(new(PlatformSiteSetting)). Filter("tag", tag). Filter("delete_time__isnull", true). Update(map[string]any{"value": val, "update_time": now}); err != nil { return err } } return nil } // GetPlatformSiteSettingRows 返回库中实际存在的设置行(不做默认值补齐) func GetPlatformSiteSettingRows() []PlatformSiteSetting { var rows []PlatformSiteSetting if _, err := Orm.QueryTable(new(PlatformSiteSetting)). Filter("delete_time__isnull", true). OrderBy("id"). All(&rows); err != nil { return nil } return rows }