调整
This commit is contained in:
@@ -13,7 +13,9 @@
|
|||||||
"core-js": "^3.8.3",
|
"core-js": "^3.8.3",
|
||||||
"dayjs": "^1.11.9",
|
"dayjs": "^1.11.9",
|
||||||
"element-ui": "^2.15.13",
|
"element-ui": "^2.15.13",
|
||||||
|
"v-viewer": "^1.6.4",
|
||||||
"vue": "^2.6.14",
|
"vue": "^2.6.14",
|
||||||
|
"vue-cropper": "^0.6.4",
|
||||||
"vue-json-excel": "^0.3.0",
|
"vue-json-excel": "^0.3.0",
|
||||||
"vue-qr": "^4.0.9",
|
"vue-qr": "^4.0.9",
|
||||||
"vue-router": "^3.2.0",
|
"vue-router": "^3.2.0",
|
||||||
|
|||||||
244
public/js/FileSaver.js
Normal file
244
public/js/FileSaver.js
Normal file
@@ -0,0 +1,244 @@
|
|||||||
|
/* FileSaver.js
|
||||||
|
* A saveAs() FileSaver implementation.
|
||||||
|
* 2014-11-29
|
||||||
|
*
|
||||||
|
* By Eli Grey, http://eligrey.com
|
||||||
|
* License: X11/MIT
|
||||||
|
* See https://github.com/eligrey/FileSaver.js/blob/master/LICENSE.md
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*global self */
|
||||||
|
/*jslint bitwise: true, indent: 4, laxbreak: true, laxcomma: true, smarttabs: true, plusplus: true */
|
||||||
|
|
||||||
|
/*! @source http://purl.eligrey.com/github/FileSaver.js/blob/master/FileSaver.js */
|
||||||
|
|
||||||
|
var saveAs = saveAs
|
||||||
|
// IE 10+ (native saveAs)
|
||||||
|
|| (typeof navigator !== "undefined" &&
|
||||||
|
navigator.msSaveOrOpenBlob && navigator.msSaveOrOpenBlob.bind(navigator))
|
||||||
|
// Everyone else
|
||||||
|
|| (function(view) {
|
||||||
|
"use strict";
|
||||||
|
// IE <10 is explicitly unsupported
|
||||||
|
if (typeof navigator !== "undefined" &&
|
||||||
|
/MSIE [1-9]\./.test(navigator.userAgent)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var
|
||||||
|
doc = view.document
|
||||||
|
// only get URL when necessary in case Blob.js hasn't overridden it yet
|
||||||
|
, get_URL = function() {
|
||||||
|
return view.URL || view.webkitURL || view;
|
||||||
|
}
|
||||||
|
, save_link = doc.createElementNS("http://www.w3.org/1999/xhtml", "a")
|
||||||
|
, can_use_save_link = "download" in save_link
|
||||||
|
, click = function(node) {
|
||||||
|
var event = doc.createEvent("MouseEvents");
|
||||||
|
event.initMouseEvent(
|
||||||
|
"click", true, false, view, 0, 0, 0, 0, 0
|
||||||
|
, false, false, false, false, 0, null
|
||||||
|
);
|
||||||
|
node.dispatchEvent(event);
|
||||||
|
}
|
||||||
|
, webkit_req_fs = view.webkitRequestFileSystem
|
||||||
|
, req_fs = view.requestFileSystem || webkit_req_fs || view.mozRequestFileSystem
|
||||||
|
, throw_outside = function(ex) {
|
||||||
|
(view.setImmediate || view.setTimeout)(function() {
|
||||||
|
throw ex;
|
||||||
|
}, 0);
|
||||||
|
}
|
||||||
|
, force_saveable_type = "application/octet-stream"
|
||||||
|
, fs_min_size = 0
|
||||||
|
// See https://code.google.com/p/chromium/issues/detail?id=375297#c7 and
|
||||||
|
// https://github.com/eligrey/FileSaver.js/commit/485930a#commitcomment-8768047
|
||||||
|
// for the reasoning behind the timeout and revocation flow
|
||||||
|
, arbitrary_revoke_timeout = 500 // in ms
|
||||||
|
, revoke = function(file) {
|
||||||
|
var revoker = function() {
|
||||||
|
if (typeof file === "string") { // file is an object URL
|
||||||
|
get_URL().revokeObjectURL(file);
|
||||||
|
} else { // file is a File
|
||||||
|
file.remove();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
if (view.chrome) {
|
||||||
|
revoker();
|
||||||
|
} else {
|
||||||
|
setTimeout(revoker, arbitrary_revoke_timeout);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
, dispatch = function(filesaver, event_types, event) {
|
||||||
|
event_types = [].concat(event_types);
|
||||||
|
var i = event_types.length;
|
||||||
|
while (i--) {
|
||||||
|
var listener = filesaver["on" + event_types[i]];
|
||||||
|
if (typeof listener === "function") {
|
||||||
|
try {
|
||||||
|
listener.call(filesaver, event || filesaver);
|
||||||
|
} catch (ex) {
|
||||||
|
throw_outside(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
, FileSaver = function(blob, name) {
|
||||||
|
// First try a.download, then web filesystem, then object URLs
|
||||||
|
var
|
||||||
|
filesaver = this
|
||||||
|
, type = blob.type
|
||||||
|
, blob_changed = false
|
||||||
|
, object_url
|
||||||
|
, target_view
|
||||||
|
, dispatch_all = function() {
|
||||||
|
dispatch(filesaver, "writestart progress write writeend".split(" "));
|
||||||
|
}
|
||||||
|
// on any filesys errors revert to saving with object URLs
|
||||||
|
, fs_error = function() {
|
||||||
|
// don't create more object URLs than needed
|
||||||
|
if (blob_changed || !object_url) {
|
||||||
|
object_url = get_URL().createObjectURL(blob);
|
||||||
|
}
|
||||||
|
if (target_view) {
|
||||||
|
target_view.location.href = object_url;
|
||||||
|
} else {
|
||||||
|
var new_tab = view.open(object_url, "_blank");
|
||||||
|
if (new_tab == undefined && typeof safari !== "undefined") {
|
||||||
|
//Apple do not allow window.open, see http://bit.ly/1kZffRI
|
||||||
|
view.location.href = object_url
|
||||||
|
}
|
||||||
|
}
|
||||||
|
filesaver.readyState = filesaver.DONE;
|
||||||
|
dispatch_all();
|
||||||
|
revoke(object_url);
|
||||||
|
}
|
||||||
|
, abortable = function(func) {
|
||||||
|
return function() {
|
||||||
|
if (filesaver.readyState !== filesaver.DONE) {
|
||||||
|
return func.apply(this, arguments);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
, create_if_not_found = {create: true, exclusive: false}
|
||||||
|
, slice
|
||||||
|
;
|
||||||
|
filesaver.readyState = filesaver.INIT;
|
||||||
|
if (!name) {
|
||||||
|
name = "download";
|
||||||
|
}
|
||||||
|
if (can_use_save_link) {
|
||||||
|
object_url = get_URL().createObjectURL(blob);
|
||||||
|
save_link.href = object_url;
|
||||||
|
save_link.download = name;
|
||||||
|
click(save_link);
|
||||||
|
filesaver.readyState = filesaver.DONE;
|
||||||
|
dispatch_all();
|
||||||
|
revoke(object_url);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// Object and web filesystem URLs have a problem saving in Google Chrome when
|
||||||
|
// viewed in a tab, so I force save with application/octet-stream
|
||||||
|
// http://code.google.com/p/chromium/issues/detail?id=91158
|
||||||
|
// Update: Google errantly closed 91158, I submitted it again:
|
||||||
|
// https://code.google.com/p/chromium/issues/detail?id=389642
|
||||||
|
if (view.chrome && type && type !== force_saveable_type) {
|
||||||
|
slice = blob.slice || blob.webkitSlice;
|
||||||
|
blob = slice.call(blob, 0, blob.size, force_saveable_type);
|
||||||
|
blob_changed = true;
|
||||||
|
}
|
||||||
|
// Since I can't be sure that the guessed media type will trigger a download
|
||||||
|
// in WebKit, I append .download to the filename.
|
||||||
|
// https://bugs.webkit.org/show_bug.cgi?id=65440
|
||||||
|
if (webkit_req_fs && name !== "download") {
|
||||||
|
name += ".download";
|
||||||
|
}
|
||||||
|
if (type === force_saveable_type || webkit_req_fs) {
|
||||||
|
target_view = view;
|
||||||
|
}
|
||||||
|
if (!req_fs) {
|
||||||
|
fs_error();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
fs_min_size += blob.size;
|
||||||
|
req_fs(view.TEMPORARY, fs_min_size, abortable(function(fs) {
|
||||||
|
fs.root.getDirectory("saved", create_if_not_found, abortable(function(dir) {
|
||||||
|
var save = function() {
|
||||||
|
dir.getFile(name, create_if_not_found, abortable(function(file) {
|
||||||
|
file.createWriter(abortable(function(writer) {
|
||||||
|
writer.onwriteend = function(event) {
|
||||||
|
target_view.location.href = file.toURL();
|
||||||
|
filesaver.readyState = filesaver.DONE;
|
||||||
|
dispatch(filesaver, "writeend", event);
|
||||||
|
revoke(file);
|
||||||
|
};
|
||||||
|
writer.onerror = function() {
|
||||||
|
var error = writer.error;
|
||||||
|
if (error.code !== error.ABORT_ERR) {
|
||||||
|
fs_error();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
"writestart progress write abort".split(" ").forEach(function(event) {
|
||||||
|
writer["on" + event] = filesaver["on" + event];
|
||||||
|
});
|
||||||
|
writer.write(blob);
|
||||||
|
filesaver.abort = function() {
|
||||||
|
writer.abort();
|
||||||
|
filesaver.readyState = filesaver.DONE;
|
||||||
|
};
|
||||||
|
filesaver.readyState = filesaver.WRITING;
|
||||||
|
}), fs_error);
|
||||||
|
}), fs_error);
|
||||||
|
};
|
||||||
|
dir.getFile(name, {create: false}, abortable(function(file) {
|
||||||
|
// delete file if it already exists
|
||||||
|
file.remove();
|
||||||
|
save();
|
||||||
|
}), abortable(function(ex) {
|
||||||
|
if (ex.code === ex.NOT_FOUND_ERR) {
|
||||||
|
save();
|
||||||
|
} else {
|
||||||
|
fs_error();
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
}), fs_error);
|
||||||
|
}), fs_error);
|
||||||
|
}
|
||||||
|
, FS_proto = FileSaver.prototype
|
||||||
|
, saveAs = function(blob, name) {
|
||||||
|
return new FileSaver(blob, name);
|
||||||
|
}
|
||||||
|
;
|
||||||
|
FS_proto.abort = function() {
|
||||||
|
var filesaver = this;
|
||||||
|
filesaver.readyState = filesaver.DONE;
|
||||||
|
dispatch(filesaver, "abort");
|
||||||
|
};
|
||||||
|
FS_proto.readyState = FS_proto.INIT = 0;
|
||||||
|
FS_proto.WRITING = 1;
|
||||||
|
FS_proto.DONE = 2;
|
||||||
|
|
||||||
|
FS_proto.error =
|
||||||
|
FS_proto.onwritestart =
|
||||||
|
FS_proto.onprogress =
|
||||||
|
FS_proto.onwrite =
|
||||||
|
FS_proto.onabort =
|
||||||
|
FS_proto.onerror =
|
||||||
|
FS_proto.onwriteend =
|
||||||
|
null;
|
||||||
|
|
||||||
|
return saveAs;
|
||||||
|
}(
|
||||||
|
typeof self !== "undefined" && self
|
||||||
|
|| typeof window !== "undefined" && window
|
||||||
|
|| this.content
|
||||||
|
));
|
||||||
|
// `self` is undefined in Firefox for Android content script context
|
||||||
|
// while `this` is nsIContentFrameMessageManager
|
||||||
|
// with an attribute `content` that corresponds to the window
|
||||||
|
|
||||||
|
if (typeof module !== "undefined" && module !== null) {
|
||||||
|
module.exports = saveAs;
|
||||||
|
} else if ((typeof define !== "undefined" && define !== null) && (define.amd != null)) {
|
||||||
|
define([], function() {
|
||||||
|
return saveAs;
|
||||||
|
});
|
||||||
|
}
|
||||||
75
public/js/download.js
Normal file
75
public/js/download.js
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
function init() {
|
||||||
|
if (window.location.href.startsWith('https://www.aliexpress.us/item/')) {
|
||||||
|
const popup = document.createElement("div")
|
||||||
|
popup.innerText = "下载图片"
|
||||||
|
const styles = {
|
||||||
|
position: "fixed",
|
||||||
|
right: '10px',
|
||||||
|
top: '60px',
|
||||||
|
zIndex: 9999,
|
||||||
|
padding: "8px",
|
||||||
|
background: "#409EFF",
|
||||||
|
color: "#fff",
|
||||||
|
borderRadius: "8px",
|
||||||
|
cursor: "pointer"
|
||||||
|
}
|
||||||
|
for (const e in styles) {
|
||||||
|
popup.style[e] = styles[e]
|
||||||
|
}
|
||||||
|
|
||||||
|
popup.addEventListener('click', async () => {
|
||||||
|
let obj = window.runParams.data;
|
||||||
|
let id = obj.productInfoComponent.idStr
|
||||||
|
|
||||||
|
var baseList = [];
|
||||||
|
var downloadList = []
|
||||||
|
|
||||||
|
var imgObjList = document.querySelectorAll('#product-description img')
|
||||||
|
for (var i = 0; i < imgObjList.length; i++) {
|
||||||
|
baseList.push({type: 0, index: i+1, src: imgObjList[i].src})
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var j = 0; j < obj.imageComponent.imagePathList.length; j++) {
|
||||||
|
baseList.push({type: 1, index: j+1, src: obj.imageComponent.imagePathList[j]})
|
||||||
|
}
|
||||||
|
|
||||||
|
var zip = new JSZip();
|
||||||
|
var imgsBanner = zip.folder("轮插图");
|
||||||
|
var imgsDetail = zip.folder("详情图");
|
||||||
|
for (var k = 0; k < baseList.length; k++) {
|
||||||
|
let type = baseList[k].type
|
||||||
|
let index = baseList[k].index
|
||||||
|
let image = new Image();
|
||||||
|
// 解决跨域 Canvas 污染问题
|
||||||
|
image.setAttribute("crossOrigin", "anonymous");
|
||||||
|
image.onload = function () {
|
||||||
|
let canvas = document.createElement("canvas");
|
||||||
|
canvas.width = image.width;
|
||||||
|
canvas.height = image.height;
|
||||||
|
let context = canvas.getContext("2d");
|
||||||
|
context.drawImage(image, 0, 0, image.width, image.height);
|
||||||
|
let url = canvas.toDataURL(); // 得到图片的base64编码数据
|
||||||
|
canvas.toDataURL("image/png");
|
||||||
|
downloadList.push({type: type, index: index, data: url.substring(22)}); // 去掉base64编码前的 data:image/png;base64,
|
||||||
|
if (downloadList.length === baseList.length && downloadList.length > 0) {
|
||||||
|
for (let l = 0; l < downloadList.length; l++) {
|
||||||
|
if (downloadList[l].type == '0') {
|
||||||
|
imgsDetail.file(`详情图${downloadList[l].index}.png`, downloadList[l].data, { base64: true });
|
||||||
|
} else if (downloadList[l].type == '1') {
|
||||||
|
imgsBanner.file(`轮播图${downloadList[l].index}.png`, downloadList[l].data, { base64: true });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
zip.generateAsync({ type: "blob" }).then(function (content) {
|
||||||
|
// see FileSaver.js
|
||||||
|
saveAs(content, "aliexpress_" + id + ".zip");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
image.src = baseList[k].src;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
document.body.appendChild(popup)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
init();
|
||||||
13
public/js/jszip.min.js
vendored
Normal file
13
public/js/jszip.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
@@ -1,15 +1,28 @@
|
|||||||
<template>
|
<template>
|
||||||
<section class="AiPayment">
|
<section class="AiPayment">
|
||||||
<el-tabs type="card" stretch v-model="search.module" @tab-click="getPayments">
|
<el-tabs type="card" stretch v-model="search.module" @tab-click="getPayments">
|
||||||
|
<el-tab-pane label="激活码兑换" name="2"/>
|
||||||
<el-tab-pane label="基础会员" name="0"/>
|
<el-tab-pane label="基础会员" name="0"/>
|
||||||
<el-tab-pane label="金币充值" name="1"/>
|
<el-tab-pane label="金币充值" name="1"/>
|
||||||
</el-tabs>
|
</el-tabs>
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<div v-if="search.module == '0' " style="grid-template-columns: 1fr 1fr" class="payments mb-16">
|
<div v-if="search.module == '0'" class="mb-16">
|
||||||
<div class="card" v-for="pay in payments" :key="pay.id" :class="{active:pay.id==selected.id}"
|
<div style="grid-template-columns: 1fr 1fr" class="payments ">
|
||||||
|
<div class="card" v-for="pay in payments" :key="pay.id" :class="{active:pay.id==selected.id}"
|
||||||
@click="getQrcode(pay)">
|
@click="getQrcode(pay)">
|
||||||
<div v-text="pay.title"/>
|
<div v-text="pay.title"/>
|
||||||
<div class="c-f00 mt-16" v-text="`¥${pay.price}`"/>
|
<div class="c-f00 mt-16" v-text="`¥${pay.price}`"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<el-form :model="vipForm" label-position="top" ref="vipForm" label-width="100px" class="form">
|
||||||
|
<el-form-item
|
||||||
|
prop="mallName"
|
||||||
|
label="当前绑定店铺"
|
||||||
|
:rules="[{ required: true, message: '请先登录拼多多跨境卖家中心', trigger: 'blur' }]">
|
||||||
|
<el-input readonly placeholder="请先登录拼多多跨境卖家中心" v-model="vipForm.mallName"></el-input>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div v-else-if="search.module == '1' " class="payments mb-16">
|
<div v-else-if="search.module == '1' " class="payments mb-16">
|
||||||
@@ -22,6 +35,28 @@
|
|||||||
<div class="c-999 mt-16" v-text="`${pay.coin}金币`"/>
|
<div class="c-999 mt-16" v-text="`${pay.coin}金币`"/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div v-else-if="search.module == '2'" style="grid-template-columns: 1fr" class="payments mb-16">
|
||||||
|
<el-form :model="form" label-position="top" ref="form" label-width="100px" class="form">
|
||||||
|
<el-form-item
|
||||||
|
prop="mallName"
|
||||||
|
label="当前绑定店铺"
|
||||||
|
:rules="[{ required: true, message: '请先登录拼多多跨境卖家中心', trigger: 'blur' }]">
|
||||||
|
<el-input readonly placeholder="请先登录拼多多跨境卖家中心" v-model="form.mallName"></el-input>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item
|
||||||
|
prop="mallId"
|
||||||
|
v-show="false"
|
||||||
|
:rules="[{ message: '请输入商城ID', trigger: 'blur' }]">
|
||||||
|
<el-input placeholder="请输入商城ID" v-model="form.mallId"></el-input>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item
|
||||||
|
prop="code"
|
||||||
|
label="激活码"
|
||||||
|
:rules="[{ required: true, message: '请输入激活码', trigger: 'blur' }]">
|
||||||
|
<el-input placeholder="请输入激活码" v-model="form.code"></el-input>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</div>
|
||||||
<el-row type="flex" align="middle">
|
<el-row type="flex" align="middle">
|
||||||
<ul class="fill" v-if="search.module == '0'">
|
<ul class="fill" v-if="search.module == '0'">
|
||||||
<li v-for="(desc,i) in descriptionsModule0" :key="i" v-text="desc"/>
|
<li v-for="(desc,i) in descriptionsModule0" :key="i" v-text="desc"/>
|
||||||
@@ -29,7 +64,7 @@
|
|||||||
<ul class="fill" v-if="search.module == '1'">
|
<ul class="fill" v-if="search.module == '1'">
|
||||||
<li v-for="(desc,i) in descriptionsModule1" :key="i" v-text="desc"/>
|
<li v-for="(desc,i) in descriptionsModule1" :key="i" v-text="desc"/>
|
||||||
</ul>
|
</ul>
|
||||||
<div class="fill flex-center">
|
<div class="fill flex-center" v-if="search.module != '2'">
|
||||||
<vue-qr v-if="qrcode" :text="qrcode" :size="120" :margin="8" :logoSrc="wechatLogo"/>
|
<vue-qr v-if="qrcode" :text="qrcode" :size="120" :margin="8" :logoSrc="wechatLogo"/>
|
||||||
<div v-else class="qrcode c-666">请选择<br>项目</div>
|
<div v-else class="qrcode c-666">请选择<br>项目</div>
|
||||||
<div class="c-999 ml-16">
|
<div class="c-999 ml-16">
|
||||||
@@ -43,14 +78,19 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</el-row>
|
</el-row>
|
||||||
<div class="bottom flex-center">
|
<div class="bottom flex-center" v-if="search.module != '2'">
|
||||||
<el-button size="small" @click="$emit('cancel')">取消支付</el-button>
|
<el-button size="small" @click="$store.commit('setActiveDlgShow', false)">取消支付</el-button>
|
||||||
<el-button size="small" @click="$emit('ok')">已扫码支付</el-button>
|
<el-button size="small" @click="paied">已扫码支付</el-button>
|
||||||
|
</div>
|
||||||
|
<div class="bottom flex-center" v-else>
|
||||||
|
<el-button size="small" @click="$store.commit('setActiveDlgShow', false)">取消</el-button>
|
||||||
|
<el-button size="small" @click="active">确定</el-button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
</template>
|
</template>
|
||||||
<script>
|
<script>
|
||||||
|
import { Message } from "element-ui"
|
||||||
import VueQr from "vue-qr"
|
import VueQr from "vue-qr"
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
@@ -59,6 +99,17 @@ export default {
|
|||||||
props: {},
|
props: {},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
|
form: {
|
||||||
|
mallId: this.$store.state.mallId,
|
||||||
|
mallName: this.$store.state.mallName,
|
||||||
|
code: ''
|
||||||
|
},
|
||||||
|
vipForm: {
|
||||||
|
mallId: this.$store.state.mallId,
|
||||||
|
mallName: this.$store.state.mallName
|
||||||
|
},
|
||||||
|
vipType: ["体验会员","年会员","年会员多店通用"],
|
||||||
|
|
||||||
search: {module: "0"},
|
search: {module: "0"},
|
||||||
show: true,
|
show: true,
|
||||||
descriptionsModule0: ["抢仓发货", "数据下载", "复制商品", "会员服务"],
|
descriptionsModule0: ["抢仓发货", "数据下载", "复制商品", "会员服务"],
|
||||||
@@ -74,6 +125,7 @@ export default {
|
|||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
getPayments() {
|
getPayments() {
|
||||||
|
if (this.search.module == '2') return
|
||||||
this.$http.post("/api/priceConfig/page", null, {
|
this.$http.post("/api/priceConfig/page", null, {
|
||||||
params: {...this.search}
|
params: {...this.search}
|
||||||
}).then(res => {
|
}).then(res => {
|
||||||
@@ -83,7 +135,10 @@ export default {
|
|||||||
})
|
})
|
||||||
},
|
},
|
||||||
getQrcode(item) {
|
getQrcode(item) {
|
||||||
|
if (item.module == '0' && !this.vipForm.mallId) {
|
||||||
|
Message.error("请先登录拼多多垮境卖家中心")
|
||||||
|
return
|
||||||
|
}
|
||||||
this.selected = item
|
this.selected = item
|
||||||
this.$http.post("/api/order/createOrder", null, {
|
this.$http.post("/api/order/createOrder", null, {
|
||||||
params: {priceConfigId: item.id}
|
params: {priceConfigId: item.id}
|
||||||
@@ -98,7 +153,44 @@ export default {
|
|||||||
this.qrcode = res.data.codeUrl
|
this.qrcode = res.data.codeUrl
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
},
|
||||||
|
paied() {
|
||||||
|
this.$store.dispatch('getUserInfo')
|
||||||
|
this.$store.commit('setActiveDlgShow', false)
|
||||||
|
},
|
||||||
|
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.$store.commit('setActiveDlgShow', false)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
},
|
},
|
||||||
created() {
|
created() {
|
||||||
this.getPayments()
|
this.getPayments()
|
||||||
|
|||||||
497
src/components/AiUploader.vue
Normal file
497
src/components/AiUploader.vue
Normal file
@@ -0,0 +1,497 @@
|
|||||||
|
<template>
|
||||||
|
<section class="uploader">
|
||||||
|
<el-upload
|
||||||
|
action
|
||||||
|
multiple
|
||||||
|
ref="upload"
|
||||||
|
:class="{validError:!validateState}"
|
||||||
|
:http-request="submitUpload"
|
||||||
|
:on-remove="handleRemove"
|
||||||
|
:on-change="handleChange"
|
||||||
|
:before-upload="onBeforeUpload"
|
||||||
|
:file-list="fileList"
|
||||||
|
:limit="limit"
|
||||||
|
:disabled="disabled"
|
||||||
|
:list-type="isImg ? 'picture-card' : 'text'"
|
||||||
|
:accept="accept"
|
||||||
|
:show-file-list="!isSingle"
|
||||||
|
:on-preview="handlePictureCardPreview"
|
||||||
|
:auto-upload="isAutoUpload"
|
||||||
|
:on-exceed="handleExceed">
|
||||||
|
<template v-if="!disabled">
|
||||||
|
<template v-if="hasUploaded&&isSingle">
|
||||||
|
<div class="fileItem">
|
||||||
|
<div class="uploadFile" @click.stop>
|
||||||
|
<div class="info">
|
||||||
|
<span v-text="uploadFile.name"/>
|
||||||
|
<span class="size" v-text="uploadFile.size"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<el-button>重新选择</el-button>
|
||||||
|
<el-button v-if="clearable" plain type="danger" @click.stop="handleClear">删除</el-button>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<template v-else-if="limit > fileList.length">
|
||||||
|
<slot v-if="hasTriggerSlot" name="trigger"/>
|
||||||
|
<div v-else class="uploaderBox">
|
||||||
|
<span class="iconfont" :class="isImg ? 'iconPhoto' : 'iconAdd'"/>
|
||||||
|
<p>上传{{ isImg ? '图片' : '附件' }}</p>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<div slot="tip" class="el-upload__tip" v-if="showTips">
|
||||||
|
<p v-if="fileType === 'img' && !acceptType && !hasTipsSlot">最多上传{{
|
||||||
|
limit
|
||||||
|
}}张图片,单个文件最大10MB,支持jpg、jpeg、png格式</p>
|
||||||
|
<p v-if="fileType === 'file' && !acceptType && !hasTipsSlot">最多上传{{ limit }}个附件,单个文件最大10MB</p>
|
||||||
|
<p v-if="fileType === 'file' && !acceptType && !hasTipsSlot">
|
||||||
|
支持.zip、.rar、.doc、.docx、.xls、.xlsx、.ppt、.pptx、.pdf、.txt、.jpg、.png格式</p>
|
||||||
|
<p>
|
||||||
|
<slot name="tips" v-if="hasTipsSlot"></slot>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</el-upload>
|
||||||
|
<el-dialog :visible.sync="dialog" title="图片预览编辑器" :modal="false" :show-close="false" z-index="202204131734"
|
||||||
|
append-to-body>
|
||||||
|
<vue-cropper
|
||||||
|
ref="cropper"
|
||||||
|
style="height: 400px;"
|
||||||
|
:img="fileList.length ? fileList[0].url : ''" v-bind="crop"/>
|
||||||
|
<div style="text-align: center;margin-top: 10px;">
|
||||||
|
<el-radio-group v-if="crop.fixed" size="small" v-model="currFixedIndex" @change="onFixedChange"
|
||||||
|
style="margin-right: 8px;">
|
||||||
|
<el-radio-button
|
||||||
|
:label="0"
|
||||||
|
size="small">
|
||||||
|
1.6:1
|
||||||
|
</el-radio-button>
|
||||||
|
<el-radio-button
|
||||||
|
:label="1"
|
||||||
|
size="small">
|
||||||
|
4:3
|
||||||
|
</el-radio-button>
|
||||||
|
</el-radio-group>
|
||||||
|
<el-button size="small" circle icon="el-icon-refresh-right" @click="$refs.cropper.rotateRight()"></el-button>
|
||||||
|
<el-button size="small" circle icon="el-icon-refresh-left" @click="$refs.cropper.rotateLeft()"></el-button>
|
||||||
|
</div>
|
||||||
|
<div slot="footer">
|
||||||
|
<el-button type="primary" @click="previewCrop">保存</el-button>
|
||||||
|
<el-button @click="onClose">关闭</el-button>
|
||||||
|
</div>
|
||||||
|
</el-dialog>
|
||||||
|
<div class="images" v-viewer="{movable: true}" v-show="false">
|
||||||
|
<img v-for="(item, index) in imgList" :src="item" :key="index" alt="">
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import {VueCropper} from 'vue-cropper'
|
||||||
|
import 'viewerjs/dist/viewer.css'
|
||||||
|
import Viewer from 'v-viewer'
|
||||||
|
import Vue from "vue";
|
||||||
|
|
||||||
|
Viewer.setDefaults({
|
||||||
|
zIndex: 20170
|
||||||
|
})
|
||||||
|
Vue.use(Viewer)
|
||||||
|
export default {
|
||||||
|
name: 'AiUploader',
|
||||||
|
components: {VueCropper},
|
||||||
|
inject: {
|
||||||
|
elFormItem: {default: ""},
|
||||||
|
elForm: {default: ''},
|
||||||
|
},
|
||||||
|
model: {
|
||||||
|
prop: 'value',
|
||||||
|
event: 'change'
|
||||||
|
},
|
||||||
|
props: {
|
||||||
|
value: {default: () => []},
|
||||||
|
url: {
|
||||||
|
type: String,
|
||||||
|
default: '/api/upload/uploadFile?folder=admin'
|
||||||
|
},
|
||||||
|
isShowTip: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false
|
||||||
|
},
|
||||||
|
isWechat: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false
|
||||||
|
},
|
||||||
|
maxSize: {
|
||||||
|
type: Number,
|
||||||
|
default: 10
|
||||||
|
},
|
||||||
|
instance: Function,
|
||||||
|
acceptType: {type: String},
|
||||||
|
fileType: {type: String, default: 'img'},
|
||||||
|
limit: {type: Number, default: 9},
|
||||||
|
disabled: {type: Boolean, default: false},
|
||||||
|
isCrop: {type: Boolean, default: false},
|
||||||
|
cropOps: Object,
|
||||||
|
isImport: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false
|
||||||
|
},
|
||||||
|
clearable: {default: true},
|
||||||
|
valueIsUrl: Boolean
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
fileList: [],
|
||||||
|
dialog: false,
|
||||||
|
currFixedIndex: 0,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
value: {
|
||||||
|
handler(v) {
|
||||||
|
this.dispatch('ElFormItem', 'el.form.change', [v]);
|
||||||
|
if (v?.length > 0) {
|
||||||
|
this.fileList = this.valueIsUrl ? v?.split(",")?.map(url => ({url})) : [...v]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
immediate: true,
|
||||||
|
deep: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
isImg() {
|
||||||
|
return this.fileType === 'img'
|
||||||
|
},
|
||||||
|
validateState() {
|
||||||
|
return ['', 'success'].includes(this.elFormItem?.validateState)
|
||||||
|
},
|
||||||
|
isAutoUpload() {
|
||||||
|
return !(this.isCrop || this.isImport);
|
||||||
|
},
|
||||||
|
hasTipsSlot() {
|
||||||
|
return this.$slots.tips
|
||||||
|
},
|
||||||
|
hasTriggerSlot() {
|
||||||
|
return this.$slots.trigger
|
||||||
|
},
|
||||||
|
accept() {
|
||||||
|
if (this.acceptType) {
|
||||||
|
return this.acceptType
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.isImg ? '.jpg,.png,.jpeg' : '.zip,.rar,.doc,.docx,.xls,.xlsx,.ppt,.pptx,.pdf,.txt,.jpg,.png'
|
||||||
|
},
|
||||||
|
crop() {
|
||||||
|
return {
|
||||||
|
autoCrop: true,
|
||||||
|
outputType: 'png',
|
||||||
|
fixedBox: false,
|
||||||
|
fixed: true,
|
||||||
|
fixedNumber: [1.6, 1],
|
||||||
|
width: 0,
|
||||||
|
height: 0,
|
||||||
|
...this.cropOps
|
||||||
|
}
|
||||||
|
},
|
||||||
|
imgList() {
|
||||||
|
return this.fileList.map(v => v.url)
|
||||||
|
},
|
||||||
|
isSingle() {
|
||||||
|
return this.limit == 1 && this.isImport
|
||||||
|
},
|
||||||
|
showTips() {
|
||||||
|
return this.isShowTip || this.$slots.tips
|
||||||
|
},
|
||||||
|
hasUploaded() {
|
||||||
|
return this.fileList?.length > 0
|
||||||
|
},
|
||||||
|
uploadFile() {
|
||||||
|
let file = this.fileList?.[0],
|
||||||
|
size = Number(file.size),
|
||||||
|
icon = "iconTxt"
|
||||||
|
//显示大小
|
||||||
|
if (size > Math.pow(1024, 2)) {
|
||||||
|
size = (size / Math.pow(1024, 2)).toFixed(1) + 'MB'
|
||||||
|
} else {
|
||||||
|
size = (size / 1024).toFixed(1) + 'KB'
|
||||||
|
}
|
||||||
|
//显示图标
|
||||||
|
if (/\.(xls|xlsx)$/.test(file.name)) {
|
||||||
|
icon = "iconExcel"
|
||||||
|
} else if (/\.(zip)$/.test(file.name)) {
|
||||||
|
icon = "iconZip"
|
||||||
|
} else if (/\.(rar)$/.test(file.name)) {
|
||||||
|
icon = "iconRar"
|
||||||
|
} else if (/\.(png)$/.test(file.name)) {
|
||||||
|
icon = "iconPng"
|
||||||
|
} else if (/\.(pptx|ppt)$/.test(file.name)) {
|
||||||
|
icon = "iconPPT"
|
||||||
|
} else if (/\.(doc|docx)$/.test(file.name)) {
|
||||||
|
icon = "iconWord"
|
||||||
|
}
|
||||||
|
|
||||||
|
return {...file, size, icon}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
onFixedChange(e) {
|
||||||
|
this.fixedNumber = e === 0 ? [1.6, 1] : [4, 3]
|
||||||
|
|
||||||
|
this.$nextTick(() => {
|
||||||
|
this.$refs.cropper.goAutoCrop()
|
||||||
|
})
|
||||||
|
},
|
||||||
|
handleChange(file, fileList) {
|
||||||
|
if (this.isImport) {
|
||||||
|
if (!this.onOverSize(file)) {
|
||||||
|
this.fileList = []
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
this.fileList = fileList
|
||||||
|
this.emitChange(fileList)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
if (this.isCrop) {
|
||||||
|
if (file.raw.type === 'image/gif') {
|
||||||
|
this.$message.error(`不支持gif格式的图片`)
|
||||||
|
this.fileList = []
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!this.onOverSize(file)) {
|
||||||
|
this.fileList = []
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
this.dialog = true
|
||||||
|
this.fileList = fileList
|
||||||
|
} else {
|
||||||
|
this.fileList = fileList
|
||||||
|
}
|
||||||
|
},
|
||||||
|
handleExceed(files) {
|
||||||
|
if (this.isSingle && files[0]) {
|
||||||
|
this.$refs.upload?.clearFiles()
|
||||||
|
this.$refs.upload?.handleStart(files[0])
|
||||||
|
} else this.$message.warning(`最多上传${this.limit}个${this.isImg ? '图片' : '文件'}`)
|
||||||
|
},
|
||||||
|
handlePictureCardPreview(file) {
|
||||||
|
if (this.fileType !== 'img') return
|
||||||
|
|
||||||
|
const index = this.imgList.indexOf(file.url)
|
||||||
|
const viewer = this.$el.querySelector('.images').$viewer
|
||||||
|
viewer.view(index)
|
||||||
|
},
|
||||||
|
|
||||||
|
handleRemove(file, fileList) {
|
||||||
|
this.fileList = fileList
|
||||||
|
this.emitChange(fileList)
|
||||||
|
},
|
||||||
|
emitChange(files) {
|
||||||
|
this.$emit('change', this.valueIsUrl ? files?.map(e => e.url)?.toString() : files)
|
||||||
|
},
|
||||||
|
handleClear() {
|
||||||
|
this.fileList = []
|
||||||
|
},
|
||||||
|
getExtension(name) {
|
||||||
|
return name.substring(name.lastIndexOf('.'))
|
||||||
|
},
|
||||||
|
|
||||||
|
onOverSize(e) {
|
||||||
|
const isLt10M = e.size / 1024 / 1024 < this.maxSize
|
||||||
|
const suffixName = this.getExtension(e.name)
|
||||||
|
const suffixNameList = this.accept.split(',')
|
||||||
|
|
||||||
|
if (suffixNameList.indexOf(`${suffixName.toLowerCase()}`) === -1) {
|
||||||
|
this.$message.error(`不支持该格式`)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isLt10M) {
|
||||||
|
this.$message.error(`${this.isImg ? '图片' : '文件'}大小不超过${this.maxSize}MB!`)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
return true
|
||||||
|
},
|
||||||
|
|
||||||
|
onBeforeUpload(event) {
|
||||||
|
return this.onOverSize(event)
|
||||||
|
},
|
||||||
|
|
||||||
|
onClose() {
|
||||||
|
this.fileList = []
|
||||||
|
this.dialog = false
|
||||||
|
},
|
||||||
|
|
||||||
|
submitUpload(file) {
|
||||||
|
let formData = new FormData()
|
||||||
|
formData.append('file', file.file)
|
||||||
|
this.instance.post(this.url, formData, {
|
||||||
|
withCredentials: false
|
||||||
|
}).then(res => {
|
||||||
|
if (res?.code == 0) {
|
||||||
|
let data = res.data
|
||||||
|
this.fileList.forEach(item => {
|
||||||
|
if (item.uid === file.file.uid) {
|
||||||
|
item.path = data
|
||||||
|
item.url = data
|
||||||
|
}
|
||||||
|
})
|
||||||
|
this.emitChange(this.fileList)
|
||||||
|
this.$message.success('上传成功')
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
previewCrop() {
|
||||||
|
this.$refs.cropper.getCropBlob(data => {
|
||||||
|
data.name = this.fileList[0].name;
|
||||||
|
this.fileList[0].file = new window.File([data], data.name, {type: data.type})
|
||||||
|
this.fileList[0].file.uid = this.fileList[0].uid
|
||||||
|
})
|
||||||
|
setTimeout(() => document.querySelector('.v-modal').style.zIndex = 2000, 500)
|
||||||
|
this.$confirm('是否关闭图片预览器,并上传图片?', {type: "warning"}).then(() => {
|
||||||
|
this.submitUpload(this.fileList[0])
|
||||||
|
this.dialog = false
|
||||||
|
}).catch(() => 0)
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* 表单验证
|
||||||
|
* @param componentName
|
||||||
|
* @param eventName
|
||||||
|
* @param params
|
||||||
|
*/
|
||||||
|
dispatch(componentName, eventName, params) {
|
||||||
|
let parent = this.$parent || this.$root;
|
||||||
|
let name = parent.$options.componentName;
|
||||||
|
|
||||||
|
while (parent && (!name || name !== componentName)) {
|
||||||
|
parent = parent.$parent;
|
||||||
|
|
||||||
|
if (parent) {
|
||||||
|
name = parent.$options.componentName;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (parent) {
|
||||||
|
parent.$emit.apply(parent, [eventName].concat(params));
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.uploader {
|
||||||
|
line-height: 1;
|
||||||
|
|
||||||
|
::v-deep.el-upload {
|
||||||
|
width: 100%;
|
||||||
|
text-align: start;
|
||||||
|
}
|
||||||
|
|
||||||
|
::v-deep.validError {
|
||||||
|
.el-button {
|
||||||
|
border-color: #f46;
|
||||||
|
color: #f46;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
::v-deep.el-upload--picture-card {
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
::v-deep .el-list-leave-active, ::v-deep .el-upload-list__item {
|
||||||
|
transition: all 0s !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
::v-deep.el-upload-list--picture-card .el-upload-list__item {
|
||||||
|
width: 120px;
|
||||||
|
height: 120px;
|
||||||
|
border-radius: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
::v-deep.el-upload--picture-card {
|
||||||
|
width: auto;
|
||||||
|
height: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-upload__tip p {
|
||||||
|
color: #999;
|
||||||
|
line-height: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
::v-deep.fileItem {
|
||||||
|
width: 100%;
|
||||||
|
height: 60px;
|
||||||
|
background: #FFFFFF;
|
||||||
|
border-radius: 2px;
|
||||||
|
border: 1px solid #D0D4DC;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
padding: 0 16px;
|
||||||
|
cursor: default;
|
||||||
|
|
||||||
|
.uploadFile {
|
||||||
|
text-align: start;
|
||||||
|
flex: 1;
|
||||||
|
min-width: 0;
|
||||||
|
display: flex;
|
||||||
|
color: #222;
|
||||||
|
|
||||||
|
.AiIcon {
|
||||||
|
width: 40px;
|
||||||
|
height: 40px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.info {
|
||||||
|
flex: 1;
|
||||||
|
min-width: 0;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
margin-left: 8px;
|
||||||
|
margin-right: 40px;
|
||||||
|
line-height: 22px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.size {
|
||||||
|
color: #888;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.uploaderBox {
|
||||||
|
width: 120px;
|
||||||
|
height: 120px;
|
||||||
|
line-height: 1;
|
||||||
|
background: #F3F4F7;
|
||||||
|
border-radius: 2px;
|
||||||
|
border: 1px solid #D0D4DC;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
opacity: 0.6;
|
||||||
|
}
|
||||||
|
|
||||||
|
span {
|
||||||
|
font-size: 32px;
|
||||||
|
color: #8899bb;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
color: #8899bb;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
margin: 0;
|
||||||
|
padding-top: 4px;
|
||||||
|
color: #555;
|
||||||
|
font-size: 12px;
|
||||||
|
text-align: center;
|
||||||
|
line-height: 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -1,25 +1,10 @@
|
|||||||
// import {genAnti} from "@/api/genAnti";
|
function injectScript(file, node) {
|
||||||
|
var th = document.getElementsByTagName(node)[0];
|
||||||
// const popup = document.createElement("div")
|
var s = document.createElement('script');
|
||||||
// popup.innerText = "获取Anti"
|
s.setAttribute('type', 'text/javascript');
|
||||||
// const styles = {
|
s.setAttribute('src', file);
|
||||||
// position: "fixed",
|
th.appendChild(s);
|
||||||
// right: '10px',
|
}
|
||||||
// top: '60px',
|
injectScript( chrome.runtime.getURL('/js/jszip.min.js'), 'body');
|
||||||
// zIndex: 9999,
|
injectScript( chrome.runtime.getURL('/js/FileSaver.js'), 'body');
|
||||||
// padding: "8px",
|
injectScript( chrome.runtime.getURL('/js/download.js'), 'body');
|
||||||
// background: "#409EFF",
|
|
||||||
// color: "#fff",
|
|
||||||
// borderRadius: "8px",
|
|
||||||
// cursor: "pointer"
|
|
||||||
// }
|
|
||||||
// for (const e in styles) {
|
|
||||||
// popup.style[e] = styles[e]
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// popup.addEventListener('click', async () => {
|
|
||||||
// const anti = await genAnti.a()
|
|
||||||
// console.log(anti)
|
|
||||||
// })
|
|
||||||
// document.body.appendChild(popup)
|
|
||||||
|
|
||||||
|
|||||||
@@ -39,11 +39,17 @@
|
|||||||
"content_scripts": [
|
"content_scripts": [
|
||||||
{
|
{
|
||||||
"matches": [
|
"matches": [
|
||||||
"<all_urls>"
|
"*://*.aliexpress.us/item/*"
|
||||||
],
|
],
|
||||||
"js": [
|
"js": [
|
||||||
"/content.js"
|
"/content.js"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
],
|
||||||
|
"web_accessible_resources": [
|
||||||
|
{
|
||||||
|
"resources": [ "js/download.js","js/jszip.min.js","js/FileSaver.js" ],
|
||||||
|
"matches": [ "*://*.aliexpress.us/*" ]
|
||||||
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -39,11 +39,17 @@
|
|||||||
"content_scripts": [
|
"content_scripts": [
|
||||||
{
|
{
|
||||||
"matches": [
|
"matches": [
|
||||||
"<all_urls>"
|
"*://*.aliexpress.us/item/*"
|
||||||
],
|
],
|
||||||
"js": [
|
"js": [
|
||||||
"/content.js"
|
"/content.js"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
],
|
||||||
|
"web_accessible_resources": [
|
||||||
|
{
|
||||||
|
"resources": [ "js/download.js","js/jszip.min.js","js/FileSaver.js" ],
|
||||||
|
"matches": [ "*://*.aliexpress.us/*" ]
|
||||||
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -85,16 +85,12 @@
|
|||||||
</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/>
|
||||||
<span slot="footer" class="dialog-footer">
|
|
||||||
<el-button @click="setActiveDlgShow(false)">取 消</el-button>
|
|
||||||
<el-button type="primary" @click="active">确 定</el-button>
|
|
||||||
</span>
|
|
||||||
</el-dialog>
|
</el-dialog>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -33,8 +33,7 @@
|
|||||||
</ai-search-bar>
|
</ai-search-bar>
|
||||||
<ai-search-bar>
|
<ai-search-bar>
|
||||||
<template #left>
|
<template #left>
|
||||||
<el-button type="button" :class="'el-button el-button--primary'" @click="beforeCopy(1)">从TEMU复制</el-button>
|
<el-button type="button" :class="'el-button el-button--primary'" @click="beforeCopy()">开始复制</el-button>
|
||||||
<el-button type="button" :class="'el-button el-button--primary'" @click="beforeCopy(2)">从速卖通复制</el-button>
|
|
||||||
</template>
|
</template>
|
||||||
</ai-search-bar>
|
</ai-search-bar>
|
||||||
<ai-table
|
<ai-table
|
||||||
@@ -57,14 +56,14 @@
|
|||||||
customFooter
|
customFooter
|
||||||
@close="handleClose">
|
@close="handleClose">
|
||||||
<el-form class="ai-form" :model="form" label-width="140px" ref="form">
|
<el-form class="ai-form" :model="form" label-width="140px" ref="form">
|
||||||
<el-form-item label="商品来源:" v-show="false" style="width: 100%;" prop="type" :rules="[{ required: true, message: '请选择商品来源', trigger: 'blur' }]">
|
<el-form-item label="商品来源:" style="width: 100%;" prop="type" :rules="[{ required: true, message: '请选择商品来源', trigger: 'blur' }]">
|
||||||
<el-radio-group v-model="form.type" size="medium">
|
<el-radio-group v-model="form.type" size="medium">
|
||||||
<el-radio :label="1">TEMU</el-radio>
|
<el-radio :label="1">TEMU</el-radio>
|
||||||
<el-radio :label="2">速卖通</el-radio>
|
<!--<el-radio :label="2">速卖通</el-radio>-->
|
||||||
</el-radio-group>
|
</el-radio-group>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="商品地址:" style="width: 100%;" prop="url" :rules="[{ required: true, message: '请输入商品地址', trigger: 'blur' }]">
|
<el-form-item label="商品地址:" style="width: 100%;" prop="url" :rules="[{ required: true, message: '请输入商品地址', trigger: 'blur' }]">
|
||||||
<el-input type="textarea" v-model="form.url"></el-input>
|
<el-input type="textarea" :rows="5" v-model="form.url"></el-input>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="店铺:" style="width: 100%;" prop="targetMallId" :rules="[{ required: true, message: '请选择店铺', trigger: 'blur' }]">
|
<el-form-item label="店铺:" style="width: 100%;" prop="targetMallId" :rules="[{ required: true, message: '请选择店铺', trigger: 'blur' }]">
|
||||||
<el-select style="width: 380px" v-model="form.targetMallId" placeholder="请选择">
|
<el-select style="width: 380px" v-model="form.targetMallId" placeholder="请选择">
|
||||||
@@ -248,7 +247,7 @@ const ImageEditor = require('tui-image-editor')
|
|||||||
}
|
}
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'CopyProduct',
|
name: 'NiubiCopy',
|
||||||
|
|
||||||
data () {
|
data () {
|
||||||
return {
|
return {
|
||||||
@@ -323,8 +322,8 @@ const ImageEditor = require('tui-image-editor')
|
|||||||
handleClose() {
|
handleClose() {
|
||||||
this.copyFromDlgShow = false
|
this.copyFromDlgShow = false
|
||||||
},
|
},
|
||||||
beforeCopy(type) {
|
beforeCopy() {
|
||||||
this.form.type = type
|
this.form.type = 1
|
||||||
this.form.url = ''
|
this.form.url = ''
|
||||||
this.copyFromDlgShow = true
|
this.copyFromDlgShow = true
|
||||||
},
|
},
|
||||||
|
|||||||
Reference in New Issue
Block a user