大体介绍
云服务的三种模式
Iaas:基础设施即服务
Pass:平台即服务
Saas:软件即服务
系统设计
主键id生成策略
lombok
@data = @setter + @getter +@noArgs(无参构造)
模块搭建
1 企业得增删改查
2 全局异常处理器
3 跨域@Crosorigin注解
二
1 多租户的数据库设计
多租户的数据隔离
方案一:多个数据库
方案二:一个数据库多个schema
方案三: 共享数据库共享数据库表,通过企业id进行数据隔离
数据库得三大范式
1 保证每列的原子性(每一列不可拆分)(eg:address:中国北京,可以拆分为国籍和城市,这样就是不可拆分了)
2 第二范式:在第一范式的基础上,非主属性必须依赖主属性(一个表只做一个事情 eg:用户表里面有 语文成绩,数学成绩,这些成绩可以放到成绩表中)
3 第三范式:在第二范式的基础上,消除传递依赖(eg:订单表中 有单价和数量,多了一个字段总价:这个总价是可以通过数量乘以单价得到的,)
反三范式
通过添加一些冗余字段方便查询效率
eg:总价,这个字段虽然冗余了,但是页面中确实是要显示的
node8一般已经集成了npm
cnpm install //国内镜像
npm install //国外镜像
npm run dev
前端工程目录
build 编译的内容
config 全局变量
node_moudles 依赖的组件执行npm install下载下来的
script 一些脚本
src 所有的源码
图片上传
员工管理的头像图片
刷脸登录(百度云AI)
1 人脸注册
向百度的人脸库注册(添加)用户的人脸照片(addUser)
2 人脸检测
判断图片中是否有面部信息
3 人脸搜索
根据用户上传的图片和指定人脸库中所有人脸进行比较,获取相似度最高的一个或者几个的评分,score:相似度评分最高的
返回值:数据只要一条,相似度最高的(百度云推荐80分以上就是认为是同一个人)
4 人脸更新
更新人脸库中的照片(updateUser)
刷脸登录实现
工作流介绍
工作流:就是工作流程的计算模型,一套规则,让程序按照一定的规则继续执行下去
工作流引擎:activiti
activiti开发流程介绍
一 静态阶段
1.1 流程设计–模型(xml)
1.2流程部署–将模型xml上传到系统中,导入到activiti
二 运行时阶段
2.1 用户发起流程
2.2 用户审批流程(驳回)
使用activiti进行流程状态的跟踪
三 历史阶段
历史的流程查询
在项目中使用activiti进行流程控制 一般而言可以分为三步
1 流程制作(工具绘制流程图,部署到activiti中)
2 流程执行:工作流已进入“运行中”阶段
3 查询历史阶段
eg:请假流程
流程制作工具
官网下载activiti-app 包,放到tomcat中运行,启动即可
绘制模型
每一个节点定义了一个id 一个候选组(什么样的人或者身份,可以有当前节点的权限)
选择网关:定义一个条件,根据条件进入到不同的节点
流程绘制完成保存后,其实时一个xml文件
流程设计好后,通过文件上传的形式,部署到activiti流程引擎中
activiti和业务数据库多数据源配置
1 流程的部署
通过repositoryService进行流程的部署(springboot项目集成了activiti工作流引擎),这个repositoryService 是activiti暴漏的,给我们提供好的供我们使用的
javaDeploymentBuilder deploymentBuilder = repositoryService.createDeployment();
deploymentBuilder.addBytes(fileName , file.getBytes()); //部署流程
deploymentBuilder.tenantId(companyId);
Deployment deploy = deploymentBuilder.deploy();```
上传成功后对应activiti数据中的表act_re_devlopment(还有一些关联的表eg:act_re_procdef(流程定义的一些配置信息) act_re_bytearry(存放的是流程定义的xml文件)) 会多出数据
2 流程定义的管理(流程挂起,激活,查询等)
通过activiti内置的api
return repositoryService.createProcessDefinitionQuery()
.processDefinitionTenantId(companyId).latestVersion().list();
3 流程的挂机和激活
ProcessDefinition definition =
repositoryService.createProcessDefinitionQuery()
.processDefinitionKey(processKey).latestVersion().singleResult();
if(definition.isSuspended()) { //如果是挂起状态,这里激活此流程
repositoryService.activateProcessDefinitionById(definition.getId());
}else{
//如果不是挂起状态,这里挂起此流程
repositoryService.suspendProcessDefinitionById(definition.getId());
}
业务数据库
proc_instance表 发起得流程得对应流程得实例(一个流程),proc_state(流程得状态)
proc_task_instance //业务流程得任务表,(每个节点) 一个流程对应多个节点
proc_user_group //用户组表
每个任务节点都有一个候选组
通过候选组,对应得sql查询对应得用户
activiti表和业务表是绑定关系得
查询申请的流程
发起申请
springdata-jpa当中
要想手动执行sql 注入@entitymanager
发起流程
用户前端选择请假(加班等)原因,时间,理由等信息,发起流程申请,后端获取到用户id 远程调用用户服务查询用户信息,封装数据 到流程实体类中
1 部署流程
通过activiti-app绘制好流程图,以文件得形式上传到activiti服务器中,并绑定业务表中的companyID(企业id),teantId
2 流程的激活和挂起
通过activiti对外提供的service(repositoryService)active方法进行激活和挂起
3 流程的发起
3.1 用户通过页面填写请假等相关信息(天数,原因),后端获取相关信息,获取用户id的同时远程调用用户微服务获取完整的用户信息(这里主要获取用户的部门id),根据process_key(流程实例名称) 和companyId 获取到对应的activiti中的流程对象,开启流程
3.2 自动执行下一个任务节点 开启,在获取下一个节点的数据,查询当前节点的审批人,根据当前节点的id查询当前任务节点的候选组,根据候选组id查询系统业务中的用户组表,封装参数,手动执行(jpa中采用的是entityManager)sql,结果集就是该任务节点审核的所有人
填充业务数据中的当前节点审批人,保存到数据库,其中流程表和任务节点表是1对多的关系
4 流程的审核
根据流程的id查询业务表中对应的流程实例,在根据流程id查询activiti中对应的实例
根据当前处理人的id,远程调用用户微服务获取用户对象
根据处理的类型(驳回,通过)等进行不同操作,不通过删除该流程,
如果审核通过,完成当前的任务,并查询下一个节点,如果没有节点,任务结束,修改流程状态,如果有一下节点,同样查询该节点的候选组,根据候选组去我们对应业务表中查询候选组所对应的用户,
5流程的查询
根据流程的审批类型,审批状态,当前节点的处理人,以及发起人构造条件查询