1、 第一天 国际物流 杰信商贸 + 搭建环境1. 项目背景杰信商贸是国际物流行业一家专门从事进出口玻璃器皿贸易的公司。公司总部位于十一个朝代的帝王之都西安,业务遍及欧美。随着公司不断发展壮大,旧的信息系统已无法满足公司的快速发展需求,妨碍公司成长,在此背景下,公司领导决定研发杰信商贸综合管理平台。杰信商贸综合管理平台分三期完毕。一期完毕仓储管理(涉及:采购单、仓库、货品、条形码、入库、出库、退货、盘点、库存、库存上限报警、记录查询)和展会管理(涉及:展会管理、出单管理),形成货品统一数字化管理。二期完毕货运全流程管理,涉及购销协议、出货表记录、出口报运单、HOME装箱单、装箱单、委托书、发票、财
2、务记录等。三期完毕决策分析(涉及:成本分析图、销售情况记录、重点客户、经营情况同期比对记录、工作绩效),为公司经营决策提供数据支持。a) 用例图2. 了解系统是所有功能模块运用visio画系统功能结构图,目的让开发人员了解都有哪些业务模块,方便分工合作,根据每个页面模块的难度,复杂,投入的人力情况来衡量每个模块多少钱。验收标准。数据库建模,业界都使用PowerDesinger 建模3. 系统架构4. 业务:生产厂家a) 功能在货品模块和附近模块,它们都有个生产厂家,讲生产厂家信息提出,成为一个单独的表。b) 需求调研需求说明书生产厂家表 FACTORY_C(_C业务后缀)序号名称代码是否主键类
3、型(长度)说明1.编号FACTORY_ID是VARCHAR2(40)UUID2.全称FULL_NAME否VARCHAR2(200)相应客户比较模糊,翻倍2到4倍3.简称FACTORY_NAME否VARCHAR2(50)4.联系人CONTACTS否VARCHAR2(30)人名20/305.电话PHONE否VARCHAR2(20)6.手机MOBILE否VARCHAR2(20)7.传真FAX否VARCHAR220)8.验货员INSPECTOR否VARCHAR2(30)9.排序号ORDER_NO否INT10.备注CNOTE否VARCHAR2(500)假如感觉它也许和关键字冲突,给它加个C前缀11.创建
4、人CREATE_BY否VARCHAR2(40)权限字段,登陆人ID12.创建部门CREATE_DEPT否VARCHAR2(40)登陆人所在部门的ID13.创建时间CREATE_TIME否TIMESTAMP 第二天 生产厂家CRUD + 购销协议1. 业务:启用,停用功能:和杰信合作生产厂家忽然有一天它以次品冒充优质品,杰信不跟这个厂家进行合作。在货品中生产厂家选择框,不能选择这个不再合作的厂家。在系统中不能直接删除这个厂家,由于我们的历史数据中具有对这个生产厂家的引用。软件是采用“伪删除”方式来解决。实际是在数据库表中加入列,作为标记,标记厂家是否可以被引用。0停用1启用。新增厂家默认1,可以
5、修改某个厂家为停用。在货品中选择厂家的下拉列表,只显示为启用。2. 加“启用”“停用”功能,修改状态。3. 货运管理核心流程:购销协议a) 需求调研过程软件公司就会到杰信去需求调研,项目经理,他面对客户的高层中层领导,目的跟客户安排好调研日程。设计人员,带领初级程序员到具体的业务部门调研。聊天,围绕项目的目的,设计人员会自己记录谈话内容,(主干),初级程序员(所有内容)。回来整理笔记,整理需求调研报告报告中怎么体现纸质报表?初级程序员将纸质报表转化成电子的。b) 购销协议业务分析4. 需求过程杰信和生产厂家签到的协议,称为购销协议。一个购销协议中包含多个货品信息,一个货品信息涉及多个附件信息。
6、报表打印时,同一个生产厂家的货品信息才干放在同一个页上,不同生产厂家的货品信息不能放在同一个页上。分析阶段,抠每个字段5. 出货表设计方案一(传统设计)协议表,货品表,附件表多次左连接,SQL极其复杂,由于附件值特殊,SQL不能直接完毕,还需要代码去实现。设计方案二(冗余设计)通过冗余,都在货品表中,只需要协议表和货品表左连接即可。6. 分析过程将用户的需求(大白话)转化为开发人员看得懂的数据库表,表之间的关系,业务逻辑。给我们的开发人员看,开发人员依据设计来写代码。复杂,大型项目画类图,序列图辅助开发人员开发。在实际开发中,架构师搭建项目框架,框架的基类都有,基础工具类,统同样式表,统一的公
7、用的js,图片。公司提供一个CVS/SVN账号,配置环境,从中检出你负责的项目的代码。代码一般以项目结构。导入工程,在其上面开发新的业务模块。7. 业务需求销售人员录入协议时,它为草稿状态,这时只能销售人员自己看到。只有当销售人员检查协议无误,提交,状态变成“已上报”。这时候,其别人员才可以看到。销售的领导和船务专责才干看到。运用这个状态字段来控制对当前用户是否可见。(细粒度的权限控制-数据权限)8. 重点知识回顾货运管理核心业务流程:购销协议1.定义购销协议是杰信和生产厂家签订的协议。2.业务复杂度购销协议业务比较复杂,它是货运管理的一个流程,它涉及三部分内容,协议的主信息和多个货品信息和多
8、个附件信息。协议主信息和货品是一对多,货品和附件信息是一对多。3.从业务中迁出技术亮点前期我参与了业务调研,重点负责购销协议。给客户交流后,我编写了需求说明书,然后参数购销协议的表设计。从需求说明书结合客户给的电子表格,我抽取出数据库表,运用PD进行建模。设计:1. 跟客户聊天,要引导性和他们聊天。业务基础术语,了解业务流程2. 进一步内容,拿到客户手中现有某个模块表单,电子表格,填写的内容,每个内容要注意的事项。来源:手填,从其他模块来获取。抠每个字段,电子表格中每个内容。3. 具体说明书功能的细化,业务逻辑说清楚,画图辅助开发,UML(类图、序列图、状态图)数据库建模细化。目的:开发人员可
9、以依照具体设计开始开发。具体设计本意能达成开发人员无需和客户沟通,就可以在设计人员的指导下就可以直接开发出客户满意的代码。但实际中做不到。设计不到位。实际中开发往复比较多。 第三天 购销协议+货品信息+附件信息1. 业务需求:上报、取消a) 功能:上报实现销售人员拟定购销协议录入完毕,检查无误后,上报给领导,领导审核无误后,提交给船运部。取消实现当船务专责未解决此相关的协议时,可以取消这个协议,重新修改协议内容,然后再次上报。假如船运专责已经开始解决报运的业务,不能取消,必须走货品增补流程。b) 设计实现:在表中增长状态字段,新增时默认状态为0草稿,当销售专责确认无误后,点击“上报”状态变为1
10、已上报。当船运专责未解决报运时,销售专责点击“取消”状态变为0,草稿。状态为0时,只能销售专责自己看到,当状态为1时,他的领导和报运专责都可以看到。 第四天 购销协议查看,SQL语句的Power1. 附件业务实现随时携带主表的ID2. 购销协议查看协议下货品,货品下面附件,在购销协议中所有浏览,体现货品和附件的关系。构建对象关系3. *细粒度权限控制主菜单,左侧菜单,按钮,URL,方法,业界都称为粗粒度的权限控制。平常的小系统,基于用户,角色,权限架构足够用。在实际大型项目中,光有上面的用户角色,URL这样的控制粒度不够细致,尚有数据访问权限。1) 对数据的访问列是可以自己定制的。例如:访问一
11、个人员工资信息表,这个表中具有人员的工资。2) 对数据的访问行可以受权限控制。例如:工资表中有销售部人员的工资信息,尚有船运部人员的工资信息。当销售部领导登录时,他只能看到销售人员的工资信息,他不能看到船运部人员的工资信息。3) 直接浏览数据库表,工资列不能直接看到其值。对这个数据库列进行加密。上面统称为数据访问权限,这个权限加上角色用户这样这个系统才比较安全。也称为细粒度的权限控制。a) 列访问控制:单独建立表,权限分派某个角色能访问哪些列;b) 行访问控制:1) 只能看自己创建的记录,不能看到别人创建的记录Where create_by = 当前登陆人ID2) 部门领导看到,他能看到本部门
12、人员创建的记录,不能看到其他部门人员创建的记录Where create_dept = 当前登陆人部门ID and user_level 4 3) 跨部门访问权限,分管领导跨部门,跨人员再加一个配置表,分管领导可以管理的人和部门; 第七天 异构数据库支持+出口报运核心业务1. 核心业务:货运管理第二个流程,出口报运a) 定义:做国际物流,货品要运往国外之前,向海关申报。向海关申报符合国家标准的货品,和货品的体积和重量信息。除了在协议中货品的基本信息外,在报运时新增7个字段,长,宽,高,毛重,净重,出口单价,含税。分次报运一个可以可以分多次来报运,体现在运送的货品数上。例如:10000货品,第一次
13、报运运送6000,第二次报运运送4000.可以多次报运,这种情况很少。平常大多是一次报运。b) 分析设计一个出口报运单来自多个购销协议(一对多);给货品信息新增的7个字段的内容。创建一个出口报运单表c) 冗余设计将货品信息冗余到报运单下的货品信息中。一个实现读取数据快速,减小业务的复杂度,业务逻辑简朴。d) 打断设计实现跳跃查询避免关联层级过多,数据量大了后,访问奇慢。打断设计。(表设计不成为文规定,表之间的关联关系不超过4层)在设计时使用一个虚线箭头来表达表之间是存在关联关系,在设计时,不是往常的外键关系。运用一个字段来存储主表和子表之间的关系。X,YWhere contract_id in
14、 (x,y)。通过打断设计,表之间的关系不存在,跳跃查询。无需查询协议表,直接查询协议下的货品表。(新增)通过上面的设计,后续业务变的更加简朴。2. 业务,劳保报表领用周期不同鞋帽子手套毛巾军大衣洗衣粉饭盒班组110105班组2202036000个单元格哪个单元格的内容进行修改,代码只修改修改的框。给每个文本框增长一个隐藏域。12023个信息要提交。本来目的是优化,结果速度更慢。最终每行添加一个隐藏域,当这行的数据进行了修改,在文本框的失去焦点事件onBlur,动态设立这个隐藏域为1。在修改代码时根据这个值判断,只有1的时候,数据才进行修改。不是1跳过。批量新增,增长一个新增按钮,点一次调研一
15、次addRecord方法,它的属性值,都为空串。批量删除,表格dhtml提供删除行操作,remove,它把行从table中删除。数据库并没有删除,删除多个框时,记录下它们的id值,拼成一个串,用逗号隔开。后台代码判断这个隐藏域提交值不为空,删除这几个数据。3. 知识回顾a) 打断设计:1.数据库设计先按照三范式,之后对一些需要优化的地方,使用反三范式设计(冗余)(以空间换设计)2.实际业务非常复杂,关联层级过多,随着系统上线运营,用户的数据随着使用的时间,线性增长。不成文规定:关联层级在设计不超过4层。打断设计,在主表中加一个字段,字段来存储两个表之间的关系。多个的时候,之间用逗号隔开。一般情
16、况下都是一次报运,就是一个协议一次报运,个别情况下多个协议一次报运,极端情况下3个协议一次报运。由于打断设计,实现“跳跃查询”。报运需要协议下的货品信息时,无需通过多个协议对象,就可以直接查询货品的信息,通过这个打断设计的字段,运用SQL的in子查询。b) 核心业务:货运管理,出口报运业务,杰信获得订单后,安排多个生产厂家生产货品,与此同时杰信准备报关的材料,除了海关规定的一些制式文档和杰信系统打印的出口商品报运单,交给海关进行审核。4. 页面控制a) 报运单新增,暗度陈仓。用户选择报运关联的多个协议,代码直接进行数据的保存。保存相关协议的id集合,协议号集合,保存冗余的货品信息,保存冗余的附
17、件信息。b) 批量修改Mrecord自定义控件,来信息补录。批量,在页面上运用DHTML动态表格技术,实现表格元素的动态增长,动态创建行,动态创建单元格,运用innerHTML动态向单元格插入文本框,带数据的。在后台准备数据,拼接成js串,将它写入一个变量中,在页面的jQuery的ready事件中,调用这个变量,形成多个js串,依次执行。动态添加到表格中。由于js运营不久,用户感觉不到添加的过程,认为直接展示。这样为用户提供一个非常方便的操作。可以批量来修改货品信息。每行运用一个隐藏域,来存放是否修改标记,这样在记录行数过多时,修改的效应也非常高。Mrecord控件它可以实现动态新增,还可以实
18、现批量删除,自动排序。 第八天 装箱、委托、发票、财务业务+协议归档货运管理涉及:购销协议、出口报运、装箱、委托、发票、财务记录。1. 装箱海关批准杰信的申请,像船东申请集装箱,杰信找货代公司请他帮着订箱。杰信找拖车公司,订拖车,拖车公司到码头拉空箱。拉着空箱到生产厂家的仓库。生产厂家在杰信的验货员的监督下,先将货品装到纸箱子中,然后在将纸箱子装入集装箱。拖车拉着满箱到海关指定的码头指定的地方卸货。这几个箱子风吹雨淋。海关进行抽检。直到船来了。将集装箱放到船上。开船从装运港出发,到目的港。装箱时,产生发票号。同时产生发票日期。一个装箱单来自多个报运单(一对多)2. 发票,委托在货品装船的同时,
19、杰信就开具发票,这个发票只是一个告知单,它的内容就是告诉客户货品已经发出,请支付剩余款项。同时快递客户一个提单。客户收到发票告知后,支付剩余款项,同时当货品到达目的港后,客户拿着提单去提货。客户联系货代公司,联系拖车公司,拖车拉着满箱到客户指定的仓库,卸货。客户验货,整个货运流程完毕,杰信和客户的协议完毕。3. 财务财务模块不属于货运的业务流程。它是杰信自己内部进行财务核算的模块。记录这单协议有无赚取利润。形成记录报表给领导展示。4. 一对一特殊设计一个委托来自一个发票,一个发票来自一个委托,一个财务来自一个委托。(一对一)一对一的所有表内容可以合成一张表,结构不清楚,业务不清楚。发票,委托,
20、财务表的主键就是装箱单的ID。上面三张表,它们的主键既外键。主外键一个值。举例,假定拿到ID,不管是装箱、委托、发票、财务,都可以查询它们其中任何一个数据。实现跳跃查询。财务需要货品信息和附件信息,通过打断设计,可以直接跳过发票、委托,直接找到装箱,通过装箱的打断设计字段,直接去搜索报运下的货品和附件信息。由于之前进行了冗余设计,财务所需的货品信息和附件信息,在报运中都有。查询效率提高数倍。5. 出口报运的状态0-草稿 1-已上报 2-装箱 3-委托 4-发票 5-财务体现流程,客户随时想了解订单进展情况,流程的跟踪。在报运的列表页面随时了解某个协议进行到哪里。6. 数据库优化a) 数据库表设
21、计l 由本来重视节省空间,变为重视性能。运用冗余,实现性能数倍提高。l 表的优化,监测数据执行时间。分表1)分字段(纵向分表)精简完核心查询它只需要近30个字段。本来需要1分多的查询,现在只1秒多展现页面。2)数据(横向分表)一个表数据量过大。业务中有些数据不常用,将这些不常用的数据放到此外一张表中,称这个表为历史表。专门做一个历史查询的模块,提供用户还可以查询。l 表之间的关联关系不要太复杂。打断设计b) SQL优化,在做复杂关联关系,SQL优化极其重要。Select * from contract_c,contract_product_c,ext_cproduct_c,factory_cW
22、here contract_id,contract_product_id,factory_id先找最小的结果集,只查询某个协议下的货品,只查询某个货品下的附件,只要查看这个协议c) 数据库的选型l 单个数据库优先选择Oracle,DB2 l 集群mysql,读写分离,单独读数据数据库,单独写的数据库l Web应用服务增长,可以增大访问量,同时分担数据库服务器压力。分表,购销协议历史当前的活动表,它和历史表的结构同样。主模块中的所有表,历史中都有有。例如:购销协议,协议、货品、附件都需要相应的历史表。创建domain批量新增SQL,JDBC jdbcTemple spring7. 在一个系统架构
23、中一般访问数据两种方式l hiberntate/mybatis 完毕数据的持久化:新增,修改,删除,简朴查询l jdbc/jdbcTemlpate/dbutil批量操作,批量新增,批量修改,级联删除,记录查询重要框架来完毕平常业务,一般批量查询使用jdbc,对于这些模块,缓存就要注意使用。有时不要配置缓存。8. 购销协议归档,取消归档-协议表数据进行归档INSERT INTO contract_his_cSELECT * FROM contract_c WHERE contract_id IN (x,y)-货品的数据进行归档INSERT INTO contract_product_his_cS
24、ELECT * FROM contract_product_c WHERE contract_product_id IN (SELECT contract_product_id FROM contract_product_c WHERE contract_id IN(x,y)-附件的数据进行归档INSERT INTO ext_cproduct_his_cSELECT * FROM ext_cproduct_c WHERE ext_cproduct_id IN (SELECT ext_cproduct_id FROM ext_cproduct_c WHERE contract_product_i
25、d IN (SELECT contract_product_id FROM contract_product_c WHERE contract_id IN(x,y)-删除协议DELETE FROM contract_cWHERE contract_id IN (x,y)-删除货品DELETE FROM contract_product_cWHERE contract_product_id IN (SELECT contract_product_id FROM contract_product_c WHERE contract_id IN(x,y)-删除附件DELETE FROM ext_cpr
26、oduct_cWHERE ext_cproduct_id IN (SELECT ext_cproduct_id FROM ext_cproduct_c WHERE contract_product_id IN (SELECT contract_product_id FROM contract_product_c WHERE contract_id IN(x,y)9. 知识回顾a) 业务:货运管理,购销协议,出口报运,home装箱单(预装箱),装箱,委托,发票(告知),财务记录。b) 【面试】工作流实现有什么好处?杰信系统实现状态控制流程。浏览每步流程开始时间,操作人,结束时间,审核人忽然在流程
27、环节中增长一步工作流扩充流程时,非常方便,修改一下流程图,工作流自动记录所有操作的人和操作时间,操作意见。状态的代码配合工作流来实现。状态采用常量来定义,只有新增长的状态,才需要编码。c) 表设计委托,发票,财务它们的表的主键既外键,它们的ID值都是装箱ID。由于它们4个的关系都是一对一。关联时最近配置,需要前面业务数据时,可以实现跳跃查询。这样查询的效率高。d) 页面设计装箱新增,它需要在新增页面表现装箱和报运的关系。Div URL链接。携带的信息ID,checkbox中;no也放到checkbox,用竖杠隔开,一个checkbox传递了两个值,无需再次查询数据库,提高性能,手工解串。(大量
28、(超过10个字段)或者信息比较敏感,不推荐使用这种方法,推荐还使用通过id查找其他内容) 第九天 图形报表让微软都羡慕的报表1. Java要实现图形报表都有什么方式?l jFreeChart 纯java API,运用生成一张图片。l excel 图形报表,poi不能直接操作图形报表控件。变相解决,先做一个excel模板,插入好图表控件,然后运用poi动态设立它的数据。用户打开excel,图表直接展现。l 第三方的报表软件,可视化开发。开发效率极高。可视化布局界面,配置数据源即可。(SQL的结果集)。收费。数巨报表(10w,每年服务费1w)。做一个应用程序,(C/S程序),IE上安装插件。兼容性
29、。l amCharts FLASH,只需要构建数据xml。1) 需要swf控件,例如饼形通用2) setting.xml 不通用的3) data.xml、data.txt,xml格式更加直观,不通用的l sqlDao查询结果集的封装,通用,l 工作原理amCharts只需要一次配置,公用flash,改造index.html,访问公用的swfobject.js和公用的flash swf本来文献。样式文献访问本地的,这样可以方便修改配置颜色,坐标,显示样式等。数据data.xml文献。将从数据库中读取的数据拼接成xml节点,写入到这个文本的文献中。转向jStat.jsp统一转向相应的forward
30、参数目录下的index.html。(注意:html浏览器默认都有缓存,在做index.html要去掉缓存)2. jFreeChart、excel、amCharts PK比较l jFreeChart 纯java api,缺陷:图形非常粗糙,它实际是运用jFreeChart api生成的图片,表现力差,专门的api需要记忆。a) 生产厂家销售情况-饼形图需求:生产厂家销售情况,厂家+销售SELECTf.factory_name,cp.sumnumFROM(SELECT factory_id,factory_name FROM factory_c WHERE state=1) fLEFT JOIN
31、(SELECT factory_id,SUM(cnumber) AS sumnum FROM contract_product_cGROUP BY factory_id) cpON f.factory_id=cp.factory_idWHERE cp.sumnum IS NOT nullb) 产品销售排行-柱状图需求:产品销售情况,畅销的产品的前10名,产品+销售SELECT product_no,SUM(cnumber) AS sumnum FROM contract_product_cGROUP BY product_no ORDER BY sumnum DESCLIMIT 10c) 系统
32、访问压力图-曲线图需求:系统访问压力图记录用户登陆系统,就记录一条记录天天登陆系统的次数SELECT SUBSTRING(login_time,1,10),COUNT(login_time) FROM login_log_pGROUP BY SUBSTRING(login_time,1,10)记录24小时系统访问的次数当数据不够时,运用临时表凑数据SELECTt.a1,IFNULL(p.countnum,0) AS countnumFROM(SELECT a1 FROM online_t) tLEFT JOIN(SELECT SUBSTRING(login_time,12,2) AS a1,C
33、OUNT(login_time) AS countnum FROM login_log_pGROUP BY SUBSTRING(login_time,12,2) pON t.a1=p.a1总结:图形报表业界已经相称成熟,提出公用,称作报表引擎。3. 系统的监控,系统想知道系统的访问瓶颈在哪里?需求系统瓶颈是指,访问最长时间,写数据操作,写磁盘文献操作。都比较耗时,用户体验不好。1) 找出系统这些操作慢的地方,2) 分析因素3) 优化,用户使用频繁模块,对其优化实现一个性能监控的程序a) 初期使用继承方式记录开始时间,记录结束时间,结束时间-开始时间=耗时写到日记文献中,写到数据库中b) 拦截器
34、配置springmvc拦截器,记录开始时间,结束时间,打日记。c) 开发环节1) 写一个拦截器,实现一个接口HandlerInterceptor2) 实现共用的变量,安全性3) 配置springmvc拦截器配置,springmvc-servlet.xmlpackage cn.itcast.jk.interceptor;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.core.NamedThreadLocal;
35、import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView;import common.Logger;/功能:实现对所有类方法执行时间的监控public class TimeInterceptor implements HandlerInterceptor /引入log4j日记private static Logger log = Logger.getLogger(TimeInterceptor.class);/运用ThreadLoca
36、l绑定一个变量,完毕线程安全NamedThreadLocal startTimeThreadLocal = new NamedThreadLocal(startTimeThreadLocal);/解决类之前,执行preHandle方法Overridepublic boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler) throws Exception long startTime = System.currentTimeMillis();/记录当前时间startTime
37、ThreadLocal.set(startTime);/绑定变量return true;/解决类之后,执行postHandler方法Overridepublic void postHandle(HttpServletRequest request,HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception long stopTime = System.currentTimeMillis();/记录结束时间log.info(String.format(%s execute %d
38、ms.,request.getRequestURI(), stopTime - startTimeThreadLocal.get();/所有的动作完毕,执行一些方法Overridepublic void afterCompletion(HttpServletRequest request,HttpServletResponse response, Object handler, Exception ex)throws Exception / TODO Auto-generated method stubsprimgmvc-servlet.xml中配置4. 项目中使用Log4ja) 导入jar包
39、b) 配置log4j.propertieslog4j.rootLogger=DEBUG, stdout配置日记级别 OFF,FANIL,ERROR,WARN,INFO,DEBUG,TRACE,ALL 提供8个级别,log4j推荐开发者使用4个级别:ERROR:错误信息,try,catch抛出异常,log.error(“”),WARN:警告信息INFO:提醒DEBUG:BUG很多时候,监控过程变量,调试顺序级别,级别由低到高,高级别的信息会包含打印低档别的信息。Stout输出地点,涉及:控制台,文献,数据库log4j.rootLogger=DEBUG, stdout#Consolelog4j.a
40、ppender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=%-5p - %m%n#LogFilelog4j.appender.file=org.apache.log4j.FileAppenderlog4j.appender.file.File=./logs/jklog.loglog4j.appender.file.layout=org.apache.
41、log4j.PatternLayoutlog4j.appender.file.layout.ConversionPattern=%dABSOLUTE %5p %c1:%L - %m%nlog4j.logger.org.apache=INFO.itcast.jk=DEBUGc) 调用方法:public class TimeInterceptor implements HandlerInterceptor /引入log4j日记private static Logger log = Logger.getLogger(TimeInterceptor.class);类中类似System.out.prin
42、tln()log.info(String.format(%s execute %d ms.,request.getRequestURI(), stopTime - startTimeThreadLocal.get();5. POI导入直接读取文献内容,形成SQL语句,批量插入数据库。导入时,excel文档它单元格有类型。1) 类型,根据不同的类型拼接不同的sql2) 模板,自己定义一个模板,让用户将数据导入。模板要设立将所有的单元格设立为文本类型,导入的数据就都是文本。3) 没有通用性,要根据具体业务做一个这样类。4) 插入SQL语句。6. 知识回顾a) 项目记录分析核心模块软件的核心价值:举例:了解杰信有哪些现有的产品畅销,VIP客户,什么产品滞销。指导公司经营。为公司经营决策提供数据支持。在基础数据中挖掘有价值的信息。再次提炼。 数据挖掘。b) 图表报表1) 第三方报表,用户展现效果最佳,功能齐全,开发效果。收费2) jFreeChart 古老,api繁杂,开发效率不高,生成图片3) jReport 复杂4) excel (公司中常采用)5) javascript amCharts (收费)6) amCharts Flashc) amCharts Flash 表现力酷炫,使用最简朴,1) SQL的数据源2) 动态生成data.xmld) 图形报表常见1) 饼形图