Commit 48195e22 authored by 薛智杰's avatar 薛智杰

Merge branch 'kewei' into 'master'

pipeline 功能修改



See merge request !22
parents eade9f0d 7bbc4a75
...@@ -4,5 +4,5 @@ module.exports = { ...@@ -4,5 +4,5 @@ module.exports = {
// QA_API: '"http://172.30.220.22:3003"', // QA_API: '"http://172.30.220.22:3003"',
QA_API: '"http://127.0.0.1:3003"', QA_API: '"http://127.0.0.1:3003"',
TESTDATA_API: '"http://172.30.220.22:3333"', TESTDATA_API: '"http://172.30.220.22:3333"',
PIPELINE_API:'"http://pipes.liangkebang.com"' // PIPELINE_API:'"http://pipes.liangkebang.com"',
} }
...@@ -3,5 +3,6 @@ module.exports = { ...@@ -3,5 +3,6 @@ module.exports = {
ENV_CONFIG: '"prod"', ENV_CONFIG: '"prod"',
QA_API: '"http://172.30.220.22:3003"', QA_API: '"http://172.30.220.22:3003"',
TESTDATA_API: '"http://172.30.220.22:3333"', TESTDATA_API: '"http://172.30.220.22:3333"',
PIPELINE_API: '"http://pipes.liangkebang.com"' PIPELINE_API: '"http://pipes.liangkebang.com"',
PIPELINE_API_JAVA:'"http://pipes.liangkebang.com"',
} }
import request from '@/utils/request'
export function getMaster(data) {
return request({
url: '/pipeline/master',
method: 'post',
data
})
}
export function saveApplication(data) {
return request({
url: '/pipeline/save',
method: 'post',
data
})
}
export function getApplications(data) {
return request({
url: '/pipeline/find',
method: 'post',
data
})
}
export function deleteApplication(data) {
return request({
url: `/pipeline/delete`,
method: 'post',
data
})
}
export function updateApplication(data) {
return request({
url: '/manage/application',
method: 'put',
data
})
}
<template> <template>
<div class="app-container"> <div class="app-container">
<div class="filter-container"> <div class="filter-container">
<el-input v-model="listQuery.tag" placeholder="应用名称" clearable style="width: 200px;" class="filter-item" @keyup.enter.native="handleFilter"/> <el-input v-model="listQuery.application_name" placeholder="应用名称" clearable style="width: 200px;" class="filter-item" @keyup.enter.native="handleFilter"/>
<el-input v-model="listQuery.owner" placeholder="新建用户" clearable style="width: 200px;" class="filter-item" @keyup.enter.native="handleFilter"/> <el-input v-model="listQuery.new_user" placeholder="新建用户" clearable style="width: 200px;" class="filter-item" @keyup.enter.native="handleFilter"/>
<el-button v-waves class="filter-item" type="primary" icon="el-icon-search" @click="handleFilter">{{ $t('table.search') }}</el-button> <el-button v-waves class="filter-item" type="primary" icon="el-icon-search" @click="handleFilter">{{ $t('table.search') }}</el-button>
<el-button class="filter-item" type="primary" icon="el-icon-edit" @click="handleCreate">添加</el-button> <el-button class="filter-item" type="primary" icon="el-icon-edit" @click="handleCreate">添加</el-button>
</div> </div>
...@@ -19,41 +19,19 @@ ...@@ -19,41 +19,19 @@
<span>{{ scope.$index + 1 }}</span> <span>{{ scope.$index + 1 }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="应用名称" prop="tag" align="center"> <el-table-column label="应用名称" prop="application_name" align="center">
<template slot-scope="scope"> <template slot-scope="scope">
<span class="link-type" @click="handleUpdate(scope.row)">{{ scope.row.tag }}</span> <span class="link-type" @click="handleUpdate(scope.row)">{{ scope.row.application_name }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="项目->分支" align="center">
<!-- <el-table-column label="状态" align="center">
<template slot-scope="scope">
<span>{{ scope.row.status }}</span>
</template>
</el-table-column> -->
<!-- <el-table-column label="通知方式" align="center">
<template slot-scope="scope">
<span>{{ scope.row.noticeType }}</span>
</template>
</el-table-column> -->
<el-table-column label="项目与分支" align="center">
<template slot-scope="scope">
<div v-for="item in scope.row.repos" :key="item.id">{{ item.repository.name }} : {{ item.ref.name | replaceeRef }}</div>
</template>
</el-table-column>
<el-table-column label="新建用户->修改用户" align="center">
<template slot-scope="scope"> <template slot-scope="scope">
<span v-if="scope.row.editor">{{ scope.row.owner }}->{{ scope.row.editor }}</span> <div v-for="item in scope.row.repos" :key="item.id"><b>{{ item.repository }}</b> -> {{ item.ref.name | replaceeRef }}</div>
<span v-if="!scope.row.editor">{{ scope.row.owner }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="更新时间" align="center"> <el-table-column prop="new_user" label="创建者" align="center"/>
<template slot-scope="scope"> <el-table-column prop="create_time" label="创建时间" align="center"/>
<span>{{ scope.row.updateTime | formatDate }}</span>
</template>
</el-table-column>
<el-table-column :label="$t('table.actions')" align="center" width="180" class-name="small-padding fixed-width"> <el-table-column :label="$t('table.actions')" align="center" width="180" class-name="small-padding fixed-width">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button type="primary" size="mini" @click="handleUpdate(scope.row)">{{ $t('table.edit') }}</el-button> <el-button type="primary" size="mini" @click="handleUpdate(scope.row)">{{ $t('table.edit') }}</el-button>
...@@ -67,18 +45,18 @@ ...@@ -67,18 +45,18 @@
<el-dialog :title="dialogStatus" :visible.sync="dialogFormVisible"> <el-dialog :title="dialogStatus" :visible.sync="dialogFormVisible">
<el-form ref="dataForm" :rules="rules" :model="temp" label-position="left" label-width="80px" style="width: 90%; margin-left:40px;"> <el-form ref="dataForm" :rules="rules" :model="temp" label-position="left" label-width="80px" style="width: 90%; margin-left:40px;">
<el-form-item label="应用名称" prop="tag" > <el-form-item label="应用名称" prop="application_name" >
<el-input v-model="temp.tag"/> <el-input v-model="temp.application_name"/>
</el-form-item> </el-form-item>
<div > <div >
<div v-for="(repoAndRefItem,index) in temp.repos" :key="repoAndRefItem.id" style="width:110%;margin-bottom:20px" > <div v-for="(repoAndRefItem,index) in temp.repos" :key="repoAndRefItem.id" style="width:110%;margin-bottom:20px" >
<label style="margin-right:20px">项目</label> <label style="margin-right:20px">项目</label>
<el-select v-model="repoAndRefItem.repository" value-key="id" style="width:30%" class="filter-item" @change="getRefs"> <el-select v-model="repoAndRefItem.repository" filterable value-key="id" style="width:30%" class="filter-item" @change="getRefs(repoAndRefItem.repository,true)">
<el-option v-for="item in repos" :value="item" :label="item.name" :key="item.id" /> <el-option v-for="item in repos" :value="item.project_name" :label="item.project_name" :key="item.project_name" />
</el-select> </el-select>
<label style="margin:20px">分支</label> <label style="margin:20px">分支</label>
<el-select v-model="repoAndRefItem.ref" value-key="id" style="width:30%" class="filter-item"> <el-select v-model="repoAndRefItem.ref" filterable value-key="id" style="width:30%" class="filter-item">
<el-option v-for="item in refs[repoAndRefItem.repository.id]" :value="item" :label="item.name | replaceeRef" :key="item.id" /> <el-option v-for="item in refs[repoAndRefItem.repository]" :value="item" :label="item.name" :key="item.name" />
</el-select> </el-select>
<el-button :disabled="index===0?true:false" style="margin-left:5px" @click="temp.repos.splice(index, 1)">删除</el-button> <el-button :disabled="index===0?true:false" style="margin-left:5px" @click="temp.repos.splice(index, 1)">删除</el-button>
</div> </div>
...@@ -94,6 +72,16 @@ ...@@ -94,6 +72,16 @@
<el-form-item v-if="temp.noticeType === 'dingding'" label="通知地址"> <el-form-item v-if="temp.noticeType === 'dingding'" label="通知地址">
<el-input :autosize="{ minRows: 3, maxRows: 4}" v-model="temp.noticeAddress" type="textarea" placeholder="Please input"/> <el-input :autosize="{ minRows: 3, maxRows: 4}" v-model="temp.noticeAddress" type="textarea" placeholder="Please input"/>
</el-form-item> </el-form-item>
<el-form-item label="是否部署到容器" label-width="120">
<el-switch
v-model="temp.isDeploy"
inactive-color="#efefef"
active-color="#13ce66"
/>
</el-form-item>
<el-form-item v-if="temp.isDeploy" label="namespace" prop="namespace" >
<el-input v-model="temp.namespace"/>
</el-form-item>
</el-form> </el-form>
<div slot="footer" class="dialog-footer"> <div slot="footer" class="dialog-footer">
<el-button @click="dialogFormVisible = false">{{ $t('table.cancel') }}</el-button> <el-button @click="dialogFormVisible = false">{{ $t('table.cancel') }}</el-button>
...@@ -103,7 +91,7 @@ ...@@ -103,7 +91,7 @@
<el-dialog :visible.sync="dialogDeleteVisible" :data="temp" title="Delete"> <el-dialog :visible.sync="dialogDeleteVisible" :data="temp" title="Delete">
<span > <span >
确定要删除{{ temp.tag }}吗? 确定要删除{{ temp.application_name }}吗?
</span> </span>
<span slot="footer" class="dialog-footer"> <span slot="footer" class="dialog-footer">
<el-button @click="dialogDeleteVisible = false">{{ $t('table.cancel') }}</el-button> <el-button @click="dialogDeleteVisible = false">{{ $t('table.cancel') }}</el-button>
...@@ -115,7 +103,8 @@ ...@@ -115,7 +103,8 @@
</template> </template>
<script> <script>
import { getApplications, saveApplication, updateApplication, deleteApplication, getRepos, getRefs } from '@/api/pipeline' import { getApplications, saveApplication, updateApplication, deleteApplication, getMaster } from '@/api/pipelineNode'
import { getProjects } from '@/api/proconfig'
import waves from '@/directive/waves' // Waves directive import waves from '@/directive/waves' // Waves directive
import Pagination from '@/components/Pagination' // Secondary package based on el-pagination import Pagination from '@/components/Pagination' // Secondary package based on el-pagination
import moment from 'moment' import moment from 'moment'
...@@ -136,6 +125,7 @@ export default { ...@@ -136,6 +125,7 @@ export default {
return { return {
repository: '', repository: '',
total: 0, total: 0,
cacheData: {},
listLoading: true, listLoading: true,
listQuery: { listQuery: {
}, },
...@@ -145,9 +135,9 @@ export default { ...@@ -145,9 +135,9 @@ export default {
dialogDeleteVisible: false, dialogDeleteVisible: false,
dialogStatus: '', dialogStatus: '',
rules: { rules: {
tag: [{ required: true, message: '请输入', trigger: 'change' }] application_name: [{ required: true, message: '请输入', trigger: 'change' }],
// timestamp: [{ type: 'date', required: true, message: 'timestamp is required', trigger: 'change' }], // timestamp: [{ type: 'date', required: true, message: 'timestamp is required', trigger: 'change' }],
// title: [{ required: true, message: 'title is required', trigger: 'blur' }] namespace: [{ required: true, message: '请输入', trigger: 'blur' }]
}, },
noticeTypes: ['dingding', 'mail'], noticeTypes: ['dingding', 'mail'],
applications: [], applications: [],
...@@ -173,28 +163,14 @@ export default { ...@@ -173,28 +163,14 @@ export default {
delete this.listQuery[prop] delete this.listQuery[prop]
} }
} }
getApplications(this.listQuery).then(res => { var arr = Object.keys(this.listQuery)
this.applications = res.data.data getApplications(arr.length > 0 ? this.listQuery : null).then(res => {
this.applications = res.data
this.listLoading = false this.listLoading = false
}) })
}, },
getRefs(repo) {
console.log(repo)
getRefs(repo.id).then(res => {
this.$set(this.refs, repo.id, res.data.data.map(item => {
return {
id: item.id,
name: item.ref
}
}))
this.refs[repo.id].push({ id: '0', name: '请选择' })
this.refs[repo.id].reverse()
})
},
newRepoAndRef() { newRepoAndRef() {
this.temp.repos.push({ repository: {}, ref: {}}) this.temp.repos.push({ repository: '', ref: {}})
}, },
handleFilter() { handleFilter() {
...@@ -204,31 +180,68 @@ export default { ...@@ -204,31 +180,68 @@ export default {
resetTemp() { resetTemp() {
this.temp = { this.temp = {
id: 0, id: 0,
namespace: null,
noticeAddress: '', noticeAddress: '',
noticeType: '', noticeType: '',
repos: [{ repository: { id: '请选择' }, ref: { id: '请选择' }}], isDeploy: false,
status: 'run', repos: [{ repository: '', ref: { id: '请选择' }}],
tag: '' application_name: '',
create_time: moment().format('YYYY-MM-DD HH:mm:ss'),
new_user: '',
update_user: ''
} }
}, },
handleCreate() { handleCreate() {
this.resetTemp() this.resetTemp()
this.dialogStatus = '新建' this.dialogStatus = '新建'
getRepos().then(res => { getProjects({ is_active: true }).then(res => {
this.repos = res.data.data this.repos = res.data
this.repos.sort((s1, s2) => { this.repos.sort((s1, s2) => {
return s1.name.localeCompare(s2.name) return s1.project_name.localeCompare(s2.project_name)
}) })
this.listLoading = false this.listLoading = false
}) })
this.dialogFormVisible = true this.dialogFormVisible = true
}, },
getRefs(repo, flag) {
if (flag) {
this.temp.repos.forEach(item => {
if (item.repository === repo) {
item.ref = {}
}
})
}
getMaster({ name: repo }).then(res => {
if (res.data.code === '0001') {
console.log('无法获取分支')
} else {
this.$set(this.refs, repo, res.data.data.map(item => {
return {
id: item.commit.id,
name: item.name
}
}))
this.refs[repo].push({ id: '0', name: '请选择' })
this.refs[repo].reverse()
}
})
},
createData() { createData() {
this.$refs['dataForm'].validate((valid) => { this.$refs['dataForm'].validate((valid) => {
if (valid) { if (valid) {
// 数组清洗整合,
this.temp.repos.forEach(item => {
this.repos.forEach(value => {
if (item.repository === value.project_name) {
this.$set(item, 'type', value.type)
this.$set(item, 'groupName', value.git_path_group)
}
})
})
if (this.dialogStatus === '新建') { if (this.dialogStatus === '新建') {
this.temp.new_user = this.$store.getters.name
saveApplication(this.temp).then(() => { saveApplication(this.temp).then(() => {
this.dialogFormVisible = false this.dialogFormVisible = false
this.$notify({ this.$notify({
...@@ -240,6 +253,7 @@ export default { ...@@ -240,6 +253,7 @@ export default {
this.getApplications() this.getApplications()
}) })
} else { } else {
this.temp.update_user = this.$store.getters.name
updateApplication(this.temp).then(() => { updateApplication(this.temp).then(() => {
this.dialogFormVisible = false this.dialogFormVisible = false
this.$notify({ this.$notify({
...@@ -256,13 +270,14 @@ export default { ...@@ -256,13 +270,14 @@ export default {
}, },
handleUpdate(row) { handleUpdate(row) {
console.log(row)
this.temp = Object.assign({}, row) // copy obj this.temp = Object.assign({}, row) // copy obj
this.dialogStatus = '编辑' this.dialogStatus = '编辑'
this.dialogFormVisible = true this.dialogFormVisible = true
getRepos().then(res => { getProjects({ is_active: true }).then(res => {
this.repos = res.data.data this.repos = res.data
this.repos.sort((s1, s2) => { this.repos.sort((s1, s2) => {
return s1.name.localeCompare(s2.name) return s1.project_name.localeCompare(s2.project_name)
}) })
this.listLoading = false this.listLoading = false
}) })
...@@ -270,14 +285,14 @@ export default { ...@@ -270,14 +285,14 @@ export default {
this.getRefs(item.repository) this.getRefs(item.repository)
}) })
}, },
handleDelete(row) { handleDelete(row) {
console.log(row)
this.temp = row this.temp = row
this.dialogDeleteVisible = true this.dialogDeleteVisible = true
}, },
deleteData() { deleteData() {
deleteApplication(this.temp.id).then(() => { deleteApplication({ id: this.temp._id }).then(() => {
this.dialogDeleteVisible = false this.dialogDeleteVisible = false
this.$notify({ this.$notify({
title: '成功', title: '成功',
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment