liyubing

feat(广告): 冠名广告、视频广告、长通栏广告 和 顶部长通栏广告 大图卡 投放逻辑

... ... @@ -12,6 +12,8 @@ export class ContentConstants {
* 2:直播
*/
static readonly TYPE_LIVE: string = "2";
static readonly TYPE_FOUR: string = "4";
/**
* 5:专题详情
*/
... ...
... ... @@ -100,6 +100,9 @@ export class ProcessUtils {
case ContentConstants.TYPE_LIVE:
ProcessUtils.gotoLive(content)
break
case ContentConstants.TYPE_FOUR:
ProcessUtils.gotoDefaultWeb(content);
break
case ContentConstants.TYPE_AUDIO:
ProcessUtils.gotoAudio(content)
break;
... ...
... ... @@ -80,4 +80,6 @@ export interface ContentDTO {
commentInfo?: commentInfo
//底部导航栏 id(用于频道跳转)
bottomNavId:string;
// 链接类型: 0:无链接;1:内链(文章);2:外链
openType:string
}
\ No newline at end of file
... ...
... ... @@ -21,7 +21,7 @@ export struct CardMediaInfo {
Row() {
Image($r('app.media.card_play'))
.mediaLogo()
if(this.contentDTO.videoInfo!=null){
if (this.contentDTO.videoInfo != null) {
Text(DateTimeUtils.getFormattedDuration(this.contentDTO.videoInfo.videoDuration * 1000))
.mediaText()
}
... ... @@ -30,7 +30,7 @@ export struct CardMediaInfo {
// liveInfo.liveState 直播新闻-直播状态 wait待开播running直播中end已结束cancel已取消paused暂停
// 显示直播信息
Row() {
if(this.contentDTO.liveInfo.liveState === 'wait') {
if (this.contentDTO.liveInfo.liveState === 'wait') {
Image($r('app.media.card_wait'))
.mediaLogo()
Text('预约')
... ... @@ -45,7 +45,7 @@ export struct CardMediaInfo {
.mediaLogo()
Text('回看')
.mediaText()
} else if(this.contentDTO.liveInfo.liveState === 'end' && this.contentDTO.liveInfo
} else if (this.contentDTO.liveInfo.liveState === 'end' && this.contentDTO.liveInfo
.replayUri) {
// Image($r('app.media.card_live'))
// .mediaLogo()
... ... @@ -69,6 +69,15 @@ export struct CardMediaInfo {
Text(DateTimeUtils.getFormattedDuration(this.contentDTO.voiceInfo.voiceDuration * 1000))
.mediaText()
}
} else if (this.contentDTO.objectType === '4') {//广告标签
Text($r('app.string.comp_advertisement'))
.fontSize('10fp')
.fontColor($r('app.color.white'))
.width(28)
.height(16)
.backgroundColor('#4D000000')
.borderRadius(3)
.textAlign(TextAlign.Center)
}
}
.margin(6)
... ...
... ... @@ -20,14 +20,12 @@ export struct CardAdvBigImageComponent {
aboutToAppear(): void {
console.error('ZZZXXXXX', '----大图卡----aboutToAppear-----')
}
aboutToDisappear(): void {
console.error('ZZZXXXXX', '---大图卡-----aboutToDisappear-----')
}
build() {
... ...
... ... @@ -25,8 +25,6 @@ export struct CardAdvGanMiComponent {
aboutToAppear(): void {
console.error('ZZZXXXXX', '--冠名广告------aboutToAppear-----')
let extraData = this.compDTO.matInfo.extraData
let labelDTO = JSON.parse(extraData) as AdvExtraData
this.advExtraData = labelDTO
... ... @@ -37,7 +35,6 @@ export struct CardAdvGanMiComponent {
aboutToDisappear(): void {
console.error('ZZZXXXXX', '--冠名广告------aboutToDisappear-----')
}
build() {
... ...
... ... @@ -26,14 +26,12 @@ export struct CardAdvLongImageComponent {
aboutToAppear(): void {
console.error('ZZZXXXXX', '--长通栏广告 和 顶部长通栏广告------aboutToAppear-----')
this.haveTitle = this.compDTO.matInfo.advSubType === CompStyle.Card_Adv_7;
}
aboutToDisappear(): void {
console.error('ZZZXXXXX', '--长通栏广告 和 顶部长通栏广告------aboutToDisappear-----')
}
build() {
... ... @@ -42,7 +40,7 @@ export struct CardAdvLongImageComponent {
//新闻标题
if(this.haveTitle ){
Text(this.compDTO.matInfo.advTitle).bottomTextStyle().margin({ bottom: 8, })
Text(this.compDTO.matInfo.advTitle).width('100%').bottomTextStyle().margin({ bottom: 8, })
}
//长图
... ...
... ... @@ -23,7 +23,6 @@ export struct CardAdvSmallImageComponent {
aboutToAppear(): void {
console.error('ZZZXXXXX', '----小图卡----aboutToAppear-----')
// 计算标题文本行数
let screenWith = DisplayUtils.getDeviceWidth();
screenWith = screenWith * 0.62
... ... @@ -33,7 +32,6 @@ export struct CardAdvSmallImageComponent {
aboutToDisappear(): void {
console.error('ZZZXXXXX', '---小图卡-----aboutToDisappear-----')
}
build() {
... ...
... ... @@ -22,12 +22,10 @@ export struct CardAdvThreeImageComponent {
aboutToAppear(): void {
console.error('ZZZXXXXX', '---三图卡-----aboutToAppear-----')
}
aboutToDisappear(): void {
console.error('ZZZXXXXX', '----三图卡----aboutToDisappear-----')
}
build() {
... ...
... ... @@ -22,8 +22,6 @@ export struct CardAdvVideoComponent {
@State contentDTO: ContentDTO = {} as ContentDTO
aboutToAppear(): void {
console.error('ZZZXXXXX', '--视频广告------aboutToAppear-----')
// this.contentDTO.objectType = '1'
// this.contentDTO.videoInfo = { videoDuration: 1000 } as VideoInfoDTO
... ... @@ -31,7 +29,6 @@ export struct CardAdvVideoComponent {
aboutToDisappear(): void {
console.error('ZZZXXXXX', '---视频广告-----aboutToDisappear-----')
}
build() {
... ...
... ... @@ -21,7 +21,6 @@ export struct CardAdvVideoExComponent {
aboutToAppear(): void {
console.error('ZZZXXXXX', '--展会广告------aboutToAppear-----')
let extraData = this.compDTO.matInfo.extraData
let labelDTO = JSON.parse(extraData) as AdvExtraData
... ... @@ -30,7 +29,6 @@ export struct CardAdvVideoExComponent {
aboutToDisappear(): void {
console.error('ZZZXXXXX', '----展会广告----aboutToDisappear-----')
}
build() {
... ...
... ... @@ -180,7 +180,7 @@ struct CarouselLayout01CardView {
})
Column() {
// 这里用于展示轮播图右上角信息,这里只对直播类型的展示
if (this.item.objectType === '2') {
if (this.item.objectType === '2' || this.item.objectType ==='4') {
CardMediaInfo({ contentDTO: this.item })
.width(CommonConstants.FULL_PARENT)
}
... ...
... ... @@ -246,6 +246,7 @@ export struct PageComponent {
this.pageModel.groupId = this.pageId;
this.pageModel.channelId = this.channelId;
this.pageModel.currentPage = 1;
this.pageModel.pageTotalCompSize = 0;
PageHelper.getInitData(this.pageModel, this.pageAdvModel)
}
}
... ...
... ... @@ -194,6 +194,7 @@ export struct SearchResultContentComponent{
isSearch: true,
publishTimestamp:"",
bottomNavId:'',
openType:''
}
this.data.push(contentDTO)
... ...
import { CompDTO, ContentDTO, PageDTO, PageInfoDTO } from 'wdBean';
import { CompStyle, ViewType } from 'wdConstant/Index';
import { CollectionUtils, DateTimeUtils, Logger, NetworkUtil } from 'wdKit';
import { CollectionUtils, DateTimeUtils, Logger, NetworkUtil, StringUtils } from 'wdKit';
import { closeRefresh } from '../utils/PullDownRefresh';
import PageModel from './PageModel';
import PageViewModel from './PageViewModel';
... ... @@ -9,6 +9,7 @@ import { CompAdvBean } from 'wdBean/src/main/ets/bean/adv/AdvsRuleBean';
import PageAdModel from './PageAdvModel';
import { ArrayList } from '@kit.ArkTS';
import { WDViewDefaultType } from '../components/view/EmptyComponent';
import { CompAdvMatInfoBean } from 'wdBean/src/main/ets/bean/adv/CompAdvInfoBean';
const TAG = 'PageHelper';
... ... @@ -21,6 +22,7 @@ export class PageHelper {
*/
async refreshUI(pageModel: PageModel, pageAdvModel: PageAdModel) {
pageModel.loadStrategy = 2
pageModel.pageTotalCompSize = 0;
this.getPageInfo(pageModel, pageAdvModel)
}
... ... @@ -147,7 +149,7 @@ export class PageHelper {
* 处理页面中的广告组件信息
* @param pageDto
*/
private handlePageCompAdvPostion(pageCompList: ArrayList<CompDTO>, pageDto: PageDTO) {
private handlePageCompAdvPostion(pageCompList: ArrayList<CompDTO>, pageModel: PageModel, pageDto: PageDTO) {
let compAdvList = pageDto.compAdList
... ... @@ -159,6 +161,7 @@ export class PageHelper {
flag = false
}
let pageCompSize = pageCompList.length // 信息流组件业务数量
console.error("ZZZXXXXX", " start--->" + pageCompSize);
... ... @@ -167,9 +170,11 @@ export class PageHelper {
}
if (flag) {
let bannerAdvIndex = 0; // banner组件展示数据投放
let layoutAdvIndex = 0; //稿件投放统计
// 升序排序
compAdvList.sort((a: CompAdvBean, b: CompAdvBean) => a.slotInfo.position - b.slotInfo.position)
console.error("ZZZXXXXX", " 排序后的广告--->" + JSON.stringify(compAdvList));
// console.error("ZZZXXXXX", " 排序后的广告--->" + JSON.stringify(compAdvList));
//当前日期
let serverTimeLong: number = DateTimeUtils.getTimeStamp();
for (let advBean of compAdvList) {
... ... @@ -192,14 +197,91 @@ export class PageHelper {
// 插入轮播组件的广告
if (4 == advSubType) {
let position = slotInfo.position - 1;
// 检测newCompList 集合中是否有轮播组件资源
let adCompId = slotInfo.compId;
if (!StringUtils.isEmpty(adCompId)) {
for (let compBean of pageCompList) {
if (StringUtils.isEmpty(compBean.id)) {
continue
}
let compId = compBean.id.toString();
//匹配组件
if (adCompId == compId) {
// 运营位数据
let dataList = compBean.operDataList;
if (dataList != null) {
// 数组转成 ArrayList
let changeArrayList = (dataList: ContentDTO[]) => {
let compOperData: ArrayList<ContentDTO> = new ArrayList()
for (let dataListBean of dataList) {
compOperData.add(dataListBean)
}
return compOperData
}
let compOperData = changeArrayList(dataList)
// 轮播组件广告数据转 业务信息
let changeContentDTO = (matInfo: CompAdvMatInfoBean) => {
let advContentBean: ContentDTO = {} as ContentDTO;
advContentBean.newsTitle = matInfo.advTitle
advContentBean.objectType = matInfo.advType == "0" ? matInfo.advType : "4"
advContentBean.coverUrl = matInfo.matImageUrl[0]
advContentBean.linkUrl = matInfo.linkUrl
advContentBean.openType = matInfo.linkType
advContentBean.corner = ''
return advContentBean
}
let advContentBean = changeContentDTO(matInfo)
let dataListSize = dataList.length;
if (position < dataListSize) {
//dataList.add(position + bannerAdvIndex, advContentBean);
compOperData.insert(advContentBean, position + bannerAdvIndex)
} else {
compOperData.add(advContentBean);
}
bannerAdvIndex = bannerAdvIndex + 1;
// ArrayList转成 数组
compBean.operDataList = compOperData.convertToArray()
}
}
}
}
} else {
let advPosition = slotInfo.position //广告位置,从1开始
// 页面的comp总数 - 这次请求的comp总数 = 剩余comp总数
advPosition = advPosition - 1
let advComp: CompDTO = {
compStyle: CompStyle.Card_Comp_Adv,
matInfo: matInfo
} as CompDTO;
pageCompList.insert(advComp, 0)
let a = pageModel.pageTotalCompSize - pageCompSize
if (advPosition <= pageModel.pageTotalCompSize && advPosition >= a) {
let b = advPosition - a;
console.error('ZZZXXXXX', matInfo.advSubType + '-------------' + matInfo.advTitle + " "+ advPosition + " "+a+" "+b)
if (b <= pageCompSize && b >= 0) {
let advComp: CompDTO = {
compStyle: CompStyle.Card_Comp_Adv,
matInfo: matInfo
} as CompDTO;
if (pageCompSize == slotInfo.position) {
pageCompList.add(advComp)
} else {
pageCompList.insert(advComp, b + layoutAdvIndex)
}
layoutAdvIndex = layoutAdvIndex + 1;
}
}
}
}
}
... ... @@ -241,6 +323,7 @@ export class PageHelper {
})
}
/**
* 移除comp
*/
... ... @@ -259,8 +342,13 @@ export class PageHelper {
pageCompList.add(element)
}
}
pageModel.pageTotalCompSize = pageCompList.length + pageModel.pageTotalCompSize
console.error("ZZZXXXXX", " collectPageComp--->" + pageModel.pageTotalCompSize);
// 处理页面广告数据,投放到页面的位置
//this.handlePageCompAdvPostion(pageCompList, pageDto);
// this.handlePageCompAdvPostion(pageCompList, pageModel, pageDto);
//遍历所有组件和稿件数据 push到页面
for (let element of pageCompList) {
... ...
... ... @@ -54,6 +54,9 @@ export default class PageModel {
timestamp: String = '1';
// 记录已经展示的稿件和组件数量
pageTotalCompSize: number = 0;
/**
* 简单复制业务数据
*/
... ...