//util function copy(from, to) { for (var attr in to) { if (from.hasOwnProperty(attr)) { if (!(from[attr] instanceof Array)) { to[attr] = from[attr]; } } } } //eval解析vue组件 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); if (model) { model.template = template; } else { console.error('eval error'); } return model; } //循环添加vue组件 function addVueComponents(cfg) { for (var i in cfg.list) { (function () { var item = cfg.list[i]; var url = cfg.prefix + item + '.html'; var path = url.substring(config.path.length); var name = path.substring(11, path.length - 5).replace(/\//g, "-"); Vue.component(name, function (resolve, reject) { axios.get(url, { headers: { 'Cache-Control': 'no-cache' } }).then(function (response) { resolve(parseModel(response)); }); }); })(); } } //获取设备数据 function getIoTData(device,name) { var data = Enumerable.from(device.data).where(o => o.name === name).firstOrDefault(); if (data) { return data['value'] + ' ' + data['unit'] + ' ' + data['description']; } return null; } function getIoTDataValue(device, name) { var data = Enumerable.from(device.data).where(o => o.name === name).firstOrDefault(); if (data) { return data['value']; } return null; }; function getIoTDataUnit(device, name) { var data = Enumerable.from(device.data).where(o => o.name === name).firstOrDefault(); if (data) { return data['unit']; } return null; } function getIoTDataDescription(device, name) { var data = Enumerable.from(device.data).where(o => o.name === name).firstOrDefault(); if (data) { return data['description']; } return null; } //调用API function execApi(number, method, query) { loading.show(); axios.post(config.service('platform/api/v1/api/execApi'), { connectionId, number, method, query }) .then(function (response) { }) .catch(function (error) { console.log(error); }) .finally(function () { loading.hide(); }); } //调用场景 function execScene(id) { loading.show(); axios.post(config.service('platform/api/v1/api/execScene'), { id, connectionId }) .then(function (response) { console.log(response); }) .catch(function (error) { console.log(error); }) .finally(function () { loading.hide(); }); } //更新列表项 function updateById(list, item) { var key = 'id'; 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; } } //移除列表项 function removeById(list, item) { var key = 'id'; for (var i = 0; i < list.length; i++) { if (list[i][key] === item[key]) { list.splice(i, 1); result = true; break; } } } //Signal 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); }); } } //pubsub批量订阅取消订阅 PubSub.subscribes = function (events, action) { if (!events || !action) { return; } for (var i = 0; i < events.length; i++) { PubSub.subscribe(events[i], function (m, d) { action(m, d); }); } } PubSub.unsubscribes = function (events) { if (!events) { return; } for (var i = 0; i < events.length; i++) { PubSub.unsubscribe(events[i]); } } //添加通用组件: addVueComponents({ prefix: config.file("components/views/shared/"), list: [ 'layout', 'nav', 'form', ] }); //添加设备组件: addVueComponents({ prefix: config.file("components/devices/"), list: [ 'gateway', 'humiture', 'light', 'infrared', 'smoke', 'switch1', 'socket', 'plug', 'curtain', 'door', 'lamp', 'camera', 'serialport', 'control', 'collector' ] }); //loading var loading = { show: function (msg) { $('#loadingToast').show(); }, hide: function () { $('#loadingToast').hide(); } }; //message: var connectionId; var connection = new signalR.HubConnectionBuilder().withUrl(config.service('platform/hub?group=page')).build(); connection.onclose(function () { console.log('connect closed'); connect(); }); connection.on('Connected', function (id) { connectionId = id; PubSub.publish('Connected'); }); connection.on("ServerToClient", function (method, message, to, from) { console.log(method); PubSub.publish(method, { message: message, to: to, from: from }); }); //connect(); //router: var routes = []; var home = config.file('components/views/areas/default/index.html'); var login = config.file('components/views/account/login.html'); const router = new VueRouter(); router.beforeEach((to, from, next) => { var url = to.path === '/' ? home : to.path; var name = url.substring(1, url.length - 5).replace(/\//g, "-"); var route = routes[name]; if (!route) { axios.get(url, { headers: { 'Cache-Control': 'no-cache' } }).then(function (response) { var model = parseModel(response); route = { name: name, path: to.path, component: model, meta: model.meta }; router.addRoutes([route]); routes[name] = route; router.push({ path: to.path, query: to.query }); }); } else { next(); } }); //vuex Vue.use(Vuex); const store = new Vuex.Store({ strict: true, state: { token: { accessToken: localStorage.getItem("accessToken"), refreshToken: localStorage.getItem("refreshToken") }, layout: null }, mutations: { set(state, data) { state[data.key] = data.value; }, login(state, data) { localStorage.setItem('accessToken', data.accessToken); localStorage.setItem('refreshToken', data.refreshToken); state.token.accessToken = data.accessToken; state.token.refreshToken = data.refreshToken; }, logout(state) { localStorage.removeItem('accessToken'); localStorage.removeItem('refreshToken'); state.token.accessToken = null; state.token.refreshToken = null; } } }); store.set = function (key, value) { store.commit('set', { key: key, value: value }); } //antd tree 点击内容展开子节点 $('body').on('click', '.ant-tree-node-content-wrapper', function () { $(this).parent('li').children('.ant-tree-switcher.ant-tree-switcher_close').click(); });