npm install --global vue-cli
vue init webpack mitweb
{
"koa": "2.0.0",
"koa-bodyparser": "3.2.0",
"koa-router": "7.0.0",
"ws":"4.1.0
","soap": "^0.27.1",
"vue": "^2.5.2",
"vue-router": "^3.0.1" ,
"axios": "^0.19.0",
"less": "^3.0.1",
"less-loader": "^4.1.0",
"echarts": "^4.2.1",
"element-ui": "^2.4.4",
}
{
"webservice":{
"ip":"http://192.168.101.87",
"port":"7722",
"wsdl":"webserviceName?wsdl"
}
}
const soap=require("soap");
const fs=require("fs");
let url="";
fs.readFile(__dirname+‘/app.json‘,‘utf-8‘,function(err,data){
if(err){
console.log(err);
}else{
let config=JSON.parse(data).webservice;
url=config.ip+":"+config.port+"/"+config.wsdl;
}
})
module.exports={
getwebservicedata:function (args){
console.log("start get webservice......");
console.log(url);
if(!url){
return {"errCode":400,"ret":"连接错误"}
}
return new Promise((resolve,reject)=>{
soap.createClient(url,function(err,client){
// console.log(client.describe());
if(!client || typeof client.doRequest!="function"){
reject("500 服务连接错误");
}
let params=JSON.stringify(args).toString();
try{
console.log(params);
client.doRequest({"parm":params},function(e,r){
if(e){
reject(e);
}else{
console.log("getdata");
let data=JSON.parse(r.result);
data.errCode=200;
// console.log(data);
resolve(data);
}
})
}catch(e){
console.log(e);
}
})
});
},
addArgs:function(args,obj){
//这里加了一个组合参数的方法,免得每次都写一遍,直接调用就行
if(!obj){
return args;
}
for(let o in obj){
args[o]=obj[o];
}
return args;
}
}
//patrol.js
const control=require(‘../control‘);
const getdata=control.getwebservicedata;
const addArgs=control.addArgs;
let getAllVIRouteInfo = async (ctx,next)=>{
let args={requestType:"GetAllVIRouteInfo"};
let result=await getdata(args);
ctx.response.status=result.errCode;
ctx.response.body=result;
};
let contrlRoute=async (ctx,next)=>{
let args={requestType:"ContrlRoute"};
args=addArgs(args,ctx.request.query);//加访问webservice的参数
let result=await getdata(args);
ctx.response.status=result.errCode;
ctx.response.body=result;
}
module.exports={
‘GET /action/GetAllVIRouteInfo‘:getAllVIRouteInfo,
‘GET /action/ContrlRoute‘:contrlRoute
}
// koa 入口文件
const fs=require(‘fs‘);
const Koa=require("koa");
const router=require("koa-router")();
const app=new Koa();
//处理 url 开始
// console.log(__dirname);
var files=fs.readdirSync(__dirname+‘/server/controllers‘);//读controllers目录下所有文件
var js_files=files.filter(f=>{
return f.endsWith(".js");
});//找所有js文件
//处理每个js文件
for(var f of js_files){
// console.log(`from controller: ${f}`);
//导入js文件
let mapping=require(__dirname+‘/server/controllers/‘+f);
for(var url in mapping){
// console.log(url);
if(url.startsWith(‘GET ‘)){
let path=url.substring(4);
router.get(path, mapping[url]);
}else if (url.startsWith(‘POST ‘)) {
// 如果url类似"POST xxx":
let path = url.substring(5);
router.post(path, mapping[url]);
console.log(`register URL mapping: POST ${path}`);
} else {
// 无效的URL:
console.log(`invalid URL: ${url}`);
}
}
}
//处理 url 结束
app.listen(9000);
app.use(router.routes());
console.log("koa is listening 9000");
//websocket
// 导入WebSocket模块:
const WebSocket = require(‘ws‘);
// 引用Server类:
const WebSocketServer = WebSocket.Server;
// 实例化:
const wss = new WebSocketServer({
port: 3000
});
var WebSocketEx=null;//暴露ws,供webservice中收到请求使用。
wss.on(‘connection‘, function (ws) {
console.log(`...前端连接websocket成功...`);
// ws.on(‘message‘, function (message) {
// console.log(` Received: ${message}`);
// });
WebSocketEx=ws;
});
//websocket 结束
//web端作为webservice服务器端
const soap=require("soap");
const http = require(‘http‘);
const web={};
web.wsdl = fs.readFileSync(‘static/webInterface.wsdl‘, ‘utf8‘);
web.server=null;
web.service={
doRequest:{
doRequest:{
patrol:function(params,cb,soapHeader){
// console.log("...后台来数据了,马上推送...");
let args={};
if(params.data){
if(params.data.$value){
args=JSON.parse(params.data.$value);
}else{
args=JSON.parse(params.data);
}
}else{
args=params;
}
if(!args.requestType || args.requestType!=="updateRouteState"){
return {result:‘400 No such interface‘};
}
console.log(args);
// console.log("............WebSocketEx............",WebSocketEx);
if(WebSocketEx!=null){//调用websocket服务端向前端推数据
WebSocketEx.send(`${JSON.stringify(args)}`, (err) => {
if (err) {
// console.log(`[SERVER] error: ${err}`);
console.log(` error: ${err}`);
}
});
}
return {result:‘200 ok‘};
}
}
}
}
web.server=http.createServer(function(request,response){
response.end(‘404: Not Found:‘+request.url);
});
web.server.listen(8285);
soap.listen(web.server,‘/doRequest‘,web.service,web.wsdl);
console.log("webservice sarted at port 8285");
import Vue from ‘vue‘
import App from ‘./App‘
import router from ‘./router‘
import axios from ‘axios‘
import elementUI from ‘element-ui‘
import ‘element-ui/lib/theme-chalk/index.css‘
Vue.config.productionTip = false
Vue.use(elementUI)
// axios.defaults.withCredentials=true;
Vue.prototype.$axios=axios;
/* eslint-disable no-new */
new Vue({
el: ‘#app‘,
router,
components: { App },
template: ‘<App/>‘
})
// router/index.js
import Vue from ‘vue‘
import Router from ‘vue-router‘
import index from ‘@/components/index‘
import banner from ‘@/components/banner‘
import patrol from ‘@/components/patrol/patrol‘
import baseconfig from ‘@/components/system/baseconfig‘
import sysconfig from ‘@/components/system/sysconfig‘
import sysmain from ‘@/components/system/sysmain‘
import camera from ‘@/components/condition/camera‘
import distuse from ‘@/components/condition/distuse‘
import patrolsuccess from ‘@/components/condition/patrolsuccess‘
import about from ‘@/components/about/about‘
Vue.use(Router)
export default new Router({
routes: [
{
path: ‘/‘,
name: ‘index‘,
component: banner,
children:[
{
path:‘/‘,
name:‘index‘,
component:index,
children:[
{
path:"/patrol",
alias:"",
component:patrol,
name:"巡视路线"
},
{
path:"/baseconfig",
component:baseconfig,
name:"基本配置"
},
{
path:"/sysconfig",
component:sysconfig,
name:"系统配置"
},
{
path:"/sysmain",
component:sysmain,
name:"系统维护"
},
{
path:"/camera",
component:camera,
name:"摄像机在线率"
},
{
path:"/distuse",
component:distuse,
name:"磁盘使用率"
},
{
path:"/patrolsuccess",
component:patrolsuccess,
name:"巡视成功率"
},
{
path:"/about",
component:about,
name:"关于"
}]
}
]
}
]
})
export default{
methods:{
getAllVIRouteInfo(){
let _this=this;
this.loading=true;
_this.$axios.get("action/GetAllVIRouteInfo/").then(res=>{
_this.loading=false;
let data=res.data;
// let data={
// routeInfo:[
// {routeCode:"200410000191",routeName:"#2主变高压侧",routeState:1,routeTime:"2018/9/5",routeType:"例行巡视",successRate:0},
// {routeCode:"200410000190000002",routeName:"#3主变高压侧",routeState:0,routeTime:"2018/9/6",routeType:"例行巡视",successRate:0},
// ]
// }
data.routeInfo.forEach(item=>{
if(item.routeState==0){
item.currentSuccessRate="未运行";
}else{
item.currentSuccessRate=Number(item.successRate);
}
})
this.tableData=data.routeInfo;
}).catch(err=>{
_this.loading=false;
_this.$message({
type: ‘error‘,
message: err,
showClose: true
});
})
},
}
}
export default{
methods:{
handleRoute(index,row,handle){
let _this=this;
// console.log(row);
let code=row.routeCode;
let par={
routeCode:code,
operationFlag:handle
}
this.$axios.get("action/ContrlRoute",{
params:{
routeCode:code,
operationFlag:handle
}
}).then(res=>{
let data=res.data;
if(data.ret==200){
_this.getAllVIRouteInfo();
_this.$message({
type: ‘success‘,
message: "操作成功!",
showClose: true
});
}
}).catch(err=>{
_this.$message({
type: ‘error‘,
message: err,
showClose: true
});
})
},
}
}
proxyTable: {
‘/action‘:{
target:"http://localhost:9000/",
changeOrigin:true,
}
},
import Vue from ‘vue‘;
export default {
name: ‘patrol‘,
data () {
return {
websocket:null,//websocket
address:"",//websocket地址端口号
tableData:[],//表格数据
tableHeight:(document.documentElement.clientHeight-100)<150?150:(document.documentElement.clientHeight-100),//表格高度
mytableStyle:{
"background":"#f1f1f1",
"color":"#333333"
},
loading:false,//表格是否显示加载...
wsNum:0,//记录重连次数
}
},
created(){
this.getAllVIRouteInfo();
this.address=window.location.hostname+":3000/";
this.initWebSocket();
},
methods:{
initWebSocket(){
var _this=this;
if(‘WebSocket‘ in window){
this.websocket=new WebSocket("ws://"+this.address);
}else if(‘MozWebSocket‘ in window){
this.websocket=new WebSocket("ws://"+this.address);
}else{
console.log("当前浏览器不支持websocket");
}
this.websocket.onopen = function () {
console.log("websock连接 状态 ",_this.websocket.readyState);
let reconnectTimer=null;
if(_this.websocket.readyState===0){
if(reconnectTimer){
clearTimeout(reconnectTimer);
}
reconnectTimer=setTimeout(function(){
_this.initWebSocket();
reconnectTimer=null;
},500);
}
if(_this.websocket.readyState===1){
console.log("websock连接成功");
}
};
this.websocket.onmessage = function (message) {
let data =JSON.parse(message.data);
_this.loading=false;
if(data.VIRouteInfo.length!=0) {
data.VIRouteInfo.forEach(item=>{
if(_this.tableData.length!=0){
_this.tableData.forEach((op,index)=>{
if(item.routeCode==op.routeCode){
if(item.routeSattion==1){
op.routeState=item.routeSattion;
op.successRate=item.successRate
op.currentSuccessRate=Number(item.successRate);
}else{
op.routeState=item.routeSattion;
op.successRate=item.successRate
op.currentSuccessRate="未运行";
}
Vue.set(_this.tableData,index,op);
}
})
}else{
_this.getAllVIRouteInfo();
if(item.routeSattion==1){
item.currentSuccessRate=Number(item.successRate);
}else{
item.currentSuccessRate="未运行";
}
_this.tableData.push(item);
}
})
}
}
this.websocket.onclose=function(event){
//断开重连
_this.reconnect();
}
},
//websocket重连
reconnect(){
let _this=this;
// console.log(`重连 ${_this.wsNum} 次`);
// if(this.wsNum>30){
// return false;
// }
this.wsNum++;
this.initWebSocket();
}
}
}
const path =require(‘path‘)
, serve = require(‘koa-static‘);
// 静态文件serve在koa-router的其他规则之上
app.use(serve(path.resolve(‘dist‘)));
tar zxvf node-v10.16.0.tar.gz
cd node-v
10.16.0
./configure
make
sudo make install
node -v
npm -v
原文:https://www.cnblogs.com/huijihuijidahuiji/p/89f13e98413184d0d3a60b5bfeed5c2c.html