19 Commits

Author SHA1 Message Date
aixianling
67b8108825 Merge remote-tracking branch 'gitee/master' 2024-11-07 11:52:31 +08:00
juanmao2009
90046641c0 !12 代码合并
Merge pull request !12 from juanmao2009/label
2024-11-07 03:16:10 +00:00
aixianling
e7f5670b72 新增图片翻译功能及多语言支持 2024-11-06 17:53:13 +08:00
yanran200830
510f3aa888 修复bug 2024-11-06 13:50:03 +08:00
juanmao2009
acbd7f6a86 !11 修改会员信息
Merge pull request !11 from juanmao2009/label
2024-11-06 02:52:47 +00:00
yanran200830
f3ad1604d8 修复金币充值bug 2024-11-06 10:50:12 +08:00
aixianling
b1d1f60f96 调整Home.vue页面布局和功能 2024-11-06 09:31:58 +08:00
aixianling
191edd1eb4 Merge remote-tracking branch 'gitee/master'
# Conflicts:
#	src/router/index.js
#	src/view/Home.vue
#	yarn.lock
2024-11-06 09:31:25 +08:00
juanmao2009
0cbe017a95 !10 调整文字
Merge pull request !10 from juanmao2009/label
2024-11-05 13:45:05 +00:00
liushiwei
b1abecfb29 调整 2024-11-05 21:44:30 +08:00
juanmao2009
2511778c9f !9 调整
Merge pull request !9 from juanmao2009/label
2024-11-05 13:29:24 +00:00
liushiwei
fea7848653 调整 2024-11-05 21:28:49 +08:00
juanmao2009
3cdaba63b7 !8 调整
Merge pull request !8 from juanmao2009/label
2024-11-05 13:28:27 +00:00
liushiwei
5ece8b562f 调整 2024-11-05 21:27:16 +08:00
juanmao2009
15614d9489 !7 标签管理
Merge pull request !7 from juanmao2009/label
2024-11-05 13:21:56 +00:00
liushiwei
7b43c97f5f Merge branch 'label' of https://gitee.com/three-make-money/temu-plugin into label 2024-11-05 21:20:17 +08:00
liushiwei
74043c55ae 调整 2024-11-05 21:20:05 +08:00
aixianling
f69c86f92b 管理权限统一 2024-11-05 09:35:31 +08:00
aixianling
c7cb7c103d 先提交一下,打个钉子 2024-11-04 17:47:02 +08:00
21 changed files with 460 additions and 300 deletions

View File

@@ -3,7 +3,7 @@
"version": "0.1.0", "version": "0.1.0",
"private": true, "private": true,
"scripts": { "scripts": {
"dev": "vue-cli-service --env.NODE_ENV=development build-watch --mode development", "dev": "vue-cli-service --env.NODE_ENV=development build-watch --mode development",
"build": "vue-cli-service build" "build": "vue-cli-service build"
}, },
"dependencies": { "dependencies": {
@@ -42,7 +42,7 @@
"eslint": "^7.32.0", "eslint": "^7.32.0",
"eslint-plugin-vue": "^8.0.3", "eslint-plugin-vue": "^8.0.3",
"javascript-obfuscator": "2.6.0", "javascript-obfuscator": "2.6.0",
"sass": "^1.68.0", "sass": "1.32.13",
"sass-loader": "^7.3.1", "sass-loader": "^7.3.1",
"vue-cli-plugin-chrome-extension-cli": "~1.1.4", "vue-cli-plugin-chrome-extension-cli": "~1.1.4",
"vue-template-compiler": "^2.6.14", "vue-template-compiler": "^2.6.14",

View File

@@ -18,7 +18,7 @@
] ]
}, },
"condition": { "condition": {
"urlFilter": "||xc.rqlis.com:888" "urlFilter": "||xc.rqlis.com"
} }
} }
] ]

View File

