#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
}
}