yunzer_go/server/models/user.go

122 lines
4.1 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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"`
}
// GetUserById 根据ID获取用户信息
func GetUserById(id int) (*User, error) {
o := orm.NewOrm()
user := &User{Id: id}
err := o.Read(user)
if err != nil {
return nil, err
}
return user, nil
}
// 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))
orm.RegisterModel(new(OperationLog))
orm.RegisterModel(new(AccessLog))
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")
// 自动创建或更新表结构
o := orm.NewOrm()
_, err = o.Raw("SET FOREIGN_KEY_CHECKS=0").Exec()
if err != nil {
fmt.Println("关闭外键检查失败:", err)
}
if err := orm.RunSyncdb("default", false, true); err != nil {
fmt.Println("数据库表同步失败:", err)
}
_, err = o.Raw("SET FOREIGN_KEY_CHECKS=1").Exec()
if err != nil {
fmt.Println("启用外键检查失败:", err)
}
fmt.Println("数据库表自动同步完成")
}
}