@@ -4,7 +4,7 @@ import store from '@/store'
var instance = axios.create({ var instance = axios.create({
baseURL: process.env.NODE_ENV === 'production' ? 'http://124.71.2.127:10248' : 'http://124.71.2.127:10248', baseURL: process.env.NODE_ENV === 'production' ? 'http://temu.jjcp52.com' : 'http://124.71.2.127:10248',
timeout: 50000, timeout: 50000,
validateStatus: function (status) { validateStatus: function (status) {
return status < 500 return status < 500

View File

@@ -11,12 +11,11 @@
url('https://at.alicdn.com/t/font_1995974_ihzpmuv4lpk.svg#iconfont') format('svg'); url('https://at.alicdn.com/t/font_1995974_ihzpmuv4lpk.svg#iconfont') format('svg');
} }
@font-face { @font-face {
font-family: "iconfont"; font-family: 'iconfont'; /* Project id 4680344 */
src: url('https://at.alicdn.com/t/c/font_4680344_rxl7gevvsys.woff2?t=1725970465332') format('woff2'), src: url('https://at.alicdn.com/t/c/font_4680344_v54lqtndz8.woff2?t=1730871528436') format('woff2'),
url('https://at.alicdn.com/t/c/font_4680344_rxl7gevvsys.woff?t=1725970465332') format('woff'), url('https://at.alicdn.com/t/c/font_4680344_v54lqtndz8.woff?t=1730871528436') format('woff'),
url('https://at.alicdn.com/t/c/font_4680344_rxl7gevvsys.ttf?t=1725970465332') format('truetype'); url('https://at.alicdn.com/t/c/font_4680344_v54lqtndz8.ttf?t=1730871528436') format('truetype');
} }
.iconfont { .iconfont {
@@ -577,3 +576,7 @@ img {
cursor: pointer; cursor: pointer;
} }
} }
.el-tooltip__popper {
max-width: 600px;
}

View File

@@ -36,7 +36,6 @@
v-for="(price, i) in priceList" v-for="(price, i) in priceList"
:key="i" :key="i"
@click="currIndex = i, getQrcode(price)"> @click="currIndex = i, getQrcode(price)">
<h3>{{ price.remark }}</h3>
<div class="price"> <div class="price">
<i>¥</i> <i>¥</i>
<span>{{ price.price }}</span> <span>{{ price.price }}</span>
@@ -45,7 +44,7 @@
<i>¥</i> <i>¥</i>
<span>{{ price.originPrice }}</span> <span>{{ price.originPrice }}</span>
</div> </div>
<p>{{ price.coin }}/每年</p> <p>{{ price.coin }}金币</p>
</div> </div>
</div> </div>
</div> </div>
@@ -388,6 +387,7 @@
&__item { &__item {
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center;
flex-direction: column; flex-direction: column;
width: 140px; width: 140px;
height: 170px; height: 170px;

View File

@@ -48,12 +48,14 @@
class="item" class="item"
style="cursor: pointer;" style="cursor: pointer;"
@click="search.type = 1, search.current = 1, isShowImage = true, getConfig()"> @click="search.type = 1, search.current = 1, isShowImage = true, getConfig()">
<i class="iconfont">&#xe672;</i>
<div>图片素材</div> <div>图片素材</div>
</div> </div>
<div <div
class="item" class="item"
style="cursor: pointer;" style="cursor: pointer;"
@click="search.type = 0, search.current = 1, isShowImage = true, getConfig()"> @click="search.type = 0, search.current = 1, isShowImage = true, getConfig()">
<i class="iconfont">&#xe883;</i>
<div>文字素材</div> <div>文字素材</div>
</div> </div>
</div> </div>
@@ -197,34 +199,6 @@
</div> </div>
</div> </div>
</div> </div>
<!-- <ai-table
:tableData="templateList"
:col-configs="templateColConfigs"
:total="templateTotal"
:current.sync="searchTemplate.current"
:size.sync="searchTemplate.size"
height="480"
@getList="getTemplateList"
v-loading="templateLoading">
<el-table-column slot="img" label="预览图" align="center">
<template v-slot="{ row }">
<el-image
style="width: 200px; height: 200px"
fit="contain"
:src="row.previewUrl"
:preview-src-list="[row.previewUrl]">
</el-image>
</template>
</el-table-column>
<el-table-column slot="options" label="操作" align="center" width="200">
<template v-slot="{ row }">
<div class="table-options">
<el-button type="text" @click="showTemplate(row)">模板预览</el-button>
<el-button type="text" @click="updateTempate(row)">使用</el-button>
</div>
</template>
</el-table-column>
</ai-table> -->
<div class="dialog-footer" slot="footer"> <div class="dialog-footer" slot="footer">
<el-button @click="isShowTemplate = false">取消</el-button> <el-button @click="isShowTemplate = false">取消</el-button>
</div> </div>
@@ -310,12 +284,16 @@
height: 160 height: 160
}, },
'80 * 60': { '80 * 60': {
width: 160, width: 240,
height: 120 height: 180
}, },
'60 * 40': { '70 * 50': {
width: 120, width: 210,
height: 80 height: 150
},
'70 * 40': {
width: 210,
height: 120
} }
}, },
paperPopVisible: false, paperPopVisible: false,
@@ -342,10 +320,6 @@
isShowImage: false, isShowImage: false,
tableData: [], tableData: [],
total: 0, total: 0,
templateColConfigs: [
{ prop: 'name', label: '模板名称', align: 'left' },
{ slot: 'img'}
],
templateLoading: false, templateLoading: false,
hasMore: true hasMore: true
} }
@@ -438,6 +412,18 @@
this.hiprintTemplate.update(config) this.hiprintTemplate.update(config)
this.hiprintTemplate.setPaper(config.panels[0].width, config.panels[0].height) this.hiprintTemplate.setPaper(config.panels[0].width, config.panels[0].height)
this.curPaper = {
type: 'other',
width: config.panels[0].width,
height: config.panels[0].height
}
this.$nextTick(() => {
if (this.curPaper.type === 'other') {
this.paperWidth = config.panels[0].width
this.paperHeight = config.panels[0].height
}
})
this.dynamicFromList = JSON.parse(res.data.params) this.dynamicFromList = JSON.parse(res.data.params)
this.isShowTemplate = false this.isShowTemplate = false
} }
@@ -555,6 +541,9 @@
$('#custom-provider').empty() $('#custom-provider').empty()
// eslint-disable-next-line no-undef // eslint-disable-next-line no-undef
hiprint.PrintElementTypeManager.build($('#custom-provider'), 'customProvider') hiprint.PrintElementTypeManager.build($('#custom-provider'), 'customProvider')
$('#custom-provider ul ul li:eq(0)').prepend('<i class="iconfont">&#xe953;</i>')
$('#custom-provider ul ul li:eq(1)').prepend('<i class="iconfont">&#xe6f3;</i>')
}, },
buildDesigner() { buildDesigner() {
@@ -825,6 +814,7 @@
width: 100px; width: 100px;
margin-bottom: 10px; margin-bottom: 10px;
margin-right: 10px; margin-right: 10px;
padding-top: 10px;
background-color: #eee; background-color: #eee;
border-radius: 4px; border-radius: 4px;
@@ -833,7 +823,6 @@
} }
a { a {
margin-top: 10px;
padding: 10px 0; padding: 10px 0;
} }
} }

View File

