Merge branch 'dev-ryan'

# Conflicts:
#	buyer/src/components/header/Header.vue
#	buyer/src/components/invoiceModal/index.vue
#	manager/src/config/index.js
This commit is contained in:
Chopper
2021-06-21 14:26:47 +08:00
150 changed files with 6782 additions and 3034 deletions

View File

@@ -441,3 +441,39 @@ export function memberPointHistory (params) {
params
});
}
/**
* 分页获取会员站内信
* @param {Object} params 请求参数包括pageNumber、pageSize、status
*/
export function memberMsgList (params) {
return request({
url: `/buyer/member/message`,
method: Method.GET,
needToken: true,
params
});
}
/**
* 设置消息为已读
* @param {String} messageId 消息id
*/
export function readMemberMsg (params) {
return request({
url: `/buyer/member/message`,
method: Method.PUT,
needToken: true,
params
});
}
/**
* 删除会员消息
* @param {String} messageId 消息id
*/
export function delMemberMsg (params) {
return request({
url: `/buyer/member/message`,
method: Method.DELETE,
needToken: true,
params
});
}

View File

@@ -63,17 +63,17 @@ export default {
};
},
methods: {
selectTags (item) {
selectTags (item) { // 选择热门标签
this.searchData = item;
this.search();
},
search () {
search () { // 全平台搜索商品
this.$router.push({
path: '/goodsList',
query: { keyword: this.searchData }
});
},
searchStore () {
searchStore () { // 店铺搜索商品
this.$emit('search', this.searchData)
}
},

View File

@@ -57,7 +57,7 @@ import {
export default {
name: 'addressManage',
props: {
id: {
id: { // 传入的地址id
defalut: '',
type: String
}
@@ -89,7 +89,7 @@ export default {
};
},
methods: {
save () {
save () { // 保存地址
this.$refs.form.validate((valid) => {
if (valid) {
const params = JSON.parse(JSON.stringify(this.formData));
@@ -138,15 +138,15 @@ export default {
this.formData.lat = item.position.lat;
this.formData.lon = item.position.lng;
},
show () {
show () { // 地址模态框显示
this.showAddr = true;
},
hide () {
hide () { // 地址模态框隐藏
this.showAddr = false;
}
},
watch: {
id: {
id: { // 传入的地址id
handler: function (v) {
if (v) {
this.getAddrById(v);

View File

@@ -59,7 +59,6 @@ export default {
isActive: 0 // 已激活tab栏下标
};
},
mounted () {},
methods: {
// 点击右侧的回调
callBack () {

View File

@@ -44,7 +44,7 @@ export default {
};
},
methods: {
getList () {
getList () { // 获取优惠券列表
this.loading = true
memberCouponList(this.params).then(res => {
this.loading = false
@@ -67,18 +67,18 @@ export default {
}
},
changePageNum (val) {
changePageNum (val) { // 分页改变页码
this.params.pageNumber = val;
this.getList()
},
changePageSize (val) {
changePageSize (val) { // 分页改变页数
this.pageNumber = 1;
this.params.pageSize = val;
this.getList()
},
useScope (type, storeName) {
useScope (type, storeName) { // 根据字段返回 优惠券适用范围
let shop = '平台';
let goods = '全部商品'
if (storeName !== 'platform') shop = storeName
@@ -104,7 +104,7 @@ export default {
<style scoped lang="scss">
@import '../../assets/styles/coupon.scss';
.pageration{
text-align: right;
.pageration {
text-align: right;
}
</style>

View File

@@ -151,8 +151,6 @@ export default {
]
};
},
components: {},
mounted () {},
methods: {
getCartList () { // 获取购物车列表
this.loading = true

View File

@@ -44,12 +44,12 @@ export default {
}
},
methods: {
showCartNum (item) {
showCartNum (item) { // 获取购物车数量
if (this.userInfo && item.title === '购物车') {
this.getCartList()
}
},
clickBar (val) {
clickBar (val) { // tabbar点击操作
if (!this.userInfo) {
this.$Modal.confirm({
title: '请登录',
@@ -83,7 +83,7 @@ export default {
}
}
},
openBlank (path) {
openBlank (path) { // 新页面打开地址
let routerUrl = this.$router.resolve({
path: path
})

View File

@@ -13,11 +13,6 @@
<script>
export default {
name: 'Main',
data () {
return {
};
},
props: {
_Title: { // 描述内容
type: null,

View File

@@ -62,7 +62,7 @@ export default {
};
},
methods: {
goArticle () { // 跳转
goArticle () { // 跳转文章页
let routeUrl = this.$router.resolve({
path: '/article'
})

View File

@@ -19,7 +19,7 @@ export default {
time: { // 传入的初始时间
default: 1718977559428
},
type: {
type: { // 区分是在详情还是购物车调用
default: 'goodsDetail', // 设置两个值goodsDetail和cart样式不同
type: String
}
@@ -37,7 +37,7 @@ export default {
this.init()
},
methods: {
countDown (val) {
countDown (val) { // 倒计时方法
function addZero (i) {
return i < 10 ? '0' + i : i + '';
}
@@ -58,8 +58,8 @@ export default {
clearInterval(this.interval)
}
},
init () {
this.interval = setInterval((item) => {
init () { // 初始化
this.interval = setInterval(() => {
this.countDown(this.time);
}, 1000);
}

View File

@@ -20,7 +20,6 @@
<div class="goodsConfig mt_10">
<span @click="collect" ><Icon type="ios-heart" :color="isCollected ? '#ed3f14' : '#666'" />{{isCollected?'已收藏':'收藏'}}</span>
<!-- <span>举报</span> -->
</div>
</div>
<!-- 右侧商品信息活动信息操作展示 -->
@@ -60,7 +59,7 @@
:key="index"
@click="receiveCoupon(item.id)"
>
<span v-if="item.couponType == 'PRICE'">{{ item.consumeThreshold }}{{item.price | unitPrice}}</span>
<span v-if="item.couponType == 'PRICE'">{{ item.consumeThreshold }}{{item.price}}</span>
<span v-if="item.couponType == 'DISCOUNT'">{{ item.consumeThreshold }}{{item.couponDiscount}}</span>
</span>
</p>
@@ -120,38 +119,16 @@
<span class="inventory"> {{skuDetail.weight}}kg</span>
</div>
</div>
<div class="add-buy-car">
<div class="add-buy-car" v-if="$route.query.way === 'POINT'">
<Button type="error" :loading="loading" :disabled="skuDetail.quantity === 0" @click="pointPay">积分购买</Button>
</div>
<div class="add-buy-car" v-else>
<Button type="error" :loading="loading" :disabled="skuDetail.quantity === 0" @click="addShoppingCartBtn">加入购物车</Button>
<Button type="warning" :loading="loading1" :disabled="skuDetail.quantity === 0" @click="buyNow">立即购买</Button>
</div>
</div>
</div>
<!-- <div class="item-detail-see">
<Divider>更多推荐</Divider>
<Row>
<Col :span="24" class="see-Item">
<img class="see-Img" src="https://demo.dscmall.cn/storage/images/201703/thumb_img/0_thumb_G_1489099128797.jpg" alt="" />
<p>
名龙堂i7 6700升7700 GTX1060 6G台式电脑主机DIY游戏组装整机
升6GB独显 送正版WIN10 一年上门
</p>
<p class="global_color">2500.00</p>
</Col>
<Col :span="24" class="see-Item">
<img
class="see-Img"
src="https://demo.dscmall.cn/storage/images/201703/thumb_img/0_thumb_G_1489099128797.jpg"
alt=""
/>
<p>
名龙堂i7 6700升7700 GTX1060 6G台式电脑主机DIY游戏组装整机
升6GB独显 送正版WIN10 一年上门
</p>
<p class="global_color">2500.00</p>
</Col>
</Row>
</div> -->
</div>
</div>
</template>
@@ -247,6 +224,22 @@ export default {
}
});
},
pointPay () { // 积分购买
const params = {
num: this.count,
skuId: this.skuDetail.id,
cartType: 'BUY_NOW'
};
this.loading1 = true;
addCartGoods(params).then(res => {
this.loading1 = false;
if (res.success) {
this.$router.push({path: '/pay', query: {way: 'POINT'}});
} else {
this.$Message.warning(res.message);
}
});
},
async collect () { // 收藏商品
if (this.isCollected) {
let cancel = await cancelCollect('GOODS', this.skuDetail.id)
@@ -338,6 +331,7 @@ export default {
}
},
mounted () {
// 用户登录才会判断是否收藏
if (this.Cookies.getItem('userInfo')) {
isCollection('GOODS', this.skuDetail.id).then(res => {
if (res.success && res.result) {

View File

@@ -38,10 +38,10 @@
</div>
</div>
<div class="remarks-bar">
<span @click="searchByGrade('')" :class="{selectedBar: commentParams.grade === ''}">全部({{commentTypeNum.all}})</span>
<span @click="searchByGrade('GOOD')" :class="{selectedBar: commentParams.grade === 'GOOD'}">好评({{commentTypeNum.good}})</span>
<span @click="searchByGrade('MODERATE')" :class="{selectedBar: commentParams.grade === 'MODERATE'}">中评({{commentTypeNum.moderate}})</span>
<span @click="searchByGrade('WORSE')" :class="{selectedBar: commentParams.grade === 'WORSE'}">差评({{commentTypeNum.worse}})</span>
<span @click="viewByGrade('')" :class="{selectedBar: commentParams.grade === ''}">全部({{commentTypeNum.all}})</span>
<span @click="viewByGrade('GOOD')" :class="{selectedBar: commentParams.grade === 'GOOD'}">好评({{commentTypeNum.good}})</span>
<span @click="viewByGrade('MODERATE')" :class="{selectedBar: commentParams.grade === 'MODERATE'}">中评({{commentTypeNum.moderate}})</span>
<span @click="viewByGrade('WORSE')" :class="{selectedBar: commentParams.grade === 'WORSE'}">差评({{commentTypeNum.worse}})</span>
</div>
<div style="text-align: center;margin-top: 20px;" v-if="commentList.length === 0">
暂无评价数据
@@ -86,9 +86,6 @@
</div>
</div>
</TabPane>
<!-- <TabPane label="商品问答">
<ShowGoodsQuestion/>
</TabPane> -->
</Tabs>
</div>
</div>
@@ -97,7 +94,6 @@
</template>
<script>
import ShowGoodsQuestion from '@/components/goodsDetail/ShowGoodsQuestion';
import { goodsComment, goodsCommentNum } from '@/api/member.js';
export default {
name: 'ShowGoodsDetail',
@@ -122,21 +118,21 @@ export default {
};
},
computed: {
skuDetail () {
skuDetail () { // skuId
return this.detail.data;
}
},
methods: {
changeHeight (name) {
changeHeight (name) { // 设置商品详情高度
let heightCss = window.getComputedStyle(this.$refs[name]).height;
heightCss = parseInt(heightCss.substr(0, heightCss.length - 2)) + 89;
this.$refs.itemIntroDetail.style.height = heightCss + 'px';
},
changePageNum (val) {
changePageNum (val) { // 修改评论页码
this.commentParams.pageNumber = val;
this.getList();
},
changePageSize (val) {
changePageSize (val) { // 修改评论页数
this.commentParams.pageNumber = 1;
this.commentParams.pageSize = val;
this.getList();
@@ -155,12 +151,12 @@ export default {
}
});
},
searchByGrade (grade) {
viewByGrade (grade) { // 好中差评切换
this.$set(this.commentParams, 'grade', grade);
this.commentParams.pageNumber = 1;
this.getList();
},
tabClick (name) {
tabClick (name) { // 商品详情和评价之间的tab切换
if (name === 0) {
this.$nextTick(() => {
this.changeHeight('itemIntroGoods')
@@ -198,7 +194,7 @@ export default {
}
}
},
handleScroll () {
handleScroll () { // 监听页面滚动
if (this.onceFlag) {
this.$nextTick(() => {
this.changeHeight('itemIntroGoods')
@@ -208,15 +204,12 @@ export default {
}
},
mounted () {
this.$nextTick(() => {
this.$nextTick(() => { // 手动设置详情高度,解决无法撑开问题
setTimeout(this.changeHeight('itemIntroGoods'), 2000);
});
window.addEventListener('scroll', this.handleScroll)
this.getList();
},
components: {
ShowGoodsQuestion
}
};
</script>
@@ -283,14 +276,12 @@ export default {
}
.item-intro-detail{
margin: 0 30px;
// min-height: 1500px;
width: 100%;
}
.item-intro-nav{
width: 100%;
height: 38px;
background-color: #F7F7F7;
// border-bottom: 1px solid $theme_color;
}
.item-intro-nav ul{
margin: 0px;
@@ -329,8 +320,6 @@ export default {
width: 240px;
height: 36px;
font-size: 14px;
/* text-align: center; */
/* background-color: #ccc; */
}
.item-param-title {
color: #232323;

View File

@@ -1,53 +0,0 @@
<template>
<div class="wrapper">
<div v-if="true" class="question-list">
<div class="-item" v-for="index in 6" :key="index">
<!-- 提问 -->
<div class="-item-put -item-div">
<div class="-item-div-l blod">
<Tag color="warning"></Tag>
有屏幕调节亮度吗
</div>
<div class="-item-div-r">2020年10月21日17:03:35</div>
</div>
<!-- 解答 -->
<div class="-item-reply -item-div">
<div class="-item-div-l">
<Tag color="success"></Tag>
能调节点屏幕上方有一条调整带可正负2调整
</div>
<div class="-item-div-r">2020年10月21日17:03:35</div>
</div>
</div>
</div>
<div v-else class="question-empty">
<empty></empty>
</div>
</div>
</template>
<script>
export default {};
</script>
<style scoped lang="scss">
.-item-div {
padding: 10px 0;
display: flex;
align-items: center;
justify-content: space-between;
margin: 10px 0;
}
.-item-div-l {
display: flex;
@include content_color($light_content_color);
}
.-item-div-r {
@include sub_color($light_content_color);
}
.blod {
font-weight: bold;
}
.-item {
margin: 10px 0;
border-bottom: 1px solid $border_color;
}
</style>

View File

@@ -1,85 +0,0 @@
<template>
<div>
<div class="remarks-title">
<span>售后保障</span>
</div>
<div class="item-protect-container">
<div class="item-protect-box">
<p class="item-protect-title-box">
<Avatar style="background-color: #e4393c" icon="ribbon-a" />
<span class="item-protect-title">卖家服务</span>
</p>
<p class="item-protect-detail">
高品质敢承诺7天无理由退货30天免费换新质量问题商家承担来回运费换新如需发票请在确认收货无误后联系商家开出*发票不随货品一同发出
</p>
</div>
<div class="item-protect-box">
<p class="item-protect-title-box">
<Avatar style="background-color: #e4393c" icon="cash" />
<span class="item-protect-title">平台承诺</span>
</p>
<p class="item-protect-detail">
平台卖家销售并发货的商品由平台卖家提供发票和相应的售后服务请您放心购买<br> 因厂家会在没有任何提前通知的情况下更改产品包装产地或者一些附件本司不能确保客户收到的货物与商城图片产地附件说明完全一致只能确保为原厂正货并且保证与当时市场上同样主流新品一致若本商城没有及时更新请大家谅解
</p>
</div>
<div class="item-protect-box">
<p class="item-protect-title-box">
<Avatar style="background-color: #e4393c" icon="locked" />
<span class="item-protect-title">正品行货</span>
</p>
<p class="item-protect-detail">
BIT商城向您保证所售商品均为正品行货BIT自营商品开具机打发票或电子发票
</p>
</div>
<div class="item-protect-box">
<p class="item-protect-title-box">
<Avatar style="background-color: #e4393c" icon="settings" />
<span class="item-protect-title">全国联保</span>
</p>
<p class="item-protect-detail">
凭质保证书及BIT商城发票可享受全国联保服务奢侈品钟表除外奢侈品钟表由BIT联系保修享受法定三包售后服务与您亲临商场选购的商品享受相同的质量保证BIT商城还为您提供具有竞争力的商品价格和运费政策请您放心购买<br><br> 因厂家会在没有任何提前通知的情况下更改产品包装产地或者一些附件本司不能确保客户收到的货物与商城图片产地附件说明完全一致只能确保为原厂正货并且保证与当时市场上同样主流新品一致若本商城没有及时更新请大家谅解
</p>
</div>
</div>
</div>
</template>
<script>
export default {
name: 'ShowProductWarranty'
};
</script>
<style scoped lang="scss">
.remarks-title {
padding-left: 15px;
height: 36px;
font-size: 16px;
font-weight: bolder;
line-height: 36px;
color: #666666;
background-color: #F7F7F7;
}
.item-protect-container {
padding: 15px;
}
.item-protect-box {
margin-bottom: 30px;
}
.item-protect-title-box {
display: flex;
align-items: center;
}
.item-protect-title {
padding-left: 15px;
font-size: 20px;
font-weight: bolder;
color: $theme_color;
}
.item-protect-detail {
padding-top: 5px;
padding-left: 46px;
font-size: 14px;
color: #999;
}
</style>

View File

@@ -9,7 +9,6 @@
</li>
</ul>
<ul class="detail">
<!-- <li class="first hover-pointer" @click="handleClickTheme()">切换主题</li> -->
<li class="first" v-show="!userInfo.username">
<router-link :to="`/login?rePath=${$route.path}&query=${JSON.stringify($route.query)}`">
<span style="border:none" class="tipsLogin">请登录</span>
@@ -35,14 +34,18 @@
</DropdownMenu>
</Dropdown>
</li>
<li class="hover-color" @click="goUserCenter('/home/MyOrder')"><span class="nav-item">我的订单</span></li>
<li class="hover-color" @click="goUserCenter('/home/MyTracks')"><span class="nav-item">我的足迹</span></li>
<li @click="goUserCenter('/home/MyOrder')"><span class="nav-item hover-color">我的订单</span></li>
<li @click="goUserCenter('/home/MyTracks')"><span class="nav-item hover-color">我的足迹</span></li>
<li @click="goUserCenter('/home/MsgList')"><span class="nav-item hover-color">我的消息</span></li>
<li v-if="$route.name !== 'Cart'" style="position:relative;">
<i class="cart-badge" v-show="Number(cartNum)">{{cartNum < 100 ? cartNum : '99'}}</i>
<Dropdown placement="bottom-start">
<router-link to="/cart" target="_blank">
<span @mouseenter="getCartList">
<Icon size="18" class="cart-icon" type="ios-cart-outline"></Icon>
<Icon
size="18"
type="ios-cart-outline"
></Icon>
购物车
</span>
@@ -116,37 +119,28 @@ export default {
},
},
methods: {
handleClickTheme() {
this.themeType === "light"
? (this.themeType = "dark")
: (this.themeType = "light");
window.document.documentElement.setAttribute(
"data-theme",
this.themeType
);
},
changeCity(city) {
changeCity (city) { // 选择所在城市
this.city = city;
},
goToPay() {
goToPay () { // 跳转购物车
let url = this.$router.resolve({
path: "/cart",
});
window.open(url.href, "_blank");
},
myInfo() {
myInfo () { // 跳转会员中心
let url = this.$router.resolve({
path: "/home",
});
window.open(url.href, "_blank");
},
signOutFun() {
storage.removeItem("accessToken");
storage.removeItem("refreshToken");
storage.removeItem("userInfo");
storage.removeItem("cartNum");
this.$store.commit("SET_CARTNUM", 0);
this.$router.push("/login");
signOutFun () { // 退出登录
storage.removeItem('accessToken');
storage.removeItem('refreshToken');
storage.removeItem('userInfo');
storage.removeItem('cartNum');
this.$store.commit('SET_CARTNUM', 0)
this.$router.push('/login');
},
goUserCenter(path) {
// 跳转我的订单,我的足迹
@@ -230,13 +224,13 @@ export default {
float: left;
font-size: 14px;
line-height: 35px;
margin-right: 15px;
margin-right: 10px;
font-weight: bold;
}
.nav a,
.nav-item {
text-decoration: none;
padding-left: 15px;
padding-left: 10px;
border-left: 1px solid #ccc;
color: #999;
cursor: pointer;
@@ -377,9 +371,6 @@ export default {
.sign-out p {
font-size: 12px;
}
.cart-icon {
padding: 0 6px;
}
.goods-title:hover {
color: $theme_color;
}

View File

@@ -1,10 +1,10 @@
<template>
<div class="shop-box">
<div class="shop-container">
<div class="shop-title">
<div class="shop-title-content">
<p><router-link :to="`/merchant?id=${skuDetail.storeId}`">{{ skuDetail.storeName }}</router-link></p>
</div>
<div class="shop-title-content">
<img class="hover-pointer" @click="linkTo(`/merchant?id=${storeDetail.storeId}`)" :src="storeDetail.storeLogo" height="40" alt="">
<p><router-link :to="`/merchant?id=${storeDetail.storeId}`">{{ storeDetail.storeName }}</router-link></p>
<div class="ml_20" v-html="storeDetail.storeDesc"></div>
</div>
</div>
</div>
@@ -20,7 +20,7 @@ export default {
}
},
computed: {
skuDetail () {
storeDetail () { // 店铺详情
return this.detail;
}
}
@@ -46,57 +46,17 @@ export default {
color: #fff;
}
.shop-title {
display: flex;
flex-direction: row;
}
.shop-title-icon {
font-size: 46px;
}
.shop-title-content {
padding-top: 8px;
margin-left: 15px;
display: flex;
align-items: center;
}
.shop-title-content p {
line-height: 26px;
font-size: 20px;
}
.shop-title-content p:nth-child(2) {
font-size: 16px;
margin-left: 20px;
}
.shop-title-content a {
color: #fff;
}
.shop-another-item {
display: flex;
flex-direction: row;
}
.shop-another-item-detail {
display: flex;
flex-direction: row;
align-items: center;
margin-left: 15px;
}
.shop-another-item-img {
height: 80px;
border-radius: 40px;
overflow: hidden;
}
.shop-another-item-img img {
width: 80px;
}
.shop-anoter-item-intro {
margin-left: 15px;
}
</style>

View File

@@ -23,7 +23,7 @@ export default {
}
},
methods: {
goCartList () {
goCartList () { // 跳转购物车页面
let routerUrl = this.$router.resolve({
path: '/cart'
})

View File

@@ -67,14 +67,14 @@ export default {
};
},
methods: {
getArticleList () {
getArticleList () { // 获取常见问题列表
articleList(this.params).then(res => {
if (res.success) {
this.articleList = res.result.records
}
})
},
goArticle (id) {
goArticle (id) { // 跳转文章详情
let routeUrl = this.$router.resolve({
path: '/article',
query: {id}

View File

@@ -32,7 +32,6 @@ export default {
options: this.data.options // 装修数据
};
},
methods: {}
};
</script>
<style lang="scss" scoped>

View File

@@ -50,9 +50,8 @@ export default {
this.$emit('content', val);
}
},
mounted () {},
methods: {
changeCurr (index) {
changeCurr (index) { // 选择分类
this.currentIndex = index;
}
}

View File

@@ -71,7 +71,7 @@ export default {
};
},
watch: {
diffSeconds (val) {
diffSeconds (val) { // 秒杀倒计时
const hours = Math.floor(val / 3600);
// 当前秒数 / 60向下取整
// 获取到所有分钟数 3600 / 60 = 60分钟
@@ -139,7 +139,7 @@ export default {
}, 1000);
}
},
goPromotion () {
goPromotion () { // 跳转秒杀页面
let routeUrl = this.$router.resolve({
path: '/seckill'
});

View File

@@ -1,3 +1 @@
## 此组件为结算页面修改发票信息使用 后续可以复用到个人信息添加发票页面
### 目前没有参数,之后会设置一个参数接收历史的单位发票数据

View File

@@ -11,37 +11,42 @@
</div> -->
<!-- 普通发票 -->
<div class="nav-content">
<Form :model="invoiceForm" ref="form" label-position="left" :rules="ruleInline" :label-width="110">
<Form
:model="invoiceForm"
ref="form"
label-position="left"
:rules="ruleInline"
:label-width="110"
>
<FormItem label="发票类型">
<RadioGroup v-model="invoice" type="button" button-style="solid">
<Radio @on-change="changeInvoice" :label="1">电子普通发票</Radio>
<Radio :label="2" :disabled="true">增值税专用发票</Radio>
</RadioGroup>
</FormItem>
<FormItem label="发票抬头">
<RadioGroup v-model="type" @on-change="changeInvoice" type="button" button-style="solid">
<RadioGroup v-model="invoiceForm.type" type="button" button-style="solid">
<Radio :label="1">个人</Radio>
<Radio :label="2">单位</Radio>
</RadioGroup>
</FormItem>
<FormItem label="个人名称" v-if="type === 1" prop="receiptTitle">
<FormItem
label="发票抬头"
v-if="invoiceForm.type == 2"
prop="receiptTitle"
>
<i-input v-model="invoiceForm.receiptTitle"></i-input>
</FormItem>
<FormItem label="单位名称" v-if="type === 2" prop="receiptTitle">
<i-input v-model="invoiceForm.receiptTitle"></i-input>
</FormItem>
<FormItem label="纳税人识别号" v-if="type === 2" prop="taxpayerId">
<FormItem
label="纳税人识别号"
v-if="invoiceForm.type == 2"
prop="taxpayerId"
>
<i-input v-model="invoiceForm.taxpayerId"></i-input>
</FormItem>
<FormItem label="发票内容">
<RadioGroup v-model="invoiceForm.receiptContent" type="button" button-style="solid">
<Radio label="不开发票">不开发票</Radio>
<Radio label="商品明细">商品明细</Radio>
<Radio label="商品类别">商品类别</Radio>
</RadioGroup>
</FormItem>
</Form>
<div style="text-align: center">
<Button type="primary" :loading="loading" @click="submit">保存发票信息</Button>
<Button type="primary" :loading="loading" @click="save">保存发票信息</Button>
<Button type="default" @click="invoiceAvailable = false">取消</Button>
</div>
</div>
@@ -49,104 +54,100 @@
</div>
</template>
<script>
import { receiptSelect } from "@/api/cart.js";
import { TINumber } from "@/plugins/RegExp.js";
import { saveReceipt } from '@/api/member.js';
import { TINumber } from '@/plugins/RegExp.js';
export default {
name: "invoiceModal",
data() {
name: 'invoiceModal',
data () {
return {
invoice: 1,
invoiceAvailable: false, // 模态框显隐
loading: false, // 提交状态
invoiceForm: {
// 发票表单
invoiceForm: { // 发票表单
// 普票表单
receiptTitle: "", // 发票抬头
taxpayerId: "", // 纳税人识别号
receiptContent: "商品明细", // 发票内容
receiptTitle: '', // 发票抬头
taxpayerId: '', // 纳税人识别号
receiptContent: '不开发票', // 发票内容
type: 1 // 1 个人 2 单位
},
type: 1, // 1 个人 2 单位
ruleInline: {
ruleInline: { // 验证规则
receiptTitle: [{ required: true, message: '请填写公司名称' }],
taxpayerId: [
{ required: true, message: "请填写纳税人识别号" },
{ pattern: TINumber, message: "请填写正确的纳税人识别号" },
],
},
{ required: true, message: '请填写纳税人识别号' },
{ pattern: TINumber, message: '请填写正确的纳税人识别号' }
]
}
};
},
props: ["invoiceData"],
watch: {
invoiceData: {
handler(val) {
this.invoiceForm = { ...val };
if (val.taxpayerId) {
this.type = 2;
} else {
this.type = 1;
}
},
deep: true,
immeadite: true,
},
},
methods: {
/**
* 选择发票抬头
*/
changeInvoice(val) {
this.$nextTick(() => {
this.type = val;
});
},
/**
* 保存判断
*/
save() {
let flage = true;
// 保存分为两种类型,个人以及企业
const { type, receiptTitle, receiptContent } = JSON.parse(
JSON.stringify(this.invoiceForm)
);
// 判断是否填写发票抬头
if (!receiptTitle) {
this.$Message.error("请填写发票抬头!");
flage = false;
return false;
}
if (type == 2) {
this.$refs.form.validate((valid) => {
if (!valid) {
flage = false;
save () { // 保存发票
if (this.invoiceForm.type === 1) {
// 个人
let flag = true;
this.receiptItems.forEach((e) => {
if (
e.receiptTitle === '个人' &&
e.receiptContent === this.invoiceForm.receiptContent
) {
this.$emit('change', e);
flag = false;
this.invoiceAvailable = false;
}
});
} else {
delete this.invoiceForm.taxpayerId;
}
return flage;
},
async submit() {
if (this.save()) {
this.loading = true;
let submit = {
way: this.$route.query.way,
...this.invoiceForm,
};
let receipt = await receiptSelect(submit);
if (receipt.success) {
this.$emit("change", true);
if (flag) {
let params = {
receiptTitle: '个人',
receiptContent: this.invoiceForm.receiptContent
};
this.loading = true;
saveReceipt(params)
.then((res) => {
this.loading = false;
if (res.success) {
this.$emit('change', res.result);
this.invoiceAvailable = false;
}
})
.catch(() => {
this.loading = false;
});
}
this.loading = false;
} else {
// 单位
this.$refs.form.validate((valid) => {
if (valid) {
this.loading = true;
let params = {
receiptTitle: this.invoiceForm.receiptTitle,
taxpayerId: this.invoiceForm.taxpayerId,
receiptContent: this.invoiceForm.receiptContent
};
let flag = true;
this.receiptItems.forEach((e) => {
if (e.taxpayerId === params.taxpayerId) {
flag = false;
}
});
if (!flag) {
this.$Message.error('已有当前税号的发票信息,请直接选择已有发票');
} else {
saveReceipt(params)
.then((res) => {
this.loading = false;
if (res.success) {
this.$emit('change', res.result);
this.invoiceAvailable = false;
}
})
.catch(() => {
this.loading = false;
});
}
}
});
}
},
},
}
}
};
</script>
<style lang="scss" scoped>

View File

@@ -85,7 +85,7 @@ export default {
this.$emit('getAddress', this.addrContent);
}
},
init () {
init () { // 初始化地图
AMapLoader.load({
key: 'b440952723253aa9fe483e698057bf7d', // 申请好的Web端开发者Key首次调用 load 时必填
version: '', // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15

View File

@@ -21,7 +21,7 @@ export default {
props: ['addressId'],
mounted () {},
methods: {
change (val, selectedData) {
change (val, selectedData) { // 选择地区
/**
* @returns [regionId,region]
*/
@@ -30,7 +30,7 @@ export default {
selectedData[selectedData.length - 1].__label.split('/')
]);
},
loadData (item, callback) {
loadData (item, callback) { // 加载数据
item.loading = true;
getRegion(item.value).then((res) => {
if (res.result.length <= 0) {
@@ -59,7 +59,7 @@ export default {
}
});
},
async init () {
async init () { // 初始化地图数据
let data = await getRegion(0);
let arr = [];
data.result.forEach((item) => {

View File

@@ -209,7 +209,7 @@ export default {
},
deep: true
},
'$route': {
'$route': { // 监听路由
handler (val, oVal) {
if (this.$route.query.categoryId) {
let cateId = this.$route.query.categoryId.split(',')
@@ -373,6 +373,7 @@ export default {
}
},
mounted () {
// 有分类id就根据id搜索
if (this.$route.query.categoryId) {
let cateId = this.$route.query.categoryId.split(',')
Object.assign(this.params, this.$route.query)

View File

@@ -93,6 +93,11 @@ export default {
getCategory(0).then(res => {
if (res.success) {
this.cateList = res.result;
// 过期时间
var expirationTime = new Date().setHours(new Date().getHours() + 1);
// 存放过期时间
localStorage.setItem('category_expiration_time', expirationTime);
// 存放分类信息
localStorage.setItem('category', JSON.stringify(res.result))
}
});
@@ -117,7 +122,12 @@ export default {
}
},
mounted () {
if (localStorage.getItem('category')) {
if (localStorage.getItem('category') && localStorage.getItem('category_expiration_time')) {
// 如果缓存过期,则获取最新的信息
if (new Date() > localStorage.getItem('category_expiration_time')) {
this.getCate();
return;
}
this.cateList = JSON.parse(localStorage.getItem('category'))
} else {
this.getCate()

View File

@@ -6,7 +6,7 @@
#### 在组件上添加v-if来判断组件显隐
#### verifyType 验证格式[ 'LOGIN' ,'REGISTER' ]等,详情看接口文档
#### verifyType 验证格式[ 'LOGIN' ,'REGISTER' ]
#### @change方法 获取回调,参数为对象 {status:false,distance:100} status 为回调状态distance为移动距离

View File

@@ -43,11 +43,11 @@ export default {
};
},
methods: {
mouseDown (e) {
mouseDown (e) { // 鼠标按下操作,
this.downX = e.clientX;
this.flag = true;
},
mouseMove (e) {
mouseMove (e) { // 鼠标移动
if (this.flag) {
let offset = e.clientX - this.downX;
@@ -60,7 +60,7 @@ export default {
}
}
},
mouseUp () {
mouseUp () { // 鼠标抬起
if (!this.flag) return false;
this.flag = false;
let params = {
@@ -83,7 +83,7 @@ export default {
}
});
},
refresh () {
refresh () { // 刷新验证图片
this.flag = false;
this.downX = 0;
this.distance = 0;
@@ -91,7 +91,7 @@ export default {
this.verifyText = '拖动滑块解锁';
this.getImg();
},
getImg () {
getImg () { // 获取验证图片
getVerifyImg(this.type).then(res => {
this.data = res.result;
});

View File

@@ -26,7 +26,3 @@ export function postVerifyImg (params) {
headers: {uuid: storage.getItem('uuid')}
});
}
export function mouseup () {
console.log(111);
}

View File

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

View File

@@ -37,6 +37,11 @@ Vue.prototype.linkTo = function (url) {
window.open(url, '_blank')
}
}
// 联系客服
Vue.prototype.connectCs = function (sign = '37ef9b97807d03c6741298ed4eb5b536d2d238e08a3c00fb01fe48f03a569974c99ad767e72c04b3165ef29aca2c488b505fe4ca') {
const url = 'https://yzf.qq.com/xv/web/static/chat/index.html?sign=' + sign
window.open(url, '_blank')
}
Vue.prototype.Cookies = storage
/* eslint-disable no-new */
new Vue({

View File

@@ -3,7 +3,7 @@
<BaseHeader></BaseHeader>
<Search></Search>
<drawer></drawer>
<ShopHeader v-if="goodsMsg.data" :detail="goodsMsg.data"></ShopHeader>
<ShopHeader :detail="storeMsg"></ShopHeader>
<div class="shop-item-path">
<div class="shop-nav-container">
<Breadcrumb>
@@ -11,8 +11,9 @@
<BreadcrumbItem v-for="(item, index) in categoryBar" :to="goGoodsList(index)" target="_blank" :key="index">{{item.name}}</BreadcrumbItem>
</Breadcrumb>
<div class="store-collect">
<span class="mr_10"><router-link :to="'Merchant?id=' + goodsMsg.data.storeId">{{goodsMsg.data.storeName}}</router-link></span>
<span class="mr_10" v-if="goodsMsg.data"><router-link :to="'Merchant?id=' + goodsMsg.data.storeId">{{goodsMsg.data.storeName}}</router-link></span>
<span @click="collect" ><Icon type="ios-heart" :color="storeCollected ? '#ed3f14' : '#666'" />{{storeCollected?'已收藏店铺':'收藏店铺'}}</span>
<span @click="connectCs(storeMsg.yzfSign)" class="ml_10"><Icon custom="icomoon icon-customer-service" />联系客服</span>
</div>
</div>
</div>
@@ -40,6 +41,7 @@ import ShowGoodsDetail from '@/components/goodsDetail/ShowGoodsDetail';
import ShowLikeGoods from '@/components/like';
import { goodsSkuDetail } from '@/api/goods';
import { cancelCollect, collectGoods, isCollection } from '@/api/member';
import {getDetailById} from '@/api/shopentry'
export default {
name: 'GoodsDetail',
beforeRouteEnter (to, from, next) {
@@ -48,20 +50,15 @@ export default {
},
created () {
this.getGoodsDetail();
if (this.Cookies.getItem('userInfo')) {
isCollection('STORE', this.goodsMsg.data.storeId).then(res => {
if (res.success && res.result) {
this.storeCollected = true;
}
})
}
},
data () {
return {
goodsMsg: {}, // 商品信息
isLoading: false, // 加载状态
categoryBar: [], // 分类
storeCollected: false // 商品收藏
storeCollected: false, // 商品收藏
storeMsg: {} // 店铺信息
};
},
methods: {
@@ -81,8 +78,23 @@ export default {
name: cateName[index]
});
});
console.log(cateArr);
this.categoryBar = cateArr;
this.goodsMsg = res.result;
// 判断是否收藏
if (this.Cookies.getItem('userInfo')) {
isCollection('STORE', this.goodsMsg.data.storeId).then(res => {
if (res.success && res.result) {
this.storeCollected = true;
}
})
}
// 获取店铺信息
getDetailById(this.goodsMsg.data.storeId).then(res => {
if (res.success) {
this.storeMsg = res.result
}
})
} else {
this.$Message.error(res.message)
this.$router.push('/')
@@ -91,7 +103,7 @@ export default {
this.$router.push('/')
});
},
goGoodsList (currIndex) {
goGoodsList (currIndex) { // 跳转商品列表
const arr = []
this.categoryBar.forEach((e, index) => {
if (index <= currIndex) {
@@ -132,7 +144,6 @@ export default {
}
};
</script>
<style scoped lang="scss">
.shop-item-path {
height: 38px;
@@ -146,6 +157,7 @@ export default {
padding: 20px 0;
@include white_background_color();
}
.shop-nav-container {
width: 1200px;
margin: 0 auto;

View File

@@ -9,9 +9,10 @@
<img :src="storeMsg.storeLogo" height="50" alt="">
<div>
<p>{{storeMsg.storeName || 'xx店铺'}}</p>
<p>{{storeMsg.storeDesc || 'xx店铺描述'}}</p>
<p v-html="storeMsg.storeDesc"></p>
</div>
<div class="store-collect" @click="collect"><Icon type="ios-heart" :color="storeCollected ? '#ed3f14' : '#fff'" />{{storeCollected?'已收藏店铺':'收藏店铺'}}</div>
<span class="hover-pointer ml_10" @click="connectCs(storeMsg.yzfSign)"><Icon custom="icomoon icon-customer-service" />联系客服</span>
</div>
</div>
<div class="store-category">
@@ -204,7 +205,7 @@ export default {
}
}
.store-collect{
margin-left: 20px!important;
margin-left: 750px!important;
&:hover{
cursor: pointer;
}

View File

@@ -4,7 +4,7 @@
<Search></Search>
<cateNav></cateNav>
<ul class="category">
<li @click="selectCate(cate.id)" v-for="(cate, index) in cateList" :key="index">{{cate.name}}</li>
<li @click="selectCate(cate.id)" :class="{'selected-cate': cate.id === params.pointsGoodsCategoryId}" v-for="(cate, index) in cateList" :key="index">{{cate.name}}</li>
</ul>
<h3 class="promotion-decorate">积分商品</h3>
<!-- 列表 -->
@@ -39,6 +39,13 @@
</div>
</div>
</div>
<div class="page-size">
<Page :total="total" @on-change="changePageNum"
@on-page-size-change="changePageSize"
:page-size="params.pageSize"
show-sizer>
</Page>
</div>
<BaseFooter></BaseFooter>
</div>
</template>
@@ -56,7 +63,8 @@ export default {
pageNumber: 1,
pageSize: 20,
pointsGoodsCategoryId: ''
}
},
total: 0 // 商品总数
}
},
mounted () {
@@ -69,6 +77,7 @@ export default {
pointGoods(this.params).then(res => {
if (res.success) {
this.goodsList = res.result.records
this.total = res.result.total
}
})
},
@@ -79,11 +88,27 @@ export default {
}
})
},
selectCate (id) {
selectCate (id) { // 选择商品分类
this.params.pointsGoodsCategoryId = id
this.getList()
this.$router.push({query: {categoryId: id}})
}
},
goGoodsDetail (skuId, goodsId) { // 跳转商品详情
let routerUrl = this.$router.resolve({
path: '/goodsDetail',
query: {skuId, goodsId, way: 'POINT'}
})
window.open(routerUrl.href, '_blank')
},
changePageNum (val) { // 修改页码
this.params.pageNumber = val;
this.getList()
},
changePageSize (val) { // 修改页数
this.pageNumber = 1;
this.params.pageSize = val;
this.getList()
},
}
}
</script>
@@ -104,8 +129,19 @@ export default {
margin: 0 10px;
&:hover{
cursor: pointer;
color: $theme_color;
}
}
.selected-cate{
color: $theme_color;
}
}
.page-size {
width: 1200px;
margin: 10px auto;
display: flex;
justify-content: flex-end;
}
.promotion-decorate::before,.promotion-decorate::after{
background-image: url('../../static/sprite@2x.png');

View File

@@ -34,33 +34,6 @@
</div>
</div>
</div>
<!-- <div class="other-user-buy-box">
<div class="other-user-buy-title">
<p>可以顺便看下其他商品哦 ~</p>
</div>
<div class="other-user-buy-row" v-for="(items,index1) in recommend" :key="index1">
<div class="other-user-buy-item-box" v-for="(item,index2) in items" :key="index2">
<div class="other-user-buy-item-img">
<a href="item_detail.html"><img :src="item.img" alt=""></a>
</div>
<div class="other-buy-detail-box">
<div class="other-buy-title">
<a href="item_detail.html">
<p>{{item.intro}}</p>
</a>
</div>
<div class="other-buy-price">
<p>{{item.price}}</p>
</div>
<div class="other-buy-btn-box">
<router-link to="/goodsDetail">
<button class="other-buy-btn"><Icon type="ios-cart"></Icon> 加入购物车</button>
</router-link>
</div>
</div>
</div>
</div>
</div> -->
<BaseFooter></BaseFooter>
</div>
</template>

View File

@@ -25,13 +25,6 @@
<script>
export default {
name: 'AccountBind',
data () {
return {}
},
mounted () {
},
methods: {}
}
</script>

View File

@@ -1,7 +1,6 @@
<template>
<div class="wrapper">
<card _Title="账户安全"/>
<div class="safeList">
<!-- 密码 -->
<Row class="safeItem">
@@ -16,102 +15,11 @@
<Button @click="modifyPwd">修改密码</Button>
</Col>
</Row>
<!-- 邮箱 -->
<!-- <Row class="safeItem">
<Col :span="2">
<Icon size="40" type="md-mail" />
</Col>
<Col :span="16">
<div class="setDivItem">
邮箱验证
</div>
<div class="setDivItem " v-if="true">
您的验证邮箱<span>xxxxx</span>
</div>
<div class="setDivItem " v-else>
</div>
</Col>
<Col :span="4">
<Button>修改邮箱</Button>
</Col>
</Row> -->
<!-- 手机验证 -->
<!-- <Row class="safeItem">
<Col :span="2">
<Icon size="40" type="ios-phone-portrait" />
</Col>
<Col :span="16">
<div class="setDivItem">
手机验证
</div>
<div class="setDivItem " v-if="true">
您的手机号<span>xxxxx</span>
</div>
<div class="setDivItem " v-else>
</div>
</Col>
<Col :span="4">
<Button>立即验证</Button>
</Col>
</Row> -->
<!-- 支付密码 -->
<!-- <Row class="safeItem">
<Col :span="2">
<Icon size="40" type="md-lock" />
</Col>
<Col :span="16">
<div class="setDivItem">
支付密码
</div>
<div class="setDivItem " v-if="true">
安全认证<span>xxxxx</span>
</div>
<div class="setDivItem " v-else>
</div>
</Col>
<Col :span="4">
<Button @click="goModifyPwd" v-if="pwdStatus == '设置密码'" type="error">{{pwdStatus}}</Button>
<Dropdown style="margin-left: 20px" v-if="pwdStatus == '修改密码'" @on-click="selectPwd">
<Button type="primary">
修改密码
<Icon type="ios-arrow-down"></Icon>
</Button>
<DropdownMenu slot="list" on-click="selectPwd">
<DropdownItem name = "1">修改密码</DropdownItem>
<DropdownItem name = "2">重置密码</DropdownItem>
</DropdownMenu>
</Dropdown>
</Col>
</Row> -->
<!-- 实名 -->
<!-- <Row class="safeItem">
<Col :span="2">
<Icon size="40" type="md-card" />
</Col>
<Col :span="16">
<div class="setDivItem">
实名认证
</div>
<div class="setDivItem " v-if="true">
已认证<span>xxxxx</span>
</div>
<div class="setDivItem " v-else>
您还未实名认证该账户立即实名认证可加快提现速度
</div>
</Col>
<Col :span="4">
<Button>立即认证</Button>
</Col>
</Row> -->
</div>
</div>
</template>
<script>
import card from '@/components/card'
import {
getPwdStatus
} from '@/api/account';
@@ -122,7 +30,6 @@ export default {
pwdStatus: '' // 密码状态
}
},
components: {card},
mounted () {
this.getPwdStatus()
},
@@ -131,10 +38,7 @@ export default {
goModifyPwd () {
this.$router.push({name: 'ModifyPwd', query: { status: 2 }})
},
selectPwd (value) {
this.$router.push({name: 'ModifyPwd', query: { status: value }})
},
modifyPwd () {
modifyPwd () { // 修改密码
this.$router.push({name: 'ModifyPwd', query: { status: 1 }})
},
// 获取密码状态

View File

@@ -18,7 +18,7 @@
<div class="title order-item-title">
<span>订单号:{{item.orderNo}}</span>
<span class="color999 ml_10">{{item.createTime}}</span>
<span class="hover-pointer fontsize_12 eval-detail" @click="evaluate(item.id)">评价详情</span>
<span class="hover-pointer fontsize_12 eval-detail" @click="evaluateDetail(item.id)">评价详情</span>
</div>
<Row class="order-item-view">
<i-col span="12" class="item-view-name">
@@ -80,7 +80,7 @@ export default {
this.getList()
},
methods: {
getList () {
getList () { // 获取评价列表
evolutionList(this.params).then(res => {
if (res.success) {
const list = res.result.records;
@@ -92,19 +92,16 @@ export default {
}
})
},
changePageNum (val) {
changePageNum (val) { // 修改页码
this.params.pageNumber = val;
this.getList()
},
changePageSize (val) {
changePageSize (val) { // 修改页数
this.pageNumber = 1;
this.params.pageSize = val;
this.getList()
},
changeIndex (index) {
console.log(index);
},
evaluate (id) {
evaluateDetail (id) { // 跳转评价详情
this.$router.push({path: '/home/evalDetail', query: { id }})
}
}
@@ -112,6 +109,10 @@ export default {
</script>
<style scoped lang="scss">
.page-size {
display: flex;
justify-content: flex-end;
}
.order-img {
> img {
width: 60px;

View File

@@ -141,23 +141,23 @@ export default {
}
},
methods: {
getDetail () {
getDetail () { // 获取投诉详情
getComplainDetail(this.$route.query.id).then(res => {
if (res.success) this.detail = res.result
})
},
goGoodsDetail (skuId, goodsId) {
goGoodsDetail (skuId, goodsId) { // 跳转商品详情
let routerUrl = this.$router.resolve({
path: '/goodsDetail',
query: {skuId, goodsId}
})
window.open(routerUrl.href, '_blank')
},
handleView (name) {
handleView (name) { // 预览图片
this.previewImage = name;
this.visible = true;
},
// 回复
// 回复消息
handleSubmit () {
if (this.params.content === '') {
this.$Message.error('请填写对话内容');

View File

@@ -18,7 +18,7 @@
<div class="title order-item-title">
<span>投诉单号:{{item.id}}</span>
<span class="color999 ml_10">{{item.createTime}}</span>
<span class="hover-pointer fontsize_12 eval-detail" @click="detail(item.id)">投诉详情</span>
<span class="hover-pointer fontsize_12 eval-detail" @click="goDetail(item.id)">投诉详情</span>
<span class="hover-pointer fontsize_12 eval-detail" style="right: 90px" v-if="item.complainStatus != 'EXPIRED' && item.complainStatus != 'CANCEL'" @click="cancel(item.id)">取消投诉</span>
</div>
<Row class="order-item-view">
@@ -93,7 +93,7 @@ export default {
this.getList()
},
methods: {
getList () {
getList () { // 获取投诉列表
complainList(this.params).then(res => {
if (res.success) {
const list = res.result.records;
@@ -102,16 +102,16 @@ export default {
}
})
},
changePageNum (val) {
changePageNum (val) { // 改变页码
this.params.pageNumber = val;
this.getList()
},
changePageSize (val) {
changePageSize (val) { // 改变页数
this.pageNumber = 1;
this.params.pageSize = val;
this.getList()
},
cancel (id) {
cancel (id) { // 取消投诉
this.$Modal.confirm({
title: '取消投诉',
content: '<p>确定取消投诉吗?</p>',
@@ -126,7 +126,7 @@ export default {
onCancel: () => { }
});
},
detail (id) {
goDetail (id) { // 跳转投诉详情
this.$router.push({path: '/home/complainDetail', query: { id }})
}
}

View File

@@ -213,7 +213,7 @@ export default {
this.distribution()
},
methods: {
apply () {
apply () { // 申请成为分销商
this.$refs.form.validate(valid => {
if (valid) {
this.applyLoading = true
@@ -239,10 +239,10 @@ export default {
}
})
},
qrcodeData (data64) {
qrcodeData (data64) { // 二维码base64地址
this.base64Img = data64
},
downloadQrcode () {
downloadQrcode () { // 下载二维码
let a = document.createElement('a'); // 生成一个a元素
let event = new MouseEvent('click'); // 创建一个单击事件
a.download = this.goodsNameCurr || 'photo'
@@ -265,11 +265,11 @@ export default {
this.getLog()
}
},
changePage (val) {
changePage (val) { // 修改页码
this.params.pageNumber = val;
this.getGoodsData()
},
changePageLog (val) {
changePageLog (val) { // 修改页码 日志
this.logParams.pageNumber = val;
this.getLog()
},

View File

@@ -68,19 +68,19 @@ export default {
};
},
methods: {
getList () {
getList () { // 获取收藏列表
this.spinShow = true
collectList(this.params).then(res => {
this.spinShow = false
if (res.success) this.list = res.result.records;
})
},
change (index) {
change (index) { // tab栏切换
if (index === 0) { this.params.type = 'GOODS' }
if (index === 1) { this.params.type = 'SHOP' }
this.getList()
},
cancel (id) {
cancel (id) { // 取消收藏
let typeName = this.params.type === 'GOODS' ? '商品' : '店铺'
this.$Modal.confirm({
title: 'Title',
@@ -94,23 +94,23 @@ export default {
}
});
},
changePageNum (val) {
changePageNum (val) { // 修改页码
this.params.pageNumber = val;
this.getList()
},
changePageSize (val) {
changePageSize (val) { // 修改页数
this.pageNumber = 1;
this.params.pageSize = val;
this.getList()
},
buynow (skuId, goodsId) {
buynow (skuId, goodsId) { // 跳转详情
let url = this.$router.resolve({
path: '/goodsDetail',
query: {skuId, goodsId}
})
window.open(url.href, '_blank')
},
goShop (id) {
goShop (id) { // 跳转店铺页面
let url = this.$router.resolve({
path: '/merchant',
query: {id}

View File

@@ -78,12 +78,12 @@ export default {
this.getList()
},
methods: {
getList () {
getList () { // 获取发票列表
receiptList().then(res => {
this.list = res.result.records;
})
},
save () {
save () { // 保存发票
this.$refs.form.validate((valid) => {
if (valid) {
this.loading = true;
@@ -105,7 +105,7 @@ export default {
}
});
},
resetData () {
resetData () { // 重置表单数据
this.$refs.form.resetFields();
}
}

View File

@@ -99,7 +99,7 @@ export default {
againPassword: '',
newPassword: ''
},
ruleInLines: {
ruleInLines: { // 验证规则
picture: [
{required: true, message: '请输入图片验证码', trigger: 'blur'}
],
@@ -107,7 +107,7 @@ export default {
{required: true, message: '请输入短信验证码', trigger: 'blur'}
]
},
ruleIn: {
ruleIn: { // 验证规则
newPassword: [
{required: true, message: '请输入新密码', trigger: 'blur'},
{type: 'string', min: 6, message: '密码不能少于6位'}
@@ -117,7 +117,7 @@ export default {
{type: 'string', min: 6, message: '密码不能少于6位'}
]
},
ruleInline: {
ruleInline: { // 验证规则
password: [
{required: true, message: '请输入旧密码', trigger: 'blur'}
],

View File

@@ -63,7 +63,7 @@ export default {
this.getPoint()
},
methods: {
getHistory () {
getHistory () { // 获取积分历史
memberPointHistory(this.params).then(res => {
this.logData = res.result;
})
@@ -73,11 +73,11 @@ export default {
if (res.success) this.pointObj = res.result
})
},
changePage (val) {
changePage (val) { // 修改页码
this.pageNumber = val
this.getHistory()
},
changePageSize (val) {
changePageSize (val) { // 修改页数
this.param.pageSize = val
this.params.pageNumber = 1
this.getHistory()

View File

@@ -8,7 +8,6 @@
<Upload
:show-upload-list="false"
:on-success="handleSuccess"
:before-upload="handleBeforeUpload"
:format="['jpg','jpeg','png']"
:action="action"
:headers="accessToken"
@@ -58,7 +57,7 @@ export default {
this.accessToken.accessToken = storage.getItem('accessToken');
},
methods: {
save () {
save () { // 保存
this.$refs.form.validate(valid => {
if (valid) {
let params = {
@@ -76,10 +75,9 @@ export default {
}
})
},
handleSuccess (res, file) {
handleSuccess (res, file) { // 上传成功
this.$set(this.formItem, 'face', res.result)
},
handleBeforeUpload () {}
}
}

View File

@@ -88,7 +88,7 @@ export default {
}
},
methods: {
getOrderDetail () {
getOrderDetail () { // 获取订单详情
orderDetail(this.$route.query.sn).then(res => {
this.order = res.result
this.orderGoods = res.result.orderItems[this.$route.query.index]
@@ -96,7 +96,7 @@ export default {
this.orderGoods.uploadList = []
})
},
save () {
save () { // 保存评价
if (!this.form.serviceScore || !this.form.deliveryScore) {
this.$Message.warning('物流服务评价不能为空')
return false;
@@ -129,26 +129,26 @@ export default {
this.loading = false;
})
},
goGoodsDetail (skuId, goodsId) {
goGoodsDetail (skuId, goodsId) { // 跳转商品详情
let routerUrl = this.$router.resolve({
path: '/goodsDetail',
query: {skuId, goodsId}
})
window.open(routerUrl.href, '_blank')
},
handleView (name) {
handleView (name) { // 预览图片
this.previewImage = name;
this.visible = true;
},
handleRemove (index) {
handleRemove (index) { // 移除图片
this.orderGoods.uploadList.splice(index, 1)
this.$forceUpdate()
},
handleSuccess (res, file) {
handleSuccess (res, file) { // 上传成功回调
this.orderGoods.uploadList.push(res.result)
this.$forceUpdate()
},
handleBeforeUpload () {
handleBeforeUpload () { // 上传之前钩子
const check = this.orderGoods.uploadList.length < 10;
if (!check) {
this.$Notice.warning({

View File

@@ -65,19 +65,19 @@ export default {
}
},
methods: {
getDetail () {
getDetail () { // 获取评价详情
evaluationDetail(this.$route.query.id).then(res => {
if (res.success) this.orderGoods = res.result
})
},
goGoodsDetail (skuId, goodsId) {
goGoodsDetail (skuId, goodsId) { // 跳转商品详情
let routerUrl = this.$router.resolve({
path: '/goodsDetail',
query: {skuId, goodsId}
})
window.open(routerUrl.href, '_blank')
},
handleView (name) {
handleView (name) { // 预览图片
this.previewImage = name;
this.visible = true;
}

View File

@@ -0,0 +1,17 @@
<template>
<div class="msg-list">
会员消息详情
</div>
</template>
<script>
export default {
data() {
return {
detail: {}, // 消息详情
}
},
}
</script>
<style lang="scss" scoped>
</style>

View File

@@ -0,0 +1,41 @@
<template>
<div class="msg-list">
<card _Title="我的消息" :_Tabs="status" :_Size="16" />
</div>
</template>
<script>
import {memberMsgList, readMemberMsg, delMemberMsg} from '@/api/member.js'
export default {
data() {
return {
list: [], // 会员列表
status: ['未读', '已读', '回收站'],
params: { // 请求参数
pageNumber: 1,
pageSize: 10,
status: ''
},
}
},
methods: {
getList () { // 获取消息列表
memberMsgList(this.params).then(res => {
if (res.success) {
this.list = res.result.records;
}
})
},
setRead (id) { // 设置消息已读
readMemberMsg(id).then(res => {
})
}
},
mounted () {
this.getList()
}
}
</script>
<style lang="scss" scoped>
</style>

View File

@@ -79,7 +79,7 @@ export default {
};
},
methods: {
save () {
save () { // 保存地址
this.$refs.form.validate((valid) => {
if (valid) {
const params = JSON.parse(JSON.stringify(this.formData));

View File

@@ -133,7 +133,7 @@ export default {
});
window.open(routeUrl.href, '_blank');
},
getList () {
getList () { // 获取售后列表
this.spinShow = true;
let params = JSON.parse(JSON.stringify(this.params))
afterSaleList(params).then(res => {
@@ -144,11 +144,11 @@ export default {
}
});
},
changePageNum (val) {
changePageNum (val) { // 修改页码
this.params.pageNumber = val;
this.getList()
},
changePageSize (val) {
changePageSize (val) { // 修改页数
this.pageNumber = 1;
this.params.pageSize = val;
this.getList()

View File

@@ -75,7 +75,7 @@ export default {
}
})
},
getLog () {
getLog () { // 获取售后日志
afterSaleLog(this.$route.query.sn).then(res => {
this.logList = res.result;
})

View File

@@ -139,7 +139,7 @@ export default {
}
},
methods: {
getInfo () {
getInfo () { // 获取售后信息
afterSaleInfo(this.$route.query.sn).then(res => {
if (res.success) {
this.info = res.result
@@ -147,15 +147,15 @@ export default {
}
})
},
getReason (type) {
getReason (type) { // 获取售后原因
afterSaleReason(type).then(res => {
if (res.success) this.reasonList = res.result
})
},
changeReason (type) {
changeReason (type) { // 改变售后原因列表
this.getReason(type)
},
apply () {
apply () { // 售后申请提交
this.$refs.form.validate(valid => {
if (valid) {
let params = Object.assign(this.info, this.form)
@@ -170,19 +170,19 @@ export default {
}
})
},
handleView (name) {
handleView (name) { // 预览图片
this.previewImage = name;
this.visible = true;
},
handleRemove (index) {
handleRemove (index) { // 移除图片
this.uploadList.splice(index, 1)
this.$forceUpdate()
},
handleSuccess (res, file) {
handleSuccess (res, file) { // 上传成功回调
this.uploadList.push(res.result)
this.$forceUpdate()
},
handleBeforeUpload () {
handleBeforeUpload () { // 上传之前钩子函数
const check = this.uploadList.length < 6;
if (!check) {
this.$Notice.warning({

View File

@@ -78,7 +78,7 @@ export default {
}
},
methods: {
getOrderDetail () {
getOrderDetail () { // 获取订单详情
orderDetail(this.$route.query.sn).then(res => {
this.order = res.result
this.orderGoods = res.result.orderItems[this.$route.query.index]
@@ -92,7 +92,7 @@ export default {
}
})
},
save () {
save () { // 提交投诉信息
let params = {
goodsId: this.orderGoods.goodsId,
complainTopic: this.form.complainTopic,
@@ -108,26 +108,26 @@ export default {
}
})
},
goGoodsDetail (skuId, goodsId) {
goGoodsDetail (skuId, goodsId) { // 跳转商品详情
let routerUrl = this.$router.resolve({
path: '/goodsDetail',
query: {skuId, goodsId}
})
window.open(routerUrl.href, '_blank')
},
handleView (name) {
handleView (name) { // 预览图片
this.previewImage = name;
this.visible = true;
},
handleRemove (index) {
handleRemove (index) { // 移除图片
this.orderGoods.uploadList.splice(index, 1)
this.$forceUpdate()
},
handleSuccess (res, file) {
handleSuccess (res, file) { // 上传成功回调
this.orderGoods.uploadList.push(res.result)
this.$forceUpdate()
},
handleBeforeUpload () {
handleBeforeUpload () { // 上传之前钩子函数
const check = this.orderGoods.uploadList.length < 6;
if (!check) {
this.$Notice.warning({

View File

@@ -240,7 +240,7 @@ export default {
complainResult (sn) { // 投诉结果
},
delOrder (sn) {
delOrder (sn) { // 删除订单
this.$Modal.confirm({
title: '删除订单',
content: '<p>确认删除当前订单吗?</p>',
@@ -255,7 +255,7 @@ export default {
onCancel: () => {}
});
},
getList () {
getList () { // 获取订单列表
this.spinShow = true;
let params = JSON.parse(JSON.stringify(this.params))
if (params.orderStatus === 'ALL') {
@@ -269,11 +269,11 @@ export default {
}
});
},
changePageNum (val) {
changePageNum (val) { // 修改页码
this.params.pageNumber = val;
this.getList()
},
changePageSize (val) {
changePageSize (val) { // 修改页数
this.pageNumber = 1;
this.params.pageSize = val;
this.getList()
@@ -289,7 +289,7 @@ export default {
}
})
},
sureCancel () {
sureCancel () { // 确定取消
cancelOrder(this.cancelParams).then(res => {
if (res.success) {
this.$Message.success('取消订单成功')

View File

@@ -128,7 +128,7 @@ export default {
}
})
},
traces () {
traces () { // 物流信息
getTraces(this.$route.query.sn).then(res => {
if (res.success) {
this.logistics = res.result

View File

@@ -41,6 +41,11 @@ const member = [{
title: '账户安全',
path: 'AccountSafe'
},
{
icon: '',
title: '我的消息',
path: 'MsgList'
},
{
icon: '',
title: '我的足迹',

View File

@@ -1,77 +1,133 @@
// 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;
// 如果是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';
if (isPutPost && isJson) {
config.data = JSON.stringify(config.data);
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";
if (isPutPost && isJson) {
config.data = JSON.stringify(config.data);
}
if (isPutPost && !isFile && !isJson) {
config.data = qs.stringify(config.data, {
arrayFormat: "repeat"
});
}
/** 配置全屏加载 */
if (process.client && loading !== false) {
config.loading = Spin.show();
}
const uuid = Storage.getItem("uuid");
config.headers["uuid"] = uuid;
// 获取访问Token
let accessToken = Storage.getItem("accessToken");
if (accessToken && config.needToken) {
config.headers["accessToken"] = accessToken;
// 解析当前token时间
let jwtData = JSON.parse(
decodeURIComponent(escape(window.atob(accessToken.split(".")[1])))
);
if (jwtData.exp < Math.round(new Date() / 1000)) {
refresh()
}
}
return config;
},
error => {
Promise.reject(error);
}
if (isPutPost && !isFile && !isJson) {
config.data = qs.stringify(config.data, {
arrayFormat: 'repeat'
);
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();
}
});
}
/** 配置全屏加载 */
if (process.client && loading !== false) {
config.loading = Spin.show();
}
const uuid = Storage.getItem('uuid');
config.headers['uuid'] = uuid;
// 获取访问Token
let accessToken = Storage.getItem('accessToken');
if (accessToken && config.needToken) {
config.headers['accessToken'] = accessToken;
}
return config;
}, error => {
Promise.reject(error);
});
}
// 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,13 +171,13 @@ 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) {
export default function request(options) {
// 如果是服务端或者是请求的刷新token不需要检查token直接请求。
// if (process.server || options.url.indexOf('passport/token') !== -1) {
return service(options);
@@ -160,47 +186,46 @@ export default function request (options) {
}
// 防抖闭包来一波
function getTokenDebounce () {
let lock = false
let success = false
return function () {
function getTokenDebounce() {
let lock = false;
let success = false;
return function() {
if (!lock) {
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);
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);
success = true
lock = false
} else {
success = false
lock = false
// router.push('/login')
}
}).catch((err) => {
console.log(err);
success = false
lock = false
})
success = true;
lock = false;
} else {
success = false;
lock = false;
// router.push('/login')
}
})
.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

@@ -47,6 +47,8 @@ const ComplainList = resolve => require(['@/pages/home/memberCenter/ComplainList
const ComplainDetail = resolve => require(['@/pages/home/memberCenter/ComplainDetail'], resolve);
const Invoice = resolve => require(['@/pages/home/memberCenter/Invoice'], resolve);
const Point = resolve => require(['@/pages/home/memberCenter/Point'], resolve);
const MsgList = resolve => require(['@/pages/home/memberCenter/memberMsg/MsgList'], resolve);
const MsgDetail = resolve => require(['@/pages/home/memberCenter/memberMsg/MsgDetail'], resolve);
/*
* 会员中心
@@ -316,6 +318,18 @@ export default new Router({
name: 'AddAddress',
component: AddAddress
},
{
path: 'MsgList',
name: 'MsgList',
component: MsgList,
meta: {title: '我的消息'}
},
{
path: 'MsgDetail',
name: 'MsgDetail',
component: MsgDetail,
meta: {title: '我的消息'}
},
{
path: 'MyOrder',
name: 'MyOrder',