Commit 92728842 by 啦啦啦

activiti整合springboot +demo

parent e966a7dc
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
<groupId>mysql</groupId> <groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId> <artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope> <scope>runtime</scope>
<version>5.1.41</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
...@@ -48,6 +49,16 @@ ...@@ -48,6 +49,16 @@
<artifactId>springfox-swagger-ui</artifactId> <artifactId>springfox-swagger-ui</artifactId>
<version>2.8.0</version> <version>2.8.0</version>
</dependency> </dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring-boot-starter-basic</artifactId>
<version>6.0.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
</dependencies> </dependencies>
<build> <build>
......
package com.bbd.bpm; package com.bbd.bpm;
import org.activiti.spring.boot.SecurityAutoConfiguration;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication @SpringBootApplication(exclude = SecurityAutoConfiguration.class)
public class BpmBackendApplication { public class BpmBackendApplication {
public static void main(String[] args) { public static void main(String[] args) {
......
package com.bbd.bpm.controller;
import com.bbd.bpm.domain.User;
import com.bbd.bpm.domain.VacationForm;
import com.bbd.bpm.service.MiaoService;
import com.bbd.bpm.util.ResultInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@Controller
public class MiaoController {
@Autowired
private MiaoService miaoService;
@GetMapping( "/")
public String login(){
return "login";
}
//申请者的首页
@GetMapping( "/home")
public String index(ModelMap model, HttpServletRequest request){
List<VacationForm> forms = miaoService.formList();
Cookie[] cookies = request.getCookies();
String user = "";
//从cookie中获取当前用户
if (cookies != null) {
for (Cookie cookie : cookies) {
if (cookie.getName().equals("userInfo")) {
user = cookie.getValue();
break;
}
}
}
List<HashMap<String, Object>> formsMap = new ArrayList<HashMap<String, Object>>();
for(VacationForm form : forms) {
//申请者只能看到自己申请的请假单信息
if(user.equals(form.getApplicant())) {
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("id", form.getId());
map.put("title", form.getTitle());
map.put("content", form.getContent());
map.put("applicant", form.getApplicant());
map.put("state", form.getState());
formsMap.add(map);
}
}
//将forms参数返回
model.addAttribute("forms",formsMap);
return "index";
}
//审核者的首页
@GetMapping( "/homeApprover")
public String indexApprover(ModelMap model){
List<VacationForm> forms = miaoService.formList();
List<HashMap<String, Object>> formsMap = new ArrayList<HashMap<String, Object>>();
for(VacationForm form : forms) {
//审核者只能看到待审核状态的请假单
if("领导审核".equals(form.getState())) {
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("id", form.getId());
map.put("title", form.getTitle());
map.put("content", form.getContent());
map.put("applicant", form.getApplicant());
map.put("state", form.getState());
formsMap.add(map);
}
}
model.addAttribute("forms",formsMap);
return "indexApprover";
}
//请假单页面
@GetMapping( "/form")
public String form(){
return "form";
}
@PostMapping( "/login")
@ResponseBody
public ResultInfo login(HttpServletRequest request, HttpServletResponse response){
ResultInfo result = new ResultInfo();
String username = request.getParameter("username");
User user = miaoService.loginSuccess(username);
if(user != null) {
result.setCode(200);
result.setMsg("登录成功");
result.setInfo(user);
//用户信息存放在Cookie中,实际情况下保存在Redis更佳
Cookie cookie = new Cookie("userInfo", username);
cookie.setPath("/");
response.addCookie(cookie);
}else {
result.setCode(300);
result.setMsg("登录名不存在,登录失败");
}
return result;
}
@GetMapping("/logout")
@ResponseBody
public ResultInfo logout(HttpServletRequest request, HttpServletResponse response) {
ResultInfo result = new ResultInfo();
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
if (cookie.getName().equals("userInfo")) {
cookie.setValue(null);
// 立即销毁cookie
cookie.setMaxAge(0);
cookie.setPath("/");
response.addCookie(cookie);
break;
}
}
}
result.setCode(200);
return result;
}
//添加请假单
@GetMapping( "/writeForm")
@ResponseBody
public ResultInfo writeForm(HttpServletRequest request){
ResultInfo result = new ResultInfo();
String title = request.getParameter("title");
String content = request.getParameter("content");
String operator = request.getParameter("operator");
VacationForm form = miaoService.writeForm(title,content,operator);
result.setCode(200);
result.setMsg("填写请假条成功");
result.setInfo(form);
return result;
}
//申请者放弃请假
@GetMapping( "/giveup")
@ResponseBody
public ResultInfo giveup(HttpServletRequest request){
ResultInfo result = new ResultInfo();
String formId = request.getParameter("formId");
String operator = request.getParameter("operator");
miaoService.completeProcess(formId, operator, "giveup");
result.setCode(200);
result.setMsg("放弃请假成功");
return result;
}
//申请者申请请假
@GetMapping( "/apply")
@ResponseBody
public ResultInfo apply(HttpServletRequest request){
ResultInfo result = new ResultInfo();
String formId = request.getParameter("formId");
String operator = request.getParameter("operator");
miaoService.completeProcess(formId, operator, "apply");
result.setCode(200);
result.setMsg("申请请假成功");
return result;
}
//审批者审核请假信息
@GetMapping( "/approve")
@ResponseBody
public ResultInfo approve(HttpServletRequest request){
ResultInfo result = new ResultInfo();
String formId = request.getParameter("formId");
String operator = request.getParameter("operator");
miaoService.approverVacation(formId, operator);
result.setCode(200);
result.setMsg("请假审核成功");
return result;
}
//获取某条请假信息当前状态
@GetMapping( "/currentState")
public HashMap<String,String> currentState(HttpServletRequest request){
String formId = request.getParameter("formId");
HashMap<String,String> map = new HashMap<String,String>();
map = miaoService.getCurrentState(formId);
return map;
}
@GetMapping( "/historyState")
@ResponseBody
public ResultInfo queryHistoricTask(HttpServletRequest request){
ResultInfo result = new ResultInfo();
String formId = request.getParameter("formId");
List process = miaoService.historyState(formId);
result.setCode(200);
result.setInfo(process);
return result;
}
}
package com.bbd.bpm.domain;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
//用户信息表
@Entity
@Table(name = "user")
public class User {
@Id
@GeneratedValue
private Integer id;
private String name;
//用户身份标识(1-申请者,2-审核者)
private Integer type;
private Integer delete_flag;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getType() {
return type;
}
public void setType(Integer type) {
this.type = type;
}
public Integer getDelete_flag() {
return delete_flag;
}
public void setDelete_flag(Integer delete_flag) {
this.delete_flag = delete_flag;
}
}
\ No newline at end of file
package com.bbd.bpm.domain;
import javax.persistence.*;
//请假单信息表
@Entity
@Table(name = "vacation_form")
public class VacationForm {
@Id
@GeneratedValue
private Integer id;
private String title;
private String content;
//申请者
private String applicant;
//审批者
private String approver;
//申请所处状态
@Transient
private String state;
public VacationForm(){
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getApplicant() {
return applicant;
}
public void setApplicant(String applicant) {
this.applicant = applicant;
}
public String getApprover() {
return approver;
}
public void setApprover(String approver) {
this.approver = approver;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
}
\ No newline at end of file
package com.bbd.bpm.service;
import com.bbd.bpm.domain.User;
import com.bbd.bpm.domain.VacationForm;
import java.util.HashMap;
import java.util.List;
public interface MiaoService {
public VacationForm writeForm(String title, String content, String applicant);
public boolean giveupVacation(String formId, String operator);
public boolean applyVacation(String formId, String operator);
public boolean approverVacation(String formId, String operator);
public void completeProcess(String formId, String operator, String input);
public HashMap<String,String> getCurrentState(String formId);
public List<VacationForm> formList();
public User loginSuccess(String user);
public List historyState(String formId);
}
package com.bbd.bpm.service;
import com.bbd.bpm.domain.User;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
public interface UserService extends JpaRepository<User, Long> {
public List<User> findByName(String name);
}
\ No newline at end of file
package com.bbd.bpm.service;
import org.springframework.data.jpa.repository.JpaRepository;
import com.bbd.bpm.domain.VacationForm;
public interface VacationFormService extends JpaRepository<VacationForm, Integer> {
}
\ No newline at end of file
package com.bbd.bpm.serviceImpl;
import com.bbd.bpm.domain.User;
import com.bbd.bpm.domain.VacationForm;
import com.bbd.bpm.service.MiaoService;
import com.bbd.bpm.service.UserService;
import com.bbd.bpm.service.VacationFormService;
import org.activiti.engine.HistoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.history.HistoricTaskInstance;
import org.activiti.engine.task.Task;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service("miaoService")
public class MiaoServiceImpl implements MiaoService {
@Autowired
private RuntimeService runtimeService;
@Autowired
private TaskService taskService;
@Autowired
HistoryService historyService;
@Autowired
private VacationFormService vacationFormService;
@Autowired
private UserService userService;
//填写请假信息
@Override
public VacationForm writeForm(String title, String content, String applicant) {
VacationForm form = new VacationForm();
String approver = "未知审批者";
form.setTitle(title);
form.setContent(content);
form.setApplicant(applicant);
form.setApprover(approver);
vacationFormService.save(form);
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("employee", form.getApplicant());
//开始请假流程,使用formId作为流程的businessKey
runtimeService.startProcessInstanceByKey("myProcess", form.getId().toString(), variables);
return form;
}
//根据选择,申请或放弃请假
@Override
public void completeProcess(String formId, String operator, String input) {
//根据businessKey找到当前任务节点
Task task = taskService.createTaskQuery().processInstanceBusinessKey(formId).singleResult();
//设置输入参数,使流程自动流转到对应节点
taskService.setVariable(task.getId(), "input", input);
taskService.complete(task.getId());
if ("apply".equals(input)) {
applyVacation(formId, operator);
} else {
giveupVacation(formId, operator);
}
}
//放弃请假
@Override
public boolean giveupVacation(String formId, String operator) {
Task task = taskService.createTaskQuery().processInstanceBusinessKey(formId).singleResult();
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("employee", operator);
//认领任务
taskService.claim(task.getId(), operator);
//完成任务
taskService.complete(task.getId(), variables);
return true;
}
@Override
public boolean applyVacation(String formId, String operator) {
Task task = taskService.createTaskQuery().processInstanceBusinessKey(formId).singleResult();
Map<String, Object> variables = new HashMap<String, Object>();
List<User> users = userService.findAll();
String managers = "";
//获取所有具有审核权限的用户
for (User user : users) {
if (user.getType().equals(2)) {
managers += user.getName() + ",";
}
}
managers = managers.substring(0, managers.length() - 1);
variables.put("employee", operator);
variables.put("managers", managers);
taskService.claim(task.getId(), operator);
taskService.complete(task.getId(), variables);
return true;
}
@Override
public boolean approverVacation(String formId, String operator) {
Task task = taskService.createTaskQuery().processInstanceBusinessKey(formId).singleResult();
taskService.claim(task.getId(), operator);
taskService.complete(task.getId());
//更新请假信息的审核人
try{
VacationForm form = vacationFormService.findById(Integer.parseInt(formId)).get();
if (form != null) {
form.setApprover(operator);
vacationFormService.save(form);
}
}catch (Exception e){
e.printStackTrace();
}
return true;
}
//获取请假信息的当前流程状态
@Override
public HashMap<String, String> getCurrentState(String formId) {
HashMap<String, String> map = new HashMap<String, String>();
Task task = taskService.createTaskQuery().processInstanceBusinessKey(formId).singleResult();
if (task != null) {
map.put("status", "processing");
map.put("taskId", task.getId());
map.put("taskName", task.getName());
map.put("user", task.getAssignee());
} else {
map.put("status", "finish");
}
return map;
}
//请假列表
@Override
public List<VacationForm> formList() {
List<VacationForm> formList = vacationFormService.findAll();
for (VacationForm form : formList) {
Task task = taskService.createTaskQuery().processInstanceBusinessKey(form.getId().toString())
.singleResult();
if (task != null) {
String state = task.getName();
form.setState(state);
} else {
form.setState("已结束");
}
}
return formList;
}
//登录验证用户名是否存在
@Override
public User loginSuccess(String username) {
List<User> users = userService.findByName(username);
if (users != null && users.size() > 0) {
User user = users.get(0);
return user;
}
return null;
}
//获取当前登录用户
public String getCurrentUser(HttpServletRequest request) {
String user = "";
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
if (cookie.getName().equals("userInfo")) {
user = cookie.getValue();
}
}
}
return user;
}
//获取已执行的流程信息
@Override
public List historyState(String formId) {
List<HashMap<String, String>> processList = new ArrayList<HashMap<String, String>>();
List<HistoricTaskInstance> list = historyService.createHistoricTaskInstanceQuery()
.processInstanceBusinessKey(formId).list();
if (list != null && list.size() > 0) {
for (HistoricTaskInstance hti : list) {
HashMap<String, String> map = new HashMap<String, String>();
map.put("name", hti.getName());
map.put("operator", hti.getAssignee());
processList.add(map);
}
}
return processList;
}
}
package com.bbd.bpm.util;
/**
* 返回结果信息类
*/
public class ResultInfo {
// 返回状态
private Integer code;
//状态描述信息
private String msg;
//Info查询总数据量
private long count;
//返回数据列表
private Object info;
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public long getCount() {
return count;
}
public void setCount(long count) {
this.count = count;
}
public Object getInfo() {
return info;
}
public void setInfo(Object info) {
this.info = info;
}
public ResultInfo() {
super();
}
}
#端口 #端口
server.port=8081 server.port=8081
spring.datasource.url=jdbc:mysql://localhost:3306/test?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.url=jdbc:mysql://106.75.97.50:3306/test?characterEncoding=UTF-8 #spring.datasource.url=jdbc:mysql://106.75.97.50:3306/test?characterEncoding=UTF-8
spring.datasource.username=airuser #spring.datasource.username=airuser
spring.datasource.password=!@JD@2016 #spring.datasource.password=!@JD@2016
spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver spring.datasource.driverClassName=com.mysql.jdbc.Driver
##Druid## ##Druid##
#spring.datasource.type=com.alibaba.druid.pool.DruidDataSource #spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
#连接池启动时创建的连接数量的初始值 #连接池启动时创建的连接数量的初始值
...@@ -41,7 +44,7 @@ spring.datasource.useGlobalDataSourceStat=true ...@@ -41,7 +44,7 @@ spring.datasource.useGlobalDataSourceStat=true
# Specify the DBMS # Specify the DBMS
spring.jpa.database=MYSQL spring.jpa.database=MYSQL
# Hibernate ddl auto (create, create-drop, update) # Hibernate ddl auto (create, create-drop, update)
# spring.jpa.hibernate.ddl-auto=update spring.jpa.hibernate.ddl-auto=update
# Naming strategy # Naming strategy
spring.jpa.hibernate.naming-strategy=org.hibernate.cfg.ImprovedNamingStrategy spring.jpa.hibernate.naming-strategy=org.hibernate.cfg.ImprovedNamingStrategy
# stripped before adding them to the entity manager) # stripped before adding them to the entity manager)
......
<?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.processes.org/test">
<process id="myProcess" name="My process" isExecutable="true">
<startEvent id="start" name="Start"></startEvent>
<userTask id="usertask1" name="提出请假申请" activiti:assignee="${employee}"></userTask>
<sequenceFlow id="flow1" name="想请假" sourceRef="start" targetRef="usertask3"></sequenceFlow>
<userTask id="usertask2" name="领导审核" activiti:candidateUsers="${managers}"></userTask>
<sequenceFlow id="flow4" sourceRef="usertask1" targetRef="usertask2"></sequenceFlow>
<endEvent id="endevent1" name="End"></endEvent>
<sequenceFlow id="flow5" sourceRef="usertask2" targetRef="endevent1"></sequenceFlow>
<userTask id="usertask3" name="填写请假单" activiti:assignee="${employee}"></userTask>
<userTask id="usertask4" name="放弃请假"></userTask>
<sequenceFlow id="flow6" name="想了想还是不请了" sourceRef="exclusivegateway1" targetRef="usertask4">
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${input=='giveup'}]]></conditionExpression>
</sequenceFlow>
<sequenceFlow id="flow7" sourceRef="usertask4" targetRef="endevent1"></sequenceFlow>
<sequenceFlow id="flow3" name="下定决心准备请假" sourceRef="exclusivegateway1" targetRef="usertask1">
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${input=='apply'}]]></conditionExpression>
</sequenceFlow>
<exclusiveGateway id="exclusivegateway1" name="Exclusive Gateway"></exclusiveGateway>
<sequenceFlow id="flow2" sourceRef="usertask3" targetRef="exclusivegateway1"></sequenceFlow>
</process>
<bpmndi:BPMNDiagram id="BPMNDiagram_myProcess">
<bpmndi:BPMNPlane bpmnElement="myProcess" id="BPMNPlane_myProcess">
<bpmndi:BPMNShape bpmnElement="start" id="BPMNShape_start">
<omgdc:Bounds height="35.0" width="35.0" x="10.0" y="124.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="usertask1" id="BPMNShape_usertask1">
<omgdc:Bounds height="55.0" width="105.0" x="340.0" y="20.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="usertask2" id="BPMNShape_usertask2">
<omgdc:Bounds height="55.0" width="105.0" x="492.0" y="20.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1">
<omgdc:Bounds height="35.0" width="35.0" x="527.0" y="240.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="usertask3" id="BPMNShape_usertask3">
<omgdc:Bounds height="55.0" width="105.0" x="110.0" y="114.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="usertask4" id="BPMNShape_usertask4">
<omgdc:Bounds height="55.0" width="105.0" x="340.0" y="230.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="exclusivegateway1" id="BPMNShape_exclusivegateway1">
<omgdc:Bounds height="40.0" width="40.0" x="250.0" y="121.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">
<omgdi:waypoint x="45.0" y="141.0"></omgdi:waypoint>
<omgdi:waypoint x="110.0" y="141.0"></omgdi:waypoint>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="14.0" width="36.0" x="45.0" y="141.0"></omgdc:Bounds>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow4" id="BPMNEdge_flow4">
<omgdi:waypoint x="445.0" y="47.0"></omgdi:waypoint>
<omgdi:waypoint x="492.0" y="47.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow5" id="BPMNEdge_flow5">
<omgdi:waypoint x="544.0" y="75.0"></omgdi:waypoint>
<omgdi:waypoint x="544.0" y="240.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow6" id="BPMNEdge_flow6">
<omgdi:waypoint x="270.0" y="161.0"></omgdi:waypoint>
<omgdi:waypoint x="392.0" y="230.0"></omgdi:waypoint>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="14.0" width="96.0" x="270.0" y="161.0"></omgdc:Bounds>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow7" id="BPMNEdge_flow7">
<omgdi:waypoint x="445.0" y="257.0"></omgdi:waypoint>
<omgdi:waypoint x="527.0" y="257.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3">
<omgdi:waypoint x="270.0" y="121.0"></omgdi:waypoint>
<omgdi:waypoint x="392.0" y="75.0"></omgdi:waypoint>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="14.0" width="96.0" x="270.0" y="121.0"></omgdc:Bounds>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2">
<omgdi:waypoint x="215.0" y="141.0"></omgdi:waypoint>
<omgdi:waypoint x="250.0" y="141.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>
\ No newline at end of file
<!DOCTYPE html>
<html xmlns:th="http://www.w3.org/1999/xhtml">
<head>
<meta charset="UTF-8" />
<title>工作流</title>
</head>
<body>
<div>
<span>填写请假单</span>
<input id="title" placeholder="题目" /><br />
<textarea id="content" placeholder="内容" rows="10"></textarea>
<button onclick="submit()">提交</button>
</div>
</body>
</html>
<style>
* {
font-family: "微软雅黑";
font-size: 15px;
margin: 0 auto;
}
div{
width: 400px;
margin-top:100px;
text-align:center;
padding-top:10px;
}
input,textarea,button{
padding: 3px;
margin-top:10px;
}
input, textarea {
width: 400px;
border: 1px solid #ccc;
border-radius: 4px;
}
button {
width: 408px;
}
</style>
<script src="http://libs.baidu.com/jquery/1.9.1/jquery.min.js"></script>
<script>
function submit() {
var operator = getUser();
if(operator == ""){
location.href = "/";
}
$.ajax({
url : "/writeForm",
data : {
"title" : $("#title").val(),
"content" : $("#content").val(),
"operator" : operator
},
success : function(data) {
if(data.code == 200){
location.href="/home";
}
}
});
}
function getUser(){
var name="userInfo=";
var user = "";
var ca = document.cookie.split(';');
$.each(ca, function(i, item){
if(item.indexOf(name) != -1){
user = item.substring(name.length,item.length);
}
});
return user;
}
</script>
\ No newline at end of file
<!DOCTYPE html>
<html xmlns:th="http://www.w3.org/1999/xhtml">
<head>
<meta charset="UTF-8" />
<title>工作流</title>
<link rel="stylesheet" href="http://cdn.static.runoob.com/libs/bootstrap/3.3.7/css/bootstrap.min.css"/>
</head>
<body>
<div>
<button onclick="writeForm()">填写请假单</button>
<button class="log" onclick="logout()">退出</button>
</div>
<table th:if="${forms.size()}>0">
<thead>
<tr>
<td>请假标题</td>
<td>请假内容</td>
<td>请假人</td>
<td>状态</td>
<td>操作</td>
</tr>
</thead>
<tr th:each="form:${forms}">
<td th:text="${form.title}"></td>
<td th:text="${form.content}"></td>
<td th:text="${form.applicant}"></td>
<td th:text="${form.state}"></td>
<td>
<button th:if="${form.state} == '填写请假单'"
th:onclick="'javascript:apply(\''+${form.id}+'\')'">申请请假</button>
<button th:if="${form.state} == '填写请假单'"
th:onclick="'javascript:giveup(\''+${form.id}+'\')'">放弃请假</button>
<button th:onclick="'javascript:checkState(\''+${form.id}+'\')'" data-toggle="modal" data-target="#myModal">查看流程</button>
</td>
</tr>
</table>
<div th:if="${forms.size()}==0">
<br />暂无请假数据
</div>
<!-- 模态框(Modal) -->
<div class="modal fade" id="myModal" tabindex="-1" role="dialog"
aria-labelledby="myModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal"
aria-hidden="true">&times;</button>
<h4 class="modal-title" id="myModalLabel">流程</h4>
</div>
<div class="modal-body">
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">关闭
</button>
</div>
</div>
</div>
</div>
</body>
</html>
<style>
body{
margin:10px 10px 100px 10px;
}
* {
font-family: "微软雅黑";
font-size: 15px;
}
td {
padding: 5px 10px;
border: 1px solid #ccc;
}
button {
padding: 5px;
margin: 5px 0;
border: 1px solid #aaa;
border-radius: 4px;
}
.log {
float: right;
padding: 5px 8px;
background: #ec5757;
color: #fff;
}
</style>
<script src="http://libs.baidu.com/jquery/1.9.1/jquery.min.js"></script>
<script
src="http://apps.bdimg.com/libs/bootstrap/3.3.4/js/bootstrap.min.js"></script>
<script>
function writeForm() {
location.href = "/form";
}
function logout() {
$.ajax({
url : "/logout",
success : function(data) {
if (data.code == 200) {
location.href = "/";
}
}
});
}
function apply(formId) {
var operator = getUser();
if (operator == "") {
location.href = "/";
}
$.ajax({
url : "/apply",
data : {
"formId" : formId,
"operator" : operator
},
success : function(data) {
if (data.code == 200) {
location.href = "/home";
}
}
});
}
function giveup(formId) {
var operator = getUser();
if (operator == "") {
location.href = "/";
}
$.ajax({
url : "/giveup",
data : {
"formId" : formId,
"operator" : operator
},
success : function(data) {
if (data.code == 200) {
location.href = "/home";
}
}
});
}
function checkState(formId) {
$.ajax({
url : "/historyState",
data : {
"formId" : formId
},
success : function(data) {
if (data.code == 200) {
var processList = data.info;
var html = "";
$.each(processList, function(i,item){
html += "<span>"+item.name+"(操作人:"+item.operator+")"+"</span><br/><br/>";
});
$(".modal-body").html(html);
}
}
});
}
function getUser() {
var name = "userInfo=";
var user = "";
var ca = document.cookie.split(';');
$.each(ca, function(i, item) {
if (item.indexOf(name) != -1) {
user = item.substring(name.length, item.length);
}
});
return user;
}
</script>
\ No newline at end of file
<!DOCTYPE html>
<html xmlns:th="http://www.w3.org/1999/xhtml">
<head>
<meta charset="UTF-8" />
<title>工作流</title>
</head>
<body>
<div>
<button class="log" onclick="logout()">退出</button>
</div>
<table th:if="${forms.size()}>0">
<thead>
<tr>
<td>请假标题</td>
<td>请假内容</td>
<td>请假人</td>
<td>状态</td>
<td>操作</td>
</tr>
</thead>
<tr th:each="form:${forms}">
<td th:text="${form.title}"></td>
<td th:text="${form.content}"></td>
<td th:text="${form.applicant}"></td>
<td th:text="${form.state}"></td>
<td>
<button th:onclick="'javascript:approve(\''+${form.id}+'\')'">审批通过</button>
</td>
</tr>
</table>
<div th:if="${forms.size()}==0">
<br />暂无请假数据
</div>
</body>
</html>
<style>
* {
font-family: "微软雅黑";
font-size: 15px;
}
td {
padding: 5px 10px;
border: 1px solid #ccc;
}
button {
padding: 5px;
margin: 5px 0;
border: 1px solid #aaa;
border-radius: 4px;
}
.log{
float:right;
padding:5px 8px;
background:#ec5757;
color:#fff;
}
</style>
<script src="http://libs.baidu.com/jquery/1.9.1/jquery.min.js"></script>
<script>
function writeForm(){
location.href = "/form";
}
function logout(){
$.ajax({
url : "/logout",
success : function(data) {
if(data.code == 200){
location.href="/";
}
}
});
}
function approve(formId){
var operator = getUser();
debugger;
if(operator == ""){
location.href = "/";
}
$.ajax({
url : "/approve",
data : {
"formId" : formId,
"operator" : operator
},
success : function(data) {
if(data.code == 200){
location.href="/homeApprover";
}
}
});
}
//获取cookie中的用户信息
function getUser(){
var name="userInfo=";
var user = "";
var ca = document.cookie.split(';');
$.each(ca, function(i, item){
if(item.indexOf(name) != -1){
user = item.substring(name.length,item.length);
}
});
return user;
}
</script>
\ No newline at end of file
<!DOCTYPE html>
<html xmlns:th="http://www.w3.org/1999/xhtml">
<head>
<meta charset="UTF-8"/>
<title>工作流</title>
</head>
<body>
<div>
<span>登录</span>
<input id="username" placeholder="用户名" /><br />
<button onclick="login()">提交</button>
</div>
</body>
</html>
<style>
* {
font-family: "微软雅黑";
font-size: 15px;
margin: 0 auto;
}
div{
width: 400px;
margin-top:100px;
text-align:center;
padding-top:10px;
}
input,button{
margin-top:10px;
}
input{
width: 400px;
padding: 5px 3px;
border: 1px solid #ccc;
border-radius: 4px;
}
button {
padding:5px 0;
width: 408px;
}
</style>
<script src="http://libs.baidu.com/jquery/1.9.1/jquery.min.js"></script>
<script>
function login(){
$.ajax({
url : "/login",
type: "POST",
data : {
"username" : $("#username").val()
},
success : function(data) {
console.log(data)
if(data.code == 200){
if(data.info.type == 1){
location.href="/home";
}else{
location.href="/homeApprover";
}
}else{
alert(data.msg);
}
}
});
}
</script>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment