啦啦啦啦啦,富贵同学又开始开坑了,出了个免费的专栏,主要给大家从0基础开始用springBoot集成第三方的插件或者功能,如果这篇专栏能帮到你,一定不要忘了点一个赞哦!!欢迎大家收藏分享

第一步,导入jar包

       <dependency><groupId>org.activiti</groupId><artifactId>activiti-spring-boot-starter-basic</artifactId><version>5.22.0</version></dependency>

这是activiti的核心包,我们还添加其他的jar包

       <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.30</version></dependency>

第二步,编写配置文件

server:port: 8089
spring:datasource:url: jdbc:mysql://localhost:3306/activitidriver-class-name: com.mysql.jdbc.Driverusername: rootpassword: 123456

第三步,创建activiti库

第四步,运行启动类


好,遇到这个时候就出现问题了,这是富贵同学替大家踩坑了,大家记得避开
启动报错Could not find class [org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration]
这个问题是activiti里面本身会依赖Security,所以我们将他排除,我们在启动类上加上

exclude = SecurityAutoConfiguration.class


好的,我们启动,这个时候又碰见另外的一个问题
Caused by: java.io.FileNotFoundException: class path resource [processes/] cannot be resolved to URL because it does not exist
这个是因为activiti在启动的时候会去找bpm文件,会去到默认的processes文件夹中找,
这个时候我们在配置类中加入

  activiti:check-process-definitions: false


这个时候就启动成功啦!

第五步.启动成功之后查看我们的数据库


就会发现25张表已经自动生成了!
如果没有看过富贵同学的第一篇请移步到这个地址查看SpringBoot集成Activiti(一)
第一步,取消yml的配置,因为我们需要创建一个流程