@@ -8,7 +8,7 @@ export const customProvider = function () {
new hiprint.PrintElementTypeGroup('', [ new hiprint.PrintElementTypeGroup('', [
{ {
tid: 'providerModule1.html', tid: 'providerModule1.html',
title: 'temu条码', title: 'TEMU条码',
data: 'XS888888888', data: 'XS888888888',
type: 'html', type: 'html',
formatter: function (data, options, sukData) { formatter: function (data, options, sukData) {

View File

@@ -23,7 +23,7 @@
"*://*.geiwohuo.com/", "*://*.geiwohuo.com/",
"*://*.ltwebstatic.com/", "*://*.ltwebstatic.com/",
"*://*.goodcang.com/", "*://*.goodcang.com/",
"*://*.rqlis.com*" "*://*.rqlis.com/"
], ],
"permissions": [ "permissions": [
"cookies", "cookies",

View File

@@ -22,7 +22,7 @@
"*://*.shein.com/", "*://*.shein.com/",
"*://*.geiwohuo.com/", "*://*.geiwohuo.com/",
"*://*.ltwebstatic.com/", "*://*.ltwebstatic.com/",
"*://*.rqlis.com" "*://*.rqlis.com/"
], ],
"permissions": [ "permissions": [
"cookies", "cookies",

View File

@@ -1,6 +1,7 @@
import Vue from 'vue' import Vue from 'vue'
import VueRouter from 'vue-router' import VueRouter from 'vue-router'
import store from '@/store' import store from '@/store'
import media from "@/router/media";
Vue.use(VueRouter) Vue.use(VueRouter)
@@ -298,7 +299,7 @@ const router = new VueRouter({
name: 'sendGoods_xc', name: 'sendGoods_xc',
component: () => import('../view/semi/SemiSendGoods_XC.vue') component: () => import('../view/semi/SemiSendGoods_XC.vue')
}, },
// { // {
// path: 'statistics', // path: 'statistics',
// name: 'statistics', // name: 'statistics',
@@ -317,7 +318,7 @@ const router = new VueRouter({
path: 'oushuitong', path: 'oushuitong',
name: 'oushuitong', name: 'oushuitong',
meta: { meta: {
activeMenu:'/qualification' activeMenu: '/qualification'
} }
} }
] ]
@@ -332,7 +333,7 @@ const router = new VueRouter({
name: 'addLabelsTemplate', name: 'addLabelsTemplate',
component: () => import('../view/lables/AddTemplate.vue'), component: () => import('../view/lables/AddTemplate.vue'),
meta: { meta: {
activeMenu:'/labelsTemplate' activeMenu: '/labelsTemplate'
} }
}, },
{ {
@@ -345,9 +346,10 @@ const router = new VueRouter({
name: 'skuManage', name: 'skuManage',
component: () => import('../view/lables/SkuManage.vue'), component: () => import('../view/lables/SkuManage.vue'),
meta: { meta: {
activeMenu:'/labelsTemplate' activeMenu: '/labelsTemplate'
} }
} },
...media
] ]
}, },
{ {
@@ -375,11 +377,11 @@ const router = new VueRouter({
component: () => import('../view/login/Forget.vue') component: () => import('../view/login/Forget.vue')
} }
], ],
scrollBehavior (to, from, savedPosition) { scrollBehavior(to, from, savedPosition) {
if (savedPosition) { if (savedPosition) {
return savedPosition return savedPosition
} else { } else {
return { x: 0, y: 0 } return {x: 0, y: 0}
} }
} }
}) })

3
src/router/media.js Normal file
View File

@@ -0,0 +1,3 @@
export default [
{name: "imageTranslate", path: "imageTranslate", component: () => import("@/view/media/imageTranslate.vue")}
]

View File

@@ -108,15 +108,19 @@ export function transform(leftData) {
"valueExtendInfo": "" "valueExtendInfo": ""
}); });
rightSkuItem.productSkuId = 0; rightSkuItem.productSkuId = 0;
rightSkuItem.productSkuWhExtAttrReq = { if (!leftSkuItem.productSkuWhExtAttr) {
"productSkuVolumeReq": leftSkuItem.productSkuWhExtAttr.productSkuVolume, rightSkuItem.productSkuWhExtAttrReq = null
"productSkuWeightReq": leftSkuItem.productSkuWhExtAttr.productSkuWeight, } else {
"productSkuBarCodeReqs": leftSkuItem.productSkuWhExtAttr.productSkuBarCodes, rightSkuItem.productSkuWhExtAttrReq = {
"productSkuSensitiveAttrReq": { "productSkuVolumeReq": leftSkuItem.productSkuWhExtAttr?.productSkuVolume,
"isSensitive": leftSkuItem.productSkuWhExtAttr.productSkuSensitiveAttr.isSensitive, "productSkuWeightReq": leftSkuItem.productSkuWhExtAttr?.productSkuWeight,
"sensitiveList": leftSkuItem.productSkuWhExtAttr.productSkuSensitiveAttr.sensitiveList}, "productSkuBarCodeReqs": leftSkuItem.productSkuWhExtAttr?.productSkuBarCodes,
"productSkuSensitiveLimitReq": leftSkuItem.productSkuWhExtAttr.productSkuSensitiveLimit, "productSkuSensitiveAttrReq": {
}; "isSensitive": leftSkuItem.productSkuWhExtAttr?.productSkuSensitiveAttr.isSensitive,
"sensitiveList": leftSkuItem.productSkuWhExtAttr?.productSkuSensitiveAttr.sensitiveList},
"productSkuSensitiveLimitReq": leftSkuItem.productSkuWhExtAttr?.productSkuSensitiveLimit,
};
}
rightSkuItem.currencyType = leftSkuItem.currencyType; rightSkuItem.currencyType = leftSkuItem.currencyType;
rightSkcItem.productSkuReqs.push(rightSkuItem); rightSkcItem.productSkuReqs.push(rightSkuItem);

View File

@@ -22,7 +22,7 @@
</el-tooltip> </el-tooltip>
<el-dropdown @command="handleClick"> <el-dropdown @command="handleClick">
<div class="userinfo"> <div class="userinfo">
<span>{{ $store.state.userInfo.name + "(" + $store.state.userInfo.phone + ")" }}</span> <span>{{ userInfo.name + "(" + userInfo.phone + ")" }}</span>
<img src="../assets/images/bottom.png"/> <img src="../assets/images/bottom.png"/>
</div> </div>
<el-dropdown-menu slot="dropdown"> <el-dropdown-menu slot="dropdown">
@@ -38,17 +38,26 @@
<div class="admin-main"> <div class="admin-main">
<el-scrollbar class="left"> <el-scrollbar class="left">
<el-menu <el-menu
:default-active="activePath" :default-active="activePath"
:collapse-transition="true" :collapse-transition="true"
unique-opened unique-opened
background-color="#545c64" background-color="#545c64"
router router
text-color="#fff" text-color="#fff"
:collapse="isCollapse"> :collapse="isCollapse">
<el-menu-item index="/welcome"> <el-menu-item index="/welcome">
<i class="el-icon-monitor"></i> <i class="el-icon-monitor"></i>
<span slot="title">工作台</span> <span slot="title">工作台</span>
</el-menu-item> </el-menu-item>
<el-submenu index="/imageTranslate">
<template #title>
<i class="el-icon-cpu"/>
<span>AI助手</span>
</template>
<el-menu-item index="/imageTranslate">图片翻译</el-menu-item>
</el-submenu>
<el-submenu index="/normalSendGoods"> <el-submenu index="/normalSendGoods">
<template slot="title"> <template slot="title">
<i class="el-icon-shopping-cart-2"></i> <i class="el-icon-shopping-cart-2"></i>
@@ -74,7 +83,7 @@
<el-menu-item index="/findSeller">查找买手</el-menu-item> <el-menu-item index="/findSeller">查找买手</el-menu-item>
<el-menu-item index="/priceDown">拒绝调价</el-menu-item> <el-menu-item index="/priceDown">拒绝调价</el-menu-item>
<!--<el-menu-item index="/batchUpload">批量上品</el-menu-item>--> <!--<el-menu-item index="/batchUpload">批量上品</el-menu-item>-->
<el-menu-item v-if="$store.state.userInfo.phone == '18610967550' || $store.state.userInfo.phone == '18571466720'" index="/draft"> <el-menu-item v-if="$store.state.userInfo.phone == '18610967550' || isAdmin" index="/draft">
草稿箱管理 草稿箱管理
</el-menu-item> </el-menu-item>
<el-menu-item index="/sellerSelect">上新生命周期管理</el-menu-item> <el-menu-item index="/sellerSelect">上新生命周期管理</el-menu-item>
@@ -153,16 +162,16 @@
<el-menu-item index="/copyProductShein">商品复制</el-menu-item> <el-menu-item index="/copyProductShein">商品复制</el-menu-item>
<el-menu-item index="/orderListShein">发货订单</el-menu-item> <el-menu-item index="/orderListShein">发货订单</el-menu-item>
<el-menu-item index="/productListOdm">商品列表(ODM)</el-menu-item> <el-menu-item index="/productListOdm">商品列表(ODM)</el-menu-item>
<el-menu-item v-if="$store.state.userInfo.phone == '18571466720' || $store.state.userInfo.phone == '18666013582'" index="/returnRecordShein">退货与报废单列表</el-menu-item> <el-menu-item v-if="isAdmin || $store.state.userInfo.phone == '18666013582'" index="/returnRecordShein">退货与报废单列表</el-menu-item>
<el-menu-item v-if="$store.state.userInfo.phone == '18571466720' || $store.state.userInfo.phone == '17607119772'" index="/labelInfoShein"> <el-menu-item v-if="isAdmin || $store.state.userInfo.phone == '17607119772'" index="/labelInfoShein">
标签管理 标签管理
</el-menu-item> </el-menu-item>
<el-menu-item v-if="$store.state.userInfo.phone == '18571466720' || $store.state.userInfo.phone == '17607119772'" index="/purchaseOrderListShein"> <el-menu-item v-if="isAdmin || $store.state.userInfo.phone == '17607119772'" index="/purchaseOrderListShein">
发货单列表 发货单列表
</el-menu-item> </el-menu-item>
<el-menu-item index="/saleStatShein">商家账单统计</el-menu-item> <el-menu-item index="/saleStatShein">商家账单统计</el-menu-item>
</el-submenu> </el-submenu>
<el-submenu index="/dataManager" v-if="$store.state.userInfo.phone == '18571466720'"> <el-submenu index="/dataManager" v-if="isAdmin">
<template slot="title"> <template slot="title">
<i class="el-icon-s-data"></i> <i class="el-icon-s-data"></i>
<span slot="title">数据管理</span> <span slot="title">数据管理</span>
@@ -210,6 +219,7 @@
<el-menu-item index="/labelsPrint">标签打印</el-menu-item> <el-menu-item index="/labelsPrint">标签打印</el-menu-item>
</el-submenu> </el-submenu>
</el-submenu> </el-submenu>
</el-menu> </el-menu>
</el-scrollbar> </el-scrollbar>
<div class="container"> <div class="container">
@@ -221,18 +231,18 @@
</div> </div>
</div> </div>
<el-dialog <el-dialog
title="激活充值" title="激活充值"
:visible="$store.state.activeDlgShow" :visible="$store.state.activeDlgShow"
:close-on-click-modal="false" :close-on-click-modal="false"
width="1200" width="1200"
:before-close="handleClose"> :before-close="handleClose">
<ai-payment/> <ai-payment/>
</el-dialog> </el-dialog>
<el-dialog <el-dialog
title="温馨提示" title="温馨提示"
:visible="$store.state.showSheinAlert" :visible="$store.state.showSheinAlert"
:close-on-click-modal="false" :close-on-click-modal="false"
width="1200"> width="1200">
<span style="font-size: large">1检查SHEIN商家后台是否登录如没登录请先登录之后再刷新助手<br></span> <span style="font-size: large">1检查SHEIN商家后台是否登录如没登录请先登录之后再刷新助手<br></span>
<span style="font-size: large">2如果SHEIN商家后台已经登录仍然弹出当前窗口则需要SHEIN进行二次授权二次授权可在菜单商品管理->商品列表任意选择一个商品库存一栏点击修改在新打开的页面中可看到正在鉴权的字样即可完成二次授权</span> <span style="font-size: large">2如果SHEIN商家后台已经登录仍然弹出当前窗口则需要SHEIN进行二次授权二次授权可在菜单商品管理->商品列表任意选择一个商品库存一栏点击修改在新打开的页面中可看到正在鉴权的字样即可完成二次授权</span>
<span slot="footer" class="dialog-footer"> <span slot="footer" class="dialog-footer">
@@ -240,10 +250,10 @@
</span> </span>
</el-dialog> </el-dialog>
<el-dialog <el-dialog
title="温馨提示" title="温馨提示"
:visible="$store.state.showTemuAlert" :visible="$store.state.showTemuAlert"
:close-on-click-modal="false" :close-on-click-modal="false"
width="1200"> width="1200">
<span style="font-size: large">请先打开卖家中心结算数据->售后管理页面进行二次授权<a target="_blank" style="text-decoration: underline" href="https://seller.kuajingmaihuo.com/main/aftersales/information">去打开</a><br></span> <span style="font-size: large">请先打开卖家中心结算数据->售后管理页面进行二次授权<a target="_blank" style="text-decoration: underline" href="https://seller.kuajingmaihuo.com/main/aftersales/information">去打开</a><br></span>
<span slot="footer" class="dialog-footer"> <span slot="footer" class="dialog-footer">
<el-button @click="closeTemuAlert"> </el-button> <el-button @click="closeTemuAlert"> </el-button>
@@ -257,175 +267,176 @@
</template> </template>
<script> <script>
import {mapMutations, mapState} from 'vuex' import {mapMutations, mapState} from 'vuex'
import AiPayment from "@/components/AiPayment.vue"; import AiPayment from "@/components/AiPayment.vue";
import LablesMember from '@/components/LablesMember' import LablesMember from '@/components/LablesMember'
import {sendAliexpressAPIMessage, sendGoodcangAPIMessage} from "@/api/chromeApi"; import {sendAliexpressAPIMessage, sendGoodcangAPIMessage} from "@/api/chromeApi";
export default { export default {
components: {AiPayment, LablesMember}, components: {AiPayment, LablesMember},
data() { data() {
return { return {
isCollapse: false, isCollapse: false,
activePath: '/home', activePath: '/home',
form: { form: {
mallId: this.$store.state.mallId, mallId: this.$store.state.mallId,
mallName: this.$store.state.mallName, mallName: this.$store.state.mallName,
code: '' code: ''
},
version: '',
vipType: ["体验会员", "月会员", "半年会员", "年会员", "多店通用年会员"]
}
},
computed: {
freeLogo: () => require("../assets/free.png"),
getStateInfo() {
if (this.$store.state.userInfo.flag == 0) {
return '未激活';
} else if (this.$store.state.userInfo.flag == 1) {
if (this.$store.state.userInfo.type != 4) {
return `(${this.$store.state.userInfo.mallName})` + this.vipType[this.$store.state.userInfo.type] + '(' + this.$store.state.userInfo.expireTime.substring(0, 10) + ')';
} else {
return this.vipType[this.$store.state.userInfo.type] + '(' + this.$store.state.userInfo.expireTime.substring(0, 10) + ')'
}
} else {
return '已过期';
}
}, },
version: '',
...mapState(['mallName', 'mallList']) vipType: ["体验会员", "月会员", "半年会员", "年会员", "多店通用年会员"]
}, }
},
watch: { computed: {
$route(v) { freeLogo: () => require("../assets/free.png"),
if (v.meta && v.meta.activeMenu) { getStateInfo() {
this.activePath = v.meta.activeMenu if (this.$store.state.userInfo.flag == 0) {
return '未激活';
} else if (this.$store.state.userInfo.flag == 1) {
if (this.$store.state.userInfo.type != 4) {
return `(${this.$store.state.userInfo.mallName})` + this.vipType[this.$store.state.userInfo.type] + '(' + this.$store.state.userInfo.expireTime.substring(0, 10) + ')';
} else { } else {
this.activePath = v.fullPath return this.vipType[this.$store.state.userInfo.type] + '(' + this.$store.state.userInfo.expireTime.substring(0, 10) + ')'
} }
}
},
created() {
const devVersion = require('../manifest.development.json').version
const prodVersion = require('../manifest.production.json').version
this.version = process.env.NODE_ENV === 'production' ? prodVersion : devVersion
if (this.$route.meta && this.$route.meta.activeMenu) {
this.activePath = this.$route.meta.activeMenu
} else { } else {
this.activePath = this.$route.fullPath return '已过期';
} }
// this.testGoodcang()
}, },
methods: { ...mapState(['mallName', 'mallList', 'userInfo']),
...mapMutations(['setActiveDlgShow']), isAdmin: v => ['18571466720'].includes(v.userInfo.phone),
handleClick(e) { },
if (e === 'logout') {
this.$store.dispatch('SignOut', false) watch: {
} else if (e === 'pwd') { $route(v) {
this.$router.push('changePwd') if (v.meta && v.meta.activeMenu) {
} else if (e === 'message') { this.activePath = v.meta.activeMenu
this.$router.push('message') } else {
} else if (e === 'coin') { this.activePath = v.fullPath
this.$router.push('coinFlow') }
}
},
created() {
const devVersion = require('../manifest.development.json').version
const prodVersion = require('../manifest.production.json').version
this.version = process.env.NODE_ENV === 'production' ? prodVersion : devVersion
if (this.$route.meta && this.$route.meta.activeMenu) {
this.activePath = this.$route.meta.activeMenu
} else {
this.activePath = this.$route.fullPath
}
// this.testGoodcang()
},
methods: {
...mapMutations(['setActiveDlgShow']),
handleClick(e) {
if (e === 'logout') {
this.$store.dispatch('SignOut', false)
} else if (e === 'pwd') {
this.$router.push('changePwd')
} else if (e === 'message') {
this.$router.push('message')
} else if (e === 'coin') {
this.$router.push('coinFlow')
}
},
openMember(index) {
this.$refs.LablesMember.show(index)
},
handleClose() {
this.form.mallId = "";
this.form.mallName = "";
this.form.code = "";
this.setActiveDlgShow(false)
},
toActive() {
this.setActiveDlgShow(true)
},
getMessage(type) {
return `你使用的是“${this.vipType[type]}”兑换券,确定兑换?`;
},
active() {
this.$refs.form.validate((valid) => {
if (valid) {
this.$http.post(`/api/coupon/getDetail`, null, {
params: {
code: this.form.code
}
}).then(res => {
if (res.code == 0) {
let msg = this.getMessage(res.data.type);
this.$confirm(msg, '温馨提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'info'
}).then(() => {
this.$http.post(`/api/order/upgradeByCode`, null, {
params: {
...this.form
}
}).then(res => {
if (res.code == 0) {
this.$message.success('激活成功')
this.$store.dispatch('getUserInfo')
this.setActiveDlgShow(false)
}
})
})
}
});
} }
}, })
},
openMember(index) { sign() {
this.$refs.LablesMember.show(index) this.$http.post(`/api/malluser/sign`).then(res => {
}, if (res.code == 0) {
this.$message.success('签到成功')
handleClose() { this.$store.dispatch('getUserInfo')
this.form.mallId = ""; }
this.form.mallName = ""; })
this.form.code = ""; },
this.setActiveDlgShow(false) async openFolder() {
}, console.log(22)
toActive() { let fileList = []
this.setActiveDlgShow(true) const res = await window.showDirectoryPicker({})
}, const detalAction = async (obj) => {
getMessage(type) { if (obj.entries) {
return `你使用的是“${this.vipType[type]}”兑换券,确定兑换?`; const dirs = obj.entries()
}, for await (const entry of dirs) {
active() { if (entry[1].entries) {
this.$refs.form.validate((valid) => { detalAction(entry[1])
if (valid) { } else {
this.$http.post(`/api/coupon/getDetail`, null, { fileList.push({
params: { name: entry[0],
code: this.form.code path: obj.name,
} fileHandle: entry[1],
}).then(res => { file: await entry[1].getFile()
if (res.code == 0) { })
let msg = this.getMessage(res.data.type);
this.$confirm(msg, '温馨提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'info'
}).then(() => {
this.$http.post(`/api/order/upgradeByCode`, null, {
params: {
...this.form
}
}).then(res => {
if (res.code == 0) {
this.$message.success('激活成功')
this.$store.dispatch('getUserInfo')
this.setActiveDlgShow(false)
}
})
})
}
});
}
})
},
sign() {
this.$http.post(`/api/malluser/sign`).then(res => {
if (res.code == 0) {
this.$message.success('签到成功')
this.$store.dispatch('getUserInfo')
}
})
},
async openFolder() {
console.log(22)
let fileList = []
const res = await window.showDirectoryPicker({})
const detalAction = async (obj) => {
if (obj.entries) {
const dirs = obj.entries()
for await (const entry of dirs) {
if (entry[1].entries) {
detalAction(entry[1])
} else {
fileList.push({
name: entry[0],
path: obj.name,
fileHandle: entry[1],
file: await entry[1].getFile()
})
}
} }
} }
} }
await detalAction(res); }
console.log("--fileList--", fileList) await detalAction(res);
}, console.log("--fileList--", fileList)
gotoKefu() { },
window.open('https://work.weixin.qq.com/kfid/kfcaa4208f661131eba', '_blank') gotoKefu() {
}, window.open('https://work.weixin.qq.com/kfid/kfcaa4208f661131eba', '_blank')
closeSheinAlert() { },
this.$store.commit('setSheinAlertShow', false) closeSheinAlert() {
}, this.$store.commit('setSheinAlertShow', false)
closeTemuAlert() { },
this.$store.commit('setTemuAlertShow', false) closeTemuAlert() {
}, this.$store.commit('setTemuAlertShow', false)
getAliexpressGoodsList() { },
let url = "https://seller-acs.aliexpress.com/h5/mtop.global.merchant.self.product.manager.render.list/1.0/?jsv=2.7.2&appKey=30267743&t=1713978403051&sign=ba2bda69b4a2695c7279d4bc05f51741&v=1.0&timeout=15000&H5Request=true&url=mtop.global.merchant.self.product.manager.render.list&__channel-id__=701301&api=mtop.global.merchant.self.product.manager.render.list&type=originaljson&dataType=json&valueType=original&x-i18n-regionID=AE" getAliexpressGoodsList() {
url = url + "&data=" + encodeURIComponent( let url = "https://seller-acs.aliexpress.com/h5/mtop.global.merchant.self.product.manager.render.list/1.0/?jsv=2.7.2&appKey=30267743&t=1713978403051&sign=ba2bda69b4a2695c7279d4bc05f51741&v=1.0&timeout=15000&H5Request=true&url=mtop.global.merchant.self.product.manager.render.list&__channel-id__=701301&api=mtop.global.merchant.self.product.manager.render.list&type=originaljson&dataType=json&valueType=original&x-i18n-regionID=AE"
url = url + "&data=" + encodeURIComponent(
JSON.stringify({ JSON.stringify({
"channelId": "701301", "channelId": "701301",
"jsonBody": JSON.stringify({ "jsonBody": JSON.stringify({
@@ -443,34 +454,34 @@
} }
} }
}), }),
"from":"SELF", "from": "SELF",
"bizParam":"{\"version\":\"simple\"}" "bizParam": "{\"version\":\"simple\"}"
}) })
) )
sendAliexpressAPIMessage({ sendAliexpressAPIMessage({
url: url url: url
}).then(res => { }).then(res => {
//console.log(res) //console.log(res)
}) })
},
testGoodcang() {
sendGoodcangAPIMessage({
url: "/api/v1/product/list",
method: 'POST',
data: {
"page_index": 1,
"page_size": 20,
"product_status": 1
}
}).then(res => {
console.log(res)
})
}
}, },
mounted() { testGoodcang() {
// this.getAliexpressGoodsList() sendGoodcangAPIMessage({
url: "/api/v1/product/list",
method: 'POST',
data: {
"page_index": 1,
"page_size": 20,
"product_status": 1
}
}).then(res => {
console.log(res)
})
} }
},
mounted() {
// this.getAliexpressGoodsList()
} }
}
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>

View File

@@ -21,7 +21,7 @@
<div class="search-item__wrapper"> <div class="search-item__wrapper">
<div class="left"> <div class="left">
<div class="search-item" v-show="addType === '1'"> <div class="search-item" v-show="addType === '1'">
<label>发货单</label> <label>店铺</label>
<el-select v-model="search.mallId" placeholder="请选择店铺" size="small"> <el-select v-model="search.mallId" placeholder="请选择店铺" size="small">
<el-option <el-option
v-for="item in $store.state.mallList" v-for="item in $store.state.mallList"
@@ -31,6 +31,8 @@
</el-option> </el-option>
</el-select> </el-select>
<el-button style="margin-left: 10px;" size="small" :disabled="!search.mallId" :loading="isLoading" @click="searchSkuList">查询</el-button> <el-button style="margin-left: 10px;" size="small" :disabled="!search.mallId" :loading="isLoading" @click="searchSkuList">查询</el-button>
<p class="tips">发货单列表->待仓库发货</p>
</div> </div>
<div class="search-item" v-show="addType === '2' || addType === '3'"> <div class="search-item" v-show="addType === '2' || addType === '3'">
<label>{{ addType === '2' ? 'SKC' : 'SKU' }}</label> <label>{{ addType === '2' ? 'SKC' : 'SKU' }}</label>
@@ -40,7 +42,7 @@
style="width: 250px" style="width: 250px"
size="small" size="small"
clearable clearable
placeholder="多个查询请用逗号分割" placeholder="多个查询请用逗号分割"
suffix-icon="iconfont iconSearch"> suffix-icon="iconfont iconSearch">
</el-input> </el-input>
<el-input <el-input
@@ -48,7 +50,7 @@
v-model="search.productSkcId" v-model="search.productSkcId"
style="width: 250px" style="width: 250px"
size="small" size="small"
placeholder="多个查询请用逗号分割" placeholder="多个查询请用逗号分割"
clearable clearable
suffix-icon="iconfont iconSearch"> suffix-icon="iconfont iconSearch">
</el-input> </el-input>
@@ -63,6 +65,18 @@
:height="height" :height="height"
@getList="() => {}" @getList="() => {}"
:loading="isLoading"> :loading="isLoading">
<el-table-column slot="product" width="280px" label="商品信息" align="center">
<template slot-scope="scope">
<div class="product">
<img :src="scope.row.thumbUrl" v-if="scope.row.thumbUrl">
<div class="right">
<el-tooltip class="item" effect="dark" :content="scope.row.productName" placement="top">
<div>{{ scope.row.productName }}</div>
</el-tooltip>
</div>
</div>
</template>
</el-table-column>
<el-table-column slot="options" label="操作" align="center" fixed="right" width="120px"> <el-table-column slot="options" label="操作" align="center" fixed="right" width="120px">
<template v-slot="{ row }"> <template v-slot="{ row }">
<div class="table-options"> <div class="table-options">
@@ -103,12 +117,15 @@
return { return {
colConfigs: [ colConfigs: [
{ prop: 'mallName', label: '店铺名称', align: 'left' }, { prop: 'mallName', label: '店铺名称', align: 'left' },
// { prop: 'productName', label: '商品名称', width: '280px', align: 'center' },
{ slot: 'product' },
{ prop: 'labelCode', label: '条码编码', align: 'center' }, { prop: 'labelCode', label: '条码编码', align: 'center' },
{ prop: 'productSkcId', label: 'SKC', align: 'center' }, { prop: 'productSkcId', label: 'SKC', align: 'center' },
{ prop: 'productSkuId', label: 'SKU', align: 'center' }, { prop: 'productSkuId', label: 'SKU', align: 'center' },
{ prop: 'skuExtCode', label: 'SKU货号', align: 'center' }, { prop: 'skuExtCode', label: 'SKU货号', align: 'center' },
{ prop: 'skuSpecName', label: '次销售属性', align: 'center' }, { prop: 'skuSpecName', label: '次销售属性', align: 'center' },
{ prop: 'deliveryNum', label: '发货数', align: 'center' } { prop: 'deliveryNum', label: '发货数', align: 'center' },
{ prop: 'purchaseTime', label: '创建时间', align: 'center', format: v => this.$dayjs(v).format('YYYY-MM-DD HH:mm:ss') }
], ],
search: { search: {
mallId: '', mallId: '',
@@ -281,6 +298,7 @@
labelCode: v.labelCode, labelCode: v.labelCode,
skuExtCode: v.skuExtCode, skuExtCode: v.skuExtCode,
deliveryNum: v.deliveryNum, deliveryNum: v.deliveryNum,
thumbUrl: v.thumbUrl,
skuSpecName: v.secondarySpecVOList.map(item => { skuSpecName: v.secondarySpecVOList.map(item => {
return item.specName return item.specName
}).join(',') }).join(',')
@@ -339,5 +357,35 @@
align-items: center; align-items: center;
} }
} }
.product {
display: flex;
align-items: center;
justify-content: center;
.right {
flex: 1;
margin-left: 10px;
text-align: left;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
div {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
}
img {
width: 60px;
}
}
.tips {
margin-left: 20px;
font-size: 14px;
color: red;
}
} }
</style> </style>

