C#-用Winform制做一个简单的密码管理工具

为何要作?

首先是为了练习一下c#。
想必你们都有过记不起某个平台的帐号密码的经历,那种感觉着实使人抓狂。那这么多帐号密码根本记不住!我以前用python写过一个超级简单(连帐号信息都写在代码里那种)的控制台程序用来给我提示密码,可是我想添加一个帐号时直接被麻烦到吐。 因此我才想用Winform作一个简单的小工具来帮助我记忆。(仅供我本身使用(因此界面会比较丑。。),可是我会把代码贴出来因此有点c#基础的其实均可以本身作一个)python

设想

个人需求很是简单json

  1. 在我须要的时候,输入一个平台能把对应的帐号密码显示出来
  2. 可以添加帐号信息

还有一点就是在查询帐号以前须要输入一个口令来验证身份,这个口令只有我本身知道(我把它存在了app.config文件中,后续若是有须要能够扩展出更改口令的功能),因此即便别人用个人电脑运行起来这个程序,他不知道口令也是没用的。c#

帐号信息怎么存?

我曾经想要用SQL Server存,毕竟c#与它如此亲近,可是我要存的东西本质上只是一些字符串,感受有点大材小用因此没有选择SQL Server。最近学了JS了解了一些json的知识发现json文件是个很好的选择因而我便决用它了。可是我还不会用c#处理json数据呀。因而我又去网上找方法,而后我就发现了newtonsoft.json(json.NET) ,它时一款.NET中开源的json序列化与反序列化工具。有了它,就能够解决个人问题了。app

code

首先把入口界面搭建起来,一个超级简单的窗体,只放了三个控件。ide

入口

为了方便操做给它加一个退出的快捷键ESC。很是简单只须要在KeyDown事件中写下以下代码:工具

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
    if(e.KeyCode==Keys.Escape)
    {
        this.Close();
    }
}

而后是肯定这个按钮的功能:当输入正确的口令后,点击肯定能够进入到下一个界面。学习

口令放在哪?

我将口令这个数据放在了App.config文件中,在解决方案资源管理器中右键添加新建项就能够添加它了。而后向其中加入以下代码:ui

<appSettings>
    <add key="CMD" value="123123"/>
  </appSettings>

而后给刚才的入口窗体添加一个字段CMD并用ConfigurationManager将刚才的配置读取出来赋值给它:this

public readonly string CMD=ConfigurationManager.AppSettings["CMD"].ToString() ;

上面的肯定按钮的功能是口令正确是将下个界面显示出来,因此咱们先把下个界面建立出来:加密

有了这个界面,就能够去写第一个界面中肯定按钮的点击事件了:

private void button1_Click(object sender, EventArgs e)
{
    ;
    string entered_cmd = textBox1.Text; 
    if(entered_cmd.Equals(CMD))
    {
        (new GetPwd()).Show();
        this.Hide();
    }
    else
    {
        MessageBox.Show("错误!","警告",MessageBoxButtons.OK, MessageBoxIcon.Warning);
    }
}

这样第一个界面的代码就写完了(没错就是这么简单)。

帐号信息查询界面

也就是上面的第二个窗体。它加载的初始状态是这样:

用于显示帐号和密码的两个文本框我设置成了不可见(当输入的平台是存在的并点击肯定就能够看到了)和只读。像这样:

一个小问题

和上一个窗体同样,我也给这个窗体绑定了enter(至关于点击肯定按钮)和esc快捷键。可是当我关闭这个窗体时,已经没法再进行任何操做了但是这个程序进程却没有结束。怎么解决这个问题呢?前段时间学习了委托因而我想到了一个比学校老师曾经教过的更好的方法(当时还没学习委托,老师教的是把第一个窗体对象传递给第二个窗体):给第二个窗体定义一个委托字段 public Action close_main;而后在显示该窗体是将前一个窗体的close()方法传递过来便可。
前面的代码修改一下:

(new GetPwd() {close_main=this.Close}).Show();

而后在第二个窗体的FormClosed事件中执行这个方法就能够了。

private void GetPwd_FormClosed(object sender, FormClosedEventArgs e)
{
    close_main();
}

查询

全部的帐号信息我都放在一个json文件中:PWD.json,有关对其的各类逻辑性操做我抽成了一个类Manager:

class Manager
{
    public static string GetjsonString()
    {
        // 获取整个json字符串
        if(!File.Exists(Path.GetFullPath(@"..//..") + ".../PWD.JSON"))
        {
            File.Create(Path.GetFullPath(@"..//..") + ".../PWD.JSON");
        }
        StreamReader jsonFile = File.OpenText(Path.GetFullPath(@"..//..") + ".../PWD.JSON");
        string res = jsonFile.ReadToEnd();
        jsonFile.Close();
        return res;
    }
    public static List<Acount> GetAcountsList()
    {
        //将json字符串序列化为一个集合对象
        return JsonConvert.DeserializeObject<List<Acount>>(GetjsonString());
    }
    public static Acount SearchAcount(string platform)
    {
        //搜索平台为platform的帐号
        List<Acount> acounts = GetAcountsList();
        if(acounts==null||acounts.Count==0)
        {
            return null;
        }
        var res = from a in acounts
              where a.platForm == platform
              select a;
        return res.Count()>=1?res.First():null;
    }
    public static bool CheckExistence(Acount acount)
    {
        //检查acount 这个帐号是否存在
        //检查该帐号是否存在
        List<Acount> acounts = GetAcountsList();
        var res = from a in acounts
                  where a.platForm==acount.platForm&&a.acount == acount.acount && a.password == acount.password
                  select a;
        return res.Count() == 1;
    }
    public static void AddAcount(Acount a)
    {
        //添加一个帐号信息
        if(a.platForm==""||a.acount==""||a.password=="")
        {
            MessageBox.Show("请输入完整信息!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            return ;
        }
        List<Acount> acounts = GetAcountsList();
        acounts.Add(a);
        string res = JsonConvert.SerializeObject(acounts);
        StreamWriter jsonwriter = new StreamWriter(Path.GetFullPath(@"..//..") + ".../PWD.JSON");
        jsonwriter.WriteLine(res);
        jsonwriter.Close();
    }
}

有了这些方法,其余地方就很是简单了。查询界面的肯定按钮点击事件:

private void button1_Click(object sender, EventArgs e)
{
    Acount acount = Manager.SearchAcount(txt_platform.Text.ToLower());
    if(acount!=null)
    {
        txt_uId.Text = acount.acount;
        txt_pwd.Text = acount.password;
        txt_uId.Visible = true;
        txt_pwd.Visible = true;
        txt_uId.ReadOnly = true;
        txt_pwd.ReadOnly = true;
    }
    else
    {
        MessageBox.Show("无此帐号!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning);
    }
}

添加

第三个界面用来添加,经过第二个界面的Add按钮呼出。
长这样:

个人设想是想要添加帐号信息须要再次验证一下身份:输入一个已有的正确帐号信息来经过验证,验证经过后仍然使用这个界面来添加(三个文本框依次用来输入平台、帐号、密码)。这个界面只有一个按钮,验证时它的text属性为"Check",添加时为"Add",窗体的标题也有相应的变化。该按钮的点击事件以下:

private void button1_Click(object sender, EventArgs e)
{
    if(btn_check.Text=="Check")
    {
        if (Manager.CheckExistence(new Acount(txt_check_platform.Text.ToLower(), txt_check_uid.Text, txt_check_pwd.Text)))
        {
            txt_check_platform.Text = "";
            txt_check_uid.Text = "";
            txt_check_pwd.Text = "";
            this.Text = "添加密码";
            btn_check.Text = "Add";
            txt_check_platform.Focus();
        }
        else
        {
            MessageBox.Show("验证失败!!", "验证反馈", MessageBoxButtons.OK, MessageBoxIcon.Warning);
        }
    }
    else
    {
        Manager.AddAcount(new Acount(txt_check_platform.Text.ToLower(), txt_check_uid.Text, txt_check_pwd.Text));
        this.close();
    }            
}

添加时:

另外,第三个界面也作了和前一个界面相同的快捷键和关闭处理

最后

这个程序很是很是简单,固然后续仍是能够扩展许多其余功能的。虽然制做过程很简单可是我仍是有很重要的收获,就是newtonsoft.json这个工具。固然还有一点时减轻了我对无数密码的记忆负担。

以记录本身的学习历程

相关文章
相关标签/搜索