using HMI.Base;
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.Collections.Generic;
using System.Data;
using System.IO;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Threading;
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 List SelectPermission(string username, SqliteHelper sqliteHelper, out List allPermission)
{
List data = new List();
allPermission = new List();
Dictionary cache = new Dictionary();
try
{
string sql = $@"SELECT DISTINCT m.* FROM menu AS m INNER JOIN role_menu_rel AS rrel ON m.code = rrel.menuCode
INNER JOIN role AS r ON rrel.roleCode = r.code
INNER JOIN user_role_rel AS urel ON r.code = urel.roleCode
AND urel.username = '{username}' ORDER BY m.level,m.sort, m.id;";
DataTable dt = sqliteHelper.GetDataTable(sql);
if (dt != null)
{
foreach (DataRow dr in dt.Rows)
{
string path = Path.Combine(PathHelper.IconFolder, dr["iconPath"].ToString());
var menu = new PermissionData
{
Code = dr["code"].ToString(),
Name = dr["name"].ToString(),
Type = dr["type"].ToString(),
ParentCode = dr["parentCode"].ToString(),
DllPath = dr["dllPath"].ToString(),
ClassName = dr["className"].ToString(),
IconFont = dr["icon"].ToString()
};
cache[menu.Code] = menu;
allPermission.Add(menu);
if (!cache.ContainsKey(menu.ParentCode))
{
data.Add(menu);
}
else
{
cache[menu.ParentCode].Children.Add(menu);
}
}
}
}
catch (Exception ex)
{
//LoadMessageAppend?.Invoke(this, ex.Message);
}
return data;
}
private void DoLogin(string username, string password, bool rememberMe)
{
try
{
using (SqliteHelper 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"));
}
List permissions = SelectPermission(username, helper, out List allPermission);
UserInfo user = new UserInfo(
dt.Rows[0]["id"].ToString(),
dt.Rows[0]["code"].ToString(),
dt.Rows[0]["username"].ToString(),
dt.Rows[0]["name"].ToString(),
permissions,
allPermission,
dt.Rows[0]["password"].ToString()
);
UserInfo.Login(user);
if (rememberMe)
{
// 记住登录操作
string userToken =
JsonUtil.Serialize(
new UserInfo(null, user.Code, user.Username, user.Name, null, null,
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);
}
}
}
}