View File

@@ -142,7 +142,7 @@
v-model="skuReqParams.SKC" v-model="skuReqParams.SKC"
style="width: 250px" style="width: 250px"
size="small" size="small"
placeholder="多个查询请用逗号分割" placeholder="多个查询请用逗号分割"
clearable clearable
@clear="getSkuList()" @clear="getSkuList()"
suffix-icon="iconfont iconSearch"> suffix-icon="iconfont iconSearch">
@@ -156,7 +156,7 @@
v-model="skuReqParams.SKU" v-model="skuReqParams.SKU"
style="width: 250px" style="width: 250px"
size="small" size="small"
placeholder="多个查询请用逗号分割" placeholder="多个查询请用逗号分割"
clearable clearable
@clear="getSkuList()" @clear="getSkuList()"
suffix-icon="iconfont iconSearch"> suffix-icon="iconfont iconSearch">

View File

@@ -78,7 +78,7 @@ import CryptoJS from 'crypto-js'
this.$refs.form.validate((valid) => { this.$refs.form.validate((valid) => {
if (valid) { if (valid) {
if (this.form.password != this.form.repassword) { if (this.form.password != this.form.repassword) {
this.$message.success('两次密码输入不一致'); this.$message.error('两次密码输入不一致');
return; return;
} }
this.btnLoading = true this.btnLoading = true

34
src/view/media/i18n.js Normal file
View File

@@ -0,0 +1,34 @@
export const languages = {
CHS: '中文(简体)',
CHT: '中文(繁体)',
CSY: '捷克语',
NLD: '荷兰语',
ENG: '英语',
FRA: '法语',
DEU: '德语',
HUN: '匈牙利语',
ITA: '意大利语',
JPN: '日语',
KOR: '朝鲜文',
PLK: '波兰语',
PTB: '葡萄牙语(巴西)',
ROM: '罗马尼亚语',
RUS: '俄罗斯语',
ESP: '西班牙语',
TRK: '土耳其语',
VIN: '越南语',
ARA: '阿拉伯语',
SRP: '塞尔维亚语',
HRV: '克罗地亚语',
THA: '泰语',
IND: '印尼语',
FIL: '菲律宾语(他加禄语)',
}
export const engines = {
google: '谷歌翻译',
papago: 'Papago',
m2m100: 'M2M100',
deepl: 'DeepL',
none: '清除文字',
original: '不翻译'
}

View File

@@ -0,0 +1,44 @@
<script>
import AiDetail from "@/components/AiDetail.vue";
import AiSelect from "@/components/AiSelect.vue";
import {engines, languages} from "@/view/media/i18n";
export default {
name: "imageTranslate",
components: {AiSelect, AiDetail},
data() {
return {
form: {},
}
},
computed: {
languages: () => Object.entries(languages).map(([k, v]) => ({dictName: v, dictValue: k})),
engines: () => Object.entries(engines).map(([k, v]) => ({dictName: v, dictValue: k})),
}
}
</script>
<template>
<ai-list class="imageTranslate">
<ai-title slot="title" title="图片翻译" isShowBottomBorder/>
<template #content>
<el-form size="mini" label-width="120px">
<el-collapse>
<el-collapse-item title="翻译参数" name="1">
<el-form-item label="翻译引擎">
<ai-select v-model="form.translator" :select-list="engines"/>
</el-form-item>
<el-form-item label="翻译语言">
<ai-select v-model="form.targetLang" :select-list="languages"/>
</el-form-item>
</el-collapse-item>
</el-collapse>
</el-form>
</template>
</ai-list>
</template>
<style scoped lang="scss">
.imageTranslate {
}
</style>

View File

@@ -71,7 +71,7 @@ import { formatDate } from "@/utils/date.js"
detailPicList: [], detailPicList: [],
coin: 150, coin: 150,
colConfigs: [ colConfigs: [
{ slot: 'productName', label: '商品名称', width: '180px', align: 'left', fixed: 'left' }, { slot: 'productName', label: '商品名称', width: '180px', align: 'left', fixed: 'left' },
{ prop: 'category', label: '分类', width: '140px', align: 'left', fixed: 'left' }, { prop: 'category', label: '分类', width: '140px', align: 'left', fixed: 'left' },
{ prop: 'productId', label: 'SPU ID', width: '120px', align: 'left' }, { prop: 'productId', label: 'SPU ID', width: '120px', align: 'left' },
{ prop: 'productSkcId', label: 'SKC ID', width: '120px', align: 'left' }, { prop: 'productSkcId', label: 'SKC ID', width: '120px', align: 'left' },
@@ -130,9 +130,9 @@ import { formatDate } from "@/utils/date.js"
await this.dealAction("", res) await this.dealAction("", res)
} }
}) })
}, },
async dealAction (root, obj) { async dealAction (root, obj) {
console.log(obj) console.log(obj)
if (obj.entries) { if (obj.entries) {
@@ -188,7 +188,7 @@ import { formatDate } from "@/utils/date.js"
} else if (entry[0] == '详情图' && entry[1].kind == 'directory') { } else if (entry[0] == '详情图' && entry[1].kind == 'directory') {
this.detailPicList = await this.getPictureList(root + '/' + entry[0], entry[1]) this.detailPicList = await this.getPictureList(root + '/' + entry[0], entry[1])
} }
} }
if (this.mainPicList.length >= 0 && this.detailPicList.length >= 0) { if (this.mainPicList.length >= 0 && this.detailPicList.length >= 0) {
await this.beginAddToDraft(obj.name) await this.beginAddToDraft(obj.name)
@@ -302,4 +302,4 @@ import { formatDate } from "@/utils/date.js"
} }
} }
} }
</style> </style>

