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); } } } }