| @ -0,0 +1,35 @@ | |||
| <template> | |||
| <view class="calendars"> | |||
| <uv-calendars ref="calendars" @confirm="confirm" /> | |||
| </view> | |||
| </template> | |||
| <script> | |||
| export default { | |||
| name: "Calendars", | |||
| data() { | |||
| return { | |||
| } | |||
| }, | |||
| methods: { | |||
| //打开日历 | |||
| open() { | |||
| this.$refs.calendars.open(); | |||
| }, | |||
| //用户选择了日期信息 | |||
| confirm(e) { | |||
| this.$emit("select", e) | |||
| } | |||
| } | |||
| } | |||
| </script> | |||
| <style lang="scss" scoped> | |||
| .calendars { | |||
| &::v-deep .uv-calendar__header { | |||
| border-bottom: none !important; | |||
| } | |||
| } | |||
| </style> | |||
| @ -0,0 +1,263 @@ | |||
| <template> | |||
| <scroll-view scroll-y="true" :style="{height: height}" @scrolltolower="moreCoupon()"> | |||
| <!-- 优惠券列表 --> | |||
| <view class="list"> | |||
| <view class="item" v-for="item in couponList" @click="select(item)" :key="item.id" | |||
| :class="['status-' + item.state]"> | |||
| <image src="@/pages_order/static/coupon/coupon-bg.png" mode="widthFix" class="coupon-bg"></image> | |||
| <view class="item-con"> | |||
| <view class="price-time"> | |||
| <view class="price"> | |||
| <view class="num"> | |||
| <view class="icon"> | |||
| ¥ | |||
| </view> | |||
| {{ item.money }} | |||
| </view> | |||
| </view> | |||
| <view class="date-tiao"> | |||
| <view class="time"> | |||
| 限{{ formatDate(item.stateTime) }} - {{ formatDate(item.endTime) }} | |||
| </view> | |||
| <view class="tiao"> | |||
| 满{{ item.useMoney }}可用 | |||
| </view> | |||
| </view> | |||
| </view> | |||
| <view class="status"> | |||
| <view class="order-status"> | |||
| <image src="@/pages_order/static/coupon/status.png" mode="widthFix" class="status-img"> | |||
| </image> | |||
| <view class="text"> | |||
| {{ status[item.state] }} | |||
| </view> | |||
| </view> | |||
| <view class="surplus"> | |||
| 剩余28天过期 | |||
| </view> | |||
| </view> | |||
| </view> | |||
| </view> | |||
| </view> | |||
| <uv-empty v-if="couponList.length == 0" text="空空如也" textSize="30rpx" iconSize="200rpx" icon="list"></uv-empty> | |||
| </scroll-view> | |||
| </template> | |||
| <script> | |||
| export default { | |||
| name: 'CouponList', | |||
| data() { | |||
| return { | |||
| status: ['已领取', '已使用', '已过期'], | |||
| queryParams: { | |||
| pageNo: 1, | |||
| pageSize: 10 | |||
| }, | |||
| couponList: [], | |||
| total: 0 | |||
| } | |||
| }, | |||
| methods: { | |||
| select(item) { | |||
| this.$emit('select', item) | |||
| }, | |||
| //获取优惠券列表 | |||
| getCouponList() { | |||
| let requestData = { | |||
| ...this.queryParams, | |||
| state: this.state ? this.state : 0 | |||
| } | |||
| this.$api('getRiceCouponList', requestData, res => { | |||
| if (res.code == 200) { | |||
| this.couponList = res.result.records | |||
| this.total = res.result.total | |||
| } | |||
| }) | |||
| }, | |||
| //格式化年月日 | |||
| formatDate(date) { | |||
| date = new Date(date); | |||
| // const year = date.getFullYear(); | |||
| const month = String(date.getMonth() + 1).padStart(2, '0'); // 月份从0开始,需要加1,并且确保是两位数 | |||
| const day = String(date.getDate()).padStart(2, '0'); // 确保日期是两位数 | |||
| return `${month}-${day}`; | |||
| }, | |||
| // 加载更多 | |||
| moreCoupon() { | |||
| if (this.queryParams.pageSize > this.total) return | |||
| this.queryParams.pageSize += 10 | |||
| this.getCouponList() | |||
| }, | |||
| }, | |||
| props: { | |||
| state: { | |||
| type: Number, | |||
| default: 0 | |||
| }, | |||
| height: { | |||
| default: 'calc(90vh - 180rpx)' | |||
| } | |||
| }, | |||
| watch: { | |||
| state: function(newValue) { | |||
| this.getCouponList() | |||
| } | |||
| } | |||
| } | |||
| </script> | |||
| <style lang="scss" scoped> | |||
| .list { | |||
| .item { | |||
| color: #FDDFCD; | |||
| position: relative; | |||
| width: calc(100% - 40rpx); | |||
| height: 220rpx; | |||
| background-size: 100% 100%; | |||
| margin: 20rpx; | |||
| box-sizing: border-box; | |||
| padding: 30rpx; | |||
| .coupon-bg { | |||
| width: 100%; | |||
| position: absolute; | |||
| left: 0rpx; | |||
| top: 0rpx; | |||
| } | |||
| .item-con { | |||
| display: flex; | |||
| align-items: center; | |||
| flex-wrap: wrap; | |||
| position: absolute; | |||
| top: 50%; | |||
| left: 0rpx; | |||
| transform: translateY(-50%); | |||
| z-index: 99; | |||
| width: 100%; | |||
| .price-time { | |||
| display: flex; | |||
| width: 65%; | |||
| .price { | |||
| display: flex; | |||
| align-items: center; | |||
| .num { | |||
| color: #FFF8E9; | |||
| font-weight: 900; | |||
| font-size: 70rpx; | |||
| display: flex; | |||
| align-items: flex-end; | |||
| .icon { | |||
| color: #FFF8E9; | |||
| width: 30rpx; | |||
| height: 30rpx; | |||
| display: flex; | |||
| justify-content: center; | |||
| align-items: center; | |||
| font-size: 20rpx; | |||
| border-radius: 14rpx; | |||
| margin-bottom: 14rpx; | |||
| margin-right: 10rpx; | |||
| } | |||
| } | |||
| } | |||
| .date-tiao { | |||
| display: flex; | |||
| flex-direction: column; | |||
| align-items: center; | |||
| font-size: 24rpx; | |||
| box-sizing: border-box; | |||
| padding-left: 20rpx; | |||
| .time {} | |||
| .tiao { | |||
| display: flex; | |||
| justify-content: center; | |||
| background: #FDE5BA; | |||
| border-radius: 40rpx; | |||
| color: #FF2E34; | |||
| padding: 5rpx 20rpx; | |||
| margin-top: 15rpx; | |||
| } | |||
| } | |||
| } | |||
| .status { | |||
| display: flex; | |||
| flex-direction: column; | |||
| align-items: center; | |||
| justify-content: center; | |||
| width: 35%; | |||
| color: #FD4231; | |||
| padding-top: 30rpx; | |||
| .order-status { | |||
| position: relative; | |||
| width: 180rpx; | |||
| .status-img { | |||
| position: absolute; | |||
| left: 0; | |||
| width: 100%; | |||
| } | |||
| .text { | |||
| height: 90rpx; | |||
| display: flex; | |||
| justify-content: center; | |||
| align-items: center; | |||
| position: relative; | |||
| z-index: 100; | |||
| font-size: 34rpx; | |||
| font-weight: bold; | |||
| } | |||
| } | |||
| .surplus { | |||
| font-size: 22rpx; | |||
| text-align: center; | |||
| margin-top: 10rpx; | |||
| } | |||
| } | |||
| } | |||
| } | |||
| .status-0 { | |||
| opacity: 1; | |||
| } | |||
| .status-1 { | |||
| opacity: .9; | |||
| } | |||
| .status-2 { | |||
| opacity: .6; | |||
| } | |||
| .del { | |||
| position: absolute; | |||
| top: 0; | |||
| left: 0; | |||
| width: 100%; | |||
| height: 100%; | |||
| background-color: #ffffff99; | |||
| z-index: 99; | |||
| } | |||
| } | |||
| </style> | |||
| @ -0,0 +1,99 @@ | |||
| <!-- 省市区三级联动 --> | |||
| <template> | |||
| <view class="area-selector"> | |||
| <uv-picker ref="picker" :columns="addressList" :loading="loading" keyName="name" @change="change" | |||
| @confirm="confirm"> | |||
| </uv-picker> | |||
| <button @click="open">打开</button> | |||
| </view> | |||
| </template> | |||
| <script> | |||
| export default { | |||
| name: "AreaSelector", | |||
| data() { | |||
| loading: true, | |||
| provinces: [], //省 | |||
| citys: [], //市 | |||
| areas: [], //区 | |||
| pickerValue: [0, 0, 0], | |||
| defaultValue: [3442, 1, 2] | |||
| }, | |||
| onShow() { | |||
| this.getData(); | |||
| }, | |||
| computed: { | |||
| addressList() { | |||
| return [this.provinces, this.citys, this.areas]; | |||
| } | |||
| }, | |||
| methods: { | |||
| getData() { | |||
| uni.request({ | |||
| method: 'GET', | |||
| url: '/static/uvui/example/regions.json', | |||
| success: res => { | |||
| const { | |||
| statusCode, | |||
| data | |||
| } = res | |||
| if (statusCode === 200) { | |||
| console.log('获取的数据:', res); | |||
| this.provinces = data.sort((left, right) => (Number(left.code) > Number(right | |||
| .code) ? 1 : -1)); | |||
| console.log(this.provinces) | |||
| this.handlePickValueDefault() | |||
| setTimeout(() => { | |||
| this.loading = false | |||
| }, 200) | |||
| } | |||
| } | |||
| }) | |||
| }, | |||
| handlePickValueDefault() { | |||
| // 设置省 | |||
| this.pickerValue[0] = this.provinces.findIndex(item => Number(item.id) === this.defaultValue[0]); | |||
| // 设置市 | |||
| this.citys = this.provinces[this.pickerValue[0]]?.children || []; | |||
| this.pickerValue[1] = this.citys.findIndex(item => Number(item.id) === this.defaultValue[1]); | |||
| // 设置区 | |||
| this.areas = this.citys[this.pickerValue[1]]?.children || []; | |||
| this.pickerValue[2] = this.areas.findIndex(item => Number(item.id) === this.defaultValue[2]); | |||
| // 重置下位置 | |||
| this.$refs.picker.setIndexs([this.pickerValue[0], this.pickerValue[1], this.pickerValue[2]], true); | |||
| }, | |||
| change(e) { | |||
| if (this.loading) return; | |||
| const { | |||
| columnIndex, | |||
| index, | |||
| indexs | |||
| } = e | |||
| // 改变了省 | |||
| if (columnIndex === 0) { | |||
| this.citys = this.provinces[index]?.children || [] | |||
| this.areas = this.citys[0]?.children || [] | |||
| this.$refs.picker.setIndexs([index, 0, 0], true) | |||
| } else if (columnIndex === 1) { | |||
| this.areas = this.citys[index]?.children || [] | |||
| this.$refs.picker.setIndexs(indexs, true) | |||
| } | |||
| }, | |||
| open() { | |||
| this.$refs.picker.open(); | |||
| this.handlePickValueDefault() | |||
| }, | |||
| confirm(e) { | |||
| console.log('确认选择的地区:', e); | |||
| uni.showToast({ | |||
| icon: 'none', | |||
| title: `${e.value[0].name}/${e.value[1].name}/${e.value[2].name}` | |||
| }) | |||
| } | |||
| } | |||
| } | |||
| </script> | |||
| <style lang="scss" scoped> | |||
| .area-selector {} | |||
| </style> | |||