wangliang_wd

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

* 'main' of http://192.168.1.42/developOne/harmonyPool:
  fix:修复点击 tab 切换频道没有动画问题
  fix:bug[17196] 修改密码鸿蒙版描述信息文字错误,存在错别字
  fix:bug[17195] 功能缺陷-【uat】点击忘记密码,进入找回密码页,输入手机号密码,进入重置密码页,并且提示“效验成功,准备跳转设置页面”,预期android不提示
  fix:bug[17186] 功能缺陷-【uat】登录-已输入手机号,点击忘记密码按钮,跳转到找回密码页面,应带入手机号
  fix:16994 功能缺陷--进入直播,点击直播预告,点击更多按钮,进入直播预告详情页,已预约直播间,显示预约按钮,预期显示已预约按钮
  fix:bug[17128] UI-我的用户信息和编辑资料字体大小鸿蒙与按照不一致
  无用引用
  首页添加分页加载loading ui
  fix: 16984 功能缺陷-进入直播间,点击预约按钮,进入直播tab页,预约按钮没有变成已预约按钮
  fix: 预约debug
  fix: 预约debug
  fix:bug[17014] UI还原问题--我的关注下分割线粗细和间距,已关注背景鸿蒙与安卓不一致
  fix: 16929 功能缺陷-进入文化频道页,日期未展示
  fix:bug[16855] UI还原问题-账号登录注册-忘记密码-进入设置密码页,输入密码不一致,提示和android版本不一致
  fix:bug[16854] 功能缺陷-账号登录注册-忘记密码-进入设置密码页,输入简单密码无提示
  fix: 人民号单图卡和轮播图卡添加标签
  fix:17298 图集,第一页或最后一页,不应支持向左滑或向右滑
  fix: 17358 UI还原问题-【uat】精选评论卡-时间字体偏大
  fix: 17155 搜索结果页-没有评论不该展示0评
