Commit 704d3426 authored by 赵啸非's avatar 赵啸非

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	fill-manager/src/main/java/com/mortals/xhx/base/framework/security/SecurityUtils.java
parents 0f40c1c3 a74945e2
......@@ -53,7 +53,17 @@
<artifactId>guava</artifactId>
</dependency>
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-annotations</artifactId>
<version>1.6.2</version>
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>3.4.1</version>
</dependency>
<dependency>
<groupId>junit</groupId>
......@@ -70,5 +80,32 @@
<filtering>true</filtering>
</resource>
</resources>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
\ No newline at end of file
package com.mortals.xhx.common.pdu.flow;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.util.List;
import java.util.Map;
/**
* 工作流定义前端实体类
*
* @author: finegirl
* @date: 2021/7/31 23:38
*/
@Getter
@Setter
@ApiModel("工作流定义前端实体类")
public class DefinitionVoPdu implements Serializable {
@ApiModelProperty("流程定义ID")
private String deployId;
@ApiModelProperty("状态")
private Integer state;
}
package com.mortals.xhx.common.pdu.flow;
import lombok.Builder;
import lombok.Data;
import java.io.Serializable;
@Data
@Builder
public class FlowCommentPdu implements Serializable {
/**
* 意见类别 0 正常意见 1 退回意见 2 驳回意见
*/
private String type;
/**
* 意见内容
*/
private String comment;
}
package com.mortals.xhx.common.pdu.flow;
import com.mortals.xhx.common.model.SysRole;
import com.mortals.xhx.common.model.SysUser;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
/**
* 动态人员、组
*
* @author: finegirl
* @date: 2021/8/1 22:49
*/
@Data
public class FlowNextPdu implements Serializable {
private String type;
/**
* 数据类型(fixed,dynamc两种)
*/
private String dateType;
private String vars;
private String name;
private String assignee;
private List<String> candidateUsers;
private List<String> candidateGroups;
}
package com.mortals.xhx.common.pdu.flow;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.Date;
/**
* 流程定义实体类
*
* @author: finegirl
* @date: 2021/7/31 14:56
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@ApiModel("流程定义")
public class FlowProcDefPdu implements Serializable {
/**
* 流程id
*/
@ApiModelProperty("流程id")
private String id;
/**
* 流程名称
*/
@ApiModelProperty("流程名称")
private String name;
/**
* 流程key
*/
@ApiModelProperty("流程key")
private String key;
/**
* 流程分类
*/
@ApiModelProperty("流程分类")
private String category;
/**
* 配置表单名称
*/
@ApiModelProperty("配置表单名称")
private String formName;
/**
* 配置表单id
*/
@ApiModelProperty("配置表单id")
private Long formId;
/**
* 版本
*/
@ApiModelProperty("版本")
private int version;
/**
* 部署id
*/
@ApiModelProperty("部署ID")
private String deploymentId;
/**
* 流程定义状态: 1:激活 , 2:中止
*/
@ApiModelProperty("流程定义状态: 1:激活 , 2:中止")
private int suspensionState;
/**
* 部署时间
*/
@ApiModelProperty("部署时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date deploymentTime;
}
package com.mortals.xhx.common.pdu.flow;
import lombok.Data;
import java.io.Serializable;
/**
* 流程类
*
* @author: finegirl
* @date: 2021/7/31 21:15
*/
@Data
public class FlowSaveXmlPdu implements Serializable {
/**
* 流程名称
*/
private String name;
/**
* 流程分类
*/
private String category;
/**
* xml 文件
*/
private String xml;
}
package com.mortals.xhx.common.pdu.flow;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
@Data
public class FlowTaskNotifyPdu implements Serializable {
/**
* 用户审核列表(一个或者多个)
*/
private List<String> userNameList;
/**
* taskId
*/
private String taskId;
/**
* taskName
*/
private String taskName;
/**
* 租户Id
*/
private String tenantId;
}
package com.mortals.xhx.common.pdu.flow;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.mortals.xhx.feign.AttachmentEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* 工作流任务
*
* @author: finegirl
* @date: 2021/7/31 23:38
*/
@Getter
@Setter
@ApiModel("工作流任务相关-返回参数")
public class FlowTaskPdu implements Serializable {
@ApiModelProperty("任务编号")
private String taskId;
@ApiModelProperty("任务名称")
private String taskName;
@ApiModelProperty("是否为子任务,0否 1是")
private Integer subTask=0;
@ApiModelProperty("父任务编号")
private String parentTaskId;
@ApiModelProperty("业务系统key")
private String businessKey;
@ApiModelProperty("任务Key")
private String taskDefKey;
@ApiModelProperty("任务执行人Id")
private String assigneeId;
@ApiModelProperty("部门名称")
private String deptName;
@ApiModelProperty("流程发起人部门名称")
private String startDeptName;
@ApiModelProperty("任务执行人名称")
private String assigneeName;
@ApiModelProperty("流程发起人Id")
private String startUserId;
@ApiModelProperty("流程发起人名称")
private String startUserName;
@ApiModelProperty("流程类型")
private String category;
@ApiModelProperty("流程变量信息")
private Object procVars;
@ApiModelProperty("局部变量信息")
private Object taskLocalVars;
@ApiModelProperty("流程部署编号")
private String deployId;
@ApiModelProperty("流程ID")
private String procDefId;
@ApiModelProperty("流程key")
private String procDefKey;
@ApiModelProperty("流程定义名称")
private String procDefName;
@ApiModelProperty("流程定义内置使用版本")
private int procDefVersion;
@ApiModelProperty("流程实例ID")
private String procInsId;
@ApiModelProperty("历史流程实例ID")
private String hisProcInsId;
@ApiModelProperty("任务耗时")
private String duration;
@ApiModelProperty("任务意见")
private FlowCommentPdu comment;
@ApiModelProperty("候选执行人")
private String candidate;
@ApiModelProperty("任务创建时间")
//@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
@ApiModelProperty("任务完成时间")
//@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date finishTime;
@ApiModelProperty("流程变量信息")
private Map<String, Object> values;
@ApiModelProperty("附件信息")
private List<AttachmentEntity> attachmentList;
/**
* 用户名称
*/
private String userCode;
@ApiModelProperty("审批人")
private String assignee;
@ApiModelProperty("候选人")
private List<String> candidateUsers;
@ApiModelProperty("审批组")
private List<String> candidateGroups;
@ApiModelProperty("业务平台标识")
private String platformSn;
}
package com.mortals.xhx.common.pdu.flow;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.util.List;
import java.util.Map;
@Getter
@Setter
@ApiModel("工作流任务相关-返回参数")
public class FlowTaskVars implements Serializable {
@ApiModelProperty("任务Id")
private String taskId;
@ApiModelProperty("节点")
private String targetKey;
private String name;
@ApiModelProperty("审批人")
private String assignee;
@ApiModelProperty("候选人")
private List<String> candidateUsers;
@ApiModelProperty("候选人")
private String candidateUsersName;
@ApiModelProperty("候选人名")
private String candidateUsersIds;
@ApiModelProperty("审批组")
private List<String> candidateGroups;
@ApiModelProperty("审批组名")
private String candidateGroupsName;
@ApiModelProperty("审批组ids")
private String candidateGroupsids;
@ApiModelProperty("el表达式")
private String el;
@ApiModelProperty("是否多实例并行,0否1是")
private Integer multiple;
@ApiModelProperty("审核人列表")
private List<String> assigneeList;
public static void main(String[] args) {
String temp="[{\"el\":\"${assignee1}\",\"multiple\":0,\"name\":\"行政审批\",\"targetKey\":\"Activity_04yxg8r\",\"assignee\":\"finegirl\",\"assigneeName\":\"张三\"},{\"el\":\"${assignee2}\",\"multiple\":0,\"name\":\"经理审批\",\"targetKey\":\"Activity_0m7qwz2\",\"assignee\":\"zhaoxiaofei\",\"assigneeName\":\"赵啸非\"},{\"el\":\"assigneeList\",\"multiple\":1,\"name\":\"领导会签\",\"targetKey\":\"Activity_1uv5dhe\",\"assigneeList\":[\"zhang1\",\"zhangbao\"],\"assigneeName\":\"张1,张宝,\"}]\n";
List<FlowTaskVars> list = JSON.parseObject(temp, new TypeReference<List<FlowTaskVars>>() {
});
//构建提交参数
JSONObject jsonObject = new JSONObject();
for(FlowTaskVars var:list){
//判断是否并联
if(var.getMultiple()==0){
//key
String el = var.getEl();
String key = el.substring(2, el.length() - 1);
//值
String assignee = var.getAssignee();
jsonObject.put(key,assignee);
}else{
//key
String key = var.getEl();
JSONArray jsonArray = new JSONArray();
jsonArray.addAll(var.getAssigneeList());
jsonObject.put(key,jsonArray);
}
}
System.out.println(JSON.toJSONString(jsonObject));
}
}
package com.mortals.xhx.common.pdu.flow;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* 工作流任务
*
* @author: finegirl
* @date: 2021/7/31 23:38
*/
@Getter
@Setter
@ApiModel("工作流任务相关-返回参数")
public class FlowTaskVoPdu implements Serializable {
@ApiModelProperty("任务Id")
private String taskId;
@ApiModelProperty("用户Id")
private String userId;
@ApiModelProperty("任务意见")
private String comment;
@ApiModelProperty("流程实例Id")
private String instanceId;
@ApiModelProperty("节点")
private String targetKey;
private String name;
@ApiModelProperty("流程变量信息")
private Map<String, Object> values;
@ApiModelProperty("审批人")
private String assignee;
@ApiModelProperty("候选人")
private List<String> candidateUsers;
@ApiModelProperty("审批组")
private List<String> candidateGroups;
@ApiModelProperty("租户Id")
private String tenantId;
@ApiModelProperty("el表达式")
private String el;
@ApiModelProperty("是否多实例并行,0否1是")
private Integer multiple;
}
package com.mortals.xhx.common.pdu.flow;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
@Data
public class FlowUserTaskPdu implements Serializable {
/**
* 用户id
*/
private String id;
/**
* 用户名称
*/
private String name;
/**
* 租户Id
*/
private String tenantId;
}
package com.mortals.xhx.common.pdu.flow;
import lombok.Data;
import java.io.Serializable;
/**
*
*
* @author: zxfei
* @date: 2021/8/5 13:28
*/
@Data
public class FlowViewerPdu implements Serializable {
private String key;
private boolean completed;
}
package com.mortals.xhx.common.pdu.sms;
import lombok.Data;
@Data
public class SmsSendReq {
private String mobile;
private String templeteId;
private String[] params;
}
package com.mortals.xhx.common.pdu.sms;
import lombok.Data;
@Data
public class SmsSendResp {
}
package com.mortals.xhx.feign;
import lombok.Data;
/**
* 附件实体类
*
* @author: zxfei
* @date: 2021/8/26 17:46
* @description:
**/
@Data
public class AttachmentEntity {
/**
* 附件名称
*/
protected String name;
/**
* 附件描述
*/
protected String desc;
/**
* 附件类型
*/
protected String type;
/**
* 附件下载地址
*/
protected String url;
}
package com.mortals.xhx.feign;
import com.mortals.xhx.common.code.CommentTypeEnum;
import com.mortals.xhx.common.code.ProcessStatusEnum;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
/**
* 流程执行过程中的基本参数Req
*
* @author: zxfei
* @date: 2021/8/26 9:55
*/
@Data
public abstract class BaseTaskReq implements Serializable {
/**********************任务相关的参数**********************/
/**
* 任务id 必填
*/
@ApiModelProperty(value = "任务id", required = true)
private String taskId;
/**
* 流程实例的id
*/
@ApiModelProperty(value = "流程实例的id", required = true)
private String processInstanceId;
/**
* 节点id 选填
*/
@ApiModelProperty(value = "节点id")
private String activityId;
/**
* 节点名称 选填
*/
@ApiModelProperty(value = "节点名称")
private String activityName;
/**
* 流程实例状态 必填
*/
@ApiModelProperty(value = "流程实例状态", required = true)
private ProcessStatusEnum processStatusEnum;
/**********************审批意见的参数**********************/
/**
* 操作人code 必填
*/
@ApiModelProperty(value = "操作人code", required = true)
private String userCode;
/**
* 审批意见 必填
*/
@ApiModelProperty(value = "审批意见", required = true)
private String message;
/**
* 审批意见类型 必填
*/
@ApiModelProperty(value = "审批意见类型", required = true)
private CommentTypeEnum commentTypeEnum;
}
package com.mortals.xhx.feign.flowable;
import com.mortals.xhx.feign.IFeign;
import com.mortals.xhx.feign.req.BaseFlowReq;
import com.mortals.xhx.feign.req.BaseQuery;
import com.mortals.xhx.feign.req.DefinitionReq;
import com.mortals.xhx.feign.rsp.ApiResp;
import com.mortals.xhx.feign.rsp.DefinitionDeployRsp;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
/**
* 工作流程访问
*
* @author: zxfei
* @date: 2021/8/31 9:34
*/
@FeignClient(name = "workflow-manager",path = "/m")
public interface IApiFlowDefinitionFeign extends IFeign {
/**
* 流程部署列表查询
*
* @param req
* @return
*/
@PostMapping("/api/definition/deploy/list")
ApiResp<DefinitionDeployRsp> deploymentsList(@RequestBody BaseFlowReq<BaseQuery> req);
/**
* 激活或挂起流程定义(已经部署)
*
* @param req
* @return
*/
@PostMapping("/api/definition/deploy/updateState")
ApiResp<String> updateState(@RequestBody DefinitionReq req);
/**
* 激活或挂起流程定义(已经部署)
*
* @param req
* @return
*/
@PostMapping("/api/definition/deploy/readXml")
ApiResp<String> readXml(@RequestBody DefinitionReq req);
}
\ No newline at end of file
package com.mortals.xhx.feign.flowable;
import com.mortals.framework.exception.AppException;
import com.mortals.xhx.common.pdu.api.ApiRespPdu;
import com.mortals.xhx.common.pdu.sms.SmsSendReq;
import com.mortals.xhx.feign.IFeign;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
/**
* 工作流api
*/
@FeignClient(name = "government-flowable",path = "/m")
public interface IApiFlowFeign extends IFeign {
/**
* 流程部署
*
* @param modelId 流程ID,来自 ACT_DE_MODEL
* @return
* @throws AppException
*/
@PostMapping(value = "/flowable/api/deploy")
ApiRespPdu<String> deploy(@RequestParam("modelId") String modelId) throws AppException;
/**
* 启动流程
*
* @param deployId 部署的流程 Id,来自 ACT_RE_PROCDEF
* @param userId 用户 Id
* @param dataKey 数据 Key,业务键,一般为表单数据的 ID,仅作为表单数据与流程实例关联的依据
* @return
* @throws AppException
*/
@PostMapping(value = "/flowable/api/start")
ApiRespPdu<String> start(@RequestParam(value = "deployId") String deployId, @RequestParam(value = "userId") String userId, @RequestParam(value = "dataKey") String dataKey);
/**
* 设置任务参数
*
* @param taskId 任务ID
* @param map 用户列表
* @return
*/
@RequestMapping(value = "/flowable/api/setVariables", method = RequestMethod.POST)
ApiRespPdu<String> setVariables(@RequestParam(value = "taskId") String taskId, @RequestBody Map<String, Object> map);
/**
* 设置任务参数
*
* @param taskId 任务ID
* @param key 键
* @param value 值
* @return
*/
@RequestMapping(value = "/setVariable", method = RequestMethod.POST)
ApiRespPdu<String> setVariable(@RequestParam(value = "taskId") String taskId,
@RequestParam(value = "key") String key,
@RequestParam(value = "value") Object value);
/**
* 设置任务参数,List 使用
*
* @param taskId 任务ID
* @param key 键
* @param value 值
* @return
*/
@RequestMapping(value = "/flowable/api/setListVariable", method = RequestMethod.POST)
ApiRespPdu<String> setListVariable(@RequestParam(value = "taskId") String taskId,
@RequestParam(value = "key") String key,
@RequestParam(value = "value") List<String> value);
/**
* 任务处理1
*
* @param taskId 任务 Id,来自 ACT_RU_TASK
* @return
*/
@RequestMapping(value = "/flowable/api/task", method = RequestMethod.POST)
ApiRespPdu<String> task(@RequestParam(value = "taskId") String taskId);
/**
* 任务处理
*
* @param taskId 任务 Id,来自 ACT_RU_TASK
* @param assignee 设置审核人,替换
* @param map 完成任务需要的条件参数
* @return
*/
@RequestMapping(value = "/flowable/api/taskByAssignee", method = RequestMethod.POST)
ApiRespPdu<String> taskByAssignee(@RequestParam(value = "taskId") String taskId,
@RequestParam(value = "assignee") String assignee,
@RequestBody Map<String, Object> map);
/**
* 中止流程
*
* @param processId 流程ID
* @return
*/
@RequestMapping(value = "/flowable/api/deleteProcess", method = RequestMethod.POST)
ApiRespPdu<String> deleteProcess(@RequestParam(value = "processId") String processId);
/**
* 获取正在运行的数据 Id 列表
*
* @return
*/
@RequestMapping(value = "/flowable/api/getRuntimeDataId", method = RequestMethod.POST)
ApiRespPdu<List<String>> getRuntimeDataId();
/**
* 根据用户,获取需要审核的业务键 business_key 列表
*
* @param userId 用户 Id
* @return
*/
@RequestMapping(value = "/flowable/api/getRuntimeBusinessKeyByUser", method = RequestMethod.POST)
ApiRespPdu<List<Map<String, Object>>> getRuntimeBusinessKeyByUser(@RequestParam(value = "userId") String userId);
/**
* 获取组,获取需要审核的业务键 business_key 列表
*
* @param groupIds 组 Id
* @return
*/
@RequestMapping(value = "/flowable/api/getRuntimeBusinessKeyByGroup", method = RequestMethod.POST)
ApiRespPdu<List<Map<String, Object>>> getRuntimeBusinessKeyByGroup(@RequestBody List<String> groupIds);
/**
* 获取用户审核历史
*
* @param userId 发起人 Id
* @return
*/
@RequestMapping(value = "/flowable/api/getHistoryByUser", method = RequestMethod.POST)
ApiRespPdu<List<Map<String, Object>>> getHistoryByUser(@RequestParam(value = "userId") String userId);
/**
* 通过流程实例 Id,判断流程是否结束
*
* @param processInstanceId 流程实例 Id
* @return true 结束,false 未结束
*/
@RequestMapping(value = "/flowable/api/checkProcessInstanceFinish", method = RequestMethod.POST)
ApiRespPdu<Boolean> checkProcessInstanceFinish(@RequestParam(value = "processInstanceId") String processInstanceId);
/**
* 根据任务节点获取流程实例 Id
*
* @param taskId 任务节点 Id
* @return
*/
@RequestMapping(value = "/flowable/api/getTaskInfo", method = RequestMethod.POST)
ApiRespPdu<String> getTaskInfo(@RequestParam(value = "taskId") String taskId);
/**
* 根据流程实例 ID 获取任务进度流程图
*
* @param processInstanceId 流程实例id
* @return base64图片数据
* @throws AppException
*/
@RequestMapping(value = "/flowable/api/getProcessDiagram", method = RequestMethod.POST)
String getProcessDiagram(@RequestParam("processInstanceId") String processInstanceId);
/**
* 根据任务 ID 获取任务进度流程图
*
* @param taskId 任务节点 Id
* @return
*/
@RequestMapping(value = "/flowable/api/getTaskProcessDiagram", method = RequestMethod.POST)
ApiRespPdu<String> getTaskProcessDiagram(@RequestParam(value = "taskId") String taskId);
}
package com.mortals.xhx.feign.flowable;
import com.mortals.xhx.common.pdu.api.ApiRespPdu;
import com.mortals.xhx.common.pdu.flow.FlowTaskVoPdu;
import com.mortals.xhx.common.pdu.flow.FlowViewerPdu;
import com.mortals.xhx.feign.IFeign;
import com.mortals.xhx.feign.processinstance.ProcessCommonReq;
import com.mortals.xhx.feign.processinstance.ProcessDeleteReq;
import com.mortals.xhx.feign.processinstance.ProcessStopReq;
import com.mortals.xhx.feign.processinstance.ProcessUpdateStateReq;
import com.mortals.xhx.feign.rsp.ApiResp;
import com.mortals.xhx.feign.runtime.StartProcessInstanceReq;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
import java.util.Map;
/**
* 工作流流程实例
*
* @author: finegirl
* @date: 2021/7/31 19:52
*/
@FeignClient(name = "workflow-manager",path = "/m")
public interface IApiFlowInstanceFeign extends IFeign {
/**
* 启动流程
*
* @param req
* @return
*/
@PostMapping("/api/flow/process/start")
ApiResp<String> processStart(@RequestBody StartProcessInstanceReq req);
/**
* 激活或挂起流程实例
*
* @param req
* @return
*/
@PostMapping("/api/flow/process/updateState")
ApiResp updateState(@RequestBody ProcessUpdateStateReq req);
/**
* 终止流程
*
* @param req
* @return
*/
@PostMapping("/api/flow/process/stop")
ApiResp<String> stopProcess(@RequestBody ProcessStopReq req);
/**
* 删除流程
*
* @param req
* @return
*/
@PostMapping("/api/flow/process/delete")
ApiResp<String> deleteProcess(@RequestBody ProcessDeleteReq req);
/**
* 获取流程执行过程
*
* @param req
* @return
*/
@PostMapping("/api/flow/process/getFlowViewer")
ApiResp<List<FlowViewerPdu>> getFlowViewer(@RequestBody ProcessCommonReq req);
/**
* 根据流程实例ID 获取当前流程运行情况 返回BASE64图片
*
* @param req
* @return base64图片数据
*/
@PostMapping("/api/flow/process/getImage")
ApiResp<String> processReadImage(@RequestBody ProcessCommonReq req);
@PostMapping("/api/flow/process/getAllProcessInstanceEl")
ApiResp<List<FlowTaskVoPdu>> getAllProcessInstanceEl(@RequestBody StartProcessInstanceReq req);
}
\ No newline at end of file
package com.mortals.xhx.feign.flowable;
import com.mortals.xhx.common.pdu.flow.FlowNextPdu;
import com.mortals.xhx.common.pdu.flow.FlowUserTaskPdu;
import com.mortals.xhx.feign.IFeign;
import com.mortals.xhx.feign.req.BaseFlowReq;
import com.mortals.xhx.feign.req.BaseQuery;
import com.mortals.xhx.feign.rsp.ApiResp;
import com.mortals.xhx.feign.rsp.TaskRsp;
import com.mortals.xhx.feign.task.*;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import java.util.List;
import java.util.Map;
/**
* 工作流任务管理
*
* @author: finegirl
* @date: 2021/7/31 19:52
*/
@FeignClient(name = "workflow-manager",path = "/m")
public interface IApiFlowTaskFeign extends IFeign {
/**
* 我发起的流程
*
* @param req
* @return
*/
@PostMapping("/api/flow/task/myProcess")
ApiResp<TaskRsp> myProcess(@RequestBody BaseFlowReq<BaseQuery> req);
/**
* 获取待办列表
* 获取的列表需要和业务系统数据合并
*
* @param req
* @return
*/
@PostMapping("/api/flow/task/todoList")
ApiResp<TaskRsp> todoList(@RequestBody BaseFlowReq<BaseQuery> req);
/**
* 获取已办任务
* 获取的列表需要和业务系统数据合并
*
* @param req
* @return
*/
@PostMapping("/api/flow/task/finishedList")
ApiResp<TaskRsp> finishedList(@RequestBody BaseFlowReq<BaseQuery> req);
/**
* 流程历史流转记录
*
* @param req
* @return
*/
@PostMapping("/api/flow/task/flowRecord")
ApiResp<TaskRsp> flowRecord(@RequestBody BaseFlowReq<BaseQuery> req);
/**
* 获取流程变量
*
* @param req
* @return
*/
@PostMapping("/api/flow/task/processVariables")
ApiResp<Map<String, Object>> processVariables(@RequestBody CommonTaskReq req);
/**
* 设置流程变量
*
* @param req
* @return
*/
@PostMapping("/api/flow/task/setProcessVariables")
ApiResp<Map<String, Object>> setProcessVariables(@RequestBody CommonTaskReq req);
/**
* 撤回流程
*
* @param req
* @return
*/
@PostMapping("/api/flow/task/revokeProcess")
ApiResp revokeProcess(@RequestBody RevokeTaskReq req);
/**
* 取消申请
*
* @param commonTaskReq
* @return
*/
@PostMapping("/api/flow/task/stopProcess")
ApiResp stopProcess(@RequestBody CommonTaskReq commonTaskReq);
/**
* 审批任务
*
* @param req
* @return
*/
@PostMapping("/api/flow/task/complete")
ApiResp<String> complete(@RequestBody CompleteTaskReq req);
/**
* 驳回任务
*
* @param req
* @return
*/
@PostMapping("/api/flow/task/reject")
ApiResp<String> reject(@RequestBody RejectTaskReq req);
/**
* 退回任务
*
* @param req
* @return
*/
@PostMapping("/api/flow/task/return")
ApiResp<String> taskReturn(@RequestBody ReturnTaskReq req);
/**
* 删除任务
*
* @param req
* @return
*/
@PostMapping("/api/flow/task/delete")
ApiResp<String> delete(@RequestBody DeleteTaskReq req);
/**
* 委派任务
*
* @param req
* @return
*/
@PostMapping("/api/flow/task/delegate")
ApiResp<String> delegateTask(@RequestBody DelegateTaskReq req);
/**
* 转办任务
*
* @param req
* @return
*/
@PostMapping("/api/flow/task/assign")
ApiResp<String> assignTask(@RequestBody TurnTaskReq req);
/**
* 加签任务
*
* @param req
* @return
*/
@PostMapping("/api/flow/task/addSign")
ApiResp<String> addSignTask(@RequestBody AddSignTaskReq req);
/**
* 获取所有可回退的节点
*
* @param req
* @return
*/
@PostMapping("/api/flow/task/findReturnTaskList")
ApiResp<List<FlowUserTaskPdu>> findReturnTaskList(@RequestBody CommonTaskReq req);
/**
* 获取下一节点
*
* @param req
* @return
*/
@PostMapping("/api/flow/task/nextFlowNode")
ApiResp<FlowNextPdu> nextFlowNode(@RequestBody CommonTaskReq req);
}
package com.mortals.xhx.feign.processinstance;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 实例查询Query
*
* @author: zxfei
* @date: 2021/8/24 20:42
*/
@Data
public class InstanceQueryParamsReq {
/**
* 用户的工号 必填
*/
@ApiModelProperty(value = "用户的工号")
private String userCode;
/**
* 平台应用标识 必填
*/
@ApiModelProperty(value = "平台应用标识")
private String platformSn;
/**
* 开始时间
*/
@ApiModelProperty(value = "开始时间")
private String startTime;
/**
* 结束时间
*/
@ApiModelProperty(value = "结束时间")
private String endTime;
/**
* 业务系统的id
*/
@ApiModelProperty(value = "业务系统的id")
private String businessKey;
/**
* 排序字段 1 升序 0 降序
*/
@ApiModelProperty(value = "排序字段 1 升序 0 降序")
private Integer orderFlag = 0;
/**
* 流程实例ID
*/
@ApiModelProperty(value = "流程实例ID")
private String processInstanceId;
/**
* 流程定义KEY
*/
@ApiModelProperty(value = "流程定义KEY")
private String processDefinitionKey;
/**
* 流程状态
*/
@ApiModelProperty(value = "流程状态")
private String processType;
/**
* 发起人工号集合
*/
@ApiModelProperty(value = "发起人工号集合")
private String startedUserIds;
}
package com.mortals.xhx.feign.processinstance;
import lombok.Data;
/**
* 实例通用请求
* @author: zxfei
* @date: 2021/8/26 10:42
* @description:
**/
@Data
public class ProcessCommonReq {
/**
* 处理人Id
*/
private String userCode;
/**
* 流程实例id
*/
private String processInstanceId;
}
package com.mortals.xhx.feign.processinstance;
import lombok.Data;
/**
* @author: zxfei
* @date: 2021/8/26 10:42
* @description:
**/
@Data
public class ProcessDeleteReq {
/**
* 处理人Id 必填
*/
private String userCode;
/**
* 流程实例id 必填
*/
private String processInstanceId;
/**
* 删除原因 必填
*/
private String deleteReason;
}
package com.mortals.xhx.feign.processinstance;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
/**
* 流程实例返回数据对象
*
* @author: zxfei
* @date: 2021/8/26 10:31
*/
@Data
@ApiModel(value = "ProcessInstanceInfo" , description = "查询流程实例返回对象")
public class ProcessInstanceInfo implements Serializable {
private static final long serialVersionUID = -5038515846218363889L;
/**
* 流程实例id
*/
private String processInstanceId;
/**
* 流程定义id
*/
private String processDefinitionId;
/**
* 流程定义的名称
*/
private String processDefinitionName;
/**
* 流程定义的key
*/
private String processDefinitionKey;
/**
* 流程定义类型
*/
private Integer processDefinitionType;
/**
* 流程定义的版本号
*/
private Integer processDefinitionVersion;
/**
* 分类编号
*/
private String categoryCode;
/**
* 部署id
*/
private String deploymentId;
/**
* 业务表单的id
*/
private String businessKey;
/**
* 办理人
*/
private String assignees;
/**
* 应用id
*/
private String appId;
/**
* 平台应用标识
*/
private String appSn;
/**
* 创建时间
*/
@JsonFormat(timezone = "GMT+8" , pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
/**
* 挂起状态 1激活 2挂起 @see ProcessInstanceStatusEnum
*/
private Integer pState;
/**
* 删除标记
*/
private String reason;
/**
* 创建人的id
*/
private String startedUserId;
/**
* 创建人的名称
*/
private String startedUserName;
/**
* 创建人ids
*/
private List<String> startedUserIds;
/**
* 默认所有的
*/
private Boolean finishFlag = false;
/**
* 流程实例状态 @see {@link ProcessStatusEnum}
*/
private String processStatus;
/**
* 流程实例状态名称
*/
private String processStatusName;
/**
* 表单的名称
*/
private String formName;
/**
* 流程创建人姓名
*/
private String startPersonName;
/**
* 流程的创建时间
*/
@JsonFormat(timezone = "GMT+8" , pattern = "yyyy-MM-dd HH:mm:ss")
private Date startTime;
/**
* 结束时间
*/
@JsonFormat(timezone = "GMT+8" , pattern = "yyyy-MM-dd HH:mm:ss")
private Date endTime;
private String startTimeStr;
private String endTimeStr;
/**
* 系统名称
*/
private String appName;
/**
* 业务系统的url
*/
private String businessUrl;
/**
* 总耗时
*/
private String totalTime;
/**
* 当前办理人(当前流程是多人办理)
*/
// private List<ApproverVo> currentAssignees;
public ProcessInstanceInfo() {
}
public ProcessInstanceInfo(String processInstanceId, String businessKey, String formName, String startedUserId) {
this.processInstanceId = processInstanceId;
this.businessKey = businessKey;
this.formName = formName;
this.startedUserId = startedUserId;
}
}
package com.mortals.xhx.feign.processinstance;
import lombok.Data;
/**
* @author: zxfei
* @date: 2021/8/26 10:42
* @description:
**/
@Data
public class ProcessStopReq {
/**
* 处理人Id 必填
*/
private String userCode;
/**
* 流程实例id
*/
private String processInstanceId;
}
package com.mortals.xhx.feign.processinstance;
import lombok.Data;
/**
* @author: zxfei
* @date: 2021/8/26 10:42
* @description:
**/
@Data
public class ProcessUpdateStateReq {
/**
* 处理人Id 必填
*/
private String userCode;
/**
* 流程实例id 必填
*/
private String processInstanceId;
/**
* 激活或挂起流程实例(1:激活,2:挂起) 必填
*/
private Integer suspensionState;
}
package com.mortals.xhx.feign.req;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
......
......@@ -20,4 +20,10 @@ public class ApiResp<T> {
*/
private T data;
// public boolean isSuccess() {
// if (YesNoEnum.YES.getValue() == code) {
// return true;
// }
// return false;
// }
}
package com.mortals.xhx.feign.rsp;
import com.mortals.xhx.common.pdu.api.Page;
import lombok.Data;
import java.util.List;
/**
* 流程部署列表(业务端可发起的实例)
*
* @author: zxfei
* @date: 2021/8/24 20:51
*/
@Data
public class DefinitionDeployRsp {
private Page page;
private List<FlowProcDef> list;
}
package com.mortals.xhx.feign.rsp;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.Date;
/**
* 流程定义类
*
* @author: zxfei
* @date: 2021/8/24 22:29
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class FlowProcDef implements Serializable {
/**
* 流程定义id
*/
private String id;
/**
* 流程名称
*/
private String name;
/**
* 流程key
*/
private String key;
/**
* 流程key
*/
private String processDefinitionKey;
/**
* 流程分类
*/
private String category;
/**
* 版本
*/
private int version;
/**
* 流程部署id
*/
private String deployId;
/**
* 流程部署id
*/
private String deploymentId;
/**
* 流程定义状态: 1:激活 , 2:中止
*/
private int suspensionState;
/**
* 部署时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date deploymentTime;
}
package com.mortals.xhx.feign.rsp;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 流程启动响应类
*
* @author: zxfei
* @date: 2021/8/24 22:29
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class FlowProcStartInfo implements Serializable {
/**
* 流程实例id
*/
private String proInstanceId;
}
package com.mortals.xhx.feign.rsp;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.mortals.xhx.common.pdu.flow.FlowCommentPdu;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* 工作流任务相关-返回参数
*
* @author: zxfei
* @date: 2021/8/25 11:13
*/
@Getter
@Setter
public class FlowTaskInfo implements Serializable {
/**
* 任务编号
*/
private String taskId;
/**
* 任务名称
*/
private String taskName;
/**
* 任务Key
*/
private String taskDefKey;
/**
* 任务执行人Id
*/
private String assigneeId;
/**
* 任务执行人名称
*/
private String assigneeName;
/**
* 流程发起人Id
*/
private String startUserId;
/**
* 流程发起人名称
*/
private String startUserName;
/**
* 流程类型
*/
private String category;
/**
* 流程变量信息
*/
private Object procVars;
/**
* 局部变量信息
*/
private Object taskLocalVars;
/**
* 流程部署ID
*/
private String deployId;
/**
* 流程定义ID
*/
private String procDefId;
/**
* 流程key
*/
private String procDefKey;
/**
* 流程定义名称
*/
private String procDefName;
/**
* 流程定义使用版本
*/
private int procDefVersion;
/**
* 流程实例ID
*/
private String procInsId;
/**
* 历史流程实例ID
*/
private String hisProcInsId;
/**
* 任务耗时
*/
private String duration;
/**
* 任务意见
*/
private FlowCommentPdu comment;
/**
* 候选执行人(多个人都能办理当前任务)
*/
private String candidate;
/**
* 任务创建时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
/**
* 任务完成时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date finishTime;
/**
* 流程变量信息
*/
private Map<String, Object> values;
/**
* 用户id
*/
private String userId;
/**
* 审批人
*/
private String assignee;
/**
* 候选人
*/
private List<String> candidateUsers;
/**
* 候选审批组
*/
private List<String> candidateGroups;
/**
* 业务系统编号
*/
private String tenantId;
}
package com.mortals.xhx.feign.rsp;
import com.mortals.xhx.common.pdu.api.Page;
import com.mortals.xhx.common.pdu.flow.FlowTaskPdu;
import lombok.Data;
import java.util.List;
/**
* 流程任务详细返回
*
* @author: zxfei
* @date: 2021/8/24 20:51
*/
@Data
public class TaskRsp {
private Page page;
private List<FlowTaskPdu> list;
}
package com.mortals.xhx.feign.runtime;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import com.mortals.framework.util.DateUtils;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
import java.util.Map;
/**
* 启动流程参数
*
* @author: zxfei
* @date: 2021/8/26 10:45
*/
@Data
public class StartProcessInstanceReq implements Serializable {
/**
* 流程部署key 必填
*/
@ApiModelProperty(value = "流程定义key" , required = true)
private String processDefinitionKey;
/**
* 业务系统表单id 必填
*/
@ApiModelProperty(value = "业务系统唯一标识" , required = true)
private String businessKey;
/**
* 业务表单显示名称 必填(如请假单)
*/
@ApiModelProperty(value = "表单显示名称" , required = true)
private String formName;
/**
* 启动流程变量 选填
*/
@ApiModelProperty(value = "启动流程变量")
private Map<String, Object> variables;
/**
* 申请人id号 必填
*/
@ApiModelProperty(value = "申请人id号")
private String userCode;
/**
* 平台系统标识 必填
*/
@ApiModelProperty(value = "平台系统标识" , required = true)
private String platformSn;
/**
* 流程提交人工号 通常和申请人id一致即可 必填
*/
@ApiModelProperty(value = "流程提交人工号 通常和申请人id一致即可" , required = true)
private String creator;
public static void main(String[] args) {
DateTime dateTime = DateUtil.offsetMonth(new Date(), 2);
System.out.println(DateUtils.getStrDate(dateTime));
}
}
package com.mortals.xhx.feign.task;
import com.mortals.xhx.feign.BaseTaskReq;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
/**
* 任务加签(审批参数)
*
* @author: zxfei
* @date: 2021/8/26 17:23
*/
@Data
@ApiModel(value = "AddSignTaskReq", description = "审批参数")
public class AddSignTaskReq extends BaseTaskReq implements Serializable {
/**
* 向前加签人员号 必填
*/
private List<String> addSignUserList;
}
package com.mortals.xhx.feign.task;
import com.mortals.xhx.feign.BaseTaskReq;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.Map;
/**
* 任务参数
*
* @author: zxfei
* @date: 2021/8/26 17:23
*/
@Data
@ApiModel(value = "CommonTaskReq" , description = "任务参数")
public class CommonTaskReq extends BaseTaskReq implements Serializable {
/**
* 平台系统标识 必填
*/
@ApiModelProperty(value = "平台系统标识" , required = true)
private String platformSn;
/**
* 启动流程变量 选填
*/
@ApiModelProperty(value = "启动流程变量")
private Map<String, Object> variables;
}
package com.mortals.xhx.feign.task;
import com.alibaba.fastjson.JSON;
import com.mortals.xhx.feign.AttachmentEntity;
import com.mortals.xhx.feign.BaseTaskReq;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 任务执行(审批参数)
*
* @author: zxfei
* @date: 2021/8/26 17:23
*/
@Data
@ApiModel(value = "CompleteTask" , description = "审批参数")
public class CompleteTaskReq extends BaseTaskReq implements Serializable {
private static final long serialVersionUID = -5583096980348786337L;
/**
* 流程标题 选填 只有在重新发起的时候才会修改表单标题
*/
@ApiModelProperty(value = "流程标题")
private String formTitle;
/**
* 任务参数 选填
*/
@ApiModelProperty(value = "任务参数")
private Map<String, Object> variables;
/**
* 任务参数 附件 选填
*/
@ApiModelProperty(value = "附件参数")
private List<AttachmentEntity> attachments;
}
package com.mortals.xhx.feign.task;
import com.mortals.xhx.feign.BaseTaskReq;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import java.io.Serializable;
/**
* 任务委派(审批参数)
*
* @author: zxfei
* @date: 2021/8/26 17:23
*/
@Data
@ApiModel(value = "DelegateTaskReq" , description = "审批参数")
public class DelegateTaskReq extends BaseTaskReq implements Serializable {
/**
* 委派人
*/
private String delegateUserCode;
}
package com.mortals.xhx.feign.task;
import com.mortals.xhx.feign.BaseTaskReq;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import java.io.Serializable;
/**
* 任务删除(审批参数)
*
* @author: zxfei
* @date: 2021/8/26 17:23
*/
@Data
@ApiModel(value = "DeleteTaskReq" , description = "审批参数")
public class DeleteTaskReq extends BaseTaskReq implements Serializable {
}
package com.mortals.xhx.feign.task;
import com.mortals.xhx.feign.BaseTaskReq;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import java.io.Serializable;
/**
* 任务驳回(审批参数)
*
* @author: zxfei
* @date: 2021/8/26 17:23
*/
@Data
@ApiModel(value = "RejectTaskReq" , description = "审批参数")
public class RejectTaskReq extends BaseTaskReq implements Serializable {
}
package com.mortals.xhx.feign.task;
import com.mortals.xhx.feign.BaseTaskReq;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import java.io.Serializable;
/**
* 任务驳回(审批参数)
*
* @author: zxfei
* @date: 2021/8/26 17:23
*/
@Data
@ApiModel(value = "RejectTaskReq" , description = "审批参数")
public class ReturnTaskReq extends BaseTaskReq implements Serializable {
}
package com.mortals.xhx.feign.task;
import com.mortals.xhx.feign.BaseTaskReq;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import java.io.Serializable;
/**
* 任务撤回(审批参数)
*
* @author: zxfei
* @date: 2021/8/26 17:23
*/
@Data
@ApiModel(value = "RevokeTaskReq" , description = "审批参数")
public class RevokeTaskReq extends BaseTaskReq implements Serializable {
}
package com.mortals.xhx.feign.task;
import com.mortals.xhx.feign.BaseTaskReq;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import java.io.Serializable;
/**
* 任务转办(审批参数)
*
* @author: zxfei
* @date: 2021/8/26 17:23
*/
@Data
@ApiModel(value = "TurnTaskReq", description = "审批参数")
public class TurnTaskReq extends BaseTaskReq implements Serializable {
/**
* 被转办人工号 必填
*/
private String turnToUserId;
}
package com.mortals.xhx.utils;
import cn.hutool.extra.qrcode.BufferedImageLuminanceSource;
import com.google.zxing.*;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
......
......@@ -78,10 +78,6 @@
<artifactId>poi-ooxml-schemas</artifactId>
<groupId>org.apache.poi</groupId>
</exclusion>
<exclusion>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
</exclusion>
</exclusions>
</dependency>
......@@ -96,6 +92,7 @@
<artifactId>druid-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
......@@ -110,6 +107,15 @@
<artifactId>spring-data-redis</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
......@@ -122,16 +128,18 @@
<version>2.3.31</version>
</dependency>
<!--Token生成与解析-->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
</dependency>
<!-- <dependency>-->
<!-- <groupId>com.aspose</groupId>-->
<!-- <artifactId>aspose-words</artifactId>-->
<!-- <version>20.1</version>-->
<!-- <classifier>jdk17</classifier>-->
<!-- </dependency>-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
<groupId>com.aspose.words</groupId>
<artifactId>aspose-words</artifactId>
<version>19.2</version>
<classifier>jdk16</classifier>
</dependency>
<dependency>
......@@ -140,26 +148,15 @@
<version>2.0.8</version>
</dependency>
<dependency>
<groupId>com.aspose.words</groupId>
<artifactId>aspose-words</artifactId>
<version>19.2</version>
<classifier>jdk16</classifier>
</dependency>
<dependency>
<groupId>com.deepoove</groupId>
<artifactId>poi-tl</artifactId>
<version>1.12.0</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.14</version>
</dependency>
</dependencies>
<build>
<resources>
<resource>
......@@ -169,11 +166,6 @@
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
......@@ -187,7 +179,7 @@
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<jvmArguments>-Dfile.encoding=UTF-8</jvmArguments>
<outputDirectory>${project.basedir}/dist/${project.artifactId}/boot</outputDirectory>
<outputDirectory>${project.parent.basedir}/dist/${project.parent.artifactId}/boot</outputDirectory>
<layout>ZIP</layout>
</configuration>
</plugin>
......@@ -213,7 +205,7 @@
</goals>
<configuration>
<encoding>UTF-8</encoding>
<outputDirectory>${project.basedir}/dist/${project.artifactId}/bin</outputDirectory>
<outputDirectory>${project.parent.basedir}/dist/${project.parent.artifactId}/bin</outputDirectory>
<resources>
<resource>
<directory>src/main/bin/</directory>
......
package com.mortals.xhx.base.framework;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import org.springframework.util.ObjectUtils;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* @author: zxfei
* @date: 2022/6/30 10:49
* @description:
**/
public class CustomJsonDateDeserializer extends JsonDeserializer<Date> {
@Override
public Date deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String date = jp.getText();
if (!ObjectUtils.isEmpty(date)) {
try {
return format.parse(date);
} catch (ParseException e) {
return null;
}
} else {
return null;
}
}
}
package com.mortals.xhx.base.framework;
import org.springframework.http.MediaType;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import java.util.ArrayList;
import java.util.List;
/**
* @author: zxfei
* @date: 2022/6/28 15:57
* @description:
**/
// 创建一个新的转换器 解析微信的 [text/plain]
public class WxMessageConverter extends MappingJackson2HttpMessageConverter {
public WxMessageConverter() {
List<MediaType> mediaTypes = new ArrayList<>();
mediaTypes.add(MediaType.TEXT_PLAIN);
setSupportedMediaTypes(mediaTypes);
}
}
\ No newline at end of file
package com.mortals.xhx.base.framework.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface ApiUserAuth {
String msg() default "";
String params() default "";
}
......@@ -4,6 +4,9 @@ import java.util.Date;
import javax.servlet.http.HttpServletRequest;
import com.mortals.framework.model.OperateLogPdu;
import com.mortals.framework.service.IMessageProduceService;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
......@@ -22,20 +25,37 @@ import com.mortals.xhx.base.system.oper.service.OperLogService;
/**
* 操作日志记录
*
* @author: zxfei
* @date: 2021/11/5 13:28
*/
@Component
public class OperlogAspect extends FileLogServiceImpl implements ILogService {
private final static Logger logger = LoggerFactory.getLogger(OperlogAspect.class);
@Slf4j
public class OperlogAspect extends FileLogServiceImpl implements ILogService {
@Autowired
private OperLogService operLogService;
@Autowired
private IMessageProduceService messageProduceService;
@Override
public void doHandlerLog(String platformMark, Long userId, String userName, String loginName, String requestUrl,
String content, String ip, Date logDate) {
String content, String ip, Date logDate) {
super.doHandlerLog(platformMark, userId, userName, loginName, requestUrl, content, ip, logDate);
operLogService.insertOperLog(ip, requestUrl, userId, userName, loginName, content);
OperateLogPdu operateLogPdu = new OperateLogPdu();
operateLogPdu.initAttrValue();
operateLogPdu.setIp(ip);
operateLogPdu.setRequestUrl(requestUrl);
operateLogPdu.setUserId(userId);
operateLogPdu.setUserName(userName);
operateLogPdu.setLoginName(loginName);
operateLogPdu.setPlatformMark(platformMark);
operateLogPdu.setLogDate(logDate);
operateLogPdu.setContent(content);
operateLogPdu.setOperType(1);
messageProduceService.syncOperSend(operateLogPdu);
}
@Override
......@@ -43,9 +63,11 @@ public class OperlogAspect extends FileLogServiceImpl implements ILogService {
// operLogService.insertOperLog(ip, requestUrl, null, "", loginName,
// content);
this.doHandlerLog(platformMark, null, "", loginName, requestUrl, content, ip, new Date());
}
@Pointcut("execution(public * com.mortals.xhx..*Controller.*(..))")
/*@Pointcut("execution(public * com.mortals.xhx..*Controller.*(..))")
public void accessLog() {
}
......@@ -55,13 +77,13 @@ public class OperlogAspect extends FileLogServiceImpl implements ILogService {
HttpServletRequest request = attributes.getRequest();
// url
logger.info("ip[{}]url[{}]", request.getRemoteAddr(), request.getRequestURL());
log.info("ip[{}]url[{}]", request.getRemoteAddr(), request.getRequestURL());
// 参数第1和第2个参数为HttpServletRequest request, HttpServletResponse
// response
if (joinPoint.getArgs().length > 2) {
logger.info("args={}", joinPoint.getArgs()[2]);
log.info("args={}", joinPoint.getArgs()[2]);
} else {
logger.info("args={}", joinPoint.getArgs());
log.info("args={}", joinPoint.getArgs());
}
}
......@@ -69,7 +91,7 @@ public class OperlogAspect extends FileLogServiceImpl implements ILogService {
@AfterReturning(returning = "object", pointcut = "accessLog()")
public void doAfterReturning(Object object) {
if (null != object) {
logger.info("response={}", object.toString());
log.info("response={}", object.toString());
}
}
}*/
}
package com.mortals.xhx.base.framework.aspect;
import cn.hutool.core.net.Ipv4Util;
import cn.hutool.extra.servlet.ServletUtil;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
......@@ -27,11 +30,11 @@ import java.util.Map;
* @author: zxfei
* @date: 2022/4/20 9:24
*/
@Aspect
@Component
//@Aspect
//@Component
@Slf4j
@Order(1)
@Profile({"default", "develop", "test"})
//@Profile({"default", "develop", "test"})
public class WebLogAspect {
@Pointcut("execution(public * com.mortals..*Controller.*(..))")
public void webLog() {
......@@ -61,13 +64,19 @@ public class WebLogAspect {
public void afterReturning(Object result) {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
Map<String, String> map = MDC.getCopyOfContextMap();
if (map != null&&result!=null) {
String startTime = map.getOrDefault("startTime", String.valueOf(System.currentTimeMillis()));
long takeTime = (System.currentTimeMillis() - Long.parseLong(startTime));
log.info(" \n 请求路径:{} \n 耗时:{}ms \n 请求报文:{} \n 响应报文:{}"
, request.getRequestURI(), takeTime, map.getOrDefault("req", ""), result == null ? "" : result.toString());
if (result instanceof String) {
log.info(" \n 请求路径:{} 耗时:{}ms 客户端IP:{} \n 请求报文:{} \n 响应报文:{} "
, request.getRequestURI(), takeTime,ServletUtil.getClientIP(request), map.getOrDefault("req", ""), result);
} else {
log.info(" \n 请求路径:{} 耗时:{}ms 客户端IP:{}\n 请求报文:{} \n 响应报文:{}"
, request.getRequestURI(), takeTime,ServletUtil.getClientIP(request), map.getOrDefault("req", ""), JSON.toJSONString(result));
}
}
}
......
package com.mortals.xhx.base.framework.config;
import com.mortals.framework.springcloud.config.web.BaseWebMvcConfigurer;
import com.mortals.xhx.base.framework.feign.HierarchicalContract;
import feign.Contract;
import com.mortals.xhx.base.framework.WxMessageConverter;
import feign.codec.Decoder;
import org.springframework.beans.factory.ObjectFactory;
import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
import org.springframework.cloud.openfeign.support.SpringDecoder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
......@@ -14,12 +17,16 @@ import org.springframework.context.annotation.Configuration;
@Configuration
public class AccountConfig {
@Bean
public Contract feignContract() {
return new HierarchicalContract();
public BaseWebMvcConfigurer getBaseWebMvc() {
return new BaseWebMvcConfigurer(false, null);
}
@Bean
public BaseWebMvcConfigurer getBaseWebMvc(){
return new BaseWebMvcConfigurer(false,null);
public Decoder feignDecoder() {
WxMessageConverter wxConverter = new WxMessageConverter();
ObjectFactory<HttpMessageConverters> objectFactory = () -> new HttpMessageConverters(wxConverter);
return new SpringDecoder(objectFactory);
}
}
package com.mortals.xhx.base.framework.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* @author: zxfei
* @date: 2022/2/15 13:16
* @description:
**/
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Bean
public CorsFilter corsFilter(){
//初始化配置对象
CorsConfiguration configuration = new CorsConfiguration();
//允许跨域访问的域名
configuration.addAllowedOrigin("*");
// configuration.setAllowCredentials(true); //运行携带cookie
configuration.addAllowedMethod("*"); //代表所有请求方法
configuration.addAllowedHeader("*"); //允许携带任何头信息
//初始化cors配置源对象
UrlBasedCorsConfigurationSource configurationSource=new UrlBasedCorsConfigurationSource();
configurationSource.registerCorsConfiguration("/**",configuration);
//返回CorSfilter实例,参数
return new CorsFilter(configurationSource);
}
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowCredentials(true)
.allowedOrigins("*")
.allowedMethods(new String[] { "GET", "POST","PUT","DELETE"})
.allowedHeaders("*")
.exposedHeaders("*");
}
}
package com.mortals.xhx.base.framework.config;
import com.mortals.framework.web.interceptor.BaseInterceptor;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
......@@ -13,7 +12,7 @@ import javax.servlet.http.HttpServletResponse;
* @description:添加跨域响应
**/
@Component
public class CrossInterceptor extends BaseInterceptor {
public class CrossInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
......@@ -24,9 +23,4 @@ public class CrossInterceptor extends BaseInterceptor {
response.setHeader("Access-Control-Allow-Credentials", "true");
return true;
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
super.afterCompletion(request, response, handler, ex);
}
}
package com.mortals.xhx.base.framework.config;
import com.mortals.framework.filter.RepeatableFilter;
import com.mortals.framework.filter.XssFilter;
import com.mortals.framework.util.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import javax.servlet.DispatcherType;
import java.util.HashMap;
import java.util.Map;
/**
* Filter配置
*
* @author zxfei
*/
//@Configuration
public class FilterConfig {
@Value("${xss.enabled}")
private String enabled;
@Value("${xss.excludes}")
private String excludes;
@Value("${xss.urlPatterns}")
private String urlPatterns;
@SuppressWarnings({"rawtypes", "unchecked"})
@Bean
public FilterRegistrationBean xssFilterRegistration() {
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setDispatcherTypes(DispatcherType.REQUEST);
registration.setFilter(new XssFilter());
registration.addUrlPatterns(StringUtils.split(urlPatterns, ","));
registration.setName("xssFilter");
registration.setOrder(FilterRegistrationBean.HIGHEST_PRECEDENCE);
Map<String, String> initParameters = new HashMap<String, String>();
initParameters.put("excludes", excludes);
initParameters.put("enabled", enabled);
registration.setInitParameters(initParameters);
return registration;
}
@SuppressWarnings({"rawtypes", "unchecked"})
@Bean
public FilterRegistrationBean someFilterRegistration() {
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setFilter(new RepeatableFilter());
registration.addUrlPatterns("/*");
registration.setName("repeatableFilter");
registration.setOrder(FilterRegistrationBean.LOWEST_PRECEDENCE);
return registration;
}
}
package com.mortals.xhx.base.framework.config;
import java.io.IOException;
import java.net.URLDecoder;
import javax.sql.DataSource;
import com.mortals.framework.springcloud.config.mybatis.AbstractMybatisConfiguration;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.ibatis.io.VFS;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import com.mortals.framework.springcloud.config.SpringBootVFS;
import javax.sql.DataSource;
@Configuration
//@AutoConfigureAfter(DataSourceAutoConfiguration.class)
......@@ -45,7 +35,6 @@ public class MybatisConfiguration extends AbstractMybatisConfiguration {
@Value("${mybatis.config-location}")
private String configLocation;
// 提供SqlSeesion
@Bean(name = "sqlSessionFactory")
public SqlSessionFactory sqlSessionFactoryBean(@Qualifier("dataSource") DataSource dataSource) {
......
package com.mortals.xhx.base.framework.config;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.client.codec.Codec;
import org.redisson.codec.JsonJacksonCodec;
import org.redisson.config.Config;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* RedissonConfig配置
*
* @author: zxfei
* @date: 2022/8/8 16:02
*/
//@Configuration
//@ConfigurationProperties(prefix = "spring.redis")
@Slf4j
@Data
public class RedissonConfig {
private String host;
private int port;
private String password;
private int database;
//@Bean
public RedissonClient redissonClient() {
RedissonClient redissonClient;
Config config = new Config();
String url = "redis://" + host + ":" + port;
// 单节点配置
config.useSingleServer().setAddress(url).setDatabase(database).setPassword(password);
//使用json序列化方式
Codec codec = new JsonJacksonCodec();
config.setCodec(codec);
// 主从配置
/*config.useMasterSlaveServers()
// 设置redis主节点
.setMasterAddress("redis://192.168.1.120:6379")
// 设置redis从节点
.addSlaveAddress("redis://192.168.1.130:6379", "redis://192.168.1.140:6379");*/
// 哨兵部署方式,sentinel是采用Paxos拜占庭协议,一般sentinel至少3个节点
/*config.useSentinelServers()
.setMasterName("my-sentinel-name")
.addSentinelAddress("redis://192.168.1.120:6379")
.addSentinelAddress("redis://192.168.1.130:6379")
.addSentinelAddress("redis://192.168.1.140:6379");*/
// 集群部署方式,cluster方式至少6个节点,3主3从,3主做sharding,3从用来保证主宕机后可以高可用
/*config.useClusterServers()
// 集群状态扫描间隔时间,单位是毫秒
.setScanInterval(2000)
.addNodeAddress("redis://192.168.1.120:6379")
.addNodeAddress("redis://192.168.1.130:6379")
.addNodeAddress("redis://192.168.1.140:6379")
.addNodeAddress("redis://192.168.1.150:6379")
.addNodeAddress("redis://192.168.1.160:6379")
.addNodeAddress("redis://192.168.1.170:6379");*/
// 云托管部署方式,这种方式主要解决redis提供商为云服务的提供商的redis连接,比如亚马逊云、微软云
/*config.useReplicatedServers()
// 主节点变化扫描间隔时间
.setScanInterval(2000)
.addNodeAddress("redis://192.168.1.120:6379")
.addNodeAddress("redis://192.168.1.130:6379")
.addNodeAddress("redis://192.168.1.140:6379");*/
redissonClient = Redisson.create(config);
return redissonClient;
}
}
\ No newline at end of file
package com.mortals.xhx.base.framework.filter;
import cn.hutool.core.util.IdUtil;
import com.mortals.framework.service.IAuthTokenService;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.MDC;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;
import org.springframework.web.filter.OncePerRequestFilter;
import org.springframework.web.util.ContentCachingRequestWrapper;
......@@ -27,15 +23,9 @@ import java.io.IOException;
@Slf4j
public class RequestFilter extends OncePerRequestFilter implements Filter {
@Autowired
private IAuthTokenService authTokenService;
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
try {
//每个请求记录一个traceId,可以根据traceId搜索出本次请求的全部相关日志
MDC.put("traceId", IdUtil.fastSimpleUUID().substring(0,12));
setUsername(request);
request = new ContentCachingRequestWrapper(request);
filterChain.doFilter(request, response);
} catch (Exception e) {
......@@ -47,22 +37,22 @@ public class RequestFilter extends OncePerRequestFilter implements Filter {
}
private void setUsername(HttpServletRequest request) {
/*private void setUsername(HttpServletRequest request) {
//通过token解析出username
String token = authTokenService.getToken(request);
//String token = request.getHeader("token");
if (!ObjectUtils.isEmpty(token)) {
MDC.put("token",token);
// MDC.put("token", token);
// try {
// SessionUserInfo info = tokenService.getUserInfo();
// if (info != null) {
// String username = info.getUsername();
// MDC.put("username", username);
// }
// } catch (CommonJsonException e) {
// log.info("无效的token:{}", token);
// }
MDC.put("token", token);
try {
SessionUserInfo info = tokenService.getUserInfo();
if (info != null) {
String username = info.getUsername();
MDC.put("username", username);
}
} catch (CommonJsonException e) {
log.info("无效的token:{}", token);
}
}
}
}*/
}
package com.mortals.xhx.base.framework.security;
package com.mortals.xhx.base.framework.interceptor;
import com.alibaba.fastjson.JSONObject;
import com.mortals.framework.ap.SysConstains;
......@@ -14,7 +14,6 @@ import io.jsonwebtoken.SignatureAlgorithm;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Primary;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Service;
......@@ -28,7 +27,7 @@ import java.util.Map;
*
* @author zxfei
*/
@Primary
@Service
@Order(1)
@Slf4j
......@@ -55,6 +54,9 @@ public class AuthTokenServiceImpl implements IAuthTokenService {
@Value("${token.database:0}")
private Integer portalDb;
@Value("${platform.type:cloud}")
private String platFormType;//版本,默认云服务版本
protected static final Long SECOND = 1l;
protected static final Long SECOND_MINUTE = 60 * SECOND;
......@@ -85,12 +87,10 @@ public class AuthTokenServiceImpl implements IAuthTokenService {
Claims claims = parseToken(token);
String uuid = (String) claims.get(SysConstains.LOGIN_USER_KEY);
String userKey = getTokenKey(uuid);
cacheService.select(portalDb);
String userStr = cacheService.get(userKey);
cacheService.select(db);
// Rest<String> rest = userFeign.getToken(userKey);
// String userStr = rest.getData();
String userStr = "";
userStr = cacheService.get(userKey);
if (StringUtils.isNotEmpty(userStr)) {
UserEntity userEntity = JSONObject.parseObject(userStr, UserEntity.class);
userEntity.setToken(token);
......
......@@ -2,13 +2,14 @@ package com.mortals.xhx.base.framework.interceptor;
import com.alibaba.fastjson.JSONObject;
import com.mortals.framework.annotation.UnAuth;
import com.mortals.framework.common.Rest;
import com.mortals.framework.service.IAuthTokenService;
import com.mortals.framework.service.IUser;
import com.mortals.framework.util.AESUtil;
import com.mortals.framework.utils.ServletUtils;
import com.mortals.framework.web.interceptor.BaseInterceptor;
import com.mortals.xhx.base.framework.config.InterceptorConfig;
import com.mortals.xhx.common.key.Constant;
import com.mortals.xhx.common.code.ApiRespCodeEnum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;
......@@ -19,6 +20,9 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;
import static com.mortals.xhx.common.key.ErrorCode.*;
import static com.mortals.xhx.common.key.ErrorCode.ERROR_USER_OPERATION_CONTENT;
/**
* 用户权限验证,基于token
*
......@@ -40,7 +44,8 @@ public class AuthUserInterceptor extends BaseInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
if (handler instanceof HandlerMethod) {
JSONObject ret = new JSONObject();
if(handler instanceof HandlerMethod){
HandlerMethod handlerMethod = (HandlerMethod) handler;
Method method = handlerMethod.getMethod();
UnAuth annotation = method.getAnnotation(UnAuth.class);
......@@ -48,10 +53,9 @@ public class AuthUserInterceptor extends BaseInterceptor {
//取消校验
return true;
}
} else if (handler instanceof ResourceHttpRequestHandler) {
}else if(handler instanceof ResourceHttpRequestHandler){
return true;
}
JSONObject ret = new JSONObject();
try {
String uri = request.getServletPath();
//校验配置的请求路径是否需要检查权限
......@@ -59,23 +63,23 @@ public class AuthUserInterceptor extends BaseInterceptor {
//需要校验权限
boolean auth = this.checkAuth(request, uri, config.getSecurityKey());
if (!auth) {
//校验token不正常
String token = authTokenService.getToken(request);
if(ObjectUtils.isEmpty(token)){
ServletUtils.renderString(response, JSONObject.toJSONString(Rest.fail(ERROR_TOKEN_UNAUTHORIZED, ERROR_TOKEN_UNAUTHORIZED_CONTENT)));
return false;
}
//不存在时候 如果是管理员也不做拦截
IUser loginUser = authTokenService.getLoginUser(request);
//loginUser.isManager()
if(ObjectUtils.isEmpty(loginUser)){
ret.put("code", 401);
ret.put("msg", "用户未登录或登录失效,请重新登录");
ServletUtils.renderString(response, JSONObject.toJSONString(ret));
if (ObjectUtils.isEmpty(loginUser)) {
ServletUtils.renderString(response, JSONObject.toJSONString(Rest.fail(ERROR_TOKEN_EXPIRED, ERROR_TOKEN_EXPIRED_CONTENT)));
return false;
}else if(loginUser.isAdmin()||loginUser.getUserType()==1||loginUser.getUserType()== Constant.CUSTOMER_USER){
} else if (loginUser.isAdmin() || loginUser.getUserType() == 1) {
return super.preHandle(request, response, handler);
} else {
ret.put("code", -1);
ret.put("msg", "用户无该操作权限!");
ServletUtils.renderString(response, JSONObject.toJSONString(ret));
ServletUtils.renderString(response, JSONObject.toJSONString(Rest.fail(ERROR_USER_OPERATION, ERROR_USER_OPERATION_CONTENT)));
return false;
}
}
}
} catch (Exception e) {
......@@ -102,6 +106,4 @@ public class AuthUserInterceptor extends BaseInterceptor {
return false;
}
}
......@@ -3,7 +3,6 @@ package com.mortals.xhx.base.framework.ws.handler;
import com.alibaba.fastjson.JSON;
import com.mortals.xhx.base.framework.ws.message.AuthRequest;
import com.mortals.xhx.base.framework.ws.message.AuthResponse;
import com.mortals.xhx.base.framework.ws.message.UserJoinNoticeRequest;
import com.mortals.xhx.base.framework.ws.util.WebSocketUtil;
import lombok.extern.apachecommons.CommonsLog;
import org.springframework.stereotype.Component;
......
......@@ -2,8 +2,6 @@ package com.mortals.xhx.base.framework.ws.handler;
import com.mortals.xhx.base.framework.ws.message.HeartBeatRequest;
import com.mortals.xhx.base.framework.ws.message.SendResponse;
import com.mortals.xhx.base.framework.ws.message.SendToOneRequest;
import com.mortals.xhx.base.framework.ws.message.SendToUserRequest;
import com.mortals.xhx.base.framework.ws.util.WebSocketUtil;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.WebSocketSession;
......
......@@ -4,7 +4,6 @@ import lombok.extern.apachecommons.CommonsLog;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.http.server.ServletServerHttpRequest;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor;
import java.util.Map;
......@@ -17,18 +16,20 @@ import java.util.Map;
@CommonsLog
public class WebSocketShakeInterceptor extends HttpSessionHandshakeInterceptor {
@Override // 拦截 Handshake 事件
public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response,
WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception {
@Override
public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, org.springframework.web.socket.WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception {
// 获得 accessToken
if (request instanceof ServletServerHttpRequest) {
ServletServerHttpRequest serverRequest = (ServletServerHttpRequest) request;
attributes.put("accessToken", serverRequest.getServletRequest().getParameter("accessToken"));
}
// 调用父方法,继续执行逻辑
return super.beforeHandshake(request, response, wsHandler, attributes);
}
public static void main(String[] args) {
WebSocketShakeInterceptor webSocketShakeInterceptor = new WebSocketShakeInterceptor();
}
......
package com.mortals.xhx.base.login.interceptor;
import com.mortals.framework.annotation.UnAuth;
import com.mortals.xhx.base.framework.config.InterceptorConfig;
import com.mortals.framework.ap.CookieService;
import com.mortals.framework.ap.SysConstains;
......@@ -13,10 +14,13 @@ import com.mortals.framework.web.interceptor.BaseInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//@Order(1)
import java.lang.reflect.Method;
@Order(1)
//@Component
public class AuthJsonInterceptor extends BaseInterceptor {
......@@ -35,6 +39,13 @@ public class AuthJsonInterceptor extends BaseInterceptor {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
try {
HandlerMethod handlerMethod = (HandlerMethod) handler;
Method method = handlerMethod.getMethod();
UnAuth annotation = method.getAnnotation(UnAuth.class);
if (annotation != null) {
//取消校验
return true;
}
String uri = request.getServletPath();
if (config.needCheckAuth(uri)) {
boolean auth = this.checkAuth(request, uri, config.getSecurityKey());
......
......@@ -2,10 +2,12 @@ package com.mortals.xhx.base.login.web;
import cn.hutool.core.util.IdUtil;
import com.alibaba.fastjson.JSONObject;
import com.mortals.framework.ap.CookieService;
import com.mortals.framework.ap.GlobalSysInfo;
import com.mortals.framework.ap.SysConstains;
import com.mortals.framework.common.Rest;
import com.mortals.framework.service.IAuthTokenService;
import com.mortals.framework.service.ICacheService;
import com.mortals.framework.service.ITokenService;
import com.mortals.framework.service.IUser;
import com.mortals.framework.util.AESUtil;
import com.mortals.framework.util.DateUtils;
......@@ -19,9 +21,11 @@ import com.mortals.xhx.base.system.user.model.UserEntity;
import com.mortals.xhx.base.system.user.service.UserService;
import com.mortals.xhx.base.system.valid.service.ValidCodeService;
import com.mortals.xhx.common.key.RedisKey;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
import org.springframework.util.ObjectUtils;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
......@@ -31,9 +35,13 @@ import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Set;
import static com.mortals.xhx.common.key.ErrorCode.ERROR_TOKEN_EXPIRED;
import static com.mortals.xhx.common.key.ErrorCode.ERROR_TOKEN_EXPIRED_CONTENT;
@RestController
@Slf4j
@RequestMapping("login")
public class LoginController extends BaseCRUDJsonBodyMappingController<UserService, UserEntity, Long> {
public class LoginController extends BaseCRUDJsonBodyMappingController<UserService, UserEntity, Long> implements InitializingBean {
@Autowired
private UserService userService;
......@@ -44,19 +52,15 @@ public class LoginController extends BaseCRUDJsonBodyMappingController<UserServi
@Autowired
private MenuService menuService;
@Autowired
private ITokenService tokenService;
@Autowired
private ICacheService cacheService;
private static Log logger = LogFactory.getLog(LoginController.class);
@Autowired
private IAuthTokenService authTokenService;
@RequestMapping("login")
public String login(HttpServletRequest request, HttpServletResponse response, @RequestBody LoginForm loginForm) throws Exception {
public String login(@RequestBody LoginForm loginForm) throws Exception {
JSONObject ret = new JSONObject();
String loginName = loginForm.getLoginName();
String password = loginForm.getPassword();
//String securityCode = loginForm.getSecurityCode();
String ip = super.getRequestIP(request);
if (StringUtils.isEmpty(loginName) || StringUtils.isEmpty(password)) {
ret.put(KEY_RESULT_CODE, VALUE_RESULT_FAILURE);
......@@ -66,10 +70,8 @@ public class LoginController extends BaseCRUDJsonBodyMappingController<UserServi
UserEntity userEntity = null;
try {
loginForm.validate();
userEntity = userService.doLogin(loginName, password, ip);
userEntity.setLastLoginAddress(ip);
//saveCurrUser(request, response, userEntity);
recordSysLog(request, userEntity, "用户登录系统成功!");
// 返回拥有的菜单数据
Set<String> urls = resourceService.findUrlSetByUserId(userEntity.getId());
......@@ -78,23 +80,26 @@ public class LoginController extends BaseCRUDJsonBodyMappingController<UserServi
if (currUserName == null || currUserName.trim().length() == 0) {
currUserName = "管理员";
}
userEntity.setLoginTime(System.currentTimeMillis());
userEntity.setToken(IdUtil.fastSimpleUUID());
userEntity.setExpireTime(DateUtils.addCurrDate(7).getTime());
String token = authTokenService.createToken(userEntity);
JSONObject data = new JSONObject();
data.put("token", token);
data.put("currUserName", currUserName);
data.put("barList", outlookBarList);
data.put("id", userEntity.getId());
data.put("userType", userEntity.getUserType());
userEntity.setLoginTime(System.currentTimeMillis());
userEntity.setToken(IdUtil.fastSimpleUUID());
userEntity.setExpireTime(DateUtils.addCurrDate(7).getTime());
userEntity.setMenuUrl(generateMenuUrlCode(urls));
String token = authTokenService.createToken(userEntity);
data.put("token", token);
//设置token 和过期时间
//data.put("expiresTime", DateUtils.addCurrDate(7).getTime());
generateMenuUrlCode(urls);
//this.generateBlackCookie(request, response, loginName, urls);
ret.put(KEY_RESULT_DATA, data);
ret.put(KEY_RESULT_CODE, VALUE_RESULT_SUCCESS);
ret.put(KEY_RESULT_MSG, "用户登录系统成功!");
ret.put("resources", urls);
return ret.toJSONString();
} catch (Exception e) {
log.error("login error ", e);
......@@ -109,17 +114,18 @@ public class LoginController extends BaseCRUDJsonBodyMappingController<UserServi
}
@RequestMapping("logout")
public void logout() throws Exception {
public void logout(HttpServletRequest request, HttpServletResponse response) throws Exception {
recordSysLog(request, "退出登录");
super.removeCurrUser(request);
this.deleteBlackCookie(request, response);
}
@RequestMapping("index")
public String index(HttpServletRequest request, HttpServletResponse response) throws Exception {
public String index() throws Exception {
JSONObject ret = new JSONObject();
IUser user = this.getCurUser();
if (user == null) {
return "";
return JSONObject.toJSONString(Rest.fail(ERROR_TOKEN_EXPIRED, ERROR_TOKEN_EXPIRED_CONTENT));
}
Set<String> urls = resourceService.findUrlSetByUserId(user.getId());
List<MenuEntity> outlookBarList = menuService.findTreeMenu(user, urls);
......@@ -128,6 +134,9 @@ public class LoginController extends BaseCRUDJsonBodyMappingController<UserServi
currUserName = "管理员";
}
JSONObject data = new JSONObject();
String token = authTokenService.getToken(request);
data.put("token", token);
data.put("currUserName", currUserName);
data.put("barList", outlookBarList);
data.put("id", user.getId());
......@@ -163,6 +172,26 @@ public class LoginController extends BaseCRUDJsonBodyMappingController<UserServi
}
}
private String generateMenuUrlCode(Set<String> urls) {
try {
String securityKey = GlobalSysInfo.getPropertyValue(SysConstains.PROP_COOKIE_SECURITY_KEY);
StringBuilder sb = new StringBuilder();
if (urls != null && urls.size() > 0) {
for (String url : urls) {
int index = url.hashCode() & (Integer.MAX_VALUE - 1);
sb.append(index).append(",");
}
}
String menuUrl = sb.toString();
return AESUtil.encrypt(menuUrl, securityKey);
} catch (Throwable e) {
log.error("编码异常", e);
return null;
}
}
@RequestMapping("validcode")
public String validCode(HttpServletRequest request, HttpServletResponse response, LoginForm loginForm) {
JSONObject ret = new JSONObject();
......@@ -206,4 +235,26 @@ public class LoginController extends BaseCRUDJsonBodyMappingController<UserServi
return ret.toJSONString();
}
protected void deleteBlackCookie(HttpServletRequest request, HttpServletResponse response) {
try {
CookieService.deleteCookieForAuth(request, response);
} catch (Throwable e) {
}
}
@RequestMapping("parseToken")
public IUser parseToken() throws Exception {
IUser userEntity = authTokenService.getLoginUser(request);
if (!ObjectUtils.isEmpty(userEntity)) {
authTokenService.verifyToken(userEntity);
return userEntity;
}
return null;
}
@Override
public void afterPropertiesSet() throws Exception {
log.info("初始化加载单机版登录。。。");
}
}
......@@ -37,7 +37,7 @@ public class LoginForm extends BaseForm {
@Override
public String toString() {
return "loginName:" + this.loginName + " password:" + this.password;
return "loginName:" + this.loginName + " password:" + this.password + " securityCode:" + this.securityCode;
}
@Override
......@@ -48,9 +48,7 @@ public class LoginForm extends BaseForm {
if (password == null || password.trim().length() == 0) {
throw new AppException("密码不能为空!");
}
// if (securityCode == null || securityCode.trim().length() == 0) {
// throw new AppException("验证码不能为空!");
// }
return super.validate();
}
}
package com.mortals.xhx.base.login.web;
import java.awt.image.BufferedImage;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.mortals.framework.util.SecurityImage;
import com.mortals.framework.web.BaseCRUDJsonController;
import com.mortals.xhx.base.login.service.GifSecurityImage;
import com.mortals.xhx.base.system.valid.model.ValidCodeEntity;
import com.mortals.xhx.base.system.valid.service.ValidCodeService;
import com.mortals.xhx.base.system.valid.web.ValidCodeForm;
......@@ -13,9 +11,9 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.mortals.framework.util.SecurityImage;
import com.mortals.framework.web.BaseCRUDJsonController;
import com.mortals.xhx.base.login.service.GifSecurityImage;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.image.BufferedImage;
@RestController
@RequestMapping("securitycode")
......
......@@ -76,6 +76,9 @@ public class MenuEntity extends BaseEntityLong{
/** 创建用户名称 */
private String createUserName;
private Integer type;
private List<MenuEntity> childList = new ArrayList<MenuEntity>();
......@@ -83,6 +86,14 @@ public class MenuEntity extends BaseEntityLong{
}
public Integer getType() {
return type;
}
public void setType(Integer type) {
this.type = type;
}
/**
* 获取 菜单名称
* @return name
......@@ -410,7 +421,7 @@ public class MenuEntity extends BaseEntityLong{
this.name = null;
this.url = null;
this.parentId = null;
this.orderId = null;
this.orderId = 0;
this.status = 1;
this.linkType = 0;
this.groupId = 1;
......
......@@ -52,4 +52,12 @@ public interface MenuService extends ICRUDService<MenuEntity,Long> {
* @throws AppException
*/
public List<MenuEntity> findTreeMenu() throws AppException;
/**
* 更新排列顺序
* @param id
* @param type
*/
void upOrDown(Long id, Integer type);
}
\ No newline at end of file
/**
* 文件:MenuServiceImpl.java
* 版本:1.0.0
* 日期:
* Copyright &reg;
* All right reserved.
*/
* 文件:MenuServiceImpl.java
* 版本:1.0.0
* 日期:
* Copyright &reg;
* All right reserved.
*/
package com.mortals.xhx.base.system.menu.service.impl;
import com.mortals.framework.common.code.YesNo;
import com.mortals.framework.exception.AppException;
import com.mortals.framework.model.Context;
import com.mortals.framework.model.OrderCol;
import com.mortals.framework.service.IUser;
import com.mortals.framework.service.impl.AbstractCRUDServiceImpl;
......@@ -19,20 +20,23 @@ import com.mortals.xhx.base.system.menu.model.MenuEntity;
import com.mortals.xhx.base.system.menu.model.MenuQuery;
import com.mortals.xhx.base.system.menu.service.MenuService;
import com.mortals.xhx.common.code.YesNoEnum;
import org.springframework.stereotype.Service;
import java.util.*;
import java.util.stream.Collectors;
/**
* <p>Title: 菜单信息</p>
* <p>Description: MenuServiceImpl service接口 </p>
* <p>Copyright: Copyright &reg; </p>
* <p>Company: </p>
* @author
*
* @author
* @version 1.0.0
*/
@Service("menuService")
public class MenuServiceImpl extends AbstractCRUDServiceImpl<MenuDao,MenuEntity,Long> implements MenuService {
public class MenuServiceImpl extends AbstractCRUDServiceImpl<MenuDao, MenuEntity, Long> implements MenuService {
@Override
public List<MenuEntity> findAllEnable() throws AppException {
......@@ -48,7 +52,7 @@ public class MenuServiceImpl extends AbstractCRUDServiceImpl<MenuDao,MenuEntity,
@Override
public List<MenuEntity> findTreeMenu(IUser user, Set<String> urls) throws AppException {
Set<Long> authIds = new HashSet<Long>();
Set<Long> authIds = new HashSet<>();
Map<Long, MenuEntity> menuMap = new HashMap<Long, MenuEntity>();
List<MenuEntity> userModuleList = this.findAllEnable();
for (MenuEntity sysModule : userModuleList) {
......@@ -111,5 +115,69 @@ public class MenuServiceImpl extends AbstractCRUDServiceImpl<MenuDao,MenuEntity,
}
return outlookBar;
}
@Override
public void upOrDown(Long id, Integer type) {
MenuQuery query = new MenuQuery();
query.setOrderColList(Arrays.asList(new OrderCol("orderId")));
query.setOrderKind(OrderCol.ASCENDING);
//判断移动的是一级菜单还是二级菜单
MenuEntity menuEntity = this.get(id);
if (menuEntity.getParentId() == 0) {
//一级菜单
query.setParentId(0L);
} else {
//二级菜单
query.setParentId(menuEntity.getParentId());
}
List<MenuEntity> list = this.find(query);
MenuEntity preEntity = null;
MenuEntity curEntity = null;
if (type == YesNoEnum.NO.getValue()) {
//up
for (int i = 0; i < list.size(); i++) {
if (list.get(i).getId().equals(id) && i > 0) {
curEntity = list.get(i);
preEntity = list.get(i - 1);
break;
}
}
} else {
//down
for (int i = 0; i < list.size(); i++) {
if (list.get(i).getId().equals(id) && i + 1 < list.size()) {
curEntity = list.get(i);
preEntity = list.get(i + 1);
break;
}
}
}
if (preEntity != null && curEntity != null) {
//交换
int temp = preEntity.getOrderId();
preEntity.setOrderId(curEntity.getOrderId());
curEntity.setOrderId(temp);
this.update(preEntity);
this.update(curEntity);
}
}
@Override
protected void saveBefore(MenuEntity entity, Context context) throws AppException {
MenuQuery query = new MenuQuery();
query.setParentId(entity.getParentId());
Comparator<Integer> comparator = Comparator.comparing(Integer::intValue);
Optional<Integer> maxOptional = this.find(query).stream().map(MenuEntity::getOrderId).filter(f->f!=9999).max(comparator);
maxOptional.ifPresent(e -> {
e=e+1;
entity.setOrderId(e);
});
super.saveBefore(entity, context);
}
}
\ No newline at end of file
/**
* 文件:MenuController.java
* 版本:1.0.0
* 日期:
* Copyright &reg;
* All right reserved.
*/
package com.mortals.xhx.base.system.menu.web;
......@@ -13,9 +6,9 @@ import com.mortals.framework.exception.AppException;
import com.mortals.framework.model.Context;
import com.mortals.framework.model.OrderCol;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.mortals.framework.web.BaseCRUDJsonBodyMappingController;
import com.mortals.xhx.base.system.menu.model.MenuQuery;
import org.springframework.web.bind.annotation.*;
import com.mortals.framework.web.BaseCRUDJsonMappingController;
import com.mortals.xhx.base.system.menu.model.MenuEntity;
......@@ -35,73 +28,86 @@ import java.util.Map;
/**
* <p>Title: 菜单信息</p>
* <p>Description: MenuController </p>
* <p>Copyright: Copyright &reg; </p>
* <p>Company: </p>
* @author
* @version 1.0.0
* 菜单信息
*
* @author: zxfei
* @date: 2021/11/30 10:02
*/
@RestController
@RequestMapping("menu")
public class MenuController extends BaseCRUDJsonMappingController<MenuService, MenuForm,MenuEntity,Long> {
public class MenuController extends BaseCRUDJsonBodyMappingController<MenuService, MenuEntity, Long> {
public MenuController() {
super.setModuleDesc("菜单信息");
}
public MenuController(){
super.setFormClass(MenuForm.class);
super.setModuleDesc("菜单信息");
}
@Override
protected void doListBefore(MenuEntity query, Map<String, Object> model, Context context) throws AppException {
List<OrderCol> orderColList = new ArrayList<OrderCol>();
orderColList.add(new OrderCol("parentId"));
orderColList.add(new OrderCol("orderId"));
query.setOrderColList(orderColList);
}
@Override
protected void init(Map<String, Object> model, Context context) {
Map<String, Object> status = new HashMap<String, Object>();
status.put("status", DataSatus.getEnumMap(DataSatus.CLOSE.getValue(), DataSatus.DELETE.getValue(), DataSatus.OVERDUE.getValue(), DataSatus.USEOUT.getValue()));
status.put("linkType", MenuLinkType.getEnumMap());
status.put("commMenu", MenuComm.getEnumMap());
status.put("menuType", MenuType.getEnumMap());
status.put("authType", MenuAuthType.getEnumMap());
model.put(KEY_RESULT_DICT, status);
}
@Override
protected void doListBefore(HttpServletRequest request, HttpServletResponse response, MenuForm form, Map<String, Object> model, Context context) throws AppException {
List<OrderCol> orderColList = new ArrayList<OrderCol>();
orderColList.add(new OrderCol("parentId"));
orderColList.add(new OrderCol("orderId"));
form.getQuery().setOrderColList(orderColList);
}
/**
* 改变状态
*/
@RequestMapping(value = "change/status")
public String changeStatus(@RequestBody MenuEntity query) {
JSONObject ret = new JSONObject();
Context context = getContext();
try {
MenuEntity entity = this.service.get(query.getId(), context);//.doSubmitAudit(form.getEntity(), context);
if (null == entity) {
throw new AppException("菜单不存在!");
}
if (null == entity.getStatus()) {
throw new AppException("菜单状态不能为空!");
}
if (entity.getStatus() != DataSatus.ENABLE.getValue() && entity.getStatus() != DataSatus.DISENABLE.getValue()) {
throw new AppException("非法菜单状态!");
}
String busiDesc = DataSatus.getByValue(entity.getStatus()).getDesc();
entity.setStatus(entity.getStatus());
this.service.update(entity, context);
ret.put(KEY_RESULT_CODE, VALUE_RESULT_SUCCESS);
ret.put(KEY_RESULT_MSG, busiDesc + "成功");
recordSysLog(request, busiDesc + " 【成功】 [id:" + entity.getId() + "]");
@Override
protected void init(HttpServletRequest request, HttpServletResponse response, MenuForm form, Map<String, Object> model,
Context context) {
Map<String, Object> status = new HashMap<String, Object>();
status.put("status", DataSatus.getEnumMap(DataSatus.CLOSE.getValue(), DataSatus.DELETE.getValue(), DataSatus.OVERDUE.getValue(), DataSatus.USEOUT.getValue()));
status.put("linkType", MenuLinkType.getEnumMap());
status.put("commMenu", MenuComm.getEnumMap());
status.put("menuType", MenuType.getEnumMap());
status.put("authType", MenuAuthType.getEnumMap());
model.put(KEY_RESULT_DICT, status);
super.init(request, response, form, model, context);
}
} catch (Exception e) {
ret.put(KEY_RESULT_CODE, VALUE_RESULT_FAILURE);
ret.put(KEY_RESULT_MSG, super.convertException(e));
}
return ret.toJSONString();
}
/**
* 改变状态
*/
@RequestMapping(value = "change/status")
public String changeStatus(HttpServletRequest request, HttpServletResponse response, MenuForm form) {
JSONObject ret = new JSONObject();
Context context = getContext();
try {
MenuEntity entity = this.service.get(form.getEntity().getId(), context);//.doSubmitAudit(form.getEntity(), context);
if (null == entity) {
throw new AppException("菜单不存在!");
}
if (null == form.getEntity().getStatus()) {
throw new AppException("菜单状态不能为空!");
}
if (form.getEntity().getStatus() != DataSatus.ENABLE.getValue() && form.getEntity().getStatus() != DataSatus.DISENABLE.getValue()) {
throw new AppException("非法菜单状态!");
}
String busiDesc = DataSatus.getByValue(form.getEntity().getStatus()).getDesc();
entity.setStatus(form.getEntity().getStatus());
this.service.update(entity, context);
ret.put(KEY_RESULT_CODE, VALUE_RESULT_SUCCESS);
ret.put(KEY_RESULT_MSG, busiDesc + "成功");
recordSysLog(request, busiDesc + " 【成功】 [id:" + entity.getId() + "]");
} catch (Exception e) {
ret.put(KEY_RESULT_CODE, VALUE_RESULT_FAILURE);
ret.put(KEY_RESULT_MSG, super.convertException(e));
}
return ret.toJSONString();
}
/**
* 更换排序
*/
@PostMapping(value = "upOrDown")
public String upOrDownTopicList(@RequestBody MenuEntity query) {
JSONObject ret = new JSONObject();
ret.put(KEY_RESULT_CODE, VALUE_RESULT_SUCCESS);
try {
this.service.upOrDown(query.getId(), query.getType());
} catch (Exception e) {
log.error("更新错误", e);
ret.put(KEY_RESULT_CODE, VALUE_RESULT_FAILURE);
ret.put(KEY_RESULT_MSG, e.getMessage());
}
return ret.toJSONString();
}
}
\ No newline at end of file
......@@ -10,8 +10,6 @@ package com.mortals.xhx.base.system.oper.model;
import java.util.Date;
import com.alibaba.fastjson.annotation.JSONField;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.mortals.framework.model.BaseEntityLong;
/**
......@@ -47,7 +45,6 @@ public class OperLogEntity extends BaseEntityLong{
private String ip;
/** 操作时间 */
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private Date logDate;
/** 操作类型,0:新增,1:修改,2:删除 */
......
......@@ -106,7 +106,7 @@ public class OperLogServiceImpl extends AbstractCRUDServiceImpl<OperLogDao,OperL
operLogEntity.setLogDate(new Date());
operLogEntity.setPlatformMark(GlobalSysInfo.getPropertyValue(SysConstains.PROP_PLATFORM_MARK));
// operLogEntity.setOperType(operType.getValue());
//operLogEntity.setOperType(operType.getValue());
operLogEntity.setRequestUrl(requestUrl);
operLogEntity.setLoginName(loginName);
operLogEntity.setUserId(userId);
......
/**
* 文件:OperLogController.java
* 版本:1.0.0
* 日期:
* Copyright &reg;
* All right reserved.
*/
* 文件:OperLogController.java
* 版本:1.0.0
* 日期:
* Copyright &reg;
* All right reserved.
*/
package com.mortals.xhx.base.system.oper.web;
import com.alibaba.fastjson.JSONObject;
import com.mortals.framework.exception.AppException;
import com.mortals.framework.model.Context;
import com.mortals.framework.model.OrderCol;
......@@ -14,9 +16,15 @@ import com.mortals.framework.web.BaseCRUDJsonBodyMappingController;
import com.mortals.xhx.base.system.oper.model.OperLogEntity;
import com.mortals.xhx.base.system.oper.service.OperLogService;
import com.mortals.xhx.common.code.OperTypeEnum;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.mortals.framework.web.BaseCRUDJsonMappingController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
......@@ -26,33 +34,36 @@ import java.util.Map;
* <p>Description: OperLogController </p>
* <p>Copyright: Copyright &reg; </p>
* <p>Company: </p>
* @author
*
* @author
* @version 1.0.0
*/
@RestController
@RequestMapping("oper/log")
public class OperLogController extends BaseCRUDJsonBodyMappingController<OperLogService,OperLogEntity,Long> {
public OperLogController(){
super.setFormClass(OperLogForm.class);
super.setModuleDesc("操作日志");
}
@Override
protected void init(Map<String, Object> model, Context context) {
// 返回日志类型
this.addDict(model,"operType", OperTypeEnum.getEnumMap());
super.init(model, context);
}
@Override
protected void doListBefore(OperLogEntity query, Map<String, Object> model, Context context) throws AppException {
query.setOrderColList(new ArrayList<OrderCol>() {
{
add(new OrderCol("a.logDate", "desc"));
}
});
}
public class OperLogController extends BaseCRUDJsonBodyMappingController<OperLogService, OperLogEntity, Long> {
public OperLogController() {
super.setFormClass(OperLogForm.class);
super.setModuleDesc("操作日志");
}
@Override
protected void init(Map<String, Object> model, Context context) {
Map<String, Object> status = new HashMap<String, Object>(1);
// 返回日志类型
status.put("operType", OperTypeEnum.getEnumMap());
model.put(KEY_RESULT_DICT, status);
}
@Override
protected void doListBefore(OperLogEntity query, Map<String, Object> model, Context context) throws AppException {
query.setOrderColList(new ArrayList<OrderCol>() {
{
add(new OrderCol("a.logDate", "desc"));
}
});
}
}
\ No newline at end of file
/**
* 文件:ResourceController.java
* 版本:1.0.0
* 日期:
* Copyright &reg;
* All right reserved.
*/
package com.mortals.xhx.base.system.resource.web;
......@@ -16,6 +9,8 @@ import javax.servlet.http.HttpServletResponse;
import com.mortals.framework.common.IBaseEnum;
import com.mortals.framework.common.code.UserType;
import com.mortals.framework.web.BaseCRUDJsonBodyMappingController;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
......@@ -29,16 +24,15 @@ import com.mortals.xhx.common.code.AuthType;
import com.mortals.xhx.common.code.SourceType;
/**
* <p>Title: 资源信息</p>
* <p>Description: ResourceController </p>
* <p>Copyright: Copyright &reg; </p>
* <p>Company: </p>
* @author
* @version 1.0.0
* 资源信息
*
* @author: zxfei
* @date: 2022/5/7 15:27
*/
@Slf4j
@RestController
@RequestMapping("resource")
public class ResourceController extends BaseCRUDJsonMappingController<ResourceService,ResourceForm,ResourceEntity,Long> {
public class ResourceController extends BaseCRUDJsonBodyMappingController<ResourceService,ResourceEntity,Long> {
public ResourceController(){
super.setFormClass(ResourceForm.class);
......@@ -46,8 +40,7 @@ public class ResourceController extends BaseCRUDJsonMappingController<ResourceSe
}
@Override
protected void init(HttpServletRequest request, HttpServletResponse response, ResourceForm form,
Map<String, Object> model, Context context) {
protected void init(Map<String, Object> model, Context context) {
Map<String, Object> statsus = new HashMap<String, Object>();
statsus.put("authType", AuthType.getEnumMap());
statsus.put("sourceType", SourceType.getEnumMap());
......@@ -57,7 +50,6 @@ public class ResourceController extends BaseCRUDJsonMappingController<ResourceSe
statsus.put("userType", UserType.findByValue(getCurUser().getUserType()));
}
model.put(KEY_RESULT_DICT, statsus);
super.init(request, response, form, model, context);
}
/**
......
......@@ -22,7 +22,11 @@ import com.mortals.framework.model.BaseEntityLong;
*/
public class RoleEntity extends BaseEntityLong{
private static final long serialVersionUID = 1547777703344L;
/** 用户ID */
private Long userId;
/** 角色名称 */
private String name;
......
......@@ -8,13 +8,20 @@
package com.mortals.xhx.base.system.role.service.impl;
import com.mortals.framework.exception.AppException;
import com.mortals.framework.model.Context;
import com.mortals.framework.service.impl.AbstractCRUDServiceImpl;
import com.mortals.xhx.base.system.role.dao.RoleDao;
import com.mortals.xhx.base.system.role.model.RoleEntity;
import com.mortals.xhx.base.system.role.model.*;
import com.mortals.xhx.base.system.role.service.RoleAuthService;
import com.mortals.xhx.base.system.role.service.RoleService;
import com.mortals.xhx.base.system.role.service.RoleUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Arrays;
/**
* <p>Title: 角色信息</p>
* <p>Description: RoleServiceImpl service接口 </p>
......@@ -25,7 +32,29 @@ import org.springframework.stereotype.Service;
*/
@Service("roleService")
public class RoleServiceImpl extends AbstractCRUDServiceImpl<RoleDao,RoleEntity,Long> implements RoleService {
@Autowired
private RoleAuthService roleAuthService;
@Autowired
private RoleUserService roleUserService;
@Override
protected void removeAfter(Long[] ids, Context context, int result) throws AppException {
//删除关联角色
Arrays.asList(ids).stream().peek(roleId->{
RoleAuthQuery roleAuthQuery = new RoleAuthQuery();
roleAuthQuery.setRoleId(roleId);
Long[] roleAuthIds = roleAuthService.find(roleAuthQuery).stream().map(RoleAuthEntity::getId).toArray(Long[]::new);
roleAuthService.remove(roleAuthIds,context);
RoleUserQuery roleUserQuery = new RoleUserQuery();
roleUserQuery.setRoleId(roleId);
Long[] roleUserIds = roleUserService.find(roleUserQuery).stream().map(RoleUserEntity::getId).toArray(Long[]::new);
roleUserService.remove(roleUserIds,context);
}).count();
super.removeAfter(ids, context, result);
}
}
\ No newline at end of file
......@@ -32,6 +32,7 @@ import java.util.Map;
@Service("roleUserService")
public class RoleUserServiceImpl extends AbstractCRUDServiceImpl<RoleUserDao,RoleUserEntity,Long> implements RoleUserService {
@Override
public void doDistributionUser(RoleUserQuery query) {
Long roleId = query.getRoleId();
......@@ -68,5 +69,7 @@ public class RoleUserServiceImpl extends AbstractCRUDServiceImpl<RoleUserDao,Rol
}
this.dao.insertBatch(list);
}
}
\ No newline at end of file
/**
* 文件:RoleAuthController.java
* 版本:1.0.0
* 日期:
* Copyright &reg;
* All right reserved.
*/
package com.mortals.xhx.base.system.role.web;
import com.alibaba.fastjson.JSONObject;
import com.mortals.framework.web.BaseCRUDJsonBodyMappingController;
import com.mortals.xhx.base.system.role.model.RoleAuthQuery;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
......@@ -21,39 +18,38 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* <p>Title: 角色资源权限</p>
* <p>Description: RoleAuthController </p>
* <p>Copyright: Copyright &reg; </p>
* <p>Company: </p>
* @author
* @version 1.0.0
* 角色资源权限
*
* @author: zxfei
* @date: 2022/5/7 15:19
*/
@Slf4j
@RestController
@RequestMapping("role/auth")
public class RoleAuthController extends BaseCRUDJsonMappingController<RoleAuthService,RoleAuthForm,RoleAuthEntity,Long> {
public RoleAuthController(){
super.setFormClass(RoleAuthForm.class);
super.setModuleDesc("角色资源权限");
}
/**
* 分配资源
*/
@PostMapping(value = "distributionSource")
public String distributionUser(HttpServletRequest request, HttpServletResponse response, RoleAuthForm form) {
try {
service.doDistributionSource(form.getQuery());
JSONObject ret = new JSONObject();
ret.put(KEY_RESULT_CODE, VALUE_RESULT_SUCCESS);
return ret.toJSONString();
} catch (Exception e) {
log.error("分配角色资源错误", e);
JSONObject ret = new JSONObject();
ret.put(KEY_RESULT_CODE, VALUE_RESULT_FAILURE);
ret.put(KEY_RESULT_MSG, super.convertException(e));
return ret.toJSONString();
}
}
public class RoleAuthController extends BaseCRUDJsonBodyMappingController<RoleAuthService, RoleAuthEntity, Long> {
public RoleAuthController() {
super.setFormClass(RoleAuthForm.class);
super.setModuleDesc("角色资源权限");
}
/**
* 分配资源
*/
@PostMapping(value = "distributionSource")
public String distributionUser(@RequestBody RoleAuthQuery query) {
try {
service.doDistributionSource(query);
JSONObject ret = new JSONObject();
ret.put(KEY_RESULT_CODE, VALUE_RESULT_SUCCESS);
return ret.toJSONString();
} catch (Exception e) {
log.error("分配角色资源错误", e);
JSONObject ret = new JSONObject();
ret.put(KEY_RESULT_CODE, VALUE_RESULT_FAILURE);
ret.put(KEY_RESULT_MSG, super.convertException(e));
return ret.toJSONString();
}
}
}
\ No newline at end of file
/**
* 文件:RoleController.java
* 版本:1.0.0
* 日期:
* Copyright &reg;
* All right reserved.
*/
package com.mortals.xhx.base.system.role.web;
......@@ -14,11 +7,10 @@ import com.mortals.framework.common.code.UserType;
import com.mortals.framework.model.Context;
import com.mortals.framework.web.BaseCRUDJsonBodyMappingController;
import com.mortals.framework.web.BasePhpCRUDJsonMappingController;
import com.mortals.xhx.base.system.role.model.RoleQuery;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import com.mortals.framework.web.BaseCRUDJsonMappingController;
import com.mortals.xhx.base.system.role.model.RoleEntity;
import com.mortals.xhx.base.system.role.model.RoleUserEntity;
......@@ -34,12 +26,10 @@ import java.util.List;
import java.util.Map;
/**
* <p>Title: 角色信息</p>
* <p>Description: RoleController </p>
* <p>Copyright: Copyright &reg; </p>
* <p>Company: </p>
* @author
* @version 1.0.0
* 角色信息
*
* @author: zxfei
* @date: 2022/5/7 15:15
*/
@RestController
@RequestMapping("role")
......@@ -55,17 +45,24 @@ public class RoleController extends BaseCRUDJsonBodyMappingController<RoleServic
@Override
protected void init(Map<String, Object> model, Context context) {
this.addDict(model,"userType", IBaseEnum.getEnumMap(UserType.class));
this.addDict(model,"roleType", RoleType.getEnumMap());
super.init(model, context);
Map<String, Object> status = new HashMap<>();
status.put("userType", IBaseEnum.getEnumMap(UserType.class));
status.put("roleType", RoleType.getEnumMap());
model.put(KEY_RESULT_DICT, status);
}
/**
* 根据用户id获取角色名称
* @param userId
* @return
*/
@PostMapping("roleNameByUserId")
public String getRoleNameByUserId(@RequestBody RoleUserEntity query) {
public String getRoleNameByUserId(@RequestParam(value = "userId") Long userId) {
try{
JSONObject ret = new JSONObject();
RoleUserEntity roleUserEntity = new RoleUserEntity();
roleUserEntity.setUserId(query.getUserId());
roleUserEntity.setUserId(userId);
List<RoleUserEntity> find = roleUserService.find(roleUserEntity, new Context());
List<RoleEntity> model = new ArrayList<>();
if(find.size() > 0){
......
/**
* 文件:RoleUserController.java
* 版本:1.0.0
* 日期:
* Copyright &reg;
* All right reserved.
*/
package com.mortals.xhx.base.system.role.web;
import com.alibaba.fastjson.JSONObject;
......@@ -15,9 +8,12 @@ import com.mortals.framework.exception.AppException;
import com.mortals.framework.model.BaseEntityLong;
import com.mortals.framework.model.Context;
import com.mortals.framework.web.BaseCRUDJsonBodyMappingController;
import com.mortals.xhx.base.system.role.model.RoleUserQuery;
import org.apache.commons.beanutils.MethodUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.mortals.framework.web.BaseCRUDJsonMappingController;
......@@ -38,29 +34,50 @@ import java.util.Set;
import java.util.stream.Collectors;
/**
* <p>Title: 角色用户</p>
* <p>Description: RoleUserController </p>
* <p>Copyright: Copyright &reg; </p>
* <p>Company: </p>
* @author
* @version 1.0.0
* 角色用户
*
* @author: zxfei
* @date: 2022/5/7 15:15
*/
@RestController
@RequestMapping("role/user")
public class RoleUserController extends BaseCRUDJsonMappingController<RoleUserService,RoleUserForm,RoleUserEntity,Long> {
public class RoleUserController extends BaseCRUDJsonBodyMappingController<RoleUserService, RoleUserEntity, Long> {
@Autowired
private RoleService roleService;
@Autowired
private UserService userService;
public RoleUserController() {
super.setFormClass(RoleUserForm.class);
super.setModuleDesc("角色用户");
}
@Autowired
private RoleService roleService;
@Autowired
private UserService userService;
public RoleUserController(){
super.setFormClass(RoleUserForm.class);
super.setModuleDesc("角色用户");
}
/**
@Override
protected void init(Map<String, Object> model, Context context) {
Map<String, Object> status = new HashMap<>(3);
status.put("roleId", roleService.find(new RoleEntity(), null).stream()
.collect(Collectors.toMap(e -> e.getId().toString(), RoleEntity::getName)));
List<RoleUserEntity> roleUserList = (List<RoleUserEntity>) model.get(SysConstains.RESULT_KEY);
if (roleUserList != null && roleUserList.size() > 0) {
List<Long> userIdsList = roleUserList.stream().map(RoleUserEntity::getUserId).collect(Collectors.toList());
List<UserEntity> userEntityList = userService.find(getQuery(UserQuery.class,
Sets.newHashSet("id", "realName", "loginName"), userIdsList.toArray(new Long[userIdsList.size()])), null);
if (userEntityList != null) {
status.put("userReNameMap",
userEntityList.stream().collect(Collectors.toMap(e -> e.getId().toString(), UserEntity::getRealName)));
status.put("userId",
userEntityList.stream().collect(Collectors.toMap(e -> e.getId().toString(), UserEntity::getLoginName)));
}
}
model.put(KEY_RESULT_DICT, status);
}
/**
* 获取查询对象,限制查询返回的结果只包含ID和名称
*
* @param IdList
* @return
*/
......@@ -79,65 +96,42 @@ public class RoleUserController extends BaseCRUDJsonMappingController<RoleUserSe
}
}
@SuppressWarnings("unchecked")
@Override
protected void init(HttpServletRequest request, HttpServletResponse response, RoleUserForm form, Map<String, Object> model, Context context) {
Map<String, Object> status = new HashMap<>(3);
status.put("roleId", roleService.find(new RoleEntity(), null).stream()
.collect(Collectors.toMap(e -> e.getId().toString(), RoleEntity::getName)));
List<RoleUserEntity> roleUserList = (List<RoleUserEntity>) model.get(SysConstains.RESULT_KEY);
if(roleUserList!=null && roleUserList.size()>0) {
List<Long> userIdsList = roleUserList.stream().map(RoleUserEntity::getUserId).collect(Collectors.toList());
List<UserEntity> userEntityList = userService.find(getQuery(UserQuery.class,
Sets.newHashSet("id", "realName","loginName"), userIdsList.toArray(new Long[userIdsList.size()])), null);
if(userEntityList!=null) {
status.put("userReNameMap",
userEntityList.stream().collect(Collectors.toMap(e -> e.getId().toString(), UserEntity::getRealName)));
status.put("userId",
userEntityList.stream().collect(Collectors.toMap(e -> e.getId().toString(), UserEntity::getLoginName)));
}
}
model.put(KEY_RESULT_DICT, status);
super.init(request, response, form, model, context);
}
/**
* 分配用户
*/
@PostMapping(value = "distributionUser")
public String distributionUser(HttpServletRequest request, HttpServletResponse response, RoleUserForm form) {
try {
service.doDistributionUser(form.getQuery());
JSONObject ret = new JSONObject();
ret.put(KEY_RESULT_CODE, VALUE_RESULT_SUCCESS);
return ret.toJSONString();
} catch (Exception e) {
log.error("分配用户错误", e);
JSONObject ret = new JSONObject();
ret.put(KEY_RESULT_CODE, VALUE_RESULT_FAILURE);
ret.put(KEY_RESULT_MSG, super.convertException(e));
return ret.toJSONString();
}
}
/**
* 分配用户
*/
@PostMapping(value = "distributionUser")
public String distributionUser(@RequestBody RoleUserQuery query) {
try {
service.doDistributionUser(query);
JSONObject ret = new JSONObject();
ret.put(KEY_RESULT_CODE, VALUE_RESULT_SUCCESS);
return ret.toJSONString();
} catch (Exception e) {
log.error("分配用户错误", e);
JSONObject ret = new JSONObject();
ret.put(KEY_RESULT_CODE, VALUE_RESULT_FAILURE);
ret.put(KEY_RESULT_MSG, super.convertException(e));
return ret.toJSONString();
}
}
/**
* 分配角色
*/
@PostMapping(value = "distributionRole")
public String distributionRole(HttpServletRequest request, HttpServletResponse response, RoleUserForm form) {
try {
service.doDistributionRole(form.getQuery());
JSONObject ret = new JSONObject();
ret.put(KEY_RESULT_CODE, VALUE_RESULT_SUCCESS);
return ret.toJSONString();
} catch (Exception e) {
log.error("分配角色错误", e);
JSONObject ret = new JSONObject();
ret.put(KEY_RESULT_CODE, VALUE_RESULT_FAILURE);
ret.put(KEY_RESULT_MSG, super.convertException(e));
return ret.toJSONString();
}
}
/**
* 分配角色
*/
@PostMapping(value = "distributionRole")
public String distributionRole(@RequestBody RoleUserQuery query) {
try {
service.doDistributionRole(query);
JSONObject ret = new JSONObject();
ret.put(KEY_RESULT_CODE, VALUE_RESULT_SUCCESS);
return ret.toJSONString();
} catch (Exception e) {
log.error("分配角色错误", e);
JSONObject ret = new JSONObject();
ret.put(KEY_RESULT_CODE, VALUE_RESULT_FAILURE);
ret.put(KEY_RESULT_MSG, super.convertException(e));
return ret.toJSONString();
}
}
}
\ No newline at end of file
......@@ -62,7 +62,7 @@ public class TaskServiceImpl extends AbstractCRUDServiceImpl<TaskDao, TaskEntity
private Thread thread = null;
/** 日志打印时间,key:任务ID,value:最后一次打印日志时间 */
private Map<Long, Long> printLogTime = new HashMap<Long, Long>();
private Map<Long, Long> printLogTime = new HashMap<>();
@Autowired(required=false)
private TaskService taskService;
......@@ -216,17 +216,17 @@ public class TaskServiceImpl extends AbstractCRUDServiceImpl<TaskDao, TaskEntity
}
if (interimExcuteStatus != TaskInterimExcuteStatus.UNUSE.getValue() // 启用立即执行
|| ((strategy == TaskExcuteStrategy.DAY.getValue() // 按天
|| (strategy == TaskExcuteStrategy.WEEK.getValue()
&& week == excuteDate)
// 按周
|| (strategy == TaskExcuteStrategy.MONTH.getValue()
&& (day == excuteDate
|| (excuteDate > maxDay && day == maxDay))))// 按月
&& (excuteTime == currTime
&& !lastExcuteTimeStr.equals(currDateTimeStr)) // 执行间隔最少为一天
|| (strategy == TaskExcuteStrategy.WEEK.getValue()
&& week == excuteDate)
// 按周
|| (strategy == TaskExcuteStrategy.MONTH.getValue()
&& (day == excuteDate
|| (excuteDate > maxDay && day == maxDay))))// 按月
&& (excuteTime == currTime
&& !lastExcuteTimeStr.equals(currDateTimeStr)) // 执行间隔最少为一天
) || (strategy == TaskExcuteStrategy.INTERVAL.getValue() // 按间隔时间
&& (lastExcuteTime == null || lastExcuteTime.getTime()
+ excuteDate * 1000 <= currDateTime.getTime()))) {
+ excuteDate * 1000 <= currDateTime.getTime()))) {
final boolean printLog = checkPrintLog(task);
Object excuteBean = GlobalSysInfo.getBeanByName(task.getExcuteService());
if (excuteBean == null || !(excuteBean instanceof ITaskExcuteService)) {
......@@ -261,7 +261,7 @@ public class TaskServiceImpl extends AbstractCRUDServiceImpl<TaskDao, TaskEntity
log.error("执行任务失败-->" + excuteTask, e);
}
if (strategy == TaskExcuteStrategy.INTERVAL.getValue()) {
// 按间隔时间,更新执行时间,避免一直重复执行
// 按间隔时间,更新执行时间,避免一直重复执行
excuteTask.setLastExcuteTime(currDateTime);
}
} finally {
......@@ -297,7 +297,7 @@ public class TaskServiceImpl extends AbstractCRUDServiceImpl<TaskDao, TaskEntity
executorService.shutdown();
log.info("任务执行线程退出!");
});
// thread.start();
thread.start();
}
@Override
......
/**
* 文件:TaskController.java
* 版本:1.0.0
* 日期:
* Copyright &reg;
* All right reserved.
*/
package com.mortals.xhx.base.system.task.web;
......@@ -14,6 +7,8 @@ import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.mortals.framework.web.BaseCRUDJsonBodyMappingController;
import com.mortals.xhx.base.system.task.model.TaskQuery;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
......@@ -32,16 +27,14 @@ import com.mortals.xhx.common.code.TaskExcuteStrategyEnum;
import com.mortals.xhx.common.code.TaskInterimExcuteStatusEnum;
/**
* <p>Title: 任务信息</p>
* <p>Description: TaskController </p>
* <p>Copyright: Copyright &reg; </p>
* <p>Company: </p>
* @author
* @version 1.0.0
* 任务信息
*
* @author: zxfei
* @date: 2022/5/7 15:39
*/
@RestController
@RequestMapping("task")
public class TaskController extends BaseCRUDJsonMappingController<TaskService, TaskForm, TaskEntity, Long> {
public class TaskController extends BaseCRUDJsonBodyMappingController<TaskService, TaskEntity, Long> {
public TaskController() {
super.setFormClass(TaskForm.class);
......@@ -50,8 +43,7 @@ public class TaskController extends BaseCRUDJsonMappingController<TaskService, T
@Override
protected void init(HttpServletRequest request, HttpServletResponse response, TaskForm form,
Map<String, Object> model, Context context) {
protected void init(Map<String, Object> model, Context context) {
Map<String, Object> status = new HashMap<String, Object>();
status.put("status", TaskExcuteStatusEnum.getEnumMap());
status.put("excuteStrategy", TaskExcuteStrategyEnum.getEnumMap());
......@@ -71,60 +63,30 @@ public class TaskController extends BaseCRUDJsonMappingController<TaskService, T
}
model.put("excuteService", serviceList);
model.put(KEY_RESULT_DICT, status);
super.init(request, response, form, model, context);
}
/**
* @param request
* @param response
* @param form
* @param model
* @param context
* @throws AppException
* @Description: TODO
*/
@Override
protected void saveBefore(HttpServletRequest request, HttpServletResponse response, TaskForm form,
Map<String, Object> model, Context context) throws AppException {
if (null == form.getEntity().getExcuteService()) {
}
// TaskEntity condition = new TaskEntity();
// condition.setExcuteService(form.getEntity().getExcuteService());
// List<TaskEntity> datas = this.service.find(condition, context);
// if (null != datas && datas.size() > 0) {
// for (TaskEntity entity : datas) {
// if (entity.getId().longValue() != form.getEntity().getId().longValue()) {
// throw new AppException("任务已存在,请勿重复配置");
// }
// }
// }
super.saveBefore(request, response, form, model, context);
}
/**
* 改变状态
*/
@RequestMapping(value = "change/status")
public String changeStatus(HttpServletRequest request, HttpServletResponse response, TaskForm form) {
public String changeStatus(TaskQuery query) {
JSONObject ret = new JSONObject();
Context context = getContext();
try {
TaskEntity entity = this.service.get(form.getEntity().getId(), context);// .doSubmitAudit(form.getEntity(),
TaskEntity entity = this.service.get(query.getId(), context);// .doSubmitAudit(form.getEntity(),
// context);
if (null == entity) {
throw new AppException("任务不存在!");
}
if (null == form.getEntity().getStatus()) {
if (null == query.getStatus()) {
throw new AppException("任务状态不能为空!");
}
if (form.getEntity().getStatus() != DataSatusEnum.ENABLE.getValue()
&& form.getEntity().getStatus() != DataSatusEnum.DISENABLE.getValue()) {
if (query.getStatus() != DataSatusEnum.ENABLE.getValue()
&& query.getStatus() != DataSatusEnum.DISENABLE.getValue()) {
throw new AppException("非法任务状态!");
}
String busiDesc = DataSatusEnum.getByValue(form.getEntity().getStatus()).getDesc();
entity.setStatus(form.getEntity().getStatus());
String busiDesc = DataSatusEnum.getByValue(query.getStatus()).getDesc();
entity.setStatus(query.getStatus());
this.service.update(entity, context);
ret.put(KEY_RESULT_CODE, VALUE_RESULT_SUCCESS);
ret.put(KEY_RESULT_MSG, busiDesc + "成功");
......
......@@ -52,4 +52,6 @@ public interface UploadService extends IService {
void uploadDownload(String fileName, HttpServletResponse response);
void deleteFile(String fileName);
}
\ No newline at end of file
package com.mortals.xhx.base.system.upload.service.impl;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.IdUtil;
import com.mortals.framework.exception.AppException;
import com.mortals.framework.service.IUser;
import com.mortals.framework.util.StringUtils;
......@@ -15,9 +16,7 @@ import org.springframework.http.MediaType;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletResponse;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
......@@ -49,9 +48,7 @@ public class UploadServiceImpl implements UploadService {
if (tempFile == null || tempFile.getSize() == 0) {
throw new AppException("没有要上传的文件!");
}
if(StringUtils.isEmpty(prePath)){
prePath = "file/uploadfile";
}
String fileName = tempFile.getOriginalFilename();
String extension = FilenameUtils.getExtension(fileName);
UploadFileType type = UploadFileType.getFileType(extension);
......@@ -69,14 +66,12 @@ public class UploadServiceImpl implements UploadService {
if (!pathDir.exists()) {
pathDir.mkdirs();
}
String newName = new Date().getTime() + "." + extension;
//String newName = IdUtil.fastSimpleUUID() + "." + extension;
String filePathAll = filePath + newName;
File uploadFile = new File(filePathAll);
try {
log.info("文件正在储存");
log.info("文件正在储存,filepath:"+filePathAll);
tempFile.transferTo(uploadFile);
} catch (Exception e) {
throw new AppException(e.getMessage());
......@@ -94,7 +89,7 @@ public class UploadServiceImpl implements UploadService {
@Override
public void fileDownload(String fileName, Boolean delete, HttpServletResponse response) {
String realFileName = System.currentTimeMillis() + fileName.substring(fileName.indexOf("_") + 1);
String filePath = getFilePath(fileName);
String filePath = this.filePath + fileName;
try {
response.setContentType(MediaType.IMAGE_JPEG_VALUE);
setAttachmentResponseHeader(response, realFileName);
......@@ -107,28 +102,14 @@ public class UploadServiceImpl implements UploadService {
@Override
public void preview(String fileName, HttpServletResponse response) {
// String filePath = this.filePath+"/preview/" + fileName;
// try {
// response.setContentType(MediaType.IMAGE_JPEG_VALUE);
// setAttachmentResponseHeader(response, fileName);
// FileUtil.writeToStream(filePath, response.getOutputStream());
// } catch (Exception e) {
// log.error("下载文件失败", e);
// }
String filePath = getFilePath(fileName);
String filePath = this.filePath+"/file/preview/" + fileName;
try {
File file = new File(filePath);
BufferedImage image = ImageIO.read(file);
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "No-cache");
response.setDateHeader("Expires", 0L);
response.setContentType("image/jpeg");
ImageIO.write(image, "JPEG", response.getOutputStream());
} catch (Exception var4) {
this.log.debug("响应图片消息异常-->" + var4.getMessage());
response.setContentType(MediaType.IMAGE_JPEG_VALUE);
setAttachmentResponseHeader(response, fileName);
FileUtil.writeToStream(filePath, response.getOutputStream());
} catch (Exception e) {
log.error("下载文件失败", e);
}
}
......@@ -179,4 +160,14 @@ public class UploadServiceImpl implements UploadService {
}
}
@Override
public void deleteFile(String fileName) {
String filePath = this.filePath+ fileName;
try {
FileUtil.del(filePath);
} catch (Exception e) {
log.error("下载文件失败", e);
}
}
}
\ No newline at end of file
......@@ -2,6 +2,7 @@ package com.mortals.xhx.base.system.upload.web;
import com.alibaba.fastjson.JSONObject;
import com.mortals.framework.annotation.UnAuth;
import com.mortals.framework.exception.AppException;
import com.mortals.framework.web.BaseController;
import com.mortals.xhx.base.system.upload.service.UploadService;
......@@ -15,13 +16,10 @@ import java.util.HashMap;
import java.util.Map;
/**
* <p>Title: 上传文件</p>
* <p>Description: UploadfileController </p>
* <p>Copyright: Copyright &reg; </p>
* <p>Company: </p>
* 上传文件
*
* @author
* @version 1.0.0
* @author: zxfei
* @date: 2021/11/30 10:06
*/
@RestController
@RequestMapping("file")
......@@ -31,7 +29,8 @@ public class UploadController extends BaseController {
private UploadService uploadService;
@RequestMapping(value = "upload")
public String doFileUpload(HttpServletRequest request, HttpServletResponse response, UploadForm form) {
@UnAuth
public String doFileUpload(HttpServletRequest request, UploadForm form) {
Map<String, Object> model = new HashMap<>();
String jsonStr = "";
try {
......@@ -55,7 +54,8 @@ public class UploadController extends BaseController {
@RequestMapping(value = "commonupload")
public String doFileUpload(MultipartFile file, @RequestParam(value = "prePath",defaultValue = "file/uploadfile") String prePath) {
@UnAuth
public String doFileUpload(MultipartFile file, @RequestParam(value = "prePath",defaultValue = "file/fileupload") String prePath) {
Map<String, Object> model = new HashMap<>();
String jsonStr = "";
try {
......@@ -94,20 +94,6 @@ public class UploadController extends BaseController {
}
}
/**
* 图片预览 (PathVariable)
*
* @param fileName 文件名称
*/
@GetMapping("preview/{prePath}/{fileName}")
public void preViewPath(@PathVariable(value="fileName") String fileName,@PathVariable(value="prePath") String prePath, HttpServletResponse response) {
try {
uploadService.preview(prePath+"/"+fileName, response);
} catch (Exception e) {
log.error("下载文件失败:", e);
}
}
/**
* 图片预览 (PathVariable)
*
......
package com.mortals.xhx.base.system.user.model;
import com.alibaba.fastjson.annotation.JSONField;
import com.mortals.framework.model.BaseEntityLong;
import lombok.Data;
import java.util.List;
/**
*
* Description:User
* date: 2021-9-26 16:11:48
*/
* Description:User
* date: 2021-9-26 16:11:48
*/
@Data
public class UserEntityExt extends BaseEntityLong {
/**
* 唯一标识
*/
@JSONField(serialize = false)
private String token;
/**
* 登录时间
*/
private Long loginTime;
/**
* 过期时间
*/
private Long expireTime;
private String siteName;
private List<Long> roleIds;
private String siteCode;
private String oldPassword;
private String newPassword;
private String siteIds;
/**
* 站点名称
*/
private String siteName;
private String roleIds;
/**
* 唯一标识
*/
private String token;
/**
* 菜单栏
*/
private String menuUrl;
/**
* 登录时间
*/
private Long loginTime;
/**
* 过期时间
*/
private Long expireTime;
}
\ No newline at end of file
package com.mortals.xhx.base.system.user.model.vo;
import com.mortals.framework.model.BaseEntityLong;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
/**
* 用户信息业务视图对象
*
* @author zxfei
* @date 2022-07-05
*/
@Data
public class UserVo extends BaseEntityLong {
/**
* 站点名称
*/
private String siteName;
private String roleIds;
/**
* 唯一标识
*/
private String token;
/**
* 菜单栏
*/
private String menuUrl;
/**
* 登录时间
*/
private Long loginTime;
/**
* 过期时间
*/
private Long expireTime;
private Long siteId;
private Long customerId;
}
\ No newline at end of file
......@@ -13,6 +13,7 @@ import com.mortals.framework.model.Result;
import com.mortals.framework.service.ICRUDService;
import com.mortals.framework.service.IUser;
import com.mortals.xhx.base.system.menu.model.MenuEntity;
import com.mortals.xhx.base.system.user.dao.UserDao;
import com.mortals.xhx.base.system.user.model.UserEntity;
import java.util.List;
......@@ -37,7 +38,7 @@ public interface UserService extends ICRUDService<UserEntity,Long> {
* @return
* @throws AppException
*/
public UserEntity doLogin(String loginName, String password, String loginIp) throws AppException;
UserEntity doLogin(String loginName, String password, String loginIp) throws AppException;
/**
* 校验用户名与密码是否正确
......@@ -47,7 +48,7 @@ public interface UserService extends ICRUDService<UserEntity,Long> {
* @return
* @throws AppException
*/
public UserEntity doCheckUser(String loginName, String password) throws AppException;
UserEntity doCheckUser(String loginName, String password) throws AppException;
/**
* 检查用户是否存在
......@@ -56,7 +57,7 @@ public interface UserService extends ICRUDService<UserEntity,Long> {
* @param userId 密码
* @return
*/
public boolean existUser(String loginName, Long userId) throws AppException;
boolean existUser(String loginName, Long userId) throws AppException;
/**
* 通过登录用户获取菜单功能权限
......@@ -64,7 +65,7 @@ public interface UserService extends ICRUDService<UserEntity,Long> {
* @param user
* @return
*/
public List<MenuEntity> findOutlookBarList(IUser user);
List<MenuEntity> findOutlookBarList(IUser user);
/**
* 查询用户所有有权限的菜单ID
......@@ -72,7 +73,7 @@ public interface UserService extends ICRUDService<UserEntity,Long> {
* @param userEntity
* @return
*/
public Set<Long> findAllAuthIds(UserEntity userEntity) throws AppException;
Set<Long> findAllAuthIds(UserEntity userEntity) throws AppException;
/**
* 查询用户记录
......@@ -84,7 +85,7 @@ public interface UserService extends ICRUDService<UserEntity,Long> {
* @return
* @throws AppException
*/
public Result<UserEntity> find(Long platformId, UserEntity params, int currPage, int prePageResult) throws AppException;
Result<UserEntity> find(Long platformId, UserEntity params, int currPage, int prePageResult) throws AppException;
/**
* 为客户创建用户
......@@ -99,7 +100,7 @@ public interface UserService extends ICRUDService<UserEntity,Long> {
* @return
* @throws AppException
*/
public UserEntity createUser(IUser currUser, Long customerId, String customerName, String loginName, String password,
UserEntity createUser(IUser currUser, Long customerId, String customerName, String loginName, String password,
String userName, String mobile) throws AppException;
/**
......@@ -111,5 +112,10 @@ public interface UserService extends ICRUDService<UserEntity,Long> {
* @return
* @throws AppException
*/
public boolean updateUserPwd(String loginName, String oldPwd, String newPwd) throws AppException;
boolean updateUserPwd(String loginName, String oldPwd, String newPwd) throws AppException;
UserDao getUserDao();
}
\ No newline at end of file
......@@ -18,7 +18,7 @@ public enum ComponentEnum {
DATE("date", "日期选择栏"),
AREA("area", "区域选择栏"),
IMAGE("@image", "图片选择"),
DYNAMIC_TABLE("dt", "动态表格");
DYNAMIC_TABLE("dt", "动态表格"),;
private String value;
private String desc;
......
This diff is collapsed.
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