基于java+Spring+SSH的CRM客户关系管理系统设计与实现(毕业论文+程序源码)

大家好,今天给大家介绍基于java+Spring+SSH的CRM客户关系管理系统设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦。

文章目录:

  • 基于java+Spring+SSH的CRM客户关系管理系统设计与实现(毕业论文+程序源码)
    • 1、项目简介
    • 2、资源详情
    • 3、关键词:
    • 4、毕设简介
    • 5、资源下载

1、项目简介

  1. 客户关系管理系统的目的就是通过全新的管理理念整合客户信息资源,了解和满足客户的动态需求,从而提高企业效益。
  2. 论文的主要工作有:首先简单介绍研究CRM客户关系管理系统的背景。其次,简单介绍下该系统需要用的技术和框架–SSH和JSP。然后由需求分析决定的系统设计方案,再到系统详细设计,从系统的构架,功能模块,关键的技术点进行对CRM的开发。在采用Myesclipe作为开发工具,MySql作为数据库支持,结合SSH框架实现。

2、资源详情

项目难度:中等难度
适用场景:相关题目的毕业设计
配套论文字数:23672个字70页
包含内容:整套源码+完整毕业论文+答辩PPT+辅导视频+运行截图


3、关键词:

客户关系管理、SSH、MySql、B\S、JSP


4、毕设简介

提示:以下为毕业论文的简略介绍,项目源码及完整毕业论文下载地址见文末。

绪论
1.1 研究背景和意义
1.1.1 企业管理信息化
省略

1.1.2 CRM的概念
客户关系管理(CustomerRelationshipManagement),顾名思义,就是客户与企业关系利益的管理,他的中心乃至核心思想思路就是客户价值至上,以信息化技术为手段,对录入的客户材料信息进行深刻剖析,满足客户需求,打造优质服务的基础上吸引广大的客户资源,同时把他们发展成为企业公司的潜在客户资源,在提高客户对企业的满意度评价的时候也把企业的市场的竞争力势头给扩大了。

该论文的CRM以2个基本内容块组成:

  1. 客户信息分析(Customer)包括客户的详细信息,爱好等;
  2. 产品信息分析(Product)包括产品设计,产品信息等;

1.1.3 CRM客户管理系统的意义
省略

1.2 国内外研究
在国外早些年,客户关系管理理论(Customer Relationship Management)就被人研究并初步提出来了,同时也经历时间的磨练才完成看今天的比较成熟的理论,CRM是一种集合理论和技术的营销策略。首先对在企业这边来说,中心文化技术以客户资源为企业价值,推送适合的服务为客户,而在客户这边呢,就为企业对自己的服务进行评级满意度,最终的想法就是实现客户和公司企业的双向满意。

省略

1.3 论文结构
该论文的中心思想就是基于java的CRM客户关系管理系统的设计和实现,提出了开发该系统所要面对的困难和应对方案,本文的工作内容有
第一章,对CRM这个研究的背景信息以及研究意义进行阐述。
第二章,CRM客户关系管理系统的关键技术的概说。
第三章,CRM的系统分析,包括可行性报告和需求分析
第四章,数据库设计,对数据库中表字段进行设计和创建,并给出E-R图。
第五章,系统实现过程,包括登录和客户信息添加功能的实现。
第六章,系统测设阶段。
第七章,整个系统的总结和对未来的展望。

1.4 本章小结
本章主要介绍了 CRM 研究背景。

第二章 相关技术介绍
2.1 后台介绍
2.1.1 B/S平台模式
B/S 平台模式。在客户端上装置浏览器(Browser),如360、Firefox,服务器端就需要安装数据库,例如Oracle数据库、Mysql数据库、SqlServer2008或者SqlServer2010。浏览器经过 Web服务和Web服务器进行数据流转,服务器再和数据库进行数据的对接。B/S 平台模式中,第一层的是客户端,第二层的是Web服务层,可以由一台或多台服务器构成,可以动态的根据应用的需要增加或者减少服务器的个数,因此Web服务层是动态变化的,第三层的是数据层,组成部分是数据库系统和持久化层。系统维护时只需要对服务器进行升级或者其他操作,但是对浏览器就不需要做出巨大维护变动。这样客户端可以变“瘦”,而服务器端则越来越“胖”,但是更加的安全便捷。如图2-1所示

图2.1 典型的B/S架构图

2.1.2 MVC
MVC 三层架构设计模式分为三个部分,M(模型),V(视图),C(控制),每个部分都有应该有的功能和任务,然而他们又是一个整体,共同解析用户的请求并返结果。层与层之间的代码、逻辑的拆开使得系统的整体性更清晰。如图2-2 所示为三层结构的基本构架。

视图(View):视图是最先也是唯一一个和用户面对面交流的层次,也就是用户能用肉眼看到的。在Web 应用程序中,应用程序的界面的处理和设计变得多样化。视图层没有对传递的数据进行处理的功能,就是对数据提供不同形式的呈现输出方式。

模型(Model):经过了模型处理的数据可以通过定义好的视图去呈现结果,说到具体的模型,模型就是明确定义了一对业务规则的数据。模型的另一个优点就是支撑模型的代码可以被多个视图重用使用,减少了代码的冗余度。

控制器(Controller):用一个形象的比喻,控制器就是一个人的大脑,起到的是关键的调度作用,他的过程是这样的:当用户的请求被发出后,控制器接纳申请内容但是对申请不做处理,然后就转发请求信息给相应的模型和视图去处理和呈现数据结果。

图2.2 MVC结构

