|
|
- <template>
- <view>
- <!-- 普通模式 -->
- <view v-if="!showModel" class="phone" v-show="phone" @click.stop="callPhone">
- <image src="/static/image/home/phone.png" mode="widthFix"></image>
- {{ title || '联系' + ta[sexName] }}
- </view>
-
- <!-- 悬浮窗模式 -->
- <view v-else v-show="phone" class="phone-modal" @click.stop="callPhone">
- <view class="phone-modal-content">
- <image src="/static/image/home/phone.png" mode="widthFix"></image>
- <text class="phone-modal-text">{{ title || '联系' + ta[sexName] }}</text>
- </view>
- </view>
- </view>
- </template>
-
- <script>
- import mixinsSex from '@/mixins/sex.js'
- import rewardedVideoAdMixin from '@/mixins/rewardedVideoAd.js'
- import { mapState } from 'vuex'
- export default {
- mixins: [mixinsSex, rewardedVideoAdMixin],
- props: {
- phone: {
- type: String,
- default: ''
- },
- title: {
- type: String,
- default: ''
- },
- sexName: {
- type: String,
- default: ''
- },
- type: {
- type: String,
- default: ''
- },
- phoneTitle: {
- type: String,
- default: ''
- },
- pid: {
- type: [String, Number],
- default: ''
- },
- // 显示模式:false-普通模式,true-悬浮窗模式
- showModel: {
- type: Boolean,
- default: false
- }
- },
- data() {
- return {
- // 视频广告相关数据已移至混入中
- }
- },
- computed : {
- ...mapState(['priceMap']),
- },
- // mounted钩子已在混入中处理
- methods: {
- // 广告观看完成回调
- onAdWatchComplete() {
- console.log('用户看完广告,开始拨打电话')
- this.performCall()
- },
-
- // 广告观看取消回调
- onAdWatchCancel() {
- uni.showToast({
- title: '请观看完整广告才能拨打电话',
- icon: 'none'
- })
- },
-
- callPhone(){
-
- let data = {
- title : this.phoneTitle,
- type : this.type,
- id : this.pid
- }
-
- this.rewardedRecordConfig.type = this.type //
- this.rewardedRecordConfig.formId = this.pid //
-
- console.log(data);
-
- if(!data.id || !data.title){
- return uni.showToast({
- title: '缺少参数',
- icon: 'none'
- })
- }
-
- // 注释积分消耗逻辑,改为观看视频
- // uni.showModal({
- // title: `确定消耗${this.priceMap.phone}积分呼叫吗?`,
- // success : (r) => {
- // if(r.confirm){
- // this.$api('checkGivePhone', data, res => {
- // if(res.code == 200){
- // uni.makePhoneCall({
- // phoneNumber: this.phone
- // })
- // }
- // })
- // }
- // }
- // })
-
- // 改为观看视频后拨打电话
- uni.showModal({
- title: '观看广告后拨打电话',
- content: '观看完整视频广告后即可免费拨打电话',
- success : (r) => {
- if(r.confirm){
- // 使用混入的方法显示广告
- this.showRewardedVideoAd({
- onSuccess: this.onAdWatchComplete,
- onCancel: this.onAdWatchCancel,
- fallbackTitle: '广告加载失败',
- fallbackContent: '无法加载广告,是否直接拨打电话?'
- })
- }
- }
- })
- },
-
- // 执行拨打电话(观看广告后调用)
- performCall() {
- let data = {
- title : this.phoneTitle,
- type : this.type,
- id : this.pid
- }
-
- // 注释原有的积分检查接口调用
- // this.$api('checkGivePhone', data, res => {
- // if(res.code == 200){
- // uni.makePhoneCall({
- // phoneNumber: this.phone
- // })
- // }
- // })
-
- // 直接拨打电话,不再检查积分
- uni.makePhoneCall({
- phoneNumber: this.phone
- })
- }
- }
- }
- </script>
-
- <style scoped lang="scss">
- // 普通模式样式
- .phone {
- background-color: rgba($uni-color, 0.2);
- color: $uni-color;
- padding: 8rpx 16rpx;
- border-radius: 10rpx;
- margin-left: auto;
- font-size: 26rpx;
-
- image {
- width: 20rpx;
- height: 20rpx;
- }
- }
-
- // 悬浮窗模式样式
- .phone-modal {
- position: fixed;
- bottom: calc(140rpx + env(safe-area-inset-bottom));
- right: 30rpx;
- z-index: 999;
-
- .phone-modal-content {
- background: linear-gradient(135deg, $uni-color 0%, rgba($uni-color, 0.8) 100%);
- color: #ffffff;
- padding: 20rpx 30rpx;
- border-radius: 50rpx;
- box-shadow: 0 8rpx 24rpx rgba($uni-color, 0.3);
- display: flex;
- align-items: center;
- justify-content: center;
- min-width: 160rpx;
- transition: all 0.3s ease;
-
- &:active {
- transform: scale(0.95);
- box-shadow: 0 4rpx 12rpx rgba($uni-color, 0.4);
- }
-
- image {
- width: 28rpx;
- height: 28rpx;
- margin-right: 12rpx;
- filter: brightness(0) invert(1); // 将图标变为白色
- }
-
- .phone-modal-text {
- font-size: 28rpx;
- font-weight: 500;
- white-space: nowrap;
- }
- }
-
- // 悬浮窗呼吸动画效果
- &::before {
- content: '';
- position: absolute;
- top: -10rpx;
- left: -10rpx;
- right: -10rpx;
- bottom: -10rpx;
- background: rgba($uni-color, 0.2);
- border-radius: 60rpx;
- animation: pulse 2s infinite;
- z-index: -1;
- }
- }
-
- // 呼吸动画
- @keyframes pulse {
- 0% {
- transform: scale(1);
- opacity: 0.7;
- }
- 50% {
- transform: scale(1.1);
- opacity: 0.3;
- }
- 100% {
- transform: scale(1);
- opacity: 0.7;
- }
- }
- </style>
|