时间:2024-05-04
胡建飞,焦振峰,张 祥,丁 靖
(1. 中海油能源发展股份有限公司管道工程分公司,天津 300452;2. 海油发展珠海管道工程有限公司,珠海 519000)
管道涂敷是海底管道建设的一个重要组成部分,海油发展珠海管道工程有限公司是一家主要从事海底管道涂敷的企业。在涂敷过程中需要记录大量生产检验数据,在没有计算机技术支持的时代使用纸张记录,造成报表数量繁多,数据无法查询等缺点。
随着计算机技术的引用,数据无法查询慢慢得到改善,初期我们使用单机数据库来记录生产检验数据,但新的问题随之而来:需要配备专门的数据录入人员,查询也只能通过一台电脑。
随着ASP.NET技术的长足发展,B/S模式的网站式软件越来越受到开发者的关注,使用ASP.NET开发新一代的数据跟踪软件成为海油发展珠海管道工程有限公司2017年的科研项目之一。
海洋中的油气田通过管道把油气输送到陆地上,管道由钢管建造,钢管要在海水中能够长期使用,必须要在钢管表面涂一层防腐层,现在常用的工艺叫做三层结构聚乙烯防腐涂层,简写做3LPE。另外一种防腐的工艺是安装牺牲阳极,即在钢管通过导线连接一定重量的铝块,钢管和铝块构成原电池,通过不断腐蚀阳极铝块的方式来保护钢管。
钢管是中空的,整体比重和海水相差不大,为了能让钢管稳定的沉在海底,需要在钢管外部加一层混凝土涂层,增大钢管的整体比重。
钢管涂敷的第一步工序是接收钢管,钢管检验合格后可进行3LPE、安装阳极、配重等各道涂敷工序,涂敷完成后进行发运,所有的步骤都要记录相关数据。
如果所有步骤都使用纸张记录数据的话,这些分布的数据要最后通过一个专门的数据录入人员录入电脑,需要设置专门的数据录入人员,且抄写纸质记录时发生的错误无法及时发现,要解决这些问题最佳的方式就是开发B/S模式数据库软件。
开发B/S模式软件有很多工具可以供选择,当前企业开发小型的 B/S模式软件以 ASP.NET为首选。原因如下:[1,3,4,5]
第一,ASP.NET可以使用多种语言,如 C#、VB script等,都是最常见的编程语言,掌握的人非常多。
第二,ASP.NET学习入门门槛低,上手快,企业内部交接工作时可选择的人力资源比较广。
本次软件开发服务器采用了 windows server 2008,开发工具使用 ASP.NET,开发语言使用 C#语言,后台服务器使用SQL server2008。
考虑到车间质检员位置不固定,经常要走来走去,所以输入设备采用无线手持设备,网络设计主要采用了无线网络。[2]
网络结构如图1所示。
服务器安装在办公楼机房,通过光缆连接到车间的弱电机房,由车间的弱电机房连接分布在车间内外的数个无线接入点AP。
服务器配置两块网卡,一块网卡连接公司局域网,另外一块网卡连接中海油的VPN网络,这样可以在任意地点通过 VPN网络访问服务器查询生产数据。
图1 网络布线图Fig.1 Network cabling diagram
因为本系统要多人协同录入数据,数据的安全性非常重要,一定要对各个操作者设置不同的权限,首先要做的就是通过登录确定操作者的身份。
密码对于每个人都是隐私的数据,所以一定要加密存储,一为安全,二为操作者可以放心设置自己常用的密码,不用担心泄露的问题。
密码加密算法通常是用.NET内置的MD5加密算法,虽然MD5加密算法一般无法破译,但我们还是对MD5生成的密码进行简单的改造,成为我们独有的加密算法,使其被破解变得不可能。
加密函数如下:
public string GetMD5(string strPwd)
{
string pwd = "";
MD5 md5 = MD5.Create();//实例化一个md5对象
byte[] s = md5.ComputeHash(System.Text.Encoding.UTF8.GetBytes(strPwd)); // 加密后是一个字节类型的数组
s.Reverse();//翻转生成的MD5码
for (int i = 3; i < s.Length - 1; i++)//通过使用循环,将字节类型的数组转换为字符串,只取MD5码的一部分,这样恶意访问者无法知道取的是哪几位
{
pwd = pwd + (s[i] < 198 ? s[i] + 28 :s[i]).ToString("X");
//将得到的字符串使用十六进制类型格式。格式后的字符是小写的字母,如果使用大写(X)则格式后的字符是大写字符
}
return pwd;
}
通过以上算法,用户设置的密码被转化为一串大写字母存放在数据库中,除了设置者本人,任何人无法得知用户设置的密码。
用户登录时,用户输入的密码通过相同的算法生成一串大写字母,和数据库存储的进行比对,如果相同,则认为输入了正确的密码,服务器建立一个以用户名称为ID的session对象,用户对数据库进行操作时,服务器通过这个session对象辨别用户身份。
企业的服务器虽然不会有黑客来攻击,但企业内别有用心之人却不得不防,如果登录仅仅输入一个用户名和密码,那在网络上下载一个暴力密码破解器就可以破解密码,而且会对服务器造成比较大的负担,为解决这一问题,同大多网站一样,本系统使用了验证码技术。
首先用函数生成一个四位的随机数,转化为字符串validateNum,通过下面的函数转化为略不清晰图片,在登录框的验证码输入框后显示这个图片,因随机数函数每次生成的字符串都不一样,可以保证每次验证码都是随机的,验证码图片生成函数如下:
private void CreateImage(string validateNum)
{
if (validateNum == null || validateNum.Trim() ==
String.Empty) return;
System.Drawing.Bitmap image = new System.Drawing.
Bitmap(validateNum.Length * 12 + 10, 22); //生成Bitmap图像
Graphics g = Graphics.FromImage(image);
{
Random random = new Random();
g.Clear(Color.White); //清空图片背景色
for (int i = 0; i < 25; i++)//画图片的背景噪音线
{
int x1 = random.Next(image.Width);
int x2 = random.Next(image.Width);
int y1 = random.Next(image.Height);
int y2 = random.Next(image.Height);
g.DrawLine(new Pen(Color.Silver), x1, y1,x2, y2);
}
Font font = new System.Drawing.Font("Arial", 12,(System.Drawing.FontStyle.Bold |
System.Drawing.FontStyle.Italic));
System.Drawing.Drawing2D.LinearGradientBrush
brush = new System.Drawing.Drawing2D.LinearGrad
ientBrush(new Rectangle(0, 0, image.Width, image.
Height), Color.Blue, Color.DarkRed, 1.2f, true);
g.DrawString(validateNum, font, brush, 2, 2);
//画图片的前景噪音点
for (int i = 0; i < 100; i++)
{
int x = random.Next(image.Width);
int y = random.Next(image.Height);
image.SetPixel(x, y,
Color.FromArgb(random.Next()));
}
g.DrawRectangle(new Pen(Color.Silver), 0, 0, image.
Width - 1, image.Height - 1); //画图片的边框线
System.IO.MemoryStream ms = new
System.IO.MemoryStream();
image.Save(ms,
System.Drawing.Imaging.ImageFormat.Gif); //将图像保存到指定的流
Response.ClearContent();
Response.ContentType = "image/Gif";Response.BinaryWrite(ms.ToArray());
}
用户提交账户密码时,必须先正确输入这个验证码,系统才会去验证账户密码。
钢管的存储是以钢管垛的方式进行的,如图 2所示。
图2 钢管垛Fig.2 Steel pipe stacking
每垛钢管数量不固定,少则几十根,多则几百根,如果用软件直观的显示出来,控件数组是最好的选择,下面我们使用 Textbox控件数组按钢管堆垛的样式去显示,代码如下[6,9]:
pp.Attributes.Add("style","white-space:nowrap");
pp.Controls.Clear();
//页面中建立一个名为 pp的 panel控件,下面所建立的所有控件数组都加入到这个 pp中,用 pp指定我们的垛位图要显示在网页中的位置
ppp = new Panel[Convert.ToInt16(ViewState["y"])];
//根据垛位图的行数y建立panel数组,每行用一个panel
TT = new TextBox[Convert.ToInt16(ViewState["x"]),Convert.ToInt16(ViewState["y"])];
//根据垛位图的行数y和列数x建立textbox二维数组if (ViewState["x"] != null) //从页面别的函数传递过来的垛位列x值
{
for (int i = Convert.ToInt16(ViewState["y"]) - 1; i>= 0; i--)
{//每循坏一次,写一行
ppp[i] = new Panel();
pp.Controls.Add(ppp[i]); //加入当前行的panel控件
if (i % 2 == 0)
{
TextBox tempt = new TextBox();
tempt.Width = 50;
tempt.Height = 20;
tempt.BorderWidth = 0;
ppp[i].Controls.Add(tempt);
tempt.Enabled = false;
// 偶数行建立一个长度为 50且不可使用的textbox控件用来调整本行控件位置,以达到钢管两层之间互相交叉的效果
}
for (int j = 0; j < Convert.ToInt16(ViewState["x"]); j++)
{
TT[j, i] = new TextBox();
ppp[i].Controls.Add(BB[j, i]);
ppp[i].Controls.Add(TT[j, i]);
TT[j, i].BorderWidth = 1;
TT[j, i].Width = 98;
TT[j, i].Height = 18;
//将这一行所有的textbox控件加入到这一行的pannel控件ppp。
TT[j, i].TextChanged += new EventHandler(TextBox1_TextChanged);
//为每一个textbox控件添加相应方法
TT[j, i].Text = "";
TT[j, i].ID = "T_" + j.ToString() + "_" +i.ToString();}}}
//初始化textbox控件显示的内容和ID
图3是代码运行并写入管号后的样式,数据库记录下每个管号的行y和列x值,在需要的时候可以将钢管垛位图显示在网页上,通过数据库查询可以精确知道任意一个钢管的位置。建立新的垛位时,我们可以通过调整行数y和列数x调整钢管垛的大小。
需要注意的是,控件数组在网页每次刷新时都需要重新加载一次,就是说我们上面显示控件数组的代码每次页面加载都要运行一次,这和我们大多数人的认识不同,重新加载这些控件数组,控件显示的内容并不会丢失,服务器使用viewstate对象记录每个控件的信息。
图3 钢管垛Fig.3 Steel pipe stacking
海油发展珠海管道工程有限公司使用ASP.NET自主研发的数据跟踪系统软件将钢管涂敷数据记录实现了网络化多人协同录入,每个用户可以设置不同的权限,保证了数据的安全性,同时取消了纸质报表的记录,减轻了数据记录的工作量。批量减少纸质报表的数量,为后期完工文件的整理节省大量人力物力。数据共享在服务器上,可通过网络在服务器上查询生产检验数据,信息流转加快,初步实现了这一工作的信息化。
[1] 庞娅娟, 房大伟, 吕双. ASP.NET从入门到精通, 清华大学出版社.
[2] JavaScript从入门到精通, 清华大学出版社.
[3] 蒋顺业. ASP.NET应用程序开发软件设计与应用研究[J].软件, 2017, 37(10): 95-97.
[4] 兰洋, 蒋顺业. 基于asp.net的FMS生产管理系统[J]. 软件,2013, 34(5): 76-78.
[5] 余翠兰. 基于ASP.NET的学生住宿管理系统的设计与实现[J]. 软件, 2014, 35(4): 37-41.
[6] 贾志先. 袁芳. 基于ASP.NET数据分页导航的设计与应用[J]. 软件, 2015, 36(12): 60-62.
[7] 周瑞. 从零开始学JavaScript, 电子工业出版社.
[8] VB.NET 2005程序设计从入门到精通, 人民邮电出版社.
[9] Java从入门到精通, 清华大学出版社.
[10] 袁芳. 教学做一体化ASP.NET课程教学改革与实践[J]. 软件, 2014, 35(11): 126-128.
我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自各大过期杂志,内容仅供学习参考,不准确地方联系删除处理!