Explorar el Código

Merge branch 'xqc_change_path'

jwyu hace 2 años
padre
commit
1565fcf82f

+ 6 - 6
custom-tab-bar/index.wxml

@@ -1,6 +1,6 @@
-<cover-view class="tab-bar">
-  <cover-view wx:for="{{list}}" wx:key="index" class="tab-bar-item" data-path="{{item.pagePath}}" data-text="{{item.text}}" bindtap="switchTab">
-    <cover-image class="icon" src="{{selected === item.pagePath ? item.selectedIconPath : item.iconPath}}"></cover-image>
-    <cover-view class="text" style="color: {{selected === item.pagePath ? selectedColor : color}}">{{item.text}}</cover-view>
-  </cover-view>
-</cover-view>
+<view class="tab-bar">
+  <view wx:for="{{list}}" wx:key="index" class="tab-bar-item" data-path="{{item.pagePath}}" data-text="{{item.text}}" bindtap="switchTab">
+    <image class="icon" src="{{selected === item.pagePath ? item.selectedIconPath : item.iconPath}}"></image>
+    <view class="text" style="color: {{selected === item.pagePath ? selectedColor : color}}">{{item.text}}</view>
+  </view>
+</view>

+ 3 - 1
mixin/index.js

@@ -4,8 +4,10 @@ moment.locale('zh-cn');
 // 引入全局配置的图片资源地址 
 import {globalImgUrls} from "../utils/config"
 import store from '@/store'
+import {defaultTabBarListConfig} from '@/utils/config.js'
 
