Compare commits

..

14 Commits

Author SHA1 Message Date
aixianling
e7f5670b72 新增图片翻译功能及多语言支持 2024-11-06 17:53:13 +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
15 changed files with 363 additions and 243 deletions

View File

@@ -42,7 +42,7 @@
"eslint": "^7.32.0",
"eslint-plugin-vue": "^8.0.3",
"javascript-obfuscator": "2.6.0",
"sass": "^1.68.0",
"sass": "1.32.13",
"sass-loader": "^7.3.1",
"vue-cli-plugin-chrome-extension-cli": "~1.1.4",
"vue-template-compiler": "^2.6.14",

View File

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

View File

@@ -4,7 +4,7 @@ import store from '@/store'
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,
validateStatus: function (status) {
return status < 500

View File

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

View File

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

View File

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

View File

@@ -1,6 +1,7 @@
import Vue from 'vue'
import VueRouter from 'vue-router'
import store from '@/store'
import media from "@/router/media";
Vue.use(VueRouter)
@@ -317,7 +318,7 @@ const router = new VueRouter({
path: 'oushuitong',
name: 'oushuitong',
meta: {
activeMenu:'/qualification'
activeMenu: '/qualification'
}
}
]
@@ -332,7 +333,7 @@ const router = new VueRouter({
name: 'addLabelsTemplate',
component: () => import('../view/lables/AddTemplate.vue'),
meta: {
activeMenu:'/labelsTemplate'
activeMenu: '/labelsTemplate'
}
},
{
@@ -345,9 +346,10 @@ const router = new VueRouter({
name: 'skuManage',
component: () => import('../view/lables/SkuManage.vue'),
meta: {
activeMenu:'/labelsTemplate'
}
activeMenu: '/labelsTemplate'
}
},
...media
]
},
{
@@ -375,11 +377,11 @@ const router = new VueRouter({
component: () => import('../view/login/Forget.vue')
}
],
scrollBehavior (to, from, savedPosition) {
scrollBehavior(to, from, savedPosition) {
if (savedPosition) {
return savedPosition
} 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": ""
});
rightSkuItem.productSkuId = 0;
if (!leftSkuItem.productSkuWhExtAttr) {
rightSkuItem.productSkuWhExtAttrReq = null
} else {
rightSkuItem.productSkuWhExtAttrReq = {
"productSkuVolumeReq": leftSkuItem.productSkuWhExtAttr.productSkuVolume,
"productSkuWeightReq": leftSkuItem.productSkuWhExtAttr.productSkuWeight,
"productSkuBarCodeReqs": leftSkuItem.productSkuWhExtAttr.productSkuBarCodes,
"productSkuVolumeReq": leftSkuItem.productSkuWhExtAttr?.productSkuVolume,
"productSkuWeightReq": leftSkuItem.productSkuWhExtAttr?.productSkuWeight,
"productSkuBarCodeReqs": leftSkuItem.productSkuWhExtAttr?.productSkuBarCodes,
"productSkuSensitiveAttrReq": {
"isSensitive": leftSkuItem.productSkuWhExtAttr.productSkuSensitiveAttr.isSensitive,
"sensitiveList": leftSkuItem.productSkuWhExtAttr.productSkuSensitiveAttr.sensitiveList},
"productSkuSensitiveLimitReq": leftSkuItem.productSkuWhExtAttr.productSkuSensitiveLimit,
"isSensitive": leftSkuItem.productSkuWhExtAttr?.productSkuSensitiveAttr.isSensitive,
"sensitiveList": leftSkuItem.productSkuWhExtAttr?.productSkuSensitiveAttr.sensitiveList},
"productSkuSensitiveLimitReq": leftSkuItem.productSkuWhExtAttr?.productSkuSensitiveLimit,
};
}
rightSkuItem.currencyType = leftSkuItem.currencyType;
rightSkcItem.productSkuReqs.push(rightSkuItem);

View File

@@ -22,7 +22,7 @@
</el-tooltip>
<el-dropdown @command="handleClick">
<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"/>
</div>
<el-dropdown-menu slot="dropdown">
@@ -49,6 +49,15 @@
<i class="el-icon-monitor"></i>
<span slot="title">工作台</span>
</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">
<template slot="title">
<i class="el-icon-shopping-cart-2"></i>
@@ -74,7 +83,7 @@
<el-menu-item index="/findSeller">查找买手</el-menu-item>
<el-menu-item index="/priceDown">拒绝调价</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 index="/sellerSelect">上新生命周期管理</el-menu-item>
@@ -153,16 +162,16 @@
<el-menu-item index="/copyProductShein">商品复制</el-menu-item>
<el-menu-item index="/orderListShein">发货订单</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="$store.state.userInfo.phone == '18571466720' || $store.state.userInfo.phone == '17607119772'" index="/labelInfoShein">
<el-menu-item v-if="isAdmin || $store.state.userInfo.phone == '18666013582'" index="/returnRecordShein">退货与报废单列表</el-menu-item>
<el-menu-item v-if="isAdmin || $store.state.userInfo.phone == '17607119772'" index="/labelInfoShein">
标签管理
</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 index="/saleStatShein">商家账单统计</el-menu-item>
</el-submenu>
<el-submenu index="/dataManager" v-if="$store.state.userInfo.phone == '18571466720'">
<el-submenu index="/dataManager" v-if="isAdmin">
<template slot="title">
<i class="el-icon-s-data"></i>
<span slot="title">数据管理</span>
@@ -210,6 +219,7 @@
<el-menu-item index="/labelsPrint">标签打印</el-menu-item>
</el-submenu>
</el-submenu>
</el-menu>
</el-scrollbar>
<div class="container">
@@ -257,12 +267,12 @@
</template>
<script>
import {mapMutations, mapState} from 'vuex'
import AiPayment from "@/components/AiPayment.vue";
import LablesMember from '@/components/LablesMember'
import {sendAliexpressAPIMessage, sendGoodcangAPIMessage} from "@/api/chromeApi";
import {mapMutations, mapState} from 'vuex'
import AiPayment from "@/components/AiPayment.vue";
import LablesMember from '@/components/LablesMember'
import {sendAliexpressAPIMessage, sendGoodcangAPIMessage} from "@/api/chromeApi";
export default {
export default {
components: {AiPayment, LablesMember},
data() {
return {
@@ -294,7 +304,8 @@
}
},
...mapState(['mallName', 'mallList'])
...mapState(['mallName', 'mallList', 'userInfo']),
isAdmin: v => ['18571466720'].includes(v.userInfo.phone),
},
watch: {
@@ -443,8 +454,8 @@
}
}
}),
"from":"SELF",
"bizParam":"{\"version\":\"simple\"}"
"from": "SELF",
"bizParam": "{\"version\":\"simple\"}"
})
)
sendAliexpressAPIMessage({
@@ -470,7 +481,7 @@
mounted() {
// this.getAliexpressGoodsList()
}
}
}
</script>
<style lang="scss" scoped>

