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 714 additions and 480 deletions
1 @CustomDialog 1 @CustomDialog
2 export struct CustomToast { 2 export struct CustomToast {
3 - public static LENGTH_LONG = 5000;  
4 - public static LENGTH_SHORT = 3000; 3 + public static LENGTH_LONG = 4000;
  4 + public static LENGTH_SHORT = 2000;
5 5
6 @State msg: string = "" 6 @State msg: string = ""
7 @State duration: number = CustomToast.LENGTH_SHORT 7 @State duration: number = CustomToast.LENGTH_SHORT
@@ -29,6 +29,7 @@ export struct CustomToast { @@ -29,6 +29,7 @@ export struct CustomToast {
29 .fontColor($r('app.color.white')) 29 .fontColor($r('app.color.white'))
30 .fontSize("27lpx") 30 .fontSize("27lpx")
31 .lineHeight("38lpx") 31 .lineHeight("38lpx")
  32 + .textAlign(TextAlign.Center)
32 }.borderRadius(`${this.bgBorderRadius}lpx`) 33 }.borderRadius(`${this.bgBorderRadius}lpx`)
33 .constraintSize({maxWidth:"86%"}) 34 .constraintSize({maxWidth:"86%"})
34 .padding({top:"23lpx",bottom:'23lpx',left:"35lpx",right:"35lpx"}) 35 .padding({top:"23lpx",bottom:'23lpx',left:"35lpx",right:"35lpx"})
@@ -26,6 +26,9 @@ export enum EmitterEventId { @@ -26,6 +26,9 @@ export enum EmitterEventId {
26 // 换绑成功 26 // 换绑成功
27 PHONE_CHANGE_SUCCESS = 9, 27 PHONE_CHANGE_SUCCESS = 9,
28 28
  29 + // 直播间-取消-预约成功
  30 + LIVE_ROOM_SUBSCRIBE = 10,
  31 +
29 // App回到前台 32 // App回到前台
30 APP_ENTER_FOREGROUD = 100, 33 APP_ENTER_FOREGROUD = 100,
31 // App进入后台 34 // App进入后台
@@ -213,7 +213,7 @@ export class HttpUrlUtils { @@ -213,7 +213,7 @@ export class HttpUrlUtils {
213 /** 213 /**
214 * 预约状态 214 * 预约状态
215 */ 215 */
216 - static readonly LIVE_APPOINTMENT_BATCH_PATH: string = "api/live-center-message/zh/c/live/subscribe/user/batch"; 216 + static readonly LIVE_APPOINTMENT_BATCH_PATH: string = "/api/live-center-message/zh/c/live/subscribe/user/batch";
217 /** 217 /**
218 218
219 * 搜索结果 显示tab 数 219 * 搜索结果 显示tab 数
@@ -126,7 +126,7 @@ export class WDRouterPage { @@ -126,7 +126,7 @@ export class WDRouterPage {
126 //直播更多页 126 //直播更多页
127 static liveMorePage = new WDRouterPage("wdComponent", "ets/components/page/LiveMorePage"); 127 static liveMorePage = new WDRouterPage("wdComponent", "ets/components/page/LiveMorePage");
128 //预约更多页 128 //预约更多页
129 - static reserveMorePage = new WDRouterPage("wdComponent", "ets/components/page/ReserveMorePage"); 129 + static reserveMorePage = new WDRouterPage("wdComponent", "ets/components/reserveMore/ReserveMorePage");
130 //金刚位聚合页 130 //金刚位聚合页
131 static themeListPage = new WDRouterPage("wdComponent", "ets/components/page/ThemeListPage"); 131 static themeListPage = new WDRouterPage("wdComponent", "ets/components/page/ThemeListPage");
132 // 栏目页面、频道详情 132 // 栏目页面、频道详情
@@ -169,3 +169,6 @@ export { ClassBean } from './src/main/ets/bean/content/ClassBean'; @@ -169,3 +169,6 @@ export { ClassBean } from './src/main/ets/bean/content/ClassBean';
169 export { CreatorsBean } from './src/main/ets/bean/content/CreatorsBean'; 169 export { CreatorsBean } from './src/main/ets/bean/content/CreatorsBean';
170 170
171 export { MasterDetailRes } from './src/main/ets/bean/user/MasterDetailRes'; 171 export { MasterDetailRes } from './src/main/ets/bean/user/MasterDetailRes';
  172 +
  173 +export { ReserveItemBean } from './src/main/ets/bean/live/ReserveItemBean';
  174 +
  1 +
  2 +@Observed export class ReserveItemBean {
  3 + liveId: number
  4 + relationId: string
  5 + subscribe: boolean
  6 + constructor( liveId: number, relationId: string, subscribe: boolean) {
  7 + this.liveId = liveId;
  8 + this.relationId = relationId;
  9 + this.subscribe = subscribe;
  10 + }
  11 +}
@@ -7,7 +7,7 @@ @@ -7,7 +7,7 @@
7 "main": "Index.ets", 7 "main": "Index.ets",
8 "version": "1.0.0", 8 "version": "1.0.0",
9 "dependencies": { 9 "dependencies": {
10 - "@ohos/lottie": "2.0.0", 10 + "@ohos/lottie": "2.0.10",
11 "wdConstant": "file:../../commons/wdConstant", 11 "wdConstant": "file:../../commons/wdConstant",
12 "wdPlayer": "file:../../features/wdPlayer", 12 "wdPlayer": "file:../../features/wdPlayer",
13 "wdLogin": "file:../../features/wdLogin", 13 "wdLogin": "file:../../features/wdLogin",
@@ -270,6 +270,7 @@ export struct MultiPictureDetailPageComponent { @@ -270,6 +270,7 @@ export struct MultiPictureDetailPageComponent {
270 .indicator(false) 270 .indicator(false)
271 .displayCount(1) 271 .displayCount(1)
272 .loop(false) 272 .loop(false)
  273 + .effectMode(EdgeEffect.None)
273 .id('e_swiper_content') 274 .id('e_swiper_content')
274 .alignRules({ 275 .alignRules({
275 center: { anchor: "__container__", align: VerticalAlign.Center }, 276 center: { anchor: "__container__", align: VerticalAlign.Center },
@@ -51,6 +51,7 @@ export struct CardSourceInfo { @@ -51,6 +51,7 @@ export struct CardSourceInfo {
51 .fontColor($r("app.color.color_B0B0B0")) 51 .fontColor($r("app.color.color_B0B0B0"))
52 .flexShrink(0) 52 .flexShrink(0)
53 .margin({ left: 6 }) 53 .margin({ left: 6 })
  54 + .visibility(Number(this.contentDTO?.interactData?.commentNum) === 0 ? Visibility.None : Visibility.Visible)
54 } 55 }
55 } 56 }
56 .width(CommonConstants.FULL_WIDTH) 57 .width(CommonConstants.FULL_WIDTH)
@@ -25,7 +25,7 @@ export struct RmhTitle { @@ -25,7 +25,7 @@ export struct RmhTitle {
25 25
26 aboutToAppear(): void { 26 aboutToAppear(): void {
27 let page = router.getState(); 27 let page = router.getState();
28 - if (page.path.includes('/page/PeopleShipHomePage')) { 28 + if (page.path.includes('/page/PeopleShipHomePage') || page.path.includes('/pages/MainPage')) {
29 this.hideTime = true; 29 this.hideTime = true;
30 } 30 }
31 } 31 }
@@ -38,6 +38,8 @@ export struct Card6Component { @@ -38,6 +38,8 @@ export struct Card6Component {
38 Stack() { 38 Stack() {
39 if (this.contentDTO.newTags) { 39 if (this.contentDTO.newTags) {
40 Notes({ newTags: this.contentDTO.newTags }) 40 Notes({ newTags: this.contentDTO.newTags })
  41 + } else if (this.contentDTO.objectType == '5') {
  42 + Notes({ objectType: this.contentDTO.objectType })
41 } 43 }
42 44
43 Text(`${this.contentDTO.newsTitle}`) 45 Text(`${this.contentDTO.newsTitle}`)
@@ -48,7 +50,8 @@ export struct Card6Component { @@ -48,7 +50,8 @@ export struct Card6Component {
48 .alignSelf(ItemAlign.Start) 50 .alignSelf(ItemAlign.Start)
49 .textOverflow({ overflow: TextOverflow.Ellipsis })// 超出的部分显示省略号。 51 .textOverflow({ overflow: TextOverflow.Ellipsis })// 超出的部分显示省略号。
50 .textIndent(this.contentDTO.newTags?.length < 5 && this.contentDTO.newTags?.length > 2 ? 60 : 52 .textIndent(this.contentDTO.newTags?.length < 5 && this.contentDTO.newTags?.length > 2 ? 60 :
51 - this.contentDTO.newTags?.length != 0 && this.contentDTO.newTags?.length < 3 ? 30 : 0) 53 + (this.contentDTO.newTags?.length != 0 && this.contentDTO.newTags?.length) ||
  54 + this.contentDTO.objectType == '5' ? 30 : 0)
52 }.alignContent(Alignment.TopStart) 55 }.alignContent(Alignment.TopStart)
53 56
54 }.height("80%") 57 }.height("80%")
@@ -64,7 +67,7 @@ export struct Card6Component { @@ -64,7 +67,7 @@ export struct Card6Component {
64 67
65 Stack() { 68 Stack() {
66 Image(this.loadImg ? this.contentDTO.coverUrl : '') 69 Image(this.loadImg ? this.contentDTO.coverUrl : '')
67 - .backgroundColor( this.loadImg ? $r('app.color.color_B0B0B0') : 0xf5f5f5) 70 + .backgroundColor(this.loadImg ? $r('app.color.color_B0B0B0') : 0xf5f5f5)
68 .borderRadius(5) 71 .borderRadius(5)
69 .aspectRatio(this.contentDTO.appStyle === CompStyle.Card_13 ? 3 / 2 : 3 / 4) 72 .aspectRatio(this.contentDTO.appStyle === CompStyle.Card_13 ? 3 / 2 : 3 / 4)
70 .height(this.contentDTO.appStyle === CompStyle.Card_13 ? 90 : 180) 73 .height(this.contentDTO.appStyle === CompStyle.Card_13 ? 90 : 180)
@@ -136,13 +136,13 @@ export struct Card9Component { @@ -136,13 +136,13 @@ export struct Card9Component {
136 .textOverflow({ overflow: TextOverflow.Ellipsis }) 136 .textOverflow({ overflow: TextOverflow.Ellipsis })
137 .alignSelf(ItemAlign.Center) 137 .alignSelf(ItemAlign.Center)
138 .margin({ left: 12 }) 138 .margin({ left: 12 })
139 - if (item.fullColumnImgUrls[0] && item.fullColumnImgUrls[0].url) {  
140 - Image(this.loadImg? item.fullColumnImgUrls[0].url : '')  
141 - .backgroundColor(0xf5f5f5)  
142 - .width(90)  
143 - .height(60)  
144 - .borderRadius($r('app.float.image_border_radius'))  
145 - } 139 + // if (item.fullColumnImgUrls[0] && item.fullColumnImgUrls[0].url) {
  140 + // Image(this.loadImg? item.fullColumnImgUrls[0].url : '')
  141 + // .backgroundColor(0xf5f5f5)
  142 + // .width(90)
  143 + // .height(60)
  144 + // .borderRadius($r('app.float.image_border_radius'))
  145 + // }
146 } 146 }
147 } 147 }
148 } 148 }
1 -import { CompDTO, ContentDTO, Params, Action } from 'wdBean'; 1 +import { CompDTO, ContentDTO, Params, Action, ReserveItemBean} from 'wdBean';
2 import { WDRouterPage, WDRouterRule } from 'wdRouter/Index'; 2 import { WDRouterPage, WDRouterRule } from 'wdRouter/Index';
3 import { postInteractAccentionOperateParams } from 'wdBean'; 3 import { postInteractAccentionOperateParams } from 'wdBean';
4 import { PageRepository } from '../../repository/PageRepository'; 4 import { PageRepository } from '../../repository/PageRepository';
@@ -16,11 +16,6 @@ import { SpConstants } from 'wdConstant/Index' @@ -16,11 +16,6 @@ import { SpConstants } from 'wdConstant/Index'
16 */ 16 */
17 const TAG = 'Zh_Single_Row-03' 17 const TAG = 'Zh_Single_Row-03'
18 18
19 -interface reserveItem {  
20 - liveId: number,  
21 - relationId: string,  
22 - subscribe: boolean  
23 -}  
24 19
25 interface reserveReqItem { 20 interface reserveReqItem {
26 liveId: string, 21 liveId: string,
@@ -47,14 +42,15 @@ export struct ZhSingleRow03 { @@ -47,14 +42,15 @@ export struct ZhSingleRow03 {
47 async getReserveState() { 42 async getReserveState() {
48 const reserveBean: reserveReqItem[] = this.compDTO.operDataList.map((item: ContentDTO) => { 43 const reserveBean: reserveReqItem[] = this.compDTO.operDataList.map((item: ContentDTO) => {
49 const reqItem: reserveReqItem = { 44 const reqItem: reserveReqItem = {
50 - liveId: item.objectId,  
51 - relationId: item.relId 45 + liveId: item.objectId.toString(),
  46 + relationId: item.relId.toString()
52 } 47 }
53 return reqItem; 48 return reqItem;
54 }) 49 })
55 const res = await LiveModel.getAppointmentStatus(reserveBean); 50 const res = await LiveModel.getAppointmentStatus(reserveBean);
56 // this.reserveStatus = res; 51 // this.reserveStatus = res;
57 - res.map((item: reserveItem) => { 52 + Logger.debug(TAG, '数据信息:' + `${JSON.stringify(res)}`)
  53 + res.map((item: ReserveItemBean) => {
58 if (item.subscribe) { 54 if (item.subscribe) {
59 this.reservedIds.push(item.liveId.toString()) 55 this.reservedIds.push(item.liveId.toString())
60 } 56 }
@@ -91,7 +91,7 @@ export struct ZhSingleRow06 { @@ -91,7 +91,7 @@ export struct ZhSingleRow06 {
91 91
92 Row() { 92 Row() {
93 Text(DateTimeUtils.getCommentTime(this.compDTO.operDataList[0]?.commentInfo?.publishTime)) 93 Text(DateTimeUtils.getCommentTime(this.compDTO.operDataList[0]?.commentInfo?.publishTime))
94 - .fontSize(14) 94 + .fontSize(12)
95 .fontColor(0x999999) 95 .fontColor(0x999999)
96 96
97 Row(){ 97 Row(){
@@ -80,6 +80,7 @@ export struct FollowChildComponent{ @@ -80,6 +80,7 @@ export struct FollowChildComponent{
80 } 80 }
81 .justifyContent(FlexAlign.Center) 81 .justifyContent(FlexAlign.Center)
82 .width('100lpx') 82 .width('100lpx')
  83 + .backgroundColor($r("app.color.color_F5F5F5"))
83 .height('46lpx') 84 .height('46lpx')
84 .onClick(()=>{ 85 .onClick(()=>{
85 this.followOperation() 86 this.followOperation()
@@ -192,6 +193,7 @@ export struct FollowChildComponent{ @@ -192,6 +193,7 @@ export struct FollowChildComponent{
192 .fontWeight('500lpx') 193 .fontWeight('500lpx')
193 .lineHeight('35lpx') 194 .lineHeight('35lpx')
194 } 195 }
  196 + .backgroundColor($r("app.color.color_F5F5F5"))
195 .justifyContent(FlexAlign.Center) 197 .justifyContent(FlexAlign.Center)
196 .width('100lpx') 198 .width('100lpx')
197 .height('46lpx') 199 .height('46lpx')
@@ -7,7 +7,6 @@ import { ErrorComponent } from '../view/ErrorComponent' @@ -7,7 +7,6 @@ import { ErrorComponent } from '../view/ErrorComponent'
7 import RefreshLayout from './RefreshLayout' 7 import RefreshLayout from './RefreshLayout'
8 import { RefreshLayoutBean } from './RefreshLayoutBean'; 8 import { RefreshLayoutBean } from './RefreshLayoutBean';
9 import { CompDTO, ContentDTO } from 'wdBean' 9 import { CompDTO, ContentDTO } from 'wdBean'
10 -import LoadMoreLayout from './LoadMoreLayout'  
11 import NoMoreLayout from './NoMoreLayout' 10 import NoMoreLayout from './NoMoreLayout'
12 import CustomRefreshLoadLayout from './CustomRefreshLoadLayout'; 11 import CustomRefreshLoadLayout from './CustomRefreshLoadLayout';
13 import { CustomSelectUI } from '../view/CustomSelectUI'; 12 import { CustomSelectUI } from '../view/CustomSelectUI';
1 -import CustomRefreshLoadLayout from './CustomRefreshLoadLayout';  
2 -import { RefreshLayoutBean } from './RefreshLayoutBean'; 1 +import CustomLoadMoreLayout from '../refresh/CustomLoadMoreLayout';
3 2
4 /** 3 /**
5 * The load more layout component. 4 * The load more layout component.
6 */ 5 */
7 @Component 6 @Component
8 export default struct LoadMoreLayout { 7 export default struct LoadMoreLayout {
9 - @ObjectLink refreshBean: RefreshLayoutBean; 8 + @Prop isVisible: boolean;
10 9
11 build() { 10 build() {
12 Column() { 11 Column() {
13 - if (this.refreshBean.isVisible) {  
14 - CustomRefreshLoadLayout({  
15 - refreshBean: new RefreshLayoutBean(this.refreshBean.isVisible,  
16 - this.refreshBean.imageSrc, this.refreshBean.textValue, this.refreshBean.heightValue)  
17 - })  
18 - } else {  
19 - CustomRefreshLoadLayout({  
20 - refreshBean: new RefreshLayoutBean(this.refreshBean.isVisible,  
21 - this.refreshBean.imageSrc, this.refreshBean.textValue, 0)  
22 - }) 12 + if (this.isVisible) {
  13 + CustomLoadMoreLayout()
23 } 14 }
24 } 15 }
25 } 16 }
@@ -84,10 +84,7 @@ export struct PageComponent { @@ -84,10 +84,7 @@ export struct PageComponent {
84 // 加载更多 84 // 加载更多
85 ListItem() { 85 ListItem() {
86 if (this.pageModel.hasMore) { 86 if (this.pageModel.hasMore) {
87 - // LoadMoreLayout({  
88 - // refreshBean: new RefreshLayoutBean(this.pageModel.isVisiblePullUpLoad, this.pageModel.pullUpLoadImage,  
89 - // this.pageModel.pullUpLoadText, this.pageModel.pullUpLoadHeight)  
90 - // }) 87 + LoadMoreLayout({ isVisible: this.pageModel.isVisiblePullUpLoad })
91 } else if (!this.pageModel.contentNeedScroll) { 88 } else if (!this.pageModel.contentNeedScroll) {
92 PageNoMoreLayout({ noMoreBean: new NoMoreBean(this.pageModel.pageInfo.baselineCopywriting) }) 89 PageNoMoreLayout({ noMoreBean: new NoMoreBean(this.pageModel.pageInfo.baselineCopywriting) })
93 } 90 }
1 -import { ContentDTO, ReserveBean } from 'wdBean';  
2 -import { ProcessUtils } from 'wdRouter';  
3 -import { CommonConstants } from 'wdConstant/Index';  
4 -import PageViewModel from '../../viewmodel/PageViewModel';  
5 -import RefreshLayout from '../page/RefreshLayout';  
6 -import { RefreshLayoutBean } from '../page/RefreshLayoutBean';  
7 -import PageModel from '../../viewmodel/PageModel';  
8 -import { LazyDataSource } from 'wdKit/Index';  
9 -import { router } from '@kit.ArkUI';  
10 -import { LiveModel } from '../../viewmodel/LiveModel';  
11 -  
12 -const TAG: string = 'ReserveMorePage';  
13 -  
14 -/**  
15 - * 预约更多:  
16 - * type=1 直播  
17 - * type=2 预约  
18 - * 卡片结构:上下结构  
19 - * 卡片宽度:充满父窗口  
20 - * 卡片高度,仅包含横板图片:图片高度由图片的宽度及宽高比决定,图片宽度占父窗口'100%',宽高比为16:9:  
21 - */  
22 -@Entry  
23 -@Component  
24 -struct ReserveMorePage {  
25 - @State private pageModel: PageModel = new PageModel();  
26 - @State data: LazyDataSource<ContentDTO> = new LazyDataSource();  
27 - reserveBean: ReserveBean[] = []  
28 - topSafeHeight: number = AppStorage.get<number>('topSafeHeight') as number;  
29 - type: number = 2;  
30 - currentPage: number = 1;  
31 - pageSize: number = 20;  
32 - operDataList: ContentDTO[] = [];  
33 - title: string = '预约列表'  
34 - //是否预约过直播  
35 - @State isAppointmentLive: boolean = false  
36 - @State contentDTO: ContentDTO = new ContentDTO()  
37 - // appStyle: '15',  
38 - // coverType: 1,  
39 - // objectType: '9',  
40 - // 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',  
41 - // fullColumnImgUrls: [  
42 - // {  
43 - // landscape: 2,  
44 - // size: 1,  
45 - // 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',  
46 - // weight: 1170  
47 - // }  
48 - // ],  
49 - // newsTitle: '押解画面公开!被湖北民警从柬埔寨押解回国被湖北民警从柬埔寨押解回国的130名涉赌诈嫌疑人是他们被湖北民警从柬埔寨押解回国的130名涉赌诈嫌疑人是他们的130名涉赌诈嫌疑人是他们',  
50 - // publishTime: '1712993333000',  
51 - // rmhInfo: {  
52 - // authIcon: '',  
53 - // authTitle: '',  
54 - // authTitle2: '',  
55 - // banControl: 0,  
56 - // cnIsAttention: 1,  
57 - // rmhDesc: '中共武汉市委机关报长江日报官方人民号',  
58 - // 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',  
59 - // rmhId: '4255270',  
60 - // rmhName: '长江日报',  
61 - // userId: '513696944662469',  
62 - // userType: '3'  
63 - // },  
64 - // videoInfo: {  
65 - // firstFrameImageUri: '',  
66 - // videoDuration: 12,  
67 - // // videoLandscape: 2,  
68 - // videoUrl: 'https://rmrbcmsonline.peopleapp.com/rb_recsys/video/2024/0413/VL20Z09ISBEKXZU_963672027208609792.mp4'  
69 - // },  
70 - // photoNum: '9',  
71 - // voiceInfo: {  
72 - // voiceDuration: 12  
73 - // }  
74 - // } as ContentDTO;  
75 -  
76 - async aboutToAppear(): Promise<void> {  
77 - // PageViewModel.get  
78 -  
79 - PageViewModel.getLiveMoreUrl(this.type, this.currentPage, this.pageSize).then(async (liveReviewDTO) => {  
80 - // this.operDataList = []  
81 - // this.operDataList.push(...liveReviewDTO.list)  
82 - this.data.push(...liveReviewDTO.list)  
83 - this.reserveBean = this.transformToLiveDetailsBeans(liveReviewDTO.list)  
84 -  
85 - const apointMentStatus = await LiveModel.getAppointmentStatus(this.reserveBean)  
86 - // console.info(`cj2024 ${apointMentStatus.code}`)  
87 - })  
88 -  
89 -  
90 - }  
91 -  
92 - // 这个函数遍历liveReviewDTO.list并转换为LiveDetailsBean数组  
93 - transformToLiveDetailsBeans(list: ContentDTO[]): ReserveBean[] {  
94 - const liveDetailsBeans: ReserveBean[] = [];  
95 - list.forEach(item => {  
96 - liveDetailsBeans.push({  
97 - relationId: item.relId,  
98 - liveId: item.objectId,  
99 - });  
100 - });  
101 - return liveDetailsBeans  
102 - }  
103 -  
104 - build() {  
105 - // Navigation() {  
106 - // //滑动区域  
107 - // this.ListLayout()  
108 - // }  
109 - // .titleMode(NavigationTitleMode.Mini)  
110 - // .title('直播列表')  
111 -  
112 - Column() {  
113 - this.TabbarNormal()  
114 - Column() {  
115 - this.ListLayout()  
116 - }  
117 - .padding({  
118 - left: $r('app.float.card_comp_pagePadding_lf'),  
119 - right: $r('app.float.card_comp_pagePadding_lf'),  
120 - bottom: $r('app.float.card_comp_pagePadding_tb')  
121 - })  
122 - }  
123 - .backgroundColor('#F5F5F5')  
124 -  
125 - // .onClick((event: ClickEvent) => {  
126 - // ProcessUtils.processPage(this.contentDTO)  
127 - // })  
128 - }  
129 -  
130 - @Builder  
131 - ListLayout() {  
132 - List() {  
133 - // 下拉刷新  
134 - ListItem() {  
135 - RefreshLayout({  
136 - refreshBean: new RefreshLayoutBean(this.pageModel.isVisiblePullDown, this.pageModel.pullDownRefreshImage,  
137 - this.pageModel.pullDownRefreshText, this.pageModel.pullDownRefreshHeight)  
138 - })  
139 - }  
140 -  
141 - LazyForEach(this.data, (contentDTO: ContentDTO, contentIndex: number) => {  
142 - ListItem() {  
143 - // Column() {  
144 - // CompParser({ compDTO: compDTO, compIndex: compIndex });  
145 - // }  
146 - this.buildItem(contentDTO)  
147 - }  
148 - },  
149 - (contentDTO: ContentDTO, contentIndex: number) => contentDTO.pageId + contentIndex.toString()  
150 - )  
151 - }  
152 - .scrollBar(BarState.Off)  
153 - .cachedCount(8)  
154 - .height(CommonConstants.FULL_PARENT)  
155 - .backgroundColor('#F5F5F5')  
156 - .onScrollIndex((start: number, end: number) => {  
157 - // Listen to the first index of the current list.  
158 - this.pageModel.startIndex = start;  
159 - // 包含了 头尾item,判断时需要考虑+2  
160 - this.pageModel.endIndex = end;  
161 - })  
162 - }  
163 -  
164 - /**  
165 - * 组件项  
166 - *  
167 - * @param programmeBean item 组件项, 上面icon,下面标题  
168 - */  
169 - @Builder  
170 - buildItem(item: ContentDTO) {  
171 - Column({ space: 8 }) {  
172 - Stack() {  
173 - Image(item.fullColumnImgUrls[0].url)  
174 - .width('100%')  
175 - .height(196)  
176 - .borderRadius(4)  
177 - this.LiveImage()  
178 -  
179 - }  
180 - .alignContent(Alignment.BottomEnd)  
181 -  
182 - Text(item.newsTitle)  
183 - .fontSize(17)  
184 - .maxLines(2)  
185 - .textOverflow({ overflow: TextOverflow.Ellipsis })  
186 - .margin({ top: 16, left: 12, right: 12 })  
187 - .alignSelf(ItemAlign.Start)  
188 - Row() {  
189 - Row() {  
190 - Image($r('app.media.reserve_play_icon'))  
191 - .width(20)  
192 - .height(20)  
193 - .margin({ left: 10, top: 2, bottom: 2, right: 6 })  
194 - // Text(DateTimeUtils.formatDate(item.liveInfo.liveStartTime, "MM月dd日 HH:mm"))  
195 - Text(this.getReserveDate(item.liveInfo.liveStartTime, 1))  
196 - .fontSize(12)  
197 - .fontWeight(500)  
198 - .fontColor('#ED2800')  
199 - .fontFamily('PingFang SC-Medium')  
200 - .maxLines(1)  
201 - .textOverflow({ overflow: TextOverflow.Ellipsis })  
202 - .margin({ top: 8, bottom: 8 })  
203 - .align(Alignment.Start)  
204 -  
205 - Image($r('app.media.point_icon'))  
206 - .objectFit(ImageFit.Auto)  
207 - .interpolation(ImageInterpolation.High)  
208 - .width(6)  
209 - .height(16)  
210 - .margin(2)  
211 -  
212 - Text(this.getReserveDate(item.liveInfo.liveStartTime, 2))  
213 - .fontSize(12)  
214 - .fontWeight(500)  
215 - .fontColor('#ED2800')  
216 - .fontFamily('PingFang SC-Medium')  
217 - .maxLines(1)  
218 - .textOverflow({ overflow: TextOverflow.Ellipsis })  
219 - .margin({ top: 8, bottom: 8, right: 10 })  
220 - .align(Alignment.Start)  
221 - }  
222 - .backgroundColor('#F5F5F5')  
223 - .margin(12)  
224 -  
225 - Flex({ justifyContent: FlexAlign.Center }) {  
226 - Text(this.isAppointmentLive ? '已预约' : '预约')  
227 - .fontSize(12)  
228 - .fontWeight(400)  
229 - .fontFamily('PingFang SC-Regular')  
230 - .width(52)  
231 - .height(24)  
232 - .fontColor(Color.White)  
233 - .textAlign(TextAlign.Center)  
234 - .onClick(() => {  
235 - this.liveAppointment(item)  
236 - })  
237 - }  
238 - .width(52)  
239 - .backgroundColor('#ED2800')  
240 - .borderRadius(3)  
241 - .margin({ right: 12 })  
242 - }  
243 - .width('100%')  
244 - .justifyContent(FlexAlign.SpaceBetween)  
245 -  
246 - }  
247 - .borderRadius(4)  
248 - .backgroundColor(Color.White)  
249 - .width('100%')  
250 - .margin({ top: 12, bottom: 8 })  
251 - .onClick(() => {  
252 - ProcessUtils.processPage(item)  
253 - })  
254 - }  
255 -  
256 - getReserveDate(eventDateTimeString: string, type: number): string {  
257 - // 解析事件的日期和时间  
258 - const eventDateTime = new Date(eventDateTimeString);  
259 - const currentDateTime = new Date();  
260 -  
261 - // 截取事件时间的小时和分钟(假设事件时间是按照24小时制)  
262 - const eventHour = eventDateTime.getHours();  
263 - const eventMinutes = eventDateTime.getMinutes();  
264 - const eventTimeStr = `${eventHour}:${eventMinutes.toString().padStart(2, '0')}开始`; // 格式化时间,确保分钟是两位数  
265 -  
266 - // 计算时间差  
267 - const timeDifference = eventDateTime.getTime() - currentDateTime.getTime();  
268 -  
269 - // 如果事件在24小时内  
270 - if (type === 1) {  
271 - if (timeDifference > 0 && timeDifference <= 24 * 60 * 60 * 1000) {  
272 - return `今天`;  
273 - } else {  
274 - // 如果事件不在24小时内  
275 - const month = eventDateTime.getMonth() + 1; // 月份从0开始  
276 - const date = eventDateTime.getDate();  
277 - return `${month}月${date}日`;  
278 - }  
279 - } else {  
280 - return `${eventTimeStr}`;  
281 - }  
282 - }  
283 -  
284 - async liveAppointment(item: ContentDTO) {  
285 - // this.liveViewModel.liveAppointment(  
286 - // this.liveDetailsBean.reLInfo ? this.liveDetailsBean.reLInfo.relId : '',  
287 - // this.liveDetailsBean.newsId,  
288 - // !this.isAppointmentLive).then(  
289 - // (data) => {  
290 - // if (data.success) {  
291 - // this.isAppointmentLive = !this.isAppointmentLive  
292 - // }  
293 - // },  
294 - // () => {  
295 - //  
296 - // })  
297 - const liveDetail = await LiveModel.liveAppointment(item?.relId || '', item?.objectId || '', this.isAppointmentLive || false)  
298 - // const liveDetail = await LiveModel.getAppointmentStatus(item?.relId || '', item?.objectId || '', this.isAppointmentLive || false)  
299 - }  
300 -  
301 - /*导航栏*/  
302 - @Builder  
303 - TabbarNormal() {  
304 - RelativeContainer() {  
305 - //标题栏目  
306 - Image($r('app.media.icon_arrow_left'))  
307 - .width(24)  
308 - .height(24)  
309 - .objectFit(ImageFit.Auto)  
310 - .id("back_icon")  
311 - .alignRules({  
312 - center: { anchor: "__container__", align: VerticalAlign.Center },  
313 - left: { anchor: "__container__", align: HorizontalAlign.Start }  
314 - })  
315 - .onClick(() => {  
316 - router.back()  
317 - })  
318 -  
319 - Text(this.title)// .height('42lpx')  
320 - .maxLines(1)  
321 - .id("title")  
322 - .fontSize('35lpx')  
323 - .fontWeight(400)  
324 - .fontColor($r('app.color.color_222222'))  
325 - .lineHeight('42lpx')  
326 - .alignRules({  
327 - center: { anchor: "__container__", align: VerticalAlign.Center },  
328 - middle: { anchor: "__container__", align: HorizontalAlign.Center }  
329 - })  
330 - }  
331 - .backgroundColor('#FFFFFF')  
332 - .height(44)  
333 - .width('100%')  
334 - }  
335 -  
336 - @Builder  
337 - LiveImage() {  
338 - Row() {  
339 - Image($r('app.media.reserve_icon'))  
340 - .width(22)  
341 - .height(18)  
342 - Text('预约')  
343 - .fontSize('11fp')  
344 - .fontWeight(400)  
345 - .fontColor(Color.White)  
346 - }  
347 - .backgroundColor('#4D000000')  
348 - .margin({ right: 8, bottom: 8 })  
349 - }  
350 -}  
@@ -64,8 +64,6 @@ export struct TopNavigationComponent { @@ -64,8 +64,6 @@ export struct TopNavigationComponent {
64 @State indicatorLeftMargin: number = 0 64 @State indicatorLeftMargin: number = 0
65 @State indicatorWidth: number = 0 65 @State indicatorWidth: number = 0
66 private tabsWidth: number = 0 66 private tabsWidth: number = 0
67 - //定时器延时处理切换至版面、播报tab时 返回上一个tab  
68 - @State tabTimmer: number = 0  
69 // 标识,是否为点击触发的tab切换,临时变量 67 // 标识,是否为点击触发的tab切换,临时变量
70 private changeByClick: boolean = false 68 private changeByClick: boolean = false
71 69
@@ -273,11 +271,7 @@ export struct TopNavigationComponent { @@ -273,11 +271,7 @@ export struct TopNavigationComponent {
273 let width = Number.parseFloat(newValue.width.toString()) 271 let width = Number.parseFloat(newValue.width.toString())
274 this.tabsWidth = Number.isNaN(width) ? 0 : width 272 this.tabsWidth = Number.isNaN(width) ? 0 : width
275 }) 273 })
276 - .animationDuration(this.animationDuration)  
277 .onChange((index: number) => { 274 .onChange((index: number) => {
278 - if (this.tabTimmer) {  
279 - clearTimeout(this.tabTimmer)  
280 - }  
281 this.currentTopNavName = 275 this.currentTopNavName =
282 this._currentNavIndex === 0 ? this.myChannelList[index].name : this.topNavList[index].name 276 this._currentNavIndex === 0 ? this.myChannelList[index].name : this.topNavList[index].name
283 Logger.info(TAG, `onChange index : ${index}`); 277 Logger.info(TAG, `onChange index : ${index}`);
@@ -289,13 +283,10 @@ export struct TopNavigationComponent { @@ -289,13 +283,10 @@ export struct TopNavigationComponent {
289 if (this.isBroadcast(this._currentNavIndex === 0 ? this.myChannelList[index] : this.topNavList[index])) { 283 if (this.isBroadcast(this._currentNavIndex === 0 ? this.myChannelList[index] : this.topNavList[index])) {
290 // 跳转到播报页面 284 // 跳转到播报页面
291 ProcessUtils.gotoBroadcastPage(this.myChannelList[index].pageId) 285 ProcessUtils.gotoBroadcastPage(this.myChannelList[index].pageId)
292 - this.tabTimmer = setTimeout(() => {  
293 this.tabsController.changeIndex(this.currentTopNavSelectedIndex) 286 this.tabsController.changeIndex(this.currentTopNavSelectedIndex)
294 - }, 100)  
295 } 287 }
296 if (this.isLayout(this._currentNavIndex === 0 ? this.myChannelList[index] : this.topNavList[index])) { 288 if (this.isLayout(this._currentNavIndex === 0 ? this.myChannelList[index] : this.topNavList[index])) {
297 ProcessUtils.gotoENewsPaper() 289 ProcessUtils.gotoENewsPaper()
298 - this.tabTimmer = setTimeout(() => {  
299 if (!this.changeByClick) { 290 if (!this.changeByClick) {
300 // 识别左滑右滑,跳过版面,到下一个 291 // 识别左滑右滑,跳过版面,到下一个
301 let nextIndex = this.currentTopNavSelectedIndex > index ? index - 1 : index + 1 292 let nextIndex = this.currentTopNavSelectedIndex > index ? index - 1 : index + 1
@@ -305,42 +296,41 @@ export struct TopNavigationComponent { @@ -305,42 +296,41 @@ export struct TopNavigationComponent {
305 // 重置标识 296 // 重置标识
306 this.changeByClick = false 297 this.changeByClick = false
307 } 298 }
308 - }, 100)  
309 - }  
310 - })  
311 - .onAnimationStart((index: number, targetIndex: number, event: TabsAnimationEvent) => {  
312 - if (!this.isBroadcast(this._currentNavIndex === 0 ? this.myChannelList[index] : this.topNavList[index]) &&  
313 - !this.isLayout(this._currentNavIndex === 0 ? this.myChannelList[index] : this.topNavList[index])  
314 - ) {  
315 - return  
316 - }  
317 - this.currentTopNavSelectedIndex = targetIndex  
318 - // 切换动画开始时触发该回调。下划线跟着页面一起滑动,同时宽度渐变。  
319 - let targetIndexInfo = this.getTextInfo(targetIndex)  
320 - this.startAnimateTo(this.animationDuration, targetIndexInfo.left, targetIndexInfo.width)  
321 - })  
322 - .onAnimationEnd((index: number, event: TabsAnimationEvent) => {  
323 - if (!this.isBroadcast(this._currentNavIndex === 0 ? this.myChannelList[index] : this.topNavList[index]) &&  
324 - !this.isLayout(this._currentNavIndex === 0 ? this.myChannelList[index] : this.topNavList[index])  
325 - ) {  
326 - return  
327 - }  
328 - // 切换动画结束时触发该回调。下划线动画停止。  
329 - let currentIndicatorInfo = this.getCurrentIndicatorInfo(index, event)  
330 - this.startAnimateTo(0, currentIndicatorInfo.left, currentIndicatorInfo.width)  
331 - })  
332 - .onGestureSwipe((index: number, event: TabsAnimationEvent) => {  
333 - if (!this.isBroadcast(this._currentNavIndex === 0 ? this.myChannelList[index] : this.topNavList[index]) &&  
334 - !this.isLayout(this._currentNavIndex === 0 ? this.myChannelList[index] : this.topNavList[index])  
335 - ) {  
336 - return  
337 } 299 }
338 - // 在页面跟手滑动过程中,逐帧触发该回调。  
339 - let currentIndicatorInfo = this.getCurrentIndicatorInfo(index, event)  
340 - this.currentTopNavSelectedIndex = currentIndicatorInfo.index  
341 - this.indicatorLeftMargin = currentIndicatorInfo.left  
342 - this.indicatorWidth = currentIndicatorInfo.width  
343 }) 300 })
  301 + // .onAnimationStart((index: number, targetIndex: number, event: TabsAnimationEvent) => {
  302 + // if (!this.isBroadcast(this._currentNavIndex === 0 ? this.myChannelList[index] : this.topNavList[index]) &&
  303 + // !this.isLayout(this._currentNavIndex === 0 ? this.myChannelList[index] : this.topNavList[index])
  304 + // ) {
  305 + // return
  306 + // }
  307 + // this.currentTopNavSelectedIndex = targetIndex
  308 + // // 切换动画开始时触发该回调。下划线跟着页面一起滑动,同时宽度渐变。
  309 + // let targetIndexInfo = this.getTextInfo(targetIndex)
  310 + // this.startAnimateTo(this.animationDuration, targetIndexInfo.left, targetIndexInfo.width)
  311 + // })
  312 + // .onAnimationEnd((index: number, event: TabsAnimationEvent) => {
  313 + // if (!this.isBroadcast(this._currentNavIndex === 0 ? this.myChannelList[index] : this.topNavList[index]) &&
  314 + // !this.isLayout(this._currentNavIndex === 0 ? this.myChannelList[index] : this.topNavList[index])
  315 + // ) {
  316 + // return
  317 + // }
  318 + // // 切换动画结束时触发该回调。下划线动画停止。
  319 + // let currentIndicatorInfo = this.getCurrentIndicatorInfo(index, event)
  320 + // this.startAnimateTo(0, currentIndicatorInfo.left, currentIndicatorInfo.width)
  321 + // })
  322 + // .onGestureSwipe((index: number, event: TabsAnimationEvent) => {
  323 + // if (!this.isBroadcast(this._currentNavIndex === 0 ? this.myChannelList[index] : this.topNavList[index]) &&
  324 + // !this.isLayout(this._currentNavIndex === 0 ? this.myChannelList[index] : this.topNavList[index])
  325 + // ) {
  326 + // return
  327 + // }
  328 + // // 在页面跟手滑动过程中,逐帧触发该回调。
  329 + // let currentIndicatorInfo = this.getCurrentIndicatorInfo(index, event)
  330 + // this.currentTopNavSelectedIndex = currentIndicatorInfo.index
  331 + // this.indicatorLeftMargin = currentIndicatorInfo.left
  332 + // this.indicatorWidth = currentIndicatorInfo.width
  333 + // })
344 334
345 // 分类列表最右侧频道设置 335 // 分类列表最右侧频道设置
346 if (this._currentNavIndex === 0) { 336 if (this._currentNavIndex === 0) {
  1 +import lottie, { AnimationItem } from '@ohos/lottie';
  2 +import { Logger } from 'wdKit/Index';
  3 +import { RefreshConstants } from '../../utils/RefreshConstants';
  4 +
  5 +/**
  6 + * Custom layout to show refresh or load.
  7 + * Android 24+12+24(top+image+bottom) 高度db
  8 + */
  9 +@Component
  10 +export default struct CustomLoadMoreLayout {
  11 + private mainRenderingSettings: RenderingContextSettings = new RenderingContextSettings(true)
  12 + private mainCanvasRenderingContext: CanvasRenderingContext2D =
  13 + new CanvasRenderingContext2D(this.mainRenderingSettings)
  14 + private animateName: string = "loadMore";
  15 + private animateItem: AnimationItem | null = null;
  16 +
  17 + build() {
  18 + Row() {
  19 + Canvas(this.mainCanvasRenderingContext)
  20 + .width(14)
  21 + .height(14)
  22 + .backgroundColor(Color.Transparent)
  23 + .onReady(() => {
  24 + // 可在此生命回调周期中加载动画,可以保证动画尺寸正确
  25 + //抗锯齿的设置
  26 + this.mainCanvasRenderingContext.imageSmoothingEnabled = true;
  27 + this.mainCanvasRenderingContext.imageSmoothingQuality = 'medium'
  28 + this.animate()
  29 + })
  30 + .onDisAppear(() => {
  31 + Logger.error('zzzz','CustomLoadMoreLayout onDisAppear')
  32 + lottie.destroy(this.animateName);
  33 + })
  34 +
  35 + Text('努力加载中')
  36 + .margin({
  37 + left: RefreshConstants.RefreshLayout_TEXT_MARGIN_LEFT,
  38 + bottom: RefreshConstants.RefreshLayout_TEXT_MARGIN_BOTTOM
  39 + })
  40 + .fontSize(14)
  41 + .fontColor('#888888')
  42 + .textAlign(TextAlign.Center)
  43 + }
  44 + .clip(true)
  45 + .width(RefreshConstants.FULL_WIDTH)
  46 + .justifyContent(FlexAlign.Center)
  47 + .height(60)
  48 + }
  49 +
  50 + animate() {
  51 + if (this.animateItem == null) {
  52 + this.animateItem = lottie.loadAnimation({
  53 + container: this.mainCanvasRenderingContext,
  54 + renderer: 'canvas', // canvas 渲染模式
  55 + loop: 50,
  56 + autoplay: true,
  57 + name: this.animateName,
  58 + path: "lottie/loading_more.json", // 路径加载动画只支持entry/src/main/ets 文件夹下的相对路径
  59 + })
  60 + }
  61 + }
  62 +}
  1 +import { ContentDTO, ReserveBean, ReserveItemBean } from 'wdBean/Index';
  2 +import { ProcessUtils } from 'wdRouter/Index';
  3 +import PageViewModel from '../../viewmodel/PageViewModel';
  4 +import { Logger, EmitterEventId, EmitterUtils, ToastUtils } from 'wdKit/Index';
  5 +import { router } from '@kit.ArkUI';
  6 +import { LiveModel } from '../../viewmodel/LiveModel';
  7 +import { ViewType } from 'wdConstant/src/main/ets/enum/ViewType';
  8 +import { EmptyComponent } from '../view/EmptyComponent';
  9 +import { ErrorComponent } from '../view/ErrorComponent';
  10 +import { CustomPullToRefresh } from '../reusable/CustomPullToRefresh';
  11 +import { PeopleShipNoMoreData } from '../reusable/PeopleShipNoMoreData';
  12 +import { HttpUtils } from 'wdNetwork/Index';
  13 +import { WDRouterPage, WDRouterRule } from 'wdRouter'
  14 +import { LazyDataSource } from 'wdKit/Index';
  15 +
  16 +const TAG: string = 'ReserveMorePage';
  17 +
  18 +/**
  19 + * 预约更多:
  20 + * type=1 直播
  21 + * type=2 预约
  22 + * 卡片结构:上下结构
  23 + * 卡片宽度:充满父窗口
  24 + * 卡片高度,仅包含横板图片:图片高度由图片的宽度及宽高比决定,图片宽度占父窗口'100%',宽高比为16:9:
  25 + */
  26 +@Entry
  27 +@Component
  28 +struct ReserveMorePage {
  29 + @State data: LazyDataSource<ContentDTO> = new LazyDataSource();
  30 + @State reserveList: ReserveItemBean[] = []
  31 + topSafeHeight: number = AppStorage.get<number>('topSafeHeight') as number;
  32 + type: number = 2;
  33 + pageSize: number = 20;
  34 + title: string = '预约列表'
  35 + //是否预约过直播
  36 + @State isAppointmentLive: boolean = false
  37 + @State contentDTO: ContentDTO = {} as ContentDTO;
  38 + @State private hasMore: boolean = true
  39 + @State private currentPage: number = 1
  40 + @State private isLoading: boolean = false
  41 + @State viewType: ViewType = ViewType.LOADING
  42 + private scroller: Scroller = new Scroller()
  43 + @State reservedIds: string[] = []
  44 + @State isShow: boolean = false
  45 + @State private liveId: string = ''
  46 + @State isLoadingAttention: boolean = false
  47 +
  48 + build() {
  49 + Column(){
  50 + this.TabbarNormal()
  51 + if (this.viewType == ViewType.LOADING) {
  52 + this.LoadingLayout()
  53 + } else if (this.viewType == ViewType.ERROR) {
  54 + ErrorComponent()
  55 + .onTouch(() => {
  56 + if (this.viewType === ViewType.ERROR) {
  57 + this.getData()
  58 + }
  59 + })
  60 + } else if (this.viewType == ViewType.EMPTY) {
  61 + EmptyComponent()
  62 + } else {
  63 + CustomPullToRefresh({
  64 + alldata: this.data,
  65 + scroller: this.scroller,
  66 + hasMore: false,
  67 + customList: () => {
  68 + this.ListLayout()
  69 + },
  70 + onRefresh: (resolve) => {
  71 + this.currentPage = 1
  72 + this.getData(resolve)
  73 + },
  74 + })
  75 + }
  76 +
  77 + }.backgroundColor($r('app.color.color_F5F5F5'))
  78 +
  79 + }
  80 +
  81 + @Builder
  82 + LoadingLayout() {
  83 + }
  84 +
  85 + @Builder
  86 + ListLayout() {
  87 + List({scroller: this.scroller}) {
  88 + // 下拉刷新
  89 + LazyForEach(this.data, (contentDTO: ContentDTO, index: number) => {
  90 + ListItem() {
  91 + this.buildItem(contentDTO, index)
  92 + }
  93 + },
  94 + (contentDTO: ContentDTO, contentIndex: number) => contentDTO.pageId + contentIndex.toString()
  95 + )
  96 + // 加载更多
  97 + ListItem() {
  98 + if (!this.hasMore && !this.isLoading) {
  99 + PeopleShipNoMoreData()
  100 + }
  101 + }
  102 + }
  103 + .cachedCount(8)
  104 + .edgeEffect(EdgeEffect.None)
  105 + .scrollBar(BarState.Off)
  106 + .backgroundColor('#F5F5F5')
  107 + .layoutWeight(1)
  108 + .onReachEnd(() => {
  109 + Logger.debug(TAG, "触底了");
  110 + if(!this.isLoading && this.hasMore){
  111 + //加载分页数据
  112 + this.currentPage++;
  113 + this.getData()
  114 + }
  115 + })
  116 + }
  117 +
  118 + /**
  119 + * 组件项
  120 + *
  121 + * @param programmeBean item 组件项, 上面icon,下面标题
  122 + */
  123 + @Builder
  124 + buildItem(item: ContentDTO, index: number) {
  125 + Column() {
  126 + Stack() {
  127 + Image(item.fullColumnImgUrls[0].url)
  128 + .width('100%')
  129 + .height(196)
  130 + .borderRadius(4)
  131 + this.LiveImage()
  132 +
  133 + }
  134 + .alignContent(Alignment.BottomEnd)
  135 +
  136 + Text(item.newsTitle)
  137 + .fontSize(17)
  138 + .maxLines(2)
  139 + .textOverflow({ overflow: TextOverflow.Ellipsis })
  140 + .margin({ top: 16, left: 12, right: 12 })
  141 + .alignSelf(ItemAlign.Start)
  142 + Row() {
  143 + Row() {
  144 + Image($r('app.media.reserve_play_icon'))
  145 + .width(20)
  146 + .height(20)
  147 + .margin({ left: 10, top: 2, bottom: 2, right: 6 })
  148 + // Text(DateTimeUtils.formatDate(item.liveInfo.liveStartTime, "MM月dd日 HH:mm"))
  149 + Text(this.getReserveDate(item.liveInfo.liveStartTime, 1))
  150 + .fontSize(12)
  151 + .fontWeight(500)
  152 + .fontColor('#ED2800')
  153 + .fontFamily('PingFang SC-Medium')
  154 + .maxLines(1)
  155 + .textOverflow({ overflow: TextOverflow.Ellipsis })
  156 + .margin({ top: 8, bottom: 8 })
  157 + .align(Alignment.Start)
  158 +
  159 + Image($r('app.media.point_icon'))
  160 + .objectFit(ImageFit.Auto)
  161 + .interpolation(ImageInterpolation.High)
  162 + .width(6)
  163 + .height(16)
  164 + .margin(2)
  165 +
  166 + Text(this.getReserveDate(item.liveInfo.liveStartTime, 2))
  167 + .fontSize(12)
  168 + .fontWeight(500)
  169 + .fontColor('#ED2800')
  170 + .fontFamily('PingFang SC-Medium')
  171 + .maxLines(1)
  172 + .textOverflow({ overflow: TextOverflow.Ellipsis })
  173 + .margin({ top: 8, bottom: 8, right: 10 })
  174 + .align(Alignment.Start)
  175 + }
  176 + .backgroundColor('#F5F5F5')
  177 + .margin(12)
  178 +
  179 + // Flex({ justifyContent: FlexAlign.Center }) {
  180 + // Text(this.isAppointmentLive ? '已预约' : '预约')
  181 + // .fontSize(12)
  182 + // .fontWeight(400)
  183 + // .fontFamily('PingFang SC-Regular')
  184 + // .width(52)
  185 + // .height(24)
  186 + // .fontColor(Color.White)
  187 + // .textAlign(TextAlign.Center)
  188 + // .onClick(() => {
  189 + // this.liveAppointment(item)
  190 + // })
  191 + // }
  192 + // .width(52)
  193 + // .backgroundColor('#ED2800')
  194 + // .borderRadius(3)
  195 + // ReserveMoreAttentionComponent({reserveItem: this.getAttentionItem(item), })
  196 + // .margin({ right: 12 })
  197 + Row() {
  198 + LoadingProgress()
  199 + .width(20)
  200 + .height(20)
  201 + .color(!this.isReserved(item) ? $r('app.color.color_fff') : $r('app.color.color_CCCCCC'))
  202 + .visibility((this.isLoadingAttention && this.liveId == item.objectId) ? Visibility.Visible : Visibility.None)
  203 +
  204 + Text(!this.isReserved(item) ? '关注' : '已关注')
  205 + .fontSize($r('app.float.vp_12'))
  206 + .fontWeight(500)
  207 + .fontColor(!this.isReserved(item) ? $r('app.color.color_fff') : $r('app.color.color_CCCCCC'))
  208 + .width('100%')
  209 + .height('100%')
  210 + .textAlign(TextAlign.Center)
  211 + .visibility((this.isLoadingAttention && this.liveId == item.objectId) ? Visibility.None : Visibility.Visible)
  212 + .margin({
  213 + right: '10vp'
  214 + })
  215 + .backgroundColor(!this.isReserved(item) ? $r('app.color.color_ED2800') : $r('app.color.color_F5F5F5'))
  216 + .borderRadius(3)
  217 +
  218 + }.onClick(() => {
  219 + this.bookAndCancel(item)
  220 + })
  221 + .justifyContent(FlexAlign.Center)
  222 + .alignItems(VerticalAlign.Center)
  223 + .borderRadius(3)
  224 + .width('52vp')
  225 + .height('24vp')
  226 + .margin({right: 12})
  227 +
  228 + }
  229 + .width('100%')
  230 + .justifyContent(FlexAlign.SpaceBetween)
  231 +
  232 + }
  233 + .borderRadius(4)
  234 + .backgroundColor(Color.White)
  235 + .width('calc(100% - 24vp)')
  236 + .margin({
  237 + left: '12vp',
  238 + right: '12vp',
  239 + top: index == 0 ? '12vp' : '8vp'
  240 + })
  241 + .onClick(() => {
  242 + ProcessUtils.processPage(item)
  243 + })
  244 + }
  245 +
  246 + /*导航栏*/
  247 + @Builder
  248 + TabbarNormal() {
  249 + RelativeContainer() {
  250 + //标题栏目
  251 + Image($r('app.media.icon_arrow_left'))
  252 + .width(24)
  253 + .height(24)
  254 + .objectFit(ImageFit.Auto)
  255 + .id("back_icon")
  256 + .alignRules({
  257 + center: { anchor: "__container__", align: VerticalAlign.Center },
  258 + left: { anchor: "__container__", align: HorizontalAlign.Start }
  259 + })
  260 + .onClick(() => {
  261 + router.back()
  262 + })
  263 +
  264 + Text(this.title)// .height('42lpx')
  265 + .maxLines(1)
  266 + .id("title")
  267 + .fontSize('35lpx')
  268 + .fontWeight(400)
  269 + .fontColor($r('app.color.color_222222'))
  270 + .lineHeight('42lpx')
  271 + .alignRules({
  272 + center: { anchor: "__container__", align: VerticalAlign.Center },
  273 + middle: { anchor: "__container__", align: HorizontalAlign.Center }
  274 + })
  275 + }
  276 + .backgroundColor('#FFFFFF')
  277 + .height(44)
  278 + .width('100%')
  279 + }
  280 +
  281 + @Builder
  282 + LiveImage() {
  283 + Row() {
  284 + Image($r('app.media.reserve_icon'))
  285 + .width(22)
  286 + .height(18)
  287 + Text('预约')
  288 + .fontSize('11fp')
  289 + .fontWeight(400)
  290 + .fontColor(Color.White)
  291 + }
  292 + .backgroundColor('#4D000000')
  293 + .margin({ right: 8, bottom: 8 })
  294 + }
  295 +
  296 + async aboutToAppear(): Promise<void> {
  297 + // PageViewModel.get
  298 + this.currentPage = 1
  299 + this.getData()
  300 + // 登录成功
  301 + EmitterUtils.receiveEvent(EmitterEventId.LOGIN_SUCCESS, () => {
  302 + this.currentPage = 1
  303 + this.getData()
  304 + })
  305 +
  306 + // 获取预约
  307 + EmitterUtils.receiveEvent(EmitterEventId.LIVE_ROOM_SUBSCRIBE, (str?: string) => {
  308 + Logger.debug(TAG, 'receiveEvent LIVE_ROOM_SUBSCRIBE: ' + str)
  309 + if (str) {
  310 + // 跳转指定频道场景,传参底导id、频道id
  311 + const model: ReserveItemBean = JSON.parse(str)
  312 + Logger.debug(TAG,'是否关注元数据0:' +` ${model.liveId}`)
  313 + if (model && model.liveId && this.reserveList) {
  314 + // 修改源数据
  315 + this.reserveList.forEach((element) => {
  316 + if (element.liveId == model.liveId) {
  317 + if (element && element.subscribe != model.subscribe) {
  318 + Logger.debug(TAG,'是否关注元数据2:' +` ${JSON.stringify(element.subscribe)}`)
  319 + element.subscribe = !element.subscribe
  320 + Logger.debug(TAG,'是否关注元数据3:' +` ${JSON.stringify(element.subscribe)}`)
  321 + this.data.reloadData()
  322 + this.isShow = true
  323 + }
  324 + }
  325 + })
  326 + }
  327 + }
  328 + })
  329 + }
  330 +
  331 + onPageShow(): void {
  332 + if (this.isShow) {
  333 + this.data.reloadData()
  334 + this.isShow = false
  335 + }
  336 + }
  337 +
  338 + private async getData(resolve?: (value: string | PromiseLike<string>) => void) {
  339 + if (this.isLoading) {
  340 + if (resolve) {
  341 + resolve('已更新至最新')
  342 + }
  343 + return
  344 + }
  345 + this.isLoading = true
  346 + try {
  347 + const liveReviewDTO = await PageViewModel.getLiveMoreUrl(this.type, this.currentPage, this.pageSize)
  348 +
  349 + if (liveReviewDTO && liveReviewDTO.list && liveReviewDTO.list.length > 0) {
  350 + if (liveReviewDTO.list.length === this.pageSize) {
  351 + this.hasMore = true;
  352 + } else {
  353 + this.hasMore = false;
  354 + }
  355 + if (this.currentPage == 1) {
  356 + this.data.clear()
  357 + this.reserveList = []
  358 + }
  359 + this.data.push(...liveReviewDTO.list)
  360 + //批量查询关注状态
  361 + this.getAppointmentInfo(liveReviewDTO.list)
  362 + } else {
  363 + this.hasMore = false;
  364 + }
  365 + this.resolveEnd(true, resolve)
  366 + if (liveReviewDTO.list.length == 0 && this.currentPage == 1) {
  367 + this.viewType = ViewType.EMPTY
  368 + }
  369 + }catch (exception) {
  370 + this.resolveEnd(false, resolve)
  371 + }
  372 + // PageViewModel.getLiveMoreUrl(this.type, this.currentPage, this.pageSize).then(async (liveReviewDTO) => {
  373 + // // this.operDataList = []
  374 + // // this.operDataList.push(...liveReviewDTO.list)
  375 + // this.data.push(...liveReviewDTO.list)
  376 + //
  377 + // // this.getAppointmentInfo()
  378 + // })
  379 + }
  380 +
  381 + private resolveEnd(isTop: boolean, resolve?: (value: string | PromiseLike<string>) => void) {
  382 + if (resolve) {
  383 + if (this.currentPage == 1 && isTop) {
  384 + resolve('已更新至最新')
  385 + }else {
  386 + resolve('')
  387 + }
  388 + }
  389 + if (this.currentPage == 1 && !isTop) {
  390 + this.viewType = ViewType.ERROR
  391 + } else {
  392 + this.viewType = ViewType.LOADED
  393 + }
  394 + this.isLoading = false
  395 + }
  396 +
  397 + async getAppointmentInfo(list: ContentDTO[]) {
  398 + if (HttpUtils.getUserId()) {
  399 + const reserveBean = this.transformToLiveDetailsBeans(list)
  400 + Logger.debug(TAG,'是否预约数据:' +` ${JSON.stringify(reserveBean)}`)
  401 + LiveModel.getAppointmentStatus(reserveBean).then((result) => {
  402 + Logger.debug(TAG,'是否预约数据:' +` ${JSON.stringify(result)}`)
  403 + if (result && result.length > 0) {
  404 + this.reserveList.push(...result)
  405 + this.data.reloadData()
  406 + }
  407 + }).catch(() =>{
  408 + // this.data.push(...list)
  409 + })
  410 + }else {
  411 + // this.data.push(...list)
  412 +
  413 + }
  414 + }
  415 +
  416 + // 判断是否预约
  417 + isReserved(item: ContentDTO) {
  418 + const objc = this.getAttentionItem(item)
  419 + if (objc) {
  420 + return objc.subscribe
  421 + }
  422 + return false
  423 + }
  424 +
  425 + getAttentionItem(item: ContentDTO) {
  426 + const objc = this.reserveList.find((element: ReserveItemBean) => {
  427 + return element.liveId.toString() == item.objectId
  428 + })
  429 + return objc
  430 + }
  431 +
  432 + // 这个函数遍历liveReviewDTO.list并转换为LiveDetailsBean数组
  433 + transformToLiveDetailsBeans(list: ContentDTO[]): ReserveBean[] {
  434 + const liveDetailsBeans: ReserveBean[] = [];
  435 + list.forEach(item => {
  436 + liveDetailsBeans.push({
  437 + relationId: item.relId,
  438 + liveId: item.objectId,
  439 + });
  440 + });
  441 + return liveDetailsBeans
  442 + }
  443 +
  444 + // 预约/取消预约
  445 + async bookAndCancel(item: ContentDTO) {
  446 +
  447 + // 未登录,跳转登录
  448 + if (!HttpUtils.getUserId()) {
  449 + WDRouterRule.jumpWithPage(WDRouterPage.loginPage)
  450 + return
  451 + }
  452 + if (!this.isLoadingAttention && this.liveId.length == 0) {
  453 + this.isLoadingAttention = true
  454 + this.liveId = item.objectId
  455 + const reserveItem = this.getAttentionItem(item)
  456 + if (reserveItem) {
  457 + this.isLoadingAttention = true
  458 + this.liveId = reserveItem.liveId.toString()
  459 + try {
  460 + const res = await LiveModel.liveAppointment(reserveItem.relationId, reserveItem.liveId.toString(), !reserveItem.subscribe);
  461 + if (res.code == 0) {
  462 + ToastUtils.shortToast(!reserveItem.subscribe ? '预约成功' : '取消预约成功')
  463 + // 修改源数据
  464 + this.reserveList.forEach((element) => {
  465 + if (element.liveId.toString() == item.objectId) {
  466 + Logger.debug(TAG,'是否关注元数据:' +` ${JSON.stringify(element.subscribe)}`)
  467 + element.subscribe = !element.subscribe
  468 + Logger.debug(TAG,'是否关注元数据1:' +` ${JSON.stringify(element.subscribe)}`)
  469 + this.data.reloadData()
  470 + }
  471 + })
  472 + }
  473 + this.isLoadingAttention = false
  474 + this.liveId = ''
  475 + } catch (e) {
  476 + this.liveId = ''
  477 + this.isLoadingAttention = false
  478 + }
  479 + }else {
  480 + this.liveId = ''
  481 + this.isLoadingAttention = false
  482 + }
  483 + }
  484 + }
  485 +
  486 + getReserveDate(eventDateTimeString: string, type: number): string {
  487 + // 解析事件的日期和时间
  488 + const eventDateTime = new Date(eventDateTimeString);
  489 + const currentDateTime = new Date();
  490 +
  491 + // 截取事件时间的小时和分钟(假设事件时间是按照24小时制)
  492 + const eventHour = eventDateTime.getHours();
  493 + const eventMinutes = eventDateTime.getMinutes();
  494 + const eventTimeStr = `${eventHour}:${eventMinutes.toString().padStart(2, '0')}开始`; // 格式化时间,确保分钟是两位数
  495 +
  496 + // 计算时间差
  497 + const timeDifference = eventDateTime.getTime() - currentDateTime.getTime();
  498 +
  499 + // 如果事件在24小时内
  500 + if (type === 1) {
  501 + if (timeDifference > 0 && timeDifference <= 24 * 60 * 60 * 1000) {
  502 + return `今天`;
  503 + } else {
  504 + // 如果事件不在24小时内
  505 + const month = eventDateTime.getMonth() + 1; // 月份从0开始
  506 + const date = eventDateTime.getDate();
  507 + return `${month}月${date}日`;
  508 + }
  509 + } else {
  510 + return `${eventTimeStr}`;
  511 + }
  512 + }
  513 +
  514 + async liveAppointment(item: ContentDTO) {
  515 + const liveDetail = await LiveModel.liveAppointment(item?.relId || '', item?.objectId || '', this.isAppointmentLive || false)
  516 + }
  517 +
  518 +
  519 +}
1 import { PullToRefresh, PullToRefreshConfigurator } from '@ohos/pulltorefresh'; 1 import { PullToRefresh, PullToRefreshConfigurator } from '@ohos/pulltorefresh';
  2 +import { LazyDataSource } from 'wdKit';
2 3
3 @Component 4 @Component
4 export struct CustomPullToRefresh { 5 export struct CustomPullToRefresh {
5 - @Link alldata: Object[]; 6 + @Link alldata: Object[] | LazyDataSource<Object>;
6 scroller: Scroller = new Scroller(); 7 scroller: Scroller = new Scroller();
7 @BuilderParam customList: () => void; 8 @BuilderParam customList: () => void;
8 onRefresh: (resolve?: (value: string | PromiseLike<string>) => void) => void = () => { 9 onRefresh: (resolve?: (value: string | PromiseLike<string>) => void) => void = () => {
@@ -15,7 +16,7 @@ export struct CustomPullToRefresh { @@ -15,7 +16,7 @@ export struct CustomPullToRefresh {
15 build() { 16 build() {
16 Column(){ 17 Column(){
17 PullToRefresh({ 18 PullToRefresh({
18 - data:this.alldata, 19 + data:$alldata,
19 scroller:this.scroller, 20 scroller:this.scroller,
20 refreshConfigurator:this.refreshConfigurator, 21 refreshConfigurator:this.refreshConfigurator,
21 customList:()=>{ 22 customList:()=>{
@@ -268,8 +268,8 @@ struct MineHomePage { @@ -268,8 +268,8 @@ struct MineHomePage {
268 .height('42lpx') 268 .height('42lpx')
269 .maxLines(1) 269 .maxLines(1)
270 .id("rightText") 270 .id("rightText")
271 - .fontSize('35lpx')  
272 - .fontWeight('400lpx') 271 + .fontSize('31lpx')
  272 + .fontWeight(400)
273 .fontColor($r('app.color.white') ) 273 .fontColor($r('app.color.white') )
274 .lineHeight('42lpx') 274 .lineHeight('42lpx')
275 .alignRules({ 275 .alignRules({
@@ -324,10 +324,10 @@ struct MineHomePage { @@ -324,10 +324,10 @@ struct MineHomePage {
324 .height('42lpx') 324 .height('42lpx')
325 .maxLines(1) 325 .maxLines(1)
326 .id("title") 326 .id("title")
327 - .fontSize('35lpx')  
328 - .fontWeight('400lpx') 327 + .fontSize('27lpx')
  328 + .fontWeight(400)
329 .fontColor($r('app.color.color_222222')) 329 .fontColor($r('app.color.color_222222'))
330 - .lineHeight('42lpx') 330 + .lineHeight('31lpx')
331 .alignRules({ 331 .alignRules({
332 center: { anchor: "__container__", align: VerticalAlign.Center }, 332 center: { anchor: "__container__", align: VerticalAlign.Center },
333 left: { anchor: "head_icon", align: HorizontalAlign.End } 333 left: { anchor: "head_icon", align: HorizontalAlign.End }
@@ -338,8 +338,8 @@ struct MineHomePage { @@ -338,8 +338,8 @@ struct MineHomePage {
338 .height('42lpx') 338 .height('42lpx')
339 .maxLines(1) 339 .maxLines(1)
340 .id("rightText") 340 .id("rightText")
341 - .fontSize('35lpx')  
342 - .fontWeight('400lpx') 341 + .fontSize('31lpx')
  342 + .fontWeight(400)
343 .fontColor($r('app.color.color_222222')) 343 .fontColor($r('app.color.color_222222'))
344 .lineHeight('42lpx') 344 .lineHeight('42lpx')
345 .alignRules({ 345 .alignRules({
1 import { HttpUrlUtils, ResponseDTO } from 'wdNetwork'; 1 import { HttpUrlUtils, ResponseDTO } from 'wdNetwork';
2 import { HttpRequest } from 'wdNetwork/src/main/ets/http/HttpRequest'; 2 import { HttpRequest } from 'wdNetwork/src/main/ets/http/HttpRequest';
3 -import { Logger, ToastUtils } from 'wdKit';  
4 -import { LiveDetailsBean, ReserveBean } from 'wdBean/Index'; 3 +import { Logger, ToastUtils, EmitterEventId, EmitterUtils } from 'wdKit';
  4 +import { LiveDetailsBean, ReserveBean, ReserveItemBean } from 'wdBean/Index';
5 5
6 const TAG = 'LiveModel' 6 const TAG = 'LiveModel'
7 7
8 -interface ReserveRes {  
9 - code: string | number,  
10 - data: ReserveItem[]  
11 -}  
12 8
13 -interface ReserveItem {  
14 - liveId: number,  
15 - relationId: string,  
16 - subscribe: boolean  
17 -} 9 +
18 10
19 export class LiveModel { 11 export class LiveModel {
20 /** 12 /**
@@ -70,10 +62,15 @@ export class LiveModel { @@ -70,10 +62,15 @@ export class LiveModel {
70 ToastUtils.shortToast(data.message) 62 ToastUtils.shortToast(data.message)
71 return 63 return
72 } 64 }
  65 + if (data.code == 0) {
  66 + const reserveModel = new ReserveItemBean(Number(liveId), relationId, isSubscribe)
  67 + EmitterUtils.sendEvent(EmitterEventId.LIVE_ROOM_SUBSCRIBE, JSON.stringify(reserveModel))
  68 + }
73 success(data) 69 success(data)
  70 + Logger.info('liveAppointment', JSON.stringify(data))
74 }, (error: Error) => { 71 }, (error: Error) => {
75 fail(error.message) 72 fail(error.message)
76 - Logger.debug(TAG + ":error ", error.toString()) 73 + Logger.debug(TAG + ":error ", JSON.stringify(error))
77 }) 74 })
78 }) 75 })
79 } 76 }
@@ -88,11 +85,12 @@ export class LiveModel { @@ -88,11 +85,12 @@ export class LiveModel {
88 static getAppointmentStatus(reserveBean: ReserveBean[]) { 85 static getAppointmentStatus(reserveBean: ReserveBean[]) {
89 // let params: Record<string, ArrayList<ReserveBean>> = {}; 86 // let params: Record<string, ArrayList<ReserveBean>> = {};
90 // params = reserveBean 87 // params = reserveBean
91 - return new Promise<Array<ReserveItem>>((success, fail) => {  
92 - HttpRequest.post<ResponseDTO<Array<ReserveItem>>>( 88 + return new Promise<Array<ReserveItemBean>>((success, fail) => {
  89 + HttpRequest.post<ResponseDTO<Array<ReserveItemBean>>>(
93 HttpUrlUtils.getAppointmentStatusUrl(), 90 HttpUrlUtils.getAppointmentStatusUrl(),
94 reserveBean, 91 reserveBean,
95 - ).then((data: ResponseDTO<Array<ReserveItem>>) => { 92 + ).then((data: ResponseDTO<Array<ReserveItemBean>>) => {
  93 + Logger.debug(TAG, 'getAppointmentStatus:' + `${JSON.stringify(data)}`)
96 if (!data || !data.data) { 94 if (!data || !data.data) {
97 fail("数据为空") 95 fail("数据为空")
98 return 96 return
@@ -103,9 +101,10 @@ export class LiveModel { @@ -103,9 +101,10 @@ export class LiveModel {
103 return 101 return
104 } 102 }
105 success(data.data) 103 success(data.data)
  104 + Logger.info('getAppointmentStatus', JSON.stringify(data.data))
106 }, (error: Error) => { 105 }, (error: Error) => {
107 fail(error.message) 106 fail(error.message)
108 - Logger.debug(TAG + ":error ", error.toString()) 107 + Logger.debug(TAG + ":error ", JSON.stringify(error))
109 }) 108 })
110 }) 109 })
111 } 110 }
@@ -19,7 +19,7 @@ @@ -19,7 +19,7 @@
19 "components/page/PeopleShipHomePage", 19 "components/page/PeopleShipHomePage",
20 "pages/MultiPictureListPage", 20 "pages/MultiPictureListPage",
21 "components/page/LiveMorePage", 21 "components/page/LiveMorePage",
22 - "components/page/ReserveMorePage", 22 + "components/reserveMore/ReserveMorePage",
23 "pages/VideoPlayPage", 23 "pages/VideoPlayPage",
24 "components/page/ThemeListPage", 24 "components/page/ThemeListPage",
25 "pages/ShowUserHeaderPage", 25 "pages/ShowUserHeaderPage",
1 import { HttpUrlUtils, ResponseDTO } from 'wdNetwork'; 1 import { HttpUrlUtils, ResponseDTO } from 'wdNetwork';
2 import { HttpRequest } from 'wdNetwork/src/main/ets/http/HttpRequest'; 2 import { HttpRequest } from 'wdNetwork/src/main/ets/http/HttpRequest';
3 -import { Logger, ToastUtils } from 'wdKit';  
4 -import { ContentDetailDTO, LiveDetailsBean, LiveRoomBean, LiveRoomDataBean } from 'wdBean/Index'; 3 +import { Logger, ToastUtils, EmitterEventId, EmitterUtils } from 'wdKit';
  4 +import { ContentDetailDTO, LiveDetailsBean, LiveRoomBean, LiveRoomDataBean, ReserveItemBean } from 'wdBean/Index';
5 import { ContentDetailRequest } from 'wdDetailPlayApi/Index'; 5 import { ContentDetailRequest } from 'wdDetailPlayApi/Index';
6 6
7 const TAG = 'LiveModel' 7 const TAG = 'LiveModel'
@@ -199,6 +199,10 @@ export class LiveModel { @@ -199,6 +199,10 @@ export class LiveModel {
199 ToastUtils.shortToast(data.message) 199 ToastUtils.shortToast(data.message)
200 return 200 return
201 } 201 }
  202 + if (data.code == 0) {
  203 + const reserveModel = new ReserveItemBean(Number(liveId), relationId, isSubscribe)
  204 + EmitterUtils.sendEvent(EmitterEventId.LIVE_ROOM_SUBSCRIBE, JSON.stringify(reserveModel))
  205 + }
202 success(data) 206 success(data)
203 }, (error: Error) => { 207 }, (error: Error) => {
204 fail(error.message) 208 fail(error.message)
@@ -5,7 +5,6 @@ import CustomRefreshLoadLayout from 'wdComponent/src/main/ets/components/page/Cu @@ -5,7 +5,6 @@ import CustomRefreshLoadLayout from 'wdComponent/src/main/ets/components/page/Cu
5 import { RefreshLayoutBean } from 'wdComponent/src/main/ets/components/page/RefreshLayoutBean' 5 import { RefreshLayoutBean } from 'wdComponent/src/main/ets/components/page/RefreshLayoutBean'
6 import PageModel from 'wdComponent/src/main/ets/viewmodel/PageModel' 6 import PageModel from 'wdComponent/src/main/ets/viewmodel/PageModel'
7 import { ViewType } from 'wdConstant/Index' 7 import { ViewType } from 'wdConstant/Index'
8 -import LoadMoreLayout from 'wdComponent/src/main/ets/components/page/LoadMoreLayout'  
9 import RefreshLayout from 'wdComponent/src/main/ets/components/page/RefreshLayout' 8 import RefreshLayout from 'wdComponent/src/main/ets/components/page/RefreshLayout'
10 import { StringUtils } from 'wdKit/Index' 9 import { StringUtils } from 'wdKit/Index'
11 import { LiveViewModel } from '../../viewModel/LiveViewModel' 10 import { LiveViewModel } from '../../viewModel/LiveViewModel'
@@ -5,7 +5,7 @@ import router from '@ohos.router' @@ -5,7 +5,7 @@ import router from '@ohos.router'
5 import { WDRouterRule, WDRouterPage } from 'wdRouter'; 5 import { WDRouterRule, WDRouterPage } from 'wdRouter';
6 import { SettingPasswordParams } from './SettingPasswordLayout' 6 import { SettingPasswordParams } from './SettingPasswordLayout'
7 import { Router } from '@ohos.arkui.UIContext' 7 import { Router } from '@ohos.arkui.UIContext'
8 -import { CustomToast, EmitterEventId, EmitterUtils, NetworkUtil, SPHelper, ToastUtils } from 'wdKit/Index' 8 +import { CustomToast, EmitterEventId, EmitterUtils, NetworkUtil, SPHelper, StringUtils, ToastUtils } from 'wdKit/Index'
9 import { SpConstants } from 'wdConstant/Index' 9 import { SpConstants } from 'wdConstant/Index'
10 import { emitter } from '@kit.BasicServicesKit' 10 import { emitter } from '@kit.BasicServicesKit'
11 11
@@ -23,6 +23,7 @@ struct ForgetPasswordPage { @@ -23,6 +23,7 @@ struct ForgetPasswordPage {
23 loginViewModel: LoginViewModel = new LoginViewModel() 23 loginViewModel: LoginViewModel = new LoginViewModel()
24 @State @Watch('onCodeSend') isCodeSend: boolean = false //验证码点击发送事件 24 @State @Watch('onCodeSend') isCodeSend: boolean = false //验证码点击发送事件
25 pageType:number = (router.getParams() as Record<string, number>)['pageType']; //0、登录->忘记密码 1、设置->重置密码 2、设置->更换手机号页面1 3、设置->更换手机号页面2 25 pageType:number = (router.getParams() as Record<string, number>)['pageType']; //0、登录->忘记密码 1、设置->重置密码 2、设置->更换手机号页面1 3、设置->更换手机号页面2
  26 + phone:string = (router.getParams() as Record<string, number>)['phone'] + ""; //登录 密码登录 填写手机号 点击忘记密码 带过来手机号
26 @State pageTitle:string = '找回密码'; 27 @State pageTitle:string = '找回密码';
27 @State codeStateSuccess:boolean=false 28 @State codeStateSuccess:boolean=false
28 onCodeSend() { 29 onCodeSend() {
@@ -30,6 +31,7 @@ struct ForgetPasswordPage { @@ -30,6 +31,7 @@ struct ForgetPasswordPage {
30 this.sendVerifyCode() 31 this.sendVerifyCode()
31 } 32 }
32 } 33 }
  34 +
33 @State toastText:string = "" 35 @State toastText:string = ""
34 dialogToast: CustomDialogController = new CustomDialogController({ 36 dialogToast: CustomDialogController = new CustomDialogController({
35 builder: CustomToast({ 37 builder: CustomToast({
@@ -37,8 +39,6 @@ struct ForgetPasswordPage { @@ -37,8 +39,6 @@ struct ForgetPasswordPage {
37 }), 39 }),
38 autoCancel: false, 40 autoCancel: false,
39 alignment: DialogAlignment.Center, 41 alignment: DialogAlignment.Center,
40 - offset: { dx: 0, dy: -20 },  
41 - gridCount: 1,  
42 customStyle: true, 42 customStyle: true,
43 maskColor:"#00000000" 43 maskColor:"#00000000"
44 }) 44 })
@@ -93,6 +93,9 @@ struct ForgetPasswordPage { @@ -93,6 +93,9 @@ struct ForgetPasswordPage {
93 } 93 }
94 if (this.pageType == 0){ 94 if (this.pageType == 0){
95 this.pageTitle = '找回密码' 95 this.pageTitle = '找回密码'
  96 + if(StringUtils.isNotEmpty(this.phone) && this.phone.indexOf("****") === -1){
  97 + this.phoneContent = this.phone
  98 + }
96 }else if (this.pageType == 1){ 99 }else if (this.pageType == 1){
97 this.pageTitle = '验证当前手机号' 100 this.pageTitle = '验证当前手机号'
98 }else if (this.pageType == 2){ 101 }else if (this.pageType == 2){
@@ -211,7 +214,6 @@ struct ForgetPasswordPage { @@ -211,7 +214,6 @@ struct ForgetPasswordPage {
211 } 214 }
212 WDRouterRule.jumpWithReplacePage(WDRouterPage.settingPasswordPage, params) 215 WDRouterRule.jumpWithReplacePage(WDRouterPage.settingPasswordPage, params)
213 216
214 - this.showToastTip("校验成功,准备跳转设置页面")  
215 Logger.debug(TAG,"校验成功") 217 Logger.debug(TAG,"校验成功")
216 }).catch((error:string)=>{ 218 }).catch((error:string)=>{
217 this.showToastTip(error) 219 this.showToastTip(error)
@@ -53,8 +53,6 @@ struct LoginPage { @@ -53,8 +53,6 @@ struct LoginPage {
53 }), 53 }),
54 autoCancel: false, 54 autoCancel: false,
55 alignment: DialogAlignment.Center, 55 alignment: DialogAlignment.Center,
56 - offset: { dx: 0, dy: -20 },  
57 - gridCount: 1,  
58 customStyle: true, 56 customStyle: true,
59 maskColor:"#00000000" 57 maskColor:"#00000000"
60 }) 58 })
@@ -167,8 +165,13 @@ struct LoginPage { @@ -167,8 +165,13 @@ struct LoginPage {
167 Text('忘记密码').fontColor('#666666').fontSize(14).margin({ top: 16 }) 165 Text('忘记密码').fontColor('#666666').fontSize(14).margin({ top: 16 })
168 .onClick(() => { 166 .onClick(() => {
169 // router.pushUrl({ url: 'pages/login/ForgetPasswordPage' }) 167 // router.pushUrl({ url: 'pages/login/ForgetPasswordPage' })
  168 + if(StringUtils.isNotEmpty(this.accountContent) && StringUtils.photoMatch(this.accountContent)){
  169 + let pageType = { 'pageType': 0, 'phone': Number(this.accountContent) } as Record<string, number>;
  170 + WDRouterRule.jumpWithPage(WDRouterPage.forgetPasswordPage, pageType)
  171 + }else{
170 let pageType = { 'pageType': 0 } as Record<string, number>; 172 let pageType = { 'pageType': 0 } as Record<string, number>;
171 WDRouterRule.jumpWithPage(WDRouterPage.forgetPasswordPage, pageType) 173 WDRouterRule.jumpWithPage(WDRouterPage.forgetPasswordPage, pageType)
  174 + }
172 }) 175 })
173 } 176 }
174 177
@@ -24,8 +24,6 @@ struct ModifyPasswordPage { @@ -24,8 +24,6 @@ struct ModifyPasswordPage {
24 }), 24 }),
25 autoCancel: false, 25 autoCancel: false,
26 alignment: DialogAlignment.Center, 26 alignment: DialogAlignment.Center,
27 - offset: { dx: 0, dy: -20 },  
28 - gridCount: 1,  
29 customStyle: true, 27 customStyle: true,
30 maskColor:"#00000000" 28 maskColor:"#00000000"
31 }) 29 })
@@ -123,7 +121,7 @@ struct ModifyPasswordPage { @@ -123,7 +121,7 @@ struct ModifyPasswordPage {
123 .alignItems(VerticalAlign.Center) 121 .alignItems(VerticalAlign.Center)
124 122
125 Column() { 123 Column() {
126 - Text("提示:密码长度6~20,需大写字母、小写字母、数字、特殊符合中组合三种及三种以上").fontSize(12).maxLines(3).fontColor(0x999999).padding({top:'10lpx'}) 124 + Text("提示:密码长度6~20位,使用大写字母、小写字母、数字、特殊字符中三种或三种以上").fontSize(12).maxLines(3).fontColor(0x999999).padding({top:'10lpx'})
127 } 125 }
128 .width('100%') 126 .width('100%')
129 .height('85lpx') 127 .height('85lpx')
@@ -64,8 +64,6 @@ export struct SettingPasswordLayout { @@ -64,8 +64,6 @@ export struct SettingPasswordLayout {
64 }), 64 }),
65 autoCancel: false, 65 autoCancel: false,
66 alignment: DialogAlignment.Center, 66 alignment: DialogAlignment.Center,
67 - offset: { dx: 0, dy: -20 },  
68 - gridCount: 1,  
69 customStyle: true, 67 customStyle: true,
70 maskColor:"#00000000" 68 maskColor:"#00000000"
71 }) 69 })
@@ -95,7 +93,7 @@ export struct SettingPasswordLayout { @@ -95,7 +93,7 @@ export struct SettingPasswordLayout {
95 this.listData.push(new AccoutPageDataModel(0, '设置密码', '', '', '', '', 0)) 93 this.listData.push(new AccoutPageDataModel(0, '设置密码', '', '', '', '', 0))
96 this.listData.push(new AccoutPageDataModel(1, '', '', '', '', '请输入密码', 10086)) 94 this.listData.push(new AccoutPageDataModel(1, '', '', '', '', '请输入密码', 10086))
97 this.listData.push(new AccoutPageDataModel(1, '', '', '', '', '再次输入密码', 10087)) 95 this.listData.push(new AccoutPageDataModel(1, '', '', '', '', '再次输入密码', 10087))
98 - this.listData.push(new AccoutPageDataModel(3, '', '', '提示:密码长度6~20,需大写字母、小写字母、数字、特殊符合中组合三种及三种以上', '', '', 0)) 96 + this.listData.push(new AccoutPageDataModel(3, '', '', '提示:密码长度6~20位,使用大写字母、小写字母、数字、特殊字符中三种或三种以上', '', '', 0))
99 this.listData.push(new AccoutPageDataModel(4, '', '', '', '确认', '', 0)) 97 this.listData.push(new AccoutPageDataModel(4, '', '', '', '确认', '', 0))
100 break; 98 break;
101 99
@@ -105,7 +103,7 @@ export struct SettingPasswordLayout { @@ -105,7 +103,7 @@ export struct SettingPasswordLayout {
105 this.listData.push(new AccoutPageDataModel(1, '', '', '', '', '请输入原密码', 10010)) 103 this.listData.push(new AccoutPageDataModel(1, '', '', '', '', '请输入原密码', 10010))
106 this.listData.push(new AccoutPageDataModel(1, '', '', '', '', '请输入新密码', 10086)) 104 this.listData.push(new AccoutPageDataModel(1, '', '', '', '', '请输入新密码', 10086))
107 this.listData.push(new AccoutPageDataModel(1, '', '', '', '', '请再请输入原密码', 10087)) 105 this.listData.push(new AccoutPageDataModel(1, '', '', '', '', '请再请输入原密码', 10087))
108 - this.listData.push(new AccoutPageDataModel(3, '', '', '提示:密码长度6~20,需大写字母、小写字母、数字、特殊符合中组合三种及三种以上', '', '', 0)) 106 + this.listData.push(new AccoutPageDataModel(3, '', '', '提示:密码长度6~20位,使用大写字母、小写字母、数字、特殊字符中三种或三种以上', '', '', 0))
109 this.listData.push(new AccoutPageDataModel(4, '', '', '', '确认', '', 0)) 107 this.listData.push(new AccoutPageDataModel(4, '', '', '', '确认', '', 0))
110 this.listData.push(new AccoutPageDataModel(3, '', '', '忘记密码', '', '', 0)) 108 this.listData.push(new AccoutPageDataModel(3, '', '', '忘记密码', '', '', 0))
111 break; 109 break;
@@ -126,7 +124,7 @@ export struct SettingPasswordLayout { @@ -126,7 +124,7 @@ export struct SettingPasswordLayout {
126 this.listData.push(new AccoutPageDataModel(1, '', '', '', '', '请输入新密码', 10086)) 124 this.listData.push(new AccoutPageDataModel(1, '', '', '', '', '请输入新密码', 10086))
127 this.listData.push(new AccoutPageDataModel(1, '', '', '', '', '请再请输入原密码', 10087)) 125 this.listData.push(new AccoutPageDataModel(1, '', '', '', '', '请再请输入原密码', 10087))
128 this.listData.push(new AccoutPageDataModel(2, '', '', '', '', '验证码', 10088)) 126 this.listData.push(new AccoutPageDataModel(2, '', '', '', '', '验证码', 10088))
129 - this.listData.push(new AccoutPageDataModel(3, '', '', '提示:密码长度6~20,需大写字母、小写字母、数字、特殊符合中组合三种及三种以上', '', '', 0)) 127 + this.listData.push(new AccoutPageDataModel(3, '', '', '提示:密码长度6~20位,使用大写字母、小写字母、数字、特殊字符中三种或三种以上', '', '', 0))
130 this.listData.push(new AccoutPageDataModel(4, '', '', '', '确认', '', 0)) 128 this.listData.push(new AccoutPageDataModel(4, '', '', '', '确认', '', 0))
131 this.listData.push(new AccoutPageDataModel(3, '', '', '忘记密码', '', '', 0)) 129 this.listData.push(new AccoutPageDataModel(3, '', '', '忘记密码', '', '', 0))
132 break; 130 break;
@@ -327,7 +325,7 @@ export struct SettingPasswordLayout { @@ -327,7 +325,7 @@ export struct SettingPasswordLayout {
327 return 325 return
328 } 326 }
329 if (this.password01 != this.password02) { 327 if (this.password01 != this.password02) {
330 - this.showToastTip('密码不一致') 328 + this.showToastTip('两次输入的密码不一致,请重新输入')
331 return 329 return
332 } 330 }
333 if(this.pageId == 1){ //设置密码 331 if(this.pageId == 1){ //设置密码
  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,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAACXBIWXMAAAABAAAAAQBPJcTWAAAAJHpUWHRDcmVhdG9yAAAImXNMyU9KVXBMK0ktUnBNS0tNLikGAEF6Bs5qehXFAAAb90lEQVR4nO19bZRUx3nm89a9/TXfMAwDGKRFYgxijBRbE0vLMZYGS6sTOzJREARsGcsr21nv5uSH4xxvdn9s/q29Tvbj7Dm7ye76YBssWIySeDfZBBmEQIaD4kGJwOBxBil8CQSMh5np7umve+vdH32rp7r63v6Y6R4a3M85ffreqtt1q/p96nnfqrofhHsQZ86cWZTNZqMAlhNRD4Aex3EWEVGEmaNCCNa3mTkNIAUAzDxpWRYTUZqZbwgh3pdSZqampm4MDw+n72jDGgC60xWYL06ePBkLhULLATzguu4DRLSciCJExN4hDADMzEKIQlpQvpQSHkEK29pv0sx8g4guO45zOR6P37zbSXFXEuDEiRMPCiEGAawQQqz2khkAPMOWbPsRQDdwBQL4lgcAQojLlmXdYOYLGzZsuLIgf0AdcdcQ4OTJk2s8ow8BiAJ5gzAziKhgvFoIoLb1/FoIoJfn5U8JIS5HIpG3BgYGbjX4L6kLmpoAJ0+ejAF4goiGACwCio2ub6POCqD1cN8yzOOFEOy6LjQiThHRhVgs9ncDAwPTC/SX1YymJMDJkyfXAPgogA0AonpvNXuumWZu6z066DeAvwKYx/sZWx0TlOYR6WfRaPRUMxKhqQhw7NixAdu2fw3Ag6aBgno2qiSA2aODFABlCFGNOgSQBADYsqx3crnc24888sjVhvyBc0BTEODUqVMDruv+GoA1AHQZNY0OeMbzcwPm70wF0H16mVFCuZjBN68WRfDqN51IJP788ccfv+OKcEcJcPLkyZjrus8T0WOowdC1xAHKWH4EqEYBfPZrihd0RTDPR0SjlmX97bp16+KN/7f9cccIcOLEiU9JKYcBxMr5+GoCPPN3fsfNQwGKyvHr2dUqgp8aua4bJ6LRD33oQz+pzz9bGxacAG+88cYHAewiosVAoSeYElmT9GOOBJiLApi9vRpCqG/9XD5p06lU6tDQ0NB43f7sKiAW8mTHjx//BICvElGvlJIAQAgBZiYAUGkeSIji6uW5MnuI2iaiQhn6783fmvUxy9fK5XL7mnFL4JenpxkE0vM729vbt549e3YoqOxGYEEU4M033+xNp9MvCiEGgPwfavY+lQ6t51aa3AlwA2p/goiuSSnTQohrruumQ6HQ9VQqle7o6OCenp706tWr0wBw9OjRaE9PT9SrS7frulEA3ZZldRFRPzN3CSG6VF3L+Xq/eABG7/eLB9Rx3v4127ZfX4jYoOEEeO2119aGQqGvAIh5SQXjmT6x3HCuzLbaf08I8Y6U8lpbW9u7Dz/88O16tmNkZKTbsqylQohVAFYB6AMqjx6CyFEuzfttHMDphx566B/q2Q4TDSXAsWPHPs3Mz6pGmT3f7M2KBDX0/AtCiJ+6rjuycePGVCPbYmJkZKTbtu2VlmUNMvNKBMQDqKL3+xhfH0q+tX79+rca1Y6GEeDYsWP/HMBGv6g+aMXNC+wq9fwxZj5LRD9ZaKMHYWxsrCuZTK6yLOsxAJ1eclVDRTMNxcZXynBu/fr1pxpR97oTYGRkpC2RSPwOgLXKaGUi7kBX4KMCF4jorzdu3Hih3nWuJ95+++2VlmU9xswfgKEKfoSAZnD4GF8dQ0SXHMd5Y3BwMFvP+taVAEePHl0ihPgdZr7PGKb5yn2QK9B7BjO/6TjOm0888cRYPevaaJw6daqrra3to5Zlratmosj7WeAw0jt2wnXdI4ODg4l61bNuBPCM/3Vm7gWKx+9B+36uQG0D+AfHcV4ZHh5umnnzueDUqVNdXV1dmwGs8Ov9fsYHfINCBgDLsuLZbPZv6kWCuhDg6NGjSwD8ayLq9ZICje6zbwaB4wAObtq06e161K1ZcObMmXWWZQ0B6ABKDBwo/fq3yrcsK57L5Q7VgwTzJsDIyEhbPB7/A+SHRvCTfnM/KB4AcGRycvKvnn322Zn51qtZMTo6OsTMj5YzfpkRQSFdSjkhpTw035jAns+PASAej3+JiO5TAZs3W8fIk8t332skeYERmHmCiL6zadOmho55mwHr1q0bGR0dvQbgSWhqoBtX/9bWDIpIIYRYZNv2kwBenU995qUAhw8ffkEI8c/0yhpBH1Ac3JUEhVLKv4/H49+5l3u9H0ZHRzuZ+SMAPhi0dgAEuwX1f0sp33nooYdOzrUecybAa6+99ptE9Jxu9ICp3UKlTRIIIfZv2rTp8FzrcC/g/PnzHxFCfNjbrdjzzXwAsCzrzAMPPHBmLuef02LQkSNHPg7gN9W+uZij9v2+vQWclOu6u3/ZjQ8A69evf0tKeRhAxkuqyfiu68J13Q1nz57tn8v5aybA8ePH++AZ3zMomSt6QggoS2tGV/mpbDb7rc2bN5+YS4XvRaxfv/5Se3v7/0N+/r9q4wNgy7IYAKLR6Mfff//99lrPXTMBcrncbxNRHzOT3rP9lnV1Enj7vwDwh08//fTlWs97r2PVqlUTruv+NYB4tcZX6R5CyWTy8VrPWxMBDh8+/DyA9apX6+vwigTK6D4k+IWU8pvDw8MLesHD3YTBwcGE67p/Y1mWWgauaHzXdQEAnhIsHR0dXVvLOasmwJEjR+4HsFU3uCKC6espH+2RlJKklOT1/G+0jF8Zg4ODiVwudwhARpsnYM3YhUDbmxRiy7LYdV0wM9u2/eELFy4srfZ8tSjA1zDbocknsCsihnIJRDRj2/Z/aRm/egwODiYcx3mViLJ+/l6L/n3XDojoo9WeqyoCvPrqq9uYWV0AURg6mj0fBjE8EvzPj33sYy2fXyMGBwcnmHnE2y3y96rnq16v/UwRon1sbGywmvNUJMDx48f7hBBPKFn3TkDw1MDPJWBWDf588+bNp6tscwsGBgYG3pFSjgBF6wAFyTeUoEASb1FtgJlDlc5RkQDpdHo7gKW6rJvyb6YBgJTyjc2bN//ZXBvfQh5r164dZeYrZq/XJV+RQakD8jFD6N133/2VSuWXJcChQ4eWIj9nnT+TRwJ9yKerAWZnFsez2WzL+HVCLpc7RUQJn+Fh0GgAruuCiO4fGxvrK1d2WQIIIf4QyA/p9Fm+IDVQ31LKP/3kJz95V9wefTdgcHAwS0SnzJGAGRMohYAWMFqW9VC5sgMJcOjQoQ8BWEoeRP4a+iIiqHRjwueVp5566vz8m92CjjVr1ty0bfvn+khAN7x3WNFIwUNfORUIJAARfcrs4fpMn6kIXt74U089dbA+TW7BRDKZPEdECS/yL+rx0OYHTFUopwK+BPB8/2Nexy4yvq4IOhG8UULL+A3E4OBg1nGcvy/X4wEUuQMvbui9du3aEr8yfQkghPgtYDbAU+k+I4CCIjDz+aeffvr1OrW1hQCsXbv2PSK6iTI9Xhledw/ZbPY+v/JKCHDo0KGlUsrNurGRJwEFKYKnBv+t/s1tIQBvA7PXXZQzvCIIgOV+8wJ+CvCsOdtnDvnMPGY+9swzz9ysaxNbCMTq1asnmfmimgAyDe84jm54AAAz2xcvXnzQLKuEAMz8uDam9w0CVR5m1/gP1L2VLZSFlPKSEegVDK8NAQuLSQAg8vc1FqGIAIcOHVoNb9ZPk3jAhwgaGc61ev/CY2Bg4BYR3dJ7ux4cwlMGIE8EL06I/fznPy8KBosIQESf9pN/Y46/cN++l9fq/XcI0Wj0Z5rRAa23K1VgZnYcByotGo0WXTpWRABm3uB9m728ZB4AeVW49cwzz/y0EY1roTJWrFgxLqUch2F4ZXTHcfSAkF3XhZSyyA0UCPCjH/1oAzP3q3F+kOQbqrB/wVrbgi+klNfN3q7HBfrUsGVZLISwr169qu7gmiWA67qP64ZWU7xBxvd+1ur9dxhTU1OX9eDPnB3UXYQ2Z1BwAwUCSCkf1A4sGFqt/pnKQESt4K8JMDQ0lBNCjFcyuj4ktCyrS20LADhw4EAHgA3lfL+pDFLKI41vXgtV4royuj4qMIxeGBI6jrN4ZGQkBHgE6OzsfADabJ85D+DnArLZbEv+mwTj4+NXzaGgHvzBGBJalsX9/f2dgEcAFf1728TFgV7h8m/t849btmy5seAtbcEXQ0NDuXA4PGUa3Jwo0qeLASwGZu8OfliXfWD2vr6A9LONblQLtSGXy00wc5cxLwDzSiHLslRWEQEe9Hq7HjyU3DhKs7d/twjQZBBCTLmuW1gVVOnK4GoyyEtjZu4EANsLADvUFT9+hZP3UAdFilwu927DWtLCXDGhG17NB6h9recDAIjIvnLlSkzEYrEHTb9v9n6v1yvcbPn/5sOqVatSzDzjsy6gwOYnGo3aNhG1Ix/to5ILAADvYoQWmhBSyng4HI4CxZJvQpEjlUp12kT0IFC06qei/qIfaUHhO42pfgvzhRAipy/8qHSTDGo/Go1GbWZeg9InawMoeUq2mgtoKUCTwrbt6VwutxwoNrpt26Y7AACk0+mYTUQd3h28JQf5uQHXdVv+v0nhOI5jGlutCprwFCJqA9Bn/hDkAhSEEHV7SmUL9cXMzEy8o6OjyHBm9K8jHA5btpRyGQJcgALNPtwJRNRSgCZFe3u7oyZ+gOI4wA9SSlsULvUtA88VlAwPW2gurFy5smjat9LxzMw2M3eghsfFJZPJlgtoXjgAKhpeQQhh25h9vn1V2L59e4sATQoicq5fv141AQBY835UbAvNhXITQH4QAJJ+U8FBn6NHj3Y0puotzBfMbANg27ar+gghcjYzJ9XKUDWYmZnpANByA02Iixcv2pFIhIOG8CaEEDl9HqCActF+Op1ujQSaGyXWt+28p3ccp8R2NjwXUGXhFA6HWy6gSdHd3R1xHIdNQ2txQRE5hBBpgbycU5UfeGsHLTQhZmZmbM/YJUu/+kfFAOwFDe/rhehqoKaEdRfhum5Nw8YWFg5Syoi+pqOkX4fruqQpgmMz8/vQJoJ8JgZJDyqIaKCOdW6hjgiHwxFzUc/H77Mihuu6yRIClIN3ZVBLAZoUzNxGRGYMwH5KAADt7e0J27KsMX0BoVxA6KnDB+tU3xbqDMuywswcuP4PFCvC+Pi4K7LZbCLoWkAygLxSLH/llVeWN64ZLcwFY2NjESllhH2Qy+WQy+UA5C8OUZ/Lly8nxdatW68DSJjG1lcJzdlA27Y/cqca2oI/+vr62mBE+SpPj/oVpJTO8PCwk78WnKjwWtZyVwhraS030GSQUnYqQ2tXAZUM/7SfJIHZu4P/LuhycHUtALTnAUspH21we1qoEd50PudyucLNoaYS6KRwXXca8AhgWdZbfj3f775Ar6wP/vCHP2yNBpoEY2NjkWw22+b5eQ6FQhwKhQq+3ySEbdsci8WmAe/WMCnlmD7+V4bWx/+mOkgpfx3Avoa3roWK6O/v78hkMvo9HXAch0KhUNFoIJfLFWw4Ojo6A3gKsGXLljgRvWW6gYDRAXnPB3iyUQ1qoTZkMpleeNKuer0e9GmjAEZeIaaHh4cdoPgJIWMBwV/J4MDLG2q5gTsPZg4j/w5iBgAl/9AIYV4HkM1mC6/pLRCAiI5p5aqgrzAaNInBzOQ4zrMNb2ELZfHee+91ahcAFBkeyBMChjqEQqHb6vcFAjz33HOniUjNB/gGfz7qMLwAbWyhDGKxWD+AokAPKDa8OjYUCrEQItPX16feS1jynMC/rGR0fVjIzEMHDx4canQjW/DHzZs3O1zXDWPWt5cMA71DC2Rg5rhehkmAY9p2yeNioT0xHLPXCPyL+jethWoQDof7mVn5fOjDQLVvEAHLli0rurGniADPP//8CIDrZm/XA0IUXxxCzPyr+/fv/9WGtLCFQJw7dy4spWwPhUKczWahiKBUAMZ8ADOzECJDRCm9HL/Hxf9fBPd23+cHW5b16UY1tAV/LFu2bCm8wE4Zmpk5m83CnAjS8ifNckoIYNv2y8i/xtyvtxfNB2hK8RsHDx5c14iGtlCKc+fOhYmoRxkbxRF+gQiae+BcLofe3t6SN7mVEMCbFHpd7ZtzAvAnBUkpv96AtrbggxUrVqwIhUIcDocLUb4x/i/sZ7NZAIDjOBNElDXL8n1nEDP/nwDDq3wzDwA+um/fvk/UoX0tlMHt27d7bNtuUz3cMzADKBhb7euKcPv27ff9ygu8+ufgwYPfZuai4M5nSthMv5bNZre+8MIL03NqXQsVMTU1tcZxnLC3q1/LWWQb/TdENL1o0aJLfuUFvjfQcZw/UdtBauCzgviBUCj0r2prUgvVYnp6ekkulwsxsy7/5suhAEMRcrncL4LKDCTAjh07fgJgJMANFJFAfXufXQcOHKj6/fUtVIdr1661ZbPZJeFwmMPhMGcyGXgkAABFiCIihMNhdl03u3Tp0sBb+Sq9O/i/o4zhjfmCwuKBlPIbe/fu7fIrs4Xawcyhtra2ZarXZ7NZKBIoNVCxgEmEmzdv/mO5sssSYOvWrT8RQvyF/gwhr/AiEvi8P/gDoVDo38+n0S3M4tatW71CCBue3CuD+6mBSgcAZp4cHBwsifx1lCUAAIRCoW8yc8IrsKTXw3ijmPqWUj69b9++F+fU4hYKmJqaWhyJRIpW/DSDB6qB67rZ3t7eio/0q0iALVu2xJl5T1Cv11cNVT5QcAf/9uWXX9469+b/coOZ25F/qndB1jOZDCKRSCH4C1ID13UniShX6RxV3+p94MCBw1LKDwDFQw4fRTDdwTQRfXbHjh0/q/ZcLeSv8+vr61sBQH+QV8l/nMlkKBKJAACy2SyFw2Gk02ln6dKlF6o5T0UF0PBvdF8PlBpfv4JEy+uWUr68d+/elTWc65cazGz39vb2YzbgNpd1C2mRSIQzmQyAWTVIJpNXqz1X1QTYvn373zLzN7yT+8YCep6xaNQthNjXIkFlMLOdSqWWCSEsJfXRaJSZmb19IMAlZDIZZLPZ8dWrV6erPV/VLkDhwIED35NSPlZG8osUwUh/j5l3vPDCC1Uz9JcJzGxPTEwsE0LY0Wi0IO+ZTIai0Wjh6SxBLiGXy6V6e3uv1HLOWlyAwh8gv1pYOLFX+Wq+Vwoh/vfevXvXz+G89zTOnTsXnpiYWC6EsKLRKKfT6YK8RyIRTqfTiEajRfIPr9cDgJQyt3jxYt/5/nKoWQEAYN++fY8R0V61X0XPN91EnIh+77Of/eyhuZz/XgMzt6dSqR4iUg/2Lfq/KilBJBJBMpm82dvbW/MazFwUADt37nyTmf+rV/mqFcAjLhFRFzP/rz179nx1Lue/l8DMHalUalEqlRLMzKlUCgA4nU4Xvk0lgBEDZDKZibkYH5ijAijs37//m8y8tVLPZy56+7iZ/gPLsv7jzp07a/JddzuYWQDoSaVSMRg93vTx6XSazJhA5Qshprq6usbnWo85KYDCjh07vg7gTaCyAsDH+F769lwud3DPnj0b51OXuwnMHE4kEktmZmaiMzMzAFAS3at95ftNJQCAbDabnI/xgXkSAABc1/0KEf1MCBHY8/2UQaV726uY+ZU9e/Z8bb71aWYws2DmzmQyuVgIYbW1tXEsFisyPgwSqMDPJEE4HM709fXN++0t83IBCnv37l0phNgHYGUtAaE5jezV5wqAP961a9c99Wp6Zo7E4/FOIYSFYqkPGtoVpSs3kE6nKRKJOLFY7H0iqu3BwD6oCwGAPAmIaD80Eph+vwIpTEKcJKLf3bVr1+V61fFOgJntycnJjp6enhAASiaT1N7ejmQySabR9f1UKkWxWAzpdJpisZgqjmZmZtzFixfXxfiFE9cLHgn+BzMPBgV90Ayt56H0IhOVvp+IvnW3EYGZQwAi8Xg82tnZiUQiQQCoo6MDyWQysOcTUcH4JgmklLm2trZb9TJ+4aT1xN69e7uI6I8BPAOUHwn4KUIZQpwQQvyHXbt2/bjeda4nOP/wzRiAUDwep87OTgCgRCJBHR0dSCQSRT2/vb0dMzMzgYRQJHBdN9PR0TFORLKe9a07ARS+//3v/ztm/iJQMR7wGyX45nskuszM37Qs68fNogpePcMAQsg/dIOmp6epq6sL8XicAJCuAkD+v6jGFQBALpeb6e7unmhE3RtGAADwJnq+ClScHSxJU4pRgRAnhBDfdxznx1/84hcvNbItJry62PCMfvv2bVq0aBEA0NTUFHV3dwMAKRWIx+NERAUVqMYVAEAqlYrPdZKnGjSUAACwZ8+e7QC+6g31fOcGUGXvV+k+LoOI6Cwzv8HMbwA4U29CeOexkB86q28CQBMTE7R48WIAoMnJSerp6QGqVAG9/cY+X7t2bWJgYCBTz3aYaDgBAGDfvn2rHMf5TwA2AnMLBqslhMojoktSyitCiLcBXJJSXrYsazKTyVwCgGg0OvmFL3yh6F45H2IqIxeMDYBu3LhB/f39AEDj4+O0ZMmSonqjRhUwXYHrutnOzs5JIpp9hGuDsCAEUNizZ8/XmPn31LkD5gECYwM9kAwKGPW8oGO9aVi1nwbwUwD7Ozs7v7t8+fLJJ598slDmhQsXaM2aNYX969ev0/LlywGAbt26RX19fYCnAkREixYtwuTkJBERdXd3I0gF/AJCAEgkEvFly5Yl5/lXV415zwTWgs997nN/ZNv2UwCu6r1fh2a4ojSgeF5Bh3Z8JULrvVkhCmAIwB8lEonXLl26dH+5ApYvXx74HN5FixYV8rq7u0uO6+zs5Hg8v5KeSOQv1Vczfu3t7U57e/vEQhofWGAF0PHd73739wH8FoD79LpU2/v1Y/2CxYBYwfIjnQ4iOtvT0/OJbdu2TRr1oKtXr9LKlSuBMm7ALxisoALo6OiYIaIFNbzCgiqAjs9//vPfCofDz3mzh4U/ei69XzeqcbxejqhkfO+4DdPT05/3y1u5cmWhV/f39/sqgVKBycnJsirgveM37Y3t74jxgTtIAADYuXPnlV27dv0uET0K4Aoz+wViga7C+/Yt20wvYVYZSCl3AMD58+cLaRcvXixsX79+vbB969YtLFmyhAFgYiI/VL99+zZ6enoYAKamptDV1cXT09MF4zuOkwMwRURx8nlr+0LijrkAP3z729/+mGVZvw3gk0DJo2kAlI/+1bafu5BShmqoSvrLX/6yurXNdEm+20FuQOVPT0+T4zjO4sWLU1TF9foLhTuqACZeeumlH7/44oufE0J8mJnNx9D6qUBgWeXyqsHp06d9069enb2e9caN0hepT0xMFLkBAHzjxo1sV1fXdG9v73QzGR9oMgUw8b3vfe8+13W/AuBTAO4HStcQKg0hNcWwq4kBvHJPf+lLX/qnWrmF8vRA0C9fmxRiADkAmTst8+XQ1ATQsXv37g0A/iUzb2Lm+4FSApRbXvbG/lUpnmVZv//SSy/9Z5SR/ID5AADIvf766656Fm+z464hgI7du3dvYuZfZ+aHAXzcSy77EAtvv+JIQBsG3kZ1BJDex12Imbt6464kgI7du3f3uK77sBBiEzN/nJkfYeaeoCVmZrbKFHe2o6PjNz7zmc+oVUY6f/48rV+/Hpj9r/j06dP86KOPugC4meW9Gtz1BPDD7t27e3K53COWZXVLKR8B8CsAegBASvlPkF/B60N+FrAwFRyNRr8Ti8Umt23bBgD4wQ9+gG3bthXux7vbje2H/w+qYgjT9YshxQAAAABJRU5ErkJggg==","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}]}