From 2ef2f53ce6cc17a9602ad26410989dff508e5bfe Mon Sep 17 00:00:00 2001 From: jdysya <1912377458@qq.com> Date: Sun, 16 Feb 2025 23:49:27 +0800 Subject: [PATCH] =?UTF-8?q?feat(gateway):=20=E6=9B=B4=E6=96=B0=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=BA=93=E8=BF=9E=E6=8E=A5=E5=92=8C=E6=A8=A1=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 从 SQLite 切换到 MySQL 数据库 - 更新 Region 和 User 模型,增加字段和关联 - 添加数据库连接池配置 - 实现自动迁移表结构 --- .gitignore | 5 ++- gateway/config/database.go | 53 ++++++++++++++++++++++ gateway/config/urls.json | 92 +++++++++++++++++++------------------- gateway/go.mod | 5 ++- gateway/go.sum | 5 ++- gateway/init.sql | 50 +++++++++++++++++++++ gateway/main.go | 17 +++++-- gateway/models/region.go | 5 ++- gateway/models/user.go | 10 ++--- 9 files changed, 182 insertions(+), 60 deletions(-) create mode 100644 gateway/config/database.go create mode 100644 gateway/init.sql diff --git a/.gitignore b/.gitignore index fc72330..8f62cf4 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,7 @@ log/ # 忽略 static 文件夹 gateway/static/* # 如果需要保留 static 文件夹本身,可以添加以下规则 -!gateway/static/.gitkeep \ No newline at end of file +!gateway/static/.gitkeep +*.zip +gateway/main +gateway/.env diff --git a/gateway/config/database.go b/gateway/config/database.go new file mode 100644 index 0000000..9355627 --- /dev/null +++ b/gateway/config/database.go @@ -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 +} diff --git a/gateway/config/urls.json b/gateway/config/urls.json index 12787d8..44abfa4 100644 --- a/gateway/config/urls.json +++ b/gateway/config/urls.json @@ -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" ] } \ No newline at end of file diff --git a/gateway/go.mod b/gateway/go.mod index 9d9fbf6..5ed56e7 100644 --- a/gateway/go.mod +++ b/gateway/go.mod @@ -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 diff --git a/gateway/go.sum b/gateway/go.sum index 99d5003..6a5995b 100644 --- a/gateway/go.sum +++ b/gateway/go.sum @@ -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= diff --git a/gateway/init.sql b/gateway/init.sql new file mode 100644 index 0000000..120fcd0 --- /dev/null +++ b/gateway/init.sql @@ -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, '黄陂'); diff --git a/gateway/main.go b/gateway/main.go index 831fee2..069d823 100644 --- a/gateway/main.go +++ b/gateway/main.go @@ -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 引擎 diff --git a/gateway/models/region.go b/gateway/models/region.go index b9c8a07..e3e51b5 100644 --- a/gateway/models/region.go +++ b/gateway/models/region.go @@ -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"` } diff --git a/gateway/models/user.go b/gateway/models/user.go index b1e3ce0..0af3c0b 100644 --- a/gateway/models/user.go +++ b/gateway/models/user.go @@ -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"` }