forked from zhongyuanhaiju/uniapp
478 lines
13 KiB
Vue
478 lines
13 KiB
Vue
<template>
|
||
<page-meta :page-style="themeColor"></page-meta>
|
||
<view class="details">
|
||
<view v-if="Object.keys(info).length > 0">
|
||
<!--顶部内容-->
|
||
<view class="top">
|
||
<image class="top-image" :src="$util.img(info.goods_image)" mode="widthFix"></image>
|
||
<view class="top-count-down">
|
||
<image class="top-down-image" :src="$util.img('public/static/img/futures/details_down_bg.png')" mode="widthFix"></image>
|
||
<view class="top-down-text">
|
||
<image class="top-down-text-image" :src="$util.img('public/static/img/futures/details_down_icon.png')" mode="widthFix"></image>
|
||
正在销售
|
||
</view>
|
||
<view class="top-count-down-time" v-if="h > 0 || i > 0 || s > 0">
|
||
<text class="count-down-time">{{ h }}</text>:
|
||
<text class="count-down-time">{{ i }}</text>:
|
||
<text class="count-down-time">{{ s }}</text>
|
||
</view>
|
||
</view>
|
||
</view>
|
||
<!--参数信息-->
|
||
<view class="params-info">
|
||
<view class="title">{{ info.goods_name }}</view>
|
||
<view class="info-item">
|
||
售卖价格:<text class="info-num"><text class="unit">¥</text>{{ info.market_price }}/{{ info.unit || '件' }}</text>
|
||
</view>
|
||
<view class="info-item">
|
||
采购价格:<text class="buy-price"><text class="unit">¥</text>{{ info.price }}</text>
|
||
</view>
|
||
<view class="info-item">
|
||
<view class="info-block">
|
||
采购数量:<text class="info-num">{{ info.total }}{{ info.unit || '件' }}</text>
|
||
</view>
|
||
<view class="info-block">
|
||
销售商:<text class="info-num">{{ info.seller_nickname }}</text>
|
||
</view>
|
||
</view>
|
||
</view>
|
||
<!--商品详情富文本-->
|
||
<view class="goods-detail">
|
||
<view class="detail-top">
|
||
<view class="left">采购商品详情</view>
|
||
<view class="right" @click="details_show = !details_show">
|
||
展开
|
||
<i v-if="details_show" class="icondiy icon-system-jiantoushang"></i>
|
||
<i v-else class="icondiy icon-system-jiantouxia"></i>
|
||
</view>
|
||
</view>
|
||
<view class="goods-detail-content">
|
||
<uni-transition
|
||
id="goodsDetailContent"
|
||
ref="detail"
|
||
:show="details_show"
|
||
mode-class="slide-top"
|
||
:duration="2000">
|
||
<view class="detail-content-item">
|
||
<view class="goods-details" v-if="info.goods_content">
|
||
<rich-text :nodes="info.goods_content" @click="showImg($event)" :data-nodes="info.goods_content"></rich-text>
|
||
</view>
|
||
<view class="goods-details active" v-else>该商家暂无上传相关详情哦!</view>
|
||
</view>
|
||
</uni-transition>
|
||
</view>
|
||
</view>
|
||
<!--按钮-->
|
||
<view class="bottom-buttons">
|
||
<view class="button-item" @click="editRemark">添加备注</view>
|
||
<view class="button-item" @click="payOpen">立即采购</view>
|
||
</view>
|
||
<!--添加备注内容-->
|
||
<uni-popup ref="orderRemarks" type="dialog" class="order-remarks-content">
|
||
<uni-popup-dialog ref="inputClose" mode="input" placeholder="请输入订单备注"
|
||
:value="order_remarks"
|
||
@close="$refs.orderRemarks.close()"
|
||
@confirm="confirmRemarks">
|
||
</uni-popup-dialog>
|
||
</uni-popup>
|
||
</view>
|
||
<view v-else>
|
||
<ns-empty :isIndex="false" text="未到秒杀时间"></ns-empty>
|
||
</view>
|
||
<pay-pop txt="支付密码" :pwdlength="6" ref="payPop" @pwd_e="pwdEvend" />
|
||
<!--登录弹框-->
|
||
<ns-login ref="login"></ns-login>
|
||
<!--加载动画-->
|
||
<loading-cover ref="loadingCover"></loading-cover>
|
||
</view>
|
||
</template>
|
||
<script>
|
||
import uniTransition from '@/pages_rush/components/uni-transition/uni-transition.vue';
|
||
import uniPopup from '@/pages_rush/components/uni-popup-new/uni-popup.vue';
|
||
import uniPopupDialog from '@/pages_rush/components/uni-popup-dialog/uni-popup-dialog.vue';
|
||
import payPop from '@/pages_rush/components/pay-pop/pay-pop.vue';
|
||
import payment from './payment.js';
|
||
export default {
|
||
components: {
|
||
uniTransition,
|
||
uniPopup,
|
||
payPop,
|
||
uniPopupDialog
|
||
},
|
||
mixins: [payment],
|
||
data() {
|
||
return {
|
||
api: {
|
||
payment: '/futures/api/ordercreate/payment',
|
||
calculate: '/futures/api/ordercreate/calculate',
|
||
create: '/futures/api/ordercreate/create'
|
||
},
|
||
createDataKey:'futuresOrderCreateData',
|
||
id: 0,
|
||
// 倒计时
|
||
end_time: 1680170346,// 结束时间 时间戳
|
||
diff_time: 0,
|
||
h: '00',
|
||
i: '00',
|
||
s: '00',
|
||
interval: '',
|
||
// 商品详情是否显示
|
||
details_show: true,
|
||
info: {},
|
||
order_remarks: '',
|
||
userInfo:''
|
||
};
|
||
},
|
||
onLoad(option) {
|
||
this.id = option.id;
|
||
this.orderCreateData.futures_id=this.id;
|
||
this.getDetail(option.id);
|
||
},
|
||
onShow() {
|
||
this.getMemberInfo();
|
||
},
|
||
onReady(){
|
||
// 判断是否登录
|
||
if (!uni.getStorageSync('token')) this.$refs.login.open('/pages_rush/futures/seckill');
|
||
if (this.$refs.loadingCover) this.$refs.loadingCover.hide();
|
||
},
|
||
methods: {
|
||
async getMemberInfo() {
|
||
this.userInfo = uni.getStorageSync('userInfo');
|
||
if(this.userInfo) return;
|
||
let res = await this.$api.sendRequest({
|
||
url: '/api/member/info',
|
||
async: false
|
||
});
|
||
if (res.code >= 0 && res.data) {
|
||
this.token = uni.getStorageSync('token');
|
||
this.userInfo = res.data;
|
||
uni.setStorageSync('userInfo', this.userInfo);
|
||
}
|
||
},
|
||
payOpen() {
|
||
if (!uni.getStorageSync('token')) {
|
||
this.$util.redirectTo('/pages_tool/login/login');
|
||
}
|
||
this.$refs.payPop.Open()
|
||
},
|
||
pwdEvend(pass){
|
||
console.log('密码是:', pass)
|
||
this.orderCreateData.payPassword=pass;
|
||
this.orderCreate(); //创建订单
|
||
|
||
},
|
||
// 获取商品列表
|
||
getDetail(id) {
|
||
this.$api.sendRequest({
|
||
url: '/futures/api/futures/detail',
|
||
data: {
|
||
id: id
|
||
},
|
||
success: res => {
|
||
if(parseInt(res.code) === 0){
|
||
this.info = res.data;
|
||
this.end_time = parseInt(res.data.end_time);
|
||
// 开启倒计时
|
||
this.countDown();
|
||
}
|
||
|
||
if (this.$refs.loadingCover) this.$refs.loadingCover.hide();
|
||
},
|
||
fail: res => {
|
||
if (this.$refs.loadingCover) this.$refs.loadingCover.hide();
|
||
}
|
||
});
|
||
},
|
||
// 倒计时
|
||
countDown(){
|
||
this.interval = setInterval(() => {
|
||
// 获取距离结束时间的毫秒数
|
||
let nowTime = Math.ceil((new Date()).getTime() / 1000);
|
||
this.diff_time = this.end_time - nowTime;
|
||
// 计算时间
|
||
let result = this.$util.countDown(this.diff_time);
|
||
this.h = (parseInt(result.d) * 24) + parseInt(result.h);
|
||
this.i = parseInt(result.i);
|
||
this.s = parseInt(result.s);
|
||
}, 1000)
|
||
},
|
||
// 点击添加备注
|
||
editRemark(){
|
||
this.$refs.orderRemarks.open('center')
|
||
},
|
||
// 添加备注
|
||
confirmRemarks(value){
|
||
console.log(value)
|
||
this.order_remarks = value || '';
|
||
this.orderCreateData.buyer_message=this.order_remarks;
|
||
this.$refs.orderRemarks.close();
|
||
},
|
||
// 立即采购
|
||
buy(){
|
||
uni.setStorage({
|
||
key: 'futuresOrderCreateData',
|
||
data: {
|
||
futures_id: this.id,
|
||
order_remarks: this.order_remarks
|
||
},
|
||
success: () => {
|
||
this.isSub = false;//防抖
|
||
this.$util.redirectTo('/pages_rush/futures/payment');
|
||
}
|
||
});
|
||
},
|
||
showImg(e) {
|
||
//拿到图片的路径里面的内容放在我们数组中
|
||
let contentimg = e.target.dataset.nodes || e.currentTarget.dataset.nodes;
|
||
let arrImg = [];
|
||
for (var i = 0; i < contentimg.length; i++) {
|
||
var img = contentimg[i].children;
|
||
if (Array.isArray(img)) {
|
||
for (var j = 0; j < img.length; j++) {
|
||
if (img[j].attrs && img[j].name == "img") {
|
||
if (img[j].attrs.src) {
|
||
arrImg.push(img[j].attrs.src)
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
//最后一步就是把我们的所有图片放在预览的api中就可以了
|
||
uni.previewImage({
|
||
current: arrImg,
|
||
urls: arrImg,
|
||
})
|
||
}
|
||
},
|
||
onBackPress(options) {
|
||
if (options.from === 'navigateBack') return false;
|
||
this.$util.redirectTo('/pages/member/index');
|
||
return true;
|
||
}
|
||
};
|
||
</script>
|
||
|
||
<style lang="scss" scoped>
|
||
.details{
|
||
background: #f5f5f5;// #f5f5f5
|
||
min-height: calc(100vh - 110rpx);
|
||
width: 100vw;
|
||
padding-bottom: 110rpx;
|
||
.top{
|
||
height: 100vw;
|
||
position: relative;
|
||
.top-image{
|
||
width: 100vw;
|
||
max-height: 100%;
|
||
}
|
||
.top-count-down{
|
||
--count-down-size--: 96rpx;
|
||
--top-count-down-time-width--: 230rpx;
|
||
height: var(--count-down-size--);
|
||
position: absolute;
|
||
bottom: 0;
|
||
left: 0;
|
||
overflow: hidden;
|
||
width: 100%;
|
||
.top-down-image{
|
||
width: 100%;
|
||
height: 100%;
|
||
}
|
||
.top-down-text{
|
||
position: absolute;
|
||
bottom: 0;
|
||
right: var(--top-count-down-time-width--);
|
||
height: var(--count-down-size--);
|
||
display: inline-flex;
|
||
flex-direction: row;
|
||
flex-wrap: nowrap;
|
||
align-items: center;
|
||
justify-content: flex-end;
|
||
padding-right: 55rpx;
|
||
font-size: 30rpx;
|
||
font-weight: bold;
|
||
color: #fe6276;
|
||
.top-down-text-image{
|
||
width: 36rpx!important;
|
||
margin-right: 15rpx;
|
||
}
|
||
}
|
||
.top-count-down-time{
|
||
position: absolute;
|
||
bottom: 0;
|
||
right: 0;
|
||
height: var(--count-down-size--);
|
||
width: var(--top-count-down-time-width--);
|
||
display: inline-flex;
|
||
flex-direction: row;
|
||
flex-wrap: nowrap;
|
||
justify-content: flex-start;
|
||
align-items: center;
|
||
|
||
.count-down-time{
|
||
--size--: 50rpx;
|
||
background: #313131;
|
||
color: #c6c7ca;
|
||
min-width: calc(var(--size--) - 20rpx);
|
||
height: var(--size--);
|
||
border-radius: 10rpx;
|
||
display: inline-flex;
|
||
flex-direction: row;
|
||
flex-wrap: nowrap;
|
||
align-content: center;
|
||
justify-content: center;
|
||
align-items: center;
|
||
margin: 0 6rpx;
|
||
font-size: 26rpx;
|
||
padding: 0 10rpx;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
.params-info{
|
||
padding: 20rpx;
|
||
background: #FFFFFF;
|
||
.title{
|
||
width: 100%;
|
||
height: 60rpx;
|
||
line-height: 50rpx;
|
||
font-size: 34rpx;
|
||
font-weight: bold;
|
||
white-space: nowrap;
|
||
overflow: hidden;
|
||
text-overflow: ellipsis;
|
||
}
|
||
.info-item{
|
||
height: 50rpx;
|
||
line-height: 40rpx;
|
||
font-size: 28rpx;
|
||
color: #747474;
|
||
white-space: nowrap;
|
||
overflow: hidden;
|
||
text-overflow: ellipsis;
|
||
width: 100%;
|
||
.unit{
|
||
font-size: 24rpx;
|
||
display: inline-block;
|
||
width: 22rpx;
|
||
}
|
||
.info-num{
|
||
font-weight: bold;
|
||
color: #040404;
|
||
}
|
||
.buy-price{
|
||
font-size: 34rpx;
|
||
font-weight: bold;
|
||
color: #fe5572;
|
||
}
|
||
.info-block{
|
||
width: 50%;
|
||
float: left;
|
||
font-size: 28rpx;
|
||
color: #747474;
|
||
white-space: nowrap;
|
||
overflow: hidden;
|
||
text-overflow: ellipsis;
|
||
}
|
||
}
|
||
}
|
||
.goods-detail{
|
||
background: #fcfcfc;
|
||
margin-top: 20rpx;
|
||
padding: 20rpx;
|
||
.detail-top{
|
||
width: 100%;
|
||
height: 70rpx;
|
||
margin-bottom: 20rpx;
|
||
display: inline-flex;
|
||
flex-direction: row;
|
||
flex-wrap: nowrap;
|
||
align-items: center;
|
||
justify-content: space-between;
|
||
.left{
|
||
font-size: 30rpx;
|
||
font-weight: bold;
|
||
color: #3e3e3e;
|
||
}
|
||
.right{
|
||
font-size: 13px;
|
||
color: #838383;
|
||
display: inline-flex;
|
||
flex-direction: row;
|
||
flex-wrap: nowrap;
|
||
align-items: center;
|
||
height: 70rpx;
|
||
i{
|
||
margin-left: 20rpx;
|
||
color: #838383;
|
||
}
|
||
}
|
||
}
|
||
.goods-detail-content{
|
||
// padding: 5px 10px 10px;
|
||
margin-bottom: 52px;
|
||
overflow: hidden;
|
||
}
|
||
.goods-details{
|
||
// padding: 5px 10px 10px;
|
||
margin-bottom: 52px;
|
||
overflow: hidden;
|
||
}
|
||
.goods-details.active {
|
||
min-height: 150rpx;
|
||
width: 100%;
|
||
display: flex;
|
||
justify-content: center;
|
||
align-items: center;
|
||
color: $color-tip;
|
||
}
|
||
}
|
||
.bottom-buttons{
|
||
position: fixed;
|
||
bottom: 0;
|
||
left: 0;
|
||
width: 100%;
|
||
display: inline-flex;
|
||
flex-direction: row;
|
||
flex-wrap: nowrap;
|
||
align-items: center;
|
||
justify-content: space-around;
|
||
height: 100rpx;
|
||
background: #FFFFFF;
|
||
.button-item{
|
||
height: 80rpx;
|
||
line-height: 80rpx;
|
||
font-size: 30rpx;
|
||
width: 240rpx;
|
||
border-radius: 100vw;
|
||
text-align: center;
|
||
}
|
||
.button-item:nth-of-type(1){
|
||
background: #FFFFFF;
|
||
border: 2rpx solid #dfdfdf;
|
||
color: #838383;
|
||
}
|
||
.button-item:nth-of-type(2){
|
||
background: #ff4546;
|
||
color: #fee6e6;
|
||
}
|
||
}
|
||
}
|
||
/deep/ .order-remarks-content{
|
||
display: inline-flex;
|
||
flex-direction: row;
|
||
flex-wrap: nowrap;
|
||
align-content: center;
|
||
justify-content: center;
|
||
align-items: center;
|
||
background-color: rgba(0,0,0,0.6);
|
||
.uni-dialog-input{
|
||
min-height: 80rpx;
|
||
height: auto!important;
|
||
|
||
|
||
}
|
||
}
|
||
</style>
|