2) 使用TaskService获取到任务查询对象TaskQuery
3) 为查询对象添加查询过滤条件,使用taskAssignee指定任务的办理者(即查询指定用户的代办任务),同时可以添加分页排序等过滤条件
4) 调用list方法执行查询,返回办理者为指定用户的任务列表
5) 任务ID、名称、办理人、创建时间可以从act_ru_task表中查到。
6) Execution与ProcessInstance见5.6和5.7章节的介绍。在这种情况下,ProcessInstance相当于Execution
7) 如果assignee属性为部门经理,结果为空。因为现在流程只到了”填写请假申请”阶段,后面的任务还没有执行,即在数据库中没有部门经理可以办理的任务,所以查询不到。
8) 一个Task节点和Execution节点是1对1的情况,在task对象中使用Execution_来表示他们之间的关系
9) 任务ID在数据库表act_ru_task中对应“ID_”列
附加:
在activiti任务中,主要分为两大类查询任务(个人任务和组任务):
1.确切指定了办理者的任务,这个任务将成为指定者的私有任务,即个人任务。
2.无法指定具体的某一个人来办理的任务,可以把任务分配给几个人或者一到 多个小组,让这个范围内的用户可以选择性(如有空余时间时)来办理这类任务,即组任务。//例:呼10086
先知道个人任务的查询和办理,组任务的操作后面讲
8.5:办理任务
说明:
1) 是办理任务,所以从ProcessEngine得到的是TaskService。
2) 当执行完这段代码,再以员工的身份去执行查询的时候,会发现这个时候已经没有数据了,因为正在执行的任务中没有数据。
3) 对于执行完的任务,activiti将从act_ru_task表中删除该任务,下一个任务会被插入进来。
4) 以”部门经理”的身份进行查询,可以查到结果。因为流程执行到部门经理审批这个节点了。
5) 再执行办理任务代码,执行完以后以”部门经理”身份进行查询,没有结果。
6) 重复第3和4步直到流程执行完。
8.6:查询流程状态(判断流程正在执行,还是结束)
在流程执行的过程中,创建的流程实例ID在整个过程中都不会变,当流程结束后,流程实例将会在正在执行的执行对象表中(act_ru_execution)被删除
说明:
1) 因为是查询流程实例,所以先获取runtimeService
2) 创建流程实例查询对象,设置实例ID过滤参数
3) 由于一个流程实例ID只对应一个实例,使用singleResult执行查询返回一个唯一的结果,如果结果数量大于1,则抛出异常
a) 判断指定ID的实例是否存在,如果结果为空,则代表流程结束,实例在正在执行的执行对象表中已被删除,转换成历史数据。
8.7:附加功能:查询历史任务(后面讲)
8.8:附加功能:查询历史流程实例(后面讲)
8.9:总结
Execution 执行对象
按流程定义的规则执行一次的过程.
对应的表:
act_ru_execution: 正在执行的信息
act_hi_procinst:已经执行完的历史流程实例信息
act_hi_actinst:存放历史所有完成的活动
ProcessInstance 流程实例
特指流程从开始到结束的那个最大的执行分支,一个执行的流程中,流程实例只有1个。
注意
(1)如果是单例流程,执行对象ID就是流程实例ID
(2)如果一个流程有分支和聚合,那么执行对象ID和流程实例ID就不相同5.8章图
(3)一个流程中,流程实例只有1个,执行对象可以存在多个。
Task 任务
执行到某任务环节时生成的任务信息。
对应的表:
act_ru_task:正在执行的任务信息
act_hi_taskinst:已经执行完的历史任务信息
9:流程变量
9.1:流程图
流程变量在整个工作流中扮演很重要的作用。例如:请假流程中有请假天数、请假原因等一些参数都为流程变量的范围。流程变量的作用域范围是只对应一个流程实例。也就是说各个流程实例的流程变量是不相互影响的。流程实例结束完成以后流程变量还保存在数据库中(存放到流程变量的历史表中)。
例如:
即:
9.2:部署流程定义
说明:
• 输入流加载资源文件的3种方式
9.3:启动流程实例
9.4:设置流程变量
说明:
1) 流程变量的作用域就是流程实例,所以只要设置就行了,不用管在哪个阶段设置
2) 基本类型设置流程变量,在taskService中使用任务ID,定义流程变量的名称,设置流程变量的值。
3) Javabean类型设置流程变量,需要这个javabean实现了Serializable接口
4) 设置流程变量的时候,向act_ru_variable这个表添加数据
9.5:获取流程变量
说明:
1) 流程变量的获取针对流程实例(即1个流程),每个流程实例获取的流程变量时不同的
2) 使用基本类型获取流程变量,在taskService中使用任务ID,流程变量的名称,获取流程变量的值。
3) Javabean类型设置获取流程变量,除了需要这个javabean实现了Serializable接口外,还要求流程变量对象的属性不能发生变化,否则抛出异常。解决方案,固定序列化ID
解决办法,在javabean对象中添加:
private static final long serialVersionUID = 6757393795687480331L;
9.6:模拟流程变量的设置和获取的场景
说明:
1) RuntimeService对象可以设置流程变量和获取流程变量
2) TaskService对象可以设置流程变量和获取流程变量
3) 流程实例启动的时候可以设置流程变量
4) 任务办理完成的时候可以设置流程变量
5) 流程变量可以通过名称/值的形式设置单个流程变量
6) 流程变量可以通过Map集合,同时设置多个流程变量
Map集合的key表示流程变量的名称
Map集合的value表示流程变量的值
9.7:查询历史的流程变量
说明:
1)历史的流程变量查询,指定流程变量的名称,查询act_hi_varinst表(也可以针对,流程实例ID,执行对象ID,任务ID查询)
9.8:流程变量的支持的类型
如图是从官网列出来的流程变量的类型:
从图中可以看出包括了大部分封装类型和Date、String和实现了Serializable接口的类的类型。
9.9:总结
• 1:流程变量
在流程执行或者任务执行的过程中,用于设置和获取变量,使用流程变量在流程传递的过程中传递业务参数。
对应的表:
act_ru_variable:正在执行的流程变量表
act_hi_varinst:流程变量历史表
• 2:扩展知识:setVariable和setVariableLocal的区别
setVariable:设置流程变量的时候,流程变量名称相同的时候,后一次的值替换前一次的值,而且可以看到TASK_ID的字段不会存放任务ID的值
setVariableLocal:
1:设置流程变量的时候,针对当前活动的节点设置流程变量,如果一个流程中存在2个活动节点,对每个活动节点都设置流程变量,即使流程变量的名称相同,后一次的版本的值也不会替换前一次版本的值,它会使用不同的任务ID作为标识,存放2个流程变量值,而且可以看到TASK_ID的字段会存放任务ID的值
例如act_hi_varinst 表的数据:不同的任务节点,即使流程变量名称相同,存放的值也是不同的。
如图:
2:还有,使用setVariableLocal说明流程变量绑定了当前的任务,当流程继续执行时,下个任务获取不到这个流程变量(因为正在执行的流程变量中没有这个数据),所有查询正在执行的任务时不能查询到我们需要的数据,此时需要查询历史的流程变量。
10:流程执行历史记录
10.1:查询历史流程实例
查找按照某个流程定义的规则一共执行了多少次流程
10.2:查询历史活动
某一次流程的执行一共经历了多少个活动
10.3:查询历史任务
某一次流程的执行一共经历了多少个任务
10.4:查询历史流程变量
某一次流程的执行一共设置的流程变量
10.5:总结
由于数据库中保存着历史信息以及正在运行的流程实例信息,在实际项目中对已完成任务的查看频率远不及对代办和可接任务的查看,所以在activiti采用分开管理,把正在运行的交给RuntimeService、TaskService管理,而历史数据交给HistoryService来管理。
这样做的好处在于,加快流程执行的速度,因为正在执行的流程的表中数据不会很大。
二:Activiti 二
================
11:连线
11.1:流程图
注意:如果将流程图放置在和java类相同的路径,需要配置:
11.2:部署流程定义+启动流程实例
11.3:查询我的个人任务
11.4:完成任务
说明:
1)使用流程变量,设置连线需要的流程变量的名称message,并设置流程变量的值
对应:
流程会按照指定的连线完成任务。
11.5:总结
1、一个活动中可以指定一个或多个SequenceFlow(Start中有一个,End中没有)。
* 开始活动中有一个SequenceFlow 。
* 结束活动中没有SequenceFlow 。
* 其他活动中有1条或多条SequenceFlow
2、如果只有一个,则可以不使用流程变量设置codition的名称;
如果有多个,则需要使用流程变量设置codition的名称。message表示流程变量的名称,‘不重要’表示流程变量的值,${}中间的内容要使用boolean类型的表达式,用来判断应该执行的连线。
12:排他网关(ExclusiveGateWay)
12.1:流程图
12.2:部署流程定义+启动流程实例
12.3:查询我的个人任务
12.4:完成我的个人任务
说明:
1) 一个排他网关对应一个以上的顺序流
2) 由排他网关流出的顺序流都有个conditionExpression元素,在内部维护返回boolean类型的决策结果。
3) 决策网关只会返回一条结果。当流程执行到排他网关时,流程引擎会自动检索网关出口,从上到下检索如果发现第一条决策结果为true或者没有设置条件的(默认为成立),则流出。
4) 如果没有任何一个出口符合条件,则抛出异常
5) 使用流程变量,设置连线的条件,并按照连线的条件执行工作流,如果没有条件符合的条件,则以默认的连线离开。例如:
则执行连线:
如果使用流程变量设置
则执行连线:
13:并行网关(parallelGateWay)
13.1:流程图
13.2:部署流程定义+启动流程实例
13.3:查询我的个人任务
13.4:完成我的个人任务
说明:
1) 一个流程中流程实例只有1个,执行对象有多个
2) 并行网关的功能是基于进入和外出的顺序流的:
分支(fork): 并行后的所有外出顺序流,为每个顺序流都创建一个并发分支。
汇聚(join): 所有到达并行网关,在此等待的进入分支, 直到所有进入顺序流的分支都到达以后, 流程就会通过汇聚网关。
3) 并行网关的进入和外出都是使用相同节点标识
4) 如果同一个并行网关有多个进入和多个外出顺序流, 它就同时具有分支和汇聚功能。 这时,网关会先汇聚所有进入的顺序流,然后再切分成多个并行分支。
5) 并行网关不会解析条件。 即使顺序流中定义了条件,也会被忽略。
6) 并行网关不需要是“平衡的”(比如, 对应并行网关的进入和外出节点数目不一定相等)。如图中标示是合法的:
14:开始活动节点
14.1:流程图
14.2:部署流程定义+启动流程实例+查询流程实例+查询历史流程实例
14.3:总结
1):结束节点没有出口
2):其他节点有一个或多个出口。
如果有一个出口,则代表是一个单线流程;
如果有多个出口,则代表是开启并发流程。
15:接收活动(receiveTask,即等待活动)
接收任务是一个简单任务,它会等待对应消息的到达。 当前,官方只实现了这个任务的java语义。 当流程达到接收任务,流程状态会保存到数据库中。
在任务创建后,意味着流程会进入等待状态, 直到引擎接收了一个特定的消息, 这会触发流程穿过接收任务继续执行。
15.1:流程图
15.2:部署流程定义+启动流程实例
/**
* ReceiceTask任务,机器自动完成的任务
* 只会在act_ru_execution表中产生一条数据
* @throws Exception
*/
@Test
public void testExecution() throws Exception {
// 1 发布流程
InputStream inputStreamBpmn = this.getClass().getResourceAsStream(“receiveTask.bpmn”);
InputStream inputStreamPng = this.getClass().getResourceAsStream(“receiveTask.png”);
processEngine.getRepositoryService()//
.createDeployment()//
.addInputStream(“receiveTask.bpmn”, inputStreamBpmn)//
.addInputStream(“receiveTask.png”, inputStreamPng)//
.deploy();
// 2 启动流程
ProcessInstance pi = processEngine.getRuntimeService()//
.startProcessInstanceByKey(“receiveTaskDemo”);
System.out.println(“pid:” + pi.getId());
String pid = pi.getId();
// 3查询是否有一个执行对象在描述”汇总当日销售额“
Execution e1 = processEngine.getRuntimeService()//
.createExecutionQuery()//
.processInstanceId(pid)//
.activityId(“汇总当日销售额”)//
.singleResult();
// 4执行一堆逻辑,并设置流程变量
Map<String,Object> vars = new HashMap<String, Object>();
vars.put(“当日销售额”, 10000);
// 5流程向后执行一步:往后推移e1,使用signal给流程引擎信号,告诉他当前任务已经完成了,可以往后执行
processEngine.getRuntimeService()
.signal(e1.getId(),vars);
// 6判断当前流程是否在”给老板发短信“节点
Execution e2 = processEngine.getRuntimeService()//
.createExecutionQuery()//
.processInstanceId(pid)//
.activityId(“给总经理发短信”)//
.singleResult();
// 7获取流程变量
Integer money = (Integer) processEngine.getRuntimeService()//
.getVariable(e2.getId(), “当日销售额”);
System.out.println(“老板,今天赚了” +money);
// 8向后执行一步:任务完成,往后推移”给老板发短信“任务
processEngine.getRuntimeService()//
.signal(e2.getId());
// 9查询流程状态
pi = processEngine.getRuntimeService()//
.createProcessInstanceQuery()//
.processInstanceId(pid)//
.singleResult();
if(pi==null){
System.out.println(“流程正常执行!!!,已经结束了”);
}
}
说明:
1) 当前任务(一般指机器自动完成,但需要耗费一定时间的工作)完成后,向后推移流程,可以调用runtimeService.signal(executionId),传递接收执行对象的id。
16:用户任务(userTask,即用户操作的任务)
16.1:个人任务
16.1.1:流程图
16.1.2::分配个人任务方式一(直接指定办理人)
1:流程图中任务节点的配置
2:测试代码:
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//部署流程定义,启动流程实例
@Test
public void testTask() throws Exception {
// 1 发布流程
InputStream inputStreamBpmn = this.getClass().getResourceAsStream(“taskProcess.bpmn”);
InputStream inputStreamPng = this.getClass().getResourceAsStream(“taskProcess.png”);
processEngine.getRepositoryService()//
.createDeployment()//
.addInputStream(“userTask.bpmn”, inputStreamBpmn)//
.addInputStream(“userTask.png”, inputStreamPng)//
.deploy();
// 2 启动流程
//启动流程实例的同时,设置流程变量
ProcessInstance pi = processEngine.getRuntimeService()//
.startProcessInstanceByKey(“taskProcess”);
System.out.println(“pid:” + pi.getId());
}
//查询我的个人任务列表
@Test
public void findMyTaskList(){
String userId = “张三丰”;
List list = processEngine.getTaskService()//
.createTaskQuery()//
.taskAssignee(userId)//指定个人任务查询
.list();
for(Task task:list ){
System.out.println(“id=”+task.getId());
System.out.println(“name=”+task.getName());
System.out.println(“assinee=”+task.getAssignee());
System.out.println(“createTime=”+task.getCreateTime());
System.out.println(“executionId=”+task.getExecutionId());
}
}
//完成任务
@Test
public void completeTask(){
String taskId = “3209”;
processEngine.getTaskService()//
.complete(taskId);//
System.out.println(“完成任务”);
}
说明:
1) 张三丰是个人任务的办理人
2) 但是这样分配任务的办理人不够灵活,因为项目开发中任务的办理人不要放置XML文件中。
16.1.3::分配个人任务方式二(使用流程变量)
1:流程图中任务节点的配置
2:测试代码
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//部署流程定义,启动流程实例
@Test
public void testTask() throws Exception {
// 1 发布流程
InputStream inputStreamBpmn = this.getClass().getResourceAsStream(“taskProcess.bpmn”);
InputStream inputStreamPng = this.getClass().getResourceAsStream(“taskProcess.png”);
processEngine.getRepositoryService()//
.createDeployment()//
.addInputStream(“userTask.bpmn”, inputStreamBpmn)//
.addInputStream(“userTask.png”, inputStreamPng)//
.deploy();
// 2 启动流程
//启动流程实例的同时,设置流程变量
Map<String, Object> variables = new HashMap<String, Object>();
variables.put(“userID”, “张翠三”);
ProcessInstance pi = processEngine.getRuntimeService()//
.startProcessInstanceByKey(“taskProcess”,variables);
System.out.println(“pid:” + pi.getId());
}
//查询我的个人任务列表
@Test
public void findMyTaskList(){
String userId = “张翠三”;
List list = processEngine.getTaskService()//
.createTaskQuery()//
.taskAssignee(userId)//指定个人任务查询
.list();
for(Task task:list ){
System.out.println(“id=”+task.getId());
System.out.println(“name=”+task.getName());
System.out.println(“assinee=”+task.getAssignee());
System.out.println(“createTime=”+task.getCreateTime());
System.out.println(“executionId=”+task.getExecutionId());
}
}
//完成任务
@Test
public void completeTask(){
String taskId = “3209”;
processEngine.getTaskService()//
.complete(taskId);//
System.out.println(“完成任务”);
}
说明:
1) 张翠山是个人任务的办理人
2) 在开发中,可以在页面中指定下一个任务的办理人,通过流程变量设置下一个任务的办理人
16.1.4::分配个人任务方式三(使用类)
1:流程图中任务节点的配置
此时流程图的XML文件,如图:
2:TaskListenerImpl类,用来设置任务的办理人
public class TaskListenerImpl implements TaskListener {
/**指定个人任务和组任务的办理人*/
@Override
public void notify(DelegateTask delegateTask) {
String assignee = “张无忌”;
//指定个人任务
delegateTask.setAssignee(assignee);
}
}
3:测试代码
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//部署流程定义,启动流程实例
@Test
public void testTask() throws Exception {
// 1 发布流程
InputStream inputStreamBpmn = this.getClass().getResourceAsStream(“taskProcess.bpmn”);
InputStream inputStreamPng = this.getClass().getResourceAsStream(“taskProcess.png”);
processEngine.getRepositoryService()//
.createDeployment()//
.addInputStream(“userTask.bpmn”, inputStreamBpmn)//
.addInputStream(“userTask.png”, inputStreamPng)//
.deploy();
// 2 启动流程
ProcessInstance pi = processEngine.getRuntimeService()//
.startProcessInstanceByKey(“taskProcess”);
System.out.println(“pid:” + pi.getId());
}
//查询我的个人任务列表
@Test
public void findMyTaskList(){
String userId = “张无忌”;
List list = processEngine.getTaskService()//
.createTaskQuery()//
.taskAssignee(userId)//指定个人任务查询
.list();
for(Task task:list ){
System.out.println(“id=”+task.getId());
System.out.println(“name=”+task.getName());
System.out.println(“assinee=”+task.getAssignee());
System.out.println(“createTime=”+task.getCreateTime());
System.out.println(“executionId=”+task.getExecutionId());
}
}
//完成任务
@Test
public void completeTask(){
String taskId = “3408”;
processEngine.getTaskService()//
.complete(taskId);//
System.out.println(“完成任务”);
}
//可以分配个人任务从一个人到另一个人(认领任务)
@Test
public void setAssigneeTask(){
//任务ID
String taskId = “3408”;
//指定认领的办理者
String userId = “周芷若”;
processEngine.getTaskService()//
.setAssignee(taskId, userId);
}
说明:
1) 在类中使用delegateTask.setAssignee(assignee);的方式分配个人任务的办理人,此时张无忌是下一个任务的办理人
2) 通过processEngine.getTaskService().setAssignee(taskId, userId);将个人任务从一个人分配给另一个人,此时张无忌不再是下一个任务的办理人,而换成了周芷若
3) 在开发中,可以将每一个任务的办理人规定好,例如张三的领导是李四,李四的领导是王五,这样张三提交任务,就可以查询出张三的领导是李四,通过类的方式设置下一个任务的办理人
16.1.5:总结
个人任务及三种分配方式:
1:在taskProcess.bpmn中直接写 assignee=“张三丰"
2:在taskProcess.bpmn中写 assignee=“#{userID}”,变量的值要是String的。
使用流程变量指定办理人
3,使用TaskListener接口,要使类实现该接口,在类中定义:
delegateTask.setAssignee(assignee);// 指定个人任务的办理人
使用任务ID和办理人重新指定办理人:
processEngine.getTaskService()//
.setAssignee(taskId, userId);
16.2:组任务
16.2.1:流程图
16.2.2::分配组任务方式一(直接指定办理人)
1:流程图中任务节点的配置
2:测试代码:
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//部署流程定义,启动流程实例
@Test
public void testTask() throws Exception {
// 1 发布流程
InputStream inputStreamBpmn = this.getClass().getResourceAsStream(“taskProcess.bpmn”);
InputStream inputStreamPng = this.getClass().getResourceAsStream(“taskProcess.png”);
processEngine.getRepositoryService()//
.createDeployment()//
.addInputStream(“userTask.bpmn”, inputStreamBpmn)//
.addInputStream(“userTask.png”, inputStreamPng)//
.deploy();
// 2 启动流程
ProcessInstance pi = processEngine.getRuntimeService()//
.startProcessInstanceByKey(“taskProcess”);
System.out.println(“pid:” + pi.getId());
}
//3 查询我的个人任务列表
@Test
public void findMyTaskList(){
String userId = “小A”;
List list = processEngine.getTaskService()//
.createTaskQuery()//
.taskAssignee(userId)//指定个人任务查询
.list();
for(Task task:list ){
System.out.println(“id=”+task.getId());
System.out.println(“name=”+task.getName());
System.out.println(“assinee=”+task.getAssignee());
System.out.println(“createTime=”+task.getCreateTime());
System.out.println(“executionId=”+task.getExecutionId());
}
}
//4 查询组任务列表
@Test
public void findGroupList(){
String userId = “小A”;
List list = processEngine.getTaskService()//
.createTaskQuery()//
.taskCandidateUser(userId)//指定组任务查询
.list();
for(Task task:list ){
System.out.println(“id=”+task.getId());
System.out.println(“name=”+task.getName());
System.out.println(“assinee=”+task.getAssignee());
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Python开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注Python)
做了那么多年开发,自学了很多门编程语言,我很明白学习资源对于学一门新语言的重要性,这些年也收藏了不少的Python干货,对我来说这些东西确实已经用不到了,但对于准备自学Python的人来说,或许它就是一个宝藏,可以给你省去很多的时间和精力。
别在网上瞎学了,我最近也做了一些资源的更新,只要你是我的粉丝,这期福利你都可拿走。
我先来介绍一下这些东西怎么用,文末抱走。
(1)Python所有方向的学习路线(新版)
这是我花了几天的时间去把Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
最近我才对这些路线做了一下新的更新,知识体系更全面了。
(2)Python学习视频
包含了Python入门、爬虫、数据分析和web开发的学习视频,总共100多个,虽然没有那么全面,但是对于入门来说是没问题的,学完这些之后,你可以按照我上面的学习路线去网上找其他的知识资源进行进阶。
(3)100多个练手项目
我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了,只是里面的项目比较多,水平也是参差不齐,大家可以挑自己能做的项目去练练。
(4)200多本电子书
这些年我也收藏了很多电子书,大概200多本,有时候带实体书不方便的话,我就会去打开电子书看看,书籍可不一定比视频教程差,尤其是权威的技术书籍。
基本上主流的和经典的都有,这里我就不放图了,版权问题,个人看看是没有问题的。
(5)Python知识点汇总
知识点汇总有点像学习路线,但与学习路线不同的点就在于,知识点汇总更为细致,里面包含了对具体知识点的简单说明,而我们的学习路线则更为抽象和简单,只是为了方便大家只是某个领域你应该学习哪些技术栈。
(6)其他资料
还有其他的一些东西,比如说我自己出的Python入门图文类教程,没有电脑的时候用手机也可以学习知识,学会了理论之后再去敲代码实践验证,还有Python中文版的库资料、MySQL和HTML标签大全等等,这些都是可以送给粉丝们的东西。
这些都不是什么非常值钱的东西,但对于没有资源或者资源不是很好的学习者来说确实很不错,你要是用得到的话都可以直接抱走,关注过我的人都知道,这些都是可以拿到的。
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Python开发知识点,真正体系化!**
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注Python)
[外链图片转存中…(img-j7F7gCnw-1712439350217)]
做了那么多年开发,自学了很多门编程语言,我很明白学习资源对于学一门新语言的重要性,这些年也收藏了不少的Python干货,对我来说这些东西确实已经用不到了,但对于准备自学Python的人来说,或许它就是一个宝藏,可以给你省去很多的时间和精力。
别在网上瞎学了,我最近也做了一些资源的更新,只要你是我的粉丝,这期福利你都可拿走。
我先来介绍一下这些东西怎么用,文末抱走。
(1)Python所有方向的学习路线(新版)
这是我花了几天的时间去把Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
最近我才对这些路线做了一下新的更新,知识体系更全面了。
(2)Python学习视频
包含了Python入门、爬虫、数据分析和web开发的学习视频,总共100多个,虽然没有那么全面,但是对于入门来说是没问题的,学完这些之后,你可以按照我上面的学习路线去网上找其他的知识资源进行进阶。
(3)100多个练手项目
我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了,只是里面的项目比较多,水平也是参差不齐,大家可以挑自己能做的项目去练练。
(4)200多本电子书
这些年我也收藏了很多电子书,大概200多本,有时候带实体书不方便的话,我就会去打开电子书看看,书籍可不一定比视频教程差,尤其是权威的技术书籍。
基本上主流的和经典的都有,这里我就不放图了,版权问题,个人看看是没有问题的。
(5)Python知识点汇总
知识点汇总有点像学习路线,但与学习路线不同的点就在于,知识点汇总更为细致,里面包含了对具体知识点的简单说明,而我们的学习路线则更为抽象和简单,只是为了方便大家只是某个领域你应该学习哪些技术栈。
(6)其他资料
还有其他的一些东西,比如说我自己出的Python入门图文类教程,没有电脑的时候用手机也可以学习知识,学会了理论之后再去敲代码实践验证,还有Python中文版的库资料、MySQL和HTML标签大全等等,这些都是可以送给粉丝们的东西。
这些都不是什么非常值钱的东西,但对于没有资源或者资源不是很好的学习者来说确实很不错,你要是用得到的话都可以直接抱走,关注过我的人都知道,这些都是可以拿到的。
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-ZnHwWe1l-1712439350218)]