File size: 3,005 Bytes
dc70e52
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
const fs = require('fs');
const path = require('path');
const crypto = require('crypto');
const jwt = require('jsonwebtoken');

// 管理员数据文件路径
const ADMIN_FILE = path.join(__dirname, '../../data/admin.json');
const JWT_SECRET = process.env.JWT_SECRET || 'your-secret-key';

// 确保data目录存在
const dataDir = path.dirname(ADMIN_FILE);
if (!fs.existsSync(dataDir)) {
    fs.mkdirSync(dataDir, { recursive: true });
}

// 确保admin.json文件存在
if (!fs.existsSync(ADMIN_FILE)) {
    fs.writeFileSync(ADMIN_FILE, JSON.stringify({ admin: null }), 'utf8');
}

class Admin {
    constructor() {
        this.loadAdmin();
    }

    // 加载管理员数据
    loadAdmin() {
        try {
            const data = fs.readFileSync(ADMIN_FILE, 'utf8');
            this.admin = JSON.parse(data).admin;
        } catch (error) {
            console.error('加载管理员数据失败:', error);
            this.admin = null;
        }
    }

    // 保存管理员数据
    saveAdmin() {
        try {
            fs.writeFileSync(ADMIN_FILE, JSON.stringify({ admin: this.admin }), 'utf8');
        } catch (error) {
            console.error('保存管理员数据失败:', error);
            throw error;
        }
    }

    // 检查是否已有管理员
    hasAdmin() {
        return !!this.admin;
    }

    // 注册管理员
    register(username, password) {
        if (this.hasAdmin()) {
            throw new Error('已存在管理员账号');
        }

        // 生成盐值
        const salt = crypto.randomBytes(16).toString('hex');
        // 使用盐值加密密码
        const hash = crypto.pbkdf2Sync(password, salt, 1000, 64, 'sha512').toString('hex');

        this.admin = {
            username,
            salt,
            hash
        };

        this.saveAdmin();
        return this.generateToken(username);
    }

    // 验证密码
    verifyPassword(password, salt, hash) {
        const testHash = crypto.pbkdf2Sync(password, salt, 1000, 64, 'sha512').toString('hex');
        return testHash === hash;
    }

    // 登录验证
    login(username, password) {
        if (!this.admin || username !== this.admin.username) {
            throw new Error('用户名或密码错误');
        }

        if (!this.verifyPassword(password, this.admin.salt, this.admin.hash)) {
            throw new Error('用户名或密码错误');
        }

        return this.generateToken(username);
    }

    // 生成JWT token
    generateToken(username) {
        return jwt.sign({ username }, JWT_SECRET, { expiresIn: '24h' });
    }

    // 验证JWT token
    verifyToken(token) {
        try {
            const decoded = jwt.verify(token, JWT_SECRET);
            return {
                success: true,
                username: decoded.username
            };
        } catch (error) {
            return {
                success: false,
                error: 'Invalid token'
            };
        }
    }
}

module.exports = new Admin();