张善主

Merge remote-tracking branch 'origin/main'

Showing 39 changed files with 1800 additions and 776 deletions
... ... @@ -16,6 +16,7 @@ interface dataObject {
operateType?: string
webViewHeight?: string
dataJson?: string
appInnerLink?: string
}
/**
* 消息Message
... ...
... ... @@ -585,6 +585,12 @@ export class HttpUrlUtils {
return url
}
/*获取子评论列表*/
static getChildContentCommentListDataUrl() {
let url = HttpUrlUtils._hostUrl + "/api/rmrb-comment/comment/zh/c/childCommentList"
return url
}
/*评论状态*/
static getBatchCommentStatusUrl() {
let url = HttpUrlUtils._hostUrl + "/api/rmrb-comment/comment/zh/c/batchCommentStatus"
... ... @@ -597,6 +603,18 @@ export class HttpUrlUtils {
return url
}
/*发布评论*/
static getPublishCommentUrl() {
let url = HttpUrlUtils._hostUrl + "/api/rmrb-comment/comment/zh/c/publish"
return url
}
/*游客发布评论*/
static getNoUserPublishCommentUrl() {
let url = HttpUrlUtils._hostUrl + "/api/rmrb-comment/comment/zh/c/commentLike"
return url
}
/*levleIcon*/
static getBatchUserUrl() {
let url = HttpUrlUtils._hostUrl + "/api/rmrb-user-point/auth/level/zh/c/batchUser"
... ...
... ... @@ -138,7 +138,7 @@ export class ProcessUtils {
* 动态详情页(动态视频/动态图片)
* @param content
* */
private static gotoDynamicDetailPage(content: ContentDTO) {
public static gotoDynamicDetailPage(content: ContentDTO) {
let taskAction: Action = {
type: 'JUMP_DETAIL_PAGE',
params: {
... ... @@ -172,7 +172,7 @@ export class ProcessUtils {
Logger.debug(TAG, `gotoMultiPictureListPage`);
}
private static gotoSpecialTopic(content: ContentDTO) {
public static gotoSpecialTopic(content: ContentDTO) {
let taskAction: Action = {
type: 'JUMP_INNER_NEW_PAGE',
params: {
... ... @@ -183,7 +183,7 @@ export class ProcessUtils {
WDRouterRule.jumpWithAction(taskAction)
}
private static gotoDefaultWeb(content: ContentDTO) {
public static gotoDefaultWeb(content: ContentDTO) {
let taskAction: Action = {
type: 'JUMP_H5_BY_WEB_VIEW',
params: {
... ... @@ -212,7 +212,7 @@ export class ProcessUtils {
Logger.debug(TAG, `commentGotoWeb, ${content.newsId}`);
}
private static gotoWeb(content: ContentDTO) {
public static gotoWeb(content: ContentDTO) {
let taskAction: Action = {
type: 'JUMP_INNER_NEW_PAGE',
params: {
... ... @@ -231,7 +231,7 @@ export class ProcessUtils {
Logger.debug(TAG, `gotoWeb, ${content.objectId}`);
}
private static gotoVod(content: ContentDTO) {
public static gotoVod(content: ContentDTO) {
let taskAction: Action = {
type: 'JUMP_DETAIL_PAGE',
params: {
... ... @@ -247,7 +247,7 @@ export class ProcessUtils {
Logger.debug(TAG, `gotoVod, ${content.objectId}`);
}
private static async gotoLive(content: ContentDTO) {
public static async gotoLive(content: ContentDTO) {
let taskAction: Action = {
type: 'JUMP_DETAIL_PAGE',
params: {
... ... @@ -263,7 +263,7 @@ export class ProcessUtils {
Logger.debug(TAG, `gotoLive, ${content.objectId}`);
}
private static gotoAudio(content: ContentDTO) {
public static gotoAudio(content: ContentDTO) {
let taskAction: Action = {
type: 'JUMP_DETAIL_PAGE',
params: {
... ... @@ -283,7 +283,7 @@ export class ProcessUtils {
* 金刚位聚合页
* @param content
* */
private static gotoThemeListPage(content: ContentDTO) {
public static gotoThemeListPage(content: ContentDTO) {
let taskAction: Action = {
type: 'JUMP_DETAIL_PAGE',
params: {
... ... @@ -303,7 +303,7 @@ export class ProcessUtils {
* 图片预览页
* @param content
* */
private static gotoAtlasDetailPage(content: ContentDTO) {
public static gotoAtlasDetailPage(content: ContentDTO) {
let taskAction: Action = {
type: 'JUMP_DETAIL_PAGE',
params: {
... ... @@ -351,5 +351,43 @@ export class ProcessUtils {
WDRouterRule.jumpWithAction(taskAction)
}
/**
* 打开早晚报
*/
public static gotoMorningEveningPaper() {
let taskAction: Action = {
type: 'JUMP_INNER_NEW_PAGE',
params: {
pageID: 'MorningEveningPaper'
} as Params,
};
WDRouterRule.jumpWithAction(taskAction)
}
/**
* 打开电子报
*/
public static gotoENewsPaper() {
let taskAction: Action = {
type: 'JUMP_INNER_NEW_PAGE',
params: {
pageID: 'E_NEWSPAPER'
} as Params,
};
WDRouterRule.jumpWithAction(taskAction)
}
/**
* 打开播报
*/
public static gotoBroadcastPage(pageId: number) {
let taskAction: Action = {
type: 'JUMP_INNER_NEW_PAGE',
params: {
pageID: 'BroadcastPage',
id: pageId
} as Params,
};
WDRouterRule.jumpWithAction(taskAction)
}
}
... ...
export class H5OperateType {
/* jsCall_currentPageOperate#operateType
1、关闭页面
2、页面reload,
3、返回上一级历史,
4、允许蜂窝网络播放视频
5、邮件订阅关闭事件
6、H5进入沉浸式播放 (android)
7、H5退出沉浸式播放(andriod)
8、WebView高度更新
9、App播放视频
10、H5开始播放音频 (处理音视频互斥问题)
12、关闭 App原生默认顶部导航,并通顶显示Webview (专题页使用)
13、显示 App原生默认顶部导航,支持返回按钮和标题显示(专题页使用,默认不用设置)
14、关闭 底部评论交互BAR (专题页使用,默认不用设置)
15、显示 底部评论交互BAR(专题页使用)
16、显示 顶导分享按钮(专题页使用,针对默认顶导情况)
17、关闭 顶导分享按钮(专题页使用,针对默认顶导情况)
18、设置页面标题 (专题页使用,针对默认顶导情况)
19、设置页面状态栏颜色(专题页使用,针对默认顶导情况)
20、设置页面底部蒙层效果显示(专题页使用,针对默认顶导情况)
21、设置页面底部蒙层效果 隐藏(专题页使用,针对默认顶导情况)
22、页面加载失败后重试操作
23、开启H5自己的返回操作(默认关闭,当开启后 App返回/物理按键返回 都需要调用H5的返回方法,参见:jsCall_appNotifyEvent)
24、号主关注操作 状态更新
30、关闭当前页面左滑事件
31、打开当前页面左滑事件
32、开始弹全局弹框事件(原生代码确保Webview底部到底)
33、结束全局弹框事件(原生代码确保Webview正常恢复)
40、抽奖 阅读、评论、点赞、关注等任务--跳首页 (默认)
41、抽奖 签到任务–-跳积分中心签到
42、抽奖 意见反馈–跳意见反馈页面
43、抽奖 关注号主任务–跳关注列表页
44、抽奖 创作者认证 页面,H5 直接跳人民号申请页?
45、打开APP直接使用goBack(安卓使用,使用场景:h5页面跳转新页面,但url没有变化,不能返回上一级页面)
46、关闭APP直接使用goBack(安卓使用)
*/
// 1、关闭页面
static readonly TYPE_ONE: string = "1";
}
\ No newline at end of file
... ...
... ... @@ -2,11 +2,22 @@ import { Callback } from 'wdJsBridge';
import { Message } from 'wdJsBridge/src/main/ets/bean/Message';
import { Logger } from 'wdKit';
import { H5CallNativeType } from './H5CallNativeType';
import { ContentDTO } from 'wdBean';
import { ProcessUtils } from 'wdRouter/src/main/ets/utils/ProcessUtils';
import { H5OperateType } from './H5OperateType';
import { ContentConstants } from 'wdConstant';
import { ProcessUtils } from 'wdRouter';
import router from '@ohos.router';
import Url from '@ohos.url'
import { ContentDTO } from 'wdBean/Index';
const TAG = 'JsBridgeBiz'
class AppInfo {
plat: string = ''
system: string = ''
networkStatus: number = 1
// TODO 完善
}
/**
* h5调用native代码
* @param data
... ... @@ -17,6 +28,7 @@ export function performJSCallNative(data: Message, call: Callback) {
switch (data.handlerName) {
case H5CallNativeType.jsCall_currentPageOperate:
handleJsCallCurrentPageOperate(data)
break;
case H5CallNativeType.jsCall_getAppPublicInfo:
// h5获取app配置信息
... ... @@ -33,27 +45,25 @@ export function performJSCallNative(data: Message, call: Callback) {
case H5CallNativeType.jsCall_appInnerLinkMethod:
handleJsCallAppInnerLinkMethod(data)
break;
case 'changeNativeMessage':
call("this is change Web Message")
break;
default:
call("this is def value")
break;
}
}
class AppInfo {
plat: string = ''
system: string = ''
networkStatus: number = 1
// TODO 完善
function handleJsCallCurrentPageOperate(data: Message) {
switch (data?.data?.operateType) {
case H5OperateType.TYPE_ONE:
router.back()
break;
default:
break;
}
}
/**
* 获取App公共信息
*/
function getAppPublicInfo(): string {
let info = new AppInfo()
info.plat = 'Phone'
// 直接用Android,后续适配再新增鸿蒙
... ... @@ -73,7 +83,6 @@ function handleJsCallReceiveH5Data(data: Message) {
}
break;
default:
break;
}
}
... ... @@ -83,5 +92,61 @@ function handleJsCallCallAppService(data: Message) {
}
function handleJsCallAppInnerLinkMethod(data: Message) {
}
let urlObject = Url.URL.parseURL(data?.data?.appInnerLink);
let urlParams = new Url.URLParams(urlObject.search);
console.log('urlObject:', `${JSON.stringify(urlParams)}`)
let content: ContentDTO = {
objectId: urlParams.get('contentId') || '',
relId: urlParams.get('relId') || '',
relType: urlParams.get('relType') || '',
pageId:urlParams.get('pageId') || '',
objectType: ''
} as ContentDTO
if (urlParams.get('skipType') === '1') {
switch (urlParams.get('type')) {
case 'video':
content.objectType = ContentConstants.TYPE_VOD
ProcessUtils.processPage(content)
break;
case 'live':
content.objectType = ContentConstants.TYPE_LIVE
ProcessUtils.processPage(content)
break;
case 'article':
content.objectType = ContentConstants.TYPE_TELETEXT
ProcessUtils.processPage(content)
break;
case 'picture':
content.objectType = ContentConstants.TYPE_NINE
ProcessUtils.processPage(content)
break;
case 'audio':
content.objectType = ContentConstants.TYPE_AUDIO
ProcessUtils.processPage(content)
break;
case 'h5':
content.objectType = ContentConstants.TYPE_LINK
ProcessUtils.processPage(content)
break;
case 'topic':
if(urlParams.get('subType') === 'h5'){
content.objectType = ContentConstants.TYPE_SPECIAL_TOPIC
ProcessUtils.processPage(content)
}
if(urlParams.get('subType') === 'moring_evening_news'){
ProcessUtils.gotoMorningEveningPaper()
}
if(urlParams.get('subType') === 'electronic_newspapers'){
ProcessUtils.gotoENewsPaper()
}
break;
case 'dynamic':
content.objectType = ContentConstants.TYPE_FOURTEEN
ProcessUtils.processPage(content)
break;
default:
break;
}
}
}
... ...
... ... @@ -4,6 +4,8 @@ export { CompUtils } from "./src/main/ets/utils/CompUtils"
export { EmptyComponent } from "./src/main/ets/components/view/EmptyComponent"
export { LiveEmptyComponent } from './src/main/ets/components/view/LiveEmptyComponent'
export { ErrorComponent } from "./src/main/ets/components/view/ErrorComponent"
export { LoadingComponent } from "./src/main/ets/components/view/LoadingComponent"
... ... @@ -75,3 +77,5 @@ export { LiveCommentComponent } from "./src/main/ets/components/comment/view/Liv
export { WDViewDefaultType } from "./src/main/ets/components/view/EmptyComponent"
export { WDLiveViewDefaultType } from "./src/main/ets/components/view/LiveEmptyComponent"
... ...
... ... @@ -20,9 +20,11 @@ import { WDRouterPage, WDRouterRule } from 'wdRouter/Index';
import { MultiPictureDetailViewModel } from '../viewmodel/MultiPictureDetailViewModel';
import { PageRepository } from '../repository/PageRepository';
import { detailedSkeleton } from './skeleton/detailSkeleton';
const PATTERN_DATE_CN_RN: string = 'yyyy年MM月dd日 HH:mm';
const TAG = 'ImageAndTextPageComponent'
@Component
export struct ImageAndTextPageComponent {
scroller: Scroller = new Scroller();
... ... @@ -33,11 +35,9 @@ export struct ImageAndTextPageComponent {
@State interactData: InteractDataDTO = {} as InteractDataDTO
@State isPageEnd: boolean = false
@State publishTime: string = ''
build() {
Column() {
if (!this.isPageEnd) {
detailedSkeleton()
} else {
// 发布时间
Row() {
Image(this.contentDetailData[0]?.rmhInfo ? $r('app.media.logo_rmh') : $r('app.media.logo_rmrb'))
... ... @@ -64,8 +64,6 @@ export struct ImageAndTextPageComponent {
}
.padding({ left: 15, right: 15 })
.backgroundColor(Color.White)
}
Stack({ alignContent: Alignment.Bottom }) {
Scroll(this.scroller) {
... ... @@ -88,6 +86,10 @@ export struct ImageAndTextPageComponent {
.padding({ bottom: 76 })
.scrollBar(BarState.Off)
if (!this.isPageEnd) {
detailedSkeleton()
}
//底部交互区
Row() {
Image($r('app.media.icon_arrow_left'))
... ... @@ -126,6 +128,7 @@ export struct ImageAndTextPageComponent {
.justifyContent(FlexAlign.SpaceBetween)
.backgroundColor(Color.White)
}
}
.width(CommonConstants.FULL_WIDTH)
.height(CommonConstants.FULL_HEIGHT)
... ... @@ -152,7 +155,7 @@ export struct ImageAndTextPageComponent {
if (detailBeans && detailBeans.length > 0) {
this.contentDetailData = detailBeans;
let dateTime = DateTimeUtils.parseDate(this.contentDetailData[0]?.publishTime, DateTimeUtils.PATTERN_DATE_TIME_HYPHEN);
this.publishTime = DateTimeUtils.formatDate(dateTime,PATTERN_DATE_CN_RN)
this.publishTime = DateTimeUtils.formatDate(dateTime, PATTERN_DATE_CN_RN)
if (this.contentDetailData[0]?.recommendShow === 1) {
this.getRecommend()
}
... ...
import { LazyDataSource } from 'wdKit/Index'
import PageModel from '../../../viewmodel/PageModel'
... ... @@ -27,16 +28,23 @@ export enum WDPublicUserType {
}
@Observed
export class commentListModel extends PageModel{
pageNum: number = 0
pageSize: number = 0
export class commentListModel extends PageModel {
pageNum: number = 1
pageSize: number = 10
totalCount: number = 0
hasNext: number = 0
list: commentItemModel[] = []
// constructor(pageNum:number, pageSize:number, totalCount: number, hasNext: number, list: commentItemModel[]) {
// super()
// this.pageNum = pageNum
// this.pageSize = pageSize
// this.totalCount = totalCount
// this.hasNext = hasNext
// this.list = list
// }
}
@Observed
export class commentItemModel {
authorLike: string = ''
... ... @@ -44,6 +52,7 @@ export class commentItemModel {
checkStatus: string = ''
childCommentNum: string = ''
childComments: commentItemModel[] = []
childCommentsLazyDataSource: LazyDataSource<commentItemModel> = new LazyDataSource()
commentContent: string = ''
commentContentSensitive: string = ''
commentLevel: number = 0
... ... @@ -60,8 +69,7 @@ export class commentItemModel {
fromUserName: string = ''
fromUserType: WDPublicUserType = 0
id: string = ''
likeNum: string = ''
likeNum: string = '0'
mySelf: string = ''
parentId: string = ''
region: string = ''
... ... @@ -77,36 +85,32 @@ export class commentItemModel {
uuid: string = ''
/*本地使用,收起时默认3行 -1为不限制行数*/
maxLine: number = 3
/*是否有展示更多*/
hasMore:boolean = false
hasMore: boolean = false
/*当有展示更多的时候,当前的状态是展开还是收起*/
expanded:boolean = false
highQualityExpireTime:string = '';
highQualityTime:string = '';
targetTitle:string = '';
targetStatus:string = '';
targetId:string = '';
targetRelId:string = '';
targetRelObjectId:string = '';
targetRelType:string = '';
targetType:string = '';
visitorComment:string = '';
shareInfo:commentItemShareInfoModel = new commentItemShareInfoModel;
api_commentId:string = '';
expanded: boolean = false
/*是否正在加载子评论*/
isLoading: boolean = false
highQualityExpireTime: string = '';
highQualityTime: string = '';
targetTitle: string = '';
targetStatus: string = '';
targetId: string = '';
targetRelId: string = '';
targetRelObjectId: string = '';
targetRelType: string = '';
targetType: string = '';
visitorComment: string = '';
shareInfo: commentItemShareInfoModel = new commentItemShareInfoModel;
api_commentId: string = '';
/*评论点赞状态 0-未点赞 1-已点赞*/
api_status:boolean = false;
api_level:string = '';
api_levelHead:string = 'http';
api_userId:string = '';
api_creatorId:string = '';
api_userType:string = '';
api_authIcon:string = '';
api_status: boolean = false;
api_level: string = '';
api_levelHead: string = 'http';
api_userId: string = '';
api_creatorId: string = '';
api_userType: string = '';
api_authIcon: string = '';
}
@Observed
... ... @@ -118,7 +122,7 @@ export class commentItemShareInfoModel {
}
@Observed
export class commentStatusListModel extends PageModel{
export class commentStatusListModel extends PageModel {
pageNum: number = 0
pageSize: number = 0
totalCount: number = 0
... ... @@ -129,18 +133,17 @@ export class commentStatusListModel extends PageModel{
@Observed
export class commentStatusModel {
commentId:string = '';
status:boolean = false;
level:string = '';
levelHead:string = '';
userId:string = '';
commentId: string = '';
status: boolean = false;
level: string = '';
levelHead: string = '';
userId: string = '';
creatorId: string = '';
userType: string = '';
authIcon: string = '';
}
creatorId:string = '';
userType:string = '';
authIcon:string = '';
}
... ...
import { commentItemModel } from './CommentModel';
class BasicDataSource implements IDataSource {
private listeners: DataChangeListener[] = [];
private originDataArray: commentItemModel[] = [];
public totalCount(): number {
return 0;
}
public getData(index: number): commentItemModel {
return this.originDataArray[index];
}
registerDataChangeListener(listener: DataChangeListener): void {
if (this.listeners.indexOf(listener) < 0) {
console.info('add listener');
this.listeners.push(listener);
}
}
unregisterDataChangeListener(listener: DataChangeListener): void {
const pos = this.listeners.indexOf(listener);
if (pos >= 0) {
console.info('remove listener');
this.listeners.splice(pos, 1);
}
}
notifyDataReload(): void {
this.listeners.forEach(listener => {
listener.onDataReloaded();
})
}
notifyDataAdd(index: number): void {
this.listeners.forEach(listener => {
listener.onDataAdd(index);
})
}
notifyDataChange(index: number): void {
this.listeners.forEach(listener => {
listener.onDataChange(index);
})
}
notifyDataDelete(index: number): void {
this.listeners.forEach(listener => {
listener.onDataDelete(index);
})
}
notifyDataMove(from: number, to: number): void {
this.listeners.forEach(listener => {
listener.onDataMove(from, to);
})
}
}
export class MyCommentDataSource extends BasicDataSource {
private dataArray: commentItemModel[] = [];
public totalCount(): number {
return this.dataArray.length;
}
public getData(index: number): commentItemModel {
return this.dataArray[index];
}
public addData(index: number, data: commentItemModel): void {
this.dataArray.splice(index, 0, data);
this.notifyDataAdd(index);
}
public pushData(data: commentItemModel): void {
this.dataArray.push(data);
this.notifyDataAdd(this.dataArray.length - 1);
}
}
\ No newline at end of file
... ...
@Observed
export class publishCommentModel {
/*被评论的内容id*/
targetId: string = ""
/*被评论的内容关系id*/
targetRelId: string = ""
/*1.文字 2.文字+表情 3.定制表情(客户端写死) 4.图片*/
commentType: string = '1'
/*根评论id,如果是一级评论,传-1;否则,传当前评论所属的根评论id*/
rootCommentId: string = "-1"
/*【迭代二新增】内容的标题,取bff内容详情接口中newsTitle字段*/
targetTitle: string = ""
/*被评论的内容关系类型,1.频道关系;2.专题关系;【人民号内容为空】默认0*/
targetRelType: string = ''
/*【迭代二新增】关联的频道id/专题id;*/
targetRelObjectId: string = ""
/*评论图片url,多个逗号隔开*/
commentPics: string = ""
/*评论内容*/
commentContent: string = ""
/*【迭代二新增】是否是重点稿件 1是 0否*/
keyArticle: string = ''
/*内容类别, 1:点播,2:直播,3:活动,4:广告,5:专题,6:链接,7:榜单,8:图文,9:组图,10:H5新闻,11:频道,12:组件,13:音频,14:动态(13和14为中文版新增)*/
targetType: string = ''
/*父评论id,如果是其它评论的回复,该字段必填*/
parentId: string = "-1"
placeHolderText: string = "优质评论会获得最佳评论人的称号"
}
... ...
... ... @@ -6,38 +6,68 @@ import { commentItemModel, commentListModel, WDPublicUserType } from '../model/C
import commentViewModel from '../viewmodel/CommentViewModel'
import { CommentText } from './CommentText';
import measure from '@ohos.measure'
import {CommentCustomDialog} from './CommentCustomDialog'
import { CommentCustomDialog } from './CommentCustomDialog'
import { publishCommentModel } from '../model/PublishCommentModel';
import { ifaa } from '@kit.OnlineAuthenticationKit';
const TAG = 'CommentComponent';
@Entry
// @Entry
@Preview
@Component
export struct CommentComponent {
@State private browSingModel: commentListModel = new commentListModel()
@State contentId: string = '30004266013'
/*内容类别, 1:点播,2:直播,3:活动,4:广告,5:专题,6:链接,7:榜单,8:图文,9:组图,10:H5新闻,11:频道,12:组件,13:音频,14:动态(13和14为中文版新增)*/
@State contentType: string = '8'
/*内容的标题,取bff内容详情接口中newsTitle字段*/
@State targetTitle: string = '北约同意向乌克兰提供防空系统在内的更多军事支持'
/*被评论的内容关系id*/
@State targetRelId: string = "500002849023"
/*关联的频道id/专题id*/
@State targetRelObjectId: string = "2002"
/*是否是重点稿件 1是 0否*/
@State keyArticle: string = "0"
/*被评论的内容关系类型,1.频道关系;2.专题关系;【人民号内容为空】默认0*/
@State targetRelType: string = "1"
// @State private browSingModel: commentListModel = new commentListModel()
isloading: boolean = false
@State allDatas: LazyDataSource<commentItemModel> = new LazyDataSource();
dialogController: CustomDialogController = new CustomDialogController({
builder: CommentCustomDialog(),
@State publishCommentModel: publishCommentModel = new publishCommentModel()
@State dialogController: CustomDialogController | null = new CustomDialogController({
builder: CommentCustomDialog({
confirm: (value: Record<string, string>) => {
this.publishComment(value)
},
commentText: this.publishCommentModel.commentContent,
placeHolderText: this.publishCommentModel.placeHolderText,
}),
autoCancel: true,
alignment: DialogAlignment.Bottom,
customStyle: true,
offset: {
dx: 0,
dy: -20
}
},
})
// 在自定义组件即将析构销毁时将dialogControlle置空
aboutToDisappear() {
this.dialogController = null // 将dialogController置空
}
aboutToAppear() {
this.publishCommentModel.targetTitle = this.targetTitle
this.publishCommentModel.targetId = this.contentId
this.publishCommentModel.targetType = this.contentType
this.publishCommentModel.targetRelId = this.targetRelId
this.publishCommentModel.targetRelType = this.targetRelType
this.publishCommentModel.targetRelObjectId = this.targetRelObjectId
this.publishCommentModel.keyArticle = this.keyArticle
this.getData();
this.getData();
this.getData();
this.getData();
}
/*标题:全部评论*/
... ... @@ -64,52 +94,158 @@ export struct CommentComponent {
/*1级评论作为titleHeader*/
@Builder
CommentHeaderItem(item: commentItemModel) {
CommentHeaderItem(item: commentItemModel, index: number) {
commentHeaderView({
item: item,
dialogController: this.dialogController,
publishCommentModel: this.publishCommentModel
})
}
/*查看更多和收起*/
@Builder
GroupFooterView(item: commentItemModel, index: number) {
footerExpandedView({ item: item, contentId: this.contentId, contentType: this.contentType })
}
build() {
Column() {
List() {
ListItemGroup({ header: this.titleHeader() })
LazyForEach(this.allDatas, (item: commentItemModel, index: number) => {
if (item.hasMore) {
ListItemGroup({ header: this.CommentHeaderItem(item, index), footer: this.GroupFooterView(item, index) }) {
LazyForEach(item.childCommentsLazyDataSource, (childItem: commentItemModel, subIndex: number) => {
ListItem() {
ChildCommentItem({
item: childItem,
dialogController: this.dialogController,
publishCommentModel: this.publishCommentModel
});
}
.onClick(() => {
console.log(TAG)
})
})
}
} else {
ListItemGroup({ header: this.CommentHeaderItem(item, index) }) {
LazyForEach(item.childCommentsLazyDataSource, (childItem: commentItemModel, subIndex: number) => {
ListItem() {
ChildCommentItem({
item: childItem,
dialogController: this.dialogController,
publishCommentModel: this.publishCommentModel
});
}
.onClick(() => {
console.log(TAG)
})
})
}
}
})
}.layoutWeight(1)
}
}
//获取数据
async getData() {
commentViewModel.fetchContentCommentList('1', this.contentId, this.contentType).then(commentListModel => {
if (commentListModel && commentListModel.list && commentListModel.list.length > 0) {
commentListModel.list.forEach(element => {
element.hasMore = Number.parseInt(element.childCommentNum) ? true : false
let newModel = commentViewModel.deepCopyCommentItemModel(element)
newModel.targetId = this.contentId
newModel.targetType = this.contentType
this.allDatas.push(newModel)
});
}
})
}
/*回复评论*/
publishComment(value: Record<string, string>) {
this.publishCommentModel.commentContent = value['commentContent']
this.publishCommentModel.commentType = value['commentType']
commentViewModel.publishComment(this.publishCommentModel).then(() => {
this.publishCommentModel.commentContent = ''
}).catch(() => {
})
}
}
@Component
struct ChildCommentItem {
@Link publishCommentModel: publishCommentModel
@Link dialogController: CustomDialogController | null
@ObjectLink item: commentItemModel
build() {
Column() {
Row() {
//头像
Stack() {
Image(item.fromUserHeader)
Image(this.item.fromUserHeader)
.alt($r('app.media.default_head'))
.width('32')
.height('32')
.width('24')
.height('24')
.objectFit(ImageFit.Cover)
.borderRadius(16)
Image(item.api_levelHead)
.width('48')
.height('48')
Image(this.item.api_levelHead)
.width('36')
.height('36')
.objectFit(ImageFit.Cover)
.borderRadius(24)
}
.width(48)
.height(48)
.margin({ left: 8 })
.margin({ left: 47 })
.alignContent(Alignment.Center)
.onClick(() => {
// TODO 跳转个人详情
})
//昵称
Text(item.fromUserName)
Text() {
Span(this.item.fromUserName)
if (this.item.toUserName) {
Span(' ')
ImageSpan($r('app.media.comment_reply')).size({ width: 6, height: 9 }).offset({ y: -2.5 })
Span(' ')
Span(this.item.toUserName)
}
}
.maxLines(1)
.layoutWeight(1)
.fontSize(14)
.fontColor($r('app.color.color_222222'))
.fontWeight(FontWeight.Medium)
.margin({ left: 5 })
.margin({ left: 0 , right:0})
/// 暂时不显示 “我” 的标签了
/// 人民号>置顶>作者
//人民号
// if (item.fromUserType === WDPublicUserType.WDPublicUserType_Matrix) {
if (this.item.fromUserType === WDPublicUserType.WDPublicUserType_Matrix) {
Image($r('app.media.comment_rmh_tag')).width(20).height(20).margin({ left: 5 });
// }
}
//置顶
// if (item.topFlag) {
if (this.item.topFlag) {
Image($r('app.media.comment_icon_zhiding')).width(30).height(18).margin({ left: 5 });
// }
}
//作者
// if (item.contentAuthor === 1) {
if (this.item.contentAuthor === 1) {
Text('作者')
.fontSize(11)
.fontColor('#968562')
... ... @@ -119,54 +255,185 @@ export struct CommentComponent {
.width(30)
.height(18)
.margin({ left: 5 });
// }
}
}.margin({ left: 0, right: 16 })
// .backgroundColor(Color.Red)
CommentText({
longMessage: item.commentContent,
longMessage: this.item.commentContent,
maxline: 3,
fontSize: 16,
fontSize: 14,
fontWeight: FontWeight.Regular,
marginWidth: (59 + 16)
marginWidth: (95 + 16)
})
.margin({ left: 95, right: 16, top: -5 })
.onClick(() => {
this.publishCommentModel.rootCommentId = this.item.rootCommentId
this.publishCommentModel.parentId = this.item.id
this.publishCommentModel.placeHolderText = '回复' + this.item.fromUserName + ':'
if (this.dialogController != null) {
this.dialogController.open()
}
})
.margin({ left: 59, right: 16 })
this.CommentFooterView(item);
commentFooterView({
item: this.item,
dialogController: this.dialogController,
publishCommentModel: this.publishCommentModel
}).margin({ left: 95, right: 16 })
}.alignItems(HorizontalAlign.Start)
.width('100%')
}
}
/*查看更多和收起*/
@Builder
GroupFooterView(item: commentItemModel) {
@Component
struct footerExpandedView {
@ObjectLink item: commentItemModel
contentId: string = ''
contentType: string = ''
build() {
Row() {
if (item.expanded){
if (this.item.expanded) {
Row() {
Text('收起').fontColor($r('app.color.color_222222')).fontSize(14)
Image($r('app.media.comment_pickUp')).width(12).height(12)
}.margin({ left: 213 })
}else {
.onClick(() => {
this.item.expanded = !this.item.expanded
this.item.childComments = []
this.item.childCommentsLazyDataSource.clear()
})
} else {
Row() {
Text().backgroundColor($r('app.color.color_EDEDED')).width(24).height(1)
Text('查看更多回复').fontColor($r('app.color.color_222222')).fontSize(14).margin({ left: 6 })
Image($r('app.media.comment_unfold')).width(12).height(12)
}.margin({ left: 53 })
.onClick(() => {
if (this.item.isLoading) {
return
}
this.item.isLoading = true
//load child
commentViewModel.fetchChildContentCommentList('1', this.contentId, this.contentType, this.item.id)
.then((commentListModel) => {
this.item.isLoading = false
this.item.expanded = !this.item.expanded
commentListModel.list.forEach(element => {
this.item.childComments.push(element)
let newModel = commentViewModel.deepCopyCommentItemModel(element)
newModel.targetId = this.contentId
newModel.targetType = this.contentType
this.item.childCommentsLazyDataSource.push(newModel)
})
}).catch(() => {
this.item.isLoading = false
})
})
}
}.height(30)
}
}
@Component
struct commentHeaderView {
@Link publishCommentModel: publishCommentModel
@Link dialogController: CustomDialogController | null
@ObjectLink item: commentItemModel
build() {
Column() {
Row() {
//头像
Stack() {
Image(this.item.fromUserHeader)
.alt($r('app.media.default_head'))
.width('32')
.height('32')
.objectFit(ImageFit.Cover)
.borderRadius(16)
Image(this.item.api_levelHead)
.width('48')
.height('48')
.objectFit(ImageFit.Cover)
.borderRadius(24)
}
.width(48)
.height(48)
.margin({ left: 8 })
.alignContent(Alignment.Center)
.onClick(() => {
// TODO 跳转个人详情
})
//昵称
Text(this.item.fromUserName)
.fontSize(14)
.fontColor($r('app.color.color_222222'))
.fontWeight(FontWeight.Medium)
.margin({ left: 5 })
}.height(30)
/// 暂时不显示 “我” 的标签了
/// 人民号>置顶>作者
//人民号
if (this.item.fromUserType === WDPublicUserType.WDPublicUserType_Matrix) {
Image($r('app.media.comment_rmh_tag')).width(20).height(20).margin({ left: 5 });
}
//置顶
if (this.item.topFlag) {
Image($r('app.media.comment_icon_zhiding')).width(30).height(18).margin({ left: 5 });
}
//作者
if (this.item.contentAuthor === 1) {
Text('作者')
.fontSize(11)
.fontColor('#968562')
.backgroundColor('#F1EFEB')
.textAlign(TextAlign.Center)
.borderRadius(2)
.width(30)
.height(18)
.margin({ left: 5 });
}
}
/*评论内容下面的IP地址时间点赞*/
@Builder
CommentFooterView(item: commentItemModel) {
CommentText({
longMessage: this.item.commentContent,
maxline: 3,
fontSize: 16,
fontWeight: FontWeight.Regular,
marginWidth: (59 + 16)
})
.margin({ left: 59, right: 16, top: -5 })
commentFooterView({
item: this.item,
dialogController: this.dialogController,
publishCommentModel: this.publishCommentModel
}).margin({ left: 59, right: 16 })
}.alignItems(HorizontalAlign.Start)
}
}
/*评论内容下面的IP地址时间点赞*/
@Component
struct commentFooterView {
@Link publishCommentModel: publishCommentModel
@Link dialogController: CustomDialogController | null
@ObjectLink item: commentItemModel
build() {
Row() {
Row({ space: 6 }) {
Text(item.region ? (item.region + '网友') : '人民日报客户端网友')
Text(this.item.region ? (this.item.region + '网友') : '人民日报客户端网友')
.fontColor($r('app.color.color_B0B0B0'))
.fontSize(12);
Image($r('app.media.comment_hyphen'))
... ... @@ -175,15 +442,7 @@ export struct CommentComponent {
height: 4
})
//TODO: 时间格式需要本地调整
// / 展现专用,用于获取多久之前
// ///小于1分钟:刚刚
// ///1~60分钟:x分钟前
// ///1小时~1天:x小时前
// ///1天~2天:1天前
// ///2天~:日期隐藏
Text(DateTimeUtils.getCommentTime(Number.parseFloat(item.createTime)))
Text(DateTimeUtils.getCommentTime(DateTimeUtils.getDateTimestamp(this.item.createTime)))
.fontColor($r('app.color.color_B0B0B0'))
.fontSize(12)
... ... @@ -202,98 +461,51 @@ export struct CommentComponent {
}
Row({ space: 6 }) {
Text(item.likeNum)
Text(this.item.likeNum)
.fontColor($r('app.color.color_666666'))
.fontSize(14)
Image($r('app.media.comment_like_normal'))
Image($r(this.item.api_status ? 'app.media.comment_like_select' : 'app.media.comment_like_normal'))
.size({
width: 16,
height: 16
})
}
.onClick(() => {
//TODO: 点赞
commentLikeChange(this.item)
commentViewModel.commentLike(this.item).then(() => {
}).catch(() => {
commentLikeChange(this.item)
})
})
}
}
.justifyContent(FlexAlign.SpaceBetween)
.width('100%')
.height(30)
.margin({ left: 59, right: 16 })
}
build() {
Column() {
List() {
ListItemGroup({ header: this.titleHeader() })
.onClick(()=>{
console.log(TAG)
this.dialogController.open()
})
LazyForEach(this.allDatas, (item: commentItemModel, index: number) => {
if (item.hasMore) {
ListItemGroup({ header: this.CommentHeaderItem(item), footer: this.GroupFooterView(item) }) {
ForEach(item.childComments, (childItem: commentItemModel, subIndex: number) => {
ListItem() {
ChildCommentItem();
}
.onClick(()=>{
console.log(TAG)
})
})
}
}else {
ListItemGroup({ header: this.CommentHeaderItem(item)}) {
ForEach(item.childComments, (childItem: commentItemModel, subIndex: number) => {
ListItem() {
ChildCommentItem();
}
.onClick(()=>{
console.log(TAG)
})
})
}
}
})
}.layoutWeight(1)
}
}
}
//获取数据
async getData() {
this.browSingModel.currentPage = 1
commentViewModel.getCommentLocal(getContext()).then(commentListModel => {
if (commentListModel && commentListModel.list && commentListModel.list.length > 0) {
commentListModel.hasMore = true;
this.browSingModel.viewType = ViewType.LOADED;
this.allDatas.push(...commentListModel.list)
if (commentListModel.list.length === this.browSingModel.pageSize) {
this.browSingModel.currentPage++;
this.browSingModel.hasMore = true;
function commentLikeChange(item: commentItemModel) {
item.api_status = !item.api_status
//点赞
if (item.api_status) {
if (item.likeNum.length > 0) {
item.likeNum = (Number.parseInt(item.likeNum) + 1) + ''
} else {
this.browSingModel.hasMore = false;
item.likeNum = '1'
}
} else {
this.browSingModel.viewType = ViewType.EMPTY;
}
})
//取消点赞
if (!item.api_status) {
item.likeNum = (Number.parseInt(item.likeNum) - 1) + ''
if (Number.parseInt(item.likeNum) <= 0) {
item.likeNum = ''
}
/*回复评论*/
ReplyComment() {
}
}
@Component
struct ChildCommentItem {
build() {
Text('child')
}
}
... ...
import { inputMethodEngine } from '@kit.IMEKit'
import { publishCommentModel } from '../model/PublishCommentModel'
import commentViewModel from '../viewmodel/CommentViewModel'
@Preview
@CustomDialog
export struct CommentCustomDialog {
controller: CustomDialogController = new CustomDialogController({
builder: CommentCustomDialog(),
autoCancel: true,
alignment: DialogAlignment.Bottom,
customStyle: true,
})
commentText: string = ''
placeHolderText: string = '优质评论会获得最佳评论人的称号'
controller?: CustomDialogController
confirm: (value: Record<string, string>) => void = () => {
}
@State private emojiSwitch: boolean = false
textInputController: TextAreaController = new TextAreaController()
build() {
Column() {
Row() {
TextArea({ placeholder: '优质评论会获得最佳评论人的称号' })
TextArea({
placeholder: this.placeHolderText,
controller: this.textInputController,
text: this.commentText
})
.height('100%')
.width('100%')
.backgroundColor($r('app.color.color_transparent'))
.onChange(value => {
this.commentText = value;
})
}
.backgroundColor('#F9F9F9')
// .width('100%')
.margin({ top: 12,right: 12, left: 12, bottom: 10 })
.margin({ top: 12, right: 12, left: 12, bottom: 10 })
.height(80)
.borderRadius(4)
Row(){
Row() {
Row() {
Row({ space: 12 }) {
//语音暂时不做,隐藏
// Image($r('app.media.WDInput_voice')).width(30).height(30)
Image($r('app.media.WDInput_keyboardImage')).width(30).height(30)
Image($r(this.emojiSwitch ? 'app.media.WDInput_keyboardImage' : 'app.media.WDInput_emojiImage'))
.width(30)
.height(30)
.onClick(() => {
// this.commentText = this.commentText + '神鼎'
this.emojiSwitch = !this.emojiSwitch
if (this.emojiSwitch) {
this.textInputController.stopEditing()
} else {
this.textInputController.caretPosition(this.textInputController.getTextContentRect().x)
}
})
}
// Blank()
Row() {
... ... @@ -41,13 +67,36 @@ export struct CommentCustomDialog {
.fontColor(Color.White)
.textAlign(TextAlign.Center)
.borderRadius(4)
.onClick(() => {
if (this.commentText.length > 0) {
//请求评论接口
//commentType
//commentContent
let bean: Record<string, string> = {};
bean['commentContent'] = this.commentText
//TODO 判断类型
bean['commentType'] = '1'
this.confirm(bean)
if (this.controller != null) {
this.controller.close()
}
}
})
}
}.justifyContent(FlexAlign.SpaceBetween)
.width('100%')
.height(60)
// .margin({ right: 12, left: 12 })
// .backgroundColor(Color.Red)
}.padding({left:12, right:12})
}.padding({ left: 12, right: 12 })
//表情view
if (this.emojiSwitch) {
emojiView()
}
}.backgroundColor(Color.White)
.width('100%')
.offset({
... ... @@ -56,6 +105,12 @@ export struct CommentCustomDialog {
}
}
@Component
struct emojiView {
build() {
}
}
... ...
... ... @@ -13,10 +13,9 @@ export struct CommentText {
@State longMessage: string = ''
// 最大显示行数
@State maxLineMesssage: string = '';
@State lines: number = 3;
@State maxline: number = 3;
@State marginWidth:number = 0;
@State marginWidth: number = 0;
// 长文本状态(展开 or 收起)
@State collapseText: string = collapseString
// 屏幕宽度(单位px)
... ... @@ -30,7 +29,6 @@ export struct CommentText {
fontColor: ResourceColor = $r('app.color.color_222222')
// 测量文本宽度(单位px)
@State textWidth: number = 0;
// constructor(longMessage?:string,) {
// super();
// this.longMessage = longMessage;
... ... @@ -38,8 +36,6 @@ export struct CommentText {
// 获取当前所有的display对象
promise: Promise<Array<display.Display>> = display.getAllDisplays()
aboutToAppear() {
console.log(`文本宽度为:${this.textWidth}`)
let padding = vp2px(5 + this.marginWidth)
... ... @@ -48,7 +44,7 @@ export struct CommentText {
textContent: this.longMessage,
fontSize: this.fontSize,
fontWeight: this.fontWeight,
constraintWidth:(this.screenWidth - padding)
constraintWidth: (this.screenWidth - padding)
})
console.log(`文本宽度为:${this.textWidth}`)
... ... @@ -75,7 +71,7 @@ export struct CommentText {
textContent: string,
fontSize: this.fontSize,
fontWeight: this.fontWeight,
constraintWidth:(this.screenWidth - padding)
constraintWidth: (this.screenWidth - padding)
})
//计算有误差20
... ... @@ -134,12 +130,13 @@ export struct CommentText {
.fontWeight(this.fontWeight)
.fontColor(this.fontColor)
.maxLines(this.lines)
// .backgroundColor(Color.Red)
// }
}
else {
Text('我没有展开收起')
Text(this.longMessage)
.width('100%')
.fontSize(this.fontSize)
.fontWeight(this.fontWeight)
... ...
... ... @@ -4,6 +4,9 @@ import { commentItemModel, commentListModel } from '../model/CommentModel'
import commentViewModel from '../viewmodel/CommentViewModel'
import { router, window } from '@kit.ArkUI'
import { CustomTitleUI } from '../../reusable/CustomTitleUI'
import { MyCommentDataSource } from '../model/MyCommentDataSource'
import { HttpUtils } from 'wdNetwork/src/main/ets/utils/HttpUtils'
import { HttpUrlUtils } from 'wdNetwork/Index'
const TAG = 'QualityCommentsComponent';
... ... @@ -15,11 +18,11 @@ export struct QualityCommentsComponent {
firstPositionY: number = 0;
bottomSafeHeight: string = AppStorage.get<number>('bottomSafeHeight') + 'px';
topSafeHeight: number = AppStorage.get<number>('topSafeHeight') as number;
@State private browSingModel: commentListModel = new commentListModel()
// @State private browSingModel: commentListModel = new commentListModel()
isloading: boolean = false
lastWindowColor: string = '#ffffff'
currentWindowColor: string = '#FF4202'
@State allDatas: LazyDataSource<commentItemModel> = new LazyDataSource();
@State allDatas: MyCommentDataSource = new MyCommentDataSource();
aboutToDisappear(): void {
... ... @@ -37,23 +40,11 @@ export struct QualityCommentsComponent {
commentViewModel.fetchQualityCommentList('1').then((commentListModel) => {
if (commentListModel && commentListModel.list && commentListModel.list.length > 0) {
// commentListModel.hasMore = true;
// this.browSingModel.viewType = ViewType.LOADED;
// commentListModel.list.forEach(element => {
// this.allDatas.push(new commentItemModel())
// });
this.allDatas.push(...commentListModel.list)
// if (commentListModel.list.length === this.browSingModel.pageSize) {
// this.browSingModel.currentPage++;
// this.browSingModel.hasMore = true;
// } else {
// this.browSingModel.hasMore = false;
// }
commentListModel.list.forEach(element => {
this.allDatas.pushData(commentViewModel.deepCopyCommentItemModel(element))
});
} else {
this.browSingModel.viewType = ViewType.EMPTY;
}
})
}
... ... @@ -61,13 +52,7 @@ export struct QualityCommentsComponent {
fullScreen() {
const windowStage = WindowModel.shared.getWindowStage() as window.WindowStage
const windowClass: window.Window = windowStage.getMainWindowSync(); // 获取应用主窗口
// windowClass.setWindowBackgroundColor(this.currentWindowColor)
windowClass.setWindowLayoutFullScreen(true)
// windowClass.setWindowSystemBarProperties({ statusBarColor: '#fff' })
// windowClass.setWindowLayoutFullScreen(true).then(() => {
// console.log(TAG + 'setWindowLayoutFullScreen');
// })
}
... ... @@ -174,7 +159,7 @@ export struct QualityCommentsComponent {
// ListItemGroup({ header: this.titleHeader() })
LazyForEach(this.allDatas, (item: commentItemModel, index: number) => {
ListItem() {
QualityCommentItem({ item: item, index:index }).margin({ left: 12, right: 12 })
QualityCommentItem({ item: item, index: index }).margin({ left: 12, right: 12 })
}
})
ListItem() {
... ... @@ -217,7 +202,7 @@ export struct QualityCommentsComponent {
@Component
struct QualityCommentItem {
@ObjectLink item: commentItemModel
index:number = 0
index: number = 0
build() {
Column() {
... ... @@ -227,6 +212,8 @@ struct QualityCommentItem {
RelativeContainer() {
Image(this.item.fromUserHeader)
.alt($r(commentViewModel.adjustUserType(this.item.fromUserType) ? 'app.media.WDAccountOwnerHedaerDefaultIcon' : 'app.media.WDAccountDefaultIcon'))
.width(50)
.height(50)
.borderRadius(25)
... ... @@ -326,13 +313,10 @@ struct QualityCommentItem {
.margin({ left: 3 })
}
}.onClick(() => {
this.item.api_status = !this.item.api_status
// commentViewModel.commnetLikeChange(this.item)
commentViewModel.commnetLikeChange(this.item)
commentViewModel.commentLike(this.item).then(() => {
}).catch(() => {
// commentViewModel.commnetLikeChange(this.item)
commentViewModel.commnetLikeChange(this.item)
})
})
}
... ...
import { Logger, ResourcesUtils, UserDataLocal } from 'wdKit/Index';
import { DateTimeUtils, Logger, ResourcesUtils, ToastUtils, UserDataLocal } from 'wdKit/Index';
import { HttpBizUtil, HttpUrlUtils, ResponseDTO } from 'wdNetwork/Index';
import { HttpRequest } from 'wdNetwork/src/main/ets/http/HttpRequest';
import { commentItemModel, commentListModel, commentStatusListModel, commentStatusModel } from '../model/CommentModel';
import {
commentItemModel,
commentListModel,
commentStatusListModel,
commentStatusModel,
WDPublicUserType
} from '../model/CommentModel';
import HashMap from '@ohos.util.HashMap';
import { ifaa } from '@kit.OnlineAuthenticationKit';
import { publishCommentModel } from '../model/PublishCommentModel';
const TAG = "CommentViewModel"
... ... @@ -21,30 +28,68 @@ class CommentViewModel {
return CommentViewModel.instance;
}
/*获取本地mock数据*/
async getCommentLocal(context: Context): Promise<commentListModel> {
Logger.info(TAG, `getBottomNavDataMock start`);
let compRes: ResponseDTO<commentListModel> | null = await ResourcesUtils.getResourcesJson<ResponseDTO<commentListModel>>(context, 'comment_local.json');
if (!compRes || !compRes.data) {
Logger.info(TAG, `getAppointmentListDataLocal compRes is empty`);
return new commentListModel()
/*获取所有评论*/
fetchContentCommentList(pageNum: string, contentId: string, contentType: string): Promise<commentListModel> {
let url = HttpUrlUtils.getContentCommentListDataUrl() + `?&pageSize=${10}&pageNum=${pageNum}&contentId=${contentId}&contentType=${contentType}&deviceId=${HttpUrlUtils.getDeviceId()}&userId=${HttpUrlUtils.getUserId()}&userType=${HttpUrlUtils.getUserType()}&time=${DateTimeUtils.getCurTime(DateTimeUtils.PATTERN_DATE_TIME_HYPHEN)}`
url = url.replace(' ', '%20')
let headers: HashMap<string, string> = HttpUrlUtils.getCommonHeaders();
return new Promise<commentListModel>((success, fail) => {
HttpRequest.get<ResponseDTO<commentListModel>>(url, headers).then((data: ResponseDTO<commentListModel>) => {
if (!data || !data.data) {
fail("数据为空")
return
}
if (data.code != 0) {
fail(data.message)
return
}
Logger.info(TAG, `getAppointmentListDataLocal getResourcesJsonSync compRes : ${JSON.stringify(compRes)}`);
return this.fetchCommentStatusAndConfigAuthIcon(compRes.data)
// this.fetchCommentStatusAndConfigAuthIcon(compRes.data)
// return compRes.data
let listData = data.data as commentListModel
this.fetchCommentStatusAndConfigAuthIcon(listData).then((commentListModel) => {
console.log(TAG, 'fetchCommentStatusAndConfigAuthIcon完成')
success(commentListModel)
})
}, (error: Error) => {
fail(error.message)
Logger.debug(TAG, error.toString())
})
})
}
/*获取热门评论本地mock数据*/
async fetchQualityCommentListLocal(context: Context): Promise<commentListModel> {
Logger.info(TAG, `getBottomNavDataMock start`);
let compRes: ResponseDTO<commentListModel> | null = await ResourcesUtils.getResourcesJson<ResponseDTO<commentListModel>>(context, 'qualityComment_local.json');
if (!compRes || !compRes.data) {
Logger.info(TAG, `getAppointmentListDataLocal compRes is empty`);
return new commentListModel()
/*获取所有子评论*/
fetchChildContentCommentList(pageNum: string, contentId: string, contentType: string, commentId: String): Promise<commentListModel> {
// https://pd-apis-uat.pdnews.cn/api/rmrb-comment/comment/zh/c/childCommentList?commentId=44846810&contentId=30004266013&contentType=8&deviceId=35C78D13-A84A-47CE-A5D0-E114E4E49939&pageNum=1&pageSize=10&time=2024-04-23%2014%3A44%3A57&userId=&userType=0
let url = HttpUrlUtils.getChildContentCommentListDataUrl() + `?&pageSize=${10}&pageNum=${pageNum}&commentId=${commentId}&contentId=${contentId}&contentType=${contentType}&deviceId=${HttpUrlUtils.getDeviceId()}&userId=${HttpUrlUtils.getUserId()}&userType=${HttpUrlUtils.getUserType()}&time=${DateTimeUtils.getCurTime(DateTimeUtils.PATTERN_DATE_TIME_HYPHEN)}`
url = url.replace(' ', '%20')
let headers: HashMap<string, string> = HttpUrlUtils.getCommonHeaders();
return new Promise<commentListModel>((success, fail) => {
HttpRequest.get<ResponseDTO<commentListModel>>(url, headers).then((data: ResponseDTO<commentListModel>) => {
if (!data || !data.data) {
fail("数据为空")
return
}
Logger.info(TAG, `getAppointmentListDataLocal getResourcesJsonSync compRes : ${JSON.stringify(compRes)}`);
return this.fetchCommentStatusAndConfigAuthIcon(compRes.data)
if (data.code != 0) {
fail(data.message)
return
}
let listData = data.data as commentListModel
// success(listData)
this.fetchCommentStatusAndConfigAuthIcon(listData).then((commentListModel) => {
console.log(TAG, 'fetchCommentStatusAndConfigAuthIcon完成')
success(commentListModel)
})
}, (error: Error) => {
fail(error.message)
Logger.debug(TAG, error.toString())
})
})
}
/*获取热门评论*/
... ... @@ -75,7 +120,7 @@ class CommentViewModel {
})
}
/*点赞*/
/*评论点赞*/
commentLike(model: commentItemModel) {
return new Promise<void>((success, fail) => {
... ... @@ -116,6 +161,43 @@ class CommentViewModel {
})
}
/*发布评论*/
publishComment(model: publishCommentModel) {
return new Promise<void>((success, fail) => {
let url = HttpUrlUtils.getPublishCommentUrl()
let headers: HashMap<string, string> = HttpUrlUtils.getCommonHeaders();
let bean: Record<string, string> = {};
bean['targetId'] = model.targetId;
bean['targetRelId'] = model.targetRelId;
bean['commentType'] = model.commentType;
bean['rootCommentId'] = model.rootCommentId
bean['targetTitle'] = model.targetTitle
bean['targetRelType'] = model.targetRelType
bean['targetRelObjectId'] = model.targetRelObjectId
bean['commentPics'] = model.commentPics
bean['commentContent'] = model.commentContent
bean['keyArticle'] = model.keyArticle
bean['targetType'] = model.targetType
bean['parentId'] = model.parentId
HttpRequest.post<ResponseDTO<commentStatusModel[]>>(url, bean, headers).then((data: ResponseDTO<commentStatusModel[]>) => {
if (data.code != 0) {
ToastUtils.showToast(data.message, 1000);
fail()
return
}
ToastUtils.showToast(data.message, 1000);
success()
}, (error: Error) => {
ToastUtils.showToast('评论失败', 1000);
fail()
Logger.debug(TAG, error.toString())
})
})
}
/*多接口批查*/
fetchCommentStatusAndConfigAuthIcon(model: commentListModel): Promise<commentListModel> {
... ... @@ -139,7 +221,7 @@ class CommentViewModel {
//子评论
if (element.childComments) {
if (element.childComments.length) {
for (const obj2 of element.childComments) {
if ((obj2.id + '').length > 0) {
commentIDs.push(obj2.id + '')
... ... @@ -179,13 +261,13 @@ class CommentViewModel {
return
}
let listData = data.data as commentStatusModel[]
//点赞
//点赞
for (const element of listData) {
for (const commentModel of model.list) {
if (element.commentId == commentModel.id) {
commentModel.api_status = element.status
}
if (commentModel.childComments) {
if (commentModel.childComments.length) {
for (const childCommentModel of commentModel.childComments) {
if (element.commentId == childCommentModel.id) {
childCommentModel.api_status = element.status
... ... @@ -228,7 +310,7 @@ class CommentViewModel {
if (element.userId == commentModel.fromUserId) {
commentModel.api_levelHead = element.levelHead
}
if (commentModel.childComments) {
if (commentModel.childComments.length) {
for (const childCommentModel of commentModel.childComments) {
if (element.userId == childCommentModel.fromUserId) {
childCommentModel.api_levelHead = element.levelHead
... ... @@ -274,7 +356,7 @@ class CommentViewModel {
if (element.creatorId == commentModel.fromCreatorId) {
commentModel.api_authIcon = element.authIcon
}
if (commentModel.childComments) {
if (commentModel.childComments.length) {
for (const childCommentModel of commentModel.childComments) {
if (element.creatorId == childCommentModel.fromCreatorId) {
childCommentModel.api_authIcon = element.authIcon
... ... @@ -303,8 +385,7 @@ class CommentViewModel {
}
commnetLikeChange(model:commentItemModel){
commnetLikeChange(model: commentItemModel) {
model.api_status = !model.api_status
//点赞
if (model.api_status) {
... ... @@ -317,6 +398,91 @@ class CommentViewModel {
model.likeNum = '0'
}
}
// return model
}
deepCopyCommentItemModel(model: commentItemModel) {
let newModel = new commentItemModel()
newModel.authorLike = model.authorLike
newModel.avatarFrame = model.avatarFrame
newModel.checkStatus = model.checkStatus
newModel.childCommentNum = model.childCommentNum
newModel.childComments = model.childComments
// newModel.childCommentsLazyDataSource = model.childCommentsLazyDataSource
newModel.commentContent = model.commentContent
newModel.commentContentSensitive = model.commentContentSensitive
newModel.commentLevel = model.commentLevel
newModel.commentPics = model.commentPics
newModel.commentSensitive = model.commentSensitive
newModel.commentType = model.commentType
newModel.contentAuthor = model.contentAuthor
newModel.createTime = model.createTime
newModel.creatorFlag = model.creatorFlag
newModel.fromCreatorId = model.fromCreatorId
newModel.fromDeviceId = model.fromDeviceId
newModel.fromUserHeader = model.fromUserHeader
newModel.fromUserId = model.fromUserId
newModel.fromUserName = model.fromUserName
newModel.fromUserType = model.fromUserType
newModel.id = model.id
newModel.likeNum = model.likeNum.toString()
if (Number.parseInt(newModel.likeNum) <= 0) {
newModel.likeNum = ''
}
newModel.mySelf = model.mySelf
newModel.parentId = model.parentId
newModel.region = model.region
newModel.replyNum = model.replyNum
newModel.rootCommentId = model.rootCommentId
newModel.sensitiveExist = model.sensitiveExist
newModel.sensitiveShow = model.sensitiveShow
newModel.toUserContentAuthor = model.toUserContentAuthor
newModel.toUserId = model.toUserId
newModel.toUserName = model.toUserName
// newModel.isLoading = model.isLoading
if (model.toUserType != null) {
newModel.toUserType = model.toUserType.toString()
}
newModel.topFlag = model.topFlag
newModel.uuid = model.uuid
newModel.maxLine = model.maxLine
newModel.hasMore = model.hasMore
newModel.expanded = model.expanded
newModel.highQualityExpireTime = model.highQualityExpireTime
newModel.highQualityTime = model.highQualityTime
newModel.targetTitle = model.targetTitle
newModel.targetStatus = model.targetStatus
newModel.targetId = model.targetId
newModel.targetRelId = model.targetRelId
newModel.targetRelObjectId = model.targetRelObjectId
newModel.targetRelType = model.targetRelType
newModel.targetType = model.targetType
newModel.visitorComment = model.visitorComment
newModel.shareInfo = model.shareInfo
newModel.api_commentId = model.api_commentId
newModel.api_status = model.api_status
newModel.api_level = model.api_level
newModel.api_levelHead = model.api_levelHead
newModel.api_userId = model.api_userId
newModel.api_creatorId = model.api_creatorId
newModel.api_authIcon = model.api_authIcon
newModel.api_userType = model.api_userType
return newModel
}
//判断用户类型显示头像
adjustUserType(userType: WDPublicUserType) {
if (userType != 1 && userType > 0) {
return true
}
return false
}
}
... ... @@ -324,3 +490,5 @@ class CommentViewModel {
const commentViewModel = CommentViewModel.getInstance();
export default commentViewModel as CommentViewModel
... ...
import { ContentDTO } from 'wdBean/Index'
import { StringUtils, UserDataLocal } from 'wdKit/Index'
import { ProcessUtils } from 'wdRouter/Index'
import MinePageDatasModel from '../../../model/MinePageDatasModel'
import { CommentLikeOperationRequestItem } from '../../../viewmodel/CommentLikeOperationRequestItem'
import { CommentListItem } from '../../../viewmodel/CommentListItem'
import measure from '@ohos.measure'
@Component
export struct ChildCommentComponent {
@ObjectLink data: CommentListItem
@State levelHead: string = ""
isLastItem: boolean = false
@State isExpand: boolean = false;
@State isExpandParent: boolean = false;
@State isOverLines: boolean = false
@State isOverLinesParent: boolean = false
build() {
Column() {
Row() {
Stack({ alignContent: Alignment.Center }) {
Image(this.data.fromUserHeader)
.alt($r('app.media.default_head'))
.objectFit(ImageFit.Auto)
.width('69lpx')
.height('69lpx')
.borderRadius(50)
Image(this.levelHead)
.width('89lpx')
.height('89lpx')
.objectFit(ImageFit.Cover)
.borderRadius(50)
}.width('89lpx')
.height('89lpx')
.margin({ right: '15lpx' })
Column() {
Text(this.data.fromUserName)
.fontSize('25lpx')
.lineHeight('35lpx')
.fontWeight('600lpx')
.fontColor($r('app.color.color_222222'))
.margin({ bottom: '6lpx' })
.maxLines(1)
Text(`${this.data.createTime}`)
.fontColor($r('app.color.color_B0B0B0'))
.fontSize('23lpx')
.lineHeight('31lpx')
.fontWeight('400lpx')
.maxLines(1)
}.layoutWeight(1)
.alignItems(HorizontalAlign.Start)
if (this.data.checkStatus === 2) {
Row() {
Text(this.data.likeNum.toString())
.fontWeight("500lpx")
.fontSize("27lpx")
.lineHeight("31lpx")
.fontColor(this.data.like_status === 0 ? $r('app.color.color_666666') : $r('app.color.color_ED2800'))
.margin({ right: '8lpx' })
Image(this.data.like_status === 0 ? $r('app.media.like_default_status') : $r('app.media.liked_status'))
.width('31lpx')
.height('31lpx')
.objectFit(ImageFit.Auto)
.interpolation(ImageInterpolation.Medium)
.borderRadius(50)
}.onClick(() => {
this.commentLikeOperation()
})
}
}
.margin({ bottom: '10lpx' })
.width('100%')
.height('108lpx')
.padding({ left: '31lpx', right: '31lpx' })
Row() {
if (this.isExpand) {
Text() {
Span(this.data.commentContent)
}
.textStyle()
} else {
Text() {
Span(this.clipText(this.data.commentContent, 31, 5, 630, 0))
if (this.isOverLines) {
Span('...展开')
.fontColor($r('app.color.color_999999'))
.onClick(() => {
this.isExpand = true
})
}
}.maxLines(5)
.textStyle()
}
}.padding({ left: '31lpx', right: '31lpx' })
.width('100%')
Column() {
if (StringUtils.isNotEmpty(this.data.parentCommentContent)) {
//父评论
Row() {
if (this.isExpandParent) {
Text() {
Span(`@${this.data.parentCommentUserName}:`)
.fontColor($r('app.color.color_000000'))
.fontWeight('500lpx')
.fontSize('27lpx')
.lineHeight('40lpx')
Span(this.data.parentCommentContent)
.fontColor($r('app.color.color_000000'))
.fontWeight('400lpx')
.fontSize('27lpx')
.lineHeight('40lpx')
}
.width('100%')
.textAlign(TextAlign.Start)
} else {
Text() {
Span(`@${this.data.parentCommentUserName}:`)
.fontColor($r('app.color.color_000000'))
.fontWeight('500lpx')
.fontSize('27lpx')
.lineHeight('40lpx')
Span(this.clipText(this.data.parentCommentContent, 31, 5, 630, 1))
.fontColor($r('app.color.color_000000'))
.fontWeight('400lpx')
.fontSize('27lpx')
.lineHeight('40lpx')
if (this.isOverLinesParent) {
Span('...展开')
.fontColor($r('app.color.color_999999'))
.onClick(() => {
this.isExpandParent = true
})
}
}.maxLines(5)
.textAlign(TextAlign.Start)
.width('100%')
}
}
.width('100%')
.padding({ top: '23lpx', bottom: '15lpx', right: '23lpx' })
Divider()
.width('100%')
.height('1lpx')
.strokeWidth('1lpx')
.backgroundColor($r('app.color.color_EDEDED'))
.margin({ top: '4lpx', bottom: '4lpx' })
}
Column() {
Row() {
Row() {
Image($r('app.media.comment_link_icon'))
.objectFit(ImageFit.Auto)
.width('31lpx')
.height('31lpx')
.margin({ right: '10lpx' })
Column() {
Row() {
Text(`${this.data.targetTitle}`)
.fontWeight('400lpx')
.fontColor($r('app.color.color_666666'))
.lineHeight('38lpx')
.fontSize('27lpx')
.layoutWeight(1)
.maxLines(1)
.textOverflow({ overflow: TextOverflow.Ellipsis })
}.width('100%')
}
.layoutWeight(1)
.alignItems(HorizontalAlign.Start)
}.layoutWeight(1)
Image($r('app.media.arrow_icon_right'))
.margin({ right: '4lpx' })
.width('23lpx')
.height('23lpx')
.margin({right:'23lpx'})
}
.width('100%')
.height('69lpx')
.justifyContent(FlexAlign.SpaceBetween)
}.height('69lpx')
.justifyContent(FlexAlign.Center)
.onClick(() => {
ProcessUtils.processPage(
{
objectId: this.data.targetId,
relType: this.data.targetRelType + "",
relId: this.data.targetRelId,
objectType: this.data.targetType + "",
} as ContentDTO)
})
}
.margin({ top: '19lpx', bottom: '31lpx', left: '31lpx', right: '31lpx' })
.padding({ left: '23lpx' })
.width('662lpx')
.backgroundColor($r('app.color.color_F5F5F5'))
if (!this.isLastItem) {
Divider().width('100%')
.height('12lpx')
.strokeWidth('12lpx')
.color($r('app.color.color_F5F5F5'))
}
}
.justifyContent(FlexAlign.Center)
}
commentLikeOperation() {
let item = new CommentLikeOperationRequestItem(this.data.targetId, this.data.id + "", this.data.targetType + "", UserDataLocal.getUserName(), UserDataLocal.getUserHeaderUrl(), this.data.like_status === 0 ? 1 : 0)
MinePageDatasModel.getCommentLikeOperation(item, getContext(this)).then((value) => {
if (value != null) {
if (value.code === 0 || value.code.toString() === "0") {
this.data.like_status = this.data.like_status === 0 ? 1 : 0
this.data.likeNum = this.data.like_status === 0 ? this.data.likeNum - 1 : this.data.likeNum + 1
}
}
})
}
/**
* 截断文本
* @author liuzhendong(猩猩G)
* @param {string} str 要截断的文本 '啊啊啊啊啊'
* @param {number} fontSize 字体大小(px)
* @param {number} maxLines 最大行数 3
* @param {number} textWidth 文本宽度(px) vp 需要转换vp2px()
* @returns {string} clipStr 截断后的文本 '啊啊'
* @param {type} 0 我的评论 1 父评论
*/
clipText(str: string, fontSize: number, maxLines: number, textWidth: number, type: number): string {
let strArr: string[] = str.split("")
let truncateContent: string = '啊啊啊啊啊' // ...比正常文字宽度更小,这里使用啊啊啊(任意三个文字)代替计算
let measureTruncateWidth: number = measure.measureText({
textContent: truncateContent,
fontSize: px2fp(fontSize),
})
if(type === 1){
measureTruncateWidth = measureTruncateWidth + measure.measureText({
textContent: `@${this.data.parentCommentUserName}:`,
fontSize: px2fp(fontSize),
})
}
let clipStr: string = ''
for (let i = 0; i < strArr.length; i++) {
if (measure.measureText({
textContent: clipStr,
fontSize: px2fp(fontSize),
}) >= textWidth * maxLines - measureTruncateWidth) {
if (type === 0) {
this.isOverLines = true
} else {
this.isOverLinesParent = true
}
break;
}
clipStr += strArr[i]
}
return clipStr
}
}
@Extend(Text)
function textStyle() {
.width('630lpx')
.fontSize('31lpx')
.fontWeight('400lpx')
.fontColor($r('app.color.color_222222'))
.lineHeight('46lpx')
}
... ...
... ... @@ -8,6 +8,10 @@ import { FollowListDetailRequestItem } from '../../../viewmodel/FollowListDetail
import { ListHasNoMoreDataUI } from '../../reusable/ListHasNoMoreDataUI';
import { FollowChildComponent } from '../follow/FollowChildComponent';
import dataPreferences from '@ohos.data.preferences';
import { EmptyComponent } from '../../view/EmptyComponent';
import { ChildCommentComponent } from './ChildCommentComponent';
import { MineCommentListDetailItem } from '../../../viewmodel/MineCommentListDetailItem';
import { OtherUserCommentLikeStatusRequestItem } from '../../../viewmodel/OtherUserCommentLikeStatusRequestItem';
const TAG = "HomePageBottomComponent"
@Component
... ... @@ -90,6 +94,10 @@ export struct HomePageBottomComponent{
}
WDRouterRule.jumpWithPage(WDRouterPage.followListPage,params)
})
EmptyComponent({emptyType:4})
.layoutWeight(1)
.width('100%')
}.layoutWeight(1)
.justifyContent(FlexAlign.Start)
}else{
... ... @@ -161,7 +169,7 @@ export struct HomePageBottomComponent{
List({ space: 3 }) {
LazyForEach(this.data_comment, (item: CommentListItem, index: number = 0) => {
ListItem() {
ChildCommentComponent({data: item,isLastItem:index===this.data_comment.totalCount()-1})
ChildCommentComponent({data: item,levelHead:UserDataLocal.getUserLevelHeaderUrl(),isLastItem:index===this.data_comment.totalCount()-1})
}
.onClick(() => {
})
... ... @@ -263,17 +271,7 @@ export struct HomePageBottomComponent{
if (!this.data_comment || value.list.length == 0){
this.hasMore = false
}else{
value.list.forEach((value)=>{
let publishTime = DateTimeUtils.getCommentTime(DateTimeUtils.parseDate(value.createTime,DateTimeUtils.PATTERN_DATE_TIME_HYPHEN))
this.data_comment.push(new CommentListItem(value.fromUserHeader,value.fromUserName,value.targetTitle,publishTime,value.commentContent,value.likeNum,0,value.id,value.targetId,value.targetType,value.targetRelId,value.targetRelObjectId,value.targetRelType,value.targetStatus))
})
this.data_comment.notifyDataReload()
this.count = this.data_comment.totalCount()
if (this.data_comment.totalCount() < value.totalCount) {
this.curPageNum++
}else {
this.hasMore = false
}
this.getCommentListStatus(value)
}
this.isLoading = false
this.commentNum = value.totalCount
... ... @@ -286,102 +284,59 @@ export struct HomePageBottomComponent{
}
}
}
}
@Component
struct ChildCommentComponent {
@ObjectLink data: CommentListItem
isLastItem: boolean = false
build() {
Column(){
Row() {
Stack({alignContent: Alignment.Center}){
Image(this.data.fromUserHeader)
.alt($r('app.media.default_head'))
.objectFit(ImageFit.Auto)
.width('69lpx')
.height('69lpx')
.borderRadius(50)
Image(UserDataLocal.getUserLevelHeaderUrl())
.width('89lpx')
.height('89lpx')
.objectFit(ImageFit.Cover)
.borderRadius(50)
}.width('89lpx')
.height('89lpx')
.margin({right:'15lpx'})
getCommentListStatus(value:MineCommentListDetailItem){
Column(){
Text(this.data.fromUserName)
.fontSize('25lpx')
.lineHeight('35lpx')
.fontWeight('600lpx')
.fontColor($r('app.color.color_222222'))
.margin({bottom:'6lpx'})
.maxLines(1)
Text(`${this.data.createTime}`)
.fontColor($r('app.color.color_B0B0B0'))
.fontSize('23lpx')
.lineHeight('31lpx')
.fontWeight('400lpx')
.maxLines(1)
}.layoutWeight(1)
.alignItems(HorizontalAlign.Start)
let status = new OtherUserCommentLikeStatusRequestItem()
let data : CommentListItem[] = []
value.list.forEach((item)=>{
if(item.checkStatus === 2){
status.commentIdList.push(item.id)
}
.margin({bottom:'10lpx'})
.width('100%')
.height('108lpx')
.padding({left:'31lpx',right:'31lpx'})
Row(){
Text(this.data.commentContent)
.maxLines(3)
.textOverflow({ overflow: TextOverflow.Ellipsis })
.fontWeight('400lpx')
.fontSize('31lpx')
.lineHeight('46lpx')
.fontColor($r('app.color.color_222222'))
.margin({bottom:'10lpx'})
}.padding({left:'31lpx',right:'31lpx'})
.width('100%')
Row(){
Text(this.data.targetTitle)
.fontWeight('400lpx')
.fontColor($r('app.color.color_222222'))
.lineHeight('38lpx')
.fontSize('27lpx')
.textAlign(TextAlign.Center)
.margin({right:'4lpx'})
.maxLines(3)
.width('616lpx')
Image($r('app.media.arrow_icon_right'))
.objectFit(ImageFit.Auto)
.width('27lpx')
.height('27lpx')
let commentContent = item.commentContent
if(item.sensitiveShow === 0 && item.sensitiveExist === 1){
commentContent = item.commentContentSensitive
}
.padding({top:'17lpx',bottom:'17lpx',left:'23lpx',right:'23lpx'})
.width('662lpx')
.backgroundColor($r('app.color.color_F5F5F5'))
.margin({top:'19lpx',bottom:'31lpx'})
.onClick(()=>{
ProcessUtils.processPage(
{objectId: this.data.targetId,
relType:this.data.targetRelType+"",
relId:this.data.targetRelId,
objectType:this.data.targetType+"",
} as ContentDTO )
let parentCommentContent = ""
if(item.parentCommentVo!=null ){
parentCommentContent = item.parentCommentVo.commentContent
}
let parentCommentUserName = ""
if(item.parentCommentVo!=null ){
parentCommentUserName = item.parentCommentVo.fromUserName
}
data.push(new CommentListItem(item.fromUserHeader,item.fromUserName,item.targetTitle,item.createTime,commentContent,item.likeNum,0,item.id,item.targetId,item.targetType,item.targetRelId,item.targetRelObjectId,item.targetRelType,item.targetStatus,item.checkStatus,parentCommentContent,parentCommentUserName))
})
if(!this.isLastItem){
Divider().width('100%')
.height('12lpx')
.strokeWidth('12lpx')
.color($r('app.color.color_F5F5F5'))
MinePageDatasModel.getOtherUserCommentLikeStatusData(status,getContext(this)).then((newValue)=>{
newValue.forEach((item)=>{
data.forEach((list)=>{
if (item.commentId == list.id) {
list.like_status = item.status
}
})
})
data.forEach((item)=>{
let publishTime = DateTimeUtils.getCommentTime(DateTimeUtils.parseDate(item.createTime,DateTimeUtils.PATTERN_DATE_TIME_HYPHEN))
this.data_comment.push(new CommentListItem(item.fromUserHeader,item.fromUserName,item.targetTitle,publishTime,item.commentContent,item.likeNum,item.like_status,item.id,item.targetId,item.targetType,item.targetRelId,item.targetRelObjectId,item.targetRelType,item.targetStatus,item.checkStatus,item.parentCommentContent,item.parentCommentUserName))
})
this.data_comment.notifyDataReload()
this.count = this.data_comment.totalCount()
this.commentNum = value.totalCount
if (this.data_comment.totalCount() < value.totalCount) {
this.curPageNum++
}else {
this.hasMore = false
}
.justifyContent(FlexAlign.Center)
this.isLoading = false
}).catch((err:Error)=>{
console.log(TAG,"请求失败")
this.isLoading = false
})
}
}
\ No newline at end of file
... ...
... ... @@ -5,9 +5,7 @@ import { OtherUserCommentListRequestItem } from '../../../viewmodel/OtherUserCom
import { ListHasNoMoreDataUI } from '../../reusable/ListHasNoMoreDataUI';
import { MineCommentListDetailItem } from '../../../viewmodel/MineCommentListDetailItem';
import { OtherUserCommentLikeStatusRequestItem } from '../../../viewmodel/OtherUserCommentLikeStatusRequestItem';
import { CommentLikeOperationRequestItem } from '../../../viewmodel/CommentLikeOperationRequestItem';
import { ProcessUtils } from 'wdRouter/Index';
import { ContentDTO } from 'wdBean/Index';
import { ChildCommentComponent } from './ChildCommentComponent';
const TAG = "HomePageBottomComponent"
@Component
... ... @@ -108,8 +106,22 @@ export struct OtherHomePageBottomCommentComponent{
let status = new OtherUserCommentLikeStatusRequestItem()
let data : CommentListItem[] = []
value.list.forEach((item)=>{
if(item.checkStatus === 2){
status.commentIdList.push(item.id)
data.push(new CommentListItem(item.fromUserHeader,item.fromUserName,item.targetTitle,item.createTime,item.commentContent,item.likeNum,0,item.id,item.targetId,item.targetType,item.targetRelId,item.targetRelObjectId,item.targetRelType,item.targetStatus))
}
let commentContent = item.commentContent
if(item.sensitiveShow === 0 && item.sensitiveExist === 1){
commentContent = item.commentContentSensitive
}
let parentCommentContent = ""
if(item.parentCommentVo!=null ){
parentCommentContent = item.parentCommentVo.commentContent
}
let parentCommentUserName = ""
if(item.parentCommentVo!=null ){
parentCommentUserName = item.parentCommentVo.fromUserName
}
data.push(new CommentListItem(item.fromUserHeader,item.fromUserName,item.targetTitle,item.createTime,commentContent,item.likeNum,0,item.id,item.targetId,item.targetType,item.targetRelId,item.targetRelObjectId,item.targetRelType,item.targetStatus,item.checkStatus,parentCommentContent,parentCommentUserName))
})
MinePageDatasModel.getOtherUserCommentLikeStatusData(status,getContext(this)).then((newValue)=>{
... ... @@ -122,7 +134,7 @@ export struct OtherHomePageBottomCommentComponent{
})
data.forEach((item)=>{
this.data_comment.push(new CommentListItem(item.fromUserHeader,item.fromUserName,item.targetTitle,item.createTime,item.commentContent,item.likeNum,item.like_status,item.id,item.targetId,item.targetType,item.targetRelId,item.targetRelObjectId,item.targetRelType,item.targetStatus))
this.data_comment.push(new CommentListItem(item.fromUserHeader,item.fromUserName,item.targetTitle,item.createTime,item.commentContent,item.likeNum,item.like_status,item.id,item.targetId,item.targetType,item.targetRelId,item.targetRelObjectId,item.targetRelType,item.targetStatus,item.checkStatus,item.parentCommentContent,item.parentCommentUserName))
})
this.data_comment.notifyDataReload()
... ... @@ -141,133 +153,4 @@ export struct OtherHomePageBottomCommentComponent{
this.isLoading = false
})
}
}
@Component
struct ChildCommentComponent {
@ObjectLink data: CommentListItem
@Prop levelHead:string
isLastItem: boolean = false
build() {
Column(){
Row() {
Stack({alignContent: Alignment.Center}){
Image(this.data.fromUserHeader)
.alt($r('app.media.default_head'))
.objectFit(ImageFit.Auto)
.width('69lpx')
.height('69lpx')
.borderRadius(50)
Image(this.levelHead)
.width('89lpx')
.height('89lpx')
.objectFit(ImageFit.Cover)
.borderRadius(50)
}.width('89lpx')
.height('89lpx')
.margin({right:'15lpx'})
Column(){
Text(this.data.fromUserName)
.fontSize('25lpx')
.lineHeight('35lpx')
.fontWeight('600lpx')
.fontColor($r('app.color.color_222222'))
.margin({bottom:'6lpx'})
.maxLines(1)
Text(`${this.data.createTime}`)
.fontColor($r('app.color.color_B0B0B0'))
.fontSize('23lpx')
.lineHeight('31lpx')
.fontWeight('400lpx')
.maxLines(1)
}.layoutWeight(1)
.alignItems(HorizontalAlign.Start)
Row(){
Text(this.data.likeNum.toString())
.fontWeight("500lpx")
.fontSize("27lpx")
.lineHeight("31lpx")
.fontColor(this.data.like_status===0?$r('app.color.color_666666'):$r('app.color.color_ED2800'))
.margin({right:'8lpx'})
Image(this.data.like_status===0?$r('app.media.like_default_status'):$r('app.media.liked_status'))
.width('31lpx')
.height('31lpx')
.objectFit(ImageFit.Auto)
.interpolation(ImageInterpolation.Medium)
.borderRadius(50)
}.onClick(()=>{
this.commentLikeOperation()
})
}
.margin({bottom:'10lpx'})
.width('100%')
.height('108lpx')
.padding({left:'31lpx',right:'31lpx'})
Row(){
Text(this.data.commentContent)
.maxLines(3)
.textOverflow({ overflow: TextOverflow.Ellipsis })
.fontWeight('400lpx')
.fontSize('31lpx')
.lineHeight('46lpx')
.fontColor($r('app.color.color_222222'))
.margin({bottom:'10lpx'})
}.padding({left:'31lpx',right:'31lpx'})
.width('100%')
Row(){
Text(this.data.targetTitle)
.fontWeight('400lpx')
.fontColor($r('app.color.color_222222'))
.lineHeight('38lpx')
.fontSize('27lpx')
.textAlign(TextAlign.Center)
.margin({right:'4lpx'})
.maxLines(3)
.width('616lpx')
Image($r('app.media.arrow_icon_right'))
.objectFit(ImageFit.Auto)
.width('27lpx')
.height('27lpx')
}
.padding({top:'17lpx',bottom:'17lpx',left:'23lpx',right:'23lpx'})
.width('662lpx')
.backgroundColor($r('app.color.color_F5F5F5'))
.margin({top:'19lpx',bottom:'31lpx'})
.onClick(()=>{
ProcessUtils.processPage(
{objectId: this.data.targetId,
relType:this.data.targetRelType+"",
relId:this.data.targetRelId,
objectType:this.data.targetType+"",
} as ContentDTO )
})
if(!this.isLastItem){
Divider().width('100%')
.height('12lpx')
.strokeWidth('12lpx')
.color($r('app.color.color_F5F5F5'))
}
}
.justifyContent(FlexAlign.Center)
}
commentLikeOperation(){
let item = new CommentLikeOperationRequestItem(this.data.targetId,this.data.id+"",this.data.targetType+"",UserDataLocal.getUserName(),UserDataLocal.getUserHeaderUrl(),this.data.like_status===0?1:0)
MinePageDatasModel.getCommentLikeOperation(item,getContext(this)).then((value)=>{
if(value!=null){
if (value.code === 0 || value.code.toString() === "0") {
this.data.like_status = this.data.like_status===0?1:0
this.data.likeNum = this.data.like_status===0?this.data.likeNum-1:this.data.likeNum+1
}
}
})
}
}
\ No newline at end of file
... ...
... ... @@ -15,12 +15,14 @@ import { CompDTO } from 'wdBean';
import PageHelper from '../../viewmodel/PageHelper';
import { channelSkeleton } from '../skeleton/channelSkeleton'
import { ProcessUtils } from 'wdRouter/Index';
import PageAdModel from '../../viewmodel/PageAdvModel';
const TAG = 'PageComponent';
@Component
export struct PageComponent {
@State private pageModel: PageModel = new PageModel();
@State private pageAdvModel: PageAdModel = new PageAdModel();
navIndex: number = 0;
pageId: string = "";
channelId: string = "";
... ... @@ -44,7 +46,7 @@ export struct PageComponent {
.onTouch((event: TouchEvent | undefined) => {
if (event) {
if (this.pageModel.viewType === ViewType.LOADED) {
listTouchEvent(this.pageModel, event);
listTouchEvent(this.pageModel, this.pageAdvModel, event);
}
}
})
... ... @@ -120,12 +122,12 @@ export struct PageComponent {
@Builder
pageHornAd() {
if (this.pageModel.isShowAds) {
if (this.pageModel.pageCornerAdv.matInfo != null) {
if (this.pageAdvModel.isShowAds) {
if (this.pageAdvModel.pageCornerAdv.matInfo != null) {
// 页面右边挂角
this.drawPageCornerAdvView(1, 1 == this.pageModel.isRightAdv)
} else if (this.pageModel.pageCornerContentInfo.advert != null) {
this.drawPageCornerAdvView(2, 1 == this.pageModel.isRightAdv)
this.drawPageCornerAdvView(1, 1 == this.pageAdvModel.isRightAdv)
} else if (this.pageAdvModel.pageCornerContentInfo.advert != null) {
this.drawPageCornerAdvView(2, 1 == this.pageAdvModel.isRightAdv)
}
}
... ... @@ -140,8 +142,8 @@ export struct PageComponent {
@Builder
drawPageCornerAdvView(type: number, isRightCorne: boolean) {
// 页面左挂角
Image(type === 1 ? this.pageModel.pageCornerAdv.matInfo.matImageUrl[0]
: this.pageModel.pageCornerContentInfo.advert.displayUrl)
Image(type === 1 ? this.pageAdvModel.pageCornerAdv.matInfo.matImageUrl[0]
: this.pageAdvModel.pageCornerContentInfo.advert.displayUrl)
.width($r('app.float.vp_80'))
.height($r('app.float.vp_80'))
.id("left_iv")
... ... @@ -159,10 +161,10 @@ export struct PageComponent {
.onClick(() => {
if (type === 1) {
// 广告业务跳转
ProcessUtils.openAdvDetail(this.pageModel.pageCornerAdv.matInfo);
ProcessUtils.openAdvDetail(this.pageAdvModel.pageCornerAdv.matInfo);
} else {
// 展现中心的业务跳转
ProcessUtils.advJumpMainPage(this.pageModel.pageCornerContentInfo.advert)
ProcessUtils.advJumpMainPage(this.pageAdvModel.pageCornerContentInfo.advert)
}
})
// 关闭按钮
... ... @@ -180,7 +182,7 @@ export struct PageComponent {
})
.onClick(() => {
// 关闭挂角广告
this.pageModel.isShowAds = false;
this.pageAdvModel.isShowAds = false;
})
... ... @@ -228,7 +230,7 @@ export struct PageComponent {
this.pageModel.groupId = this.pageId;
this.pageModel.channelId = this.channelId;
this.pageModel.currentPage = 1;
PageHelper.getInitData(this.pageModel)
PageHelper.getInitData(this.pageModel, this.pageAdvModel)
// let pageInfo = await PageViewModel.getPageInfo(this.pageModel.pageId);
// if (pageInfo == null) {
// this.pageModel.viewType = ViewType.EMPTY;
... ...
import { Action, CompDTO, Params, TopNavDTO } from 'wdBean';
import { LazyDataSource, Logger } from 'wdKit';
import { WDRouterRule } from 'wdRouter';
import { ProcessUtils } from 'wdRouter';
import { PageComponent } from './PageComponent';
import { ChannelSubscriptionLayout } from './ChannelSubscriptionLayout';
import { FirstTabTopSearchComponent } from '../search/FirstTabTopSearchComponent';
... ... @@ -135,16 +135,6 @@ export struct TopNavigationComponent {
return item.name === '版面'
}
jumpToENewPaper() {
let taskAction: Action = {
type: 'JUMP_INNER_NEW_PAGE',
params: {
pageID: 'E_NEWSPAPER'
} as Params,
};
WDRouterRule.jumpWithAction(taskAction)
}
build() {
Column() {
// 顶部搜索、日报logo、早晚报
... ... @@ -156,7 +146,7 @@ export struct TopNavigationComponent {
.width(72)
.height(29)
.onClick(() => {
this.jumpToENewPaper()
ProcessUtils.gotoENewsPaper()
})
Stack({ alignContent: Alignment.Center }) {
Image($r('app.media.background_read_paper_home'))
... ... @@ -177,13 +167,7 @@ export struct TopNavigationComponent {
.height(30)
.width(124)
.onClick(() => {
let taskAction: Action = {
type: 'JUMP_INNER_NEW_PAGE',
params: {
pageID: 'MorningEveningPaper'
} as Params,
};
WDRouterRule.jumpWithAction(taskAction)
ProcessUtils.gotoMorningEveningPaper()
})
}.width('100%')
.justifyContent(FlexAlign.SpaceBetween)
... ... @@ -236,18 +220,11 @@ export struct TopNavigationComponent {
}
if (this.isBroadcast(this._currentNavIndex === 0 ? this.myChannelList[index] : this.topNavList[index])) {
// 跳转到播报页面
let taskAction: Action = {
type: 'JUMP_INNER_NEW_PAGE',
params: {
pageID: 'BroadcastPage',
id: this.myChannelList[index].pageId
} as Params,
};
WDRouterRule.jumpWithAction(taskAction)
ProcessUtils.gotoBroadcastPage(this.myChannelList[index].pageId)
this.tabsController.changeIndex(this.currentTopNavSelectedIndex)
}
if (this.isLayout(this._currentNavIndex === 0 ? this.myChannelList[index] : this.topNavList[index])) {
this.jumpToENewPaper()
ProcessUtils.gotoENewsPaper()
this.tabsController.changeIndex(this.currentTopNavSelectedIndex)
}
})
... ...
... ... @@ -25,6 +25,7 @@ export struct SearchComponent {
@State relatedSearchContentsData: SearchRelatedItem[] = []
scroller: Scroller = new Scroller()
@State count:string[] = []
@State isGetRequest:boolean = false;
aboutToAppear() {
//获取提示滚动
... ... @@ -112,7 +113,7 @@ export struct SearchComponent {
} else {
if (this.hasChooseSearch) {
//搜索结果
SearchResultComponent({count:this.count,searchText:this.searchText,isInit:true})
SearchResultComponent({count:this.count,searchText:this.searchText,isGetRequest:this.isGetRequest})
} else {
//联想搜索
SearchRelatedComponent({relatedSearchContentData:$relatedSearchContentsData,onGetSearchRes: (item): void => this.getSearchRelatedResData(item),searchText:this.searchText})
... ... @@ -287,8 +288,10 @@ export struct SearchComponent {
this.count.push("活动")
}
}
this.isGetRequest = true
}).catch((err: Error) => {
console.log(TAG, JSON.stringify(err))
this.isGetRequest = true
})
}
}
\ No newline at end of file
... ...
... ... @@ -17,7 +17,7 @@ const TAG = "SearchResultComponent"
export struct SearchResultComponent {
@Prop count: string[]
@Prop searchText: string
@State isInit:boolean = false;
@Prop isGetRequest:boolean = false;
@State currentIndex: number = 0
private controller: TabsController = new TabsController()
fontColor: string = '#999999'
... ... @@ -28,7 +28,7 @@ export struct SearchResultComponent {
scroller: Scroller = new Scroller()
aboutToAppear(): void {
if (this.count.length === 0 && this.isInit == true) {
if (this.count.length === 0 && this.isGetRequest == true) {
this.getSuggestData()
}
}
... ... @@ -40,18 +40,7 @@ export struct SearchResultComponent {
SearcherAboutDataModel.getSearchSuggestData(request, getContext(this)).then((value) => {
value.forEach((item) => {
this.data.push({
appStyle: item.appStyle,
channelId: item.channelId + "",
coverType: item.coverType,
coverUrl: item.coverUrl,
newsTitle: item.newsTitle,
objectId: item.objectId,
publishTime: item.publishTime,
relId: item.relId + "",
relType: item.relType + "",
source: item.source,
} as ContentDTO)
this.data.push(item)
})
this.data.notifyDataReload()
this.suggest_count = this.data.totalCount()
... ... @@ -61,7 +50,7 @@ export struct SearchResultComponent {
build() {
Column() {
if (this.count != null && this.count.length === 0 && this.isInit == true) {
if (this.count != null && this.count.length === 0 && this.isGetRequest == true) {
List() {
ListItem() {
//缺省图
... ...
... ... @@ -6,7 +6,7 @@ const TAG = 'LiveEmptyComponent';
/**
* WDViewDefaultType 缺省页
*/
export const enum WDViewDefaultType {
export const enum WDLiveViewDefaultType {
/// 1.默认
WDViewDefaultType_Default,
/// 16.直播结束
... ... @@ -20,11 +20,11 @@ export const enum WDViewDefaultType {
*/
@Preview
@Component
export struct EmptyComponent {
export struct LiveEmptyComponent {
// private emptySize: SizeOptions = {};
@State emptyWidth: string | number = CommonConstants.FULL_PARENT;
@State emptyHeight: string | number = CommonConstants.FULL_PARENT;
@State emptyType: number = WDViewDefaultType.WDViewDefaultType_Default; // 缺省图类型,传枚举
@State emptyType: number = WDLiveViewDefaultType.WDViewDefaultType_Default; // 缺省图类型,传枚举
@State emptyButton: boolean = false
@State timeNum: number = 10
/**
... ... @@ -154,19 +154,20 @@ export struct EmptyComponent {
buildNoDataTip(): string {
Logger.info(TAG, "buildNoDataTip");
let contentString: string = '暂无内容'
if (this.emptyType === WDViewDefaultType.WDViewDefaultType_NoLiveEnd) {
if (this.emptyType === WDLiveViewDefaultType.WDViewDefaultType_NoLiveEnd) {
contentString = '直播已结束' // 前方拥堵,请耐心等待
} else if (this.emptyType === WDViewDefaultType.WDViewDefaultType_NoLiveSuspend) {
} else if (this.emptyType === WDLiveViewDefaultType.WDViewDefaultType_NoLiveSuspend) {
contentString = '主播暂时离开,马上回来' // 前方拥堵,请耐心等待
}
return contentString
}
buildNoDataTipImage(): Resource | string {
Logger.info(TAG, "buildNoDataTip");
let imageString: Resource | string = $r('app.media.icon_no_content')
if (this.emptyType === WDViewDefaultType.WDViewDefaultType_NoLiveEnd) {
if (this.emptyType === WDLiveViewDefaultType.WDViewDefaultType_NoLiveEnd) {
imageString = $r('app.media.icon_no_end')
} else if (this.emptyType === WDViewDefaultType.WDViewDefaultType_NoLiveSuspend) {
} else if (this.emptyType === WDLiveViewDefaultType.WDViewDefaultType_NoLiveSuspend) {
imageString = $r('app.media.icon_no_liver')
}
return imageString
... ...
... ... @@ -323,6 +323,7 @@ class MinePageDatasModel{
Logger.info(TAG, "getAppointmentList then,AppointmentResDTO.timeStamp:" + navResDTO.timestamp);
let navigationBean = navResDTO.data as MineCommentListDetailItem
success(navigationBean);
// success(this.getMineCommentListDataLocal(context))
}).catch((err: Error) => {
Logger.error(TAG, `fetchAppointmentListDataApi catch, error.name : ${err.name}, error.message:${err.message}`);
success(this.getMineCommentListDataLocal(context))
... ... @@ -338,7 +339,7 @@ class MinePageDatasModel{
async getMineCommentListDataLocal(context: Context): Promise<MineCommentListDetailItem> {
Logger.info(TAG, `getMineFollowListDataLocal start`);
let compRes: ResponseDTO<MineCommentListDetailItem> | null = await ResourcesUtils.getResourcesJson<ResponseDTO<MineCommentListDetailItem>>(context,'mine_comment_list_data.json' );
let compRes: ResponseDTO<MineCommentListDetailItem> | null = await ResourcesUtils.getResourcesJson<ResponseDTO<MineCommentListDetailItem>>(context,'mine_comment_list_data2.json' );
if (!compRes || !compRes.data) {
Logger.info(TAG, `getMineFollowListDataLocal compRes is empty`);
return new MineCommentListDetailItem()
... ...
... ... @@ -6,10 +6,9 @@ import { SearchHistoryItem } from '../viewmodel/SearchHistoryItem';
import { SearchHotContentItem } from '../viewmodel/SearchHotContentItem';
import { SearchResultCountItem } from '../viewmodel/SearchResultCountItem';
import { SearchResultContentData } from '../viewmodel/SearchResultContentData';
import { contentListParams, InteractDataDTO } from 'wdBean/Index';
import { ContentDTO, contentListParams, InteractDataDTO } from 'wdBean/Index';
import { CreatorDetailRequestItem } from '../viewmodel/CreatorDetailRequestItem';
import { CreatorDetailResponseItem } from '../viewmodel/CreatorDetailResponseItem';
import { SearchSuggestData } from '../viewmodel/SearchSuggestData';
import { SearchSuggestRequestItem } from '../viewmodel/SearchSuggestRequestItem';
const TAG = "SearcherAboutDataModel"
... ... @@ -354,17 +353,17 @@ class SearcherAboutDataModel{
/**
* 搜索推荐 展示列表
*/
getSearchSuggestData(object:SearchSuggestRequestItem,context: Context): Promise<SearchSuggestData[]> {
return new Promise<SearchSuggestData[]>((success, error) => {
getSearchSuggestData(object:SearchSuggestRequestItem,context: Context): Promise<ContentDTO[]> {
return new Promise<ContentDTO[]>((success, error) => {
Logger.info(TAG, `getSearchSuggestData start`);
this.fetchSearchSuggestData(object).then((navResDTO: ResponseDTO<SearchSuggestData[]>) => {
this.fetchSearchSuggestData(object).then((navResDTO: ResponseDTO<ContentDTO[]>) => {
if (!navResDTO || navResDTO.code != 0 /*|| navResDTO.data == null*/) {
// success(this.getSearchSuggestDataLocal(context))
success([])
return
}
Logger.info(TAG, "getSearchSuggestData then,SearchResultListResDTO.timeStamp:" + navResDTO.timestamp);
let navigationBean = navResDTO.data as SearchSuggestData[]
let navigationBean = navResDTO.data as ContentDTO[]
success(navigationBean);
}).catch((err: Error) => {
Logger.error(TAG, `getSearchSuggestData catch, error.name : ${err.name}, error.message:${err.message}`);
... ... @@ -377,12 +376,12 @@ class SearcherAboutDataModel{
fetchSearchSuggestData(object:SearchSuggestRequestItem) {
let url = HttpUrlUtils.getSearchSuggestDataUrl()
let headers: HashMap<string, string> = HttpUrlUtils.getCommonHeaders();
return WDHttp.post<ResponseDTO<SearchSuggestData[]>>(url,object, headers)
return WDHttp.post<ResponseDTO<ContentDTO[]>>(url,object, headers)
};
async getSearchSuggestDataLocal(context: Context): Promise<SearchSuggestData[]> {
async getSearchSuggestDataLocal(context: Context): Promise<ContentDTO[]> {
Logger.info(TAG, `getInteractListDataLocal start`);
let compRes: ResponseDTO<SearchSuggestData[]> | null = await ResourcesUtils.getResourcesJson<ResponseDTO<SearchSuggestData[]>>(context,'search_suggest_data.json' );
let compRes: ResponseDTO<ContentDTO[]> | null = await ResourcesUtils.getResourcesJson<ResponseDTO<ContentDTO[]>>(context,'search_suggest_data.json' );
if (!compRes || !compRes.data) {
Logger.info(TAG, `getInteractListDataLocal compRes is empty`);
return []
... ...
... ... @@ -6,8 +6,9 @@ import PageModel from '../viewmodel/PageModel';
import PageViewModel from '../viewmodel/PageViewModel';
import { DateTimeUtils } from 'wdKit';
import PageHelper from '../viewmodel/PageHelper';
import PageAdModel from '../viewmodel/PageAdvModel';
export function listTouchEvent(pageModel: PageModel, event: TouchEvent) {
export function listTouchEvent(pageModel: PageModel,pageAdvModel:PageAdModel, event: TouchEvent) {
switch (event.type) {
case TouchType.Down:
pageModel.downY = event.touches[0].y;
... ... @@ -35,7 +36,7 @@ export function listTouchEvent(pageModel: PageModel, event: TouchEvent) {
}
if ((pageModel.isPullRefreshOperation === true)) {
// Lift your finger and pull down to refresh.
touchUpPullRefresh(pageModel);
touchUpPullRefresh(pageModel,pageAdvModel);
} else {
// Fingers up, handle loading more.
touchUpLoadMore(pageModel);
... ... @@ -65,14 +66,15 @@ export function touchMovePullRefresh(pageModel: PageModel, event: TouchEvent) {
}
}
export function touchUpPullRefresh(pageModel: PageModel) {
export function touchUpPullRefresh(pageModel: PageModel,pageAdvModel:PageAdModel) {
if (pageModel.isCanRefresh === true) {
pageModel.offsetY = vp2px(pageModel.pullDownRefreshHeight);
pullRefreshState(pageModel, RefreshState.Refreshing);
pageModel.currentPage = 1;
setTimeout(() => {
let self: PageModel = pageModel;
PageHelper.refreshUI(self)
let advSelf: PageAdModel = pageAdvModel;
PageHelper.refreshUI(self,advSelf)
// PageViewModel.getPageData(self.bizCopy(2))
// .then((data: PageDTO) => {
// self.timestamp = DateTimeUtils.getTimeStamp().toString()
... ...
... ... @@ -24,7 +24,7 @@ export class CommentListItem{
keyArticle: number = -1
likeNum: number = 0
// pageId: null
// parentCommentVo: null
parentCommentVo: ParentCommentVo = new ParentCommentVo()
parentId: number = -1
rootCommentId: number = -1
sensitiveExist: number = -1
... ... @@ -39,9 +39,12 @@ export class CommentListItem{
targetTitle: string = ""
// topicType: null
uuid: string = ""
parentCommentContent = ""
parentCommentUserName = ""
isShowAll:boolean = false
constructor(fromUserHeader:string,fromUserName:string,targetTitle:string,createTime:string,commentContent:string,likeNum:number,like_status:number,id:number,targetId:string,targetType:number,targetRelId: string,targetRelObjectId: string,targetRelType: number,targetStatus: number,) {
constructor(fromUserHeader:string,fromUserName:string,targetTitle:string,createTime:string,commentContent:string,likeNum:number,like_status:number,id:number,targetId:string,targetType:number,targetRelId: string,targetRelObjectId: string,targetRelType: number,targetStatus: number,checkStatus:number,parentCommentContent:string,parentCommentUserName:string) {
this.fromUserHeader = fromUserHeader
this.fromUserName = fromUserName
this.commentContent = commentContent
... ... @@ -56,5 +59,18 @@ export class CommentListItem{
this.targetRelObjectId = targetRelObjectId
this.targetRelType = targetRelType
this.targetStatus = targetStatus
this.checkStatus = checkStatus
this.parentCommentContent = parentCommentContent
this.parentCommentUserName = parentCommentUserName
}
}
class ParentCommentVo{
avatarFrame: string = ""
checkStatus: number = -1
commentContent: string = ""
commentPics: string = ""
commentType: string = ""
fromUserName: string = ""
id: number = -1
}
... ...
import { PageInfoDTO } from 'wdBean/Index';
import { AdvRuleBean, CompAdvBean } from 'wdBean/src/main/ets/bean/adv/AdvsRuleBean';
/**
* @Description: 处理页面的广告业务
* @Author: lyb
* @Email: liyubing@wondertek.com.cn
* @CreateDate:
* @UpdateRemark: 更新说明
* @Version: 1.0
*/
export default class PageAdModel {
//左右挂角广告对象
pageCornerAdv: CompAdvBean = {} as CompAdvBean
// 挂角广告
isShowAds: boolean = false;
isRightAdv: number = 1;
// 1:右边;2:左边 -> 默认右边
pageCornerContentInfo: AdvRuleBean = {} as AdvRuleBean
// 展现中心业务信息
/**
* 解析广告资源
* @param pageInfo
*/
analysisAdvSource(pageInfo: PageInfoDTO): void {
if (pageInfo.hasAdInfo === 1 && pageInfo.cornersAdv != null) {
// 优先展示展现中心广告
let cornersAdv = pageInfo.cornersAdv
if (cornersAdv == null) {
return
}
if (cornersAdv.advert == null) {
return
}
if ("left_down" == cornersAdv.pos) {
// 左边挂角广告
this.isRightAdv = 2
} else {
// 右边挂角广告
this.isRightAdv = 1
}
this.pageCornerContentInfo = cornersAdv;
this.isShowAds = true
} else if (pageInfo.cornersAdv2 != null && pageInfo.cornersAdv2.length > 0) {
// 广告中心-挂角广告信息
let cornersAdv2 = pageInfo.cornersAdv2
// 获取
let showCompAdvBean = cornersAdv2[0]
if (showCompAdvBean.matInfo == null) {
return
}
//
let slotInfo = showCompAdvBean.slotInfo;
let postion = slotInfo.position
if (postion == 0) {
//左边挂角
this.isRightAdv = 2
} else {
// 右边挂角
this.isRightAdv = 1
}
this.pageCornerAdv = showCompAdvBean
this.isShowAds = true
}
}
}
\ No newline at end of file
... ...
... ... @@ -6,6 +6,7 @@ import PageModel from './PageModel';
import PageViewModel from './PageViewModel';
import { promptAction } from '@kit.ArkUI';
import { AdvRuleBean } from 'wdBean/src/main/ets/bean/adv/AdvsRuleBean';
import PageAdModel from './PageAdvModel';
const TAG = 'PageHelper';
... ... @@ -13,12 +14,14 @@ const TAG = 'PageHelper';
* 处理返回后的数据
*/
export class PageHelper {
/**
* 刷新数据
*/
async refreshUI(pageModel: PageModel) {
async refreshUI(pageModel: PageModel,pageAdvModel:PageAdModel) {
pageModel.loadStrategy = 2
this.getPageInfo(pageModel)
this.getPageInfo(pageModel,pageAdvModel)
}
/**
... ... @@ -33,12 +36,12 @@ export class PageHelper {
/**
* 进页面请求数据
*/
async getInitData(pageModel: PageModel) {
async getInitData(pageModel: PageModel,pageAdvModel:PageAdModel) {
pageModel.loadStrategy = 1
this.getPageInfo(pageModel)
this.getPageInfo(pageModel,pageAdvModel)
}
async getPageInfo(pageModel: PageModel) {
async getPageInfo(pageModel: PageModel,pageAdvModel:PageAdModel) {
pageModel.currentPage = 1;
let pageInfo = await PageViewModel.getPageInfo(pageModel.pageId);
if (pageInfo == null) {
... ... @@ -47,67 +50,12 @@ export class PageHelper {
}
pageModel.pageInfo = pageInfo;
//解析广告资源
this.analysisAdvSource(pageModel);
pageAdvModel.analysisAdvSource(pageInfo)
this.parseGroup(pageModel)
}
/**
* 解析广告资源
* @param pageInfo
*/
analysisAdvSource(pageModel: PageModel) {
let pageInfo = pageModel.pageInfo
if (pageInfo.hasAdInfo === 1 && pageInfo.cornersAdv != null) {
// 优先展示展现中心广告
let cornersAdv = pageInfo.cornersAdv
if (cornersAdv == null) {
return
}
if (cornersAdv.advert == null) {
return
}
if ("left_down" == cornersAdv.pos) {
// 左边挂角广告
pageModel.isRightAdv = 2
} else {
// 右边挂角广告
pageModel.isRightAdv = 1
}
pageModel.pageCornerContentInfo = cornersAdv;
pageModel.isShowAds = true
} else if (pageInfo.cornersAdv2 != null && pageInfo.cornersAdv2.length > 0) {
// 广告中心-挂角广告信息
let cornersAdv2 = pageInfo.cornersAdv2
// 获取
let showCompAdvBean = cornersAdv2[0]
if (showCompAdvBean.matInfo == null) {
return
}
//
let slotInfo = showCompAdvBean.slotInfo;
let postion = slotInfo.position
if (postion == 0) {
//左边挂角
pageModel.isRightAdv = 2
} else {
// 右边挂角
pageModel.isRightAdv = 1
}
pageModel.pageCornerAdv = showCompAdvBean
pageModel.isShowAds = true
}
}
async parseGroup(pageModel: PageModel) {
... ...
... ... @@ -51,11 +51,11 @@ export default class PageModel {
// keyGenerator相关字符串,用于刷新list布局
timestamp: String = '1';
//左右挂角广告对象
pageCornerAdv:CompAdvBean = {} as CompAdvBean // 挂角广告
isShowAds : boolean = false;
isRightAdv : number = 1;// 1:右边;2:左边 -> 默认右边
pageCornerContentInfo:AdvRuleBean = {} as AdvRuleBean // 展现中心业务信息
// //左右挂角广告对象
// pageCornerAdv:CompAdvBean = {} as CompAdvBean // 挂角广告
// isShowAds : boolean = false;
// isRightAdv : number = 1;// 1:右边;2:左边 -> 默认右边
// pageCornerContentInfo:AdvRuleBean = {} as AdvRuleBean // 展现中心业务信息
/**
... ...
@Observed
export class SearchSuggestData{
// activityExt: null
appStyle: string = ""
// askInfo: null
axisColor: string = ""
// bestNoticer: null
// bottomNavId: null
cardItemId: string = ""
channelId: number = -1
// commentInfo: null
corner: string = ""
coverSize: string = ""
coverType: number = -1
coverUrl: string = ""
expIds: string = ""
extra: string = ""
fullColumnImgUrls: Array<FullColumnImgUrls> = []
// hasMore: null
itemId: string = ""
itemType: string = ""
itemTypeCode: string = ""
keyArticle: number = -1
// landscape: null
// likeStyle: null
linkUrl: string = ""
// liveInfo: null
menuShow: number = -1
newTags: string = ""
newsAuthor: string = ""
newsSubTitle: string = ""
newsSummary: string = ""
newsTitle: string = ""
newsTitleColor: string = ""
objectId: string = ""
objectLevel: string = ""
objectType: string = ""
// openComment: null
// openLikes: null
pageId: string = ""
// photoNum: null
// position: null
// productNum: null
publishTime: string = ""
// pushTime: null
// pushUnqueId: null
readFlag: number = -1
recommend: number = -1
relId: number = -1
relObjectId: string = ""
relType: number = -1
// rmhInfo: null
rmhPlatform: number = -1
sceneId: string = ""
// shareInfo: null
// slideShows: Array< unknown >
// sortValue: null
source: string = ""
subObjectType: string = ""
subSceneId: string = ""
// tagIds: Array< unknown >
// tagWord: null
// titleShow: null
// titleShowPolicy: null
// topicTemplate: null
traceId: string = ""
traceInfo: string = ""
// userInfo: null
videoInfo: VideoInfo = new VideoInfo()
visitorComment: number = -1
// voiceInfo: null
}
class FullColumnImgUrls{
// format: null
fullUrl: string = ""
height: number = -1
landscape: number = -1
size: number = -1
url: string = ""
weight: number = -1
}
class VideoInfo{
firstFrameImageUri: string = ""
videoDuration: number = -1
videoLandscape: number = -1
videoUrl: string = ""
}
... ... @@ -6,6 +6,7 @@ import { PlayerComponent } from '../widgets/vertical/PlayerComponent';
import { PlayerInfoComponent } from '../widgets/vertical/PlayerInfoComponent';
import { WDPlayerController } from 'wdPlayer/Index';
import { DisplayDirection } from 'wdConstant/Index';
import { LiveEmptyComponent, WDLiveViewDefaultType } from 'wdComponent/Index';
const storage = LocalStorage.getShared();
const TAG = 'DetailPlayVLivePage'
... ... @@ -22,6 +23,7 @@ export struct DetailPlayVLivePage {
@Provide liveRoomDataBean: LiveRoomDataBean = {} as LiveRoomDataBean
@Provide isShowControl: boolean = false
@Provide liveState: string = ''
@Provide playUrl: string = ''
@Provide displayDirection: DisplayDirection = DisplayDirection.VERTICAL //横竖屏,默认竖屏
@State relId: string = ''
@State contentId: string = ''
... ... @@ -50,10 +52,23 @@ export struct DetailPlayVLivePage {
build() {
Column() {
// 直播结束且无回看
if (this.liveState === 'end' || !this.playUrl) {
LiveEmptyComponent({
emptyType: WDLiveViewDefaultType.WDViewDefaultType_NoLiveEnd
})
} else {
Stack() {
// 直播暂停,仍然可以评论
if (this.liveState === 'pause') {
LiveEmptyComponent({
emptyType: WDLiveViewDefaultType.WDViewDefaultType_NoLiveSuspend
})
} else {
PlayerComponent({
playerController: this.playerController
})
}
PlayerInfoComponent({
playerController: this.playerController,
... ... @@ -74,6 +89,8 @@ export struct DetailPlayVLivePage {
}
.height('100%')
.width('100%')
}
}
.height('100%')
... ... @@ -86,7 +103,10 @@ export struct DetailPlayVLivePage {
(data) => {
if (data.length > 0) {
this.liveDetailsBean = data[0]
this.liveState = this.liveDetailsBean.liveInfo?.liveState
this.liveState = this.liveDetailsBean.liveInfo?.liveState //直播新闻-直播状态 wait待开播running直播中end已结束cancel已取消paused暂停
if (this.liveDetailsBean.liveInfo.liveState == 'end') {
this.playUrl = this.liveDetailsBean.liveInfo.vlive[0].replayUri
}
console.log(TAG, 'getLiveDetails', JSON.stringify((this.liveDetailsBean)))
}
},
... ...
... ... @@ -15,6 +15,7 @@
"wdDetailPlayShortVideo": "file:../../features/wdDetailPlayShortVideo",
"wdRouter": "file:../../commons/wdRouter",
"wdNetwork": "file:../../commons/wdNetwork",
"wdHwAbility": "file:../../features/wdHwAbility"
"wdHwAbility": "file:../../features/wdHwAbility",
"wdJsBridge": "file:../../commons/wdJsBridge"
}
}
... ...
import router from '@ohos.router';
import { Action } from 'wdBean';
import { Logger } from 'wdKit';
import { WdWebComponent } from 'wdWebComponent';
const TAG = 'DefaultWebPage';
import router from '@ohos.router';
import { CommonConstants } from 'wdConstant'
import { BridgeWebViewControl } from 'wdJsBridge';
import { detailedSkeleton } from 'wdComponent/src/main/ets/components/skeleton/detailSkeleton'
const TAG = 'DefaultWebPage'
@Entry
@Component
struct DefaultWebPage {
private url?: string;
@State reload: number = 0;
@State isPageEnd : boolean = false
aboutToAppear() {
let action: Action = router.getParams() as Action
if (action) {
this.url = action.params?.url
}
}
onPageShow() {
Logger.info(TAG, `DefaultWebPage# onPageShow:::refresh`);
this.reload = ++this.reload
}
onPageHide() {
this.reload = 0
}
webviewControl: BridgeWebViewControl = new BridgeWebViewControl()
scroller: Scroller = new Scroller();
action: Action = {} as Action
@State webUrl: string = '';
@State isPageEnd: boolean = false
build() {
Column() {
if (!this.isPageEnd) {
detailedSkeleton()
}
Stack({ alignContent: Alignment.Bottom }) {
Column() {
WdWebComponent({
webUrl: this.url,
webviewControl: this.webviewControl,
webUrl: this.webUrl,
backVisibility: false,
// reload: this.reload,
isPageEnd:$isPageEnd
isPageEnd: $isPageEnd
})
}
.padding({ bottom: 56 })
.width(CommonConstants.FULL_WIDTH)
.height(CommonConstants.FULL_HEIGHT)
}
}.width(CommonConstants.FULL_WIDTH).height(CommonConstants.FULL_HEIGHT)
}
aboutToAppear() {
let action: Action = router.getParams() as Action
if (action) {
this.webUrl = action.params?.url || ''
}
}
}
\ No newline at end of file
... ...
{
"code": "0",
"data": {
"hasNext": 0,
"list": [
{
"avatarFrame": "",
"checkStatus": 0,
"commentContent": "说得很好啊你牛魔突突突突兔兔突突突你牛魔突突突突兔兔突突突你牛魔突突突突兔兔突突突你牛魔突突突突兔兔突突突你牛魔突突突突兔兔突突突你牛魔突突突突兔兔突突突你牛魔突突突突兔兔突突突你牛魔突突突突兔兔突突突你牛魔突突突突兔兔突突突你牛魔突突突突兔兔突突突你牛魔突突突突兔兔突突突你牛魔突突突突兔兔突突突你牛魔突突突突兔兔突突突你牛魔突突突突兔兔突突突你牛魔突突突突兔兔突突突",
"commentContentSensitive": "",
"commentLevel": 2,
"commentPics": "",
"commentSensitive": "",
"commentType": "2",
"createTime": "2024-04-24 10:22:37",
"fromCreatorId": "",
"fromDeviceId": "",
"fromUserHeader": "https://rmrbcmsonline.peopleapp.com/upload/default.png?x-oss-process=image/resize,l_100/auto-orient,1/quality,q_90/format,jpg",
"fromUserId": "559509019499205",
"fromUserName": "人民wH38q",
"fromUserType": 1,
"h5Url": "",
"id": 58110548,
"keyArticle": 0,
"likeNum": 0,
"pageId": null,
"parentCommentVo": {
"avatarFrame": "",
"checkStatus": 2,
"commentContent": "1,因为读书的人\n是低着头向上看的人\n身处一隅,却能放眼世界\n2,因为读书的人\n总是比不读书的人\n活得有趣一点\n3,因为读书的人\n即使平凡,绝不平庸",
"commentPics": "",
"commentType": "1",
"fromUserName": "胡德清",
"id": 58109773
},
"parentId": 58109773,
"rootCommentId": 58109773,
"sensitiveExist": 0,
"sensitiveShow": 1,
"shareInfo": {
"shareCoverUrl": "",
"shareSummary": "读书,就是一个让生命变得更加辽阔的过程",
"shareTitle": "读书,就是低着头向上看",
"shareUrl": "https://people.pdnews.cn/column/30044549051-500005339313"
},
"targetId": "30044549051",
"targetRelId": "500005339313",
"targetRelObjectId": "2002",
"targetRelType": 1,
"targetStatus": 0,
"targetTitle": "读书,就是低着头向上看",
"targetType": 13,
"topicType": null,
"uuid": "6425f699-d762-4d33-b73c-64c780fc9693"
},
{
"avatarFrame": "",
"checkStatus": 0,
"commentContent": "你牛魔突突突突兔兔突突突你牛魔突突突突兔兔突突突你牛魔突突突突兔兔突突突你牛魔突突突突兔兔突突突你牛魔突突突突兔兔突突突你牛魔突突突突兔兔突突突",
"commentContentSensitive": "",
"commentLevel": 2,
"commentPics": "",
"commentSensitive": "",
"commentType": "2",
"createTime": "2024-04-24 10:21:42",
"fromCreatorId": "",
"fromDeviceId": "",
"fromUserHeader": "https://rmrbcmsonline.peopleapp.com/upload/default.png?x-oss-process=image/resize,l_100/auto-orient,1/quality,q_90/format,jpg",
"fromUserId": "559509019499205",
"fromUserName": "人民wH38q",
"fromUserType": 1,
"h5Url": "",
"id": 58092145,
"keyArticle": 0,
"likeNum": 0,
"pageId": null,
"parentCommentVo": {
"avatarFrame": "",
"checkStatus": 2,
"commentContent": "这是继续把自己塑造成受害者角色,其实不过是历史原因造成,这也改不了以色列这半年来对加沙人民的种族灭绝行为!",
"commentPics": "",
"commentType": "1",
"fromUserName": "人民pn5SI",
"id": 58063914
},
"parentId": 58063914,
"rootCommentId": 58063914,
"sensitiveExist": 0,
"sensitiveShow": 1,
"shareInfo": {
"shareCoverUrl": "",
"shareSummary": "报道说,福克斯请辞与以国防军军事情报局局长哈利瓦的辞职没有关联。",
"shareTitle": "以色列媒体:以军中央司令部司令请辞",
"shareUrl": "https://people.pdnews.cn/column/30044533884-500005335271"
},
"targetId": "30044533884",
"targetRelId": "500005335271",
"targetRelObjectId": "2002",
"targetRelType": 1,
"targetStatus": 0,
"targetTitle": "以色列媒体:以军中央司令部司令请辞",
"targetType": 8,
"topicType": null,
"uuid": "0950adb8-542c-4c11-bc0c-708b1b41554d"
},
{
"avatarFrame": "",
"checkStatus": 3,
"commentContent": "【华为】您报名的“鸿蒙生态学堂·线上培训 第二期”直播于今晚19:00开始。本次主题:HarmonyOS NEXT 界面开发,点击观看https://url.cloud.huawei.com/q56YcuTFvO。回放观看https://url.cloud.huawei.com/q5Upzl3GOA。【华为】您报名的“鸿蒙生态学堂·线上培训 第二期”直播于今晚19:00开始。本次主题:HarmonyOS NEXT 界面开发,点击观看https://url.cloud.huawei.com/q56YcuTFvO。回放观看https://url.cloud.huawei.com/q5Upzl3GOA。【华为】您报名的“鸿蒙生态学堂·线上培训 第二期”直播于今晚19:00开始。本次主题:HarmonyOS NEXT 界面开发,点击观看https://url.cloud.huawei.com/q56YcuTFvO。回放观看https://url.cloud.huawei.com/q5Upzl3GOA。【华为】您报名的“鸿蒙生态学堂·线上培训 第二期”直播于今晚19:00开始。本次主题:HarmonyOS NEXT 界面开发,点击观看https://url.cloud.huawei.com/q56YcuTFvO。回放观看https://url.cloud.huawei.com/q5Upzl3GOA。",
"commentContentSensitive": "",
"commentLevel": 1,
"commentPics": "",
"commentSensitive": "",
"commentType": "2",
"createTime": "2024-04-24 10:19:22",
"fromCreatorId": "",
"fromDeviceId": "",
"fromUserHeader": "https://rmrbcmsonline.peopleapp.com/upload/default.png?x-oss-process=image/resize,l_100/auto-orient,1/quality,q_90/format,jpg",
"fromUserId": "559509019499205",
"fromUserName": "人民wH38q",
"fromUserType": 1,
"h5Url": "",
"id": 58091980,
"keyArticle": 0,
"likeNum": 0,
"pageId": null,
"parentCommentVo": null,
"parentId": -1,
"rootCommentId": 58091980,
"sensitiveExist": 0,
"sensitiveShow": 1,
"shareInfo": {
"shareCoverUrl": "",
"shareSummary": "报道说,福克斯请辞与以国防军军事情报局局长哈利瓦的辞职没有关联。",
"shareTitle": "以色列媒体:以军中央司令部司令请辞",
"shareUrl": "https://people.pdnews.cn/column/30044533884-500005335271"
},
"targetId": "30044533884",
"targetRelId": "500005335271",
"targetRelObjectId": "2002",
"targetRelType": 1,
"targetStatus": 0,
"targetTitle": "以色列媒体:以军中央司令部司令请辞",
"targetType": 8,
"topicType": null,
"uuid": "320ac584-4ad9-4c38-822d-82dcbf366063"
},
{
"avatarFrame": "",
"checkStatus": 0,
"commentContent": "说得好",
"commentContentSensitive": "",
"commentLevel": 2,
"commentPics": "",
"commentSensitive": "",
"commentType": "2",
"createTime": "2024-04-24 10:17:30",
"fromCreatorId": "",
"fromDeviceId": "",
"fromUserHeader": "https://rmrbcmsonline.peopleapp.com/upload/default.png?x-oss-process=image/resize,l_100/auto-orient,1/quality,q_90/format,jpg",
"fromUserId": "559509019499205",
"fromUserName": "人民wH38q",
"fromUserType": 1,
"h5Url": "",
"id": 58091767,
"keyArticle": 0,
"likeNum": 0,
"pageId": null,
"parentCommentVo": {
"avatarFrame": "",
"checkStatus": 2,
"commentContent": "一级战犯!",
"commentPics": "",
"commentType": "1",
"fromUserName": "一把火",
"id": 57995700
},
"parentId": 57995700,
"rootCommentId": 57995700,
"sensitiveExist": 0,
"sensitiveShow": 1,
"shareInfo": {
"shareCoverUrl": "",
"shareSummary": "报道说,福克斯请辞与以国防军军事情报局局长哈利瓦的辞职没有关联。",
"shareTitle": "以色列媒体:以军中央司令部司令请辞",
"shareUrl": "https://people.pdnews.cn/column/30044533884-500005335271"
},
"targetId": "30044533884",
"targetRelId": "500005335271",
"targetRelObjectId": "2002",
"targetRelType": 1,
"targetStatus": 0,
"targetTitle": "以色列媒体:以军中央司令部司令请辞",
"targetType": 8,
"topicType": null,
"uuid": "a8f009c7-6fa1-44c9-bc99-107d14acbac7"
},
{
"avatarFrame": "",
"checkStatus": 2,
"commentContent": "你好",
"commentContentSensitive": "",
"commentLevel": 1,
"commentPics": "",
"commentSensitive": "",
"commentType": "2",
"createTime": "2024-04-19 16:19:02",
"fromCreatorId": "",
"fromDeviceId": "",
"fromUserHeader": "https://rmrbcmsonline.peopleapp.com/upload/default.png?x-oss-process=image/resize,l_100/auto-orient,1/quality,q_90/format,jpg",
"fromUserId": "559509019499205",
"fromUserName": "人民wH38q",
"fromUserType": 1,
"h5Url": "",
"id": 57870182,
"keyArticle": 1,
"likeNum": 0,
"pageId": null,
"parentCommentVo": null,
"parentId": -1,
"rootCommentId": 57870182,
"sensitiveExist": 0,
"sensitiveShow": 1,
"shareInfo": {
"shareCoverUrl": "https://rmrbcmsonline.peopleapp.com/upload/ueditor/image/20240419/a_965759026988052480.jpeg",
"shareSummary": "中央宣传部直属单位2024年度公开招聘工作人员面试公告",
"shareTitle": "中央宣传部直属单位2024年度公开招聘工作人员面试公告",
"shareUrl": "https://people.pdnews.cn/rmharticle/30044466109"
},
"targetId": "30044466109",
"targetRelId": "500005326186",
"targetRelObjectId": "2058",
"targetRelType": 1,
"targetStatus": 0,
"targetTitle": "中央宣传部直属单位2024年度公开招聘工作人员面试公告",
"targetType": 8,
"topicType": null,
"uuid": "849612f9-3880-4e7a-a8c3-d7281706ec0e"
}
],
"pageNum": 1,
"pageSize": 20,
"totalCommentNum": 5,
"totalCount": 5
},
"message": "Success",
"meta": null,
"requestId": "",
"success": true,
"timestamp": 1713925942006
}
\ No newline at end of file
... ...