View File

@@ -107,8 +107,19 @@
:tableData="orderDataList" :tableData="orderDataList"
:col-configs="orderColConfig" :col-configs="orderColConfig"
height="700" height="700"
:isShowPagination="false" :size="100"
:current.sync="form.current"
:size.sync="form.size"
:total="orderTotal"
@getList="getOrderList"
style="margin-top: 8px;"> style="margin-top: 8px;">
<el-table-column slot="options" label="操作" align="center" fixed="right" width="140px">
<template v-slot="{ row }">
<div class="table-options">
<el-button type="text" v-if="form.status == '1'" @click="toSend(row)">重新发货</el-button>
</div>
</template>
</el-table-column>
</ai-table> </ai-table>
</ai-card> </ai-card>
<AiDialog <AiDialog
@@ -197,6 +208,7 @@
return { return {
isShow: false, isShow: false,
orderDataList: [], orderDataList: [],
orderTotal: 0,
colConfigs: [ colConfigs: [
{ type: "selection", width: '70px', align: 'left' }, { type: "selection", width: '70px', align: 'left' },
{ slot: 'productName' }, { slot: 'productName' },
@@ -225,7 +237,9 @@
], ],
form: { form: {
warehouseId: 'XinCang', warehouseId: 'XinCang',
status: '' status: '',
current: 1,
size: 100
}, },
mallId: '', mallId: '',
mallName: '', mallName: '',
@@ -319,6 +333,7 @@
} }
}).then(res => { }).then(res => {
this.orderDataList = res.data.records this.orderDataList = res.data.records
this.orderTotal = res.data.total
}) })
}, },
handleClick (e) { handleClick (e) {
@@ -516,6 +531,10 @@
params['invoice[product_declared_value][]'] = '' params['invoice[product_declared_value][]'] = ''
params['invoice[product_weight][]'] = '' params['invoice[product_weight][]'] = ''
if (obj.details[0].warehouseCode == 'UAXC002') {
params.courier = 'USPS'
}
for (let i = 0; i < obj.details.length; i++) { for (let i = 0; i < obj.details.length; i++) {
params[`platform_barcode[${obj.details[i].productId}]`] = '' params[`platform_barcode[${obj.details[i].productId}]`] = ''
params[`product_title_en[${obj.details[i].productId}]`] = obj.details[i].productTitleEn params[`product_title_en[${obj.details[i].productId}]`] = obj.details[i].productTitleEn

View File

@@ -1,7 +1,5 @@
const path = require('path') const path = require('path')
const fs = require('fs') const fs = require('fs')
// const JavaScriptObfuscator = require('webpack-obfuscator')
// Generate pages object // Generate pages object
const pages = {} const pages = {}
@@ -22,11 +20,12 @@ chromeName.forEach((name) => {
entry: `src/entry/${name}`, template: 'public/index.html', filename: `${fileName}.html` entry: `src/entry/${name}`, template: 'public/index.html', filename: `${fileName}.html`
} }
}) })
const isDevMode = process.env.NODE_ENV === 'development' const isDevMode = process.env.NODE_ENV === 'development'
module.exports = { module.exports = {
pages, filenameHashing: false, chainWebpack: (config) => { pages,
filenameHashing: false,
chainWebpack: (config) => {
config.plugin('copy').use(require('copy-webpack-plugin'), [{ config.plugin('copy').use(require('copy-webpack-plugin'), [{
patterns: [{ patterns: [{
from: path.resolve(`src/manifest.${process.env.NODE_ENV}.json`), to: `${path.resolve('dist')}/manifest.json` from: path.resolve(`src/manifest.${process.env.NODE_ENV}.json`), to: `${path.resolve('dist')}/manifest.json`
@@ -34,21 +33,25 @@ module.exports = {
from: path.resolve(`public/`), to: `${path.resolve('dist')}/` from: path.resolve(`public/`), to: `${path.resolve('dist')}/`
}] }]
}]) }])
}, devServer: { },
port: 8080, open: true, overlay: { devServer: {
warnings: false, errors: true port: 8080, open: true, hot: true,
}, proxy: { proxy: {
'/api': { '/api': {
target: 'http://pdd.jjcp52.com', changeOrigin: true, ws: true, pathRewrite: { target: 'http://pdd.jjcp52.com', changeOrigin: true, ws: true, pathRewrite: {
'^/api': '/' '^/api': '/'
} }
} }
} }
}, lintOnSave: false, configureWebpack: { },
lintOnSave: false,
configureWebpack: {
output: { output: {
filename: `[name].js`, chunkFilename: `[name].js` filename: `[name].js`, chunkFilename: `[name].js`
}, devtool: isDevMode ? 'inline-source-map' : false },
}, css: { devtool: isDevMode ? 'inline-source-map' : false
},
css: {
extract: false // Make sure the css is the same extract: false // Make sure the css is the same
} }
} }