wangliang_wd

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

* 'main' of http://192.168.1.42/developOne/harmonyPool:
  feat:精选评论卡-列表_分割线不该为粗线条问题修复
  频道列表国殇
  底导、顶导配置国殇模式
  底导、顶导配置国殇模式
@@ -139,6 +139,9 @@ export class ContentDTO implements BaseDTO { @@ -139,6 +139,9 @@ export class ContentDTO implements BaseDTO {
139 traceId: string = ''; 139 traceId: string = '';
140 traceInfo: string = ''; 140 traceInfo: string = '';
141 141
  142 + // 是否国殇
  143 + isMourning?: boolean = false;
  144 +
142 static clone(old: ContentDTO): ContentDTO { 145 static clone(old: ContentDTO): ContentDTO {
143 let content = new ContentDTO(); 146 let content = new ContentDTO();
144 content.liveType = old.liveType; 147 content.liveType = old.liveType;
@@ -103,3 +103,5 @@ export { CommentListDialogView } from './src/main/ets/components/comment/view/Co @@ -103,3 +103,5 @@ export { CommentListDialogView } from './src/main/ets/components/comment/view/Co
103 export { CustomPullToRefresh } from './src/main/ets/components/reusable/CustomPullToRefresh'; 103 export { CustomPullToRefresh } from './src/main/ets/components/reusable/CustomPullToRefresh';
104 104
105 export { MorningEveningViewModel } from './src/main/ets/viewmodel/MorningEveningViewModel' 105 export { MorningEveningViewModel } from './src/main/ets/viewmodel/MorningEveningViewModel'
  106 +
  107 +export { GrayManageModel } from './src/main/ets/viewmodel/GrayManageModel'
@@ -349,7 +349,7 @@ struct QualityCommentItem { @@ -349,7 +349,7 @@ struct QualityCommentItem {
349 /*分割线*/ 349 /*分割线*/
350 Row() { 350 Row() {
351 351
352 - }.width('100%').margin({ top: 10, left: 0, right: 0 }).backgroundColor('#EDEDED').height(2.5); 352 + }.width('100%').margin({ top: 10, left: 0, right: 0 }).backgroundColor('#EDEDED').height(1);
353 353
354 /*文章或者评论*/ 354 /*文章或者评论*/
355 Row() { 355 Row() {
@@ -14,6 +14,8 @@ import PageNoMoreLayout from './PageNoMoreLayout'; @@ -14,6 +14,8 @@ import PageNoMoreLayout from './PageNoMoreLayout';
14 import { NoMoreBean } from './NoMoreBean'; 14 import { NoMoreBean } from './NoMoreBean';
15 import { RefreshLayoutBean } from '../refresh/RefreshLayoutBean'; 15 import { RefreshLayoutBean } from '../refresh/RefreshLayoutBean';
16 import RefreshLayout from '../refresh/RefreshLayout'; 16 import RefreshLayout from '../refresh/RefreshLayout';
  17 +import { GrayManageModel } from '../../viewmodel/GrayManageModel';
  18 +
17 const TAG = 'PageComponent'; 19 const TAG = 'PageComponent';
18 20
19 @Component 21 @Component
@@ -24,6 +26,7 @@ export struct PageComponent { @@ -24,6 +26,7 @@ export struct PageComponent {
24 navIndex: number = 0; 26 navIndex: number = 0;
25 pageId: string = ""; 27 pageId: string = "";
26 channelId: string = ""; 28 channelId: string = "";
  29 + isMourning: boolean = false // 是否国殇
27 @Link @Watch('onChange') currentTopNavSelectedIndex: number 30 @Link @Watch('onChange') currentTopNavSelectedIndex: number
28 // 自动刷新通知 31 // 自动刷新通知
29 @Prop @Watch('onAutoRefresh') autoRefresh: number = 0 32 @Prop @Watch('onAutoRefresh') autoRefresh: number = 0
@@ -36,6 +39,8 @@ export struct PageComponent { @@ -36,6 +39,8 @@ export struct PageComponent {
36 * @deprecated 39 * @deprecated
37 */ 40 */
38 private pageTrackBean: PageTrackBean = new PageTrackBean() 41 private pageTrackBean: PageTrackBean = new PageTrackBean()
  42 + // 国殇灰度管理
  43 + GrayManage: SubscribedAbstractProperty<GrayManageModel> = AppStorage.link<GrayManageModel>('GrayManage')
39 44
40 build() { 45 build() {
41 Column() { 46 Column() {
@@ -52,6 +57,7 @@ export struct PageComponent { @@ -52,6 +57,7 @@ export struct PageComponent {
52 this.getData() 57 this.getData()
53 } 58 }
54 }) 59 })
  60 + .grayscale(this.isMourning ? 1 : 0)
55 } 61 }
56 } 62 }
57 .width(CommonConstants.FULL_PARENT) 63 .width(CommonConstants.FULL_PARENT)
@@ -91,6 +97,7 @@ export struct PageComponent { @@ -91,6 +97,7 @@ export struct PageComponent {
91 this.pageModel.offsetY) 97 this.pageModel.offsetY)
92 }) 98 })
93 } 99 }
  100 + .grayscale(this.isMourning ? 1 : 0)
94 101
95 LazyForEach(this.pageModel.compList, (compDTO: CompDTO, compIndex: number) => { 102 LazyForEach(this.pageModel.compList, (compDTO: CompDTO, compIndex: number) => {
96 ListItem() { 103 ListItem() {
@@ -106,6 +113,7 @@ export struct PageComponent { @@ -106,6 +113,7 @@ export struct PageComponent {
106 ); 113 );
107 } 114 }
108 } 115 }
  116 + .grayscale(this.isMourning && compIndex < 8 ? 1 : 0)
109 }, 117 },
110 (compDTO: CompDTO, compIndex: number) => JSON.stringify(compDTO)) 118 (compDTO: CompDTO, compIndex: number) => JSON.stringify(compDTO))
111 119
@@ -117,6 +125,7 @@ export struct PageComponent { @@ -117,6 +125,7 @@ export struct PageComponent {
117 PageNoMoreLayout({ noMoreBean: new NoMoreBean(this.pageModel.pageInfo.baselineCopywriting) }) 125 PageNoMoreLayout({ noMoreBean: new NoMoreBean(this.pageModel.pageInfo.baselineCopywriting) })
118 } 126 }
119 } 127 }
  128 + .grayscale(this.isMourning ? 1 : 0)
120 } 129 }
121 .edgeEffect(EdgeEffect.None) 130 .edgeEffect(EdgeEffect.None)
122 .scrollBar(BarState.Off) 131 .scrollBar(BarState.Off)
@@ -138,7 +147,7 @@ export struct PageComponent { @@ -138,7 +147,7 @@ export struct PageComponent {
138 147
139 @Builder 148 @Builder
140 LoadingLayout() { 149 LoadingLayout() {
141 - channelSkeleton() 150 + channelSkeleton().grayscale(this.isMourning ? 1 : 0)
142 // CustomRefreshLoadLayout({ 151 // CustomRefreshLoadLayout({
143 // refreshBean: new RefreshLayoutBean(true, 152 // refreshBean: new RefreshLayoutBean(true,
144 // $r('app.media.ic_pull_up_load'), $r('app.string.pull_up_load_text'), this.pageModel.pullDownRefreshHeight) 153 // $r('app.media.ic_pull_up_load'), $r('app.string.pull_up_load_text'), this.pageModel.pullDownRefreshHeight)
@@ -197,6 +206,7 @@ export struct PageComponent { @@ -197,6 +206,7 @@ export struct PageComponent {
197 ProcessUtils.advJumpMainPage(this.pageAdvModel.pageCornerContentInfo.advert) 206 ProcessUtils.advJumpMainPage(this.pageAdvModel.pageCornerContentInfo.advert)
198 } 207 }
199 }) 208 })
  209 + .grayscale(this.GrayManage.get().isMourning() ? 1 : 0)
200 // 关闭按钮 210 // 关闭按钮
201 Image($r('app.media.icon_adv_horn_close')) 211 Image($r('app.media.icon_adv_horn_close'))
202 .id('left_close') 212 .id('left_close')
@@ -215,6 +225,7 @@ export struct PageComponent { @@ -215,6 +225,7 @@ export struct PageComponent {
215 this.pageAdvModel.isShowAds = false; 225 this.pageAdvModel.isShowAds = false;
216 226
217 }) 227 })
  228 + .grayscale(this.GrayManage.get().isMourning() ? 1 : 0)
218 229
219 if (type == 1) { 230 if (type == 1) {
220 Text($r('app.string.comp_advertisement')) 231 Text($r('app.string.comp_advertisement'))
@@ -236,6 +247,7 @@ export struct PageComponent { @@ -236,6 +247,7 @@ export struct PageComponent {
236 bottomLeft: $r('app.float.vp_2'), 247 bottomLeft: $r('app.float.vp_2'),
237 bottomRight: $r('app.float.vp_2') 248 bottomRight: $r('app.float.vp_2')
238 }) 249 })
  250 + .grayscale(this.GrayManage.get().isMourning() ? 1 : 0)
239 } 251 }
240 252
241 } 253 }
@@ -11,6 +11,7 @@ import { ParamType, TrackConstants, Tracking, TrackingButton } from 'wdTracking/ @@ -11,6 +11,7 @@ import { ParamType, TrackConstants, Tracking, TrackingButton } from 'wdTracking/
11 import DailyPaperTopicModel from '../../model/DailyPaperTopicModel'; 11 import DailyPaperTopicModel from '../../model/DailyPaperTopicModel';
12 import { CompUtils } from '../../utils/CompUtils'; 12 import { CompUtils } from '../../utils/CompUtils';
13 import ChannelViewModel from '../../viewmodel/ChannelViewModel'; 13 import ChannelViewModel from '../../viewmodel/ChannelViewModel';
  14 +import { GrayManageModel } from '../../viewmodel/GrayManageModel';
