zoukankan      html  css  js  c++  java
  • 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(); }
            }

                界面:

              

  • 相关阅读:
    用Delphi创建windows服务程序
    如何把程序手工添加系统服务
    http://www.ebooksearchengine.com/albpmpapiebookall.html
    C语言函数二维数组传递方法
    计算程序运行时间(C语言)
    快排序(递归算法)
    厄拉多塞筛(C语言)
    C语言中实现数组的动态增长
    [转]四种流行的Javascript框架jQuery,Mootools,Dojo,ExtJS的对比
    [存档]使用.Net开发web程序时现在比较流行的前台技术都有什么?
  • 原文地址:https://www.cnblogs.com/pcbren/p/9912322.html
Copyright © 2011-2022 走看看