基于java的CRM客户关系管理系统(六)

目录

 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/675438.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基本元器件 - 电感与磁珠

电感 电感的选型 体积大小电感值所在工作频率开关频率下的电感值为实际需要的电感值线圈的直流阻抗&#xff08;DCR&#xff09;越小越好工作电流应降额至额定饱和电流的 0.7 倍以下&#xff0c;额定 rms 电流&#xff1b;交流阻抗&#xff08;ESR&#xff09;越小越好&#…

10 款在线剽窃检查的 [免费工具]

剽窃或抄袭他人文章而不注明出处&#xff0c;几乎在所有领域都被认为是有害的。然而&#xff0c;学术界最痛恨这种行为。抄袭是对学术诚信的最大威胁。这就是为什么每个教育机构总是希望学生提交无抄袭的作业。 然而&#xff0c;有时学生无意中剽窃了他人的作业&#xff0c;直…

【软件开发】Java学习路线

本路径视频教程均来自尚硅谷B站视频&#xff0c;Java学习课程我已经收藏在一个文件夹下&#xff0c;B站文件夹同时会收藏其他Java视频&#xff0c;感谢关注。指路&#xff1a;https://www.bilibili.com/medialist/detail/ml3113981545 2024Java学习路线&#xff08;快速版&…

命名空间,缺省参数和函数重载

前言&#xff1a;本文章主要介绍一些C中的小语法。 目录 命名空间 namespace的使用 访问全局变量 namespace可以嵌套 不同文件中定义的同名的命名空间可以合并进一个命名空间&#xff0c;并且其中不可以有同名的变量 C中的输入和输出 缺省参数&#xff08;默认参数&#…

超越Devin!姚班带队,他们创大模型编程新世界纪录

超越Devin&#xff01;SWEBench排行榜上迎来了新玩家—— StarShip CodeGen Agent&#xff0c;姚班带队初创公司OpenCSG出品&#xff0c;以23.67%的成绩获得全球第二名的成绩。 同时创造了非GPT-4o基模的最高纪录&#xff08;SOTA&#xff09;。 我们都知道&#xff0c;SWEBe…

for深入学习

目录 练习&#xff1a; 例1&#xff1a; 求解0-100中整除3的数有哪些 例2&#xff1a; 求0-100中含数字9个个数 作业&#xff1a; 练习&#xff1a; 例1&#xff1a; 求解0-100中整除3的数有哪些 代码&#xff1a; #include<stdio.h> int main() {printf("整…

JAVAEE之网络初识_协议、TCP/IP网络模型、封装、分用

前言 在这一节我们简单介绍一下网络的发展 一、通信网络基础 网络互连的目的是进行网络通信&#xff0c;也即是网络数据传输&#xff0c;更具体一点&#xff0c;是网络主机中的不同进程间&#xff0c;基于网络传输数据。那么&#xff0c;在组建的网络中&#xff0c;如何判断到…

深入理解计算机系统 第三版 中文版 图5-27 p371 错漏

中文版 英文版 对照 可以看出错漏 这本书中文版很多错漏,可以配合英文版查正,不过英文版也很多错漏,所以不用太相信书本.要根据自己的理解来.

TDengine为物联网而生的大数据平台

TDengine为物联网而生的大数据平台 物联网背景 技术支撑 应用落地 未来趋势

【动手学深度学习】softmax回归从零开始实现的研究详情

目录 &#x1f30a;1. 研究目的 &#x1f30a;2. 研究准备 &#x1f30a;3. 研究内容 &#x1f30d;3.1 softmax回归的从零开始实现 &#x1f30d;3.2 基础练习 &#x1f30a;4. 研究体会 &#x1f30a;1. 研究目的 理解softmax回归的原理和基本实现方式&#xff1b;学习…

算法金 | 再见,支持向量机 SVM!

大侠幸会&#xff0c;在下全网同名「算法金」 0 基础转 AI 上岸&#xff0c;多个算法赛 Top 「日更万日&#xff0c;让更多人享受智能乐趣」 一、SVM概述 定义与基本概念 支持向量机&#xff08;SVM&#xff09;是一种监督学习模型&#xff0c;用于解决分类和回归问题。它的核…

Streamsets-JDBC模式offset变化逻辑和如何向下传递offset

Streamsets的版本为3.16.0 离线版 offset在jdbc模式中起到非常关键的作用&#xff0c;是滚动查询的基础&#xff0c;offset的准确直接影响数据同步的质量。 本文主要分享一下JDBC Query Consumer中的offset&#xff0c;包括变化逻辑、存储方式、处理器如何获取到最新的offset。…

如何在QGIS中加载MapBox图源

在设计行业中需要多风格地图的调用&#xff0c;不管是规划、建筑设计还是景观&#xff0c;分析图的工作量都大&#xff0c;有好的底图&#xff0c;会事半功倍。 针对不同项目&#xff0c;会选择不同配色的底图&#xff0c;以便让设计内容中的呈现足够清晰。 这里就来分享一个…

如何在自己的电脑上添加静态路由

1.任务栏搜索powershell 选择以管理员身份运行 2.输入 route add -p (永久) 目的网络地址例如192.168.10.0 mask 255.255.255.0&#xff08;子网掩码&#xff09;192.168.20.1&#xff08;下一跳地址&#xff09;。回车即可生效

238.除以自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。 题目数据保证数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度内完…

网络编程(六)

网络编程&#xff08;六&#xff09; 广播&组播广播步骤 组播步骤 广播&组播 广播 是一种基于1发送多接收的模型 &#xff08;发送方和接收方&#xff09; 广播是在局域网内实现的&#xff08;发送到广播地址上的消息是会被局域网内同网段的所有主机进行接收&#xf…

[Redis]Set类型

集合类型也是保存多个字符串类型的元素的&#xff0c;但和列表类型不同的是&#xff0c;集合中 1&#xff09;元素之间是无序的 2&#xff09;元素不允许重复 一个集合中最多可以存储2^32-1个元素。 Redis 除了支持集合内的增删查改操作&#xff0c;同时还支持多个集合取交…

深入探讨ChatGPT API中的Tokens计算方式和计算库

引言 在现代人工智能应用中&#xff0c;自然语言处理&#xff08;NLP&#xff09;技术无疑是最受关注的领域之一。OpenAI推出的ChatGPT&#xff0c;作为一种先进的对话模型&#xff0c;已经在多个领域展示了其强大的语言生成能力。为了更好地使用ChatGPT API&#xff0c;理解其…

操作系统(3) 处理机调度

目录 一、处理机调度概述 1.基本准则 &#xff08;1&#xff09;CPU利用率 &#xff08;2&#xff09;系统吞吐量 &#xff08;3&#xff09;周转时间 &#xff08;4&#xff09;等待时间 &#xff08;5&#xff09;响应时间 2.进程调度方式 &#xff08;1&#xff0…

【Linux】深入理解进程的优先级(Linux 2.6版本O(1)调度算法)

进程的优先级 【前置知识】一、进程的优先级(一&#xff09;为什么要有优先级&#xff1f;&#xff08;二&#xff09;进程的优先级的范围 二、操作系统是如何实现进程的优先级&#xff1f;&#xff08;Linux内核2.6版本O(1)调度算法&#xff09; 【前置知识】 首先我们要了解…