<script setup lang="ts"> import axios from "axios"; import { onMounted, ref } from "vue"; import dplayer from "@/components/VideoPlayer/MyPlayer.vue"; import OurPlayer from "@/components/VideoPlayer/OurPlayer.vue"; import { ElMessageBox, ElMessage } from "element-plus"; import { getConfig } from "@/config"; import { getToken, formatToken } from "@/utils/auth"; defineOptions({ name: "Welcome" }); const AdminHostUrl = getConfig().AdminHostUrl; const formInline = ref({ date: [], policeId: "", event: "", violation: "", violationType: "" }); const currentPage = ref(1); const totalNumber = ref(0); const pageSize = ref(10); const isDisplay = true; const dialogVisible = ref(false); const tableData = ref([]); const eventMap = ref({}); const violationMap = ref({ "是": "1", "否": "0", "所有": "2" }) function playVideo(data) { data = JSON.parse(JSON.stringify(data)); // console.log(AdminHostUrl) dialogVisible.value = true; const highlights = [ // 进度条时间点高亮 { text: data.event_type, time: data.relative_time } ]; sessionStorage.setItem("video_url", data.video_dir); sessionStorage.setItem("highlights", JSON.stringify(highlights)); } function onSearch() { let start_time; let end_time; if (formInline.value.date) { start_time = formInline.value.date[0]; end_time = formInline.value.date[1]; } axios({ url: AdminHostUrl, params: { start_time: start_time || undefined, end_time: end_time || undefined, police_id: formInline.value.policeId || undefined, event_type: formInline.value.event || undefined, violation: violationMap.value[formInline.value.violation] || undefined, violation_type: formInline.value.violationType || undefined, page: currentPage.value || undefined, page_size: pageSize.value || undefined }, headers: { token: formatToken(getToken().accessToken) } }) .then(response => { // console.log(response.data); totalNumber.value = response.data.count; if (!isDisplay) { tableData.value = response.data.results.filter(data => { return data.is_display === true; }); } else { tableData.value = response.data.results; } }) .catch(error => { ElMessage({ message: "网络暂不通畅", type: "warning" }) console.log(error); }); } function handleSearch() { currentPage.value = 1; onSearch(); } function handleRefresh() { onSearch(); } function handleSizeChange(val) { pageSize.value = val; onSearch(); } function handleCurrentChange(val) { currentPage.value = val; onSearch(); } const handleClose = (done: () => void) => { ElMessageBox.confirm("确定关掉此视频") .then(() => { dialogVisible.value = false; done(); }) .catch(() => { // catch error }); }; function getEvents() { axios({ url: AdminHostUrl + "events", headers: { token: formatToken(getToken().accessToken) } }) .then(response => { eventMap.value = response.data.data; // console.log(eventMap.value); }) .catch(error => { ElMessage({ message: "网络暂不通畅", type: "warning" }) console.log(error); }); } function pickerOptions(time){ return time.getTime() > Date.now() } const now_date = new Date(); now_date.setMonth(now_date.getMonth() - 1) const lastMonth = now_date onMounted(() => { onSearch(); }); </script> <template> <div class="hello"> <el-dialog width="60%" v-model="dialogVisible" :before-close="handleClose" destroy-on-close > <our-player></our-player> </el-dialog> <el-form :inline="true" :model="formInline" class="demo-form-inline"> <el-form-item label="日期:" style="font-weight: bold"> <el-date-picker v-model="formInline.date" type="daterange" unlink-panels range-separator="--" start-placeholder="开始日期" end-placeholder="结束日期" value-format="YYYY-MM-DD" :disabled-date="pickerOptions" :default-value="lastMonth" /> </el-form-item> <el-form-item label="警号:"> <el-input v-model="formInline.policeId" placeholder="警号" clearable style="width: 198px" /> </el-form-item> <el-form-item label="违法行为:"> <!-- <el-input v-model="formInline.event" placeholder="事件"/>--> <el-select v-model="formInline.event" placeholder="违法行为" clearable @click="getEvents"> <el-option v-for="(event, type) in eventMap" :key="type" :label="event" :value="event"></el-option> </el-select> </el-form-item> <el-form-item label="是否违规:"> <el-select v-model="formInline.violation" placeholder="是否违规" clearable> <el-option v-for="(event, type) in violationMap" :key="event" :label="type" :value="type"></el-option> </el-select> </el-form-item> <el-form-item label="违规行为:"> <el-input v-model="formInline.violationType" placeholder="违规行为" clearable style="width: 198px" /> </el-form-item> <el-form-item> <el-button type="primary" @click="handleSearch">查询</el-button> </el-form-item> <el-form-item> <el-button @click="handleRefresh" >刷新 </el-button > </el-form-item> </el-form> <el-table :data="tableData" stripe :default-sort="{ prop: 'record_time', order: 'descending' }" style="width: 100%" > <el-table-column prop="record_time" sortable label="记录仪日期时间" /> <el-table-column prop="police_id" label="警号" /> <el-table-column prop="event_type" label="违法行为"> <!-- <template v-slot="scope">--> <!-- <span>--> <!-- {{ scope.row.event_type || "未定义事件" }}--> <!-- </span>--> <!-- </template>--> </el-table-column> <el-table-column prop="is_violation" label="是否违规"> <template v-slot="scope"> <span v-if="scope.row.is_violation">是</span> <span v-else>否</span> </template> </el-table-column> <el-table-column prop="ai_analysis" label="违规行为" /> <el-table-column prop="relative_time" label="时间点"> <template v-slot="scope"> <span>第 {{ scope.row.relative_time }} 秒</span> </template> </el-table-column> <el-table-column prop="small_image" label="缩率图"> <template v-slot="scope"> <el-image :preview-src-list="[scope.row.small_image]" style="width: 65px; height: 65px" :src="scope.row.small_image" :preview-teleported="true" /> </template> </el-table-column> <el-table-column prop="car_number" label="车牌号" /> <el-table-column show-overflow-tooltip label="视频"> <template v-slot="scope"> <el-button @click="playVideo(scope.row)"> <span v-if="scope.row.video_dir">播放视频</span> <span v-else>暂无视频</span> </el-button> </template> </el-table-column> </el-table> <el-pagination class="tablePage" @size-change="handleSizeChange" @current-change="handleCurrentChange" v-model:current-page="currentPage" :page-sizes="[10, 20, 30, 40]" v-model:page-size="pageSize" layout="total, sizes, prev, pager, next" :total="totalNumber" /> </div> </template> <style scoped> h3 { margin: 40px 0 0; } ul { list-style-type: none; padding: 0; } li { } a { color: #42b983; } .hello { margin: 5px auto; text-align: right; overflow: hidden; } .demo-form-inline { align-items: center; display: flex; justify-content: flex-end; margin: 0 auto; } .tablePage { display: flex; justify-content: flex-end; margin: 0 auto; } </style>