14 import { ColorUtils } from '../../utils/ColorUtils'; 15 import { ColorUtils } from '../../utils/ColorUtils';
15 import { ImageKnifeComponent } from '@ohos/imageknife'; 16 import { ImageKnifeComponent } from '@ohos/imageknife';
16 import { CommonUtils } from '../../utils/CommonUtils'; 17 import { CommonUtils } from '../../utils/CommonUtils';
@@ -26,6 +27,7 @@ const storage = LocalStorage.getShared(); @@ -26,6 +27,7 @@ const storage = LocalStorage.getShared();
26 @Component 27 @Component
27 export struct TopNavigationComponentNew { 28 export struct TopNavigationComponentNew {
28 private topRectHeight: number = AppStorage.get<number>('topSafeHeight') || 0; 29 private topRectHeight: number = AppStorage.get<number>('topSafeHeight') || 0;
  30 +
29 private pageName: string = '' 31 private pageName: string = ''
30 private pageId: number = 0 32 private pageId: number = 0
31 readonly MAX_LINE: number = 1; // 顶部tab text最大行数 33 readonly MAX_LINE: number = 1; // 顶部tab text最大行数
@@ -70,6 +72,8 @@ export struct TopNavigationComponentNew { @@ -70,6 +72,8 @@ export struct TopNavigationComponentNew {
70 // 顶部导航栏是否有临时跳转频道数据不 72 // 顶部导航栏是否有临时跳转频道数据不
71 @State haveTempTabData: boolean = false 73 @State haveTempTabData: boolean = false
72 @State backgroundImageH: number = 0 74 @State backgroundImageH: number = 0
  75 + // 国殇灰度管理
  76 + GrayManage: SubscribedAbstractProperty<GrayManageModel> = AppStorage.link<GrayManageModel>('GrayManage')
73 77
74 build() { 78 build() {
75 Column() { 79 Column() {
@@ -90,15 +94,17 @@ export struct TopNavigationComponentNew { @@ -90,15 +94,17 @@ export struct TopNavigationComponentNew {
90 }) 94 })
91 } else { 95 } else {
92 if (!this.isBroadcast(navItem) && !this.isLayout(navItem)) { 96 if (!this.isBroadcast(navItem) && !this.isLayout(navItem)) {
93 - PageComponent({  
94 - currentTopNavSelectedIndex: $currentTopNavSelectedIndex,  
95 - navIndex: index,  
96 - pageId: navItem?.pageId + '',  
97 - channelId: navItem?.channelId + '',  
98 - autoRefresh: this.autoRefresh2Page  
99 - }) 97 + if (CompUtils.isNews(this.navItem)) {
  98 + this.createPageComponent(navItem, index,
  99 + (channelId) => this.GrayManage.get().isNewsMourning(channelId));
  100 + } else if (CompUtils.isRMH(this.navItem)) {
  101 + this.createPageComponent(navItem, index,
  102 + (channelId) => this.GrayManage.get().isRmhMourning(channelId));
  103 + }
  104 +
100 } else { 105 } else {
101 channelSkeleton() 106 channelSkeleton()
  107 + .grayscale(this.GrayManage.get().isMourning() ? 1 : 0)
102 } 108 }
103 } 109 }
104 }) 110 })
@@ -157,6 +163,17 @@ export struct TopNavigationComponentNew { @@ -157,6 +163,17 @@ export struct TopNavigationComponentNew {
157 } 163 }
158 164
159 } 165 }
  166 + @Builder
  167 + createPageComponent(navItem: TopNavDTO, index: number, mourningCheckFn: (channelId: string) => boolean) {
  168 + PageComponent({
  169 + currentTopNavSelectedIndex: this.currentTopNavSelectedIndex,
  170 + navIndex: index,
  171 + pageId: navItem?.pageId + '',
  172 + channelId: navItem?.channelId + '',
  173 + autoRefresh: this.autoRefresh2Page,
  174 + isMourning: mourningCheckFn(`${navItem.channelId}`),
  175 + });
  176 + }
