LinYeFangHuo/src/views/demo/fire/firemonitor/index.vue

296 lines
7.2 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<div id="custom-container" ref="customContainer" class="custom-modal-container" >
<PageWrapper dense contentFullHeight fixedHeight contentClass="flex" >
<!-- 搜索表格分页 -->
<BasicTable @register="registerTable" :searchInfo="searchInfo">
<template #toolbar>
<PermissionBtn @btn-event="onBtnClicked" />
</template>
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'model'">
{{ cameraTypes[record.model] }}
</template>
<template v-if="column.key === 'action'">
<TableAction
:actions="[
{
// icon: 'ant-design:ellipsis-outlined',
label: '详情',
onClick: viewDetail.bind(null, record),
},
]"
/>
</template>
</template>
</BasicTable>
<!-- 添加 & 编辑-->
<a-modal
v-model:visible="addModelVisible"
title="摄像头信息"
width="70%"
@ok="handleOk"
:get-container="getContainer"
wrap-class-name="modal"
:mask="true"
:keyboard="false"
>
<AddModal ref="AddModalRef" />
</a-modal>
<!-- 详情 -->
<a-modal
v-model:visible="detailModelVisible"
:get-container="getContainer"
title="摄像头信息"
wrap-class-name="modal"
width="70%"
:footer="null"
:mask="true"
:keyboard="false"
>
<Detail :detailInfo="detailInfo" @close="closeDetail" />
</a-modal>
</PageWrapper>
</div>
</template>
<script lang="ts" setup>
import { reactive, ref, onMounted } from 'vue';
import { BasicTable, useTable, TableAction } from '@/components/Table';
import { getOrgList,GetCameraInfoPageList, deleteDept } from '@/api/demo/system';
import { PageWrapper } from '@/components/Page';
import { useMessage } from '@/hooks/web/useMessage';
import { AddModal, Detail } from './page';
import { PermissionBtn } from '@/components/PermissionBtn/index';
import { columns, searchFormSchema } from './data';
import axios from 'axios';
import { getAppEnvConfig } from '@/utils/env';
let { VITE_GLOB_API_URL } = getAppEnvConfig();
defineOptions({ name: 'DeptManagement' });
const { createConfirm, createMessage } = useMessage();
const AddModalRef = ref();
const searchInfo = reactive<Recordable>({});
const addModelVisible = ref(false);
const detailModelVisible = ref(false);
const modalContainer = ref(null)
const customContainer = ref(null)
const getContainer = () => {
console.log('getContainer called')
// 方法1使用ref推荐
// if (customContainer.value) {
// console.log('使用ref获取容器:', customContainer.value)
// return customContainer.value
// }
// 方法2使用ID选择器
const container = document.getElementById('custom-container')
if (container) {
console.log('使用ID获取容器:', container)
return container
}
// 方法3使用querySelector
const queryContainer = document.querySelector('.custom-modal-container')
if (queryContainer) {
console.log('使用class获取容器:', queryContainer)
return queryContainer
}
console.warn('未找到自定义容器使用body作为fallback')
return document.body
}
const [registerTable, { reload, getSelectRows, clearSelectedRowKeys }] = useTable({
// 表格名称
title: '摄像头列表',
// 获取数据的接口
api: GetCameraInfoPageList,
// 表单列信息 BasicColumn[]
columns,
rowKey: 'id',
formConfig: {
labelWidth: 120,
schemas: searchFormSchema,
},
// 使用搜索表单
useSearchForm: true,
// 显示表格设置工具
showTableSetting: true,
// 是否显示表格边框
bordered: true,
// 序号列
showIndexColumn: false,
// 勾选列
rowSelection: {
//多选框
// type: 'checkbox',
type: 'radio',
},
// 搜索
handleSearchInfoFn(info) {
return info;
},
actionColumn: {
width: 80,
title: '操作',
dataIndex: 'action',
// slots: { customRender: 'action' },
fixed: undefined,
},
});
const childRef = ref<any>();
function handleCreate() {
addModelVisible.value = true;
}
function handleEdit() {
let rows = getSelectRows();
if (rows.length == 0) {
return createMessage.warn('请选择一个站点进行编辑');
}
const record = rows[0];
addModelVisible.value = true;
}
function onBtnClicked(domId) {
switch (domId) {
case 'btnAdd':
handleCreate();
break;
case 'btnEdit':
handleEdit();
break;
case 'btnDelete':
handleDelete();
break;
case 'btnExport':
break;
default:
break;
}
}
function handleSuccess() {
clearSelectedRowKeys();
childRef.value.fetch();
reload();
}
const handleOk = () => {
AddModalRef.value.validateForm();
const params = AddModalRef.value.createSite();
addApi(params);
};
async function handleDelete() {
let rows = getSelectRows();
if (rows.length == 0) {
return createMessage.warn('请勾选一条数据进行删除');
}
const query = [rows[0].id];
createConfirm({
iconType: 'info',
title: '删除',
content: '确定要删除当前数据吗',
onOk: async () => {
// const data = await DeleteInterphoneInfo(query);
axios.delete(`${VITE_GLOB_API_URL}/api/Camera/Delete/${rows[0].id}`).then(res => {
if (res) {
handleSuccess();
createMessage.success('删除成功');
} else {
createMessage.error('删除失败');
}
})
},
});
}
const addApi = (params) => {
let url = "/api/Camera/Add";
axios({
method: "post",
url: VITE_GLOB_API_URL + url,
data: params,
headers: {
'X-Token': localStorage.getItem("X-Token")
}
}).then(res=>{
if(res){
addModelVisible.value = false;
}
})
}
const detailInfo = ref(null);
const viewDetail = (record: any) => {
detailInfo.value = record;
detailModelVisible.value = true;
};
const closeDetail = () => {
detailModelVisible.value = false;
};
const cameraTypes = ref({});
const getCameraType = () => {
let url = "/api/SysDataItemDetail/Load";
let querys = {
code:"FMCamera"
}
axios({
method: "get",
url: VITE_GLOB_API_URL + url,
params: querys,
headers: {
'X-Token': localStorage.getItem("X-Token")
}
}).then(res=>{
// cameraTypes.value =
res.data.result?.forEach((item,index)=>{
cameraTypes.value[item.itemValue] = item.itemName
})
})
}
getCameraType();
</script>
<style lang="less">
.full-modal {
.ant-modal {
max-width: 80%;
}
.ant-modal-content {
height: calc(80vh);
}
.ant-modal-body {
height: 100%;
}
}
</style>