feat(gateway): 更新数据库连接和模型

- 从 SQLite 切换到 MySQL 数据库
- 更新 Region 和 User 模型,增加字段和关联
- 添加数据库连接池配置
- 实现自动迁移表结构
This commit is contained in:
高手 2025-02-16 23:49:27 +08:00
parent 2da6933e00
commit 2ef2f53ce6
9 changed files with 182 additions and 60 deletions

5
.gitignore vendored
View File

@ -8,4 +8,7 @@ log/
# 忽略 static 文件夹
gateway/static/*
# 如果需要保留 static 文件夹本身,可以添加以下规则
!gateway/static/.gitkeep
!gateway/static/.gitkeep
*.zip
gateway/main
gateway/.env

View File

@ -0,0 +1,53 @@
package config
import (
"fmt"
"gateway/utils"
"os"
"github.com/joho/godotenv"
)
func init() {
// 加载 .env 文件
if err := godotenv.Load(); err != nil {
utils.Logger.Warnf("未找到 .env 文件: %v", err)
}
}
// DBConfig 数据库配置结构
type DBConfig struct {
Host string
Port string
User string
Password string
DBName string
}
// GetDBConfig 获取数据库配置
func GetDBConfig() *DBConfig {
// 确保已加载环境变量
godotenv.Load()
return &DBConfig{
Host: getEnvOrDefault("DB_HOST", "localhost"),
Port: getEnvOrDefault("DB_PORT", "3306"),
User: getEnvOrDefault("DB_USER", "root"),
Password: getEnvOrDefault("DB_PASSWORD", "password"),
DBName: getEnvOrDefault("DB_NAME", "family"),
}
}
// GetDSN 获取数据库连接字符串
func (c *DBConfig) GetDSN() string {
return fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local",
c.User, c.Password, c.Host, c.Port, c.DBName)
}
// getEnvOrDefault 获取环境变量,如果不存在则返回默认值
func getEnvOrDefault(key, defaultValue string) string {
if value := os.Getenv(key); value != "" {
return value
}
return defaultValue
}

View File

@ -1,50 +1,50 @@
{
"urls": [
"/assets/index.html-6M4WaJGn.js",
"/assets/10.html-Cox3wLdF.js",
"/assets/index.html-iJcgfwSj.js",
"/assets/intro.html-QyfAbIVc.js",
"/assets/relation.html-Dqaw_w5f.js",
"/assets/simple.html-gWbsxbST.js",
"/assets/tomb.html-PQqy8bGV.js",
"/assets/address.html-CNNc9o0U.js",
"/assets/branch_list.html-vb7nrwTF.js",
"/assets/build_draft.html-AXYMqBRq.js",
"/assets/catalogue.html-FX5AkOsY.js",
"/assets/ink_presequence.html-BYSWwNUl.js",
"/assets/intro.html-BmWXutnI.js",
"/assets/origin_narrate.html-qihX0gD2.js",
"/assets/index.html-DTsg6_Mb.js",
"/assets/thank_support.html-Bec3hAfD.js",
"/assets/third_intro.html-DCYwR1dS.js",
"/assets/third_renew_record.html-Bw0dPE0f.js",
"/assets/whole_intro.html-Dxm36Rz4.js",
"/assets/yu_ink_intro.html-8081fdp9.js",
"/assets/余氏创修名目.html-UBd1EHMQ.js",
"/assets/续修宗谱序.html-CC03qlYI.js",
"/assets/西分祖一公总序.html-IqyDmuhg.js",
"/assets/长塘湾支祖序.html-D138eKRX.js",
"/assets/10.html-9er2Kamf.js",
"/assets/address.html-DGl_p7BY.js",
"/assets/banqiao_tomb_record.html-ZndFRXyq.js",
"/assets/catalogue.html-C390bTAm.js",
"/assets/hongshun_record.html-DPlvV_FX.js",
"/assets/intro.html-D09epTqh.js",
"/assets/jiangxi-find-origin.html-DYa2pI1G.js",
"/assets/meeting-record.html-DwOgR3Y5.js",
"/assets/proposal.html-B0yl1179.js",
"/assets/qitou_build_tomb_record.html-w1QQPg58.js",
"/assets/index.html-B8MyB7Nx.js",
"/assets/rebuild-origin-tomb.html-D6GwIgqw.js",
"/assets/rebuild-temple.html-yg6_cE67.js",
"/assets/rebuild.html-Bksfc_AQ.js",
"/assets/renew_family_disciplines.html-C6HeQ_LO.js",
"/assets/rule.html-C6rqyb74.js",
"/assets/simple.html-Co37wF1v.js",
"/assets/thank_support.html-Cb7EtcXi.js",
"/assets/the_fourth_postscript.html-S4JLTXyo.js",
"/assets/the_fourth_public.html-CNkGkbSJ.js",
"/assets/tianjue-intro.html-D1lSLpRz.js",
"/assets/404.html-CDvZn73T.js"
"/assets/index.html-rWbrTsW1.js",
"/assets/10.html-B6Yd19k9.js",
"/assets/index.html-WCKvPyz9.js",
"/assets/intro.html-Byybdte1.js",
"/assets/relation.html-B5Mcp1gT.js",
"/assets/simple.html-d6UcuDNA.js",
"/assets/tomb.html-CevydxGm.js",
"/assets/address.html-D9vmG-ck.js",
"/assets/branch_list.html-wN3cMBoB.js",
"/assets/build_draft.html-CHC2HH_6.js",
"/assets/catalogue.html-BbvbwiEL.js",
"/assets/ink_presequence.html-g-KC4vCl.js",
"/assets/intro.html-BtW2-ZhE.js",
"/assets/origin_narrate.html-C8bapmwb.js",
"/assets/index.html-vfqqxvAi.js",
"/assets/thank_support.html-kstF6qWa.js",
"/assets/third_intro.html-E0ZtCUrY.js",
"/assets/third_renew_record.html-CUA3hA0N.js",
"/assets/whole_intro.html-vpSkhTct.js",
"/assets/yu_ink_intro.html-CJnofa8o.js",
"/assets/余氏创修名目.html-7WuJwhWR.js",
"/assets/续修宗谱序.html-CIYwNc-E.js",
"/assets/西分祖一公总序.html-D3LbLNG_.js",
"/assets/长塘湾支祖序.html-DOOS_xNG.js",
"/assets/10.html-buKUccsF.js",
"/assets/address.html-mmIGRKus.js",
"/assets/banqiao_tomb_record.html-BWCk5ixF.js",
"/assets/catalogue.html-CE9WBEpv.js",
"/assets/hongshun_record.html-CsZCQf3Z.js",
"/assets/intro.html-AUOrGLCT.js",
"/assets/jiangxi-find-origin.html-Bv2ggIS3.js",
"/assets/meeting-record.html-BgCVyTin.js",
"/assets/proposal.html-DHraz5Wn.js",
"/assets/qitou_build_tomb_record.html-9UTsr97F.js",
"/assets/index.html-bW2eiwLA.js",
"/assets/rebuild-origin-tomb.html-DiHfU90S.js",
"/assets/rebuild-temple.html-CDwYzfxi.js",
"/assets/rebuild.html-BRp7eLm7.js",
"/assets/renew_family_disciplines.html-DN5c3sTt.js",
"/assets/rule.html-Cw_y4GWI.js",
"/assets/simple.html-COz2rN-k.js",
"/assets/thank_support.html-CROJCN11.js",
"/assets/the_fourth_postscript.html-ELaskkQ6.js",
"/assets/the_fourth_public.html-B5JDCkXw.js",
"/assets/tianjue-intro.html-Dc5Hc9wW.js",
"/assets/404.html-BsF9LfuT.js"
]
}

View File

@ -5,9 +5,12 @@ go 1.23.3
require (
github.com/gin-contrib/sessions v1.0.2
github.com/gin-gonic/gin v1.10.0
github.com/go-sql-driver/mysql v1.7.1
github.com/jinzhu/gorm v1.9.16
github.com/joho/godotenv v1.5.1
github.com/sirupsen/logrus v1.9.3
golang.org/x/crypto v0.31.0
golang.org/x/net v0.33.0
)
require (
@ -29,14 +32,12 @@ require (
github.com/klauspost/cpuid/v2 v2.2.7 // indirect
github.com/leodido/go-urn v1.4.0 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/mattn/go-sqlite3 v1.14.16 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/pelletier/go-toml/v2 v2.2.2 // indirect
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
github.com/ugorji/go/codec v1.2.12 // indirect
golang.org/x/arch v0.8.0 // indirect
golang.org/x/net v0.33.0 // indirect
golang.org/x/sys v0.28.0 // indirect
golang.org/x/text v0.21.0 // indirect
google.golang.org/protobuf v1.34.1 // indirect

View File

@ -31,8 +31,9 @@ github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJn
github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
github.com/go-playground/validator/v10 v10.20.0 h1:K9ISHbSaI0lyB2eWMPJo+kOS/FBExVwjEviJTixqxL8=
github.com/go-playground/validator/v10 v10.20.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM=
github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs=
github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=
github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe h1:lXe2qZdvpiX5WZkZR4hgp4KJVfY3nMkvmwbVkpv1rVY=
@ -55,6 +56,8 @@ github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkr
github.com/jinzhu/now v1.0.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=
github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=

50
gateway/init.sql Normal file
View File

@ -0,0 +1,50 @@
-- 删除现有表(如果存在)
DROP TABLE IF EXISTS users;
DROP TABLE IF EXISTS regions;
CREATE DATABASE IF NOT EXISTS family CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE family;
-- 确保表使用 utf8mb4 字符集
ALTER DATABASE family CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 设置默认字符集
SET NAMES utf8mb4;
-- 创建 regions 表
CREATE TABLE IF NOT EXISTS regions (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL UNIQUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
deleted_at TIMESTAMP NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- 创建 users 表
CREATE TABLE IF NOT EXISTS users (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
full_name VARCHAR(100) NOT NULL,
region_id BIGINT UNSIGNED NOT NULL,
mobile VARCHAR(20) NOT NULL UNIQUE,
password VARCHAR(100) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
deleted_at TIMESTAMP NULL,
CONSTRAINT fk_users_region FOREIGN KEY (region_id) REFERENCES regions(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- 插入数据 regions 表
INSERT INTO regions (id, name) VALUES (1, '余北山');
INSERT INTO regions (id, name) VALUES (2, '余冲');
INSERT INTO regions (id, name) VALUES (3, '双庙关');
INSERT INTO regions (id, name) VALUES (4, '锡房湾');
INSERT INTO regions (id, name) VALUES (5, '长塘湾');
INSERT INTO regions (id, name) VALUES (6, '大塘湾');
INSERT INTO regions (id, name) VALUES (7, '板桥湾');
INSERT INTO regions (id, name) VALUES (8, '齐头山');
INSERT INTO regions (id, name) VALUES (9, '江西');
INSERT INTO regions (id, name) VALUES (10, '木厂河');
INSERT INTO regions (id, name) VALUES (11, '团风');
INSERT INTO regions (id, name) VALUES (12, '黄陂');

View File

@ -7,11 +7,12 @@ import (
"gateway/models"
"gateway/utils"
"path/filepath"
"time"
"github.com/gin-contrib/sessions"
"github.com/gin-gonic/gin"
_ "github.com/go-sql-driver/mysql"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/sqlite"
)
func main() {
@ -32,12 +33,22 @@ func main() {
utils.Logger.Info("成功提取并保存URLs")
// 初始化数据库
db, err := gorm.Open("sqlite3", "family.db")
// 获取数据库配置
dbConfig := config.GetDBConfig()
// 使用配置连接数据库
db, err := gorm.Open("mysql", dbConfig.GetDSN())
if err != nil {
utils.Logger.Fatalf("数据库连接失败: %v", err)
}
defer db.Close()
// 设置数据库连接池参数
db.DB().SetMaxIdleConns(10)
db.DB().SetMaxOpenConns(100)
db.DB().SetConnMaxLifetime(time.Hour)
// 自动迁移表结构
db.AutoMigrate(&models.Region{}, &models.User{})
// 初始化 Gin 引擎

View File

@ -1,6 +1,7 @@
package models
type Region struct {
ID uint `gorm:"primary_key"`
Name string `gorm:"not null;unique"`
ID uint `gorm:"primary_key;AUTO_INCREMENT"`
Name string `gorm:"type:varchar(100);not null;unique"`
Users []User `gorm:"foreignkey:RegionID"`
}

View File

@ -6,9 +6,9 @@ import (
type User struct {
gorm.Model
FullName string `gorm:"not null"`
RegionID uint `gorm:"not null"`
Mobile string `gorm:"unique;not null"`
Password string `gorm:"not null"`
Region Region
FullName string `gorm:"type:varchar(100);not null"`
RegionID uint `gorm:"not null;index"`
Mobile string `gorm:"type:varchar(20);unique;not null"`
Password string `gorm:"type:varchar(100);not null"`
Region Region `gorm:"foreignkey:RegionID;association_foreignkey:ID"`
}