Explorar o código

新增登录模块

chenminghua %!s(int64=4) %!d(string=hai) anos
pai
achega
9e10b047f5
Modificáronse 25 ficheiros con 675 adicións e 44 borrados
  1. 1 1
      src/main/java/com/gyee/MpGenerator.java
  2. 34 13
      src/main/java/com/gyee/SqlSeverTicket.java
  3. 75 0
      src/main/java/com/gyee/frame/aspect/VerificationAspect.java
  4. 11 0
      src/main/java/com/gyee/frame/common/exception/GlobalExceptionResolver.java
  5. 37 0
      src/main/java/com/gyee/frame/common/exception/LoginException.java
  6. 16 14
      src/main/java/com/gyee/frame/common/interceptor/MyWebAppConfigurer.java
  7. 21 0
      src/main/java/com/gyee/frame/controller/ticket/IbsusersController.java
  8. 45 0
      src/main/java/com/gyee/frame/controller/ticket/LoginController.java
  9. 35 0
      src/main/java/com/gyee/frame/controller/ticket/WfinstanceController.java
  10. 6 9
      src/main/java/com/gyee/frame/controller/ticket/WftransController.java
  11. 16 0
      src/main/java/com/gyee/frame/mapper/ticket/IbsusersMapper.java
  12. 10 0
      src/main/java/com/gyee/frame/mapper/ticket/LaborMapper.java
  13. 73 0
      src/main/java/com/gyee/frame/model/ticket/Ibsusers.java
  14. 16 0
      src/main/java/com/gyee/frame/model/ticket/TokenUser.java
  15. 31 0
      src/main/java/com/gyee/frame/service/impl/ticket/IbsusersServiceImpl.java
  16. 7 0
      src/main/java/com/gyee/frame/service/impl/ticket/LaborServiceImpl.java
  17. 5 4
      src/main/java/com/gyee/frame/service/impl/ticket/WfinstanceServiceImpl.java
  18. 24 0
      src/main/java/com/gyee/frame/service/ticket/IbsusersService.java
  19. 9 0
      src/main/java/com/gyee/frame/service/ticket/LaborService.java
  20. 82 0
      src/main/java/com/gyee/frame/service/ticket/ShiroService.java
  21. 3 2
      src/main/java/com/gyee/frame/service/ticket/WfinstanceService.java
  22. 1 1
      src/main/java/com/gyee/frame/shiro/config/CorsFilter.java
  23. 46 0
      src/main/java/com/gyee/frame/util/ticket/TokenCache.java
  24. 44 0
      src/main/java/com/gyee/frame/util/ticket/TokenGenerator.java
  25. 27 0
      src/main/resources/mybatis/ticket/IbsusersMapper.xml

+ 1 - 1
src/main/java/com/gyee/MpGenerator.java

