gongzijian
6 years ago
18 changed files with 599 additions and 126 deletions
@ -0,0 +1,46 @@ |
|||||||
|
<template> |
||||||
|
<x-select |
||||||
|
@on-change="_onChange" |
||||||
|
v-model="value" |
||||||
|
style="width: 180px"> |
||||||
|
<x-option |
||||||
|
v-for="item in workerGroupsList" |
||||||
|
:key="item.id" |
||||||
|
:value="item.id" |
||||||
|
:label="item.name"> |
||||||
|
</x-option> |
||||||
|
</x-select> |
||||||
|
</template> |
||||||
|
<script> |
||||||
|
import disabledState from '@/module/mixin/disabledState' |
||||||
|
export default { |
||||||
|
name: 'form-worker-group', |
||||||
|
data () { |
||||||
|
return { |
||||||
|
workerGroupsList: [] |
||||||
|
} |
||||||
|
}, |
||||||
|
mixins: [disabledState], |
||||||
|
props: { |
||||||
|
value: Number |
||||||
|
}, |
||||||
|
model: { |
||||||
|
prop: 'value', |
||||||
|
event: 'workerGroupsEvent' |
||||||
|
}, |
||||||
|
methods: { |
||||||
|
_onChange (o) { |
||||||
|
this.value = o.value |
||||||
|
this.$emit('workerGroupsEvent', o.value) |
||||||
|
} |
||||||
|
}, |
||||||
|
watch: { |
||||||
|
}, |
||||||
|
created () { |
||||||
|
this.workerGroupsList = this.store.state.security.workerGroupsListAll || [] |
||||||
|
if (!this.value) { |
||||||
|
this.$emit('workerGroupsEvent', this.workerGroupsList[0].id) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
</script> |
@ -0,0 +1,109 @@ |
|||||||
|
.form-model-model { |
||||||
|
width: 720px; |
||||||
|
position: relative; |
||||||
|
.title-box { |
||||||
|
height: 61px; |
||||||
|
border-bottom: 1px solid #DCDEDC; |
||||||
|
position: relative; |
||||||
|
.name { |
||||||
|
position: absolute; |
||||||
|
left: 24px; |
||||||
|
top: 18px; |
||||||
|
font-size: 16px; |
||||||
|
} |
||||||
|
.go-subtask { |
||||||
|
position: absolute; |
||||||
|
right: 30px; |
||||||
|
top: 17px; |
||||||
|
a { |
||||||
|
font-size: 14px; |
||||||
|
color: #0097e0; |
||||||
|
margin-left: 10px; |
||||||
|
i.iconfont { |
||||||
|
font-size: 18px; |
||||||
|
vertical-align: middle; |
||||||
|
} |
||||||
|
em { |
||||||
|
color: #333; |
||||||
|
vertical-align: middle; |
||||||
|
font-style: normal; |
||||||
|
vertical-align: middle; |
||||||
|
padding-left: 2px; |
||||||
|
} |
||||||
|
&:hover { |
||||||
|
em { |
||||||
|
text-decoration: underline; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
.bottom-box { |
||||||
|
position: absolute; |
||||||
|
bottom: 0; |
||||||
|
left: 0; |
||||||
|
width: 100%; |
||||||
|
text-align: right; |
||||||
|
height: 60px; |
||||||
|
line-height: 60px; |
||||||
|
border-top: 1px solid #DCDEDC; |
||||||
|
background: #fff; |
||||||
|
.submit { |
||||||
|
padding-right: 20px; |
||||||
|
position: relative; |
||||||
|
z-index: 9; |
||||||
|
} |
||||||
|
} |
||||||
|
.content-box { |
||||||
|
overflow-y: scroll; |
||||||
|
height: calc(100vh - 61px); |
||||||
|
padding-bottom: 60px; |
||||||
|
} |
||||||
|
} |
||||||
|
.from-model { |
||||||
|
padding-top: 26px; |
||||||
|
>div { |
||||||
|
clear: both; |
||||||
|
} |
||||||
|
.list { |
||||||
|
position: relative; |
||||||
|
margin-bottom: 10px; |
||||||
|
.text-box { |
||||||
|
width: 112px; |
||||||
|
float: left; |
||||||
|
text-align: right; |
||||||
|
margin-right: 8px; |
||||||
|
>span { |
||||||
|
font-size: 14px; |
||||||
|
color: #777; |
||||||
|
display: inline-block; |
||||||
|
padding-top: 6px; |
||||||
|
} |
||||||
|
} |
||||||
|
.cont-box { |
||||||
|
width: 580px; |
||||||
|
float: left; |
||||||
|
.label-box { |
||||||
|
width: 100%; |
||||||
|
} |
||||||
|
.text-b { |
||||||
|
font-size: 14px; |
||||||
|
color: #777; |
||||||
|
display: inline-block; |
||||||
|
padding:0 6px 0 20px; |
||||||
|
} |
||||||
|
} |
||||||
|
.add { |
||||||
|
line-height: 32px; |
||||||
|
a { |
||||||
|
color: #0097e0; |
||||||
|
} |
||||||
|
} |
||||||
|
&:hover { |
||||||
|
} |
||||||
|
.list-t { |
||||||
|
width: 50%; |
||||||
|
float: left; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,118 @@ |
|||||||
|
<template> |
||||||
|
<m-popup |
||||||
|
ref="popup" |
||||||
|
:ok-text="item ? $t('Edit') : $t('Submit')" |
||||||
|
:nameText="item ? '编辑Worker分组' : '创建Worker分组'" |
||||||
|
@ok="_ok"> |
||||||
|
<template slot="content"> |
||||||
|
<div class="create-worker-model"> |
||||||
|
<m-list-box-f> |
||||||
|
<template slot="name"><b>*</b>{{$t('Group Name')}}</template> |
||||||
|
<template slot="content"> |
||||||
|
<x-input |
||||||
|
type="input" |
||||||
|
v-model="name" |
||||||
|
:placeholder="$t('Please enter group name')"> |
||||||
|
</x-input> |
||||||
|
</template> |
||||||
|
</m-list-box-f> |
||||||
|
<m-list-box-f> |
||||||
|
<template slot="name">IP</template> |
||||||
|
<template slot="content"> |
||||||
|
<x-input |
||||||
|
:autosize="{ minRows: 4, maxRows: 6 }" |
||||||
|
type="textarea" |
||||||
|
v-model="ipList" |
||||||
|
:placeholder="'请输入IP地址多个用逗号隔开'"> |
||||||
|
</x-input> |
||||||
|
<div class="ipt-tip"> |
||||||
|
<span>注意:多个IP地址已逗号分割</span> |
||||||
|
</div> |
||||||
|
</template> |
||||||
|
</m-list-box-f> |
||||||
|
</div> |
||||||
|
</template> |
||||||
|
</m-popup> |
||||||
|
</template> |
||||||
|
<script> |
||||||
|
import i18n from '@/module/i18n' |
||||||
|
import store from '@/conf/home/store' |
||||||
|
import mPopup from '@/module/components/popup/popup' |
||||||
|
import mListBoxF from '@/module/components/listBoxF/listBoxF' |
||||||
|
|
||||||
|
export default { |
||||||
|
name: 'create-warning', |
||||||
|
data () { |
||||||
|
return { |
||||||
|
store, |
||||||
|
id: 0, |
||||||
|
name: '', |
||||||
|
ipList: '' |
||||||
|
} |
||||||
|
}, |
||||||
|
props: { |
||||||
|
item: Object |
||||||
|
}, |
||||||
|
methods: { |
||||||
|
_ok () { |
||||||
|
if (this._verification()) { |
||||||
|
// Verify username |
||||||
|
this._submit() |
||||||
|
} |
||||||
|
}, |
||||||
|
_verification () { |
||||||
|
// group name |
||||||
|
if (!this.name) { |
||||||
|
this.$message.warning(`${i18n.$t('Please enter group name')}`) |
||||||
|
return false |
||||||
|
} |
||||||
|
if (!this.ipList) { |
||||||
|
this.$message.warning(`IP地址不能为空`) |
||||||
|
return false |
||||||
|
} |
||||||
|
return true |
||||||
|
}, |
||||||
|
_submit () { |
||||||
|
let param = { |
||||||
|
id: this.id, |
||||||
|
name: this.name, |
||||||
|
ipList: this.ipList |
||||||
|
} |
||||||
|
if (this.item) { |
||||||
|
param.id = this.item.id |
||||||
|
} |
||||||
|
this.$refs['popup'].spinnerLoading = true |
||||||
|
this.store.dispatch(`security/saveWorkerGroups`, param).then(res => { |
||||||
|
this.$emit('onUpdate') |
||||||
|
this.$message.success(res.msg) |
||||||
|
setTimeout(() => { |
||||||
|
this.$refs['popup'].spinnerLoading = false |
||||||
|
}, 800) |
||||||
|
}).catch(e => { |
||||||
|
this.$message.error(e.msg || '') |
||||||
|
this.$refs['popup'].spinnerLoading = false |
||||||
|
}) |
||||||
|
} |
||||||
|
}, |
||||||
|
watch: {}, |
||||||
|
created () { |
||||||
|
if (this.item) { |
||||||
|
this.id = this.item.id |
||||||
|
this.name = this.item.name |
||||||
|
this.ipList = this.item.ipList |
||||||
|
} |
||||||
|
}, |
||||||
|
mounted () { |
||||||
|
}, |
||||||
|
components: { mPopup, mListBoxF } |
||||||
|
} |
||||||
|
</script> |
||||||
|
<style lang="scss" rel="stylesheet/scss"> |
||||||
|
.create-worker-model { |
||||||
|
.ipt-tip { |
||||||
|
color: #999; |
||||||
|
padding-top: 4px; |
||||||
|
display: block; |
||||||
|
} |
||||||
|
} |
||||||
|
</style> |
@ -0,0 +1,119 @@ |
|||||||
|
<template> |
||||||
|
<div class="list-model"> |
||||||
|
<div class="table-box"> |
||||||
|
<table> |
||||||
|
<tr> |
||||||
|
<th> |
||||||
|
<span>{{$t('#')}}</span> |
||||||
|
</th> |
||||||
|
<th> |
||||||
|
<span>分组名称</span> |
||||||
|
</th> |
||||||
|
<th> |
||||||
|
<span>IPList</span> |
||||||
|
</th> |
||||||
|
<th> |
||||||
|
<span>{{$t('Create Time')}}</span> |
||||||
|
</th> |
||||||
|
<th> |
||||||
|
<span>{{$t('Update Time')}}</span> |
||||||
|
</th> |
||||||
|
<th width="70"> |
||||||
|
<span>{{$t('Operation')}}</span> |
||||||
|
</th> |
||||||
|
</tr> |
||||||
|
<tr v-for="(item, $index) in list" :key="$index"> |
||||||
|
<td> |
||||||
|
<span>{{parseInt(pageNo === 1 ? ($index + 1) : (($index + 1) + (pageSize * (pageNo - 1))))}}</span> |
||||||
|
</td> |
||||||
|
<td> |
||||||
|
<span> |
||||||
|
<a href="javascript:" class="links">{{item.name}}</a> |
||||||
|
</span> |
||||||
|
</td> |
||||||
|
<td> |
||||||
|
<span>{{item.ipList}}</span> |
||||||
|
</td> |
||||||
|
<td> |
||||||
|
<span>{{item.createTime | formatDate}}</span> |
||||||
|
</td> |
||||||
|
<td><span>{{item.updateTime | formatDate}}</span></td> |
||||||
|
<td> |
||||||
|
<x-button type="info" shape="circle" size="xsmall" data-toggle="tooltip" icon="iconfont icon-bianjixiugai" :title="$t('Edit')" @click="_edit(item)"> |
||||||
|
</x-button> |
||||||
|
<x-poptip |
||||||
|
:ref="'poptip-delete-' + $index" |
||||||
|
placement="bottom-end" |
||||||
|
width="90"> |
||||||
|
<p>{{$t('Delete?')}}</p> |
||||||
|
<div style="text-align: right; margin: 0;padding-top: 4px;"> |
||||||
|
<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('Confirm')}}</x-button> |
||||||
|
</div> |
||||||
|
<template slot="reference"> |
||||||
|
<x-button type="error" shape="circle" size="xsmall" data-toggle="tooltip" icon="iconfont icon-shanchu" :title="$t('delete')"> |
||||||
|
</x-button> |
||||||
|
</template> |
||||||
|
</x-poptip> |
||||||
|
</td> |
||||||
|
</tr> |
||||||
|
</table> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</template> |
||||||
|
<script> |
||||||
|
// import _ from 'lodash' |
||||||
|
// import i18n from '@/module/i18n' |
||||||
|
import { mapActions } from 'vuex' |
||||||
|
import '@/module/filter/formatDate' |
||||||
|
import { findComponentDownward } from '@/module/util/' |
||||||
|
|
||||||
|
export default { |
||||||
|
name: 'user-list', |
||||||
|
data () { |
||||||
|
return { |
||||||
|
list: [] |
||||||
|
} |
||||||
|
}, |
||||||
|
props: { |
||||||
|
workerGroupList: Array, |
||||||
|
pageNo: Number, |
||||||
|
pageSize: Number |
||||||
|
}, |
||||||
|
methods: { |
||||||
|
...mapActions('security', ['deleteWorkerGroups']), |
||||||
|
_closeDelete (i) { |
||||||
|
this.$refs[`poptip-delete-${i}`][0].doClose() |
||||||
|
}, |
||||||
|
_delete (item, i) { |
||||||
|
this.deleteWorkerGroups({ |
||||||
|
id: item.id |
||||||
|
}).then(res => { |
||||||
|
this.$refs[`poptip-delete-${i}`][0].doClose() |
||||||
|
this.list.splice(i, 1) |
||||||
|
this.$message.success(res.msg) |
||||||
|
}).catch(e => { |
||||||
|
this.$refs[`poptip-delete-${i}`][0].doClose() |
||||||
|
this.$message.error(e.msg || '') |
||||||
|
}) |
||||||
|
}, |
||||||
|
_edit (item) { |
||||||
|
findComponentDownward(this.$root, 'worker-groups-index')._create(item) |
||||||
|
} |
||||||
|
}, |
||||||
|
watch: { |
||||||
|
workerGroupList (a) { |
||||||
|
this.list = [] |
||||||
|
setTimeout(() => { |
||||||
|
this.list = a |
||||||
|
}) |
||||||
|
} |
||||||
|
}, |
||||||
|
created () { |
||||||
|
this.list = this.workerGroupList |
||||||
|
}, |
||||||
|
mounted () { |
||||||
|
}, |
||||||
|
components: { } |
||||||
|
} |
||||||
|
</script> |
@ -0,0 +1,114 @@ |
|||||||
|
<template> |
||||||
|
<m-list-construction :title="'worker分组管理'"> |
||||||
|
<template slot="conditions"> |
||||||
|
<m-conditions @on-conditions="_onConditions"> |
||||||
|
<template slot="button-group"> |
||||||
|
<x-button type="ghost" size="small" @click="_create('')">创建worker分组</x-button> |
||||||
|
</template> |
||||||
|
</m-conditions> |
||||||
|
</template> |
||||||
|
<template slot="content"> |
||||||
|
<template v-if="workerGroupList.length"> |
||||||
|
<m-list :worker-group-list="workerGroupList" :page-no="searchParams.pageNo" :page-size="searchParams.pageSize"></m-list> |
||||||
|
<div class="page-box"> |
||||||
|
<x-page :current="parseInt(searchParams.pageNo)" :total="total" :page-size="searchParams.pageSize" show-elevator @on-change="_page"></x-page> |
||||||
|
</div> |
||||||
|
</template> |
||||||
|
<template v-if="!workerGroupList.length"> |
||||||
|
<m-no-data></m-no-data> |
||||||
|
</template> |
||||||
|
<m-spin :is-spin="isLoading"></m-spin> |
||||||
|
</template> |
||||||
|
</m-list-construction> |
||||||
|
</template> |
||||||
|
<script> |
||||||
|
import _ from 'lodash' |
||||||
|
import { mapActions } from 'vuex' |
||||||
|
import mList from './_source/list' |
||||||
|
import mSpin from '@/module/components/spin/spin' |
||||||
|
import mCreateWorker from './_source/createWorker' |
||||||
|
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 { |
||||||
|
name: 'worker-groups-index', |
||||||
|
data () { |
||||||
|
return { |
||||||
|
total: null, |
||||||
|
isLoading: false, |
||||||
|
workerGroupList: [], |
||||||
|
searchParams: { |
||||||
|
pageSize: 10, |
||||||
|
pageNo: 1, |
||||||
|
searchVal: '' |
||||||
|
} |
||||||
|
} |
||||||
|
}, |
||||||
|
mixins: [listUrlParamHandle], |
||||||
|
props: {}, |
||||||
|
methods: { |
||||||
|
...mapActions('security', ['getWorkerGroups']), |
||||||
|
/** |
||||||
|
* Inquire |
||||||
|
*/ |
||||||
|
_onConditions (o) { |
||||||
|
this.searchParams = _.assign(this.searchParams, o) |
||||||
|
this.searchParams.pageNo = 1 |
||||||
|
}, |
||||||
|
_page (val) { |
||||||
|
this.searchParams.pageNo = val |
||||||
|
}, |
||||||
|
_create (item) { |
||||||
|
let self = this |
||||||
|
let modal = this.$modal.dialog({ |
||||||
|
closable: false, |
||||||
|
showMask: true, |
||||||
|
escClose: true, |
||||||
|
className: 'v-modal-custom', |
||||||
|
transitionName: 'opacityp', |
||||||
|
render (h) { |
||||||
|
return h(mCreateWorker, { |
||||||
|
on: { |
||||||
|
onUpdate () { |
||||||
|
self._debounceGET('false') |
||||||
|
modal.remove() |
||||||
|
}, |
||||||
|
close () { |
||||||
|
modal.remove() |
||||||
|
} |
||||||
|
}, |
||||||
|
props: { |
||||||
|
item: item |
||||||
|
} |
||||||
|
}) |
||||||
|
} |
||||||
|
}) |
||||||
|
}, |
||||||
|
_getList (flag) { |
||||||
|
this.isLoading = !flag |
||||||
|
this.getWorkerGroups(this.searchParams).then(res => { |
||||||
|
this.workerGroupList = [] |
||||||
|
this.workerGroupList = res.totalList |
||||||
|
this.total = res.total |
||||||
|
this.isLoading = false |
||||||
|
}).catch(e => { |
||||||
|
this.isLoading = false |
||||||
|
}) |
||||||
|
} |
||||||
|
}, |
||||||
|
watch: { |
||||||
|
// router |
||||||
|
'$route' (a) { |
||||||
|
// url no params get instance list |
||||||
|
this.searchParams.pageNo = _.isEmpty(a.query) ? 1 : a.query.pageNo |
||||||
|
} |
||||||
|
}, |
||||||
|
created () { |
||||||
|
}, |
||||||
|
mounted () { |
||||||
|
}, |
||||||
|
components: { mList, mListConstruction, mConditions, mSpin, mNoData } |
||||||
|
} |
||||||
|
</script> |
Loading…
Reference in new issue