From 7011194adceac20a7fb4859d02126a2ceb67992a Mon Sep 17 00:00:00 2001
From: chenzhihang <709011834@qq.com>
Date: Thu, 29 Aug 2024 14:02:18 +0800
Subject: [PATCH 01/12] =?UTF-8?q?1=E3=80=81=E6=B7=BB=E5=8A=A0GPU=E5=8D=A0?=
=?UTF-8?q?=E7=94=A8=E6=83=85=E5=86=B5=E8=AE=BE=E7=BD=AE?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../com/ruoyi/platform/constant/Constant.java | 3 +++
.../platform/domain/ComputingResource.java | 19 +++++++++++++++++++
.../platform/mapper/ComputingResourceDao.java | 2 ++
.../service/impl/JupyterServiceImpl.java | 8 ++++++++
.../ruoyi/platform/utils/K8sClientUtil.java | 15 +++++++++++++--
.../ComputingResourceDaoMapper.xml | 4 ++++
6 files changed, 49 insertions(+), 2 deletions(-)
diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/constant/Constant.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/constant/Constant.java
index 9d2fe7f..b74c30e 100644
--- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/constant/Constant.java
+++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/constant/Constant.java
@@ -7,4 +7,7 @@ public class Constant {
public final static int State_valid = 1; // 有效
public final static int State_invalid = 0; // 无效
+
+ public final static int Used_State_used = 1; // 已占用
+ public final static int Used_State_unused = 0; // 未占用
}
diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/domain/ComputingResource.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/domain/ComputingResource.java
index 47d7892..d0551fa 100644
--- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/domain/ComputingResource.java
+++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/domain/ComputingResource.java
@@ -46,7 +46,11 @@ private Integer id;
@ApiModelProperty(value = "状态标识", notes = "0表示失效,1表示生效")
private Integer state;
+ @ApiModelProperty(value = "占用情况(1-占用,0-未占用)")
+ private Integer usedState;
+ @ApiModelProperty(value = "节点")
+ private String node;
public Integer getId() {
return id;
@@ -122,5 +126,20 @@ private Integer id;
this.state = state;
}
+ public Integer getUsedState() {
+ return usedState;
+ }
+
+ public void setUsedState(Integer usedState) {
+ this.usedState = usedState;
+ }
+
+ public String getNode() {
+ return node;
+ }
+
+ public void setNode(String node) {
+ this.node = node;
+ }
}
diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/mapper/ComputingResourceDao.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/mapper/ComputingResourceDao.java
index b9a5de6..93cdaaf 100644
--- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/mapper/ComputingResourceDao.java
+++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/mapper/ComputingResourceDao.java
@@ -73,6 +73,8 @@ public interface ComputingResourceDao {
*/
int update(@Param("computingResource") ComputingResource computingResource);
+ int updateUsedStateByNode(@Param("node")String node, @Param("usedState") Integer usedState);
+
/**
* 通过主键删除数据
*
diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/JupyterServiceImpl.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/JupyterServiceImpl.java
index aa59b6a..6e2dc71 100644
--- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/JupyterServiceImpl.java
+++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/JupyterServiceImpl.java
@@ -2,8 +2,10 @@ package com.ruoyi.platform.service.impl;
import com.ruoyi.common.redis.service.RedisService;
import com.ruoyi.common.security.utils.SecurityUtils;
+import com.ruoyi.platform.constant.Constant;
import com.ruoyi.platform.domain.DevEnvironment;
import com.ruoyi.platform.domain.PodStatus;
+import com.ruoyi.platform.mapper.ComputingResourceDao;
import com.ruoyi.platform.mapper.DevEnvironmentDao;
import com.ruoyi.platform.service.DevEnvironmentService;
import com.ruoyi.platform.service.JupyterService;
@@ -54,6 +56,9 @@ public class JupyterServiceImpl implements JupyterService {
@Resource
private DevEnvironmentDao devEnvironmentDao;
+ @Resource
+ private ComputingResourceDao computingResourceDao;
+
@Resource
@Lazy
private DevEnvironmentService devEnvironmentService;
@@ -126,6 +131,9 @@ public class JupyterServiceImpl implements JupyterService {
if(pod == null){
return "pod不存在!";
}
+
+ computingResourceDao.updateUsedStateByNode(pod.getSpec().getNodeName(), Constant.Used_State_unused);
+
// 使用 Kubernetes API 删除 Pod
String deleteResult = k8sClientUtil.deletePod(podName, namespace);
// 删除service
diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/utils/K8sClientUtil.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/utils/K8sClientUtil.java
index 06e4062..d022bf3 100644
--- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/utils/K8sClientUtil.java
+++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/utils/K8sClientUtil.java
@@ -1,6 +1,8 @@
package com.ruoyi.platform.utils;
import com.alibaba.nacos.shaded.com.google.gson.reflect.TypeToken;
+import com.ruoyi.platform.constant.Constant;
+import com.ruoyi.platform.mapper.ComputingResourceDao;
import io.kubernetes.client.Exec;
import io.kubernetes.client.custom.IntOrString;
import io.kubernetes.client.custom.Quantity;
@@ -20,6 +22,7 @@ import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
+import javax.annotation.Resource;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;
@@ -40,6 +43,8 @@ public class K8sClientUtil {
*/
private static ApiClient apiClient;
+ @Resource
+ private ComputingResourceDao computingResourceDao;
/**
* 构建集群POD内通过SA访问的客户端
* loading the in-cluster config, including:
@@ -409,8 +414,6 @@ public class K8sClientUtil {
.namespaces(Collections.singletonList(namespace))
.topologyKey("kubernetes.io/hostname");
-// V1WeightedPodAffinityTerm weightedPodAffinityTerm = new V1WeightedPodAffinityTerm().weight(100).podAffinityTerm(podAffinityTerm);
-
V1PodAntiAffinity podAntiAffinity = new V1PodAntiAffinity()
.requiredDuringSchedulingIgnoredDuringExecution(Collections.singletonList(antiPodAffinityTerm));
@@ -469,6 +472,8 @@ public class K8sClientUtil {
try {
pod = api.createNamespacedPod(namespace, pod, null, null, null);
+ String nodeName = getNodeName(podName, namespace);
+ computingResourceDao.updateUsedStateByNode(nodeName, Constant.Used_State_used);
} catch (ApiException e) {
log.error("创建pod异常:" + e.getResponseBody(), e);
} catch (Exception e) {
@@ -569,6 +574,12 @@ public class K8sClientUtil {
return pod.getStatus().getHostIP();
}
+ public String getNodeName(String podName, String namespace) throws Exception {
+ CoreV1Api api = new CoreV1Api(apiClient);
+ V1Pod pod = api.readNamespacedPod(podName, namespace, null, null, null);
+ return pod.getSpec().getNodeName();
+ }
+
public String getPodLogs(String podName,String namespace,String container,int line) {
CoreV1Api api = new CoreV1Api(apiClient);
try {
diff --git a/ruoyi-modules/management-platform/src/main/resources/mapper/managementPlatform/ComputingResourceDaoMapper.xml b/ruoyi-modules/management-platform/src/main/resources/mapper/managementPlatform/ComputingResourceDaoMapper.xml
index 885da31..162a12f 100644
--- a/ruoyi-modules/management-platform/src/main/resources/mapper/managementPlatform/ComputingResourceDaoMapper.xml
+++ b/ruoyi-modules/management-platform/src/main/resources/mapper/managementPlatform/ComputingResourceDaoMapper.xml
@@ -156,6 +156,10 @@ computing_resource = values(computing_resource)standard = values(standard)descri
where id = #{computingResource.id}
+
+ update computing_resource set used_state = #{usedState} where node = #{node}
+
+
delete from computing_resource where id = #{id}
From d42b8e918d2eb4b0749c4b46acf571f37ba1e355 Mon Sep 17 00:00:00 2001
From: chenzhihang <709011834@qq.com>
Date: Thu, 29 Aug 2024 14:18:13 +0800
Subject: [PATCH 02/12] =?UTF-8?q?1=E3=80=81=E6=B7=BB=E5=8A=A0GPU=E5=8D=A0?=
=?UTF-8?q?=E7=94=A8=E6=83=85=E5=86=B5=E8=AE=BE=E7=BD=AE?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../com/ruoyi/platform/constant/Constant.java | 5 ++
.../service/impl/JupyterServiceImpl.java | 33 ++++---
.../ruoyi/platform/utils/K8sClientUtil.java | 88 +++++++++----------
3 files changed, 65 insertions(+), 61 deletions(-)
diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/constant/Constant.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/constant/Constant.java
index b74c30e..9d14aa3 100644
--- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/constant/Constant.java
+++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/constant/Constant.java
@@ -10,4 +10,9 @@ public class Constant {
public final static int Used_State_used = 1; // 已占用
public final static int Used_State_unused = 0; // 未占用
+
+
+ public final static String Computing_Resource_CPU = "CPU"; // 计算资源_CPU
+
+ public final static String Computing_Resource_GPU = "GPU"; // 计算资源_GPU
}
diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/JupyterServiceImpl.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/JupyterServiceImpl.java
index 6e2dc71..b99bdb2 100644
--- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/JupyterServiceImpl.java
+++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/JupyterServiceImpl.java
@@ -75,7 +75,7 @@ public class JupyterServiceImpl implements JupyterService {
LoginUser loginUser = SecurityUtils.getLoginUser();
String podName = loginUser.getUsername().toLowerCase() + "-editor-pod";
String pvcName = loginUser.getUsername().toLowerCase() + "-editor-pvc";
- V1PersistentVolumeClaim pvc = k8sClientUtil.createPvc(namespace, pvcName, storage,storageClassName);
+ V1PersistentVolumeClaim pvc = k8sClientUtil.createPvc(namespace, pvcName, storage, storageClassName);
Integer podPort = k8sClientUtil.createPod(podName, namespace, port, mountPath, pvc, image);
return masterIp + ":" + podPort;
@@ -84,7 +84,7 @@ public class JupyterServiceImpl implements JupyterService {
@Override
public String runJupyterService(Integer id) throws Exception {
DevEnvironment devEnvironment = this.devEnvironmentDao.queryById(id);
- if(devEnvironment == null){
+ if (devEnvironment == null) {
throw new Exception("开发环境配置不存在");
}
@@ -97,7 +97,7 @@ public class JupyterServiceImpl implements JupyterService {
LoginUser loginUser = SecurityUtils.getLoginUser();
//构造pod名称
- String podName = loginUser.getUsername().toLowerCase() +"-editor-pod" + "-" + id;
+ String podName = loginUser.getUsername().toLowerCase() + "-editor-pod" + "-" + id;
String pvcName = loginUser.getUsername().toLowerCase() + "-editor-pvc";
//新建编辑器的pvc
V1PersistentVolumeClaim pvc = k8sClientUtil.createPvc(namespace, pvcName, storage, storageClassName);
@@ -105,13 +105,13 @@ public class JupyterServiceImpl implements JupyterService {
//TODO 设置镜像可配置,这里先用默认镜像启动pod
// 调用修改后的 createPod 方法,传入额外的参数
- Integer podPort = k8sClientUtil.createConfiguredPod(podName, namespace, port, mountPath, pvc, devEnvironment.getImage(), minioPvcName, datasetPath, modelPath);
+ Integer podPort = k8sClientUtil.createConfiguredPod(podName, namespace, port, mountPath, pvc, devEnvironment.getImage(), devEnvironment.getComputingResource(), minioPvcName, datasetPath, modelPath);
String url = masterIp + ":" + podPort;
- redisService.setCacheObject(podName,masterIp + ":" + podPort);
+ redisService.setCacheObject(podName, masterIp + ":" + podPort);
devEnvironment.setStatus("Pending");
devEnvironment.setUrl(url);
this.devEnvironmentService.update(devEnvironment);
- return url ;
+ return url;
}
@@ -119,20 +119,22 @@ public class JupyterServiceImpl implements JupyterService {
@Override
public String stopJupyterService(Integer id) throws Exception {
DevEnvironment devEnvironment = this.devEnvironmentDao.queryById(id);
- if (devEnvironment==null){
+ if (devEnvironment == null) {
throw new Exception("开发环境配置不存在");
}
LoginUser loginUser = SecurityUtils.getLoginUser();
//构造pod和svc名称
- String podName = loginUser.getUsername().toLowerCase() +"-editor-pod" + "-" + id;
- String svcName = loginUser.getUsername().toLowerCase() + "-editor-pod" + "-" + id + "-svc";
+ String podName = loginUser.getUsername().toLowerCase() + "-editor-pod" + "-" + id;
+ String svcName = loginUser.getUsername().toLowerCase() + "-editor-pod" + "-" + id + "-svc";
//得到pod
V1Pod pod = k8sClientUtil.getNSPodList(namespace, podName);
- if(pod == null){
+ if (pod == null) {
return "pod不存在!";
}
- computingResourceDao.updateUsedStateByNode(pod.getSpec().getNodeName(), Constant.Used_State_unused);
+ if (Constant.Computing_Resource_GPU.equals(devEnvironment.getComputingResource())) {
+ computingResourceDao.updateUsedStateByNode(pod.getSpec().getNodeName(), Constant.Used_State_unused);
+ }
// 使用 Kubernetes API 删除 Pod
String deleteResult = k8sClientUtil.deletePod(podName, namespace);
@@ -150,11 +152,11 @@ public class JupyterServiceImpl implements JupyterService {
String status = PodStatus.Terminated.getName();
PodStatusVo JupyterStatusVo = new PodStatusVo();
JupyterStatusVo.setStatus(status);
- if (devEnvironment==null){
+ if (devEnvironment == null) {
return JupyterStatusVo;
}
LoginUser loginUser = SecurityUtils.getLoginUser();
- String podName = loginUser.getUsername().toLowerCase() +"-editor-pod" + "-" + devEnvironment.getId();
+ String podName = loginUser.getUsername().toLowerCase() + "-editor-pod" + "-" + devEnvironment.getId();
try {
// 查询相应pod状态
@@ -180,7 +182,7 @@ public class JupyterServiceImpl implements JupyterService {
@Override
public void upload(InputStream inputStream) {
try {
- minioUtil.uploadObject("platform-data","/pytorch/testupload4008208820",inputStream);
+ minioUtil.uploadObject("platform-data", "/pytorch/testupload4008208820", inputStream);
} catch (Exception e) {
e.printStackTrace();
}
@@ -195,7 +197,4 @@ public class JupyterServiceImpl implements JupyterService {
}
-
-
-
}
diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/utils/K8sClientUtil.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/utils/K8sClientUtil.java
index d022bf3..d5b5ab2 100644
--- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/utils/K8sClientUtil.java
+++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/utils/K8sClientUtil.java
@@ -1,6 +1,5 @@
package com.ruoyi.platform.utils;
-import com.alibaba.nacos.shaded.com.google.gson.reflect.TypeToken;
import com.ruoyi.platform.constant.Constant;
import com.ruoyi.platform.mapper.ComputingResourceDao;
import io.kubernetes.client.Exec;
@@ -8,20 +7,16 @@ import io.kubernetes.client.custom.IntOrString;
import io.kubernetes.client.custom.Quantity;
import io.kubernetes.client.openapi.ApiClient;
import io.kubernetes.client.openapi.ApiException;
-import io.kubernetes.client.openapi.ApiResponse;
import io.kubernetes.client.openapi.apis.CoreV1Api;
import io.kubernetes.client.openapi.models.*;
import io.kubernetes.client.util.ClientBuilder;
-import io.kubernetes.client.util.Watch;
import io.kubernetes.client.util.credentials.AccessTokenAuthentication;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
-import org.apache.poi.ss.formula.functions.T;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
-import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.io.BufferedReader;
import java.io.InputStreamReader;
@@ -45,6 +40,7 @@ public class K8sClientUtil {
@Resource
private ComputingResourceDao computingResourceDao;
+
/**
* 构建集群POD内通过SA访问的客户端
* loading the in-cluster config, including:
@@ -138,11 +134,11 @@ public class K8sClientUtil {
} catch (ApiException e) {
log.error("获取 SVC 异常:", e);
}
- if (v1ServiceList!=null) {
+ if (v1ServiceList != null) {
for (V1Service svc : v1ServiceList.getItems()) {
if (StringUtils.equals(svc.getMetadata().getName(), serviceName)) {
// SVC 已存在
- return svc;
+ return svc;
}
}
}
@@ -182,22 +178,22 @@ public class K8sClientUtil {
/**
* 创建k8s PVC
*
- * @param namespace 命名空间
- * @param pvcName 服务名称
+ * @param namespace 命名空间
+ * @param pvcName 服务名称
* @return 创建成功的service对象
*/
- public V1PersistentVolumeClaim createPvc(String namespace, String pvcName ,String storage, String storageClassName){
+ public V1PersistentVolumeClaim createPvc(String namespace, String pvcName, String storage, String storageClassName) {
CoreV1Api api = new CoreV1Api(apiClient);
V1PersistentVolumeClaimList pvcList = null;
try {
- pvcList = api.listNamespacedPersistentVolumeClaim(namespace, null,null, null, null, null,null,null, null, null, null);
+ pvcList = api.listNamespacedPersistentVolumeClaim(namespace, null, null, null, null, null, null, null, null, null, null);
} catch (ApiException e) {
log.error("获取 PVC 异常:", e);
}
- if (pvcList!=null) {
+ if (pvcList != null) {
for (V1PersistentVolumeClaim pvc1 : pvcList.getItems()) {
- if (StringUtils.equals(pvc1.getMetadata().getName(),pvcName)) {
+ if (StringUtils.equals(pvc1.getMetadata().getName(), pvcName)) {
// PVC 已存在
return pvc1;
}
@@ -232,16 +228,17 @@ public class K8sClientUtil {
/**
* 创建k8s 临时POD
+ *
* @param podName pod name
- * @param namespace 命名空间
- * @param port port
+ * @param namespace 命名空间
+ * @param port port
* @param mountPath 映射路径
- * @param pvc 存储
- * @param image 镜像
+ * @param pvc 存储
+ * @param image 镜像
* @return 创建成功的pod,的nodePort端口
*/
- public Integer createPod(String podName, String namespace, Integer port ,String mountPath, V1PersistentVolumeClaim pvc, String image){
+ public Integer createPod(String podName, String namespace, Integer port, String mountPath, V1PersistentVolumeClaim pvc, String image) {
Map selector = new LinkedHashMap();
selector.put("k8s-jupyter", podName);
@@ -253,7 +250,7 @@ public class K8sClientUtil {
} catch (ApiException e) {
log.error("获取 POD 异常:", e);
}
- if (v1PodList!=null) {
+ if (v1PodList != null) {
for (V1Pod pod1 : v1PodList.getItems()) {
if (StringUtils.equals(pod1.getMetadata().getName(), podName)) {
// PVC 已存在
@@ -301,17 +298,18 @@ public class K8sClientUtil {
/**
* 创建k8s 临时POD
+ *
* @param podName pod name
- * @param namespace 命名空间
- * @param port port
+ * @param namespace 命名空间
+ * @param port port
* @param mountPath 映射路径
- * @param subPath pvc子路径
- * @param pvcName 存储名
- * @param image 镜像
+ * @param subPath pvc子路径
+ * @param pvcName 存储名
+ * @param image 镜像
* @return 创建成功的pod,的nodePort端口
*/
- public Integer createPodWithSubPath(String podName, String namespace, Integer port ,String mountPath,String subPath,String pvcName, String image){
+ public Integer createPodWithSubPath(String podName, String namespace, Integer port, String mountPath, String subPath, String pvcName, String image) {
Map selector = new LinkedHashMap();
selector.put("k8s-jupyter", podName);
@@ -323,7 +321,7 @@ public class K8sClientUtil {
} catch (ApiException e) {
log.error("获取 POD 异常:", e);
}
- if (v1PodList!=null) {
+ if (v1PodList != null) {
for (V1Pod pod1 : v1PodList.getItems()) {
if (StringUtils.equals(pod1.getMetadata().getName(), podName)) {
// PVC 已存在
@@ -381,7 +379,7 @@ public class K8sClientUtil {
}
// 创建配置好的Pod
- public Integer createConfiguredPod(String podName, String namespace, Integer port, String mountPath, V1PersistentVolumeClaim pvc, String image, String dataPvcName, String datasetPath, String modelPath) {
+ public Integer createConfiguredPod(String podName, String namespace, Integer port, String mountPath, V1PersistentVolumeClaim pvc, String image, String computingResource, String dataPvcName, String datasetPath, String modelPath) {
//设置选择节点,pod反亲和性
Map selector = new LinkedHashMap<>();
@@ -473,7 +471,9 @@ public class K8sClientUtil {
try {
pod = api.createNamespacedPod(namespace, pod, null, null, null);
String nodeName = getNodeName(podName, namespace);
- computingResourceDao.updateUsedStateByNode(nodeName, Constant.Used_State_used);
+ if (Constant.Computing_Resource_GPU.equals(computingResource)) {
+ computingResourceDao.updateUsedStateByNode(nodeName, Constant.Used_State_used);
+ }
} catch (ApiException e) {
log.error("创建pod异常:" + e.getResponseBody(), e);
} catch (Exception e) {
@@ -485,14 +485,12 @@ public class K8sClientUtil {
}
-
-
/**
* 根据获取namespace,deploymentName的Pod Name
*
* @return podList
*/
- public V1Pod getNSPodList(String namespace,String deploymentName) throws Exception {
+ public V1Pod getNSPodList(String namespace, String deploymentName) throws Exception {
// new a CoreV1Api
CoreV1Api api = new CoreV1Api(apiClient);
V1PodList v1PodList = null;
@@ -513,12 +511,12 @@ public class K8sClientUtil {
return null;
}
- public String executeCommand(V1Pod item, String command) {
+ public String executeCommand(V1Pod item, String command) {
try {
// 创建API实例
// 创建Exec实例
Exec exec = new Exec(apiClient);
- String[] cmd = { "/bin/sh", "-c", command};
+ String[] cmd = {"/bin/sh", "-c", command};
Process proc = exec.exec(item, cmd, false);
// 读取输出
BufferedReader reader = new BufferedReader(new InputStreamReader(proc.getInputStream()));
@@ -543,10 +541,11 @@ public class K8sClientUtil {
/**
* 根据Pod的名称和Namespace查询Pod的状态
- * @param podName Pod的名称
+ *
+ * @param podName Pod的名称
* @param namespace Pod所在的Namespace
*/
- public String getPodStatus(String podName, String namespace) throws Exception {
+ public String getPodStatus(String podName, String namespace) throws Exception {
CoreV1Api api = new CoreV1Api(apiClient);
V1Pod pod = api.readNamespacedPod(podName, namespace, null, null, null);
return pod.getStatus().getPhase();
@@ -554,14 +553,15 @@ public class K8sClientUtil {
/**
* 根据Pod的名称和Namespace查询Pod的容器信息
- * @param podName Pod的名称
+ *
+ * @param podName Pod的名称
* @param namespace Pod所在的Namespace
*/
public String getPodContainerId(String podName, String namespace) throws Exception {
CoreV1Api api = new CoreV1Api(apiClient);
V1Pod pod = api.readNamespacedPod(podName, namespace, null, null, null);
- if(pod.getStatus().getContainerStatuses().size() !=1){
+ if (pod.getStatus().getContainerStatuses().size() != 1) {
throw new RuntimeException("容器错误");
}
String containerId = pod.getStatus().getContainerStatuses().get(0).getContainerID().split("//")[1];
@@ -580,10 +580,10 @@ public class K8sClientUtil {
return pod.getSpec().getNodeName();
}
- public String getPodLogs(String podName,String namespace,String container,int line) {
+ public String getPodLogs(String podName, String namespace, String container, int line) {
CoreV1Api api = new CoreV1Api(apiClient);
try {
- String log = api.readNamespacedPodLog(podName, namespace, StringUtils.isEmpty(container)?null:container, null, null, null, null,null, null, line, null);
+ String log = api.readNamespacedPodLog(podName, namespace, StringUtils.isEmpty(container) ? null : container, null, null, null, null, null, null, line, null);
return log;
} catch (ApiException e) {
throw new RuntimeException("获取Pod日志异常", e);
@@ -592,7 +592,7 @@ public class K8sClientUtil {
}
- public V1Pod createPodWithEnv(String podName,String namespace,String proxyUrl ,String mountPath,String pvcName, String image){
+ public V1Pod createPodWithEnv(String podName, String namespace, String proxyUrl, String mountPath, String pvcName, String image) {
CoreV1Api api = new CoreV1Api(apiClient);
V1PodList v1PodList = null;
V1Pod pod = new V1PodBuilder()
@@ -636,7 +636,7 @@ public class K8sClientUtil {
/**
* 删除 Pod
*
- * @param podName Pod 名称
+ * @param podName Pod 名称
* @param namespace 命名空间
* @throws ApiException 异常
*/
@@ -655,7 +655,7 @@ public class K8sClientUtil {
/**
* 删除 Service
*
- * @param svcName Service 名称
+ * @param svcName Service 名称
* @param namespace 命名空间
* @throws ApiException 异常
*/
@@ -674,7 +674,7 @@ public class K8sClientUtil {
/**
* 检查 Pod 是否存在
*
- * @param podName Pod 名称
+ * @param podName Pod 名称
* @param namespace 命名空间
* @return 是否存在
* @throws ApiException 异常
@@ -682,7 +682,7 @@ public class K8sClientUtil {
public boolean checkPodExists(String podName, String namespace) throws ApiException {
CoreV1Api api = new CoreV1Api(apiClient);
try {
- api.readNamespacedPod(podName, namespace, null,false,false);
+ api.readNamespacedPod(podName, namespace, null, false, false);
return true;
} catch (ApiException e) {
if (e.getCode() == 404) {
From 9ac99957ed1f68e4ce83de5f0ddf1aa06826c107 Mon Sep 17 00:00:00 2001
From: chenzhihang <709011834@qq.com>
Date: Thu, 29 Aug 2024 15:17:10 +0800
Subject: [PATCH 03/12] =?UTF-8?q?1=E3=80=81=E6=B7=BB=E5=8A=A0=E4=BB=A3?=
=?UTF-8?q?=E7=A0=81=E9=85=8D=E7=BD=AEsshkey=E5=AD=97=E6=AE=B5?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../java/com/ruoyi/platform/domain/CodeConfig.java | 4 ++++
.../mapper/managementPlatform/CodeConfigDaoMapper.xml | 11 +++++++++--
2 files changed, 13 insertions(+), 2 deletions(-)
diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/domain/CodeConfig.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/domain/CodeConfig.java
index 957dabe..67d5533 100644
--- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/domain/CodeConfig.java
+++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/domain/CodeConfig.java
@@ -36,6 +36,9 @@ public class CodeConfig implements Serializable {
@ApiModelProperty(value = "Git密码")
private String gitPassword;
+ @ApiModelProperty(value = "SSH Key")
+ private String sshKey;
+
private String createBy;
/**
* 创建时间
@@ -53,4 +56,5 @@ public class CodeConfig implements Serializable {
* 状态,0失效1生效
*/
private Integer state;
+
}
diff --git a/ruoyi-modules/management-platform/src/main/resources/mapper/managementPlatform/CodeConfigDaoMapper.xml b/ruoyi-modules/management-platform/src/main/resources/mapper/managementPlatform/CodeConfigDaoMapper.xml
index 64c72f8..815e0ac 100644
--- a/ruoyi-modules/management-platform/src/main/resources/mapper/managementPlatform/CodeConfigDaoMapper.xml
+++ b/ruoyi-modules/management-platform/src/main/resources/mapper/managementPlatform/CodeConfigDaoMapper.xml
@@ -3,8 +3,9 @@
- insert into code_config(code_repo_name, code_repo_vis, git_url, git_branch, verify_mode, git_user_name, git_password, create_by, create_time, update_by, update_time)
- values(#{codeConfig.codeRepoName}, #{codeConfig.codeRepoVis}, #{codeConfig.gitUrl}, #{codeConfig.gitBranch}, #{codeConfig.verifyMode}, #{codeConfig.gitUserName}, #{codeConfig.gitPassword}, #{codeConfig.createBy}, #{codeConfig.createTime}, #{codeConfig.updateBy}, #{codeConfig.updateTime})
+ insert into code_config(code_repo_name, code_repo_vis, git_url, git_branch, verify_mode, git_user_name, git_password,ssh_key, create_by, create_time, update_by, update_time)
+ values(#{codeConfig.codeRepoName}, #{codeConfig.codeRepoVis}, #{codeConfig.gitUrl}, #{codeConfig.gitBranch}, #{codeConfig.verifyMode}, #{codeConfig.gitUserName}, #{codeConfig.gitPassword},
+ #{codeConfig.sshKey}, #{codeConfig.createBy}, #{codeConfig.createTime}, #{codeConfig.updateBy}, #{codeConfig.updateTime})
@@ -28,6 +29,12 @@
git_user_name = #{codeConfig.gitUserName},
+
+ git_password = #{codeConfig.gitPassword},
+
+
+ ssh_key = #{codeConfig.sshKey},
+
create_by = #{codeConfig.createBy},
From 85f06999b8be06bcab7ae54d2f307f8262788889 Mon Sep 17 00:00:00 2001
From: chenzhihang <709011834@qq.com>
Date: Thu, 29 Aug 2024 15:59:52 +0800
Subject: [PATCH 04/12] =?UTF-8?q?1=E3=80=81=E4=BF=AE=E6=94=B9=E4=BB=A3?=
=?UTF-8?q?=E7=A0=81=E9=85=8D=E7=BD=AE?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../codeConfig/CodeConfigController.java | 6 ++-
.../com/ruoyi/platform/domain/CodeConfig.java | 37 +++++++++----------
.../CodeConfigDaoMapper.xml | 6 +--
3 files changed, 24 insertions(+), 25 deletions(-)
diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/codeConfig/CodeConfigController.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/codeConfig/CodeConfigController.java
index 6a59902..44bc217 100644
--- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/codeConfig/CodeConfigController.java
+++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/codeConfig/CodeConfigController.java
@@ -28,8 +28,12 @@ public class CodeConfigController extends BaseController {
* @return 查询结果
*/
@GetMapping
- public GenericsAjaxResult> queryByPage(CodeConfig codeConfig, int page, int size) {
+ public GenericsAjaxResult> queryByPage( @RequestParam("page")int page,
+ @RequestParam("size") int size,
+ @RequestParam(value = "code_repo_name") String codeRepoName) {
PageRequest pageRequest = PageRequest.of(page,size);
+ CodeConfig codeConfig = new CodeConfig();
+ codeConfig.setCodeRepoName(codeRepoName);
return genericsSuccess(this.codeConfigService.queryByPage(codeConfig, pageRequest));
}
diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/domain/CodeConfig.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/domain/CodeConfig.java
index 67d5533..e5a0c68 100644
--- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/domain/CodeConfig.java
+++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/domain/CodeConfig.java
@@ -15,46 +15,43 @@ public class CodeConfig implements Serializable {
private Long id;
- @ApiModelProperty(value = "代码仓库名称")
+ @ApiModelProperty(name = "code_repo_name",value = "代码仓库名称")
private String codeRepoName;
- @ApiModelProperty(value = "代码仓库可见性(1-公开,0-私有)")
+ @ApiModelProperty(name = "code_repo_vis", value = "代码仓库可见性(1-公开,0-私有)")
private Integer codeRepoVis;
- @ApiModelProperty(value = "Git地址")
+ @ApiModelProperty(name = "git_url", value = "Git地址")
private String gitUrl;
- @ApiModelProperty(value = "代码分支/Tag")
+ @ApiModelProperty(name = "git_branch", value = "代码分支/Tag")
private String gitBranch;
- @ApiModelProperty(value = "验证方式(0-用户名密码,1-SSH-Key)")
+ @ApiModelProperty(name = "verify_mode", value = "验证方式(0-用户名密码,1-SSH-Key)")
private Integer verifyMode;
- @ApiModelProperty(value = "Git用户名")
+ @ApiModelProperty(name = "git_user_name", value = "Git用户名")
private String gitUserName;
- @ApiModelProperty(value = "Git密码")
+ @ApiModelProperty(name = "git_password", value = "Git密码")
private String gitPassword;
- @ApiModelProperty(value = "SSH Key")
+ @ApiModelProperty(name = "ssh_key",value = "SSH Key")
private String sshKey;
+ @ApiModelProperty(name = "create_by", value = "创建者")
private String createBy;
- /**
- * 创建时间
- */
+
+ @ApiModelProperty(name = "create_time", value = "创建时间")
private Date createTime;
- /**
- * 更新者
- */
+
+ @ApiModelProperty(name = "update_by", value = "更新者")
private String updateBy;
- /**
- * 更新时间
- */
+
+ @ApiModelProperty(name = "update_time", value = "更新时间")
private Date updateTime;
- /**
- * 状态,0失效1生效
- */
+
+ @ApiModelProperty(name = "state", value = "状态,0失效1生效")
private Integer state;
}
diff --git a/ruoyi-modules/management-platform/src/main/resources/mapper/managementPlatform/CodeConfigDaoMapper.xml b/ruoyi-modules/management-platform/src/main/resources/mapper/managementPlatform/CodeConfigDaoMapper.xml
index 815e0ac..f714f9e 100644
--- a/ruoyi-modules/management-platform/src/main/resources/mapper/managementPlatform/CodeConfigDaoMapper.xml
+++ b/ruoyi-modules/management-platform/src/main/resources/mapper/managementPlatform/CodeConfigDaoMapper.xml
@@ -44,12 +44,10 @@
update_by = #{codeConfig.updateBy},
-
- update_time = #{codeConfig.updateTime},
-
state = #{codeConfig.state},
+ update_time = sysdate()
where id = #{codeConfig.id}
@@ -81,7 +79,7 @@
and id = #{codeConfig.id}
- and code_repo_name = #{codeConfig.codeRepoName}
+ and code_repo_name LIKE CONCAT('%', #{codeConfig.codeRepoName}, '%')
and code_repo_vis = #{codeConfig.codeRepoVis}
From f24e764aaabf7e93ea070cec45a70c3d312395ef Mon Sep 17 00:00:00 2001
From: chenzhihang <709011834@qq.com>
Date: Thu, 29 Aug 2024 16:11:52 +0800
Subject: [PATCH 05/12] =?UTF-8?q?1=E3=80=81=E7=94=A8=E6=88=B7=E6=B7=BB?=
=?UTF-8?q?=E5=8A=A0gitLink=E7=94=A8=E6=88=B7=E5=90=8D=E5=AF=86=E7=A0=81?=
=?UTF-8?q?=E5=AD=97=E6=AE=B5?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../com/ruoyi/system/api/domain/SysUser.java | 279 ++++++++++--------
.../system/controller/SysUserController.java | 140 ++++-----
.../ruoyi/system/mapper/SysUserMapper.java | 2 +
.../ruoyi/system/service/ISysUserService.java | 2 +
.../service/impl/SysUserServiceImpl.java | 11 +
.../resources/mapper/system/SysUserMapper.xml | 110 ++++---
6 files changed, 294 insertions(+), 250 deletions(-)
diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysUser.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysUser.java
index a64751a..fc1aa78 100644
--- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysUser.java
+++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysUser.java
@@ -1,323 +1,344 @@
package com.ruoyi.system.api.domain;
-import java.util.Date;
-import java.util.List;
-import javax.validation.constraints.*;
-import org.apache.commons.lang3.builder.ToStringBuilder;
-import org.apache.commons.lang3.builder.ToStringStyle;
import com.ruoyi.common.core.annotation.Excel;
import com.ruoyi.common.core.annotation.Excel.ColumnType;
import com.ruoyi.common.core.annotation.Excel.Type;
import com.ruoyi.common.core.annotation.Excels;
import com.ruoyi.common.core.web.domain.BaseEntity;
import com.ruoyi.common.core.xss.Xss;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+import javax.validation.constraints.Email;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.Size;
+import java.util.Date;
+import java.util.List;
/**
* 用户对象 sys_user
- *
+ *
* @author ruoyi
*/
-public class SysUser extends BaseEntity
-{
+public class SysUser extends BaseEntity {
private static final long serialVersionUID = 1L;
- /** 用户ID */
+ /**
+ * 用户ID
+ */
@Excel(name = "用户序号", cellType = ColumnType.NUMERIC, prompt = "用户编号")
private Long userId;
- /** 部门ID */
+ /**
+ * 部门ID
+ */
@Excel(name = "部门编号", type = Type.IMPORT)
private Long deptId;
- /** 用户账号 */
+ /**
+ * 用户账号
+ */
@Excel(name = "登录名称")
private String userName;
- /** 用户昵称 */
+ /**
+ * 用户昵称
+ */
@Excel(name = "用户名称")
private String nickName;
- /** 用户邮箱 */
+ /**
+ * 用户邮箱
+ */
@Excel(name = "用户邮箱")
private String email;
- /** 手机号码 */
+ /**
+ * 手机号码
+ */
@Excel(name = "手机号码")
private String phonenumber;
- /** 用户性别 */
+ /**
+ * 用户性别
+ */
@Excel(name = "用户性别", readConverterExp = "0=男,1=女,2=未知")
private String sex;
- /** 用户头像 */
+ /**
+ * 用户头像
+ */
private String avatar;
- /** 密码 */
+ /**
+ * 密码
+ */
private String password;
- /** 帐号状态(0正常 1停用) */
+ /**
+ * 帐号状态(0正常 1停用)
+ */
@Excel(name = "帐号状态", readConverterExp = "0=正常,1=停用")
private String status;
- /** 删除标志(0代表存在 2代表删除) */
+ /**
+ * 删除标志(0代表存在 2代表删除)
+ */
private String delFlag;
- /** 最后登录IP */
+ /**
+ * 最后登录IP
+ */
@Excel(name = "最后登录IP", type = Type.EXPORT)
private String loginIp;
- /** 最后登录时间 */
+ /**
+ * 最后登录时间
+ */
@Excel(name = "最后登录时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss", type = Type.EXPORT)
private Date loginDate;
- /** 部门对象 */
+ /**
+ * 部门对象
+ */
@Excels({
- @Excel(name = "部门名称", targetAttr = "deptName", type = Type.EXPORT),
- @Excel(name = "部门负责人", targetAttr = "leader", type = Type.EXPORT)
+ @Excel(name = "部门名称", targetAttr = "deptName", type = Type.EXPORT),
+ @Excel(name = "部门负责人", targetAttr = "leader", type = Type.EXPORT)
})
private SysDept dept;
- /** 角色对象 */
+ /**
+ * 角色对象
+ */
private List roles;
- /** 角色组 */
+ /**
+ * 角色组
+ */
private Long[] roleIds;
- /** 岗位组 */
+ /**
+ * 岗位组
+ */
private Long[] postIds;
- /** 角色ID */
+ /**
+ * 角色ID
+ */
private Long roleId;
- public SysUser()
- {
+ private String gitLinkUsername;
+
+ private String gitLinkPassword;
+
+ public SysUser() {
}
- public SysUser(Long userId)
- {
+ public SysUser(Long userId) {
this.userId = userId;
}
- public Long getUserId()
- {
+ public Long getUserId() {
return userId;
}
- public void setUserId(Long userId)
- {
+ public void setUserId(Long userId) {
this.userId = userId;
}
- public boolean isAdmin()
- {
+ public boolean isAdmin() {
return isAdmin(this.userId);
}
- public static boolean isAdmin(Long userId)
- {
+ public static boolean isAdmin(Long userId) {
return userId != null && 1L == userId;
}
- public Long getDeptId()
- {
+ public Long getDeptId() {
return deptId;
}
- public void setDeptId(Long deptId)
- {
+ public void setDeptId(Long deptId) {
this.deptId = deptId;
}
@Xss(message = "用户昵称不能包含脚本字符")
@Size(min = 0, max = 30, message = "用户昵称长度不能超过30个字符")
- public String getNickName()
- {
+ public String getNickName() {
return nickName;
}
- public void setNickName(String nickName)
- {
+ public void setNickName(String nickName) {
this.nickName = nickName;
}
@Xss(message = "用户账号不能包含脚本字符")
@NotBlank(message = "用户账号不能为空")
@Size(min = 0, max = 30, message = "用户账号长度不能超过30个字符")
- public String getUserName()
- {
+ public String getUserName() {
return userName;
}
- public void setUserName(String userName)
- {
+ public void setUserName(String userName) {
this.userName = userName;
}
@Email(message = "邮箱格式不正确")
@Size(min = 0, max = 50, message = "邮箱长度不能超过50个字符")
- public String getEmail()
- {
+ public String getEmail() {
return email;
}
- public void setEmail(String email)
- {
+ public void setEmail(String email) {
this.email = email;
}
@Size(min = 0, max = 11, message = "手机号码长度不能超过11个字符")
- public String getPhonenumber()
- {
+ public String getPhonenumber() {
return phonenumber;
}
- public void setPhonenumber(String phonenumber)
- {
+ public void setPhonenumber(String phonenumber) {
this.phonenumber = phonenumber;
}
- public String getSex()
- {
+ public String getSex() {
return sex;
}
- public void setSex(String sex)
- {
+ public void setSex(String sex) {
this.sex = sex;
}
- public String getAvatar()
- {
+ public String getAvatar() {
return avatar;
}
- public void setAvatar(String avatar)
- {
+ public void setAvatar(String avatar) {
this.avatar = avatar;
}
- public String getPassword()
- {
+ public String getPassword() {
return password;
}
- public void setPassword(String password)
- {
+ public void setPassword(String password) {
this.password = password;
}
- public String getStatus()
- {
+ public String getStatus() {
return status;
}
- public void setStatus(String status)
- {
+ public void setStatus(String status) {
this.status = status;
}
- public String getDelFlag()
- {
+ public String getDelFlag() {
return delFlag;
}
- public void setDelFlag(String delFlag)
- {
+ public void setDelFlag(String delFlag) {
this.delFlag = delFlag;
}
- public String getLoginIp()
- {
+ public String getLoginIp() {
return loginIp;
}
- public void setLoginIp(String loginIp)
- {
+ public void setLoginIp(String loginIp) {
this.loginIp = loginIp;
}
- public Date getLoginDate()
- {
+ public Date getLoginDate() {
return loginDate;
}
- public void setLoginDate(Date loginDate)
- {
+ public void setLoginDate(Date loginDate) {
this.loginDate = loginDate;
}
- public SysDept getDept()
- {
+ public SysDept getDept() {
return dept;
}
- public void setDept(SysDept dept)
- {
+ public void setDept(SysDept dept) {
this.dept = dept;
}
- public List getRoles()
- {
+ public List getRoles() {
return roles;
}
- public void setRoles(List roles)
- {
+ public void setRoles(List roles) {
this.roles = roles;
}
- public Long[] getRoleIds()
- {
+ public Long[] getRoleIds() {
return roleIds;
}
- public void setRoleIds(Long[] roleIds)
- {
+ public void setRoleIds(Long[] roleIds) {
this.roleIds = roleIds;
}
- public Long[] getPostIds()
- {
+ public Long[] getPostIds() {
return postIds;
}
- public void setPostIds(Long[] postIds)
- {
+ public void setPostIds(Long[] postIds) {
this.postIds = postIds;
}
- public Long getRoleId()
- {
+ public Long getRoleId() {
return roleId;
}
- public void setRoleId(Long roleId)
- {
+ public void setRoleId(Long roleId) {
this.roleId = roleId;
}
+
+ public void setGitLinkUsername(String gitLinkUsername) {
+ this.gitLinkUsername = gitLinkUsername;
+ }
+
+ public String getGitLinkUsername() {
+ return gitLinkUsername;
+ }
+
+ public void setGitLinkPassword(String gitLinkPassword) {
+ this.gitLinkPassword = gitLinkPassword;
+ }
+
+ public String getGitLinkPassword() {
+ return gitLinkPassword;
+ }
+
@Override
public String toString() {
- return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
- .append("userId", getUserId())
- .append("deptId", getDeptId())
- .append("userName", getUserName())
- .append("nickName", getNickName())
- .append("email", getEmail())
- .append("phonenumber", getPhonenumber())
- .append("sex", getSex())
- .append("avatar", getAvatar())
- .append("password", getPassword())
- .append("status", getStatus())
- .append("delFlag", getDelFlag())
- .append("loginIp", getLoginIp())
- .append("loginDate", getLoginDate())
- .append("createBy", getCreateBy())
- .append("createTime", getCreateTime())
- .append("updateBy", getUpdateBy())
- .append("updateTime", getUpdateTime())
- .append("remark", getRemark())
- .append("dept", getDept())
- .toString();
+ return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
+ .append("userId", getUserId())
+ .append("deptId", getDeptId())
+ .append("userName", getUserName())
+ .append("nickName", getNickName())
+ .append("email", getEmail())
+ .append("phonenumber", getPhonenumber())
+ .append("sex", getSex())
+ .append("avatar", getAvatar())
+ .append("password", getPassword())
+ .append("status", getStatus())
+ .append("delFlag", getDelFlag())
+ .append("loginIp", getLoginIp())
+ .append("loginDate", getLoginDate())
+ .append("createBy", getCreateBy())
+ .append("createTime", getCreateTime())
+ .append("updateBy", getUpdateBy())
+ .append("updateTime", getUpdateTime())
+ .append("remark", getRemark())
+ .append("dept", getDept())
+ .append("gitLinkUsername", getGitLinkUsername())
+ .append("gitLinkPassword", getGitLinkPassword())
+ .toString();
}
}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserController.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserController.java
index bcbbb6a..ed46bc7 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserController.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserController.java
@@ -1,22 +1,5 @@
package com.ruoyi.system.controller;
-import java.io.IOException;
-import java.util.List;
-import java.util.Set;
-import java.util.stream.Collectors;
-import javax.servlet.http.HttpServletResponse;
-import org.apache.commons.lang3.ArrayUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-import org.springframework.web.multipart.MultipartFile;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.common.core.utils.poi.ExcelUtil;
@@ -32,22 +15,27 @@ import com.ruoyi.system.api.domain.SysDept;
import com.ruoyi.system.api.domain.SysRole;
import com.ruoyi.system.api.domain.SysUser;
import com.ruoyi.system.api.model.LoginUser;
-import com.ruoyi.system.service.ISysConfigService;
-import com.ruoyi.system.service.ISysDeptService;
-import com.ruoyi.system.service.ISysPermissionService;
-import com.ruoyi.system.service.ISysPostService;
-import com.ruoyi.system.service.ISysRoleService;
-import com.ruoyi.system.service.ISysUserService;
+import com.ruoyi.system.service.*;
+import org.apache.commons.lang3.ArrayUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
/**
* 用户信息
- *
+ *
* @author ruoyi
*/
@RestController
@RequestMapping("/user")
-public class SysUserController extends BaseController
-{
+public class SysUserController extends BaseController {
@Autowired
private ISysUserService userService;
@@ -71,8 +59,7 @@ public class SysUserController extends BaseController
*/
@RequiresPermissions("system:user:list")
@GetMapping("/list")
- public TableDataInfo list(SysUser user)
- {
+ public TableDataInfo list(SysUser user) {
startPage();
List list = userService.selectUserList(user);
return getDataTable(list);
@@ -81,8 +68,7 @@ public class SysUserController extends BaseController
@Log(title = "用户管理", businessType = BusinessType.EXPORT)
@RequiresPermissions("system:user:export")
@PostMapping("/export")
- public void export(HttpServletResponse response, SysUser user)
- {
+ public void export(HttpServletResponse response, SysUser user) {
List list = userService.selectUserList(user);
ExcelUtil util = new ExcelUtil(SysUser.class);
util.exportExcel(response, list, "用户数据");
@@ -91,8 +77,7 @@ public class SysUserController extends BaseController
@Log(title = "用户管理", businessType = BusinessType.IMPORT)
@RequiresPermissions("system:user:import")
@PostMapping("/importData")
- public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception
- {
+ public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception {
ExcelUtil util = new ExcelUtil(SysUser.class);
List userList = util.importExcel(file.getInputStream());
String operName = SecurityUtils.getUsername();
@@ -101,8 +86,7 @@ public class SysUserController extends BaseController
}
@PostMapping("/importTemplate")
- public void importTemplate(HttpServletResponse response) throws IOException
- {
+ public void importTemplate(HttpServletResponse response) throws IOException {
ExcelUtil util = new ExcelUtil(SysUser.class);
util.importTemplateExcel(response, "用户数据");
}
@@ -112,11 +96,9 @@ public class SysUserController extends BaseController
*/
@InnerAuth
@GetMapping("/info/{username}")
- public R info(@PathVariable("username") String username)
- {
+ public R info(@PathVariable("username") String username) {
SysUser sysUser = userService.selectUserByUserName(username);
- if (StringUtils.isNull(sysUser))
- {
+ if (StringUtils.isNull(sysUser)) {
return R.fail("用户名或密码错误");
}
// 角色集合
@@ -135,15 +117,12 @@ public class SysUserController extends BaseController
*/
@InnerAuth
@PostMapping("/register")
- public R register(@RequestBody SysUser sysUser)
- {
+ public R register(@RequestBody SysUser sysUser) {
String username = sysUser.getUserName();
- if (!("true".equals(configService.selectConfigByKey("sys.account.registerUser"))))
- {
+ if (!("true".equals(configService.selectConfigByKey("sys.account.registerUser")))) {
return R.fail("当前系统没有开启注册功能!");
}
- if (!userService.checkUserNameUnique(sysUser))
- {
+ if (!userService.checkUserNameUnique(sysUser)) {
return R.fail("保存用户'" + username + "'失败,注册账号已存在");
}
return R.ok(userService.registerUser(sysUser));
@@ -151,12 +130,11 @@ public class SysUserController extends BaseController
/**
* 获取用户信息
- *
+ *
* @return 用户信息
*/
@GetMapping("getInfo")
- public AjaxResult getInfo()
- {
+ public AjaxResult getInfo() {
SysUser user = userService.selectUserById(SecurityUtils.getUserId());
// 角色集合
Set roles = permissionService.getRolePermission(user);
@@ -173,16 +151,14 @@ public class SysUserController extends BaseController
* 根据用户编号获取详细信息
*/
@RequiresPermissions("system:user:query")
- @GetMapping(value = { "/", "/{userId}" })
- public AjaxResult getInfo(@PathVariable(value = "userId", required = false) Long userId)
- {
+ @GetMapping(value = {"/", "/{userId}"})
+ public AjaxResult getInfo(@PathVariable(value = "userId", required = false) Long userId) {
userService.checkUserDataScope(userId);
AjaxResult ajax = AjaxResult.success();
List roles = roleService.selectRoleAll();
ajax.put("roles", SysUser.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList()));
ajax.put("posts", postService.selectPostAll());
- if (StringUtils.isNotNull(userId))
- {
+ if (StringUtils.isNotNull(userId)) {
SysUser sysUser = userService.selectUserById(userId);
ajax.put(AjaxResult.DATA_TAG, sysUser);
ajax.put("postIds", postService.selectPostListByUserId(userId));
@@ -197,22 +173,19 @@ public class SysUserController extends BaseController
@RequiresPermissions("system:user:add")
@Log(title = "用户管理", businessType = BusinessType.INSERT)
@PostMapping
- public AjaxResult add(@Validated @RequestBody SysUser user)
- {
- if (!userService.checkUserNameUnique(user))
- {
+ public AjaxResult add(@Validated @RequestBody SysUser user) {
+ if (!userService.checkUserNameUnique(user)) {
return error("新增用户'" + user.getUserName() + "'失败,登录账号已存在");
- }
- else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user))
- {
+ } else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) {
return error("新增用户'" + user.getUserName() + "'失败,手机号码已存在");
- }
- else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user))
- {
+ } else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) {
return error("新增用户'" + user.getUserName() + "'失败,邮箱账号已存在");
+ } else if (StringUtils.isNotEmpty(user.getGitLinkUsername()) && !userService.checktGitLinkUsernameUnique(user)) {
+ return error("新增用户'" + user.getUserName() + "'失败,gitLink用户名已存在");
}
user.setCreateBy(SecurityUtils.getUsername());
user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
+ user.setGitLinkPassword(SecurityUtils.encryptPassword(user.getGitLinkPassword()));
return toAjax(userService.insertUser(user));
}
@@ -222,23 +195,25 @@ public class SysUserController extends BaseController
@RequiresPermissions("system:user:edit")
@Log(title = "用户管理", businessType = BusinessType.UPDATE)
@PutMapping
- public AjaxResult edit(@Validated @RequestBody SysUser user)
- {
+ public AjaxResult edit(@Validated @RequestBody SysUser user) {
userService.checkUserAllowed(user);
userService.checkUserDataScope(user.getUserId());
- if (!userService.checkUserNameUnique(user))
- {
+ if (!userService.checkUserNameUnique(user)) {
return error("修改用户'" + user.getUserName() + "'失败,登录账号已存在");
- }
- else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user))
- {
+ } else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) {
return error("修改用户'" + user.getUserName() + "'失败,手机号码已存在");
- }
- else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user))
- {
+ } else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) {
return error("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在");
+ } else if (StringUtils.isNotEmpty(user.getGitLinkUsername()) && !userService.checktGitLinkUsernameUnique(user)) {
+ return error("新增用户'" + user.getUserName() + "'失败,gitLink用户名已存在");
}
user.setUpdateBy(SecurityUtils.getUsername());
+ if(StringUtils.isNotEmpty(user.getPassword())){
+ user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
+ }
+ if(StringUtils.isNotEmpty(user.getGitLinkPassword())){
+ user.setGitLinkPassword(SecurityUtils.encryptPassword(user.getGitLinkPassword()));
+ }
return toAjax(userService.updateUser(user));
}
@@ -248,10 +223,8 @@ public class SysUserController extends BaseController
@RequiresPermissions("system:user:remove")
@Log(title = "用户管理", businessType = BusinessType.DELETE)
@DeleteMapping("/{userIds}")
- public AjaxResult remove(@PathVariable Long[] userIds)
- {
- if (ArrayUtils.contains(userIds, SecurityUtils.getUserId()))
- {
+ public AjaxResult remove(@PathVariable Long[] userIds) {
+ if (ArrayUtils.contains(userIds, SecurityUtils.getUserId())) {
return error("当前用户不能删除");
}
return toAjax(userService.deleteUserByIds(userIds));
@@ -263,8 +236,7 @@ public class SysUserController extends BaseController
@RequiresPermissions("system:user:edit")
@Log(title = "用户管理", businessType = BusinessType.UPDATE)
@PutMapping("/resetPwd")
- public AjaxResult resetPwd(@RequestBody SysUser user)
- {
+ public AjaxResult resetPwd(@RequestBody SysUser user) {
userService.checkUserAllowed(user);
userService.checkUserDataScope(user.getUserId());
user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
@@ -278,8 +250,7 @@ public class SysUserController extends BaseController
@RequiresPermissions("system:user:edit")
@Log(title = "用户管理", businessType = BusinessType.UPDATE)
@PutMapping("/changeStatus")
- public AjaxResult changeStatus(@RequestBody SysUser user)
- {
+ public AjaxResult changeStatus(@RequestBody SysUser user) {
userService.checkUserAllowed(user);
userService.checkUserDataScope(user.getUserId());
user.setUpdateBy(SecurityUtils.getUsername());
@@ -291,8 +262,7 @@ public class SysUserController extends BaseController
*/
@RequiresPermissions("system:user:query")
@GetMapping("/authRole/{userId}")
- public AjaxResult authRole(@PathVariable("userId") Long userId)
- {
+ public AjaxResult authRole(@PathVariable("userId") Long userId) {
AjaxResult ajax = AjaxResult.success();
SysUser user = userService.selectUserById(userId);
List roles = roleService.selectRolesByUserId(userId);
@@ -307,8 +277,7 @@ public class SysUserController extends BaseController
@RequiresPermissions("system:user:edit")
@Log(title = "用户管理", businessType = BusinessType.GRANT)
@PutMapping("/authRole")
- public AjaxResult insertAuthRole(Long userId, Long[] roleIds)
- {
+ public AjaxResult insertAuthRole(Long userId, Long[] roleIds) {
userService.checkUserDataScope(userId);
userService.insertUserAuth(userId, roleIds);
return success();
@@ -319,8 +288,7 @@ public class SysUserController extends BaseController
*/
@RequiresPermissions("system:user:list")
@GetMapping("/deptTree")
- public AjaxResult deptTree(SysDept dept)
- {
+ public AjaxResult deptTree(SysDept dept) {
return success(deptService.selectDeptTreeList(dept));
}
}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java
index 2624ad8..58a622e 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java
@@ -124,4 +124,6 @@ public interface SysUserMapper
* @return 结果
*/
public SysUser checkEmailUnique(String email);
+
+ public SysUser checktGitLinkUsernameUnique(String gitLinkUsername);
}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java
index 8f30fa3..e1c718a 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java
@@ -90,6 +90,8 @@ public interface ISysUserService
*/
public boolean checkEmailUnique(SysUser user);
+ public boolean checktGitLinkUsernameUnique(SysUser user);
+
/**
* 校验用户是否允许操作
*
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
index ec165dc..8ea6cb4 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
@@ -212,6 +212,17 @@ public class SysUserServiceImpl implements ISysUserService
return UserConstants.UNIQUE;
}
+ @Override
+ public boolean checktGitLinkUsernameUnique(SysUser user) {
+ Long userId = StringUtils.isNull(user.getUserId()) ? -1L : user.getUserId();
+ SysUser info = userMapper.checktGitLinkUsernameUnique(user.getGitLinkUsername());
+ if(StringUtils.isNotNull(info) && info.getUserId().longValue() != userId.longValue())
+ {
+ return UserConstants.NOT_UNIQUE;
+ }
+ return UserConstants.UNIQUE;
+ }
+
/**
* 校验用户是否允许操作
*
diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml
index eca3694..b7c9797 100644
--- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml
+++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml
@@ -47,43 +47,74 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
- select u.user_id, u.dept_id, u.user_name, u.nick_name, u.email, u.avatar, u.phonenumber, u.password, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark,
- d.dept_id, d.parent_id, d.ancestors, d.dept_name, d.order_num, d.leader, d.status as dept_status,
- r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.status as role_status
+ select u.user_id,
+ u.dept_id,
+ u.user_name,
+ u.nick_name,
+ u.email,
+ u.avatar,
+ u.phonenumber,
+ u.password,
+ u.git_link_username,
+ u.git_link_password,
+ u.sex,
+ u.status,
+ u.del_flag,
+ u.login_ip,
+ u.login_date,
+ u.create_by,
+ u.create_time,
+ u.remark,
+ d.dept_id,
+ d.parent_id,
+ d.ancestors,
+ d.dept_name,
+ d.order_num,
+ d.leader,
+ d.status as dept_status,
+ r.role_id,
+ r.role_name,
+ r.role_key,
+ r.role_sort,
+ r.data_scope,
+ r.status as role_status
from sys_user u
- left join sys_dept d on u.dept_id = d.dept_id
- left join sys_user_role ur on u.user_id = ur.user_id
- left join sys_role r on r.role_id = ur.role_id
+ left join sys_dept d on u.dept_id = d.dept_id
+ left join sys_user_role ur on u.user_id = ur.user_id
+ left join sys_role r on r.role_id = ur.role_id
+ select u.user_id, u.dept_id, u.nick_name, u.user_name, u.email, u.avatar, u.phonenumber, u.sex, u.status, u.git_link_username,
+ u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark, d.dept_name, d.leader
+ from sys_user u
+ left join sys_dept d on u.dept_id = d.dept_id
+ where u.del_flag = '0'
+
+ AND u.user_id = #{userId}
+
+
+ AND u.user_name like concat('%', #{userName}, '%')
+
+
+ AND u.status = #{status}
+
+
+ AND u.phonenumber like concat('%', #{phonenumber}, '%')
+
+
+ AND date_format(u.create_time,'%y%m%d') >= date_format(#{params.beginTime},'%y%m%d')
+
+
+ AND date_format(u.create_time,'%y%m%d') <= date_format(#{params.endTime},'%y%m%d')
+
+
+ AND (u.dept_id = #{deptId} OR u.dept_id IN ( SELECT t.dept_id FROM sys_dept t WHERE find_in_set(#{deptId},
+ ancestors) ))
+
+
+ ${params.dataScope}
+