alielie
2026-04-23 ef52fd6fd07508883dce4eb002acda59f0169e59
WPFProject/Login.xaml.cs
@@ -1,19 +1,25 @@
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.Media.Imaging;
using System.Windows.Threading;
using WPFProject.Utils;
namespace WPFProject
{
    public class LoginException : Exception
    {
        public LoginException(string message):base(message)
        public LoginException(string message) : base(message)
        {
        }
    }
@@ -28,7 +34,12 @@
        {
            log = LogManager.GetLogger("Login");
            InitializeComponent();
            logoImage.Source = new BitmapImage(new Uri(Path.Combine(PathHelper.IconFolder,
                    SystemSetting.Instance.LoginLogoPath ?? "LoginLogo.png")));
        }
        private static readonly Encryptor encryptor = new Encryptor("aB3dE5fG7hI9jjK1lMnOpQrS2tUvWxYz",
            "8Wq9RsT4vYx6ZuB1");
        private void Button_Click(object sender, RoutedEventArgs e)
        {
@@ -37,45 +48,106 @@
                ButtonHelper.SetIsPending(BtnLogin, true);
                string username = TbAccount.Text;
                string password = PwdPassword.Password;
                bool rememberMe = SwRememberMe.IsChecked == true;
                Task.Run(() =>
                {
                    DoLogin(username, password);
                    DoLogin(username, password, rememberMe);
                });
            }
            //try
            //{
            //}
            //finally {
            //    ButtonHelper.SetIsPending(BtnLogin, false);
            //}
        }
        private void DoLogin(string username, string password)
        private List<PermissionData> SelectPermission(string username, SqliteHelper sqliteHelper, out List<PermissionData> allPermission)
        {
            SqliteHelper helper = null;
            List<PermissionData> data = new List<PermissionData>();
            allPermission = new List<PermissionData>();
            Dictionary<string, PermissionData> cache = new Dictionary<string, PermissionData>();
            try
            {
                helper = new SqliteHelper(PathHelper.DatabasePath);
                string sql = $"SELECT id,username,name From user WHERE username='{username}' and password='{password}'";
                DataTable dt = helper.GetDataTable(sql);
                if (dt == null || dt.Rows.Count <= 0)
                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)
                {
                    throw new LoginException(LangUtil.Get("App.ErrorUsernameOrPassword"));
                    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);
                        }
                    }
                }
                UserInfo user = new UserInfo(
                    dt.Rows[0]["id"].ToString(),
                    dt.Rows[0]["username"].ToString(),
                    dt.Rows[0]["name"].ToString());
                UserInfo.Login(user);
                Dispatcher.Invoke(() =>
            }
            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))
                {
                    LoadingWindow loading = new LoadingWindow();
                    loading.Show();
                    this.Close();
                });
                    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<PermissionData> permissions = SelectPermission(username, helper, out List<PermissionData> 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)
            {
@@ -87,11 +159,44 @@
            }
            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);
            }
        }
    }
}