实习总结-2017.5.2

起始

  很快,大学四年转眼即逝,下学期已经没有课的我抱着复杂的心情开始找实习,本着可以学到技能的心态出去找实习,然而经历了半个月的苦找,终于找到一家,初次到公司来实习,初次体会的是企业内部的系统很大,和平时自己学到的项目并不能相比….涉及到的内容很广,因为实习的岗位是java开发岗,所以在公司的部门中看到了公司内部OA系统的大框架和流程。第一周主要是熟悉一下业务流程。
  系统中按照大模块划分大概我数了一下是有19个大功能模块,由于是证券公司,所选用的框架形态也是比较沉稳老套的SSH(Spring+Struts2、Struts+Hibernate)框架,而数据库的选型采用的是MSSql(Mircosoft sql微软自己出的sql数据库),前端网页也是后端的老前辈们用jQuery的封装EasyUI样式搭建出来的后台界面。因为涉及到安全方向的考虑,所以公司采用内网环境,与外网隔绝来保证安全性。而初次预览一个项目时,第一步要做的肯定是启动服务本地访问网页的主页,在找到index.jsp后发现怎么也登陆不了,后来才想到是因为数据库连接的是测试库,而测试库中的数据没有同步我的用户名,也就是员工编号(毕竟是刚来…),这里也想到过直接到数据库里查询一下自己的用户名和密码,结果发现是经过加密的。这时就看了一下后台的逻辑代码,学习到了一个知识点:MD5。MD5是不可逆的,但是同样值得字符串只能有一个MD5编码,所以用户登录输入密码后,在后台验证时是先把取得的用户密码转化成MD5加密后的编码,然后在和数据库中的MD5值做比较。
   最后登录到主界面用的账号是同事的账号,登录后发现主界面的左面是一颗“树”,“树”的显示内容是根据每个人的权限而确定的。点开后的详情页面在右侧的iframe中显示。初步预览了一下,业务大概都是一些查询业务,还有一些导入导出功能。第一周的主要收获就是熟悉了一下公司的业务流程,了解到了数据库的选型,还有公司内部的系统代码,由于代码的工程真的是很多,所以不是一时半会可以看完的,希望接下来的几周继续努力学习,增强自己的代码审计能力。而自己尽量可以在熟悉流程以后,开始着手编码工作。
   接下来的几周我来总结一下我实习中学到的东西。大部分的时间是在阅读代码,熟悉大体流程,许多模块内都使用了表单来作为提交,而其中提交表单用到的技术是ajax(异步提交表单),这个技术现在使用的很广,例如前端验证数据库中有没有注册用户的时候,此时是不需要刷新整个页面的,而是采取了局部刷新页面的方式,所以我先来总结一下ajax在这一周看到的用法。
   ajax即“Asynchronous Javascript And XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术。AJAX不是一种新的编程语言,而是一种用于创建更好更快以及交互性更强的Web应用程序的技术。使用Javascript向服务器提出请求并处理响应而不阻塞用户!核心对象XMLHTTPRequest。通过这个对象,您的 JavaScript 可在不重载页面的情况与Web服务器交换数据,即在不需要刷新页面的情况下,就可以产生局部刷新的效果。AJAX 在浏览器与 Web 服务器之间使用异步数据传输(HTTP 请求),这样就可使网页从服务器请求少量的信息,而不是整个页面。AJAX 可使因特网应用程序更小、更快,更友好。
   而ajax现在用的到最广的方法是直接利用jQuery中封装好的方法,例如这样调用jQuery.ajax([settings]),其中的参数分为:options,async,beforeSend(XHR),cache,complete(XHR, TS),contentType,context,data,dataFilter,dataType,error,global,ifModified,jsonp,jsonpCallback,password,processData,scriptCharset,success,traditional,timeout,type,url,username,xhr。光是参数就有这么多,其实实际编码中常用到的就几个:url(刷新时执行的路径),data(传递的数据),type(提交数据的方式,POST/GET),async(是否异步请求,默认true,同步请求将锁住浏览器,用户其它操作必须等待请求完成才可以执行。),cache(是否使用缓存效果,默认false,此时就是不缓存当前页面),success(成功后执行的函数)。公司内部采用的是代码形式如下来提交表单:
  

$.ajax({
     url :  “xxxxxxxx.action”,      //  这里写action提交的路径
     data : $(“#listForm).serialize(),  //  这里是提交的表单数据,同时序列化
     type : “post”,                //  这里是提交表单时用到的请求类型
     async:false,                 //  这里是不使用异步请求
     cache:false,                 //  这里是不使用缓存效果缓存当前页面
     success:function(data){xxx}   //   这里是成功执行后的函数
});

以上就是使用ajax来进行表单的提交。
  随后很幸运的赶上了一个新平台的合作,是公司从外面引进的一个报表系统平台,通过与数据库做交互查询来实现前端的报表系统展示,这个系统的培训我正好跟进了全程,于是从这周开始着手与报表系统打交道,而对于这个系统的基础是数据库的基础,为了达到业务部门报表前端的需求展示,后端对数据库的字段的要求有一些会比较复杂。总结一下学到的数据库方面的知识点。
  在数据库中,时间类型的字段有三种,分别是DATETIME ,TIMESTAMP[(M)] ,DATE。分别解释一下:DATETIME :日期和时间的组合。支持的范围是’1000-01-01 00:00:00’到’9999-12-31 23:59:59’。以’YYYY-MM-DD HH:MM:SS’格式显示DATETIME值,但允许使用字符串或数字为DATETIME列分配值。TIMESTAMP[(M)] :时间戳。范围是’1970-01-01 00:00:00’到2037年。 TIMESTAMP列用于INSERT或UPDATE操作时记录日期和时间。如果你不分配一个值,表中的第一个TIMESTAMP列自动设置为最近操作的日期和时间。也可以通过分配一个NULL值,将TIMESTAMP列设置为当前的日期和时间。 TIMESTAMP值返回后显示为’YYYY-MM-DD HH:MM:SS’格式的字符串,显示宽度固定为19个字符。如果想要获得数字值,应在TIMESTAMP 列添加+0。DATE 类型:可用于需要一个日期值而不需要时间部分时。以 ‘YYYY-MM-DD’ 格式检索与显示 DATE 值。支持的范围是 ‘1000-01-01’ 到 ‘9999-12-31’。
  这三项是关于时间字段的三种差别,接下来总结一下我学到的两个函数,一个是convert(),还有一个是datepart()。
convert()函数语法:convert(data_type(length),data_to_be_converted,style)
第一个参数是数据类型(长度),第二个参数是转化的数据列表名,第三个参数从固有选格式,例如112,对应的时间格式就是yymmdd。
datepart()函数:datepart(datepart,date)通过不同的datepart缩写来选择得到的格式。
date 参数是合法的日期表达式。datepart 参数也是固有的值:例如wk,对应周。
  在sql语句方面接触了一些语句,是一些之前在学校没学到过得,先从简单的开始说起。一个关键字in,这个关键字对应的是sql中的’=’,而它们的区别在于in后面可以有多个结果集,而’=’后面只能有一个结果集,例如select * from student where id = 1,这样的语句只能查询id=1的条件,如果要是用in的话,例如select * from student where id in(1,2,3),这样可以查出多个,有点像and语句似的。还接触到了case when语句,这个语句就像if似的是在sql里用来做判断,后面再钻研一下这个语句的具体用法。
  这些日子的收获主要是在和数据库相关的操作,其中还看到了存储过程(这个不会,以后有时间要研究一下)。
经过前面几周的流程熟悉,这周已经获得了一个小模块的编写任务,需求大概是因为随着“新增招待费用申请”模块使用时间增长,数据量也越来越大,为了方便查询,实现如下几个小改动:
1、财务审批阅读标注。在现有的结构上增加这个功能,后期审核时,对于已经审核过的可以手工标注,防止重复批注。
2、对于上述标注的标注时间进行一下记录,并对超过标注时间90天以上的单据,在查询的时候不在全部显示。
3、在上述功能调整后,再添加一个可以显示全部单据的功能。
  由于是第一次实际着手编码,在完成这3个功能的时间要长一些,这周我只完成了第一个功能,剩下的两个功能下周会完成。说一下这个小功能学到的东西以及遇到的坑。。。
  第一个坑就是从前端的角度去出发考虑,前端展示给大家看的都是以表格的形式进行的,而不是文本框,那么我要进行批注这个功能必然是需要让表格里变成文本框,于是通过不断地检索代码信息,最终可以完成双击表格,让其变成文本框,当输入完成后并且失去焦点,此时保存数据,用前面学到的ajax提交表单来实现入库处理。代码如下:
  

$(".td1").dblclick(function(){
        var td = $(this);
        var text = $.trim(td.text());
        var txt = $("<input type='text' >").val(text);
        txt.blur(function(){
            var rdremark = $(this).val();      
//获取同行不同列的值,通过当前对象的父节点的父节点(td->tr->table)获取td类名applyid这一列的遍历
            var applyid = $(this).parent().parent().find("td.applyid:eq(0)").text();
            alert("当前申请编号为:" + applyid + ",审核阅读标注修改成功!");
            $.ajax({
                url : "sop_cwbx_aJaxModifyRdremark",
                data : {"applyid" : applyid , 
                        "rdremark" : rdremark},
                type : "post",
                async : true,
                cache : false,
                dataType : "json",
                success : function(){               
                }
            });
            var newText = $(this).val();
            $(this).remove();
            td.text(newText);           
        });
        td.text("");
        td.append(txt);
        txt.focus();
    });
}

  在这其中遇到的坑是后台获取数据时一开始是怎么都获取不到的,后来请教了一下前辈,先让我在前端做个alert验证,看看前端有没有获取到值,这才让我恍然大悟。。。而从中学到的是获取数据可以先通过判断前端拿没拿到数据,再去后端做校验。因为这个是编辑功能,所以需要新添加一个字段,在库中新建字段,同时后面也要对时间:
  

