feat(gateway): 更新数据库连接和模型
- 从 SQLite 切换到 MySQL 数据库 - 更新 Region 和 User 模型,增加字段和关联 - 添加数据库连接池配置 - 实现自动迁移表结构
This commit is contained in:
parent
2da6933e00
commit
2ef2f53ce6
5
.gitignore
vendored
5
.gitignore
vendored
@ -8,4 +8,7 @@ log/
|
||||
# 忽略 static 文件夹
|
||||
gateway/static/*
|
||||
# 如果需要保留 static 文件夹本身,可以添加以下规则
|
||||
!gateway/static/.gitkeep
|
||||
!gateway/static/.gitkeep
|
||||
*.zip
|
||||
gateway/main
|
||||
gateway/.env
|
||||
|
||||
53
gateway/config/database.go
Normal file
53
gateway/config/database.go
Normal 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
|
||||
}
|
||||
@ -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"
|
||||
]
|
||||
}
|
||||
@ -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
|
||||
|
||||
@ -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
50
gateway/init.sql
Normal 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, '黄陂');
|
||||
@ -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 引擎
|
||||
|
||||
@ -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"`
|
||||
}
|
||||
|
||||
@ -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"`
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user