还剩34页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
长沙民政职业技术学院毕业实践报告题目____________________类型毕业论文毕业设计毕业专题毕业论文指导老师____李政仪______________系别__软件学院__________________班级____计应0833__________________学号____0825043335_______________姓名____胡蓉________________________年月日客户关系管理系统计应0833班项目参与人员学号姓名职位0825043335胡蓉组长汪利君何珍妮目录1概述………………………………………………………………………………………
11.1范围…………………………………………………………………………………
21.2软硬件坏境需求………………………………………………………………………………
21.3安全保密需求……………………………………………………………………
21.4可维护性与可扩展性需求……………………………………………………………………32功能性需求…………………………………………………………………………
32.1用户管理……………………………………………………………………………
32.
1.1用户注册…………………………………………………………………
42.
1.2用户登录………………………………………………………………………
42.
1.
2.1用户登陆模块………………………………………………………………………
52.2客户管理……………………………………………………………………………
62.
2.1客户列表………………………………………………………………………
72.
2.2客户添加……………………………………………………………………
72.
2.
2.1客户添加流程……………………………………………………………
72.
2.3客户修改………………………………………………………………
82.
2.4客户删除………………………………………………………………………
82.
2.5客户共享……………………………………………………………………………
82.
2.6客户移交…………………………………………………………………………
92.
2.7查看详细信息………………………………………………………………………
132.
2.8共享客户……………………………………………………………………………
92.
2.
8.1我共享给别人的客户……………………………………………………………
92.
2.
8.2别人共享给我的客户……………………………………………………………
92.3联系人管理…………………………………………………………………………
102.
3.1联系人列表…………………………………………………………………………
102.
3.2联系人添加………………………………………………………………………
112.
3.3联系人修改…………………………………………………………………………
112.
3.4联系人删除………………………………………………………………………
122.
3.5查看联系人详细信息……………………………………………………………123其他功能性需求解析…………………………………………………………
133.1解决中文乱码………………………………………………………………………
133.2判断是否已登录…………………………………………………………………
133.3日志管理…………………………………………………………………144数据库设计…………………………………………………………14结论………………………………………………………………………………………22致谢………………………………………………………………………………………23参考文献…………………………………………………………………………………24附录………………………………………………………………………………………251概述 客户关系管理系统是以客户为中心,基于客户生命周期的全过程,采用协同技术和理念,帮助企业更好的获取客户、保留客户及提升客户价值、提高客户满意度和忠诚度,有效的避免客户信息流失,从而全面提升企业竞争能力和盈利能客户是公司最宝贵的资源,为了更好的发掘老客户的价值,并开发更多新客户,通过这个客户关系管理系统完成对客户基本信息、联系人信息、交往信息、客户服务信息的充分共享和规范化管理客户服务是一个涉及多个部门,存在一定流程的工作客户服务水平的高低决定着公司的核心竞争力该客户关系管理系统应提供一个客户服务在线平台,使客户服务处理过程中相关人员可以在线完成服务的处理和记录工作
1.1范围本系统包括用户管理、客户管理、联系人管理三个功能模块
1.2软硬件坏境需求本系统采用Oracle10数据库,使用JavaEE进行开发,采取B/S架构数据库设计原则上符合第三范式,且规范,易于维护程序采用SSH(struts2+hibernate3+spring三大框架,使用MVC模式,保证系统的可维护性和可扩展性系统应可运行于Windows平台或Unix平台(数据库服务器运行于Windows平台)
1.3安全保密需求本系统的系统架构,以及权限机制可以保证系统的安全性首先,从系统架构看,本系统采用B/S模型,从而使服务器数据源与客户端分离,保证了数据的物理独立性;其次,本系统的用户授权机制通过角色的定义管理实现,通过定义某些角色能进行的操作权限,和定义用户拥有的角色,限定用户的操作权限,实现对用户的授权
1.4可维护性与可扩展性需求本系统的应用平台设计中选择B/S结构,采用基于JAVA技术并且符合JavaEE开发规范的系统应用平台,并采用三层结构,使系统具有良好的可维护性和可扩展性
2、功能性需求本系统主要分用户管理、客户管理、联系人管理用户管理管理员的权限有登陆、注册、客户管理、联系人管理其中客户管理包括添加客户、删除客户、修改客户、客户共享、客户移交;联系人管理包括添加联系人、删除联系人、修改联系人用户用例图用户注册在登录页面点击“注册”超级链接,跳转到用户注册页面,在页面输入相应的信息(有*的为必填项),点击“提交”按钮,如果注册成功,3秒钟后跳转到登陆页面,否则,显示错误信息,停留在当前页面点击“重填”按钮,可以全部清空当前页面的内容,重新进行填写注意
(1)用户名必须3个字符以上;密码6个字符以上,email的格式正确,用jquery来进行验证
(2)在保存前先判断用户名是否已经存在,若用户名已经存在,弹出“此用户名已经存在,不可用”,需重新输入用户名,若不存在,弹出“此用户名可用”信息框用dwr实现此功能用户注册页面验证用户是否已存在先在dwr.xml配置文件中进行配置dwrallow!--用户是否已经存在--createcreator=springjavascript=JUserparamname=beanNamevalue=userservice/includemethod=isExitUser/!--包含这个方法--/create/allow/dwr在页面导入三个js文件scripttype=text/javascriptsrc=MyCRM/dwr/interface/JUser.js/scriptscripttype=text/javascriptsrc=MyCRM/dwr/engine.js/scriptscripttype=text/javascriptsrc=MyCRM/dwr/util.js/script在页面中用javascript来验证scripttype=text/javascriptfunctiontestuser{varname=document.getElementByIdtxtusername.value;JUser.isExitUsernamefunctiondate{ifdate==true{alert此用户名已存在,不可用;}else{alert此用户名可用;}};}/scriptinputtype=textname=user.usernameid=txtusernameonblur=testuser///当鼠标离开文本框时触发事件关键代码讲解//处理注册publicStringdoregister{PrintWriterout=null;try{out=ServletActionContext.getResponse.getWriter;}catchIOExceptione{e.printStackTrace;}intresult=uservice.addUseruser;ifresult==1{//注册成功out.printscriptalert注册成功;location.href=/MyCRM/User/login.jsp;/script;}ifresult==2{//用户名已经存在out.printscriptalert用户名已经存在;history.go-1;/script;}ifresult==0{//注册成功out.printscriptalert注册失败;history.go-1;/script;}returnSUCCESS;}用户登录输入用户名和密码,在获取页面参数后,先通过用户名查询数据库,如果该用户名存在,则再查询与该用户名匹配的密码是否与页面获取的密码一致,如果一致,就可以进入主界面;如果不一致,弹出“密码输入错误“信息框,须重新输入密码;如果用户名不存在,则弹出”用户名不存在“信息框,需重新输入用户名登陆页面用户登录流程分析图用户登录模拟执行流程用户登陆代码详解//处理登录publicStringdologin{MapStringObjectsession=ActionContext.getContext.getSession;intuserid=uservice.selecUserByNameuser.getUsername.getUserid;//通过用户名查询iduser.setUseriduserid;booleanflag=uservice.loginuser;//调用方法ifflag{session.putuseruser;//把用户信息存入sessionCookiecook=newCookieloginuseruser.getUsername;//创建cookie,保存用户的用户名,cook.setMaxAge60*60;//设置有效时间ServletActionContext.getResponse.addCookiecook;//添加cookieMapStringObjectapplication=ActionContext.getContext.getApplication;Objectobj=application.getcount;ifobj==null{application.putcount1;//如果之前没有人登录,则count赋值为1}else{application.putcount1+Integerobj;//如果已有人登录,则把取出的值加1}returnSUCCESS;}else{this.addFieldErroruser.username对不起,密码错误,您不能登录!;//如果登陆出错,在页面显示}returnSUCCESS;}//如果登陆出错,在页面用红色字体显示错误信息divstyle=color:red;align=centers:fielderror/s:fielderror/div主页面用户成功登录后进入系统主界面主页面点击“刷新“链接刷新当前页面,“前进”链接返回到本页面之前查看的前一个页面,“后退“链接返回到前一个出现的页面;“退出系统”退出当前系统,进入登陆页面左页面中有“欢迎您sa“的字样,sa是当前登陆的用户名头页面有显示当前用户是第几位访问本系统,并显示用户登录的当前时间点击头页面的相关链接会跳转到相应的页面注解
(1)欢迎您%=Userssession.getAttributeuser.getUsername%
(2)您是第%=application.getAttributecount%位访问者
(3)今天是%GetDategetdate=newGetDate;%%=getdate.getDate%退出系统点击主页面的“退出系统”链接,弹出“确定退出系统”询问框,点击“确定”按钮,则退出系统进入登陆页面,点击“取消”则停在当前页面关键代码讲解//处理退出publicStringdoexit{MapStringObjectsession=ActionContext.getContext.getSession;session.removeuser;returnlogin;}客户管理A、客户列表点击客户管理下面的“客户列表”链接,可以查看当前用户下面的所有客户信息在客户名称和地址栏中输入关键字,点击“查询”按钮,可以进行模糊搜索,也可以两个条件同时进行模糊查询在文本框中输入想要跳转到得页面数字,点击“转”链接,就可以跳转到相应的页面如输入“3”,就可以跳转到第三页列表页面关键代码讲解//列表publicStringsearch{HttpServletRequestrequest=ServletActionContext.getRequest;intpage=1;ifrequest.getParameterpage!=null{try{page=Integer.valueOfrequest.getParameterpage;}catchExceptione{page=1;//处理异常,显示第一页}}MapStringObjectsession=ActionContext.getContext.getSession;intuserid=Userssession.getuser.getUserid;//获取session中的用户idintcount=cservice.getCustomCountcustomuserid;//总记录数MyPagemypage=newMyPage3countpage;//分页ListUsersuserlist=uservice.getAll;request.setAttributeuserlistuserlist;cservice.listallcustommypageuserid;request.setAttributemypagemypage;returnSUCCESS;}B、客户添加点击列表页面“新增”链接,或客户管理下面的“新增客户”链接,跳转到客户添加页面填写好相关信息后(*为必填项),点击“确定”按钮,如果添加成功,返回列表页面,页面自动刷新,刚添加的记录显示在第一行;否则,显示错误信息,停留在当前页面点击“返回”链接可以返回到前一个页面,点击“重填”按钮,可以全部清空当前页面的内容,重新进行填写注意
(1)客户名称必须填写,用jquery验证
(2)dwr验证客户名称是否已经存在
(3)国家、省/州、城市用js实现动态关联说明系统的客户均指的是公司客户;每一个客户均有一个所有者,默认情况下,增加人(登录用户)即为该客户的所有者添加信息活动图添加信息的活动图关键代码讲解//处理添加publicStringadd{intresult=cservice.addCustomcustom;//调用方法HttpServletResponseresponse=ServletActionContext.getResponse;PrintWriterout=null;try{out=response.getWriter;}catchIOExceptione{e.printStackTrace;}ifresult==1{//添加成功returnSUCCESS;}ifresult==2{//用户名已经存在out.printscriptalert用户名已经存在;history.go-1;/script;returnnull;}ifresult==0{//添加失败out.printscriptalert添加失败;history.go-1;/script;returnnull;}returnSUCCESS;}C、客户修改点击列表页面的“修改”链接,跳转到客户修改页面,页面显示该客户原来信息的值修改完相关信息后,点击“确定”按钮,如修改成功,返回到列表页面,页面自动刷新,否则,显示“修改失败”,停留在当前页面点击“重填”按钮,可以全部清空当前页面的内容,重新进行填写点击“返回”链接可以返回到前一个页面说明客户在进行修改的时候,如果没有对国家进行选择,则以其原来的国家、省/州、城市的值为准,更新数据库,如果已经进行了选择,则是把已经选择的国家、省/州、城市的值更新到数据库关键代码讲解//到修改页面,获取客户原来的信息publicStringtoedit{custom=cservice.getCustomByIdcustom.getCustomid;returnSUCCESS;}//处理修改publicStringdoedit{HttpServletRequestrequest=ServletActionContext.getRequest;MapStringObjectsession=ActionContext.getContext.getSession;intuserid=Userssession.getuser.getUserid;//从session中获得用户id的值Usersuser=newUsers;user.setUseriduserid;//获取页面国家、省/州、城市下拉列表的值Stringcmaincountry=custom.getCmaincountry;Stringcmainprovince=custom.getCmainprovince;Stringcmaincity=custom.getCmaincity;//获取页面隐藏域国家、省/州、城市的值,是原来的值Stringhiddmaincountry=request.getParameterhiddmaincountry;Stringhiddmainprovince=request.getParameterhiddmainprovince;Stringhiddmaincity=request.getParameterhiddmaincity;//如果没有对国家等进行选择,则以原来的国家等值更新数据库(即隐藏域的值),如果对国家等进行了选择,则以选择的为准更新数据库if国家.equalscmaincountry{custom.setCmaincountryhiddmaincountry;}else{custom.setCmaincountrycmaincountry;}if省份/州.equalscmainprovince{custom.setCmainprovincehiddmainprovince;}else{custom.setCmainprovincecmainprovince;}if地级市/县.equalscmaincity{custom.setCmaincityhiddmaincity;}else{custom.setCmaincitycmaincity;}intresult=cservice.updateCustomcustom;//调用方法HttpServletResponseresponse=ServletActionContext.getResponse;PrintWriterout=null;try{out=response.getWriter;}catchIOExceptione{e.printStackTrace;}ifresult==1{//修改成功returnSUCCESS;}ifresult==2{//修改后的客户名称已经存在out.printscriptalert用户名已经存在;history.go-1;/script;returnnull;}ifresult==0{//修改失败out.printscriptalert修改失败;history.go-1;/script;returnnull;}returnSUCCESS;}D、客户删除客户删除可以单个删除一条记录,也可以同时删除多条记录
(1)单个删除在列表页面点击“删除”链接,弹出“确定要删除吗?”询问框,点击“确定”,如果删除成功,则删除此记录,列表页面自动刷新,否则显示“删除失败“信息框;点击“取消”则不删除此记录关键代码讲解//单个删除publicStringdel{intresult=cservice.deleteLinkByCustidcustom.getCustomid;//调用方法(通过客户id来删除)HttpServletResponseresponse=ServletActionContext.getResponse;PrintWriterout=null;try{out=response.getWriter;}catchIOExceptione{e.printStackTrace;}ifresult==0{//删除失败out.printlnscriptalert删除失败;history.go-1;/script;returnnull;}ifresult==1{//删除成功returnSUCCESS;}returnSUCCESS;}
(2)批量删除选择要删除客户前面的复选框,点击“删除“按钮,会先进行判断是否已经选择了客户,如果没有选择客户,则会弹出”必须至少选择一个进行删除“信息框如果删除成功,列表页面自动刷新,否则,显示”删除失败“信息框说明这里删除客户的时候,如果客户已经共享了就不能再删除,而且删除客户的时候会同步删除该客户下面所有的联系人关键代码讲解//批量删除publicStringdelmany{HttpServletResponseresponse=ServletActionContext.getResponse;intresult=cservice.dropSomeCustomcbox;//客户列表复选框的idPrintWriterout=null;try{out=response.getWriter;}catchIOExceptione{e.printStackTrace;}ifresult==0{out.printlnscriptalert删除失败;history.go-1;/script;returnnull;}ifresult==1{returnSUCCESS;}returnSUCCESS;}E、客户共享客户共享就是用户将自己的指定客户共享给其他的用户,这样其他的用户可以查看共享客户的相关信息,但不能对客户进行操作在列表页面选择要共享的客户(客户信息前面的复选框),点击“客户共享给”按钮,跳转到共享页面(可以同时共享多个客户)主要代码讲解//选择要共享的客户publicStringchoice{HttpServletRequestrequest=ServletActionContext.getRequest;ListUsersuserlist=uservice.getAll;//得到所有用户request.setAttributeuserlistuserlist;MapStringObjectsession=ActionContext.getContext.getSession;intuserid=Userssession.getuser.getUserid;ListCustomlistcust=cservice.getCustomByUseruserid;request.setAttributelistcustlistcust;returnSUCCESS;}//共享给publicStringtoshare{HttpServletRequestrequest=ServletActionContext.getRequest;ListCustomcustom=cservice.selectByCidscbox;request.setAttributecustomcustom;ListUsersuserlist=uservice.getAll;//得到所有用户request.setAttributeuserlistuserlist;returnSUCCESS;}表格上面显示已选择的客户,下面显示可以共享给的用户,选择要共享的用户(复选框),点击“共享”按钮,如客户以共享,弹出“客户已共享“信息框,如共享成功,跳转到“我共享给别人的用户”页面,页面自动刷新;否则,显示错误信息(可以同时共享给多个用户,即多对多共享)注意在点击“客户共享给“按钮的时候会进行判断是否已经选择了客户,如果没有选择客户,则会弹出”必须至少选择一个客户进行共享“信息框点击“返回”链接可以返回到前一个页面关键代码讲解//共享的按钮事件publicStringdoshare{HttpServletResponseresponse=ServletActionContext.getResponse;PrintWriterout=null;try{out=response.getWriter;}catchIOExceptione{e.printStackTrace;}intresult=csservice.addShareuserboxcustbox;ifresult==1{returnSUCCESS;}ifresult==2{out.printscriptalert用户已共享;history.go-1;/script;returnnull;}ifresult==0{out.printscriptalert共享失败;history.go-1;/script;returnnull;}returnSUCCESS;}F、客户移交客户移交就是用户可以把自己的客户移交给其他的用户,那么其他的用户就拥有了对客户管理的权限,可以对客户进行增删改查、移交共享等操作选择要移交的客户(可多选),在下拉列表中选择移交的用户,点击“客户移交”按钮,如移交成功,返回到列表页面,页面自动刷新,不会再显示已移交的客户信息,否则,弹出“移交失败“信息框注意点击“客户移交“按钮时,会先进行判断是否已选择了客户和用户,如果没有选择客户,则弹出”至少要选择一个客户进行移交“信息框,如果没有选择用户,则会弹出“请选择用户”信息框关键代码讲解//客户移交publicStringmove{HttpServletResponseresponse=ServletActionContext.getResponse;PrintWriterout=null;try{out=response.getWriter;}catchIOExceptione{e.printStackTrace;}intresult=cservice.editCustByIdscustom.getUsers.getUseridcbox;ifresult==0{out.printlnscriptalert移交失败;history.go-1;/script;returnnull;}ifresult==1{returnSUCCESS;}returnSUCCESS;}G、查看详细信息点击列表页面的“详细信息“链接,跳转到客户详细信息页面,获取当前客户所有信息客户详细信息页面上部分显示当前客户的所有详细信息,下部分显示当前客户下面的所有联系人信息点击“返回”链接可以返回到前一个页面关键代码讲解//详细信息publicStringtolook{custom=cservice.getCustomByIdcustom.getCustomid;HttpServletRequestrequest=ServletActionContext.getRequest;ListLinkmanlink=lservice.selectLinkmanByCustidcustom.getCustomid;//查询当前客户下的所有联系人request.setAttributelinklink;returnSUCCESS;}H、客户共享
(1)我共享给别人的客户点击客户管理下面的“我的共享”链接,跳转到“我共享给别人的客户”页面,该页面显示由“我”(当前登录用户)共享给其他用户的所有客户信息关键代码讲解//显示我共享给别人的信息publicStringsharetoother{HttpServletRequestrequest=ServletActionContext.getRequest;intpage=1;ifrequest.getParameterpage!=null{try{page=Integer.valueOfrequest.getParameterpage;}catchExceptione{page=1;//处理异常,显示第一页}}MapStringObjectsession=ActionContext.getContext.getSession;intuserid=Userssession.getuser.getUserid;intcount=csservice.getCountByCidsharecustuserid;MyPagemypage=newMyPage2countpage;ListSharecustlist=csservice.getCustPageByCiduseridmypage.getCurpagemypage.getPagesize;mypage.setResultlist;request.setAttributelistlist;request.setAttributemypagemypage;returnSUCCESS;}
(2)别人共享给我的客户点击客户管理下面的“客户共享”链接,跳转到“别人共享给我的客户”列表页面,该页面显示别人共享给“我”的所有客户信息关键代码讲解//显示别人共享给我的信息publicStringdolist{HttpServletRequestrequest=ServletActionContext.getRequest;intpage=1;ifrequest.getParameterpage!=null{try{page=Integer.valueOfrequest.getParameterpage;}catchExceptione{page=1;//处理异常,显示第一页}}MapStringObjectsession=ActionContext.getContext.getSession;intuserid=Userssession.getuser.getUserid;intcount=csservice.getCountTosharecustuserid;MyPagemypage=newMyPage2countpage;ListSharecustlist=csservice.getCustByPageuseridmypage.getCurpagemypage.getPagesize;mypage.setResultlist;request.setAttributelistlist;request.setAttributemypagemypage;returnSUCCESS;}联系人管理A、联系人列表点击联系人管理下面的“联系人列表”链接,跳转到联系人列表页面可以通过联系人名称,客户名称,联系人邮箱地址分别进行模糊查询,也可以两个条件或三个条件同时进行模糊查询,点击“查找”按钮即可点击“清除”按钮,可以清除文本框的内容,再进行填写在根据客户名称进行模糊查询的时候,必须先在下拉列表选择客户,选择的客户会显示在前面的文本框内在文本框中输入想要跳转到得页面数字,点击“转”链接,就可以跳转到相应的页面如输入“3”,就可以跳转到第三页点击联系人列表上面的“A~Z”26个英文字母,如点击“L”字,则查询姓名中拼音字母以“L”开头的联系人记录关键代码讲解//列表publicStringsearch{HttpServletRequestrequest=ServletActionContext.getRequest;MapStringObjectsession=ActionContext.getContext.getSession;intuserid=Userssession.getuser.getUserid;intpage=1;ifrequest.getParameterpage!=null{try{page=Integer.valueOfrequest.getParameterpage;}catchExceptione{page=1;//处理异常,显示第一页}}intcount=lservice.getLinkmanCountlinkmanuserid;//查询数量MyPagemypage=newMyPage2countpage;ListCustomcustom=cservice.getCustomByUseruserid;//通过用户id查询客户request.setAttributecustomcustom;//主要用在添加联系人时选择客户(下拉列表)lservice.searchlinkmanmypageuserid;//模糊查找request.setAttributemypagemypage;returnSUCCESS;}B、联系人添加点击联系人管理下面的“添加联系人”链接或列表页面的“新增”链接,跳转到新增联系人页面在页面填写好相关信息后(其中*为必填项),点击“确定”按钮,如果添加成功,返回联系人列表页面,页面自动刷新,否则,显示错误信息,停留在当前页面点击“取消”按钮,可以全部清空当前页面的内容,重新进行填写点击“返回”链接可以返回到前一个页面注意
(1)联系人的姓、名、电子邮箱必须填写且电子邮箱格式必须正确
(2)客户必须进行选择关键代码讲解//添加联系人的时候在客户的下拉列表中显示客户的信息publicStringtoadd{HttpServletRequestrequest=ServletActionContext.getRequest;MapStringObjectsession=ActionContext.getContext.getSession;intuserid=Userssession.getuser.getUserid;ListCustomlistcu=cservice.getCustomByUseruserid;request.setAttributelistculistcu;//通过当前用户id查询的所有客户returnSUCCESS;}//处理添加publicStringdoadd{Stringname=linkman.getLinkmanname;Stringlinkcalled=linkman.getLinkmancalled;Stringcname=name.concatlinkcalled;linkman.setCnamecname;//将联系人的姓和名结合起来组成联系人的全称CnToFirstfirst=newCnToFirst;Stringfirstletter=first.getFirstLetterlinkman.getCname;linkman.setFirstletterfirstletter;//截取联系人名称每个字的首字母组成字符串存入数据库中intresult=lservice.addLinkManlinkman;//调用方法HttpServletResponseresponse=ServletActionContext.getResponse;PrintWriterout=null;try{out=response.getWriter;}catchIOExceptione{e.printStackTrace;}ifresult==0{out.printlnscriptalert添加失败;history.go-1;/script;returnnull;}ifresult==1{returnSUCCESS;}ifresult==2{out.printlnscriptalert员工名称已经存在;history-1;/script;returnnull;}returnSUCCESS;}C、联系人修改在列表页面点击“修改”链接,跳转到联系人修改页面,页面获取原来记录的所有信息对相关信息进行修改后,点击“确定”按钮,如果修改成功,返回列表页面,页面自动刷新,否则,显示错误信息,停留在当前页面点击“重填”可以清除所有信息,重新进行填写,点击“返回”链接可以返回上一个页面关键代码讲解//到修改页面获取原来的信息publicStringtoedit{HttpServletRequestrequest=ServletActionContext.getRequest;MapStringObjectsession=ActionContext.getContext.getSession;intuserid=Userssession.getuser.getUserid;//从session中获取用户idListCustomlist=cservice.getCustomByUseruserid;request.setAttributelistlist;//获取所属客户的信息linkman=lservice.getLinkManByIDlinkman.getLinkmanid;request.setAttributelinkmanlinkman;//将查询的值放入session中returnSUCCESS;}//处理更新publicStringdoedit{HttpServletResponseresponse=ServletActionContext.getResponse;Stringname=linkman.getLinkmanname;Stringlinkcalled=linkman.getLinkmancalled;Stringcname=name+linkcalled;linkman.setCnamecname;//将联系人的姓和名结合起来组成联系人的全称intresult=lservice.updateLinkManlinkman;//调用方法PrintWriterout=null;try{out=response.getWriter;}catchIOExceptione{e.printStackTrace;}ifresult==1{returnSUCCESS;}ifresult==2{out.printlnscriptalert用户名已经存在;history.go-1;/script;returnnull;}ifresult==0{out.printlnscriptalert修改失败;history.go-1;/script;returnnull;}returnSUCCESS;}D、联系人删除删除联系人可以单个删除一条记录,也可以同时删除多条记录
(1)单个删除在列表页面点击“删除”链接,弹出“确定要删除吗?”询问框,点击“确定”,则删除此记录,列表页面自动刷新,点击“取消”则不删除此记录关键代码讲解//单个删除publicStringdel{HttpServletResponseresponse=ServletActionContext.getResponse;intresult=lservice.dropLinkManByIDlinkman.getLinkmanid;//通过联系人id删除PrintWriterout=null;try{out=response.getWriter;}catchIOExceptione{e.printStackTrace;}ifresult==0{out.printlnscriptalert删除失败;history.go-1;/script;returnnull;}ifresult==1{returnSUCCESS;}returnSUCCESS;}
(2)批量删除选中联系人列表页面的复选框,点击“删除“按钮,先会判断是否已经选择了复选框,如果没有选择,弹出”必须至少选择一个进行删除“信息框,如果删除成功,列表页面自动刷新,否则,显示”删除失败“信息框关键代码讲解//批量删除publicStringdelmany{HttpServletResponseresponse=ServletActionContext.getResponse;intresult=lservice.delManyByIdslinkids;//调用方法PrintWriterout=null;try{out=response.getWriter;}catchIOExceptione{e.printStackTrace;}ifresult==0{out.printlnscriptalert删除失败;history.go-1;/script;returnnull;}ifresult==1{returnSUCCESS;}returnSUCCESS;}E、查看联系人详细信息点击列表页面“详细信息”链接,跳转到联系人详细信息页面,页面获取当前联系人的原本信息点击“返回”可以返回到前一个页面,点击“首页“链接,跳转到主页面关键代码讲解//查看详细信息publicStringtolook{linkman=lservice.getLinkManByIDlinkman.getLinkmanid;//通过联系人id得到所有returnSUCCESS;}
3、其他功能性需求解析
1、解决中文乱码
(1)写一个struts拦截器方法SetCharsetFilter.javapublicclassSetCharsetFilterimplementsFilter{publicvoiddestroy{//TODOAuto-generatedmethodstub}publicvoiddoFilterServletRequestrequestServletResponseresponseFilterChainchainthrowsIOExceptionServletException{HttpServletRequestreq=HttpServletRequestrequest;HttpServletResponseres=HttpServletResponseresponse;req.setCharacterEncodinggbk;res.setCharacterEncodinggbk;chain.doFilterreqres;}publicvoidinitFilterConfigarg0throwsServletException{//TODOAuto-generatedmethodstub}}
(2)在web.xml配置文件中进行拦截器的配置filterfilter-nameSetCharsetFilter/filter-namefilter-classcom.skeyedu.crm.filter.SetCharsetFilter/filter-class/filterfilter-mappingfilter-nameSetCharsetFilter/filter-nameurl-pattern/*/url-pattern/filter-mapping
2、判断是否已登录
(1)写一个拦截器LoginInterceptor.javapublicclassLoginInterceptorimplementsInterceptor{publicvoiddestroy{//TODOAuto-generatedmethodstub}publicvoidinit{//TODOAuto-generatedmethodstub}//处理是否已登录publicStringinterceptActionInvocationinvocationthrowsException{MapStringObjectsession=invocation.getInvocationContext.getSession;ifsession.getuser==null{//用户信息存放在session(user)中returnActionSupport.LOGIN;}else{returninvocation.invoke;}}}
(2)在struts.xml配置文件中进行配置packagename=mystrutsextends=struts-default!--struts拦截器--interceptorsinterceptorname=checkloginclass=com.skeyedu.crm.filter.LoginInterceptor/interceptorinterceptor-stackname=myinterceptorinterceptor-refname=defaultStack/interceptor-refinterceptor-refname=checklogin/interceptor-ref/interceptor-stack/interceptorsdefault-interceptor-refname=myinterceptor/default-interceptor-refglobal-resultsresultname=logintype=redirect/User/login.jsp/result/global-results/package//如果没有登录,则跳转到登陆页面login.jsp
3、日志管理log4j.xml文件xmlversion=
1.0encoding=UTF-8!DOCTYPElog4j:configurationPUBLIC-//log4j/log4jConfiguration//ENlog4j.dtdlog4j:configurationxmlns:log4j=http://jakarta.apache.org/log4j/appendername=STDOUTclass=org.apache.log4j.ConsoleAppenderlayoutclass=org.apache.log4j.PatternLayoutparamname=ConversionPatternvalue=%d%-5p%c.%M:%L-%m%n//layout/appender!--specifythelogginglevelforloggersfromotherlibraries--loggername=com.opensymphonylevelvalue=DEBUG//loggerloggername=org.apache.struts2levelvalue=DEBUG//logger!--forallotherloggerslogonlydebugandabovelogmessages--rootpriorityvalue=INFO/appender-refref=STDOUT//root/log4j:configuration
3、dwr的用法加载dwr的步骤
(1)用到dwr必须先导入相应的jar包dwr.jar
(2)创建一个名为dwr.xml的xml文件,所有相关dwr的配置文件都在此配置文件中配置
(3)在web.xml配置文件中必须有对dwr的配置!--dwr配置--servletservlet-namedwr-invoker/servlet-nameservlet-classorg.directwebremoting.servlet.DwrServlet/servlet-classinit-paramparam-namedebug/param-nameparam-valuetrue/param-value/init-param/servlet
4、数据库设计本项目主要有三个表用户表、客户表、联系人表、共享表;其中共享主要是存储客户的共享信息用户表Users存储用户的详细信息,userid是主键字段名数据类型字段是否为空备注useridNumber6用户id否PKusernameVarchar220用户名否userpwdVarchar220密码否nameVarchar220姓否calledVarchar220名否emailVarchar250邮箱是companynameVarchar250公司名称否companyemailVarchar250公司邮箱否businessVarchar240所属行业是businesslineVarchar220业务范围是companytypeVarchar220公司类型是companyaddressVarchar240公司地址是rtelephoneVarchar220联系人电话是telephoneVarchar220联系电话是rnameVarchar220联系人姓名否faxVarchar240传真是marksVarchar2200备注是客户表Custom存储客户的详细信息customid是主键,userid是外键字段名数据类型字段名是否为空备注CustomidNumber6客户id否PKUseridNumber6用户id否FKCustomnameVarchar220客户名称否CustshortVarchar26客户简称是CtelephoneVarchar220电话是CfaxVarchar240传真是CbusinessVarchar220行业是CtypeVarchar210类型是CsourceVarchar220来源是CgradeVarchar220等级是CbankVarchar240开户银行是CbanknumberVarchar240银行账户是CnetnameVarchar240网站名称是CmainaddressVarchar240主地址是CotheraddressVarchar240其他地址是CmaincountryVarchar220主国家是CothercountyrVarchar220其他国家是CmainprovinceVarchar220省/州是CotherprovinceVarchar220其他省/州是CmaincityVarchar220城市是CothercityVarchar220其他城市是CmainpostVarchar220主邮编是CotherpostVarchar220其他邮编是联系人表Linkman存储联系人详细信息lianmanid是主键custonid是外键字段名数据类型字段名是否为空备注LinkmanidNumber6联系人id否PKCustomidNumber6客户id否FKLinkmannameVarchar26姓否LinkmancalledVarchar210名否CnameVarchar220全称是LinksourceVarchar220接触来源是DepartVarchar220部门是PostVarchar220职务是SexVarchar24性别是BirthdayVarchar220生日是IDcardVarchar220身份证号码是CalledVarchar24呼叫情况是WorkphoneVarchar220办公电话是MobileVarchar220移动电话是HomephoneVarchar220家庭电话是OtherphoneVarchar220其他电话是FaxVarchar240传真是LinkemailVarchar240电子邮件否LinkQQVarchar220QQ是LinkMSNVarchar240MSN是LinkskypeVarchar220SKYPE是LinkotherwayVarchar240其他联系方式是共享表sharecust字段名数据类型字段是否为空备注idNumber6编号id否PKUseridVarchar220用户id否FKCustomidVarchar220客户id否FK
5、问题及解决方法问题一页面报java.lang.reflect.InvocationTargetException错误问题分析这个异常,一般是由于调用Mathod类的invoke方法,该方法所代表的指定方法抛出异常时,或者调用Constructor类的newInstance方法,该方法所代表的底层构造方法抛出异常时,由java.lang.reflect.InvocationTargetExceptio异常包装后作为新的异常抛出而产生,默认异常信息是NULL也可能是lazy属性的错误解决方案如果是前一种一般删除掉tomcat里的项目工程,重新部署即可;或把work下的都删除,重启服务器即可如果是后一者,把实体中的….hbm.xml文件中,将class标签的lazy属性改为false默认为true如果有schema=dbocatalog=test配置信息,将其删除就可以了问题二页面报antlr.collections.AST.getLineI错误问题分析因为Struts自带的antlr-
2.
7.
2.jar比Hibernate
3.3自带的antlr-
2.
7.
6.jar的版本要低,二者有冲突解决方案删除0myeclipse安装目录下面的所有antlr-
2.
7.
2.jar,如果程序已经运行过,则同时需要删除TOMCAT下的antlr-
2.
7.
2.jar问题三中文乱码问题问题分析JSP源文件中很可能包含有中文,而JSP源文件的保存方式是基于字节流的,如果JSP编译过程中,使用的编码方式与源文件的编码不一致,就会出现乱码,而JSP获取页面参数时一般采用系统默认的编码方式,如果页面参数的编码类型和系统默认的编码类型不一致,很可能就会出现乱码解决方案解决这类乱码问题的基本方法是在页面获取参数之前,强制指定request获取参数的编码方式request.setCharacterEncoding“GBK”;request.setCharacterEncoding“gb2312”;如果在JSP将变量输出到页面时出现了中文乱码问题,则可以通过在页面代码中设置response.setContentTypetext/html;charset=GBK;response.setContentTypetext/html;charset=gb2312;问题四SSH整合时报ErrorcreatingbeanwithnamesessionFactorydefinedinServletContextresource[/WEB-INF/classes/applicationContext.xml]:错误问题分析出现这个问题可能有两种可能一是strut2和spring整合的插件包没有导到项目;二是Spring中的“asm-
2.
2.
3.jar”和Hibernate中的“asm.jar”包冲突解决方案仔细检查项目,如果是第一种错,则把struts2-spring-plugin-
2.
2.
1.
1.jar导入到项目的WEB-INF下面的lib文件夹里即可,如果是后者错误,则移除Spring
2.0AOPLibraries中的“asm-
2.
2.
3.jar”即可,当然建议大家在lib文件夹下删除然后在项目中F5问题五添加成功,但是数据库中没有刚添加的记录问题分析出现这个问题主要是AOP在对事物进行管理时没有对添加事务进行管理,session已经关闭,没有对数据进行提交因配置中有这么一段代码tx:methodname=*read-only=true/意为对不合以上规则的其他方法不做事务提交或回滚处理,是只读的,一般是指不涉及到数据库更新的方法解决方案在applicationContext.xml配置文件中在管理事务的那一段代码中加上tx:methodname=add*propagation=REQUIREDrollback-for=Exception/意为对add开头的方法采用必要的事务处理(事务提交),出错时回滚问题六启动项目时报监听器的错误问题分析SSH整合时需要在web.xml配置文件中配置一个监听器,主要负责struts和spring的关联解决方案在web.xml中配置一个监听器即可!--监听器--listenerlistener-classorg.springframework.web.context.ContextLoaderListener/listener-class/listenerLogin.jsp.Main.jsp.用户登录信息输入NY获取页面参数查询数据库用户存在用户不存在功能开始功能结束NY密码一致登录成功保存信息。