Browse Source

首页、商品分类数据接入

feature/feature-compatible
wenghaocan 7 years ago
parent
commit
cca8fdfdb7
20 changed files with 286 additions and 166 deletions
  1. 9
      src/api/goods.js
  2. BIN
      src/assets/images/icon/cleanup-2.png
  3. BIN
      src/assets/images/icon/cleanup-hot-2.png
  4. BIN
      src/assets/images/icon/cleanup-hot.png
  5. BIN
      src/assets/images/icon/cleanup-new-2.png
  6. BIN
      src/assets/images/icon/cleanup-new.png
  7. BIN
      src/assets/images/icon/new-home-hot.png
  8. BIN
      src/assets/images/icon/new-home-new.png
  9. BIN
      src/assets/images/icon/new-home.png
  10. BIN
      src/assets/images/icon/wash-hot.png
  11. BIN
      src/assets/images/icon/wash-new.png
  12. BIN
      src/assets/images/icon/wash.png
  13. BIN
      src/assets/images/icon/wiping-hot.png
  14. BIN
      src/assets/images/icon/wiping-new.png
  15. BIN
      src/assets/images/icon/wiping.png
  16. 3
      src/assets/styles/style.css
  17. 12
      src/models/goods-model.js
  18. 2
      src/router/index.js
  19. 351
      src/view/goods-classify.vue
  20. 75
      src/view/home.vue

9
src/api/goods.js

@ -0,0 +1,9 @@
export default {
//获取商品分类
getGoods: {
method: 'GET',
url: '/mall/web/goodsCombinations',
}
}

BIN
src/assets/images/icon/cleanup-2.png

Before After
Width: 39  |  Height: 39  |  Size: 1.2 KiB

BIN
src/assets/images/icon/cleanup-hot-2.png

Before After
Width: 39  |  Height: 39  |  Size: 1.3 KiB

BIN
src/assets/images/icon/cleanup-hot.png

Before After
Width: 39  |  Height: 39  |  Size: 1.0 KiB

BIN
src/assets/images/icon/cleanup-new-2.png

Before After
Width: 39  |  Height: 39  |  Size: 1.4 KiB

BIN
src/assets/images/icon/cleanup-new.png

Before After
Width: 39  |  Height: 39  |  Size: 1.1 KiB

BIN
src/assets/images/icon/new-home-hot.png

Before After
Width: 39  |  Height: 39  |  Size: 886 B

BIN
src/assets/images/icon/new-home-new.png

Before After
Width: 39  |  Height: 39  |  Size: 921 B

BIN
src/assets/images/icon/new-home.png

Before After
Width: 39  |  Height: 39  |  Size: 712 B

BIN
src/assets/images/icon/wash-hot.png

Before After
Width: 39  |  Height: 39  |  Size: 938 B

BIN
src/assets/images/icon/wash-new.png

Before After
Width: 39  |  Height: 39  |  Size: 1017 B

BIN
src/assets/images/icon/wash.png

Before After
Width: 39  |  Height: 39  |  Size: 776 B

BIN
src/assets/images/icon/wiping-hot.png

Before After
Width: 39  |  Height: 39  |  Size: 640 B

BIN
src/assets/images/icon/wiping-new.png

Before After
Width: 39  |  Height: 39  |  Size: 708 B

BIN
src/assets/images/icon/wiping.png

Before After
Width: 39  |  Height: 39  |  Size: 474 B

3
src/assets/styles/style.css