/创建rdremark字段,类型字符串
alter table nod..zc_Finance_feeapply add rdremark varchar(112),
//创建createtime字段,类型时间
alter table nod..zc_Finance_feeapply add createtime datetime

  本周收获就是这些,下周继续完成剩下的两个功能模块。
这周是实习的第五周,经过上一周的流程熟悉,这周已经熟悉了“新增招待费用申请”模块,本周完成的是:
2、对于上述标注的标注时间进行一下记录,并对超过标注时间90天以上的单据,在查询的时候不在全部显示。
3、在上述功能调整后,再添加一个可以显示全部单据的功能。
  对于第二点的需求分析,让我学到了一个sql的函数,可以通过底层sql语句去写这个逻辑,有一个函数叫DATEDIFF(),这个函数的用法如下:
DATEDIFF(datepart,startdate,enddate)所以要想判断标记时间超过90天数据以上就可以用到这个函数,其中datepart是固定值,例如写dd,代表的就是日为单位,然后我的写法是这样来判断时间的:select * from nod..zc_Finance_feeapply where DATEDIFF(dd, createtime, GETDATE())<90;通过这样一条语句就可以显示出小于90天的数据,为了检测是否成功的判断了这个逻辑加上一条测试数据:update nod..zc_Finance_feeapply set rdremark=’呵呵’,createtime=’2016-03-12 ’ where applyid = ‘18’,通过前端页面测试数据完毕后成功筛选。
  对于第三点的分析,就比较简单了,不加条件的限制,只需添加一个按钮,然后查询这个表里的所有数据即可,通过select * from nod..zc_Finance_feeapply去调用到按钮上完成全部数据查询。
  同时这周末有一个小插曲,因为要买了一台新服务器,需要把之前服务器的数据库迁移到新的服务器上,因为就得服务器跑数据库太慢了,所以主动加入到这次计划中,顺便开拓一下视野,看看服务器是什么样子的。周末到了发现公司采用的是windows server的操作系统。顿时有点。。。。。。。因为之前一直听说现在的服务器基本都是用Linux的系统来支撑的,后来在这点上问了一下总监,为什么不采用Linux作为系统,总监说因为不是外网环境,所以从安全角度上来考虑没有什么影响,而Windows server作为服务器的操作系统减少了开发人员的学习成本,如果选用Linux则需要开发人员学习相关知识。可是是因为金融行业,并没有那么大的需求吧。但是从现在的公司来分析,大部分的操作系统都是Linux的。
  这周的收获是见识到了服务器,没有想象中的那么高大上,其实就是比普通电脑的内存和容量,配置高了一些,学习了数据库中DATEDIFF()函数的使用,还学到了一个UNION的用法,两表级联,顺序必须一致。
