#region using System; using System.ComponentModel; using System.Configuration; using System.Data; using System.IO; using System.Windows.Forms; using CSFramework.Library.CommonClass; using CSFrameworkV5.Business; using CSFrameworkV5.Business.BLL_Permission; using CSFrameworkV5.Common; using CSFrameworkV5.Core; using CSFrameworkV5.Core.Common; using CSFrameworkV5.Core.SystemSecurity; using CSFrameworkV5.Language; using CSFrameworkV5.Library.CommonClass; using CSFrameworkV5.Library.PermissionForms; #endregion ///*************************************************************************/ ///* 文件名 :frmLogin.cs ///* 程序说明 : 登录窗体,登录成功后加载MDI主窗体,并显示加载进度。 ///* 原创作者 :www.csframework.com ///* Copyright 2006-2021 C/S框架网 www.csframework.com ///**************************************************************************/ namespace CSFrameworkV5.Library.Entry { /// /// 登录窗体 /// public partial class frmLogin : frmBase { private LoginSystemAuth _CurrentAuthorization; //登录策略接口 private LoginAuthType _LoginAuthType; //当前授权模式 /// /// 获取当前用户的账套资料,绑定数据源。 /// /// 用户账号 /// 登录密码 /// private bool BindingDataSet(string user, string pwd) { var password = KeyProvider.Default.Encrypt(pwd); /*常规加密*/ var data = CommonData.GetSystemDataSet(user, password); DataBinder.BindingLookupEditDataSource(txtDataset, data, "DataSetName", "DataSetID"); return data.Rows.Count > 0; } private void btnCancel_Click(object sender, EventArgs e) { if (Msg.AskQuestion(LanLib.Get("确定要退出系统吗?"))) { frmMain1.IsClosing = true; Application.Exit(); } } private void btnLogin_Click(object sender, EventArgs e) { try { txtUser.Focus(); SetButtonEnable(false); Update(); //必须 ShowLoginInfo(LanLib.Get("正在验证用户名及密码...")); bllUser.ValidateLogin(txtUser.Text, txtPwd.Text); //检查登录文本信息 var loginUser = GetLoginUser(); if (_CurrentAuthorization.Login(loginUser)) //调用登录策略 { //重新加载系统参数类 var data = CommonData.GetSystemSettings4Program( Loginer.CurrentUser.DBID, Loginer.CurrentUser.Account); //系统配置 SystemSettings.Current.Load(data); //跟据选项保存登录信息 if (chkSaveLoginInfo.Checked) SaveLoginInfo(); //获取当前用户的权限 var bridge = BridgeFactory.CreateUserBridge(); var table = bridge.GetUserActionsList(loginUser.Account); SystemAuthentication.UserAuthorities = table; //获取其它公共数据 CommonData.GetCommonInfos(); ShowLoginInfo(LanLib.Get("正在获取最新版本...")); //更新数据库最新DLL(开发者不更新版本) var bridgeT = BridgeFactory.CreateCommonDataBridge(); var UpgraderName = bridgeT.GetUpgraderVersionData(); //不注释时使用线上代码,注释时使用本地代码 //foreach (DataRow dr in UpgraderName.Rows) //{ // if (dr["upgraderName"].ToStringEx().Contains("CSF")) // { // string PathT = Application.StartupPath + "\\" + dr["upgraderName"].ToStringEx(); // if (Directory.Exists(PathT)) // { // FileAttributes attr = File.GetAttributes(PathT); // if (attr == FileAttributes.Directory) // { // Directory.Delete(PathT, true); // 3.1、删除文件夹 // } // else // { // File.Delete(PathT);// 3.2、删除文件 // } // } // try // { // File.Delete(PathT);// 3.2、删除文件 // } // catch (Exception) // { // continue; // } // string Version = bridgeT.GetUpgraderVersion(dr["upgraderName"].ToStringEx()); // byte[] by = bridgeT.GetUpgrader(dr["upgraderName"].ToStringEx(), Version); // //写入到临时文件 // var tmpFile = Path.Combine(Application.StartupPath, // dr["upgraderName"].ToStringEx()); // File.WriteAllBytes(tmpFile, by); // } //} ShowLoginInfo(LanLib.Get("已更新至最新版本...")); //初始化日志系统 InitLog(); //登录成功创建主窗体 MdiTools.MainForm = new frmMain1(); (MdiTools.MainForm as frmMain1).InitUserInterface( new LoadStatus(lblLoadingInfo)); DialogResult = DialogResult.OK; //成功 Close(); //关闭登陆窗体 } else { ShowLoginInfo(LanLib.Get("登录失败,请检查用户名和密码!")); Msg.Warning(LanLib.Get("登录失败,请检查用户名和密码!")); } } catch (CustomException ex) { //写入本地文件日志-系统异常日志 LogLocalException.Log.WriteLog(LogTypeSystem.Exception, ex.Message); SetButtonEnable(true); ShowLoginInfo(ex.Message); Msg.Warning(ex.Message); } catch (Exception ex) { //写入本地文件日志-系统异常日志 LogLocalException.Log.WriteLog(LogTypeSystem.Exception, ex.Message); SetButtonEnable(true); ShowLoginInfo(LanLib.Get("登录失败,请检查用户名和密码!")); Msg.Warning(LanLib.Get("登录失败,请检查用户名和密码!") + "\r\n" + ex.Message); } } private void btnModifyPwd_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { try { Hide(); var user = new LoginUser(); user.Account = txtUser.Text; user.DBID = txtDataset.EditValue.ToStringEx(); frmModifyPwd.Execute(user, ModifyPwdType.LoginWindowDirect, this); } finally { Show(); } } /// /// 清除登录信息 /// private void ClearLoginInfo() { UserConfig.Current.Password = ""; UserConfig.Current.IsSaveLoginInfo = chkSaveLoginInfo.Checked; UserConfig.Current.Save(); } /// /// 获取帐套数据库名称 /// /// private string GetDataSetDBName() { var view = (DataRowView)txtDataset.Properties.GetDataSourceRowByKeyValue( txtDataset.EditValue); return ConvertEx.ToString(view.Row["DBName"]); } /// /// 创建登录使用的对象 /// /// private LoginUser GetLoginUser() { var loginUser = new LoginUser(); loginUser.Account = txtUser.Text; loginUser.Password = KeyProvider.Default.Encrypt(txtPwd.Text); /*常规加密*/ loginUser.DBID = txtDataset.EditValue.ToStringEx(); //帐套编号 loginUser.DBName = GetDataSetDBName(); loginUser.IP = NetTools.GetLocalIP(); loginUser.MAC = NetTools.GetLocalMac(); loginUser.LoginAuthType = _LoginAuthType; return loginUser; } /// /// 初始化日志系统 /// private void InitLog() { //清空日志对象 LogUserOperate.Logs.Clear(); //注册本地日志对象 if (SystemSettings.Current.AllowLocalLog) { var logFile = Application.StartupPath + Globals.DEF_LOCAL_LOG; LogUserOperate.RegisteLog(new LogLocalException(logFile)); } //注册数据库日志 if (SystemSettings.Current.AllowDBLog) LogUserOperate.RegisteLog(new DBLog()); } /// /// 初始化登陆窗体, 创建登录策略 /// private void InitLoginWindow() { try { ReadLoginInfo(); //绑定语言类型数据源 var data = DataDictCache.Cache.LanguageType.Copy(); DataBinder.BindingLookupEditDataSource(txtLan, data, "LanName", "LanType"); //有保存登录信息,自动显示帐套。 if (txtUser.Text != "" && txtPwd.Text != "" && ConvertEx.ToString(txtDataset.EditValue) != "") BindingDataSet(txtUser.Text, txtPwd.Text); SystemAuthentication.Current = null; _CurrentAuthorization = new LoginSystemAuth(); _LoginAuthType = SystemSettings.Current.LoginAuthType; //系统设置 //重新设置语言 txtLan.EditValue = UserConfig.Current.LanguageID; if (ConvertEx.ToString(txtLan.EditValue) != "") txtLan_EditValueChanged_1(txtLan, new EventArgs()); //btnModifyPwd.Visible = !SystemSettings.Current.IsDemoVersion; } catch (Exception ex) { //写入本地文件日志-系统异常日志 LogLocalException.Log.WriteLog(LogTypeSystem.Exception, ex.Message); Msg.ShowException(ex); } } /// /// 显示登陆窗体.(公共静态方法) /// public static bool Login() { var form = new frmLogin(); var result = form.ShowDialog(); var ret = result == DialogResult.OK && SystemAuthentication.Current != null; return ret; } /// /// 从配置文件读取上次登录的信息 /// private void ReadLoginInfo() { txtUser.Text = UserConfig.Current.User; txtDataset.EditValue = UserConfig.Current.DBID; txtPwd.Text = UserConfig.Current.Password; chkSaveLoginInfo.Checked = UserConfig.Current.IsSaveLoginInfo; txtLan.EditValue = UserConfig.Current.LanguageID; } /// /// 保存本次登录信息 /// private void SaveLoginInfo() { UserConfig.Current.User = txtUser.Text; UserConfig.Current.DBID = txtDataset.EditValue.ToStringEx(); UserConfig.Current.Password = txtPwd.Text; UserConfig.Current.IsSaveLoginInfo = chkSaveLoginInfo.Checked; UserConfig.Current.LanguageID = txtLan.EditValue.ToStringEx(); UserConfig.Current.Save(); } /// /// 设置按钮状态 /// /// private void SetButtonEnable(bool value) { btnLogin.Enabled = value; btnCancel.Enabled = value; btnLogin.Update(); btnCancel.Update(); } public override void SetLanguage() { base.SetLanguage(); //若是直连模式,显示数据库类型 if (BridgeFactory.BridgeType == BridgeType.ADODirect) { var api = BridgeFactory.GetConfigInterface(); var ip = api.ServerName == "." ? "localhost" : api.ServerName; lblBridgetype.Text = $"ADO-DIRECT: ({api.DatabaseType}->{ip})"; } if (BridgeFactory.BridgeType == BridgeType.WindowsService) { //http://localhost:32641/CommonService.svc var url = ConfigurationManager.AppSettings["ICommonService"]; var root = url.Split(new[] { "//", "/" }, StringSplitOptions.RemoveEmptyEntries)[1]; lblBridgetype.Text = "WCF->" + root; } //显示版本号 lbVersion.Text = Globals.DEF_PROGRAM_VERSION; //若注释掉以下代码,必须在【多语言管理】界面修改界面的标题 //方式1:窗体标题写死, 方式2:在【多语言管理】界面修改界面的标题 //C/S系统快速开发框架-旗舰版 V5.1(2021) Text = LanLib.Get(Globals.DEF_PROGRAM_NAME) + Globals.DEF_PROGRAM_VERSION; } /// /// 显示状态信息 /// /// private void ShowLoginInfo(string info) { lblLoadingInfo.Text = info; lblLoadingInfo.Update(); } private void txtDataset_QueryPopUp(object sender, CancelEventArgs e) { //下栏帐套,获取当前用户的帐套 if (txtUser.Text.Trim() == "") { txtUser.Focus(); e.Cancel = true; } else { var success = BindingDataSet(txtUser.Text.Trim(), txtPwd.Text.Trim()); if (!success) Msg.Warning(LanLib.Get("加载帐套数据失败!") + "\r\n" + LanLib.Get("错误原因:1.用户名或密码错误 2.用户没有帐套权限")); } } private void txtLan_EditValueChanged_1(object sender, EventArgs e) { LanguageType lan; var ok = Enum.TryParse(ConvertEx.ToString(txtLan.EditValue), out lan); if (ok) { UserConfig.Current.LanguageID = txtLan.EditValue.ToStringEx(); UserConfig.Current.Save(); LanLib.Current = lan; SetLanguage(); } } private void txtPwd_KeyPress(object sender, KeyPressEventArgs e) { if (e.KeyChar == (char)Keys.Enter) { btnLogin.Focus(); e.Handled = true; e.KeyChar = (char)Keys.None; } } private void txtUser_EditValueChanged(object sender, EventArgs e) { txtPwd.Text = ""; } #region 窗体构造器,事件 /// /// 私有构造器 /// private frmLogin() { InitializeComponent(); //API函数加载,实现窗体边框阴影效果 WinAPI.SetClassLong(Handle, WinAPI.GCL_STYLE, WinAPI.GetClassLong(Handle, WinAPI.GCL_STYLE) | WinAPI.CS_DropSHADOW); //拖拽窗体通用类 FormDragDrop.Handle(this); } private void frmLogin_Load(object sender, EventArgs e) { InitLoginWindow(); //初始化登陆窗体 } private void frmLogin_Shown(object sender, EventArgs e) { Activate(); Focus(); } #endregion } }