Compare commits

...

8 Commits

Author SHA1 Message Date
ruyaxie aca2cb1ed3 Merge remote-tracking branch 'origin/master' 2024-10-10 10:12:26 +08:00
ruyaxie 78006d326f feat():修复预警信息 2024-10-10 10:07:13 +08:00
王鑫 d04736a169 feat():添加登录公司下拉框 2024-10-10 09:59:27 +08:00
ruyaxie 76637ae46d feat():修复预警信息 2024-10-07 09:57:43 +08:00
xieyaru070903 051447962b Merge pull request 'feat():修复车辆管理前台' (#2) from dev.warn into master
Reviewed-on: #2
2024-09-26 11:58:06 +08:00
ruyaxie 587bd79d81 feat():修复车辆管理前台 2024-09-26 11:57:10 +08:00
xieyaru070903 b544fd0e3b Merge pull request 'fix() : 优化代码' (#1) from dev.car into master
Reviewed-on: #1
2024-09-25 09:02:39 +08:00
Li HD b285cbef7e fix() : 优化代码 2024-09-24 00:13:10 +08:00
13 changed files with 221 additions and 203 deletions

View File

@ -3,7 +3,7 @@ import request from '@/utils/request'
// 查询车辆基础信息列表
export function listCar(query) {
return request({
url: '/car/car/list',
url: '/saas/car/list',
method: 'get',
params: query
})
@ -12,7 +12,7 @@ export function listCar(query) {
// 查询车辆基础信息详细
export function getCar(id) {
return request({
url: '/car/car/' + id,
url: '/saas/car/' + id,
method: 'get'
})
}
@ -20,7 +20,7 @@ export function getCar(id) {
// 新增车辆基础信息
export function addCar(data) {
return request({
url: '/car/car',
url: '/saas/car',
method: 'post',
data: data
})
@ -29,7 +29,7 @@ export function addCar(data) {
// 修改车辆基础信息
export function updateCar(data) {
return request({
url: '/car/car',
url: '/saas/car',
method: 'put',
data: data
})
@ -38,16 +38,7 @@ export function updateCar(data) {
// 删除车辆基础信息
export function delCar(id) {
return request({
url: '/car/car/' + id,
url: '/saas/car/' + id,
method: 'delete'
})
}
// 查询所有车辆类型
export function getSysType() {
return request({
url: '/car/sysType/list' ,
method: 'get'
})
}

View File

@ -3,7 +3,7 @@ import request from '@/utils/request'
// 报文模版列表
export function templateList() {
return request({
url: 'car/messageTemplate/list',
url: 'saas/messageTemplate/list',
method: 'POST',
})
}
@ -11,7 +11,7 @@ export function templateList() {
//添加报文模版
export function addTemplate(data) {
return request({
url: 'car/messageTemplate/',
url: 'saas/messageTemplate/',
method: 'POST',
data: data
})
@ -20,7 +20,7 @@ export function addTemplate(data) {
// 报文数据列表
export function valueList(data) {
return request({
url: 'car/messageValue/list',
url: 'saas/messageValue/list',
method: 'POST',
data: data
})
@ -29,16 +29,8 @@ export function valueList(data) {
// 添加报文数据
export function addValue(data) {
return request({
url: 'car/messageValue/',
url: 'saas/messageValue/',
method: 'POST',
data: data
})
}
// 根据报文模版类型Id查询数据
export function findByTemplateValue(id) {
return request({
url: 'car/messageValue/templateId/'+id,
method: 'POST'
})
}

View File

@ -0,0 +1,10 @@
import request from "@/utils/request";
//查询所有的车辆类型
export function listType(){
return request({
url: '/saas/sysType/list',
method: 'get'
})
}

View File

@ -2,7 +2,7 @@ import request from '@/utils/request'
// 登录方法
export function login(username, password, code, uuid) {
export function login(username, password,firmId, code, uuid) {
return request({
url: '/auth/login',
headers: {
@ -10,7 +10,7 @@ export function login(username, password, code, uuid) {
repeatSubmit: false
},
method: 'post',
data: {username, password, code, uuid}
data: {username, password,firmId, code, uuid}
})
}

View File

@ -3,7 +3,7 @@ import request from '@/utils/request'
// 查询预警日志列表
export function listLogs(query) {
return request({
url: '/warn/logs/list',
url: '/saas/logs/list',
method: 'get',
params: query
})
@ -12,7 +12,7 @@ export function listLogs(query) {
// 查询预警日志详细
export function getLogs(id) {
return request({
url: '/warn/logs/' + id,
url: '/saas/logs/' + id,
method: 'get'
})
}
@ -20,7 +20,7 @@ export function getLogs(id) {
// 新增预警日志
export function addLogs(data) {
return request({
url: '/warn/logs',
url: '/saas/logs',
method: 'post',
data: data
})
@ -29,7 +29,7 @@ export function addLogs(data) {
// 修改预警日志
export function updateLogs(data) {
return request({
url: '/warn/logs',
url: '/saas/logs',
method: 'put',
data: data
})
@ -38,7 +38,7 @@ export function updateLogs(data) {
// 删除预警日志
export function delLogs(id) {
return request({
url: '/warn/logs/' + id,
url: '/saas/logs/' + id,
method: 'delete'
})
}

View File

@ -3,7 +3,7 @@ import request from '@/utils/request'
// 查询预警规则列表
export function listRule(query) {
return request({
url: '/warn/rule/list',
url: '/saas/rule/list',
method: 'get',
params: query
})
@ -12,7 +12,7 @@ export function listRule(query) {
// 查询预警规则详细
export function getRule(id) {
return request({
url: '/warn/rule/' + id,
url: '/saas/rule/' + id,
method: 'get'
})
}
@ -20,7 +20,7 @@ export function getRule(id) {
// 新增预警规则
export function addRule(data) {
return request({
url: '/warn/rule',
url: '/saas/rule',
method: 'post',
data: data
})
@ -29,7 +29,7 @@ export function addRule(data) {
// 修改预警规则
export function updateRule(data) {
return request({
url: '/warn/rule',
url: '/saas/rule',
method: 'put',
data: data
})
@ -38,7 +38,7 @@ export function updateRule(data) {
// 删除预警规则
export function delRule(id) {
return request({
url: '/warn/rule/' + id,
url: '/saas/rule/' + id,
method: 'delete'
})
}

View File

@ -1,17 +1,10 @@
import request from '@/utils/request'
// //根据车辆类型
// export function findBySysTypeId(id) {
// return request({
// url: 'car/sysType/findBySysTypeId/' + id,
// method: "POST"
// })
// }
// 查询预警策略列表
export function listStrategy(query) {
return request({
url: '/warn/strategy/list',
url: '/saas/strategy/list',
method: 'get',
params: query
})
@ -20,7 +13,7 @@ export function listStrategy(query) {
// 查询预警策略详细
export function getStrategy(id) {
return request({
url: '/warn/strategy/' + id,
url: '/saas/strategy/' + id,
method: 'get'
})
}
@ -28,7 +21,7 @@ export function getStrategy(id) {
// 新增预警策略
export function addStrategy(data) {
return request({
url: '/warn/strategy',
url: '/saas/strategy',
method: 'post',
data: data
})
@ -37,7 +30,7 @@ export function addStrategy(data) {
// 修改预警策略
export function updateStrategy(data) {
return request({
url: '/warn/strategy',
url: '/saas/strategy',
method: 'put',
data: data
})
@ -46,15 +39,7 @@ export function updateStrategy(data) {
// 删除预警策略
export function delStrategy(id) {
return request({
url: '/warn/strategy/' + id,
url: '/saas/strategy/' + id,
method: 'delete'
})
}

View File

@ -0,0 +1,10 @@
import request from '@/utils/request'
// 查询用户列表
export function firmList() {
return request({
url: '/system/sysFirm/firmList',
method: 'get'
})
}

View File

@ -40,10 +40,11 @@ const user = {
Login({commit}, userInfo) {
const username = userInfo.username.trim()
const password = userInfo.password
const firmId = userInfo.firmId;
const code = userInfo.code
const uuid = userInfo.uuid
return new Promise((resolve, reject) => {
login(username, password, code, uuid).then(res => {
login(username, password,firmId, code, uuid).then(res => {
let data = res.data
setToken(data.access_token)
commit('SET_TOKEN', data.access_token)

View File

@ -1,6 +1,6 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="82px">
<el-form-item label="车辆VIN码" prop="carVin">
<el-input
v-model="queryParams.carVin"
@ -40,7 +40,8 @@
size="mini"
@click="handleAdd"
v-hasPermi="['car:car:add']"
>新增</el-button>
>新增
</el-button>
</el-col>
<el-col :span="1.5">
<el-button
@ -51,7 +52,8 @@
:disabled="single"
@click="handleUpdate"
v-hasPermi="['car:car:edit']"
>修改</el-button>
>修改
</el-button>
</el-col>
<el-col :span="1.5">
<el-button
@ -62,7 +64,8 @@
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['car:car:remove']"
>删除</el-button>
>删除
</el-button>
</el-col>
<el-col :span="1.5">
<el-button
@ -72,7 +75,8 @@
size="mini"
@click="handleExport"
v-hasPermi="['car:car:export']"
>导出</el-button>
>导出
</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
@ -82,13 +86,9 @@
<el-table-column label="自增主键" align="center" prop="id"/>
<el-table-column label="车辆VIN码" align="center" prop="carVin"/>
<el-table-column label="车辆车牌号" align="center" prop="carPlate"/>
<el-table-column label="车辆品牌;" align="center" prop="carBrand" />
<el-table-column label="车辆品牌" align="center" prop="carBrand"/>
<el-table-column label="车辆型号" align="center" prop="carModel"/>
<el-table-column label="车辆车型" align="center" prop="carType"/>
<el-table-column label="车辆电机厂商" align="center" prop="carMotorManufacturer" />
<el-table-column label="电机型号" align="center" prop="carMotorModel" />
<el-table-column label="车辆电池厂商" align="center" prop="carBatteryManufacturer" />
<el-table-column label="电池型号" align="center" prop="carBatteryModel" />
<el-table-column label="围栏组编码" align="center" prop="groupCode"/>
<el-table-column label="启用状态" align="center" prop="state"/>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
@ -99,21 +99,22 @@
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['car:car:edit']"
>修改</el-button>
>修改
</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['car:car:remove']"
>删除</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-plus"
@click="handleAddStrategy(scope.row)"
v-hasPermi="['car:car:add']"
>添加策略信息</el-button>
>删除
</el-button>
<!-- <el-button-->
<!-- size="mini"-->
<!-- type="text"-->
<!-- icon="el-icon-s-order"-->
<!-- @click="handleAddStrategy(scope.row)"-->
<!-- >详细信息</el-button>-->
</template>
</el-table-column>
</el-table>
@ -128,24 +129,28 @@
<!-- 添加或修改车辆基础信息对话框 -->
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form ref="form" :model="form" :rules="rules" label-width="82px">
<el-form-item label="车辆VIN码" prop="carVin">
<el-input v-model="form.carVin" placeholder="请输入车辆VIN码"/>
</el-form-item>
<el-form-item label="车辆车牌号" prop="carPlate">
<el-input v-model="form.carPlate" placeholder="请输入车辆车牌号"/>
</el-form-item>
<el-form-item label="车辆电机厂商" prop="carMotorManufacturer">
<el-input v-model="form.carMotorManufacturer" placeholder="请输入车辆电机厂商" />
<el-form-item label="车辆品牌" prop="carBrand">
<el-input v-model="form.carBrand" placeholder="请输入车辆品牌"/>
</el-form-item>
<el-form-item label="电机型号" prop="carMotorModel">
<el-input v-model="form.carMotorModel" placeholder="请输入电机型号" />
<el-form-item label="车辆型号" prop="carModel">
<el-input v-model="form.carModel" placeholder="请输入车辆型号"/>
</el-form-item>
<el-form-item label="车辆电池厂商" prop="carBatteryManufacturer">
<el-input v-model="form.carBatteryManufacturer" placeholder="请输入车辆电池厂商" />
</el-form-item>
<el-form-item label="电池型号" prop="carBatteryModel">
<el-input v-model="form.carBatteryModel" placeholder="请输入电池型号" />
<el-form-item label="车辆车型" prop="carType">
<el-select v-model="form.carType" placeholder="请选择报文模版id" :change="getCarTypeList">
<el-option
v-for="item in sysCarType"
:key="item.id"
:label="item.sysTypeName"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="围栏组编码" prop="groupCode">
<el-input v-model="form.groupCode" placeholder="请输入围栏组编码"/>
@ -156,35 +161,19 @@
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容"/>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
<!-- 添加预警策略对话框 -->
<el-dialog :title="title" :visible.sync="beginOpen" width="500px" append-to-body>
<el-form ref="formList" :model="formList" :rules="rules" label-width="80px">
<el-form-item label="车辆类型id" prop="carTypeId">
<el-input v-model="formList.carTypeId" placeholder="请输入车辆类型id" />
</el-form-item>
<el-form-item label="报文模版id" prop="msgId">
<el-select v-model="formList.msgId" placeholder="请选择报文模版id">
<el-form-item label="策略信息" prop="strategyId">
<el-select v-model="form.msgId" placeholder="请选择报文模版id">
<el-option
v-for="item in templateList"
:key="item.messageTemplateId"
:label="item.messageTemplateName"
:value="item.messageTemplateId">
v-for="item in strategyList"
:key="item.id"
:label="item.strategyName"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="策略名称" prop="strategyName">
<el-input v-model="formList.strategyName" placeholder="请输入策略名称" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitAddForm"> </el-button>
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
@ -194,8 +183,8 @@
<script>
import {listCar, getCar, delCar, addCar, updateCar} from "/src/api/car/car";
import {templateList} from "@/api/car/message/template";
import {addStrategy} from "@/api/platform/strategy";
import {addStrategy, listStrategy} from "@/api/platform/strategy";
import {listType} from "@/api/car/type";
export default {
name: "Car",
@ -216,6 +205,8 @@ export default {
//
carList: [],
templateList: [],
//
sysCarType: [],
//
title: "",
//
@ -233,15 +224,25 @@ export default {
state: null,
},
//
form: {},
form: {
carVin: null,
carPlate: null,
carBrand: null,
carModel: null,
carType: null,
groupCode: null,
state: null,
remark: null,
msgId: null
},
formList: {},
//
rules: {
}
rules: {}
};
},
created() {
this.getList();
this.getListType();
},
methods: {
/** 查询车辆基础信息列表 */
@ -253,6 +254,11 @@ export default {
this.loading = false;
});
},
getListType() {
listType().then(res => {
this.sysCarType = res.data.rows;
})
},
//
cancel() {
this.open = false;
@ -267,12 +273,6 @@ export default {
carBrand: null,
carModel: null,
carType: null,
carLastJoinTime: null,
carLastOfflineTime: null,
carMotorManufacturer: null,
carMotorModel: null,
carBatteryManufacturer: null,
carBatteryModel: null,
groupCode: null,
state: null,
createBy: null,
@ -281,7 +281,6 @@ export default {
updateTime: null,
remark: null
};
this.resetForm("form");
},
//
@ -315,21 +314,11 @@ export default {
this.open = true;
this.title = "添加车辆基础信息";
},
/** 添加策略信息按钮 **/
handleAddStrategy(row) {
this.init();
const id = row.id || this.ids
getCar(id).then(response => {
this.formList.carTypeId = response.data.id;
this.beginOpen = true;
this.title ="添加策略信息";
});
templateList().then(response => {
this.templateList = response.data;
console.log(this.templateList);
});
/** 离焦获取策略信息 **/
getCarTypeList(carType) {
listStrategy({sysTypeId: carType}).then(res => {
this.strategyList = res.data;
})
},
/** 修改按钮操作 */
handleUpdate(row) {
@ -339,8 +328,14 @@ export default {
this.form = response.data;
this.open = true;
this.title = "修改车辆基础信息";
this.listStrategy(response.data.carType)
});
},
listStrategy(sysTypeId) {
listStrategy({sysTypeId: sysTypeId}).then(res => {
this.strategyList = res.data.rows;
})
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
@ -361,14 +356,7 @@ export default {
}
});
},
/** 添加策略信息**/
submitAddForm(){
addStrategy(this.formList).then(response => {
this.$modal.msgSuccess("添加策略信息成功");
this.beginOpen = false;
this.getList();
});
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids;
@ -377,9 +365,9 @@ export default {
}).then(() => {
this.getList();
this.$modal.msgSuccess("删除成功");
}).catch(() => {});
}).catch(() => {
});
},
/** 导出按钮操作 */
handleExport() {
this.download('car/car/export', {

View File

@ -2,6 +2,17 @@
<div class="login">
<el-form ref="loginForm" :model="loginForm" :rules="loginRules" class="login-form">
<h3 class="title">若依后台管理系统</h3>
<el-form-item prop="firmId">
<el-select v-model="loginForm.firmId" placeholder="请选择公司" style="width: 350px">
<el-option
v-for="item in firmList"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
<svg-icon slot="prefix" class="el-input__icon input-icon" icon-class="user"/>
</el-select>
</el-form-item>
<el-form-item prop="username">
<el-input
v-model="loginForm.username"
@ -65,11 +76,13 @@
import {getCodeImg} from "@/api/login";
import Cookies from "js-cookie";
import {decrypt, encrypt} from '@/utils/jsencrypt'
import { firmList } from '@/api/system/firm'
export default {
name: "Login",
data() {
return {
firmList: [],
codeUrl: "",
loginForm: {
username: "admin",
@ -91,7 +104,7 @@ export default {
//
captchaEnabled: false,
//
register: false,
register: true,
redirect: undefined
};
},
@ -106,8 +119,15 @@ export default {
created() {
this.getCode();
this.getCookie();
this.getFirmList();
},
methods: {
getFirmList(){
firmList().then(response => {
this.firmList = response.data;
console.log(this.firmList)
})
},
getCode() {
getCodeImg().then(res => {
this.captchaEnabled = res.data.captchaEnabled === undefined ? true : res.data.captchaEnabled;

View File

@ -33,22 +33,6 @@
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="最大值" prop="maxValue">
<el-input
v-model="queryParams.maxValue"
placeholder="请输入最大值"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="最小值" prop="minValue">
<el-input
v-model="queryParams.minValue"
placeholder="请输入最小值"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery"></el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery"></el-button>
@ -109,8 +93,9 @@
<el-table-column label="报文数据类型id" align="center" prop="msgTypeId" />
<el-table-column label="滑窗时间" align="center" prop="slideTime" />
<el-table-column label="滑窗频率" align="center" prop="slideFrequency" />
<el-table-column label="最大值" align="center" prop="maxValue" />
<el-table-column label="最小值" align="center" prop="minValue" />
<el-table-column label="数据频率名称" align="center" prop="slideData" />
<el-table-column label="数据频率最大值" align="center" prop="slideMaxNum" />
<el-table-column label="数据频率最小值" align="center" prop="slideMinNum" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
@ -148,8 +133,7 @@
v-for="item in strategyList"
:key="item.id"
:label="item.strategyName"
:value="item.id"
>
:value="item.id">
</el-option>
</el-select>
</el-form-item>
@ -157,14 +141,13 @@
<el-input v-model="form.ruleName" placeholder="请输入规则名称" />
</el-form-item>
<el-form-item label="报文数据类型id" prop="msgTypeId">
<el-select v-model="form.messageId" placeholder="请选择报文数据名称">
<el-select ref="select" v-model="form.msgTypeId" multiple placeholder="请选择报文数据名称">
<el-option
ref="multipleTable"
tooltip-effect="dark"
v-for="item in templateValueList"
:key="item.messageId"
:label="item.messageCode"
:value="item.messageId">
<el-checkbox @change="clickBox(item.messageId)" :value ="value.includes(item.messageId)" :label="item.messageCode"></el-checkbox>
</el-option>
</el-select>
</el-form-item>
@ -182,7 +165,16 @@
<el-option value="1:60">1:60</el-option>
</el-select>
</el-form-item>
<el-form-item label="数据频率名称" prop="slideData">
<el-input v-model="form.slideData" placeholder="请输入数据频率名称" />
</el-form-item>
<el-form-item label="数据频率最大值" prop="slideMaxNum">
<el-input v-model="form.slideMaxNum" placeholder="请输入数据频率最大值" />
</el-form-item>
<el-form-item label="数据频率最小值" prop="slideMinNum">
<el-input v-model="form.slideMinNum" placeholder="请输入数据频率最小值" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
@ -196,6 +188,7 @@
import { listRule, getRule, delRule, addRule, updateRule } from "/src/api/platform/rule";
import { listStrategy} from "@/api/platform/strategy";
import {valueList} from "@/api/car/message/template";
import item from "@/layout/components/Sidebar/Item.vue";
export default {
name: "Rule",
@ -209,8 +202,10 @@ export default {
single: true,
//
multiple: true,
props: { multiple: true },
//
showSearch: true,
//
total: 0,
//
@ -219,6 +214,7 @@ export default {
sysTypeList :[],
//
templateValueList:[],
value:[],
//
templateList :[],
@ -234,6 +230,8 @@ export default {
title: "",
//
open: false,
//
drawer:false,
//
queryParams: {
pageNum: 1,
@ -243,8 +241,9 @@ export default {
msgTypeId: null,
slideTime: null,
slideFrequency: null,
maxValue: null,
minValue: null
slideData:null,
slideMaxNum: null,
slideMinNum: null
},
//
form: {},
@ -257,6 +256,27 @@ export default {
this.getList();
},
methods: {
clickBox(val) {
console.log('val::', val);
let values = this.value
if(values.includes(val)) {
this.value = values.filter(n => n !== val)
} else {
values.push(val)
this.value = values
}
console.log('this.value::', this.value)
this.value.forEach((item,index)=>{
// console.log("item:"+item);
// console.log("index"+index);
this.form.msgTypeId += ","+item;
})
console.log(this.form.msgTypeId.substring(1));
},
/** 查询预警规则列表 */
getList() {
this.loading = true;
@ -280,8 +300,9 @@ export default {
msgTypeId: null,
slideTime: null,
slideFrequency: null,
maxValue: null,
minValue: null
slideData:null,
slideMaxNum: null,
slideMinNum: null
};
this.resetForm("form");
},

View File

@ -35,7 +35,7 @@ module.exports = {
proxy: {
// detail: https://cli.vuejs.org/config/#devserver-proxy
[process.env.VUE_APP_BASE_API]: {
target: `http://localhost:8080`,
target: `http://localhost:18080`,
changeOrigin: true,
pathRewrite: {
['^' + process.env.VUE_APP_BASE_API]: ''