胡建飛,焦振峰,張 祥,丁 靖
(1. 中海油能源發(fā)展股份有限公司管道工程分公司,天津 300452;2. 海油發(fā)展珠海管道工程有限公司,珠海 519000)
管道涂敷是海底管道建設(shè)的一個(gè)重要組成部分,海油發(fā)展珠海管道工程有限公司是一家主要從事海底管道涂敷的企業(yè)。在涂敷過(guò)程中需要記錄大量生產(chǎn)檢驗(yàn)數(shù)據(jù),在沒(méi)有計(jì)算機(jī)技術(shù)支持的時(shí)代使用紙張記錄,造成報(bào)表數(shù)量繁多,數(shù)據(jù)無(wú)法查詢等缺點(diǎn)。
隨著計(jì)算機(jī)技術(shù)的引用,數(shù)據(jù)無(wú)法查詢慢慢得到改善,初期我們使用單機(jī)數(shù)據(jù)庫(kù)來(lái)記錄生產(chǎn)檢驗(yàn)數(shù)據(jù),但新的問(wèn)題隨之而來(lái):需要配備專(zhuān)門(mén)的數(shù)據(jù)錄入人員,查詢也只能通過(guò)一臺(tái)電腦。
隨著ASP.NET技術(shù)的長(zhǎng)足發(fā)展,B/S模式的網(wǎng)站式軟件越來(lái)越受到開(kāi)發(fā)者的關(guān)注,使用ASP.NET開(kāi)發(fā)新一代的數(shù)據(jù)跟蹤軟件成為海油發(fā)展珠海管道工程有限公司2017年的科研項(xiàng)目之一。
海洋中的油氣田通過(guò)管道把油氣輸送到陸地上,管道由鋼管建造,鋼管要在海水中能夠長(zhǎng)期使用,必須要在鋼管表面涂一層防腐層,現(xiàn)在常用的工藝叫做三層結(jié)構(gòu)聚乙烯防腐涂層,簡(jiǎn)寫(xiě)做3LPE。另外一種防腐的工藝是安裝犧牲陽(yáng)極,即在鋼管通過(guò)導(dǎo)線連接一定重量的鋁塊,鋼管和鋁塊構(gòu)成原電池,通過(guò)不斷腐蝕陽(yáng)極鋁塊的方式來(lái)保護(hù)鋼管。
鋼管是中空的,整體比重和海水相差不大,為了能讓鋼管穩(wěn)定的沉在海底,需要在鋼管外部加一層混凝土涂層,增大鋼管的整體比重。
鋼管涂敷的第一步工序是接收鋼管,鋼管檢驗(yàn)合格后可進(jìn)行3LPE、安裝陽(yáng)極、配重等各道涂敷工序,涂敷完成后進(jìn)行發(fā)運(yùn),所有的步驟都要記錄相關(guān)數(shù)據(jù)。
如果所有步驟都使用紙張記錄數(shù)據(jù)的話,這些分布的數(shù)據(jù)要最后通過(guò)一個(gè)專(zhuān)門(mén)的數(shù)據(jù)錄入人員錄入電腦,需要設(shè)置專(zhuān)門(mén)的數(shù)據(jù)錄入人員,且抄寫(xiě)紙質(zhì)記錄時(shí)發(fā)生的錯(cuò)誤無(wú)法及時(shí)發(fā)現(xiàn),要解決這些問(wèn)題最佳的方式就是開(kāi)發(fā)B/S模式數(shù)據(jù)庫(kù)軟件。
開(kāi)發(fā)B/S模式軟件有很多工具可以供選擇,當(dāng)前企業(yè)開(kāi)發(fā)小型的 B/S模式軟件以 ASP.NET為首選。原因如下:[1,3,4,5]
第一,ASP.NET可以使用多種語(yǔ)言,如 C#、VB script等,都是最常見(jiàn)的編程語(yǔ)言,掌握的人非常多。
第二,ASP.NET學(xué)習(xí)入門(mén)門(mén)檻低,上手快,企業(yè)內(nèi)部交接工作時(shí)可選擇的人力資源比較廣。
本次軟件開(kāi)發(fā)服務(wù)器采用了 windows server 2008,開(kāi)發(fā)工具使用 ASP.NET,開(kāi)發(fā)語(yǔ)言使用 C#語(yǔ)言,后臺(tái)服務(wù)器使用SQL server2008。
考慮到車(chē)間質(zhì)檢員位置不固定,經(jīng)常要走來(lái)走去,所以輸入設(shè)備采用無(wú)線手持設(shè)備,網(wǎng)絡(luò)設(shè)計(jì)主要采用了無(wú)線網(wǎng)絡(luò)。[2]
網(wǎng)絡(luò)結(jié)構(gòu)如圖1所示。
服務(wù)器安裝在辦公樓機(jī)房,通過(guò)光纜連接到車(chē)間的弱電機(jī)房,由車(chē)間的弱電機(jī)房連接分布在車(chē)間內(nèi)外的數(shù)個(gè)無(wú)線接入點(diǎn)AP。
服務(wù)器配置兩塊網(wǎng)卡,一塊網(wǎng)卡連接公司局域網(wǎng),另外一塊網(wǎng)卡連接中海油的VPN網(wǎng)絡(luò),這樣可以在任意地點(diǎn)通過(guò) VPN網(wǎng)絡(luò)訪問(wèn)服務(wù)器查詢生產(chǎn)數(shù)據(jù)。
圖1 網(wǎng)絡(luò)布線圖Fig.1 Network cabling diagram
因?yàn)楸鞠到y(tǒng)要多人協(xié)同錄入數(shù)據(jù),數(shù)據(jù)的安全性非常重要,一定要對(duì)各個(gè)操作者設(shè)置不同的權(quán)限,首先要做的就是通過(guò)登錄確定操作者的身份。
密碼對(duì)于每個(gè)人都是隱私的數(shù)據(jù),所以一定要加密存儲(chǔ),一為安全,二為操作者可以放心設(shè)置自己常用的密碼,不用擔(dān)心泄露的問(wèn)題。
密碼加密算法通常是用.NET內(nèi)置的MD5加密算法,雖然MD5加密算法一般無(wú)法破譯,但我們還是對(duì)MD5生成的密碼進(jìn)行簡(jiǎn)單的改造,成為我們獨(dú)有的加密算法,使其被破解變得不可能。
加密函數(shù)如下:
public string GetMD5(string strPwd)
{
string pwd = "";
MD5 md5 = MD5.Create();//實(shí)例化一個(gè)md5對(duì)象
byte[] s = md5.ComputeHash(System.Text.Encoding.UTF8.GetBytes(strPwd)); // 加密后是一個(gè)字節(jié)類(lèi)型的數(shù)組
s.Reverse();//翻轉(zhuǎn)生成的MD5碼
for (int i = 3; i < s.Length - 1; i++)//通過(guò)使用循環(huán),將字節(jié)類(lèi)型的數(shù)組轉(zhuǎn)換為字符串,只取MD5碼的一部分,這樣惡意訪問(wèn)者無(wú)法知道取的是哪幾位
{
pwd = pwd + (s[i] < 198 ? s[i] + 28 :s[i]).ToString("X");
//將得到的字符串使用十六進(jìn)制類(lèi)型格式。格式后的字符是小寫(xiě)的字母,如果使用大寫(xiě)(X)則格式后的字符是大寫(xiě)字符
}
return pwd;
}
通過(guò)以上算法,用戶設(shè)置的密碼被轉(zhuǎn)化為一串大寫(xiě)字母存放在數(shù)據(jù)庫(kù)中,除了設(shè)置者本人,任何人無(wú)法得知用戶設(shè)置的密碼。
用戶登錄時(shí),用戶輸入的密碼通過(guò)相同的算法生成一串大寫(xiě)字母,和數(shù)據(jù)庫(kù)存儲(chǔ)的進(jìn)行比對(duì),如果相同,則認(rèn)為輸入了正確的密碼,服務(wù)器建立一個(gè)以用戶名稱(chēng)為ID的session對(duì)象,用戶對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作時(shí),服務(wù)器通過(guò)這個(gè)session對(duì)象辨別用戶身份。
企業(yè)的服務(wù)器雖然不會(huì)有黑客來(lái)攻擊,但企業(yè)內(nèi)別有用心之人卻不得不防,如果登錄僅僅輸入一個(gè)用戶名和密碼,那在網(wǎng)絡(luò)上下載一個(gè)暴力密碼破解器就可以破解密碼,而且會(huì)對(duì)服務(wù)器造成比較大的負(fù)擔(dān),為解決這一問(wèn)題,同大多網(wǎng)站一樣,本系統(tǒng)使用了驗(yàn)證碼技術(shù)。
首先用函數(shù)生成一個(gè)四位的隨機(jī)數(shù),轉(zhuǎn)化為字符串validateNum,通過(guò)下面的函數(shù)轉(zhuǎn)化為略不清晰圖片,在登錄框的驗(yàn)證碼輸入框后顯示這個(gè)圖片,因隨機(jī)數(shù)函數(shù)每次生成的字符串都不一樣,可以保證每次驗(yàn)證碼都是隨機(jī)的,驗(yàn)證碼圖片生成函數(shù)如下:
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); //清空?qǐng)D片背景色
for (int i = 0; i < 25; i++)//畫(huà)圖片的背景噪音線
{
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);
//畫(huà)圖片的前景噪音點(diǎn)
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); //畫(huà)圖片的邊框線
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());
}
用戶提交賬戶密碼時(shí),必須先正確輸入這個(gè)驗(yàn)證碼,系統(tǒng)才會(huì)去驗(yàn)證賬戶密碼。
鋼管的存儲(chǔ)是以鋼管垛的方式進(jìn)行的,如圖 2所示。
圖2 鋼管垛Fig.2 Steel pipe stacking
每垛鋼管數(shù)量不固定,少則幾十根,多則幾百根,如果用軟件直觀的顯示出來(lái),控件數(shù)組是最好的選擇,下面我們使用 Textbox控件數(shù)組按鋼管堆垛的樣式去顯示,代碼如下[6,9]:
pp.Attributes.Add("style","white-space:nowrap");
pp.Controls.Clear();
//頁(yè)面中建立一個(gè)名為 pp的 panel控件,下面所建立的所有控件數(shù)組都加入到這個(gè) pp中,用 pp指定我們的垛位圖要顯示在網(wǎng)頁(yè)中的位置
ppp = new Panel[Convert.ToInt16(ViewState["y"])];
//根據(jù)垛位圖的行數(shù)y建立panel數(shù)組,每行用一個(gè)panel
TT = new TextBox[Convert.ToInt16(ViewState["x"]),Convert.ToInt16(ViewState["y"])];
//根據(jù)垛位圖的行數(shù)y和列數(shù)x建立textbox二維數(shù)組if (ViewState["x"] != null) //從頁(yè)面別的函數(shù)傳遞過(guò)來(lái)的垛位列x值
{
for (int i = Convert.ToInt16(ViewState["y"]) - 1; i>= 0; i--)
{//每循壞一次,寫(xiě)一行
ppp[i] = new Panel();
pp.Controls.Add(ppp[i]); //加入當(dāng)前行的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;
// 偶數(shù)行建立一個(gè)長(zhǎng)度為 50且不可使用的textbox控件用來(lái)調(diào)整本行控件位置,以達(dá)到鋼管兩層之間互相交叉的效果
}
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);
//為每一個(gè)textbox控件添加相應(yīng)方法
TT[j, i].Text = "";
TT[j, i].ID = "T_" + j.ToString() + "_" +i.ToString();}}}
//初始化textbox控件顯示的內(nèi)容和ID
圖3是代碼運(yùn)行并寫(xiě)入管號(hào)后的樣式,數(shù)據(jù)庫(kù)記錄下每個(gè)管號(hào)的行y和列x值,在需要的時(shí)候可以將鋼管垛位圖顯示在網(wǎng)頁(yè)上,通過(guò)數(shù)據(jù)庫(kù)查詢可以精確知道任意一個(gè)鋼管的位置。建立新的垛位時(shí),我們可以通過(guò)調(diào)整行數(shù)y和列數(shù)x調(diào)整鋼管垛的大小。
需要注意的是,控件數(shù)組在網(wǎng)頁(yè)每次刷新時(shí)都需要重新加載一次,就是說(shuō)我們上面顯示控件數(shù)組的代碼每次頁(yè)面加載都要運(yùn)行一次,這和我們大多數(shù)人的認(rèn)識(shí)不同,重新加載這些控件數(shù)組,控件顯示的內(nèi)容并不會(huì)丟失,服務(wù)器使用viewstate對(duì)象記錄每個(gè)控件的信息。
圖3 鋼管垛Fig.3 Steel pipe stacking
海油發(fā)展珠海管道工程有限公司使用ASP.NET自主研發(fā)的數(shù)據(jù)跟蹤系統(tǒng)軟件將鋼管涂敷數(shù)據(jù)記錄實(shí)現(xiàn)了網(wǎng)絡(luò)化多人協(xié)同錄入,每個(gè)用戶可以設(shè)置不同的權(quán)限,保證了數(shù)據(jù)的安全性,同時(shí)取消了紙質(zhì)報(bào)表的記錄,減輕了數(shù)據(jù)記錄的工作量。批量減少紙質(zhì)報(bào)表的數(shù)量,為后期完工文件的整理節(jié)省大量人力物力。數(shù)據(jù)共享在服務(wù)器上,可通過(guò)網(wǎng)絡(luò)在服務(wù)器上查詢生產(chǎn)檢驗(yàn)數(shù)據(jù),信息流轉(zhuǎn)加快,初步實(shí)現(xiàn)了這一工作的信息化。
[1] 龐婭娟, 房大偉, 呂雙. ASP.NET從入門(mén)到精通, 清華大學(xué)出版社.
[2] JavaScript從入門(mén)到精通, 清華大學(xué)出版社.
[3] 蔣順業(yè). ASP.NET應(yīng)用程序開(kāi)發(fā)軟件設(shè)計(jì)與應(yīng)用研究[J].軟件, 2017, 37(10): 95-97.
[4] 蘭洋, 蔣順業(yè). 基于asp.net的FMS生產(chǎn)管理系統(tǒng)[J]. 軟件,2013, 34(5): 76-78.
[5] 余翠蘭. 基于ASP.NET的學(xué)生住宿管理系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J]. 軟件, 2014, 35(4): 37-41.
[6] 賈志先. 袁芳. 基于ASP.NET數(shù)據(jù)分頁(yè)導(dǎo)航的設(shè)計(jì)與應(yīng)用[J]. 軟件, 2015, 36(12): 60-62.
[7] 周瑞. 從零開(kāi)始學(xué)JavaScript, 電子工業(yè)出版社.
[8] VB.NET 2005程序設(shè)計(jì)從入門(mén)到精通, 人民郵電出版社.
[9] Java從入門(mén)到精通, 清華大學(xué)出版社.
[10] 袁芳. 教學(xué)做一體化ASP.NET課程教學(xué)改革與實(shí)踐[J]. 軟件, 2014, 35(11): 126-128.