CRM项目开发【准备篇】
(参考B站视频CRM项目)
01-基本技术框架
-
视图层(View):展示数据,负责跟用户交互
html
,css
,js
,jquery
,bootstrap
-
控制层(Controller):控制业务处理流程,(接收请求,接收参数,封装参数;根据不同的请求调用业务层处理业务;根据处理结果,返回响应信息)
Servlet
、SpringMVC
-
业务层(Service):处理业务逻辑(处理业务的步骤以及操作的原子性)
Spring
、JavaSE
-
持久层(Dao):操作数据库
MyBatis
02-项目开发流程
-
招标
甲方、乙方、标书
-
可行性分析——可行性分析报告
-
需求分析——需求文档
产品经理:需求调研
项目原型:主要是静态网页,方便确定需求
-
分析与设计
-
架构设计——架构文档(架构师)
物理架构设计:如应用服务器、数据库服务器的设计
逻辑架构设计:代码分层(视图层–控制层–业务层–持久层–数据库)
-
项目设计——项目设计文档(项目经理)
物理模型设计:表、字段、关系
逻辑模型设计:类、属性、方法、返回值和参数、类之间的关系
界面设计:企业级应用一般要求朴素、互联网应用一般要求炫酷一些
算法设计:算法设计文档
-
-
搭建开发环境——技术架构文档
-
编码实现(程序员编码常在的阶段)
-
测试(程序员编码常在的阶段)
-
试运行——使用手册
-
上线—实施时文档
-
运维——运维手册(国内软件能用到5年的就已经很不错了,运维基本上留个2年就挺好了)
-
文档编纂
该流程贯穿于上述过程之中,包括标书、可行性分析报告、需求文档、架构文档、项目设计文档、算法设计文档、技术架构文档、使用手册、实施文档、运维手册
03-项目核心业务
-
CRM项目的简介:
Customer Relationship Management
客户关系管理系统
企业级应用,传统应用;给销售或者贸易型公司使用,在市场、销售、服务等各个环节中维护客户关系。
CRM项目的宗旨:增加新客户,留住老客户,把已有客户转化为忠诚客户。- 传统应用相对的就是互联网应用。
-
CRM是一类项目,我们的CRM是给一个大型的进出口贸易公司来使用的,做大宗商品的进出口贸易;商品是受国家管制的。
-
CRM项目的核心业务:
-
系统管理功能:不是直接处理业务数据,为了保证业务管理的功能正常安全运行而设计的功能。
比如:用户登录、安全退出、登录验证等,给超级管理员,开发和运维人员使用。
-
业务管理功能:处理业务数据
- 市场活动:市场部,设计市场活动营销活动
- 线索:销售部(初级销售),增加线索
- 客户和联系人:销售部(高级销售),有效地区分和跟踪客户和联系人
- 交易:销售部(高级销售),更好地区分和统计交易的各个阶段。
- 售后回访:客服部,妥善安排售后回访。主动提醒。
- 统计图表:管理层,统计交易表中各个阶段数据量。
-
04-主键id
的生成方式
- 分布式
id
:在数据量不大的时候,单库单表完全可以支撑现有业务,数据量再大一点搞个MySql主从同步也可以。数据量增长,到后期,需要进行分库分表,显然,这个时候需要一个全局唯一ID,而这个订单号就是分布式ID。- 需要满足的条件:全局唯一、高可用、高性能、简单可用
- 方案:
算法 优点 缺点 UUID/GUID 容易实现、ID唯一、无需中心化服务器、不会泄露机密 可读性差、占用空间过多、影响数据库性能 数据库递增 容易产生、可读性好、存储空间小 需要中心化的服务器、ID暴露不安全、需要访问数据库获取 id
随机数 可以有可读性、存储空间小、随机且安全 需要中心化的服务、需要两步操作 随机字符串 短、可读性高、随机且安全 ID可能不唯一 雪花算法 存储少、可读性高、性能好 时间回拨会出问题、ID生成有一定规律不安全 MongoDB的ID 可读性高、性能好 占用存储过多、时间回拨有问题、ID生成有规律
-
数据库自增
利用数据库主键可以设定为自增的特点来设置对应表的
id
字段。【缺陷】运行效率低、并发场景表现很差
【优势】开发容易
-
hilo
算法转载自HILO
private class HiloOptimizer { private String prefix; private int maxLo; private int lo; private long hi; private long lastValue; public HiloOptimizer(String prefix, int maxLo) { this.prefix = prefix != null ? prefix.replace("{", "${") : ""; this.maxLo = maxLo; //最大低位 this.lo = maxLo + 1; //最低初始位 } public synchronized String generate() { if (lo > maxLo) { //当低位超过最大高位 lastValue = getLastValue(); //表示hi位的进位次数,从数据库id管理表获取 lo = lastValue == 0 ? 1 : 0; //低位归0 hi = lastValue * (maxLo + 1); //高位进位 } return String.valueOf(hi + lo++); //低位最后自增lo++ } }
为了避免每次的生成都从数据库中查询,开发了该算法,不使用
synchronized
也能产生不重复的序号。基本公式:
h i ∗ ( m a x l o + 1 ) + l o hi * (max_lo + 1) + lo hi∗(maxlo+1)+lo -
雪花算法
SnowFlake
参看原文
定义:一种分布式的
id
生成算法,核心思想是使用64位的long
数字作为全局唯一id
。64位的含义(0-63)
0:无意义,仅仅为了标识是正数,负数部分我们不使用
1-41:时间戳(时间范围在69年,以毫秒为最小粒度)
42-46:机房
id
(32个机房)47-51:机器
id
(每个机房内可表示32个电脑)52-63:序号(这一毫秒内的第多少个请求,最大支持4096个)
将上述各个逐次拼接,就可以得到一个基本上唯一的分布式
id
。【优点】高性能、高可用:生成时不依赖于数据库,完全在内存中生成;容量大:每秒能生成百万的自增
id
;id
是自增的:存入数据库中的索引效率比较高。【缺点】依赖与宜通世纪间的一致性,如果时间被回调或者改变,就会造成
id
冲突或者重复。 -
UUID
参考原文
-
UUID
的基本定义:Universally Unique Identifier
,一定的范围内(从特定的名字空间到全球)唯一的机器生成的标识符。 -
基本特点:经由一系列的算法机器生成、非人工指定和识别的、在特定的范围内重复的可能性极小
-
基本模式:是一个16字节共128位长的数字,通常以36字节的字符串表示,如:
3F2504E0-4F89-11D3-9A0C-0305E82C3301
128位的含义(0-127)
0-59:时间戳
60-63:UUID版本号
64-76:clock sequence
77-79:保留字段
80-127:节点标识
-
UUID
的版本包括基于时间的和DEC安全的。 -
java
中的使用:import java.util.UUID; String uuid = UUID.randomUUID().toString();
【优点】能够保证独立性,程序可以在不同的数据库间迁移,效果不受影响;保证生成的ID不仅是表独立的,而且是库独立的,这点在你想切分数据库的时候尤为重要。
【缺点】比较占地方,和INT类型相比,存储一个UUID要花费更多的空间;使用UUID后,URL显得冗长,不够友好。
-
-
共享主键
由另一张表的类型和长度决定。
-
联合主键
由多个字段的类型和长度共同决定。