基于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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2.2 OpenCV随手简记(三)

图像的阈值处理定义 &#xff1a;将图像转化为二值图像&#xff08;黑白图&#xff09;, 也可以用于彩色图形&#xff0c;达到夸张的效果 目的&#xff1a;是用来提取图像中的目标物体&#xff0c;将背景和噪声区分开&#xff08;可以近似的认为除了目标全是噪声&#xff09;。…

Java进阶学习笔记36——算法

什么是算法&#xff1f; 解决某个实际问题的过程和方法。 1&#xff09;导航&#xff1b; 2&#xff09;滴滴打车&#xff1b; 3&#xff09;抖音&#xff1b; 不同的算法&#xff0c;效率高、性能好&#xff01; 在Java中&#xff0c;代码已经帮我们写好了&#xff0c;但为…

【Go语言精进之路】构建高效Go程序:零值可用、使用复合字面值作为初值构造器

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 引言一、深入理解并利用零值提升代码质量1.1 深入Go类型零值原理1.2 零值可用性的实践与优势1.2.1 切片(Slice)的零值与动态扩展1.2.2 Map的零值与安全访问1.2.3 函数参数与零值 二、使用复合字面值作为初值构造器2.1 结构体…

C语言 链表经典OJ题

链表经典OJ题 移除链表元素链表的中间节点反转链表合并两个有序链表分割链表 移除链表元素 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head […

iOS18新功能大爆料,打破常规,全面升级,这些变化不容错过!

众所周知&#xff0c;苹果 iOS 操作系统近年来都没有发生重大变化&#xff0c;主要是添加小部件、锁屏编辑和手机屏幕编辑等功能&#xff0c;再加上bug偏多&#xff0c;以至于越来越多iPhone用户不愿意再升级系统了。这一点&#xff0c;从 iOS 17 明显降低的安装率中就能看出一…

Linux配置java,maven,marshalsec环境

文章目录 一. Linux配置java环境1.下载jdk文件2.解压tar.gz文件3.设置java环境变量4.验证是否成功 二. Linux配置maven环境1.下载压缩包2.解压tar.gz3. 配置环境变量 三. Linux配置marshalsec环境 一. Linux配置java环境 1.下载jdk文件 mkdir /opt/javawget https://repo.hua…

Mixly 开启WIFI AP UDP收发数据

一、开发环境 软件&#xff1a;Mixly 2.0在线版 硬件&#xff1a;ESP32-C3&#xff08;立创实战派&#xff09; 固件&#xff1a;ESP32C3 Generic(UART) 测试工工具&#xff1a;NetAssist V5.0.1 二、实现功能 ESP32开启WIFI AP&#xff0c;打印接入点IP地址&#xff0c;允许…

几百页资料要打印哪里打印便宜

在这个信息爆炸的时代&#xff0c;资料堆积如山成为了许多人的常态。无论是学生准备期末考试、论文&#xff0c;还是职场人士整理项目文档、合同&#xff0c;打印需求总是如影随形。面对厚厚的几百页资料&#xff0c;你可能会为去哪里打印既便宜又方便而犯愁。别急&#xff0c;…

Amazon云计算AWS(二)

目录 三、简单存储服务S3&#xff08;一&#xff09;S3的基本概念和操作&#xff08;二&#xff09;S3的数据一致性模型&#xff08;三&#xff09;S3的安全措施 四、非关系型数据库服务SimpleDB和DynamoDB&#xff08;一&#xff09;非关系型数据库与传统关系数据库的比较&…

UI 自动化测试(Selenuim + Java )

关于 UI 自动化测试工具 selenuim Java 的环境搭建推荐看SeleniumJava 环境搭建 什么是自动化测试&#xff1f; 自动化测试指软件测试的自动化&#xff0c;在预设状态下运行应用程序或者系统&#xff0c;预设条件包括正常和异常&#xff0c;最后评估运行结果。将人为驱动的测…

教育新基建背景下的光网校园:安徽中澳科技职业学院以太全光网建设之路

作者/安徽中澳科技职业学院 网络中心 刘正峰 安徽中澳科技职业学院隶属于安徽省科技厅,是一所公办高等职业院校。学院在“德厚三分,技高一筹”的校训指引下,坚持“开放性、精品化、技能型”的发展理念,坚持“贴近市场需求、强化实践教学、突出办学特色、培养实用人才”的办学思…

【Django】从零开始学Django【2】

五. CBV视图 Django植入了视图类这一功能&#xff0c;该功能封装了视图开发常用的代码&#xff0c;无须编写大量代码即可快速完成数据视图的开发&#xff0c;这种以类的形式实现响应与请求处理称为CBV(Class Base Views)。 1. 数据显示视图 数据显示视图是将后台的数据展示…

【vue】@、@/、../和./的区别

&#xff1a;表示vue语法中v-on的简写&#xff1b;绑定事件的专用格式。当事件触发的时候&#xff0c;函数才会来调用&#xff1b; /&#xff1a;在build文件夹下webpack.base.conf.js找到&#xff0c;便能知道代表什么了; 这里指向src文件夹 . /&#xff1a;表示当前目录下&…

【代码随想录】【算法训练营】【第27天】 [39]组合总和 [40] 组合总和II [131]分割回文串

前言 思路及算法思维&#xff0c;指路 代码随想录。 题目来自 LeetCode。 day26&#xff0c; 休息的周末~ day 27&#xff0c;周一&#xff0c;库存没了&#xff0c;哭死~ 题目详情 [39] 组合总和 题目描述 39 组合总和 解题思路 前提&#xff1a;组合的子集问题&…

云渲染农场什么是线程模式?

许多设计师在选择云渲染农场时&#xff0c;常常会遇到48线程、56线程、72线程等选项&#xff0c;然而&#xff0c;不少新手在面对这些选择时&#xff0c;往往无法直观地感受到不同线程数量之间的差异。接下来&#xff0c;我们将共同探讨线程的作用和影响&#xff0c;帮助大家更…

「小白必读」国内超火的 8 款 AI 大模型,你的副业都来自它

大家好&#xff0c;最近好多朋友在问我&#xff0c;国内是否有好用的大模型&#xff0c;今天我就整理好 8 款大模型&#xff0c;大家可以多尝试&#xff0c;一定会有不一样的感觉。 01 HOTSPOT Kimi 网址&#xff1a;https://kimi.moonshot.cn/ Kimi 是由月之暗面科技有限公…

Anacode+YOLO识别图片

一、安装Anacoda 因为我原本是已经安装了python&#xff0c;后面直接卸载了&#xff0c;然后安装了最新版的anacoda 下载网址为&#xff1a; Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 下载版本是&#xff1a; 按照安装教程直接…

初出茅庐的小李博客之使用立创开发板(ESP32)连接到EMQX Platform【MQTT TLS/SSL 端口连接】

介绍 手上有一块立创开发板&#xff0c;本着不吃灰的原则把它用起来&#xff0c;今天就来用它来连接上自己部署的MQTT服务器进行数据通信。 硬件&#xff1a;立创开发板 开发环境&#xff1a;Arduino IDE Win11 MQTT 平台&#xff1a;EMQX Platform 立创开发板介绍&#xff1…

nginx和proxy_protocol协议

目录 1. 引言2. HTTP server的配置3. Stream server的配置3.1 作为proxy_protocol的前端服务器3.2 作为proxy_protocol的后端服务器1. 引言 proxy_protocol 是haproxy开发的一种用于在代理服务器和后端服务器之间传递客户端连接信息的协议。使用 proxy_protocol 的主要优势是能…

Redis中大Key与热Key的解决方案

原文地址&#xff1a;https://mp.weixin.qq.com/s/13p2VCmqC4oc85h37YoBcg 在工作中Redis已经成为必备的一款高性能的缓存数据库&#xff0c;但是在实际的使用过程中&#xff0c;我们常常会遇到两个常见的问题&#xff0c;也就是文章标题所说的大 key与热 key。 一、定义 1.1…