陈剑华

Merge remote-tracking branch 'origin/main'

Showing 47 changed files with 1308 additions and 583 deletions
1 { 1 {
2 "app": { 2 "app": {
3 - "bundleName": "com.wondertek.sight", 3 + "bundleName": "com.peopledailychina.hosactivity",
4 "vendor": "$string:app_vendor", 4 "vendor": "$string:app_vendor",
5 "versionCode": 1000000, 5 "versionCode": 1000000,
6 "versionName": "1.0.0", 6 "versionName": "1.0.0",
1 { 1 {
2 "app": { 2 "app": {
  3 + // "signingConfigs": [
  4 + // {
  5 + // "name": "default",
  6 + // "type": "HarmonyOS",
  7 + // "material": {
  8 + // "certpath": "C:\\Users\\pc\\.ohos\\config\\default_sight_harmony_l75MehGV9G3TUayEtL68-EIWqyYDqfVXfu9D-DPJ7I0=.cer",
  9 + // "storePassword": "0000001AB256FAF47AA4D68E4841C95D357490DE9FBB26A3A9161AD3069E31B3623E25CB49409CCA9CF7",
  10 + // "keyAlias": "debugKey",
  11 + // "keyPassword": "0000001AFB06818C2BC8DC275326668AAC62B91EBF7D3F84E8BE0F156D02623AA0F4F8C6B73F362CB371",
  12 + // "profile": "C:\\Users\\pc\\.ohos\\config\\default_sight_harmony_l75MehGV9G3TUayEtL68-EIWqyYDqfVXfu9D-DPJ7I0=.p7b",
  13 + // "signAlg": "SHA256withECDSA",
  14 + // "storeFile": "C:\\Users\\pc\\.ohos\\config\\default_sight_harmony_l75MehGV9G3TUayEtL68-EIWqyYDqfVXfu9D-DPJ7I0=.p12"
  15 + // }
  16 + // }
  17 + // ],
3 "signingConfigs": [ 18 "signingConfigs": [
4 { 19 {
5 "name": "default", 20 "name": "default",
6 "type": "HarmonyOS", 21 "type": "HarmonyOS",
7 "material": { 22 "material": {
8 - "certpath": "C:\\Users\\pc\\.ohos\\config\\default_sight_harmony_l75MehGV9G3TUayEtL68-EIWqyYDqfVXfu9D-DPJ7I0=.cer",  
9 - "storePassword": "0000001AB256FAF47AA4D68E4841C95D357490DE9FBB26A3A9161AD3069E31B3623E25CB49409CCA9CF7",  
10 - "keyAlias": "debugKey",  
11 - "keyPassword": "0000001AFB06818C2BC8DC275326668AAC62B91EBF7D3F84E8BE0F156D02623AA0F4F8C6B73F362CB371",  
12 - "profile": "C:\\Users\\pc\\.ohos\\config\\default_sight_harmony_l75MehGV9G3TUayEtL68-EIWqyYDqfVXfu9D-DPJ7I0=.p7b", 23 + "storePassword": "0000001EF28F8A628911F4F52B75E452C814EE4370854DD8DFCE186496B6AD88F8DE5AD3E10F24C1079F2EDD1FFF",
  24 + "certpath": "./singing_config/manual_com.peopledailychina.hosactivity_sign/鸿蒙中文版客户端证书.cer",
  25 + "keyAlias": "peopledailyhosalias",
  26 + "keyPassword": "0000001E2E8A50EFF2E6D2023242B432388B2748F8299D8BB319C0B06CFF7DCEA7482C5E3CDF1398CCE095BDC68B",
  27 + "profile": "./singing_config/manual_com.peopledailychina.hosactivity_sign/peopledaiychina-hos-profile-debugDebug.p7b",
13 "signAlg": "SHA256withECDSA", 28 "signAlg": "SHA256withECDSA",
14 - "storeFile": "C:\\Users\\pc\\.ohos\\config\\default_sight_harmony_l75MehGV9G3TUayEtL68-EIWqyYDqfVXfu9D-DPJ7I0=.p12" 29 + "storeFile": "./singing_config/manual_com.peopledailychina.hosactivity_sign/keystorefile.p12"
15 } 30 }
16 } 31 }
17 ], 32 ],
@@ -36,4 +36,16 @@ export class NetworkUtil { @@ -36,4 +36,16 @@ export class NetworkUtil {
36 return NetworkUtil.TYPE_NONE; 36 return NetworkUtil.TYPE_NONE;
37 } 37 }
38 } 38 }
  39 +
  40 + /**
  41 + * 判断网络是否已连接
  42 + * @returns
  43 + */
  44 + static isNetConnected(): boolean {
  45 + let type = NetworkManager.getInstance().getNetType()
  46 + if (type == NetworkType.TYPE_NONE) {
  47 + return false
  48 + }
  49 + return true
  50 + }
39 } 51 }
@@ -65,6 +65,8 @@ export function registerRouter() { @@ -65,6 +65,8 @@ export function registerRouter() {
65 return WDRouterPage.audioDetail 65 return WDRouterPage.audioDetail
66 } else if (action.params?.detailPageType == 18) { 66 } else if (action.params?.detailPageType == 18) {
67 return WDRouterPage.multiPictureListPage 67 return WDRouterPage.multiPictureListPage
  68 + } else if (action.params?.detailPageType == 19) {
  69 + return WDRouterPage.videoPlayPage
68 }else if (action.params?.detailPageType == 30) { 70 }else if (action.params?.detailPageType == 30) {
69 return WDRouterPage.themeListPage 71 return WDRouterPage.themeListPage
70 } 72 }
@@ -59,6 +59,8 @@ export class WDRouterPage { @@ -59,6 +59,8 @@ export class WDRouterPage {
59 static multiPictureDetailPage = new WDRouterPage("phone", "ets/pages/detail/MultiPictureDetailPage"); 59 static multiPictureDetailPage = new WDRouterPage("phone", "ets/pages/detail/MultiPictureDetailPage");
60 //大图列表页 60 //大图列表页
61 static multiPictureListPage = new WDRouterPage("wdComponent", "ets/pages/MultiPictureListPage"); 61 static multiPictureListPage = new WDRouterPage("wdComponent", "ets/pages/MultiPictureListPage");
  62 + //单个视频播放页
  63 + static videoPlayPage = new WDRouterPage("wdComponent", "ets/pages/VideoPlayPage");
62 // 音乐详情页 64 // 音乐详情页
63 static audioDetail = new WDRouterPage("phone", "ets/pages/detail/AudioDetail"); 65 static audioDetail = new WDRouterPage("phone", "ets/pages/detail/AudioDetail");
64 // 动态详情页 66 // 动态详情页
@@ -257,4 +257,20 @@ export class ProcessUtils { @@ -257,4 +257,20 @@ export class ProcessUtils {
257 Logger.error(TAG, 'jumpExternalWebPage success, error: ' + JSON.stringify(err)) 257 Logger.error(TAG, 'jumpExternalWebPage success, error: ' + JSON.stringify(err))
258 }) 258 })
259 } 259 }
  260 +
  261 + /**
  262 + * 打开端内web页面
  263 + * @param url web地址
  264 + */
  265 + public static gotoDefaultWebPage(url: string) {
  266 + let taskAction: Action = {
  267 + type: 'JUMP_H5_BY_WEB_VIEW',
  268 + params: {
  269 + url: url,
  270 + } as Params,
  271 + };
  272 + WDRouterRule.jumpWithAction(taskAction)
  273 + }
  274 +
  275 +
260 } 276 }
@@ -19,7 +19,10 @@ export interface Params { @@ -19,7 +19,10 @@ export interface Params {
19 // 13.音频详情页 19 // 13.音频详情页
20 // 17.多图(图集)详情页 20 // 17.多图(图集)详情页
21 // 18.大图列表页 21 // 18.大图列表页
  22 + // 19.单个视频播放页
22 detailPageType?: number; // 详情页类型 23 detailPageType?: number; // 详情页类型
23 liveStyle?: number; // 直播类型:0横屏,1竖屏 24 liveStyle?: number; // 直播类型:0横屏,1竖屏
24 creatorId?: string; //号主id 25 creatorId?: string; //号主id
  26 + videoUrl?: string;
  27 + videoCoverUrl?: string;
25 } 28 }
@@ -16,4 +16,11 @@ export interface LiveRoomItemBean { @@ -16,4 +16,11 @@ export interface LiveRoomItemBean {
16 //是否置顶 1置顶0不置顶 16 //是否置顶 1置顶0不置顶
17 isTop: number 17 isTop: number
18 role: string 18 role: string
  19 + //ZH_TEXT_AND_IMAGE_MSG :图文,ZH_TEXT_MSG:文本,ZH_VIDEO_MSG:视频,ZH_AUDIO_MSG:音频
  20 + dataType: string
  21 + transcodeImageUrl: string
  22 + videoUrl: string
  23 + pictureResolutions: string[]
  24 + //音视频长度
  25 + duration: number
19 } 26 }
@@ -14,6 +14,7 @@ import display from '@ohos.display'; @@ -14,6 +14,7 @@ import display from '@ohos.display';
14 import { BusinessError } from '@ohos.base'; 14 import { BusinessError } from '@ohos.base';
15 import { CommonConstants } from 'wdConstant/Index'; 15 import { CommonConstants } from 'wdConstant/Index';
16 import { CardMediaInfo } from '../components/cardCommon/CardMediaInfo' 16 import { CardMediaInfo } from '../components/cardCommon/CardMediaInfo'
  17 +import router from '@ohos.router';
17 const TAG = 'DynamicDetailComponent' 18 const TAG = 'DynamicDetailComponent'
18 @Preview 19 @Preview
19 @Component 20 @Component
@@ -32,6 +33,7 @@ export struct DynamicDetailComponent { @@ -32,6 +33,7 @@ export struct DynamicDetailComponent {
32 newsType:15 33 newsType:15
33 } as ContentDetailDTO 34 } as ContentDetailDTO
34 //变量 35 //变量
  36 + scroller: Scroller = new Scroller();
