摘要
在当前经济环境下,家居行业不仅要掌握客户的信息,还需要安全的存储客户的信息防止信息被泄漏,传统的纸质记录已经逐渐被使用计算机软件的方式所代替,现代计算机相比于传统有着极大的优势,采用计算机软件的客户管理系统,不仅可以保证客户信息的安全性,也可以快捷的管理客户信息,此外还可以帮助企业快速梳理与客户的关系,推进交易的进度。
本文基于SSM框架,设计开发了一套家居客户管理系统,实现了客户信息管理、销售机会等相关功能模块。本系统主要分为管理员和客户经理角色,管理员主要是对公司内部员工进行管理,而销售经理主要是负责客户。
关键词:客户管理系统,SSM,JAVA
第1章 绪论
1.1 研究背景
当前,互联网信息技术已经越来越成为当代人们生活上和生产工作活动中一项不可或缺的互联网重要通讯工具。通过网络技术,人们之间高效的进行沟通、团队协同工作和内容共享都非常简捷。网络信息应用服务已日益广泛地被应用于经济各个领域。在此市场背景推动下,客户信息管理应运而生,并因此迅速地被发展成熟起来。要依法及时推动建立完善和培育完善适合客户信息管理系统是当前一个重要的目标。企业和客户的密切联系需要一个完善的系统进行管理,传统的联络方式已经无法满足当前需求。
传统的客户管理方式通常是靠企业销售人员自己进行对接管理,一旦该销售人员离职,那么这些客户信息就会丢失。如果使用纸质记录,纸质文档可能损坏或者丢失,这种情况下也会存在丢失客户信息的风险。因此使用计算机技术管理企业客户资料,跟进客户需求是现在一个大趋势。使用计算机软件对客户信息,资料管理不仅可以保证客户资料不会丢失,还能保证当销售人员离职后可以完美的对接这些信息,保证未来企业继续和客户联系。
所以针对企业的客户管理开发一套客户管理系统是非常有必要的,这既帮助企业提升了自身形象,同时促进工作人员高效的工作,提升企业形象。本文基于SSM框架开发并设计了一款针对理想家居客户信息管理系统,主要实现理想家居客户的信息管理,包括客户意向的跟进,客户关系的维护等。
1.2 本文工作
基于上述分析,本文基于SSM框架设计并开发了理想家居客户管理系统,旨在维护日常企业中客户信息,维护企业与客户直接的良好关系,提升企业的服务质量,吸引更多优质客户。
本文主要实现了理想家居客户管理后台管理功能模块以及系统总体管理功能模块。主要包括系统管理、客户管理、客户流失管理、销售机会管理、客户服务等功能。最后通过一系列的测试,使系统达到企业日常运行的标准。
本系统使用SSM(Spring,SpringMVC,MyBatis,)框架进行开发,使用Mysql作为数据存储的数据库,在idea上进行相应开发[1-9]。
1.3 本文组织结构
第一章主要介绍了论文研究的背景及意义,本文的主要工作和本文的组织结构。
第二章主要介绍理想家居客户管理系统所使用的相关技术介绍,主要包括本文设计开发的系统的持久层,业务层以及视图层所涉及的框架,简单的描述了该框架的原理,以及搭建的环境。
第三章主要介绍系统分析,包括系统可行性分析和系统需求分析。主要从技术可行性、操作可行性、经济可行性上进行分析,分析了系统的功能和非功能需求。
第四章主要介绍系统的设计,本章根据上一章的需求设计了主要包含的功能模块,针对各个功能模块,简要的进行了描述。同时为本系统设计了相关数据库,为后面系统实现做准备。
第五章主要介绍系统详细实现,即对第四章中的设计进行每一个功能的实现,对每个模块从功能、流程、核心代码进行详细的描述。
第六章主要介绍理想家居客户管理系统的系统测试,为了保证系统的稳定性以及功能的可用性,本文针对系统的每一个功能进行测试,并对测试结果进行解释,同时总结本系统目前所存在的问题。
第七章主要对本文进行总结,同时对本文开发设计的理想家居客户管理系统进行了一个综合的评价,阐述了本系统的亮点以及不足,同时对未来进行展望。
第2章 相关技术介绍
2.1 MyBatis框架介绍
本文使用MyBatis 作为持久层框架,该框架有很多优势,主要可以根据sql语句动态配置来对数据库进行相应操作,该框架同时包含数据库的高级特性如触发器,函数,存储过程等。MyBatis 使用配置文件的方式记录数据库连接参数实现连接,不需要采用传统的jdbc模式就能拿到存储在数据库中的数据,采用这种连接方式能有效的减少创建数据表和销毁数据表时的开销。此外,该框架以配置文件的形式实现sql语句进而操纵数据库,java的类映射成数据库中的数据。
Mybatis 框架主要分为接口层、数据处理层、基础支撑层这三层架构,如下图所示[5-10]。
图2-1Mybatis结构图
Mybatis的结构概述:
(1)第一层接口:api接口层提供相关功能的接口,服务层调用这些接口后。实际处理业务层只需要使用这些接口就可以获得相应的功能,从而完成对数据库的操作。当系统调用某一接口后,Mybatis框架就可以获取配置文件中对应的sql语句对数据库进行相应增删改查。
(2)第二层数据:当服务层调用接口层的接口后,数据层会找到相应的配置文件中的sql语句对数据库进行增删改查,操作数据库后数据库会返回相应数据。数据层主要是将原始操作封装为接口以便调用,当其他层调用这些接口后可以非常简单的对数据库进行相应增删改查。
(3)第三层支撑:基础支撑层主要上存储连接数据库操作数据库的基本的参数,例如操作数据库的驱动,数据库的用户名及密码等。
2.2 Spring框架概要
本文使用Spring框架作为主要设计层框架,该框架是目前较为流行的开源层框架,该框架主要负责业务层和其它层的耦合问题,该框架主要是采用接口解决耦合问题,虽然有一定弊端,但是可以解决一部分耦合问题[11-17]。
在任何TomCat和JBoss这类服务器中,Spring框架可以承受不同环境的影响,使用基础功能。同时Spring 框架不会受到特定的服务器限制,不会将自身和指定项目和对象相绑定,这一特性展现了Spring框架的优势:在Spring框架中已经配置好的对象可以在不同的项目和不同环境中执行。所以Spring框架可以被不同服务器重用,降低耦合性,增加可扩展性。Spring框架的体系结构如图2-2所示。
图2-2 Spring体系结构
在Spring框架中每个模块或组件都是独立的,他们可以单一的被调用,或者多个联合被调用。主要包括核心容器、Sprisng上下文和SpringAOP。
1. Spring中最基本的功能模块(特性)由核心容器实现。该容器采用对象工厂来创建、加载实例。该容器的功能主要利用控制反转对资源进行操作,将原本资源控制权限从双方控制转变为由Spring的核心容器来控制,进而减弱了JAVA对象的耦合度,从而让实现功能时主要关注使用对象而不是创建对象。
2. Spring 上下文主要是通过Spring-content.xml这一配置文件保存框架功能的相关参数信息,当工程启动时Spring框架可以自动读取Spring-content.xml该配置文件并对所有模块进行初始化。在Spring-content.xml配置文件中的Spring-content标签中配置相关功能,例如检验输入字段的有效性,管理程序异常等。
3. Spring框架中除了IOC功能外之外,该框架还有另外一个叫做AOP的功能也十分强大。该功能本质上是一个阻断器,主要的功能是操作某些将要执行或者已经执行完成的方法。使用该功能,我们可以将客户管理系统中设计的核心功能和一些通用的方法分开,易于实现日志管理,数据库基本信息的管理从而减少代码冗余,将核心代码和通用代码更加具体、清晰的表现出来。
2.3 Spring MVC 框架介绍
Spring MVC框架主要核心思想的采用一个分发器来处理用户的各个请求,当有一个请求进来后,该分发器会将这个请求分配给相应的程序进行处理,此外,该框架还可以进行地址映射、数据库视图分析、程序参数检验、对文件进行便捷的上传下载等功能。该框架主要采用注解的方式来表示不同功能,通过Controller注解来获取所有请求,拿到请求后用RequestMapping注解来处理请求。该框架的主要的体系结构如图2-3所示。
图2-3 Spring体系结构
Spring-mvc主要由七个核心部件组成,共同完成从请求到响应再获取数据库数据,再到返回数据这一流程。在这里我们主要介绍前端控制器(DispatcherServlet)、处理器映射器(HandlerMapping)、处理器(Handler)、处理器适配器(HandlAdapter)、:视图解析器(ViewResolver)和视图(View)。
前端控制器(DispatcherServlet)主要处理用户的请求,当用户的请求到达后,该控制器作为MVC设计模式中的controller来控制整体的数据流动,该组件可以协同其它组件完成用户请求,采用分发器的形式来减少组件之间的耦合度。
处理器映射器(HandlerMapping)主要是根据用户不同的相应,将任务分配给不同处理器,主要采用配置文件实现接口和注解的不同映射。
处理器(Handler)主要功能是控制后端程序,根据DispatcherServlet分发的不同请求处理器进而处理用户的不同请求,改模块通常是由程序员根据业务进行自定义,因此该模块可塑性很强。
处理器适配器(HandlAdapter)主要上用来针对Handler无法处理的某些请求,DispatcherServlet分发任务后发现没有handler可以解决,这时会发送到该模块上进行处理。
视图解析器(ViewResolver)主要是将handler处理后的结果转化为View视图,主要流程上首先将逻辑视图转化为页面,然后生成对象,最后对该视图进行渲染,然后根据静态资源CSS配置后显示给用户。
视图(View)主要包括jsp页面、html页面和xml页面等。改功能模块主要上根据具体的不同业务进行具体的开发。
第3章 需求分析
3.1 可行性分析
可行性分析是计算机应用开发必备的步骤。在正式开发之前,我们需要预测在未来开发中可能碰到的问题,同时要评估客户管理系统对企业所带来的收益和风险,并且需要计算项目成本。如果不进行这一步,预算不够的话,项目开发到一半时发现资金无法支撑整个项目的开发,这会对企业造成巨大的损失。因此,本节主要对系统的技术层面、操作层面、已经经济层面进行可行性分析。
从技术层面来说,本文开发的客户管理系统使用的框架都是目前较为流行的框架,并且本文开发的系统所使用的都是较为轻量工具如Mysql。并且使用ssm框架来实现MVC模式中的业务层、视图层和持久层。本次开发面向的是单一企业,因此使用Tomcat服务器完全可以满足日常需求,由于正常用户量最多500,所以Mysql数据库完全够用,其完全免费,体积好可以降低成本。本系统开发周期短,可以快速上线使用,因此在技术层面上是完全可行的。
从操作层面来说,本系统为了让企业员工快速上手,所以设计的界面简单易懂,清楚明了,没有复杂的操作,通过简单的培训就可以快速入手。日常的操作只需要几步就可以完成,这样可以有效的提高员工工作效率。对于不同角色本系统提高不同的权限,以此来防止某些误操作,同时系统中所有的操作都会被记录,如果出现问题可以快速定位解决问题。本系统操作简单,界面友好,所以在操作层面上是可行的。
从经济层面来说,本软件的实现只需要开发费用和运营费用,但是对比传统的客户管理方式来说,软件可以帮助企业提升客户维护效率,企业服务形象,从而带来更多客户,并且可以减少发生错误的可能性,从而提升企业的盈利。所以从经济层面上来说,本软件的开发也是可行的。
3.1 性能分析
一个基本系统,在功能上要基本满足客户的要求,其性能也要同样优秀,才可以真正的进入生成环境中。如果系统的性能不行,这个系统同样不能进入生产环境,比如系统的优化很差,一个功能模块需要几分钟才能完成,又或者在高并发的情况下,系统出现卡死的情况。所以需要针对性能进行相关分析。
本系统主要采用java语言进行开发,所以本系统不存在移植性问题,因为java语言的特性所以本系统可以在多平台上运行,不论系统是什么环境。其次,本系统的设计了日志系统,将所有系统中的操作都记录下来,所以本系统的安全等级也十分强大。在设计时,为了相关使用人员易于上手,所以本系统的界面,操作都相对应的比较简单,这使得相关操作人员可以经过简单的培训就可以完全掌握该系统。最后本系统进过了一系列的功能测试,解决了主要存在的问题,所以在稳定性上有一定的保障,不会存在突然出现某种重大问题无法解决,导致系统瘫痪。
第4章 系统总体设计
4.1 系统功能结构设计
理想家居客户管理系统主要包括七大主要功能,分别是系统管理,客户管理,客户流失,销售机会,客户服务客户关怀和统计。其中系统管理主要针对用户权限,系统日志等进行管理。客户管理功能模块主要是由工作人员对客户信息进行维护,并且跟进合作。客户流失模块是管理长时间不联系的客户,销售机会是维护和客户合作,客户服务主要是维护客户的日常需求,客户关怀主要是提醒销售人员客户重要的日期,统计模块是统计销售人员是销售记录。系统功能结构图如图4-1所示。
图4-1系统功能结构图
4.2 系统功能模块设计
本节主要对理想家居客户管理系统的每个功能模块进行设计详述,并且使用流程图理清内部逻辑,以及介绍每个功能模块适用的场景。
4.2.1 系统管理模块设计
该功能模块主要是对企业中员工账号进行管理,其中主要包括员工的登陆,修改密码等操作。
(1)登录功能模块设计
登录功能主要是为了让员工有所区分,其权限不同登录后的获取的功能也不同,这样可以防止销售人员操作不属于自己部门的功能模块。登录流程图如图4-2所示。
图4.2登录流程图
(2)修改密码功能模块设计
企业员工在第一登录系统后,会获得一个原始密码,该模块可以让员工修改自己的密码,便于自己记忆。主要的操作是输入正确原密码,以及两次新密码进行修改。修改密码流程图如图4-3所示。
图4-3 修改密码流程图
(3)客户管理系统退出功能模块设计
当企业工作人员下班时,应该退出系统,如果需要再次使用,则需要重新输入用户名和密码。退出系统流程图如图4-4所示。
图4-4退出系统流程图
(4)客户管理系统日志、角色、权限、系统能模块设计
当企业登录系统后,可以为相应的员工分配权限,分配角色。也可以查看系统运行状态和操作日志。流程图如图4-5所示。
图4-4系统日志、角色、权限、系统能模块流程图
4.2.2 客户管理功能模块设计
客户管理功能主要对客户的信息进行维护,并且可以和客户进行跟进联系,针对快要流失的客户进行一个挽回操作。
(1)客户信息维护功能模块设计
客户管理系统可以对客户的各种信息进行管理,其中主要包括客户的客户名称、客户状态、客户类别、客户成熟度、客户等级、客户描述等等,便于企业进行针对性的服务。客户管理功能模块流程图如图4-5所示。
图4-5 客户管理流程图
(2)客户联系跟进功能模块设计
该模块主要是建立每次销售人员和客户商谈的记录,便于销售人员记录每个客户的进度,有正对性的进行商谈。客户联系跟进功能模块流程图如图4-6所示。
图4-6 客户联系跟进功能模块流程图
(3)客户流失功能模块设计
该模块主要是针对长时间不联系的客户,销售人员可以对这些客户进行回访,确认是否还会订购公司产品,如果还有意向可以将客户恢复正常客户,如果没有意向那么将客户置位流失客户。客户流失功能模块流程图如图4-7所示。
图4-7 客户流失功能模块流程图
4.2.3客户服务功能模块设计
客户服务功能模块主要对客户售前售后等进行服务,并且统计服务次数,针对客户的意向评估销售机会。此外,还可以对客户进行关怀。
(1)客户服务功能模块设计
该功能模块主要包含客户服务添加,和客户服务处理以及服务统计。该功能流程图如图4-8所示。
图4-8 客户服务功能模块流程图
(2)客户关怀功能模块设计
该功能模块主要对客户的生日进行统计,在生日当天可以送上祝福以及企业小礼品。该功能流程图如图4-9所示。
图4-9 客户关怀功能模块流程图
(3)销售机会功能模块设计
该功能模块主要对和客户商谈后进行一个总体的评估记录,方便下次商谈时调整策略。该功能流程图如图4-10所示。
图4-10 销售机会功能模块流程图
4.2.3统计功能模块设计
该功能模块主要是统计销售人员的销售情况,分别对客户成交量,经理业绩,客户增长以及客户分类进行统计。该功能流程图如图4-11所示。
图4-11 统计能模块流程图
4.3 数据库设计
本节通过数据表图来介绍数据库中字段。主要包括用户表,客户表,日志表,客户流失表等。
表4-1 用户表
字段名 | 名称 | 数据类型 | 非空 | 主键 |
id | 用户id | int | √ | √ |
account | 用户名 | varchar | √ | |
password | 密码 | varchar | √ | |
real_name | 真实姓名 | varchar | √ | |
salt | MD5盐值 | varchar | √ | |
用户邮箱 | varchar | √ | ||
phone_number | 用户手机号 | varchar | √ | |
create_time | 用户创建时间 | timestamp | √ | |
last_login_time | 上一次登陆时间 | timestamp | √ | |
role_id | 角色id | int | √ | |
status | 账号锁定状态 | int | √ |
表4-2 客户表
字段名 | 名称 | 数据类型 | 非空 | 主键 |
id | 客户编号 | int | √ | √ |
name | 客户名称 | varchar | ||
type | 客户类别 | varchar | ||
level | 客户等级 | varchar | ||
status | 客户状态 | varchar | ||
credit | 客户信用度 | varchar | ||
area | 客户所在地区 | varchar | ||
company_address | 公司详细地址 | varchar | ||
company_phone | 公司电话 | varchar | ||
post_code | 邮政编码 | varchar | ||
fax_address | 传真地址 | varchar | ||
company_website | 公司网站 | varchar | ||
license_number | 营业执照注册号 | varchar | ||
corporation | 法人 | varchar | ||
annual_sale | 年营业额 | double | ||
deposit_bank | 开户银行 | varchar | ||
bank_account | 银行账号 | varchar | ||
land_tax_number | 地税登记号 | varchar | ||
national_tax_number | 国税登记号 | varchar | ||
source | 客户来源 | varchar | ||
description | 客户描述 | varchar | ||
maturity | 客户成熟度 | varchar | ||
document | 相关文档保存地址 | varchar | ||
delete_status | 删除状态 | int | √ | |
manager_id | 客户所属的客户经理 | int | ||
product_id | 客户主要意向产品 | int | ||
creater | 创建人 | varchar | √ | |
create_time | 创建时间 | timestamp | √ |
表4-3 客户流失表
字段名 | 名称 | 数据类型 | 非空 | 主键 |
id | 客户流失管理id | int | √ | √ |
customer_id | 流失用户的id | int | ||
last_order_time | 上次下单时间 | timestamp | ||
measure | 暂缓措施 | varchar | ||
measure_append | 追加暂缓措施 | varchar | ||
loss_date | 确认流失时间 | timestamp | ||
reason | 流失原因 | varchar | ||
status | 流失状态 | varchar |
表4-4 日志表
字段名 | 名称 | 数据类型 | 非空 | 主键 |
id | 日志ID | int | √ | √ |
user_id | 用户编号 | int | ||
operation | 操作 | varchar | ||
operation_content | 操作详细内容 | varchar | ||
operation_time | 操作时间 | timestamp |
表4-5 订单表
字段名 | 名称 | 数据类型 | 非空 | 主键 |
id | 订单ID | int | √ | √ |
date | 日期 | timestamp | ||
address | 送货地址 | varchar | ||
price | 总金额 | double | ||
status | 状态 | int |
表4-6 产品表
字段名 | 名称 | 数据类型 | 非空 | 主键 |
id | 序号 | int | √ | √ |
name | 产品名称 | varchar | ||
location | 仓库地址 | varchar | ||
version | 型号 | varchar | ||
unit | 单位 | varchar | ||
price | 单价 | double | ||
repertory | 库存 | int | ||
remarks | 备注 | varchar | ||
category_id | 产品类型ID | int |
表4-7 服务表
字段名 | 名称 | 数据类型 | 非空 | 主键 |
id | 服务ID | int | √ | √ |
type | 服务的类型 | varchar | ||
general | 服务的概要 | varchar | ||
customer_id | 客户ID | int | ||
emergency | 服务紧急程度 | varchar | ||
phone_number | 联系电话 | varchar | ||
status | 服务状态 | varchar | ||
request | 客户请求内容 | text | ||
creater | 服务的创建人 | int | ||
create_date | 服务的创建时间 | timestamp | √ | |
handle_content | 服务的处理内容 | text | ||
handler | 服务的处理人 | int | ||
handler_time | 服务的处理时间 | timestamp | ||
handle_result | 服务的处理结果 | text | ||
degree | 客户对服务的满意度 | varchar | ||
delete_status | 是否删除状态 | int |
表4-8 跟进表
字段名 | 名称 | 数据类型 | 非空 | 主键 |
id | 跟进ID | int | √ | √ |
time | 时间 | timestamp | √ | |
address | 地点 | varchar | ||
general | 概要 | varchar | ||
remark | 备注 | varchar | ||
content | 详细信息 | varchar | ||
document | 相关文档 | text | ||
result | 结果 | varchar | ||
customer_id | 客户编号 | int | ||
manager_id | 跟进人 | int | ||
delete_status | 删除状态 | int |
第5章 系统实现
本文设计的理想家居客户管理系统,主要是对企业的客户信息进行管理,跟进企业交易的进度并且保持与客户的关系。
5.1 系统管理模块实现与测试
(1)用户登录实现
本系统的登录界面编写在login.jsp中,登录的主要流程如下:首先在文本框中输入用户名和密码,点击登录。系统会将用户名和密码加密后传入后端,后端会根据用户名查找数据库中的用户表,,如果没有找到则返回用户名不存在,如果存在则返回查询到的用户相关信息。再判断密码与返回的该用户的密码是否一致,如果密码和数据表中不一致,则返回密码错误这一信息。如果用户名和密码都正确则系统会重定向到欢迎界面页面也就是主界面,并且页面会拿到session信息,将用户ID保存进去,以便后续操作,如果session没有ID信息则不会跳转主界面。
代码:
public User login(User user) {
UserExample userExample = new UserExample(); Criteria criteria = userExample.createCriteria(); criteria.andAccountEqualTo(user.getAccount()); criteria.andPasswordEqualTo(user.getPassword()); List<User> users = userMapper.selectByExample(userExample); if(users.size() > 0){ return users.get(0); }else { return null; } } |
界面截图:
图5-1 登录界面
(1)修改密码
在首次登录后会跳转修改密码的界面,在该界面中输入新密码和旧密码,点击修改后系统将oldpassword和newpassword这两个参数传给后端进行相关操作。在这之前系统首先拿到session中的ID,根据ID在用户表表中查询该用户信息,并判断查到的用户密码是否与输入的原密码是否一直,如果一种并且在前端判断的两次新密码也一致的情况下,系统会修改用户表,把新密码替换为原密码,修改完成后返回修改完成,并清除session中的ID,使页面跳转到登录界面重新登录。
代码:
public boolean editPasswd(User user, String oldPassword) {
try { User selectUser = userMapper.selectByPrimaryKey(user.getId()); String salt1 = selectUser.getAccount(); String salt2 = selectUser.getSalt(); String encryptPasswd = selectUser.getPassword(); String passwd = Md5Util.encrypt(oldPassword, salt1+salt2); if(encryptPasswd.equals(passwd)) { user.setAccount(selectUser.getAccount()); user = encryptPassword(user); if(userMapper.updateByPrimaryKeySelective(user) > 0) { return true; } } } catch (Exception e) { return false; } } |
界面截图:
图5-2 修改密码界面
(3)退出系统实现和测试
在主页面点击‘退出系统’按钮,系统会弹出提示框让用户确认是否退出。当点击确认后,后台清除页面session,跳转回登录页面。
代码:
public ModelAndView logout(HttpServletRequest request) {
ModelAndView view = new ModelAndView(); Subject subject = SecurityUtils.getSubject(); String account = (String) subject.getPrincipal(); if(account != null) { subject.logout(); request.getSession().removeAttribute(“user”); request.getSession().invalidate(); } view.setViewName(“redirect:/pages/login.jsp”); return view; } |
界面截图:
图5-3 退出系统界面
(4)客户管理系统日志、角色、权限、系统信息能模块设计
点击左侧系统管理后可以选择日志管理、权限管理、角色管理以及系统信息等模块。日志管理包括员工操作本系统的所有操作。
代码:
public List<LoggingEvent> selectByLoggingEventExample(LoggingEventExample loggingEventExample, Pager pager) {
loggingEventExample.setLimit(pager.getPageSize()); loggingEventExample.setOrderByClause(“timestmp desc”); loggingEventExample.setOffset(new Long(pager.getOffset())); return logMapper.selectByExampleWithBLOBs(loggingEventExample); } |
界面截图:
图5-4 日志管理界面
角色管理主要用于管理员修改、查询、删除和分配销售人员的职位。
代码:
public int allotPermission(Integer[] permissionIds, Integer roleId) {
int count = 0; try { RolePermissionExample example = new RolePermissionExample(); example.createCriteria().andRoleIdEqualTo(roleId); rolePermissionMapper.deleteByExample(example); if(permissionIds.length > 0) { count = rolePermissionMapper.insertRolePermission(permissionIds, roleId); } }catch (Exception e) { return 0; } return count; } |
界面截图:
图5-5 角色管理界面
权限管理主要用于管理员管理员管理各个功能的权限,该模块也可以直接停用某些功能。
代码:
public List<Permission> selectByPermissionExample(PermissionExample permissionExample, Pager pager){
permissionExample.setLimit(pager.getPageSize()); permissionExample.setOffset(new Long(pager.getOffset())); permissionExample.setOrderByClause(“type asc”); return permissionMapper.selectByExample(permissionExample); } |
界面截图:
图5-6 权限管理界面
系统信息主要显示当前系统状态,如内存,CPU等。
代码:
public ServerInfo getServerInfo() {
System.out.println(“java.library.path:” + System.getProperty(“java.library.path”)); if(serverInfo == null) { serverInfo = new ServerInfo(); } SigarUtils.initSigar(); Properties props=System.getProperties(); Runtime runTime = Runtime.getRuntime(); serverInfo.setServerTime(new Date()); serverInfo.setOsName(props.getProperty(“os.name”)+” “+props.getProperty(“os.arch”)); serverInfo.setOsVersion(props.getProperty(“os.version”)); serverInfo.setUserName(props.getProperty(“user.name”)); serverInfo.setUserHome(props.getProperty(“user.home”)); Calendar cal = Calendar.getInstance(); TimeZone timeZone = cal.getTimeZone(); serverInfo.setOsTimeZone(timeZone.getDisplayName()); serverInfo.setCpuList(cpuVoList); return serverInfo; } |
界面截图:
图5-7 系统信息界面
5.2 客户管理功能模块实现与测试
客户管理功能主要对客户的信息进行维护,并且可以和客户进行跟进联系,针对快要流失的客户进行一个挽回操作。
(1)客户信息维护功能模块
进入客户信息维护可以对客户的客户名称、客户状态、客户类别、客户成熟度、客户等级、客户描述等进行修改查询,便于企业进行针对性的服务。
代码:
public Customer selectCustomerByPrimaryKey(Integer id) {
Customer customer = customerMapper.selectByPrimaryKey(id); try { Product product = productMapper.selectByPrimaryKey(customer.getProductId()); customer.setProduct(product); User creater = userMapper.selectByPrimaryKey(customer.getCreater()); if(creater != null) { creater.setPassword(null); creater.setSalt(null); } customer.setCreaterObject(creater); User manager = userMapper.selectByPrimaryKey(customer.getManagerId()); if(manager != null) { manager.setPassword(null); manager.setSalt(null); } customer.setManager(manager); }catch (Exception e) { } return customer; } |
界面截图:
图5-8 客户信息维护界面
(2)客户联系跟进功能模块
客户跟进模块主要是记录每次销售人员和客户商谈的记录,便于销售人员跟进每个客户的进度,有正对性的进行商谈。
代码:
public FollowUp selectFollowUpByPrimaryKey(Integer id) {
FollowUp followUp = followUpMapper.selectByPrimaryKey(id); if(followUp != null) { if(followUp.getCustomerId() != null) { followUp.setCustomer(customerMapper.selectByPrimaryKey(followUp.getCustomerId())); } if(followUp.getManagerId() != null) { followUp.setManager(userService.findById(followUp.getManagerId())); } } return followUp; } |
界面截图:
图5-9 客户联系跟进功能模块界面
(3)客户流失功能模块设计
该模块主要是挽回哪些长时间不联系的客户,销售人员可以根据客户的信息进行回访,尝试挽回。
代码:
public List<CustomerLoss> selectByCustomerLossExampleByPager(CustomerLoss customerLoss, Pager pager, User user) {
CustomerLossExample customerLossExample = new CustomerLossExample(); CustomerExample customerExample = new CustomerExample(); String queryCustomerName = “”; if(customerLoss.getCustomer() != null) { if(customerLoss.getCustomer().getName() != null && !””.equals(customerLoss.getCustomer().getName())) { queryCustomerName = customerLoss.getCustomer().getName(); } } if(user.getRoleId() == 1) { customerExample.createCriteria().andManagerIdEqualTo(user.getId()).andDeleteStatusEqualTo(0).andNameLike(“%”+queryCustomerName+”%”); }else { customerExample.createCriteria().andDeleteStatusEqualTo(0).andNameLike(“%”+queryCustomerName+”%”); } List<Customer> customers = customerMapper.selectByExample(customerExample); return null; } |
界面截图:
图5-10 客户流失功能模块界面
5.3 客户服务功能模块实现与测试
客户服务功能模块主要包含客户服务功能模块,销售机会功能模块。
(1)客户服务功能模块
该模块主要是处理客户的售前、售后、投诉等需求。
代码:
public Map<String, Object> findServices(HttpServletRequest request, Integer page, Integer limit, Service service){
Map<String, Object> map = new HashMap<String, Object>(16); User user = (User) request.getSession().getAttribute(“user”); ServiceExample serviceExample = new ServiceExample(); Criteria criteria = serviceExample.createCriteria(); if (user.getRoleId() == 1) { criteria.andHandlerEqualTo(user.getId()); } if(service.getCustomerId() != null) { logger.info(“添加了客户条件”); criteria.andCustomerIdEqualTo(service.getCustomerId()); } criteria.andDeleteStatusEqualTo(0); if(page == null || page <= 0) { page = 1; } if(limit == null || limit <= 0) { limit = 10; } Long offset = new Long((page – 1) * limit); Long count = serviceService.countByServiceExample(serviceExample); serviceExample.setOffset(offset); serviceExample.setLimit(limit); List<Service> services = serviceService.selectByServiceExample(serviceExample); logger.info(services.toString()); map.put(“data”, services); map.put(“count”, count); map.put(“msg”, “success”); map.put(“code”,0); return map; } |
界面截图:
图5-11 客户服务功能模块界面
(2)销售机会功能模块
该模块主要记录有意向的购买客户,并且根据不同进展动态的管理商谈状态,让销售人员清楚的记录跟进。主要的功能是从主界面进入,点击销售机会功能后系统会跳转到对应的页面,在改页面上就可以进行相应的操作了。
代码:
public Map<String, Object> findSaleOpportunity(@RequestParam(value=”page”,required=false,defaultValue=”1″)Integer page,@RequestParam(value=”limit”,required=false,defaultValue=”10″) Integer limit,SaleOpportunity saleOpportunity,HttpServletRequest request){
Map<String,Object> map = new HashMap<String,Object>(16); Pager pager = new Pager(page.intValue(),limit.intValue()); List<SaleOpportunity> list = saleOpportunityService.selectBySaleOpportunitySelectiveAndPager(saleOpportunity,pager,request); //logger.info(list.toString()); map.put(“code”, 0); map.put(“success”, true); map.put(“data”, list); map.put(“count”, pager.getTotal()); map.put(“msg”,”查询成功”); return map; } |
界面截图:
图5-12 销售机会功能模块界面
5.4 统计功能模块实现与测试
该功能模块主要是统计销售人员的销售情况,分别对客户成交量,经理业绩,客户增长以及客户分类进行统计。
由于篇幅的限制这里只展示统计客户经理新增的客户代码:
public Map<String, Object> countByDate(String action, Integer selectType, String date, HttpServletRequest request) {
Map<String, Object> map = new HashMap<String, Object>(16); List<Map<String, Object>> list = null; if (action == null || selectType == null || date == null) { map.put(“msg”, “非法操作”); map.put(“code”, -1); return map; } HttpSession session = request.getSession(); User user = (User) session.getAttribute(“user”); String dictName = “”; String dateStr = “”; if (selectType > categoryCode) { // 填充空的数据 DictionaryTypeExample example = new DictionaryTypeExample(); example.createCriteria().andNameEqualTo(dictName); List<DictionaryType> dictionaryTypes = dictTypeService.selectByDictionaryTypeExample(example); for (DictionaryItem item : dictionaryItems) { if (!nameList.contains(item.getName())) { Map<String, Object> data = new HashMap<String, Object>(16); data.put(“category”, item.getName()); data.put(“count”, 0); list.add(data); } } } map.put(“data”, list); map.put(“code”, 0); return map; } |
界面截图:
图5-13 统计功能模块界面
第6章 系统测试
本章主要介绍理想家居客户管理系统的实现与测试。为了检验本系统的功能完整性,以及某些功能是否存在缺陷,本章设计了大量的测试任务进行相关测试。本系统在Windows10 64位专业版上运行只进行功能测试。本文只进行功能测试,未进行压力测试。测试主要针对系统的功能模块测试。执行测试,准备搭建测试环境,并记录测试内容,提交并解决测试中的bug。
6.1理想家居客户管理系统测试用例
表6-1 测试用例执行情况
需求功能 | 测试用例名称 | 执行说明 | 执行情况 | 是否通过 |
无密码登录 | 无密码登录测试 | 输入错误用户名不输入密码 | 界面弹出提示框,显示请输入密码 | 是 |
密码错误登录 | 密码错误登录测试 | 输入正确用户名,输入错误的密码 | 界面弹出提示框,显示密码错误 | 是 |
正常登录 | 正常登录测试 | 输入正确的用户名和密码 | 界面弹出出提示框,显示登录成功,并跳转到系统主页面 | 是 |
原密码错误修改密码 | 原密码错误修改密码测试 | 输入错误原密码 | 界面弹出提示框,显示请输入正确密码 | 是 |
新密码错误修改密码 | 新密码错误修改密码测试 | 输入两次错误新密码 | 界面弹出提示框,显示输入的两次新密码不一致 | 是 |
修改密码 | 修改密码 | 输入正确的原密码和新密码 | 界面重定向到登陆界面重新登陆 | 是 |
显示销售机会记录 | 显示销售机会记录测试 | 显示销售机会记录页面是否正常显示 | 显示正常 | 是 |
搜索销售机会记录 | 搜索销售机会记录测试 | 搜索销售机会记录是否能够正常搜索 | 搜索成功,并显示 | 是 |
删除销售机会记录 | 删除销售机会记录测试 | 删除销售机会记录是否能够正常删除 | 删除成功 | 是 |
处理销售机会 | 处理销售机会测试 | 处理销售机会是否能够变更销售状态 | 状态变更成功 | 是 |
显示流失客户 | 显示流失客户测试 | 显示流失客户页面是否正常显示 | 显示正常 | 是 |
搜索流失客户 | 搜索流失客户测试 | 搜索流失客户是否能够正常搜索 | 搜索成功,并显示 | 是 |
删除流失客户 | 删除流失客户测试 | 删除流失客户是否能够正常删除 | 删除成功 | 是 |
修改流失客户状态 | 修改流失客户状态测试 | 修改流失客户状态是否能够变更状态 | 变更成功 | 是 |
显示我的服务 | 显示我的服务测试 | 显示我的服务页面是否正常显示 | 显示正常 | 是 |
搜索服务 | 搜索服务测试 | 搜索服务是否能够正常搜索 | 搜索成功,并显示 | 是 |
删除服务 | 删除服务测试 | 删除服务是否能够正常删除 | 删除成功 | 是 |
处理服务 | 处理服务测试 | 处理服务是否能够变更服务状态 | 变更成功 | 是 |
错误退出系统 | 错误退出系统测试 | 确认退出时点击否 | 仍停留在本界面 | 是 |
正确退出系统 | 正确退出系统测试 | 确认退出时点击是 | 跳转到登陆界面 | 是 |
显示日志 | 显示日志测试 | 点击日志管理 | 正常显示日志 | 是 |
搜索日志 | 搜索日志测试 | 选择日期搜索 | 正常显示日志 | 是 |
查看权限信息 | 查看权限信息测试 | 能否正常显示所有权限信息 | 正常显示权限信息页面 | 是 |
删除权限 | 删除权限测试 | 能否正常删除选中的权限 | 删除成功 | 是 |
关停权限 | 关停权限测试 | 能否正常关停某一开启的权限 | 成功关停 | 是 |
恢复关停权限 | 恢复关停权限测试 | 能否正常恢复某一关停的权限 | 恢复成功 | 是 |
添加权限 | 添加权限测试 | 能否正常添加新的权限 | 添加成功 | 是 |
显示权限树 | 显示权限树测试 | 能否正常显示权限树 | 成功显示权限树 | 是 |
搜索权限 | 搜索权限测试 | 能否正常搜索权限 | 搜索成功 | 是 |
显示系统信息 | 显示系统信息测试 | 能否正常显示系统信息 | 显示正常 | 是 |
显示编辑权限页面 | 显示编辑权限页面测试 | 能否正常显示编辑权限页面 | 正常显示编辑页面 | 是 |
删除角色 | 删除角色测试 | 能否正常删除角色 | 删除成功 | 是 |
分配权限 | 分配权限测试 | 能否正常分配权限 | 成功分配 | 是 |
搜索职位 | 搜索职位测试 | 能否搜索职位并显示 | 搜索成功 | 是 |
显示我的客户信息 | 显示我的客户信息测试 | 能否正常显示我的客户信息页面 | 显示正常 | 是 |
新增一个客户 | 新增一个客户测试 | 能否正常新增一个客户 | 添加成功 | 是 |
删除一个客户 | 删除一个客户测试 | 能否正常删除一个客户 | 删除成功 | 是 |
修改一个客户信息 | 修改一个客户信息测试 | 能否正常修改一个客户信息 | 修改成功 | 是 |
将一个客户转移给其它经理 | 将一个客户转移给其它经理测试 | 能否正常将一个客户转移给其它经理 | 转移成功 | 是 |
搜索客户信息 | 搜索客户信息测试 | 能否搜索客户信息并显示 | 搜索成功 | 是 |
显示我的跟进记录 | 显示我的跟进记录测试 | 能否正常显示我的跟进记录 | 显示正常 | 是 |
新增跟进记录 | 新增跟进记录测试 | 能否正常新增跟进记录 | 添加成功 | 是 |
查看跟进记录详情 | 查看跟进记录详情测试 | 能否正常显示跟进记录详情 | 显示成功 | 是 |
显示客户成交量统计图 | 显示客户成交量统计图测试 | 能否正常客户成交量统计图 | 显示正常 | 是 |
显示经理业绩统计图 | 显示经理业绩统计图测试 | 能否正常显示经理业绩统计图 | 显示正常 | 是 |
显示客户增长统计图 | 显示客户增长统计图测试 | 能否正常显示客户增长统计图 | 显示正常 | 是 |
显示客户分类统计图 | 显示客户分类统计图测试 | 能否正常显示客户分类统计图 | 显示正常 | 是 |
6.2 性能优化
本文开发了一个客户管理系统,通过一些列的测试保证系统的稳定性。正如第三部分所说,为了保证本系统的稳定性,健壮性,以及准确性,本文做了大量的工作。但由于篇幅关系,本文只能进行简短的介绍。
在未来本系统还可以进行相应的优化,针对数据库、针对代码、针对整体架构和系统的并发等等。
1. 针对数据库本文可以编写一些视图,触发器来减少后端调用的次数,也可以编写一些锁来解决并发的问题,这些操作可以提升系统处理的速度,以及空间和内存的开销。也可能尽可能不要设计外键的联系,这样也可以提升性能,此外,还可以针对特定的环境设置不同的数据库。
2. 在代码中本系统用了大量的循环嵌套,这样的算法复杂度相对来说较高,在真实的生产环境中,可能会造成系统响应不及时等问题,所有在未来,可以更换查找的方式,比如在数据库查找时尽可能的减少循环的使用,这样可以有效的提升系统运行的效率。此外,也可以只针对数据处理时使用循环,其它时候使用并行的方式来提升效率。
3. 针对整体系统的并行,我们目前只能适用于500+的并发,考虑到客户管理系统的并发需求量不大,所以在并发的部分没有过多考虑。所以,如果未来企业扩张客户量突增,并发的需求量增加后,可以考虑重构系统订单部分,以此来提升系统的并发处理,提高数据处理效率。
4. 本文进行了性能测试未能开展压力测试,主要的原因是本文系统使用用户主要是针对理想家居的销售人员,因此压力测试进行起来相对来说比较贵。受制于资金的限制,本系统只在单机进行了相应的测试。
6.3 问题总结
由上述性能优化所述,本文目前虽然完成了基本需求的功能模块,可以用于日常企业客户管理,但是受制于时间、精力、金钱和个人能力,本文还可以在很多地方得到比较不错的提升。
1. 本文的界面主要使用LayUI进行相应的调用,并没有自己画出所需的图片,实现相应的动画,并且在不同功能上没有用到统一风格,所以在未来这部分可以提升一下。
2. 本文针对的是单一企业进行开发,所以没有对并发关注太多,在本文的测试下本文最多同时接受500+的并发数量,并且由于资金问题,本文没有进行压力测试。所以在未来,如果有并发的需求,可以重构代码提升并发,并进行相应的压力测试。
3. 本文使用的都是一些比较基础的方法,相对于现代大数据,人工智能的方法仍然存在着很多不足,所以在未来本系统可以参考现代化人工智能大数据的方法重构数据调用方法,也可以使用大数据方法评估客户合作意向,可以增加自己公司的信息动态的推送给客户,来稳固客户,提升企业的形象,挖掘潜在客户。
结束语
本文设计并实现了一个针对理想家居企业客户的客户管理系统,使用主流的SSM三层框架作为本系统的主框架,主要实现了客户管理系统的七个主要模块,分别是系统管理,客户管理,客户流失,销售机会,客户服务客户关怀和统计。其中系统管理主要针对用户权限,系统日志等进行管理。客户管理功能模块主要是由工作人员对客户信息进行维护,并且跟进合作。客户流失模块是管理长时间不联系的客户,销售机会是维护和客户合作,客户服务主要是维护客户的日常需求,客户关怀主要是提醒销售人员客户重要的日期,统计模块是统计销售人员是销售记录,基本满足了家居企业客户管理需求。
从设计SSM框架到对sql语句的编写调用,都是本人独立完成。此外在老师的指点下,增加了部分功能模块,提高了系统的性能,同时降低了代码间的耦合度,虽然系统已经完成,并且通过了测试,但是受制于个人水平,所以本系统依然有很多不足,比如没有考虑并发,没有考虑家居企业经营的模式等。在未来,如果有机会,我会继续完善本系统。
致谢
在此最后阶段,首先,我要向我的老师表示由衷的感谢,谢谢老师在此次设计过程中对我选题的建议,谢谢老师对我问题的解疑,以及谢谢老师对我论文格式的指导。其次,对我身边的同学表示感谢,在于他们的交流中,也解决了一些令我所困惑的问题,在他们的帮助下,大大缩短了论文完成的时间周期,也大大提高了此次毕业设计的质量。如果没有他们的帮助与支持,我完成此次毕业设计的周期将会大大延长,甚至可能无法按时完成此次毕业设计,因此,再此表示对我的老师、同学们表示由衷的感谢。
参考文献
[1] 耿祥义.《JSP基础编程》 清华大学出版社.2004. 55-162.
[2] 孙鑫. 《JavaWeb开发详解》 电子工业出版社.2006.50-100.
[3] 萨师煊,王珊.《数据库系统概论》.北京:高等教育出版社,1998
[4] 张洪斌 .《Java2高级程序设计》 中科多媒体出版社.2001.85-9
[5] [美]Bruce Eckel 《Java编程思想》 机械工业出版社 2005-9
[6] 沃尔斯. 《Spring in Action》 人民邮电出版社 2006-3
[7] [美]尼古拉斯·泽卡斯. 《JavaScript高级程序设计》(第3版)2012-3-29
[8] [美] Joshua Bloch. 《Effective Java》 机械工业出版社 2009-1-1
[9] 杨开振. 《Java EE 互联网轻量级框架整合开发》 电子工业出版社 2017-7
[10] 许川佩,张民. 《基于Ajax的J2EE安全应用框架》 计算机工业出版社 2010
[11] 王宜贵. 《软件工程》 机械工业出版社 2012:20-79
[12] 赵亚娟. 计算机软件JAVA编程特点及其技术研. 数字技术与应用,2016,01:113.
[13] Martin Ngobye Computing Static Slice for Java Programs.2012
[14] Joshua Bloch.Effective Java Programming Language Guide.Addison-Wesley
[15] Buell.Data structures using Java. Jones&Bartlett Learning.2013
[16] Metsker S J.Java设计模式.第二版.电子工业出版社.2012
[17] Kathy.Head First Java,2nd Edition.O’Reilly Media.2005
1、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“文章版权申述”(推荐),也可以打举报电话:18735597641(电话支持时间:9:00-18:30)。
2、网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
3、本站所有内容均由合作方或网友投稿,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务。
原创文章,作者:1158,如若转载,请注明出处:https://www.447766.cn/chachong/160566.html,