为了更好的方便定义部署流程,需要把activiti功能放置在页面中。其中流程的设定是特殊麻烦的。需要集成其他工具进行使用

依赖:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.4.5</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.jt</groupId><artifactId>ttestA</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.apache.xmlgraphics</groupId><artifactId>batik-transcoder</artifactId><version>1.7</version></dependency><dependency><groupId>org.apache.xmlgraphics</groupId><artifactId>batik-codec</artifactId><version>1.7</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jdbc</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web-services</artifactId></dependency><!--   springSecurity 依赖   --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency><!-- mysql  --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><!--引入activiti的springboot启动器 --><dependency><groupId>org.activiti</groupId><artifactId>activiti-spring-boot-starter</artifactId><version>7.1.0.M6</version><!--            <exclusions>--><!--                <exclusion>--><!--                    <artifactId>mybatis</artifactId>--><!--                    <groupId>org.mybatis</groupId>--><!--                </exclusion>--><!--            </exclusions>--></dependency><dependency><groupId>org.activiti</groupId><artifactId>activiti-diagram-rest</artifactId><!-- exclusions:activiti-diagram-rest中含有security的jar包,导致访问springbott需要登录,此处剔除登录--><exclusions><exclusion><artifactId>spring-security-config</artifactId><groupId>org.springframework.security</groupId></exclusion><exclusion><artifactId>spring-security-core</artifactId><groupId>org.springframework.security</groupId></exclusion><exclusion><artifactId>spring-security-crypto</artifactId><groupId>org.springframework.security</groupId></exclusion><exclusion><artifactId>spring-security-web</artifactId><groupId>org.springframework.security</groupId></exclusion></exclusions><version>5.22.0</version></dependency><dependency><groupId>org.activiti</groupId><artifactId>activiti-json-converter</artifactId><version>6.0.0</version></dependency><dependency><groupId>org.activiti</groupId><artifactId>activiti-modeler</artifactId><version>5.22.0</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.20</version><scope>provided</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId><scope>provided</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

application.yml配置:


server:port: 8091# Spring配置
spring:# activiti配置activiti:#自动更新数据库结构#1.flase:默认值。activiti在启动时,对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常#2.true: activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建#3.create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表)#4.drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎)database-schema-update: true#activiti7默认不生成历史信息表,开启历史表db-history-used: true#记录历史等级 可配置的历史级别有none, activity, audit, full#none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。#activity:级别高于none,保存流程实例与流程行为,其他数据不保存。#audit:除activity级别会保存的数据外,还会保存全部的流程任务及其属性。audit为history的默认值。#full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。history-level: full# =============================#自动检查、部署流程定义文件check-process-definitions: false# asyncExecutorActivate是指activiti在流程引擎启动就激活AsyncExecutor,异步:true-开启(默认)、false-关闭
#    async-executor-activate: true#流程定义文件存放目录,要具体到某个目录#      process-definition-location-prefix: classpath:/processes/holliday/#process-definition-location-suffixes: #流程文件格式#  - **.bpmn20.xml#  - **.bpmnapplication:name: weixinZFdatasource:#高版本驱动使用driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/activiti?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&nullCatalogMeansCurrent=true&autoReconnect=true&allowMultiQueries=true#设定用户名和密码username: rootpassword: rootjackson:date-format: yyyy-MM-dd HH:mm:sstime-zone: GMT+8#SpringBoot整合Mybatis
mybatis-plus:#指定别名包type-aliases-package: com.jt.pojo#扫描指定路径下的映射文件mapper-locations: classpath:/mapper/*.xml#开启驼峰映射configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl  #sql日志map-underscore-to-camel-case: true# 一二级缓存默认开始 所以可以简化
#打印mysql日志
logging:level:com.jt.mapper: debug

链接: https://pan.baidu.com/s/1TD2Ie84TyREoNkioj54F4g

提取码: qwer

从上方链接,或者自己去官网网站下载源码

将文件粘贴到controller层

ModelEditorJsonRestResource

打开在线编辑器时加载指定模型到页面

