alielie
2025-11-21 3a471ae651b228231bebb3a2d438baa1d4ac0261
WPFProject/Login.xaml.cs
@@ -1,4 +1,5 @@
using HMI.Core.Entity;
using HMI.Base;
using HMI.Core.Entity;
using HMI.Core.Setting;
using HMI.Core.Util;
using HMI.UI.DpUtil;
@@ -6,10 +7,12 @@
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;
@@ -52,43 +55,98 @@
            }
        }
        private void DoLogin(string username, string password, bool rememberMe)
        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,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"));
                }
                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;";
                Dispatcher.Invoke(() =>
                DataTable dt = sqliteHelper.GetDataTable(sql);
                if (dt != null)
                {
                    LoadingWindow loading = new LoadingWindow();
                    loading.Show();
                    this.Closed -= window_Closed;
                    this.Close();
                });
                    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<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)
            {
@@ -100,6 +158,7 @@
            }
            finally
            {
                Dispatcher.Invoke(() =>
                {
                    ButtonHelper.SetIsPending(BtnLogin, false);