Files
wangjia 40760aa884
ci / server (push) Failing after 14s
ci / design-tokens (push) Failing after 11s
dudu MVP:五端语音输入法初始提交
- server:Go 网关(WS 流式识别中继/计费配额/微信登录支付 mock/反馈/埋点),gummy provider 已真实联调
- desktop:Tauri 2(全局快捷键 push-to-talk/浮层/托盘/设置/登录购买/反馈/首启引导)
- android:Compose 主 App + IME(键盘内录音直传)
- ios:App + 键盘扩展(1A spike 实证键盘内不可录音,走 deep link 听写)
- design/design-pipeline:设计系统 + token 导出 iOS/Android 主题
- doc:前后端设计文档(HTML);web:官网宣传页;todo:任务看板

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-12 00:38:37 +08:00

42 lines
1.3 KiB
Go

package store
import (
"gorm.io/driver/postgres"
"gorm.io/gorm"
"gorm.io/gorm/logger"
)
// Open 连接 PostgreSQL 并自动迁移全部表。
func Open(dsn string) (*gorm.DB, error) {
db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{
Logger: logger.Default.LogMode(logger.Warn),
})
if err != nil {
return nil, err
}
if err := db.AutoMigrate(AllModels()...); err != nil {
return nil, err
}
// 打点原始表用 BRIN(时间局部性强、体积小),PG 专属语法
if err := db.Exec(`CREATE INDEX IF NOT EXISTS idx_metric_events_received_at
ON metric_events USING brin (received_at)`).Error; err != nil {
return nil, err
}
return db, SeedPacks(db)
}
// SeedPacks 初始化三档时长包(已存在则跳过;价格可后续在库内调整)。
func SeedPacks(db *gorm.DB) error {
packs := []DurationPack{
{ID: "pack_100", Minutes: 100, PriceCents: 900, UnitDesc: "约 ¥0.09 / 分钟", Tag: "", Sort: 1, Active: true},
{ID: "pack_500", Minutes: 500, PriceCents: 3900, UnitDesc: "约 ¥0.078 / 分钟", Tag: "省 13%", Sort: 2, Active: true},
{ID: "pack_2000", Minutes: 2000, PriceCents: 12900, UnitDesc: "约 ¥0.065 / 分钟", Tag: "省 28%", Sort: 3, Active: true},
}
for _, p := range packs {
if err := db.Where(DurationPack{ID: p.ID}).FirstOrCreate(&p).Error; err != nil {
return err
}
}
return nil
}