基於EasyUI的Web應用程序及過去一年的總結

前言html

  一個多月以前已經提交了離職申請,好在領導都已經批准了,過幾天就辦理手續了,在此感謝領導的栽培與挽留,感謝各位同事在工做中的給個人幫助,離開這個團隊確實有一些不捨,不爲別的,只由於這個團隊的氣氛特別好、同事之間相處融洽、沒有那麼多的勾心鬥角,因此幹活兒也乾的有勁,上班的時候可使用網絡、能夠上QQ、能夠上各類論壇、能夠看新聞等等,我我的很喜歡這種工做方式,做爲一個IT人員,若是閉門造車的話,那致使的後果就是被淘汰;新技術的不斷出現,若是不本身多查閱資料多泡論壇來學習的話,難道每出現一個新技術都去花錢找培訓機構來學習嗎?正由於有這種工做環境,因此在過去一年中我學到了不少知識,有的是經過互聯網學習到的、有的是經過同事學習到的, 無論經過什麼方式學到的,學到了就是本身的了,總有用的上的地方.web

過去一年的總結數據庫

   在過去一年的時間裏,跟着如今這家公司(簡稱B公司)的領導和同事學到不少東西,我以爲在這一年中主要是從技術與溝通方面獲得了提升:小程序

1.技術方面跨域

  1.1以前一直作客戶端的開發,因此對那些腳本語言用的比較少,在這裏加深了JQuery,JS的使用。安全

  1.2對Ajax的異步使用多了一些瞭解。服務器

  1.3學會了如何使用SQL監控,學會了一些優化SQL語句的方法,固然這都是在實際項目中積累的經驗,比較寶貴。網絡

  1.4學會了使用客戶端與網頁端的互相調用、嵌套來開發應用系統。數據結構

  1.5瞭解了跨域請求的處理方法。架構

2.溝通方面

  2.1搞IT的實際上是一個服務角色,因此與用戶溝通的時候要找到本身的定位。

  2.2無論用戶的要求是否合理,溝通的時候都不要充滿火藥味兒。

  2.3互相尊重很重要,尊重對方也會使對方尊重本身。

爲何離

  來到B公司以前,在一家上市集團公司(簡稱A公司)作公司內部的應用系統開發,整整服務了3年,到目前爲止,離開A公司已經一年十個月了,在這期間跟以前的領導一直仍是有聯繫,在我進入到B公司以後,以前A公司的領導找到了我,叫我利用業餘時間幫忙開發一套應用系統,我聽了二話沒說就答應了,爲何這麼爽快呢?有以下幾個緣由:

1.當時我離開的比較匆忙,可能交接的不是那麼仔細,這一點我一直以爲過意不去。

2.在我離開A公司的前一天,也就是週四(由於領導是HK那邊的,每週四下午都會回去HK),領導去到我辦公的地方對我說:「xxx,那我走了...」,後面的我就沒聽清楚了,由於當時有點受寵若驚的感受,他一個高級領導,徹底能夠不用把我這個小嘍囉當回事兒的,就算是打招呼也應該是我去給他打招呼纔對,這個事情讓我一直心存感激,我以爲在當時來講他很給我面子了。

3.在給我辦離職事宜上,不少細節方面領導都爲我考慮到了,好比說我離開的忽然,按照人事部要求的話時間達不到,提早離開的話須要扣工資,可是他給我把籤批日期提早了,雖然是一些小事情,可是讓人內心暖暖的。

上面貌似扯了不少廢話,言歸正傳,個人原意是在我能力範圍內免費幫忙開發,由於我自己是搞這一行的,技術不是問題,就是多花點時間而已,可是項目完成以後領導仍是給了我意想不到的報酬,在這裏要感謝一下他們的照顧,固然這個項目也是幾經波折才完成,畢竟我是業餘的,不在同一個地方,溝通很不方便(說實話,經過這一次我也學到了不少)。

  在這期間,領導跟我談話幾回,目的是但願我能回去工做;由於以前有不少項目都是我跟進的,領導多是考慮到我比較熟悉一點吧,我考慮了好久,最終仍是答應了,因此才向B公司這邊提出離開的要求;說實話,在這以前我從沒想過我還會回去,真的沒想到,真的是世事難料...

回去以後的工做目標

1.儘可能統一開發語言,以前的項目存在多種開發語言,好比VB6,C++,VFP,ASP,Delphi,C#,至今還有DOS操做系統的程序,何須呢?難道要我精通各類開發語言嗎?或者說一門開發語言找一個對應的開發者嗎?該砍的砍、該升級的升級,升級的話也包括硬件也須要適當的升級,好的應用系統必須有好的硬件支持,否則無論是誰都玩不下去。