35 /** 37 /**
36 * 默认未关注 点击去关注 38 * 默认未关注 点击去关注
37 */ 39 */
@@ -55,7 +57,6 @@ export struct DynamicDetailComponent { @@ -55,7 +57,6 @@ export struct DynamicDetailComponent {
55 } 57 }
56 58
57 build() { 59 build() {
58 - Row() {  
59 Column(){ 60 Column(){
60 //logo、日期 61 //logo、日期
61 Row() { 62 Row() {
@@ -77,259 +78,307 @@ export struct DynamicDetailComponent { @@ -77,259 +78,307 @@ export struct DynamicDetailComponent {
77 .width('100%') 78 .width('100%')
78 .height($r('app.float.margin_7')) 79 .height($r('app.float.margin_7'))
79 .margin({left: $r('app.float.margin_16'), right: $r('app.float.margin_16')} ) 80 .margin({left: $r('app.float.margin_16'), right: $r('app.float.margin_16')} )
80 - //号主信息  
81 - Row() {  
82 - //头像  
83 - Stack() {  
84 - Image(this.contentDetailData.rmhInfo?.rmhHeadUrl)  
85 - .alt(this.contentDetailData.rmhInfo?.userType=='1'?$r('app.media.default_head'):$r('app.media.icon_default_head_mater'))  
86 - .width($r('app.float.margin_32'))  
87 - .height($r('app.float.margin_32'))  
88 - .objectFit(ImageFit.Cover)  
89 - .borderRadius($r('app.float.margin_16'))  
90 - Image($r('app.media.icon_border_test'))  
91 - .width($r('app.float.margin_48'))  
92 - .height($r('app.float.margin_48'))  
93 - .objectFit(ImageFit.Cover)  
94 - .borderRadius($r('app.float.margin_24'))  
95 - }  
96 - .width($r('app.float.margin_48'))  
97 - .height($r('app.float.margin_48'))  
98 - .alignContent(Alignment.Center)  
99 - Column(){  
100 - //昵称  
101 - Text(this.contentDetailData.rmhInfo?.rmhName)  
102 - .fontSize($r('app.float.font_size_14'))  
103 - .fontColor($r('app.color.color_222222'))  
104 - .fontWeight(FontWeight.Medium)  
105 - .margin({ left: $r('app.float.margin_5') })  
106 - .alignSelf(ItemAlign.Start)  
107 - //简介  
108 - Text(this.contentDetailData.rmhInfo?.rmhDesc)  
109 - .fontSize($r('app.float.font_size_14'))  
110 - .fontColor($r('app.color.color_B0B0B0'))  
111 - .fontWeight(FontWeight.Medium)  
112 - .maxLines(1)  
113 - .margin({ left: $r('app.float.margin_5') })  
114 - .alignSelf(ItemAlign.Start)  
115 - }  
116 - .width('63%')  
117 - .margin({right: $r('app.float.margin_6')})  
118 - if (this.followStatus == '0') {  
119 - Text('关注')  
120 - .width($r('app.float.margin_54'))  
121 - .height($r('app.float.margin_24'))  
122 - .textAlign(TextAlign.Center)  
123 - .fontSize($r('app.float.font_size_12'))  
124 - .borderRadius($r('app.float.vp_3'))  
125 - .backgroundColor($r('app.color.color_ED2800'))  
126 - .fontColor($r('app.color.color_fff'))  
127 - .onClick(() => {  
128 - // this.handleAccention(this.item, 1)  
129 - })  
130 - } else {  
131 - Text('已关注')  
132 - .width($r('app.float.margin_54'))  
133 - .height($r('app.float.margin_24'))  
134 - .borderWidth(1)  
135 - .textAlign(TextAlign.Center)  
136 - .fontSize($r('app.float.font_size_12'))  
137 - .borderRadius($r('app.float.vp_3'))  
138 - .borderColor($r('app.color.color_CCCCCC'))  
139 - .fontColor($r('app.color.color_CCCCCC'))  
140 - .onClick(() => {  
141 - // this.handleAccention(this.item, 0)  
142 - })  
143 - }  
144 - }  
145 - .width('100%')  
146 - .margin({ left: $r('app.float.margin_16')})  
147 - //内容  
148 - Text(StringUtils.isEmpty(this.contentDetailData.newsContent)  
149 - ?StringUtils.isEmpty(this.contentDetailData.newsSummary)  
150 - ?this.contentDetailData.newsTitle  
151 - :this.contentDetailData.newsSummary  
152 - :this.contentDetailData.newsContent)  
153 - .fontColor($r('app.color.color_222222'))  
154 - .fontSize($r('app.float.font_size_18'))  
155 - .lineHeight($r('app.float.margin_25'))  
156 - .margin({ top: $r('app.float.margin_6')  
157 - ,left: $r('app.float.margin_16')  
158 - ,right: $r('app.float.margin_16') })  
159 - .alignSelf(ItemAlign.Start)  
160 - if(this.contentDetailData.newsType+"" == ContentConstants.TYPE_FOURTEEN){  
161 - //附件内容:图片/视频  
162 - if(this.contentDetailData.photoList!= null && this.contentDetailData.photoList.length>0){  
163 - // 图片-从无图到9图展示  
164 - GridRow({  
165 - gutter: { x: 2, y: 2 }  
166 - }) {  
167 - ForEach(this.contentDetailData.photoList, (item: PhotoListBean, index: number) => {  
168 - if (this.contentDetailData.photoList.length === 1) {  
169 - if (this.getPicType(item) !== 3) {  
170 - GridCol({  
171 - span: this.getPicType(item) === 1 ? 12 : 8  
172 - }){  
173 - Stack({  
174 - alignContent: Alignment.BottomEnd  
175 - }) {  
176 - if (this.getPicType(item) === 1) { 81 + Stack({ alignContent: Alignment.Bottom }) {
  82 + Scroll(this.scroller) {
  83 + Column() {
  84 + //号主信息
  85 + Row() {
  86 + //头像
  87 + Stack() {
  88 + Image(this.contentDetailData.rmhInfo?.rmhHeadUrl)
  89 + .alt(this.contentDetailData.rmhInfo?.userType=='1'?$r('app.media.default_head'):$r('app.media.icon_default_head_mater'))
  90 + .width($r('app.float.margin_32'))
  91 + .height($r('app.float.margin_32'))
  92 + .objectFit(ImageFit.Cover)
  93 + .borderRadius($r('app.float.margin_16'))
  94 + Image($r('app.media.icon_border_test'))
  95 + .width($r('app.float.margin_48'))
  96 + .height($r('app.float.margin_48'))
  97 + .objectFit(ImageFit.Cover)
  98 + .borderRadius($r('app.float.margin_24'))
  99 + }
  100 + .width($r('app.float.margin_48'))
  101 + .height($r('app.float.margin_48'))
  102 + .alignContent(Alignment.Center)
  103 + Column(){
  104 + //昵称
  105 + Text(this.contentDetailData.rmhInfo?.rmhName)
  106 + .fontSize($r('app.float.font_size_14'))
  107 + .fontColor($r('app.color.color_222222'))
  108 + .fontWeight(FontWeight.Medium)
  109 + .margin({ left: $r('app.float.margin_5') })
  110 + .alignSelf(ItemAlign.Start)
  111 + //简介
  112 + Text(this.contentDetailData.rmhInfo?.rmhDesc)
  113 + .fontSize($r('app.float.font_size_14'))
  114 + .fontColor($r('app.color.color_B0B0B0'))
  115 + .fontWeight(FontWeight.Medium)
  116 + .maxLines(1)
  117 + .textOverflow({ overflow: TextOverflow.Ellipsis })
  118 + .margin({ left: $r('app.float.margin_5') })
  119 + .alignSelf(ItemAlign.Start)
  120 + }
  121 + .width('63%')
  122 + .margin({right: $r('app.float.margin_6')})
  123 + if (this.followStatus == '0') {
  124 + Text('关注')
  125 + .width($r('app.float.margin_54'))
  126 + .height($r('app.float.margin_24'))
  127 + .textAlign(TextAlign.Center)
  128 + .fontSize($r('app.float.font_size_12'))
  129 + .borderRadius($r('app.float.vp_3'))
  130 + .backgroundColor($r('app.color.color_ED2800'))
  131 + .fontColor($r('app.color.color_fff'))
  132 + .onClick(() => {
  133 + // this.handleAccention(this.item, 1)
  134 + })
  135 + } else {
  136 + Text('已关注')
  137 + .width($r('app.float.margin_54'))
  138 + .height($r('app.float.margin_24'))
  139 + .borderWidth(1)
  140 + .textAlign(TextAlign.Center)
  141 + .fontSize($r('app.float.font_size_12'))
  142 + .borderRadius($r('app.float.vp_3'))
  143 + .borderColor($r('app.color.color_CCCCCC'))
  144 + .fontColor($r('app.color.color_CCCCCC'))
  145 + .onClick(() => {
  146 + // this.handleAccention(this.item, 0)
  147 + })
  148 + }
  149 + }
  150 + .width('100%')
  151 + .margin({ left: $r('app.float.margin_16')})
  152 + //内容
  153 + Text(StringUtils.isEmpty(this.contentDetailData.newsContent)
  154 + ?StringUtils.isEmpty(this.contentDetailData.newsSummary)
  155 + ?this.contentDetailData.newsTitle
  156 + :this.contentDetailData.newsSummary
  157 + :this.contentDetailData.newsContent)
  158 + .fontColor($r('app.color.color_222222'))
  159 + .fontSize($r('app.float.font_size_18'))
  160 + .lineHeight($r('app.float.margin_25'))
  161 + .margin({ top: $r('app.float.margin_6')
  162 + ,left: $r('app.float.margin_16')
  163 + ,right: $r('app.float.margin_16') })
  164 + .alignSelf(ItemAlign.Start)
  165 + if(this.contentDetailData.newsType+"" == ContentConstants.TYPE_FOURTEEN){
  166 + //附件内容:图片/视频
  167 + if(this.contentDetailData.photoList!= null && this.contentDetailData.photoList.length>0){
  168 + // 图片-从无图到9图展示
  169 + GridRow({
  170 + gutter: { x: 2, y: 2 }
  171 + }) {
  172 + ForEach(this.contentDetailData.photoList, (item: PhotoListBean, index: number) => {
  173 + if (this.contentDetailData.photoList.length === 1) {
  174 + if (this.getPicType(item) !== 3) {
  175 + GridCol({
  176 + span: this.getPicType(item) === 1 ? 12 : 8
  177 + }){
  178 + Stack({
  179 + alignContent: Alignment.BottomEnd
  180 + }) {
  181 + if (this.getPicType(item) === 1) {
  182 + Image(item.picPath)
  183 + .width('100%')
  184 + .height(172)
  185 + .autoResize(true)
  186 + .borderRadius(this.caclImageRadius(index))
  187 + } else if (this.getPicType(item) === 2) {
  188 + Image(item.picPath)
  189 + .width('100%')
  190 + .height(305)
  191 + .autoResize(true)
  192 + .borderRadius(this.caclImageRadius(index))
  193 + }
  194 + Flex({ direction: FlexDirection.Row }) {
  195 + Image($r('app.media.icon_long_pic'))
  196 + .width(14)
  197 + .height(14)
  198 + .margin({right: 4})
  199 + Text('长图')
  200 + .fontSize(12)
  201 + .fontWeight(400)
  202 + .fontColor(0xffffff)
  203 + .fontFamily('PingFang SC')
  204 + }
  205 + .width(48)
  206 + .padding({bottom: 9})
  207 +
  208 + }
  209 + }
  210 + .onClick((event: ClickEvent) => {
  211 + ProcessUtils.gotoMultiPictureListPage(this.contentDetailData.photoList)
  212 + })
  213 + } else {
  214 + GridCol({
  215 + span: { xs: 8 }
  216 + }) {
  217 + Image(item.picPath)
  218 + .width('100%')
  219 + .borderRadius(this.caclImageRadius(index))
  220 + .autoResize(true)
  221 + .opacity(!item.width && !item.height ? 0 : 1)
  222 + .onComplete(callback => {
  223 + item.width = callback?.width || 0;
  224 + item.height = callback?.height || 0;
  225 + })
  226 + }
  227 + }
  228 + } else if (this.contentDetailData.photoList.length === 4) {
  229 + GridCol({
  230 + span: { xs: 4 }
  231 + }) {
177 Image(item.picPath) 232 Image(item.picPath)
178 - .width('100%')  
179 - .height(172)  
180 - .autoResize(true) 233 + .aspectRatio(1)
181 .borderRadius(this.caclImageRadius(index)) 234 .borderRadius(this.caclImageRadius(index))
182 - } else if (this.getPicType(item) === 2) { 235 + }
  236 + } else {
  237 + GridCol({
  238 + span: { sm: 4, lg: 3 }
  239 + }) {
183 Image(item.picPath) 240 Image(item.picPath)
184 - .width('100%')  
185 - .height(305)  
186 - .autoResize(true) 241 + .aspectRatio(1)
187 .borderRadius(this.caclImageRadius(index)) 242 .borderRadius(this.caclImageRadius(index))
188 } 243 }
189 - Flex({ direction: FlexDirection.Row }) {  
190 - Image($r('app.media.icon_long_pic'))  
191 - .width(14)  
192 - .height(14)  
193 - .margin({right: 4})  
194 - Text('长图')  
195 - .fontSize(12)  
196 - .fontWeight(400)  
197 - .fontColor(0xffffff)  
198 - .fontFamily('PingFang SC')  
199 - }  
200 - .width(48)  
201 - .padding({bottom: 9})  
202 -  
203 } 244 }
204 - }  
205 - .onClick((event: ClickEvent) => {  
206 - ProcessUtils.gotoMultiPictureListPage(this.contentDetailData.photoList)  
207 }) 245 })
208 - } else {  
209 - GridCol({  
210 - span: { xs: 8 }  
211 - }) {  
212 - Image(item.picPath)  
213 - .width('100%')  
214 - .borderRadius(this.caclImageRadius(index))  
215 - .autoResize(true)  
216 - .opacity(!item.width && !item.height ? 0 : 1)  
217 - .onComplete(callback => {  
218 - item.width = callback?.width || 0;  
219 - item.height = callback?.height || 0;  
220 - })  
221 - }  
222 - }  
223 - } else if (this.contentDetailData.photoList.length === 4) {  
224 - GridCol({  
225 - span: { xs: 4 }  
226 - }) {  
227 - Image(item.picPath)  
228 - .aspectRatio(1)  
229 - .borderRadius(this.caclImageRadius(index))  
230 - }  
231 - } else {  
232 - GridCol({  
233 - span: { sm: 4, lg: 3 }  
234 - }) {  
235 - Image(item.picPath)  
236 - .aspectRatio(1)  
237 - .borderRadius(this.caclImageRadius(index))  
238 } 246 }
  247 + .margin({ left: $r('app.float.margin_16'),right: $r('app.float.margin_16'),top: $r('app.float.margin_8')})
239 } 248 }
240 - })  
241 - }  
242 - .margin({ left: $r('app.float.margin_16'),right: $r('app.float.margin_16'),top: $r('app.float.margin_8')})  
243 - }  
244 - }else{  
245 - if(this.contentDetailData.videoInfo!= null && this.contentDetailData.videoInfo.length>0){  
246 - GridRow() {  
247 - if (this.contentDetailData.videoInfo[0].videoLandScape === 1) {  
248 - // 横屏  
249 - GridCol({  
250 - span: { xs: 12 }  
251 - }) {  
252 - Stack() {  
253 - Image(this.contentDetailData.fullColumnImgUrls!= null && this.contentDetailData.fullColumnImgUrls.length>0&&!StringUtils.isEmpty(this.contentDetailData.fullColumnImgUrls[0].url)?  
254 - this.contentDetailData.fullColumnImgUrls[0].url:  
255 - this.contentDetailData.videoInfo[0].firstFrameImageUri)  
256 - .width(CommonConstants.FULL_WIDTH)  
257 - .aspectRatio(16 / 9)  
258 - .borderRadius($r('app.float.image_border_radius'))  
259 - CardMediaInfo({ contentDTO: this.mJumpInfo })  
260 - }  
261 - .align(Alignment.BottomEnd)  
262 - }  
263 - } else {  
264 - // 竖图显示,宽度占50%,高度自适应  
265 - GridCol({  
266 - span: { xs: 6 }  
267 - }) {  
268 - Stack() {  
269 - Image(this.contentDetailData.fullColumnImgUrls!= null && this.contentDetailData.fullColumnImgUrls.length>0&&!StringUtils.isEmpty(this.contentDetailData.fullColumnImgUrls[0].url)?  
270 - this.contentDetailData.fullColumnImgUrls[0].url:  
271 - this.contentDetailData.videoInfo[0].firstFrameImageUri)  
272 - .width(CommonConstants.FULL_WIDTH)  
273 - .borderRadius($r('app.float.image_border_radius'))  
274 - CardMediaInfo({ contentDTO: this.mJumpInfo }) 249 + }else{
  250 + if(this.contentDetailData.videoInfo!= null && this.contentDetailData.videoInfo.length>0){
  251 + GridRow() {
  252 + if (this.contentDetailData.videoInfo[0].videoLandScape === 1) {
  253 + // 横屏
  254 + GridCol({
  255 + span: { xs: 12 }
  256 + }) {
  257 + Stack() {
  258 + Image(this.contentDetailData.fullColumnImgUrls!= null && this.contentDetailData.fullColumnImgUrls.length>0&&!StringUtils.isEmpty(this.contentDetailData.fullColumnImgUrls[0].url)?
  259 + this.contentDetailData.fullColumnImgUrls[0].url:
  260 + this.contentDetailData.videoInfo[0].firstFrameImageUri)
  261 + .width(CommonConstants.FULL_WIDTH)
  262 + .aspectRatio(16 / 9)
  263 + .borderRadius($r('app.float.image_border_radius'))
  264 + CardMediaInfo({ contentDTO: this.mJumpInfo })
  265 + }
  266 + .align(Alignment.BottomEnd)
  267 + }
  268 + } else {
  269 + // 竖图显示,宽度占50%,高度自适应
  270 + GridCol({
  271 + span: { xs: 6 }
  272 + }) {
  273 + Stack() {
  274 + Image(this.contentDetailData.fullColumnImgUrls!= null && this.contentDetailData.fullColumnImgUrls.length>0&&!StringUtils.isEmpty(this.contentDetailData.fullColumnImgUrls[0].url)?
  275 + this.contentDetailData.fullColumnImgUrls[0].url:
  276 + this.contentDetailData.videoInfo[0].firstFrameImageUri)
  277 + .width(CommonConstants.FULL_WIDTH)
  278 + .borderRadius($r('app.float.image_border_radius'))
  279 + CardMediaInfo({ contentDTO: this.mJumpInfo })
  280 + }
  281 + .align(Alignment.BottomEnd)
  282 + }
  283 + }
275 } 284 }
276 - .align(Alignment.BottomEnd) 285 + .margin({ left: $r('app.float.margin_16'),right: $r('app.float.margin_16'),top: $r('app.float.margin_8')})
  286 + .onClick((event: ClickEvent) => {
  287 + this.mJumpInfo.objectType = ContentConstants.TYPE_VOD;
  288 + ProcessUtils.processPage(this.mJumpInfo)
  289 + })
277 } 290 }
278 } 291 }
  292 + //特别声明
  293 + Text("特别声明:本文为人民日报新媒体平台“人民号”作者上传并发布,仅代表作者观点。人民日报仅提供信息发布平台。")
  294 + .fontColor($r('app.color.color_CCCCCC'))
  295 + .fontSize($r('app.float.font_size_12'))
  296 + .lineHeight($r('app.float.margin_16'))
  297 + .margin({ top: $r('app.float.margin_16')
  298 + ,left: $r('app.float.margin_16')
  299 + ,right: $r('app.float.margin_16') })
  300 + //微信/朋友圈/微博
  301 + Row(){
  302 + Image($r('app.media.xxhdpi_pic_wechat'))
  303 + .width($r('app.float.margin_116'))
  304 + .height($r('app.float.margin_36'))
  305 + .objectFit(ImageFit.Cover)
  306 + Image($r('app.media.xxhdpi_pic_pyq'))
  307 + .width($r('app.float.margin_116'))
  308 + .height($r('app.float.margin_36'))
  309 + .margin({ left: $r('app.float.margin_4_negative')})
  310 + .objectFit(ImageFit.Cover)
  311 + Image($r('app.media.xxhdpi_pic_wb'))
  312 + .width($r('app.float.margin_116'))
  313 + .height($r('app.float.margin_36'))
  314 + .margin({ left: $r('app.float.margin_4_negative')})
  315 + .objectFit(ImageFit.Cover)
  316 + }
  317 + .margin({ top: $r('app.float.margin_24')})
  318 + //点赞
  319 + Row(){
  320 + Image($r('app.media.icon_like_selected_redheart'))
  321 + .width($r('app.float.margin_24'))
  322 + .height($r('app.float.margin_24'))
  323 + .objectFit(ImageFit.Cover)
  324 + Text("2.6万")
  325 + .fontColor($r('app.color.color_999999'))
  326 + .fontSize($r('app.float.font_size_16'))
  327 + .lineHeight($r('app.float.margin_20'))
  328 + .margin({ left: $r('app.float.margin_2')})
  329 + }
  330 + .margin({top:$r('app.float.margin_16')})
  331 + //fixme 评论组件
279 } 332 }
280 - .margin({ left: $r('app.float.margin_16'),right: $r('app.float.margin_16'),top: $r('app.float.margin_8')})  
281 - .onClick((event: ClickEvent) => {  
282 - this.mJumpInfo.objectType = ContentConstants.TYPE_VOD;  
283 - ProcessUtils.processPage(this.mJumpInfo)  
284 - })  
285 } 333 }
286 - }  
287 - //特别声明  
288 - Text("特别声明:本文为人民日报新媒体平台“人民号”作者上传并发布,仅代表作者观点。人民日报仅提供信息发布平台。")  
289 - .fontColor($r('app.color.color_CCCCCC'))  
290 - .fontSize($r('app.float.font_size_12'))  
291 - .lineHeight($r('app.float.margin_16'))  
292 - .margin({ top: $r('app.float.margin_16')  
293 - ,left: $r('app.float.margin_16')  
294 - ,right: $r('app.float.margin_16') })  
295 - //微信/朋友圈/微博  
296 - Row(){  
297 - Image($r('app.media.xxhdpi_pic_wechat'))  
298 - .width($r('app.float.margin_116'))  
299 - .height($r('app.float.margin_36'))  
300 - .objectFit(ImageFit.Cover)  
301 - Image($r('app.media.xxhdpi_pic_pyq'))  
302 - .width($r('app.float.margin_116'))  
303 - .height($r('app.float.margin_36'))  
304 - .margin({ left: $r('app.float.margin_4_negative')})  
305 - .objectFit(ImageFit.Cover)  
306 - Image($r('app.media.xxhdpi_pic_wb'))  
307 - .width($r('app.float.margin_116'))  
308 - .height($r('app.float.margin_36'))  
309 - .margin({ left: $r('app.float.margin_4_negative')})  
310 - .objectFit(ImageFit.Cover)  
311 - }  
312 - .margin({ top: $r('app.float.margin_24')})  
313 - //点赞  
314 - Row(){  
315 - Image($r('app.media.icon_like_selected_redheart'))  
316 - .width($r('app.float.margin_24'))  
317 - .height($r('app.float.margin_24'))  
318 - .objectFit(ImageFit.Cover)  
319 - Text("2.6万")  
320 - .fontColor($r('app.color.color_999999'))  
321 - .fontSize($r('app.float.font_size_16'))  
322 - .lineHeight($r('app.float.margin_20'))  
323 - .margin({ left: $r('app.float.margin_2')})  
324 - }  
325 - //评论组件/底部组件 334 + .width(CommonConstants.FULL_WIDTH)
  335 + .height(CommonConstants.FULL_HEIGHT)
  336 + .padding({ bottom: 76 })
  337 + .scrollBar(BarState.Off)
  338 + .alignSelf(ItemAlign.Start)
  339 + //底部交互区
  340 + Row() {
  341 + Image($r('app.media.icon_arrow_left'))
  342 + .width(24)
  343 + .height(24)
  344 + .onClick((event: ClickEvent) => {
  345 + router.back()
  346 + })
  347 +
  348 + Row() {
  349 + Image($r('app.media.icon_comment'))
  350 + .width(24)
  351 + .height(24)
  352 + .margin({ right: 24 })
  353 + .id('comment')
326 354
  355 + Image($r('app.media.icon_star'))
  356 + .width(24)
  357 + .height(24)
  358 + .margin({ right: 24 })
  359 +
  360 + Image($r('app.media.icon_listen'))
  361 + .width(24)
  362 + .height(24)
  363 + .margin({ right: 24 })
  364 +
  365 + Image($r('app.media.icon_forward'))
  366 + .width(24)
  367 + .height(24)
  368 +
  369 + }
  370 + }
  371 + .width(CommonConstants.FULL_WIDTH)
  372 + .height(56)
  373 + .padding({ left: 15, right: 15, bottom: 50, top: 20 })
  374 + .justifyContent(FlexAlign.SpaceBetween)
  375 + .backgroundColor(Color.White)
  376 + }
327 } 377 }
328 .alignSelf(ItemAlign.Start) 378 .alignSelf(ItemAlign.Start)
329 - }  
330 - .backgroundColor('#FFFFFFFF')  
331 - .width('100%')  
332 - .height('100%') 379 + .backgroundColor('#FFFFFFFF')
  380 + .width('100%')
  381 + .height('100%')
333 } 382 }
334 /** 383 /**
335 * 请求(动态)详情页数据 384 * 请求(动态)详情页数据
@@ -298,47 +298,55 @@ struct ChannelDialog { @@ -298,47 +298,55 @@ struct ChannelDialog {
298 .zIndex(this.dragItem == item.num ? 1 : 0) 298 .zIndex(this.dragItem == item.num ? 1 : 0)
299 .translate(this.dragItem == item.num ? { x: this.offsetX, y: this.offsetY } : { x: 0, y: 0 }) 299 .translate(this.dragItem == item.num ? { x: this.offsetX, y: this.offsetY } : { x: 0, y: 0 })
300 .gesture( 300 .gesture(
301 - GestureGroup(GestureMode.Parallel,  
302 - TapGesture()  
303 - .onAction((event?: GestureEvent) => {  
304 - if (this.isEditIng) {  
305 - if (item.delPermitted === 1) {  
306 - this.delChannelItem(index)  
307 - }  
308 - } else {  
309 - this.confirm(index)  
310 - this.controller?.close() 301 + GestureGroup(GestureMode.Parallel,
  302 + TapGesture()
  303 + .onAction((event?: GestureEvent) => {
  304 + if (this.isEditIng) {
  305 + if (item.delPermitted === 1) {
  306 + this.delChannelItem(index)
311 } 307 }
312 - }),  
313 - PanGesture({ fingers: 1, direction: null, distance: 0 })  
314 - .onActionStart((event: GestureEvent) => {  
315 - this.dragItem = item.num 308 + } else {
  309 + this.confirm(index)
  310 + this.controller?.close()
  311 + }
  312 + }),
  313 + LongPressGesture({ repeat: true })
  314 + .onAction((event: GestureEvent | undefined) => {
  315 + if (event) {
  316 + if (event.repeat && this.isEditIng === false) {
  317 + this.isEditIng = true;
  318 + }
  319 + }
  320 + }),
  321 + PanGesture({ fingers: 1, direction: null, distance: 0 })
  322 + .onActionStart((event: GestureEvent) => {
  323 + this.dragItem = item.num
  324 + this.dragRefOffsetX = 0
  325 + this.dragRefOffsetY = 0
  326 + })
  327 + .onActionUpdate((event: GestureEvent) => {
  328 + animateTo({ curve: curves.interpolatingSpring(0, 1, 400, 38) }, () => {
  329 + this.handleAnimationTo(item, event)
  330 + })
  331 + })
  332 + .onActionEnd((event: GestureEvent) => {
  333 + animateTo({ curve: curves.interpolatingSpring(0, 1, 400, 38) }, () => {
  334 + this.dragItem = -1
  335 + this.offsetX = 0
  336 + this.offsetY = 0
316 this.dragRefOffsetX = 0 337 this.dragRefOffsetX = 0
317 this.dragRefOffsetY = 0 338 this.dragRefOffsetY = 0
318 }) 339 })
319 - .onActionUpdate((event: GestureEvent) => {  
320 - animateTo({ curve: curves.interpolatingSpring(0, 1, 400, 38) }, () => {  
321 - this.handleAnimationTo(item, event)  
322 - })  
323 - })  
324 - .onActionEnd((event: GestureEvent) => {  
325 - animateTo({ curve: curves.interpolatingSpring(0, 1, 400, 38) }, () => {  
326 - this.dragItem = -1  
327 - this.offsetX = 0  
328 - this.offsetY = 0  
329 - this.dragRefOffsetX = 0  
330 - this.dragRefOffsetY = 0  
331 - })  
332 - })  
333 - ).onCancel(() => {  
334 - animateTo({ curve: curves.interpolatingSpring(0, 1, 400, 38) }, () => {  
335 - this.dragItem = -1  
336 - this.offsetX = 0  
337 - this.offsetY = 0  
338 - this.dragRefOffsetX = 0  
339 - this.dragRefOffsetY = 0  
340 }) 340 })
  341 + ).onCancel(() => {
  342 + animateTo({ curve: curves.interpolatingSpring(0, 1, 400, 38) }, () => {
  343 + this.dragItem = -1
  344 + this.offsetX = 0
  345 + this.offsetY = 0
  346 + this.dragRefOffsetX = 0
  347 + this.dragRefOffsetY = 0
341 }) 348 })
  349 + })
342 ) 350 )
343 }, (item: TopNavDTO) => JSON.stringify(item)) 351 }, (item: TopNavDTO) => JSON.stringify(item))
344 } 352 }
@@ -11,7 +11,7 @@ import { VideoChannelDetail } from 'wdDetailPlayShortVideo/Index'; @@ -11,7 +11,7 @@ import { VideoChannelDetail } from 'wdDetailPlayShortVideo/Index';
11 const TAG = 'TopNavigationComponent'; 11 const TAG = 'TopNavigationComponent';
12 12
13 PersistentStorage.persistProp('channelIds', ''); 13 PersistentStorage.persistProp('channelIds', '');
14 -PersistentStorage.persistProp('indexSettingChannelId', 0); 14 +PersistentStorage.persistProp('indexSettingChannelId', 2002);
15 15
16 const storage = LocalStorage.getShared(); 16 const storage = LocalStorage.getShared();
17 17
@@ -36,7 +36,7 @@ export struct TopNavigationComponent { @@ -36,7 +36,7 @@ export struct TopNavigationComponent {
36 // 顶导数据 36 // 顶导数据
37 @State @Watch('onTopNavigationDataUpdated') topNavList: TopNavDTO[] = [] 37 @State @Watch('onTopNavigationDataUpdated') topNavList: TopNavDTO[] = []
38 @State compList: LazyDataSource<CompDTO> = new LazyDataSource(); 38 @State compList: LazyDataSource<CompDTO> = new LazyDataSource();
39 - @StorageProp('indexSettingChannelId') indexSettingChannelId: number = 0 39 + @StorageProp('indexSettingChannelId') indexSettingChannelId: number = 2002
40 //我的频道id列表 40 //我的频道id列表
41 @State channelIds: number[] = [] 41 @State channelIds: number[] = []
42 //本地缓存频道id列表 42 //本地缓存频道id列表
@@ -121,13 +121,9 @@ export struct TopNavigationComponent { @@ -121,13 +121,9 @@ export struct TopNavigationComponent {
121 this.myChannelList = _myChannelList 121 this.myChannelList = _myChannelList
122 122
123 //缓存首页频道 123 //缓存首页频道
124 - if (!this.indexSettingChannelId) {  
125 - AppStorage.set('indexSettingChannelId', this.homeChannelList[0].channelId)  
126 - } else {  
127 - let index = this.myChannelList.findIndex(_item => _item.channelId === this.indexSettingChannelId)  
128 - if (index > -1) {  
129 - this.currentTopNavSelectedIndex = index  
130 - } 124 + let index = this.myChannelList.findIndex(_item => _item.channelId === this.indexSettingChannelId)
  125 + if (index > -1) {
  126 + this.currentTopNavSelectedIndex = index
131 } 127 }
132 } 128 }
133 129
@@ -151,7 +151,7 @@ export struct PeopleShipHomeArticleListComponent { @@ -151,7 +151,7 @@ export struct PeopleShipHomeArticleListComponent {
151 try { 151 try {
152 this.isLoading = true 152 this.isLoading = true
153 let listData: ArticleListData = await PeopleShipHomePageDataModel.getPeopleShipHomePageArticleListData(this.creatorId, this.currentPage, 20, this.typeModel.type) 153 let listData: ArticleListData = await PeopleShipHomePageDataModel.getPeopleShipHomePageArticleListData(this.creatorId, this.currentPage, 20, this.typeModel.type)
154 - Logger.debug(TAG, `获取页面信息, ${listData.list.length}`); 154 + Logger.debug(TAG, `获取页面信息, ${JSON.stringify(listData.list)}`);
155 Logger.debug(TAG, `已更新值最新, ${this.currentPage}`); 155 Logger.debug(TAG, `已更新值最新, ${this.currentPage}`);
156 156
157 if (resolve ) { 157 if (resolve ) {
@@ -173,7 +173,7 @@ export struct PeopleShipHomeArticleListComponent { @@ -173,7 +173,7 @@ export struct PeopleShipHomeArticleListComponent {
173 } 173 }
174 this.isLoading = false 174 this.isLoading = false
175 this.queryArticleContentInteractCount(listData) 175 this.queryArticleContentInteractCount(listData)
176 - Logger.debug(TAG, '展示的总数', `${this.arr.length}`) 176 + Logger.debug(TAG, '展示的总数'+`${this.arr.length}`)
177 }catch (exception) { 177 }catch (exception) {
178 if (resolve) { 178 if (resolve) {
179 resolve('') 179 resolve('')
@@ -236,7 +236,8 @@ export struct PeopleShipHomeArticleListComponent { @@ -236,7 +236,8 @@ export struct PeopleShipHomeArticleListComponent {
236 // 19.动态图文卡-人民号,20.动态视频卡-人民号, 236 // 19.动态图文卡-人民号,20.动态视频卡-人民号,
237 // 21 小视频卡-人民号 237 // 21 小视频卡-人民号
238 contentDTO.objectType = `${element.type}`; 238 contentDTO.objectType = `${element.type}`;
239 - 239 + // 时间显示
  240 + contentDTO.isSearch = true
240 // contentDTO.productNum = element.productCount; 241 // contentDTO.productNum = element.productCount;
241 // if (master) { 242 // if (master) {
242 // contentDTO.customWorkStatus = element.workStatus; 243 // contentDTO.customWorkStatus = element.workStatus;
@@ -277,8 +278,10 @@ export struct PeopleShipHomeArticleListComponent { @@ -277,8 +278,10 @@ export struct PeopleShipHomeArticleListComponent {
277 278
278 279
279 //图集数量 280 //图集数量
280 - contentDTO.photoNum = element.mainPicCount;  
281 - 281 + if (element.mainPicCount) {
  282 + contentDTO.photoNum = element.mainPicCount;
  283 + }
  284 + Logger.debug(TAG, '图集数量:' + `${element.mainPicCount}`)
282 if (element.contentExt && element.contentExt.length > 0) { 285 if (element.contentExt && element.contentExt.length > 0) {
283 let extModel = element.contentExt[0]; 286 let extModel = element.contentExt[0];
284 contentDTO.openLikes = extModel.openLikes; 287 contentDTO.openLikes = extModel.openLikes;
1 -import { DisplayUtils, Logger } from 'wdKit' 1 +import { DisplayUtils, Logger } from 'wdKit'
2 import { PeopleShipHomePageDataModel } from '../../viewmodel/PeopleShipHomePageDataModel' 2 import { PeopleShipHomePageDataModel } from '../../viewmodel/PeopleShipHomePageDataModel'
3 import { PeopleShipHomeArticleListComponent } from './PeopleShipHomeArticleListComponent' 3 import { PeopleShipHomeArticleListComponent } from './PeopleShipHomeArticleListComponent'
4 import { ArticleCountData, ArticleTypeData } from 'wdBean' 4 import { ArticleCountData, ArticleTypeData } from 'wdBean'
@@ -8,9 +8,7 @@ import { RefreshLayoutBean } from '../page/RefreshLayoutBean' @@ -8,9 +8,7 @@ import { RefreshLayoutBean } from '../page/RefreshLayoutBean'
8 8
9 @Component 9 @Component
10 export struct PeopleShipHomeListComponent { 10 export struct PeopleShipHomeListComponent {
11 -  
12 private controller: TabsController = new TabsController() 11 private controller: TabsController = new TabsController()
13 -  
14 @State tabArr: ArticleTypeData[] = [] 12 @State tabArr: ArticleTypeData[] = []
15 @State creatorId: string = '' 13 @State creatorId: string = ''
16 // 发布数量 14 // 发布数量
@@ -19,47 +17,69 @@ export struct PeopleShipHomeListComponent { @@ -19,47 +17,69 @@ export struct PeopleShipHomeListComponent {
19 @State private isLoading: boolean = false 17 @State private isLoading: boolean = false
20 @Consume topHeight: number 18 @Consume topHeight: number
21 19
22 -  
23 build() { 20 build() {
24 if (this.isLoading) { 21 if (this.isLoading) {
25 this.LoadingLayout() 22 this.LoadingLayout()
26 } 23 }
27 // 列表 24 // 列表
28 - else if(this.publishCount == 0) { 25 + else if (this.publishCount == 0) {
29 // 无数据展示 26 // 无数据展示
30 EmptyComponent().height(DisplayUtils.getDeviceHeight() - this.topHeight) 27 EmptyComponent().height(DisplayUtils.getDeviceHeight() - this.topHeight)
31 - } else {  
32 - Tabs({ barPosition: BarPosition.Start, controller: this.controller}) {  
33 - ForEach(this.tabArr, (item: ArticleTypeData, index: number) => {  
34 - TabContent() {  
35 - PeopleShipHomeArticleListComponent({  
36 - typeModel: item,  
37 - creatorId: this.creatorId,  
38 - currentTopSelectedIndex: this.currentIndex,  
39 - currentIndex: index  
40 - })  
41 - }.tabBar(this.tabBuilder(index, item.name ?? '')) 28 + } else {
  29 + Column() {
  30 + Column() {
  31 + // 页签
  32 + Row() {
  33 + Scroll() {
  34 + Row() {
  35 + ForEach(this.tabArr, (item: ArticleTypeData, index: number) => {
  36 + this.Tab(index, item.name ?? '')
  37 + })
  38 + }
  39 + .justifyContent(FlexAlign.Start)
  40 + }
  41 + .align(Alignment.Start)
  42 + .scrollable(ScrollDirection.Horizontal)
  43 + .scrollBar(BarState.Off)
  44 + .width('100%')
  45 + }
  46 + .alignItems(VerticalAlign.Bottom)
  47 + .width('100%')
  48 + }
  49 + .alignItems(HorizontalAlign.Start)
  50 + .width('100%')
42 51
43 - }) 52 + Tabs({ barPosition: BarPosition.Start, controller: this.controller }) {
  53 + ForEach(this.tabArr, (item: ArticleTypeData, index: number) => {
  54 + TabContent() {
  55 + PeopleShipHomeArticleListComponent({
  56 + typeModel: item,
  57 + creatorId: this.creatorId,
  58 + currentTopSelectedIndex: this.currentIndex,
  59 + currentIndex: index
  60 + })
  61 + }
  62 + // }.tabBar(this.tabBuilder(index, item.name ?? ''))
  63 + })
44 64
  65 + }
  66 + .backgroundColor(Color.White)
  67 + .barWidth('100%')
  68 + .barHeight(0)
  69 + .vertical(false)
  70 + .height(DisplayUtils.getDeviceHeight() - 144)
  71 + .animationDuration(0)
  72 + .divider({
  73 + strokeWidth: '0.5vp',
  74 + color: $r('app.color.color_F5F5F5'),
  75 + startMargin: 0,
  76 + endMargin: 0
  77 + })
  78 + .onChange((index: number) => {
  79 + this.currentIndex = index
  80 + })
45 } 81 }
46 - .backgroundColor(Color.White)  
47 - .barWidth('100%')  
48 - .barHeight('44vp')  
49 - .vertical(false)  
50 - .height(DisplayUtils.getDeviceHeight() - 100)  
51 - .animationDuration(0)  
52 - .divider({  
53 - strokeWidth: '0.5vp',  
54 - color: $r('app.color.color_F5F5F5'),  
55 - startMargin: 0,  
56 - endMargin: 0  
57 - })  
58 - .onChange((index: number) => {  
59 - this.currentIndex = index  
60 - })  
61 } 82 }
62 -  
63 } 83 }
64 84
65 @Builder 85 @Builder
@@ -70,21 +90,33 @@ export struct PeopleShipHomeListComponent { @@ -70,21 +90,33 @@ export struct PeopleShipHomeListComponent {
70 }).height(DisplayUtils.getDeviceHeight() - this.topHeight) 90 }).height(DisplayUtils.getDeviceHeight() - this.topHeight)
71 } 91 }
72 92
73 - @Builder tabBuilder(index: number, name: string) { 93 + // 单独的页签
  94 + @Builder
  95 + Tab(index: number, name: string) {
74 Column() { 96 Column() {
75 Text(name) 97 Text(name)
76 - .fontColor(this.currentIndex === index ? $r('app.color.color_222222') : $r('app.color.color_666666') ) 98 + .fontColor(this.currentIndex === index ? $r('app.color.color_222222') : $r('app.color.color_666666'))
77 .fontSize(18) 99 .fontSize(18)
78 .fontWeight(this.currentIndex === index ? 500 : 400) 100 .fontWeight(this.currentIndex === index ? 500 : 400)
79 .lineHeight(22) 101 .lineHeight(22)
80 .height(22) 102 .height(22)
81 - .margin({ top: 11, bottom: 1 })  
82 Divider() 103 Divider()
83 .width('15vp') 104 .width('15vp')
84 .strokeWidth(2) 105 .strokeWidth(2)
85 .color('#CB0000') 106 .color('#CB0000')
86 .opacity(this.currentIndex === index ? 1 : 0) 107 .opacity(this.currentIndex === index ? 1 : 0)
87 - }.width('100%') 108 + }
  109 + .justifyContent(FlexAlign.Center)
  110 + .constraintSize({ minWidth: 35 })
  111 + .margin({
  112 + left: '16vp',
  113 + right: '16vp'
  114 + })
  115 + .height('44vp')
  116 + .onClick(() => {
  117 + this.controller.changeIndex(index)
  118 + this.currentIndex = index
  119 + })
88 } 120 }
89 121
90 async aboutToAppear() { 122 async aboutToAppear() {
@@ -119,10 +119,12 @@ export struct EmptyComponent { @@ -119,10 +119,12 @@ export struct EmptyComponent {
119 noProgrammeData() { 119 noProgrammeData() {
120 Column() { 120 Column() {
121 Image(this.buildNoDataTipImage()) 121 Image(this.buildNoDataTipImage())
122 - .width('this.EMPTY_IMAGE_WIDTH')  
123 - .height(this.EMPTY_IMAGE_HEIGHT) 122 + .width(160)
  123 + .height(112)
124 .objectFit(ImageFit.Contain) 124 .objectFit(ImageFit.Contain)
125 // .border({ width: 1, color: Color.Red, radius: 6 }) 125 // .border({ width: 1, color: Color.Red, radius: 6 })
  126 + // .width('this.EMPTY_IMAGE_WIDTH')
  127 + // .height(this.EMPTY_IMAGE_HEIGHT)
126 128
127 Text(this.emptyType !== 8 ? this.buildNoDataTip() : `${this.buildNoDataTip()}(${this.timeNum}s)`) 129 Text(this.emptyType !== 8 ? this.buildNoDataTip() : `${this.buildNoDataTip()}(${this.timeNum}s)`)
128 .fontSize($r('app.float.normal_text_size')) 130 .fontSize($r('app.float.normal_text_size'))
@@ -185,6 +187,8 @@ export struct EmptyComponent { @@ -185,6 +187,8 @@ export struct EmptyComponent {
185 contentString = '获取内容失败请重试' // 前方拥堵,请耐心等待 187 contentString = '获取内容失败请重试' // 前方拥堵,请耐心等待
186 } else if (this.emptyType === WDViewDefaultType.WDViewDefaultType_NoContent1) { 188 } else if (this.emptyType === WDViewDefaultType.WDViewDefaultType_NoContent1) {
187 contentString = '暂无内容' 189 contentString = '暂无内容'
  190 + } else if (this.emptyType === WDViewDefaultType.WDViewDefaultType_NoFollow) {
  191 + contentString = '暂无关注'
188 } 192 }
189 193
190 return contentString 194 return contentString
@@ -215,7 +219,7 @@ export struct EmptyComponent { @@ -215,7 +219,7 @@ export struct EmptyComponent {
215 imageString = $r('app.media.icon_no_master1') 219 imageString = $r('app.media.icon_no_master1')
216 } else if (this.emptyType === WDViewDefaultType.WDViewDefaultType_NoVideo) { 220 } else if (this.emptyType === WDViewDefaultType.WDViewDefaultType_NoVideo) {
217 imageString = $r('app.media.icon_no_content') 221 imageString = $r('app.media.icon_no_content')
218 - } else if (this.emptyType === WDViewDefaultType.WDViewDefaultType_NoContent1) { 222 + } else if (this.emptyType === WDViewDefaultType.WDViewDefaultType_NoContent1 || this.emptyType === WDViewDefaultType.WDViewDefaultType_NoFollow) {
219 imageString = $r('app.media.icon_no_appointmentMade1') 223 imageString = $r('app.media.icon_no_appointmentMade1')
220 } 224 }
221 return imageString 225 return imageString
  1 +import { DateFormatUtil, WDPlayerController, WDPlayerRenderLiveView } from 'wdPlayer/Index';
  2 +import router from '@ohos.router';
  3 +import { StringUtils } from 'wdKit/Index';
  4 +import { Action } from 'wdBean';
  5 +
  6 +const TAG = 'VideoPlayPage';
  7 +
  8 +@Entry
  9 +@Component
  10 +export struct VideoPlayPage {
  11 + //是否处于播放状态中
  12 + @State isPlayStatus: boolean = true
  13 + playerController: WDPlayerController = new WDPlayerController();
  14 + //视频地址
  15 + @State videoUrl: string = ''
  16 + //封面图
  17 + @State videoCoverUrl: string = ''
  18 + @State currentTime: string = ''
  19 + @State totalTime: string = ''
  20 + @State progressVal: number = 0;
  21 +
  22 + aboutToAppear(): void {
  23 + let par: Action = router.getParams() as Action
  24 + let params = par?.params
  25 + this.videoUrl = params?.videoUrl ? params?.videoUrl : ''
  26 + this.videoCoverUrl = params?.videoCoverUrl ? params?.videoCoverUrl : ''
  27 + //播放进度监听
  28 + this.playerController.onTimeUpdate = (position: number, duration: number) => {
  29 + this.currentTime = DateFormatUtil.secondToTime(Math.floor(position / 1000));
  30 + this.totalTime = DateFormatUtil.secondToTime(Math.floor(duration / 1000));
  31 + this.progressVal = Math.floor(position * 100 / duration);
  32 + }
  33 + this.playerController.onCanplay = () => {
  34 + this.playerController.play()
  35 + }
  36 + }
  37 +
  38 + build() {
  39 + Stack() {
  40 + WDPlayerRenderLiveView({
  41 + playerController: this.playerController,
  42 + onLoad: async () => {
  43 + this.playerController.firstPlay(this.videoUrl)
  44 + }
  45 + })
  46 + .height('100%')
  47 + .width('100%')
  48 + .visibility(StringUtils.isEmpty(this.videoUrl) ? Visibility.None : Visibility.Visible)
  49 + Image(this.videoCoverUrl)
  50 + .objectFit(ImageFit.Contain)
  51 + .visibility(StringUtils.isEmpty(this.videoUrl) ? Visibility.Visible : Visibility.None)
  52 + Column() {
  53 + this.getTopUIComponent()
  54 + Stack()
  55 + .layoutWeight(1)
  56 + this.getBottomUIComponent()
  57 + }
  58 + }
  59 + .width('100%')
  60 + }
  61 +
  62 + @Builder
  63 + getTopUIComponent() {
  64 + Column() {
  65 + Row() {
  66 + Image($r('app.media.icon_arrow_left_white'))
  67 + .width(24)
  68 + .aspectRatio(1)
  69 + .margin({
  70 + right: 10
  71 + })
  72 + .onClick(() => {
  73 + router.back()
  74 + })
  75 + }
  76 + .width('100%')
  77 + .alignItems(VerticalAlign.Center)
  78 + .margin({
  79 + bottom: 10
  80 + })
  81 + }.width('100%')
  82 + .padding({
  83 + top: 20,
  84 + bottom: 6,
  85 + left: 10,
  86 + right: 10
  87 + })
  88 + .alignItems(HorizontalAlign.Start)
  89 + }
  90 +
  91 + @Builder
  92 + getBottomUIComponent() {
  93 + Row() {
  94 + this.playOrPauseBtn()
  95 + Text(this.currentTime)
  96 + .fontColor(Color.White)
  97 + .fontWeight(600)
  98 + .fontSize('12fp')
  99 + .margin({
  100 + left: 16
  101 + })
  102 + this.playProgressView()
  103 + Text(this.totalTime)
  104 + .fontColor(Color.White)
  105 + .fontWeight(600)
  106 + .fontSize('12fp')
  107 + .margin({
  108 + right: 16
  109 + })
  110 + }
  111 + .alignItems(VerticalAlign.Center)
  112 + .width('100%')
  113 + .padding({
  114 + left: 10,
  115 + right: 10,
  116 + top: 15,
  117 + bottom: 15
  118 + })
  119 + }
  120 +
  121 + @Builder
  122 + playOrPauseBtn() {
  123 + //暂停、播放
  124 + Image(this.isPlayStatus ? $r('app.media.icon_live_player_pause') : $r('app.media.player_play_ic'))
  125 + .width(24)
  126 + .height(24)
  127 + .onClick(() => {
  128 + if (this.isPlayStatus) {
  129 + this.isPlayStatus = false
  130 + this.playerController.pause()
  131 + } else {
  132 + this.isPlayStatus = true
  133 + this.playerController.play()
  134 + }
  135 + })
  136 + }
  137 +
  138 + @Builder
  139 + playProgressView() {
  140 + Slider({
  141 + value: this.progressVal,
  142 + step: 1,
  143 + style: SliderStyle.OutSet
  144 + })
  145 + .blockSize({
  146 + width: 18,
  147 + height: 12
  148 + })
  149 + .blockStyle({
  150 + type: SliderBlockType.IMAGE,
  151 + image: $r('app.media.ic_player_block')
  152 + })
  153 + .blockColor(Color.White)
  154 + .trackColor('#4DFFFFFF')
  155 + .selectedColor('#FFED2800')
  156 + .height(14)
  157 + .trackThickness(1)
  158 + .layoutWeight(1)
  159 + .margin({
  160 + left: 8,
  161 + right: 8
  162 + })
  163 + .onChange((value: number, mode: SliderChangeMode) => {
  164 + this.playerController?.setSeekTime(value, mode);
  165 + })
  166 + }
  167 +
  168 + onPageHide(): void {
  169 + this.playerController?.pause()
  170 + this.playerController?.stop()
  171 + }
  172 +}
@@ -20,6 +20,7 @@ @@ -20,6 +20,7 @@
20 "pages/MultiPictureListPage", 20 "pages/MultiPictureListPage",
21 "components/page/LiveMorePage", 21 "components/page/LiveMorePage",
22 "components/page/ReserveMorePage", 22 "components/page/ReserveMorePage",
  23 + "pages/VideoPlayPage",
23 "components/page/ThemeListPage" 24 "components/page/ThemeListPage"
24 ] 25 ]
25 } 26 }
1 import { LiveDetailsBean, LiveRoomItemBean } from 'wdBean/Index' 1 import { LiveDetailsBean, LiveRoomItemBean } from 'wdBean/Index'
2 -import { EmptyComponent, ErrorComponent, ListHasNoMoreDataUI, WDViewDefaultType } from 'wdComponent/Index' 2 +import { EmptyComponent, ErrorComponent, WDViewDefaultType } from 'wdComponent/Index'
3 import CustomRefreshLoadLayout from 'wdComponent/src/main/ets/components/page/CustomRefreshLoadLayout' 3 import CustomRefreshLoadLayout from 'wdComponent/src/main/ets/components/page/CustomRefreshLoadLayout'
4 -import LoadMoreLayout from 'wdComponent/src/main/ets/components/page/LoadMoreLayout'  
5 import RefreshLayout from 'wdComponent/src/main/ets/components/page/RefreshLayout' 4 import RefreshLayout from 'wdComponent/src/main/ets/components/page/RefreshLayout'
6 import { RefreshLayoutBean } from 'wdComponent/src/main/ets/components/page/RefreshLayoutBean' 5 import { RefreshLayoutBean } from 'wdComponent/src/main/ets/components/page/RefreshLayoutBean'
7 import PageModel from 'wdComponent/src/main/ets/viewmodel/PageModel' 6 import PageModel from 'wdComponent/src/main/ets/viewmodel/PageModel'
8 import { ViewType } from 'wdConstant/Index' 7 import { ViewType } from 'wdConstant/Index'
9 -import { Logger } from 'wdKit/Index'  
10 import { LiveViewModel } from '../../viewModel/LiveViewModel' 8 import { LiveViewModel } from '../../viewModel/LiveViewModel'
11 import { TabChatItemComponent } from './TabChatItemComponent' 9 import { TabChatItemComponent } from './TabChatItemComponent'
12 10
1 import { LiveDetailsBean, LiveRoomItemBean } from 'wdBean/Index' 1 import { LiveDetailsBean, LiveRoomItemBean } from 'wdBean/Index'
2 -import { EmptyComponent, ErrorComponent, ListHasNoMoreDataUI, WDViewDefaultType } from 'wdComponent/Index'  
3 -import { LiveViewModel } from '../../viewModel/LiveViewModel' 2 +import { EmptyComponent, ErrorComponent, ListHasNoMoreDataUI,
  3 + WDViewDefaultType } from 'wdComponent/Index'
4 import { TabLiveItemComponent } from './TabLiveItemComponent' 4 import { TabLiveItemComponent } from './TabLiveItemComponent'
5 import CustomRefreshLoadLayout from 'wdComponent/src/main/ets/components/page/CustomRefreshLoadLayout' 5 import CustomRefreshLoadLayout from 'wdComponent/src/main/ets/components/page/CustomRefreshLoadLayout'
6 import { RefreshLayoutBean } from 'wdComponent/src/main/ets/components/page/RefreshLayoutBean' 6 import { RefreshLayoutBean } from 'wdComponent/src/main/ets/components/page/RefreshLayoutBean'
@@ -9,6 +9,7 @@ import { ViewType } from 'wdConstant/Index' @@ -9,6 +9,7 @@ import { ViewType } from 'wdConstant/Index'
9 import LoadMoreLayout from 'wdComponent/src/main/ets/components/page/LoadMoreLayout' 9 import LoadMoreLayout from 'wdComponent/src/main/ets/components/page/LoadMoreLayout'
10 import RefreshLayout from 'wdComponent/src/main/ets/components/page/RefreshLayout' 10 import RefreshLayout from 'wdComponent/src/main/ets/components/page/RefreshLayout'
11 import { StringUtils } from 'wdKit/Index' 11 import { StringUtils } from 'wdKit/Index'
  12 +import { LiveViewModel } from '../../viewModel/LiveViewModel'
12 13
13 @Component 14 @Component
14 export struct TabLiveComponent { 15 export struct TabLiveComponent {
@@ -110,6 +111,7 @@ export struct TabLiveComponent { @@ -110,6 +111,7 @@ export struct TabLiveComponent {
110 liveRoomItemBeanTemp.senderUserName = '人民日报主持人' 111 liveRoomItemBeanTemp.senderUserName = '人民日报主持人'
111 liveRoomItemBeanTemp.pictureUrls=[] 112 liveRoomItemBeanTemp.pictureUrls=[]
112 liveRoomItemBeanTemp.pictureUrls.push(this.liveDetailsBean?.fullColumnImgUrls[0]?.url) 113 liveRoomItemBeanTemp.pictureUrls.push(this.liveDetailsBean?.fullColumnImgUrls[0]?.url)
  114 + liveRoomItemBeanTemp.dataType='ZH_TEXT_AND_IMAGE_MSG'
113 this.liveList.push(liveRoomItemBeanTemp) 115 this.liveList.push(liveRoomItemBeanTemp)
114 } 116 }
115 } 117 }
1 -import { LiveRoomItemBean, PhotoListBean, } from 'wdBean/Index';  
2 -import { DateTimeUtils, StringUtils } from 'wdKit/Index';  
3 -import { Action, Params } from 'wdBean';  
4 -import { ExtraDTO } from 'wdBean/src/main/ets/bean/component/extra/ExtraDTO';  
5 -import { WDRouterRule } from 'wdRouter/Index'; 1 +import { Action, LiveRoomItemBean, Params, PhotoListBean } from 'wdBean/Index'
  2 +import { ExtraDTO } from 'wdBean/src/main/ets/bean/component/extra/ExtraDTO'
  3 +import { DateTimeUtils, StringUtils } from 'wdKit/Index'
  4 +import { WDRouterRule } from 'wdRouter/Index'
6 5
7 @Component 6 @Component
8 export struct TabLiveItemComponent { 7 export struct TabLiveItemComponent {
@@ -14,108 +13,190 @@ export struct TabLiveItemComponent { @@ -14,108 +13,190 @@ export struct TabLiveItemComponent {
14 } 13 }
15 14
16 build() { 15 build() {
17 - Column() {  
18 - Row() {  
19 - Image(StringUtils.isEmpty(this.item.senderUserAvatarUrl) ? $r('app.media.default_head') : this.item.senderUserAvatarUrl)  
20 - .borderRadius(90)  
21 - .width(24)  
22 - .height(24)  
23 - Text(this.item.senderUserName)  
24 - .maxLines(1)  
25 - .textOverflow({ overflow: TextOverflow.Ellipsis }) 16 + Row() {
  17 + Image(StringUtils.isEmpty(this.item.senderUserAvatarUrl) ? $r('app.media.default_head') : this.item.senderUserAvatarUrl)
  18 + .borderRadius(90)
  19 + .width(24)
  20 + .height(24)
  21 +
  22 + Column() {
  23 + Row() {
  24 + Text(this.item.senderUserName)
  25 + .maxLines(1)
  26 + .textOverflow({ overflow: TextOverflow.Ellipsis })
  27 + .fontSize('14fp')
  28 + .fontWeight(400)
  29 + .fontColor('#222222')
  30 + Text('主持人')
  31 + .maxLines(1)
  32 + .textOverflow({ overflow: TextOverflow.Ellipsis })
  33 + .fontSize('11fp')
  34 + .fontWeight(400)
  35 + .fontColor('#968562')
  36 + .backgroundColor('#F1EFEB')
  37 + .padding({
  38 + left: 4,
  39 + top: 1,
  40 + right: 4,
  41 + bottom: 1
  42 + })
  43 + .borderRadius(2)
  44 + .margin({ left: 8 })
  45 + .visibility('host' == this.item.role ? Visibility.Visible : Visibility.None)
  46 + Text(DateTimeUtils.getCommentTime(new Date(this.item.time).getTime()))
  47 + .maxLines(1)
  48 + .textOverflow({ overflow: TextOverflow.Ellipsis })
  49 + .fontSize('12fp')
  50 + .fontWeight(400)
  51 + .fontColor('#999999')
  52 + .margin({ left: 8 })
  53 + .visibility(StringUtils.isNotEmpty(this.item.time) ? Visibility.Visible : Visibility.None)
  54 +
  55 + Text('置顶')
  56 + .fontSize('11fp')
  57 + .fontWeight(400)
  58 + .fontColor('#ED2800')
  59 + .backgroundColor('#F1EFEB')
  60 + .padding({
  61 + left: 4,
  62 + top: 1,
  63 + right: 4,
  64 + bottom: 1
  65 + })
  66 + .borderRadius(2)
  67 + .margin({ left: 8 })
  68 + .width(100)
  69 + .visibility(1 == this.item.isTop ? Visibility.Visible : Visibility.None)
  70 + }
  71 +
  72 + Text(this.item.text)
26 .fontSize('14fp') 73 .fontSize('14fp')
27 .fontWeight(400) 74 .fontWeight(400)
28 .fontColor('#222222') 75 .fontColor('#222222')
29 - .margin({ left: 8 })  
30 - Text('主持人')  
31 - .maxLines(1)  
32 - .textOverflow({ overflow: TextOverflow.Ellipsis })  
33 - .fontSize('11fp')  
34 - .fontWeight(400)  
35 - .fontColor('#968562')  
36 - .backgroundColor('#F1EFEB')  
37 - .padding({  
38 - left: 4,  
39 - top: 1,  
40 - right: 4,  
41 - bottom: 1 76 + .margin({
  77 + top: 6
42 }) 78 })
43 - .borderRadius(2)  
44 - .margin({ left: 8 })  
45 - .visibility('host' == this.item.role ? Visibility.Visible : Visibility.None)  
46 - Text(DateTimeUtils.getCommentTime(new Date(this.item.time).getTime()))  
47 - .maxLines(1)  
48 - .textOverflow({ overflow: TextOverflow.Ellipsis })  
49 - .fontSize('12fp')  
50 - .fontWeight(400)  
51 - .fontColor('#999999')  
52 - .margin({ left: 8 })  
53 - .visibility(StringUtils.isNotEmpty(this.item.time) ? Visibility.Visible : Visibility.None)  
54 - Blank()  
55 - Text('置顶')  
56 - .maxLines(1)  
57 - .textOverflow({ overflow: TextOverflow.Ellipsis })  
58 - .fontSize('11fp')  
59 - .fontWeight(400)  
60 - .fontColor('#ED2800')  
61 - .backgroundColor('#F1EFEB')  
62 - .padding({  
63 - left: 4,  
64 - top: 1,  
65 - right: 4,  
66 - bottom: 1 79 + .width('100%')
  80 + .textAlign(TextAlign.Start)
  81 + //ZH_TEXT_AND_IMAGE_MSG :图文,ZH_TEXT_MSG:文本,ZH_VIDEO_MSG:视频,ZH_AUDIO_MSG:音频
  82 + //图文
  83 + if (this.item.dataType === 'ZH_TEXT_AND_IMAGE_MSG') {
  84 + List({ space: this.item.pictureUrls.length == 1 ? 0 : 5 }) {
  85 + ForEach(this.item.pictureUrls, (item: string, index: number) => {
  86 + ListItem() {
  87 + Image(item)
  88 + .width(`${100 / this.item.pictureUrls.length}%`)
  89 + .height(this.item.pictureUrls.length > 1 ? 70 : 174)
  90 + .objectFit(ImageFit.Auto)
  91 + .borderRadius(4)
  92 + }.onClick(() => {
  93 + this.photoList = []
  94 + for (let item of this.item.pictureUrls) {
  95 + this.photoList.push({
  96 + width: 0,
  97 + height: 0,
  98 + picPath: item,
  99 + picDesc: ''
  100 + })
  101 + }
  102 + this.gotoMultipleListImagePage()
  103 + })
  104 + })
  105 + }
  106 + .listDirection(Axis.Horizontal)
  107 + .margin({
  108 + top: 8,
  109 + right: 16
67 }) 110 })
68 - .borderRadius(2)  
69 - .margin({ left: 8 })  
70 - .visibility(1 == this.item.isTop ? Visibility.Visible : Visibility.None)  
71 - }  
72 - .width('100%')  
73 -  
74 - Text(this.item.text)  
75 - .fontSize('14fp')  
76 - .fontWeight(400)  
77 - .fontColor('#222222')  
78 - .margin({  
79 - left: 32,  
80 - top: 6  
81 - })  
82 - .width('100%')  
83 - .textAlign(TextAlign.Start)  
84 - List() {  
85 - ForEach(this.item.pictureUrls, (item: string, index: number) => {  
86 - ListItem() {  
87 - Image(item)  
88 - .height(174)  
89 - .width(310)  
90 - .aspectRatio(310 / 174)  
91 - .objectFit(ImageFit.Auto)  
92 - .borderRadius(4)  
93 - }.onClick(() => {  
94 - this.photoList=[]  
95 - for (let item of this.item.pictureUrls) {  
96 - this.photoList.push({  
97 - width: 0,  
98 - height: 0,  
99 - picPath: item,  
100 - picDesc: '' 111 + }
  112 + //音频
  113 + else if (this.item.dataType === 'ZH_AUDIO_MSG') {
  114 + Row() {
  115 + Image($r('app.media.icon_voice'))
  116 + .width(20)
  117 + .aspectRatio(1)
  118 + .margin({
  119 + left: 8,
  120 + right: 6
101 }) 121 })
  122 + Text(DateTimeUtils.getFormattedDuration(this.item.duration))
  123 + .fontColor('#666666')
  124 + .fontWeight(400)
  125 + .fontSize('14fp')
  126 + }
  127 + .backgroundColor(Color.White)
  128 + .height(36)
  129 + .borderRadius(4)
  130 + .margin({ top: 8, right: 16 })
  131 + .width('100%')
  132 + }
  133 + //视频
  134 + else if (this.item.dataType === 'ZH_VIDEO_MSG') {
  135 + RelativeContainer() {
  136 + Image(this.item.transcodeImageUrl)
  137 + .width('100%')
  138 + .objectFit(ImageFit.Cover)
  139 + .borderRadius(4)
  140 + .id('iv_id')
  141 + Stack() {
  142 + Row()
  143 + .borderRadius(90)
  144 + .width(32)
  145 + .height(32)
  146 + .backgroundColor('#000000')
  147 + Image($r('app.media.player_play_ic'))
  148 + .height(16)
  149 + .aspectRatio(1)
102 } 150 }
103 - this.gotoMultipleListImagePage() 151 + .alignRules({
  152 + left: { anchor: "iv_id", align: HorizontalAlign.Start },
  153 + bottom: { anchor: "iv_id", align: VerticalAlign.Bottom }
  154 + })
  155 + .margin({
  156 + left: 12,
  157 + bottom: 12
  158 + })
  159 + .id('play_id')
  160 + }
  161 + .margin({
  162 + top: 8,
  163 + right: 16
  164 + })
  165 + .aspectRatio(Number.parseFloat(this.item.pictureResolutions[0]?.split('*')[0]) / Number.parseFloat(this.item.pictureResolutions[0]?.split('*')[1]))
  166 + .onClick(() => {
  167 + this.gotoVideoPlayPage()
104 }) 168 })
105 - })  
106 - }.margin({  
107 - left: 32,  
108 - top: 8 169 + }
  170 +
  171 + }
  172 + .margin({
  173 + left: 8,
  174 + right: 16
109 }) 175 })
110 - }.margin({  
111 - left: 15,  
112 - top: 15,  
113 - right: 15 176 + .layoutWeight(1)
  177 + .alignItems(HorizontalAlign.Start)
  178 + }
  179 + .alignItems(VerticalAlign.Top)
  180 + .padding({
  181 + left: 17,
  182 + top: 8,
  183 + bottom: 8,
114 }) 184 })
115 } 185 }
116 186
117 - aboutToDisappear(): void {  
118 - 187 + /**
  188 + * @param content
  189 + * */
  190 + gotoVideoPlayPage() {
  191 + let taskAction: Action = {
  192 + type: 'JUMP_DETAIL_PAGE',
  193 + params: {
  194 + detailPageType: 19,
  195 + videoUrl: this.item.videoUrl,
  196 + videoCoverUrl: this.item.transcodeImageUrl
  197 + } as Params,
  198 + };
  199 + WDRouterRule.jumpWithAction(taskAction)
119 } 200 }
120 201
121 /** 202 /**
@@ -134,4 +215,8 @@ export struct TabLiveItemComponent { @@ -134,4 +215,8 @@ export struct TabLiveItemComponent {
134 }; 215 };
135 WDRouterRule.jumpWithAction(taskAction) 216 WDRouterRule.jumpWithAction(taskAction)
136 } 217 }
  218 +
  219 + aboutToDisappear(): void {
  220 +
  221 + }
137 } 222 }
@@ -269,7 +269,8 @@ export struct PlayUIComponent { @@ -269,7 +269,8 @@ export struct PlayUIComponent {
269 .blockSize({ 269 .blockSize({
270 width: 18, 270 width: 18,
271 height: 12 271 height: 12
272 - })// .blockStyle({ 272 + })
  273 + // .blockStyle({
273 // type: SliderBlockType.IMAGE, 274 // type: SliderBlockType.IMAGE,
274 // image: $r('app.media.ic_player_block') 275 // image: $r('app.media.ic_player_block')
275 // }) 276 // })
@@ -30,7 +30,8 @@ export struct DetailPlayShortVideoPage { @@ -30,7 +30,8 @@ export struct DetailPlayShortVideoPage {
30 @Provide videoLandScape?: number = 1; // 视频朝向, 横屏视频:1;竖屏视频:2 30 @Provide videoLandScape?: number = 1; // 视频朝向, 横屏视频:1;竖屏视频:2
31 @Provide newsStatusOfUser: batchLikeAndCollectResult | undefined = undefined // 点赞、收藏状态 31 @Provide newsStatusOfUser: batchLikeAndCollectResult | undefined = undefined // 点赞、收藏状态
32 @Provide followStatus: string = '0' // 关注状态 32 @Provide followStatus: string = '0' // 关注状态
33 - @Provide isOpenDetail: boolean = false 33 + @Provide isOpenDetail: boolean = false // 查看详情按钮点击
  34 + @Provide isDragging: boolean = false // 拖动时间进度条
34 @Consume @Watch('pageShowChange') pageShow: number 35 @Consume @Watch('pageShowChange') pageShow: number
35 @Consume @Watch('pageHideChange') pageHide: number 36 @Consume @Watch('pageHideChange') pageHide: number
36 37
@@ -138,9 +139,13 @@ export struct DetailPlayShortVideoPage { @@ -138,9 +139,13 @@ export struct DetailPlayShortVideoPage {
138 build() { 139 build() {
139 Stack({ alignContent: Alignment.Top }) { 140 Stack({ alignContent: Alignment.Top }) {
140 this.playerViewBuilder() 141 this.playerViewBuilder()
141 - PlayerBottomView()  
142 - PlayerRightView()  
143 - 142 + PlayerBottomView({
  143 + playerController: this.playerController
  144 + })
  145 + PlayerRightView({
  146 + playerController: this.playerController
  147 + })
  148 +
144 } 149 }
145 .height('100%') 150 .height('100%')
146 .width('100%') 151 .width('100%')
  1 +export class PlayerConstants {
  2 + static readonly STATUS_IDLE: number = 0;
  3 + static readonly STATUS_START: number = 1;
  4 + static readonly STATUS_PAUSE: number = 2;
  5 + static readonly STATUS_STOP: number = 3;
  6 +}
  7 +
  8 +
1 @Preview 9 @Preview
2 @Component 10 @Component
3 export struct Test { 11 export struct Test {
4 - build() {  
5 - Stack({ alignContent: Alignment.Top }) { 12 + @State progressVal: number = 10;
  13 + @State status: number = PlayerConstants.STATUS_PAUSE;
6 14
7 - Text('视频').width('100%').height('50%').backgroundColor('#000').fontColor(Color.White) 15 + padding1(num: string) {
  16 + let length = 2;
  17 + for (let len = (num.toString()).length; len < length; len = num.length) {
  18 + num = `${'0'}${num}`;
  19 + }
  20 + return num;
  21 + }
8 22
9 - Row() {  
10 - Text('title')  
11 - Text('contentcontentcontentcontentcontentcontentcontentcontentcontentcontentcontentcontentcontentcontentcontentcontentcontentcontentcontentcontentcontentcontent') 23 + secondToTime(seconds: number) {
  24 + let time = '00:00'
  25 + let hourUnit = 60 * 60;
  26 + let hour = Math.floor(seconds / hourUnit);
  27 + let minute = Math.floor((seconds - hour * hourUnit) / 60);
  28 + let second = seconds - hour * hourUnit - minute * 60;
  29 + if (hour > 0) {
  30 + return `${this.padding1(hour.toString())}${':'}${this.padding1(minute.toString())}${':'}${this.padding1(second.toString())}`;
  31 + }
  32 + if (minute > 0) {
  33 + return `${this.padding1(minute.toString())}${':'}${this.padding1(second.toString())}`;
  34 + } else {
  35 + return `${'00'}${':'}${this.padding1(second.toString())}`;
  36 + }
  37 + }
  38 +
  39 + build() {
  40 + Column() {
  41 +
  42 + Text() {
  43 + Span(this.secondToTime(6))
  44 + Span(' / ')
  45 + Span('00:06')
12 } 46 }
13 - .backgroundColor('#ff0000')  
14 - .align(Alignment.BottomStart)  
15 - .position({ y: '100%' })  
16 - .markAnchor({ y: '100%' }) 47 + .fontSize(24)
  48 + .fontColor(Color.White)
  49 + .fontWeight(600)
  50 + .margin({ bottom: 30 })
  51 +
  52 + // .visibility(Visibility.None)
  53 +
  54 + Slider({
  55 + value: this.progressVal,
  56 + step: 0.01,
  57 + // style: SliderStyle.OutSet
  58 + })
  59 + .blockColor(this.status === PlayerConstants.STATUS_START ? Color.Transparent : $r('app.color.play_block_color'))
  60 + .trackColor(this.status === PlayerConstants.STATUS_START ? $r('app.color.play_track_color') : $r('app.color.pause_track_color'))
  61 + .selectedColor(this.status === PlayerConstants.STATUS_START ? $r('app.color.play_selected_color') : $r('app.color.pause_selected_color'))
  62 + .trackThickness(this.status === PlayerConstants.STATUS_START ? 1 : 4)
  63 + .blockStyle({
  64 + type: this.status === PlayerConstants.STATUS_START ? SliderBlockType.DEFAULT : SliderBlockType.IMAGE,
  65 + image: $r('app.media.ic_player_block')
  66 + })
  67 + .blockSize({ width: 18, height: 12 })
  68 + .width('100%')// .height(19)
  69 + .onChange((value: number, mode: SliderChangeMode) => {
  70 + // this.playerController?.setSeekTime(Math.floor(value), mode);
  71 + })
17 72
18 } 73 }
19 - .width(300)  
20 - .height(600)  
21 - .backgroundColor('#cccccc') 74 + .backgroundColor(Color.Blue)
  75 + .height('100%')
22 } 76 }
23 } 77 }
@@ -26,7 +26,7 @@ const TAG = 'VideoChannelDetail' @@ -26,7 +26,7 @@ const TAG = 'VideoChannelDetail'
26 let timer: number = -1 26 let timer: number = -1
27 27
28 const storage = LocalStorage.getShared(); 28 const storage = LocalStorage.getShared();
29 - 29 +
30 @Entry(storage) 30 @Entry(storage)
31 @Component 31 @Component
32 export struct VideoChannelDetail { 32 export struct VideoChannelDetail {
@@ -2,20 +2,21 @@ import { WDPlayerController } from 'wdPlayer/Index'; @@ -2,20 +2,21 @@ import { WDPlayerController } from 'wdPlayer/Index';
2 import { PlayerTitleView } from './PlayerTitleView' 2 import { PlayerTitleView } from './PlayerTitleView'
3 import { PlayerProgressView } from './PlayerProgressView' 3 import { PlayerProgressView } from './PlayerProgressView'
4 import { PlayerCommentView } from './PlayerCommentView' 4 import { PlayerCommentView } from './PlayerCommentView'
  5 +import { PlayerTimeSeekView } from './PlayerTimeSeekView'
5 6
6 @Component 7 @Component
7 export struct PlayerBottomView { 8 export struct PlayerBottomView {
  9 + private playerController?: WDPlayerController;
8 @Consume showComment?: boolean 10 @Consume showComment?: boolean
9 @Consume isOpenDetail?: boolean 11 @Consume isOpenDetail?: boolean
10 - private playerController?: WDPlayerController; 12 + @Consume isDragging?: boolean
11 13
12 build() { 14 build() {
13 Column() { 15 Column() {
14 PlayerTitleView() 16 PlayerTitleView()
15 PlayerProgressView({ playerController: this.playerController }) 17 PlayerProgressView({ playerController: this.playerController })
16 - .visibility(this.isOpenDetail ? Visibility.None : Visibility.Visible)  
17 if (this.showComment) { 18 if (this.showComment) {
18 - PlayerCommentView().visibility(this.isOpenDetail ? Visibility.None : Visibility.Visible) 19 + PlayerCommentView()
19 } 20 }
20 } 21 }
21 .alignItems(HorizontalAlign.Start) 22 .alignItems(HorizontalAlign.Start)
@@ -3,6 +3,7 @@ import router from '@ohos.router'; @@ -3,6 +3,7 @@ import router from '@ohos.router';
3 @Component 3 @Component
4 export struct PlayerCommentView { 4 export struct PlayerCommentView {
5 @Consume showComment?: boolean 5 @Consume showComment?: boolean
  6 + @Consume isOpenDetail?: boolean
6 @State comment: string = ''; 7 @State comment: string = '';
7 8
8 build() { 9 build() {
@@ -30,5 +31,6 @@ export struct PlayerCommentView { @@ -30,5 +31,6 @@ export struct PlayerCommentView {
30 .backgroundColor(Color.Black) 31 .backgroundColor(Color.Black)
31 .alignItems(VerticalAlign.Center) 32 .alignItems(VerticalAlign.Center)
32 .padding({ left: 16, right: 16, top: 11, bottom: 11 }) 33 .padding({ left: 16, right: 16, top: 11, bottom: 11 })
  34 + .visibility(this.isOpenDetail ? Visibility.None : Visibility.Visible)
33 } 35 }
34 } 36 }
  1 +import { ContentDetailDTO } from 'wdBean/Index';
  2 +import { DateTimeUtils } from 'wdKit/Index';
1 import { PlayerConstants, WDPlayerController } from 'wdPlayer/Index'; 3 import { PlayerConstants, WDPlayerController } from 'wdPlayer/Index';
2 4
3 @Component 5 @Component
4 export struct PlayerProgressView { 6 export struct PlayerProgressView {
5 private playerController?: WDPlayerController; 7 private playerController?: WDPlayerController;
  8 + @Consume contentDetailData: ContentDetailDTO
6 @Consume progressVal: number; 9 @Consume progressVal: number;
  10 + @Consume isOpenDetail: boolean
  11 + @Consume isDragging: boolean
7 @State status: number = PlayerConstants.STATUS_START; 12 @State status: number = PlayerConstants.STATUS_START;
8 13
9 aboutToAppear() { 14 aboutToAppear() {
10 if (this.playerController) { 15 if (this.playerController) {
11 this.playerController.onStatusChange = (status: number) => { 16 this.playerController.onStatusChange = (status: number) => {
12 this.status = status 17 this.status = status
  18 + console.log('=============', this.status)
13 } 19 }
14 } 20 }
15 } 21 }
16 22
17 build() { 23 build() {
18 - Slider({  
19 - value: this.progressVal,  
20 - step: 0.01,  
21 - // style: SliderStyle.OutSet  
22 - })  
23 - .blockColor(this.status === PlayerConstants.STATUS_START ? Color.Transparent : $r('app.color.play_block_color'))  
24 - .trackColor(this.status === PlayerConstants.STATUS_START ? $r('app.color.play_track_color') : $r('app.color.pause_track_color'))  
25 - .selectedColor(this.status === PlayerConstants.STATUS_START ? $r('app.color.play_selected_color') : $r('app.color.pause_selected_color'))  
26 - .trackThickness(this.status === PlayerConstants.STATUS_START ? 1 : 4)  
27 - .blockStyle({  
28 - type: this.status === PlayerConstants.STATUS_START ? SliderBlockType.DEFAULT : SliderBlockType.IMAGE,  
29 - image: $r('app.media.ic_player_block')  
30 - })  
31 - .blockSize({ width: 18, height: 12 })  
32 - .width('100%')  
33 - .height(19)  
34 - .onChange((value: number, mode: SliderChangeMode) => {  
35 - this.playerController?.setSeekTime(Math.floor(value), mode); 24 + Column() {
  25 + Text() {
  26 + Span(DateTimeUtils.secondToTime(Math.floor(this.progressVal / 100 * this.contentDetailData.videoInfo[0].videoDuration)))
  27 + Span(' / ')
  28 + Span(DateTimeUtils.secondToTime(this.contentDetailData.videoInfo[0].videoDuration || 0))
  29 + }
  30 + .fontSize(24)
  31 + .fontColor(Color.White)
  32 + .fontWeight(600)
  33 + .margin({ bottom: 30 })
  34 + .visibility(this.isDragging ? Visibility.Visible : Visibility.None)
  35 +
  36 + Slider({
  37 + value: this.progressVal,
  38 + step: 0.01,
  39 + // style: SliderStyle.OutSet
36 }) 40 })
  41 + .blockColor(this.status === PlayerConstants.STATUS_PAUSE || this.isDragging ? $r('app.color.play_block_color') : Color.Transparent)
  42 + .trackColor(this.status === PlayerConstants.STATUS_PAUSE || this.isDragging ? $r('app.color.pause_track_color') : $r('app.color.play_track_color'))
  43 + .selectedColor(this.status === PlayerConstants.STATUS_PAUSE || this.isDragging ? $r('app.color.pause_selected_color') : $r('app.color.play_selected_color'))
  44 + .trackThickness(this.status === PlayerConstants.STATUS_PAUSE || this.isDragging ? 4 : 1)
  45 + .blockStyle({
  46 + type: this.status === PlayerConstants.STATUS_PAUSE || this.isDragging ? SliderBlockType.IMAGE : SliderBlockType.DEFAULT,
  47 + image: $r('app.media.ic_player_block')
  48 + })
  49 + .blockSize({ width: 18, height: 12 })
  50 + .width('100%')
  51 + .height(19)
  52 + .onChange((value: number, mode: SliderChangeMode) => {
  53 + this.progressVal = value
  54 + if (mode === SliderChangeMode.Moving) {
  55 + this.isDragging = true
  56 + }
  57 + if (mode === SliderChangeMode.End) {
  58 + this.isDragging = false
  59 + }
  60 + this.playerController?.setSeekTime(value, mode);
  61 + console.log('slider onChange:', value, mode)
  62 +
  63 + })
  64 + }.visibility(this.isOpenDetail ? Visibility.None : Visibility.Visible)
37 } 65 }
38 } 66 }
@@ -33,6 +33,7 @@ export struct PlayerRightView { @@ -33,6 +33,7 @@ export struct PlayerRightView {
33 @Consume newsStatusOfUser: batchLikeAndCollectResult 33 @Consume newsStatusOfUser: batchLikeAndCollectResult
34 @Consume followStatus: string 34 @Consume followStatus: string
35 @Consume isOpenDetail: boolean 35 @Consume isOpenDetail: boolean
  36 + @Consume isDragging: boolean
36 @State operationList: OperationItem[] = [ 37 @State operationList: OperationItem[] = [
37 { 38 {
38 icon: $r('app.media.ic_like_uncheck'), 39 icon: $r('app.media.ic_like_uncheck'),
@@ -309,6 +310,6 @@ export struct PlayerRightView { @@ -309,6 +310,6 @@ export struct PlayerRightView {
309 .position({ x: '100%', y: '100%' }) 310 .position({ x: '100%', y: '100%' })
310 .markAnchor({ x: '100%', y: '100%' }) 311 .markAnchor({ x: '100%', y: '100%' })
311 .padding({ bottom: 72 }) 312 .padding({ bottom: 72 })
312 - .visibility(this.isOpenDetail ? Visibility.None : Visibility.Visible) 313 + .visibility(this.isOpenDetail || this.isDragging ? Visibility.None : Visibility.Visible)
313 } 314 }
314 } 315 }
  1 +@Preview
  2 +@Component
  3 +export struct PlayerTimeSeekView {
  4 + build() {
  5 + Row() {
  6 + Text() {
  7 + Span('00:06')
  8 + Span('/')
  9 + Span('00:06')
  10 + }
  11 + .fontSize(24)
  12 + .fontColor(Color.White)
  13 + .fontWeight(600)
  14 +
  15 + }
  16 + }
  17 +}
@@ -9,6 +9,7 @@ export struct PlayerTitleView { @@ -9,6 +9,7 @@ export struct PlayerTitleView {
9 @Consume contentDetailData: ContentDetailDTO 9 @Consume contentDetailData: ContentDetailDTO
10 @Consume windowWidth: number 10 @Consume windowWidth: number
11 @Consume isOpenDetail: boolean 11 @Consume isOpenDetail: boolean
  12 + @Consume isDragging: boolean
12 @State titleHeight: number = 0 13 @State titleHeight: number = 0
13 dialogController: CustomDialogController = new CustomDialogController({ 14 dialogController: CustomDialogController = new CustomDialogController({
14 builder: DetailDialog({ 15 builder: DetailDialog({
@@ -104,6 +105,6 @@ export struct PlayerTitleView { @@ -104,6 +105,6 @@ export struct PlayerTitleView {
104 .width(this.windowWidth - 100 + 'px') 105 .width(this.windowWidth - 100 + 'px')
105 .padding({ left: 16, right: 22 }) 106 .padding({ left: 16, right: 22 })
106 .alignItems(HorizontalAlign.Start) 107 .alignItems(HorizontalAlign.Start)
107 - .visibility(this.isOpenDetail ? Visibility.None : Visibility.Visible) 108 + .visibility(this.isOpenDetail || this.isDragging ? Visibility.None : Visibility.Visible)
108 } 109 }
109 } 110 }
@@ -55,6 +55,7 @@ struct LoginPage { @@ -55,6 +55,7 @@ struct LoginPage {
55 alignment:DialogAlignment.Center 55 alignment:DialogAlignment.Center
56 }) 56 })
57 loginViewModel = new LoginViewModel() 57 loginViewModel = new LoginViewModel()
  58 + @State isProtocol:boolean=false
58 59
59 onCodeSend() { 60 onCodeSend() {
60 Logger.debug(TAG, "isCodeSend:" + this.isCodeSend + "") 61 Logger.debug(TAG, "isCodeSend:" + this.isCodeSend + "")
@@ -72,108 +73,119 @@ struct LoginPage { @@ -72,108 +73,119 @@ struct LoginPage {
72 } 73 }
73 74
74 build() { 75 build() {
75 - RelativeContainer() {  
76 -  
77 - //注册内容  
78 - Column() {  
79 - Image($r("app.media.login_logo"))  
80 - .width(120)  
81 - .height(66)  
82 - .margin({ top: 78 })  
83 - .align(Alignment.Center)  
84 -  
85 - if (this.checkCodePage) {  
86 - LoginInputComponent({  
87 - phoneContent: $phoneContent,  
88 - codeContent: $codeContent,  
89 - isSubmit: $isSubmit,  
90 - isCodeSend: $isCodeSend  
91 - })  
92 - } else {  
93 - this.addPassword()  
94 - }  
95 - 76 + Stack() {
  77 + RelativeContainer() {
96 78
97 - Row() {  
98 - Image(this.protocolState ? $r('app.media.login_checkbox_select') : $r('app.media.login_checkbox_unselected'))  
99 - .width(15)  
100 - .height(15)  
101 - .onClick(() => {  
102 - this.protocolState = !this.protocolState 79 + //注册内容
  80 + Column() {
  81 + Image($r("app.media.login_logo"))
  82 + .width(120)
  83 + .height(66)
  84 + .margin({ top: 78 })
  85 + .align(Alignment.Center)
  86 +
  87 + if (this.checkCodePage) {
  88 + LoginInputComponent({
  89 + phoneContent: $phoneContent,
  90 + codeContent: $codeContent,
  91 + isSubmit: $isSubmit,
  92 + isCodeSend: $isCodeSend
103 }) 93 })
  94 + } else {
  95 + this.addPassword()
  96 + }
104 97
105 - Text() {  
106 - Span("我已阅读并同意").fontColor("#999999").fontSize(12)  
107 - Span("《用户协议》").fontColor("#ED2800").fontSize(12).onClick(() => {  
108 - let bean={contentID:"1",pageID:""} as Params  
109 - WDRouterRule.jumpWithPage(WDRouterPage.loginProtocolPage,bean)  
110 - })  
111 - Span("及").fontColor("#999999").fontSize(12)  
112 - Span("《隐私政策》").fontColor("#ED2800").fontSize(12).onClick(() => {  
113 - let bean={contentID:"2",pageID:""} as Params  
114 - WDRouterRule.jumpWithPage(WDRouterPage.loginProtocolPage,bean)  
115 - }) 98 +
  99 + Row() {
  100 + Image(this.protocolState ? $r('app.media.login_checkbox_select') : $r('app.media.login_checkbox_unselected'))
  101 + .width(15)
  102 + .height(15)
  103 + .onClick(() => {
  104 + this.protocolState = !this.protocolState
  105 + })
  106 +
  107 + Text() {
  108 + Span("我已阅读并同意").fontColor("#999999").fontSize(12)
  109 + Span("《用户协议》").fontColor("#ED2800").fontSize(12).onClick(() => {
  110 + let bean = { contentID: "1", pageID: "" } as Params
  111 + WDRouterRule.jumpWithPage(WDRouterPage.loginProtocolPage, bean)
  112 + })
  113 + Span("及").fontColor("#999999").fontSize(12)
  114 + Span("《隐私政策》").fontColor("#ED2800").fontSize(12).onClick(() => {
  115 + let bean = { contentID: "2", pageID: "" } as Params
  116 + WDRouterRule.jumpWithPage(WDRouterPage.loginProtocolPage, bean)
  117 + })
  118 + }
  119 + }.margin({ top: 48 }).alignItems(VerticalAlign.Center)
  120 +
  121 + Row() {
  122 + Text("登录")
  123 + .borderRadius(4)
  124 + .fontColor(this.isSubmit ? "#FFFFFFFF" : "#66FFFFFF")
  125 + .fontSize(18)
  126 + .fontWeight(FontWeight.Medium)
  127 + .margin({ top: 20 })
  128 + .height(44)
  129 + .textAlign(TextAlign.Center)
  130 + .width("100%")
  131 + .backgroundColor(this.isSubmit ? "#FFED2800" : "#99ED2800")
  132 + .onClick(() => {
  133 + if (!this.isSubmit) {
  134 + return
  135 + }
  136 + this.loginSubmit()
  137 +
  138 + })
  139 + }.padding({ left: 25, right: 25 }).width('100%')
  140 +
  141 +
  142 + if (!this.checkCodePage) {
  143 + Text('忘记密码').fontColor('#666666').fontSize(14).margin({ top: 16 })
  144 + .onClick(() => {
  145 + // router.pushUrl({ url: 'pages/login/ForgetPasswordPage' })
  146 + let pageType = { 'pageType': 0 } as Record<string, number>;
  147 + WDRouterRule.jumpWithPage(WDRouterPage.forgetPasswordPage, pageType)
  148 + })
116 } 149 }
117 - }.margin({ top: 48 }).alignItems(VerticalAlign.Center)  
118 150
119 - Row() {  
120 - Text("登录")  
121 - .borderRadius(4)  
122 - .fontColor(this.isSubmit ?"#FFFFFFFF":"#66FFFFFF")  
123 - .fontSize(18)  
124 - .fontWeight(FontWeight.Medium)  
125 - .margin({ top: 20 })  
126 - .height(44)  
127 - .textAlign(TextAlign.Center)  
128 - .width("100%")  
129 - .backgroundColor(this.isSubmit?"#FFED2800":"#99ED2800")  
130 - .onClick(() => {  
131 - if(!this.isSubmit){  
132 - return  
133 - }  
134 - this.loginSubmit() 151 + }.width("100%")
  152 + .alignRules({
  153 + top: { anchor: "__container__", align: VerticalAlign.Top },
  154 + }).id("register")
135 155
136 - })  
137 - }.padding({ left: 25, right: 25 }).width('100%') 156 + //其他登录方式
  157 + Column() {
  158 + this.addOtherLogin()
  159 + }.width('100%')
  160 + .alignRules({
  161 + bottom: { anchor: "__container__", align: VerticalAlign.Bottom },
  162 + }).id("other")
138 163
  164 + //关闭按钮
  165 + Image($r('app.media.login_closed'))
  166 + .width(24)
  167 + .height(24)
  168 + .margin({ top: 10, right: 15 })
  169 + .alignRules({
  170 + top: { anchor: "__container__", align: VerticalAlign.Top },
  171 + right: { anchor: "__container__", align: HorizontalAlign.End }
  172 + })
  173 + .onClick(() => {
  174 + router.back()
  175 + })
  176 + .id('id_close')
139 177
140 - if (!this.checkCodePage) {  
141 - Text('忘记密码').fontColor('#666666').fontSize(14).margin({ top: 16 })  
142 - .onClick(() => {  
143 - // router.pushUrl({ url: 'pages/login/ForgetPasswordPage' })  
144 - let pageType = {'pageType': 0} as Record<string, number>;  
145 - WDRouterRule.jumpWithPage(WDRouterPage.forgetPasswordPage, pageType)  
146 - })  
147 - } 178 + }.width('100%').height('100%')
148 179
149 - }.width("100%")  
150 - .alignRules({  
151 - top: { anchor: "__container__", align: VerticalAlign.Top },  
152 - }).id("register") 180 + ProtocolComponent({
  181 + cancelMethod: (): void => this.cancelProtocol(),
  182 + agreeMethod: (): void => this.agreeProtocol()
  183 + })
  184 + .visibility(this.isProtocol ? Visibility.Visible : Visibility.None)
153 185
154 - //其他登录方式  
155 - Column() {  
156 - this.addOtherLogin()  
157 - }.width('100%')  
158 - .alignRules({  
159 - bottom: { anchor: "__container__", align: VerticalAlign.Bottom },  
160 - }).id("other")  
161 -  
162 - //关闭按钮  
163 - Image($r('app.media.login_closed'))  
164 - .width(24)  
165 - .height(24)  
166 - .margin({ top: 10, right: 15 })  
167 - .alignRules({  
168 - top: { anchor: "__container__", align: VerticalAlign.Top },  
169 - right: { anchor: "__container__", align: HorizontalAlign.End }  
170 - })  
171 - .onClick(() => {  
172 - router.back()  
173 - })  
174 - .id('id_close') 186 + }.width('100%')
  187 + .height('100%')
175 188
176 - }.width('100%').height('100%')  
177 } 189 }
178 190
179 @Builder 191 @Builder
@@ -366,8 +378,92 @@ struct LoginPage { @@ -366,8 +378,92 @@ struct LoginPage {
366 if (this.protocolState) { 378 if (this.protocolState) {
367 this.requestLogin() 379 this.requestLogin()
368 } else { 380 } else {
369 - this.dialogController.open() 381 + // this.dialogController.open()
  382 + this.isProtocol=true
370 } 383 }
371 384
372 } 385 }
  386 +
  387 + agreeProtocol(): void {
  388 + this.isProtocol = false
  389 + this.protocolState = true
  390 + this.requestLogin()
  391 + }
  392 +
  393 + cancelProtocol(): void {
  394 + this.isProtocol = false
  395 + }
  396 +}
  397 +
  398 +
  399 +@Component
  400 +struct ProtocolComponent {
  401 + cancelMethod?: () => void
  402 + agreeMethod?: () => void
  403 +
  404 + build() {
  405 + Stack() {
  406 + Column() {
  407 + Text("温馨提示")
  408 + .fontColor("#222222")
  409 + .fontSize(18)
  410 + .width("100%")
  411 + .fontWeight(FontWeight.Bold)
  412 + .textAlign(TextAlign.Center)
  413 + .margin({ top: 20 })
  414 + Text() {
  415 + Span("为保障您的合法权益,请阅读并同意").fontSize(14).fontColor("#666666")
  416 + Span("《用户协议》").fontSize(14).fontColor("#ED2800").onClick(() => {
  417 + let bean = { contentID: "1", pageID: "" } as Params
  418 + WDRouterRule.jumpWithPage(WDRouterPage.loginProtocolPage, bean)
  419 + })
  420 + Span("及").fontSize(14).fontColor("#666666")
  421 + Span("《隐私政策》").fontSize(14).fontColor("#ED2800").onClick(() => {
  422 + let bean = { contentID: "2", pageID: "" } as Params
  423 + WDRouterRule.jumpWithPage(WDRouterPage.loginProtocolPage, bean)
  424 + })
  425 + Span("后进行登录").fontSize(14).fontColor("#666666")
  426 + }.margin({ top: 12, left: 16, right: 16 })
  427 +
  428 + Divider().color("#999999").width("100%").margin({ top: 14 }).height('1vp')
  429 + Row() {
  430 + Text('放弃登录')
  431 + .fontSize(16)
  432 + .fontColor("#999999")
  433 + .layoutWeight(1)
  434 + .fontWeight(FontWeight.Medium)
  435 + .textAlign(TextAlign.Center)
  436 + .onClick(() => {
  437 + if (this.cancelMethod) {
  438 + this.cancelMethod()
  439 + }
  440 + })
  441 + .height('100%')
  442 + // Divider().color("#999999").height('100%').width('0.5vp')
  443 + Text('同意并登录')
  444 + .fontSize(16)
  445 + .fontColor("#ED2800")
  446 + .layoutWeight(1)
  447 + .fontWeight(FontWeight.Medium)
  448 + .textAlign(TextAlign.Center)
  449 + .border({
  450 + width: { left: 1 },
  451 + color: "#999999",
  452 + style: { left: BorderStyle.Solid }
  453 +
  454 + })
  455 + .onClick(() => {
  456 + if (this.agreeMethod) {
  457 + this.agreeMethod()
  458 + }
  459 + })
  460 + .height('100%')
  461 + }.layoutWeight(1).justifyContent(FlexAlign.Center)
  462 + }.height(161).backgroundColor(Color.White).borderRadius(6).width('74%')
  463 +
  464 + }.width('100%')
  465 + .height('100%')
  466 + .backgroundColor('#66000000')
  467 +
  468 + }
373 } 469 }
1 import router from '@ohos.router' 1 import router from '@ohos.router'
2 -import { WDRouterRule } from 'wdRouter'; 2 +import { ProcessUtils, WDRouterRule } from 'wdRouter';
3 import { WDRouterPage } from 'wdRouter'; 3 import { WDRouterPage } from 'wdRouter';
4 import { Logger, SPHelper } from 'wdKit/Index'; 4 import { Logger, SPHelper } from 'wdKit/Index';
5 import { SpConstants } from 'wdConstant/Index'; 5 import { SpConstants } from 'wdConstant/Index';
@@ -178,23 +178,14 @@ struct LaunchAdvertisingPage { @@ -178,23 +178,14 @@ struct LaunchAdvertisingPage {
178 // openType 端外 端内 打开 178 // openType 端外 端内 打开
179 if (this.model.launchAdInfo[0].matInfo.openType == '2') { 179 if (this.model.launchAdInfo[0].matInfo.openType == '2') {
180 //端外打开 180 //端外打开
181 - let context = getContext(this) as common.UIAbilityContext;  
182 - let wantInfo: Want = {  
183 - // uncomment line below if wish to implicitly query only in the specific bundle.  
184 - // bundleName: 'com.example.myapplication',  
185 - action: 'ohos.want.action.viewData',  
186 - // entities can be omitted.  
187 - entities: ['entity.system.browsable'],  
188 - uri: 'https://news.bjd.com.cn/2024/03/19/10724331.shtml'  
189 - }  
190 - context.startAbility(wantInfo).then(() => {  
191 - // ...  
192 - }).catch((err: BusinessError) => {  
193 - // ...  
194 - }) 181 +
  182 + ProcessUtils.jumpExternalWebPage(this.model.launchAdInfo[0].matInfo.linkUrl)
  183 + clearInterval(this.timer)
  184 +
195 }else { 185 }else {
196 //端内打开 186 //端内打开
197 - 187 + ProcessUtils.gotoDefaultWebPage(this.model.launchAdInfo[0].matInfo.linkUrl)
  188 + clearInterval(this.timer)
198 189
199 } 190 }
200 } 191 }
@@ -98,6 +98,12 @@ struct LaunchPage { @@ -98,6 +98,12 @@ struct LaunchPage {
98 //获取本地存储的启动页数据 98 //获取本地存储的启动页数据
99 99
100 let dataModelStr : string = SPHelper.default.getSync(SpConstants.APP_LAUNCH_PAGE_DATA_MODEL,'') as string 100 let dataModelStr : string = SPHelper.default.getSync(SpConstants.APP_LAUNCH_PAGE_DATA_MODEL,'') as string
  101 + if (!dataModelStr) {
  102 + //直接跳转首页
  103 + WDRouterRule.jumpWithReplacePage(WDRouterPage.mainPage)
  104 + return
  105 + }
  106 +
101 let dataModel : LaunchDataModel = JSON.parse(dataModelStr) 107 let dataModel : LaunchDataModel = JSON.parse(dataModelStr)
102 console.log(dataModelStr) 108 console.log(dataModelStr)
103 109
  1 +-----BEGIN NEW CERTIFICATE REQUEST-----
  2 +MIIBSjCB8gIBADBgMQswCQYDVQQGEwI4NjEOMAwGA1UECBMFQW5odWkxDjAMBgNV
  3 +BAcTBUhlZmVpMRIwEAYDVQQKEwlXb25kZXJUZWsxDzANBgNVBAsTBldvbmRlcjEM
  4 +MAoGA1UEAxMDWEdZMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEcpXWRUmv/W+Q
  5 +j25o83pS3Ftb6VtfwUsapOYxIqoxmpauFHTKg1RA7h3QlILy3rhNW7I8wiwNA+kp
  6 +jfLqCGzMQqAwMC4GCSqGSIb3DQEJDjEhMB8wHQYDVR0OBBYEFPdvSvMO2yFULBr+
  7 +iUFb6ytXskNHMAoGCCqGSM49BAMCA0cAMEQCID4oV66jJ0KJ23jAHFlQ+5xioszZ
  8 +dYhhRK7tG9Dsy4VpAiAx3rhNI8RbM7s+t2hqEsbrBXznNK7omEU4hooOkewbaw==
  9 +-----END NEW CERTIFICATE REQUEST-----
  1 +-----BEGIN CERTIFICATE-----
  2 +MIICGjCCAaGgAwIBAgIIShhpn519jNAwCgYIKoZIzj0EAwMwUzELMAkGA1UEBhMC
  3 +Q04xDzANBgNVBAoMBkh1YXdlaTETMBEGA1UECwwKSHVhd2VpIENCRzEeMBwGA1UE
  4 +AwwVSHVhd2VpIENCRyBSb290IENBIEcyMB4XDTIwMDMxNjAzMDQzOVoXDTQ5MDMx
  5 +NjAzMDQzOVowUzELMAkGA1UEBhMCQ04xDzANBgNVBAoMBkh1YXdlaTETMBEGA1UE
  6 +CwwKSHVhd2VpIENCRzEeMBwGA1UEAwwVSHVhd2VpIENCRyBSb290IENBIEcyMHYw
  7 +EAYHKoZIzj0CAQYFK4EEACIDYgAEWidkGnDSOw3/HE2y2GHl+fpWBIa5S+IlnNrs
  8 +GUvwC1I2QWvtqCHWmwFlFK95zKXiM8s9yV3VVXh7ivN8ZJO3SC5N1TCrvB2lpHMB
  9 +wcz4DA0kgHCMm/wDec6kOHx1xvCRo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0T
  10 +AQH/BAUwAwEB/zAdBgNVHQ4EFgQUo45a9Vq8cYwqaiVyfkiS4pLcIAAwCgYIKoZI
  11 +zj0EAwMDZwAwZAIwMypeB7P0IbY7c6gpWcClhRznOJFj8uavrNu2PIoz9KIqr3jn
  12 +BlBHJs0myI7ntYpEAjBbm8eDMZY5zq5iMZUC6H7UzYSix4Uy1YlsLVV738PtKP9h
  13 +FTjgDHctXJlC5L7+ZDY=
  14 +-----END CERTIFICATE-----
  15 +-----BEGIN CERTIFICATE-----
  16 +MIIDATCCAoigAwIBAgIIXmuDXbWpOB8wCgYIKoZIzj0EAwMwUzELMAkGA1UEBhMC
  17 +Q04xDzANBgNVBAoMBkh1YXdlaTETMBEGA1UECwwKSHVhd2VpIENCRzEeMBwGA1UE
  18 +AwwVSHVhd2VpIENCRyBSb290IENBIEcyMB4XDTIwMDcwOTAyMDQyNFoXDTMwMDcw
  19 +NzAyMDQyNFowYjELMAkGA1UEBgwCQ04xDzANBgNVBAoMBkh1YXdlaTETMBEGA1UE
  20 +CwwKSHVhd2VpIENCRzEtMCsGA1UEAwwkSHVhd2VpIENCRyBEZXZlbG9wZXIgUmVs
  21 +YXRpb25zIENBIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE65LdoIZh1hlpZ2gP
  22 +bJ6gPhHsvYSRe22KETgdqeVeYnrbRHI9wsPT6RGYS+pU4mPl6wxzgDMqN6SY/BoZ
  23 +luhkE1PzaHoPoNIWIq0O33hpyKyyYwAacIUEjYurkw1E9r9no4IBGDCCARQwHwYD
  24 +VR0jBBgwFoAUo45a9Vq8cYwqaiVyfkiS4pLcIAAwHQYDVR0OBBYEFNtek7Ij6NDk
  25 +/nF6Zumkc0dbf/NeMEYGA1UdIAQ/MD0wOwYEVR0gADAzMDEGCCsGAQUFBwIBFiVo
  26 +dHRwOi8vY3BraS1jYXdlYi5odWF3ZWkuY29tL2Nwa2kvY3BzMBIGA1UdEwEB/wQI
  27 +MAYBAf8CAQAwDgYDVR0PAQH/BAQDAgEGMGYGA1UdHwRfMF0wW6BZoFeGVWh0dHA6
  28 +Ly9jcGtpLWNhd2ViLmh1YXdlaS5jb20vY3BraS9zZXJ2bGV0L2NybEZpbGVEb3du
  29 +LmNybD9jZXJ0eXBlPTEwJi9yb290X2cyX2NybC5jcmwwCgYIKoZIzj0EAwMDZwAw
  30 +ZAIwWO1X5q2MdfpR1Q237GpUHGbL1C13rGyFg2p3AYo44FpZ2/A9ss0wOHKM4KDl
  31 +ZPqdAjBLkf8NPZy7KVog98+iCTLq35DJ2ZVxkCxknA9YhiHVyXf4HPm4JlT7rW7o
  32 +Q+FzM3c=
  33 +-----END CERTIFICATE-----
  34 +-----BEGIN CERTIFICATE-----
  35 +MIIC0jCCAligAwIBAgIOY8sBbjnB96BZITO8K44wCgYIKoZIzj0EAwMwYjELMAkG
  36 +A1UEBgwCQ04xDzANBgNVBAoMBkh1YXdlaTETMBEGA1UECwwKSHVhd2VpIENCRzEt
  37 +MCsGA1UEAwwkSHVhd2VpIENCRyBEZXZlbG9wZXIgUmVsYXRpb25zIENBIEcyMB4X
  38 +DTI0MDQyMzEwNDkxNVoXDTI1MDQyMzEwNDkxNVowgYExCzAJBgNVBAYTAkNOMRgw
  39 +FgYDVQQKDA/kurrmsJHml6XmiqXnpL4xHDAaBgNVBAsMEzE0MDU5MDg1MTcwMDg3
  40 +Mjk5ODUxOjA4BgNVBAMMMeS6uuawkeaXpeaKpeekvigxNDA1OTA4NTE3MDA4NzI5
  41 +OTg1KVwsRGV2ZWxvcG1lbnQwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARyldZF
  42 +Sa/9b5CPbmjzelLcW1vpW1/BSxqk5jEiqjGalq4UdMqDVEDuHdCUgvLeuE1bsjzC
  43 +LA0D6SmN8uoIbMxCo4HRMIHOMAwGA1UdEwEB/wQCMAAwWQYDVR0fBFIwUDBOoEyg
  44 +SoZIaHR0cDovL2g1aG9zdGluZy1kcmNuLmRiYW5rY2RuLmNuL2NjaDUvY3JsL2hk
  45 +cmNhZzIvSHVhd2VpQ0JHSERSRzJjcmwuY3JsMB8GA1UdIwQYMBaAFNtek7Ij6NDk
  46 +/nF6Zumkc0dbf/NeMB0GA1UdDgQWBBT3b0rzDtshVCwa/olBW+srV7JDRzAOBgNV
  47 +HQ8BAf8EBAMCB4AwEwYDVR0lBAwwCgYIKwYBBQUHAwMwCgYIKoZIzj0EAwMDaAAw
  48 +ZQIxALQlPju1pWaQmEkj4DRezSJGS2jiPFfpSjxTJDrG2ipXHQ5jkC4QP/3AzlLe
  49 +LJ70VAIwBpsn6UOHBmNywFrdw2qpdJNueiHHefZlXFD8043LtpeYfQaHi0/gIdCQ
  50 +BclpH6Ga
  51 +-----END CERTIFICATE-----
  1 +-----BEGIN CERTIFICATE-----
  2 +MIICGjCCAaGgAwIBAgIIShhpn519jNAwCgYIKoZIzj0EAwMwUzELMAkGA1UEBhMC
  3 +Q04xDzANBgNVBAoMBkh1YXdlaTETMBEGA1UECwwKSHVhd2VpIENCRzEeMBwGA1UE
  4 +AwwVSHVhd2VpIENCRyBSb290IENBIEcyMB4XDTIwMDMxNjAzMDQzOVoXDTQ5MDMx
  5 +NjAzMDQzOVowUzELMAkGA1UEBhMCQ04xDzANBgNVBAoMBkh1YXdlaTETMBEGA1UE
  6 +CwwKSHVhd2VpIENCRzEeMBwGA1UEAwwVSHVhd2VpIENCRyBSb290IENBIEcyMHYw
  7 +EAYHKoZIzj0CAQYFK4EEACIDYgAEWidkGnDSOw3/HE2y2GHl+fpWBIa5S+IlnNrs
  8 +GUvwC1I2QWvtqCHWmwFlFK95zKXiM8s9yV3VVXh7ivN8ZJO3SC5N1TCrvB2lpHMB
  9 +wcz4DA0kgHCMm/wDec6kOHx1xvCRo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0T
  10 +AQH/BAUwAwEB/zAdBgNVHQ4EFgQUo45a9Vq8cYwqaiVyfkiS4pLcIAAwCgYIKoZI
  11 +zj0EAwMDZwAwZAIwMypeB7P0IbY7c6gpWcClhRznOJFj8uavrNu2PIoz9KIqr3jn
  12 +BlBHJs0myI7ntYpEAjBbm8eDMZY5zq5iMZUC6H7UzYSix4Uy1YlsLVV738PtKP9h
  13 +FTjgDHctXJlC5L7+ZDY=
  14 +-----END CERTIFICATE-----
  15 +-----BEGIN CERTIFICATE-----
  16 +MIIDATCCAoigAwIBAgIIXmuDXbWpOB8wCgYIKoZIzj0EAwMwUzELMAkGA1UEBhMC
  17 +Q04xDzANBgNVBAoMBkh1YXdlaTETMBEGA1UECwwKSHVhd2VpIENCRzEeMBwGA1UE
  18 +AwwVSHVhd2VpIENCRyBSb290IENBIEcyMB4XDTIwMDcwOTAyMDQyNFoXDTMwMDcw
  19 +NzAyMDQyNFowYjELMAkGA1UEBgwCQ04xDzANBgNVBAoMBkh1YXdlaTETMBEGA1UE
  20 +CwwKSHVhd2VpIENCRzEtMCsGA1UEAwwkSHVhd2VpIENCRyBEZXZlbG9wZXIgUmVs
  21 +YXRpb25zIENBIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE65LdoIZh1hlpZ2gP
  22 +bJ6gPhHsvYSRe22KETgdqeVeYnrbRHI9wsPT6RGYS+pU4mPl6wxzgDMqN6SY/BoZ
  23 +luhkE1PzaHoPoNIWIq0O33hpyKyyYwAacIUEjYurkw1E9r9no4IBGDCCARQwHwYD
  24 +VR0jBBgwFoAUo45a9Vq8cYwqaiVyfkiS4pLcIAAwHQYDVR0OBBYEFNtek7Ij6NDk
  25 +/nF6Zumkc0dbf/NeMEYGA1UdIAQ/MD0wOwYEVR0gADAzMDEGCCsGAQUFBwIBFiVo
  26 +dHRwOi8vY3BraS1jYXdlYi5odWF3ZWkuY29tL2Nwa2kvY3BzMBIGA1UdEwEB/wQI
  27 +MAYBAf8CAQAwDgYDVR0PAQH/BAQDAgEGMGYGA1UdHwRfMF0wW6BZoFeGVWh0dHA6
  28 +Ly9jcGtpLWNhd2ViLmh1YXdlaS5jb20vY3BraS9zZXJ2bGV0L2NybEZpbGVEb3du
  29 +LmNybD9jZXJ0eXBlPTEwJi9yb290X2cyX2NybC5jcmwwCgYIKoZIzj0EAwMDZwAw
  30 +ZAIwWO1X5q2MdfpR1Q237GpUHGbL1C13rGyFg2p3AYo44FpZ2/A9ss0wOHKM4KDl
  31 +ZPqdAjBLkf8NPZy7KVog98+iCTLq35DJ2ZVxkCxknA9YhiHVyXf4HPm4JlT7rW7o
  32 +Q+FzM3c=
  33 +-----END CERTIFICATE-----
  34 +-----BEGIN CERTIFICATE-----
  35 +MIICzjCCAlOgAwIBAgIOCfqzV9Lb4emhfwEBhZkwCgYIKoZIzj0EAwMwYjELMAkG
  36 +A1UEBgwCQ04xDzANBgNVBAoMBkh1YXdlaTETMBEGA1UECwwKSHVhd2VpIENCRzEt
  37 +MCsGA1UEAwwkSHVhd2VpIENCRyBEZXZlbG9wZXIgUmVsYXRpb25zIENBIEcyMB4X
  38 +DTI0MDQyMzEwNTA0OFoXDTI3MDQyMzEwNTA0OFowfTELMAkGA1UEBhMCQ04xGDAW
  39 +BgNVBAoMD+S6uuawkeaXpeaKpeekvjEcMBoGA1UECwwTMTQwNTkwODUxNzAwODcy
  40 +OTk4NTE2MDQGA1UEAwwt5Lq65rCR5pel5oql56S+KDE0MDU5MDg1MTcwMDg3Mjk5
  41 +ODUpXCxSZWxlYXNlMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEcpXWRUmv/W+Q
  42 +j25o83pS3Ftb6VtfwUsapOYxIqoxmpauFHTKg1RA7h3QlILy3rhNW7I8wiwNA+kp
  43 +jfLqCGzMQqOB0TCBzjAMBgNVHRMBAf8EAjAAMFkGA1UdHwRSMFAwTqBMoEqGSGh0
  44 +dHA6Ly9oNWhvc3RpbmctZHJjbi5kYmFua2Nkbi5jbi9jY2g1L2NybC9oZHJjYWcy
  45 +L0h1YXdlaUNCR0hEUkcyY3JsLmNybDAfBgNVHSMEGDAWgBTbXpOyI+jQ5P5xembp
  46 +pHNHW3/zXjAdBgNVHQ4EFgQU929K8w7bIVQsGv6JQVvrK1eyQ0cwDgYDVR0PAQH/
  47 +BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMDMAoGCCqGSM49BAMDA2kAMGYCMQD1
  48 +UL0Qj+pCjOirB7hB80Pcd5jrvy1fM1a6MptJdmZtIpUBcMPk8CKO/GeUu4rPrdEC
  49 +MQDN7j9hEa4VJWu35BmoSAyZuJw4bmZ5Y56qmtLX1xFwvu9NDQiO4uZyR7q0M3Oj
  50 +FgA=
  51 +-----END CERTIFICATE-----