登录注册系统实战(文件存储)#
来源:
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. 数据存储格式#
账号数据保存在文本文件中,每行一条记录,字段用逗号(或竖线 |)分隔:
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. 流程总结#
┌────────┐ BtnReg_Click ┌─────────┐
│ Login │ ────────────────► │ Reg │ 注册成功后关窗返回
└────────┘ └─────────┘
│
│ 登录成功
▼
┌────────┐
│ 主窗口 │(Hide 登录窗口)
└────────┘
6. 相关知识点#
| 知识点 | 对应笔记 |
|---|---|
| 多窗体切换 | 05-多窗体与数据传递/01-打开新窗口Show与ShowDialog |
| 窗体间传值 | 05-多窗体与数据传递/02-窗体之间数据传递 |
| 文件读写 | 06-文件与IO操作/04-文本流读写 |
| User 类封装 | 08-面向对象与设计模式/02-封装与访问修饰符 |
| 图书管理系统的完整登录 | 09-项目实战/01-图书管理系统 |
相关笔记#
- File 与 Directory — 文件存储
- Directory 与 DirectoryInfo — 控制台登录注册
- 封装与访问修饰符 — 封装