View File

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

@@ -107,8 +107,19 @@
:tableData="orderDataList"
:col-configs="orderColConfig"
height="700"
:isShowPagination="false"
:size="100"
:current.sync="form.current"
:size.sync="form.size"
:total="orderTotal"
@getList="getOrderList"
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-card>
<AiDialog
@@ -197,6 +208,7 @@
return {
isShow: false,
orderDataList: [],
orderTotal: 0,
colConfigs: [
{ type: "selection", width: '70px', align: 'left' },
{ slot: 'productName' },
@@ -225,7 +237,9 @@
],
form: {
warehouseId: 'XinCang',
status: ''
status: '',
current: 1,
size: 100
},
mallId: '',
mallName: '',
@@ -319,6 +333,7 @@
}
}).then(res => {
this.orderDataList = res.data.records
this.orderTotal = res.data.total
})
},
handleClick (e) {
@@ -516,6 +531,10 @@
params['invoice[product_declared_value][]'] = ''
params['invoice[product_weight][]'] = ''
if (obj.details[0].warehouseCode == 'UAXC002') {
params.courier = 'USPS'
}
for (let i = 0; i < obj.details.length; i++) {
params[`platform_barcode[${obj.details[i].productId}]`] = ''
params[`product_title_en[${obj.details[i].productId}]`] = obj.details[i].productTitleEn

View File

@@ -1,7 +1,5 @@
const path = require('path')
const fs = require('fs')
// const JavaScriptObfuscator = require('webpack-obfuscator')
// Generate pages object
const pages = {}
@@ -22,11 +20,12 @@ chromeName.forEach((name) => {
entry: `src/entry/${name}`, template: 'public/index.html', filename: `${fileName}.html`
}
})
const isDevMode = process.env.NODE_ENV === 'development'
module.exports = {
pages, filenameHashing: false, chainWebpack: (config) => {
pages,
filenameHashing: false,
chainWebpack: (config) => {
config.plugin('copy').use(require('copy-webpack-plugin'), [{
patterns: [{
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')}/`
}]
}])
}, devServer: {
port: 8080, open: true, overlay: {
warnings: false, errors: true
}, proxy: {
},
devServer: {
port: 8080, open: true, hot: true,
proxy: {
'/api': {
target: 'http://pdd.jjcp52.com', changeOrigin: true, ws: true, pathRewrite: {
'^/api': '/'
}
}
}
}, lintOnSave: false, configureWebpack: {
},
lintOnSave: false,
configureWebpack: {
output: {
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
}
}