Former-commit-id: f00e2b4ea44c437cd7e05b277278d7f8da267c09
Former-commit-id: b5901f80d8962fa36dc1334528ce8988e2d520e9
1.0
wanggang 5 years ago
parent 5e37daef12
commit 80967a2813

@ -43,6 +43,11 @@ namespace Platform.Controllers
return View(); return View();
} }
public IActionResult Test()
{
return View();
}
public IActionResult Building(HomeModel model) public IActionResult Building(HomeModel model)
{ {
var userOrganId = User.GetOrganId().Value;//当前用户机构Id var userOrganId = User.GetOrganId().Value;//当前用户机构Id

@ -17,4 +17,10 @@
<ProjectReference Include="..\Infrastructure\Infrastructure.csproj" /> <ProjectReference Include="..\Infrastructure\Infrastructure.csproj" />
<ProjectReference Include="..\IoT.Shared\IoT.Shared.csproj" /> <ProjectReference Include="..\IoT.Shared\IoT.Shared.csproj" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<Content Update="wwwroot\js\iot.js">
<ExcludeFromSingleFile>true</ExcludeFromSingleFile>
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
</Content>
</ItemGroup>
</Project> </Project>

@ -67,58 +67,3 @@
<div> <div>
<h1>此处显示设备种类、数量的统计信息,显示定时器和触发器的统计信息,考虑按机构显示</h1> <h1>此处显示设备种类、数量的统计信息,显示定时器和触发器的统计信息,考虑按机构显示</h1>
</div> </div>
@section scripts{
<script>
var baseUrl = '@Url.Content("~")';
var hubUrl = "@Url.Content("~")/hub?group=page";
var onMessage = null;
</script>
<script src="~/js/util.js"></script>
<script src="~/js/iot.js"></script>
<script src="~/js/message.js"></script>
<script>
var app = new Vue({
el: '#app',
data: function () {
return {
title: "产品",
url: '/api/v1/product/getProducts',
products: [],
scenes: []
};
},
mounted: function () {
connect();
this.load();
},
methods: {
load: function () {
var vm = this;
axios.post(baseUrl + '/api/v1/product/getProducts').then(function (response) {
vm.products = response.data;
});
axios.post(baseUrl + '/api/v1/Scene/GetScenes').then(function (response) {
vm.scenes = response.data;
});
}
}
});
onMessage = function (method, json, to, from) {
var item = JSON.parse(json);
if (method === 'IoTProductEntityInserted' ||
method === 'IoTProductEntityUpdated' ||
method === 'IoTProductEntityDeleted' ||
method === 'IoTDeviceEntityInserted' ||
method === 'IoTDeviceEntityDeleted') {
app.load();
}
else if (method === 'IoTSceneEntityInserted' ||
method === 'IoTSceneEntityUpdated' ||
method === 'IoTSceneEntityDeleted') {
if (item.nodeId === null) {
app.load();
}
}
}
</script>
}

@ -0,0 +1,23 @@
@section scripts{
<script>
config.group = "page";
var model = {a:'123'};
const app = new Vue({
el: '#app',
data: {
model: model
},
mounted : function () {
if (!this.model) {
this.load();
}
alert(this.model);
},
methods:{
load: function () {
this.model = { a: '456' };
}
}
});
</script>
}

@ -185,7 +185,18 @@
<script src="~/lib/element-ui/index.min.js"></script> <script src="~/lib/element-ui/index.min.js"></script>
<script src="~/lib/element-ui/locale/zh-CN.min.js"></script> <script src="~/lib/element-ui/locale/zh-CN.min.js"></script>
@*<script src="~/lib/ant-design-vue/antd.min.js"></script>*@ @*<script src="~/lib/ant-design-vue/antd.min.js"></script>*@
<script>
var config = {
baseUrl : '@Url.Content("~")',
hubUrl : "@Url.Content("~")/hub?group=page"
}
</script>
<script src="~/js/common.js"></script>
<script src="~/js/components.js"></script>
<script src="~/js/form.js"></script>
<script src="~/js/iot.js"></script>
@RenderSection("scripts", required: false) @RenderSection("scripts", required: false)
<script src="~/js/site.js" asp-append-version="true"></script> <script src="~/js/site.js" asp-append-version="true"></script>
</body> </body>
</html> </html>

@ -0,0 +1,190 @@
Vue.prototype.debug = config.debug;
Vue.prototype.isMobile = config.isMobile;
Vue.prototype.baseUrl = config.baseUrl;
Vue.prototype.uploadUrl = config.uploadUrl;
function vueComponent(name, url) {
Vue.component(name, function (resolve, reject) {
axios.get(url).then(function (response) {
resolve(parseModel(response));
});
});
}
function parseModel(response) {
var html = new DOMParser().parseFromString(response.data, 'text/html');
var template = html.getElementsByTagName('template')[0].innerHTML;
var script = html.getElementsByTagName('script')[0].innerHTML;
script = '(' + script.replace(/^\s*export\s*default\s*/, '').replace(/;?\s*$/, '') + ')\n//# sourceURL=' + response.config.url;
var model = eval(script);
model.template = template;
return model;
}
//update
function updateById(list, item) {
return update(list, item, 'id');
}
function updateByNumber(list, item) {
return update(list, item, 'number');
}
function updateByKey(list, item) {
return update(list, item, 'key');
}
function update(list, item, key) {
key = key || 'number';
var result = false;
var to = Enumerable.from(list).where(function (o) { return o[key] === item[key]; }).firstOrDefault();
if (to) {
copy(item, to);
}
else {
list.push(item);
result = true;
}
//console.log(result ? 'insert' : 'update' + ' data by ' + key);
return result;
}
//delete
function removeById(list, item) {
return remove(list, item, 'id');
}
function removeByKey(list, item) {
return remove(list, item, 'key');
}
function remove(list, item, key) {
var result = false;
for (var i = 0; i < list.length; i++) {
if (list[i][key] === item[key]) {
list.splice(i, 1);
result = true;
break;
}
}
return result;
}
//util
function copy(from, to) {
for (var attr in to) {
if (from.hasOwnProperty(attr)) {
if (!(from[attr] instanceof Array)) {
to[attr] = from[attr];
}
}
}
}
function subscribe(events, action) {
if (!events || !action) {
return;
}
for (var i = 0; i < events.length; i++) {
PubSub.subscribe(events[i], function (m, d) { action(m, d); });
}
}
function unsubscribe(events) {
if (!events) {
return;
}
for (var i = 0; i < events.length; i++) {
PubSub.unsubscribe(events[i]);
}
}
//
function nodePower(number, command) {
loading.show();
axios.post('/platform/api/v1/node/power' + command, '"' + number + '"', { headers: { 'Content-Type': 'application/json;charset=UTF-8' } })
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
})
.finally(function () {
loading.hide();
});
}
function nodeMethod(number, method) {
loading.show();
axios.post('/platform/api/v1/node/' + method, '"' + number + '"', { headers: { 'Content-Type': 'application/json;charset=UTF-8' } })
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
})
.finally(function () {
loading.hide();
});
}
//
function selectNode(e) {
var checkbox = $(e.target);
if (checkbox.hasClass('checkall')) {
if (e.target.checked) {
$('input.item:visible').not(':checked').prop("checked", true);
}
else {
$('input.item:visible').filter(':checked').prop("checked", false);
}
}
else if (checkbox.hasClass('uncheck')) {
$('input.item:visible').each(function () {
$(this).prop("checked", !$(this).prop("checked")).change();
});
}
var parent = $('input.checkall');
if ($('input.item').not(':checked').length === 0) {
parent.prop("indeterminate", false);
parent.prop("checked", true);
}
else if ($('input.item').filter(':checked').length === 0) {
parent.prop("indeterminate", false);
parent.prop("checked", false);
}
else {
parent.prop("indeterminate", true);
}
}
//batch select
$(function () {
$(document).on('change', 'th :checkbox', function () {
if ($(this).is(':checked')) {
$(this).parents('table').find(':checkbox').not(':checked').prop("checked", true);
}
else {
$(this).parents('table').find(':checkbox').filter(':checked').prop("checked", false);
}
});
$(document).on('change', 'td :checkbox', function () {
var parent = $(this).parents('table').find('th :checkbox');
var children = $(this).parents('table').find('td :checkbox');
if ($(this).is(':checked')) {
if (parent.not(':checked')) {
if (children.not(':checked').length === 0) {
parent.prop("indeterminate", false);
parent.prop("checked", true);
}
else {
parent.prop("indeterminate", true);
}
}
}
else {
if (parent.is(':checked')) {
if (children.filter(':checked').length === 0) {
parent.prop("indeterminate", false);
parent.prop("checked", false);
}
else {
parent.prop("indeterminate", true);
}
}
}
});
});

