| 155 | } |
| 156 | |
| 157 | func SearchUsers(keyword string, group string, startIdx int, num int) ([]*User, int64, error) { |
| 158 | var users []*User |
| 159 | var total int64 |
| 160 | var err error |
| 161 | |
| 162 | // 开始事务 |
| 163 | tx := DB.Begin() |
| 164 | if tx.Error != nil { |
| 165 | return nil, 0, tx.Error |
| 166 | } |
| 167 | defer func() { |
| 168 | if r := recover(); r != nil { |
| 169 | tx.Rollback() |
| 170 | } |
| 171 | }() |
| 172 | |
| 173 | // 构建基础查询 |
| 174 | query := tx.Unscoped().Model(&User{}) |
| 175 | |
| 176 | // 构建搜索条件 |
| 177 | likeCondition := "username LIKE ? OR email LIKE ? OR display_name LIKE ?" |
| 178 | |
| 179 | // 尝试将关键字转换为整数ID |
| 180 | keywordInt, err := strconv.Atoi(keyword) |
| 181 | if err == nil { |
| 182 | // 如果是数字,同时搜索ID和其他字段 |
| 183 | likeCondition = "id = ? OR " + likeCondition |
| 184 | if group != "" { |
| 185 | query = query.Where("("+likeCondition+") AND "+commonGroupCol+" = ?", |
| 186 | keywordInt, "%"+keyword+"%", "%"+keyword+"%", "%"+keyword+"%", group) |
| 187 | } else { |
| 188 | query = query.Where(likeCondition, |
| 189 | keywordInt, "%"+keyword+"%", "%"+keyword+"%", "%"+keyword+"%") |
| 190 | } |
| 191 | } else { |
| 192 | // 非数字关键字,只搜索字符串字段 |
| 193 | if group != "" { |
| 194 | query = query.Where("("+likeCondition+") AND "+commonGroupCol+" = ?", |
| 195 | "%"+keyword+"%", "%"+keyword+"%", "%"+keyword+"%", group) |
| 196 | } else { |
| 197 | query = query.Where(likeCondition, |
| 198 | "%"+keyword+"%", "%"+keyword+"%", "%"+keyword+"%") |
| 199 | } |
| 200 | } |
| 201 | |
| 202 | // 获取总数 |
| 203 | err = query.Count(&total).Error |
| 204 | if err != nil { |
| 205 | tx.Rollback() |
| 206 | return nil, 0, err |
| 207 | } |
| 208 | |
| 209 | // 获取分页数据 |
| 210 | err = query.Omit("password").Order("id desc").Limit(num).Offset(startIdx).Find(&users).Error |
| 211 | if err != nil { |
| 212 | tx.Rollback() |
| 213 | return nil, 0, err |
| 214 | } |