大体介绍

云服务的三种模式
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流程的查询
 根据流程的审批类型,审批状态,当前节点的处理人,以及发起人构造条件查询







![NSS [SWPUCTF 2022 新生赛]funny_web](https://img-blog.csdnimg.cn/img_convert/18e9c3234ecb30404dcaf2c6b816cc79.png)











