<template> <view class="container industry-content" id="industry-content"> <view v-if="haveData"> <view class="content-top"> <view class="top-bg"> <!-- 详情封面图 --> <image :src="industryVideo.DetailImgUrl" class="industry-video-poster" v-show="industryVideo.Id && industryVideo.DetailImgUrl && !havePlayed" @click="handelVideoPlay"></image> <!-- 视频 --> <video :src="industryVideo.ResourceUrl" class="industry-video" id="industry-video" v-show="industryVideo.ResourceUrl && (havePlayed || !industryVideo.DetailImgUrl)" controls></video> <view class="top-bg-title" :style="{ height: industryVideo.Id ? '70rpx' : '99rpx', 'background-color': industryVideo.Id ? 'white' : '#d1ebff' }">产业赛道布局于{{ layoutTime }}</view> </view> <!-- industryVideo.ResourceUrl -- 视频url --> <view class="top-box" :style="{ top: industryVideo.Id ? '418rpx' : '99rpx' }"> <view class="top-tab-cont"> <view class="tab-cont"> <scroll-view scroll-x="true" scroll-with-animation class="scroll-tab" :scroll-into-view="'_' + tabIndex"> <block v-for="(item, index) in tabBars" :key="item.CategoryId"> <view :id="'_' + index" class="scroll-tab-item" :class="{ active: tabAct_id == item.CategoryId }" @click.stop="toggleTab(item, index)"> {{ item.MatchTypeName }} <image src="https://hzchart.oss-cn-shanghai.aliyuncs.com/cygx/czbk/border_act.png" mode="" class="border_act" v-if="tabAct_id == item.CategoryId"></image> <text class="reg-hint" v-if="item.IsRed"></text> </view> </block> </scroll-view> </view> <view class="lucency" v-if="tabBars.length > 6"></view> </view> </view> </view> <view class="collect-ul" :style="{ 'padding-top': industryVideo.ResourceUrl ? '528rpx' : '210rpx' }"> <!-- 其他tab --> <block v-show="tabAct_id !== 99999"> <view class="collect-ltem" v-for="(item, index) in collectList" :key="index" @click="goDetail(item, index)"> <view class="item-left"> <text class="title text_twoLine" >{{ item.Title }} <text class="reg-text" v-if="item.IsRed"></text> </text> <text class="text_twoLine desc">{{ item.PublishDate }}</text> </view> <u-icon name="arrow-right" color="#BDBDBD" size="34"></u-icon> </view> <u-loadmore :status="status" icon-type="flower" :load-text="loadText" margin-top="20" v-if="totalPage > 1 && tabAct_id !== 99999" /> </block> <!-- 时间线 --> <block v-if="tabAct_id === 99999"> <view class="time-line"> <view class="line-item" v-for="(item, index) in timeLine" :key="index" @click="goDetailFromTimeLine(item, index)"> <view class="time">{{ item.date }}</view> <view class="content" v-if="item.Content.length"> <text class="content-reg" v-if="item.IsRed"></text> <rich-text class="rich-text" :style="{ height: item.isExpand ? 'auto' : richTextHeight + 'px' }" :data-index="index" :class="{ expand: item.isExpand }" :nodes="item.Content"> </rich-text> <view class="expan-btn" :class="{ pos: !item.isExpand }" @click="handleExpand(item, index)" v-if="item.isShowBtn">{{ item.isExpand ? "收起" : "展开" }}</view> </view> <view class="title" v-else>{{ item.Title }}</view> </view> <view v-show="loadTimeLine" class="loadTimeLine"></view> <u-loadmore :status="status" icon-type="flower" :load-text="loadText" margin-top="20" v-if="totalPage > 1 && tabAct_id === 99999" /> </view> </block> </view> </view> <view class="nodata" v-else> <image src="https://hzchart.oss-cn-shanghai.aliyuncs.com/cygx/czbk/act_search.png" mode="" class="nodata_ico"></image> <text>暂时没有报告的内容</text> </view> <freeCharge class="free-charge" :isShowFreeBtn="isShowFree" /> <!-- 权限弹窗 --> <modalDialog :isShowhasPermission="isShowhasPermission" :applyForIsShow="applyForIsShow" :jurisdictionList="jurisdictionList" :hasPermission="hasPermission" /> </view> </template> <script> import { Mine, Home } from "@/config/api.js"; import { Reports } from "@/config/api.js"; import { Throttle } from "@/config/util.js"; import freeCharge from "@/components/freeCharge"; import modalDialog from "@/components/modalDialog.vue"; let app = getApp({ allowDefault: true }); export default { data() { return { tabAct_id: "", tabBars: [], industrialManagementId: "", layoutTime: "", refresh: false, //正在下拉 page_no: 1, pageSize: 10, categoryId: "", collectList: [], isShow: false, haveData: true, status: "loadmore", loadText: { loadmore: "上拉加载更多", loading: "加载中", nomore: "已经到底了", }, totalPage: "", toggleTabIndex: 0, titleReport: "", pcTabActive: "", industryVideo: {}, authInfo: {}, havePlayed: false, isShowhasPermission: false, // 联系销售的提交申请 applyForIsShow: false, // 提交申请 jurisdictionList: {}, hasPermission: "", //权限 timeLine: [], //时间线数据 mockTimeLine: [ { date: "不重要", Content: "<p>hello,world</p><p>hello,world</p><p>hello,world</p>", }, //第一项是为了获取当前手机下,三行是多少相对高度 ], loadTimeLine: false, //时间线的遮罩 richTextHeight: 1000, //晨会富文本最大高度 }; }, onLoad(option) { this.industrialManagementId = option.id; this.tabAct_id = option.tab; this.toArticleCategoryList(); }, onShow() { this.$store.dispatch("statistics", { PageType: "IndustryList", IndustrialManagementId: this.industrialManagementId }); }, components: { freeCharge, modalDialog, }, watch: { //监听tabs的变化 tabAct_id: { handler(newVal) { this.tabBars.forEach((item) => { if (item.CategoryId == newVal) { this.$store.commit("setRouterReport", item.MatchTypeName); } }); if (newVal) { this.page_no = 1; this.collectList = []; this.getCollectList(); } }, immediate: true, }, }, methods: { //tabs切换事件 toggleTab(item, index) { this.toggleTabIndex = index; if (this.tabAct_id !== item.CategoryId) { this.tabAct_id = item.CategoryId; this.pageNum = 1; this.timeLine = []; this.totalPage = ""; uni.pageScrollTo({ scrollTop: 0, duration: 0, }); } }, toArticleCategoryList() { Reports.toArticleCategoryList({ IndustrialManagementId: this.industrialManagementId, ShowTimeLine: 1, }).then((res) => { if (res.Ret == 200) { uni.setNavigationBarTitle({ title: res.Data.IndustryName, }); this.titleReport = res.Data.IndustryName; this.layoutTime = res.Data.LayoutTime; this.industryVideo = res.Data.IndustryVideo; this.authInfo = res.Data.AuthInfo; if (res.Data.List) { this.tabAct_id = res.Data.List[0].CategoryId; this.tabBars = res.Data.List; } } }); }, /* 获取列表 */ getCollectList() { //just for test if (this.tabAct_id === 99999) { Reports.getArticleList({ PageSize: this.pageSize, CurrentIndex: this.page_no, CategoryId: 99999, IndustrialManagementId: this.industrialManagementId, }).then((res) => { if (res.Ret === 200) { this.loadTimeLine = true; this.status = this.page_no < res.Data.Paging.Pages ? "loadmore" : "nomore"; this.totalPage = res.Data.Paging.Pages; let list = res.Data.List || []; list = list.map((item) => { let temp = item; temp.date = item.PublishTime.split(" ")[0]; if (item.Content.length) { temp.isExpand = true; temp.isShowBtn = true; } return temp; }); if (this.page_no === 1) { this.timeLine = list; this.haveData = this.timeLine.length ? true : false; if (this.refresh) { uni.stopPullDownRefresh(); this.refresh = false; } } else { this.timeLine = this.timeLine.concat(list); } } this.timeLine.unshift(this.mockTimeLine[0]); //在获取高度前把所有的晨会展开,收起的话无法获取正确高度 this.timeLine.forEach((item) => { if (item.Content.length) { item.isExpand = true; item.isShowBtn = true; } }); setTimeout(() => { this.getConentsHeight(); }, 0); }); return; } Reports.getArticleList({ PageSize: this.pageSize, CurrentIndex: this.page_no, CategoryId: this.tabAct_id, IndustrialManagementId: this.industrialManagementId, }).then((res) => { if (res.Ret === 200) { this.status = this.page_no < res.Data.Paging.Pages ? "loadmore" : "nomore"; this.totalPage = res.Data.Paging.Pages; //总页数 if (this.page_no === 1) { this.pcTabActive = res.Data.ChartPermissionId; this.collectList = res.Data.List || []; this.haveData = this.collectList.length ? true : false; if (this.refresh) { uni.stopPullDownRefresh(); this.refresh = false; } } else { this.collectList = this.collectList.concat(res.Data.List); } } }); }, async goDetail(item, index) { /* 无需授权且已绑定 检验是或否有权限 */ await this.$store.dispatch("checkHandle"); if (!this.$store.state.isAuth && !this.$store.state.isBind) { // 已授权已绑定 if (item.SubCategoryName === "路演精华") { //跳转路演精华 uni.navigateTo({ url: "/reportPages/roadEssence/roadEssence?id=" + item.ArticleId, }); } else { uni.navigateTo({ url: "/pageMy/reportDetail/reportDetail?id=" + item.ArticleId, }); } } }, // 视频播放权限判断 handelVideoPlay() { this.$store.commit("setRouterReport", "资源包详情页"); if (!this.$store.state.isAuth && !this.$store.state.isBind) { if (this.authInfo.HasPermission == 1) { this.playVideo(); } else { this.hasPermission = this.authInfo.HasPermission; this.jurisdictionList.ActivityId = this.industryVideo.Id; this.jurisdictionList.isAudioVideo = 3; if (this.hasPermission == 2) { this.jurisdictionList.SellerMobile = this.authInfo.SellerMobile; this.jurisdictionList.SellerName = this.authInfo.SellerName; this.jurisdictionList.PopupMsg = this.authInfo.PopupMsg; this.isShowhasPermission = true; } else if (this.hasPermission == 3 || this.hasPermission == 4 || this.hasPermission == 5) { this.jurisdictionList.PopupMsg = this.authInfo.PopupMsg; this.applyForIsShow = true; } } } else { this.$store.dispatch("checkHandle"); } }, // 播放视频 playVideo() { const query = uni.createSelectorQuery().in(this); query .select("#industry-video") .context((data) => { data.context.play(); this.handelVideoBindplay(); setTimeout(() => { this.havePlayed = true; }, 10); }) .exec(); }, // async handelVideoBindplay() { const res = await Home.microAideoHistoryAdd({ VideoId: this.industryVideo.Id, SourceType: 1, PageRouter: this.$store.state.pageRouterReport }); }, //展开收起晨会内容 handleExpand(item, index) { item.isExpand = !item.isExpand; this.timeLine.splice(index, 1, item); }, //获取所有晨会内容的高度并决定是否显示展开收起按钮 getConentsHeight() { const query = wx.createSelectorQuery(); query.selectAll(".rich-text").boundingClientRect(); query.exec((res) => { //根据timeLine的第一项确定当前手机三行文字的高度 const standardHeight = res[0][0].height; this.richTextHeight = standardHeight; res[0].forEach((item) => { let temp = this.timeLine[item.dataset.index]; //超过这个高度的,需要显示展开/收起按钮 if (item.height > standardHeight) { temp.isExpand = false; temp.isShowBtn = true; } else { temp.isExpand = true; temp.isShowBtn = false; } }); //然后把timeLine的第一项扔掉 this.timeLine.shift(); this.loadTimeLine = false; }); }, async goDetailFromTimeLine(item, index) { if (item.Content.length !== 0) return; await this.$store.dispatch("checkHandle"); if (!this.$store.state.isAuth && !this.$store.state.isBind) { // 已授权已绑定 if (item.SubCategoryName === "路演精华") { //跳转路演精华 uni.navigateTo({ url: "/reportPages/roadEssence/roadEssence?id=" + item.Id, }); } else { uni.navigateTo({ url: "/pageMy/reportDetail/reportDetail?id=" + item.Id, }); } } }, getNode(content, isExpand) { return `<div style='-webkit-line-clamp: ${isExpand ? 9999 : 3};-webkit-box-orient: vertical;display: -webkit-box;overflow: hidden;text-overflow: ellipsis;'>${content}</div>`; }, }, /* 触底 */ onReachBottom: Throttle(function () { if (this.status === "nomore") return; this.status = "loading"; this.page_no++; if (this.tabAct_id) { this.getCollectList(); } }), /* 下拉刷新 */ onPullDownRefresh: Throttle(function () { if (this.tabAct_id) { this.page_no = 1; this.refresh = true; this.getCollectList(); } }), /** * 用户点击分享 */ onShareAppMessage: function (res) { return { title: this.isHorzMobile ? "好友向您推荐此内容,上传名片享查研观向免费月卡!" : this.titleReport, path: "/reportPages/IndustryReport/IndustryReport?id=" + this.industrialManagementId + "&tab=" + this.tabAct_id + "&tabs=" + this.pcTabActive, success: (res) => {}, fail: (err) => {}, }; }, }; </script> <style lang="scss"> .industry-content { background-color: #f7f7f7; // height: 100vh; .top-bg { position: fixed; top: 0; left: 0; width: 100%; z-index: 100; background-color: white; text-align: center; .industry-video-poster { border-radius: 8rpx 8rpx 0 0; height: 340rpx; width: 728rpx; } .industry-video { height: 340rpx; width: 728rpx; } .top-bg-title { height: 99rpx; color: #2c83ff; background-color: #d1ebff; font-size: 28rpx; display: flex; align-items: center; justify-content: center; } .test { position: relative; span { position: absolute; left: 30rpx; bottom: 30rpx; color: white; } } } .top-box { position: fixed; width: 100%; top: 99rpx; left: 0; z-index: 100; } .top-tab-cont { .lucency { position: absolute; top: 0; right: 0; width: 32px; height: 30px; opacity: 0.9; background-color: #fff; } .tab-cont { padding: retu; padding: 30rpx 26rpx 0; background-color: #fff; font-size: 32rpx; box-shadow: 0 3rpx 6rpx rgba(187, 216, 255, 0.2); .scroll-tab { width: 100%; white-space: nowrap; } .scroll-tab-item { // flex-grow: 1; text-align: center; display: inline-block; padding: 0rpx 8rpx 30rpx 8rpx; margin-right: 60rpx; border-bottom: 8rpx solid transparent; position: relative; &:last-child { margin-right: 0; } &.active { border-bottom: none; color: #2c83ff; font-weight: 700; } .border_act { width: 100%; height: 8rpx; position: absolute; bottom: 0; left: 0; } .reg-hint { position: absolute; top: 0rpx; right: -10rpx; width: 14rpx; height: 14rpx; background-color: #ff0000; border-radius: 50%; } } } } .collect-ul { // margin-top: 30rpx;s padding-top: 210rpx; // padding-top: 4rpx; .collect-ltem { display: flex; padding: 30rpx 34rpx; background: #fff; margin-bottom: 4rpx; align-items: center; justify-content: space-between; .title { position: relative; max-width: 625rpx; color: #4a4a4a; font-size: 34rpx; padding-left: 28rpx; .reg-text { position: absolute; top: 15rpx; left: 0rpx; width: 14rpx; height: 14rpx; background-color: #ff0000; border-radius: 50%; z-index: 9; } } .desc { margin-top: 17rpx; padding-left: 28rpx; width: 625rpx; color: #999; } } .time-line { margin-top: 15rpx; padding: 30rpx 40rpx 50rpx 40rpx; min-height: calc(100vh - 190rpx); background-color: #ffffff; position: relative; .loadTimeLine { top: 0; bottom: 0; left: 0; right: 0; position: absolute; background-color: #fff; z-index: 6; } .line-item { position: relative; padding: 0 0 50rpx 40rpx; /* border-left:1rpx solid #DAE9FD; */ &:last-child { padding-bottom: 0; &::after { height: calc(100% - 25rpx); } } &:first-child { .time { &::after { background-color: #3385ff; } } } &::before, &::after { position: absolute; content: ""; } &::before { width: 24rpx; height: 24rpx; background-color: #dae9fd; z-index: 1; left: 0; top: 27rpx; transform: translate(-50%, -50%); border-radius: 50%; } &::after { top: 17rpx; left: 0; width: 1rpx; height: calc(100%); background-color: #dae9fd; z-index: 2; } .time { width: 245rpx; height: 55rpx; text-align: center; line-height: 45rpx; padding: 5rpx 20rpx; background-color: #f5f9ff; border-radius: 64rpx; color: #5181c9; font-size: 32rpx; margin-bottom: 20rpx; position: relative; &::before, &::after { position: absolute; content: ""; left: -36rpx; top: 27rpx; width: 24rpx; height: 1rpx; background-color: #dae9fd; z-index: 1; } &::after { left: -40rpx; top: 27rpx; width: 12rpx; height: 12rpx; border-radius: 50%; transform: translate(-50%, -50%); background-color: #9dc5ff; z-index: 3; } } .content { color: #666666; position: relative; .rich-text { overflow: hidden; text-overflow: ellipsis; text-align: justify; display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; position: relative; &.expand { -webkit-line-clamp: 999; height: auto; } } .expan-btn { color: #2c83ff; text-align: right; &.pos { padding: 0 0 0 40rpx; background-color: rgba(255, 255, 255, 0.882); position: absolute; right: 0; bottom: 0; } } .content-reg { position: absolute; top: 10rpx; left: -20rpx; width: 14rpx; height: 14rpx; background-color: #ff0000; border-radius: 50%; } } .title { color: #3385ff; } } } } } #industry-content { .industry-video-module { .global-video-box { .video-content { top: 400rpx !important; } .close-icon { top: 330rpx !important; } } } } </style>