ErrorLog.vue 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. <template>
  2. <div class="errorLogContainer">
  3. <!--操作-->
  4. <div class="mr3 rowSS">
  5. <el-button type="primary" @click="errorLogProd">错误日志测试</el-button>
  6. <el-button type="primary" @click="multiDelBtnClick">
  7. <!-- 感觉写法复杂了-->
  8. <el-icon style="vertical-align: middle">
  9. <Delete />
  10. </el-icon>
  11. <span style="vertical-align: middle">删除</span>
  12. </el-button>
  13. <!--条件搜索-->
  14. <el-form ref="refsearchForm" :inline="true" class="demo-searchForm ml2">
  15. <el-form-item label-width="0px" label="" prop="errorLog" label-position="left">
  16. <el-input v-model="searchForm.errorLog" class="w-150px" placeholder="错误日志" />
  17. </el-form-item>
  18. <el-form-item label-width="0px" label="" prop="pageUrl" label-position="left">
  19. <el-input v-model="searchForm.pageUrl" class="w-200px" placeholder="页面路径" />
  20. </el-form-item>
  21. <el-form-item label-width="0px" label="" prop="createTime" label-position="left">
  22. <el-date-picker
  23. v-model="startEndArr"
  24. type="datetimerange"
  25. format="YYYY-MM-DD"
  26. value-format="YYYY-MM-DD HH:mm:ss"
  27. class="w-250px"
  28. range-separator="-"
  29. start-placeholder="开始日期"
  30. end-placeholder="结束日期"
  31. @change="dateTimePacking"
  32. />
  33. </el-form-item>
  34. </el-form>
  35. <!--查询按钮-->
  36. <el-button @click="searchBtnClick">查询</el-button>
  37. </div>
  38. <!--表格和分页-->
  39. <el-table
  40. id="resetElementDialog"
  41. ref="refuserTable"
  42. :height="`calc(100vh - ${settings.delWindowHeight})`"
  43. border
  44. :data="usertableData"
  45. @selection-change="handleSelectionChange"
  46. >
  47. <el-table-column type="selection" align="center" width="50" />
  48. <el-table-column align="center" prop="errorLog" label="错误日志" width="450">
  49. <template #default="{ row }">
  50. <div>{{ row.errorLog }}</div>
  51. <el-button type="text" size="small" @click="consoleToPlatform(row.errorLog)">
  52. click it console to platform to track
  53. </el-button>
  54. </template>
  55. </el-table-column>
  56. <el-table-column align="center" prop="pageUrl" label="页面路径" min-width="180" />
  57. <el-table-column align="center" prop="version" label="版本号" width="60" />
  58. <el-table-column align="center" prop="browserType" label="浏览器类型" min-width="180" />
  59. <el-table-column align="center" prop="createTime" label="创建时间" width="140" />
  60. <!--点击操作-->
  61. <el-table-column fixed="right" align="center" label="操作" width="80">
  62. <template #default="{ row }">
  63. <el-button type="text" size="small" @click="tableDelClick(row)">删除</el-button>
  64. </template>
  65. </el-table-column>
  66. </el-table>
  67. <!--分页-->
  68. <div class="columnCC mt2">
  69. <el-pagination
  70. :current-page="pageNum"
  71. :page-sizes="[10, 20, 50, 100]"
  72. :page-size="pageSize"
  73. layout="total, sizes, prev, pager, next, jumper"
  74. :total="totalPage"
  75. @size-change="handleSizeChange"
  76. @current-change="handleCurrentChange"
  77. />
  78. </div>
  79. <!--详情-->
  80. <el-dialog
  81. v-if="detailDialog"
  82. v-model="detailDialog"
  83. :title="dialogTitle"
  84. width="40vw"
  85. :close-on-click-modal="false"
  86. >
  87. <div class="detail-container rowBC elODialogModalBodyH60vh">
  88. <div class="detail-container-item">DBC文件名:{{ detailData.username }}</div>
  89. </div>
  90. <div class="detail-container rowBC elODialogModalBodyH60vh">
  91. <div v-if="detailData.status === 1" class="detail-container-item" style="color: green">状态: 启用</div>
  92. <div v-else class="detail-container-item">状态: 停用</div>
  93. </div>
  94. <div class="detail-container rowBC elODialogModalBodyH60vh">
  95. <div class="detail-container-item">说明:{{ detailData.remark }}</div>
  96. </div>
  97. <template #footer>
  98. <span class="dialog-footer">
  99. <el-button type="primary" @click="detailDialog = false">确 定</el-button>
  100. </span>
  101. </template>
  102. </el-dialog>
  103. <!--图片错误demo-->
  104. <img v-if="imgShow" src="http://img.png" />
  105. </div>
  106. </template>
  107. <script setup lang="ts">
  108. import { Delete } from '@element-plus/icons-vue'
  109. import settings from '@/settings'
  110. import bus from '@/utils/bus'
  111. /*
  112. * 一般根据页面层次来排序 如此页面 表格查询和筛选->table的操作
  113. * 每个模块按:响应数据定义->公用方法->请求方法->页面按钮操作方法 进行排序
  114. * */
  115. let testData = ref('testData')
  116. onMounted(() => {
  117. console.log('testData', testData)
  118. })
  119. const errorLogProd = () => {
  120. throw new Error('产生的错误日志')
  121. }
  122. const consoleToPlatform = (err: any) => {
  123. //加个custom不收集
  124. console.error('custom' + err)
  125. }
  126. //img loader err test
  127. let imgShow = ref(false)
  128. const errorLogImg = () => {
  129. imgShow.value = !imgShow.value
  130. }
  131. /*表格查询和筛选*/
  132. let usertableData = ref([])
  133. import packages from '../../../package.json'
  134. let searchForm: ObjTy = reactive({
  135. errorLog: '',
  136. pageUrl: `https://github.jzfai.top/${packages.name}`,
  137. createTime: '',
  138. id: ''
  139. })
  140. let { totalPage, startEndArr, dialogTitle, detailDialog }: any = useCommon()
  141. let selectPageReq = () => {
  142. const data = Object.assign(searchForm, {
  143. pageNum: pageNum,
  144. pageSize: pageSize
  145. })
  146. Object.keys(data).forEach((fItem) => {
  147. if (data[fItem] === '' || data[fItem] === null || data[fItem] === undefined) delete data[fItem]
  148. })
  149. let reqConfig = {
  150. url: '/integration-front/errorCollection/selectPage',
  151. method: 'get',
  152. data,
  153. isParams: true,
  154. bfLoading: false,
  155. isAlertErrorMsg: false
  156. }
  157. axiosReq(reqConfig).then((resData: any) => {
  158. usertableData.value = resData.data?.records
  159. totalPage.value = resData.data?.total
  160. })
  161. }
  162. import tablePageHook from '@/hooks/useTablePage'
  163. import { ObjTy } from '~/common'
  164. let { pageNum, pageSize, handleCurrentChange, handleSizeChange } = tablePageHook(selectPageReq)
  165. const dateTimePacking = (timeArr: any) => {
  166. if (timeArr && timeArr.length === 2) {
  167. searchForm.startTime = timeArr[0]
  168. searchForm.endTime = timeArr[1]
  169. } else {
  170. searchForm.startTime = ''
  171. searchForm.endTime = ''
  172. }
  173. }
  174. onMounted(() => {
  175. selectPageReq()
  176. bus.on('reloadErrorPage', () => {
  177. selectPageReq()
  178. })
  179. })
  180. const searchBtnClick = () => {
  181. pageNum.value = 1
  182. selectPageReq()
  183. }
  184. /*添加和修改*/
  185. /*详情*/
  186. let detailData: any = ref({})
  187. /*删除*/
  188. let { elConfirm, elMessage } = useElement()
  189. let deleteByIdReq = (id: any) => {
  190. return axiosReq({
  191. url: '/integration-front/errorCollection/deleteById',
  192. data: { id: id },
  193. isParams: true,
  194. method: 'delete',
  195. bfLoading: true
  196. })
  197. }
  198. let tableDelClick = async (row: any) => {
  199. await elConfirm('确定', `您确定要删除【${row.pageUrl}】吗?`)
  200. .then(() => {
  201. deleteByIdReq(row.id).then(() => {
  202. selectPageReq()
  203. elMessage(`【${row.pageUrl}】删除成功`)
  204. })
  205. })
  206. //不写catch会报错
  207. .catch(() => {})
  208. }
  209. /*批量删除*/
  210. let multipleSelection = ref([])
  211. const handleSelectionChange = (val: any) => {
  212. multipleSelection.value = val
  213. }
  214. const multiDelBtnClick = async () => {
  215. let rowDeleteIdArr: Array<any> = []
  216. let deleteNameTitle = ''
  217. rowDeleteIdArr = multipleSelection.value.map((mItem: any) => {
  218. deleteNameTitle = deleteNameTitle + mItem.pageUrl + ','
  219. return mItem.id
  220. })
  221. if (rowDeleteIdArr.length === 0) {
  222. elMessage('表格选项不能为空', 'warning')
  223. return
  224. }
  225. let stringLength = deleteNameTitle.length - 1
  226. await elConfirm('删除', `您确定要删除【${deleteNameTitle.slice(0, stringLength)}】吗`)
  227. const data = rowDeleteIdArr
  228. axiosReq({
  229. url: `/integration-front/errorCollection/deleteBatchIds`,
  230. data,
  231. method: 'DELETE',
  232. bfLoading: true
  233. }).then(() => {
  234. elMessage('删除成功')
  235. selectPageReq()
  236. })
  237. }
  238. </script>
  239. <style scoped lang="scss">
  240. /*详情*/
  241. .detail-container {
  242. flex-wrap: wrap;
  243. }
  244. .detail-container-item {
  245. min-width: 40%;
  246. margin-bottom: 20px;
  247. }
  248. .detailDialog-title {
  249. margin-bottom: 14px;
  250. font-weight: bold;
  251. font-size: 16px;
  252. }
  253. </style>