CRM技术架构
视图层:view
展示数据,与用户交互
html,css,js,jquery,ajax,jsp,bootstrap
控制层:controller
接收参数,封装参数,接收请求,根据请求调用业务层的方法处理业务,根据处理结果,返回响应数据。
业务层:Service
处理业务逻辑,以及操作的原子性。
持久层:Dao,Mapper
操作数据库
整合层:spring(IOC,AOP)
维护类资源,维护数据库资源
CRM核心业务
CRM项目的核心业务:
系统管理功能:不是直接处理业务数据,为了保证业务管理的功能正常安全运行而设计的功能。
用户登录,安全退出,登录验证等
给超级管理员,开发和运维人员使用。
业务管理功能:处理业务数据
市场活动:市场部,设计市场活动营销活动
线索:销售部(初级销售),增加线索
客户和联系人:销售部(高级销售),有效地区分和跟踪客户和联系人.
交易:销售部(高级销售),更好地区分和统计交易的各个阶段。
售后回访:客服部,妥善安排售后回访。主动提醒。
统计图表:管理层,统计交易表中各个阶段数据量。
分析与设计: 物理模型设计
表结构:
1)主键字段:能够唯一标识一条记录的一组字段。
主键的选择需要具备唯一性,不可为空,稳定性。
稳定性是指主键的值应该是稳定不变的,不会随着时间或者环境的变化而发生改变。
因此我们选择的主键一般是与业务逻含义无关的字段。
2)外键字段:用来确定表与表的关系
表与表的关系:
一对多
一个班级可以有多个学生,而一个学生只属于一个班级
主表:班级 子表:学生
tbl_student (子表) tbl_class(主表)
id name class_id id name
1001 zs 111 111 class1
1002 ls 111 222 class2
1003 ww 222
1004 zl
在子表中添加主表的主键作为子表的外键。
添加数据时,先添加父表记录,再添加子表记录;
删除数据时,先删除子表记录,再删除父表记录;
查询数据时,可能会进行关联查询:
注意在查询的时候主从表不是固定的,并不是根据表的关系决定的,而是根据具体情况灵活决定,以便达到更好的查询效果
如
//查询所有姓张的学生的id,name和所在班级name
select s.id,s.name,c.name as className
from tbl_student s
join tbl_class c on s.class_id=c.id//假如外键不可以为空
where s.name like ‘z%’
在这里,student表是主表,班级表是从表,与表的关系无关。
一对一
一张表(A)中的一条记录只能对应另一张表(B)中的一条记录;
多对多
一张表(A)中的一条记录可以对应另一张表(B)中的多条记录;
另一张表(B)中的一条记录也可以对应一张表(A)中的多条记录。
一堂课可以被多个学生选,一个学生可以选多个课。
tbl_student tbl_course
id name id name
1001 zs 111 java
1002 ls 222 mysql
tbl_student_course_relation
student_id course_id
1001 111
1001 222
1002 111
1002 222
多对多表的关系,需要一张额外的关系表。
内连接和外连接
选择使用内连接还是外连接,以及左外连接和右外连接,取决于具体的需求和查询的表之间的关系。以下是一些常见的情况和建议:
- 内连接:查询所有符合条件的数据,并且要求结果在两张表中都有相对应的记录
- 左外连接:查询左侧表中所有符合条件的数据,即使在右侧表中没有相对应的记录。比如查询学生表中的所有学生和选课表中已选课的学生,包括未选课的学生信息。
- 右外连接:查询右侧表中所有符合条件的数据,即使在左侧表中没有相对应的记录。比如查询选课表中的所有选课记录和学生表中已选课的学生信息,包括未选课的学生信息。
- 全外连接:当需要查询两个表中所有数据时使用全外连接。但需要注意的是,某些数据库不支持全外连接,需要通过联合查询实现。
- 总的来说,使用内连接可以提高查询效率,而使用外连接则可以保留所有的数据,包括未匹配的数据。当需要查询的数据涉及到“缺失数据”时,可以考虑使用外连接。但是需要注意,使用外连接时可能会产生大量的冗余数据,需要在开发中谨慎使用,并且需要通过一些手段进行数据去重和整理。
如果外键不能为空,优先使用内连接;
如果外键可以为空,
–假如只需要查询那些在另一张表中有相对应的记录,使用内连接
–假如需要查询左侧表中所有符合条件的记录,使用左外连接.
因为内连接只返回两个表中都满足连接条件的数据,不存在不匹配的情况。同时,如果外键约束不允许为空,也说明这个外键是非常重要的,并且一定与某个主键或唯一键相关联。这时,内连接性能更高,同时可以排除没有关联数据的无效数据,更精准地满足查询需要。
有关日期和时间
给关于日期和时间的字段:
都按照字符串处理:
char(10) yyyy-MM-dd
char(19) yyyy-MM-dd HH:mm:ss
怎么限定客户写入的日期是按格式的?使用bootstrap框架的时间选择器,不许他们输入,这样我们存入数据库的数据格式就一致了。
项目结构
src
main
java
com.wll.crm
commons 公共类,方法,常量
workbench 工作区的Service,Controller,Mapper,doMain
settings 系统管理区的Service,Controller,Mapper,doMain
web 输入网址从首页进入登录页面
resources
applicationContext spring配置
applicationContextDispatcher springmvc配置
applicationContext-database mybatis配置
mybatis-config.xml 包名,类名起别名
jdbc.properties 连接数据库
mapper的xml文件 写sql语句
webapps
|->.css,.js,.img (图片等静态资源不需要被保护,因为黑客无法通过图片对我们的数据进行破坏)
|->WEB-INF
|->受保护的jsp
|->web.xml
|->classes
|->lib
|->pages test.jsp,index.jsp
pom.xml
最后idea会把编译后的/main/java|resources目录下的class文件都放到WEB-INF/classes目录下
把pom.xml中的依赖中的jar包都会放到WEB-INF/lib目录中
jsp文件经过服务器最终解析是.html文件。
先做什么功能?
先做系统功能,系统功能是用于维护的,业务功能需要用到系统功能所产生的数据,没有系统功能,无法做业务功能。
系统功能如首页,登录退出等。先做被依赖的功能,必须先登录才能进入主页,因此先做登录页面。