Browse Source

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

pull/2/head
baoliang 6 years ago
parent
commit
9b710f39ad
  1. 60
      escheduler-api/src/main/java/cn/escheduler/api/dto/CommandStateCount.java
  2. 30
      escheduler-api/src/main/java/cn/escheduler/api/service/DataAnalysisService.java
  3. 38
      escheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/sql.vue
  4. 121
      escheduler-ui/src/js/conf/home/pages/monitor/pages/servers/_source/gaugeOption.js
  5. 37
      escheduler-ui/src/js/conf/home/pages/monitor/pages/servers/_source/list.vue
  6. 143
      escheduler-ui/src/js/conf/home/pages/monitor/pages/servers/master.vue
  7. 89
      escheduler-ui/src/js/conf/home/pages/monitor/pages/servers/mysql.vue
  8. 44
      escheduler-ui/src/js/conf/home/pages/monitor/pages/servers/servers.scss
  9. 156
      escheduler-ui/src/js/conf/home/pages/monitor/pages/servers/worker.vue
  10. 16
      escheduler-ui/src/js/conf/home/pages/monitor/pages/servers/zookeeper.vue
  11. 8
      escheduler-ui/src/js/conf/home/pages/projects/pages/definition/pages/list/_source/email.vue
  12. 4
      escheduler-ui/src/js/conf/home/pages/projects/pages/definition/pages/list/_source/start.vue
  13. 171
      escheduler-ui/src/js/conf/home/pages/projects/pages/index/_source/projectChart.vue
  14. 3
      escheduler-ui/src/js/conf/home/pages/security/pages/queue/_source/list.vue
  15. 10
      escheduler-ui/src/js/conf/home/pages/security/pages/queue/index.vue
  16. 3
      escheduler-ui/src/js/conf/home/pages/security/pages/tenement/_source/list.vue
  17. 10
      escheduler-ui/src/js/conf/home/pages/security/pages/tenement/index.vue
  18. 39
      escheduler-ui/src/js/conf/home/pages/security/pages/token/index.vue
  19. 3
      escheduler-ui/src/js/conf/home/pages/security/pages/users/_source/list.vue
  20. 10
      escheduler-ui/src/js/conf/home/pages/security/pages/users/index.vue
  21. 3
      escheduler-ui/src/js/conf/home/pages/security/pages/warningGroups/_source/list.vue
  22. 10
      escheduler-ui/src/js/conf/home/pages/security/pages/warningGroups/index.vue
  23. 3
      escheduler-ui/src/js/conf/home/pages/security/pages/workerGroups/_source/list.vue
  24. 9
      escheduler-ui/src/js/conf/home/pages/security/pages/workerGroups/index.vue
  25. 19
      escheduler-ui/src/js/conf/home/pages/user/pages/token/_source/createToken.vue
  26. 3
      escheduler-ui/src/js/conf/home/pages/user/pages/token/_source/list.vue
  27. 10
      escheduler-ui/src/js/conf/home/pages/user/pages/token/index.vue
  28. 8
      escheduler-ui/src/js/conf/home/router/index.js
  29. 24
      escheduler-ui/src/js/conf/home/store/projects/actions.js
  30. 2
      escheduler-ui/src/js/conf/home/store/security/actions.js
  31. 11
      escheduler-ui/src/js/module/components/secondaryMenu/_source/menu.js

60
escheduler-api/src/main/java/cn/escheduler/api/dto/CommandStateCount.java

@ -0,0 +1,60 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cn.escheduler.api.dto;
import cn.escheduler.common.enums.ExecutionStatus;
/**
* command state count
*/
public class CommandStateCount {
private int errorCount;
private int normalCount;
private ExecutionStatus commandState;
public CommandStateCount(){}
public CommandStateCount(int errorCount, int normalCount, ExecutionStatus commandState) {
this.errorCount = errorCount;
this.normalCount = normalCount;
this.commandState = commandState;
}
public int getErrorCount() {
return errorCount;
}
public void setErrorCount(int errorCount) {
this.errorCount = errorCount;
}
public int getNormalCount() {
return normalCount;
}
public void setNormalCount(int normalCount) {
this.normalCount = normalCount;
}
public ExecutionStatus getCommandState() {
return commandState;
}
public void setCommandState(ExecutionStatus commandState) {
this.commandState = commandState;
}
}

30
escheduler-api/src/main/java/cn/escheduler/api/service/DataAnalysisService.java

