using HMI.Core.Entity;
using HMI.Core.Setting;
using HMI.Core.Util;
using HMI.UI.DpUtil;
using HMI.UI.Util;
using log4net;
using Panuon.WPF.UI;
using System;
using System.Data;
using System.IO;
using System.Threading.Tasks;
using System.Windows;
using WPFProject.Utils;
using static System.Windows.Forms.VisualStyles.VisualStyleElement.StartPanel;
namespace WPFProject
{
public class LoginException : Exception
{
public LoginException(string message) : base(message)
{
}
}
///
/// Login.xaml 的交互逻辑
///
public partial class Login : WindowX
{
private ILog log;
public Login()
{
log = LogManager.GetLogger("Login");
InitializeComponent();
}
private static readonly Encryptor encryptor = new Encryptor("aB3dE5fG7hI9jjK1lMnOpQrS2tUvWxYz",
"8Wq9RsT4vYx6ZuB1");
private void Button_Click(object sender, RoutedEventArgs e)
{
if (FormGroupHelper.ValidateForm(formPanel))
{
ButtonHelper.SetIsPending(BtnLogin, true);
string username = TbAccount.Text;
string password = PwdPassword.Password;
bool rememberMe = SwRememberMe.IsChecked == true;
Task.Run(() =>
{
DoLogin(username, password, rememberMe);
});
}
}
private void DoLogin(string username, string password, bool rememberMe)
{
SqliteHelper helper = null;
try
{
helper = new SqliteHelper(PathHelper.DatabasePath);
string sql = $"SELECT id,code,username,password,name From user WHERE username='{username}' and password='{password}'";
DataTable dt = helper.GetDataTable(sql);
if (dt == null || dt.Rows.Count <= 0)
{
throw new LoginException(LangUtil.Get("App.ErrorUsernameOrPassword"));
}
UserInfo user = new UserInfo(
dt.Rows[0]["id"].ToString(),
dt.Rows[0]["code"].ToString(),
dt.Rows[0]["username"].ToString(),
dt.Rows[0]["name"].ToString());
UserInfo.Login(user);
if (rememberMe)
{
// 记住登录操作
string userToken =
JsonUtil.Serialize(
new UserInfo(null, user.Code, user.Username, user.Name, dt.Rows[0]["password"].ToString()));
// 存储数据
BinUtil.SaveStrToBin(encryptor.Encrypt(userToken),
Path.Combine(PathHelper.DatabaseFolder, "user.bin"));
}
Dispatcher.Invoke(() =>
{
LoadingWindow loading = new LoadingWindow();
loading.Show();
this.Closed -= window_Closed;
this.Close();
});
}
catch (Exception ex)
{
if (!(ex is LoginException)) log.Error("Login Failed.", ex);
Dispatcher.Invoke(() =>
{
ToastHelper.Error(this, $"{LangUtil.Get("App.LoginFailed")}: {ex.Message}");
});
}
finally
{
Dispatcher.Invoke(() =>
{
ButtonHelper.SetIsPending(BtnLogin, false);
});
}
}
///
/// 渲染完成后,尝试自动登录
///
///
///
private void WindowX_ContentRendered(object sender, EventArgs e)
{
string userToken = string.Empty;
if (BinUtil.LoadStrFromBin(ref userToken, Path.Combine(PathHelper.DatabaseFolder, "user.bin")))
{
userToken = encryptor.Decrypt(userToken);
UserInfo userInfo = JsonUtil.Deserialize(userToken);
TbAccount.Text = userInfo.Username;
PwdPassword.Password = userInfo.Password;
SwRememberMe.IsChecked = true;
Button_Click(null, null);
}
}
private void window_Closed(object sender, EventArgs e)
{
Application.Current.Shutdown();
}
private void SwRememberMe_Unchecked(object sender, RoutedEventArgs e)
{
string path = Path.Combine(PathHelper.DatabaseFolder, "user.bin");
if (File.Exists(path))
{
File.Delete(path);
}
}
}
}