import org.activiti.editor.constants.ModelDataJsonConstants;
import org.activiti.engine.ActivitiException;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.Model;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;@RestController
public class ModelEditorJsonRestResource implements ModelDataJsonConstants {protected static final Logger LOGGER = LoggerFactory.getLogger(ModelEditorJsonRestResource.class);@Autowiredprivate RepositoryService repositoryService;@Autowiredprivate ObjectMapper objectMapper;@RequestMapping(value="/model/{modelId}/json", method = RequestMethod.GET, produces = "application/json")public ObjectNode getEditorJson(@PathVariable String modelId) {ObjectNode modelNode = null;Model model = repositoryService.getModel(modelId);if (model != null) {try {if (StringUtils.isNotEmpty(model.getMetaInfo())) {modelNode = (ObjectNode) objectMapper.readTree(model.getMetaInfo());} else {modelNode = objectMapper.createObjectNode();modelNode.put(MODEL_NAME, model.getName());}modelNode.put(MODEL_ID, model.getId());ObjectNode editorJsonNode = (ObjectNode) objectMapper.readTree(new String(repositoryService.getModelEditorSource(model.getId()), "utf-8"));modelNode.put("model", editorJsonNode);} catch (Exception e) {LOGGER.error("Error creating model JSON", e);throw new ActivitiException("Error creating model JSON", e);}}return modelNode;}
}

ModelSaveRestResource

