齐采药WEB端项目
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

1612 lines
38 KiB

<template>
<!-- 秒杀商品详情 -->
<div class="goods-detail">
<div class="wrapper_1200 acea-row">
<div class="goods-main">
<div class="acea-row">
<div class="carousel">
<img :src="storeInfo.images[slideIndex]" class="preview" />
<client-only>
<div v-swiper:carousel="swiperOption">
<div class="swiper-wrapper">
<div
v-for="(item, index) in storeInfo.images"
:key="index"
:class="{ on: slideIndex === index }"
class="swiper-slide"
@mouseover="swiperMouseover(index)"
>
<img :src="item" />
</div>
</div>
<div class="swiper-button-prev swiper-button-white"></div>
<div class="swiper-button-next swiper-button-white"></div>
</div>
</client-only>
<div class="acea-row row-middle">
<div class="btn" style="width: 60px" @click="collect">
<span
:class="[
'iconfont',
storeInfo.userCollect ? 'icon-yishoucang' : 'icon-shoucang2',
]"
></span>
{{ storeInfo.userCollect ? "已收藏" : "收藏" }}
</div>
<div class="btn" @click="chatShow">
<span class="iconfont icon-kefu2"></span>联系客服
</div>
</div>
</div>
<div class="text-wrapper">
<div class="title">
<span
class="labelN"
v-if="storeInfo.brand_name && storeInfo.brand_name.trim()"
>{{ storeInfo.brand_name }}</span
>
{{ storeInfo.title }}
</div>
<div class="acea-row row-middle money-wrapper">
<div class="money-wrap">
<del>
原价:¥{{
attrValueSelected ? attrValueSelected.ot_price : storeInfo.ot_price
}}
</del>
<div class="acea-row row-middle">
<div class="price">
<span>
{{ attrValueSelected ? attrValueSelected.price : storeInfo.price }}
</span>
</div>
</div>
</div>
<div class="timer-wrapper">
<div class="acea-row row-between-wrapper">
距离结束还剩
<countDown
:is-day="false"
:tip-text="' '"
:day-text="datatime"
:hour-text="' : '"
:minute-text="' : '"
:second-text="' '"
:datatime="datatime"
></countDown>
</div>
<div class="acea-row row-between-wrapper progress-group">
<div class="progress">
<span :style="{ width: `${storeInfo.percent}%` }"></span>
</div>
已抢{{ storeInfo.percent }}%
</div>
</div>
<div class="acea-row row-column row-center-wrapper sales">
<div class="num">{{ storeInfo.total ? storeInfo.total : 0 }}</div>
<div>累计销量</div>
</div>
</div>
<div
v-for="(item, index) in productAttr"
:key="index"
class="acea-row size-wrapper"
>
<div class="label">{{ item.attr_name }}</div>
<div class="acea-row list">
<label v-for="(itm, idx) in item.attr_values" :key="idx" class="item">
<input
v-model="attrSelected[index]"
type="radio"
:name="index"
:value="itm"
hidden
/>
<div class="acea-row cont">
<div class="acea-row row-middle name">{{ itm }}</div>
<div class="iconfont icon-xuanzhong4"></div>
</div>
</label>
</div>
</div>
<div class="number-wrapper acea-row">
<div class="label">数量</div>
<div class="counter-wrap">
<div class="counter">
<button
class="iconfont icon-shangpinshuliang-jian"
:disabled="count === 1 || !stock"
@click="minus"
></button>
<input v-model="count" @input="inputNum" />
<button
class="iconfont icon-shangpinshuliang-jia"
:disabled="count === stock || !stock"
@click="plus"
></button>
</div>
<span>(限量 {{ stock }}{{ storeInfo.unit_name }})</span>
</div>
</div>
<div class="button-wrapper">
<button
class="btn"
:disabled="
!stock ||
$route.query.status == 0 ||
buyDisabled ||
$route.query.status == 2
"
@click="buy(1, $event)"
>
{{
$route.query.status == 0
? "已结束"
: $route.query.status == 2
? "未开始"
: "立即购买"
}}
</button>
</div>
</div>
</div>
<div class="detail-wrapper">
<div class="detail-hd acea-row">
<div class="tab acea-row">
<div
class="item acea-row row-center-wrapper"
:class="{ on: tabIndex === 0 }"
@click="tab(0)"
>
产品详情
</div>
<div
class="item acea-row row-center-wrapper"
:class="{ on: tabIndex === 1 }"
@click="tab(1)"
>
累计评论({{ replyInfo.sum_count }})
</div>
</div>
<div
class="acea-row row-center-wrapper qrcode-button"
@mouseover="qrcodeShow = true"
@mouseout="qrcodeShow = false"
>
<span class="iconfont icon-saoma"></span>手机购买
<span
:class="['iconfont', qrcodeShow ? 'icon-xiangshang1' : 'icon-xiangxia2']"
></span>
<div class="qrcode">
<client-only>
<vue-qr
v-if="phoneBuy.phone_buy == 1"
class="bicode"
:text="codeUrl"
:size="320"
></vue-qr>
<img v-else :src="codeUrl" />
</client-only>
</div>
</div>
</div>
<div class="detail-bd">
<div v-show="tabIndex === 0">
<div
v-if="storeInfo.description"
class="detail-html"
v-html="storeInfo.description"
></div>
<div v-else class="nothing">
<img src="@/assets/images/noDetail.png" />
<div>暂无商品详情</div>
</div>
</div>
<div v-show="tabIndex === 1" class="comment">
<div class="comment-hd">
<div class="acea-row row-between-wrapper">
<div class="rate">
<span>{{ replyInfo.reply_chance }}%</span>
<span>满意</span>
</div>
<div class="acea-row row-middle score">
评分
<div class="cont">
<span
v-for="(v, i) in 5"
:key="i"
:class="{ on: i + 1 <= replyInfo.reply_star }"
class="iconfont icon-pingjia"
></span>
</div>
</div>
</div>
<div class="menu">
<div
class="item"
:class="{ on: reply.type === 0 }"
@click="replyTypeChange(0, replyInfo.sum_count)"
>
全部({{ replyInfo.sum_count }})
</div>
<div
class="item"
:class="{ on: reply.type === 1 }"
@click="replyTypeChange(1, replyInfo.good_count)"
>
好评({{ replyInfo.good_count }})
</div>
<div
class="item"
:class="{ on: reply.type === 2 }"
@click="replyTypeChange(2, replyInfo.in_count)"
>
中评({{ replyInfo.in_count }})
</div>
<div
class="item"
:class="{ on: reply.type === 3 }"
@click="replyTypeChange(3, replyInfo.poor_count)"
>
差评({{ replyInfo.poor_count }})
</div>
</div>
</div>
<div class="comment-bd">
<template v-if="replyList.length">
<div v-for="item in replyList" :key="item.id" class="item">
<div class="acea-row row-middle item-hd">
<div class="image">
<img :src="item.avatar" />
</div>
<div class="text">
<div class="acea-row row-middle name">
{{ item.nickname }}
<div class="star">
<span
v-for="(v, i) in 5"
:key="i"
class="iconfont icon-pingjia"
:class="{ on: i + 1 <= item.star }"
></span>
</div>
</div>
<div>{{ item.add_time }}</div>
</div>
</div>
<div class="item-bd">
<div>{{ item.comment }}</div>
<div class="image-wrapper">
<div v-for="(itm, idx) in item.pics" :key="idx" class="image">
<el-image
style="width: 54px; height: 54px"
:src="itm"
:preview-src-list="item.pics"
></el-image>
</div>
</div>
<div v-if="item.merchant_reply_content" class="reply">
<div class="item">
<span>店小二:</span>
{{ item.merchant_reply_content }}
</div>
</div>
</div>
</div>
</template>
<img v-else-if="!reply.loading" src="@/assets/images/noEvaluate.png" />
</div>
<div v-if="replyList.length" class="acea-row row-right">
<el-pagination
layout="prev, pager, next"
prev-text="上一页"
next-text="下一页"
:page-size="reply.limit"
:total="replyInfo.sum_count"
@current-change="getReply"
@prev-click="getReply"
@next-click="getReply"
></el-pagination>
</div>
</div>
</div>
</div>
</div>
<div v-if="goodsList && goodsList.length" class="recom-section">
<div class="title">
<span>优品推荐</span>
</div>
<div class="list">
<nuxt-link
v-for="item in goodsList"
:key="item.id"
:to="`/goods_detail/${item.id}`"
class="item"
>
<div class="image">
<img :src="item.image" />
</div>
<div class="text">
<div class="name">{{ item.store_name }}</div>
<div class="acea-row row-between-wrapper">
<div class="money">
<span>{{ item.price }}</span>
</div>
<div class="sales">销量 {{ item.sales }}</div>
</div>
</div>
</nuxt-link>
</div>
</div>
</div>
<chat-room
v-show="chatOptions.show"
:chat-options="chatOptions"
@chat-close="chatClose"
@socket-open="socketOpen"
@socket-error="socketError"
></chat-room>
</div>
</template>
<script>
import countDown from "@/components/countDown";
import ChatRoom from "@/components/ChatRoom";
import appChat from "@/mixins/appChat";
export default {
mixins: [appChat],
components: { countDown, ChatRoom },
auth: false,
data() {
return {
swiperOption: {
navigation: {
nextEl: ".swiper-button-next",
prevEl: ".swiper-button-prev",
},
slidesPerView: "auto",
spaceBetween: 10,
slidesOffsetBefore: 25,
slidesOffsetAfter: 25,
observer: true,
observeParents: true,
},
slideIndex: 0,
tabIndex: 0,
reply: {
type: 0,
page: 1,
limit: 40,
finished: false,
count: 10,
},
coupon: {
page: 1,
limit: 3,
finished: false,
},
attrSelected: [],
attrValueSelected: null,
count: 1,
stock: 1,
unique: "",
qrcodeShow: false,
codeUrl: "",
buyDisabled: false,
};
},
computed: {
makeCouponList() {
return this.couponList.map((value) => {
switch (value.type) {
case 0:
value.type = "通用券";
break;
case 1:
value.type = "品类券";
break;
case 2:
value.type = "商品券";
break;
}
return value;
});
},
},
watch: {
productValue: {
immediate: true,
handler(attr) {
let keyArr = [];
for (const key in attr) {
if (attr.hasOwnProperty(key)) {
keyArr.push(key);
}
}
let first = keyArr[0];
let arr = first.split(",");
this.attrSelected = arr;
},
},
attrSelected: {
immediate: true,
handler(attr) {
if (attr.length) {
let name = attr.join(),
value = this.productValue[name];
if (value) {
this.buyDisabled = false;
this.attrValueSelected = value;
this.stock = value.quota;
this.unique = value.unique;
} else {
this.buyDisabled = true;
this.stock = 0;
}
} else {
this.stock = this.storeInfo.stock;
}
},
},
},
async asyncData({ app, query }) {
const [detail, config, list, goodsList, phoneBuy] = await Promise.all([
app.$axios.get(`/seckill/detail/${query.id}`),
app.$axios.get(`/reply/config/${query.productId}`),
app.$axios.get(`/reply/list/${query.productId}`, {
params: {
page: 1,
limit: 20,
type: 0,
},
}),
app.$axios.get("/pc/get_good_product"),
app.$axios.get("/pc/get_product_phone_buy"),
]);
return {
productAttr: detail.data.productAttr,
productValue: detail.data.productValue,
storeInfo: detail.data.storeInfo,
goodsList: goodsList.data.list,
replyInfo: config.data,
replyList: list.data,
datatime: Number(query.time),
dataStatus: query.status,
phoneBuy: phoneBuy.data,
};
},
fetch({ store }) {
store.commit("isHeader", true);
store.commit("isFooter", true);
},
head() {
return {
title: this.storeInfo.title + "-" + this.$store.state.titleCon,
};
},
created() {
switch (this.phoneBuy.phone_buy) {
case "1":
this.codeUrl = `${this.phoneBuy.sit_url}/pages/activity/goods_seckill_details/index?id=${this.$route.query.id}&time=${this.datatime}&status=${this.dataStatus}`;
break;
case "2":
this.getAppletCodeUrl();
break;
}
},
mounted() {
this.$nextTick(() => {
document.body.setAttribute("style", "background:#ffffff");
// this.carousel.on("click", () => {
// if (typeof this.carousel.clickedIndex === "number") {
// this.slideIndex = this.carousel.clickedIndex;
// }
// });
});
},
beforeDestroy() {
document.body.removeAttribute("style");
},
methods: {
inputNum() {
this.count = parseInt(this.count) >= this.stock ? this.stock : this.count;
this.count = parseInt(this.count) <= 1 ? 1 : this.count;
},
swiperMouseover(index) {
this.slideIndex = index;
},
// 获取商品小程序地址
getAppletCodeUrl() {
this.$axios
.get(`/pc/get_product_code/${this.$route.query.id}`)
.then((res) => {
this.codeUrl = res.data.routineCode;
})
.catch((err) => {
this.$message.error(err);
});
},
callPaginate(num) {
this.reply.page = num;
this.getReply();
},
tab(type) {
this.tabIndex = type;
},
replyTypeChange(type, count) {
this.reply.type = type;
this.reply.count = count;
this.reply.page = 1;
this.replyList = [];
this.$axios
.get(`/reply/list/${this.storeInfo.product_id}`, {
params: {
page: this.reply.page,
limit: this.reply.limit,
type: type,
},
})
.then((res) => {
this.replyList = this.replyList.concat(res.data);
})
.catch((err) => {
this.$message.error(err);
});
},
// 优惠券列表
getCouponList() {
this.$axios
.get("/coupons", {
params: {
product_id: this.$route.query.id,
page: ++this.coupon.page,
limit: this.coupon.limit,
},
})
.then((res) => {
let data = res.data;
this.couponList = this.couponList.concat(data);
this.coupon.finished = data.length < this.coupon.limit;
})
.catch((err) => {
this.$message.error(err);
});
},
// 加入购物车 | 立即购买
buy(type, event) {
if (typeof this.count === "string") {
if (this.count.trim() === "") {
return this.$message.error("请输入您要购买的数量");
}
}
let btn = event.target;
btn.disabled = true;
this.$axios
.post("/cart/add", {
productId: this.storeInfo.product_id,
secKillId: this.$route.query.id,
cartNum: this.count,
new: type,
uniqueId: this.unique,
})
.then((res) => {
btn.disabled = false;
if (type) {
this.$router.push({
path: `/order_confirm?new=1&cartId=${res.data.cartId}`,
});
} else {
this.$store.commit("cartNum", this.count + this.$store.state.cartnumber);
this.$message.success("加入购物车成功");
}
})
.catch((err) => {
btn.disabled = false;
this.$message.error(err);
});
},
minus() {
this.count--;
},
plus() {
this.count++;
},
// 领取优惠券
getCoupon(id) {
this.$axios
.post("/coupon/receive", {
couponId: id,
})
.then((res) => {
this.$message.success("领取优惠券成功");
let index = this.couponList.findIndex((value) => {
return value.id === id;
});
if (index !== -1) {
this.couponList[index].is_use = true;
}
})
.catch((err) => {
this.$message.error(err);
});
},
// 获取评论
getReply(num) {
this.$axios
.get(`/reply/list/${this.storeInfo.product_id}`, {
params: {
page: num,
limit: this.reply.limit,
type: this.reply.type,
},
})
.then((res) => {
this.replyList = res.data;
})
.catch((err) => {
this.$message.error(err);
});
},
// 收藏 | 取消收藏
collect() {
if (this.storeInfo.userCollect) {
this.$axios
.post("/collect/del", {
id: this.storeInfo.product_id,
category: "product",
})
.then((res) => {
this.$message.success("取消收藏成功");
})
.catch((err) => {
this.$message.error(err);
});
} else {
this.$axios
.post("/collect/add", {
id: this.storeInfo.product_id,
category: "product",
})
.then((res) => {
this.$message.success("收藏成功");
})
.catch((err) => {
this.$message.error(err);
});
}
this.storeInfo.userCollect = !this.storeInfo.userCollect;
},
},
};
</script>
<style lang="scss" scoped>
.goods-detail {
padding-top: 40px;
border-top: 1px solid #efefef;
> div {
> div {
~ div {
margin-left: 40px;
}
}
}
.goods-main {
flex: 1;
min-width: 0;
}
.carousel {
width: 380px;
.preview {
display: block;
width: 380px;
height: 380px;
}
.swiper-container {
margin-top: 10px;
margin-bottom: 20px;
.swiper-button-prev,
.swiper-button-next {
top: 0;
width: 25px;
height: 100%;
margin-top: 0;
background-color: rgba(0, 0, 0, 0.3);
background-size: 12px 22px;
}
.swiper-button-prev {
left: 0;
}
.swiper-button-next {
right: 0;
}
.swiper-slide {
width: 70px;
height: 70px;
border: 2px solid transparent;
overflow: hidden;
cursor: pointer;
&.on {
border-color: #e93323;
}
img {
display: block;
width: 70px;
height: 70px;
}
}
}
.btn {
margin-right: 30px;
font-size: 12px;
color: #4b4b4b;
cursor: pointer;
}
.iconfont {
margin-right: 6px;
font-size: 14px;
color: #e93323;
}
}
.text-wrapper {
flex: 1;
min-width: 0;
margin-left: 40px;
.title {
font-size: 20px;
line-height: 26px;
color: #333333;
.labelN {
font-size: 15px;
color: #e93323;
border: 1px solid #e93323;
border-radius: 3px;
padding: 2px 4px;
margin-right: 8px;
}
}
.money-wrapper {
height: 78px;
margin-top: 18px;
background: url("~assets/images/money-back.png") center/cover no-repeat;
color: #ffffff;
.money-wrap {
flex: 1;
min-width: 0;
padding-left: 32px;
}
del {
margin-bottom: 10px;
font-size: 14px;
}
.price {
font-size: 22px;
span {
font-weight: bold;
font-size: 30px;
}
}
.vip {
width: 100px;
height: 25px;
border-radius: 2px;
margin-left: 14px;
background: linear-gradient(205deg, #fdcaa4 0%, #fce3c3 100%);
overflow: hidden;
font-size: 12px;
color: #0f0f0f;
.iconfont {
width: 32px;
background: #0f0f0f;
font-size: 8px;
color: #fcdcbb;
}
.money {
flex: 1;
min-width: 0;
span {
font-size: 14px;
}
}
}
.sales {
position: relative;
height: 100%;
padding-right: 20px;
padding-left: 20px;
font-size: 12px;
&::before {
content: "";
position: absolute;
top: 14px;
bottom: 12px;
left: 0;
width: 1px;
border-left: 1px solid rgba(255, 255, 255, 0.24);
}
.num {
margin-bottom: 3px;
font-weight: bold;
font-size: 18px;
}
}
.timer-wrapper {
width: 180px;
margin-right: 15px;
font-size: 12px;
color: #ffffff;
/deep/.styleAll {
width: 30px;
height: 24px;
margin-right: 3px;
margin-left: 3px;
background-color: #ffffff;
font-size: 16px;
line-height: 24px;
text-align: center;
color: #e93323;
&:first-child {
margin-left: 0;
}
&:last-child {
margin-right: 0;
}
}
.progress-group {
margin-top: 10px;
}
.progress {
width: 120px;
height: 8px;
border: 1px solid #ffffff;
border-radius: 4px;
font-size: 0;
span {
display: inline-block;
width: 50%;
height: 100%;
border-radius: 4px;
background-color: #ffffff;
}
}
}
}
.coupon-wrapper {
background-color: #f7f7f7;
.coupon-bd {
padding-top: 18px;
padding-bottom: 18px;
font-size: 12px;
color: #5a5a5a;
.label {
width: 80px;
padding-left: 20px;
}
.list {
flex: 1;
min-width: 0;
padding-right: 24px;
}
.item {
margin-top: 11px;
&:first-child {
margin-top: 0;
}
}
.cell {
width: 165px;
height: 24px;
background: url("~assets/images/coupon-back.png") left top/100% 100% no-repeat;
font-size: 13px;
color: #ffffff;
}
.cell-left {
width: 65px;
}
.cell-right {
flex: 1;
min-width: 0;
color: #e93323;
}
.time {
flex: 1;
min-width: 0;
padding-right: 8px;
padding-left: 8px;
font-size: 12px;
color: #727272;
}
button {
border: none;
border-bottom: 1px solid #e93323;
background: none;
font-size: 12px;
color: #e93323;
&:disabled {
border-color: #c0c4cc;
color: #c0c4cc;
cursor: not-allowed;
}
}
}
.coupon-ft {
height: 36px;
padding-right: 24px;
background-color: #f2f2f2;
.button {
font-size: 12px;
color: #666666;
cursor: pointer;
.iconfont {
margin-left: 7px;
font-size: 10px;
color: #666666;
}
}
}
}
.size-wrapper {
margin-top: 30px;
.label {
width: 80px;
padding-left: 20px;
font-size: 12px;
color: #5a5a5a;
}
.list {
flex: 1;
min-width: 0;
}
.item {
margin-right: 12px;
margin-bottom: 12px;
box-sizing: border-box;
cursor: pointer;
.cont {
position: relative;
height: 36px;
border: 1px solid #d3d3d3;
}
&:hover {
.cont {
border-color: #e93323;
color: #e93323;
}
}
input:checked {
+ .cont {
border-color: #e93323;
color: #e93323;
.iconfont {
display: block;
}
}
}
}
.image {
width: 34px;
height: 34px;
}
img {
display: block;
width: 100%;
height: 100%;
}
.name {
padding-right: 20px;
padding-left: 20px;
}
.iconfont {
position: absolute;
right: -3px;
bottom: -4px;
display: none;
font-size: 22px;
}
}
.number-wrapper {
margin-top: 30px;
.label {
width: 80px;
padding-left: 20px;
font-size: 12px;
color: #5a5a5a;
}
.counter-wrap {
flex: 1;
min-width: 0;
span {
vertical-align: bottom;
font-size: 14px;
color: #5a5a5a;
}
}
.counter {
display: inline-block;
border: 1px solid #d3d3d3;
font-size: 0;
button {
width: 44px;
height: 36px;
border: none;
background: none;
outline: none;
font-weight: inherit;
font-size: 12px;
font-family: inherit;
color: #707070;
vertical-align: middle;
&:disabled {
color: #d0d0d0;
cursor: not-allowed;
}
}
input {
width: 64px;
height: 36px;
border: none;
border-right: 1px solid #d3d3d3;
border-left: 1px solid #d3d3d3;
outline: none;
font-weight: inherit;
font-size: 18px;
font-family: inherit;
text-align: center;
color: #5a5a5a;
vertical-align: middle;
}
}
}
.button-wrapper {
margin-top: 46px;
font-size: 0;
.btn {
width: 158px;
height: 50px;
border: 1px solid #e93323;
border-radius: 4px;
font-size: 16px;
color: #e93323;
~ .btn {
margin-left: 18px;
}
}
button {
background: none;
outline: none;
vertical-align: middle;
&:disabled {
border-color: #ddd;
color: #fff;
cursor: not-allowed;
background-color: #ddd;
}
&.cart {
background-color: #e93323;
color: #ffffff;
&:disabled {
border-color: #fab6b6;
background-color: #fab6b6;
}
}
~ button {
margin-left: 18px;
}
}
a {
display: inline-block;
background-color: #e93323;
vertical-align: middle;
line-height: 50px;
text-align: center;
&.btn {
color: #ffffff;
}
}
}
}
.detail-wrapper {
margin-top: 70px;
.detail-hd {
background-color: #f7f7f7;
.tab {
flex: 1;
min-width: 0;
}
.item {
position: relative;
height: 56px;
padding-right: 30px;
padding-left: 30px;
font-size: 14px;
color: #333333;
cursor: pointer;
&.on {
background: url("~assets/images/checked.png") center top/100% 7px no-repeat;
color: #e93323;
}
&::before {
content: "";
position: absolute;
top: 18px;
bottom: 18px;
left: 0;
width: 1px;
border-left: 1px solid #d9d9d9;
}
&:first-child::before {
display: none;
}
&:hover {
color: #e93323;
}
}
.qrcode-button {
position: relative;
width: 160px;
height: 56px;
background-color: #ededed;
font-size: 14px;
color: #333333;
cursor: pointer;
&:hover {
.qrcode {
display: block;
}
}
.icon-saoma {
margin-right: 6px;
font-size: 13px;
line-height: 1;
color: #000000;
}
.icon-xiangxia2,
.icon-xiangshang1 {
margin-left: 10px;
font-size: 10px;
line-height: 12px;
color: #d0d0d0;
}
.qrcode {
position: absolute;
top: 100%;
right: 0;
z-index: 99;
display: none;
width: 160px;
height: 160px;
}
img {
display: block;
width: 100%;
height: 100%;
}
}
}
.detail-bd {
.detail-html {
/deep/div {
width: 100% !important;
}
/deep/img {
display: block;
width: 100% !important;
}
}
}
.comment {
.comment-hd {
padding-top: 30px;
padding-bottom: 30px;
.rate {
font-size: 0;
span {
font-size: 14px;
color: #e93323;
~ span {
margin-left: 5px;
}
}
}
.score {
font-size: 14px;
color: #7e7e7e;
.cont {
margin-left: 8px;
}
.iconfont {
font-size: 12px;
color: #e6e6e6;
~ .iconfont {
margin-left: 5px;
}
&.on {
color: #e93323;
}
}
}
.menu {
margin-top: 20px;
font-size: 0;
.item {
display: inline-block;
width: 86px;
height: 34px;
border-radius: 2px;
background-color: #f7f7f7;
font-size: 14px;
line-height: 34px;
text-align: center;
color: #282828;
cursor: pointer;
&:hover {
color: #e93323;
}
&.on {
background-color: #e93323;
color: #ffffff;
}
~ .item {
margin-left: 14px;
}
}
}
}
.comment-bd {
> img {
width: 200px;
margin: 50px auto;
}
.item {
padding-top: 20px;
padding-bottom: 20px;
.item-hd {
.image {
width: 40px;
height: 40px;
border-radius: 50%;
overflow: hidden;
}
img {
display: block;
width: 100%;
height: 100%;
}
.text {
flex: 1;
margin-left: 12px;
font-size: 14px;
color: #868686;
}
.name {
margin-bottom: 4px;
font-size: 16px;
color: #282828;
}
.star {
margin-left: 12px;
font-size: 0;
}
.iconfont {
font-size: 12px;
color: #e6e6e6;
&.on {
color: #e93323;
}
~ .iconfont {
margin-left: 5px;
}
}
}
.item-bd {
padding-bottom: 20px;
border-bottom: 1px solid #e3e3e3;
margin-left: 52px;
font-size: 14px;
color: #282828;
> div {
margin-top: 15px;
}
.image-wrapper {
font-size: 0;
}
.image {
display: inline-block;
width: 54px;
height: 54px;
~ .image {
margin-left: 8px;
}
img {
display: block;
width: 100%;
height: 100%;
}
}
.reply {
background-color: #f7f7f7;
.item {
padding: 7px 12px;
font-size: 14px;
color: #282828;
span {
color: #e93323;
}
}
}
}
}
}
}
}
.recom-section {
align-self: flex-start;
min-width: 210px;
padding-right: 20px;
padding-left: 20px;
border: 1px solid #efefef;
border-radius: 4px;
.title {
height: 60px;
font-size: 16px;
line-height: 60px;
text-align: center;
color: #5a5a5a;
span {
position: relative;
&::before {
content: "";
position: absolute;
top: 50%;
right: 100%;
margin-right: 18px;
width: 35px;
height: 1px;
border-top: 1px solid #efefef;
transform: translateY(-50%);
}
&::after {
content: "";
position: absolute;
top: 50%;
left: 100%;
margin-left: 18px;
width: 35px;
height: 1px;
border-top: 1px solid #efefef;
transform: translateY(-50%);
}
}
}
.item {
display: block;
width: 170px;
margin-bottom: 20px;
.image {
width: 170px;
height: 170px;
img {
display: block;
width: 100%;
height: 100%;
}
}
.text {
.name {
margin-top: 10px;
margin-bottom: 10px;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
font-size: 13px;
color: #666666;
}
.money {
font-weight: bold;
font-size: 14px;
color: #e93323;
span {
font-size: 18px;
}
}
.sales {
font-size: 12px;
color: #888888;
}
}
}
}
.el-pagination {
padding: 0;
border: 1px solid #cccccc;
/deep/button {
width: 78px;
height: 38px;
padding: 0;
font-size: 15px;
color: #707070;
&.btn-prev {
border-right: 1px solid #cccccc;
}
&.btn-next {
border-left: 1px solid #cccccc;
}
}
/deep/li {
width: 38px;
height: 38px;
padding: 0;
font-weight: normal;
font-size: 15px;
line-height: 38px;
color: #707070;
~ li {
border-left: 1px solid #cccccc;
}
&.active {
background-color: #e93323;
color: #ffffff;
}
}
}
.nothing {
margin-top: 100px;
font-size: 16px;
text-align: center;
color: #999999;
img {
margin: 0 auto;
}
}
}
</style>