Commit 8f739a8a by 潘建波

修改展示页 上线环境IP

1 parent 91972a43
...@@ -16,7 +16,7 @@ export default { ...@@ -16,7 +16,7 @@ export default {
} }
let token = localStorage.getItem("atoken"); let token = localStorage.getItem("atoken");
if (!token) { if (!token) {
alert('errtoken') console.log('errtoken')
this.$router.push("/login"); this.$router.push("/login");
} }
}, },
......
...@@ -10,7 +10,7 @@ switch (process.env.NODE_ENV) { ...@@ -10,7 +10,7 @@ switch (process.env.NODE_ENV) {
baseUrl = "https://pre-server.feleti.cn"; // 预上线环境url baseUrl = "https://pre-server.feleti.cn"; // 预上线环境url
break; break;
case "production": case "production":
baseUrl = "http://192.168.9.133:20080"; // 生产环境url baseUrl = "http://vion-panda.51vip.biz:52510"; // 生产环境url
break; break;
} }
......
import api from '../index' import api from "../index";
import baseUrl from '../baseUrl' import baseUrl from "../baseUrl";
export default { export default {
devs(params){ devs(params) {
return api.get(`${baseUrl}/api/v1/devconf_fx/devs`, params) return api.get(`${baseUrl}/api/v1/devconf_fx/devs`, params);
}, },
treeList(params,id) { treeList(params, id) {
return api.get(`${baseUrl}/api/v1/devconf_fx/devs/${id}/vchan_struct`, params) return api.get(
}, `${baseUrl}/api/v1/devconf_fx/devs/${id}/vchan_struct`,
getVideoList(params,id) { params
return api.get(`${baseUrl}/api/v1/devconf_fx/devs/${id}/vchans`, params) );
}, },
addCode(params,id) { getVideoList(params, id) {
return api.post(`${baseUrl}/api/v1/codes/custom/cates/${id}/codes`, params) return api.get(`${baseUrl}/api/v1/devconf_fx/devs/${id}/vchans`, params);
}, },
addNode(params,id){ addCode(params, id) {
return api.post(`${baseUrl}/api/v1/org`, params) return api.post(`${baseUrl}/api/v1/codes/custom/cates/${id}/codes`, params);
}, },
getCode(params,id){ addNode(params, id) {
return api.get(`${baseUrl}/api/v1/codes/custom/cates/${id}/codes`, params) return api.post(`${baseUrl}/api/v1/org`, params);
}, },
editCamera(params,id,unid){ getCode(params, id) {
return api.post(`${baseUrl}/api/v1/codes/custom/cates/${id}/codes/${unid}`, params) return api.get(`${baseUrl}/api/v1/codes/custom/cates/${id}/codes`, params);
}, },
delCode(params,id,unid){ editCamera(params, id, unid) {
return api.delete(`${baseUrl}/api/v1/codes/custom/cates/${id}/codes/${unid}`, params) return api.post(
}, `${baseUrl}/api/v1/codes/custom/cates/${id}/codes/${unid}`,
delOrg(params,id){ params
return api.delete(`${baseUrl}/api/v1/org/${id}`, params) );
}, },
delCamera(params,id,id2){ delCode(params, id, unid) {
return api.delete(`${baseUrl}/api/v1/devconf_fx/devs/${id}/vchans/${id2}`, params) return api.delete(
}, `${baseUrl}/api/v1/codes/custom/cates/${id}/codes/${unid}`,
getCameraTable(params,id,id2){ params
console.log(id2) );
if(id2){ },
return api.get(`${baseUrl}/api/v1/devconf_fx/devs/${id}/vchans/${id2}`, params) delOrg(params, id) {
}else{ return api.delete(`${baseUrl}/api/v1/org/${id}`, params);
return api.get(`${baseUrl}/api/v1/devconf_fx/devs/${id}/vchans`, params) },
delCamera(params, id, id2) {
return api.delete(
`${baseUrl}/api/v1/devconf_fx/devs/${id}/vchans/${id2}`,
params
);
},
getCameraTable(params, id, id2) {
console.log(id2);
if (id2) {
return api.get(
`${baseUrl}/api/v1/devconf_fx/devs/${id}/vchans/${id2}`,
params
);
} else {
return api.get(`${baseUrl}/api/v1/devconf_fx/devs/${id}/vchans`, params);
} }
}, },
editVideo(params,id,id2){ editVideo(params, id, id2) {
return api.post(`${baseUrl}/api/v1/devconf_fx/devs/${id}/vchans/${id2}`, params) return api.post(
}, `${baseUrl}/api/v1/devconf_fx/devs/${id}/vchans/${id2}`,
editCamera(params,id,id2){ params
return api.post(`${baseUrl}/api/v1/devconf_fx/devs/${id}/vchans/${id2}`, params) );
},
uploadFile(params,id){
return api.post(`${baseUrl}/api/v1/devconf_fx/devs/${id}/vfile_vchans`, params,{'Content-Type': 'multipart/form-data'})
},
getResource(params,id){
return api.get(`${baseUrl}/api/v1/devconf_fx/devs/${id}/status`, params)
},
getDevsName(params,id){
return api.get(`${baseUrl}/api/v1/devconf_fx/devs/${id}/fx_devs`, params)
},
getStoreConList(params){
return api.get(`${baseUrl}/api/v1/devconf_fx/store_confs`, params)
},
uploadStore(params){
return api.post(`${baseUrl}/api/v1/devconf_fx/store_confs`, params,{'Content-Type': 'multipart/form-data'})
},
getSubTask(params,id){
return api.get(`${baseUrl}/api/v1/devconf_fx/tasks/${id}/subtasks`, params)
},
delStore(params,id){
return api.delete(`${baseUrl}/api/v1/devconf_fx/store_confs/${id}`, params)
}, },
getsip(params,id,id2){ addCamera(params, id) {
return api.get(`${baseUrl}/api/v1/devconf_fx/devs/${id}/${id2}/sip_server`, params) return api.post(`${baseUrl}/api/v1/devconf_fx/devs/${id}/vchans`, params);
}, },
addSip(params,id,id2){ editCamera(params, id, id2) {
return api.post(`${baseUrl}/api/v1/devconf_fx/devs/${id}/${id2}/sip_server`, params) return api.post(
`${baseUrl}/api/v1/devconf_fx/devs/${id}/vchans/${id2}`,
params
);
}, },
editSip(params,id,id2,id3){ uploadFile(params, id) {
return api.post(`${baseUrl}/api/v1/devconf_fx/devs/${id}/${id2}/${id3}/sip_server`, params) return api.post(
`${baseUrl}/api/v1/devconf_fx/devs/${id}/vfile_vchans`,
params,
{ "Content-Type": "multipart/form-data" }
);
}, },
delSip(params,id,id2,id3){
return api.delete(`${baseUrl}/api/v1/devconf_fx/devs/${id}/${id2}/${id3}/sip_server`, params)
getResource(params, id) {
return api.get(`${baseUrl}/api/v1/devconf_fx/devs/${id}/status`, params);
},
getDevsName(params, id) {
return api.get(`${baseUrl}/api/v1/devconf_fx/devs/${id}/fx_devs`, params);
},
getStoreConList(params) {
return api.get(`${baseUrl}/api/v1/devconf_fx/store_confs`, params);
},
uploadStore(params) {
return api.post(`${baseUrl}/api/v1/devconf_fx/store_confs`, params, {
"Content-Type": "multipart/form-data"
});
},
getSubTask(params, id) {
return api.get(`${baseUrl}/api/v1/devconf_fx/tasks/${id}/subtasks`, params);
},
delStore(params, id) {
return api.delete(`${baseUrl}/api/v1/devconf_fx/store_confs/${id}`, params);
},
getsip(params, id, id2) {
return api.get(
`${baseUrl}/api/v1/devconf_fx/devs/${id}/${id2}/sip_server`,
params
);
},
addSip(params, id, id2) {
return api.post(
`${baseUrl}/api/v1/devconf_fx/devs/${id}/${id2}/sip_server`,
params
);
},
editSip(params, id, id2, id3) {
return api.post(
`${baseUrl}/api/v1/devconf_fx/devs/${id}/${id2}/${id3}/sip_server`,
params
);
},
delSip(params, id, id2, id3) {
return api.delete(
`${baseUrl}/api/v1/devconf_fx/devs/${id}/${id2}/${id3}/sip_server`,
params
);
} }
}
\ No newline at end of file \ No newline at end of file
};
...@@ -170,7 +170,7 @@ ...@@ -170,7 +170,7 @@
if(this.type == 'add'){ if(this.type == 'add'){
this.$refs['cameraDialog'].validate((valid) => { this.$refs['cameraDialog'].validate((valid) => {
if (valid) { if (valid) {
this.$api.resource.addCamera(this.addVideoParam,this.devsId).then(res=>{ this.$api.resource.addCamera(this.addVideoParam,localStorage.getItem('dev_unid')).then(res=>{
if(res.ecode==200){ if(res.ecode==200){
this.$message({ this.$message({
message: res.enote, message: res.enote,
......
...@@ -6,11 +6,19 @@ ...@@ -6,11 +6,19 @@
width="1100px" width="1100px"
:before-close="beforeHideModal" :before-close="beforeHideModal"
> >
<TraficCanvas :bgUrl='bgUrl' v-if="type=='0' || type=='5'" ref='canvas'></TraficCanvas> <TraficCanvas
<FlowCanvas :bgUrl='bgUrl' v-if="type=='1'" ref='canvas'></FlowCanvas> :bgUrl="bgUrl"
<SafeCanvas :bgUrl='bgUrl' v-if="type=='2'" ref='canvas'></SafeCanvas> v-if="type == '0' || type == '5' || type == '3'"
<FaceCanvas :bgUrl='bgUrl' v-if="type=='4'" ref='canvas'></FaceCanvas> ref="canvas"
<ComplexCanvas :bgUrl='bgUrl' v-if="type=='7'" ref='canvas'></ComplexCanvas> ></TraficCanvas>
<FlowCanvas :bgUrl="bgUrl" v-if="type == '1'" ref="canvas"></FlowCanvas>
<SafeCanvas :bgUrl="bgUrl" v-if="type == '2'" ref="canvas"></SafeCanvas>
<FaceCanvas :bgUrl="bgUrl" v-if="type == '4'" ref="canvas"></FaceCanvas>
<ComplexCanvas
:bgUrl="bgUrl"
v-if="type == '7'"
ref="canvas"
></ComplexCanvas>
<span slot="footer" class="dialog-footer"> <span slot="footer" class="dialog-footer">
<el-button @click="beforeHideModal">取 消</el-button> <el-button @click="beforeHideModal">取 消</el-button>
<el-button type="primary" @click="save">确 定</el-button> <el-button type="primary" @click="save">确 定</el-button>
...@@ -19,23 +27,23 @@ ...@@ -19,23 +27,23 @@
</div> </div>
</template> </template>
<script> <script>
import TraficCanvas from "./areaconfig/TraficCanvas"; import TraficCanvas from "./areaconfig/TraficCanvas";
import FlowCanvas from "./areaconfig/FlowCanvas"; import FlowCanvas from "./areaconfig/FlowCanvas";
import SafeCanvas from "./areaconfig/SafeCanvas"; import SafeCanvas from "./areaconfig/SafeCanvas";
import FaceCanvas from "./areaconfig/FaceCanvas"; import FaceCanvas from "./areaconfig/FaceCanvas";
import ComplexCanvas from "./areaconfig/ComplexCanvas"; import ComplexCanvas from "./areaconfig/ComplexCanvas";
export default { export default {
data() { data() {
return { return {
dialogVisible: false, dialogVisible: false,
isShow: false, isShow: false,
type: '0', type: "0",
btnIsactive: false, btnIsactive: false,
showClose: false, showClose: false,
roiBody: {}, roiBody: {},
XMLStr: "", XMLStr: "",
taskData:'', taskData: "",
bgUrl:'' bgUrl: ""
}; };
}, },
components: { components: {
...@@ -46,27 +54,35 @@ export default { ...@@ -46,27 +54,35 @@ export default {
ComplexCanvas ComplexCanvas
}, },
methods: { methods: {
showModal: function(data,mtaskdata) { showModal: function(data, mtaskdata) {
var _this = this; var _this = this;
this.$store.commit('setocxstate',0) this.$store.commit("setocxstate", 0);
this.taskData = mtaskdata; this.taskData = mtaskdata;
this.dialogVisible =true; this.dialogVisible = true;
this.type = data.algo_type; this.type = data.algo_type;
// this.type = 2; // this.type = 2;
this.bgUrl = ""; this.bgUrl = "";
//获取视频截图 //获取视频截图
this.$api.task.cutpic(mtaskdata.vchan.vdev_unid, mtaskdata.vchan.vchan_refid,mtaskdata.subtask_id).then(data => { this.$api.task
.cutpic(
mtaskdata.vchan.vdev_unid,
mtaskdata.vchan.vchan_refid,
mtaskdata.subtask_id
)
.then(data => {
if (!data.ecode) { if (!data.ecode) {
this.bgUrl = "data:image/png;base64," + data.pic_base64; this.bgUrl = "data:image/png;base64," + data.pic_base64;
setTimeout(() => { setTimeout(() => {
let img = document.getElementById('pic').childNodes[0] let img = document.getElementById("pic").childNodes[0];
let canvas = document.createElement("canvas"); let canvas = document.createElement("canvas");
canvas.width = 800; canvas.width = 800;
canvas.height = 500; canvas.height = 500;
try { try {
canvas.getContext("2d").drawImage(img, 0, 0, 800, 500); canvas.getContext("2d").drawImage(img, 0, 0, 800, 500);
_this.bgUrl = canvas.toDataURL("image/webp"); _this.bgUrl = canvas.toDataURL("image/webp");
} catch (error) {} } catch (error) {
console.log(error);
}
}, 500); }, 500);
} else { } else {
alert("区域设置截图失败!" + data.enote); alert("区域设置截图失败!" + data.enote);
...@@ -78,14 +94,12 @@ export default { ...@@ -78,14 +94,12 @@ export default {
setTimeout(() => { setTimeout(() => {
_this.$refs.canvas.stageInit(); _this.$refs.canvas.stageInit();
if (data.rois) { if (data.rois) {
_this.$refs.canvas.configInit( _this.$refs.canvas.configInit(data.rois[0].roi);
data.rois[0].roi
);
} }
}, 300); }, 300);
}, },
beforeHideModal: function() { beforeHideModal: function() {
this.$store.commit('setocxstate',1) this.$store.commit("setocxstate", 1);
this.dialogVisible = false; this.dialogVisible = false;
this.$refs.canvas.clear(); this.$refs.canvas.clear();
this.$refs.canvas.cindex = 0; this.$refs.canvas.cindex = 0;
...@@ -101,11 +115,12 @@ export default { ...@@ -101,11 +115,12 @@ export default {
this.btnIsactive = true; this.btnIsactive = true;
try { try {
this.EditList(1); this.EditList(1);
} catch (error) {} } catch (error) {
console.log(error);
}
}, },
save: function() { save: function() {
if (this.$refs.canvas.roadFlag === false) { if (this.$refs.canvas.roadFlag === false) {
this.$alert("车道线有修改,请检查车道属性是否正确", "提示", { this.$alert("车道线有修改,请检查车道属性是否正确", "提示", {
confirmButtonText: "确定" confirmButtonText: "确定"
}); });
...@@ -125,8 +140,6 @@ export default { ...@@ -125,8 +140,6 @@ export default {
this.beforeHideModal(); this.beforeHideModal();
} }
} }
} };
</script> </script>
<style lang="stylus" scoped> <style lang="stylus" scoped></style>
</style>
...@@ -2305,8 +2305,8 @@ export default { ...@@ -2305,8 +2305,8 @@ export default {
} }
}, },
mounted() { mounted() {
console.log(eventJson); // console.log(eventJson);
this.eventData = eventJson; // this.eventData = eventJson;
// this.stageInit() // this.stageInit()
key("alt+1", () => { key("alt+1", () => {
if (this.istest) { if (this.istest) {
......
...@@ -2299,7 +2299,6 @@ export default { ...@@ -2299,7 +2299,6 @@ export default {
} }
}, },
mounted() { mounted() {
console.log(eventJson)
this.eventData = eventJson this.eventData = eventJson
// this.stageInit() // this.stageInit()
key('alt+1',()=>{ key('alt+1',()=>{
......
...@@ -207,8 +207,8 @@ export default { ...@@ -207,8 +207,8 @@ export default {
this.stage.add(this.signLayer); this.stage.add(this.signLayer);
this.layers = [this.signLayer]; this.layers = [this.signLayer];
} }
console.log(this.taskData.mtasks[0].scenes[0].calibration); console.log(this.taskData.calibration);
let cal = this.taskData.mtasks[0].scenes[0].calibration; let cal = this.taskData.calibration;
if (cal === null || cal == undefined) { if (cal === null || cal == undefined) {
this.configInit(""); this.configInit("");
} }
......
...@@ -6,8 +6,9 @@ ...@@ -6,8 +6,9 @@
border border
stripe stripe
style="width: 80%;float:left" style="width: 80%;float:left"
height="25vh"
> >
<el-table-column label="序号" type="index" width="80"> <el-table-column label="序号" type="index" width="50" align="center">
</el-table-column> </el-table-column>
<el-table-column <el-table-column
prop="name" prop="name"
...@@ -27,10 +28,10 @@ ...@@ -27,10 +28,10 @@
<el-table-column prop="address" align="center" label="参数设置"> <el-table-column prop="address" align="center" label="参数设置">
<template slot-scope="scope"> <template slot-scope="scope">
<div class="table-set"> <div class="table-set">
<span @click="setParam(scope.row)">参数设置</span> <span @click="setParam(scope.row, scope.$index)">参数设置</span>
<span @click="setArea(scope.row)">区域设置</span> <span @click="setArea(scope.row, scope.$index)">区域设置</span>
<span @click="setDemarcate(scope.row)">标定设置</span> <span @click="setDemarcate(scope.row, scope.$index)">标定设置</span>
<span @click="setTimer(scope.row)">时间设置</span> <span @click="setTimer(scope.row, scope.$index)">时间设置</span>
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
...@@ -127,6 +128,7 @@ export default { ...@@ -127,6 +128,7 @@ export default {
timer: 0, timer: 0,
timersel: 0, timersel: 0,
timerDialog: false, timerDialog: false,
curindex: 0,
timeroptions: [30, 40, 50, 60, 100], timeroptions: [30, 40, 50, 60, 100],
timerscenes: null, timerscenes: null,
taskInfo: { taskInfo: {
...@@ -148,14 +150,17 @@ export default { ...@@ -148,14 +150,17 @@ export default {
handleparam handleparam
}, },
methods: { methods: {
setParam() { setParam(scenesdata, index) {
this.$refs.parameter.init(this.taskInfo); this.curindex = index;
this.$refs.parameter.init(scenesdata);
}, },
setArea(roidata) { setArea(roidata, index) {
this.curindex = index;
this.$refs.areas.showModal(roidata, this.taskInfo); this.$refs.areas.showModal(roidata, this.taskInfo);
}, },
setDemarcate() { setDemarcate(scenesdata, index) {
this.$refs.demarcate.showModal(this.taskInfo); this.curindex = index;
this.$refs.demarcate.showModal(scenesdata);
}, },
handleparam(type) { handleparam(type) {
this.$refs.handleparam.show(type); this.$refs.handleparam.show(type);
...@@ -195,14 +200,15 @@ export default { ...@@ -195,14 +200,15 @@ export default {
}); });
}, },
showview() { showview() {
this.$router.push({ let routeData = this.$router.resolve({
name: "show", name: "show",
params: { query: {
taskid: this.taskid, taskid: this.taskid,
subtaskid: this.subtaskid, subtaskid: this.subtaskid,
playurl: this.playurl playurl: this.playurl
} }
}); });
window.open(routeData.href, '_blank');
}, },
submit: function(xml, type) { submit: function(xml, type) {
let postObj = { let postObj = {
...@@ -212,31 +218,23 @@ export default { ...@@ -212,31 +218,23 @@ export default {
mtask_unid: this.taskInfo.mtasks[0].mtask_unid, mtask_unid: this.taskInfo.mtasks[0].mtask_unid,
// type: 0, // type: 0,
// priority: 0, // priority: 0,
scenes: [ scenes: this.taskInfo.mtasks[0].scenes
{
scene_unid: this.taskInfo.mtasks[0].scenes[0].scene_unid,
play_urls: {
rtsp: this.vchanUrl
}
// algo_args: {}
}
]
} }
] ]
}; };
if (type == "roi") { if (type == "roi") {
postObj.mtasks[0].scenes[0].rois = [ postObj.mtasks[0].scenes[this.curindex].rois = [
{ {
roi: xml roi: xml
} }
]; ];
} else if (type == "config") { } else if (type == "config") {
postObj.mtasks[0].scenes[0].config = { postObj.mtasks[0].scenes[this.curindex].config = {
xml: xml xml: xml
}; };
} else if (type == "calibration") { } else if (type == "calibration") {
console.log(xml); console.log(xml);
postObj.mtasks[0].scenes[0].calibration = { postObj.mtasks[0].scenes[this.curindex].calibration = {
calibration: xml calibration: xml
}; };
} }
...@@ -254,14 +252,14 @@ export default { ...@@ -254,14 +252,14 @@ export default {
}); });
switch (type) { switch (type) {
case "roi": case "roi":
this.taskInfo.mtasks[0].scenes[0].rois = [ this.taskInfo.mtasks[0].scenes[this.curindex].rois = [
{ {
roi: xml roi: xml
} }
]; ];
break; break;
case "calibration": case "calibration":
this.taskInfo.mtasks[0].scenes[0].calibration = { this.taskInfo.mtasks[0].scenes[this.curindex].calibration = {
calibration: xml calibration: xml
}; };
break; break;
......
...@@ -4,7 +4,8 @@ ...@@ -4,7 +4,8 @@
title="参数设置" title="参数设置"
:visible.sync="dialogVisible" :visible.sync="dialogVisible"
width="50%" width="50%"
:before-close="handleClose"> :before-close="handleClose"
>
<span> <span>
<iframe <iframe
id="iframe" id="iframe"
...@@ -28,52 +29,53 @@ export default { ...@@ -28,52 +29,53 @@ export default {
data() { data() {
return { return {
dialogVisible: false, dialogVisible: false,
XMLStr:'', XMLStr: "",
basicXml:'', basicXml: "",
taskData:"" taskData: ""
}; };
}, },
methods: { methods: {
init(data){ init(data) {
this.$store.commit('setocxstate',0) this.$store.commit("setocxstate", 0);
this.dialogVisible = true; this.dialogVisible = true;
this.taskData = data; this.taskData = data;
let that = this; let that = this;
setTimeout(()=>{ setTimeout(() => {
that.xmlInit(data.mtasks[0].scenes[0]); that.xmlInit(data);
},800) }, 800);
}, },
balltaskinit(data){ balltaskinit(data) {
this.$store.commit('setocxstate',0) this.$store.commit("setocxstate", 0);
this.dialogVisible = true; this.dialogVisible = true;
setTimeout(()=>{ setTimeout(() => {
this.xmlInit(data); this.xmlInit(data);
},800) }, 800);
}, },
xmlInit: function (obj) { xmlInit: function(obj) {
this.XMLStr =
this.XMLStr = obj.config.xml || '<?xml version="1.0" encoding="GBK"?><root></root>' obj.config.xml || '<?xml version="1.0" encoding="GBK"?><root></root>';
console.log('XML:'+this.XMLStr.split('@').length) console.log("XML:" + this.XMLStr.split("@").length);
if (this.XMLStr.split('@').length>1) { if (this.XMLStr.split("@").length > 1) {
this.XMLStr = '<?xml version="1.0" encoding="GBK"?><root></root>' this.XMLStr = '<?xml version="1.0" encoding="GBK"?><root></root>';
} }
this.basicXml = obj.basicConfig.xml; this.basicXml = obj.basicConfig.xml;
this.$refs.iframe.contentWindow.loadParameterTree(this.basicXml,this.XMLStr); this.$refs.iframe.contentWindow.loadParameterTree(
this.basicXml,
this.XMLStr
);
}, },
save:function () { save: function() {
this.$refs.iframe.contentWindow.submit(); this.$refs.iframe.contentWindow.submit();
//ifram 传递回来的饿xml //ifram 传递回来的饿xml
this.XMLStr = this.$refs.iframe.contentWindow.xmlStr; this.XMLStr = this.$refs.iframe.contentWindow.xmlStr;
this.dialogVisible = false; this.dialogVisible = false;
this.$parent.submit(this.XMLStr,'config') this.$parent.submit(this.XMLStr, "config");
}, },
handleClose(done) { handleClose(done) {
this.dialogVisible = false; this.dialogVisible = false;
this.$store.commit('setocxstate',1) this.$store.commit("setocxstate", 1);
} }
} }
} };
</script> </script>
<style lang="stylus" scoped> <style lang="stylus" scoped></style>
</style>
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!