2.後續的項目以Web結構爲主,便於更新;客戶端爲輔,涉及到跟硬件通訊的功能採用客戶端與Web結合來完成。

3.將衆多的小程序集成到一個框架中,不要搞的那麼分散(目前存在不少的小程序、小補丁),不要再不停的「打補丁」。

4.搭建一個好的源代碼管理平臺,無論是TFS仍是SVN均可以,確保源代碼安全管理。 

最近一個Web應用程序

  我這我的就是這樣,看見別人好的東西就想學習過來,剛來到B公司的時候,看見公司用的不少功能都比較高大上,個人學習方法是這樣的:先了解這些高大上的功能是如何實現的,不懂就請教前輩,這裏又得感謝一下個人師傅了,感謝他不吝賜教、悉心指導;瞭解以後就本身建立一個項目試着搞一個Demo出來,在這個過程當中遇到不懂的就再次請教別人,直到本身搞懂爲止,那麼到了這個時候這東西已經「屬於」我本身的了,我已經裝進腦殼裏面去了,因此從進入B公司開始我就沒有中止過學習。無論學到什麼知識,必定要運用起來才行,只有在實際項目中才能學到更多、才能找出本身的不足,因此下面的項目就是我剛進入B公司就開始着手開發的,借鑑了一些前輩們的東西,但不是直接COPY,只有圖片和CSS樣式是用的原來的,由於本人美工技術實在太差,想PS出來一個LOGO圖片就搞了不少次,PS出來的結果連本身看着就不爽,因此就不強求了,引用了以前的一些圖片和樣式,這裏值得說明的是:現有公司的項目和數據庫結構咱們開發人員都有,這也是領導批准的,由於咱們有時候會在家裏辦公,因此會將數據庫結構和程序複製在本地以便建立真實的開發環境和調試環境。

  除了圖片之外其它的我都按照我本身的設計開發的,包括數據庫設計和項目架構設計,後續我會抽時間將這個項目繼續完善,主要是針對製造行業,如今只有幾個基礎的功能,也能夠說是製造行業裏面基本上都會用到的幾個功能,好比條碼管控與打印之類的,根據實際的需求能夠靈活擴展,如下是部分截圖:

 

 

 

 

 

描述:

  條碼規則就是用來控制條碼的格式,對於如今的工廠來講,條碼化管控是最多見的,那麼不一樣的產品有不一樣的條碼格式要求,每個客戶也都有本身的特殊要求,因此這個條碼規則也是很是重要的,在這以前個人作法以下:

  在數據庫中根據當前年月日+流水號來自動生成,這樣原本也能解決問題,可是若是須要擴展的時候就歇菜了,只要客戶要求條碼格式稍微改變一下格式,那麼咱們須要改變的東西是至關的多,甚至可能所以帶來不少嚴重的問題,由於格式已經固定不能靈活變動,因此幾乎沒有擴展的可能性。

  鑑於此,如今的作法以下:

  定義一個條碼規則,包含條碼的計算進制、須要屏蔽的字母或字符、條碼前綴、條碼後綴、條碼總長度、流水號長度等等參數,在生成條碼的時候選擇此規則便可,若是有新的格式要求,那隻須要針對新的格式要求新增一個條碼規則便可,對原有的數據結構徹底沒有影響,靈活多變、擴展容易! 

 

描述:  

  生成條碼屬於一個比較關鍵的功能,有時候數據量可能比較大,例如某一個工單的數量是20000,那也就是說用戶生成條碼的時候一次性就要在數據庫產生20000筆記錄,根據我我的的經驗來講,這種事物不能直接交由用戶來操做,防止數據庫被拖死;個人作法是無論用戶提交多少數量,在服務器中將用戶提交的請求保存起來,服務器定時去處理這些請求,每次按照時間排序處理最早提交的一筆請求,若是用戶的請求中出現不合法的數據,則服務器直接將該請求駁回並通知到用戶,反之則完成相關的操做,這樣一來能夠避免用戶直接操做大量的數據而致使系統變得緩慢或者數據庫出現死鎖之類的問題。

 

描述:

  工藝路線方面這裏值得說一下,採用了gooflow設計,固然gooflow只有UI部分,後臺都是另外設計的。

  支持多節點工藝路線,這裏須要設置條件,例如:當前咱們前面有兩條路,路線A通向北京,路線B通向上海,咱們如今站在路口選擇具體走哪一條路?這個時候就須要條件了,咱們如今的目的是去北京看故宮,那很顯然已經匹配到了條件,說明咱們應該走路線A;系統會根據具體的狀況來尋找應該走哪一條線,這個邏輯比較複雜。

 

 描述:

