潘志宝
2024-10-31 13c97d76348b5451381320aa54efa0706f38ecb6
提交 | 用户 | 时间
30566d 1 <template>
H 2   <!-- 搜索 -->
3   <ContentWrap>
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="status">
12         <el-select
13           v-model="queryParams.brand"
14           placeholder="品牌"
15           clearable
16           class="!w-120px"
17         >
18           <el-option
19             v-for="dict in getIntDictOptions(DICT_TYPE.CAMERA_BRAND)"
20             :key="dict.value"
21             :label="dict.label"
22             :value="dict.value"
23           />
24         </el-select>
25       </el-form-item>
26       <el-form-item label="编号" prop="code">
27         <el-input
28           v-model="queryParams.code"
29           placeholder="请输入编号"
30           clearable
31           @keyup.enter="handleQuery"
32           class="!w-120px"
33         />
34       </el-form-item>
35       <el-form-item label="IP" prop="name">
36         <el-input
37           v-model="queryParams.ip"
38           placeholder="请输入IP"
39           clearable
40           @keyup.enter="handleQuery"
41           class="!w-120px"
42         />
43       </el-form-item>
44       <el-form-item label="名称" prop="name">
45         <el-input
46           v-model="queryParams.name"
47           placeholder="请输入名称"
48           clearable
49           @keyup.enter="handleQuery"
50           class="!w-120px"
51         />
52       </el-form-item>
53       <el-form-item>
54         <el-button @click="handleQuery">
55           <Icon icon="ep:search" class="mr-5px" />
56           搜索
57         </el-button>
58         <el-button @click="resetQuery">
59           <Icon icon="ep:refresh" class="mr-5px" />
60           重置
61         </el-button>
62         <el-button
63           type="primary"
64           plain
65           @click="openForm('create')"
66           v-hasPermi="['dev:nvr:save']"
67         >
68           <Icon icon="ep:plus" class="mr-5px" />
69           新增
70         </el-button>
71         <el-button
72           type="success"
73           plain
74           @click="handleExport"
75           :loading="exportLoading"
76           v-hasPermi="['dev:nvr:export']"
77         >
78           <Icon icon="ep:download" class="mr-5px" />
79           导出
80         </el-button>
81       </el-form-item>
82     </el-form>
83   </ContentWrap>
84
85   <!-- 列表 -->
86   <ContentWrap>
87     <el-table v-loading="loading" :data="list">
88       <el-table-column label="品牌" align="center" prop="brand" width="80">
89         <template #default="scope">
90           <dict-tag :type="DICT_TYPE.CAMERA_BRAND" :value="scope.row.brand" />
91         </template>
92       </el-table-column>
93       <el-table-column label="设备类型" align="center" prop="device" width="200"/>
94       <el-table-column label="位置" align="center" prop="position" />
95       <el-table-column label="编码" align="center" prop="code" width="100"/>
96       <el-table-column label="名称" align="center" prop="name"/>
97       <el-table-column label="IP" align="center" prop="ip" />
98       <el-table-column label="端口" align="center" prop="port" width="100"/>
99       <el-table-column label="用户名" align="center" prop="username" width="100"/>
100       <el-table-column label="状态" prop="status" width="80">
101         <template #default="scope">
102           <dict-tag :type="DICT_TYPE.NVR_ONLINE_STATUS" :value="scope.row.status" />
103         </template>
104       </el-table-column>
105       <el-table-column label="位置" align="center" prop="position" />
106       <el-table-column label="备注" align="center" prop="remark" width="150"/>
107       <el-table-column label="操作" align="center" min-width="110" fixed="right">
108         <template #default="scope">
109           <el-button
110             link
111             type="primary"
112             @click="openForm('update', scope.row.id)"
113             v-hasPermi="['dev:nvr:update']"
114           >
115             编辑
116           </el-button>
117           <el-button
118             link
119             type="danger"
120             @click="handleDelete(scope.row.id)"
121             v-hasPermi="['dev:nvr:delete']"
122           >
123             删除
124           </el-button>
125           <el-button v-if="scope.row.brand == 1" type="text" size="small" @click="cameraHandle(scope.row.id)">摄像头</el-button>
126         </template>
127       </el-table-column>
128     </el-table>
129     <!-- 分页 -->
130     <Pagination
131       :total="total"
132       v-model:page="queryParams.pageNo"
133       v-model:limit="queryParams.pageSize"
134       @pagination="getList"
135     />
136   </ContentWrap>
137
138   <!-- 表单弹窗:添加/修改 -->
139   <NvrForm ref="formRef" @success="getList" />
140
141   <!-- 弹窗, 摄像头 -->
142   <Camera ref="devCameraRef"/>
143
144 </template>
145 <script lang="ts" setup>
146 import {DICT_TYPE, getIntDictOptions} from '@/utils/dict'
147   import download from '@/utils/download'
148   import * as NvrApi from '@/api/data/dev/nvr'
149   import NvrForm from './NvrForm.vue'
150   import Camera from '../camera/camera.vue'
151
152   defineOptions({name: 'Nvr'})
153
154   const message = useMessage() // 消息弹窗
155   const {t} = useI18n() // 国际化
156
157   const loading = ref(true) // 列表的加载中
158   const total = ref(0) // 列表的总页数
159   const list = ref([]) // 列表的数据
160   const queryParams = reactive({
161     pageNo: 1,
162     pageSize: 10,
163     brand: undefined,
164     ip: undefined,
165     code: undefined,
166     name: undefined,
167     status: undefined
168   })
169   const queryFormRef = ref() // 搜索的表单
170   const exportLoading = ref(false) // 导出的加载中
171
172   const devCameraRef = ref()
173
174   /** 查询列表 */
175   const getList = async () => {
176     loading.value = true
177     try {
178       const data = await NvrApi.getNvrPage(queryParams)
179       list.value = data.list
180       total.value = data.total
181     } finally {
182       loading.value = false
183     }
184   }
185
186   const cameraHandle = (id: string) => {
187     // devCameraVisible.value = true
188     devCameraRef.value.open(id)
189   }
190
191   /** 搜索按钮操作 */
192   const handleQuery = () => {
193     queryParams.pageNo = 1
194     getList()
195   }
196
197   /** 重置按钮操作 */
198   const resetQuery = () => {
199     queryFormRef.value.resetFields()
200     handleQuery()
201   }
202
203   /** 添加/修改操作 */
204   const formRef = ref()
205   const openForm = (type: string, id?: number) => {
206     formRef.value.open(type, id)
207   }
208
209   /** 删除按钮操作 */
210   const handleDelete = async (id: number) => {
211     try {
212       // 删除的二次确认
213       await message.delConfirm()
214       // 发起删除
215       await NvrApi.deleteNvr(id)
216       message.success(t('common.delSuccess'))
217       // 刷新列表
218       await getList()
219     } catch {
220     }
221   }
222
223   /** 导出按钮操作 */
224   const handleExport = async () => {
225     try {
226       // 导出的二次确认
227       await message.exportConfirm()
228       // 发起导出
229       exportLoading.value = true
230       const data = await NvrApi.exportNvr(queryParams)
231       download.excel(data, '录像机列表.xls')
232     } catch {
233     } finally {
234       exportLoading.value = false
235     }
236   }
237
238   /** 初始化 **/
239   onMounted(async () => {
240     await getList()
241   })
242 </script>