社会的不断进步发展,分工也越来越细了.而我们工作接触的范围也越来越狭小了,但这不是倒退了,而是分工之细让人们在各个方面深耕细作。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 > )
frm.Tag = args[];//将参数传给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(); }
}

界面:

PCB CS架构(工程系统)实现单点登入方法的更多相关文章

  1. CAS实现单点登入(sso)经典教程

    本教程我已按照步骤实现,不过要深入了解单点登入还需要进一步的学习,掌握其中的精髓. 一.简介 1.cas是有耶鲁大学研发的单点登录服务器 2.本教材所用环境 Tomcat7.2 JDK6 CAS Se ...

  2. springmvc shiro整合cas单点登入

    shiro cas分为登入跟登出 maven依赖: <dependency> <groupId>org.apache.shiro</groupId> <art ...

  3. Spring Boot SSO单点登入

    https://github.com/ITDragonBlog/daydayup/tree/master/SpringBoot-SSO 流程图: 1: Redis 保存用户信息 到Redis(KEY- ...

  4. jwt单点登入

    主要有以下三步:   项目一开始我先封装了一个JWTHelper工具包(GitHub下载),主要提供了生成JWT.解析JWT以及校验JWT的方法,其他还有一些加密相关操作.工具包写好后我将打包上传到私 ...

  5. 源代码解读Cas实现单点登出(single sign out)功能实现原理

    关于Cas实现单点登入(single sing on)功能的文章在网上介绍的比较多,想必大家多多少少都已经有所了解,在此就不再做具体介绍.如果不清楚的,那只能等我把single sign on这块整理 ...

  6. 源代码解读Cas实现单点登出(single sign out)功能实现原理--转

    关于Cas实现单点登入(single sing on)功能的文章在网上介绍的比较多,想必大家多多少少都已经有所了解,在此就不再做具体介绍.如果不清楚的,那只能等我把single sign on这块整理 ...

  7. python编辑用户登入界面

    1.需求分析 登入界面需要达到以下要求: 系统要有登入和注册两个选项可供选择 系统要能够实现登入出错提示,比如账户密码错误等,用户信息保存在user_info.txt文件夹中 系统要能够进行登入错误次 ...

  8. Oracle+struts2实现用户登入并显示访问次数

    实体类: package entity; public class userfo { private int id;//id private String name;//用户名 private Str ...

  9. PCB 工程系统 模拟windows域帐号登入

    一.需求描述: 对于PCB制造企业来说,基本都采用建立共享目享+域名管控权限,好像别的大多数行业都是这样的吧.呵呵 在实际应用中,经常会有这样的问题,自己登入的帐号没有共享目录的权限,但又想通过程序实 ...

随机推荐

  1. idea必选配置

    参考: IDEA配置

  2. 3.2.2.5 BRE运算符优先级

        在数学表达式里,正则表达式的运算符具有某种已定义的优先级,指的是某个运算符(优先级较高)将比其他运算符先被处理.       BRE运算符优先级,由高至低   运算符 表示含义 [..] [= ...

  3. 如何使用loadrunner进行web网站性能测试

    loadrunner压力测试原理 本质就是在loadrunner上模拟多个用户同时按固定行为访问web站点.其中固定行为在loadrunner中是通过录制脚本定义的,多个用户同时访问的策略是在load ...

  4. lombok 插件安装

    1. 下载地址: https://plugins.jetbrains.com/plugin/6317-lombok-plugin 2. 选择从本地安装.

  5. git命令大杂烩

    查看版本库中的文件: git ls-files添加到暂存区: git add filesName|\folderName(循环递归) git add .(添加当前目录下的所有文件包括子目录,如果添加文 ...

  6. nyoj 95 众数问题(set)

    众数问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 所谓众数,就是对于给定的含有N个元素的多重集合,每个元素在S中出现次数最多的成为该元素的重数, 多重集合S重 ...

  7. nyoj 19 擅长排列的小明(深搜,next_permutation)

    擅长排列的小明 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 小明十分聪明,而且十分擅长排列计算.比如给小明一个数字5,他能立刻给出1-5按字典序的全排列,如果你想 ...

  8. Error:java: Internal compiler error: java.lang.Exception: java.lang.NoClassDefFoundError解决

    场景:将Eclipse的可以运行的项目转到IDEA发现一个奇怪的错误 今天用IDEA2018.1运行SpringBoot项目报错如下: Error:java: Internal compiler er ...

  9. 使用AtomicInteger原子类代替i++线程安全操作

    Java中自增自减操作不具原子性,在多线程环境下是线程不安全的,可以使用使用AtomicInteger原子类代替i++,i--操作完成多线程线程安全操作. 下面是等于i++多线程的自增操作代码: pu ...

  10. - > 动规讲解基础讲解一——01背包(模板)

    作为动态规划的基础,01背包的思想在许多动规问题中会经常出现,so,熟练的掌握01背包的思路是极其重要的: 有n件物品,第i件物品(I = 1,2,3…n)的价值是vi, 重量是wi,我们有一个能承重 ...