Commit a674e78e authored by dupengyu's avatar dupengyu

轮询管理、告警等

parent b1d21bb3
...@@ -2,16 +2,15 @@ import request from '@/utils/request' ...@@ -2,16 +2,15 @@ import request from '@/utils/request'
// 运行报表 // 运行报表
export function chartInfo(params) { export function chartInfo(params) {
return request({ return request({
url: '/xxl-job-admin/chartInfo', url: '/device/chartInfo',
method: 'post', method: 'post',
params params
}) })
} }
// 任务管理 // 任务管理
export function jobinfoList(data) { export function jobinfoList(data) {
return request({ return request({
url: '/xxl-job-admin/jobinfo/pageList', url: '/device/jobinfo/pageList',
method: 'post', method: 'post',
data data
}) })
...@@ -19,7 +18,7 @@ export function jobinfoList(data) { ...@@ -19,7 +18,7 @@ export function jobinfoList(data) {
// 调度日志 // 调度日志
export function joblogList(data) { export function joblogList(data) {
return request({ return request({
url: '/xxl-job-admin/joblog/pageList', url: '/device/joblog/pageList',
method: 'post', method: 'post',
data data
}) })
...@@ -28,7 +27,7 @@ export function joblogList(data) { ...@@ -28,7 +27,7 @@ export function joblogList(data) {
// 执行器管理 // 执行器管理
export function jobgroupList(data) { export function jobgroupList(data) {
return request({ return request({
url: '/xxl-job-admin/jobgroup/pageList', url: '/device/jobgroup/pageList',
method: 'post', method: 'post',
data data
}) })
......
import request from '@/utils/request' import request from '@/utils/request'
export function selectFeederPage(params) { export function selectFeederPage(data) {
return request({ return request({
url: '/device/sync/selectFeederPage', url: '/device/sync/selectFeederPage',
method: 'post', method: 'post',
params data
}) })
} }
...@@ -69,6 +69,12 @@ export const constantRoutes = [ ...@@ -69,6 +69,12 @@ export const constantRoutes = [
component: () => import('@/views/setting/add/index'), component: () => import('@/views/setting/add/index'),
meta: { title: '手动添加配置' } meta: { title: '手动添加配置' }
}, },
{
path: 'auto',
name: 'settingAuto',
component: () => import('@/views/setting/auto/index'),
meta: { title: '自动添加配置' }
},
{ {
path: 'statistics', path: 'statistics',
name: 'settingAtatistics', name: 'settingAtatistics',
......
...@@ -33,7 +33,6 @@ function endLoading(el) { ...@@ -33,7 +33,6 @@ function endLoading(el) {
// request interceptor // request interceptor
service.interceptors.request.use( service.interceptors.request.use(
config => { config => {
console.log(config)
// do something before request is sent // do something before request is sent
startLoading(config.el) startLoading(config.el)
// config.data = json.dumps(config.data) // config.data = json.dumps(config.data)
...@@ -52,7 +51,6 @@ service.interceptors.request.use( ...@@ -52,7 +51,6 @@ service.interceptors.request.use(
} }
) )
// response interceptor
let errorShowing = false let errorShowing = false
service.interceptors.response.use( service.interceptors.response.use(
response => { response => {
......
...@@ -11,7 +11,8 @@ const path = { ...@@ -11,7 +11,8 @@ const path = {
alarmConfirmStatusStatistics: 'api/sysMonitorAlarmStatistics/alarmConfirmStatusStatistics', alarmConfirmStatusStatistics: 'api/sysMonitorAlarmStatistics/alarmConfirmStatusStatistics',
alarmLevelStatistics: '/api/sysMonitorAlarmStatistics/alarmLevelStatistics', alarmLevelStatistics: '/api/sysMonitorAlarmStatistics/alarmLevelStatistics',
alarmLevelCountStatistics: '/api/sysMonitorAlarmStatistics/alarmLevelCountStatistics' alarmLevelCountStatistics: '/api/sysMonitorAlarmStatistics/alarmLevelCountStatistics',
selectPage: '/api/sysMonitorAlarmStatistics/selectPage'
} }
export function cableTimeList() { export function cableTimeList() {
...@@ -45,4 +46,8 @@ export function alarmLevelStatistics() { ...@@ -45,4 +46,8 @@ export function alarmLevelStatistics() {
export function alarmLevelCountStatistics() { export function alarmLevelCountStatistics() {
return request.post(path.alarmLevelCountStatistics, ...arguments); return request.post(path.alarmLevelCountStatistics, ...arguments);
} }
export function selectPage() {
return request.post(path.selectPage, ...arguments);
}
This diff is collapsed.
...@@ -11,15 +11,17 @@ function printToPdf(targetId) { ...@@ -11,15 +11,17 @@ function printToPdf(targetId) {
function performPrint(targetId) { function performPrint(targetId) {
const targetElement = document.getElementById(targetId); const targetElement = document.getElementById(targetId);
console.log(targetElement)
if (!targetElement) { if (!targetElement) {
console.error('Element with ID'+ targetId +'not found.'); console.error('Element with ID' + targetId + 'not found.');
return; return;
} }
// 将不希望展示的元素隐藏掉
// 克隆目标元素及其子元素 // 克隆目标元素及其子元素
const clonedElement = targetElement.cloneNode(true); const clonedElement = targetElement.cloneNode(true);
clonedElement.style.width = '320mm' // clonedElement.style.width = '200mm'
// 在打印之前隐藏所有元素 // 在打印之前隐藏所有元素
function hideAllElements() { function hideAllElements() {
......
<template>
<div>
<div>任务管理</div>
<div class="search"></div>
<div>
<el-table
:data="tableData"
style="width: 100%"
:header-cell-style="{ background: '#EAF1FE', color: '#666666' }"
>
<el-table-column label="任务ID" align="center" />
<el-table-column prop="siteName" label="任务描述" align="center" />
<el-table-column prop="alarmName" label="调度类型" align="center" />
<el-table-column prop="alarmType" label="运行模式" align="center" />
<el-table-column prop="alarmLevelName" label="负责人" align="center" />
<el-table-column prop="alarmLevelName" label="状态" align="center" />
<el-table-column label="操作" align="center" width="100">
<template slot-scope="scope">
<el-button type="text" @click="eliminate(scope.row)"
>操作</el-button
>
</template>
</el-table-column>
</el-table>
</div>
</div>
</template>
<script>
import { jobinfoList } from "@/api/job.js";
export default {
data() {
return {
tableData: [],
};
},
mounted() {},
methods: {},
};
</script>
<style lang="scss" scoped>
</style>
\ No newline at end of file
<template>
<div>
<div>调度日志</div>
<div class="search"></div>
<div>
<el-table
:data="tableData"
style="width: 100%"
:header-cell-style="{ background: '#EAF1FE', color: '#666666' }"
>
<el-table-column label="任务ID" align="center" />
<el-table-column prop="siteName" label="调度时间" align="center" />
<el-table-column prop="alarmName" label="调度结果" align="center" />
<el-table-column prop="alarmType" label="调度备注" align="center" />
<el-table-column prop="alarmType" label="执行时间" align="center" />
<el-table-column prop="alarmType" label="执行结果" align="center" />
<el-table-column
prop="alarmLevelName"
label="执行备注"
align="center"
/>
<el-table-column label="操作" align="center" width="100">
<template slot-scope="scope">
<el-button type="text" @click="eliminate(scope.row)"
>操作</el-button
>
</template>
</el-table-column>
</el-table>
</div>
</div>
</template>
<script>
import { joblogList } from "@/api/job.js";
export default {
data() {
return {
tableData: [],
};
},
mounted() {
this.handleJoblogList();
},
methods: {
async handleJoblogList() {
let data = {
jobGroup: 0,
jobId: 0,
logStatus: -1,
filterTime: "2024-12-09 00:00:00 - 2025-01-09 23:59:59",
start: 0,
length: 10,
};
const queryParams = new URLSearchParams(data).toString();
// const formData = new FormData();
// Object.keys(data).map((key) => {
// formData.append(key, data[key]);
// });
// let formdata=new FormData();
// formdata.append('jobGroup', 0);
// formdata.append('jobId', 0);
// formdata.append('logStatus', -1);
// formdata.append('filterTime', '2024-12-09 00:00:00 - 2025-01-09 23:59:59');
// formdata.append('start', );
// formdata.append('logStatus', -1);
const res = await joblogList(queryParams);
console.log(res);
this.tableData = res;
},
},
};
</script>
<style lang="scss" scoped>
</style>
\ No newline at end of file
<template>
<div>
<div>执行器管理</div>
<div class="search"></div>
<div>
<el-table
:data="tableData"
style="width: 100%"
:header-cell-style="{ background: '#EAF1FE', color: '#666666' }"
>
<el-table-column label="AppName" prop="appname" align="center" />
<el-table-column prop="title" label="名称" align="center" />
<el-table-column prop="addressType" label="注册方式" align="center" />
<el-table-column
prop="registryList"
label="OnLine 机器地址"
align="center"
/>
<el-table-column label="操作" align="center" width="100">
<template slot-scope="scope">
<el-button type="text" @click="eliminate(scope.row)"
>操作</el-button
>
</template>
</el-table-column>
</el-table>
</div>
</div>
</template>
<script>
import { jobgroupList } from "@/api/job.js";
export default {
data() {
return {
tableData: [],
};
},
mounted() {
this.handleJobGroupList();
},
methods: {
async handleJobGroupList() {
const res = await jobgroupList();
console.log(res);
this.tableData = res;
},
},
};
</script>
<style lang="scss" scoped>
</style>
\ No newline at end of file
<template> <template>
<div class=""> <div class="">
<div class="card"> <div class="card">
<div class="card-body"> <div
<div class="icon"></div> class="card-body"
<div> :style="`background-color:${item.color}`"
<div class="title"></div> v-for="(item, index) in topList"
<div class="num"></div> :key="index"
>
<div class="icon">
<i :class="item.icon"></i>
</div> </div>
<div class="other">
<div class="title">{{ item.title }}</div>
<div class="num">{{ item.num }}</div>
<div class="line"></div>
<div class="msg">{{ item.msg }}</div>
</div>
</div>
</div>
<div class="table">
<div class="date">
<div id="chart1" style="width: 100%; height: 500px"></div>
</div>
<div class="per">
<div id="chart2" style="width: 100%; height: 500px"></div>
</div> </div>
</div> </div>
</div> </div>
...@@ -14,9 +31,14 @@ ...@@ -14,9 +31,14 @@
<script> <script>
import { chartInfo } from "@/api/job.js"; import { chartInfo } from "@/api/job.js";
import * as echarts from "echarts";
export default { export default {
data() { data() {
return { return {
myChart: {
chart1: null,
chart2: null,
},
topList: [ topList: [
{ {
title: "设备总数", title: "设备总数",
...@@ -47,14 +69,141 @@ export default { ...@@ -47,14 +69,141 @@ export default {
this.handleChartInfo(); this.handleChartInfo();
}, },
methods: { methods: {
async handleChartInfo(){ async handleChartInfo() {
console.log('---');
let res = await chartInfo({}); let res = await chartInfo({});
// console.log(res); this.chartInfo = res.content;
if (this.myChart.chart1 != null) {
this.myChart.chart1.dispose();
}
let chartDom = document.getElementById("chart1");
this.myChart.chart1 = echarts.init(chartDom);
let option;
option = {
title: {
text: "日期分布图",
},
tooltip: {
trigger: "axis",
},
legend: {
data: ["成功", "失败", "进行中"],
},
xAxis: {
type: "category",
data: this.chartInfo.triggerDayList,
},
yAxis: {
type: "value",
},
series: [
{
name: "成功",
data: this.chartInfo.triggerDayCountSucList,
type: "line",
},
{
name: "失败",
data: this.chartInfo.triggerDayCountFailList,
type: "line",
},
{
name: "进行中",
data: this.chartInfo.triggerDayCountRunningList,
type: "line",
},
],
};
option && this.myChart.chart1.setOption(option);
if (this.myChart.chart2 != null) {
this.myChart.chart2.dispose();
} }
let chart2Dom = document.getElementById("chart2");
this.myChart.chart2 = echarts.init(chart2Dom);
let option2;
option2 = {
title: {
text: "成功比例图",
left: "center",
},
tooltip: {
trigger: "item",
},
legend: {
orient: "vertical",
left: "left",
},
series: [
{
name: "数量",
type: "pie",
radius: "50%",
data: [
{ value: this.chartInfo.triggerCountSucTotal, name: "成功" },
{ value: this.chartInfo.triggerCountFailTotal, name: "失败" },
{
value: this.chartInfo.triggerCountRunningTotal,
name: "进行中",
},
],
emphasis: {
itemStyle: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: "rgba(0, 0, 0, 0.5)",
},
},
},
],
};
option && this.myChart.chart2.setOption(option2);
},
}, },
}; };
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.card {
display: flex;
justify-content: space-between;
gap: 20px;
.card-body {
width: 33%;
display: flex;
height: 100px;
.icon {
width: 100px;
height: 100px;
min-width: 100px;
font-size: 48px;
display: flex;
justify-content: center;
align-items: center;
color: #fff;
background-color: rgba($color: #37383a, $alpha: 0.15);
}
.other {
padding: 12px;
color: #fff;
width: 100%;
.line {
background: #fff;
width: 100%;
height: 1px;
margin: 8px 0;
}
}
}
}
.table {
display: flex;
width: 100%;
margin-top: 48px;
.date {
width: 60%;
}
.per {
width: 40%;
}
}
</style> </style>
\ No newline at end of file
...@@ -13,8 +13,8 @@ const path = { ...@@ -13,8 +13,8 @@ const path = {
sitesave: 'api/site/save', sitesave: 'api/site/save',
sitebatchDelete: 'api/site/batchDelete', sitebatchDelete: 'api/site/batchDelete',
siteselectList: 'api/site/selectList', siteselectList: 'api/site/selectList',
selectForSite:'api/site/selectForSite',//铁路查站点 selectForSite: 'api/site/selectForSite',//铁路查站点
updateSiteConf:'api/site/updateSiteConf', updateSiteConf: 'api/site/updateSiteConf',
fsuList: 'api/fsu/selectPage', fsuList: 'api/fsu/selectPage',
fsudetail: 'api/fsu/detail', fsudetail: 'api/fsu/detail',
...@@ -24,7 +24,7 @@ const path = { ...@@ -24,7 +24,7 @@ const path = {
selectForFsu: 'api/fsu/selectForFsu', selectForFsu: 'api/fsu/selectForFsu',
updateFsuConf: 'api/fsu/updateFsuConf', updateFsuConf: 'api/fsu/updateFsuConf',
selectFsuItem:'api/dict/selectFsuItem',//fsu数据字典 selectFsuItem: 'api/dict/selectFsuItem',//fsu数据字典
monitorEquipList: 'api/monitorEquip/selectPage', monitorEquipList: 'api/monitorEquip/selectPage',
monitorEquipdetail: 'api/monitorEquip/detail', monitorEquipdetail: 'api/monitorEquip/detail',
...@@ -32,8 +32,8 @@ const path = { ...@@ -32,8 +32,8 @@ const path = {
monitorEquipbatchDelete: 'api/monitorEquip/batchDeleteEquip', monitorEquipbatchDelete: 'api/monitorEquip/batchDeleteEquip',
monitorEquipselectList: 'api/monitorEquip/selectList', monitorEquipselectList: 'api/monitorEquip/selectList',
selectForEquip: 'api/monitorEquip/selectForEquip', selectForEquip: 'api/monitorEquip/selectForEquip',
selectMonitorItem:'api/dict/selectMonitorItem',//监测设备字典 selectMonitorItem: 'api/dict/selectMonitorItem',//监测设备字典
updateMonitorEquipConf:'api/monitorEquip/updateMonitorEquipConf', updateMonitorEquipConf: 'api/monitorEquip/updateMonitorEquipConf',
leakyCableList: 'api/leakyCable/selectPage', leakyCableList: 'api/leakyCable/selectPage',
leakyCabledetail: 'api/leakyCable/detail', leakyCabledetail: 'api/leakyCable/detail',
...@@ -48,6 +48,10 @@ const path = { ...@@ -48,6 +48,10 @@ const path = {
antennaFeederDetail: 'api/antennaFeeder/detail', antennaFeederDetail: 'api/antennaFeeder/detail',
antennaFeederList: 'api/antennaFeeder/selectFeederPage', antennaFeederList: 'api/antennaFeeder/selectFeederPage',
updateFeederConf: 'api/antennaFeeder/updateFeederConf', updateFeederConf: 'api/antennaFeeder/updateFeederConf',
autoList: '/device/autoAdd/selectPage',
waveStatistics:'/device/sampling/waveStatistics',
samplingList:'/device/sampling/selectPage',
} }
// 铁路线 // 铁路线
export function railWaylist() { export function railWaylist() {
...@@ -81,7 +85,7 @@ export function sitedetail() { ...@@ -81,7 +85,7 @@ export function sitedetail() {
} }
export function sitesave() { export function sitesave() {
return request.post(path.sitesave, ...arguments); return request.post(path.sitesave, ...arguments);
} }
export function sitebatchDelete() { export function sitebatchDelete() {
return request.post(path.sitebatchDelete, ...arguments); return request.post(path.sitebatchDelete, ...arguments);
} }
...@@ -186,3 +190,24 @@ export function antennaFeederList() { ...@@ -186,3 +190,24 @@ export function antennaFeederList() {
export function updateFeederConf() { export function updateFeederConf() {
return request.post(path.updateFeederConf, ...arguments); return request.post(path.updateFeederConf, ...arguments);
} }
// 自动添加配置
export function autoList() {
return request.post(path.autoList, ...arguments);
}
// 漏缆链路及天馈接口驻波比数据趋势分析
export function waveStatistics(params) {
return request({
url: path.waveStatistics,
method: 'post',
params
})
}
// 漏缆链路及天馈接口驻波比数据趋势分析 列表
export function samplingList(params) {
return request({
url: path.samplingList,
method: 'post',
params
})
}
\ No newline at end of file
<template>
<div>
<div class="list">
<el-table
:data="tableData"
style="width: 100%"
:header-cell-style="{ background: '#EAF1FE', color: '#666666' }"
>
<el-table-column type="index" label="序号" width="100" align="center" />
<el-table-column
prop="equipCode"
label="设备编号"
align="center"
/>
<el-table-column
prop="addResult"
label="操作回执"
align="center"
/>
<el-table-column
prop="addLog"
label="操作日志"
align="center"
/>
<el-table-column
prop="addTime"
label="添加时间"
align="center"
/>
<el-table-column label="操作" align="center" width="100">
<template slot-scope="scope">
<el-button type="text" @click="confirmAlarm(scope.row)"
>详情</el-button
>
</template>
</el-table-column>
</el-table>
<Pagination
:limit="params.size"
:page="params.current"
:total="total"
class="pagination"
@pagination="handlePageChange"
/>
</div>
</div>
</template>
<script>
import { autoList } from "../api.js";
export default {
data() {
return {
tableData: [],
params: {
current: 1,
size: 10,
},
total: 10,
};
},
mounted() {
this.handleAutoList();
},
methods: {
async handleAutoList() {
let res = await autoList(this.params);
this.tableData = res.records;
this.total = res.total;
},
handlePageChange(pageData) {
this.params.size = pageData.size;
this.params.current = pageData.page;
this.handleAutoList();
},
},
};
</script>
<style lang="scss" scoped>
</style>
\ No newline at end of file
...@@ -8,7 +8,12 @@ ...@@ -8,7 +8,12 @@
@click="getInit" @click="getInit"
>刷新</el-button >刷新</el-button
> >
<el-button type="primary" icon="el-icon-search" @click="isQuery = !isQuery">查询</el-button> <el-button
type="primary"
icon="el-icon-search"
@click="isQuery = !isQuery"
>查询</el-button
>
</div> </div>
<el-form <el-form
v-show="isQuery" v-show="isQuery"
...@@ -130,24 +135,32 @@ ...@@ -130,24 +135,32 @@
align="center" align="center"
/> />
<el-table-column <el-table-column
prop="confirmTime" prop="reportTime"
label="采集时间" label="采集时间"
width="180" width="180"
align="center" align="center"
/> />
<el-table-column label="操作" align="center" width="100"> <el-table-column label="操作" align="center" width="100">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button type="text" @click="confirmAlarm(scope.row)" <el-button type="text" @click="handleView(scope.row)"
>详情</el-button >详情</el-button
> >
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<Pagination
:limit="params.size"
:page="params.current"
:total="total"
class="pagination"
@pagination="handlePageChange"
/>
</div> </div>
</div> </div>
</template> </template>
<script> <script>
import { waveStatistics, samplingList } from "../api.js";
export default { export default {
data() { data() {
return { return {
...@@ -156,10 +169,52 @@ export default { ...@@ -156,10 +169,52 @@ export default {
value: "", value: "",
options: [], options: [],
tableData: [], tableData: [],
isQuery:false, isQuery: false,
params: {
current: 1,
size: 10,
},
total: 10,
}; };
}, },
mounted() {
this.handleWaveStatistics();
this.handleSamplingList();
},
methods: { methods: {
handleView(){},
formatDate(date) {
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, "0");
const day = String(date.getDate()).padStart(2, "0");
const hours = String(date.getHours()).padStart(2, "0");
const minutes = String(date.getMinutes()).padStart(2, "0");
const seconds = String(date.getSeconds()).padStart(2, "0");
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
},
async handleWaveStatistics() {
let data = {
startDate: "",
endDate: "",
};
if (!this.dateRange.length) {
data.startDate = this.formatDate(
new Date(new Date().getTime() - 3600 * 1000 * 24 * 7)
);
data.endDate = this.formatDate(new Date());
}
let res = await waveStatistics(data);
},
async handleSamplingList() {
let res = await samplingList(this.params);
this.tableData = res.records;
this.total = res.total;
},
handlePageChange(pageData) {
this.params.size = pageData.size;
this.params.current = pageData.page;
this.handleSamplingList();
},
getInit() {}, getInit() {},
reset() {}, reset() {},
toSearch() {}, toSearch() {},
......
...@@ -73,7 +73,7 @@ export default { ...@@ -73,7 +73,7 @@ export default {
this.handleSelectFeederPage(); this.handleSelectFeederPage();
}, },
async handleSelectFeederPage() { async handleSelectFeederPage() {
let res = await selectFeederPage({}); let res = await selectFeederPage(this.params);
this.tableData = res.records; this.tableData = res.records;
this.total = res.total; this.total = res.total;
}, },
......
...@@ -8,12 +8,14 @@ function resolve(dir) { ...@@ -8,12 +8,14 @@ function resolve(dir) {
const name = defaultSettings.title || '漏缆故障定位监测系统' // page title const name = defaultSettings.title || '漏缆故障定位监测系统' // page title
const port = process.env.port || process.env.npm_config_port || 8886 // dev port const port = process.env.port || process.env.npm_config_port || 8886 // dev port
const href = 'http://101.126.159.207'
// const href = 'http://192.168.0.121'
const rewriteDefaultConfig = { const rewriteDefaultConfig = {
changeOrigin: true, changeOrigin: true,
target: 'http://101.126.159.207:8886', target: href + ':8886',
// target: 'http://192.168.0.127:8886', // target: 'http://192.168.0.121:8886',
// ws: true, // ws: true,
headers: { headers: {
referer: 'laddercloud.cn' referer: 'laddercloud.cn'
...@@ -21,19 +23,9 @@ const rewriteDefaultConfig = { ...@@ -21,19 +23,9 @@ const rewriteDefaultConfig = {
} }
const rewriteDeviceConfig = { const rewriteDeviceConfig = {
changeOrigin: true, changeOrigin: true,
target: 'http://101.126.159.207:8087', target: href + ':8087',
// target: 'http://192.168.0.127:8886', // target: 'http://192.168.0.121:8087',
// ws: true,
headers: {
referer: 'laddercloud.cn'
},
}
const rewriteAdminConfig = {
changeOrigin: true,
target: 'http://101.126.159.207:8887',
// target: 'http://192.168.0.127:8886',
// ws: true, // ws: true,
headers: { headers: {
referer: 'laddercloud.cn' referer: 'laddercloud.cn'
...@@ -57,7 +49,6 @@ module.exports = { ...@@ -57,7 +49,6 @@ module.exports = {
proxy: { proxy: {
'/api': rewriteDefaultConfig, '/api': rewriteDefaultConfig,
'/device': rewriteDeviceConfig, '/device': rewriteDeviceConfig,
'/xxl-job-admin': rewriteAdminConfig
}, },
}, },
configureWebpack: { configureWebpack: {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment