Browse Source

Merge remote-tracking branch 'upstream/dev-20190415' into dev-20190415

pull/2/head
ligang 5 years ago
parent
commit
3a4b152b1f
  1. 34
      escheduler-api/src/main/java/cn/escheduler/api/controller/TaskRecordController.java
  2. 14
      escheduler-api/src/main/java/cn/escheduler/api/controller/UsersController.java
  3. 9
      escheduler-api/src/main/java/cn/escheduler/api/service/TaskRecordService.java
  4. 13
      escheduler-api/src/main/java/cn/escheduler/api/service/UsersService.java
  5. 9
      escheduler-common/src/main/java/cn/escheduler/common/Constants.java
  6. 1
      escheduler-dao/readme.txt
  7. 94
      escheduler-dao/src/main/java/cn/escheduler/dao/ProcessDao.java
  8. 10
      escheduler-dao/src/main/java/cn/escheduler/dao/TaskRecordDao.java
  9. 9
      escheduler-dao/src/main/java/cn/escheduler/dao/mapper/UserMapper.java
  10. 18
      escheduler-dao/src/main/java/cn/escheduler/dao/mapper/UserMapperProvider.java
  11. 49
      escheduler-dao/src/main/java/cn/escheduler/dao/model/User.java
  12. 6
      escheduler-dao/src/test/java/cn/escheduler/dao/mapper/UserMapperTest.java
  13. 11
      escheduler-server/src/main/java/cn/escheduler/server/worker/runner/TaskScheduleThread.java
  14. 2
      escheduler-ui/.env
  15. 60
      escheduler-ui/src/js/conf/home/pages/dag/_source/config.js
  16. 3
      escheduler-ui/src/js/conf/home/pages/dag/_source/dag.scss
  17. 18
      escheduler-ui/src/js/conf/home/pages/dag/_source/dag.vue
  18. 6
      escheduler-ui/src/js/conf/home/pages/dag/_source/formModel/_source/selectInput.vue
  19. 16
      escheduler-ui/src/js/conf/home/pages/dag/_source/formModel/_source/timeoutAlarm.vue
  20. 73
      escheduler-ui/src/js/conf/home/pages/dag/_source/formModel/formModel.vue
  21. 30
      escheduler-ui/src/js/conf/home/pages/dag/_source/formModel/log.vue
  22. 48
      escheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/_source/commcon.js
  23. 4
      escheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/_source/datasource.vue
  24. 10
      escheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/_source/dependItemList.vue
  25. 14
      escheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/_source/localParams.vue
  26. 2
      escheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/_source/resources.vue
  27. 12
      escheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/dependent.vue
  28. 26
      escheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/mr.vue
  29. 10
      escheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/procedure.vue
  30. 8
      escheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/python.vue
  31. 8
      escheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/shell.vue
  32. 62
      escheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/spark.vue
  33. 20
      escheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/sql.vue
  34. 4
      escheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/sub_process.vue
  35. 4
      escheduler-ui/src/js/conf/home/pages/dag/_source/jumpAffirm/jumpAffirm.vue
  36. 10
      escheduler-ui/src/js/conf/home/pages/dag/_source/plugIn/jsPlumbHandle.js
  37. 20
      escheduler-ui/src/js/conf/home/pages/dag/_source/plugIn/util.js
  38. 16
      escheduler-ui/src/js/conf/home/pages/dag/_source/udp/udp.vue
  39. 8
      escheduler-ui/src/js/conf/home/pages/dag/_source/variable/variablesView.vue
  40. 64
      escheduler-ui/src/js/conf/home/pages/datasource/pages/list/_source/createDataSource.vue
  41. 28
      escheduler-ui/src/js/conf/home/pages/datasource/pages/list/_source/list.vue
  42. 55
      escheduler-ui/src/js/conf/home/pages/datasource/pages/list/index.vue
  43. 2
      escheduler-ui/src/js/conf/home/pages/home/index.vue
  44. 24
      escheduler-ui/src/js/conf/home/pages/projects/pages/_source/instanceConditions/common.js
  45. 87
      escheduler-ui/src/js/conf/home/pages/projects/pages/_source/instanceConditions/index.vue
  46. 141
      escheduler-ui/src/js/conf/home/pages/projects/pages/_source/taskRecordList/_source/conditions.vue
  47. 32
      escheduler-ui/src/js/conf/home/pages/projects/pages/_source/taskRecordList/_source/list.vue
  48. 102
      escheduler-ui/src/js/conf/home/pages/projects/pages/_source/taskRecordList/index.vue
  49. 8
      escheduler-ui/src/js/conf/home/pages/projects/pages/definition/pages/list/_source/email.vue
  50. 34
      escheduler-ui/src/js/conf/home/pages/projects/pages/definition/pages/list/_source/list.vue
  51. 46
      escheduler-ui/src/js/conf/home/pages/projects/pages/definition/pages/list/_source/start.vue
  52. 39
      escheduler-ui/src/js/conf/home/pages/projects/pages/definition/pages/list/_source/timing.vue
  53. 8
      escheduler-ui/src/js/conf/home/pages/projects/pages/definition/pages/list/_source/util.js
  54. 63
      escheduler-ui/src/js/conf/home/pages/projects/pages/definition/pages/list/index.vue
  55. 8
      escheduler-ui/src/js/conf/home/pages/projects/pages/definition/pages/tree/index.vue
  56. 24
      escheduler-ui/src/js/conf/home/pages/projects/pages/definition/timing/_source/list.vue
  57. 2
      escheduler-ui/src/js/conf/home/pages/projects/pages/definition/timing/index.vue
  58. 18
      escheduler-ui/src/js/conf/home/pages/projects/pages/historyTaskRecord/index.vue
  59. 36
      escheduler-ui/src/js/conf/home/pages/projects/pages/index/_source/projectChart.vue
  60. 2
      escheduler-ui/src/js/conf/home/pages/projects/pages/index/index.vue
  61. 31
      escheduler-ui/src/js/conf/home/pages/projects/pages/instance/index.vue
  62. 6
      escheduler-ui/src/js/conf/home/pages/projects/pages/instance/pages/gantt/index.vue
  63. 69
      escheduler-ui/src/js/conf/home/pages/projects/pages/instance/pages/list/_source/list.vue
  64. 27
      escheduler-ui/src/js/conf/home/pages/projects/pages/instance/pages/list/index.vue
  65. 12
      escheduler-ui/src/js/conf/home/pages/projects/pages/list/_source/createProject.vue
  66. 24
      escheduler-ui/src/js/conf/home/pages/projects/pages/list/_source/list.vue
  67. 63
      escheduler-ui/src/js/conf/home/pages/projects/pages/list/index.vue
  68. 24
      escheduler-ui/src/js/conf/home/pages/projects/pages/taskInstance/_source/list.vue
  69. 108
      escheduler-ui/src/js/conf/home/pages/projects/pages/taskInstance/index.vue
  70. 139
      escheduler-ui/src/js/conf/home/pages/projects/pages/taskInstance/pages/list/index.vue
  71. 14
      escheduler-ui/src/js/conf/home/pages/projects/pages/taskRecord/index.vue
  72. 195
      escheduler-ui/src/js/conf/home/pages/projects/pages/taskRecord/pages/list/index.vue
  73. 2
      escheduler-ui/src/js/conf/home/pages/projects/pages/timing/index.vue
  74. 22
      escheduler-ui/src/js/conf/home/pages/resource/pages/file/pages/create/index.vue
  75. 2
      escheduler-ui/src/js/conf/home/pages/resource/pages/file/pages/details/_source/noType.vue
  76. 4
      escheduler-ui/src/js/conf/home/pages/resource/pages/file/pages/details/index.vue
  77. 6
      escheduler-ui/src/js/conf/home/pages/resource/pages/file/pages/edit/index.vue
  78. 28
      escheduler-ui/src/js/conf/home/pages/resource/pages/file/pages/list/_source/list.vue
  79. 12
      escheduler-ui/src/js/conf/home/pages/resource/pages/file/pages/list/_source/rename.vue
  80. 67
      escheduler-ui/src/js/conf/home/pages/resource/pages/file/pages/list/index.vue
  81. 34
      escheduler-ui/src/js/conf/home/pages/resource/pages/udf/pages/function/_source/createUdf.vue
  82. 30
      escheduler-ui/src/js/conf/home/pages/resource/pages/udf/pages/function/_source/list.vue
  83. 57
      escheduler-ui/src/js/conf/home/pages/resource/pages/udf/pages/function/index.vue
  84. 28
      escheduler-ui/src/js/conf/home/pages/resource/pages/udf/pages/resource/_source/list.vue
  85. 12
      escheduler-ui/src/js/conf/home/pages/resource/pages/udf/pages/resource/_source/rename.vue
  86. 58
      escheduler-ui/src/js/conf/home/pages/resource/pages/udf/pages/resource/index.vue
  87. 28
      escheduler-ui/src/js/conf/home/pages/security/pages/queue/_source/createQueue.vue
  88. 20
      escheduler-ui/src/js/conf/home/pages/security/pages/queue/_source/list.vue
  89. 51
      escheduler-ui/src/js/conf/home/pages/security/pages/queue/index.vue
  90. 12
      escheduler-ui/src/js/conf/home/pages/security/pages/servers/_source/list.vue
  91. 2
      escheduler-ui/src/js/conf/home/pages/security/pages/servers/pages/master/index.vue
  92. 2
      escheduler-ui/src/js/conf/home/pages/security/pages/servers/pages/worker/index.vue
  93. 32
      escheduler-ui/src/js/conf/home/pages/security/pages/tenement/_source/createTenement.vue
  94. 26
      escheduler-ui/src/js/conf/home/pages/security/pages/tenement/_source/list.vue
  95. 52
      escheduler-ui/src/js/conf/home/pages/security/pages/tenement/index.vue
  96. 73
      escheduler-ui/src/js/conf/home/pages/security/pages/users/_source/createUser.vue
  97. 52
      escheduler-ui/src/js/conf/home/pages/security/pages/users/_source/list.vue
  98. 51
      escheduler-ui/src/js/conf/home/pages/security/pages/users/index.vue
  99. 18
      escheduler-ui/src/js/conf/home/pages/security/pages/warningGroups/_source/createWarning.vue
  100. 30
      escheduler-ui/src/js/conf/home/pages/security/pages/warningGroups/_source/list.vue
  101. Some files were not shown because too many files have changed in this diff Show More

34
escheduler-api/src/main/java/cn/escheduler/api/controller/TaskRecordController.java

@ -68,7 +68,7 @@ public class TaskRecordController extends BaseController{
try{ try{
logger.info("query task record list, task name:{}, state :{}, taskDate: {}, start:{}, end:{}", logger.info("query task record list, task name:{}, state :{}, taskDate: {}, start:{}, end:{}",
taskName, state, taskDate, startTime, endTime); taskName, state, taskDate, startTime, endTime);
Map<String, Object> result = taskRecordService.queryTaskRecordListPaging(taskName, startTime, taskDate, sourceTable, destTable, endTime,state, pageNo, pageSize); Map<String, Object> result = taskRecordService.queryTaskRecordListPaging(false, taskName, startTime, taskDate, sourceTable, destTable, endTime,state, pageNo, pageSize);
return returnDataListPaging(result); return returnDataListPaging(result);
}catch (Exception e){ }catch (Exception e){
logger.error(QUERY_TASK_RECORD_LIST_PAGING_ERROR.getMsg(),e); logger.error(QUERY_TASK_RECORD_LIST_PAGING_ERROR.getMsg(),e);
@ -77,4 +77,36 @@ public class TaskRecordController extends BaseController{
} }
/**
* query history task record list paging
*
* @param loginUser
* @return
*/
@GetMapping("/history-list-paging")
@ResponseStatus(HttpStatus.OK)
public Result queryHistoryTaskRecordListPaging(@RequestAttribute(value = Constants.SESSION_USER) User loginUser,
@RequestParam(value = "taskName", required = false) String taskName,
@RequestParam(value = "state", required = false) String state,
@RequestParam(value = "sourceTable", required = false) String sourceTable,
@RequestParam(value = "destTable", required = false) String destTable,
@RequestParam(value = "taskDate", required = false) String taskDate,
@RequestParam(value = "startDate", required = false) String startTime,
@RequestParam(value = "endDate", required = false) String endTime,
@RequestParam("pageNo") Integer pageNo,
@RequestParam("pageSize") Integer pageSize
){
try{
logger.info("query hisotry task record list, task name:{}, state :{}, taskDate: {}, start:{}, end:{}",
taskName, state, taskDate, startTime, endTime);
Map<String, Object> result = taskRecordService.queryTaskRecordListPaging(true, taskName, startTime, taskDate, sourceTable, destTable, endTime,state, pageNo, pageSize);
return returnDataListPaging(result);
}catch (Exception e){
logger.error(QUERY_TASK_RECORD_LIST_PAGING_ERROR.getMsg(),e);
return error(QUERY_TASK_RECORD_LIST_PAGING_ERROR.getCode(), QUERY_TASK_RECORD_LIST_PAGING_ERROR.getMsg());
}
}
} }

14
escheduler-api/src/main/java/cn/escheduler/api/controller/UsersController.java

@ -64,13 +64,14 @@ public class UsersController extends BaseController{
@RequestParam(value = "userName") String userName, @RequestParam(value = "userName") String userName,
@RequestParam(value = "userPassword") String userPassword, @RequestParam(value = "userPassword") String userPassword,
@RequestParam(value = "tenantId") int tenantId, @RequestParam(value = "tenantId") int tenantId,
@RequestParam(value = "queue") String queue,
@RequestParam(value = "email") String email, @RequestParam(value = "email") String email,
@RequestParam(value = "phone", required = false) String phone) { @RequestParam(value = "phone", required = false) String phone) {
logger.info("login user {}, create user, userName: {}, email: {}, tenantId: {}, userPassword: {}, phone: {}, proxyUsers: {}", logger.info("login user {}, create user, userName: {}, email: {}, tenantId: {}, userPassword: {}, phone: {}, user queue: {}",
loginUser.getUserName(), userName, email, tenantId, Constants.PASSWORD_DEFAULT, phone); loginUser.getUserName(), userName, email, tenantId, Constants.PASSWORD_DEFAULT, phone,queue);
try { try {
Map<String, Object> result = usersService.createUser(loginUser, userName, userPassword, email, tenantId, phone); Map<String, Object> result = usersService.createUser(loginUser, userName, userPassword,email,tenantId, phone,queue);
return returnDataList(result); return returnDataList(result);
}catch (Exception e){ }catch (Exception e){
logger.error(CREATE_USER_ERROR.getMsg(),e); logger.error(CREATE_USER_ERROR.getMsg(),e);
@ -127,13 +128,14 @@ public class UsersController extends BaseController{
@RequestParam(value = "id") int id, @RequestParam(value = "id") int id,
@RequestParam(value = "userName") String userName, @RequestParam(value = "userName") String userName,
@RequestParam(value = "userPassword") String userPassword, @RequestParam(value = "userPassword") String userPassword,
@RequestParam(value = "queue") String queue,
@RequestParam(value = "email") String email, @RequestParam(value = "email") String email,
@RequestParam(value = "tenantId") int tenantId, @RequestParam(value = "tenantId") int tenantId,
@RequestParam(value = "phone", required = false) String phone) { @RequestParam(value = "phone", required = false) String phone) {
logger.info("login user {}, updateProcessInstance user, userName: {}, email: {}, tenantId: {}, userPassword: {}, phone: {}, proxyUsers: {}", logger.info("login user {}, updateProcessInstance user, userName: {}, email: {}, tenantId: {}, userPassword: {}, phone: {}, user queue: {}",
loginUser.getUserName(), userName, email, tenantId, Constants.PASSWORD_DEFAULT, phone); loginUser.getUserName(), userName, email, tenantId, Constants.PASSWORD_DEFAULT, phone,queue);
try { try {
Map<String, Object> result = usersService.updateUser(id,userName,userPassword,email,tenantId,phone); Map<String, Object> result = usersService.updateUser(id,userName,userPassword,email,tenantId,phone,queue);
return returnDataList(result); return returnDataList(result);
}catch (Exception e){ }catch (Exception e){
logger.error(UPDATE_USER_ERROR.getMsg(),e); logger.error(UPDATE_USER_ERROR.getMsg(),e);

9
escheduler-api/src/main/java/cn/escheduler/api/service/TaskRecordService.java

@ -29,6 +29,8 @@ import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import static cn.escheduler.common.Constants.*;
/** /**
* task record service * task record service
*/ */
@ -51,7 +53,7 @@ public class TaskRecordService extends BaseService{
* @param pageSize * @param pageSize
* @return * @return
*/ */
public Map<String,Object> queryTaskRecordListPaging(String taskName, String startDate, public Map<String,Object> queryTaskRecordListPaging(boolean isHistory, String taskName, String startDate,
String taskDate, String sourceTable, String taskDate, String sourceTable,
String destTable, String endDate, String destTable, String endDate,
String state, Integer pageNo, Integer pageSize) { String state, Integer pageNo, Integer pageSize) {
@ -69,8 +71,9 @@ public class TaskRecordService extends BaseService{
map.put("offset", pageInfo.getStart().toString()); map.put("offset", pageInfo.getStart().toString());
map.put("pageSize", pageInfo.getPageSize().toString()); map.put("pageSize", pageInfo.getPageSize().toString());
int count = TaskRecordDao.countTaskRecord(map); String table = isHistory ? TASK_RECORD_TABLE_HISTORY_HIVE_LOG : TASK_RECORD_TABLE_HIVE_LOG;
List<TaskRecord> recordList = TaskRecordDao.queryAllTaskRecord(map); int count = TaskRecordDao.countTaskRecord(map, table);
List<TaskRecord> recordList = TaskRecordDao.queryAllTaskRecord(map, table);
pageInfo.setTotalCount(count); pageInfo.setTotalCount(count);
pageInfo.setLists(recordList); pageInfo.setLists(recordList);
result.put(Constants.DATA_LIST, pageInfo); result.put(Constants.DATA_LIST, pageInfo);

13
escheduler-api/src/main/java/cn/escheduler/api/service/UsersService.java

@ -87,7 +87,8 @@ public class UsersService extends BaseService {
String userPassword, String userPassword,
String email, String email,
int tenantId, int tenantId,
String phone) throws Exception { String phone,
String queue) throws Exception {
Map<String, Object> result = new HashMap<>(5); Map<String, Object> result = new HashMap<>(5);
result = CheckUtils.checkUserParams(userName, userPassword, email, phone); result = CheckUtils.checkUserParams(userName, userPassword, email, phone);
@ -114,6 +115,7 @@ public class UsersService extends BaseService {
user.setUserType(UserType.GENERAL_USER); user.setUserType(UserType.GENERAL_USER);
user.setCreateTime(now); user.setCreateTime(now);
user.setUpdateTime(now); user.setUpdateTime(now);
user.setQueue(queue);
// save user // save user
userMapper.insert(user); userMapper.insert(user);
@ -194,7 +196,13 @@ public class UsersService extends BaseService {
* @param phone * @param phone
* @return * @return
*/ */
public Map<String, Object> updateUser(int userId, String userName, String userPassword, String email, int tenantId, String phone) throws Exception { public Map<String, Object> updateUser(int userId,
String userName,
String userPassword,
String email,
int tenantId,
String phone,
String queue) throws Exception {
Map<String, Object> result = new HashMap<>(5); Map<String, Object> result = new HashMap<>(5);
result.put(Constants.STATUS, false); result.put(Constants.STATUS, false);
@ -218,6 +226,7 @@ public class UsersService extends BaseService {
if (StringUtils.isNotEmpty(email)) { if (StringUtils.isNotEmpty(email)) {
user.setEmail(email); user.setEmail(email);
} }
user.setQueue(queue);
user.setPhone(phone); user.setPhone(phone);
user.setUpdateTime(now); user.setUpdateTime(now);

9
escheduler-common/src/main/java/cn/escheduler/common/Constants.java

@ -463,6 +463,10 @@ public final class Constants {
public static final String TASK_RECORD_PWD = "task.record.datasource.password"; public static final String TASK_RECORD_PWD = "task.record.datasource.password";
public static String TASK_RECORD_TABLE_HIVE_LOG = "eamp_hive_log_hd";
public static String TASK_RECORD_TABLE_HISTORY_HIVE_LOG = "eamp_hive_hist_log_hd";
public static final String STATUS = "status"; public static final String STATUS = "status";
@ -826,4 +830,9 @@ public final class Constants {
public static final String CONTENT = "content"; public static final String CONTENT = "content";
public static final String DEPENDENT_SPLIT = ":||"; public static final String DEPENDENT_SPLIT = ":||";
public static final String DEPENDENT_ALL = "ALL"; public static final String DEPENDENT_ALL = "ALL";
/**
*
*/
} }

1
escheduler-dao/readme.txt

@ -0,0 +1 @@
alter table t_escheduler_user add queue varchar(64);

94
escheduler-dao/src/main/java/cn/escheduler/dao/ProcessDao.java

@ -59,7 +59,7 @@ public class ProcessDao extends AbstractBaseDao {
ExecutionStatus.READY_STOP.ordinal()}; ExecutionStatus.READY_STOP.ordinal()};
@Autowired @Autowired
private ProjectMapper projectMapper; private UserMapper userMapper;
@Autowired @Autowired
private ProcessDefinitionMapper processDefineMapper; private ProcessDefinitionMapper processDefineMapper;
@ -102,7 +102,7 @@ public class ProcessDao extends AbstractBaseDao {
*/ */
@Override @Override
protected void init() { protected void init() {
projectMapper = getMapper(ProjectMapper.class); userMapper=getMapper(UserMapper.class);
processDefineMapper = getMapper(ProcessDefinitionMapper.class); processDefineMapper = getMapper(ProcessDefinitionMapper.class);
processInstanceMapper = getMapper(ProcessInstanceMapper.class); processInstanceMapper = getMapper(ProcessInstanceMapper.class);
dataSourceMapper = getMapper(DataSourceMapper.class); dataSourceMapper = getMapper(DataSourceMapper.class);
@ -120,48 +120,64 @@ public class ProcessDao extends AbstractBaseDao {
* find one command from command queue, construct process instance * find one command from command queue, construct process instance
* @param logger * @param logger
* @param host * @param host
* @param vaildThreadNum * @param validThreadNum
* @return * @return
*/ */
@Transactional(value = "TransactionManager",rollbackFor = Exception.class) @Transactional(value = "TransactionManager",rollbackFor = Exception.class)
public ProcessInstance scanCommand(Logger logger, String host, int vaildThreadNum){ public ProcessInstance scanCommand(Logger logger, String host, int validThreadNum){
ProcessInstance processInstance = null; ProcessInstance processInstance = null;
Command command = findOneCommand(); Command command = findOneCommand();
if (command == null) { if (command == null) {
return null; return null;
} }
logger.info(String.format("find one command: id: %d, type: %s", command.getId(),command.getCommandType().toString())); logger.info(String.format("find one command: id: %d, type: %s", command.getId(),command.getCommandType().toString()));
processInstance = constructProcessInstance(command, host); try{
processInstance = constructProcessInstance(command, host);
//cannot construct process instance, return null; //cannot construct process instance, return null;
if(processInstance == null){ if(processInstance == null){
logger.error("scan command, command parameter is error: %s", command.toString()); logger.error("scan command, command parameter is error: %s", command.toString());
}else{ delCommandByid(command.getId());
// check thread number enough for this command, if not, change state to waiting thread.
int commandThreadCount = this.workProcessThreadNumCount(command.getProcessDefinitionId());
if(vaildThreadNum < commandThreadCount){
logger.info("there is not enough thread for this command: {}",command.toString() );
processInstance.setState(ExecutionStatus.WAITTING_THREAD);
if(command.getCommandType() != CommandType.RECOVER_WAITTING_THREAD){
processInstance.addHistoryCmd(command.getCommandType());
}
saveProcessInstance(processInstance);
this.setSubProcessParam(processInstance);
createRecoveryWaitingThreadCommand(command, processInstance);
return null; return null;
}else if(!checkThreadNum(command, validThreadNum)){
logger.info("there is not enough thread for this command: {}",command.toString() );
return setWaitingThreadProcess(command, processInstance);
}else{ }else{
processInstance.setCommandType(command.getCommandType()); processInstance.setCommandType(command.getCommandType());
processInstance.addHistoryCmd(command.getCommandType()); processInstance.addHistoryCmd(command.getCommandType());
saveProcessInstance(processInstance); saveProcessInstance(processInstance);
this.setSubProcessParam(processInstance); this.setSubProcessParam(processInstance);
delCommandByid(command.getId());
return processInstance;
} }
}catch (Exception e){
logger.error("scan command error ", e);
delCommandByid(command.getId());
} }
// delete command return null;
delCommandByid(command.getId()); }
return processInstance;
/**
* set process waiting thread
* @param command
* @param processInstance
* @return
*/
private ProcessInstance setWaitingThreadProcess(Command command, ProcessInstance processInstance) {
processInstance.setState(ExecutionStatus.WAITTING_THREAD);
if(command.getCommandType() != CommandType.RECOVER_WAITTING_THREAD){
processInstance.addHistoryCmd(command.getCommandType());
}
saveProcessInstance(processInstance);
this.setSubProcessParam(processInstance);
createRecoveryWaitingThreadCommand(command, processInstance);
return null;
}
private boolean checkThreadNum(Command command, int validThreadNum) {
int commandThreadCount = this.workProcessThreadNumCount(command.getProcessDefinitionId());
return validThreadNum >= commandThreadCount;
} }
/** /**
@ -245,7 +261,7 @@ public class ProcessDao extends AbstractBaseDao {
public ProcessInstance findProcessInstanceByScheduleTime(int defineId, Date scheduleTime){ public ProcessInstance findProcessInstanceByScheduleTime(int defineId, Date scheduleTime){
return processInstanceMapper.queryByScheduleTime(defineId, return processInstanceMapper.queryByScheduleTime(defineId,
DateUtils.dateToString(scheduleTime), 0,null, null); DateUtils.dateToString(scheduleTime), 0, null, null);
} }
/** /**
@ -669,7 +685,7 @@ public class ProcessDao extends AbstractBaseDao {
paramMap.put(CMDPARAM_SUB_PROCESS, String.valueOf(processInstance.getId())); paramMap.put(CMDPARAM_SUB_PROCESS, String.valueOf(processInstance.getId()));
processInstance.setCommandParam(JSONUtils.toJson(paramMap)); processInstance.setCommandParam(JSONUtils.toJson(paramMap));
processInstance.setIsSubProcess(Flag.YES); processInstance.setIsSubProcess(Flag.YES);
this.updateProcessInstance(processInstance); this.saveProcessInstance(processInstance);
} }
// copy parent instance user def params to sub process.. // copy parent instance user def params to sub process..
String parentInstanceId = paramMap.get(CMDPARAM_SUB_PROCESS_PARENT_INSTANCE_ID); String parentInstanceId = paramMap.get(CMDPARAM_SUB_PROCESS_PARENT_INSTANCE_ID);
@ -677,7 +693,7 @@ public class ProcessDao extends AbstractBaseDao {
ProcessInstance parentInstance = findProcessInstanceDetailById(Integer.parseInt(parentInstanceId)); ProcessInstance parentInstance = findProcessInstanceDetailById(Integer.parseInt(parentInstanceId));
if(parentInstance != null){ if(parentInstance != null){
processInstance.setGlobalParams(parentInstance.getGlobalParams()); processInstance.setGlobalParams(parentInstance.getGlobalParams());
this.updateProcessInstance(processInstance); this.saveProcessInstance(processInstance);
}else{ }else{
logger.error("sub process command params error, cannot find parent instance: {} ", cmdParam); logger.error("sub process command params error, cannot find parent instance: {} ", cmdParam);
} }
@ -1194,7 +1210,7 @@ public class ProcessDao extends AbstractBaseDao {
public int updateProcessInstance(Integer processInstanceId, String processJson, public int updateProcessInstance(Integer processInstanceId, String processJson,
String globalParams, Date scheduleTime, Flag flag, String globalParams, Date scheduleTime, Flag flag,
String locations, String connects){ String locations, String connects){
return processInstanceMapper.updateProcessInstance( processInstanceId, processJson, return processInstanceMapper.updateProcessInstance(processInstanceId, processJson,
globalParams, scheduleTime, locations, connects, flag); globalParams, scheduleTime, locations, connects, flag);
} }
@ -1538,4 +1554,16 @@ public class ProcessDao extends AbstractBaseDao {
DateUtils.dateToString(dateInterval.getEndTime()), DateUtils.dateToString(dateInterval.getEndTime()),
stateArray); stateArray);
} }
/**
* query user queue by process instance id
* @param processInstanceId
* @return
*/
public String queryQueueByProcessInstanceId(int processInstanceId){
return userMapper.queryQueueByProcessInstanceId(processInstanceId);
}
} }

10
escheduler-dao/src/main/java/cn/escheduler/dao/TaskRecordDao.java

@ -40,6 +40,8 @@ public class TaskRecordDao {
private static Logger logger = LoggerFactory.getLogger(TaskRecordDao.class.getName()); private static Logger logger = LoggerFactory.getLogger(TaskRecordDao.class.getName());
/** /**
* 加载配置文件 * 加载配置文件
*/ */
@ -134,7 +136,7 @@ public class TaskRecordDao {
* @param filterMap * @param filterMap
* @return * @return
*/ */
public static int countTaskRecord(Map<String, String> filterMap){ public static int countTaskRecord(Map<String, String> filterMap, String table){
int count = 0; int count = 0;
Connection conn = null; Connection conn = null;
@ -143,7 +145,7 @@ public class TaskRecordDao {
if(conn == null){ if(conn == null){
return count; return count;
} }
String sql = "select count(1) as count from eamp_hive_log_hd"; String sql = String.format("select count(1) as count from %s", table);
sql += getWhereString(filterMap); sql += getWhereString(filterMap);
PreparedStatement pstmt; PreparedStatement pstmt;
pstmt = conn.prepareStatement(sql); pstmt = conn.prepareStatement(sql);
@ -171,9 +173,9 @@ public class TaskRecordDao {
* @param filterMap * @param filterMap
* @return * @return
*/ */
public static List<TaskRecord> queryAllTaskRecord(Map<String,String> filterMap ) { public static List<TaskRecord> queryAllTaskRecord(Map<String,String> filterMap , String table) {
String sql = "select * from eamp_hive_log_hd "; String sql = String.format("select * from %s", table);
sql += getWhereString(filterMap); sql += getWhereString(filterMap);
int offset = Integer.parseInt(filterMap.get("offset")); int offset = Integer.parseInt(filterMap.get("offset"));

9
escheduler-dao/src/main/java/cn/escheduler/dao/mapper/UserMapper.java

@ -222,4 +222,13 @@ public interface UserMapper {
}) })
@SelectProvider(type = UserMapperProvider.class, method = "queryTenantCodeByUserId") @SelectProvider(type = UserMapperProvider.class, method = "queryTenantCodeByUserId")
User queryTenantCodeByUserId(@Param("userId") int userId); User queryTenantCodeByUserId(@Param("userId") int userId);
/**
* query user queue by process instance id
* @param processInstanceId
* @return
*/
@SelectProvider(type = UserMapperProvider.class, method = "queryQueueByProcessInstanceId")
String queryQueueByProcessInstanceId(@Param("processInstanceId") int processInstanceId);
} }

18
escheduler-dao/src/main/java/cn/escheduler/dao/mapper/UserMapperProvider.java

@ -47,6 +47,7 @@ public class UserMapperProvider {
VALUES("`phone`", "#{user.phone}"); VALUES("`phone`", "#{user.phone}");
VALUES("`user_type`", EnumFieldUtil.genFieldStr("user.userType", UserType.class)); VALUES("`user_type`", EnumFieldUtil.genFieldStr("user.userType", UserType.class));
VALUES("`tenant_id`", "#{user.tenantId}"); VALUES("`tenant_id`", "#{user.tenantId}");
VALUES("`queue`", "#{user.queue}");
VALUES("`create_time`", "#{user.createTime}"); VALUES("`create_time`", "#{user.createTime}");
VALUES("`update_time`", "#{user.updateTime}"); VALUES("`update_time`", "#{user.updateTime}");
} }
@ -86,6 +87,7 @@ public class UserMapperProvider {
SET("`phone`=#{user.phone}"); SET("`phone`=#{user.phone}");
SET("`user_type`="+EnumFieldUtil.genFieldStr("user.userType", UserType.class)); SET("`user_type`="+EnumFieldUtil.genFieldStr("user.userType", UserType.class));
SET("`tenant_id`=#{user.tenantId}"); SET("`tenant_id`=#{user.tenantId}");
SET("`queue`=#{user.queue}");
SET("`create_time`=#{user.createTime}"); SET("`create_time`=#{user.createTime}");
SET("`update_time`=#{user.updateTime}"); SET("`update_time`=#{user.updateTime}");
@ -247,4 +249,20 @@ public class UserMapperProvider {
}.toString(); }.toString();
} }
/**
* query tenant code by user id
* @param parameter
* @return
*/
public String queryQueueByProcessInstanceId(Map<String, Object> parameter) {
return new SQL() {
{
SELECT("queue");
FROM(TABLE_NAME + " u,t_escheduler_process_instance p");
WHERE("u.id = p.executor_id and p.id=#{processInstanceId}");
}
}.toString();
}
} }

49
escheduler-dao/src/main/java/cn/escheduler/dao/model/User.java

@ -79,6 +79,12 @@ public class User {
* alert group * alert group
*/ */
private String alertGroup; private String alertGroup;
/**
* user specified queue
*/
private String queue;
/** /**
* create time * create time
*/ */
@ -194,23 +200,12 @@ public class User {
this.tenantCode = tenantCode; this.tenantCode = tenantCode;
} }
@Override public String getQueue() {
public String toString() { return queue;
return "User{" + }
"id=" + id +
", userName='" + userName + '\'' + public void setQueue(String queue) {
", userPassword='" + userPassword + '\'' + this.queue = queue;
", email='" + email + '\'' +
", phone='" + phone + '\'' +
", userType=" + userType +
", tenantId=" + tenantId +
", tenantCode='" + tenantCode + '\'' +
", tenantName='" + tenantName + '\'' +
", queueName='" + queueName + '\'' +
", alertGroup='" + alertGroup + '\'' +
", createTime=" + createTime +
", updateTime=" + updateTime +
'}';
} }
@Override @Override
@ -237,4 +232,24 @@ public class User {
result = 31 * result + userName.hashCode(); result = 31 * result + userName.hashCode();
return result; return result;
} }
@Override
public String toString() {
return "User{" +
"id=" + id +
", userName='" + userName + '\'' +
", userPassword='" + userPassword + '\'' +
", email='" + email + '\'' +
", phone='" + phone + '\'' +
", userType=" + userType +
", tenantId=" + tenantId +
", tenantCode='" + tenantCode + '\'' +
", tenantName='" + tenantName + '\'' +
", queueName='" + queueName + '\'' +
", alertGroup='" + alertGroup + '\'' +
", queue='" + queue + '\'' +
", createTime=" + createTime +
", updateTime=" + updateTime +
'}';
}
} }

6
escheduler-dao/src/test/java/cn/escheduler/dao/mapper/UserMapperTest.java

@ -60,4 +60,10 @@ public class UserMapperTest {
} }
@Test
public void queryQueueByProcessInstanceId(){
String queue = userMapper.queryQueueByProcessInstanceId(41388);
Assert.assertEquals(queue, "ait");
}
} }

11
escheduler-server/src/main/java/cn/escheduler/server/worker/runner/TaskScheduleThread.java

@ -36,6 +36,7 @@ import cn.escheduler.server.worker.task.AbstractTask;
import cn.escheduler.server.worker.task.TaskManager; import cn.escheduler.server.worker.task.TaskManager;
import cn.escheduler.server.worker.task.TaskProps; import cn.escheduler.server.worker.task.TaskProps;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@ -154,12 +155,18 @@ public class TaskScheduleThread implements Callable<Boolean> {
taskProps.setTenantCode(taskInstance.getProcessInstance().getTenantCode()); taskProps.setTenantCode(taskInstance.getProcessInstance().getTenantCode());
ProcessInstance processInstance = processDao.findProcessInstanceByTaskId(taskInstance.getId()); ProcessInstance processInstance = processDao.findProcessInstanceByTaskId(taskInstance.getId());
String queue = processDao.queryQueueByProcessInstanceId(processInstance.getId());
taskProps.setScheduleTime(processInstance.getScheduleTime()); taskProps.setScheduleTime(processInstance.getScheduleTime());
taskProps.setNodeName(taskInstance.getName()); taskProps.setNodeName(taskInstance.getName());
taskProps.setTaskInstId(taskInstance.getId()); taskProps.setTaskInstId(taskInstance.getId());
taskProps.setEnvFile(CommonUtils.getSystemEnvPath()); taskProps.setEnvFile(CommonUtils.getSystemEnvPath());
// set queue // set queue
taskProps.setQueue(taskInstance.getProcessInstance().getQueue()); if (StringUtils.isEmpty(queue)){
taskProps.setQueue(taskInstance.getProcessInstance().getQueue());
}else {
taskProps.setQueue(queue);
}
taskProps.setTaskStartTime(taskInstance.getStartTime()); taskProps.setTaskStartTime(taskInstance.getStartTime());
taskProps.setDefinedParams(allParamMap); taskProps.setDefinedParams(allParamMap);
@ -188,7 +195,7 @@ public class TaskScheduleThread implements Callable<Boolean> {
task.handle(); task.handle();
logger.info("task : {} exit status code : {}",taskProps.getTaskAppId(),task.getExitStatusCode()); logger.info("task : {} exit status code : {}", taskProps.getTaskAppId(),task.getExitStatusCode());
if (task.getExitStatusCode() == Constants.EXIT_CODE_SUCCESS){ if (task.getExitStatusCode() == Constants.EXIT_CODE_SUCCESS){
status = ExecutionStatus.SUCCESS; status = ExecutionStatus.SUCCESS;

2
escheduler-ui/.env

@ -1,6 +1,6 @@
# 后端接口地址 # 后端接口地址
API_BASE = http://192.168.220.154:12345 API_BASE = http://192.168.220.247:12345
# 本地开发如需ip访问项目把"#"号去掉 # 本地开发如需ip访问项目把"#"号去掉
#DEV_HOST = 192.168.xx.xx #DEV_HOST = 192.168.xx.xx

60
escheduler-ui/src/js/conf/home/pages/dag/_source/config.js

@ -32,31 +32,31 @@ const toolOper = (dagThis) => {
code: 'pointer', code: 'pointer',
icon: '&#xe781;', icon: '&#xe781;',
disable: disabled, disable: disabled,
desc: `${i18n.$t('拖动节点和选中项')}` desc: `${i18n.$t('Drag Nodes and Selected Items')}`
}, },
{ {
code: 'line', code: 'line',
icon: '&#xe61c;', icon: '&#xe61c;',
disable: disabled, disable: disabled,
desc: `${i18n.$t('选择线条连接')}` desc: `${i18n.$t('Select Line Connection')}`
}, },
{ {
code: 'remove', code: 'remove',
icon: '&#xe611;', icon: '&#xe611;',
disable: disabled, disable: disabled,
desc: `${i18n.$t('删除选中的线或节点')}` desc: `${i18n.$t('Delete selected lines or nodes')}`
}, },
{ {
code: 'download', code: 'download',
icon: '&#xe628;', icon: '&#xe628;',
disable: !!dagThis.type, disable: !!dagThis.type,
desc: `${i18n.$t('下载')}` desc: `${i18n.$t('Download')}`
}, },
{ {
code: 'screen', code: 'screen',
icon: '&#xe6e0;', icon: '&#xe6e0;',
disable: disabled, disable: disabled,
desc: `${i18n.$t('全屏')}` desc: `${i18n.$t('Full Screen')}`
} }
] ]
} }
@ -70,17 +70,17 @@ const toolOper = (dagThis) => {
let publishStatus = [ let publishStatus = [
{ {
id: 0, id: 0,
desc: `${i18n.$t('未发布')}`, desc: `${i18n.$t('Unpublished')}`,
code: 'NOT_RELEASE' code: 'NOT_RELEASE'
}, },
{ {
id: 1, id: 1,
desc: `${i18n.$t('上线')}`, desc: `${i18n.$t('online')}`,
code: 'ONLINE' code: 'ONLINE'
}, },
{ {
id: 2, id: 2,
desc: `${i18n.$t('下线')}`, desc: `${i18n.$t('offline')}`,
code: 'OFFLINE' code: 'OFFLINE'
} }
] ]
@ -92,47 +92,47 @@ let publishStatus = [
*/ */
let runningType = [ let runningType = [
{ {
desc: `${i18n.$t('启动工作流')}`, desc: `${i18n.$t('Start Process')}`,
code: 'START_PROCESS' code: 'START_PROCESS'
}, },
{ {
desc: `${i18n.$t('从当前节点开始执行')}`, desc: `${i18n.$t('Execute from the current node')}`,
code: 'START_CURRENT_TASK_PROCESS' code: 'START_CURRENT_TASK_PROCESS'
}, },
{ {
desc: `${i18n.$t('恢复被容错的工作流')}`, desc: `${i18n.$t('Recover tolerance fault process')}`,
code: 'RECOVER_TOLERANCE_FAULT_PROCESS' code: 'RECOVER_TOLERANCE_FAULT_PROCESS'
}, },
{ {
desc: `${i18n.$t('恢复暂停流程')}`, desc: `${i18n.$t('Resume the suspension process')}`,
code: 'RECOVER_SUSPENDED_PROCESS' code: 'RECOVER_SUSPENDED_PROCESS'
}, },
{ {
desc: `${i18n.$t('从失败节点开始执行')}`, desc: `${i18n.$t('Execute from the failed nodes')}`,
code: 'START_FAILURE_TASK_PROCESS' code: 'START_FAILURE_TASK_PROCESS'
}, },
{ {
desc: `${i18n.$t('补数')}`, desc: `${i18n.$t('Complement Data')}`,
code: 'COMPLEMENT_DATA' code: 'COMPLEMENT_DATA'
}, },
{ {
desc: `${i18n.$t('调度执行')}`, desc: `${i18n.$t('Scheduling execution')}`,
code: 'SCHEDULER' code: 'SCHEDULER'
}, },
{ {
desc: `${i18n.$t('重跑')}`, desc: `${i18n.$t('Rerun')}`,
code: 'REPEAT_RUNNING' code: 'REPEAT_RUNNING'
}, },
{ {
desc: `${i18n.$t('暂停')}`, desc: `${i18n.$t('Pause')}`,
code: 'PAUSE' code: 'PAUSE'
}, },
{ {
desc: `${i18n.$t('停止')}`, desc: `${i18n.$t('Stop')}`,
code: 'STOP' code: 'STOP'
}, },
{ {
desc: `${i18n.$t('恢复等待线程')}`, desc: `${i18n.$t('Recovery waiting thread')}`,
code: 'RECOVER_WAITTING_THREAD' code: 'RECOVER_WAITTING_THREAD'
} }
] ]
@ -149,63 +149,63 @@ let runningType = [
let tasksState = { let tasksState = {
'SUBMITTED_SUCCESS': { 'SUBMITTED_SUCCESS': {
id: 0, id: 0,
desc: `${i18n.$t('提交成功')}`, desc: `${i18n.$t('Submitted successfully')}`,
color: '#A9A9A9', color: '#A9A9A9',
icoUnicode: '&#xe7c2;', icoUnicode: '&#xe7c2;',
isSpin: false isSpin: false
}, },
'RUNNING_EXEUTION': { 'RUNNING_EXEUTION': {
id: 1, id: 1,
desc: `${i18n.$t('正在执行')}`, desc: `${i18n.$t('Executing')}`,
color: '#0097e0', color: '#0097e0',
icoUnicode: '&#xe80f;', icoUnicode: '&#xe80f;',
isSpin: true isSpin: true
}, },
'READY_PAUSE': { 'READY_PAUSE': {
id: 2, id: 2,
desc: `${i18n.$t('准备暂停')}`, desc: `${i18n.$t('Ready to pause')}`,
color: '#07b1a3', color: '#07b1a3',
icoUnicode: '&#xe677;', icoUnicode: '&#xe677;',
isSpin: false isSpin: false
}, },
'PAUSE': { 'PAUSE': {
id: 3, id: 3,
desc: `${i18n.$t('暂停')}`, desc: `${i18n.$t('Pause')}`,
color: '#057c72', color: '#057c72',
icoUnicode: '&#xe679;', icoUnicode: '&#xe679;',
isSpin: false isSpin: false
}, },
'READY_STOP': { 'READY_STOP': {
id: 4, id: 4,
desc: `${i18n.$t('准备停止')}`, desc: `${i18n.$t('Ready to stop')}`,
color: '#FE0402', color: '#FE0402',
icoUnicode: '&#xe6e6;', icoUnicode: '&#xe6e6;',
isSpin: false isSpin: false
}, },
'STOP': { 'STOP': {
id: 5, id: 5,
desc: `${i18n.$t('停止')}`, desc: `${i18n.$t('Stop')}`,
color: '#e90101', color: '#e90101',
icoUnicode: '&#xe6ae;', icoUnicode: '&#xe6ae;',
isSpin: false isSpin: false
}, },
'FAILURE': { 'FAILURE': {
id: 6, id: 6,
desc: `${i18n.$t('失败')}`, desc: `${i18n.$t('failed')}`,
color: '#000000', color: '#000000',
icoUnicode: '&#xe75d;', icoUnicode: '&#xe75d;',
isSpin: false isSpin: false
}, },
'SUCCESS': { 'SUCCESS': {
id: 7, id: 7,
desc: `${i18n.$t('成功')}`, desc: `${i18n.$t('success')}`,
color: '#33cc00', color: '#33cc00',
icoUnicode: '&#xe6d4;', icoUnicode: '&#xe6d4;',
isSpin: false isSpin: false
}, },
'NEED_FAULT_TOLERANCE': { 'NEED_FAULT_TOLERANCE': {
id: 8, id: 8,
desc: `${i18n.$t('需要容错')}`, desc: `${i18n.$t('Need fault tolerance')}`,
color: '#FF8C00', color: '#FF8C00',
icoUnicode: '&#xe60d;', icoUnicode: '&#xe60d;',
isSpin: false isSpin: false
@ -219,14 +219,14 @@ let tasksState = {
}, },
'WAITTING_THREAD': { 'WAITTING_THREAD': {
id: 10, id: 10,
desc: `${i18n.$t('等待线程')}`, desc: `${i18n.$t('Waiting for thread')}`,
color: '#912eed', color: '#912eed',
icoUnicode: '&#xe62e;', icoUnicode: '&#xe62e;',
isSpin: false isSpin: false
}, },
'WAITTING_DEPEND': { 'WAITTING_DEPEND': {
id: 11, id: 11,
desc: `${i18n.$t('等待依赖')}`, desc: `${i18n.$t('Waiting for dependence')}`,
color: '#5101be', color: '#5101be',
icoUnicode: '&#xe68c;', icoUnicode: '&#xe68c;',
isSpin: false isSpin: false

3
escheduler-ui/src/js/conf/home/pages/dag/_source/dag.scss

@ -386,10 +386,11 @@ svg path:hover {
.name-p { .name-p {
position: absolute; position: absolute;
left: 50%; left: 50%;
bottom: -24px; top: 58px;
width: 200px; width: 200px;
text-align: center; text-align: center;
margin-left: -100px; margin-left: -100px;
word-break:break-all;
} }
.ban-p { .ban-p {
position: absolute; position: absolute;

18
escheduler-ui/src/js/conf/home/pages/dag/_source/dag.vue

@ -1,7 +1,7 @@
<template> <template>
<div class="clearfix dag-model" > <div class="clearfix dag-model" >
<div class="toolbar"> <div class="toolbar">
<div class="title"><span>{{$t('工具栏')}}</span></div> <div class="title"><span>{{$t('Toolbar')}}</span></div>
<div class="toolbar-btn"> <div class="toolbar-btn">
<div class="bar-box roundedRect jtk-draggable jtk-droppable jtk-endpoint-anchor jtk-connected" <div class="bar-box roundedRect jtk-draggable jtk-droppable jtk-endpoint-anchor jtk-connected"
:class="v === dagBarId ? 'active' : ''" :class="v === dagBarId ? 'active' : ''"
@ -20,7 +20,7 @@
<x-button <x-button
style="vertical-align: middle;" style="vertical-align: middle;"
data-toggle="tooltip" data-toggle="tooltip"
:title="$t('查看变量')" :title="$t('View variables')"
data-container="body" data-container="body"
type="primary" type="primary"
size="xsmall" size="xsmall"
@ -42,7 +42,7 @@
</div> </div>
<x-button <x-button
data-toggle="tooltip" data-toggle="tooltip"
:title="$t('刷新DAG状态')" :title="$t('Refresh DAG status')"
data-container="body" data-container="body"
style="vertical-align: middle;" style="vertical-align: middle;"
icon="fa fa-refresh" icon="fa fa-refresh"
@ -59,7 +59,7 @@
size="xsmall" size="xsmall"
icon="fa fa-reply" icon="fa fa-reply"
@click="_rtNodesDag" > @click="_rtNodesDag" >
{{$t('返回上一节点')}} {{$t('Return_1')}}
</x-button> </x-button>
<x-button <x-button
style="vertical-align: middle;" style="vertical-align: middle;"
@ -70,7 +70,7 @@
@click="_saveChart" @click="_saveChart"
icon="fa fa-save" icon="fa fa-save"
:disabled="isDetails"> :disabled="isDetails">
{{spinnerLoading ? 'Loading...' : $t('保存')}} {{spinnerLoading ? 'Loading...' : $t('Save')}}
</x-button> </x-button>
</div> </div>
</div> </div>
@ -152,7 +152,7 @@
let idArr = allNodesId() let idArr = allNodesId()
const titleTpl = (item, desc) => { const titleTpl = (item, desc) => {
let $item = _.filter(taskList, v => v.name === item.name)[0] let $item = _.filter(taskList, v => v.name === item.name)[0]
return `<div style="text-align: left">${i18n.$t('名称')}${$item.name}</br>${i18n.$t('状态')}${desc}</br>${i18n.$t('类型')}${$item.taskType}</br>${i18n.$t('host')}${$item.host || '-'}</br>${i18n.$t('重试次数')}${$item.retryTimes}</br>${i18n.$t('提交时间')}${formatDate($item.submitTime)}</br>${i18n.$t('开始时间')}${formatDate($item.startTime)}</br>${i18n.$t('结束时间')}${$item.endTime ? formatDate($item.endTime) : '-'}</br></div>` return `<div style="text-align: left">${i18n.$t('Name')}${$item.name}</br>${i18n.$t('State')}${desc}</br>${i18n.$t('type')}${$item.taskType}</br>${i18n.$t('host')}${$item.host || '-'}</br>${i18n.$t('Retry Count')}${$item.retryTimes}</br>${i18n.$t('Submit Time')}${formatDate($item.submitTime)}</br>${i18n.$t('Start Time')}${formatDate($item.startTime)}</br>${i18n.$t('End Time')}${$item.endTime ? formatDate($item.endTime) : '-'}</br></div>`
} }
data.forEach(v1 => { data.forEach(v1 => {
idArr.forEach(v2 => { idArr.forEach(v2 => {
@ -232,7 +232,7 @@
Dag.saveStore().then(res => { Dag.saveStore().then(res => {
if (this.urlParam.id) { if (this.urlParam.id) {
/** /**
* 编辑 * Edit
* @param saveInstanceEditDAGChart => Process instance editing * @param saveInstanceEditDAGChart => Process instance editing
* @param saveEditDAGChart => Process definition editing * @param saveEditDAGChart => Process definition editing
*/ */
@ -300,7 +300,7 @@
_saveChart () { _saveChart () {
// Verify node // Verify node
if (!this.tasks.length) { if (!this.tasks.length) {
this.$message.warning(`${i18n.$t('未创建节点保存失败')}`) this.$message.warning(`${i18n.$t('Failed to create node to save')}`)
return return
} }
@ -350,7 +350,7 @@
this._getTaskState(false).then(res => { this._getTaskState(false).then(res => {
setTimeout(() => { setTimeout(() => {
this.isRefresh = false this.isRefresh = false
this.$message.success(`${i18n.$t('刷新状态成功')}`) this.$message.success(`${i18n.$t('Refresh status succeeded')}`)
}, 2200) }, 2200)
}) })
}, },

6
escheduler-ui/src/js/conf/home/pages/dag/_source/formModel/_source/selectInput.vue

@ -1,6 +1,6 @@
<template> <template>
<x-select <x-select
style="width: 170px;" style="width: 157px;"
:disabled="isDetails" :disabled="isDetails"
@on-change="_onChange" @on-change="_onChange"
v-model="value"> v-model="value">
@ -12,7 +12,7 @@
slot-scope="{ selectedModel }" slot-scope="{ selectedModel }"
maxlength="4" maxlength="4"
@on-blur="_onBlur" @on-blur="_onBlur"
:placeholder="$t('请选择')" :placeholder="$t('Please choose')"
:value="selectedModel === null ? '0' : selectedModel.value" :value="selectedModel === null ? '0' : selectedModel.value"
style="width: 100%;" style="width: 100%;"
@on-click-icon.stop="_ckIcon"> @on-click-icon.stop="_ckIcon">
@ -81,7 +81,7 @@
if (val === '0') return true if (val === '0') return true
if (!(/(^[0-9]*[1-9][0-9]*$)/.test(val))) { if (!(/(^[0-9]*[1-9][0-9]*$)/.test(val))) {
this.$message.warning(`${i18n.$t('请输入正整数')}`) this.$message.warning(`${i18n.$t('Please enter a positive integer')}`)
// init // init
this._ckIcon() this._ckIcon()
return false return false

16
escheduler-ui/src/js/conf/home/pages/dag/_source/formModel/_source/timeoutAlarm.vue

@ -2,7 +2,7 @@
<div class="timeout-alarm-model"> <div class="timeout-alarm-model">
<div class="clearfix list"> <div class="clearfix list">
<div class="text-box"> <div class="text-box">
<span>{{$t('任务超时告警')}}</span> <span>{{$t('Timeout alarm')}}</span>
</div> </div>
<div class="cont-box"> <div class="cont-box">
<label class="label-box"> <label class="label-box">
@ -14,14 +14,14 @@
</div> </div>
<div class="clearfix list" v-if="enable"> <div class="clearfix list" v-if="enable">
<div class="text-box"> <div class="text-box">
<span>{{$t('超时策略')}}</span> <span>{{$t('Timeout strategy')}}</span>
</div> </div>
<div class="cont-box"> <div class="cont-box">
<label class="label-box"> <label class="label-box">
<div style="padding-top: 6px;"> <div style="padding-top: 6px;">
<x-checkbox-group v-model="strategy"> <x-checkbox-group v-model="strategy">
<x-checkbox label="WARN" :disabled="isDetails">{{$t('超时告警')}}</x-checkbox> <x-checkbox label="WARN" :disabled="isDetails">{{$t('Timeout alarm')}}</x-checkbox>
<x-checkbox label="FAILED" :disabled="isDetails">{{$t('超时失败')}}</x-checkbox> <x-checkbox label="FAILED" :disabled="isDetails">{{$t('Timeout failure')}}</x-checkbox>
</x-checkbox-group> </x-checkbox-group>
</div> </div>
</label> </label>
@ -29,12 +29,12 @@
</div> </div>
<div class="clearfix list" v-if="enable"> <div class="clearfix list" v-if="enable">
<div class="text-box"> <div class="text-box">
<span>{{$t('超时时长')}}</span> <span>{{$t('Timeout period')}}</span>
</div> </div>
<div class="cont-box"> <div class="cont-box">
<label class="label-box"> <label class="label-box">
<x-input v-model="interval" style="width: 128px;" :disabled="isDetails"> <x-input v-model="interval" style="width: 128px;" :disabled="isDetails">
<span slot="append">{{$t('')}}</span> <span slot="append">{{$t('Minute')}}</span>
</x-input> </x-input>
</label> </label>
</div> </div>
@ -71,12 +71,12 @@
_verification () { _verification () {
// Verification timeout policy // Verification timeout policy
if (this.enable && !this.strategy.length) { if (this.enable && !this.strategy.length) {
this.$message.warning(`${this.$t('超时策略必须选一个')}`) this.$message.warning(`${this.$t('Timeout strategy must be selected')}`)
return false return false
} }
// Verify timeout duration Non 0 positive integer // Verify timeout duration Non 0 positive integer
if (this.enable && !parseInt(this.interval) && !_.isInteger(this.interval)) { if (this.enable && !parseInt(this.interval) && !_.isInteger(this.interval)) {
this.$message.warning(`${this.$t('超时时长必须为正整数')}`) this.$message.warning(`${this.$t('Timeout must be a positive integer')}`)
return false return false
} }
this.$emit('on-timeout', { this.$emit('on-timeout', {

73
escheduler-ui/src/js/conf/home/pages/dag/_source/formModel/formModel.vue

@ -1,14 +1,14 @@
<template> <template>
<div class="form-model-model" v-clickoutside="_handleClose"> <div class="form-model-model" v-clickoutside="_handleClose">
<div class="title-box"> <div class="title-box">
<span class="name">{{$t('当前节点设置')}}</span> <span class="name">{{$t('Current node settings')}}</span>
<span class="go-subtask"> <span class="go-subtask">
<!-- Component can't pop up box to do component processing --> <!-- Component can't pop up box to do component processing -->
<m-log :item="backfillItem"> <m-log :item="backfillItem">
<template slot="history"><a href="javascript:" @click="_seeHistory" ><i class="iconfont">&#xe6ee;</i><em>{{$t('查看历史')}}</em></a></template> <template slot="history"><a href="javascript:" @click="_seeHistory" ><i class="iconfont">&#xe6ee;</i><em>{{$t('View history')}}</em></a></template>
<template slot="log"><a href="javascript:"><i class="iconfont">&#xe691;</i><em>{{$t('查看日志')}}</em></a></template> <template slot="log"><a href="javascript:"><i class="iconfont">&#xe691;</i><em>{{$t('View log')}}</em></a></template>
</m-log> </m-log>
<a href="javascript:" @click="_goSubProcess" v-if="_isGoSubProcess"><i class="iconfont">&#xe600;</i><em>{{$t('进入该子节点')}}</em></a> <a href="javascript:" @click="_goSubProcess" v-if="_isGoSubProcess"><i class="iconfont">&#xe600;</i><em>{{$t('Enter this child node')}}</em></a>
</span> </span>
</div> </div>
<div class="content-box" v-if="isContentBox"> <div class="content-box" v-if="isContentBox">
@ -16,14 +16,14 @@
<!-- Node name --> <!-- Node name -->
<div class="clearfix list"> <div class="clearfix list">
<div class="text-box"><span>{{$t('节点名称')}}</span></div> <div class="text-box"><span>{{$t('Node name')}}</span></div>
<div class="cont-box"> <div class="cont-box">
<label class="label-box"> <label class="label-box">
<x-input <x-input
type="text" type="text"
v-model="name" v-model="name"
:disabled="isDetails" :disabled="isDetails"
:placeholder="$t('请输入name(必填)')" :placeholder="$t('Please enter name(required)')"
maxlength="100" maxlength="100"
@on-blur="_verifName()" @on-blur="_verifName()"
autocomplete="off"> autocomplete="off">
@ -34,12 +34,12 @@
<!-- Running sign --> <!-- Running sign -->
<div class="clearfix list"> <div class="clearfix list">
<div class="text-box"><span>{{$t('运行标志')}}</span></div> <div class="text-box"><span>{{$t('Run flag')}}</span></div>
<div class="cont-box"> <div class="cont-box">
<label class="label-box"> <label class="label-box">
<x-radio-group v-model="runFlag" > <x-radio-group v-model="runFlag" >
<x-radio :label="'NORMAL'" :disabled="isDetails">{{$t('正常')}}</x-radio> <x-radio :label="'NORMAL'" :disabled="isDetails">{{$t('Normal')}}</x-radio>
<x-radio :label="'FORBIDDEN'" :disabled="isDetails">{{$t('禁止执行')}}</x-radio> <x-radio :label="'FORBIDDEN'" :disabled="isDetails">{{$t('Prohibition execution')}}</x-radio>
</x-radio-group> </x-radio-group>
</label> </label>
</div> </div>
@ -48,7 +48,7 @@
<!-- desc --> <!-- desc -->
<div class="clearfix list"> <div class="clearfix list">
<div class="text-box"> <div class="text-box">
<span>{{$t('描述')}}</span> <span>{{$t('Description')}}</span>
</div> </div>
<div class="cont-box"> <div class="cont-box">
@ -59,7 +59,7 @@
type="textarea" type="textarea"
:disabled="isDetails" :disabled="isDetails"
v-model="desc" v-model="desc"
:placeholder="$t('请输入desc')" :placeholder="$t('Please enter description')"
autocomplete="off"> autocomplete="off">
</x-input> </x-input>
</label> </label>
@ -69,7 +69,7 @@
<!-- Task priority --> <!-- Task priority -->
<div class="clearfix list"> <div class="clearfix list">
<div class="text-box"> <div class="text-box">
<span>{{$t('任务优先级')}}</span> <span>{{$t('Task priority')}}</span>
</div> </div>
<div class="cont-box"> <div class="cont-box">
<label class="label-box"> <label class="label-box">
@ -81,16 +81,16 @@
<!-- Number of failed retries --> <!-- Number of failed retries -->
<div class="clearfix list" v-if="taskType !== 'SUB_PROCESS'"> <div class="clearfix list" v-if="taskType !== 'SUB_PROCESS'">
<div class="text-box"> <div class="text-box">
<span>{{$t('失败重试次数')}}</span> <span>{{$t('Number of failed retries')}}</span>
</div> </div>
<div class="cont-box"> <div class="cont-box">
<m-select-input v-model="maxRetryTimes" :list="[0,1,2,3,4]"> <m-select-input v-model="maxRetryTimes" :list="[0,1,2,3,4]">
</m-select-input> </m-select-input>
<span>({{$t('')}})</span> <span>({{$t('Times')}})</span>
<span class="text-b">{{$t('失败重试间隔')}}</span> <span class="text-b">{{$t('Failed retry interval')}}</span>
<m-select-input v-model="retryInterval" :list="[1,10,30,60,120]"> <m-select-input v-model="retryInterval" :list="[1,10,30,60,120]">
</m-select-input> </m-select-input>
<span>({{$t('')}})</span> <span>({{$t('Minute')}})</span>
</div> </div>
</div> </div>
@ -163,8 +163,8 @@
</div> </div>
<div class="bottom-box"> <div class="bottom-box">
<div class="submit" style="background: #fff;"> <div class="submit" style="background: #fff;">
<x-button type="text" @click="close()"> {{$t('取消')}} </x-button> <x-button type="text" @click="close()"> {{$t('Cancel')}} </x-button>
<x-button type="primary" shape="circle" :loading="spinnerLoading" @click="ok()" :disabled="isDetails" v-ps="['GENERAL_USER']">{{spinnerLoading ? 'Loading...' : $t('确认添加')}} </x-button> <x-button type="primary" shape="circle" :loading="spinnerLoading" @click="ok()" :disabled="isDetails" v-ps="['GENERAL_USER']">{{spinnerLoading ? 'Loading...' : $t('Confirm add')}} </x-button>
</div> </div>
</div> </div>
</div> </div>
@ -178,7 +178,7 @@
import mShell from './tasks/shell' import mShell from './tasks/shell'
import mSpark from './tasks/spark' import mSpark from './tasks/spark'
import mPython from './tasks/python' import mPython from './tasks/python'
import { isNameExDag,rtBantpl } from './../plugIn/util' import { isNameExDag, rtBantpl } from './../plugIn/util'
import JSP from './../plugIn/jsPlumbHandle' import JSP from './../plugIn/jsPlumbHandle'
import mProcedure from './tasks/procedure' import mProcedure from './tasks/procedure'
import mDependent from './tasks/dependent' import mDependent from './tasks/dependent'
@ -255,7 +255,7 @@
*/ */
_seeHistory () { _seeHistory () {
this.self.$router.push({ this.self.$router.push({
name: 'task-instance-list', name: 'task-instance',
query: { query: {
processInstanceId: this.self.$route.params.id, processInstanceId: this.self.$route.params.id,
taskName: this.backfillItem.name taskName: this.backfillItem.name
@ -269,13 +269,13 @@
*/ */
_goSubProcess () { _goSubProcess () {
if (_.isEmpty(this.backfillItem)) { if (_.isEmpty(this.backfillItem)) {
this.$message.warning(`${i18n.$t('新创建子工作流还未执行,不能进入子工作流')}`) this.$message.warning(`${i18n.$t('The newly created sub-Process has not yet been executed and cannot enter the sub-Process')}`)
return return
} }
if (this.router.history.current.name === 'projects-instance-details') { if (this.router.history.current.name === 'projects-instance-details') {
let stateId = $(`#${this.id}`).attr('data-state-id') || null let stateId = $(`#${this.id}`).attr('data-state-id') || null
if (!stateId) { if (!stateId) {
this.$message.warning(`${i18n.$t('该任务还未执行,不能进入子工作流')}`) this.$message.warning(`${i18n.$t('The task has not been executed and cannot enter the sub-Process')}`)
return return
} }
this.store.dispatch('dag/getSubProcessId', { taskId: stateId }).then(res => { this.store.dispatch('dag/getSubProcessId', { taskId: stateId }).then(res => {
@ -304,7 +304,7 @@
*/ */
_verifName () { _verifName () {
if (!_.trim(this.name)) { if (!_.trim(this.name)) {
this.$message.warning(`${i18n.$t('请输入名称(必填)')}`) this.$message.warning(`${i18n.$t('Please enter name (required)')}`)
return false return false
} }
if (this.name === this.backfillItem.name) { if (this.name === this.backfillItem.name) {
@ -312,7 +312,7 @@
} }
// Name repeat depends on dom backfill dependent store // Name repeat depends on dom backfill dependent store
if (isNameExDag(this.name, _.isEmpty(this.backfillItem) ? 'dom' : 'backfill')) { if (isNameExDag(this.name, _.isEmpty(this.backfillItem) ? 'dom' : 'backfill')) {
this.$message.warning(`${i18n.$t('名称已存在请重新输入')}`) this.$message.warning(`${i18n.$t('Name already exists')}`)
return false return false
} }
return true return true
@ -353,6 +353,9 @@
}, },
fromThis: this fromThis: this
}) })
// set run flag
this._setRunFlag()
}, },
/** /**
* Sub-workflow selected node echo name * Sub-workflow selected node echo name
@ -360,6 +363,16 @@
_onSetProcessName (name) { _onSetProcessName (name) {
this.name = name this.name = name
}, },
/**
* set run flag
*/
_setRunFlag () {
let dom = $(`#${this.id}`).find('.ban-p')
dom.html('')
if (this.runFlag === 'FORBIDDEN') {
dom.append(rtBantpl())
}
},
/** /**
* Submit verification * Submit verification
*/ */
@ -384,13 +397,7 @@
} }
}, },
watch: { watch: {
runFlag(val){
let dom = $(`#${this.id}`).find('.ban-p')
dom.html('')
if (val === 'FORBIDDEN') {
dom.append(rtBantpl())
}
}
}, },
created () { created () {
// Unbind copy and paste events // Unbind copy and paste events
@ -521,10 +528,10 @@
position: relative; position: relative;
margin-bottom: 10px; margin-bottom: 10px;
.text-box { .text-box {
width: 110px; width: 112px;
float: left; float: left;
text-align: right; text-align: right;
margin-right: 10px; margin-right: 8px;
>span { >span {
font-size: 14px; font-size: 14px;
color: #777; color: #777;

30
escheduler-ui/src/js/conf/home/pages/dag/_source/formModel/log.vue

@ -10,18 +10,18 @@
<div v-show="isLog || source === 'list'" class="log-pop"> <div v-show="isLog || source === 'list'" class="log-pop">
<div class="log-box" > <div class="log-box" >
<div class="title"> <div class="title">
<span>{{$t('查看日志')}}</span> <span>{{$t('View log')}}</span>
<div class="full-screen"> <div class="full-screen">
<a href="javascript:" @click="_downloadLog" data-container="body" data-toggle="tooltip" :title="$t('下载日志')"> <a href="javascript:" @click="_downloadLog" data-container="body" data-toggle="tooltip" :title="$t('Download Log')">
<i class="iconfont" style="font-size: 20px">&#xe610;</i> <i class="iconfont" style="font-size: 20px">&#xe610;</i>
</a> </a>
<a href="javascript:" class="refresh-log" :class="loading ? 'active' :''" @click="!loading && _refreshLog()" data-container="body" data-toggle="tooltip" :title="$t('刷新日志')"> <a href="javascript:" class="refresh-log" :class="loading ? 'active' :''" @click="!loading && _refreshLog()" data-container="body" data-toggle="tooltip" :title="$t('Refresh Log')">
<i class="fa iconfont">&#xe602;</i> <i class="fa iconfont">&#xe602;</i>
</a> </a>
<a href="javascript:" @click="_screenOpen" v-show="!isScreen" data-container="body" data-toggle="tooltip" :title="$t('进入全屏')"> <a href="javascript:" @click="_screenOpen" v-show="!isScreen" data-container="body" data-toggle="tooltip" :title="$t('Enter full screen')">
<i class="iconfont">&#xe6e0;</i> <i class="iconfont">&#xe6e0;</i>
</a> </a>
<a href="javascript:" @click="_screenClose" v-show="isScreen" data-container="body" data-toggle="tooltip" :title="$t('取消全屏')"> <a href="javascript:" @click="_screenClose" v-show="isScreen" data-container="body" data-toggle="tooltip" :title="$t('Cancel full screen')">
<i class="iconfont">&#xe660;</i> <i class="iconfont">&#xe660;</i>
</a> </a>
</div> </div>
@ -32,7 +32,7 @@
</div> </div>
</div> </div>
<div class="operation"> <div class="operation">
<x-button type="primary" shape="circle" @click="close"> {{$t('关闭')}} </x-button> <x-button type="primary" shape="circle" @click="close"> {{$t('Close')}} </x-button>
</div> </div>
</div> </div>
</div> </div>
@ -88,13 +88,13 @@
setTimeout(() => { setTimeout(() => {
this.loading = false this.loading = false
if (res.data) { if (res.data) {
this.$message.success(`${i18n.$t('更新日志成功')}`) this.$message.success(`${i18n.$t('Update log success')}`)
} else { } else {
this.$message.warning(`${i18n.$t('暂无更多日志')}`) this.$message.warning(`${i18n.$t('No more logs')}`)
} }
}, 1500) }, 1500)
// Handling text field size // Handling text field size
handerTextareaSize().html('').text(res.data || `${i18n.$t('暂无日志')}`) handerTextareaSize().html('').text(res.data || `${i18n.$t('No log')}`)
}).catch(e => { }).catch(e => {
this.$message.error(e.msg || '') this.$message.error(e.msg || '')
this.loading = false this.loading = false
@ -108,15 +108,15 @@
if (!res.data) { if (!res.data) {
this.isData = false this.isData = false
setTimeout(() => { setTimeout(() => {
this.$message.warning(`${i18n.$t('暂无更多日志')}`) this.$message.warning(`${i18n.$t('No more logs')}`)
}, 1000) }, 1000)
// Handling text field size // Handling text field size
handerTextareaSize().html('').text(content || `${i18n.$t('暂无日志')}`) handerTextareaSize().html('').text(content || `${i18n.$t('No log')}`)
} else { } else {
this.isData = true this.isData = true
content = res.data content = res.data
// Handling text field size // Handling text field size
handerTextareaSize().html('').text(content || `${i18n.$t('暂无日志')}`) handerTextareaSize().html('').text(content || `${i18n.$t('No log')}`)
setTimeout(() => { setTimeout(() => {
$('#textarea').scrollTop(2) $('#textarea').scrollTop(2)
@ -189,7 +189,7 @@
if (($this.scrollTop() + $this.height()) === $this.height()) { if (($this.scrollTop() + $this.height()) === $this.height()) {
if (self.loadingIndex > 0) { if (self.loadingIndex > 0) {
self.$message.loading({ self.$message.loading({
content: `${i18n.$t('正在努力请求日志中...')}`, content: `${i18n.$t('Loading Log...')}`,
duration: 0, duration: 0,
closable: false closable: false
}) })
@ -201,7 +201,7 @@
// No data is not requested // No data is not requested
if (self.isData) { if (self.isData) {
self.$message.loading({ self.$message.loading({
content: `${i18n.$t('正在努力请求日志中...')}`, content: `${i18n.$t('Loading Log...')}`,
duration: 0, duration: 0,
closable: false closable: false
}) })
@ -226,7 +226,7 @@
// Source is a task instance // Source is a task instance
if (this.source === 'list') { if (this.source === 'list') {
this.$message.loading({ this.$message.loading({
content: `${i18n.$t('正在努力请求日志中...')}`, content: `${i18n.$t('Loading Log...')}`,
duration: 0, duration: 0,
closable: false closable: false
}) })

48
escheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/_source/commcon.js

@ -7,19 +7,19 @@ import i18n from '@/module/i18n'
const cycleList = [ const cycleList = [
{ {
value: 'month', value: 'month',
label: `${i18n.$t('月')}` label: `${i18n.$t('month')}`
}, },
{ {
value: 'week', value: 'week',
label: `${i18n.$t('周')}` label: `${i18n.$t('week')}`
}, },
{ {
value: 'day', value: 'day',
label: `${i18n.$t('日')}` label: `${i18n.$t('day')}`
}, },
{ {
value: 'hour', value: 'hour',
label: `${i18n.$t('时')}` label: `${i18n.$t('hour')}`
} }
] ]
@ -30,81 +30,81 @@ const dateValueList = {
'hour': [ 'hour': [
{ {
value: 'last1Hour', value: 'last1Hour',
label: `${i18n.$t('前1小时')}` label: `${i18n.$t('Last1Hour')}`
}, },
{ {
value: 'last2Hours', value: 'last2Hours',
label: `${i18n.$t('前2小时')}` label: `${i18n.$t('Last2Hours')}`
}, },
{ {
value: 'last3Hours', value: 'last3Hours',
label: `${i18n.$t('前3小时')}` label: `${i18n.$t('Last3Hours')}`
} }
], ],
'day': [ 'day': [
{ {
value: 'last1Days', value: 'last1Days',
label: `${i18n.$t('昨天')}` label: `${i18n.$t('Last1Days')}`
}, },
{ {
value: 'last2Days', value: 'last2Days',
label: `${i18n.$t('前两天')}` label: `${i18n.$t('Last2Days')}`
}, },
{ {
value: 'last3Days', value: 'last3Days',
label: `${i18n.$t('前三天')}` label: `${i18n.$t('Last3Days')}`
}, },
{ {
value: 'last7Days', value: 'last7Days',
label: `${i18n.$t('前七天')}` label: `${i18n.$t('Last7Days')}`
} }
], ],
'week': [ 'week': [
{ {
value: 'lastWeek', value: 'lastWeek',
label: `${i18n.$t('上周')}` label: `${i18n.$t('LastWeek')}`
}, },
{ {
value: 'lastMonday', value: 'lastMonday',
label: `${i18n.$t('上周一')}` label: `${i18n.$t('LastMonday')}`
}, },
{ {
value: 'lastTuesday', value: 'lastTuesday',
label: `${i18n.$t('上周二')}` label: `${i18n.$t('LastTuesday')}`
}, },
{ {
value: 'lastWednesday', value: 'lastWednesday',
label: `${i18n.$t('上周三')}` label: `${i18n.$t('LastWednesday')}`
}, },
{ {
value: 'lastThursday', value: 'lastThursday',
label: `${i18n.$t('上周四')}` label: `${i18n.$t('LastThursday')}`
}, },
{ {
value: 'lastFriday', value: 'lastFriday',
label: `${i18n.$t('上周五')}` label: `${i18n.$t('LastFriday')}`
}, },
{ {
value: 'lastSaturday', value: 'lastSaturday',
label: `${i18n.$t('上周六')}` label: `${i18n.$t('LastSaturday')}`
}, },
{ {
value: 'lastSunday', value: 'lastSunday',
label: `${i18n.$t('上周日')}` label: `${i18n.$t('LastSunday')}`
} }
], ],
'month': [ 'month': [
{ {
value: 'lastMonth', value: 'lastMonth',
label: `${i18n.$t('上月')}` label: `${i18n.$t('LastMonth')}`
}, },
{ {
value: 'lastMonthBegin', value: 'lastMonthBegin',
label: `${i18n.$t('上月初')}` label: `${i18n.$t('LastMonthBegin')}`
}, },
{ {
value: 'lastMonthEnd', value: 'lastMonthEnd',
label: `${i18n.$t('上月末')}` label: `${i18n.$t('LastMonthEnd')}`
} }
] ]
} }
@ -182,11 +182,11 @@ const typeList = [
const sqlTypeList = [ const sqlTypeList = [
{ {
id: 0, id: 0,
code: `${i18n.$t('查询')}` code: `${i18n.$t('Query')}`
}, },
{ {
id: 1, id: 1,
code: `${i18n.$t('非查询')}` code: `${i18n.$t('Non Query')}`
} }
] ]

4
escheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/_source/datasource.vue

@ -12,7 +12,7 @@
:label="city.code"> :label="city.code">
</x-option> </x-option>
</x-select> </x-select>
<x-select :placeholder="$t('请选择数据源')" <x-select :placeholder="$t('Please select the datasource')"
v-model="datasource" v-model="datasource"
style="width: 288px;" style="width: 288px;"
:disabled="isDetails"> :disabled="isDetails">
@ -56,7 +56,7 @@
*/ */
_verifDatasource () { _verifDatasource () {
if (!this.datasource) { if (!this.datasource) {
this.$message.warning(`${i18n.$t('请选择数据源')}`) this.$message.warning(`${i18n.$t('Please select the datasource')}`)
return false return false
} }
this.$emit('on-dsData', { this.$emit('on-dsData', {

10
escheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/_source/dependItemList.vue

@ -19,17 +19,17 @@
</x-select> </x-select>
<template v-if="isInstance"> <template v-if="isInstance">
<span class="instance-state"> <span class="instance-state">
<i class="iconfont" :class="'icon-' + el.state" v-if="el.state === 'SUCCESS'" data-toggle="tooltip" data-container="body" :title="$t('成功')">&#xe607;</i> <i class="iconfont" :class="'icon-' + el.state" v-if="el.state === 'SUCCESS'" data-toggle="tooltip" data-container="body" :title="$t('success')">&#xe607;</i>
<i class="iconfont" :class="'icon-' + el.state" v-if="el.state === 'WAITING'" data-toggle="tooltip" data-container="body" :title="$t('等待')">&#xe62a;</i> <i class="iconfont" :class="'icon-' + el.state" v-if="el.state === 'WAITING'" data-toggle="tooltip" data-container="body" :title="$t('waiting')">&#xe62a;</i>
<i class="iconfont" :class="'icon-' + el.state" v-if="el.state === 'FAILED'" data-toggle="tooltip" data-container="body" :title="$t('失败')">&#xe626;</i> <i class="iconfont" :class="'icon-' + el.state" v-if="el.state === 'FAILED'" data-toggle="tooltip" data-container="body" :title="$t('failed')">&#xe626;</i>
</span> </span>
</template> </template>
<span class="operation"> <span class="operation">
<a href="javascript:" class="delete" @click="!isDetails && _remove($index)"> <a href="javascript:" class="delete" @click="!isDetails && _remove($index)">
<i class="iconfont" :class="_isDetails" data-toggle="tooltip" data-container="body" :title="$t('删除')" >&#xe611;</i> <i class="iconfont" :class="_isDetails" data-toggle="tooltip" data-container="body" :title="$t('delete')" >&#xe611;</i>
</a> </a>
<a href="javascript:" class="add" @click="!isDetails && _add()" v-if="$index === (dependItemList.length - 1)"> <a href="javascript:" class="add" @click="!isDetails && _add()" v-if="$index === (dependItemList.length - 1)">
<i class="iconfont" :class="_isDetails" data-toggle="tooltip" data-container="body" :title="$t('添加')">&#xe636;</i> <i class="iconfont" :class="_isDetails" data-toggle="tooltip" data-container="body" :title="$t('Add')">&#xe636;</i>
</a> </a>
</span> </span>
</div> </div>

14
escheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/_source/localParams.vue

@ -8,7 +8,7 @@
:disabled="isDetails" :disabled="isDetails"
type="text" type="text"
v-model="localParamsList[$index].prop" v-model="localParamsList[$index].prop"
:placeholder="$t('prop(必填)')" :placeholder="$t('prop(required)')"
maxlength="64" maxlength="64"
@on-blur="_verifProp()" @on-blur="_verifProp()"
style="width: 164px;"> style="width: 164px;">
@ -41,25 +41,25 @@
:disabled="isDetails" :disabled="isDetails"
type="text" type="text"
v-model="localParamsList[$index].value" v-model="localParamsList[$index].value"
:placeholder="$t('value(选填)')" :placeholder="$t('value(optional)')"
maxlength="64" maxlength="64"
@on-blur="_handleValue()" @on-blur="_handleValue()"
style="width: 150px;position: relative;margin-bottom: -2px;"> style="width: 150px;position: relative;margin-bottom: -2px;">
</x-input> </x-input>
<span class="lt-add"> <span class="lt-add">
<a href="javascript:" style="color:red;" @click="!isDetails && _removeUdp($index)" > <a href="javascript:" style="color:red;" @click="!isDetails && _removeUdp($index)" >
<i class="iconfont" :class="_isDetails" data-toggle="tooltip" :title="$t('删除')" >&#xe611;</i> <i class="iconfont" :class="_isDetails" data-toggle="tooltip" :title="$t('delete')" >&#xe611;</i>
</a> </a>
</span> </span>
<span class="add" v-if="$index === (localParamsList.length - 1)"> <span class="add" v-if="$index === (localParamsList.length - 1)">
<a href="javascript:" @click="!isDetails && _addUdp()" > <a href="javascript:" @click="!isDetails && _addUdp()" >
<i class="iconfont" :class="_isDetails" data-toggle="tooltip" :title="$t('添加')">&#xe636;</i> <i class="iconfont" :class="_isDetails" data-toggle="tooltip" :title="$t('Add')">&#xe636;</i>
</a> </a>
</span> </span>
</div> </div>
<span class="add" v-if="!localParamsList.length"> <span class="add" v-if="!localParamsList.length">
<a href="javascript:" @click="!isDetails && _addUdp()" > <a href="javascript:" @click="!isDetails && _addUdp()" >
<i class="iconfont" :class="_isDetails" data-toggle="tooltip" :title="$t('添加')">&#xe636;</i> <i class="iconfont" :class="_isDetails" data-toggle="tooltip" :title="$t('Add')">&#xe636;</i>
</a> </a>
</span> </span>
</div> </div>
@ -149,14 +149,14 @@
}) })
if (!flag) { if (!flag) {
if (!type) { if (!type) {
this.$message.warning(`${i18n.$t('prop不能为空')}`) this.$message.warning(`${i18n.$t('prop is empty')}`)
} }
return false return false
} }
let newArr = _.cloneDeep(_.uniqWith(arr, _.isEqual)) let newArr = _.cloneDeep(_.uniqWith(arr, _.isEqual))
if (newArr.length !== arr.length) { if (newArr.length !== arr.length) {
if (!type) { if (!type) {
this.$message.warning(`${i18n.$t('prop中有重复')}`) this.$message.warning(`${i18n.$t('prop is repeat')}`)
} }
return false return false
} }

2
escheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/_source/resources.vue

@ -4,7 +4,7 @@
v-model="value" v-model="value"
filterable filterable
:disabled="isDetails" :disabled="isDetails"
:placeholder="$t('请选择资源')" :placeholder="$t('Please select resources')"
style="width: 100%;"> style="width: 100%;">
<x-option <x-option
v-for="city in resList" v-for="city in resList"

12
escheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/dependent.vue

@ -1,16 +1,16 @@
<template> <template>
<div class="dependence-model"> <div class="dependence-model">
<m-list-box> <m-list-box>
<div slot="text">{{$t('添加依赖')}}</div> <div slot="text">{{$t('Add dependency')}}</div>
<div slot="content"> <div slot="content">
<div class="dep-opt"> <div class="dep-opt">
<a href="javascript:" <a href="javascript:"
@click="!isDetails && _addDep()" @click="!isDetails && _addDep()"
class="add-dep"> class="add-dep">
<i v-if="!isLoading" class="iconfont" :class="_isDetails" data-toggle="tooltip" :title="$t('添加')"> <i v-if="!isLoading" class="iconfont" :class="_isDetails" data-toggle="tooltip" :title="$t('Add')">
&#xe636; &#xe636;
</i> </i>
<i v-if="isLoading" class="iconfont fa fa-spin" data-toggle="tooltip" :title="$t('添加')"> <i v-if="isLoading" class="iconfont fa fa-spin" data-toggle="tooltip" :title="$t('Add')">
&#xe6af; &#xe6af;
</i> </i>
</a> </a>
@ -20,20 +20,20 @@
class="dep-relation" class="dep-relation"
@click="!isDetails && _setGlobalRelation()" @click="!isDetails && _setGlobalRelation()"
v-if="dependTaskList.length"> v-if="dependTaskList.length">
{{relation === 'AND' ? $t('') : $t('')}} {{relation === 'AND' ? $t('and') : $t('or')}}
</span> </span>
<div class="dep-list" v-for="(el,$index) in dependTaskList"> <div class="dep-list" v-for="(el,$index) in dependTaskList">
<span class="dep-line-pie" <span class="dep-line-pie"
v-if="el.dependItemList.length" v-if="el.dependItemList.length"
@click="!isDetails && _setRelation($index)"> @click="!isDetails && _setRelation($index)">
{{el.relation === 'AND' ? $t('') : $t('')}} {{el.relation === 'AND' ? $t('and') : $t('or')}}
</span> </span>
<i class="iconfont dep-delete" <i class="iconfont dep-delete"
data-toggle="tooltip" data-toggle="tooltip"
data-container="body" data-container="body"
:class="_isDetails" :class="_isDetails"
@click="!isDetails && _deleteDep($index)" @click="!isDetails && _deleteDep($index)"
:title="$t('删除')" > :title="$t('delete')" >
&#xe611; &#xe611;
</i> </i>
<m-depend-item-list <m-depend-item-list

26
escheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/mr.vue

@ -1,7 +1,7 @@
<template> <template>
<div class="spark-model"> <div class="spark-model">
<m-list-box> <m-list-box>
<div slot="text">{{$t('程序类型')}}</div> <div slot="text">{{$t('Program Type')}}</div>
<div slot="content"> <div slot="content">
<x-select v-model="programType" :disabled="isDetails" style="width: 100px;"> <x-select v-model="programType" :disabled="isDetails" style="width: 100px;">
<x-option <x-option
@ -14,23 +14,23 @@
</div> </div>
</m-list-box> </m-list-box>
<m-list-box v-if="programType !== 'PYTHON'"> <m-list-box v-if="programType !== 'PYTHON'">
<div slot="text">{{$t('主函数的class')}}</div> <div slot="text">{{$t('Main class')}}</div>
<div slot="content"> <div slot="content">
<x-input <x-input
:disabled="isDetails" :disabled="isDetails"
type="input" type="input"
v-model="mainClass" v-model="mainClass"
:placeholder="$t('请输入mainClass')" :placeholder="$t('Please enter main class')"
autocomplete="off"> autocomplete="off">
</x-input> </x-input>
</div> </div>
</m-list-box> </m-list-box>
<m-list-box> <m-list-box>
<div slot="text">{{$t('主jar包')}}</div> <div slot="text">{{$t('Main jar package')}}</div>
<div slot="content"> <div slot="content">
<x-select <x-select
style="width: 100%;" style="width: 100%;"
:placeholder="$t('请选择主jar包')" :placeholder="$t('Please enter main jar package')"
v-model="mainJar" v-model="mainJar"
filterable filterable
:disabled="isDetails"> :disabled="isDetails">
@ -44,33 +44,33 @@
</div> </div>
</m-list-box> </m-list-box>
<m-list-box> <m-list-box>
<div slot="text">{{$t('命令行参数')}}</div> <div slot="text">{{$t('Command-line parameters')}}</div>
<div slot="content"> <div slot="content">
<x-input <x-input
:autosize="{minRows:2}" :autosize="{minRows:2}"
:disabled="isDetails" :disabled="isDetails"
type="textarea" type="textarea"
v-model="mainArgs" v-model="mainArgs"
:placeholder="$t('请输入命令行参数')" :placeholder="$t('Please enter Command-line parameters')"
autocomplete="off"> autocomplete="off">
</x-input> </x-input>
</div> </div>
</m-list-box> </m-list-box>
<m-list-box> <m-list-box>
<div slot="text">{{$t('其他参数')}}</div> <div slot="text">{{$t('Other parameters')}}</div>
<div slot="content"> <div slot="content">
<x-input <x-input
:disabled="isDetails" :disabled="isDetails"
:autosize="{minRows:2}" :autosize="{minRows:2}"
type="textarea" type="textarea"
v-model="others" v-model="others"
:placeholder="$t('请输入其他参数')" :placeholder="$t('Please enter other parameters')"
autocomplete="off"> autocomplete="off">
</x-input> </x-input>
</div> </div>
</m-list-box> </m-list-box>
<m-list-box> <m-list-box>
<div slot="text">{{$t('资源')}}</div> <div slot="text">{{$t('Resources')}}</div>
<div slot="content"> <div slot="content">
<m-resources <m-resources
ref="refResources" ref="refResources"
@ -80,7 +80,7 @@
</div> </div>
</m-list-box> </m-list-box>
<m-list-box> <m-list-box>
<div slot="text">{{$t('自定义参数')}}</div> <div slot="text">{{$t('Custom Parameters')}}</div>
<div slot="content"> <div slot="content">
<m-local-params <m-local-params
ref="refLocalParams" ref="refLocalParams"
@ -145,12 +145,12 @@
*/ */
_verification () { _verification () {
if (this.programType !== 'PYTHON' && !this.mainClass) { if (this.programType !== 'PYTHON' && !this.mainClass) {
this.$message.warning(`${i18n.$t('请填写主函数的class')}`) this.$message.warning(`${i18n.$t('Please enter main class')}`)
return false return false
} }
if (!this.mainJar) { if (!this.mainJar) {
this.$message.warning(`${i18n.$t('请选择主jar包')}`) this.$message.warning(`${i18n.$t('Please enter main jar package')}`)
return false return false
} }

10
escheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/procedure.vue

@ -1,7 +1,7 @@
<template> <template>
<div class="procedure-model"> <div class="procedure-model">
<m-list-box> <m-list-box>
<div slot="text">{{$t('数据源')}}</div> <div slot="text">{{$t('Datasource')}}</div>
<div slot="content"> <div slot="content">
<m-datasource <m-datasource
ref="refDs" ref="refDs"
@ -12,19 +12,19 @@
</div> </div>
</m-list-box> </m-list-box>
<m-list-box> <m-list-box>
<div slot="text">{{$t('方法')}}</div> <div slot="text">{{$t('methods')}}</div>
<div slot="content"> <div slot="content">
<x-input <x-input
type="input" type="input"
:disabled="isDetails" :disabled="isDetails"
v-model="method" v-model="method"
:placeholder="$t('请输入method(选填)')" :placeholder="$t('Please enter method(optional)')"
autocomplete="off"> autocomplete="off">
</x-input> </x-input>
</div> </div>
</m-list-box> </m-list-box>
<m-list-box> <m-list-box>
<div slot="text">{{$t('自定义参数')}}</div> <div slot="text">{{$t('Custom Parameters')}}</div>
<div slot="content"> <div slot="content">
<m-local-params <m-local-params
ref="refLocalParams" ref="refLocalParams"
@ -85,7 +85,7 @@
// Verification function // Verification function
if (!this.method) { if (!this.method) {
this.$message.warning(`${i18n.$t('请输入方法')}`) this.$message.warning(`${i18n.$t('Please enter method')}`)
return false return false
} }

8
escheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/python.vue

@ -1,7 +1,7 @@
<template> <template>
<div class="shell-model"> <div class="shell-model">
<m-list-box> <m-list-box>
<div slot="text">{{$t('脚本')}}</div> <div slot="text">{{$t('Script')}}</div>
<div slot="content"> <div slot="content">
<div class="from-mirror"> <div class="from-mirror">
<textarea id="code-python-mirror" name="code-python-mirror" style="opacity: 0;"> <textarea id="code-python-mirror" name="code-python-mirror" style="opacity: 0;">
@ -10,7 +10,7 @@
</div> </div>
</m-list-box> </m-list-box>
<m-list-box> <m-list-box>
<div slot="text">{{$t('资源')}}</div> <div slot="text">{{$t('Resources')}}</div>
<div slot="content"> <div slot="content">
<m-resources <m-resources
ref="refResources" ref="refResources"
@ -21,7 +21,7 @@
</m-list-box> </m-list-box>
<m-list-box> <m-list-box>
<div slot="text">{{$t('自定义参数')}}</div> <div slot="text">{{$t('Custom Parameters')}}</div>
<div slot="content"> <div slot="content">
<m-local-params <m-local-params
ref="refLocalParams" ref="refLocalParams"
@ -79,7 +79,7 @@
_verification () { _verification () {
// rawScript // rawScript
if (!editor.getValue()) { if (!editor.getValue()) {
this.$message.warning(`${i18n.$t('请输入rawScript(必填)')}`) this.$message.warning(`${i18n.$t('Please enter script(required)')}`)
return false return false
} }

8
escheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/shell.vue

@ -1,7 +1,7 @@
<template> <template>
<div class="shell-model"> <div class="shell-model">
<m-list-box> <m-list-box>
<div slot="text">{{$t('脚本')}}</div> <div slot="text">{{$t('Script')}}</div>
<div slot="content"> <div slot="content">
<div class="from-mirror"> <div class="from-mirror">
<textarea <textarea
@ -13,7 +13,7 @@
</div> </div>
</m-list-box> </m-list-box>
<m-list-box> <m-list-box>
<div slot="text">{{$t('资源')}}</div> <div slot="text">{{$t('Resources')}}</div>
<div slot="content"> <div slot="content">
<m-resources <m-resources
ref="refResources" ref="refResources"
@ -23,7 +23,7 @@
</div> </div>
</m-list-box> </m-list-box>
<m-list-box> <m-list-box>
<div slot="text">{{$t('自定义参数')}}</div> <div slot="text">{{$t('Custom Parameters')}}</div>
<div slot="content"> <div slot="content">
<m-local-params <m-local-params
ref="refLocalParams" ref="refLocalParams"
@ -81,7 +81,7 @@
_verification () { _verification () {
// rawScript verification // rawScript verification
if (!editor.getValue()) { if (!editor.getValue()) {
this.$message.warning(`${i18n.$t('请输入rawScript(必填)')}`) this.$message.warning(`${i18n.$t('Please enter script(required)')}`)
return false return false
} }

62
escheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/spark.vue

@ -1,7 +1,7 @@
<template> <template>
<div class="spark-model"> <div class="spark-model">
<m-list-box> <m-list-box>
<div slot="text">{{$t('程序类型')}}</div> <div slot="text">{{$t('Program Type')}}</div>
<div slot="content"> <div slot="content">
<x-select <x-select
style="width: 130px;" style="width: 130px;"
@ -17,23 +17,23 @@
</div> </div>
</m-list-box> </m-list-box>
<m-list-box v-if="programType !== 'PYTHON'"> <m-list-box v-if="programType !== 'PYTHON'">
<div slot="text">{{$t('主函数的class')}}</div> <div slot="text">{{$t('Main class')}}</div>
<div slot="content"> <div slot="content">
<x-input <x-input
:disabled="isDetails" :disabled="isDetails"
type="input" type="input"
v-model="mainClass" v-model="mainClass"
:placeholder="$t('请输入mainClass')" :placeholder="$t('Please enter main class')"
autocomplete="off"> autocomplete="off">
</x-input> </x-input>
</div> </div>
</m-list-box> </m-list-box>
<m-list-box> <m-list-box>
<div slot="text">{{$t('主jar包')}}</div> <div slot="text">{{$t('Main jar package')}}</div>
<div slot="content"> <div slot="content">
<x-select <x-select
style="width: 100%;" style="width: 100%;"
:placeholder="$t('请选择主jar包')" :placeholder="$t('Please enter main jar package')"
v-model="mainJar" v-model="mainJar"
filterable filterable
:disabled="isDetails"> :disabled="isDetails">
@ -47,7 +47,7 @@
</div> </div>
</m-list-box> </m-list-box>
<m-list-box> <m-list-box>
<div slot="text">{{$t('部署方式')}}</div> <div slot="text">{{$t('Deploy Mode')}}</div>
<div slot="content"> <div slot="content">
<x-radio-group v-model="deployMode"> <x-radio-group v-model="deployMode">
<x-radio :label="'cluster'" :disabled="isDetails"></x-radio> <x-radio :label="'cluster'" :disabled="isDetails"></x-radio>
@ -58,61 +58,61 @@
</m-list-box> </m-list-box>
<div class="list-box-4p"> <div class="list-box-4p">
<div class="clearfix list"> <div class="clearfix list">
<span class="sp1">{{$t('Driver内核数')}}</span> <span class="sp1">{{$t('Driver core number')}}</span>
<span class="sp2"> <span class="sp2">
<x-input <x-input
:disabled="isDetails" :disabled="isDetails"
type="input" type="input"
v-model="driverCores" v-model="driverCores"
:placeholder="$t('请输入Driver内核数')" :placeholder="$t('Please enter driver core number')"
style="width: 200px;" style="width: 200px;"
autocomplete="off"> autocomplete="off">
</x-input> </x-input>
</span> </span>
<span class="sp1 sp3">{{$t('Driver内存数')}}</span> <span class="sp1 sp3">{{$t('Driver memory use')}}</span>
<span class="sp2"> <span class="sp2">
<x-input <x-input
:disabled="isDetails" :disabled="isDetails"
type="input" type="input"
v-model="driverMemory" v-model="driverMemory"
:placeholder="$t('请输入Driver内存数')" :placeholder="$t('Please enter driver memory use')"
style="width: 186px;" style="width: 186px;"
autocomplete="off"> autocomplete="off">
</x-input> </x-input>
</span> </span>
</div> </div>
<div class="clearfix list"> <div class="clearfix list">
<span class="sp1">{{$t('Executor数量')}}</span> <span class="sp1">{{$t('Number of Executors')}}</span>
<span class="sp2"> <span class="sp2">
<x-input <x-input
:disabled="isDetails" :disabled="isDetails"
type="input" type="input"
v-model="numExecutors" v-model="numExecutors"
:placeholder="$t('请输入Executor数量')" :placeholder="$t('Please enter the number of Executor')"
style="width: 200px;" style="width: 200px;"
autocomplete="off"> autocomplete="off">
</x-input> </x-input>
</span> </span>
<span class="sp1 sp3">{{$t('Executor内存数')}}</span> <span class="sp1 sp3">{{$t('Executor memory')}}</span>
<span class="sp2"> <span class="sp2">
<x-input <x-input
:disabled="isDetails" :disabled="isDetails"
type="input" type="input"
v-model="executorMemory" v-model="executorMemory"
:placeholder="$t('请输入Executor内存数')" :placeholder="$t('Please enter the Executor memory')"
style="width: 186px;" style="width: 186px;"
autocomplete="off"> autocomplete="off">
</x-input> </x-input>
</span> </span>
</div> </div>
<div class="clearfix list"> <div class="clearfix list">
<span class="sp1">{{$t('Executor内核数')}}</span> <span class="sp1">{{$t('Executor core number')}}</span>
<span class="sp2"> <span class="sp2">
<x-input <x-input
:disabled="isDetails" :disabled="isDetails"
type="input" type="input"
v-model="executorCores" v-model="executorCores"
:placeholder="$t('请输入Executor内核数')" :placeholder="$t('Please enter Executor core number')"
style="width: 200px;" style="width: 200px;"
autocomplete="off"> autocomplete="off">
</x-input> </x-input>
@ -120,32 +120,32 @@
</div> </div>
</div> </div>
<m-list-box> <m-list-box>
<div slot="text">{{$t('命令行参数')}}</div> <div slot="text">{{$t('Command-line parameters')}}</div>
<div slot="content"> <div slot="content">
<x-input <x-input
:autosize="{minRows:2}" :autosize="{minRows:2}"
:disabled="isDetails" :disabled="isDetails"
type="textarea" type="textarea"
v-model="mainArgs" v-model="mainArgs"
:placeholder="$t('请输入命令行参数')" :placeholder="$t('Please enter Command-line parameters')"
autocomplete="off"> autocomplete="off">
</x-input> </x-input>
</div> </div>
</m-list-box> </m-list-box>
<m-list-box> <m-list-box>
<div slot="text">{{$t('其他参数')}}</div> <div slot="text">{{$t('Other parameters')}}</div>
<div slot="content"> <div slot="content">
<x-input <x-input
:disabled="isDetails" :disabled="isDetails"
:autosize="{minRows:2}" :autosize="{minRows:2}"
type="textarea" type="textarea"
v-model="others" v-model="others"
:placeholder="$t('请输入其他参数')"> :placeholder="$t('Please enter other parameters')">
</x-input> </x-input>
</div> </div>
</m-list-box> </m-list-box>
<m-list-box> <m-list-box>
<div slot="text">{{$t('资源')}}</div> <div slot="text">{{$t('Resources')}}</div>
<div slot="content"> <div slot="content">
<m-resources <m-resources
ref="refResources" ref="refResources"
@ -155,7 +155,7 @@
</div> </div>
</m-list-box> </m-list-box>
<m-list-box> <m-list-box>
<div slot="text">{{$t('自定义参数')}}</div> <div slot="text">{{$t('Custom Parameters')}}</div>
<div slot="content"> <div slot="content">
<m-local-params <m-local-params
ref="refLocalParams" ref="refLocalParams"
@ -233,47 +233,47 @@
*/ */
_verification () { _verification () {
if (this.programType !== 'PYTHON' && !this.mainClass) { if (this.programType !== 'PYTHON' && !this.mainClass) {
this.$message.warning(`${i18n.$t('请填写主函数的class')}`) this.$message.warning(`${i18n.$t('Please enter main class')}`)
return false return false
} }
if (!this.mainJar) { if (!this.mainJar) {
this.$message.warning(`${i18n.$t('请选择主jar包')}`) this.$message.warning(`${i18n.$t('Please enter main jar package')}`)
return false return false
} }
if (!this.numExecutors) { if (!this.numExecutors) {
this.$message.warning(`${i18n.$t('请填写Executor数量')}`) this.$message.warning(`${i18n.$t('Please enter the number of Executor')}`)
return false return false
} }
if (!Number.isInteger(parseInt(this.numExecutors))) { if (!Number.isInteger(parseInt(this.numExecutors))) {
this.$message.warning(`${i18n.$t('Executor数量为正整数')}`) this.$message.warning(`${i18n.$t('The number of Executors should be a positive integer')}`)
return false return false
} }
if (!this.executorMemory) { if (!this.executorMemory) {
this.$message.warning(`${i18n.$t('请填写Executor内存数')}`) this.$message.warning(`${i18n.$t('Please enter the Executor memory')}`)
return false return false
} }
if (!this.executorMemory) { if (!this.executorMemory) {
this.$message.warning(`${i18n.$t('请填写Executor内存数')}`) this.$message.warning(`${i18n.$t('Please enter the Executor memory')}`)
return false return false
} }
if (!_.isNumber(parseInt(this.executorMemory))) { if (!_.isNumber(parseInt(this.executorMemory))) {
this.$message.warning(`${i18n.$t('内存数为数字')}`) this.$message.warning(`${i18n.$t('Memory should be a positive integer')}`)
return false return false
} }
if (!this.executorCores) { if (!this.executorCores) {
this.$message.warning(`${i18n.$t('请填写Executor内核数')}`) this.$message.warning(`${i18n.$t('Please enter ExecutorPlease enter Executor core number')}`)
return false return false
} }
if (!Number.isInteger(parseInt(this.executorCores))) { if (!Number.isInteger(parseInt(this.executorCores))) {
this.$message.warning(`${i18n.$t('内核数为正整数')}`) this.$message.warning(`${i18n.$t('Core number should be positive integer')}`)
return false return false
} }

20
escheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/sql.vue

@ -1,7 +1,7 @@
<template> <template>
<div class="sql-model"> <div class="sql-model">
<m-list-box> <m-list-box>
<div slot="text">{{$t('数据源')}}</div> <div slot="text">{{$t('Datasource')}}</div>
<div slot="content"> <div slot="content">
<m-datasource <m-datasource
ref="refDs" ref="refDs"
@ -11,7 +11,7 @@
</div> </div>
</m-list-box> </m-list-box>
<m-list-box> <m-list-box>
<div slot="text">{{$t('sql类型')}}</div> <div slot="text">{{$t('SQL Type')}}</div>
<div slot="content"> <div slot="content">
<div style="display: inline-block;"> <div style="display: inline-block;">
<m-sql-type <m-sql-type
@ -21,26 +21,26 @@
</div> </div>
<div v-if="!sqlType" style="display: inline-block;padding-left: 10px;margin-top: 2px;"> <div v-if="!sqlType" style="display: inline-block;padding-left: 10px;margin-top: 2px;">
<x-checkbox-group v-model="showType"> <x-checkbox-group v-model="showType">
<x-checkbox :label="'TABLE'" :disabled="isDetails">{{$t('表格')}}</x-checkbox> <x-checkbox :label="'TABLE'" :disabled="isDetails">{{$t('Table')}}</x-checkbox>
<x-checkbox :label="'ATTACHMENT'" :disabled="isDetails">{{$t('附件')}}</x-checkbox> <x-checkbox :label="'ATTACHMENT'" :disabled="isDetails">{{$t('Attachment')}}</x-checkbox>
</x-checkbox-group> </x-checkbox-group>
</div> </div>
</div> </div>
</m-list-box> </m-list-box>
<m-list-box v-show="type === 'HIVE'"> <m-list-box v-show="type === 'HIVE'">
<div slot="text">{{$t('sql参数')}}</div> <div slot="text">{{$t('SQL Parameter')}}</div>
<div slot="content"> <div slot="content">
<x-input <x-input
:disabled="isDetails" :disabled="isDetails"
type="input" type="input"
v-model="connParams" v-model="connParams"
:placeholder="$t('请输入格式为') + ' key1=value1;key2=value2...'" :placeholder="$t('Please enter format') + ' key1=value1;key2=value2...'"
autocomplete="off"> autocomplete="off">
</x-input> </x-input>
</div> </div>
</m-list-box> </m-list-box>
<m-list-box> <m-list-box>
<div slot="text">{{$t('sql语句')}}</div> <div slot="text">{{$t('SQL Statement')}}</div>
<div slot="content"> <div slot="content">
<div class="from-mirror"> <div class="from-mirror">
<textarea <textarea
@ -52,7 +52,7 @@
</div> </div>
</m-list-box> </m-list-box>
<m-list-box v-if="type === 'HIVE'"> <m-list-box v-if="type === 'HIVE'">
<div slot="text">{{$t('UDF函数')}}</div> <div slot="text">{{$t('UDF Function')}}</div>
<div slot="content"> <div slot="content">
<m-udfs <m-udfs
ref="refUdfs" ref="refUdfs"
@ -63,7 +63,7 @@
</div> </div>
</m-list-box> </m-list-box>
<m-list-box> <m-list-box>
<div slot="text">{{$t('自定义参数')}}</div> <div slot="text">{{$t('Custom Parameters')}}</div>
<div slot="content"> <div slot="content">
<m-local-params <m-local-params
ref="refLocalParams" ref="refLocalParams"
@ -146,7 +146,7 @@
*/ */
_verification () { _verification () {
if (!editor.getValue()) { if (!editor.getValue()) {
this.$message.warning(`${i18n.$t('请输入sql语句(必填)')}`) this.$message.warning(`${i18n.$t('Please enter a SQL Statement(required)')}`)
return false return false
} }

4
escheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/sub_process.vue

@ -2,7 +2,7 @@
<div class="sub_process-model"> <div class="sub_process-model">
<div class="clearfix list"> <div class="clearfix list">
<div class="text-box"> <div class="text-box">
<span>{{$t('子节点')}}</span> <span>{{$t('Child Node')}}</span>
</div> </div>
<div class="cont-box"> <div class="cont-box">
<div class="label-box"> <div class="label-box">
@ -49,7 +49,7 @@
*/ */
_verification () { _verification () {
if (!this.wdiCurr) { if (!this.wdiCurr) {
this.$message.warning(`${i18n.$t('请选择子工作流')}`) this.$message.warning(`${i18n.$t('Please select a sub-Process')}`)
return false return false
} }
this.$emit('on-params', { this.$emit('on-params', {

4
escheduler-ui/src/js/conf/home/pages/dag/_source/jumpAffirm/jumpAffirm.vue

@ -1,7 +1,7 @@
<template> <template>
<div class="affirm-model"> <div class="affirm-model">
<m-popup :ok-text="$t('确认保存')" <m-popup :ok-text="$t('Save')"
:nameText="$t('是否保存DAG图')" :nameText="$t('Whether to save the DAG graph')"
@close="_close" @close="_close"
@ok="_ok"> @ok="_ok">
</m-popup> </m-popup>

10
escheduler-ui/src/js/conf/home/pages/dag/_source/plugIn/jsPlumbHandle.js

@ -193,7 +193,7 @@ JSP.prototype.jsonHandle = function ({ largeJson, locations }) {
targetarr: locations[v.id]['targetarr'], targetarr: locations[v.id]['targetarr'],
isAttachment: this.config.isAttachment, isAttachment: this.config.isAttachment,
taskType: v.type, taskType: v.type,
runFlag:v.runFlag runFlag: v.runFlag
})) }))
// contextmenu event // contextmenu event
@ -264,10 +264,10 @@ JSP.prototype.tasksContextmenu = function (event) {
let isTwo = store.state.dag.isDetails let isTwo = store.state.dag.isDetails
let html = [ let html = [
`<a href="javascript:" id="startRunning" class="${isOne ? '' : 'disbled'}"><i class="iconfont">&#xe60b;</i><span>${i18n.$t('开始运行')}</span></a>`, `<a href="javascript:" id="startRunning" class="${isOne ? '' : 'disbled'}"><i class="iconfont">&#xe60b;</i><span>${i18n.$t('Start')}</span></a>`,
`<a href="javascript:" id="editNodes" class="${isTwo ? 'disbled' : ''}"><i class="iconfont">&#xe601;</i><span>${i18n.$t('编辑节点')}</span></a>`, `<a href="javascript:" id="editNodes" class="${isTwo ? 'disbled' : ''}"><i class="iconfont">&#xe601;</i><span>${i18n.$t('Edit')}</span></a>`,
`<a href="javascript:" id="copyNodes" class="${isTwo ? 'disbled' : ''}"><i class="iconfont">&#xe61e;</i><span>${i18n.$t('复制节点')}</span></a>`, `<a href="javascript:" id="copyNodes" class="${isTwo ? 'disbled' : ''}"><i class="iconfont">&#xe61e;</i><span>${i18n.$t('Copy')}</span></a>`,
`<a href="javascript:" id="removeNodes" class="${isTwo ? 'disbled' : ''}"><i class="iconfont">&#xe611;</i><span>${i18n.$t('删除节点')}</span></a>` `<a href="javascript:" id="removeNodes" class="${isTwo ? 'disbled' : ''}"><i class="iconfont">&#xe611;</i><span>${i18n.$t('Delete')}</span></a>`
] ]
let operationHtml = () => { let operationHtml = () => {

20
escheduler-ui/src/js/conf/home/pages/dag/_source/plugIn/util.js

@ -38,26 +38,26 @@ const saveTargetarr = (valId, domId) => {
} }
const rtBantpl = () => { const rtBantpl = () => {
return `<i class="iconfont" data-toggle="tooltip" data-html="true" data-container="body" data-placement="left" title="${i18n.$t('禁止执行')}">&#xe63e;</i>` return `<i class="iconfont" data-toggle="tooltip" data-html="true" data-container="body" data-placement="left" title="${i18n.$t('Prohibition execution')}">&#xe63e;</i>`
} }
/** /**
* return node html * return node html
*/ */
const rtTasksTpl = ({ id, name, x, y, targetarr, isAttachment, taskType,runFlag }) => { const rtTasksTpl = ({ id, name, x, y, targetarr, isAttachment, taskType, runFlag }) => {
let tpl = `` let tpl = ``
tpl += `<div class="w jtk-draggable jtk-droppable jtk-endpoint-anchor jtk-connected ${isAttachment ? 'jtk-ep' : ''}" data-targetarr="${targetarr || ''}" data-tasks-type="${taskType}" id="${id}" style="left: ${x}px; top: ${y}px;">` tpl += `<div class="w jtk-draggable jtk-droppable jtk-endpoint-anchor jtk-connected ${isAttachment ? 'jtk-ep' : ''}" data-targetarr="${targetarr || ''}" data-tasks-type="${taskType}" id="${id}" style="left: ${x}px; top: ${y}px;">`
tpl += `<div>` tpl += `<div>`
tpl += `<div class="state-p"></div>` tpl += `<div class="state-p"></div>`
tpl += `<div class="icos icos-${taskType}"></div>` tpl += `<div class="icos icos-${taskType}"></div>`
tpl += `<span class="name-p">${name}</span>` tpl += `<span class="name-p">${name}</span>`
tpl += `</div>` tpl += `</div>`
tpl += `<div class="ep"></div>` tpl += `<div class="ep"></div>`
tpl += `<div class="ban-p">` tpl += `<div class="ban-p">`
if (runFlag === 'FORBIDDEN') { if (runFlag === 'FORBIDDEN') {
tpl += rtBantpl() tpl += rtBantpl()
} }
tpl += `</div>` tpl += `</div>`
tpl += `</div>` tpl += `</div>`
return tpl return tpl

16
escheduler-ui/src/js/conf/home/pages/dag/_source/udp/udp.vue

@ -2,14 +2,14 @@
<div class="udp-model"> <div class="udp-model">
<div class="scrollbar contpi-boxt"> <div class="scrollbar contpi-boxt">
<div class="title"> <div class="title">
<span>{{$t('设置DAG图名称')}}</span> <span>{{$t('Set the DAG diagram name')}}</span>
</div> </div>
<div> <div>
<x-input <x-input
type="text" type="text"
v-model="name" v-model="name"
:disabled="router.history.current.name === 'projects-instance-details'" :disabled="router.history.current.name === 'projects-instance-details'"
:placeholder="$t('请输入name(必填)')"> :placeholder="$t('Please enter name(required)')">
</x-input> </x-input>
</div> </div>
<template v-if="router.history.current.name !== 'projects-instance-details'"> <template v-if="router.history.current.name !== 'projects-instance-details'">
@ -18,13 +18,13 @@
type="textarea" type="textarea"
v-model="desc" v-model="desc"
:autosize="{minRows:2}" :autosize="{minRows:2}"
:placeholder="$t('请输入desc(选填)')" :placeholder="$t('Please enter description(optional)')"
autocomplete="off"> autocomplete="off">
</x-input> </x-input>
</div> </div>
</template> </template>
<div class="title" style="padding-top: 6px;"> <div class="title" style="padding-top: 6px;">
<span>{{$t('设置全局')}}</span> <span>{{$t('Set global')}}</span>
</div> </div>
<div class="content"> <div class="content">
<div> <div>
@ -41,11 +41,11 @@
<div class="submit"> <div class="submit">
<template v-if="router.history.current.name === 'projects-instance-details'"> <template v-if="router.history.current.name === 'projects-instance-details'">
<div class="lint-pt"> <div class="lint-pt">
<x-checkbox v-model="syncDefine">{{$t('是否更新流程定义')}}</x-checkbox> <x-checkbox v-model="syncDefine">{{$t('Whether to update the process definition')}}</x-checkbox>
</div> </div>
</template> </template>
<x-button type="text" @click="close()"> {{$t('取消')}} </x-button> <x-button type="text" @click="close()"> {{$t('Cancel')}} </x-button>
<x-button type="primary" shape="circle" @click="ok()" v-ps="['GENERAL_USER']" >{{$t('添加')}}</x-button> <x-button type="primary" shape="circle" @click="ok()" v-ps="['GENERAL_USER']" >{{$t('Add')}}</x-button>
</div> </div>
</div> </div>
</div> </div>
@ -86,7 +86,7 @@
*/ */
ok () { ok () {
if (!this.name) { if (!this.name) {
this.$message.warning(`${i18n.$t('DAG图名称不能为空')}`) this.$message.warning(`${i18n.$t('DAG graph name cannot be empty')}`)
return return
} }

8
escheduler-ui/src/js/conf/home/pages/dag/_source/variable/variablesView.vue

@ -1,13 +1,13 @@
<template> <template>
<div class="variable-model"> <div class="variable-model">
<div class="list"> <div class="list">
<div class="name"><i class="fa fa-code"></i><b style="padding-top: 3px;display: inline-block">{{$t('全局参数')}}</b></div> <div class="name"><i class="fa fa-code"></i><b style="padding-top: 3px;display: inline-block">{{$t('Global parameters')}}</b></div>
<div class="var-cont"> <div class="var-cont">
<x-button size="xsmall" type="ghost" v-for="(item,$index) in list.globalParams" @click="_copy('gbudp-' + $index)" :data-clipboard-text="item.prop + ' = ' +item.value" :class="'gbudp-' + $index"><b style="color: #2A455B;">{{item.prop}}</b> = {{item.value}}</x-button> <x-button size="xsmall" type="ghost" v-for="(item,$index) in list.globalParams" @click="_copy('gbudp-' + $index)" :data-clipboard-text="item.prop + ' = ' +item.value" :class="'gbudp-' + $index"><b style="color: #2A455B;">{{item.prop}}</b> = {{item.value}}</x-button>
</div> </div>
</div> </div>
<div class="list" style="height: 30px;"> <div class="list" style="height: 30px;">
<div class="name"><i class="fa fa-code"></i><b style="padding-top: 3px;display: inline-block">{{$t('局部参数')}}</b></div> <div class="name"><i class="fa fa-code"></i><b style="padding-top: 3px;display: inline-block">{{$t('Local parameters')}}</b></div>
<div class="var-cont"> <div class="var-cont">
&nbsp; &nbsp;
</div> </div>
@ -57,13 +57,13 @@
_copy (className) { _copy (className) {
let clipboard = new Clipboard(`.${className}`) let clipboard = new Clipboard(`.${className}`)
clipboard.on('success', e => { clipboard.on('success', e => {
this.$message.success(`${i18n.$t('复制成功')}`) this.$message.success(`${i18n.$t('Copy success')}`)
// Free memory // Free memory
clipboard.destroy() clipboard.destroy()
}) })
clipboard.on('error', e => { clipboard.on('error', e => {
// Copy is not supported // Copy is not supported
this.$message.warning(`${i18n.$t('该浏览器不支持自动复制')}`) this.$message.warning(`${i18n.$t('The browser does not support automatic copying')}`)
// Free memory // Free memory
clipboard.destroy() clipboard.destroy()
}) })

64
escheduler-ui/src/js/conf/home/pages/datasource/pages/list/_source/createDataSource.vue

@ -1,12 +1,12 @@
<template> <template>
<div class="datasource-popup-model"> <div class="datasource-popup-model">
<div class="top-p"> <div class="top-p">
<span>{{item ? `${$t('编辑')}` : `${$t('创建')}`}}{{`${$t('数据源')}`}}</span> <span>{{item ? `${$t('Edit')}` : `${$t('Create')}`}}{{`${$t('Datasource')}`}}</span>
</div> </div>
<div class="content-p"> <div class="content-p">
<div class="create-datasource-model"> <div class="create-datasource-model">
<m-list-box-f> <m-list-box-f>
<template slot="name"><b>*</b>{{$t('数据源')}}</template> <template slot="name"><b>*</b>{{$t('Datasource')}}</template>
<template slot="content"> <template slot="content">
<x-radio-group v-model="type" size="small"> <x-radio-group v-model="type" size="small">
<x-radio :label="'MYSQL'">MYSQL</x-radio> <x-radio :label="'MYSQL'">MYSQL</x-radio>
@ -20,84 +20,84 @@
</template> </template>
</m-list-box-f> </m-list-box-f>
<m-list-box-f> <m-list-box-f>
<template slot="name"><b>*</b>{{$t('数据源名称')}}</template> <template slot="name"><b>*</b>{{$t('Datasource Name')}}</template>
<template slot="content"> <template slot="content">
<x-input <x-input
type="input" type="input"
v-model="name" v-model="name"
:placeholder="$t('请输入数据源名称')" :placeholder="$t('Please enter datasource name')"
autocomplete="off"> autocomplete="off">
</x-input> </x-input>
</template> </template>
</m-list-box-f> </m-list-box-f>
<m-list-box-f> <m-list-box-f>
<template slot="name">{{$t('描述')}}</template> <template slot="name">{{$t('Description')}}</template>
<template slot="content"> <template slot="content">
<x-input <x-input
type="textarea" type="textarea"
v-model="note" v-model="note"
:placeholder="$t('请输入描述')" :placeholder="$t('Please enter description')"
autocomplete="off"> autocomplete="off">
</x-input> </x-input>
</template> </template>
</m-list-box-f> </m-list-box-f>
<m-list-box-f> <m-list-box-f>
<template slot="name"><b>*</b>{{$t('IP主机名')}}</template> <template slot="name"><b>*</b>{{$t('IP')}}</template>
<template slot="content"> <template slot="content">
<x-input <x-input
type="input" type="input"
v-model="host" v-model="host"
:placeholder="$t('请输入IP主机名')" :placeholder="$t('Please enter IP')"
autocomplete="off"> autocomplete="off">
</x-input> </x-input>
</template> </template>
</m-list-box-f> </m-list-box-f>
<m-list-box-f> <m-list-box-f>
<template slot="name"><b>*</b>{{$t('端口')}}</template> <template slot="name"><b>*</b>{{$t('Port')}}</template>
<template slot="content"> <template slot="content">
<x-input <x-input
type="input" type="input"
v-model="port" v-model="port"
:placeholder="$t('请输入端口')" :placeholder="$t('Please enter port')"
autocomplete="off"> autocomplete="off">
</x-input> </x-input>
</template> </template>
</m-list-box-f> </m-list-box-f>
<m-list-box-f> <m-list-box-f>
<template slot="name"><b>*</b>{{$t('用户名')}}</template> <template slot="name"><b>*</b>{{$t('User Name')}}</template>
<template slot="content"> <template slot="content">
<x-input <x-input
type="input" type="input"
v-model="userName" v-model="userName"
:placeholder="$t('请输入用户名')" :placeholder="$t('Please enter user name')"
autocomplete="off"> autocomplete="off">
</x-input> </x-input>
</template> </template>
</m-list-box-f> </m-list-box-f>
<m-list-box-f> <m-list-box-f>
<template slot="name">{{$t('密码')}}</template> <template slot="name">{{$t('Password')}}</template>
<template slot="content"> <template slot="content">
<x-input <x-input
type="password" type="password"
v-model="password" v-model="password"
:placeholder="$t('请输入密码')" :placeholder="$t('Please enter your password')"
autocomplete="off"> autocomplete="off">
</x-input> </x-input>
</template> </template>
</m-list-box-f> </m-list-box-f>
<m-list-box-f> <m-list-box-f>
<template slot="name"><b>*</b>{{$t('数据库名')}}</template> <template slot="name"><b>*</b>{{$t('Database Name')}}</template>
<template slot="content"> <template slot="content">
<x-input <x-input
type="input" type="input"
v-model="database" v-model="database"
:placeholder="$t('请输入数据库名')" :placeholder="$t('Please enter database name')"
autocomplete="off"> autocomplete="off">
</x-input> </x-input>
</template> </template>
</m-list-box-f> </m-list-box-f>
<m-list-box-f> <m-list-box-f>
<template slot="name">{{$t('jdbc连接参数')}}</template> <template slot="name">{{$t('jdbc connect parameters')}}</template>
<template slot="content"> <template slot="content">
<x-input <x-input
type="textarea" type="textarea"
@ -111,9 +111,9 @@
</div> </div>
</div> </div>
<div class="bottom-p"> <div class="bottom-p">
<x-button type="text" @click="_close()"> {{$t('取消')}} </x-button> <x-button type="text" @click="_close()"> {{$t('Cancel')}} </x-button>
<x-button type="success" shape="circle" @click="_testConnect()" :loading="testLoading">{{testLoading ? 'Loading...' : $t('测试连接')}}</x-button> <x-button type="success" shape="circle" @click="_testConnect()" :loading="testLoading">{{testLoading ? 'Loading...' : $t('Test Connect')}}</x-button>
<x-button type="primary" shape="circle" :loading="spinnerLoading" @click="_ok()">{{spinnerLoading ? 'Loading...' :item ? `${$t('确认编辑')}` : `${$t('确认提交')}`}} </x-button> <x-button type="primary" shape="circle" :loading="spinnerLoading" @click="_ok()">{{spinnerLoading ? 'Loading...' :item ? `${$t('Edit')}` : `${$t('Submit')}`}} </x-button>
</div> </div>
</div> </div>
</template> </template>
@ -158,7 +158,7 @@
}, },
methods: { methods: {
_rtOtherPlaceholder () { _rtOtherPlaceholder () {
return `${i18n.$t('请输入格式为')} {"key1":"value1","key2":"value2"...} ${i18n.$t('连接参数')}` return `${i18n.$t('Please enter format')} {"key1":"value1","key2":"value2"...} ${i18n.$t('connection parameter')}`
}, },
/** /**
* submit * submit
@ -231,29 +231,29 @@
*/ */
_verification () { _verification () {
if (!this.name) { if (!this.name) {
this.$message.warning(`${i18n.$t('请输入资源名称')}`) this.$message.warning(`${i18n.$t('Please enter resource name')}`)
return false return false
} }
if (!this.host) { if (!this.host) {
this.$message.warning(`${i18n.$t('请输入IP/主机名')}`) this.$message.warning(`${i18n.$t('Please enter IP/hostname')}`)
return false return false
} }
if (!this.port) { if (!this.port) {
this.$message.warning(`${i18n.$t('请输入端口')}`) this.$message.warning(`${i18n.$t('Please enter port')}`)
return false return false
} }
if (!this.userName) { if (!this.userName) {
this.$message.warning(`${i18n.$t('请输入用户名')}`) this.$message.warning(`${i18n.$t('Please enter user name')}`)
return false return false
} }
if (!this.database) { if (!this.database) {
this.$message.warning(`${i18n.$t('请输入数据库名')}`) this.$message.warning(`${i18n.$t('Please enter database name')}`)
return false return false
} }
if (this.other) { if (this.other) {
if (!isJson(this.other)) { if (!isJson(this.other)) {
this.$message.warning(`${i18n.$t('jdbc连接参数不是一个正确的JSON格式')}`) this.$message.warning(`${i18n.$t('jdbc connection parameters is not a correct JSON format')}`)
return false return false
} }
} }
@ -333,8 +333,16 @@
padding: 0 20px; padding: 0 20px;
} }
.content-p { .content-p {
min-width: 500px; min-width: 820px;
min-height: 100px; min-height: 100px;
.list-box-f {
.text {
width: 166px;
}
.cont {
width: calc(100% - 186px);
}
}
} }
} }
</style> </style>

28
escheduler-ui/src/js/conf/home/pages/datasource/pages/list/_source/list.vue

@ -4,28 +4,28 @@
<table class="fixed"> <table class="fixed">
<tr> <tr>
<th> <th>
<span>{{$t('编号')}}</span> <span>{{$t('#')}}</span>
</th> </th>
<th> <th>
<span>{{$t('数据源名称')}}</span> <span>{{$t('Datasource Name')}}</span>
</th> </th>
<th width="120"> <th width="120">
<span>{{$t('数据源类型')}}</span> <span>{{$t('Datasource Type')}}</span>
</th> </th>
<th width="100"> <th width="100">
<span>{{$t('数据源参数')}}</span> <span>{{$t('Datasource Parameter')}}</span>
</th> </th>
<th> <th>
<span>{{$t('描述')}}</span> <span>{{$t('Description')}}</span>
</th> </th>
<th width="150"> <th width="150">
<span>{{$t('创建时间')}}</span> <span>{{$t('Create Time')}}</span>
</th> </th>
<th width="150"> <th width="150">
<span>{{$t('更新时间')}}</span> <span>{{$t('Update Time')}}</span>
</th> </th>
<th width="80"> <th width="80">
<span>{{$t('操作')}}</span> <span>{{$t('Operation')}}</span>
</th> </th>
</tr> </tr>
<tr v-for="(item, $index) in list" :key="$index"> <tr v-for="(item, $index) in list" :key="$index">
@ -43,7 +43,7 @@
<td> <td>
<m-tooltips-JSON :JSON="JSON.parse(item.connectionParams)" :id="item.id"> <m-tooltips-JSON :JSON="JSON.parse(item.connectionParams)" :id="item.id">
<span slot="reference"> <span slot="reference">
<a href="javascript:" class="links" style="font-size: 12px;">{{$t('点击查看')}}</a> <a href="javascript:" class="links" style="font-size: 12px;">{{$t('Click to view')}}</a>
</span> </span>
</m-tooltips-JSON> </m-tooltips-JSON>
</td> </td>
@ -57,7 +57,7 @@
size="xsmall" size="xsmall"
data-toggle="tooltip" data-toggle="tooltip"
v-ps="['GENERAL_USER']" v-ps="['GENERAL_USER']"
:title="$t('编辑')" :title="$t('Edit')"
icon="iconfont icon-bianjixiugai" icon="iconfont icon-bianjixiugai"
@click="_edit(item)"> @click="_edit(item)">
</x-button> </x-button>
@ -65,10 +65,10 @@
:ref="'poptip-delete-' + $index" :ref="'poptip-delete-' + $index"
placement="bottom-end" placement="bottom-end"
width="90"> width="90">
<p>{{$t('确定删除吗?')}}</p> <p>{{$t('Delete?')}}</p>
<div style="text-align: right; margin: 0;padding-top: 4px;"> <div style="text-align: right; margin: 0;padding-top: 4px;">
<x-button type="text" size="xsmall" shape="circle" @click="_closeDelete($index)">{{$t('取消')}}</x-button> <x-button type="text" size="xsmall" shape="circle" @click="_closeDelete($index)">{{$t('Cancel')}}</x-button>
<x-button type="primary" size="xsmall" shape="circle" @click="_delete(item,$index)">{{$t('确定')}}</x-button> <x-button type="primary" size="xsmall" shape="circle" @click="_delete(item,$index)">{{$t('Confirm')}}</x-button>
</div> </div>
<template slot="reference"> <template slot="reference">
<x-button <x-button
@ -77,7 +77,7 @@
size="xsmall" size="xsmall"
icon="iconfont icon-shanchu" icon="iconfont icon-shanchu"
data-toggle="tooltip" data-toggle="tooltip"
:title="$t('删除')" :title="$t('delete')"
v-ps="['GENERAL_USER']"> v-ps="['GENERAL_USER']">
</x-button> </x-button>
</template> </template>

55
escheduler-ui/src/js/conf/home/pages/datasource/pages/list/index.vue

@ -1,17 +1,17 @@
<template> <template>
<m-list-construction :title="$t('数据源中心')"> <m-list-construction :title="$t('Datasource')">
<template slot="conditions"> <template slot="conditions">
<m-conditions @on-conditions="_onConditions"> <m-conditions @on-conditions="_onConditions">
<template slot="button-group"> <template slot="button-group">
<x-button type="ghost" size="small" @click="_create('')" v-ps="['GENERAL_USER']">{{$t('创建数据源')}}</x-button> <x-button type="ghost" size="small" @click="_create('')" v-ps="['GENERAL_USER']">{{$t('Create Datasource')}}</x-button>
</template> </template>
</m-conditions> </m-conditions>
</template> </template>
<template slot="content"> <template slot="content">
<template v-if="datasourcesList.length"> <template v-if="datasourcesList.length">
<m-list :datasources-list="datasourcesList" :page-no="pageNo" :page-size="pageSize"></m-list> <m-list :datasources-list="datasourcesList" :page-no="searchParams.pageNo" :page-size="searchParams.pageSize"></m-list>
<div class="page-box"> <div class="page-box">
<x-page :current="pageNo" :total="total" show-elevator @on-change="_page"></x-page> <x-page :current="parseInt(searchParams.pageNo)" :total="total" :page-size="searchParams.pageSize" show-elevator @on-change="_page"></x-page>
</div> </div>
</template> </template>
<template v-if="!datasourcesList.length"> <template v-if="!datasourcesList.length">
@ -23,11 +23,13 @@
</m-list-construction> </m-list-construction>
</template> </template>
<script> <script>
import _ from 'lodash'
import { mapActions } from 'vuex' import { mapActions } from 'vuex'
import mList from './_source/list' import mList from './_source/list'
import mSpin from '@/module/components/spin/spin' import mSpin from '@/module/components/spin/spin'
import mNoData from '@/module/components/noData/noData' import mNoData from '@/module/components/noData/noData'
import mCreateDataSource from './_source/createDataSource' import mCreateDataSource from './_source/createDataSource'
import listUrlParamHandle from '@/module/mixin/listUrlParamHandle'
import mConditions from '@/module/components/conditions/conditions' import mConditions from '@/module/components/conditions/conditions'
import mListConstruction from '@/module/components/listConstruction/listConstruction' import mListConstruction from '@/module/components/listConstruction/listConstruction'
@ -37,18 +39,21 @@
return { return {
// loading // loading
isLoading: true, isLoading: true,
// Number of pages per page
pageSize: 10,
// Number of pages
pageNo: 1,
// Total number of articles // Total number of articles
total: 20, total: 20,
// Search value
searchVal: '',
// data sources(List) // data sources(List)
datasourcesList: [] datasourcesList: [],
searchParams: {
// Number of pages per page
pageSize: 10,
// Number of pages
pageNo: 1,
// Search value
searchVal: ''
}
} }
}, },
mixins: [listUrlParamHandle],
props: {}, props: {},
methods: { methods: {
...mapActions('datasource', ['getDatasourcesListP']), ...mapActions('datasource', ['getDatasourcesListP']),
@ -67,7 +72,7 @@
return h(mCreateDataSource, { return h(mCreateDataSource, {
on: { on: {
onUpdate () { onUpdate () {
self._getDatasourcesListP('false') self._debounceGET('false')
modal.remove() modal.remove()
}, },
close () { close () {
@ -85,27 +90,22 @@
* page * page
*/ */
_page (val) { _page (val) {
this.pageNo = val this.searchParams.pageNo = val
this._getDatasourcesListP()
}, },
/** /**
* conditions event * conditions event
*/ */
_onConditions (o) { _onConditions (o) {
this.searchVal = o.searchVal this.searchParams = _.assign(this.searchParams, o)
this.pageNo = 1 this.searchParams.pageNo = 1
this._getDatasourcesListP('false')
}, },
/** /**
* get data(List) * get data(List)
*/ */
_getDatasourcesListP (flag) { _getList (flag) {
this.isLoading = !flag this.isLoading = !flag
this.getDatasourcesListP({ this.getDatasourcesListP(this.searchParams).then(res => {
pageSize: this.pageSize, this.datasourcesList = []
pageNo: this.pageNo,
searchVal: this.searchVal
}).then(res => {
this.datasourcesList = res.totalList this.datasourcesList = res.totalList
this.total = res.total this.total = res.total
this.isLoading = false this.isLoading = false
@ -114,9 +114,14 @@
}) })
} }
}, },
watch: {}, watch: {
// router
'$route' (a) {
// url no params get instance list
this.searchParams.pageNo = _.isEmpty(a.query) ? 1 : a.query.pageNo
}
},
created () { created () {
this._getDatasourcesListP()
}, },
mounted () { mounted () {
}, },

2
escheduler-ui/src/js/conf/home/pages/home/index.vue

@ -1,5 +1,5 @@
<template> <template>
<m-list-construction :title="$t('首页')"> <m-list-construction :title="$t('Home')">
<template slot="content"> <template slot="content">
<m-project-chart :id="0"></m-project-chart> <m-project-chart :id="0"></m-project-chart>
</template> </template>

24
escheduler-ui/src/js/conf/home/pages/projects/pages/instance/pages/list/_source/common.js → escheduler-ui/src/js/conf/home/pages/projects/pages/_source/instanceConditions/common.js

@ -23,43 +23,43 @@ import i18n from '@/module/i18n'
let stateType = [ let stateType = [
{ {
code: '', code: '',
label: `${i18n.$t('无')}` label: `${i18n.$t('none')}`
}, { }, {
code: 'SUBMITTED_SUCCESS', code: 'SUBMITTED_SUCCESS',
label: `${i18n.$t('提交成功')}` label: `${i18n.$t('Submitted successfully')}`
}, { }, {
code: 'RUNNING_EXEUTION', code: 'RUNNING_EXEUTION',
label: `${i18n.$t('正在运行')}` label: `${i18n.$t('Running')}`
}, { }, {
code: 'READY_PAUSE', code: 'READY_PAUSE',
label: `${i18n.$t('准备暂停')}` label: `${i18n.$t('Ready to pause')}`
}, { }, {
code: 'PAUSE', code: 'PAUSE',
label: `${i18n.$t('暂停')}` label: `${i18n.$t('Pause')}`
}, { }, {
code: 'READY_STOP', code: 'READY_STOP',
label: `${i18n.$t('准备停止')}` label: `${i18n.$t('Ready to stop')}`
}, { }, {
code: 'STOP', code: 'STOP',
label: `${i18n.$t('停止')}` label: `${i18n.$t('Stop')}`
}, { }, {
code: 'FAILURE', code: 'FAILURE',
label: `${i18n.$t('失败')}` label: `${i18n.$t('failed')}`
}, { }, {
code: 'SUCCESS', code: 'SUCCESS',
label: `${i18n.$t('成功')}` label: `${i18n.$t('success')}`
}, { }, {
code: 'NEED_FAULT_TOLERANCE', code: 'NEED_FAULT_TOLERANCE',
label: `${i18n.$t('需要容错')}` label: `${i18n.$t('Need fault tolerance')}`
}, { }, {
code: 'KILL', code: 'KILL',
label: `${i18n.$t('kill')}` label: `${i18n.$t('kill')}`
}, { }, {
code: 'WAITTING_THREAD', code: 'WAITTING_THREAD',
label: `${i18n.$t('等待线程')}` label: `${i18n.$t('Waiting for thread')}`
}, { }, {
code: 'WAITTING_DEPEND', code: 'WAITTING_DEPEND',
label: `${i18n.$t('等待依赖完成')}` label: `${i18n.$t('Waiting for dependency to complete')}`
} }
] ]

87
escheduler-ui/src/js/conf/home/pages/projects/pages/instance/pages/list/_source/conditions.vue → escheduler-ui/src/js/conf/home/pages/projects/pages/_source/instanceConditions/index.vue

@ -11,9 +11,9 @@
type="daterange" type="daterange"
format="YYYY-MM-DD HH:mm:ss" format="YYYY-MM-DD HH:mm:ss"
placement="bottom-end" placement="bottom-end"
v-model="datepicker" :value="[searchParams.startDate,searchParams.endDate]"
:panelNum="2"> :panelNum="2">
<x-input slot="input" readonly slot-scope="{value}" :value="value" style="width: 310px;" size="small" :placeholder="$t('按选择日期区间')"> <x-input slot="input" readonly slot-scope="{value}" :value="value" style="width: 310px;" size="small" :placeholder="$t('Select date range')">
<i slot="suffix" <i slot="suffix"
@click.stop="_dateEmpty()" @click.stop="_dateEmpty()"
class="ans-icon-fail-solid" class="ans-icon-fail-solid"
@ -24,8 +24,8 @@
</x-datepicker> </x-datepicker>
</div> </div>
<div class="list"> <div class="list">
<x-select style="width: 160px;" @on-change="_onChangeState" :value="stateType" > <x-select style="width: 160px;" @on-change="_onChangeState" :value="searchParams.stateType" >
<x-input slot="trigger" readonly :value="selectedModel ? selectedModel.label : ''" slot-scope="{ selectedModel }" style="width: 160px;" size="small" :placeholder="$t('按状态')" suffix-icon="ans-icon-arrow-down"> <x-input slot="trigger" readonly :value="selectedModel ? selectedModel.label : ''" slot-scope="{ selectedModel }" style="width: 160px;" size="small" :placeholder="$t('State')" suffix-icon="ans-icon-arrow-down">
</x-input> </x-input>
<x-option <x-option
v-for="city in stateTypeList" v-for="city in stateTypeList"
@ -36,10 +36,10 @@
</x-select> </x-select>
</div> </div>
<div class="list"> <div class="list">
<x-input v-model="host" style="width: 140px;" size="small" :placeholder="$t('host')"></x-input> <x-input v-model="searchParams.host" style="width: 140px;" size="small" :placeholder="$t('host')"></x-input>
</div> </div>
<div class="list"> <div class="list">
<x-input v-model="searchVal" style="width: 200px;" size="small" :placeholder="$t('按名称')"></x-input> <x-input v-model="searchParams.searchVal" style="width: 200px;" size="small" :placeholder="$t('name')"></x-input>
</div> </div>
</template> </template>
</m-conditions> </m-conditions>
@ -47,91 +47,60 @@
<script> <script>
import _ from 'lodash' import _ from 'lodash'
import { stateType } from './common' import { stateType } from './common'
import { setUrlParams } from '@/module/util/routerUtil'
import mConditions from '@/module/components/conditions/conditions' import mConditions from '@/module/components/conditions/conditions'
export default { export default {
name: 'conditions', name: 'instance-conditions',
data () { data () {
return { return {
// state(list) // state(list)
stateTypeList: stateType, stateTypeList: stateType,
// state searchParams: {
stateType: '', // state
// start date stateType: '',
startDate: '', // start date
// end date startDate: '',
endDate: '', // end date
// search value endDate: '',
searchVal: '', // search value
// host searchVal: '',
host: '', // host
// datepicker plugin host: ''
datepicker: [] }
} }
}, },
props: {}, props: {},
methods: { methods: {
_ckQuery () { _ckQuery () {
setUrlParams({ pageNo: 1 }) this.$emit('on-query', this.searchParams)
this.$emit('on-query', {
startDate: this.startDate || '',
endDate: this.endDate || '',
stateType: this.stateType || '',
host: _.trim(this.host) || '',
searchVal: _.trim(this.searchVal) || ''
})
}, },
/** /**
* change times * change times
*/ */
_onChangeStartStop (val) { _onChangeStartStop (val) {
this.startDate = val[0] this.searchParams.startDate = val[0]
this.endDate = val[1] this.searchParams.endDate = val[1]
// set url params
setUrlParams({
startDate: this.startDate,
endDate: this.endDate
})
}, },
/** /**
* change state * change state
*/ */
_onChangeState (val) { _onChangeState (val) {
this.stateType = val.value this.searchParams.stateType = val.value
// set url params
setUrlParams({
stateType: this.stateType
})
}, },
/** /**
* empty date * empty date
*/ */
_dateEmpty () { _dateEmpty () {
this.startDate = '' this.searchParams.startDate = ''
this.endDate = '' this.searchParams.endDate = ''
this.$refs.datepicker.empty() this.$refs.datepicker.empty()
// set url params
setUrlParams({
startDate: '',
endDate: ''
})
} }
}, },
watch: { watch: {
searchVal (val) {
setUrlParams({
searchVal: _.trim(val)
})
}
}, },
created () { created () {
let query = this.$route.query // Routing parameter merging
if (!_.isEmpty(query)) { if (!_.isEmpty(this.$route.query)) {
this.searchVal = query.searchVal this.searchParams = _.assign(this.searchParams, this.$route.query)
this.startDate = query.startDate
this.endDate = query.endDate
this.stateType = query.stateType
this.datepicker = (!this.startDate && !this.endDate) ? [] : [this.startDate, this.endDate]
} }
}, },
mounted () { mounted () {

141
escheduler-ui/src/js/conf/home/pages/projects/pages/_source/taskRecordList/_source/conditions.vue

@ -0,0 +1,141 @@
<template>
<m-conditions>
<template slot="search-group">
<div class="list">
<x-button type="ghost" size="small" @click="_ckQuery" icon="fa fa-search"></x-button>
</div>
<div class="list">
<x-datepicker
:value="[searchParams.startDate,searchParams.endDate]"
ref="datepicker"
@on-change="_onChangeStartStop"
type="daterange"
format="YYYY-MM-DD HH:mm:ss"
placement="bottom-end"
:panelNum="2">
<x-input slot="input" readonly slot-scope="{value}" :value="value" style="width: 310px;" size="small" :placeholder="$t('Select date range')">
<i slot="suffix"
@click.stop="_dateEmpty()"
class="ans-icon-fail-solid"
v-show="value"
style="font-size: 13px;cursor: pointer;margin-top: 1px;">
</i>
</x-input>
</x-datepicker>
</div>
<div class="list">
<x-input v-model="searchParams.destTable" style="width: 120px;" size="small" :placeholder="$t('Target Table')"></x-input>
</div>
<div class="list">
<x-input v-model="searchParams.sourceTable" style="width: 120px;" size="small" :placeholder="$t('Source Table')"></x-input>
</div>
<div class="list">
<x-select style="width: 90px;" @on-change="_onChangeState" :value="searchParams.state">
<x-input slot="trigger" readonly :value="selectedModel ? selectedModel.label : ''" slot-scope="{ selectedModel }" style="width: 90px;" size="small" :placeholder="$t('State')" suffix-icon="ans-icon-arrow-down"></x-input>
<x-option
v-for="city in stateList"
:key="city.label"
:value="city.code"
:label="city.label">
</x-option>
</x-select>
</div>
<div class="list">
<x-datepicker
v-model="searchParams.taskDate"
@on-change="_onChangeDate"
format="YYYY-MM-DD"
:panelNum="1">
<x-input slot="input" readonly slot-scope="{value}" style="width: 130px;" :value="value" size="small" :placeholder="$t('Date')"></x-input>
</x-datepicker>
</div>
<div class="list">
<x-input v-model="searchParams.taskName" style="width: 130px;" size="small" :placeholder="$t('Task Name')"></x-input>
</div>
</template>
</m-conditions>
</template>
<script>
import _ from 'lodash'
import mConditions from '@/module/components/conditions/conditions'
export default {
name: 'conditions',
data () {
return {
stateList: [
{
label: `${this.$t('none')}`,
code: ``
},
{
label: `${this.$t('success')}`,
code: `成功`
},
{
label: `${this.$t('waiting')}`,
code: `等待`
},
{
label: `${this.$t('execution')}`,
code: `执行中`
},
{
label: `${this.$t('finish')}`,
code: `完成`
}, {
label: `${this.$t('failed')}`,
code: `失败`
}
],
searchParams: {
taskName: '',
state: '',
sourceTable: '',
destTable: '',
taskDate: '',
startDate: '',
endDate: ''
}
}
},
props: {},
methods: {
_ckQuery () {
this.$emit('on-query', this.searchParams)
},
/**
* change times
*/
_onChangeStartStop (val) {
this.searchParams.startDate = val[0]
this.searchParams.endDate = val[1]
},
/**
* change state
*/
_onChangeState (val) {
this.searchParams.state = val.value
},
/**
* empty date
*/
_dateEmpty () {
this.searchParams.startDate = ''
this.searchParams.endDate = ''
this.$refs.datepicker.empty()
},
_onChangeDate (val) {
this.searchParams.taskDate = val.replace(/-/g, '')
}
},
created () {
// Routing parameter merging
if (!_.isEmpty(this.$route.query)) {
this.searchParams = _.assign(this.searchParams, this.$route.query)
}
},
mounted () {
},
components: { mConditions }
}
</script>

32
escheduler-ui/src/js/conf/home/pages/projects/pages/taskRecord/pages/list/_source/list.vue → escheduler-ui/src/js/conf/home/pages/projects/pages/_source/taskRecordList/_source/list.vue

@ -4,37 +4,37 @@
<table class="fixed"> <table class="fixed">
<tr> <tr>
<th> <th>
<span>{{$t('编号')}}</span> <span>{{$t('#')}}</span>
</th> </th>
<th> <th>
<span>{{$t('任务名称')}}</span> <span>{{$t('Task Name')}}</span>
</th> </th>
<th width="66"> <th width="66">
<span>{{$t('任务日期')}}</span> <span>{{$t('Task Date')}}</span>
</th> </th>
<th width="150"> <th width="150">
<span>{{$t('开始时间')}}</span> <span>{{$t('Start Time')}}</span>
</th> </th>
<th width="150"> <th width="150">
<span>{{$t('结束时间')}}</span> <span>{{$t('End Time')}}</span>
</th> </th>
<th width="134"> <th width="134">
<span>{{$t('运行时长')}}({{$t('秒')}})</span> <span>{{$t('Duration')}}(s)</span>
</th> </th>
<th> <th>
<span>{{$t('源表')}}</span> <span>{{$t('Source Table')}}</span>
</th> </th>
<th width="100"> <th width="100">
<span>{{$t('记录数')}}</span> <span>{{$t('Record Number')}}</span>
</th> </th>
<th> <th>
<span>{{$t('目标表')}}</span> <span>{{$t('Target Table')}}</span>
</th> </th>
<th width="100"> <th width="100">
<span>{{$t('记录数')}}</span> <span>{{$t('Record Number')}}</span>
</th> </th>
<th width="88"> <th width="88">
<span>{{$t('状态')}}</span> <span>{{$t('State')}}</span>
</th> </th>
</tr> </tr>
<tr v-for="(item, $index) in list" :key="item.id"> <tr v-for="(item, $index) in list" :key="item.id">
@ -45,8 +45,14 @@
<span class="ellipsis" data-toggle="tooltip" data-container="body" :title="_rtTooltip(item.procName)" data-html="true">{{item.procName}}</span> <span class="ellipsis" data-toggle="tooltip" data-container="body" :title="_rtTooltip(item.procName)" data-html="true">{{item.procName}}</span>
</td> </td>
<td><span>{{item.procDate}}</span></td> <td><span>{{item.procDate}}</span></td>
<td><span>{{item.startTime | formatDate}}</span></td> <td>
<td><span>{{item.endTime | formatDate}}</span></td> <span v-if="item.startTime">{{item.startTime | formatDate}}</span>
<span v-else>-</span>
</td>
<td>
<span v-if="item.endTime">{{item.endTime | formatDate}}</span>
<span v-else>-</span>
</td>
<td><span>{{item.duration}}</span></td> <td><span>{{item.duration}}</span></td>
<td><span class="ellipsis" data-toggle="tooltip" data-container="body" :title="_rtTooltip(item.sourceTab)" data-html="true">{{item.sourceTab}}</span></td> <td><span class="ellipsis" data-toggle="tooltip" data-container="body" :title="_rtTooltip(item.sourceTab)" data-html="true">{{item.sourceTab}}</span></td>
<td> <td>

102
escheduler-ui/src/js/conf/home/pages/projects/pages/_source/taskRecordList/index.vue

@ -0,0 +1,102 @@
<template>
<div class="main-layout-box">
<m-secondary-menu :type="'projects'"></m-secondary-menu>
<m-list-construction :title="config.title">
<template slot="conditions">
<m-conditions @on-query="_onQuery"></m-conditions>
</template>
<template slot="content">
<template v-if="taskRecordList.length">
<m-list :task-record-list="taskRecordList" @on-update="_onUpdate" :page-no="searchParams.pageNo" :page-size="searchParams.pageSize">
</m-list>
<div class="page-box">
<x-page :current="parseInt(searchParams.pageNo)" :total="total" show-elevator @on-change="_page"></x-page>
</div>
</template>
<template v-if="!taskRecordList.length">
<m-no-data></m-no-data>
</template>
<m-spin :is-spin="isLoading"></m-spin>
</template>
</m-list-construction>
</div>
</template>
<script>
import _ from 'lodash'
import mList from './_source/list'
import store from '@/conf/home/store'
import mConditions from './_source/conditions'
import mSpin from '@/module/components/spin/spin'
import mNoData from '@/module/components/noData/noData'
import listUrlParamHandle from '@/module/mixin/listUrlParamHandle'
import mSecondaryMenu from '@/module/components/secondaryMenu/secondaryMenu'
import mListConstruction from '@/module/components/listConstruction/listConstruction'
export default {
name: 'task-record-list',
data () {
return {
store,
total: null,
taskRecordList: [],
isLoading: true,
searchParams: {
taskName: '',
state: '',
sourceTable: '',
destTable: '',
taskDate: '',
startDate: '',
endDate: '',
pageSize: 10,
pageNo: 1
}
}
},
mixins: [listUrlParamHandle],
props: {
config: String
},
methods: {
_onQuery (o) {
this.searchParams = _.assign(this.searchParams, o)
this.searchParams.pageNo = 1
},
_page (val) {
this.searchParams.pageNo = val
},
/**
* get list data
*/
_getList (flag) {
this.isLoading = !flag
this.store.dispatch(`dag/${this.config.apiFn}`, this.searchParams).then(res => {
this.taskRecordList = []
this.taskRecordList = res.totalList
this.total = res.total
this.isLoading = false
}).catch(e => {
this.isLoading = false
})
},
_onUpdate () {
this._debounceGET()
}
},
watch: {
// router
'$route' (a) {
// url no params get instance list
if (_.isEmpty(a.query)) {
this.searchParams.processInstanceId = ''
}
this.searchParams.pageNo = _.isEmpty(a.query) ? 1 : a.query.pageNo
}
},
created () {
},
mounted () {
},
components: { mList, mConditions, mSpin, mListConstruction, mSecondaryMenu, mNoData }
}
</script>

8
escheduler-ui/src/js/conf/home/pages/projects/pages/definition/pages/list/_source/email.vue

@ -30,7 +30,7 @@
:style="{width:emailWidth + 'px'}" :style="{width:emailWidth + 'px'}"
type="text" type="text"
v-model="email" v-model="email"
:placeholder="$t('请输入邮箱')" :placeholder="$t('Please enter email')"
@keydown.tab="_emailTab" @keydown.tab="_emailTab"
@keyup.delete="_emailDelete" @keyup.delete="_emailDelete"
@keyup.enter="_emailEnter" @keyup.enter="_emailEnter"
@ -87,10 +87,10 @@
this.email = '' this.email = ''
this._handlerEmailWitch() this._handlerEmailWitch()
} else { } else {
this.$message.warning(`${i18n.$t('邮箱已存在!收件人和抄送人不能重复')}`) this.$message.warning(`${i18n.$t('Mailbox already exists! Recipients and copyers cannot repeat')}`)
} }
} else { } else {
this.$message.warning(`${i18n.$t('邮箱输入不合法')}`) this.$message.warning(`${i18n.$t('Mailbox input is illegal')}`)
} }
}, },
/** /**
@ -191,7 +191,7 @@
// Non-existing data // Non-existing data
if (_.filter(_.cloneDeep(this.repeatData).concat(_.cloneDeep(this.activeList)), v => v === item).length) { if (_.filter(_.cloneDeep(this.repeatData).concat(_.cloneDeep(this.activeList)), v => v === item).length) {
this.$message.warning(`${i18n.$t('邮箱已存在!收件人和抄送人不能重复')}`) this.$message.warning(`${i18n.$t('Mailbox already exists! Recipients and copyers cannot repeat')}`)
return return
} }
// Width initialization // Width initialization

34
escheduler-ui/src/js/conf/home/pages/projects/pages/definition/pages/list/_source/list.vue

@ -4,28 +4,28 @@
<table class="fixed"> <table class="fixed">
<tr> <tr>
<th> <th>
<span>{{$t('编号')}}</span> <span>{{$t('#')}}</span>
</th> </th>
<th> <th>
<span>{{$t('工作流名称')}}</span> <span>{{$t('Process Name')}}</span>
</th> </th>
<th width="50"> <th width="50">
<span>{{$t('状态')}}</span> <span>{{$t('State')}}</span>
</th> </th>
<th width="140"> <th width="140">
<span>{{$t('创建时间')}}</span> <span>{{$t('Create Time')}}</span>
</th> </th>
<th width="140"> <th width="140">
<span>{{$t('更新时间')}}</span> <span>{{$t('Update Time')}}</span>
</th> </th>
<th> <th>
<span>{{$t('描述')}}</span> <span>{{$t('Description')}}</span>
</th> </th>
<th width="90"> <th width="90">
<span>{{$t('定时状态')}}</span> <span>{{$t('Timing state')}}</span>
</th> </th>
<th width="220"> <th width="220">
<span>{{$t('操作')}}</span> <span>{{$t('Operation')}}</span>
</th> </th>
</tr> </tr>
<tr v-for="(item, $index) in list" :key="item.id"> <tr v-for="(item, $index) in list" :key="item.id">
@ -49,18 +49,18 @@
</td> </td>
<td><span class="ellipsis">{{item.desc}}</span></td> <td><span class="ellipsis">{{item.desc}}</span></td>
<td> <td>
<span v-if="item.scheduleReleaseState === 'OFFLINE'">{{$t('下线')}}</span> <span v-if="item.scheduleReleaseState === 'OFFLINE'">{{$t('offline')}}</span>
<span v-if="item.scheduleReleaseState === 'ONLINE'">{{$t('上线')}}</span> <span v-if="item.scheduleReleaseState === 'ONLINE'">{{$t('online')}}</span>
<span v-if="!item.scheduleReleaseState">-</span> <span v-if="!item.scheduleReleaseState">-</span>
</td> </td>
<td> <td>
<x-button type="info" shape="circle" size="xsmall" data-toggle="tooltip" :title="$t('编辑')" @click="_edit(item)" :disabled="item.releaseState === 'ONLINE'" v-ps="['GENERAL_USER']" icon="iconfont icon-bianji"><!--{{$t('编辑')}}--></x-button> <x-button type="info" shape="circle" size="xsmall" data-toggle="tooltip" :title="$t('Edit')" @click="_edit(item)" :disabled="item.releaseState === 'ONLINE'" v-ps="['GENERAL_USER']" icon="iconfont icon-bianji"><!--{{$t('编辑')}}--></x-button>
<x-button type="success" shape="circle" size="xsmall" data-toggle="tooltip" :title="$t('启动')" @click="_start(item)" :disabled="item.releaseState !== 'ONLINE'" v-ps="['GENERAL_USER']" icon="iconfont icon-qidong"><!--{{$t('启动')}}--></x-button> <x-button type="success" shape="circle" size="xsmall" data-toggle="tooltip" :title="$t('Start')" @click="_start(item)" :disabled="item.releaseState !== 'ONLINE'" v-ps="['GENERAL_USER']" icon="iconfont icon-qidong"><!--{{$t('启动')}}--></x-button>
<x-button type="info" shape="circle" size="xsmall" data-toggle="tooltip" :title="$t('定时')" @click="_timing(item)" :disabled="item.releaseState !== 'ONLINE' || item.scheduleReleaseState !== null" v-ps="['GENERAL_USER']" icon="iconfont icon-timer"><!--{{$t('定时')}}--></x-button> <x-button type="info" shape="circle" size="xsmall" data-toggle="tooltip" :title="$t('Timing')" @click="_timing(item)" :disabled="item.releaseState !== 'ONLINE' || item.scheduleReleaseState !== null" v-ps="['GENERAL_USER']" icon="iconfont icon-timer"><!--{{$t('定时')}}--></x-button>
<x-button type="error" shape="circle" size="xsmall" data-toggle="tooltip" :title="$t('下线')" @click="_downline(item)" v-if="item.releaseState === 'ONLINE'" v-ps="['GENERAL_USER']" icon="iconfont icon-erji-xiaxianjilu"><!--{{$t('下线')}}--></x-button> <x-button type="error" shape="circle" size="xsmall" data-toggle="tooltip" :title="$t('offline')" @click="_downline(item)" v-if="item.releaseState === 'ONLINE'" v-ps="['GENERAL_USER']" icon="iconfont icon-erji-xiaxianjilu"><!--{{$t('下线')}}--></x-button>
<x-button type="warning" shape="circle" size="xsmall" data-toggle="tooltip" :title="$t('上线')" @click="_poponline(item)" v-if="item.releaseState === 'OFFLINE'" v-ps="['GENERAL_USER']" icon="iconfont icon-erji-xiaxianjilu-copy"><!--{{$t('上线')}}--></x-button> <x-button type="warning" shape="circle" size="xsmall" data-toggle="tooltip" :title="$t('online')" @click="_poponline(item)" v-if="item.releaseState === 'OFFLINE'" v-ps="['GENERAL_USER']" icon="iconfont icon-erji-xiaxianjilu-copy"><!--{{$t('上线')}}--></x-button>
<x-button type="info" shape="circle" size="xsmall" data-toggle="tooltip" :title="$t('定时管理')" @click="_timingManage(item)" :disabled="item.releaseState !== 'ONLINE'" v-ps="['GENERAL_USER']" icon="iconfont icon-paibanguanli"><!--{{$t('定时管理')}}--></x-button> <x-button type="info" shape="circle" size="xsmall" data-toggle="tooltip" :title="$t('Cron Manage')" @click="_timingManage(item)" :disabled="item.releaseState !== 'ONLINE'" v-ps="['GENERAL_USER']" icon="iconfont icon-paibanguanli"><!--{{$t('定时管理')}}--></x-button>
<x-button type="info" shape="circle" size="xsmall" data-toggle="tooltip" :title="$t('树形图')" @click="_treeView(item)" icon="iconfont icon-juxingkaobei"><!--{{$t('树形图')}}--></x-button> <x-button type="info" shape="circle" size="xsmall" data-toggle="tooltip" :title="$t('TreeView')" @click="_treeView(item)" icon="iconfont icon-juxingkaobei"><!--{{$t('树形图')}}--></x-button>
</td> </td>
</tr> </tr>
</table> </table>

46
escheduler-ui/src/js/conf/home/pages/projects/pages/definition/pages/list/_source/start.vue

@ -1,34 +1,34 @@
<template> <template>
<div class="start-process-model"> <div class="start-process-model">
<div class="title-box"> <div class="title-box">
<span>{{$t('启动前请先设置参数')}}</span> <span>{{$t('Please set the parameters before starting')}}</span>
</div> </div>
<div class="clearfix list"> <div class="clearfix list">
<div class="text"> <div class="text">
{{$t('失败策略')}} {{$t('Failure Strategy')}}
</div> </div>
<div class="cont"> <div class="cont">
<x-radio-group v-model="failureStrategy" style="margin-top: 7px;"> <x-radio-group v-model="failureStrategy" style="margin-top: 7px;">
<x-radio :label="'CONTINUE'">{{$t('继续')}}</x-radio> <x-radio :label="'CONTINUE'">{{$t('Continue')}}</x-radio>
<x-radio :label="'END'">{{$t('结束')}}</x-radio> <x-radio :label="'END'">{{$t('End')}}</x-radio>
</x-radio-group> </x-radio-group>
</div> </div>
</div> </div>
<div class="clearfix list" v-if="sourceType === 'contextmenu'"> <div class="clearfix list" v-if="sourceType === 'contextmenu'">
<div class="text"> <div class="text">
{{$t('节点执行')}} {{$t('Node execution')}}
</div> </div>
<div class="cont"> <div class="cont">
<x-radio-group v-model="taskDependType"> <x-radio-group v-model="taskDependType">
<x-radio :label="'TASK_POST'">{{$t('向后执行')}}</x-radio> <x-radio :label="'TASK_POST'">{{$t('Backward execution')}}</x-radio>
<x-radio :label="'TASK_PRE'">{{$t('向前执行')}}</x-radio> <x-radio :label="'TASK_PRE'">{{$t('Forward execution')}}</x-radio>
<x-radio :label="'TASK_ONLY'">{{$t('仅执行当前节点')}}</x-radio> <x-radio :label="'TASK_ONLY'">{{$t('Execute only the current node')}}</x-radio>
</x-radio-group> </x-radio-group>
</div> </div>
</div> </div>
<div class="clearfix list"> <div class="clearfix list">
<div class="text"> <div class="text">
{{$t('通知策略')}} {{$t('Notification strategy')}}
</div> </div>
<div class="cont"> <div class="cont">
<x-select style="width: 200px;" v-model="warningType"> <x-select style="width: 200px;" v-model="warningType">
@ -43,7 +43,7 @@
</div> </div>
<div class="clearfix list"> <div class="clearfix list">
<div class="text"> <div class="text">
{{$t('流程优先级')}} {{$t('Process priority')}}
</div> </div>
<div class="cont"> <div class="cont">
<m-priority v-model="processInstancePriority"></m-priority> <m-priority v-model="processInstancePriority"></m-priority>
@ -51,14 +51,14 @@
</div> </div>
<div class="clearfix list"> <div class="clearfix list">
<div class="text"> <div class="text">
{{$t('通知组')}} {{$t('Notification group')}}
</div> </div>
<div class="cont"> <div class="cont">
<x-select <x-select
style="width: 200px;" style="width: 200px;"
v-model="warningGroupId" v-model="warningGroupId"
:disabled="!notifyGroupList.length"> :disabled="!notifyGroupList.length">
<x-input slot="trigger" slot-scope="{ selectedModel }" readonly :placeholder="$t('请选择通知组')" :value="selectedModel ? selectedModel.label : ''" style="width: 200px;" @on-click-icon.stop="warningGroupId = {}"> <x-input slot="trigger" slot-scope="{ selectedModel }" readonly :placeholder="$t('Please select a notification group')" :value="selectedModel ? selectedModel.label : ''" style="width: 200px;" @on-click-icon.stop="warningGroupId = {}">
<i slot="suffix" class="fa fa-times-circle" style="font-size: 15px;cursor: pointer;" v-show="warningGroupId.id"></i> <i slot="suffix" class="fa fa-times-circle" style="font-size: 15px;cursor: pointer;" v-show="warningGroupId.id"></i>
<i slot="suffix" class="ans-icon-arrow-down" style="font-size: 12px;" v-show="!warningGroupId.id"></i> <i slot="suffix" class="ans-icon-arrow-down" style="font-size: 12px;" v-show="!warningGroupId.id"></i>
</x-input> </x-input>
@ -73,7 +73,7 @@
</div> </div>
<div class="clearfix list"> <div class="clearfix list">
<div class="text"> <div class="text">
{{$t('收件人')}} {{$t('Recipient')}}
</div> </div>
<div class="cont"> <div class="cont">
<m-email v-model="receivers" :repeat-data="receiversCc"></m-email> <m-email v-model="receivers" :repeat-data="receiversCc"></m-email>
@ -81,7 +81,7 @@
</div> </div>
<div class="clearfix list"> <div class="clearfix list">
<div class="text"> <div class="text">
{{$t('抄送人')}} {{$t('Cc')}}
</div> </div>
<div class="cont"> <div class="cont">
<m-email v-model="receiversCc" :repeat-data="receivers"></m-email> <m-email v-model="receiversCc" :repeat-data="receivers"></m-email>
@ -89,29 +89,29 @@
</div> </div>
<div class="clearfix list"> <div class="clearfix list">
<div class="text"> <div class="text">
{{$t('补数')}} {{$t('Complement Data')}}
</div> </div>
<div class="cont"> <div class="cont">
<div style="padding-top: 6px;"> <div style="padding-top: 6px;">
<x-checkbox v-model="execType">{{$t('是否补数')}}</x-checkbox> <x-checkbox v-model="execType">{{$t('Whether it is a complement process?')}}</x-checkbox>
</div> </div>
</div> </div>
</div> </div>
<template v-if="execType"> <template v-if="execType">
<div class="clearfix list" style="margin:-6px 0 16px 0"> <div class="clearfix list" style="margin:-6px 0 16px 0">
<div class="text"> <div class="text">
{{$t('执行方式')}} {{$t('Mode of execution')}}
</div> </div>
<div class="cont"> <div class="cont">
<x-radio-group v-model="runMode" style="margin-top: 7px;"> <x-radio-group v-model="runMode" style="margin-top: 7px;">
<x-radio :label="'RUN_MODE_SERIAL'">{{$t('串行执行')}}</x-radio> <x-radio :label="'RUN_MODE_SERIAL'">{{$t('Serial execution')}}</x-radio>
<x-radio :label="'RUN_MODE_PARALLEL'">{{$t('并行执行')}}</x-radio> <x-radio :label="'RUN_MODE_PARALLEL'">{{$t('Parallel execution')}}</x-radio>
</x-radio-group> </x-radio-group>
</div> </div>
</div> </div>
<div class="clearfix list"> <div class="clearfix list">
<div class="text"> <div class="text">
{{$t('时间')}} {{$t('Date')}}
</div> </div>
<div class="cont"> <div class="cont">
<x-datepicker <x-datepicker
@ -121,15 +121,15 @@
@on-change="_datepicker" @on-change="_datepicker"
:value="scheduleTime" :value="scheduleTime"
type="daterange" type="daterange"
:placeholder="$t('选择日期区间')" :placeholder="$t('Select date range')"
format="YYYY-MM-DD HH:mm:ss"> format="YYYY-MM-DD HH:mm:ss">
</x-datepicker> </x-datepicker>
</div> </div>
</div> </div>
</template> </template>
<div class="submit"> <div class="submit">
<x-button type="text" @click="close()"> {{$t('取消')}} </x-button> <x-button type="text" @click="close()"> {{$t('Cancel')}} </x-button>
<x-button type="primary" shape="circle" :loading="spinnerLoading" @click="ok()" v-ps="['GENERAL_USER']">{{spinnerLoading ? 'Loading...' : $t('启动')}} </x-button> <x-button type="primary" shape="circle" :loading="spinnerLoading" @click="ok()" v-ps="['GENERAL_USER']">{{spinnerLoading ? 'Loading...' : $t('Start')}} </x-button>
</div> </div>
</div> </div>
</template> </template>

39
escheduler-ui/src/js/conf/home/pages/projects/pages/definition/pages/list/_source/timing.vue

@ -1,11 +1,11 @@
<template> <template>
<div class="timing-process-model"> <div class="timing-process-model">
<div class="title-box"> <div class="title-box">
<span>{{$t('定时前请先设置参数')}}</span> <span>{{$t('Set parameters before timing')}}</span>
</div> </div>
<div class="clearfix list"> <div class="clearfix list">
<div class="text"> <div class="text">
{{$t('起止时间')}} {{$t('Start and stop time')}}
</div> </div>
<div class="cont"> <div class="cont">
<x-datepicker <x-datepicker
@ -15,14 +15,14 @@
@on-change="_datepicker" @on-change="_datepicker"
:value="scheduleTime" :value="scheduleTime"
type="daterange" type="daterange"
:placeholder="$t('选择日期区间')" :placeholder="$t('Select date range')"
format="YYYY-MM-DD HH:mm:ss"> format="YYYY-MM-DD HH:mm:ss">
</x-datepicker> </x-datepicker>
</div> </div>
</div> </div>
<div class="clearfix list"> <div class="clearfix list">
<div class="text"> <div class="text">
{{$t('定时')}} {{$t('Timing')}}
</div> </div>
<div class="cont"> <div class="cont">
<template> <template>
@ -45,18 +45,18 @@
</div> </div>
<div class="clearfix list"> <div class="clearfix list">
<div class="text"> <div class="text">
{{$t('失败策略')}} {{$t('Failure Strategy')}}
</div> </div>
<div class="cont"> <div class="cont">
<x-radio-group v-model="failureStrategy" style="margin-top: 7px;"> <x-radio-group v-model="failureStrategy" style="margin-top: 7px;">
<x-radio :label="'CONTINUE'">{{$t('继续')}}</x-radio> <x-radio :label="'CONTINUE'">{{$t('Continue')}}</x-radio>
<x-radio :label="'END'">{{$t('结束')}}</x-radio> <x-radio :label="'END'">{{$t('End')}}</x-radio>
</x-radio-group> </x-radio-group>
</div> </div>
</div> </div>
<div class="clearfix list"> <div class="clearfix list">
<div class="text"> <div class="text">
{{$t('通知策略')}} {{$t('Notification strategy')}}
</div> </div>
<div class="cont"> <div class="cont">
<x-select <x-select
@ -73,7 +73,7 @@
</div> </div>
<div class="clearfix list"> <div class="clearfix list">
<div class="text"> <div class="text">
{{$t('流程优先级')}} {{$t('Process priority')}}
</div> </div>
<div class="cont"> <div class="cont">
<m-priority v-model="processInstancePriority"></m-priority> <m-priority v-model="processInstancePriority"></m-priority>
@ -81,14 +81,14 @@
</div> </div>
<div class="clearfix list"> <div class="clearfix list">
<div class="text"> <div class="text">
{{$t('通知组')}} {{$t('Notification group')}}
</div> </div>
<div class="cont"> <div class="cont">
<x-select <x-select
style="width: 200px;" style="width: 200px;"
:disabled="!notifyGroupList.length" :disabled="!notifyGroupList.length"
v-model="warningGroupId"> v-model="warningGroupId">
<x-input slot="trigger" readonly slot-scope="{ selectedModel }" :placeholder="$t('请选择通知组')" :value="selectedModel ? selectedModel.label : ''" style="width: 200px;" @on-click-icon.stop="warningGroupId = {}"> <x-input slot="trigger" readonly slot-scope="{ selectedModel }" :placeholder="$t('Please select a notification group')" :value="selectedModel ? selectedModel.label : ''" style="width: 200px;" @on-click-icon.stop="warningGroupId = {}">
<i slot="suffix" class="fa fa-times-circle" style="font-size: 15px;cursor: pointer;" v-show="warningGroupId.id"></i> <i slot="suffix" class="fa fa-times-circle" style="font-size: 15px;cursor: pointer;" v-show="warningGroupId.id"></i>
<i slot="suffix" class="ans-icon-arrow-down" style="font-size: 12px;" v-show="!warningGroupId.id"></i> <i slot="suffix" class="ans-icon-arrow-down" style="font-size: 12px;" v-show="!warningGroupId.id"></i>
</x-input> </x-input>
@ -103,7 +103,7 @@
</div> </div>
<div class="clearfix list"> <div class="clearfix list">
<div class="text"> <div class="text">
{{$t('收件人')}} {{$t('Recipient')}}
</div> </div>
<div class="cont" style="width: 680px;"> <div class="cont" style="width: 680px;">
<m-email v-model="receivers" :repeat-data="receiversCc"></m-email> <m-email v-model="receivers" :repeat-data="receiversCc"></m-email>
@ -111,15 +111,15 @@
</div> </div>
<div class="clearfix list"> <div class="clearfix list">
<div class="text"> <div class="text">
{{$t('抄送人')}} {{$t('Cc')}}
</div> </div>
<div class="cont" style="width: 680px;"> <div class="cont" style="width: 680px;">
<m-email v-model="receiversCc" :repeat-data="receivers"></m-email> <m-email v-model="receiversCc" :repeat-data="receivers"></m-email>
</div> </div>
</div> </div>
<div class="submit"> <div class="submit">
<x-button type="text" @click="close()"> {{$t('取消')}} </x-button> <x-button type="text" @click="close()"> {{$t('Cancel')}} </x-button>
<x-button type="primary" shape="circle" :loading="spinnerLoading" @click="ok()" v-ps="['GENERAL_USER']">{{spinnerLoading ? 'Loading...' : (item.crontab ? $t('编辑') : $t('创建'))}} </x-button> <x-button type="primary" shape="circle" :loading="spinnerLoading" @click="ok()" v-ps="['GENERAL_USER']">{{spinnerLoading ? 'Loading...' : (item.crontab ? $t('Edit') : $t('Create'))}} </x-button>
</div> </div>
</div> </div>
</template> </template>
@ -166,12 +166,12 @@
}, },
_verification () { _verification () {
if (!this.scheduleTime) { if (!this.scheduleTime) {
this.$message.warning(`${i18n.$t('请选择时间')}`) this.$message.warning(`${i18n.$t('Please select time')}`)
return false return false
} }
if (!this.crontab) { if (!this.crontab) {
this.$message.warning(`${i18n.$t('请填写 crontab')}`) this.$message.warning(`${i18n.$t('Please enter crontab')}`)
return false return false
} }
return true return true
@ -192,18 +192,21 @@
receivers: this.receivers.join(',') || '', receivers: this.receivers.join(',') || '',
receiversCc: this.receiversCc.join(',') || '' receiversCc: this.receiversCc.join(',') || ''
} }
let msg = ''
// edit // edit
if (this.item.crontab) { if (this.item.crontab) {
api = 'dag/updateSchedule' api = 'dag/updateSchedule'
searchParams.id = this.item.id searchParams.id = this.item.id
msg = `${i18n.$t('Edit')}${i18n.$t('success')},${i18n.$t('Please go online')}`
} else { } else {
api = 'dag/createSchedule' api = 'dag/createSchedule'
searchParams.processDefinitionId = this.item.id searchParams.processDefinitionId = this.item.id
msg = `${i18n.$t('Create')}${i18n.$t('success')}`
} }
this.store.dispatch(api, searchParams).then(res => { this.store.dispatch(api, searchParams).then(res => {
this.$message.success(res.msg) this.$message.success(msg)
this.$emit('onUpdate') this.$emit('onUpdate')
}).catch(e => { }).catch(e => {
this.$message.error(e.msg || '') this.$message.error(e.msg || '')

8
escheduler-ui/src/js/conf/home/pages/projects/pages/definition/pages/list/_source/util.js

@ -20,19 +20,19 @@ import i18n from '@/module/i18n'
let warningTypeList = [ let warningTypeList = [
{ {
id: 'NONE', id: 'NONE',
code: `${i18n.$t('都不发')}` code: `${i18n.$t('none_1')}`
}, },
{ {
id: 'SUCCESS', id: 'SUCCESS',
code: `${i18n.$t('成功发')}` code: `${i18n.$t('success_1')}`
}, },
{ {
id: 'FAILURE', id: 'FAILURE',
code: `${i18n.$t('失败发')}` code: `${i18n.$t('failure_1')}`
}, },
{ {
id: 'ALL', id: 'ALL',
code: `${i18n.$t('成功或失败都发')}` code: `${i18n.$t('All_1')}`
} }
] ]

63
escheduler-ui/src/js/conf/home/pages/projects/pages/definition/pages/list/index.vue

@ -1,11 +1,11 @@
<template> <template>
<div class="main-layout-box"> <div class="main-layout-box">
<m-secondary-menu :type="'projects'"></m-secondary-menu> <m-secondary-menu :type="'projects'"></m-secondary-menu>
<m-list-construction :title="$t('工作流定义')"> <m-list-construction :title="$t('Process definition')">
<template slot="conditions"> <template slot="conditions">
<m-conditions @on-conditions="_onConditions"> <m-conditions @on-conditions="_onConditions">
<template slot="button-group"> <template slot="button-group">
<x-button type="ghost" size="small" v-ps="['GENERAL_USER']" @click="() => this.$router.push({name: 'definition-create'})">{{$t('创建工作流')}}</x-button> <x-button type="ghost" size="small" v-ps="['GENERAL_USER']" @click="() => this.$router.push({name: 'definition-create'})">{{$t('Create process')}}</x-button>
</template> </template>
</m-conditions> </m-conditions>
</template> </template>
@ -30,8 +30,8 @@
import mList from './_source/list' import mList from './_source/list'
import mSpin from '@/module/components/spin/spin' import mSpin from '@/module/components/spin/spin'
import localStore from '@/module/util/localStorage' import localStore from '@/module/util/localStorage'
import { setUrlParams } from '@/module/util/routerUtil'
import mNoData from '@/module/components/noData/noData' import mNoData from '@/module/components/noData/noData'
import listUrlParamHandle from '@/module/mixin/listUrlParamHandle'
import mConditions from '@/module/components/conditions/conditions' import mConditions from '@/module/components/conditions/conditions'
import mSecondaryMenu from '@/module/components/secondaryMenu/secondaryMenu' import mSecondaryMenu from '@/module/components/secondaryMenu/secondaryMenu'
import mListConstruction from '@/module/components/listConstruction/listConstruction' import mListConstruction from '@/module/components/listConstruction/listConstruction'
@ -44,15 +44,14 @@
processListP: [], processListP: [],
isLoading: true, isLoading: true,
searchParams: { searchParams: {
//
pageSize: 10, pageSize: 10,
//
pageNo: 1, pageNo: 1,
// searchVal: '',
searchVal: '' userId: ''
} }
} }
}, },
mixins: [listUrlParamHandle],
props: { props: {
}, },
methods: { methods: {
@ -62,10 +61,6 @@
*/ */
_page (val) { _page (val) {
this.searchParams.pageNo = val this.searchParams.pageNo = val
setUrlParams({
pageNo: this.searchParams.pageNo
})
this._debounceGET()
}, },
/** /**
* conditions * conditions
@ -73,23 +68,13 @@
_onConditions (o) { _onConditions (o) {
this.searchParams.searchVal = o.searchVal this.searchParams.searchVal = o.searchVal
this.searchParams.pageNo = 1 this.searchParams.pageNo = 1
setUrlParams({
pageNo: this.searchParams.pageNo
})
this._debounceGET()
}, },
/** /**
* get data list * get data list
*/ */
_getProcessListP (flag) { _getList (flag) {
this.isLoading = !flag this.isLoading = !flag
this.getProcessListP({ this.getProcessListP(this.searchParams).then(res => {
pageSize: this.searchParams.pageSize,
pageNo: this.searchParams.pageNo,
searchVal: this.searchParams.searchVal,
userId: this.$route.query.userId || ''
}).then(res => {
setUrlParams({ pageNo: this.pageNo })
this.processListP = [] this.processListP = []
this.processListP = res.totalList this.processListP = res.totalList
this.total = res.total this.total = res.total
@ -100,48 +85,20 @@
}, },
_onUpdate () { _onUpdate () {
this._debounceGET('false') this._debounceGET('false')
}, }
/**
* Anti-shake request interface
* @desc Prevent function from being called multiple times
*/
_debounceGET: _.debounce(function (flag) {
this._getProcessListP(flag)
}, 100, {
'leading': false,
'trailing': true
})
}, },
watch: { watch: {
'$route' (a) { '$route' (a) {
// url no params get instance list // url no params get instance list
if (_.isEmpty(a.query)) { this.searchParams.pageNo = _.isEmpty(a.query) ? 1 : a.query.pageNo
this.searchParams.pageNo = 1
} else {
this.searchParams.pageNo = a.query.pageNo || 1
}
},
'searchParams': {
deep: true,
handler () {
this._debounceGET()
}
} }
}, },
created () { created () {
localStore.removeItem('subProcessId') localStore.removeItem('subProcessId')
// Routing parameter merging
if (!_.isEmpty(this.$route.query)) {
this.searchParams = _.assign(this.searchParams, this.$route.query)
}
}, },
mounted () { mounted () {
this._debounceGET()
}, },
components: { mList, mConditions, mSpin, mListConstruction, mSecondaryMenu, mNoData } components: { mList, mConditions, mSpin, mListConstruction, mSecondaryMenu, mNoData }
} }
</script> </script>
<style lang="scss" rel="stylesheet/scss">
</style>

8
escheduler-ui/src/js/conf/home/pages/projects/pages/definition/pages/tree/index.vue

@ -1,7 +1,7 @@
<template> <template>
<div class="main-layout-box"> <div class="main-layout-box">
<m-secondary-menu :type="'projects'"></m-secondary-menu> <m-secondary-menu :type="'projects'"></m-secondary-menu>
<m-list-construction :title="$t('树形图')"> <m-list-construction :title="$t('TreeView')">
<template slot="conditions"></template> <template slot="conditions"></template>
<template slot="content"> <template slot="content">
<div class="tree-view-index-model"> <div class="tree-view-index-model">
@ -20,13 +20,13 @@
type="primary" type="primary"
size="default" size="default"
icon="fa fa-reply"> icon="fa fa-reply">
返回上一节点 {{$t('Return_1')}}
</x-button> </x-button>
</div> </div>
<div class="tasks-color"> <div class="tasks-color">
<div class="toolbar-color-sp"> <div class="toolbar-color-sp">
<a href="javascript:"> <a href="javascript:">
<span>节点类型</span> <span>Node Type</span>
</a> </a>
<a href="javascript:" v-for="(k,v) in tasksType"> <a href="javascript:" v-for="(k,v) in tasksType">
<i class="fa fa-circle" :style="{color:k.color}"></i> <i class="fa fa-circle" :style="{color:k.color}"></i>
@ -35,7 +35,7 @@
</div> </div>
<div class="state-tasks-color-sp"> <div class="state-tasks-color-sp">
<a href="javascript:"> <a href="javascript:">
<span>任务状态</span> <span>{{$t('Task Status')}}</span>
</a> </a>
<a href="javascript:" v-for="(item) in tasksState"> <a href="javascript:" v-for="(item) in tasksState">
<i class="fa fa-square" :style="{color:item.color}"></i> <i class="fa fa-square" :style="{color:item.color}"></i>

24
escheduler-ui/src/js/conf/home/pages/projects/pages/definition/timing/_source/list.vue

@ -9,34 +9,34 @@
<table> <table>
<tr> <tr>
<th> <th>
<span>{{$t('编号')}}</span> <span>{{$t('#')}}</span>
</th> </th>
<th> <th>
<span>{{$t('流程名称')}}</span> <span>{{$t('Process Name')}}</span>
</th> </th>
<th> <th>
<span>{{$t('开始时间')}}</span> <span>{{$t('Start Time')}}</span>
</th> </th>
<th> <th>
<span>{{$t('结束时间')}}</span> <span>{{$t('End Time')}}</span>
</th> </th>
<th> <th>
<span>{{$t('crontab')}}</span> <span>{{$t('crontab')}}</span>
</th> </th>
<th> <th>
<span>{{$t('失败策略')}}</span> <span>{{$t('Failure Strategy')}}</span>
</th> </th>
<th> <th>
<span>{{$t('状态')}}</span> <span>{{$t('State')}}</span>
</th> </th>
<th> <th>
<span>{{$t('创建时间')}}</span> <span>{{$t('Create Time')}}</span>
</th> </th>
<th> <th>
<span>{{$t('更新时间')}}</span> <span>{{$t('Update Time')}}</span>
</th> </th>
<th width="80"> <th width="80">
<span>{{$t('操作')}}</span> <span>{{$t('Operation')}}</span>
</th> </th>
</tr> </tr>
<tr v-for="(item, $index) in list" :key="item.id"> <tr v-for="(item, $index) in list" :key="item.id">
@ -73,7 +73,7 @@
shape="circle" shape="circle"
size="xsmall" size="xsmall"
data-toggle="tooltip" data-toggle="tooltip"
:title="$t('编辑')" :title="$t('Edit')"
@click="_editTiming(item)" @click="_editTiming(item)"
icon="iconfont icon-bianji" icon="iconfont icon-bianji"
:disabled="item.releaseState === 'ONLINE'" > :disabled="item.releaseState === 'ONLINE'" >
@ -83,7 +83,7 @@
shape="circle" shape="circle"
size="xsmall" size="xsmall"
data-toggle="tooltip" data-toggle="tooltip"
:title="$t('上线')" :title="$t('online')"
@click="_online(item)" @click="_online(item)"
icon="iconfont icon-erji-xiaxianjilu-copy" icon="iconfont icon-erji-xiaxianjilu-copy"
v-if="item.releaseState === 'OFFLINE'"> v-if="item.releaseState === 'OFFLINE'">
@ -93,7 +93,7 @@
shape="circle" shape="circle"
size="xsmall" size="xsmall"
data-toggle="tooltip" data-toggle="tooltip"
:title="$t('下线')" :title="$t('offline')"
icon="iconfont icon-erji-xiaxianjilu" icon="iconfont icon-erji-xiaxianjilu"
@click="_offline(item)" @click="_offline(item)"
v-if="item.releaseState === 'ONLINE'"> v-if="item.releaseState === 'ONLINE'">

2
escheduler-ui/src/js/conf/home/pages/projects/pages/definition/timing/index.vue

@ -1,7 +1,7 @@
<template> <template>
<div class="main-layout-box"> <div class="main-layout-box">
<m-secondary-menu :type="'projects'"></m-secondary-menu> <m-secondary-menu :type="'projects'"></m-secondary-menu>
<m-list-construction :title="$t('定时管理')"> <m-list-construction :title="$t('Cron Manage')">
<template slot="content"> <template slot="content">
<m-list></m-list> <m-list></m-list>
</template> </template>

18
escheduler-ui/src/js/conf/home/pages/projects/pages/historyTaskRecord/index.vue

@ -0,0 +1,18 @@
<template>
<m-list :config="config"></m-list>
</template>
<script>
import mList from '@/conf/home/pages/projects/pages/_source/taskRecordList'
export default {
name: 'history-task-record',
data () {
return {
config: {
title: `${this.$t('History task record')}`,
apiFn: 'getHistoryTaskRecordList'
}
}
},
components: { mList }
}
</script>

36
escheduler-ui/src/js/conf/home/pages/projects/pages/index/_source/projectChart.vue

@ -9,14 +9,14 @@
@on-change="_datepicker" @on-change="_datepicker"
:value="scheduleTime" :value="scheduleTime"
type="daterange" type="daterange"
:placeholder="$t('选择日期区间')" :placeholder="$t('Select date range')"
format="YYYY-MM-DD HH:mm:ss"> format="YYYY-MM-DD HH:mm:ss">
</x-datepicker> </x-datepicker>
</div> </div>
<div class="row" > <div class="row" >
<div class="col-md-6"> <div class="col-md-6">
<div class="chart-title"> <div class="chart-title">
<span>{{$t('任务状态统计')}}</span> <span>{{$t('Task status statistics')}}</span>
</div> </div>
<div class="row"> <div class="row">
<div class="col-md-7"> <div class="col-md-7">
@ -26,9 +26,9 @@
<div class="table-small-model"> <div class="table-small-model">
<table> <table>
<tr> <tr>
<th width="40">{{$t('序号')}}</th> <th width="40">{{$t('#')}}</th>
<th>{{$t('数量')}}</th> <th>{{$t('Number')}}</th>
<th>{{$t('状态')}}</th> <th>{{$t('State')}}</th>
</tr> </tr>
<tr v-for="(item,$index) in taskCountDtosList"> <tr v-for="(item,$index) in taskCountDtosList">
<td><span>{{$index+1}}</span></td> <td><span>{{$index+1}}</span></td>
@ -37,7 +37,7 @@
<a href="javascript:" @click="id && _goTask(item.key)" :class="id ?'links':''">{{item.value}}</a> <a href="javascript:" @click="id && _goTask(item.key)" :class="id ?'links':''">{{item.value}}</a>
</span> </span>
</td> </td>
<td><span>{{item.key}}</span></td> <td><span class="ellipsis" style="width: 98%;" :title="item.key">{{item.key}}</span></td>
</tr> </tr>
</table> </table>
</div> </div>
@ -46,7 +46,7 @@
</div> </div>
<div class="col-md-6"> <div class="col-md-6">
<div class="chart-title"> <div class="chart-title">
<span>{{$t('流程状态统计')}}</span> <span>{{$t('Process Status Statistics')}}</span>
</div> </div>
<div class="row"> <div class="row">
<div class="col-md-7"> <div class="col-md-7">
@ -56,14 +56,14 @@
<div class="table-small-model"> <div class="table-small-model">
<table> <table>
<tr> <tr>
<th width="40">{{$t('序号')}}</th> <th width="40">{{$t('#')}}</th>
<th>{{$t('数量')}}</th> <th>{{$t('Number')}}</th>
<th>{{$t('状态')}}</th> <th>{{$t('State')}}</th>
</tr> </tr>
<tr v-for="(item,$index) in processStateCountList"> <tr v-for="(item,$index) in processStateCountList">
<td><span>{{$index+1}}</span></td> <td><span>{{$index+1}}</span></td>
<td><span><a href="javascript:" @click="id && _goProcess(item.key)" :class="id ?'links':''">{{item.value}}</a></span></td> <td><span><a href="javascript:" @click="id && _goProcess(item.key)" :class="id ?'links':''">{{item.value}}</a></span></td>
<td><span>{{item.key}}</span></td> <td><span class="ellipsis" style="width: 98%;" :title="item.key">{{item.key}}</span></td>
</tr> </tr>
</table> </table>
</div> </div>
@ -74,7 +74,7 @@
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<div class="chart-title" style="margin-bottom: -20px;margin-top: 30px"> <div class="chart-title" style="margin-bottom: -20px;margin-top: 30px">
<span>{{$t('流程定义统计')}}</span> <span>{{$t('Process Definition Statistics')}}</span>
</div> </div>
<div> <div>
<div id="process-definition-bar" style="height:500px"></div> <div id="process-definition-bar" style="height:500px"></div>
@ -93,7 +93,7 @@
import dayjs from 'dayjs' import dayjs from 'dayjs'
import { mapActions } from 'vuex' import { mapActions } from 'vuex'
import { pie, bar } from './chartConfig' import { pie, bar } from './chartConfig'
import { stateType } from '@/conf/home/pages/projects/pages/instance/pages/list/_source/common' import { stateType } from '@/conf/home/pages/projects/pages/_source/instanceConditions/common'
import Chart from '~/@analysys/ana-charts' import Chart from '~/@analysys/ana-charts'
import mNoData from '@/module/components/noData/noData' import mNoData from '@/module/components/noData/noData'
import mSpin from '@/module/components/spin/spin' import mSpin from '@/module/components/spin/spin'
@ -122,7 +122,7 @@
}, },
_goTask (name) { _goTask (name) {
this.$router.push({ this.$router.push({
name: 'task-instance-list', name: 'task-instance',
query: { query: {
stateType: _.find(stateType, ['label', name])['code'], stateType: _.find(stateType, ['label', name])['code'],
startDate: this.scheduleTime[0], startDate: this.scheduleTime[0],
@ -273,4 +273,12 @@
} }
} }
} }
.table-small-model {
.ellipsis {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
display: block;
}
}
</style> </style>

2
escheduler-ui/src/js/conf/home/pages/projects/pages/index/index.vue

@ -1,7 +1,7 @@
<template> <template>
<div class="main-layout-box"> <div class="main-layout-box">
<m-secondary-menu :type="'projects'"></m-secondary-menu> <m-secondary-menu :type="'projects'"></m-secondary-menu>
<m-list-construction :title="$t('项目首页')"> <m-list-construction :title="$t('Project Home')">
<template slot="content"> <template slot="content">
<m-project-chart :id="id"></m-project-chart> <m-project-chart :id="id"></m-project-chart>
</template> </template>

31
escheduler-ui/src/js/conf/home/pages/projects/pages/instance/index.vue

@ -3,33 +3,6 @@
</template> </template>
<script> <script>
export default { export default {
name: 'process-instance-index', name: 'process-instance-index'
data () {
return {
}
},
props: {},
methods: {
},
watch: {
},
created () {
},
mounted () {
},
updated () {
},
beforeDestroy () {
},
destroyed () {
},
computed: {
},
components: { }
} }
</script> </script>
<style lang="scss" rel="stylesheet/scss">
</style>

6
escheduler-ui/src/js/conf/home/pages/projects/pages/instance/pages/gantt/index.vue

@ -1,13 +1,13 @@
<template> <template>
<div class="main-layout-box"> <div class="main-layout-box">
<m-secondary-menu :type="'projects'"></m-secondary-menu> <m-secondary-menu :type="'projects'"></m-secondary-menu>
<m-list-construction :title="$t('甘特图')"> <m-list-construction :title="$t('Gantt')">
<template slot="content"> <template slot="content">
<div class="gantt-model"> <div class="gantt-model">
<div class="gantt-state"> <div class="gantt-state">
<div class="state-tasks-color-sp"> <div class="state-tasks-color-sp">
<a href="javascript:"> <a href="javascript:">
<span>{{$t('任务状态')}}</span> <span>{{$t('Task Status')}}</span>
</a> </a>
<a href="javascript:" v-for="(item) in tasksState"> <a href="javascript:" v-for="(item) in tasksState">
<i class="fa fa-square" :style="{color:item.color}"></i> <i class="fa fa-square" :style="{color:item.color}"></i>
@ -71,7 +71,7 @@
this.isNodata = true this.isNodata = true
return return
} }
// // Gantt
Gantt.init({ Gantt.init({
el: '.gantt', el: '.gantt',
tasks: res.tasks tasks: res.tasks

69
escheduler-ui/src/js/conf/home/pages/projects/pages/instance/pages/list/_source/list.vue

@ -4,37 +4,37 @@
<table class="fixed"> <table class="fixed">
<tr> <tr>
<th> <th>
<span>{{$t('编号')}}</span> <span>{{$t('#')}}</span>
</th> </th>
<th> <th>
<span>{{$t('工作流名称')}}</span> <span>{{$t('Process Name')}}</span>
</th> </th>
<th width="120"> <th width="120">
<span>{{$t('运行类型')}}</span> <span>{{$t('Run Type')}}</span>
</th> </th>
<th width="140"> <th width="140">
<span>{{$t('开始时间')}}</span> <span>{{$t('Start Time')}}</span>
</th> </th>
<th width="140"> <th width="140">
<span>{{$t('结束时间')}}</span> <span>{{$t('End Time')}}</span>
</th> </th>
<th width="90"> <th width="90">
<span>{{$t('运行时长(s)')}}</span> <span>{{$t('Duration')}}s</span>
</th> </th>
<th width="72"> <th width="72">
<span>{{$t('运行次数')}}</span> <span>{{$t('Run Times')}}</span>
</th> </th>
<th width="100"> <th width="100">
<span>{{$t('host')}}</span> <span>{{$t('host')}}</span>
</th> </th>
<th width="70"> <th width="70">
<span>{{$t('容错标识')}}</span> <span>{{$t('fault-tolerant sign')}}</span>
</th> </th>
<th width="50"> <th width="50">
<span>{{$t('状态')}}</span> <span>{{$t('State')}}</span>
</th> </th>
<th width="260"> <th width="260">
<span>{{$t('操作')}}</span> <span>{{$t('Operation')}}</span>
</th> </th>
</tr> </tr>
<tr v-for="(item, $index) in list" :key="item.id"> <tr v-for="(item, $index) in list" :key="item.id">
@ -67,55 +67,55 @@
shape="circle" shape="circle"
size="xsmall" size="xsmall"
data-toggle="tooltip" data-toggle="tooltip"
:title="$t('编辑')" :title="$t('Edit')"
@click="_reEdit(item)" @click="_reEdit(item)"
v-ps="['GENERAL_USER']" v-ps="['GENERAL_USER']"
icon="iconfont icon-bianjixiugai" icon="iconfont icon-bianjixiugai"
:disabled="item.state !== 'SUCCESS' && item.state !== 'PAUSE' && item.state !== 'FAILURE' && item.state !== 'STOP'"><!--{{$t('编辑')}}--></x-button> :disabled="item.state !== 'SUCCESS' && item.state !== 'PAUSE' && item.state !== 'FAILURE' && item.state !== 'STOP'"></x-button>
<x-button type="info" <x-button type="info"
shape="circle" shape="circle"
size="xsmall" size="xsmall"
data-toggle="tooltip" data-toggle="tooltip"
:title="$t('重跑')" :title="$t('Rerun')"
@click="_reRun(item,$index)" @click="_reRun(item,$index)"
v-ps="['GENERAL_USER']" v-ps="['GENERAL_USER']"
icon="iconfont icon-shuaxin" icon="iconfont icon-shuaxin"
:disabled="item.state !== 'SUCCESS' && item.state !== 'PAUSE' && item.state !== 'FAILURE' && item.state !== 'STOP'"><!--{{$t('重跑')}}--></x-button> :disabled="item.state !== 'SUCCESS' && item.state !== 'PAUSE' && item.state !== 'FAILURE' && item.state !== 'STOP'"></x-button>
<x-button type="success" <x-button type="success"
shape="circle" shape="circle"
size="xsmall" size="xsmall"
data-toggle="tooltip" data-toggle="tooltip"
:title="$t('恢复失败')" :title="$t('Recovery Failed')"
@click="_restore(item,$index)" @click="_restore(item,$index)"
v-ps="['GENERAL_USER']" v-ps="['GENERAL_USER']"
icon="iconfont icon-cuowuguanbishibai" icon="iconfont icon-cuowuguanbishibai"
:disabled="item.state !== 'FAILURE'"><!--{{$t('恢复失败')}}--></x-button> :disabled="item.state !== 'FAILURE'"></x-button>
<x-button type="error" <x-button type="error"
shape="circle" shape="circle"
size="xsmall" size="xsmall"
data-toggle="tooltip" data-toggle="tooltip"
:title="$t('停止')" :title="$t('Stop')"
@click="_stop(item)" @click="_stop(item)"
v-ps="['GENERAL_USER']" v-ps="['GENERAL_USER']"
icon="iconfont icon-zanting1" icon="iconfont icon-zanting1"
:disabled="item.state !== 'RUNNING_EXEUTION'"><!--{{$t('停止')}}--></x-button> :disabled="item.state !== 'RUNNING_EXEUTION'"></x-button>
<x-button type="warning" <x-button type="warning"
shape="circle" shape="circle"
size="xsmall" size="xsmall"
data-toggle="tooltip" data-toggle="tooltip"
:title="item.state === 'PAUSE' ? $t('恢复暂停') : $t('暂停')" :title="item.state === 'PAUSE' ? $t('Recovery Suspend') : $t('Pause')"
@click="_suspend(item,$index)" @click="_suspend(item,$index)"
v-ps="['GENERAL_USER']" v-ps="['GENERAL_USER']"
:icon="item.state === 'PAUSE' ? 'iconfont icon-ai06' : 'iconfont icon-zanting'" :icon="item.state === 'PAUSE' ? 'iconfont icon-ai06' : 'iconfont icon-zanting'"
:disabled="item.state !== 'RUNNING_EXEUTION' && item.state !== 'PAUSE'"><!--{{item.state === 'PAUSE' ? $t('恢复暂停') : $t('暂停')}}--></x-button> :disabled="item.state !== 'RUNNING_EXEUTION' && item.state !== 'PAUSE'"></x-button>
<x-poptip <x-poptip
:ref="'poptip-delete-' + $index" :ref="'poptip-delete-' + $index"
placement="bottom-end" placement="bottom-end"
width="90"> width="90">
<p>{{$t('确定删除吗?')}}</p> <p>{{$t('Delete?')}}</p>
<div style="text-align: right; margin: 0;padding-top: 4px;"> <div style="text-align: right; margin: 0;padding-top: 4px;">
<x-button type="text" size="xsmall" shape="circle" @click="_closeDelete($index)">{{$t('取消')}}</x-button> <x-button type="text" size="xsmall" shape="circle" @click="_closeDelete($index)">{{$t('Cancel')}}</x-button>
<x-button type="primary" size="xsmall" shape="circle" @click="_delete(item,$index)">{{$t('确定')}}</x-button> <x-button type="primary" size="xsmall" shape="circle" @click="_delete(item,$index)">{{$t('Confirm')}}</x-button>
</div> </div>
<template slot="reference"> <template slot="reference">
<x-button <x-button
@ -124,7 +124,7 @@
shape="circle" shape="circle"
size="xsmall" size="xsmall"
data-toggle="tooltip" data-toggle="tooltip"
:title="$t('删除')" :title="$t('delete')"
v-ps="['GENERAL_USER']"> v-ps="['GENERAL_USER']">
</x-button> </x-button>
</template> </template>
@ -134,15 +134,14 @@
shape="circle" shape="circle"
size="xsmall" size="xsmall"
data-toggle="tooltip" data-toggle="tooltip"
:title="$t('甘特图')" :title="$t('Gantt')"
@click="_gantt(item)" @click="_gantt(item)"
icon="iconfont icon-gantt"> icon="iconfont icon-gantt">
<!--{{$t('甘特图')}}-->
</x-button> </x-button>
</div> </div>
<div v-show="!item.disabled"> <div v-show="!item.disabled">
<!--编辑--> <!--Edit-->
<x-button <x-button
type="info" type="info"
shape="circle" shape="circle"
@ -151,7 +150,7 @@
disabled="true"> disabled="true">
</x-button> </x-button>
<!--重跑--> <!--Rerun-->
<x-button <x-button
v-show="buttonType === 'run'" v-show="buttonType === 'run'"
type="info" type="info"
@ -169,7 +168,7 @@
disabled="true"> disabled="true">
</x-button> </x-button>
<!--恢复失败--> <!--Recovery Failed-->
<x-button <x-button
v-show="buttonType === 'store'" v-show="buttonType === 'store'"
type="success" type="success"
@ -187,7 +186,7 @@
disabled="true"> disabled="true">
</x-button> </x-button>
<!--停止--> <!--Stop-->
<x-button <x-button
type="error" type="error"
shape="circle" shape="circle"
@ -196,7 +195,7 @@
disabled="true"> disabled="true">
</x-button> </x-button>
<!--倒计时 => 恢复暂停/暂停--> <!--倒计时 => Recovery Suspend/Pause-->
<x-button <x-button
v-show="item.state === 'PAUSE' && buttonType === 'suspend'" v-show="item.state === 'PAUSE' && buttonType === 'suspend'"
type="warning" type="warning"
@ -205,7 +204,7 @@
disabled="true"> disabled="true">
{{item.count}}s {{item.count}}s
</x-button> </x-button>
<!--恢复暂停--> <!--Recovery Suspend-->
<x-button <x-button
v-show="item.state === 'PAUSE' && buttonType !== 'suspend'" v-show="item.state === 'PAUSE' && buttonType !== 'suspend'"
type="warning" type="warning"
@ -214,7 +213,7 @@
icon="iconfont icon-ai06" icon="iconfont icon-ai06"
disabled="true"> disabled="true">
</x-button> </x-button>
<!--暂停--> <!--Pause-->
<x-button <x-button
v-show="item.state !== 'PAUSE'" v-show="item.state !== 'PAUSE'"
type="warning" type="warning"
@ -224,7 +223,7 @@
disabled="true"> disabled="true">
</x-button> </x-button>
<!--删除--> <!--delete-->
<x-button <x-button
type="error" type="error"
shape="circle" shape="circle"
@ -233,7 +232,7 @@
:disabled="true"> :disabled="true">
</x-button> </x-button>
<!--甘特图--> <!--Gantt-->
<x-button <x-button
type="info" type="info"
shape="circle" shape="circle"

27
escheduler-ui/src/js/conf/home/pages/projects/pages/instance/pages/list/index.vue

@ -1,9 +1,9 @@
<template> <template>
<div class="main-layout-box"> <div class="main-layout-box">
<m-secondary-menu :type="'projects'"></m-secondary-menu> <m-secondary-menu :type="'projects'"></m-secondary-menu>
<m-list-construction :title="$t('工作流实例')"> <m-list-construction :title="$t('Process Instance')">
<template slot="conditions"> <template slot="conditions">
<m-conditions @on-query="_onQuery"></m-conditions> <m-instance-conditions @on-query="_onQuery"></m-instance-conditions>
</template> </template>
<template slot="content"> <template slot="content">
<template v-if="processInstanceList.length"> <template v-if="processInstanceList.length">
@ -25,13 +25,13 @@
import _ from 'lodash' import _ from 'lodash'
import { mapActions } from 'vuex' import { mapActions } from 'vuex'
import mList from './_source/list' import mList from './_source/list'
import mConditions from './_source/conditions'
import mSpin from '@/module/components/spin/spin' import mSpin from '@/module/components/spin/spin'
import localStore from '@/module/util/localStorage' import localStore from '@/module/util/localStorage'
import { setUrlParams } from '@/module/util/routerUtil' import { setUrlParams } from '@/module/util/routerUtil'
import mNoData from '@/module/components/noData/noData' import mNoData from '@/module/components/noData/noData'
import mSecondaryMenu from '@/module/components/secondaryMenu/secondaryMenu' import mSecondaryMenu from '@/module/components/secondaryMenu/secondaryMenu'
import mListConstruction from '@/module/components/listConstruction/listConstruction' import mListConstruction from '@/module/components/listConstruction/listConstruction'
import mInstanceConditions from '@/conf/home/pages/projects/pages/_source/instanceConditions'
export default { export default {
name: 'instance-list-index', name: 'instance-list-index',
@ -43,7 +43,7 @@
total: null, total: null,
// //
processInstanceList: [], processInstanceList: [],
// // Parameter
searchParams: { searchParams: {
// //
searchVal: '', searchVal: '',
@ -53,11 +53,11 @@
pageNo: 1, pageNo: 1,
// host // host
host: '', host: '',
// // State
stateType: '', stateType: '',
// // Start Time
startDate: '', startDate: '',
// // End Time
endDate: '' endDate: ''
} }
} }
@ -66,19 +66,20 @@
methods: { methods: {
...mapActions('dag', ['getProcessInstance']), ...mapActions('dag', ['getProcessInstance']),
/** /**
* 查询 * Query
*/ */
_onQuery (o) { _onQuery (o) {
this.searchParams = _.assign(this.searchParams, o) this.searchParams = _.assign(this.searchParams, o)
setUrlParams(this.searchParams)
this._debounceGET()
}, },
/** /**
* 分页事件 * 分页事件
*/ */
_page (val) { _page (val) {
this.searchParams.pageNo = val this.searchParams.pageNo = val
setUrlParams({ setUrlParams(this.searchParams)
pageNo: this.searchParams.pageNo this._debounceGET()
})
}, },
/** /**
* 获取list数据 * 获取list数据
@ -98,7 +99,7 @@
* 更新 * 更新
*/ */
_onUpdate () { _onUpdate () {
this._debounceGET('false') this._debounceGET()
}, },
/** /**
* 路由变动 * 路由变动
@ -158,7 +159,7 @@
// //
clearInterval(this.setIntervalP) clearInterval(this.setIntervalP)
}, },
components: { mList, mConditions, mSpin, mListConstruction, mSecondaryMenu, mNoData } components: { mList, mInstanceConditions, mSpin, mListConstruction, mSecondaryMenu, mNoData }
} }
</script> </script>

12
escheduler-ui/src/js/conf/home/pages/projects/pages/list/_source/createProject.vue

@ -1,25 +1,25 @@
<template> <template>
<m-popup ref="popup" :ok-text="item ? $t('确认编辑') : $t('确认提交')" :nameText="item ? $t('编辑项目') : $t('创建项目')" @ok="_ok"> <m-popup ref="popup" :ok-text="item ? $t('Edit') : $t('Submit')" :nameText="item ? $t('Edit') : $t('Create Project')" @ok="_ok">
<template slot="content"> <template slot="content">
<div class="projects-create-model"> <div class="projects-create-model">
<m-list-box-f> <m-list-box-f>
<template slot="name"><b>*</b>{{$t('项目名称')}}</template> <template slot="name"><b>*</b>{{$t('Project Name')}}</template>
<template slot="content"> <template slot="content">
<x-input <x-input
type="input" type="input"
v-model="projectName" v-model="projectName"
:placeholder="$t('请输入name')" :placeholder="$t('Please enter name')"
autocomplete="off"> autocomplete="off">
</x-input> </x-input>
</template> </template>
</m-list-box-f> </m-list-box-f>
<m-list-box-f> <m-list-box-f>
<template slot="name">{{$t('描述')}}</template> <template slot="name">{{$t('Description')}}</template>
<template slot="content"> <template slot="content">
<x-input <x-input
type="textarea" type="textarea"
v-model="desc" v-model="desc"
:placeholder="$t('请输入desc')" :placeholder="$t('Please enter description')"
autocomplete="off"> autocomplete="off">
</x-input> </x-input>
</template> </template>
@ -78,7 +78,7 @@
}, },
_verification () { _verification () {
if (!this.projectName) { if (!this.projectName) {
this.$message.warning(`${i18n.$t('请输入名称')}`) this.$message.warning(`${i18n.$t('Please enter name')}`)
return false return false
} }
return true return true

24
escheduler-ui/src/js/conf/home/pages/projects/pages/list/_source/list.vue

@ -4,25 +4,25 @@
<table> <table>
<tr> <tr>
<th> <th>
<span>{{$t('编号')}}</span> <span>{{$t('#')}}</span>
</th> </th>
<th> <th>
<span>{{$t('项目名称')}}</span> <span>{{$t('Project Name')}}</span>
</th> </th>
<th> <th>
<span>{{$t('所属用户')}}</span> <span>{{$t('Owned Users')}}</span>
</th> </th>
<th> <th>
<span>{{$t('描述')}}</span> <span>{{$t('Description')}}</span>
</th> </th>
<th> <th>
<span>{{$t('创建时间')}}</span> <span>{{$t('Create Time')}}</span>
</th> </th>
<th> <th>
<span>{{$t('更新时间')}}</span> <span>{{$t('Update Time')}}</span>
</th> </th>
<th width="80"> <th width="80">
<span>{{$t('操作')}}</span> <span>{{$t('Operation')}}</span>
</th> </th>
</tr> </tr>
<tr v-for="(item, $index) in list" :key="$index"> <tr v-for="(item, $index) in list" :key="$index">
@ -49,7 +49,7 @@
shape="circle" shape="circle"
size="xsmall" size="xsmall"
data-toggle="tooltip" data-toggle="tooltip"
:title="$t('编辑')" :title="$t('Edit')"
@click="_edit(item)" @click="_edit(item)"
icon="iconfont icon-bianjixiugai" icon="iconfont icon-bianjixiugai"
v-ps="['GENERAL_USER']"> v-ps="['GENERAL_USER']">
@ -58,10 +58,10 @@
:ref="'poptip-' + $index" :ref="'poptip-' + $index"
placement="bottom-end" placement="bottom-end"
width="90"> width="90">
<p>{{$t('确定删除吗?')}}</p> <p>{{$t('Delete?')}}</p>
<div style="text-align: right; margin: 0;padding-top: 4px;"> <div style="text-align: right; margin: 0;padding-top: 4px;">
<x-button type="text" size="xsmall" shape="circle" @click="_closeDelete($index)">{{$t('取消')}}</x-button> <x-button type="text" size="xsmall" shape="circle" @click="_closeDelete($index)">{{$t('Cancel')}}</x-button>
<x-button type="primary" size="xsmall" shape="circle" @click="_delete(item,$index)">{{$t('确定')}}</x-button> <x-button type="primary" size="xsmall" shape="circle" @click="_delete(item,$index)">{{$t('Confirm')}}</x-button>
</div> </div>
<template slot="reference"> <template slot="reference">
<x-button <x-button
@ -69,7 +69,7 @@
shape="circle" shape="circle"
size="xsmall" size="xsmall"
data-toggle="tooltip" data-toggle="tooltip"
:title="$t('删除')" :title="$t('delete')"
icon="iconfont icon-shanchu" icon="iconfont icon-shanchu"
v-ps="['GENERAL_USER']"> v-ps="['GENERAL_USER']">
</x-button> </x-button>

63
escheduler-ui/src/js/conf/home/pages/projects/pages/list/index.vue

@ -1,17 +1,17 @@
<template> <template>
<m-list-construction :title="$t('项目管理')"> <m-list-construction :title="$t('Project')">
<template slot="conditions"> <template slot="conditions">
<m-conditions @on-conditions="_onConditions"> <m-conditions @on-conditions="_onConditions">
<template slot="button-group"> <template slot="button-group">
<x-button type="ghost" size="small" @click="_create('')" v-ps="['GENERAL_USER']">{{$t('创建项目')}}</x-button> <x-button type="ghost" size="small" @click="_create('')" v-ps="['GENERAL_USER']">{{$t('Create Project')}}</x-button>
</template> </template>
</m-conditions> </m-conditions>
</template> </template>
<template slot="content"> <template slot="content">
<template v-if="projectsList.length"> <template v-if="projectsList.length">
<m-list :projects-list="projectsList" @on-update="_onUpdate" :page-no="pageNo" :page-size="pageSize"></m-list> <m-list :projects-list="projectsList" @on-update="_onUpdate" :page-no="searchParams.pageNo" :page-size="searchParams.pageSize"></m-list>
<div class="page-box"> <div class="page-box">
<x-page :current="pageNo" :total="total" show-elevator @on-change="_page"></x-page> <x-page :current="parseInt(searchParams.pageNo)" :total="total" :page-size="searchParams.pageSize" show-elevator @on-change="_page"></x-page>
</div> </div>
</template> </template>
<template v-if="!projectsList.length"> <template v-if="!projectsList.length">
@ -22,26 +22,32 @@
</m-list-construction> </m-list-construction>
</template> </template>
<script> <script>
import _ from 'lodash'
import { mapActions } from 'vuex' import { mapActions } from 'vuex'
import mListConstruction from '@/module/components/listConstruction/listConstruction'
import mConditions from '@/module/components/conditions/conditions'
import mList from './_source/list' import mList from './_source/list'
import mCreateProject from './_source/createProject'
import mSpin from '@/module/components/spin/spin' import mSpin from '@/module/components/spin/spin'
import mCreateProject from './_source/createProject'
import mNoData from '@/module/components/noData/noData' import mNoData from '@/module/components/noData/noData'
import listUrlParamHandle from '@/module/mixin/listUrlParamHandle'
import mConditions from '@/module/components/conditions/conditions'
import mListConstruction from '@/module/components/listConstruction/listConstruction'
export default { export default {
name: 'projects-list', name: 'projects-list',
data () { data () {
return { return {
pageSize: 10,
pageNo: 1,
total: null, total: null,
searchVal: '',
projectsList: [], projectsList: [],
isLoading: true isLoading: true,
searchParams: {
pageSize: 10,
pageNo: 1,
searchVal: ''
}
} }
}, },
mixins: [listUrlParamHandle],
props: {}, props: {},
methods: { methods: {
...mapActions('projects', ['getProjectsList']), ...mapActions('projects', ['getProjectsList']),
@ -49,9 +55,12 @@
* Inquire * Inquire
*/ */
_onConditions (o) { _onConditions (o) {
this.searchVal = o.searchVal this.searchParams = _.assign(this.searchParams, o)
this.pageNo = 1 this.searchParams.pageNo = 1
this._getProjectsList() },
_page (val) {
this.searchParams.pageNo = val
}, },
_create (item) { _create (item) {
let self = this let self = this
@ -65,7 +74,7 @@
return h(mCreateProject, { return h(mCreateProject, {
on: { on: {
onUpdate () { onUpdate () {
self._getProjectsList() self._debounceGET()
modal.remove() modal.remove()
} }
}, },
@ -77,19 +86,12 @@
}) })
}, },
_onUpdate () { _onUpdate () {
this._getProjectsList() this._debounceGET()
}, },
_page (val) { _getList (flag) {
this.pageNo = val
this._getProjectsList()
},
_getProjectsList (flag) {
this.isLoading = !flag this.isLoading = !flag
this.getProjectsList({ this.getProjectsList(this.searchParams).then(res => {
pageSize: this.pageSize, this.projectsList = []
pageNo: this.pageNo,
searchVal: this.searchVal
}).then(res => {
this.projectsList = res.totalList this.projectsList = res.totalList
this.total = res.total this.total = res.total
this.isLoading = false this.isLoading = false
@ -98,11 +100,16 @@
}) })
} }
}, },
watch: {}, watch: {
// router
'$route' (a) {
// url no params get instance list
this.searchParams.pageNo = _.isEmpty(a.query) ? 1 : a.query.pageNo
}
},
created () { created () {
}, },
mounted () { mounted () {
this._getProjectsList()
}, },
components: { mListConstruction, mSpin, mConditions, mList, mCreateProject, mNoData } components: { mListConstruction, mSpin, mConditions, mList, mCreateProject, mNoData }
} }

24
escheduler-ui/src/js/conf/home/pages/projects/pages/taskInstance/pages/list/_source/list.vue → escheduler-ui/src/js/conf/home/pages/projects/pages/taskInstance/_source/list.vue

@ -4,40 +4,40 @@
<table class="fixed"> <table class="fixed">
<tr> <tr>
<th> <th>
<span>{{$t('编号')}}</span> <span>{{$t('#')}}</span>
</th> </th>
<th> <th>
<span>{{$t('名称')}}</span> <span>{{$t('Name')}}</span>
</th> </th>
<th> <th>
<span>{{$t('工作流实例')}}</span> <span>{{$t('Process Instance')}}</span>
</th> </th>
<th width="80"> <th width="80">
<span>{{$t('节点类型')}}</span> <span>{{$t('Node Type')}}</span>
</th> </th>
<th width="40"> <th width="40">
<span>{{$t('状态')}}</span> <span>{{$t('State')}}</span>
</th> </th>
<th width="140"> <th width="140">
<span>{{$t('提交时间')}}</span> <span>{{$t('Submit Time')}}</span>
</th> </th>
<th width="140"> <th width="140">
<span>{{$t('开始时间')}}</span> <span>{{$t('Start Time')}}</span>
</th> </th>
<th width="140"> <th width="140">
<span>{{$t('结束时间')}}</span> <span>{{$t('End Time')}}</span>
</th> </th>
<th width="110"> <th width="110">
<span>{{$t('host')}}</span> <span>{{$t('host')}}</span>
</th> </th>
<th width="74"> <th width="74">
<span>{{$t('运行时长')}}(s)</span> <span>{{$t('Duration')}}(s)</span>
</th> </th>
<th width="84"> <th width="84">
<span>{{$t('重试次数')}}</span> <span>{{$t('Retry Count')}}</span>
</th> </th>
<th width="50"> <th width="50">
<span>{{$t('操作')}}</span> <span>{{$t('Operation')}}</span>
</th> </th>
</tr> </tr>
<tr v-for="(item, $index) in list" :key="item.id"> <tr v-for="(item, $index) in list" :key="item.id">
@ -66,7 +66,7 @@
shape="circle" shape="circle"
size="xsmall" size="xsmall"
data-toggle="tooltip" data-toggle="tooltip"
:title="$t('查看日志')" :title="$t('View log')"
icon="iconfont icon-xitongcaozuorizhi" icon="iconfont icon-xitongcaozuorizhi"
@click="_refreshLog(item)"> @click="_refreshLog(item)">
</x-button> </x-button>

108
escheduler-ui/src/js/conf/home/pages/projects/pages/taskInstance/index.vue

@ -1,8 +1,110 @@
<template> <template>
<router-view></router-view> <div class="main-layout-box">
<m-secondary-menu :type="'projects'"></m-secondary-menu>
<m-list-construction :title="$t('Task Instance')">
<template slot="conditions">
<m-instance-conditions @on-query="_onQuery"></m-instance-conditions>
</template>
<template slot="content">
<template v-if="taskInstanceList.length">
<m-list :task-instance-list="taskInstanceList" :page-no="searchParams.pageNo" :page-size="searchParams.pageSize">
</m-list>
<div class="page-box">
<x-page :current="parseInt(searchParams.pageNo)" :total="total" show-elevator @on-change="_page"></x-page>
</div>
</template>
<template v-if="!taskInstanceList.length">
<m-no-data></m-no-data>
</template>
<m-spin :is-spin="isLoading"></m-spin>
</template>
</m-list-construction>
</div>
</template> </template>
<script> <script>
import _ from 'lodash'
import { mapActions } from 'vuex'
import mList from './_source/list'
import mSpin from '@/module/components/spin/spin'
import mNoData from '@/module/components/noData/noData'
import listUrlParamHandle from '@/module/mixin/listUrlParamHandle'
import mSecondaryMenu from '@/module/components/secondaryMenu/secondaryMenu'
import mListConstruction from '@/module/components/listConstruction/listConstruction'
import mInstanceConditions from '@/conf/home/pages/projects/pages/_source/instanceConditions'
export default { export default {
name: 'task-instance-index' name: 'task-instance-list-index',
data () {
return {
isLoading: true,
total: null,
taskInstanceList: [],
searchParams: {
// page size
pageSize: 10,
// page index
pageNo: 1,
// Query name
searchVal: '',
// Process instance id
processInstanceId: '',
// host
host: '',
// state
stateType: '',
// start date
startDate: '',
// end date
endDate: ''
}
}
},
mixins: [listUrlParamHandle],
props: {},
methods: {
...mapActions('dag', ['getTaskInstanceList']),
/**
* click query
*/
_onQuery (o) {
this.searchParams = _.assign(this.searchParams, o)
if (this.searchParams.taskName) {
this.searchParams.taskName = ''
}
this.searchParams.pageNo = 1
},
_page (val) {
this.searchParams.pageNo = val
},
/**
* get list data
*/
_getList (flag) {
this.isLoading = !flag
this.getTaskInstanceList(this.searchParams).then(res => {
this.taskInstanceList = []
this.taskInstanceList = res.totalList
this.total = res.total
this.isLoading = false
}).catch(e => {
this.isLoading = false
})
}
},
watch: {
// router
'$route' (a) {
// url no params get instance list
if (_.isEmpty(a.query)) {
this.searchParams.processInstanceId = ''
}
this.searchParams.pageNo = _.isEmpty(a.query) ? 1 : a.query.pageNo
}
},
created () {
},
mounted () {
},
components: { mList, mInstanceConditions, mSpin, mListConstruction, mSecondaryMenu, mNoData }
} }
</script> </script>

139
escheduler-ui/src/js/conf/home/pages/projects/pages/taskInstance/pages/list/index.vue

@ -1,139 +0,0 @@
<template>
<div class="main-layout-box">
<m-secondary-menu :type="'projects'"></m-secondary-menu>
<m-list-construction :title="$t('任务实例')">
<template slot="conditions">
<m-conditions @on-query="_onQuery"></m-conditions>
</template>
<template slot="content">
<template v-if="taskInstanceList.length">
<m-list :task-instance-list="taskInstanceList" :page-no="searchParams.pageNo" :page-size="searchParams.pageSize">
</m-list>
<div class="page-box">
<x-page :current="parseInt(searchParams.pageNo)" :total="total" show-elevator @on-change="_page"></x-page>
</div>
</template>
<template v-if="!taskInstanceList.length">
<m-no-data></m-no-data>
</template>
<m-spin :is-spin="isLoading"></m-spin>
</template>
</m-list-construction>
</div>
</template>
<script>
import _ from 'lodash'
import { mapActions } from 'vuex'
import mList from './_source/list'
import { setUrlParams } from '@/module/util/routerUtil'
import mSpin from '@/module/components/spin/spin'
import mConditions from '@/conf/home/pages/projects/pages/instance/pages/list/_source/conditions'
import mSecondaryMenu from '@/module/components/secondaryMenu/secondaryMenu'
import mListConstruction from '@/module/components/listConstruction/listConstruction'
import mNoData from '@/module/components/noData/noData'
export default {
name: 'task-instance-list-index',
data () {
return {
isLoading: true,
total: null,
taskInstanceList: [],
searchParams: {
// page size
pageSize: 10,
// page index
pageNo: 1,
// Query name
searchVal: '',
// Process instance id
processInstanceId: '',
// host
host: '',
// state
stateType: '',
// start date
startDate: '',
// end date
endDate: ''
}
}
},
props: {},
methods: {
...mapActions('dag', ['getTaskInstanceList']),
/**
* click query
*/
_onQuery (o) {
this.searchParams = _.assign(this.searchParams, o)
if (this.searchParams.taskName) {
this.searchParams.taskName = ''
setUrlParams({
taskName: ''
})
}
this._debounceGET()
},
_page (val) {
this.searchParams.pageNo = val
setUrlParams({
pageNo: this.searchParams.pageNo
})
this._debounceGET()
},
/**
* get list data
*/
_getTaskInstanceList (flag) {
this.isLoading = !flag
this.getTaskInstanceList(this.searchParams).then(res => {
this.taskInstanceList = []
this.taskInstanceList = res.totalList
this.total = res.total
this.isLoading = false
}).catch(e => {
this.isLoading = false
})
},
/**
* Anti-shake request interface
* @desc Prevent function from being called multiple times
*/
_debounceGET: _.debounce(function (flag) {
this._getTaskInstanceList(flag)
}, 100, {
'leading': false,
'trailing': true
})
},
watch: {
// router
'$route' (a) {
// url no params get instance list
if (_.isEmpty(a.query)) {
this.searchParams.pageNo = 1
this.searchParams.processInstanceId = ''
} else {
this.searchParams.pageNo = a.query.pageNo || 1
}
},
'searchParams': {
deep: true,
handler () {
this._debounceGET()
}
}
},
created () {
// Routing parameter merging
if (!_.isEmpty(this.$route.query)) {
this.searchParams = _.assign(this.searchParams, this.$route.query)
}
},
mounted () {
this._debounceGET()
},
components: { mList, mConditions, mSpin, mListConstruction, mSecondaryMenu, mNoData }
}
</script>

14
escheduler-ui/src/js/conf/home/pages/projects/pages/taskRecord/index.vue

@ -1,8 +1,18 @@
<template> <template>
<router-view></router-view> <m-list :config="config"></m-list>
</template> </template>
<script> <script>
import mList from '@/conf/home/pages/projects/pages/_source/taskRecordList'
export default { export default {
name: 'task-record-index' name: 'task-record',
data () {
return {
config: {
title: `${this.$t('Task record')}`,
apiFn: 'getTaskRecordList'
}
}
},
components: { mList }
} }
</script> </script>

195
escheduler-ui/src/js/conf/home/pages/projects/pages/taskRecord/pages/list/index.vue

@ -1,195 +0,0 @@
<template>
<div class="main-layout-box">
<m-secondary-menu :type="'projects'"></m-secondary-menu>
<m-list-construction :title="$t('任务记录')">
<template slot="conditions">
<m-conditions>
<template slot="search-group">
<div class="list">
<x-button type="ghost" size="small" @click="_ckQuery" icon="fa fa-search"></x-button>
</div>
<div class="list">
<x-datepicker
ref="datepicker"
@on-change="_onChangeStartStop"
type="daterange"
format="YYYY-MM-DD HH:mm:ss"
placement="bottom-end"
:panelNum="2">
<x-input slot="input" readonly slot-scope="{value}" :value="value" style="width: 310px;" size="small" :placeholder="$t('按选择日期区间')">
<i slot="suffix"
@click.stop="_dateEmpty()"
class="ans-icon-fail-solid"
v-show="value"
style="font-size: 13px;cursor: pointer;margin-top: 1px;">
</i>
</x-input>
</x-datepicker>
</div>
<div class="list">
<x-input v-model="destTable" style="width: 120px;" size="small" :placeholder="$t('按目标表')"></x-input>
</div>
<div class="list">
<x-input v-model="sourceTable" style="width: 120px;" size="small" :placeholder="$t('按源表')"></x-input>
</div>
<div class="list">
<x-select style="width: 90px;" @on-change="_onChangeState">
<x-input slot="trigger" readonly :value="selectedModel ? selectedModel.label : ''" slot-scope="{ selectedModel }" style="width: 90px;" size="small" :placeholder="$t('按状态')" suffix-icon="ans-icon-arrow-down"></x-input>
<x-option
v-for="city in stateList"
:key="city.label"
:value="city.code"
:label="city.label">
</x-option>
</x-select>
</div>
<div class="list">
<x-datepicker
@on-change="_onChangeDate"
format="YYYY-MM-DD"
:panelNum="1">
<x-input slot="input" readonly slot-scope="{value}" style="width: 130px;" :value="value" size="small" :placeholder="$t('按日期')"></x-input>
</x-datepicker>
</div>
<div class="list">
<x-input v-model="taskName" style="width: 130px;" size="small" :placeholder="$t('按任务名称')"></x-input>
</div>
</template>
</m-conditions>
</template>
<template slot="content">
<template v-if="taskRecordList.length">
<m-list :task-record-list="taskRecordList" @on-update="_onUpdate" :page-no="pageNo" :page-size="pageSize">
</m-list>
<div class="page-box">
<x-page :current="pageNo" :total="total" show-elevator @on-change="_page"></x-page>
</div>
</template>
<template v-if="!taskRecordList.length">
<m-no-data></m-no-data>
</template>
<m-spin :is-spin="isLoading"></m-spin>
</template>
</m-list-construction>
</div>
</template>
<script>
import i18n from '@/module/i18n'
import { mapActions } from 'vuex'
import mList from './_source/list'
import mSpin from '@/module/components/spin/spin'
import mNoData from '@/module/components/noData/noData'
import mConditions from '@/module/components/conditions/conditions'
import mSecondaryMenu from '@/module/components/secondaryMenu/secondaryMenu'
import mListConstruction from '@/module/components/listConstruction/listConstruction'
export default {
name: 'task-record-list-index',
data () {
return {
pageSize: 10,
pageNo: 1,
total: null,
taskRecordList: [],
isLoading: true,
taskName: '',
state: '',
sourceTable: '',
destTable: '',
taskDate: '',
startDate: '',
endDate: '',
stateList: [
{
label: `${i18n.$t('无')}`,
code: ``
},
{
label: `${i18n.$t('成功')}`,
code: `${i18n.$t('成功')}`
},
{
label: `${i18n.$t('等待')}`,
code: `${i18n.$t('等待')}`
},
{
label: `${i18n.$t('执行中')}`,
code: `${i18n.$t('执行中')}`
},
{
label: `${i18n.$t('完成')}`,
code: `${i18n.$t('完成')}`
}, {
label: `${i18n.$t('失败')}`,
code: `${i18n.$t('失败')}`
}
]
}
},
props: {},
methods: {
...mapActions('dag', ['getTaskRecordList']),
/**
* empty date
*/
_dateEmpty () {
this.startDate = ''
this.endDate = ''
this.$refs.datepicker.empty()
},
_ckQuery () {
this._getTaskRecordList()
},
_onChangeState (val) {
this.state = val.value
},
_onChangeStartStop (val) {
this.startDate = val[0]
this.endDate = val[1]
},
_onChangeDate (val) {
this.taskDate = val.replace(/-/g, '')
},
_page (val) {
this.pageNo = val
this._getTaskRecordList()
},
/**
* get list data
*/
_getTaskRecordList (flag) {
this.isLoading = !flag
let param = {
pageSize: this.pageSize,
pageNo: this.pageNo,
taskName: this.taskName,
state: this.state,
sourceTable: this.sourceTable,
destTable: this.destTable,
taskDate: this.taskDate,
startDate: this.startDate,
endDate: this.endDate
}
this.taskRecordList = []
this.getTaskRecordList(param).then(res => {
this.taskRecordList = res.totalList
this.total = res.total
this.isLoading = false
}).catch(e => {
this.isLoading = false
})
},
_onUpdate () {
this._getTaskRecordList('false')
}
},
watch: {
},
created () {
},
mounted () {
this._getTaskRecordList()
},
components: { mList, mConditions, mSpin, mListConstruction, mSecondaryMenu, mNoData }
}
</script>

2
escheduler-ui/src/js/conf/home/pages/projects/pages/timing/index.vue

@ -1,5 +1,5 @@
<template> <template>
<m-list-construction :title="$t('定时管理')"> <m-list-construction :title="$t('Cron Manage')">
<template slot="content"> <template slot="content">
<m-list></m-list> <m-list></m-list>
</template> </template>

22
escheduler-ui/src/js/conf/home/pages/resource/pages/file/pages/create/index.vue

@ -1,23 +1,23 @@
<template> <template>
<div class="main-layout-box"> <div class="main-layout-box">
<m-secondary-menu :type="'resource'"></m-secondary-menu> <m-secondary-menu :type="'resource'"></m-secondary-menu>
<m-list-construction :title="$t('创建文件')"> <m-list-construction :title="$t('Create File')">
<template slot="content"> <template slot="content">
<div class="resource-create-model"> <div class="resource-create-model">
<m-list-box-f> <m-list-box-f>
<template slot="name"><b>*</b>{{$t('文件名称')}}</template> <template slot="name"><b>*</b>{{$t('File Name')}}</template>
<template slot="content"> <template slot="content">
<x-input <x-input
type="input" type="input"
v-model="fileName" v-model="fileName"
style="width: 300px;" style="width: 300px;"
:placeholder="$t('请输入name')" :placeholder="$t('Please enter name')"
autocomplete="off"> autocomplete="off">
</x-input> </x-input>
</template> </template>
</m-list-box-f> </m-list-box-f>
<m-list-box-f> <m-list-box-f>
<template slot="name"><b>*</b>{{$t('文件格式')}}</template> <template slot="name"><b>*</b>{{$t('File Format')}}</template>
<template slot="content"> <template slot="content">
<x-select v-model="suffix" style="width: 100px;" @on-change="_onChange"> <x-select v-model="suffix" style="width: 100px;" @on-change="_onChange">
<x-option <x-option
@ -30,19 +30,19 @@
</template> </template>
</m-list-box-f> </m-list-box-f>
<m-list-box-f> <m-list-box-f>
<template slot="name">{{$t('描述')}}</template> <template slot="name">{{$t('Description')}}</template>
<template slot="content"> <template slot="content">
<x-input <x-input
type="textarea" type="textarea"
v-model="desc" v-model="desc"
style="width: 430px;" style="width: 430px;"
:placeholder="$t('请输入desc')" :placeholder="$t('Please enter description')"
autocomplete="off"> autocomplete="off">
</x-input> </x-input>
</template> </template>
</m-list-box-f> </m-list-box-f>
<m-list-box-f> <m-list-box-f>
<template slot="name"><b>*</b>{{$t('文件内容')}}</template> <template slot="name"><b>*</b>{{$t('File Content')}}</template>
<template slot="content"> <template slot="content">
<textarea id="code-create-mirror" name="code-create-mirror"></textarea> <textarea id="code-create-mirror" name="code-create-mirror"></textarea>
</template> </template>
@ -51,8 +51,8 @@
<template slot="name">&nbsp;</template> <template slot="name">&nbsp;</template>
<template slot="content"> <template slot="content">
<div class="submit"> <div class="submit">
<x-button type="primary" shape="circle" :loading="spinnerLoading" @click="ok()" v-ps="['GENERAL_USER']">{{spinnerLoading ? 'Loading...' : $t('确认创建')}} </x-button> <x-button type="primary" shape="circle" :loading="spinnerLoading" @click="ok()" v-ps="['GENERAL_USER']">{{spinnerLoading ? 'Loading...' : $t('Create')}} </x-button>
<x-button type="text" @click="() => $router.push({name: 'file'})"> {{$t('取消')}} </x-button> <x-button type="text" @click="() => $router.push({name: 'file'})"> {{$t('Cancel')}} </x-button>
</div> </div>
</template> </template>
</m-list-box-f> </m-list-box-f>
@ -112,11 +112,11 @@
}, },
_validation () { _validation () {
if (!this.fileName) { if (!this.fileName) {
this.$message.warning(`${i18n.$t('请输入资源名称')}`) this.$message.warning(`${i18n.$t('Please enter resource name')}`)
return false return false
} }
if (!editor.getValue()) { if (!editor.getValue()) {
this.$message.warning(`${i18n.$t('请输入资源内容')}`) this.$message.warning(`${i18n.$t('Please enter the resource content')}`)
return false return false
} }

2
escheduler-ui/src/js/conf/home/pages/resource/pages/file/pages/details/_source/noType.vue

@ -1,7 +1,7 @@
<template> <template>
<div class="no-type-model"> <div class="no-type-model">
<img src="./down_error.png" alt=""> <img src="./down_error.png" alt="">
<p>{{$t('不支持在线查看类型')}}</p> <p>{{$t('Online viewing type is not supported')}}</p>
</div> </div>
</template> </template>
<script> <script>

4
escheduler-ui/src/js/conf/home/pages/resource/pages/file/pages/details/index.vue

@ -1,13 +1,13 @@
<template> <template>
<div class="main-layout-box file-details-model"> <div class="main-layout-box file-details-model">
<m-secondary-menu :type="'resource'" ></m-secondary-menu> <m-secondary-menu :type="'resource'" ></m-secondary-menu>
<m-list-construction :title="$t('文件详情')"> <m-list-construction :title="$t('File Details')">
<div slot="content" style="margin: 20px"> <div slot="content" style="margin: 20px">
<div class="file-details-content"> <div class="file-details-content">
<h2> <h2>
<span>{{name}}</span> <span>{{name}}</span>
<div class="down"> <div class="down">
<i class="iconfont" data-container="body" data-toggle="tooltip" :title="$t('下载详情')" @click="_downloadFile">&#xe610;</i> <i class="iconfont" data-container="body" data-toggle="tooltip" :title="$t('Download Details')" @click="_downloadFile">&#xe610;</i>
<em>{{size}}</em> <em>{{size}}</em>
</div> </div>
</h2> </h2>

6
escheduler-ui/src/js/conf/home/pages/resource/pages/file/pages/edit/index.vue

@ -1,7 +1,7 @@
<template> <template>
<div class="main-layout-box"> <div class="main-layout-box">
<m-secondary-menu :type="'resource'" ></m-secondary-menu> <m-secondary-menu :type="'resource'" ></m-secondary-menu>
<m-list-construction :title="$t('文件详情')"> <m-list-construction :title="$t('File Details')">
<div slot="content" style="margin: 20px"> <div slot="content" style="margin: 20px">
<div class="file-edit-content"> <div class="file-edit-content">
<h2> <h2>
@ -13,8 +13,8 @@
<textarea id="code-edit-mirror" name="code-edit-mirror"></textarea> <textarea id="code-edit-mirror" name="code-edit-mirror"></textarea>
</div> </div>
<div class="submit-c"> <div class="submit-c">
<x-button type="text" shape="circle" @click="close()" :disabled="disabled"> {{$t('返回')}} </x-button> <x-button type="text" shape="circle" @click="close()" :disabled="disabled"> {{$t('Return')}} </x-button>
<x-button type="primary" shape="circle" :loading="spinnerLoading" @click="ok()">{{spinnerLoading ? 'Loading...' : $t('保存')}} </x-button> <x-button type="primary" shape="circle" :loading="spinnerLoading" @click="ok()">{{spinnerLoading ? 'Loading...' : $t('Save')}} </x-button>
</div> </div>
</template> </template>
<m-no-data :msg="msg" v-if="msg"></m-no-data> <m-no-data :msg="msg" v-if="msg"></m-no-data>

28
escheduler-ui/src/js/conf/home/pages/resource/pages/file/pages/list/_source/list.vue

@ -4,25 +4,25 @@
<table class="fixed"> <table class="fixed">
<tr> <tr>
<th> <th>
<span>{{$t('编号')}}</span> <span>{{$t('#')}}</span>
</th> </th>
<th> <th>
<span>{{$t('名称')}}</span> <span>{{$t('Name')}}</span>
</th> </th>
<th> <th>
<span>{{$t('文件名称')}}</span> <span>{{$t('File Name')}}</span>
</th> </th>
<th> <th>
<span>{{$t('描述')}}</span> <span>{{$t('Description')}}</span>
</th> </th>
<th width="100"> <th width="100">
<span>{{$t('大小')}}</span> <span>{{$t('Size')}}</span>
</th> </th>
<th width="140"> <th width="140">
<span>{{$t('更新时间')}}</span> <span>{{$t('Update Time')}}</span>
</th> </th>
<th width="140"> <th width="140">
<span>{{$t('操作')}}</span> <span>{{$t('Operation')}}</span>
</th> </th>
</tr> </tr>
<tr v-for="(item, $index) in list" :key="item.id"> <tr v-for="(item, $index) in list" :key="item.id">
@ -48,7 +48,7 @@
shape="circle" shape="circle"
size="xsmall" size="xsmall"
data-toggle="tooltip" data-toggle="tooltip"
:title="$t('编辑')" :title="$t('Edit')"
:disabled="_rtDisb(item)" :disabled="_rtDisb(item)"
@click="_edit(item,$index)" @click="_edit(item,$index)"
icon="iconfont icon-bianjixiugai" icon="iconfont icon-bianjixiugai"
@ -60,7 +60,7 @@
size="xsmall" size="xsmall"
icon="iconfont icon-wendangxiugai" icon="iconfont icon-wendangxiugai"
data-toggle="tooltip" data-toggle="tooltip"
:title="$t('重命名')" :title="$t('Rename')"
@click="_rename(item,$index)" @click="_rename(item,$index)"
v-ps="['GENERAL_USER']"> v-ps="['GENERAL_USER']">
</x-button> </x-button>
@ -70,7 +70,7 @@
shape="circle" shape="circle"
size="xsmall" size="xsmall"
data-toggle="tooltip" data-toggle="tooltip"
:title="$t('下载')" :title="$t('Download')"
@click="_downloadFile(item)" @click="_downloadFile(item)"
icon="iconfont icon-download" icon="iconfont icon-download"
v-ps="['GENERAL_USER']"> v-ps="['GENERAL_USER']">
@ -80,10 +80,10 @@
:ref="'poptip-' + $index" :ref="'poptip-' + $index"
placement="bottom-end" placement="bottom-end"
width="90"> width="90">
<p>{{$t('确定删除吗?')}}</p> <p>{{$t('Delete?')}}</p>
<div style="text-align: right; margin: 0;padding-top: 4px;"> <div style="text-align: right; margin: 0;padding-top: 4px;">
<x-button type="text" size="xsmall" shape="circle" @click="_closeDelete($index)">{{$t('取消')}}</x-button> <x-button type="text" size="xsmall" shape="circle" @click="_closeDelete($index)">{{$t('Cancel')}}</x-button>
<x-button type="primary" size="xsmall" shape="circle" @click="_delete(item,$index)">{{$t('确定')}}</x-button> <x-button type="primary" size="xsmall" shape="circle" @click="_delete(item,$index)">{{$t('Confirm')}}</x-button>
</div> </div>
<template slot="reference"> <template slot="reference">
<x-button <x-button
@ -92,7 +92,7 @@
shape="circle" shape="circle"
size="xsmall" size="xsmall"
data-toggle="tooltip" data-toggle="tooltip"
:title="$t('删除')" :title="$t('delete')"
v-ps="['GENERAL_USER']"> v-ps="['GENERAL_USER']">
</x-button> </x-button>
</template> </template>

12
escheduler-ui/src/js/conf/home/pages/resource/pages/file/pages/list/_source/rename.vue

@ -1,25 +1,25 @@
<template> <template>
<m-popup :ok-text="$t('确认重命名')" :nameText="$t('重命名')" @ok="_ok" :asyn-loading="true"> <m-popup :ok-text="$t('Rename')" :nameText="$t('Rename')" @ok="_ok" :asyn-loading="true">
<template slot="content"> <template slot="content">
<div class="resource-rename-model"> <div class="resource-rename-model">
<m-list-box-f> <m-list-box-f>
<template slot="name"><b>*</b>{{$t('名称')}}</template> <template slot="name"><b>*</b>{{$t('Name')}}</template>
<template slot="content"> <template slot="content">
<x-input <x-input
type="input" type="input"
v-model="name" v-model="name"
:placeholder="$t('请输入name')" :placeholder="$t('Please enter name')"
autocomplete="off"> autocomplete="off">
</x-input> </x-input>
</template> </template>
</m-list-box-f> </m-list-box-f>
<m-list-box-f> <m-list-box-f>
<template slot="name">{{$t('描述')}}</template> <template slot="name">{{$t('Description')}}</template>
<template slot="content"> <template slot="content">
<x-input <x-input
type="textarea" type="textarea"
v-model="desc" v-model="desc"
:placeholder="$t('请输入desc')" :placeholder="$t('Please enter description')"
autocomplete="off"> autocomplete="off">
</x-input> </x-input>
</template> </template>
@ -73,7 +73,7 @@
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
if (!this.name) { if (!this.name) {
reject({ // eslint-disable-line reject({ // eslint-disable-line
msg: `${i18n.$t('请输入资源名称')}` msg: `${i18n.$t('Please enter resource name')}`
}) })
} else { } else {
resolve() resolve()

67
escheduler-ui/src/js/conf/home/pages/resource/pages/file/pages/list/index.vue

@ -1,23 +1,23 @@
<template> <template>
<div class="main-layout-box"> <div class="main-layout-box">
<m-secondary-menu :type="'resource'"></m-secondary-menu> <m-secondary-menu :type="'resource'"></m-secondary-menu>
<m-list-construction :title="$t('文件管理')"> <m-list-construction :title="$t('File Manage')">
<template slot="conditions"> <template slot="conditions">
<m-conditions @on-conditions="_onConditions"> <m-conditions @on-conditions="_onConditions">
<template slot="button-group"> <template slot="button-group">
<x-button-group size="small" > <x-button-group size="small" >
<x-button type="ghost" @click="() => $router.push({name: 'resource-file-create'})" v-ps="['GENERAL_USER']">{{$t('创建文件')}}</x-button> <x-button type="ghost" @click="() => $router.push({name: 'resource-file-create'})" v-ps="['GENERAL_USER']">{{$t('Create File')}}</x-button>
<x-button type="ghost" @click="_uploading" v-ps="['GENERAL_USER']">{{$t('上传文件')}}</x-button> <x-button type="ghost" @click="_uploading" v-ps="['GENERAL_USER']">{{$t('Upload Files')}}</x-button>
</x-button-group> </x-button-group>
</template> </template>
</m-conditions> </m-conditions>
</template> </template>
<template slot="content"> <template slot="content">
<template v-if="fileResourcesList.length"> <template v-if="fileResourcesList.length">
<m-list :file-resources-list="fileResourcesList" :page-no="pageNo" :page-size="pageSize"> <m-list :file-resources-list="fileResourcesList" :page-no="searchParams.pageNo" :page-size="searchParams.pageSize">
</m-list> </m-list>
<div class="page-box"> <div class="page-box">
<x-page :current="pageNo" :total="total" show-elevator @on-change="_page"></x-page> <x-page :current="parseInt(searchParams.pageNo)" :total="total" :page-size="searchParams.pageSize" show-elevator @on-change="_page"></x-page>
</div> </div>
</template> </template>
<template v-if="!fileResourcesList.length"> <template v-if="!fileResourcesList.length">
@ -30,11 +30,13 @@
</div> </div>
</template> </template>
<script> <script>
import _ from 'lodash'
import { mapActions } from 'vuex' import { mapActions } from 'vuex'
import mList from './_source/list' import mList from './_source/list'
import mSpin from '@/module/components/spin/spin' import mSpin from '@/module/components/spin/spin'
import { findComponentDownward } from '@/module/util/' import { findComponentDownward } from '@/module/util/'
import mNoData from '@/module/components/noData/noData' import mNoData from '@/module/components/noData/noData'
import listUrlParamHandle from '@/module/mixin/listUrlParamHandle'
import mConditions from '@/module/components/conditions/conditions' import mConditions from '@/module/components/conditions/conditions'
import mSecondaryMenu from '@/module/components/secondaryMenu/secondaryMenu' import mSecondaryMenu from '@/module/components/secondaryMenu/secondaryMenu'
import mListConstruction from '@/module/components/listConstruction/listConstruction' import mListConstruction from '@/module/components/listConstruction/listConstruction'
@ -43,40 +45,37 @@
name: 'resource-list-index-FILE', name: 'resource-list-index-FILE',
data () { data () {
return { return {
pageSize: 10,
pageNo: 1,
total: null, total: null,
searchVal: '',
isLoading: false, isLoading: false,
fileResourcesList: [] fileResourcesList: [],
searchParams: {
pageSize: 10,
pageNo: 1,
searchVal: '',
type: 'FILE'
}
} }
}, },
mixins: [listUrlParamHandle],
props: {}, props: {},
methods: { methods: {
...mapActions('resource', ['getResourcesListP']), ...mapActions('resource', ['getResourcesListP']),
/** /**
* 文件上传 * File Upload
*/ */
_uploading () { _uploading () {
findComponentDownward(this.$root, 'roof-nav')._fileUpdate('FILE') findComponentDownward(this.$root, 'roof-nav')._fileUpdate('FILE')
}, },
_onConditions (o) { _onConditions (o) {
this.searchVal = o.searchVal this.searchParams = _.assign(this.searchParams, o)
this.pageNo = 1 this.searchParams.pageNo = 1
this._getResourcesList()
}, },
_page (val) { _page (val) {
this.pageNo = val this.searchParams.pageNo = val
this._getResourcesList()
}, },
_getResourcesList (flag) { _getList (flag) {
this.isLoading = !flag this.isLoading = !flag
this.getResourcesListP({ this.getResourcesListP(this.searchParams).then(res => {
pageSize: this.pageSize,
pageNo: this.pageNo,
searchVal: this.searchVal,
type: 'FILE'
}).then(res => {
this.fileResourcesList = res.totalList this.fileResourcesList = res.totalList
this.total = res.total this.total = res.total
this.isLoading = false this.isLoading = false
@ -85,25 +84,21 @@
}) })
}, },
_updateList () { _updateList () {
this.pageSize = 10 this.searchParams.pageNo = 1
this.pageNo = 1 this.searchParams.searchVal = ''
this.searchVal = '' this._debounceGET()
this._getResourcesList() }
}, },
_routerView () { watch: {
let name = this.$route.name // router
if (name === 'resource-file-details') { '$route' (a) {
return true // url no params get instance list
} else { this.searchParams.pageNo = _.isEmpty(a.query) ? 1 : a.query.pageNo
return false
}
} }
}, },
watch: {},
created () { created () {
}, },
mounted () { mounted () {
this._getResourcesList()
}, },
components: { mSecondaryMenu, mListConstruction, mConditions, mList, mSpin, mNoData } components: { mSecondaryMenu, mListConstruction, mConditions, mList, mSpin, mNoData }
} }

34
escheduler-ui/src/js/conf/home/pages/resource/pages/udf/pages/function/_source/createUdf.vue

@ -1,9 +1,9 @@
<template> <template>
<m-popup :ok-text="item ? $t('编辑') : $t('确定提交')" :nameText="item ? $t('编辑UDF函数') : $t('创建UDF函数')" @ok="_ok" ref="popup"> <m-popup :ok-text="item ? $t('Edit') : $t('Submit')" :nameText="item ? $t('Edit UDF Function') : $t('Create UDF Function')" @ok="_ok" ref="popup">
<template slot="content"> <template slot="content">
<div class="udf-create-model"> <div class="udf-create-model">
<m-list-box-f> <m-list-box-f>
<template slot="name"><b>*</b>{{$t('类型')}}</template> <template slot="name"><b>*</b>{{$t('type')}}</template>
<template slot="content"> <template slot="content">
<x-radio-group v-model="type"> <x-radio-group v-model="type">
<x-radio :label="'HIVE'">HIVE UDF</x-radio> <x-radio :label="'HIVE'">HIVE UDF</x-radio>
@ -12,49 +12,49 @@
</template> </template>
</m-list-box-f> </m-list-box-f>
<m-list-box-f> <m-list-box-f>
<template slot="name"><b>*</b>{{$t('UDF函数名称')}}</template> <template slot="name"><b>*</b>{{$t('UDF Function Name')}}</template>
<template slot="content"> <template slot="content">
<x-input <x-input
type="input" type="input"
maxlength="40" maxlength="40"
v-model="funcName" v-model="funcName"
:placeholder="$t('请输入函数名')"> :placeholder="$t('Please enter a function name')">
</x-input> </x-input>
</template> </template>
</m-list-box-f> </m-list-box-f>
<m-list-box-f> <m-list-box-f>
<template slot="name"><b>*</b>{{$t('包名类名')}}</template> <template slot="name"><b>*</b>{{$t('Package Name')}}</template>
<template slot="content"> <template slot="content">
<x-input <x-input
type="input" type="input"
maxlength="40" maxlength="40"
v-model="className" v-model="className"
:placeholder="$t('请输入包名类名')"> :placeholder="$t('Please enter a Package name')">
</x-input> </x-input>
</template> </template>
</m-list-box-f> </m-list-box-f>
<m-list-box-f> <m-list-box-f>
<template slot="name">{{$t('参数')}}</template> <template slot="name">{{$t('Parameter')}}</template>
<template slot="content"> <template slot="content">
<x-input <x-input
type="input" type="input"
v-model="argTypes" v-model="argTypes"
:placeholder="$t('请输入参数')"> :placeholder="$t('Please enter a parameter')">
</x-input> </x-input>
</template> </template>
</m-list-box-f> </m-list-box-f>
<m-list-box-f> <m-list-box-f>
<template slot="name">{{$t('数据库名')}}</template> <template slot="name">{{$t('Database Name')}}</template>
<template slot="content"> <template slot="content">
<x-input <x-input
type="input" type="input"
v-model="database" v-model="database"
:placeholder="$t('请输入数据库名')"> :placeholder="$t('Please enter database name')">
</x-input> </x-input>
</template> </template>
</m-list-box-f> </m-list-box-f>
<m-list-box-f> <m-list-box-f>
<template slot="name"><b>*</b>{{$t('UDF资源')}}</template> <template slot="name"><b>*</b>{{$t('UDF Resources')}}</template>
<template slot="content"> <template slot="content">
<x-select <x-select
filterable filterable
@ -68,7 +68,7 @@
:label="city.alias"> :label="city.alias">
</x-option> </x-option>
</x-select> </x-select>
<x-button type="primary" @click="_toggleUpdate" :disabled="upDisabled">{{$t('上传资源')}}</x-button> <x-button type="primary" @click="_toggleUpdate" :disabled="upDisabled">{{$t('Upload Resources')}}</x-button>
</template> </template>
</m-list-box-f> </m-list-box-f>
<m-list-box-f v-if="isUpdate"> <m-list-box-f v-if="isUpdate">
@ -81,12 +81,12 @@
</template> </template>
</m-list-box-f> </m-list-box-f>
<m-list-box-f> <m-list-box-f>
<template slot="name">{{$t('使用说明')}}</template> <template slot="name">{{$t('Instructions')}}</template>
<template slot="content"> <template slot="content">
<x-input <x-input
type="textarea" type="textarea"
v-model="desc" v-model="desc"
:placeholder="$t('请输入使用说明')"> :placeholder="$t('Please enter a instructions')">
</x-input> </x-input>
</template> </template>
</m-list-box-f> </m-list-box-f>
@ -209,15 +209,15 @@
*/ */
_validation () { _validation () {
if (!this.funcName) { if (!this.funcName) {
this.$message.warning(`${i18n.$t('请输入UDF函数名称')}`) this.$message.warning(`${i18n.$t('Please enter a UDF function name')}`)
return false return false
} }
if (!this.className) { if (!this.className) {
this.$message.warning(`${i18n.$t('请输入包名类名')}`) this.$message.warning(`${i18n.$t('Please enter a Package name')}`)
return false return false
} }
if (!this.resourceId) { if (!this.resourceId) {
this.$message.warning(`${i18n.$t('请选择UDF资源')}`) this.$message.warning(`${i18n.$t('Select UDF Resources')}`)
return false return false
} }
return true return true

30
escheduler-ui/src/js/conf/home/pages/resource/pages/udf/pages/function/_source/list.vue

@ -4,34 +4,34 @@
<table class="fixed"> <table class="fixed">
<tr> <tr>
<th> <th>
<span>{{$t('编号')}}</span> <span>{{$t('#')}}</span>
</th> </th>
<th> <th>
<span>{{$t('UDF函数名称')}}</span> <span>{{$t('UDF Function Name')}}</span>
</th> </th>
<th> <th>
<span>{{$t('类名')}}</span> <span>{{$t('Class Name')}}</span>
</th> </th>
<th> <th>
<span>{{$t('参数')}}</span> <span>{{$t('Parameter')}}</span>
</th> </th>
<th width="80"> <th width="80">
<span>{{$t('类型')}}</span> <span>{{$t('type')}}</span>
</th> </th>
<th> <th>
<span>{{$t('描述')}}</span> <span>{{$t('Description')}}</span>
</th> </th>
<th> <th>
<span>{{$t('jar包')}}</span> <span>{{$t('Jar Package')}}</span>
</th> </th>
<th> <th>
<span>{{$t('库名')}}</span> <span>{{$t('Library Name')}}</span>
</th> </th>
<th width="140"> <th width="140">
<span>{{$t('更新时间')}}</span> <span>{{$t('Update Time')}}</span>
</th> </th>
<th width="80"> <th width="80">
<span>{{$t('操作')}}</span> <span>{{$t('Operation')}}</span>
</th> </th>
</tr> </tr>
<tr v-for="(item, $index) in list" :key="$index"> <tr v-for="(item, $index) in list" :key="$index">
@ -68,7 +68,7 @@
shape="circle" shape="circle"
size="xsmall" size="xsmall"
data-toggle="tooltip" data-toggle="tooltip"
:title="$t('编辑')" :title="$t('Edit')"
@click="_edit(item)" @click="_edit(item)"
icon="iconfont icon-bianjixiugai" icon="iconfont icon-bianjixiugai"
v-ps="['GENERAL_USER']"> v-ps="['GENERAL_USER']">
@ -77,10 +77,10 @@
:ref="'poptip-' + $index" :ref="'poptip-' + $index"
placement="bottom-end" placement="bottom-end"
width="90"> width="90">
<p>{{$t('确定删除吗?')}}</p> <p>{{$t('Delete?')}}</p>
<div style="text-align: right; margin: 0;padding-top: 4px;"> <div style="text-align: right; margin: 0;padding-top: 4px;">
<x-button type="text" size="xsmall" shape="circle" @click="_closeDelete($index)">{{$t('取消')}}</x-button> <x-button type="text" size="xsmall" shape="circle" @click="_closeDelete($index)">{{$t('Cancel')}}</x-button>
<x-button type="primary" size="xsmall" shape="circle" @click="_delete(item,$index)">{{$t('确定')}}</x-button> <x-button type="primary" size="xsmall" shape="circle" @click="_delete(item,$index)">{{$t('Confirm')}}</x-button>
</div> </div>
<template slot="reference"> <template slot="reference">
<x-button <x-button
@ -89,7 +89,7 @@
size="xsmall" size="xsmall"
icon="iconfont icon-shanchu" icon="iconfont icon-shanchu"
data-toggle="tooltip" data-toggle="tooltip"
:title="$t('删除')" :title="$t('delete')"
v-ps="['GENERAL_USER']"> v-ps="['GENERAL_USER']">
</x-button> </x-button>
</template> </template>

57
escheduler-ui/src/js/conf/home/pages/resource/pages/udf/pages/function/index.vue

@ -1,20 +1,20 @@
<template> <template>
<div class="main-layout-box"> <div class="main-layout-box">
<m-secondary-menu :type="'resource'"></m-secondary-menu> <m-secondary-menu :type="'resource'"></m-secondary-menu>
<m-list-construction :title="$t('UDF函数管理')"> <m-list-construction :title="$t('UDF Function')">
<template slot="conditions"> <template slot="conditions">
<m-conditions @on-conditions="_onConditions"> <m-conditions @on-conditions="_onConditions">
<template slot="button-group"> <template slot="button-group">
<x-button type="ghost" @click="_create" v-ps="['GENERAL_USER']" size="small" >{{$t('创建UDF函数')}}</x-button> <x-button type="ghost" @click="_create" v-ps="['GENERAL_USER']" size="small" >{{$t('Create UDF Function')}}</x-button>
</template> </template>
</m-conditions> </m-conditions>
</template> </template>
<template slot="content"> <template slot="content">
<template v-if="udfFuncList.length"> <template v-if="udfFuncList.length">
<m-list :udf-func-list="udfFuncList" :page-no="pageNo" :page-size="pageSize" @on-update="_updateList"> <m-list :udf-func-list="udfFuncList" :page-no="searchParams.pageNo" :page-size="searchParams.pageSize" @on-update="_updateList">
</m-list> </m-list>
<div class="page-box"> <div class="page-box">
<x-page :current="pageNo" :total="total" show-elevator @on-change="_page"></x-page> <x-page :current="parseInt(searchParams.pageNo)" :total="total" :page-size="searchParams.pageSize" show-elevator @on-change="_page"></x-page>
</div> </div>
</template> </template>
<template v-if="!udfFuncList.length"> <template v-if="!udfFuncList.length">
@ -27,37 +27,41 @@
</div> </div>
</template> </template>
<script> <script>
import _ from 'lodash'
import { mapActions } from 'vuex' import { mapActions } from 'vuex'
import mList from './_source/list' import mList from './_source/list'
import mCreateUdf from './_source/createUdf' import mCreateUdf from './_source/createUdf'
import mSpin from '@/module/components/spin/spin' import mSpin from '@/module/components/spin/spin'
import mNoData from '@/module/components/noData/noData' import mNoData from '@/module/components/noData/noData'
import listUrlParamHandle from '@/module/mixin/listUrlParamHandle'
import mConditions from '@/module/components/conditions/conditions' import mConditions from '@/module/components/conditions/conditions'
import mSecondaryMenu from '@/module/components/secondaryMenu/secondaryMenu' import mSecondaryMenu from '@/module/components/secondaryMenu/secondaryMenu'
import mListConstruction from '@/module/components/listConstruction/listConstruction' import mListConstruction from '@/module/components/listConstruction/listConstruction'
export default { export default {
name: 'udf-function-index', name: 'udf-function-index',
data () { data () {
return { return {
pageSize: 10, total: null,
pageNo: 1,
total: 20,
searchVal: '',
isLoading: false, isLoading: false,
udfFuncList: [] udfFuncList: [],
searchParams: {
pageSize: 10,
pageNo: 1,
searchVal: ''
}
} }
}, },
mixins: [listUrlParamHandle],
props: {}, props: {},
methods: { methods: {
...mapActions('resource', ['getUdfFuncListP']), ...mapActions('resource', ['getUdfFuncListP']),
_onConditions (o) { _onConditions (o) {
this.searchVal = o.searchVal this.searchParams = _.assign(this.searchParams, o)
this.pageNo = 1 this.searchParams.pageNo = 1
this._getUdfFuncListP()
}, },
_page (val) { _page (val) {
this.pageNo = val this.searchParams.pageNo = val
this._getUdfFuncListP()
}, },
_create () { _create () {
let self = this let self = this
@ -85,18 +89,14 @@
}) })
}, },
_updateList () { _updateList () {
this.pageSize = 10 this.searchParams.pageNo = 1
this.pageNo = 1 this.searchParams.searchVal = ''
this.searchVal = '' this._debounceGET()
this._getUdfFuncListP()
}, },
_getUdfFuncListP (flag) { _getList (flag) {
this.isLoading = !flag this.isLoading = !flag
this.getUdfFuncListP({ this.getUdfFuncListP(this.searchParams).then(res => {
pageSize: this.pageSize, this.udfFuncList = []
pageNo: this.pageNo,
searchVal: this.searchVal
}).then(res => {
this.udfFuncList = res.totalList this.udfFuncList = res.totalList
this.total = res.total this.total = res.total
this.isLoading = false this.isLoading = false
@ -105,11 +105,16 @@
}) })
} }
}, },
watch: {}, watch: {
// router
'$route' (a) {
// url no params get instance list
this.searchParams.pageNo = _.isEmpty(a.query) ? 1 : a.query.pageNo
}
},
created () { created () {
}, },
mounted () { mounted () {
this._getUdfFuncListP()
}, },
components: { mSecondaryMenu, mListConstruction, mConditions, mList, mSpin, mCreateUdf, mNoData } components: { mSecondaryMenu, mListConstruction, mConditions, mList, mSpin, mCreateUdf, mNoData }
} }

28
escheduler-ui/src/js/conf/home/pages/resource/pages/udf/pages/resource/_source/list.vue

@ -4,28 +4,28 @@
<table class="fixed"> <table class="fixed">
<tr> <tr>
<th> <th>
<span>{{$t('编号')}}</span> <span>{{$t('#')}}</span>
</th> </th>
<th> <th>
<span>{{$t('UDF资源名称')}}</span> <span>{{$t('UDF Resource Name')}}</span>
</th> </th>
<th> <th>
<span>{{$t('文件名称')}}</span> <span>{{$t('File Name')}}</span>
</th> </th>
<th width="80"> <th width="80">
<span>{{$t('文件大小')}}</span> <span>{{$t('File Size')}}</span>
</th> </th>
<th> <th>
<span>{{$t('文件描述')}}</span> <span>{{$t('Description')}}</span>
</th> </th>
<th width="140"> <th width="140">
<span>{{$t('创建时间')}}</span> <span>{{$t('Create Time')}}</span>
</th> </th>
<th width="140"> <th width="140">
<span>{{$t('更新时间')}}</span> <span>{{$t('Update Time')}}</span>
</th> </th>
<th width="110"> <th width="110">
<span>{{$t('操作')}}</span> <span>{{$t('Operation')}}</span>
</th> </th>
</tr> </tr>
<tr v-for="(item, $index) in list" :key="$index"> <tr v-for="(item, $index) in list" :key="$index">
@ -57,7 +57,7 @@
size="xsmall" size="xsmall"
icon="iconfont icon-wendangxiugai" icon="iconfont icon-wendangxiugai"
data-toggle="tooltip" data-toggle="tooltip"
:title="$t('重命名')" :title="$t('Rename')"
@click="_rename(item,$index)" @click="_rename(item,$index)"
v-ps="['GENERAL_USER']"> v-ps="['GENERAL_USER']">
</x-button> </x-button>
@ -66,7 +66,7 @@
shape="circle" shape="circle"
size="xsmall" size="xsmall"
data-toggle="tooltip" data-toggle="tooltip"
:title="$t('下载')" :title="$t('Download')"
icon="iconfont icon-download" icon="iconfont icon-download"
@click="_downloadFile(item)" @click="_downloadFile(item)"
v-ps="['GENERAL_USER']"> v-ps="['GENERAL_USER']">
@ -75,10 +75,10 @@
:ref="'poptip-' + $index" :ref="'poptip-' + $index"
placement="bottom-end" placement="bottom-end"
width="90"> width="90">
<p>{{$t('确定删除吗?')}}</p> <p>{{$t('Delete?')}}</p>
<div style="text-align: right; margin: 0;padding-top: 4px;"> <div style="text-align: right; margin: 0;padding-top: 4px;">
<x-button type="text" size="xsmall" shape="circle" @click="_closeDelete($index)">{{$t('取消')}}</x-button> <x-button type="text" size="xsmall" shape="circle" @click="_closeDelete($index)">{{$t('Cancel')}}</x-button>
<x-button type="primary" size="xsmall" shape="circle" @click="_delete(item,$index)">{{$t('确定')}}</x-button> <x-button type="primary" size="xsmall" shape="circle" @click="_delete(item,$index)">{{$t('Confirm')}}</x-button>
</div> </div>
<template slot="reference"> <template slot="reference">
<x-button <x-button
@ -86,7 +86,7 @@
shape="circle" shape="circle"
size="xsmall" size="xsmall"
data-toggle="tooltip" data-toggle="tooltip"
:title="$t('删除')" :title="$t('delete')"
icon="iconfont icon-shanchu" icon="iconfont icon-shanchu"
v-ps="['GENERAL_USER']"> v-ps="['GENERAL_USER']">
</x-button> </x-button>

12
escheduler-ui/src/js/conf/home/pages/resource/pages/udf/pages/resource/_source/rename.vue

@ -1,25 +1,25 @@
<template> <template>
<m-popup :ok-text="$t('确认重命名')" :nameText="$t('重命名')" @ok="_ok" :asyn-loading="true"> <m-popup :ok-text="$t('Rename')" :nameText="$t('Rename')" @ok="_ok" :asyn-loading="true">
<template slot="content"> <template slot="content">
<div class="resource-rename-model"> <div class="resource-rename-model">
<m-list-box-f> <m-list-box-f>
<template slot="name"><b>*</b>{{$t('名称')}}</template> <template slot="name"><b>*</b>{{$t('Name')}}</template>
<template slot="content"> <template slot="content">
<x-input <x-input
type="input" type="input"
v-model="name" v-model="name"
:placeholder="$t('请输入name')" :placeholder="$t('Please enter name')"
autocomplete="off"> autocomplete="off">
</x-input> </x-input>
</template> </template>
</m-list-box-f> </m-list-box-f>
<m-list-box-f> <m-list-box-f>
<template slot="name">{{$t('描述')}}</template> <template slot="name">{{$t('Description')}}</template>
<template slot="content"> <template slot="content">
<x-input <x-input
type="textarea" type="textarea"
v-model="desc" v-model="desc"
:placeholder="$t('请输入desc')" :placeholder="$t('Please enter description')"
autocomplete="off"> autocomplete="off">
</x-input> </x-input>
</template> </template>
@ -73,7 +73,7 @@
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
if (!this.name) { if (!this.name) {
reject({ // eslint-disable-line reject({ // eslint-disable-line
msg: `${i18n.$t('请输入资源名称')}` msg: `${i18n.$t('Please enter resource name')}`
}) })
} else { } else {
resolve() resolve()

58
escheduler-ui/src/js/conf/home/pages/resource/pages/udf/pages/resource/index.vue

@ -1,20 +1,20 @@
<template> <template>
<div class="main-layout-box"> <div class="main-layout-box">
<m-secondary-menu :type="'resource'"></m-secondary-menu> <m-secondary-menu :type="'resource'"></m-secondary-menu>
<m-list-construction :title="$t('UDF资源管理')"> <m-list-construction :title="$t('UDF Resources')">
<template slot="conditions"> <template slot="conditions">
<m-conditions @on-conditions="_onConditions"> <m-conditions @on-conditions="_onConditions">
<template slot="button-group"> <template slot="button-group">
<x-button type="ghost" size="small" @click="_uploading" v-ps="['GENERAL_USER']">{{$t('上传UDF资源')}}</x-button> <x-button type="ghost" size="small" @click="_uploading" v-ps="['GENERAL_USER']">{{$t('Upload UDF Resources')}}</x-button>
</template> </template>
</m-conditions> </m-conditions>
</template> </template>
<template slot="content"> <template slot="content">
<template v-if="udfResourcesList.length"> <template v-if="udfResourcesList.length">
<m-list :udf-resources-list="udfResourcesList" :page-no="pageNo" :page-size="pageSize"> <m-list :udf-resources-list="udfResourcesList" :page-no="searchParams.pageNo" :page-size="searchParams.pageSize">
</m-list> </m-list>
<div class="page-box"> <div class="page-box">
<x-page :current="pageNo" :total="total" show-elevator @on-change="_page"></x-page> <x-page :current="parseInt(searchParams.pageNo)" :total="total" :page-size="searchParams.pageSize" show-elevator @on-change="_page"></x-page>
</div> </div>
</template> </template>
<template v-if="!udfResourcesList.length"> <template v-if="!udfResourcesList.length">
@ -27,11 +27,13 @@
</div> </div>
</template> </template>
<script> <script>
import _ from 'lodash'
import { mapActions } from 'vuex' import { mapActions } from 'vuex'
import mList from './_source/list' import mList from './_source/list'
import mSpin from '@/module/components/spin/spin' import mSpin from '@/module/components/spin/spin'
import { findComponentDownward } from '@/module/util/' import { findComponentDownward } from '@/module/util/'
import mNoData from '@/module/components/noData/noData' import mNoData from '@/module/components/noData/noData'
import listUrlParamHandle from '@/module/mixin/listUrlParamHandle'
import mConditions from '@/module/components/conditions/conditions' import mConditions from '@/module/components/conditions/conditions'
import mSecondaryMenu from '@/module/components/secondaryMenu/secondaryMenu' import mSecondaryMenu from '@/module/components/secondaryMenu/secondaryMenu'
import mListConstruction from '@/module/components/listConstruction/listConstruction' import mListConstruction from '@/module/components/listConstruction/listConstruction'
@ -40,46 +42,43 @@
name: 'resource-list-index-UDF', name: 'resource-list-index-UDF',
data () { data () {
return { return {
pageSize: 10,
pageNo: 1,
total: null, total: null,
searchVal: '',
isLoading: false, isLoading: false,
udfResourcesList: [] udfResourcesList: [],
searchParams: {
pageSize: 10,
pageNo: 1,
searchVal: '',
type: 'UDF'
}
} }
}, },
mixins: [listUrlParamHandle],
props: {}, props: {},
methods: { methods: {
...mapActions('resource', ['getResourcesListP']), ...mapActions('resource', ['getResourcesListP']),
/** /**
* 文件上传 * File Upload
*/ */
_uploading () { _uploading () {
findComponentDownward(this.$root, 'roof-nav')._fileUpdate('UDF') findComponentDownward(this.$root, 'roof-nav')._fileUpdate('UDF')
}, },
_onConditions (o) { _onConditions (o) {
this.searchVal = o.searchVal this.searchParams = _.assign(this.searchParams, o)
this.pageNo = 1 this.searchParams.pageNo = 1
this._getResourcesListP()
}, },
_page (val) { _page (val) {
this.pageNo = val this.searchParams.pageNo = val
this._getResourcesListP()
}, },
_updateList () { _updateList () {
this.pageSize = 10 this.searchParams.pageNo = 1
this.pageNo = 1 this.searchParams.searchVal = ''
this.searchVal = '' this._debounceGET()
this._getResourcesListP()
}, },
_getResourcesListP (flag) { _getList (flag) {
this.isLoading = !flag this.isLoading = !flag
this.getResourcesListP({ this.getResourcesListP(this.searchParams).then(res => {
pageSize: this.pageSize, this.udfResourcesList = []
pageNo: this.pageNo,
searchVal: this.searchVal,
type: 'UDF'
}).then(res => {
this.udfResourcesList = res.totalList this.udfResourcesList = res.totalList
this.total = res.total this.total = res.total
this.isLoading = false this.isLoading = false
@ -88,11 +87,16 @@
}) })
} }
}, },
watch: {}, watch: {
// router
'$route' (a) {
// url no params get instance list
this.searchParams.pageNo = _.isEmpty(a.query) ? 1 : a.query.pageNo
}
},
created () { created () {
}, },
mounted () { mounted () {
this._getResourcesListP()
}, },
components: { mSecondaryMenu, mListConstruction, mConditions, mList, mSpin, mNoData } components: { mSecondaryMenu, mListConstruction, mConditions, mList, mSpin, mNoData }
} }

28
escheduler-ui/src/js/conf/home/pages/security/pages/queue/_source/createQueue.vue

@ -1,29 +1,29 @@
<template> <template>
<m-popup <m-popup
ref="popup" ref="popup"
:ok-text="item ? $t('确认编辑') : $t('确认提交')" :ok-text="item ? $t('Edit') : $t('Submit')"
:nameText="item ? $t('编辑队列') : $t('创建队列')" :nameText="item ? $t('Edit queue') : $t('Create queue')"
@ok="_ok"> @ok="_ok">
<template slot="content"> <template slot="content">
<div class="create-tenement-model"> <div class="create-tenement-model">
<m-list-box-f> <m-list-box-f>
<template slot="name"><b>*</b>名称</template> <template slot="name"><b>*</b>{{$t('Name')}}</template>
<template slot="content"> <template slot="content">
<x-input <x-input
type="input" type="input"
v-model="queueName" v-model="queueName"
placeholder="请输入名称" :placeholder="$t('Please enter name')"
autocomplete="off"> autocomplete="off">
</x-input> </x-input>
</template> </template>
</m-list-box-f> </m-list-box-f>
<m-list-box-f> <m-list-box-f>
<template slot="name"><b>*</b>队列值</template> <template slot="name"><b>*</b>{{$t('Queue value')}}</template>
<template slot="content"> <template slot="content">
<x-input <x-input
type="input" type="input"
v-model="queue" v-model="queue"
placeholder="请输入队列值" :placeholder="$t('Please enter queue value')"
autocomplete="off"> autocomplete="off">
</x-input> </x-input>
</template> </template>
@ -35,7 +35,6 @@
</template> </template>
<script> <script>
import _ from 'lodash' import _ from 'lodash'
import i18n from '@/module/i18n'
import store from '@/conf/home/store' import store from '@/conf/home/store'
import mPopup from '@/module/components/popup/popup' import mPopup from '@/module/components/popup/popup'
import mListBoxF from '@/module/components/listBoxF/listBoxF' import mListBoxF from '@/module/components/listBoxF/listBoxF'
@ -45,15 +44,15 @@
data () { data () {
return { return {
store, store,
queue:'', queue: '',
queueName:'' queueName: ''
} }
}, },
props: { props: {
item: Object item: Object
}, },
methods: { methods: {
_ok(){ _ok () {
if (!this._verification()) { if (!this._verification()) {
return return
} }
@ -87,7 +86,7 @@
}).catch(e => { }).catch(e => {
$catch(e) $catch(e)
}) })
}else{ } else {
this._verifyName(param).then(() => { this._verifyName(param).then(() => {
this.$refs['popup'].spinnerLoading = true this.$refs['popup'].spinnerLoading = true
this.store.dispatch(`security/createQueueQ`, param).then(res => { this.store.dispatch(`security/createQueueQ`, param).then(res => {
@ -99,11 +98,10 @@
this.$message.error(e.msg || '') this.$message.error(e.msg || '')
}) })
} }
}, },
_verification(){ _verification () {
if (!this.queueName) { if (!this.queueName) {
this.$message.warning(`请输入名称`) this.$message.warning(`Please enter name`)
return false return false
} }
if (!this.queue) { if (!this.queue) {
@ -112,7 +110,7 @@
} }
return true return true
}, },
_verifyName(param){ _verifyName (param) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
this.store.dispatch(`security/verifyQueueQ`, param).then(res => { this.store.dispatch(`security/verifyQueueQ`, param).then(res => {
resolve() resolve()

20
escheduler-ui/src/js/conf/home/pages/security/pages/queue/_source/list.vue

@ -4,22 +4,22 @@
<table> <table>
<tr> <tr>
<th> <th>
<span>{{$t('编号')}}</span> <span>{{$t('#')}}</span>
</th> </th>
<th> <th>
<span>{{$t('名称')}}</span> <span>{{$t('Name')}}</span>
</th> </th>
<th> <th>
<span>队列值</span> <span>队列值</span>
</th> </th>
<th> <th>
<span>{{$t('创建时间')}}</span> <span>{{$t('Create Time')}}</span>
</th> </th>
<th> <th>
<span>{{$t('更新时间')}}</span> <span>{{$t('Update Time')}}</span>
</th> </th>
<th width="70"> <th width="70">
<span>{{$t('操作')}}</span> <span>{{$t('Operation')}}</span>
</th> </th>
</tr> </tr>
<tr v-for="(item, $index) in list" :key="$index"> <tr v-for="(item, $index) in list" :key="$index">
@ -54,7 +54,7 @@
shape="circle" shape="circle"
size="xsmall" size="xsmall"
data-toggle="tooltip" data-toggle="tooltip"
:title="$t('编辑')" :title="$t('Edit')"
@click="_edit(item)" @click="_edit(item)"
icon="iconfont icon-bianjixiugai"> icon="iconfont icon-bianjixiugai">
</x-button> </x-button>
@ -62,13 +62,13 @@
:ref="'poptip-' + $index" :ref="'poptip-' + $index"
placement="bottom-end" placement="bottom-end"
width="90"> width="90">
<p>{{$t('确定删除吗?')}}</p> <p>{{$t('Delete?')}}</p>
<div style="text-align: right; margin: 0;padding-top: 4px;"> <div style="text-align: right; margin: 0;padding-top: 4px;">
<x-button type="text" size="xsmall" shape="circle" @click="_closeDelete($index)">{{$t('取消')}}</x-button> <x-button type="text" size="xsmall" shape="circle" @click="_closeDelete($index)">{{$t('Cancel')}}</x-button>
<x-button type="primary" size="xsmall" shape="circle" @click="_delete(item,$index)">{{$t('确定')}}</x-button> <x-button type="primary" size="xsmall" shape="circle" @click="_delete(item,$index)">{{$t('Confirm')}}</x-button>
</div> </div>
<template slot="reference"> <template slot="reference">
<x-button type="error" shape="circle" size="xsmall" data-toggle="tooltip" :title="$t('删除')">{{$t('删除')}}</x-button> <x-button type="error" shape="circle" size="xsmall" data-toggle="tooltip" :title="$t('delete')">{{$t('delete')}}</x-button>
</template> </template>
</x-poptip>--> </x-poptip>-->
</td> </td>

51
escheduler-ui/src/js/conf/home/pages/security/pages/queue/index.vue

@ -2,19 +2,19 @@
<div class="main-layout-box"> <div class="main-layout-box">
<m-secondary-menu :type="'security'"></m-secondary-menu> <m-secondary-menu :type="'security'"></m-secondary-menu>
<template> <template>
<m-list-construction :title="$t('队列管理')"> <m-list-construction :title="$t('Queue manage')">
<template slot="conditions"> <template slot="conditions">
<m-conditions @on-conditions="_onConditions"> <m-conditions @on-conditions="_onConditions">
<template slot="button-group"> <template slot="button-group">
<x-button type="ghost" size="small" @click="_create('')">{{$t('创建队列')}}</x-button> <x-button type="ghost" size="small" @click="_create('')">{{$t('Create queue')}}</x-button>
</template> </template>
</m-conditions> </m-conditions>
</template> </template>
<template slot="content"> <template slot="content">
<template v-if="queueList.length"> <template v-if="queueList.length">
<m-list :queue-list="queueList" :page-no="pageNo" :page-size="pageSize"></m-list> <m-list :queue-list="queueList" :page-no="searchParams.pageNo" :page-size="searchParams.pageSize"></m-list>
<div class="page-box"> <div class="page-box">
<x-page :current="pageNo" :total="total" show-elevator @on-change="_page"></x-page> <x-page :current="parseInt(searchParams.pageNo)" :total="total" :page-size="searchParams.pageSize" show-elevator @on-change="_page"></x-page>
</div> </div>
</template> </template>
<template v-if="!queueList.length"> <template v-if="!queueList.length">
@ -27,11 +27,13 @@
</div> </div>
</template> </template>
<script> <script>
import _ from 'lodash'
import { mapActions } from 'vuex' import { mapActions } from 'vuex'
import mList from './_source/list' import mList from './_source/list'
import mSpin from '@/module/components/spin/spin' import mSpin from '@/module/components/spin/spin'
import mCreateQueue from './_source/createQueue' import mCreateQueue from './_source/createQueue'
import mNoData from '@/module/components/noData/noData' import mNoData from '@/module/components/noData/noData'
import listUrlParamHandle from '@/module/mixin/listUrlParamHandle'
import mConditions from '@/module/components/conditions/conditions' import mConditions from '@/module/components/conditions/conditions'
import mSecondaryMenu from '@/module/components/secondaryMenu/secondaryMenu' import mSecondaryMenu from '@/module/components/secondaryMenu/secondaryMenu'
import mListConstruction from '@/module/components/listConstruction/listConstruction' import mListConstruction from '@/module/components/listConstruction/listConstruction'
@ -40,28 +42,29 @@
name: 'queue-index', name: 'queue-index',
data () { data () {
return { return {
pageSize: 10,
pageNo: 1,
total: null, total: null,
searchVal: '',
isLoading: true, isLoading: true,
queueList: [] queueList: [],
searchParams: {
pageSize: 10,
pageNo: 1,
searchVal: ''
}
} }
}, },
mixins: [listUrlParamHandle],
props: {}, props: {},
methods: { methods: {
...mapActions('security', ['getQueueListP']), ...mapActions('security', ['getQueueListP']),
/** /**
* 查询 * Query
*/ */
_onConditions (o) { _onConditions (o) {
this.searchVal = o.searchVal this.searchParams = _.assign(this.searchParams, o)
this.pageNo = 1 this.searchParams.pageNo = 1
this._getQueueListP()
}, },
_page (val) { _page (val) {
this.pageNo = val this.searchParams.pageNo = val
this._getQueueListP()
}, },
_create (item) { _create (item) {
let self = this let self = this
@ -75,7 +78,7 @@
return h(mCreateQueue, { return h(mCreateQueue, {
on: { on: {
onUpdate () { onUpdate () {
self._getQueueListP('false') self._debounceGET('false')
modal.remove() modal.remove()
}, },
close () { close () {
@ -89,13 +92,10 @@
} }
}) })
}, },
_getQueueListP (flag) { _getList (flag) {
this.isLoading = !flag this.isLoading = !flag
this.getQueueListP({ this.getQueueListP(this.searchParams).then(res => {
pageSize: this.pageSize, this.queueList = []
pageNo: this.pageNo,
searchVal: this.searchVal
}).then(res => {
this.queueList = res.totalList this.queueList = res.totalList
this.total = res.total this.total = res.total
this.isLoading = false this.isLoading = false
@ -104,9 +104,14 @@
}) })
} }
}, },
watch: {}, watch: {
// router
'$route' (a) {
// url no params get instance list
this.searchParams.pageNo = _.isEmpty(a.query) ? 1 : a.query.pageNo
}
},
created () { created () {
this._getQueueListP()
}, },
mounted () { mounted () {

12
escheduler-ui/src/js/conf/home/pages/security/pages/servers/_source/list.vue

@ -4,16 +4,16 @@
<table> <table>
<tr> <tr>
<th> <th>
<span>{{$t('编号')}}</span> <span>{{$t('#')}}</span>
</th> </th>
<th> <th>
<span>{{$t('ip')}}</span> <span>{{$t('IP')}}</span>
</th> </th>
<th> <th>
<span>{{$t('进程pid')}}</span> <span>{{$t('Process Pid')}}</span>
</th> </th>
<th> <th>
<span>{{$t('zk注册目录')}}</span> <span>{{$t('zk registration directory')}}</span>
</th> </th>
<th> <th>
<span>{{$t('cpuUsage')}}</span> <span>{{$t('cpuUsage')}}</span>
@ -22,10 +22,10 @@
<span>{{$t('memoryUsage')}}</span> <span>{{$t('memoryUsage')}}</span>
</th> </th>
<th> <th>
<span>{{$t('创建时间')}}</span> <span>{{$t('Create Time')}}</span>
</th> </th>
<th> <th>
<span>{{$t('最后心跳时间')}}</span> <span>{{$t('Last heartbeat time')}}</span>
</th> </th>
</tr> </tr>
<tr v-for="(item, $index) in list" :key="$index"> <tr v-for="(item, $index) in list" :key="$index">

2
escheduler-ui/src/js/conf/home/pages/security/pages/servers/pages/master/index.vue

@ -1,7 +1,7 @@
<template> <template>
<div class="main-layout-box"> <div class="main-layout-box">
<m-secondary-menu :type="'security'"></m-secondary-menu> <m-secondary-menu :type="'security'"></m-secondary-menu>
<m-list-construction :title="$t('服务管理-Master')"> <m-list-construction :title="$t('Service-Master')">
<template slot="content"> <template slot="content">
<template v-if="masterList.length"> <template v-if="masterList.length">
<m-list :list="masterList"></m-list> <m-list :list="masterList"></m-list>

2
escheduler-ui/src/js/conf/home/pages/security/pages/servers/pages/worker/index.vue

@ -1,7 +1,7 @@
<template> <template>
<div class="main-layout-box"> <div class="main-layout-box">
<m-secondary-menu :type="'security'"></m-secondary-menu> <m-secondary-menu :type="'security'"></m-secondary-menu>
<m-list-construction :title="$t('服务管理-Worker')"> <m-list-construction :title="$t('Service-Worker')">
<template slot="content"> <template slot="content">
<template v-if="workerList.length"> <template v-if="workerList.length">
<m-list :list="workerList"></m-list> <m-list :list="workerList"></m-list>

32
escheduler-ui/src/js/conf/home/pages/security/pages/tenement/_source/createTenement.vue

@ -1,35 +1,35 @@
<template> <template>
<m-popup <m-popup
ref="popup" ref="popup"
:ok-text="item ? $t('确认编辑') : $t('确认提交')" :ok-text="item ? $t('Edit') : $t('Submit')"
:nameText="item ? $t('编辑租户') : $t('创建租户')" :nameText="item ? $t('Edit Tenant') : $t('Create Tenant')"
@ok="_ok"> @ok="_ok">
<template slot="content"> <template slot="content">
<div class="create-tenement-model"> <div class="create-tenement-model">
<m-list-box-f> <m-list-box-f>
<template slot="name"><b>*</b>{{$t('租户编码')}}</template> <template slot="name"><b>*</b>{{$t('Tenant Code')}}</template>
<template slot="content"> <template slot="content">
<x-input <x-input
type="input" type="input"
:disabled="item ? true : false" :disabled="item ? true : false"
v-model="tenantCode" v-model="tenantCode"
:placeholder="$t('请输入name')"> :placeholder="$t('Please enter name')">
</x-input> </x-input>
</template> </template>
</m-list-box-f> </m-list-box-f>
<m-list-box-f> <m-list-box-f>
<template slot="name"><b>*</b>{{$t('租户名称')}}</template> <template slot="name"><b>*</b>{{$t('Tenant Name')}}</template>
<template slot="content"> <template slot="content">
<x-input <x-input
type="input" type="input"
v-model="tenantName" v-model="tenantName"
:placeholder="$t('请输入name')" :placeholder="$t('Please enter name')"
autocomplete="off"> autocomplete="off">
</x-input> </x-input>
</template> </template>
</m-list-box-f> </m-list-box-f>
<m-list-box-f> <m-list-box-f>
<template slot="name"><b>*</b>{{$t('队列')}}</template> <template slot="name"><b>*</b>{{$t('Queue')}}</template>
<template slot="content"> <template slot="content">
<x-select v-model="queueId"> <x-select v-model="queueId">
<x-option <x-option
@ -42,12 +42,12 @@
</template> </template>
</m-list-box-f> </m-list-box-f>
<m-list-box-f> <m-list-box-f>
<template slot="name">{{$t('描述')}}</template> <template slot="name">{{$t('Description')}}</template>
<template slot="content"> <template slot="content">
<x-input <x-input
type="textarea" type="textarea"
v-model="desc" v-model="desc"
:placeholder="$t('请输入desc')" :placeholder="$t('Please enter description')"
autocomplete="off"> autocomplete="off">
</x-input> </x-input>
</template> </template>
@ -116,15 +116,15 @@
_verification () { _verification () {
let isEn = /^[A-Za-z]+$/ let isEn = /^[A-Za-z]+$/
if (!this.tenantCode) { if (!this.tenantCode) {
this.$message.warning(`${i18n.$t('请输入租户编码只允许英文')}`) this.$message.warning(`${i18n.$t('Please enter the tenant code in English')}`)
return false return false
} }
if (!isEn.test(this.tenantCode)) { if (!isEn.test(this.tenantCode)) {
this.$message.warning(`${i18n.$t('请输入英文租户编码')}`) this.$message.warning(`${i18n.$t('Please enter tenant code in English')}`)
return false return false
} }
if (!this.tenantName) { if (!this.tenantName) {
this.$message.warning(`${i18n.$t('请输入租户名称')}`) this.$message.warning(`${i18n.$t('Please enter name')}`)
return false return false
} }
return true return true
@ -157,19 +157,19 @@
watch: { watch: {
}, },
created () { created () {
},
mounted () {
this._getQueueList().then(res => { this._getQueueList().then(res => {
if (this.item) { if (this.item) {
this.$nextTick(() => { this.$nextTick(() => {
this.queueId = _.filter(this.queueList, v => v.id === this.item.queueId)[0] this.queueId = _.find(this.queueList, ['id', this.item.queueId])
}) })
this.tenantCode = this.item.tenantCode this.tenantCode = this.item.tenantCode
this.tenantName = this.item.tenantName this.tenantName = this.item.tenantName
this.desc = this.item.desc this.desc = this.item.desc
} }
}) })
},
mounted () {
}, },
components: { mPopup, mListBoxF } components: { mPopup, mListBoxF }
} }

26
escheduler-ui/src/js/conf/home/pages/security/pages/tenement/_source/list.vue

@ -4,28 +4,28 @@
<table> <table>
<tr> <tr>
<th> <th>
<span>{{$t('编号')}}</span> <span>{{$t('#')}}</span>
</th> </th>
<th> <th>
<span>{{$t('租户编码')}}</span> <span>{{$t('Tenant Code')}}</span>
</th> </th>
<th> <th>
<span>{{$t('租户名称')}}</span> <span>{{$t('Tenant Name')}}</span>
</th> </th>
<th> <th>
<span>{{$t('描述')}}</span> <span>{{$t('Description')}}</span>
</th> </th>
<th> <th>
<span>{{$t('队列')}}</span> <span>{{$t('Queue')}}</span>
</th> </th>
<th> <th>
<span>{{$t('创建时间')}}</span> <span>{{$t('Create Time')}}</span>
</th> </th>
<th> <th>
<span>{{$t('更新时间')}}</span> <span>{{$t('Update Time')}}</span>
</th> </th>
<th width="70"> <th width="70">
<span>{{$t('操作')}}</span> <span>{{$t('Operation')}}</span>
</th> </th>
</tr> </tr>
<tr v-for="(item, $index) in list" :key="$index"> <tr v-for="(item, $index) in list" :key="$index">
@ -60,7 +60,7 @@
shape="circle" shape="circle"
size="xsmall" size="xsmall"
data-toggle="tooltip" data-toggle="tooltip"
:title="$t('编辑')" :title="$t('Edit')"
@click="_edit(item)" @click="_edit(item)"
icon="iconfont icon-bianjixiugai"> icon="iconfont icon-bianjixiugai">
</x-button> </x-button>
@ -68,13 +68,13 @@
:ref="'poptip-' + $index" :ref="'poptip-' + $index"
placement="bottom-end" placement="bottom-end"
width="90"> width="90">
<p>{{$t('确定删除吗?')}}</p> <p>{{$t('Delete?')}}</p>
<div style="text-align: right; margin: 0;padding-top: 4px;"> <div style="text-align: right; margin: 0;padding-top: 4px;">
<x-button type="text" size="xsmall" shape="circle" @click="_closeDelete($index)">{{$t('取消')}}</x-button> <x-button type="text" size="xsmall" shape="circle" @click="_closeDelete($index)">{{$t('Cancel')}}</x-button>
<x-button type="primary" size="xsmall" shape="circle" @click="_delete(item,$index)">{{$t('确定')}}</x-button> <x-button type="primary" size="xsmall" shape="circle" @click="_delete(item,$index)">{{$t('Confirm')}}</x-button>
</div> </div>
<template slot="reference"> <template slot="reference">
<x-button type="error" shape="circle" size="xsmall" data-toggle="tooltip" :title="$t('删除')">{{$t('删除')}}</x-button> <x-button type="error" shape="circle" size="xsmall" data-toggle="tooltip" :title="$t('delete')">{{$t('delete')}}</x-button>
</template> </template>
</x-poptip>--> </x-poptip>-->
</td> </td>

52
escheduler-ui/src/js/conf/home/pages/security/pages/tenement/index.vue

@ -2,19 +2,19 @@
<div class="main-layout-box"> <div class="main-layout-box">
<m-secondary-menu :type="'security'"></m-secondary-menu> <m-secondary-menu :type="'security'"></m-secondary-menu>
<template> <template>
<m-list-construction :title="$t('租户管理')"> <m-list-construction :title="$t('Tenant Manage')">
<template slot="conditions"> <template slot="conditions">
<m-conditions @on-conditions="_onConditions"> <m-conditions @on-conditions="_onConditions">
<template slot="button-group"> <template slot="button-group">
<x-button type="ghost" size="small" @click="_create('')">{{$t('创建租户')}}</x-button> <x-button type="ghost" size="small" @click="_create('')">{{$t('Create Tenant')}}</x-button>
</template> </template>
</m-conditions> </m-conditions>
</template> </template>
<template slot="content"> <template slot="content">
<template v-if="tenementList.length"> <template v-if="tenementList.length">
<m-list :tenement-list="tenementList" :page-no="pageNo" :page-size="pageSize"></m-list> <m-list :tenement-list="tenementList" :page-no="searchParams.pageNo" :page-size="searchParams.pageSize"></m-list>
<div class="page-box"> <div class="page-box">
<x-page :current="pageNo" :total="total" show-elevator @on-change="_page"></x-page> <x-page :current="parseInt(searchParams.pageNo)" :total="total" :page-size="searchParams.pageSize" show-elevator @on-change="_page"></x-page>
</div> </div>
</template> </template>
<template v-if="!tenementList.length"> <template v-if="!tenementList.length">
@ -27,11 +27,13 @@
</div> </div>
</template> </template>
<script> <script>
import _ from 'lodash'
import { mapActions } from 'vuex' import { mapActions } from 'vuex'
import mList from './_source/list' import mList from './_source/list'
import mSpin from '@/module/components/spin/spin' import mSpin from '@/module/components/spin/spin'
import mCreateTenement from './_source/createTenement' import mCreateTenement from './_source/createTenement'
import mNoData from '@/module/components/noData/noData' import mNoData from '@/module/components/noData/noData'
import listUrlParamHandle from '@/module/mixin/listUrlParamHandle'
import mConditions from '@/module/components/conditions/conditions' import mConditions from '@/module/components/conditions/conditions'
import mSecondaryMenu from '@/module/components/secondaryMenu/secondaryMenu' import mSecondaryMenu from '@/module/components/secondaryMenu/secondaryMenu'
import mListConstruction from '@/module/components/listConstruction/listConstruction' import mListConstruction from '@/module/components/listConstruction/listConstruction'
@ -40,28 +42,29 @@
name: 'tenement-index', name: 'tenement-index',
data () { data () {
return { return {
pageSize: 10,
pageNo: 1,
total: null, total: null,
searchVal: '',
isLoading: true, isLoading: true,
tenementList: [] tenementList: [],
searchParams: {
pageSize: 10,
pageNo: 1,
searchVal: ''
}
} }
}, },
mixins: [listUrlParamHandle],
props: {}, props: {},
methods: { methods: {
...mapActions('security', ['getTenantListP']), ...mapActions('security', ['getTenantListP']),
/** /**
* 查询 * Query
*/ */
_onConditions (o) { _onConditions (o) {
this.searchVal = o.searchVal this.searchParams = _.assign(this.searchParams, o)
this.pageNo = 1 this.searchParams.pageNo = 1
this._getTenantListP()
}, },
_page (val) { _page (val) {
this.pageNo = val this.searchParams.pageNo = val
this._getTenantListP()
}, },
_create (item) { _create (item) {
let self = this let self = this
@ -75,7 +78,7 @@
return h(mCreateTenement, { return h(mCreateTenement, {
on: { on: {
onUpdate () { onUpdate () {
self._getTenantListP('false') self._debounceGET('false')
modal.remove() modal.remove()
}, },
close () { close () {
@ -89,13 +92,10 @@
} }
}) })
}, },
_getTenantListP (flag) { _getList (flag) {
this.isLoading = !flag this.isLoading = !flag
this.getTenantListP({ this.getTenantListP(this.searchParams).then(res => {
pageSize: this.pageSize, this.tenementList = []
pageNo: this.pageNo,
searchVal: this.searchVal
}).then(res => {
this.tenementList = res.totalList this.tenementList = res.totalList
this.total = res.total this.total = res.total
this.isLoading = false this.isLoading = false
@ -104,12 +104,16 @@
}) })
} }
}, },
watch: {}, watch: {
// router
'$route' (a) {
// url no params get instance list
this.searchParams.pageNo = _.isEmpty(a.query) ? 1 : a.query.pageNo
}
},
created () { created () {
this._getTenantListP()
}, },
mounted () { mounted () {
}, },
components: { mSecondaryMenu, mList, mListConstruction, mConditions, mSpin, mNoData } components: { mSecondaryMenu, mList, mListConstruction, mConditions, mSpin, mNoData }
} }

73
escheduler-ui/src/js/conf/home/pages/security/pages/users/_source/createUser.vue

@ -1,33 +1,33 @@
<template> <template>
<m-popup <m-popup
ref="popup" ref="popup"
:ok-text="item ? $t('确认编辑') : $t('确认提交')" :ok-text="item ? $t('Edit') : $t('Submit')"
:nameText="item ? $t('编辑用户') : $t('创建用户')" :nameText="item ? $t('Edit User') : $t('Create User')"
@ok="_ok"> @ok="_ok">
<template slot="content"> <template slot="content">
<div class="create-user-model"> <div class="create-user-model">
<m-list-box-f> <m-list-box-f>
<template slot="name"><b>*</b>{{$t('用户名称')}}</template> <template slot="name"><b>*</b>{{$t('User Name')}}</template>
<template slot="content"> <template slot="content">
<x-input <x-input
type="input" type="input"
v-model="userName" v-model="userName"
:placeholder="$t('请输入用户名称')"> :placeholder="$t('Please enter user name')">
</x-input> </x-input>
</template> </template>
</m-list-box-f> </m-list-box-f>
<m-list-box-f v-if="router.history.current.name !== 'account'"> <m-list-box-f v-if="router.history.current.name !== 'account'">
<template slot="name"><b>*</b>{{$t('密码')}}</template> <template slot="name"><b>*</b>{{$t('Password')}}</template>
<template slot="content"> <template slot="content">
<x-input <x-input
type="input" type="input"
v-model="userPassword" v-model="userPassword"
:placeholder="$t('请输入密码')"> :placeholder="$t('Please enter your password')">
</x-input> </x-input>
</template> </template>
</m-list-box-f> </m-list-box-f>
<m-list-box-f v-if="isADMIN"> <m-list-box-f v-if="isADMIN">
<template slot="name"><b>*</b>{{$t('租户')}}</template> <template slot="name"><b>*</b>{{$t('Tenant')}}</template>
<template slot="content"> <template slot="content">
<x-select v-model="tenantId"> <x-select v-model="tenantId">
<x-option <x-option
@ -40,22 +40,35 @@
</template> </template>
</m-list-box-f> </m-list-box-f>
<m-list-box-f> <m-list-box-f>
<template slot="name"><b>*</b>{{$t('邮件')}}</template> <template slot="name"><b>*</b>{{$t('Queue')}}</template>
<template slot="content">
<x-select v-model="queueName">
<x-option
v-for="city in queueList"
:key="city.id"
:value="city"
:label="city.code">
</x-option>
</x-select>
</template>
</m-list-box-f>
<m-list-box-f>
<template slot="name"><b>*</b>{{$t('Email')}}</template>
<template slot="content"> <template slot="content">
<x-input <x-input
type="input" type="input"
v-model="email" v-model="email"
:placeholder="$t('请输入邮件')"> :placeholder="$t('Please enter email')">
</x-input> </x-input>
</template> </template>
</m-list-box-f> </m-list-box-f>
<m-list-box-f> <m-list-box-f>
<template slot="name">{{$t('手机')}}</template> <template slot="name">{{$t('Phone')}}</template>
<template slot="content"> <template slot="content">
<x-input <x-input
type="input" type="input"
v-model="phone" v-model="phone"
:placeholder="$t('请输入手机')"> :placeholder="$t('Please enter phone number')">
</x-input> </x-input>
</template> </template>
</m-list-box-f> </m-list-box-f>
@ -77,9 +90,11 @@
return { return {
store, store,
router, router,
queueList: [],
userName: '', userName: '',
userPassword: '', userPassword: '',
tenantId: {}, tenantId: {},
queueName: {},
email: '', email: '',
phone: '', phone: '',
tenantList: [], tenantList: [],
@ -116,34 +131,50 @@
// user name // user name
if (!this.userName) { if (!this.userName) {
this.$message.warning(`${i18n.$t('请输入用户名')}`) this.$message.warning(`${i18n.$t('Please enter user name')}`)
return false return false
} }
// password // password
if (!this.userPassword && !this.item) { if (!this.userPassword && !this.item) {
this.$message.warning(`${i18n.$t('请输入密码')}`) this.$message.warning(`${i18n.$t('Please enter your password')}`)
return false return false
} }
// email // email
if (!this.email) { if (!this.email) {
this.$message.warning(`${i18n.$t('请输入邮箱')}`) this.$message.warning(`${i18n.$t('Please enter email')}`)
return false return false
} }
// Verify email // Verify email
if (!regEmail.test(this.email)) { if (!regEmail.test(this.email)) {
this.$message.warning(`${i18n.$t('请输入正确的邮箱格式')}`) this.$message.warning(`${i18n.$t('Please enter the correct email format')}`)
return false return false
} }
// Verify phone // Verify phone
if (this.phone) { if (this.phone) {
if (!regPhone.test(this.phone)) { if (!regPhone.test(this.phone)) {
this.$message.warning(`${i18n.$t('请输入正确的手机格式')}`) this.$message.warning(`${i18n.$t('Please enter the correct mobile phone format')}`)
return false return false
} }
} }
return true return true
}, },
_getQueueList () {
return new Promise((resolve, reject) => {
this.store.dispatch('security/getQueueList').then(res => {
this.queueList = _.map(res, v => {
return {
id: v.id,
code: v.queueName
}
})
this.$nextTick(() => {
this.queueName = this.queueList[0]
})
resolve()
})
})
},
_getTenantList () { _getTenantList () {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
this.store.dispatch('security/getTenantList').then(res => { this.store.dispatch('security/getTenantList').then(res => {
@ -167,6 +198,7 @@
userPassword: this.userPassword, userPassword: this.userPassword,
tenantId: this.tenantId.id, tenantId: this.tenantId.id,
email: this.email, email: this.email,
queue: this.queueName.code,
phone: this.phone phone: this.phone
} }
if (this.item) { if (this.item) {
@ -188,13 +220,16 @@
created () { created () {
// Administrator gets tenant list // Administrator gets tenant list
if (this.isADMIN) { if (this.isADMIN) {
this._getTenantList().then(res => { Promise.all([this._getQueueList(), this._getTenantList()]).then(() => {
if (this.item) { if (this.item) {
this.userName = this.item.userName this.userName = this.item.userName
this.userPassword = '' this.userPassword = ''
this.email = this.item.email this.email = this.item.email
this.phone = this.item.phone this.phone = this.item.phone
this.tenantId = _.filter(this.tenantList, v => v.id === this.item.tenantId)[0] this.tenantId = _.find(this.tenantList, ['id', this.item.tenantId])
this.$nextTick(() => {
this.queueName = _.find(this.queueList, ['code', this.item.queue])
})
} }
}) })
} else { } else {
@ -204,10 +239,12 @@
this.email = this.item.email this.email = this.item.email
this.phone = this.item.phone this.phone = this.item.phone
this.tenantId.id = this.item.tenantId this.tenantId.id = this.item.tenantId
this.queueName = { queue: this.item.queue }
} }
} }
}, },
mounted () { mounted () {
}, },
components: { mPopup, mListBoxF } components: { mPopup, mListBoxF }
} }

52
escheduler-ui/src/js/conf/home/pages/security/pages/users/_source/list.vue

@ -4,28 +4,31 @@
<table> <table>
<tr> <tr>
<th> <th>
<span>{{$t('编号')}}</span> <span>{{$t('#')}}</span>
</th> </th>
<th> <th>
<span>{{$t('用户名称')}}</span> <span>{{$t('User Name')}}</span>
</th> </th>
<th> <th>
<span>{{$t('租户')}}</span> <span>{{$t('Tenant')}}</span>
</th> </th>
<th> <th>
<span>{{$t('邮箱')}}</span> <span>{{$t('Queue')}}</span>
</th> </th>
<th> <th>
<span>{{$t('手机')}}</span> <span>{{$t('Email')}}</span>
</th> </th>
<th> <th>
<span>{{$t('创建时间')}}</span> <span>{{$t('Phone')}}</span>
</th> </th>
<th> <th>
<span>{{$t('更新时间')}}</span> <span>{{$t('Create Time')}}</span>
</th>
<th>
<span>{{$t('Update Time')}}</span>
</th> </th>
<th width="120"> <th width="120">
<span>{{$t('操作')}}</span> <span>{{$t('Operation')}}</span>
</th> </th>
</tr> </tr>
<tr v-for="(item, $index) in list" :key="item.id"> <tr v-for="(item, $index) in list" :key="item.id">
@ -38,6 +41,7 @@
</span> </span>
</td> </td>
<td><span>{{item.tenantName || '-'}}</span></td> <td><span>{{item.tenantName || '-'}}</span></td>
<td><span>{{item.queue || '-'}}</span></td>
<td> <td>
<span>{{item.email || '-'}}</span> <span>{{item.email || '-'}}</span>
</td> </td>
@ -52,26 +56,26 @@
popper-class="user-list-poptip" popper-class="user-list-poptip"
placement="bottom-end"> placement="bottom-end">
<div class="auth-select-box"> <div class="auth-select-box">
<a href="javascript:" @click="_authProject(item,$index)">{{$t('项目')}}</a> <a href="javascript:" @click="_authProject(item,$index)">{{$t('Project')}}</a>
<a href="javascript:" @click="_authFile(item,$index)">{{$t('资源')}}</a> <a href="javascript:" @click="_authFile(item,$index)">{{$t('Resources')}}</a>
<a href="javascript:" @click="_authDataSource(item,$index)">{{$t('数据源')}}</a> <a href="javascript:" @click="_authDataSource(item,$index)">{{$t('Datasource')}}</a>
<a href="javascript:" @click="_authUdfFunc(item,$index)">{{$t('UDF函数')}}</a> <a href="javascript:" @click="_authUdfFunc(item,$index)">{{$t('UDF Function')}}</a>
</div> </div>
<template slot="reference"> <template slot="reference">
<x-button type="warning" shape="circle" size="xsmall" data-toggle="tooltip" :title="$t('授权')" icon="iconfont icon-yonghu1"></x-button> <x-button type="warning" shape="circle" size="xsmall" data-toggle="tooltip" :title="$t('Authorize')" icon="iconfont icon-yonghu1"></x-button>
</template> </template>
</x-poptip> </x-poptip>
<x-button type="info" shape="circle" size="xsmall" data-toggle="tooltip" icon="iconfont icon-bianjixiugai" :title="$t('编辑')" @click="_edit(item)"> <x-button type="info" shape="circle" size="xsmall" data-toggle="tooltip" icon="iconfont icon-bianjixiugai" :title="$t('Edit')" @click="_edit(item)">
</x-button> </x-button>
<x-poptip <x-poptip
:ref="'poptip-delete-' + $index" :ref="'poptip-delete-' + $index"
placement="bottom-end" placement="bottom-end"
width="90"> width="90">
<p>{{$t('确定删除吗?')}}</p> <p>{{$t('Delete?')}}</p>
<div style="text-align: right; margin: 0;padding-top: 4px;"> <div style="text-align: right; margin: 0;padding-top: 4px;">
<x-button type="text" size="xsmall" shape="circle" @click="_closeDelete($index)">{{$t('取消')}}</x-button> <x-button type="text" size="xsmall" shape="circle" @click="_closeDelete($index)">{{$t('Cancel')}}</x-button>
<x-button type="primary" size="xsmall" shape="circle" @click="_delete(item,$index)">{{$t('确定')}}</x-button> <x-button type="primary" size="xsmall" shape="circle" @click="_delete(item,$index)">{{$t('Confirm')}}</x-button>
</div> </div>
<template slot="reference"> <template slot="reference">
<x-button <x-button
@ -79,7 +83,7 @@
shape="circle" shape="circle"
size="xsmall" size="xsmall"
data-toggle="tooltip" data-toggle="tooltip"
:title="$t('删除')" :title="$t('delete')"
icon="iconfont icon-shanchu"> icon="iconfont icon-shanchu">
</x-button> </x-button>
</template> </template>
@ -174,7 +178,7 @@
sourceListPrs: sourceListPrs, sourceListPrs: sourceListPrs,
targetListPrs: targetListPrs, targetListPrs: targetListPrs,
type: { type: {
name: `${i18n.$t('项目')}` name: `${i18n.$t('Project')}`
} }
} }
}) })
@ -192,13 +196,13 @@
let sourceListPrs = _.map(data[0], v => { let sourceListPrs = _.map(data[0], v => {
return { return {
id: v.id, id: v.id,
name: v.name name: v.alias
} }
}) })
let targetListPrs = _.map(data[1], v => { let targetListPrs = _.map(data[1], v => {
return { return {
id: v.id, id: v.id,
name: v.name name: v.alias
} }
}) })
let self = this let self = this
@ -226,7 +230,7 @@
sourceListPrs: sourceListPrs, sourceListPrs: sourceListPrs,
targetListPrs: targetListPrs, targetListPrs: targetListPrs,
type: { type: {
name: `${i18n.$t('资源')}` name: `${i18n.$t('Resources')}`
} }
} }
}) })
@ -278,7 +282,7 @@
sourceListPrs: sourceListPrs, sourceListPrs: sourceListPrs,
targetListPrs: targetListPrs, targetListPrs: targetListPrs,
type: { type: {
name: `${i18n.$t('数据源')}` name: `${i18n.$t('Datasource')}`
} }
} }
}) })
@ -330,7 +334,7 @@
sourceListPrs: sourceListPrs, sourceListPrs: sourceListPrs,
targetListPrs: targetListPrs, targetListPrs: targetListPrs,
type: { type: {
name: 'UDF函数' name: 'UDF Function'
} }
} }
}) })

51
escheduler-ui/src/js/conf/home/pages/security/pages/users/index.vue

@ -2,19 +2,19 @@
<div class="main-layout-box"> <div class="main-layout-box">
<m-secondary-menu :type="'security'"></m-secondary-menu> <m-secondary-menu :type="'security'"></m-secondary-menu>
<template> <template>
<m-list-construction :title="$t('用户管理')"> <m-list-construction :title="$t('User Manage')">
<template slot="conditions"> <template slot="conditions">
<m-conditions @on-conditions="_onConditions"> <m-conditions @on-conditions="_onConditions">
<template slot="button-group"> <template slot="button-group">
<x-button type="ghost" size="small" @click="_create('')">{{$t('创建用户')}}</x-button> <x-button type="ghost" size="small" @click="_create('')">{{$t('Create User')}}</x-button>
</template> </template>
</m-conditions> </m-conditions>
</template> </template>
<template slot="content"> <template slot="content">
<template v-if="userList.length"> <template v-if="userList.length">
<m-list :user-list="userList" :page-no="pageNo" :page-size="pageSize"></m-list> <m-list :user-list="userList" :page-no="searchParams.pageNo" :page-size="searchParams.pageSize"></m-list>
<div class="page-box"> <div class="page-box">
<x-page :current="pageNo" :total="total" show-elevator @on-change="_page"></x-page> <x-page :current="parseInt(searchParams.pageNo)" :total="total" :page-size="searchParams.pageSize" show-elevator @on-change="_page"></x-page>
</div> </div>
</template> </template>
<template v-if="!userList.length"> <template v-if="!userList.length">
@ -27,11 +27,13 @@
</div> </div>
</template> </template>
<script> <script>
import _ from 'lodash'
import { mapActions } from 'vuex' import { mapActions } from 'vuex'
import mList from './_source/list' import mList from './_source/list'
import mCreateUser from './_source/createUser' import mCreateUser from './_source/createUser'
import mSpin from '@/module/components/spin/spin' import mSpin from '@/module/components/spin/spin'
import mNoData from '@/module/components/noData/noData' import mNoData from '@/module/components/noData/noData'
import listUrlParamHandle from '@/module/mixin/listUrlParamHandle'
import mConditions from '@/module/components/conditions/conditions' import mConditions from '@/module/components/conditions/conditions'
import mSecondaryMenu from '@/module/components/secondaryMenu/secondaryMenu' import mSecondaryMenu from '@/module/components/secondaryMenu/secondaryMenu'
import mListConstruction from '@/module/components/listConstruction/listConstruction' import mListConstruction from '@/module/components/listConstruction/listConstruction'
@ -40,28 +42,29 @@
name: 'users-index', name: 'users-index',
data () { data () {
return { return {
pageSize: 10,
pageNo: 1,
total: null, total: null,
searchVal: '',
isLoading: true, isLoading: true,
userList: [] userList: [],
searchParams: {
pageSize: 10,
pageNo: 1,
searchVal: ''
}
} }
}, },
mixins: [listUrlParamHandle],
props: {}, props: {},
methods: { methods: {
...mapActions('security', ['getUsersList']), ...mapActions('security', ['getUsersList']),
/** /**
* 查询 * Query
*/ */
_onConditions (o) { _onConditions (o) {
this.searchVal = o.searchVal this.searchParams = _.assign(this.searchParams, o)
this.pageNo = 1 this.searchParams.pageNo = 1
this._getUsersListP()
}, },
_page (val) { _page (val) {
this.pageNo = val this.searchParams.pageNo = val
this._getUsersListP()
}, },
_create (item) { _create (item) {
let self = this let self = this
@ -75,7 +78,7 @@
return h(mCreateUser, { return h(mCreateUser, {
on: { on: {
onUpdate () { onUpdate () {
self._getUsersListP('false') self._debounceGET('false')
modal.remove() modal.remove()
}, },
close () { close () {
@ -89,13 +92,10 @@
} }
}) })
}, },
_getUsersListP (flag) { _getList (flag) {
this.isLoading = !flag this.isLoading = !flag
this.getUsersList({ this.getUsersList(this.searchParams).then(res => {
pageSize: this.pageSize, this.userList = []
pageNo: this.pageNo,
searchVal: this.searchVal
}).then(res => {
this.userList = res.totalList this.userList = res.totalList
this.total = res.total this.total = res.total
this.isLoading = false this.isLoading = false
@ -104,9 +104,14 @@
}) })
} }
}, },
watch: {}, watch: {
// router
'$route' (a) {
// url no params get instance list
this.searchParams.pageNo = _.isEmpty(a.query) ? 1 : a.query.pageNo
}
},
created () { created () {
this._getUsersListP()
}, },
mounted () { mounted () {
}, },

18
escheduler-ui/src/js/conf/home/pages/security/pages/warningGroups/_source/createWarning.vue

@ -1,23 +1,23 @@
<template> <template>
<m-popup <m-popup
ref="popup" ref="popup"
:ok-text="item ? $t('确认编辑') : $t('确认提交')" :ok-text="item ? $t('Edit') : $t('Submit')"
:nameText="item ? $t('编辑告警组') : $t('创建告警组')" :nameText="item ? $t('Edit alarm group') : $t('Create alarm group')"
@ok="_ok"> @ok="_ok">
<template slot="content"> <template slot="content">
<div class="create-warning-model"> <div class="create-warning-model">
<m-list-box-f> <m-list-box-f>
<template slot="name"><b>*</b>{{$t('组名称')}}</template> <template slot="name"><b>*</b>{{$t('Group Name')}}</template>
<template slot="content"> <template slot="content">
<x-input <x-input
type="input" type="input"
v-model="groupName" v-model="groupName"
:placeholder="$t('请输入组名称')"> :placeholder="$t('Please enter group name')">
</x-input> </x-input>
</template> </template>
</m-list-box-f> </m-list-box-f>
<m-list-box-f> <m-list-box-f>
<template slot="name"><b>*</b>{{$t('组类型')}}</template> <template slot="name"><b>*</b>{{$t('Group Type')}}</template>
<template slot="content"> <template slot="content">
<x-select v-model="groupType"> <x-select v-model="groupType">
<x-option <x-option
@ -30,12 +30,12 @@
</template> </template>
</m-list-box-f> </m-list-box-f>
<m-list-box-f> <m-list-box-f>
<template slot="name">{{$t('备注')}}</template> <template slot="name">{{$t('Remarks')}}</template>
<template slot="content"> <template slot="content">
<x-input <x-input
type="textarea" type="textarea"
v-model="desc" v-model="desc"
:placeholder="$t('请输入desc')"> :placeholder="$t('Please enter description')">
</x-input> </x-input>
</template> </template>
</m-list-box-f> </m-list-box-f>
@ -57,7 +57,7 @@
groupName: '', groupName: '',
groupType: 'EMAIL', groupType: 'EMAIL',
desc: '', desc: '',
options: [{ code: `${i18n.$t('邮件')}`, id: 'EMAIL' }, { code: `${i18n.$t('短信')}`, id: 'SMS' }] options: [{ code: `${i18n.$t('Email')}`, id: 'EMAIL' }, { code: `${i18n.$t('SMS')}`, id: 'SMS' }]
} }
}, },
props: { props: {
@ -86,7 +86,7 @@
_verification () { _verification () {
// group name // group name
if (!this.groupName) { if (!this.groupName) {
this.$message.warning(`${i18n.$t('请输入组名称')}`) this.$message.warning(`${i18n.$t('Please enter group name')}`)
return false return false
} }
return true return true

30
escheduler-ui/src/js/conf/home/pages/security/pages/warningGroups/_source/list.vue

@ -4,25 +4,25 @@
<table> <table>
<tr> <tr>
<th> <th>
<span>{{$t('编号')}}</span> <span>{{$t('#')}}</span>
</th> </th>
<th> <th>
<span>{{$t('组名称')}}</span> <span>{{$t('Group Name')}}</span>
</th> </th>
<th> <th>
<span>{{$t('组类型')}}</span> <span>{{$t('Group Type')}}</span>
</th> </th>
<th> <th>
<span>{{$t('备注')}}</span> <span>{{$t('Remarks')}}</span>
</th> </th>
<th> <th>
<span>{{$t('创建时间')}}</span> <span>{{$t('Create Time')}}</span>
</th> </th>
<th> <th>
<span>{{$t('更新时间')}}</span> <span>{{$t('Update Time')}}</span>
</th> </th>
<th width="120"> <th width="120">
<span>{{$t('操作')}}</span> <span>{{$t('Operation')}}</span>
</th> </th>
</tr> </tr>
<tr v-for="(item, $index) in list" :key="$index"> <tr v-for="(item, $index) in list" :key="$index">
@ -34,7 +34,7 @@
<a href="javascript:" class="links">{{item.groupName}}</a> <a href="javascript:" class="links">{{item.groupName}}</a>
</span> </span>
</td> </td>
<td><span>{{item.groupType === 'EMAIL' ? '邮件' : '短信'}}</span></td> <td><span>{{item.groupType === 'EMAIL' ? `${$t('Email')}` : `${$t('SMS')}`}}</span></td>
<td> <td>
<span>{{item.desc}}</span> <span>{{item.desc}}</span>
</td> </td>
@ -43,21 +43,21 @@
</td> </td>
<td><span>{{item.updateTime | formatDate}}</span></td> <td><span>{{item.updateTime | formatDate}}</span></td>
<td> <td>
<x-button type="info" shape="circle" size="xsmall" data-toggle="tooltip" icon="iconfont icon-yonghu1" :title="$t('管理用户')" @click="_mangeUser(item)"> <x-button type="info" shape="circle" size="xsmall" data-toggle="tooltip" icon="iconfont icon-yonghu1" :title="$t('Managing Users')" @click="_mangeUser(item)">
</x-button> </x-button>
<x-button type="info" shape="circle" size="xsmall" data-toggle="tooltip" icon="iconfont icon-bianjixiugai" :title="$t('编辑')" @click="_edit(item)"> <x-button type="info" shape="circle" size="xsmall" data-toggle="tooltip" icon="iconfont icon-bianjixiugai" :title="$t('Edit')" @click="_edit(item)">
</x-button> </x-button>
<x-poptip <x-poptip
:ref="'poptip-delete-' + $index" :ref="'poptip-delete-' + $index"
placement="bottom-end" placement="bottom-end"
width="90"> width="90">
<p>{{$t('确定删除吗?')}}</p> <p>{{$t('Delete?')}}</p>
<div style="text-align: right; margin: 0;padding-top: 4px;"> <div style="text-align: right; margin: 0;padding-top: 4px;">
<x-button type="text" size="xsmall" shape="circle" @click="_closeDelete($index)">{{$t('取消')}}</x-button> <x-button type="text" size="xsmall" shape="circle" @click="_closeDelete($index)">{{$t('Cancel')}}</x-button>
<x-button type="primary" size="xsmall" shape="circle" @click="_delete(item,$index)">{{$t('确定')}}</x-button> <x-button type="primary" size="xsmall" shape="circle" @click="_delete(item,$index)">{{$t('Confirm')}}</x-button>
</div> </div>
<template slot="reference"> <template slot="reference">
<x-button type="error" shape="circle" size="xsmall" data-toggle="tooltip" icon="iconfont icon-shanchu" :title="$t('删除')"> <x-button type="error" shape="circle" size="xsmall" data-toggle="tooltip" icon="iconfont icon-shanchu" :title="$t('delete')">
</x-button> </x-button>
</template> </template>
</x-poptip> </x-poptip>
@ -150,7 +150,7 @@
sourceListPrs: sourceListPrs, sourceListPrs: sourceListPrs,
targetListPrs: targetListPrs, targetListPrs: targetListPrs,
type: { type: {
name: `${i18n.$t('管理用户')}` name: `${i18n.$t('Managing Users')}`
} }
} }
}) })

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save