|
@@ -1,40 +1,158 @@
|
|
|
<template>
|
|
<template>
|
|
|
- <div>
|
|
|
|
|
- <el-button type="primary" @click="openDialog()">新增名单</el-button>
|
|
|
|
|
|
|
+ <div style="padding: 10px">
|
|
|
|
|
+ <!-- 搜索和操作 -->
|
|
|
|
|
+ <div style="height: 50px; display: flex; align-items: center; gap: 10px">
|
|
|
|
|
+ <!-- 选择设备 -->
|
|
|
|
|
+ <el-select
|
|
|
|
|
+ v-model="selectedDeviceId"
|
|
|
|
|
+ placeholder="选择设备"
|
|
|
|
|
+ size="small"
|
|
|
|
|
+ style="width: 150px"
|
|
|
|
|
+ clearable
|
|
|
|
|
+ @change="handleDeviceChange"
|
|
|
|
|
+ >
|
|
|
|
|
+ <el-option
|
|
|
|
|
+ v-for="device in devices"
|
|
|
|
|
+ :key="device.id"
|
|
|
|
|
+ :label="device.name"
|
|
|
|
|
+ :value="device.id"
|
|
|
|
|
+ />
|
|
|
|
|
+ </el-select>
|
|
|
|
|
+ <!-- 选择名单类型 -->
|
|
|
|
|
+ <el-select
|
|
|
|
|
+ v-model="selectedType"
|
|
|
|
|
+ placeholder="选择名单类型"
|
|
|
|
|
+ size="small"
|
|
|
|
|
+ style="width: 150px"
|
|
|
|
|
+ clearable
|
|
|
|
|
+ @change="handleTypeChange"
|
|
|
|
|
+ >
|
|
|
|
|
+ <el-option
|
|
|
|
|
+ v-for="type in types"
|
|
|
|
|
+ :key="type.value"
|
|
|
|
|
+ :label="type.label"
|
|
|
|
|
+ :value="type.value"
|
|
|
|
|
+ />
|
|
|
|
|
+ </el-select>
|
|
|
|
|
+ <!-- 输入车牌号 -->
|
|
|
|
|
+ <el-input
|
|
|
|
|
+ v-model="inputPlateNumber"
|
|
|
|
|
+ placeholder="输入车牌号"
|
|
|
|
|
+ size="small"
|
|
|
|
|
+ style="width: 150px"
|
|
|
|
|
+ clearable
|
|
|
|
|
+ @keyup.enter.native="handleSearch"
|
|
|
|
|
+ />
|
|
|
|
|
+ <el-button type="primary" size="small" @click="handleSearch"
|
|
|
|
|
+ >查询</el-button
|
|
|
|
|
+ >
|
|
|
|
|
+ <el-button type="primary" size="small" @click="handleAdd">新增</el-button>
|
|
|
|
|
+ <el-button
|
|
|
|
|
+ :disabled="multipleSelection.length === 0"
|
|
|
|
|
+ type="danger"
|
|
|
|
|
+ size="small"
|
|
|
|
|
+ @click="handleBatchDelete"
|
|
|
|
|
+ >批量删除</el-button
|
|
|
|
|
+ >
|
|
|
|
|
+ </div>
|
|
|
|
|
|
|
|
|
|
+ <!-- 表格 -->
|
|
|
<el-table
|
|
<el-table
|
|
|
:data="tableData"
|
|
:data="tableData"
|
|
|
- border
|
|
|
|
|
style="width: 100%; margin-top: 10px"
|
|
style="width: 100%; margin-top: 10px"
|
|
|
|
|
+ border
|
|
|
|
|
+ :header-cell-style="changeHeaderCellStyle"
|
|
|
|
|
+ @selection-change="handleSelectionChange"
|
|
|
v-loading="loading"
|
|
v-loading="loading"
|
|
|
|
|
+ element-loading-text="加载中..."
|
|
|
>
|
|
>
|
|
|
- <el-table-column prop="plate_number" label="序号" align="center" min-width="50" />
|
|
|
|
|
- <el-table-column prop="plate_number" label="车牌号" align="center" min-width="100" />
|
|
|
|
|
|
|
+ <el-table-column type="selection" align="center" width="50" />
|
|
|
|
|
+ <el-table-column label="序号" align="center" min-width="50" sortable>
|
|
|
|
|
+ <template #default="scope">
|
|
|
|
|
+ {{ (currentPage - 1) * pageSize + scope.$index + 1 }}
|
|
|
|
|
+ </template>
|
|
|
|
|
+ </el-table-column>
|
|
|
|
|
+ <el-table-column
|
|
|
|
|
+ prop="deviceId"
|
|
|
|
|
+ label="设备ID"
|
|
|
|
|
+ align="center"
|
|
|
|
|
+ min-width="100"
|
|
|
|
|
+ sortable
|
|
|
|
|
+ />
|
|
|
|
|
+ <el-table-column
|
|
|
|
|
+ prop="plateNumber"
|
|
|
|
|
+ label="车牌号"
|
|
|
|
|
+ align="center"
|
|
|
|
|
+ min-width="120"
|
|
|
|
|
+ sortable
|
|
|
|
|
+ />
|
|
|
|
|
+ <el-table-column
|
|
|
|
|
+ prop="cardNo"
|
|
|
|
|
+ label="卡号"
|
|
|
|
|
+ align="center"
|
|
|
|
|
+ min-width="120"
|
|
|
|
|
+ sortable
|
|
|
|
|
+ />
|
|
|
|
|
+ <el-table-column
|
|
|
|
|
+ prop="channel"
|
|
|
|
|
+ label="通道号"
|
|
|
|
|
+ align="center"
|
|
|
|
|
+ min-width="80"
|
|
|
|
|
+ sortable
|
|
|
|
|
+ />
|
|
|
|
|
+ <el-table-column
|
|
|
|
|
+ prop="plateType"
|
|
|
|
|
+ label="车牌类型"
|
|
|
|
|
+ align="center"
|
|
|
|
|
+ min-width="100"
|
|
|
|
|
+ :formatter="formatPlateType"
|
|
|
|
|
+ sortable
|
|
|
|
|
+ />
|
|
|
|
|
+ <el-table-column
|
|
|
|
|
+ prop="plateColor"
|
|
|
|
|
+ label="车牌颜色"
|
|
|
|
|
+ align="center"
|
|
|
|
|
+ min-width="100"
|
|
|
|
|
+ :formatter="formatPlateColor"
|
|
|
|
|
+ sortable
|
|
|
|
|
+ />
|
|
|
<el-table-column
|
|
<el-table-column
|
|
|
prop="type"
|
|
prop="type"
|
|
|
label="名单类型"
|
|
label="名单类型"
|
|
|
:formatter="formatType"
|
|
:formatter="formatType"
|
|
|
align="center"
|
|
align="center"
|
|
|
min-width="100"
|
|
min-width="100"
|
|
|
|
|
+ sortable
|
|
|
/>
|
|
/>
|
|
|
<el-table-column
|
|
<el-table-column
|
|
|
- prop="access_start_time"
|
|
|
|
|
|
|
+ prop="accessStartTime"
|
|
|
label="开始时间"
|
|
label="开始时间"
|
|
|
:formatter="formatTime"
|
|
:formatter="formatTime"
|
|
|
align="center"
|
|
align="center"
|
|
|
- min-width="200"
|
|
|
|
|
|
|
+ min-width="150"
|
|
|
|
|
+ sortable
|
|
|
/>
|
|
/>
|
|
|
<el-table-column
|
|
<el-table-column
|
|
|
- prop="access_end_time"
|
|
|
|
|
|
|
+ prop="accessEndTime"
|
|
|
label="结束时间"
|
|
label="结束时间"
|
|
|
:formatter="formatTime"
|
|
:formatter="formatTime"
|
|
|
align="center"
|
|
align="center"
|
|
|
- min-width="200"
|
|
|
|
|
|
|
+ min-width="150"
|
|
|
|
|
+ sortable
|
|
|
/>
|
|
/>
|
|
|
- <el-table-column label="操作" align="center" width="180">
|
|
|
|
|
|
|
+ <el-table-column
|
|
|
|
|
+ label="操作"
|
|
|
|
|
+ fixed="right"
|
|
|
|
|
+ align="center"
|
|
|
|
|
+ min-width="120"
|
|
|
|
|
+ >
|
|
|
<template #default="{ row }">
|
|
<template #default="{ row }">
|
|
|
- <el-button size="small" type="primary" @click="editRow(row)">编辑</el-button>
|
|
|
|
|
- <el-button size="small" type="danger" @click="deleteRow(row)">删除</el-button>
|
|
|
|
|
|
|
+ <el-button type="primary" size="small" @click="handleEdit(row)"
|
|
|
|
|
+ >编辑</el-button
|
|
|
|
|
+ >
|
|
|
|
|
+ <el-button type="danger" size="small" @click="handleDelete(row)"
|
|
|
|
|
+ >删除</el-button
|
|
|
|
|
+ >
|
|
|
</template>
|
|
</template>
|
|
|
</el-table-column>
|
|
</el-table-column>
|
|
|
</el-table>
|
|
</el-table>
|
|
@@ -42,205 +160,260 @@
|
|
|
<!-- 分页 -->
|
|
<!-- 分页 -->
|
|
|
<div style="margin-top: 15px; text-align: right">
|
|
<div style="margin-top: 15px; text-align: right">
|
|
|
<el-pagination
|
|
<el-pagination
|
|
|
- v-if="total > 0"
|
|
|
|
|
background
|
|
background
|
|
|
- layout="prev, pager, next"
|
|
|
|
|
- :total="total"
|
|
|
|
|
|
|
+ :current-page="currentPage"
|
|
|
:page-size="pageSize"
|
|
:page-size="pageSize"
|
|
|
|
|
+ :total="total"
|
|
|
|
|
+ :page-sizes="[10, 15, 20, 25, 30]"
|
|
|
|
|
+ layout="total, prev, pager, next, jumper, sizes"
|
|
|
@current-change="handlePageChange"
|
|
@current-change="handlePageChange"
|
|
|
|
|
+ @size-change="handleSizeChange"
|
|
|
/>
|
|
/>
|
|
|
</div>
|
|
</div>
|
|
|
-
|
|
|
|
|
- <!-- 弹窗 -->
|
|
|
|
|
- <el-dialog :title="dialogTitle" v-model="dialogVisible" width="500px">
|
|
|
|
|
- <el-form :model="form" :rules="rules" ref="formRef" label-width="100px">
|
|
|
|
|
- <el-form-item label="车牌号" prop="plate_number">
|
|
|
|
|
- <el-input v-model="form.plate_number" />
|
|
|
|
|
- </el-form-item>
|
|
|
|
|
- <el-form-item label="名单类型" prop="type">
|
|
|
|
|
- <el-select v-model="form.type" placeholder="请选择">
|
|
|
|
|
- <el-option label="白名单" value="whitelist" />
|
|
|
|
|
- <el-option label="黑名单" value="blacklist" />
|
|
|
|
|
- </el-select>
|
|
|
|
|
- </el-form-item>
|
|
|
|
|
- <el-form-item label="生效时间" prop="access_start_time">
|
|
|
|
|
- <el-date-picker
|
|
|
|
|
- v-model="form.access_start_time"
|
|
|
|
|
- type="datetime"
|
|
|
|
|
- placeholder="选择开始时间"
|
|
|
|
|
- style="width: 100%"
|
|
|
|
|
- />
|
|
|
|
|
- </el-form-item>
|
|
|
|
|
- <el-form-item label="结束时间" prop="access_end_time">
|
|
|
|
|
- <el-date-picker
|
|
|
|
|
- v-model="form.access_end_time"
|
|
|
|
|
- type="datetime"
|
|
|
|
|
- placeholder="选择结束时间"
|
|
|
|
|
- style="width: 100%"
|
|
|
|
|
- />
|
|
|
|
|
- </el-form-item>
|
|
|
|
|
- </el-form>
|
|
|
|
|
- <template #footer>
|
|
|
|
|
- <el-button @click="dialogVisible = false">取消</el-button>
|
|
|
|
|
- <el-button type="primary" @click="saveRow">保存</el-button>
|
|
|
|
|
- </template>
|
|
|
|
|
- </el-dialog>
|
|
|
|
|
|
|
+ <!-- 新增/编辑弹窗 -->
|
|
|
|
|
+ <NameListEditDialog
|
|
|
|
|
+ v-if="dialogVisible"
|
|
|
|
|
+ :visible.sync="dialogVisible"
|
|
|
|
|
+ :name-list-data="currentNameListData"
|
|
|
|
|
+ @submit="handleNameListSubmit"
|
|
|
|
|
+ @cancel="handleNameListCancel"
|
|
|
|
|
+ />
|
|
|
</div>
|
|
</div>
|
|
|
</template>
|
|
</template>
|
|
|
|
|
|
|
|
<script>
|
|
<script>
|
|
|
-// ==== 模拟API ====
|
|
|
|
|
-// 实际项目中你应替换为:
|
|
|
|
|
-// import { getWhitelist, addWhitelist, updateWhitelist, removeWhitelist } from '@/api/whitelist'
|
|
|
|
|
-import axios from "axios";
|
|
|
|
|
|
|
+import request from "@/utils/request";
|
|
|
|
|
+import dayjs from "dayjs";
|
|
|
|
|
+import NameListEditDialog from "./NameListEditDialog.vue";
|
|
|
|
|
|
|
|
export default {
|
|
export default {
|
|
|
|
|
+ name: "NameListManagement",
|
|
|
|
|
+ components: {
|
|
|
|
|
+ NameListEditDialog,
|
|
|
|
|
+ },
|
|
|
data() {
|
|
data() {
|
|
|
return {
|
|
return {
|
|
|
- tableData: [
|
|
|
|
|
- {
|
|
|
|
|
- id: 1,
|
|
|
|
|
- plate_number: "粤A12345",
|
|
|
|
|
- type: "whitelist",
|
|
|
|
|
- access_start_time: "2025-10-01 08:00:00",
|
|
|
|
|
- access_end_time: "2025-12-31 18:00:00"
|
|
|
|
|
- },
|
|
|
|
|
- {
|
|
|
|
|
- id: 2,
|
|
|
|
|
- plate_number: "粤B88888",
|
|
|
|
|
- type: "blacklist",
|
|
|
|
|
- access_start_time: "2025-09-01 00:00:00",
|
|
|
|
|
- access_end_time: "2026-01-01 00:00:00"
|
|
|
|
|
- },
|
|
|
|
|
- {
|
|
|
|
|
- id: 3,
|
|
|
|
|
- plate_number: "粤C66666",
|
|
|
|
|
- type: "whitelist",
|
|
|
|
|
- access_start_time: "2025-10-10 07:30:00",
|
|
|
|
|
- access_end_time: "2025-12-10 19:00:00"
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ // 下拉数据
|
|
|
|
|
+ devices: [],
|
|
|
|
|
+ types: [
|
|
|
|
|
+ { label: "白名单", value: "whitelist" },
|
|
|
|
|
+ { label: "黑名单", value: "blacklist" },
|
|
|
],
|
|
],
|
|
|
|
|
+ // 搜索条件
|
|
|
|
|
+ selectedDeviceId: "",
|
|
|
|
|
+ selectedType: "",
|
|
|
|
|
+ inputPlateNumber: "",
|
|
|
|
|
+ // 表格数据
|
|
|
|
|
+ tableData: [],
|
|
|
loading: false,
|
|
loading: false,
|
|
|
total: 0,
|
|
total: 0,
|
|
|
pageSize: 10,
|
|
pageSize: 10,
|
|
|
currentPage: 1,
|
|
currentPage: 1,
|
|
|
-
|
|
|
|
|
|
|
+ // 多选
|
|
|
|
|
+ multipleSelection: [],
|
|
|
|
|
+ // 弹窗
|
|
|
dialogVisible: false,
|
|
dialogVisible: false,
|
|
|
- dialogTitle: "新增名单",
|
|
|
|
|
- editId: null,
|
|
|
|
|
-
|
|
|
|
|
- form: {
|
|
|
|
|
- plate_number: "",
|
|
|
|
|
- type: "whitelist",
|
|
|
|
|
- access_start_time: "",
|
|
|
|
|
- access_end_time: "",
|
|
|
|
|
- },
|
|
|
|
|
-
|
|
|
|
|
- rules: {
|
|
|
|
|
- plate_number: [{ required: true, message: "请输入车牌号", trigger: "blur" }],
|
|
|
|
|
- type: [{ required: true, message: "请选择名单类型", trigger: "change" }],
|
|
|
|
|
- access_start_time: [{ required: true, message: "请选择开始时间", trigger: "change" }],
|
|
|
|
|
- access_end_time: [{ required: true, message: "请选择结束时间", trigger: "change" }],
|
|
|
|
|
- },
|
|
|
|
|
|
|
+ dialogTitle: "",
|
|
|
|
|
+ saving: false,
|
|
|
|
|
+ currentNameListData: {},
|
|
|
};
|
|
};
|
|
|
},
|
|
},
|
|
|
-
|
|
|
|
|
mounted() {
|
|
mounted() {
|
|
|
- // this.loadData();
|
|
|
|
|
|
|
+ this.getDeviceNameInfo();
|
|
|
},
|
|
},
|
|
|
-
|
|
|
|
|
methods: {
|
|
methods: {
|
|
|
- // ===== 获取列表 =====
|
|
|
|
|
- async loadData() {
|
|
|
|
|
|
|
+ handleDeviceChange() {
|
|
|
|
|
+ // 切换设备时重置其他搜索条件
|
|
|
|
|
+ this.selectedType = "";
|
|
|
|
|
+ this.inputPlateNumber = "";
|
|
|
|
|
+ this.currentPage = 1; // 重置分页
|
|
|
|
|
+ this.fetchData();
|
|
|
|
|
+ },
|
|
|
|
|
+ handleTypeChange() {
|
|
|
|
|
+ this.currentPage = 1; // 重置分页
|
|
|
|
|
+ this.fetchData();
|
|
|
|
|
+ },
|
|
|
|
|
+ // 获取设备列表
|
|
|
|
|
+ async getDeviceNameInfo() {
|
|
|
|
|
+ try {
|
|
|
|
|
+ this.loading = true;
|
|
|
|
|
+ const res = await request({
|
|
|
|
|
+ url: "/device/listDeviceName",
|
|
|
|
|
+ method: "GET",
|
|
|
|
|
+ });
|
|
|
|
|
+ const list = res?.data?.list || res?.list || [];
|
|
|
|
|
+ this.devices = list;
|
|
|
|
|
+ if (list.length > 0) {
|
|
|
|
|
+ this.selectedDeviceId = list[0].id;
|
|
|
|
|
+ this.fetchData();
|
|
|
|
|
+ }
|
|
|
|
|
+ } catch (e) {
|
|
|
|
|
+ console.error("获取设备信息失败:", e);
|
|
|
|
|
+ this.$message.error("获取设备列表失败");
|
|
|
|
|
+ } finally {
|
|
|
|
|
+ this.loading = false;
|
|
|
|
|
+ }
|
|
|
|
|
+ },
|
|
|
|
|
+ // 获取名单列表
|
|
|
|
|
+ async fetchData() {
|
|
|
|
|
+ if (!this.selectedDeviceId) {
|
|
|
|
|
+ this.tableData = [];
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
this.loading = true;
|
|
this.loading = true;
|
|
|
try {
|
|
try {
|
|
|
- const { data } = await axios.get("/api/whitelist", {
|
|
|
|
|
- params: { page: this.currentPage, pageSize: this.pageSize },
|
|
|
|
|
|
|
+ const data = {
|
|
|
|
|
+ deviceId: this.selectedDeviceId,
|
|
|
|
|
+ type: this.selectedType,
|
|
|
|
|
+ plateNumber: this.inputPlateNumber,
|
|
|
|
|
+ page: this.currentPage,
|
|
|
|
|
+ pageSize: this.pageSize,
|
|
|
|
|
+ };
|
|
|
|
|
+ console.log("名单列表参数", data);
|
|
|
|
|
+ const res = await request({
|
|
|
|
|
+ url: "/carCamera/nameList/list",
|
|
|
|
|
+ method: "GET",
|
|
|
|
|
+ params: data,
|
|
|
});
|
|
});
|
|
|
- this.tableData = data.records;
|
|
|
|
|
- this.total = data.total;
|
|
|
|
|
|
|
+ this.tableData = res?.records || [];
|
|
|
|
|
+ this.total = res?.total || 0;
|
|
|
|
|
+ console.log("名单列表", this.tableData);
|
|
|
} catch (e) {
|
|
} catch (e) {
|
|
|
- console.error(e);
|
|
|
|
|
|
|
+ console.error("获取名单失败", e);
|
|
|
} finally {
|
|
} finally {
|
|
|
this.loading = false;
|
|
this.loading = false;
|
|
|
}
|
|
}
|
|
|
},
|
|
},
|
|
|
-
|
|
|
|
|
- // ===== 打开新增弹窗 =====
|
|
|
|
|
- openDialog() {
|
|
|
|
|
- console.log("openDialog")
|
|
|
|
|
- this.dialogTitle = "新增名单";
|
|
|
|
|
- this.form = {
|
|
|
|
|
- plate_number: "",
|
|
|
|
|
- type: "whitelist",
|
|
|
|
|
- access_start_time: "",
|
|
|
|
|
- access_end_time: "",
|
|
|
|
|
- };
|
|
|
|
|
- this.editId = null;
|
|
|
|
|
|
|
+ // 查询按钮
|
|
|
|
|
+ handleSearch() {
|
|
|
|
|
+ this.currentPage = 1;
|
|
|
|
|
+ this.fetchData();
|
|
|
|
|
+ },
|
|
|
|
|
+ // 新增名单
|
|
|
|
|
+ handleAdd() {
|
|
|
|
|
+ this.currentNameListData = {};
|
|
|
this.dialogVisible = true;
|
|
this.dialogVisible = true;
|
|
|
- console.log("openDialog this.dialogVisible", this.dialogVisible)
|
|
|
|
|
},
|
|
},
|
|
|
-
|
|
|
|
|
- // ===== 编辑 =====
|
|
|
|
|
- editRow(row) {
|
|
|
|
|
- this.dialogTitle = "编辑名单";
|
|
|
|
|
- this.form = { ...row };
|
|
|
|
|
- this.editId = row.id;
|
|
|
|
|
|
|
+ // 编辑名单
|
|
|
|
|
+ handleEdit(row) {
|
|
|
|
|
+ this.currentNameListData = { ...row };
|
|
|
this.dialogVisible = true;
|
|
this.dialogVisible = true;
|
|
|
},
|
|
},
|
|
|
-
|
|
|
|
|
- // ===== 保存 =====
|
|
|
|
|
- async saveRow() {
|
|
|
|
|
- this.$refs.formRef.validate(async (valid) => {
|
|
|
|
|
- if (!valid) return;
|
|
|
|
|
- try {
|
|
|
|
|
- if (this.editId) {
|
|
|
|
|
- await axios.put(`/api/whitelist/${this.editId}`, this.form);
|
|
|
|
|
- this.$message.success("修改成功");
|
|
|
|
|
- } else {
|
|
|
|
|
- await axios.post("/api/whitelist", this.form);
|
|
|
|
|
- this.$message.success("新增成功");
|
|
|
|
|
- }
|
|
|
|
|
- this.dialogVisible = false;
|
|
|
|
|
- this.loadData();
|
|
|
|
|
- } catch (e) {
|
|
|
|
|
- console.error(e);
|
|
|
|
|
- this.$message.error("保存失败");
|
|
|
|
|
- }
|
|
|
|
|
- });
|
|
|
|
|
|
|
+ async handleNameListSubmit(nameListData) {
|
|
|
|
|
+ const url = nameListData.id
|
|
|
|
|
+ ? "/carCamera/nameList/update"
|
|
|
|
|
+ : "/carCamera/nameList/add";
|
|
|
|
|
+ const res = await request({ url, method: "POST", data: nameListData });
|
|
|
|
|
+ console.log("保存结果", res);
|
|
|
|
|
+ if (res.success || res.code === 0) {
|
|
|
|
|
+ this.$message.success("保存成功");
|
|
|
|
|
+ this.dialogVisible = false;
|
|
|
|
|
+ await this.fetchData();
|
|
|
|
|
+ } else {
|
|
|
|
|
+ this.$message.error(res.msg || "保存失败");
|
|
|
|
|
+ }
|
|
|
},
|
|
},
|
|
|
-
|
|
|
|
|
- // ===== 删除 =====
|
|
|
|
|
- async deleteRow(row) {
|
|
|
|
|
- try {
|
|
|
|
|
- await this.$confirm(`确定要删除车牌 ${row.plate_number} 吗?`, "提示", {
|
|
|
|
|
|
|
+ handleNameListCancel() {
|
|
|
|
|
+ this.dialogVisible = false;
|
|
|
|
|
+ },
|
|
|
|
|
+ // 删除名单(单条或批量统一)
|
|
|
|
|
+ handleDelete(row) {
|
|
|
|
|
+ this.$confirm(
|
|
|
|
|
+ `确定要删除车牌号为【${row.plateNumber}】的名单吗?`,
|
|
|
|
|
+ "提示",
|
|
|
|
|
+ {
|
|
|
|
|
+ confirmButtonText: "确定",
|
|
|
|
|
+ cancelButtonText: "取消",
|
|
|
type: "warning",
|
|
type: "warning",
|
|
|
|
|
+ },
|
|
|
|
|
+ )
|
|
|
|
|
+ .then(() => this.deleteIds([row.id]))
|
|
|
|
|
+ .catch(() => this.$message.info("已取消删除"));
|
|
|
|
|
+ },
|
|
|
|
|
+ handleBatchDelete() {
|
|
|
|
|
+ const ids = this.multipleSelection.map((i) => i.id);
|
|
|
|
|
+ if (!ids.length) {
|
|
|
|
|
+ this.$message.warning("请先选择要删除的名单");
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ this.$confirm(
|
|
|
|
|
+ `确定要删除选中的 ${ids.length} 条名单吗?`,
|
|
|
|
|
+ "批量删除确认",
|
|
|
|
|
+ {
|
|
|
|
|
+ confirmButtonText: "确定",
|
|
|
|
|
+ cancelButtonText: "取消",
|
|
|
|
|
+ type: "warning",
|
|
|
|
|
+ },
|
|
|
|
|
+ )
|
|
|
|
|
+ .then(() => this.deleteIds(ids))
|
|
|
|
|
+ .catch(() => this.$message.info("已取消删除"));
|
|
|
|
|
+ },
|
|
|
|
|
+ // 通用删除方法
|
|
|
|
|
+ async deleteIds(ids) {
|
|
|
|
|
+ if (!ids.length) return;
|
|
|
|
|
+ try {
|
|
|
|
|
+ const res = await request({
|
|
|
|
|
+ url: "/carCamera/nameList/delete",
|
|
|
|
|
+ method: "POST",
|
|
|
|
|
+ data: { ids, deviceId: this.selectedDeviceId }, // 注意:统一传 ids 数组
|
|
|
});
|
|
});
|
|
|
- await axios.delete(`/api/whitelist/${row.id}`);
|
|
|
|
|
- this.$message.success("删除成功");
|
|
|
|
|
- this.loadData();
|
|
|
|
|
|
|
+ if (res.success) {
|
|
|
|
|
+ this.$message.success("删除成功");
|
|
|
|
|
+ this.fetchData();
|
|
|
|
|
+ this.multipleSelection = [];
|
|
|
|
|
+ } else {
|
|
|
|
|
+ this.$message.error(res.msg || "删除失败");
|
|
|
|
|
+ }
|
|
|
} catch (e) {
|
|
} catch (e) {
|
|
|
- if (e !== "cancel") this.$message.error("删除失败");
|
|
|
|
|
|
|
+ console.error("删除失败", e);
|
|
|
|
|
+ this.$message.error("请求出错,请稍后重试");
|
|
|
}
|
|
}
|
|
|
},
|
|
},
|
|
|
-
|
|
|
|
|
- // ===== 分页 =====
|
|
|
|
|
|
|
+ // 表格样式
|
|
|
|
|
+ changeHeaderCellStyle() {
|
|
|
|
|
+ return "background: #004279; color: #fff;";
|
|
|
|
|
+ },
|
|
|
|
|
+ // 分页控制
|
|
|
|
|
+ handleSelectionChange(val) {
|
|
|
|
|
+ this.multipleSelection = val;
|
|
|
|
|
+ },
|
|
|
handlePageChange(page) {
|
|
handlePageChange(page) {
|
|
|
this.currentPage = page;
|
|
this.currentPage = page;
|
|
|
- this.loadData();
|
|
|
|
|
|
|
+ this.fetchData();
|
|
|
},
|
|
},
|
|
|
-
|
|
|
|
|
- // ===== 格式化类型 =====
|
|
|
|
|
|
|
+ handleSizeChange(size) {
|
|
|
|
|
+ this.pageSize = size;
|
|
|
|
|
+ this.currentPage = 1;
|
|
|
|
|
+ this.fetchData();
|
|
|
|
|
+ },
|
|
|
|
|
+ // 格式化函数
|
|
|
formatType(row) {
|
|
formatType(row) {
|
|
|
- return row.type === "whitelist" ? "白名单" : "黑名单";
|
|
|
|
|
|
|
+ const map = {
|
|
|
|
|
+ whitelist: "白名单",
|
|
|
|
|
+ blacklist: "黑名单",
|
|
|
|
|
+ };
|
|
|
|
|
+ return map[row.type] || "-";
|
|
|
},
|
|
},
|
|
|
-
|
|
|
|
|
- // ===== 格式化时间 =====
|
|
|
|
|
|
|
+ // 时间格式化
|
|
|
formatTime(row, column, cellValue) {
|
|
formatTime(row, column, cellValue) {
|
|
|
- if (!cellValue) return "";
|
|
|
|
|
- const date = new Date(cellValue);
|
|
|
|
|
- return date.toLocaleString();
|
|
|
|
|
|
|
+ return cellValue ? dayjs(cellValue).format("YYYY-MM-DD HH:mm:ss") : "";
|
|
|
|
|
+ },
|
|
|
|
|
+ // 车牌颜色格式化
|
|
|
|
|
+ formatPlateColor(row) {
|
|
|
|
|
+ const map = { 0: "蓝色", 1: "黄色", 2: "黑色", 3: "白色" };
|
|
|
|
|
+ return map[row.plateColor] || "-";
|
|
|
|
|
+ },
|
|
|
|
|
+ // 车牌类型格式化
|
|
|
|
|
+ formatPlateType(row) {
|
|
|
|
|
+ const map = { 0: "普通蓝牌", 1: "新能源", 2: "黄牌" };
|
|
|
|
|
+ return map[row.plateType] || "-";
|
|
|
},
|
|
},
|
|
|
},
|
|
},
|
|
|
};
|
|
};
|
|
|
</script>
|
|
</script>
|
|
|
|
|
+
|
|
|
|
|
+<style scoped>
|
|
|
|
|
+.nameList-edit-dialog .el-form-item {
|
|
|
|
|
+ margin-bottom: 18px;
|
|
|
|
|
+}
|
|
|
|
|
+</style>
|