index.vue 5.0 KB

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