版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、高级软件人才实作培训专家高级软件人才实作培训专家北京传智播客教育 呼叫中心项目开发呼叫中心项目开发讲师:赵晓虎讲师:赵晓虎高级软件人才实作培训专家高级软件人才实作培训专家根据简历编写参考看重点l这个项目尽力避免讲太多WinForm特有的东西。不用把这个项目本身直接写到简历中,而是把功能组合到其他项目中。像WinForm标准的登录窗口制作、MDI、托盘编程等不讲,界面比较山寨,重点在逻辑。l1)系统用户管理,用户的密码以md5散列值的形式保存在数据库中,这样哪怕是数据库管理员也无法查看用户的密码。l2)客户资料管理。使用NPOI实现从Excel文件中批量导入客户资料,还可以将客户资料导出到Exc
2、el文件。l3)各地分店每天将当天新增的客户资料以Excel文件的形式上传到总公司服务器,呼叫中心使用Quartz.Netkw:ts进行定时任务,每天凌晨2点自动去服务器下载分店上传的Excel文件,然后将文件导入数据库中的客户表。要防止文件被篡改。高级软件人才实作培训专家高级软件人才实作培训专家根据简历编写参考看重点2l4)系统的关键运行步骤,比如用户管理、数据导出、FTP文件导入数据库等都使用Log4Net进行日志记录。l5)系统可配置性:FTP服务器的IP地址、FTP用户名密码等信息都不是在程序中写死的,完全可以由管理员在后台系统中进行配置。l6)客户资料的查询支持按照拼音检索。为了提高
3、检索速度,在用户表中增加一个“姓名拼音”字段,在用户增加、修改的时候使用Visual Studio International Pack开发包计算姓名对应的拼音,然后将姓名拼音更新到“姓名拼音”字段中。l7)客户资料的检索支持复合检索,也就是根据用户姓名、地区、购买日期、分店等信息进行多条件复合检索。l8)常见问题管理。将用户常见的问题、回答保存在系统中,并且可以动态的对常见问题进行增删改查。常见问题以树状数据保存在数据库中,这样就可以支持常见问题的无限级分类。高级软件人才实作培训专家高级软件人才实作培训专家根据简历编写参考看重点3l9)数据报表。l10)三层架构三层架构,代码生成器。(重、难
4、点)l先用SqlHelper实现,项目讲完后再讲三层架构。三层是项目的重点,也非常难。l补充:三层架构必须掌握,以后工作找工作必用!笔试题让写代码:肯定手写代码,别指望智能。提示能手写出代码证明思路才清晰。高级软件人才实作培训专家高级软件人才实作培训专家术语(*)l什么是呼叫中心(Call Center) 。公司客服系统,接警平台,医院接诊系统。l(*)计算机与电信集成技术(CTI)(来电显示等)lCRM(客户关系管理, Customer Relationship Management )。CRM不一定非要和CTI集成。和CTI集成以后就有了自动化的过程。lOA(Office Automati
5、on);MIS(Management Information System,什么都是MIS系统);ERP(Enterprise Resources Planning)。Gis高级软件人才实作培训专家高级软件人才实作培训专家术语2(*)l座席(Seat)电话后面坐着的客服。l(*)交换机(应用于具有成百上千的座席的大型的呼叫中心)PK 语音卡(200人以下,相当于共享上网,无需申请业务)。东进语音卡,Dialogic。l中国移动客服电话号码:10086,不很n多个号码。/交换机l家里搞个语音卡就能同时接打多个电话,占线是因为电信局已经将信号送到了家里,但是家里那个破电话返回了一个信号:占线。高级
6、软件人才实作培训专家高级软件人才实作培训专家高级软件人才实作培训专家高级软件人才实作培训专家客户公司介绍(*)l整车销售,车辆维修,汽车装具,汽车俱乐部服务,包括咨询、投诉、汽车维(报)修、保养、救援、售前、售中、保险、售后、回访等所有与汽车相关的服务,处理汽车销售订单、预定单,维修、保养等几方面的问题。l总部在济南,IT机房也在济南。共10名坐席人员。呼叫中心在总部。新广源。高级软件人才实作培训专家高级软件人才实作培训专家现有系统分析l一个ERP系统,三地分别运行三个独立的ERP系统。有部分的客户、销售数据。每天淄博、青岛分公司将当天的数据以文件形式放到FTP服务器上。要求这些数据要及时同步
7、到CallCenter中。系统对接l有一些遗留的客户数据(没有上ERP系统之前的销售数据)以Excel形式存在l一台服务器:windows2003+MSSQLServer2005。高级软件人才实作培训专家高级软件人才实作培训专家项目组简介(*)l项目组规模:一个项目经理,一个语音卡及服务端开发,一个坐席端(CRM)开发,一个报表系统开发。l(*)合同额:35万(包含硬件费用)l项目周期:2个月,最后80天验收。(估算的项目周期*150%)。为了简历更真实!高级软件人才实作培训专家高级软件人才实作培训专家MD5算法lMD5算法是一种散列(hash)算法(摘要算法,指纹算法),不是一种加密算法(易
8、错)。任何长度的任意内容都可以用MD5计算出散列值。介绍工具:CalcMD5.zip。lMD5长度一般是32位的16进制数字符串(比如71f396e4134a1160d90bb1439876df31),MD5值的个数是有限的,但是源数据是无限的,因此存在着不同的内容产生相同MD5值的概率。因此MD5算法不可逆,也就是只能得到内容对应的MD5值,无法由MD5值反推内容。但是对不同的内容产生相同MD5值的概率非常非常非常低!l思考:系统密码明文存储有哪些缺点?。lPassword字段保存用户输入密码的MD5值,这样系统管理员、黑客也不知道用户的密码是什么,也就避免了用户的其他系统密码被利用的问题判
9、断密码正确性的方法:计算用户输入的密码的MD5值,与数据库存储的MD5值进行比较,如果相等则认为密码正确。为什么很多网站只有密码重置,没有找回原密码功能?。l应用:计算文件的MD5值来检验文件没有被篡改过。高级软件人才实作培训专家高级软件人才实作培训专家MD5算法2lMD5算法理论上是不可逆的,因此攻击的唯一办法就是碰撞。两个不同的内容生成相同的MD5值,这就叫碰撞。MD5算法的碰撞概率非常小。找到一个内容虽然不同但是产生同样MD5的内容即可。l不要露怯,王小云王小云不是破解了MD5算法,只是发现缩短枚举碰撞时间的理论而已。l那些MD5暴力破解工具(Md5逆向暴力破解.rar)、网站怎么回事?
10、如果要你做一个“破解”MD5的网站,如何加快“破解”的速度?讨论提出方案。/从数据库中查,而不是算。http:/ l为了防止用户偷懒,算两次MD5值,或者加上一个固定的字符串l计算字符串的MD5代码:备注中。l思考:如何加快暴力破解的速度。l(*)MD5的其他应用:第三方支付用MD5对金额、订单号等进行散列计算,来保证数据是对方发出的。如鹏网项目会讲。l(*)和MD5类似的还有SHA等算法。l阶段目标:能够明白原理开发出MD5登录程序。高级软件人才实作培训专家高级软件人才实作培训专家设计坐席表l坐席表的设计:主键、用户名、姓名、密码。错误三次锁定用户。l用数据库方式修改登录功能(暂时手动加入数
11、据)。迭代式开发,不是所有功能都一上来就全部写好,而是添砖加瓦l下课练习下课练习:修改密码功能。如何得到当前登录用户Id?创建一个保存全局变量的Globals类,声明一个全局变量CurrentSeatId(public static int CurrentSeatId ;);登陆的时候将登录用户的Id保存在CurrentSeatId中;这样在任何一个类中就都可以访问Globals.CurrentSeatId来得到当前的坐席主键了。l全局变量(static变量)是和进程相关的,启动程序的一个新的进程就会有一组static变量和进程关联。全局的范围就是这个进程。l能不用static全局变量就不要用
12、,因为可能造成数据不一致。l对于这种内部系统,直连数据库一般也不用考虑安全性问题,因为“不敢”。对于复杂的系统,会有中间应用服务器,连接字符串等都配置在中间应用服务器中。Web系统不会有该问题。高级软件人才实作培训专家高级软件人才实作培训专家设计坐席表l坐席表的设计:主键、用户名、姓名、密码。错误三次锁定用户。l用数据库方式修改登录功能(暂时手动加入数据)。迭代式开发,不是所有功能都一上来就全部写好,而是添砖加瓦l下课练习下课练习:修改密码功能。如何得到当前登录用户Id?创建一个保存全局变量的Globals类,声明一个全局变量CurrentSeatId(public static int Cu
13、rrentSeatId ;);登陆的时候将登录用户的Id保存在CurrentSeatId中;这样在任何一个类中就都可以访问Globals.CurrentSeatId来得到当前的坐席主键了。l全局变量(static变量)是和进程相关的,启动程序的一个新的进程就会有一组static变量和进程关联。全局的范围就是这个进程。l能不用static全局变量就不要用,因为可能造成数据不一致。l对于这种内部系统,直连数据库一般也不用考虑安全性问题,因为“不敢”。对于复杂的系统,会有中间应用服务器,连接字符串等都配置在中间应用服务器中。Web系统不会有该问题。高级软件人才实作培训专家高级软件人才实作培训专家Ex
14、cel基础l整个Excel表格叫工作表:Workbook;工作簿,包含的叫页(工作表):Sheet;行:Row;单元格:Cell。lExcel中的电话号码问题,看起来像数字的字符串以半角单引号开头就没问题了。高级软件人才实作培训专家高级软件人才实作培训专家程序处理Excel的技术l OLE Automation:程序启动一个Excel进程,然后和Excel进程进行通讯来进行Excel的操作。优点:强大,能够使用Excel的所有功能,要求装Excel,微软最推荐这种用法,因为可以促进Excel的销量。会启动Excel进程,不适合于服务器(比如Asp.Net网站,安全性、效率)。参考资料http:
15、/ (*)把Excel当成数据库,使用Microsoft.Jet.OleDb访问访问Excel ,参考资料 http:/ 只适合于完全二维结构,功能最弱,很少用。不用装Excel。l (*) OpenXML,微软提供的读写Excel的技术,优点和NPOI差不多,不过只能处理xlsx格式文件。docx、pptx。l NPOI、MyXls等,NPOI能够分析Excel文件的格式,能够进行常用Excel操作,不依赖于Excel,节省资源,没有安全性、性能的问题,在ASP.net中用最合适。只能处理xls格式文件、不能处理xlsx这样的新版本Excel文件格式。处理xlsx还要用OpenXML。高级软
16、件人才实作培训专家高级软件人才实作培训专家NPOI组件的引入l我们平时调用的类是已经添加到引用的,如果想调用系统内置的没有添加引用的其他dll(*严格的说是在GAC中的Assembly)就要添加引用,在【.Net】选项卡中选择,对于另外一些第三方dll(*严格说是Assembly)则需要点击【浏览】选项卡选择对应的dll文件。l将NPOI包解压到硬盘中,然后在项目中添加引用,浏览,将解压目录下的dll全部添加进来l(*)POI是Apache的一个Java开源项目,NPOI是POI在.net下的移植版本,很多.Net的移植版本开源项目都是在原来的Java版本名称前加上N,比如NHibernate
17、、NDoc、NUnit、NAnt(是一个基于 .NET 的生成工具)。高级软件人才实作培训专家高级软件人才实作培训专家.net操作Excel-NPOI使用lNPOI使用:下载NPOI开发包。NPOI 1.2.3 final binary.zip解压后在项目中添加对NPOI.dll与Ionic.Zip.dll( Ionic.Zip.dll,取代旧版本中的CSharpCode.SharpZipLib.dll )的引用。l描述工作簿的类:Workbook(接口)、HSSFWorkbook(具体实现类)l描述工作表的类:Sheet(接口)、HSSFSheet(具体实现类)高级软件人才实作培训专家高级软
18、件人才实作培训专家.net操作Excel-NPOI读取Excell案例1:读取ReadExcel.xls中的数据:(代码见备注1)workbook.NumberOfSheets/获得工作表的个数。workbook.GetSheetAt(i).GetRow(i) /获得行对象workbook.GetSheetAt(i).GetRow(i).LastRowNum/最后一样的索引workbook.GetSheetAt(i).GetRow(i).GetCell(j)/获得单元格对象workbook.GetSheetAt(i).GetRow(i).GetCell(j).ToString()/获得单元格的
19、字符串表示形式。/StringCellValue、NumericCellValue等。workbook.GetSheetAt(i).GetRow(i).GetCell(j).CellTypel案例2:将坐席信息的Excel文件导入到T_Seats表中。操作T_Seats.xls代码见备注2.高级软件人才实作培训专家高级软件人才实作培训专家NPOI起步1、读取 (暂时不用关心Stream是什么东西) using (Stream stream = File.OpenRead(c:客户资料.xls) HSSFWorkbook workbook = new HSSFWorkbook(stream);
20、MessageBox.Show(workbook.GetSheetName(0); 2、遇到错误别慌,仔细看错误信息。可能遇到的问题:文件被其他进程占用。3、(*)NPOI处理WPS生成的XLS有问题。高级软件人才实作培训专家高级软件人才实作培训专家写入Excel HSSFWorkbook workbook = new HSSFWorkbook(); HSSFSheet sheet = workbook.CreateSheet(); HSSFRow row = sheet.CreateRow(0); row.CreateCell(0, HSSFCell.CELL_TYPE_STRING).Se
21、tCellValue(Hello); row.CreateCell(1, HSSFCell.CELL_TYPE_NUMERIC).SetCellValue(3.14); using (FileStream stream = new FileStream(c:1.xls, FileMode.OpenOrCreate, FileAccess.ReadWrite) workbook.Write(stream); 高级软件人才实作培训专家高级软件人才实作培训专家.net操作Excel-NPOI写Excell案例3:将坐席表T_Seats中的数据导出到Excel.代码见备注1.l步骤:创建workboo
22、k:HSSFWorkbook workbook = new HSSFWorkbook();操作workbookCreateRow(index)CreateCell(index)SqlDataReader.IsDBNull(index)将workbook写入到文件流workbook.Write(stream);/注意:这句话一定要在using()范围内。高级软件人才实作培训专家高级软件人才实作培训专家课下练习l练习:客户资料管理1.将Excel中的客户数据导入到表中。导入的时候如果车架号已经存在则不导入。2.从数据库中把数据如导出到Excel.开发要求:不能修改Excel文件,只能程序适应Exc
23、ell姓名(Name)、固定电话(TelPhone)、手机(MobilePhone)、邮编(PostCode)、Email、通讯地址(Address)、门店(2位,由总部顺序分配编号)、购买日期(BuyDate)、车号(CarNum)、车架号(BracketNum)、品牌(Brand)、型号(TypeNum)、意见建议(Suggestion,nvarchar(MAX))、备注(Remarks,“未尽事宜”,一般创建表的时候都要一个“备注字段”,填写其他字段中没有涉及的内容,nvarchar(MAX) )。字段哪怕用拼音,也别用拼音缩写(你猜TXDZ、gnmk是什么字段?),也不要用中文字段名。
24、表名:T_Customers。易错:电话号码用什么字段类型。l大数据量,主键用guid或bigint高级软件人才实作培训专家高级软件人才实作培训专家课下练习:客户资料导入细化l根据车号或车架号匹配客户资料,如果数据已经存在则不作导入,防止数据重复导入。l实验步骤弹出对话框,要求用户选择要导入的Excel文件遍历用户选择的Excel文件,根据行中的车号、车架号匹配数据库中已有的客户资料,如果车号或者车架号能够匹配上,则不导入这条记录。增加一个根据车号查询客户资料的方法GetDataByCarNum(where CarNum=CarNum,datatable.count0)增加一个根据车架号查询客
25、户资料的方法GetDataByBracketNum。(where BracketNum=BracketNum,datatable.count0)l(*)NPOI处理WPS生成的XLS有问题。高级软件人才实作培训专家高级软件人才实作培训专家读取Excell读取字符串类型数据MessageBox.Show(sheet.GetRow(3).GetCell(4).StringCellValue); 读取数字类型数据NumericCellValue、DateCellValue。l判断单元格数据类型:读取GetCell(4).CellType,与HSSFCell类中定义的常量比较即可。l判断使用区域:结束
26、行号:LastRowNum、LastCellNum比实际单元格多一列。高级软件人才实作培训专家高级软件人才实作培训专家NPOI使用示例代码l参考NPOI的示例代码。lSample高级软件人才实作培训专家高级软件人才实作培训专家老张语录l实现软件的某些功能就是按规定的流程步骤调用人家的API,人家往往提供例子代码,只要能看懂例子和文档,稍作修改即可实现自己的需求,故流程调用步骤无须记忆,即使你记住,十天不用,照样忘光,实际工作会涉及许多小功能调用,某功能数月或数年才用一次,故学软件开发死记某功能调用流程很不可取。l软件开发中会涉及许多琐碎的功能应用细节,这些细节更新和变化速度很快,所以好的开发人
27、员必须掌握快速学习方法,否则,其软件开发工作之路将会非常艰辛,并且走不长远。我找到的一条快速学习方法就是不记忆应用细节,只去理解原理和找到案例与文档,细节没有存储在脑袋中,但在需要的时候可以找出来。高级软件人才实作培训专家高级软件人才实作培训专家问题补充:l1.通过SqlCommand执行语句后,在“事件探查器”中发现“打开”了多个连接。1.1通过SqlProfiler查看:sp_reset_connection1.2 sp_reset_connection的作用,why?1.3通过反射查看两次con的InnerConnection是否为同一个对象。1.4MSDN介绍:http:/ (从连接池
28、中重用连接时,该存储过程还将导致激发 Audit Login 和 Audit Logout 事件。 )http:/ Center系统导入客户资料时,根据车号或车架号匹配客户资料,如果Call Center系统已经存在则不作导入,否则增加一条客户记录。导入时门店号同时导入。高级软件人才实作培训专家高级软件人才实作培训专家FTP简介(*)l专门用于文件的上传、下载,效率更高l为什么不用网盘?不开发协议,只能通过网页来上传下载。不能实现自动化。lWindows下常用FTP服务器:Serve-U、IIS FTP、FileZilla Server(免费、开源)。学习用FileZilla Server(解
29、压以后再运行,一旦运行就不要再改路径、移动,一旦出错到服务里面看原始位置)。lWindows下常用FTP客户端:Windows内置(命令行ftp.exe、资源管理器)、CuteFtp(收费)、FlashFXp、FileZilla FTP Client。有人电脑用资源管理器有问题,可以用FileZilla FTP Client。l常见面试题:说出几种常见的FTP客户端、服务器、Http服务器、浏览器。FTP端口:21;Http端口:80l登录FTP一般需要用户名、密码,根据用户名的不同有不同的权限(文件:上传、下载、删除、附加;目录:创建、删除),不同的用户可以看不同的目录;如果不输入用户名则认
30、为是匿名用户,其实就是用户名为Anonymous的用户,匿名用户一般只给下载权限。l什么是服务器,什么是端口,为什么要固定端口。端口就是房子里的小窟窿。高级软件人才实作培训专家高级软件人才实作培训专家程序操作FTPl(*).Net中内置的操作FTP的类有:WebClient、FtpWebRequest。WebClient用起来简单,但是只能上传、下载。 FtpWebRequest 比较强大,WebClient内部就是调用FtpWebRequest实现的,如果要实现遍历ftp文件、创建ftp文件夹等就要用FtpWebRequest 。l(*)WebClient也可以下载Http网页、上传Http
31、文件,后面站内搜索、采集器项目中还将会用到。l开源的FTPClient.cs。测试上传和下载。学了流以后应该有能力对FTPClient的代码进行修改。高级软件人才实作培训专家高级软件人才实作培训专家Excel文件数据导入l呼叫中心、FTP服务器、门店咋回事?信息孤岛。l实验步骤:FTP地址、用户名、密码暂时写死。去FTP服务器取得各个门店对应的数据文件,思考:如果门店由于某些原因没有及时上传文件怎么办?文件名规则:分店编号+日期.xls,比如 0220100807. xls 。(*)学了流操作以后就可以避免把文件下载到本地。WebClient.OpenRead()将数据导入数据库,注意只导入不
32、匹配车号、车架号的数据。程序出错的时候暂停在发生异常的地方,这时就可以看各个变量的值l查找占用端口的进程:netstat -an -o,查到pid,然后在任务管理器中找到pid对应的进程(如果任务管理器中没有pid这一列,则【查看】【选择列】,将PID勾选)高级软件人才实作培训专家高级软件人才实作培训专家门店上传工具l分店用工具自动化将ERP系统导出的excel文件上传到FTP服务器,文件名为“分店编号日期.xls” 。l分店编号、FTP服务器地址、FTP服务器用户名、密码先写固定值。l开始开发!做一个界面:两个按钮,一个按钮弹出OpenfileDialog选择ERP导出Excel文件,第一个
33、按钮点击后上传到服务器。l(*)改图标、做安装包高级软件人才实作培训专家高级软件人才实作培训专家应用程序配置l系统中有很多值需要动态配置,比如FTP的地址、密钥等。如鹏网项目中还会涉及到配置平台。l用更通用的App.Config方案,不用.Settingsl通用方法:在App.config中增加段,见备注,注意要加到configuration下,读取的时候string ftp = ConfigurationManager.AppSettingsFTP地址,要添加对System. Configuration的引用。在AppSettings中只能通过程序来读,很难通过程序来写l运行的时候用户只要修
34、改exe同目录下的.exe.config文件就可以(注意部署运行不要修改App.config,因为App.config不会发布到客户的电脑上,相当于源代码)l练习:把呼叫中心项目中的需要配置的项放到app.config中高级软件人才实作培训专家高级软件人才实作培训专家拼音检索(面试侃点)l为什么要用拼音检索?坐席只能根据客户的语言进行判断,无法准确写对姓名。lVisual Studio International Packl练习:根据文档学习使用方法。发下安装包自己探索。目标:输出一个汉字的拼音。lCHS:Simplifed Chinese,简体中文。CHT:Traditional Chine
35、se :繁体中文。l两种实现方式:实时检索(速度慢);增加一个拼音字段(速度快,有冗余,必要的冗余是可以的)l什么叫冗余:就是这个字段不是必要的。l提高运行速度:用冗余,Dictionary、索引、冗余列、Cache。l生成拼音的方式,点击按钮来生成l练习:实现按拼音检索功能。不考虑多音字。l练习:自己根据文档学习简繁转换类的使用。高级软件人才实作培训专家高级软件人才实作培训专家复合检索l多个条件组合查询方便数据定位。就像拼音检索一样找核心难点。用string.join();and拼接,第一个是where后面都是and.注意:拼接like的时候:like arg;然后设置arg的值。高级软件人
36、才实作培训专家高级软件人才实作培训专家树状结构数据高级软件人才实作培训专家高级软件人才实作培训专家TreeView控件基础l目标:话术管理功能点的技术基础。l树状结构在数据库中的存储,是重难点技术。如鹏网项目中还会涉及到树的东西。l动态添加节点(VS编辑界面中有增加根节点、增加子节点两个按钮):向根节点下增加子节点:treeView.Nodes.Add,它的返回值就是创建的节点对象。treeView.Nodes代表根节点的所有子节点。向TreeNode增加子节点,treeNode.Nodes.Add,它的返回值就是创建的节点对象。treeNode.Nodes代表节点的所有子节点。高级软件人才实
37、作培训专家高级软件人才实作培训专家TreeView深入l选择项发生变化的时候在TextBox中显示当前选择项的值。AfterSelect事件。e中放的是发生事件的一些数据,比如鼠标点击的坐标。lTreeNode的Tag,TreeNode中Text只能盛放显示的值,可以用Tag属性给节点关联一个对象。 Tag属性是Object类型的,因此可以关联任何的对象。l案例:菜单点击显示菜单英文名高级软件人才实作培训专家高级软件人才实作培训专家递归l见备注,通过下面案例理解递归。“和尚讲故事”的案例。l案例1:备注1。l案例2:备注2。l尾递归备注优化(*)l未处理的“System.StackOverfl
38、owException”类型的异常出现在 mscorlib.dll(递归没有终止。)高级软件人才实作培训专家高级软件人才实作培训专家高级软件人才实作培训专家高级软件人才实作培训专家高级软件人才实作培训专家高级软件人才实作培训专家递归(难)递归就是函数自己调用自己。老和尚的故事当递归调用层次过多的时候就会发生“StackOverflowException”异常,所以以后写程序如果遇到“StackOverflowException”异常,一般就是一个死的递归。递归都有一个递归的终止条件,就是什么时候不再递归了。1:用递归计算1+.+n的和。2:案例,显示树的所有节点:private void Sh
39、owNodes(TreeNodeCollection treeNodes) foreach (TreeNode treeNode in treeNodes) txtLog.AppendText(treeNode.Text+n); ShowNodes(treeNode.Nodes);/显示此节点下的子节点 /TreeNodeCollection避免两个for循环。写递归程序的时候不用刻意去分析执行流程,只要“想当然”就可以盗梦空间。讲故事(讲故事(讲故事()高级软件人才实作培训专家高级软件人才实作培训专家树在数据库中的存储名称上级单位辽宁沈阳辽宁皇姑屯沈阳沈河沈阳新民沈阳大连辽宁河北廊坊河北香河
40、廊坊三河廊坊如何从数据库取得所有省节点?如何从数据库取得所有市节点?树是有级次的,数据库表是二维的,怎么用二维的表储存级次的树就是一个难题高级软件人才实作培训专家高级软件人才实作培训专家案例:论坛版块列表可以用select * from t where FatherID=2获得“动漫特区”的所有子节点,所以不需要再建立一个“子节点”的字段为什么不把每个级次放到单独的表中?因为是无限级次。高级软件人才实作培训专家高级软件人才实作培训专家话术脚本概念l话术脚本、知识库、FAQ:坐席对着念给客户的东西。好记性不如破电脑l要素:标题、正文。高级软件人才实作培训专家高级软件人才实作培训专家话术管理设计l
41、开发步骤:设计数据库表;设计取得各级数据的方法;设计界面,将表中的数据加载到TreeView中,为了能够在点击节点的时候将节点的正文填充到文本框中,因此将每个节点对应的Model放到节点的Tag中。设计话术的添加、删除、修改、查找等功能l树状结构表设计,表名T_Scripts,字段: Id、Title(NVarchar(50),标题)、Msg( NVarchar(MAX),正文)、ParentIdlParentId为节点的父节点的主键值,第一级节点的ParentId为0。录入初始数据。高级软件人才实作培训专家高级软件人才实作培训专家话术开发1l需要增加查询方法:GetDataByParentI
42、d( select * from T_Scripts where ParentId=ParentId )高级软件人才实作培训专家高级软件人才实作培训专家话术开发2l将T_Scripts表中的数据加载到TreeView中的算法:调用GetDataByParentId方法将第一级节点的数据加载到treeview.Nodes。加载节点的时候将节点对应的T_ScriptsRow对象设置到节点的Tag属性上。遍历第一级节点,将以第一级节点对应的数据行为Parent的节点加载到treenode.Nodes子节点上遍历第二级节点,重复高级软件人才实作培训专家高级软件人才实作培训专家话术开发2l发现加载的规律
43、,无论是哪级节点都是“将查询出来的模型填充到treeview.Nodes或者treenode.Nodes中”, treeview.Nodes、而treenode.Nodes都是TreeNodeCollection类型,因此设计方法Fill(TreeNodeCollection nodes,IEnumerable scripts)l编写Fill的实现代码:遍历scripts每一行,调用nodes.Add添加节点,将row的Text设置为节点的Text高级软件人才实作培训专家高级软件人才实作培训专家话术开发3l调用Fill方法将GetDataByParentId方法返回的第一级数据填充到TreeV
44、iew上。l怎么填充其他级次呢?遍历添加每个节点的时候都继续“将以我对应的row为Parent的行添加到我的Nodes中”,因此完善Fill方法,自己调用自己。l调试的方法查看每步执行结果,理解为什么这么设计。高级软件人才实作培训专家高级软件人才实作培训专家话术开发4l将model对象设置到节点的Tag属性上l点击节点在右边显示话术脚本,响应TreeView控件的AfterSelect事件,从节点的Tag中取出来此节点对应的T_Scripts,然后显示到TextBox中。l节点的编辑(增加工具栏):开发节点编辑对话框,由于需要将编辑前节点的Title、Msg传递给对话框,并且的都爱用户设置的新
45、值,设计ScriptTitle、ScriptMessage两个属性。修改节点Tag上的T_Scripts的属性,然后调用Update方法将修改保存到数据库。需要刷新当前选择节点的界面显示高级软件人才实作培训专家高级软件人才实作培训专家话术开发5l增加一级节点弹出节点编辑对话框将节点设置调用AddNew方法插入数据库调用Get(id)方法将刚插入的数据检索出来调用treeview.Nodes.Add增加新节点,并且按照加载时的逻辑进行节点的Tag、Text设置(可以把代码抽象到一个函数中)高级软件人才实作培训专家高级软件人才实作培训专家话术开发6l增加非一级节点(练习)弹出节点编辑对话框将节点设
46、置调用adapter的Insert方法插入数据库调用adapter的GetDataById方法将刚插入的数据检索出来调用treenode.Nodes.Add增加新节点,并且按照加载时的逻辑进行节点的Tag、Text设置(可以把代码抽象到一个函数中)高级软件人才实作培训专家高级软件人才实作培训专家话术脚本7l删除节点算法设计:删除节点包含删除数据库中的对应数据和删除界面上的节点两部分工作删除数据库中的节点则要:如果节点有子节点则先删除子节点,再删除自己;如果子节点还有子节点,则先删除子节点的子节点,再删除子节点。又是一个递归。删除界面上的节点调用TreeNode的Remove方法自杀即可l步骤:
47、增加一个DeleteScriptById方法,用来根据话术Id删除话术,在其中调用GetDataByParentId方法判断Id对应的节点是否有子节点,如果有子节点则首先调用DeleteScriptById方法删除子节点,否则调用DeleteScriptById方法删除当前节点。调用当前选择节点TreeNode的Remove方法将自己从TreeView中删除l练习作业:通讯录管理,树状结构:名称、Email、电话l递归删除、递归加载是重点,编辑、添加关于Winform的细节太多,次要。l如果能听懂老师的思路,但是写不出来:先理解老师的代码写出伪代码,然后照着伪代码写程序,最后完全脱离伪代码自己
48、写。高级软件人才实作培训专家高级软件人才实作培训专家面试题l树的深度遍历和广度遍历l解耦:解除耦合。手机电池和手机就是高耦合(你的手机电池我不能用,互相的依赖度高),耳机和电脑就是低耦合。不要写Delete(TreeNode)高级软件人才实作培训专家高级软件人才实作培训专家DBNulllNull不是0、不是空,是“不知道”。数据库中int是可以为null的,但是C#中int不可以为null,存在一个不匹配的问题。l介绍“可空数据类型”,string、Person(引用类型)等是可null的,但是int、bool、datetime(值类型)是不可为null的,在不可空类型后加“?”就是可空类型了
49、,HasValue、Value。lDBNull和null的区别:如果值为null,直接写null的话用SqlParameter提交到服务器上是报错的(未提供值),需要写DBNull.Value:new SqlParameter(“Id”, model.Id=null?(object)DBNull.Value:model.Id)。三元运算符冒号两边的值类型相同或者有继承关系。l/int i=(j=null?10:(int)j);l (*) int i = j ? 10;/等价于上面的高级软件人才实作培训专家高级软件人才实作培训专家三层架构(难)l先对比用SQLHelper和三层实现Age自增的区
50、别。l复杂项目不能把SQL语句直接写到界面里,不模块化、难以维护,应该采用三层架构。通过后面学习再去理解三层架构的优点,现在先吸收,再理解。当然不是所有公司都这么做,还是看公司习惯。Web开发中的三层架构也是同样的结构。这里讲的是简单三层架构,对于初学者难,还有更复杂的三层架构和多层架构。每个人写法都不一样,记住精髓!l三层只是一个比较好的软件架构,不是非用三层不可。l界面层UI;l数据访问层DAL(Data Access Layer);l业务逻辑层BLL(business logic layer )。实体类就是Model;对数据进行操作的代码写在DAL中,一般就是SQL语句,DAL只有对数据
51、的操作,没有“如果金额大于20则不能删除”这样的逻辑;BLL调用DAL中的代码进行逻辑操作,比如“如果金额大于20则不能删除”。SQL语句、ADO.Net的类一般只应该出现在DAL中。高级软件人才实作培训专家高级软件人才实作培训专家三层架构图l案例:校验用户名密码,BLL方法 bool ValidateUser(string username,string password)l练习:修改密码,BLL方法ChangeResult ChangePassword(string username,string oldpassword,string newpassword)高级软件人才实作培训专家高级软
52、件人才实作培训专家两个案例的流程图高级软件人才实作培训专家高级软件人才实作培训专家三层架构的好处l解耦分工合作,开发人员可以专注于某一层可移植性支持分布式系统开发(基于网络)扩展性强。 MSSQL、Oracle之间切换l三层:UI层BLL层(业务逻辑层,得到UI层的数据,返回UI层要的东西。不能出现MessageBox、TextBox等。)DAL层(DataTable等都应该在DAL中而不应返回DataTable,返回都是模型类(实体类)高级软件人才实作培训专家高级软件人才实作培训专家实战三层架构l获得自增字段值的两种方法:“insert .; select identity”、“insert
53、 into .) output inserted.id values”,使用ExecuteScalar执行。l创建Model、BLL、DAL三个文件夹(大项目可以分成三个项目)。编写T_Person模型类,编写SQLHelper,编写T_PersonDAL(int AddNew(T_Person model)、bool Delete(int id)、bool Update(T_Person model)、Person Get(int id)、IEnumerable ListAll())、再编写DAL类。lModel是在各层之间传递数据用的。用定做蛋糕来比喻,蛋糕的规格、文字就是Model,蛋糕
54、师是DAL,BLL是售货员,UI是用户。l上面的命名规则、文件夹的分布只是习惯,不是定死的。BLL不是简单对DAL的一个转发,像像“未审核的数据不能删除未审核的数据不能删除”这样的逻辑应该写到这样的逻辑应该写到BLL中中。(*)BLL、DAL中的方法一般不声明为静态的,为以后工厂三层提供扩展l三层的优点:UI层和BLL打交道,不用处理SQL语句;UI层(界面代码,就是写到Form中的代码)访问的都是强类型的对象,而不是row“age这样的东西,开发更方便,更不容易出错。一般三层的代码都是一个人写;UI层中没有复杂的代码,解耦,容易改变UI层技术。如果由Winform改成只要修改UI即可,如果由
55、SQLServer改成Oracle只要修改DAL即可。l案例:增删改查(CRUD)。登录(BLL中增加Validate方法)。练习:用三层重写话术管理。如果有一个Age字段,这样Age可能为空,就能解释可空类型、DbNull的用处了。l使用代码生成器生成的代码的时候注意效率问题:把所有人的年龄增加1岁,不要获得所有数据再逐个Update,而是在DAL中增加相应的方法。高级软件人才实作培训专家高级软件人才实作培训专家三层总结l三层:UI(界面,User Interface)、BLL、DAL。Model是在三层之间进行数据传递的。UI层调用BLL、BLL调用DAL,数据用Model传递,UI不能直
56、接调用DAL。Model不是一个层。lDAL层只有SQL语句和数据处理,其他层一般不应该出现SQL语句以及和ADO.net相关的类简单的BLL只是调用DAL,但是BLL不是打酱油的:数据校验应该放到BLL;BLL也会组合DAL成新的操作,比如ChangePassword。lDAL层中只要和数据库操作,BLL中才有具体的逻辑l三层和所有代码写在一起的区别就像分工明确的麦当劳和收钱、做饭一起的卖煎饼的区别。l三层一般会比不分层慢,但是为了分工明确,这样的少量的性能下降是可以的,很多时候效率不是唯一追求的因素。l案例:用三层架构重写登录、改密码、话术管理。登录可以返回一个枚举,表示成功、用户名不存在
57、、密码不对。高级软件人才实作培训专家高级软件人才实作培训专家三层总结l三层:UI(界面,User Interface)、BLL、DAL。Model是在三层之间进行数据传递的。UI层调用BLL、BLL调用DAL,数据用Model传递,UI不能直接调用DAL。Model不是一个层。lDAL层只有SQL语句和数据处理,其他层一般不应该出现SQL语句以及和ADO.net相关的类简单的BLL只是调用DAL,但是BLL不是打酱油的:数据校验应该放到BLL;BLL也会组合DAL成新的操作,比如ChangePassword。lDAL层中只要和数据库操作,BLL中才有具体的逻辑l三层和所有代码写在一起的区别就像
58、分工明确的麦当劳和收钱、做饭一起的卖煎饼的区别。l三层一般会比不分层慢,但是为了分工明确,这样的少量的性能下降是可以的,很多时候效率不是唯一追求的因素。l案例:用三层架构重写登录、改密码、话术管理。登录可以返回一个枚举,表示成功、用户名不存在、密码不对。高级软件人才实作培训专家高级软件人才实作培训专家lDAL与BLL中为什么不用static方法static类?为了以后的多态!工厂模式等情况下。lGlobal.CurrentId是UI层的。l更新前要先Get数据,然后再修改。高级软件人才实作培训专家高级软件人才实作培训专家自己动手写代码生成器l每次写三层的三个类的时候都重复的写,代码都差不多,所
59、以可以用代码生成器自动生成代码(我讨厌它,无奈)。演示动软。l复习:Path.Combine()可以进行两个路径的拼接,省得自己处理的问题;Directory.CreateDirectory()如果文件夹不存在则创建;File.WriteAllText将字符串写入文本文件;StringBuilder可以用来更高效的进行字符串拼接,AppendLine方法会自动添加换行。l数据库元数据:系统视图INFORMATION_SCHEMA.COLUMNS是列信息、INFORMATION_SCHEMA.TABLES是表信息。l开发一个生成Model的代码生成器,通过这个理解代码生成器的原理,如果只会用代码
60、生成器而不能自己写一个出来,那就只是一个码农。可笑的“生成代码后再批量修改”。l做复杂功能的时候先有一些假设,这样可以降低难度,逐步完善。假定表的主键都叫Id,都是int自动增长。Cs文件就是文本文件,代码生成器就是拼接字符串生成代码然后保存成文件。演示老师开发的较复杂的代码生成器,一定要自己写一个代码生成器出来,这样这个项目就会非常亮。l一定要一开始手写三层,不要依赖于代码生成器,等手写熟练了以后再用代码生成器。l不要直接修改代码生成器生成的代码。高级软件人才实作培训专家高级软件人才实作培训专家CodeSmithl动软使用演示。Win7下如果不行就装5.0版本l用动软生成的代码满足不了要求,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024-2025学年度公务员(国考)高频难、易错点题及参考答案详解(预热题)
- 2024-2025学年度施工员测试卷及答案详解(名校卷)
- 2024-2025学年度注册电气工程师高频难、易错点题附答案详解【综合题】
- 2024-2025学年四川交通职业技术学院单招《英语》试题预测试卷及完整答案详解(易错题)
- 2024-2025学年制冷与空调作业考前冲刺练习试题【典优】附答案详解
- 2024-2025学年度执法资格复习提分资料含答案详解(A卷)
- 2024-2025学年度火电电力职业鉴定综合提升测试卷及一套参考答案详解
- 2024-2025学年度法律职业资格考试考前冲刺练习试题带答案详解(模拟题)
- 2024-2025学年度化验员模拟试题含答案详解(A卷)
- 2024-2025学年度施工员自我提分评估附完整答案详解(夺冠)
- 糖厂技术改造工程施工组织设计方案
- 医院三合理一规范培训
- (人教2024版)英语七年级下册全册词形转换高清打印(默写版+背诵版)
- 加油站安全管理提升计划
- 1.3 学会自我保护 (教学课件)2024-2025学年道德与法治 七年级下册 统编版
- 五年级下册道德与法治第一单元《我们一家人》大单元整体教学设计
- 中宣部直属单位2025年度公开招聘工作人员历年高频重点提升(共500题)附带答案详解
- 更换引流袋技术操作
- 部编版三年级下册语文课课练全册(附答案)
- 职业学校《影视后期特效制作》课程标准
- 军用靶场设计方案
评论
0/150
提交评论