@ -17,6 +17,7 @@
package cn.escheduler.api.service; package cn.escheduler.api.service;
import cn.escheduler.api.dto.CommandStateCount;
import cn.escheduler.api.dto.DefineUserDto; import cn.escheduler.api.dto.DefineUserDto;
import cn.escheduler.api.dto.TaskCountDto; import cn.escheduler.api.dto.TaskCountDto;
import cn.escheduler.api.enums.Status; import cn.escheduler.api.enums.Status;
@ -38,10 +39,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.text.MessageFormat; import java.text.MessageFormat;
import java.util.Date; import java.util.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/** /**
* data analysis service * data analysis service
@ -298,7 +296,16 @@ public class DataAnalysisService {
dataMap.put(errorExecutionStatus.getExecutionStatus(),errorCommandStateCountsMap); dataMap.put(errorExecutionStatus.getExecutionStatus(),errorCommandStateCountsMap);
} }
result.put(Constants.DATA_LIST, dataMap); List<CommandStateCount> list = new ArrayList<>();
Iterator<Map.Entry<ExecutionStatus, Map<String, Integer>>> iterator = dataMap.entrySet().iterator();
while (iterator.hasNext()){
Map.Entry<ExecutionStatus, Map<String, Integer>> next = iterator.next();
CommandStateCount commandStateCount = new CommandStateCount(next.getValue().get("errorCommandState"),
next.getValue().get("commandState"),next.getKey());
list.add(commandStateCount);
}
result.put(Constants.DATA_LIST, list);
putMsg(result, Status.SUCCESS); putMsg(result, Status.SUCCESS);
return result; return result;
} }
@ -356,9 +363,18 @@ public class DataAnalysisService {
} }
} }
} }
Integer taskQueueCount = 0;
Integer taskKillCount = 0;
if (tasksQueueIds.length != 0){
taskQueueCount = taskInstanceMapper.countTask(loginUser.getId(),loginUser.getUserType(),projectId, tasksQueueIds);
}
if (tasksQueueIds.length != 0){
taskKillCount = taskInstanceMapper.countTask(loginUser.getId(),loginUser.getUserType(),projectId, tasksQueueIds);
}
Integer taskQueueCount = taskInstanceMapper.countTask(loginUser.getId(),loginUser.getUserType(),projectId, tasksQueueIds);
Integer taskKillCount = taskInstanceMapper.countTask(loginUser.getId(),loginUser.getUserType(),projectId, tasksQueueIds);
dataMap.put("taskQueue",taskQueueCount); dataMap.put("taskQueue",taskQueueCount);
dataMap.put("taskKill",taskKillCount); dataMap.put("taskKill",taskKillCount);

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

@ -27,6 +27,20 @@
</div> </div>
</div> </div>
</m-list-box> </m-list-box>
<template v-if="!sqlType && showType.length">
<m-list-box>
<div slot="text">收件人</div>
<div slot="content">
<m-email v-model="receivers" :repeat-data="receiversCc"></m-email>
</div>
</m-list-box>
<m-list-box>
<div slot="text">抄送人</div>
<div slot="content">
<m-email v-model="receiversCc" :repeat-data="receivers"></m-email>
</div>
</m-list-box>
</template>
<m-list-box v-show="type === 'HIVE'"> <m-list-box v-show="type === 'HIVE'">
<div slot="text">{{$t('SQL Parameter')}}</div> <div slot="text">{{$t('SQL Parameter')}}</div>
<div slot="content"> <div slot="content">
@ -83,6 +97,7 @@
import mDatasource from './_source/datasource' import mDatasource from './_source/datasource'
import mLocalParams from './_source/localParams' import mLocalParams from './_source/localParams'
import disabledState from '@/module/mixin/disabledState' import disabledState from '@/module/mixin/disabledState'
import mEmail from '@/conf/home/pages/projects/pages/definition/pages/list/_source/email'
import codemirror from '@/conf/home/pages/resource/pages/file/pages/_source/codemirror' import codemirror from '@/conf/home/pages/resource/pages/file/pages/_source/codemirror'
let editor let editor
@ -108,7 +123,11 @@
// Form/attachment // Form/attachment
showType: ['TABLE'], showType: ['TABLE'],
// Sql parameter // Sql parameter
connParams: '' connParams: '',
// recipients
receivers: [],
// copy to
receiversCc: []
} }
}, },
mixins: [disabledState], mixins: [disabledState],
@ -174,6 +193,8 @@
sql: editor.getValue(), sql: editor.getValue(),
udfs: this.udfs, udfs: this.udfs,
sqlType: this.sqlType, sqlType: this.sqlType,
receivers: this.receivers.join(','),
receiversCc: this.receiversCc.join(','),
showType: (() => { showType: (() => {
/** /**
* Special processing return order TABLE,ATTACHMENT * Special processing return order TABLE,ATTACHMENT
@ -223,12 +244,23 @@
if (val) { if (val) {
this.showType = [] this.showType = []
} }
if (val !== 0) {
this.receivers = []
this.receiversCc = []
}
}, },
// Listening data source // Listening data source
type (val) { type (val) {
if (val !== 'HIVE') { if (val !== 'HIVE') {
this.connParams = '' this.connParams = ''
} }
},
//
showType (val) {
if (!val.length) {
this.receivers = []
this.receiversCc = []
}
} }
}, },
created () { created () {
@ -245,6 +277,8 @@
this.connParams = o.params.connParams || '' this.connParams = o.params.connParams || ''
this.localParams = o.params.localParams || [] this.localParams = o.params.localParams || []
this.showType = o.params.showType.split(',') || [] this.showType = o.params.showType.split(',') || []
this.receivers = o.params.receivers && o.params.receivers.split(',') || []
this.receiversCc = o.params.receiversCc && o.params.receiversCc.split(',') || []
} }
}, },
mounted () { mounted () {
@ -262,6 +296,6 @@
} }
}, },
computed: {}, computed: {},
components: { mListBox, mDatasource, mLocalParams, mUdfs, mSqlType } components: { mListBox, mDatasource, mLocalParams, mUdfs, mSqlType, mEmail }
} }
</script> </script>

121
escheduler-ui/src/js/conf/home/pages/monitor/pages/servers/_source/gaugeOption.js

@ -0,0 +1,121 @@
export default {
series: [
{
type: 'gauge',
center: ['50%', '45%'], // 仪表位置
radius: '80%', // 仪表大小
startAngle: 200, // 开始角度
endAngle: -20, // 结束角度
axisLine: {
show: false,
lineStyle: { // 属性lineStyle控制线条样式
color: [
[ 0.5, new echarts.graphic.LinearGradient(0, 0, 1, 0, [{ // eslint-disable-line
offset: 1,
color: '#E75F25' // 50% 处的颜色
}, {
offset: 0.8,
color: '#D9452C' // 40% 处的颜色
}], false) ], // 100% 处的颜色
[ 0.7, new echarts.graphic.LinearGradient(0, 0, 1, 0, [{ // eslint-disable-line
offset: 1,
color: '#FFC539' // 70% 处的颜色
}, {
offset: 0.8,
color: '#FE951E' // 66% 处的颜色
}, {
offset: 0,
color: '#E75F25' // 50% 处的颜色
}], false) ],
[ 0.9, new echarts.graphic.LinearGradient(0, 0, 0, 1, [{ // eslint-disable-line
offset: 1,
color: '#C7DD6B' // 90% 处的颜色
}, {
offset: 0.8,
color: '#FEEC49' // 86% 处的颜色
}, {
offset: 0,
color: '#FFC539' // 70% 处的颜色
}], false) ],
[1, new echarts.graphic.LinearGradient(0, 0, 0, 1, [ { // eslint-disable-line
offset: 0.2,
color: '#1CAD52' // 92% 处的颜色
}, {
offset: 0,
color: '#C7DD6B' // 90% 处的颜色
}], false) ]
],
width: 10
}
},
splitLine: {
show: false
},
axisTick: {
show: false
},
axisLabel: {
show: false
},
pointer: { // 指针样式
length: '45%'
},
detail: {
show: false
}
},
{
type: 'gauge',
center: ['50%', '45%'], // 默认全局居中
radius: '70%',
startAngle: 200,
endAngle: -20,
axisLine: {
show: true,
lineStyle: { // 属性lineStyle控制线条样式
color: [ // 表盘颜色
[ 0.5, '#DA462C' ], // 0-50%处的颜色
[ 0.7, '#FF9618' ], // 51%-70%处的颜色
[ 0.9, '#FFED44' ], // 70%-90%处的颜色
[ 1, '#20AE51' ]// 90%-100%处的颜色
],
width: 30// 表盘宽度
}
},
splitLine: { // 分割线样式(及10、20等长线样式)
length: 30,
lineStyle: { // 属性lineStyle控制线条样式
width: 2
}
},
axisTick: { // 刻度线样式(及短线样式)
length: 20
},
axisLabel: { // 文字样式(及“10”、“20”等文字样式)
color: 'black',
distance: 5 // 文字离表盘的距离
},
detail: {
formatter: '{score|{value}%}',
offsetCenter: [0, '50%'],
backgroundColor: '#2D8BF0',
height: 30,
rich: {
score: {
color: 'white',
fontFamily: '微软雅黑',
fontSize: 32
}
}
},
data: [{
value: 70,
label: {
textStyle: {
fontSize: 12
}
}
}]
}
]
}

37
escheduler-ui/src/js/conf/home/pages/monitor/pages/servers/_source/list.vue

@ -7,25 +7,28 @@
<span>{{$t('#')}}</span> <span>{{$t('#')}}</span>
</th> </th>
<th> <th>
<span>{{$t('IP')}}</span> <span>node</span>
</th> </th>
<th> <th>
<span>{{$t('Process Pid')}}</span> <span>ip</span>
</th> </th>
<th> <th>
<span>{{$t('zk registration directory')}}</span> <span>模式</span>
</th> </th>
<th> <th>
<span>{{$t('cpuUsage')}}</span> <span>连接数</span>
</th> </th>
<th> <th>
<span>{{$t('memoryUsage')}}</span> <span>watch数</span>
</th> </th>
<th> <th>
<span>{{$t('Create Time')}}</span> <span>数据量</span>
</th> </th>
<th> <th>
<span>{{$t('Last heartbeat time')}}</span> <span>Sent/Received</span>
</th>
<th>
<span>节点自检状态</span>
</th> </th>
</tr> </tr>
<tr v-for="(item, $index) in list" :key="$index"> <tr v-for="(item, $index) in list" :key="$index">
@ -34,22 +37,25 @@
</td> </td>
<td> <td>
<span> <span>
<a href="javascript:" class="links">{{item.host}}</a> <a href="javascript:" class="links">task1</a>
</span> </span>
</td> </td>
<td><span>{{item.port}}</span></td> <td><span>192.11.1.1</span></td>
<td> <td>
<span>{{item.zkDirectory}}</span> <span>2222</span>
</td> </td>
<td> <td>
<span>{{_rtResInfo(JSON.parse(item.resInfo)['cpuUsage'])}}</span> <span>3333</span>
</td> </td>
<td> <td>
<span>{{_rtResInfo(JSON.parse(item.resInfo)['memoryUsage'])}}</span> <span>4444</span>
</td> </td>
<td><span>{{item.createTime | formatDate}}</span></td> <td><span>5555</span></td>
<td> <td>
<span>{{item.lastHeartbeatTime | formatDate}}</span> <span>6666</span>
</td>
<td>
<span>7777</span>
</td> </td>
</tr> </tr>
</table> </table>
@ -70,9 +76,6 @@
list: Array list: Array
}, },
methods: { methods: {
_rtResInfo (val) {
return (val * 100).toFixed(2) + ' %'
}
} }
} }
</script> </script>

143
escheduler-ui/src/js/conf/home/pages/monitor/pages/servers/master.vue

@ -1,11 +1,129 @@
<template> <template>
<m-list-construction :title="$t('Service-Master')"> <m-list-construction :title="'Master管理'">
<template slot="content"> <template slot="content">
<div class="servers-wrapper"> <div class="servers-wrapper">
<div class="row"> <div class="row">
<div class="col-md-4">.col-md-8</div> <div class="col-md-4">
<div class="col-md-4">.col-md-4</div> <div class="gridb-model">
<div class="col-md-4">.col-md-4</div> <div class="title">
<span>Cpu详细信息</span>
</div>
<div class="gauge-echart">
<div id="a1" style="height: 380px;"></div>
</div>
<div class="text-1" style="margin-top: -126px">
cpu
</div>
</div>
</div>
<div class="col-md-4">
<div class="gridb-model">
<div class="title">
<span>内存详细信息</span>
</div>
<div class="gauge-echart">
<div id="a2" style="height: 380px;"></div>
</div>
<div class="text-1" style="margin-top: -126px">
cpu
</div>
</div>
</div>
<div class="col-md-4">
<div class="gridb-model">
<div class="title">
<span>内存详细信息</span>
</div>
<div class="value-p">
<b style="color: #0098e1;">12</b>
</div>
<div class="text-1">
cpu
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-md-4">
<div class="gridb-model">
<div class="title">
<span>Cpu详细信息</span>
</div>
<div class="gauge-echart">
<div id="a3" style="height: 380px;"></div>
</div>
<div class="text-1" style="margin-top: -126px">
cpu
</div>
</div>
</div>
<div class="col-md-4">
<div class="gridb-model">
<div class="title">
<span>内存详细信息</span>
</div>
<div class="gauge-echart">
<div id="a4" style="height: 380px;"></div>
</div>
<div class="text-1" style="margin-top: -126px">
cpu
</div>
</div>
</div>
<div class="col-md-4">
<div class="gridb-model">
<div class="title">
<span>内存详细信息</span>
</div>
<div class="value-p">
<b style="color: #7a56b8;">72</b>
</div>
<div class="text-1">
cpu
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-md-4">
<div class="gridb-model">
<div class="title">
<span>Cpu详细信息</span>
</div>
<div class="gauge-echart">
<div id="a5" style="height: 380px;"></div>
</div>
<div class="text-1" style="margin-top: -126px">
cpu
</div>
</div>
</div>
<div class="col-md-4">
<div class="gridb-model">
<div class="title">
<span>内存详细信息</span>
</div>
<div class="gauge-echart">
<div id="a6" style="height: 380px;"></div>
</div>
<div class="text-1" style="margin-top: -126px">
cpu
</div>
</div>
</div>
<div class="col-md-4">
<div class="gridb-model">
<div class="title">
<span>内存详细信息</span>
</div>
<div class="value-p">
<b style="color: #e84d80;">44</b>
</div>
<div class="text-1">
cpu
</div>
</div>
</div>
</div> </div>
</div> </div>
</template> </template>
@ -16,6 +134,7 @@
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 gaugeOption from './_source/gaugeOption'
import mListConstruction from '@/module/components/listConstruction/listConstruction' import mListConstruction from '@/module/components/listConstruction/listConstruction'
export default { export default {
@ -36,14 +155,20 @@
}, },
watch: {}, watch: {},
created () { created () {
this.isLoading = true
this.getProcessMasterList().then(res => {
this.masterList = res.data
this.isLoading = false
})
}, },
mounted () { mounted () {
let b = {}
let a = ['a1', 'a2', 'a3', 'a4', 'a5', 'a6']
a.forEach((v, i) => {
b[v] = echarts.init(document.getElementById(v)) // eslint-disable-line
b[v].setOption(gaugeOption, true)
})
}, },
components: { mList, mListConstruction, mSpin, mNoData } components: { mList, mListConstruction, mSpin, mNoData }
} }
</script> </script>
<style lang="scss" rel="stylesheet/scss">
@import "./servers";
</style>

89
escheduler-ui/src/js/conf/home/pages/monitor/pages/servers/mysql.vue

@ -1,40 +1,83 @@
<template> <template>
<div class="mysql-model"> <m-list-construction :title="'Mysql管理'">
mysql <template slot="content">
<div class="servers-wrapper">
<div class="row">
<div class="col-md-4">
<div class="gridb-model">
<div class="title">
<span>正常与否</span>
</div> </div>
<div class="value-p">
<b style="color: #0098e1;">78</b>
</div>
<div class="text-1">
正常与否
</div>
</div>
</div>
<div class="col-md-4">
<div class="gridb-model">
<div class="title">
<span>最大连接数</span>
</div>
<div class="value-p">
<b style="color: #ffcf3d;">55</b>
</div>
<div class="text-1">
最大连接数
</div>
</div>
</div>
<div class="col-md-4">
<div class="gridb-model">
<div class="title">
<span>当前活跃连接</span>
</div>
<div class="value-p">
<b style="color: #f07d7d;">32</b>
</div>
<div class="text-1">
当前活跃连接
</div>
</div>
</div>
</div>
</div>
</template>
</m-list-construction>
</template> </template>
<script> <script>
import { mapActions } from 'vuex'
import mList from './_source/list'
import mSpin from '@/module/components/spin/spin'
import mNoData from '@/module/components/noData/noData'
import mListConstruction from '@/module/components/listConstruction/listConstruction'
export default { export default {
name: 'mysql', name: 'servers-mysql',
data () { data () {
return {} return {
pageSize: 10,
pageNo: 1,
totalPage: null,
searchVal: '',
isLoading: false,
masterList: []
}
}, },
props: {}, props: {},
methods: {}, methods: {
watch: {}, ...mapActions('security', ['getProcessMasterList'])
beforeCreate () {
}, },
watch: {},
created () { created () {
}, },
beforeMount () {
},
mounted () { mounted () {
}, },
beforeUpdate () { components: { mList, mListConstruction, mSpin, mNoData }
},
updated () {
},
beforeDestroy () {
},
destroyed () {
},
computed: {},
components: {}
} }
</script> </script>
<style lang="scss" rel="stylesheet/scss"> <style lang="scss" rel="stylesheet/scss">
.mysql-model { @import "./servers";
}
</style> </style>

44
escheduler-ui/src/js/conf/home/pages/monitor/pages/servers/servers.scss

@ -0,0 +1,44 @@
.servers-wrapper {
padding: 16px;
>.row {
margin-bottom: 20px;
}
.gridb-model {
width: 100%;
height: 360px;
overflow: hidden;
border: 1px solid #E8E8E8;
margin: 0 auto;
>.title {
height: 36px;
line-height: 36px;
background: #F9F9F9;
border-bottom: 1px solid #E8E8E8;
span {
padding-left: 8px;
}
}
.gauge-echart {
width: 350px;
margin: auto;
margin-bottom: -80px;
}
.text-1 {
width: 100%;
margin: 0 auto;
font-size: 32px;
text-align: center;
}
.value-p {
height: 254px;
line-height: 254px;
text-align: center;
>b {
font-size: 140px;
color: #333;
}
}
}
}

156
escheduler-ui/src/js/conf/home/pages/monitor/pages/servers/worker.vue

@ -1,13 +1,131 @@
<template> <template>
<m-list-construction :title="$t('Service-Worker')"> <m-list-construction :title="'Worker管理'">
<template slot="content"> <template slot="content">
<template v-if="workerList.length"> <div class="servers-wrapper">
<m-list :list="workerList"></m-list> <div class="row">
</template> <div class="col-md-4">
<template v-if="!workerList.length"> <div class="gridb-model">
<m-no-data></m-no-data> <div class="title">
</template> <span>Cpu详细信息</span>
<m-spin :is-spin="isLoading" ></m-spin> </div>
<div class="gauge-echart">
<div id="a1" style="height: 380px;"></div>
</div>
<div class="text-1" style="margin-top: -126px">
cpu
</div>
</div>
</div>
<div class="col-md-4">
<div class="gridb-model">
<div class="title">
<span>内存详细信息</span>
</div>
<div class="gauge-echart">
<div id="a2" style="height: 380px;"></div>
</div>
<div class="text-1" style="margin-top: -126px">
cpu
</div>
</div>
</div>
<div class="col-md-4">
<div class="gridb-model">
<div class="title">
<span>内存详细信息</span>
</div>
<div class="value-p">
<b style="color: #0098e1;">83</b>
</div>
<div class="text-1">
cpu
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-md-4">
<div class="gridb-model">
<div class="title">
<span>Cpu详细信息</span>
</div>
<div class="gauge-echart">
<div id="a3" style="height: 380px;"></div>
</div>
<div class="text-1" style="margin-top: -126px">
cpu
</div>
</div>
</div>
<div class="col-md-4">
<div class="gridb-model">
<div class="title">
<span>内存详细信息</span>
</div>
<div class="gauge-echart">
<div id="a4" style="height: 380px;"></div>
</div>
<div class="text-1" style="margin-top: -126px">
cpu
</div>
</div>
</div>
<div class="col-md-4">
<div class="gridb-model">
<div class="title">
<span>内存详细信息</span>
</div>
<div class="value-p">
<b style="color: #7281c2;">18</b>
</div>
<div class="text-1">
cpu
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-md-4">
<div class="gridb-model">
<div class="title">
<span>Cpu详细信息</span>
</div>
<div class="gauge-echart">
<div id="a5" style="height: 380px;"></div>
</div>
<div class="text-1" style="margin-top: -126px">
cpu
</div>
</div>
</div>
<div class="col-md-4">
<div class="gridb-model">
<div class="title">
<span>内存详细信息</span>
</div>
<div class="gauge-echart">
<div id="a6" style="height: 380px;"></div>
</div>
<div class="text-1" style="margin-top: -126px">
cpu
</div>
</div>
</div>
<div class="col-md-4">
<div class="gridb-model">
<div class="title">
<span>内存详细信息</span>
</div>
<div class="value-p">
<b style="color: #f2ac6f;">15</b>
</div>
<div class="text-1">
cpu
</div>
</div>
</div>
</div>
</div>
</template> </template>
</m-list-construction> </m-list-construction>
</template> </template>
@ -16,10 +134,11 @@
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 gaugeOption from './_source/gaugeOption'
import mListConstruction from '@/module/components/listConstruction/listConstruction' import mListConstruction from '@/module/components/listConstruction/listConstruction'
export default { export default {
name: 'worker-index', name: 'servers-worker',
data () { data () {
return { return {
pageSize: 10, pageSize: 10,
@ -27,23 +146,28 @@
totalPage: null, totalPage: null,
searchVal: '', searchVal: '',
isLoading: false, isLoading: false,
workerList: [] masterList: []
} }
}, },
props: {}, props: {},
methods: { methods: {
...mapActions('security', ['getProcessWorkerList']) ...mapActions('security', ['getProcessMasterList'])
}, },
watch: {}, watch: {},
created () { created () {
this.isLoading = true
this.getProcessWorkerList().then(res => {
this.workerList = res.data
this.isLoading = false
})
}, },
mounted () { mounted () {
let b = {}
let a = ['a1', 'a2', 'a3', 'a4', 'a5', 'a6']
a.forEach((v, i) => {
b[v] = echarts.init(document.getElementById(v)) // eslint-disable-line
b[v].setOption(gaugeOption, true)
})
}, },
components: { mList, mListConstruction, mSpin, mNoData } components: { mList, mListConstruction, mSpin, mNoData }
} }
</script> </script>
<style lang="scss" rel="stylesheet/scss">
@import "./servers";
</style>

16
escheduler-ui/src/js/conf/home/pages/monitor/pages/servers/zookeeper.vue

@ -1,10 +1,10 @@
<template> <template>
<m-list-construction :title="$t('Service-Master')"> <m-list-construction :title="'Zookeeper管理'">
<template slot="content"> <template slot="content">
<template v-if="masterList.length"> <template v-if="zookeeperList.length">
<m-list :list="masterList"></m-list> <m-list :list="zookeeperList"></m-list>
</template> </template>
<template v-if="!masterList.length"> <template v-if="!zookeeperList.length">
<m-no-data></m-no-data> <m-no-data></m-no-data>
</template> </template>
<m-spin :is-spin="isLoading" ></m-spin> <m-spin :is-spin="isLoading" ></m-spin>
@ -27,7 +27,7 @@
totalPage: null, totalPage: null,
searchVal: '', searchVal: '',
isLoading: false, isLoading: false,
masterList: [] zookeeperList: []
} }
}, },
props: {}, props: {},
@ -36,11 +36,7 @@
}, },
watch: {}, watch: {},
created () { created () {
this.isLoading = true this.zookeeperList = [{ id: 1 }, { id: 1 }, { id: 1 }, { id: 1 }]
this.getProcessMasterList().then(res => {
this.masterList = res.data
this.isLoading = false
})
}, },
mounted () { mounted () {
}, },

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

@ -3,7 +3,7 @@
<div class="clearfix input-element"> <div class="clearfix input-element">
<span class="tag-wrapper" v-for="(item,$index) in activeList" :class="activeIndex === $index ? 'active' : ''"> <span class="tag-wrapper" v-for="(item,$index) in activeList" :class="activeIndex === $index ? 'active' : ''">
<span class="tag-text">{{item}}</span> <span class="tag-text">{{item}}</span>
<i class="remove-tag ans-icon-close" @click="_del($index)"></i> <i class="remove-tag ans-icon-close" @click.stop="_del($index)"></i>
</span> </span>
<x-poptip <x-poptip
placement="bottom-start" placement="bottom-start"
@ -15,7 +15,7 @@
<div class="ans-scroller" style=" max-height: 300px;"> <div class="ans-scroller" style=" max-height: 300px;">
<div class="scroll-area-wrapper scroll-transition"> <div class="scroll-area-wrapper scroll-transition">
<ul class="dropdown-container"> <ul class="dropdown-container">
<li class="ans-option" v-for="(item,$index) in emailList" @click="_selectEmail($index + 1)"> <li class="ans-option" v-for="(item,$index) in emailList" @click.stop="_selectEmail($index + 1)">
<span class="default-option-class" :class="index === ($index + 1) ? 'active' : ''">{{item}}</span> <span class="default-option-class" :class="index === ($index + 1) ? 'active' : ''">{{item}}</span>
</li> </li>
</ul> </ul>
@ -212,7 +212,7 @@
*/ */
_handlerEmailWitch () { _handlerEmailWitch () {
setTimeout(() => { setTimeout(() => {
this.emailWidth = parseInt(688 - $(this.$refs.emailInput).position().left - 20) this.emailWidth = parseInt($('.email-model').width() - $(this.$refs.emailInput).position().left - 20)
if (this.emailWidth < 80) { if (this.emailWidth < 80) {
this.emailWidth = 200 this.emailWidth = 200
} }
@ -274,7 +274,7 @@
<style lang="scss" rel="stylesheet/scss"> <style lang="scss" rel="stylesheet/scss">
.email-model { .email-model {
width: 688px; width: 100%;
.input-element { .input-element {
min-height: 32px; min-height: 32px;
padding: 1px 8px; padding: 1px 8px;

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

@ -83,7 +83,7 @@
<div class="text"> <div class="text">
{{$t('Recipient')}} {{$t('Recipient')}}
</div> </div>
<div class="cont"> <div class="cont" style="width: 688px;">
<m-email v-model="receivers" :repeat-data="receiversCc"></m-email> <m-email v-model="receivers" :repeat-data="receiversCc"></m-email>
</div> </div>
</div> </div>
@ -91,7 +91,7 @@
<div class="text"> <div class="text">
{{$t('Cc')}} {{$t('Cc')}}
</div> </div>
<div class="cont"> <div class="cont" style="width: 688px;">
<m-email v-model="receiversCc" :repeat-data="receivers"></m-email> <m-email v-model="receiversCc" :repeat-data="receivers"></m-email>
</div> </div>
</div> </div>

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

@ -7,7 +7,7 @@
:panel-num="2" :panel-num="2"
placement="bottom-end" placement="bottom-end"
@on-change="_datepicker" @on-change="_datepicker"
:value="scheduleTime" :value="[searchParams.startDate,searchParams.endDate]"
type="daterange" type="daterange"
:placeholder="$t('Select date range')" :placeholder="$t('Select date range')"
format="YYYY-MM-DD HH:mm:ss"> format="YYYY-MM-DD HH:mm:ss">
@ -30,7 +30,7 @@
<th>{{$t('Number')}}</th> <th>{{$t('Number')}}</th>
<th>{{$t('State')}}</th> <th>{{$t('State')}}</th>
</tr> </tr>
<tr v-for="(item,$index) in taskCountDtosList"> <tr v-for="(item,$index) in taskCtatusList">
<td><span>{{$index+1}}</span></td> <td><span>{{$index+1}}</span></td>
<td> <td>
<span> <span>
@ -60,7 +60,65 @@
<th>{{$t('Number')}}</th> <th>{{$t('Number')}}</th>
<th>{{$t('State')}}</th> <th>{{$t('State')}}</th>
</tr> </tr>
<tr v-for="(item,$index) in processStateCountList"> <tr v-for="(item,$index) in processStateList">
<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 class="ellipsis" style="width: 98%;" :title="item.key">{{item.key}}</span></td>
</tr>
</table>
</div>
</div>
</div>
</div>
</div>
<div class="row" style="padding-top: 20px;">
<div class="col-md-6">
<div class="chart-title">
<span>命令状态统计</span>
</div>
<div class="row">
<div class="col-md-7">
<div id="command-state-pie" style="height:260px;margin-top: 100px;"></div>
</div>
<div class="col-md-5">
<div class="table-small-model">
<table>
<tr>
<th width="40">{{$t('#')}}</th>
<th>{{$t('Number')}}</th>
<th>{{$t('State')}}</th>
</tr>
<tr v-for="(item,$index) in taskCtatusList">
<td><span>{{$index+1}}</span></td>
<td>
<span>
<a href="javascript:" @click="id && _goTask(item.key)" :class="id ?'links':''">{{item.value}}</a>
</span>
</td>
<td><span class="ellipsis" style="width: 98%;" :title="item.key">{{item.key}}</span></td>
</tr>
</table>
</div>
</div>
</div>
</div>
<div class="col-md-6">
<div class="chart-title">
<span>队列统计</span>
</div>
<div class="row">
<div class="col-md-7">
<div id="process-state-pie" style="height:260px;margin-top: 100px;"></div>
</div>
<div class="col-md-5">
<div class="table-small-model">
<table>
<tr>
<th width="40">{{$t('#')}}</th>
<th>{{$t('Number')}}</th>
<th>{{$t('State')}}</th>
</tr>
<tr v-for="(item,$index) in processStateList">
<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 class="ellipsis" style="width: 98%;" :title="item.key">{{item.key}}</span></td> <td><span class="ellipsis" style="width: 98%;" :title="item.key">{{item.key}}</span></td>
@ -93,32 +151,37 @@
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/_source/instanceConditions/common'
import Chart from '~/@analysys/ana-charts' import Chart from '~/@analysys/ana-charts'
import mNoData from '@/module/components/noData/noData'
import mSpin from '@/module/components/spin/spin' import mSpin from '@/module/components/spin/spin'
import mNoData from '@/module/components/noData/noData'
import { stateType } from '@/conf/home/pages/projects/pages/_source/instanceConditions/common'
export default { export default {
name: 'perject-chart', name: 'perject-chart',
data () { data () {
return { return {
taskCountDtosList: [], isLoading: true,
processStateCountList: [], taskCtatusList: [],
userList: [], processStateList: [],
scheduleTime: ['2018-11-16 00:00:00', '2018-11-16 17:13:11'], defineUserList: [],
isLoading: true commandStateList: [],
searchParams: {
projectId: this.id,
startDate: '',
endDate: ''
}
} }
}, },
props: { props: {
id: Number id: Number
}, },
methods: { methods: {
...mapActions('projects', ['getTaskCtatusCount', 'getProcessStateCount', 'getDefineUserCount']), ...mapActions('projects', ['getTaskCtatusCount', 'getProcessStateCount', 'getDefineUserCount', 'getCommandStateCount', 'getQueueCount']),
_datepicker (val) { _datepicker (val) {
this.scheduleTime = val this.searchParams.startDate = val[0]
this._stateTypePie() this.searchParams.endDate = val[1]
this._processStatePie() this._getData(false)
}, },
_goTask (name) { _goTask (name) {
this.$router.push({ this.$router.push({
@ -140,22 +203,17 @@
} }
}) })
}, },
_stateTypePie () {
this.taskCountDtosList = [] _handleTaskCtatus (res) {
this.getTaskCtatusCount({
projectId: this.id,
startDate: this.scheduleTime[0],
endDate: this.scheduleTime[1]
}).then(res => {
let data = res.data.taskCountDtos let data = res.data.taskCountDtos
this.taskCountDtosList = _.map(data, v => { this.taskCtatusList = _.map(data, v => {
return { return {
key: _.find(stateType, ['code', v.taskStateType])['label'], key: _.find(stateType, ['code', v.taskStateType])['label'],
value: v.count, value: v.count,
type: 'type' type: 'type'
} }
}) })
const myChart = Chart.pie('#task-status-pie', this.taskCountDtosList, { title: '' }) const myChart = Chart.pie('#task-status-pie', this.taskCtatusList, { title: '' })
myChart.echart.setOption(pie) myChart.echart.setOption(pie)
// //
@ -164,23 +222,16 @@
this._goTask(e.data.name) this._goTask(e.data.name)
}) })
} }
}).catch(e => {})
}, },
_processStatePie () { _handleProcessState (res) {
this.processStateCountList = []
this.getProcessStateCount({
projectId: this.id,
startDate: this.scheduleTime[0],
endDate: this.scheduleTime[1]
}).then(res => {
let data = res.data.taskCountDtos let data = res.data.taskCountDtos
this.processStateCountList = _.map(data, v => { this.processStateList = _.map(data, v => {
return { return {
key: _.find(stateType, ['code', v.taskStateType])['label'], key: _.find(stateType, ['code', v.taskStateType])['label'],
value: v.count value: v.count
} }
}) })
const myChart = Chart.pie('#process-state-pie', this.processStateCountList, { title: '' }) const myChart = Chart.pie('#process-state-pie', this.processStateList, { title: '' })
myChart.echart.setOption(pie) myChart.echart.setOption(pie)
// //
if (this.id) { if (this.id) {
@ -188,20 +239,16 @@
this._goProcess(e.data.name) this._goProcess(e.data.name)
}) })
} }
}).catch(e => {})
}, },
_processDefinitionBar () { _handleDefineUser (res) {
this.getDefineUserCount({
projectId: this.id
}).then(res => {
let data = res.data.userList let data = res.data.userList
this.userList = _.map(data, v => { this.defineUserList = _.map(data, v => {
return { return {
key: v.userName + ',' + v.userId + ',' + v.count, key: v.userName + ',' + v.userId + ',' + v.count,
value: v.count value: v.count
} }
}) })
const myChart = Chart.bar('#process-definition-bar', this.userList, {}) const myChart = Chart.bar('#process-definition-bar', this.defineUserList, {})
myChart.echart.setOption(bar) myChart.echart.setOption(bar)
// //
if (this.id) { if (this.id) {
@ -214,25 +261,49 @@
}) })
}) })
} }
}).catch(e => {})
}
}, },
watch: { _handleCommandState (res) {
}, },
created () { _handleQueue () {},
this.scheduleTime = [dayjs().format('YYYY-MM-DD 00:00:00'), dayjs().format('YYYY-MM-DD HH:mm:ss')]
_getData (is = true) {
this.isLoading = true this.isLoading = true
Promise.all([ let ioList = [
this._stateTypePie(), this.getTaskCtatusCount(this.searchParams),
this._processStatePie(), this.getProcessStateCount(this.searchParams),
this._processDefinitionBar() this.getCommandStateCount(this.searchParams),
]).then(res => { this.getQueueCount(this.searchParams)
]
if (is) {
ioList.push(this.getDefineUserCount(_.pick(this.searchParams, ['projectId'])))
}
Promise.all(ioList).then(res => {
this._handleTaskCtatus(res[0])
this._handleProcessState(res[1])
this._handleCommandState(res[2])
this._handleQueue(res[3])
if (is) {
this._handleDefineUser(res[4])
}
setTimeout(() => { setTimeout(() => {
this.isLoading = false this.isLoading = false
}, 800) }, 800)
}).catch(e => { }).catch(e => {
console.log(e)
this.isLoading = false this.isLoading = false
}) })
}
},
watch: {
},
created () {
this.searchParams.startDate = dayjs().format('YYYY-MM-DD 00:00:00')
this.searchParams.endDate = dayjs().format('YYYY-MM-DD HH:mm:ss')
// init get data
this._getData()
}, },
mounted () { mounted () {

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

@ -80,7 +80,6 @@
<script> <script>
import { mapActions } from 'vuex' import { mapActions } from 'vuex'
import '@/module/filter/formatDate' import '@/module/filter/formatDate'
import { findComponentDownward } from '@/module/util/'
export default { export default {
name: 'tenement-list', name: 'tenement-list',
@ -112,7 +111,7 @@
}) })
}, },
_edit (item) { _edit (item) {
findComponentDownward(this.$root, 'queue-index')._create(item) this.$emit('on-edit', item)
} }
}, },
watch: { watch: {

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

@ -9,7 +9,12 @@
</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="searchParams.pageNo" :page-size="searchParams.pageSize"></m-list> <m-list @on-edit="_onEdit"
:queue-list="queueList"
:page-no="searchParams.pageNo"
:page-size="searchParams.pageSize">
</m-list>
<div class="page-box"> <div class="page-box">
<x-page :current="parseInt(searchParams.pageNo)" :total="total" :page-size="searchParams.pageSize" 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>
@ -60,6 +65,9 @@
_page (val) { _page (val) {
this.searchParams.pageNo = val this.searchParams.pageNo = val
}, },
_onEdit (item) {
this._create(item)
},
_create (item) { _create (item) {
let self = this let self = this
let modal = this.$modal.dialog({ let modal = this.$modal.dialog({

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

@ -86,7 +86,6 @@
<script> <script>
import { mapActions } from 'vuex' import { mapActions } from 'vuex'
import '@/module/filter/formatDate' import '@/module/filter/formatDate'
import { findComponentDownward } from '@/module/util/'
export default { export default {
name: 'tenement-list', name: 'tenement-list',
@ -118,7 +117,7 @@
}) })
}, },
_edit (item) { _edit (item) {
findComponentDownward(this.$root, 'tenement-index')._create(item) this.$emit('on-edit', item)
} }
}, },
watch: { watch: {

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

@ -9,7 +9,12 @@
</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="searchParams.pageNo" :page-size="searchParams.pageSize"></m-list> <m-list @on-edit="_onEdit"
:tenement-list="tenementList"
:page-no="searchParams.pageNo"
:page-size="searchParams.pageSize">
</m-list>
<div class="page-box"> <div class="page-box">
<x-page :current="parseInt(searchParams.pageNo)" :total="total" :page-size="searchParams.pageSize" 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>
@ -60,6 +65,9 @@
_page (val) { _page (val) {
this.searchParams.pageNo = val this.searchParams.pageNo = val
}, },
_onEdit (item) {
this._create(item)
},
_create (item) { _create (item) {
let self = this let self = this
let modal = this.$modal.dialog({ let modal = this.$modal.dialog({

39
escheduler-ui/src/js/conf/home/pages/security/pages/token/index.vue

@ -0,0 +1,39 @@
<template>
<m-token></m-token>
</template>
<script>
import mToken from '@/conf/home/pages/user/pages/token'
export default {
name: 'token-index',
data () {
return {}
},
props: {},
methods: {},
watch: {},
beforeCreate () {
},
created () {
},
beforeMount () {
},
mounted () {
},
beforeUpdate () {
},
updated () {
},
beforeDestroy () {
},
destroyed () {
},
computed: {},
components: { mToken }
}
</script>
<style lang="scss" rel="stylesheet/scss">
.index-model {
}
</style>

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

@ -99,7 +99,6 @@
import i18n from '@/module/i18n' import i18n from '@/module/i18n'
import { mapActions } from 'vuex' import { mapActions } from 'vuex'
import '@/module/filter/formatDate' import '@/module/filter/formatDate'
import { findComponentDownward } from '@/module/util/'
import mTransfer from '@/module/components/transfer/transfer' import mTransfer from '@/module/components/transfer/transfer'
export default { export default {
@ -132,7 +131,7 @@
}) })
}, },
_edit (item) { _edit (item) {
findComponentDownward(this.$root, 'users-index')._create(item) this.$emit('on-edit', item)
}, },
_authProject (item, i) { _authProject (item, i) {
this.$refs[`poptip-auth-${i}`][0].doClose() this.$refs[`poptip-auth-${i}`][0].doClose()

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

@ -9,7 +9,12 @@
</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="searchParams.pageNo" :page-size="searchParams.pageSize"></m-list> <m-list @on-edit="_onEdit"
:user-list="userList"
:page-no="searchParams.pageNo"
:page-size="searchParams.pageSize">
</m-list>
<div class="page-box"> <div class="page-box">
<x-page :current="parseInt(searchParams.pageNo)" :total="total" :page-size="searchParams.pageSize" 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>
@ -60,6 +65,9 @@
_page (val) { _page (val) {
this.searchParams.pageNo = val this.searchParams.pageNo = val
}, },
_onEdit (item) {
this._create(item)
},
_create (item) { _create (item) {
let self = this let self = this
let modal = this.$modal.dialog({ let modal = this.$modal.dialog({

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

@ -72,7 +72,6 @@
import i18n from '@/module/i18n' import i18n from '@/module/i18n'
import { mapActions } from 'vuex' import { mapActions } from 'vuex'
import '@/module/filter/formatDate' import '@/module/filter/formatDate'
import { findComponentDownward } from '@/module/util/'
import mTransfer from '@/module/components/transfer/transfer' import mTransfer from '@/module/components/transfer/transfer'
export default { export default {
@ -105,7 +104,7 @@
}) })
}, },
_edit (item) { _edit (item) {
findComponentDownward(this.$root, 'warning-groups-index')._create(item) this.$emit('on-edit', item)
}, },
_mangeUser (item, i) { _mangeUser (item, i) {
this.getAuthList({ this.getAuthList({

10
escheduler-ui/src/js/conf/home/pages/security/pages/warningGroups/index.vue

@ -9,7 +9,12 @@
</template> </template>
<template slot="content"> <template slot="content">
<template v-if="alertgroupList.length"> <template v-if="alertgroupList.length">
<m-list :alertgroup-list="alertgroupList" :page-no="searchParams.pageNo" :page-size="searchParams.pageSize"></m-list> <m-list @on-edit="_onEdit"
:alertgroup-list="alertgroupList"
:page-no="searchParams.pageNo"
:page-size="searchParams.pageSize">
</m-list>
<div class="page-box"> <div class="page-box">
<x-page :current="parseInt(searchParams.pageNo)" :total="total" :page-size="searchParams.pageSize" 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>
@ -60,6 +65,9 @@
_page (val) { _page (val) {
this.searchParams.pageNo = val this.searchParams.pageNo = val
}, },
_onEdit (item) {
this._create(item)
},
_create (item) { _create (item) {
let self = this let self = this
let modal = this.$modal.dialog({ let modal = this.$modal.dialog({

3
escheduler-ui/src/js/conf/home/pages/security/pages/workerGroups/_source/list.vue

@ -66,7 +66,6 @@
// import i18n from '@/module/i18n' // import i18n from '@/module/i18n'
import { mapActions } from 'vuex' import { mapActions } from 'vuex'
import '@/module/filter/formatDate' import '@/module/filter/formatDate'
import { findComponentDownward } from '@/module/util/'
export default { export default {
name: 'user-list', name: 'user-list',
@ -98,7 +97,7 @@
}) })
}, },
_edit (item) { _edit (item) {
findComponentDownward(this.$root, 'worker-groups-index')._create(item) this.$emit('on-edit', item)
} }
}, },
watch: { watch: {

9
escheduler-ui/src/js/conf/home/pages/security/pages/workerGroups/index.vue

@ -9,7 +9,11 @@
</template> </template>
<template slot="content"> <template slot="content">
<template v-if="workerGroupList.length"> <template v-if="workerGroupList.length">
<m-list :worker-group-list="workerGroupList" :page-no="searchParams.pageNo" :page-size="searchParams.pageSize"></m-list> <m-list @on-edit="_onEdit"
:worker-group-list="workerGroupList"
:page-no="searchParams.pageNo"
:page-size="searchParams.pageSize">
</m-list>
<div class="page-box"> <div class="page-box">
<x-page :current="parseInt(searchParams.pageNo)" :total="total" :page-size="searchParams.pageSize" 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>
@ -60,6 +64,9 @@
_page (val) { _page (val) {
this.searchParams.pageNo = val this.searchParams.pageNo = val
}, },
_onEdit (item) {
this._create(item)
},
_create (item) { _create (item) {
let self = this let self = this
let modal = this.$modal.dialog({ let modal = this.$modal.dialog({

19
escheduler-ui/src/js/conf/home/pages/user/pages/token/_source/createToken.vue

@ -18,7 +18,7 @@
</x-datepicker> </x-datepicker>
</template> </template>
</m-list-box-f> </m-list-box-f>
<m-list-box-f> <m-list-box-f v-if="auth">
<template slot="name"><b>*</b>用户</template> <template slot="name"><b>*</b>用户</template>
<template slot="content"> <template slot="content">
<x-select v-model="userId" @on-change="_onChange"> <x-select v-model="userId" @on-change="_onChange">
@ -53,6 +53,7 @@
import dayjs from 'dayjs' import dayjs from 'dayjs'
// import i18n from '@/module/i18n' // import i18n from '@/module/i18n'
import store from '@/conf/home/store' import store from '@/conf/home/store'
import Permissions from '@/module/permissions'
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'
@ -66,7 +67,8 @@
disabledDate: date => (date.getTime() - new Date(new Date().getTime() - 24 * 60 * 60 * 1000)) < 0, disabledDate: date => (date.getTime() - new Date(new Date().getTime() - 24 * 60 * 60 * 1000)) < 0,
token: '', token: '',
userIdList: [], userIdList: [],
tokenLoading: false tokenLoading: false,
auth: !Permissions.getAuth()
} }
}, },
props: { props: {
@ -128,16 +130,23 @@
}, },
watch: {}, watch: {},
created () { created () {
this.store.dispatch(`security/getUsersList`).then(res => { const d = (userId) => {
this.userIdList = _.map(res, v => _.pick(v, ['id', 'userName']))
if (this.item) { if (this.item) {
this.expireTime = this.item.expireTime this.expireTime = this.item.expireTime
this.userId = this.item.userId this.userId = this.item.userId
this.token = this.item.token this.token = this.item.token
} else { } else {
this.userId = this.userIdList[0].id this.userId = userId
}
} }
if (this.auth) {
this.store.dispatch(`security/getUsersList`).then(res => {
this.userIdList = _.map(res, v => _.pick(v, ['id', 'userName']))
d(this.userIdList[0].id)
}) })
} else {
d(this.store.state.user.userInfo.id)
}
}, },
mounted () { mounted () {
}, },

3
escheduler-ui/src/js/conf/home/pages/user/pages/token/_source/list.vue

@ -72,7 +72,6 @@
<script> <script>
import { mapActions } from 'vuex' import { mapActions } from 'vuex'
import '@/module/filter/formatDate' import '@/module/filter/formatDate'
import { findComponentDownward } from '@/module/util/'
export default { export default {
name: 'token-list', name: 'token-list',
@ -104,7 +103,7 @@
}) })
}, },
_edit (item) { _edit (item) {
findComponentDownward(this.$root, 'token-index')._create(item) this.$emit('on-edit', item)
} }
}, },
watch: { watch: {

10
escheduler-ui/src/js/conf/home/pages/user/pages/token/index.vue

@ -9,7 +9,12 @@
</template> </template>
<template slot="content"> <template slot="content">
<template v-if="tokenList.length"> <template v-if="tokenList.length">
<m-list :token-list="tokenList" :page-no="searchParams.pageNo" :page-size="searchParams.pageSize"></m-list> <m-list @on-edit="_onEdit"
:token-list="tokenList"
:page-no="searchParams.pageNo"
:page-size="searchParams.pageSize">
</m-list>
<div class="page-box"> <div class="page-box">
<x-page :current="parseInt(searchParams.pageNo)" :total="total" :page-size="searchParams.pageSize" 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>
@ -61,6 +66,9 @@
_page (val) { _page (val) {
this.searchParams.pageNo = val this.searchParams.pageNo = val
}, },
_onEdit (item) {
this._create(item)
},
_create (item) { _create (item) {
let self = this let self = this
let modal = this.$modal.dialog({ let modal = this.$modal.dialog({

8
escheduler-ui/src/js/conf/home/router/index.js

@ -325,6 +325,14 @@ const router = new Router({
meta: { meta: {
title: `workerGroups` title: `workerGroups`
} }
},
{
path: '/security/token',
name: 'token-manage',
component: resolve => require(['../pages/security/pages/token/index'], resolve),
meta: {
title: `token`
}
} }
] ]
}, },

24
escheduler-ui/src/js/conf/home/store/projects/actions.js

@ -78,6 +78,30 @@ export default {
}) })
}) })
}, },
/**
* get command state count
*/
getCommandStateCount ({ state }, payload) {
return new Promise((resolve, reject) => {
io.get(`projects/analysis/command-state-count`, payload, res => {
resolve(res)
}).catch(e => {
reject(e)
})
})
},
/**
* get command state count
*/
getQueueCount ({ state }, payload) {
return new Promise((resolve, reject) => {
io.get(`projects/analysis/queue-count`, payload, res => {
resolve(res)
}).catch(e => {
reject(e)
})
})
},
/** /**
* Process status statistics * Process status statistics
*/ */

2
escheduler-ui/src/js/conf/home/store/security/actions.js

@ -435,7 +435,7 @@ export default {
let list = res.data let list = res.data
list.unshift({ list.unshift({
id: -1, id: -1,
name: 'All' name: 'Default'
}) })
state.workerGroupsListAll = list state.workerGroupsListAll = list
resolve(list) resolve(list)

11
escheduler-ui/src/js/module/components/secondaryMenu/_source/menu.js

@ -117,6 +117,15 @@ let menu = {
disabled: true, disabled: true,
icon: 'fa-address-book', icon: 'fa-address-book',
children: [] children: []
},
{
name: `令牌管理`,
id: 2,
path: 'token-manage',
isOpen: true,
icon: 'fa-file-text',
children: [],
disabled: true
} }
], ],
resource: [ resource: [
@ -178,7 +187,7 @@ let menu = {
isOpen: true, isOpen: true,
icon: 'fa-file-text', icon: 'fa-file-text',
children: [], children: [],
disabled: !Permissions.getAuth() disabled: Permissions.getAuth()
} }
], ],
monitor: [ monitor: [

Loading…
Cancel
Save