|
@@ -0,0 +1,361 @@
|
|
|
+import React from 'react'
|
|
|
+import { Button, Input, Table, Badge, Popconfirm } from 'antd'
|
|
|
+import AddTaskModal from './components/addTask'
|
|
|
+import StartTaskModal from './components/startTask'
|
|
|
+import router from 'umi/router'
|
|
|
+
|
|
|
+import {
|
|
|
+ taskBegin,
|
|
|
+ taskStop,
|
|
|
+ taskUpdate,
|
|
|
+ taskAdd,
|
|
|
+ taskCopy,
|
|
|
+ taskList
|
|
|
+} from './service'
|
|
|
+const { Search } = Input
|
|
|
+
|
|
|
+const scheduleState = {
|
|
|
+ 0: {
|
|
|
+ text: '初始化',
|
|
|
+ color: 'orange'
|
|
|
+ },
|
|
|
+ 1: {
|
|
|
+ text: '准备完成',
|
|
|
+ color: 'blue'
|
|
|
+ },
|
|
|
+ 2: {
|
|
|
+ text: '压测中',
|
|
|
+ color: 'volcano'
|
|
|
+ },
|
|
|
+
|
|
|
+ 3: {
|
|
|
+ text: '压测完成',
|
|
|
+ color: 'green'
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+class Halberd extends React.PureComponent {
|
|
|
+ state = {
|
|
|
+ data: [],
|
|
|
+ addFormVisible: false,
|
|
|
+ updateFormVisible: false,
|
|
|
+ startTaskVisible: false,
|
|
|
+ params: { detail: [] }
|
|
|
+ };
|
|
|
+
|
|
|
+ columns = [
|
|
|
+ {
|
|
|
+ title: '压测任务',
|
|
|
+ dataIndex: 'name',
|
|
|
+ width: 400,
|
|
|
+ key: 'name'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '添加人',
|
|
|
+ dataIndex: 'op_uid',
|
|
|
+ key: 'op_uid'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '压测进度',
|
|
|
+ dataIndex: 'state',
|
|
|
+ key: 'state',
|
|
|
+ render: state => (
|
|
|
+ <Badge color={scheduleState[state].color} text={scheduleState[state].text} />
|
|
|
+ )
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '操作',
|
|
|
+ key: '_id',
|
|
|
+ render: value => {
|
|
|
+ return (
|
|
|
+ <div>
|
|
|
+ <Popconfirm
|
|
|
+ title="确定复制吗?"
|
|
|
+ onConfirm={() => this.copyTask(value._id)}
|
|
|
+ okText="确定"
|
|
|
+ cancelText="取消"
|
|
|
+ >
|
|
|
+ <Button type="primary" size={'small'} style={{ margin: '0 5px' }}>
|
|
|
+ 复制任务
|
|
|
+ </Button>
|
|
|
+ </Popconfirm>
|
|
|
+
|
|
|
+ <Button
|
|
|
+ type="primary"
|
|
|
+ size={'small'}
|
|
|
+ style={{ margin: '0 5px' }}
|
|
|
+ onClick={() => {
|
|
|
+ this.viewTaskDetail(value)
|
|
|
+ }}
|
|
|
+ >
|
|
|
+ 查看详情
|
|
|
+ </Button>
|
|
|
+ <Button
|
|
|
+ type="primary"
|
|
|
+ size={'small'}
|
|
|
+ disabled={value.state !== 1 && value.state !== 3}
|
|
|
+ style={{ margin: '0 5px' }}
|
|
|
+ onClick={() => {
|
|
|
+ this.showStartTaskModal(value._id)
|
|
|
+ }}
|
|
|
+ >
|
|
|
+ 开始压测
|
|
|
+ </Button>
|
|
|
+ <Popconfirm
|
|
|
+ title="确定停止吗?"
|
|
|
+ onConfirm={() => this.stopTask(value._id)}
|
|
|
+ okText="确定"
|
|
|
+ cancelText="取消"
|
|
|
+ >
|
|
|
+ <Button type="primary" size={'small'} style={{ margin: '0 5px' }}>
|
|
|
+ 停止压测
|
|
|
+ </Button>
|
|
|
+ </Popconfirm>
|
|
|
+ <Button
|
|
|
+ type="primary"
|
|
|
+ size={'small'}
|
|
|
+ style={{ margin: '0 5px' }}
|
|
|
+ onClick={() => {
|
|
|
+ this.showViewReport(value._id)
|
|
|
+ }}
|
|
|
+ >
|
|
|
+ 查看报告
|
|
|
+ </Button>
|
|
|
+ </div>
|
|
|
+ )
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ];
|
|
|
+
|
|
|
+ componentDidMount () {
|
|
|
+ this.getTackList()
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取压测任务列表
|
|
|
+ * @param {*} name
|
|
|
+ */
|
|
|
+ getTackList = (name = '') => {
|
|
|
+ taskList({
|
|
|
+ page: 1, // 页数
|
|
|
+ pageNum: 10000, // 一页展示数量
|
|
|
+ taskName: name // 任务名称
|
|
|
+ }).then(res => {
|
|
|
+ const { code, data } = res
|
|
|
+ if (code === 0) {
|
|
|
+ this.setState({
|
|
|
+ data: data.list || []
|
|
|
+ })
|
|
|
+ }
|
|
|
+ })
|
|
|
+ };
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 复制任务
|
|
|
+ * @param {*} id
|
|
|
+ */
|
|
|
+ copyTask = id => {
|
|
|
+ taskCopy({
|
|
|
+ id // 需要复制的任务id
|
|
|
+ }).then(res => {
|
|
|
+ const { code } = res
|
|
|
+ if (code === 0) {
|
|
|
+ this.getTackList()
|
|
|
+ }
|
|
|
+ })
|
|
|
+ };
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 停止任务
|
|
|
+ * @param {*} id
|
|
|
+ */
|
|
|
+ stopTask = id => {
|
|
|
+ taskStop({
|
|
|
+ id // 需要停止的任务id
|
|
|
+ }).then(res => {
|
|
|
+ const { code } = res
|
|
|
+ if (code === 0) {
|
|
|
+ this.getTackList()
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 打开查看详情弹窗
|
|
|
+ * @param {*} id
|
|
|
+ */
|
|
|
+ viewTaskDetail = value => {
|
|
|
+ const { data } = this.state
|
|
|
+ // eslint-disable-next-line camelcase
|
|
|
+ const { _id: id, name, get_token_url } = value
|
|
|
+ let detail = ''
|
|
|
+
|
|
|
+ data.forEach(item => {
|
|
|
+ if (item._id === id) {
|
|
|
+ console.log('item.detail', value, data)
|
|
|
+
|
|
|
+ detail = item.detail
|
|
|
+ }
|
|
|
+ })
|
|
|
+ this.setState({
|
|
|
+ updateFormVisible: true,
|
|
|
+ params: {
|
|
|
+ id,
|
|
|
+ name: name,
|
|
|
+ getTokenUrl: get_token_url,
|
|
|
+ detail: JSON.parse(detail)
|
|
|
+ }
|
|
|
+ })
|
|
|
+ };
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 打开 开始压测弹窗
|
|
|
+ * @param {*} id
|
|
|
+ */
|
|
|
+ showStartTaskModal = id => {
|
|
|
+ this.setState({
|
|
|
+ startTaskVisible: true,
|
|
|
+ params: {
|
|
|
+ id
|
|
|
+ }
|
|
|
+ })
|
|
|
+ };
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 打开 查看压测报告页面
|
|
|
+ * @param {*} id
|
|
|
+ */
|
|
|
+ showViewReport = id => {
|
|
|
+ router.push(`/halberd/viewReport?id=${id}`)
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 打开添加弹窗
|
|
|
+ */
|
|
|
+ showAddTask = () => {
|
|
|
+ this.setState({
|
|
|
+ addFormVisible: true
|
|
|
+ })
|
|
|
+ };
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 隐藏所有弹窗
|
|
|
+ */
|
|
|
+ hidden = () => {
|
|
|
+ this.setState({
|
|
|
+ addFormVisible: false,
|
|
|
+ updateFormVisible: false,
|
|
|
+ startTaskVisible: false
|
|
|
+ })
|
|
|
+ };
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 添加压测任务
|
|
|
+ * @param {*} data
|
|
|
+ */
|
|
|
+ addTask = data => {
|
|
|
+ const { name = '', getTokenUrl, detail = [] } = data
|
|
|
+ taskAdd({
|
|
|
+ name,
|
|
|
+ getTokenUrl: getTokenUrl,
|
|
|
+ detail: JSON.stringify(detail.map(item => {
|
|
|
+ return {
|
|
|
+ ...item,
|
|
|
+ rate: Number(item.rate)
|
|
|
+ }
|
|
|
+ }))
|
|
|
+ }).then(res => {
|
|
|
+ const { code } = res
|
|
|
+ if (code === 0) {
|
|
|
+ this.hidden()
|
|
|
+ this.getTackList()
|
|
|
+ }
|
|
|
+ })
|
|
|
+ };
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 更新压测任务
|
|
|
+ * @param {*} data
|
|
|
+ */
|
|
|
+ updateTask = data => {
|
|
|
+ const { name = '', getTokenUrl, detail = [] } = data
|
|
|
+
|
|
|
+ taskUpdate({
|
|
|
+ id: data.id,
|
|
|
+ name,
|
|
|
+ getTokenUrl: getTokenUrl,
|
|
|
+ needNew: data.needNew,
|
|
|
+ detail: JSON.stringify(detail)
|
|
|
+ }).then(res => {
|
|
|
+ const { code } = res
|
|
|
+ if (code === 0) {
|
|
|
+ this.hidden()
|
|
|
+ }
|
|
|
+ })
|
|
|
+ };
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 开始压测任务
|
|
|
+ * @param {*} data
|
|
|
+ */
|
|
|
+ startTask = data => {
|
|
|
+ console.log(data)
|
|
|
+ const { id, connects, threads, timeout, duration } = data
|
|
|
+ taskBegin({
|
|
|
+ id,
|
|
|
+ connects: Number(connects),
|
|
|
+ threads: Number(threads),
|
|
|
+ timeout: Number(timeout),
|
|
|
+ duration: Number(duration)
|
|
|
+ }).then(res => {
|
|
|
+ const { code } = res
|
|
|
+ if (code === 0) {
|
|
|
+ this.hidden()
|
|
|
+ this.getTackList()
|
|
|
+ }
|
|
|
+ })
|
|
|
+ };
|
|
|
+
|
|
|
+ render () {
|
|
|
+ const { data, addFormVisible, updateFormVisible, startTaskVisible, params } = this.state
|
|
|
+ return (
|
|
|
+ <div style={{ margin: '0 auto' }}>
|
|
|
+ <Search
|
|
|
+ placeholder="请输入压测任务名进行搜索"
|
|
|
+ enterButton="搜索"
|
|
|
+ onSearch={value => this.getTackList(value)}
|
|
|
+ style={{ width: 400 }}
|
|
|
+ />
|
|
|
+
|
|
|
+ <div style={{ margin: '20px 0' }}>
|
|
|
+ <Button type="primary" onClick={this.showAddTask}>
|
|
|
+ 添加
|
|
|
+ </Button>
|
|
|
+ </div>
|
|
|
+ <Table dataSource={data} columns={this.columns} rowKey="_id" />
|
|
|
+ {addFormVisible && (
|
|
|
+ <AddTaskModal showModal={addFormVisible} onOk={this.addTask} onCancel={this.hidden} />
|
|
|
+ )}
|
|
|
+ {updateFormVisible && (
|
|
|
+ <AddTaskModal
|
|
|
+ showModal={updateFormVisible}
|
|
|
+ update
|
|
|
+ params={params}
|
|
|
+ onOk={this.updateTask}
|
|
|
+ onCancel={this.hidden}
|
|
|
+ />
|
|
|
+ )}
|
|
|
+ {startTaskVisible && (
|
|
|
+ <StartTaskModal
|
|
|
+ showModal={startTaskVisible}
|
|
|
+ onOk={this.startTask}
|
|
|
+ onCancel={this.hidden}
|
|
|
+ params={params}
|
|
|
+ />
|
|
|
+ )}
|
|
|
+ </div>
|
|
|
+ )
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+export default Halberd
|