Files
weidian/server/database.py
Jeason c293f3d4ac feat: 完善登录认证系统
- 首次使用强制设置密码(至少6位)
- 密码存数据库(SHA256哈希),前端可修改
- 登录失败5次锁定5分钟,防爆破
- 导航栏添加修改密码入口
- 移除硬编码默认密码
2026-04-02 12:11:09 +08:00

69 lines
2.3 KiB
Python

import sqlite3
import os
from datetime import datetime
DB_PATH = os.path.join(os.path.dirname(__file__), '..', 'data', 'snatcher.db')
def get_db():
os.makedirs(os.path.dirname(DB_PATH), exist_ok=True)
conn = sqlite3.connect(DB_PATH)
conn.row_factory = sqlite3.Row
conn.execute("PRAGMA journal_mode=WAL")
return conn
def init_db():
conn = get_db()
conn.executescript('''
CREATE TABLE IF NOT EXISTS accounts (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
phone TEXT NOT NULL DEFAULT '',
password TEXT NOT NULL DEFAULT '',
auth_file TEXT NOT NULL,
is_logged_in INTEGER DEFAULT 0,
login_msg TEXT DEFAULT '',
created_at TEXT DEFAULT (datetime('now', 'localtime')),
updated_at TEXT DEFAULT (datetime('now', 'localtime'))
);
CREATE TABLE IF NOT EXISTS tasks (
id INTEGER PRIMARY KEY AUTOINCREMENT,
account_id INTEGER NOT NULL,
target_url TEXT NOT NULL,
item_name TEXT DEFAULT '',
item_id TEXT DEFAULT '',
sku_id TEXT DEFAULT '',
price TEXT DEFAULT '',
snatch_time TEXT NOT NULL,
status TEXT DEFAULT 'pending',
result TEXT DEFAULT '',
created_at TEXT DEFAULT (datetime('now', 'localtime')),
updated_at TEXT DEFAULT (datetime('now', 'localtime')),
FOREIGN KEY (account_id) REFERENCES accounts(id)
);
CREATE TABLE IF NOT EXISTS orders (
id INTEGER PRIMARY KEY AUTOINCREMENT,
task_id INTEGER NOT NULL,
account_id INTEGER NOT NULL,
status TEXT DEFAULT 'unknown',
detail TEXT DEFAULT '',
created_at TEXT DEFAULT (datetime('now', 'localtime')),
FOREIGN KEY (task_id) REFERENCES tasks(id),
FOREIGN KEY (account_id) REFERENCES accounts(id)
);
CREATE TABLE IF NOT EXISTS admin (
id INTEGER PRIMARY KEY CHECK (id = 1),
password_hash TEXT NOT NULL,
fail_count INTEGER DEFAULT 0,
locked_until TEXT DEFAULT '',
created_at TEXT DEFAULT (datetime('now', 'localtime')),
updated_at TEXT DEFAULT (datetime('now', 'localtime'))
);
''')
conn.commit()
conn.close()