修复无法返回首页的问题,index2中调研使用本地html远程加载vue模板插入dom后再使用本地vue执行双向绑定

TangShanKaiPing
wanggang 6 years ago
parent 0a379251fa
commit 7bdc0f5452

@ -18,67 +18,70 @@
<div id="app">
<f7-app :params="f7params">
<f7-statusbar></f7-statusbar>
<f7-view id="main-view" main class="safe-areas">
<f7-page name="page-index" :page-content="false" @page:beforein="init">
<f7-navbar>
<f7-nav-title>{{Title}}</f7-nav-title>
</f7-navbar>
<f7-toolbar tabbar labels bottom>
<f7-link tab-link="#tab-message" icon-ios="f7:chat" icon-md="f7:chat" text="消息"></f7-link>
<f7-link tab-link="#tab-nodes" icon-ios="f7:data" icon-md="f7:data" text="智慧教室" tab-link-active></f7-link>
<f7-link tab-link="#tab-user" icon-ios="f7:person" icon-md="f7:person" text="我的"></f7-link>
</f7-toolbar>
<f7-tabs>
<f7-tab id="tab-message" class="page-content">
<template v-for="message in Messages">
<template v-if="message&&message.Data.length">
<div class="block-title">{{message.DisplayName||message.Name}}</div>
<div class="list">
<ul v-if="message.Data.length">
<template v-for="p in message.Data">
<li v-if="p.Name!=='hidden'">
<div class="item-content">
<div class="item-media"><i class="f7-icons">info</i></div>
<div class="item-inner">
<div class="item-title">{{p.Name}}</div>
<div class="item-after">
<span class="badge color-blue">
{{p.Value}}
</span>
<span>&nbsp;</span>
<span class="badge color-blue" v-if="p.Unit">
{{p.Unit}}
</span>
<span>&nbsp;</span>
<span class="badge color-blue" v-if="p.Description">
{{p.Description}}
</span>
</div>
</div>
</div>
</li>
</template>
</ul>
</div>
</template>
</template>
</f7-tab>
<f7-tab id="tab-nodes" class="page-content" tab-active>
<f7-list>
<f7-list-item v-for="node in Nodes" :title="node.Name" :badge="node.Count" :link="'/node/'+node.Number+'/name/'+node.Name"></f7-list-item>
</f7-list>
</f7-tab>
<f7-tab id="tab-user" class="page-content">
<f7-list>
<f7-list-item title="用户名" :after="UserName"></f7-list-item>
<f7-list-item title="昵称" :after="NickName"></f7-list-item>
<f7-list-item link="/login/" title="注销"></f7-list-item>
</f7-list>
</f7-tab>
</f7-tabs>
<f7-view id="main-view" url="/" main class="safe-areas">
</f7-view>
</f7-app>
</div>
<template id="page-home">
<f7-page :page-content="false" @page:beforein="vm.init">
<f7-navbar>
<f7-nav-title>{{vm.Title}}</f7-nav-title>
</f7-navbar>
<f7-toolbar tabbar labels bottom>
<f7-link tab-link="#tab-message" icon-ios="f7:chat" icon-md="f7:chat" text="消息"></f7-link>
<f7-link tab-link="#tab-nodes" icon-ios="f7:data" icon-md="f7:data" text="智慧教室" tab-link-active></f7-link>
<f7-link tab-link="#tab-user" icon-ios="f7:person" icon-md="f7:person" text="我的"></f7-link>
</f7-toolbar>
<f7-tabs>
<f7-tab id="tab-message" class="page-content">
<template v-for="message in vm.Messages">
<template v-if="message&&message.Data.length">
<div class="block-title">{{message.DisplayName||message.Name}}</div>
<div class="list">
<ul v-if="message.Data.length">
<template v-for="p in message.Data">
<li v-if="p.Name!=='hidden'">
<div class="item-content">
<div class="item-media"><i class="f7-icons">info</i></div>
<div class="item-inner">
<div class="item-title">{{p.Name}}</div>
<div class="item-after">
<span class="badge color-blue">
{{p.Value}}
</span>
<span>&nbsp;</span>
<span class="badge color-blue" v-if="p.Unit">
{{p.Unit}}
</span>
<span>&nbsp;</span>
<span class="badge color-blue" v-if="p.Description">
{{p.Description}}
</span>
</div>
</div>
</div>
</li>
</template>
</ul>
</div>
</template>
</template>
</f7-tab>
<f7-tab id="tab-nodes" class="page-content" tab-active>
<f7-list>
<f7-list-item v-for="node in vm.Nodes" :title="node.Name" :badge="node.Count" :link="'/node/'+node.Number+'/name/'+node.Name"></f7-list-item>
</f7-list>
</f7-tab>
<f7-tab id="tab-user" class="page-content">
<f7-list>
<f7-list-item title="用户名" :after="vm.UserName"></f7-list-item>
<f7-list-item title="昵称" :after="vm.NickName"></f7-list-item>
<f7-list-item link="/login/" title="注销"></f7-list-item>
</f7-list>
</f7-tab>
</f7-tabs>
</f7-page>
</template>
<template id="page-login">
<f7-page>
<f7-navbar title="登录"></f7-navbar>
@ -162,7 +165,7 @@
<div class="row">
<div class="col-33 tablet-20 desktop-10" v-for="device in getDevices('检测器','监测器')">
<div class="row">
<a class="button button-raised">{{device.Name||device.DisplayName}}</a>
<a class="button button-raised" :href="'/node/'+device.Number+'/name/'+device.Name||device.DisplayName">{{device.Name||device.DisplayName}}</a>
</div>
<div class="row" v-if="device.Name==='温湿度检测器'">
<div class="col">{{getData(device,"温度")}}</div>
@ -223,7 +226,11 @@
<a class="button button-raised">{{device.Name||device.DisplayName}}</a>
</div>
<div class="row">
<div class="col">{{getData(device,"连接数")}}</div>
<div class="row">IP {{getData(device,"IP")}}</div>
<div class="row">连接数:{{getData(device,"连接数")}}</div>
</div>
<div class="row">
<a class="button button-raised button-fill" href="javascript: ;" v-on:click="call(device.Id,'21dhcps')">设备</a>
</div>
</div>
</div>
@ -560,6 +567,39 @@
</template>
</f7-page>
</template>
<template id="page-device">
<f7-page>
<f7-navbar>
<f7-navbar title="Device.DisplayName||Device.Name" back-link="Back"></f7-navbar>
</f7-navbar>
</f7-page>
</template>
<!-- Page Not Found Template -->
<template id="page-not-found">
<f7-page>
<f7-navbar title="Not found" back-link="Back"></f7-navbar>
<f7-block strong>
<p>Sorry</p>
<p>Requested content not found.</p>
</f7-block>
</f7-page>
</template>
<div id="callback" class="popup popup-tablet-fullscreen">
<div class="page">
<div class="navbar">
<div class="navbar-inner">
<div class="left">
</div>
<div class="title">API调用结果</div>
<div class="right"><a href="#" class="link popup-close">关闭</a></div>
</div>
</div>
<div class="page-content">
<div id="video-container" class="block">
</div>
</div>
</div>
</div>
<script src="lib/mobile.detect/mobile-detect.min.js"></script>
<script src="lib/lodash/lodash.min.js"></script>
<script src="lib/jquery/jquery.min.js"></script>