@@ -41,7 +41,7 @@ public class MpGenerator {
 //    private static String driverName = "com.mysql.jdbc.Driver";
 //    private static String url = "jdbc:mysql://localhost:3306/assemb?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false";
     private static String username = "sa";
-    private static String password = "gyee54321";
+    private static String password = "Gyee@321#!";
 
     public static void main(String[] args) {
         AutoGenerator gen = new AutoGenerator();

+ 34 - 13
src/main/java/com/gyee/SqlSeverTicket.java

@@ -34,15 +34,15 @@ public class SqlSeverTicket {
 //            setLabor(conn, labor);
 //            List<String> list = getLabors(conn);
 //            for(int i = 0; i < list.size(); i++){
-//                setImage(conn, "D:/document/两票相关材料/人员电子签名/电子签名thumb/" + list.get(i).toLowerCase() +".png", list.get(i).toLowerCase());
+//                setImage(conn, "D:/document/两票相关材料/人员电子签名/电子签名thumb2/" + list.get(i).toLowerCase() +".png", list.get(i).toLowerCase());
 //            }
 //            setImage(conn, "D:/document/两票相关材料/人员电子签名/电子签名thumb/wangbing.png", "wangbing");
 
             //        String fileName = "wangbing.png";
 //
-//        String filePath1 = "D:/document/两票相关材料/人员电子签名/";
-//        String filePath2 = "D:/document/两票相关材料/人员电子签名/电子签名thumb/";
-//        batchThumb(filePath1, filePath2);
+        String filePath1 = "D:/document/两票相关材料/人员电子签名/电子签名2/";
+        String filePath2 = "D:/document/两票相关材料/人员电子签名/电子签名thumb2/";
+        batchThumb(filePath1, filePath2);
 //        singleThumb(filePath1, filePath2, fileName);
         } catch (Exception e) {
             e.printStackTrace();
@@ -93,6 +93,18 @@ public class SqlSeverTicket {
 
     // signpicture表插入人员信息
     public static void setLabor(Connection conn, Map map) throws SQLException {
+        List<String> lists = new ArrayList<>();
+        try {
+            PreparedStatement ps = conn.prepareStatement("select * from SIGNPICTURE");
+            ResultSet rs = ps.executeQuery();
+            while(rs.next()){
+                String laborNum = rs.getString("LABORNUM");
+                lists.add(laborNum);
+            }
+        } catch (SQLException e) {
+            e.printStackTrace();
+        }
+
         PreparedStatement ps = null;
         try {
             ps = conn.prepareStatement("Insert into SIGNPICTURE (LABORNUM,LABORNAME,DEPTNUM) values (?,?,?)");
@@ -100,12 +112,15 @@ public class SqlSeverTicket {
             while(entries.hasNext()){
                 Map.Entry<String, List> entry = entries.next();
                 String key = entry.getKey();
-                List list = entry.getValue();
-                ps.setString(1,key);
-                ps.setString(2, String.valueOf(list.get(0)));
-                ps.setString(3, String.valueOf(list.get(1)));
+                if(!lists.contains(key))
+                {
+                    List list = entry.getValue();
+                    ps.setString(1,key);
+                    ps.setString(2, String.valueOf(list.get(0)));
+                    ps.setString(3, String.valueOf(list.get(1)));
 //                ps.setBinaryStream(3,fis,(int)file.length());
-                ps.executeUpdate();
+                    ps.executeUpdate();
+                }
             }
             ps.close();
         } catch (SQLException e) {
@@ -144,16 +159,22 @@ public class SqlSeverTicket {
 
 
     // 图片签名处理
-    private static void batchThumb(String filePath1, String filePath2) throws IOException {
+    private static void batchThumb(String filePath1, String filePath2){
         File file = new File(filePath1);
         File[] files = file.listFiles();
         if(files != null){
             for(int i = 0; i < files.length; i++){
                 String fileName = files[i].getName();
 
-                Thumbnails.of(filePath1 + fileName)
-                        .size(100, 40)
-                        .toFile(filePath2 + fileName);
+                try {
+                    Thumbnails.of(filePath1 + fileName)
+                            .size(100, 40)
+                            .toFile(filePath2 + fileName);
+                } catch (IOException e) {
+                    e.printStackTrace();
+                } finally {
+                    continue;
+                }
             }
         }
     }

+ 75 - 0
src/main/java/com/gyee/frame/aspect/VerificationAspect.java

@@ -0,0 +1,75 @@
+package com.gyee.frame.aspect;
+
+
+import com.gyee.frame.common.exception.LoginException;
+import com.gyee.frame.model.ticket.Ibsusers;
+import com.gyee.frame.model.ticket.TokenUser;
+import com.gyee.frame.service.ticket.IbsusersService;
+import com.gyee.frame.service.ticket.LaborService;
+import com.gyee.frame.service.ticket.ShiroService;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Before;
+import org.aspectj.lang.annotation.Pointcut;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Date;
+
+@Aspect
+@Component
+public class VerificationAspect {
+
+    @Autowired
+    ShiroService shiroService;
+    @Autowired
+    IbsusersService ibsusersService;
+    @Autowired
+    LaborService laborService;
+
+
+    @Pointcut("execution(* com.gyee.frame.controller.ticket.*.*(..))")
+    public void pointcut(){}
+
+    @Before("pointcut()")
+    public void signVerification() {
+        ServletRequestAttributes requestAttributes =
+                (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+        HttpServletRequest request = requestAttributes.getRequest();
+
+        String url = request.getRequestURI();
+        String token = request.getHeader("token");
+        if (url != null && url.contains("sys/login")) {
+            /**
+             * 登录更新token
+             */
+            TokenUser user = shiroService.findToken(token);
+            /**
+             * user == null 表示第一次登录
+             */
+            if (user == null)
+                return;
+
+            Ibsusers users = ibsusersService.findUser(user.getLaborNum(), user.getPassword());
+            /**
+             *  如果users == null 表示之前的登录信息和现有的登录信息不一致
+             */
+            if (users == null)
+                throw new LoginException("请先登录");
+        } else {
+            TokenUser user = shiroService.findToken(token);
+            if (user == null)
+                throw new LoginException("请先登录");
+
+            long expireTime = user.getExpireTime();
+            long nowTime = new Date().getTime();
+            /**
+             * 判断登录是否过期
+             */
+            if (nowTime - expireTime > shiroService.EXPIRE)
+                throw new LoginException("请先登录");
+        }
+    }
+}

+ 11 - 0
src/main/java/com/gyee/frame/common/exception/GlobalExceptionResolver.java

@@ -117,4 +117,15 @@ public class GlobalExceptionResolver{
         return AjaxResult.error("运行时异常:" + e.getMessage());
     }
 
+    /**
+     * 拦截登录异常
+     * @param e
+     * @return
+     */
+    @ExceptionHandler(LoginException.class)
+    public AjaxResult loginFail(LoginException e)
+    {
+        logger.error("登录异常:", e.getMsg());
+        return AjaxResult.error(e.getMessage());
+    }
 }

+ 37 - 0
src/main/java/com/gyee/frame/common/exception/LoginException.java

@@ -0,0 +1,37 @@
+package com.gyee.frame.common.exception;
+
+
+public class LoginException extends RuntimeException{
+
+    private static final long serialVersionUID = 1L;
+    private int code = 4004;
+    private String msg;
+
+    public LoginException() {
+        super();
+    }
+
+    public LoginException(String msg) {
+        super(msg);
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+
+    public void setMsg(String msg) {
+        this.msg = msg;
+    }
+
+
+    public int getCode() {
+        return code;
+    }
+
+
+    public void setCode(int code) {
+        this.code = code;
+    }
+
+}

+ 16 - 14
src/main/java/com/gyee/frame/common/interceptor/MyWebAppConfigurer.java

@@ -23,20 +23,22 @@ public class MyWebAppConfigurer  extends  WebMvcConfigurationSupport  {
 	/** 解决跨域问题 **/
 	@Override
 	public void addCorsMappings(CorsRegistry registry){
-		/*
-			registry.addMapping("/**")
-			// 设置允许跨域请求的域名
-			.allowedOrigins("*")
-			// 是否允许证书
-			.allowCredentials(true)
-			// 设置允许的方法
-			.allowedMethods("GET", "POST", "DELETE", "PUT")
-			// 设置允许的header属性
-			.allowedHeaders("*")
-			// 跨域允许时间
-			.maxAge(3600);
-			super.addCorsMappings(registry);
-		*/
+
+		registry.addMapping("/**")
+		// 设置允许跨域请求的域名
+		.allowedOrigins("*")
+		// 设置允许跨域的header
+		.allowedHeaders("*")
+		// 是否允许证书
+		.allowCredentials(true)
+		// 设置允许的方法
+		.allowedMethods("GET", "POST", "DELETE", "PUT")
+		// 设置允许的header属性
+		.allowedHeaders("*")
+		// 跨域允许时间
+		.maxAge(3600);
+		super.addCorsMappings(registry);
+
 	}
 	
 	/** 添加拦截器 **/

+ 21 - 0
src/main/java/com/gyee/frame/controller/ticket/IbsusersController.java

@@ -0,0 +1,21 @@
+package com.gyee.frame.controller.ticket;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author chenmh
+ * @since 2020-08-04
+ */
+@RestController
+@RequestMapping("/ibsusers")
+public class IbsusersController {
+
+}
+

+ 45 - 0
src/main/java/com/gyee/frame/controller/ticket/LoginController.java

@@ -0,0 +1,45 @@
+package com.gyee.frame.controller.ticket;
+
+import com.gyee.frame.common.dataSources.DataSource;
+import com.gyee.frame.common.dataSources.DataSourceType;
+import com.gyee.frame.common.domain.AjaxResult;
+import com.gyee.frame.model.ticket.Ibsusers;
+import com.gyee.frame.model.ticket.Labor;
+import com.gyee.frame.service.ticket.IbsusersService;
+import com.gyee.frame.service.ticket.LaborService;
+import com.gyee.frame.service.ticket.ShiroService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Map;
+
+@RestController
+public class LoginController {
+
+    @Autowired
+    LaborService laborService;
+    @Autowired
+    IbsusersService ibsusersService;
+    @Autowired
+    ShiroService shiroService;
+
+    @DataSource(value = DataSourceType.TICKET)
+    @PostMapping(value = "sys/login")
+    public AjaxResult login(@RequestParam("username") String username, @RequestParam("password") String password){
+        Labor labor = laborService.getLabor(username, password);
+        Ibsusers user = ibsusersService.findUser(username, password);
+        if (labor == null || user == null)
+            return AjaxResult.error(4004, "用户名或密码错误");
+
+        Map<String, Object> token = shiroService.createToken(labor);
+
+        return AjaxResult.successData(token);
+    }
+
+    @PostMapping(value = "sys/logout")
+    public AjaxResult logout(@RequestHeader("token")String token){
+        shiroService.logout(token);
+
+        return AjaxResult.successData("您已安全退出系统");
+    }
+}

+ 35 - 0
src/main/java/com/gyee/frame/controller/ticket/WfinstanceController.java

@@ -1,10 +1,20 @@
 package com.gyee.frame.controller.ticket;
 
 
+import com.alibaba.fastjson.JSONObject;
+import com.gyee.frame.common.dataSources.DataSource;
+import com.gyee.frame.common.dataSources.DataSourceType;
+import com.gyee.frame.common.domain.AjaxResult;
+import com.gyee.frame.service.ticket.WfinstanceService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.List;
+
 /**
  * <p>
  *  前端控制器
@@ -17,5 +27,30 @@ import org.springframework.web.bind.annotation.RestController;
 @RequestMapping("/wfinstance")
 public class WfinstanceController {
 
+    @Autowired
+    WfinstanceService wfinstanceService;
+
+    @DataSource(DataSourceType.TICKET)
+    @PostMapping(value = "init/flow")
+    public AjaxResult initFlow(@RequestParam("info") String info){
+        JSONObject jsonObject = JSONObject.parseObject(info);
+        int status = jsonObject.getInteger("status");
+        double ownerId = jsonObject.getDouble("ownerid");
+        String wfName = jsonObject.getString("wfname");
+        String stater = jsonObject.getString("stater");
+        String principal = jsonObject.getString("principal");
+        String role = jsonObject.getString("role");
+        String ticketNum = jsonObject.getString("ticketnum");
+        List<String> labors = (List<String>) jsonObject.get("labors");
+
+        // 流程初始化
+        if (status == 0){
+            boolean result = wfinstanceService.initInstance(ownerId, wfName, ticketNum, principal, stater, labors.get(0), role);
+            if (!result)
+                return AjaxResult.error(4004, "流程发送失败");
+        }
+
+        return AjaxResult.success("流程发送成功");
+    }
 }
 

+ 6 - 9
src/main/java/com/gyee/frame/controller/ticket/WftransController.java

@@ -52,25 +52,22 @@ public class WftransController {
         int status = jsonObject.getInteger("status");
         double actionId = jsonObject.getDouble("actionid");
         double ownerId = jsonObject.getDouble("ownerid");
+        double currNodeId = jsonObject.getDouble("currnodeid");
+        double preNodeId = jsonObject.getDouble("prenodeid");
+        double instId = jsonObject.getDouble("instid");
+        double version = jsonObject.getDouble("version");
         String wfName = jsonObject.getString("wfname");
         String role = jsonObject.getString("role");
         String ticketNum = jsonObject.getString("ticketnum");
-        String principal = jsonObject.getString("principal");
         List<String> labors = (List<String>) jsonObject.get("labors");
 
         // 流程正在进行
         if (status == 2){
-            boolean result = wftransService.insertTrans(jsonObject.getDouble("currnodeid"), jsonObject.getDouble("prenodeid"),
-                    actionId, jsonObject.getDouble("instid"), jsonObject.getDouble("version"), ownerId, wfName, ticketNum, role, labors);
+            boolean result = wftransService.insertTrans(currNodeId, preNodeId,
+                    actionId, instId,version , ownerId, wfName, ticketNum, role, labors);
             if(!result)
                 AjaxResult.error(4004, "流程发送失败");
         }
-        // 流程初始化
-        if (status == 0){
-            boolean result = wfinstanceService.initInstance(ownerId, wfName, ticketNum, principal, labors.get(0), role);
-            if (!result)
-                return AjaxResult.error(4004, "流程发送失败");
-        }
 
         return AjaxResult.success("流程发送成功");
     }

+ 16 - 0
src/main/java/com/gyee/frame/mapper/ticket/IbsusersMapper.java

@@ -0,0 +1,16 @@
+package com.gyee.frame.mapper.ticket;
+
+import com.gyee.frame.model.ticket.Ibsusers;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author chenmh
+ * @since 2020-08-04
+ */
+public interface IbsusersMapper extends BaseMapper<Ibsusers> {
+
+}

+ 10 - 0
src/main/java/com/gyee/frame/mapper/ticket/LaborMapper.java

@@ -43,4 +43,14 @@ public interface LaborMapper extends BaseMapper<Labor> {
      */
     @Select("select top 1 t1.* from LABOR t1 LEFT JOIN  WFINSTANCE t2 ON t1.LABORNUM=t2.STARTOR WHERE t2.id = #{instId}")
     List<Labor> getFlowStarter(double instId);
+
+    /**
+     * 用户登录查询
+     *
+     * @param username
+     * @param password
+     * @return
+     */
+    @Select("select t1.* from LABOR t1 left join IBSUSERS t2 on t1.labornum = t2.labornum where t2.labornum = #{username} and t2.password = #{password}")
+    Labor getLaborOfLogin(String username, String password);
 }

+ 73 - 0
src/main/java/com/gyee/frame/model/ticket/Ibsusers.java

@@ -0,0 +1,73 @@
+package com.gyee.frame.model.ticket;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import java.util.Date;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author chenmh
+ * @since 2020-08-04
+ */
+@Data
+  @EqualsAndHashCode(callSuper = false)
+    @TableName("IBSUSERS")
+public class Ibsusers extends Model<Ibsusers> {
+
+    private static final long serialVersionUID=1L;
+
+      @TableId("ID")
+      private Double id;
+
+    @TableField("USERID")
+    private String userid;
+
+    @TableField("LABORNUM")
+    private String labornum;
+
+    @TableField("LOGINID")
+    private String loginid;
+
+    @TableField("PASSWORD")
+    private String password;
+
+    @TableField("FAILEDLOGINS")
+    private Double failedlogins;
+
+    @TableField("PASWDEXPIRATION")
+    private String paswdexpiration;
+
+    @TableField("PWEXPIRATION")
+    private Date pwexpiration;
+
+    @TableField("STATUS")
+    private String status;
+
+    @TableField("ISSYSUSER")
+    private String issysuser;
+
+    @TableField("DEFSTOREROOM")
+    private String defstoreroom;
+
+    @TableField("REMARK")
+    private String remark;
+
+    @TableField("ORDERBY")
+    private Double orderby;
+
+
+    @Override
+    protected Serializable pkVal() {
+          return this.id;
+      }
+
+}

+ 16 - 0
src/main/java/com/gyee/frame/model/ticket/TokenUser.java

@@ -0,0 +1,16 @@
+package com.gyee.frame.model.ticket;
+
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class TokenUser {
+
+    private String laborNum;
+    private String laborName;
+    private String password;
+    private String department;
+    private Long updateTime;
+    private Long expireTime;
+}

+ 31 - 0
src/main/java/com/gyee/frame/service/impl/ticket/IbsusersServiceImpl.java

@@ -0,0 +1,31 @@
+package com.gyee.frame.service.impl.ticket;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.gyee.frame.model.ticket.Ibsusers;
+import com.gyee.frame.mapper.ticket.IbsusersMapper;
+import com.gyee.frame.service.ticket.IbsusersService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.gyee.frame.util.MD5Util;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author chenmh
+ * @since 2020-08-04
+ */
+@Service
+public class IbsusersServiceImpl extends ServiceImpl<IbsusersMapper, Ibsusers> implements IbsusersService {
+
+    @Override
+    public Ibsusers findUser(String username, String password) {
+        password = MD5Util.encode(password);
+        QueryWrapper<Ibsusers> wrapper = new QueryWrapper<>();
+        wrapper.eq("LABORNUM", username);
+        wrapper.eq("PASSWORD", password);
+
+        return baseMapper.selectOne(wrapper);
+    }
+}

+ 7 - 0
src/main/java/com/gyee/frame/service/impl/ticket/LaborServiceImpl.java

@@ -5,6 +5,7 @@ import com.gyee.frame.model.ticket.Labor;
 import com.gyee.frame.mapper.ticket.LaborMapper;
 import com.gyee.frame.service.ticket.LaborService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.gyee.frame.util.MD5Util;
 import org.springframework.stereotype.Service;
 
 import java.util.List;
@@ -52,4 +53,10 @@ public class LaborServiceImpl extends ServiceImpl<LaborMapper, Labor> implements
     public List<Labor> getFlowStarter(double instId) {
         return baseMapper.getFlowStarter(instId);
     }
+
+    @Override
+    public Labor getLabor(String username, String password) {
+        password = MD5Util.encode(password);
+        return baseMapper.getLaborOfLogin(username, password);
+    }
 }

+ 5 - 4
src/main/java/com/gyee/frame/service/impl/ticket/WfinstanceServiceImpl.java

@@ -147,7 +147,7 @@ public class WfinstanceServiceImpl extends ServiceImpl<WfinstanceMapper, Wfinsta
 
     @Transactional
     @Override
-    public boolean initInstance(double ownerId, String wfName, String ticketNum, String principal, String laborNum, String role) {
+    public boolean initInstance(double ownerId, String wfName, String ticketNum, String principal, String stater, String labor, String role) {
         QueryWrapper<Wfinstance> wrapper = new QueryWrapper<>();
         wrapper.eq("OWNERID", ownerId);
         List<Wfinstance> wfinstances = baseMapper.selectList(wrapper);
@@ -173,7 +173,7 @@ public class WfinstanceServiceImpl extends ServiceImpl<WfinstanceMapper, Wfinsta
         instance.setOwnertable(process.getTablename());
         instance.setOwnerid(ownerId);
         instance.setActive("是");
-        instance.setStartor(principal);
+        instance.setStartor(stater);
         instance.setStarttime(new Date());
         instance.setCurnodeid(action.getEndnodeid());
         instance.setDescription(description);
@@ -186,7 +186,7 @@ public class WfinstanceServiceImpl extends ServiceImpl<WfinstanceMapper, Wfinsta
         Wfassignment assignment = new Wfassignment();
         assignment.setDescription(task.getDescription().replace(":{TICKETNUM}", ticketNum));
         assignment.setId((double)wfassignmentService.selectMaxId() + 1);
-        assignment.setAssigncode(laborNum);
+        assignment.setAssigncode(labor);
         assignment.setApp(TicketUtil.wfNameFormat(wfName));
         assignment.setStartdate(new Date());
         assignment.setEmailnotify("否");
@@ -197,6 +197,7 @@ public class WfinstanceServiceImpl extends ServiceImpl<WfinstanceMapper, Wfinsta
         assignment.setInitperson("");
         assignment.setOwnertable(process.getTablename());
         assignment.setOwnerid(ownerId);
+        assignment.setInitperson(stater);
         assignment.setWfrole(role);
         assignment.setDealtimeout(0.0);
         assignment.setDealtype("0");
@@ -227,7 +228,7 @@ public class WfinstanceServiceImpl extends ServiceImpl<WfinstanceMapper, Wfinsta
         trans.setOwnerid(ownerId);
         // TODO
         // 根据当前登录角色添加
-        trans.setAssigncode(laborNum);
+        trans.setAssigncode(stater);
         trans.setPriority(Double.valueOf(0));
 
         boolean result = wftransService.save(trans);

+ 24 - 0
src/main/java/com/gyee/frame/service/ticket/IbsusersService.java

@@ -0,0 +1,24 @@
+package com.gyee.frame.service.ticket;
+
+import com.gyee.frame.model.ticket.Ibsusers;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author chenmh
+ * @since 2020-08-04
+ */
+public interface IbsusersService extends IService<Ibsusers> {
+
+    /**
+     * 查找用户
+     *
+     * @param username
+     * @return
+     */
+    Ibsusers findUser(String username, String password);
+
+}

+ 9 - 0
src/main/java/com/gyee/frame/service/ticket/LaborService.java

@@ -52,4 +52,13 @@ public interface LaborService extends IService<Labor> {
      * @param instId
      */
     List<Labor> getFlowStarter(double instId);
+
+    /**
+     * 登录用户查询
+     *
+     * @param username
+     * @param password
+     * @return
+     */
+    Labor getLabor(String username, String password);
 }

+ 82 - 0
src/main/java/com/gyee/frame/service/ticket/ShiroService.java

@@ -0,0 +1,82 @@
+package com.gyee.frame.service.ticket;
+
+import com.gyee.frame.model.ticket.Labor;
+import com.gyee.frame.model.ticket.TokenUser;
+import com.gyee.frame.util.ticket.TokenCache;
+import com.gyee.frame.util.ticket.TokenGenerator;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+@Service
+public class ShiroService {
+
+    @Autowired
+    LaborService laborService;
+    @Autowired
+    TokenCache tokenCache;
+
+    //10天后过期
+    public final long EXPIRE = 10 * 24 * 60 * 60;
+
+    public Map<String, Object> createToken(Labor labor){
+        Map<String, Object> result = new HashMap<>();
+        if (labor == null)
+            return result;
+
+        //生成一个token id
+        String tokenId = TokenGenerator.generateValue();
+        //当前时间
+        Date now = new Date();
+        //过期时间
+        long expireTime = now.getTime() + EXPIRE * 1000;
+
+        TokenUser user = new TokenUser();
+        user.setLaborNum(labor.getLabornum());
+        user.setLaborName(labor.getLaborname());
+        user.setDepartment(labor.getDeptnum());
+        user.setExpireTime(expireTime);
+
+        // 保存并更新token
+        tokenCache.saveToken(tokenId, user);
+
+        result.put("token", tokenId);
+        result.put("user", user);
+
+        return result;
+    }
+
+    public void logout(String token) {
+       tokenCache.removeToken(token);
+    }
+
+    public TokenUser findToken(String token) {
+        return tokenCache.findToken(token);
+    }
+
+    public Map<String, Object> updateToken(String tokenId, TokenUser token){
+        Map<String, Object> result = new HashMap<>();
+
+        //当前时间
+        Date now = new Date();
+        //过期时间
+        long expireTime = now.getTime() + EXPIRE * 1000;
+
+        TokenUser user = new TokenUser();
+        user.setLaborNum(token.getLaborNum());
+        user.setLaborName(token.getLaborName());
+        user.setDepartment(token.getDepartment());
+        user.setExpireTime(expireTime);
+
+        // 保存并更新token
+        tokenCache.saveToken(tokenId, user);
+
+        result.put("token", tokenId);
+        result.put("user", user);
+
+        return result;
+    }
+}

+ 3 - 2
src/main/java/com/gyee/frame/service/ticket/WfinstanceService.java

@@ -43,11 +43,12 @@ public interface WfinstanceService extends IService<Wfinstance> {
      * @param wfName
      * @param ticketNum
      * @param principal
-     * @param laborNum
+     * @param stater
+     * @param labors
      * @param role
      * @return
      */
-    boolean initInstance(double ownerId, String wfName, String ticketNum, String principal, String laborNum, String role);
+    boolean initInstance(double ownerId, String wfName, String ticketNum, String principal, String stater, String labors, String role);
 
     /**
      * 更新 cuenodeid 字段及状态

+ 1 - 1
src/main/java/com/gyee/frame/shiro/config/CorsFilter.java

@@ -30,7 +30,7 @@ public class CorsFilter implements Filter {
         httpResponse.setHeader("Access-Control-Allow-Origin","*");
         httpResponse.setHeader("Access-Control-Allow-Methods", httpRequest.getMethod());
         httpResponse.setHeader("Access-Control-Max-Age", "3600");
-        httpResponse.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, authorization");
+        httpResponse.setHeader("Access-Control-Allow-Headers", "*");
         httpResponse.setHeader("Access-Control-Allow-Credentials", "true");
         //屏蔽登入操作
         chain.doFilter(request, response);

+ 46 - 0
src/main/java/com/gyee/frame/util/ticket/TokenCache.java

@@ -0,0 +1,46 @@
+package com.gyee.frame.util.ticket;
+
+import com.gyee.frame.model.ticket.TokenUser;
+import org.springframework.stereotype.Component;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Component
+public class TokenCache {
+
+    private Map<String, TokenUser> tokenMap = new HashMap<>();
+
+    public TokenUser getToken(String tokenId) {
+        TokenUser data = null;
+        if (tokenMap.containsKey(tokenId)) {
+            data = tokenMap.get(tokenId);
+        }
+        return data;
+    }
+
+    public boolean saveToken(String tokenId, TokenUser token) {
+        if (tokenMap.containsKey(tokenId)){
+            return false;
+        }
+        tokenMap.put(tokenId, token);
+
+        return  true;
+    }
+
+    public boolean removeToken(String tokenId){
+       if (tokenMap.containsKey(tokenId)){
+           tokenMap.remove(tokenId);
+           return true;
+       }
+       return false;
+    }
+
+    public TokenUser findToken(String tokenId){
+        TokenUser token = null;
+        if (tokenMap.containsKey(tokenId))
+            token = tokenMap.get(tokenId);
+
+        return token;
+    }
+}

+ 44 - 0
src/main/java/com/gyee/frame/util/ticket/TokenGenerator.java

@@ -0,0 +1,44 @@
+package com.gyee.frame.util.ticket;
+
+import java.security.MessageDigest;
+import java.util.UUID;
+
+public class TokenGenerator {
+
+    private TokenGenerator(){}
+
+    public static String generateValue() {
+        return generateValue(UUID.randomUUID().toString());
+    }
+
+    private static final char[] hexCode = "0123456789abcdefgh".toCharArray();
+
+    private static String toHexString(byte[] data) {
+        if (data == null) {
+            return null;
+        }
+        StringBuilder r = new StringBuilder(data.length * 2);
+        for (byte b : data) {
+            r.append(hexCode[(b >> 4) & 0xF]);
+            r.append(hexCode[(b & 0xF)]);
+        }
+        return r.toString();
+    }
+
+    /**
+     * 生成Token
+     * @param param
+     * @return
+     */
+    private static String generateValue(String param) {
+        try {
+            MessageDigest algorithm = MessageDigest.getInstance("MD5");
+            algorithm.reset();
+            algorithm.update(param.getBytes());
+            byte[] messageDigest = algorithm.digest();
+            return toHexString(messageDigest);
+        } catch (Exception e) {
+            throw new RuntimeException("生成Token失败");
+        }
+    }
+}

+ 27 - 0
src/main/resources/mybatis/ticket/IbsusersMapper.xml

@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.gyee.frame.mapper.ticket.IbsusersMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.gyee.frame.model.ticket.Ibsusers">
+        <id column="ID" property="id" />
+        <result column="USERID" property="userid" />
+        <result column="LABORNUM" property="labornum" />
+        <result column="LOGINID" property="loginid" />
+        <result column="PASSWORD" property="password" />
+        <result column="FAILEDLOGINS" property="failedlogins" />
+        <result column="PASWDEXPIRATION" property="paswdexpiration" />
+        <result column="PWEXPIRATION" property="pwexpiration" />
+        <result column="STATUS" property="status" />
+        <result column="ISSYSUSER" property="issysuser" />
+        <result column="DEFSTOREROOM" property="defstoreroom" />
+        <result column="REMARK" property="remark" />
+        <result column="ORDERBY" property="orderby" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        ID, USERID, LABORNUM, LOGINID, PASSWORD, FAILEDLOGINS, PASWDEXPIRATION, PWEXPIRATION, STATUS, ISSYSUSER, DEFSTOREROOM, REMARK, ORDERBY
+    </sql>
+
+</mapper>