2.1.3 Spring
Spring框架采用分层架构,如图2-3

  1. Spring Core:BeanFactory是SpringCore最基础的组成,工厂模式的设计方式的使用就是希望每次调用对象的时候就去创建,浪费资源,把应用程序的代码和配置信息分离开来,达到互不干扰的目的。
  2. Spring AOP:Spring中的切面功能。
  3. Spring DAO:数据访问层就是dao,这个模块的最强大的作用就是操作Hibernate下的持久化对象。
  4. Spring ORM::目的是通过Spring 映射,让 Hibernate 和SQL 或者HQL的集成使用。
  5. Spring Web容器:web容器存在的目的是为该系统程序访问上下文信息。
  6. LOC:控制反转(依赖注入),在使用控制反转的程序中,对象不会被直接创建,而是规定怎样去创建它们。在配置文件是用来描述组件和功能怎么样进行合理的组合。对象由容器所创建,对象的必要属性也能通过容器进行设置,最后容器通过配置管理将各部分联系在一起,并调用方法。表2-1所示是控制反转的类型,一般来说loC容器由采用后两种实现模式。

图2.3 spring基本模块

2.1.4 Hibernate
Hibernate 框架使用的非常妙的地方是运用了数据库到java类的反射体系,通过对关系映射文档进行 XML 解析,然后就可以通过一系列的层次对象操作数据库数据,它和JDBC有很大的不同,也有很多相同之处,相同之处就在于Hibernate框架和JDBC 都是与数据经常操作,查询数据库数据返回前台或者就是前台数据存储在数据库里面。

省略

图2.4 Hibernate结构

2.1.5 Struts
Struts 框架在开发中算是比较经典了,特别是在结合了像MVC三层架构这样的观念思想后就更为大家所接受。Struts框架的简单原理就是这样的:Struts预先就定义好了Controller,也就是用于控制的控制器。首先就是去配置文件里面读取相关的配置信息要求,值得注意的是该文件的名称可以struts-config.xml,也可以用其他的形式命名。当用户的请求进入系统之后,首先对用户所要提交的数据进行打包,经过模型层和视图层的流转和相关处理,进入数据库。值得一提的是各个层次之间相互分开,都有各自的功能,在理解层次上更清晰。Struts 框架可以这样说,是更加紧密的把三层架构思想联系在一起。图 2-4 表现的Struts框架的各个组成部分具有相应的功能特点和各自的联系情况。

图2.5 Struts三层图

省略

2.2前端介绍
2.2.1JSP网页技术
JSP网页技术,Java Server Page顾名思义是把Java代码嵌在服务页面的开发技术 。它的组成部分有Java代码,html的语法规则,Jsp标签。JSP的大致变化是这样的,首先通过表单来获取用户数据并提交给系统,系统再把结果返回通过JSP组件动态的创建页面显示。JSP页面的执行过程如图

图2.6 JSP页面的执行过程

  1. 客户端登录上浏览器上访问特定的网址,由资源的路径信息的请求发出,服务器接收请求并解析路径信息,找到被请求的资源。
  2. 找到资源后就开始加载JSP或和html页面文件。
  3. JSP文件在JSP组件的处理下被以Servlet代码保存。
  4. 产生的servlet代码就可以进行编写译为Class代码文件。
  5. Class文件就是一被服务器的组件所识别然后执行。
  6. 系统执行的结果会在被浏览器所展示。

2.3开发工具
软硬件环境需求
浏览器采用IE,360,GooGle。
系统JVM为JDK1.6或更高版本。
系统数据库使用MySql配合图形化界面HeidiSql
系统的集成幵发环境MyEclipse2012。
Web容器Tomcat7.0
系统的技术架构:Struts2.0+Spring4.0+Hibernate3.0

2.4本章小结
本章对完成论文的理论基础及需要的关键技术进行了论述,系统决定使用的是的B/S 平台开发然后,分别介绍了 SSH等框架和JSP前端技术。最后说明了完成该系统的软硬件要求。

第三章 系统分析
3.1 可行性分析
3.1.1 技术可行性
首先CRM客户关系管理系统的技术核心是SSH框架的使用和典型三层架构的层次模型的开发思想。简单的说说三层的明确职能和任务:表现层与客户打交道;中间层spring+Hibernate框架的配合使用负责数据访问和接收表现层的功能请求,最主要的技术就是能够将应用程序的java类与数据库的表结构对应设计的ORM映射能力。数据层就是实体对象的构建设计,是最基础的层次。然后数据的流向是从web层,service服务层,action动作层,dao数据访问层,db数据库,再把结果逐级往上提交。

采用流行的SSH框架提高了开发效率,增加了系统的内聚性,降低了耦合性,方便以后程序的扩张。

3.1.2 经济可行性
省略

3.1.3 操作可行性
省略

3.2 需求分析
3.2.1 系统总体需求
下图是客户关系管理系统的三个功能区,可分为客户管理,产品管理,系统管理等模块。

图3.1 系统总用例图
上述的用例图是对CRM系统的总体功能需求进行描述,而这些实例中又包括其他的子用例。
1 客户管理功能需求
正确登录的系统的用户能够对客户信息作出增加,删除,更新,查询。功能需求如下图

图3.2 客户管理用例图
客户管理模块有一下部分构成:

  1. 客户信息的增加:能够录入客户(可以指个人,也可是集团客户,这里指的是集团客户)的信息,例如,公司名字,地区等信息。
  2. 客户信息的删除。
  3. 客户信息的更新修改。
  4. 客户信息的查询:可以根据公司的名字,所属省份等信息查询再数据库中保存的信息并显示出来。
    表3-1 客户管理用例表

2 产品管理功能需求
正确登录的系统的用户能够对产品信息作出增加,删除,更新,查询。功能需求如下图

  1. 产品信息的增加:能够录入产品名称,规格,价格等产品信息。
  2. 产品信息的删除。
  3. 产品信息的更新修改。
  4. 产品信息的查询:可以根据产品名字,产品列表等信息查询再数据库中保存的信息并显示出来。

图3.3 产品管理用例图
表3-2 产品管理用例表

3 系统管理功能需求
系统管理功能需求主要是对角色和权限进行管理。不同的角色拥有不同的权限。功能需求如下图

图3.4 系统管理用例图

  1. 角色的新增:通过新建角色,并对角色进行描述,完成对角色的创建。
  2. 修改权限:对已有角色的权限进行变更。
    表3-3 角色管理用例表

4 登录功能需求
下图为系统登录的流程图,用户输入账号,密码,验证码等登录信息,系统验证通过就可以登录成功,进来系统的主界面,进行各种操作。验证错误是就需要重新输入登录信息。下表为登录用例表。

图3.5 系统登录的流程图
表3-4 登录用例表

3.2.2 总体功能模块

图3.6 总体层次图
3.2.3 其他需求
CRM系统的其他要求如下表所示
表3-5 质量要求

3.3 本章小结
本章介绍了客户关系管理系统需求分析阶段的工作,主要包括对系统的可行性、功能需求及用例的具体分析等内容。

第四章 数据库设计
数据库的存在意义就是存储数据,根据需求分析就是客户信息和产品信息,最明显的表现形式就是表结构的存在。然而设计数据库的初衷就是为应用程序提u供后台支持,把代码和系统能分离出来,良好的数据库设计有很多,可以降低数据之间的冗余性,提高数据库的可维护性,同时也能提高系统运行时的速度和系统的稳定性,实现数据之间的共享。可是根据系统的功能需求设计数据库并不是那么简单,需要反复的分析功能需求,逐步的研究和推敲出最为合理的数据库表,把表和表之间的潜在的关系通过E-R图表现出来。

4.1 系统和数据的关系

图4.1 数据库与系统的管理

4.2 数据库结构设计
下图就是数据库表的设计的E-R图,就是实体-联系图,通过E-R图,可以清楚的了解系统的表与表之间的结构关系,从概念上反应数据库信息组成情况。

图4.2 数据库E-R逻辑

4.2.1 业务实体设计
业务实体在应用程序是实体对象的表现形式存在,在后台数据库中存在的形式就是表和表之间的关系。那么业务实体的实现有下面的三个步骤:
a. 设计域模型,创建域模型实体对象
b. 设计关系型数据模型
c. 创建对象、关系映射文件

4.2.2 设计域模型
生成一张客户关系记录需要上述的这些表。下面是详细的定义出这些数据库表字段的代表的意思:

  1. 部门表(hr_department):部门信息的记载。主要的属性有:部门主键(id),部门名称(d_name),上级分类ID(parentid),负责人(d_employee),电话(d_telephone),地址(d_address),邮箱(d_email),描述(d_description)。
  2. 职务表(hr_postion):对职务信息的记载。属性有:职务ID(ID),职务名称(postion_name),职务次序(postion_order)。
  3. 岗位表(hr_post):岗位信息的描述。属性有:岗位ID(ID),岗位名称(post_name),岗位描述(hr_descript)。
  4. 系统角色表(sys_role):记录的是角色的枚举值。属性有角色ID(ID),角色名称(rolename),权限说明(rolescript),当前权限可以操作(childmenus),权限排序(rolesort)。
  5. 员工表(hr_employee):员工信息的记录。属性有:员工ID(ID),用户名(uid),密码(pwd),姓名(name),身份证(idcard),生日(birthday),邮箱(email),性别(sex),电话(telephone),地址(address),备注(remarks)。
  6. 省市表:(param_city):作为省市参数的枚举表。属性有:省市ID(ID),上级ID(parentID),城市名称(city)。
  7. 客户表(crm_customer):客户信息(主要是集团客户)的记录。主要的属性有:客户表主键(ID),客户序列号(serialnumber),公司名称(customer),公司地址(address),公司电话(tel),公司网址(site),公司描述(descript),备注(remarks)。
  8. 产品类别表(crm_product_category):记录产品的分类,属性有客户类型主键(ID),父类型id(parentId)。
  9. 产品信息表(crm_product):记录的是产品信息。属性有产品id(product_id ),产品名称(product_name),产品规格(specifications),状态(status),单位(unit),备注(remarks),价格(price)。
    上文和图4-2反应了各个表之间的关系。

4.3 数据库逻辑结构设计
部门类,职务类,客户类等这些对象都需要持久化,这些类在数据库上都有对应的表结构产生意义对应的是部门表,职务表,客户表等,设计出的数据库包含这些表。如下为各个表的建表语句以及表结构。

CREATE TABLE `hr_department` (`id` int(8) NOT NULL AUTO_INCREMENT COMMENT '部门主键PK',`d_name` varchar(50) DEFAULT NULL COMMENT '部门名称',`parentid` int(8) DEFAULT NULL COMMENT '上级分类ID',`d_employee` varchar(50) DEFAULT NULL COMMENT '负责人',`d_telephone` varchar(50) DEFAULT NULL COMMENT '电话',`d_address` varchar(255) DEFAULT NULL COMMENT '地址',`d_email` varchar(50) DEFAULT NULL COMMENT '邮箱',`d_description` varchar(255) DEFAULT NULL COMMENT '描述',`d_order` varchar(50) DEFAULT NULL COMMENT '部门次序',`isdelete` int(1) DEFAULT '1' COMMENT '是否已删除0/1',`delete_time` date DEFAULT NULL COMMENT '删除时间',PRIMARY KEY (`id`)
)

表4-1 部门表结构

表4-2 职务表结构

CREATE TABLE `hr_post` (`post_id` int(8) NOT NULL AUTO_INCREMENT COMMENT '岗位ID PK',`post_name` varchar(255) DEFAULT NULL COMMENT '岗位名称',`position_id` int(8) DEFAULT NULL COMMENT '职务ID FK',`position_order` varchar(50) DEFAULT NULL COMMENT '职务次序号',`dep_id` int(8) DEFAULT NULL COMMENT '岗位部门ID FK',`post_descript` longtext COMMENT '岗位描述',PRIMARY KEY (`post_id`),KEY `position_id` (`position_id`),KEY `dep_id` (`dep_id`),CONSTRAINT `hr_post_ibfk_1` FOREIGN KEY (`position_id`) REFERENCES `hr_position` (`id`),CONSTRAINT `hr_post_ibfk_2` FOREIGN KEY (`dep_id`) REFERENCES `hr_department` (`id`)
)

表4-3 岗位表结构

CREATE TABLE `sys_role` (`roleid` int(8) NOT NULL AUTO_INCREMENT COMMENT '角色表PK',`rolename` varchar(255) DEFAULT NULL COMMENT '角色名称',`roledscript` varchar(255) DEFAULT NULL COMMENT '权限说明',`childmenus` varchar(300) DEFAULT NULL COMMENT '当前权限下可以操作的子菜单',`rolesort` char(10) DEFAULT NULL COMMENT '权限排序',PRIMARY KEY (`roleid`)
)

表4-4 角色表结构图

CREATE TABLE `hr_employee` (`id` int(8) NOT NULL AUTO_INCREMENT COMMENT '员工表ID 主键',`uid` varchar(50) DEFAULT NULL COMMENT '用户名',`pwd` varchar(50) DEFAULT NULL COMMENT '密码',`name` varchar(50) DEFAULT NULL COMMENT '姓名',`idcard` varchar(50) DEFAULT NULL COMMENT '身份证',`birthday` date DEFAULT NULL COMMENT '生日',`email` varchar(50) DEFAULT NULL COMMENT '邮箱',`sex` varchar(50) DEFAULT NULL COMMENT '性别',`telephone` varchar(50) DEFAULT NULL COMMENT '电话',`status` varchar(50) DEFAULT NULL COMMENT '状态',`sort` int(8) DEFAULT NULL COMMENT '排序 num',`entrydate` date DEFAULT NULL COMMENT '入职日期',`address` varchar(255) DEFAULT NULL COMMENT '地址',`remarks` varchar(255) DEFAULT NULL COMMENT '备注',`education` varchar(50) DEFAULT NULL COMMENT '学历',`professional` varchar(50) DEFAULT NULL COMMENT '专业',`schools` varchar(50) DEFAULT NULL COMMENT '毕业学校',`role_id` int(8) DEFAULT NULL COMMENT '角色表 ID  FK',PRIMARY KEY (`id`),KEY `post_id` (`post_id`),KEY `role_id` (`role_id`),CONSTRAINT `hr_employee_ibfk_2` FOREIGN KEY (`post_id`) REFERENCES `hr_post` (`post_id`),CONSTRAINT `hr_employee_ibfk_5` FOREIGN KEY (`role_id`) REFERENCES `sys_role` (`roleid`)
)

表4-5 员工表结构

CREATE TABLE `param_city` (`id` int(8) NOT NULL AUTO_INCREMENT COMMENT '省市ID PK',`parentid` int(8) DEFAULT NULL COMMENT '上级ID',`city` varchar(250) DEFAULT NULL COMMENT '省市名称',PRIMARY KEY (`id`)
)

表4-6 省市表结构

CREATE TABLE `crm_customer` (`id` int(8) NOT NULL AUTO_INCREMENT COMMENT '客户表主键 PK',`serialnumber` varchar(250) DEFAULT NULL COMMENT '客户序列号',`customer` varchar(250) DEFAULT NULL COMMENT '公司名称',`address` varchar(250) DEFAULT NULL COMMENT '公司地址',`tel` varchar(250) DEFAULT NULL COMMENT '公司电话',`site` varchar(250) DEFAULT NULL COMMENT '公司网止',`provinces_id` int(8) DEFAULT NULL COMMENT '公司省份ID Fk',`city_id` int(8) DEFAULT NULL COMMENT '公司城市ID FK',`descripe` varchar(4000) DEFAULT NULL COMMENT '客户描述',`remarks` varchar(4000) DEFAULT NULL COMMENT '备  注',`create_id` int(8) DEFAULT NULL COMMENT '创建人id FK',PRIMARY KEY (`id`),KEY `ix_crm_customer_customer` (`customer`),KEY `provinces_id` (`provinces_id`),KEY `city_id` (`city_id`),KEY `employee_id` (`employee_id`),KEY `create_id` (`create_id`),CONSTRAINT `crm_customer_ibfk_7` FOREIGN KEY (`employee_id`) REFERENCES `hr_employee` (`id`),
)

表4-7 客户表结构图

CREATE TABLE `crm_product_category` (`id` int(8) NOT NULL AUTO_INCREMENT COMMENT '产品类别ID pk',`product_category` varchar(250) DEFAULT NULL COMMENT '产品分类名称',`parentid` int(8) DEFAULT NULL COMMENT '父类别ID',PRIMARY KEY (`id`)
)

表4-8 产品类别表结构

CREATE TABLE `crm_product` (`product_id` int(8) NOT NULL AUTO_INCREMENT COMMENT '产品ID PK',`category_id` int(8) DEFAULT NULL COMMENT '产品分类ID FK',`product_name` varchar(100) DEFAULT NULL COMMENT '产品名称',`specifications` varchar(250) DEFAULT NULL COMMENT '规格说明',`status` varchar(250) DEFAULT NULL COMMENT '状态',`unit` varchar(250) DEFAULT NULL COMMENT '单位',`remarks` longtext COMMENT '备注解释',`price` double DEFAULT NULL COMMENT '价格',PRIMARY KEY (`product_id`),KEY `category_id` (`category_id`),CONSTRAINT `crm_product_ibfk_1` FOREIGN KEY (`category_id`) REFERENCES `crm_product_category` (`id`)
)

表4-9 产品信息表结构

4.4 本章小结
这一章介绍了根据业务需求设计数据库的相关表和表与表之间的关系以及给出了建表语句。

第五章 系统的详细设计和实现
根据上文的功能分析和数据库的分析,在系统的实现阶段上采用当今开源的SSH(Struts+Hibernate+Spring)整合框架实现。其目的是降低个模块间的耦合度,使各个模块之间的功能相互独立、模块内部结构清晰。

系统架构如图所示。整个系统是有多个层次的,数据流动的顺序是从浏览器到数据库,再从数据库到浏览器,中间经过service层,action层和dao层。

图5.1系统架构
如图展示的是层次之间的走向是自左到右,每一个层次都是相互依赖的关系。

用户登录这个客户关系管理系统需要在自己的浏览器上访问特定的网址,然后点击某些功能键后系统在段时间内回复用户访问请求,调用逻辑业务层代码接收请求和妆发请求,在执行访问数据库底层代码,请求经过dao层查询数据库并取出数据一步一步返回给上一层,最终把结论呈现在原来的jsp网页给使用者看。

5.1持久层设计
持久层的功能就是接收其他层的请求并且响应其他层次的功能对数据库的进行访问得到数据,持久层的设计就需要设定应用程序和数据库交流的实体类和进行交流的方法。那么这一层就大致有实体对象的持久化类,以及数据访问层接口的实现类等结构。特别说明,持久层使用了开发程序经常使用的Hibernate框架,框架的使用能大大的减小关系型数据库与对象应用程序之间的不能一一对应的缺点,可以把需要处理的数据封装成对象。并且设计的实体类(持久化类),他的结构大概是对象的属性,构造方法(有参和无参),还有自动生成了get()和set()函数。如图为各个功能的类图。

产品管理功能的类图如下

图5.2 产品管理类图
如下为实体类对应的代码:
产品类别:

private Integer id;private HrEmployee hrEmployee;private String productCategory;private Integer parentid;
产品信息:private Integer productId;private CrmProductCategory crmProductCategory;private String productName;private String specifications;private String status;private String unit;private String remarks;private Double price;

角色管理类图

图5.3 角色管理类图

角色实体类的代码:
private Integer roleid;
private String rolename;
private String roledscript;
private String childmenus;
private String rolesort;

登录管理和客户管理的类图设计

图5.4 登录管理类图
如下为实体类的代码:
部门类:

private Integer id;private String DName;private Integer parentid;private String DTelephone;private String DAddress;private String DEmail;private String DDescription;private String DOrder;
职务类:private Integer id;private String positionName;private String positionOrder;
岗位类:private Integer postId;private HrPosition hrPosition;private HrDepartment hrDepartment;private String postName;private String positionOrder;private String postDescript;
员工类:
private Integer id;private SysRole sysRole;private HrPost hrPost;private String uid;private String pwd;private String name;private String idcard;private Date birthday;private String email;private String sex;private String telephone;private String status;private Integer sort;private Date entrydate;private String address;private String remarks;private String education;private String professional;private String schools;

客户管理用例图如图所示:

图5.5 客户管理类图
省市类:

private Integer id;private Integer parentid;private String city;
客户类:private Integer id;private HrEmployee hrEmployeeByEmployeeId;private ParamCity paramCityByCityId;private ParamCity paramCityByProvincesId;private String serialnumber;private String customer;private String address;private String tel;private String site;private String descripe;private String remarks;

5.1.1 创建关系映射
5.1.2 与数据库的连接
在web-inf下的application-contex。Xml配置文件里定义了连接数据库的数据源,通过数据源,可以将类和数据库中的表进行关联。

<bean id="dataSource"class="org.apache.commons.dbcp.BasicDataSource"><property name="driverClassName"value="com.mysql.jdbc.Driver"></property><property name="url"value="jdbc:mysql://127.0.0.1:3306/mycrmdb"></property><property name="username" value="root"></property><property name="password" value="123456"></property></bean>

在定义过程中,数据库的url为jdbc:mysql://127.0.0.1:3306/mycrmdb,用户名为root,数据库密码是123456,驱动类为com.mysql.jdbc.driver。

5.1.3 Hibernate的ORM映射
数据库表的存在和应用程序的java对象之间的一一对应采用的是Hibernate框架所拥有的关系对应(ORM)功能,java持久层组成的结构具有两个部分:Java实体类、数据库的表与实体类对象一一对照的关系映射Hibernate文件。这些事实体能够持久化的基础。

由于表比较多,就以一个crm_customer作为说明。
在MyCrm项目下的com.crm.info包下,存放着该项目的所有持久层对象文件。其中客户信息的实体对象持久类CrmCustomer.java的代码如下:

public CrmCustomer() {}//无参构造函数
public CrmCustomer(HrEmployee hrEmployeeByEmployeeId,ParamSysparam paramSysparamByCustomertypeId,ParamSysparam paramSysparamByCustomerlevelId,HrEmployee hrEmployeeByCreateId, ParamCity paramCityByCityId,ParamSysparam paramSysparamByCustomersourceId,HrDepartment hrDepartment,ParamSysparam paramSysparamByCustomerindustryId,ParamCity paramCityByProvincesId, String serialnumber,String customer, String address, String tel, String site,String descripe, String remarks, String privatecustomer,Date lastfollow, Date createDate, Integer isdelete,Date deleteTime, Set crmContacts, Set crmContracts,Set crmInvoices, Set crmReceives, Set crmFollows, Set crmOrders) {this.hrEmployeeByEmployeeId = hrEmployeeByEmployeeId;this.paramSysparamByCustomertypeId = paramSysparamByCustomertypeId;this.paramSysparamByCustomerlevelId = paramSysparamByCustomerlevelId;this.hrEmployeeByCreateId = hrEmployeeByCreateId;this.paramCityByCityId = paramCityByCityId;this.paramSysparamByCustomersourceId = paramSysparamByCustomersourceId;this.hrDepartment = hrDepartment;this.paramSysparamByCustomerindustryId = paramSysparamByCustomerindustryId;this.paramCityByProvincesId = paramCityByProvincesId;this.serialnumber = serialnumber;this.customer = customer;this.address = address;this.tel = tel;this.site = site;this.descripe = descripe;this.remarks = remarks;this.privatecustomer = privatecustomer;this.lastfollow = lastfollow;this.createDate = createDate;this.isdelete = isdelete;this.deleteTime = deleteTime;this.crmContacts = crmContacts;this.crmContracts = crmContracts;this.crmInvoices = crmInvoices;this.crmReceives = crmReceives;this.crmFollows = crmFollows;this.crmOrders = crmOrders;}//有参构造函数 ,是用来给变量赋值的
public Integer getId() {return this.id;}//对象的get方法public void setId(Integer id) {this.id = id;}//对象的set方法

从代码可看出,持久层不包括任何的业务逻辑代码,只包含有变量定义和变量所拥有的get()、set()函数,是一个单纯的Java对象,目的是有很高的可移植性,提供代码的可重用性。

CrmCustomer.hbm.xml中重要代码如下:

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
//该文件采用的DTD标准
<class name="com.crm.info.CrmCustomer" table="crm_customer" catalog="mycrmdb">//mycrmdb数据库下表crm_customer和CrmCustomer对象对应<id name="id" type="java.lang.Integer"><column name="id" /> //主键id的类型是int类型<generator class="native" /></id>
<many-to-one name="hrEmployeeByEmployeeId" class="com.crm.info.HrEmployee" fetch="select"><column name="employee_id"><comment>负责员工ID FK</comment></column></many-to-one>//使用了外键
<property name="customer" type="java.lang.String"><column name="customer" length="250"><comment>公司名称</comment></column></property>// 一般的属性定义映射

标签中name属性表示的是持久层类的java全限定名,table属性代表的意思是所使用的数据库表名。Catalog属性表现为使用的数据库的名字。标签中name为实体类属性的名称,type是属性的类型,的name定义该实体类对应数据库表的字段名字。的class属性表示数据库表之间的关联生产对策。

由此可见,实体类和数据库中的表名在配置文件中都有明确的逐个对应,Hibernate会根据映射文件将实体类转化为数据库表,或者将数据库字段转换为实体类。

在Hibernate中就有映射配置是这样的:

<bean id="sessionFactory"class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"><property name="dataSource"><ref bean="dataSource" /></property><property name="hibernateProperties"><props><prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop></props></property><property name="mappingResources"><list><value>com/crm/info/ParamSysparamType.hbm.xml</value><value>com/crm/info/SysMenu.hbm.xml</value><value>com/crm/info/ParamCity.hbm.xml</value><value>com/crm/info/PersonalEvent.hbm.xml</value><value>com/crm/info/MailAttachment.hbm.xml</value><value>com/crm/info/CrmProductCategory.hbm.xml</value><value>com/crm/info/HrPost.hbm.xml</value><value>com/crm/info/HrDepartment.hbm.xml</value><value>com/crm/info/HrPosition.hbm.xml</value><value>com/crm/info/PersonalNotes.hbm.xml</value><value>com/crm/info/CrmProduct.hbm.xml</value><value>com/crm/info/CrmCustomer.hbm.xml</value><value>com/crm/info/PersonalChat.hbm.xml</value><value>com/crm/info/CrmContact.hbm.xml</value><value>com/crm/info/ParamSysparam.hbm.xml</value><value>com/crm/info/PersonalCalendar.hbm.xml</value><value>com/crm/info/SysLogin.hbm.xml</value><value>com/crm/info/CrmOrder.hbm.xml</value><value>com/crm/info/CrmFollow.hbm.xml</value><value>com/crm/info/CrmContract.hbm.xml</value><value>com/crm/info/PublicNotice.hbm.xml</value><value>com/crm/info/MailFlow.hbm.xml</value><value>com/crm/info/PublicNews.hbm.xml</value><value>com/crm/info/HrEmployee.hbm.xml</value><value>com/crm/info/CrmOrderDetails.hbm.xml</value><value>com/crm/info/CrmInvoice.hbm.xml</value><value>com/crm/info/CrmReceive.hbm.xml</value><value>com/crm/info/SysRole.hbm.xml</value><value>com/crm/info/PublicChatRoom.hbm.xml</value><value>com/crm/info/SysApp.hbm.xml</value></list></property></bean>