@ -13,506 +13,19 @@
</head>
<body>
<div id="app">
<div class="view view-main view-init">
<div class="page page-current" data-page="index">
<div class="navbar">
<div class="navbar-inner">
<div class="left">
</div>
<div class="title sliding">科学技术学院</div>
<div class="right">
</div>
</div>
</div>
<div class="toolbar tabbar tabbar-labels toolbar-bottom">
<div class="toolbar-inner">
<a href="#tab-1" class="tab-link">
<i class="f7-icons">chat</i>
<span class="tabbar-label">消息</span>
</a>
<a href="#tab-2" class="tab-link tab-link-active">
<i class="f7-icons">data</i>
<span class="tabbar-label">智慧教室</span>
</a>
<a href="#tab-3" class="tab-link">
<i class="f7-icons">person</i>
<span class="tabbar-label">我的</span>
</a>
</div>
</div>
<div class="tabs page page-current">
<div id="tab-1" class="page-content tab">
<template v-if="message&&message.Data.length">
<div class="block-title">{{message.DisplayName||message.Name}}</div>
<div class="list">
<ul v-if="message.Data.length">
<template v-for="p in message.Data">
<li v-if="p.Name!=='hidden'">
<div class="item-content">
<div class="item-media"><i class="f7-icons">info</i></div>
<div class="item-inner">
<div class="item-title">{{p.Name}}</div>
<div class="item-after">
<span class="badge color-blue">
{{p.Value}}
</span>
<span>&nbsp;</span>
<span class="badge color-blue" v-if="p.Unit">
{{p.Unit}}
</span>
<span>&nbsp;</span>
<span class="badge color-blue" v-if="p.Description">
{{p.Description}}
</span>
</div>
</div>
</div>
</li>
</template>
</ul>
</div>
</template>
</div>
<div id="tab-2" class="page-content tab tab-active">
<div class="list links-list">
<ul id="nodeList">
<li v-for="node in model">
<a class="item-content popup-open node" href="#" data-popup=".node-popup" :data-node-Id="node.Id">
<div class="item-media"><i class="f7-icons">link</i></div>
<div class="item-inner">
<div class="item-title">{{node.Name}}</div>
<div class="item-after"><span class="badge color-blue">{{node.Devices.length}}</span></div>
</div>
</a>
</li>
</ul>
</div>
</div>
<div id="tab-3" class="page-content tab">
<div class="list links-list">
<ul>
<li>
<div class="item-content">
<div class="item-inner">
<div class="item-title">用户名</div>
<div class="item-after">{{UserName}}</div>
</div>
</div>
</li>
<li>
<div class="item-content">
<div class="item-inner">
<div class="item-title">昵称</div>
<div class="item-after">{{NickName}}</div>
</div>
</div>
</li>
<li>
<a href="login.html?action=logout" class="external">退出</a>
</li>
<li>
<a href="#test">test</a>
</li>
</ul>
</div>
</div>
</div>
</div>
<div class="page stacked" data-page="test">
<div class="navbar">
<div class="navbar-inner">
<div class="title">test</div>
<div class="right"></div>
</div>
</div>
<div class="page-content">
<div class="block-title">test</div>
</div>
</div>
</div>
<div class="popup node-popup popup-tablet-fullscreen">
<div class="page">
<div class="navbar">
<div class="navbar-inner">
<div class="title">
<template v-if="node">
{{node.Name}}
</template>
</div>
<div class="right"><a href="#" class="link" onclick="app.popup.get('.node-popup').close();"><i class="f7-icons">close</i></a></div>
</div>
</div>
<div class="page-content">
<div class="block-title">场景</div>
<div class="block" v-if="node">
<div class="row">
<div class="col-33 tablet-15 demo-icon" v-for="sence in _.orderBy(node.Sences,['DisplayOrder','Name'])" v-on:click="sendSence(sence.Id)">
<a href="javascript:;" class="col button button-large button-raised">{{sence.Name}}</a>
</div>
</div>
</div>
<div class="block-title">设备</div>
<div class="list links-list" v-if="node">
<ul>
<li v-for="d in _.orderBy(node.Devices,['DisplayOrder','Name'])">
<a class="item-content popup-open device" href="#" data-popup=".device-popup" :data-device-id="d.Id">
<div class="item-media"><i class="f7-icons">link</i></div>
<div class="item-inner">
<div class="item-title">{{d.DisplayName||d.Name}}</div>
<div class="item-after">
<template v-if="d.Name==='温湿度检测器'">
<span class="badge color-blue">{{getDeviceDataValue(d,"温度")}}</span>
<span class="badge color-blue">{{getDeviceDataValue(d,"湿度")}}</span>
</template>
<template v-else-if="d.Name==='二氧化碳监测器'">
<span class="badge color-blue">{{getDeviceDataValue(d,"二氧化碳")}}</span>
</template>
<template v-else-if="d.Name==='光强检测器'">
<span class="badge color-blue">{{getDeviceDataValue(d,"光照强度")}}</span>
</template>
<template v-else-if="d.Name==='粉尘检测器'">
<span class="badge color-blue">{{getDeviceDataValue(d,"粉尘")}}</span>
</template>
<template v-else-if="d.Name==='烟雾感应器'">
<span class="badge color-blue">{{getDeviceDataValue(d,"状态")}}</span>
</template>
<template v-else-if="d.Name==='红外感应器'">
<span class="badge color-blue">{{getDeviceDataValue(d,"状态")}}</span>
</template>
<template v-else-if="d.Name==='主机'">
<span class="badge color-blue">{{getDeviceDataValue(d,"接收")}}</span>
</template>
<template v-else-if="d.Name==='AP'">
<span class="badge color-blue">{{getDeviceDataValue(d,"连接数")}}</span>
</template>
<template v-else-if="d.Name==='一路可调窗帘'">
<span class="badge color-blue">{{getDeviceDataValue(d,"状态")}}</span>
</template>
<template v-else-if="d.Name==='计量开关'">
<span class="badge color-blue">{{getDeviceDataValue(d,"状态")}}</span>
</template>
<template v-else-if="d.Name==='一路照明开关'">
<span class="badge color-blue">{{getDeviceDataValue(d,"状态")}}</span>
</template>
<template v-else-if="d.Name==='二路灯开关'">
<span class="badge color-blue">{{getDeviceDataValue(d,"L1状态")}}</span>
<span class="badge color-blue">{{getDeviceDataValue(d,"L2状态")}}</span>
</template>
<template v-else-if="d.Name==='三路照明开关'">
<span class="badge color-blue">{{getDeviceDataValue(d,"状态4")}}</span>
<span class="badge color-blue">{{getDeviceDataValue(d,"状态5")}}</span>
<span class="badge color-blue">{{getDeviceDataValue(d,"状态6")}}</span>
</template>
<template v-else-if="d.Name==='墙面插座'">
<span class="badge color-blue">{{getDeviceDataValue(d,"状态")}}</span>
</template>
<template v-else-if="d.Name==='一路插座'">
<span class="badge color-blue">{{getDeviceDataValue(d,"状态")}}</span>
</template>
<template v-else-if="d.Name==='二路插座'">
<span class="badge color-blue">{{getDeviceDataValue(d,"状态")}}</span>
</template>
<template v-else-if="d.Name==='密码门锁'">
<span class="badge color-blue">{{getDeviceDataValue(d,"状态")}}</span>
</template>
<template v-else-if="d.Name==='红外转发器'">
</template>
<template v-else-if="d.Name==='串口控制器'">
</template>
<template v-else-if="d.Name==='摄像头'">
</template>
<template v-else>
<template v-for="p in d.Data">
<span v-if="p.Name!=='hidden'" class="badge color-blue">
{{p.Name}}:{{p.Value}}{{p.Unit}}
</span>
</template>
</template>
</div>
</div>
</a>
</li>
</ul>
</div>
</div>
</div>
</div>
<div class="popup device-popup popup-tablet-fullscreen">
<div class="page">
<div class="navbar">
<div class="navbar-inner">
<div class="title">
<template v-if="device">
{{device.Name}}
</template>
</div>
<div class="right"><a href="#" class="link" onclick="app.popup.get('.device-popup').close();"><i class="f7-icons">close</i></a></div>
</div>
</div>
<div class="page-content">
<div class="block-title">属性</div>
<div class="list" v-if="device">
<ul v-if="device.Data.length">
<template v-for="p in device.Data">
<li v-if="p.Name!=='hidden'">
<div class="item-content">
<div class="item-media"><i class="f7-icons">info</i></div>
<div class="item-inner">
<div class="item-title">{{p.Name}}</div>
<div class="item-after">
<span class="badge color-blue">
{{p.Value}}
</span>
<span>&nbsp;</span>
<span class="badge color-blue" v-if="p.Unit">
{{p.Unit}}
</span>
<span>&nbsp;</span>
<span class="badge color-blue" v-if="p.Description">
{{p.Description}}
</span>
</div>
</div>
</div>
</li>
</template>
</ul>
</div>
<div class="block-title">操作</div>
<div class="list links-list" v-if="device">
<ul>
<li v-for="a in _.orderBy(device.Apis,['DisplayOrder','Name'])">
<a class="item-content" href="#">
<div class="item-media"><i class="f7-icons">link</i></div>
<div class="item-inner">
<div class="item-title">{{a.Name}}</div>
</div>
</a>
</li>
</ul>
</div>
</div>
</div>
</div>
</div>
<script src="lib/mobile.detect/mobile-detect.min.js"></script>
<script src="lib/lodash/lodash.min.js"></script>
<script src="lib/jquery/jquery.min.js"></script>
<script src="lib/framework7/js/framework7.bundle.min.js"></script>
<script src="lib/signalr/signalr.min.js"></script>
<script src="lib/vue/vue.min.js"></script>
<script src="lib/dayjs/dayjs.min.js"></script>
<script src="lib/URI.js/URI.min.js"></script>
<!--<script src="js/app.js"></script>-->
<script>
function getJsonExt(url) {
console.log('send:' + url);
app.dialog.progress();
$.getJSON(url, function (result) {
console.log(result);
app.dialog.close();
if (result.code === 0) {
if (result.type === 0) {
if (result.format === 1) {
console.log('format/1/base64 jpeg image');
$('#callback .page-content .block').html('<img class="shot" src="' + result.data + '">');
}
else {
console.log('format/0/json object');
$('#callback .page-content .block').html(result.data);
}
app.popup.open('#callback');
}
}
else {
app.dialog.alert(result.message, "消息", function () {
setTimeout(function () { app.dialog.close(); }, 3000);
});
}
}).fail(function () {
console.log('error');
app.dialog.close();
});;
}
</script>
<script>
var baseUrl = localStorage.getItem('iotServer');
var wsUrl = baseUrl + "/hub?group=nodes";
var ajaxUrl = baseUrl + "/Home/GetNodes";
var $$ = Dom7;
var username = localStorage.getItem("username");
var server = localStorage.getItem("server");
var iotPageIndex = 1;
function init() {
Framework7.request.json(ajaxUrl, null, function (response) {
vm.model = response;
}, null, 'json');
}
</script>
<script>
const connection = new signalR.HubConnectionBuilder()
.withUrl(wsUrl)
.build();
function connect() {
if (connection && connection.connection.connectionState === 1) {
console.log('has connected');
}
else {
console.log('start connect to server:' + Date());
connection.start().then(function () {
console.log('signalR>start');
}).catch(function (err) {
console.error(err.toString());
setTimeout(connect, 10 * 1000);
});
}
}
connection.on("UpdateNode", (message) => {
var node = JSON.parse(message);
var oldNode = _.chain(vm.model).filter(o => o.Number === node.Number).first().value();
oldNode.Name = node.Name;
console.log('update:' + node.Name);
});
connection.on("UpdateDevice", (message) => {
var device = JSON.parse(message);
var update = false;
var node = _.chain(vm.model).filter(o => o.Number === device.Node.Number).first().value();
for (var i = 0; i < node.Devices.length; i++) {
if (node.Devices[i].Number == device.Number) {
update = true;
break;
}
}
if (update) {
node.Devices.splice(i, 1, device);
}
else {
node.Devices.push(device);
}
console.log('update:' + device.DisplayName);
vm.message = device;
});
connection.on("DeleteDevice", (message) => {
var number = message;
for (var i = 0; i < vm.model.length; i++) {
var node = vm.model[i];
for (var j = 0; j < node.Devices.length; j++) {
if (node.Devices[j].Number == number) {
node.Devices.splice(j, 1);
break;
}
}
}
console.log('delete:' + number);
});
connection.onclose(function () {
setTimeout(connect, 10 * 1000);
});
</script>
<script src="lib/vue/vue.min.js"></script>
<script>
var app;
var vm = new Vue({
el: '#app',
data: {
model: [],
message: null,
node: null,
device: null,
UserName: localStorage.getItem('username'),
NickName: localStorage.getItem('nickName')
},
mounted: function () {
console.log('vue>mounted');
$('#app').append('<div>{{message}}</div>');
var os = new MobileDetect(navigator.userAgent).os();
var theme = os == "AndroidOS" ? "md" : "ios";
if (document.location.search.indexOf('theme=') >= 0) {
theme = document.location.search.split('theme=')[1].split('&')[0];
}
app = new Framework7({
root: '#app',
theme: theme,
routes: [
{
path: '(.*)',
async: function (routeTo, routeFrom, resolve, reject) {
resolve({ url: routeTo.url });
}
}
],
on: {
pageInit: function (page) {
console.log('f7>page init');
}
}
});
var mainView = app.views.create('.view-main', {
stackPages: true
});
init();
connect();
},
methods: {
sendSence: function (id) {
var url = baseUrl + '/Command/Sence/?node=' + this.model.Number + '&id=' + id;
getJsonExt(url);
},
getDeviceDataValue: function (device, dataName) {
if (device != null) {
var data = _.first(_.filter(device.Data, function (o) { return o.Name === dataName }));
if (data != null) {
if (data.Value) {
var value = data.Value;
if (data.Unit) {
value += " " + data.Unit;
}
if (data.Description) {
value += " " + data.Description;
}
return value;
}
else {
console.log('值为空:' + device.Name + '/' + dataName);
}
}
else {
console.log('无法找到:' + device.Name + '/' + dataName);
}
}
else {
console.log('无法找到:' + dataName);
}
return "";
}
}
});
</script>
<script>
$(document).on('click', 'a.popup-open.node', function () {
var id = $(this).attr('data-node-id');
vm.node = _.chain(vm.model).filter(function (o) { return o.Id == id; }).first().value();
});
$(document).on('click', 'a.popup-open.device', function () {
var id = $(this).attr('data-device-id');
vm.device = _.chain(vm.node.Devices).filter(function (o) { return o.Id == id; }).first().value();
});
$$('.node-popup').on('popup:open', function (e, popup) {
console.log('node popup open');
});
$$('.node-popup').on('popup:close', function (e, popup) {
console.log('node popup close');
});
$$('.device-popup').on('popup:open', function (e, popup) {
console.log('device popup open');
});
$$('.device-popup').on('popup:close', function (e, popup) {
console.log('device popup close');
});
eval("new Vue({ el: '#app', data: { message: 'Hello Vue!' } });");
</script>
</body>
</html>
Loading…
Cancel
Save