Authored by TaoHuang

Merge remote-tracking branch 'origin/develop' into develop

... ... @@ -12,6 +12,11 @@ import Second from './second';
export default [
{
path: '/xianyu/yasTest',
name: 'yasTest',
component: () => import(/* webpackChunkName: "yasTest" */ './yasTest'),
},
{
path: '/xianyu',
redirect: { name: 'ChannelPage' },
},
... ...
... ... @@ -18,7 +18,7 @@
<div class="price-status">
<span class="price">¥{{ goodsInfo.goodPrice }}</span>
</div>
<p class="item-name">
<p class="item-name"><span>【{{ goodsInfo.typeTag }}】</span>
{{ goodsInfo.productName }}
</p>
</div>
... ...
... ... @@ -47,9 +47,45 @@
>
<template v-slot:content="{ detail: { miniFaultConfirm } }">
<div class="judge-content-wrapper" v-if="miniFaultConfirm">
<!-- 卖家评论 -->
<div v-if="miniFaultConfirm.secondDetailBySeller">
<p class="tip"><span class="tip-text-gray">{{miniFaultConfirm.secondDetailBySeller.title}}</span></p>
<div class="img-container">
<ul class="img-wrapper">
<li
v-for="(imgUrl, i) in miniFaultConfirm.secondDetailBySeller.imageUrlList.slice(
0,
3
)"
:key="i"
@click="showBigImage(miniFaultConfirm.secondDetailBySeller.imageUrlList, i)"
>
<ImageFormat
:data-secc="imgUrl"
:src="imgUrl"
alt=""
:width="70"
:height="70"
/>
</li>
<li v-if="miniFaultConfirm.secondDetailBySeller.imageUrlList.length > 3">
<Button
class="more"
@click="showBigImage(miniFaultConfirm.secondDetailBySeller.imageUrlList, 3)"
>查看更多</Button
>
</li>
</ul>
</div>
<p class="seller-tip">
<span class="tip-text-gray" v-if="miniFaultConfirm.secondDetailBySeller.sndTitle">{{miniFaultConfirm.secondDetailBySeller.sndTitle}}</span>
</p>
<p><span class="tip-text-gray" v-if="miniFaultConfirm.secondDetailBySeller.desc">{{miniFaultConfirm.secondDetailBySeller.desc}}</span></p>
</div>
<p class="tip">
<span
:class="[miniFaultConfirm.showBtn ? '' : 'tipTextGray']"
:class="[miniFaultConfirm.showBtn ? '' : 'tip-text-gray']"
>{{ miniFaultConfirm.text }}</span
>
<span v-if="miniFaultConfirm.showBtn">
... ... @@ -68,7 +104,7 @@
3
)"
:key="i"
@click="showBigImage(miniFaultConfirm, i)"
@click="showBigImage(miniFaultConfirm.imageUrls, i)"
>
<ImageFormat
:data-secc="imgUrl"
... ... @@ -81,7 +117,7 @@
<li v-if="miniFaultConfirm.imageUrls.length > 3">
<Button
class="more"
@click="showBigImage(miniFaultConfirm, 3)"
@click="showBigImage(miniFaultConfirm.imageUrls, 3)"
>查看更多</Button
>
</li>
... ... @@ -218,11 +254,11 @@ export default {
onCancel: () => {}
}).show();
},
showBigImage(data, index) {
showBigImage(imageUrls = [], index) {
// 点击小图展示大图
if (data.imageUrls && data.imageUrls.length > 0) {
if (imageUrls && imageUrls.length > 0) {
this.imageUrls = [];
data.imageUrls.forEach(val => {
imageUrls.forEach(val => {
this.imageUrls.push(val.replace(/{width}x{height}/, "750x"));
});
... ... @@ -353,12 +389,16 @@ export default {
}
}
.seller-tip {
margin-top: 20px;
}
.tip {
margin-top: 20px;
margin-bottom: 10px;
}
.tipTextGray {
.tip-text-gray {
color: #999;
}
... ...
... ... @@ -6,12 +6,20 @@
* @后台人员:
* @version: v1.0.0
* @path: 页面访问路径及参数说明
* @调用示例说明:
@调用示例:
import FilterList from './components/filter-list';
<FilterList
:visible.sync="filterModalVisible"
:storage_id="storage_id"
@submit="handleFilterSubmit"
></FilterList>
components: {
FilterList,
}
!-->
<template>
<!-- <LayoutApp :show-back="true" title="筛选"> -->
<div
class="container"
v-show="visible"
... ... @@ -73,10 +81,9 @@
>确定</div>
</div>
</div>
<!-- </LayoutApp> -->
</template>
<script>
import { mapState, mapActions, createNamespacedHelpers } from 'vuex';
import { mapState, mapActions } from 'vuex';
// const filterData = [
// {
... ... @@ -125,7 +132,7 @@ export default {
data () {
return {
selected: {
// second_type: null // 注意:null是默认值
// second_type: null // 注意:null是默认值, 点击对应item 会根据 filterData[x].filterId值 动态创建此对象
}
};
},
... ... @@ -179,18 +186,11 @@ export default {
* @ version: v1.0.0
*/
submit() {
this.$emit('submit', this.selected);
if (Object.keys(this.selected).length!==0) {
this.$emit('submit', this.selected);
}
this.$emit('update:visible', !this.visible);
}
// yas (param) {
// this.$store.dispatch('reportYas', {
// params: {
// param,
// appop: 'XY_UFO_PRD_LIST_SCREEN_C'
// }
// });
// }
}
};
</script>
... ...
... ... @@ -10,12 +10,17 @@
<ImgSize class="item-imge" :src="product.secondhand_image" :width="343" :height="343"/>
</div>
<div class="item-name">
<p>
<span v-if="product.secondhandTypeName">{{product.secondhandTypeName}}</span>
<span>{{product.product_name}}</span>
</p>
</div>
<div class="item-bottom">
<div class="item-price">
<span>{{product.skup_price && '¥'}}</span><span>{{product.skup_price || ' '}}</span>
<div v-if="product.secondhandTypeName" class="sale_flag">
<p>{{product.secondhandTypeName}}</p>
</div>
<span class='save-flag'>{{product.save_price && '已省¥'}}{{product.save_price || ' '}}</span>
</div>
<div class="size-flag">{{product.size_name}}码</div>
</div>
... ... @@ -47,7 +52,7 @@ export default {
methods: {
goDetail(product, index) {
if (this.yasParams && Object.keys(this.yasParams).length) {
this.yasDetail(product.id, index);
this.yasDetail(product.product_id, index);
}
this.$router.push({
... ... @@ -91,8 +96,8 @@ export default {
}
// 判断是否是重复曝光
if (list.length && list[0].id !== this.yasFirstId) {
this.yasFirstId = list[0].id;
if (list.length && list[0].product_id !== this.yasFirstId) {
this.yasFirstId = list[0].product_id;
let DATA = [];
list.map((value, i) => {
... ... @@ -159,8 +164,35 @@ export default {
filter: alpha(opacity=60);
}
.item-bottom {
.item-name {
padding: 20px 14px 30px 20px;
align-items: center;
& > p {
height: 80px;
color: #000;
font-size: 28px;
line-height: 40px;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
text-overflow: ellipsis;
overflow: hidden;
& > :first-child {
color: #fff;
background: #000;
padding: 4px 8px;
text-align: center;
font-size: 24px;
line-height: 30px;
display: inline-block;
}
}
}
.item-bottom {
padding: 0 14px 30px 20px;
display: flex;
justify-content: space-between;
align-items: center;
... ... @@ -176,18 +208,11 @@ export default {
@include num
}
.sale_flag {
background: #000;
height: 30px;
margin-left: 8px;
padding: 0 8px;
border-radius: 4px;
p {
color: #fff;
line-height: 30px;
font-size: 18px;
}
.save-flag {
margin-left: 5px;
color: #d0021d;
font-size: 26px;
@include num
}
.size-flag {
... ...
... ... @@ -32,16 +32,16 @@
</cube-slide>
<div class="primary">
<div>
<p class="price">¥{{info.price}}</p>
<p class="price">¥{{info.price}} <span>全新¥{{info.newProductPrice}}</span><span class="red"> 省¥{{info.savePrice}}</span></p>
<p class="size">{{info.sizeName}}</p>
</div>
<p class="name">{{info.productName}} {{info.colorName}} {{info.describeInfo}}</p>
<p class="name">{{info.productName}} {{info.colorName}} {{info.productCode}}</p>
</div>
<div class="other-info">
<p>{{info.gender}} {{info.brandName}}</p>
<p>状况:{{ info.shoeQualityDesc }}</p>
<p>鞋盒:{{ info.shoeBoxDesc }}</p>
<p>售出时间:{{ info.soldTime }}</p>
<p v-show="info.soldTime">售出时间:{{ info.soldTime }}</p>
<p>{{ info.describeInfo }}</p>
</div>
<div class="extra-card" @click="$router.push({name: 'ProductDetail', params: { productId: info.productId } })">
... ... @@ -54,7 +54,8 @@
</div>
</LayoutScroll>
<div class="fixed-footer">
<cube-button class="buy active" @click="buy">购买 <span class="price">¥{{info.price}}</span></cube-button>
<cube-button v-if="info.status==1" class="active" @click="buy">购买 <span class="price">¥{{info.price}}</span></cube-button>
<cube-button v-else class="disable">商品已售出</cube-button>
</div>
</LayoutApp>
</template>
... ... @@ -94,7 +95,12 @@ export default {
name: 'UfoSecondProductDetail',
mixins: [],
props: {
skup: Number
skup: Number,
yasParams: {
TAB_ID: '',
TAB_NAME: '',
PRD_ID: '',
}
},
// 服务端渲染函数
asyncData({store, router}) {
... ... @@ -112,11 +118,11 @@ export default {
created() {},
mounted() {},
activated() {
// console.log('mounted', this.info);
console.log(this.info);
this.fetchDetailById({ skup: this.skup })
this.refresh();
/*
[二手商品详情页打开时]
1.FP_NAME:来源页面名称;eg:XY_UFO...
... ... @@ -126,16 +132,18 @@ export default {
5.PRD_ID:商品id;
6.PRD_TYPE:1-二手,2-全新瑕疵;
*/
// let { TAB_ID, TAB_NAME, PRD_ID } = this.yasParams;
this.$store.dispatch('reportYas', {
params: {
appop: 'XY_UFO_PRD_DT_INFO',
param:{
FP_NAME: `XY_UFO${this.$route.name}`,
FP_PARAM: this.skup,
TAB_ID: '',
TAB_NAME: '',
PRD_ID: this.$route.query.pid,
PRD_TYPE: this.info.describeInfo
TAB_ID: this.yasParams?.TAB_ID,
TAB_NAME: this.yasParams?.TAB_NAME,
PRD_ID: this.yasParams?.PRD_ID,
PRD_TYPE: this.info.sechondHandTypeName == '全新瑕疵' ? 2 :1
}
}
});
... ... @@ -168,9 +176,9 @@ export default {
appop: 'XY_UFO_PRD_DT_BUY_SEL_C',
param:{
P_NAME: `XY_UFO${this.$route.name}`,
PRD_ID: this.$route.query.pid,
PRD_ID: this.yasParams?.pid,
PRD_SIZE: this.info.sizeName,
ORD_TYPE: this.info.describeInfo
ORD_TYPE: this.info.sechondHandTypeName == '全新瑕疵' ? 2 :1
}
}
});
... ... @@ -190,7 +198,7 @@ export default {
PRD_ID: this.info.productId,
PRD_SKU: this.skup,
PRD_SIZE: this.info.size_name,
ORD_TYPE: this.info.sechondHandTypeName === '二手' ? 5 : 6,
ORD_TYPE: this.info.sechondHandTypeName == '全新瑕疵' ? 2 :1
},
},
});
... ... @@ -282,6 +290,13 @@ export default {
font-size: 36px;
letter-spacing: 2px;
}
& > span {
font-size: 24px;
color: #000;
&.red {
color: #D0021B;
}
}
}
.size {
font-size: 32px;
... ... @@ -365,6 +380,12 @@ export default {
letter-spacing: 2px;
}
}
.disable {
background: #ddd;
color: #999;
border-color: #ddd;
font-size: 32px;
}
}
</style>
... ...
... ... @@ -4,6 +4,7 @@ export default [{
component: () => import(/* webpackChunkName: "second" */ './detail'),
props({params}) {
return {
...params,
skup: parseInt(params.skup, 10),
};
},
... ...
... ... @@ -2,7 +2,6 @@
<LayoutApp :show-back="true" title="二手" class="list-wrapper">
<LayoutScroll
ref="scrolllist"
@scroll="scrollHandler"
@scroll-end="scrollEndHandler"
@pulling-up="fetchSkupList(isMore)"
v-if="skupList.list.length"
... ... @@ -30,7 +29,12 @@ export default {
},
data() {
return {
yasParams: {P_NAME: 'XY_UFOSecondList', TYPE_ID: 5, TAB_ID: '', TAB_NAME: '', P_PARAM: [].toString()},
yasParams: { P_NAME: 'XY_UFOSecondList',
TYPE_ID: 5,
TAB_ID: '',
TAB_NAME: '',
P_PARAM: [].toString()
}
}
},
computed: {
... ... @@ -44,13 +48,9 @@ export default {
await this.fetchSecondSkupList({ isReset: false });
}
},
scrollHandler({y}) {
this.scrollY = -y;
},
scrollEndHandler({y}) {
let height = -y;
this.$refs.second.yasShowEvent(height);
},
... ... @@ -59,7 +59,7 @@ export default {
let PRD_LIST = [];
for (let item of list) {
PRD_LIST.push(item.id);
PRD_LIST.push(item.product_id);
}
PRD_LIST = PRD_LIST.toString();
this.$store.dispatch('reportYas', {
... ...
... ... @@ -14,10 +14,10 @@
<div class="filter">
<div class="filter-tab">
<div class="tab-item" :class="{'selected-tab': queryOptions.sort==null}"
@click="handleSortChange({ type: 'tuijian', sort: null})"
@click.stop="handleSortChange({ type: 'tuijian', sort: null})"
>推荐</div>
<div class="tab-item middle"
@click="handleSortChange({ type: 'price', sort: null })"
@click.stop="handleSortChange({ type: 'price', sort: null })"
>
<span :class="{'selected-tab': queryOptions.sort!=null}">价格</span>
<div class="price-arrow"
... ... @@ -29,7 +29,7 @@
</div>
</div>
<div class="middle">
<div class="screen middle" @click="filterModalVisible=true">
<div class="screen middle" @click="handleSortChange({ type: 'shaixuan', sort: null});filterModalVisible=true">
<div class="screen-img"></div>
筛选
</div>
... ... @@ -43,7 +43,7 @@
v-if="productList.length"
class="product-list"
>
<SecondList :list="productList"></SecondList>
<SecondList :list="productList" :yasParams="yasParams"></SecondList>
</LayoutScroll>
<!-- <EmptyList class="empty-wrapper product-list" :tip="`暂无数据`" v-show="productList.isEmpty" /> -->
</LayoutApp>
... ... @@ -133,12 +133,11 @@ export default {
queryOptions.sort = null
}
if (type==='price') {
queryOptions.sort = (queryOptions.sort===''||queryOptions.sort==='p_asc')?'p_desc':'p_asc'
// queryOptions.second_type = sort;
queryOptions.sort = (queryOptions.sort===null||queryOptions.sort==='p_asc')?'p_desc':'p_asc'
}
if (type==='shaixuan') {
if (type==='shaixuanConfirm') {
queryOptions.second_type = sort;
console.log(queryOptions.second_type);
}
this.$set(this.queryOptions, 'sort', queryOptions.sort);
... ... @@ -153,29 +152,82 @@ export default {
二手商品列表页-顶部TAB切换按钮点击
新增二手、全新瑕疵商品列表页TAB点击:
1.P_NAME:页面名称,XY_UFO...
2.TYPE_ID:列表页入口类型,1-搜索结果页,2-系列,3-品牌,4-商品池;
2.TYPE_ID:列表页入口类型,1-搜索结果页,2-系列,3-品牌,4-商品池 5-商品详情
3.P_PARAM:条件值,搜索关键词,系列ID,品牌ID,商品池ID;
4.TAB_IreportYasD:tab切id,1-人气,2-价格,3-新品,4-筛选;5-推荐
4.TAB_ID:tab切id,1-人气,2-价格,3-新品,4-筛选;5-推荐
5.TAB_NAME:tab切名称,人气,价格,新品,筛选;推荐
*/
// TODO:zhiming 调整数据上报传参,与徐兰沟通
// this.$store.dispatch('reportYas', {
// params: {
// appop: 'XY_UFO_PRD_LIST_TAB_C',
// param:{
// P_NAME: `XY_UFO${this.$route.name}`,
// TYPE_ID: '商品详情页选尺码进二手',
// P_PARAM: `second_type=${queryOptions.second_type},sort=${queryOptions.sort},storage_id=${this.storage_id},productId=${this.$route.query.pid}`,
// TAB_ID: type,
// TAB_NAME: type,
// },
// }
// });
let yasParam = {
TAB_ID: null,
TAB_NAME: null,
}
switch (type) {
case 'price':
yasParam.TAB_ID = 2
yasParam.TAB_NAME = '价格'
break;
case 'shaixuan':
yasParam.TAB_ID = 4
yasParam.TAB_NAME = '筛选'
break;
default:
yasParam.TAB_ID = 5
yasParam.TAB_NAME = '推荐'
break;
}
this.$store.dispatch('reportYas', {
params: {
appop: 'XY_UFO_PRD_LIST_TAB_C',
param:{
P_NAME: `XY_UFO${this.$route.name}`,
TYPE_ID: 5,
P_PARAM: this.$route.query.pid,
...yasParam
},
}
});
},
handleFilterSubmit(selected) {
const { second_type } = selected;
// console.log('hooks@selected', selected);
this.handleSortChange({ type: 'shaixuan', sort: second_type })
/*
新增二手、全新瑕疵商品列表页筛选点击:
1.TYPE_ID:列表类型,1-搜索结果页,2-系列,3-品牌,4-商品池;5-商品详情;
2.P_PARAM:条件值,搜索关键词,系列ID,品牌ID,商品池ID;
3.TAB_ID:tab切id,1-人气,2-价格,3-新品 4-筛选;5-推荐;
4.TAB_NAME:tab切名称,人气,价格,新品;
5.ENT_PARAMS:选中条件的集合,包含ENT_KEY,ENT_ID两个参数;
6.ENT_NAME:筛选条件的名称
7.ENT_ID:筛选条件的值;
*/
let yasParam = {
P_NAME: `XY_UFO${this.$route.name}`,
TYPE_ID: 5,
P_PARAM: this.$route.query.pid,
TAB_ID: null,
TAB_NAME: null,
ENT_PARAMS: { 'second_type': second_type },
ENT_NAME: 'second_type',
ENT_ID: second_type,
}
if (this.queryOptions.sort===null) {
yasParam.TAB_ID = 5
yasParam.TAB_NAME = '推荐'
} else {
yasParam.TAB_ID = 2
yasParam.TAB_NAME = '价格'
}
this.$store.dispatch('reportYas', {
params: {
appop: 'XY_UFO_PRD_LIST_SCREEN_C',
param: {...yasParam},
}
});
this.handleSortChange({ type: 'shaixuanConfirm', sort: second_type })
},
},
computed: {
... ... @@ -185,6 +237,38 @@ export default {
...mapState('product', ["selectedProductInfo"]),
computePageTitle() {
return this.selectedProductInfo.product.product_name
},
yasParams() {
/*
1.P_NAME:页面名称,XY_UFO...
2.TYPE_ID:列表页入口类型,1-搜索结果页,2-系列,3-品牌,4-商品池;5-二手;
3.P_PARAM:列表入口页面参数,搜索关键词,系列ID,品牌ID,商品池ID;
4.TAB_ID:tab切id,2-价格,4-推荐;
5.TAB_NAME:tab切名称,价格,推荐;
6.I_INDEX:曝光顺序;
7.PRD_ID:商品id;
8.PRD_TYPE:1-二手,2-全新瑕疵;
*/
let _yasParams = {
P_NAME: `XY_UFO${this.$route.name}`,
TYPE_ID: 5,
P_PARAM: null,
TAB_ID: null,
TAB_NAME: null,
I_INDEX: null,
PRD_ID: this.$route.query.pid,
PRD_TYPE: this.queryOptions.second_type===5 ? 2 : 1
}
if (this.queryOptions.sort===null) {
_yasParams.TAB_ID = 5
_yasParams.TAB_NAME = '推荐'
} else {
_yasParams.TAB_ID = 2
_yasParams.TAB_NAME = '价格'
}
return _yasParams;
}
},
watch: {},
... ...
<!--
* @description:
* @fileName: yasTest.vue
* @author: huzhiming
* @date: 2019-11-28 10:09:21
* @后台人员:
* @version: v1.0.0
* @path: 页面访问路径及参数说明
!-->
<template>
<div class="yasTest-wrap">
<div class="top">height:1000px</div>
<div :id="`box${item.id}`" class="box" v-for="(item, index) in yasList" :key="index">
<pre>
height:100px
id: {{item.id}}
</pre>
</div>
<div class="down">height:1000px</div>
</div>
</template>
<script>
// horizontal vertical
// initHorizontalExposure
import { debounce, throttle } from 'lodash';
const mixins = {
data() {
return {
yasList: [...Array(5).keys()].map((item,index)=>({id: index, offset:null}))
}
},
created() {},
mounted() {
console.log('init mixins');
window.addEventListener('scroll', debounce(this.handleScroll,500));
// window.addEventListener('scroll', throttle(this.handleScroll,500));
},
activated() {},
deactivated() {},
// beforeRouteEnter (to, from, next) {},
// beforeRouteUpdate(to, from, next) {},
// beforeRouteLeave(to, from, next) {},
destroyed() {},
methods: {
handleScroll(e) {
console.log(e);
}
},
computed: {},
watch: {},
components: {}
}
export default {
name: 'yasTest',
mixins: [mixins],
props: {},
data() {
return {}
},
created() {},
mounted() {},
activated() {},
deactivated() {},
// beforeRouteEnter (to, from, next) {},
// beforeRouteUpdate(to, from, next) {},
// beforeRouteLeave(to, from, next) {},
destroyed() {},
methods: {},
computed: {},
watch: {},
components: {}
};
</script>
<style rel='stylesheet/scss' lang='scss' scoped>
.yasTest-wrap {
background: #f5f5f5;
.box {
width: 100vw;
height: 200px;
&:nth-child(2n) {
background: red;
}
&:nth-child(2n+1) {
background: green;
}
}
.top,.down {
height: 2000px;
}
}
//@import "./style.scss";
</style>
... ...
... ... @@ -50,7 +50,7 @@ export default {
* @ date: 2019-11-22 14:32:46
* @ version: v1.0.0
*/
async fetchFilterData({ commit, state }, { storage_id = 10228909 }) {
async fetchFilterData({ commit, state }, { storage_id = null }) {
let { data: { filter = [] } } = await this.$api.post('/api/ufo/secondhand/filter', { storage_id });
// console.log('[store/actions/fetchFilterData]:', JSON.stringify(filter));
... ...
... ... @@ -36,10 +36,11 @@ export default {
// 为了适配组件内数据,[apps/pages/second/components/second-list.vue]
product_list = product_list.map(item=>({
fromSize: true, // 特殊标识 解决列表组件样式问题
...item,
secondhand_image: item.image,
skup_price: item.price,
sechondHandTypeName: item.sechondHandTypeName,
secondhandTypeName: item.sechondHandTypeName, // 修复字段单词拼写错误
size_name: item.sizeName.replace('码', '')
}));
... ...
{
"name": "xianyu-ufo-app-web",
"version": "1.1.0-beta-5",
"version": "1.1.0-beta-9",
"private": true,
"description": "Xianyu Project With Express",
"repository": {
... ...