wangliang_wd

Merge branch 'main' of http://192.168.1.42/developOne/harmonyPool into main

* 'main' of http://192.168.1.42/developOne/harmonyPool: (41 commits)
  desc:依赖添加
  fix:bug[17915] 评论消息后互动信息中显示的内容不一致
  desc:埋点[个人主页(客态) - 页面浏览]
  desc:埋点[个人主页(主态) - 页面浏览]
  desc:埋点[搜索页 - 页面浏览]
  desc:埋点[关于页面 - 页面浏览]
  desc:埋点[修改密码 - 页面浏览]
  desc:埋点[登录页 - 页面浏览]
  desc:埋点[]
  desc:埋点[隐私设置页 - 页面浏览(浏览时长传空值)]
  desc:埋点[账号与安全页 - 页面浏览(浏览时长传空值)]
  desc:埋点[设置-页面浏览(浏览时长传空值)]
  desc:埋点[预约列表(我的)-页面浏览(浏览时长传空值)]
  desc:埋点[关注列表(我的)-页面浏览(浏览时长传空值)]
  desc:埋点[我的页 - 普通按钮 和 页面浏览]
  删除无用代码
  fix(意见反馈):更新参数值
  替换header参数appcode,用鸿蒙自己的值
  fix(版面):读报纸页脚不同步问题修改
  首页,下拉刷新,md5判断拦截
  ...
