diff --git a/backend/database.js b/backend/database.js index e275f97..e5f2424 100644 --- a/backend/database.js +++ b/backend/database.js @@ -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 }; diff --git a/backend/server.js b/backend/server.js index 688b3fc..0c8bfeb 100644 --- a/backend/server.js +++ b/backend/server.js @@ -17,7 +17,7 @@ const { exec, execSync } = require('child_process'); const util = require('util'); const execAsync = util.promisify(exec); -const { db, UserDB, ShareDB, SettingsDB, PasswordResetDB, VerificationDB, PasswordResetTokenDB } = require('./database'); +const { db, UserDB, ShareDB, SettingsDB, VerificationDB, PasswordResetTokenDB } = require('./database'); const { generateToken, authMiddleware, adminMiddleware } = require('./auth'); const app = express(); @@ -3200,99 +3200,6 @@ app.post('/api/admin/users/:id/storage-permission', } ); -// 重置用户密码 -// ===== 密码重置请求系统 ===== - -// 用户提交密码重置请求(公开API) -app.post('/api/password-reset/request', - [ - body('username').notEmpty().withMessage('用户名不能为空'), - body('new_password').isLength({ min: 6 }).withMessage('新密码至少6个字符') - ], - (req, res) => { - const errors = validationResult(req); - if (!errors.isEmpty()) { - return res.status(400).json({ - success: false, - errors: errors.array() - }); - } - - try { - const { username, new_password } = req.body; - - const user = UserDB.findByUsername(username); - if (!user) { - return res.status(404).json({ - success: false, - message: '用户不存在' - }); - } - - // 检查是否已有待审核的请求 - if (PasswordResetDB.hasPendingRequest(user.id)) { - return res.status(400).json({ - success: false, - message: '您已经提交过密码重置请求,请等待管理员审核' - }); - } - - // 创建密码重置请求 - PasswordResetDB.create(user.id, new_password); - - res.json({ - success: true, - message: '密码重置请求已提交,请等待管理员审核' - }); - } catch (error) { - console.error('提交密码重置请求失败:', error); - res.status(500).json({ - success: false, - message: '提交失败: ' + error.message - }); - } - } -); - -// 获取待审核的密码重置请求(管理员) -app.get('/api/admin/password-reset/pending', authMiddleware, adminMiddleware, (req, res) => { - try { - const requests = PasswordResetDB.getPending(); - - res.json({ - success: true, - requests - }); - } catch (error) { - console.error('获取密码重置请求失败:', error); - res.status(500).json({ - success: false, - message: '获取请求失败: ' + error.message - }); - } -}); - -// 审核密码重置请求(管理员) -app.post('/api/admin/password-reset/:id/review', authMiddleware, adminMiddleware, (req, res) => { - try { - const { id } = req.params; - const { approved } = req.body; - - PasswordResetDB.review(id, req.user.id, approved); - - res.json({ - success: true, - message: approved ? '密码重置已批准' : '密码重置已拒绝' - }); - } catch (error) { - console.error('审核密码重置请求失败:', error); - res.status(500).json({ - success: false, - message: error.message || '审核失败' - }); - } -}); - // ===== 管理员文件审查功能 ===== // 查看用户文件列表(管理员,只读) diff --git a/frontend/app.html b/frontend/app.html index ea534cd..ca966f1 100644 --- a/frontend/app.html +++ b/frontend/app.html @@ -1111,45 +1111,120 @@ 存储管理 -
| 用户名 | -邮箱 | -提交时间 | -操作 | -
|---|---|---|---|
| {{ req.username }} | -{{ req.email }} | -{{ formatDate(req.created_at) }} | -- - - | -