leave.bpmn文件感谢(https://gitee.com/shenzhanwang/Spring-activiti)提供的流程文件

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test"><process id="leave" name="My process" isExecutable="true"><userTask id="deptleaderaudit" name="部门领导审批" activiti:assignee="${deptleader}" activiti:candidateGroups="部门经理"></userTask><exclusiveGateway id="exclusivegateway1" name="Exclusive Gateway"></exclusiveGateway><userTask id="hraudit" name="人事审批" activiti:assignee="${hr}" activiti:candidateGroups="人事"></userTask><sequenceFlow id="flow3" name="同意" sourceRef="exclusivegateway1" targetRef="hraudit"><conditionExpression xsi:type="tFormalExpression"><![CDATA[${deptleaderapprove=='true'}]]></conditionExpression></sequenceFlow><userTask id="modifyapply" name="调整申请" activiti:assignee="${applyuserid}"></userTask><sequenceFlow id="flow4" name="拒绝" sourceRef="exclusivegateway1" targetRef="modifyapply"><conditionExpression xsi:type="tFormalExpression"><![CDATA[${deptleaderapprove=='false'}]]></conditionExpression></sequenceFlow><sequenceFlow id="flow6" sourceRef="deptleaderaudit" targetRef="exclusivegateway1"></sequenceFlow><exclusiveGateway id="exclusivegateway2" name="Exclusive Gateway"></exclusiveGateway><sequenceFlow id="flow7" sourceRef="modifyapply" targetRef="exclusivegateway2"></sequenceFlow><sequenceFlow id="flow8" name="重新申请" sourceRef="exclusivegateway2" targetRef="deptleaderaudit"><conditionExpression xsi:type="tFormalExpression"><![CDATA[${reapply=='true'}]]></conditionExpression></sequenceFlow><endEvent id="endevent1" name="End"></endEvent><sequenceFlow id="flow9" name="结束流程" sourceRef="exclusivegateway2" targetRef="endevent1"><conditionExpression xsi:type="tFormalExpression"><![CDATA[${reapply=='false'}]]></conditionExpression></sequenceFlow><exclusiveGateway id="exclusivegateway3" name="Exclusive Gateway"></exclusiveGateway><sequenceFlow id="flow10" sourceRef="hraudit" targetRef="exclusivegateway3"></sequenceFlow><sequenceFlow id="flow11" name="拒绝" sourceRef="exclusivegateway3" targetRef="modifyapply"><conditionExpression xsi:type="tFormalExpression"><![CDATA[${hrapprove=='false'}]]></conditionExpression></sequenceFlow><userTask id="reportback" name="销假" activiti:assignee="${applyuserid}"></userTask><sequenceFlow id="flow12" name="同意" sourceRef="exclusivegateway3" targetRef="reportback"><conditionExpression xsi:type="tFormalExpression"><![CDATA[${hrapprove=='true'}]]></conditionExpression></sequenceFlow><sequenceFlow id="flow13" sourceRef="reportback" targetRef="endevent1"></sequenceFlow><startEvent id="startevent1" name="Start" activiti:initiator="${applyuserid}"></startEvent><sequenceFlow id="flow14" sourceRef="startevent1" targetRef="deptleaderaudit"></sequenceFlow></process><bpmndi:BPMNDiagram id="BPMNDiagram_leave"><bpmndi:BPMNPlane bpmnElement="leave" id="BPMNPlane_leave"><bpmndi:BPMNShape bpmnElement="deptleaderaudit" id="BPMNShape_deptleaderaudit"><omgdc:Bounds height="55.0" width="105.0" x="250.0" y="220.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="exclusivegateway1" id="BPMNShape_exclusivegateway1"><omgdc:Bounds height="40.0" width="40.0" x="535.0" y="227.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="hraudit" id="BPMNShape_hraudit"><omgdc:Bounds height="55.0" width="105.0" x="620.0" y="220.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="modifyapply" id="BPMNShape_modifyapply"><omgdc:Bounds height="55.0" width="105.0" x="503.0" y="310.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="exclusivegateway2" id="BPMNShape_exclusivegateway2"><omgdc:Bounds height="40.0" width="40.0" x="535.0" y="410.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1"><omgdc:Bounds height="35.0" width="35.0" x="890.0" y="413.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="exclusivegateway3" id="BPMNShape_exclusivegateway3"><omgdc:Bounds height="40.0" width="40.0" x="770.0" y="228.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="reportback" id="BPMNShape_reportback"><omgdc:Bounds height="55.0" width="105.0" x="855.0" y="221.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1"><omgdc:Bounds height="35.0" width="35.0" x="140.0" y="230.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3"><omgdi:waypoint x="575.0" y="247.0"></omgdi:waypoint><omgdi:waypoint x="620.0" y="247.0"></omgdi:waypoint><bpmndi:BPMNLabel><omgdc:Bounds height="48.0" width="24.0" x="575.0" y="247.0"></omgdc:Bounds></bpmndi:BPMNLabel></bpmndi:BPMNEdge><bpmndi:BPMNEdge bpmnElement="flow4" id="BPMNEdge_flow4"><omgdi:waypoint x="555.0" y="267.0"></omgdi:waypoint><omgdi:waypoint x="555.0" y="310.0"></omgdi:waypoint><bpmndi:BPMNLabel><omgdc:Bounds height="48.0" width="24.0" x="555.0" y="267.0"></omgdc:Bounds></bpmndi:BPMNLabel></bpmndi:BPMNEdge><bpmndi:BPMNEdge bpmnElement="flow6" id="BPMNEdge_flow6"><omgdi:waypoint x="355.0" y="247.0"></omgdi:waypoint><omgdi:waypoint x="535.0" y="247.0"></omgdi:waypoint></bpmndi:BPMNEdge><bpmndi:BPMNEdge bpmnElement="flow7" id="BPMNEdge_flow7"><omgdi:waypoint x="555.0" y="365.0"></omgdi:waypoint><omgdi:waypoint x="555.0" y="410.0"></omgdi:waypoint></bpmndi:BPMNEdge><bpmndi:BPMNEdge bpmnElement="flow8" id="BPMNEdge_flow8"><omgdi:waypoint x="535.0" y="430.0"></omgdi:waypoint><omgdi:waypoint x="302.0" y="429.0"></omgdi:waypoint><omgdi:waypoint x="302.0" y="275.0"></omgdi:waypoint><bpmndi:BPMNLabel><omgdc:Bounds height="48.0" width="48.0" x="361.0" y="438.0"></omgdc:Bounds></bpmndi:BPMNLabel></bpmndi:BPMNEdge><bpmndi:BPMNEdge bpmnElement="flow9" id="BPMNEdge_flow9"><omgdi:waypoint x="575.0" y="430.0"></omgdi:waypoint><omgdi:waypoint x="890.0" y="430.0"></omgdi:waypoint><bpmndi:BPMNLabel><omgdc:Bounds height="48.0" width="48.0" x="659.0" y="437.0"></omgdc:Bounds></bpmndi:BPMNLabel></bpmndi:BPMNEdge><bpmndi:BPMNEdge bpmnElement="flow10" id="BPMNEdge_flow10"><omgdi:waypoint x="725.0" y="247.0"></omgdi:waypoint><omgdi:waypoint x="770.0" y="248.0"></omgdi:waypoint></bpmndi:BPMNEdge><bpmndi:BPMNEdge bpmnElement="flow11" id="BPMNEdge_flow11"><omgdi:waypoint x="790.0" y="268.0"></omgdi:waypoint><omgdi:waypoint x="789.0" y="337.0"></omgdi:waypoint><omgdi:waypoint x="608.0" y="337.0"></omgdi:waypoint><bpmndi:BPMNLabel><omgdc:Bounds height="48.0" width="24.0" x="672.0" y="319.0"></omgdc:Bounds></bpmndi:BPMNLabel></bpmndi:BPMNEdge><bpmndi:BPMNEdge bpmnElement="flow12" id="BPMNEdge_flow12"><omgdi:waypoint x="810.0" y="248.0"></omgdi:waypoint><omgdi:waypoint x="855.0" y="248.0"></omgdi:waypoint><bpmndi:BPMNLabel><omgdc:Bounds height="48.0" width="24.0" x="810.0" y="248.0"></omgdc:Bounds></bpmndi:BPMNLabel></bpmndi:BPMNEdge><bpmndi:BPMNEdge bpmnElement="flow13" id="BPMNEdge_flow13"><omgdi:waypoint x="907.0" y="276.0"></omgdi:waypoint><omgdi:waypoint x="907.0" y="413.0"></omgdi:waypoint></bpmndi:BPMNEdge><bpmndi:BPMNEdge bpmnElement="flow14" id="BPMNEdge_flow14"><omgdi:waypoint x="175.0" y="247.0"></omgdi:waypoint><omgdi:waypoint x="250.0" y="247.0"></omgdi:waypoint></bpmndi:BPMNEdge></bpmndi:BPMNPlane></bpmndi:BPMNDiagram>
</definitions>

这是一个简单的请假申请流程

第六步,放入指定的文件夹中之后,我们重新启动启动类

第七步,查看我们的数据表

ACT_RE_PROCDEF中可以查看到我们的流程

至此之后我们的流程就创建完成了,现在来我们的api操作

第八步,由于我们要跟我们的业务连接到一起,所以我们创建一个请假表

CREATE TABLE `leave` (`id` int(11) NOT NULL AUTO_INCREMENT,`process_instance_id` varchar(45) DEFAULT NULL COMMENT '流程表id',`user_id` varchar(20) DEFAULT NULL COMMENT '用户id',`start_time` varchar(45) DEFAULT NULL COMMENT '开始时间',`end_time` varchar(45) DEFAULT NULL COMMENT '结束时间',`leave_type` varchar(45) DEFAULT NULL COMMENT '请假类型',`reason` varchar(400) DEFAULT NULL COMMENT '请假原因',`apply_time` datetime DEFAULT NULL COMMENT '通过时间',`reality_start_time` varchar(45) DEFAULT NULL COMMENT '请假开始时间',`reality_end_time` varchar(45) DEFAULT NULL COMMENT '请假结束时间',PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='请假表';

第九步,集成底层框架

对了,我们没有数据库框架,这里我们使用mybatisPlusPro来作为底层框架

第十步,创建controller等类

import com.wangfugui.activiti.dao.LeaveDO;
import com.wangfugui.activiti.service.LeaveService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** @author MaSiyi* @version 1.0.0 2021/12/2* @since JDK 1.8.0*/
@RestController
@RequestMapping("/leave")
public class LeaveController extends BaseController<LeaveService, LeaveDO>{}
import com.baomidou.mybatisplus.extension.service.IService;
import com.wangfugui.activiti.dao.LeaveDO;/*** @author MaSiyi* @version 1.0.0 2021/12/2* @since JDK 1.8.0*/
public interface LeaveService extends IService<LeaveDO> {}

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.wangfugui.activiti.dao.LeaveDO;
import com.wangfugui.activiti.dao.mapper.LeaveMapper;
import com.wangfugui.activiti.service.LeaveService;
import org.springframework.stereotype.Service;/*** @author MaSiyi* @version 1.0.0 2021/12/2* @since JDK 1.8.0*/
@Service
public class LeaveServiceImpl extends ServiceImpl<LeaveMapper, LeaveDO> implements LeaveService {}
```java
hellow啊,靓仔,有没有看过前面的内容啊?
请移步到前面的内容去看(一)(二)的内容
接下来我们开始和我们的业务结合到一起。

还是先回顾一下上期内容,上期有个遗留的问题,就是mabatis jar包会冲突,所以我们

       <dependency><groupId>org.activiti</groupId><artifactId>activiti-spring-boot-starter-basic</artifactId><version>5.22.0</version><exclusions><exclusion><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId></exclusion></exclusions></dependency>

第十一步,好的,为了接下来方便接口的测试,我们使用swagger来快速搭建

 <!--swagger--><dependency><!--添加Swagger依赖 --><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.7.0</version></dependency><dependency><!--添加Swagger-UI依赖 --><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId><version>2.7.0</version></dependency><!--swagger-->

第十二步,编写controller类

import com.wangfugui.activiti.dao.LeaveVo;
import com.wangfugui.activiti.dao.Leaves;
import com.wangfugui.activiti.dao.dto.HandleDto;
import com.wangfugui.activiti.dao.dto.UpcomingDto;
import com.wangfugui.activiti.service.LeaveService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;/*** @author MaSiyi* @version 1.0.0 2021/12/2* @since JDK 1.8.0*/
@RestController
@RequestMapping("/leave")
@Api(tags = "请假")
public class LeaveController {@Autowiredprotected LeaveService leaveService;@PostMapping("/startLeave")@ApiOperation("发起一个请假流程")public String startLeave(@RequestBody Leaves leave) {return leaveService.startLeave(leave);}@PostMapping("/upcoming")@ApiOperation("获取待办列表")public List<LeaveVo> listTask(@RequestBody UpcomingDto upcomingDto) {return leaveService.upcoming(upcomingDto);}@PostMapping("/handle")@ApiOperation("处理流程")public String handle(@RequestBody HandleDto handleDto) {return leaveService.handle(handleDto);}}

这次我们先来个简单的创建流程,获取待办流程,审批流程
所以我们就看到了这三个接口

第十三步,我们进入到实现类中查看

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.wangfugui.activiti.dao.LeaveVo;
import com.wangfugui.activiti.dao.Leaves;
import com.wangfugui.activiti.dao.dto.HandleDto;
import com.wangfugui.activiti.dao.dto.UpcomingDto;
import com.wangfugui.activiti.dao.mapper.LeaveMapper;
import com.wangfugui.activiti.service.LeaveService;
import org.activiti.engine.IdentityService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;/*** @author MaSiyi* @version 1.0.0 2021/12/2* @since JDK 1.8.0*/
@Service
public class LeaveServiceImpl extends ServiceImpl<LeaveMapper, Leaves> implements LeaveService {@Autowiredprivate RuntimeService runtimeservice;@Autowiredprivate IdentityService identityservice;@Autowiredprivate TaskService taskservice;/*** 开启一个流程** @param leave* @Param: [leave]* @return: org.activiti.engine.runtime.ProcessInstance* @Author: MaSiyi* @Date: 2021/12/3*/@Overridepublic String startLeave(Leaves leave) {leave.setId(UUID.randomUUID().toString().substring(0, 8));//设置用户identityservice.setAuthenticatedUserId(leave.getUserId());//使用leaveapply表的主键作为businesskey,连接业务数据和流程数据String businesskey = String.valueOf(leave.getId());//发起请假流程Map<String, Object> map = new HashMap<>();//下个步骤处理人map.put("deptleader", "Tom");ProcessInstance processInstance = runtimeservice.startProcessInstanceByKey("leave", businesskey, map);String instanceid = processInstance.getId();//关联流程表leave.setProcessInstanceId(instanceid);this.save(leave);return "申请成功";}/*** 获取待办列表** @param upcomingDto* @Param: [upcomingDto]* @return: java.util.List<com.wangfugui.activiti.dao.Leaves>* @Author: MaSiyi* @Date: 2021/12/3*/@Overridepublic List<LeaveVo> upcoming(UpcomingDto upcomingDto) {List<LeaveVo> leaves = new ArrayList<>();// 使用任务候选人查询待办列表List<Task> tasks = taskservice.createTaskQuery().taskAssignee(upcomingDto.getUsername()).taskName("部门领导审批").listPage(upcomingDto.getPage(), upcomingDto.getSize());for (Task task : tasks) {String instanceId = task.getProcessInstanceId();//查询正在运行的taskProcessInstance processInstance = runtimeservice.createProcessInstanceQuery().processInstanceId(instanceId).singleResult();String businessKey = processInstance.getBusinessKey();Leaves leave = this.getById(businessKey);LeaveVo leaveVo = new LeaveVo();BeanUtils.copyProperties(leave,leaveVo);leaveVo.setTaskId(task.getId());leaves.add(leaveVo);}return leaves;}/*** 审批任务* @Param: [taskid]* @return: java.lang.String* @Author: MaSiyi* @Date: 2021/12/3*/@Overridepublic String handle(HandleDto handleDto) {//完成指定任务taskservice.claim(handleDto.getTaskId(), handleDto.getUserName());//进行下一个任务Map<String, Object> variables = new HashMap<String, Object>();variables.put("deptleaderapprove", handleDto.getApprove());variables.put("hr", handleDto.getNextUserNam());taskservice.complete(handleDto.getTaskId(), variables);return "处理成功";}
}

这三个的解释已经写在代码里面啦,大家可以去看看注释

第十四步,我们来看一下我们的测试

发起一个流程


查询我们的待办


处理我们的待办


好了,今天的简单的基本方法就到这里了
下一篇介绍查看历史流程等的集成
今天我们来讲一下历史流程

第十五步首先我们要知道activiti中历史Service是HistoryService

所以我们第一步就将HistoryService注入进来

第十六步,编写获取历史流程方法

   @GetMapping("/myleave")@ApiOperation("我发起的请假流程")public List<LeaveVo> myleave(@RequestParam String userId) {return leaveService.myleave(userId);}

这个接口是根据userId获取发起的请假流程

    @GetMapping("/getHistory")@ApiOperation("获取历史流程信息")public HistoricProcessInstance getHistory(@RequestParam String procInstId) {return leaveService.getHiProcByProcInstId(procInstId);}

这个接口是什么呢 procInstId又是什么?


第三个接口

    @GetMapping("/getHiProcByProcKeyAndBusinessID")@ApiOperation("获取历史任务")public HistoricProcessInstance getHiProcByProcKeyAndBusinessID(@RequestParam String procKey, @RequestParam String businessID) {return leaveService.getHiProcByProcKeyAndBusinessID(procKey, businessID);}

procKey和businessID又是什么?

businessID是我们的业务主键

关联在这张表中


好了,富贵同学手敲不容易,整整两万个字符,希望能帮助到大家。完整代码请移至SpringBoot+Activiti 查看
希望大家点个赞和关注,谢谢大家

接私活/毕业设计必备,基于SpringBoot+Activiti的Java底层框架的实现相关推荐

  1. 基于SpringBoot+Email的Java底层框架的实现

    啦啦啦啦啦,富贵同学又开始开坑了,出了个免费的专栏,主要给大家从0基础开始用springBoot集成第三方的插件或者功能,如果这篇专栏能帮到你,一定不要忘了点一个赞哦!!欢迎大家收藏分享 还是老规矩, ...

  2. 【毕业设计】基于springboot + vue微信小程序商城

    目录 前言 创新点/亮点✨ 毕设目录 一.视频展示 二.系统介绍 三.项目地址 四.运行环境 五.设计模块 ①前台 ②后台 六.系统功能模块结构图 七. 准备阶段 ①使用真实支付 ②使用模拟支付 八. ...

  3. 【毕业设计】基于Springboot+vue.js的校园二手商城系统

    此为原创合作开发项目 [毕业设计]基于springboot+vue.js的校园二手商城系统 一.综述 二手市场在中国是一个不够完善和成熟的市场,尤其在大学校园内.随着经济的发展,大学生生活水平的不断提 ...

  4. java 快递项目_基于SpringBoot开发的Java快递代拿系统

    该项目基于 [基于SSM开发的Java快递代拿系统] 项目全面升级,使用当前最为流行的 SpringBoot 框架,相关技术栈全面更新!是您深入学习 SpringBoot 开发的最佳实践! 相关技术栈 ...

  5. 基于SpringBoot+Redis的JAVA+SQL电子通讯录系统

    基于SpringBoot+Redis的JAVA+SQL电子通讯录系统 1.包含源程序,数据库脚本.代码和数据库脚本都有详细注释. 2.课题设计仅供参考学习使用,可以在此基础上进行扩展完善 代码已经上传 ...

  6. 毕业设计:基于Springboot实现求职招聘,校园招聘系统

    作者主页:编程指南针 简介:Java领域优质创作者.CSDN博客专家  Java项目.简历模板.学习资料.面试题库.技术互助 文末获取源码 目录 一.项目概述..................... ...

  7. 毕业设计:基于Springboot实现物流统计分析系统

    项目编号:BS-XX-019 本系统主要实现针对物流公司车辆运营情况的数据分析.数据管理.以及统计功能: #### 涉及框架与技术 > echarts.管理台ui:X-admin > Sp ...

  8. java毕业设计成品基于SpringBoot体育用品购物商城-协同过滤推荐算法[包运行成功]

    一.项目介绍 java毕业设计计算机毕设项目之SpringBoot体育用品商城-协同过滤推荐算法,下订单模块用的是百度地图api_哔哩哔哩_bilibilijava毕业设计计算机毕设项目之Spring ...

  9. 毕业设计之基于springboot的开源商城系统

    一.介绍 本项目是一个基于springboot的开源商城系统 ,前后端分离. 二.功能模块 平台端 管理端 用户手机端 首页 会员 订单 商品 促销 店铺 运营 统计 设计 三.技术架构 前端 vue ...

最新文章

  1. php-5.2.3.tar.bz2.gz 的解压方法
  2. Python 绘图库 Matplotlib
  3. 【Elasticsearch】使用索引生命周期管理实现热温冷架构
  4. re模块常用修饰符_re模块中常用功能函数
  5. pso粒子群优化算法+MATLAB代码
  6. javabs架构实习管理系统计算机毕业设计MyBatis+系统+LW文档+源码+调试部署
  7. 地震数据.dat文件转.sgy文件
  8. Java实现LeetCode 5450. 满足条件的子序列数目(双指针)
  9. C语言编程入门——HelloWorld!
  10. 我的心酸求职之路:如果可以,去学Java、C,不要搞Python
  11. 明略科技吴明辉:每一次新数据都会带来商业模式的迭代
  12. Python高并发爬虫测评(2): 多进程, 多线程和异步协程哪个快?
  13. C语言入门——自我介绍
  14. 机器学习之决策树(Decision Tree)
  15. 抛开数学,一文了解推荐系统框架及原理
  16. oracle关键字 转译,ORACLE中ESCAPE关键字用法 换字符用法
  17. 基于Arduino开发板实现触摸式开关
  18. 为什么不允许程序直接访问计算机资源?
  19. 每天都做这17件事,让自己更加聪明
  20. 防疫期间健康险销售量高速增长;麦德龙PLUS会员在8个城市上线 | 美通企业日报...

热门文章

  1. 永不放弃--一个藏羚人的感人故事
  2. 网易免费邮箱的smtp 为何密码错误
  3. 微软同步备份工具SyncToy,值得使用
  4. linux服务器缓存环境memcached搭建及应用(java)
  5. 2023年云南大学现代技术教育考研上岸前辈备考经验
  6. 机器视觉_HALCON_示例实践_1.检测圆形
  7. 融入动画技术的交互应用-雪花
  8. 装修鸿蒙瓷砖选择,电视墙用什么材料好?实用与美观,到底该如何选?
  9. 瑞星发布中国用户最常用十大密码:abc123
  10. 如何才能通过一线互联网公司面试?下载量瞬秒百万