動態報表,能夠根據不一樣的條件動態生成控件,實現查詢功能,這樣能夠省掉不少的報表,簡單的查詢功能用這個足以。

  

描述:

  維修功能實際上是一個比較複雜的業務,根據不一樣的維修動做而產生不一樣的數據結構,好比說維修動做中包含「簡單維修」,「更換物料」,「報廢」等選項,像簡單維修就比較容易處理,只需按照正常的工藝路線操做並記錄修理過程便可,可是更換物料就不同了,須要記錄更換了什麼物料?原始料號是什麼?更換上去的料號是什麼?包括Vendor,DateCode等信息;通常生產管理的應用系統中,客戶都會要求有詳細的維修記錄和報表,這是一個重點。

描述:

  如下都是調用Api實現的,具體的邏輯都在Api裏面實現,Api採用工廠模式設計,根據不一樣的需求產生不一樣的數據結構,這些頁面沒有寫一句後臺代碼,全是腳本。

 

 

描述:

  在開發過程當中,會涉及到不少的錯誤信息,既有存儲過程當中的也有程序裏面的,以前個人作法是直接將報錯的存儲過程名稱寫在錯誤信息後面,這樣一看就知道是哪個存儲過程拋出的錯誤,直接就能夠進行錯誤定位,可是發現一個問題,存儲過程的名稱字符串長度沒法統一,致使頁面佈局很差控制;鑑於此,我統一用ErrorCode來代替錯誤信息,針對用戶來講,用戶並不須要知道是哪一個地方報錯,系統管理員或者開發人員根據ErrorCode對照表也能快速定位問題點,如此能夠解決因爲錯誤信息長度不統一而致使的頁面佈局問題,ErrorCode對照表以下圖所示:

 以上都是介紹了部分Web中的功能,整個項目還有一部分是客戶端,客戶端其實比較好理解,主要是在客戶端調用了Web程序,客戶端主窗體代碼以下,固然只是部分代碼,根據實際狀況能夠另行增長。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Security.Permissions;

namespace MES
{
    [PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
    [System.Runtime.InteropServices.ComVisibleAttribute(true)]
    public partial class FrmMain : Form
    {
        public FrmMain()
        {
            InitializeComponent();
        }
        public WebBrowser Browser { get { return this.webBrowser1; } }
        private void FrmMain_Load(object sender, EventArgs e)
        {
            string ConfigPath = Application.StartupPath + "\\config.ini";
            if (!System.IO.File.Exists(ConfigPath))
            {
                MessageBox.Show("缺乏配置文件,系統沒法啓動,請聯繫管理員!", "舒適提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Application.Exit();
                GC.Collect();
                return;
                       
            }

            MES.Common.Global.ApiUrl = MES.Common.IniHelper.GetConfigValue("ApiUrl");
            MES.Common.Global.serverPath = MES.Common.IniHelper.GetConfigValue("ServerPath");
            webBrowser1.ObjectForScripting = this;
            webBrowser1.Navigate(MES.Common.Global.serverPath);

        }

        public void Print_ZPL(string Content)
        {
            System.Drawing.Printing.PrintDocument p = new System.Drawing.Printing.PrintDocument();
            string DefaultPrint = p.PrinterSettings.DefaultPageSettings.PrinterSettings.PrinterName;
            MES.Common.PrintHelper.PrintLabel(DefaultPrint, Content);
        }

        private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            webBrowser1.ScriptErrorsSuppressed = true; //禁用腳本調試,屏蔽腳本錯誤提示框
        }
        


        /// <summary>
        /// 獲取稱重機的重量
        /// </summary>
        /// <param name="Com">通訊COM口</param>
        /// <param name="CheckCount">循環次數</param>
        /// <returns></returns>
        public string  GetWeigh(string Com,int CheckCount) 
        {
            return  MES.Common.WeighHelper.GetWeighData(Com, CheckCount);
        }

        /// <summary>
        /// 獲取本地計算機上面的COM列表
        /// </summary>
        /// <returns></returns>
        public string GetComList() 
        {
            string str = "";
            List<string> list= MES.Common.WeighHelper.GetComList();
            for (int i = 0; i < list.Count; i++)
            {
                str += list[i].ToString() + ",";
            }
            return str;
        }
    }
}

 

至於如何回調客戶端的函數,能夠參考這篇文章:理解JavaScript回調函數 

 

若是您以爲文章還過得去,請幫忙頂一下,您的支持是我進步的動力,謝謝!!

相關文章
相關標籤/搜索