保存流程图编辑器的信息
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;import org.activiti.editor.constants.ModelDataJsonConstants;
import org.activiti.engine.ActivitiException;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.Model;
import org.apache.batik.transcoder.TranscoderInput;
import org.apache.batik.transcoder.TranscoderOutput;
import org.apache.batik.transcoder.image.PNGTranscoder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.util.MultiValueMap;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;@RestController
public class ModelSaveRestResource implements ModelDataJsonConstants {protected static final Logger LOGGER = LoggerFactory.getLogger(ModelSaveRestResource.class);@Autowiredprivate RepositoryService repositoryService;@Autowiredprivate ObjectMapper objectMapper;/*** 保存流程图编辑器的信息* @param modelId* @param name* @param description* @param json_xml* @param svg_xml*/@RequestMapping(value = "/model/{modelId}/save", method = RequestMethod.PUT)@ResponseStatus(value = HttpStatus.OK)public void saveModel(@PathVariable String modelId, String name, String description, String json_xml, String svg_xml) {try {Model model = repositoryService.getModel(modelId);ObjectNode modelJson = (ObjectNode) objectMapper.readTree(model.getMetaInfo());modelJson.put(ModelDataJsonConstants.MODEL_NAME, name);modelJson.put(ModelDataJsonConstants.MODEL_DESCRIPTION, description);model.setMetaInfo(modelJson.toString());model.setName(name);model.setDeploymentId(null);Integer version = model.getVersion();version++;model.setVersion(version);repositoryService.saveModel(model);repositoryService.addModelEditorSource(model.getId(), json_xml.getBytes("utf-8"));InputStream svgStream = new ByteArrayInputStream(svg_xml.getBytes("utf-8"));TranscoderInput input = new TranscoderInput(svgStream);PNGTranscoder transcoder = new PNGTranscoder();// Setup outputByteArrayOutputStream outStream = new ByteArrayOutputStream();TranscoderOutput output = new TranscoderOutput(outStream);// Do the transformationtranscoder.transcode(input, output);final byte[] result = outStream.toByteArray();repositoryService.addModelEditorSourceExtra(model.getId(), result);outStream.close();} catch (Exception e) {LOGGER.error("Error saving model", e);throw new ActivitiException("Error saving model", e);}}
}

StencilsetRestResource

获取流程图编辑器的汉化文件 
import org.activiti.engine.ActivitiException;
import org.apache.commons.io.IOUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;@RestController
public class StencilsetRestResource {@RequestMapping(value="/editor/stencilset", method = RequestMethod.GET, produces = "application/json;charset=utf-8")public @ResponseBody String getStencilset() {InputStream stencilsetStream = this.getClass().getClassLoader().getResourceAsStream("stencilset.json");try {return IOUtils.toString(stencilsetStream, "utf-8");} catch (Exception e) {throw new ActivitiException("Error while loading stencil set", e);}}
}

将官方网站的这几个文件cv到resources中

修改app-cfg.js的配置


ACTIVITI.CONFIG = {// 'contextRoot' : '/activiti-explorer/service','contextRoot' : '',
};

配置WebSecurityConfig配置

因为包含security会让你填写账号密码,添加此配置跳过,不添加会让你输入账号密码,而且最后保存还会403

WebSecurityConfig


import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.stereotype.Component;@Component
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {@Overridepublic void configure(HttpSecurity httpSecurity) throws Exception {httpSecurity.csrf().disable();}
}

新建model

ModelTest 通过此路径跳转到页面

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import org.activiti.editor.constants.ModelDataJsonConstants;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.Model;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@Controller
@RequestMapping("model")
public class ModelTest {@RequestMapping("create")public void createModel(HttpServletRequest request, HttpServletResponse response){try{String modelName = "modelName";String modelKey = "modelKey";String description = "description";ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();RepositoryService repositoryService = processEngine.getRepositoryService();ObjectMapper objectMapper = new ObjectMapper();ObjectNode editorNode = objectMapper.createObjectNode();editorNode.put("id", "canvas");editorNode.put("resourceId", "canvas");ObjectNode stencilSetNode = objectMapper.createObjectNode();stencilSetNode.put("namespace", "http://b3mn.org/stencilset/bpmn2.0#");editorNode.put("stencilset", stencilSetNode);Model modelData = repositoryService.newModel();ObjectNode modelObjectNode = objectMapper.createObjectNode();modelObjectNode.put(ModelDataJsonConstants.MODEL_NAME, modelName);modelObjectNode.put(ModelDataJsonConstants.MODEL_REVISION, 1);modelObjectNode.put(ModelDataJsonConstants.MODEL_DESCRIPTION, description);modelData.setMetaInfo(modelObjectNode.toString());modelData.setName(modelName);modelData.setKey(modelKey);//保存模型repositoryService.saveModel(modelData);repositoryService.addModelEditorSource(modelData.getId(), editorNode.toString().getBytes("utf-8"));response.sendRedirect(request.getContextPath() + "/modeler.html?modelId=" + modelData.getId());}catch (Exception e){}}}

访问http://localhost:8091/model/create

以上完成即可在可视化页面进行添加!

对模型操作的接口:

package com.jt.controller;import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import lombok.extern.slf4j.Slf4j;
import org.activiti.bpmn.converter.BpmnXMLConverter;
import org.activiti.bpmn.model.BpmnModel;
import org.activiti.editor.constants.ModelDataJsonConstants;
import org.activiti.editor.language.json.converter.BpmnJsonConverter;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.Model;
import org.apache.commons.io.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayInputStream;
import java.io.OutputStream;
import java.net.URLEncoder;@RestController
@Slf4j
public class ssss {@Autowiredprivate RepositoryService repositoryService;/*** 导出指定模型xml 文件* @param modelId  模型的id* @param response*/@GetMapping(value = "export")public void export(@PathVariable String modelId, HttpServletResponse response) {try {Model modelData = repositoryService.getModel(modelId);BpmnJsonConverter jsonConverter = new BpmnJsonConverter();JsonNode editorNode = new ObjectMapper().readTree(repositoryService.getModelEditorSource(modelData.getId()));BpmnModel bpmnModel = jsonConverter.convertToBpmnModel(editorNode);BpmnXMLConverter xmlConverter = new BpmnXMLConverter();byte[] bpmnBytes = xmlConverter.convertToXML(bpmnModel);ByteArrayInputStream in = new ByteArrayInputStream(bpmnBytes);OutputStream outputStream = response.getOutputStream();IOUtils.copy(in, outputStream);String filename = bpmnModel.getMainProcess().getId() + ".bpmn.xml";response.setHeader("content-type", "application/octet-stream");response.setContentType("application/octet-stream;charset=UTF-8");response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, "utf-8"));outputStream.flush();outputStream.close();} catch (Exception e) {log.error("导出model的xml文件失败:{}", e.getMessage(), e);}}/*** 根据Model部署流程*/@PostMapping(value = "deploy/{modelId}")public R<String> deploy(@PathVariable("modelId") String modelId) {try {// 获取模型Model model = repositoryService.getModel(modelId);ObjectNode objectNode = (ObjectNode) new ObjectMapper().readTree(repositoryService.getModelEditorSource(model.getId()));BpmnModel bpmnModel = new BpmnJsonConverter().convertToBpmnModel(objectNode);String processName = model.getName()+".bpmn20.xml";byte[] bytes = new BpmnXMLConverter().convertToXML(bpmnModel);// 部署流程Deployment deployment = repositoryService.createDeployment().name(model.getName()).addString(processName, new String(bytes,"UTF-8")).deploy();System.out.println("流程部署id----"+deployment.getId());return R.OK(deployment.getId());} catch (Exception e) {log.error("根据模型部署流程失败:modelId={}", modelId, e);return R.ERROR();}}/*** 模型删除* @param request*/@GetMapping("/delete")public Resp<String> delete(HttpServletRequest request){String processId = request.getParameter("processId");System.out.println("processId is:" + processId);
//        if(StringUtils.isNotEmpty(processId)){
//            return Resp.ERROR(CodeMsgEnum.ERROR);
//        }Model model = repositoryService.getModel(processId);if(model!=null){System.out.println("指定模型存在");repositoryService.deleteModel(processId);}return Resp.OK_WITHOUT_DATA();}/*** 新增模型* @param request* @param response*/@RequestMapping("create")public void createModel(HttpServletRequest request, HttpServletResponse response){try{String modelName = "modelName";String modelKey = "modelKey";String description = "description";ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();RepositoryService repositoryService = processEngine.getRepositoryService();ObjectMapper objectMapper = new ObjectMapper();ObjectNode editorNode = objectMapper.createObjectNode();editorNode.put("id", "canvas");editorNode.put("resourceId", "canvas");ObjectNode stencilSetNode = objectMapper.createObjectNode();stencilSetNode.put("namespace", "http://b3mn.org/stencilset/bpmn2.0#");editorNode.put("stencilset", stencilSetNode);Model modelData = repositoryService.newModel();ObjectNode modelObjectNode = objectMapper.createObjectNode();modelObjectNode.put(ModelDataJsonConstants.MODEL_NAME, modelName);modelObjectNode.put(ModelDataJsonConstants.MODEL_REVISION, 1);modelObjectNode.put(ModelDataJsonConstants.MODEL_DESCRIPTION, description);modelData.setMetaInfo(modelObjectNode.toString());modelData.setName(modelName);modelData.setKey(modelKey);//保存模型repositoryService.saveModel(modelData);repositoryService.addModelEditorSource(modelData.getId(), editorNode.toString().getBytes("utf-8"));response.sendRedirect(request.getContextPath() + "/modeler.html?modelId=" + modelData.getId());}catch (Exception e){}}}

以上即是activiti链接可视化的操作。如需其他详细的操作,比如项目应用,参考以下文章:

Activiti7工作流引擎_Mr_Jin.的博客-CSDN博客

看完点个赞是对博主的支持哦~

Activiti结合Modeler 可视化操作界面相关推荐

