哎,年纪大了,记个密码都费劲,每次输入密码都要输入三四遍才能蒙对,以前将所有的密码全都写在一个txt中,今天居然忘记放在哪里了!!!,想不到我的记忆居然这样侮辱我。身为程序员的这辈子都不可能忘记命令行的我于是写一个密码管理器。
本着以需求写程序的原则,接下来说一下我们的需求:
1.创建密码
2.徐改密码
3.删除密码
4.查询密码
emmm,好像是废话。细化一下
首先看一下我们都保存密码的什么信息
用户名:主角
密码:主角
位置:用于何处
名字:给密码起一个名字,比如都是腾讯的或者其他意义,之后再查找的时候更加快速
评论:可以说明一下这个密码的作用
useful:代表这个密码是有效的
创建一个表格式如下:
create table passaggregate(id int auto_increment,name varchar(20),position varchar(100),username varchar(50),pass varchar(40),useful int,remark varchar(200),primary key(id));
主键设置成自增模式
先看创建密码形如这样 (仿照docker 的命令行):
pass :代表调用密码管理器,create :创建一个密码,接下来还可以输入很多参数基本都是对应数据表
-name:输入改密码的名字
-username:用户名
-password:密码
-position:密码的位置
-remark:对密码的评论
新建密码默认可用所以 useful不用输入
注意:这里的信息不一定填写完整。
删除密码
这里的删除密码是伪删除,考虑到个人密码并不是很多,不想完全删除,留作纪念。万一真要删错,我可不想再去重新修改。
useful字段用于管理改密码是否可用。
那么这里删除可以看成对字段更改。那就很简单了
删除密码的命令行如下(按照密码的主键来进行删除的,简单粗暴):
查询密码
删除密码需要知道改密码的主键值,所以这里有一个查询操作四种形式,什么都不填,-a, -l, -al;
查询所有可用的密码:pass find
查询所有的密码:pass find -a
模糊查询(作用于 name字段)pasa find -l zhang
模糊查询所有的密码(作用于name字段)pass find -al zhang
四种形式。
修改密码
pass update <主键> [-name zhang] [-username xiao] [-password xiao] [-remark ok]
这里处理主键其他属性都可以修改,可以单一修改也可属性修改。
差不多现在整个程序要做的事情说的差不多了开始上程序了。
两个文件。一个对数据的操作,根据字符串来判断调用哪些操作
先看对数据库的操作
增删改查(collectPassword):
'''
用于密码的录入和显示
1.密码的录入->数据库
2.密码的显示->数据库
3.删除和添加密码功能
4.对密码的修改
'''
import pymysql
import sys
def linkDataBase():
'''
连接数据库
:return:
'''
username = "root"
password = "xiaoliang123"
db = pymysql.connect("localhost", username, password, 'mydata')
cursor = db.cursor()
return (db, cursor)
def insertData(item):
'''
插入一条记录
item 属于一个map类型的数据结构 里面的键值有 name position username pass useful=1 remark
:param item:
:return:
'''
# 生成数据库语句
sql = "insert into passaggregate(name,position,username,pass,useful,remark) values('{}','{}','{}','{}','{}','{}')".format(
item['name'], item['position'], item['username'], item['password'], item['useful'], item['remark']
)
# print(sql)
db, cursor = linkDataBase()
cursor.execute(sql)
db.commit()
cursor.close()
db.close()
def changData(item):
'''
更新数据库
:param item:
:return:
'''
sql = "update passaggregate set name='{}',position='{}',username='{}',pass='{}',useful='{}',remark='{}' where id={}".format(
item[1], item[2], item[3], item[4], item[5], item[6], item[0]
)
# print(sql)
db, cursor = linkDataBase()
cursor.execute(sql)
db.commit()
cursor.close()
db.close()
def searchAllData(useful=1):
'''
查找所有的数据
:return:
'''
db, cursor = linkDataBase()
if useful == 1:
sql = "select* from passaggregate where useful=1"
else:
sql = "select*from passaggregate"
cursor.execute(sql)
data = cursor.fetchall()
cursor.close()
db.close()
return data
def searchItemData(name, useful=1):
'''
根据用户名来查找数据库
:param name:
:return:
'''
if useful == 1:
sql = "select *from passaggregate where name like '%{}%' and useful=1".format(name)
else:
sql = "select *from passaggregate where name like '%{}%'".format(name)
db, cursor = linkDataBase()
cursor.execute(sql)
data = cursor.fetchall()
cursor.close()
db.close()
return data
def searchItemById(id):
'''
根据id来查找,内容
:param id:
:return: 返回一个map值,可以直接用
'''
db, cursor = linkDataBase()
sql = "select*from passaggregate where id='{}'".format(id)
cursor.execute(sql)
data = cursor.fetchone()
# print(data)
return list(data)
处理字符串的文件(pass.py)
from collectPassword import *
import sys
# 参数
def createFunction(item):
'''
create 命令
:param item:
:return:
'''
parameters = ['id', 'name', 'position', 'username', 'password', 'remark', 'useful']
# print("createFunction:", item)
keys = item[::2]
values = item[1::2]
if len(keys) != len(values):
print("表达式错误")
return False
result = {"name": "", "username": "", "password": "", "useful": "", "position": "", "remark": ""}
for key, value in zip(keys, values):
key = key.strip('-')
if key not in parameters:
print("表达式错误, 没有{}".format(key))
return False
# print(key, ":", value)
result[key] = value
result['useful'] = 1
insertData(result)
print("创建成功")
return True
def findFunction(item):
'''
查找命令
:param item:
:return:
'''
# print("findFunction:", item)
# data = None
if len(item) == 0:
data = searchAllData()
elif len(item) == 1 and item[0].strip("-") == 'a':
data = searchAllData(0)
elif len(item) == 2 and item[0].strip("-") == 'l':
data = searchItemData(item[1])
elif len(item) == 2 and item[0].strip("-") in ["al", "la"]:
data = searchItemData(item[1], 0)
else:
print("表达式错误,没有{}".format(item[0]))
return False
for line in data:
print(line)
return True
def rmFunction(item):
'''
删除命令
:param item:
:return:
'''
# print("rmFunction:", item)
data = searchItemById(item[0])
data[5] = 0
changData(data)
print("删除成功")
def updateFunction(item):
'''
更新命令
:param item:
:return:
'''
paramters = ['name', 'position', 'username', 'password', 'useful', 'remark']
# print("updateFunction:", item)
data = searchItemById(item[0])
keys = item[1::2]
values = item[2::2]
keyMap = {"name": 1, "position": 2, "username": 3, "password": 4, "useful": 5, "remark": 6}
if len(keys) != len(values):
print("表达式有误")
return False
for key, value in zip(keys, values):
key = key.strip("-")
if key not in paramters:
print("没有该参数:{}".format(key))
return False
data[keyMap[key]] = value
changData(data)
print("更新成功")
if __name__ == '__main__':
# 命令
commands = {'create': createFunction, 'find': findFunction, 'rm': rmFunction, 'update': updateFunction}
item = sys.argv
commands[item[1]](item[2:])
通过pyinstaller工具,python的一个包pip install pyinstaller 即可 他可以将.py文件编译成exe文件
cmd中输入 :pyinstaller pass.py 即可,等待编译。出现disk的文件夹里面的便是我们的要的程序移动到其他文件夹中。然后设置环境变量。最后可以想使用命令一样的使用自己写的程序。
不过话说回来这程序有点,菜的人不会用,强的人不屑用。。。。
不管怎么说反正目前对自己有用就行。以后如果还有什么需求再接着加吧。如果上面的程序有任何问题请及时的联系我,我会给出答复。