Compare commits
15 Commits
c9a02ec2f5
...
586f5aa2db
Author | SHA1 | Date |
---|---|---|
fanshuai | 586f5aa2db | |
fanshuai | ae0632b090 | |
fanshuai | 778df909bd | |
chenzhihang | da671bb0c3 | |
fanshuai | df87d16d8f | |
chenzhihang | e381f5a549 | |
chenzhihang | b4672c5c86 | |
chenzhihang | 4d9f831cc9 | |
chenzhihang | d2c6e9a77e | |
chenzhihang | e37dd1d0b5 | |
chenzhihang | f24e764aaa | |
chenzhihang | 85f06999b8 | |
chenzhihang | 9ac99957ed | |
chenzhihang | d42b8e918d | |
chenzhihang | 7011194adc |
|
@ -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<SysRole> 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<SysRole> getRoles()
|
||||
{
|
||||
public List<SysRole> getRoles() {
|
||||
return roles;
|
||||
}
|
||||
|
||||
public void setRoles(List<SysRole> roles)
|
||||
{
|
||||
public void setRoles(List<SysRole> 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();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -142,6 +142,11 @@
|
|||
<artifactId>docker-java</artifactId>
|
||||
<version>3.2.13</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>commons-beanutils</groupId>
|
||||
<artifactId>commons-beanutils</artifactId>
|
||||
<version>1.9.4</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.github.docker-java</groupId>
|
||||
<artifactId>docker-java-transport-httpclient5</artifactId>
|
||||
|
@ -227,7 +232,16 @@
|
|||
<version>2.6</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.eclipse.jgit</groupId>
|
||||
<artifactId>org.eclipse.jgit</artifactId>
|
||||
<version>5.13.0.202109080827-r</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>redis.clients</groupId>
|
||||
<artifactId>jedis</artifactId>
|
||||
<version>3.6.0</version>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
|
|
|
@ -5,6 +5,17 @@ public class Constant {
|
|||
public final static int Image_Type_Pub = 1; // 公共镜像
|
||||
public final static int Image_Type_Pri = 0; // 私有镜像
|
||||
|
||||
public final static int Code_Repo_Pub = 1; // 代码仓库可见性-公开
|
||||
public final static int Code_Repo_Pri = 0; // 代码仓库可见性-私有
|
||||
|
||||
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; // 未占用
|
||||
|
||||
|
||||
public final static String Computing_Resource_CPU = "CPU"; // 计算资源_CPU
|
||||
|
||||
public final static String Computing_Resource_GPU = "GPU"; // 计算资源_GPU
|
||||
}
|
||||
|
|
|
@ -5,10 +5,10 @@ import com.ruoyi.common.core.web.domain.GenericsAjaxResult;
|
|||
import com.ruoyi.platform.domain.CodeConfig;
|
||||
import com.ruoyi.platform.service.CodeConfigService;
|
||||
import io.swagger.annotations.Api;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.data.domain.Page;
|
||||
import org.springframework.data.domain.PageRequest;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
|
||||
|
@ -22,19 +22,25 @@ public class CodeConfigController extends BaseController {
|
|||
|
||||
/**
|
||||
* 分页查询
|
||||
*
|
||||
* @param codeConfig 筛选条件
|
||||
* @param page 页数
|
||||
* @param size 每页大小
|
||||
* @param page 页数
|
||||
* @param size 每页大小
|
||||
* @return 查询结果
|
||||
*/
|
||||
@GetMapping
|
||||
public GenericsAjaxResult<Page<CodeConfig>> queryByPage(CodeConfig codeConfig, int page, int size) {
|
||||
PageRequest pageRequest = PageRequest.of(page,size);
|
||||
public GenericsAjaxResult<Page<CodeConfig>> queryByPage(@RequestParam("page") int page,
|
||||
@RequestParam("size") int size,
|
||||
@RequestParam(value = "code_repo_name", required = false) String codeRepoName) {
|
||||
PageRequest pageRequest = PageRequest.of(page, size);
|
||||
CodeConfig codeConfig = new CodeConfig();
|
||||
codeConfig.setCodeRepoName(codeRepoName);
|
||||
return genericsSuccess(this.codeConfigService.queryByPage(codeConfig, pageRequest));
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过主键查询单条数据
|
||||
*
|
||||
* @param id
|
||||
* @return 单条数据
|
||||
*/
|
||||
|
@ -45,17 +51,17 @@ public class CodeConfigController extends BaseController {
|
|||
|
||||
|
||||
@PostMapping
|
||||
public GenericsAjaxResult<CodeConfig> add(@RequestBody CodeConfig codeConfig){
|
||||
public GenericsAjaxResult<CodeConfig> add(@RequestBody CodeConfig codeConfig) {
|
||||
return genericsSuccess(this.codeConfigService.insert(codeConfig));
|
||||
}
|
||||
|
||||
@PutMapping
|
||||
public GenericsAjaxResult<CodeConfig> update(@RequestBody CodeConfig codeConfig){
|
||||
public GenericsAjaxResult<CodeConfig> update(@RequestBody CodeConfig codeConfig) {
|
||||
return genericsSuccess(this.codeConfigService.update(codeConfig));
|
||||
}
|
||||
|
||||
@DeleteMapping("{id}")
|
||||
public GenericsAjaxResult<String> delete(@PathVariable("id") Long id){
|
||||
public GenericsAjaxResult<String> delete(@PathVariable("id") Long id) {
|
||||
return genericsSuccess(this.codeConfigService.removeById(id));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -224,5 +224,7 @@ public class DatasetController {
|
|||
public AjaxResult uploadDatasetPipeline(@RequestBody(required =false) DatasetVersion datasetVersion) throws Exception {
|
||||
return AjaxResult.success(this.datasetService.uploadDatasetPipeline(datasetVersion));
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,115 @@
|
|||
package com.ruoyi.platform.controller.dataset;
|
||||
|
||||
import com.ruoyi.common.core.web.domain.AjaxResult;
|
||||
import com.ruoyi.platform.domain.Dataset;
|
||||
import com.ruoyi.platform.service.DatasetService;
|
||||
import com.ruoyi.platform.vo.DatasetVo;
|
||||
import io.swagger.annotations.Api;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
import org.springframework.core.io.InputStreamResource;
|
||||
import org.springframework.data.domain.PageRequest;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
@RestController
|
||||
@RequestMapping("newdataset")
|
||||
@Api(value = "新数据集管理")
|
||||
public class NewDatasetFromGitController {
|
||||
/**
|
||||
* 服务对象
|
||||
*/
|
||||
@Resource
|
||||
private DatasetService datasetService;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 新增数据集与版本新
|
||||
*
|
||||
* @param datasetVo 实体
|
||||
* @return 新增结果
|
||||
*/
|
||||
@PostMapping("/addDatasetAndVersion")
|
||||
@ApiOperation("添加数据集和版本")
|
||||
public AjaxResult addDatasetAndVersion(@RequestBody DatasetVo datasetVo) throws Exception {
|
||||
return AjaxResult.success(this.datasetService.newCreateDataset(datasetVo));
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 新增数据集与版本新
|
||||
*
|
||||
* @param datasetVo 实体
|
||||
* @return 新增结果
|
||||
*/
|
||||
@PostMapping("/addVersion")
|
||||
@ApiOperation("添加版本")
|
||||
public AjaxResult addVersion(@RequestBody DatasetVo datasetVo) throws Exception {
|
||||
return AjaxResult.success(this.datasetService.newCreateVersion(datasetVo));
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 上传数据集
|
||||
*
|
||||
* @param files 上传的数据集文件
|
||||
* @param uuid 上传唯一标识,构建url
|
||||
* @return 上传结果
|
||||
*/
|
||||
@CrossOrigin(origins = "*", allowedHeaders = "*")
|
||||
@PostMapping("/upload")
|
||||
@ApiOperation(value = "上传数据集")
|
||||
public AjaxResult uploadDataset(@RequestParam("file") MultipartFile[] files, @RequestParam("uuid") String uuid) throws Exception {
|
||||
return AjaxResult.success(this.datasetService.uploadDatasetlocal(files,uuid));
|
||||
}
|
||||
|
||||
/**
|
||||
* 数据集打包下载
|
||||
*
|
||||
* @param version 数据集版本
|
||||
* @return 单条数据
|
||||
*/
|
||||
@GetMapping("/downloadAllFiles")
|
||||
@ApiOperation(value = "下载同一版本下所有数据集,并打包")
|
||||
public ResponseEntity<InputStreamResource> downloadAllDatasetFiles(@RequestParam("repository_name") String repositoryName, @RequestParam("version") String version) throws Exception {
|
||||
return datasetService.downloadAllDatasetFilesNew(repositoryName, version);
|
||||
}
|
||||
|
||||
/**
|
||||
* 下载数据集
|
||||
*
|
||||
* @param dataset_version_id ps:这里的id是dataset_version表的主键
|
||||
* @return 单条数据
|
||||
*/
|
||||
|
||||
@GetMapping("/download/{dataset_version_id}")
|
||||
@ApiOperation(value = "下载单个数据集文件", notes = "根据数据集版本表id下载单个数据集文件")
|
||||
public ResponseEntity<InputStreamResource> downloadDataset(@PathVariable("dataset_version_id") Integer dataset_version_id) throws Exception {
|
||||
return datasetService.downloadDataset(dataset_version_id);
|
||||
}
|
||||
|
||||
@GetMapping("/queryDatasets")
|
||||
@ApiOperation("数据集广场公开数据集分页查询,根据data_type,data_tag筛选,true公开false私有")
|
||||
public AjaxResult queryDatasets(Dataset dataset, @RequestParam("page") int page,
|
||||
@RequestParam("size") int size,
|
||||
@RequestParam(value = "is_public") Boolean isPublic,
|
||||
@RequestParam(value = "data_type", required = false) String dataType,
|
||||
@RequestParam(value = "data_tag", required = false) String dataTag) throws Exception {
|
||||
PageRequest pageRequest = PageRequest.of(page, size);
|
||||
if(isPublic){
|
||||
return AjaxResult.success(this.datasetService.newPubilcQueryByPage(dataset, pageRequest));
|
||||
}else {
|
||||
return AjaxResult.success(this.datasetService.newPersonalQueryByPage(dataset, pageRequest));
|
||||
}
|
||||
}
|
||||
|
||||
@GetMapping("/getdatasetDetail")
|
||||
@ApiOperation(value = "获取数据集详情")
|
||||
public AjaxResult getDatasetVersions(@PathVariable("datasetId") Integer datasetId) throws Exception {
|
||||
return AjaxResult.success(this.datasetService.getDatasetVersions(datasetId));
|
||||
}
|
||||
}
|
|
@ -90,7 +90,7 @@ public class JupyterController extends BaseController {
|
|||
@GetMapping(value = "/testdvc")
|
||||
public AjaxResult testdvc() throws Exception {
|
||||
DatasetVo datasetVo = new DatasetVo();
|
||||
datasetVo.setName("testdvc82sas155");
|
||||
datasetVo.setName("testdassad23");
|
||||
datasetVo.setDescription("sss");
|
||||
datasetVo.setAvailableRange(0);
|
||||
datasetVo.setDataTag("计算机视觉");
|
||||
|
@ -98,10 +98,9 @@ public class JupyterController extends BaseController {
|
|||
datasetVo.setVersion("dev");
|
||||
List<VersionVo> datasetVersionVos = new ArrayList<>();
|
||||
VersionVo versionVo = new VersionVo();
|
||||
versionVo.setUrl("/home/xxx.txt");
|
||||
versionVo.setUrl("E:/test/bb/data/xssa.doc");
|
||||
datasetVersionVos.add(versionVo);
|
||||
datasetVo.setDatasetVersionVos(datasetVersionVos);
|
||||
datasetService.newCreateDataset(datasetVo);
|
||||
return AjaxResult.success();
|
||||
return AjaxResult.success(datasetService.newCreateDataset(datasetVo));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -15,42 +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(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;
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -73,6 +73,8 @@ public interface ComputingResourceDao {
|
|||
*/
|
||||
int update(@Param("computingResource") ComputingResource computingResource);
|
||||
|
||||
int updateUsedStateByNode(@Param("node")String node, @Param("usedState") Integer usedState);
|
||||
|
||||
/**
|
||||
* 通过主键删除数据
|
||||
*
|
||||
|
|
|
@ -3,12 +3,14 @@ package com.ruoyi.platform.service;
|
|||
import com.ruoyi.platform.domain.Dataset;
|
||||
import com.ruoyi.platform.domain.DatasetVersion;
|
||||
import com.ruoyi.platform.vo.DatasetVo;
|
||||
import com.ruoyi.platform.vo.NewDatasetVo;
|
||||
import org.springframework.core.io.InputStreamResource;
|
||||
import org.springframework.data.domain.Page;
|
||||
import org.springframework.data.domain.PageRequest;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
|
@ -91,6 +93,13 @@ DatasetService {
|
|||
|
||||
|
||||
CompletableFuture<String> newCreateDataset(DatasetVo datasetVo) throws Exception;
|
||||
CompletableFuture<String> newCreateVersion(DatasetVo datasetVo);
|
||||
|
||||
|
||||
|
||||
List<Map<String, String>> uploadDatasetlocal(MultipartFile[] files, String uuid) throws Exception;
|
||||
|
||||
ResponseEntity<InputStreamResource> downloadAllDatasetFilesNew(String repositoryName, String version) throws IOException, Exception;
|
||||
Page<NewDatasetVo> newPersonalQueryByPage(Dataset dataset, PageRequest pageRequest) throws Exception;
|
||||
Page<NewDatasetVo> newPubilcQueryByPage(Dataset dataset, PageRequest pageRequest) throws Exception;
|
||||
}
|
||||
|
|
|
@ -49,9 +49,16 @@ public class CodeConfigServiceImpl implements CodeConfigService {
|
|||
|
||||
@Override
|
||||
public CodeConfig update(CodeConfig codeConfig) {
|
||||
|
||||
LoginUser loginUser = SecurityUtils.getLoginUser();
|
||||
codeConfig.setUpdateBy(loginUser.getUsername());
|
||||
codeConfig.setUpdateTime(new Date());
|
||||
|
||||
if (codeConfig.getCodeRepoVis().equals(Constant.Code_Repo_Pub)) {
|
||||
codeConfig.setVerifyMode(null);
|
||||
codeConfig.setGitUserName(null);
|
||||
codeConfig.setGitPassword(null);
|
||||
codeConfig.setSshKey(null);
|
||||
}
|
||||
this.codeConfigDao.update(codeConfig);
|
||||
return this.codeConfigDao.queryById(codeConfig.getId());
|
||||
}
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
package com.ruoyi.platform.service.impl;
|
||||
|
||||
|
||||
import com.ruoyi.common.core.utils.DateUtils;
|
||||
import com.ruoyi.common.security.utils.SecurityUtils;
|
||||
import com.ruoyi.platform.annotations.CheckDuplicate;
|
||||
|
@ -13,6 +12,7 @@ import com.ruoyi.platform.service.*;
|
|||
import com.ruoyi.platform.utils.*;
|
||||
import com.ruoyi.platform.vo.DatasetVo;
|
||||
import com.ruoyi.platform.vo.GitProjectVo;
|
||||
import com.ruoyi.platform.vo.NewDatasetVo;
|
||||
import com.ruoyi.platform.vo.VersionVo;
|
||||
import com.ruoyi.system.api.model.LoginUser;
|
||||
import io.minio.messages.Item;
|
||||
|
@ -33,10 +33,11 @@ import org.springframework.web.multipart.MultipartFile;
|
|||
import redis.clients.jedis.Jedis;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.File;
|
||||
import java.io.*;
|
||||
import java.lang.reflect.Field;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
|
@ -461,9 +462,7 @@ public class DatasetServiceImpl implements DatasetService {
|
|||
public CompletableFuture<String> newCreateDataset(DatasetVo datasetVo) {
|
||||
return CompletableFuture.supplyAsync(() -> {
|
||||
try {
|
||||
String gitusername = datasetVo.getGitusername();
|
||||
String gitpassword = datasetVo.getGitpassword();
|
||||
String token = gitService.login(gitusername, gitpassword);
|
||||
String token = gitService.login("fanshuai", "h1n2x3j4y5@");
|
||||
LoginUser loginUser = SecurityUtils.getLoginUser();
|
||||
String ci4sUsername = loginUser.getUsername();
|
||||
Jedis jedis = new Jedis(redisHost);
|
||||
|
@ -492,11 +491,69 @@ public class DatasetServiceImpl implements DatasetService {
|
|||
|
||||
// 得到用户操作的路径
|
||||
String url = datasetVo.getDatasetVersionVos().get(0).getUrl();
|
||||
String localPath = "/home/tempwork" + datasetVo.getName();
|
||||
String localPath = "E:/test/" + datasetVo.getName();
|
||||
String sourcePath = url.substring(0, url.lastIndexOf("/"));
|
||||
// 命令行操作 git clone 项目地址
|
||||
DVCUtils.gitClone(localPath, projectUrl, branchName, gitusername, gitpassword);
|
||||
DVCUtils.gitClone(localPath, projectUrl, branchName, "fanshuai", "h1n2x3j4y5@");
|
||||
String s3Path = "management-platform-files/" + ci4sUsername + "/datasets/" + repositoryName + "/" + branchName;
|
||||
//拼接生产的元数据后写入yaml文件
|
||||
YamlUtils.generateYamlFile(JsonUtils.objectToMap(datasetVo),sourcePath, "dataset");
|
||||
|
||||
DVCUtils.moveFiles(sourcePath, localPath);
|
||||
|
||||
|
||||
|
||||
// dvc init 初始化
|
||||
DVCUtils.dvcInit(localPath);
|
||||
// 配置远程S3地址
|
||||
DVCUtils.dvcRemoteAdd(localPath, s3Path);
|
||||
DVCUtils.dvcConfigS3Credentials(localPath, endpoint);
|
||||
DVCUtils.dvcConfigS3Credentials2(localPath, accessKeyId);
|
||||
DVCUtils.dvcConfigS3Credentials3(localPath, secretAccessKey);
|
||||
// dvc 跟踪
|
||||
DVCUtils.dvcAdd(localPath, "data");
|
||||
// git commit
|
||||
DVCUtils.gitAdd(localPath, ".");
|
||||
DVCUtils.gitCommit(localPath, "commit from ci4s with " + loginUser.getUsername());
|
||||
DVCUtils.gitPush(localPath, "fanshuai", "h1n2x3j4y5@");
|
||||
// dvc push 到远程S3
|
||||
DVCUtils.dvcPush(localPath);
|
||||
return "新增数据集成功";
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<String> newCreateVersion(DatasetVo datasetVo) {
|
||||
return CompletableFuture.supplyAsync(() -> {
|
||||
try {
|
||||
String token = gitService.login("fanshuai", "h1n2x3j4y5@");
|
||||
LoginUser loginUser = SecurityUtils.getLoginUser();
|
||||
String ci4sUsername = loginUser.getUsername();
|
||||
Jedis jedis = new Jedis(redisHost);
|
||||
String userReq = jedis.get(ci4sUsername + "_gitUserInfo");
|
||||
Map<String, Object> userInfo = JsonUtils.jsonToMap(userReq);
|
||||
// 创建分支
|
||||
String branchName = StringUtils.isEmpty(datasetVo.getVersion())? "master" : datasetVo.getVersion();
|
||||
String repositoryName = datasetVo.getRepositoryName();
|
||||
if (StringUtils.equals(branchName, "master")) {
|
||||
gitService.createBranch(token, (String) userInfo.get("login"), repositoryName, branchName, "master");
|
||||
}
|
||||
// 得到项目地址
|
||||
String projectUrl = gitendpoint + "/" +(String) userInfo.get("login") + "/" + repositoryName + ".git";
|
||||
|
||||
// 得到用户操作的路径
|
||||
String url = datasetVo.getDatasetVersionVos().get(0).getUrl();
|
||||
String localPath = "E:/test/"+ loginUser.getUsername()+"/datasets/"+ datasetVo.getName();
|
||||
String sourcePath = url.substring(0, url.lastIndexOf("/"));
|
||||
// 命令行操作 git clone 项目地址
|
||||
DVCUtils.gitClone(localPath, projectUrl, branchName, "fanshuai", "h1n2x3j4y5@");
|
||||
String s3Path = "management-platform-files/" + ci4sUsername + "/datasets/" + repositoryName + "/" + branchName;
|
||||
//拼接生产的元数据后写入yaml文件
|
||||
YamlUtils.generateYamlFile(JsonUtils.objectToMap(datasetVo),sourcePath, "dataset");
|
||||
|
||||
DVCUtils.moveFiles(sourcePath, localPath);
|
||||
// dvc init 初始化
|
||||
DVCUtils.dvcInit(localPath);
|
||||
|
@ -510,7 +567,7 @@ public class DatasetServiceImpl implements DatasetService {
|
|||
// git commit
|
||||
DVCUtils.gitAdd(localPath, ".");
|
||||
DVCUtils.gitCommit(localPath, "commit from ci4s with " + loginUser.getUsername());
|
||||
DVCUtils.gitPush(localPath, gitusername, gitpassword);
|
||||
DVCUtils.gitPush(localPath, "fanshuai", "h1n2x3j4y5@");
|
||||
// dvc push 到远程S3
|
||||
DVCUtils.dvcPush(localPath);
|
||||
return "新增数据集成功";
|
||||
|
@ -520,6 +577,56 @@ public class DatasetServiceImpl implements DatasetService {
|
|||
});
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public Page<NewDatasetVo> newPersonalQueryByPage(Dataset dataset, PageRequest pageRequest) throws Exception {
|
||||
LoginUser loginUser = SecurityUtils.getLoginUser();
|
||||
String token = gitService.login("fanshuai", "h1n2x3j4y5@");
|
||||
String ci4sUsername = loginUser.getUsername();
|
||||
Jedis jedis = new Jedis(redisHost);
|
||||
String userReq = jedis.get(ci4sUsername + "_gitUserInfo");
|
||||
Map<String, Object> userInfo = JsonUtils.jsonToMap(userReq);
|
||||
//拼接查询url
|
||||
String datasetTagName = dataset.getDatasetTagName();
|
||||
String datasetTypeName = dataset.getDatasetTypeName();
|
||||
String topic_name = "ci4s_dataset";
|
||||
topic_name =StringUtils.isEmpty(datasetTagName)?topic_name : topic_name+",datatag_" + datasetTagName;
|
||||
topic_name =StringUtils.isEmpty(datasetTagName)?topic_name : topic_name+",datatype_" + datasetTypeName;
|
||||
String url = gitendpoint + "/api/users/"+(String) userInfo.get("login")+"/projects.json?page="+pageRequest.getPageNumber()+"&limit="+pageRequest.getPageSize()+"&category=manage&topic_name="+topic_name;
|
||||
String req = HttpUtils.sendGetWithToken(url,null,token);
|
||||
Map<String, Object> stringObjectMap = JacksonUtil.parseJSONStr2Map(req);
|
||||
Integer total = (Integer) stringObjectMap.get("count");
|
||||
List<Map<String, Object>> projects = (List<Map<String, Object>>) stringObjectMap.get("projects");
|
||||
return new PageImpl<>(convert(projects), pageRequest, total);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Page<NewDatasetVo> newPubilcQueryByPage(Dataset dataset, PageRequest pageRequest) throws Exception {
|
||||
|
||||
LoginUser loginUser = SecurityUtils.getLoginUser();
|
||||
String token = gitService.login("fanshuai", "h1n2x3j4y5@");
|
||||
String ci4sUsername = loginUser.getUsername();
|
||||
Jedis jedis = new Jedis(redisHost);
|
||||
String userReq = jedis.get(ci4sUsername + "_gitUserInfo");
|
||||
Map<String, Object> userInfo = JsonUtils.jsonToMap(userReq);
|
||||
Integer userId = (Integer) userInfo.get("user_id");
|
||||
//拼接查询url
|
||||
String datasetTagName = dataset.getDatasetTagName();
|
||||
String datasetTypeName = dataset.getDatasetTypeName();
|
||||
String topic_name = "ci4s_dataset";
|
||||
topic_name =StringUtils.isEmpty(datasetTagName)?topic_name : topic_name+",datatag_" + datasetTagName;
|
||||
topic_name =StringUtils.isEmpty(datasetTagName)?topic_name : topic_name+",datatype_" + datasetTypeName;
|
||||
|
||||
String url = gitendpoint + "/api/projects.json?user_id="+userId+"&page="+pageRequest.getPageNumber()+"&limit="+pageRequest.getPageSize()+"&sort_by=praises_count&topic_name="+topic_name;
|
||||
String req = HttpUtils.sendGetWithToken(url,null,token);
|
||||
Map<String, Object> stringObjectMap = JacksonUtil.parseJSONStr2Map(req);
|
||||
Integer total = (Integer) stringObjectMap.get("total_count");
|
||||
List<Map<String, Object>> projects = (List<Map<String, Object>>) stringObjectMap.get("projects");
|
||||
return new PageImpl<>(convert(projects), pageRequest, total);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Map<String, String>> uploadDatasetlocal(MultipartFile[] files, String uuid) throws Exception {
|
||||
List<Map<String, String>> results = new ArrayList<>();
|
||||
|
||||
|
@ -527,7 +634,7 @@ public class DatasetServiceImpl implements DatasetService {
|
|||
// 构建objectName
|
||||
String username = SecurityUtils.getLoginUser().getUsername();
|
||||
String fileName = file.getOriginalFilename();
|
||||
String path = "/datasets/" + username + "/" + uuid + "/"+"/data/" + fileName;
|
||||
String path = "/temp/"+ username +"/datasets/"+ uuid + "/"+"/data/" + fileName;
|
||||
long sizeInBytes = file.getSize();
|
||||
String formattedSize = FileUtil.formatFileSize(sizeInBytes);
|
||||
File targetFile = new File(path, file.getOriginalFilename());
|
||||
|
@ -546,4 +653,97 @@ public class DatasetServiceImpl implements DatasetService {
|
|||
return results;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ResponseEntity<InputStreamResource> downloadAllDatasetFilesNew(String repositoryName, String version) throws Exception {
|
||||
// 命令行操作 git clone 项目地址
|
||||
LoginUser loginUser = SecurityUtils.getLoginUser();
|
||||
String token = gitService.login("fanshuai", "h1n2x3j4y5@");
|
||||
String ci4sUsername = loginUser.getUsername();
|
||||
Jedis jedis = new Jedis(redisHost);
|
||||
String userReq = jedis.get(ci4sUsername + "_gitUserInfo");
|
||||
Map<String, Object> userInfo = JsonUtils.jsonToMap(userReq);
|
||||
Integer userId = (Integer) userInfo.get("user_id");
|
||||
String projectUrl = gitendpoint + "/" +(String) userInfo.get("login") + "/" + repositoryName + ".git";
|
||||
String localPath = "E:/test/"+ loginUser.getUsername()+"/datasets/" +repositoryName;
|
||||
File folder = new File(localPath);
|
||||
if(folder.exists() && folder.isDirectory()){
|
||||
//切换分支
|
||||
DVCUtils.gitCheckoutBranch(localPath, version);
|
||||
//pull
|
||||
DVCUtils.gitPull(localPath,"fanshuai", "h1n2x3j4y5@");
|
||||
//dvc pull
|
||||
DVCUtils.dvcPull(localPath);
|
||||
}else {
|
||||
DVCUtils.gitClone(localPath, projectUrl, version, "fanshuai", "h1n2x3j4y5@");
|
||||
}
|
||||
|
||||
// 打包 data 文件夹
|
||||
String dataFolderPath = localPath + "/data";
|
||||
String zipFilePath = localPath + "/data.zip";
|
||||
try (FileOutputStream fos = new FileOutputStream(zipFilePath);
|
||||
ZipOutputStream zos = new ZipOutputStream(fos)) {
|
||||
Path sourcePath = Paths.get(dataFolderPath);
|
||||
Files.walk(sourcePath).forEach(path -> {
|
||||
if (!Files.isDirectory(path)) {
|
||||
ZipEntry zipEntry = new ZipEntry(sourcePath.relativize(path).toString());
|
||||
try {
|
||||
zos.putNextEntry(zipEntry);
|
||||
Files.copy(path, zos);
|
||||
zos.closeEntry();
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException("Error while zipping: " + path, e);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// 返回压缩文件的输入流
|
||||
File zipFile = new File(zipFilePath);
|
||||
InputStreamResource resource = new InputStreamResource(new FileInputStream(zipFile));
|
||||
|
||||
return ResponseEntity.ok()
|
||||
.header(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=data.zip")
|
||||
.contentType(MediaType.APPLICATION_OCTET_STREAM)
|
||||
.contentLength(zipFile.length())
|
||||
.body(resource);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
public List<NewDatasetVo> convert(List<Map<String, Object>> lst) {
|
||||
if (lst != null && lst.size() > 0) {
|
||||
List<NewDatasetVo> newDatasetVos = ConvertUtil.convertListMapToObjectList(lst, NewDatasetVo.class);
|
||||
|
||||
for (NewDatasetVo newDatasetVo : newDatasetVos) {
|
||||
Map<String, Object> map = lst.stream()
|
||||
.filter(m -> m.get("repo_id").equals(newDatasetVo.getRepoId()))
|
||||
.findFirst()
|
||||
.orElse(null);
|
||||
|
||||
if (map != null) {
|
||||
List<Map<String, Object>> topics = (List<Map<String, Object>>) map.get("topics");
|
||||
if (topics != null) {
|
||||
topics.forEach(topic -> {
|
||||
String name = (String) topic.get("name");
|
||||
if (name != null) {
|
||||
if (name.startsWith("datatag_")) {
|
||||
newDatasetVo.setDataTag(name.substring("datatag_".length()));
|
||||
} else if (name.startsWith("datatype_")) {
|
||||
newDatasetVo.setDataType(name.substring("datatype_".length()));
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
Map<String, Object> author = (Map<String, Object>) map.get("author");
|
||||
newDatasetVo.setCreateBy((String) author.get("name"));
|
||||
}
|
||||
}
|
||||
|
||||
return newDatasetVos;
|
||||
}
|
||||
return new ArrayList<>();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
@ -70,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;
|
||||
|
||||
|
@ -79,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("开发环境配置不存在");
|
||||
}
|
||||
|
||||
|
@ -92,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);
|
||||
|
@ -100,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, 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;
|
||||
|
||||
}
|
||||
|
||||
|
@ -114,18 +119,23 @@ 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不存在!";
|
||||
}
|
||||
|
||||
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);
|
||||
// 删除service
|
||||
|
@ -142,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状态
|
||||
|
@ -172,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();
|
||||
}
|
||||
|
@ -187,7 +197,4 @@ public class JupyterServiceImpl implements JupyterService {
|
|||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -4,10 +4,13 @@ package com.ruoyi.platform.utils;
|
|||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.BeanUtils;
|
||||
|
||||
import org.apache.commons.beanutils.PropertyUtils;
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
|
||||
/**
|
||||
|
@ -60,5 +63,64 @@ public class ConvertUtil {
|
|||
return targetList;
|
||||
}
|
||||
|
||||
public static <T> List<T> convertListMapToObjectList(List<Map<String, Object>> listMap, Class<T> targetClass) {
|
||||
List<T> resultList = new ArrayList<>();
|
||||
|
||||
if (listMap != null) {
|
||||
for (Map<String, Object> map : listMap) {
|
||||
T targetObject = convertMapToObject(map, targetClass);
|
||||
if (targetObject != null) {
|
||||
resultList.add(targetObject);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return resultList;
|
||||
}
|
||||
|
||||
private static <T> T convertMapToObject(Map<String, Object> map, Class<T> targetClass) {
|
||||
try {
|
||||
T targetObject = targetClass.newInstance();
|
||||
for (Map.Entry<String, Object> entry : map.entrySet()) {
|
||||
String key = entry.getKey();
|
||||
Object value = entry.getValue();
|
||||
String camelCaseKey = toCamelCase(key);
|
||||
if (hasProperty(targetClass, camelCaseKey)) {
|
||||
PropertyUtils.setProperty(targetObject, camelCaseKey, value);
|
||||
}
|
||||
}
|
||||
return targetObject;
|
||||
} catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private static boolean hasProperty(Class<?> clazz, String propertyName) {
|
||||
try {
|
||||
Field field = clazz.getDeclaredField(propertyName);
|
||||
return field != null;
|
||||
} catch (NoSuchFieldException e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
private static String toCamelCase(String key) {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
boolean nextUpperCase = false;
|
||||
for (char c : key.toCharArray()) {
|
||||
if (c == '_') {
|
||||
nextUpperCase = true;
|
||||
} else {
|
||||
if (nextUpperCase) {
|
||||
sb.append(Character.toUpperCase(c));
|
||||
nextUpperCase = false;
|
||||
} else {
|
||||
sb.append(c);
|
||||
}
|
||||
}
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -95,6 +95,33 @@ public class DVCUtils {
|
|||
}
|
||||
}
|
||||
|
||||
public static void gitCheckoutBranch(String localPath, String branchName) throws IOException, GitAPIException {
|
||||
FileRepositoryBuilder builder = new FileRepositoryBuilder();
|
||||
Repository repository = builder.setGitDir(new File(localPath, ".git"))
|
||||
.readEnvironment()
|
||||
.findGitDir()
|
||||
.build();
|
||||
|
||||
try (Git git = new Git(repository)) {
|
||||
CheckoutCommand checkoutCommand = git.checkout();
|
||||
checkoutCommand.setName(branchName).call();
|
||||
}
|
||||
}
|
||||
|
||||
public static void gitPull(String localPath, String username, String password) throws IOException, GitAPIException {
|
||||
FileRepositoryBuilder builder = new FileRepositoryBuilder();
|
||||
Repository repository = builder.setGitDir(new File(localPath, ".git"))
|
||||
.readEnvironment()
|
||||
.findGitDir()
|
||||
.build();
|
||||
|
||||
try (Git git = new Git(repository)) {
|
||||
CredentialsProvider credentialsProvider = new UsernamePasswordCredentialsProvider(username, password);
|
||||
PullCommand pullCommand = git.pull();
|
||||
pullCommand.setCredentialsProvider(credentialsProvider).call();
|
||||
}
|
||||
}
|
||||
|
||||
public static void dvcInit(String localPath) throws Exception {
|
||||
String command = "dvc init";
|
||||
runCommand(command, localPath);
|
||||
|
@ -111,13 +138,15 @@ public class DVCUtils {
|
|||
}
|
||||
|
||||
public static void dvcConfigS3Credentials(String localPath, String endpointurl) throws Exception {
|
||||
String command = "dvc remote modify myremote endpointurl " + endpointurl ;
|
||||
String command = "dvc remote modify myremote endpointurl " + endpointurl;
|
||||
runCommand(command, localPath);
|
||||
}
|
||||
|
||||
public static void dvcConfigS3Credentials2(String localPath, String accessKeyId) throws Exception {
|
||||
String command = "dvc remote modify myremote access_key_id " + accessKeyId;
|
||||
runCommand(command, localPath);
|
||||
}
|
||||
|
||||
public static void dvcConfigS3Credentials3(String localPath, String secretAccessKey) throws Exception {
|
||||
String command = "dvc remote modify myremote secret_access_key " + secretAccessKey;
|
||||
runCommand(command, localPath);
|
||||
|
@ -128,6 +157,7 @@ public class DVCUtils {
|
|||
runCommand(command, localPath);
|
||||
}
|
||||
|
||||
// 更新的 dvcPull 方法
|
||||
public static void dvcPull(String localPath) throws Exception {
|
||||
String command = "dvc pull";
|
||||
runCommand(command, localPath);
|
||||
|
|
|
@ -11,6 +11,7 @@ import org.apache.http.client.entity.UrlEncodedFormEntity;
|
|||
import org.apache.http.client.methods.CloseableHttpResponse;
|
||||
import org.apache.http.client.methods.HttpGet;
|
||||
import org.apache.http.client.methods.HttpPost;
|
||||
import org.apache.http.client.utils.URIBuilder;
|
||||
import org.apache.http.entity.StringEntity;
|
||||
import org.apache.http.impl.client.CloseableHttpClient;
|
||||
import org.apache.http.impl.client.DefaultHttpClient;
|
||||
|
@ -89,15 +90,61 @@ public class HttpUtils {
|
|||
public static String sendGet(String url, String param) {
|
||||
return sendGet(url, param, "UTF-8");
|
||||
}
|
||||
// /**
|
||||
// * 向指定 URL 发送带token的GET方法的请求
|
||||
// *
|
||||
// * @param url 发送请求的 URL
|
||||
// * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
|
||||
// * @return 所代表远程资源的响应结果
|
||||
// */
|
||||
// public static String sendGetWithToken(String url, String param,String token) {
|
||||
// return sendGet(url, param, "UTF-8",token);
|
||||
// }
|
||||
/**
|
||||
* 向指定 URL 发送带token的GET方法的请求
|
||||
* 向指定 URL 发送带 token 的 GET 方法的请求,使用 Apache HttpClient
|
||||
*
|
||||
* @param url 发送请求的 URL
|
||||
* @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
|
||||
* @param url 发送请求的 URL
|
||||
* @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
|
||||
* @param token 认证 token
|
||||
* @return 所代表远程资源的响应结果
|
||||
*/
|
||||
public static String sendGetWithToken(String url, String param,String token) {
|
||||
return sendGet(url, param, "UTF-8",token);
|
||||
public static String sendGetWithToken(String url, String param, String token) {
|
||||
String result = "";
|
||||
try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
|
||||
URIBuilder uriBuilder = new URIBuilder(url);
|
||||
if (param != null && !param.isEmpty()) {
|
||||
String[] pairs = param.split("&");
|
||||
for (String pair : pairs) {
|
||||
int idx = pair.indexOf("=");
|
||||
if (idx != -1) {
|
||||
uriBuilder.setParameter(pair.substring(0, idx), pair.substring(idx + 1));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
URI uri = uriBuilder.build();
|
||||
HttpGet httpGet = new HttpGet(uri);
|
||||
|
||||
httpGet.setHeader("Content-Type", "application/json");
|
||||
httpGet.setHeader("Authorization", "Bearer " + token);
|
||||
|
||||
log.info("Executing request: " + httpGet.getRequestLine());
|
||||
|
||||
try (CloseableHttpResponse response = httpClient.execute(httpGet)) {
|
||||
int statusCode = response.getStatusLine().getStatusCode();
|
||||
if (statusCode == 200) {
|
||||
result = EntityUtils.toString(response.getEntity(), StandardCharsets.UTF_8);
|
||||
} else {
|
||||
throw new IOException("HTTP request failed with response code: " + statusCode);
|
||||
}
|
||||
log.info("Response: " + result);
|
||||
}
|
||||
} catch (URISyntaxException e) {
|
||||
log.error("URISyntaxException, url=" + url + ", param=" + param, e);
|
||||
} catch (IOException e) {
|
||||
log.error("IOException, url=" + url + ", param=" + param, e);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
/**
|
||||
* 向指定 URL 发送带token的GET方法的请求
|
||||
|
|
|
@ -51,4 +51,9 @@ public class JsonUtils {
|
|||
|
||||
return flatMap;
|
||||
}
|
||||
|
||||
// 将Object转换为Map
|
||||
public static Map<String, Object> objectToMap(Object object) throws IOException {
|
||||
return objectMapper.convertValue(object, Map.class);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,25 +1,25 @@
|
|||
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.domain.DevEnvironment;
|
||||
import com.ruoyi.platform.mapper.ComputingResourceDao;
|
||||
import io.kubernetes.client.Exec;
|
||||
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.json.JSONObject;
|
||||
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;
|
||||
import java.util.*;
|
||||
|
@ -40,6 +40,9 @@ public class K8sClientUtil {
|
|||
*/
|
||||
private static ApiClient apiClient;
|
||||
|
||||
@Resource
|
||||
private ComputingResourceDao computingResourceDao;
|
||||
|
||||
/**
|
||||
* 构建集群POD内通过SA访问的客户端
|
||||
* loading the in-cluster config, including:
|
||||
|
@ -133,11 +136,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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -177,22 +180,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;
|
||||
}
|
||||
|
@ -227,16 +230,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<String, String> selector = new LinkedHashMap<String, String>();
|
||||
selector.put("k8s-jupyter", podName);
|
||||
|
@ -248,7 +252,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 已存在
|
||||
|
@ -296,17 +300,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<String, String> selector = new LinkedHashMap<String, String>();
|
||||
selector.put("k8s-jupyter", podName);
|
||||
|
@ -318,7 +323,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 已存在
|
||||
|
@ -376,47 +381,48 @@ 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, DevEnvironment devEnvironment, String dataPvcName, String datasetPath, String modelPath) {
|
||||
|
||||
//设置选择节点,pod反亲和性
|
||||
Map<String, String> selector = new LinkedHashMap<>();
|
||||
selector.put("k8s-jupyter", "CPU-GPU");
|
||||
Map<String, String> nodeSelector = new LinkedHashMap<>();
|
||||
nodeSelector.put("resource-type", "CPU-GPU");
|
||||
V1Affinity v1Affinity = new V1Affinity();
|
||||
if (Constant.Computing_Resource_GPU.equals(devEnvironment.getComputingResource())) {
|
||||
selector.put("k8s-jupyter", "CPU-GPU");
|
||||
nodeSelector.put("resource-type", "CPU-GPU");
|
||||
|
||||
V1LabelSelectorRequirement labelSelectorRequirement = new V1LabelSelectorRequirement()
|
||||
.key("k8s-jupyter").operator("NotIn").values(Collections.singletonList("CPU-GPU"));
|
||||
V1LabelSelectorRequirement labelSelectorRequirement = new V1LabelSelectorRequirement()
|
||||
.key("k8s-jupyter").operator("NotIn").values(Collections.singletonList("CPU-GPU"));
|
||||
|
||||
V1LabelSelector labelSelector = new V1LabelSelector()
|
||||
.matchExpressions(Collections.singletonList(labelSelectorRequirement));
|
||||
V1LabelSelector labelSelector = new V1LabelSelector()
|
||||
.matchExpressions(Collections.singletonList(labelSelectorRequirement));
|
||||
|
||||
V1PodAffinityTerm podAffinityTerm = new V1PodAffinityTerm()
|
||||
.labelSelector(labelSelector)
|
||||
.namespaces(Collections.singletonList(namespace))
|
||||
.topologyKey("kubernetes.io/hostname");
|
||||
V1PodAffinityTerm podAffinityTerm = new V1PodAffinityTerm()
|
||||
.labelSelector(labelSelector)
|
||||
.namespaces(Collections.singletonList(namespace))
|
||||
.topologyKey("kubernetes.io/hostname");
|
||||
|
||||
V1PodAffinity podAffinity = new V1PodAffinity()
|
||||
.requiredDuringSchedulingIgnoredDuringExecution(Collections.singletonList(podAffinityTerm));
|
||||
V1PodAffinity podAffinity = new V1PodAffinity()
|
||||
.requiredDuringSchedulingIgnoredDuringExecution(Collections.singletonList(podAffinityTerm));
|
||||
|
||||
V1LabelSelectorRequirement antiLabelSelectorRequirement = new V1LabelSelectorRequirement()
|
||||
.key("k8s-jupyter").operator("In").values(Collections.singletonList("CPU-GPU"));
|
||||
V1LabelSelectorRequirement antiLabelSelectorRequirement = new V1LabelSelectorRequirement()
|
||||
.key("k8s-jupyter").operator("In").values(Collections.singletonList("CPU-GPU"));
|
||||
|
||||
V1LabelSelector antiLabelSelector = new V1LabelSelector()
|
||||
.matchExpressions(Collections.singletonList(antiLabelSelectorRequirement));
|
||||
V1LabelSelector antiLabelSelector = new V1LabelSelector()
|
||||
.matchExpressions(Collections.singletonList(antiLabelSelectorRequirement));
|
||||
|
||||
V1PodAffinityTerm antiPodAffinityTerm = new V1PodAffinityTerm()
|
||||
.labelSelector(antiLabelSelector)
|
||||
.namespaces(Collections.singletonList(namespace))
|
||||
.topologyKey("kubernetes.io/hostname");
|
||||
V1PodAffinityTerm antiPodAffinityTerm = new V1PodAffinityTerm()
|
||||
.labelSelector(antiLabelSelector)
|
||||
.namespaces(Collections.singletonList(namespace))
|
||||
.topologyKey("kubernetes.io/hostname");
|
||||
|
||||
// V1WeightedPodAffinityTerm weightedPodAffinityTerm = new V1WeightedPodAffinityTerm().weight(100).podAffinityTerm(podAffinityTerm);
|
||||
V1PodAntiAffinity podAntiAffinity = new V1PodAntiAffinity()
|
||||
.requiredDuringSchedulingIgnoredDuringExecution(Collections.singletonList(antiPodAffinityTerm));
|
||||
|
||||
V1PodAntiAffinity podAntiAffinity = new V1PodAntiAffinity()
|
||||
.requiredDuringSchedulingIgnoredDuringExecution(Collections.singletonList(antiPodAffinityTerm));
|
||||
|
||||
V1Affinity v1Affinity = new V1Affinity()
|
||||
.podAffinity(podAffinity)
|
||||
.podAntiAffinity(podAntiAffinity);
|
||||
v1Affinity.podAffinity(podAffinity).podAntiAffinity(podAntiAffinity);
|
||||
} else {
|
||||
selector.put("k8s-jupyter", "CPU");
|
||||
}
|
||||
|
||||
// 创建Pod
|
||||
CoreV1Api api = new CoreV1Api(apiClient);
|
||||
|
@ -449,6 +455,26 @@ public class K8sClientUtil {
|
|||
volumes.add(new V1Volume().name("minio-pvc").persistentVolumeClaim(new V1PersistentVolumeClaimVolumeSource().claimName(dataPvcName)));
|
||||
|
||||
|
||||
//配置资源
|
||||
JSONObject standardJson = new JSONObject(devEnvironment.getStandard());
|
||||
JSONObject valueJson = (JSONObject) standardJson.get("value");
|
||||
int cpu = (int) valueJson.get("cpu");
|
||||
String memory = (String) valueJson.get("memory");
|
||||
memory = memory.substring(0, memory.length() - 1).concat("i");
|
||||
int gpu = (int) valueJson.get("gpu");
|
||||
|
||||
HashMap<String, Quantity> limitMap = new HashMap<>();
|
||||
if (Constant.Computing_Resource_GPU.equals(devEnvironment.getComputingResource())) {
|
||||
limitMap.put("nvidia.com/gpu", new Quantity(String.valueOf(gpu)));
|
||||
}
|
||||
limitMap.put("cpu", new Quantity(String.valueOf(cpu)));
|
||||
limitMap.put("memory", new Quantity(memory));
|
||||
limitMap.put("ephemeral-storage", new Quantity("100Gi"));
|
||||
|
||||
V1ResourceRequirements v1ResourceRequirements = new V1ResourceRequirements();
|
||||
v1ResourceRequirements.setRequests(limitMap);
|
||||
v1ResourceRequirements.setLimits(limitMap);
|
||||
|
||||
V1Pod pod = new V1PodBuilder()
|
||||
.withNewMetadata()
|
||||
.withName(podName)
|
||||
|
@ -457,9 +483,10 @@ public class K8sClientUtil {
|
|||
.withNewSpec()
|
||||
.addNewContainer()
|
||||
.withName(podName)
|
||||
.withImage(image)
|
||||
.withImage(devEnvironment.getImage())
|
||||
.withPorts(new V1ContainerPort().containerPort(port).protocol("TCP"))
|
||||
.withVolumeMounts(volumeMounts)
|
||||
.withResources(v1ResourceRequirements)
|
||||
.endContainer()
|
||||
.withVolumes(volumes)
|
||||
.withNodeSelector(nodeSelector)
|
||||
|
@ -469,6 +496,10 @@ public class K8sClientUtil {
|
|||
|
||||
try {
|
||||
pod = api.createNamespacedPod(namespace, pod, null, null, null);
|
||||
String nodeName = getNodeName(podName, namespace);
|
||||
if (Constant.Computing_Resource_GPU.equals(devEnvironment.getComputingResource())) {
|
||||
computingResourceDao.updateUsedStateByNode(nodeName, Constant.Used_State_used);
|
||||
}
|
||||
} catch (ApiException e) {
|
||||
log.error("创建pod异常:" + e.getResponseBody(), e);
|
||||
} catch (Exception e) {
|
||||
|
@ -480,14 +511,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;
|
||||
|
@ -508,12 +537,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()));
|
||||
|
@ -538,10 +567,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();
|
||||
|
@ -549,14 +579,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];
|
||||
|
@ -569,10 +600,16 @@ public class K8sClientUtil {
|
|||
return pod.getStatus().getHostIP();
|
||||
}
|
||||
|
||||
public String getPodLogs(String podName,String namespace,String container,int line) {
|
||||
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 {
|
||||
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);
|
||||
|
@ -581,7 +618,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()
|
||||
|
@ -625,7 +662,7 @@ public class K8sClientUtil {
|
|||
/**
|
||||
* 删除 Pod
|
||||
*
|
||||
* @param podName Pod 名称
|
||||
* @param podName Pod 名称
|
||||
* @param namespace 命名空间
|
||||
* @throws ApiException 异常
|
||||
*/
|
||||
|
@ -644,7 +681,7 @@ public class K8sClientUtil {
|
|||
/**
|
||||
* 删除 Service
|
||||
*
|
||||
* @param svcName Service 名称
|
||||
* @param svcName Service 名称
|
||||
* @param namespace 命名空间
|
||||
* @throws ApiException 异常
|
||||
*/
|
||||
|
@ -663,7 +700,7 @@ public class K8sClientUtil {
|
|||
/**
|
||||
* 检查 Pod 是否存在
|
||||
*
|
||||
* @param podName Pod 名称
|
||||
* @param podName Pod 名称
|
||||
* @param namespace 命名空间
|
||||
* @return 是否存在
|
||||
* @throws ApiException 异常
|
||||
|
@ -671,7 +708,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) {
|
||||
|
|
|
@ -0,0 +1,28 @@
|
|||
package com.ruoyi.platform.utils;
|
||||
|
||||
import org.yaml.snakeyaml.Yaml;
|
||||
|
||||
import java.io.FileWriter;
|
||||
import java.io.IOException;
|
||||
import java.util.Map;
|
||||
|
||||
public class YamlUtils {
|
||||
|
||||
/**
|
||||
* 将Map对象转换为YAML格式并写入指定路径的文件中
|
||||
*
|
||||
* @param data Map对象
|
||||
* @param path 文件路径
|
||||
* @param fileName 文件名
|
||||
*/
|
||||
public static void generateYamlFile(Map<String, Object> data, String path, String fileName) {
|
||||
Yaml yaml = new Yaml();
|
||||
String fullPath = path + "/" + fileName + ".yaml";
|
||||
|
||||
try (FileWriter writer = new FileWriter(fullPath)) {
|
||||
yaml.dump(data, writer);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -28,10 +28,6 @@ public class DatasetVo implements Serializable {
|
|||
@ApiModelProperty(name = "data_tag")
|
||||
private String dataTag;
|
||||
|
||||
@ApiModelProperty(name = "gitusername")
|
||||
private String gitusername;
|
||||
@ApiModelProperty(name = "gitpassword")
|
||||
private String gitpassword;
|
||||
/**
|
||||
* 版本
|
||||
*/
|
||||
|
@ -47,4 +43,10 @@ public class DatasetVo implements Serializable {
|
|||
@ApiModelProperty(name = "available_cluster")
|
||||
private String availableCluster;
|
||||
|
||||
|
||||
/**
|
||||
* 数据集仓库名称
|
||||
*/
|
||||
@ApiModelProperty(name = "repository_name")
|
||||
private String repositoryName;
|
||||
}
|
||||
|
|
|
@ -0,0 +1,67 @@
|
|||
package com.ruoyi.platform.vo;
|
||||
|
||||
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
|
||||
import com.fasterxml.jackson.databind.annotation.JsonNaming;
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
@ApiModel(description = "Git项目信息")
|
||||
@Data
|
||||
@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)
|
||||
public class GitProjectVo implements Serializable {
|
||||
|
||||
@ApiModelProperty(value = "用户或组织ID", required = true)
|
||||
private int userId;
|
||||
|
||||
@ApiModelProperty(value = "项目名称", required = true)
|
||||
private String name;
|
||||
|
||||
@ApiModelProperty(value = "项目描述", required = false)
|
||||
private String description;
|
||||
|
||||
@ApiModelProperty(value = "项目标识", required = true)
|
||||
private String repositoryName;
|
||||
|
||||
// @ApiModelProperty(value = "项目分类ID", required = false)
|
||||
// private int projectCategoryId;
|
||||
//
|
||||
// @ApiModelProperty(value = "项目语言ID", required = false)
|
||||
// private int projectLanguageId;
|
||||
|
||||
// @ApiModelProperty(value = "项目忽略文件ID", required = false)
|
||||
// private int ignoreId;
|
||||
|
||||
// @ApiModelProperty(value = "项目许可证ID", required = false)
|
||||
// private int licenseId;
|
||||
|
||||
@ApiModelProperty(value = "项目是否为私有项目", required = false)
|
||||
private boolean isPrivate;
|
||||
|
||||
// @ApiModelProperty(value = "是否为区块链激励项目", required = false)
|
||||
// private boolean blockchain;
|
||||
//
|
||||
// @ApiModelProperty(value = "区块链激励金额总数", required = false)
|
||||
// private int blockchainTokenAll;
|
||||
|
||||
//
|
||||
// @Override
|
||||
// public String toString() {
|
||||
// return "GitProjectVo{" +
|
||||
// "userId=" + userId +
|
||||
// ", name='" + name + '\'' +
|
||||
// ", description='" + description + '\'' +
|
||||
// ", repositoryName='" + repositoryName + '\'' +
|
||||
// ", projectCategoryId=" + projectCategoryId +
|
||||
// ", projectLanguageId=" + projectLanguageId +
|
||||
// ", ignoreId=" + ignoreId +
|
||||
// ", licenseId=" + licenseId +
|
||||
// ", isPrivate=" + isPrivate +
|
||||
// ", blockchain=" + blockchain +
|
||||
// ", blockchainTokenAll=" + blockchainTokenAll +
|
||||
// '}';
|
||||
// }
|
||||
}
|
||||
|
|
@ -0,0 +1,43 @@
|
|||
package com.ruoyi.platform.vo;
|
||||
|
||||
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
|
||||
import com.fasterxml.jackson.databind.annotation.JsonNaming;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
import org.apache.ibatis.annotations.MapKey;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.List;
|
||||
|
||||
@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)
|
||||
@Data
|
||||
public class NewDatasetVo implements Serializable {
|
||||
|
||||
|
||||
@ApiModelProperty(name = "name")
|
||||
private String name;
|
||||
/**
|
||||
* 数据集仓库名称
|
||||
*/
|
||||
@ApiModelProperty(name = "identifier")
|
||||
private String identifier;
|
||||
@ApiModelProperty(name = "description")
|
||||
private String description;
|
||||
/**
|
||||
* 是否公开1公开,0私有
|
||||
*/
|
||||
@ApiModelProperty(name = "is_public")
|
||||
private Boolean isPublic;
|
||||
@ApiModelProperty(name = "data_type")
|
||||
private String dataType;
|
||||
@ApiModelProperty(name = "data_tag")
|
||||
private String dataTag;
|
||||
@ApiModelProperty(name = "time_ago")
|
||||
private String timeAgo;
|
||||
@ApiModelProperty(name = "repo_id")
|
||||
private Integer repoId;
|
||||
@ApiModelProperty(name = "visits")
|
||||
private Integer visits;
|
||||
@ApiModelProperty(name = "create_by")
|
||||
private String createBy;
|
||||
}
|
|
@ -3,8 +3,9 @@
|
|||
<mapper namespace="com.ruoyi.platform.mapper.CodeConfigDao">
|
||||
|
||||
<insert id="insert">
|
||||
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})
|
||||
</insert>
|
||||
|
||||
<update id="update">
|
||||
|
@ -22,12 +23,10 @@
|
|||
<if test="codeConfig.gitBranch != null and codeConfig.gitBranch != ''">
|
||||
git_branch = #{codeConfig.gitBranch},
|
||||
</if>
|
||||
<if test="codeConfig.verifyMode != null">
|
||||
verify_mode = #{codeConfig.verifyMode},
|
||||
</if>
|
||||
<if test="codeConfig.gitUserName != null and codeConfig.gitUserName != ''">
|
||||
git_user_name = #{codeConfig.gitUserName},
|
||||
</if>
|
||||
verify_mode = #{codeConfig.verifyMode},
|
||||
git_user_name = #{codeConfig.gitUserName},
|
||||
git_password = #{codeConfig.gitPassword},
|
||||
ssh_key = #{codeConfig.sshKey},
|
||||
<if test="codeConfig.createBy != null and codeConfig.createBy != ''">
|
||||
create_by = #{codeConfig.createBy},
|
||||
</if>
|
||||
|
@ -37,12 +36,10 @@
|
|||
<if test="codeConfig.updateBy != null and codeConfig.updateBy != ''">
|
||||
update_by = #{codeConfig.updateBy},
|
||||
</if>
|
||||
<if test="codeConfig.updateTime != null">
|
||||
update_time = #{codeConfig.updateTime},
|
||||
</if>
|
||||
<if test="codeConfig.state != null">
|
||||
state = #{codeConfig.state},
|
||||
</if>
|
||||
update_time = sysdate()
|
||||
</set>
|
||||
where id = #{codeConfig.id}
|
||||
</update>
|
||||
|
@ -74,7 +71,7 @@
|
|||
and id = #{codeConfig.id}
|
||||
</if>
|
||||
<if test="codeConfig.codeRepoName != null and codeConfig.codeRepoName != ''">
|
||||
and code_repo_name = #{codeConfig.codeRepoName}
|
||||
and code_repo_name LIKE CONCAT('%', #{codeConfig.codeRepoName}, '%')
|
||||
</if>
|
||||
<if test="codeConfig.codeRepoVis != null">
|
||||
and code_repo_vis = #{codeConfig.codeRepoVis}
|
||||
|
|
|
@ -156,6 +156,10 @@ computing_resource = values(computing_resource)standard = values(standard)descri
|
|||
where id = #{computingResource.id}
|
||||
</update>
|
||||
|
||||
<update id="updateUsedStateByNode">
|
||||
update computing_resource set used_state = #{usedState} where node = #{node}
|
||||
</update>
|
||||
|
||||
<!--通过主键删除-->
|
||||
<delete id="deleteById">
|
||||
delete from computing_resource where id = #{id}
|
||||
|
|
|
@ -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<SysUser> 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<SysUser> list = userService.selectUserList(user);
|
||||
ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(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<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);
|
||||
List<SysUser> 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<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);
|
||||
util.importTemplateExcel(response, "用户数据");
|
||||
}
|
||||
|
@ -112,11 +96,9 @@ public class SysUserController extends BaseController
|
|||
*/
|
||||
@InnerAuth
|
||||
@GetMapping("/info/{username}")
|
||||
public R<LoginUser> info(@PathVariable("username") String username)
|
||||
{
|
||||
public R<LoginUser> 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<Boolean> register(@RequestBody SysUser sysUser)
|
||||
{
|
||||
public R<Boolean> 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<String> 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<SysRole> 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<SysRole> 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));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -124,4 +124,6 @@ public interface SysUserMapper
|
|||
* @return 结果
|
||||
*/
|
||||
public SysUser checkEmailUnique(String email);
|
||||
|
||||
public SysUser checktGitLinkUsernameUnique(String gitLinkUsername);
|
||||
}
|
||||
|
|
|
@ -90,6 +90,8 @@ public interface ISysUserService
|
|||
*/
|
||||
public boolean checkEmailUnique(SysUser user);
|
||||
|
||||
public boolean checktGitLinkUsernameUnique(SysUser user);
|
||||
|
||||
/**
|
||||
* 校验用户是否允许操作
|
||||
*
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
* 校验用户是否允许操作
|
||||
*
|
||||
|
|
|
@ -47,43 +47,74 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||
</resultMap>
|
||||
|
||||
<sql id="selectUserVo">
|
||||
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
|
||||
</sql>
|
||||
|
||||
<select id="selectUserList" parameterType="SysUser" resultMap="SysUserResult">
|
||||
select u.user_id, u.dept_id, u.nick_name, u.user_name, u.email, u.avatar, u.phonenumber, u.sex, u.status, 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'
|
||||
<if test="userId != null and userId != 0">
|
||||
AND u.user_id = #{userId}
|
||||
</if>
|
||||
<if test="userName != null and userName != ''">
|
||||
AND u.user_name like concat('%', #{userName}, '%')
|
||||
</if>
|
||||
<if test="status != null and status != ''">
|
||||
AND u.status = #{status}
|
||||
</if>
|
||||
<if test="phonenumber != null and phonenumber != ''">
|
||||
AND u.phonenumber like concat('%', #{phonenumber}, '%')
|
||||
</if>
|
||||
<if test="params.beginTime != null and params.beginTime != ''"><!-- 开始时间检索 -->
|
||||
AND date_format(u.create_time,'%y%m%d') >= date_format(#{params.beginTime},'%y%m%d')
|
||||
</if>
|
||||
<if test="params.endTime != null and params.endTime != ''"><!-- 结束时间检索 -->
|
||||
AND date_format(u.create_time,'%y%m%d') <= date_format(#{params.endTime},'%y%m%d')
|
||||
</if>
|
||||
<if test="deptId != null and deptId != 0">
|
||||
AND (u.dept_id = #{deptId} OR u.dept_id IN ( SELECT t.dept_id FROM sys_dept t WHERE find_in_set(#{deptId}, ancestors) ))
|
||||
</if>
|
||||
<!-- 数据范围过滤 -->
|
||||
${params.dataScope}
|
||||
</select>
|
||||
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'
|
||||
<if test="userId != null and userId != 0">
|
||||
AND u.user_id = #{userId}
|
||||
</if>
|
||||
<if test="userName != null and userName != ''">
|
||||
AND u.user_name like concat('%', #{userName}, '%')
|
||||
</if>
|
||||
<if test="status != null and status != ''">
|
||||
AND u.status = #{status}
|
||||
</if>
|
||||
<if test="phonenumber != null and phonenumber != ''">
|
||||
AND u.phonenumber like concat('%', #{phonenumber}, '%')
|
||||
</if>
|
||||
<if test="params.beginTime != null and params.beginTime != ''"><!-- 开始时间检索 -->
|
||||
AND date_format(u.create_time,'%y%m%d') >= date_format(#{params.beginTime},'%y%m%d')
|
||||
</if>
|
||||
<if test="params.endTime != null and params.endTime != ''"><!-- 结束时间检索 -->
|
||||
AND date_format(u.create_time,'%y%m%d') <= date_format(#{params.endTime},'%y%m%d')
|
||||
</if>
|
||||
<if test="deptId != null and deptId != 0">
|
||||
AND (u.dept_id = #{deptId} OR u.dept_id IN ( SELECT t.dept_id FROM sys_dept t WHERE find_in_set(#{deptId},
|
||||
ancestors) ))
|
||||
</if>
|
||||
<!-- 数据范围过滤 -->
|
||||
${params.dataScope}
|
||||
</select>
|
||||
|
||||
<select id="selectAllocatedList" parameterType="SysUser" resultMap="SysUserResult">
|
||||
select distinct u.user_id, u.dept_id, u.user_name, u.nick_name, u.email, u.phonenumber, u.status, u.create_time
|
||||
|
@ -141,8 +172,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||
<select id="checkEmailUnique" parameterType="String" resultMap="SysUserResult">
|
||||
select user_id, email from sys_user where email = #{email} and del_flag = '0' limit 1
|
||||
</select>
|
||||
|
||||
<insert id="insertUser" parameterType="SysUser" useGeneratedKeys="true" keyProperty="userId">
|
||||
|
||||
<select id="checktGitLinkUsernameUnique" resultType="com.ruoyi.system.api.domain.SysUser">
|
||||
select user_id, git_link_username
|
||||
from sys_user
|
||||
where git_link_username = #{gitLinkUsername}
|
||||
and del_flag = '0' limit 1
|
||||
</select>
|
||||
|
||||
<insert id="insertUser" parameterType="SysUser" useGeneratedKeys="true" keyProperty="userId">
|
||||
insert into sys_user(
|
||||
<if test="userId != null and userId != 0">user_id,</if>
|
||||
<if test="deptId != null and deptId != 0">dept_id,</if>
|
||||
|
@ -190,6 +228,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||
<if test="loginDate != null">login_date = #{loginDate},</if>
|
||||
<if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if>
|
||||
<if test="remark != null">remark = #{remark},</if>
|
||||
<if test="gitLinkUsername != null and gitLinkUsername != ''">git_link_username = #{gitLinkUsername},</if>
|
||||
<if test="gitLinkPassword != null and gitLinkPassword != ''">git_link_password = #{gitLinkPassword},</if>
|
||||
update_time = sysdate()
|
||||
</set>
|
||||
where user_id = #{userId}
|
||||
|
|
Loading…
Reference in New Issue