From f82d3934bafba8a37489318b11fbc43ef592ea78 Mon Sep 17 00:00:00 2001 From: luojiayi <1712054227@qq.com> Date: Fri, 11 Apr 2025 18:46:52 +0800 Subject: [PATCH] =?UTF-8?q?2025=E5=B9=B404=E6=9C=8811=E6=97=A518:46:50?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.development | 1 + .env.production | 1 + auto-imports.d.ts | 2 +- src/api/index.d.ts | 10 +- src/api/index.ts | 77 +++++---- src/assets/audio/warning1.mp3 | Bin 0 -> 28512 bytes src/components/alarm.vue | 20 ++- src/components/batch-imp.vue | 2 +- src/components/table-search.vue | 1 + src/components/upload-img.vue | 72 +++++--- src/layout/index copy 2.vue | 19 +++ src/layout/index copy.vue | 120 +++++++++++++ src/layout/index.vue | 38 ++++- src/store/common.ts | 11 +- src/utils/webSocket.js | 158 ++++++++++++++++++ src/views/alarmCenter/index.vue | 37 ++-- src/views/incidentDispose/index.vue | 32 ++-- src/views/login.vue | 1 + src/views/statisticalCenter/emergencyList.vue | 6 +- src/views/statisticalCenter/monitoringTop.vue | 1 - .../synthesizeManage/areaManage/index.vue | 22 +-- .../synthesizeManage/deviceInfo/index.vue | 4 +- .../synthesizeManage/deviceManage/index.vue | 64 ++++--- .../synthesizeManage/userManage/index.vue | 57 ++++--- .../synthesizeManage/userManage/userType.vue | 7 +- sta.html | 31 ++++ yarn.lock | 17 +- 27 files changed, 632 insertions(+), 179 deletions(-) create mode 100644 src/assets/audio/warning1.mp3 create mode 100644 src/layout/index copy 2.vue create mode 100644 src/layout/index copy.vue create mode 100644 src/utils/webSocket.js create mode 100644 sta.html diff --git a/.env.development b/.env.development index af7909a..4a94903 100644 --- a/.env.development +++ b/.env.development @@ -1 +1,2 @@ VITE_APP_URL = 'http://192.168.3.116:8001' +VITE_APP_URL_WEBSOCKET = 'http://192.168.3.116:8000/api/websocket' diff --git a/.env.production b/.env.production index faabcd6..27e4db4 100644 --- a/.env.production +++ b/.env.production @@ -1,3 +1,4 @@ VITE_APP_URL = 'http://192.168.3.116:8001/' +VITE_APP_URL_WEBSOCKET = 'http://192.168.3.116:8000/api/websocket' diff --git a/auto-imports.d.ts b/auto-imports.d.ts index 08908ed..8139ac9 100644 --- a/auto-imports.d.ts +++ b/auto-imports.d.ts @@ -1,5 +1,5 @@ // Generated by 'unplugin-auto-import' export {} declare global { - + const ElMessage: typeof import('element-plus/es')['ElMessage'] } diff --git a/src/api/index.d.ts b/src/api/index.d.ts index 993eea9..c4a7d96 100644 --- a/src/api/index.d.ts +++ b/src/api/index.d.ts @@ -20,7 +20,7 @@ export interface TRoleList { id?: number name: string createTime?: string - roleMenu: TRoleMenu[] + roleMenu?: TRoleMenu[] } @@ -81,9 +81,10 @@ export interface TDeviceConfigModify { export namespace TRoleModify { export interface Ireq { - id: number + id?: number name: string roleMenu: TRoleMenu[] + menus?: TRoleMenu[] } } @@ -257,9 +258,6 @@ export namespace TDevice { } - - - export namespace TOrg { export interface IAdd { name: string; @@ -267,7 +265,7 @@ export namespace TOrg { parentId: string; } export interface IListReq extends Ipaging { - name?: number; + name?: string; } export interface Idel { id: number; diff --git a/src/api/index.ts b/src/api/index.ts index eaa6206..42eb660 100644 --- a/src/api/index.ts +++ b/src/api/index.ts @@ -3,7 +3,7 @@ import { TLogin, TAccount, IpagingRes, TDevice, TOrg, TRoleList, TStatisticsDevi export const fetchLogin = (p: TLogin.Ireq): Promise => { return request({ - url: '/v1/web/login', + url: '/v1/api/login', method: 'post', data: p }); @@ -12,7 +12,7 @@ export const fetchLogin = (p: TLogin.Ireq): Promise => { // 批量导入账号样例 export const exportDemoAccount = (): Promise => { return request({ - url: '/v1/web/upload/exportDemo/account', + url: '/v1/api/upload/exportDemo/account', method: 'get', responseType: 'blob' }); @@ -47,7 +47,7 @@ export const fetchRoleData = () => { // 添加用户 export const accountAdd = (p: TAccount.IAdd): Promise => { return request({ - url: '/v1/web/account/add', + url: '/v1/api/account/add', method: 'post', data: p }); @@ -55,7 +55,7 @@ export const accountAdd = (p: TAccount.IAdd): Promise => { // 删除用户 export const accountDeletet = (p: TAccount.Idel): Promise => { return request({ - url: '/v1/web/account/delete', + url: '/v1/api/account/delete', method: 'post', data: p }); @@ -63,7 +63,7 @@ export const accountDeletet = (p: TAccount.Idel): Promise => { // 修改用户 export const accountModify = (p: TAccount.IAdd): Promise => { return request({ - url: '/v1/web/account/modify', + url: '/v1/api/account/modify', method: 'post', data: p }); @@ -71,7 +71,7 @@ export const accountModify = (p: TAccount.IAdd): Promise => { // 获取用户列表 export const accountList = (p: TAccount.IListReq): Promise> => { return request({ - url: '/v1/web/account/list', + url: '/v1/api/account/list', method: 'get', params: p }); @@ -79,7 +79,7 @@ export const accountList = (p: TAccount.IListReq): Promise => { return request({ - url: '/v1/web/account/password/reset', + url: '/v1/api/account/password/reset', method: 'post', data: p }); @@ -89,7 +89,7 @@ export const passwordReset = (p: TAccount.IResetPwd): Promise => { // 获取设备列表 export const deviceList = (p: TDevice.IListReq): Promise> => { return request({ - url: '/v1/web/device/list', + url: '/v1/api/device/list', method: 'get', params: p }); @@ -98,7 +98,7 @@ export const deviceList = (p: TDevice.IListReq): Promise => { return request({ - url: '/v1/web/device/set/monitor', + url: '/v1/api/device/set/monitor', method: 'post', data: p }); @@ -107,7 +107,7 @@ export const setMonitor = (p: TDevice.ISetMonitor): Promise => { // 设置模式 export const setMode = (p: TDevice.ISetMonitor): Promise => { return request({ - url: '/v1/web/device/set/mode', + url: '/v1/api/device/set/mode', method: 'post', data: p }); @@ -116,7 +116,7 @@ export const setMode = (p: TDevice.ISetMonitor): Promise => { // 获取定位 export const deviceGetLocation = (p: TDevice.ISetMonitor): Promise => { return request({ - url: '/v1/web/device/getLocate', + url: '/v1/api/device/getLocate', method: 'post', data: p }); @@ -125,7 +125,7 @@ export const deviceGetLocation = (p: TDevice.ISetMonitor): Promise => { // 设备控制 export const deviceControl = (p: TDevice.ISetMonitor): Promise => { return request({ - url: '/v1/web/device/control', + url: '/v1/api/device/control', method: 'post', data: p }); @@ -134,7 +134,7 @@ export const deviceControl = (p: TDevice.ISetMonitor): Promise => { // 设备使用记录 export const deviceUseRecord = (p: TDevice.IRecordReq): Promise> => { return request({ - url: '/v1/web/device/use/record', + url: '/v1/api/device/use/record', method: 'get', params: p }); @@ -143,7 +143,7 @@ export const deviceUseRecord = (p: TDevice.IRecordReq): Promise> => { return request({ - url: '/v1/web/warning/record', + url: '/v1/api/warning/record', method: 'get', params: p }); @@ -152,7 +152,7 @@ export const warningRecord = (p: TDevice.IRecordReq): Promise => { return request({ - url: '/v1/web/org/add', + url: '/v1/api/org/add', method: 'post', data: p }); @@ -160,7 +160,7 @@ export const orgAdd = (p: TOrg.IAdd): Promise => { // 修改机构 export const orgModify = (p: TOrg.IAdd): Promise => { return request({ - url: '/v1/web/org/modify', + url: '/v1/api/org/modify', method: 'post', data: p }); @@ -168,7 +168,7 @@ export const orgModify = (p: TOrg.IAdd): Promise => { // 机构列表 export const orgList = (p?: TOrg.IListReq): Promise> => { return request({ - url: '/v1/web/org/list', + url: '/v1/api/org/page', method: 'get', params: p }); @@ -177,7 +177,7 @@ export const orgList = (p?: TOrg.IListReq): Promise => { return request({ - url: '/v1/web/org/delete', + url: '/v1/api/org/delete', method: 'post', data: p }); @@ -186,7 +186,7 @@ export const orgDelete = (p?: TOrg.Idel): Promise => { // 获取角色列表 export const roleList = (): Promise => { return request({ - url: '/v1/web/role/list', + url: '/v1/api/role/list', method: 'get', }); }; @@ -194,7 +194,16 @@ export const roleList = (): Promise => { // 修改角色信息 export const roleModify = (p: TRoleModify.Ireq): Promise => { return request({ - url: '/v1/web/role/modify', + url: '/v1/api/role/modify', + method: 'post', + data: p + }); +}; + +// 添加角色信息 +export const roleAdd = (p: TRoleModify.Ireq): Promise => { + return request({ + url: '/v1/api/role/add', method: 'post', data: p }); @@ -203,7 +212,7 @@ export const roleModify = (p: TRoleModify.Ireq): Promise => { // 设备在线统计 export const statisticsDevice = (): Promise => { return request({ - url: '/v1/web/statistics/device', + url: '/v1/api/statistics/device', method: 'get', }); }; @@ -211,7 +220,7 @@ export const statisticsDevice = (): Promise => { // 内容数据 export const statisticsContent = (p: statisticsContentReq): Promise => { return request({ - url: '/v1/web/statistics/content', + url: '/v1/api/statistics/content', method: 'post', data: p }); @@ -220,7 +229,7 @@ export const statisticsContent = (p: statisticsContentReq): Promise => { return request({ - url: '/v1/web/statistics/count', + url: '/v1/api/statistics/count', method: 'get', }); }; @@ -228,7 +237,7 @@ export const statisticsCount = (): Promise => { // 告警统计 export const statisticsWarningapi = (): Promise => { return request({ - url: '/v1/web/statistics/warning', + url: '/v1/api/statistics/warning', method: 'get', }); }; @@ -236,7 +245,7 @@ export const statisticsWarningapi = (): Promise => { // 预警记录 export const warnRecord = (p: TWarnRecord.IListReq): Promise> => { return request({ - url: '/v1/web/warning/record', + url: '/v1/api/warning/record', method: 'get', params: p }); @@ -245,7 +254,7 @@ export const warnRecord = (p: TWarnRecord.IListReq): Promise => { return request({ - url: '/v1/web/warning/detail', + url: '/v1/api/warning/detail', method: 'get', params: p }); @@ -254,7 +263,7 @@ export const warningDetail = (p: TWarningDetail.TParams): Promise => { return request({ - url: '/v1/web/warning/confirm', + url: '/v1/api/warning/confirm', method: 'post', data: p }); @@ -263,7 +272,7 @@ export const warningConfirm = (p: TWarningConfirm): Promise => { // 获取专项配置 export const deviceConfig = (p: TDeviceConfig.Treq): Promise => { return request({ - url: '/v1/web/device/deviceConfig', + url: '/v1/api/device/deviceConfig', method: 'get', params: p }); @@ -272,7 +281,7 @@ export const deviceConfig = (p: TDeviceConfig.Treq): Promise // 修改专项配置 export const deviceConfigModify = (p: TDeviceConfigModify): Promise => { return request({ - url: '/v1/web/device/deviceConfig/modify', + url: '/v1/api/device/deviceConfig/modify', method: 'post', data: p }); @@ -281,7 +290,7 @@ export const deviceConfigModify = (p: TDeviceConfigModify): Promise => { // 获取最新健康数据 export const healthLatestData = (p: THealthLatestData.TReq): Promise => { return request({ - url: '/v1/web/health/latestData', + url: '/v1/api/health/latestData', method: 'get', params: p }); @@ -290,7 +299,7 @@ export const healthLatestData = (p: THealthLatestData.TReq): Promise => { return request({ - url: '/v1/web/device/locate/record', + url: '/v1/api/device/locate/record', method: 'get', params: p }); @@ -299,7 +308,7 @@ export const locateRecord = (p: TLocateRecord.TReq): Promise => { return request({ - url: '/v1/web/device/set/useStatus', + url: '/v1/api/device/set/useStatus', method: 'post', data: p }); @@ -308,7 +317,7 @@ export const setUseStatus = (p: TSetUseStatus.TReq): Promise => { // 设置禁用状态 export const setStatus = (p: TSetUseStatus.TReq): Promise => { return request({ - url: '/v1/web/device/set/status', + url: '/v1/api/device/set/status', method: 'post', data: p }); @@ -317,7 +326,7 @@ export const setStatus = (p: TSetUseStatus.TReq): Promise => { // 获取菜单列表 export const roleMenuList = (): Promise => { return request({ - url: '/v1/web/role/menu/list', + url: '/v1/api/role/menu/list', method: 'get', }); }; diff --git a/src/assets/audio/warning1.mp3 b/src/assets/audio/warning1.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..098ae51567c973b978d6aa7aec2284fdefd838fe GIT binary patch literal 28512 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 z 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 literal 0 HcmV?d00001 diff --git a/src/components/alarm.vue b/src/components/alarm.vue index 7aa484f..4c5957c 100644 --- a/src/components/alarm.vue +++ b/src/components/alarm.vue @@ -18,9 +18,9 @@
- + @@ -43,14 +43,16 @@ defineProps({ }, }); -defineEmits(["close", "confirm"]); +const emit = defineEmits(["close", "confirm"]); const handleAudioEnd = () => { - if (audioPlayer.value) { - audioPlayer.value.play().catch((error) => { - console.error("自动播放被阻止:", error); - }); - } + emit("close"); + + // if (audioPlayer.value) { + // audioPlayer.value.play().catch((error) => { + // console.error("自动播放被阻止:", error); + // }); + // } }; onMounted(() => { diff --git a/src/components/batch-imp.vue b/src/components/batch-imp.vue index f36fc7b..ac8727d 100644 --- a/src/components/batch-imp.vue +++ b/src/components/batch-imp.vue @@ -34,7 +34,7 @@ interface Tdata { } const comm = useCommonStore(); -const ACTION = import.meta.env.VITE_APP_URL + "/v1/web/upload/account"; +const ACTION = import.meta.env.VITE_APP_URL + "/v1/api/upload/account"; const HEADERS = { "Access-Token": comm.user.token, }; diff --git a/src/components/table-search.vue b/src/components/table-search.vue index 84d75a6..e859541 100644 --- a/src/components/table-search.vue +++ b/src/components/table-search.vue @@ -24,6 +24,7 @@ style="width: 220px" v-else-if="item.type === 'daterange'" v-model="query[item.prop]" + value-format="YYYY-MM-DD" type="daterange" range-separator="-" start-placeholder="开始日期" diff --git a/src/components/upload-img.vue b/src/components/upload-img.vue index 991474c..53684ac 100644 --- a/src/components/upload-img.vue +++ b/src/components/upload-img.vue @@ -1,17 +1,20 @@ diff --git a/src/layout/index copy 2.vue b/src/layout/index copy 2.vue new file mode 100644 index 0000000..e62b55a --- /dev/null +++ b/src/layout/index copy 2.vue @@ -0,0 +1,19 @@ + + diff --git a/src/layout/index copy.vue b/src/layout/index copy.vue new file mode 100644 index 0000000..3da49f4 --- /dev/null +++ b/src/layout/index copy.vue @@ -0,0 +1,120 @@ + + + + diff --git a/src/layout/index.vue b/src/layout/index.vue index 2dba5cc..e5d4aa6 100644 --- a/src/layout/index.vue +++ b/src/layout/index.vue @@ -13,15 +13,30 @@ + + diff --git a/src/store/common.ts b/src/store/common.ts index c28a14e..22760a2 100644 --- a/src/store/common.ts +++ b/src/store/common.ts @@ -1,11 +1,13 @@ import { defineStore } from 'pinia'; -import { TLogin } from "@/api/index.d"; +import { TLogin, TRoleList } from "@/api/index.d"; +import { roleList } from '@/api'; export const useCommonStore = defineStore('common', { state: () => { return { time: new Date(), - user: {} + user: {}, + roleList: [] }; }, getters: {}, @@ -13,6 +15,11 @@ export const useCommonStore = defineStore('common', { setTime() { this.time = new Date(); }, + getRoleList() { + roleList().then(res => { + this.roleList = res + }) + }, setUser(data: TLogin.IRes) { this.user = data }, diff --git a/src/utils/webSocket.js b/src/utils/webSocket.js new file mode 100644 index 0000000..f881ffa --- /dev/null +++ b/src/utils/webSocket.js @@ -0,0 +1,158 @@ +import { ref, onMounted, onUnmounted } from 'vue'; + +class WebSocketService { + constructor() { + this.url = import.meta.env.VITE_APP_URL_WEBSOCKET; + this.socket = null; + this.isAlive = false; // 用于判断心跳是否正常 + this.reconnectAttempts = 0; // 重连尝试次数 + this.MAX_RECONNECT_ATTEMPTS = 5; // 最大重连次数 + this.HEARTBEAT_INTERVAL = 5000; // 心跳间隔时间 (30秒) + // this.HEARTBEAT_INTERVAL = 30000; // 心跳间隔时间 (30秒) + this.heartbeatTimer = null; + this.reconnectTimer = null; + + this.connect(); + } + + connect() { + this.socket = new WebSocket(this.url); + + this.socket.onopen = () => { + console.log('WebSocket已连接'); + this.webScoketLogin(); + this.reconnectAttempts = 0; // 成功连接后重置重试次数 + this.startHeartbeat(); // 开始心跳检测 + }; + + this.socket.onmessage = (event) => { + // 处理接收到的消息 + console.log('Message received:', event.data); + }; + + this.socket.onclose = () => { + console.log('WebSocket连接已关闭'); + this.stopHeartbeat(); + this.attemptReconnect(); + }; + + this.socket.onerror = (error) => { + console.log('WebSocket连接错误', error); + }; + } + + webScoketLogin() { + this.sendMessage({ + username: "admin", + password: "111111", + type: 0, + cmd: "webLogin", + }) + } + + startHeartbeat() { + if (!this.heartbeatTimer) { + this.heartbeatTimer = setInterval(() => { + if (this.socket.readyState === WebSocket.OPEN) { + this.isAlive = false; + this.sendPing(); + } + }, this.HEARTBEAT_INTERVAL); + } + } + + stopHeartbeat() { + if (this.heartbeatTimer) { + clearInterval(this.heartbeatTimer); + this.heartbeatTimer = null; + } + } + + sendPing() { + console.log('发送心跳', JSON.stringify({ cmd: 'heartbeat' })); + + this.socket.send(JSON.stringify({ cmd: 'heartbeat' })); + setTimeout(() => { + if (!this.isAlive) { + console.warn('WebSocket heartbeat failed, attempting to reconnect...'); + this.socket.close(); + } + }, this.HEARTBEAT_INTERVAL / 2); // 如果没有pong响应,则关闭并重连 + } + + receivePong() { + this.isAlive = true; + } + + attemptReconnect() { + if (this.reconnectAttempts < this.MAX_RECONNECT_ATTEMPTS) { + this.reconnectAttempts++; + console.log(`Attempting to reconnect (${this.reconnectAttempts})...`); + this.reconnectTimer = setTimeout(() => { + this.connect(); + }, 1000 * this.reconnectAttempts); // 指数退避算法 + } else { + console.error('Max reconnect attempts reached'); + } + } + + sendMessage(message) { + if (this.socket && this.socket.readyState === WebSocket.OPEN) { + this.socket.send(JSON.stringify(message)); + } + } + + close() { + this.stopHeartbeat(); + if (this.reconnectTimer) { + clearTimeout(this.reconnectTimer); + this.reconnectTimer = null; + } + if (this.socket) { + this.socket.close(); + this.socket = null; + } + } +} + +export default function useWebSocket() { + const ws = new WebSocketService(); + + const message = ref(null); + const isConnected = ref(false); + + const onMessage = (callback) => { + ws.socket.onmessage = (event) => { + const data = JSON.parse(event.data); + if (data.cmd == "webLogin" && !data.code == 200) return ws.webScoketLogin() + + callback(data); + if (event.data.includes('heartbeat')) { + ws.receivePong(); + } + }; + }; + + const onClose = () => { + ws.socket.onclose() + }; + + const onOpen = (callback) => { + ws.socket.onopen = () => { + isConnected.value = true; + callback(); + }; + }; + + // onMounted(() => { + // onOpen(() => console.log('Connected')); + // onClose(() => console.log('Disconnected')); + // onMessage((data) => console.log('Received:', data)); + // }); + + // onUnmounted(() => { + // ws.close(); + // }); + + return { isConnected, message, sendMessage: ws.sendMessage.bind(ws), onMessage, onClose }; +} \ No newline at end of file diff --git a/src/views/alarmCenter/index.vue b/src/views/alarmCenter/index.vue index 95dfd87..3aa895e 100644 --- a/src/views/alarmCenter/index.vue +++ b/src/views/alarmCenter/index.vue @@ -44,23 +44,33 @@ enum warnTypeEnum { } const router = useRouter(); // 查询相关 -const query = reactive({ - name: "", -}); +const query = reactive({}); const searchOpt = ref([ - { type: "select", label: "来源手铐:", prop: "name1", opts: [{ label: "866503071660886", value: "866503071660886" }] }, - { type: "select", label: "事件类型:", prop: "name2", opts: [{ label: "866503071660886", value: "866503071660886" }] }, - { type: "select", label: "事件级别:", prop: "name3", opts: [{ label: "866503071660886", value: "866503071660886" }] }, + { type: "input", label: "手铐IMEI号:", prop: "deviceId" }, + { + type: "select", + label: "告警类型:", + prop: "warnType", + opts: [ + { label: "SOS告警", value: 0 }, + { label: "围栏告警", value: 1 }, + { label: "破坏告警", value: 2 }, + { label: "低电告警", value: 3 }, + { label: "心率告警", value: 4 }, + { label: "血氧告警", value: 5 }, + { label: "体温告警", value: 6 }, + ], + }, { type: "select", label: "处理状态:", prop: "status", opts: [ - { label: "未处理", value: "0" }, - { label: "已处理", value: "1" }, + { label: "待处理", value: 0 }, + { label: "已处理", value: 1 }, ], }, - { type: "daterange", label: "创建时间:", prop: "name5" }, + { type: "daterange", label: "创建时间:", prop: "time" }, ]); const handleSearch = () => { changePage(1); @@ -86,7 +96,10 @@ const tableData = ref([]); const getData = async () => { try { - const res = await warnRecord(paging); + console.log(query, "queryqueryquery"); + let p = { ...paging, ...query, startDate: query.time?.[0], endDate: query.time?.[1] }; + delete p.time; + const res = await warnRecord(p); tableData.value = res.records; paging.total = res.total; } catch (error) {} @@ -97,10 +110,10 @@ const changePage = (val: number) => { paging.page = val; getData(); }; -const toIncidentDispose = (deviceId: string) => { +const toIncidentDispose = (id: string) => { router.push({ path: "/incidentDispose", - query: { deviceId }, + query: { id }, }); }; diff --git a/src/views/incidentDispose/index.vue b/src/views/incidentDispose/index.vue index 72f6a28..d4d3476 100644 --- a/src/views/incidentDispose/index.vue +++ b/src/views/incidentDispose/index.vue @@ -47,26 +47,26 @@ - + - + - + - + -
- 保存 +
+ 保存
@@ -77,7 +77,7 @@ diff --git a/src/views/statisticalCenter/monitoringTop.vue b/src/views/statisticalCenter/monitoringTop.vue index 5e93cf4..273b386 100644 --- a/src/views/statisticalCenter/monitoringTop.vue +++ b/src/views/statisticalCenter/monitoringTop.vue @@ -27,7 +27,6 @@ const { list } = defineProps({ default: () => [], }, }); -console.log(list, "list1111"); diff --git a/src/views/synthesizeManage/deviceInfo/index.vue b/src/views/synthesizeManage/deviceInfo/index.vue index 87d92f2..03a3597 100644 --- a/src/views/synthesizeManage/deviceInfo/index.vue +++ b/src/views/synthesizeManage/deviceInfo/index.vue @@ -143,10 +143,10 @@ const changeWarningPage = (val: number) => { paging1.page = val; getWarningData(); }; -const toIncidentDispose = (deviceId: string) => { +const toIncidentDispose = (id: string) => { router.push({ path: "/incidentDispose", - query: { deviceId }, + query: { id }, }); }; diff --git a/src/views/synthesizeManage/deviceManage/index.vue b/src/views/synthesizeManage/deviceManage/index.vue index 9cfcfb7..824db35 100644 --- a/src/views/synthesizeManage/deviceManage/index.vue +++ b/src/views/synthesizeManage/deviceManage/index.vue @@ -88,12 +88,39 @@ const editOp = [ ]; // 查询相关 -const query = reactive({ - name: "", -}); +const query = reactive({}); const searchOpt = ref([ - { type: "input", label: "手铐SN:", prop: "name" }, - { type: "input", label: "警察账号:", prop: "name1" }, + { type: "input", label: "手铐SN:", prop: "deviceId" }, + { type: "input", label: "警察名称:", prop: "name" }, + { + type: "select", + label: "当前模式:", + prop: "mode", + opts: [ + { label: "常规", value: "0" }, + { label: "审讯", value: "1" }, + { label: "户外押送", value: "2" }, + ], + }, + { + type: "select", + label: "设备状态:", + prop: "status", + opts: [ + { label: "离线", value: "0" }, + { label: "在线", value: "1" }, + { label: "充电中", value: "2" }, + ], + }, + { + type: "select", + label: "使用状态:", + prop: "useStatus", + opts: [ + { label: "未使用", value: "0" }, + { label: "使用中", value: "1" }, + ], + }, ]); const handleSearch = () => { changePage(1); @@ -103,19 +130,18 @@ const handleSearch = () => { let columns = ref([ { type: "selection" }, { type: "index", label: "序号", width: 55, align: "center" }, - { prop: "deviceId", label: "手铐IMEI" }, - { prop: "name", label: "绑定警察名称" }, - { prop: "username", label: "绑定警察账户" }, - { prop: "battery", label: "电量" }, - { prop: "deviceVersion", label: "版本号" }, - { prop: "status", label: "设备状态" }, - { prop: "mode", label: "当前模式" }, - { prop: "useStatus", label: "使用状态" }, - { prop: "deviceSwitch", label: "启用开关" }, - { prop: "orgName", label: "关联辖区编号" }, - { prop: "createTime", label: "最新通信时间" }, - { prop: "createTime", label: "创建时间" }, - + { prop: "deviceId", label: "手铐IMEI", width: 120 }, + { prop: "adminName", label: "绑定警察名称", width: 180 }, + { prop: "adminUsername", label: "绑定警察账户", width: 120 }, + { prop: "battery", label: "电量", width: 100 }, + { prop: "deviceVersion", label: "版本号", width: 100 }, + { prop: "status", label: "设备状态", width: 100 }, + { prop: "mode", label: "当前模式", width: 100 }, + { prop: "useStatus", label: "使用状态", width: 100 }, + { prop: "deviceSwitch", label: "启用开关", width: 100 }, + { prop: "orgName", label: "关联辖区编号", width: 120 }, + { prop: "createTime", label: "最新通信时间", width: 180 }, + { prop: "createTime", label: "创建时间", width: 180 }, { prop: "operator", label: "操作", width: 400 }, ]); const paging = reactive({ @@ -130,7 +156,7 @@ const controlForm = reactive({ const tableData = ref([]); const getData = async () => { - const res = await deviceList(paging); + const res = await deviceList({ ...paging, ...query }); tableData.value = res.records; paging.total = res.total; }; diff --git a/src/views/synthesizeManage/userManage/index.vue b/src/views/synthesizeManage/userManage/index.vue index db4b68a..b7cfe63 100644 --- a/src/views/synthesizeManage/userManage/index.vue +++ b/src/views/synthesizeManage/userManage/index.vue @@ -11,14 +11,14 @@ -