Browse Source

封装数据中台api请求

V1.0
dai 3 years ago
parent
commit
49abe54ee0
  1. 2
      .env.development
  2. 1
      .env.production
  3. 1
      .env.production.sit
  4. 1
      .env.shibei_production
  5. BIN
      src/assets/images/shuju/main/back-on.png
  6. BIN
      src/assets/images/shuju/main/back.png
  7. BIN
      src/assets/images/shuju/renfang/index/per/dy.png
  8. BIN
      src/assets/images/shuju/renfang/index/per/lnr.png
  9. BIN
      src/assets/images/shuju/renfang/index/per/qsn.png
  10. BIN
      src/assets/images/shuju/renfang/index/per/syry.png
  11. BIN
      src/assets/images/shuju/renfang/index/per/ygxl.png
  12. BIN
      src/assets/images/shuju/renfang/index/per/zyz.png
  13. 21
      src/assets/scss/dataBoard/renfang/index.scss
  14. 38
      src/assets/scss/dataBoardMain.scss
  15. 114
      src/js/dai/request-bipass.js
  16. 134
      src/views/dataBoard/renfang/index.vue
  17. 76
      src/views/dataBoardMain/main-navbar.vue

2
.env.development

@ -9,6 +9,8 @@ VUE_APP_API_SERVER = http://192.168.1.144/api
# VUE_APP_API_SERVER = https://epmet-dev.elinkservice.cn:41080/api # VUE_APP_API_SERVER = https://epmet-dev.elinkservice.cn:41080/api
# VUE_APP_API_SERVER = https://epmet-dev.elinkservice.cn/api # VUE_APP_API_SERVER = https://epmet-dev.elinkservice.cn/api
VUE_APP_BIPASS_API_SERVER = http://bipaas.elinkservice.cn/linkdata/linkdata-gateway/route
# VUE_APP_NODE_ENV=dev_sdtdt # VUE_APP_NODE_ENV=dev_sdtdt
VUE_APP_NODE_ENV=dev VUE_APP_NODE_ENV=dev
#项目根路径 #项目根路径

1
.env.production

@ -1,4 +1,5 @@
NODE_ENV=production NODE_ENV=production
VUE_APP_API_SERVER = https://epmet-cloud.elinkservice.cn/api VUE_APP_API_SERVER = https://epmet-cloud.elinkservice.cn/api
VUE_APP_BIPASS_API_SERVER = http://bipaas.elinkservice.cn/linkdata/linkdata-gateway/route
VUE_APP_NODE_ENV=prod VUE_APP_NODE_ENV=prod
VUE_APP_PUBLIC_PATH=epmet-oper VUE_APP_PUBLIC_PATH=epmet-oper

1
.env.production.sit

@ -2,5 +2,6 @@ NODE_ENV=production
# VUE_APP_API_SERVER = https://epmet-test.elinkservice.cn/api # VUE_APP_API_SERVER = https://epmet-test.elinkservice.cn/api
# VUE_APP_API_SERVER = http://192.168.1.140/api # VUE_APP_API_SERVER = http://192.168.1.140/api
VUE_APP_API_SERVER = http://192.168.1.144/api VUE_APP_API_SERVER = http://192.168.1.144/api
VUE_APP_BIPASS_API_SERVER = http://bipaas.elinkservice.cn/linkdata/linkdata-gateway/route
VUE_APP_NODE_ENV=prod:sit VUE_APP_NODE_ENV=prod:sit
VUE_APP_PUBLIC_PATH=epmet-oper VUE_APP_PUBLIC_PATH=epmet-oper

1
.env.shibei_production

@ -1,4 +1,5 @@
NODE_ENV=production NODE_ENV=production
VUE_APP_API_SERVER = https://epdc-shibei.elinkservice.cn/api VUE_APP_API_SERVER = https://epdc-shibei.elinkservice.cn/api
# VUE_APP_BIPASS_API_SERVER = http://bipaas.elinkservice.cn/linkdata/linkdata-gateway/route
VUE_APP_NODE_ENV=shibei_prod VUE_APP_NODE_ENV=shibei_prod
VUE_APP_PUBLIC_PATH=epmet-oper VUE_APP_PUBLIC_PATH=epmet-oper

