From 7786f416f85d2e5a7762d01568d43f1a7b1358c8 Mon Sep 17 00:00:00 2001 From: ryan Date: Sat, 29 Aug 2026 11:54:46 +0800 Subject: [PATCH] perf(auth): eliminate redundant password queries during user info retrieval --- .../migrations/postgres/00001_initial.sql | 44 +++++++++++++++++++ .../admin/migrations/sqlite/00001_initial.sql | 44 +++++++++++++++++++ backend/plugins/domain/auth/repository.go | 31 ++----------- 3 files changed, 92 insertions(+), 27 deletions(-) diff --git a/backend/plugins/domain/admin/migrations/postgres/00001_initial.sql b/backend/plugins/domain/admin/migrations/postgres/00001_initial.sql index e81b9b49..c32ba6bf 100644 --- a/backend/plugins/domain/admin/migrations/postgres/00001_initial.sql +++ b/backend/plugins/domain/admin/migrations/postgres/00001_initial.sql @@ -26,6 +26,48 @@ CREATE INDEX IF NOT EXISTS idx_w_templates_is_system ON w_templates (is_system); CREATE INDEX IF NOT EXISTS idx_w_templates_created_at ON w_templates (created_at); CREATE INDEX IF NOT EXISTS idx_w_templates_updated_at ON w_templates (updated_at); +CREATE TABLE IF NOT EXISTS w_schedules ( + id BIGINT PRIMARY KEY, + name VARCHAR(128) NOT NULL, + task_type VARCHAR(64) NOT NULL, + cron VARCHAR(64) NOT NULL, + payload TEXT, + is_active BOOLEAN NOT NULL DEFAULT TRUE, + created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP +); +CREATE INDEX IF NOT EXISTS idx_w_schedules_is_active ON w_schedules (is_active); + +-- Seed initial cleanup task +INSERT INTO w_schedules (id, name, task_type, cron, payload, is_active, created_at, updated_at) +VALUES (1, '系统定期垃圾清理', 'system_cleanup', '0 3 * * *', '{}', TRUE, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP) +ON CONFLICT (id) DO NOTHING; + +CREATE TABLE IF NOT EXISTS w_task_executions ( + id BIGINT PRIMARY KEY, + task_id VARCHAR(128) NOT NULL UNIQUE, + task_type VARCHAR(64) NOT NULL, + task_name VARCHAR(128), + status VARCHAR(32) NOT NULL, + retryable BOOLEAN NOT NULL DEFAULT FALSE, + max_retry INTEGER NOT NULL DEFAULT 0, + retry_count INTEGER NOT NULL DEFAULT 0, + log TEXT, + error_message TEXT, + result TEXT, + started_at TIMESTAMPTZ, + finished_at TIMESTAMPTZ, + duration BIGINT, + payload TEXT, + triggered_by VARCHAR(32) NOT NULL DEFAULT 'system', + created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP +); +CREATE INDEX IF NOT EXISTS idx_w_task_executions_task_type ON w_task_executions (task_type); +CREATE INDEX IF NOT EXISTS idx_w_task_executions_status ON w_task_executions (status); +CREATE INDEX IF NOT EXISTS idx_w_task_executions_started_at ON w_task_executions (started_at); +CREATE INDEX IF NOT EXISTS idx_w_task_executions_created_at ON w_task_executions (created_at); + -- Seed system configs (all default platform configs) INSERT INTO w_system_configs (key, value, type, visibility, description, created_at, updated_at) VALUES ('cap_login_enabled', 'false', 'system', 1, '是否启用登录人机验证(true/false)', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP), @@ -82,6 +124,8 @@ DELETE FROM w_system_configs WHERE key IN ( 'storage_config', 'disk_cache_max_size_mb', 'disk_cache_ttl_minutes', 'disk_cache_lru_enabled', 'file_access_whitelist', 'login_session_ttl_hours', 'log_database', 'log_db_migration' ); +DROP TABLE IF EXISTS w_task_executions; +DROP TABLE IF EXISTS w_schedules; DROP TABLE IF EXISTS w_templates; DROP TABLE IF EXISTS w_system_configs; -- +goose StatementEnd diff --git a/backend/plugins/domain/admin/migrations/sqlite/00001_initial.sql b/backend/plugins/domain/admin/migrations/sqlite/00001_initial.sql index 6fcd44e1..d44474e6 100644 --- a/backend/plugins/domain/admin/migrations/sqlite/00001_initial.sql +++ b/backend/plugins/domain/admin/migrations/sqlite/00001_initial.sql @@ -26,6 +26,48 @@ CREATE INDEX IF NOT EXISTS idx_w_templates_is_system ON w_templates (is_system); CREATE INDEX IF NOT EXISTS idx_w_templates_created_at ON w_templates (created_at); CREATE INDEX IF NOT EXISTS idx_w_templates_updated_at ON w_templates (updated_at); +CREATE TABLE IF NOT EXISTS w_schedules ( + id BIGINT PRIMARY KEY, + name VARCHAR(128) NOT NULL, + task_type VARCHAR(64) NOT NULL, + cron VARCHAR(64) NOT NULL, + payload TEXT, + is_active BOOLEAN NOT NULL DEFAULT 1, + created_at DATETIME DEFAULT CURRENT_TIMESTAMP, + updated_at DATETIME DEFAULT CURRENT_TIMESTAMP +); +CREATE INDEX IF NOT EXISTS idx_w_schedules_is_active ON w_schedules (is_active); + +-- Seed initial cleanup task +INSERT INTO w_schedules (id, name, task_type, cron, payload, is_active, created_at, updated_at) +VALUES (1, '系统定期垃圾清理', 'system_cleanup', '0 3 * * *', '{}', 1, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP) +ON CONFLICT (id) DO NOTHING; + +CREATE TABLE IF NOT EXISTS w_task_executions ( + id BIGINT PRIMARY KEY, + task_id VARCHAR(128) NOT NULL UNIQUE, + task_type VARCHAR(64) NOT NULL, + task_name VARCHAR(128), + status VARCHAR(32) NOT NULL, + retryable BOOLEAN NOT NULL DEFAULT 0, + max_retry INTEGER NOT NULL DEFAULT 0, + retry_count INTEGER NOT NULL DEFAULT 0, + log TEXT, + error_message TEXT, + result TEXT, + started_at DATETIME, + finished_at DATETIME, + duration BIGINT, + payload TEXT, + triggered_by VARCHAR(32) NOT NULL DEFAULT 'system', + created_at DATETIME DEFAULT CURRENT_TIMESTAMP, + updated_at DATETIME DEFAULT CURRENT_TIMESTAMP +); +CREATE INDEX IF NOT EXISTS idx_w_task_executions_task_type ON w_task_executions (task_type); +CREATE INDEX IF NOT EXISTS idx_w_task_executions_status ON w_task_executions (status); +CREATE INDEX IF NOT EXISTS idx_w_task_executions_started_at ON w_task_executions (started_at); +CREATE INDEX IF NOT EXISTS idx_w_task_executions_created_at ON w_task_executions (created_at); + -- Seed system configs (all default platform configs) INSERT INTO w_system_configs (key, value, type, visibility, description, created_at, updated_at) VALUES ('cap_login_enabled', 'false', 'system', 1, '是否启用登录人机验证(true/false)', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP), @@ -82,6 +124,8 @@ DELETE FROM w_system_configs WHERE key IN ( 'storage_config', 'disk_cache_max_size_mb', 'disk_cache_ttl_minutes', 'disk_cache_lru_enabled', 'file_access_whitelist', 'login_session_ttl_hours', 'log_database', 'log_db_migration' ); +DROP TABLE IF EXISTS w_task_executions; +DROP TABLE IF EXISTS w_schedules; DROP TABLE IF EXISTS w_templates; DROP TABLE IF EXISTS w_system_configs; -- +goose StatementEnd diff --git a/backend/plugins/domain/auth/repository.go b/backend/plugins/domain/auth/repository.go index 883dc78d..c245e924 100644 --- a/backend/plugins/domain/auth/repository.go +++ b/backend/plugins/domain/auth/repository.go @@ -8,7 +8,6 @@ import ( "Wavelet/core/contracts" "Wavelet/pkg/util" "context" - "strings" "sync" "time" @@ -80,41 +79,19 @@ func GetAccessTokenByHash(ctx context.Context, tokenHash string) (*CachedToken, // GetActiveUserByID 读取仍处于启用状态的用户 func GetActiveUserByID(ctx context.Context, userID uint64) (*contracts.UserDTO, error) { - var row struct { - contracts.UserDTO - Password string `gorm:"column:password"` - } - if err := getDB(ctx).Table("w_users").Where("id = ? AND is_active = ?", userID, true).First(&row).Error; err != nil { + var user contracts.UserDTO + if err := getDB(ctx).Table("w_users").Where("id = ? AND is_active = ?", userID, true).First(&user).Error; err != nil { return nil, err } - user := row.UserDTO - if row.Password != "" && - !strings.HasPrefix(row.Password, "$2a$") && - !strings.HasPrefix(row.Password, "$2b$") && - !strings.HasPrefix(row.Password, "$2y$") && - !strings.HasPrefix(row.Password, "$2x$") { - user.NeedChangePassword = true - } return &user, nil } // GetUserByID 按 ID 读取用户(不限制启用状态) func GetUserByID(ctx context.Context, userID uint64) (*contracts.UserDTO, error) { - var row struct { - contracts.UserDTO - Password string `gorm:"column:password"` - } - if err := getDB(ctx).Table("w_users").Where("id = ?", userID).First(&row).Error; err != nil { + var user contracts.UserDTO + if err := getDB(ctx).Table("w_users").Where("id = ?", userID).First(&user).Error; err != nil { return nil, err } - user := row.UserDTO - if row.Password != "" && - !strings.HasPrefix(row.Password, "$2a$") && - !strings.HasPrefix(row.Password, "$2b$") && - !strings.HasPrefix(row.Password, "$2y$") && - !strings.HasPrefix(row.Password, "$2x$") { - user.NeedChangePassword = true - } return &user, nil }