  1. SPSS Modeler基础操作与模型求解

    SPSS Modeler简介 IBM SPSS Modeler前身是英国ISL公司开发的一款数据挖掘工具产品,1998年被SPSS公司收购,并重新整合开发. 由于SPSS Modeler拥有丰富的数据 ...

  2. 报表可视化源码,操作界面可视化,通过简易配置即可自动生成各种类型的报表,为企业节省大量的重复开发工作

    报表可视化,操作界面可视化,通过简易配置即可自动生成各种类型的报表,为企业节省大量的重复开发工作 数据管理 创建模板,使得Excel电子表格的数据 自动存入数据库,集中存储. 简化工作 自定义电子表格 ...

  3. vue3 项目创建(UI图形化界面方式,可视化操作Vue项目,vue ui)

    vue3 项目创建 (UI图形化界面方式,可视化操作Vue项目,vue ui) 目录 一.图形化界面方式搭建vue3 项目前提条件 1.检查node 和 @vue/cli 版本信息 2.升级你的 No ...

  4. Kubernetes(三)—操作可视化管理界面

    我们之前已经安装好了Kubernetes的可视化管理界面dashboard,今天我们进行一下操作 我们进入的时候,我们发现界面没有什么东西:这里就有一个东西叫命名空间--Namespace了 Name ...

