From e3868d4d61ded0e76fc8fe3fdacdd9e6d9113cf1 Mon Sep 17 00:00:00 2001
From: alielie <alielie@git.com>
Date: 星期一, 13 十月 2025 08:50:15 +0800
Subject: [PATCH] 优化HMI;

---
 WPFProject/Login.xaml.cs |  162 ++++++++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 133 insertions(+), 29 deletions(-)

diff --git a/WPFProject/Login.xaml.cs b/WPFProject/Login.xaml.cs
index 4999c8c..03bc65c 100644
--- a/WPFProject/Login.xaml.cs
+++ b/WPFProject/Login.xaml.cs
@@ -1,19 +1,26 @@
-锘縰sing HMI.Core.Entity;
+锘縰sing 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)
+        public LoginException(string message) : base(message)
         {
         }
     }
@@ -30,6 +37,9 @@
             InitializeComponent();
         }
 
+        private static readonly Encryptor encryptor = new Encryptor("aB3dE5fG7hI9jjK1lMnOpQrS2tUvWxYz",
+            "8Wq9RsT4vYx6ZuB1");
+
         private void Button_Click(object sender, RoutedEventArgs e)
         {
             if (FormGroupHelper.ValidateForm(formPanel))
@@ -37,45 +47,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 +158,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);
+            }
+        }
     }
 }

--
Gitblit v1.9.1