123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498 |
- <template>
- <view>
- <base-drawer mode="bottom" :visible="attr.cartAttr" :zIndex="12" :maskZIndex="11" background-color="transparent" mask maskClosable
- @close="closeAttr">
- <view class="scroll-content bg--w111-fff rd-t-40rpx">
- <view class="w-full pt-32">
- <view class="px-32 flex">
- <image class="w-180 h-180 rd-16rpx" :src="attr.productSelect.image"></image>
- <view class="pl-24">
- <baseMoney :money="attr.productSelect.price" symbolSize="32" integerSize="48"
- decimalSize="32" color="#FF7E00" weight></baseMoney>
- <view class="mt-20 fs-24 text--w111-999">库存:{{ attr.productSelect.stock }}</view>
- </view>
- </view>
- </view>
- <view class="px-32">
- <scroll-view scroll-y="true" style="max-height: 454rpx" >
- <view class="item mt-32" v-for="(item, indexw) in attr.productAttr" :key="indexw">
- <view class="fs-28 fw-500">{{ item.attr_name }}</view>
- <view class="flex-y-center flex-wrap">
- <view class="sku-item" :class="item.index === itemn.attr ? 'active' : ''"
- v-for="(itemn, indexn) in item.attr_value" @click="tapAttr(indexw, indexn)"
- :key="indexn">
- {{ itemn.attr }}
- </view>
- </view>
- </view>
- <view class="item mt-32">
- <view class="fs-28 fw-500">配送方式</view>
- <view class="flex-y-center flex-wrap">
- <view v-if="attr.deliveryType.includes('1')" :class="{ active: flag == 1 }" class="sku-item" @click="tapDelivery('1')">商城配送</view>
- <view v-if="attr.deliveryType.includes('2')" :class="{ active: flag == 2 }" class="sku-item" @click="tapDelivery('2')">门店自提</view>
- <view v-if="attr.deliveryType.includes('3')" :class="{ active: flag == 3 }" class="sku-item" @click="tapDelivery('3')">门店配送</view>
- </view>
- </view>
- <view class="address on1" v-if="flag == 1" @click="openAddress">
- <view class="acea-row row-middle">
- <view class="max-w-596 line1">{{addressInfo}}</view>
- <view class="iconfont icon-ic_rightarrow ml-8 fs-28"></view>
- </view>
- <view class="info">{{nameInfo}}</view>
- </view>
- <view class="address on2" v-if="flag == 3" @click="openStore">
- <view class="acea-row row-middle">
- <view class="max-w-596 line1">{{deliveryName}}</view>
- <view class="iconfont icon-ic_rightarrow ml-8 fs-28" v-if="attr.isType != 1"></view>
- </view>
- <view class="info">
- <text class="iconfont icon-ic_location51 fs-24 mr-10"></text>{{deliveryAddress}}
- </view>
- </view>
- <view class="address on3" v-if="flag == 2" @click="openStore">
- <view class="acea-row row-middle">
- <view class="max-w-596 line1">{{deliveryName}}</view>
- <view class="iconfont icon-ic_rightarrow ml-8 fs-28" v-if="attr.isType != 1"></view>
- </view>
- <view class="info">
- <text class="iconfont icon-ic_location51 fs-24 mr-10"></text>{{deliveryAddress}}
- </view>
- </view>
- </scroll-view>
- </view>
- <view class="flex-between-center mt-40 px-32">
- <view class="fs-28 fw-500">数量</view>
- <view class="flex-1 flex justify-end items-center">
- <text class="fs-22 text-primary">(最多可购买{{attr.productSelect.stock}}件)</text>
- <view class="flex-y-center pl-24">
- <text class="iconfont icon-ic_Reduce fs-24"
- :class="attr.productSelect.cart_num <= 1 ? 'text--w111-f5f5f5' : ''"
- @tap="CartNumDes"></text>
- <input type="number" v-model="attr.productSelect.cart_num"
- data-name="productSelect.cart_num" :always-embed="true" :adjust-position="true" cursor-spacing="30"
- @input="bindCode(attr.productSelect.cart_num)" class="w-88 h-44 rd-4rpx bg--w111-f5f5f5 fs-24 text-center mx-10"></input>
- <text class="iconfont icon-ic_increase fs-24" @tap="CartNumAdd"></text>
- </view>
- </view>
- </view>
- <view class="btn-box" v-show="attr.productSelect.stock == 0">
- <view class="w-full h-72 rd-40rpx flex-center fs-26 bg--w111-ccc text--w111-fff">已售罄</view>
- </view>
- <view class="btn-box flex-between-center" v-show="attr.productSelect.stock > 0">
- <view class="w-346 h-72 rd-40rpx flex-center fs-26 con_border text-primary"
- :class="{'disabled': cartButton == 0}"
- @tap="goCart(0)">加入购物车</view>
- <view class="w-346 h-72 rd-40rpx flex-center fs-26 bg-primary text--w111-fff" @tap="goCart(1)">立即下单</view>
- </view>
- </view>
- </base-drawer>
- <base-drawer mode="bottom" :visible="isStore" :zIndex="22" :maskZIndex="21" backgroundColor="transparent" @close="closeStore">
- <view class="product-window store">
- <view class="storeTitle">选择门店<text class="iconfont icon-guanbi5" @click="closeStore"></text></view>
- <scroll-view scroll-y="true" class="scroll-view">
- <view class="storeList">
- <view class="item" :class="active == index?'on':''" v-for="(item,index) in storeList" :key="index" @click="tapStore(index,item)">
- <view class="name line1">{{item.name}}</view>
- <view class="address acea-row row-between">
- <view class="iconfont icon-ic_location51"></view>
- <view class="info">{{item.address}}</view>
- </view>
- <view class="time acea-row row-middle">
- <view class="iconfont icon-icon_clock"></view>
- <view>营业时间:{{item.day_time}}</view>
- </view>
- <view class="iconfont icon-xuanzhong6" v-if="active == index"></view>
- </view>
- </view>
- </scroll-view>
- </view>
- </base-drawer>
- <addressWindow ref="addressWindow" :userId="userId" :pagesUrl="pagesUrl" :fromType="1" :address="address" @changeClose="changeClose" @OnChangeAddress="OnChangeAddress"></addressWindow>
- </view>
- </template>
- <script>
- import baseDrawer from '@/components/tui-drawer/tui-drawer.vue'
- import addressWindow from '@/components/addressWindow/index.vue'
- import { storeListApi } from '@/api/store.js'
- import { adminUserAddressList } from '@/api/admin.js'
- export default {
- name:'skuSelect',
- props:{
- userId:{
- type: [Number, String],
- default: 0
- },
- // 商品id
- productId: {
- type: Number,
- value: 0
- },
- attr: {
- type: Object,
- default: () => {}
- },
- cartButton:{
- type: Number,
- default: 1
- }
- },
- data(){
- return {
- flag: 1,
- nameInfo: '', //地址用户信息
- addressInfo: '', // 商城快递
- deliveryName:'', // 门店配送
- deliveryAddress:'',
- pagesUrl:'',
- address: {
- address: false
- },
- active:0,
- storeList: [],
- isStore: false
- }
- },
- watch: {
- 'attr.deliveryType'(newValue, oldValue) {
- if (JSON.stringify(newValue) != JSON.stringify(oldValue)) {
- if (newValue.length) {
- if(this.active<1){
- this.getList();
- }
- let num = 1;
- if (newValue.includes('1')) {
- num = '1';
- } else if (newValue.includes('2')) {
- num = '2';
- } else {
- num = '3';
- }
- this.flag = num
- this.$emit('deliveryFun',num);
- }
- }
- },
- },
- components:{
- baseDrawer,
- addressWindow
- },
- mounted() {
- uni.$on('refresh', (data) => {
- this.nameInfo = data.real_name+'\xa0\xa0'+data.phone
- this.addressInfo = data.address.province+'省'+data.address.city+data.address.district+data.address.street+data.detail
- this.$emit('onAddressId',data)
- });
- },
- methods:{
- goCart(type) {
- if(type == 0 && this.cartButton == 0) return
- if(this.attr.productSelect.stock == 0) return
- this.$emit('goCat',type);
- },
- bindCode: function(e) {
- this.$emit('iptCartNum', this.attr.productSelect.cart_num);
- },
- closeAttr: function() {
- this.$emit('myevent');
- },
- CartNumDes: function() {
- this.$emit('ChangeCartNum', false);
- },
- CartNumAdd: function() {
- this.$emit('ChangeCartNum', true);
- },
- tapAttr: function(indexw, indexn) {
- let that = this;
- that.$emit("attrVal", {
- indexw: indexw,
- indexn: indexn
- });
- this.$set(this.attr.productAttr[indexw], 'index', this.attr.productAttr[indexw].attr_values[indexn]);
- let value = that
- .getCheckedValue()
- .join(",");
- that.$emit("ChangeAttr", value);
- },
- //获取被选中属性;
- getCheckedValue: function() {
- let productAttr = this.attr.productAttr;
- let value = [];
- for (let i = 0; i < productAttr.length; i++) {
- for (let j = 0; j < productAttr[i].attr_values.length; j++) {
- if (productAttr[i].index === productAttr[i].attr_values[j]) {
- value.push(productAttr[i].attr_values[j]);
- }
- }
- }
- return value;
- },
- tapDelivery(value) {
- this.flag = value;
- this.active = 0;
- this.deliveryName = this.storeList[0].name;
- this.deliveryAddress = this.storeList[0].detailed_address+'\xa0';
- this.$emit('deliveryFun',value);
- this.$emit('onstoreId',this.storeList[0],value);
- },
- // 切换地址
- OnChangeAddress: function(e,row) {
- this.address.address = false;
- this.nameInfo = row.real_name+'\xa0\xa0'+row.phone
- this.addressInfo = row.province+'省'+row.city+row.district+row.street+row.detail
- this.$emit('onAddressId',row)
- },
- // 打开地址弹窗
- openAddress(){
- this.$refs.addressWindow.getAddressList();
- this.address.address = true;
- this.pagesUrl = '/pages/users/user_address/addClient'
- },
- // 关闭地址弹窗;
- changeClose: function() {
- this.$set(this.address, 'address', false);
- },
- getList: function(id) {
- let data = {
- // latitude: this.user_latitude || "", //纬度
- // longitude: this.user_longitude || "", //经度
- page: 1,
- limit: 100,
- product_id: this.productId,
- is_store:'', //查找所有门店列表
- // type: this.type == 'seckill'?1:0,
- // store_id: id?id:this.nearbyStore
- };
- storeListApi(data)
- .then(res => {
- let list = res.data.list.list;
- if(!id && list.length && this.attr && ((this.attr.deliveryType.indexOf('2') != -1 && this.attr.store_self_mention) || this.attr.deliveryType.indexOf('3') != -1)){
- this.isDelivery = true;
- if(this.$store.getters.isLogin){
- this.getAddressList()
- }
- }
- // 拆分自提门店列表和配送门店列表
- let selfStoreList = [];
- list.forEach(function(item,index){
- if(item.is_store === 1) selfStoreList.push(item);
- });
- this.storeList = this.flag==2?selfStoreList:list;
- this.selfStoreList = selfStoreList;//门店自提
- this.deliveryStoreList = list;//门店配送
- this.active = 0;
- this.deliveryName = this.storeList[0].name;
- this.deliveryAddress = this.storeList[0].detailed_address+'\xa0';
- this.$emit('onstoreId',this.storeList[0],this.flag);
- })
- .catch(err => {
- this.$util.Tips({
- title: err
- })
- });
- },
- // 配送地址
- getAddressList() {
- adminUserAddressList(this.userId, { page: 1, limit: 10 }).then(res=>{
- let data = res.data[0];
- if(res.data.length){
- this.nameInfo = data.real_name+'\xa0\xa0'+data.phone
- this.addressInfo = data.province+'省'+data.city+data.district+data.street+data.detail
- this.$emit('onAddressId',data)
- }else{
- this.addressInfo = '点击添加地址'
- }
- })
- },
- closeStore(){
- this.isStore = false;
- },
- openStore(){
- if(this.attr.isType != 1){
- this.isStore = true;
- }
- },
- // 切换门店
- tapStore(index,item){
- this.active = index;
- this.deliveryName = item.name;
- this.deliveryAddress = item.detailed_address+'\xa0';
- this.isStore = false;
- this.$emit('onstoreId',item,this.flag);
- },
- }
- }
- </script>
- <style lang="scss" scoped>
- .sku-item {
- height: 56rpx;
- line-height: 56rpx;
- border: 1rpx solid #F2F2F2;
- font-size: 24rpx;
- color: #333;
- padding: 0 44rpx;
- border-radius: 28rpx;
- margin: 24rpx 0 0 16rpx;
- background-color: #F2F2F2;
- word-break: break-all;
- }
- .active {
- color: $primary-admin;
- background: $light-primary-admin;
- border-color: $primary-admin;
- }
- .text-primary {
- color: $primary-admin;
- }
- .bg-primary{
- background: $primary-admin;
- }
- .con_border {
- border: 1rpx solid $primary-admin;
- }
- .btn-box{
- padding:0 20rpx calc(20rpx + env(safe-area-inset-bottom));
- margin: 78rpx auto 0;
- }
- .disabled{
- background-color: #ccc;
- color: #fff;
- border: 1rpx solid #ccc;
- }
- .scroll-content .address{
- width: 690rpx;
- background: #F5F5F5;
- padding: 24rpx 38rpx 24rpx 20rpx;
- margin: 28rpx auto;
- font-weight: 400;
- color: #333333;
- font-size: 28rpx;
- border-radius: 8rpx;
- position: relative;
- &::before{
- position: absolute;
- content: '';
- top:-12rpx;
- width: 0;
- height: 0;
- border-left: 14rpx solid transparent;
- border-right: 14rpx solid transparent;
- border-bottom: 12rpx solid #F5F5F5;
- }
- &.on1{
- &::before{
- left:64rpx;
- }
- }
- &.on2{
- &::before{
- left: 264rpx;
- }
- }
- &.on3{
- &::before{
- left:288rpx;
- }
- }
- .info{
- font-weight: 400;
- color: #999999;
- font-size: 24rpx;
- margin-top: 12rpx;
- .con{
- width: 416rpx;
- }
- }
- }
- .product-window {
- padding-bottom: constant(safe-area-inset-bottom); ///兼容 IOS<11.2/
- padding-bottom: env(safe-area-inset-bottom);///兼容 IOS>11.2/
-
- &.store{
- background-color: #F5F5F5;
- border-radius: 40rpx 40rpx 0 0;
- // transform: translate3d(0, 0, 0);
- // z-index: 102;
- // margin: 0;
- }
- .storeTitle{
- text-align: center;
- height: 100rpx;
- line-height: 100rpx;
- font-size: 32rpx;
- font-weight: 500;
- color: #282828;
- position: relative;
- .iconfont{
- position: absolute;
- font-size: 35rpx;
- right: 30rpx;
- }
- }
- .scroll-view{
- max-height: 690rpx;
- }
- .storeList{
- .item{
- width: 690rpx;
- background: #FFFFFF;
- border-radius: 12rpx;
- margin: 0 auto 20rpx auto;
- padding: 28rpx 30rpx;
- border: 1px solid #fff;
- position: relative;
- &.on{
- border-color: #2A7EFB;
- }
- .icon-xuanzhong6{
- position: absolute;
- right: -6rpx;
- bottom: -6rpx;
- color: var(--view-theme);
- font-size: 54rpx;
- }
- .name{
- font-weight: 500;
- color: #333333;
- font-size: 28rpx;
- }
- .time{
- font-weight: 400;
- color: #888888;
- font-size: 22rpx;
- margin-top: 15rpx;
- .iconfont{
- font-size: 20rpx;
- margin-right: 8rpx;
- }
- }
- .address{
- font-weight: 400;
- color: #888888;
- font-size: 22rpx;
- margin-top: 13rpx;
- .iconfont{
- font-size: 20rpx;
- margin-right: 8rpx;
- margin-top: 6rpx;
- }
- .info{
- width: 590rpx;
- line-height: 1.5;
- }
- }
- }
- }
- }
- /deep/.font-num{
- color: #2A7EFB !important;
- }
- /deep/.bg-color{
- background: #2A7EFB !important;
- }
- </style>
|