@ -0,0 +1,25 @@
Vue.component('pagination', function (resolve, reject) {
axios.get("components/shared/pagination.html").then(function (response) {
resolve(parseModel(response));
});
});
Vue.component('layout', function (resolve, reject) {
axios.get("components/shared/layout.html").then(function (response) {
resolve(parseModel(response));
});
});
Vue.component('list', function (resolve, reject) {
axios.get("components/shared/list.html").then(function (response) {
resolve(parseModel(response));
});
});
Vue.component('display', function (resolve, reject) {
axios.get("components/shared/display.html").then(function (response) {
resolve(parseModel(response));
});
});
Vue.component('update', function (resolve, reject) {
axios.get("components/shared/update.html").then(function (response) {
resolve(parseModel(response));
});
});

@ -0,0 +1,26 @@
var formComponents = [
'display-string',
'display-boolean',
'display-imageurl',
'display-integer',
'display-selectlist',
'display-multiselectlist',
'display-multilinetext',
'display-html',
'display-cron',
'edit-string',
'edit-password',
'edit-boolean',
'edit-imageurl',
'edit-integer',
'edit-selectlist',
'edit-multiselectlist',
'edit-multilinetext',
'edit-html',
'edit-cron',
];
for (var i = 0; i < formComponents.length; i++) {
var name = formComponents[i];
var url = "components/shared/" + name.replace('-', '/') + ".html";
vueComponent(name, url);
}

