Merge branch 'zyl' of http://xny.yj-3d.com:3000/zhouyulong/electron-4 into zyl
This commit is contained in:
Binary file not shown.
3407
src/renderer/public/sdk/YJEarth.min.js
vendored
3407
src/renderer/public/sdk/YJEarth.min.js
vendored
File diff suppressed because one or more lines are too long
BIN
src/renderer/public/sdk/img/material/brick1.png
Normal file
BIN
src/renderer/public/sdk/img/material/brick1.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 7.6 MiB |
BIN
src/renderer/public/sdk/img/material/brick2.png
Normal file
BIN
src/renderer/public/sdk/img/material/brick2.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.7 MiB |
BIN
src/renderer/public/sdk/img/material/brick3.png
Normal file
BIN
src/renderer/public/sdk/img/material/brick3.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 717 KiB |
@ -106,8 +106,10 @@ const handleChange = (val, key) => {
|
||||
}
|
||||
const updateEvent = () => {
|
||||
// console.log(detail.value)
|
||||
let obj = eventObj.value
|
||||
let obj = JSON.parse(JSON.stringify(eventObj.value))
|
||||
let durationS = eventObj.value.duration_time
|
||||
// console.log("eventObj.value", eventObj.value)
|
||||
// console.log("eventObj.value", durationS)
|
||||
if (!durationS)
|
||||
durationS = (eventObj.value.endTime - eventObj.value.startTime) / 1000
|
||||
switch (eventObj.value.callback) {
|
||||
@ -123,6 +125,7 @@ const updateEvent = () => {
|
||||
TsApi.updateTsEvent(obj).then(res => {
|
||||
console.log(res)
|
||||
if (res.code == 200) {
|
||||
eventBus.emit('update-event', obj)
|
||||
ElMessage({type: "success", message: "操作成功"})
|
||||
cancel()
|
||||
}
|
||||
|
||||
@ -164,11 +164,20 @@ export const useRightOperate = () => {
|
||||
})
|
||||
let eventIds = []
|
||||
source_ids.forEach(item => {
|
||||
let entity = (window as any).earth_ts.entityMap.get(item)
|
||||
let keys = Array.from((window as any)._entityMap.keys())
|
||||
keys.forEach(keyI => {
|
||||
// @ts-ignore
|
||||
if (keyI.indexOf(item) > -1) {
|
||||
let entity = (window as any)._entityMap.get(keyI)
|
||||
console.log("keyI", keyI)
|
||||
// return
|
||||
if (entity) {
|
||||
entity.remove();
|
||||
(window as any)._entityMap.delete(entity.options.id)
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
//关闭资源的编辑框,删除相关的事件
|
||||
// eventBus.emit("destroyComponent", item);
|
||||
let arr = window['tsObj']._Store.getTaskByProperty(item, "sourceId", "id")
|
||||
|
||||
@ -255,6 +255,7 @@ let pauseTrajectoryMotion = () => {
|
||||
let TrajectoryMotionObject = window['_entityMap'].get(TrajectoryMotionMapKey);
|
||||
if (props.TSOBJ._Clock._status == 'play') {
|
||||
TrajectoryMotionObject.state = true
|
||||
TrajectoryMotionObject.speed = TrajectoryMotionObject.oldSpeed * props.TSOBJ._Store._multiplier
|
||||
} else {
|
||||
TrajectoryMotionObject.state = false
|
||||
if (props.TSOBJ._Clock._status == 'stop') {
|
||||
@ -270,7 +271,7 @@ let pauseTrajectoryMotion = () => {
|
||||
console.log("通过当前时间戳和时间间隔计算出剩余间隔次数", offsetSecond)
|
||||
let nums = Math.ceil(offsetSecond / task.detail.times)
|
||||
let restNums = (task.detail.numbers - nums)
|
||||
entity.flicker(task.detail.times * 1000, restNums)
|
||||
entity.flicker(task.detail.times * 1000 / props.TSOBJ._Store._multiplier, restNums)
|
||||
} else {
|
||||
entity && entity.flicker(1, 1)
|
||||
}
|
||||
@ -371,6 +372,7 @@ const handleDrag = (newLeft: number) => {
|
||||
tsEntitys.show = true
|
||||
// TrajectoryMotionObject.speed = TrajectoryMotionObject.oldSpeed
|
||||
console.log(window['tsObj']._Store._currentTimestamp - task.startTime)
|
||||
TrajectoryMotionObject.speed = TrajectoryMotionObject.oldSpeed
|
||||
TrajectoryMotionObject.setMovePositionByTime((window['tsObj']._Store._currentTimestamp - task.startTime) / 1000)
|
||||
break;
|
||||
default:
|
||||
|
||||
@ -437,6 +437,9 @@ let getEventList = () => {
|
||||
})
|
||||
newTS(params, events)
|
||||
}
|
||||
eventBus.on('update-event', (task) => {
|
||||
tsOBJ.value._Store._tasks = tsOBJ.value.replaceArrayItem(tsOBJ.value._Store._tasks, task)
|
||||
})
|
||||
eventBus.on('delete-event', (ids) => {
|
||||
tsOBJ.value._Store._tasks = tsOBJ.value._Store._tasks.filter(item => !ids.includes(item.id))
|
||||
|
||||
|
||||
@ -40,6 +40,7 @@ export class Store {
|
||||
let index = option.wheel % 3
|
||||
this._scales.preMainIndex = preMainIndex - 1
|
||||
this._scales.distanceOfTicTiny = this._scales.distanceOfTicTinyRange[index]
|
||||
this._scales.distanceOfTicMain = this._scales.numOfMain * this._scales.distanceOfTicTiny
|
||||
console.log("this._scales.preMainIndex", this._scales.preMainIndex)
|
||||
console.log("this._scales.preMains", this._scales.preMains)
|
||||
console.log("this._scales.preMains", this._scales.preMains[this._scales.preMainIndex])
|
||||
|
||||
@ -31,7 +31,7 @@ export class TS extends Tools {
|
||||
// console.log("renderLabel", nums)
|
||||
let allTimeLabels = []
|
||||
for (let i = 0; i < all; i++) {
|
||||
let timeOfMain = this._Store.getScale('preMains')[this._Store.getScale('preMainIndex') - 1]
|
||||
let timeOfMain = this._Store.getScale('preMains')[this._Store.getScale('preMainIndex')]
|
||||
// console.log("timeOfMain", this._Store.getScale('preMains'))
|
||||
console.log("timeOfMain", timeOfMain)
|
||||
// console.log("timeOfMain", this._Store.getScale('preMainIndex'))
|
||||
@ -80,4 +80,29 @@ export class TS extends Tools {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 替换对象数组中指定的元素(通过id匹配)
|
||||
* @param {Array} arr - 原始对象数组,元素结构需包含id属性
|
||||
* @param {Object} newItem - 要替换的新对象(必须包含id属性)
|
||||
* @param {string} [key='id'] - 匹配的唯一标识字段(默认使用id)
|
||||
* @returns {Array} - 返回替换后的新数组(原数组不会被修改)
|
||||
*/
|
||||
replaceArrayItem(arr, newItem, key = 'id') {
|
||||
// 边界校验
|
||||
if (!Array.isArray(arr)) {
|
||||
console.error('第一个参数必须是数组');
|
||||
return arr;
|
||||
}
|
||||
if (typeof newItem !== 'object' || newItem === null || !newItem[key]) {
|
||||
console.error(`新元素必须是包含${key}属性的对象`);
|
||||
return arr;
|
||||
}
|
||||
|
||||
// 遍历数组并替换匹配的元素(返回新数组,避免修改原数组)
|
||||
return arr.map(item => {
|
||||
// 匹配到对应id的元素则替换,否则返回原元素
|
||||
return item[key] === newItem[key] ? {...item, ...newItem} : item;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@ -105,6 +105,7 @@ function importAuth() {
|
||||
}
|
||||
$sendElectronChanel('open-directory-dialog', option)
|
||||
$recvElectronChanel('selectedItem', (e, paths) => {
|
||||
if (paths.length != 0) {
|
||||
let formdata = new FormData()
|
||||
formdata.append('filePath', paths[0])
|
||||
try {
|
||||
@ -112,6 +113,7 @@ function importAuth() {
|
||||
ElMessage.success('文件授权成功')
|
||||
getAuthInfo()
|
||||
} catch (error) {}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
@ -3,6 +3,7 @@
|
||||
v-show="visible"
|
||||
class="context-menu"
|
||||
:style="{ left: x + 'px', top: y + 'px' }"
|
||||
@mousedown.stop
|
||||
@click.stop
|
||||
@contextmenu.stop
|
||||
>
|
||||
@ -24,8 +25,6 @@
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import { ref } from 'vue'
|
||||
|
||||
defineProps({
|
||||
visible: {
|
||||
type: Boolean,
|
||||
@ -52,7 +51,7 @@ defineProps({
|
||||
|
||||
const emit = defineEmits(['update:visible', 'command'])
|
||||
|
||||
const handleClick = (command: string) => {
|
||||
const handleClick = (command: string): void => {
|
||||
emit('update:visible', false)
|
||||
emit('command', command)
|
||||
}
|
||||
|
||||
@ -160,7 +160,7 @@
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import { ref, reactive, onMounted } from 'vue'
|
||||
import { ref, reactive, onMounted, onUnmounted, nextTick } from 'vue'
|
||||
import { Search } from '@element-plus/icons-vue'
|
||||
import type { TableColumnCtx } from 'element-plus'
|
||||
import contextMenuCom from './contentMenu.vue'
|
||||
@ -249,6 +249,24 @@ const handleHeaderDragend = (newWidth, oldWidth, column, event) => {
|
||||
item.width = item.width - (item.width / sum) * widthDiff
|
||||
})
|
||||
}
|
||||
const getColKey = (col: any) => {
|
||||
return col.property || col.type || col.label
|
||||
}
|
||||
const applySavedOrder = () => {
|
||||
const saved = localStorage.getItem('graphLabelManageTableOrder')
|
||||
if (!saved) return
|
||||
const order: string[] = JSON.parse(saved)
|
||||
const headerCols = tableRef.value.$refs.tableHeaderRef.columnRows[0]
|
||||
const allCols = tableRef.value.store.states.columns
|
||||
const sortByOrder = (arr: any[]) => {
|
||||
return arr.slice().sort((a, b) => order.indexOf(getColKey(a)) - order.indexOf(getColKey(b)))
|
||||
}
|
||||
const newHeader = sortByOrder(headerCols)
|
||||
const newAll = sortByOrder(allCols)
|
||||
tableRef.value.$refs.tableHeaderRef.columnRows[0] = newHeader
|
||||
tableRef.value.store.states.columns = newAll
|
||||
tableRef.value.doLayout()
|
||||
}
|
||||
|
||||
//搜索
|
||||
var photoName = ref('')
|
||||
@ -343,9 +361,36 @@ let openfunc = () => {
|
||||
|
||||
onMounted(() => {
|
||||
eventBus.on('openGraphLabel', openfunc)
|
||||
nextTick(() => {
|
||||
const headerEl = tableRef.value?.$refs?.tableHeaderRef?.$el?.querySelector('tr')
|
||||
if (!headerEl) return
|
||||
applySavedOrder()
|
||||
sortableInstance = Sortable.create(headerEl, {
|
||||
animation: 150,
|
||||
filter: '.el-table__column--gutter',
|
||||
onEnd: (evt: any) => {
|
||||
const headerCols = tableRef.value.$refs.tableHeaderRef.columnRows[0]
|
||||
const allCols = tableRef.value.store.states.columns
|
||||
const move = (arr: any[], from: number, to: number) => {
|
||||
const item = arr.splice(from, 1)[0]
|
||||
arr.splice(to, 0, item)
|
||||
}
|
||||
move(headerCols, evt.oldIndex, evt.newIndex)
|
||||
move(allCols, evt.oldIndex, evt.newIndex)
|
||||
tableRef.value.store.states.columns = allCols
|
||||
tableRef.value.doLayout()
|
||||
const keys = headerCols.map((c: any) => getColKey(c))
|
||||
localStorage.setItem('graphLabelManageTableOrder', JSON.stringify(keys))
|
||||
}
|
||||
})
|
||||
})
|
||||
})
|
||||
onUnmounted(() => {
|
||||
eventBus.off('openGraphLabel', openfunc)
|
||||
if (sortableInstance && typeof sortableInstance.destroy === 'function') {
|
||||
sortableInstance.destroy()
|
||||
sortableInstance = null
|
||||
}
|
||||
})
|
||||
let haventModel = false
|
||||
const getModelList = async () => {
|
||||
@ -586,11 +631,15 @@ const handleContextMenu = (event: MouseEvent, row: TypeNode) => {
|
||||
clickTreeNode = row
|
||||
|
||||
contextMenu.visible = true
|
||||
document.getElementsByClassName('settingPop')[0].removeEventListener('mousedown', func)
|
||||
document.getElementsByClassName('settingPop')[0].addEventListener('mousedown', func)
|
||||
const dialogEl = document.getElementsByClassName('settingPop')[0] as HTMLElement
|
||||
dialogEl.removeEventListener('mousedown', func as EventListener)
|
||||
dialogEl.addEventListener('mousedown', func as EventListener)
|
||||
}
|
||||
let func = () => {
|
||||
document.getElementsByClassName('settingPop')[0].removeEventListener('mousedown', func)
|
||||
let func = (ev: Event) => {
|
||||
const me = ev as MouseEvent
|
||||
const dialogEl = document.getElementsByClassName('settingPop')[0] as HTMLElement
|
||||
dialogEl.removeEventListener('mousedown', func as EventListener)
|
||||
if (me.button !== 0) return
|
||||
setTimeout(() => {
|
||||
contextMenu.visible = false
|
||||
}, 200)
|
||||
@ -645,8 +694,9 @@ const divContextMenu = (event: MouseEvent) => {
|
||||
contextMenu.items = [{ command: 'addType', label: '添加军标类型', icon: 'add' }]
|
||||
|
||||
contextMenu.visible = true
|
||||
document.getElementsByClassName('settingPop')[0].removeEventListener('mousedown', func)
|
||||
document.getElementsByClassName('settingPop')[0].addEventListener('mousedown', func)
|
||||
const dialogEl = document.getElementsByClassName('settingPop')[0] as HTMLElement
|
||||
dialogEl.removeEventListener('mousedown', func as EventListener)
|
||||
dialogEl.addEventListener('mousedown', func as EventListener)
|
||||
}
|
||||
|
||||
const handleMenuCommand = (command: string) => {
|
||||
@ -683,7 +733,8 @@ const handleTypeClick = (row: any) => {
|
||||
// loadModelsByType(row.id)
|
||||
// contextMenu.visible && (contextMenu.visible = false)
|
||||
}
|
||||
const handleClick = () => {
|
||||
const handleClick = (event: MouseEvent) => {
|
||||
if (event.button !== 0) return
|
||||
contextMenu.visible && (contextMenu.visible = false)
|
||||
}
|
||||
|
||||
|
||||
@ -173,7 +173,7 @@
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import { ref, reactive, onMounted, nextTick } from 'vue'
|
||||
import { ref, reactive, onMounted, onUnmounted, nextTick } from 'vue'
|
||||
import { Search } from '@element-plus/icons-vue'
|
||||
import type { TableColumnCtx } from 'element-plus'
|
||||
import contextMenuCom from './contentMenu.vue'
|
||||
@ -242,6 +242,49 @@ const handleHeaderDragend = (newWidth, oldWidth, column, event) => {
|
||||
item.width = item.width - (item.width / sum) * widthDiff
|
||||
})
|
||||
}
|
||||
const getColKey = (col: any) => {
|
||||
return col.property || col.type || col.label
|
||||
}
|
||||
const applySavedOrder = () => {
|
||||
const saved = localStorage.getItem('modelManageTableOrder')
|
||||
if (!saved) return
|
||||
const order: string[] = JSON.parse(saved)
|
||||
const headerCols = tableRef.value.$refs.tableHeaderRef.columnRows[0]
|
||||
const allCols = tableRef.value.store.states.columns
|
||||
const sortByOrder = (arr: any[]) => {
|
||||
return arr.slice().sort((a, b) => order.indexOf(getColKey(a)) - order.indexOf(getColKey(b)))
|
||||
}
|
||||
const newHeader = sortByOrder(headerCols)
|
||||
const newAll = sortByOrder(allCols)
|
||||
tableRef.value.$refs.tableHeaderRef.columnRows[0] = newHeader
|
||||
tableRef.value.store.states.columns = newAll
|
||||
tableRef.value.doLayout()
|
||||
}
|
||||
onMounted(() => {
|
||||
nextTick(() => {
|
||||
const headerEl = tableRef.value?.$refs?.tableHeaderRef?.$el?.querySelector('tr')
|
||||
if (!headerEl) return
|
||||
applySavedOrder()
|
||||
sortableInstance = Sortable.create(headerEl, {
|
||||
animation: 150,
|
||||
filter: '.el-table__column--gutter',
|
||||
onEnd: (evt: any) => {
|
||||
const headerCols = tableRef.value.$refs.tableHeaderRef.columnRows[0]
|
||||
const allCols = tableRef.value.store.states.columns
|
||||
const move = (arr: any[], from: number, to: number) => {
|
||||
const item = arr.splice(from, 1)[0]
|
||||
arr.splice(to, 0, item)
|
||||
}
|
||||
move(headerCols, evt.oldIndex, evt.newIndex)
|
||||
move(allCols, evt.oldIndex, evt.newIndex)
|
||||
tableRef.value.store.states.columns = allCols
|
||||
tableRef.value.doLayout()
|
||||
const keys = headerCols.map((c: any) => getColKey(c))
|
||||
localStorage.setItem('modelManageTableOrder', JSON.stringify(keys))
|
||||
}
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
//滚动加载
|
||||
const disabledScroll = ref(false)
|
||||
@ -349,6 +392,10 @@ onMounted(() => {
|
||||
onUnmounted(() => {
|
||||
eventBus.off('settingPop', setFunc)
|
||||
eventBus.off('openModelManage', openfunc)
|
||||
if (sortableInstance && typeof sortableInstance.destroy === 'function') {
|
||||
sortableInstance.destroy()
|
||||
sortableInstance = null
|
||||
}
|
||||
})
|
||||
//获取模型列表
|
||||
// eventBus.on('settingPop', (data) => {
|
||||
@ -651,11 +698,15 @@ const handleContextMenu = (event: MouseEvent, row: TypeNode) => {
|
||||
clickTreeNode = row
|
||||
|
||||
contextMenu.visible = true
|
||||
document.getElementsByClassName('settingPop')[0].removeEventListener('mousedown', func)
|
||||
document.getElementsByClassName('settingPop')[0].addEventListener('mousedown', func)
|
||||
const dialogEl = document.getElementsByClassName('settingPop')[0] as HTMLElement
|
||||
dialogEl.removeEventListener('mousedown', func as EventListener)
|
||||
dialogEl.addEventListener('mousedown', func as EventListener)
|
||||
}
|
||||
let func = () => {
|
||||
document.getElementsByClassName('settingPop')[0].removeEventListener('mousedown', func)
|
||||
let func = (ev: Event) => {
|
||||
const me = ev as MouseEvent
|
||||
const dialogEl = document.getElementsByClassName('settingPop')[0] as HTMLElement
|
||||
dialogEl.removeEventListener('mousedown', func as EventListener)
|
||||
if (me.button !== 0) return
|
||||
setTimeout(() => {
|
||||
contextMenu.visible = false
|
||||
}, 200)
|
||||
@ -713,8 +764,9 @@ const divContextMenu = (event: MouseEvent) => {
|
||||
contextMenu.items = [{ command: 'addType', label: '添加模型类型', icon: 'add' }]
|
||||
|
||||
contextMenu.visible = true
|
||||
document.getElementsByClassName('settingPop')[0].removeEventListener('mousedown', func)
|
||||
document.getElementsByClassName('settingPop')[0].addEventListener('mousedown', func)
|
||||
const dialogEl = document.getElementsByClassName('settingPop')[0] as HTMLElement
|
||||
dialogEl.removeEventListener('mousedown', func as EventListener)
|
||||
dialogEl.addEventListener('mousedown', func as EventListener)
|
||||
}
|
||||
|
||||
const handleMenuCommand = (command: string) => {
|
||||
@ -751,7 +803,8 @@ const handleTypeClick = (row: any) => {
|
||||
// loadModelsByType(row.id)
|
||||
// contextMenu.visible && (contextMenu.visible = false)
|
||||
}
|
||||
const handleClick = () => {
|
||||
const handleClick = (event: MouseEvent) => {
|
||||
if (event.button !== 0) return
|
||||
contextMenu.visible && (contextMenu.visible = false)
|
||||
}
|
||||
|
||||
|
||||
@ -115,28 +115,18 @@
|
||||
<el-table-column prop="iconDataUrl" label="缩略图" width="140">
|
||||
<template #default="{ row, $index }" v-if="activeIndex === 2">
|
||||
<el-image
|
||||
ref="imageRef"
|
||||
fit="contain"
|
||||
:preview-teleported="true"
|
||||
:preview-src-list="modelList.map((item: any) => service + item.iconDataUrl)"
|
||||
style="width: 80px; height: 60px"
|
||||
:src="service + row.iconDataUrl"
|
||||
:initial-index="currentIndex"
|
||||
@click="seeBigPhoto($index)"
|
||||
:src="service + row.iconDataUrl + '?_=' + (row.updatedAt || cacheBust)"
|
||||
@click.stop.prevent="reviewPhoto($index)"
|
||||
/>
|
||||
</template>
|
||||
<template #default="{ row, $index }" v-else>
|
||||
<el-image
|
||||
ref="imageRef"
|
||||
fit="contain"
|
||||
:preview-teleported="true"
|
||||
:preview-src-list="
|
||||
modelList.map((item: any) => 'http://localhost:55110/' + item.iconDataUrl)
|
||||
"
|
||||
style="width: 80px; height: 60px"
|
||||
:src="'http://localhost:55110/' + row.iconDataUrl"
|
||||
:initial-index="currentIndex"
|
||||
@click="seeBigPhoto($index)"
|
||||
:src="'http://localhost:55110/' + row.iconDataUrl + '?_=' + cacheBust"
|
||||
@click.stop.prevent="reviewPhoto($index)"
|
||||
/>
|
||||
</template>
|
||||
</el-table-column>
|
||||
@ -162,6 +152,16 @@
|
||||
</el-col>
|
||||
</el-row>
|
||||
|
||||
<el-image
|
||||
ref="imageRef"
|
||||
fit="contain"
|
||||
:preview-teleported="true"
|
||||
:preview-src-list="previewList"
|
||||
:initial-index="currentIndex"
|
||||
:src="previewList[currentIndex] || ''"
|
||||
style="display: none"
|
||||
/>
|
||||
|
||||
<!-- 右键菜单 -->
|
||||
<contextMenuCom
|
||||
v-model:visible="contextMenu.visible"
|
||||
@ -199,7 +199,7 @@
|
||||
|
||||
<script lang="ts" setup>
|
||||
import { Search } from '@element-plus/icons-vue'
|
||||
import { ref, reactive, onMounted, nextTick } from 'vue'
|
||||
import { ref, reactive, onMounted, onUnmounted, nextTick, computed } from 'vue'
|
||||
import type { TableColumnCtx } from 'element-plus'
|
||||
import contextMenuCom from './contentMenu.vue'
|
||||
import Sortable from 'sortablejs'
|
||||
@ -275,6 +275,24 @@ const handleHeaderDragend = (newWidth, oldWidth, column, event) => {
|
||||
item.width = item.width - (item.width / sum) * widthDiff
|
||||
})
|
||||
}
|
||||
const getColKey = (col: any) => {
|
||||
return col.property || col.type || col.label
|
||||
}
|
||||
const applySavedOrder = () => {
|
||||
const saved = localStorage.getItem('photoManageTableOrder')
|
||||
if (!saved) return
|
||||
const order: string[] = JSON.parse(saved)
|
||||
const headerCols = tableRef.value.$refs.tableHeaderRef.columnRows[0]
|
||||
const allCols = tableRef.value.store.states.columns
|
||||
const sortByOrder = (arr: any[]) => {
|
||||
return arr.slice().sort((a, b) => order.indexOf(getColKey(a)) - order.indexOf(getColKey(b)))
|
||||
}
|
||||
const newHeader = sortByOrder(headerCols)
|
||||
const newAll = sortByOrder(allCols)
|
||||
tableRef.value.$refs.tableHeaderRef.columnRows[0] = newHeader
|
||||
tableRef.value.store.states.columns = newAll
|
||||
tableRef.value.doLayout()
|
||||
}
|
||||
|
||||
var expandedKeys: any = ref([])
|
||||
// 获取当前所有展开节点的key
|
||||
@ -310,10 +328,10 @@ const treeRef = ref()
|
||||
var currentIndex = ref(0)
|
||||
const reviewPhoto = (index) => {
|
||||
currentIndex.value = index
|
||||
imageRef.value!.showPreview()
|
||||
}
|
||||
const seeBigPhoto = (index) => {
|
||||
currentIndex.value = index
|
||||
cacheBust.value = Date.now()
|
||||
nextTick(() => {
|
||||
imageRef.value?.showPreview?.()
|
||||
})
|
||||
}
|
||||
|
||||
//滚动加载
|
||||
@ -348,6 +366,15 @@ const closeDialog = () => {
|
||||
modelType.value = ''
|
||||
dialogVisible.value = false
|
||||
}
|
||||
// 预览防缓存
|
||||
const cacheBust = ref(Date.now())
|
||||
const previewList = computed(() => {
|
||||
const base = activeIndex.value === 2 ? service.value || '' : 'http://localhost:55110/'
|
||||
return modelList.value.map((item: any) => {
|
||||
const t = item.updatedAt || cacheBust.value
|
||||
return base + item.iconDataUrl + '?_=' + t
|
||||
})
|
||||
})
|
||||
//@ts-ignore
|
||||
const addType = () => {
|
||||
if (!modelType.value) {
|
||||
@ -414,9 +441,36 @@ let openfunc = () => {
|
||||
|
||||
onMounted(() => {
|
||||
eventBus.on('openPhotoManage', openfunc)
|
||||
nextTick(() => {
|
||||
const headerEl = tableRef.value?.$refs?.tableHeaderRef?.$el?.querySelector('tr')
|
||||
if (!headerEl) return
|
||||
applySavedOrder()
|
||||
sortableInstance = Sortable.create(headerEl, {
|
||||
animation: 150,
|
||||
filter: '.el-table__column--gutter',
|
||||
onEnd: (evt: any) => {
|
||||
const headerCols = tableRef.value.$refs.tableHeaderRef.columnRows[0]
|
||||
const allCols = tableRef.value.store.states.columns
|
||||
const move = (arr: any[], from: number, to: number) => {
|
||||
const item = arr.splice(from, 1)[0]
|
||||
arr.splice(to, 0, item)
|
||||
}
|
||||
move(headerCols, evt.oldIndex, evt.newIndex)
|
||||
move(allCols, evt.oldIndex, evt.newIndex)
|
||||
tableRef.value.store.states.columns = allCols
|
||||
tableRef.value.doLayout()
|
||||
const keys = headerCols.map((c: any) => getColKey(c))
|
||||
localStorage.setItem('photoManageTableOrder', JSON.stringify(keys))
|
||||
}
|
||||
})
|
||||
})
|
||||
})
|
||||
onUnmounted(() => {
|
||||
eventBus.off('openPhotoManage', openfunc)
|
||||
if (sortableInstance && typeof sortableInstance.destroy === 'function') {
|
||||
sortableInstance.destroy()
|
||||
sortableInstance = null
|
||||
}
|
||||
})
|
||||
let haventModel = false
|
||||
const getModelList = async () => {
|
||||
@ -669,11 +723,15 @@ const handleContextMenu = (event: MouseEvent, row: TypeNode) => {
|
||||
clickTreeNode = row
|
||||
|
||||
contextMenu.visible = true
|
||||
document.getElementsByClassName('settingPop')[0].removeEventListener('mousedown', func)
|
||||
document.getElementsByClassName('settingPop')[0].addEventListener('mousedown', func)
|
||||
const dialogEl = document.getElementsByClassName('settingPop')[0] as HTMLElement
|
||||
dialogEl.removeEventListener('mousedown', func as EventListener)
|
||||
dialogEl.addEventListener('mousedown', func as EventListener)
|
||||
}
|
||||
let func = () => {
|
||||
document.getElementsByClassName('settingPop')[0].removeEventListener('mousedown', func)
|
||||
let func = (ev: Event) => {
|
||||
const me = ev as MouseEvent
|
||||
const dialogEl = document.getElementsByClassName('settingPop')[0] as HTMLElement
|
||||
dialogEl.removeEventListener('mousedown', func as EventListener)
|
||||
if (me.button !== 0) return
|
||||
setTimeout(() => {
|
||||
contextMenu.visible = false
|
||||
}, 200)
|
||||
@ -737,8 +795,9 @@ const divContextMenu = (event: MouseEvent) => {
|
||||
contextMenu.items = [{ command: 'addType', label: '添加图标类型', icon: 'add' }]
|
||||
|
||||
contextMenu.visible = true
|
||||
document.getElementsByClassName('settingPop')[0].removeEventListener('mousedown', func)
|
||||
document.getElementsByClassName('settingPop')[0].addEventListener('mousedown', func)
|
||||
const dialogEl = document.getElementsByClassName('settingPop')[0] as HTMLElement
|
||||
dialogEl.removeEventListener('mousedown', func as EventListener)
|
||||
dialogEl.addEventListener('mousedown', func as EventListener)
|
||||
}
|
||||
|
||||
const handleMenuCommand = (command: string) => {
|
||||
@ -776,7 +835,8 @@ const handleTypeClick = (row: any) => {
|
||||
// loadModelsByType(row.id)
|
||||
// contextMenu.visible && (contextMenu.visible = false)
|
||||
}
|
||||
const handleClick = () => {
|
||||
const handleClick = (event: MouseEvent) => {
|
||||
if (event.button !== 0) return
|
||||
contextMenu.visible && (contextMenu.visible = false)
|
||||
}
|
||||
|
||||
|
||||
@ -599,7 +599,7 @@ const sysChange = async () => {
|
||||
let data = name_map1.value.filter((item) => item.epsg === systemSetting.value.coordinate)
|
||||
showPosiType.value = data.length
|
||||
}
|
||||
utilsSysChange(eventBus)
|
||||
utilsSysChange(eventBus, false)
|
||||
}
|
||||
const searchWayChange = (val) => {
|
||||
localStorage.setItem('searchWay', val)
|
||||
|
||||
@ -131,7 +131,7 @@
|
||||
v-model="weatherData.time"
|
||||
type="date"
|
||||
value-format="YYYY-MM-DD"
|
||||
placeholder="Pick a day"
|
||||
placeholder="请选择日期"
|
||||
size="small"
|
||||
@change="weatherTimeChange"
|
||||
/>
|
||||
|
||||
@ -124,6 +124,8 @@
|
||||
<input
|
||||
class="input"
|
||||
type="number"
|
||||
min="-180"
|
||||
max="180"
|
||||
placeholder="请输入坐标点经度数值"
|
||||
v-model="longitude"
|
||||
/>
|
||||
@ -136,6 +138,8 @@
|
||||
<input
|
||||
class="input"
|
||||
type="number"
|
||||
min="-90"
|
||||
max="90"
|
||||
placeholder="请输入坐标点纬度数值"
|
||||
v-model="latitude"
|
||||
/>
|
||||
@ -390,14 +394,25 @@ const turnToPosition = async () => {
|
||||
let position
|
||||
switch (activeName.value) {
|
||||
case 'first':
|
||||
var point = await new YJ.Tools().sampleHeightMostDetailed(
|
||||
[{ lng: longitude.value, lat: latitude.value, alt: 0 }],
|
||||
let lng1 = Number(longitude.value)
|
||||
let lat1 = Number(latitude.value)
|
||||
if (!Number.isFinite(lng1) || !Number.isFinite(lat1)) return { lng: null, lat: null, alt: 0 }
|
||||
if (lng1 > 180) lng1 = ((lng1 + 180) % 360) - 180
|
||||
if (lng1 < -180) lng1 = ((lng1 - 180) % 360) + 180
|
||||
if (lat1 > 90) lat1 = 90
|
||||
if (lat1 < -90) lat1 = -90
|
||||
let alt1 = 0
|
||||
if (Math.abs(lat1) < 89.999) {
|
||||
const p = await new YJ.Tools().sampleHeightMostDetailed(
|
||||
[{ lng: lng1, lat: lat1, alt: 0 }],
|
||||
window.earth
|
||||
)
|
||||
alt1 = p[0].height < 0 ? 0 : p[0].height
|
||||
}
|
||||
position = {
|
||||
lng: longitude.value,
|
||||
lat: latitude.value,
|
||||
alt: point[0].height < 0 ? 0 : point[0].height
|
||||
lng: lng1,
|
||||
lat: lat1,
|
||||
alt: alt1
|
||||
}
|
||||
break
|
||||
case 'second':
|
||||
@ -410,6 +425,10 @@ const turnToPosition = async () => {
|
||||
lng = longitude.value < 0 ? -lng : lng
|
||||
// @ts-ignore (define in dts)
|
||||
lat = latitude.value < 0 ? -lat : lat
|
||||
if (lng > 180) lng = ((lng + 180) % 360) - 180
|
||||
if (lng < -180) lng = ((lng - 180) % 360) + 180
|
||||
if (lat > 90) lat = 90
|
||||
if (lat < -90) lat = -90
|
||||
|
||||
var point2 = await new YJ.Tools().sampleHeightMostDetailed(
|
||||
[{ lng, lat, alt: 0 }],
|
||||
@ -434,6 +453,10 @@ const turnToPosition = async () => {
|
||||
lng = longitude.value < 0 ? -lng : lng
|
||||
// @ts-ignore (define in dts)
|
||||
lat = latitude.value < 0 ? -lat : lat
|
||||
if (lng > 180) lng = ((lng + 180) % 360) - 180
|
||||
if (lng < -180) lng = ((lng - 180) % 360) + 180
|
||||
if (lat > 90) lat = 90
|
||||
if (lat < -90) lat = -90
|
||||
|
||||
var point3 = await new YJ.Tools().sampleHeightMostDetailed(
|
||||
[{ lng, lat, alt: 0 }],
|
||||
@ -482,7 +505,7 @@ const getPosition = async () => {
|
||||
const flyto = async (e) => {
|
||||
await getPosition()
|
||||
console.log(pointPosi.lng, pointPosi.lng !== 0, pointPosi.lat, 'ooppp')
|
||||
if ((!pointPosi.lng && pointPosi.lng !== 0) || (!pointPosi.lat && pointPosi.lng !== 0)) {
|
||||
if ((!pointPosi.lng && pointPosi.lng !== 0) || (!pointPosi.lat && pointPosi.lat !== 0)) {
|
||||
ElMessage({
|
||||
message: '请正确填写坐标信息!',
|
||||
type: 'warning'
|
||||
@ -490,13 +513,14 @@ const flyto = async (e) => {
|
||||
return
|
||||
}
|
||||
if ((window as any).earthPlaceMap === undefined) {
|
||||
(window as any).earthPlaceMap = new Map()
|
||||
;(window as any).earthPlaceMap = new Map()
|
||||
}
|
||||
if ((window as any).earthPlaceMap.size) {
|
||||
(window as any).earthPlaceMap.forEach((item) => {
|
||||
;(window as any).earthPlaceMap
|
||||
.forEach((item) => {
|
||||
item.remove()
|
||||
})
|
||||
(window as any).earthPlaceMap.clear()
|
||||
})(window as any)
|
||||
.earthPlaceMap.clear()
|
||||
}
|
||||
new YJ.Global.flyTo(window.earth, {
|
||||
position: { lng: pointPosi.lng, lat: pointPosi.lat, alt: pointPosi.alt + 300 }
|
||||
|
||||
@ -188,7 +188,8 @@
|
||||
<div style="position: absolute; left: 24px; display: flex">
|
||||
<button class="flyto" @click="flyTo">
|
||||
<svg class="icon-positions">
|
||||
<use xlink:href="#yj-icon-positions"></use></svg>定位
|
||||
<use xlink:href="#yj-icon-positions"></use></svg
|
||||
>定位
|
||||
</button>
|
||||
<button class="analog" style="margin-left: 10px" @click="pause">
|
||||
<svg class="icon-play" v-if="!isPausng"><use xlink:href="#yj-icon-play"></use></svg>
|
||||
@ -290,8 +291,8 @@ onBeforeUnmount(() => {
|
||||
function close() {
|
||||
baseDialog.value?.close()
|
||||
}
|
||||
function drawEnd(data) {
|
||||
oriData = data
|
||||
function drawEnd(data): void {
|
||||
data = data
|
||||
}
|
||||
//方法
|
||||
function draw() {
|
||||
@ -388,7 +389,6 @@ function areaInput() {
|
||||
submerge.maxWaterLevel = maxWaterLevel.value
|
||||
}
|
||||
}
|
||||
let oriData = waterVolume.value
|
||||
function waterVolumeInput() {
|
||||
let dom: any = document.getElementById('waterVolume')
|
||||
if (waterVolume.value < dom.min * 1) {
|
||||
@ -399,13 +399,7 @@ function waterVolumeInput() {
|
||||
waterVolume.value = Math.floor(waterVolume.value * 10000) / 10000
|
||||
if (area.value) {
|
||||
waterLevel.value = Number((waterVolume.value / area.value).toFixed(4))
|
||||
if (waterVolume.value > oriData) {
|
||||
maxWaterLevel.value = maxWaterLevel.value + waterLevel.value
|
||||
} else if (waterVolume.value < oriData) {
|
||||
let data = maxWaterLevel.value - waterLevel.value
|
||||
maxWaterLevel.value = data > minWaterLevel.value ? data : minWaterLevel.value
|
||||
}
|
||||
oriData = waterVolume.value
|
||||
maxWaterLevel.value = Number((minWaterLevel.value + waterLevel.value).toFixed(4))
|
||||
|
||||
submerge.waterLevels = waterLevel.value
|
||||
submerge.maxWaterLevel = maxWaterLevel.value
|
||||
|
||||
@ -178,8 +178,8 @@
|
||||
<div class="search_title" id="search">
|
||||
<div class="searchUp">
|
||||
<el-select v-model="select" @change="selectChange" style="width: 4vw" size="small">
|
||||
<el-option value="tree" :label="t('tree.layer')"></el-option>
|
||||
<el-option value="poi" :label="t('tree.location')"></el-option>
|
||||
<el-option value="tree" :label="t('tree.layer')"></el-option>
|
||||
</el-select>
|
||||
<input
|
||||
v-model="searchKey"
|
||||
|
||||
@ -508,7 +508,7 @@ const createEarth = async () => {
|
||||
})
|
||||
|
||||
tree.value.initTreeCallBack()
|
||||
utilsSysChange(eventBus)
|
||||
utilsSysChange(eventBus, true)
|
||||
// @ts-ignore
|
||||
let options = JSON.parse(localStorage.getItem('defaultView'))
|
||||
YJ.Global.setDefaultView(window.earth, options)
|
||||
|
||||
@ -1,7 +1,13 @@
|
||||
<template>
|
||||
<div class="login-container" style="position: fixed; width: 100vw; height: 100vh; left: 0; top: 0">
|
||||
<transition name="video-fade" mode="out-in"
|
||||
style="position: fixed; width: 100vw; height: 100vh; left: 0; top: 0; object-fit: cover">
|
||||
<div
|
||||
class="login-container"
|
||||
style="position: fixed; width: 100vw; height: 100vh; left: 0; top: 0"
|
||||
>
|
||||
<transition
|
||||
name="video-fade"
|
||||
mode="out-in"
|
||||
style="position: fixed; width: 100vw; height: 100vh; left: 0; top: 0; object-fit: cover"
|
||||
>
|
||||
<!-- 第一个视频,播放一次 -->
|
||||
<!-- <video v-if="!isFirstVideoPlayed" ref="firstVideoRef" key="first-video" muted @ended="onFirstVideoEnded"
|
||||
src="../../assets/video/login_front.mp4"
|
||||
@ -9,32 +15,63 @@
|
||||
<!-- 第二个视频,循环播放 -->
|
||||
<!-- <video v-else key="second-video" autoplay loop muted src="../../assets/video/login_feature.mp4"
|
||||
style="position: fixed; width: 100vw; height: 100vh; left: 0; top: 0; object-fit: cover"></video> -->
|
||||
<video key="second-video" autoplay loop muted src="../../assets/video/author_video.mp4"
|
||||
style="position: fixed; width: 100vw; height: 100vh; left: 0; top: 0; object-fit: cover"></video>
|
||||
<video
|
||||
key="second-video"
|
||||
autoplay
|
||||
loop
|
||||
muted
|
||||
src="../../assets/video/author_video.mp4"
|
||||
style="position: fixed; width: 100vw; height: 100vh; left: 0; top: 0; object-fit: cover"
|
||||
></video>
|
||||
</transition>
|
||||
<!-- 登录页面 -->
|
||||
<div class="rightBox" v-if="isDesktop">
|
||||
<el-button class="settings" size="small" @click="serviceDialog = true">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="42"
|
||||
height="40.67999267578125" viewBox="0 0 42 40.67999267578125" fill="none">
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
width="42"
|
||||
height="40.67999267578125"
|
||||
viewBox="0 0 42 40.67999267578125"
|
||||
fill="none"
|
||||
>
|
||||
<g>
|
||||
<path
|
||||
d="M32.748 18C32.6078 17.2589 32.1562 16.776 31.596 16.776L31.584 16.776L31.476 16.776C29.8563 16.776 28.536 15.4559 28.536 13.836C28.536 13.3103 28.788 12.72 28.788 12.72C29.0783 12.0666 28.8579 11.2688 28.272 10.86L28.236 10.836L25.26 9.18L25.224 9.168C25.0301 9.0837 24.8127 9.036 24.588 9.036C24.1275 9.036 23.6739 9.21871 23.376 9.528C23.0494 9.86507 21.9261 10.824 21.06 10.824C20.1861 10.824 19.0599 9.84731 18.732 9.504C18.4325 9.18839 17.9732 9 17.508 9C17.2877 9 17.0746 9.0387 16.884 9.12L16.848 9.144L13.764 10.836L13.728 10.86C13.1402 11.2684 12.922 12.0669 13.212 12.72C13.212 12.72 13.464 13.3063 13.464 13.836C13.464 15.4559 12.1438 16.776 10.524 16.776L10.428 16.776L10.404 16.776C9.84445 16.776 9.39221 17.2588 9.252 18C9.252 18.0544 9 19.3442 9 20.352C9 21.3598 9.252 22.6495 9.252 22.704C9.39231 23.4452 9.84407 23.916 10.404 23.916L10.416 23.916L10.524 23.916C12.1438 23.916 13.464 25.2361 13.464 26.856C13.464 27.3823 13.212 27.972 13.212 27.972C12.922 28.6249 13.1424 29.4341 13.728 29.844L13.764 29.868L16.68 31.5L16.716 31.512C16.9098 31.5973 17.1284 31.644 17.352 31.644C17.819 31.644 18.2669 31.4511 18.564 31.128C18.9788 30.6773 20.1089 29.748 20.94 29.748C21.8399 29.748 22.995 30.787 23.328 31.152C23.6258 31.4807 24.0803 31.68 24.552 31.68C24.7712 31.68 24.9852 31.6424 25.176 31.56L25.212 31.536L28.236 29.868L28.272 29.844C28.8589 29.4351 29.0894 28.6356 28.8 27.984C28.8 27.984 28.536 27.3787 28.536 26.856C28.536 25.2361 29.8563 23.916 31.476 23.916L31.572 23.916L31.596 23.916C32.1571 23.916 32.608 23.4446 32.748 22.704C32.748 22.6909 33 21.385 33 20.352C33 19.3396 32.748 18.0542 32.748 18ZM17.364 29.952L14.808 28.524C14.9206 28.2349 15.144 27.5538 15.144 26.856C15.144 24.433 13.2855 22.4323 10.884 22.248C10.8254 21.9063 10.692 21.0321 10.692 20.352C10.692 19.6729 10.8254 18.798 10.884 18.456C13.2856 18.2719 15.144 16.2592 15.144 13.836C15.144 13.1401 14.9204 12.4692 14.808 12.18L17.532 10.692C17.63 10.7921 18.0227 11.1823 18.564 11.568C19.4485 12.1985 20.2834 12.516 21.06 12.516C21.829 12.516 22.6651 12.1983 23.544 11.58C24.0819 11.2016 24.4783 10.8264 24.576 10.728L27.192 12.18C27.0795 12.4692 26.856 13.1391 26.856 13.836C26.856 16.2592 28.7144 18.2719 31.116 18.456C31.1746 18.7985 31.308 19.6749 31.308 20.352C31.308 21.0318 31.1746 21.9062 31.116 22.248C28.7145 22.4321 26.856 24.4328 26.856 26.856C26.856 27.5527 27.0796 28.2229 27.192 28.512L24.54 29.988C24.4255 29.8664 24.0426 29.4611 23.508 29.064C22.6064 28.3945 21.7405 28.056 20.94 28.056C20.1472 28.056 19.2924 28.3951 18.396 29.052C17.8691 29.4383 17.4787 29.8324 17.364 29.952ZM25.2 20.328C25.2 17.9842 23.2957 16.08 20.952 16.08C18.6083 16.08 16.692 17.9842 16.692 20.328C16.692 22.6717 18.6083 24.588 20.952 24.588C23.2958 24.588 25.2 22.6717 25.2 20.328ZM20.952 17.772C22.3658 17.772 23.508 18.9142 23.508 20.328C23.508 21.7418 22.3658 22.896 20.952 22.896C19.5383 22.896 18.384 21.7418 18.384 20.328C18.384 18.9142 19.5383 17.772 20.952 17.772Z"
|
||||
fill="#FFFFFF" />
|
||||
fill="#FFFFFF"
|
||||
/>
|
||||
</g>
|
||||
<defs>
|
||||
<filter id="filter_2442_1327" x="0" y="0" width="42" height="40.67999267578125" filterUnits="userSpaceOnUse"
|
||||
color-interpolation-filters="sRGB">
|
||||
<filter
|
||||
id="filter_2442_1327"
|
||||
x="0"
|
||||
y="0"
|
||||
width="42"
|
||||
height="40.67999267578125"
|
||||
filterUnits="userSpaceOnUse"
|
||||
color-interpolation-filters="sRGB"
|
||||
>
|
||||
<feFlood flood-opacity="0" result="feFloodId_2442_1327" />
|
||||
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"
|
||||
result="hardAlpha_2442_1327" />
|
||||
<feColorMatrix
|
||||
in="SourceAlpha"
|
||||
type="matrix"
|
||||
values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"
|
||||
result="hardAlpha_2442_1327"
|
||||
/>
|
||||
<feOffset dx="0" dy="0" />
|
||||
<feGaussianBlur stdDeviation="4.5" />
|
||||
<feComposite in2="hardAlpha_2442_1327" operator="out" />
|
||||
<feColorMatrix type="matrix"
|
||||
values="0 0 0 0 0.0784313725490196 0 0 0 0 0.4627450980392157 0 0 0 0 1 0 0 0 1 0" />
|
||||
<feColorMatrix
|
||||
type="matrix"
|
||||
values="0 0 0 0 0.0784313725490196 0 0 0 0 0.4627450980392157 0 0 0 0 1 0 0 0 1 0"
|
||||
/>
|
||||
<feBlend mode="normal" in2="feFloodId_2442_1327" result="dropShadow_1_2442_1327" />
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="dropShadow_1_2442_1327" result="shape_2442_1327" />
|
||||
<feBlend
|
||||
mode="normal"
|
||||
in="SourceGraphic"
|
||||
in2="dropShadow_1_2442_1327"
|
||||
result="shape_2442_1327"
|
||||
/>
|
||||
</filter>
|
||||
</defs>
|
||||
</svg>
|
||||
@ -106,45 +143,95 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<el-form class="login-form" autoComplete="on" :model="loginForm" :rules="loginRules" ref="loginFormRef"
|
||||
label-position="left">
|
||||
<el-form
|
||||
class="login-form"
|
||||
autoComplete="on"
|
||||
:model="loginForm"
|
||||
:rules="loginRules"
|
||||
ref="loginFormRef"
|
||||
label-position="left"
|
||||
>
|
||||
<el-form-item prop="username">
|
||||
<el-input name="username" type="text" v-model="loginForm.username" autoComplete="on" placeholder="请输入用户名"
|
||||
:prefix-icon="User" />
|
||||
<el-input
|
||||
name="username"
|
||||
type="text"
|
||||
v-model="loginForm.username"
|
||||
autoComplete="on"
|
||||
placeholder="请输入用户名"
|
||||
:prefix-icon="User"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item prop="password">
|
||||
<el-input type="password" @keyup.enter.native="handleLogin(loginFormRef)" v-model="loginForm.password"
|
||||
autoComplete="on" placeholder="请输入密码" :prefix-icon="Unlock" show-password></el-input>
|
||||
<el-input
|
||||
type="password"
|
||||
@keyup.enter.native="handleLogin(loginFormRef)"
|
||||
v-model="loginForm.password"
|
||||
autoComplete="on"
|
||||
placeholder="请输入密码"
|
||||
:prefix-icon="Unlock"
|
||||
show-password
|
||||
></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item class="rememberForget">
|
||||
<!-- justify-content: space-around;align-items: center; -->
|
||||
<div style="display: flex">
|
||||
<svg class="checkbox-svg" v-show="checkboxVModel" style="pointer-events: none"
|
||||
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="14" height="14"
|
||||
viewBox="0 0 14 14" fill="none">
|
||||
<path fill="rgba(var(--color-base1), 1)"
|
||||
d="M7.34788e-16 2L-2.20436e-15 12C-2.40727e-15 13.1046 0.895431 14 2 14L12 14C13.1046 14 14 13.1046 14 12L14 2C14 0.895431 13.1046 -1.46958e-15 12 -1.46958e-15L2 -1.46958e-15C0.895431 -1.60485e-15 8.02424e-16 0.895431 7.34788e-16 2Z">
|
||||
</path>
|
||||
<svg
|
||||
class="checkbox-svg"
|
||||
v-show="checkboxVModel"
|
||||
style="pointer-events: none"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
width="14"
|
||||
height="14"
|
||||
viewBox="0 0 14 14"
|
||||
fill="none"
|
||||
>
|
||||
<path
|
||||
fill="rgba(var(--color-base1), 1)"
|
||||
d="M7.34788e-16 2L-2.20436e-15 12C-2.40727e-15 13.1046 0.895431 14 2 14L12 14C13.1046 14 14 13.1046 14 12L14 2C14 0.895431 13.1046 -1.46958e-15 12 -1.46958e-15L2 -1.46958e-15C0.895431 -1.60485e-15 8.02424e-16 0.895431 7.34788e-16 2Z"
|
||||
></path>
|
||||
<path
|
||||
d="M5.47283 8.3039L3.10764 6.12807C3.06194 6.08647 2.99525 6.08647 2.94955 6.12946L2.04424 6.98093C1.98989 7.03224 1.98495 7.12376 2.03312 7.18201L6.03602 11.9566C6.09778 12.0301 6.20647 12.0065 6.24105 11.9136C7.03644 9.69343 9.25835 5.63439 11.9619 2.69585C11.999 2.65564 12.0101 2.59601 11.9904 2.54331L11.8211 2.08568C11.7915 2.00525 11.7038 1.97474 11.6396 2.02328C8.63587 4.21019 6.45966 6.92546 5.47283 8.3039Z"
|
||||
fill="#004242"></path>
|
||||
fill="#004242"
|
||||
></path>
|
||||
</svg>
|
||||
<svg class="checkbox-svg" v-show="!checkboxVModel" style="pointer-events: none"
|
||||
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="14" height="14"
|
||||
viewBox="0 0 14 14" fill="none">
|
||||
<path fill-rule="evenodd" fill="url(#linear_border_2442_533_0)"
|
||||
d="M0 12L0 2C0 0.895431 0.895431 0 2 0L12 0C13.1046 0 14 0.895431 14 2L14 12C14 13.1046 13.1046 14 12 14L2 14C0.895431 14 0 13.1046 0 12ZM2 12.5C1.72386 12.5 1.5 12.2761 1.5 12L1.5 2C1.5 1.72386 1.72386 1.5 2 1.5L12 1.5C12.2761 1.5 12.5 1.72386 12.5 2L12.5 12C12.5 12.2761 12.2761 12.5 12 12.5L2 12.5Z">
|
||||
</path>
|
||||
<svg
|
||||
class="checkbox-svg"
|
||||
v-show="!checkboxVModel"
|
||||
style="pointer-events: none"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
width="14"
|
||||
height="14"
|
||||
viewBox="0 0 14 14"
|
||||
fill="none"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
fill="url(#linear_border_2442_533_0)"
|
||||
d="M0 12L0 2C0 0.895431 0.895431 0 2 0L12 0C13.1046 0 14 0.895431 14 2L14 12C14 13.1046 13.1046 14 12 14L2 14C0.895431 14 0 13.1046 0 12ZM2 12.5C1.72386 12.5 1.5 12.2761 1.5 12L1.5 2C1.5 1.72386 1.72386 1.5 2 1.5L12 1.5C12.2761 1.5 12.5 1.72386 12.5 2L12.5 12C12.5 12.2761 12.2761 12.5 12 12.5L2 12.5Z"
|
||||
></path>
|
||||
<defs>
|
||||
<linearGradient id="linear_border_2442_533_0" x1="0" y1="-0.5574798583984375" x2="12.1173095703125"
|
||||
y2="12.878036499023438" gradientUnits="userSpaceOnUse">
|
||||
<linearGradient
|
||||
id="linear_border_2442_533_0"
|
||||
x1="0"
|
||||
y1="-0.5574798583984375"
|
||||
x2="12.1173095703125"
|
||||
y2="12.878036499023438"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
>
|
||||
<stop offset="0.0625" stop-color="rgba(var(--color-base1), 1)" />
|
||||
<stop offset="1" stop-color="var(--color-border1)" />
|
||||
</linearGradient>
|
||||
</defs>
|
||||
</svg>
|
||||
<el-checkbox :disabled="loading" v-model="checkboxVModel" @change="rememberpwd"
|
||||
label="string">记住密码</el-checkbox>
|
||||
<el-checkbox
|
||||
:disabled="loading"
|
||||
v-model="checkboxVModel"
|
||||
@change="rememberpwd"
|
||||
label="string"
|
||||
>记住密码</el-checkbox
|
||||
>
|
||||
<!-- <div style="cursor: pointer;">忘记密码?</div> -->
|
||||
</div>
|
||||
</el-form-item>
|
||||
@ -167,15 +254,24 @@
|
||||
<h2 class="greet"><span>欢迎您使用</span>实景三维电子沙盘系统</h2>
|
||||
<div class="serviceContent">
|
||||
<el-tabs v-model="selectedService" class="demo-tabs" @tab-click="handleSelect">
|
||||
<el-tab-pane v-for="item in serviceOptions" :label="item.name" :name="item.name"></el-tab-pane>
|
||||
<el-tab-pane
|
||||
v-for="item in serviceOptions"
|
||||
:label="item.name"
|
||||
:name="item.name"
|
||||
></el-tab-pane>
|
||||
</el-tabs>
|
||||
<div class="tabPanel">
|
||||
<template v-if="selectedService == '接口服务'">
|
||||
<div class="item">
|
||||
<span class="itemLabel">服务选择</span>
|
||||
<el-select class="select" popper-class="login-select-popper" v-model="servVal">
|
||||
<el-option size="mini" v-for="item in servOptions" :key="item.value" :label="item.name"
|
||||
:value="item.name">
|
||||
<el-option
|
||||
size="mini"
|
||||
v-for="item in servOptions"
|
||||
:key="item.value"
|
||||
:label="item.name"
|
||||
:value="item.name"
|
||||
>
|
||||
</el-option>
|
||||
</el-select>
|
||||
</div>
|
||||
@ -189,13 +285,18 @@
|
||||
</template>
|
||||
<template v-if="servVal == '网络'">
|
||||
<span class="itemLabel">IP</span>
|
||||
<el-form-item ref="ipFormItem" prop="ip" :rules="[
|
||||
<el-form-item
|
||||
ref="ipFormItem"
|
||||
prop="ip"
|
||||
:rules="[
|
||||
{
|
||||
validator: validateisIPv4,
|
||||
message: '请输入合法的 IP 地址,4 段 0-255 的数字,用英文点分隔(示例:192.168.1.1)',
|
||||
message:
|
||||
'请输入合法的 IP 地址,4 段 0-255 的数字,用英文点分隔(示例:192.168.1.1)',
|
||||
trigger: 'blur'
|
||||
}
|
||||
]">
|
||||
]"
|
||||
>
|
||||
<el-input v-model="ip"></el-input>
|
||||
</el-form-item>
|
||||
</template>
|
||||
@ -203,24 +304,32 @@
|
||||
<div class="item port">
|
||||
<template v-if="servVal == '单机'">
|
||||
<span class="itemLabel">端口</span>
|
||||
<el-form-item ref="localportFormItem" prop="localport" :rules="[
|
||||
<el-form-item
|
||||
ref="localportFormItem"
|
||||
prop="localport"
|
||||
:rules="[
|
||||
{
|
||||
validator: validateLocalportRange,
|
||||
trigger: 'blur'
|
||||
}
|
||||
]">
|
||||
]"
|
||||
>
|
||||
<el-input-number v-model="localport" :controls="false" />
|
||||
</el-form-item>
|
||||
</template>
|
||||
<template v-if="servVal == '网络'">
|
||||
<span class="itemLabel">端口</span>
|
||||
<el-form-item ref="portFormItem" prop="port" :rules="[
|
||||
<el-form-item
|
||||
ref="portFormItem"
|
||||
prop="port"
|
||||
:rules="[
|
||||
{
|
||||
validator: validatePortRange,
|
||||
message: '端口号必须在 1024–65535 之间',
|
||||
trigger: 'blur'
|
||||
}
|
||||
]">
|
||||
]"
|
||||
>
|
||||
<el-input-number v-model="port" :controls="false" />
|
||||
</el-form-item>
|
||||
</template>
|
||||
@ -230,8 +339,13 @@
|
||||
<div class="item">
|
||||
<span class="itemLabel">串口选择</span>
|
||||
<el-select class="select" popper-class="login-select-popper" v-model="gpsVal">
|
||||
<el-option size="mini" v-for="item in gpsOptions" :key="item.value" :label="item.Product"
|
||||
:value="item.Name">
|
||||
<el-option
|
||||
size="mini"
|
||||
v-for="item in gpsOptions"
|
||||
:key="item.value"
|
||||
:label="item.Product"
|
||||
:value="item.Name"
|
||||
>
|
||||
</el-option>
|
||||
</el-select>
|
||||
</div>
|
||||
@ -246,8 +360,14 @@
|
||||
</div>
|
||||
</div>
|
||||
<!-- 授权页面 -->
|
||||
<Dialog ref="baseDialog" class="graffiti" title="系统授权" :closeCallback="closeCallBack" left="calc(50vw - 188px)"
|
||||
top="calc(50vh - 191px)">
|
||||
<Dialog
|
||||
ref="baseDialog"
|
||||
class="graffiti"
|
||||
title="系统授权"
|
||||
:closeCallback="closeCallBack"
|
||||
left="calc(50vw - 188px)"
|
||||
top="calc(50vh - 191px)"
|
||||
>
|
||||
<template #content>
|
||||
<div class="auth_info custom_scroll_bar content_h">
|
||||
<div class="auth_info_box">
|
||||
@ -256,10 +376,19 @@
|
||||
{{ t('auths.authCode') }}
|
||||
</div>
|
||||
<div class="auth_info_text">
|
||||
<span @click="copy(authInfo.license_code)" style="cursor: pointer" title="点击可复制">{{ authInfo.license_code
|
||||
|| '' }}</span>
|
||||
<svg-icon name="copy" :size="20" @click="copy(authInfo.license_code)" title="点击可复制"
|
||||
style="margin-left: 30px; cursor: pointer"></svg-icon>
|
||||
<span
|
||||
@click="copy(authInfo.license_code)"
|
||||
style="cursor: pointer"
|
||||
title="点击可复制"
|
||||
>{{ authInfo.license_code || '' }}</span
|
||||
>
|
||||
<svg-icon
|
||||
name="copy"
|
||||
:size="20"
|
||||
@click="copy(authInfo.license_code)"
|
||||
title="点击可复制"
|
||||
style="margin-left: 30px; cursor: pointer"
|
||||
></svg-icon>
|
||||
</div>
|
||||
</div>
|
||||
<div class="auth_info_box">
|
||||
@ -280,13 +409,22 @@
|
||||
<span class="fankuai"></span>
|
||||
{{ t('auths.authType') }}
|
||||
</div>
|
||||
<div v-if="authInfo.status != null" class="auth_info_text" style="font-size: 16px" :style="{
|
||||
<div
|
||||
v-if="authInfo.status != null"
|
||||
class="auth_info_text"
|
||||
style="font-size: 16px"
|
||||
:style="{
|
||||
color: authInfo.status ? 'rgba(27, 248, 195, 1)' : 'rgba(255, 161, 69, 1)'
|
||||
}">
|
||||
}"
|
||||
>
|
||||
{{ authInfo.status ? t('auths.authTempExpire') : t('auths.authexpire') }}
|
||||
</div>
|
||||
<!-- <div v-else class="auth_info_text">{{ authInfo.message || '无' }}</div> -->
|
||||
<div v-else class="auth_info_text" style="font-size: 16px; color: rgba(241, 108, 85, 1)">
|
||||
<div
|
||||
v-else
|
||||
class="auth_info_text"
|
||||
style="font-size: 16px; color: rgba(241, 108, 85, 1)"
|
||||
>
|
||||
{{ t('auths.noAuthexpire') }}
|
||||
</div>
|
||||
</div>
|
||||
@ -343,7 +481,6 @@ const ipFormItem = ref(null)
|
||||
const localportFormItem = ref(null)
|
||||
const portFormItem = ref(null)
|
||||
|
||||
|
||||
const {
|
||||
serviceDialog,
|
||||
servVal,
|
||||
@ -366,31 +503,28 @@ const clickSubmit = async () => {
|
||||
let isIpValid = false
|
||||
let isLocalportValid = false
|
||||
let isPortValid = false
|
||||
if(ipFormItem.value) {
|
||||
await ipFormItem.value.validate('blur', (a)=>{
|
||||
if (ipFormItem.value) {
|
||||
await ipFormItem.value.validate('blur', (a) => {
|
||||
isIpValid = a
|
||||
})
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
isIpValid = true
|
||||
}
|
||||
if(localportFormItem.value) {
|
||||
await localportFormItem.value.validate('blur', (a)=>{
|
||||
if (localportFormItem.value) {
|
||||
await localportFormItem.value.validate('blur', (a) => {
|
||||
isLocalportValid = a
|
||||
})
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
isLocalportValid = true
|
||||
}
|
||||
if(portFormItem.value) {
|
||||
await portFormItem.value.validate('blur', (a)=>{
|
||||
if (portFormItem.value) {
|
||||
await portFormItem.value.validate('blur', (a) => {
|
||||
isPortValid = a
|
||||
})
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
isPortValid = true
|
||||
}
|
||||
if(isIpValid && isLocalportValid && isPortValid) {
|
||||
if (isIpValid && isLocalportValid && isPortValid) {
|
||||
submit()
|
||||
}
|
||||
}
|
||||
@ -642,8 +776,8 @@ const validateisIPv4 = (rule, value, callback) => {
|
||||
function isIPv4Valid(ip) {
|
||||
ip = ip + ''
|
||||
// 正则匹配:覆盖所有IPv4规则(无空格、4段、0-255、无前导零)
|
||||
const ipv4Regex = /^((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$/;
|
||||
return ipv4Regex.test(ip.trim()) && !ip.trim().includes(' ');
|
||||
const ipv4Regex = /^((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$/
|
||||
return ipv4Regex.test(ip.trim()) && !ip.trim().includes(' ')
|
||||
}
|
||||
</script>
|
||||
<style lang="scss">
|
||||
@ -933,7 +1067,8 @@ function isIPv4Valid(ip) {
|
||||
z-index: 99;
|
||||
background: linear-gradient(0deg, #00ffff33 0%, #00ffff00 100%), rgba(0, 0, 0, 0.6);
|
||||
border: 1.5px solid;
|
||||
border-image: linear-gradient(to bottom, rgba(var(--color-base1), 1) 6.25%, rgb(0, 200, 255) 100%) 1;
|
||||
border-image: linear-gradient(to bottom, rgba(var(--color-base1), 1) 6.25%, rgb(0, 200, 255) 100%)
|
||||
1;
|
||||
text-align: left;
|
||||
font-family: 'sy-boldface';
|
||||
}
|
||||
@ -979,11 +1114,11 @@ function isIPv4Valid(ip) {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
::v-deep .title-box>.close-box {
|
||||
::v-deep .title-box > .close-box {
|
||||
display: none;
|
||||
}
|
||||
|
||||
::v-deep .title-box>.title {
|
||||
::v-deep .title-box > .title {
|
||||
font-family: 'Ali-mother-counts-bold';
|
||||
font-size: 18px;
|
||||
font-weight: 400;
|
||||
@ -1006,7 +1141,7 @@ function isIPv4Valid(ip) {
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
::v-deep .foot>button {
|
||||
::v-deep .foot > button {
|
||||
margin-left: 10px;
|
||||
border-radius: 4px;
|
||||
background: rgba(var(--color-base1), 0.2);
|
||||
@ -1018,21 +1153,23 @@ function isIPv4Valid(ip) {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
::v-deep .foot>button:hover {
|
||||
::v-deep .foot > button:hover {
|
||||
border: 1px solid rgba(var(--color-base1), 1);
|
||||
color: rgba(var(--color-base1), 1);
|
||||
}
|
||||
|
||||
::v-deep .foot>.show>.label {
|
||||
::v-deep .foot > .show > .label {
|
||||
margin: 0px 10px;
|
||||
}
|
||||
|
||||
::v-deep .el-message-box {
|
||||
--el-messagebox-title-color: #fff !important;
|
||||
--el-messagebox-content-color: #fff !important;
|
||||
background: linear-gradient(180deg,
|
||||
background: linear-gradient(
|
||||
180deg,
|
||||
rgba(var(--color-base1), 0) 0%,
|
||||
rgba(var(--color-base1), 0.2) 100%),
|
||||
rgba(var(--color-base1), 0.2) 100%
|
||||
),
|
||||
rgba(0, 0, 0, 0.6) !important;
|
||||
}
|
||||
|
||||
@ -1099,7 +1236,7 @@ function isIPv4Valid(ip) {
|
||||
border-radius: 0 0 0 90%;
|
||||
background: rgba(var(--color-base1), 1);
|
||||
|
||||
&>span {
|
||||
& > span {
|
||||
font-size: 1rem;
|
||||
position: absolute;
|
||||
right: 0px;
|
||||
@ -1260,9 +1397,11 @@ function isIPv4Valid(ip) {
|
||||
.el-message-box {
|
||||
--el-messagebox-title-color: #fff !important;
|
||||
--el-messagebox-content-color: #fff !important;
|
||||
background: linear-gradient(180deg,
|
||||
background: linear-gradient(
|
||||
180deg,
|
||||
rgba(var(--color-base1), 0) 0%,
|
||||
rgba(var(--color-base1), 0.2) 100%),
|
||||
rgba(var(--color-base1), 0.2) 100%
|
||||
),
|
||||
rgba(0, 0, 0, 0.6) !important;
|
||||
|
||||
.el-message-box__headerbtn {
|
||||
|
||||
Reference in New Issue
Block a user