Browse Source

Merge pull request #359 from 1010309281/features/supportgidsearch

Features/supportgidsearch
pull/360/head
yedf2 4 years ago
committed by GitHub
parent
commit
796f01727b
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 5
      admin/src/api/api_dtm.ts
  2. 5
      admin/src/components.d.ts
  3. 210
      admin/src/views/Dashboard/GlobalTransactions/AllTransactions.vue
  4. 12
      dtmsvr/api_http.go

5
admin/src/api/api_dtm.ts

@ -1,7 +1,8 @@
import { AxiosResponse } from 'axios' import {AxiosResponse} from 'axios'
import request from '/@/utils/request' import request from '/@/utils/request'
export interface IListAllTransactionsReq { export interface IListAllTransactionsReq {
gid?: string,
limit: number limit: number
position?: string position?: string
} }
@ -18,7 +19,7 @@ export function forceStopTransaction(gid: string): Promise<AxiosResponse> {
return request({ return request({
url: '/api/dtmsvr/forceStop', url: '/api/dtmsvr/forceStop',
method: 'post', method: 'post',
data: { gid }, data: {gid},
}) })
} }

5
admin/src/components.d.ts

@ -9,6 +9,10 @@ declare module '@vue/runtime-core' {
ABreadcrumb: typeof import('ant-design-vue/es')['Breadcrumb'] ABreadcrumb: typeof import('ant-design-vue/es')['Breadcrumb']
ABreadcrumbItem: typeof import('ant-design-vue/es')['BreadcrumbItem'] ABreadcrumbItem: typeof import('ant-design-vue/es')['BreadcrumbItem']
AButton: typeof import('ant-design-vue/es')['Button'] AButton: typeof import('ant-design-vue/es')['Button']
ADivider: typeof import('ant-design-vue/es')['Divider']
AForm: typeof import('ant-design-vue/es')['Form']
AFormItem: typeof import('ant-design-vue/es')['FormItem']
AInput: typeof import('ant-design-vue/es')['Input']
ALayout: typeof import('ant-design-vue/es')['Layout'] ALayout: typeof import('ant-design-vue/es')['Layout']
ALayoutContent: typeof import('ant-design-vue/es')['LayoutContent'] ALayoutContent: typeof import('ant-design-vue/es')['LayoutContent']
ALayoutHeader: typeof import('ant-design-vue/es')['LayoutHeader'] ALayoutHeader: typeof import('ant-design-vue/es')['LayoutHeader']
@ -16,6 +20,7 @@ declare module '@vue/runtime-core' {
AMenu: typeof import('ant-design-vue/es')['Menu'] AMenu: typeof import('ant-design-vue/es')['Menu']
AMenuItem: typeof import('ant-design-vue/es')['MenuItem'] AMenuItem: typeof import('ant-design-vue/es')['MenuItem']
AModal: typeof import('ant-design-vue/es')['Modal'] AModal: typeof import('ant-design-vue/es')['Modal']
ASpace: typeof import('ant-design-vue/es')['Space']
ASubMenu: typeof import('ant-design-vue/es')['SubMenu'] ASubMenu: typeof import('ant-design-vue/es')['SubMenu']
ATable: typeof import('ant-design-vue/es')['Table'] ATable: typeof import('ant-design-vue/es')['Table']
ATag: typeof import('ant-design-vue/es')['Tag'] ATag: typeof import('ant-design-vue/es')['Tag']

210
admin/src/views/Dashboard/GlobalTransactions/AllTransactions.vue

@ -1,142 +1,178 @@
<template> <template>
<div> <div>
<a-table :columns="columns" :data-source="dataSource" :loading="loading" :pagination="false"> <a-form
<template #bodyCell="{column, record}"> layout="inline"
<template v-if="column.key === 'status'"> :model="{}"
@finish="searchFinish"
>
<a-form-item>
<a-input v-model:value="gid" placeholder="gid">
</a-input>
</a-form-item>
<a-form-item>
<a-button
type="primary"
html-type="submit">
搜索
</a-button>
</a-form-item>
</a-form>
</div>
<a-divider />
<div>
<a-table :columns="columns" :data-source="dataSource" :loading="loading" :pagination="false">
<template #bodyCell="{column, record}">
<template v-if="column.key === 'status'">
<span> <span>
<a-tag :key="record.status" :color="record.status === 'succeed' ? 'green' : 'volcano'">{{ record.status }}</a-tag> <a-tag :key="record.status"
:color="record.status === 'succeed' ? 'green' : 'volcano'">{{ record.status }}</a-tag>
</span> </span>
</template> </template>
<template v-else-if="column.key === 'action'"> <template v-else-if="column.key === 'action'">
<span> <span>
<a class="mr-2 font-medium" @click="handleTransactionDetail(record.gid)">Detail</a> <a class="mr-2 font-medium" @click="handleTransactionDetail(record.gid)">Detail</a>
<a-button danger type="link" :disabled="record.status==='failed' || record.status==='succeed'" @click="handleTransactionStop(record.gid)">ForceStop</a-button> <a-button danger type="link" :disabled="record.status==='failed' || record.status==='succeed'"
<!-- <a class="text-red-400 font-medium" @click="handleTransactionStop(record.gid)">ForceStop</a> --> @click="handleTransactionStop(record.gid)">ForceStop</a-button>
<!-- <a class="text-red-400 font-medium" @click="handleTransactionStop(record.gid)">ForceStop</a> -->
</span> </span>
</template> </template>
</template> </template>
</a-table> </a-table>
<div class="flex justify-center mt-2 text-lg pager" v-if="canPrev || canNext"> <div class="flex justify-center mt-2 text-lg pager" v-if="canPrev || canNext">
<a-button type="text" :disabled="!canPrev" @click="handlePrevPage">Previous</a-button> <a-button type="text" :disabled="!canPrev" @click="handlePrevPage">Previous</a-button>
<a-button type="text" :disabled="!canNext" @click="handleNextPage">Next</a-button> <a-button type="text" :disabled="!canNext" @click="handleNextPage">Next</a-button>
</div>
<DialogTransactionDetail ref="transactionDetail" />
</div> </div>
<DialogTransactionDetail ref="transactionDetail"/>
</div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { IListAllTransactionsReq, listAllTransactions, forceStopTransaction } from '/@/api/api_dtm' import {forceStopTransaction, IListAllTransactionsReq, listAllTransactions} from '/@/api/api_dtm'
import { ref, computed } from 'vue-demi' import {computed, ref} from 'vue-demi'
import { usePagination } from 'vue-request' import {usePagination} from 'vue-request'
import DialogTransactionDetail from './_Components/DialogTransactionDetail.vue'; import DialogTransactionDetail from './_Components/DialogTransactionDetail.vue';
const gid = ref("")
const searchFinish = function () {
curPage.value = 1;
const params = {
gid: gid.value,
limit: pageSize.value,
}
run(params)
}
const columns = [ const columns = [
{ {
title: 'GID', title: 'GID',
dataIndex: 'gid', dataIndex: 'gid',
key: 'gid' key: 'gid'
}, { }, {
title: 'TransType', title: 'TransType',
dataIndex: 'trans_type', dataIndex: 'trans_type',
key: 'trans_type' key: 'trans_type'
}, { }, {
title: 'Status', title: 'Status',
dataIndex: 'status', dataIndex: 'status',
key: 'status' key: 'status'
}, { }, {
title: 'Protocol', title: 'Protocol',
dataIndex: 'protocol', dataIndex: 'protocol',
key: 'protocol' key: 'protocol'
}, { }, {
title: 'CreateTime', title: 'CreateTime',
dataIndex: 'create_time', dataIndex: 'create_time',
key: 'create_time' key: 'create_time'
}, { }, {
title: 'Action', title: 'Action',
key: 'action' key: 'action'
} }
] ]
const pages = ref(['']) const pages = ref([''])
const curPage = ref(1) const curPage = ref(1)
const canPrev = computed(() => { const canPrev = computed(() => {
return curPage.value > 1 return curPage.value > 1
}) })
const canNext = computed(() => { const canNext = computed(() => {
return data.value?.data.next_position !== "" return data.value?.data.next_position !== ""
}) })
type Data = { type Data = {
transactions: { transactions: {
gid: string gid: string
trans_type: string trans_type: string
status: string status: string
protocol: string protocol: string
create_time: string create_time: string
}[] }[]
next_position: string next_position: string
} }
const queryData = (params: IListAllTransactionsReq) => { const queryData = (params: IListAllTransactionsReq) => {
return listAllTransactions<Data>(params) return listAllTransactions<Data>(params)
} }
const { data, run, current, loading, pageSize } = usePagination(queryData, { const {data, run, current, loading, pageSize} = usePagination(queryData, {
defaultParams: [ defaultParams: [
{ {
limit: 10, limit: 10,
}
],
pagination: {
pageSizeKey: 'limit'
} }
],
pagination: {
pageSizeKey: 'limit'
}
}) })
const dataSource = computed(() => data.value?.data.transactions || []) const dataSource = computed(() => data.value?.data.transactions || [])
const handlePrevPage = () => { const handlePrevPage = () => {
curPage.value -= 1; curPage.value -= 1;
const params = { const params = {
limit: pageSize.value, limit: pageSize.value,
position: pages.value[curPage.value] as string position: pages.value[curPage.value] as string
} }
run(params) run(params)
} }
const handleNextPage = () => { const handleNextPage = () => {
curPage.value += 1; curPage.value += 1;
pages.value[curPage.value] = data.value?.data.next_position as string pages.value[curPage.value] = data.value?.data.next_position as string
run({ run({
position: data.value?.data.next_position, position: data.value?.data.next_position,
limit: pageSize.value, limit: pageSize.value,
}) })
} }
const transactionDetail = ref<null | {open:(gid: string) => null}>(null) const transactionDetail = ref<null | { open: (gid: string) => null }>(null)
const handleTransactionDetail = (gid: string) => { const handleTransactionDetail = (gid: string) => {
transactionDetail.value?.open(gid) transactionDetail.value?.open(gid)
} }
const handleTransactionStop = async (gid: string) => { const handleTransactionStop = async (gid: string) => {
await forceStopTransaction(gid) await forceStopTransaction(gid)
run({ run({
position: data.value?.data.next_position, position: data.value?.data.next_position,
limit: pageSize.value, limit: pageSize.value,
}) })
} }
</script> </script>
<style lang="postcss" scoped> <style lang="postcss" scoped>
::v-deep .ant-pagination-item { ::v-deep .ant-pagination-item {
display: none; display: none;
} }
.pager .ant-btn-text { .pager .ant-btn-text {
font-weight: 500; font-weight: 500;
}1 }
.pager .ant-btn { .pager .ant-btn {
padding: 6px; padding: 6px;
} }
</style> </style>

12
dtmsvr/api_http.go

@ -95,9 +95,19 @@ func prepareWorkflow(c *gin.Context) interface{} {
} }
func all(c *gin.Context) interface{} { func all(c *gin.Context) interface{} {
gid := c.Query("gid")
position := c.Query("position") position := c.Query("position")
sLimit := dtmimp.OrString(c.Query("limit"), "100") sLimit := dtmimp.OrString(c.Query("limit"), "100")
globals := GetStore().ScanTransGlobalStores(&position, int64(dtmimp.MustAtoi(sLimit)))
var globals interface{}
if len(gid) > 0 {
find := GetStore().FindTransGlobalStore(gid)
if find != nil {
globals = []interface{}{*find}
}
} else {
globals = GetStore().ScanTransGlobalStores(&position, int64(dtmimp.MustAtoi(sLimit)))
}
return map[string]interface{}{"transactions": globals, "next_position": position} return map[string]interface{}{"transactions": globals, "next_position": position}
} }

Loading…
Cancel
Save