跳转至

登录注册系统实战(文件存储)#

来源D:\study\C#1\WinForm\stu0805\8.5作业stu0805\0805作业stu0807\登录注册

综合运用:多窗体 + 文件读写 + 集合查找 + 封装,实现一个完整的「注册 → 登录」系统。


1. 数据模型(User 类)#

public class User
{
    public string Username { get; set; }   // 姓名
    public string Account { get; set; }    // 账号
    public string Password { get; set; }   // 密码
}

2. 数据存储格式#

账号数据保存在文本文件中,每行一条记录,字段用逗号(或竖线 |)分隔:

# 逗号分隔(CSV 格式)
张三,zhangsan,123456
李四,lisi,654321

# 或竖线分隔
admin|123456
student|654321

3. 注册功能(Reg 窗口)#

public partial class Reg : Form
{
    static string path = @"../../Data/UserData.txt";
    static List<User> users = new List<User>();

    private void BtnReg_Click(object sender, EventArgs e)
    {
        // 1. 读取已有账号(防止重复注册)
        string[] data = File.ReadAllLines(path, Encoding.UTF8);
        foreach (string s in data)
        {
            User use = new User();
            use.Username = s.Split(',')[0];
            use.Account = s.Split(',')[1];
            use.Password = s.Split(',')[2];
            users.Add(use);
        }

        // 2. 校验两次密码一致
        User user = new User();
        user.Username = Username.Text;
        user.Account = Account.Text;
        user.Password = passwd1.Text.Equals(passwd2.Text) ? passwd1.Text : null;

        if (user.Password == null)
        {
            passwd1.Text = null; passwd2.Text = null;
            MessageBox.Show("两次密码不一致,请重新输入");
            return;
        }

        // 3. 检查账号是否重复
        if (users.Contains(users.Find(a => a.Account == user.Account)))
        {
            MessageBox.Show("该账号已被注册!");
            user.Account = null; Account.Text = null;
            return;
        }

        // 4. 保存到文件
        RegUser(user);
        MessageBox.Show("注册成功,快去登录吧!");
    }

    public void RegUser(User user)
    {
        using (FileStream fs = new FileStream(path, FileMode.Append, FileAccess.Write))
        using (StreamWriter sw = new StreamWriter(fs))
        {
            sw.WriteLine();                                    // 换行
            sw.Write(user.Username + "," + user.Account + "," + user.Password);
        }
    }
}

4. 登录功能(Login 窗口)#

public partial class Login : Form
{
    static List<User> users = new List<User>();
    static string path = @"../../Data/UserData.txt";

    private void BtnLogin_Click(object sender, EventArgs e)
    {
        // 1. 从文件加载所有账号
        string[] data = File.ReadAllLines(path, Encoding.UTF8);
        foreach (string s in data)
        {
            User user = new User();
            user.Username = s.Split(',')[0];
            user.Account = s.Split(',')[1];
            user.Password = s.Split(',')[2];
            users.Add(user);
        }

        // 2. 用 Lambda 查找匹配的账号密码
        User find = users.Find(a => a.Account == Acc.Text && a.Password == Passwd.Text);

        if (find != null)
        {
            MessageBox.Show($"登录成功!\n欢迎用户{Acc.Text}!");
            // 打开主窗口(见 05-多窗体与数据传递)
        }
        else
        {
            MessageBox.Show("登录失败!");
        }
    }

    // 打开注册窗口
    private void BtnReg_Click(object sender, EventArgs e)
    {
        new Reg().ShowDialog();
    }
}

💡 users.Find(a => a.Account == ...) 是 List 的查找方法,参数是 Lambda 表达式(条件),返回第一个匹配项,找不到返回 null。这是本系统最核心的一句代码。

5. 流程总结#

注册流程:输入信息 → 校验两次密码 → 查重 → Append 写入文件
登录流程:读取文件 → 加载到 List<User> → Find 匹配 → 成功打开主窗口 / 失败提示
┌────────┐   BtnReg_Click    ┌─────────┐
│ Login  │ ────────────────► │   Reg   │  注册成功后关窗返回
└────────┘                   └─────────┘
    │ 登录成功
┌────────┐
│ 主窗口  │(Hide 登录窗口)
└────────┘

6. 相关知识点#

知识点 对应笔记
多窗体切换 05-多窗体与数据传递/01-打开新窗口Show与ShowDialog
窗体间传值 05-多窗体与数据传递/02-窗体之间数据传递
文件读写 06-文件与IO操作/04-文本流读写
User 类封装 08-面向对象与设计模式/02-封装与访问修饰符
图书管理系统的完整登录 09-项目实战/01-图书管理系统

相关笔记#