网站布局怎么用dw做,网站注册费计入什么科目,数据交易网站源码,产品规划【免费】基于Java的CRM客户关系管理系统的设计和实现.zip资源-CSDN文库https://download.csdn.net/download/JW_559/89273409 基于Java的CRM客户关系管理系统的设计与实现 摘 要 随着互联网的高速发展#xff0c;市场经济的信息化#xff0c;让企业之间的竞争变得#xff0… 【免费】基于Java的CRM客户关系管理系统的设计和实现.zip资源-CSDN文库https://download.csdn.net/download/JW_559/89273409 基于Java的CRM客户关系管理系统的设计与实现 摘 要 随着互联网的高速发展市场经济的信息化让企业之间的竞争变得为解决快速把握客户的需求变化增加客户和企业的互动降低企业的服务成本把信息的分析和加工成为企业脱颖而出的创新点等问题。那么客户关系管理孕育而生。客户关系管理系统的目的就是通过全新的管理理念整合客户信息资源了解和满足客户的动态需求从而提高企业效益。 论文的主要工作有首先简单介绍研究CRM客户关系管理系统的背景。其次简单介绍下该系统需要用的技术和框架--SSH和JSP。然后由需求分析决定的系统设计方案再到系统详细设计从系统的构架功能模块关键的技术点进行对CRM的开发。在采用Myesclipe作为开发工具MySql作为数据库支持结合SSH框架实现。 最后完成测试阶段。 关键词客户关系管理、SSH、MySql、B\S、JSP ABSTRACT With the rapid development of Internet, the information of market economy, make the competition between enterprises becomes, in order to solve quickly grasp the changing needs of customers, increase customer and enterprise interaction, reduce the service cost of enterprises, the analysis and processing of information has become the enterprise talent shows itself innovation and other issues. So customer relationship management is born. Customers the relationship between management system is designed by a new management concept to integrate customer information resources to understand and meet the dynamic needs of customers, so as to improve the efficiency of enterprises. The main work of this paper is:First, a brief introduction of the background of the CRM customer relationship management system。Secondly a brief introduction of the system requires the use of technology and framework --SSH and JSP.Then, analysis of system design scheme is decided by the demand to the detailed design of the system, from the system architecture, function modules, key technical points for the development of CRM. In the use of Myesclipe as a development tool, MySql as database support, combined with the SSH framework.Finally complete the test phase. Key words: customer relationship management, SSH, MySql, BS, JSP 绪论 研究背景和意义 企业管理信息化 随着信息的快速发展企业在传统的摸索上融合现代化信息科技是时代进步的选择。企业信息化是企业在生产产品销售产品产品跟踪上更加科学更加有效更加透明。这样做带有的结果就是一方面让企业内部更加干净有积极性一方面为企业带收益客户都看到企业的努力形成更多的客户资源增强企业竞争的过程。 设计信息化生产信息化管理信息化决策科学化构成了企业的信息化。 企业管理信息化的意义 由以经验累积占主导参照以往的类似做法独断性的决策思想和做法慢慢的以科学为依据数据为参照的现代信息做法总结的说这个转型是现代科技增强的后果慢慢的在加强对整体的了解和更大化的公开公司的决策。让数据库代替纸张以历史数据为例以全局的客观的分析为榜样大大加强其科学性。 CRM的概念 客户关系管理CustomerRelationshipManagement顾名思义就是客户与企业关系利益的管理他的中心乃至核心思想思路就是客户价值至上以信息化技术为手段对录入的客户材料信息进行深刻剖析满足客户需求打造优质服务的基础上吸引广大的客户资源同时把他们发展成为企业公司的潜在客户资源在提高客户对企业的满意度评价的时候也把企业的市场的竞争力势头给扩大了。 该论文的CRM以2个基本内容块组成 客户信息分析(Customer)包括客户的详细信息爱好等产品信息分析(Product)包括产品设计产品信息等 CRM中的管理理念 客户是企业的一项重要资产 这客户与资产的相对变化标志着在随着社会发展的企业的思想都在变化企业公司的客户资源价值取代原本的有形的产品资源成为中心把客户资源当做无形的资产打破传统的有形资产的理念多方式赢得客户的满意。所以’客户是上帝’’客户的利益高于一切’的理念在悄无声息的推广。 客户生命周期价值 在商品活动的早期收入的增长来源于新客户的获取随着时间推移新客户的获取变得困难且成本昂贵。保证现有客户的忠诚度上并提高竞争能力生命周期价值就体现了他的独特。 客户生命周期价值CLV的研究是针对长期客户关系是指客户或潜在客户在一段时间内用目前货币价值来计算的预期价值。长期合作关系能给双方带来明显的利益同时可以降低交易的不确定降低交易资本赢得交易市场。 CRM客户管理系统的意义 CRM系统始终关心的是客户的多少、产品的销售多少当服务多了客户具有权利对产品和服务的质量去比较然后选择以最适合的服务来服务客户的每个时间段千奇百怪显个性化的需求。所以CRM的作用主要为企业提供了对客户及所需产品的统计。所以CRM系统的开发有如下的意义 提高效率 提高效率的说法是和传统的管理行业相比较的。CRM信息化的技术手段首先带动的就是效益问题相比传统的电子表格和管理是更灵活了工作带有的成本也低下去了。其次就是CRM业务的操作在操作手册上就有描述少去了巨额的培训费等东西。在如今的时代抓住每一个机会抓住每一个需求就是一种效益。 拓展市场 拓宽市场是每一个企业发展路上的必经路口但是呢盲目的口号和没有实质性效益的动作都是只会走反路CRM系统拥有客户信息资源产品信息资源活动跟进调查财务金融等一系列的有目的性和风险性的分析技术为每一个营销活动保驾护航。 保留客户 保留客户的最好最有效的方法就是在交易的过程中让客户得到更多的关怀和照顾只要有网络的地方就可通过访问固定的网址登陆到CRM客户关系管理系统上使用现有比较简单的方式方法例如说电话网络查询等手段让广大的客户朋友们享受到公司企业对他们推送最为快捷的一对一的高质量服务这让客户对公司就有个好的印象留在心底。这也就为后期的发展潜在客户或保存旧客户提供者不错的捷径。 国内外研究 在国外早些年客户关系管理理论(Customer Relationship Management)就被人研究并初步提出来了同时也经历时间的磨练才完成看今天的比较成熟的理论CRM是一种集合理论和技术的营销策略。首先对在企业这边来说中心文化技术以客户资源为企业价值推送适合的服务为客户而在客户这边呢就为企业对自己的服务进行评级满意度最终的想法就是实现客户和公司企业的双向满意。 目前针对CRM的研究主要集中在以下几个方面 CRM应该注入的观念是以客户为本。首先呢转变传统的看得见的资产才叫资产的观念把客户的信息资源当做企业的依靠的动力满足好客户的特殊化需求建立起和加深好客企两者之间的那种微弱的关系从而独树一帜。对CRM客户关系管理系统的信息化技术的摸索和探究。我国的软件it行业自从1999年对CRM投入了关注的目光以后随着我们信息化技术的波浪般推动在一定程度上为CRM的推广铺下了一层科技的土壤数据库理论的建设自动化数据信息互联网的发展都在为软件行业的发行推波助燃。而且我国的产业结构也需要软件信息来加快节奏加快步伐例如提到的金融业电信产业等都需要CRM的支撑才能更高一层楼。在特色性上我国的CRM还很孱弱需要企业面对CRM敢吃也不敢吃的纠结CRM带来的效益是好的但是部署的效果往往差强人意。所以CRM客户关系管理系统更应该在新时代去探索。 论文结构 该论文的中心思想就是基于java的CRM客户关系管理系统的设计和实现提出了开发该系统所要面对的困难和应对方案本文的工作内容有 第一章对CRM这个研究的背景信息以及研究意义进行阐述。 第二章CRM客户关系管理系统的关键技术的概说。 第三章CRM的系统分析,包括可行性报告和需求分析 第四章数据库设计对数据库中表字段进行设计和创建并给出E-R图。 第五章系统实现过程包括登录和客户信息添加功能的实现。 第六章系统测设阶段。 第七章整个系统的总结和对未来的展望。 本章小结 本章主要介绍了 CRM 研究背景。 相关技术介绍 后台介绍 B/S平台模式 B/S 平台模式。在客户端上装置浏览器Browser如360、Firefox服务器端就需要安装数据库例如Oracle数据库、Mysql数据库、SqlServer2008或者SqlServer2010。浏览器经过 Web服务和Web服务器进行数据流转服务器再和数据库进行数据的对接。B/S 平台模式中第一层的是客户端第二层的是Web服务层,可以由一台或多台服务器构成可以动态的根据应用的需要增加或者减少服务器的个数因此Web服务层是动态变化的第三层的是数据层组成部分是数据库系统和持久化层。系统维护时只需要对服务器进行升级或者其他操作但是对浏览器就不需要做出巨大维护变动。这样客户端可以变“瘦”,而服务器端则越来越“胖”但是更加的安全便捷。如图2-1所示 图2.1 典型的B/S架构图 MVC MVC 三层架构设计模式分为三个部分M模型V视图C控制每个部分都有应该有的功能和任务然而他们又是一个整体共同解析用户的请求并返结果。层与层之间的代码、逻辑的拆开使得系统的整体性更清晰。如图2-2 所示为三层结构的基本构架。 视图View视图是最先也是唯一一个和用户面对面交流的层次也就是用户能用肉眼看到的。在Web 应用程序中应用程序的界面的处理和设计变得多样化。视图层没有对传递的数据进行处理的功能就是对数据提供不同形式的呈现输出方式。 模型(Model)经过了模型处理的数据可以通过定义好的视图去呈现结果说到具体的模型模型就是明确定义了一对业务规则的数据。模型的另一个优点就是支撑模型的代码可以被多个视图重用使用减少了代码的冗余度。 控制器(Controller)用一个形象的比喻控制器就是一个人的大脑起到的是关键的调度作用他的过程是这样的当用户的请求被发出后控制器接纳申请内容但是对申请不做处理然后就转发请求信息给相应的模型和视图去处理和呈现数据结果。 图2.2 MVC结构 Spring Spring框架采用分层架构如图2-3 Spring CoreBeanFactory是SpringCore最基础的组成工厂模式的设计方式的使用就是希望每次调用对象的时候就去创建浪费资源把应用程序的代码和配置信息分离开来达到互不干扰的目的。Spring AOPSpring中的切面功能。Spring DAO数据访问层就是dao这个模块的最强大的作用就是操作Hibernate下的持久化对象。Spring ORM:目的是通过Spring 映射让 Hibernate 和SQL 或者HQL的集成使用。Spring Web容器web容器存在的目的是为该系统程序访问上下文信息。LOC控制反转(依赖注入)在使用控制反转的程序中对象不会被直接创建而是规定怎样去创建它们。在配置文件是用来描述组件和功能怎么样进行合理的组合。对象由容器所创建对象的必要属性也能通过容器进行设置最后容器通过配置管理将各部分联系在一起并调用方法。表2-1所示是控制反转的类型一般来说loC容器由采用后两种实现模式。 图2.3 spring基本模块 表2-1 LOC实现类型 类型一 服务需要专门的接口通过接口由对象提供这些服务可以从对象查询服务的依赖性 类型二 通过JavaBean的属性分配依赖性 类型三 依赖性由构造函数提供 Hibernate Hibernate 框架使用的非常妙的地方是运用了数据库到java类的反射体系通过对关系映射文档进行 XML 解析然后就可以通过一系列的层次对象操作数据库数据它和JDBC有很大的不同也有很多相同之处相同之处就在于Hibernate框架和JDBC 都是与数据经常操作查询数据库数据返回前台或者就是前台数据存储在数据库里面。 1.ORMObject Relation Mapping从字面上理解及时对象关系映射这个功能就很有用处了定义了需要的持久化对象后还需要对实体对象和数据库的表名进行一一对应的联系。 2.Hibernate 的API Hibernate 框架基本组成是有Session、SessionFactory、Transaction、Query、Criteria 、Configuration等六个核心接口。下面就逐一对这几个接口说明下我自己的理解。 Session 接口Session 接口与持久层中java对象的持久化有关这个接口下的crud方法可以完成持久化。SessionFactory 接口这个会话工厂接口需要完成的工作就是读入Hibernate配置文件里的Sessionfactory内容构架出sessionfactory并且要完成对Hibernate进行初始赋值的任务。Configuration 接口Configuration这个接口主要在配置上有大用处当Hibernate框架开启的时候需要首先创建一个会话工厂对象这需要Hibernate框架需要调度Session接口和Sessionfactory接口完成对factory工厂类的构建然而这些都是需要configuration接口去完成一系列的操作的。Transaction 接口控制事物的接口是对数据的原子性一致性的保证。 5. Query 和 Criteria 接口这两个接口在Hibernate框架里扮演着和数据库打交道的角色和地位通过query或者criteria接口根据请求信息操纵数据库信息达到预料的目的同时他们也都对应着HQL和SQL的操作方式。 图2.4 Hibernate结构 StrutsStruts 概述 Struts 框架在开发中算是比较经典了特别是在结合了像MVC三层架构这样的观念思想后就更为大家所接受。Struts框架的简单原理就是这样的Struts预先就定义好了Controller也就是用于控制的控制器。首先就是去配置文件里面读取相关的配置信息要求值得注意的是该文件的名称可以struts-config.xml也可以用其他的形式命名。当用户的请求进入系统之后首先对用户所要提交的数据进行打包经过模型层和视图层的流转和相关处理进入数据库。值得一提的是各个层次之间相互分开都有各自的功能在理解层次上更清晰。Struts 框架可以这样说是更加紧密的把三层架构思想联系在一起。图 2-4 表现的Struts框架的各个组成部分具有相应的功能特点和各自的联系情况。 从视图角度View 站在视图的视野上也就是前台页面呈现的观点上JSP页面的形成得益于这个Struts 结构的tagLib等库的运用进来例如说Taglib标签库可以快速简单的调用标签然后去形成页面。 从模型角度Model 模型主要是表示一个系统业务规则的状态体现。 从控制器角度Controller 在理解中到的Struts框架语法里Controller层站在控制的角度上就是对的是业务逻辑的实现进行管制最主要也就是Action组件的控制由于Action组件是系统的逻辑业务的最终完成层和承担者例如ActionForword就定义了业务逻辑根据不同的需求进行流转。 图2.5 Struts三层图 Struts 工作流程 Struts框架的使用很广在大型前端应用程序的应用更为经典例如说web系统下面简单的说明下web应用程序的启动就要去Struts的配置文件里读取配置信息之后会把创建配置对象存放配置信息的内容而后加载和构建ActionServlet对象等配置对象执行如下流程步骤 ①首先判断ActionServlet是否存在。当不存在的时候返回的信息就应该为无效的这时候就有必要执行第二步。 ②当判断出ActionServlet不存在时就需要把客户提交的表单数据保存在另外一个对象里所以需要需要创建ActionFom对象。 ③对接收的表单数据按照配置信息所要求的进行规则验证。 ④验证成功的表现当执行完ActionForm.validate()方法后得到的结论有两种状况一种情况是返回空NULL另一种情况是不包括ActionMessage的ActionErrors 对象。 ⑤ActionServlet把请求信息转发给相应的Action层那么Action层的具体实例对象就可以调用exexcute()方法假定action的对象载体没有构建就需要立马构建一个。 ⑥ Action对象载体带有的方法调度完成后就会得出一个成果那么ActionServlet就会把这个结果转发给相应的JSP页面。 ⑦ JSP技术中带有的组件动态的生成页面展现出现。 2.2前端介绍 2.2.1JSP网页技术 JSP网页技术Java Server Page顾名思义是把Java代码嵌在服务页面的开发技术 。它的组成部分有Java代码html的语法规则Jsp标签。JSP的大致变化是这样的首先通过表单来获取用户数据并提交给系统系统再把结果返回通过JSP组件动态的创建页面显示。JSP页面的执行过程如图 图2.6 JSP页面的执行过程 客户端登录上浏览器上访问特定的网址由资源的路径信息的请求发出服务器接收请求并解析路径信息找到被请求的资源。找到资源后就开始加载JSP或和html页面文件。JSP文件在JSP组件的处理下被以Servlet代码保存。产生的servlet代码就可以进行编写译为Class代码文件。Class文件就是一被服务器的组件所识别然后执行。系统执行的结果会在被浏览器所展示。 2.3开发工具 软硬件环境需求 浏览器采用IE360GooGle。 系统JVM为JDK1.6或更高版本。 系统数据库使用MySql配合图形化界面HeidiSql 系统的集成幵发环境MyEclipse2012。 Web容器Tomcat7.0 系统的技术架构:Struts2.0Spring4.0Hibernate3.0 2.4本章小结 本章对完成论文的理论基础及需要的关键技术进行了论述系统决定使用的是的B/S 平台开发然后分别介绍了 SSH等框架和JSP前端技术。最后说明了完成该系统的软硬件要求。 系统分析 可行性分析 技术可行性 首先CRM客户关系管理系统的技术核心是SSH框架的使用和典型三层架构的层次模型的开发思想。简单的说说三层的明确职能和任务表现层与客户打交道中间层springHibernate框架的配合使用负责数据访问和接收表现层的功能请求最主要的技术就是能够将应用程序的java类与数据库的表结构对应设计的ORM映射能力。数据层就是实体对象的构建设计是最基础的层次。然后数据的流向是从web层service服务层action动作层dao数据访问层db数据库再把结果逐级往上提交。 采用流行的SSH框架提高了开发效率增加了系统的内聚性降低了耦合性方便以后程序的扩张。 经济可行性 对于销售型的中小企业来说以有限的资源和较少的成本去吸引和留住更多的客户。CRM 是解决这一问题的有效手段但不同于大型企业中小企业没有足够的时间和资金来构建功能完善、成熟高效的 CRM 系统。 相对于大型 CRM 系统来说本系统是一个功能精简的、具有实验性质的以满足企业日常客户关系管理的基础业务为目标的小型 CRM 系统按照软件工程的开发思想开发的周期包括需求分析数据库分析设计功能模块的实现测试和系统部署系统维护开发周期可以以月计算人力成本、硬件成本和开发成本等费用总计成本可以以万计算。无论是时间成本还是投入资金对企业都没有造成巨大的负担。与此相反当系统成功部署运行后不管是对公司企业还是对客户来说工作的时间和速度都相应的在改变提高了服务的质量意味着企业的效益在增加。 综上所述设计和实现CRM客户关系管理系统在经济上是完全可以接受的。 操作可行性 就企业而言很大程度上企业员工未使用过客户关系管理系统但得益于企业近些年的信息化建设几乎所有员工都能够运用办公自动化系统进行日常工作这使得员工快速掌握客户关系管理系统的操作成为可能。此外依照客户关系管理系统的体系构造和业务性能制定一份功能完善而且易于理解的“帮助文档”是极其必要的它有利于用户快速掌握系统的使用同时在界面实现阶段开发人员应在业务功能的操作界面上设置相应的操作提示便于用户理解系统功能使得用户能够准确地运用系统开展工作。 由此可以初步可见。客户关系管理系统的开发在操作上是可能的。 需求分析 系统总体需求 下图是客户关系管理系统的三个功能区可分为客户管理产品管理系统管理等模块。 图3.1 系统总用例图 上述的用例图是对CRM系统的总体功能需求进行描述而这些实例中又包括其他的子用例。 客户管理功能需求 正确登录的系统的用户能够对客户信息作出增加删除更新查询。功能需求如下图 图3.2 客户管理用例图 客户管理模块有一下部分构成 客户信息的增加能够录入客户可以指个人也可是集团客户这里指的是集团客户的信息例如公司名字地区等信息。客户信息的删除。客户信息的更新修改。客户信息的查询可以根据公司的名字所属省份等信息查询再数据库中保存的信息并显示出来。 表3-2 客户管理用例表 用例编号 UC01 用例名称 客户管理 用例概述 用户通过此管理客户信息 主参与者 用户 前置条件 正确登录系统 基本事件流 步骤 活动 A1 对客户信息增删改查 扩展事件流 1a 操作成功 1b 操作失败 产品管理功能需求 正确登录的系统的用户能够对产品信息作出增加删除更新查询。功能需求如下图 产品信息的增加能够录入产品名称规格价格等产品信息。产品信息的删除。产品信息的更新修改。产品信息的查询可以根据产品名字产品列表等信息查询再数据库中保存的信息并显示出来。 图3.3 产品管理用例图 产品管理用例表 用例编号 UC02 用例名称 产品管理 用例概述 用户通过此用例管理产品 主参与者 用户 前置条件 无 基本事件流 步骤 活动 A1 对产品信息增删改查 扩展事件流 1a 操作成功 1b 操作失败 系统管理功能需求 系统管理功能需求主要是对角色和权限进行管理。不同的角色拥有不同的权限。功能需求如下图 图3.4 系统管理用例图 角色的新增通过新建角色并对角色进行描述完成对角色的创建。修改权限对已有角色的权限进行变更。 角色管理用例表 用例编号 UC03 用例名称 角色管理 用例概述 用户通过此用例管理角色 主参与者 用户 前置条件 正确登录系统 基本事件流 步骤 活动 A1 对角色信息新增修改权限 扩展事件流 1a 操作成功 1b 操作失败 登录功能需求 下图为系统登录的流程图用户输入账号密码验证码等登录信息系统验证通过就可以登录成功进来系统的主界面进行各种操作。验证错误是就需要重新输入登录信息。下表为登录用例表。 图3.5 系统登录的流程图 登录用例表 用例编号 UC04 用例名称 系统登录 用例概述 用户通过此用例登录系统 主参与者 用户 前置条件 无 基本事件流 步骤 活动 A1 输入自己的用户名 A2 输入密码 A3 输入验证码 扩展事件流 1a 您输入账号或密码错误 1b 密码错误返回提示信息 1c 验证码错误 1d 用户名密码验证码为必填 总体功能模块 图3.6 总体层次图 其他需求 CRM系统的其他要求如下表所示 质量要求 主要质量属性 详细要求 正确性 根据系统的需要分析最后得到想要的页面表现结果。 健壮性 具有较好的容错能力和恢复能力。 性能效率 能对在用户请求发出后再较短时间内做出回应。 易用性 软件研发过程中形成的易理解的文档便于操作。 安全性 安全性就是系统在使用的时候可以对数量巨大的数据批改调用时保证数据不发生错误。 可扩展性 能够对软件进行相关功能的扩展或者提高相应的安全机制。 兼容性 不易与其他软件产生不兼容问题 本章小结 本章介绍了客户关系管理系统需求分析阶段的工作主要包括对系统的可行性、功能需求及用例的具体分析等内容。 数据库设计 数据库的存在意义就是存储数据根据需求分析就是客户信息和产品信息最明显的表现形式就是表结构的存在。然而设计数据库的初衷就是为应用程序提u供后台支持把代码和系统能分离出来良好的数据库设计有很多可以降低数据之间的冗余性,提高数据库的可维护性同时也能提高系统运行时的速度和系统的稳定性,实现数据之间的共享。可是根据系统的功能需求设计数据库并不是那么简单需要反复的分析功能需求逐步的研究和推敲出最为合理的数据库表把表和表之间的潜在的关系通过E-R图表现出来。 系统和数据的关系 图4.1 数据库与系统的管理 数据库结构设计 下图就是数据库表的设计的E-R图就是实体-联系图通过E-R图可以清楚的了解系统的表与表之间的结构关系从概念上反应数据库信息组成情况。 图4.2 数据库E-R逻辑 业务实体设计 业务实体在应用程序是实体对象的表现形式存在在后台数据库中存在的形式就是表和表之间的关系。那么业务实体的实现有下面的三个步骤 设计域模型创建域模型实体对象设计关系型数据模型创建对象、关系映射文件 设计域模型 生成一张客户关系记录需要上述的这些表。下面是详细的定义出这些数据库表字段的代表的意思 部门表hr_department部门信息的记载。主要的属性有部门主键id部门名称d_name上级分类IDparentid负责人d_employee电话d_telephone地址d_address邮箱d_email描述d_description。职务表hr_postion对职务信息的记载。属性有职务ID(ID)职务名称postion_name职务次序postion_order。岗位表hr_post岗位信息的描述。属性有岗位IDID岗位名称post_name岗位描述hr_descript。系统角色表sys_role记录的是角色的枚举值。属性有角色IDID角色名称rolename权限说明rolescript当前权限可以操作childmenus权限排序rolesort。员工表hr_employee员工信息的记录。属性有员工IDID用户名uid密码pwd姓名name身份证idcard生日birthday邮箱email性别sex电话telephone地址address备注remarks。省市表param_city作为省市参数的枚举表。属性有省市IDID上级IDparentID城市名称city。客户表crm_customer客户信息主要是集团客户的记录。主要的属性有客户表主键ID客户序列号serialnumber公司名称customer公司地址address公司电话tel公司网址site公司描述descript备注remarks。产品类别表crm_product_category记录产品的分类属性有客户类型主键ID父类型idparentId。产品信息表crm_product记录的是产品信息。属性有产品idproduct_id ,产品名称product_name产品规格specifications状态status单位unit备注remarks价格price。 上文和图4-2反应了各个表之间的关系。 数据库逻辑结构设计 部门类职务类客户类等这些对象都需要持久化这些类在数据库上都有对应的表结构产生意义对应的是部门表职务表客户表等设计出的数据库包含这些表。如下为各个表的建表语句以及表结构。 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) ) 部门表结构 hr_department 部门表 字段名 字段描述 数据类型 空/非空 默认值 约束条件 id 联系人编号 int false 主键 D_name 姓名 Varchar250 true null parentid 上级分类 Varchar250 true null D_employee 负责人 Varchar50 true null D_telephone 电话 Varchar50 true null D_address 地址 Varchar255 true null D_email 邮箱 Varchar(50) true null D_description 描述 Varchar250 true null D_order 部门次序 Varchar50 true null CREATE TABLE hr_position ( id int(8) NOT NULL AUTO_INCREMENT COMMENT 职务ID PK, position_name varchar(250) DEFAULT NULL COMMENT 名称, position_order varchar(50) DEFAULT NULL COMMENT 次序, PRIMARY KEY (id), ) 职务表结构 Hr_postion 职务表 字段名 字段描述 数据类型 空/非空 默认值 约束条件 id 职务编号 int false 主键 Postion_name 职务名称 Varchar250 true null Postion_order 职务次序 Varchr(50) true null 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) ) 岗位表结构 hr_post 岗位表 字段名 字段描述 数据类型 空/非空 默认值 约束条件 id 岗位编号 int false 主键 Post_name 名称 Varchar255 true null Postion_id 岗位职务 int true null 外键 Dep_id 岗位部门 int true null 外键 Post_descript 描述 longText true null 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) ) 角色表结构图 Sys_role 角色表 字段名 字段描述 数据类型 空/非空 默认值 约束条件 roleid 角色编号 int false 主键 rolename 名称 Varchar255 true null rolescript 角色描述 Varchar255 true null childmenus 地址 Varchar300 true null rolesort 次序 Char8 true null 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) ) 员工表结构 hr_rmployee 员工表 字段名 字段描述 数据类型 空/非空 默认值 约束条件 id 员工表id int false 主键 uid 用户名 Varchar50 true null pwd 密码 Varchar50 true null name 姓名 Varchar50 true null idcarde 身份证 Varchar50 true null birthday 生日 date true null Post_id 岗位id Int true null 外键 email 邮件 Varchar250 true null Sex 性别 Varcahr(50) True null telephone 电话 Varchar50 true null status 状态 Varchar true null entrydate 入职日期 date true null address 地址 Address255 true null remarks 备注 Varcahr255 true null education 学历 Varcahr50 true null roleid 角色id int true null 外键 professioonal 专业 Varcahr250 true null schools 毕业学校 Varcahr250 true null 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) ) 省市表结构 Param_city 省市表 字段名 字段描述 数据类型 空/非空 默认值 约束条件 id 省市编号 int false 主键 city 城市名 Varchar250 true null parentid 上级分类 int true null 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), ) 客户表结构图 Crm_customer 客户表 字段名 字段描述 数据类型 空/非空 默认值 约束条件 id 客户表编号 int false 主键 serilnumber 客户序号 Varchar250 True null customer 公司名称 Varchar250 True null address 地址 Varchar250 True null tel 电话 Varchar250 True null site 网址 Varchar250 True null Provinces_id 公司省份 Varchar(250) True null 外键 City_id 公司城市 Varchar250 True null 外键 descript 描述 Varchar250 True null remarks 备注 Varchar250 True null Employee_id 负责员工 Int8 True null 外键 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) ) 产品类别表结构 Crm_product_catrgory 产品类别表 字段名 字段描述 数据类型 空/非空 默认值 约束条件 id 产品类别id int false 主键 Product_category 类别名 Varchar250 true null parentid 上级分类 int true null 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) ) 产品信息表结构 hr_product 产品信息表 字段名 字段描述 数据类型 空/非空 默认值 约束条件 id 产品id int false 主键 Category_id 类别id int true null 外键 Product_name 名称 Varchar100 true null specifications 规格 Varchar250 true null Status 状态 Varchar250 true null unit 单位 date true null remarks 备注 longtext true null price 价格 double true null 本章小结 这一章介绍了根据业务需求设计数据库的相关表和表与表之间的关系以及给出了建表语句。 系统的详细设计和实现 根据上文的功能分析和数据库的分析在系统的实现阶段上采用当今开源的SSHStrutsHibernateSpring整合框架实现。其目的是降低个模块间的耦合度使各个模块之间的功能相互独立、模块内部结构清晰。 系统架构如图所示。整个系统是有多个层次的数据流动的顺序是从浏览器到数据库再从数据库到浏览器中间经过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; 创建关系映射与数据库的连接 在web-inf下的application-contex。Xml配置文件里定义了连接数据库的数据源通过数据源可以将类和数据库中的表进行关联。 bean iddataSource classorg.apache.commons.dbcp.BasicDataSource property namedriverClassName valuecom.mysql.jdbc.Driver /property property nameurl valuejdbc:mysql://127.0.0.1:3306/mycrmdb /property property nameusername valueroot/property property namepassword value123456/property /bean 在定义过程中数据库的url为jdbc:mysql://127.0.0.1:3306/mycrmdb用户名为root数据库密码是123456驱动类为com.mysql.jdbc.driver。 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 namecom.crm.info.CrmCustomer tablecrm_customer catalogmycrmdb//mycrmdb数据库下表crm_customer和CrmCustomer对象对应 id nameid typejava.lang.Integer column nameid / //主键id的类型是int类型 generator classnative / /id many-to-one namehrEmployeeByEmployeeId classcom.crm.info.HrEmployee fetchselect column nameemployee_id comment负责员工ID FK/comment /column /many-to-one//使用了外键 property namecustomer typejava.lang.String column namecustomer length250 comment公司名称/comment /column /property// 一般的属性定义映射 class标签中name属性表示的是持久层类的java全限定名table属性代表的意思是所使用的数据库表名。Catalog属性表现为使用的数据库的名字。id标签中name为实体类属性的名称type是属性的类型column的name定义该实体类对应数据库表的字段名字。generator的class属性表示数据库表之间的关联生产对策。 由此可见实体类和数据库中的表名在配置文件中都有明确的逐个对应Hibernate会根据映射文件将实体类转化为数据库表或者将数据库字段转换为实体类。 在Hibernate中就有映射配置是这样的 bean idsessionFactory classorg.springframework.orm.hibernate3.LocalSessionFactoryBean property namedataSource ref beandataSource / /property property namehibernateProperties props prop keyhibernate.dialect org.hibernate.dialect.MySQLDialect /prop /props /property property namemappingResources list valuecom/crm/info/ParamSysparamType.hbm.xml/value valuecom/crm/info/SysMenu.hbm.xml/value valuecom/crm/info/ParamCity.hbm.xml/value valuecom/crm/info/PersonalEvent.hbm.xml/value valuecom/crm/info/MailAttachment.hbm.xml/value valuecom/crm/info/CrmProductCategory.hbm.xml/value valuecom/crm/info/HrPost.hbm.xml/value valuecom/crm/info/HrDepartment.hbm.xml/value valuecom/crm/info/HrPosition.hbm.xml/value valuecom/crm/info/PersonalNotes.hbm.xml/value valuecom/crm/info/CrmProduct.hbm.xml/value valuecom/crm/info/CrmCustomer.hbm.xml/value valuecom/crm/info/PersonalChat.hbm.xml/value valuecom/crm/info/CrmContact.hbm.xml/value valuecom/crm/info/ParamSysparam.hbm.xml/value valuecom/crm/info/PersonalCalendar.hbm.xml/value valuecom/crm/info/SysLogin.hbm.xml/value valuecom/crm/info/CrmOrder.hbm.xml/value valuecom/crm/info/CrmFollow.hbm.xml/value valuecom/crm/info/CrmContract.hbm.xml/value valuecom/crm/info/PublicNotice.hbm.xml/value valuecom/crm/info/MailFlow.hbm.xml/value valuecom/crm/info/PublicNews.hbm.xml/value valuecom/crm/info/HrEmployee.hbm.xml/value valuecom/crm/info/CrmOrderDetails.hbm.xml/value valuecom/crm/info/CrmInvoice.hbm.xml/value valuecom/crm/info/CrmReceive.hbm.xml/value valuecom/crm/info/SysRole.hbm.xml/value valuecom/crm/info/PublicChatRoom.hbm.xml/value valuecom/crm/info/SysApp.hbm.xml/value/list /property /bean Struts的配置文件 Struts.xml文件的作用主要是对到来自JSP的请求的接收和跳转分配的作用该struts的核心配置文件如下 package namemyapp namespace/ extendsstruts-default global-results result nameerror typeredirect/login.jsp/result result nameajax/ajax.jsp/result /global-results action namehr_emp classhrEmployeeAction result namelogin typeredirect/index.jsp/result result nameloginerr/login.jsp/result /action /package constant namestruts.ui.theme valuesimple/constant constant namestruts.multipart.maxSize value5242880/constant include filecom/crm/struts/crm-struts.xml/include include filecom/crm/struts/hr-struts.xml/include include filecom/crm/struts/mail-struts.xml/include include filecom/crm/struts/param-struts.xml/include include filecom/crm/struts/personal-struts.xml/include include filecom/crm/struts/public-struts.xml/include include filecom/crm/struts/sys-struts.xml/include Spring 的配置文件 Spring框架的中心配置文件就是Web.xml文件里根据自己的需要填写了一些注解文件。利用spring的注解方式进行实例化action和dao层。 filter filter-namestruts2/filter-name filter-classorg.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter/filter-class /filter filter filter-nameos/filter-name filter-classorg.springframework.orm.hibernate3.support.OpenSessionInViewFilter/filter-class /filter filter-mapping filter-nameos/filter-name url-pattern/*/url-pattern /filter-mapping filter-mapping filter-namestruts2/filter-name url-pattern/*/url-pattern /filter-mapping listener listener-classorg.springframework.web.context.ContextLoaderListener/listener-class /listener welcome-file-list welcome-filelogin.jsp/welcome-file /welcome-file-list login-config auth-methodBASIC/auth-method /login-config /web-app DAO层设计 DAO层原文翻译是Data Access Object从字面上理解的意思是数据访问对象层次dao的使用目的就是定义出与数据操作方法有关的逻辑代码例如增删改查这样的操作。 按照DAO的设计规则DAO层里面必须要有操作数据的方法在com.crm.dao包下存放所有的dao层对象。首要的是通过继承Hibernate框架下的HibernateDaoSupport这个支持类的setSessionFactory()方法并通过Spring的注解进行依赖注入然后执行getHibernateTemolate()方法得到Hibernate框架的模板类数据使得执行的速度加快了方便了开发者。 CrmCustomerDao.java的重要代码。 public ListCrmCustomer findAllByWhere(CrmCustomeVobj cy) { if (cy null) { return findAll(); } Criteria c createCriter(this.getSession(), cy); return c.add(Restrictions.eq(isdelete, 1)).list(); } 逻辑业务层设计 逻辑业务层是应用程序的业务中心所在接收从表现层传来的数据经过逻辑业务层的处理由持久层存储下来。 业务逻辑类的实现 业务逻辑类的实现是业务逻辑层向上层提供服务的业务实现。只专注于具体的业务逻辑满足客户多样化的需求。同时业务逻辑层需要持久层的实例来调用持久层的服务而持久层的实例可以通过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; } } 表现层设计 表现层是面对面和用户交互的最外表的一层接受用户数据提交给模型进行处理然后模型把结果回馈给用户。贯穿这个层次的是Struts framework。 模型层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-classtrue aop:pointcut expressionexecution(* com.crm.biz.*.*(..)) idpc/ aop:advisor advice-refadv pointcut-refpc/ /aop:config 视图层V 通过Struts的标签和jsp等进行实现的。这个界面直接面对用户更直接影响用户对该系统的第一感觉所以说这一层设计和重要。如模型层的代码如果客户信息添加成功了就会回crm_cus_list.jsp上。 控制层C 控制层是是连接视图和模型的关键两个分离的模块因为控制层而整合在一起使代码更容易维护。用户请求经过控制层的处理然后把请求提交给对应的模型层处理。 action namecrm_cust classcom.crm.action.CrmCustomerAction resultcrm_cus_list.jsp/result result nametoupdatecrm_cus_update.jsp/result result nameadd typeredirectActioncrm_cust/result result nameupdate typeredirectActioncrm_cust/result result namedelete typeredirectActioncrm_cust/result result nametrash/pages_sys/trash_cus_list.jsp/result /action 系统主要功能模块的实现 登录功能的实现 登录功能所需的界面如图 图5.6 系统登录界面 前端JSP代码如下 form classform-vertical login-form actionhr_emp!login methodpost h3 classform-title styletext-align: center;CRM管理系统登录/h3 div classalert alert-error hide button classclose data-dismissalert/button span请输入您的用户名和密码./span /div div classcontrol-group !--ie8, ie9 does not support html5 placeholder, so we just show field title for that-- label classcontrol-label visible-ie8 visible-ie9用户名/label div classcontrols div classinput-icon left i classicon-user/i input classm-wrap placeholder-no-fix typetext placeholder用户名 namename/ /div /div /div div classcontrol-group label classcontrol-label visible-ie8 visible-ie9密码/label div classcontrols div classinput-icon left i classicon-lock/i input classm-wrap placeholder-no-fix typepassword placeholder密码 namepwd/ /div /div /div div classcontrol-group label classcontrol-label visible-ie8 visible-ie9验证码/label div classcontrols div classinput-icon left i classicon-tag/i input classm-wrap placeholder-no-fix typetext placeholder验证码 nameinpcode stylewidth:100px;/ iframe src%basePath%hr_emp!ajaxValidateCode idiframecode styleheight:34px; width:85px; margin: 0px; frameborder0 scrollingno /iframe div stylefloat: right; a href# idshowcode classbtn blue stylewidth: 28px; height: 20px;i classicon-refresh stylemargin:2px 8px;/i/a /div /div /div /div div classform-actions button typesubmit classbtn blue pull-right 登录 i classm-icon-swapright m-icon-white/i /button /div 用户输入的账号密码验证码通过文本框的post方式提交给hr_strutshr_rmp!login下action类。 action namehr_emp classcom.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); ListSysMenuVobj 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.11客户管理时序图 前台JSP div classportlet-body form form actioncrm_cust!add methodpost classform-horizontal idsubmit_form div classform-wizard div classnavbar steps div classnavbar-inner ul classrow-fluid li classspan3 a href#tab1 data-toggletab classstep active span classnumber1/span span classdesci classicon-ok/i公司信息/span /a /li li classspan3 a href#tab2 data-toggletab classstep span classnumber2/span span classdesci classicon-ok/i 主联系人/span /a /li li classspan3 a href#tab3 data-toggletab classstep span classnumber3/span span classdesci classicon-ok/i 其他/span /a /li li classspan3 a href#tab4 data-toggletab classstep span classnumber4/span span classdesci classicon-ok/i 确认完成/span /a /li /ul /div /div 用户经过填入相关的客户信息通过post方法把表单提交到crm_cust上 action namecrm_cust classcom.crm.action.CrmCustomerAction result nameadd typeredirectActioncrm_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 客户信息增加界面 本章小结 这一章对系统的详细设计做了一个介绍结合代码和ssh进行整合对登录和客户信息添加模块模块做了详细的介绍。 系统测试 系统测试综述 测试的目标有 测试系统登录测试系统能正确添加客户信息 测试用例 用户登录模块 用户登录 功能测试 概述 测试编号 Test01 功能描述 用户登录 功能URL 用例目的 测试用户是否能登录成功 前提条件 测试操作 编号 输入/动作 期望的输出响应 实际情况 是否正确 错误编号 1 输入不存在的账号名不填写密码输入验证码 请输入您的账号名和密码 请输入您的账号和密码 正确 2 输入正确的账号名输入错误的密码,输入验证码 系统提示账号名或密码错误 系统提示账号名或密码错误 正确 3 输入错误的账号名输入正确的密码输入验证码 系统提示账号名或密码错误 系统提示账号或密码错误 正确 4 不填写用户名及密码 请输入您的账号和密码 请输入您的账号和密码 正确 5 输入正确的用户名和密码不输入验证码 验证码必填 验证码必填 正确 6 输入正确的账号和密码输入验证码 成功登陆 成功登陆 正确 7 输入正确的账号和密码错误的验证码 输入的验证码错误 您输入的验证码错误 正确 用户登录用例信息 表6-1 登录用例数据 测试内容 测试信息 账号 admin 密码 123 进入主界面登录成功。 添加客户信息 添加客户信息用例 功能测试 概述 测试编号 Test02 功能描述 添加客户信息 功能URL 用例目的 测试是否能添加客户信息 前提条件 正确进入用户登录界面 测试操作 编号 输入/动作 期望的输出响应 实际情况 是否正确 错误编号 1 输入数据并提交 能显示出已经提交的数据 显示提交的数据 正确 进入客户列表测试新增客户功能。 测试用例 表 6-3 添加信息数据 测试内容 测试添加客户信息 公司名称 中国亚信上海分公司 公司网址 www.asiainfo.com 公司电话 13641928647 公司地址 上海市徐汇区漕河泾开发区 所属省市 上海徐汇区 行业 其他 联系人 费新文 联系人电话 18779117396 联系人手机 18779117396 性别 男 联系人邮箱 2376166307qq.com 联系人爱好 电子竞技 联系人部门职务 维护部经理 联系人qq 2376166307 联系人地址 上海九亭 联系人备注 很强 公司客户类型 已成交A 公司归属业务员 信息部 公司来源 电话 公司序号 123 公司备注 哈哈 公司状态 公客 提交和能成功的显示在页面上测试案例成功。 本章小结 这一章通过对CRM客户关系管理系统的两个小功能进行的测试通过测试用例成功的将所需要的功能目的展现出来。 总结和展望未来 结论
CRM系统是一个具有新思维的管理机制,通过CRM软件希望能够改变企业和客户之间的传统联系达到有效的管理和利用企业的客户资源的目标提高企
业对客户的服务水平促进市场竞争力的形成为公司和企业带来财富和效益CRM客户关系管理系统的研究具备重要的理论目的和实践性。
本课题研究的是是基于java这门语言通过SSH框架结合使用实现的CRM企业客户关系管理系统。主要学到知识有:
对Struts、Spring、Hibernate三个framework有了初步的使用了解。特别是整合三优秀框架进行开发。熟悉三层架构有利于系统的维护。能有效的利用测试原理对系统功能进行测试。对jsp有一定的理解。在整个系统中运用到UML统一建模语言对系统的功能模型、对象模型进行设计并根据系统的需求设计系统功能。在思考如何写入CRM系统代码时需要严谨的逻辑思维严格的要求这篇论文在 MVC三层架构的基础上采用 J2EE成熟的SSH 框架实现系统的开发。这种开发模式能快速的建立数据库与应用程序之间的联系同时提高数据的安全性与系统的二次开发性、可重用性等性能。在系统的实现阶段中应用了组件很大程度的加强代码的使用效率提高了开发效率减少了维护工作。
系统的不足 CRM是一个全新的领域由于缺少开发经验许多问题都未考虑周全
对需求的分析不够。Dao层Action层没有采用接口可能会导致耦合性能不够好。 展望未来
我的期望就是对Struts理解加深对它的标签库进行使用在jsp实现view中只是用到了基础的页面请求和转发的方法。这需要长时间去积累。还有就是逐步去完善这个系统。 参考文献
[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