Activity 工作流(二)

绪论

Activity相关表讲解,还有基础构建。

正文

Activity的后台是有数据库的支持,一共有28张表(6.0版),所有表都以act_开头。第二部分两个字母标识,表示表的用途,用途也和服务的API对应。
act_re_:re 表示 repository(仓库)。这个前缀的表包含了流程定义和流程静态资源(图片、规则等等)。
act_ru_:ru 表示 runtime(运行)。这个前缀的表包含了流程实例、任务、变量、异步任务等运行中的数据。Activiti只在流程实例执行过程中保存这些数据, 在流程结束时就会删除这些记录。 这样运行时表可以一直很小速度很快。
act_id_:id 表示 identity(身份)。这个前缀的表包含了身份信息,比如用户、组等等。
act_hi_:hi 表示 history(历史)。这个前缀的表包含了历史数据,比如历史流程实例、变量、任务等等。
act_ge_*:ge 表示 general(通用)。这个前缀的表包含了通用数据,用于不同场景下,如存放资源文件等等。

构建基础的一些内容
要有登录页面,要建一个人员表,工单表等等。

1、引入模板

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

2、配置 thymeleaf

# 配置thymeleaf
spring.thymeleaf.prefix=classpath:/templates/

3、登录页面 login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录</title>

    <link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/css/bootstrap.min.css">
    <script src="https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script>
    <script src="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>

    <style>
        body{
            width: 100%;
            height: 100%;
			text-align: center;
        }
        .box{
            width: 500px;
			height: 300px;
			position: absolute;
			top: 30%;
			left: 50%;
			transform: translate(-50%, -50%);
        }
    </style>
</head>
<body>

<div class="box">
    <form class="form-horizontal" role="form">
        <div class="form-group">
            <label for="userSelect" class="col-sm-2 control-label">账号</label>
            <div class="col-sm-10">
                <select id="userSelect" class="form-control">

                </select>
            </div>
        </div>
		<button type="button" class="btn btn-primary" onclick="doLogin()">登录</button>
    </form>
</div>

<script type="text/javascript">

    // 获取所有账号
    function queryUserList() {
        $.ajax({
            async : false,
            type: "POST",
            dataType: "json",
            contentType : "application/json",
            url: "../user/queryList",
            success:function(data){ // 请求成功后处理函数。
                data = eval(data);
                if (data != null && data.length > 0) {
                    var str = "";
                    for(var i = 0; i < data.length ; i++){
                        str += "<option value='"+data[i].userName+"'>"+data[i].name+"</option>";
                    }
                    if (str != "") {
                        $("#userSelect").html(str);
                    }
                }
            } ,
            error: function (e) { // 请求失败处理函数
                console.log(e);
            }
        });
    }

    // 登录
    function doLogin() {
        var userName = $("#userSelect").val();

        if (userName == null || userName == "") {
            alert("警告!请选择账号");
        }

        $.ajax({
            async : false,
            type: "POST",
            dataType: "json",
            contentType : "application/json",
            data : JSON.stringify({userName: userName}),
            url: "/login/doLogin",
            success:function(data){ // 请求成功后处理函数。
                alert(data);
                if (data.result == "SUCCESS") {
                    window.location.href = "/login/main";
                } else {
                    alert("登录失败");
                }
            } ,
            error: function (e) { // 请求失败处理函数
                console.log(e);
            }
        });
    }

    $(document).ready(function(){
        queryUserList();
    });

</script>
</body>
</html>

4、首页面:main.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>主页面</title>
</head>
<body>

</body>
</html>

5、拦截器 ApiHandlerInterceptor.java,主要验证用户是否登录

package com.yang.adapter;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * explain:请求拦截器
 *
 * @author yang
 * @date 2021/1/1
 */
@Component
public class ApiHandlerInterceptor implements HandlerInterceptor {

    private static final Logger LOGGER = LoggerFactory.getLogger(ApiHandlerInterceptor.class);

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String uri = request.getRequestURI();
        LOGGER.info("访问路径:" + uri);
        HttpSession session = request.getSession();
        String userName = (String) session.getAttribute("userName");
        if (StringUtils.isBlank(userName)) {
            LOGGER.info("用户未登录");
            response.sendRedirect(request.getContextPath() + "/login/index");
            return false;
        }
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

    }
}

6、加载拦截器WebConfigAdapter.java,加载拦截器,验证对哪些路径生效和不生效。

package com.yang.adapter;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * explain:
 *
 * @author yang
 * @date 2021/1/1
 */
@Configuration
public class WebConfigAdapter implements WebMvcConfigurer {

    @Autowired
    private ApiHandlerInterceptor apiHandlerInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //添加对用户未登录的拦截器,并添加排除项
        registry.addInterceptor(apiHandlerInterceptor)
                .addPathPatterns("/**")
                // 排除样式、脚本、图片等资源文件
                .excludePathPatterns("/static/**", "/login/index", "/login/doLogin", "/user/queryList");
    }
}

7、ApiHandler.java

package com.yang.adapter;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;

/**
 * explain:
 *
 * @author yang
 * @date 2021/1/2
 */
@Component
public class ApiHandler {

    private HttpServletRequest request;

    @Autowired
    public void setRequest(HttpServletRequest request) {
        this.request = request;
    }

    public HttpServletRequest getRequest() {
        return request;
    }

}

8、LoginController.java登录跳转控制

package com.yang.login;

import com.alibaba.fastjson.JSONObject;
import com.yang.adapter.ApiHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

/**
 * explain:登录控制类
 *
 * @author yang
 * @date 2021/1/1
 */
@Controller
@RequestMapping("/login")
public class LoginController {

    private static final Logger LOGGER = LoggerFactory.getLogger(LoginController.class);

    @Autowired
    private ApiHandler apiHandler;

    /**
     * 登录页面
     * @return
     */
    @RequestMapping(value = "/index", method = RequestMethod.GET)
    public String index(){
        return "login";
    }

    /**
     * 登录
     * @return
     */
    @RequestMapping(value = "/doLogin", method = RequestMethod.POST)
    @ResponseBody
    public JSONObject doLogin(@RequestBody JSONObject o) {
        HttpSession session = apiHandler.getRequest().getSession();
        session.setAttribute("userName", o.getString("userName"));
        JSONObject obj = new JSONObject();
        obj.put("result", "SUCCESS");
        return obj;
    }

    /**
     * 主页面
     * @return
     */
    @RequestMapping(value = "/main", method = RequestMethod.GET)
    public String main(){
        return "main";
    }

}

9、User.java用户实体类

package com.yang.user.entity;

/**
 * explain:用户实体类
 *
 * @author yang
 * @date 2021/1/1
 */
public class User {

    private Integer id;

    private String userName;

    private String name;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

10、UserController.java 用户控制层

package com.yang.user;

import com.yang.user.entity.User;
import com.yang.user.service.IUserService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * explain:用户控制类
 *
 * @author yang
 * @date 2021/1/1
 */
@RestController
@RequestMapping("/user")
public class UserController {

    private static final Logger LOGGER = LoggerFactory.getLogger(UserController.class);

    @Autowired
    private IUserService userService;


    @RequestMapping(value = "/queryList", method = RequestMethod.POST)
    @ResponseBody
    public List<User> queryList() {
        return userService.queryList();
    }

}

结果

在这里插入图片描述

(若有什么错误,请留言指正,3Q)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值