PCB CS架構(工程系統)實現單點登入方法
社會的不斷進步發展,分工也越來越細了.而我們工作接觸的範圍也越來越狹小了,但這不是倒退了,而是分工之細讓人們在各個方面深耕細作。PCB企業軟體系統發展路線同樣也如此,隨著我們PCB企業發展不斷壯大,軟體系統也在不斷細分。目的只有一個,讓專業的事情交給專業的系統去做。回想當初起公司用必有德ERP,一個ERP能搞定PCB所有業務,從前端銷售管理(銷售訂單,合同評審,客戶資料管理),再到制前工程(MI資料,ECN,開料,鑽孔,排版) ,接著到生產管理(lot卡,投料,過數,MRB報廢),再到品質管理(來料檢查,入庫檢查,出庫檢查,提共大量統計報表,不良原因分析,IQC報表)等等。在當時確實是牛X的,但公司是向前不斷髮展, 業務也變得越來越複雜多變,必有德ERP無法支撐企業發展步伐啊,最終選擇放棄了。必有德ERP的原功能模組被分解到各個新系統中去了。目前PCB企業管理系統被細分為9個系統:
OMS訂單管理系統
EDS工程資料管理系統
APS高階計劃排程系統
MES製造執行系統
檔案網 標籤列印系統
WMS倉儲管理系統
TMS物流運輸管理系統
ERP 企業資源管理系統
HCM人力資源管理系統
有這麼多系統 ,每套系統都有自己獨立的使用者與許可權管理,那問題就來了。假如:一個人如果擁有4個系統使用者許可權帳號,那麼這個使用者需要來來回回在4個系統都輸入一次帳號密碼。這樣使用者體驗肯定是差的。 為了得到改善,OA系統發起單點登入專案,OA作為統一使用者資料源,使用者經過OA統一驗證 ,達到登入OA系統後,通過OA系統能直接啟動並進入其它系統主介面的目的。這裡介紹CS架構(工程系統)實現單點登入方法,即用網頁啟對本地exe的方法。
一.在本機註冊URLProtocol協議
1.手動登錄檔增加URLProtocol協議
可以執行regedit, 在HKEY_CLASSES_ROOT節點按下圖操作:(EDS名稱可以自己定)
1.增加協放名:EDS
2.預設值改為:URL: EDS Protocol Handler
3.增加名稱:URL Protocol 資料值為:啟動的exe路徑
4.在command節點,預設資料改為:“啟動的exe路徑” + “%1”
2.程式碼方式增加URLProtocol協議
/// <summary> /// 註冊協議 /// </summary> /// <param name="Root_Key">根節點</param> /// <param name="file_application_path">應用程式路徑</param> /// <param name="file_application_ico">應用程式開啟圖示,可選值</param> /// <returns></returns> public bool RegeditAdd(string Root_Key, string file_application_path, string file_application_ico) { RegistryKey reg_CurrentUser = Registry.CurrentUser; try { //獲取登錄檔CurrentUser/SOFTWARE/Classes項 RegistryKey reg_Classes = reg_CurrentUser.OpenSubKey("SOFTWARE", true).OpenSubKey("Classes", true); RegistryKey reg_key = reg_Classes.OpenSubKey(Root_Key, true); if (reg_key == null) { RegistryKey reg_sjbs = reg_Classes.CreateSubKey(Root_Key); //新增預設項 reg_sjbs.SetValue("", "URL: " + Root_Key + " Protocol Handler"); //協議別名 reg_sjbs.SetValue("URL Protocol", file_application_path); RegistryKey reg_DefaultIcon = reg_sjbs.CreateSubKey("DefaultIcon"); if (!String.IsNullOrEmpty(file_application_ico) || file_application_ico == "") { //設定自定義圖示 reg_DefaultIcon.SetValue("", file_application_ico); } else { //設定系統定義圖示 reg_DefaultIcon.SetValue("", file_application_path + ",1"); } //撥出處理程式 RegistryKey reg_command = reg_sjbs.CreateSubKey("shell").CreateSubKey("open").CreateSubKey("command"); //%1 表示傳遞的引數,再次%1表示呼叫處顯示連結文字 reg_command.SetValue("", "\"" + file_application_path + "\" \"%1\""); } return true; } catch { return false; } finally { reg_CurrentUser.Close(); } }
介面:
二.exe客戶端程式碼修改
1.將Main入口args引數(帳號密碼)傳給login登入視窗,用於接受瀏覽器傳入工廠,帳號,密碼等引數
2.更改環境變數的當前目錄按如下更改,
Environment.CurrentDirectory = AppDomain.CurrentDomain.BaseDirectory;
static void Main(string[] args) { Environment.CurrentDirectory = AppDomain.CurrentDomain.BaseDirectory;//通過反射開啟form窗體,用瀏覽器開啟,一定要加上此句(啟動程式路徑與本身程式路徑不同,需改為相同) Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadException); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Assembly assembly = Assembly.LoadFrom(ConfigurationManager.AppSettings["StartUpFormDll"]); Form frm = assembly.CreateInstance(ConfigurationManager.AppSettings["StartUpForm"]) as Form; Logger.Instance().Register(); if (args.Length > 0) frm.Tag = args[0];//將引數傳給login視窗, 再到login視窗再將帳號密碼解密後再登入驗證 Application.Run(frm); }
三.瀏覽器網頁開啟
本機網頁測試:引數改為登入系統的帳號密碼,即可點選標籤地址實現啟動本機exe並登入主介面.
在OA系統端使用:使用者登入到OA系統,可通過OA系統的使用者名稱與密碼,並加密後放在href地址中;使用者點選標籤地址即可開啟本地exe
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="author" content="name"> <title>啟動EDS</title> <style> </style> </head> <body> <a href="eds://###Factory###Username###password###">啟動EDS</a> <script></script> </body> </html>
四.在本機刪除URLProtocol協議
1.登錄檔方式刪除URLProtocol協議
執行regedit,如下HKEY_CLASSES_ROOT節點下,找到需要刪除協義名
2.程式碼方式刪除URLProtocol協議
/// <summary> /// 刪除協議 /// </summary> /// <param name="Root_Key">根節點</param> /// <returns></returns> public bool RegeditDelete(string Root_Key) { RegistryKey reg_CurrentUser = Registry.CurrentUser; try { //獲取登錄檔CurrentUser/SOFTWARE/Classes項 RegistryKey reg_Classes = reg_CurrentUser.OpenSubKey("SOFTWARE", true).OpenSubKey("Classes", true); RegistryKey reg_sjbs = reg_Classes.OpenSubKey(Root_Key, true); if (reg_sjbs != null) { reg_Classes.DeleteSubKeyTree(Root_Key); return true; } return false; } catch { return false; } finally { reg_CurrentUser.Close(); } }
介面: