Создание системы регистрации в программе - C#
Формулировка задачи:
Захотелось мне написать/дополнить статью про создание системы авторизации в программе при помощи xml файла. Если статья написана не в том разделе прошу перенести.
Делать мы всё будем на одной форме для простоты обучения. (Самостоятельно вы сможете разделить регистрацию и вход по разным формам). Или же сделать например скрытие одних элементов и появление других черед Panel.
1) Для начала создадим новый проект "Приложение Windows Forms".
2) На данную нам Form1 добавим следующие элементы:
На форме расположены:Добавим пространства имён:
Для того что бы просто было использовать функции Xml и системы файлов.
5) Так же добавим "публичную" переменную defpath для простоты изменения пути к Xml файлу в дальнейшем.
Как видно ей присвоено значение имени файла, но вы можете прописать путь например "C:/users.xml" для того чтобы данный файл создавался в нужной вам папке, а не рядом с программой.
6) Создадим событие создания xml файла:
7) В Form1_load который мы попадали ранее, (для того что бы создать xml файл если его ещё нет) добавим:
8) Теперь нам необходимо добавить событие для нахождения свободного ID пользователя. Расскажу о нём чуть позже:
9) Раз уж мы теперь можем вычислить ID нового пользователя то можно добавить событие регистрации нового пользователя:
О нём я расскажу немного подробнее. Мы снова проверяем есть ли xml файл (простое избегание ошибок - вдруг файл был удалён во время работы программы). В xml добавляем нового пользователя с номером (номер мы получаем из события созданного ранее).
10) Далее вернёмся в конструктор и добавим событие для кнопки регистрации (двойной щелчок по ней в конструкторе):
Тут мы на всякий случай проверяем не пусты ли текстовые поля с логином и паролем.
Можно попробовать запустить программу и протестировать запись xml файла, он должен получится таким (я вводил сначала пользователя yura097 с паролем 12345, а затем пользователя admin с паролем parol):
Как мы видим программа создала 2 записи с разными ID и записала в них наши данные.
11) Если у вас всё получилось то можно приступить к созданию события входа:
В данном событии мы сравниваем наши сточки из полей логина и пароля с входа со всеми пользователями в нашем xml файле. Если пользователь найдет то будет выведено сообщение "Успешный вход". Если же пользователь не найден и список пользователей закончен то будет выведено сообщение "Неверный логин и пароль". Конечно же вместо сообщения "Успешный вход" можно открывать другую форму и так далее.
12) Конечно же нужно не забыть вернуться в конструктор и создать событие для кнопки входа:
Собственно всё. На самом "простом уровне" наша система для входа в программу готова.
Вот на всякий случай полный код программы:
Конечно же тут нет например "запоминания пароля" или "удаления пользователя". Так же отсутствует какое либо шифрование. Но возможно я расскажу вам об этом в дальнейшем. Да и в принципе вы сможете сделать всё это сами.
Для определённой красоты можно элементы входа и регистрации поместить на панели и сделать дополнительно кнопку "регистрации", а на панели с регистрацией "отмена" и "ок". Ну в общем это всё ваша фантазия.
Вы можете для красоты в текстовых полях пароля включить свойство UseSystemPasswordChar для скрытия пароля при вводе.
Вообщем пора остановиться ибо "добавлять" можно бесконечно.
Спасибо за прочтение, об ошибках конечно же сообщайте. Так же возможно о способах оптимизации.
- Текстовые поля loginenbox и passenbox для входа
- Текстовые поля loginregbox и passregbox для регистрации.
- Так же для понятности 4 label (логин и пароль)x2.
- Кнопки enterbutton и registerbutton для входа и регистрации соответственно.
using System;
using System.IO; using System.Xml;
public string defpath = "users.xml";
private void CreateXMLDocument(string filepath) //создание xml файла { XmlTextWriter xtw = new XmlTextWriter(filepath, Encoding.UTF32); xtw.WriteStartDocument(); xtw.WriteStartElement("users"); xtw.WriteEndDocument(); xtw.Close(); }
private void Form1_Load(object sender, EventArgs e) { if (!File.Exists(defpath)) CreateXMLDocument(defpath); }
private string MaxID(string filepath) //вычисление max id { List<int> idList = new List<int>(); int id; XmlDocument xd = new XmlDocument(); FileStream fs = new FileStream(filepath, FileMode.Open); xd.Load(fs); XmlNodeList list = xd.GetElementsByTagName("user"); if (list.Count > 0) { for (int i = 0; i < list.Count; i++) { XmlElement user = (XmlElement)xd.GetElementsByTagName("user")[i]; id = Convert.ToInt32(user.GetAttribute("id")); idList.Add(id); } int result = 0; foreach (int j in idList) if (j > result) result = j; result++; fs.Close(); return result.ToString(); } else { fs.Close(); return "1"; } }
private void WriteToXMLDocument(string filepath, string name, string pwd) //добавление записи { if (!File.Exists(defpath)) CreateXMLDocument(defpath); string id = MaxID(filepath); XmlDocument xd = new XmlDocument(); FileStream fs = new FileStream(filepath, FileMode.Open); xd.Load(fs); XmlElement user = xd.CreateElement("user"); user.SetAttribute("id", id); XmlElement login = xd.CreateElement("login"); XmlElement pass = xd.CreateElement("password"); XmlText tLogin = xd.CreateTextNode(name); XmlText tPassword = xd.CreateTextNode(pwd); login.AppendChild(tLogin); pass.AppendChild(tPassword); user.AppendChild(login); user.AppendChild(pass); xd.DocumentElement.AppendChild(user); fs.Close(); xd.Save(filepath); }
private void registerbutton_Click(object sender, EventArgs e) { if (!(loginregbox.Text == "") & !(passregbox.Text == "")) WriteToXMLDocument(defpath, loginregbox.Text, passregbox.Text); else MessageBox.Show("Введите имя пользователя и пароль"); }
<?xml version="1.0" encoding="utf-32"?> <users> <user id="1"> <login>yura097</login> <password>12345</password> </user> <user id="2"> <login>admin</login> <password>parol</password> </user> </users>
private void ReadXMLDocument(string filepath, string loget, string passget) { string name, pwd; XmlDocument xd = new XmlDocument(); FileStream fs = new FileStream(filepath, FileMode.Open); xd.Load(fs); XmlNodeList list = xd.GetElementsByTagName("user"); for (int i = 0; i < list.Count; i++) { XmlElement user = (XmlElement)xd.GetElementsByTagName("login")[i]; XmlElement pass = (XmlElement)xd.GetElementsByTagName("password")[i]; name = user.InnerText; pwd = pass.InnerText; if ((loget == name) & (passget == pwd)) { MessageBox.Show("Успешный вход"); break; } else if (i == list.Count - 1) MessageBox.Show("Неверный логин или пароль"); } fs.Close(); }
private void enterbutton_Click(object sender, EventArgs e) { if (!(loginenbox.Text == "") & !(passenbox.Text == "")) { ReadXMLDocument(defpath, loginenbox.Text, passenbox.Text); } }
using System; using System.IO; using System.Xml; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace WindowsFormsApplication8 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } public string defpath = "users.xml"; private void Form1_Load(object sender, EventArgs e) { if (!File.Exists(defpath)) CreateXMLDocument(defpath); } private void CreateXMLDocument(string filepath) //создание xml при запуске { XmlTextWriter xtw = new XmlTextWriter(filepath, Encoding.UTF32); xtw.WriteStartDocument(); xtw.WriteStartElement("users"); xtw.WriteEndDocument(); xtw.Close(); } private string MaxID(string filepath) //вычисление max id { List<int> idList = new List<int>(); int id; XmlDocument xd = new XmlDocument(); FileStream fs = new FileStream(filepath, FileMode.Open); xd.Load(fs); XmlNodeList list = xd.GetElementsByTagName("user"); if (list.Count > 0) { for (int i = 0; i < list.Count; i++) { XmlElement user = (XmlElement)xd.GetElementsByTagName("user")[i]; id = Convert.ToInt32(user.GetAttribute("id")); idList.Add(id); } int result = 0; foreach (int j in idList) if (j > result) result = j; result++; fs.Close(); return result.ToString(); } else { fs.Close(); return "1"; } } private void WriteToXMLDocument(string filepath, string name, string pwd) //добавление записи { if (!File.Exists(defpath)) CreateXMLDocument(defpath); string id = MaxID(filepath); XmlDocument xd = new XmlDocument(); FileStream fs = new FileStream(filepath, FileMode.Open); xd.Load(fs); XmlElement user = xd.CreateElement("user"); user.SetAttribute("id", id); XmlElement login = xd.CreateElement("login"); XmlElement pass = xd.CreateElement("password"); XmlText tLogin = xd.CreateTextNode(name); XmlText tPassword = xd.CreateTextNode(pwd); login.AppendChild(tLogin); pass.AppendChild(tPassword); user.AppendChild(login); user.AppendChild(pass); xd.DocumentElement.AppendChild(user); fs.Close(); xd.Save(filepath); } private void registerbutton_Click(object sender, EventArgs e) { if (!(loginregbox.Text == "") & !(passregbox.Text == "")) WriteToXMLDocument(defpath, loginregbox.Text, passregbox.Text); else MessageBox.Show("Введите имя пользователя и пароль"); } private void ReadXMLDocument(string filepath, string loget, string passget) { string name, pwd; XmlDocument xd = new XmlDocument(); FileStream fs = new FileStream(filepath, FileMode.Open); xd.Load(fs); XmlNodeList list = xd.GetElementsByTagName("user"); for (int i = 0; i < list.Count; i++) { XmlElement user = (XmlElement)xd.GetElementsByTagName("login")[i]; XmlElement pass = (XmlElement)xd.GetElementsByTagName("password")[i]; name = user.InnerText; pwd = pass.InnerText; if ((loget == name) & (passget == pwd)) { MessageBox.Show("Успешный вход"); break; } else if (i == list.Count - 1) MessageBox.Show("Неверный логин или пароль"); } fs.Close(); } private void enterbutton_Click(object sender, EventArgs e) { if (!(loginenbox.Text == "") & !(passenbox.Text == "")) { ReadXMLDocument(defpath, loginenbox.Text, passenbox.Text); } } } }
Решение задачи: «Создание системы регистрации в программе»
textual
Листинг программы
<TextBox Name="PasswordTb" Margin="5" HorizontalAlignment="Center" MinWidth="200"/>
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д