这周是实习的第六周,上周的模块做完后,这周又得到了新的模块,学习到了关于数据字典的编程思想。需求如下:
RATING_LVL RATING_LVL_NAME
1 低
2 较低
3 中
4 较高
5 高
风测期限:
1 短期——0(含)到1年(不含)
2 中短期——1(含)到3年(不含)
3 中长期——3(含)到5年(不含)
4 长期——5年(含)以上

风测级别
固收类 1 固定收益类或同等风险级别的投资品种,如债券、货币市场基金、债券基金等
权益类 2 权益类或同等风险级别的投资品种,如股票、混合型基金、偏股型基金、股票型基金等
另类 3 另类或同等风险级别的投资品种,如信托、基金专项计划等
杠杆类 4 杠杆类或同等风险级别的投资品种,如融资融券、期货、期权等
复杂类 5 复杂或高风险金融产品
  通过以上的3个类型来分别匹配数据库中的字段,比如在风测级别中,1这个数字就对应固收类,然后他的内容是后面的一长串,而前端页面我需要做的是把固收类显示在前端页面上,此时对应的数字来决定后面的内容。这时就需要用到的是字典表的设计理念,直接在dict表中插入如下语句:
  

insert into tongji..t_dict values ('1','低','fcjb','1')
insert into tongji..t_dict values ('2','较低','fcjb','1')
insert into tongji..t_dict values ('3','中','fcjb','1')
insert into tongji..t_dict values ('4','较高','fcjb','1')
insert into tongji..t_dict values ('5','高','fcjb','1')
insert into tongji..t_dict values ('1','固收类','fclb','1')
insert into tongji..t_dict values ('2','权益类','fclb','1')
insert into tongji..t_dict values ('3','另类','fclb','1')
insert into tongji..t_dict values ('4','杠杆类','fclb','1')
insert into tongji..t_dict values ('5','复杂类','fclb','1')
insert into tongji..t_dict values ('1','短期——0(含)到1年(不含)','fcqx','1')
insert into tongji..t_dict values ('2','中短期——1(含)到3年(不含)','fcqx','1')
insert into tongji..t_dict values ('3','中长期——3(含)到5年(不含)','fcqx','1')
insert into tongji..t_dict values ('4','长期——5年(含)以上','fcqx','1')
而风测类别前端的代码处理是这样的:
<select name="fclb" style="width:83px">
                <option value="1">固收类</option>
                <option value="2">权益类</option>
                <option value="3">另类</option>
                <option value="4">杠杆类</option>
                <option value="5">复杂类</option>
               </select>

  通过option的value来与数据库中的字典表相互对应起来,最终实现逻辑上的需求。
这个需求完成后,我还记得之前一直说的case when 语句,这周抽时间总结了一下。
比如这样的一条语句:
select * , convert(datetime,bizdate,105)as riqi,
case when
flag in (‘港股交易’) then ‘港股通交易佣金(未扣营业税)’
when
flag in (‘买入跟随’,’卖出跟随’)then ‘A股跟随交易佣金(未扣营业税)’
else flag
end as Nflag
from nod..sop_jgt_logasset
意思就是,查询logasset这张表的所有内容,并且把bizdate这个字段转化为日期类型并且重命名为riqi,case when就是当flag=港股交易的时候,则把flag归为港股通交易佣金(未扣营业税),后面的when是一个意思,else flag是剩下的不变,end as Nflag这句话是结束了条件同时把上面的步骤归到新增列Nflag中。

终止

  通过这几周的企业中实习,真的是学到了不少东西,例如ajax的使用,数据库高级语句(case when)的使用等等,我们更多学到的是不懂就要问和自己应该尽自己的全力去尝试,哪怕失败,也要尽自己的全力,和身边的同学一起探讨而不是抄袭,团队合作和发挥团队意识,最后在自己的努力下终于运行成功,这种感觉美不可言,心情愉悦至极,有很强的成就感。我第一次体会到Java工程师的工作是什么样子的,也发现了很多不曾注意到的细节,在实习的演示过程中,我对作为一名Java工程师注意的事项应该从小事做起、从基本做起。相信在以后的工作中能更加的沉稳,不断地学习进步!

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值