优化部分样式问题,新增部分功能,解决发现的bug,暂未完全测试通过。

master
lemon橪 2021-06-10 18:31:54 +08:00
parent 8b3d19625f
commit c9ea7ba898
30 changed files with 1143 additions and 1131 deletions

View File

@ -1,53 +1,58 @@
// import Vue from 'vue';
import axios from 'axios';
import https from 'https';
import {
Message,
Spin,
Modal
} from 'view-design';
import Storage from './storage';
import config from '@/config';
import router from '../router/index.js';
import store from '../vuex/store';
import {
handleRefreshToken
} from '@/api/index';
const qs = require('qs');
export const buyerUrl = (process.env.NODE_ENV === 'development' ? config.api_dev.buyer : config.api_prod.buyer);
export const commonUrl = (process.env.NODE_ENV === 'development' ? config.api_dev.common : config.api_prod.common);
export const managerUrl = (process.env.NODE_ENV === 'development' ? config.api_dev.manager : config.api_prod.manager);
export const sellerUrl = (process.env.NODE_ENV === 'development' ? config.api_dev.seller : config.api_prod.seller);
import axios from "axios";
import https from "https";
import { Message, Spin, Modal } from "view-design";
import Storage from "./storage";
import config from "@/config";
import router from "../router/index.js";
import store from "../vuex/store";
import { handleRefreshToken } from "@/api/index";
const qs = require("qs");
export const buyerUrl =
process.env.NODE_ENV === "development"
? config.api_dev.buyer
: config.api_prod.buyer;
export const commonUrl =
process.env.NODE_ENV === "development"
? config.api_dev.common
: config.api_prod.common;
export const managerUrl =
process.env.NODE_ENV === "development"
? config.api_dev.manager
: config.api_prod.manager;
export const sellerUrl =
process.env.NODE_ENV === "development"
? config.api_dev.seller
: config.api_prod.seller;
// 创建axios实例
var isRefreshToken = 0;
const refreshToken = getTokenDebounce()
const refreshToken = getTokenDebounce();
const service = axios.create({
timeout: 10000, // 请求超时时间
baseURL: buyerUrl, // API
httpsAgent: new https.Agent({
rejectUnauthorized: false
}),
paramsSerializer: params => qs.stringify(params, {
arrayFormat: 'repeat'
paramsSerializer: params =>
qs.stringify(params, {
arrayFormat: "repeat"
})
});
// request拦截器
service.interceptors.request.use(config => {
const {
loading
} = config;
service.interceptors.request.use(
config => {
const { loading } = config;
// 如果是put/post请求用qs.stringify序列化参数
const isPutPost = config.method === 'put' || config.method === 'post';
const isJson = config.headers['Content-Type'] === 'application/json';
const isFile = config.headers['Content-Type'] === 'multipart/form-data';
const isPutPost = config.method === "put" || config.method === "post";
const isJson = config.headers["Content-Type"] === "application/json";
const isFile = config.headers["Content-Type"] === "multipart/form-data";
if (isPutPost && isJson) {
config.data = JSON.stringify(config.data);
}
if (isPutPost && !isFile && !isJson) {
config.data = qs.stringify(config.data, {
arrayFormat: 'repeat'
arrayFormat: "repeat"
});
}
/** 配置全屏加载 */
@ -55,23 +60,74 @@ service.interceptors.request.use(config => {
config.loading = Spin.show();
}
const uuid = Storage.getItem('uuid');
config.headers['uuid'] = uuid;
const uuid = Storage.getItem("uuid");
config.headers["uuid"] = uuid;
// 获取访问Token
let accessToken = Storage.getItem('accessToken');
let accessToken = Storage.getItem("accessToken");
if (accessToken && config.needToken) {
config.headers['accessToken'] = accessToken;
config.headers["accessToken"] = accessToken;
// 解析当前token时间
let jwtData = JSON.parse(
decodeURIComponent(escape(window.atob(accessToken.split(".")[1])))
);
if (jwtData.exp < new Date().getTime() / 1000) {
refresh()
}
}
return config;
}, error => {
},
error => {
Promise.reject(error);
}
);
async function refresh() {
const getTokenRes = await refreshToken();
if (getTokenRes === "success") {
// 刷新token
if (isRefreshToken === 1) {
error.response.config.headers.accessToken = Storage.getItem(
"accessToken"
);
return service(error.response.config);
} else {
router.go(0);
}
} else {
Storage.removeItem("accessToken");
Storage.removeItem("refreshToken");
Storage.removeItem("userInfo");
Storage.setItem("cartNum", 0);
store.commit("SET_CARTNUM", 0);
console.log("1111");
Modal.confirm({
title: "请登录",
content: "<p>请登录后执行此操作</p>",
okText: "立即登录",
cancelText: "继续浏览",
onOk: () => {
router.push({
path: "/login",
query: {
rePath: router.history.current.path,
query: JSON.stringify(router.history.current.query)
}
});
},
onCancel: () => {
Modal.remove();
}
});
}
}
// respone拦截器
service.interceptors.response.use(
async response => {
await closeLoading(response);
return response.data;
},
async error => {
@ -84,45 +140,15 @@ service.interceptors.response.use(
isRefreshToken++;
if (isRefreshToken === 1) {
const getTokenRes = await refreshToken();
if (getTokenRes === 'success') { // 刷新token
if (isRefreshToken === 1) {
error.response.config.headers.accessToken = Storage.getItem('accessToken')
return service(error.response.config)
} else {
router.go(0)
}
} else {
Storage.removeItem('accessToken');
Storage.removeItem('refreshToken');
Storage.removeItem('userInfo');
Storage.setItem('cartNum', 0)
store.commit('SET_CARTNUM', 0)
console.log('1111');
Modal.confirm({
title: '请登录',
content: '<p>请登录后执行此操作</p>',
okText: '立即登录',
cancelText: '继续浏览',
onOk: () => {
router.push({
path: '/login',
query: {
rePath: router.history.current.path,
query: JSON.stringify(router.history.current.query)
}
});
},
onCancel: () => {
Modal.remove();
}
});
}
isRefreshToken = 0
refresh()
isRefreshToken = 0;
}
} else {
if (error.message) {
let _message = error.code === 'ECONNABORTED' ? '连接超时,请稍候再试!' : '网络错误,请稍后再试!';
let _message =
error.code === "ECONNABORTED"
? "连接超时,请稍候再试!"
: "网络错误,请稍后再试!";
Message.error(errorData.message || _message);
}
}
@ -134,7 +160,7 @@ service.interceptors.response.use(
* 关闭全局加载
* @param target
*/
const closeLoading = (target) => {
const closeLoading = target => {
if (!target.config || !target.config.loading) return true;
return new Promise((resolve, reject) => {
setTimeout(() => {
@ -145,10 +171,10 @@ const closeLoading = (target) => {
};
export const Method = {
GET: 'get',
POST: 'post',
PUT: 'put',
DELETE: 'delete'
GET: "get",
POST: "post",
PUT: "put",
DELETE: "delete"
};
export default function request(options) {
@ -161,46 +187,45 @@ export default function request (options) {
// 防抖闭包来一波
function getTokenDebounce() {
let lock = false
let success = false
let lock = false;
let success = false;
return function() {
if (!lock) {
lock = true
let oldRefreshToken = Storage.getItem('refreshToken');
handleRefreshToken(oldRefreshToken).then(res => {
lock = true;
let oldRefreshToken = Storage.getItem("refreshToken");
handleRefreshToken(oldRefreshToken)
.then(res => {
if (res.success) {
let {
accessToken,
refreshToken
} = res.result;
Storage.setItem('accessToken', accessToken);
Storage.setItem('refreshToken', refreshToken);
let { accessToken, refreshToken } = res.result;
Storage.setItem("accessToken", accessToken);
Storage.setItem("refreshToken", refreshToken);
success = true
lock = false
success = true;
lock = false;
} else {
success = false
lock = false
success = false;
lock = false;
// router.push('/login')
}
}).catch((err) => {
console.log(err);
success = false
lock = false
})
.catch(err => {
console.log(err);
success = false;
lock = false;
});
}
return new Promise(resolve => {
// 一直看lock,直到请求失败或者成功
const timer = setInterval(() => {
if (!lock) {
clearInterval(timer)
clearInterval(timer);
if (success) {
resolve('success')
resolve("success");
} else {
resolve('fail')
resolve("fail");
}
}
}, 500) // 轮询时间间隔
})
}
}, 500); // 轮询时间间隔
});
};
}

View File

@ -3,13 +3,7 @@
<div class="model-title">
<div>店铺装修</div>
<div class="btns">
<Button
@click="clickBtn(item)"
size="small"
v-for="(item, index) in way"
:key="index"
:type="item.selected ? 'primary' : ''"
>
<Button @click="clickBtn(item)" size="small" v-for="(item, index) in way" :key="index" :type="item.selected ? 'primary' : ''">
{{ item.title }}
</Button>
</div>
@ -21,17 +15,9 @@
<div ref="qrCodeUrl"></div>
</div>
</Poptip>
<Button size="default" type="primary" @click="handleSpinShow"
>保存模板</Button
>
<Button size="default" type="primary" @click="handleSpinShow"></Button>
<Modal
title="保存中"
v-model="saveDialog"
:closable="true"
:mask-closable="false"
:footer-hide="true"
>
<Modal title="保存中" v-model="saveDialog" :closable="true" :mask-closable="false" :footer-hide="true">
<div v-if="progress">
<div class="model-item">
模板名称 <Input style="width: 200px" v-model="submitWay.name" />
@ -61,7 +47,8 @@ export default {
progress: true, //
num: 20, //
saveDialog: false, //
way: [ // tab
way: [
// tab
{
title: "首页",
name: "index",
@ -80,7 +67,8 @@ export default {
},
],
qrcode: "", //
submitWay: { //
submitWay: {
//
pageShow: this.$route.query.type || false,
name: this.$route.query.name || "模板名称",
pageClientType: "H5",
@ -129,6 +117,8 @@ export default {
pageData: JSON.stringify(this.$store.state.styleStore),
name: this.submitWay.name,
pageShow: this.submitWay.pageShow,
pageType: "INDEX",
pageClientType: "H5",
})
.then((res) => {
this.num = 50;

View File

@ -1,6 +1,6 @@
.image-mode {
max-width: 100%;
height: auto;
width: 100%;
height: 100%;
display: block;
padding: 1px;
}

View File

@ -13,15 +13,12 @@
export default {
title: "五列单行图片模块",
props: ["res"],
mounted() {
console.log(this.res);
}
};
</script>
<style lang="scss" scoped>
@import "./tpl.scss";
.layout {
background: #e8e8e8;
display: flex;
align-items: center;
justify-content: center;

View File

@ -12,20 +12,21 @@
export default {
title: "四列单行图片模块",
props: ["res"],
mounted() {
console.log(this.res);
}
};
</script>
<style lang="scss" scoped>
@import "./tpl.scss";
.layout {
height: 84px;
// background: #e8e8e8;
// height: 84px;
display: flex;
padding: 0 8px;
align-items: center;
justify-content: center;
background-size: cover;
}
img{
width: 84px;
}

View File

@ -11,14 +11,12 @@
export default {
title: "三列单行图片模块",
props: ["res"],
mounted() {
console.log(this.res);
}
};
</script>
<style lang="scss" scoped>
@import "./tpl.scss";
.layout {
background: #e8e8e8;
height: 110px;
display: flex;
align-items: center;

View File

@ -20,7 +20,7 @@ export default {
title: "左一右二",
props: ["res"],
mounted() {
console.log(this.res);
}
};
</script>

View File

@ -10,7 +10,7 @@
</div>
</div>
<div class="view-height-150">
<img class="image-mode" :src="res.list[2].img" />
<img class="image-mode" style="height:150px;" :src="res.list[2].img" />
</div>
</div>
</template>
@ -21,18 +21,22 @@ export default {
props: ["res"],
mounted() {
console.log(this.res);
}
},
};
</script>
<style lang="scss" scoped>
@import "./tpl.scss";
.layout {
height: 167px;
height: 150px;
display: flex;
align-items: center;
justify-content: center;
background-size: cover;
}
.view-height-75 {
.image-mode {
height: 75px;
}
}
</style>

View File

@ -23,12 +23,7 @@
</Row>
<!-- 拼图验证码 -->
<verify
ref="verify"
class="verify-con"
verifyType="LOGIN"
@change="verifyChange"
></verify>
<verify ref="verify" class="verify-con" verifyType="LOGIN" @change="verifyChange"></verify>
<div v-if="socialLogining">
<RectLoading />
</div>
@ -48,7 +43,7 @@ import LangSwitch from "@/views/main-components/lang-switch";
import RectLoading from "@/views/my-components/lili/rect-loading";
import CountDownButton from "@/views/my-components/lili/count-down-button";
import util from "@/libs/util.js";
import verify from '@/views/my-components/verify';
import verify from "@/views/my-components/verify";
export default {
components: {
@ -57,18 +52,20 @@ export default {
LangSwitch,
Header,
Footer,
verify
verify,
},
data() {
return {
loading: false, //
form: { //
form: {
//
username: "",
password: "",
mobile: "",
code: "",
},
rules: { //
rules: {
//
username: [
{
required: true,
@ -88,7 +85,8 @@ export default {
},
methods: {
mounted() {},
afterLogin(res) { //
afterLogin(res) {
//
let accessToken = res.result.accessToken;
let refreshToken = res.result.refreshToken;
this.setStore("accessToken", accessToken);
@ -109,28 +107,35 @@ export default {
}
});
},
submitLogin() { //
submitLogin() {
//
this.$refs.usernameLoginForm.validate((valid) => {
if (valid) {
this.$refs.verify.show = true;
}
});
},
verifyChange (con) { //
verifyChange(con) {
//
if (!con.status) return;
this.loading = true;
login({
username: this.form.username,
password: this.md5(this.form.password),
}).then((res) => {
})
.then((res) => {
if (res && res.success) {
this.afterLogin(res);
} else {
this.loading = false;
}
}).catch(()=>{this.loading = false});
}
})
.catch(() => {
this.loading = false;
});
this.$refs.verify.show = false;
},
},
};
</script>
@ -198,5 +203,4 @@ export default {
.flex {
justify-content: center;
}
</style>

View File

@ -2,7 +2,6 @@
<div>
<Row class="header">
<img src="../../assets/logo.png" class="logo" width="220px">
<!-- <div class="description">{{ $t('LILISHOP-ADMIN') }}</div> -->
</Row>
</div>
</template>
@ -15,13 +14,13 @@ export default {
<style lang="scss" scoped>
.header {
margin-bottom: 6vh;
text-align: center;
display: flex;
justify-content: center !important;
}
.logo {
transform: scale(2);
width: 440px;
height: 158px;
}
</style>

View File

@ -15,20 +15,8 @@
</div>
</div>
<Modal
title="编辑html代码"
v-model="showHTMLModal"
:mask-closable="false"
:width="900"
:fullscreen="full"
>
<Input
v-if="!full"
v-model="dataEdit"
:rows="15"
type="textarea"
style="max-height:60vh;overflow:auto;"
/>
<Modal title="编辑html代码" v-model="showHTMLModal" :mask-closable="false" :width="900" :fullscreen="full">
<Input v-if="!full" v-model="dataEdit" :rows="15" type="textarea" style="max-height:60vh;overflow:auto;" />
<Input v-if="full" v-model="dataEdit" :rows="32" type="textarea" />
<div slot="footer">
<Button @click="full=!full" icon="md-expand">全屏开/</Button>
@ -56,21 +44,21 @@ export default {
props: {
id: {
type: String,
default: "editor"
default: "editor",
},
value: String,
base64: {
type: Boolean,
default: false
default: false,
},
showExpand: {
type: Boolean,
default: true
default: true,
},
openXss: {
type: Boolean,
default: false
}
default: false,
},
},
data() {
return {
@ -79,16 +67,17 @@ export default {
dataEdit: "", //
showHTMLModal: false, // html
full: false, // html
fullscreenModal: false //
fullscreenModal: false, //
};
},
methods: {
initEditor() {
let that = this;
// wangeditor3 https://www.kancloud.cn/wangfupeng/wangeditor3/332599
editor = new E(`#${this.id}`);
//
editor.config.onchange = html => {
editor.config.onchange = (html) => {
if (this.openXss) {
this.data = xss(html);
} else {
@ -108,7 +97,7 @@ export default {
editor.config.uploadImgServer = uploadFile;
// liliheadertoken
editor.config.uploadImgHeaders = {
accessToken: that.getStore("accessToken")
accessToken: that.getStore("accessToken"),
};
editor.config.uploadFileName = "file";
editor.config.uploadImgHooks = {
@ -139,9 +128,10 @@ export default {
} else {
that.$Message.error(result.message);
}
}
},
};
}
editor.config.customAlert = function (info) {
// info
// that.$Message.info(info);
@ -156,8 +146,8 @@ export default {
// type -> 'emoji' / 'image'
type: "image",
// content ->
content: sina
}
content: sina,
},
];
editor.create();
if (this.value) {
@ -187,7 +177,7 @@ export default {
editor.txt.html(this.data);
this.$emit("input", this.data);
this.$emit("on-change", this.data);
}
},
});
},
setData(value) {
@ -200,22 +190,21 @@ export default {
this.$emit("input", this.data);
this.$emit("on-change", this.data);
}
}
},
},
watch: {
value(val) {
this.setData(val);
}
},
},
mounted() {
this.initEditor();
}
},
};
</script>
<style lang="scss" scoped>
.e-menu {
z-index: 101;
position: absolute;
cursor: pointer;

View File

@ -57,7 +57,7 @@
<Input type="number" v-model="form.sort" clearable style="width: 10%" />
</FormItem>
<FormItem class="form-item-view-el" label="文章内容" prop="content">
<editor v-model="form.content"></editor>
<editor openXss v-model="form.content"></editor>
</FormItem>
<FormItem label="是否展示" prop="openStatus">
<i-switch size="large" v-model="form.openStatus" :true-value="open" :false-value="close">
@ -380,7 +380,6 @@ export default {
//
this.data = [];
if (res.result.records.length > 0) {
this.data = res.result.records;
}
}
@ -390,7 +389,6 @@ export default {
},
handleSubmit() {
this.$refs.form.validate((valid) => {
if (valid) {
this.submitLoading = true;
@ -403,7 +401,6 @@ export default {
this.$Message.success("操作成功");
this.getDataList();
this.modalVisible = false;
}
});
} else {
@ -414,8 +411,6 @@ export default {
this.$Message.success("操作成功");
this.getDataList();
this.modalVisible = false;
}
});
}
@ -440,10 +435,25 @@ export default {
this.form.categoryId = res.result.categoryId;
this.treeValue = data.articleCategoryName;
this.form.id = data.id;
this.form.content = res.result.content;
this.form.content = htmlEscape(res.result.content);
this.form.title = res.result.title;
this.form.sort = res.result.sort;
this.form.openStatus = res.result.openStatus
this.form.openStatus = res.result.openStatus;
}
});
},
htmlEscape(text) {
return text.replace(/[<>"&]/g, function (match, pos, originalText) {
switch (match) {
case "<":
return "&lt;";
case ">":
return "&gt;";
case "&":
return "&amp;";
case '"':
return "&quot;";
}
});
},

View File

@ -347,6 +347,7 @@ export default {
this.form.versionUpdateDate / 1000
);
this.form.versionUpdateDate = versionUpdateDate;
this.form.updateTime = versionUpdateDate;
if (this.modalType == 0) {
// id

View File

@ -2,6 +2,19 @@
import {getRequest, postRequest, putRequest} from '@/libs/axios';
// 下载待发货的订单列表
export const verificationCode = (verificationCode) => {
return getRequest(`/orders/getOrderByVerificationCode/${verificationCode}`)
}
// 下载待发货的订单列表
export const downLoadDeliverExcel = (params) => {
return getRequest(`/orders/downLoadDeliverExcel`, params)
}
// 获取普通订单列表
export const getOrderList = (params) => {
return getRequest(`/orders`, params)
@ -62,8 +75,8 @@ export const getLogisticsChecked = () => {
}
// 订单核验
export const orderTake = (sn, params) => {
return postRequest(`/orders/${sn}/take`, params)
export const orderTake = (sn, verificationCode) => {
return putRequest(`/orders/take/${sn}/${verificationCode}`)
}
// 售后服务单

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 754 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 234 KiB

After

Width:  |  Height:  |  Size: 390 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

@ -18,10 +18,10 @@ export default {
* @description api请求基础路径
*/
api_dev: {
common: 'https://common-api.pickmall.cn',
buyer: 'https://buyer-api.pickmall.cn',
seller: 'https://store-api.pickmall.cn',
manager: 'https://admin-api.pickmall.cn',
// common: 'https://common-api.pickmall.cn',
// buyer: 'https://buyer-api.pickmall.cn',
// seller: 'https://store-api.pickmall.cn',
// manager: 'https://admin-api.pickmall.cn',
common: 'http://192.168.0.109:8890',
buyer: 'http://192.168.0.109:8888',
seller: 'http://192.168.0.109:8889',

View File

@ -127,12 +127,19 @@ export const otherRouter = {
name: "full-cut-detail",
component: () => import("@/views/promotion/fullCut/newFullCut.vue")
},
{
path: "export-order-deliver",
title: "发货",
name: "export-order-deliver",
component: () => import("@/views/order/order/exportOrderDeliver.vue")
},
{
path: "order-detail",
title: "订单详情",
name: "order-detail",
component: () => import("@/views/order/order/orderDetail.vue")
},
// {
// path: "/*",
// name: "error-404",

View File

@ -3,22 +3,25 @@
padding: 15px;
margin: 0 auto;
text-align: center;
border: 1px solid #ddd;
border-radius: 0.8em;
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
background: none repeat 0 0 #fff;
/*商品品类*/
.goods-category {
min-height: 500px;
border-radius: 0.8em;
text-align: left;
padding: 10px;
background: #fafafa;
border: 1px solid #e6e6e6;
background: #ededed;
ul {
padding: 8px 4px 8px 8px;
padding: 12px 8px;
list-style: none;
width: 300px;
background: none repeat 0 0 #fff;
border: 1px solid #e6e6e6;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.12), 0 0 6px rgba(0, 0, 0, 0.04);
border-radius: 0.4em;
display: inline-block;
letter-spacing: normal;
margin-right: 15px;
@ -27,7 +30,7 @@
li {
line-height: 20px;
padding: 5px;
padding: 10px 5px;
cursor: pointer;
color: #333;
font-size: 12px;
@ -42,9 +45,10 @@
/** 当前品类被选中的样式 */
.activeClass {
background-color: #d9edf7;
border: 1px solid #bce8f1;
color: #3a87ad;
border-radius: 0.4em;
background-color: rgba($color: $theme_color, $alpha: 0.2);
border: 1px solid rgba($color: $theme_color, $alpha: 0.8);
color: #fff;
}
/*!*当前选择的商品品类文字*!*/
@ -215,6 +219,19 @@ div.base-info-item {
}
}
.success {
> h1 {
font-size: 28px;
}
> * {
margin: 10px;
}
}
.operation {
> * {
margin: 10px 0;
}
}
/*商品描述*/
.goods-intro {
line-height: 40;
@ -223,12 +240,16 @@ div.base-info-item {
/** 底部步骤 */
.footer {
width: 100%;
margin-top: 20px;
padding: 10px;
background-color: #ffc;
position: sticky;
bottom: 0px;
text-align: center;
z-index: 9;
z-index: 999;
> .ivu-btn {
margin: 0 10px;
}
}
/*图片上传组件第一张图设置封面*/
@ -261,9 +282,20 @@ div.base-info-item {
word-break: break-all;
}
/deep/ .ivu-steps {
width: 100% !important;
display: flex;
}
.step-list {
height: 60px;
margin-bottom: 20px;
border-radius: 0.8em;
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
// box-shadow: 0 2px 4px rgba(0, 0, 0, .12), 0 0 6px rgba(0, 0, 0, .04)
}
.step-view {
width: 33%;
height: 40px;
flex: 1;
height: 60px;
font-size: 19px;
text-align: center;
display: flex;
@ -271,6 +303,14 @@ div.base-info-item {
justify-content: center;
align-items: center;
}
.step-view:nth-of-type(1) {
border-top-left-radius: 0.4em;
border-bottom-left-radius: 0.4em;
}
.step-view:nth-last-child(1) {
border-top-right-radius: 0.4em;
border-bottom-right-radius: 0.4em;
}
.add-sku-btn {
margin-top: 10px;
@ -374,14 +414,61 @@ div.base-info-item {
right: 0;
background: rgba(0, 0, 0, 0.6);
justify-content: space-between;
align-items: center;
flex-direction: column;
}
.demo-upload-list:hover .demo-upload-list-cover {
display: block;
display:flex;
}
.demo-upload-list-cover i {
.demo-upload-list-cover div {
margin: 10% 0;
width: 100%;
> i {
width: 50%;
margin-top: 8px;
color: #fff;
font-size: 20px;
cursor: pointer;
}
}
.active-goods-type {
background: #e8e8e8;
}
.goods-type-list {
max-height: 500px;
overflow-y: auto;
> .goods-type-item {
padding: 20px 0;
width: 100%;
cursor: pointer;
transition: 0.35s;
display: flex;
justify-content: center;
align-items: center;
/deep/ img {
margin-right: 20px;
width: 100px;
}
/deep/ h2 {
cursor: pointer;
font-size: 21px;
padding: 10px 0;
color: #333;
}
/deep/ p {
color: #999;
font-size: 14px;
margin-top: 10px;
}
}
> .goods-type-item:hover {
transform: translateY(-10px);
}
}
.template-item {
justify-content: flex-start !important;
}

File diff suppressed because it is too large Load Diff

View File

@ -1,53 +1,20 @@
<template>
<div class="login">
<Row
type="flex"
class="row"
justify="center"
align="middle"
@keydown.enter.native="submitLogin"
>
<Row type="flex" @keydown.enter.native="submitLogin">
<Col style="width: 368px">
<Header />
<Row>
<Form
ref="usernameLoginForm"
:model="form"
:rules="rules"
class="form"
>
<Row style="flex-direction: column;">
<Form ref="usernameLoginForm" :model="form" :rules="rules" class="form">
<FormItem prop="username">
<Input
v-model="form.username"
prefix="ios-contact"
size="large"
clearable
placeholder="请输入用户名"
autocomplete="off"
/>
<Input v-model="form.username" prefix="ios-contact" size="large" clearable placeholder="请输入用户名" autocomplete="off" />
</FormItem>
<FormItem prop="password">
<Input
type="password"
v-model="form.password"
prefix="ios-lock"
size="large"
password
placeholder="请输入密码"
autocomplete="off"
/>
<Input type="password" v-model="form.password" prefix="ios-lock" size="large" password placeholder="请输入密码" autocomplete="off" />
</FormItem>
</Form>
<Row>
<Button
class="login-btn"
type="primary"
size="large"
:loading="loading"
@click="submitLogin"
long
>
<Button class="login-btn" type="primary" size="large" :loading="loading" @click="submitLogin" long>
<span v-if="!loading">{{ $t("login") }}</span>
<span v-else>{{ $t("logining") }}</span>
</Button>
@ -56,12 +23,7 @@
</Row>
<Footer />
<!-- 拼图验证码 -->
<verify
ref="verify"
class="verify-con"
verifyType="LOGIN"
@change="verifyChange"
></verify>
<verify ref="verify" class="verify-con" verifyType="LOGIN" @change="verifyChange"></verify>
</Col>
<!-- <LangSwitch /> -->
</Row>
@ -69,35 +31,34 @@
</template>
<script>
import {
login,
userMsg,
} from "@/api/index";
import { login, userMsg } from "@/api/index";
import { validateMobile } from "@/libs/validate";
import Cookies from "js-cookie";
import Header from "@/views/main-components/header";
import Footer from "@/views/main-components/footer";
import LangSwitch from "@/views/main-components/lang-switch";
import util from "@/libs/util.js";
import verify from '@/views/my-components/verify';
import verify from "@/views/my-components/verify";
export default {
components: {
LangSwitch,
Header,
Footer,
verify
verify,
},
data() {
return {
saveLogin: true, //
loading: false, //
form: { //
form: {
//
username: "",
password: "",
mobile: "",
code: "",
},
rules: { //
rules: {
//
username: [
{
required: true,
@ -163,35 +124,41 @@ export default {
}
});
},
submitLogin() { //
submitLogin() {
//
this.$refs.usernameLoginForm.validate((valid) => {
if (valid) {
this.$refs.verify.show = true;
}
})
});
},
verifyChange (con) { //
verifyChange(con) {
//
if (!con.status) return;
this.loading = true;
login({
username: this.form.username,
password: this.md5(this.form.password),
}).then((res) => {
})
.then((res) => {
this.loading = false;
if (res && res.success) {
this.afterLogin(res);
}
}).catch(()=>{this.loading = false})
}
}
})
.catch(() => {
this.loading = false;
});
this.$refs.verify.show = false;
},
},
};
</script>
<style lang="scss" scoped>
.row {
padding: 70px 50px;
border-radius: .8em;
border-radius: 0.8em;
}
.login {
height: 100%;
@ -214,7 +181,7 @@ export default {
}
/deep/ .ivu-row {
display: flex;
flex-direction: column !important;
}
.verify-con {
position: absolute;
@ -260,5 +227,4 @@ export default {
.flex {
justify-content: center;
}
</style>

View File

@ -1,7 +1,7 @@
<template>
<div>
<Row class="header">
<img src="../../assets/lili.png" class="logo" width="220px">
<img class="logo" src="../../assets/logo.png" >
</Row>
</div>
</template>
@ -14,13 +14,13 @@ export default {
<style lang="scss" scoped>
.header {
margin-bottom: 6vh;
align-items: center;
display: flex;
justify-content: center !important;
}
.logo {
transform: scale(3);
width: 440px;
height: 158px;
}
</style>

View File

@ -0,0 +1,122 @@
<template>
<Card>
<div class="step-list">
<div class="step-item" @click="handleCheckStep(item)" :class="{'active':item.checked}" v-for="(item,index) in stepList" :key="index">
<img class="img" :src="item.img" alt="">
<div>
<h2>{{item.title}}</h2>
</div>
</div>
</div>
<div v-for="(item,index) in stepList" :key="index">
<!-- 下载 -->
<div v-if="item.checked && index ==0" class="tpl">
<Button @click="downLoad"></Button>
</div>
<!-- 上传 -->
<div v-if="item.checked && index ==1" class="tpl">
<Upload style="width:50%; height:400px;" accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel" multiple type="drag"
action="//jsonplaceholder.typicode.com/posts/">
<div style="padding: 50px 0">
<Icon type="ios-cloud-upload" size="102" style="color: #3399ff"></Icon>
<h2>选择或拖拽文件上传</h2>
</div>
</Upload>
</div>
<!-- 上传 -->
<div v-if="item.checked && index ==2" class="tpl">
<h1>发货完成</h1>
<div>
<Button>关闭页面</Button>
</div>
</div>
</div>
</Card>
</template>
<script>
import { downLoadDeliverExcel } from "@/api/order.js";
export default {
data() {
return {
//
stepList: [
{
img: require("@/assets/download.png"),
title: "1.下载批量发货导入模板",
checked: true,
},
{
img: require("@/assets/upload.png"),
title: "2.上传数据",
checked: false,
},
{
img: require("@/assets/success.png"),
title: "3.完成",
checked: false,
},
],
};
},
mounted() {},
methods: {
//
handleCheckStep(val) {
this.stepList.map((item) => {
item.checked = false;
});
val.checked = true;
},
async downLoad() {
let res = await downLoadDeliverExcel({ orderIds: "1402886442132217857" });
console.log(res);
},
},
};
</script>
<style lang="scss" scoped>
.step-list {
width: 80%;
min-width: 500px;
max-width: 1160px;
margin: 0 auto;
display: flex;
padding: 40px;
justify-content: space-between;
}
h2 {
text-align: center;
margin: 10px 0;
}
.tpl {
margin: 50px 0;
display: flex;
justify-content: center;
}
.active {
background: #efefef;
border-radius: 0.8em;
}
.step-item {
width: 100%;
padding: 0 20px;
display: flex;
align-items: center;
flex-direction: column;
justify-content: center;
transition: 0.35s;
cursor: pointer;
}
img {
width: 100px;
height: 100px;
}
</style>

View File

@ -527,7 +527,7 @@ export default {
orderTakeSubmit() {
this.$refs.orderTakeForm.validate((valid) => {
if (valid) {
API_Order.orderTake(this.sn, this.orderTakeForm).then((res) => {
API_Order.orderTake(this.sn, this.orderTakeForm.qrCode).then((res) => {
if (res.success) {
this.$Message.success("订单核销成功");
this.orderTakeModal = false;

View File

@ -4,22 +4,10 @@
<Row @keydown.enter.native="handleSearch">
<Form ref="searchForm" :model="searchForm" inline :label-width="70" class="search-form">
<Form-item label="订单编号" prop="orderSn">
<Input
type="text"
v-model="searchForm.orderSn"
clearable
placeholder="请输入订单编号"
style="width: 200px"
/>
<Input type="text" v-model="searchForm.orderSn" clearable placeholder="请输入订单编号" style="width: 200px" />
</Form-item>
<Form-item label="会员名称" prop="buyerName">
<Input
type="text"
v-model="searchForm.buyerName"
clearable
placeholder="请输入会员名称"
style="width: 200px"
/>
<Input type="text" v-model="searchForm.buyerName" clearable placeholder="请输入会员名称" style="width: 200px" />
</Form-item>
<Form-item label="订单状态" prop="orderStatus">
<Select v-model="searchForm.orderStatus" placeholder="请选择" clearable style="width: 200px">
@ -33,44 +21,35 @@
</Select>
</Form-item>
<Form-item label="下单时间">
<DatePicker
v-model="selectDate"
type="datetimerange"
format="yyyy-MM-dd"
clearable
@on-change="selectDateRange"
placeholder="选择起始时间"
style="width: 200px"
></DatePicker>
<DatePicker v-model="selectDate" type="datetimerange" format="yyyy-MM-dd" clearable @on-change="selectDateRange" placeholder="选择起始时间" style="width: 200px"></DatePicker>
</Form-item>
<Button @click="handleSearch" type="primary" icon="ios-search" class="search-btn">搜索</Button>
<Button @click="handleReset" class="search-btn">重置</Button>
</Form>
</Row>
<Table
:loading="loading"
border
:columns="columns"
:data="data"
ref="table"
sortable="custom"
@on-sort-change="changeSort"
@on-selection-change="changeSelect"
></Table>
<div>
<Button type="primary" class="export" @click="expressOrderDeliver">
批量发货
<Icon type="ios-arrow-down"></Icon>
</Button>
<Poptip @keydown.enter.native="orderVerification" placement="bottom-start" width="400">
<Button class="export">
核验订单
</Button>
<div class="api" slot="content">
<h2>核验订单号</h2>
<div style="margin:10px 0;">
<Input v-model="orderCode" style="width:300px; margin-right:10px;" />
<Button style="primary" @click="orderVerification"></Button>
</div>
</div>
</Poptip>
</div>
<Table :loading="loading" border :columns="columns" :data="data" ref="table" sortable="custom" @on-sort-change="changeSort" @on-selection-change="changeSelect"></Table>
<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"
show-total
show-elevator
show-sizer
></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"
show-total show-elevator show-sizer></Page>
</Row>
</Card>
</div>
@ -78,10 +57,12 @@
<script>
import * as API_Order from "@/api/order";
import { verificationCode } from "@/api/order";
export default {
name: "orderList",
data() {
return {
orderCode: "",
loading: true, //
searchForm: {
//
@ -93,7 +74,7 @@
endDate: "", //
orderSn: "",
buyerName: "",
orderStatus:""
orderStatus: "",
},
selectDate: null,
form: {
@ -114,7 +95,7 @@
title: "订单号",
key: "sn",
minWidth: 240,
tooltip: true
tooltip: true,
},
{
title: "订单来源",
@ -129,8 +110,7 @@
return h("div", {}, "小程序端");
} else if (params.row.clientType == "APP") {
return h("div", {}, "移动应用端");
}
else{
} else {
return h("div", {}, params.row.clientType);
}
},
@ -141,19 +121,21 @@
width: 120,
render: (h, params) => {
if (params.row.orderType == "NORMAL") {
return h('div', [h('span', { }, '普通订单'),]);
return h("div", [h("span", {}, "普通订单")]);
} else if (params.row.orderType == "PINTUAN") {
return h('div', [h('span', { }, '拼团订单'),]);
return h("div", [h("span", {}, "拼团订单")]);
} else if (params.row.orderType == "GIFT") {
return h('div', [h('span', { }, '赠品订单'),]);
}
return h("div", [h("span", {}, "赠品订单")]);
} else if (params.row.orderType == "VIRTUAL") {
return h("div", [h("tag", {}, "核验订单")]);
}
},
},
{
title: "买家名称",
key: "memberName",
minWidth: 130,
tooltip: true
tooltip: true,
},
{
title: "订单金额",
@ -174,22 +156,22 @@
minWidth: 100,
render: (h, params) => {
if (params.row.orderStatus == "UNPAID") {
return h('div', [h('span', { }, '未付款'),]);
return h("div", [h("span", {}, "未付款")]);
} else if (params.row.orderStatus == "PAID") {
return h('div', [h('span', { }, '已付款'),]);
return h("div", [h("span", {}, "已付款")]);
} else if (params.row.orderStatus == "UNDELIVERED") {
return h('div', [h('span', { }, '待发货'),]);
return h("div", [h("span", {}, "待发货")]);
} else if (params.row.orderStatus == "DELIVERED") {
return h('div', [h('span', { }, '已发货'),]);
return h("div", [h("span", {}, "已发货")]);
} else if (params.row.orderStatus == "COMPLETED") {
return h('div', [h('span', { }, '已完成'),]);
return h("div", [h("span", {}, "已完成")]);
} else if (params.row.orderStatus == "TAKE") {
return h('div', [h('span', { }, '待核验'),]);
return h("div", [h("span", {}, "待核验")]);
} else if (params.row.orderStatus == "CANCELLED") {
return h('div', [h('span', { }, '已取消'),]);
}
return h("div", [h("span", {}, "已取消")]);
}
},
},
{
title: "下单时间",
key: "createTime",
@ -232,13 +214,35 @@
};
},
methods: {
/**
* 核验订单
*/
async orderVerification() {
let result = await verificationCode(this.orderCode);
if (result.success) {
this.$router.push({
name: "order-detail",
query: { sn: result.result.sn || this.orderCode },
});
}
},
/**
* 批量发货
*/
expressOrderDeliver() {
this.$router.push({
path: "/export-order-deliver",
});
},
init() {
this.getDataList();
},
changePage(v) {
this.searchForm.pageNumber = v;
this.getDataList();
this.clearSelectAll();
},
changePageSize(v) {
this.searchForm.pageSize = v;
@ -267,9 +271,7 @@
}
this.getDataList();
},
clearSelectAll() {
this.$refs.table.selectAll(false);
},
changeSelect(e) {
this.selectList = e;
this.selectCount = e.length;
@ -297,7 +299,6 @@
name: "order-detail",
query: { sn: sn },
});
},
},
activated() {
@ -308,4 +309,7 @@
<style lang="scss">
//
@import "@/styles/table-common.scss";
.export {
margin: 10px 20px 10px 0;
}
</style>