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)
|
{
|
}
|
}
|
|
/// <summary>
|
/// Login.xaml 的交互逻辑
|
/// </summary>
|
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);
|
});
|
}
|
}
|
|
/// <summary>
|
/// 渲染完成后,尝试自动登录
|
/// </summary>
|
/// <param name="sender"></param>
|
/// <param name="e"></param>
|
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<UserInfo>(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);
|
}
|
}
|
}
|
}
|