核电App
This commit is contained in:
29
hd-glasses-app/src/App.vue
Normal file
29
hd-glasses-app/src/App.vue
Normal file
@@ -0,0 +1,29 @@
|
||||
<template>
|
||||
<div id="app">
|
||||
<!-- <p>-->
|
||||
<!-- <router-link to="/hello">Go to hello</router-link>-->
|
||||
<!-- <router-link to="/about">Go to about</router-link>-->
|
||||
<!-- </p>-->
|
||||
<!-- 路由出口 -->
|
||||
<!-- 路由匹配到的组件将渲染在这里 -->
|
||||
<router-view></router-view>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
|
||||
export default {
|
||||
name: 'App',
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
#app {
|
||||
font-family: Avenir, Helvetica, Arial, sans-serif;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
text-align: center;
|
||||
color: #2c3e50;
|
||||
margin-top: 60px;
|
||||
}
|
||||
</style>
|
||||
BIN
hd-glasses-app/src/assets/logo.png
Normal file
BIN
hd-glasses-app/src/assets/logo.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 6.7 KiB |
25
hd-glasses-app/src/assets/reset.css
Normal file
25
hd-glasses-app/src/assets/reset.css
Normal file
@@ -0,0 +1,25 @@
|
||||
@charset "utf-8";html{background-color:#fff;color:#000;font-size:12px}
|
||||
body,ul,ol,dl,dd,h1,h2,h3,h4,h5,h6,figure,form,fieldset,legend,input,textarea,button,p,blockquote,th,td,pre,xmp{margin:0;padding:0}
|
||||
body,input,textarea,button,select,pre,xmp,tt,code,kbd,samp{line-height:1.5;font-family:tahoma,arial,"Hiragino Sans GB",simsun,sans-serif}
|
||||
h1,h2,h3,h4,h5,h6,small,big,input,textarea,button,select{font-size:100%}
|
||||
h1,h2,h3,h4,h5,h6{font-family:tahoma,arial,"Hiragino Sans GB","微软雅黑",simsun,sans-serif}
|
||||
h1,h2,h3,h4,h5,h6,b,strong{font-weight:normal}
|
||||
address,cite,dfn,em,i,optgroup,var{font-style:normal}
|
||||
table{border-collapse:collapse;border-spacing:0;text-align:left}
|
||||
caption,th{text-align:inherit}
|
||||
ul,ol,menu{list-style:none}
|
||||
fieldset,img{border:0}
|
||||
img,object,input,textarea,button,select{vertical-align:middle}
|
||||
article,aside,footer,header,section,nav,figure,figcaption,hgroup,details,menu{display:block}
|
||||
audio,canvas,video{display:inline-block;*display:inline;*zoom:1}
|
||||
blockquote:before,blockquote:after,q:before,q:after{content:"\0020"}
|
||||
textarea{overflow:auto;resize:vertical}
|
||||
input,textarea,button,select,a{outline:0 none;border: none;}
|
||||
button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}
|
||||
mark{background-color:transparent}
|
||||
a,ins,s,u,del{text-decoration:none}
|
||||
sup,sub{vertical-align:baseline}
|
||||
html {overflow-x: hidden;height: 100%;font-size: 50px;-webkit-tap-highlight-color: transparent;}
|
||||
body {font-family: Arial, "Microsoft Yahei", "Helvetica Neue", Helvetica, sans-serif;color: #333;font-size: .28em;line-height: 1;-webkit-text-size-adjust: none;}
|
||||
hr {height: .02rem;margin: .1rem 0;border: medium none;border-top: .02rem solid #cacaca;}
|
||||
a {color: #25a4bb;text-decoration: none;}
|
||||
58
hd-glasses-app/src/components/HelloWorld.vue
Normal file
58
hd-glasses-app/src/components/HelloWorld.vue
Normal file
@@ -0,0 +1,58 @@
|
||||
<template>
|
||||
<div class="hello">
|
||||
<h1>{{ msg }}</h1>
|
||||
<p>
|
||||
For a guide and recipes on how to configure / customize this project,<br>
|
||||
check out the
|
||||
<a href="https://cli.vuejs.org" target="_blank" rel="noopener">vue-cli documentation</a>.
|
||||
</p>
|
||||
<h3>Installed CLI Plugins</h3>
|
||||
<ul>
|
||||
<li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-babel" target="_blank" rel="noopener">babel</a></li>
|
||||
<li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-eslint" target="_blank" rel="noopener">eslint</a></li>
|
||||
</ul>
|
||||
<h3>Essential Links</h3>
|
||||
<ul>
|
||||
<li><a href="https://vuejs.org" target="_blank" rel="noopener">Core Docs</a></li>
|
||||
<li><a href="https://forum.vuejs.org" target="_blank" rel="noopener">Forum</a></li>
|
||||
<li><a href="https://chat.vuejs.org" target="_blank" rel="noopener">Community Chat</a></li>
|
||||
<li><a href="https://twitter.com/vuejs" target="_blank" rel="noopener">Twitter</a></li>
|
||||
<li><a href="https://news.vuejs.org" target="_blank" rel="noopener">News</a></li>
|
||||
</ul>
|
||||
<h3>Ecosystem</h3>
|
||||
<ul>
|
||||
<li><a href="https://router.vuejs.org" target="_blank" rel="noopener">vue-router</a></li>
|
||||
<li><a href="https://vuex.vuejs.org" target="_blank" rel="noopener">vuex</a></li>
|
||||
<li><a href="https://github.com/vuejs/vue-devtools#vue-devtools" target="_blank" rel="noopener">vue-devtools</a></li>
|
||||
<li><a href="https://vue-loader.vuejs.org" target="_blank" rel="noopener">vue-loader</a></li>
|
||||
<li><a href="https://github.com/vuejs/awesome-vue" target="_blank" rel="noopener">awesome-vue</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
name: 'HelloWorld',
|
||||
props: {
|
||||
msg: String
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<!-- Add "scoped" attribute to limit CSS to this component only -->
|
||||
<style scoped>
|
||||
h3 {
|
||||
margin: 40px 0 0;
|
||||
}
|
||||
ul {
|
||||
list-style-type: none;
|
||||
padding: 0;
|
||||
}
|
||||
li {
|
||||
display: inline-block;
|
||||
margin: 0 10px;
|
||||
}
|
||||
a {
|
||||
color: #42b983;
|
||||
}
|
||||
</style>
|
||||
20
hd-glasses-app/src/components/MyHello.vue
Normal file
20
hd-glasses-app/src/components/MyHello.vue
Normal file
@@ -0,0 +1,20 @@
|
||||
<template>
|
||||
<div>
|
||||
<div>MyHello</div>
|
||||
<van-button type="primary">主要按钮</van-button>
|
||||
<van-button type="info">信息按钮</van-button>
|
||||
<van-button type="default">默认按钮</van-button>
|
||||
<van-button type="warning">警告按钮</van-button>
|
||||
<van-button type="danger">危险按钮</van-button>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
name: "MyHello"
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
|
||||
</style>
|
||||
22
hd-glasses-app/src/main.js
Normal file
22
hd-glasses-app/src/main.js
Normal file
@@ -0,0 +1,22 @@
|
||||
import Vue from 'vue'
|
||||
import App from './App.vue'
|
||||
|
||||
import router from './router'
|
||||
|
||||
import axios from 'axios'
|
||||
Vue.prototype.$http = axios.create();
|
||||
|
||||
|
||||
import Vant from 'vant';
|
||||
import 'vant/lib/index.css';
|
||||
Vue.use(Vant);
|
||||
|
||||
import 'amfe-flexible';
|
||||
|
||||
|
||||
Vue.config.productionTip = false
|
||||
|
||||
new Vue({
|
||||
render: h => h(App),
|
||||
router //添加路由对象
|
||||
}).$mount('#app')
|
||||
37
hd-glasses-app/src/pages/call_room.vue
Normal file
37
hd-glasses-app/src/pages/call_room.vue
Normal file
@@ -0,0 +1,37 @@
|
||||
<template>
|
||||
<div>
|
||||
<h1>call_room</h1>
|
||||
<video id="rtc_media_player" width="310" autoplay muted controls></video>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
name: "call_room",
|
||||
data() {
|
||||
return {};
|
||||
},
|
||||
mounted() {
|
||||
// eslint-disable-next-line no-undef
|
||||
let player = new SrsRtcPlayerAsync();
|
||||
var url = 'webrtc://192.168.2.180/live/test123';
|
||||
|
||||
player.play(url).then(function(session){
|
||||
console.log(session);
|
||||
// ui.children('#peer').text('Peer: ' + url);
|
||||
// video.prop('muted', false);
|
||||
}).catch(function (reason) {
|
||||
|
||||
// player.close();
|
||||
// video.hide();
|
||||
console.error(reason);
|
||||
});
|
||||
|
||||
},
|
||||
methods: {}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
|
||||
</style>
|
||||
277
hd-glasses-app/src/pages/map.vue
Normal file
277
hd-glasses-app/src/pages/map.vue
Normal file
@@ -0,0 +1,277 @@
|
||||
<template>
|
||||
<div id="content">
|
||||
<div id="map" ref="map" style="width: 100vw; height: 100vh"/>
|
||||
<div id="overlay-box"/>
|
||||
<div class="actionList">
|
||||
<van-grid :column-num="3">
|
||||
<van-grid-item>
|
||||
<van-button size="mini" type="primary" @click="canAddPoints=true">开始新增点位</van-button>
|
||||
</van-grid-item>
|
||||
<van-grid-item>
|
||||
<van-button size="mini" type="primary" @click="canAddPoints=false">结束新增点位</van-button>
|
||||
</van-grid-item>
|
||||
<van-grid-item>
|
||||
<van-button size="mini" type="primary" @click="clearPointsLayers">清除点位</van-button>
|
||||
</van-grid-item>
|
||||
<van-grid-item>
|
||||
<van-button size="mini" type="primary" @click="startAnimation()">开始沿轨迹运动</van-button>
|
||||
</van-grid-item>
|
||||
<van-grid-item>
|
||||
<van-button size="mini" type="primary" @click="stopAnimation()">结束沿轨迹运动</van-button>
|
||||
</van-grid-item>
|
||||
</van-grid>
|
||||
<br/>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import "ol/ol.css";
|
||||
import TileLayer from "ol/layer/Tile";
|
||||
import VectorLayer from "ol/layer/Vector";
|
||||
import VectorSource from "ol/source/Vector";
|
||||
import XYZ from "ol/source/XYZ";
|
||||
import {Map, View, Feature} from "ol";
|
||||
import { Icon, Fill, Stroke, Style, Circle } from "ol/style";
|
||||
import Overlay from "ol/Overlay";
|
||||
import {Point, LineString} from "ol/geom.js";
|
||||
import { getVectorContext } from "ol/render";
|
||||
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
map: {},
|
||||
pointLayer: {},
|
||||
canAddPoints: false,
|
||||
coordinate: [],
|
||||
route: new LineString([[113.95113841271974,22.568523240293505],[113.94452944970705,22.563351941312792],[113.95188943124391,22.559317898954394],[113.94467965341188,22.555326771940233]]),
|
||||
geometryMove: {},
|
||||
featureMove: {},
|
||||
styles: {
|
||||
route: new Style({
|
||||
stroke: new Stroke({
|
||||
width: 6,
|
||||
color: [237, 212, 0, 0.8],
|
||||
}),
|
||||
}),
|
||||
icon: new Style({
|
||||
image: new Icon({
|
||||
anchor: [0.5, 1],
|
||||
src: "https://openlayers.org/en/v4.6.5/examples/data/icon.png",
|
||||
scale: 1, //设置大小
|
||||
}),
|
||||
}),
|
||||
featureMove: new Style({
|
||||
image: new Circle({
|
||||
radius: 7,
|
||||
fill: new Fill({color: "black"}),
|
||||
stroke: new Stroke({
|
||||
color: "white",
|
||||
width: 2,
|
||||
}),
|
||||
}),
|
||||
}),
|
||||
},
|
||||
vectorLayer: {},
|
||||
distance: 0,
|
||||
lastTime: 0,
|
||||
speed: 0.1
|
||||
};
|
||||
},
|
||||
mounted() {
|
||||
this.initMap();
|
||||
this.clickMap();
|
||||
},
|
||||
methods: {
|
||||
showHistory() {
|
||||
var _list = [[113.94755498147583, 22.565597285534384], [113.9468468782959, 22.563151110912802], [113.9487566111145, 22.56018995216036], [113.95017281747437, 22.55748628547335]]
|
||||
console.log(_list)
|
||||
|
||||
},
|
||||
clearPointsLayers() {
|
||||
this.coordinate = []
|
||||
this.map.removeLayer(this.pointLayer);
|
||||
this.pointLayer = {};
|
||||
if (Object.keys(this.pointLayer).length == 0) {
|
||||
// 创建图层
|
||||
this.pointLayer = new VectorLayer({
|
||||
source: new VectorSource(),
|
||||
});
|
||||
// 图层添加到地图上
|
||||
this.map.addLayer(this.pointLayer);
|
||||
}
|
||||
},
|
||||
initMap() {
|
||||
|
||||
this.geometryMove = new Point(this.route.getFirstCoordinate());
|
||||
|
||||
this.featureMove = new Feature({
|
||||
type: "featureMove",
|
||||
geometry: this.geometryMove,
|
||||
});
|
||||
this.vectorLayer = new VectorLayer({
|
||||
source: new VectorSource({
|
||||
features: [
|
||||
new Feature({
|
||||
type: "route",
|
||||
geometry: this.route,
|
||||
}),
|
||||
this.featureMove,
|
||||
new Feature({
|
||||
type: "icon",
|
||||
geometry: new Point(this.route.getFirstCoordinate()),
|
||||
}),
|
||||
new Feature({
|
||||
type: "icon",
|
||||
geometry: new Point(this.route.getLastCoordinate()),
|
||||
}),
|
||||
],
|
||||
}),
|
||||
style: (feature) => {
|
||||
return this.styles[feature.get("type")];
|
||||
},
|
||||
});
|
||||
|
||||
|
||||
|
||||
this.map = new Map({
|
||||
target: "map",
|
||||
layers: [
|
||||
new TileLayer({
|
||||
source: new XYZ({
|
||||
url: "http://map.geoq.cn/ArcGIS/rest/services/ChinaOnlineStreetPurplishBlue/MapServer/tile/{z}/{y}/{x}",
|
||||
}),
|
||||
}),
|
||||
],
|
||||
view: new View({
|
||||
projection: "EPSG:4326",
|
||||
center: [113.948306, 22.562039],
|
||||
zoom: 16,
|
||||
}),
|
||||
});
|
||||
|
||||
this.map.addLayer(this.vectorLayer);
|
||||
},
|
||||
/**
|
||||
* 点击地图添加摄像头要素
|
||||
*/
|
||||
clickMap() {
|
||||
|
||||
this.map.on("click", (e) => {
|
||||
if (this.canAddPoints) {
|
||||
this.addPoints(e.coordinate);
|
||||
}
|
||||
});
|
||||
},
|
||||
/**
|
||||
* 根据经纬度坐标添加摄像头要素
|
||||
*/
|
||||
addPoints(coordinate) {
|
||||
this.coordinate.push(coordinate)
|
||||
console.log(JSON.stringify(this.coordinate))
|
||||
if (Object.keys(this.pointLayer).length == 0) {
|
||||
// 创建图层
|
||||
this.pointLayer = new VectorLayer({
|
||||
source: new VectorSource(),
|
||||
});
|
||||
// 图层添加到地图上
|
||||
this.map.addLayer(this.pointLayer);
|
||||
}
|
||||
|
||||
// 创建feature要素,一个feature就是一个点坐标信息
|
||||
const feature = new Feature({
|
||||
geometry: new Point(coordinate),
|
||||
});
|
||||
// 设置要素的图标
|
||||
feature.setStyle(
|
||||
new Style({
|
||||
// 设置图片效果
|
||||
image: new Icon({
|
||||
src: "https://smart-garden-manage.oss-cn-chengdu.aliyuncs.com/shexiangtou.png",
|
||||
// anchor: [0.5, 0.5],
|
||||
scale: 0.3,
|
||||
}),
|
||||
})
|
||||
);
|
||||
// 要素添加到地图图层上
|
||||
|
||||
this.pointLayer.getSource().addFeature(feature);
|
||||
|
||||
// 设置文字信息
|
||||
// this.addText(coordinate);
|
||||
},
|
||||
addText(coordinate) {
|
||||
const overlayBox = document.getElementById("overlay-box"); //获取一个div
|
||||
const oSpan = document.createElement("span"); //创建一个span
|
||||
oSpan.contentEditable = true; //设置文字是否可编辑
|
||||
oSpan.id = coordinate[0]; //创建一个id
|
||||
let pText = document.createTextNode("摄像头" + coordinate[0].toFixed(2)); //创建span的文本信息
|
||||
oSpan.appendChild(pText); //将文本信息添加到span
|
||||
overlayBox.appendChild(oSpan); //将span添加到div中
|
||||
let textInfo = new Overlay({
|
||||
position: coordinate, //设置位置
|
||||
element: document.getElementById(coordinate[0]),
|
||||
offset: [-25, 30], //设置偏移
|
||||
});
|
||||
this.map.addOverlay(textInfo);
|
||||
},
|
||||
|
||||
moveFeature(e) {
|
||||
let time = e.frameState.time;
|
||||
this.distance =
|
||||
(this.distance + (this.speed * (time - this.lastTime)) / 1000) % 1; //%2表示:起止止起;%1表示:起止起止
|
||||
|
||||
this.lastTime = time;
|
||||
|
||||
const currentCoordinate = this.route.getCoordinateAt(
|
||||
this.distance > 1 ? 2 - this.distance : this.distance
|
||||
);
|
||||
this.geometryMove.setCoordinates(currentCoordinate);
|
||||
const vectorContext = getVectorContext(e);
|
||||
vectorContext.setStyle(this.styles.featureMove);
|
||||
vectorContext.drawGeometry(this.geometryMove);
|
||||
this.map.render();
|
||||
},
|
||||
startAnimation() {
|
||||
this.lastTime = Date.now();
|
||||
this.vectorLayer.on("postrender", this.moveFeature);
|
||||
this.featureMove.setGeometry(null); //必须用null,不能用{}
|
||||
},
|
||||
|
||||
stopAnimation() {
|
||||
this.featureMove.setGeometry(this.geometryMove);
|
||||
this.vectorLayer.un("postrender", this.moveFeature);
|
||||
}
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="less">
|
||||
// 非核心已删除
|
||||
#content {
|
||||
width: 100%;
|
||||
height: 100vh;
|
||||
|
||||
#map {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
.ol-touch .ol-control button {
|
||||
font-size: 26px;
|
||||
}
|
||||
|
||||
.actionList {
|
||||
position: fixed;
|
||||
bottom: 0px;
|
||||
left: 0px;
|
||||
height: 200px;
|
||||
width: 100%;
|
||||
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: space-around;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
</style>
|
||||
29
hd-glasses-app/src/router/index.js
Normal file
29
hd-glasses-app/src/router/index.js
Normal file
@@ -0,0 +1,29 @@
|
||||
import Vue from 'vue';//引入Vue对象,因为要用它的use
|
||||
import Router from 'vue-router'//引入vue-router
|
||||
//引入你需要配置的组件
|
||||
import MyHello from '../components/MyHello.vue'
|
||||
//使用路由插件
|
||||
Vue.use(Router);
|
||||
|
||||
//配置路由
|
||||
const router = new Router({
|
||||
routes: [
|
||||
{
|
||||
path:"/hello",
|
||||
component:MyHello
|
||||
},
|
||||
//路由懒加载(按需加载)
|
||||
{
|
||||
path: '/map',
|
||||
name: 'map',
|
||||
component: () => import('../pages/map.vue')
|
||||
},{
|
||||
path: '/call_room',
|
||||
name: 'call_room',
|
||||
component: () => import('../pages/call_room.vue')
|
||||
}
|
||||
]
|
||||
});
|
||||
|
||||
//导出
|
||||
export default router;
|
||||
34
hd-glasses-app/src/utils/service.js
Normal file
34
hd-glasses-app/src/utils/service.js
Normal file
@@ -0,0 +1,34 @@
|
||||
import axios from "axios";
|
||||
|
||||
let service = axios.create({
|
||||
baseURL:"",//相同绝对路径
|
||||
timeout: 100000,//超过这么多时间,则请求终止
|
||||
headers: {//请求头携带数据的格式
|
||||
"Content-Type": "application/json;charset=UTF-8",
|
||||
// "Content-Type": "application/x-www-form-urlencoded;charset=utf-8",
|
||||
}
|
||||
});
|
||||
// 添加请求拦截器(Interceptors)
|
||||
service.interceptors.request.use(function (config) {
|
||||
// 发送请求之前做写什么
|
||||
let token = localStorage.getItem("token");
|
||||
// 如果有
|
||||
if(token){
|
||||
// 放在请求头(token跟后端沟通,他需要什么该成什么就可以了)
|
||||
config.headers.authorization = token;
|
||||
}
|
||||
return config;
|
||||
}, function (error) {
|
||||
// 请求错误的时候做些什么
|
||||
return Promise.reject(error);
|
||||
});
|
||||
// 添加响应拦截器
|
||||
service.interceptors.response.use(function (response) {
|
||||
// 对响应数据做点什么
|
||||
return response;
|
||||
}, function (error) {
|
||||
// 对响应错误做点什么
|
||||
return Promise.reject(error);
|
||||
});
|
||||
|
||||
export default service;
|
||||
Reference in New Issue
Block a user