139 lines
3.1 KiB
Go
139 lines
3.1 KiB
Go
package database
|
||
|
||
import (
|
||
"errors"
|
||
"fmt"
|
||
"u-desk/internal/model"
|
||
"time"
|
||
|
||
mysqldriver "github.com/go-sql-driver/mysql"
|
||
"gorm.io/driver/mysql"
|
||
"gorm.io/gorm"
|
||
"gorm.io/gorm/logger"
|
||
)
|
||
|
||
var (
|
||
ErrNotConnected = errors.New("数据库未连接")
|
||
)
|
||
|
||
// DB 数据库连接封装
|
||
type DB struct {
|
||
db *gorm.DB
|
||
}
|
||
|
||
var globalDB *DB
|
||
|
||
// Init 初始化数据库连接
|
||
func Init() (*DB, error) {
|
||
if globalDB != nil {
|
||
return globalDB, nil
|
||
}
|
||
|
||
// 数据库配置 - 测试服 lab_dev
|
||
// 测试机外网IP: 39.99.243.191
|
||
// 使用 mysqldriver.Config 结构体构建 DSN,自动处理密码中的特殊字符
|
||
config := mysqldriver.Config{
|
||
User: "root",
|
||
Passwd: "123456",
|
||
Net: "tcp",
|
||
Addr: "127.0.0.1:3306",
|
||
DBName: "lab_dev",
|
||
Params: map[string]string{"charset": "utf8mb4", "parseTime": "True", "loc": "Local"},
|
||
AllowNativePasswords: true,
|
||
}
|
||
dsn := config.FormatDSN()
|
||
|
||
// GORM 配置
|
||
gormConfig := &gorm.Config{
|
||
Logger: logger.Default.LogMode(logger.Info),
|
||
}
|
||
|
||
db, err := gorm.Open(mysql.Open(dsn), gormConfig)
|
||
if err != nil {
|
||
return nil, fmt.Errorf("打开数据库连接失败: %v", err)
|
||
}
|
||
|
||
// 获取底层 sql.DB 设置连接池参数
|
||
sqlDB, err := db.DB()
|
||
if err != nil {
|
||
return nil, fmt.Errorf("获取数据库实例失败: %v", err)
|
||
}
|
||
|
||
// 测试连接
|
||
if err := sqlDB.Ping(); err != nil {
|
||
return nil, fmt.Errorf("数据库连接测试失败: %v", err)
|
||
}
|
||
|
||
// 设置连接池参数
|
||
sqlDB.SetMaxOpenConns(25)
|
||
sqlDB.SetMaxIdleConns(5)
|
||
sqlDB.SetConnMaxLifetime(time.Duration(300) * time.Second)
|
||
|
||
globalDB = &DB{db: db}
|
||
return globalDB, nil
|
||
}
|
||
|
||
// QueryUsers 查询用户列表
|
||
func (d *DB) QueryUsers(keyword string, status int, role int, organid int, page int, pageSize int, sortField string, sortOrder string) (map[string]interface{}, error) {
|
||
if d.db == nil {
|
||
return nil, ErrNotConnected
|
||
}
|
||
|
||
query := d.db.Model(&model.MemberInfo{})
|
||
|
||
// 关键字搜索(姓名、账号、电话)
|
||
if keyword != "" {
|
||
query = query.Where("membername LIKE ? OR account LIKE ? OR contactphone LIKE ?",
|
||
"%"+keyword+"%", "%"+keyword+"%", "%"+keyword+"%")
|
||
}
|
||
|
||
// 状态筛选
|
||
if status > 0 {
|
||
query = query.Where("status = ?", status)
|
||
} else {
|
||
// 默认过滤删除状态
|
||
query = query.Where("status != ?", 3)
|
||
}
|
||
|
||
// 角色筛选(需要关联查询,暂时简化)
|
||
if role > 0 {
|
||
// TODO: 关联 sys_member_role 表查询
|
||
}
|
||
|
||
// 机构筛选
|
||
if organid > 0 {
|
||
query = query.Where("organid = ?", organid)
|
||
}
|
||
|
||
// 排序
|
||
if sortField != "" {
|
||
if sortOrder == "descend" || sortOrder == "desc" {
|
||
query = query.Order(sortField + " DESC")
|
||
} else {
|
||
query = query.Order(sortField + " ASC")
|
||
}
|
||
} else {
|
||
// 默认按创建时间倒序
|
||
query = query.Order("createtime DESC")
|
||
}
|
||
|
||
// 总数
|
||
var total int64
|
||
query.Count(&total)
|
||
|
||
// 分页
|
||
offset := (page - 1) * pageSize
|
||
var users []model.MemberInfo
|
||
if err := query.Offset(offset).Limit(pageSize).Find(&users).Error; err != nil {
|
||
return nil, fmt.Errorf("查询用户失败: %v", err)
|
||
}
|
||
|
||
// 返回结果
|
||
result := map[string]interface{}{
|
||
"rows": users,
|
||
"total": total,
|
||
}
|
||
|
||
return result, nil
|
||
}
|