目录
5.3 表现层设计
5.3.1 模型层(M)
5.3.2 视图层(V)
5.3.3 控制层(C)
5.4 系统主要功能模块的实现
5.4.1 登录功能的实现
5.4.2 客户管理的实现
5.5 本章小结
参考文献
前面内容请移步
基于java的CRM客户关系管理系统(五)
资源+毕业设计+毕业论文+源代码请移步
CRM客户关系管理系统+毕业论文+毕业设计+源代码
5.3 表现层设计
表现层是面对面和用户交互的,最外表的一层,接受用户数据,提交给模型进行处理,然后模型把结果回馈给用户。贯穿这个层次的是Struts framework。
5.3.1 模型层(M)
模型层是用来处理数据。在模型层里面没有对数据进行业务规格要求上的处理,只是控制流程和业务数据的检查,模型层的支撑代码就是使用业务逻辑层的各个实现类来规则数据。
重要的代码如下所示:
@Scope("prototype")
@Controller("crmCustomerAction")
public void setCrmCustomerBiz(CrmCustomerBiz crmCustomerBiz) {
this.crmCustomerBiz = crmCustomerBiz;
}
public String execute(){
Scopes.getRequestMap().put("bywhere", crmCustomerBiz.findAllByWhere(bwvobj));
return SUCCESS;
}
public String add(){
CrmCustomer newcust = crmCustomerBiz.addCustomer(customer);
contact.setCrmCustomer(newcust);
crmContactBiz.add(contact);
return "add";
}
这个类是处理客户信息的增加的时候的情况。承袭了Struts框架里的ActionSupport这个类,而且依照java的要求重写了execute()函数,该方法就是处理业务流程。在系统实现过程中,还需要spring框架的注解信息可以applicationContext.xml文件里面进行写入。
<aop:config proxy-target-class="true">
<aop:pointcut expression="execution(* com.crm.biz.*.*(..))" id="pc"/>
<aop:advisor advice-ref="adv" pointcut-ref="pc"/>
</aop:config>
5.3.2 视图层(V)
通过Struts的标签和jsp等进行实现的。这个界面直接面对用户,更直接影响用户对该系统的第一感觉,所以说这一层设计和重要。如模型层的代码,如果客户信息添加成功了就会回crm_cus_list.jsp上。
5.3.3 控制层(C)
控制层是是连接视图和模型的关键,两个分离的模块因为控制层而整合在一起,使代码更容易维护。用户请求经过控制层的处理,然后把请求提交给对应的模型层处理。
<action name="crm_cust" class="com.crm.action.CrmCustomerAction">
<result>crm_cus_list.jsp</result>
<result name="toupdate">crm_cus_update.jsp</result>
<result name="add" type="redirectAction">crm_cust</result>
<result name="update" type="redirectAction">crm_cust</result>
<result name="delete" type="redirectAction">crm_cust</result>
<result name="trash">/pages_sys/trash_cus_list.jsp</result>
</action>
5.4 系统主要功能模块的实现
5.4.1 登录功能的实现
登录功能所需的界面如图
图5.6 系统登录界面
前端JSP代码如下:
<form class="form-vertical login-form" action="hr_emp!login" method="post" >
<h3 class="form-title" style="text-align: center;">CRM管理系统登录</h3>
<div class="alert alert-error hide">
<button class="close" data-dismiss="alert"></button>
<span>请输入您的用户名和密码.</span>
</div>
<div class="control-group">
<!--ie8, ie9 does not support html5 placeholder, so we just show field title for that-->
<label class="control-label visible-ie8 visible-ie9">用户名</label>
<div class="controls">
<div class="input-icon left">
<i class="icon-user"></i>
<input class="m-wrap placeholder-no-fix" type="text" placeholder="用户名" name="name"/>
</div>
</div>
</div>
<div class="control-group">
<label class="control-label visible-ie8 visible-ie9">密码</label>
<div class="controls">
<div class="input-icon left">
<i class="icon-lock"></i>
<input class="m-wrap placeholder-no-fix" type="password" placeholder="密码" name="pwd"/>
</div>
</div>
</div>
<div class="control-group">
<label class="control-label visible-ie8 visible-ie9">验证码</label>
<div class="controls">
<div class="input-icon left">
<i class="icon-tag"></i>
<input class="m-wrap placeholder-no-fix" type="text" placeholder="验证码" name="inpcode" style="width:100px;"/>
<iframe src="<%=basePath%>hr_emp!ajaxValidateCode" id="iframecode" style="height:34px; width:85px; margin: 0px;" frameborder="0" scrolling="no" ></iframe>
<div style="float: right;" >
<a href="#" id="showcode" class="btn blue" style="width: 28px; height: 20px;"><i class="icon-refresh" style="margin:2px 8px;"></i></a>
</div>
</div>
</div>
</div>
<div class="form-actions">
<button type="submit" class="btn blue pull-right">
登录 <i class="m-icon-swapright m-icon-white"></i>
</button>
</div>
用户输入的账号,密码,验证码通过文本框的post方式提交给hr_struts(hr_rmp!login)下action类。
<action name="hr_emp" class="com.crm.action.HrEmployeeAction">
Hr_emp对应的action实现类为HrEmployAction。
HrEmployAction中的login方法如下:
public String login() {
if (inpcode.equalsIgnoreCase(ValidateCode.code)) {
// 登录
HrEmployee employee = hrEmployeeBiz.login(name, pwd);
if (employee != null) {
if (employee.getCanlogin() == 1) {
Scopes.getSessionMap().put("emp", employee);
List<SysMenuVobj> menuVobjs = sysMenuBiz.findShowMenusByRole(employee.getSysRole());
Scopes.getSessionMap().put("menus", menuVobjs);
sysLoginBiz.add(new SysLogin());
return "login";
} else {
Scopes.getRequestMap().put("err", "您没有权限登录,请联系管理员");
// 您没有权限登录
return "loginerr";
}
} else {
Scopes.getRequestMap().put("err", "您输入账号或密码错误");
// 账户密码错误
return "loginerr";
}
} else {
Scopes.getRequestMap().put("err", "您输入验证码错误");
// 验证码错误
return "loginerr";
}
在Action中,调用了业务逻辑层的biz类进行实例化,在HrEmployeeBiz中有
public HrEmployee login(String name, String pwd) {
return hrEmployeeDao.login(name,pwd);
}
调用了dao层的HrEmployeeDao类中的login方法进行取数据库中的数据,
public HrEmployee login(String name, String pwd) {
return (HrEmployee) this.getSession().createCriteria(HrEmployee.class).add(Restrictions.eq("uid", name))
.add(Restrictions.eq("pwd", pwd)).uniqueResult();
}
从数据库里取出的数据和Jsp传过来的数据进行比较,再把结果返回给action层,最后返回到JSP上显示。需要的效果图如下图所示
图5.7 用户名密码为必填
图5-8 账号和密码错误
图5.9 登录成功
登录管理的时序图
图5.10 登录时序图
5.4.2 客户管理的实现
客户管理时序图如下
图5.11客户管理时序图
前台JSP:
<div class="portlet-body form">
<form action="crm_cust!add" method="post" class="form-horizontal" id="submit_form">
<div class="form-wizard">
<div class="navbar steps">
<div class="navbar-inner">
<ul class="row-fluid">
<li class="span3">
<a href="#tab1" data-toggle="tab" class="step active">
<span class="number">1</span>
<span class="desc"><i class="icon-ok"></i>公司信息</span>
</a>
</li>
<li class="span3">
<a href="#tab2" data-toggle="tab" class="step">
<span class="number">2</span>
<span class="desc"><i class="icon-ok"></i> 主联系人</span>
</a>
</li>
<li class="span3">
<a href="#tab3" data-toggle="tab" class="step">
<span class="number">3</span>
<span class="desc"><i class="icon-ok"></i> 其他</span>
</a>
</li>
<li class="span3">
<a href="#tab4" data-toggle="tab" class="step">
<span class="number">4</span>
<span class="desc"><i class="icon-ok"></i> 确认完成</span>
</a>
</li>
</ul>
</div>
</div>
用户经过填入相关的客户信息,通过post方法,把表单提交到crm_cust上,
<action name="crm_cust" class="com.crm.action.CrmCustomerAction">
<result name="add" type="redirectAction">crm_cust</result>
找到crmcustomerAction的add方法
public String add(){
CrmCustomer newcust = crmCustomerBiz.addCustomer(customer);
contact.setCrmCustomer(newcust);
crmContactBiz.add(contact);
return "add";
}
调用crmcustomerBiz类和crmcustomerDao的add方法
public CrmCustomer addCustomer(CrmCustomer customer) {
customer.setIsdelete(1);
//customer.setHrEmployeeByCreateId((HrEmployee) Scopes.getSessionMap().get("emp"));
customer.setCreateDate(new Date());
// contact.setHrEmployee((HrEmployee)Scopes.getSessionMap().get("emp"));
try {
crmCustomerDao.save(customer);
return customer;
} catch (Exception e) {
e.printStackTrace();
return null;
}
直接调用crmcustomerDao的save方法(这个方法在hibernate里定义),这样客户的数据就保持好了,删除,更新,查询的流程都是这样的,就不一一的列举了。效果图如下
图5.12 客户信息增加界面
5.5 本章小结
这一章对系统的详细设计做了一个介绍,结合代码和ssh进行整合对登录和客户信息添加模块模块做了详细的介绍。
参考文献
[1] 陈广宇.管理信息系统[M].北京:清华大学出版社,2010:95-100
[2] 张墨华,张永强.Java程序设计[M].北京:清华大学出版社, 2010:123-124
[3] 软件工程 中央广播电视大学出版社[M] 2001年
[4] 崔群法,王咏梅,李有军。ECLIPSE从入门到精通[M]。北京:电子工业出版社。2008.
[5] 符光宝,邵定宏, 李兰友,基于Struts框架的档案管理系统应用研究[J],计算机工程与设
计,2008.29(13)
[6] 萨师煊,王珊.数据库系统概论[M].北京:高等教育出版社,2005.
[7] 李建刚,秦兴桥,郑雨贝。JSP网络编程技术与实践[M]。北京:清华大学出版社。2008.
[8] J2EE编程基础与实例 机械工业出版社[M] 2002年9月
[9] Jason Hunter,William Crawford.Java Servlet编程。北京:国防工业出版社[D]。2002.
[10] Karl Avedal,Danny Ayers,Timothy Briggs.jsp编程指南[M]。北京:电子工业出版社。
2001.
[11] Subrahmanyam Allamaraju,Cedric Buest,John Davies.J2EE编程指南[M]。北京:电子
工业出版社。2002.
[12] 肖丹.知识型档案管理系统建设及其关键技术研究[D],中山大学硕士学位论文,2010.
[13] 张蕾.基于.NET的档案管理系统的开发与研究[D],天津大学硕士学位论文,2007.
[14] 《C语言程序设计》谭浩强著[M],清华大学出版社
[15] 陈尚松 基于J2EE的客户关系管理系统的设计与实现[D]
[16] 余波 基于web的客户关系管理系统的设计和实现[D]
[17] 杨帅 基于SSH的CRM系统的研究和设计[D]
[18] 任霄龙 基于SSH的客户关系管理的设计和实现[D]
[19] 郝倩 邮政储蓄银行CRM系统的设计和实现[D]
[20] 李骏 客户生命周期价值在CRM中的运用[J]
[21] 张国方 CRM客户关系管理的应用和理论研究综述[J]
[22] 杨涛,周志波,凌力.基于 Struts 和 Hibernate 的 J2EE 快速开发框架的设计与实现
[J].计算机工程.2006.5.32~36
[23] 杨路明,杨竹青,曹丽娟.客户关系管理与企业获取客户的方法.商业研究,2006,
21:45-50
[24] 徐友明.如何从客户关系管理入手提升企业核心竞争力.经济论坛,2005, 11:6-8
[25] 段俊勇.基于三层C/S结构的ERP系统的研制:[硕士学位论文].山东青岛:青岛科技大
学,2005年
[26] 孙卫琴等.精通Stmts:基于MVC的Java Web设计与幵发.北京:电子工业出版社,2005
[27] 孙卫琴.精通Hibernate:Java对象持久化技术详解.北京:电子工业出版社
[28] 孟劼.精通Spring-Java轻量级架构开发实践.北京:人民邮电出版社,2007
[29] 张桂元.Eclipse开发入门与项目实践.北京:人民邮电出版社,2005
[30] 蔡高巍.JSF的研究及其应用.信息科技,2008,(3):23-24