Showing 65 changed files with 854 additions and 282 deletions
... ... @@ -171,6 +171,24 @@ export class LazyDataSource<T> extends BasicDataSource<T> {
}
}
// 删除index指定索引位置的元素
public deleteItems(startIndex: number, count?: number): void {
if (startIndex < 0) {
return
}
this.dataArray.splice(startIndex, count || (this.dataArray.length - startIndex));
let to = 0
if (count == undefined) {
to = this.dataArray.length - 1
} else {
to = count + startIndex
if (to >= this.dataArray.length) {
to = this.dataArray.length - 1;
}
}
this.notifyDataMove(startIndex, to);
}
// 删除最后1个元素
public pop(): void {
this.deleteItem()
... ...
... ... @@ -42,23 +42,23 @@ export class HttpParams {
switch (HostManager.getHost()) {
case HostEnum.HOST_UAT:
headers['X-Ca-Stage'] = 'PRE'
headers['Authorization'] = 'APPCODE 83092caa603a421aa0222308b3f6b27a'
headers['appCode'] = '83092caa603a421aa0222308b3f6b27a'
headers['Authorization'] = 'APPCODE 5e1b07c336ac48ae90794fc4d69beaf9'
headers['appCode'] = '5e1b07c336ac48ae90794fc4d69beaf9'
break
case HostEnum.HOST_SIT:
headers['X-Ca-Stage'] = 'TEST'
headers['Authorization'] = 'APPCODE 0af1f9085e484c97b2a44704bae72c07'
headers['appCode'] = '0af1f9085e484c97b2a44704bae72c07'
headers['Authorization'] = 'APPCODE b7d32f50747d456d8c84ae51f3baaf56'
headers['appCode'] = 'b7d32f50747d456d8c84ae51f3baaf56'
break
case HostEnum.HOST_PRODUCT:
headers['X-Ca-Stage'] = 'RELEASE'
headers['Authorization'] = 'APPCODE 3d4181bceeb94d9780e10dbb6c67bbf6'
headers['appCode'] = '3d4181bceeb94d9780e10dbb6c67bbf6'
headers['Authorization'] = 'APPCODE c148017260324c3ba7e612757e8146c1'
headers['appCode'] = 'c148017260324c3ba7e612757e8146c1'
break
case HostEnum.HOST_DEV:
headers['X-Ca-Stage'] = 'TEST'
headers['Authorization'] = 'APPCODE ff33172859e14f9a8299e3bd769e79f9'
headers['appCode'] = 'ff33172859e14f9a8299e3bd769e79f9'
headers['Authorization'] = 'APPCODE 9272b6a5ad0549a0ab399d0011109793'
headers['appCode'] = '9272b6a5ad0549a0ab399d0011109793'
break
default:
break
... ... @@ -82,26 +82,7 @@ export class HttpParams {
}
private static getVersion() {
// TODO
// TODO build时间,待对接build生成属性
return '202401242103';
}
private static getVersionCode() {
// TODO
return '10000';
}
public static getVersionName() {
// TODO 读取配置
return '1.0.0';
}
//获取机型
static getPhoneModel() {
return 'getPhoneModel'
}
//获取当前手机系统版本号
static getSystemVersion() {
return 'getSystemVersion'
}
}
\ No newline at end of file
... ...
... ... @@ -114,7 +114,7 @@ export { ShareInfo } from './src/main/ets/bean/morningevening/ShareInfo';
export { slideShows } from './src/main/ets/bean/morningevening/slideShows';
export { LiveDetailsBean } from './src/main/ets/bean/live/LiveDetailsBean';
export { LiveDetailsBean, joinPeopleNum } from './src/main/ets/bean/live/LiveDetailsBean';
export { ArticleListDTO } from './src/main/ets/bean/component/ArticleListDTO';
... ...
... ... @@ -208,3 +208,11 @@ export interface Vlive {
export interface ReLInfo {
relId: string
}
export interface joinPeopleNum {
barrageNum: number,
likeNum: number,
liveId: number,
pv: number,
subscribeNum: number
}
\ No newline at end of file
... ...
... ... @@ -20,6 +20,7 @@
"wdJsBridge": "file:../../commons/wdJsBridge",
"wdDetailPlayApi": "file:../../features/wdDetailPlayApi",
"wdHwAbility": "file:../../features/wdHwAbility",
"wdShare": "file:../../features/wdShare"
"wdShare": "file:../../features/wdShare",
"wdTracking": "file:../../features/wdTracking"
}
}
... ...
... ... @@ -321,6 +321,7 @@ export struct ENewspaperPageComponent {
if (this.isOpenListDialog) {
ENewspaperListDialog({
newspaperListBean: this.newspaperListBean,
scrollIndex: this.swiperIndex,
closeDialog: () => {
this.isOpenListDialog = false
}
... ...
import { FeedbackTypeBean, PhotoListBean } from 'wdBean/Index';
import { FastClickUtil, Logger, NetworkUtil, StringUtils, ToastUtils, UserDataLocal } from 'wdKit/Index';
import { AppUtils,
DeviceUtil,
FastClickUtil, Logger, NetworkUtil, StringUtils, ToastUtils, UserDataLocal } from 'wdKit/Index';
import { MultiPictureDetailViewModel } from '../viewmodel/MultiPictureDetailViewModel';
import { CustomTitleUI } from './reusable/CustomTitleUI'
import { picker } from '@kit.CoreFileKit';
... ... @@ -8,7 +10,6 @@ import { router } from '@kit.ArkUI';
import { CommonConstants } from 'wdConstant/Index';
import { ProcessUtils } from 'wdRouter/Index';
import { HashMap } from '@kit.ArkTS';
import { HttpParams } from 'wdNetwork/src/main/ets/http/HttpCommonParams';
const TAG = 'FeedBackActivity'
... ... @@ -355,8 +356,8 @@ export struct FeedBackActivity {
map.set("userName", UserDataLocal.getUserName());
}
//设备
map.set("appVersion", "V" + HttpParams.getVersionName());
map.set("appDevice", "harmony" + HttpParams.getSystemVersion() + " " + HttpParams.getPhoneModel());
map.set("appVersion", "V" + AppUtils.getAppVersionName());
map.set("appDevice", "harmony" + DeviceUtil.getDisplayVersion() + " " + DeviceUtil.getProductModel());
// //投诉图片
// if (imageUrl.size() > 0) {
// String[] str = imageUrl.toArray(new String[imageUrl.size()]);
... ...
... ... @@ -18,7 +18,8 @@ export struct MultiPictureDetailItemComponent {
build() {
Row() {
Image(this.MultiPictureDetailItem.picPath)
.alt($r('app.media.picture_loading'))
.alt($r('app.media.datail_imageLoading_w'))
.width(this.imageWidth)
.objectFit(ImageFit.Contain)
.interpolation(ImageInterpolation.High)
... ...
... ... @@ -90,9 +90,6 @@ export struct SpacialTopicPageComponent {
this.publishCommentModel.targetType = String(this.contentDetailData?.newsType || '')
this.publishCommentModel.visitorComment = String(this.contentDetailData?.visitorComment || '')
// }
if (this.contentDetailData[0]?.openComment) {
this.operationButtonList = ['collect', 'share']
}
this.trySendData2H5()
}
}
... ...
import { ContentDTO } from 'wdBean/Index'
import { ContentDTO, joinPeopleNum } from 'wdBean/Index'
import { DateTimeUtils } from 'wdKit/Index'
import { LottieView } from '../../components/lottie/LottieView';
import { LiveModel } from '../../viewmodel/LiveModel'
import font from '@ohos.font';
/**
* 这里是样式卡中,右下角显示的音视频信息
... ... @@ -10,10 +13,55 @@ import { DateTimeUtils } from 'wdKit/Index'
@Component
export struct CardMediaInfo {
@State contentDTO: ContentDTO = new ContentDTO() // 如果有duraion,代表点播,显示时长;如果不传或者传0,显示直播中
@State joinPeopleNum: number = 0;
// objectType 0:不跳转 1:点播,2:直播,3:活动,4:广告,5:专题,6:链接,7:榜单,8:图文,9:组图,10:H5新闻,11:频道,12:组件,13:音频,
// 14动态图文,15动态视频16问政;100人民号,101标签
aboutToAppear(): void {
this.getJoinPeopleNum();
font.registerFont({
familyName: 'BebasNeue',
familySrc: $rawfile('font/BebasNeue.ttf')
})
}
/**
* 全域数字显示规则
* 1、当数量为千位以內时,显示数字,不保留小数点,比如 4585
* 2、当数量为万位~1亿时,显示xx 万,保留小数点后一位,比如1517.9w、2.9w
* 3、当数量为1亿~千亿时,显示XX 亿,保留小数点后一位,比如1517.9亿、2.9亿
* 4、不进行四舍五入
* 5、0 和空 不显示
*/
handlerNum(number: string) {
const num = number??'0';
if (Number.parseInt(num) <= 9999) {
return Number.parseInt(num).toString()
} else if (Number.parseInt(num) > 9999 && Number.parseInt(num) <= 99999999) {
const num1: string = num.slice(0, -4); // 万
const num2: string = num.slice(-4, -3); // 千
return num2 === '0' ? num1 +'万' : num1 + '.' + num2 + '万'
} else if (Number.parseInt(num) > 99999999) {
const num1: string = num.slice(0, -8); // 亿
const num2: string = num.slice(-8, -7);
return num2 === '0' ? num1 +'亿' : num1 + '.' + num2 + '亿'
}
return num
}
//
/**
* 获取直播节目参与人数
*/
async getJoinPeopleNum() {
if (this.contentDTO.objectType !== '2') return;
console.log('getJoinPeopleNum-ContentDTO', JSON.stringify(this.contentDTO.objectId))
let liveIdList: string = this.contentDTO.objectId
let data: joinPeopleNum[] = await LiveModel.getJoinPeopleNum(liveIdList)
this.joinPeopleNum = data[0].pv;
}
build() {
Row() {
if (this.contentDTO?.objectType === '1' || this.contentDTO?.objectType === '15') {
... ... @@ -24,6 +72,7 @@ export struct CardMediaInfo {
if (this.contentDTO.videoInfo != null) {
Text(DateTimeUtils.getFormattedDuration(this.contentDTO.videoInfo.videoDuration * 1000))
.mediaText()
.fontFamily('BebasNeue')
}
}
} else if (this.contentDTO.objectType === '2') {
... ... @@ -36,8 +85,19 @@ export struct CardMediaInfo {
Text('预约')
.mediaText()
} else if (this.contentDTO?.liveInfo?.liveState === 'running') {
Image($r('app.media.card_live'))
.mediaLogo()
LottieView({
name: 'live_status_wait',
path: "lottie/live_detail_living.json",
lottieWidth: 14,
lottieHeight: 14,
autoplay: true,
loop: true,
})
.margin({
right: '2vp'
})
// Image($r('app.media.card_live'))
// .mediaLogo()
Text('直播中')
.mediaText()
} else if (this.contentDTO?.liveInfo?.liveState === 'end' && this.contentDTO?.liveInfo?.replayUri) {
... ... @@ -50,6 +110,12 @@ export struct CardMediaInfo {
Text('已结束')
.mediaText()
}
if (!!this.joinPeopleNum) {
Text(' | ')
.mediaText()
Text(`${this.handlerNum(this.joinPeopleNum.toString())}人参加`)
.mediaText()
}
// } else if (this.contentDTO?.liveInfo?.liveState === 'end' && this.contentDTO?.liveInfo
// ?.replayUri) {
// // Image($r('app.media.card_live'))
... ... @@ -73,6 +139,7 @@ export struct CardMediaInfo {
.mediaLogo()
Text(DateTimeUtils.getFormattedDuration(this.contentDTO.voiceInfo.voiceDuration * 1000))
.mediaText()
.fontFamily('BebasNeue')
}
} else if (this.contentDTO.objectType === '4') {//广告标签
Text($r('app.string.comp_advertisement'))
... ...
... ... @@ -155,7 +155,7 @@ export struct RmhTitle {
Text(Number(this.followStatus) === 0 ? '关注' : '已关注')
.fontSize($r('app.float.font_size_13'))
.fontColor($r('app.color.color_ED2800'))
.fontColor(Number(this.followStatus) === 0 ? $r('app.color.color_ED2800') : 0xc6c6c6)
}
.flexShrink(0)
.alignSelf(ItemAlign.Center)
... ...
import { CompDTO } from 'wdBean/Index';
import { DateTimeUtils, Logger } from 'wdKit/Index';
import { PageHelper } from '../../viewmodel/PageHelper';
import PageModel from '../../viewmodel/PageModel';
/**
... ... @@ -61,6 +62,7 @@ export struct CardAdvBottom {
}
if (currentIndex >= 0) {
this.pageModel.compList.deleteItem(currentIndex)
PageHelper.updateFirstPageEndIndex(this.pageModel, true, currentIndex)
}
}
}
... ...
import { CompDTO } from 'wdBean/Index';
import { DateTimeUtils, Logger } from 'wdKit/Index';
import {PageHelper} from '../../viewmodel/PageHelper';
import PageModel from '../../viewmodel/PageModel';
/**
... ... @@ -73,6 +74,7 @@ export struct CardAdvTop {
}
if (currentIndex >= 0) {
this.pageModel.compList.deleteItem(currentIndex)
PageHelper.updateFirstPageEndIndex(this.pageModel, true, currentIndex)
}
}
}
... ...
... ... @@ -67,6 +67,7 @@ export struct Card2Component {
.fontSize($r('app.float.font_size_18'))
.fontColor(this.clicked ? 0x848484 : $r('app.color.color_222222'))
.maxLines(2)
.lineHeight(27)
.textOverflow({ overflow: TextOverflow.Ellipsis }) // 超出的部分显示省略号。
.align(Alignment.Start)
.textIndent(this.contentDTO.newTags?.length < 5 && this.contentDTO.newTags?.length > 2 ? 58 :
... ...
... ... @@ -85,13 +85,14 @@ export struct Card6Component {
}
.justifyContent(FlexAlign.Start)
Blank()
//bottom 评论等信息
CardSourceInfo({ compDTO: this.compDTO, contentDTO: this.contentDTO })
}
.alignItems(HorizontalAlign.Start)
.justifyContent(FlexAlign.Start)
.width('64%')
.height(this.contentDTO.appStyle === CompStyle.Card_13 ? '' : 156)
Stack() {
Image(this.loadImg ? this.contentDTO.coverUrl : '')
... ... @@ -101,7 +102,6 @@ export struct Card6Component {
.height(this.contentDTO.appStyle === CompStyle.Card_13 ? 78 : 156)
CardMediaInfo({ contentDTO: this.contentDTO })
}
.alignContent(Alignment.BottomEnd)
}
.onClick((event: ClickEvent) => {
this.clicked = true;
... ... @@ -117,5 +117,6 @@ export struct Card6Component {
.width(CommonConstants.FULL_WIDTH)
// .height(this.contentDTO.appStyle === CompStyle.Card_13 ? 107 : 217)
.justifyContent(FlexAlign.SpaceBetween)
.alignItems(VerticalAlign.Top)
}
}
\ No newline at end of file
... ...
... ... @@ -99,6 +99,7 @@ export struct CommentTabComponent {
bottom: { anchor: "__container__", align: VerticalAlign.Bottom },
})
.id("Image")
.visibility(this.contentDetail.appstyle !== 9 ? Visibility.Visible : Visibility.Hidden)
}
Text(this.placeHolder)
.fontSize(12)
... ... @@ -110,6 +111,7 @@ export struct CommentTabComponent {
bottom: { anchor: "__container__", align: VerticalAlign.Bottom },
})
.id("Text")
.visibility(this.contentDetail.appstyle !== 9 ? Visibility.Visible : Visibility.Hidden)
}
}
}
... ... @@ -134,6 +136,7 @@ export struct CommentIconComponent {
@ObjectLink publishCommentModel: publishCommentModel
/*展示类型*/
@State type: number = 1
@Prop contentDetail: ContentDetailDTO
styleType: number = 1 //1: 白色背景(图文底部栏) 2: 黑色背景(图集底部栏)
// aboutToAppear(): void {
// setTimeout(() => {
... ... @@ -206,7 +209,10 @@ export struct CommentIconComponent {
}
}
}.width(24).height(24)
}
.width(24)
.height(24)
.visibility(this.contentDetail.appstyle !== 9 ? Visibility.Visible : Visibility.Hidden)
// .backgroundColor(Color.Blue)
}
... ...
... ... @@ -148,7 +148,7 @@ struct localCard {
offsetY: 3
}) // 设置下方阴影
.margin({
right: 10
right: -2
})
}
}
\ No newline at end of file
... ...
... ... @@ -2,6 +2,7 @@ import MinePageMoreFunctionModel from '../../viewmodel/MinePageMoreFunctionModel
import { WDRouterRule, WDRouterPage, ProcessUtils } from 'wdRouter'
import { Params } from 'wdBean';
import { ToastUtils } from 'wdKit/Index';
import { TrackingButton, TrackConstants } from 'wdTracking/Index';
@Component
export default struct MinePageMoreFunctionUI {
... ... @@ -70,13 +71,16 @@ export default struct MinePageMoreFunctionUI {
.onClick(() => {
console.log(index + "")
if (item.msg == "设置") { //设置
trackButtonClick("myPageUserSetting")
let params: Params = {
pageID: 'mainSetting'
}
WDRouterRule.jumpWithPage(WDRouterPage.settingPage, params)
}else if (item.msg == "关于") { // 关于
trackButtonClick("myPageUserAbout")
WDRouterRule.jumpWithPage(WDRouterPage.aboutPage)
}else if (item.msg == "意见反馈") { // 关于
trackButtonClick("myPageUserFeedBack")
ProcessUtils.gotoFeedBackActivity()
}
})
... ... @@ -91,3 +95,7 @@ export default struct MinePageMoreFunctionUI {
.margin({ left: '23lpx', right: '23lpx', top: "19lpx" })
}
}
function trackButtonClick(buttonName: string){
TrackingButton.click(buttonName, TrackConstants.PageName.My, TrackConstants.PageName.My)
}
\ No newline at end of file
... ...
import { WDRouterRule, WDRouterPage } from 'wdRouter'
import { TrackConstants } from 'wdTracking/src/main/ets/common/TrackConstants'
import { TrackingButton } from 'wdTracking/src/main/ets/tracking/TrackingButton'
import MinePageDatasModel from '../../model/MinePageDatasModel'
import MinePagePersonalFunctionsItem from '../../viewmodel/MinePagePersonalFunctionsItem'
import { PagePersonFunction } from './PagePersonFunction'
... ... @@ -25,6 +27,7 @@ export default struct MinePagePersonFunctionUI {
}else {
let params: Record<string, string> = {'comment': "1"};
WDRouterRule.jumpWithPage(WDRouterPage.mineHomePage,params)
trackButtonClick("myPageUserComment")
}
break;
}
... ... @@ -33,6 +36,7 @@ export default struct MinePagePersonFunctionUI {
WDRouterRule.jumpWithPage(WDRouterPage.loginPage)
return
}
trackButtonClick("myPageUserSubscribe")
WDRouterRule.jumpWithPage(WDRouterPage.appointmentListPage)
break;
}
... ... @@ -42,6 +46,7 @@ export default struct MinePagePersonFunctionUI {
return
}
WDRouterRule.jumpWithPage(WDRouterPage.followListPage)
trackButtonClick("myPageUserFollow")
break;
}
case "收藏":{
... ... @@ -50,6 +55,7 @@ export default struct MinePagePersonFunctionUI {
return
}
WDRouterRule.jumpWithPage(WDRouterPage.myCollectionListPagePage)
trackButtonClick("myPageUserCollection")
break;
}
case "历史":{
... ... @@ -66,6 +72,7 @@ export default struct MinePagePersonFunctionUI {
return
}
this.messageClick()
trackButtonClick("myPageUserNotice")
WDRouterRule.jumpWithPage(WDRouterPage.mineMessagePage)
break;
}
... ... @@ -89,3 +96,7 @@ export default struct MinePagePersonFunctionUI {
}
}
function trackButtonClick(buttonName: string){
TrackingButton.click(buttonName, TrackConstants.PageName.My, TrackConstants.PageName.My)
}
... ...
import { StringUtils, UserDataLocal } from 'wdKit'
import { WDRouterPage, WDRouterRule } from 'wdRouter'
import { TrackingButton, TrackConstants } from 'wdTracking/Index'
import MinePageDatasModel from '../../model/MinePageDatasModel'
const TAG = "MinePageUserSimpleInfoUI"
... ... @@ -45,6 +46,7 @@ export default struct MinePageUserSimpleInfoUI {
.alignContent(Alignment.Center)
.onClick(()=>{
this.jumpLogin()
trackButtonClick("myPageUserHead")
})
if(this.isLogin){
... ... @@ -68,6 +70,7 @@ export default struct MinePageUserSimpleInfoUI {
}.width('100%')
.onClick(()=>{
this.jumpLogin()
trackButtonClick("myPageUserName")
})
Stack(){
... ... @@ -101,6 +104,7 @@ export default struct MinePageUserSimpleInfoUI {
Blank()
}.onClick(()=>{
this.jumpLogin()
trackButtonClick("myPageUserLogin")
})
.margin({top:'11lpx',left:'23lpx'})
.width('352lpx')
... ... @@ -198,3 +202,7 @@ export default struct MinePageUserSimpleInfoUI {
}
}
}
function trackButtonClick(buttonName: string){
TrackingButton.click(buttonName, TrackConstants.PageName.My, TrackConstants.PageName.My)
}
... ...
import MinePageDatasModel from '../../../model/MinePageDatasModel'
import { onlyWifiLoadImg } from '../../../utils/lazyloadImg'
import { AppointmentOperationRequestItem } from '../../../viewmodel/AppointmentOperationRequestItem'
import { MineAppointmentItem } from '../../../viewmodel/MineAppointmentItem'
import { MyCustomDialog } from '../../reusable/MyCustomDialog'
@Component
export struct AppointmentListChildComponent{
export struct AppointmentListChildComponent {
@ObjectLink item: MineAppointmentItem
@State loadImg: boolean = false;
async aboutToAppear(): Promise<void> {
this.loadImg = await onlyWifiLoadImg();
}
dialogController: CustomDialogController = new CustomDialogController({
builder: MyCustomDialog({
cancel: this.onCancel,
... ... @@ -20,18 +27,20 @@ export struct AppointmentListChildComponent{
customStyle: true
})
build() {
Column(){
Stack(){
Image(this.item?.imageUrl[0])
Column() {
Stack() {
Image(this.loadImg ? this.item?.imageUrl[0] : '')
.backgroundColor(this.loadImg ? $r('app.color.color_B0B0B0') : 0xf5f5f5)
.width('100%')
.aspectRatio(16 / 9)
.objectFit(ImageFit.Auto)
.interpolation(ImageInterpolation.High)
if(this.item.relType === 1){
Row(){
Row(){
if (this.item.relType === 1) {
Row() {
Row() {
Image($r('app.media.reserve_icon'))
.width('42lpx')
.height('35lpx')
... ... @@ -47,7 +56,7 @@ export struct AppointmentListChildComponent{
.layoutWeight(1)
.textAlign(TextAlign.Center)
}.width('94lpx')
.margin({bottom:'15lpx',right:'15lpx'})
.margin({ bottom: '15lpx', right: '15lpx' })
}.width('100%')
.height('100%')
.alignItems(VerticalAlign.Bottom)
... ... @@ -56,7 +65,7 @@ export struct AppointmentListChildComponent{
}.width('100%')
.height('376lpx')
Column(){
Column() {
Text(this.item.title)
.fontWeight('400lpx')
.fontSize('33lpx')
... ... @@ -64,28 +73,28 @@ export struct AppointmentListChildComponent{
.lineHeight('48lpx')
.maxLines(2)
.textOverflow({ overflow: TextOverflow.Ellipsis })
.margin({bottom:'23lpx'})
.margin({ bottom: '23lpx' })
.textAlign(TextAlign.Start)
.width('100%')
Row(){
Row(){
if(this.item.relType === 2){
Row() {
Row() {
if (this.item.relType === 2) {
Image($r('app.media.play_status_history_icon'))
.objectFit(ImageFit.Auto)
.interpolation(ImageInterpolation.High)
.width('38lpx')
.height('38lpx')
.margin({right:'12lpx'})
.margin({ right: '12lpx' })
Text('已结束').fontColor($r('app.color.color_999999'))
.fontWeight('500lpx')
.fontSize('23lpx')
}else {
} else {
Image($r('app.media.play_status_icon'))
.objectFit(ImageFit.Auto)
.interpolation(ImageInterpolation.High)
.width('38lpx')
.height('38lpx')
.margin({right:'12lpx'})
.margin({ right: '12lpx' })
Text(this.item.timePre).fontColor($r('app.color.color_ED2800'))
.fontWeight('500lpx')
.fontSize('23lpx')
... ... @@ -94,35 +103,37 @@ export struct AppointmentListChildComponent{
.interpolation(ImageInterpolation.High)
.width('12lpx')
.height('31lpx')
.margin({right:'4lpx'})
.margin({ right: '4lpx' })
Text(`${this.item.timeBack}开始`).fontColor($r('app.color.color_ED2800'))
.fontWeight('500lpx')
.fontSize('23lpx')
.lineHeight('31lpx')
}
}.padding({left:'19lpx',right:'19lpx'})
}
.padding({ left: '19lpx', right: '19lpx' })
.height('46lpx')
.alignItems(VerticalAlign.Center)
.backgroundColor($r('app.color.color_F5F5F5'))
.borderRadius('4lpx')
Blank()
.layoutWeight(1)
if(this.item.relType === 1){
Text(this.item.isAppointment?"已预约":"预约")
if (this.item.relType === 1) {
Text(this.item.isAppointment ? "已预约" : "预约")
.fontWeight(400)
.fontSize('23lpx')
.backgroundColor(this.item.isAppointment?$r('app.color.color_F5F5F5'):$r('app.color.color_ED2800'))
.fontColor(this.item.isAppointment?$r('app.color.color_CCCCCC'):$r('app.color.white'))
.backgroundColor(this.item.isAppointment ? $r('app.color.color_F5F5F5') : $r('app.color.color_ED2800'))
.fontColor(this.item.isAppointment ? $r('app.color.color_CCCCCC') : $r('app.color.white'))
.lineHeight('31lpx')
.textAlign(TextAlign.Center)
.width('100lpx')
.height('46lpx')
.borderRadius('6lpx')
.onClick(()=>{
.onClick(() => {
this.dialogController.open()
})
}else {
Text(this.item.relType === 2?"去观看":"看回放")
} else {
Text(this.item.relType === 2 ? "去观看" : "看回放")
.fontWeight(400)
.fontSize('23lpx')
.backgroundColor($r('app.color.color_ED2800'))
... ... @@ -135,7 +146,12 @@ export struct AppointmentListChildComponent{
}
}
}
.padding({left:'23lpx',right:'23lpx',top:'15lpx',bottom:'23lpx'})
.padding({
left: '23lpx',
right: '23lpx',
top: '15lpx',
bottom: '23lpx'
})
}.margin({ left: 10, right: 10 })
.backgroundColor($r('app.color.white'))
.borderRadius('8lpx')
... ... @@ -145,20 +161,19 @@ export struct AppointmentListChildComponent{
console.info('Callback when the first button is clicked')
}
onAccept(){
onAccept() {
console.info('Callback when the second button is clicked')
this.appointmentOperation()
}
appointmentOperation(){
let item = new AppointmentOperationRequestItem(this.item.relId,this.item.liveId+"",!this.item.isAppointment)
MinePageDatasModel.getAppointmentOperation(item,getContext(this)).then((value)=>{
if(value!=null){
appointmentOperation() {
let item = new AppointmentOperationRequestItem(this.item.relId, this.item.liveId + "", !this.item.isAppointment)
MinePageDatasModel.getAppointmentOperation(item, getContext(this)).then((value) => {
if (value != null) {
if (value.code === 0 || value.code.toString() === "0") {
this.item.isAppointment = !this.item.isAppointment
}
}
})
}
}
\ No newline at end of file
... ...
import { DateTimeUtils, StringUtils, ToastUtils } from 'wdKit/Index'
import { WDRouterPage, WDRouterRule } from 'wdRouter/Index'
import { WDMessageCenterMessageType } from '../../../model/InteractMessageModel'
import { Remark, WDMessageCenterMessageType } from '../../../model/InteractMessageModel'
import MinePageDatasModel from '../../../model/MinePageDatasModel'
import { MessageItem } from '../../../viewmodel/MessageItem'
import { CustomPullToRefresh } from '../../reusable/CustomPullToRefresh'
... ... @@ -66,6 +66,24 @@ export struct MessageListUI {
if (value.activeInfo.title) {
item.desc = value.activeInfo.title.replace("null","")
}
let remark = JSON.parse(value.activeInfo.remark) as Remark
switch (value.activeInfo.contentType){
case "204":
item.desc = remark.userName + "关注了你"
break;
case "206":
item.desc = remark.userName +"赞了你的作品"
break;
case "207":
item.desc = remark.userName + "赞了你的评论"
break;
case "208":
item.desc = remark.userName + "评论了你的作品"
break;
case "209":
item.desc = remark.userName + "回复了你的评论"
break;
}
if (value.activeInfo.time) {
item.time = this.getPublishTime(value.subscribeInfo.time,DateTimeUtils.getDateTimestamp(value.activeInfo.time) + "")
}
... ...
import { DateTimeUtils } from 'wdKit/Index';
import { TrackingPageBrowse, TrackConstants } from 'wdTracking/Index';
import { AppointmentListUI } from '../mine/appointment/AppointmentListUI'
const TAG = "AppointmentListPage"
... ... @@ -5,6 +7,19 @@ const TAG = "AppointmentListPage"
@Entry
@Component
struct AppointmentListPage {
pageShowTime:number = 0;
pageHideTime:number = 0;
onPageShow() {
this.pageShowTime = DateTimeUtils.getTimeStamp()
}
onPageHide(): void {
this.pageHideTime = DateTimeUtils.getTimeStamp()
let duration = 0
duration = Math.floor((this.pageHideTime - this.pageShowTime)/1000)
TrackingPageBrowse.trackCommonPageExposureEnd(TrackConstants.PageName.My_Saved_Live,TrackConstants.PageName.My_Saved_Live,duration)
}
build() {
Column(){
... ...
... ... @@ -73,7 +73,7 @@ export struct BottomNavigationComponent {
TabContent() {
if (CompUtils.isMine(navItem)) {
// 我的页面组件数据列表
MinePageComponent()
MinePageComponent({isMinePage: this.currentNavIndex === this.bottomNavList.length-1})
} else if (navItem.name === '视频') {
// 视频频道,包含视频和直播
VideoChannelPage({
... ...
import { Params } from 'wdBean';
import { FollowFirstTabsComponent } from '../mine/follow/FollowFirstTabsComponent'
import router from '@ohos.router';
import { DateTimeUtils } from 'wdKit/Index';
import { TrackingPageBrowse, TrackConstants } from 'wdTracking/Index';
@Entry
@Component
struct FollowListPage {
@State params:Record<string, string> = router.getParams() as Record<string, string>;
@State curIndex: string = '0';
pageShowTime:number = 0;
pageHideTime:number = 0;
onPageShow() {
this.curIndex = this.params?.['index'];
this.pageShowTime = DateTimeUtils.getTimeStamp()
}
onPageHide(): void {
this.pageHideTime = DateTimeUtils.getTimeStamp()
let duration = 0
duration = Math.floor((this.pageHideTime - this.pageShowTime)/1000)
TrackingPageBrowse.trackCommonPageExposureEnd(TrackConstants.PageName.My_Follow,TrackConstants.PageName.My_Follow,duration)
}
build() {
... ...
... ... @@ -12,6 +12,7 @@ import LoadMoreLayout from '../page/LoadMoreLayout';
import { LottieView } from '../../components/lottie/LottieView';
import dataPreferences from '@ohos.data.preferences';
import { BusinessError } from '@ohos.base';
import { onlyWifiLoadImg } from '../../utils/lazyloadImg';
const TAG: string = 'LiveMorePage';
... ... @@ -45,8 +46,12 @@ struct LiveMorePage {
// 点击过的数据
@State clickDatas: Array<string> = []
async aboutToAppear() {
@State loadImg: boolean = false;
async aboutToAppear() : Promise<void>{
await this.getPreferencesFromStorage()
this.loadImg = await onlyWifiLoadImg();
this.getLivMoreClickPreference()
Logger.debug(TAG, '数据:' + JSON.stringify(this.clickDatas))
this.currentPage = 1
... ... @@ -155,9 +160,10 @@ struct LiveMorePage {
.fontColor(this.isClicked(item.objectId) ? $r('app.color.color_848484') : $r('app.color.color_222222'))
Stack() {
if (item.fullColumnImgUrls && item.fullColumnImgUrls.length > 0) {
Image(item.fullColumnImgUrls[0].url)
Image(this.loadImg?item.fullColumnImgUrls[0].url:'')
.backgroundColor(this.loadImg ? $r('app.color.color_B0B0B0') : 0xf5f5f5)
.width('100%')
.height(196)
.aspectRatio(16 / 9)
.borderRadius(4)
}
this.LiveImage(item)
... ...
... ... @@ -5,10 +5,12 @@ import MinePageDatasModel from '../../model/MinePageDatasModel'
import MinePageUserSimpleInfoUI from '../mine/MinePageUserSimpleInfoUI'
import MinePagePersonFunctionUI from '../mine/MinePagePersonFunctionUI'
import MinePageMoreFunctionUI from '../mine/MinePageMoreFunctionUI'
import { SPHelper, StringUtils } from 'wdKit'
import { DateTimeUtils, SPHelper, StringUtils } from 'wdKit'
import { SpConstants } from 'wdConstant'
import dataPreferences from '@ohos.data.preferences';
import { MergeRecordDialog } from '../../dialog/MergeRecordDialog'
import { TrackingPageBrowse } from 'wdTracking/src/main/ets/tracking/TrackingPageBrowse'
import { TrackConstants } from 'wdTracking/src/main/ets/common/TrackConstants'
const TAG = 'MinePageComponent';
... ... @@ -52,12 +54,35 @@ export struct MinePageComponent {
autoCancel: false
})
@Consume @Watch('pageShowForUpdateData') pageShow :number
@Consume @Watch('pageHideForUpdateData') pageHide :number
pageShowTime:number = 0;
pageHideTime:number = 0;
pageFirstCreateTime:number = 0;
@Prop isMinePage:boolean = false;
//第一次还没创建时候 pageShow 接收不到监听
pageShowForUpdateData(): void {
if(this.isMinePage){
this.getMessageData()
this.pageShowTime = DateTimeUtils.getTimeStamp()
}
}
pageHideForUpdateData(): void {
if(this.isMinePage){
this.pageHideTime = DateTimeUtils.getTimeStamp()
let duration = 0
if(this.pageShowTime != 0){
duration = (this.pageHideTime - this.pageShowTime)/1000
}else{
duration = (this.pageHideTime - this.pageFirstCreateTime)/1000
}
TrackingPageBrowse.trackCommonPageExposureEnd(TrackConstants.PageName.My,TrackConstants.PageName.My,Math.floor(duration))
}
}
aboutToAppear(){
this.pageFirstCreateTime = DateTimeUtils.getTimeStamp()
this.getUserLogin()
this.getFunctionData()
this.addLoginStatusObserver()
... ...
import { PermissionUtil } from 'wdKit'
import { DateTimeUtils, PermissionUtil } from 'wdKit'
import { PrivacySettingModel } from '../../model/PrivacySettingModel'
import { Params } from 'wdBean';
import { WDRouterPage, WDRouterRule } from 'wdRouter';
import { HttpUtils } from 'wdNetwork/Index';
import { TrackingPageBrowse, TrackConstants } from 'wdTracking/Index';
const TAG = 'PrivacySettingPage';
const DiyString = '开启个性化推荐'
... ... @@ -15,9 +16,19 @@ export struct PrivacySettingPage {
tips: string = '设置前可查阅'
privacyTips: string = '《隐私政策》'
tipsEnd = '中相应权限使用规则'
pageShowTime:number = 0;
pageHideTime:number = 0;
onPageShow(): void {
this.getPermissionStatus();
this.pageShowTime = DateTimeUtils.getTimeStamp()
}
onPageHide(): void {
this.pageHideTime = DateTimeUtils.getTimeStamp()
let duration = 0
duration = Math.floor((this.pageHideTime - this.pageShowTime)/1000)
TrackingPageBrowse.trackCommonPageExposureEnd(TrackConstants.PageName.Privacy_Setting,TrackConstants.PageName.Privacy_Setting,duration)
}
aboutToAppear() {
... ...
import { DateTimeUtils } from 'wdKit/Index';
import { TrackingPageBrowse, TrackConstants } from 'wdTracking/Index';
import { AboutPageUI } from '../setting/AboutPageUI';
@Entry
@Component
struct SettingAboutPage {
pageShowTime:number = 0;
pageHideTime:number = 0;
onPageShow() {
this.pageShowTime = DateTimeUtils.getTimeStamp()
}
onPageHide(): void {
this.pageHideTime = DateTimeUtils.getTimeStamp()
let duration = 0
duration = Math.floor((this.pageHideTime - this.pageShowTime)/1000)
TrackingPageBrowse.trackCommonPageExposureEnd(TrackConstants.PageName.About,TrackConstants.PageName.About,duration)
}
build() {
Column(){
AboutPageUI()
... ...
... ... @@ -4,6 +4,7 @@ import { AccountAndSecurityLayout } from '../setting/AccountAndSecurityLayout';
import router from '@ohos.router';
import { Action, Params } from 'wdBean';
import { DateTimeUtils } from 'wdKit/Index';
import { TrackingPageBrowse, TrackConstants } from 'wdTracking/Index';
@Entry
@Component
... ... @@ -13,10 +14,39 @@ struct SettingPage {
@State params:Params = router.getParams() as Params;
@State enterActivityTime:number = 0;
onPageShow() {
pageShowSettingTime:number = 0;
pageHideSettingTime:number = 0;
pageShowAccountTime:number = 0;
pageHideAccountTime:number = 0;
onPageShow() {
this.pageType = this.params.pageID;
this.enterActivityTime = DateTimeUtils.getTimeStamp()
if (this.pageType == 'mainSetting'){
this.pageShowSettingTime = DateTimeUtils.getTimeStamp()
}else{
this.pageShowAccountTime = DateTimeUtils.getTimeStamp()
}
}
onPageHide(): void {
if (this.pageType == 'mainSetting'){
this.pageHideSettingTime = DateTimeUtils.getTimeStamp()
}else{
this.pageHideAccountTime = DateTimeUtils.getTimeStamp()
}
let duration = 0
if(this.pageType == 'mainSetting'){
duration = Math.floor((this.pageHideSettingTime - this.pageShowSettingTime)/1000)
}else{
duration = Math.floor((this.pageHideAccountTime - this.pageShowAccountTime)/1000)
}
if(this.pageType == 'mainSetting'){
TrackingPageBrowse.trackCommonPageExposureEnd(TrackConstants.PageName.Setting,TrackConstants.PageName.Setting,duration)
}else{
TrackingPageBrowse.trackCommonPageExposureEnd(TrackConstants.PageName.Account_Management,TrackConstants.PageName.Account_Management,duration)
}
}
build() {
... ...
... ... @@ -13,6 +13,7 @@ import { HttpUtils } from 'wdNetwork/Index';
import { WDRouterPage, WDRouterRule } from 'wdRouter'
import { LazyDataSource } from 'wdKit/Index';
import LoadMoreLayout from '../page/LoadMoreLayout'
import { onlyWifiLoadImg } from '../../utils/lazyloadImg';
const TAG: string = 'ReserveMorePage';
... ... @@ -45,9 +46,10 @@ struct ReserveMorePage {
@State isShow: boolean = false
@State private liveId: string = ''
@State isLoadingAttention: boolean = false
@State loadImg: boolean = false;
build() {
Column(){
Column() {
this.TabbarNormal()
if (this.viewType == ViewType.LOADING) {
this.LoadingLayout()
... ... @@ -85,7 +87,7 @@ struct ReserveMorePage {
@Builder
ListLayout() {
List({scroller: this.scroller}) {
List({ scroller: this.scroller }) {
// 下拉刷新
LazyForEach(this.data, (contentDTO: ContentDTO, index: number) => {
ListItem() {
... ... @@ -110,7 +112,7 @@ struct ReserveMorePage {
.height('calc(100% - 44vp)')
.onReachEnd(() => {
Logger.debug(TAG, "触底了");
if(!this.isLoading && this.hasMore){
if (!this.isLoading && this.hasMore) {
//加载分页数据
this.currentPage++;
this.getData()
... ... @@ -127,9 +129,13 @@ struct ReserveMorePage {
buildItem(item: ContentDTO, index: number) {
Column() {
Stack() {
Image(item.fullColumnImgUrls[0]?.url)
Image(this.loadImg ? item.fullColumnImgUrls[0]?.url : '')
.width('100%')
.aspectRatio(16 / 9)
.backgroundColor(this.loadImg ? $r('app.color.color_B0B0B0') : $r('app.color.color_33A3A3A3'))
.objectFit(ImageFit.Contain)
.borderWidth(0.5)
.borderColor($r('app.color.color_0D000000'))
.borderRadius({
topLeft: '4vp',
topRight: '4vp'
... ... @@ -152,7 +158,12 @@ struct ReserveMorePage {
Image($r('app.media.reserve_play_icon'))
.width(20)
.height(20)
.margin({ left: 10, top: 2, bottom: 2, right: 6 })
.margin({
left: 10,
top: 2,
bottom: 2,
right: 6
})
Text(this.getReserveDate(item.liveInfo.liveStartTime, 1))
.fontSize(12)
... ... @@ -190,7 +201,8 @@ struct ReserveMorePage {
.width(20)
.height(20)
.color(!this.isReserved(item) ? $r('app.color.color_fff') : $r('app.color.color_CCCCCC'))
.visibility((this.isLoadingAttention && this.liveId == item.objectId) ? Visibility.Visible : Visibility.None)
.visibility((this.isLoadingAttention && this.liveId == item.objectId) ? Visibility.Visible :
Visibility.None)
Text(!this.isReserved(item) ? '预约' : '已预约')
.fontSize($r('app.float.vp_12'))
... ... @@ -199,14 +211,21 @@ struct ReserveMorePage {
.width('100%')
.height('100%')
.textAlign(TextAlign.Center)
.visibility((this.isLoadingAttention && this.liveId == item.objectId) ? Visibility.None : Visibility.Visible)
.visibility((this.isLoadingAttention && this.liveId == item.objectId) ? Visibility.None :
Visibility.Visible)
.margin({
right: '10vp'
})
.textShadow({
radius: 2,
color: 'rgba(0,0,0,0.3)',
offsetY: 2
})
.backgroundColor(!this.isReserved(item) ? $r('app.color.color_ED2800') : $r('app.color.color_F5F5F5'))
.borderRadius(3)
}.onClick(() => {
}
.onClick(() => {
this.bookAndCancel(item)
})
.justifyContent(FlexAlign.Center)
... ... @@ -214,7 +233,7 @@ struct ReserveMorePage {
.borderRadius(3)
.width('52vp')
.height('24vp')
.margin({right: 12})
.margin({ right: 12 })
}
.width('100%')
... ... @@ -285,12 +304,18 @@ struct ReserveMorePage {
.fontSize('12vp')
.fontWeight(400)
.fontColor(Color.White)
.textShadow({
radius: 2,
color: 'rgba(0,0,0,0.3)',
offsetY: 2
})
}
.backgroundColor(Color.Transparent)
.margin({ right: 8, bottom: 8 })
}
async aboutToAppear(): Promise<void> {
this.loadImg = await onlyWifiLoadImg();
// PageViewModel.get
this.currentPage = 1
this.getData()
... ... @@ -306,19 +331,19 @@ struct ReserveMorePage {
if (str) {
// 跳转指定频道场景,传参底导id、频道id
const model: ReserveItemBean = JSON.parse(str)
Logger.debug(TAG,'是否关注元数据0:' +` ${model.liveId}`)
Logger.debug(TAG, '是否关注元数据0:' + ` ${model.liveId}`)
if (model && model.liveId && this.reserveList) {
// 修改源数据
this.reserveList.forEach((element) => {
if (element.liveId == model.liveId) {
if (element && element.subscribe != model.subscribe) {
Logger.debug(TAG,'是否关注元数据2:' +` ${JSON.stringify(element.subscribe)}`)
Logger.debug(TAG, '是否关注元数据2:' + ` ${JSON.stringify(element.subscribe)}`)
element.subscribe = !element.subscribe
Logger.debug(TAG,'是否关注元数据3:' +` ${JSON.stringify(element.subscribe)}`)
Logger.debug(TAG, '是否关注元数据3:' + ` ${JSON.stringify(element.subscribe)}`)
this.isShow = true
if (element.subscribe) {
this.reservedIds.push(element.liveId.toString())
}else {
} else {
const num = this.reservedIds.indexOf(element.liveId.toString())
if (num >= 0 && num < this.reservedIds.length) {
this.reservedIds.splice(num, 1)
... ... @@ -371,7 +396,7 @@ struct ReserveMorePage {
if (liveReviewDTO.list.length == 0 && this.currentPage == 1) {
this.viewType = ViewType.EMPTY
}
}catch (exception) {
} catch (exception) {
this.resolveEnd(false, resolve)
}
// PageViewModel.getLiveMoreUrl(this.type, this.currentPage, this.pageSize).then(async (liveReviewDTO) => {
... ... @@ -387,7 +412,7 @@ struct ReserveMorePage {
if (resolve) {
if (this.currentPage == 1 && isTop) {
resolve('已更新至最新')
}else {
} else {
resolve('')
}
}
... ... @@ -402,9 +427,9 @@ struct ReserveMorePage {
async getAppointmentInfo(list: ContentDTO[]) {
if (HttpUtils.getUserId()) {
const reserveBean = this.transformToLiveDetailsBeans(list)
Logger.debug(TAG,'是否预约数据:' +` ${JSON.stringify(reserveBean)}`)
Logger.debug(TAG, '是否预约数据:' + ` ${JSON.stringify(reserveBean)}`)
LiveModel.getAppointmentStatus(reserveBean).then((result) => {
Logger.debug(TAG,'是否预约数据:' +` ${JSON.stringify(result)}`)
Logger.debug(TAG, '是否预约数据:' + ` ${JSON.stringify(result)}`)
if (result && result.length > 0) {
this.reserveList.push(...result)
// this.reserveStatus = res;
... ... @@ -414,10 +439,10 @@ struct ReserveMorePage {
}
})
}
}).catch(() =>{
}).catch(() => {
// this.data.push(...list)
})
}else {
} else {
// this.data.push(...list)
}
... ... @@ -463,18 +488,19 @@ struct ReserveMorePage {
this.isLoadingAttention = true
this.liveId = reserveItem.liveId.toString()
try {
const res = await LiveModel.liveAppointment(reserveItem.relationId, reserveItem.liveId.toString(), !reserveItem.subscribe);
const res = await LiveModel.liveAppointment(reserveItem.relationId, reserveItem.liveId.toString(),
!reserveItem.subscribe);
if (res.code == 0) {
ToastUtils.shortToast(!reserveItem.subscribe ? '预约成功' : '取消预约成功')
// 修改源数据
this.reserveList.forEach((element) => {
if (element.liveId.toString() == item.objectId) {
Logger.debug(TAG,'是否关注元数据:' +` ${JSON.stringify(element.subscribe)}`)
Logger.debug(TAG, '是否关注元数据:' + ` ${JSON.stringify(element.subscribe)}`)
element.subscribe = !element.subscribe
Logger.debug(TAG,'是否关注元数据1:' +` ${JSON.stringify(element.subscribe)}`)
Logger.debug(TAG, '是否关注元数据1:' + ` ${JSON.stringify(element.subscribe)}`)
if (element.subscribe) {
this.reservedIds.push(element.liveId.toString())
}else {
} else {
const num = this.reservedIds.indexOf(element.liveId.toString())
if (num >= 0 && num < this.reservedIds.length) {
this.reservedIds.splice(num, 1)
... ... @@ -490,13 +516,12 @@ struct ReserveMorePage {
this.liveId = ''
this.isLoadingAttention = false
}
}else {
} else {
this.liveId = ''
this.isLoadingAttention = false
}
}
}
getReserveDate(eventDateTimeString: string, type: number): string {
// 解析事件的日期和时间
const eventDateTime = new Date(eventDateTimeString);
... ... @@ -506,21 +531,43 @@ struct ReserveMorePage {
const eventHour = eventDateTime.getHours();
const eventMinutes = eventDateTime.getMinutes();
const eventTimeStr = `${eventHour}:${eventMinutes.toString().padStart(2, '0')}开始`; // 格式化时间,确保分钟是两位数
if (type === 1) {
// 如果是今天
if (eventDateTime.setHours(0,0,0,0) === currentDateTime.setHours(0,0,0,0)) {
// 判断是否是今天
const eventDate = eventDateTime.setHours(0, 0, 0, 0);
const currentDate = currentDateTime.setHours(0, 0, 0, 0);
if (eventDate === currentDate) {
return `今天`;
} else {
// 如果事件不在今天
const month = eventDateTime.getMonth() + 1; // 月份从0开始
}else{
const month = eventDateTime.getMonth() + 1;
const date = eventDateTime.getDate();
return `${month}月${date}日`;
}
} else {
}else {
return `${eventTimeStr}`;
}
}
// getReserveDate(eventDateTimeString: string, type: number): string {
// // 解析事件的日期和时间
// const eventDateTime = new Date(eventDateTimeString);
// const currentDateTime = new Date();
//
// // 截取事件时间的小时和分钟(假设事件时间是按照24小时制)
// const eventHour = eventDateTime.getHours();
// const eventMinutes = eventDateTime.getMinutes();
// const eventTimeStr = `${eventHour}:${eventMinutes.toString().padStart(2, '0')}开始`; // 格式化时间,确保分钟是两位数
//
// if (type === 1) {
// // 如果是今天
// if (eventDateTime.setHours(0,0,0,0) === currentDateTime.setHours(0,0,0,0)) {
// return `今天`;
// } else {
// // 如果事件不在今天
// const month = eventDateTime.getMonth() + 1; // 月份从0开始
// const date = eventDateTime.getDate();
// return `${month}月${date}日`;
// }
// } else {
// return `${eventTimeStr}`;
// }
// }
}
\ No newline at end of file
... ...
... ... @@ -24,11 +24,7 @@ export struct AboutPageUI {
})
build() {
// Navigation() {
//滑动区域
this.aboutUi()
// }.titleMode(NavigationTitleMode.Mini)
// .title('关于')
}
aboutToAppear() {
... ... @@ -55,18 +51,6 @@ export struct AboutPageUI {
this.dialogController.open()
})
)
// Row(){
//
// }.backgroundColor(Color.Yellow)
// .width('100%')
// .height('97lpx')
// Row(){
//
// }.backgroundColor(Color.Yellow)
// .width('100%')
// .height('97lpx')
List() {
ForEach(this.listData, (item: string, index: number) => {
... ...
... ... @@ -85,69 +85,6 @@ export struct MineSettingComponent {
}
}
// // 页面布局
// @Builder settingList() {
// Column() {
// List() {
// // 循环渲染ListItemGroup,contactsGroups为多个分组联系人contacts和标题title的数据集合
// ForEach(this.listData, (item: Array<string>, index: number) => {
// ListItemGroup({ header: index === 0 ? this.itemHead("") : this.itemHead("1") }) {
// // 循环渲染ListItem
// ForEach(item, (subItem: string, subIndex: number) => {
// ListItem() {
// if (subIndex == 6) {
// this.getArrowCell(subItem, subIndex, index)
// } else if (subIndex == 1 || subIndex == 3 || subIndex == 4 || subIndex == 5) {
// if (subIndex == 1 && index == 1) {
// this.getArrowCell(subItem, subIndex, index)
// } else {
// this.getSwitchCell(subItem, subIndex)
// }
//
// } else {
// this.getArrowCell(subItem, subIndex, index)
// }
//
// }.padding({ left: '27lpx' })
// .onClick(() => {
//
// // // 在Home页面中
// // let paramsInfo: object = {
// // pageId: 123,
// // pageType:'AccountAndSecurityLayout'
// // };
// console.log(subIndex + "")
// if (subIndex == 0 && index == 0) {
//
// let params: Params = {
// pageID: 'AccountAndSecurityLayout'
// }
// WDRouterRule.jumpWithPage(WDRouterPage.settingPage, params)
// }else if (subIndex == 2 && index == 0) {
// WDRouterRule.jumpWithPage(WDRouterPage.privacySettingPage)
// }else if (subIndex == 0 && index == 1) {
// this.dialogController.open()
// }
//
// })
// .height('117lpx')
// })
// }
// .divider({
// strokeWidth: 1,
// startMargin: 15,
// endMargin: 10,
// color: '#f0f0f0'
// })
// })
// }.onScrollFrameBegin((offset, state) => {
// return { offsetRemain: 0 }
// })
// }
// .backgroundColor(Color.White)
// .borderRadius(8)
// }
// 页面布局
@Builder settingList() {
Column() {
... ... @@ -247,12 +184,6 @@ export struct MineSettingComponent {
Row() {
// 左侧logo和标题
Row() {
// 判断有没有图片
// if (this.privacySwitch) {
// Image('https://pic.rmb.bdstatic.com/e182cf67c341d1128d2a6cc05886bf62.jpeg@s_0,h_2000')
// .height('38lpx')
// .margin({ right: '5lpx' })
// }
Text(`${item.title}`)
.margin({ top: '8lpx' })
.height('38lpx')
... ...
... ... @@ -90,11 +90,20 @@ export struct OperRowListView {
console.info(TAG, '22222----', this.styleType)
console.info(TAG, '3333----', this.needLike)
this.handleStyle()
this.onDetailUpdated()
EmitterUtils.receiveEvent(EmitterEventId.AUDIO_CHANGE_STATUS, (val: number | string | undefined) => {
console.log(TAG, 'this.currentStatus', val)
this.currentStatus = val
})
this.onDetailUpdated()
//注册通知,来自别的组件的评论成功通知
EmitterUtils.receiveEvent(EmitterEventId.COMMENT_PUBLISH, (targetId?: string) => {
if (targetId) {
if (targetId == this.publishCommentModel.targetId) {
//新增评论
this.queryContentInteractCount()
}
}
})
}
async onDetailUpdated() {
... ... @@ -224,7 +233,11 @@ export struct OperRowListView {
if (this.showCommentIcon) {
Column() {
if (this.publishCommentModel?.targetId) {
CommentIconComponent({ publishCommentModel: this.publishCommentModel, styleType: this.styleType })
CommentIconComponent({
publishCommentModel: this.publishCommentModel,
styleType: this.styleType,
contentDetail: this.contentDetailData
})
.onClick(() => {
this.onCommentIconClick()
... ...
... ... @@ -109,4 +109,5 @@ export class Remark{
coverImageUrl:string = ""
relationId:string = ""
status:string = ""
userName:string = ""
}
\ No newline at end of file
... ...
import router from '@ohos.router'
import { NetworkUtil, StringUtils } from 'wdKit';
import { DateTimeUtils, NetworkUtil, StringUtils } from 'wdKit';
import { WDRouterPage, WDRouterRule } from 'wdRouter';
import { editModelParams } from '../model/EditInfoModel';
import { HomePageBottomCommentComponent } from '../components/mine/home/HomePageBottomCommentComponent';
... ... @@ -7,6 +7,7 @@ import { HomePageBottomFollowComponent } from '../components/mine/home/HomePageB
import MinePageDatasModel from '../model/MinePageDatasModel';
import { EmptyComponent } from '../components/view/EmptyComponent';
import { CustomTitleUI } from '../components/reusable/CustomTitleUI';
import { TrackingPageBrowse, TrackConstants } from 'wdTracking/Index';
const TAG = "MineHomePage"
... ... @@ -37,8 +38,11 @@ struct MineHomePage {
@State isCommentEnter:string = "";
@State isConnectNetwork : boolean = NetworkUtil.isNetConnected()
@State topSafeHeight: number = AppStorage.get<number>('topSafeHeight') || 0
pageShowTime:number = 0;
pageHideTime:number = 0;
onPageShow(): void {
this.pageShowTime = DateTimeUtils.getTimeStamp()
this.getUserInfo()
let intervalID = setInterval(() => {
... ... @@ -50,6 +54,13 @@ struct MineHomePage {
}, 200);
}
onPageHide(): void {
this.pageHideTime = DateTimeUtils.getTimeStamp()
let duration = 0
duration = Math.floor((this.pageHideTime - this.pageShowTime)/1000)
TrackingPageBrowse.trackCommonPageExposureEnd(TrackConstants.PageName.Main_Personal,TrackConstants.PageName.Main_Personal,duration)
}
build() {
if(this.isConnectNetwork){
Stack({ alignContent: Alignment.Top }){
... ...
import router from '@ohos.router'
import { Params } from 'wdBean';
import { NetworkUtil, StringUtils } from 'wdKit';
import { DateTimeUtils, NetworkUtil, StringUtils } from 'wdKit';
import { TrackingPageBrowse, TrackConstants } from 'wdTracking/Index';
import { OtherHomePageBottomCommentComponent } from '../components/mine/home/OtherHomePageBottomCommentComponent';
import { OtherHomePageBottomFollowComponent } from '../components/mine/home/OtherHomePageBottomFollowComponent';
import { CustomTitleUI } from '../components/reusable/CustomTitleUI';
... ... @@ -16,9 +17,20 @@ struct OtherNormalUserHomePage {
@State params:Record<string, string> = router.getParams() as Record<string, string>;
@Watch('change') @State curUserId: string = '-1';
@State topSafeHeight: number = AppStorage.get<number>('topSafeHeight') || 0
pageShowTime:number = 0;
pageHideTime:number = 0;
onPageShow() {
this.curUserId = this.params?.['userId'];
this.pageShowTime = DateTimeUtils.getTimeStamp()
}
onPageHide(): void {
this.pageHideTime = DateTimeUtils.getTimeStamp()
let duration = 0
duration = Math.floor((this.pageHideTime - this.pageShowTime)/1000)
TrackingPageBrowse.trackCommonPageExposureEnd(TrackConstants.PageName.Customer_Personal,TrackConstants.PageName.Customer_Personal,duration)
}
change(){
... ...
import { DateTimeUtils } from 'wdKit/Index';
import { TrackingPageBrowse, TrackConstants } from 'wdTracking/Index';
import { SearchComponent } from '../components/search/SearchComponent'
@Entry
@Component
struct SearchPage {
pageShowTime:number = 0;
pageHideTime:number = 0;
onPageShow() {
this.pageShowTime = DateTimeUtils.getTimeStamp()
}
onPageHide(): void {
this.pageHideTime = DateTimeUtils.getTimeStamp()
let duration = 0
duration = Math.floor((this.pageHideTime - this.pageShowTime)/1000)
TrackingPageBrowse.trackCommonPageExposureEnd(TrackConstants.PageName.Search,TrackConstants.PageName.Search,duration)
}
build() {
Column(){
SearchComponent()
... ...
import { DateFormatUtil, WDPlayerController, WDPlayerRenderLiveView } from 'wdPlayer/Index';
import { DateFormatUtil, WDAliPlayerController, WDPlayerController, WDPlayerRenderLiveView } from 'wdPlayer/Index';
import router from '@ohos.router';
import { StringUtils } from 'wdKit/Index';
import { Action } from 'wdBean';
... ... @@ -10,7 +10,7 @@ const TAG = 'VideoPlayPage';
export struct VideoPlayPage {
//是否处于播放状态中
@State isPlayStatus: boolean = true
playerController: WDPlayerController = new WDPlayerController();
playerController: WDAliPlayerController = new WDAliPlayerController();
//视频地址
@State videoUrl: string = ''
//封面图
... ...
import { HttpUrlUtils, ResponseDTO } from 'wdNetwork';
import { HttpRequest } from 'wdNetwork/src/main/ets/http/HttpRequest';
import { Logger, ToastUtils, EmitterEventId, EmitterUtils } from 'wdKit';
import { LiveDetailsBean, ReserveBean, ReserveItemBean } from 'wdBean/Index';
import { LiveDetailsBean, ReserveBean, ReserveItemBean, joinPeopleNum } from 'wdBean/Index';
const TAG = 'LiveModel'
... ... @@ -105,5 +105,34 @@ export class LiveModel {
})
})
}
/**
* 查询直播参与人数
*/
static getJoinPeopleNum(liveIdList: string) {
return new Promise<Array<joinPeopleNum>>((success, fail) => {
HttpRequest.get<ResponseDTO<Array<joinPeopleNum>>>(
HttpUrlUtils.getJoinPeopleNum() + `?liveIdList=${liveIdList}`,
).then((data: ResponseDTO<Array<joinPeopleNum>>) => {
Logger.debug(TAG, 'getJoinPeopleNum:' + `${JSON.stringify(data)}`)
Logger.debug(TAG, 'liveIdList:' + liveIdList)
if (!data || !data.data) {
fail("数据为空")
return
}
if (data.code != 0) {
fail(data.message)
ToastUtils.shortToast(data.message)
return
}
success(data.data)
Logger.info('getJoinPeopleNum', JSON.stringify(data.data))
}, (error: Error) => {
fail(error.message)
Logger.debug(TAG + ":error ", JSON.stringify(error))
})
})
}
}
... ...
... ... @@ -41,11 +41,23 @@ class SystemInfo{
time: string = ""
title: string = ""
userId: number = -1
remark: string = ""
}
class ActiveInfo{
id:string = ""
classify: string = ""
contentId: string = ""
contentType: string = ""
id: number = -1
message: string = ""
platform: string = ""
privateMailId: number = -1
privateMailIds: string = ""
privateMailNum: number = -1
read: boolean = false
source: string = ""
time: string = ""
title: string = ""
userId: number = -1
remark: string = ""
}
\ No newline at end of file
... ...
... ... @@ -80,7 +80,7 @@ export class PageHelper {
return;
}
pageModel.pageInfo = pageInfo;
pageModel.cachePageInfoMd5 = pageInfo.md5
pageModel.displayPageInfoMd5 = pageInfo.md5
//解析页面挂角广告资源
pageAdvModel.analysisAdvSource(pageInfo);
this.parseGroup(pageModel, true)
... ... @@ -129,7 +129,7 @@ export class PageHelper {
return;
}
pageModel.pageInfo = pageInfo;
if (pageInfo.md5 == pageModel.cachePageInfoMd5) {
if (pageInfo.md5 == pageModel.displayPageInfoMd5) {
// 缓存一致,不解析
Logger.debug(TAG, 'getPageInfo 与缓存一致,不解析广告。。。')
} else {
... ... @@ -138,6 +138,7 @@ export class PageHelper {
// 保存缓存
CacheData.saveCacheData(CacheData.comPageInfoCacheKey + pageModel.pageId, pageInfo, pageInfo.md5)
}
pageModel.displayPageInfoMd5 = pageInfo.md5
//解析页面挂角广告资源
pageAdvModel.analysisAdvSource(pageInfo);
}
... ... @@ -185,15 +186,25 @@ export class PageHelper {
Logger.debug(TAG, 'parseGroup isCache: ' + isCache)
if (isCache) {
pageDto = await PageViewModel.getPageGroupCacheData(pageModel.bizCopy()) as PageDTO
pageModel.cacheGroupInfoMd5 = pageDto.md5
pageModel.displayGroupInfoMd5 = pageDto.md5
} else {
pageDto = await PageViewModel.getPageGroupCompData(pageModel.bizCopy()) as PageDTO
if (pageDto.md5 == pageModel.cacheGroupInfoMd5) {
if (pageDto.md5 == pageModel.displayGroupInfoMd5) {
Logger.debug(TAG, 'parseGroup cache load, return: ' + pageDto.md5)
// 下拉刷新场景,数据没变,拦截刷新UI,重置相关参数
if (pageModel.loadStrategy === 2) {
// 缓存数据一致,不再刷新
this.refreshUIEnd(pageModel, true)
// 第一页不刷新,分页数据清除
pageModel.hasMore = true
this.deleteMorePage(pageModel)
pageModel.pageTotalCompSize = pageModel.compList.size()
}
pageModel.currentPage++
return
}
Logger.debug(TAG, 'parseGroup cache load, save: ')
pageModel.displayGroupInfoMd5 = pageDto.md5
Logger.debug(TAG, 'parseGroup cache load, save: ' + pageDto.md5)
// 保存缓存
CacheData.saveCacheData(CacheData.compGroupInfoDataCacheKey + pageModel.pageId + pageModel.groupId, pageDto,
pageDto.md5)
... ... @@ -238,9 +249,11 @@ export class PageHelper {
// 批查互动数据
this.allCompBatchRequest(pageInfo.oneRequestPageGroupCompList.convertToArray(), pageModel)
//
// 记录第一页数量
this.saveFirstPageEndIndex(pageModel)
if (!isCache) {
pageModel.currentPage++
}
pageModel.viewType = ViewType.LOADED
this.refreshUIEnd(pageModel, true)
... ... @@ -409,6 +422,8 @@ export class PageHelper {
// 批查直播观看人数
this.getLiveRoomDataInfo(compList)
//
// 测试数据
// setTimeout(() => {
... ... @@ -752,6 +767,40 @@ export class PageHelper {
}
}
saveFirstPageEndIndex(pageModel: PageModel) {
pageModel.firstPageEndIndex = pageModel.compList.size() - 1
}
static updateFirstPageEndIndex(pageModel: PageModel, isDel: boolean, index: number) {
if (index > pageModel.firstPageEndIndex) {
return
}
// 这里默认删除、添加都是一条一条处理
let count = 1
let endIndex = pageModel.firstPageEndIndex
if (isDel) {
// 第一页里删除
let offset = Math.min(endIndex - index, count)
endIndex = endIndex - offset
} else {
// 第一页里添加
endIndex = endIndex + count
}
pageModel.firstPageEndIndex = endIndex
}
/**
* 删除分页数据,保留第一页的数据。(下拉刷新场景用到)
*/
deleteMorePage(pageModel: PageModel) {
Logger.debug(TAG, 'deleteMorePage endindex: ' + pageModel.firstPageEndIndex)
if (pageModel.firstPageEndIndex < 0) {
return
}
// 从第二页开始删
pageModel.compList.deleteItems(pageModel.firstPageEndIndex + 1)
}
}
... ...
... ... @@ -63,9 +63,11 @@ export default class PageModel {
pageType: number = 0;
extra: string = ''
// 缓存数据相关
cachePageInfoMd5: string = ''
cacheGroupInfoMd5: string = ''
// 页面加载,md5数据相关(初始缓存、下拉刷新用到)
displayPageInfoMd5: string = ''
displayGroupInfoMd5: string = ''
// 第一页,最后一个comp下标,用于区分分页加载(下拉刷新,清除分页数据)
firstPageEndIndex = -1
/**
* 简单复制业务数据
... ...
... ... @@ -177,6 +177,7 @@
{
"name": "color_848484",
"value": "#848484"
}
},
{"name": "color_33A3A3A3","value": "#33A3A3A3"}
]
}
\ No newline at end of file
... ...
... ... @@ -8,7 +8,7 @@ import { Logger, WindowModel } from 'wdKit/Index';
import { router, window } from '@kit.ArkUI';
import { devicePLSensorManager } from 'wdDetailPlayApi/Index';
import { LiveCommentComponent } from 'wdComponent/Index';
import { WDPlayerController } from 'wdPlayer/Index';
import { WDAliPlayerController, WDPlayerController } from 'wdPlayer/Index';
import { OperRowListView } from 'wdComponent/src/main/ets/components/view/OperRowListView';
import { publishCommentModel } from 'wdComponent/src/main/ets/components/comment/model/PublishCommentModel';
import { ResponseDTO } from 'wdNetwork/Index';
... ... @@ -19,7 +19,7 @@ let TAG: string = 'DetailPlayLivePage';
export struct DetailPlayLivePage {
//横竖屏,默认竖屏
@Provide displayDirection: DisplayDirection = DisplayDirection.VERTICAL
playerController: WDPlayerController = new WDPlayerController();
playerController: WDAliPlayerController = new WDAliPlayerController();
liveViewModel: LiveViewModel = new LiveViewModel()
@State relId: string = ''
@State contentId: string = ''
... ...
... ... @@ -4,7 +4,7 @@ import router from '@ohos.router';
import { WindowModel } from 'wdKit/Index';
import { PlayerComponent } from '../widgets/vertical/PlayerComponent';
import { PlayerInfoComponent } from '../widgets/vertical/PlayerInfoComponent';
import { WDPlayerController } from 'wdPlayer/Index';
import { WDAliPlayerController, WDPlayerController } from 'wdPlayer/Index';
import { DisplayDirection } from 'wdConstant/Index';
import { LiveEmptyComponent, WDLiveViewDefaultType } from 'wdComponent/Index';
import { PlayerEndView } from '../widgets/vertical/PlayerEndView';
... ... @@ -16,7 +16,7 @@ const TAG = 'DetailPlayVLivePage'
@Component
export struct DetailPlayVLivePage {
private liveViewModel: LiveViewModel = new LiveViewModel()
private playerController: WDPlayerController = new WDPlayerController();
private playerController: WDAliPlayerController = new WDAliPlayerController();
private swiperController: SwiperController = new SwiperController()
@Provide bottomSafeHeight: number = AppStorage.get<number>('bottomSafeHeight') || 0
@Provide topSafeHeight: number = AppStorage.get<number>('topSafeHeight') || 0
... ...
... ... @@ -2,14 +2,14 @@ import { window } from '@kit.ArkUI'
import lottie from '@ohos/lottie';
import { NumberFormatterUtils, StringUtils, WindowModel } from 'wdKit/Index'
import { DateFormatUtil, WDPlayerController } from 'wdPlayer/Index'
import { DateFormatUtil, WDAliPlayerController, WDPlayerController } from 'wdPlayer/Index'
import { LiveDetailsBean, LiveRoomDataBean } from 'wdBean/Index'
import { DisplayDirection } from 'wdConstant/Index'
import { LiveFollowComponent, LottieView } from 'wdComponent/Index'
@Component
export struct PlayUIComponent {
playerController: WDPlayerController = new WDPlayerController();
playerController?: WDAliPlayerController;
//菜单键是否可见
@State @Watch('onChangeMenuVisible') isMenuVisible: boolean = true
@Consume liveDetailsBean: LiveDetailsBean
... ... @@ -39,12 +39,14 @@ export struct PlayUIComponent {
aboutToAppear(): void {
this.onChangeMenuVisible()
//播放进度监听
if (this.playerController) {
this.playerController.onTimeUpdate = (position: number, duration: number) => {
this.currentTime = DateFormatUtil.secondToTime(Math.floor(position / 1000));
this.totalTime = DateFormatUtil.secondToTime(Math.floor(duration / 1000));
this.progressVal = Math.floor(position * 100 / duration);
}
}
}
aboutToDisappear(): void {
if (this.liveDetailsBean.liveInfo?.liveState == 'running') {
... ... @@ -312,10 +314,10 @@ export struct PlayUIComponent {
.onClick(() => {
if (this.isPlayStatus) {
this.isPlayStatus = false
this.playerController.pause()
this.playerController?.pause()
} else {
this.isPlayStatus = true
this.playerController.play()
this.playerController?.play()
}
})
}
... ...
import { LiveDetailsBean } from 'wdBean/Index';
import { StringUtils } from 'wdKit/Index';
import { WDPlayerController, WDPlayerRenderLiveView } from 'wdPlayer/Index';
import { WDAliPlayerController, WDPlayerController, WDPlayerRenderLiveView } from 'wdPlayer/Index';
import { PlayUIComponent } from './PlayUIComponent';
import { Logger } from 'wdKit/Index';
... ... @@ -10,12 +10,14 @@ const TAG: string = 'TopPlayComponent'
@Component
export struct TopPlayComponent {
@Consume @Watch('updateData') liveDetailsBean: LiveDetailsBean
playerController?: WDPlayerController
playerController?: WDAliPlayerController
@State imgUrl: string = ''
//未开始
@State isWait: boolean = false
//已结束直播
@State isEnd: boolean = false
private playUrl: string = ""
private xComponentIsLoaded: boolean = false
aboutToAppear(): void {
if (this.playerController) {
... ... @@ -49,16 +51,31 @@ export struct TopPlayComponent {
// this.playerController?.firstPlay('https://rmrbcmsonline.peopleapp.com/upload/rmh/video/mp4/202404/1713752415708fb81d0b8f137b.mp4');
if (StringUtils.isNotEmpty(playUrl)) {
Logger.debug(TAG, `${playUrl}`)
this.playerController?.firstPlay(playUrl);
this.playUrl = playUrl
this.tryToPlay()
}
}
}
tryToPlay() {
if (!this.xComponentIsLoaded) {
Logger.debug(TAG, "需要xComponent加载完成")
return
}
if (this.playUrl.length == 0) {
Logger.debug(TAG, "播放地址为空")
return
}
this.playerController?.firstPlay(this.playUrl);
}
build() {
Stack() {
WDPlayerRenderLiveView({
playerController: this.playerController,
onLoad: async () => {
this.xComponentIsLoaded = true
this.tryToPlay()
}
})
.height('100%')
... ...
import { LiveDetailsBean } from 'wdBean/Index';
import { WDPlayerController, WDPlayerRenderVLiveView, WDPlayerRenderView } from 'wdPlayer/Index';
import { WDPlayerController, WDPlayerRenderVLiveView, WDPlayerRenderView, WDAliPlayerController,
AliPlayerRenderView } from 'wdPlayer/Index';
import { PictureLoading } from './PictureLoading';
const TAG = 'PlayerComponent'
@Component
export struct PlayerComponent {
@Prop playerController: WDPlayerController;
@Prop playerController: WDAliPlayerController;
@Consume @Watch('updateData') liveDetailsBean: LiveDetailsBean
@Consume @Watch('pageShowChange') pageShow: number
@Consume @Watch('pageHideChange') pageHide: number
... ... @@ -78,7 +79,7 @@ export struct PlayerComponent {
}
})
} else if (this.liveStreamType == 0) {
WDPlayerRenderView({
AliPlayerRenderView({
playerController: this.playerController,
onLoad: () => {
this.playerController?.firstPlay(this.playUrl);
... ...
import { WDPlayerController } from 'wdPlayer/Index'
import { WDAliPlayerController, WDPlayerController } from 'wdPlayer/Index'
import { PlayerUIComponent } from './PlayerUIComponent'
@Component
export struct PlayerInfoComponent {
swiperController?: SwiperController
private playerController?: WDPlayerController
private playerController?: WDAliPlayerController
@Consume bottomSafeHeight: number
@Consume topSafeHeight: number
@Consume liveState: string
... ...
import { ContentDetailDTO } from 'wdBean/Index';
import { WDPlayerController } from 'wdPlayer/Index';
import { WDAliPlayerController, WDPlayerController } from 'wdPlayer/Index';
import { PlayerCommentComponent } from './PlayerCommentComponent';
import { PlayerTitleComponent } from './PlayerTitleComponent';
import { PlayerVideoControlComponent } from './PlayerVideoControlComponent';
@Component
export struct PlayerUIComponent {
private playerController?: WDPlayerController
private playerController?: WDAliPlayerController
@Consume isShowControl: boolean
build() {
... ...
... ... @@ -2,13 +2,13 @@ import { window } from '@kit.ArkUI'
import { NumberFormatterUtils, WindowModel } from 'wdKit/Index'
import { devicePLSensorManager } from 'wdDetailPlayApi/Index'
import { DateFormatUtil, WDPlayerController } from 'wdPlayer/Index'
import { DateFormatUtil, WDAliPlayerController, WDPlayerController } from 'wdPlayer/Index'
import { LiveDetailsBean, LiveRoomDataBean } from 'wdBean/Index'
@Component
export struct PlayerVideoControlComponent {
private playerController?: WDPlayerController
private playerController?: WDAliPlayerController
@Consume liveDetailsBean: LiveDetailsBean
@Consume liveRoomDataBean: LiveRoomDataBean
@State currentTime: string = ''
... ...
... ... @@ -12,6 +12,7 @@
"wdWebComponent": "file:../../commons/wdWebComponent",
"wdBean": "file:../../features/wdBean",
"wdRouter": "file:../../commons/wdRouter",
"wdNetwork": "file:../../commons/wdNetwork"
"wdNetwork": "file:../../commons/wdNetwork",
"wdTracking": "file:../../features/wdTracking"
}
}
... ...
... ... @@ -10,6 +10,7 @@ import {InterestsHobbiesModel} from '../../../../../../../products/phone/src/mai
import HuaweiAuth from '../../utils/HuaweiAuth'
import { loginComponentManager, LoginWithHuaweiIDButton } from '@hms.core.account.LoginComponent'
import { BusinessError } from '@ohos.base'
import { TrackingPageBrowse, TrackConstants } from 'wdTracking/Index'
@Extend(Row)
function otherStyle() {
... ... @@ -55,6 +56,8 @@ struct LoginPage {
customStyle: true,
maskColor:"#00000000"
})
pageShowTime:number = 0;
pageHideTime:number = 0;
loginViewModel = new LoginViewModel()
@State isProtocol:boolean=false
... ... @@ -70,7 +73,15 @@ struct LoginPage {
}
onPageShow() {
Logger.debug(TAG, "onPageShow:" + this.isCodeSend + "")
Logger.debug(TAG, "onPageShow:" + this.isCodeSend + " ")
this.pageShowTime = DateTimeUtils.getTimeStamp()
}
onPageHide(): void {
this.pageHideTime = DateTimeUtils.getTimeStamp()
let duration = 0
duration = Math.floor((this.pageHideTime - this.pageShowTime)/1000)
TrackingPageBrowse.trackCommonPageExposureEnd(TrackConstants.PageName.Login_Page,TrackConstants.PageName.Login_Page,duration)
}
build() {
... ...
import { CustomToast} from 'wdKit/Index';
import { CustomToast, DateTimeUtils} from 'wdKit/Index';
import { WDRouterPage, WDRouterRule } from 'wdRouter/Index';
import { LoginModel } from './LoginModel';
import { ModifyPasswordRequestItem } from './ModifyPasswordRequestItem';
import { router } from '@kit.ArkUI';
import { encryptMessage } from '../../utils/cryptoUtil';
import { TrackingPageBrowse, TrackConstants } from 'wdTracking/Index';
/**
* 修改密码页面
... ... @@ -26,7 +27,19 @@ struct ModifyPasswordPage {
customStyle: true,
maskColor:"#00000000"
})
pageShowTime:number = 0;
pageHideTime:number = 0;
onPageShow() {
this.pageShowTime = DateTimeUtils.getTimeStamp()
}
onPageHide(): void {
this.pageHideTime = DateTimeUtils.getTimeStamp()
let duration = 0
duration = Math.floor((this.pageHideTime - this.pageShowTime)/1000)
TrackingPageBrowse.trackCommonPageExposureEnd(TrackConstants.PageName.Change_Passwd,TrackConstants.PageName.Change_Passwd,duration)
}
build() {
Row() {
... ...
... ... @@ -15,3 +15,5 @@ export { DateFormatUtil } from "./src/main/ets/utils/DateFormatUtil"
export { WDAliPlayerController } from "./src/main/ets/controller/WDAliPlayerController"
export { WDListPlayerData, WDAliListPlayerController } from "./src/main/ets/controller/WDAliListPlayerController"
export { AliPlayerRenderView } from "./src/main/ets/pages/AliPlayerRenderView"
\ No newline at end of file
... ...
... ... @@ -11,8 +11,10 @@ import {
import { initGlobalPlayerSettings, setupPlayerConfig } from '../utils/GlobalSetting';
import prompt from '@ohos.promptAction';
import { Logger } from '../utils/Logger';
import { PlayerConstants, AVPlayerStatus, Events } from '../constants/PlayerConstants';
import { Logger } from 'wdKit/Index';
const TAG = "WDAliPlayerController"
/*
* 此播放器为阿里播放器鸿蒙版本封装,可播放单个视频、或直播
... ... @@ -54,7 +56,7 @@ export class WDAliPlayerController {
public onFirstFrameDisplay?: () => void
constructor() {
Logger.info("初始化")
Logger.info(TAG, "初始化")
initGlobalPlayerSettings()
this.initPromise = this.createAVPlayer();
}
... ... @@ -64,24 +66,24 @@ export class WDAliPlayerController {
*/
private createAVPlayer(): Promise<void> {
return new Promise((resolve, reject) => {
Logger.debug("开始创建")
Logger.debug(TAG, "开始创建")
let traceId = ''
this.avPlayer = AliPlayerFactory.createAliPlayer(getContext(), traceId)
if (this.avPlayer) {
Logger.debug("创建完成1")
Logger.debug(TAG, "创建完成1")
setupPlayerConfig(this.avPlayer!)
this.bindState();
resolve();
} else {
Logger.error("创建完成0")
Logger.error('[WDPlayerController] createAvPlayer fail!');
Logger.error(TAG, "创建完成0")
Logger.error(TAG, '[WDPlayerController] createAvPlayer fail!');
reject();
}
});
}
public destory() {
Logger.debug("播放器销毁")
Logger.debug(TAG, "播放器销毁")
this.avPlayer?.stop()
this.avPlayer?.release()
}
... ... @@ -94,13 +96,13 @@ export class WDAliPlayerController {
// 当调用play()方法后,会调用
onPrepared: () => {
this.duration = this.avPlayer?.getDuration();
Logger.debug("已准备好", `${this.duration}`)
Logger.debug(TAG, "已准备好", `${this.duration}`)
}
}
);
this.avPlayer?.setOnRenderingStartListener({
onRenderingStart: () => {
Logger.debug("首帧开始显示")
Logger.debug(TAG, "首帧开始显示")
if (this.onFirstFrameDisplay) {
this.onFirstFrameDisplay()
}
... ... @@ -108,7 +110,7 @@ export class WDAliPlayerController {
});
this.avPlayer?.setOnCompletionListener({
onCompletion: () => {
Logger.debug("播放完成")
Logger.debug(TAG, "播放完成")
}
});
this.avPlayer?.setOnInfoListener({
... ... @@ -116,7 +118,7 @@ export class WDAliPlayerController {
if (bean.getCode() === InfoCode.CurrentPosition) {
let position : number = bean.getExtraValue()
Logger.debug(`播放进度条:${position}/ ${this.duration}`)
Logger.debug(TAG, `播放进度条:${position}/ ${this.duration}`)
this.initProgress(position);
} else if (bean.getCode() === InfoCode.BufferedPosition) {
... ... @@ -126,7 +128,7 @@ export class WDAliPlayerController {
}
} else if (bean.getCode() === InfoCode.SwitchToSoftwareVideoDecoder) {
Logger.debug(`DOWNGRADE TO SOFTWARE DECODE`)
Logger.debug(TAG, `DOWNGRADE TO SOFTWARE DECODE`)
// this.mSwitchedToSoftListener?.onSwitched();
}
}
... ... @@ -134,7 +136,7 @@ export class WDAliPlayerController {
this.avPlayer?.setOnStateChangedListener({
onStateChanged: (status: number) => {
this.avPlayerStatus = status
Logger.debug("status update:" + `${this.getStatusStringWith(status)}`)
Logger.debug(TAG, "status update:" + `${this.getStatusStringWith(status)}`)
switch (status) {
case initalized: {
... ... @@ -189,7 +191,7 @@ export class WDAliPlayerController {
});
this.avPlayer?.setOnErrorListener({
onError:(errorInfo) => {
Logger.error("播放错误", JSON.stringify(errorInfo))
Logger.error(TAG, "播放错误", JSON.stringify(errorInfo))
this.errorCode = errorInfo.getCode()
this.errorMesage = errorInfo.getMsg()
this.status = PlayerConstants.STATUS_ERROR;
... ... @@ -240,16 +242,24 @@ export class WDAliPlayerController {
setXComponentController(controller: XComponentController) {
this.setSurfaceId(controller.getXComponentSurfaceId())
if (this.avPlayerStatus > PlayerConstants.STATUS_IDLE) {
Logger.info(TAG, "设置SurfaceId: " + this.surfaceId)
this.avPlayer?.setSurfaceId(this.surfaceId)
}
}
setSurfaceId(surfaceId: string) {
this.surfaceId = surfaceId
if (this.avPlayerStatus > PlayerConstants.STATUS_IDLE) {
Logger.info(TAG, "设置SurfaceId: " + this.surfaceId)
this.avPlayer?.setSurfaceId(this.surfaceId)
}
}
async firstPlay(url: string) {
this.url = url;
if (this.avPlayer == null) {
Logger.info("等待播放器初始化")
Logger.info(TAG, "等待播放器初始化")
await this.initPromise;
} else {
if (this.avPlayerStatus != idle) {
... ... @@ -269,10 +279,10 @@ export class WDAliPlayerController {
this.avPlayer?.setAutoPlay(false)
Logger.debug("开始播放", this.url)
Logger.debug(TAG, "开始播放", this.url)
this.setAliPlayerURL(this.url);
Logger.info("设置SurfaceId" + this.surfaceId)
Logger.info(TAG, "设置SurfaceId: " + this.surfaceId)
this.avPlayer?.setSurfaceId(this.surfaceId)
this.avPlayer?.prepare()
... ... @@ -287,17 +297,17 @@ export class WDAliPlayerController {
}
pause() {
Logger.debug("暂停", this.url)
Logger.debug(TAG, "暂停", this.url)
this.avPlayer?.pause();
}
play() {
Logger.debug("播放", this.url)
Logger.debug(TAG, "播放", this.url)
this.avPlayer?.start();
}
stop() {
Logger.debug("停止", this.url)
Logger.debug(TAG, "停止", this.url)
this.avPlayer?.stop();
}
... ... @@ -405,7 +415,7 @@ export class WDAliPlayerController {
if (this.onVolumeUpdate) {
this.onVolumeUpdate(this.volume);
}
console.log("volume : " + this.volume)
Logger.debug(TAG, "volume : " + this.volume)
}
onBrightActionUpdate(event: GestureEvent) {
... ... @@ -429,7 +439,7 @@ export class WDAliPlayerController {
}
watchStatus() {
console.log('watchStatus', this.status)
Logger.debug(TAG, 'watchStatus: ' + this.status)
if (this.onStatusChange) {
this.onStatusChange(this.status)
}
... ...
import componentUtils from '@ohos.arkui.componentUtils';
import { WDPlayerController } from '../controller/WDPlayerController'
import { WindowModel } from 'wdKit';
import { Logger } from '../utils/Logger';
import { enableAliPlayer } from '../utils/GlobalSetting';
import { WDAliPlayerController } from '../controller/WDAliPlayerController';
class Size {
width: Length = "100%";
height: Length = "100%";
constructor(width: Length, height: Length) {
this.width = width;
this.height = height;
}
}
let insIndex: number = 0;
const TAG = 'AliPlayerRenderView'
class MGPlayRenderViewIns {
static intCount: number = 0;
static add() {
MGPlayRenderViewIns.intCount++;
WindowModel.shared.setWindowKeepScreenOn(true);
console.log("add-- +1")
}
static del() {
console.log("del-- -1")
MGPlayRenderViewIns.intCount--;
if (MGPlayRenderViewIns.intCount <= 0) {
WindowModel.shared.setWindowKeepScreenOn(false);
}
}
}
/**
* 播放窗口组件,对接阿里播放器的RenderView
*/
@Component
export struct AliPlayerRenderView {
private playerController?: WDAliPlayerController;
private xComponentController: XComponentController = new XComponentController();
private insId: string = "AliPlayerRenderView" + insIndex;
onLoad?: ((event?: object) => void);
@State videoWidth: number = 16
@State videoHeight: number = 9
@State videoRatio: number = 16 / 9
@State selfSize: Size = new Size('100%', '100%');
private enableAliPlayer = true
aboutToAppear() {
MGPlayRenderViewIns.add();
insIndex++;
if (!this.playerController) {
return
}
this.playerController.onVideoSizeChange = (width: number, height: number) => {
// console.log(`WDPlayerRenderView onVideoSizeChange width:${width} videoTop:${height}`)
Logger.info(TAG, ` onVideoSizeChange width:${width} videoTop:${height}`)
this.videoWidth = width;
this.videoHeight = height;
this.videoRatio = width / height
this.updateLayout()
}
}
aboutToDisappear() {
Logger.info(TAG, `aboutToDisappear`)
MGPlayRenderViewIns.del();
}
build() {
Row() {
// 设置为“surface“类型时XComponent组件可以和其他组件一起进行布局和渲染。
XComponent({
id: this.insId,
type: XComponentType.SURFACE,
libraryname: enableAliPlayer && this.enableAliPlayer ? "premierlibrary" : undefined,
controller: this.xComponentController
})
.onLoad(async (event) => {
Logger.info(TAG, 'onLoad')
this.xComponentController.setXComponentSurfaceSize({
surfaceWidth: 1920,
surfaceHeight: 1080
});
if (enableAliPlayer && this.enableAliPlayer) {
this.playerController?.setSurfaceId(this.insId)
} else {
this.playerController?.setXComponentController(this.xComponentController)
}
if (this.onLoad) {
this.onLoad(event)
}
})
.zIndex(1000)
.width(this.selfSize.width)
.height(this.selfSize.height)
}
.onAreaChange(() => {
this.updateLayout()
})
.backgroundColor("#000000")
.justifyContent(FlexAlign.Center)
.height('100%')
.width('100%')
.align(this.videoWidth > this.videoHeight ? Alignment.Top : Alignment.Center)
}
updateLayout() {
let info = componentUtils.getRectangleById(this.insId);
if (info.size.width > 0 && info.size.height > 0 && this.videoHeight > 0 && this.videoWidth > 0) {
if (info.size.width / info.size.height > this.videoWidth / this.videoHeight) {
let scale = info.size.height / this.videoHeight;
this.selfSize = new Size((this.videoWidth * scale / info.size.width) * 100 + "%", '100%');
} else {
let scale = info.size.width / this.videoWidth;
this.selfSize = new Size('100%', (this.videoHeight * scale / info.size.height) * 100 + "%");
}
}
}
}
\ No newline at end of file
... ...
... ... @@ -3,6 +3,7 @@ import { WDPlayerController } from '../controller/WDPlayerController'
import { WindowModel } from 'wdKit';
import { Logger } from '../utils/Logger';
import { enableAliPlayer } from '../utils/GlobalSetting';
import { WDAliPlayerController } from '../controller/WDAliPlayerController';
class Size {
width: Length = "100%";
... ... @@ -40,7 +41,7 @@ class MGPlayRenderViewIns {
*/
@Component
export struct WDPlayerRenderLiveView {
private playerController?: WDPlayerController;
private playerController?: WDAliPlayerController;
private xComponentController: XComponentController = new XComponentController();
onLoad?: ((event?: object) => void);
videoWidth: number = 0
... ...
... ... @@ -3,6 +3,7 @@ import { WDPlayerController } from '../controller/WDPlayerController'
import { WindowModel } from 'wdKit';
import { Logger } from '../utils/Logger';
import { enableAliPlayer } from '../utils/GlobalSetting';
import { WDAliPlayerController } from '../controller/WDAliPlayerController';
class Size {
width: Length = "100%";
... ... @@ -40,7 +41,7 @@ class MGPlayRenderViewIns {
*/
@Component
export struct WDPlayerRenderVLiveView {
private playerController?: WDPlayerController;
private playerController?: WDAliPlayerController;
private xComponentController: XComponentController = new XComponentController();
private insId: string = "WDPlayRenderView" + insIndex;
onLoad?: ((event?: object) => void);
... ...
... ... @@ -48,6 +48,7 @@ export struct WDPlayerRenderView {
@State videoHeight: number = 9
@State videoRatio: number = 16 / 9
@State selfSize: Size = new Size('100%', '100%');
private enableAliPlayer = false
aboutToAppear() {
MGPlayRenderViewIns.add();
... ... @@ -78,7 +79,7 @@ export struct WDPlayerRenderView {
XComponent({
id: this.insId,
type: XComponentType.SURFACE,
libraryname: enableAliPlayer ? "premierlibrary" : undefined,
libraryname: enableAliPlayer && this.enableAliPlayer ? "premierlibrary" : undefined,
controller: this.xComponentController
})
.onLoad(async (event) => {
... ... @@ -87,7 +88,7 @@ export struct WDPlayerRenderView {
surfaceWidth: 1920,
surfaceHeight: 1080
});
if (enableAliPlayer) {
if (enableAliPlayer && this.enableAliPlayer) {
this.playerController?.setSurfaceId(this.insId)
} else {
this.playerController?.setXComponentController(this.xComponentController)
... ...
... ... @@ -43,4 +43,4 @@ export function setupPlayerConfig(player: AliPlayer) {
* 3、WDAliListPlayerController 暂时由于SDK问题,不能使用
* 4、
* */
export const enableAliPlayer = false
\ No newline at end of file
export const enableAliPlayer = true
\ No newline at end of file
... ...
... ... @@ -97,7 +97,7 @@ export namespace TrackConstants {
/// 设置页
Setting = "settingPage",
/// 账号管理
/// 账号管理//账户与安全
Account_Management = "accountManagementPage",
/// 注销账户
Cancel_Account = "cancelAccountPage",
... ...
... ... @@ -29,12 +29,15 @@ struct MultiPictureDetailPage {
.backgroundColor(Color.Black)
}
pageTransition(){
// 定义页面进入时的效果,从右边侧滑入
PageTransitionEnter({ type: RouteType.None, duration: 300 })
pageTransition() {
// 为目标页面时,进入:从右边侧滑入,退出:是右侧划出;跳转别的页面:左侧划出,返回:左侧划入。
PageTransitionEnter({ type: RouteType.Push, duration: 300 })
.slide(SlideEffect.Right)
// 定义页面退出时的效果,向右边侧滑出
PageTransitionExit({ type: RouteType.None, duration: 300 })
PageTransitionEnter({ type: RouteType.Pop, duration: 300 })
.slide(SlideEffect.Left)
PageTransitionExit({ type: RouteType.Push, duration: 300 })
.slide(SlideEffect.Left)
PageTransitionExit({ type: RouteType.Pop, duration: 300 })
.slide(SlideEffect.Right)
}
... ... @@ -62,6 +65,17 @@ struct MultiPictureDetailPage {
this.closeFullScreen()
}
onPageShow(): void {
console.log(TAG, 'onPageShow')
this.openFullScreen()
}
onPageHide(): void {
console.log(TAG, 'onPageHide')
this.closeFullScreen()
}
/**
* 开启沉浸式
* TODO:颜色待根据业务接口修改
... ...