合并分支

master
lemon橪 2021-06-22 18:11:41 +08:00
commit b566a2fd4f
3 changed files with 118 additions and 75 deletions

View File

@ -1,27 +1,27 @@
// import Vue from 'vue'; // import Vue from 'vue';
import axios from "axios"; import axios from 'axios';
import https from "https"; import https from 'https';
import { Message, Spin, Modal } from "view-design"; import { Message, Spin, Modal } from 'view-design';
import Storage from "./storage"; import Storage from './storage';
import config from "@/config"; import config from '@/config';
import router from "../router/index.js"; import router from '../router/index.js';
import store from "../vuex/store"; import store from '../vuex/store';
import { handleRefreshToken } from "@/api/index"; import { handleRefreshToken } from '@/api/index';
const qs = require("qs"); const qs = require('qs');
export const buyerUrl = export const buyerUrl =
process.env.NODE_ENV === "development" process.env.NODE_ENV === 'development'
? config.api_dev.buyer ? config.api_dev.buyer
: config.api_prod.buyer; : config.api_prod.buyer;
export const commonUrl = export const commonUrl =
process.env.NODE_ENV === "development" process.env.NODE_ENV === 'development'
? config.api_dev.common ? config.api_dev.common
: config.api_prod.common; : config.api_prod.common;
export const managerUrl = export const managerUrl =
process.env.NODE_ENV === "development" process.env.NODE_ENV === 'development'
? config.api_dev.manager ? config.api_dev.manager
: config.api_prod.manager; : config.api_prod.manager;
export const sellerUrl = export const sellerUrl =
process.env.NODE_ENV === "development" process.env.NODE_ENV === 'development'
? config.api_dev.seller ? config.api_dev.seller
: config.api_prod.seller; : config.api_prod.seller;
// 创建axios实例 // 创建axios实例
@ -35,7 +35,7 @@ const service = axios.create({
}), }),
paramsSerializer: params => paramsSerializer: params =>
qs.stringify(params, { qs.stringify(params, {
arrayFormat: "repeat" arrayFormat: 'repeat'
}) })
}); });
@ -44,15 +44,15 @@ service.interceptors.request.use(
config => { config => {
const { loading } = config; const { loading } = config;
// 如果是put/post请求用qs.stringify序列化参数 // 如果是put/post请求用qs.stringify序列化参数
const isPutPost = config.method === "put" || config.method === "post"; const isPutPost = config.method === 'put' || config.method === 'post';
const isJson = config.headers["Content-Type"] === "application/json"; const isJson = config.headers['Content-Type'] === 'application/json';
const isFile = config.headers["Content-Type"] === "multipart/form-data"; const isFile = config.headers['Content-Type'] === 'multipart/form-data';
if (isPutPost && isJson) { if (isPutPost && isJson) {
config.data = JSON.stringify(config.data); config.data = JSON.stringify(config.data);
} }
if (isPutPost && !isFile && !isJson) { if (isPutPost && !isFile && !isJson) {
config.data = qs.stringify(config.data, { config.data = qs.stringify(config.data, {
arrayFormat: "repeat" arrayFormat: 'repeat'
}); });
} }
/** 配置全屏加载 */ /** 配置全屏加载 */
@ -60,16 +60,16 @@ service.interceptors.request.use(
config.loading = Spin.show(); config.loading = Spin.show();
} }
const uuid = Storage.getItem("uuid"); const uuid = Storage.getItem('uuid');
config.headers["uuid"] = uuid; config.headers['uuid'] = uuid;
// 获取访问Token // 获取访问Token
let accessToken = Storage.getItem("accessToken"); let accessToken = Storage.getItem('accessToken');
if (accessToken && config.needToken) { if (accessToken && config.needToken) {
config.headers["accessToken"] = accessToken; config.headers['accessToken'] = accessToken;
// 解析当前token时间 // 解析当前token时间
let jwtData = JSON.parse( let jwtData = JSON.parse(
decodeURIComponent(escape(window.atob(accessToken.split(".")[1]))) decodeURIComponent(escape(window.atob(accessToken.split('.')[1].replace(/-/g, '+').replace(/_/g, '/'))))
); );
if (jwtData.exp < Math.round(new Date() / 1000)) { if (jwtData.exp < Math.round(new Date() / 1000)) {
refresh() refresh()
@ -83,33 +83,33 @@ service.interceptors.request.use(
} }
); );
async function refresh() { async function refresh () {
const getTokenRes = await refreshToken(); const getTokenRes = await refreshToken();
if (getTokenRes === "success") { if (getTokenRes === 'success') {
// 刷新token // 刷新token
if (isRefreshToken === 1) { if (isRefreshToken === 1) {
error.response.config.headers.accessToken = Storage.getItem( error.response.config.headers.accessToken = Storage.getItem(
"accessToken" 'accessToken'
); );
return service(error.response.config); return service(error.response.config);
} else { } else {
router.go(0); router.go(0);
} }
} else { } else {
Storage.removeItem("accessToken"); Storage.removeItem('accessToken');
Storage.removeItem("refreshToken"); Storage.removeItem('refreshToken');
Storage.removeItem("userInfo"); Storage.removeItem('userInfo');
Storage.setItem("cartNum", 0); Storage.setItem('cartNum', 0);
store.commit("SET_CARTNUM", 0); store.commit('SET_CARTNUM', 0);
console.log("1111"); console.log('1111');
Modal.confirm({ Modal.confirm({
title: "请登录", title: '请登录',
content: "<p>请登录后执行此操作</p>", content: '<p>请登录后执行此操作</p>',
okText: "立即登录", okText: '立即登录',
cancelText: "继续浏览", cancelText: '继续浏览',
onOk: () => { onOk: () => {
router.push({ router.push({
path: "/login", path: '/login',
query: { query: {
rePath: router.history.current.path, rePath: router.history.current.path,
query: JSON.stringify(router.history.current.query) query: JSON.stringify(router.history.current.query)
@ -146,9 +146,9 @@ service.interceptors.response.use(
} else { } else {
if (error.message) { if (error.message) {
let _message = let _message =
error.code === "ECONNABORTED" error.code === 'ECONNABORTED'
? "连接超时,请稍候再试!" ? '连接超时,请稍候再试!'
: "网络错误,请稍后再试!"; : '网络错误,请稍后再试!';
Message.error(errorData.message || _message); Message.error(errorData.message || _message);
} }
} }
@ -171,13 +171,13 @@ const closeLoading = target => {
}; };
export const Method = { export const Method = {
GET: "get", GET: 'get',
POST: "post", POST: 'post',
PUT: "put", PUT: 'put',
DELETE: "delete" DELETE: 'delete'
}; };
export default function request(options) { export default function request (options) {
// 如果是服务端或者是请求的刷新token不需要检查token直接请求。 // 如果是服务端或者是请求的刷新token不需要检查token直接请求。
// if (process.server || options.url.indexOf('passport/token') !== -1) { // if (process.server || options.url.indexOf('passport/token') !== -1) {
return service(options); return service(options);
@ -186,19 +186,19 @@ export default function request(options) {
} }
// 防抖闭包来一波 // 防抖闭包来一波
function getTokenDebounce() { function getTokenDebounce () {
let lock = false; let lock = false;
let success = false; let success = false;
return function() { return function () {
if (!lock) { if (!lock) {
lock = true; lock = true;
let oldRefreshToken = Storage.getItem("refreshToken"); let oldRefreshToken = Storage.getItem('refreshToken');
handleRefreshToken(oldRefreshToken) handleRefreshToken(oldRefreshToken)
.then(res => { .then(res => {
if (res.success) { if (res.success) {
let { accessToken, refreshToken } = res.result; let { accessToken, refreshToken } = res.result;
Storage.setItem("accessToken", accessToken); Storage.setItem('accessToken', accessToken);
Storage.setItem("refreshToken", refreshToken); Storage.setItem('refreshToken', refreshToken);
success = true; success = true;
lock = false; lock = false;
@ -220,9 +220,9 @@ function getTokenDebounce() {
if (!lock) { if (!lock) {
clearInterval(timer); clearInterval(timer);
if (success) { if (success) {
resolve("success"); resolve('success');
} else { } else {
resolve("fail"); resolve('fail');
} }
} }
}, 500); // 轮询时间间隔 }, 500); // 轮询时间间隔

View File

@ -38,6 +38,12 @@
<Option value="DOWN">下架</Option> <Option value="DOWN">下架</Option>
</Select> </Select>
</Form-item> </Form-item>
<Form-item label="商品类型" prop="status">
<Select v-model="searchForm.goodsType" placeholder="请选择" clearable style="width: 200px">
<Option value="PHYSICAL_GOODS">实物商品</Option>
<Option value="VIRTUAL_GOODS">虚拟商品</Option>
</Select>
</Form-item>
<Button @click="handleSearch" class="search-btn" type="primary" icon="ios-search" >搜索</Button> <Button @click="handleSearch" class="search-btn" type="primary" icon="ios-search" >搜索</Button>
</Form> </Form>
</Row> </Row>
@ -174,6 +180,20 @@ export default {
); );
}, },
}, },
{
title: "商品类型",
key: "goodsType",
width: 130,
render: (h, params) => {
if (params.row.goodsType === 'PHYSICAL_GOODS') {
return h("div", "实物商品");
} else if (params.row.goodsType === 'VIRTUAL_GOODS') {
return h("div", "虚拟商品");
} else {
return h("div", "电子卡券");
}
},
},
{ {
title: "状态", title: "状态",
key: "marketEnable", key: "marketEnable",

View File

@ -4,7 +4,7 @@
<Row @keydown.enter.native="handleSearch"> <Row @keydown.enter.native="handleSearch">
<Form ref="searchForm" :model="searchForm" inline :label-width="70" class="search-form"> <Form ref="searchForm" :model="searchForm" inline :label-width="70" class="search-form">
<Form-item label="商品名称" prop="goodsName"> <Form-item label="商品名称" prop="goodsName">
<Input type="text" v-model="searchForm.goodsName" placeholder="请输入商品名称" clearable style="width: 200px" /> <Input type="text" v-model="searchForm.goodsName" placeholder="请输入商品名称" clearable style="width: 200px"/>
</Form-item> </Form-item>
<Form-item label="状态" prop="status"> <Form-item label="状态" prop="status">
<Select v-model="searchForm.marketEnable" placeholder="请选择" clearable style="width: 200px"> <Select v-model="searchForm.marketEnable" placeholder="请选择" clearable style="width: 200px">
@ -12,8 +12,14 @@
<Option value="UPPER">上架</Option> <Option value="UPPER">上架</Option>
</Select> </Select>
</Form-item> </Form-item>
<Form-item label="商品类型" prop="status">
<Select v-model="searchForm.goodsType" placeholder="请选择" clearable style="width: 200px">
<Option value="PHYSICAL_GOODS">实物商品</Option>
<Option value="VIRTUAL_GOODS">虚拟商品</Option>
</Select>
</Form-item>
<Form-item label="商品编号" prop="sn"> <Form-item label="商品编号" prop="sn">
<Input type="text" v-model="searchForm.sn" placeholder="商品编号" clearable style="width: 200px" /> <Input type="text" v-model="searchForm.sn" placeholder="商品编号" clearable style="width: 200px"/>
</Form-item> </Form-item>
<Button @click="handleSearch" type="primary" icon="ios-search" class="search-btn">搜索</Button> <Button @click="handleSearch" type="primary" icon="ios-search" class="search-btn">搜索</Button>
<Button @click="handleReset" class="search-btn">重置</Button> <Button @click="handleReset" class="search-btn">重置</Button>
@ -45,11 +51,12 @@
<div style="margin-left: 13px;"> <div style="margin-left: 13px;">
<div class="div-zoom"> <div class="div-zoom">
<a @click="linkTo(row.id,row.skuId)">{{row.goodsName}}</a> <a @click="linkTo(row.id,row.skuId)">{{ row.goodsName }}</a>
</div> </div>
<Poptip trigger="hover" title="扫码在手机中查看" transfer> <Poptip trigger="hover" title="扫码在手机中查看" transfer>
<div slot="content"> <div slot="content">
<vue-qr :text="wapLinkTo(row.id,row.skuId)" :margin="0" colorDark="#000" colorLight="#fff" :size="150"></vue-qr> <vue-qr :text="wapLinkTo(row.id,row.skuId)" :margin="0" colorDark="#000" colorLight="#fff"
:size="150"></vue-qr>
</div> </div>
<img src="../../../assets/qrcode.svg" class="hover-pointer" width="20" height="20" alt=""> <img src="../../../assets/qrcode.svg" class="hover-pointer" width="20" height="20" alt="">
</Poptip> </Poptip>
@ -60,13 +67,14 @@
</Table> </Table>
<Row type="flex" justify="end" class="page"> <Row type="flex" justify="end" class="page">
<Page :current="searchForm.pageNumber" :total="total" :page-size="searchForm.pageSize" @on-change="changePage" @on-page-size-change="changePageSize" :page-size-opts="[10, 20, 50]" size="small" <Page :current="searchForm.pageNumber" :total="total" :page-size="searchForm.pageSize" @on-change="changePage"
show-total show-elevator show-sizer></Page> @on-page-size-change="changePageSize" :page-size-opts="[10, 20, 50]" size="small"
show-total show-elevator show-sizer></Page>
</Row> </Row>
</Card> </Card>
<Modal title="更新库存" v-model="updateStockModalVisible" :mask-closable="false" :width="500"> <Modal title="更新库存" v-model="updateStockModalVisible" :mask-closable="false" :width="500">
<Input type="number" v-model="stockAllUpdate" placeholder="全部修改,如不需全部修改,则不需输入" /> <Input type="number" v-model="stockAllUpdate" placeholder="全部修改,如不需全部修改,则不需输入"/>
<Table :columns="updateStockColumns" :data="stockList" border :span-method="handleSpan"></Table> <Table :columns="updateStockColumns" :data="stockList" border :span-method="handleSpan"></Table>
<div slot="footer"> <div slot="footer">
<Button type="text" @click="updateStockModalVisible = false">取消</Button> <Button type="text" @click="updateStockModalVisible = false">取消</Button>
@ -78,7 +86,8 @@
<Modal title="批量设置运费模板" v-model="shipTemplateModal" :mask-closable="false" :width="500"> <Modal title="批量设置运费模板" v-model="shipTemplateModal" :mask-closable="false" :width="500">
<Form ref="shipTemplateForm" :model="shipTemplateForm" :label-width="120"> <Form ref="shipTemplateForm" :model="shipTemplateForm" :label-width="120">
<FormItem class="form-item-view-el" label="运费" prop="freightPayer"> <FormItem class="form-item-view-el" label="运费" prop="freightPayer">
<RadioGroup type="button" button-style="solid" @on-change="logisticsTemplateUndertakerChange" v-model="shipTemplateForm.freightPayer"> <RadioGroup type="button" button-style="solid" @on-change="logisticsTemplateUndertakerChange"
v-model="shipTemplateForm.freightPayer">
<Radio label="STORE"> <Radio label="STORE">
<span>卖家承担运费</span> <span>卖家承担运费</span>
</Radio> </Radio>
@ -245,6 +254,20 @@ export default {
); );
}, },
}, },
{
title: "商品类型",
key: "goodsType",
width: 130,
render: (h, params) => {
if (params.row.goodsType === 'PHYSICAL_GOODS') {
return h("div", "实物商品");
} else if (params.row.goodsType === 'VIRTUAL_GOODS') {
return h("div", "虚拟商品");
} else {
return h("div", "电子卡券");
}
},
},
{ {
title: "商品价格", title: "商品价格",
key: "price", key: "price",
@ -432,10 +455,10 @@ export default {
this.getDataList(); this.getDataList();
}, },
addGoods() { addGoods() {
this.$router.push({ name: "goods-operation" }); this.$router.push({name: "goods-operation"});
}, },
editGoods(v) { editGoods(v) {
this.$router.push({ name: "goods-operation-edit", query: { id: v.id } }); this.$router.push({name: "goods-operation-edit", query: {id: v.id}});
}, },
// //
@ -458,7 +481,7 @@ export default {
} }
}, },
getStockDetail(id) { getStockDetail(id) {
getGoodsSkuListDataSeller({ goodsId: id, pageSize: 1000 }).then((res) => { getGoodsSkuListDataSeller({goodsId: id, pageSize: 1000}).then((res) => {
if (res.success) { if (res.success) {
this.updateStockModalVisible = true; this.updateStockModalVisible = true;
this.stockAllUpdate = undefined; this.stockAllUpdate = undefined;
@ -468,7 +491,7 @@ export default {
}, },
updateStock() { updateStock() {
let updateStockList = this.stockList.map((i) => { let updateStockList = this.stockList.map((i) => {
let j = { skuId: i.id, quantity: i.quantity }; let j = {skuId: i.id, quantity: i.quantity};
if (this.stockAllUpdate) { if (this.stockAllUpdate) {
j.quantity = this.stockAllUpdate; j.quantity = this.stockAllUpdate;
} }
@ -481,28 +504,28 @@ export default {
} }
}); });
}, },
changePage (v) { changePage(v) {
this.searchForm.pageNumber = v; this.searchForm.pageNumber = v;
this.getDataList(); this.getDataList();
this.clearSelectAll(); this.clearSelectAll();
}, },
changePageSize (v) { changePageSize(v) {
this.searchForm.pageSize = v; this.searchForm.pageSize = v;
this.getDataList(); this.getDataList();
}, },
handleSearch () { handleSearch() {
this.searchForm.pageNumber = 1; this.searchForm.pageNumber = 1;
this.searchForm.pageSize = 10; this.searchForm.pageSize = 10;
this.getDataList(); this.getDataList();
}, },
handleReset () { handleReset() {
this.searchForm = {}; this.searchForm = {};
this.searchForm.pageNumber = 1; this.searchForm.pageNumber = 1;
this.searchForm.pageSize = 10; this.searchForm.pageSize = 10;
// //
this.getDataList(); this.getDataList();
}, },
changeSort (e) { changeSort(e) {
this.searchForm.sort = e.key; this.searchForm.sort = e.key;
this.searchForm.order = e.order; this.searchForm.order = e.order;
if (e.order === "normal") { if (e.order === "normal") {
@ -510,15 +533,15 @@ export default {
} }
this.getDataList(); this.getDataList();
}, },
clearSelectAll () { clearSelectAll() {
this.$refs.table.selectAll(false); this.$refs.table.selectAll(false);
}, },
changeSelect (e) { changeSelect(e) {
this.selectList = e; this.selectList = e;
this.selectCount = e.length; this.selectCount = e.length;
}, },
// //
saveShipTemplate () { saveShipTemplate() {
if (this.shipTemplateForm.freightPayer == "STORE") { if (this.shipTemplateForm.freightPayer == "STORE") {
{ {
this.shipTemplateForm.templateId = 0; this.shipTemplateForm.templateId = 0;
@ -716,10 +739,10 @@ export default {
}); });
}, },
}, },
mounted () { mounted() {
this.init(); this.init();
}, },
activated () { activated() {
this.init(); this.init();
}, },
}; };