提交 d7c0c94b 编写于 作者: Skyeye云's avatar Skyeye云

工作流汉化,流程设计完成

上级 58967b2d
此差异已折叠。
此差异已折叠。
package com.skyeye.activiti.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.skyeye.activiti.service.ActivitiModelService;
import com.skyeye.common.object.InputObject;
import com.skyeye.common.object.OutputObject;
@Controller
public class ActivitiModelController {
@Autowired
private ActivitiModelService activitiModelService;
/**
*
* @Title: insertNewActivitiModel
* @Description: 新建一个空模型
* @param @param inputObject
* @param @param outputObject
* @param @throws Exception 参数
* @return void 返回类型
* @throws
*/
@RequestMapping("/post/ActivitiModelController/insertNewActivitiModel")
@ResponseBody
public void insertNewActivitiModel(InputObject inputObject, OutputObject outputObject) throws Exception{
activitiModelService.insertNewActivitiModel(inputObject, outputObject);
}
/**
*
* @Title: queryActivitiModelList
* @Description: 获取所有模型
* @param @param inputObject
* @param @param outputObject
* @param @throws Exception 参数
* @return void 返回类型
* @throws
*/
@RequestMapping("/post/ActivitiModelController/queryActivitiModelList")
@ResponseBody
public void queryActivitiModelList(InputObject inputObject, OutputObject outputObject) throws Exception{
activitiModelService.queryActivitiModelList(inputObject, outputObject);
}
/**
*
* @Title: editActivitiModelToDeploy
* @Description: 发布模型为流程定义
* @param @param inputObject
* @param @param outputObject
* @param @throws Exception 参数
* @return void 返回类型
* @throws
*/
@RequestMapping("/post/ActivitiModelController/editActivitiModelToDeploy")
@ResponseBody
public void editActivitiModelToDeploy(InputObject inputObject, OutputObject outputObject) throws Exception{
activitiModelService.editActivitiModelToDeploy(inputObject, outputObject);
}
/**
*
* @Title: editActivitiModelToStartProcess
* @Description: 启动流程
* @param @param inputObject
* @param @param outputObject
* @param @throws Exception 参数
* @return void 返回类型
* @throws
*/
@RequestMapping("/post/ActivitiModelController/editActivitiModelToStartProcess")
@ResponseBody
public void editActivitiModelToStartProcess(InputObject inputObject, OutputObject outputObject) throws Exception{
activitiModelService.editActivitiModelToStartProcess(inputObject, outputObject);
}
/**
*
* @Title: editActivitiModelToRun
* @Description: 提交任务
* @param @param inputObject
* @param @param outputObject
* @param @throws Exception 参数
* @return void 返回类型
* @throws
*/
@RequestMapping("/post/ActivitiModelController/editActivitiModelToRun")
@ResponseBody
public void editActivitiModelToRun(InputObject inputObject, OutputObject outputObject) throws Exception{
activitiModelService.editActivitiModelToRun(inputObject, outputObject);
}
/**
*
* @Title: deleteActivitiModelById
* @Description: 删除模型
* @param @param inputObject
* @param @param outputObject
* @param @throws Exception 参数
* @return void 返回类型
* @throws
*/
@RequestMapping("/post/ActivitiModelController/deleteActivitiModelById")
@ResponseBody
public void deleteActivitiModelById(InputObject inputObject, OutputObject outputObject) throws Exception{
activitiModelService.deleteActivitiModelById(inputObject, outputObject);
}
}
package com.skyeye.activiti.service;
import com.skyeye.common.object.InputObject;
import com.skyeye.common.object.OutputObject;
public interface ActivitiModelService {
public void insertNewActivitiModel(InputObject inputObject, OutputObject outputObject) throws Exception;
public void queryActivitiModelList(InputObject inputObject, OutputObject outputObject) throws Exception;
public void editActivitiModelToDeploy(InputObject inputObject, OutputObject outputObject) throws Exception;
public void editActivitiModelToStartProcess(InputObject inputObject, OutputObject outputObject) throws Exception;
public void editActivitiModelToRun(InputObject inputObject, OutputObject outputObject) throws Exception;
public void deleteActivitiModelById(InputObject inputObject, OutputObject outputObject) throws Exception;
}
package com.skyeye.activiti.service.impl;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
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.RepositoryService;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.Model;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.skyeye.activiti.service.ActivitiModelService;
import com.skyeye.common.object.InputObject;
import com.skyeye.common.object.OutputObject;
import com.skyeye.common.util.ToolUtil;
@Service
public class ActivitiModelServiceImpl implements ActivitiModelService{
@Autowired
private ProcessEngine processEngine;
@Autowired
private ObjectMapper objectMapper;
@Autowired
private RepositoryService repositoryService;
/**
*
* @Title: insertNewActivitiModel
* @Description: 新建一个空模型
* @param @param inputObject
* @param @param outputObject
* @param @throws Exception 参数
* @return void 返回类型
* @throws
*/
@SuppressWarnings("deprecation")
@Override
public void insertNewActivitiModel(InputObject inputObject, OutputObject outputObject) throws Exception {
Map<String, Object> map = inputObject.getParams();
RepositoryService repositoryService = processEngine.getRepositoryService();
//初始化一个空模型
Model model = repositoryService.newModel();
//设置一些默认信息
String name = "new-process";
String description = "";
int revision = 1;
String key = "process";
ObjectNode modelNode = objectMapper.createObjectNode();
modelNode.put(ModelDataJsonConstants.MODEL_NAME, name);
modelNode.put(ModelDataJsonConstants.MODEL_DESCRIPTION, description);
modelNode.put(ModelDataJsonConstants.MODEL_REVISION, revision);
model.setName(name);
model.setKey(key);
model.setMetaInfo(modelNode.toString());
repositoryService.saveModel(model);
String id = model.getId();
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);
repositoryService.addModelEditorSource(id,editorNode.toString().getBytes("utf-8"));
map.put("id", model.getId());
outputObject.setBean(map);
}
/**
*
* @Title: queryActivitiModelList
* @Description: 获取所有模型
* @param @param inputObject
* @param @param outputObject
* @param @throws Exception 参数
* @return void 返回类型
* @throws
*/
@Override
public void queryActivitiModelList(InputObject inputObject, OutputObject outputObject) throws Exception {
RepositoryService repositoryService = processEngine.getRepositoryService();
List<Model> beans = repositoryService.createModelQuery().list();
List<Map<String, Object>> rows = new ArrayList<>();
for(Model model : beans){
rows.add(ToolUtil.javaBean2Map(model));
}
outputObject.setBeans(rows);
}
/**
*
* @Title: editActivitiModelToDeploy
* @Description: 发布模型为流程定义
* @param @param inputObject
* @param @param outputObject
* @param @throws Exception 参数
* @return void 返回类型
* @throws
*/
@Override
public void editActivitiModelToDeploy(InputObject inputObject, OutputObject outputObject) throws Exception {
Map<String, Object> map = inputObject.getParams();
String modelId = map.get("modelId").toString();
//获取模型
RepositoryService repositoryService = processEngine.getRepositoryService();
Model modelData = repositoryService.getModel(modelId);
byte[] bytes = repositoryService.getModelEditorSource(modelData.getId());
if (bytes == null) {
outputObject.setreturnMessage("模型数据为空,请先设计流程并成功保存,再进行发布。");
}else{
JsonNode modelNode = new ObjectMapper().readTree(bytes);
BpmnModel model = new BpmnJsonConverter().convertToBpmnModel(modelNode);
if(model.getProcesses().size()==0){
outputObject.setreturnMessage("数据模型不符要求,请至少设计一条主线流程。");
}else{
byte[] bpmnBytes = new BpmnXMLConverter().convertToXML(model);
//发布流程
String processName = modelData.getName() + ".bpmn20.xml";
Deployment deployment = repositoryService.createDeployment()
.name(modelData.getName())
.addString(processName, new String(bpmnBytes, "UTF-8"))
.deploy();
modelData.setDeploymentId(deployment.getId());
repositoryService.saveModel(modelData);
}
}
}
/**
*
* @Title: editActivitiModelToStartProcess
* @Description: 启动流程
* @param @param inputObject
* @param @param outputObject
* @param @throws Exception 参数
* @return void 返回类型
* @throws
*/
@Override
public void editActivitiModelToStartProcess(InputObject inputObject, OutputObject outputObject) throws Exception {
Map<String, Object> map = inputObject.getParams();
String keyName = map.get("keyName").toString();
ProcessInstance process = processEngine.getRuntimeService().startProcessInstanceByKey(keyName);
map.clear();
map.put("id", process.getId());
map.put("processDefinitionId", process.getProcessDefinitionId());
outputObject.setBean(map);
}
/**
*
* @Title: editActivitiModelToRun
* @Description: 提交任务
* @param @param inputObject
* @param @param outputObject
* @param @throws Exception 参数
* @return void 返回类型
* @throws
*/
@Override
public void editActivitiModelToRun(InputObject inputObject, OutputObject outputObject) throws Exception {
Map<String, Object> map = inputObject.getParams();
String processInstanceId = map.get("processInstanceId").toString();
Task task = processEngine.getTaskService().createTaskQuery().processInstanceId(processInstanceId).singleResult();
processEngine.getTaskService().complete(task.getId());
}
/**
*
* @Title: deleteActivitiModelById
* @Description: 删除模型
* @param @param inputObject
* @param @param outputObject
* @param @throws Exception 参数
* @return void 返回类型
* @throws
*/
@Override
public void deleteActivitiModelById(InputObject inputObject, OutputObject outputObject) throws Exception {
Map<String, Object> map = inputObject.getParams();
String id = map.get("id").toString();
repositoryService.deleteModel(id);
}
}
...@@ -16,7 +16,7 @@ public class Constants { ...@@ -16,7 +16,7 @@ public class Constants {
* 过滤器过滤文件目录请求项 * 过滤器过滤文件目录请求项
*/ */
public static final String[] FILTER_FILE_CATALOG_OPTION = { "/html", public static final String[] FILTER_FILE_CATALOG_OPTION = { "/html",
"/css", "/js", "/assets", "/tpl", "/images", "/template" }; "/css", "/js", "/assets", "/tpl", "/images", "/template", "/static" };
/** /**
* 过滤器过滤文件后缀请求项 * 过滤器过滤文件后缀请求项
...@@ -35,6 +35,7 @@ public class Constants { ...@@ -35,6 +35,7 @@ public class Constants {
* 过滤器过滤请求类型项 * 过滤器过滤请求类型项
*/ */
public static final String[] FILTER_FILE_REQUEST_OPTION = { "/post", "/websocket", "/service" }; public static final String[] FILTER_FILE_REQUEST_OPTION = { "/post", "/websocket", "/service" };
public static final String[] FILTER_FILE_NO_SESSION_REQUEST_OPTION = { "/service" };
/** /**
* 登录页面 * 登录页面
......
...@@ -80,6 +80,13 @@ public class SessionFilter implements Filter { ...@@ -80,6 +80,13 @@ public class SessionFilter implements Filter {
return; return;
} }
} }
}else{
for(String str : Constants.FILTER_FILE_NO_SESSION_REQUEST_OPTION){
if (url.contains(str)) {
chain.doFilter(new XssHttpServletRequestWrapper((HttpServletRequest) request), response);
return;
}
}
} }
//4.请求过滤 //4.请求过滤
......
...@@ -5,6 +5,7 @@ import java.io.FileOutputStream; ...@@ -5,6 +5,7 @@ import java.io.FileOutputStream;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.io.LineNumberReader; import java.io.LineNumberReader;
import java.io.RandomAccessFile; import java.io.RandomAccessFile;
import java.lang.reflect.Method;
import java.security.MessageDigest; import java.security.MessageDigest;
import java.text.DateFormat; import java.text.DateFormat;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
...@@ -762,6 +763,30 @@ public class ToolUtil { ...@@ -762,6 +763,30 @@ public class ToolUtil {
} }
return r; return r;
} }
/**
* javaBean2Map
* @param javaBean
* @return
*/
@SuppressWarnings("unchecked")
public static <K, V> Map<K, V> javaBean2Map(Object javaBean) {
Map<K, V> ret = new HashMap<>();
try {
Method[] methods = javaBean.getClass().getDeclaredMethods();// 获取所有的属性
for (Method method : methods) {
if (method.getName().startsWith("get")) {
String field = method.getName();
field = field.substring(field.indexOf("get") + 3);
field = field.toLowerCase().charAt(0) + field.substring(1);
Object value = method.invoke(javaBean, (Object[]) null);// invoke(调用)就是调用Method类代表的方法。它可以让你实现动态调用
ret.put((K) field, (V) (null == value ? "" : value));
}
}
} catch (Exception e) {
}
return ret;
}
public static void main(String[] args) throws Exception { public static void main(String[] args) throws Exception {
......
package com.skyeye.db.config; package com.skyeye.db.config;
import javax.sql.DataSource; import javax.sql.DataSource;
import org.activiti.engine.ProcessEngineConfiguration; import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.spring.SpringProcessEngineConfiguration; import org.activiti.spring.SpringProcessEngineConfiguration;
import org.activiti.spring.boot.AbstractProcessEngineAutoConfiguration; import org.activiti.spring.boot.AbstractProcessEngineAutoConfiguration;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.PlatformTransactionManager;
import com.alibaba.druid.pool.DruidDataSource; import com.alibaba.druid.pool.DruidDataSource;
/** /**
...@@ -23,12 +19,9 @@ import com.alibaba.druid.pool.DruidDataSource; ...@@ -23,12 +19,9 @@ import com.alibaba.druid.pool.DruidDataSource;
@Configuration @Configuration
public class ActitytiDataSourceConfig extends AbstractProcessEngineAutoConfiguration { public class ActitytiDataSourceConfig extends AbstractProcessEngineAutoConfiguration {
private static final Logger log = LogManager.getLogger(ActitytiDataSourceConfig.class);
@Bean(name = "activitiDataSource") @Bean(name = "activitiDataSource")
@ConfigurationProperties(prefix = "spring.datasource.activiti") @ConfigurationProperties(prefix = "spring.datasource.activiti")
public DataSource activitiDataSource() { public DataSource activitiDataSource() {
log.info("activitiDataSource 初始化...");
return new DruidDataSource(); return new DruidDataSource();
} }
......
...@@ -888,4 +888,23 @@ ...@@ -888,4 +888,23 @@
</url> </url>
<!-- 项目规划结束 --> <!-- 项目规划结束 -->
<!-- 工作流开始 -->
<url id="activitimode001" path="/post/ActivitiModelController/insertNewActivitiModel" val="新建一个空模型" allUse="1">
</url>
<url id="activitimode002" path="/post/ActivitiModelController/queryActivitiModelList" val="获取所有模型" allUse="1">
</url>
<url id="activitimode003" path="/post/ActivitiModelController/editActivitiModelToDeploy" val="发布模型为流程定义" allUse="1">
<property id="modelId" name="modelId" ref="required" var="模型id"/>
</url>
<url id="activitimode004" path="/post/ActivitiModelController/editActivitiModelToStartProcess" val="启动流程" allUse="1">
<property id="keyName" name="keyName" ref="required" var="模型key"/>
</url>
<url id="activitimode005" path="/post/ActivitiModelController/editActivitiModelToRun" val="提交任务" allUse="1">
<property id="processInstanceId" name="processInstanceId" ref="required" var="模型运行id"/>
</url>
<url id="activitimode006" path="/post/ActivitiModelController/deleteActivitiModelById" val="删除模型" allUse="1">
<property id="rowId" name="id" ref="required" var="模型id"/>
</url>
<!-- 工作流结束 -->
</controller> </controller>
\ No newline at end of file
...@@ -531,7 +531,7 @@ a.dropdown-toggle { ...@@ -531,7 +531,7 @@ a.dropdown-toggle {
/* Sub header */ /* Sub header */
.subheader { .subheader {
background-color: #e8edf1; background-color: #e8edf1;
min-height: 60px; min-height: 45px;
border-bottom: 1px solid #a4acb9; border-bottom: 1px solid #a4acb9;
} }
...@@ -936,7 +936,7 @@ a.dropdown-toggle { ...@@ -936,7 +936,7 @@ a.dropdown-toggle {
} }
.wrapper.full { .wrapper.full {
padding: 40px 0px 0px 0px; padding: 0px 0px 0px 0px;
overflow: hidden; overflow: hidden;
max-width: 100%; max-width: 100%;
min-width: 100%; min-width: 100%;
......
...@@ -47,7 +47,7 @@ ...@@ -47,7 +47,7 @@
} }
.editor-toolbar .btn.btn-inverse { .editor-toolbar .btn.btn-inverse {
font-size: 24px; font-size: 15px;
color: #FFFFFF; color: #FFFFFF;
border-color: rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0);
padding: 3px 6px 0px 6px; padding: 3px 6px 0px 6px;
...@@ -56,8 +56,8 @@ ...@@ -56,8 +56,8 @@
text-align: center; text-align: center;
border: none; border: none;
margin: 0px 0px 0px 5px; margin: 0px 0px 0px 5px;
height: 36px; height: 24px;
min-width: 36px; min-width: 24px;
} }
.editor-toolbar .btn.btn-inverse.pressed { .editor-toolbar .btn.btn-inverse.pressed {
background-color: #287d92; background-color: #287d92;
...@@ -79,7 +79,7 @@ ...@@ -79,7 +79,7 @@
.editor-toolbar .toolbar-separator { .editor-toolbar .toolbar-separator {
background: #a4acb9; background: #a4acb9;
width: 1px; width: 1px;
height: 30px; height: 20px;
} }
.stencils { .stencils {
...@@ -228,9 +228,9 @@ div.propertySection { ...@@ -228,9 +228,9 @@ div.propertySection {
} }
.selected-item-title { .selected-item-title {
font-size: 25px; font-size: 20px;
font-weight: bold; font-weight: bold;
padding: 8px 0 8px 8px; padding: 0px 0 8px 8px;
border-bottom: 1px solid #a4acb9; border-bottom: 1px solid #a4acb9;
cursor: pointer; cursor: pointer;
} }
...@@ -407,7 +407,6 @@ li.x-menu-list-item.x-menu-item-active a { ...@@ -407,7 +407,6 @@ li.x-menu-list-item.x-menu-item-active a {
/* Editor icon font */ /* Editor icon font */
.editor-icon { .editor-icon {
position: relative; position: relative;
top: 1px;
display: inline-block; display: inline-block;
font-family: 'ActivitiModeler'; font-family: 'ActivitiModeler';
font-style: normal; font-style: normal;
......
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
</button> </button>
</div> </div>
</div> </div>
<div class="btn-group pull-right" ng-show="!secondaryItems.length"> <!-- <div class="btn-group pull-right" ng-show="!secondaryItems.length">
<div class="btn-toolbar pull-right" ng-controller="ToolbarController"> <div class="btn-toolbar pull-right" ng-controller="ToolbarController">
<button title="{{item.title | translate}}" ng-repeat="item in secondaryItems" ng-switch on="item.type" class="btn btn-inverse" ng-class="{'separator': item.type == 'separator'}" <button title="{{item.title | translate}}" ng-repeat="item in secondaryItems" ng-switch on="item.type" class="btn btn-inverse" ng-class="{'separator': item.type == 'separator'}"
ng-disabled="item.type == 'separator'" ng-click="toolbarSecondaryButtonClicked($index)" id="{{item.id}}"> ng-disabled="item.type == 'separator'" ng-click="toolbarSecondaryButtonClicked($index)" id="{{item.id}}">
...@@ -22,11 +22,11 @@ ...@@ -22,11 +22,11 @@
<div ng-switch-when="separator" ng-class="item.cssClass"></div> <div ng-switch-when="separator" ng-class="item.cssClass"></div>
</button> </button>
</div> </div>
</div> </div> -->
</div> </div>
<div class="full"> <div class="full">
<div class="row row-no-gutter"> <div class="row row-no-gutter">
<div id="paletteHelpWrapper" class="col-xs-3"> <div id="paletteHelpWrapper" class="col-xs-2">
<div class="stencils" id="paletteSection"> <div class="stencils" id="paletteSection">
<div ng-if="stencilItemGroups.length > 1"> <div ng-if="stencilItemGroups.length > 1">
<div ng-repeat="group in stencilItemGroups"> <div ng-repeat="group in stencilItemGroups">
...@@ -56,7 +56,7 @@ ...@@ -56,7 +56,7 @@
</div> </div>
</div> </div>
</div> </div>
<div id="canvasHelpWrapper" class="col-xs-9"> <div id="canvasHelpWrapper" class="col-xs-10" style="padding-left: 0px; padding-right: 0px;">
<div class="canvas-wrapper" id="canvasSection" <div class="canvas-wrapper" id="canvasSection"
ng-model="droppedElement" ng-model="droppedElement"
ng-model="droppedElement" ng-model="droppedElement"
...@@ -92,7 +92,7 @@ ...@@ -92,7 +92,7 @@
</div> </div>
</div> </div>
</div> </div>
<div id="propertiesHelpWrapper" class="col-xs-9"> <div id="propertiesHelpWrapper" class="col-xs-10" style="padding-left: 0px; padding-right: 0px;">
<div class="propertySection" id="propertySection" <div class="propertySection" id="propertySection"
ng-class="{collapsed: propertyWindowState.collapsed}"> ng-class="{collapsed: propertyWindowState.collapsed}">
<div class="selected-item-section"> <div class="selected-item-section">
......
...@@ -28,14 +28,14 @@ ...@@ -28,14 +28,14 @@
</head> </head>
<body> <body>
<div class="navbar navbar-fixed-top navbar-inverse" role="navigation" id="main-header"> <!-- <div class="navbar navbar-fixed-top navbar-inverse" role="navigation" id="main-header">
<div class="navbar-header"> <div class="navbar-header">
<a href="" ng-click="backToLanding()" class="navbar-brand" <a href="" ng-click="backToLanding()" class="navbar-brand"
title="{{'GENERAL.MAIN-TITLE' | translate}}"><span title="{{'GENERAL.MAIN-TITLE' | translate}}"><span
class="sr-only">{{'GENERAL.MAIN-TITLE' | translate}}</span></a> class="sr-only">{{'GENERAL.MAIN-TITLE' | translate}}</span></a>
</div> </div>
</div> </div>
-->
<!--[if lt IE 9]> <!--[if lt IE 9]>
<div class="unsupported-browser"> <div class="unsupported-browser">
<p class="alert error">You are using an unsupported browser. Please upgrade your browser in order to use the <p class="alert error">You are using an unsupported browser. Please upgrade your browser in order to use the
......
...@@ -31,4 +31,4 @@ getIpByRequest(); 根据request获取ip ...@@ -31,4 +31,4 @@ getIpByRequest(); 根据request获取ip
getCpuRatioForWindows(); 获得CPU使用率 getCpuRatioForWindows(); 获得CPU使用率
readCpu(); 读取CPU信息 readCpu(); 读取CPU信息
listToTree(); 将JSONArray数组转为树状结构 listToTree(); 将JSONArray数组转为树状结构
javaBean2Map(); 实体类转map
因为 它太大了无法显示 source diff 。你可以改为 查看blob
...@@ -975,4 +975,104 @@ function show(id, url) { ...@@ -975,4 +975,104 @@ function show(id, url) {
}); });
} }
/**
* 时间戳格式化函数
* @param {string} format 格式
* @param {int} timestamp 要格式化的时间 默认为当前时间
* @return {string} 格式化的时间字符串
*/
function date(format, timestamp){
var a, jsdate=((timestamp) ? new Date(timestamp*1000) : new Date());
var pad = function(n, c){
if((n = n + "").length < c){
return new Array(++c - n.length).join("0") + n;
} else {
return n;
}
};
var txt_weekdays = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
var txt_ordin = {1:"st", 2:"nd", 3:"rd", 21:"st", 22:"nd", 23:"rd", 31:"st"};
var txt_months = ["", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
var f = {
d: function(){return pad(f.j(), 2)},
D: function(){return f.l().substr(0,3)},
j: function(){return jsdate.getDate()},
l: function(){return txt_weekdays[f.w()]},
N: function(){return f.w() + 1},
S: function(){return txt_ordin[f.j()] ? txt_ordin[f.j()] : 'th'},
w: function(){return jsdate.getDay()},
z: function(){return (jsdate - new Date(jsdate.getFullYear() + "/1/1")) / 864e5 >> 0},
W: function(){
var a = f.z(), b = 364 + f.L() - a;
var nd2, nd = (new Date(jsdate.getFullYear() + "/1/1").getDay() || 7) - 1;
if(b <= 2 && ((jsdate.getDay() || 7) - 1) <= 2 - b){
return 1;
} else{
if(a <= 2 && nd >= 4 && a >= (6 - nd)){
nd2 = new Date(jsdate.getFullYear() - 1 + "/12/31");
return date("W", Math.round(nd2.getTime()/1000));
} else{
return (1 + (nd <= 3 ? ((a + nd) / 7) : (a - (7 - nd)) / 7) >> 0);
}
}
},
F: function(){return txt_months[f.n()]},
m: function(){return pad(f.n(), 2)},
M: function(){return f.F().substr(0,3)},
n: function(){return jsdate.getMonth() + 1},
t: function(){
var n;
if( (n = jsdate.getMonth() + 1) == 2 ){
return 28 + f.L();
} else{
if( n & 1 && n < 8 || !(n & 1) && n > 7 ){
return 31;
} else{
return 30;
}
}
},
L: function(){var y = f.Y();return (!(y & 3) && (y % 1e2 || !(y % 4e2))) ? 1 : 0},
Y: function(){return jsdate.getFullYear()},
y: function(){return (jsdate.getFullYear() + "").slice(2)},
a: function(){return jsdate.getHours() > 11 ? "pm" : "am"},
A: function(){return f.a().toUpperCase()},
B: function(){
var off = (jsdate.getTimezoneOffset() + 60)*60;
var theSeconds = (jsdate.getHours() * 3600) + (jsdate.getMinutes() * 60) + jsdate.getSeconds() + off;
var beat = Math.floor(theSeconds/86.4);
if (beat > 1000) beat -= 1000;
if (beat < 0) beat += 1000;
if ((String(beat)).length == 1) beat = "00"+beat;
if ((String(beat)).length == 2) beat = "0"+beat;
return beat;
},
g: function(){return jsdate.getHours() % 12 || 12},
G: function(){return jsdate.getHours()},
h: function(){return pad(f.g(), 2)},
H: function(){return pad(jsdate.getHours(), 2)},
i: function(){return pad(jsdate.getMinutes(), 2)},
s: function(){return pad(jsdate.getSeconds(), 2)},
O: function(){
var t = pad(Math.abs(jsdate.getTimezoneOffset()/60*100), 4);
if (jsdate.getTimezoneOffset() > 0) t = "-" + t; else t = "+" + t;
return t;
},
P: function(){var O = f.O();return (O.substr(0, 3) + ":" + O.substr(3, 2))},
c: function(){return f.Y() + "-" + f.m() + "-" + f.d() + "T" + f.h() + ":" + f.i() + ":" + f.s() + f.P()},
U: function(){return Math.round(jsdate.getTime()/1000)}
};
return format.replace(/[\\]?([a-zA-Z])/g, function(t, s){
if( t!=s ){
ret = s;
} else if( f[s] ){
ret = f[s]();
} else{
ret = s;
}
return ret;
});
}
layui.config({
base: basePath,
version: skyeyeVersion
}).define(['table', 'jquery', 'winui', 'form'], function (exports) {
winui.renderColor();
//模板分组ID
groupId = parent.rowId;
var $ = layui.$,
form = layui.form,
table = layui.table;
//表格渲染
table.render({
id: 'messageTable',
elem: '#messageTable',
method: 'post',
url: reqBasePath + 'activitimode002',
where:{},
even:true, //隔行变色
page: false,
cols: [[
{ title: '序号', type: 'numbers'},
{ field: 'id', title: '模型编号', width: 120 },
{ field: 'name', title: '模型名称', width: 120 },
{ field: 'version', title: '版本', width: 120},
{ field: 'createTime', title: '创建时间', width: 180, templet: function(d){
var str = d.createTime.toString();
str = str.substring(0, str.length - 3);
return date('Y-m-d H:i:s', str);
} },
{ title: '操作', fixed: 'right', align: 'center', width: 240, toolbar: '#tableBar'}
]]
});
table.on('tool(messageTable)', function (obj) { //注:tool是工具条事件名,test是table原始容器的属性 lay-filter="对应的值"
var data = obj.data; //获得当前行数据
var layEvent = obj.event; //获得 lay-event 对应的值
if (layEvent === 'del') { //删除
del(data, obj);
}else if (layEvent === 'edit') { //编辑
edit(data);
}
});
//搜索表单
form.render();
form.on('submit(formSearch)', function (data) {
//表单验证
if (winui.verifyForm(data.elem)) {
loadTable();
}
return false;
});
//删除
function del(data, obj){
var msg = obj ? '确认删除模型【' + obj.data.name + '】吗?' : '确认删除选中数据吗?';
layer.confirm(msg, { icon: 3, title: '删除模型' }, function (index) {
layer.close(index);
//向服务端发送删除指令
AjaxPostUtil.request({url:reqBasePath + "activitimode006", params:{rowId: data.id}, type:'json', callback:function(json){
if(json.returnCode == 0){
top.winui.window.msg("删除成功", {icon: 1,time: 2000});
loadTable();
}else{
top.winui.window.msg(json.returnMessage, {icon: 2,time: 2000});
}
}});
});
}
//编辑
function edit(data){
rowId = data.id;
_openNewWindows({
url: "../../static/modeler.html?modelId=" + rowId,
title: "绘制流程",
pageId: "canveractivitimodeledit",
maxmin: true,
callBack: function(refreshCode){
if (refreshCode == '0') {
top.winui.window.msg("操作成功", {icon: 1,time: 2000});
loadTable();
} else if (refreshCode == '-9999') {
top.winui.window.msg("操作失败", {icon: 2,time: 2000});
}
}});
}
//刷新数据
$("body").on("click", "#reloadTable", function(){
loadTable();
});
//新增
$("body").on("click", "#addBean", function(){
AjaxPostUtil.request({url:reqBasePath + "activitimode001", params:{}, type:'json', callback:function(json){
if(json.returnCode == 0){
_openNewWindows({
url: "../../static/modeler.html?modelId=" + json.bean.id,
title: "绘制流程",
pageId: "canveractivitimodel",
maxmin: true,
callBack: function(refreshCode){
if (refreshCode == '0') {
top.winui.window.msg("操作成功", {icon: 1,time: 2000});
loadTable();
} else if (refreshCode == '-9999') {
top.winui.window.msg("操作失败", {icon: 2,time: 2000});
}
}});
}else{
top.winui.window.msg(json.returnMessage, {icon: 2,time: 2000});
}
}});
});
function loadTable(){
table.reload("messageTable", {where:{}});
}
exports('codemodellist', {});
});
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<link href="../../assets/lib/layui/css/layui.css" rel="stylesheet" />
<link href="../../assets/lib/font-awesome-4.7.0/css/font-awesome.css" rel="stylesheet" />
<link href="../../assets/lib/winui/css/winui.css" rel="stylesheet" />
<link href="../../assets/lib/layui/css/codemirror.css" rel="stylesheet" />
</head>
<body>
<div class="winui-toolbar">
<div class="winui-tool">
<button id="reloadTable" class="winui-toolbtn"><i class="fa fa-refresh" aria-hidden="true"></i>刷新数据</button>
<button id="addBean" class="winui-toolbtn"><i class="fa fa-plus" aria-hidden="true"></i>绘制流程</button>
</div>
</div>
<div id="modelContentDiv" style="height:auto; position: fixed; left: 10000px;">
<textarea id="modelContent"></textarea>
</div>
<div style="margin:auto 10px;">
<table id="messageTable" lay-filter="messageTable"></table>
<script type="text/html" id="tableBar">
<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
</script>
</div>
<script src="../../assets/lib/layui/layui.js"></script>
<script src="../../assets/lib/layui/custom.js"></script>
<script type="text/javascript">
layui.config({base: '../../js/activitimodel/'}).use('activitimodellist');
</script>
</body>
</html>
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册