Showing 33 changed files with 717 additions and 483 deletions
@CustomDialog
export struct CustomToast {
public static LENGTH_LONG = 5000;
public static LENGTH_SHORT = 3000;
public static LENGTH_LONG = 4000;
public static LENGTH_SHORT = 2000;
@State msg: string = ""
@State duration: number = CustomToast.LENGTH_SHORT
... ... @@ -29,6 +29,7 @@ export struct CustomToast {
.fontColor($r('app.color.white'))
.fontSize("27lpx")
.lineHeight("38lpx")
.textAlign(TextAlign.Center)
}.borderRadius(`${this.bgBorderRadius}lpx`)
.constraintSize({maxWidth:"86%"})
.padding({top:"23lpx",bottom:'23lpx',left:"35lpx",right:"35lpx"})
... ...
... ... @@ -26,6 +26,9 @@ export enum EmitterEventId {
// 换绑成功
PHONE_CHANGE_SUCCESS = 9,
// 直播间-取消-预约成功
LIVE_ROOM_SUBSCRIBE = 10,
// App回到前台
APP_ENTER_FOREGROUD = 100,
// App进入后台
... ...
... ... @@ -213,7 +213,7 @@ export class HttpUrlUtils {
/**
* 预约状态
*/
static readonly LIVE_APPOINTMENT_BATCH_PATH: string = "api/live-center-message/zh/c/live/subscribe/user/batch";
static readonly LIVE_APPOINTMENT_BATCH_PATH: string = "/api/live-center-message/zh/c/live/subscribe/user/batch";
/**
* 搜索结果 显示tab 数
... ...
... ... @@ -126,7 +126,7 @@ export class WDRouterPage {
//直播更多页
static liveMorePage = new WDRouterPage("wdComponent", "ets/components/page/LiveMorePage");
//预约更多页
static reserveMorePage = new WDRouterPage("wdComponent", "ets/components/page/ReserveMorePage");
static reserveMorePage = new WDRouterPage("wdComponent", "ets/components/reserveMore/ReserveMorePage");
//金刚位聚合页
static themeListPage = new WDRouterPage("wdComponent", "ets/components/page/ThemeListPage");
// 栏目页面、频道详情
... ...
... ... @@ -168,4 +168,7 @@ export { GoldenPositionExtraBean } from './src/main/ets/bean/content/GoldenPosit
export { ClassBean } from './src/main/ets/bean/content/ClassBean';
export { CreatorsBean } from './src/main/ets/bean/content/CreatorsBean';
export { MasterDetailRes } from './src/main/ets/bean/user/MasterDetailRes';
\ No newline at end of file
export { MasterDetailRes } from './src/main/ets/bean/user/MasterDetailRes';
export { ReserveItemBean } from './src/main/ets/bean/live/ReserveItemBean';
... ...
@Observed export class ReserveItemBean {
liveId: number
relationId: string
subscribe: boolean
constructor( liveId: number, relationId: string, subscribe: boolean) {
this.liveId = liveId;
this.relationId = relationId;
this.subscribe = subscribe;
}
}
... ...
... ... @@ -7,7 +7,7 @@
"main": "Index.ets",
"version": "1.0.0",
"dependencies": {
"@ohos/lottie": "2.0.0",
"@ohos/lottie": "2.0.10",
"wdConstant": "file:../../commons/wdConstant",
"wdPlayer": "file:../../features/wdPlayer",
"wdLogin": "file:../../features/wdLogin",
... ...
... ... @@ -270,6 +270,7 @@ export struct MultiPictureDetailPageComponent {
.indicator(false)
.displayCount(1)
.loop(false)
.effectMode(EdgeEffect.None)
.id('e_swiper_content')
.alignRules({
center: { anchor: "__container__", align: VerticalAlign.Center },
... ...
... ... @@ -51,6 +51,7 @@ export struct CardSourceInfo {
.fontColor($r("app.color.color_B0B0B0"))
.flexShrink(0)
.margin({ left: 6 })
.visibility(Number(this.contentDTO?.interactData?.commentNum) === 0 ? Visibility.None : Visibility.Visible)
}
}
.width(CommonConstants.FULL_WIDTH)
... ...
... ... @@ -25,7 +25,7 @@ export struct RmhTitle {
aboutToAppear(): void {
let page = router.getState();
if (page.path.includes('/page/PeopleShipHomePage')) {
if (page.path.includes('/page/PeopleShipHomePage') || page.path.includes('/pages/MainPage')) {
this.hideTime = true;
}
}
... ...
... ... @@ -38,6 +38,8 @@ export struct Card6Component {
Stack() {
if (this.contentDTO.newTags) {
Notes({ newTags: this.contentDTO.newTags })
} else if (this.contentDTO.objectType == '5') {
Notes({ objectType: this.contentDTO.objectType })
}
Text(`${this.contentDTO.newsTitle}`)
... ... @@ -48,7 +50,8 @@ export struct Card6Component {
.alignSelf(ItemAlign.Start)
.textOverflow({ overflow: TextOverflow.Ellipsis })// 超出的部分显示省略号。
.textIndent(this.contentDTO.newTags?.length < 5 && this.contentDTO.newTags?.length > 2 ? 60 :
this.contentDTO.newTags?.length != 0 && this.contentDTO.newTags?.length < 3 ? 30 : 0)
(this.contentDTO.newTags?.length != 0 && this.contentDTO.newTags?.length) ||
this.contentDTO.objectType == '5' ? 30 : 0)
}.alignContent(Alignment.TopStart)
}.height("80%")
... ... @@ -64,7 +67,7 @@ export struct Card6Component {
Stack() {
Image(this.loadImg ? this.contentDTO.coverUrl : '')
.backgroundColor( this.loadImg ? $r('app.color.color_B0B0B0') : 0xf5f5f5)
.backgroundColor(this.loadImg ? $r('app.color.color_B0B0B0') : 0xf5f5f5)
.borderRadius(5)
.aspectRatio(this.contentDTO.appStyle === CompStyle.Card_13 ? 3 / 2 : 3 / 4)
.height(this.contentDTO.appStyle === CompStyle.Card_13 ? 90 : 180)
... ...
... ... @@ -136,13 +136,13 @@ export struct Card9Component {
.textOverflow({ overflow: TextOverflow.Ellipsis })
.alignSelf(ItemAlign.Center)
.margin({ left: 12 })
if (item.fullColumnImgUrls[0] && item.fullColumnImgUrls[0].url) {
Image(this.loadImg? item.fullColumnImgUrls[0].url : '')
.backgroundColor(0xf5f5f5)
.width(90)
.height(60)
.borderRadius($r('app.float.image_border_radius'))
}
// if (item.fullColumnImgUrls[0] && item.fullColumnImgUrls[0].url) {
// Image(this.loadImg? item.fullColumnImgUrls[0].url : '')
// .backgroundColor(0xf5f5f5)
// .width(90)
// .height(60)
// .borderRadius($r('app.float.image_border_radius'))
// }
}
}
}
... ...
import { CompDTO, ContentDTO, Params, Action } from 'wdBean';
import { CompDTO, ContentDTO, Params, Action, ReserveItemBean} from 'wdBean';
import { WDRouterPage, WDRouterRule } from 'wdRouter/Index';
import { postInteractAccentionOperateParams } from 'wdBean';
import { PageRepository } from '../../repository/PageRepository';
... ... @@ -16,11 +16,6 @@ import { SpConstants } from 'wdConstant/Index'
*/
const TAG = 'Zh_Single_Row-03'
interface reserveItem {
liveId: number,
relationId: string,
subscribe: boolean
}
interface reserveReqItem {
liveId: string,
... ... @@ -47,14 +42,15 @@ export struct ZhSingleRow03 {
async getReserveState() {
const reserveBean: reserveReqItem[] = this.compDTO.operDataList.map((item: ContentDTO) => {
const reqItem: reserveReqItem = {
liveId: item.objectId,
relationId: item.relId
liveId: item.objectId.toString(),
relationId: item.relId.toString()
}
return reqItem;
})
const res = await LiveModel.getAppointmentStatus(reserveBean);
// this.reserveStatus = res;
res.map((item: reserveItem) => {
Logger.debug(TAG, '数据信息:' + `${JSON.stringify(res)}`)
res.map((item: ReserveItemBean) => {
if (item.subscribe) {
this.reservedIds.push(item.liveId.toString())
}
... ...
... ... @@ -91,7 +91,7 @@ export struct ZhSingleRow06 {
Row() {
Text(DateTimeUtils.getCommentTime(this.compDTO.operDataList[0]?.commentInfo?.publishTime))
.fontSize(14)
.fontSize(12)
.fontColor(0x999999)
Row(){
... ...
... ... @@ -80,6 +80,7 @@ export struct FollowChildComponent{
}
.justifyContent(FlexAlign.Center)
.width('100lpx')
.backgroundColor($r("app.color.color_F5F5F5"))
.height('46lpx')
.onClick(()=>{
this.followOperation()
... ... @@ -192,6 +193,7 @@ export struct FollowChildComponent{
.fontWeight('500lpx')
.lineHeight('35lpx')
}
.backgroundColor($r("app.color.color_F5F5F5"))
.justifyContent(FlexAlign.Center)
.width('100lpx')
.height('46lpx')
... ...
... ... @@ -7,7 +7,6 @@ import { ErrorComponent } from '../view/ErrorComponent'
import RefreshLayout from './RefreshLayout'
import { RefreshLayoutBean } from './RefreshLayoutBean';
import { CompDTO, ContentDTO } from 'wdBean'
import LoadMoreLayout from './LoadMoreLayout'
import NoMoreLayout from './NoMoreLayout'
import CustomRefreshLoadLayout from './CustomRefreshLoadLayout';
import { CustomSelectUI } from '../view/CustomSelectUI';
... ...
import CustomRefreshLoadLayout from './CustomRefreshLoadLayout';
import { RefreshLayoutBean } from './RefreshLayoutBean';
import CustomLoadMoreLayout from '../refresh/CustomLoadMoreLayout';
/**
* The load more layout component.
*/
@Component
export default struct LoadMoreLayout {
@ObjectLink refreshBean: RefreshLayoutBean;
@Prop isVisible: boolean;
build() {
Column() {
if (this.refreshBean.isVisible) {
CustomRefreshLoadLayout({
refreshBean: new RefreshLayoutBean(this.refreshBean.isVisible,
this.refreshBean.imageSrc, this.refreshBean.textValue, this.refreshBean.heightValue)
})
} else {
CustomRefreshLoadLayout({
refreshBean: new RefreshLayoutBean(this.refreshBean.isVisible,
this.refreshBean.imageSrc, this.refreshBean.textValue, 0)
})
if (this.isVisible) {
CustomLoadMoreLayout()
}
}
}
... ...
... ... @@ -84,10 +84,7 @@ export struct PageComponent {
// 加载更多
ListItem() {
if (this.pageModel.hasMore) {
// LoadMoreLayout({
// refreshBean: new RefreshLayoutBean(this.pageModel.isVisiblePullUpLoad, this.pageModel.pullUpLoadImage,
// this.pageModel.pullUpLoadText, this.pageModel.pullUpLoadHeight)
// })
LoadMoreLayout({ isVisible: this.pageModel.isVisiblePullUpLoad })
} else if (!this.pageModel.contentNeedScroll) {
PageNoMoreLayout({ noMoreBean: new NoMoreBean(this.pageModel.pageInfo.baselineCopywriting) })
}
... ...
import { ContentDTO, ReserveBean } from 'wdBean';
import { ProcessUtils } from 'wdRouter';
import { CommonConstants } from 'wdConstant/Index';
import PageViewModel from '../../viewmodel/PageViewModel';
import RefreshLayout from '../page/RefreshLayout';
import { RefreshLayoutBean } from '../page/RefreshLayoutBean';
import PageModel from '../../viewmodel/PageModel';
import { LazyDataSource } from 'wdKit/Index';
import { router } from '@kit.ArkUI';
import { LiveModel } from '../../viewmodel/LiveModel';
const TAG: string = 'ReserveMorePage';
/**
* 预约更多:
* type=1 直播
* type=2 预约
* 卡片结构:上下结构
* 卡片宽度:充满父窗口
* 卡片高度,仅包含横板图片:图片高度由图片的宽度及宽高比决定,图片宽度占父窗口'100%',宽高比为16:9:
*/
@Entry
@Component
struct ReserveMorePage {
@State private pageModel: PageModel = new PageModel();
@State data: LazyDataSource<ContentDTO> = new LazyDataSource();
reserveBean: ReserveBean[] = []
topSafeHeight: number = AppStorage.get<number>('topSafeHeight') as number;
type: number = 2;
currentPage: number = 1;
pageSize: number = 20;
operDataList: ContentDTO[] = [];
title: string = '预约列表'
//是否预约过直播
@State isAppointmentLive: boolean = false
@State contentDTO: ContentDTO = new ContentDTO()
// appStyle: '15',
// coverType: 1,
// objectType: '9',
// coverUrl: 'https://rmrbcmsonline.peopleapp.com/rb_recsys/img/2024/0413/VL20Z09ISBEKXZU_963672030241091584.jpeg?x-oss-process=image/resize,m_fill,h_450,w_800/quality,q_90',
// fullColumnImgUrls: [
// {
// landscape: 2,
// size: 1,
// url: 'https://rmrbcmsonline.peopleapp.com/rb_recsys/img/2024/0413/VL20Z09ISBEKXZU_963672030241091584.jpeg?x-oss-process=image/resize,m_fill,h_450,w_800/quality,q_90',
// weight: 1170
// }
// ],
// newsTitle: '押解画面公开!被湖北民警从柬埔寨押解回国被湖北民警从柬埔寨押解回国的130名涉赌诈嫌疑人是他们被湖北民警从柬埔寨押解回国的130名涉赌诈嫌疑人是他们的130名涉赌诈嫌疑人是他们',
// publishTime: '1712993333000',
// rmhInfo: {
// authIcon: '',
// authTitle: '',
// authTitle2: '',
// banControl: 0,
// cnIsAttention: 1,
// rmhDesc: '中共武汉市委机关报长江日报官方人民号',
// rmhHeadUrl: 'https://uatjdcdnphoto.aikan.pdnews.cn/vod/content/202302/202302Sa121448724/TUw.png?x-oss-process=image/resize,l_100/auto-orient,1/quality,q_90/format,jpg',
// rmhId: '4255270',
// rmhName: '长江日报',
// userId: '513696944662469',
// userType: '3'
// },
// videoInfo: {
// firstFrameImageUri: '',
// videoDuration: 12,
// // videoLandscape: 2,
// videoUrl: 'https://rmrbcmsonline.peopleapp.com/rb_recsys/video/2024/0413/VL20Z09ISBEKXZU_963672027208609792.mp4'
// },
// photoNum: '9',
// voiceInfo: {
// voiceDuration: 12
// }
// } as ContentDTO;
async aboutToAppear(): Promise<void> {
// PageViewModel.get
PageViewModel.getLiveMoreUrl(this.type, this.currentPage, this.pageSize).then(async (liveReviewDTO) => {
// this.operDataList = []
// this.operDataList.push(...liveReviewDTO.list)
this.data.push(...liveReviewDTO.list)
this.reserveBean = this.transformToLiveDetailsBeans(liveReviewDTO.list)
const apointMentStatus = await LiveModel.getAppointmentStatus(this.reserveBean)
// console.info(`cj2024 ${apointMentStatus.code}`)
})
}
// 这个函数遍历liveReviewDTO.list并转换为LiveDetailsBean数组
transformToLiveDetailsBeans(list: ContentDTO[]): ReserveBean[] {
const liveDetailsBeans: ReserveBean[] = [];
list.forEach(item => {
liveDetailsBeans.push({
relationId: item.relId,
liveId: item.objectId,
});
});
return liveDetailsBeans
}
build() {
// Navigation() {
// //滑动区域
// this.ListLayout()
// }
// .titleMode(NavigationTitleMode.Mini)
// .title('直播列表')
Column() {
this.TabbarNormal()
Column() {
this.ListLayout()
}
.padding({
left: $r('app.float.card_comp_pagePadding_lf'),
right: $r('app.float.card_comp_pagePadding_lf'),
bottom: $r('app.float.card_comp_pagePadding_tb')
})
}
.backgroundColor('#F5F5F5')
// .onClick((event: ClickEvent) => {
// ProcessUtils.processPage(this.contentDTO)
// })
}
@Builder
ListLayout() {
List() {
// 下拉刷新
ListItem() {
RefreshLayout({
refreshBean: new RefreshLayoutBean(this.pageModel.isVisiblePullDown, this.pageModel.pullDownRefreshImage,
this.pageModel.pullDownRefreshText, this.pageModel.pullDownRefreshHeight)
})
}
LazyForEach(this.data, (contentDTO: ContentDTO, contentIndex: number) => {
ListItem() {
// Column() {
// CompParser({ compDTO: compDTO, compIndex: compIndex });
// }
this.buildItem(contentDTO)
}
},
(contentDTO: ContentDTO, contentIndex: number) => contentDTO.pageId + contentIndex.toString()
)
}
.scrollBar(BarState.Off)
.cachedCount(8)
.height(CommonConstants.FULL_PARENT)
.backgroundColor('#F5F5F5')
.onScrollIndex((start: number, end: number) => {
// Listen to the first index of the current list.
this.pageModel.startIndex = start;
// 包含了 头尾item,判断时需要考虑+2
this.pageModel.endIndex = end;
})
}
/**
* 组件项
*
* @param programmeBean item 组件项, 上面icon,下面标题
*/
@Builder
buildItem(item: ContentDTO) {
Column({ space: 8 }) {
Stack() {
Image(item.fullColumnImgUrls[0].url)
.width('100%')
.height(196)
.borderRadius(4)
this.LiveImage()
}
.alignContent(Alignment.BottomEnd)
Text(item.newsTitle)
.fontSize(17)
.maxLines(2)
.textOverflow({ overflow: TextOverflow.Ellipsis })
.margin({ top: 16, left: 12, right: 12 })
.alignSelf(ItemAlign.Start)
Row() {
Row() {
Image($r('app.media.reserve_play_icon'))
.width(20)
.height(20)
.margin({ left: 10, top: 2, bottom: 2, right: 6 })
// Text(DateTimeUtils.formatDate(item.liveInfo.liveStartTime, "MM月dd日 HH:mm"))
Text(this.getReserveDate(item.liveInfo.liveStartTime, 1))
.fontSize(12)
.fontWeight(500)
.fontColor('#ED2800')
.fontFamily('PingFang SC-Medium')
.maxLines(1)
.textOverflow({ overflow: TextOverflow.Ellipsis })
.margin({ top: 8, bottom: 8 })
.align(Alignment.Start)
Image($r('app.media.point_icon'))
.objectFit(ImageFit.Auto)
.interpolation(ImageInterpolation.High)
.width(6)
.height(16)
.margin(2)
Text(this.getReserveDate(item.liveInfo.liveStartTime, 2))
.fontSize(12)
.fontWeight(500)
.fontColor('#ED2800')
.fontFamily('PingFang SC-Medium')
.maxLines(1)
.textOverflow({ overflow: TextOverflow.Ellipsis })
.margin({ top: 8, bottom: 8, right: 10 })
.align(Alignment.Start)
}
.backgroundColor('#F5F5F5')
.margin(12)
Flex({ justifyContent: FlexAlign.Center }) {
Text(this.isAppointmentLive ? '已预约' : '预约')
.fontSize(12)
.fontWeight(400)
.fontFamily('PingFang SC-Regular')
.width(52)
.height(24)
.fontColor(Color.White)
.textAlign(TextAlign.Center)
.onClick(() => {
this.liveAppointment(item)
})
}
.width(52)
.backgroundColor('#ED2800')
.borderRadius(3)
.margin({ right: 12 })
}
.width('100%')
.justifyContent(FlexAlign.SpaceBetween)
}
.borderRadius(4)
.backgroundColor(Color.White)
.width('100%')
.margin({ top: 12, bottom: 8 })
.onClick(() => {
ProcessUtils.processPage(item)
})
}
getReserveDate(eventDateTimeString: string, type: number): string {
// 解析事件的日期和时间
const eventDateTime = new Date(eventDateTimeString);
const currentDateTime = new Date();
// 截取事件时间的小时和分钟(假设事件时间是按照24小时制)
const eventHour = eventDateTime.getHours();
const eventMinutes = eventDateTime.getMinutes();
const eventTimeStr = `${eventHour}:${eventMinutes.toString().padStart(2, '0')}开始`; // 格式化时间,确保分钟是两位数
// 计算时间差
const timeDifference = eventDateTime.getTime() - currentDateTime.getTime();
// 如果事件在24小时内
if (type === 1) {
if (timeDifference > 0 && timeDifference <= 24 * 60 * 60 * 1000) {
return `今天`;
} else {
// 如果事件不在24小时内
const month = eventDateTime.getMonth() + 1; // 月份从0开始
const date = eventDateTime.getDate();
return `${month}月${date}日`;
}
} else {
return `${eventTimeStr}`;
}
}
async liveAppointment(item: ContentDTO) {
// this.liveViewModel.liveAppointment(
// this.liveDetailsBean.reLInfo ? this.liveDetailsBean.reLInfo.relId : '',
// this.liveDetailsBean.newsId,
// !this.isAppointmentLive).then(
// (data) => {
// if (data.success) {
// this.isAppointmentLive = !this.isAppointmentLive
// }
// },
// () => {
//
// })
const liveDetail = await LiveModel.liveAppointment(item?.relId || '', item?.objectId || '', this.isAppointmentLive || false)
// const liveDetail = await LiveModel.getAppointmentStatus(item?.relId || '', item?.objectId || '', this.isAppointmentLive || false)
}
/*导航栏*/
@Builder
TabbarNormal() {
RelativeContainer() {
//标题栏目
Image($r('app.media.icon_arrow_left'))
.width(24)
.height(24)
.objectFit(ImageFit.Auto)
.id("back_icon")
.alignRules({
center: { anchor: "__container__", align: VerticalAlign.Center },
left: { anchor: "__container__", align: HorizontalAlign.Start }
})
.onClick(() => {
router.back()
})
Text(this.title)// .height('42lpx')
.maxLines(1)
.id("title")
.fontSize('35lpx')
.fontWeight(400)
.fontColor($r('app.color.color_222222'))
.lineHeight('42lpx')
.alignRules({
center: { anchor: "__container__", align: VerticalAlign.Center },
middle: { anchor: "__container__", align: HorizontalAlign.Center }
})
}
.backgroundColor('#FFFFFF')
.height(44)
.width('100%')
}
@Builder
LiveImage() {
Row() {
Image($r('app.media.reserve_icon'))
.width(22)
.height(18)
Text('预约')
.fontSize('11fp')
.fontWeight(400)
.fontColor(Color.White)
}
.backgroundColor('#4D000000')
.margin({ right: 8, bottom: 8 })
}
}
\ No newline at end of file
... ... @@ -64,8 +64,6 @@ export struct TopNavigationComponent {
@State indicatorLeftMargin: number = 0
@State indicatorWidth: number = 0
private tabsWidth: number = 0
//定时器延时处理切换至版面、播报tab时 返回上一个tab
@State tabTimmer: number = 0
// 标识,是否为点击触发的tab切换,临时变量
private changeByClick: boolean = false
... ... @@ -273,11 +271,7 @@ export struct TopNavigationComponent {
let width = Number.parseFloat(newValue.width.toString())
this.tabsWidth = Number.isNaN(width) ? 0 : width
})
.animationDuration(this.animationDuration)
.onChange((index: number) => {
if (this.tabTimmer) {
clearTimeout(this.tabTimmer)
}
this.currentTopNavName =
this._currentNavIndex === 0 ? this.myChannelList[index].name : this.topNavList[index].name
Logger.info(TAG, `onChange index : ${index}`);
... ... @@ -289,13 +283,10 @@ export struct TopNavigationComponent {
if (this.isBroadcast(this._currentNavIndex === 0 ? this.myChannelList[index] : this.topNavList[index])) {
// 跳转到播报页面
ProcessUtils.gotoBroadcastPage(this.myChannelList[index].pageId)
this.tabTimmer = setTimeout(() => {
this.tabsController.changeIndex(this.currentTopNavSelectedIndex)
}, 100)
}
if (this.isLayout(this._currentNavIndex === 0 ? this.myChannelList[index] : this.topNavList[index])) {
ProcessUtils.gotoENewsPaper()
this.tabTimmer = setTimeout(() => {
if (!this.changeByClick) {
// 识别左滑右滑,跳过版面,到下一个
let nextIndex = this.currentTopNavSelectedIndex > index ? index - 1 : index + 1
... ... @@ -305,42 +296,41 @@ export struct TopNavigationComponent {
// 重置标识
this.changeByClick = false
}
}, 100)
}
})
.onAnimationStart((index: number, targetIndex: number, event: TabsAnimationEvent) => {
if (!this.isBroadcast(this._currentNavIndex === 0 ? this.myChannelList[index] : this.topNavList[index]) &&
!this.isLayout(this._currentNavIndex === 0 ? this.myChannelList[index] : this.topNavList[index])
) {
return
}
this.currentTopNavSelectedIndex = targetIndex
// 切换动画开始时触发该回调。下划线跟着页面一起滑动,同时宽度渐变。
let targetIndexInfo = this.getTextInfo(targetIndex)
this.startAnimateTo(this.animationDuration, targetIndexInfo.left, targetIndexInfo.width)
})
.onAnimationEnd((index: number, event: TabsAnimationEvent) => {
if (!this.isBroadcast(this._currentNavIndex === 0 ? this.myChannelList[index] : this.topNavList[index]) &&
!this.isLayout(this._currentNavIndex === 0 ? this.myChannelList[index] : this.topNavList[index])
) {
return
}
// 切换动画结束时触发该回调。下划线动画停止。
let currentIndicatorInfo = this.getCurrentIndicatorInfo(index, event)
this.startAnimateTo(0, currentIndicatorInfo.left, currentIndicatorInfo.width)
})
.onGestureSwipe((index: number, event: TabsAnimationEvent) => {
if (!this.isBroadcast(this._currentNavIndex === 0 ? this.myChannelList[index] : this.topNavList[index]) &&
!this.isLayout(this._currentNavIndex === 0 ? this.myChannelList[index] : this.topNavList[index])
) {
return
}
// 在页面跟手滑动过程中,逐帧触发该回调。
let currentIndicatorInfo = this.getCurrentIndicatorInfo(index, event)
this.currentTopNavSelectedIndex = currentIndicatorInfo.index
this.indicatorLeftMargin = currentIndicatorInfo.left
this.indicatorWidth = currentIndicatorInfo.width
})
// .onAnimationStart((index: number, targetIndex: number, event: TabsAnimationEvent) => {
// if (!this.isBroadcast(this._currentNavIndex === 0 ? this.myChannelList[index] : this.topNavList[index]) &&
// !this.isLayout(this._currentNavIndex === 0 ? this.myChannelList[index] : this.topNavList[index])
// ) {
// return
// }
// this.currentTopNavSelectedIndex = targetIndex
// // 切换动画开始时触发该回调。下划线跟着页面一起滑动,同时宽度渐变。
// let targetIndexInfo = this.getTextInfo(targetIndex)
// this.startAnimateTo(this.animationDuration, targetIndexInfo.left, targetIndexInfo.width)
// })
// .onAnimationEnd((index: number, event: TabsAnimationEvent) => {
// if (!this.isBroadcast(this._currentNavIndex === 0 ? this.myChannelList[index] : this.topNavList[index]) &&
// !this.isLayout(this._currentNavIndex === 0 ? this.myChannelList[index] : this.topNavList[index])
// ) {
// return
// }
// // 切换动画结束时触发该回调。下划线动画停止。
// let currentIndicatorInfo = this.getCurrentIndicatorInfo(index, event)
// this.startAnimateTo(0, currentIndicatorInfo.left, currentIndicatorInfo.width)
// })
// .onGestureSwipe((index: number, event: TabsAnimationEvent) => {
// if (!this.isBroadcast(this._currentNavIndex === 0 ? this.myChannelList[index] : this.topNavList[index]) &&
// !this.isLayout(this._currentNavIndex === 0 ? this.myChannelList[index] : this.topNavList[index])
// ) {
// return
// }
// // 在页面跟手滑动过程中,逐帧触发该回调。
// let currentIndicatorInfo = this.getCurrentIndicatorInfo(index, event)
// this.currentTopNavSelectedIndex = currentIndicatorInfo.index
// this.indicatorLeftMargin = currentIndicatorInfo.left
// this.indicatorWidth = currentIndicatorInfo.width
// })
// 分类列表最右侧频道设置
if (this._currentNavIndex === 0) {
... ...
import lottie, { AnimationItem } from '@ohos/lottie';
import { Logger } from 'wdKit/Index';
import { RefreshConstants } from '../../utils/RefreshConstants';
/**
* Custom layout to show refresh or load.
* Android 24+12+24(top+image+bottom) 高度db
*/
@Component
export default struct CustomLoadMoreLayout {
private mainRenderingSettings: RenderingContextSettings = new RenderingContextSettings(true)
private mainCanvasRenderingContext: CanvasRenderingContext2D =
new CanvasRenderingContext2D(this.mainRenderingSettings)
private animateName: string = "loadMore";
private animateItem: AnimationItem | null = null;
build() {
Row() {
Canvas(this.mainCanvasRenderingContext)
.width(14)
.height(14)
.backgroundColor(Color.Transparent)
.onReady(() => {
// 可在此生命回调周期中加载动画,可以保证动画尺寸正确
//抗锯齿的设置
this.mainCanvasRenderingContext.imageSmoothingEnabled = true;
this.mainCanvasRenderingContext.imageSmoothingQuality = 'medium'
this.animate()
})
.onDisAppear(() => {
Logger.error('zzzz','CustomLoadMoreLayout onDisAppear')
lottie.destroy(this.animateName);
})
Text('努力加载中')
.margin({
left: RefreshConstants.RefreshLayout_TEXT_MARGIN_LEFT,
bottom: RefreshConstants.RefreshLayout_TEXT_MARGIN_BOTTOM
})
.fontSize(14)
.fontColor('#888888')
.textAlign(TextAlign.Center)
}
.clip(true)
.width(RefreshConstants.FULL_WIDTH)
.justifyContent(FlexAlign.Center)
.height(60)
}
animate() {
if (this.animateItem == null) {
this.animateItem = lottie.loadAnimation({
container: this.mainCanvasRenderingContext,
renderer: 'canvas', // canvas 渲染模式
loop: 50,
autoplay: true,
name: this.animateName,
path: "lottie/loading_more.json", // 路径加载动画只支持entry/src/main/ets 文件夹下的相对路径
})
}
}
}
\ No newline at end of file
... ...
import { ContentDTO, ReserveBean, ReserveItemBean } from 'wdBean/Index';
import { ProcessUtils } from 'wdRouter/Index';
import PageViewModel from '../../viewmodel/PageViewModel';
import { Logger, EmitterEventId, EmitterUtils, ToastUtils } from 'wdKit/Index';
import { router } from '@kit.ArkUI';
import { LiveModel } from '../../viewmodel/LiveModel';
import { ViewType } from 'wdConstant/src/main/ets/enum/ViewType';
import { EmptyComponent } from '../view/EmptyComponent';
import { ErrorComponent } from '../view/ErrorComponent';
import { CustomPullToRefresh } from '../reusable/CustomPullToRefresh';
import { PeopleShipNoMoreData } from '../reusable/PeopleShipNoMoreData';
import { HttpUtils } from 'wdNetwork/Index';
import { WDRouterPage, WDRouterRule } from 'wdRouter'
import { LazyDataSource } from 'wdKit/Index';
const TAG: string = 'ReserveMorePage';
/**
* 预约更多:
* type=1 直播
* type=2 预约
* 卡片结构:上下结构
* 卡片宽度:充满父窗口
* 卡片高度,仅包含横板图片:图片高度由图片的宽度及宽高比决定,图片宽度占父窗口'100%',宽高比为16:9:
*/
@Entry
@Component
struct ReserveMorePage {
@State data: LazyDataSource<ContentDTO> = new LazyDataSource();
@State reserveList: ReserveItemBean[] = []
topSafeHeight: number = AppStorage.get<number>('topSafeHeight') as number;
type: number = 2;
pageSize: number = 20;
title: string = '预约列表'
//是否预约过直播
@State isAppointmentLive: boolean = false
@State contentDTO: ContentDTO = {} as ContentDTO;
@State private hasMore: boolean = true
@State private currentPage: number = 1
@State private isLoading: boolean = false
@State viewType: ViewType = ViewType.LOADING
private scroller: Scroller = new Scroller()
@State reservedIds: string[] = []
@State isShow: boolean = false
@State private liveId: string = ''
@State isLoadingAttention: boolean = false
build() {
Column(){
this.TabbarNormal()
if (this.viewType == ViewType.LOADING) {
this.LoadingLayout()
} else if (this.viewType == ViewType.ERROR) {
ErrorComponent()
.onTouch(() => {
if (this.viewType === ViewType.ERROR) {
this.getData()
}
})
} else if (this.viewType == ViewType.EMPTY) {
EmptyComponent()
} else {
CustomPullToRefresh({
alldata: this.data,
scroller: this.scroller,
hasMore: false,
customList: () => {
this.ListLayout()
},
onRefresh: (resolve) => {
this.currentPage = 1
this.getData(resolve)
},
})
}
}.backgroundColor($r('app.color.color_F5F5F5'))
}
@Builder
LoadingLayout() {
}
@Builder
ListLayout() {
List({scroller: this.scroller}) {
// 下拉刷新
LazyForEach(this.data, (contentDTO: ContentDTO, index: number) => {
ListItem() {
this.buildItem(contentDTO, index)
}
},
(contentDTO: ContentDTO, contentIndex: number) => contentDTO.pageId + contentIndex.toString()
)
// 加载更多
ListItem() {
if (!this.hasMore && !this.isLoading) {
PeopleShipNoMoreData()
}
}
}
.cachedCount(8)
.edgeEffect(EdgeEffect.None)
.scrollBar(BarState.Off)
.backgroundColor('#F5F5F5')
.layoutWeight(1)
.onReachEnd(() => {
Logger.debug(TAG, "触底了");
if(!this.isLoading && this.hasMore){
//加载分页数据
this.currentPage++;
this.getData()
}
})
}
/**
* 组件项
*
* @param programmeBean item 组件项, 上面icon,下面标题
*/
@Builder
buildItem(item: ContentDTO, index: number) {
Column() {
Stack() {
Image(item.fullColumnImgUrls[0].url)
.width('100%')
.height(196)
.borderRadius(4)
this.LiveImage()
}
.alignContent(Alignment.BottomEnd)
Text(item.newsTitle)
.fontSize(17)
.maxLines(2)
.textOverflow({ overflow: TextOverflow.Ellipsis })
.margin({ top: 16, left: 12, right: 12 })
.alignSelf(ItemAlign.Start)
Row() {
Row() {
Image($r('app.media.reserve_play_icon'))
.width(20)
.height(20)
.margin({ left: 10, top: 2, bottom: 2, right: 6 })
// Text(DateTimeUtils.formatDate(item.liveInfo.liveStartTime, "MM月dd日 HH:mm"))
Text(this.getReserveDate(item.liveInfo.liveStartTime, 1))
.fontSize(12)
.fontWeight(500)
.fontColor('#ED2800')
.fontFamily('PingFang SC-Medium')
.maxLines(1)
.textOverflow({ overflow: TextOverflow.Ellipsis })
.margin({ top: 8, bottom: 8 })
.align(Alignment.Start)
Image($r('app.media.point_icon'))
.objectFit(ImageFit.Auto)
.interpolation(ImageInterpolation.High)
.width(6)
.height(16)
.margin(2)
Text(this.getReserveDate(item.liveInfo.liveStartTime, 2))
.fontSize(12)
.fontWeight(500)
.fontColor('#ED2800')
.fontFamily('PingFang SC-Medium')
.maxLines(1)
.textOverflow({ overflow: TextOverflow.Ellipsis })
.margin({ top: 8, bottom: 8, right: 10 })
.align(Alignment.Start)
}
.backgroundColor('#F5F5F5')
.margin(12)
// Flex({ justifyContent: FlexAlign.Center }) {
// Text(this.isAppointmentLive ? '已预约' : '预约')
// .fontSize(12)
// .fontWeight(400)
// .fontFamily('PingFang SC-Regular')
// .width(52)
// .height(24)
// .fontColor(Color.White)
// .textAlign(TextAlign.Center)
// .onClick(() => {
// this.liveAppointment(item)
// })
// }
// .width(52)
// .backgroundColor('#ED2800')
// .borderRadius(3)
// ReserveMoreAttentionComponent({reserveItem: this.getAttentionItem(item), })
// .margin({ right: 12 })
Row() {
LoadingProgress()
.width(20)
.height(20)
.color(!this.isReserved(item) ? $r('app.color.color_fff') : $r('app.color.color_CCCCCC'))
.visibility((this.isLoadingAttention && this.liveId == item.objectId) ? Visibility.Visible : Visibility.None)
Text(!this.isReserved(item) ? '关注' : '已关注')
.fontSize($r('app.float.vp_12'))
.fontWeight(500)
.fontColor(!this.isReserved(item) ? $r('app.color.color_fff') : $r('app.color.color_CCCCCC'))
.width('100%')
.height('100%')
.textAlign(TextAlign.Center)
.visibility((this.isLoadingAttention && this.liveId == item.objectId) ? Visibility.None : Visibility.Visible)
.margin({
right: '10vp'
})
.backgroundColor(!this.isReserved(item) ? $r('app.color.color_ED2800') : $r('app.color.color_F5F5F5'))
.borderRadius(3)
}.onClick(() => {
this.bookAndCancel(item)
})
.justifyContent(FlexAlign.Center)
.alignItems(VerticalAlign.Center)
.borderRadius(3)
.width('52vp')
.height('24vp')
.margin({right: 12})
}
.width('100%')
.justifyContent(FlexAlign.SpaceBetween)
}
.borderRadius(4)
.backgroundColor(Color.White)
.width('calc(100% - 24vp)')
.margin({
left: '12vp',
right: '12vp',
top: index == 0 ? '12vp' : '8vp'
})
.onClick(() => {
ProcessUtils.processPage(item)
})
}
/*导航栏*/
@Builder
TabbarNormal() {
RelativeContainer() {
//标题栏目
Image($r('app.media.icon_arrow_left'))
.width(24)
.height(24)
.objectFit(ImageFit.Auto)
.id("back_icon")
.alignRules({
center: { anchor: "__container__", align: VerticalAlign.Center },
left: { anchor: "__container__", align: HorizontalAlign.Start }
})
.onClick(() => {
router.back()
})
Text(this.title)// .height('42lpx')
.maxLines(1)
.id("title")
.fontSize('35lpx')
.fontWeight(400)
.fontColor($r('app.color.color_222222'))
.lineHeight('42lpx')
.alignRules({
center: { anchor: "__container__", align: VerticalAlign.Center },
middle: { anchor: "__container__", align: HorizontalAlign.Center }
})
}
.backgroundColor('#FFFFFF')
.height(44)
.width('100%')
}
@Builder
LiveImage() {
Row() {
Image($r('app.media.reserve_icon'))
.width(22)
.height(18)
Text('预约')
.fontSize('11fp')
.fontWeight(400)
.fontColor(Color.White)
}
.backgroundColor('#4D000000')
.margin({ right: 8, bottom: 8 })
}
async aboutToAppear(): Promise<void> {
// PageViewModel.get
this.currentPage = 1
this.getData()
// 登录成功
EmitterUtils.receiveEvent(EmitterEventId.LOGIN_SUCCESS, () => {
this.currentPage = 1
this.getData()
})
// 获取预约
EmitterUtils.receiveEvent(EmitterEventId.LIVE_ROOM_SUBSCRIBE, (str?: string) => {
Logger.debug(TAG, 'receiveEvent LIVE_ROOM_SUBSCRIBE: ' + str)
if (str) {
// 跳转指定频道场景,传参底导id、频道id
const model: ReserveItemBean = JSON.parse(str)
Logger.debug(TAG,'是否关注元数据0:' +` ${model.liveId}`)
if (model && model.liveId && this.reserveList) {
// 修改源数据
this.reserveList.forEach((element) => {
if (element.liveId == model.liveId) {
if (element && element.subscribe != model.subscribe) {
Logger.debug(TAG,'是否关注元数据2:' +` ${JSON.stringify(element.subscribe)}`)
element.subscribe = !element.subscribe
Logger.debug(TAG,'是否关注元数据3:' +` ${JSON.stringify(element.subscribe)}`)
this.data.reloadData()
this.isShow = true
}
}
})
}
}
})
}
onPageShow(): void {
if (this.isShow) {
this.data.reloadData()
this.isShow = false
}
}
private async getData(resolve?: (value: string | PromiseLike<string>) => void) {
if (this.isLoading) {
if (resolve) {
resolve('已更新至最新')
}
return
}
this.isLoading = true
try {
const liveReviewDTO = await PageViewModel.getLiveMoreUrl(this.type, this.currentPage, this.pageSize)
if (liveReviewDTO && liveReviewDTO.list && liveReviewDTO.list.length > 0) {
if (liveReviewDTO.list.length === this.pageSize) {
this.hasMore = true;
} else {
this.hasMore = false;
}
if (this.currentPage == 1) {
this.data.clear()
this.reserveList = []
}
this.data.push(...liveReviewDTO.list)
//批量查询关注状态
this.getAppointmentInfo(liveReviewDTO.list)
} else {
this.hasMore = false;
}
this.resolveEnd(true, resolve)
if (liveReviewDTO.list.length == 0 && this.currentPage == 1) {
this.viewType = ViewType.EMPTY
}
}catch (exception) {
this.resolveEnd(false, resolve)
}
// PageViewModel.getLiveMoreUrl(this.type, this.currentPage, this.pageSize).then(async (liveReviewDTO) => {
// // this.operDataList = []
// // this.operDataList.push(...liveReviewDTO.list)
// this.data.push(...liveReviewDTO.list)
//
// // this.getAppointmentInfo()
// })
}
private resolveEnd(isTop: boolean, resolve?: (value: string | PromiseLike<string>) => void) {
if (resolve) {
if (this.currentPage == 1 && isTop) {
resolve('已更新至最新')
}else {
resolve('')
}
}
if (this.currentPage == 1 && !isTop) {
this.viewType = ViewType.ERROR
} else {
this.viewType = ViewType.LOADED
}
this.isLoading = false
}
async getAppointmentInfo(list: ContentDTO[]) {
if (HttpUtils.getUserId()) {
const reserveBean = this.transformToLiveDetailsBeans(list)
Logger.debug(TAG,'是否预约数据:' +` ${JSON.stringify(reserveBean)}`)
LiveModel.getAppointmentStatus(reserveBean).then((result) => {
Logger.debug(TAG,'是否预约数据:' +` ${JSON.stringify(result)}`)
if (result && result.length > 0) {
this.reserveList.push(...result)
this.data.reloadData()
}
}).catch(() =>{
// this.data.push(...list)
})
}else {
// this.data.push(...list)
}
}
// 判断是否预约
isReserved(item: ContentDTO) {
const objc = this.getAttentionItem(item)
if (objc) {
return objc.subscribe
}
return false
}
getAttentionItem(item: ContentDTO) {
const objc = this.reserveList.find((element: ReserveItemBean) => {
return element.liveId.toString() == item.objectId
})
return objc
}
// 这个函数遍历liveReviewDTO.list并转换为LiveDetailsBean数组
transformToLiveDetailsBeans(list: ContentDTO[]): ReserveBean[] {
const liveDetailsBeans: ReserveBean[] = [];
list.forEach(item => {
liveDetailsBeans.push({
relationId: item.relId,
liveId: item.objectId,
});
});
return liveDetailsBeans
}
// 预约/取消预约
async bookAndCancel(item: ContentDTO) {
// 未登录,跳转登录
if (!HttpUtils.getUserId()) {
WDRouterRule.jumpWithPage(WDRouterPage.loginPage)
return
}
if (!this.isLoadingAttention && this.liveId.length == 0) {
this.isLoadingAttention = true
this.liveId = item.objectId
const reserveItem = this.getAttentionItem(item)
if (reserveItem) {
this.isLoadingAttention = true
this.liveId = reserveItem.liveId.toString()
try {
const res = await LiveModel.liveAppointment(reserveItem.relationId, reserveItem.liveId.toString(), !reserveItem.subscribe);
if (res.code == 0) {
ToastUtils.shortToast(!reserveItem.subscribe ? '预约成功' : '取消预约成功')
// 修改源数据
this.reserveList.forEach((element) => {
if (element.liveId.toString() == item.objectId) {
Logger.debug(TAG,'是否关注元数据:' +` ${JSON.stringify(element.subscribe)}`)
element.subscribe = !element.subscribe
Logger.debug(TAG,'是否关注元数据1:' +` ${JSON.stringify(element.subscribe)}`)
this.data.reloadData()
}
})
}
this.isLoadingAttention = false
this.liveId = ''
} catch (e) {
this.liveId = ''
this.isLoadingAttention = false
}
}else {
this.liveId = ''
this.isLoadingAttention = false
}
}
}
getReserveDate(eventDateTimeString: string, type: number): string {
// 解析事件的日期和时间
const eventDateTime = new Date(eventDateTimeString);
const currentDateTime = new Date();
// 截取事件时间的小时和分钟(假设事件时间是按照24小时制)
const eventHour = eventDateTime.getHours();
const eventMinutes = eventDateTime.getMinutes();
const eventTimeStr = `${eventHour}:${eventMinutes.toString().padStart(2, '0')}开始`; // 格式化时间,确保分钟是两位数
// 计算时间差
const timeDifference = eventDateTime.getTime() - currentDateTime.getTime();
// 如果事件在24小时内
if (type === 1) {
if (timeDifference > 0 && timeDifference <= 24 * 60 * 60 * 1000) {
return `今天`;
} else {
// 如果事件不在24小时内
const month = eventDateTime.getMonth() + 1; // 月份从0开始
const date = eventDateTime.getDate();
return `${month}月${date}日`;
}
} else {
return `${eventTimeStr}`;
}
}
async liveAppointment(item: ContentDTO) {
const liveDetail = await LiveModel.liveAppointment(item?.relId || '', item?.objectId || '', this.isAppointmentLive || false)
}
}
\ No newline at end of file
... ...
import { PullToRefresh, PullToRefreshConfigurator } from '@ohos/pulltorefresh';
import { LazyDataSource } from 'wdKit';
@Component
export struct CustomPullToRefresh {
@Link alldata: Object[];
@Link alldata: Object[] | LazyDataSource<Object>;
scroller: Scroller = new Scroller();
@BuilderParam customList: () => void;
onRefresh: (resolve?: (value: string | PromiseLike<string>) => void) => void = () => {
... ... @@ -15,7 +16,7 @@ export struct CustomPullToRefresh {
build() {
Column(){
PullToRefresh({
data:this.alldata,
data:$alldata,
scroller:this.scroller,
refreshConfigurator:this.refreshConfigurator,
customList:()=>{
... ...
... ... @@ -268,8 +268,8 @@ struct MineHomePage {
.height('42lpx')
.maxLines(1)
.id("rightText")
.fontSize('35lpx')
.fontWeight('400lpx')
.fontSize('31lpx')
.fontWeight(400)
.fontColor($r('app.color.white') )
.lineHeight('42lpx')
.alignRules({
... ... @@ -324,10 +324,10 @@ struct MineHomePage {
.height('42lpx')
.maxLines(1)
.id("title")
.fontSize('35lpx')
.fontWeight('400lpx')
.fontSize('27lpx')
.fontWeight(400)
.fontColor($r('app.color.color_222222'))
.lineHeight('42lpx')
.lineHeight('31lpx')
.alignRules({
center: { anchor: "__container__", align: VerticalAlign.Center },
left: { anchor: "head_icon", align: HorizontalAlign.End }
... ... @@ -338,8 +338,8 @@ struct MineHomePage {
.height('42lpx')
.maxLines(1)
.id("rightText")
.fontSize('35lpx')
.fontWeight('400lpx')
.fontSize('31lpx')
.fontWeight(400)
.fontColor($r('app.color.color_222222'))
.lineHeight('42lpx')
.alignRules({
... ...
import { HttpUrlUtils, ResponseDTO } from 'wdNetwork';
import { HttpRequest } from 'wdNetwork/src/main/ets/http/HttpRequest';
import { Logger, ToastUtils } from 'wdKit';
import { LiveDetailsBean, ReserveBean } from 'wdBean/Index';
import { Logger, ToastUtils, EmitterEventId, EmitterUtils } from 'wdKit';
import { LiveDetailsBean, ReserveBean, ReserveItemBean } from 'wdBean/Index';
const TAG = 'LiveModel'
interface ReserveRes {
code: string | number,
data: ReserveItem[]
}
interface ReserveItem {
liveId: number,
relationId: string,
subscribe: boolean
}
export class LiveModel {
/**
... ... @@ -70,10 +62,15 @@ export class LiveModel {
ToastUtils.shortToast(data.message)
return
}
if (data.code == 0) {
const reserveModel = new ReserveItemBean(Number(liveId), relationId, isSubscribe)
EmitterUtils.sendEvent(EmitterEventId.LIVE_ROOM_SUBSCRIBE, JSON.stringify(reserveModel))
}
success(data)
Logger.info('liveAppointment', JSON.stringify(data))
}, (error: Error) => {
fail(error.message)
Logger.debug(TAG + ":error ", error.toString())
Logger.debug(TAG + ":error ", JSON.stringify(error))
})
})
}
... ... @@ -88,11 +85,12 @@ export class LiveModel {
static getAppointmentStatus(reserveBean: ReserveBean[]) {
// let params: Record<string, ArrayList<ReserveBean>> = {};
// params = reserveBean
return new Promise<Array<ReserveItem>>((success, fail) => {
HttpRequest.post<ResponseDTO<Array<ReserveItem>>>(
return new Promise<Array<ReserveItemBean>>((success, fail) => {
HttpRequest.post<ResponseDTO<Array<ReserveItemBean>>>(
HttpUrlUtils.getAppointmentStatusUrl(),
reserveBean,
).then((data: ResponseDTO<Array<ReserveItem>>) => {
).then((data: ResponseDTO<Array<ReserveItemBean>>) => {
Logger.debug(TAG, 'getAppointmentStatus:' + `${JSON.stringify(data)}`)
if (!data || !data.data) {
fail("数据为空")
return
... ... @@ -103,9 +101,10 @@ export class LiveModel {
return
}
success(data.data)
Logger.info('getAppointmentStatus', JSON.stringify(data.data))
}, (error: Error) => {
fail(error.message)
Logger.debug(TAG + ":error ", error.toString())
Logger.debug(TAG + ":error ", JSON.stringify(error))
})
})
}
... ...
... ... @@ -19,7 +19,7 @@
"components/page/PeopleShipHomePage",
"pages/MultiPictureListPage",
"components/page/LiveMorePage",
"components/page/ReserveMorePage",
"components/reserveMore/ReserveMorePage",
"pages/VideoPlayPage",
"components/page/ThemeListPage",
"pages/ShowUserHeaderPage",
... ...
import { HttpUrlUtils, ResponseDTO } from 'wdNetwork';
import { HttpRequest } from 'wdNetwork/src/main/ets/http/HttpRequest';
import { Logger, ToastUtils } from 'wdKit';
import { ContentDetailDTO, LiveDetailsBean, LiveRoomBean, LiveRoomDataBean } from 'wdBean/Index';
import { Logger, ToastUtils, EmitterEventId, EmitterUtils } from 'wdKit';
import { ContentDetailDTO, LiveDetailsBean, LiveRoomBean, LiveRoomDataBean, ReserveItemBean } from 'wdBean/Index';
import { ContentDetailRequest } from 'wdDetailPlayApi/Index';
const TAG = 'LiveModel'
... ... @@ -199,6 +199,10 @@ export class LiveModel {
ToastUtils.shortToast(data.message)
return
}
if (data.code == 0) {
const reserveModel = new ReserveItemBean(Number(liveId), relationId, isSubscribe)
EmitterUtils.sendEvent(EmitterEventId.LIVE_ROOM_SUBSCRIBE, JSON.stringify(reserveModel))
}
success(data)
}, (error: Error) => {
fail(error.message)
... ...
... ... @@ -5,7 +5,6 @@ import CustomRefreshLoadLayout from 'wdComponent/src/main/ets/components/page/Cu
import { RefreshLayoutBean } from 'wdComponent/src/main/ets/components/page/RefreshLayoutBean'
import PageModel from 'wdComponent/src/main/ets/viewmodel/PageModel'
import { ViewType } from 'wdConstant/Index'
import LoadMoreLayout from 'wdComponent/src/main/ets/components/page/LoadMoreLayout'
import RefreshLayout from 'wdComponent/src/main/ets/components/page/RefreshLayout'
import { StringUtils } from 'wdKit/Index'
import { LiveViewModel } from '../../viewModel/LiveViewModel'
... ...
... ... @@ -5,7 +5,7 @@ import router from '@ohos.router'
import { WDRouterRule, WDRouterPage } from 'wdRouter';
import { SettingPasswordParams } from './SettingPasswordLayout'
import { Router } from '@ohos.arkui.UIContext'
import { CustomToast, EmitterEventId, EmitterUtils, NetworkUtil, SPHelper, ToastUtils } from 'wdKit/Index'
import { CustomToast, EmitterEventId, EmitterUtils, NetworkUtil, SPHelper, StringUtils, ToastUtils } from 'wdKit/Index'
import { SpConstants } from 'wdConstant/Index'
import { emitter } from '@kit.BasicServicesKit'
... ... @@ -23,6 +23,7 @@ struct ForgetPasswordPage {
loginViewModel: LoginViewModel = new LoginViewModel()
@State @Watch('onCodeSend') isCodeSend: boolean = false //验证码点击发送事件
pageType:number = (router.getParams() as Record<string, number>)['pageType']; //0、登录->忘记密码 1、设置->重置密码 2、设置->更换手机号页面1 3、设置->更换手机号页面2
phone:string = (router.getParams() as Record<string, number>)['phone'] + ""; //登录 密码登录 填写手机号 点击忘记密码 带过来手机号
@State pageTitle:string = '找回密码';
@State codeStateSuccess:boolean=false
onCodeSend() {
... ... @@ -30,6 +31,7 @@ struct ForgetPasswordPage {
this.sendVerifyCode()
}
}
@State toastText:string = ""
dialogToast: CustomDialogController = new CustomDialogController({
builder: CustomToast({
... ... @@ -37,8 +39,6 @@ struct ForgetPasswordPage {
}),
autoCancel: false,
alignment: DialogAlignment.Center,
offset: { dx: 0, dy: -20 },
gridCount: 1,
customStyle: true,
maskColor:"#00000000"
})
... ... @@ -93,6 +93,9 @@ struct ForgetPasswordPage {
}
if (this.pageType == 0){
this.pageTitle = '找回密码'
if(StringUtils.isNotEmpty(this.phone) && this.phone.indexOf("****") === -1){
this.phoneContent = this.phone
}
}else if (this.pageType == 1){
this.pageTitle = '验证当前手机号'
}else if (this.pageType == 2){
... ... @@ -211,7 +214,6 @@ struct ForgetPasswordPage {
}
WDRouterRule.jumpWithReplacePage(WDRouterPage.settingPasswordPage, params)
this.showToastTip("校验成功,准备跳转设置页面")
Logger.debug(TAG,"校验成功")
}).catch((error:string)=>{
this.showToastTip(error)
... ...
... ... @@ -53,8 +53,6 @@ struct LoginPage {
}),
autoCancel: false,
alignment: DialogAlignment.Center,
offset: { dx: 0, dy: -20 },
gridCount: 1,
customStyle: true,
maskColor:"#00000000"
})
... ... @@ -167,8 +165,13 @@ struct LoginPage {
Text('忘记密码').fontColor('#666666').fontSize(14).margin({ top: 16 })
.onClick(() => {
// router.pushUrl({ url: 'pages/login/ForgetPasswordPage' })
let pageType = { 'pageType': 0 } as Record<string, number>;
WDRouterRule.jumpWithPage(WDRouterPage.forgetPasswordPage, pageType)
if(StringUtils.isNotEmpty(this.accountContent) && StringUtils.photoMatch(this.accountContent)){
let pageType = { 'pageType': 0, 'phone': Number(this.accountContent) } as Record<string, number>;
WDRouterRule.jumpWithPage(WDRouterPage.forgetPasswordPage, pageType)
}else{
let pageType = { 'pageType': 0 } as Record<string, number>;
WDRouterRule.jumpWithPage(WDRouterPage.forgetPasswordPage, pageType)
}
})
}
... ...
... ... @@ -24,8 +24,6 @@ struct ModifyPasswordPage {
}),
autoCancel: false,
alignment: DialogAlignment.Center,
offset: { dx: 0, dy: -20 },
gridCount: 1,
customStyle: true,
maskColor:"#00000000"
})
... ... @@ -123,7 +121,7 @@ struct ModifyPasswordPage {
.alignItems(VerticalAlign.Center)
Column() {
Text("提示:密码长度6~20,需大写字母、小写字母、数字、特殊符合中组合三种及三种以上").fontSize(12).maxLines(3).fontColor(0x999999).padding({top:'10lpx'})
Text("提示:密码长度6~20位,使用大写字母、小写字母、数字、特殊字符中三种或三种以上").fontSize(12).maxLines(3).fontColor(0x999999).padding({top:'10lpx'})
}
.width('100%')
.height('85lpx')
... ...
... ... @@ -64,8 +64,6 @@ export struct SettingPasswordLayout {
}),
autoCancel: false,
alignment: DialogAlignment.Center,
offset: { dx: 0, dy: -20 },
gridCount: 1,
customStyle: true,
maskColor:"#00000000"
})
... ... @@ -95,7 +93,7 @@ export struct SettingPasswordLayout {
this.listData.push(new AccoutPageDataModel(0, '设置密码', '', '', '', '', 0))
this.listData.push(new AccoutPageDataModel(1, '', '', '', '', '请输入密码', 10086))
this.listData.push(new AccoutPageDataModel(1, '', '', '', '', '再次输入密码', 10087))
this.listData.push(new AccoutPageDataModel(3, '', '', '提示:密码长度6~20,需大写字母、小写字母、数字、特殊符合中组合三种及三种以上', '', '', 0))
this.listData.push(new AccoutPageDataModel(3, '', '', '提示:密码长度6~20位,使用大写字母、小写字母、数字、特殊字符中三种或三种以上', '', '', 0))
this.listData.push(new AccoutPageDataModel(4, '', '', '', '确认', '', 0))
break;
... ... @@ -105,7 +103,7 @@ export struct SettingPasswordLayout {
this.listData.push(new AccoutPageDataModel(1, '', '', '', '', '请输入原密码', 10010))
this.listData.push(new AccoutPageDataModel(1, '', '', '', '', '请输入新密码', 10086))
this.listData.push(new AccoutPageDataModel(1, '', '', '', '', '请再请输入原密码', 10087))
this.listData.push(new AccoutPageDataModel(3, '', '', '提示:密码长度6~20,需大写字母、小写字母、数字、特殊符合中组合三种及三种以上', '', '', 0))
this.listData.push(new AccoutPageDataModel(3, '', '', '提示:密码长度6~20位,使用大写字母、小写字母、数字、特殊字符中三种或三种以上', '', '', 0))
this.listData.push(new AccoutPageDataModel(4, '', '', '', '确认', '', 0))
this.listData.push(new AccoutPageDataModel(3, '', '', '忘记密码', '', '', 0))
break;
... ... @@ -126,7 +124,7 @@ export struct SettingPasswordLayout {
this.listData.push(new AccoutPageDataModel(1, '', '', '', '', '请输入新密码', 10086))
this.listData.push(new AccoutPageDataModel(1, '', '', '', '', '请再请输入原密码', 10087))
this.listData.push(new AccoutPageDataModel(2, '', '', '', '', '验证码', 10088))
this.listData.push(new AccoutPageDataModel(3, '', '', '提示:密码长度6~20,需大写字母、小写字母、数字、特殊符合中组合三种及三种以上', '', '', 0))
this.listData.push(new AccoutPageDataModel(3, '', '', '提示:密码长度6~20位,使用大写字母、小写字母、数字、特殊字符中三种或三种以上', '', '', 0))
this.listData.push(new AccoutPageDataModel(4, '', '', '', '确认', '', 0))
this.listData.push(new AccoutPageDataModel(3, '', '', '忘记密码', '', '', 0))
break;
... ... @@ -327,7 +325,7 @@ export struct SettingPasswordLayout {
return
}
if (this.password01 != this.password02) {
this.showToastTip('密码不一致')
this.showToastTip('两次输入的密码不一致,请重新输入')
return
}
if(this.pageId == 1){ //设置密码
... ...
{"v":"5.6.10","fr":60,"ip":0,"op":60,"w":128,"h":128,"nm":"上拉刷新-灰色","ddd":0,"assets":[{"id":"image_0","w":128,"h":128,"u":"","p":"data:image/png;base64,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","e":1}],"layers":[{"ddd":0,"ind":1,"ty":2,"nm":"loding.png","cl":"png","refId":"image_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":60,"s":[360]}],"ix":10},"p":{"a":0,"k":[64,64,0],"ix":2},"a":{"a":0,"k":[64,64,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":60,"st":0,"bm":0}],"markers":[{"tm":1,"cm":"{\n\t\"storePath\":\t\"/Users/changkang/Downloads/中文版动效/动效到处最终版本的/上拉刷新-列表灰色\"\n}","dr":0}]}
\ No newline at end of file
... ...