5.1.4 Struts的配置文件
Struts.xml文件的作用主要是对到来自JSP的请求的接收和跳转分配的作用,该struts的核心配置文件如下:

<package name="myapp" namespace="/" extends="struts-default"><global-results><result name="error" type="redirect">/login.jsp</result><result name="ajax">/ajax.jsp</result></global-results><action name="hr_emp" class="hrEmployeeAction"><result name="login" type="redirect">/index.jsp</result><result name="loginerr">/login.jsp</result></action></package><constant name="struts.ui.theme" value="simple"></constant><constant name="struts.multipart.maxSize" value="5242880"></constant><include file="com/crm/struts/crm-struts.xml"></include><include file="com/crm/struts/hr-struts.xml"></include><include file="com/crm/struts/mail-struts.xml"></include><include file="com/crm/struts/param-struts.xml"></include><include file="com/crm/struts/personal-struts.xml"></include><include file="com/crm/struts/public-struts.xml"></include><include file="com/crm/struts/sys-struts.xml"></include>

5.1.5 Spring 的配置文件
Spring框架的中心配置文件就是Web.xml,文件里根据自己的需要填写了一些注解文件。利用spring的注解方式进行实例化,action和dao层。

filter><filter-name>struts2</filter-name><filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class></filter><filter><filter-name>os</filter-name><filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class></filter><filter-mapping><filter-name>os</filter-name><url-pattern>/*</url-pattern></filter-mapping><filter-mapping><filter-name>struts2</filter-name><url-pattern>/*</url-pattern></filter-mapping><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><welcome-file-list><welcome-file>login.jsp</welcome-file></welcome-file-list><login-config><auth-method>BASIC</auth-method></login-config>
</web-app>

5.1.6 DAO层设计
DAO层,原文翻译是Data Access Object,从字面上理解的意思是数据访问对象层次,dao的使用目的就是定义出与数据操作方法有关的逻辑代码,例如:增删改查这样的操作。

按照DAO的设计规则,DAO层里面必须要有操作数据的方法,在com.crm.dao包下存放所有的dao层对象。首要的是通过继承Hibernate框架下的HibernateDaoSupport这个支持类的setSessionFactory()方法并通过Spring的注解进行依赖注入,然后执行getHibernateTemolate()方法得到Hibernate框架的模板类数据,使得执行的速度加快了,方便了开发者。

CrmCustomerDao.java的重要代码。
public List<CrmCustomer> findAllByWhere(CrmCustomeVobj cy) {if (cy == null) {return findAll();}Criteria c = createCriter(this.getSession(), cy);return c.add(Restrictions.eq("isdelete", 1)).list();}

5.2 逻辑业务层设计
逻辑业务层是应用程序的业务中心所在,接收从表现层传来的数据,经过逻辑业务层的处理,由持久层存储下来。

5.2.1 业务逻辑类的实现
业务逻辑类的实现是业务逻辑层向上层提供服务的业务实现。只专注于具体的业务逻辑,满足客户多样化的需求。同时,业务逻辑层需要持久层的实例来调用持久层的服务,而持久层的实例可以通过Spring容器的动态注入完成。

@Transactional
@Service("crmCustomerBiz")//动态注入
private CrmCustomerDao crmCustomerDao;//属性的声明public void setCrmCustomerDao(CrmCustomerDao crmCustomerDao) {this.crmCustomerDao = crmCustomerDao;}//构造函数/*** 新增对象* @param customer* @return*/public CrmCustomer addCustomer(CrmCustomer customer) {customer.setIsdelete(1);customer.setCreateDate(new Date());try {crmCustomerDao.save(customer);return customer;} catch (Exception e) {e.printStackTrace();return null;}}

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实现类为HrEmployActionHrEmployAction中的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进行整合对登录和客户信息添加模块模块做了详细的介绍。

第六章 系统测试
6.1 系统测试综述
测试的目标有

  1. 测试系统登录
  2. 测试系统能正确添加客户信息
    6.2 测试用例
    6.2.1 用户登录模块
    表6-1 用户登录

用户登录用例信息
表6-1 登录用例数据

进入主界面,登录成功。
6.2.2 添加客户信息
表6-2 添加客户信息用例

进入客户列表,测试新增客户功能。

测试用例
表 6-3 添加信息数据

提交和能成功的显示在页面上,测试案例成功。
6.3 本章小结
这一章通过对CRM客户关系管理系统的两个小功能进行的测试,通过测试用例,成功的将所需要的功能目的展现出来。
第七章 总结和展望未来

7.1 结论
CRM系统是一个具有新思维的管理机制,通过CRM软件希望能够改变企业和客户之间的传统联系,达到有效的管理和利用企业的客户资源的目标,提高企业对客户的服务水平,促进市场竞争力的形成,为公司和企业带来财富和效益,CRM客户关系管理系统的研究具备重要的理论目的和实践性。

本课题研究的是是基于java这门语言通过SSH框架结合使用实现的CRM企业客户关系管理系统。主要学到知识有:

  1. 对Struts、Spring、Hibernate三个framework有了初步的使用了解。特别是整合三优秀框架进行开发。
  2. 熟悉三层架构,有利于系统的维护。
  3. 能有效的利用测试原理对系统功能进行测试。
  4. 对jsp有一定的理解。
  5. 在整个系统中,运用到UML统一建模语言对系统的功能模型、对象模型进行设计,并根据系统的需求设计系统功能。在思考如何写入CRM系统代码时,需要严谨的逻辑思维,严格的要求,这篇论文在 MVC三层架构的基础上,采用 J2EE成熟的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