BIN
src/assets/images/shuju/main/back-on.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 689 B

BIN
src/assets/images/shuju/main/back.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 868 B

BIN
src/assets/images/shuju/renfang/index/per/dy.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

BIN
src/assets/images/shuju/renfang/index/per/lnr.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
src/assets/images/shuju/renfang/index/per/qsn.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
src/assets/images/shuju/renfang/index/per/syry.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
src/assets/images/shuju/renfang/index/per/ygxl.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
src/assets/images/shuju/renfang/index/per/zyz.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

21
src/assets/scss/dataBoard/renfang/index.scss

@ -277,27 +277,32 @@
right: 0; right: 0;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: space-around;
padding-left: 10px; padding-left: 10px;
.item { .item {
display: flex; display: flex;
width: 160px; width: 120px;
img {
display: block;
margin-right: 16px;
width: 48px;
height: 48px;
}
.item-info { .item-info {
font-size: 14px; font-size: 14px;
font-family: PingFangSC-Regular, PingFang SC; font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400; font-weight: 400;
color: rgba(255, 255, 255, 0.65); color: rgba(255, 255, 255, 0.65);
line-height: 20px; line-height: 40px;
vertical-align: bottom; vertical-align: bottom;
div { div {
margin-bottom: 6px; margin-bottom: 6px;
&:first-child {
line-height: 20px;
}
}
img {
display: inline-block;
margin-right: 5px;
width: 20px;
height: 20px;
vertical-align: bottom;
} }
b { b {
font-weight: 500; font-weight: 500;

38
src/assets/scss/dataBoardMain.scss

@ -54,16 +54,50 @@
color: #ffffff; color: #ffffff;
} }
.btn-back {
position: absolute;
top: 52px;
left: 40px;
display: flex;
width: 60px;
align-items: center;
line-height: 22px;
font-size: 16px;
color: #1a95ff;
cursor: pointer;
img {
width: 16px;
margin-right: 5px;
}
.z-default {
display: block;
}
.z-on {
display: none;
}
&:hover {
color: #fff;
.z-default {
display: none;
}
.z-on {
display: block;
}
}
}
.nav-list { .nav-list {
position: absolute; position: absolute;
top: 40px; top: 40px;
left: 40px; left: 120px;
display: flex; display: flex;
width: 500px; width: 500px;
&.z-right { &.z-right {
left: auto; left: auto;
right: 40px; right: 120px;
.nav-item { .nav-item {
background-image: url(../images/shuju/main/nav-right.png); background-image: url(../images/shuju/main/nav-right.png);
&.z-on { &.z-on {

114
src/js/dai/request-bipass.js

@ -0,0 +1,114 @@
/*---------------------------------------------------------------
| 数据中台专用请求接口封装 |
---------------------------------------------------------------*/
import axios from "axios";
import curry from "dai-js/tools/curry";
import { Message } from "element-ui";
import { clearLoginInfo } from "@/utils";
axios.defaults.withCredentials = true;
axios.defaults.crossDomain = true;
const request = curry((method, uri, data = {}, params = {}) => {
return new Promise((reslove) => {
let returnIniData = {
httpCode: "",
data: {},
msg: "",
code: "",
};
const { headers, mockId } = params;
// env文件配置接口
let url = process.env.VUE_APP_BIPASS_API_SERVER;
// mock 开发临时用接口
if (mockId) {
url = "https://mock.apifox.cn/m2/2242395-0-default/" + mockId;
}
const succFn = (res) => {
// log(`[request成功] ${url}`, data, res);
let retData = {
...returnIniData,
...res.data,
httpCode: res.statusCode,
};
// if(typeof Vue.$afterRequestHook == 'function'){
// retData = Vue.$afterRequestHook(retData);
// }
if (res.data.code > 8000 && res.data.code < 10000) {
// Message.error(res.data.msg);
}
if (res.code == 1007 || res.code == 1024 || res.code == 2003) {
// 10005 token为空 10006登陆超时 10007别处登录
console.log("登录失效");
Message.error(res.data.msg);
clearLoginInfo();
return next({
name: "login",
});
}
reslove(retData);
};
const failFn = (err) => {
// log(`[request失败] ${url}`, data, err);
reslove(
Object.assign({}, returnIniData, {
httpCode: "9999", //访问出现意外
msg: "网络错误",
})
);
};
if (method.toUpperCase() == "POST") {
axios
.post(
url,
{
apiCode: "/api/post",
dispatcherSystem: "dataservice",
param: {
ds_code: uri,
app_code: "empet",
orderby: "[]",
...data,
},
},
{
headers,
responseType: "json",
}
)
.then(succFn)
.catch(failFn);
} else {
axios
.post(
url,
{
apiCode: "/api/get",
dispatcherSystem: "dataservice",
param: {
ds_code: uri,
app_code: "empet",
orderby: "[]",
...data,
},
},
{
headers,
responseType: "json",
}
)
.then(succFn)
.catch(failFn);
}
});
});
export const requestPostBi = request("post");

134
src/views/dataBoard/renfang/index.vue

@ -34,12 +34,12 @@
<div class="m-map"> <div class="m-map">
<div class="m-per"> <div class="m-per">
<div class="item"> <div class="item">
<div class="item-info">
<div>
<img <img
class="item-icon"
src="~@/assets/images/shuju/renfang/index/per/lnr.png" src="~@/assets/images/shuju/renfang/index/per/lnr.png"
/> />
<div class="item-info"> </div>
<div>老年人</div>
<div> <div>
<b>10.22</b> <b>10.22</b>
% %
@ -47,12 +47,12 @@
</div> </div>
</div> </div>
<div class="item"> <div class="item">
<div class="item-info">
<div>
<img <img
class="item-icon"
src="~@/assets/images/shuju/renfang/index/per/qsn.png" src="~@/assets/images/shuju/renfang/index/per/qsn.png"
/> />
<div class="item-info"> </div>
<div>青少年</div>
<div> <div>
<b>10.22</b> <b>10.22</b>
% %
@ -60,12 +60,12 @@
</div> </div>
</div> </div>
<div class="item"> <div class="item">
<div class="item-info">
<div>
<img <img
class="item-icon"
src="~@/assets/images/shuju/renfang/index/per/zyz.png" src="~@/assets/images/shuju/renfang/index/per/zyz.png"
/> />
<div class="item-info"> </div>
<div>志愿者</div>
<div> <div>
<b>10.22</b> <b>10.22</b>
% %
@ -73,12 +73,12 @@
</div> </div>
</div> </div>
<div class="item"> <div class="item">
<div class="item-info">
<div>
<img <img
class="item-icon"
src="~@/assets/images/shuju/renfang/index/per/dy.png" src="~@/assets/images/shuju/renfang/index/per/dy.png"
/> />
<div class="item-info"> </div>
<div>党员</div>
<div> <div>
<b>10.22</b> <b>10.22</b>
% %
@ -86,12 +86,26 @@
</div> </div>
</div> </div>
<div class="item"> <div class="item">
<div class="item-info">
<div>
<img <img
class="item-icon"
src="~@/assets/images/shuju/renfang/index/per/syry.png" src="~@/assets/images/shuju/renfang/index/per/syry.png"
/> />
</div>
<div>
<b>10.22</b>
%
</div>
</div>
</div>
<div class="item">
<div class="item-info"> <div class="item-info">
<div>失业人员</div> <div>
<img
src="~@/assets/images/shuju/renfang/index/per/ygxl.png"
/>
月更新率
</div>
<div> <div>
<b>10.22</b> <b>10.22</b>
% %
@ -137,7 +151,10 @@
<div class="i-div"></div> <div class="i-div"></div>
<div class="card-btn" @click="searchModule.displayedCard = false"> <div
class="card-btn"
@click="searchModule.displayedCard = false"
>
<img <img
src="~@/assets/images/shuju/renfang/index/search/close.png" src="~@/assets/images/shuju/renfang/index/search/close.png"
/> />
@ -146,38 +163,51 @@
<div class="card-show"> <div class="card-show">
<div class="card-tabs"> <div class="card-tabs">
<div <div
:class="{ 'z-on': searchModule.resultTab == 'all' }" :class="{
'z-on': searchModule.resultTab == 'all',
}"
@click="searchModule.resultTab = 'all'" @click="searchModule.resultTab = 'all'"
> >
全部 全部
</div> </div>
<div <div
:class="{ 'z-on': searchModule.resultTab == 'resi' }" :class="{
'z-on': searchModule.resultTab == 'resi',
}"
@click="searchModule.resultTab = 'resi'" @click="searchModule.resultTab = 'resi'"
> >
居民 居民
</div> </div>
<div <div
:class="{ 'z-on': searchModule.resultTab == 'all' }" :class="{
'z-on': searchModule.resultTab == 'all',
}"
@click="searchModule.resultTab = 'all'" @click="searchModule.resultTab = 'all'"
> >
小区 小区
</div> </div>
<div <div
:class="{ 'z-on': searchModule.resultTab == 'all' }" :class="{
'z-on': searchModule.resultTab == 'all',
}"
@click="searchModule.resultTab = 'all'" @click="searchModule.resultTab = 'all'"
> >
楼栋 楼栋
</div> </div>
<div <div
:class="{ 'z-on': searchModule.resultTab == 'all' }" :class="{
'z-on': searchModule.resultTab == 'all',
}"
@click="searchModule.resultTab = 'all'" @click="searchModule.resultTab = 'all'"
> >
房屋 房屋
</div> </div>
</div> </div>
<div class="card-list" v-if="searchModule.result.length > 0"> <div
class="card-list"
v-if="searchModule.result.length > 0"
>
<div <div
class="card-item" class="card-item"
:key="item.id" :key="item.id"
@ -196,7 +226,9 @@
</div> </div>
<div class="card-empty" v-else> <div class="card-empty" v-else>
<img src="~@/assets/images/shuju/renfang/index/empty.png" /> <img
src="~@/assets/images/shuju/renfang/index/empty.png"
/>
<span>没有找到搜索结果</span> <span>没有找到搜索结果</span>
</div> </div>
</div> </div>
@ -212,9 +244,13 @@
<div class="box-title-txt">居民分类分析</div> <div class="box-title-txt">居民分类分析</div>
<div class="box-title-btn"> <div class="box-title-btn">
<img src="~@/assets/images/shuju/renfang/index/znyc.png" /> <img
src="~@/assets/images/shuju/renfang/index/znyc.png"
/>
<span>智能预测</span> <span>智能预测</span>
<img src="~@/assets/images/shuju/renfang/index/i-hint.png" /> <img
src="~@/assets/images/shuju/renfang/index/i-hint.png"
/>
</div> </div>
</div> </div>
@ -238,7 +274,10 @@
v-if="false" v-if="false"
src="~@/assets/images/shuju/renfang/index/up.png" src="~@/assets/images/shuju/renfang/index/up.png"
/> />
<img v-else src="~@/assets/images/shuju/renfang/index/down.png" /> <img
v-else
src="~@/assets/images/shuju/renfang/index/down.png"
/>
<b>{{ item.count }}</b> <b>{{ item.count }}</b>
<span></span> <span></span>
</div> </div>
@ -299,6 +338,7 @@ import jmgl from "@/views/dataBoard/renfang/cpts/jmgl";
import rkfx from "@/views/dataBoard/renfang/cpts/rkfx"; import rkfx from "@/views/dataBoard/renfang/cpts/rkfx";
import rkyj from "@/views/dataBoard/renfang/cpts/rkyj"; import rkyj from "@/views/dataBoard/renfang/cpts/rkyj";
import szsq from "@/views/dataBoard/renfang/cpts/szsq"; import szsq from "@/views/dataBoard/renfang/cpts/szsq";
import { requestPostBi } from "@/js/dai/request-bipass";
import { requestPost } from "@/js/dai/request"; import { requestPost } from "@/js/dai/request";
import getQueryPara from "dai-js/modules/getQueryPara"; import getQueryPara from "dai-js/modules/getQueryPara";
@ -353,6 +393,14 @@ export default {
}, },
], ],
}, },
perInfo: {
unused_count: 10,
lease_count: 10,
house_count: 100,
org_id: "10001",
self_dwelling_count: 10,
},
}; };
}, },
async mounted() { async mounted() {
@ -367,11 +415,37 @@ export default {
// //
await this.loadOrgData(); await this.loadOrgData();
this.getWarningList(); this.getWarningList();
this.getPerInfo();
}, },
methods: { methods: {
clickAgencyItem() {},
handleSearch() { handleSearch() {
console.log(this.searchModule); console.log(this.searchModule);
}, },
// ps:
async getPerInfo() {
console.log('=========================getPerInfo')
const url = "house_view";
const { data, code, msg } = await requestPostBi(
url,
{
queryParam: {
org_id: this.orgData.id,
},
},
{
mockId: 60810589,
}
);
if (code === 0) {
this.perInfo = data[0];
} else {
this.$message.error(msg);
}
},
// //
async getWarningList() { async getWarningList() {

76
src/views/dataBoardMain/main-navbar.vue

@ -1,6 +1,11 @@
<template> <template>
<div class="m-topnav"> <div class="m-topnav">
<div class="title">{{ customerName }}综合服务平台数据看板</div> <div class="title">{{ customerName }}综合服务平台数据看板</div>
<div class="btn-back" @click="toPage('/')">
<img class="z-default" src="~@/assets/images/shuju/main/back.png" />
<img class="z-on" src="~@/assets/images/shuju/main/back-on.png" />
<span>返回</span>
</div>
<div class="nav-list z-left"> <div class="nav-list z-left">
<div <div
class="nav-item" class="nav-item"
@ -10,19 +15,19 @@
<span>人房总览</span> <span>人房总览</span>
</div> </div>
<div class="nav-item" @click="toPage('/')"> <div class="nav-item" @click="toPage('/')">
<span>人口分析</span> <span>问题清单</span>
</div> </div>
<div class="nav-item" @click="toPage('/')"> <div class="nav-item" @click="toPage('/')">
<span>人口变化</span> <span>需求清单</span>
</div> </div>
<div class="nav-item" @click="toPage('/')"> <div class="nav-item" @click="toPage('/')">
<span>人口预警</span> <span>资源清单</span>
</div> </div>
</div> </div>
<div class="nav-list z-right"> <div class="nav-list z-right">
<div class="nav-item" @click="toPage('/')"> <div class="nav-item">
<span>回首页</span> <span>15分钟生活圈</span>
</div> </div>
</div> </div>
@ -72,7 +77,10 @@
v-else-if="weather.weather == '多云'" v-else-if="weather.weather == '多云'"
src="~@/assets/images/shuju/main/weather/duoyun.png" src="~@/assets/images/shuju/main/weather/duoyun.png"
/> />
<img v-else src="~@/assets/images/shuju/main/weather/qing.png" /> <img
v-else
src="~@/assets/images/shuju/main/weather/qing.png"
/>
<div>{{ weather.temperature }}</div> <div>{{ weather.temperature }}</div>
<div>{{ weather.weather }}</div> <div>{{ weather.weather }}</div>
@ -87,8 +95,13 @@
<nav v-if="false" class="m-navbar"> <nav v-if="false" class="m-navbar">
<div class="navbar__header"> <div class="navbar__header">
<h1 class="navbar__brand" @click="$router.push({ name: 'home' })"> <h1
<a class="navbar__brand-lg" href="javascript:;">{{ customerName }}</a> class="navbar__brand"
@click="$router.push({ name: 'home' })"
>
<a class="navbar__brand-lg" href="javascript:;">{{
customerName
}}</a>
<a class="navbar__brand-mini" href="javascript:;">{{ <a class="navbar__brand-mini" href="javascript:;">{{
customerName.slice(0, 2) customerName.slice(0, 2)
}}</a> }}</a>
@ -98,7 +111,9 @@
<el-menu class="navbar__menu mr-auto" mode="horizontal"> <el-menu class="navbar__menu mr-auto" mode="horizontal">
<el-menu-item <el-menu-item
index="1" index="1"
@click="$store.state.sidebarFold = !$store.state.sidebarFold" @click="
$store.state.sidebarFold = !$store.state.sidebarFold
"
> >
<svg <svg
class="icon-svg navbar__icon-menu navbar__icon-menu--switch" class="icon-svg navbar__icon-menu navbar__icon-menu--switch"
@ -109,7 +124,10 @@
</el-menu-item> </el-menu-item>
<el-menu-item index="2" @click="refresh()"> <el-menu-item index="2" @click="refresh()">
<svg class="icon-svg navbar__icon-menu" aria-hidden="true"> <svg
class="icon-svg navbar__icon-menu"
aria-hidden="true"
>
<use xlink:href="#icon-sync"></use> <use xlink:href="#icon-sync"></use>
</svg> </svg>
</el-menu-item> </el-menu-item>
@ -126,11 +144,15 @@
<span>首页</span> <span>首页</span>
</el-menu-item> </el-menu-item>
<template v-for="(menu, idx) in $store.state.mainShuju.menuList"> <template
v-for="(menu, idx) in $store.state.mainShuju.menuList"
>
<li <li
class="sub-menu" class="sub-menu"
:class=" :class="
$store.state.mainShuju.activeName == menu.id ? 'z-on' : '' $store.state.mainShuju.activeName == menu.id
? 'z-on'
: ''
" "
v-if="menu.children" v-if="menu.children"
:key="menu.id" :key="menu.id"
@ -140,12 +162,15 @@
<div class="sub-menu-list"> <div class="sub-menu-list">
<div <div
:class=" :class="
$store.state.mainShuju.activeName == subMenu.id $store.state.mainShuju.activeName ==
subMenu.id
? 'z-on' ? 'z-on'
: '' : ''
" "
:key="subMenu.id" :key="subMenu.id"
@click="gotoRouteHandle(subMenu.id, subIndex)" @click="
gotoRouteHandle(subMenu.id, subIndex)
"
v-for="(subMenu, subIndex) in menu.children" v-for="(subMenu, subIndex) in menu.children"
> >
{{ subMenu.name }} {{ subMenu.name }}
@ -186,7 +211,10 @@
</a> </a>
</el-menu-item> --> </el-menu-item> -->
<el-menu-item index="3" @click="fullscreenHandle()"> <el-menu-item index="3" @click="fullscreenHandle()">
<svg class="icon-svg navbar__icon-menu" aria-hidden="true"> <svg
class="icon-svg navbar__icon-menu"
aria-hidden="true"
>
<use xlink:href="#icon-fullscreen"></use> <use xlink:href="#icon-fullscreen"></use>
</svg> </svg>
</el-menu-item> </el-menu-item>
@ -194,17 +222,23 @@
<el-menu-item index="4" class="navbar__avatar"> <el-menu-item index="4" class="navbar__avatar">
<el-dropdown placement="bottom" :show-timeout="0"> <el-dropdown placement="bottom" :show-timeout="0">
<span class="el-dropdown-link"> <span class="el-dropdown-link">
<img src="~@/assets/img/staff-default-avatar.png" /> <img
src="~@/assets/img/staff-default-avatar.png"
/>
<span>{{ $store.state.user.realName }}</span> <span>{{ $store.state.user.realName }}</span>
<i class="el-icon-arrow-down"></i> <i class="el-icon-arrow-down"></i>
</span> </span>
<el-dropdown-menu slot="dropdown"> <el-dropdown-menu slot="dropdown">
<el-dropdown-item @click.native="updatePasswordHandle()">{{ <el-dropdown-item
@click.native="updatePasswordHandle()"
>{{
$t("updatePassword.title") $t("updatePassword.title")
}}</el-dropdown-item> }}</el-dropdown-item
<el-dropdown-item @click.native="logoutHandle()">{{ >
$t("logout") <el-dropdown-item
}}</el-dropdown-item> @click.native="logoutHandle()"
>{{ $t("logout") }}</el-dropdown-item
>
</el-dropdown-menu> </el-dropdown-menu>
</el-dropdown> </el-dropdown>
</el-menu-item> </el-menu-item>

Loading…
Cancel
Save