提交 7e9c9a9b authored 作者: 黄夏豪's avatar 黄夏豪

[工作流模块] 修复了 MapUtil工具合并出现线程不安全的问题

上级 bd829f52
...@@ -124,16 +124,16 @@ ...@@ -124,16 +124,16 @@
<!-- </excludes>--> <!-- </excludes>-->
<!-- <filtering>false</filtering>--> <!-- <filtering>false</filtering>-->
<!-- </resource>--> <!-- </resource>-->
<!-- <resource>--> <resource>
<!-- <directory>${project.basedir}/src/main/resources</directory>--> <directory>${project.basedir}/src/main/resources</directory>
<!-- <targetPath>META-INF/resources/</targetPath>--> <targetPath>META-INF/resources/</targetPath>
<!-- </resource>--> </resource>
</resources> </resources>
<plugins> <plugins>
<plugin> <!-- <plugin>-->
<groupId>org.springframework.boot</groupId> <!-- <groupId>org.springframework.boot</groupId>-->
<artifactId>spring-boot-maven-plugin</artifactId> <!-- <artifactId>spring-boot-maven-plugin</artifactId>-->
</plugin> <!-- </plugin>-->
<plugin> <plugin>
<artifactId>maven-surefire-plugin</artifactId> <artifactId>maven-surefire-plugin</artifactId>
......
...@@ -2,6 +2,7 @@ package com.tykj.workflowcore; ...@@ -2,6 +2,7 @@ package com.tykj.workflowcore;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration;
import org.springframework.transaction.annotation.EnableTransactionManagement; import org.springframework.transaction.annotation.EnableTransactionManagement;
/** /**
...@@ -13,8 +14,6 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; ...@@ -13,8 +14,6 @@ import org.springframework.transaction.annotation.EnableTransactionManagement;
public class WorkflowCoreApplication { public class WorkflowCoreApplication {
public static void main(String[] args) { public static void main(String[] args) {
SpringApplication.run(WorkflowCoreApplication.class, args); SpringApplication.run(WorkflowCoreApplication.class, args);
System.out.println( System.out.println(
"█▀▀▀▀▀▀▀█▀▀▀█▀▀▀█▀▀▀█▀█▀▀▀▀▀▀▀█\n" + "█▀▀▀▀▀▀▀█▀▀▀█▀▀▀█▀▀▀█▀█▀▀▀▀▀▀▀█\n" +
......
package com.tykj.workflowcore.api.service; package com.tykj.workflowcore.api.service;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.tykj.workflowcore.api.annotations.Callable; import com.tykj.workflowcore.api.annotations.Callable;
import com.tykj.workflowcore.api.annotations.CallableApi; import com.tykj.workflowcore.api.annotations.CallableApi;
import com.tykj.workflowcore.api.entity.ApiInfo; import com.tykj.workflowcore.api.entity.ApiInfo;
import com.tykj.workflowcore.api.entity.EntityInfo; import com.tykj.workflowcore.api.entity.EntityInfo;
import com.tykj.workflowcore.api.entity.Parameter; import com.tykj.workflowcore.api.entity.Parameter;
import com.tykj.workflowcore.base.result.ApiException;
import com.tykj.workflowcore.base.util.ClassUtil; import com.tykj.workflowcore.base.util.ClassUtil;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
...@@ -28,6 +31,8 @@ public class ApiService { ...@@ -28,6 +31,8 @@ public class ApiService {
private final SpringBeanService springBeanService; private final SpringBeanService springBeanService;
private static ObjectMapper objectMapper = new ObjectMapper();
public ApiService(SpringBeanService springBeanService) { public ApiService(SpringBeanService springBeanService) {
this.springBeanService = springBeanService; this.springBeanService = springBeanService;
} }
...@@ -138,7 +143,12 @@ public class ApiService { ...@@ -138,7 +143,12 @@ public class ApiService {
.map(this::getClass) .map(this::getClass)
.toArray(Class[]::new); .toArray(Class[]::new);
Method method = clz.getMethod(apiName, parameterTypes); Method method = clz.getMethod(apiName, parameterTypes);
Object bean = springBeanService.getBean(clz); Object bean = null;
try {
bean = springBeanService.getBean(clz);
}catch (Exception e){
bean = springBeanService.getBeanByClassName(clz.getName());
}
Object[] params = parameters.stream() Object[] params = parameters.stream()
.map(parameter -> toBean(parameter.getInstance(), getClass(parameter.getClassName()))) .map(parameter -> toBean(parameter.getInstance(), getClass(parameter.getClassName())))
.toArray(); .toArray();
...@@ -161,8 +171,16 @@ public class ApiService { ...@@ -161,8 +171,16 @@ public class ApiService {
/** /**
* 把map转成指定类型的JavaBean对象 * 把map转成指定类型的JavaBean对象
*/ */
public static <T> T toBean(Object o, Class<T> clazz) { public static <T> T toBean(Object o, Class<T> clazz) {
return JSON.parseObject(JSON.toJSONString(o), clazz); T t = null;
try {
t = objectMapper.readValue(JSON.toJSONString(o), clazz);
} catch (JsonProcessingException e) {
e.printStackTrace();
throw new ApiException("填充入参失败,json转换时发生错误");
}
return t;
} }
} }
\ No newline at end of file
package com.tykj.workflowcore.api.service; package com.tykj.workflowcore.api.service;
import com.tykj.workflowcore.api.controller.ApiController;
import org.springframework.beans.BeansException; import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware; import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import java.util.Locale;
import static java.util.Objects.isNull; import static java.util.Objects.isNull;
...@@ -26,6 +30,19 @@ public class SpringBeanService implements ApplicationContextAware { ...@@ -26,6 +30,19 @@ public class SpringBeanService implements ApplicationContextAware {
return this.applicationContext; return this.applicationContext;
} }
/**
* 通过name获取 Bean.
*/
public Object getBeanByClassName(String className){
if (StringUtils.isEmpty(className)){
return null;
}
int lastPoint = className.lastIndexOf(".");
className = className.substring(lastPoint+1);
className = className.substring(0,1).toLowerCase(Locale.ROOT)+className.substring(1);
return getApplicationContext().getBean(className);
}
/** /**
* 通过name获取 Bean. * 通过name获取 Bean.
*/ */
......
...@@ -39,8 +39,6 @@ public class WebMvcConfig { ...@@ -39,8 +39,6 @@ public class WebMvcConfig {
registry.addResourceHandler("/xml/**") registry.addResourceHandler("/xml/**")
.addResourceLocations("file:" + System.getProperty("user.dir") + File.separator+"xml"+File.separator); .addResourceLocations("file:" + System.getProperty("user.dir") + File.separator+"xml"+File.separator);
// .addResourceLocations("file:" + System.getProperty("user.dir") + "\\xml\\"); // .addResourceLocations("file:" + System.getProperty("user.dir") + "\\xml\\");
registry.addResourceHandler("/**")
.addResourceLocations("classpath:/workflow/");
} }
}; };
} }
......
...@@ -41,9 +41,6 @@ public class WorkflowCoreRunner implements CommandLineRunner { ...@@ -41,9 +41,6 @@ public class WorkflowCoreRunner implements CommandLineRunner {
@Autowired @Autowired
RuntimeService runtimeService; RuntimeService runtimeService;
@Autowired
ProcessEndListener processEndListener;
@Bean @Bean
ClassLoader initClassLoader(){ ClassLoader initClassLoader(){
return getClass().getClassLoader(); return getClass().getClassLoader();
......
package com.tykj.workflowcore.workflow_editer.controller; package com.tykj.workflowcore.workflow_editer.controller;
import com.tykj.workflowcore.base.result.ResultUtil; import com.tykj.workflowcore.base.result.ResultUtil;
import com.tykj.workflowcore.workflow_editer.entity.WorkFlowUser;
import com.tykj.workflowcore.workflow_editer.entity.vo.*; import com.tykj.workflowcore.workflow_editer.entity.vo.*;
import com.tykj.workflowcore.workflow_editer.service.FlowInfoService; import com.tykj.workflowcore.workflow_editer.service.FlowInfoService;
import com.tykj.workflowcore.workflow_editer.service.WorkFlowService; import com.tykj.workflowcore.workflow_editer.service.WorkFlowService;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.flowable.engine.history.HistoricActivityInstance;
import org.flowable.engine.history.HistoricProcessInstance;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
...@@ -98,6 +101,11 @@ public class WorkFlowController { ...@@ -98,6 +101,11 @@ public class WorkFlowController {
return workFlowService.findHistoryTask(); return workFlowService.findHistoryTask();
} }
@GetMapping("/findStartByUser")
@ApiOperation("查询我发起的流程")
public List<HistoricProcessInstance> findStartByUser(String userId) {
List<HistoricProcessInstance> startByUser = workFlowService.findStartByUser(userId);
return startByUser;
}
} }
...@@ -29,4 +29,5 @@ public class WorkFlowUser implements Serializable { ...@@ -29,4 +29,5 @@ public class WorkFlowUser implements Serializable {
private String userName; private String userName;
} }
...@@ -4,13 +4,14 @@ import com.tykj.workflowcore.api.controller.ApiController; ...@@ -4,13 +4,14 @@ import com.tykj.workflowcore.api.controller.ApiController;
import com.tykj.workflowcore.api.entity.InvokeRequest; import com.tykj.workflowcore.api.entity.InvokeRequest;
import com.tykj.workflowcore.api.entity.Parameter; import com.tykj.workflowcore.api.entity.Parameter;
import com.tykj.workflowcore.base.result.ApiException; import com.tykj.workflowcore.base.result.ApiException;
import com.tykj.workflowcore.workflow_editer.entity.JavaTypeEnum; import com.tykj.workflowcore.workflow_editer.entity.enums.JavaTypeEnum;
import com.tykj.workflowcore.workflow_editer.entity.VariableStorage; import com.tykj.workflowcore.workflow_editer.entity.VariableStorage;
import com.tykj.workflowcore.workflow_editer.entity.vo.ParameterVo; import com.tykj.workflowcore.workflow_editer.entity.vo.ParameterVo;
import com.tykj.workflowcore.workflow_editer.entity.vo.SearchVariableStorageVo; import com.tykj.workflowcore.workflow_editer.entity.vo.SearchVariableStorageVo;
import com.tykj.workflowcore.workflow_editer.service.DataHistoryService; import com.tykj.workflowcore.workflow_editer.service.DataHistoryService;
import com.tykj.workflowcore.workflow_editer.service.VariableStorageService; import com.tykj.workflowcore.workflow_editer.service.VariableStorageService;
import org.flowable.bpmn.model.EndEvent; import org.flowable.bpmn.model.EndEvent;
import org.flowable.bpmn.model.UserTask;
import org.flowable.common.engine.api.delegate.Expression; import org.flowable.common.engine.api.delegate.Expression;
import org.flowable.common.engine.api.delegate.event.FlowableEngineEntityEvent; import org.flowable.common.engine.api.delegate.event.FlowableEngineEntityEvent;
import org.flowable.common.engine.api.delegate.event.FlowableEvent; import org.flowable.common.engine.api.delegate.event.FlowableEvent;
...@@ -79,7 +80,7 @@ public class ProcessEndListener extends AbstractFlowableEngineEventListener { ...@@ -79,7 +80,7 @@ public class ProcessEndListener extends AbstractFlowableEngineEventListener {
super.activityCompleted(event); super.activityCompleted(event);
if (event instanceof FlowableActivityEventImpl){ if (event instanceof FlowableActivityEventImpl){
DelegateExecution execution = ((FlowableActivityEventImpl) event).getExecution(); DelegateExecution execution = ((FlowableActivityEventImpl) event).getExecution();
if (execution.getCurrentFlowElement() instanceof EndEvent){ if (execution.getCurrentFlowElement() instanceof EndEvent || execution.getCurrentFlowElement() instanceof UserTask){
System.out.println("流程结束了"); System.out.println("流程结束了");
//拿到流程定义ID //拿到流程定义ID
String processDefinitionId = execution.getProcessDefinitionId(); String processDefinitionId = execution.getProcessDefinitionId();
......
...@@ -2,6 +2,7 @@ package com.tykj.workflowcore.workflow_editer.service; ...@@ -2,6 +2,7 @@ package com.tykj.workflowcore.workflow_editer.service;
import com.tykj.workflowcore.workflow_editer.entity.FlowsInfo; import com.tykj.workflowcore.workflow_editer.entity.FlowsInfo;
import com.tykj.workflowcore.workflow_editer.entity.vo.*; import com.tykj.workflowcore.workflow_editer.entity.vo.*;
import org.flowable.engine.history.HistoricProcessInstance;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
...@@ -156,5 +157,8 @@ public interface WorkFlowService { ...@@ -156,5 +157,8 @@ public interface WorkFlowService {
String getCurrentProcId(String taskId); String getCurrentProcId(String taskId);
List<HistoricProcessInstance> findStartByUser(String userId);
} }
...@@ -20,6 +20,7 @@ import org.flowable.bpmn.model.*; ...@@ -20,6 +20,7 @@ import org.flowable.bpmn.model.*;
import org.flowable.bpmn.model.Process; import org.flowable.bpmn.model.Process;
import org.flowable.common.engine.impl.identity.Authentication; import org.flowable.common.engine.impl.identity.Authentication;
import org.flowable.engine.*; import org.flowable.engine.*;
import org.flowable.engine.history.HistoricProcessInstance;
import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl; import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl;
import org.flowable.engine.repository.Deployment; import org.flowable.engine.repository.Deployment;
import org.flowable.engine.runtime.ProcessInstance; import org.flowable.engine.runtime.ProcessInstance;
...@@ -313,9 +314,9 @@ public class WorkFlowServiceImpl implements WorkFlowService { ...@@ -313,9 +314,9 @@ public class WorkFlowServiceImpl implements WorkFlowService {
public void startFlow(@RequestBody StartFlowVo startFlowVo) { public void startFlow(@RequestBody StartFlowVo startFlowVo) {
//设置流程发起人 //设置流程发起人
WorkFlowUser currentUser = userService.getCurrentUser(); WorkFlowUser currentUser = userService.getCurrentUser();
Authentication.setAuthenticatedUserId(currentUser.getId() + ""); ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(startFlowVo.getFlowKey(),currentUser.getId(),
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(startFlowVo.getFlowKey(),startFlowVo.getFlowKey(),
startFlowVo.getMap()); startFlowVo.getMap());
// 存储流程实例id // 存储流程实例id
// 根据flowKey查询出一个FlowInfo // 根据flowKey查询出一个FlowInfo
// FlowsInfo flowsInfo = flowsInfoMapper.findByFlowKey(startFlowVo.getFlowKey()); // FlowsInfo flowsInfo = flowsInfoMapper.findByFlowKey(startFlowVo.getFlowKey());
...@@ -431,8 +432,6 @@ public class WorkFlowServiceImpl implements WorkFlowService { ...@@ -431,8 +432,6 @@ public class WorkFlowServiceImpl implements WorkFlowService {
//归还 //归还
taskService.setAssignee(task.getId(),null); taskService.setAssignee(task.getId(),null);
} }
} }
@Override @Override
...@@ -540,7 +539,7 @@ public class WorkFlowServiceImpl implements WorkFlowService { ...@@ -540,7 +539,7 @@ public class WorkFlowServiceImpl implements WorkFlowService {
// List<HistoricTaskInstance> taskInstanceList = // List<HistoricTaskInstance> taskInstanceList =
// historyService.createHistoricTaskInstanceQuery().taskCandidateUser(userId).finished().list(); // historyService.createHistoricTaskInstanceQuery().taskCandidateUser(userId).finished().list();
List<HistoricTaskInstance> taskInstanceList = List<HistoricTaskInstance> taskInstanceList =
historyService.createHistoricTaskInstanceQuery().taskAssignee(userService.getCurrentUser().getId()+"").orderByTaskCreateTime().desc().list(); historyService.createHistoricTaskInstanceQuery().taskAssignee(userService.getCurrentUser().getId()+"").orderByHistoricTaskInstanceStartTime().desc().list();
ArrayList<Object> arrayList = new ArrayList<>(); ArrayList<Object> arrayList = new ArrayList<>();
arrayList.addAll(taskInstanceList); arrayList.addAll(taskInstanceList);
return arrayList; return arrayList;
...@@ -562,6 +561,14 @@ public class WorkFlowServiceImpl implements WorkFlowService { ...@@ -562,6 +561,14 @@ public class WorkFlowServiceImpl implements WorkFlowService {
return null; return null;
} }
@Override
public List<HistoricProcessInstance> findStartByUser(String userId) {
//先获取流程的businesskey
List<HistoricProcessInstance> historicProcessInstances =
historyService.createHistoricProcessInstanceQuery().processInstanceBusinessKey(userId).list();
return historicProcessInstances;
}
@Override @Override
public Map<String, Object> setVariables(@RequestBody Map<String, Object> maxMap) { public Map<String, Object> setVariables(@RequestBody Map<String, Object> maxMap) {
Map<String, Object> map = new HashMap<>(); Map<String, Object> map = new HashMap<>();
...@@ -569,9 +576,4 @@ public class WorkFlowServiceImpl implements WorkFlowService { ...@@ -569,9 +576,4 @@ public class WorkFlowServiceImpl implements WorkFlowService {
return map; return map;
} }
public static void main(String[] args) {
System.out.println("1");
}
} }
...@@ -2,8 +2,10 @@ package com.tykj.workflowcore.workflow_editer.util; ...@@ -2,8 +2,10 @@ package com.tykj.workflowcore.workflow_editer.util;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import java.util.LinkedHashMap;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
/** /**
* ClassName: MapUtils * ClassName: MapUtils
...@@ -14,6 +16,21 @@ import java.util.Set; ...@@ -14,6 +16,21 @@ import java.util.Set;
* @Author: zsp * @Author: zsp
*/ */
public class MapUtils { public class MapUtils {
public static void main(String[] args) {
ConcurrentHashMap concurrentHashMap1 = new ConcurrentHashMap();
ConcurrentHashMap concurrentHashMap2 = new ConcurrentHashMap();
LinkedHashMap linkedHashMapa = new LinkedHashMap();
LinkedHashMap linkedHashMapb = new LinkedHashMap();
linkedHashMapa.put("b","a");
linkedHashMapb.put("c","a");
concurrentHashMap1.put("a",linkedHashMapa);
concurrentHashMap2.put("a",linkedHashMapb);
loopMap(concurrentHashMap1,"",concurrentHashMap2);
System.out.println("1");
}
public static void loopMap(Map m1, String p, Map m2) { public static void loopMap(Map m1, String p, Map m2) {
m1.forEach((key, value) -> { m1.forEach((key, value) -> {
Set mapKeySetByPath = getMapKeySetByPath(m2, p + "." + key); Set mapKeySetByPath = getMapKeySetByPath(m2, p + "." + key);
...@@ -27,6 +44,13 @@ public class MapUtils { ...@@ -27,6 +44,13 @@ public class MapUtils {
}); });
} }
if (value instanceof Map) { if (value instanceof Map) {
//转为ConcurrentMap不然合并的时候回出错
if (!(value instanceof ConcurrentHashMap)){
ConcurrentHashMap concurrentHashMapValue = new ConcurrentHashMap();
concurrentHashMapValue.putAll((Map) value);
value = concurrentHashMapValue;
m1.put(key,value);
}
String path; String path;
if (StringUtils.isEmpty(p)) { if (StringUtils.isEmpty(p)) {
path = (String) key; path = (String) key;
......
...@@ -2,7 +2,7 @@ spring: ...@@ -2,7 +2,7 @@ spring:
datasource: datasource:
username: root username: root
password: Huang123+ password: Huang123+
url: jdbc:mysql://47.106.142.73:3306/www3?useSSL=false&serverTimezone=GMT%2b8&characterEncoding=utf-8&nullCatalogMeansCurrent=true url: jdbc:mysql://47.106.142.73:3306/www_hxh?useSSL=false&serverTimezone=GMT%2b8&characterEncoding=utf-8&nullCatalogMeansCurrent=true
driver-class-name: com.mysql.cj.jdbc.Driver driver-class-name: com.mysql.cj.jdbc.Driver
jpa: jpa:
show-sql: true show-sql: true
......
<!doctype html><html lang="zh"><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=0,maximum-scale=0,user-scalable=yes,shrink-to-fit=no"><link rel="icon" href="favicon.ico"><title>workFlow</title><style>.pre-loader{position:absolute;top:calc(50% - 32px);left:calc(50% - 32px);width:64px;height:64px;border-radius:50%;perspective:800px}.pre-loader .inner{position:absolute;box-sizing:border-box;width:100%;height:100%;border-radius:50%}.pre-loader .inner.one{left:0;top:0;-webkit-animation:rotate-one 1s linear infinite;animation:rotate-one 1s linear infinite;border-bottom:3px solid #bc9048}.pre-loader .inner.two{right:0;top:0;-webkit-animation:rotate-two 1s linear infinite;animation:rotate-two 1s linear infinite;border-right:3px solid #74aeff}.pre-loader .inner.three{right:0;bottom:0;-webkit-animation:rotate-three 1s linear infinite;animation:rotate-three 1s linear infinite;border-top:3px solid #caef74}@keyframes rotate-one{0%{-webkit-transform:rotateX(35deg) rotateY(-45deg) rotateZ(0);transform:rotateX(35deg) rotateY(-45deg) rotateZ(0)}100%{-webkit-transform:rotateX(35deg) rotateY(-45deg) rotateZ(360deg);transform:rotateX(35deg) rotateY(-45deg) rotateZ(360deg)}}@keyframes rotate-two{0%{-webkit-transform:rotateX(50deg) rotateY(10deg) rotateZ(0);transform:rotateX(50deg) rotateY(10deg) rotateZ(0)}100%{-webkit-transform:rotateX(50deg) rotateY(10deg) rotateZ(360deg);transform:rotateX(50deg) rotateY(10deg) rotateZ(360deg)}}@keyframes rotate-three{0%{-webkit-transform:rotateX(35deg) rotateY(55deg) rotateZ(0);transform:rotateX(35deg) rotateY(55deg) rotateZ(0)}100%{-webkit-transform:rotateX(35deg) rotateY(55deg) rotateZ(360deg);transform:rotateX(35deg) rotateY(55deg) rotateZ(360deg)}}</style><link href="https://lib.baomitu.com/element-ui/2.13.2/theme-chalk/index.css" rel="stylesheet"><link href="https://lib.baomitu.com/monaco-editor/0.19.3/min/vs/editor/editor.main.css" rel="stylesheet"><script src="https://lib.baomitu.com/vue/2.6.11/vue.min.js"></script><script src="https://lib.baomitu.com/vue-router/3.1.3/vue-router.min.js"></script><script src="https://lib.baomitu.com/element-ui/2.13.2/index.js"></script><link href="css/chunk-3490531b.f21179c2.css" rel="prefetch"><link href="css/chunk-61bf0148.dfa0bf94.css" rel="prefetch"><link href="css/chunk-79a2a6d4.f7ea5f40.css" rel="prefetch"><link href="css/chunk-7c52297c.61b80532.css" rel="prefetch"><link href="css/chunk-8214a130.1828ab11.css" rel="prefetch"><link href="css/chunk-b5da06ba.7a6ae39b.css" rel="prefetch"><link href="css/chunk-d7adda04.ef613c84.css" rel="prefetch"><link href="css/parser-home.137a6b9f.css" rel="prefetch"><link href="css/tinymce-example.0e433876.css" rel="prefetch"><link href="js/chunk-3490531b.dccf3627.js" rel="prefetch"><link href="js/chunk-61bf0148.806d1258.js" rel="prefetch"><link href="js/chunk-79a2a6d4.b1d5b12d.js" rel="prefetch"><link href="js/chunk-7c52297c.c0a80b51.js" rel="prefetch"><link href="js/chunk-8214a130.971aff55.js" rel="prefetch"><link href="js/chunk-b5da06ba.6d3fd328.js" rel="prefetch"><link href="js/chunk-d7adda04.cddad5a4.js" rel="prefetch"><link href="js/chunk-fec0be80.0583a8a1.js" rel="prefetch"><link href="js/parser-home.8d475fe7.js" rel="prefetch"><link href="js/tinymce-example.0cafa1e6.js" rel="prefetch"><link href="css/index.b75d9c3c.css" rel="preload" as="style"><link href="js/chunk-vendors.b6d9e7af.js" rel="preload" as="script"><link href="js/index.c1637e00.js" rel="preload" as="script"><link href="css/index.b75d9c3c.css" rel="stylesheet"></head><body><noscript><strong>抱歉,javascript被禁用,请开启后重试。</strong></noscript><div id="app"></div><div class="pre-loader" id="pre-loader"><div class="inner one"></div><div class="inner two"></div><div class="inner three"></div></div><script src="js/chunk-vendors.b6d9e7af.js"></script><script src="js/index.c1637e00.js"></script></body></html> <!doctype html><html lang="zh"><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=0,maximum-scale=0,user-scalable=yes,shrink-to-fit=no"><link rel="icon" href="favicon.ico"><title>form-generator</title><style>.pre-loader{position:absolute;top:calc(50% - 32px);left:calc(50% - 32px);width:64px;height:64px;border-radius:50%;perspective:800px}.pre-loader .inner{position:absolute;box-sizing:border-box;width:100%;height:100%;border-radius:50%}.pre-loader .inner.one{left:0;top:0;-webkit-animation:rotate-one 1s linear infinite;animation:rotate-one 1s linear infinite;border-bottom:3px solid #bc9048}.pre-loader .inner.two{right:0;top:0;-webkit-animation:rotate-two 1s linear infinite;animation:rotate-two 1s linear infinite;border-right:3px solid #74aeff}.pre-loader .inner.three{right:0;bottom:0;-webkit-animation:rotate-three 1s linear infinite;animation:rotate-three 1s linear infinite;border-top:3px solid #caef74}@keyframes rotate-one{0%{-webkit-transform:rotateX(35deg) rotateY(-45deg) rotateZ(0);transform:rotateX(35deg) rotateY(-45deg) rotateZ(0)}100%{-webkit-transform:rotateX(35deg) rotateY(-45deg) rotateZ(360deg);transform:rotateX(35deg) rotateY(-45deg) rotateZ(360deg)}}@keyframes rotate-two{0%{-webkit-transform:rotateX(50deg) rotateY(10deg) rotateZ(0);transform:rotateX(50deg) rotateY(10deg) rotateZ(0)}100%{-webkit-transform:rotateX(50deg) rotateY(10deg) rotateZ(360deg);transform:rotateX(50deg) rotateY(10deg) rotateZ(360deg)}}@keyframes rotate-three{0%{-webkit-transform:rotateX(35deg) rotateY(55deg) rotateZ(0);transform:rotateX(35deg) rotateY(55deg) rotateZ(0)}100%{-webkit-transform:rotateX(35deg) rotateY(55deg) rotateZ(360deg);transform:rotateX(35deg) rotateY(55deg) rotateZ(360deg)}}</style><link href="https://lib.baomitu.com/element-ui/2.13.2/theme-chalk/index.css" rel="stylesheet"><link href="https://lib.baomitu.com/monaco-editor/0.19.3/min/vs/editor/editor.main.css" rel="stylesheet"><script src="https://lib.baomitu.com/vue/2.6.11/vue.min.js"></script><script src="https://lib.baomitu.com/vue-router/3.1.3/vue-router.min.js"></script><script src="https://lib.baomitu.com/element-ui/2.13.2/index.js"></script><link href="css/chunk-1cb74270.df914389.css" rel="prefetch"><link href="css/chunk-2073d156.c465d3db.css" rel="prefetch"><link href="css/chunk-7c2866c4.7b2248cd.css" rel="prefetch"><link href="css/chunk-7c52297c.61b80532.css" rel="prefetch"><link href="css/chunk-b5da06ba.7a6ae39b.css" rel="prefetch"><link href="css/chunk-cf704b6c.88ae3788.css" rel="prefetch"><link href="css/chunk-e449bc78.2eef857d.css" rel="prefetch"><link href="css/parser-home.53fe4753.css" rel="prefetch"><link href="css/tinymce-example.0e433876.css" rel="prefetch"><link href="js/chunk-1cb74270.2f2d988b.js" rel="prefetch"><link href="js/chunk-2073d156.841cd6cc.js" rel="prefetch"><link href="js/chunk-7c2866c4.dccd339b.js" rel="prefetch"><link href="js/chunk-7c52297c.c0a80b51.js" rel="prefetch"><link href="js/chunk-b5da06ba.6d3fd328.js" rel="prefetch"><link href="js/chunk-cf704b6c.61cc1cc8.js" rel="prefetch"><link href="js/chunk-e449bc78.f5c7b876.js" rel="prefetch"><link href="js/chunk-fec0be80.0583a8a1.js" rel="prefetch"><link href="js/parser-home.4f810414.js" rel="prefetch"><link href="js/tinymce-example.0cafa1e6.js" rel="prefetch"><link href="css/index.a25a2b8f.css" rel="preload" as="style"><link href="js/chunk-vendors.b6d9e7af.js" rel="preload" as="script"><link href="js/index.95019dd8.js" rel="preload" as="script"><link href="css/index.a25a2b8f.css" rel="stylesheet"></head><body><noscript><strong>抱歉,javascript被禁用,请开启后重试。</strong></noscript><div id="app"></div><div class="pre-loader" id="pre-loader"><div class="inner one"></div><div class="inner two"></div><div class="inner three"></div></div><script src="js/chunk-vendors.b6d9e7af.js"></script><script src="js/index.95019dd8.js"></script></body></html>
\ No newline at end of file \ No newline at end of file
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论