From 1280f9f5ed43a40ac8148fad21a7acd1d66acb27 Mon Sep 17 00:00:00 2001
From: 罗广辉 <guanghui.luo@foxmail.com>
Date: Fri, 06 Jun 2025 15:43:52 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'
---
src/api/device-setting/index.js | 57 +++++
src/permission copy 2.js | 71 +++++++
src/permission.js | 62 ++++++
src/views/system/userinfo.vue | 30 ++
src/permission copy.js | 133 +++++++++++++
src/views/tickets/orderLog.vue | 27 ++
src/store/modules/user.js | 2
src/views/device/components/DockControlPanel.vue | 203 ++++++++++++++++++-
src/option/user/info.js | 15 +
9 files changed, 575 insertions(+), 25 deletions(-)
diff --git a/src/api/device-setting/index.js b/src/api/device-setting/index.js
index b7a1f3e..84fba89 100644
--- a/src/api/device-setting/index.js
+++ b/src/api/device-setting/index.js
@@ -29,10 +29,65 @@
*/
export const setThermalCurrentPaletteStyle = (deviceSn, workspaceId, param) => {
return request({
- // /manage/api/v1/devices/selectDevicePage
// url: `/localApi/manage/api/v1/devices/${workspaceId}/devices/${deviceSn}/setThermalCurrentPaletteStyle`,
url: `/drone-device-core/manage/api/v1/devices/${workspaceId}/devices/${deviceSn}/setThermalCurrentPaletteStyle`,
method: 'put',
data: param,
})
}
+/**
+ * 照片存储设置
+ * @param {机场编码} sn
+ * @param {*} body
+ * @returns
+ */
+export const setPhotoStorageSet = (sn, param) => {
+ return request({
+ // url: `/localApi/control/api/v1/devices/${sn}/payload/photoStorageSet`,
+ url: `/drone-device-core/control/api/v1/devices/${sn}/payload/photoStorageSet`,
+ method: 'post',
+ data: param,
+ })
+}
+/**
+ * 视频存储设置
+ * @param {机场编码} sn
+ * @param {*} body
+ * @returns
+ */
+export const setVideoStorageSet = (sn, param) => {
+ return request({
+ // url: `/localApi/control/api/v1/devices/${sn}/payload/videoStorageSet`,
+ url: `/drone-device-core/control/api/v1/devices/${sn}/payload/videoStorageSet`,
+ method: 'post',
+ data: param
+ ,
+ })
+}
+// 获取live_status
+export const getLiveStatus = (sn) => {
+ return request({
+ url: `/drone-device-core/manage/api/v1/live/getLiveStatus/${sn}`,
+ method: 'get',
+ })
+}
+
+// 视频流设置方法
+export const setStreamsSwitch = (param) => {
+ return request({
+ url: `/drone-device-core/manage/api/v1/live/streams/switch`,
+ method: 'post',
+ data: param
+ })
+}
+// 控制台-云台拍照录像动作
+export const photoAndVideoCmd = (droneSn,mode) => {
+ return request({
+ url: `/drone-device-core/droneAirport/liveStreamApi/switch/vedioMode`,
+ method: 'get',
+ params: {
+ droneSn,
+ mode
+ }
+ })
+}
diff --git a/src/option/user/info.js b/src/option/user/info.js
index b9d4ea9..b8a7ccf 100644
--- a/src/option/user/info.js
+++ b/src/option/user/info.js
@@ -1,6 +1,10 @@
export default {
tabs: true,
tabsActive: 1,
+ // 全局禁用自动填充
+ formAttrs: {
+ autocomplete: 'off'
+ },
group: [
{
label: '个人信息',
@@ -25,14 +29,25 @@
span: 12,
row: true,
prop: 'realName',
+ rules: [
+ {
+ required: true,
+ message: '姓名不能为空',
+ trigger: 'blur'
+ }
+ ],
+ required: true
+
},
{
label: '手机号',
span: 12,
row: true,
prop: 'phone',
+
},
{
+ slot: true,
label: '邮箱',
prop: 'email',
span: 12,
diff --git a/src/permission copy 2.js b/src/permission copy 2.js
new file mode 100644
index 0000000..821f3dc
--- /dev/null
+++ b/src/permission copy 2.js
@@ -0,0 +1,71 @@
+/*
+ * @Author: GuLiMmo 2820890765@qq.com
+ * @Date: 2024-08-23 10:51:53
+ * @LastEditors: GuLiMmo 2820890765@qq.com
+ * @LastEditTime: 2024-08-29 14:10:56
+ * @FilePath: /drone-web-manage/src/permission.js
+ * @Description:
+ * Copyright (c) 2024 by GuLiMmo, All Rights Reserved.
+ */
+import router from './router/'
+import store from './store'
+import { getToken } from '@/utils/auth'
+import { getUrlParams } from './utils/validate'
+import NProgress from 'nprogress' // progress bar
+import 'nprogress/nprogress.css' // progress bar style
+NProgress.configure({ showSpinner: false })
+const lockPage = '/lock' //锁屏页
+const urlParams = getUrlParams(window.location.href)
+
+router.beforeEach((to, from, next) => {
+ const meta = to.meta || {}
+ const isMenu = meta.menu === undefined ? to.query.menu : meta.menu
+ store.commit('SET_IS_MENU', isMenu === undefined)
+ if (getToken()) {
+ if (store.getters.isLock && to.path !== lockPage) {
+ //如果系统激活锁屏,全部跳转到锁屏页
+ next({ path: lockPage })
+ } else if (to.path === '/login') {
+ //如果登录成功访问登录页跳转到主页
+ next({ path: '/' })
+ } else {
+ const systemToken = store.getters.token || urlParams?.token
+ if (systemToken === 0) {
+ store.dispatch('FedLogOut').then(() => {
+ next({ path: '/login' })
+ })
+ } else {
+ const meta = to.meta || {}
+ const query = to.query || {}
+ if (meta.target) {
+ window.open(query.url.replace(/#/g, '&'))
+ return
+ } else if (meta.isTab !== false) {
+ store.commit('ADD_TAG', {
+ name: query.name || to.name,
+ path: to.path,
+ fullPath: to.path,
+ params: to.params,
+ query: to.query,
+ meta: meta,
+ })
+ }
+ next()
+ }
+ }
+ } else {
+ //判断是否需要认证,没有登录访问去登录页
+ if (meta.isAuth === false) {
+ next()
+ } else {
+ next('/login')
+ }
+ }
+})
+
+router.afterEach(to => {
+ NProgress.done()
+ let title = router.$avueRouter.generateTitle(to, { label: 'name' })
+ router.$avueRouter.setTitle(title)
+ store.commit('SET_IS_SEARCH', false)
+})
diff --git a/src/permission copy.js b/src/permission copy.js
new file mode 100644
index 0000000..c244bec
--- /dev/null
+++ b/src/permission copy.js
@@ -0,0 +1,133 @@
+/*
+ * @Author: GuLiMmo 2820890765@qq.com
+ * @Date: 2024-08-23 10:51:53
+ * @LastEditors: GuLiMmo 2820890765@qq.com
+ * @LastEditTime: 2024-08-29 14:10:56
+ * @FilePath: /drone-web-manage/src/permission.js
+ * @Description:
+ * Copyright (c) 2024 by GuLiMmo, All Rights Reserved.
+ */
+
+import { getStore } from '@/utils/store'
+import router from './router/'
+import store from './store'
+import { getToken } from '@/utils/auth'
+import { getUrlParams } from './utils/validate'
+import NProgress from 'nprogress' // progress bar
+import 'nprogress/nprogress.css' // progress bar style
+NProgress.configure({ showSpinner: false })
+const lockPage = '/lock' //锁屏页
+const urlParams = getUrlParams(window.location.href)
+
+function findRouteByPath (routes, targetPath) {
+ // 遍历数组中的每个路由对象
+ for (const route of routes) {
+ // 如果当前路由的path匹配目标路径,直接返回
+ if (route.path === targetPath) {
+ return route
+ }
+
+ // 如果有子路由,递归查找
+ if (route.children && route.children.length > 0) {
+ const foundInChildren = findRouteByPath(route.children, targetPath)
+ if (foundInChildren) {
+ return foundInChildren
+ }
+ }
+ }
+
+ // 遍历完所有路由都没找到,返回null
+ return null
+}
+
+router.beforeEach((to, from, next) => {
+ const meta = to.meta || {}
+ const isMenu = meta.menu === undefined ? to.query.menu : meta.menu
+ store.commit('SET_IS_MENU', isMenu === undefined)
+
+ const menuAll = getStore({ name: 'menuAll' })
+
+ if (!menuAll) {
+ store.dispatch('GetMenu').then(data => {
+ if (data.length !== 0) {
+ router.$avueRouter.formatRoutes(data, true)
+
+ let newMenu = getStore({ name: 'menuAll' })
+
+ let firstMenu = newMenu[0]
+
+ let toMenu = findRouteByPath(newMenu, to.path)
+
+ store.commit('ADD_TAG', {
+ name: firstMenu.name,
+ path: firstMenu.path,
+ fullPath: firstMenu.path,
+ params: firstMenu.params || {},
+ query: firstMenu.query || {},
+ meta: firstMenu.meta || {},
+ })
+
+ store.commit('ADD_TAG', {
+ name: toMenu.name,
+ path: toMenu.path,
+ fullPath: toMenu.path,
+ params: toMenu.params || {},
+ query: toMenu.query || {},
+ meta: toMenu.meta || {},
+ })
+
+ next(to.fullPath)
+ }
+ })
+
+ return
+ }
+
+ if (getToken()) {
+ if (store.getters.isLock && to.path !== lockPage) {
+ //如果系统激活锁屏,全部跳转到锁屏页
+ next({ path: lockPage })
+ } else if (to.path === '/login') {
+ //如果登录成功访问登录页跳转到主页
+ next({ path: '/' })
+ } else {
+ const systemToken = store.getters.token || urlParams?.token
+ if (systemToken === 0) {
+ store.dispatch('FedLogOut').then(() => {
+ next({ path: '/login' })
+ })
+ } else {
+ const meta = to.meta || {}
+ const query = to.query || {}
+ if (meta.target) {
+ window.open(query.url.replace(/#/g, '&'))
+ return
+ } else if (meta.isTab !== false) {
+ store.commit('ADD_TAG', {
+ name: query.name || to.name,
+ path: to.path,
+ fullPath: to.path,
+ params: to.params,
+ query: to.query,
+ meta: meta,
+ })
+ }
+ next()
+ }
+ }
+ } else {
+ //判断是否需要认证,没有登录访问去登录页
+ if (meta.isAuth === false) {
+ next()
+ } else {
+ next('/login')
+ }
+ }
+})
+
+router.afterEach(to => {
+ NProgress.done()
+ let title = router.$avueRouter.generateTitle(to, { label: 'name' })
+ router.$avueRouter.setTitle(title)
+ store.commit('SET_IS_SEARCH', false)
+})
diff --git a/src/permission.js b/src/permission.js
index 821f3dc..c244bec 100644
--- a/src/permission.js
+++ b/src/permission.js
@@ -7,6 +7,8 @@
* @Description:
* Copyright (c) 2024 by GuLiMmo, All Rights Reserved.
*/
+
+import { getStore } from '@/utils/store'
import router from './router/'
import store from './store'
import { getToken } from '@/utils/auth'
@@ -17,10 +19,70 @@
const lockPage = '/lock' //锁屏页
const urlParams = getUrlParams(window.location.href)
+function findRouteByPath (routes, targetPath) {
+ // 遍历数组中的每个路由对象
+ for (const route of routes) {
+ // 如果当前路由的path匹配目标路径,直接返回
+ if (route.path === targetPath) {
+ return route
+ }
+
+ // 如果有子路由,递归查找
+ if (route.children && route.children.length > 0) {
+ const foundInChildren = findRouteByPath(route.children, targetPath)
+ if (foundInChildren) {
+ return foundInChildren
+ }
+ }
+ }
+
+ // 遍历完所有路由都没找到,返回null
+ return null
+}
+
router.beforeEach((to, from, next) => {
const meta = to.meta || {}
const isMenu = meta.menu === undefined ? to.query.menu : meta.menu
store.commit('SET_IS_MENU', isMenu === undefined)
+
+ const menuAll = getStore({ name: 'menuAll' })
+
+ if (!menuAll) {
+ store.dispatch('GetMenu').then(data => {
+ if (data.length !== 0) {
+ router.$avueRouter.formatRoutes(data, true)
+
+ let newMenu = getStore({ name: 'menuAll' })
+
+ let firstMenu = newMenu[0]
+
+ let toMenu = findRouteByPath(newMenu, to.path)
+
+ store.commit('ADD_TAG', {
+ name: firstMenu.name,
+ path: firstMenu.path,
+ fullPath: firstMenu.path,
+ params: firstMenu.params || {},
+ query: firstMenu.query || {},
+ meta: firstMenu.meta || {},
+ })
+
+ store.commit('ADD_TAG', {
+ name: toMenu.name,
+ path: toMenu.path,
+ fullPath: toMenu.path,
+ params: toMenu.params || {},
+ query: toMenu.query || {},
+ meta: toMenu.meta || {},
+ })
+
+ next(to.fullPath)
+ }
+ })
+
+ return
+ }
+
if (getToken()) {
if (store.getters.isLock && to.path !== lockPage) {
//如果系统激活锁屏,全部跳转到锁屏页
diff --git a/src/store/modules/user.js b/src/store/modules/user.js
index 734dfc0..3b6a410 100644
--- a/src/store/modules/user.js
+++ b/src/store/modules/user.js
@@ -39,7 +39,7 @@
token: getStore({ name: 'token' }) || '',
refreshToken: getStore({ name: 'refreshToken' }) || '',
parentDeptInfo: getStore({ name: 'parentDeptInfo' }) || '',
- defaultAva: defaultAva, // 将图片路径存入 state(可选)
+
},
actions: {
//根据用户名登录
diff --git a/src/views/device/components/DockControlPanel.vue b/src/views/device/components/DockControlPanel.vue
index 4fc7f82..c56b9a2 100644
--- a/src/views/device/components/DockControlPanel.vue
+++ b/src/views/device/components/DockControlPanel.vue
@@ -19,31 +19,64 @@
<div class="item-status">{{ cmdItem.status }}</div>
</div>
<div class="control-cmd-item-right">
- <el-button :disabled="!debugStatus || cmdItem.disabled" :loading="cmdItem.loading" size="small" type="primary"
- @click="sendControlCmd(cmdItem, index)">
+ <el-button :disabled="!debugStatus || cmdItem.disabled" :loading="cmdItem.loading" size="small"
+ type="primary" @click="sendControlCmd(cmdItem, index)">
{{ cmdItem.operateText }}
</el-button>
</div>
</div>
</div>
+
<el-divider v-if="deviceInfo">无人机设置</el-divider>
- <!-- 设置 0:白热,1:黑热,2:描红,3:医疗,5:彩虹 1,6:铁红,8:北极,11:熔岩,12:热铁,13:彩虹 2 -->
- <div class="control-cmd-box">
- <div class="control-cmd-item" v-for="(item, index) in cameras">
- <div class="control-cmd-item-left">调色盘样式 {{ item.payload_index }}</div>
- <div class="control-cmd-item-right">
+ <div class="control-cmd-box" v-for="(item, index) in cameras">
+ <div>
+ <el-form-item label="摄像头设置">
+ <el-select @change="cameraSettings($event, item)" v-model="videoValue" placeholder="请选择">
+ <el-option v-for="item in videoType" :key="item.value" :label="item.label" :value="item.value">
+ </el-option>
+ </el-select>
+ </el-form-item>
+
+ <el-form-item label="调色盘样式" v-if="videoValue == 'ir'">
<el-select @change="changs($event, item)" v-model="valueStyle" placeholder="请选择">
<el-option v-for="item in paletteOptions" :key="item.value" :label="item.label" :value="item.value">
</el-option>
</el-select>
- </div>
+ </el-form-item>
</div>
+
+ <div>
+ <el-form-item label="相机模式">
+ <el-select @change="photoAndVideoCmdSettings($event, item)" v-model="cameraModeValue" placeholder="请选择">
+ <el-option v-for="item in cameraMode" :key="item.value" :label="item.label" :value="item.value">
+ </el-option>
+ </el-select>
+ </el-form-item>
+
+ <el-form-item label="照片存储设置" v-if="cameraModeValue == 0">
+ <el-select v-model="item.photo_storage_settings" collapse-tags @change="photoStorageTypeChang($event, item)"
+ multiple placeholder="请选择">
+ <el-option v-for="item in photoStorageType" :key="item.value" :label="item.label" :value="item.value">
+ </el-option>
+ </el-select>
+ </el-form-item>
+
+ <el-form-item label="视频存储设置" v-if="cameraModeValue == 1">
+ <el-select v-model="item.video_storage_settings" collapse-tags @change="videoStorageTypeChang($event, item)"
+ multiple placeholder="请选择">
+ <el-option v-for="item in photoStorageType" :key="item.value" :label="item.label" :value="item.value">
+ </el-option>
+ </el-select>
+ </el-form-item>
+ </div>
+
</div>
</div>
</div>
</template>
<script setup>
+import { ElMessage } from 'element-plus';
import EventBus from '@/event-bus'
import { EBizCode, ELocalStorageKey, ERouterName } from '@/types'
import { useConnectWebSocket } from '@/hooks/use-connect-websocket'
@@ -53,18 +86,56 @@
import { useDockControl } from './use-dock-control'
import { EDockModeCode } from '@/types/device'
import { updateDeviceCmdInfoByOsd, updateDeviceCmdInfoByExecuteInfo } from '@/utils/device-cmd'
-import { setThermalCurrentPaletteStyle } from '@/api/device-setting'
+import { setThermalCurrentPaletteStyle, setPhotoStorageSet, setVideoStorageSet, getLiveStatus, setStreamsSwitch, photoAndVideoCmd } from '@/api/device-setting'
import Store from '@/store'
const valueStyle = ref(0)
+const cameraModeValue = ref(0)
+const videoValue = ref("zoom")
// 定义一个数据videoList
const videoList = reactive([])
// 摄像头信息
let cameras = reactive([])
+// let cameras = reactive([
+// {
+// camera_mode: 0,
+// liveview_world_region: {
+// bottom: 0.5515424609184265,
+// left: 0.42740535736083984,
+// right: 0.5581043362617493,
+// top: 0.42277535796165466
+// },
+// payload_index: "81-0-0",
+// photo_state: 0,
+// record_time: 0,
+// recording_state: 0,
+// remain_photo_num: 3931,
+// remain_record_duration: 0,
+// zoom_factor: 6.9999943,
+// ir_zoom_factor: 2,
+// photo_storage_settings: [
+// "vision",
+// "ir"
+// ],
+// video_storage_settings: [
+// "vision"
+// ]
+// }
+// ])
+
// 无人机信息
let deviceInfo = ref()
+
+// camera_mode {"0":"拍照","1":"录像","2":"智能低光","3":"全景拍照","-1":"不支持的模式"}
+const cameraMode = [
+ { label: '拍照', value: 0 },
+ { label: '录像', value: 1 },
+ { label: '智能低光', value: 2 },
+ { label: '全景拍照', value: 3 },
+ // { label: '不支持的模式', value: -1 },
+]
// 调色盘选项数据
const paletteOptions = [
@@ -78,6 +149,22 @@
{ label: '熔岩', value: 11 },
{ label: '热铁', value: 12 },
{ label: '彩虹2', value: 13 },
+]
+// 视频类型 ZOOM("zoom"), WIDE("wide"), THERMAL("thermal"), NORMAL("normal"), IR("ir");
+const videoType = [
+ { label: '变焦', value: 'zoom' },
+ { label: '广角', value: 'wide' },
+ // { label: '热红外', value: 'thermal' },
+ // { label: '正常', value: 'normal' },
+ { label: '红外', value: 'ir' },
+]
+// 拍照存储类型{current, wide, zoom, ir},可多选
+const photoStorageType = [
+ { label: '当前', value: 'current' },
+ { label: '广角', value: 'wide' },
+ { label: '变焦', value: 'zoom' },
+ { label: '可见光', value: 'vision' },
+ { label: '红外', value: 'ir' },
]
const props = defineProps(['sn', 'deviceInfo'])
@@ -103,7 +190,7 @@
watch(
() => Store.state.device.videoSurveillance,
newObj => {
- console.log('视频类型监听中', newObj)
+ // console.log('视频类型监听中', newObj)
if (newObj && newObj.live_status && newObj.live_status.length) {
let arr = newObj.live_status || []
if (videoList.length == arr.length) {
@@ -112,8 +199,14 @@
arr.forEach(element => {
let video_id = element.video_id
element.payIndex = video_id.split('/')[1].split('-')[1]
+ if (props.deviceInfo.child_sn == video_id.split('/')[0]) {
+ if (element.video_type == 'normal' || element.video_type == 'thermal') {
+ videoValue.value = 'wide'
+ } else {
+ videoValue.value = element.video_type
+ }
+ }
})
- // videoList.length = 0 // 清空数组
videoList.push(...arr) // 添加新元素
}
},
@@ -135,7 +228,12 @@
devices['dock'] = value.dockInfo[props.deviceInfo.device_sn]
devices['gateway'] = value.gatewayInfo
let cameraList = value.deviceInfo[props.deviceInfo.child_sn]?.cameras || []
- cameras = reactive([...cameraList])
+ cameras = cameraList
+ // console.log('设备osd.cameras信息变化', cameras)
+ // 判断cameras列表长度是否为0,如果为0,则不执行后续操作
+ if (cameras.length > 0) {
+ cameraModeValue.value = cameras[0].camera_mode
+ }
deviceInfo = ref(value.deviceInfo[props.deviceInfo.child_sn])
updateDeviceCmdInfoByOsd(cmdList.value, devices)
}
@@ -145,9 +243,26 @@
deep: true,
}
)
+onMounted(() => {
+ getLiveStatuss()
+});
+
+async function getLiveStatuss() {
+ let result = await getLiveStatus(props.sn)
+ result.data.data.live_status.forEach(item => {
+ if (props.deviceInfo.child_sn == item.video_id.split('/')[0]) {
+ if (item.video_type == 'normal' || item.video_type == 'thermal') {
+ videoValue.value = 'wide'
+ } else {
+ videoValue.value = item.video_type
+ }
+ }
+ })
+}
+
// 远程控制开关
-async function onDeviceStatusChange (status) {
+async function onDeviceStatusChange(status) {
let result = false
if (status) {
result = await dockDebugOnOff(props.sn, true)
@@ -166,7 +281,7 @@
const { sendDockControlCmd, dockDebugOnOff } = useDockControl()
-async function sendControlCmd (cmdItem, index) {
+async function sendControlCmd(cmdItem, index) {
const params = {
sn: props.sn,
cmd: cmdItem.cmdKey,
@@ -270,7 +385,7 @@
useConnectWebSocket(messageHandler, webSorketUrl)
// 添加 changs 方法
-async function changs (value, item) {
+async function changs(value, item) {
const payload = {
[item.payload_index]: {
thermal_current_palette_style: value
@@ -278,8 +393,62 @@
}
console.log('payload', payload)
let data = await setThermalCurrentPaletteStyle(props.sn, props.deviceInfo.workspace_id, payload)
- if (data.code === 0) {
- message.success('修改成功')
+ if (data.data.code === 0) {
+ ElMessage.success('修改成功');
+ }
+}
+// 摄像头设置
+async function cameraSettings(value, item) {
+ const payload = {
+ // 1581F6Q8D245U00G57GJ/81-0-0/normal-0
+ video_id: props.deviceInfo.child_sn + '/' + item.payload_index + '/normal-0',
+ video_type: value
+ }
+ let data = await setStreamsSwitch(payload)
+ if (data.data.code === 0) {
+ ElMessage.success('修改成功');
+ }
+}
+// 相机模式设置
+async function photoAndVideoCmdSettings(value, item) {
+ // photo 0 video_start 1 video_stop
+ item.camera_mode = value
+ let data = await photoAndVideoCmd(props.deviceInfo.child_sn, value)
+ if (data.data.code == 0) {
+ ElMessage.success('修改成功');
+ }
+}
+// 照片存储设置
+async function photoStorageTypeChang(value, item) {
+ // value 不能为空
+ if (!value) {
+ ElMessage.error('请选择存储方式');
+ return;
+ }
+ const payload = {
+ payload_index: item.payload_index,
+ photo_storage_settings: value
+ }
+ item.photo_storage_settings = value
+ let data = await setPhotoStorageSet(props.sn, payload)
+ if (data.data.code == 0) {
+ ElMessage.success('修改成功');
+ }
+}
+// 视频存储设置
+async function videoStorageTypeChang(value, item) {
+ if (!value) {
+ ElMessage.error('请选择存储方式');
+ return;
+ }
+ const payload = {
+ payload_index: item.payload_index,
+ video_storage_settings: value
+ }
+ item.video_storage_settings = value
+ let data = await setVideoStorageSet(props.sn, payload)
+ if (data.data.code == 0) {
+ ElMessage.success('修改成功');
}
}
</script>
diff --git a/src/views/system/userinfo.vue b/src/views/system/userinfo.vue
index 5363c1b..8b8e12c 100644
--- a/src/views/system/userinfo.vue
+++ b/src/views/system/userinfo.vue
@@ -2,11 +2,27 @@
<div>
<basic-container>
<avue-form
+ ref="form"
:option="option"
v-model="form"
@tab-click="handleTabClick"
@submit="handleSubmit"
- ></avue-form>
+
+ >
+ <template #email="{ disabled, size }">
+ <el-input
+ id="adfsdafdsf"
+ type="text"
+ :disabled="disabled"
+ :size="size"
+ v-model="form.email"
+ placeholder="请输入邮箱"
+ :readonly="readonly"
+ @focus="readonly = false"
+ >
+ </el-input>
+ </template>
+ </avue-form>
</basic-container>
</div>
</template>
@@ -17,14 +33,14 @@
import md5 from 'js-md5';
import func from '@/utils/func';
import { validatenull } from '@/utils/validate';
-import router from '@/router';
-
+import defaultAva from '@/assets/images/defaultava.png';
export default {
data() {
return {
index: 0,
option: option,
- form: {},
+ form: { },
+ readonly: true
};
},
created() {
@@ -33,7 +49,7 @@
methods: {
handleSubmit(form, done) {
if (this.index === 0) {
- form.name = form.realName
+ form.name = form.realName;
updateInfo(form).then(
res => {
if (res.data.success) {
@@ -86,15 +102,17 @@
const user = res.data.data;
this.form = {
id: user.id,
- avatar: user.avatar,
+ avatar: user.avatar ? user.avatar :defaultAva,
name: user.name,
realName: user.realName,
phone: user.phone,
email: user.email,
};
+
});
}
},
+
handleTabClick(tabs) {
if (validatenull(tabs.index)) {
return;
diff --git a/src/views/tickets/orderLog.vue b/src/views/tickets/orderLog.vue
index e34ef40..32d0141 100644
--- a/src/views/tickets/orderLog.vue
+++ b/src/views/tickets/orderLog.vue
@@ -1189,6 +1189,20 @@
this.detailVisible = true;
+ // 更新航线列表,追加 wayline_file_region_vo 数据
+ if (data.wayline_file_region_vo) {
+ const newWayline = data.wayline_file_region_vo;
+
+ // 检查是否已经存在于 this.wayLineList 中
+ const isDuplicate = this.wayLineList.some(
+ (item) => item.wayline_id === newWayline.wayline_id
+ );
+
+ if (!isDuplicate) {
+ this.wayLineList.push(newWayline);
+ }
+ }
+
this.initMapLine(data.device_map_infos);
},
async handleCheckDetail(row) {
@@ -1197,7 +1211,20 @@
this.form = {
...data,
};
+ // 更新航线列表,追加 wayline_file_region_vo 数据
+ // 更新航线列表,追加 wayline_file_region_vo 数据
+ if (data.wayline_file_region_vo) {
+ const newWayline = data.wayline_file_region_vo;
+ // 检查是否已经存在于 this.wayLineList 中
+ const isDuplicate = this.wayLineList.some(
+ (item) => item.wayline_id === newWayline.wayline_id
+ );
+
+ if (!isDuplicate) {
+ this.wayLineList.push(newWayline);
+ }
+ }
// 更新机巢列表
this.device_sns = data.device_list;
this.detailVisibleCopy = true;
--
Gitblit v1.9.3