20 changed files with 459 additions and 779 deletions
After Width: | Height: | Size: 15 KiB |
After Width: | Height: | Size: 12 KiB |
After Width: | Height: | Size: 162 KiB |
After Width: | Height: | Size: 7.3 KiB |
After Width: | Height: | Size: 5.5 KiB |
After Width: | Height: | Size: 3.8 KiB |
@ -1,34 +0,0 @@ |
|||
<!-- |
|||
*@描述: admin主页构建 |
|||
*@作者: |
|||
*@日期: 9/27 |
|||
*@版本:1.0 |
|||
*/ |
|||
--> |
|||
<template> |
|||
<a-row> |
|||
<a-col :span="3" class="left-com" > |
|||
<comLeftMenu></comLeftMenu> |
|||
</a-col> |
|||
<a-col :span="18" class=" com-setup-center "> |
|||
<slot></slot> |
|||
</a-col> |
|||
<a-col :span="3" class="right-com" ><comRightMenu></comRightMenu></a-col> |
|||
</a-row> |
|||
</template> |
|||
<script setup lang="ts"> |
|||
import comLeftMenu from './leftMenu/index.vue'; |
|||
import comRightMenu from './rightMenu/index.vue'; |
|||
</script> |
|||
<style lang="less" scoped> |
|||
.com-setup-center { |
|||
height: 100vh; |
|||
width: 100%; |
|||
flex-wrap: nowrap; |
|||
} |
|||
.left-com,.right-com{ |
|||
position:relative; |
|||
z-index:8; |
|||
} |
|||
|
|||
</style> |
@ -1,124 +0,0 @@ |
|||
<!-- |
|||
*@描述: 左侧组件 |
|||
*@作者: |
|||
*@日期: 9/27 |
|||
*@版本:1.0 |
|||
*/ |
|||
--> |
|||
<template> |
|||
<a-row class="com-left-menu-header"> |
|||
<span>工具栏</span> |
|||
</a-row> |
|||
<hr style="border:1px solid #00ffe4;" width="100%" /> |
|||
<a-row class="com-left-menu"> |
|||
|
|||
<a-tabs v-model:activeKey="activeKey" :tab-position="'left'"> |
|||
<a-tab-pane key="1"> |
|||
<template #tab> |
|||
<!-- <span class="icon iconfont icon-gongneng iconfontsize"></span> --> |
|||
<div class="menu-title"> |
|||
功能 |
|||
</div> |
|||
</template> |
|||
<Basic /> |
|||
</a-tab-pane> |
|||
<a-tab-pane key="2"> |
|||
<template #tab> |
|||
<!-- <span class="icon iconfont icon-chanpinmoxing iconfontsize"></span> --> |
|||
<div class="menu-title"> |
|||
3D模型 |
|||
</div> |
|||
</template> |
|||
<Models3D /> |
|||
</a-tab-pane> |
|||
<a-tab-pane key="3"> |
|||
<template #tab> |
|||
<!-- <span class="icon iconfont icon-chanpinmoxing iconfontsize"></span> --> |
|||
<div class="menu-title"> |
|||
图片<br />模型 |
|||
</div> |
|||
</template> |
|||
<ModelsImages /> |
|||
</a-tab-pane> |
|||
<a-tab-pane key="4"> |
|||
<template #tab> |
|||
<!-- <span class="icon iconfont icon-shengchan iconfontsize"></span> --> |
|||
<div class="menu-title"> |
|||
工具 |
|||
</div> |
|||
</template> |
|||
<Tools /> |
|||
</a-tab-pane> |
|||
<a-tab-pane key="5"> |
|||
<template #tab> |
|||
<!-- <span class="icon iconfont icon-shezhi1 iconfontsize"></span> --> |
|||
<div class="menu-title"> |
|||
系统<br />设置 |
|||
</div> |
|||
</template> |
|||
<SytemComponent /> |
|||
</a-tab-pane> |
|||
</a-tabs> |
|||
</a-row> |
|||
</template> |
|||
<script lang="ts" setup> |
|||
import { ref } from "vue"; |
|||
import Basic from "./leftMenuItem/basic.vue"; |
|||
import ModelsImages from "./leftMenuItem/modelsimages.vue"; |
|||
import Models3D from "./leftMenuItem/models3d.vue"; |
|||
import SytemComponent from "./leftMenuItem/sytemcomponent.vue"; |
|||
import Tools from "./leftMenuItem/tools.vue"; |
|||
let activeKey = ref('1') |
|||
</script> |
|||
<style lang="less" scoped> |
|||
.com-left-menu { |
|||
user-select: none; |
|||
height: 100vh; |
|||
background-color: #001529; |
|||
>div,:deep(.ant-tabs-tab-btn) { |
|||
width: 100%; |
|||
} |
|||
.menu-title{ |
|||
text-align: center; |
|||
} |
|||
} |
|||
|
|||
.com-left-menu-header { |
|||
padding-top: 10px; |
|||
|
|||
user-select: none; |
|||
height: 40px; |
|||
background-color: #001529; |
|||
text-align: center; |
|||
width: 100%; |
|||
border-width: 2px; |
|||
border-bottom: #fff; |
|||
|
|||
span { |
|||
margin-left: 40px; |
|||
width: 100%; |
|||
color: #fff; |
|||
font-size: 18px; |
|||
text-align: left; |
|||
} |
|||
} |
|||
|
|||
|
|||
:deep(.ant-tabs-tab) { |
|||
text-align: center !important; |
|||
padding: 12px 0 !important; |
|||
} |
|||
|
|||
:deep(.ant-tabs-left-bar) { |
|||
width: calc(6 / 24 * 100%); |
|||
} |
|||
|
|||
:deep(.ant-tabs-left-content.ant-tabs-content.ant-tabs-content-animated), |
|||
:deep(.ant-tabs-tabpane) { |
|||
padding-left: 0 !important; |
|||
} |
|||
|
|||
.iconfontsize { |
|||
font-size: 28px; |
|||
} |
|||
</style> |
@ -1,78 +0,0 @@ |
|||
<template> |
|||
<div class="left-com-content"> |
|||
<a-row> |
|||
<a-col class="content-item" title="添加标签" @click="addLabel"> |
|||
<a class="btn btnColor"> |
|||
<i class="fa"> |
|||
<span class="icon iconfont icon-biaoqian"></span> |
|||
</i> |
|||
</a> |
|||
<div class="item-text">添加标签</div> |
|||
</a-col> |
|||
<div style="background: aqua; height: 50%"> |
|||
<a-tree style="background: aqua;" :tree-data="treeData" @select="selectTreeNode" /> |
|||
</div> |
|||
</a-row> |
|||
</div> |
|||
</template> |
|||
|
|||
<script setup lang='ts'> |
|||
import { audio } from "@/utils/audio"; |
|||
import { useStore } from '@/store/index'; |
|||
import {storeToRefs} from 'pinia'; |
|||
import type { TreeProps } from 'ant-design-vue'; |
|||
import * as cameraApi from '@/axios/cameraBase/cameraApi'; |
|||
import { ref,onMounted } from 'vue'; |
|||
let piniaStore = useStore(); |
|||
let cameraMap = new Map<string, any>() |
|||
let treeData = ref<TreeProps['treeData']>([]) |
|||
let curSelectKey=storeToRefs(piniaStore).curSelectKey |
|||
function loadTreeData() { |
|||
cameraApi.GetList().then((res: any) => { |
|||
let list: Array<any> = res.data.data; |
|||
console.log(list); |
|||
|
|||
cameraMap = piniaStore.addCameraMap(list) |
|||
treeData.value=piniaStore.treeData |
|||
console.log(cameraMap); |
|||
}); |
|||
} |
|||
onMounted(()=>{ |
|||
loadTreeData() |
|||
}) |
|||
function selectTreeNode(selectedKeys: any, e: any) { |
|||
if (!e.selected) return; |
|||
let key = selectedKeys[0]; |
|||
if (curSelectKey.value !== key) { |
|||
piniaStore.updateCurSelectKey(key) |
|||
} |
|||
} |
|||
//播放音效 |
|||
function playAudio(): void { |
|||
audio.click(); |
|||
} |
|||
//添加标签 |
|||
function addLabel(e: string) { |
|||
piniaStore.updateIsAddLabel({labelType:"",isAddLabel: true}) |
|||
playAudio(); |
|||
} |
|||
|
|||
|
|||
</script> |
|||
|
|||
<style lang='less'> |
|||
.left-com-content { |
|||
.content-item { |
|||
cursor: pointer; |
|||
text-align: center; |
|||
padding: 5px 0; |
|||
margin: 1%; |
|||
width: 48%; |
|||
|
|||
.fa span { |
|||
font-size: 25px; |
|||
|
|||
} |
|||
} |
|||
} |
|||
</style> |
@ -1,128 +0,0 @@ |
|||
<template> |
|||
|
|||
<div class="left-com-content"> |
|||
|
|||
<a-collapse v-model:activeKey="activeKey" accordion> |
|||
<a-collapse-panel v-for="item in header" :key="item.id" :header="item.group_name"> |
|||
<div class="img-box"> |
|||
<div class="img" v-for="ele in item.itemArr" @click="addModelFn(ele.url,ele.oldUrl)"> |
|||
<img draggable="false" class="collapse-panel-img" width="36" height="36" :src="ele.dis_img" |
|||
:alt="ele.model_name"> |
|||
</div> |
|||
</div> |
|||
</a-collapse-panel> |
|||
</a-collapse> |
|||
</div> |
|||
</template> |
|||
<script setup lang="ts"> |
|||
import { ref } from 'vue'; |
|||
import api from "@/axios/api"; |
|||
import { useStore } from '@/store/index'; |
|||
let piniaStore = useStore(); |
|||
const activeKey = ref([]); |
|||
let header: any = ref([]) |
|||
//图片基础路径 |
|||
let baseUrl = process.env.VUE_APP_API_BASE_URL + "/sys/common/static/";// api base_urll |
|||
let p1 = api.modelsinfo.getModels3DGroup( ).then(res => |
|||
{ |
|||
return res.data; |
|||
}) |
|||
|
|||
let p2 = api.modelsinfo.getModels3D().then(res => |
|||
{ |
|||
|
|||
return res.data; |
|||
}) |
|||
Promise.all([p1, p2]).then(res => |
|||
{ |
|||
let headerArr = res[0] |
|||
let itemArr = res[1] |
|||
//循环折叠标题数组 |
|||
headerArr.forEach((element: any, index: number) => |
|||
{ |
|||
//每个折叠标题添加一个存储子元素的数组 |
|||
element.itemArr = [] |
|||
header.value.push(element) |
|||
itemArr?.forEach((item: any) => |
|||
{ |
|||
|
|||
//判断图片是否为该标题所属 |
|||
if (element.group_name == item.model_group_name) |
|||
{ |
|||
item.oldUrl = item.url |
|||
item.url = baseUrl+item.url |
|||
item.dis_img = baseUrl + item.previewurl |
|||
header.value[index].itemArr.push(item) |
|||
} |
|||
}) |
|||
}); |
|||
|
|||
}) |
|||
let cus: any = null; |
|||
function addModelFn (url: string,img:string): void |
|||
{ |
|||
cus.creating = true |
|||
cus.img = img |
|||
piniaStore.editType = 30; |
|||
} |
|||
</script> |
|||
|
|||
<style scoped lang='less'> |
|||
.left-com-content { |
|||
.content-item { |
|||
cursor: pointer; |
|||
|
|||
padding: 5px 0; |
|||
margin: 1%; |
|||
width: 48%; |
|||
|
|||
.fa span { |
|||
font-size: 25px; |
|||
|
|||
} |
|||
} |
|||
} |
|||
|
|||
:deep(.ant-collapse-content-box) { |
|||
padding: 16px 10px; |
|||
} |
|||
|
|||
.img-box { |
|||
text-align: left; |
|||
display: flex; |
|||
flex-wrap: wrap; |
|||
|
|||
.img { |
|||
flex-basis: 1 / 3 * 100%; |
|||
text-align: center; |
|||
|
|||
.collapse-panel-img { |
|||
padding: 2px; |
|||
|
|||
&:hover { |
|||
border: 1px solid #001529; |
|||
cursor: pointer; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
:deep(.ant-collapse) { |
|||
background-color: #001529; |
|||
border: #fff; |
|||
|
|||
|
|||
.ant-collapse-item { |
|||
|
|||
.ant-collapse-header { |
|||
color: #fff !important; |
|||
|
|||
span { |
|||
color: #fff; |
|||
} |
|||
} |
|||
} |
|||
|
|||
|
|||
} |
|||
</style> |
@ -1,118 +0,0 @@ |
|||
<template> |
|||
|
|||
<div class="left-com-content"> |
|||
|
|||
<a-collapse v-model:activeKey="activeKey" accordion> |
|||
<a-collapse-panel v-for="item in header" :key="item.id" :header="item.group_name"> |
|||
<div class="img-box"> |
|||
<div class="img" v-for="ele in item.itemArr" @click="addImage(ele.dis_img,ele.url)"> |
|||
<img draggable="false" class="collapse-panel-img" width="36" height="36" :src="ele.dis_img" |
|||
:alt="ele.model_name"> |
|||
</div> |
|||
</div> |
|||
</a-collapse-panel> |
|||
</a-collapse> |
|||
</div> |
|||
</template> |
|||
<script setup lang="ts"> |
|||
|
|||
import { ref } from 'vue'; |
|||
import api from "@/axios/api"; |
|||
import { useStore } from '@/store/index'; |
|||
let piniaStore = useStore(); |
|||
const activeKey = ref([]); |
|||
let header: any = ref([]) |
|||
//图片基础路径 |
|||
let baseUrl = process.env.VUE_APP_API_BASE_URL + "/sys/common/static/"; // api base_urll |
|||
let p1 = api.modelsinfo.getModelsImageGroup().then(res => { |
|||
return res.data; |
|||
}) |
|||
let p2 = api.modelsinfo.getModelsImage().then(res => { |
|||
|
|||
return res.data; |
|||
}) |
|||
Promise.all([p1, p2]).then(res => { |
|||
let headerArr = res[0] |
|||
let itemArr = res[1] |
|||
//循环折叠标题数组 |
|||
headerArr.forEach((element: any, index: number) => { |
|||
//每个折叠标题添加一个存储子元素的数组 |
|||
element.itemArr = [] |
|||
header.value.push(element) |
|||
itemArr?.forEach((item: any) => { |
|||
//判断图片是否为该标题所属 |
|||
if (element.group_name == item.model_group_name) { |
|||
item.dis_img = baseUrl + item.url |
|||
header.value[index].itemArr.push(item) |
|||
} |
|||
}) |
|||
}); |
|||
|
|||
}) |
|||
let cus: any = null; |
|||
function addImage(imgstr: string,img:string): void { |
|||
cus.creating = true |
|||
cus.img = img |
|||
piniaStore.editType = 2; |
|||
} |
|||
</script> |
|||
|
|||
<style scoped lang='less'> |
|||
.left-com-content { |
|||
.content-item { |
|||
cursor: pointer; |
|||
|
|||
padding: 5px 0; |
|||
margin: 1%; |
|||
width: 48%; |
|||
|
|||
.fa span { |
|||
font-size: 25px; |
|||
|
|||
} |
|||
} |
|||
} |
|||
|
|||
:deep(.ant-collapse-content-box) { |
|||
padding: 16px 10px; |
|||
} |
|||
|
|||
.img-box { |
|||
text-align: left; |
|||
display: flex; |
|||
flex-wrap: wrap; |
|||
|
|||
.img { |
|||
flex-basis: 1 / 3 * 100%; |
|||
text-align: center; |
|||
|
|||
.collapse-panel-img { |
|||
padding: 2px; |
|||
|
|||
&:hover { |
|||
border: 1px solid #001529; |
|||
cursor: pointer; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
:deep(.ant-collapse) { |
|||
background-color: #001529; |
|||
border: #fff; |
|||
|
|||
|
|||
.ant-collapse-item { |
|||
|
|||
.ant-collapse-header { |
|||
color: #fff !important; |
|||
|
|||
span { |
|||
color: #fff; |
|||
} |
|||
} |
|||
} |
|||
|
|||
|
|||
} |
|||
</style> |
@ -1,73 +0,0 @@ |
|||
<template> |
|||
<div class="left-com-content"> |
|||
<a-row> |
|||
<a-col class="content-item" @click="haplochromatizationListEvent" title="单体化列表"> |
|||
<a class="btn btnColor"> |
|||
<i class="fa"> |
|||
<span class="icon iconfont icon-moxing-miaobian"></span> |
|||
</i> |
|||
</a> |
|||
<div class="item-text">用户管理</div> |
|||
</a-col> |
|||
<a-col class="content-item" @click="addhaplochromatization" title="单体化"> |
|||
|
|||
<a class="btn btnColor"> |
|||
<i class="fa"> |
|||
<span class="icon iconfont icon-sanweimoxing"></span> |
|||
</i> |
|||
</a> |
|||
<div class="item-text">相机配置</div> |
|||
</a-col> |
|||
</a-row> |
|||
</div> |
|||
</template> |
|||
|
|||
<script setup lang='ts'> |
|||
import { useStore } from '@/store/index'; |
|||
import { audio } from "@/utils/audio"; |
|||
let piniaStore = useStore(); |
|||
|
|||
|
|||
|
|||
|
|||
function haplochromatizationListEvent(): void { |
|||
playAudio(); |
|||
} |
|||
|
|||
function addhaplochromatization(): void { |
|||
piniaStore.editType = 501 |
|||
} |
|||
function fenceListFn() { |
|||
playAudio(); |
|||
} |
|||
//防区 |
|||
function addDefenceArea(): void { |
|||
playAudio(); |
|||
piniaStore.editType = 502 |
|||
} |
|||
//播放音效 |
|||
function playAudio(): void { |
|||
audio.click(); |
|||
} |
|||
|
|||
|
|||
|
|||
|
|||
</script> |
|||
|
|||
<style scoped lang='less'> |
|||
.left-com-content { |
|||
.content-item { |
|||
cursor: pointer; |
|||
|
|||
padding: 5px 0; |
|||
margin: 1%; |
|||
width: 48%; |
|||
|
|||
.fa span { |
|||
font-size: 25px; |
|||
|
|||
} |
|||
} |
|||
} |
|||
</style> |
@ -1,100 +0,0 @@ |
|||
<template> |
|||
<div class="left-com-content"> |
|||
<a-row> |
|||
|
|||
<a-col class="content-item" title="位置测量" @click="measureMent('POINT')"> |
|||
<a class="btn btnColor"> |
|||
<i class="fa"> |
|||
<span class="icon iconfont icon-31dingwei"></span> |
|||
</i> |
|||
</a> |
|||
<div class="item-text">位置测量</div> |
|||
</a-col> |
|||
<a-col class="content-item" title="距离测量" @click="measureMent('SPACE_DISTANCE')"> |
|||
<a class="btn btnColor"> |
|||
<i class="fa"> |
|||
<span class="icon iconfont icon-chizi"></span> |
|||
</i> |
|||
</a> |
|||
<div class="item-text">距离测量</div> |
|||
</a-col> |
|||
<a-col class="content-item" title="三角测量" @click="measureMent('TRIANGLE_DISTANCE')"> |
|||
<a class="btn btnColor"> |
|||
<i class="fa"> |
|||
<span class="icon iconfont icon-celiangleixing"></span> |
|||
</i> |
|||
</a> |
|||
<div class="item-text">三角测量</div> |
|||
</a-col> |
|||
<a-col class="content-item" title="面积测量" @click="measureMent('SPACE_AREA')"> |
|||
<a class="btn btnColor"> |
|||
<i class="fa" style="font-size:35px"> |
|||
<span class="icon iconfont icon-mianjiceliang"></span> |
|||
</i> |
|||
</a> |
|||
<div class="item-text">面积测量</div> |
|||
</a-col> |
|||
|
|||
<a-col class="content-item" title="属性设置" @click="setProperties"> |
|||
|
|||
<a class="btn btnColor"> |
|||
<i class="fa"> |
|||
<span class="icon iconfont icon-shezhi"></span> |
|||
</i> |
|||
</a> |
|||
<div class="item-text">属性设置</div> |
|||
</a-col> |
|||
<a-col class="content-item" title="清空测量结果" @click="clearResults"> |
|||
<a class="btn btnColor"> |
|||
<i class="fa"> |
|||
<span class="icon iconfont icon-Eliminate" style="color: #D35400;"></span> |
|||
</i> |
|||
</a> |
|||
<div class="item-text" style="color: #D35400;">清空测量</div> |
|||
</a-col> |
|||
</a-row> |
|||
</div> |
|||
</template> |
|||
|
|||
<script setup lang='ts'> |
|||
import { ref, h, onMounted, getCurrentInstance, ComponentInternalInstance } from "vue"; |
|||
import { audio } from "@/utils/audio"; |
|||
let measureMentType = ref("NONE"); |
|||
const { proxy } = getCurrentInstance() as ComponentInternalInstance; |
|||
onMounted(() => { |
|||
}) |
|||
|
|||
//播放音效 |
|||
function playAudio(): void { |
|||
audio.click(); |
|||
} |
|||
//属性设置 |
|||
function setProperties(): void { |
|||
playAudio(); |
|||
} |
|||
|
|||
//清除测量结果 |
|||
function clearResults(): void { |
|||
measureMentType.value = "NONE"; |
|||
} |
|||
function measureMent(Type: string) { |
|||
measureMentType.value = Type; |
|||
} |
|||
</script> |
|||
|
|||
<style scoped lang='less'> |
|||
.left-com-content { |
|||
.content-item { |
|||
cursor: pointer; |
|||
|
|||
padding: 5px 0; |
|||
margin: 1%; |
|||
width: 48%; |
|||
|
|||
.fa span { |
|||
font-size: 25px; |
|||
|
|||
} |
|||
} |
|||
} |
|||
</style> |
@ -1,42 +0,0 @@ |
|||
<!-- |
|||
*@描述: 右侧面板 基本信息-数据绑定 |
|||
*@作者: |
|||
*@日期: |
|||
*@版本:1.0 |
|||
*/ |
|||
--> |
|||
<template> |
|||
<div class="rightMenu-class"> |
|||
<a-tabs v-model:activeKey="activeKey"> |
|||
<a-tab-pane key="1" tab="首页"> |
|||
|
|||
<VideoControl></VideoControl> |
|||
</a-tab-pane> |
|||
<a-tab-pane key="2" tab="首页2"> |
|||
暂无信息2 |
|||
</a-tab-pane> |
|||
</a-tabs> |
|||
</div> |
|||
</template> |
|||
|
|||
<script lang="ts" setup> |
|||
import VideoControl from '@/views/page/VideoControl/VideoControl.vue'; |
|||
import { ref } from 'vue' |
|||
let activeKey = ref('1') |
|||
</script> |
|||
|
|||
<style lang="less" scoped> |
|||
.rightMenu-class { |
|||
user-select: none; |
|||
overflow: auto; |
|||
height: 100vh; |
|||
background-color: #001529; |
|||
:deep(.ant-tabs-nav-list) { |
|||
margin: 0 auto; |
|||
padding: 0 20px; |
|||
} |
|||
:deep(.ant-tabs-tabpane){ |
|||
text-align: center; |
|||
} |
|||
} |
|||
</style> |
Loading…
Reference in new issue