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 @@ ...@@ -53,7 +53,17 @@
<artifactId>guava</artifactId> <artifactId>guava</artifactId>
</dependency> </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> <dependency>
<groupId>junit</groupId> <groupId>junit</groupId>
...@@ -70,5 +80,32 @@ ...@@ -70,5 +80,32 @@
<filtering>true</filtering> <filtering>true</filtering>
</resource> </resource>
</resources> </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> </build>
</project> </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; package com.mortals.xhx.feign.req;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import java.util.List; import java.util.List;
......
...@@ -20,4 +20,10 @@ public class ApiResp<T> { ...@@ -20,4 +20,10 @@ public class ApiResp<T> {
*/ */
private T data; 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; package com.mortals.xhx.utils;
import cn.hutool.extra.qrcode.BufferedImageLuminanceSource;
import com.google.zxing.*; import com.google.zxing.*;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.common.BitMatrix; import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer; import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
......
...@@ -78,10 +78,6 @@ ...@@ -78,10 +78,6 @@
<artifactId>poi-ooxml-schemas</artifactId> <artifactId>poi-ooxml-schemas</artifactId>
<groupId>org.apache.poi</groupId> <groupId>org.apache.poi</groupId>
</exclusion> </exclusion>
<exclusion>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
</exclusion>
</exclusions> </exclusions>
</dependency> </dependency>
...@@ -96,6 +92,7 @@ ...@@ -96,6 +92,7 @@
<artifactId>druid-spring-boot-starter</artifactId> <artifactId>druid-spring-boot-starter</artifactId>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.mybatis.spring.boot</groupId> <groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId> <artifactId>mybatis-spring-boot-starter</artifactId>
...@@ -110,6 +107,15 @@ ...@@ -110,6 +107,15 @@
<artifactId>spring-data-redis</artifactId> <artifactId>spring-data-redis</artifactId>
</dependency> </dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId> <artifactId>spring-boot-starter-websocket</artifactId>
...@@ -122,16 +128,18 @@ ...@@ -122,16 +128,18 @@
<version>2.3.31</version> <version>2.3.31</version>
</dependency> </dependency>
<!--Token生成与解析--> <!-- <dependency>-->
<dependency> <!-- <groupId>com.aspose</groupId>-->
<groupId>io.jsonwebtoken</groupId> <!-- <artifactId>aspose-words</artifactId>-->
<artifactId>jjwt</artifactId> <!-- <version>20.1</version>-->
</dependency> <!-- <classifier>jdk17</classifier>-->
<!-- </dependency>-->
<dependency> <dependency>
<groupId>junit</groupId> <groupId>com.aspose.words</groupId>
<artifactId>junit</artifactId> <artifactId>aspose-words</artifactId>
<scope>test</scope> <version>19.2</version>
<classifier>jdk16</classifier>
</dependency> </dependency>
<dependency> <dependency>
...@@ -140,26 +148,15 @@ ...@@ -140,26 +148,15 @@
<version>2.0.8</version> <version>2.0.8</version>
</dependency> </dependency>
<dependency>
<groupId>com.aspose.words</groupId>
<artifactId>aspose-words</artifactId>
<version>19.2</version>
<classifier>jdk16</classifier>
</dependency>
<dependency> <dependency>
<groupId>com.deepoove</groupId> <groupId>com.deepoove</groupId>
<artifactId>poi-tl</artifactId> <artifactId>poi-tl</artifactId>
<version>1.12.0</version> <version>1.12.0</version>
</dependency> </dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.14</version>
</dependency>
</dependencies> </dependencies>
<build> <build>
<resources> <resources>
<resource> <resource>
...@@ -169,11 +166,6 @@ ...@@ -169,11 +166,6 @@
</resources> </resources>
<plugins> <plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
</plugin>
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId> <artifactId>maven-surefire-plugin</artifactId>
...@@ -187,7 +179,7 @@ ...@@ -187,7 +179,7 @@
<artifactId>spring-boot-maven-plugin</artifactId> <artifactId>spring-boot-maven-plugin</artifactId>
<configuration> <configuration>
<jvmArguments>-Dfile.encoding=UTF-8</jvmArguments> <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> <layout>ZIP</layout>
</configuration> </configuration>
</plugin> </plugin>
...@@ -213,7 +205,7 @@ ...@@ -213,7 +205,7 @@
</goals> </goals>
<configuration> <configuration>
<encoding>UTF-8</encoding> <encoding>UTF-8</encoding>
<outputDirectory>${project.basedir}/dist/${project.artifactId}/bin</outputDirectory> <outputDirectory>${project.parent.basedir}/dist/${project.parent.artifactId}/bin</outputDirectory>
<resources> <resources>
<resource> <resource>
<directory>src/main/bin/</directory> <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; ...@@ -4,6 +4,9 @@ import java.util.Date;
import javax.servlet.http.HttpServletRequest; 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.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Aspect;
...@@ -22,20 +25,37 @@ import com.mortals.xhx.base.system.oper.service.OperLogService; ...@@ -22,20 +25,37 @@ import com.mortals.xhx.base.system.oper.service.OperLogService;
/** /**
* 操作日志记录 * 操作日志记录
*
* @author: zxfei
* @date: 2021/11/5 13:28
*/ */
@Component @Component
@Slf4j
public class OperlogAspect extends FileLogServiceImpl implements ILogService { public class OperlogAspect extends FileLogServiceImpl implements ILogService {
private final static Logger logger = LoggerFactory.getLogger(OperlogAspect.class);
@Autowired @Autowired
private OperLogService operLogService; private OperLogService operLogService;
@Autowired
private IMessageProduceService messageProduceService;
@Override @Override
public void doHandlerLog(String platformMark, Long userId, String userName, String loginName, String requestUrl, 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); super.doHandlerLog(platformMark, userId, userName, loginName, requestUrl, content, ip, logDate);
operLogService.insertOperLog(ip, requestUrl, userId, userName, loginName, content); 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 @Override
...@@ -43,9 +63,11 @@ public class OperlogAspect extends FileLogServiceImpl implements ILogService { ...@@ -43,9 +63,11 @@ public class OperlogAspect extends FileLogServiceImpl implements ILogService {
// operLogService.insertOperLog(ip, requestUrl, null, "", loginName, // operLogService.insertOperLog(ip, requestUrl, null, "", loginName,
// content); // content);
this.doHandlerLog(platformMark, null, "", loginName, requestUrl, content, ip, new Date()); 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() { public void accessLog() {
} }
...@@ -55,13 +77,13 @@ public class OperlogAspect extends FileLogServiceImpl implements ILogService { ...@@ -55,13 +77,13 @@ public class OperlogAspect extends FileLogServiceImpl implements ILogService {
HttpServletRequest request = attributes.getRequest(); HttpServletRequest request = attributes.getRequest();
// url // url
logger.info("ip[{}]url[{}]", request.getRemoteAddr(), request.getRequestURL()); log.info("ip[{}]url[{}]", request.getRemoteAddr(), request.getRequestURL());
// 参数第1和第2个参数为HttpServletRequest request, HttpServletResponse // 参数第1和第2个参数为HttpServletRequest request, HttpServletResponse
// response // response
if (joinPoint.getArgs().length > 2) { if (joinPoint.getArgs().length > 2) {
logger.info("args={}", joinPoint.getArgs()[2]); log.info("args={}", joinPoint.getArgs()[2]);
} else { } else {
logger.info("args={}", joinPoint.getArgs()); log.info("args={}", joinPoint.getArgs());
} }
} }
...@@ -69,7 +91,7 @@ public class OperlogAspect extends FileLogServiceImpl implements ILogService { ...@@ -69,7 +91,7 @@ public class OperlogAspect extends FileLogServiceImpl implements ILogService {
@AfterReturning(returning = "object", pointcut = "accessLog()") @AfterReturning(returning = "object", pointcut = "accessLog()")
public void doAfterReturning(Object object) { public void doAfterReturning(Object object) {
if (null != object) { if (null != object) {
logger.info("response={}", object.toString()); log.info("response={}", object.toString());
}
} }
}*/
} }
package com.mortals.xhx.base.framework.aspect; 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.JSON;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
...@@ -27,11 +30,11 @@ import java.util.Map; ...@@ -27,11 +30,11 @@ import java.util.Map;
* @author: zxfei * @author: zxfei
* @date: 2022/4/20 9:24 * @date: 2022/4/20 9:24
*/ */
@Aspect //@Aspect
@Component //@Component
@Slf4j @Slf4j
@Order(1) @Order(1)
@Profile({"default", "develop", "test"}) //@Profile({"default", "develop", "test"})
public class WebLogAspect { public class WebLogAspect {
@Pointcut("execution(public * com.mortals..*Controller.*(..))") @Pointcut("execution(public * com.mortals..*Controller.*(..))")
public void webLog() { public void webLog() {
...@@ -61,13 +64,19 @@ public class WebLogAspect { ...@@ -61,13 +64,19 @@ public class WebLogAspect {
public void afterReturning(Object result) { public void afterReturning(Object result) {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest(); HttpServletRequest request = attributes.getRequest();
Map<String, String> map = MDC.getCopyOfContextMap(); Map<String, String> map = MDC.getCopyOfContextMap();
if (map != null&&result!=null) { if (map != null&&result!=null) {
String startTime = map.getOrDefault("startTime", String.valueOf(System.currentTimeMillis())); String startTime = map.getOrDefault("startTime", String.valueOf(System.currentTimeMillis()));
long takeTime = (System.currentTimeMillis() - Long.parseLong(startTime)); long takeTime = (System.currentTimeMillis() - Long.parseLong(startTime));
log.info(" \n 请求路径:{} \n 耗时:{}ms \n 请求报文:{} \n 响应报文:{}" if (result instanceof String) {
, request.getRequestURI(), takeTime, map.getOrDefault("req", ""), result == null ? "" : result.toString()); 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; package com.mortals.xhx.base.framework.config;
import com.mortals.framework.springcloud.config.web.BaseWebMvcConfigurer; import com.mortals.framework.springcloud.config.web.BaseWebMvcConfigurer;
import com.mortals.xhx.base.framework.feign.HierarchicalContract; import com.mortals.xhx.base.framework.WxMessageConverter;
import feign.Contract; 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.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
...@@ -14,12 +17,16 @@ import org.springframework.context.annotation.Configuration; ...@@ -14,12 +17,16 @@ import org.springframework.context.annotation.Configuration;
@Configuration @Configuration
public class AccountConfig { public class AccountConfig {
@Bean @Bean
public Contract feignContract() { public BaseWebMvcConfigurer getBaseWebMvc() {
return new HierarchicalContract(); return new BaseWebMvcConfigurer(false, null);
} }
@Bean @Bean
public BaseWebMvcConfigurer getBaseWebMvc(){ public Decoder feignDecoder() {
return new BaseWebMvcConfigurer(false,null); 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; package com.mortals.xhx.base.framework.config;
import com.mortals.framework.web.interceptor.BaseInterceptor;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
...@@ -13,7 +12,7 @@ import javax.servlet.http.HttpServletResponse; ...@@ -13,7 +12,7 @@ import javax.servlet.http.HttpServletResponse;
* @description:添加跨域响应 * @description:添加跨域响应
**/ **/
@Component @Component
public class CrossInterceptor extends BaseInterceptor { public class CrossInterceptor extends HandlerInterceptorAdapter {
@Override @Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
...@@ -24,9 +23,4 @@ public class CrossInterceptor extends BaseInterceptor { ...@@ -24,9 +23,4 @@ public class CrossInterceptor extends BaseInterceptor {
response.setHeader("Access-Control-Allow-Credentials", "true"); response.setHeader("Access-Control-Allow-Credentials", "true");
return 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; 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 com.mortals.framework.springcloud.config.mybatis.AbstractMybatisConfiguration;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import org.apache.ibatis.io.VFS;
import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.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 @Configuration
//@AutoConfigureAfter(DataSourceAutoConfiguration.class) //@AutoConfigureAfter(DataSourceAutoConfiguration.class)
...@@ -45,7 +35,6 @@ public class MybatisConfiguration extends AbstractMybatisConfiguration { ...@@ -45,7 +35,6 @@ public class MybatisConfiguration extends AbstractMybatisConfiguration {
@Value("${mybatis.config-location}") @Value("${mybatis.config-location}")
private String configLocation; private String configLocation;
// 提供SqlSeesion // 提供SqlSeesion
@Bean(name = "sqlSessionFactory") @Bean(name = "sqlSessionFactory")
public SqlSessionFactory sqlSessionFactoryBean(@Qualifier("dataSource") DataSource dataSource) { 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; 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 lombok.extern.slf4j.Slf4j;
import org.slf4j.MDC; import org.slf4j.MDC;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;
import org.springframework.web.filter.OncePerRequestFilter; import org.springframework.web.filter.OncePerRequestFilter;
import org.springframework.web.util.ContentCachingRequestWrapper; import org.springframework.web.util.ContentCachingRequestWrapper;
...@@ -27,15 +23,9 @@ import java.io.IOException; ...@@ -27,15 +23,9 @@ import java.io.IOException;
@Slf4j @Slf4j
public class RequestFilter extends OncePerRequestFilter implements Filter { public class RequestFilter extends OncePerRequestFilter implements Filter {
@Autowired
private IAuthTokenService authTokenService;
@Override @Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
try { try {
//每个请求记录一个traceId,可以根据traceId搜索出本次请求的全部相关日志
MDC.put("traceId", IdUtil.fastSimpleUUID().substring(0,12));
setUsername(request);
request = new ContentCachingRequestWrapper(request); request = new ContentCachingRequestWrapper(request);
filterChain.doFilter(request, response); filterChain.doFilter(request, response);
} catch (Exception e) { } catch (Exception e) {
...@@ -47,22 +37,22 @@ public class RequestFilter extends OncePerRequestFilter implements Filter { ...@@ -47,22 +37,22 @@ public class RequestFilter extends OncePerRequestFilter implements Filter {
} }
private void setUsername(HttpServletRequest request) { /*private void setUsername(HttpServletRequest request) {
//通过token解析出username //通过token解析出username
String token = authTokenService.getToken(request); String token = authTokenService.getToken(request);
//String token = request.getHeader("token"); //String token = request.getHeader("token");
if (!ObjectUtils.isEmpty(token)) { if (!ObjectUtils.isEmpty(token)) {
MDC.put("token",token); MDC.put("token",token);
// MDC.put("token", token); MDC.put("token", token);
// try { try {
// SessionUserInfo info = tokenService.getUserInfo(); SessionUserInfo info = tokenService.getUserInfo();
// if (info != null) { if (info != null) {
// String username = info.getUsername(); String username = info.getUsername();
// MDC.put("username", username); MDC.put("username", username);
// } }
// } catch (CommonJsonException e) { } catch (CommonJsonException e) {
// log.info("无效的token:{}", token); 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.alibaba.fastjson.JSONObject;
import com.mortals.framework.ap.SysConstains; import com.mortals.framework.ap.SysConstains;
...@@ -14,7 +14,6 @@ import io.jsonwebtoken.SignatureAlgorithm; ...@@ -14,7 +14,6 @@ import io.jsonwebtoken.SignatureAlgorithm;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Primary;
import org.springframework.core.annotation.Order; import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
...@@ -28,7 +27,7 @@ import java.util.Map; ...@@ -28,7 +27,7 @@ import java.util.Map;
* *
* @author zxfei * @author zxfei
*/ */
@Primary
@Service @Service
@Order(1) @Order(1)
@Slf4j @Slf4j
...@@ -55,6 +54,9 @@ public class AuthTokenServiceImpl implements IAuthTokenService { ...@@ -55,6 +54,9 @@ public class AuthTokenServiceImpl implements IAuthTokenService {
@Value("${token.database:0}") @Value("${token.database:0}")
private Integer portalDb; private Integer portalDb;
@Value("${platform.type:cloud}")
private String platFormType;//版本,默认云服务版本
protected static final Long SECOND = 1l; protected static final Long SECOND = 1l;
protected static final Long SECOND_MINUTE = 60 * SECOND; protected static final Long SECOND_MINUTE = 60 * SECOND;
...@@ -85,12 +87,10 @@ public class AuthTokenServiceImpl implements IAuthTokenService { ...@@ -85,12 +87,10 @@ public class AuthTokenServiceImpl implements IAuthTokenService {
Claims claims = parseToken(token); Claims claims = parseToken(token);
String uuid = (String) claims.get(SysConstains.LOGIN_USER_KEY); String uuid = (String) claims.get(SysConstains.LOGIN_USER_KEY);
String userKey = getTokenKey(uuid); String userKey = getTokenKey(uuid);
cacheService.select(portalDb);
String userStr = cacheService.get(userKey);
cacheService.select(db);
// Rest<String> rest = userFeign.getToken(userKey); // Rest<String> rest = userFeign.getToken(userKey);
// String userStr = rest.getData(); // String userStr = rest.getData();
String userStr = "";
userStr = cacheService.get(userKey);
if (StringUtils.isNotEmpty(userStr)) { if (StringUtils.isNotEmpty(userStr)) {
UserEntity userEntity = JSONObject.parseObject(userStr, UserEntity.class); UserEntity userEntity = JSONObject.parseObject(userStr, UserEntity.class);
userEntity.setToken(token); userEntity.setToken(token);
......
...@@ -2,13 +2,14 @@ package com.mortals.xhx.base.framework.interceptor; ...@@ -2,13 +2,14 @@ package com.mortals.xhx.base.framework.interceptor;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.mortals.framework.annotation.UnAuth; import com.mortals.framework.annotation.UnAuth;
import com.mortals.framework.common.Rest;
import com.mortals.framework.service.IAuthTokenService; import com.mortals.framework.service.IAuthTokenService;
import com.mortals.framework.service.IUser; import com.mortals.framework.service.IUser;
import com.mortals.framework.util.AESUtil; import com.mortals.framework.util.AESUtil;
import com.mortals.framework.utils.ServletUtils; import com.mortals.framework.utils.ServletUtils;
import com.mortals.framework.web.interceptor.BaseInterceptor; import com.mortals.framework.web.interceptor.BaseInterceptor;
import com.mortals.xhx.base.framework.config.InterceptorConfig; 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.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils; import org.springframework.util.ObjectUtils;
...@@ -19,6 +20,9 @@ import javax.servlet.http.HttpServletRequest; ...@@ -19,6 +20,9 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method; 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 * 用户权限验证,基于token
* *
...@@ -40,7 +44,8 @@ public class AuthUserInterceptor extends BaseInterceptor { ...@@ -40,7 +44,8 @@ public class AuthUserInterceptor extends BaseInterceptor {
@Override @Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception { throws Exception {
if (handler instanceof HandlerMethod) { JSONObject ret = new JSONObject();
if(handler instanceof HandlerMethod){
HandlerMethod handlerMethod = (HandlerMethod) handler; HandlerMethod handlerMethod = (HandlerMethod) handler;
Method method = handlerMethod.getMethod(); Method method = handlerMethod.getMethod();
UnAuth annotation = method.getAnnotation(UnAuth.class); UnAuth annotation = method.getAnnotation(UnAuth.class);
...@@ -48,10 +53,9 @@ public class AuthUserInterceptor extends BaseInterceptor { ...@@ -48,10 +53,9 @@ public class AuthUserInterceptor extends BaseInterceptor {
//取消校验 //取消校验
return true; return true;
} }
} else if (handler instanceof ResourceHttpRequestHandler) { }else if(handler instanceof ResourceHttpRequestHandler){
return true; return true;
} }
JSONObject ret = new JSONObject();
try { try {
String uri = request.getServletPath(); String uri = request.getServletPath();
//校验配置的请求路径是否需要检查权限 //校验配置的请求路径是否需要检查权限
...@@ -59,23 +63,23 @@ public class AuthUserInterceptor extends BaseInterceptor { ...@@ -59,23 +63,23 @@ public class AuthUserInterceptor extends BaseInterceptor {
//需要校验权限 //需要校验权限
boolean auth = this.checkAuth(request, uri, config.getSecurityKey()); boolean auth = this.checkAuth(request, uri, config.getSecurityKey());
if (!auth) { 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); IUser loginUser = authTokenService.getLoginUser(request);
//loginUser.isManager() if (ObjectUtils.isEmpty(loginUser)) {
if(ObjectUtils.isEmpty(loginUser)){ ServletUtils.renderString(response, JSONObject.toJSONString(Rest.fail(ERROR_TOKEN_EXPIRED, ERROR_TOKEN_EXPIRED_CONTENT)));
ret.put("code", 401);
ret.put("msg", "用户未登录或登录失效,请重新登录");
ServletUtils.renderString(response, JSONObject.toJSONString(ret));
return false; 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); return super.preHandle(request, response, handler);
} else { } else {
ret.put("code", -1); ServletUtils.renderString(response, JSONObject.toJSONString(Rest.fail(ERROR_USER_OPERATION, ERROR_USER_OPERATION_CONTENT)));
ret.put("msg", "用户无该操作权限!");
ServletUtils.renderString(response, JSONObject.toJSONString(ret));
return false; return false;
} }
} }
} }
} catch (Exception e) { } catch (Exception e) {
...@@ -102,6 +106,4 @@ public class AuthUserInterceptor extends BaseInterceptor { ...@@ -102,6 +106,4 @@ public class AuthUserInterceptor extends BaseInterceptor {
return false; return false;
} }
} }
...@@ -3,7 +3,6 @@ package com.mortals.xhx.base.framework.ws.handler; ...@@ -3,7 +3,6 @@ package com.mortals.xhx.base.framework.ws.handler;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.mortals.xhx.base.framework.ws.message.AuthRequest; 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.AuthResponse;
import com.mortals.xhx.base.framework.ws.message.UserJoinNoticeRequest;
import com.mortals.xhx.base.framework.ws.util.WebSocketUtil; import com.mortals.xhx.base.framework.ws.util.WebSocketUtil;
import lombok.extern.apachecommons.CommonsLog; import lombok.extern.apachecommons.CommonsLog;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
......
...@@ -2,8 +2,6 @@ package com.mortals.xhx.base.framework.ws.handler; ...@@ -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.HeartBeatRequest;
import com.mortals.xhx.base.framework.ws.message.SendResponse; 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 com.mortals.xhx.base.framework.ws.util.WebSocketUtil;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.web.socket.WebSocketSession; import org.springframework.web.socket.WebSocketSession;
......
...@@ -4,7 +4,6 @@ import lombok.extern.apachecommons.CommonsLog; ...@@ -4,7 +4,6 @@ import lombok.extern.apachecommons.CommonsLog;
import org.springframework.http.server.ServerHttpRequest; import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse; import org.springframework.http.server.ServerHttpResponse;
import org.springframework.http.server.ServletServerHttpRequest; import org.springframework.http.server.ServletServerHttpRequest;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor; import org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor;
import java.util.Map; import java.util.Map;
...@@ -17,18 +16,20 @@ import java.util.Map; ...@@ -17,18 +16,20 @@ import java.util.Map;
@CommonsLog @CommonsLog
public class WebSocketShakeInterceptor extends HttpSessionHandshakeInterceptor { public class WebSocketShakeInterceptor extends HttpSessionHandshakeInterceptor {
@Override // 拦截 Handshake 事件
public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, @Override
WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception { public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, org.springframework.web.socket.WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception {
// 获得 accessToken // 获得 accessToken
if (request instanceof ServletServerHttpRequest) { if (request instanceof ServletServerHttpRequest) {
ServletServerHttpRequest serverRequest = (ServletServerHttpRequest) request; ServletServerHttpRequest serverRequest = (ServletServerHttpRequest) request;
attributes.put("accessToken", serverRequest.getServletRequest().getParameter("accessToken")); attributes.put("accessToken", serverRequest.getServletRequest().getParameter("accessToken"));
} }
// 调用父方法,继续执行逻辑
return super.beforeHandshake(request, response, wsHandler, attributes); return super.beforeHandshake(request, response, wsHandler, attributes);
} }
public static void main(String[] args) { public static void main(String[] args) {
WebSocketShakeInterceptor webSocketShakeInterceptor = new WebSocketShakeInterceptor(); WebSocketShakeInterceptor webSocketShakeInterceptor = new WebSocketShakeInterceptor();
} }
......
package com.mortals.xhx.base.login.interceptor; package com.mortals.xhx.base.login.interceptor;
import com.mortals.framework.annotation.UnAuth;
import com.mortals.xhx.base.framework.config.InterceptorConfig; import com.mortals.xhx.base.framework.config.InterceptorConfig;
import com.mortals.framework.ap.CookieService; import com.mortals.framework.ap.CookieService;
import com.mortals.framework.ap.SysConstains; import com.mortals.framework.ap.SysConstains;
...@@ -13,10 +14,13 @@ import com.mortals.framework.web.interceptor.BaseInterceptor; ...@@ -13,10 +14,13 @@ import com.mortals.framework.web.interceptor.BaseInterceptor;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.annotation.Order; import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
//@Order(1) import java.lang.reflect.Method;
@Order(1)
//@Component //@Component
public class AuthJsonInterceptor extends BaseInterceptor { public class AuthJsonInterceptor extends BaseInterceptor {
...@@ -35,6 +39,13 @@ public class AuthJsonInterceptor extends BaseInterceptor { ...@@ -35,6 +39,13 @@ public class AuthJsonInterceptor extends BaseInterceptor {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception { throws Exception {
try { try {
HandlerMethod handlerMethod = (HandlerMethod) handler;
Method method = handlerMethod.getMethod();
UnAuth annotation = method.getAnnotation(UnAuth.class);
if (annotation != null) {
//取消校验
return true;
}
String uri = request.getServletPath(); String uri = request.getServletPath();
if (config.needCheckAuth(uri)) { if (config.needCheckAuth(uri)) {
boolean auth = this.checkAuth(request, uri, config.getSecurityKey()); boolean auth = this.checkAuth(request, uri, config.getSecurityKey());
......
...@@ -2,10 +2,12 @@ package com.mortals.xhx.base.login.web; ...@@ -2,10 +2,12 @@ package com.mortals.xhx.base.login.web;
import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.IdUtil;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.mortals.framework.ap.CookieService;
import com.mortals.framework.ap.GlobalSysInfo; import com.mortals.framework.ap.GlobalSysInfo;
import com.mortals.framework.ap.SysConstains; 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.ICacheService;
import com.mortals.framework.service.ITokenService;
import com.mortals.framework.service.IUser; import com.mortals.framework.service.IUser;
import com.mortals.framework.util.AESUtil; import com.mortals.framework.util.AESUtil;
import com.mortals.framework.util.DateUtils; import com.mortals.framework.util.DateUtils;
...@@ -19,9 +21,11 @@ import com.mortals.xhx.base.system.user.model.UserEntity; ...@@ -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.user.service.UserService;
import com.mortals.xhx.base.system.valid.service.ValidCodeService; import com.mortals.xhx.base.system.valid.service.ValidCodeService;
import com.mortals.xhx.common.key.RedisKey; import com.mortals.xhx.common.key.RedisKey;
import org.apache.commons.logging.Log; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired; 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.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
...@@ -31,9 +35,13 @@ import javax.servlet.http.HttpServletResponse; ...@@ -31,9 +35,13 @@ import javax.servlet.http.HttpServletResponse;
import java.util.List; import java.util.List;
import java.util.Set; 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 @RestController
@Slf4j
@RequestMapping("login") @RequestMapping("login")
public class LoginController extends BaseCRUDJsonBodyMappingController<UserService, UserEntity, Long> { public class LoginController extends BaseCRUDJsonBodyMappingController<UserService, UserEntity, Long> implements InitializingBean {
@Autowired @Autowired
private UserService userService; private UserService userService;
...@@ -44,19 +52,15 @@ public class LoginController extends BaseCRUDJsonBodyMappingController<UserServi ...@@ -44,19 +52,15 @@ public class LoginController extends BaseCRUDJsonBodyMappingController<UserServi
@Autowired @Autowired
private MenuService menuService; private MenuService menuService;
@Autowired @Autowired
private ITokenService tokenService;
@Autowired
private ICacheService cacheService; private ICacheService cacheService;
@Autowired
private static Log logger = LogFactory.getLog(LoginController.class); private IAuthTokenService authTokenService;
@RequestMapping("login") @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(); JSONObject ret = new JSONObject();
String loginName = loginForm.getLoginName(); String loginName = loginForm.getLoginName();
String password = loginForm.getPassword(); String password = loginForm.getPassword();
//String securityCode = loginForm.getSecurityCode();
String ip = super.getRequestIP(request); String ip = super.getRequestIP(request);
if (StringUtils.isEmpty(loginName) || StringUtils.isEmpty(password)) { if (StringUtils.isEmpty(loginName) || StringUtils.isEmpty(password)) {
ret.put(KEY_RESULT_CODE, VALUE_RESULT_FAILURE); ret.put(KEY_RESULT_CODE, VALUE_RESULT_FAILURE);
...@@ -66,10 +70,8 @@ public class LoginController extends BaseCRUDJsonBodyMappingController<UserServi ...@@ -66,10 +70,8 @@ public class LoginController extends BaseCRUDJsonBodyMappingController<UserServi
UserEntity userEntity = null; UserEntity userEntity = null;
try { try {
loginForm.validate(); loginForm.validate();
userEntity = userService.doLogin(loginName, password, ip); userEntity = userService.doLogin(loginName, password, ip);
userEntity.setLastLoginAddress(ip); userEntity.setLastLoginAddress(ip);
//saveCurrUser(request, response, userEntity);
recordSysLog(request, userEntity, "用户登录系统成功!"); recordSysLog(request, userEntity, "用户登录系统成功!");
// 返回拥有的菜单数据 // 返回拥有的菜单数据
Set<String> urls = resourceService.findUrlSetByUserId(userEntity.getId()); Set<String> urls = resourceService.findUrlSetByUserId(userEntity.getId());
...@@ -78,23 +80,26 @@ public class LoginController extends BaseCRUDJsonBodyMappingController<UserServi ...@@ -78,23 +80,26 @@ public class LoginController extends BaseCRUDJsonBodyMappingController<UserServi
if (currUserName == null || currUserName.trim().length() == 0) { if (currUserName == null || currUserName.trim().length() == 0) {
currUserName = "管理员"; currUserName = "管理员";
} }
userEntity.setLoginTime(System.currentTimeMillis());
userEntity.setToken(IdUtil.fastSimpleUUID());
userEntity.setExpireTime(DateUtils.addCurrDate(7).getTime());
String token = authTokenService.createToken(userEntity);
JSONObject data = new JSONObject(); JSONObject data = new JSONObject();
data.put("token", token);
data.put("currUserName", currUserName); data.put("currUserName", currUserName);
data.put("barList", outlookBarList); data.put("barList", outlookBarList);
data.put("id", userEntity.getId()); data.put("id", userEntity.getId());
data.put("userType", userEntity.getUserType()); 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); //this.generateBlackCookie(request, response, loginName, urls);
ret.put(KEY_RESULT_DATA, data); ret.put(KEY_RESULT_DATA, data);
ret.put(KEY_RESULT_CODE, VALUE_RESULT_SUCCESS); ret.put(KEY_RESULT_CODE, VALUE_RESULT_SUCCESS);
ret.put(KEY_RESULT_MSG, "用户登录系统成功!"); ret.put(KEY_RESULT_MSG, "用户登录系统成功!");
ret.put("resources", urls); ret.put("resources", urls);
return ret.toJSONString(); return ret.toJSONString();
} catch (Exception e) { } catch (Exception e) {
log.error("login error ", e); log.error("login error ", e);
...@@ -109,17 +114,18 @@ public class LoginController extends BaseCRUDJsonBodyMappingController<UserServi ...@@ -109,17 +114,18 @@ public class LoginController extends BaseCRUDJsonBodyMappingController<UserServi
} }
@RequestMapping("logout") @RequestMapping("logout")
public void logout() throws Exception { public void logout(HttpServletRequest request, HttpServletResponse response) throws Exception {
recordSysLog(request, "退出登录"); recordSysLog(request, "退出登录");
super.removeCurrUser(request); super.removeCurrUser(request);
this.deleteBlackCookie(request, response);
} }
@RequestMapping("index") @RequestMapping("index")
public String index(HttpServletRequest request, HttpServletResponse response) throws Exception { public String index() throws Exception {
JSONObject ret = new JSONObject(); JSONObject ret = new JSONObject();
IUser user = this.getCurUser(); IUser user = this.getCurUser();
if (user == null) { if (user == null) {
return ""; return JSONObject.toJSONString(Rest.fail(ERROR_TOKEN_EXPIRED, ERROR_TOKEN_EXPIRED_CONTENT));
} }
Set<String> urls = resourceService.findUrlSetByUserId(user.getId()); Set<String> urls = resourceService.findUrlSetByUserId(user.getId());
List<MenuEntity> outlookBarList = menuService.findTreeMenu(user, urls); List<MenuEntity> outlookBarList = menuService.findTreeMenu(user, urls);
...@@ -128,6 +134,9 @@ public class LoginController extends BaseCRUDJsonBodyMappingController<UserServi ...@@ -128,6 +134,9 @@ public class LoginController extends BaseCRUDJsonBodyMappingController<UserServi
currUserName = "管理员"; currUserName = "管理员";
} }
JSONObject data = new JSONObject(); JSONObject data = new JSONObject();
String token = authTokenService.getToken(request);
data.put("token", token);
data.put("currUserName", currUserName); data.put("currUserName", currUserName);
data.put("barList", outlookBarList); data.put("barList", outlookBarList);
data.put("id", user.getId()); data.put("id", user.getId());
...@@ -163,6 +172,26 @@ public class LoginController extends BaseCRUDJsonBodyMappingController<UserServi ...@@ -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") @RequestMapping("validcode")
public String validCode(HttpServletRequest request, HttpServletResponse response, LoginForm loginForm) { public String validCode(HttpServletRequest request, HttpServletResponse response, LoginForm loginForm) {
JSONObject ret = new JSONObject(); JSONObject ret = new JSONObject();
...@@ -206,4 +235,26 @@ public class LoginController extends BaseCRUDJsonBodyMappingController<UserServi ...@@ -206,4 +235,26 @@ public class LoginController extends BaseCRUDJsonBodyMappingController<UserServi
return ret.toJSONString(); 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 { ...@@ -37,7 +37,7 @@ public class LoginForm extends BaseForm {
@Override @Override
public String toString() { public String toString() {
return "loginName:" + this.loginName + " password:" + this.password; return "loginName:" + this.loginName + " password:" + this.password + " securityCode:" + this.securityCode;
} }
@Override @Override
...@@ -48,9 +48,7 @@ public class LoginForm extends BaseForm { ...@@ -48,9 +48,7 @@ public class LoginForm extends BaseForm {
if (password == null || password.trim().length() == 0) { if (password == null || password.trim().length() == 0) {
throw new AppException("密码不能为空!"); throw new AppException("密码不能为空!");
} }
// if (securityCode == null || securityCode.trim().length() == 0) {
// throw new AppException("验证码不能为空!");
// }
return super.validate(); return super.validate();
} }
} }
package com.mortals.xhx.base.login.web; package com.mortals.xhx.base.login.web;
import java.awt.image.BufferedImage; import com.mortals.framework.util.SecurityImage;
import com.mortals.framework.web.BaseCRUDJsonController;
import javax.servlet.http.HttpServletRequest; import com.mortals.xhx.base.login.service.GifSecurityImage;
import javax.servlet.http.HttpServletResponse;
import com.mortals.xhx.base.system.valid.model.ValidCodeEntity; 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.service.ValidCodeService;
import com.mortals.xhx.base.system.valid.web.ValidCodeForm; import com.mortals.xhx.base.system.valid.web.ValidCodeForm;
...@@ -13,9 +11,9 @@ import org.springframework.beans.factory.annotation.Autowired; ...@@ -13,9 +11,9 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import com.mortals.framework.util.SecurityImage; import javax.servlet.http.HttpServletRequest;
import com.mortals.framework.web.BaseCRUDJsonController; import javax.servlet.http.HttpServletResponse;
import com.mortals.xhx.base.login.service.GifSecurityImage; import java.awt.image.BufferedImage;
@RestController @RestController
@RequestMapping("securitycode") @RequestMapping("securitycode")
......
...@@ -76,6 +76,9 @@ public class MenuEntity extends BaseEntityLong{ ...@@ -76,6 +76,9 @@ public class MenuEntity extends BaseEntityLong{
/** 创建用户名称 */ /** 创建用户名称 */
private String createUserName; private String createUserName;
private Integer type;
private List<MenuEntity> childList = new ArrayList<MenuEntity>(); private List<MenuEntity> childList = new ArrayList<MenuEntity>();
...@@ -83,6 +86,14 @@ public class MenuEntity extends BaseEntityLong{ ...@@ -83,6 +86,14 @@ public class MenuEntity extends BaseEntityLong{
} }
public Integer getType() {
return type;
}
public void setType(Integer type) {
this.type = type;
}
/** /**
* 获取 菜单名称 * 获取 菜单名称
* @return name * @return name
...@@ -410,7 +421,7 @@ public class MenuEntity extends BaseEntityLong{ ...@@ -410,7 +421,7 @@ public class MenuEntity extends BaseEntityLong{
this.name = null; this.name = null;
this.url = null; this.url = null;
this.parentId = null; this.parentId = null;
this.orderId = null; this.orderId = 0;
this.status = 1; this.status = 1;
this.linkType = 0; this.linkType = 0;
this.groupId = 1; this.groupId = 1;
......
...@@ -52,4 +52,12 @@ public interface MenuService extends ICRUDService<MenuEntity,Long> { ...@@ -52,4 +52,12 @@ public interface MenuService extends ICRUDService<MenuEntity,Long> {
* @throws AppException * @throws AppException
*/ */
public List<MenuEntity> findTreeMenu() 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 * 文件:MenuServiceImpl.java
* 版本:1.0.0 * 版本:1.0.0
* 日期: * 日期:
* Copyright &reg; * Copyright &reg;
* All right reserved. * All right reserved.
*/ */
package com.mortals.xhx.base.system.menu.service.impl; package com.mortals.xhx.base.system.menu.service.impl;
import com.mortals.framework.common.code.YesNo; import com.mortals.framework.common.code.YesNo;
import com.mortals.framework.exception.AppException; import com.mortals.framework.exception.AppException;
import com.mortals.framework.model.Context;
import com.mortals.framework.model.OrderCol; import com.mortals.framework.model.OrderCol;
import com.mortals.framework.service.IUser; import com.mortals.framework.service.IUser;
import com.mortals.framework.service.impl.AbstractCRUDServiceImpl; import com.mortals.framework.service.impl.AbstractCRUDServiceImpl;
...@@ -19,20 +20,23 @@ import com.mortals.xhx.base.system.menu.model.MenuEntity; ...@@ -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.model.MenuQuery;
import com.mortals.xhx.base.system.menu.service.MenuService; import com.mortals.xhx.base.system.menu.service.MenuService;
import com.mortals.xhx.common.code.YesNoEnum;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.*; import java.util.*;
import java.util.stream.Collectors;
/** /**
* <p>Title: 菜单信息</p> * <p>Title: 菜单信息</p>
* <p>Description: MenuServiceImpl service接口 </p> * <p>Description: MenuServiceImpl service接口 </p>
* <p>Copyright: Copyright &reg; </p> * <p>Copyright: Copyright &reg; </p>
* <p>Company: </p> * <p>Company: </p>
*
* @author * @author
* @version 1.0.0 * @version 1.0.0
*/ */
@Service("menuService") @Service("menuService")
public class MenuServiceImpl extends AbstractCRUDServiceImpl<MenuDao,MenuEntity,Long> implements MenuService { public class MenuServiceImpl extends AbstractCRUDServiceImpl<MenuDao, MenuEntity, Long> implements MenuService {
@Override @Override
public List<MenuEntity> findAllEnable() throws AppException { public List<MenuEntity> findAllEnable() throws AppException {
...@@ -48,7 +52,7 @@ public class MenuServiceImpl extends AbstractCRUDServiceImpl<MenuDao,MenuEntity, ...@@ -48,7 +52,7 @@ public class MenuServiceImpl extends AbstractCRUDServiceImpl<MenuDao,MenuEntity,
@Override @Override
public List<MenuEntity> findTreeMenu(IUser user, Set<String> urls) throws AppException { 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>(); Map<Long, MenuEntity> menuMap = new HashMap<Long, MenuEntity>();
List<MenuEntity> userModuleList = this.findAllEnable(); List<MenuEntity> userModuleList = this.findAllEnable();
for (MenuEntity sysModule : userModuleList) { for (MenuEntity sysModule : userModuleList) {
...@@ -112,4 +116,68 @@ public class MenuServiceImpl extends AbstractCRUDServiceImpl<MenuDao,MenuEntity, ...@@ -112,4 +116,68 @@ public class MenuServiceImpl extends AbstractCRUDServiceImpl<MenuDao,MenuEntity,
return outlookBar; 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; package com.mortals.xhx.base.system.menu.web;
...@@ -13,9 +6,9 @@ import com.mortals.framework.exception.AppException; ...@@ -13,9 +6,9 @@ import com.mortals.framework.exception.AppException;
import com.mortals.framework.model.Context; import com.mortals.framework.model.Context;
import com.mortals.framework.model.OrderCol; import com.mortals.framework.model.OrderCol;
import org.springframework.web.bind.annotation.PostMapping; import com.mortals.framework.web.BaseCRUDJsonBodyMappingController;
import org.springframework.web.bind.annotation.RequestMapping; import com.mortals.xhx.base.system.menu.model.MenuQuery;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.*;
import com.mortals.framework.web.BaseCRUDJsonMappingController; import com.mortals.framework.web.BaseCRUDJsonMappingController;
import com.mortals.xhx.base.system.menu.model.MenuEntity; import com.mortals.xhx.base.system.menu.model.MenuEntity;
...@@ -35,34 +28,30 @@ import java.util.Map; ...@@ -35,34 +28,30 @@ import java.util.Map;
/** /**
* <p>Title: 菜单信息</p> * 菜单信息
* <p>Description: MenuController </p> *
* <p>Copyright: Copyright &reg; </p> * @author: zxfei
* <p>Company: </p> * @date: 2021/11/30 10:02
* @author
* @version 1.0.0
*/ */
@RestController @RestController
@RequestMapping("menu") @RequestMapping("menu")
public class MenuController extends BaseCRUDJsonMappingController<MenuService, MenuForm,MenuEntity,Long> { public class MenuController extends BaseCRUDJsonBodyMappingController<MenuService, MenuEntity, Long> {
public MenuController(){ public MenuController() {
super.setFormClass(MenuForm.class);
super.setModuleDesc("菜单信息"); super.setModuleDesc("菜单信息");
} }
@Override @Override
protected void doListBefore(HttpServletRequest request, HttpServletResponse response, MenuForm form, Map<String, Object> model, Context context) throws AppException { protected void doListBefore(MenuEntity query, Map<String, Object> model, Context context) throws AppException {
List<OrderCol> orderColList = new ArrayList<OrderCol>(); List<OrderCol> orderColList = new ArrayList<OrderCol>();
orderColList.add(new OrderCol("parentId")); orderColList.add(new OrderCol("parentId"));
orderColList.add(new OrderCol("orderId")); orderColList.add(new OrderCol("orderId"));
form.getQuery().setOrderColList(orderColList); query.setOrderColList(orderColList);
} }
@Override @Override
protected void init(HttpServletRequest request, HttpServletResponse response, MenuForm form, Map<String, Object> model, protected void init(Map<String, Object> model, Context context) {
Context context) {
Map<String, Object> status = new HashMap<String, Object>(); 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("status", DataSatus.getEnumMap(DataSatus.CLOSE.getValue(), DataSatus.DELETE.getValue(), DataSatus.OVERDUE.getValue(), DataSatus.USEOUT.getValue()));
status.put("linkType", MenuLinkType.getEnumMap()); status.put("linkType", MenuLinkType.getEnumMap());
...@@ -70,29 +59,28 @@ public class MenuController extends BaseCRUDJsonMappingController<MenuService, M ...@@ -70,29 +59,28 @@ public class MenuController extends BaseCRUDJsonMappingController<MenuService, M
status.put("menuType", MenuType.getEnumMap()); status.put("menuType", MenuType.getEnumMap());
status.put("authType", MenuAuthType.getEnumMap()); status.put("authType", MenuAuthType.getEnumMap());
model.put(KEY_RESULT_DICT, status); model.put(KEY_RESULT_DICT, status);
super.init(request, response, form, model, context);
} }
/** /**
* 改变状态 * 改变状态
*/ */
@RequestMapping(value = "change/status") @RequestMapping(value = "change/status")
public String changeStatus(HttpServletRequest request, HttpServletResponse response, MenuForm form) { public String changeStatus(@RequestBody MenuEntity query) {
JSONObject ret = new JSONObject(); JSONObject ret = new JSONObject();
Context context = getContext(); Context context = getContext();
try { try {
MenuEntity entity = this.service.get(form.getEntity().getId(), context);//.doSubmitAudit(form.getEntity(), context); MenuEntity entity = this.service.get(query.getId(), context);//.doSubmitAudit(form.getEntity(), context);
if (null == entity) { if (null == entity) {
throw new AppException("菜单不存在!"); throw new AppException("菜单不存在!");
} }
if (null == form.getEntity().getStatus()) { if (null == entity.getStatus()) {
throw new AppException("菜单状态不能为空!"); throw new AppException("菜单状态不能为空!");
} }
if (form.getEntity().getStatus() != DataSatus.ENABLE.getValue() && form.getEntity().getStatus() != DataSatus.DISENABLE.getValue()) { if (entity.getStatus() != DataSatus.ENABLE.getValue() && entity.getStatus() != DataSatus.DISENABLE.getValue()) {
throw new AppException("非法菜单状态!"); throw new AppException("非法菜单状态!");
} }
String busiDesc = DataSatus.getByValue(form.getEntity().getStatus()).getDesc(); String busiDesc = DataSatus.getByValue(entity.getStatus()).getDesc();
entity.setStatus(form.getEntity().getStatus()); entity.setStatus(entity.getStatus());
this.service.update(entity, context); this.service.update(entity, context);
ret.put(KEY_RESULT_CODE, VALUE_RESULT_SUCCESS); ret.put(KEY_RESULT_CODE, VALUE_RESULT_SUCCESS);
ret.put(KEY_RESULT_MSG, busiDesc + "成功"); ret.put(KEY_RESULT_MSG, busiDesc + "成功");
...@@ -104,4 +92,22 @@ public class MenuController extends BaseCRUDJsonMappingController<MenuService, M ...@@ -104,4 +92,22 @@ public class MenuController extends BaseCRUDJsonMappingController<MenuService, M
} }
return ret.toJSONString(); 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; ...@@ -10,8 +10,6 @@ package com.mortals.xhx.base.system.oper.model;
import java.util.Date; import java.util.Date;
import com.alibaba.fastjson.annotation.JSONField;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.mortals.framework.model.BaseEntityLong; import com.mortals.framework.model.BaseEntityLong;
/** /**
...@@ -47,7 +45,6 @@ public class OperLogEntity extends BaseEntityLong{ ...@@ -47,7 +45,6 @@ public class OperLogEntity extends BaseEntityLong{
private String ip; private String ip;
/** 操作时间 */ /** 操作时间 */
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private Date logDate; private Date logDate;
/** 操作类型,0:新增,1:修改,2:删除 */ /** 操作类型,0:新增,1:修改,2:删除 */
......
...@@ -106,7 +106,7 @@ public class OperLogServiceImpl extends AbstractCRUDServiceImpl<OperLogDao,OperL ...@@ -106,7 +106,7 @@ public class OperLogServiceImpl extends AbstractCRUDServiceImpl<OperLogDao,OperL
operLogEntity.setLogDate(new Date()); operLogEntity.setLogDate(new Date());
operLogEntity.setPlatformMark(GlobalSysInfo.getPropertyValue(SysConstains.PROP_PLATFORM_MARK)); operLogEntity.setPlatformMark(GlobalSysInfo.getPropertyValue(SysConstains.PROP_PLATFORM_MARK));
// operLogEntity.setOperType(operType.getValue()); //operLogEntity.setOperType(operType.getValue());
operLogEntity.setRequestUrl(requestUrl); operLogEntity.setRequestUrl(requestUrl);
operLogEntity.setLoginName(loginName); operLogEntity.setLoginName(loginName);
operLogEntity.setUserId(userId); operLogEntity.setUserId(userId);
......
/** /**
* 文件:OperLogController.java * 文件:OperLogController.java
* 版本:1.0.0 * 版本:1.0.0
* 日期: * 日期:
* Copyright &reg; * Copyright &reg;
* All right reserved. * All right reserved.
*/ */
package com.mortals.xhx.base.system.oper.web; package com.mortals.xhx.base.system.oper.web;
import com.alibaba.fastjson.JSONObject;
import com.mortals.framework.exception.AppException; import com.mortals.framework.exception.AppException;
import com.mortals.framework.model.Context; import com.mortals.framework.model.Context;
import com.mortals.framework.model.OrderCol; import com.mortals.framework.model.OrderCol;
...@@ -14,9 +16,15 @@ import com.mortals.framework.web.BaseCRUDJsonBodyMappingController; ...@@ -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.model.OperLogEntity;
import com.mortals.xhx.base.system.oper.service.OperLogService; import com.mortals.xhx.base.system.oper.service.OperLogService;
import com.mortals.xhx.common.code.OperTypeEnum; 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.RequestMapping;
import org.springframework.web.bind.annotation.RestController; 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.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
...@@ -26,14 +34,15 @@ import java.util.Map; ...@@ -26,14 +34,15 @@ import java.util.Map;
* <p>Description: OperLogController </p> * <p>Description: OperLogController </p>
* <p>Copyright: Copyright &reg; </p> * <p>Copyright: Copyright &reg; </p>
* <p>Company: </p> * <p>Company: </p>
*
* @author * @author
* @version 1.0.0 * @version 1.0.0
*/ */
@RestController @RestController
@RequestMapping("oper/log") @RequestMapping("oper/log")
public class OperLogController extends BaseCRUDJsonBodyMappingController<OperLogService,OperLogEntity,Long> { public class OperLogController extends BaseCRUDJsonBodyMappingController<OperLogService, OperLogEntity, Long> {
public OperLogController(){ public OperLogController() {
super.setFormClass(OperLogForm.class); super.setFormClass(OperLogForm.class);
super.setModuleDesc("操作日志"); super.setModuleDesc("操作日志");
} }
...@@ -41,9 +50,11 @@ public class OperLogController extends BaseCRUDJsonBodyMappingController<OperLog ...@@ -41,9 +50,11 @@ public class OperLogController extends BaseCRUDJsonBodyMappingController<OperLog
@Override @Override
protected void init(Map<String, Object> model, Context context) { protected void init(Map<String, Object> model, Context context) {
Map<String, Object> status = new HashMap<String, Object>(1);
// 返回日志类型 // 返回日志类型
this.addDict(model,"operType", OperTypeEnum.getEnumMap()); status.put("operType", OperTypeEnum.getEnumMap());
super.init(model, context);
model.put(KEY_RESULT_DICT, status);
} }
@Override @Override
......
/**
* 文件:ResourceController.java
* 版本:1.0.0
* 日期:
* Copyright &reg;
* All right reserved.
*/
package com.mortals.xhx.base.system.resource.web; package com.mortals.xhx.base.system.resource.web;
...@@ -16,6 +9,8 @@ import javax.servlet.http.HttpServletResponse; ...@@ -16,6 +9,8 @@ import javax.servlet.http.HttpServletResponse;
import com.mortals.framework.common.IBaseEnum; import com.mortals.framework.common.IBaseEnum;
import com.mortals.framework.common.code.UserType; 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.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
...@@ -29,16 +24,15 @@ import com.mortals.xhx.common.code.AuthType; ...@@ -29,16 +24,15 @@ import com.mortals.xhx.common.code.AuthType;
import com.mortals.xhx.common.code.SourceType; import com.mortals.xhx.common.code.SourceType;
/** /**
* <p>Title: 资源信息</p> * 资源信息
* <p>Description: ResourceController </p> *
* <p>Copyright: Copyright &reg; </p> * @author: zxfei
* <p>Company: </p> * @date: 2022/5/7 15:27
* @author
* @version 1.0.0
*/ */
@Slf4j
@RestController @RestController
@RequestMapping("resource") @RequestMapping("resource")
public class ResourceController extends BaseCRUDJsonMappingController<ResourceService,ResourceForm,ResourceEntity,Long> { public class ResourceController extends BaseCRUDJsonBodyMappingController<ResourceService,ResourceEntity,Long> {
public ResourceController(){ public ResourceController(){
super.setFormClass(ResourceForm.class); super.setFormClass(ResourceForm.class);
...@@ -46,8 +40,7 @@ public class ResourceController extends BaseCRUDJsonMappingController<ResourceSe ...@@ -46,8 +40,7 @@ public class ResourceController extends BaseCRUDJsonMappingController<ResourceSe
} }
@Override @Override
protected void init(HttpServletRequest request, HttpServletResponse response, ResourceForm form, protected void init(Map<String, Object> model, Context context) {
Map<String, Object> model, Context context) {
Map<String, Object> statsus = new HashMap<String, Object>(); Map<String, Object> statsus = new HashMap<String, Object>();
statsus.put("authType", AuthType.getEnumMap()); statsus.put("authType", AuthType.getEnumMap());
statsus.put("sourceType", SourceType.getEnumMap()); statsus.put("sourceType", SourceType.getEnumMap());
...@@ -57,7 +50,6 @@ public class ResourceController extends BaseCRUDJsonMappingController<ResourceSe ...@@ -57,7 +50,6 @@ public class ResourceController extends BaseCRUDJsonMappingController<ResourceSe
statsus.put("userType", UserType.findByValue(getCurUser().getUserType())); statsus.put("userType", UserType.findByValue(getCurUser().getUserType()));
} }
model.put(KEY_RESULT_DICT, statsus); model.put(KEY_RESULT_DICT, statsus);
super.init(request, response, form, model, context);
} }
/** /**
......
...@@ -23,6 +23,10 @@ import com.mortals.framework.model.BaseEntityLong; ...@@ -23,6 +23,10 @@ import com.mortals.framework.model.BaseEntityLong;
public class RoleEntity extends BaseEntityLong{ public class RoleEntity extends BaseEntityLong{
private static final long serialVersionUID = 1547777703344L; private static final long serialVersionUID = 1547777703344L;
/** 用户ID */
private Long userId;
/** 角色名称 */ /** 角色名称 */
private String name; private String name;
......
...@@ -8,13 +8,20 @@ ...@@ -8,13 +8,20 @@
package com.mortals.xhx.base.system.role.service.impl; 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.framework.service.impl.AbstractCRUDServiceImpl;
import com.mortals.xhx.base.system.role.dao.RoleDao; 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.RoleService;
import com.mortals.xhx.base.system.role.service.RoleUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.Arrays;
/** /**
* <p>Title: 角色信息</p> * <p>Title: 角色信息</p>
* <p>Description: RoleServiceImpl service接口 </p> * <p>Description: RoleServiceImpl service接口 </p>
...@@ -26,6 +33,28 @@ import org.springframework.stereotype.Service; ...@@ -26,6 +33,28 @@ import org.springframework.stereotype.Service;
@Service("roleService") @Service("roleService")
public class RoleServiceImpl extends AbstractCRUDServiceImpl<RoleDao,RoleEntity,Long> implements 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; ...@@ -32,6 +32,7 @@ import java.util.Map;
@Service("roleUserService") @Service("roleUserService")
public class RoleUserServiceImpl extends AbstractCRUDServiceImpl<RoleUserDao,RoleUserEntity,Long> implements RoleUserService { public class RoleUserServiceImpl extends AbstractCRUDServiceImpl<RoleUserDao,RoleUserEntity,Long> implements RoleUserService {
@Override @Override
public void doDistributionUser(RoleUserQuery query) { public void doDistributionUser(RoleUserQuery query) {
Long roleId = query.getRoleId(); Long roleId = query.getRoleId();
...@@ -69,4 +70,6 @@ public class RoleUserServiceImpl extends AbstractCRUDServiceImpl<RoleUserDao,Rol ...@@ -69,4 +70,6 @@ public class RoleUserServiceImpl extends AbstractCRUDServiceImpl<RoleUserDao,Rol
this.dao.insertBatch(list); 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; package com.mortals.xhx.base.system.role.web;
import com.alibaba.fastjson.JSONObject; 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.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
...@@ -21,18 +18,17 @@ import javax.servlet.http.HttpServletRequest; ...@@ -21,18 +18,17 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
/** /**
* <p>Title: 角色资源权限</p> * 角色资源权限
* <p>Description: RoleAuthController </p> *
* <p>Copyright: Copyright &reg; </p> * @author: zxfei
* <p>Company: </p> * @date: 2022/5/7 15:19
* @author
* @version 1.0.0
*/ */
@Slf4j
@RestController @RestController
@RequestMapping("role/auth") @RequestMapping("role/auth")
public class RoleAuthController extends BaseCRUDJsonMappingController<RoleAuthService,RoleAuthForm,RoleAuthEntity,Long> { public class RoleAuthController extends BaseCRUDJsonBodyMappingController<RoleAuthService, RoleAuthEntity, Long> {
public RoleAuthController(){ public RoleAuthController() {
super.setFormClass(RoleAuthForm.class); super.setFormClass(RoleAuthForm.class);
super.setModuleDesc("角色资源权限"); super.setModuleDesc("角色资源权限");
} }
...@@ -41,9 +37,9 @@ public class RoleAuthController extends BaseCRUDJsonMappingController<RoleAuthSe ...@@ -41,9 +37,9 @@ public class RoleAuthController extends BaseCRUDJsonMappingController<RoleAuthSe
* 分配资源 * 分配资源
*/ */
@PostMapping(value = "distributionSource") @PostMapping(value = "distributionSource")
public String distributionUser(HttpServletRequest request, HttpServletResponse response, RoleAuthForm form) { public String distributionUser(@RequestBody RoleAuthQuery query) {
try { try {
service.doDistributionSource(form.getQuery()); service.doDistributionSource(query);
JSONObject ret = new JSONObject(); JSONObject ret = new JSONObject();
ret.put(KEY_RESULT_CODE, VALUE_RESULT_SUCCESS); ret.put(KEY_RESULT_CODE, VALUE_RESULT_SUCCESS);
return ret.toJSONString(); return ret.toJSONString();
......
/**
* 文件:RoleController.java
* 版本:1.0.0
* 日期:
* Copyright &reg;
* All right reserved.
*/
package com.mortals.xhx.base.system.role.web; package com.mortals.xhx.base.system.role.web;
...@@ -14,11 +7,10 @@ import com.mortals.framework.common.code.UserType; ...@@ -14,11 +7,10 @@ import com.mortals.framework.common.code.UserType;
import com.mortals.framework.model.Context; import com.mortals.framework.model.Context;
import com.mortals.framework.web.BaseCRUDJsonBodyMappingController; 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.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.*;
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; import com.mortals.framework.web.BaseCRUDJsonMappingController;
import com.mortals.xhx.base.system.role.model.RoleEntity; import com.mortals.xhx.base.system.role.model.RoleEntity;
import com.mortals.xhx.base.system.role.model.RoleUserEntity; import com.mortals.xhx.base.system.role.model.RoleUserEntity;
...@@ -34,12 +26,10 @@ import java.util.List; ...@@ -34,12 +26,10 @@ import java.util.List;
import java.util.Map; import java.util.Map;
/** /**
* <p>Title: 角色信息</p> * 角色信息
* <p>Description: RoleController </p> *
* <p>Copyright: Copyright &reg; </p> * @author: zxfei
* <p>Company: </p> * @date: 2022/5/7 15:15
* @author
* @version 1.0.0
*/ */
@RestController @RestController
@RequestMapping("role") @RequestMapping("role")
...@@ -55,17 +45,24 @@ public class RoleController extends BaseCRUDJsonBodyMappingController<RoleServic ...@@ -55,17 +45,24 @@ public class RoleController extends BaseCRUDJsonBodyMappingController<RoleServic
@Override @Override
protected void init(Map<String, Object> model, Context context) { protected void init(Map<String, Object> model, Context context) {
this.addDict(model,"userType", IBaseEnum.getEnumMap(UserType.class)); Map<String, Object> status = new HashMap<>();
this.addDict(model,"roleType", RoleType.getEnumMap()); status.put("userType", IBaseEnum.getEnumMap(UserType.class));
super.init(model, context); status.put("roleType", RoleType.getEnumMap());
model.put(KEY_RESULT_DICT, status);
} }
/**
* 根据用户id获取角色名称
* @param userId
* @return
*/
@PostMapping("roleNameByUserId") @PostMapping("roleNameByUserId")
public String getRoleNameByUserId(@RequestBody RoleUserEntity query) { public String getRoleNameByUserId(@RequestParam(value = "userId") Long userId) {
try{ try{
JSONObject ret = new JSONObject(); JSONObject ret = new JSONObject();
RoleUserEntity roleUserEntity = new RoleUserEntity(); RoleUserEntity roleUserEntity = new RoleUserEntity();
roleUserEntity.setUserId(query.getUserId()); roleUserEntity.setUserId(userId);
List<RoleUserEntity> find = roleUserService.find(roleUserEntity, new Context()); List<RoleUserEntity> find = roleUserService.find(roleUserEntity, new Context());
List<RoleEntity> model = new ArrayList<>(); List<RoleEntity> model = new ArrayList<>();
if(find.size() > 0){ if(find.size() > 0){
......
/**
* 文件:RoleUserController.java
* 版本:1.0.0
* 日期:
* Copyright &reg;
* All right reserved.
*/
package com.mortals.xhx.base.system.role.web; package com.mortals.xhx.base.system.role.web;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
...@@ -15,9 +8,12 @@ import com.mortals.framework.exception.AppException; ...@@ -15,9 +8,12 @@ import com.mortals.framework.exception.AppException;
import com.mortals.framework.model.BaseEntityLong; import com.mortals.framework.model.BaseEntityLong;
import com.mortals.framework.model.Context; 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.apache.commons.beanutils.MethodUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping; 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.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import com.mortals.framework.web.BaseCRUDJsonMappingController; import com.mortals.framework.web.BaseCRUDJsonMappingController;
...@@ -38,29 +34,50 @@ import java.util.Set; ...@@ -38,29 +34,50 @@ import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
* <p>Title: 角色用户</p> * 角色用户
* <p>Description: RoleUserController </p> *
* <p>Copyright: Copyright &reg; </p> * @author: zxfei
* <p>Company: </p> * @date: 2022/5/7 15:15
* @author
* @version 1.0.0
*/ */
@RestController @RestController
@RequestMapping("role/user") @RequestMapping("role/user")
public class RoleUserController extends BaseCRUDJsonMappingController<RoleUserService,RoleUserForm,RoleUserEntity,Long> { public class RoleUserController extends BaseCRUDJsonBodyMappingController<RoleUserService, RoleUserEntity, Long> {
@Autowired @Autowired
private RoleService roleService; private RoleService roleService;
@Autowired @Autowired
private UserService userService; private UserService userService;
public RoleUserController(){ public RoleUserController() {
super.setFormClass(RoleUserForm.class); super.setFormClass(RoleUserForm.class);
super.setModuleDesc("角色用户"); 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和名称 * 获取查询对象,限制查询返回的结果只包含ID和名称
*
* @param IdList * @param IdList
* @return * @return
*/ */
...@@ -79,36 +96,13 @@ public class RoleUserController extends BaseCRUDJsonMappingController<RoleUserSe ...@@ -79,36 +96,13 @@ 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") @PostMapping(value = "distributionUser")
public String distributionUser(HttpServletRequest request, HttpServletResponse response, RoleUserForm form) { public String distributionUser(@RequestBody RoleUserQuery query) {
try { try {
service.doDistributionUser(form.getQuery()); service.doDistributionUser(query);
JSONObject ret = new JSONObject(); JSONObject ret = new JSONObject();
ret.put(KEY_RESULT_CODE, VALUE_RESULT_SUCCESS); ret.put(KEY_RESULT_CODE, VALUE_RESULT_SUCCESS);
return ret.toJSONString(); return ret.toJSONString();
...@@ -125,9 +119,9 @@ public class RoleUserController extends BaseCRUDJsonMappingController<RoleUserSe ...@@ -125,9 +119,9 @@ public class RoleUserController extends BaseCRUDJsonMappingController<RoleUserSe
* 分配角色 * 分配角色
*/ */
@PostMapping(value = "distributionRole") @PostMapping(value = "distributionRole")
public String distributionRole(HttpServletRequest request, HttpServletResponse response, RoleUserForm form) { public String distributionRole(@RequestBody RoleUserQuery query) {
try { try {
service.doDistributionRole(form.getQuery()); service.doDistributionRole(query);
JSONObject ret = new JSONObject(); JSONObject ret = new JSONObject();
ret.put(KEY_RESULT_CODE, VALUE_RESULT_SUCCESS); ret.put(KEY_RESULT_CODE, VALUE_RESULT_SUCCESS);
return ret.toJSONString(); return ret.toJSONString();
......
...@@ -62,7 +62,7 @@ public class TaskServiceImpl extends AbstractCRUDServiceImpl<TaskDao, TaskEntity ...@@ -62,7 +62,7 @@ public class TaskServiceImpl extends AbstractCRUDServiceImpl<TaskDao, TaskEntity
private Thread thread = null; private Thread thread = null;
/** 日志打印时间,key:任务ID,value:最后一次打印日志时间 */ /** 日志打印时间,key:任务ID,value:最后一次打印日志时间 */
private Map<Long, Long> printLogTime = new HashMap<Long, Long>(); private Map<Long, Long> printLogTime = new HashMap<>();
@Autowired(required=false) @Autowired(required=false)
private TaskService taskService; private TaskService taskService;
...@@ -297,7 +297,7 @@ public class TaskServiceImpl extends AbstractCRUDServiceImpl<TaskDao, TaskEntity ...@@ -297,7 +297,7 @@ public class TaskServiceImpl extends AbstractCRUDServiceImpl<TaskDao, TaskEntity
executorService.shutdown(); executorService.shutdown();
log.info("任务执行线程退出!"); log.info("任务执行线程退出!");
}); });
// thread.start(); thread.start();
} }
@Override @Override
......
/**
* 文件:TaskController.java
* 版本:1.0.0
* 日期:
* Copyright &reg;
* All right reserved.
*/
package com.mortals.xhx.base.system.task.web; package com.mortals.xhx.base.system.task.web;
...@@ -14,6 +7,8 @@ import java.util.Map; ...@@ -14,6 +7,8 @@ import java.util.Map;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; 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.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
...@@ -32,16 +27,14 @@ import com.mortals.xhx.common.code.TaskExcuteStrategyEnum; ...@@ -32,16 +27,14 @@ import com.mortals.xhx.common.code.TaskExcuteStrategyEnum;
import com.mortals.xhx.common.code.TaskInterimExcuteStatusEnum; import com.mortals.xhx.common.code.TaskInterimExcuteStatusEnum;
/** /**
* <p>Title: 任务信息</p> * 任务信息
* <p>Description: TaskController </p> *
* <p>Copyright: Copyright &reg; </p> * @author: zxfei
* <p>Company: </p> * @date: 2022/5/7 15:39
* @author
* @version 1.0.0
*/ */
@RestController @RestController
@RequestMapping("task") @RequestMapping("task")
public class TaskController extends BaseCRUDJsonMappingController<TaskService, TaskForm, TaskEntity, Long> { public class TaskController extends BaseCRUDJsonBodyMappingController<TaskService, TaskEntity, Long> {
public TaskController() { public TaskController() {
super.setFormClass(TaskForm.class); super.setFormClass(TaskForm.class);
...@@ -50,8 +43,7 @@ public class TaskController extends BaseCRUDJsonMappingController<TaskService, T ...@@ -50,8 +43,7 @@ public class TaskController extends BaseCRUDJsonMappingController<TaskService, T
@Override @Override
protected void init(HttpServletRequest request, HttpServletResponse response, TaskForm form, protected void init(Map<String, Object> model, Context context) {
Map<String, Object> model, Context context) {
Map<String, Object> status = new HashMap<String, Object>(); Map<String, Object> status = new HashMap<String, Object>();
status.put("status", TaskExcuteStatusEnum.getEnumMap()); status.put("status", TaskExcuteStatusEnum.getEnumMap());
status.put("excuteStrategy", TaskExcuteStrategyEnum.getEnumMap()); status.put("excuteStrategy", TaskExcuteStrategyEnum.getEnumMap());
...@@ -71,60 +63,30 @@ public class TaskController extends BaseCRUDJsonMappingController<TaskService, T ...@@ -71,60 +63,30 @@ public class TaskController extends BaseCRUDJsonMappingController<TaskService, T
} }
model.put("excuteService", serviceList); model.put("excuteService", serviceList);
model.put(KEY_RESULT_DICT, status); 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") @RequestMapping(value = "change/status")
public String changeStatus(HttpServletRequest request, HttpServletResponse response, TaskForm form) { public String changeStatus(TaskQuery query) {
JSONObject ret = new JSONObject(); JSONObject ret = new JSONObject();
Context context = getContext(); Context context = getContext();
try { 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); // context);
if (null == entity) { if (null == entity) {
throw new AppException("任务不存在!"); throw new AppException("任务不存在!");
} }
if (null == form.getEntity().getStatus()) { if (null == query.getStatus()) {
throw new AppException("任务状态不能为空!"); throw new AppException("任务状态不能为空!");
} }
if (form.getEntity().getStatus() != DataSatusEnum.ENABLE.getValue() if (query.getStatus() != DataSatusEnum.ENABLE.getValue()
&& form.getEntity().getStatus() != DataSatusEnum.DISENABLE.getValue()) { && query.getStatus() != DataSatusEnum.DISENABLE.getValue()) {
throw new AppException("非法任务状态!"); throw new AppException("非法任务状态!");
} }
String busiDesc = DataSatusEnum.getByValue(form.getEntity().getStatus()).getDesc(); String busiDesc = DataSatusEnum.getByValue(query.getStatus()).getDesc();
entity.setStatus(form.getEntity().getStatus()); entity.setStatus(query.getStatus());
this.service.update(entity, context); this.service.update(entity, context);
ret.put(KEY_RESULT_CODE, VALUE_RESULT_SUCCESS); ret.put(KEY_RESULT_CODE, VALUE_RESULT_SUCCESS);
ret.put(KEY_RESULT_MSG, busiDesc + "成功"); ret.put(KEY_RESULT_MSG, busiDesc + "成功");
......
...@@ -52,4 +52,6 @@ public interface UploadService extends IService { ...@@ -52,4 +52,6 @@ public interface UploadService extends IService {
void uploadDownload(String fileName, HttpServletResponse response); 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; package com.mortals.xhx.base.system.upload.service.impl;
import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.IdUtil;
import com.mortals.framework.exception.AppException; import com.mortals.framework.exception.AppException;
import com.mortals.framework.service.IUser; import com.mortals.framework.service.IUser;
import com.mortals.framework.util.StringUtils; import com.mortals.framework.util.StringUtils;
...@@ -15,9 +16,7 @@ import org.springframework.http.MediaType; ...@@ -15,9 +16,7 @@ import org.springframework.http.MediaType;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.awt.image.BufferedImage;
import java.io.File; import java.io.File;
import java.io.UnsupportedEncodingException; import java.io.UnsupportedEncodingException;
import java.net.URLEncoder; import java.net.URLEncoder;
...@@ -49,9 +48,7 @@ public class UploadServiceImpl implements UploadService { ...@@ -49,9 +48,7 @@ public class UploadServiceImpl implements UploadService {
if (tempFile == null || tempFile.getSize() == 0) { if (tempFile == null || tempFile.getSize() == 0) {
throw new AppException("没有要上传的文件!"); throw new AppException("没有要上传的文件!");
} }
if(StringUtils.isEmpty(prePath)){
prePath = "file/uploadfile";
}
String fileName = tempFile.getOriginalFilename(); String fileName = tempFile.getOriginalFilename();
String extension = FilenameUtils.getExtension(fileName); String extension = FilenameUtils.getExtension(fileName);
UploadFileType type = UploadFileType.getFileType(extension); UploadFileType type = UploadFileType.getFileType(extension);
...@@ -69,14 +66,12 @@ public class UploadServiceImpl implements UploadService { ...@@ -69,14 +66,12 @@ public class UploadServiceImpl implements UploadService {
if (!pathDir.exists()) { if (!pathDir.exists()) {
pathDir.mkdirs(); pathDir.mkdirs();
} }
String newName = new Date().getTime() + "." + extension; String newName = new Date().getTime() + "." + extension;
//String newName = IdUtil.fastSimpleUUID() + "." + extension;
String filePathAll = filePath + newName; String filePathAll = filePath + newName;
File uploadFile = new File(filePathAll); File uploadFile = new File(filePathAll);
try { try {
log.info("文件正在储存"); log.info("文件正在储存,filepath:"+filePathAll);
tempFile.transferTo(uploadFile); tempFile.transferTo(uploadFile);
} catch (Exception e) { } catch (Exception e) {
throw new AppException(e.getMessage()); throw new AppException(e.getMessage());
...@@ -94,7 +89,7 @@ public class UploadServiceImpl implements UploadService { ...@@ -94,7 +89,7 @@ public class UploadServiceImpl implements UploadService {
@Override @Override
public void fileDownload(String fileName, Boolean delete, HttpServletResponse response) { public void fileDownload(String fileName, Boolean delete, HttpServletResponse response) {
String realFileName = System.currentTimeMillis() + fileName.substring(fileName.indexOf("_") + 1); String realFileName = System.currentTimeMillis() + fileName.substring(fileName.indexOf("_") + 1);
String filePath = getFilePath(fileName); String filePath = this.filePath + fileName;
try { try {
response.setContentType(MediaType.IMAGE_JPEG_VALUE); response.setContentType(MediaType.IMAGE_JPEG_VALUE);
setAttachmentResponseHeader(response, realFileName); setAttachmentResponseHeader(response, realFileName);
...@@ -107,28 +102,14 @@ public class UploadServiceImpl implements UploadService { ...@@ -107,28 +102,14 @@ public class UploadServiceImpl implements UploadService {
@Override @Override
public void preview(String fileName, HttpServletResponse response) { public void preview(String fileName, HttpServletResponse response) {
// String filePath = this.filePath+"/preview/" + fileName; String filePath = this.filePath+"/file/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);
try { try {
File file = new File(filePath); response.setContentType(MediaType.IMAGE_JPEG_VALUE);
BufferedImage image = ImageIO.read(file); setAttachmentResponseHeader(response, fileName);
response.setHeader("Pragma", "No-cache"); FileUtil.writeToStream(filePath, response.getOutputStream());
response.setHeader("Cache-Control", "No-cache"); } catch (Exception e) {
response.setDateHeader("Expires", 0L); log.error("下载文件失败", e);
response.setContentType("image/jpeg");
ImageIO.write(image, "JPEG", response.getOutputStream());
} catch (Exception var4) {
this.log.debug("响应图片消息异常-->" + var4.getMessage());
} }
} }
...@@ -179,4 +160,14 @@ public class UploadServiceImpl implements UploadService { ...@@ -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; ...@@ -2,6 +2,7 @@ package com.mortals.xhx.base.system.upload.web;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.mortals.framework.annotation.UnAuth;
import com.mortals.framework.exception.AppException; import com.mortals.framework.exception.AppException;
import com.mortals.framework.web.BaseController; import com.mortals.framework.web.BaseController;
import com.mortals.xhx.base.system.upload.service.UploadService; import com.mortals.xhx.base.system.upload.service.UploadService;
...@@ -15,13 +16,10 @@ import java.util.HashMap; ...@@ -15,13 +16,10 @@ import java.util.HashMap;
import java.util.Map; import java.util.Map;
/** /**
* <p>Title: 上传文件</p> * 上传文件
* <p>Description: UploadfileController </p>
* <p>Copyright: Copyright &reg; </p>
* <p>Company: </p>
* *
* @author * @author: zxfei
* @version 1.0.0 * @date: 2021/11/30 10:06
*/ */
@RestController @RestController
@RequestMapping("file") @RequestMapping("file")
...@@ -31,7 +29,8 @@ public class UploadController extends BaseController { ...@@ -31,7 +29,8 @@ public class UploadController extends BaseController {
private UploadService uploadService; private UploadService uploadService;
@RequestMapping(value = "upload") @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<>(); Map<String, Object> model = new HashMap<>();
String jsonStr = ""; String jsonStr = "";
try { try {
...@@ -55,7 +54,8 @@ public class UploadController extends BaseController { ...@@ -55,7 +54,8 @@ public class UploadController extends BaseController {
@RequestMapping(value = "commonupload") @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<>(); Map<String, Object> model = new HashMap<>();
String jsonStr = ""; String jsonStr = "";
try { try {
...@@ -94,20 +94,6 @@ public class UploadController extends BaseController { ...@@ -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) * 图片预览 (PathVariable)
* *
......
package com.mortals.xhx.base.system.user.model; package com.mortals.xhx.base.system.user.model;
import com.alibaba.fastjson.annotation.JSONField;
import com.mortals.framework.model.BaseEntityLong; import com.mortals.framework.model.BaseEntityLong;
import lombok.Data; import lombok.Data;
import java.util.List; import java.util.List;
/** /**
* * Description:User
* Description:User * date: 2021-9-26 16:11:48
* date: 2021-9-26 16:11:48 */
*/
@Data @Data
public class UserEntityExt extends BaseEntityLong { public class UserEntityExt extends BaseEntityLong {
/**
* 站点名称
*/
private String siteName;
private String roleIds;
/** /**
* 唯一标识 * 唯一标识
*/ */
@JSONField(serialize = false)
private String token; private String token;
/**
* 菜单栏
*/
private String menuUrl;
/** /**
* 登录时间 * 登录时间
...@@ -29,11 +36,7 @@ public class UserEntityExt extends BaseEntityLong { ...@@ -29,11 +36,7 @@ public class UserEntityExt extends BaseEntityLong {
*/ */
private Long expireTime; private Long expireTime;
private String siteName;
private List<Long> roleIds;
private String siteCode;
private String oldPassword;
private String newPassword;
private String siteIds;
} }
\ 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; ...@@ -13,6 +13,7 @@ import com.mortals.framework.model.Result;
import com.mortals.framework.service.ICRUDService; import com.mortals.framework.service.ICRUDService;
import com.mortals.framework.service.IUser; import com.mortals.framework.service.IUser;
import com.mortals.xhx.base.system.menu.model.MenuEntity; 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 com.mortals.xhx.base.system.user.model.UserEntity;
import java.util.List; import java.util.List;
...@@ -37,7 +38,7 @@ public interface UserService extends ICRUDService<UserEntity,Long> { ...@@ -37,7 +38,7 @@ public interface UserService extends ICRUDService<UserEntity,Long> {
* @return * @return
* @throws AppException * @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> { ...@@ -47,7 +48,7 @@ public interface UserService extends ICRUDService<UserEntity,Long> {
* @return * @return
* @throws AppException * @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> { ...@@ -56,7 +57,7 @@ public interface UserService extends ICRUDService<UserEntity,Long> {
* @param userId 密码 * @param userId 密码
* @return * @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> { ...@@ -64,7 +65,7 @@ public interface UserService extends ICRUDService<UserEntity,Long> {
* @param user * @param user
* @return * @return
*/ */
public List<MenuEntity> findOutlookBarList(IUser user); List<MenuEntity> findOutlookBarList(IUser user);
/** /**
* 查询用户所有有权限的菜单ID * 查询用户所有有权限的菜单ID
...@@ -72,7 +73,7 @@ public interface UserService extends ICRUDService<UserEntity,Long> { ...@@ -72,7 +73,7 @@ public interface UserService extends ICRUDService<UserEntity,Long> {
* @param userEntity * @param userEntity
* @return * @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> { ...@@ -84,7 +85,7 @@ public interface UserService extends ICRUDService<UserEntity,Long> {
* @return * @return
* @throws AppException * @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> { ...@@ -99,7 +100,7 @@ public interface UserService extends ICRUDService<UserEntity,Long> {
* @return * @return
* @throws AppException * @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; String userName, String mobile) throws AppException;
/** /**
...@@ -111,5 +112,10 @@ public interface UserService extends ICRUDService<UserEntity,Long> { ...@@ -111,5 +112,10 @@ public interface UserService extends ICRUDService<UserEntity,Long> {
* @return * @return
* @throws AppException * @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
/**
* 文件:UserController.java
* 版本:1.0.0
* 日期:
* Copyright &reg;
* All right reserved.
*/
package com.mortals.xhx.base.system.user.web; package com.mortals.xhx.base.system.user.web;
import java.util.HashMap; import com.alibaba.fastjson.JSONObject;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.mortals.framework.service.IUser;
import com.mortals.framework.web.BaseCRUDJsonBodyMappingController;
import com.mortals.xhx.base.system.role.model.RoleEntity;
import com.mortals.xhx.base.system.role.service.RoleService;
import com.mortals.xhx.common.code.UserStatus;
import com.mortals.framework.common.IBaseEnum; import com.mortals.framework.common.IBaseEnum;
import com.mortals.framework.common.code.UserType; import com.mortals.framework.common.code.UserType;
import com.mortals.xhx.common.key.Constant;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import com.alibaba.fastjson.JSONObject;
import com.mortals.framework.exception.AppException; import com.mortals.framework.exception.AppException;
import com.mortals.framework.model.Context; import com.mortals.framework.model.Context;
import com.mortals.framework.web.BaseCRUDJsonBodyMappingController;
import com.mortals.framework.web.BaseCRUDJsonMappingController; import com.mortals.framework.web.BaseCRUDJsonMappingController;
import com.mortals.xhx.base.framework.annotation.Operlog; import com.mortals.xhx.base.framework.annotation.Operlog;
import com.mortals.xhx.base.system.role.model.RoleQuery;
import com.mortals.xhx.base.system.role.model.RoleUserEntity;
import com.mortals.xhx.base.system.role.model.RoleUserQuery;
import com.mortals.xhx.base.system.role.service.RoleService;
import com.mortals.xhx.base.system.role.service.RoleUserService;
import com.mortals.xhx.base.system.user.model.UserEntity; import com.mortals.xhx.base.system.user.model.UserEntity;
import com.mortals.xhx.base.system.user.service.UserService; import com.mortals.xhx.base.system.user.service.UserService;
import com.mortals.xhx.common.code.UserStatus;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;
/** /**
* <p>Title: 用户信息</p> * 用户信息
* <p>Description: UserController </p> *
* <p>Copyright: Copyright &reg; </p> * @author: zxfei
* <p>Company: </p> * @date: 2022/5/7 15:42
* @author
* @version 1.0.0
*/ */
@RestController @RestController
@RequestMapping("user") @RequestMapping("user")
public class UserController extends BaseCRUDJsonBodyMappingController<UserService, UserEntity, Long> { public class UserController extends BaseCRUDJsonBodyMappingController<UserService, UserEntity, Long> {
@Autowired
private UserService userService;
@Autowired @Autowired
private RoleService roleService; private RoleService roleService;
@Autowired
private RoleUserService roleUserService;
public UserController() { public UserController() {
super.setFormClass(UserForm.class); super.setFormClass(UserForm.class);
...@@ -60,33 +56,57 @@ public class UserController extends BaseCRUDJsonBodyMappingController<UserServic ...@@ -60,33 +56,57 @@ public class UserController extends BaseCRUDJsonBodyMappingController<UserServic
@Override @Override
protected void init(Map<String, Object> model, Context context) { protected void init(Map<String, Object> model, Context context) {
this.addDict(model,"userType", IBaseEnum.getEnumMap(UserType.class)); this.addDict(model,"userType", IBaseEnum.getEnumMap(UserType.class));
this.addDict(model,"status", UserStatus.getEnumMap()); this.addDict(model,"status", UserStatus.getEnumMap());
List<RoleEntity> roleList = roleService.find(new RoleEntity()); this.addDict(model, "roleIds", roleService.find(new RoleQuery()).stream().collect(Collectors.toMap(x -> x.getId().toString(), y -> y.getName())));
this.addDict(model,"roleId", roleList.stream().collect(Collectors.toMap(e->e.getId().toString(), e->e.getName())));
super.init(model, context);
} }
@Override @Override
protected int editAfter(Long id, Map<String, Object> model, UserEntity entity, Context context) throws AppException { protected void doListBefore(UserEntity query, Map<String, Object> model, Context context) throws AppException {
entity.setLoginPwd(null); if (!StringUtils.isEmpty(query.getRealName())) {
entity.setLoginPwd1(null); query.setRealName("%".concat(query.getRealName()).concat("%"));
entity.setLoginPwd2(null); }
entity.setLoginPwd3(null); if (!StringUtils.isEmpty(query.getLoginName())) {
return 1; query.setLoginName("%".concat(query.getLoginName()).concat("%"));
}
} }
@RequestMapping(value = "change/password", method = RequestMethod.POST)
public String changePassword(@RequestBody UserEntity entity) {
IUser user = this.getCurUser(); @Override
if(user == null){ protected int editAfter(Long id, Map<String, Object> model, UserEntity entity, Context context) throws AppException {
return this.createFailJsonResp("请先登录"); RoleUserQuery roleUserQuery = new RoleUserQuery();
roleUserQuery.setUserId(entity.getId());
String roleIds = roleUserService.find(roleUserQuery).stream().map(RoleUserEntity::getRoleId).map(String::valueOf).collect(Collectors.joining(","));
entity.setRoleIds(roleIds);
return super.editAfter(id, model, entity, context);
}
@Override
protected int saveAfter(UserEntity entity, Map<String, Object> model, Context context) throws AppException {
if (entity.getId() == getCurUser().getId()) {
// TODO: 2022/8/15 更新redis session信息
//saveCurrUserForSession(request, response, userService.get(form.getEntity().getId(), false));
}
return super.saveAfter(entity, model, context);
} }
// @Override
// protected void saveBefore(UserEntity entity, Map<String, Object> model, Context context) throws AppException {
// if (!ObjectUtils.isEmpty(entity.getLoginName()) && service.existUser(entity.getLoginName(), entity.getId())) {
// throw new AppException("登录名已存在!");
// }
// super.saveBefore(entity, model, context);
// }
@RequestMapping(value = "change/password", method = RequestMethod.POST)
@Operlog(msg = "密码修改成功!")
public String changePassword(@RequestParam String oldPwd, @RequestParam String newPwd) {
JSONObject ret = new JSONObject(); JSONObject ret = new JSONObject();
try { try {
service.updateUserPwd(super.getCurUser().getLoginName(), entity.getOldPassword(), entity.getNewPassword()); service.updateUserPwd(super.getCurUser().getLoginName(), oldPwd, newPwd);
ret.put(KEY_RESULT_CODE, VALUE_RESULT_SUCCESS); ret.put(KEY_RESULT_CODE, VALUE_RESULT_SUCCESS);
ret.put(KEY_RESULT_MSG, "密码修改成功!"); ret.put(KEY_RESULT_MSG, "密码修改成功!");
} catch (Exception e) { } catch (Exception e) {
...@@ -95,4 +115,22 @@ public class UserController extends BaseCRUDJsonBodyMappingController<UserServic ...@@ -95,4 +115,22 @@ public class UserController extends BaseCRUDJsonBodyMappingController<UserServic
} }
return ret.toJSONString(); return ret.toJSONString();
} }
public static void main(String[] args) {
String token = "eyJhbGciOiJIUzI1NiJ9.eyJsb2dpbl91c2VyX2tleSI6IjIzNGE5NDA5ZDVhOTQ3MWNhMzdkYjZkYmMwY2JjZTc5In0.MWyQW40HYDxyUz7PJRf_nRsFPWx3Hr811Ime984nixs";
String secret = "026db82420614469897fcc2dc1b4ce38";
Claims claims = Jwts.parser()
.setSigningKey(Base64.getEncoder().encodeToString(secret.getBytes()))
.parseClaimsJws(token)
.getBody();
String uuid = (String) claims.get("login_user_key");
System.out.println(uuid);
}
} }
\ No newline at end of file
/**
* 文件:ValidCodeController.java
* 版本:1.0.0
* 日期:
* Copyright &reg;
* All right reserved.
*/
package com.mortals.xhx.base.system.valid.web; package com.mortals.xhx.base.system.valid.web;
import com.alibaba.fastjson.JSONObject;
import com.mortals.framework.model.Context; import com.mortals.framework.model.Context;
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 com.mortals.framework.web.BaseCRUDJsonMappingController;
import com.mortals.xhx.base.system.valid.model.ValidCodeEntity; 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.service.ValidCodeService;
import com.mortals.xhx.common.code.ValidCodeType; import com.mortals.xhx.common.code.ValidCodeType;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
......
package com.mortals.xhx.common.code;
/**
* @author karlhoo
*/
public enum ApiRespCodeEnum {
/** 接收成功 */
SUCCESS(1, "接收成功"),
/** 执行失败 */
FAILED(2,"执行失败"),
;
private final Integer value;
private final String label;
ApiRespCodeEnum(Integer value, String label) {
this.value = value;
this.label = label;
}
public int getValue() {
return this.value;
}
public String getLabel() {
return this.label;
}
}
...@@ -18,7 +18,7 @@ public enum ComponentEnum { ...@@ -18,7 +18,7 @@ public enum ComponentEnum {
DATE("date", "日期选择栏"), DATE("date", "日期选择栏"),
AREA("area", "区域选择栏"), AREA("area", "区域选择栏"),
IMAGE("@image", "图片选择"), IMAGE("@image", "图片选择"),
DYNAMIC_TABLE("dt", "动态表格"); DYNAMIC_TABLE("dt", "动态表格"),;
private String value; private String value;
private String desc; 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