@ -1,123 +1,154 @@
var time = '1d'; Vue.prototype.getDeviceDataValue = function (device, name) {
if(window.WXInlinePlayer&&WXInlinePlayer.isSupport()) {
WXInlinePlayer.init({
asmUrl: baseUrl+'/lib/WXInlinePlayer/prod.all.asm.combine.js',
wasmUrl: baseUrl +'/lib/WXInlinePlayer/prod.all.wasm.combine.js'
});
}
function getDeviceDataValue(device, name) {
var data = Enumerable.from(device.data).where(o => o.name === name).firstOrDefault(); var data = Enumerable.from(device.data).where(o => o.name === name).firstOrDefault();
if (data) { if (data) {
return data['value']; return data['value'];
} }
return null; return null;
} };
function getDeviceDataDescription(device, name) {
Vue.prototype.getDeviceDataDescription = function (device, name) {
var data = Enumerable.from(device.data).where(o => o.name === name).firstOrDefault(); var data = Enumerable.from(device.data).where(o => o.name === name).firstOrDefault();
if (data) { if (data) {
return data['description']; return data['description'];
} }
return null; return null;
} }
function getDeviceDataUnit(device, name) { Vue.prototype.getDeviceDataUnit = function (device, name) {
var data = Enumerable.from(device.data).where(o => o.name === name).firstOrDefault(); var data = Enumerable.from(device.data).where(o => o.name === name).firstOrDefault();
if (data) { if (data) {
return data['unit']; return data['unit'];
} }
return null; return null;
} }
function getDeviceData(device, name) { Vue.prototype.getDeviceData = function (device, name) {
var data = Enumerable.from(device.data).where(o => o.name === name).firstOrDefault(); var data = Enumerable.from(device.data).where(o => o.name === name).firstOrDefault();
if (data) { if (data) {
return data['value'] + ' ' + data['unit']; return data['value'] + ' ' + data['unit'];
} }
return null; return null;
} }
function getData(device, name) { Vue.prototype.getData = function (device, name) {
return Enumerable.from(device.data).where(o => o.name === name).firstOrDefault(); return Enumerable.from(device.data).where(o => o.name === name).firstOrDefault();
} }
Vue.prototype.execApi = function (number, method, query) {
loading.show();
axios.post(config.baseUrl + '/platform/api/v1/api/execApi', { connectionId, number, method, query })
.then(function (response) {
})
.catch(function (error) {
console.log(error);
})
.finally(function () {
loading.hide();
});
}
Vue.prototype.execScene = function (id) {
loading.show();
axios.post('/platform/api/v1/api/execScene', '"' + id + '"', { headers: { 'Content-Type': 'application/json;charset=UTF-8' } })
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
})
.finally(function () {
loading.hide();
});
}
Vue.prototype.execOrganScene = function (id) {
loading.show();
axios.post('/platform/api/v1/api/execOrganScene', '"' + id + '"', { headers: { 'Content-Type': 'application/json;charset=UTF-8' } })
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
})
.finally(function () {
loading.hide();
});
}
//devices //devices
function parseModel(response) { var iotComponents = [
var html = new DOMParser().parseFromString(response.data, 'text/html'); 'gateway',
var template = html.getElementsByTagName('template')[0].innerHTML; 'light',
var script = html.getElementsByTagName('script')[0].innerHTML; 'humiture',
var model = eval(script); 'smoke',
model.template = template; 'person',
return model; 'curtain',
'switch',
'switch3',
'socket',
'ir',
'color-light',
'door',
'camera',
'serial-port',
'ir-command'
];
for (var i = 0; i < iotComponents.length; i++) {
var name = 'iot-' + iotComponents[i];
var url = "components/iot/" + iotComponents[i] + ".html";
vueComponent(name, url);
} }
function urlContent(path) { var deviceInfo = [];
if (!path.startsWith("/dfs/")) { deviceInfo['网关'] = 'iot-gateway';
return baseUrl + path; deviceInfo['光强检测器'] = 'iot-light';
deviceInfo['温湿度传感器'] = 'iot-humiture';
deviceInfo['烟雾报警器'] = 'iot-smoke';
deviceInfo['人体感应器'] = 'iot-person';
deviceInfo['窗帘电机'] = 'iot-curtain';
deviceInfo['一路开关'] = 'iot-switch';
deviceInfo['三路开关'] = 'iot-switch3';
deviceInfo['插座'] = 'iot-socket';
deviceInfo['智能插座'] = 'iot-socket';
deviceInfo['红外转发器'] = 'iot-ir';
deviceInfo['调色灯'] = 'iot-color-light';
deviceInfo['门锁'] = 'iot-door';
deviceInfo['摄像头'] = 'iot-camera';
deviceInfo['串口控制器'] = 'iot-serial-port';
///
function updateSelect(action, id, value) {
var select = $('select#' + id);
if (select.length) {
select.find("option[value!='']").remove();
select[0].dispatchEvent(new Event('change'));
if (value) {
var url = config.baseUrl + '/platform/IoTCenter/Ajax/' + action + '?parentId=' + value;
$.getJSON(url, function (data) {
$.each(data, function (i, v) {
select.append('<option value="' + v.value + '">' + v.text + '</option>');
});
});
}
} }
return path;
} }
Vue.component('iot-gateway', function (resolve, reject) { $(document).on('change', 'select#productId', function (e) {
axios.get(baseUrl+"/pages/iot/device/gateway.html").then(function (response) { var value = $(this).val();
resolve(parseModel(response)); updateSelect('getProductApiJson', 'apiId', value);
});
});
Vue.component('iot-light', function (resolve, reject) {
axios.get(baseUrl+"/pages/iot/device/light.html").then(function (response) {
resolve(parseModel(response));
});
});
Vue.component('iot-humiture', function (resolve, reject) {
axios.get(baseUrl+"/pages/iot/device/humiture.html").then(function (response) {
resolve(parseModel(response));
});
});
Vue.component('iot-smoke', function (resolve, reject) {
axios.get(baseUrl+"/pages/iot/device/smoke.html").then(function (response) {
resolve(parseModel(response));
});
}); });
Vue.component('iot-person', function (resolve, reject) { $(document).on('change', 'select#nodeId', function (e) {
axios.get(baseUrl+"/pages/iot/device/person.html").then(function (response) { var value = $(this).val();
resolve(parseModel(response)); updateSelect('getDeviceJson', 'deviceId', value);
}); updateSelect('getCommandJson', 'commandId', value);
}); if ($(this).parents('form.GlobalSceneCommand').length === 0) {
Vue.component('iot-curtain', function (resolve, reject) { updateSelect('getSceneJson', 'sceneId', value);
axios.get(baseUrl+"/pages/iot/device/curtain.html").then(function (response) { }
resolve(parseModel(response));
});
});
Vue.component('iot-switch', function (resolve, reject) {
axios.get(baseUrl+"/pages/iot/device/switch.html").then(function (response) {
resolve(parseModel(response));
});
});
Vue.component('iot-switch3', function (resolve, reject) {
axios.get(baseUrl+"/pages/iot/device/switch3.html").then(function (response) {
resolve(parseModel(response));
});
});
Vue.component('iot-socket', function (resolve, reject) {
axios.get(baseUrl+"/pages/iot/device/socket.html").then(function (response) {
resolve(parseModel(response));
});
});
Vue.component('iot-ir', function (resolve, reject) {
axios.get(baseUrl+"/pages/iot/device/ir.html").then(function (response) {
resolve(parseModel(response));
});
});
Vue.component('iot-color-light', function (resolve, reject) {
axios.get(baseUrl+"/pages/iot/device/color-light.html").then(function (response) {
resolve(parseModel(response));
});
}); });
Vue.component('iot-door', function (resolve, reject) { $(document).on('change', 'select#deviceNodeId', function (e) {
axios.get(baseUrl + "/pages/iot/device/door.html").then(function (response) { var value = $(this).val();
resolve(parseModel(response)); updateSelect('getDeviceJson', 'deviceId', value);
});
}); });
Vue.component('iot-camera', function (resolve, reject) { $(document).on('change', 'select#deviceId', function (e) {
axios.get(baseUrl+"/pages/iot/device/camera.html").then(function (response) { var value = $(this).val();
resolve(parseModel(response)); updateSelect('getApiJson', 'apiId', value);
}); updateSelect('getDataJson', 'dataId', value);
}); });
Vue.component('iot-serial-port', function (resolve, reject) { $(document).on('change', 'select#organId', function (e) {
axios.get(baseUrl+"/pages/iot/device/serial-port.html").then(function (response) { var value = $(this).val();
resolve(parseModel(response)); updateSelect('GetOrganSceneJson', 'organSceneId', value);
}); updateSelect('GetOrganNodeJson', 'nodeId', value);
}); });
//$(document).on('change', 'select', function (e) {
// $(this).parents('form').find("button[type='submit']").click();
//});

@ -0,0 +1,27 @@
var hubUrl = config.baseUrl + '/platform/hub?group='+config.gorup||'group';
var connection = new signalR.HubConnectionBuilder().withUrl(hubUrl).build();
var connectionId;
function connect() {
if (connection.state === signalR.HubConnectionState.Disconnected) {
connection.start().then(function () {
console.log('signalr connected');
}).catch(function (err) {
console.log(err);
setTimeout(connect, 5000);
});
}
}
connection.onclose(function () {
console.log('connect closed');
connect();
});
connection.on('Connected', function (id) {
connectionId = id;
});
connection.on("ServerToClient", function (method, message, to, from) {
PubSub.publish(method, { message: message, to: to, from: from });
});
connect();
Loading…
Cancel
Save