图书系统
展示图:
项目步骤
0:同业务员分析需求
1:抓取数据,这些数据足足有306G,4000多本pdf图书
2:搭建前台静态页面,使用jquery解决了在IE8、IE6不兼容故障
3:开始搭建框架(springMVC3.0.2+hibernate3+log4j)
4:测试
使用到的技术
1:采用对pdf进行简单加密,使用^来回换算。防止客户直接复制pdf,限制只能使用本系统浏览?
2:通过json+过滤器结合配置来控制外网IP段和内网ip段。
3:jquery+ajax异步分页,并带有加载特效,增加用户体验度。
4:使用Lucene检索
后话:
这个项目是在7月份做的,整个流程大概用了3星期时间(晚上+周末)。
后来去深圳现场部署系统,让我在运维上又实践了一吧。一个晚上,在部署时,现场测试,发现新bug,那晚直接干到3点。
由于机房空调温暖太低,在调试时使用局域网运程安装的,可能是太困的原因,操作过快,服务器(servlet 2008)有些卡了。不小心把200多个G的数据给删了,这使我冒了一身冷汗。。。幸好移动硬盘还有备份,不然后果相当严重。经过那次事件,让我知道数据无价,不可乱来。
语言文字报抓取
需求:某公司网站,每天都要派工作人员去某网站摘取文章放到自己的网站上。而文章也是时不定的有,如果有文章,工作人员就有一块一块复制过来,一个版有10几个文章,还有插图,一期有12个版,12*10+*图片,还要按手动按文章顺序排序,工作量较大又烦琐,决定弄一个小软件来协助下载数据和一个组合到asp中直接上传一整期数据
|--手动监听
|--自动监听
ps:在服务器共享一个目录,将自动监听程序在服务器启动,每时不隔的就去扫描,一有新数据便立即抓取。
然后工作人员便可在共享目录看到。
|--抓取数据后打包成zip包,上传到后台,后台即可随便排序标题顺序
标引系统(报纸版)
需求:
某报社为保留历史的报纸,需要制作成电子版。扫描--修图-校对-录入-采集或标引。 采集便是通过读取PDF的文本,计算每块区域文本,自动将相应段落框起来,提高生产人员效率。但由于有一部分报纸太古老,图|字墨很重,排版方式比较复杂,采集的智能画框已失去主权,框不准。所以便有了标引。将PDF转为JPG,让制作人员在通过软件来自定画框,补齐相应文本数据。为制作电子报数据在老报纸上提高了效率。
电子版预览效果
小结:
1:这个项目不难,核心就是在图上画线,截图,图片按比例绽放其区域x,y,w,h也随着变化。
2:第一次在系统上使用了加密注册激活功能。(序号号+使用次数+过期日期)
3:制作人员用的比较多,对系统操作灵活比较高。让我体会写程序更注重一些细节问题。怎么更方便,怎么提高工作效率。
4:为防止意外出错,每做完一个区域备份一次,出错也能及时还原。(采用序列化流)
收寄系统
需求:
某公司以为扩充物流业务,与各快递公司合作,帮他们收件。便需要开发一个收寄系统。
功能:
b:离线版使用。
a:各站点的资费管理(保价+代收货款+首重+续重+首价+续价),不同付款方式有不同物品类型,不同物品类型便有不同价格。有些快递公司还限制一些地区不能寄达。
b:针对寄件人提供(月结|季结);
c:各站点数据上传
d:后台与快递公司结算(月清|日结)
小结:
1: 价格表使用XML设计的(运输方式|物品类型|首重|续重|首价|续价|到达时间|到达城市)
2: 这个项目涉及到细节东西比较多,不停的有新业务加入,历经3个大版本,数据库改过4次,价格也改过3次。
3:怎么实现站数据上传?怎么实现本地数据删除|也同步更新服务器数据?
a:在本地数据表中添加如下字段
create table tbName(
...
uploadStatus number(2),/*上传状态0:等待上传,1:正在上传,9:上传完毕,2:上传失败*/
serviceMethod varchar(25)/*业务方法状态 save保存,update:更新:delete删除*/
)
b:开启一个定时器,每2分钟就巡逻一次。将状态为0或2的数据给拿出来
b1:遍历数据0或2的数据。
b2:为防止执行任务执行重复,每获取一行数据,通过ID将其updateStatus更新为1。
b3:组织数据:我们模拟get请求,?属性名=值
属性名:表名(如:itemcoll、itemrecv)
值:首行是每个值的属性名。行数据之间的值以,拼接,多行使用||。
形成了itemcoll=serviceStationId,orgnizationNo,itemNo||200000001,ST,768706636070||200000001,ST,768706636058||.... 最后转大串以UTF-8转为byte数组,使用POST上传。
b4:后台servlet
b4.1直接使用与站约定的表进行获取属性值。
b4.2以||字符串切割,获取0索引的值,以再次,切割。得到一个属性名称数组(nameArray)
b4.2遍历以||切割的数组,将>1以后的值,以,切割(valueArray)。
b4.3遍历nameArray,获取属性名称,通过反射将值赋到属性名称相应的值。
b4.4:然后我们可根据serviceMethod来决定客户端是要请求那个业务方法。
b4.5:定义一个StringBuffer来将ID与状态拼接起来,用于响应客户端。
b5:获取到服务器响应后,同样以字符串截取,将将更新每个ID的uploadStatus值。
2014总结: 缓一缓,再生气。想一想,再行动。
写代码总结:
1:先理思路,把整个流程想一遍过去。最好能用纸画下来,把每个环节写上备注。(ps:虽然消耗时间,但能减少你调试的时间)
2:写完之后,自己测试。