🔥 移除旧密码重置审核系统 & ✨ 优化存储管理UI
后端改进: - 移除需要管理员审核的密码重置请求功能 - 简化密码重置流程,直接使用邮件重置 - 删除 password_reset_requests 表及相关代码 前端优化: - 重新设计存储管理界面,采用现代化渐变风格 - 改进存储方式切换交互,添加动画效果 - 优化视觉层次和信息展示 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -71,30 +71,12 @@ function initDatabase() {
|
||||
)
|
||||
`);
|
||||
|
||||
// 密码重置请求表
|
||||
db.exec(`
|
||||
CREATE TABLE IF NOT EXISTS password_reset_requests (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
user_id INTEGER NOT NULL,
|
||||
new_password TEXT NOT NULL,
|
||||
status TEXT DEFAULT 'pending', -- pending, approved, rejected
|
||||
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||||
reviewed_at DATETIME,
|
||||
reviewed_by INTEGER,
|
||||
|
||||
FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE,
|
||||
FOREIGN KEY (reviewed_by) REFERENCES users (id)
|
||||
)
|
||||
`);
|
||||
|
||||
// 创建索引
|
||||
db.exec(`
|
||||
CREATE INDEX IF NOT EXISTS idx_users_username ON users(username);
|
||||
CREATE INDEX IF NOT EXISTS idx_users_email ON users(email);
|
||||
CREATE INDEX IF NOT EXISTS idx_shares_code ON shares(share_code);
|
||||
CREATE INDEX IF NOT EXISTS idx_shares_user ON shares(user_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_reset_requests_user ON password_reset_requests(user_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_reset_requests_status ON password_reset_requests(status);
|
||||
`);
|
||||
|
||||
// 数据库迁移:添加upload_api_key字段(如果不存在)
|
||||
@@ -562,80 +544,6 @@ const PasswordResetTokenDB = {
|
||||
}
|
||||
};
|
||||
|
||||
// 密码重置请求管理
|
||||
const PasswordResetDB = {
|
||||
// 创建密码重置请求
|
||||
create(userId, newPassword) {
|
||||
const hashedPassword = bcrypt.hashSync(newPassword, 10);
|
||||
|
||||
// 删除该用户之前的pending请求
|
||||
db.prepare('DELETE FROM password_reset_requests WHERE user_id = ? AND status = ?')
|
||||
.run(userId, 'pending');
|
||||
|
||||
const stmt = db.prepare(`
|
||||
INSERT INTO password_reset_requests (user_id, new_password, status)
|
||||
VALUES (?, ?, 'pending')
|
||||
`);
|
||||
|
||||
const result = stmt.run(userId, hashedPassword);
|
||||
return result.lastInsertRowid;
|
||||
},
|
||||
|
||||
// 获取待审核的请求
|
||||
getPending() {
|
||||
return db.prepare(`
|
||||
SELECT r.*, u.username, u.email
|
||||
FROM password_reset_requests r
|
||||
JOIN users u ON r.user_id = u.id
|
||||
WHERE r.status = 'pending'
|
||||
ORDER BY r.created_at DESC
|
||||
`).all();
|
||||
},
|
||||
|
||||
// 审核请求(批准或拒绝)
|
||||
review(requestId, adminId, approved) {
|
||||
const request = db.prepare('SELECT * FROM password_reset_requests WHERE id = ?').get(requestId);
|
||||
|
||||
if (!request || request.status !== 'pending') {
|
||||
throw new Error('请求不存在或已被处理');
|
||||
}
|
||||
|
||||
const newStatus = approved ? 'approved' : 'rejected';
|
||||
|
||||
db.prepare(`
|
||||
UPDATE password_reset_requests
|
||||
SET status = ?, reviewed_at = CURRENT_TIMESTAMP, reviewed_by = ?
|
||||
WHERE id = ?
|
||||
`).run(newStatus, adminId, requestId);
|
||||
|
||||
// 如果批准,更新用户密码
|
||||
if (approved) {
|
||||
db.prepare('UPDATE users SET password = ?, updated_at = CURRENT_TIMESTAMP WHERE id = ?')
|
||||
.run(request.new_password, request.user_id);
|
||||
}
|
||||
|
||||
return true;
|
||||
},
|
||||
|
||||
// 获取用户的所有请求
|
||||
getUserRequests(userId) {
|
||||
return db.prepare(`
|
||||
SELECT * FROM password_reset_requests
|
||||
WHERE user_id = ?
|
||||
ORDER BY created_at DESC
|
||||
`).all(userId);
|
||||
},
|
||||
|
||||
// 检查用户是否有待处理的请求
|
||||
hasPendingRequest(userId) {
|
||||
const request = db.prepare(`
|
||||
SELECT id FROM password_reset_requests
|
||||
WHERE user_id = ? AND status = 'pending'
|
||||
`).get(userId);
|
||||
return !!request;
|
||||
}
|
||||
};
|
||||
|
||||
// 初始化默认设置
|
||||
function initDefaultSettings() {
|
||||
// 默认上传限制为10GB
|
||||
@@ -696,6 +604,5 @@ module.exports = {
|
||||
ShareDB,
|
||||
SettingsDB,
|
||||
VerificationDB,
|
||||
PasswordResetTokenDB,
|
||||
PasswordResetDB
|
||||
PasswordResetTokenDB
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user