houzhongjian
2024-08-08 820397e43a0b64d35c6d31d2a55475061438593b
提交 | 用户 | 时间
820397 1 <template>
H 2   <ContentWrap>
3     <!-- 搜索工作栏 -->
4     <el-form
5       class="-mb-15px"
6       :model="queryParams"
7       ref="queryFormRef"
8       :inline="true"
9       label-width="68px"
10     >
11       <el-form-item label="用户编号" prop="userId">
12         <el-input
13           v-model="queryParams.userId"
14           placeholder="请输入用户编号"
15           clearable
16           @keyup.enter="handleQuery"
17           class="!w-240px"
18         />
19       </el-form-item>
20       <el-form-item label="用户类型" prop="userType">
21         <el-select
22           v-model="queryParams.userType"
23           placeholder="请选择用户类型"
24           clearable
25           class="!w-240px"
26         >
27           <el-option
28             v-for="dict in getIntDictOptions(DICT_TYPE.USER_TYPE)"
29             :key="dict.value"
30             :label="dict.label"
31             :value="dict.value"
32           />
33         </el-select>
34       </el-form-item>
35       <el-form-item label="应用名" prop="applicationName">
36         <el-input
37           v-model="queryParams.applicationName"
38           placeholder="请输入应用名"
39           clearable
40           @keyup.enter="handleQuery"
41           class="!w-240px"
42         />
43       </el-form-item>
44       <el-form-item label="异常时间" prop="exceptionTime">
45         <el-date-picker
46           v-model="queryParams.exceptionTime"
47           value-format="YYYY-MM-DD HH:mm:ss"
48           type="daterange"
49           start-placeholder="开始日期"
50           end-placeholder="结束日期"
51           :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
52           class="!w-240px"
53         />
54       </el-form-item>
55       <el-form-item label="处理状态" prop="processStatus">
56         <el-select
57           v-model="queryParams.processStatus"
58           placeholder="请选择处理状态"
59           clearable
60           class="!w-240px"
61         >
62           <el-option
63             v-for="dict in getIntDictOptions(DICT_TYPE.INFRA_API_ERROR_LOG_PROCESS_STATUS)"
64             :key="dict.value"
65             :label="dict.label"
66             :value="dict.value"
67           />
68         </el-select>
69       </el-form-item>
70       <el-form-item>
71         <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
72         <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
73         <el-button
74           type="success"
75           plain
76           @click="handleExport"
77           :loading="exportLoading"
78           v-hasPermi="['infra:api-error-log:export']"
79         >
80           <Icon icon="ep:download" class="mr-5px" /> 导出
81         </el-button>
82       </el-form-item>
83     </el-form>
84   </ContentWrap>
85
86   <!-- 列表 -->
87   <ContentWrap>
88     <el-table v-loading="loading" :data="list">
89       <el-table-column label="日志编号" align="center" prop="id" />
90       <el-table-column label="用户编号" align="center" prop="userId" />
91       <el-table-column label="用户类型" align="center" prop="userType">
92         <template #default="scope">
93           <dict-tag :type="DICT_TYPE.USER_TYPE" :value="scope.row.userType" />
94         </template>
95       </el-table-column>
96       <el-table-column label="应用名" align="center" prop="applicationName" width="200" />
97       <el-table-column label="请求方法" align="center" prop="requestMethod" width="80" />
98       <el-table-column label="请求地址" align="center" prop="requestUrl" width="180" />
99       <el-table-column
100         label="异常发生时间"
101         align="center"
102         prop="exceptionTime"
103         width="180"
104         :formatter="dateFormatter"
105       />
106       <el-table-column label="异常名" align="center" prop="exceptionName" width="180" />
107       <el-table-column label="处理状态" align="center" prop="processStatus">
108         <template #default="scope">
109           <dict-tag
110             :type="DICT_TYPE.INFRA_API_ERROR_LOG_PROCESS_STATUS"
111             :value="scope.row.processStatus"
112           />
113         </template>
114       </el-table-column>
115       <el-table-column label="操作" align="center" width="200">
116         <template #default="scope">
117           <el-button
118             link
119             type="primary"
120             @click="openDetail(scope.row)"
121             v-hasPermi="['infra:api-error-log:query']"
122           >
123             详细
124           </el-button>
125           <el-button
126             link
127             type="primary"
128             v-if="scope.row.processStatus === InfraApiErrorLogProcessStatusEnum.INIT"
129             @click="handleProcess(scope.row.id, InfraApiErrorLogProcessStatusEnum.DONE)"
130             v-hasPermi="['infra:api-error-log:update-status']"
131           >
132             已处理
133           </el-button>
134           <el-button
135             link
136             type="primary"
137             v-if="scope.row.processStatus === InfraApiErrorLogProcessStatusEnum.INIT"
138             @click="handleProcess(scope.row.id, InfraApiErrorLogProcessStatusEnum.IGNORE)"
139             v-hasPermi="['infra:api-error-log:update-status']"
140           >
141             已忽略
142           </el-button>
143         </template>
144       </el-table-column>
145     </el-table>
146     <!-- 分页组件 -->
147     <Pagination
148       :total="total"
149       v-model:page="queryParams.pageNo"
150       v-model:limit="queryParams.pageSize"
151       @pagination="getList"
152     />
153   </ContentWrap>
154
155   <!-- 表单弹窗:详情 -->
156   <ApiErrorLogDetail ref="detailRef" />
157 </template>
158
159 <script lang="ts" setup>
160 import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
161 import { dateFormatter } from '@/utils/formatTime'
162 import download from '@/utils/download'
163 import * as ApiErrorLogApi from '@/api/infra/apiErrorLog'
164 import ApiErrorLogDetail from './ApiErrorLogDetail.vue'
165 import { InfraApiErrorLogProcessStatusEnum } from '@/utils/constants'
166
167 defineOptions({ name: 'InfraApiErrorLog' })
168
169 const message = useMessage() // 消息弹窗
170
171 const loading = ref(true) // 列表的加载中
172 const total = ref(0) // 列表的总页数
173 const list = ref([]) // 列表的数据
174 const queryParams = reactive({
175   pageNo: 1,
176   pageSize: 10,
177   userId: null,
178   userType: null,
179   applicationName: null,
180   requestUrl: null,
181   processStatus: null,
182   exceptionTime: []
183 })
184 const queryFormRef = ref() // 搜索的表单
185 const exportLoading = ref(false) // 导出的加载中
186
187 /** 查询列表 */
188 const getList = async () => {
189   loading.value = true
190   try {
191     const data = await ApiErrorLogApi.getApiErrorLogPage(queryParams)
192     list.value = data.list
193     total.value = data.total
194   } finally {
195     loading.value = false
196   }
197 }
198
199 /** 搜索按钮操作 */
200 const handleQuery = () => {
201   queryParams.pageNo = 1
202   getList()
203 }
204
205 /** 重置按钮操作 */
206 const resetQuery = () => {
207   queryFormRef.value.resetFields()
208   handleQuery()
209 }
210
211 /** 详情操作 */
212 const detailRef = ref()
213 const openDetail = (data: ApiErrorLogApi.ApiErrorLogVO) => {
214   detailRef.value.open(data)
215 }
216
217 /** 处理已处理 / 已忽略的操作 **/
218 const handleProcess = async (id: number, processStatus: number) => {
219   try {
220     // 操作的二次确认
221     const type = processStatus === InfraApiErrorLogProcessStatusEnum.DONE ? '已处理' : '已忽略'
222     await message.confirm('确认标记为' + type + '?')
223     // 执行操作
224     await ApiErrorLogApi.updateApiErrorLogPage(id, processStatus)
225     await message.success(type)
226     // 刷新列表
227     await getList()
228   } catch {}
229 }
230
231 /** 导出按钮操作 */
232 const handleExport = async () => {
233   try {
234     // 导出的二次确认
235     await message.exportConfirm()
236     // 发起导出
237     exportLoading.value = true
238     const data = await ApiErrorLogApi.exportApiErrorLog(queryParams)
239     download.excel(data, '异常日志.xls')
240   } catch {
241   } finally {
242     exportLoading.value = false
243   }
244 }
245
246 /** 初始化 **/
247 onMounted(() => {
248   getList()
249 })
250 </script>