页面代码优化,代办事项列表和代办审核

This commit is contained in:
2023-08-14 14:27:01 +08:00
parent f860f9784e
commit f24b5feab2
10 changed files with 233 additions and 150 deletions

84
package-lock.json generated
View File

@ -2030,6 +2030,49 @@
"webpack-merge": "^5.7.3", "webpack-merge": "^5.7.3",
"webpack-virtual-modules": "^0.4.2", "webpack-virtual-modules": "^0.4.2",
"whatwg-fetch": "^3.6.2" "whatwg-fetch": "^3.6.2"
},
"dependencies": {
"@vue/vue-loader-v15": {
"version": "npm:vue-loader@15.10.1",
"resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.10.1.tgz",
"integrity": "sha512-SaPHK1A01VrNthlix6h1hq4uJu7S/z0kdLUb6klubo738NeQoLbS6V9/d8Pv19tU0XdQKju3D1HSKuI8wJ5wMA==",
"dev": true,
"requires": {
"@vue/component-compiler-utils": "^3.1.0",
"hash-sum": "^1.0.2",
"loader-utils": "^1.1.0",
"vue-hot-reload-api": "^2.3.0",
"vue-style-loader": "^4.1.0"
},
"dependencies": {
"hash-sum": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz",
"integrity": "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==",
"dev": true
}
}
},
"json5": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
"integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
"dev": true,
"requires": {
"minimist": "^1.2.0"
}
},
"loader-utils": {
"version": "1.4.2",
"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz",
"integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==",
"dev": true,
"requires": {
"big.js": "^5.2.2",
"emojis-list": "^3.0.0",
"json5": "^1.0.1"
}
}
} }
}, },
"@vue/cli-shared-utils": { "@vue/cli-shared-utils": {
@ -2194,47 +2237,6 @@
} }
} }
}, },
"@vue/vue-loader-v15": {
"version": "npm:vue-loader@15.10.1",
"resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.10.1.tgz",
"integrity": "sha512-SaPHK1A01VrNthlix6h1hq4uJu7S/z0kdLUb6klubo738NeQoLbS6V9/d8Pv19tU0XdQKju3D1HSKuI8wJ5wMA==",
"dev": true,
"requires": {
"@vue/component-compiler-utils": "^3.1.0",
"hash-sum": "^1.0.2",
"loader-utils": "^1.1.0",
"vue-hot-reload-api": "^2.3.0",
"vue-style-loader": "^4.1.0"
},
"dependencies": {
"hash-sum": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz",
"integrity": "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==",
"dev": true
},
"json5": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
"integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
"dev": true,
"requires": {
"minimist": "^1.2.0"
}
},
"loader-utils": {
"version": "1.4.2",
"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz",
"integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==",
"dev": true,
"requires": {
"big.js": "^5.2.2",
"emojis-list": "^3.0.0",
"json5": "^1.0.1"
}
}
}
},
"@vue/web-component-wrapper": { "@vue/web-component-wrapper": {
"version": "1.3.0", "version": "1.3.0",
"resolved": "https://registry.npmjs.org/@vue/web-component-wrapper/-/web-component-wrapper-1.3.0.tgz", "resolved": "https://registry.npmjs.org/@vue/web-component-wrapper/-/web-component-wrapper-1.3.0.tgz",

View File

@ -1,13 +1,36 @@
import request from '@/utils/http' import request from '@/utils/http'
// 预计费用计算 // 代办事项列表
export function getToDoList() { export function getToDoList() {
return request({ return request({
url: '/supplierAppV2/dispatchApp/toDoMessage/toDoList', url: '/supplierAppV2/dispatchApp/toDoMessage/toDoList',
method: 'POST', method: 'POST',
// withCredentials: true
// contentType: 'application/json',
// data
}) })
} }
// 代办事项审核
export function toDoAudit(data){
return request({
url:'/supplierAppV2/dispatchApp/toDoMessage/toDoAudit',
method:'POST',
contentType: 'application/json',
data
})
}
// 工单详情
export function getOrderDetail(data){
return request({
url:'/supplierAppV2/dispatchApp/order/getOrderDetail',
method:'POST',
contentType:'application/json',
data
})
}
// 工单报备
export function orderReporting(data){
return request({
url:'/supplierAppV2/dispatchApp/order/orderReporting',
method:'POST',
contentType:'application/json',
data
})
}

View File

@ -39,25 +39,28 @@ export default {
} }
</script> </script>
<style scoped> <style scoped lang="scss">
@import "@/styles/mixin.scss";
::v-deep .van-cell{ ::v-deep .van-cell{
padding:0 25px 0 0; padding:0 25px 0 0;
line-height: 57px; line-height: 57px;
} }
::v-deep .van-cell--required::before{ ::v-deep .van-cell--required::before{
background-image: url("@/assets/start.png"); content:'';
background-repeat: no-repeat; background: url("@/assets/start.png") no-repeat center/cover;
position: absolute; position: absolute;
left: 0; left: 0;
top: 25px; top: 45%;
width: 8px; transform: translateY(-50%);
height: 8px; @include widHeiMar(6px,6px,3px);
margin-right: 3px;
content:''
} }
::v-deep .van-field__label{ ::v-deep .van-field__label{
@include fontWeightSize(500,14px);
color: #323643; color: #323643;
margin-left: 20px; margin-left: 10px;
}
::v-deep .van-field__control{
color: #323643;
@include fontWeightSize(500,13px);
} }
</style> </style>

View File

@ -31,13 +31,13 @@ export default {
<style scoped lang="scss"> <style scoped lang="scss">
@import "@/styles/mixin.scss"; @import "@/styles/mixin.scss";
@import "@/styles/common.scss";
.btn{ .btn{
@include flexColBet; @include flexColBet;
button{ button{
@include whLin(152px,39px); @include whLin(152px,39px);
border-radius: 5px; border-radius: 5px;
color: #FFFFFF; color: #FFFFFF;
border: none;
@include fontWeightSize(500,14px) @include fontWeightSize(500,14px)
} }
.cancel{ .cancel{

View File

@ -1,3 +1,17 @@
input{
border: none;
}
button{
border: none;
}
select{
background-color: transparent; /* 设置透明背景色 */
border: none; /* 取消边框 */
outline: none;
/* 右侧添加箭头的背景图 自行调整位置 */
//background: url('@/assets/copy.png') 20px center no-repeat #fff;
}
.van-toast--html, .van-toast--text { .van-toast--html, .van-toast--text {
z-index: 100000000002 !important; z-index: 100000000002 !important;
} }

View File

@ -2,11 +2,10 @@ import axios from "axios";
import qs from 'qs' import qs from 'qs'
import { Toast } from 'vant' import { Toast } from 'vant'
console.log('process.env.VUE_APP_BASE_API', process.env.VUE_APP_BASE_API) // console.log('process.env.VUE_APP_BASE_API', process.env.VUE_APP_BASE_API)
const service = axios.create({ const service = axios.create({
// baseURL: process.env.VUE_APP_BASE_API, baseURL: process.env.VUE_APP_BASE_API,
baseURL: 'https://api1.sino-assist.com/',
headers: { headers: {
Accept: 'application/json' Accept: 'application/json'
}, },
@ -17,7 +16,7 @@ service.interceptors.request.use(
config.data = config.contentType ? config.data : qs.stringify(config.data) config.data = config.contentType ? config.data : qs.stringify(config.data)
config.headers['Content-Type'] = config.contentType || 'application/x-www-form-urlencoded' config.headers['Content-Type'] = config.contentType || 'application/x-www-form-urlencoded'
// 在发送请求之前做一些操作如添加token到请求头 // 在发送请求之前做一些操作如添加token到请求头
const token='eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJzemwiLCJhdWQiOlsic3VwcGxpZXItYXBwIl0sIm5iZiI6MTY5MTU1NzIzNSwidXNlcl9pbmZvIjp7InVzZXJJZCI6NTQ1ODUsInBob25lIjoiMTc2MzAwMzU2NTgiLCJuYW1lIjoi5bCP5a6LIiwic3VwcGxpZXJOYW1lIjoi5LiK5rW35a6J55WFQSIsInN1cHBsaWVySWQiOjExMjgsInVzZXJuYW1lIjoic3psIiwidXNlclR5cGUiOiJBUFAiLCJhdXRob3JpdGllcyI6W119LCJzY29wZSI6WyJhbGwiXSwiaXNzIjoiaHR0cHM6Ly9zaW5vYXNzaXN0LmNvbSIsImV4cCI6MTY5MTY0MzYzNSwiaWF0IjoxNjkxNTU3MjM1fQ.S1AignpcnCxSrm3M8rzhCLYlgyqD2Hv-SPMqPLgqlt4' const token='eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJzemwiLCJhdWQiOlsic3VwcGxpZXItYXBwIl0sIm5iZiI6MTY5MTU1NzIzNSwidXNlcl9pbmZvIjp7InVzZXJJZCI6NTQ1ODUsInBob25lIjoiMTc2MzAwMzU2NTgiLCJuYW1lIjoi5bCP5a6LIiwic3VwcGxpZXJOYW1lIjoi5LiK5rW35a6J55WFQSIsInN1cHBsaWVySWQiOjExMjgsInVzZXJuYW1lIjoic3psIiwidXNlclR5cGUiOiJBUFAiLCJhdXRob3JpdGllcyI6W119LCJzY29wZSI6WyJhbGwiXSwiaXNzIjoiaHR0cHM6Ly9zaW5vYXNzaXN0LmNvbSIsImV4cCI6MTY5MTY0MzYzNSwiaWF0IjoxNjkxNTU3MjM1fQ.S1AignpcnCxSrm3M8rzhCLYlgyqD2Hv-SPMqPLgqlt4'
config.headers['Authorization'] = `${token}`; config.headers['Authorization'] = `${token}`;
/* if (getToken()) { /* if (getToken()) {
config.headers['token'] = getToken() config.headers['token'] = getToken()
@ -33,17 +32,18 @@ service.interceptors.request.use(
service.interceptors.response.use( service.interceptors.response.use(
response => { response => {
const res = response.data const res = response.data
console.log('rere', res) // console.log('rere', res)
if (res.code && (res.code != '00' && res.code != '105' )) { return res
Toast(res.msg || 'Error') // if (res.code && (res.code != '00' && res.code != '105' )) {
return Promise.reject(new Error(res.msg || 'Error')) // Toast(res.msg || 'Error')
} else { // return Promise.reject(new Error(res.msg || 'Error'))
if( res.code === 0 ) { // } else {
return res.result // if( res.code === 0 ) {
} else { // return res.result
return res.data // } else {
} // return res.data
} // }
// }
}, },
error => { error => {
console.log('err' + error) console.log('err' + error)

View File

@ -1,45 +1,47 @@
<template> <template>
<div class="wrap"> <div class="wrap">
<cell-group label="测试" placeholder="请输入测试内容" v-model="name"/> <cell-group label="司机姓名" placeholder="请输入司机姓名" @input="getName(name)" v-model="name"/>
<div class="itemContent"> <cell-group label="手机号码" placeholder="请输入手机号" @input="getPhone(phone)" v-model="phone"/>
<div class="titleType"> <cell-group label="身份证号" placeholder="请输入身份证号" @input="getCarId(carId)" v-model="carId"/>
<img class="startImg" src="@/assets/start.png" /> <!-- <div class="itemContent">-->
<span>司机姓名</span> <!-- <div class="titleType">-->
</div> <!-- <img class="startImg" src="@/assets/start.png" />-->
<div class="checkContent"> <!-- <span>司机姓名</span>-->
<input placeholder="请输入司机姓名" /> <!-- </div>-->
</div> <!-- <div class="checkContent">-->
</div> <!-- <input placeholder="请输入司机姓名" />-->
<div class="lineBot"></div> <!-- </div>-->
<div class="itemContent"> <!-- </div>-->
<div class="titleType"> <!-- <div class="lineBot"></div>-->
<img class="startImg" src="@/assets/start.png" /> <!-- <div class="itemContent">-->
<span>手机号码</span> <!-- <div class="titleType">-->
</div> <!-- <img class="startImg" src="@/assets/start.png" />-->
<div class="checkContent"> <!-- <span>手机号码</span>-->
<input placeholder="请输入手机号码" /> <!-- </div>-->
</div> <!-- <div class="checkContent">-->
</div> <!-- <input placeholder="请输入手机号码" />-->
<div class="lineBot"></div> <!-- </div>-->
<div class="itemContent"> <!-- </div>-->
<div class="titleType"> <!-- <div class="lineBot"></div>-->
<img class="startImg" src="@/assets/start.png" /> <!-- <div class="itemContent">-->
<span>身份证号</span> <!-- <div class="titleType">-->
</div> <!-- <img class="startImg" src="@/assets/start.png" />-->
<div class="checkContent"> <!-- <span>身份证号</span>-->
<input placeholder="请输入身份证号" /> <!-- </div>-->
</div> <!-- <div class="checkContent">-->
</div> <!-- <input placeholder="请输入身份证号" />-->
<div class="lineBot"></div> <!-- </div>-->
<!-- </div>-->
<!-- <div class="lineBot"></div>-->
<div class="itemContent"> <div class="itemContent">
<div class="titleType"> <div class="titleType">
<img class="startImg" src="@/assets/start.png" /> <img class="startImg" src="@/assets/start.png" />
<span>准驾车型</span> <span>准驾车型</span>
</div> </div>
<select id="myDropdown" @change="handleSelectChange()" style="border: none"> <select id="mySelect" class="chosen-select" style="width: 44px">
<option value="option1">C1</option> <option value="C1">C1</option>
<option value="option2">C2</option> <option value="C2">C2</option>
<option value="option3">C3</option> <option value="C3">C3</option>
</select> </select>
</div> </div>
<div class="lineBot"></div> <div class="lineBot"></div>
@ -82,11 +84,21 @@ export default {
data(){ data(){
return{ return{
name:"", name:"",
phone:"",
carId:"",
radio:'启用', radio:'启用',
activeIcon: require('@/assets/check.png'), activeIcon: require('@/assets/check.png'),
inactiveIcon: require('@/assets/uncheck.png') inactiveIcon: require('@/assets/uncheck.png')
} }
}, },
mounted() {
console.log("radio",this.radio)
const selectElement = document.getElementById('mySelect');
selectElement.addEventListener('change', function() {
const selectedValue = selectElement.value;
console.log('Selected value:', selectedValue);
});
},
methods:{ methods:{
isUse(e){ isUse(e){
console.log("是否启用",e) console.log("是否启用",e)
@ -96,6 +108,15 @@ export default {
}, },
submitBtn(){ submitBtn(){
console.log("提交司机") console.log("提交司机")
},
getName(e){
console.log("NAME",e);
},
getPhone(e){
console.log("phone",e);
},
getCarId(e){
console.log("car",e);
} }
}, },
components:{ components:{
@ -108,6 +129,7 @@ export default {
<style scoped lang="scss"> <style scoped lang="scss">
@import "@/styles/mixin.scss"; @import "@/styles/mixin.scss";
@import "@/styles/common.scss"; @import "@/styles/common.scss";
.wrap{ .wrap{
@include wh(100%,100%); @include wh(100%,100%);
box-sizing: border-box; box-sizing: border-box;
@ -141,6 +163,7 @@ export default {
@include fontWeightSize(500,13px); @include fontWeightSize(500,13px);
opacity: .5; opacity: .5;
} }
} }
.lineBot{ .lineBot{
@include wh(100%,1px); @include wh(100%,1px);

View File

@ -1,15 +1,15 @@
<template> <template>
<div class="wrap" > <div class="wrap" >
<ul id="dataList" class="dataList"> <ul id="dataList" class="dataList">
<li class="item" v-for="(item,i) in 4" :key="i"> <li class="item" v-for="(item,i) in todolist" :key="i">
<div class="left"> <div class="left">
<div class="repairName"><span class="name">维修申请</span><span class="carCode">苏AB6768</span></div> <div class="repairName"><span class="name">{{ item.toDoType.label }}</span><span class="carCode">{{item.plateNumber ? item.plateNumber : "无"}}</span></div>
<div class="addressName">苏州老张汽车修理厂</div> <div class="addressName">{{ item.address }}</div>
<div class="time">2023-05-12 12:30:30 张三</div> <div class="time">{{item.toDoTime}} &nbsp;&nbsp;{{item.userName}}</div>
</div> </div>
<div class="right"> <div class="right">
<button class="nopass" @click="noPass">不通过</button> <button class="nopass" @click="noPass(item)">不通过</button>
<button class="pass" @click="pass">通过</button> <button class="pass" @click="passThrough(item)">通过</button>
</div> </div>
</li> </li>
</ul> </ul>
@ -17,27 +17,38 @@
</template> </template>
<script> <script>
import {getToDoList} from "@/api/order" import {getToDoList,toDoAudit} from "@/api/order"
export default { export default {
name: "toDoList", name: "toDoList",
data(){ data(){
return{ return{
todolist:[],
} }
}, },
mounted() { mounted() {
this.getList() this.getList()
}, },
methods:{ methods:{
async getList(){ async getList(){
let result=await getToDoList() let result=await getToDoList();
console.log("result",result) if(result.code === 200){
this.todolist=result.data;
console.log("this.todolist",this.todolist)
}
}, },
noPass(){ async noPass(item){
console.log("不通过") let result=await toDoAudit({
toDoId:item.toDoId,
toDoType:item.toDoType.code
})
console.log("不通过",item,result)
}, },
pass(){ async passThrough(item){
console.log("通过") let result=await toDoAudit({
toDoId:item.toDoId,
toDoType:item.toDoType.code
})
console.log("通过",item,result)
} }
} }
} }
@ -45,9 +56,9 @@ export default {
<style scoped lang="scss"> <style scoped lang="scss">
@import "@/styles/mixin.scss"; @import "@/styles/mixin.scss";
@import "@/styles/common.scss";
.wrap { .wrap {
width: 100%; @include wh(100%,100%);
height: 100%;
box-sizing: border-box; box-sizing: border-box;
padding: 13px 13px 0 13px; padding: 13px 13px 0 13px;
background-color: #F4F5F7; background-color: #F4F5F7;
@ -59,8 +70,7 @@ export default {
.item { .item {
list-style: none; list-style: none;
display: flex; @include flexColBet;
justify-content: space-between;
margin-bottom: 10px; margin-bottom: 10px;
width: 100%; width: 100%;
background: #FFFFFF; background: #FFFFFF;
@ -106,10 +116,8 @@ button {
} }
.pass { .pass {
border: none;
border: 1px solid #2A5094 !important; border: 1px solid #2A5094 !important;
background: #2A5094; @include bgFontColor(white,#2A5094);
color: white;
} }

View File

@ -1,25 +1,26 @@
<template> <template>
<div class="wrap"> <div class="wrap">
<div class="addContentWrap"> <div class="addContentWrap">
<div class="itemContent"> <cell-group label="车牌号" placeholder="请输入车牌号" @input="getPLateNum(carNum)" v-model="carNum" />
<div class="titleType"> <!-- <div class="itemContent">-->
<img class="startImg" src="@/assets/start.png" /> <!-- <div class="titleType">-->
<span>车牌号</span> <!-- <img class="startImg" src="@/assets/start.png" />-->
</div> <!-- <span>车牌号</span>-->
<div class="checkContent"> <!-- </div>-->
<input placeholder="请输入车牌号" /> <!-- <div class="checkContent">-->
</div> <!-- <input placeholder="请输入车牌号" />-->
</div> <!-- </div>-->
<div class="lineBot"></div> <!-- </div>-->
<!-- <div class="lineBot"></div>-->
<div class="itemContent"> <div class="itemContent">
<div class="titleType"> <div class="titleType">
<img class="startImg" src="@/assets/start.png" /> <img class="startImg" src="@/assets/start.png" />
<span>车辆类型</span> <span>车辆类型</span>
</div> </div>
<select id="myDropdown" @change="handleSelectChange()"> <select id="mySelect" style="width: 80px">
<option value="option1">一般平板</option> <option value="一般平板">一般平板</option>
<option value="option2">小轿车</option> <option value="小轿车">小轿车</option>
<option value="option3">大卡车</option> <option value="大卡车">大卡车</option>
</select> </select>
</div> </div>
<div class="lineBot"></div> <div class="lineBot"></div>
@ -130,6 +131,7 @@
<script> <script>
import {myMixins} from "@/utils/myMixins" import {myMixins} from "@/utils/myMixins"
import TwoCommonBtn from "@/components/twoBtnCommon.vue" import TwoCommonBtn from "@/components/twoBtnCommon.vue"
import CellGroup from "@/components/cellGroup.vue";
export default { export default {
name: "vehicleAdd", name: "vehicleAdd",
mixins:[myMixins], mixins:[myMixins],
@ -139,10 +141,17 @@ export default {
radio2: '换胎', radio2: '换胎',
radio3:'参与', radio3:'参与',
activeIcon: require('@/assets/check.png'), activeIcon: require('@/assets/check.png'),
inactiveIcon: require('@/assets/uncheck.png') inactiveIcon: require('@/assets/uncheck.png'),
carNum:"",
} }
}, },
mounted() {
const selectElement = document.getElementById('mySelect');
selectElement.addEventListener('change', function() {
const selectedValue = selectElement.value;
console.log('Selected value:', selectedValue);
});
},
methods:{ methods:{
change(e) { change(e) {
console.log("拖车服务",e) console.log("拖车服务",e)
@ -158,9 +167,13 @@ export default {
}, },
submitBtn(){ submitBtn(){
console.log("提交车辆") console.log("提交车辆")
},
getPLateNum(e){
console.log("e",e)
} }
}, },
components:{ components:{
CellGroup,
TwoCommonBtn TwoCommonBtn
} }
} }
@ -209,9 +222,6 @@ export default {
background: #E9E9EA; background: #E9E9EA;
opacity: 0.6; opacity: 0.6;
} }
select{
border: none;
}
.serviceType{ .serviceType{
@include fontWeightSize(500,13px); @include fontWeightSize(500,13px);
margin-left: 15px; margin-left: 15px;

View File

@ -8,12 +8,12 @@ const name = '调度APP' // page title
module.exports = defineConfig({ module.exports = defineConfig({
transpileDependencies: true, transpileDependencies: true,
// 基本路径 // 基本路径
// publicPath: "./", // publicPath: "./",s
// publicPath: process.env.NODE_ENV === 'production' ? '/h5/rescue': '/dev/h5/rescue', // publicPath: process.env.NODE_ENV === 'production' ? '/h5/rescue': '/dev/h5/rescue',
// publicPath: process.env.NODE_ENV === 'production' , // publicPath: process.env.NODE_ENV === 'production' ,
// lintOnSave: process.env.NODE_ENV === 'development', // lintOnSave: process.env.NODE_ENV === 'development',
devServer: { devServer: {
https: true, https: false,
port: 8080, port: 8080,
// open: true, // open: true,
// disableHostCheck: true, // disableHostCheck: true,