index.vue 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. <template>
  2. <el-container>
  3. <el-main class="page-main">
  4. <el-container>
  5. <el-header style="margin-bottom: 10px;">
  6. <query ref="searchForm" :form-config="query" @onSubmit="search" />
  7. </el-header>
  8. <el-main>
  9. <sheet ref="qtable" :api="this.$api.sysTracker.page" :columns="tableColumns" :data-query="dataQuery" :operates="operates" :float-type="'right'" :select-type="'selection'" />
  10. </el-main>
  11. </el-container>
  12. </el-main>
  13. <el-dialog :title="$t('tracker.detail')" :visible.sync="dialogVisible" width="70%">
  14. <el-form ref="form" label-width="120px">
  15. <el-form-item :label="$t('tracker.ipAddress').concat(':')" class="notice-input" label-width="120px">
  16. <el-input v-model="temp.client_ip" />
  17. </el-form-item>
  18. <el-form-item :label="$t('tracker.reqHeader').concat(':')" class="notice-input" label-width="120px">
  19. <el-input v-model="temp.header" type="textarea" :autosize="{minRows:4}" />
  20. </el-form-item>
  21. <el-form-item :label="$t('tracker.reqAddress').concat(':')" class="notice-input" label-width="120px">
  22. <el-input v-model="temp.path" />
  23. </el-form-item>
  24. <el-form-item :label="$t('tracker.reqContent').concat(':')" class="notice-input" label-width="120px">
  25. <el-input v-model="temp.req_body" />
  26. </el-form-item>
  27. <el-form-item :label="$t('tracker.resContent').concat(':')" class="notice-input" label-width="120px">
  28. <el-input v-model="temp.res_body" type="textarea" :autosize="{minRows:4}" />
  29. </el-form-item>
  30. </el-form>
  31. </el-dialog>
  32. </el-container>
  33. </template>
  34. <script>
  35. import { mapGetters } from 'vuex'
  36. import moment from 'moment'
  37. import Sheet from '@/components/Sheet/index'
  38. import Query from '@/components/Query'
  39. import { tracker } from './query'
  40. export default {
  41. name: 'Tracker',
  42. components: {
  43. Sheet,
  44. Query
  45. },
  46. mixins: [tracker],
  47. data() {
  48. return {
  49. maps: [{ value: '', text: '' }],
  50. tableColumns: [
  51. {
  52. prop: 'user_name',
  53. label: 'User',
  54. align: 'center',
  55. minWidth: 150,
  56. maxWidth: 220
  57. },
  58. {
  59. prop: 'method',
  60. label: 'Method',
  61. align: 'center',
  62. minWidth: 150,
  63. maxWidth: 180
  64. },
  65. {
  66. prop: 'create_time',
  67. label: 'ReqTime',
  68. align: 'center',
  69. minWidth: 150,
  70. maxWidth: 180,
  71. formatter: (row, column) => {
  72. return moment(row.create_time).format('YYYY/MM/DD HH:mm:ss')
  73. }
  74. },
  75. {
  76. prop: 'path',
  77. label: 'ReqPath',
  78. align: 'left',
  79. minWidth: 180,
  80. maxWidth: 180,
  81. formatter: (row, column) => {
  82. return row.path.split('?')[0]
  83. }
  84. },
  85. {
  86. prop: 'status_code',
  87. label: 'Status',
  88. align: 'center',
  89. minWidth: 150,
  90. maxWidth: 180
  91. }
  92. ],
  93. operates: {
  94. list: [
  95. {
  96. label: '详情',
  97. show: true,
  98. type: 'text',
  99. method: row => {
  100. this.detail(row)
  101. }
  102. }
  103. ],
  104. width: 150
  105. },
  106. dataQuery: {
  107. page: 1,
  108. size: 10,
  109. name: '',
  110. code: ''
  111. },
  112. rules: {
  113. name: [{ required: true, message: '请输入名称', trigger: 'blur' }],
  114. code: [{ required: true, message: '请输入编码', trigger: 'blur' }]
  115. },
  116. temp: {
  117. user_name: '',
  118. status_code: '',
  119. latency: '',
  120. client_ip: '',
  121. method: '',
  122. path: '',
  123. create_time: '',
  124. header: '',
  125. req_body: '',
  126. res_body: ''
  127. },
  128. dataLoading: false,
  129. dialogStatus: '',
  130. dialogVisible: false
  131. }
  132. },
  133. computed: {
  134. ...mapGetters(['size', 'minMainHeight'])
  135. },
  136. watch: {
  137. maps(val) {
  138. this.temp.value = JSON.stringify(val)
  139. }
  140. },
  141. created() {},
  142. methods: {
  143. search(obj) {
  144. this.$refs.qtable.getData(obj)
  145. },
  146. resetFields() {
  147. this.$refs['searchForm'].resetFields()
  148. this.$refs.qtable.getData()
  149. },
  150. dialogClose() {
  151. this.$refs['temp'].resetFields()
  152. this.maps = [{ value: '', text: '' }]
  153. },
  154. detail(row) {
  155. this.temp = Object.assign({}, row)
  156. this.$api.sysTracker.get({ id: row.id }).then(res => {
  157. const { data: { header, res_body, req_body }} = res
  158. this.temp.header = header && decodeURIComponent(atob(header))
  159. this.temp.res_body = res_body && JSON.stringify(JSON.parse(decodeURIComponent(atob(res_body))), null, '\t')
  160. this.temp.req_body = req_body && JSON.stringify(JSON.parse(decodeURIComponent(atob(req_body))), null, '\t')
  161. this.dialogVisible = true
  162. })
  163. }
  164. }
  165. }
  166. </script>
  167. <style>
  168. .repair-item .oprate {
  169. color: #409eff;
  170. }
  171. .repair-item .button {
  172. width: 100%;
  173. height: 30px;
  174. line-height: 30px;
  175. text-align: center;
  176. border: 2px dotted #eee;
  177. background-color: white;
  178. }
  179. </style>