CRM 客户关系管理系统-总结
这是一个前后端分离的项目,后端用的技术框架SSM ,springboot+spring+Mybatis
前端用到的技术有VUE+element-ui
这个系统的作用,这个项目有什么用?
简单说就是通过系统维客户的关系,从而达到销售的目的
其中包含哪些模块?
权限模块,组织机构模块,系统模块,营销模块,产品模块,订单模块,财务模块,售后模块等等
主要负责的是权限模块,组织机构模块,营销模块,
权限模块:
设计: 基于RBAC模型–通过角色控制权限
为什么用RBAC模型:-------------
用户和权限两者之间关联起来的操作是十分复杂的,在这两者中间添加角色这一个概念,将角色分配给用户,给角色赋予权限,大大的简化了用户授权的这个问题。
权限模块:包含角色管理,菜单管理,权限管理
角色管理:销售,财务,老板,他们看见的东西都不相同
权限中的认证和授权的定义
什么是认证: 认证是对用户的身份确认,也就是登录。 在本系统中登录认证是通过token+全局的map来实现的
因为这个项目是前后端分离项目,不能使用session来存储用户信息。
什么是授权: 权限我们看做是访问、操作某一资源的前置条件,而授权就是赋予认证的用户拥有这样的权限。
用户认证成功后,就可以对某些资源进行访问,不同的用户有不同的资源访问权利。
为什么需要权限: 因为在一个系统中用户是多样化的,我们需要他们看到不同的资源和界面。
从安全方面考虑:可以防止 信息的泄露,防止恶意破坏,
从用户职责方面考虑:能更加的明确用户、员工的职责比如客服,销售,策划,等等
权限的设计:
权限的要素:资源,权限,用户,授权,鉴权
资源: 用户可访问的任何东西,比如可以是一个按钮,一个菜单,一个方法都可以是资源
权限:我们可以把权限看做是对资源可被访问的一种前置条件约定,比如:访问 “采购功能” 必须有 “采购权限”
用户:要为用户做授权就必须先登录成功,没有用户你给谁做授权呢?
授权:授权是一个动作,就是给登录成功的用户绑定好权限,让该用户可以访问相关的资源,需要事先在数据库中给用户分配好权限,用户登录成功之后就把用户的权限和用户绑定好。
鉴权:权限检查是当用户对某个资源发起请求时,需要判断该用户是否拥有访问该资源的权限
基于RBAC模型
RBAC:Role base access control基于角色的访问控制
其基本思想是,对系统操作的各种权限不是直接授予具体的用户,而是在用户集合与权限集合之间建立一个角色集合。每一种角色对应一组相应的权限。一旦用户被分配了适当的角色后,该用户就拥有此角色的所有操作权限。这样做的好处是,不必在每次创建用户时都进行分配权限的操作,只要分配用户相应的角色即可,而且角色的权限变更比用户的权限变更要少得多,这样将简化用户的权限管理,减少系统的开销。
角色管理中实现的功能有
CRUD
授权:权限授予,菜单授予
如何实现不同角色看见不同的数据
通过给角色赋予菜单,将菜单与角色挂钩,前端展示菜单用动态路由、菜单,就可以实现不同的角色看见不同的菜单与界面。
权限控制包括?
登录权限
权限控制:菜单权限,按钮权限,数据权限
权限管理功能
采用自定义注解+扫描的方式
自定义一个权限注解,在需要权限控制的资源上打上注解,当程序启动的时候通过监听器,进入Service层,通过反射的方式来获取类和上面的方法和注解,当一个方法上有自定义注解就将这条资源数据封装成权限对象,然后在存入数据库。
权限数据的维护就自定义注解加扫描
如何自定义一个注解?
鉴权–权限拦截
登录认证+鉴权
认证:登录的时候返回一个token给前端,每一次请求都通过前端的axios请求将token 一同发送给后端,然后
在拦截器中获取heard的token,先判断token是否有无,然后再通过token去全局map中拿到user对象,有user则登录无则没有登录。
鉴权:拦截器中可以拿到请求的方法信息和类信息(这就是这个资源的信息),通过用户的信息获取这个用户所拥有的权限信息,两者通过对比来查看这个用户是否有这个资源的权限
登录的信息为什么不存session而用token 存入全局map?
项目为前后端分离,前端每次发送请求为新的会话,jsession的id会改变。
前后端跨域
什么造成了跨域
它是浏览器同源策略造成的,是浏览器对JS实施的安全限制,所谓同源是指:“域名”、“协议”、“端口”均为相同
不同端口,不同域名,不同协议 只要一个不同就是跨域
前端解决跨域
前端使用代理的方式来解决跨域问题
vue.config.js文件进行配置
const { defineConfig } = **require**('@vue/cli-service')
module.exports = defineConfig({
transpileDependencies: true,
devServer:{
// 设置项目端口和自动启动浏览器
host:'localhost',
port:8000,
open:true,
//配置代理
proxy:{
'api':{ //配置名为'api'的代理
target:'http://localhost:8082', //请求后台服务端的IP,即代理转发的目标地址
pathRewrite:{'^/api':''}, //重写请求路径
changeOrigin:true //开启跨域
}
}
}
})
axios请求中路径为:‘/api/**’
getStudent() {
axios.get("/api/student/list").then(resp => {
this.tableData= resp.data;
})
},
js
getStudent() {
axios.get("/api/student/list").then(resp => {
this.tableData= resp.data;
})
},
当在前端发起请求时,如果路径以’/api’开头,代理会将这个请求转发到’http://localhost:8082’,并且将路径中的‘/api’替换为空字符串,
后端解决跨域------
用的springboot,只用在Controller类上添加一个@CrossOrigin注解就可以实现对当前controller 的跨域 访问了,当然这个标签也可以加到方法上。
组织机构模块
部门管理
员工管理
员工管理中有赋予角色这个功能,
系统模块
系统设置
为什么需要系统设置?因为在系统中有一些参数需要人为设置或者需要定期修改,写si就不方便,
所以就通过系统设置这个功能来管理这些参数,解决了硬编码问题。
数据字典
数据字典明细
为什么需要数据字典? 因为有一些数据,没必要单独写成一张表,就集中在一起写成数据字典这一张表。
数据字典明细,就是对数据字典中的数据再进一步的细分,
营销模块
活动管理,线索管理,商机管理,
活动管理包括:市场活动,和营销活动,
市场活动的目的是为了获取线索,营销活动的目的是为了促单
线索管理:
线索中的操作: 新的线索,还没有分配销售人员,分配销售人员后,销售人员需要进行线索的跟进,而每一次跟进都需记录信息和确定下一次约谈时间
跟进之后如果发现客户有意向购买,就将这条线索转为商机
跟进后发现客户没有意向购买,不会将这条线索删除而是将其存放进线索池中
如果员工有变动 就将其移交给其他的销售人员
在线索池中的线索 可以将这条线索尝试跟进一下。
线索池中的数据全部销售员工都可以看见,
登录的销售人员 只能通过数据权限控制 看到属于自己的线索
// 而不在线索池中的数据,每个员工只能看见所属自己的线索
线索关联活动:可以进行统计线索和活动的关系
商机管理
当一条线索转为商机,选择商品并跳转到商机界面,修改线索表状态,添加线索备注,添加商机信息,添加商机备注,添加商机产品。
商机列表的管理有 跟进,移交,转入/转出商机池,付定金
在跟进的过程中发现用户有意愿,通过营销活动促使客户下单,
下单又分为 付定金 ,全款,分期
下定金流程是:在商机里面 点击付定金,弹框 通过营销活动计算商品价格,然后输入用户的定金金额,然后发送到后台。修改商机状态(为已付定金),添加商机备注,生成订单数据,生成订单产品,订单关联的活动,生成合同表,生成合同备注,生成定金信息。(生成客户信息添加到客户表里面,生成保修单)
在订单界面去收尾款,分为 分期和全款
根据付款方式来生成 应收款表,和应收款明细表,和其对应的备注表和客户商议每月几号还款。
财务模块:
应收款: 卖出去的商品
应付款:工资,税
售后模块:
客户管理
客户关怀:定时器,根据客户的生日信息 来发送关怀短信
或者一些礼品
保修功能:当客户需要进行维修时,打电话给客服,根据维修的信息来生成保修备注信息