160 177
161 /** 178 /**
162 * 新闻tab 头部 179 * 新闻tab 头部
@@ -217,6 +234,7 @@ export struct TopNavigationComponentNew { @@ -217,6 +234,7 @@ export struct TopNavigationComponentNew {
217 // 预留状态栏 234 // 预留状态栏
218 .margin({ top: this.topRectHeight + 'px' }) 235 .margin({ top: this.topRectHeight + 'px' })
219 .id('topBar') 236 .id('topBar')
  237 + .grayscale(this.GrayManage.get().isMourning() ? 1 : 0)
220 } 238 }
221 239
222 /** 240 /**
@@ -229,11 +247,22 @@ export struct TopNavigationComponentNew { @@ -229,11 +247,22 @@ export struct TopNavigationComponentNew {
229 } 247 }
230 248
231 @Builder 249 @Builder
  250 + buildTabBarItems(mourningCheckFn: (channelId: string) => boolean) {
  251 + ForEach(this.topNavList, (navItem: TopNavDTO, index: number) => {
  252 + ListItem() {
  253 + this.tabBarBuilder(navItem, index)
  254 + }
  255 + .grayscale(mourningCheckFn(`${navItem.channelId}`) ? 1 : 0)
  256 + });
  257 + }
  258 +
  259 + @Builder
232 tabBar() { 260 tabBar() {
233 261
234 if (CompUtils.isNews(this.navItem)) { 262 if (CompUtils.isNews(this.navItem)) {
235 // 顶部背景图 263 // 顶部背景图
236 Image(this.navItem.backgroundUrl).width('100%') 264 Image(this.navItem.backgroundUrl).width('100%')
  265 + .grayscale(this.GrayManage.get().isMourning() ? 1 : 0)
237 // 顶部搜索、日报logo、早晚报 266 // 顶部搜索、日报logo、早晚报
238 this.topBar() 267 this.topBar()
239 268
@@ -254,12 +283,14 @@ export struct TopNavigationComponentNew { @@ -254,12 +283,14 @@ export struct TopNavigationComponentNew {
254 'top': { 'anchor': 'topBar', 'align': VerticalAlign.Bottom }, 283 'top': { 'anchor': 'topBar', 'align': VerticalAlign.Bottom },
255 'right': { 'anchor': '__container__', 'align': HorizontalAlign.End } 284 'right': { 'anchor': '__container__', 'align': HorizontalAlign.End }
256 }) 285 })
  286 + .grayscale(this.GrayManage.get().isMourning() ? 1 : 0)
257 287
258 List({ scroller: this.listScroller }) { 288 List({ scroller: this.listScroller }) {
259 ForEach(this.myChannelList, (navItem: TopNavDTO, index: number) => { 289 ForEach(this.myChannelList, (navItem: TopNavDTO, index: number) => {
260 ListItem() { 290 ListItem() {
261 this.tabBarBuilder(navItem, index) 291 this.tabBarBuilder(navItem, index)
262 } 292 }
  293 + .grayscale(this.GrayManage.get().isNewsMourning(`${navItem.channelId}`) ? 1 : 0)
263 }) 294 })
264 } 295 }
265 .listDirection(Axis.Horizontal) 296 .listDirection(Axis.Horizontal)
@@ -275,7 +306,10 @@ export struct TopNavigationComponentNew { @@ -275,7 +306,10 @@ export struct TopNavigationComponentNew {
275 }) 306 })
276 } else { 307 } else {
277 // 顶部背景图 308 // 顶部背景图
278 - Image(this.navItem.backgroundUrl).width('100%').height(this.backgroundImageH) 309 + Image(this.navItem.backgroundUrl)
  310 + .width('100%')
  311 + .height(this.backgroundImageH)
  312 + .grayscale(this.GrayManage.get().isMourning() ? 1 : 0)
279 313
280 Row() { 314 Row() {
281 Image($r('app.media.icon_search')) 315 Image($r('app.media.icon_search'))
@@ -299,13 +333,12 @@ export struct TopNavigationComponentNew { @@ -299,13 +333,12 @@ export struct TopNavigationComponentNew {
299 let params = { 'tabName': "PEOPLE" } as Record<string, string> 333 let params = { 'tabName': "PEOPLE" } as Record<string, string>
300 WDRouterRule.jumpWithPage(WDRouterPage.searchPage, params) 334 WDRouterRule.jumpWithPage(WDRouterPage.searchPage, params)
301 }) 335 })
  336 + .grayscale(this.GrayManage.get().isMourning() ? 1 : 0)
302 337
303 List({ scroller: this.listScroller }) { 338 List({ scroller: this.listScroller }) {
304 - ForEach(this.topNavList, (navItem: TopNavDTO, index: number) => {  
305 - ListItem() {  
306 - this.tabBarBuilder(navItem, index) 339 + if (CompUtils.isRMH(this.navItem)) {
  340 + this.buildTabBarItems((channelId) => this.GrayManage.get().isRmhMourning(channelId));
307 } 341 }
308 - })  
309 } 342 }
310 .listDirection(Axis.Horizontal) 343 .listDirection(Axis.Horizontal)
311 .scrollBar(BarState.Off) 344 .scrollBar(BarState.Off)
@@ -26,6 +26,7 @@ import { CardParser } from '../CardParser' @@ -26,6 +26,7 @@ import { CardParser } from '../CardParser'
26 import { PeopleShipNoMoreData } from '../reusable/PeopleShipNoMoreData'; 26 import { PeopleShipNoMoreData } from '../reusable/PeopleShipNoMoreData';
27 import PageFollowHelper from '../../viewmodel/PageFollowHelper'; 27 import PageFollowHelper from '../../viewmodel/PageFollowHelper';
28 import { MineFollowListItem } from '../../viewmodel/MineFollowListItem'; 28 import { MineFollowListItem } from '../../viewmodel/MineFollowListItem';
  29 +import { GrayManageModel } from '../../viewmodel/GrayManageModel';
29 30
30 const TAG = 'PeopleShipMainComponent'; 31 const TAG = 'PeopleShipMainComponent';
31 32
@@ -60,6 +61,8 @@ export struct PeopleShipMainComponent { @@ -60,6 +61,8 @@ export struct PeopleShipMainComponent {
60 // 页面展示监听 61 // 页面展示监听
61 @Consume @Watch('onPageShowChange') pageShow: number 62 @Consume @Watch('onPageShowChange') pageShow: number
62 @State private pageAttentionChange: boolean = false 63 @State private pageAttentionChange: boolean = false
  64 + // 国殇灰度管理
  65 + GrayManage: SubscribedAbstractProperty<GrayManageModel> = AppStorage.link<GrayManageModel>('GrayManage')
63 66
64 build() { 67 build() {
65 if (this.viewType == ViewType.LOADING) { 68 if (this.viewType == ViewType.LOADING) {
@@ -73,6 +76,7 @@ export struct PeopleShipMainComponent { @@ -73,6 +76,7 @@ export struct PeopleShipMainComponent {
73 this.getData() 76 this.getData()
74 } 77 }
75 }) 78 })
  79 + .grayscale(this.GrayManage.get().isRmhMourning(`${this.channelId}`) ? 1 : 0)
76 } else if (this.viewType == ViewType.EMPTY) { 80 } else if (this.viewType == ViewType.EMPTY) {
77 //缺省页 81 //缺省页
78 EmptyComponent({ 82 EmptyComponent({
@@ -82,6 +86,7 @@ export struct PeopleShipMainComponent { @@ -82,6 +86,7 @@ export struct PeopleShipMainComponent {
82 this.getData() 86 this.getData()
83 } 87 }
84 }) 88 })
  89 + .grayscale(this.GrayManage.get().isRmhMourning(`${this.channelId}`) ? 1 : 0)
85 } else { 90 } else {
86 if (this.followList.length == 0) { 91 if (this.followList.length == 0) {
87 CustomPullToRefresh({ 92 CustomPullToRefresh({
@@ -133,6 +138,7 @@ export struct PeopleShipMainComponent { @@ -133,6 +138,7 @@ export struct PeopleShipMainComponent {
133 @Builder 138 @Builder
134 LoadingLayout() { 139 LoadingLayout() {
135 channelSkeleton() 140 channelSkeleton()
  141 + .grayscale(this.GrayManage.get().isRmhMourning(`${this.channelId}`) ? 1 : 0)
136 } 142 }
137 143
138 @Builder 144 @Builder
@@ -147,6 +153,7 @@ export struct PeopleShipMainComponent { @@ -147,6 +153,7 @@ export struct PeopleShipMainComponent {
147 changeButton: this.changeButton 153 changeButton: this.changeButton
148 }) 154 })
149 } 155 }
  156 + .grayscale(this.GrayManage.get().isRmhMourning(`${this.channelId}`) ? 1 : 0)
150 } 157 }
151 .edgeEffect(EdgeEffect.None) 158 .edgeEffect(EdgeEffect.None)
152 .scrollBar(BarState.Off) 159 .scrollBar(BarState.Off)
@@ -163,6 +170,7 @@ export struct PeopleShipMainComponent { @@ -163,6 +170,7 @@ export struct PeopleShipMainComponent {
163 followList: this.followList 170 followList: this.followList
164 }) 171 })
165 } 172 }
  173 + .grayscale(this.GrayManage.get().isRmhMourning(`${this.channelId}`) ? 1 : 0)
166 174
167 ForEach(this.attentionList, (item: ContentDTO) => { 175 ForEach(this.attentionList, (item: ContentDTO) => {
168 ListItem() { 176 ListItem() {
@@ -173,6 +181,7 @@ export struct PeopleShipMainComponent { @@ -173,6 +181,7 @@ export struct PeopleShipMainComponent {
173 181
174 }.width("100%") 182 }.width("100%")
175 .backgroundColor(Color.Transparent) 183 .backgroundColor(Color.Transparent)
  184 + .grayscale(item.isMourning ? 1 : 0)
176 185
177 }, (item: ContentDTO, index: number) => item.objectId + index.toString()) 186 }, (item: ContentDTO, index: number) => item.objectId + index.toString())
178 187
@@ -182,6 +191,7 @@ export struct PeopleShipMainComponent { @@ -182,6 +191,7 @@ export struct PeopleShipMainComponent {
182 PeopleShipNoMoreData() 191 PeopleShipNoMoreData()
183 } 192 }
184 } 193 }
  194 + .grayscale(this.GrayManage.get().isRmhMourning(`${this.channelId}`) ? 1 : 0)
185 } 195 }
186 .edgeEffect(EdgeEffect.None) 196 .edgeEffect(EdgeEffect.None)
187 .scrollBar(BarState.Off) 197 .scrollBar(BarState.Off)
@@ -346,6 +356,12 @@ export struct PeopleShipMainComponent { @@ -346,6 +356,12 @@ export struct PeopleShipMainComponent {
346 } 356 }
347 this.attentionList.push(element) 357 this.attentionList.push(element)
348 }) 358 })
  359 + // 关注频道国殇模式开启,最多前8条数据配置成国殇色
  360 + if(this.GrayManage.get().isRmhMourning(`${this.channelId}`)) {
  361 + for (let i = 0; i < Math.min(8, this.attentionList.length); i++) {
  362 + this.attentionList[i].isMourning = true;
  363 + }
  364 + }
349 365
350 } catch (exception) { 366 } catch (exception) {
351 this.resolveEnd(false, resolve) 367 this.resolveEnd(false, resolve)
  1 +import { HttpUtils } from 'wdNetwork/Index';
  2 +
  3 +export interface mournsInfoModel{
  4 + switchOpen : boolean
  5 + bottomNavOpen : boolean
  6 + greyUserList : Array<string>
  7 + newsList : Array<string>
  8 + onlineState : number
  9 + rmhList : Array<string>
  10 + selectAll : boolean
  11 + serverList : Array<string>
  12 + videoList : Array<string>
  13 + md5 : string
  14 +
  15 +}
  16 +
  17 +const TAG: string = 'GrayManageModel';
  18 +
  19 +/**
  20 + * 国殇管理
  21 + */
  22 +export class GrayManageModel {
  23 + /**
  24 + * 用户ID
  25 + */
  26 + private user_id = HttpUtils.getUserId()
  27 +
  28 + /**
  29 + * 国殇模式开关:true-开启, false-关闭
  30 + */
  31 + private switchOpen: boolean = false
  32 +
  33 + /**
  34 + * 灰度状态: 0-待上线, 1-灰度中,2-全量发布
  35 + */
  36 + private onlineState: number = 0
  37 +
  38 + /**
  39 + * 底部导航开关(TAB图标/文字): true-开启,false-关闭
  40 + */
  41 + private bottomNavOpen: boolean = false
  42 +
  43 + /**
  44 + * 涉及范围选择,一键全选: true-全选, false-非全选
  45 + */
  46 + private selectAll: boolean = false
  47 +
  48 + /**
  49 + * 新闻频道集合
  50 + */
  51 + private newsList: Array<string> = []
  52 +
  53 + /**
  54 + * 人民号频道集合
  55 + */
  56 + private rmhList: Array<string> = []
  57 +
  58 + /**
  59 + * 视频频道集合
  60 + */
  61 + private videoList: Array<string> = []
  62 +
  63 + /**
  64 + * 服务频道集合
  65 + */
  66 + private serverList: Array<string> = []
  67 +
  68 + /**
  69 + * 灰度用户userId集合
  70 + */
  71 + private grayUserList: Array<string> = []
  72 +
  73 + public setMourning(mourns: mournsInfoModel) {
  74 + this.switchOpen = mourns.switchOpen
  75 + this.bottomNavOpen = mourns.bottomNavOpen
  76 + this.onlineState = mourns.onlineState
  77 + this.selectAll = mourns.selectAll
  78 + this.newsList = mourns.newsList
  79 + this.rmhList = mourns.rmhList
  80 + this.videoList = mourns.videoList
  81 + this.serverList = mourns.serverList
  82 + this.grayUserList = mourns.greyUserList
  83 + console.log(TAG, 'LaunchDataModel.mourns', JSON.stringify(mourns))
  84 + }
  85 +
  86 + // 国殇模式开启
  87 + public isMourning(): boolean {
  88 + // 基础条件:用户已登录且国殇模式主开关开启
  89 + if (!this.user_id || !this.switchOpen) {
  90 + return false;
  91 + }
  92 +
  93 + // 灰度发布状态下,需额外检查用户是否在灰度名单内
  94 + if (this.onlineState === 1 && !this.grayUserList.includes(`${this.user_id}`)) {
  95 + return false;
  96 + }
  97 +
  98 + // 在线状态为2(全量发布)或未明确提及的其他状态,默认视为全量或同全量处理
  99 + return true;
  100 + }
  101 +
  102 + // 国殇模式开启 底导国殇模式开启
  103 + public isBottomNavMourning(): boolean {
  104 + return (
  105 + !!this.user_id && // 确保用户已登录
  106 + this.switchOpen && // 国殇模式总开关开启
  107 + this.bottomNavOpen && // 底部导航国殇模式开关开启
  108 + (
  109 + this.onlineState !== 1 || // 非灰度发布状态直接开启
  110 + this.onlineState === 1 && this.grayUserList.includes(`${this.user_id}`) // 灰度发布且用户在灰度列表内
  111 + )
  112 + );
  113 + }
  114 +
  115 + // 国殇模式开启 新闻频道国殇模式开启 一键全选: true-全选, false-非全选
  116 + public isNewsMourning(channelId: string): boolean {
  117 + // 检查最基本的前提条件
  118 + if (!this.user_id || !this.switchOpen) {
  119 + return false;
  120 + }
  121 +
  122 + // 对于灰度发布状态(onlineState === 1),用户需在灰度名单内
  123 + if (this.onlineState === 1 && !this.grayUserList.includes(`${this.user_id}`)) {
  124 + return false;
  125 + }
  126 +
  127 + // 在国殇模式开启、用户符合条件的前提下:
  128 + // - 否则检查channelId是否在newsList中以决定是否开启国殇模式
  129 + return this.newsList.includes(channelId);
  130 + }
  131 +
  132 + // 国殇模式开启 人民号频道国殇模式开启 一键全选: true-全选, false-非全选
  133 + public isRmhMourning(channelId: string): boolean {
  134 + // 检查最基本的前提条件
  135 + if (!this.user_id || !this.switchOpen) {
  136 + return false;
  137 + }
  138 +
  139 + // 对于灰度发布状态(onlineState === 1),用户需在灰度名单内
  140 + if (this.onlineState === 1 && !this.grayUserList.includes(`${this.user_id}`)) {
  141 + return false;
  142 + }
  143 +
  144 + // 在国殇模式开启、用户符合条件的前提下:
  145 + // - 否则检查channelId是否在rmhList中以决定是否开启国殇模式
  146 + return this.rmhList.includes(channelId);
  147 + }
  148 +
  149 + // 国殇模式开启 视频频道频道国殇模式开启 一键全选: true-全选, false-非全选
  150 + public isVideoMourning(channelId: string): boolean {
  151 + // 检查最基本的前提条件
  152 + if (!this.user_id || !this.switchOpen) {
  153 + return false;
  154 + }
  155 +
  156 + // 对于灰度发布状态(onlineState === 1),用户需在灰度名单内
  157 + if (this.onlineState === 1 && !this.grayUserList.includes(`${this.user_id}`)) {
  158 + return false;
  159 + }
  160 + // 在国殇模式开启、用户符合条件的前提下:
  161 + // - 否则检查channelId是否在videoList中以决定是否开启国殇模式
  162 + return this.videoList.includes(channelId);
  163 + }
  164 +
  165 + // 国殇模式开启 视频频道频道国殇模式开启 一键全选: true-全选, false-非全选
  166 + public isServerMourning(channelId: string): boolean {
  167 + // 检查最基本的前提条件
  168 + if (!this.user_id || !this.switchOpen) {
  169 + return false;
  170 + }
  171 +
  172 + // 对于灰度发布状态(onlineState === 1),用户需在灰度名单内
  173 + if (this.onlineState === 1 && !this.grayUserList.includes(`${this.user_id}`)) {
  174 + return false;
  175 + }
  176 +
  177 + // 在国殇模式开启、用户符合条件的前提下:
  178 + // - 否则检查channelId是否在serverList中以决定是否开启国殇模式
  179 + return this.serverList.includes(channelId);
  180 + }
  181 +
  182 +}