@ -328,6 +328,9 @@ html,body {
/* autoprefixer: off*/
/* autoprefixer: on*/
}
.f-inb {
display: inline-block;
}
@media (-webkit-min-device-pixel-ratio: 2) {
.f-bb-gray::after {
height: 1px;

12
src/models/goods-model.js

@ -0,0 +1,12 @@
import utilsModel from './utils-model'
import goodsApi from '../api/goods'
export default {
getGoods : (params) =>
utilsModel
.config(goodsApi.getGoods)
.request({
params : params,
})
}

2
src/router/index.js

@ -45,7 +45,7 @@ let router = new Router({
component: serviceEvaluationStatus
},
{
path: '/goods-classify',
path: '/goods-classify/:no/:id/:c_no',
name: '商品分类',
component: goodsClassify
},

351
src/view/goods-classify.vue

@ -1,129 +1,199 @@
<template>
<div class="container goods">
<div class="top f-bb-gray">
<img src="../assets/images/icon/arrow-left.png"/>商品分类
<img src="../assets/images/icon/arrow-left.png" v-on:click="goBack"/>商品分类
</div>
<div class="content">
<div class="content cate-content">
<div class="left">
<ul>
<li class="on">
<span>
深度保洁
<img src="../assets/images/icon/hot.png" class="i-hot" />
</span>
</li>
<li>
<span>
家电清洗
<img src="../assets/images/icon/hot.png" class="i-hot" />
</span>
</li>
<li>
<span>
日常保洁
<img src="../assets/images/icon/new.png" class="i-new" />
</span>
</li>
<li>
<span>
新居开荒
<img src="../assets/images/icon/hot.png" class="i-hot" />
</span>
</li>
<li>
<span>
精细擦窗
<img src="../assets/images/icon/hot.png" class="i-hot" />
</span>
<li v-if="goodsList.length != 0" v-for="(item,index) in goodsList" :key="index" :class="{ on : isActive === index}" @click="jump(index)">
<a href="javascript:void(0)">
{{item.combinationName}}
<img src="../assets/images/icon/hot.png" class="i-hot" v-if="item.label == '2'" />
<img src="../assets/images/icon/new.png" class="i-new" v-if="item.label == '1'" />
</a>
</li>
</ul>
</div>
<div class="right">
<p class="title">深度清洁</p>
<div class="f-relative f-all-1px">
<div class="item f-flex">
<img src="../assets/images/icon/wx-icon.png" class="thumb"/>
<div class="info f-flex">
<div>
<p class="title f-ellipsis-1">高端保洁铂金月卡</p>
<p class="rule">4×4小时全屋高端保洁</p>
<span class="full">新用户立减300元</span>
</div>
<div class="f-flex">
<p class="price">
<span><span class="money"></span>799</span>
</p>
<p class="cost">999</p>
</div>
</div>
</div>
</div>
<div class="f-relative f-all-1px">
<div class="item f-flex">
<img src="../assets/images/icon/wx-icon.png" class="thumb"/>
<div class="info f-flex">
<div>
<p class="title f-ellipsis-1">高端保洁铂金月卡</p>
<p class="rule">4×4小时全屋高端保洁</p>
<span class="full">新用户立减300元</span>
</div>
<div class="f-flex">
<p class="price">
<span><span class="money"></span>799</span>
</p>
<p class="cost">999</p>
</div>
</div>
</div>
</div>
<p class="title">家电清洁</p>
<div class="f-relative f-all-1px">
<div class="item f-flex">
<img src="../assets/images/icon/wx-icon.png" class="thumb"/>
<div class="info f-flex">
<div>
<p class="title f-ellipsis-1">高端保洁铂金月卡</p>
<p class="rule">4×4小时全屋高端保洁</p>
<span class="full">新用户立减300元</span>
</div>
<div class="f-flex">
<p class="price">
<span><span class="money"></span>799</span>
</p>
<p class="cost">999</p>
</div>
</div>
</div>
</div>
<div class="f-relative f-all-1px">
<div class="item f-flex">
<img src="../assets/images/icon/wx-icon.png" class="thumb"/>
<div class="info f-flex">
<div>
<p class="title f-ellipsis-1">高端保洁铂金月卡</p>
<p class="rule">4×4小时全屋高端保洁</p>
<span class="full">新用户立减300元</span>
</div>
<div class="f-flex">
<p class="price">
<span><span class="money"></span>799</span>
</p>
<p class="cost">999</p>
</div>
</div>
<div class="cate-list right" :scrollTop.prop="scrollTop">
<div v-if="goodsList.length != 0" v-for="(item,index) in goodsList" :key="index" class="cate-item">
<p class="title" :id="'anchor-'+index">{{item.combinationName}}</p>
<div class="f-relative f-all-1px" v-for="(goods,k) in item.goodsList" :key="k">
<div class="item f-flex">
<a :href="'/mall/web/vgoods/detail/' + goods.goodsNo">
<img :src=" imghost + goods.bannerImgs" class="thumb"/>
</a>
<div class="info f-flex">
<div>
<p class="title f-ellipsis-1">{{goods.name}}</p>
<p class="rule">{{goods.shortDesc}}</p>
<div class="full" v-if="toJSON(goods.smallLabel)"><i>{{toJSON(goods.smallLabel)}}</i></div>
</div>
<div class="f-flex">
<p class="price">
<span><span class="money"></span>{{goods.price/100}}</span>
</p>
<p class="cost" v-if="goods.originalPrice">{{goods.originalPrice/100}}</p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Loading -->
<div class="Loading-box">
<loading v-model="showLoading" text="loading"></loading>
</div>
</div>
</template>
<script>
export default {
name: 'goodsClassify',
data() {
return {}
}
}
import goodsApi from "../models/goods-model.js";
import { Alert,Toast,Popup,Loading } from "vux";
export default {
data() {
return {
no: 0,
id: 0,
c_no: 0,
showLoading: true,
goodsList: [],
imghost: "http://medou.oss-cn-shenzhen.aliyuncs.com/",
isActive: '',
container: document.querySelectorAll('.cate-list')
}
},
components: {
Toast,
Popup,
Loading
},
methods:{
//
goBack() {
history.go(-1)
},
//
getParams () {
this.no = this.$route.params.no
this.id = this.$route.params.id
this.c_no = this.$route.params.c_no
this.getGoodsList()
},
//
getGoodsList (){
let that = this
that.showLoading = true
var params = {
"merchantNo": this.no,
"districtId": this.id
}
goodsApi.getGoods(params).then(res => {
that.showLoading = false
if ( res.code == 0 ){
this.goodsList = res.data || []
} else {
this.$vux.toast.text(res.msg,"middle");
}
});
this.$nextTick(function(){
for (let i = 0; i < this.goodsList.length; i++) {
if(this.goodsList[i].combinationNo == this.c_no) {
this.jump(i)
}
}
})
},
jump(index){
const cateItem = document.querySelectorAll('.cate-item');
let total = cateItem[index].offsetTop;
let distance = this.container.scrollTop // (this.container便.cate-list,便)
let step = total / 20;
this.isActive = index; //
const _this = this;
if (total > distance) {
smoothDown()
} else {
let newTotal = distance - total
step = newTotal / 50
smoothUp()
}
function smoothDown () {
if (distance < total) {
distance += step
_this.scrollTop = distance - 60
setTimeout(smoothDown, 10);
} else {
_this.scrollTop = total - 60
}
}
function smoothUp () {
if (distance > total) {
distance -= step
_this.scrollTop = distance - 60
setTimeout(smoothUp, 10)
} else {
_this.scrollTop = total - 60
}
}
},
toJSON (data){
if (data){
return JSON.parse(data)[0].labelText
}else {
return ;
}
},
onScroll () {
var _this = this;
_this.itemVal.forEach(function(obj, i){
_this.scrollTop = _this.container.scrollTop;
if(_this.scrollTop >= obj.top && _this.scrollTop < (obj.top + obj.height-10)){
// scrollTop
_this.isActive = obj.index;
}
})
},
currentStick () {
const {dishId} = this.$route.query;
const cateContent = document.querySelectorAll('.cate-content');
const _this = this;
cateContent.forEach(function(v, i){
if(v.id == dishId){
_this.scrollTop = v.offsetTop;
}
})
},
scroll () {
// scroll
const _this = this;
setTimeout(function(){
_this.currentStick();
const rightItem = document.querySelectorAll('.cate-item');
const catelist = document.querySelectorAll('.cate-list')[0];
var length = rightItem.length;
var height = rightItem[length-1].offsetHeight;
var scrollHeight = document.querySelectorAll('.cate-menu-wrapper')[0].offsetHeight;
// ()
if (height < scrollHeight) {
rightItem[length-1].style.height = scrollHeight+'px';
}
var arr =[];
rightItem.forEach(function(v, i){
arr.push({top: v.offsetTop, height: v.offsetHeight, index: i});
})
_this.itemVal = arr;
const cateList = document.querySelectorAll('.cate-list')[0];
cateList.addEventListener('scroll', _this.onScroll);
_this.container = cateList;
}, 500)
}
},
mounted() {
this.getParams()
this.scroll()
},
}
</script>
<style lang="scss" scoped>
.goods {
@ -161,30 +231,29 @@ export default {
line-height: 1.1rem;
text-align: center;
font-size: 0.28rem;
color: #888;
a {
color: #888;
position: relative;
img {
position: absolute;
font-size: 10px;
top: -0.1rem;
right: -0.2rem;
}
.i-hot {
width: 0.24rem;
height: 0.1rem;
}
.i-new {
width: 0.24rem;
height: 0.08rem;
}
}
}
.on {
background-color: #fff;
color: #333;
}
span {
position: relative;
img {
position: absolute;
font-size: 10px;
top: -0.1rem;
right: -0.2rem;
}
.i-hot {
width: 0.24rem;
height: 0.1rem;
}
.i-new {
width: 0.24rem;
height: 0.08rem;
}
}
}
}
.right {
@ -229,11 +298,13 @@ export default {
line-height: 1;
}
.full {
font-size: 0.18rem;
background-color: #FFF2E5;
color: #F4A353;
padding: 0 0.1rem;
line-height: 1;
height: 0.3rem;
font-size:0.2rem;
color:rgba(244,163,83,1);
i {
background:rgba(255,242,229,1);
padding: 1px 3px;
}
}
.price {
.money {
@ -253,4 +324,16 @@ export default {
}
}
}
.Loading-box {
.weui-toast {
width: 100%;
min-height: 100% !important;
overflow: hidden;
top: 0;
}
.weui-icon_toast.weui-loading {
margin-top: 75%;
}
}
</style>

75
src/view/home.vue

@ -17,26 +17,14 @@
<div class="swiper-pagination"></div>
</div>
<!-- TODO: 对应换hot new 图标 -->
<div class="service f-flex">
<div class="item">
<img src="../assets/images/icon/cleanup-2.png"/>
<p>深度保洁</p>
</div>
<div class="item">
<img src="../assets/images/icon/wash-new.png"/>
<p>家电清洗</p>
</div>
<div class="item">
<img src="../assets/images/icon/cleanup.png"/>
<p>日常保洁</p>
</div>
<div class="item">
<img src="../assets/images/icon/new-home.png"/>
<p>新居开荒</p>
</div>
<div class="item">
<img src="../assets/images/icon/wiping-hot.png"/>
<p>精细擦窗</p>
<div class="service f-flex" v-if="iconList.length != 0">
<div class="item" v-for="(item,index) in iconList" :key="index" v-on:click="goods(item.combinationNo)">
<a href="javascript:void(0)" class="f-relative f-inb">
<img :src="item.icon" class="icon" />
<img src="../assets/images/icon/hot.png" class="hot" v-if="item.label == '2'" />
<img src="../assets/images/icon/new.png" class="new" v-if="item.label == '1'"/>
</a>
<p>{{item.combinationName}}</p>
</div>
</div>
<div class="coupon" v-if="promotionImgList.imgUrl">
@ -45,27 +33,27 @@
</div>
<!-- TODO: 三种样式 -->
<!-- one -->
<div class="recommend f-flex">
<div class="recommend f-flex" v-if="activityImgList.length == 3">
<div class="left">
<img src="../assets/images/coupon-bg@1x.png">
<a :href="activityImgList[0].linkUrl"><img :src="activityImgList[0].imgUrl"></a>
</div>
<div class="right">
<img src="../assets/images/sunrise.png" class="gap">
<img src="../assets/images/sunshine.png">
<a :href="activityImgList[1].linkUrl"><img :src="activityImgList[1].imgUrl" class="gap"></a>
<a :href="activityImgList[2].linkUrl"><img :src="activityImgList[2].imgUrl"></a>
</div>
</div>
<!-- two -->
<div class="recommend f-flex">
<div class="recommend f-flex" v-if="activityImgList.length == 2">
<div class="left">
<img src="../assets/images/coupon-bg@1x.png">
<a :href="activityImgList[0].linkUrl"><img :src="activityImgList[0].imgUrl"></a>
</div>
<div class="right">
<img src="../assets/images/sunrise.png" class="two">
<a :href="activityImgList[1].linkUrl"><img :src="activityImgList[1].imgUrl" class="two"></a>
</div>
</div>
<!-- three -->
<div class="recommend f-flex">
<img src="../assets/images/sunrise.png" class="three">
<div class="recommend f-flex" v-if="activityImgList.length == 1">
<a :href="activityImgList[0].linkUrl"><img :src="activityImgList[0].imgUrl" class="three"></a>
</div>
<div class="new-card" :class="{'new-card-first': index == 0}" v-for="(item,index) in goodsList" :key="index">
<div class="new-card-top">
@ -116,8 +104,11 @@
<script>
import homeApi from "../models/home-model.js";
import configs from '../configs';
import { Alert, Toast,Popup,Picker,Loading } from "vux";
import routerFooter from "../components/nav-bottom";
var locationUrl = configs.locationUrl;
export default {
data() {
return {
@ -128,6 +119,8 @@
addressData: [],
addressValue: [],
bannerImgList:[], //
activityImgList: [], // 广
iconList: [], //
promotionImgList: {}, //
goodsList:[],
imghost: "http://medou.oss-cn-shenzhen.aliyuncs.com/",
@ -202,6 +195,8 @@
that.showLoading = false
if ( res.code == 0 ){
this.bannerImgList = res.response.bannerImgList
this.activityImgList = res.response.activityImgList || []
this.iconList = res.response.iconList || []
this.promotionImgList = res.response.promotionImgList[0] || {};
let goodsList = res.response.goodsList
let arr = [];
@ -275,7 +270,11 @@
ShareWenXin (){
var merchantNo = this.merchantNo
this.wxShare({"merchantNo":merchantNo,"source":0,"url":encodeURIComponent(location.href)})
}
},
//
goods(c_no) {
window.location.href = locationUrl + '/goods-classify/' + this.merchantNo + '/' + this.districtId + '/' + c_no;
},
},
mounted() {
//
@ -529,10 +528,24 @@
text-align: center;
font-size: 0;
flex: 1;
img {
.icon {
width: 0.78rem;
height: 0.78rem;
}
.hot {
position: absolute;
top: 0.05rem;
right: 0;
width: 0.24rem;
height: 0.1rem;
}
.new {
position: absolute;
top: 0.05rem;
right: 0;
width: 0.24rem;
height: 0.08rem;
}
p {
color: #666;
font-size: 0.21rem;

Loading…
Cancel
Save