外文原文和翻译
省略


5、资源下载

本项目源码及完整论文如下,有需要的朋友可以点击进行下载。如果链接失效可点击下方卡片扫码自助下载。

序号 毕业设计全套资源(点击下载)
本项目源码 基于java+Spring+SSH的CRM客户关系管理系统设计与实现(源码+文档)_JSP_SSH_客户关系管理系统.zip

java毕业设计——基于java+Spring+SSH的CRM客户关系管理系统设计与实现(毕业论文+程序源码)——CRM客户关系管理系统相关推荐

  1. java毕业设计——基于JSP+sqlserver的环境美容服务公司网站设计与实现(毕业论文+程序源码)——公司网站

    基于JSP+sqlserver的环境美容服务公司网站设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于JSP+sqlserver的环境美容服务公司网站设计与实现,文章末尾附有本毕业设计的论文 ...

  2. asp毕业设计——基于asp+access的校园网上购物平台设计与实现(毕业论文+程序源码)——网上购物平台

    基于asp+access的校园网上购物平台设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于asp+access的校园网上购物平台设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦. ...

  3. asp毕业设计——基于asp+access的在线人才招聘网设计与实现(毕业论文+程序源码)——人才招聘网

    基于asp+access的在线人才招聘网设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于asp+access的在线人才招聘网设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦.需要下 ...

  4. asp毕业设计——基于asp+access的辅导员之家网站设计与实现(毕业论文+程序源码)——辅导员之家网站

    基于asp+access的辅导员之家网站设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于asp+access的辅导员之家网站设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦.需要下 ...

  5. C#毕业设计——基于C#+asp.net+FTP的FTP客户端设计与实现(毕业论文+程序源码)——FTP客户端

    基于C#+asp.net+FTP的FTP客户端设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于C#+asp.net+FTP的FTP客户端设计与实现,文章末尾附有本毕业设计的论文和源码下载地 ...

  6. vb毕业设计——基于vb+VB.NET的媒体播放器设计与实现(毕业论文+程序源码)——媒体播放器

    基于vb+VB.NET的媒体播放器设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于vb+VB.NET的媒体播放器设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦. 文章目录: 基于 ...

  7. asp毕业设计——基于asp+access的精品课程教学网站设计与实现(毕业论文+程序源码)——精品课程教学网站

    基于asp+access的精品课程教学网站设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于asp+access的精品课程教学网站设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦.需 ...

  8. asp毕业设计——基于asp+access的精品在线试题库设计与实现(毕业论文+程序源码)——精品在线试题库

    基于asp+access的精品在线试题库设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于asp+access的精品在线试题库设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦.需要下 ...

  9. 【java毕业设计】基于Spring Boot+mysql的酒店管理系统设计与实现(程序源码+毕业论文)-酒店管理系统

    基于Spring Boot+mysql的酒店管理系统设计与实现(程序源码+毕业论文) 大家好,今天给大家介绍基于Spring Boot+mysql的酒店管理系统设计与实现,本论文只截取部分文章重点,文 ...

  10. java毕业设计——基于Java+Java ME的无线网络移动端的俄罗斯方块游戏设计与实现(毕业论文+程序源码)——俄罗斯方块游戏

    基于Java+Java ME的无线网络移动端的俄罗斯方块游戏设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于Java+Java ME的无线网络移动端的俄罗斯方块游戏设计与实现,文章末尾附有 ...

最新文章

  1. 调用 fork() 两次以避免僵死进程
  2. ThinkPHP里面Model的数据类型问题
  3. 关于HtmlParser中Parser【org.htmlparser.Parser】这个类奇怪的地方...求解释【已获得解释】...
  4. SCCM2007 R2统计软件使用频率,SCCM系列之七
  5. java8 filter return_java8新特性Java 8 Streams filter示例 - Java教程
  6. 9206 课堂笔记 综合演练 添加数据与非空验证
  7. 【Flink】FLink 1.13 3 种 命令客户端 GenericCLI 、 FlinkYarnSessionCli、DefaultCLI
  8. 2017长春java平均工资_2016年长春在岗职工社会平均工资出炉:66948元,月平均工资5579元...
  9. 不要钱还免安装!Photoshop杀手火了,网友:作者是上帝么?
  10. php 取一条数据,php 读取txt 每次固定输出一条数据用什么方法实现?
  11. python 全局变量使用报错没有定义_python跨文件使用全局变量的实现
  12. 四种模式、五大架构 规划企业物联网蓝图
  13. paip.提升开发效率--使用拼音
  14. html修改每页显示数量,JS实现动态设置每页显示固定行数
  15. Python——银行管理系统
  16. 戏说面向对象程序设计
  17. Next主题添加背景图片
  18. 考研408-计算机组成原理-总线
  19. adb 查看浏览器内核
  20. 计算机图形学-二维图形的裁剪

热门文章

  1. mysql 嵌套_MySQL的嵌套查询
  2. 动手DIY一个智能镜子
  3. 可能是最全的h5唤起App方案
  4. H5打开APP或小程序
  5. 网络安全/渗透测试工具AWVS14.7下载
  6. 计算机无法安装网卡驱动,win7网卡驱动安装不了怎么修复_WIN7网卡驱动装不上如何解决...
  7. html网站计数器代码,如何在网站添加计数器代码
  8. vue实现留言板的功能_vue初探-简易留言板
  9. Linux应用开发-GPS电子围栏设计
  10. 谷歌金山词霸/搜狗、QQ、google输入法模式分析及展望