@@ -15,6 +15,7 @@ import { Logger, SPHelper, UmengStats } from 'wdKit/Index'; @@ -15,6 +15,7 @@ import { Logger, SPHelper, UmengStats } from 'wdKit/Index';
15 import { SpConstants } from 'wdConstant/Index'; 15 import { SpConstants } from 'wdConstant/Index';
16 import { TrackingModule } from 'wdTracking/Index' 16 import { TrackingModule } from 'wdTracking/Index'
17 import { StartupManager } from '../../startupmanager/StartupManager' 17 import { StartupManager } from '../../startupmanager/StartupManager'
  18 +import { GrayManageModel, mournsInfoModel } from 'wdComponent/src/main/ets/viewmodel/GrayManageModel'
18 19
19 @Entry 20 @Entry
20 @Component 21 @Component
@@ -112,6 +113,11 @@ struct LaunchPage { @@ -112,6 +113,11 @@ struct LaunchPage {
112 113
113 let dataModel : LaunchDataModel = JSON.parse(dataModelStr) 114 let dataModel : LaunchDataModel = JSON.parse(dataModelStr)
114 console.log(dataModelStr) 115 console.log(dataModelStr)
  116 + // 处理国殇模式数据
  117 + let mourns: mournsInfoModel = dataModel.mourns as mournsInfoModel
  118 + let GrayManage = new GrayManageModel()
  119 + GrayManage.setMourning(mourns)
  120 + AppStorage.setOrCreate('GrayManage', GrayManage)
115 121
116 if (dataModel.launchPageInfo || dataModel.launchAdInfo.length) { 122 if (dataModel.launchPageInfo || dataModel.launchAdInfo.length) {
117 //跳转广告页 123 //跳转广告页
@@ -11,6 +11,7 @@ import { ALL, ImageKnifeComponent, ImageKnifeOption } from '@ohos/imageknife'; @@ -11,6 +11,7 @@ import { ALL, ImageKnifeComponent, ImageKnifeOption } from '@ohos/imageknife';
11 import { ParamType, Tracking } from 'wdTracking/Index'; 11 import { ParamType, Tracking } from 'wdTracking/Index';
12 import { AudioSuspensionModel } from 'wdComponent' 12 import { AudioSuspensionModel } from 'wdComponent'
13 import { BusinessError } from '@kit.BasicServicesKit'; 13 import { BusinessError } from '@kit.BasicServicesKit';
  14 +import { GrayManageModel } from 'wdComponent/src/main/ets/viewmodel/GrayManageModel';
14 15
15 const TAG = 'BottomNavigationComponent'; 16 const TAG = 'BottomNavigationComponent';
16 PersistentStorage.persistProp('channelIds', ''); 17 PersistentStorage.persistProp('channelIds', '');
@@ -55,6 +56,8 @@ export struct BottomNavigationComponent { @@ -55,6 +56,8 @@ export struct BottomNavigationComponent {
55 @State autoRefresh: number = 0 56 @State autoRefresh: number = 0
56 private AudioSuspension = new AudioSuspensionModel() 57 private AudioSuspension = new AudioSuspensionModel()
57 @State isShowAudioCom: boolean = false 58 @State isShowAudioCom: boolean = false
  59 + // 国殇灰度管理
  60 + GrayManage: SubscribedAbstractProperty<GrayManageModel> = AppStorage.link<GrayManageModel>('GrayManage')
58 61
59 62
60 async aboutToAppear() { 63 async aboutToAppear() {
@@ -105,9 +108,7 @@ export struct BottomNavigationComponent { @@ -105,9 +108,7 @@ export struct BottomNavigationComponent {
105 } 108 }
106 } 109 }
107 .tabBar(this.tabBarBuilder(navItem, index)) 110 .tabBar(this.tabBarBuilder(navItem, index))
108 -  
109 - });  
110 - 111 + })
111 } 112 }
112 .zIndex(10) 113 .zIndex(10)
113 .scrollable(false) 114 .scrollable(false)
@@ -162,6 +163,7 @@ export struct BottomNavigationComponent { @@ -162,6 +163,7 @@ export struct BottomNavigationComponent {
162 Tracking.event("bar_click", params) 163 Tracking.event("bar_click", params)
163 this.onBottomNavigationIndexChange(navItem, index) 164 this.onBottomNavigationIndexChange(navItem, index)
164 }) 165 })
  166 + .grayscale(this.GrayManage.get().isBottomNavMourning() ? 1 : 0)