-const tabbarPathList=['pages/voice/voice','pages/pricedriven/pricedriven','pages/video/videoList','pages/report/report','pages/question/question']
+// const tabbarPathList=['pages/voice/voice','pages/roadShow/video/list','pages/video/videoList','pages/report/report','pages/question/question']
+const tabbarPathList=defaultTabBarListConfig.map(item=>item.pagePath)
 
 module.exports = {
   watch: {

+ 2 - 2
pages-roadShow/video/search.vue

@@ -75,12 +75,12 @@ export default {
     },
     onShareAppMessage({from,target}) {
         console.log(from,target);
-        let path='/pages-roadShow/video/list?videoId=0'
+        let path='/pages/roadShow/video/list?videoId=0'
         let title='FICC线上路演'
         let imageUrl=''
         if(from=='button'){
             title=target.dataset.item.title
-            path=`/pages-roadShow/video/list?videoId=${target.dataset.item.road_video_id}`
+            path=`/pages/roadShow/video/list?videoId=${target.dataset.item.road_video_id}`
             imageUrl=target.dataset.item.cover_img_url
         }
         return {

+ 11 - 4
pages.json

@@ -79,6 +79,13 @@
 				"navigationBarTitleText": "语音播报",
 				"enablePullDownRefresh": true
 			}
+		},
+		{
+			"path":"pages/roadShow/video/list",
+			"style": {
+				"navigationBarTitleText": "线上路演",
+				"enablePullDownRefresh": true
+			}
 		}
 	],
 	"subPackages":[
@@ -344,10 +351,10 @@
 				"selectedIconPath": "./static/tabbar/report-s.png"
 			},
 			{
-				"pagePath": "pages/pricedriven/pricedriven",
-				"text": "价格驱动",
-				"iconPath": "./static/tabbar/price.png",
-				"selectedIconPath": "./static/tabbar/price-s.png"
+				"pagePath": "pages/roadShow/video/list",
+				"text": "线上路演",
+				"iconPath": "./static/tabbar/roadShow.png",
+				"selectedIconPath": "./static/tabbar/roadShow-s.png"
 			},
 			{
 				"pagePath": "pages/video/videoList",

+ 2 - 2
pages/report/report.vue

@@ -120,9 +120,9 @@ export default {
       tabPathMap: new Map([
         ['report','/pages-report/classify'],
         ['chart','/pages/chart/chart'],
-        ['road','/pages-roadShow/video/list'],
         ['sandbox','/pages-sandTable/sandTable'],
-        ['activity','/pages/activity/activity']
+        ['activity','/pages/activity/activity'],
+        ['pricedriven','/pages/pricedriven/pricedriven']
       ]),
       tabCards: []
     }

+ 99 - 0
pages/roadShow/video/components/noAuth.vue

@@ -0,0 +1,99 @@
+<template>
+  <view class="voice-no-auth">
+        <image class="img" :src="globalImgUrls.activityNoAuth" mode="widthFix"></image>
+		<view style="margin-bottom:15px">您暂无权限查看线上路演</view>
+		<view v-if="info.type==='contact'" style="margin-bottom:15px">若想查看可以联系对口销售</view>
+		<view v-else style="margin-bottom:15px">若想查看可以申请开通</view>
+		<view v-if="info.type==='contact'">
+			{{info.name||''}}:<text @click="handleCall" style="color:#E3B377">{{info.mobile||''}}</text>
+		</view>
+		<view class="global-btn-yellow-change btn" @click="handleApply" v-else style="margin-top:30px">立即申请</view>
+  </view>
+</template>
+
+<script>
+import {apiApplyPermission} from '@/api/user'
+export default {    
+    props: {
+        info:null
+    },
+    watch:{
+        info(){
+            this.handleAutoApply()
+        }
+    },
+    
+    methods: {
+        handleCall(){
+
+            uni.makePhoneCall({
+                phoneNumber: this.info.mobile,
+                success: (result) => {},
+                fail: (error) => {}
+            })
+        },
+
+        handleAutoApply(){
+            if(this.info.type=='contact'&&!this.info.customer_info.has_apply){
+                if(this.info.customer_info.status=='冻结'||(this.info.customer_info.status=='试用'&&this.info.customer_info.is_suspend==1)){
+                    apiApplyPermission({
+                        company_name:this.info.customer_info.company_name,
+                        real_name:this.info.customer_info.name,
+                        source:10,
+                        from_page:'线上路演'
+                    }).then(res=>{
+                        if(res.code===200){
+                            console.log('主动申请成功');
+                        }
+                    }) 
+                }
+            }
+        },
+
+        async handleApply(){
+            await this.checkUserIsBind()
+            const {customer_info}=this.info
+            if(customer_info.has_apply){
+                uni.showToast({
+                  title:'您已提交过申请,请耐心等待',
+                  icon:'none'
+                })
+            }else{
+                if (!customer_info.status || customer_info.status != '流失') {
+                    uni.navigateTo({
+                        url: "/pages-applyPermission/applyPermission?source=10&from_page=线上路演"
+                    })
+                }else{
+                    apiApplyPermission({
+                        company_name:customer_info.company_name,
+                        real_name:customer_info.name,
+                        source:10,
+                        from_page:'线上路演'
+                    }).then(res=>{
+                        uni.navigateTo({url:'/pages-applyPermission/applyResult'})
+                    })
+                }
+            }
+        }
+    }
+}
+</script>
+
+<style lang="scss" scoped>
+.voice-no-auth{
+    padding: 34rpx;
+    text-align: center;
+    font-size: $global-font-size-lg;
+    .img{
+        width: 100%;
+        margin-bottom: 50rpx;
+    }
+    .btn{
+        width: 380rpx;
+        line-height: 70rpx;
+        margin-left: auto;
+        margin-right: auto;
+        margin-top: 40rpx;
+    }
+}
+</style>

+ 461 - 0
pages/roadShow/video/list.vue

@@ -0,0 +1,461 @@
+<template>
+    <view class="video-list-page" v-if="isAuth">
+        <van-sticky style="background: #fff">
+            <view class="flex search-wrap">
+                <view @click="goSearchPage" style="flex:1;margin-right:30rpx" >
+                    <searchBox 
+                        placeholder="关键字搜索" 
+                        :hasRightBtn="false" 
+                        :disabled="true"
+                    ></searchBox>
+                </view>
+                <view class="flex" @click="showFilter=true">
+                    <image style="width:50rpx;height:50rpx" src="@/static/filter-icon.png" mode="aspectFill"/>
+                    <text style="color:#E3B377;font-size:32rpx">筛选</text>
+                </view>
+            </view>
+        </van-sticky>
+        <view class="empty-box" v-if="list.length==0&&finished">
+            <image
+                :src="globalImgUrls.activityNoAuth"
+                mode="widthFix"
+            />
+            <view v-if="videoId!=0&&noShareData">
+                <view>暂无权限查看该视频</view>
+                <view>请刷新页面后重试</view>
+            </view>
+            <view v-else-if="videoId!=0&&!noShareData">
+                <view>该视频不存在</view>
+                <view>请刷新页面后重试</view>
+            </view>
+            <view v-else>暂无数据</view>
+        </view>
+        <view class="list-wrap">
+            <view class="item" v-for="item in list" :key="item.road_video_id">
+                <view class="title-box">
+                    <text class="tag">{{item.chart_permission_name}}</text>
+                    <text class="title">{{item.title}}</text>
+                </view>
+                <button 
+                    class="share-btn" 
+                    open-type="share" 
+                    :data-item="item">
+                    <image class="share-img" src="@/static/share-icon.png" mode="aspectFill"/>
+                </button>
+                <video
+                    autoplay
+                    object-fit="contain"
+                    show-mute-btn
+                    :poster="item.cover_img_url"
+                    :src="item.video_url"
+                    enable-play-gesture
+                    :id="item.road_video_id"
+                    @ended="handleVideoEnd"
+                    v-if="item.road_video_id==curVideoId"
+                ></video>
+                <image @click="handelClickPlay(item)" v-else class="poster" :src="item.cover_img_url" mode="aspectFill" lazy-load/>
+                <view class="time">发布时间:{{item.publish_time}}</view>
+                <view class="user-name">{{item.admin_real_name}}</view>
+            </view>
+        </view>
+
+        <!-- 筛选 -->
+        <van-popup 
+            :show="showFilter" 
+            position="bottom" 
+            :safe-area-inset-bottom="true" 
+            round 
+            @close="showFilter=false"
+        >
+            <view class="filter-wrap" @touchmove.stop>
+                <view class="flex top">
+                    <text style="color:#000">全部筛选</text>
+                    <text style="color:#E3B377" @click="showFilter=false">取消</text>
+                </view>
+                <view class="list-box">
+                    <van-collapse accordion @change="change" :value="active" :border="false">
+                        <van-collapse-item 
+                            :title="item.ClassifyName" 
+                            :name='item.ClassifyName' 
+                            :border="false"
+                            v-for="item in options"
+                            :key="item.ClassifyName"
+                        >
+                            <van-row gutter="5">
+                                <van-col 
+                                    :span="_item.PermissionName.length>7?16:8" 
+                                    v-for="_item in item.Items" 
+                                    :key="_item.PermissionId"
+                                >
+                                    <text 
+                                        :class="['list-item',_item.PermissionId==selectPerId&&'list-item-active']" 
+                                        @click="handleSelectPerItem(_item)"
+                                    >{{_item.PermissionName}}</text>
+                                </van-col>
+                            </van-row>
+                        </van-collapse-item>
+                    </van-collapse>
+                </view>
+            </view>
+        </van-popup>
+
+        <!-- 跳转去提问悬浮按钮 -->
+        <dragButton :existTabBar="true">
+            <navigator url="/pages-question/hasQuestion">
+                <view class="to-question-fixed-box">
+                    <image src="@/static/toquestion-icon.png" mode="widthFix" />
+                    <text>我要提问</text>
+                </view>
+            </navigator>
+        </dragButton>
+    </view>
+    <noAuth :info="noAuthData" v-else/>
+</template>
+<script>
+import {apiRoadShowVideoList,apiRoadShowVideoPlayLog} from '@/api/roadShow'
+import {apiGetSceneToParams,apiUserBindPermission} from '@/api/common'
+import noAuth from './components/noAuth.vue'
+import dragButton from '@/components/dragButton/dragButton.vue'
+export default {
+    components:{
+        noAuth,
+        dragButton
+    },
+    data() {
+        return {
+            showFilter:false,
+            active:'',
+            options:[],
+            selectPerId:0,
+
+            videoId:0,
+            page:1,
+            pageSize:10,
+            finished:false,
+            list:[],
+
+            curVideoId:0,
+            curVideoIns:null,
+
+            isAuth:true,
+            noAuthData:null,
+
+            noShareData:false,//用户从分享进入没有该分享的视频的权限
+        }
+    },
+    onLoad(options){
+        this.init(options)
+        this.getPermissionList()
+    },
+    onShow(){
+        //无权限时刷新列表
+        if(!this.isAuth){
+            this.getList()
+        }
+    },
+    onHide(){
+        this.showFilter=false
+        // this.curVideoId=0
+    },
+    onShareAppMessage({from,target}) {
+        console.log(from,target);
+        let path='/pages/roadShow/video/list?videoId=0'
+        let title='FICC线上路演'
+        let imageUrl=''
+        if(from=='button'){
+            title=target.dataset.item.title
+            path=`/pages/roadShow/video/list?videoId=${target.dataset.item.road_video_id}`
+            imageUrl=target.dataset.item.cover_img_url
+        }
+        return {
+            title:title,
+            path:path,
+            imageUrl:imageUrl
+        }
+    },
+    onPullDownRefresh(){
+        this.videoId=0
+        this.noShareData=false
+        this.selectPerId=0
+        this.page=1
+        this.list=[]
+        this.finished=false
+        this.getList()
+        setTimeout(() => {
+            uni.stopPullDownRefresh()
+        }, 1500)
+    },
+    onReachBottom() {
+        if(this.finished) return
+        this.page++
+        this.getList()
+    },
+    methods: {
+        async init(options){
+            if(options.scene){
+                const resScene=await apiGetSceneToParams({scene_key:options.scene})
+                if(resScene.code===200){
+                    const obj=JSON.parse(resScene.data)
+                    this.videoId=obj.videoId||0
+                }
+            }else{
+                this.videoId=options.videoId||0
+            }
+            this.getList()
+        },
+
+        goSearchPage(){
+            uni.navigateTo({
+                url: '/pages-roadShow/video/search',
+            });
+        },
+
+        change(e){
+            this.active=e.detail
+        },
+
+        //点击分类某项
+        handleSelectPerItem(item){
+            if(this.selectPerId==item.PermissionId){
+                this.selectPerId=0
+            }else{
+                this.selectPerId=item.PermissionId
+            }
+            
+            this.videoId=0//重置掉分享进入的状态
+            this.noShareData=false
+            this.curVideoId=0
+            this.page=1
+            this.list=[]
+            this.finished=false
+            this.getList()
+            this.showFilter=false
+        },
+
+        async getList(){
+            const res=await apiRoadShowVideoList({
+                page_index:Number(this.page),
+                page_size:Number(this.pageSize),
+                video_id:Number(this.videoId),
+                chart_permission_id:Number(this.selectPerId)
+            })
+            if(res.code===200){
+                let arr=res.data.list||[]
+                this.list=[...this.list,...arr]
+                if(res.data.paging.is_end){
+                    this.finished=true
+                }
+                this.isAuth=true
+            }else if(res.code===403){
+                //无权限用户
+                this.isAuth=false
+                this.noAuthData=res.data
+            }else if(res.code===4001){
+                // 用户从分享进入没有这个视频的权限
+                this.noShareData=true
+                this.finished=true
+            }
+        },
+
+        //获取筛选项
+        async getPermissionList(){
+            const res=await apiUserBindPermission()
+            if(res.code===200){
+                const result = res.data.permission_list||[];
+                this.options = result.map(item=>{
+                    let obj = {};
+                    obj.ClassifyName = item.classify_name;
+                    obj.Items = item.list.map(_item=>{
+                        return {PermissionId:_item.chart_permission_id,PermissionName:_item.chart_permission_name};
+                    })
+                    return obj;
+                })
+            }
+        },
+
+        handelClickPlay(item){
+            this.curVideoId=item.road_video_id
+            setTimeout(() => {
+                this.curVideoIns=uni.createVideoContext(this.curVideoId.toString())
+            }, 300);
+            // 记录播放
+            apiRoadShowVideoPlayLog({video_id:Number(item.road_video_id)}).then(res=>{
+                if(res.code===200){
+                    console.log('视频埋点成功');
+                }
+            })
+        },
+
+        //视频播放结束
+        handleVideoEnd(){
+            // 此处因为如果不调用退出全屏方法 安卓和ios页面均会表现异常,安卓横屏不恢复竖屏,ios底部tabbar渲染异常
+            this.curVideoIns.exitFullScreen()
+            setTimeout(() => {
+                this.curVideoId=0
+                this.curVideoIns=null
+            }, 200);
+        }
+    },
+}
+</script>
+
+<style lang='scss'>
+.search-wrap .van-search{
+    padding: 0 !important;
+}
+
+.video-list-page{
+    .filter-wrap{
+        .van-cell__title, .van-cell__value{
+            flex: none !important;
+        }
+        .van-cell:after{
+            border: none !important;
+        }
+        .van-cell__title{
+            font-size: 14px;
+        }
+        .van-hairline--top:after{
+            border-top-width: 0 !important;
+        }
+    }
+}
+</style>
+<style lang="scss" scoped>
+.video-list-page{
+    .search-wrap {
+        background-color: #fff;
+        padding: 30rpx 34rpx;
+        align-items: center;
+        .menu-icon{
+            width: 52rpx;
+            height: 40rpx;
+            display: block;
+            flex-shrink: 0;
+            margin-left: 30rpx;
+        }
+    } 
+    
+    .list-wrap{
+        .item{
+            border-top: 10rpx solid #f9f9f9;
+            padding: 30rpx 34rpx;
+            position: relative;
+            .title-box{
+                padding-right: 40rpx;
+            }
+            .share-btn{
+                position: absolute;
+                top: 34rpx;
+                right: 34rpx;
+                background-color: transparent;
+                width: 36rpx;
+                height: 36rpx;
+                line-height: 1;
+                padding: 0;
+                &::after{
+                    border: none;
+                }
+            }
+            .share-img{
+                width: 32.5rpx;
+                height: 32rpx;
+            }
+            .tag{
+                color: #E4B478;
+                background-color: #333;
+                padding: 5rpx 20rpx;
+                border-radius: 20rpx;
+                font-size: 24rpx;
+                margin-right: 26rpx;
+                max-width: 250rpx;
+                overflow: hidden;
+                text-overflow: ellipsis;
+                white-space: nowrap;
+                display: inline-block;
+                vertical-align: middle;
+            }
+            .title{
+                font-size: 32rpx;
+                color: #000;
+                vertical-align: middle;
+            }
+            video{
+                width: 100%;
+                height: 400rpx;
+                margin: 30rpx 0 20rpx 0;
+                border-radius: 20rpx;
+            }
+            .poster{
+                width: 100%;
+                height: 400rpx;
+                margin: 30rpx 0 20rpx 0;
+                border-radius: 20rpx;
+                position: relative;
+                &::after{
+                    content:'';
+                    display: block;
+                    position: absolute;
+                    width: 120rpx;
+                    height: 120rpx;
+                    top: 50%;
+                    left: 50%;
+                    transform: translate(-50%,-50%);
+                    background-image: url('@/static/video-play-btn.png');
+                    background-size: cover;
+                }
+            }
+            .time{
+                font-size: 28rpx;
+                color: #999;
+                display: inline-block;
+            }
+            .user-name{
+                float: right;
+                font-size: 28rpx;
+                color: #999;
+            }
+        }
+    }
+
+    .empty-box{
+        text-align: center;
+        font-size: 32rpx;
+        color: #999;
+        padding-top: 150rpx;
+        image{
+            width: 80vw;
+            margin-bottom: 57rpx;
+        }
+    }
+}
+
+.filter-wrap{
+    background-color: #fff;
+    padding-top: 53rpx;
+    padding-bottom: 100rpx;
+    .top{
+        font-size: 32rpx;
+        justify-content: space-between;
+        margin-bottom: 40rpx;
+        padding: 0 34rpx;
+    }
+    .list-box{
+        min-height: 30vh;
+        max-height: 60vh;
+        .list-item{
+            display: block;
+            margin: 10rpx;
+            height: 76rpx;
+            line-height: 76rpx;
+            color: #000;
+            background: #F6F6F6;
+            border-radius: 4px 4px 4px 4px;
+            text-align: center;
+        }
+        .list-item-active{
+            background-color: #FAEEDE;
+        }
+    }
+}
+</style>

BIN
static/tabbar/roadShow-s.png


BIN
static/tabbar/roadShow.png


+ 5 - 5
utils/config.js

@@ -47,11 +47,11 @@ const defaultTabBarListConfig=[
         selectedIconPath: "../static/tabbar/report-s.png",
     },
 	{
-		key: 'pricedriven',
-		pagePath: "pages/pricedriven/pricedriven",
-		text: "价格驱动",
-		iconPath: "../static/tabbar/price.png",
-		selectedIconPath: "../static/tabbar/price-s.png"
+		key: 'road',
+		pagePath: "pages/roadShow/video/list",
+		text: "线上路演",
+		iconPath: "../static/tabbar/roadShow.png",
+		selectedIconPath: "../static/tabbar/roadShow-s.png"
 	},
     {
         key: "video",

+ 1 - 1
utils/request.js

@@ -96,7 +96,7 @@ const http=(url,params,method)=>{
 			method:method,
 			header:{
 				Authorization:store.state.user.token,
-				version:'yb11.0'
+				version:'yb11.1'
 			},
 			success(e) {
 				// 接口404