Login.cs 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370
  1. using System;
  2. using System.Windows.Forms;
  3. using System.Data;
  4. using UAS_MES_NEW.DataOperate;
  5. using UAS_MES_NEW.Entity;
  6. using UAS_MES_NEW.PublicMethod;
  7. using System.Security.Cryptography.X509Certificates;
  8. using System.Net;
  9. using System.Net.Sockets;
  10. using System.Threading;
  11. using System.Drawing;
  12. using UAS_MES_NEW.Properties;
  13. using UAS_MES_NEW.I18n;
  14. using System.IO;
  15. using System.Net.NetworkInformation;
  16. namespace UAS_MES_NEW
  17. {
  18. public partial class Login : Form
  19. {
  20. DataHelper dh;
  21. //用来保存combox中的数据库信息
  22. DataTable DbComboxData;
  23. //用来保存其他信息
  24. DataTable UserInf;
  25. //注销的时候会重新生成这边变量,所以需要用static
  26. static LogicHandler lgc;
  27. int Close_Size = 24;
  28. Thread LoadMasterInf;
  29. public Login()
  30. {
  31. InitializeComponent();
  32. }
  33. protected override void WndProc(ref Message m)
  34. {
  35. //拦截双击标题栏、移动窗体的系统消息
  36. if (m.Msg != 0xA3)
  37. {
  38. base.WndProc(ref m);
  39. }
  40. }
  41. private void Login_Load(object sender, EventArgs e)
  42. {
  43. BaseUtil.FormStepInOrOut(this, true);
  44. //设置默认数据库
  45. SystemInf.DefaultDB = "Connection Timeout=0;Pooling=false;Password=select!#%*(;User ID=N_MES;Pooling=false;Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=10.8.11.30)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=orcl)));";
  46. SystemInf.ProcessesID = System.Diagnostics.Process.GetCurrentProcess().Id;
  47. CheckForIllegalCrossThreadCalls = false;
  48. LoadMasterInf = new Thread(LoadMaster);
  49. LoadMasterInf.Start();
  50. if (!Directory.Exists(Application.StartupPath + @"\" + DateTime.Now.ToString("yyyy-MM-dd")))
  51. {
  52. Directory.CreateDirectory(Application.StartupPath + @"\" + DateTime.Now.ToString("yyyy-MM-dd"));
  53. }
  54. //SystemInf.OpenByNet = true;
  55. //显示上次用户登录的用户名,将输入框定位到密码
  56. UserName.Text = BaseUtil.GetCacheData("LastLoginUser").ToString();
  57. Source.Text = BaseUtil.GetCacheData("LastLoginResource").ToString();
  58. if (UserName.Text != "")
  59. PassWord.Select();
  60. else
  61. UserName.Select();
  62. BaseUtil.SetFormCenter(this);
  63. SetupLanguageSelector();
  64. LocalizeLogin();
  65. }
  66. private void LoadMaster()
  67. {
  68. try
  69. {
  70. dh = new DataHelper();
  71. //将账套的信息查询出来赋给下拉框
  72. DbComboxData = (DataTable)dh.ExecuteSql("select ms_pwd,ma_user,ma_user||'#'||ma_inneraddress db_user from master", "select");
  73. DB.DataSource = DbComboxData;
  74. DB.DisplayMember = "ma_user";
  75. DB.ValueMember = "db_user";
  76. DB.Text = BaseUtil.GetCacheData("LastLoginSob").ToString();
  77. LoginButton.Enabled = true;
  78. }
  79. catch (Exception ex)
  80. {
  81. MessageBox.Show(ex.Message);
  82. }
  83. }
  84. //点击登陆按钮的时候
  85. private void LoginButton_Click(object sender, EventArgs e)
  86. {
  87. if (DB.SelectedValue == null)
  88. BaseUtil.ShowError(LanguageManager.T("请选择一个数据库!"));
  89. //设置选中数据库的链接
  90. string DBUser = DB.SelectedValue.ToString().Split('#')[0];
  91. string Address = DB.SelectedValue.ToString().Split('#')[1];
  92. DataHelper.DBConnectionString = "Password=select!#%*(;User ID=" + DBUser + ";Pooling=false;Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=10.1.81.208)(PORT=11724)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=orcl)));";
  93. SystemInf.CurrentDB = DBUser;
  94. //设置屏幕的宽高信息
  95. SystemInf.ScreenWidth = Screen.PrimaryScreen.WorkingArea.Width;
  96. SystemInf.ScreenHeight = Screen.PrimaryScreen.WorkingArea.Height;
  97. //重新执行一遍构造函数使得重置之后的链接字符串生效
  98. dh = new DataHelper();
  99. SystemInf.dh = dh;
  100. string ErrorMessage = "";
  101. //验证用户名和密码
  102. if (LogicHandler.CheckUserLogin(UserName.Text, PassWord.Text, DBUser, out ErrorMessage))
  103. {
  104. //验证岗位资源,通过验证开启主窗体
  105. if (LogicHandler.CheckUserAndResourcePassed(UserName.Text, Source.Text, out ErrorMessage))
  106. {
  107. SetInf();//设置User的全局变量
  108. this.Hide();
  109. //记录登陆信息
  110. try
  111. {
  112. string macAddress = "";
  113. foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces())
  114. {
  115. if (nic.OperationalStatus == OperationalStatus.Up)
  116. {
  117. macAddress = nic.GetPhysicalAddress().ToString();
  118. break;
  119. }
  120. }
  121. SystemInf.MacAddress = macAddress;
  122. IPHostEntry IpEntry = Dns.GetHostEntry(Dns.GetHostName());
  123. string IPAddress = "";
  124. for (int i = 0; i < IpEntry.AddressList.Length; i++)
  125. {
  126. if (IpEntry.AddressList[i].AddressFamily == AddressFamily.InterNetwork)
  127. IPAddress = IpEntry.AddressList[i].ToString();
  128. }
  129. string version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString();
  130. LogicHandler.RecordLogInfo(User.UserCode, User.UserName, version, "CS", IPAddress);
  131. }
  132. catch (Exception ex)
  133. {
  134. LogManager.DoLog(ex.Message);
  135. }
  136. LogManager.DoLog("登陆成功" + User.UserName + " " + User.UserAccountType);
  137. Main dialog = new Main();
  138. dialog.ShowDialog();
  139. this.Close();
  140. }
  141. else
  142. MessageBox.Show(ErrorMessage);
  143. }
  144. else
  145. MessageBox.Show(ErrorMessage);
  146. }
  147. /// <summary>
  148. ///设置User类的全局变量,类似于Session
  149. /// </summary>
  150. private void SetInf()
  151. {
  152. //设置全局用户信息
  153. string[] field = { "em_code,em_depart,em_type,em_name,em_position,em_professname,em_type,ug_code,ug_name" };
  154. UserInf = dh.getFieldsDataByCondition("Employee left join cs$userresource on ur_emcode=em_code left join cs$usergroup on ug_code=ur_groupcode", field, "upper(em_code)='" + UserName.Text.ToUpper() + "' or em_mobile='" + UserName.Text.ToUpper() + "'");
  155. DataTable dt = dh.getFieldsDataByCondition("source left join step on sc_stepcode=st_code", new string[] { "st_badgroupcode", "sc_wccode", "sc_code", "sc_stepcode", "sc_stepname", "sc_linecode" }, "upper(sc_code)='" + Source.Text.ToUpper() + "'");
  156. //存在岗位资源则要求添加
  157. if (dt.Rows.Count > 0)
  158. {
  159. User.CurrentStepCode = dt.Rows[0]["sc_stepcode"].ToString();
  160. User.CurrentStepName = dt.Rows[0]["sc_stepname"].ToString();
  161. User.DefaultBadGroup = dt.Rows[0]["st_badgroupcode"].ToString();
  162. User.UserLineCode = dt.Rows[0]["sc_linecode"].ToString();
  163. User.UserSourceCode = dt.Rows[0]["sc_code"].ToString();
  164. User.WorkCenter = dt.Rows[0]["sc_wccode"].ToString();
  165. }
  166. //通过Source表关联岗位资源编号查询出当前的执行工序
  167. User.UserCode = UserInf.Rows[0]["em_code"].ToString();
  168. User.UserDepartment = UserInf.Rows[0]["em_depart"].ToString();
  169. User.UserName = UserInf.Rows[0]["em_name"].ToString();
  170. User.UserPosition = UserInf.Rows[0]["em_position"].ToString();
  171. User.UserProfessName = UserInf.Rows[0]["em_professname"].ToString();
  172. User.UserAccountType = UserInf.Rows[0]["em_type"].ToString();
  173. User.UserGroupCode = UserInf.Rows[0]["ug_code"].ToString();
  174. User.UserGroup = UserInf.Rows[0]["ug_name"].ToString();
  175. //设置系统基础信息
  176. UserInf = (DataTable)dh.ExecuteSql("select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') as systime from dual", "select");
  177. SystemInf.LoginTime = UserInf.Rows[0]["systime"].ToString();
  178. //记录在本地用户成功登录的用户名
  179. BaseUtil.SetCacheData("LastLoginUser", UserName.Text);
  180. BaseUtil.SetCacheData("LastLoginSob", DB.Text);
  181. BaseUtil.SetCacheData("LastLoginResource", Source.Text);
  182. }
  183. private void ForGetPwd_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
  184. {
  185. MessageBox.Show(LanguageManager.T("请联系管理员修改密码"));
  186. }
  187. //用Enter键调用登陆的点击事件
  188. private void Source_KeyDown(object sender, KeyEventArgs e)
  189. {
  190. if (e.KeyCode == Keys.Enter)
  191. LoginButton.PerformClick();
  192. }
  193. private void PassWord_KeyDown(object sender, KeyEventArgs e)
  194. {
  195. if (e.KeyCode == Keys.Enter)
  196. Source.Focus();
  197. }
  198. /// <summary>
  199. /// 导入证书
  200. /// </summary>
  201. private void CertImport()
  202. {
  203. X509Certificate2 cert = new X509Certificate2(Application.StartupPath + @"\Cert\深圳市优软科技有限公司.pfx", "uasmes");
  204. if (cert != null)
  205. {
  206. var store2 = new X509Store(StoreName.My, StoreLocation.CurrentUser);
  207. store2.Open(OpenFlags.ReadWrite);
  208. if (!store2.Certificates.Contains(cert))
  209. {
  210. store2.Add(cert);
  211. }
  212. var store = new X509Store(StoreName.Root, StoreLocation.LocalMachine);
  213. store.Open(OpenFlags.ReadWrite);
  214. if (!store.Certificates.Contains(cert))
  215. {
  216. store.Add(cert);
  217. }
  218. }
  219. }
  220. private void Login_FormClosing(object sender, FormClosingEventArgs e)
  221. {
  222. BaseUtil.FormStepInOrOut(this, false);
  223. try
  224. {
  225. dh.Dispose();
  226. }
  227. catch (Exception)
  228. {
  229. }
  230. }
  231. private void UserName_KeyDown(object sender, KeyEventArgs e)
  232. {
  233. if (e.KeyCode == Keys.Enter)
  234. PassWord.Focus();
  235. }
  236. private void Login_Paint(object sender, PaintEventArgs e)
  237. {
  238. Bitmap image = Resources.dialog_close_24px_1173781_easyicon_net;
  239. Rectangle rect = this.ClientRectangle;
  240. //画关闭符号
  241. using (Pen objpen = new Pen(Color.Black))
  242. {
  243. //使用图片
  244. Bitmap bt = new Bitmap(image);
  245. Point p5 = new Point(Width - Close_Size - 4, 4);
  246. e.Graphics.DrawImage(bt, p5);
  247. }
  248. }
  249. private Point offset;
  250. private void Login_MouseDown(object sender, MouseEventArgs e)
  251. {
  252. if (MouseButtons.Left != e.Button) return;
  253. Point cur = this.PointToScreen(e.Location);
  254. offset = new Point(cur.X - this.Left, cur.Y - this.Top);
  255. Rectangle rect = this.ClientRectangle;
  256. rect.Offset(Width - Close_Size - 4, 4);
  257. rect.Width = Close_Size;
  258. rect.Height = Close_Size;
  259. int x = e.X, y = e.Y;
  260. bool isClose = x > rect.X && x < rect.Right && y > rect.Y && y < rect.Bottom;
  261. if (isClose)
  262. Close();
  263. }
  264. private void Login_MouseMove(object sender, MouseEventArgs e)
  265. {
  266. if (MouseButtons.Left != e.Button) return;
  267. Point cur = MousePosition;
  268. this.Location = new Point(cur.X - offset.X, cur.Y - offset.Y);
  269. }
  270. #region 多语言(全球化)
  271. /// <summary>
  272. /// 在标题栏右侧添加语言选择下拉框,并应用已保存语言。
  273. /// </summary>
  274. private void SetupLanguageSelector()
  275. {
  276. LanguageManager.Initialize();
  277. ComboBox langCombo = new ComboBox();
  278. langCombo.Name = "LangCombo";
  279. langCombo.DropDownStyle = ComboBoxStyle.DropDownList;
  280. langCombo.Font = new System.Drawing.Font("微软雅黑", 9F);
  281. langCombo.BackColor = System.Drawing.SystemColors.Window;
  282. // 防止被 Localize 当作普通控件翻译,避免选择被改写后引发语言来回切换
  283. langCombo.Tag = "NoTranslate";
  284. foreach (var kvp in LanguageManager.SupportedLanguages)
  285. langCombo.Items.Add(kvp.Value);
  286. // syncing=true 期间对 SelectedIndexChanged 的触发(含程序赋值引起)不响应
  287. bool syncing = false;
  288. if (LanguageManager.SupportedLanguages.TryGetValue(LanguageManager.CurrentCulture, out var curName))
  289. {
  290. syncing = true;
  291. try { langCombo.SelectedItem = curName; } finally { syncing = false; }
  292. }
  293. langCombo.Location = new System.Drawing.Point(panel2.Width - 104, 4);
  294. langCombo.Size = new System.Drawing.Size(100, 23);
  295. langCombo.SelectedIndexChanged += (s, e) =>
  296. {
  297. if (syncing) return;
  298. string name = langCombo.SelectedItem?.ToString();
  299. if (string.IsNullOrEmpty(name)) return;
  300. foreach (var kvp in LanguageManager.SupportedLanguages)
  301. {
  302. if (kvp.Value == name)
  303. {
  304. LanguageManager.SetCulture(kvp.Key);
  305. break;
  306. }
  307. }
  308. syncing = true;
  309. try { LocalizeLogin(); } finally { syncing = false; }
  310. };
  311. // 在其它界面切换语言时,同步本下拉框的选中项(不触发切换逻辑)
  312. LanguageManager.LanguageChanged += (s, e) =>
  313. {
  314. syncing = true;
  315. try
  316. {
  317. if (LanguageManager.SupportedLanguages.TryGetValue(LanguageManager.CurrentCulture, out var n)
  318. && !string.Equals(langCombo.SelectedItem?.ToString(), n, StringComparison.Ordinal))
  319. langCombo.SelectedItem = n;
  320. }
  321. finally { syncing = false; }
  322. };
  323. panel2.Controls.Add(langCombo);
  324. }
  325. /// <summary>
  326. /// 将登录窗体上的静态文本切换为当前语言。
  327. /// </summary>
  328. private void LocalizeLogin()
  329. {
  330. // 自动翻译登录窗体其余静态文本(如设计器中其它中文标签/按钮)
  331. LanguageManager.Localize(this);
  332. label1.Text = LanguageManager.T("用户名");
  333. label2.Text = LanguageManager.T("密码");
  334. label4.Text = LanguageManager.T("资源");
  335. label3.Text = LanguageManager.T("数据库");
  336. LoginButton.Text = LanguageManager.T("登录");
  337. ForGetPwd.Text = LanguageManager.T("忘记密码");
  338. label5.Text = LanguageManager.T("优软MES");
  339. }
  340. #endregion
  341. }
  342. }