用户管理增加用户名搜索

This commit is contained in:
mtvpls
2026-05-15 12:06:34 +08:00
parent ae3a054e56
commit 09fc63c116
6 changed files with 268 additions and 80 deletions
+45 -17
View File
@@ -563,7 +563,8 @@ export class PostgresStorage implements IStorage {
async getUserListV2(
offset = 0,
limit = 20,
ownerUsername?: string
ownerUsername?: string,
search?: string
): Promise<{
users: Array<{
username: string;
@@ -577,10 +578,16 @@ export class PostgresStorage implements IStorage {
total: number;
}> {
try {
const trimmedSearch = search?.trim() || '';
const searchPattern = `%${trimmedSearch}%`;
// 获取总数
const countResult = await this.db
.prepare('SELECT COUNT(*) as total FROM users')
.first();
const countQuery = trimmedSearch
? this.db
.prepare('SELECT COUNT(*) as total FROM users WHERE username LIKE $1')
.bind(searchPattern)
: this.db.prepare('SELECT COUNT(*) as total FROM users');
const countResult = await countQuery.first();
let total = (countResult?.total as number) || 0;
// 检查站长是否在数据库中
@@ -590,8 +597,11 @@ export class PostgresStorage implements IStorage {
ownerInfo = await this.getUserInfoV2(ownerUsername);
ownerInDatabase = !!ownerInfo && ownerInfo.created_at !== 0;
// 如果站长不在数据库中,总数+1
if (!ownerInDatabase) {
// 如果站长不在数据库中且匹配搜索条件,总数+1
if (
!ownerInDatabase &&
(!trimmedSearch || ownerUsername.includes(trimmedSearch))
) {
total += 1;
}
}
@@ -600,7 +610,11 @@ export class PostgresStorage implements IStorage {
let actualOffset = offset;
let actualLimit = limit;
if (ownerUsername && !ownerInDatabase) {
if (
ownerUsername &&
!ownerInDatabase &&
(!trimmedSearch || ownerUsername.includes(trimmedSearch))
) {
if (offset === 0) {
// 第一页:只获取 limit-1 个用户,为站长留出位置
actualLimit = limit - 1;
@@ -611,20 +625,34 @@ export class PostgresStorage implements IStorage {
}
// 获取用户列表(按创建时间降序)
const result = await this.db
.prepare(`
SELECT username, role, banned, tags, oidc_sub, enabled_apis, created_at
FROM users
ORDER BY created_at DESC
LIMIT $1 OFFSET $2
`)
.bind(actualLimit, actualOffset)
.all();
const listQuery = trimmedSearch
? this.db
.prepare(`
SELECT username, role, banned, tags, oidc_sub, enabled_apis, created_at
FROM users
WHERE username LIKE $1
ORDER BY created_at DESC
LIMIT $2 OFFSET $3
`)
.bind(searchPattern, actualLimit, actualOffset)
: this.db
.prepare(`
SELECT username, role, banned, tags, oidc_sub, enabled_apis, created_at
FROM users
ORDER BY created_at DESC
LIMIT $1 OFFSET $2
`)
.bind(actualLimit, actualOffset);
const result = await listQuery.all();
const users = [];
// 如果有站长且在第一页,确保站长始终在第一位
if (ownerUsername && offset === 0) {
if (
ownerUsername &&
offset === 0 &&
(!trimmedSearch || ownerUsername.includes(trimmedSearch))
) {
users.push({
username: ownerUsername,
role: 'owner' as const,