  5. linux通过操作界面和命令行的方式查看ip地址、mac地址

    可视化界面操作方式 打开设置界面 选择网络选项 点击有线配置旁边的齿轮选项,查看有线配置详情 以此可以通过界面查看vmware虚拟机中linux的ip地址和mac地址等信息. 命令查看方式 多数情况下 ...

  6. svg 可视化操作_使用SVG和D3可视化浏览指标

    svg 可视化操作 本文是两篇系列文章中的第一篇,该系列文章演示了可视化技术,这些技术可以帮助您从数据中提取业务价值信息. 您将看到如何使用可伸缩矢量图形(SVG)和开放源代码的D3 JavaScri ...

  7. PLSQL的JOB启动与停止(可视化操作)

    前言 今天弄了一会plsql中的job.发现有个小地方还是有点绕,可能过段时间又忘记了,在此记录一下. 说明: 1.本章记录的是plsql里可视化操作job,并非命令. 2.本机使用的是汉化版,如果大 ...

  8. 用Python制作可视化GUI界面,一键实现证件照背景颜色的替换

    今天,我们来分享一下如何通过Python的十来行代码来替换证件照的背景颜色,那么在最后,小编也会将上述的流程制作成一个GUI界面来方便大家使用.关于界面的大致模样其实和先前的相差不大,大家应该都看过上 ...

  9. Linux - 可视化菜单界面设计

    优化屏幕刷新 问题 刷新多个窗体需要一些繁琐,在一个慢速的链接上,屏幕的绘制相当的慢 目标就是要尽量减少要在屏幕上的绘制的字符数 基本函数 int wnoutrefresh(WINDOW *windo ...

  10. Kubeadm 快速搭建 k8s 集群安装可视化管理界面

    文章目录 1. 实验准备 2. 安装 docker 3. 配置阿里云 K8S repo 源(三个节点) 4. 安装 kubeadm,kubelet,kubectl(三个节点) 5. 部署 kubern ...

最新文章

  1. 十年“老司机”的私家锦囊:10个编程技巧、5个纠错步骤,让你的编程之路少点坎坷
  2. Opencv-Python部署SIFT函数问题的处理
  3. 1013 Battle Over Cities (25 分) 【难度: 中 / 知识点: 连通块】
  4. From Hero to Zero
  5. 数据预处理--样本选择、交叉验证
  6. Mongodb 自动增长 自增id 实现
  7. 如何在 Visual Studio 2019 中连接中国版 Azure
  8. Java-所有类型的Class对象
  9. linux usr local权限,【linux】sudo chown -R $(whoami) /usr/local提示操作被拒绝
  10. mysql 日志抓取变化_MySQL慢查询日志分析提取【转】
  11. r.java自动删除变量_比较变量并删除一个最低值R [关闭]
  12. 修改Linux系统分区后挂载问题
  13. React Native学习总结第二天
  14. 小执着的伤感空间日志:童话般虚幻、却没有童话般的结局
  15. 亚马逊卖家运营必备八大工具
  16. 基于MATLAB的极限与求导(附完整代码)
  17. Microsoft Office SharePoint Server 2007案例实战开发
  18. 苹果v10模板需要几的php,苹果MACCMSv10源码模板安装常见问题
  19. linux防ddos攻击脚本,Linux IPTables防DDOS攻击Shell脚本
  20. 云南一脸通行业解决方案、钉钉智慧食堂、智慧餐厅、智慧工地解决方案

热门文章

  1. mysql拼图游戏代码_HTML+Javascript制作拼图小游戏详解(二)
  2. Caffe中求解器(Solver)介绍
  3. 如何用计算机设计衣服,如何用电脑设计服装
  4. 领先一步,步步领先:编程教育已进入中小学生课堂
  5. snownlp抛出错误_网易云评论爬虫及情感分析
  6. Typora开始收费,替代品marktext
  7. 反向翻译back-translations
  8. JTA transaction unexpectedly rolled back (maybe due to a timeout)
  9. linux 关于修改命令提示符
  10. 企业邮箱能帮企业带来哪些好处?