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

目录

第五章 系统的详细设计与实现

5.1 持久层设计

5.1.1 创建关系映射

5.1.2 与数据库的连接

5.1.3 Hibernate的ORM映射 

5.1.4 Struts的配置文件

5.1.5 Spring 的配置文件

5.1.6 DAO层设计

5.2 逻辑业务层设计

5.2.1 业务逻辑类的实现


前面内容请移步

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

资源+毕业设计+毕业论文+源代码请移步

CRM客户关系管理系统+毕业论文+毕业设计+源代码

第五章 系统的详细设计与实现

        根据上文的功能分析和数据库的分析,在系统的实现阶段上采用当今开源的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>// 一般的属性定义映射

        <class>标签中name属性表示的是持久层类的java全限定名,table属性代表的意思是所使用的数据库表名。Catalog属性表现为使用的数据库的名字。<id>标签中name为实体类属性的名称,type是属性的类型,<column>的name定义该实体类对应数据库表的字段名字。<generator>的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;

}

} 

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

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

相关文章

Jmeter干货分享:当你的Log viewer不显示日志时,可能是引入的Jar包冲突导致

问题描述 近期使用Jmeter时发现了一个非常奇怪的问题&#xff0c;就是Jmeter是可以正常使用运行脚本&#xff0c;但是在Log viewer中确没有任何日志&#xff0c;如下图&#xff1a; 问题排查过程 真是百思不得其解啊&#xff0c;在网上各种获取资料&#xff0c;大多数都是说跟…

001----flask

flask---001 flask与django对比今日概要问答今日详细1.flask快速使用1.2 快速使用flask1.3 用户名密码登录 flask与django对比 django是个大而全的框架&#xff0c;flask是一个轻量级的框架。 django内部为我们提供了非常多的组件&#xff1a;orm/session/cookie/admin/from/mo…

【学习】企业如何选择一个合适的DCMM咨询机构

DCMM是我国首个数据管理领域正式发布的国家标准。旨在帮助企业利用先进的数据管理理念和方法&#xff0c;建立和评价自身数据管理能力&#xff0c;持续完善数据管理组织、程序和制度&#xff0c;充分发挥数据在促进企业向信息化、数字化、智能化发展方面的价值。该标准借鉴了国…

Python学习从0开始——Kaggle机器学习003总结

Python学习从0开始——Kaggle机器学习003总结 一、加载及浏览数据二、机器学习模型三、模型验证四、欠拟合和过拟合五、随机森林 一、加载及浏览数据 # 路径 melbourne_file_path ../input/melbourne-housing-snapshot/melb_data.csv # 读取 melbourne_data pd.read_csv(mel…

为什么大家都要考CDA数据分析师认证

为什么学习数据分析&#xff1f; 2024年&#xff0c;是一个被数据影响的时代。数据&#xff0c;如同无形的燃料&#xff0c;驱动着现代社会的运转。从全球互联网的用户每天产生的2.5亿TB数据&#xff0c;到制造业的传感器、金融交易、医疗病历等领域的海量信息&#xff0c;数据…

排序算法——归并排序以及非递归实现

一、归并排序思想 归并排序&#xff08;MERGE-SORT&#xff09;是建立在归并操作上的一种有效的排序算法,该算法是采用分治法&#xff08;Divide andConquer&#xff09;的一个非常典型的应用。将已有序的子序列合并&#xff0c;得到完全有序的序列&#xff1b;即先使每个子序列…

使用Python绘制瀑布图

使用Python绘制瀑布图 瀑布图效果代码 瀑布图 瀑布图&#xff08;Waterfall Chart&#xff09;是一种数据可视化工具&#xff0c;用于展示累积数值的变化&#xff0c;尤其适合于展示随时间或过程中的增减变化。它通常用于财务分析&#xff0c;如展示收入、支出和净利润的变化过…

分离式光电液位传感器与浮球开关相比具有哪些优势

分离式光电液位传感器与浮球开关相比有哪些优势&#xff1f;分离式光电液位传感器依据光学原理&#xff0c;在传统光学传感器的基础上进行了改进。其特点是将光学组件分离出来&#xff0c;置于水箱外部感应&#xff0c;而传感器本身则独立于水箱外。这种设计有效解决了浮球开关…

CPU内部结构窥探·「1」

CPU内部逻辑运算单元是如何运行的 引言 中央处理器&#xff08;CPU&#xff09;是计算机的大脑&#xff0c;负责处理各种计算任务。在CPU里面&#xff0c;有一个重要的部分叫做逻辑运算单元&#xff08;ALU&#xff0c;Arithmetic Logic Unit&#xff09;。ALU就像一个超级计…

JS面试题:hash和history的区别

一、hash 模式和 history 模式的介绍 由于 Vue 项目为单页面应用&#xff0c;所以整个项目在开发和构建过程中&#xff0c;仅存在一个HTML物理文件。通过路由系统可以实现将项目的组件与可访问的URL路径进行绑定。由于Vue项目只有一个HTML物理文件&#xff0c;切换页面时既需要…

vivado BD_INTF_NET、BD_INTF_PIN

BD_INTF_NET 描述 接口是一组信号&#xff0c;它们共享一个共同的功能&#xff0c;同时包含 单个信号和多条总线。例如&#xff0c;AXI4Lite主机包含一个 单个信号的数量加上多条总线&#xff0c;这些都是制作 联系通过将这些信号和总线分组到一个接口中&#xff0c;Vivado IP积…

VisualStudio中:如果某个项目不显示SVN的show log等,而其他项目都正常

VisualStudio中&#xff1a;如果某个项目不显示SVN的show log等&#xff0c;而其他项目都正常。说明大概率是当前项目的问题&#xff0c;而不是VisualStudio的问题&#xff01; 1.这个项目内有一个“隐藏”文件夹.svn 》先删除&#xff01; 2.如果外层文件夹有红色感叹号&…

英伟达剧透新一代最强 GPU;奥特曼公开回应 AI 语音争议丨 RTE 开发者日报 Vol.217

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」&#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE&#xff08;Real-Time Engagement&#xff09; 领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「…

重学java 59.Properties属性集集合嵌套集合下总结

不要咀嚼小小悲观&#xff0c;而忘掉整个世界 —— 24.6.3 一、Properties集合&#xff08;属性集&#xff09; 1.概述 Properties 继承 于HashTable 2.特点 a、key唯一&#xff0c;value可重复 b、无序 c、无索引 d、线程安全 e、不能存null键&#xff0c;null值 f、Propertie…

idea项目maven下载依赖报错

报错&#xff1a; 1、Failure to find bad.robot:simple-excel:jar:1.0 in https://maven.aliyun.com/repository/public was cached in the local repository, resolution will not be reattempted until the update interval of aliyunmaven has elapsed or updates are forc…

小程序集arcgis地图显示自定义坐标的功能实现记录!(学习笔记)

最近再做一个新能源回收项目&#xff0c;项目中有个根据回收点坐标数据显示区域内回收点位置&#xff0c;点击图标直接导航到该位置&#xff0c;及分布的需求&#xff0c;研究了一下&#xff0c;实现效果如下&#xff0c;实现起来很简单&#xff0c;代码及效果 回收点位置及分…

Linux - 逻辑卷的创建和管理

1.逻辑卷LVM的创建 1.1 创建步骤 ①添加硬盘或者创建分区 ②创建物理卷 pvcreate ③创建卷组 vgcreate ④创建逻辑卷 lvcreate ⑤创建文件系统 mkfs.xfs/ect4/... ⑥创建挂…

随身wifi哪个牌子的最好用?网速最快的随身wifi推荐测评,随身wifi罗永浩推荐!

现在很多人都开始使用随身WiFi&#xff0c;因为互联网发达&#xff0c;看视频、刷抖音、看直播等等都需要流量&#xff0c;手机流量不够用&#xff0c;流量需求也很高。因此随身WiFi逐渐出现在人们的视野中&#xff0c;在众多品牌中一款名为格行的随身wifi被各明星和千万网红争…

Docker基础篇之本地镜像发布到阿里云

文章目录 1. 本地镜像发布到阿里云的流程2. 阿里云开发平台3. 将自己的本地镜像推送到阿里云 1. 本地镜像发布到阿里云的流程 阿里云ECS Docker生态如下图所示&#xff1a; 2. 阿里云开发平台 在控制台找到容器和镜像服务&#xff1a; 然后创建一个个人实例&#xff1a; 下面…

HW面试常见知识点2——研判分析(蓝队中级版)

&#x1f340;文章简介&#xff1a;又到了一年一度的HW时刻&#xff0c;本文写给新手想快速进阶HW蓝中的网安爱好者们&#xff0c; 通读熟练掌握本文面试定个蓝中还是没问题的&#xff01;大家也要灵活随机应变&#xff0c;不要太刻板的回答&#xff09; &#x1f341;个人主页…