You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python列表重复元素索引问题及登录管理器优化咨询

解决同域名多账号的TUI选择与数据库匹配问题

一、TUI选择时区分重复域名条目

直接用域名作为选择项会导致重复无法区分,核心解决思路是把数据库的唯一ID和条目详情(域名+账号/备注)组合成选择文本,用户选择后提取ID,直接用ID查询数据库,完全绕开列表index()的限制。

示例代码(基于beaupy):

import beaupy
import sqlite3

# 从数据库获取所有登录条目
def get_all_logins():
    conn = sqlite3.connect('logins.db')
    cursor = conn.cursor()
    cursor.execute('SELECT id, domain, username, note FROM logins')
    rows = cursor.fetchall()
    conn.close()
    return rows

logins = get_all_logins()
# 构造选择选项:拼接ID、域名、账号、备注为可读文本
options = [f"[{row[0]}] {row[1]} - {row[2]} {'('+row[3]+')' if row[3] else ''}" for row in logins]

# 让用户选择条目
selected = beaupy.select(options, prompt="选择要查看的登录条目")
if selected:
    # 从选中文本中提取唯一ID
    login_id = int(selected.split(']')[0][1:])
    # 用ID查询完整记录
    conn = sqlite3.connect('logins.db')
    cursor = conn.cursor()
    cursor.execute('SELECT * FROM logins WHERE id = ?', (login_id,))
    record = cursor.fetchone()
    conn.close()
    print(f"选中记录:ID={record[0]}, 域名={record[1]}, 账号={record[2]}, 备注={record[4]}")

二、数据库设计优化

核心表结构设计

必须包含自增主键ID作为唯一标识,同时存储必要字段,建议结构:

CREATE TABLE IF NOT EXISTS logins (
    id INTEGER PRIMARY KEY AUTOINCREMENT, -- 唯一ID,解决重复域名匹配问题
    domain TEXT NOT NULL, -- 域名
    username TEXT NOT NULL, -- 账号
    password TEXT NOT NULL, -- 加密后的密码
    note TEXT DEFAULT '', -- 备注,用于区分同域名账号
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, -- 创建时间
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP -- 更新时间
);

索引优化

为常用查询字段添加索引,提升查询速度:

-- 按域名查询时加速
CREATE INDEX IF NOT EXISTS idx_domain ON logins(domain);
-- 可选:限制同一域名下账号唯一(根据需求开启)
CREATE UNIQUE INDEX IF NOT EXISTS idx_domain_username ON logins(domain, username);

三、存储方案优化

密码加密存储

绝对禁止明文存储密码,推荐使用cryptography库的Fernet对称加密:

from cryptography.fernet import Fernet
import sqlite3

# 首次运行生成密钥,需妥善保管(丢失则无法解密)
def generate_key():
    key = Fernet.generate_key()
    with open('secret.key', 'wb') as key_file:
        key_file.write(key)

# 加载本地密钥
def load_key():
    return open('secret.key', 'rb').read()

# 加密密码
def encrypt_password(password, key):
    fernet = Fernet(key)
    return fernet.encrypt(password.encode()).decode()

# 解密密码
def decrypt_password(encrypted_password, key):
    fernet = Fernet(key)
    return fernet.decrypt(encrypted_password.encode()).decode()

# 示例:插入加密后的登录记录
key = load_key()
conn = sqlite3.connect('logins.db')
cursor = conn.cursor()
encrypted_pwd = encrypt_password('my_secure_password', key)
cursor.execute('INSERT INTO logins (domain, username, password, note) VALUES (?, ?, ?, ?)', 
               ('hello.com', 'work_user', encrypted_pwd, '工作账号'))
conn.commit()
conn.close()

数据备份建议

  • 定期备份数据库文件(logins.db)和密钥文件(secret.key)
  • 备份文件需加密后存储到本地安全位置或加密云盘

内容的提问来源于stack exchange,提问作者Ori

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 16:10:42