package database import ( "errors" "fmt" "go-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 }