165 167
166 } 168 }
167 169
@@ -6,9 +6,10 @@ import { BottomNavDTO, TopNavDTO } from 'wdBean/Index'; @@ -6,9 +6,10 @@ import { BottomNavDTO, TopNavDTO } from 'wdBean/Index';
6 import { VideoChannelDetail } from 'wdDetailPlayShortVideo/Index'; 6 import { VideoChannelDetail } from 'wdDetailPlayShortVideo/Index';
7 import { WDRouterPage, WDRouterRule } from 'wdRouter'; 7 import { WDRouterPage, WDRouterRule } from 'wdRouter';
8 import { DisplayDirection } from 'wdConstant/Index'; 8 import { DisplayDirection } from 'wdConstant/Index';
9 -import { CompUtils, PageComponent } from 'wdComponent/Index';  
10 -import { ParamType, TrackConstants, Tracking, TrackingButton } from 'wdTracking/Index';  
11 -import { Logger } from 'wdKit'; 9 +import { CompUtils, GrayManageModel, PageComponent } from 'wdComponent/Index';
  10 +import { TrackingButton, TrackConstants } from 'wdTracking/Index';
  11 +import { Logger, WindowModel } from 'wdKit';
  12 +import { ParamType, Tracking } from 'wdTracking/Index';
12 import { ColorUtils } from 'wdComponent/src/main/ets/utils/ColorUtils'; 13 import { ColorUtils } from 'wdComponent/src/main/ets/utils/ColorUtils';
13 import { ImageKnifeComponent } from '@ohos/imageknife'; 14 import { ImageKnifeComponent } from '@ohos/imageknife';
14 import { CommonUtils } from 'wdComponent/src/main/ets/utils/CommonUtils'; 15 import { CommonUtils } from 'wdComponent/src/main/ets/utils/CommonUtils';
@@ -41,6 +42,8 @@ export struct VideoChannelPage { @@ -41,6 +42,8 @@ export struct VideoChannelPage {
41 // 背景高度 42 // 背景高度
42 @State backgroundImageH: number = 0 43 @State backgroundImageH: number = 0
43 @Consume @Watch('setBarBackgroundColor') pageShow: number 44 @Consume @Watch('setBarBackgroundColor') pageShow: number
  45 + // 国殇灰度管理
  46 + GrayManage: SubscribedAbstractProperty<GrayManageModel> = AppStorage.link<GrayManageModel>('GrayManage')
44 47
45 async aboutToAppear() { 48 async aboutToAppear() {
46 // 背景图高度 49 // 背景图高度
@@ -160,6 +163,7 @@ export struct VideoChannelPage { @@ -160,6 +163,7 @@ export struct VideoChannelPage {
160 this.swiperController.changeIndex(index, true) 163 this.swiperController.changeIndex(index, true)
161 164
162 }) 165 })
  166 + .grayscale(this.GrayManage.get().isVideoMourning(`${item.channelId}`) ? 1 : 0)
163 }, (item: TopNavDTO) => item.channelId + '') 167 }, (item: TopNavDTO) => item.channelId + '')
164 } 168 }
165 .width('100%') 169 .width('100%')
@@ -234,14 +238,19 @@ export struct VideoChannelPage { @@ -234,14 +238,19 @@ export struct VideoChannelPage {
234 } else { 238 } else {
235 Column() { 239 Column() {
236 // 顶部背景图 240 // 顶部背景图
237 - Image(this.navItem.backgroundUrl).width('100%').height(this.backgroundImageH) 241 + Image(this.navItem.backgroundUrl)
  242 + .width('100%')
  243 + .height(this.backgroundImageH)
  244 + .grayscale(this.GrayManage.get().isVideoMourning(`${item.channelId}`) ? 1 : 0)
  245 +
238 // 直播 246 // 直播
239 PageComponent({ 247 PageComponent({
240 currentTopNavSelectedIndex: $currentTopNavSelectedIndex, 248 currentTopNavSelectedIndex: $currentTopNavSelectedIndex,
241 navIndex: index, 249 navIndex: index,
242 pageId: item.pageId + '', 250 pageId: item.pageId + '',
243 channelId: item.channelId + '', 251 channelId: item.channelId + '',
244 - autoRefresh: this.autoRefresh 252 + autoRefresh: this.autoRefresh,
  253 + isMourning: this.GrayManage.get().isVideoMourning(`${item.channelId}`),
245 }).backgroundColor(Color.White) 254 }).backgroundColor(Color.White)
246 } 255 }
247 256
@@ -56,12 +56,27 @@ export interface NetLayerLauncherH5TemplateInfoModel{ @@ -56,12 +56,27 @@ export interface NetLayerLauncherH5TemplateInfoModel{
56 56
57 } 57 }
58 58
  59 +export interface mournsInfoModel{
  60 + switchOpen : boolean
  61 + bottomNavOpen : boolean
  62 + greyUserList : Array<string>
  63 + newsList : Array<string>
  64 + onlineState : number
  65 + rmhList : Array<string>
  66 + selectAll : boolean
  67 + serverList : Array<string>
  68 + videoList : Array<string>
  69 + md5 : string
  70 +
  71 +}
  72 +
59 73
60 export default interface LaunchDataModel{ 74 export default interface LaunchDataModel{
61 75
62 launchPageInfo : NetLayerLaunchOperatModel 76 launchPageInfo : NetLayerLaunchOperatModel
63 launchAdInfo : NetLayerLauncherADInfoModel[] 77 launchAdInfo : NetLayerLauncherADInfoModel[]
64 h5Template : NetLayerLauncherH5TemplateInfoModel[] 78 h5Template : NetLayerLauncherH5TemplateInfoModel[]
  79 + mourns: mournsInfoModel
65 80
66 } 81 }
67 82