wangyujian_wd

feat:1)直播详情-直播间和大家聊接口调试

... ... @@ -192,6 +192,15 @@ export class HttpUrlUtils {
static readonly LIVE_DETAILS_PATH: string = "/api/rmrb-bff-display-zh/content/zh/c/content/detail";
/**
* 直播详情-直播间列表
*/
static readonly LIVE_LIST_PATH: string = "/api/live-center-message/zh/a/live/message/video/list";
/**
* 直播详情-大家聊列表
*/
static readonly LIVE_CHAT_LIST_PATH: string = "/api/live-center-message/zh/a/live/message/chat/list";
/**
* 搜索结果 显示tab 数
*/
... ... @@ -588,6 +597,16 @@ export class HttpUrlUtils {
return url
}
static getLiveListUrl() {
let url = HttpUrlUtils._hostUrl + HttpUrlUtils.LIVE_LIST_PATH
return url
}
static getLiveChatListUrl() {
let url = HttpUrlUtils._hostUrl + HttpUrlUtils.LIVE_CHAT_LIST_PATH
return url
}
static getSearchResultCountDataUrl() {
let url = HttpUrlUtils._hostUrl + HttpUrlUtils.SEARCH_RESULT_COUNT_DATA_PATH
return url
... ...
... ... @@ -113,3 +113,6 @@ export { LiveDetailsBean } from './src/main/ets/bean/live/LiveDetailsBean';
export { ArticleListDTO } from './src/main/ets/bean/component/ArticleListDTO';
export { appStyleImagesDTO } from './src/main/ets/bean/content/appStyleImagesDTO';
export { LiveRoomBean,LiveRoomItemBean } from './src/main/ets/bean/live/LiveRoomBean';
... ...
export interface LiveRoomBean {
pageNum: number
pageSize: number
totalCount: number
barrageResponses: Array<LiveRoomItemBean>
}
export interface LiveRoomItemBean {
text: string
senderUserAvatarUrl: string
senderUserName: string
pictureUrls: string[]
time: string
//1上墙0未上墙
isWall: number
//是否置顶 1置顶0不置顶
isTop: number
role: string
}
\ No newline at end of file
... ...
... ... @@ -2,6 +2,7 @@ import { LiveDetailsBean } from 'wdBean/Index';
import { LiveViewModel } from '../viewModel/LiveViewModel';
import { BottomComponent } from '../widgets/details/BottomComponent';
import { TabComponent } from '../widgets/details/TabComponent';
import { TopPlayComponent } from '../widgets/details/video/TopPlayComponet';
@Entry
@Component
... ... @@ -16,7 +17,7 @@ export struct DetailPlayLivePage {
build() {
Column() {
// TopPlayComponent({playUrl:this.playUrl})
TopPlayComponent({playUrl:'http://mlive3.video.weibocdn.com/record/alicdn/5018726527666338/index.m3u8'})
TabComponent()
BottomComponent()
}
... ...
... ... @@ -2,7 +2,7 @@ import HashMap from '@ohos.util.HashMap';
import { HttpUrlUtils, ResponseDTO } from 'wdNetwork';
import { HttpRequest } from 'wdNetwork/src/main/ets/http/HttpRequest';
import { Logger } from 'wdKit';
import { LiveDetailsBean } from 'wdBean/Index';
import { LiveDetailsBean, LiveRoomBean } from 'wdBean/Index';
const TAG = 'LiveModel'
... ... @@ -34,7 +34,78 @@ export class LiveModel {
Logger.debug(TAG + ":error ", error.toString())
})
})
}
/**
* 获取直播详情页面直播间数据列表
* @param pageNum
* @param mLiveId
* @param liveId
* @param pageSize
* @returns
*/
getLiveList(pageNum: number, mLiveId: string, liveId: string, pageSize: number) {
let params: Record<string, string> = {};
params['pageNum'] = pageNum + ''
params['mLiveId'] = mLiveId
params['liveId'] = liveId
params['pageSize'] = pageSize + ''
let headers: HashMap<string, string> = HttpUrlUtils.getCommonHeaders();
return new Promise<LiveRoomBean>((success, fail) => {
HttpRequest.post<ResponseDTO<LiveRoomBean>>(
HttpUrlUtils.getLiveListUrl(),
params,
headers).then((data: ResponseDTO<LiveRoomBean>) => {
if (!data || !data.data) {
fail("数据为空")
return
}
if (data.code != 0) {
fail(data.message)
return
}
success(data.data)
}, (error: Error) => {
fail(error.message)
Logger.debug(TAG + ":error ", error.toString())
})
})
}
/**
* 获取直播详情页面大家聊数据列表
* @param pageNum
* @param mLiveId
* @param liveId
* @param pageSize
* @returns
*/
getLiveChatList(pageNum: number, mLiveId: string, liveId: string, pageSize: number) {
let params: Record<string, string> = {};
params['pageNum'] = pageNum + ''
params['mLiveId'] = mLiveId
params['liveId'] = liveId
params['pageSize'] = pageSize + ''
let headers: HashMap<string, string> = HttpUrlUtils.getCommonHeaders();
return new Promise<LiveRoomBean>((success, fail) => {
HttpRequest.post<ResponseDTO<LiveRoomBean>>(
HttpUrlUtils.getLiveChatListUrl(),
params,
headers).then((data: ResponseDTO<LiveRoomBean>) => {
if (!data || !data.data) {
fail("数据为空")
return
}
if (data.code != 0) {
fail(data.message)
return
}
success(data.data)
}, (error: Error) => {
fail(error.message)
Logger.debug(TAG + ":error ", error.toString())
})
})
}
}
... ...
import { LiveDetailsBean } from 'wdBean/Index'
import { LiveDetailsBean, LiveRoomBean } from 'wdBean/Index'
import { LiveModel } from './LiveModel'
const TAG = "LiveViewModel"
... ... @@ -19,6 +19,27 @@ export class LiveViewModel {
fail(message)
})
})
}
//直播详情直播间数据列表
getLiveList(pageNum: number, mLiveId: string, liveId: string, pageSize: number) {
return new Promise<LiveRoomBean>((success, fail) => {
this.liveModel.getLiveList(pageNum, mLiveId, liveId, pageSize).then((data) => {
success(data)
}).catch((message: string) => {
fail(message)
})
})
}
//直播详情大家聊数据列表
getLiveChatList(pageNum: number, mLiveId: string, liveId: string, pageSize: number) {
return new Promise<LiveRoomBean>((success, fail) => {
this.liveModel.getLiveChatList(pageNum, mLiveId, liveId, pageSize).then((data) => {
success(data)
}).catch((message: string) => {
fail(message)
})
})
}
}
\ No newline at end of file
... ...
import { ListHasNoMoreDataUI } from 'wdComponent/Index'
import { LiveRoomItemBean } from 'wdBean/Index'
import { EmptyComponent, ErrorComponent, ListHasNoMoreDataUI } from 'wdComponent/Index'
import CustomRefreshLoadLayout from 'wdComponent/src/main/ets/components/page/CustomRefreshLoadLayout'
import LoadMoreLayout from 'wdComponent/src/main/ets/components/page/LoadMoreLayout'
import RefreshLayout from 'wdComponent/src/main/ets/components/page/RefreshLayout'
import { RefreshLayoutBean } from 'wdComponent/src/main/ets/components/page/RefreshLayoutBean'
import PageModel from 'wdComponent/src/main/ets/viewmodel/PageModel'
import { ViewType } from 'wdConstant/Index'
import { LiveViewModel } from '../../viewModel/LiveViewModel'
import { TabChatItemComponent } from './TabChatItemComponent'
@Component
export struct TabChatComponent {
arr: string[] = []
@State private pageModel: PageModel = new PageModel()
liveViewModel: LiveViewModel = new LiveViewModel()
@State liveChatList: Array<LiveRoomItemBean> = []
aboutToAppear(): void {
for (let index = 0; index < 12; index++) {
this.arr.push(index + '')
}
this.getLiveChatList()
}
build() {
Stack() {
if (this.arr.length == 0) {
ListHasNoMoreDataUI({ style: 2 })
if (this.pageModel.viewType == ViewType.LOADING) {
this.LoadingLayout()
} else if (this.pageModel.viewType == ViewType.ERROR) {
ErrorComponent()
} else if (this.pageModel.viewType == ViewType.EMPTY) {
EmptyComponent()
} else {
this.ListLayout()
}
}
.align(Alignment.Top)
.backgroundColor('#F5F5F5')
.height('100%')
.width('100%')
}
@Builder
ListLayout() {
List() {
ForEach(this.arr, (item: string) => {
ListItem() {
TabChatItemComponent()
// 下拉刷新
RefreshLayout({
refreshBean: new RefreshLayoutBean(this.pageModel.isVisiblePullDown, this.pageModel.pullDownRefreshImage,
this.pageModel.pullDownRefreshText, this.pageModel.pullDownRefreshHeight)
})
}
ForEach(this.liveChatList, (item: LiveRoomItemBean) => {
ListItem() {
TabChatItemComponent({ item: item })
}
})
// 加载更多
ListItem() {
if (this.pageModel.hasMore) {
LoadMoreLayout({
refreshBean: new RefreshLayoutBean(this.pageModel.isVisiblePullUpLoad, this.pageModel.pullUpLoadImage,
this.pageModel.pullUpLoadText, this.pageModel.pullUpLoadHeight)
})
} else {
ListHasNoMoreDataUI()
}
}
}
}
.align(Alignment.Top)
.backgroundColor('#F5F5F5')
.height('100%')
.width('100%')
@Builder
LoadingLayout() {
CustomRefreshLoadLayout({
refreshBean: new RefreshLayoutBean(true,
$r('app.media.ic_pull_up_load'), $r('app.string.pull_up_load_text'), this.pageModel.pullDownRefreshHeight)
})
}
getLiveChatList() {
this.pageModel.currentPage = 1
this.liveViewModel.getLiveChatList(1, '20000016257', '20000016229', 20,)
.then(
(data) => {
if (data.barrageResponses && data.barrageResponses.length > 0) {
this.pageModel.viewType = ViewType.LOADED;
this.liveChatList.push(...data.barrageResponses)
if (data.barrageResponses.length === this.pageModel.pageSize) {
this.pageModel.currentPage++;
this.pageModel.hasMore = true;
} else {
this.pageModel.hasMore = false;
}
} else {
this.pageModel.viewType = ViewType.EMPTY;
}
},
() => {
})
}
aboutToDisappear(): void {
... ...
import { LiveRoomItemBean } from 'wdBean/Index'
@Component
export struct TabChatItemComponent {
item: LiveRoomItemBean = {} as LiveRoomItemBean
aboutToAppear(): void {
}
build() {
Row() {
Image('https://img0.baidu.com/it/u=4105778329,1297102594&fm=253&fmt=auto&app=120&f=JPEG?w=500&h=500')
Image(this.item.senderUserAvatarUrl)
.borderRadius(90)
.width(24)
.height(24)
Text() {
Span('10999@qq.com: ')
Span(this.item.senderUserName + ': ')
.fontColor('#666666')
Span('少年强则国强:山中有精灵也不过如此了')
Span(this.item.text)
.fontColor('#222222')
}
.margin({ left: 8 })
... ...
import { LiveRoomItemBean } from 'wdBean/Index'
import { ListHasNoMoreDataUI } from 'wdComponent/Index'
import { LiveViewModel } from '../../viewModel/LiveViewModel'
import { TabLiveItemComponent } from './TabLiveItemComponent'
@Component
export struct TabLiveComponent {
arr: string[] = []
liveViewModel: LiveViewModel = new LiveViewModel()
@State liveList: Array<LiveRoomItemBean> = []
aboutToAppear(): void {
for (let index = 0; index < 2; index++) {
this.arr.push(index + '')
}
this.getLiveList()
}
build() {
Stack() {
if (this.arr.length == 0) {
if (this.liveList.length == 0) {
ListHasNoMoreDataUI({ style: 2 })
} else {
List() {
ForEach(this.arr, (item: string) => {
ForEach(this.liveList, (item: LiveRoomItemBean) => {
ListItem() {
TabLiveItemComponent({ item: item })
}
... ... @@ -35,6 +36,17 @@ export struct TabLiveComponent {
}
getLiveList() {
this.liveViewModel.getLiveList(1, '20000016257', '20000016229', 20,)
.then(
(data) => {
this.liveList = data.barrageResponses
},
() => {
})
}
aboutToDisappear(): void {
}
}
\ No newline at end of file
... ...
import { LiveRoomItemBean } from 'wdBean/Index'
import { DateTimeUtils } from 'wdKit/Index'
@Component
export struct TabLiveItemComponent {
item: string = ''
item: LiveRoomItemBean = {} as LiveRoomItemBean
aboutToAppear(): void {
... ... @@ -9,18 +12,18 @@ export struct TabLiveItemComponent {
build() {
Column() {
Row() {
Image('https://img0.baidu.com/it/u=4105778329,1297102594&fm=253&fmt=auto&app=120&f=JPEG?w=500&h=500')
Image(this.item.senderUserAvatarUrl)
.borderRadius(90)
.width(24)
.height(24)
Text('人民日报直播频道')
Text(this.item.senderUserName)
.maxLines(1)
.textOverflow({ overflow: TextOverflow.Ellipsis })
.fontSize('14fp')
.fontWeight(400)
.fontColor('#222222')
.margin({ left: 8 })
Text('嘉宾')
Text('主持人')
.maxLines(1)
.textOverflow({ overflow: TextOverflow.Ellipsis })
.fontSize('11fp')
... ... @@ -35,7 +38,8 @@ export struct TabLiveItemComponent {
})
.borderRadius(2)
.margin({ left: 8 })
Text('1小时前')
.visibility('host' == this.item.role ? Visibility.Visible : Visibility.None)
Text(DateTimeUtils.getCommentTime(new Date(this.item.time).getTime()))
.maxLines(1)
.textOverflow({ overflow: TextOverflow.Ellipsis })
.fontSize('12fp')
... ... @@ -58,10 +62,11 @@ export struct TabLiveItemComponent {
})
.borderRadius(2)
.margin({ left: 8 })
.visibility(1 == this.item.isTop ? Visibility.Visible : Visibility.None)
}
.width('100%')
Text('国务院新闻办公室将于7月25日上午10时举行国务院政策例行吹风会,请应急管理部副部长、水利部副部长王道席和自然资源部、水利部、应急管理部、中国气象局、国家消防救援局有关负责人介绍防汛抗旱工作情况,并答记者问。')
Text(this.item.text)
.fontSize('14fp')
.fontWeight(400)
.fontColor('#222222')
... ... @@ -69,21 +74,25 @@ export struct TabLiveItemComponent {
left: 32,
top: 6
})
Image('https://t7.baidu.com/it/u=3690528415,706188365&fm=193&f=GIF')
List() {
ForEach(this.item.pictureUrls, (item: string, index: number) => {
ListItem() {
Image(item)
.height(174)
.width(310)
.aspectRatio(310 / 174)
.objectFit(ImageFit.Auto)
.borderRadius(4)
.margin({
}
})
}.margin({
left: 32,
top: 8
})
}.margin({
left:15,
top:15,
right:15
left: 15,
top: 15,
right: 15
})
}
... ...
... ... @@ -3,6 +3,34 @@
{
"name": "shared_desc",
"value": "description"
},
{
"name": "footer_text",
"value": "已经到底了"
},
{
"name": "pull_up_load_text",
"value": "加载中..."
},
{
"name": "pull_down_refresh_text",
"value": "下拉刷新"
},
{
"name": "release_refresh_text",
"value": "松开刷新"
},
{
"name": "refreshing_text",
"value": "正在刷新"
},
{
"name": "refresh_success_text",
"value": "刷新成功"
},
{
"name": "refresh_fail_text",
"value": "刷新失败"
}
]
}
\ No newline at end of file
... ...