94 lines
3.4 KiB
Go
94 lines
3.4 KiB
Go
package models
|
||
|
||
import (
|
||
"fmt"
|
||
"time"
|
||
|
||
"github.com/beego/beego/v2/client/orm"
|
||
|
||
beego "github.com/beego/beego/v2/server/web"
|
||
_ "github.com/go-sql-driver/mysql"
|
||
)
|
||
|
||
// User 用户模型
|
||
type User struct {
|
||
Id int `orm:"auto"`
|
||
TenantId int `orm:"column(tenant_id);default(0)" json:"tenant_id"`
|
||
Username string
|
||
Password string
|
||
Salt string
|
||
Email string
|
||
Avatar string
|
||
Nickname string
|
||
Status int `orm:"column(status);default(1)" json:"status"`
|
||
Role int `orm:"column(role);default(0)" json:"role"`
|
||
DepartmentId int `orm:"column(department_id);null;default(0)" json:"department_id"`
|
||
PositionId int `orm:"column(position_id);null;default(0)" json:"position_id"`
|
||
DeleteTime *time.Time `orm:"column(delete_time);null;type(datetime)" json:"delete_time"`
|
||
LastLoginTime *time.Time `orm:"column(last_login_time);null;type(datetime)" json:"last_login_time"`
|
||
LastLoginIp string `orm:"column(last_login_ip);null;size(50)" json:"last_login_ip"`
|
||
}
|
||
|
||
// TableName 设置表名,默认为yz_users
|
||
func (u *User) TableName() string {
|
||
return "yz_users"
|
||
}
|
||
|
||
// Init 初始化数据库(注册所有模型和连接数据库)
|
||
func Init(version string) {
|
||
orm.RegisterModel(new(User))
|
||
orm.RegisterModel(new(Menu))
|
||
orm.RegisterModel(new(ProgramCategory))
|
||
orm.RegisterModel(new(ProgramInfo))
|
||
orm.RegisterModel(new(FileInfo))
|
||
orm.RegisterModel(new(Knowledge))
|
||
orm.RegisterModel(new(KnowledgeCategory))
|
||
orm.RegisterModel(new(KnowledgeTag))
|
||
orm.RegisterModel(new(DictType))
|
||
orm.RegisterModel(new(DictItem))
|
||
|
||
ormConfig, err := beego.AppConfig.String("orm")
|
||
if err != nil {
|
||
panic("无法获取orm配置: " + err.Error())
|
||
}
|
||
|
||
if ormConfig == "mysql" {
|
||
user, err1 := beego.AppConfig.String("mysqluser")
|
||
pass, err2 := beego.AppConfig.String("mysqlpass")
|
||
urls, err3 := beego.AppConfig.String("mysqlurls")
|
||
dbName, err4 := beego.AppConfig.String("mysqldb")
|
||
if err1 != nil || err2 != nil || err3 != nil || err4 != nil {
|
||
panic("数据库配置错误")
|
||
}
|
||
|
||
// 构建连接字符串,添加连接池和性能优化参数
|
||
// Go MySQL驱动会自动通过连接池管理连接,不需要额外的reconnect参数
|
||
dsn := user + ":" + pass + "@tcp(" + urls + ")/" + dbName + "?charset=utf8mb4&parseTime=True&loc=Local&timeout=10s&readTimeout=30s&writeTimeout=30s"
|
||
fmt.Println("数据库连接字符串:", dsn)
|
||
|
||
// 注册数据库
|
||
err = orm.RegisterDataBase("default", "mysql", dsn)
|
||
if err != nil {
|
||
panic("数据库连接失败: " + err.Error())
|
||
}
|
||
|
||
// 配置数据库连接池(关键性能优化)
|
||
dbConn, err := orm.GetDB("default")
|
||
if err != nil {
|
||
panic("获取数据库连接失败: " + err.Error())
|
||
}
|
||
|
||
// 设置连接池参数
|
||
dbConn.SetMaxIdleConns(10) // 设置空闲连接池中连接的最大数量
|
||
dbConn.SetMaxOpenConns(100) // 设置打开数据库连接的最大数量
|
||
dbConn.SetConnMaxLifetime(30 * time.Minute) // 设置连接可复用的最大时间(30分钟,避免连接过期)
|
||
// 注意:SetConnMaxIdleTime 在 Go 1.15+ 和 database/sql 1.4+ 中可用
|
||
// 如果版本不支持,可以移除这一行
|
||
// dbConn.SetConnMaxIdleTime(10 * time.Minute) // 设置空闲连接的最大空闲时间
|
||
|
||
fmt.Println("数据库连接成功!")
|
||
fmt.Printf("当前项目版本: %s\n", version)
|
||
fmt.Println("数据库连接池配置: MaxIdleConns=10, MaxOpenConns=100, ConnMaxLifetime=1h")
|
||
}
|
||
}
|