当前位置: 首页 > 科技观察

基于EasyUI的Web应用及过去一年的总结

时间:2023-03-14 21:05:35 科技观察

过去一年的总结  在过去的一年里,从这家公司(简称B公司)的领导和同事那里学到了很多东西,我觉得这今年主要是在技术和交流方面有所提升:1.技术方面  1.在1.1之前,我一直在做客户端开发,所以用的脚本语言比较少。这里我深化了JQuery、JS的用法。  1.2深入了解Ajax的异步使用。  1.3学会了SQL监控的使用和一些优化SQL语句的方法。当然,这是在实际项目中积累的经验,更有价值。  1.4学会了利用客户端与网页的相互调用嵌套来开发应用系统。  1.5知道如何处理跨域请求。2.沟通  2.1IT其实是一个服务角色,所以在和用户沟通的时候,一定要找准自己的定位。  2.2无论用户的要求是否合理,沟通都不应充满火药味。  2.3相互尊重很重要,互相尊重也会让对方尊重自己。你为什么离开  来B公司,在一家上市集团公司(A公司)做内部应用系统开发员3年?至此,你离开A公司已经一年零十个月了,这期间,我一直在和前任领导保持联系。当然这没有别的意思,主要是我在里面工作了3年,也是我工作以来服务时间最长的公司。还是有一些友情的,我进入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。最近的一个网络应用  对我来说就是这样的。当我看到别人的好东西时,我想学习。刚来B公司的时候,看到公司用的很多功能都比较高端。我的学习方法是这样的:先了解这些高端功能是如何实现的,不懂就请教前辈。在这里我要再次感谢我的师父,感谢他的慷慨教导和悉心指导;理解之后,自己创建一个项目,试着做一个demo出来,过程中遇到不懂的地方,会再问别人,直到弄懂为止。那么到了这个时候,这个东西已经“属于”我了,我已经把它记在脑子里了,所以从进入B公司开始,我就没有停止过学习。无论你学到了什么知识,你都必须使用它。只有在实际项目中才能学到更多,才能发现自己的不足。所以下面这个项目是我刚进B公司就开始开发的,借用了一些前辈的东西,但是没有直接copy,只用了原图和css样式,因为我美术功底太差,很多次想PS出一张LOGO图,PS出来的结果连我自己都没有。我不开心,所以我不勉强。我引用了一些以前的图片和样式。这里值得说明的是:我们的开发人员拥有现有公司的所有项目和数据库结构。这一点也得到了领导的认可,因为我们有时在家办公,所以会把数据库结构和程序拷贝到本地,打造真实的开发环境和调试环境。  除了图片,包括数据库设计和项目架构设计,我都是按照自己的设计开发的。我会花时间继续完善这个项目,主要针对制造业。现在只有几个基本功能,也可以说是制造业基本用到的几个功能,比如条码控制、打印等,可以根据实际需要灵活扩展。以下是部分截图:说明:  条码规则用于控制条码的格式。对于现在的工厂来说,条码管控是最常见的,所以不同的产品对条码格式的要求不同,每个客户也有自己的特殊要求,所以这个条码规则也很重要,在此之前,我的做法是:  是根据当前年月日+序号在数据库中自动生成,可以解决问题,但是如果需要扩容,就停止了,只要是客户要求的条码格式,如果我们对格式稍作改动,就需要改动很多,甚至会造成很多严重的问题,因为格式已经固定,无法灵活更改,所以几乎没有扩展的可能性。#p#  鉴于此,目前的做法是:  定义一条条码规则,包括条码的计算基数,要屏蔽的字母或字符,条码前缀,条码后缀,条码总长度、流水号长度等参数,生成条码时可以选择该规则。如果有新的格式要求,只需要为新的格式要求添加一条条码规则即可。不影响原有数据结构,灵活多变,易于扩展!说明:    生成条形码是一个比较关键的功能。有时数据量可能比较大。比如某个工单的数量是20000,这意味着当用户生成一个条码时,数据库中会一次性生成20000笔交易。记录一下,根据我个人的经验,这种东西不能直接交给用户操作,防止数据库被拖死;我的做法是将用户提交的请求保存在服务器中,服务器定期去处理这些请求,每次先提交的请求按时间排序。如果用户请求中存在非法数据,服务器将直接拒绝该请求并通知用户,否则,完成相关操作。一方面可以避免用户直接操作大量数据导致系统变慢或数据库死锁等问题。说明:  这里值得一提的是工艺路线。采用gooflow设计。当然gooflow只有UI部分,后台是单独设计的。  支持多节点进程路由。这里需要设置条件,比如:前面有两条路,A路通往北京,B路通往上海。现在我们站在路口,选择走哪条路?这个时候,就需要条件。我们目前的目标是参观北京故宫。显然,条件已经匹配,说明应该走A路;系统会根据具体情况找出应该走哪条路线。这个逻辑比较复杂。.说明:动态报表可以根据不同的条件动态生成控件并实现查询功能,可以节省大量的报表,简单的查询功能就足够了。说明:  的维护功能其实是一个比较复杂的业务,根据不同的维护动作会生成不同的数据结构。简单的维修比较好办,按照正常的工艺路线走,记录维修过程就可以了,但是更换材料就不一样了,需要记录什么材料?原始部件号是多少?更换部件号是多少?包括Vendor、DateCode等信息;在一般的生产管理应用系统中,客户都会要求有详细的维护记录和报表,这是很重要的一点。说明:  以下是调用Api实现的,具体逻辑在Api中实现。Api采用工厂模式设计,根据不同的需求生成不同的数据结构。这些页面没有写一个单一的后台代码,都是脚本。说明:  在开发过程中,会涉及到很多错误信息,无论是在存储过程中还是在程序中。我以前的做法是直接在错误信息后面写上报错的存储过程的名字。只要知道是哪个存储过程抛出的错误,就可以直接定位到错误,但是我发现了一个问题,就是存储过程的name字符串长度不能统一,导致页面布局控制不好;鉴于此,我使用ErrorCode来代替错误信息,对于用户来说,用户不需要知道哪里报错了。系统管理员或开发人员可以根据ErrorCode对照表快速定位问题点,解决因错误信息长度导致的页面布局问题,ErrorCode对照表如下图所示:以上是Web中的一些功能,整个项目中有一部分是客户端。客户端其实比较好理解,主要是客户端调用Web程序。body代码如下,当然只是一部分代码,可以根据实际情况添加。usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Windows.Forms;usingSystem.Security.Permissions;namespaceMES{[PermissionSet(SecurityAction.Demand,名称="FullTrust")][System.Runtime.InteropServices.ComVisibleAttribute(true)]publicpartialclassFrmMain:Form{publicFrmMain(){InitializeComponent();}publicWebBrowserBrowser{get{returnthis.webBrowser1;}}privatevoidFrmMain_Load(objectsender,EventArgse){stringConfigPath=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);}publicvoidPrint_ZPL(stringContent){System.Drawing.Printing.PrintDocumentp=newSystem.Drawing.Printing.PrintDocument();stringDefaultPrint=p.PrinterSettings.DefaultPageSettings。PrinterSettings.PrinterName;MES.Common.PrintHelper.PrintLabel(DefaultPrint,Content);}privatevoidwebBrowser1_DocumentCompleted(objectsender,WebBrowserDocumentCompletedEventArgse){webBrowser1.ScriptErrorsSuppressed=true;//禁用脚本调试,屏蔽脚本错误提示框}///

///获取称重机重量//////通讯COM口///循环次数///publicstringGetWeigh(stringCom,intCheckCount){returnMES.Common.WeighHelper.GetWeighData(Com,CheckCount);}//////获取本地计算机上的COM列表//////publicstringGetComList(){stringstr="";Listlist=MES.Common.WeighHelper.GetComList();for(inti=0;i