fanmingyou3_wd

人民日报-init:

模块:
entry:入口模块
wdKit:工具类模块
wdConstant:全局常量模块,包括枚举值
wdComponent:基础组件模块
wdNetwork:网络模块
Showing 118 changed files with 6796 additions and 0 deletions
  1 +/node_modules
  2 +/oh_modules
  3 +/local.properties
  4 +/.idea
  5 +**/build
  6 +/.hvigor
  7 +.cxx
  8 +/.clangd
  9 +/.clang-format
  10 +/.clang-tidy
  11 +**/.test
  1 +{
  2 + "app": {
  3 + "bundleName": "com.wondertek.daily",
  4 + "vendor": "$string:app_vendor",
  5 + "versionCode": 1000000,
  6 + "versionName": "1.0.0",
  7 + "icon": "$media:app_icon",
  8 + "label": "$string:app_name"
  9 + }
  10 +}
  1 +{
  2 + "string": [
  3 + {
  4 + "name": "app_name",
  5 + "value": "People's Daily"
  6 + },
  7 + {
  8 + "name": "app_desc",
  9 + "value": "The People's Daily is an organ newspaper of the Central Committee of the CPC."
  10 + },
  11 + {
  12 + "name": "app_vendor",
  13 + "value": "Wonder Tek"
  14 + },
  15 + {
  16 + "name": "load_net_data_loading",
  17 + "value": "loading..."
  18 + },
  19 + {
  20 + "name": "load_net_data_failed",
  21 + "value": "load net data failed"
  22 + },
  23 + {
  24 + "name": "load_net_data_none",
  25 + "value": "no data"
  26 + }
  27 + ]
  28 +}
  1 +{
  2 + "string": [
  3 + {
  4 + "name": "app_name",
  5 + "value": "人民日报"
  6 + },
  7 + {
  8 + "name": "app_desc",
  9 + "value": "人民日报是中国共产党中央委员会机关报"
  10 + },
  11 + {
  12 + "name": "app_vendor",
  13 + "value": "网达"
  14 + },
  15 + {
  16 + "name": "load_net_data_loading",
  17 + "value": "加载中..."
  18 + },
  19 + {
  20 + "name": "load_net_data_failed",
  21 + "value": "加载网络数据失败"
  22 + },
  23 + {
  24 + "name": "load_net_data_none",
  25 + "value": "很抱歉,未能找到相关内容"
  26 + }
  27 + ]
  28 +}
  1 +{
  2 + "app": {
  3 + "signingConfigs": [
  4 + {
  5 + "name": "default",
  6 + "type": "HarmonyOS",
  7 + "material": {
  8 + "certpath": "C:\\Users\\PC\\.ohos\\config\\auto_debug_PeopleDaily_Harmony_com.wondertek.daily_70086000309521319.cer",
  9 + "storePassword": "0000001ABBB4B3A70A2A7E171D3468CC9AB106807B092C8862455C201E82C1FCDEA1A52B3EC568DC298B",
  10 + "keyAlias": "debugKey",
  11 + "keyPassword": "0000001AB7E69A7BECBCDBDFA55535E64932F5C9485CF9199F6CE3978C196EDDD7E66759C3F6BEE770DE",
  12 + "profile": "C:\\Users\\PC\\.ohos\\config\\auto_debug_PeopleDaily_Harmony_com.wondertek.daily_70086000309521319.p7b",
  13 + "signAlg": "SHA256withECDSA",
  14 + "storeFile": "C:\\Users\\PC\\.ohos\\config\\auto_debug_PeopleDaily_Harmony_com.wondertek.daily_70086000309521319.p12"
  15 + }
  16 + }
  17 + ],
  18 + "compileSdkVersion": 9,
  19 + "compatibleSdkVersion": 9,
  20 + "products": [
  21 + {
  22 + "name": "default",
  23 + "signingConfig": "default",
  24 + }
  25 + ]
  26 + },
  27 + "modules": [
  28 + {
  29 + "name": "entry",
  30 + "srcPath": "./entry",
  31 + "targets": [
  32 + {
  33 + "name": "default",
  34 + "applyToProducts": [
  35 + "default"
  36 + ]
  37 + }
  38 + ]
  39 + },
  40 + {
  41 + "name": "wdKit",
  42 + "srcPath": "./wdKit",
  43 + "targets": [
  44 + {
  45 + "name": "default",
  46 + "applyToProducts": [
  47 + "default"
  48 + ]
  49 + }
  50 + ]
  51 + },
  52 + {
  53 + "name": "wdConstant",
  54 + "srcPath": "./wdConstant",
  55 + "targets": [
  56 + {
  57 + "name": "default",
  58 + "applyToProducts": [
  59 + "default"
  60 + ]
  61 + }
  62 + ]
  63 + },
  64 + {
  65 + "name": "wdNetwork",
  66 + "srcPath": "./wdNetwork",
  67 + "targets": [
  68 + {
  69 + "name": "default",
  70 + "applyToProducts": [
  71 + "default"
  72 + ]
  73 + }
  74 + ]
  75 + },
  76 + {
  77 + "name": "wdComponent",
  78 + "srcPath": "./wdComponent",
  79 + "targets": [
  80 + {
  81 + "name": "default",
  82 + "applyToProducts": [
  83 + "default"
  84 + ]
  85 + }
  86 + ]
  87 + }
  88 + ]
  89 +}
  1 +/node_modules
  2 +/oh_modules
  3 +/.preview
  4 +/build
  5 +/.cxx
  6 +/.test
  1 +{
  2 + "apiType": 'stageMode',
  3 + "buildOption": {
  4 + },
  5 + "targets": [
  6 + {
  7 + "name": "default",
  8 + "runtimeOS": "HarmonyOS"
  9 + },
  10 + {
  11 + "name": "ohosTest",
  12 + }
  13 + ]
  14 +}
  1 +// Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently.
  2 +export { hapTasks } from '@ohos/hvigor-ohos-plugin';
  1 +{
  2 + "license": "",
  3 + "devDependencies": {},
  4 + "author": "",
  5 + "name": "entry",
  6 + "description": "Please describe the basic information.",
  7 + "main": "",
  8 + "version": "1.0.0",
  9 + "dependencies": {
  10 + "wdKit": "file:../wdKit",
  11 + "wdConstant": "file:../wdConstant",
  12 + "wdNetwork": "file:../wdNetwork",
  13 + "wdComponent": "file:../wdComponent"
  14 + }
  15 +}
  1 +import UIAbility from '@ohos.app.ability.UIAbility';
  2 +import hilog from '@ohos.hilog';
  3 +import window from '@ohos.window';
  4 +
  5 +export default class EntryAbility extends UIAbility {
  6 + onCreate(want, launchParam) {
  7 + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');
  8 + }
  9 +
  10 + onDestroy() {
  11 + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onDestroy');
  12 + }
  13 +
  14 + onWindowStageCreate(windowStage: window.WindowStage) {
  15 + // Main window is created, set main page for this ability
  16 + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate');
  17 +
  18 + windowStage.loadContent('pages/MainPage', (err, data) => {
  19 + if (err.code) {
  20 + hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? '');
  21 + return;
  22 + }
  23 + hilog.info(0x0000, 'testTag', 'Succeeded in loading the content. Data: %{public}s', JSON.stringify(data) ?? '');
  24 + });
  25 + }
  26 +
  27 + onWindowStageDestroy() {
  28 + // Main window is destroyed, release UI related resources
  29 + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageDestroy');
  30 + }
  31 +
  32 + onForeground() {
  33 + // Ability has brought to foreground
  34 + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onForeground');
  35 + }
  36 +
  37 + onBackground() {
  38 + // Ability has back to background
  39 + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onBackground');
  40 + }
  41 +}
  1 +import { Logger } from 'wdKit';
  2 +import { CompStyle } from 'wdConstant';
  3 +import { ResponseDTO, WDHttp } from 'wdNetwork';
  4 +import http from '@ohos.net.http';
  5 +
  6 +const TAG = 'Index';
  7 +
  8 +@Entry
  9 +@Component
  10 +struct Index {
  11 + @State message: string = 'Hello World'
  12 +
  13 + fetchData(url: string): Promise<string> {
  14 + return new Promise<string>((success, error) => {
  15 + Logger.info(TAG, `getNavData start`);
  16 + WDHttp.get<string>(url).then((resDTO: string) => {
  17 + if (!resDTO) {
  18 + Logger.error(TAG, 'getNavData then navResDTO is empty');
  19 + error('resDTO is empty');
  20 + return
  21 + }
  22 + success(resDTO);
  23 + }).catch((err: Error) => {
  24 + Logger.error(TAG, `fetchNavigationDataApi catch, error.name : ${err.name}, error.message:${err.message}`);
  25 + error(err);
  26 + })
  27 + })
  28 + }
  29 +
  30 + aboutToAppear() {
  31 + Logger.info(TAG, `aboutToAppear ${CompStyle.Label_03}`);
  32 + this.message = CompStyle.Label_03
  33 + // let url = 'https://app-sc.miguvideo.com/app-management/v1/staticcache/settings-type/miguvideo/GLOBAL2'
  34 + let url = 'https://app-sc.miguvideo.com/app-management/v4/staticcache/navigation-list/miguvideo/android/02'
  35 + this.fetchData(url).then((navResDTO: string) => {
  36 + Logger.info(TAG, "fetchData then,navResDTO:" + navResDTO);
  37 + })
  38 + .catch((err: Error) => {
  39 + Logger.error(TAG, `fetchData catch, error.name : ${err.name}, error.message:${err.message}`);
  40 + })
  41 + }
  42 +
  43 + build() {
  44 + Row() {
  45 + Column() {
  46 + Text(this.message)
  47 + .fontSize(50)
  48 + .fontWeight(FontWeight.Bold)
  49 + }
  50 + .width('100%')
  51 + }
  52 + .height('100%')
  53 + }
  54 +}
  1 +import { BottomNavigationComponent} from 'wdComponent';
  2 +
  3 +import { Logger } from 'wdKit';
  4 +
  5 +const TAG = 'Index';
  6 +
  7 +@Entry
  8 +@Component
  9 +struct MainPage {
  10 + aboutToAppear() {
  11 + Logger.info(TAG, `aboutToAppear `);
  12 + }
  13 +
  14 + aboutToDisappear() {
  15 + Logger.info(TAG, 'aboutToDisappear');
  16 + }
  17 +
  18 + onPageShow() {
  19 + Logger.info(TAG, 'onPageShow');
  20 + }
  21 +
  22 + onPageHide() {
  23 + Logger.info(TAG, 'onPageHide');
  24 + }
  25 +
  26 + onBackPress() {
  27 + Logger.info(TAG, 'onBackPress');
  28 + }
  29 +
  30 + build() {
  31 + Column() {
  32 + BottomNavigationComponent()
  33 + }
  34 + }
  35 +}
  1 +{
  2 + "module": {
  3 + "name": "entry",
  4 + "type": "entry",
  5 + "description": "$string:module_desc",
  6 + "mainElement": "EntryAbility",
  7 + "deviceTypes": [
  8 + "phone",
  9 + "tablet"
  10 + ],
  11 + "deliveryWithInstall": true,
  12 + "installationFree": false,
  13 + "pages": "$profile:main_pages",
  14 + "abilities": [
  15 + {
  16 + "name": "EntryAbility",
  17 + "srcEntry": "./ets/entryability/EntryAbility.ts",
  18 + "description": "$string:EntryAbility_desc",
  19 + "icon": "$media:app_icon",
  20 + "label": "$string:EntryAbility_label",
  21 + "startWindowIcon": "$media:app_icon",
  22 + "startWindowBackground": "$color:start_window_background",
  23 + "exported": true,
  24 + "skills": [
  25 + {
  26 + "entities": [
  27 + "entity.system.home"
  28 + ],
  29 + "actions": [
  30 + "action.system.home"
  31 + ]
  32 + }
  33 + ]
  34 + }
  35 + ]
  36 + }
  37 +}
  1 +{
  2 + "color": [
  3 + {
  4 + "name": "start_window_background",
  5 + "value": "#FFFFFF"
  6 + }
  7 + ]
  8 +}
  1 +{
  2 + "string": [
  3 + {
  4 + "name": "module_desc",
  5 + "value": "module description"
  6 + },
  7 + {
  8 + "name": "EntryAbility_desc",
  9 + "value": "$string:app_desc"
  10 + },
  11 + {
  12 + "name": "EntryAbility_label",
  13 + "value": "$string:app_name"
  14 + }
  15 + ]
  16 +}
  1 +{
  2 + "src": [
  3 + "pages/Index",
  4 + "pages/MainPage"
  5 + ]
  6 +}
  1 +{
  2 + "string": [
  3 + {
  4 + "name": "module_desc",
  5 + "value": "module description"
  6 + },
  7 + {
  8 + "name": "EntryAbility_desc",
  9 + "value": "$string:app_desc"
  10 + },
  11 + {
  12 + "name": "EntryAbility_label",
  13 + "value": "$string:app_name"
  14 + }
  15 + ]
  16 +}
  1 +{
  2 + "code": "0",
  3 + "data": {
  4 + "backgroundColor": "#FFFFFF",
  5 + "bottomNavList": [
  6 + {
  7 + "backgroundUrl": "https://uatjdcdnphoto.aikan.pdnews.cn/sjbj-20231214/image/display/2e1d5f235d1a44cfb9fc120e8596c56b.png",
  8 + "channelChooseActionUrl": "https://uatjdcdnphoto.aikan.pdnews.cn/sjbj-20231227/vod/display/7c92f5b2a08b4a65aa9da13e66d5ad4a.pag",
  9 + "channelChooseCColor": "#666666",
  10 + "channelChooseColor": "#222222",
  11 + "channelMoreColor": "#666666",
  12 + "extraData": "{\"haveSearch\":\"1\",\"haveTopNav\":\"1\",\"leftIconurl\":\"\",\"rightIconUrl\":\"\"}",
  13 + "homePageColor": "#FFFFF",
  14 + "icon": "https://uatjdcdnphoto.aikan.pdnews.cn/sjbj-20231220/image/display/0dc20f38da09405ea0ab675d700bc2ce.png",
  15 + "iconC": "https://uatjdcdnphoto.aikan.pdnews.cn/sjbj-20231220/image/display/e162a5d3401045f298c237f1c795c015.gif",
  16 + "id": 201,
  17 + "immersiveIconCUrl": "",
  18 + "immersiveIconUrl": "",
  19 + "immersiveNameCColor": "#FFFFFF",
  20 + "immersiveNameColor": "#FFFFFF",
  21 + "logoUrl": "https://uatjdcdnphoto.aikan.pdnews.cn/sjbj-20231229/image/display/51d568f9af05421f9754a2c08906dc42.png",
  22 + "morningAndEveningUrl": "https://uatjdcdnphoto.aikan.pdnews.cn/sjbj-20231214/image/display/0f37cc0c86194c969d2143f85c056c9c.png",
  23 + "name": "新闻",
  24 + "nameCColor": "#ED2800",
  25 + "nameColor": "#999999",
  26 + "nightIconCUrl": "",
  27 + "nightIconUrl": "",
  28 + "nightNameCColor": "",
  29 + "nightNameColor": "",
  30 + "noticeColor": "#FFFFFF",
  31 + "pageId": null,
  32 + "pageType": null,
  33 + "searchBothColor": "#666666",
  34 + "searchUrl": "https://uatjdcdnphoto.aikan.pdnews.cn/sjbj-20231214/image/display/2f2a9b3af5334eac8d7c3b6007240b83.png",
  35 + "sortValue": 1,
  36 + "statusBarColor": 1,
  37 + "topNavChannelList": [
  38 + {
  39 + "channelId": 2002,
  40 + "channelStyle": 2,
  41 + "channelType": 1,
  42 + "defaultPermitted": 1,
  43 + "delPermitted": 0,
  44 + "fontCColor": "#FFFFFF",
  45 + "fontColor": "#F9AB99",
  46 + "headlinesOn": 0,
  47 + "homeChannel": "0",
  48 + "iconCUrl": "",
  49 + "iconCUrlSize": "",
  50 + "iconUrl": "",
  51 + "iconUrlSize": "",
  52 + "localChannel": "0",
  53 + "moreChannel": "0",
  54 + "movePermitted": 0,
  55 + "myChannel": "0",
  56 + "name": "热点",
  57 + "num": 1,
  58 + "pageId": 20012,
  59 + "pageType": "",
  60 + "underlineCColor": ""
  61 + },
  62 + {
  63 + "channelId": 2001,
  64 + "channelStyle": 2,
  65 + "channelType": 1,
  66 + "defaultPermitted": 1,
  67 + "delPermitted": 0,
  68 + "fontCColor": "#FFFFFF",
  69 + "fontColor": "#F9AB99",
  70 + "headlinesOn": 0,
  71 + "homeChannel": "0",
  72 + "iconCUrl": "",
  73 + "iconCUrlSize": "",
  74 + "iconUrl": "",
  75 + "iconUrlSize": "",
  76 + "localChannel": "0",
  77 + "moreChannel": "0",
  78 + "movePermitted": 0,
  79 + "myChannel": "0",
  80 + "name": "推荐",
  81 + "num": 2,
  82 + "pageId": 20011,
  83 + "pageType": "",
  84 + "underlineCColor": ""
  85 + },
  86 + {
  87 + "channelId": 2009,
  88 + "channelStyle": 2,
  89 + "channelType": 1,
  90 + "defaultPermitted": 0,
  91 + "delPermitted": 1,
  92 + "fontCColor": "#FFFFFF",
  93 + "fontColor": "#F9AB99",
  94 + "headlinesOn": 0,
  95 + "homeChannel": "0",
  96 + "iconCUrl": "",
  97 + "iconCUrlSize": "",
  98 + "iconUrl": "",
  99 + "iconUrlSize": "",
  100 + "localChannel": "0",
  101 + "moreChannel": "0",
  102 + "movePermitted": 1,
  103 + "myChannel": "0",
  104 + "name": "社会",
  105 + "num": 3,
  106 + "pageId": 20019,
  107 + "pageType": "",
  108 + "underlineCColor": ""
  109 + },
  110 + {
  111 + "channelId": 2066,
  112 + "channelStyle": 3,
  113 + "channelType": 1,
  114 + "defaultPermitted": 0,
  115 + "delPermitted": 1,
  116 + "fontCColor": "#FFFFFF",
  117 + "fontColor": "#F9AB99",
  118 + "headlinesOn": 0,
  119 + "homeChannel": "0",
  120 + "iconCUrl": "",
  121 + "iconCUrlSize": "",
  122 + "iconUrl": "",
  123 + "iconUrlSize": "",
  124 + "localChannel": "0",
  125 + "moreChannel": "0",
  126 + "movePermitted": 1,
  127 + "myChannel": "0",
  128 + "name": "播报",
  129 + "num": 4,
  130 + "pageId": 21003,
  131 + "pageType": "",
  132 + "underlineCColor": ""
  133 + },
  134 + {
  135 + "channelId": 2012,
  136 + "channelStyle": 2,
  137 + "channelType": 1,
  138 + "defaultPermitted": 0,
  139 + "delPermitted": 1,
  140 + "fontCColor": "#FFFFFF",
  141 + "fontColor": "#F9AB99",
  142 + "headlinesOn": 0,
  143 + "homeChannel": "0",
  144 + "iconCUrl": "",
  145 + "iconCUrlSize": "",
  146 + "iconUrl": "",
  147 + "iconUrlSize": "",
  148 + "localChannel": "0",
  149 + "moreChannel": "0",
  150 + "movePermitted": 0,
  151 + "myChannel": "0",
  152 + "name": "文化",
  153 + "num": 5,
  154 + "pageId": 20022,
  155 + "pageType": "",
  156 + "underlineCColor": ""
  157 + },
  158 + {
  159 + "channelId": 2007,
  160 + "channelStyle": 2,
  161 + "channelType": 1,
  162 + "defaultPermitted": 0,
  163 + "delPermitted": 1,
  164 + "fontCColor": "#FFFFFF",
  165 + "fontColor": "#F9AB99",
  166 + "headlinesOn": 0,
  167 + "homeChannel": "0",
  168 + "iconCUrl": "",
  169 + "iconCUrlSize": "",
  170 + "iconUrl": "",
  171 + "iconUrlSize": "",
  172 + "localChannel": "0",
  173 + "moreChannel": "0",
  174 + "movePermitted": 1,
  175 + "myChannel": "0",
  176 + "name": "镜头",
  177 + "num": 6,
  178 + "pageId": 20017,
  179 + "pageType": "",
  180 + "underlineCColor": ""
  181 + },
  182 + {
  183 + "channelId": 2006,
  184 + "channelStyle": 3,
  185 + "channelType": 1,
  186 + "defaultPermitted": 0,
  187 + "delPermitted": 1,
  188 + "fontCColor": "#FFFFFF",
  189 + "fontColor": "#F9AB99",
  190 + "headlinesOn": 0,
  191 + "homeChannel": "0",
  192 + "iconCUrl": "",
  193 + "iconCUrlSize": "",
  194 + "iconUrl": "",
  195 + "iconUrlSize": "",
  196 + "localChannel": "0",
  197 + "moreChannel": "0",
  198 + "movePermitted": 1,
  199 + "myChannel": "0",
  200 + "name": "版面",
  201 + "num": 7,
  202 + "pageId": 20016,
  203 + "pageType": "",
  204 + "underlineCColor": ""
  205 + },
  206 + {
  207 + "channelId": 2015,
  208 + "channelStyle": 2,
  209 + "channelType": 1,
  210 + "defaultPermitted": 0,
  211 + "delPermitted": 1,
  212 + "fontCColor": "#FFFFFF",
  213 + "fontColor": "#F9AB99",
  214 + "headlinesOn": 0,
  215 + "homeChannel": "0",
  216 + "iconCUrl": "",
  217 + "iconCUrlSize": "210*60",
  218 + "iconUrl": "",
  219 + "iconUrlSize": "210*60",
  220 + "localChannel": "0",
  221 + "moreChannel": "0",
  222 + "movePermitted": 1,
  223 + "myChannel": "0",
  224 + "name": "科技",
  225 + "num": 8,
  226 + "pageId": 20025,
  227 + "pageType": "",
  228 + "underlineCColor": ""
  229 + },
  230 + {
  231 + "channelId": 2063,
  232 + "channelStyle": 2,
  233 + "channelType": 1,
  234 + "defaultPermitted": 0,
  235 + "delPermitted": 0,
  236 + "fontCColor": "#FFFFFF",
  237 + "fontColor": "#F9AB99",
  238 + "headlinesOn": 0,
  239 + "homeChannel": "0",
  240 + "iconCUrl": "",
  241 + "iconCUrlSize": "",
  242 + "iconUrl": "",
  243 + "iconUrlSize": "",
  244 + "localChannel": "0",
  245 + "moreChannel": "0",
  246 + "movePermitted": 1,
  247 + "myChannel": "0",
  248 + "name": "两会",
  249 + "num": 9,
  250 + "pageId": 21000,
  251 + "pageType": "",
  252 + "underlineCColor": ""
  253 + },
  254 + {
  255 + "channelId": 2064,
  256 + "channelStyle": 2,
  257 + "channelType": 1,
  258 + "defaultPermitted": 0,
  259 + "delPermitted": 1,
  260 + "fontCColor": "#FFFFFF",
  261 + "fontColor": "#F9AB99",
  262 + "headlinesOn": 0,
  263 + "homeChannel": "0",
  264 + "iconCUrl": "",
  265 + "iconCUrlSize": "",
  266 + "iconUrl": "",
  267 + "iconUrlSize": "",
  268 + "localChannel": "0",
  269 + "moreChannel": "0",
  270 + "movePermitted": 1,
  271 + "myChannel": "0",
  272 + "name": "二十大",
  273 + "num": 10,
  274 + "pageId": 21001,
  275 + "pageType": "",
  276 + "underlineCColor": ""
  277 + },
  278 + {
  279 + "channelId": 2003,
  280 + "channelStyle": 2,
  281 + "channelType": 1,
  282 + "defaultPermitted": 0,
  283 + "delPermitted": 1,
  284 + "fontCColor": "#FFFFFF",
  285 + "fontColor": "#F9AB99",
  286 + "headlinesOn": 0,
  287 + "homeChannel": "0",
  288 + "iconCUrl": "",
  289 + "iconCUrlSize": "",
  290 + "iconUrl": "",
  291 + "iconUrlSize": "",
  292 + "localChannel": "0",
  293 + "moreChannel": "0",
  294 + "movePermitted": 1,
  295 + "myChannel": "0",
  296 + "name": "锐评",
  297 + "num": 11,
  298 + "pageId": 20013,
  299 + "pageType": "",
  300 + "underlineCColor": ""
  301 + },
  302 + {
  303 + "channelId": 2011,
  304 + "channelStyle": 2,
  305 + "channelType": 1,
  306 + "defaultPermitted": 0,
  307 + "delPermitted": 1,
  308 + "fontCColor": "#FFFFFF",
  309 + "fontColor": "#F9AB99",
  310 + "headlinesOn": 0,
  311 + "homeChannel": "0",
  312 + "iconCUrl": "",
  313 + "iconCUrlSize": "",
  314 + "iconUrl": "",
  315 + "iconUrlSize": "",
  316 + "localChannel": "0",
  317 + "moreChannel": "0",
  318 + "movePermitted": 1,
  319 + "myChannel": "0",
  320 + "name": "体育",
  321 + "num": 12,
  322 + "pageId": 20021,
  323 + "pageType": "",
  324 + "underlineCColor": ""
  325 + },
  326 + {
  327 + "channelId": 2005,
  328 + "channelStyle": 2,
  329 + "channelType": 1,
  330 + "defaultPermitted": 0,
  331 + "delPermitted": 1,
  332 + "fontCColor": "#FFFFFF",
  333 + "fontColor": "#F9AB99",
  334 + "headlinesOn": 0,
  335 + "homeChannel": "0",
  336 + "iconCUrl": "",
  337 + "iconCUrlSize": "",
  338 + "iconUrl": "",
  339 + "iconUrlSize": "",
  340 + "localChannel": "0",
  341 + "moreChannel": "0",
  342 + "movePermitted": 1,
  343 + "myChannel": "0",
  344 + "name": "文件",
  345 + "num": 14,
  346 + "pageId": 20015,
  347 + "pageType": "",
  348 + "underlineCColor": ""
  349 + },
  350 + {
  351 + "channelId": 2065,
  352 + "channelStyle": 2,
  353 + "channelType": 1,
  354 + "defaultPermitted": 0,
  355 + "delPermitted": 1,
  356 + "fontCColor": "#FFFFFF",
  357 + "fontColor": "#F9AB99",
  358 + "headlinesOn": 0,
  359 + "homeChannel": "0",
  360 + "iconCUrl": "",
  361 + "iconCUrlSize": "",
  362 + "iconUrl": "",
  363 + "iconUrlSize": "",
  364 + "localChannel": "0",
  365 + "moreChannel": "0",
  366 + "movePermitted": 1,
  367 + "myChannel": "0",
  368 + "name": "三农",
  369 + "num": 15,
  370 + "pageId": 21002,
  371 + "pageType": "",
  372 + "underlineCColor": ""
  373 + },
  374 + {
  375 + "channelId": 2016,
  376 + "channelStyle": 2,
  377 + "channelType": 1,
  378 + "defaultPermitted": 0,
  379 + "delPermitted": 1,
  380 + "fontCColor": "#FFFFFF",
  381 + "fontColor": "#F9AB99",
  382 + "headlinesOn": 0,
  383 + "homeChannel": "0",
  384 + "iconCUrl": "",
  385 + "iconCUrlSize": "",
  386 + "iconUrl": "",
  387 + "iconUrlSize": "",
  388 + "localChannel": "0",
  389 + "moreChannel": "0",
  390 + "movePermitted": 1,
  391 + "myChannel": "0",
  392 + "name": "乡村振兴",
  393 + "num": 16,
  394 + "pageId": 20026,
  395 + "pageType": "",
  396 + "underlineCColor": ""
  397 + },
  398 + {
  399 + "channelId": 2010,
  400 + "channelStyle": 2,
  401 + "channelType": 1,
  402 + "defaultPermitted": 0,
  403 + "delPermitted": 1,
  404 + "fontCColor": "#FFFFFF",
  405 + "fontColor": "#F9AB99",
  406 + "headlinesOn": 0,
  407 + "homeChannel": "0",
  408 + "iconCUrl": "",
  409 + "iconCUrlSize": "",
  410 + "iconUrl": "",
  411 + "iconUrlSize": "",
  412 + "localChannel": "0",
  413 + "moreChannel": "0",
  414 + "movePermitted": 1,
  415 + "myChannel": "0",
  416 + "name": "财经",
  417 + "num": 18,
  418 + "pageId": 20020,
  419 + "pageType": "",
  420 + "underlineCColor": ""
  421 + },
  422 + {
  423 + "channelId": 2013,
  424 + "channelStyle": 2,
  425 + "channelType": 1,
  426 + "defaultPermitted": 0,
  427 + "delPermitted": 1,
  428 + "fontCColor": "#FFFFFF",
  429 + "fontColor": "#F9AB99",
  430 + "headlinesOn": 0,
  431 + "homeChannel": "0",
  432 + "iconCUrl": "",
  433 + "iconCUrlSize": "",
  434 + "iconUrl": "",
  435 + "iconUrlSize": "",
  436 + "localChannel": "0",
  437 + "moreChannel": "0",
  438 + "movePermitted": 1,
  439 + "myChannel": "0",
  440 + "name": "教育",
  441 + "num": 19,
  442 + "pageId": 20023,
  443 + "pageType": "",
  444 + "underlineCColor": ""
  445 + },
  446 + {
  447 + "channelId": 2017,
  448 + "channelStyle": 2,
  449 + "channelType": 1,
  450 + "defaultPermitted": 0,
  451 + "delPermitted": 1,
  452 + "fontCColor": "#FFFFFF",
  453 + "fontColor": "#F9AB99",
  454 + "headlinesOn": 0,
  455 + "homeChannel": "0",
  456 + "iconCUrl": "",
  457 + "iconCUrlSize": "",
  458 + "iconUrl": "",
  459 + "iconUrlSize": "",
  460 + "localChannel": "0",
  461 + "moreChannel": "0",
  462 + "movePermitted": 1,
  463 + "myChannel": "0",
  464 + "name": "健康",
  465 + "num": 20,
  466 + "pageId": 20027,
  467 + "pageType": "",
  468 + "underlineCColor": ""
  469 + },
  470 + {
  471 + "channelId": 2014,
  472 + "channelStyle": 2,
  473 + "channelType": 1,
  474 + "defaultPermitted": 0,
  475 + "delPermitted": 1,
  476 + "fontCColor": "#FFFFFF",
  477 + "fontColor": "#F9AB99",
  478 + "headlinesOn": 0,
  479 + "homeChannel": "0",
  480 + "iconCUrl": "",
  481 + "iconCUrlSize": "",
  482 + "iconUrl": "",
  483 + "iconUrlSize": "",
  484 + "localChannel": "0",
  485 + "moreChannel": "0",
  486 + "movePermitted": 1,
  487 + "myChannel": "0",
  488 + "name": "军事",
  489 + "num": 21,
  490 + "pageId": 20024,
  491 + "pageType": "",
  492 + "underlineCColor": ""
  493 + },
  494 + {
  495 + "channelId": 2018,
  496 + "channelStyle": 2,
  497 + "channelType": 1,
  498 + "defaultPermitted": 0,
  499 + "delPermitted": 1,
  500 + "fontCColor": "#FFFFFF",
  501 + "fontColor": "#F9AB99",
  502 + "headlinesOn": 0,
  503 + "homeChannel": "0",
  504 + "iconCUrl": "",
  505 + "iconCUrlSize": "",
  506 + "iconUrl": "",
  507 + "iconUrlSize": "",
  508 + "localChannel": "0",
  509 + "moreChannel": "0",
  510 + "movePermitted": 1,
  511 + "myChannel": "0",
  512 + "name": "汽车",
  513 + "num": 22,
  514 + "pageId": 20028,
  515 + "pageType": "",
  516 + "underlineCColor": ""
  517 + },
  518 + {
  519 + "channelId": 2019,
  520 + "channelStyle": 2,
  521 + "channelType": 1,
  522 + "defaultPermitted": 0,
  523 + "delPermitted": 1,
  524 + "fontCColor": "#FFFFFF",
  525 + "fontColor": "#F9AB99",
  526 + "headlinesOn": 0,
  527 + "homeChannel": "0",
  528 + "iconCUrl": "",
  529 + "iconCUrlSize": "",
  530 + "iconUrl": "",
  531 + "iconUrlSize": "",
  532 + "localChannel": "0",
  533 + "moreChannel": "0",
  534 + "movePermitted": 1,
  535 + "myChannel": "0",
  536 + "name": "房产",
  537 + "num": 23,
  538 + "pageId": 20029,
  539 + "pageType": "",
  540 + "underlineCColor": ""
  541 + },
  542 + {
  543 + "channelId": 2027,
  544 + "channelStyle": 2,
  545 + "channelType": 2,
  546 + "defaultPermitted": 0,
  547 + "delPermitted": 1,
  548 + "fontCColor": "#FFFFFF",
  549 + "fontColor": "#F9AB99",
  550 + "headlinesOn": 0,
  551 + "homeChannel": "0",
  552 + "iconCUrl": "",
  553 + "iconCUrlSize": "",
  554 + "iconUrl": "",
  555 + "iconUrlSize": "",
  556 + "localChannel": "0",
  557 + "moreChannel": "0",
  558 + "movePermitted": 1,
  559 + "myChannel": "0",
  560 + "name": "北京",
  561 + "num": 24,
  562 + "pageId": 20037,
  563 + "pageType": "",
  564 + "underlineCColor": ""
  565 + },
  566 + {
  567 + "channelId": 2029,
  568 + "channelStyle": 2,
  569 + "channelType": 2,
  570 + "defaultPermitted": 0,
  571 + "delPermitted": 1,
  572 + "fontCColor": "#FFFFFF",
  573 + "fontColor": "#F9AB99",
  574 + "headlinesOn": 0,
  575 + "homeChannel": "0",
  576 + "iconCUrl": "",
  577 + "iconCUrlSize": "",
  578 + "iconUrl": "",
  579 + "iconUrlSize": "",
  580 + "localChannel": "0",
  581 + "moreChannel": "0",
  582 + "movePermitted": 1,
  583 + "myChannel": "0",
  584 + "name": "天津",
  585 + "num": 25,
  586 + "pageId": 20039,
  587 + "pageType": "",
  588 + "underlineCColor": ""
  589 + },
  590 + {
  591 + "channelId": 2030,
  592 + "channelStyle": 2,
  593 + "channelType": 2,
  594 + "defaultPermitted": 0,
  595 + "delPermitted": 1,
  596 + "fontCColor": "#FFFFFF",
  597 + "fontColor": "#F9AB99",
  598 + "headlinesOn": 0,
  599 + "homeChannel": "0",
  600 + "iconCUrl": "",
  601 + "iconCUrlSize": "",
  602 + "iconUrl": "",
  603 + "iconUrlSize": "",
  604 + "localChannel": "0",
  605 + "moreChannel": "0",
  606 + "movePermitted": 1,
  607 + "myChannel": "0",
  608 + "name": "河北",
  609 + "num": 26,
  610 + "pageId": 20040,
  611 + "pageType": "",
  612 + "underlineCColor": ""
  613 + },
  614 + {
  615 + "channelId": 2031,
  616 + "channelStyle": 2,
  617 + "channelType": 2,
  618 + "defaultPermitted": 0,
  619 + "delPermitted": 1,
  620 + "fontCColor": "#FFFFFF",
  621 + "fontColor": "#F9AB99",
  622 + "headlinesOn": 0,
  623 + "homeChannel": "0",
  624 + "iconCUrl": "",
  625 + "iconCUrlSize": "",
  626 + "iconUrl": "",
  627 + "iconUrlSize": "",
  628 + "localChannel": "0",
  629 + "moreChannel": "0",
  630 + "movePermitted": 1,
  631 + "myChannel": "0",
  632 + "name": "山西",
  633 + "num": 27,
  634 + "pageId": 20041,
  635 + "pageType": "",
  636 + "underlineCColor": ""
  637 + },
  638 + {
  639 + "channelId": 2032,
  640 + "channelStyle": 2,
  641 + "channelType": 2,
  642 + "defaultPermitted": 0,
  643 + "delPermitted": 1,
  644 + "fontCColor": "#FFFFFF",
  645 + "fontColor": "#F9AB99",
  646 + "headlinesOn": 0,
  647 + "homeChannel": "0",
  648 + "iconCUrl": "",
  649 + "iconCUrlSize": "",
  650 + "iconUrl": "",
  651 + "iconUrlSize": "",
  652 + "localChannel": "0",
  653 + "moreChannel": "0",
  654 + "movePermitted": 1,
  655 + "myChannel": "0",
  656 + "name": "内蒙古",
  657 + "num": 28,
  658 + "pageId": 20042,
  659 + "pageType": "",
  660 + "underlineCColor": ""
  661 + },
  662 + {
  663 + "channelId": 2033,
  664 + "channelStyle": 2,
  665 + "channelType": 2,
  666 + "defaultPermitted": 0,
  667 + "delPermitted": 1,
  668 + "fontCColor": "#FFFFFF",
  669 + "fontColor": "#F9AB99",
  670 + "headlinesOn": 0,
  671 + "homeChannel": "0",
  672 + "iconCUrl": "",
  673 + "iconCUrlSize": "",
  674 + "iconUrl": "",
  675 + "iconUrlSize": "",
  676 + "localChannel": "0",
  677 + "moreChannel": "0",
  678 + "movePermitted": 1,
  679 + "myChannel": "0",
  680 + "name": "辽宁",
  681 + "num": 29,
  682 + "pageId": 20043,
  683 + "pageType": "",
  684 + "underlineCColor": ""
  685 + },
  686 + {
  687 + "channelId": 2034,
  688 + "channelStyle": 2,
  689 + "channelType": 2,
  690 + "defaultPermitted": 0,
  691 + "delPermitted": 1,
  692 + "fontCColor": "#FFFFFF",
  693 + "fontColor": "#F9AB99",
  694 + "headlinesOn": 0,
  695 + "homeChannel": "0",
  696 + "iconCUrl": "",
  697 + "iconCUrlSize": "",
  698 + "iconUrl": "",
  699 + "iconUrlSize": "",
  700 + "localChannel": "0",
  701 + "moreChannel": "0",
  702 + "movePermitted": 1,
  703 + "myChannel": "0",
  704 + "name": "吉林",
  705 + "num": 30,
  706 + "pageId": 20044,
  707 + "pageType": "",
  708 + "underlineCColor": ""
  709 + },
  710 + {
  711 + "channelId": 2035,
  712 + "channelStyle": 2,
  713 + "channelType": 2,
  714 + "defaultPermitted": 0,
  715 + "delPermitted": 1,
  716 + "fontCColor": "#FFFFFF",
  717 + "fontColor": "#F9AB99",
  718 + "headlinesOn": 0,
  719 + "homeChannel": "0",
  720 + "iconCUrl": "",
  721 + "iconCUrlSize": "",
  722 + "iconUrl": "",
  723 + "iconUrlSize": "",
  724 + "localChannel": "0",
  725 + "moreChannel": "0",
  726 + "movePermitted": 1,
  727 + "myChannel": "0",
  728 + "name": "黑龙江",
  729 + "num": 31,
  730 + "pageId": 20045,
  731 + "pageType": "",
  732 + "underlineCColor": ""
  733 + },
  734 + {
  735 + "channelId": 2028,
  736 + "channelStyle": 2,
  737 + "channelType": 2,
  738 + "defaultPermitted": 0,
  739 + "delPermitted": 1,
  740 + "fontCColor": "#FFFFFF",
  741 + "fontColor": "#F9AB99",
  742 + "headlinesOn": 0,
  743 + "homeChannel": "0",
  744 + "iconCUrl": "",
  745 + "iconCUrlSize": "",
  746 + "iconUrl": "",
  747 + "iconUrlSize": "",
  748 + "localChannel": "0",
  749 + "moreChannel": "0",
  750 + "movePermitted": 1,
  751 + "myChannel": "0",
  752 + "name": "上海",
  753 + "num": 32,
  754 + "pageId": 20038,
  755 + "pageType": "",
  756 + "underlineCColor": ""
  757 + },
  758 + {
  759 + "channelId": 2036,
  760 + "channelStyle": 2,
  761 + "channelType": 2,
  762 + "defaultPermitted": 0,
  763 + "delPermitted": 1,
  764 + "fontCColor": "#FFFFFF",
  765 + "fontColor": "#F9AB99",
  766 + "headlinesOn": 0,
  767 + "homeChannel": "0",
  768 + "iconCUrl": "",
  769 + "iconCUrlSize": "",
  770 + "iconUrl": "",
  771 + "iconUrlSize": "",
  772 + "localChannel": "0",
  773 + "moreChannel": "0",
  774 + "movePermitted": 1,
  775 + "myChannel": "0",
  776 + "name": "江苏",
  777 + "num": 33,
  778 + "pageId": 20046,
  779 + "pageType": "",
  780 + "underlineCColor": ""
  781 + },
  782 + {
  783 + "channelId": 2037,
  784 + "channelStyle": 2,
  785 + "channelType": 2,
  786 + "defaultPermitted": 0,
  787 + "delPermitted": 1,
  788 + "fontCColor": "#FFFFFF",
  789 + "fontColor": "#F9AB99",
  790 + "headlinesOn": 0,
  791 + "homeChannel": "0",
  792 + "iconCUrl": "",
  793 + "iconCUrlSize": "",
  794 + "iconUrl": "",
  795 + "iconUrlSize": "",
  796 + "localChannel": "0",
  797 + "moreChannel": "0",
  798 + "movePermitted": 1,
  799 + "myChannel": "0",
  800 + "name": "浙江",
  801 + "num": 34,
  802 + "pageId": 20047,
  803 + "pageType": "",
  804 + "underlineCColor": ""
  805 + },
  806 + {
  807 + "channelId": 2038,
  808 + "channelStyle": 2,
  809 + "channelType": 2,
  810 + "defaultPermitted": 0,
  811 + "delPermitted": 1,
  812 + "fontCColor": "#FFFFFF",
  813 + "fontColor": "#F9AB99",
  814 + "headlinesOn": 0,
  815 + "homeChannel": "0",
  816 + "iconCUrl": "",
  817 + "iconCUrlSize": "",
  818 + "iconUrl": "",
  819 + "iconUrlSize": "",
  820 + "localChannel": "0",
  821 + "moreChannel": "0",
  822 + "movePermitted": 1,
  823 + "myChannel": "0",
  824 + "name": "安徽",
  825 + "num": 35,
  826 + "pageId": 20048,
  827 + "pageType": "",
  828 + "underlineCColor": ""
  829 + },
  830 + {
  831 + "channelId": 2039,
  832 + "channelStyle": 2,
  833 + "channelType": 2,
  834 + "defaultPermitted": 0,
  835 + "delPermitted": 1,
  836 + "fontCColor": "#FFFFFF",
  837 + "fontColor": "#F9AB99",
  838 + "headlinesOn": 0,
  839 + "homeChannel": "0",
  840 + "iconCUrl": "",
  841 + "iconCUrlSize": "",
  842 + "iconUrl": "",
  843 + "iconUrlSize": "",
  844 + "localChannel": "0",
  845 + "moreChannel": "0",
  846 + "movePermitted": 1,
  847 + "myChannel": "0",
  848 + "name": "福建",
  849 + "num": 36,
  850 + "pageId": 20049,
  851 + "pageType": "",
  852 + "underlineCColor": ""
  853 + },
  854 + {
  855 + "channelId": 2040,
  856 + "channelStyle": 2,
  857 + "channelType": 2,
  858 + "defaultPermitted": 0,
  859 + "delPermitted": 1,
  860 + "fontCColor": "#FFFFFF",
  861 + "fontColor": "#F9AB99",
  862 + "headlinesOn": 0,
  863 + "homeChannel": "0",
  864 + "iconCUrl": "",
  865 + "iconCUrlSize": "",
  866 + "iconUrl": "",
  867 + "iconUrlSize": "",
  868 + "localChannel": "0",
  869 + "moreChannel": "0",
  870 + "movePermitted": 1,
  871 + "myChannel": "0",
  872 + "name": "江西",
  873 + "num": 37,
  874 + "pageId": 20050,
  875 + "pageType": "",
  876 + "underlineCColor": ""
  877 + },
  878 + {
  879 + "channelId": 2041,
  880 + "channelStyle": 2,
  881 + "channelType": 2,
  882 + "defaultPermitted": 0,
  883 + "delPermitted": 1,
  884 + "fontCColor": "#FFFFFF",
  885 + "fontColor": "#F9AB99",
  886 + "headlinesOn": 0,
  887 + "homeChannel": "0",
  888 + "iconCUrl": "",
  889 + "iconCUrlSize": "",
  890 + "iconUrl": "",
  891 + "iconUrlSize": "",
  892 + "localChannel": "0",
  893 + "moreChannel": "0",
  894 + "movePermitted": 1,
  895 + "myChannel": "0",
  896 + "name": "山东",
  897 + "num": 38,
  898 + "pageId": 20051,
  899 + "pageType": "",
  900 + "underlineCColor": ""
  901 + },
  902 + {
  903 + "channelId": 2042,
  904 + "channelStyle": 2,
  905 + "channelType": 2,
  906 + "defaultPermitted": 0,
  907 + "delPermitted": 1,
  908 + "fontCColor": "#FFFFFF",
  909 + "fontColor": "#F9AB99",
  910 + "headlinesOn": 0,
  911 + "homeChannel": "0",
  912 + "iconCUrl": "",
  913 + "iconCUrlSize": "",
  914 + "iconUrl": "",
  915 + "iconUrlSize": "",
  916 + "localChannel": "0",
  917 + "moreChannel": "0",
  918 + "movePermitted": 1,
  919 + "myChannel": "0",
  920 + "name": "河南",
  921 + "num": 39,
  922 + "pageId": 20052,
  923 + "pageType": "",
  924 + "underlineCColor": ""
  925 + },
  926 + {
  927 + "channelId": 2043,
  928 + "channelStyle": 2,
  929 + "channelType": 2,
  930 + "defaultPermitted": 0,
  931 + "delPermitted": 1,
  932 + "fontCColor": "#FFFFFF",
  933 + "fontColor": "#F9AB99",
  934 + "headlinesOn": 0,
  935 + "homeChannel": "0",
  936 + "iconCUrl": "",
  937 + "iconCUrlSize": "",
  938 + "iconUrl": "",
  939 + "iconUrlSize": "",
  940 + "localChannel": "0",
  941 + "moreChannel": "0",
  942 + "movePermitted": 1,
  943 + "myChannel": "0",
  944 + "name": "湖北",
  945 + "num": 40,
  946 + "pageId": 20053,
  947 + "pageType": "",
  948 + "underlineCColor": ""
  949 + },
  950 + {
  951 + "channelId": 2044,
  952 + "channelStyle": 2,
  953 + "channelType": 2,
  954 + "defaultPermitted": 0,
  955 + "delPermitted": 1,
  956 + "fontCColor": "#FFFFFF",
  957 + "fontColor": "#F9AB99",
  958 + "headlinesOn": 0,
  959 + "homeChannel": "0",
  960 + "iconCUrl": "",
  961 + "iconCUrlSize": "",
  962 + "iconUrl": "",
  963 + "iconUrlSize": "",
  964 + "localChannel": "0",
  965 + "moreChannel": "0",
  966 + "movePermitted": 1,
  967 + "myChannel": "0",
  968 + "name": "湖南",
  969 + "num": 41,
  970 + "pageId": 20054,
  971 + "pageType": "",
  972 + "underlineCColor": ""
  973 + },
  974 + {
  975 + "channelId": 2045,
  976 + "channelStyle": 2,
  977 + "channelType": 2,
  978 + "defaultPermitted": 0,
  979 + "delPermitted": 1,
  980 + "fontCColor": "#FFFFFF",
  981 + "fontColor": "#F9AB99",
  982 + "headlinesOn": 0,
  983 + "homeChannel": "0",
  984 + "iconCUrl": "",
  985 + "iconCUrlSize": "",
  986 + "iconUrl": "",
  987 + "iconUrlSize": "",
  988 + "localChannel": "0",
  989 + "moreChannel": "0",
  990 + "movePermitted": 1,
  991 + "myChannel": "0",
  992 + "name": "广东",
  993 + "num": 42,
  994 + "pageId": 20055,
  995 + "pageType": "",
  996 + "underlineCColor": ""
  997 + },
  998 + {
  999 + "channelId": 2046,
  1000 + "channelStyle": 2,
  1001 + "channelType": 2,
  1002 + "defaultPermitted": 0,
  1003 + "delPermitted": 1,
  1004 + "fontCColor": "#FFFFFF",
  1005 + "fontColor": "#F9AB99",
  1006 + "headlinesOn": 0,
  1007 + "homeChannel": "0",
  1008 + "iconCUrl": "",
  1009 + "iconCUrlSize": "",
  1010 + "iconUrl": "",
  1011 + "iconUrlSize": "",
  1012 + "localChannel": "0",
  1013 + "moreChannel": "0",
  1014 + "movePermitted": 1,
  1015 + "myChannel": "0",
  1016 + "name": "广西",
  1017 + "num": 43,
  1018 + "pageId": 20056,
  1019 + "pageType": "",
  1020 + "underlineCColor": ""
  1021 + },
  1022 + {
  1023 + "channelId": 2047,
  1024 + "channelStyle": 2,
  1025 + "channelType": 2,
  1026 + "defaultPermitted": 0,
  1027 + "delPermitted": 1,
  1028 + "fontCColor": "#FFFFFF",
  1029 + "fontColor": "#F9AB99",
  1030 + "headlinesOn": 0,
  1031 + "homeChannel": "0",
  1032 + "iconCUrl": "",
  1033 + "iconCUrlSize": "",
  1034 + "iconUrl": "",
  1035 + "iconUrlSize": "",
  1036 + "localChannel": "0",
  1037 + "moreChannel": "0",
  1038 + "movePermitted": 1,
  1039 + "myChannel": "0",
  1040 + "name": "海南",
  1041 + "num": 44,
  1042 + "pageId": 20057,
  1043 + "pageType": "",
  1044 + "underlineCColor": ""
  1045 + },
  1046 + {
  1047 + "channelId": 2048,
  1048 + "channelStyle": 2,
  1049 + "channelType": 2,
  1050 + "defaultPermitted": 0,
  1051 + "delPermitted": 1,
  1052 + "fontCColor": "#FFFFFF",
  1053 + "fontColor": "#F9AB99",
  1054 + "headlinesOn": 0,
  1055 + "homeChannel": "0",
  1056 + "iconCUrl": "",
  1057 + "iconCUrlSize": "",
  1058 + "iconUrl": "",
  1059 + "iconUrlSize": "",
  1060 + "localChannel": "0",
  1061 + "moreChannel": "0",
  1062 + "movePermitted": 1,
  1063 + "myChannel": "0",
  1064 + "name": "重庆",
  1065 + "num": 45,
  1066 + "pageId": 20058,
  1067 + "pageType": "",
  1068 + "underlineCColor": ""
  1069 + },
  1070 + {
  1071 + "channelId": 2049,
  1072 + "channelStyle": 2,
  1073 + "channelType": 2,
  1074 + "defaultPermitted": 0,
  1075 + "delPermitted": 1,
  1076 + "fontCColor": "#FFFFFF",
  1077 + "fontColor": "#F9AB99",
  1078 + "headlinesOn": 0,
  1079 + "homeChannel": "0",
  1080 + "iconCUrl": "",
  1081 + "iconCUrlSize": "",
  1082 + "iconUrl": "",
  1083 + "iconUrlSize": "",
  1084 + "localChannel": "0",
  1085 + "moreChannel": "0",
  1086 + "movePermitted": 1,
  1087 + "myChannel": "0",
  1088 + "name": "四川",
  1089 + "num": 46,
  1090 + "pageId": 20059,
  1091 + "pageType": "",
  1092 + "underlineCColor": ""
  1093 + },
  1094 + {
  1095 + "channelId": 2050,
  1096 + "channelStyle": 2,
  1097 + "channelType": 2,
  1098 + "defaultPermitted": 0,
  1099 + "delPermitted": 1,
  1100 + "fontCColor": "#FFFFFF",
  1101 + "fontColor": "#F9AB99",
  1102 + "headlinesOn": 0,
  1103 + "homeChannel": "0",
  1104 + "iconCUrl": "",
  1105 + "iconCUrlSize": "",
  1106 + "iconUrl": "",
  1107 + "iconUrlSize": "",
  1108 + "localChannel": "0",
  1109 + "moreChannel": "0",
  1110 + "movePermitted": 1,
  1111 + "myChannel": "0",
  1112 + "name": "贵州",
  1113 + "num": 47,
  1114 + "pageId": 20060,
  1115 + "pageType": "",
  1116 + "underlineCColor": ""
  1117 + },
  1118 + {
  1119 + "channelId": 2051,
  1120 + "channelStyle": 2,
  1121 + "channelType": 2,
  1122 + "defaultPermitted": 0,
  1123 + "delPermitted": 1,
  1124 + "fontCColor": "#FFFFFF",
  1125 + "fontColor": "#F9AB99",
  1126 + "headlinesOn": 0,
  1127 + "homeChannel": "0",
  1128 + "iconCUrl": "",
  1129 + "iconCUrlSize": "",
  1130 + "iconUrl": "",
  1131 + "iconUrlSize": "",
  1132 + "localChannel": "0",
  1133 + "moreChannel": "0",
  1134 + "movePermitted": 1,
  1135 + "myChannel": "0",
  1136 + "name": "云南",
  1137 + "num": 48,
  1138 + "pageId": 20061,
  1139 + "pageType": "",
  1140 + "underlineCColor": ""
  1141 + },
  1142 + {
  1143 + "channelId": 2052,
  1144 + "channelStyle": 2,
  1145 + "channelType": 2,
  1146 + "defaultPermitted": 0,
  1147 + "delPermitted": 1,
  1148 + "fontCColor": "#FFFFFF",
  1149 + "fontColor": "#F9AB99",
  1150 + "headlinesOn": 0,
  1151 + "homeChannel": "0",
  1152 + "iconCUrl": "",
  1153 + "iconCUrlSize": "",
  1154 + "iconUrl": "",
  1155 + "iconUrlSize": "",
  1156 + "localChannel": "0",
  1157 + "moreChannel": "0",
  1158 + "movePermitted": 1,
  1159 + "myChannel": "0",
  1160 + "name": "西藏",
  1161 + "num": 49,
  1162 + "pageId": 20062,
  1163 + "pageType": "",
  1164 + "underlineCColor": ""
  1165 + },
  1166 + {
  1167 + "channelId": 2053,
  1168 + "channelStyle": 2,
  1169 + "channelType": 2,
  1170 + "defaultPermitted": 0,
  1171 + "delPermitted": 1,
  1172 + "fontCColor": "#FFFFFF",
  1173 + "fontColor": "#F9AB99",
  1174 + "headlinesOn": 0,
  1175 + "homeChannel": "0",
  1176 + "iconCUrl": "",
  1177 + "iconCUrlSize": "",
  1178 + "iconUrl": "",
  1179 + "iconUrlSize": "",
  1180 + "localChannel": "0",
  1181 + "moreChannel": "0",
  1182 + "movePermitted": 1,
  1183 + "myChannel": "0",
  1184 + "name": "陕西",
  1185 + "num": 50,
  1186 + "pageId": 20063,
  1187 + "pageType": "",
  1188 + "underlineCColor": ""
  1189 + },
  1190 + {
  1191 + "channelId": 2054,
  1192 + "channelStyle": 2,
  1193 + "channelType": 2,
  1194 + "defaultPermitted": 0,
  1195 + "delPermitted": 1,
  1196 + "fontCColor": "#FFFFFF",
  1197 + "fontColor": "#F9AB99",
  1198 + "headlinesOn": 0,
  1199 + "homeChannel": "0",
  1200 + "iconCUrl": "",
  1201 + "iconCUrlSize": "",
  1202 + "iconUrl": "",
  1203 + "iconUrlSize": "",
  1204 + "localChannel": "0",
  1205 + "moreChannel": "0",
  1206 + "movePermitted": 1,
  1207 + "myChannel": "0",
  1208 + "name": "甘肃",
  1209 + "num": 51,
  1210 + "pageId": 20064,
  1211 + "pageType": "",
  1212 + "underlineCColor": ""
  1213 + },
  1214 + {
  1215 + "channelId": 2055,
  1216 + "channelStyle": 2,
  1217 + "channelType": 2,
  1218 + "defaultPermitted": 0,
  1219 + "delPermitted": 1,
  1220 + "fontCColor": "#FFFFFF",
  1221 + "fontColor": "#F9AB99",
  1222 + "headlinesOn": 0,
  1223 + "homeChannel": "0",
  1224 + "iconCUrl": "",
  1225 + "iconCUrlSize": "",
  1226 + "iconUrl": "",
  1227 + "iconUrlSize": "",
  1228 + "localChannel": "0",
  1229 + "moreChannel": "0",
  1230 + "movePermitted": 1,
  1231 + "myChannel": "0",
  1232 + "name": "青海",
  1233 + "num": 52,
  1234 + "pageId": 20065,
  1235 + "pageType": "",
  1236 + "underlineCColor": ""
  1237 + },
  1238 + {
  1239 + "channelId": 2056,
  1240 + "channelStyle": 2,
  1241 + "channelType": 2,
  1242 + "defaultPermitted": 0,
  1243 + "delPermitted": 1,
  1244 + "fontCColor": "#FFFFFF",
  1245 + "fontColor": "#F9AB99",
  1246 + "headlinesOn": 0,
  1247 + "homeChannel": "0",
  1248 + "iconCUrl": "",
  1249 + "iconCUrlSize": "",
  1250 + "iconUrl": "",
  1251 + "iconUrlSize": "",
  1252 + "localChannel": "0",
  1253 + "moreChannel": "0",
  1254 + "movePermitted": 1,
  1255 + "myChannel": "0",
  1256 + "name": "宁夏",
  1257 + "num": 53,
  1258 + "pageId": 20066,
  1259 + "pageType": "",
  1260 + "underlineCColor": ""
  1261 + },
  1262 + {
  1263 + "channelId": 2057,
  1264 + "channelStyle": 2,
  1265 + "channelType": 2,
  1266 + "defaultPermitted": 0,
  1267 + "delPermitted": 1,
  1268 + "fontCColor": "#FFFFFF",
  1269 + "fontColor": "#F9AB99",
  1270 + "headlinesOn": 0,
  1271 + "homeChannel": "0",
  1272 + "iconCUrl": "",
  1273 + "iconCUrlSize": "",
  1274 + "iconUrl": "",
  1275 + "iconUrlSize": "",
  1276 + "localChannel": "0",
  1277 + "moreChannel": "0",
  1278 + "movePermitted": 1,
  1279 + "myChannel": "0",
  1280 + "name": "新疆",
  1281 + "num": 54,
  1282 + "pageId": 20067,
  1283 + "pageType": "",
  1284 + "underlineCColor": ""
  1285 + },
  1286 + {
  1287 + "channelId": 2020,
  1288 + "channelStyle": 2,
  1289 + "channelType": 1,
  1290 + "defaultPermitted": 0,
  1291 + "delPermitted": 1,
  1292 + "fontCColor": "#FFFFFF",
  1293 + "fontColor": "#F9AB99",
  1294 + "headlinesOn": 0,
  1295 + "homeChannel": "0",
  1296 + "iconCUrl": "",
  1297 + "iconCUrlSize": "",
  1298 + "iconUrl": "",
  1299 + "iconUrlSize": "",
  1300 + "localChannel": "0",
  1301 + "moreChannel": "0",
  1302 + "movePermitted": 1,
  1303 + "myChannel": "0",
  1304 + "name": "国际",
  1305 + "num": 57,
  1306 + "pageId": 20030,
  1307 + "pageType": "",
  1308 + "underlineCColor": ""
  1309 + },
  1310 + {
  1311 + "channelId": 2021,
  1312 + "channelStyle": 2,
  1313 + "channelType": 1,
  1314 + "defaultPermitted": 0,
  1315 + "delPermitted": 1,
  1316 + "fontCColor": "#FFFFFF",
  1317 + "fontColor": "#F9AB99",
  1318 + "headlinesOn": 0,
  1319 + "homeChannel": "0",
  1320 + "iconCUrl": "",
  1321 + "iconCUrlSize": "",
  1322 + "iconUrl": "",
  1323 + "iconUrlSize": "",
  1324 + "localChannel": "0",
  1325 + "moreChannel": "0",
  1326 + "movePermitted": 1,
  1327 + "myChannel": "0",
  1328 + "name": "法治",
  1329 + "num": 58,
  1330 + "pageId": 20031,
  1331 + "pageType": "",
  1332 + "underlineCColor": ""
  1333 + },
  1334 + {
  1335 + "channelId": 2022,
  1336 + "channelStyle": 2,
  1337 + "channelType": 1,
  1338 + "defaultPermitted": 0,
  1339 + "delPermitted": 1,
  1340 + "fontCColor": "#FFFFFF",
  1341 + "fontColor": "#F9AB99",
  1342 + "headlinesOn": 0,
  1343 + "homeChannel": "0",
  1344 + "iconCUrl": "",
  1345 + "iconCUrlSize": "",
  1346 + "iconUrl": "",
  1347 + "iconUrlSize": "",
  1348 + "localChannel": "0",
  1349 + "moreChannel": "0",
  1350 + "movePermitted": 1,
  1351 + "myChannel": "0",
  1352 + "name": "生活",
  1353 + "num": 59,
  1354 + "pageId": 20032,
  1355 + "pageType": "",
  1356 + "underlineCColor": ""
  1357 + },
  1358 + {
  1359 + "channelId": 2092,
  1360 + "channelStyle": 2,
  1361 + "channelType": 1,
  1362 + "defaultPermitted": 0,
  1363 + "delPermitted": 0,
  1364 + "fontCColor": "#FFFFFF",
  1365 + "fontColor": "#F9AB99",
  1366 + "headlinesOn": 0,
  1367 + "homeChannel": "0",
  1368 + "iconCUrl": "",
  1369 + "iconCUrlSize": "",
  1370 + "iconUrl": "",
  1371 + "iconUrlSize": "",
  1372 + "localChannel": "0",
  1373 + "moreChannel": "0",
  1374 + "movePermitted": 1,
  1375 + "myChannel": "0",
  1376 + "name": "设计",
  1377 + "num": 68,
  1378 + "pageId": 21063,
  1379 + "pageType": "",
  1380 + "underlineCColor": ""
  1381 + },
  1382 + {
  1383 + "channelId": 2098,
  1384 + "channelStyle": 2,
  1385 + "channelType": 1,
  1386 + "defaultPermitted": 0,
  1387 + "delPermitted": 0,
  1388 + "fontCColor": "#FFFFFF",
  1389 + "fontColor": "#F9AB99",
  1390 + "headlinesOn": 0,
  1391 + "homeChannel": "0",
  1392 + "iconCUrl": "",
  1393 + "iconCUrlSize": "",
  1394 + "iconUrl": "",
  1395 + "iconUrlSize": "",
  1396 + "localChannel": "0",
  1397 + "moreChannel": "0",
  1398 + "movePermitted": 0,
  1399 + "myChannel": "0",
  1400 + "name": "设计组件",
  1401 + "num": 72,
  1402 + "pageId": 21299,
  1403 + "pageType": "",
  1404 + "underlineCColor": ""
  1405 + },
  1406 + {
  1407 + "channelId": 2099,
  1408 + "channelStyle": 2,
  1409 + "channelType": 1,
  1410 + "defaultPermitted": 0,
  1411 + "delPermitted": 0,
  1412 + "fontCColor": "",
  1413 + "fontColor": "",
  1414 + "headlinesOn": 0,
  1415 + "homeChannel": "0",
  1416 + "iconCUrl": "",
  1417 + "iconCUrlSize": "",
  1418 + "iconUrl": "",
  1419 + "iconUrlSize": "",
  1420 + "localChannel": "0",
  1421 + "moreChannel": "0",
  1422 + "movePermitted": 1,
  1423 + "myChannel": "0",
  1424 + "name": "设计号",
  1425 + "num": 73,
  1426 + "pageId": 21736,
  1427 + "pageType": "",
  1428 + "underlineCColor": ""
  1429 + }
  1430 + ],
  1431 + "topStyle": "11",
  1432 + "type": "1"
  1433 + },
  1434 + {
  1435 + "backgroundUrl": "https://uatjdcdnphoto.aikan.pdnews.cn/sjbj-20231214/image/display/2e1d5f235d1a44cfb9fc120e8596c56b.png",
  1436 + "channelChooseActionUrl": "https://uatjdcdnphoto.aikan.pdnews.cn/sjbj-20231227/vod/display/3835f09a973443cb824af179e30e87ed.pag",
  1437 + "channelChooseCColor": "#666666",
  1438 + "channelChooseColor": "#222222",
  1439 + "channelMoreColor": "",
  1440 + "extraData": "{\"haveSearch\":\"0\",\"haveTopNav\":\"1\",\"leftIconurl\":\"\",\"rightIconUrl\":\"\"}",
  1441 + "homePageColor": "#FFFFFF",
  1442 + "icon": "https://uatjdcdnphoto.aikan.pdnews.cn/sjbj-20231220/image/display/460f61a48c6a4993af442d54aedb682b.png",
  1443 + "iconC": "https://uatjdcdnphoto.aikan.pdnews.cn/sjbj-20231220/image/display/9aa759f72ccb4848b3ded2dee9502c25.gif",
  1444 + "id": 202,
  1445 + "immersiveIconCUrl": "",
  1446 + "immersiveIconUrl": "",
  1447 + "immersiveNameCColor": "#FFFFFF",
  1448 + "immersiveNameColor": "#FFFFFF",
  1449 + "logoUrl": "",
  1450 + "morningAndEveningUrl": "",
  1451 + "name": "人民号",
  1452 + "nameCColor": "#ED2800",
  1453 + "nameColor": "#999999",
  1454 + "nightIconCUrl": "",
  1455 + "nightIconUrl": "",
  1456 + "nightNameCColor": "",
  1457 + "nightNameColor": "",
  1458 + "noticeColor": "#FFFFFF",
  1459 + "pageId": null,
  1460 + "pageType": null,
  1461 + "searchBothColor": "#222222",
  1462 + "searchUrl": "",
  1463 + "sortValue": 2,
  1464 + "statusBarColor": 1,
  1465 + "topNavChannelList": [
  1466 + {
  1467 + "channelId": 2058,
  1468 + "channelStyle": 3,
  1469 + "channelType": 1,
  1470 + "defaultPermitted": 0,
  1471 + "delPermitted": 1,
  1472 + "fontCColor": "#FFFFFF",
  1473 + "fontColor": "#F9AB99",
  1474 + "headlinesOn": 0,
  1475 + "homeChannel": "0",
  1476 + "iconCUrl": "",
  1477 + "iconCUrlSize": "",
  1478 + "iconUrl": "",
  1479 + "iconUrlSize": "",
  1480 + "localChannel": "0",
  1481 + "moreChannel": "0",
  1482 + "movePermitted": 1,
  1483 + "myChannel": "0",
  1484 + "name": "推荐",
  1485 + "num": 1,
  1486 + "pageId": 20068,
  1487 + "pageType": "",
  1488 + "underlineCColor": ""
  1489 + },
  1490 + {
  1491 + "channelId": 2059,
  1492 + "channelStyle": 3,
  1493 + "channelType": 3,
  1494 + "defaultPermitted": 0,
  1495 + "delPermitted": 1,
  1496 + "fontCColor": "#FFFFFF",
  1497 + "fontColor": "#F9AB99",
  1498 + "headlinesOn": 0,
  1499 + "homeChannel": "0",
  1500 + "iconCUrl": "",
  1501 + "iconCUrlSize": "",
  1502 + "iconUrl": "",
  1503 + "iconUrlSize": "",
  1504 + "localChannel": "0",
  1505 + "moreChannel": "0",
  1506 + "movePermitted": 1,
  1507 + "myChannel": "0",
  1508 + "name": "关注",
  1509 + "num": 2,
  1510 + "pageId": 20069,
  1511 + "pageType": "",
  1512 + "underlineCColor": ""
  1513 + },
  1514 + {
  1515 + "channelId": 2073,
  1516 + "channelStyle": 3,
  1517 + "channelType": 1,
  1518 + "defaultPermitted": 0,
  1519 + "delPermitted": 1,
  1520 + "fontCColor": "#FFFFFF",
  1521 + "fontColor": "#F9AB99",
  1522 + "headlinesOn": 0,
  1523 + "homeChannel": "0",
  1524 + "iconCUrl": "",
  1525 + "iconCUrlSize": "",
  1526 + "iconUrl": "",
  1527 + "iconUrlSize": "",
  1528 + "localChannel": "0",
  1529 + "moreChannel": "0",
  1530 + "movePermitted": 1,
  1531 + "myChannel": "0",
  1532 + "name": "活动",
  1533 + "num": 3,
  1534 + "pageId": 21010,
  1535 + "pageType": "",
  1536 + "underlineCColor": ""
  1537 + }
  1538 + ],
  1539 + "topStyle": "12",
  1540 + "type": "1"
  1541 + },
  1542 + {
  1543 + "backgroundUrl": "https://uatjdcdnphoto.aikan.pdnews.cn/sjbj-20231214/image/display/2e1d5f235d1a44cfb9fc120e8596c56b.png",
  1544 + "channelChooseActionUrl": "https://uatjdcdnphoto.aikan.pdnews.cn/sjbj-20231221/vod/display/65c6eb2ca91849c582d057adc9e76d46.pag",
  1545 + "channelChooseCColor": "#666666",
  1546 + "channelChooseColor": "#222222",
  1547 + "channelMoreColor": "",
  1548 + "extraData": "{\"haveSearch\":\"1\",\"haveTopNav\":\"1\",\"leftIconurl\":\"\",\"rightIconUrl\":\"\"}",
  1549 + "homePageColor": "#FFFFFF",
  1550 + "icon": "https://uatjdcdnphoto.aikan.pdnews.cn/sjbj-20231221/image/display/bf77561966654001a538857ebef8a15c.png",
  1551 + "iconC": "https://uatjdcdnphoto.aikan.pdnews.cn/sjbj-20231224/image/display/1a42d5b8183a4eb1a044ddd64223c687.png",
  1552 + "id": 203,
  1553 + "immersiveIconCUrl": "",
  1554 + "immersiveIconUrl": "",
  1555 + "immersiveNameCColor": "#FFFFFF",
  1556 + "immersiveNameColor": "#FFFFFF",
  1557 + "logoUrl": "",
  1558 + "morningAndEveningUrl": "",
  1559 + "name": "视频",
  1560 + "nameCColor": "#ED2800",
  1561 + "nameColor": "#999999",
  1562 + "nightIconCUrl": "",
  1563 + "nightIconUrl": "",
  1564 + "nightNameCColor": "",
  1565 + "nightNameColor": "",
  1566 + "noticeColor": "#FFFFFF",
  1567 + "pageId": null,
  1568 + "pageType": null,
  1569 + "searchBothColor": "#222222",
  1570 + "searchUrl": "",
  1571 + "sortValue": 3,
  1572 + "statusBarColor": 1,
  1573 + "topNavChannelList": [
  1574 + {
  1575 + "channelId": 2060,
  1576 + "channelStyle": 1,
  1577 + "channelType": 1,
  1578 + "defaultPermitted": 0,
  1579 + "delPermitted": 1,
  1580 + "fontCColor": "#FFFFFF",
  1581 + "fontColor": "#F9AB99",
  1582 + "headlinesOn": 0,
  1583 + "homeChannel": "0",
  1584 + "iconCUrl": "",
  1585 + "iconCUrlSize": "",
  1586 + "iconUrl": "",
  1587 + "iconUrlSize": "",
  1588 + "localChannel": "0",
  1589 + "moreChannel": "0",
  1590 + "movePermitted": 1,
  1591 + "myChannel": "0",
  1592 + "name": "视频",
  1593 + "num": 1,
  1594 + "pageId": 20070,
  1595 + "pageType": "",
  1596 + "underlineCColor": ""
  1597 + },
  1598 + {
  1599 + "channelId": 2061,
  1600 + "channelStyle": 3,
  1601 + "channelType": 1,
  1602 + "defaultPermitted": 0,
  1603 + "delPermitted": 1,
  1604 + "fontCColor": "#FFFFFF",
  1605 + "fontColor": "#F9AB99",
  1606 + "headlinesOn": 0,
  1607 + "homeChannel": "0",
  1608 + "iconCUrl": "",
  1609 + "iconCUrlSize": "",
  1610 + "iconUrl": "",
  1611 + "iconUrlSize": "",
  1612 + "localChannel": "0",
  1613 + "moreChannel": "0",
  1614 + "movePermitted": 1,
  1615 + "myChannel": "0",
  1616 + "name": "直播",
  1617 + "num": 2,
  1618 + "pageId": 20071,
  1619 + "pageType": "",
  1620 + "underlineCColor": ""
  1621 + }
  1622 + ],
  1623 + "topStyle": "13",
  1624 + "type": "1"
  1625 + },
  1626 + {
  1627 + "backgroundUrl": "https://uatjdcdnphoto.aikan.pdnews.cn/sjbj-20231214/image/display/2e1d5f235d1a44cfb9fc120e8596c56b.png",
  1628 + "channelChooseActionUrl": "https://uatjdcdnphoto.aikan.pdnews.cn/sjbj-20231221/vod/display/65c6eb2ca91849c582d057adc9e76d46.pag",
  1629 + "channelChooseCColor": "#666666",
  1630 + "channelChooseColor": "#222222",
  1631 + "channelMoreColor": "",
  1632 + "extraData": "{\"haveSearch\":\"1\",\"haveTopNav\":\"1\",\"leftIconurl\":\"\",\"rightIconUrl\":\"\"}",
  1633 + "homePageColor": "#FFFFFF",
  1634 + "icon": "https://uatjdcdnphoto.aikan.pdnews.cn/sjbj-20231220/image/display/5a6cf95f7b9e489390ec73faf458b58a.png",
  1635 + "iconC": "https://uatjdcdnphoto.aikan.pdnews.cn/sjbj-20231220/image/display/1b075ed30a6b43d2ae319e5d892c66e4.gif",
  1636 + "id": 204,
  1637 + "immersiveIconCUrl": "",
  1638 + "immersiveIconUrl": "",
  1639 + "immersiveNameCColor": "#FFFFFF",
  1640 + "immersiveNameColor": "#FFFFFF",
  1641 + "logoUrl": "",
  1642 + "morningAndEveningUrl": "",
  1643 + "name": "服务",
  1644 + "nameCColor": "#ED2800",
  1645 + "nameColor": "#999999",
  1646 + "nightIconCUrl": "",
  1647 + "nightIconUrl": "",
  1648 + "nightNameCColor": "",
  1649 + "nightNameColor": "",
  1650 + "noticeColor": "#FFFFFF",
  1651 + "pageId": null,
  1652 + "pageType": null,
  1653 + "searchBothColor": "#222222",
  1654 + "searchUrl": "",
  1655 + "sortValue": 4,
  1656 + "statusBarColor": 1,
  1657 + "topNavChannelList": [
  1658 + {
  1659 + "channelId": 2062,
  1660 + "channelStyle": 3,
  1661 + "channelType": 1,
  1662 + "defaultPermitted": 0,
  1663 + "delPermitted": 1,
  1664 + "fontCColor": "#FFFFFF",
  1665 + "fontColor": "#F9AB99",
  1666 + "headlinesOn": 0,
  1667 + "homeChannel": "0",
  1668 + "iconCUrl": "",
  1669 + "iconCUrlSize": "",
  1670 + "iconUrl": "",
  1671 + "iconUrlSize": "",
  1672 + "localChannel": "0",
  1673 + "moreChannel": "0",
  1674 + "movePermitted": 1,
  1675 + "myChannel": "0",
  1676 + "name": "服务",
  1677 + "num": 1,
  1678 + "pageId": 20072,
  1679 + "pageType": "",
  1680 + "underlineCColor": ""
  1681 + }
  1682 + ],
  1683 + "topStyle": "14",
  1684 + "type": "1"
  1685 + },
  1686 + {
  1687 + "backgroundUrl": "https://uatjdcdnphoto.aikan.pdnews.cn/sjbj-20231214/image/display/3e1f4fe85b0445b6a0be24f3759d0ff6.png",
  1688 + "channelChooseActionUrl": "",
  1689 + "channelChooseCColor": "#FFFFFF",
  1690 + "channelChooseColor": "#FFFFFF",
  1691 + "channelMoreColor": "",
  1692 + "extraData": "{\"haveSearch\":\"0\",\"haveTopNav\":\"0\"}",
  1693 + "homePageColor": "#222222",
  1694 + "icon": "https://uatjdcdnphoto.aikan.pdnews.cn/sjbj-20231220/image/display/f55f0ac25b764809bc8285c284adb147.png",
  1695 + "iconC": "https://uatjdcdnphoto.aikan.pdnews.cn/sjbj-20231220/image/display/3b5cff54d2a546f5b523a8aa8c33352e.gif",
  1696 + "id": 205,
  1697 + "immersiveIconCUrl": "https://uatjdcdnphoto.aikan.pdnews.cn/inen-20230403/image/display/9f22b579db15497797e8204b1ec12d14.png",
  1698 + "immersiveIconUrl": "https://uatjdcdnphoto.aikan.pdnews.cn/inen-20230403/image/display/5be23055a4dc4d869be2139e9deb7a55.png",
  1699 + "immersiveNameCColor": "#FFFFFF",
  1700 + "immersiveNameColor": "#FFFFFF",
  1701 + "logoUrl": "",
  1702 + "morningAndEveningUrl": "",
  1703 + "name": "我的",
  1704 + "nameCColor": "#ED2800",
  1705 + "nameColor": "#999999",
  1706 + "nightIconCUrl": "https://uatjdcdnphoto.aikan.pdnews.cn/inen-20230403/image/display/9d584ddcfdf74e3ea8e445d102127b97.png",
  1707 + "nightIconUrl": "https://uatjdcdnphoto.aikan.pdnews.cn/inen-20230403/image/display/1f79063b6ecb493c95703e45529d3a5f.png",
  1708 + "nightNameCColor": "#DA1C1C",
  1709 + "nightNameColor": "#6A6B75",
  1710 + "noticeColor": "#ED2800",
  1711 + "pageId": null,
  1712 + "pageType": null,
  1713 + "searchBothColor": "#FFFFFF",
  1714 + "searchUrl": "",
  1715 + "sortValue": 5,
  1716 + "statusBarColor": 1,
  1717 + "topNavChannelList": [],
  1718 + "topStyle": "",
  1719 + "type": "2"
  1720 + }
  1721 + ],
  1722 + "greyBottomNav": {
  1723 + "bottomNavList": [],
  1724 + "greyUserList": []
  1725 + },
  1726 + "immersiveBackgroundColor": "",
  1727 + "nightBackgroundColor": ""
  1728 + },
  1729 + "message": "Success",
  1730 + "meta": {
  1731 + "md5": "e2942dbcd76710d1bac0d98f9a0a9d0a"
  1732 + },
  1733 + "requestId": "",
  1734 + "success": true,
  1735 + "timestamp": 1704765430031
  1736 +}
  1 +{
  2 + "code": "0",
  3 + "data": {
  4 + "compAdList": [
  5 +
  6 + ],
  7 + "compList": [
  8 + {
  9 + "backgroundColor": "",
  10 + "backgroundImgUrl": "",
  11 + "cityCode": "",
  12 + "compStyle": "Carousel_Layout-01",
  13 + "compType": "CAROUSEL_LAYOUT",
  14 + "dataSourceRequest": [
  15 +
  16 + ],
  17 + "districtCode": "",
  18 + "extraData": "",
  19 + "hasAdInfo": 0,
  20 + "id": 31,
  21 + "imgSize": "",
  22 + "innerUrl": "",
  23 + "linkUrl": "",
  24 + "meddleDataList": [
  25 +
  26 + ],
  27 + "name": "为你推荐feed",
  28 + "objectId": "",
  29 + "objectTitle": "",
  30 + "objectType": null,
  31 + "operDataList": [
  32 + {
  33 + "cityCode": "",
  34 + "coverSize": "1920*1080",
  35 + "coverType": 1,
  36 + "coverUrl": "https://uatjdcdnphoto.aikan.pdnews.cn/sjbj-20231208/image/display/d4496925a1264a749975ae9b01a4ef46.png?x-oss-process=image/resize,w_550/quality,q_90/format,jpg",
  37 + "description": "畅通国内大循环,2023年中国经济高质量发展",
  38 + "districtCode": "",
  39 + "endTime": "",
  40 + "hImageUrl": "https://uatjdcdnphoto.aikan.pdnews.cn/sjbj-20231208/image/display/d4496925a1264a749975ae9b01a4ef46.png?x-oss-process=image/resize,w_550/quality,q_90/format,jpg",
  41 + "heatValue": "",
  42 + "innerUrl": "",
  43 + "landscape": 1,
  44 + "lengthTime": null,
  45 + "linkUrl": "",
  46 + "openLikes": 0,
  47 + "openUrl": "http://livewatch-prod.aikan.pdnews.cn/tr_lud/5404912f99bf4703ab070752b507cc64_origin.m3u8?auth_key=1705628416-0-0-c7f5854d6cbe801578009bfa44757f0d",
  48 + "pageId": "",
  49 + "playUrls": [
  50 +
  51 + ],
  52 + "programAuth": "2004557",
  53 + "programId": "20000003744",
  54 + "programName": "",
  55 + "programSource": 5,
  56 + "programType": 2,
  57 + "provinceCode": "",
  58 + "rankingList": [
  59 +
  60 + ],
  61 + "showTitleEd": "",
  62 + "showTitleIng": "",
  63 + "showTitleNo": "",
  64 + "sortValue": null,
  65 + "startTime": "2023-12-19 09:00:00",
  66 + "subType": "",
  67 + "subtitle": "",
  68 + "title": "畅通国内大循环,2023年中国经济高质量发展",
  69 + "vImageUrl": "https://cdnjdphoto.aikan.pdnews.cn/sjbj-20231219/image/live/41e6079d95ff459a9adcf1a16ae0b004.jpg?x-oss-process=image/resize,l_850/auto-orient,1/quality,q_95/format,jpg"
  70 + },
  71 + {
  72 + "cityCode": "",
  73 + "coverSize": "1920*1080",
  74 + "coverType": 1,
  75 + "coverUrl": "https://uatjdcdnphoto.aikan.pdnews.cn/sjbj-20240104/image/display/c4a9b526e0994d1bbd3ac8450f5cfc6c.jpg?x-oss-process=image/resize,w_550/quality,q_90/format,jpg",
  76 + "description": "内容榜单",
  77 + "districtCode": "",
  78 + "endTime": "",
  79 + "hImageUrl": "https://uatjdcdnphoto.aikan.pdnews.cn/sjbj-20240104/image/display/c4a9b526e0994d1bbd3ac8450f5cfc6c.jpg?x-oss-process=image/resize,w_550/quality,q_90/format,jpg",
  80 + "heatValue": "",
  81 + "innerUrl": "",
  82 + "landscape": 1,
  83 + "lengthTime": null,
  84 + "linkUrl": "",
  85 + "openLikes": 0,
  86 + "openUrl": "",
  87 + "pageId": "",
  88 + "playUrls": [
  89 +
  90 + ],
  91 + "programAuth": "2004557",
  92 + "programId": "20000003614",
  93 + "programName": "",
  94 + "programSource": 5,
  95 + "programType": 2,
  96 + "provinceCode": "",
  97 + "rankingList": [
  98 +
  99 + ],
  100 + "showTitleEd": "",
  101 + "showTitleIng": "",
  102 + "showTitleNo": "",
  103 + "sortValue": null,
  104 + "startTime": "2023-12-07 09:00:00",
  105 + "subType": "",
  106 + "subtitle": "",
  107 + "title": "内容榜单",
  108 + "vImageUrl": "https://cdnjdphoto.aikan.pdnews.cn/sjbj-20231206/image/live/bbe6d821e92b48919d90c7dadfd1f05a.jpg?x-oss-process=image/resize,l_850/auto-orient,1/quality,q_95/format,jpg"
  109 + },
  110 + {
  111 + "cityCode": "",
  112 + "coverSize": "",
  113 + "coverType": 1,
  114 + "coverUrl": "https://uatjdcdnphoto.aikan.pdnews.cn/sjbj-20240108/image/display/c7790c3c880b4b8a88082f4d224487b8.png?x-oss-process=image/resize,w_550/quality,q_90/format,jpg",
  115 + "description": "贴错门牌致业主装修了隔壁,开发商承担装修费",
  116 + "districtCode": "",
  117 + "endTime": "",
  118 + "hImageUrl": "https://uatjdcdnphoto.aikan.pdnews.cn/sjbj-20240108/image/display/c7790c3c880b4b8a88082f4d224487b8.png?x-oss-process=image/resize,w_550/quality,q_90/format,jpg",
  119 + "heatValue": "",
  120 + "innerUrl": "",
  121 + "landscape": 1,
  122 + "lengthTime": null,
  123 + "linkUrl": "",
  124 + "openLikes": 0,
  125 + "openUrl": "",
  126 + "pageId": "",
  127 + "playUrls": [
  128 +
  129 + ],
  130 + "programAuth": "2004557",
  131 + "programId": "20000003394",
  132 + "programName": "",
  133 + "programSource": 5,
  134 + "programType": 2,
  135 + "provinceCode": "",
  136 + "rankingList": [
  137 +
  138 + ],
  139 + "showTitleEd": "",
  140 + "showTitleIng": "",
  141 + "showTitleNo": "",
  142 + "sortValue": null,
  143 + "startTime": "2023-11-12 13:50:48",
  144 + "subType": "",
  145 + "subtitle": "",
  146 + "title": "贴错门牌致业主装修了隔壁,开发商承担装修费",
  147 + "vImageUrl": "https://cdnjdphoto.aikan.pdnews.cn/sjbj-20231109/image/live/102e6eb9356b4ef19405b04c1f6ff875.png?x-oss-process=image/resize,l_850/auto-orient,1/quality,q_95/format,jpg"
  148 + }
  149 + ],
  150 + "pageId": null,
  151 + "posterSize": "",
  152 + "posterUrl": "",
  153 + "provinceCode": "",
  154 + "sortValue": 2,
  155 + "subType": ""
  156 + },
  157 + {
  158 + "backgroundColor": "",
  159 + "backgroundImgUrl": "",
  160 + "cityCode": "",
  161 + "compStyle": "Label-03",
  162 + "compType": "LABEL",
  163 + "dataSourceRequest": [
  164 +
  165 + ],
  166 + "districtCode": "",
  167 + "extraData": "{\"titleIconUrl\":\"\",\"title\":\"今日推荐\"}",
  168 + "hasAdInfo": 0,
  169 + "id": 11,
  170 + "imgSize": "",
  171 + "innerUrl": "",
  172 + "linkUrl": "",
  173 + "meddleDataList": [
  174 +
  175 + ],
  176 + "name": "今日推荐",
  177 + "objectId": "",
  178 + "objectTitle": "",
  179 + "objectType": null,
  180 + "operDataList": [
  181 +
  182 + ],
  183 + "pageId": null,
  184 + "posterSize": "",
  185 + "posterUrl": "",
  186 + "provinceCode": "",
  187 + "sortValue": 5,
  188 + "subType": ""
  189 + },
  190 + {
  191 + "backgroundColor": "",
  192 + "backgroundImgUrl": "",
  193 + "cityCode": "",
  194 + "compStyle": "Grid_Layout-01",
  195 + "compType": "GRID_LAYOUT",
  196 + "dataSourceRequest": [
  197 +
  198 + ],
  199 + "districtCode": "",
  200 + "extraData": "",
  201 + "hasAdInfo": 0,
  202 + "id": 7080,
  203 + "imgSize": "",
  204 + "innerUrl": "",
  205 + "linkUrl": "",
  206 + "meddleDataList": [
  207 +
  208 + ],
  209 + "name": "横宫格",
  210 + "objectId": "",
  211 + "objectTitle": "",
  212 + "objectType": null,
  213 + "operDataList": [
  214 + {
  215 + "cityCode": "",
  216 + "coverSize": "3840*2160",
  217 + "coverType": 1,
  218 + "coverUrl": "",
  219 + "description": "",
  220 + "districtCode": "",
  221 + "endTime": "",
  222 + "hImageUrl": "https://uatjdcdnphoto.aikan.pdnews.cn/sjbj-20231218/image/display/62bdbbb35dbd45689e00790c81f04c4b.png?x-oss-process=image/resize,w_550/quality,q_90/format,jpg",
  223 + "heatValue": "",
  224 + "innerUrl": "",
  225 + "landscape": 1,
  226 + "lengthTime": 88,
  227 + "linkUrl": "",
  228 + "openLikes": 1,
  229 + "openUrl": "https://uatjdcdnout.aikan.pdnews.cn/sjbj-20231209/vod/content/output/113138d566d146b483c3a3713527d376_opt.mp4",
  230 + "pageId": "",
  231 + "playUrls": [
  232 + {
  233 + "clarity": 1,
  234 + "duration": 88,
  235 + "landscape": 1,
  236 + "resolutionHeight": 720,
  237 + "resolutionWidth": 1280,
  238 + "type": 1,
  239 + "url": "https://uatjdcdnout.aikan.pdnews.cn/sjbj-20231209/vod/content/output/7fe1345d9c7244359106c2e7de3b8f7a_opt.mp4"
  240 + },
  241 + {
  242 + "clarity": 1,
  243 + "duration": 88,
  244 + "landscape": 1,
  245 + "resolutionHeight": 720,
  246 + "resolutionWidth": 1280,
  247 + "type": 1,
  248 + "url": "https://uatjdcdnout.aikan.pdnews.cn/sjbj-20231209/vod/content/output/113138d566d146b483c3a3713527d376_opt.mp4"
  249 + }
  250 + ],
  251 + "programAuth": "4265498",
  252 + "programId": "30001364983",
  253 + "programName": "每日一曲《李香兰》",
  254 + "programSource": 4,
  255 + "programType": 1,
  256 + "provinceCode": "",
  257 + "rankingList": [
  258 +
  259 + ],
  260 + "showTitleEd": "",
  261 + "showTitleIng": "",
  262 + "showTitleNo": "",
  263 + "sortValue": null,
  264 + "startTime": "",
  265 + "subType": "",
  266 + "subtitle": "",
  267 + "title": "每日一曲《李香兰》",
  268 + "vImageUrl": "https://uatjdcdnphoto.aikan.pdnews.cn/sjbj-20231218/image/display/62bdbbb35dbd45689e00790c81f04c4b.png?x-oss-process=image/resize,w_550/quality,q_90/format,jpg"
  269 + },
  270 + {
  271 + "cityCode": "",
  272 + "coverSize": "3840*2160",
  273 + "coverType": 1,
  274 + "coverUrl": "",
  275 + "description": "",
  276 + "districtCode": "",
  277 + "endTime": "",
  278 + "hImageUrl": "https://uatjdcdnphoto.aikan.pdnews.cn/sjbj-20231218/image/display/f79bbaa5a33b4bd88176071c4f797ff6.png?x-oss-process=image/resize,w_550/quality,q_90/format,jpg",
  279 + "heatValue": "",
  280 + "innerUrl": "",
  281 + "landscape": 1,
  282 + "lengthTime": 88,
  283 + "linkUrl": "",
  284 + "openLikes": 1,
  285 + "openUrl": "https://uatjdcdnout.aikan.pdnews.cn/sjbj-20231209/vod/content/output/113138d566d146b483c3a3713527d376_opt.mp4",
  286 + "pageId": "",
  287 + "playUrls": [
  288 + {
  289 + "clarity": 1,
  290 + "duration": 88,
  291 + "landscape": 1,
  292 + "resolutionHeight": 720,
  293 + "resolutionWidth": 1280,
  294 + "type": 1,
  295 + "url": "https://uatjdcdnout.aikan.pdnews.cn/sjbj-20231209/vod/content/output/7fe1345d9c7244359106c2e7de3b8f7a_opt.mp4"
  296 + },
  297 + {
  298 + "clarity": 1,
  299 + "duration": 88,
  300 + "landscape": 1,
  301 + "resolutionHeight": 720,
  302 + "resolutionWidth": 1280,
  303 + "type": 1,
  304 + "url": "https://uatjdcdnout.aikan.pdnews.cn/sjbj-20231209/vod/content/output/113138d566d146b483c3a3713527d376_opt.mp4"
  305 + }
  306 + ],
  307 + "programAuth": "4265498",
  308 + "programId": "30001364983",
  309 + "programName": "如约而至!中越两党总书记实现第三轮互访",
  310 + "programSource": 4,
  311 + "programType": 1,
  312 + "provinceCode": "",
  313 + "rankingList": [
  314 +
  315 + ],
  316 + "showTitleEd": "",
  317 + "showTitleIng": "",
  318 + "showTitleNo": "",
  319 + "sortValue": null,
  320 + "startTime": "",
  321 + "subType": "",
  322 + "subtitle": "",
  323 + "title": "如约而至!中越两党总书记实现第三轮互访",
  324 + "vImageUrl": "https://uatjdcdnphoto.aikan.pdnews.cn/sjbj-20231218/image/display/f79bbaa5a33b4bd88176071c4f797ff6.png?x-oss-process=image/resize,w_550/quality,q_90/format,jpg"
  325 + },
  326 + {
  327 + "cityCode": "",
  328 + "coverSize": "3840*2160",
  329 + "coverType": 1,
  330 + "coverUrl": "",
  331 + "description": "",
  332 + "districtCode": "",
  333 + "endTime": "",
  334 + "hImageUrl": "https://uatjdcdnphoto.aikan.pdnews.cn/sjbj-20231218/image/display/2c1d917009584ce2bb4a35cbb3a860a0.png?x-oss-process=image/resize,w_550/quality,q_90/format,jpg",
  335 + "heatValue": "",
  336 + "innerUrl": "",
  337 + "landscape": 1,
  338 + "lengthTime": 88,
  339 + "linkUrl": "",
  340 + "openLikes": 1,
  341 + "openUrl": "https://uatjdcdnout.aikan.pdnews.cn/sjbj-20231209/vod/content/output/113138d566d146b483c3a3713527d376_opt.mp4",
  342 + "pageId": "",
  343 + "playUrls": [
  344 + {
  345 + "clarity": 1,
  346 + "duration": 88,
  347 + "landscape": 1,
  348 + "resolutionHeight": 720,
  349 + "resolutionWidth": 1280,
  350 + "type": 1,
  351 + "url": "https://uatjdcdnout.aikan.pdnews.cn/sjbj-20231209/vod/content/output/7fe1345d9c7244359106c2e7de3b8f7a_opt.mp4"
  352 + },
  353 + {
  354 + "clarity": 1,
  355 + "duration": 88,
  356 + "landscape": 1,
  357 + "resolutionHeight": 720,
  358 + "resolutionWidth": 1280,
  359 + "type": 1,
  360 + "url": "https://uatjdcdnout.aikan.pdnews.cn/sjbj-20231209/vod/content/output/113138d566d146b483c3a3713527d376_opt.mp4"
  361 + }
  362 + ],
  363 + "programAuth": "4265498",
  364 + "programId": "30001364983",
  365 + "programName": "人间烟火,温暖着所有怀有希望的晚归人。",
  366 + "programSource": 4,
  367 + "programType": 1,
  368 + "provinceCode": "",
  369 + "rankingList": [
  370 +
  371 + ],
  372 + "showTitleEd": "",
  373 + "showTitleIng": "",
  374 + "showTitleNo": "",
  375 + "sortValue": null,
  376 + "startTime": "",
  377 + "subType": "",
  378 + "subtitle": "",
  379 + "title": "人间烟火,温暖着所有怀有希望的晚归人。",
  380 + "vImageUrl": "https://uatjdcdnphoto.aikan.pdnews.cn/sjbj-20231218/image/display/2c1d917009584ce2bb4a35cbb3a860a0.png?x-oss-process=image/resize,w_550/quality,q_90/format,jpg"
  381 + },
  382 + {
  383 + "cityCode": "",
  384 + "coverSize": "3840*2160",
  385 + "coverType": 1,
  386 + "coverUrl": "",
  387 + "description": "",
  388 + "districtCode": "",
  389 + "endTime": "",
  390 + "hImageUrl": "https://uatjdcdnphoto.aikan.pdnews.cn/sjbj-20231222/image/display/117dc516ca5c42d5843c0d32050c9fc6.jpeg?x-oss-process=image/resize,w_240/quality,q_90/format,jpg",
  391 + "heatValue": "",
  392 + "innerUrl": "",
  393 + "landscape": 1,
  394 + "lengthTime": 88,
  395 + "linkUrl": "",
  396 + "openLikes": 1,
  397 + "openUrl": "https://uatjdcdnout.aikan.pdnews.cn/sjbj-20231209/vod/content/output/113138d566d146b483c3a3713527d376_opt.mp4",
  398 + "pageId": "",
  399 + "playUrls": [
  400 + {
  401 + "clarity": 1,
  402 + "duration": 88,
  403 + "landscape": 1,
  404 + "resolutionHeight": 720,
  405 + "resolutionWidth": 1280,
  406 + "type": 1,
  407 + "url": "https://uatjdcdnout.aikan.pdnews.cn/sjbj-20231209/vod/content/output/7fe1345d9c7244359106c2e7de3b8f7a_opt.mp4"
  408 + },
  409 + {
  410 + "clarity": 1,
  411 + "duration": 88,
  412 + "landscape": 1,
  413 + "resolutionHeight": 720,
  414 + "resolutionWidth": 1280,
  415 + "type": 1,
  416 + "url": "https://uatjdcdnout.aikan.pdnews.cn/sjbj-20231209/vod/content/output/113138d566d146b483c3a3713527d376_opt.mp4"
  417 + }
  418 + ],
  419 + "programAuth": "4265498",
  420 + "programId": "30001364983",
  421 + "programName": "时政微观察丨推进乡村全面振兴是“三农”工作总抓手",
  422 + "programSource": 4,
  423 + "programType": 1,
  424 + "provinceCode": "",
  425 + "rankingList": [
  426 +
  427 + ],
  428 + "showTitleEd": "",
  429 + "showTitleIng": "",
  430 + "showTitleNo": "",
  431 + "sortValue": null,
  432 + "startTime": "",
  433 + "subType": "",
  434 + "subtitle": "",
  435 + "title": "时政微观察丨推进乡村全面振兴是“三农”工作总抓手",
  436 + "vImageUrl": "https://uatjdcdnphoto.aikan.pdnews.cn/sjbj-20231222/image/display/117dc516ca5c42d5843c0d32050c9fc6.jpeg?x-oss-process=image/resize,w_240/quality,q_90/format,jpg"
  437 + }
  438 + ],
  439 + "pageId": null,
  440 + "posterSize": "",
  441 + "posterUrl": "",
  442 + "provinceCode": "",
  443 + "sortValue": 4,
  444 + "subType": ""
  445 + },
  446 + {
  447 + "backgroundColor": "",
  448 + "backgroundImgUrl": "",
  449 + "cityCode": "",
  450 + "compStyle": "Single_Column-01",
  451 + "compType": "SINGLE_COLUMN",
  452 + "dataSourceRequest": [
  453 +
  454 + ],
  455 + "districtCode": "",
  456 + "extraData": "",
  457 + "hasAdInfo": 0,
  458 + "id": 6772,
  459 + "imgSize": "",
  460 + "innerUrl": "",
  461 + "linkUrl": "",
  462 + "meddleDataList": [
  463 +
  464 + ],
  465 + "name": "测试",
  466 + "objectId": "",
  467 + "objectTitle": "",
  468 + "objectType": null,
  469 + "operDataList": [
  470 + {
  471 + "cityCode": "620100",
  472 + "coverSize": "",
  473 + "coverType": 1,
  474 + "coverUrl": "",
  475 + "description": "",
  476 + "districtCode": "540102",
  477 + "endTime": "",
  478 + "hImageUrl": "https://uatjdcdnphoto.aikan.pdnews.cn/sjbj-20231228/image/display/90a2db4077d44a1f887f068fc659d977.jpeg?x-oss-process=image/resize,w_550/quality,q_90/format,jpg",
  479 + "heatValue": "",
  480 + "innerUrl": "",
  481 + "landscape": 1,
  482 + "lengthTime": 91,
  483 + "linkUrl": "",
  484 + "openLikes": 1,
  485 + "openUrl": "https://uatjdcdnout.aikan.pdnews.cn/2577/vod/content/20231109/a5108cd087.mp4",
  486 + "pageId": "",
  487 + "playUrls": [
  488 + {
  489 + "clarity": 3,
  490 + "duration": 91,
  491 + "landscape": 1,
  492 + "resolutionHeight": 1080,
  493 + "resolutionWidth": 1920,
  494 + "type": 1,
  495 + "url": "https://uatjdcdnout.aikan.pdnews.cn/2577/vod/content/20231109/a5108cd087.mp4"
  496 + }
  497 + ],
  498 + "programAuth": "4255335",
  499 + "programId": "30001335003",
  500 + "programName": "美方再次宣布对台售武,外交部答澎湃:将对参与企业采取反制措施",
  501 + "programSource": 4,
  502 + "programType": 1,
  503 + "provinceCode": "620000",
  504 + "rankingList": [
  505 +
  506 + ],
  507 + "showTitleEd": "",
  508 + "showTitleIng": "",
  509 + "showTitleNo": "",
  510 + "sortValue": null,
  511 + "startTime": "",
  512 + "subType": "",
  513 + "subtitle": "",
  514 + "title": "美方再次宣布对台售武,外交部答澎湃:将对参与企业采取反制措施",
  515 + "vImageUrl": ""
  516 + },
  517 + {
  518 + "cityCode": "620100",
  519 + "coverSize": "",
  520 + "coverType": 1,
  521 + "coverUrl": "",
  522 + "description": "",
  523 + "districtCode": "540102",
  524 + "endTime": "",
  525 + "hImageUrl": "https://uatjdcdnphoto.aikan.pdnews.cn/sjbj-20240108/image/display/b832ff05a97542c69bcea69fcf5d7204.png?x-oss-process=image/resize,w_550/quality,q_90/format,jpg",
  526 + "heatValue": "",
  527 + "innerUrl": "",
  528 + "landscape": 1,
  529 + "lengthTime": 91,
  530 + "linkUrl": "",
  531 + "openLikes": 1,
  532 + "openUrl": "https://uatjdcdnout.aikan.pdnews.cn/2577/vod/content/20231109/a5108cd087.mp4",
  533 + "pageId": "",
  534 + "playUrls": [
  535 + {
  536 + "clarity": 3,
  537 + "duration": 91,
  538 + "landscape": 1,
  539 + "resolutionHeight": 1080,
  540 + "resolutionWidth": 1920,
  541 + "type": 1,
  542 + "url": "https://uatjdcdnout.aikan.pdnews.cn/2577/vod/content/20231109/a5108cd087.mp4"
  543 + }
  544 + ],
  545 + "programAuth": "4255335",
  546 + "programId": "30001335003",
  547 + "programName": "2023年12月暴雪突袭",
  548 + "programSource": 4,
  549 + "programType": 1,
  550 + "provinceCode": "620000",
  551 + "rankingList": [
  552 +
  553 + ],
  554 + "showTitleEd": "",
  555 + "showTitleIng": "",
  556 + "showTitleNo": "",
  557 + "sortValue": null,
  558 + "startTime": "",
  559 + "subType": "",
  560 + "subtitle": "",
  561 + "title": "2023年12月暴雪突袭",
  562 + "vImageUrl": ""
  563 + },
  564 + {
  565 + "cityCode": "620100",
  566 + "coverSize": "",
  567 + "coverType": 1,
  568 + "coverUrl": "",
  569 + "description": "",
  570 + "districtCode": "540102",
  571 + "endTime": "",
  572 + "hImageUrl": "https://uatjdcdnphoto.aikan.pdnews.cn/sjbj-20231106/image/display/5890a13a259a4dd0b283284dafb38843.png?x-oss-process=image/resize,w_550/quality,q_90/format,jpg",
  573 + "heatValue": "",
  574 + "innerUrl": "",
  575 + "landscape": 1,
  576 + "lengthTime": 91,
  577 + "linkUrl": "",
  578 + "openLikes": 1,
  579 + "openUrl": "https://uatjdcdnout.aikan.pdnews.cn/2577/vod/content/20231109/a5108cd087.mp4",
  580 + "pageId": "",
  581 + "playUrls": [
  582 + {
  583 + "clarity": 3,
  584 + "duration": 91,
  585 + "landscape": 1,
  586 + "resolutionHeight": 1080,
  587 + "resolutionWidth": 1920,
  588 + "type": 1,
  589 + "url": "https://uatjdcdnout.aikan.pdnews.cn/2577/vod/content/20231109/a5108cd087.mp4"
  590 + }
  591 + ],
  592 + "programAuth": "4255335",
  593 + "programId": "30001335003",
  594 + "programName": "山东青州:花卉种植助增收,花卉种植助增收",
  595 + "programSource": 4,
  596 + "programType": 1,
  597 + "provinceCode": "620000",
  598 + "rankingList": [
  599 +
  600 + ],
  601 + "showTitleEd": "",
  602 + "showTitleIng": "",
  603 + "showTitleNo": "",
  604 + "sortValue": null,
  605 + "startTime": "",
  606 + "subType": "",
  607 + "subtitle": "",
  608 + "title": "山东青州:花卉种植助增收,花卉种植助增收",
  609 + "vImageUrl": ""
  610 + },
  611 + {
  612 + "cityCode": "620100",
  613 + "coverSize": "",
  614 + "coverType": 1,
  615 + "coverUrl": "",
  616 + "description": "",
  617 + "districtCode": "540102",
  618 + "endTime": "",
  619 + "hImageUrl": "https://uatjdcdnphoto.aikan.pdnews.cn/f60b/image/content/20231109/cce56a2cc7.jpg?x-oss-process=image/resize,l_850/auto-orient,1/quality,q_95/format,jpg",
  620 + "heatValue": "",
  621 + "innerUrl": "",
  622 + "landscape": 1,
  623 + "lengthTime": 91,
  624 + "linkUrl": "",
  625 + "openLikes": 1,
  626 + "openUrl": "https://uatjdcdnout.aikan.pdnews.cn/2577/vod/content/20231109/a5108cd087.mp4",
  627 + "pageId": "",
  628 + "playUrls": [
  629 + {
  630 + "clarity": 3,
  631 + "duration": 91,
  632 + "landscape": 1,
  633 + "resolutionHeight": 1080,
  634 + "resolutionWidth": 1920,
  635 + "type": 1,
  636 + "url": "https://uatjdcdnout.aikan.pdnews.cn/2577/vod/content/20231109/a5108cd087.mp4"
  637 + }
  638 + ],
  639 + "programAuth": "4255335",
  640 + "programId": "30001335003",
  641 + "programName": "“追梦”女孩足球节兰州站顺利开幕",
  642 + "programSource": 4,
  643 + "programType": 1,
  644 + "provinceCode": "620000",
  645 + "rankingList": [
  646 +
  647 + ],
  648 + "showTitleEd": "",
  649 + "showTitleIng": "",
  650 + "showTitleNo": "",
  651 + "sortValue": null,
  652 + "startTime": "",
  653 + "subType": "",
  654 + "subtitle": "",
  655 + "title": "“追梦”女孩足球节兰州站顺利开幕",
  656 + "vImageUrl": ""
  657 + },
  658 + {
  659 + "cityCode": "110100",
  660 + "coverSize": "1524*857",
  661 + "coverType": 1,
  662 + "coverUrl": "https://uatjdcdnphoto.aikan.pdnews.cn/sjbj-20231113/image/live/16187cd251844430b42a8fc604065652.jpg?x-oss-process=image/resize,l_850/auto-orient,1/quality,q_95/format,jpg",
  663 + "description": "霜降,是秋季的最后一个节气,意味着冬天即将开始。《月令七十二候集解》记载:“九月中,气肃而凝,露结为霜矣。”此时节,树叶经过秋霜洗礼,有的变成深红色,有的变成金黄色,呈现出一幅幅绝美的“大地画卷”。登山赏叶,漫步乡野,徜徉海岸,尽享多彩美景不负秋日好时光",
  664 + "districtCode": "不限",
  665 + "endTime": "",
  666 + "hImageUrl": "https://uatjdcdnphoto.aikan.pdnews.cn/sjbj-20231113/image/live/16187cd251844430b42a8fc604065652.jpg?x-oss-process=image/resize,l_850/auto-orient,1/quality,q_95/format,jpg",
  667 + "heatValue": "",
  668 + "innerUrl": "",
  669 + "landscape": 1,
  670 + "lengthTime": null,
  671 + "linkUrl": "",
  672 + "openLikes": 0,
  673 + "openUrl": "https://uatjdcdnphoto.aikan.pdnews.cn/sjbj-20231113/vod/live/51c30859550d4ebeba50e09e18186b92.mp4",
  674 + "pageId": "",
  675 + "playUrls": [
  676 +
  677 + ],
  678 + "programAuth": "2004545",
  679 + "programId": "20000092968",
  680 + "programName": "",
  681 + "programSource": 5,
  682 + "programType": 2,
  683 + "provinceCode": "110000",
  684 + "rankingList": [
  685 +
  686 + ],
  687 + "showTitleEd": "",
  688 + "showTitleIng": "",
  689 + "showTitleNo": "",
  690 + "sortValue": null,
  691 + "startTime": "2023-11-21 16:59:42",
  692 + "subType": "",
  693 + "subtitle": "",
  694 + "title": "1120回归推流直播1",
  695 + "vImageUrl": "https://uatjdcdnphoto.aikan.pdnews.cn/sjbj-20231113/image/live/4ccdec179fea44bba19a4304ab6af756.jpg?x-oss-process=image/resize,l_850/auto-orient,1/quality,q_95/format,jpg"
  696 + },
  697 + {
  698 + "cityCode": "",
  699 + "coverSize": "869*489",
  700 + "coverType": 1,
  701 + "coverUrl": "https://uatjdcdnphoto.aikan.pdnews.cn/sjbj-20231013/image/live/61c783d70c924f019052f56592a78eb7.jpg?x-oss-process=image/resize,l_850/auto-orient,1/quality,q_95/format,jpg",
  702 + "description": "",
  703 + "districtCode": "",
  704 + "endTime": "",
  705 + "hImageUrl": "https://uatjdcdnphoto.aikan.pdnews.cn/sjbj-20231013/image/live/61c783d70c924f019052f56592a78eb7.jpg?x-oss-process=image/resize,l_850/auto-orient,1/quality,q_95/format,jpg",
  706 + "heatValue": "",
  707 + "innerUrl": "",
  708 + "landscape": 1,
  709 + "lengthTime": null,
  710 + "linkUrl": "",
  711 + "openLikes": 0,
  712 + "openUrl": "https://uatjdcdnphoto.aikan.pdnews.cn/live/record/tr_lud/0ea32bdda95548f0a3d25a94fbad03f5_lud/123003.m3u8",
  713 + "pageId": "",
  714 + "playUrls": [
  715 +
  716 + ],
  717 + "programAuth": "4251160",
  718 + "programId": "20000092995",
  719 + "programName": "",
  720 + "programSource": 5,
  721 + "programType": 2,
  722 + "provinceCode": "",
  723 + "rankingList": [
  724 +
  725 + ],
  726 + "showTitleEd": "",
  727 + "showTitleIng": "",
  728 + "showTitleNo": "",
  729 + "sortValue": null,
  730 + "startTime": "2023-11-21 23:59:59",
  731 + "subType": "",
  732 + "subtitle": "",
  733 + "title": "贵州黔南州翁安县建中镇",
  734 + "vImageUrl": "https://uatjdcdnphoto.aikan.pdnews.cn/sjbj-20231013/image/live/9f91b916c74c4ef6bd0c0b46aaf3fea4.jpg?x-oss-process=image/resize,l_850/auto-orient,1/quality,q_95/format,jpg"
  735 + },
  736 + {
  737 + "cityCode": "110100",
  738 + "coverSize": "",
  739 + "coverType": 1,
  740 + "coverUrl": "https://uatjdcdnphoto.aikan.pdnews.cn/sjbj-20231113/image/live/7bd6c3b52bdb4b68970e97810e2bb2b3.jpg?x-oss-process=image/resize,l_850/auto-orient,1/quality,q_95/format,jpg",
  741 + "description": "霜降,是秋季的最后一个节气,意味着冬天即将开始。《月令七十二候集解》记载:“九月中,气肃而凝,露结为霜矣。”此时节,树叶经过秋霜洗礼,有的变成深红色,有的变成金黄色,呈现出一幅幅绝美的“大地画卷”。登山赏叶,漫步乡野,徜徉海岸,尽享多彩美景不负秋日好时光",
  742 + "districtCode": "不限",
  743 + "endTime": "",
  744 + "hImageUrl": "https://uatjdcdnphoto.aikan.pdnews.cn/sjbj-20231113/image/live/7bd6c3b52bdb4b68970e97810e2bb2b3.jpg?x-oss-process=image/resize,l_850/auto-orient,1/quality,q_95/format,jpg",
  745 + "heatValue": "",
  746 + "innerUrl": "",
  747 + "landscape": 1,
  748 + "lengthTime": null,
  749 + "linkUrl": "",
  750 + "openLikes": 0,
  751 + "openUrl": "https://uatjdcdnphoto.aikan.pdnews.cn/live/record/tr_lud/1d86a015ac5a480ea58b7f63e06a1d1f_lud/122895.m3u8",
  752 + "pageId": "",
  753 + "playUrls": [
  754 +
  755 + ],
  756 + "programAuth": "2004545",
  757 + "programId": "20000092888",
  758 + "programName": "",
  759 + "programSource": 5,
  760 + "programType": 2,
  761 + "provinceCode": "110000",
  762 + "rankingList": [
  763 +
  764 + ],
  765 + "showTitleEd": "",
  766 + "showTitleIng": "",
  767 + "showTitleNo": "",
  768 + "sortValue": null,
  769 + "startTime": "2023-11-14 17:34:17",
  770 + "subType": "",
  771 + "subtitle": "",
  772 + "title": "1113回归露凝为霜 秋色深深",
  773 + "vImageUrl": "https://uatjdcdnphoto.aikan.pdnews.cn/sjbj-20231113/image/live/bb7b4de5986a400a90cf1a8530e6335a.jpg?x-oss-process=image/resize,l_850/auto-orient,1/quality,q_95/format,jpg"
  774 + },
  775 + {
  776 + "cityCode": "",
  777 + "coverSize": "1920*1080",
  778 + "coverType": 1,
  779 + "coverUrl": "",
  780 + "description": "",
  781 + "districtCode": "",
  782 + "endTime": "",
  783 + "hImageUrl": "https://uatjdcdnphoto.aikan.pdnews.cn/c4b3/image/content/20231121/c7899f3074.jpg?x-oss-process=image/resize,l_850/auto-orient,1/quality,q_95/format,jpg",
  784 + "heatValue": "",
  785 + "innerUrl": "",
  786 + "landscape": 1,
  787 + "lengthTime": 65,
  788 + "linkUrl": "",
  789 + "openLikes": 1,
  790 + "openUrl": "https://uatjdcdnout.aikan.pdnews.cn/a940/vod/content/20231121/85056be2e6.mp4",
  791 + "pageId": "",
  792 + "playUrls": [
  793 + {
  794 + "clarity": 3,
  795 + "duration": 65,
  796 + "landscape": 1,
  797 + "resolutionHeight": 1080,
  798 + "resolutionWidth": 1920,
  799 + "type": 1,
  800 + "url": "https://uatjdcdnout.aikan.pdnews.cn/a940/vod/content/20231121/85056be2e6.mp4"
  801 + }
  802 + ],
  803 + "programAuth": "4255737",
  804 + "programId": "30001353022",
  805 + "programName": "吉林省发布“十佳返乡入乡创业就业带头人”及“十大劳务品牌”",
  806 + "programSource": 4,
  807 + "programType": 1,
  808 + "provinceCode": "",
  809 + "rankingList": [
  810 +
  811 + ],
  812 + "showTitleEd": "",
  813 + "showTitleIng": "",
  814 + "showTitleNo": "",
  815 + "sortValue": null,
  816 + "startTime": "",
  817 + "subType": "",
  818 + "subtitle": "",
  819 + "title": "吉林省发布“十佳返乡入乡创业就业带头人”及“十大劳务品牌”",
  820 + "vImageUrl": ""
  821 + }
  822 + ],
  823 + "pageId": null,
  824 + "posterSize": "",
  825 + "posterUrl": "",
  826 + "provinceCode": "",
  827 + "sortValue": 2,
  828 + "subType": ""
  829 + },
  830 + {
  831 + "backgroundColor": "",
  832 + "backgroundImgUrl": "",
  833 + "cityCode": "",
  834 + "compStyle": "Single_Column-02",
  835 + "compType": "SINGLE_COLUMN",
  836 + "dataSourceRequest": [
  837 +
  838 + ],
  839 + "districtCode": "",
  840 + "extraData": "",
  841 + "hasAdInfo": 0,
  842 + "id": 12,
  843 + "imgSize": "",
  844 + "innerUrl": "",
  845 + "linkUrl": "",
  846 + "meddleDataList": [
  847 +
  848 + ],
  849 + "name": "为你推荐feed",
  850 + "objectId": "",
  851 + "objectTitle": "",
  852 + "objectType": null,
  853 + "operDataList": [
  854 + {
  855 + "cityCode": "",
  856 + "coverSize": "1920*1080",
  857 + "coverType": 1,
  858 + "coverUrl": "https://uatjdcdnphoto.aikan.pdnews.cn/sjbj-20231221/image/display/552162a3774f4ecf9a809142959e318c.png?x-oss-process=image/resize,w_240/quality,q_90/format,jpg",
  859 + "description": "陕西被叫做“地质明珠”的小众景区,不仅风景优美,而且全年免费",
  860 + "districtCode": "",
  861 + "endTime": "",
  862 + "hImageUrl": "https://uatjdcdnphoto.aikan.pdnews.cn/sjbj-20231221/image/display/552162a3774f4ecf9a809142959e318c.png?x-oss-process=image/resize,w_240/quality,q_90/format,jpg",
  863 + "heatValue": "",
  864 + "innerUrl": "",
  865 + "landscape": 1,
  866 + "lengthTime": null,
  867 + "linkUrl": "",
  868 + "openLikes": 0,
  869 + "openUrl": "https://cdnjdphoto.aikan.pdnews.cn/live/record/tr_lud/e77d054073f543ffbc8f296d4975189f_lud/5362.m3u8",
  870 + "pageId": "",
  871 + "playUrls": [
  872 +
  873 + ],
  874 + "programAuth": "2004557",
  875 + "programId": "20000003739",
  876 + "programName": "",
  877 + "programSource": 5,
  878 + "programType": 2,
  879 + "provinceCode": "",
  880 + "rankingList": [
  881 +
  882 + ],
  883 + "showTitleEd": "",
  884 + "showTitleIng": "",
  885 + "showTitleNo": "",
  886 + "sortValue": null,
  887 + "startTime": "2023-12-19 12:00:00",
  888 + "subType": "",
  889 + "subtitle": "",
  890 + "title": "陕西被叫做“地质明珠”的小众景区,不仅风景优美,而且全年免费",
  891 + "vImageUrl": "https://uatjdcdnphoto.aikan.pdnews.cn/sjbj-20231221/image/display/552162a3774f4ecf9a809142959e318c.png?x-oss-process=image/resize,w_240/quality,q_90/format,jpg"
  892 + },
  893 + {
  894 + "cityCode": "",
  895 + "coverSize": "2271*1278",
  896 + "coverType": 1,
  897 + "coverUrl": "https://cdnjdphoto.aikan.pdnews.cn/sjbj-20231215/image/live/f9b81f10f9d0430194f690a845c6912c.png?x-oss-process=image/resize,l_850/auto-orient,1/quality,q_95/format,jpg",
  898 + "description": "“弦韵乌审,暖才于心”,通过马头琴管弦乐、原生态组合曲、传统民歌合唱、马头琴独奏等多种艺术表现形式,充分展现马头琴音乐的悠扬之美、力量之美,为高校师生带来一场别开生面的音乐盛宴。",
  899 + "districtCode": "",
  900 + "endTime": "",
  901 + "hImageUrl": "https://cdnjdphoto.aikan.pdnews.cn/sjbj-20231215/image/live/f9b81f10f9d0430194f690a845c6912c.png?x-oss-process=image/resize,l_850/auto-orient,1/quality,q_95/format,jpg",
  902 + "heatValue": "",
  903 + "innerUrl": "",
  904 + "landscape": 1,
  905 + "lengthTime": null,
  906 + "linkUrl": "",
  907 + "openLikes": 0,
  908 + "openUrl": "",
  909 + "pageId": "",
  910 + "playUrls": [
  911 +
  912 + ],
  913 + "programAuth": "2004557",
  914 + "programId": "20000003702",
  915 + "programName": "",
  916 + "programSource": 5,
  917 + "programType": 2,
  918 + "provinceCode": "",
  919 + "rankingList": [
  920 +
  921 + ],
  922 + "showTitleEd": "",
  923 + "showTitleIng": "",
  924 + "showTitleNo": "",
  925 + "sortValue": null,
  926 + "startTime": "",
  927 + "subType": "",
  928 + "subtitle": "",
  929 + "title": "“弦韵乌审,暖才于心”中国•乌审马头琴交响乐团走进高校",
  930 + "vImageUrl": "https://cdnjdphoto.aikan.pdnews.cn/sjbj-20231215/image/live/d0326a10b7504a34964aff0962d5ad7d.png?x-oss-process=image/resize,l_850/auto-orient,1/quality,q_95/format,jpg"
  931 + },
  932 + {
  933 + "cityCode": "",
  934 + "coverSize": "600*338",
  935 + "coverType": 1,
  936 + "coverUrl": "https://cdnjdphoto.aikan.pdnews.cn/sjbj-20231218/image/live/4f67db4b26f34ac5853cb2f25b55d1d4.jpg?x-oss-process=image/resize,l_850/auto-orient,1/quality,q_95/format,jpg",
  937 + "description": "国务院新闻办公室于2023年12月18日(星期一)下午3时举行国务院政策例行吹风会,请商务部副部长盛秋平和海关总署、市场监管总局、金融监管总局有关负责人介绍加快内外贸一体化发展有关情况,并答记者问。",
  938 + "districtCode": "",
  939 + "endTime": "",
  940 + "hImageUrl": "https://cdnjdphoto.aikan.pdnews.cn/sjbj-20231218/image/live/4f67db4b26f34ac5853cb2f25b55d1d4.jpg?x-oss-process=image/resize,l_850/auto-orient,1/quality,q_95/format,jpg",
  941 + "heatValue": "",
  942 + "innerUrl": "",
  943 + "landscape": 1,
  944 + "lengthTime": null,
  945 + "linkUrl": "",
  946 + "openLikes": 0,
  947 + "openUrl": "",
  948 + "pageId": "",
  949 + "playUrls": [
  950 +
  951 + ],
  952 + "programAuth": "2004557",
  953 + "programId": "20000003737",
  954 + "programName": "",
  955 + "programSource": 5,
  956 + "programType": 2,
  957 + "provinceCode": "",
  958 + "rankingList": [
  959 +
  960 + ],
  961 + "showTitleEd": "",
  962 + "showTitleIng": "",
  963 + "showTitleNo": "",
  964 + "sortValue": null,
  965 + "startTime": "2023-12-18 15:09:00",
  966 + "subType": "",
  967 + "subtitle": "",
  968 + "title": "国新办发布会|介绍加快内外贸一体化发展有关情况",
  969 + "vImageUrl": "https://cdnjdphoto.aikan.pdnews.cn/sjbj-20231218/image/live/3160f19a3247405ea7151604fd87f0e7.jpg?x-oss-process=image/resize,l_850/auto-orient,1/quality,q_95/format,jpg"
  970 + },
  971 + {
  972 + "cityCode": "",
  973 + "coverSize": "1600*900",
  974 + "coverType": 1,
  975 + "coverUrl": "https://cdnjdphoto.aikan.pdnews.cn/sjbj-20231215/image/live/038c195d6dd84a47bb7962bd2e897c87.jpeg?x-oss-process=image/resize,l_850/auto-orient,1/quality,q_95/format,jpg",
  976 + "description": "云上看呆萌“滚滚”的日常,一起来看国宝大熊猫的精彩生活、搞笑瞬间和治愈时刻。",
  977 + "districtCode": "",
  978 + "endTime": "",
  979 + "hImageUrl": "https://cdnjdphoto.aikan.pdnews.cn/sjbj-20231215/image/live/038c195d6dd84a47bb7962bd2e897c87.jpeg?x-oss-process=image/resize,l_850/auto-orient,1/quality,q_95/format,jpg",
  980 + "heatValue": "",
  981 + "innerUrl": "",
  982 + "landscape": 1,
  983 + "lengthTime": null,
  984 + "linkUrl": "",
  985 + "openLikes": 0,
  986 + "openUrl": "",
  987 + "pageId": "",
  988 + "playUrls": [
  989 +
  990 + ],
  991 + "programAuth": "2004557",
  992 + "programId": "20000003715",
  993 + "programName": "",
  994 + "programSource": 5,
  995 + "programType": 2,
  996 + "provinceCode": "",
  997 + "rankingList": [
  998 +
  999 + ],
  1000 + "showTitleEd": "",
  1001 + "showTitleIng": "",
  1002 + "showTitleNo": "",
  1003 + "sortValue": null,
  1004 + "startTime": "2023-12-18 10:38:00",
  1005 + "subType": "",
  1006 + "subtitle": "",
  1007 + "title": "云逛奇妙动物园:国宝大熊猫的欢乐日常",
  1008 + "vImageUrl": "https://cdnjdphoto.aikan.pdnews.cn/sjbj-20231215/image/live/b60fbd785822476daca4af0c8da4ce9a.jpeg?x-oss-process=image/resize,l_850/auto-orient,1/quality,q_95/format,jpg"
  1009 + },
  1010 + {
  1011 + "cityCode": "",
  1012 + "coverSize": "942*530",
  1013 + "coverType": 1,
  1014 + "coverUrl": "https://cdnjdphoto.aikan.pdnews.cn/sjbj-20231216/image/live/047cc7d270114b8da8ad1b98522741a7.png?x-oss-process=image/resize,l_850/auto-orient,1/quality,q_95/format,jpg",
  1015 + "description": "“老伴你帮我看看血压器是不是坏掉了,怎么两只手测量不一样呀?”高血压是一种常见的心血管疾病,如果血压没有得到有效控制,会增加心脑血管疾病的风险。正确测量血压对于掌握健康状况至关重要。本次直播,复旦大学附属华山医院护理部护师须倩雯将详细介绍正确的测量血压的步骤、测量前的准备工作,以及常见的测量误区。",
  1016 + "districtCode": "",
  1017 + "endTime": "",
  1018 + "hImageUrl": "https://cdnjdphoto.aikan.pdnews.cn/sjbj-20231216/image/live/047cc7d270114b8da8ad1b98522741a7.png?x-oss-process=image/resize,l_850/auto-orient,1/quality,q_95/format,jpg",
  1019 + "heatValue": "",
  1020 + "innerUrl": "",
  1021 + "landscape": 1,
  1022 + "lengthTime": null,
  1023 + "linkUrl": "",
  1024 + "openLikes": 0,
  1025 + "openUrl": "https://cdnjdphoto.aikan.pdnews.cn/live/record/tr_lud/634c575b859d49f7bcf65bb318c84e86_lud/5346.m3u8",
  1026 + "pageId": "",
  1027 + "playUrls": [
  1028 +
  1029 + ],
  1030 + "programAuth": "2004557",
  1031 + "programId": "20000003723",
  1032 + "programName": "",
  1033 + "programSource": 5,
  1034 + "programType": 2,
  1035 + "provinceCode": "",
  1036 + "rankingList": [
  1037 +
  1038 + ],
  1039 + "showTitleEd": "",
  1040 + "showTitleIng": "",
  1041 + "showTitleNo": "",
  1042 + "sortValue": null,
  1043 + "startTime": "2023-12-18 12:00:38",
  1044 + "subType": "",
  1045 + "subtitle": "",
  1046 + "title": "医点就通 | 如何正确测量血压,你做对了吗?",
  1047 + "vImageUrl": "https://cdnjdphoto.aikan.pdnews.cn/sjbj-20231216/image/live/ce56e30873a64eb78659959519238d0a.png?x-oss-process=image/resize,l_850/auto-orient,1/quality,q_95/format,jpg"
  1048 + },
  1049 + {
  1050 + "cityCode": "",
  1051 + "coverSize": "1920*1080",
  1052 + "coverType": 1,
  1053 + "coverUrl": "https://cdnjdphoto.aikan.pdnews.cn/sjbj-20231217/image/live/6f884c0982114592808ee3d7c25fb4d1.png?x-oss-process=image/resize,l_850/auto-orient,1/quality,q_95/format,jpg",
  1054 + "description": "乡村篮球菁英友谊赛将于12月17-18日在海南琼海举办。届时,村BA总决赛MVP李衍均、得分王吴中庆、栏板王、助攻王马鹏,沙溪跑车刘炜祺、山东飞人申守法,宁夏三营杨家三兄弟等村BA顶流将悉数登场;村BA功勋教练赵仁斌、姬晓现场指导;更有中国篮球名宿、96黄金一代球员巩晓彬,北京篮球名宿“玉面少侠”焦健,现身赛场,为乡村篮球代言。三分大战、技巧大战、扣篮大战也将精彩上演。",
  1055 + "districtCode": "",
  1056 + "endTime": "",
  1057 + "hImageUrl": "https://cdnjdphoto.aikan.pdnews.cn/sjbj-20231217/image/live/6f884c0982114592808ee3d7c25fb4d1.png?x-oss-process=image/resize,l_850/auto-orient,1/quality,q_95/format,jpg",
  1058 + "heatValue": "",
  1059 + "innerUrl": "",
  1060 + "landscape": 1,
  1061 + "lengthTime": null,
  1062 + "linkUrl": "",
  1063 + "openLikes": 0,
  1064 + "openUrl": "",
  1065 + "pageId": "",
  1066 + "playUrls": [
  1067 +
  1068 + ],
  1069 + "programAuth": "2004557",
  1070 + "programId": "20000003734",
  1071 + "programName": "",
  1072 + "programSource": 5,
  1073 + "programType": 2,
  1074 + "provinceCode": "",
  1075 + "rankingList": [
  1076 +
  1077 + ],
  1078 + "showTitleEd": "",
  1079 + "showTitleIng": "",
  1080 + "showTitleNo": "",
  1081 + "sortValue": null,
  1082 + "startTime": "2023-12-17 19:07:00",
  1083 + "subType": "",
  1084 + "subtitle": "",
  1085 + "title": "上视界 看村赛|星耀村BA 激情菁英赛",
  1086 + "vImageUrl": "https://cdnjdphoto.aikan.pdnews.cn/sjbj-20231217/image/live/405bb1303e2640d3931780122da0c9e3.png?x-oss-process=image/resize,l_850/auto-orient,1/quality,q_95/format,jpg"
  1087 + },
  1088 + {
  1089 + "cityCode": "",
  1090 + "coverSize": "1280*720",
  1091 + "coverType": 1,
  1092 + "coverUrl": "https://cdnjdphoto.aikan.pdnews.cn/sjbj-20231214/image/live/0a1f327943984c02abfd335dbca80d03.png?x-oss-process=image/resize,l_850/auto-orient,1/quality,q_95/format,jpg",
  1093 + "description": "为深入贯彻党的二十大精神,落实《全面加强和改进新时代学生心理健康工作专项行动计划(2023-2025)和江苏省教育厅“润心”行动工作要求,健全社会心理服务体系体制机制的建设,提升社会公众心理健康意识和素养,充分发挥以乐润心,以心育德的重要功能。南京审计大学心理健康教育教学部与浦口区社会心理健康服务指导中心联合举办“以乐润心 因爱同行”音乐会。",
  1094 + "districtCode": "",
  1095 + "endTime": "",
  1096 + "hImageUrl": "https://cdnjdphoto.aikan.pdnews.cn/sjbj-20231214/image/live/0a1f327943984c02abfd335dbca80d03.png?x-oss-process=image/resize,l_850/auto-orient,1/quality,q_95/format,jpg",
  1097 + "heatValue": "",
  1098 + "innerUrl": "",
  1099 + "landscape": 1,
  1100 + "lengthTime": null,
  1101 + "linkUrl": "",
  1102 + "openLikes": 0,
  1103 + "openUrl": "",
  1104 + "pageId": "",
  1105 + "playUrls": [
  1106 +
  1107 + ],
  1108 + "programAuth": "2004557",
  1109 + "programId": "20000003662",
  1110 + "programName": "",
  1111 + "programSource": 5,
  1112 + "programType": 2,
  1113 + "provinceCode": "",
  1114 + "rankingList": [
  1115 +
  1116 + ],
  1117 + "showTitleEd": "",
  1118 + "showTitleIng": "",
  1119 + "showTitleNo": "",
  1120 + "sortValue": null,
  1121 + "startTime": "2023-12-17 19:03:18",
  1122 + "subType": "",
  1123 + "subtitle": "",
  1124 + "title": "《以乐润心 音爱同行 ——新年音乐会》",
  1125 + "vImageUrl": "https://cdnjdphoto.aikan.pdnews.cn/sjbj-20231214/image/live/66d2363592d5462b89972f558a97debe.png?x-oss-process=image/resize,l_850/auto-orient,1/quality,q_95/format,jpg"
  1126 + },
  1127 + {
  1128 + "cityCode": "",
  1129 + "coverSize": "942*530",
  1130 + "coverType": 1,
  1131 + "coverUrl": "https://cdnjdphoto.aikan.pdnews.cn/sjbj-20231217/image/live/f59c2e841a9042819c052f142d2e6fa6.jpeg?x-oss-process=image/resize,l_850/auto-orient,1/quality,q_95/format,jpg",
  1132 + "description": "“音为梦响 乐动华章”哈工大第二十五届校园十大歌手大赛决赛,27首歌曲唱响冬日的哈工大,邀你共同见证本届十大歌手的荣耀时刻。",
  1133 + "districtCode": "",
  1134 + "endTime": "",
  1135 + "hImageUrl": "https://cdnjdphoto.aikan.pdnews.cn/sjbj-20231217/image/live/f59c2e841a9042819c052f142d2e6fa6.jpeg?x-oss-process=image/resize,l_850/auto-orient,1/quality,q_95/format,jpg",
  1136 + "heatValue": "",
  1137 + "innerUrl": "",
  1138 + "landscape": 1,
  1139 + "lengthTime": null,
  1140 + "linkUrl": "",
  1141 + "openLikes": 0,
  1142 + "openUrl": "",
  1143 + "pageId": "",
  1144 + "playUrls": [
  1145 +
  1146 + ],
  1147 + "programAuth": "2004557",
  1148 + "programId": "20000003730",
  1149 + "programName": "",
  1150 + "programSource": 5,
  1151 + "programType": 2,
  1152 + "provinceCode": "",
  1153 + "rankingList": [
  1154 +
  1155 + ],
  1156 + "showTitleEd": "",
  1157 + "showTitleIng": "",
  1158 + "showTitleNo": "",
  1159 + "sortValue": null,
  1160 + "startTime": "2023-12-17 18:56:00",
  1161 + "subType": "",
  1162 + "subtitle": "",
  1163 + "title": "“音为梦响 乐动华章”哈工大第二十五届校园十大歌手大赛决赛",
  1164 + "vImageUrl": "https://cdnjdphoto.aikan.pdnews.cn/sjbj-20231217/image/live/2cae8628c9e64aa8850b48c28f7aeb73.jpeg?x-oss-process=image/resize,l_850/auto-orient,1/quality,q_95/format,jpg"
  1165 + },
  1166 + {
  1167 + "cityCode": "",
  1168 + "coverSize": "1920*1080",
  1169 + "coverType": 1,
  1170 + "coverUrl": "https://cdnjdphoto.aikan.pdnews.cn/sjbj-20231215/image/live/4d307ca9d99e41cfb617404d669ef9be.png?x-oss-process=image/resize,l_850/auto-orient,1/quality,q_95/format,jpg",
  1171 + "description": "纺织在我国有着几千年的历史,作为传统产业具有重要地位。经过多年积累,我国逐步从纺织业大国成长为全球纺织业强国。从一根纤维到最后的成衣,国内已经形成了全球最完备的纺织产业链。纺织行业是国民经济与社会发展的支柱产业,是解决民生与美化生活的基础产业,是国际合作与融合发展的优势产业,正朝着“科技、时尚、绿色”方向不断发展。",
  1172 + "districtCode": "",
  1173 + "endTime": "",
  1174 + "hImageUrl": "https://cdnjdphoto.aikan.pdnews.cn/sjbj-20231215/image/live/4d307ca9d99e41cfb617404d669ef9be.png?x-oss-process=image/resize,l_850/auto-orient,1/quality,q_95/format,jpg",
  1175 + "heatValue": "",
  1176 + "innerUrl": "",
  1177 + "landscape": 1,
  1178 + "lengthTime": null,
  1179 + "linkUrl": "",
  1180 + "openLikes": 0,
  1181 + "openUrl": "https://cdnjdphoto.aikan.pdnews.cn/live/record/tr_lud/f9ec8eda59174f4b8dc4d074ca8fd43d_lud/5327.m3u8",
  1182 + "pageId": "",
  1183 + "playUrls": [
  1184 +
  1185 + ],
  1186 + "programAuth": "2004557",
  1187 + "programId": "20000003710",
  1188 + "programName": "",
  1189 + "programSource": 5,
  1190 + "programType": 2,
  1191 + "provinceCode": "",
  1192 + "rankingList": [
  1193 +
  1194 + ],
  1195 + "showTitleEd": "",
  1196 + "showTitleIng": "",
  1197 + "showTitleNo": "",
  1198 + "sortValue": null,
  1199 + "startTime": "2023-12-17 19:00:00",
  1200 + "subType": "",
  1201 + "subtitle": "",
  1202 + "title": "我的青春主场|教育部公益直播课:纺织行业发展趋势和职业机会",
  1203 + "vImageUrl": "https://cdnjdphoto.aikan.pdnews.cn/sjbj-20231215/image/live/69f282dc5c524c60958728cea05c25cd.png?x-oss-process=image/resize,l_850/auto-orient,1/quality,q_95/format,jpg"
  1204 + },
  1205 + {
  1206 + "cityCode": "",
  1207 + "coverSize": "942*530",
  1208 + "coverType": 1,
  1209 + "coverUrl": "https://cdnjdphoto.aikan.pdnews.cn/sjbj-20231216/image/live/3d6ce5810ded4e319e04ad92e0bb20bd.jpg?x-oss-process=image/resize,l_850/auto-orient,1/quality,q_95/format,jpg",
  1210 + "description": "近期一股强寒潮将从新疆开始自西向东、自北向南影响我国。深圳气温将出现断崖式下降,周末“小冰人”登场,急冻模式开启,17日最低气温降至10℃左右。深圳广电集团第一现场将与新疆、西藏、广西派驻记者连线,展示南北气温差异;同时,记者将登上深圳梧桐山测量山顶最低气温;气象局、医院、供电部门也作出相关提醒及防寒准备措施。",
  1211 + "districtCode": "",
  1212 + "endTime": "",
  1213 + "hImageUrl": "https://cdnjdphoto.aikan.pdnews.cn/sjbj-20231216/image/live/3d6ce5810ded4e319e04ad92e0bb20bd.jpg?x-oss-process=image/resize,l_850/auto-orient,1/quality,q_95/format,jpg",
  1214 + "heatValue": "",
  1215 + "innerUrl": "",
  1216 + "landscape": 1,
  1217 + "lengthTime": null,
  1218 + "linkUrl": "",
  1219 + "openLikes": 0,
  1220 + "openUrl": "",
  1221 + "pageId": "",
  1222 + "playUrls": [
  1223 +
  1224 + ],
  1225 + "programAuth": "2004557",
  1226 + "programId": "20000003726",
  1227 + "programName": "",
  1228 + "programSource": 5,
  1229 + "programType": 2,
  1230 + "provinceCode": "",
  1231 + "rankingList": [
  1232 +
  1233 + ],
  1234 + "showTitleEd": "",
  1235 + "showTitleIng": "",
  1236 + "showTitleNo": "",
  1237 + "sortValue": null,
  1238 + "startTime": "2023-12-17 08:06:38",
  1239 + "subType": "",
  1240 + "subtitle": "",
  1241 + "title": "今年最强寒潮来袭 深圳或开启急冻模式",
  1242 + "vImageUrl": "https://cdnjdphoto.aikan.pdnews.cn/sjbj-20231216/image/live/50b224ea12ec4c6f93563959ed4405dd.png?x-oss-process=image/resize,l_850/auto-orient,1/quality,q_95/format,jpg"
  1243 + }
  1244 + ],
  1245 + "pageId": null,
  1246 + "posterSize": "",
  1247 + "posterUrl": "",
  1248 + "provinceCode": "",
  1249 + "sortValue": 6,
  1250 + "subType": ""
  1251 + },
  1252 + {
  1253 + "backgroundColor": "",
  1254 + "backgroundImgUrl": "",
  1255 + "cityCode": "",
  1256 + "compStyle": "Masonry_Layout-01",
  1257 + "compType": "MASONRY_LAYOUT",
  1258 + "dataSourceRequest": [
  1259 +
  1260 + ],
  1261 + "districtCode": "",
  1262 + "extraData": "",
  1263 + "hasAdInfo": 0,
  1264 + "id": 12,
  1265 + "imgSize": "",
  1266 + "innerUrl": "",
  1267 + "linkUrl": "",
  1268 + "meddleDataList": [
  1269 +
  1270 + ],
  1271 + "name": "为你推荐feed",
  1272 + "objectId": "",
  1273 + "objectTitle": "",
  1274 + "objectType": null,
  1275 + "operDataList": [
  1276 + {
  1277 + "cityCode": "",
  1278 + "coverSize": "1920*1080",
  1279 + "coverType": 1,
  1280 + "coverUrl": "https://cdnjdphoto.aikan.pdnews.cn/sjbj-20231218/image/live/20f07cb26ccc41ed8c5ca9ffd88ff5e3.png?x-oss-process=image/resize,l_850/auto-orient,1/quality,q_95/format,jpg",
  1281 + "description": "随着生活水平的提高和女性乳腺疾病宣传的深入,很多女性朋友不再是“发现疾病后才去就医”,而是越来越重视乳腺的定期检查,而钼靶检查也因为其简便快速等优点被多数人选择。本次直播,复旦大学附属华山医院放射科技师王益芳将针对患者常问的相关问题进行解答。",
  1282 + "districtCode": "",
  1283 + "endTime": "",
  1284 + "hImageUrl": "https://cdnjdphoto.aikan.pdnews.cn/sjbj-20231218/image/live/20f07cb26ccc41ed8c5ca9ffd88ff5e3.png?x-oss-process=image/resize,l_850/auto-orient,1/quality,q_95/format,jpg",
  1285 + "heatValue": "",
  1286 + "innerUrl": "",
  1287 + "landscape": 1,
  1288 + "lengthTime": null,
  1289 + "linkUrl": "",
  1290 + "openLikes": 0,
  1291 + "openUrl": "https://cdnjdphoto.aikan.pdnews.cn/live/record/tr_lud/e77d054073f543ffbc8f296d4975189f_lud/5362.m3u8",
  1292 + "pageId": "",
  1293 + "playUrls": [
  1294 +
  1295 + ],
  1296 + "programAuth": "2004557",
  1297 + "programId": "20000003739",
  1298 + "programName": "",
  1299 + "programSource": 5,
  1300 + "programType": 2,
  1301 + "provinceCode": "",
  1302 + "rankingList": [
  1303 +
  1304 + ],
  1305 + "showTitleEd": "",
  1306 + "showTitleIng": "",
  1307 + "showTitleNo": "",
  1308 + "sortValue": null,
  1309 + "startTime": "2023-12-19 12:00:00",
  1310 + "subType": "",
  1311 + "subtitle": "",
  1312 + "title": "医点就通 | 关爱女性健康,聊聊乳腺钼靶检查",
  1313 + "vImageUrl": "https://cdnjdphoto.aikan.pdnews.cn/sjbj-20231218/image/live/a51c97be4472435f919b9d347a69442d.png?x-oss-process=image/resize,l_850/auto-orient,1/quality,q_95/format,jpg",
  1314 + "screenType":"1"
  1315 + },
  1316 + {
  1317 + "cityCode": "",
  1318 + "coverSize": "600*338",
  1319 + "coverType": 1,
  1320 + "coverUrl": "https://cdnjdphoto.aikan.pdnews.cn/sjbj-20231218/image/live/4f67db4b26f34ac5853cb2f25b55d1d4.jpg?x-oss-process=image/resize,l_850/auto-orient,1/quality,q_95/format,jpg",
  1321 + "description": "国务院新闻办公室于2023年12月18日(星期一)下午3时举行国务院政策例行吹风会,请商务部副部长盛秋平和海关总署、市场监管总局、金融监管总局有关负责人介绍加快内外贸一体化发展有关情况,并答记者问。",
  1322 + "districtCode": "",
  1323 + "endTime": "",
  1324 + "hImageUrl": "https://cdnjdphoto.aikan.pdnews.cn/sjbj-20231218/image/live/4f67db4b26f34ac5853cb2f25b55d1d4.jpg?x-oss-process=image/resize,l_850/auto-orient,1/quality,q_95/format,jpg",
  1325 + "heatValue": "",
  1326 + "innerUrl": "",
  1327 + "landscape": 1,
  1328 + "lengthTime": null,
  1329 + "linkUrl": "",
  1330 + "openLikes": 0,
  1331 + "openUrl": "",
  1332 + "pageId": "",
  1333 + "playUrls": [
  1334 +
  1335 + ],
  1336 + "programAuth": "2004557",
  1337 + "programId": "20000003737",
  1338 + "programName": "",
  1339 + "programSource": 5,
  1340 + "programType": 2,
  1341 + "provinceCode": "",
  1342 + "rankingList": [
  1343 +
  1344 + ],
  1345 + "showTitleEd": "",
  1346 + "showTitleIng": "",
  1347 + "showTitleNo": "",
  1348 + "sortValue": null,
  1349 + "startTime": "2023-12-18 15:09:00",
  1350 + "subType": "",
  1351 + "subtitle": "",
  1352 + "title": "国新办发布会|介绍加快内外贸一体化发展有关情况",
  1353 + "vImageUrl": "https://cdnjdphoto.aikan.pdnews.cn/sjbj-20231218/image/live/3160f19a3247405ea7151604fd87f0e7.jpg?x-oss-process=image/resize,l_850/auto-orient,1/quality,q_95/format,jpg",
  1354 + "screenType":"2"
  1355 + },
  1356 + {
  1357 + "cityCode": "",
  1358 + "coverSize": "942*530",
  1359 + "coverType": 1,
  1360 + "coverUrl": "https://cdnjdphoto.aikan.pdnews.cn/sjbj-20231216/image/live/047cc7d270114b8da8ad1b98522741a7.png?x-oss-process=image/resize,l_850/auto-orient,1/quality,q_95/format,jpg",
  1361 + "description": "“老伴你帮我看看血压器是不是坏掉了,怎么两只手测量不一样呀?”高血压是一种常见的心血管疾病,如果血压没有得到有效控制,会增加心脑血管疾病的风险。正确测量血压对于掌握健康状况至关重要。本次直播,复旦大学附属华山医院护理部护师须倩雯将详细介绍正确的测量血压的步骤、测量前的准备工作,以及常见的测量误区。",
  1362 + "districtCode": "",
  1363 + "endTime": "",
  1364 + "hImageUrl": "https://cdnjdphoto.aikan.pdnews.cn/sjbj-20231216/image/live/047cc7d270114b8da8ad1b98522741a7.png?x-oss-process=image/resize,l_850/auto-orient,1/quality,q_95/format,jpg",
  1365 + "heatValue": "",
  1366 + "innerUrl": "",
  1367 + "landscape": 1,
  1368 + "lengthTime": null,
  1369 + "linkUrl": "",
  1370 + "openLikes": 0,
  1371 + "openUrl": "https://cdnjdphoto.aikan.pdnews.cn/live/record/tr_lud/634c575b859d49f7bcf65bb318c84e86_lud/5346.m3u8",
  1372 + "pageId": "",
  1373 + "playUrls": [
  1374 +
  1375 + ],
  1376 + "programAuth": "2004557",
  1377 + "programId": "20000003723",
  1378 + "programName": "",
  1379 + "programSource": 5,
  1380 + "programType": 2,
  1381 + "provinceCode": "",
  1382 + "rankingList": [
  1383 +
  1384 + ],
  1385 + "showTitleEd": "",
  1386 + "showTitleIng": "",
  1387 + "showTitleNo": "",
  1388 + "sortValue": null,
  1389 + "startTime": "2023-12-18 12:00:38",
  1390 + "subType": "",
  1391 + "subtitle": "",
  1392 + "title": "医点就通 | 如何正确测量血压,你做对了吗?",
  1393 + "vImageUrl": "https://cdnjdphoto.aikan.pdnews.cn/sjbj-20231216/image/live/ce56e30873a64eb78659959519238d0a.png?x-oss-process=image/resize,l_850/auto-orient,1/quality,q_95/format,jpg",
  1394 + "screenType":"1"
  1395 + },
  1396 + {
  1397 + "cityCode": "",
  1398 + "coverSize": "1280*720",
  1399 + "coverType": 1,
  1400 + "coverUrl": "https://cdnjdphoto.aikan.pdnews.cn/sjbj-20231214/image/live/0a1f327943984c02abfd335dbca80d03.png?x-oss-process=image/resize,l_850/auto-orient,1/quality,q_95/format,jpg",
  1401 + "description": "为深入贯彻党的二十大精神,落实《全面加强和改进新时代学生心理健康工作专项行动计划(2023-2025)和江苏省教育厅“润心”行动工作要求,健全社会心理服务体系体制机制的建设,提升社会公众心理健康意识和素养,充分发挥以乐润心,以心育德的重要功能。南京审计大学心理健康教育教学部与浦口区社会心理健康服务指导中心联合举办“以乐润心 因爱同行”音乐会。",
  1402 + "districtCode": "",
  1403 + "endTime": "",
  1404 + "hImageUrl": "https://cdnjdphoto.aikan.pdnews.cn/sjbj-20231214/image/live/0a1f327943984c02abfd335dbca80d03.png?x-oss-process=image/resize,l_850/auto-orient,1/quality,q_95/format,jpg",
  1405 + "heatValue": "",
  1406 + "innerUrl": "",
  1407 + "landscape": 1,
  1408 + "lengthTime": null,
  1409 + "linkUrl": "",
  1410 + "openLikes": 0,
  1411 + "openUrl": "",
  1412 + "pageId": "",
  1413 + "playUrls": [
  1414 +
  1415 + ],
  1416 + "programAuth": "2004557",
  1417 + "programId": "20000003662",
  1418 + "programName": "",
  1419 + "programSource": 5,
  1420 + "programType": 2,
  1421 + "provinceCode": "",
  1422 + "rankingList": [
  1423 +
  1424 + ],
  1425 + "showTitleEd": "",
  1426 + "showTitleIng": "",
  1427 + "showTitleNo": "",
  1428 + "sortValue": null,
  1429 + "startTime": "2023-12-17 19:03:18",
  1430 + "subType": "",
  1431 + "subtitle": "",
  1432 + "title": "《以乐润心 音爱同行 ——新年音乐会》",
  1433 + "vImageUrl": "https://cdnjdphoto.aikan.pdnews.cn/sjbj-20231214/image/live/66d2363592d5462b89972f558a97debe.png?x-oss-process=image/resize,l_850/auto-orient,1/quality,q_95/format,jpg",
  1434 + "screenType":"2"
  1435 + }
  1436 + ],
  1437 + "pageId": null,
  1438 + "posterSize": "",
  1439 + "posterUrl": "",
  1440 + "provinceCode": "",
  1441 + "sortValue": 6,
  1442 + "subType": ""
  1443 + }
  1444 + ],
  1445 + "id": 5,
  1446 + "name": "今日热点",
  1447 + "pageId": "2"
  1448 + },
  1449 + "message": "Success",
  1450 + "meta": {
  1451 + "md5": "yZstaJZxCm+YdypyQpuQyA=="
  1452 + },
  1453 + "requestId": "",
  1454 + "success": true,
  1455 + "timestamp": 1702881464711
  1456 +}
This diff could not be displayed because it is too large.
  1 +{
  2 + "string": [
  3 + {
  4 + "name": "module_desc",
  5 + "value": "模块描述"
  6 + },
  7 + {
  8 + "name": "EntryAbility_desc",
  9 + "value": "$string:app_desc"
  10 + },
  11 + {
  12 + "name": "EntryAbility_label",
  13 + "value": "$string:app_name"
  14 + }
  15 + ]
  16 +}
  1 +import hilog from '@ohos.hilog';
  2 +import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from '@ohos/hypium'
  3 +
  4 +export default function abilityTest() {
  5 + describe('ActsAbilityTest', function () {
  6 + // Defines a test suite. Two parameters are supported: test suite name and test suite function.
  7 + beforeAll(function () {
  8 + // Presets an action, which is performed only once before all test cases of the test suite start.
  9 + // This API supports only one parameter: preset action function.
  10 + })
  11 + beforeEach(function () {
  12 + // Presets an action, which is performed before each unit test case starts.
  13 + // The number of execution times is the same as the number of test cases defined by **it**.
  14 + // This API supports only one parameter: preset action function.
  15 + })
  16 + afterEach(function () {
  17 + // Presets a clear action, which is performed after each unit test case ends.
  18 + // The number of execution times is the same as the number of test cases defined by **it**.
  19 + // This API supports only one parameter: clear action function.
  20 + })
  21 + afterAll(function () {
  22 + // Presets a clear action, which is performed after all test cases of the test suite end.
  23 + // This API supports only one parameter: clear action function.
  24 + })
  25 + it('assertContain',0, function () {
  26 + // Defines a test case. This API supports three parameters: test case name, filter parameter, and test case function.
  27 + hilog.info(0x0000, 'testTag', '%{public}s', 'it begin');
  28 + let a = 'abc'
  29 + let b = 'b'
  30 + // Defines a variety of assertion methods, which are used to declare expected boolean conditions.
  31 + expect(a).assertContain(b)
  32 + expect(a).assertEqual(a)
  33 + })
  34 + })
  35 +}
  1 +import abilityTest from './Ability.test'
  2 +
  3 +export default function testsuite() {
  4 + abilityTest()
  5 +}
  1 +import UIAbility from '@ohos.app.ability.UIAbility';
  2 +import AbilityDelegatorRegistry from '@ohos.app.ability.abilityDelegatorRegistry';
  3 +import hilog from '@ohos.hilog';
  4 +import { Hypium } from '@ohos/hypium';
  5 +import testsuite from '../test/List.test';
  6 +import window from '@ohos.window';
  7 +
  8 +export default class TestAbility extends UIAbility {
  9 + onCreate(want, launchParam) {
  10 + hilog.info(0x0000, 'testTag', '%{public}s', 'TestAbility onCreate');
  11 + hilog.info(0x0000, 'testTag', '%{public}s', 'want param:' + JSON.stringify(want) ?? '');
  12 + hilog.info(0x0000, 'testTag', '%{public}s', 'launchParam:'+ JSON.stringify(launchParam) ?? '');
  13 + var abilityDelegator: any
  14 + abilityDelegator = AbilityDelegatorRegistry.getAbilityDelegator()
  15 + var abilityDelegatorArguments: any
  16 + abilityDelegatorArguments = AbilityDelegatorRegistry.getArguments()
  17 + hilog.info(0x0000, 'testTag', '%{public}s', 'start run testcase!!!');
  18 + Hypium.hypiumTest(abilityDelegator, abilityDelegatorArguments, testsuite)
  19 + }
  20 +
  21 + onDestroy() {
  22 + hilog.info(0x0000, 'testTag', '%{public}s', 'TestAbility onDestroy');
  23 + }
  24 +
  25 + onWindowStageCreate(windowStage: window.WindowStage) {
  26 + hilog.info(0x0000, 'testTag', '%{public}s', 'TestAbility onWindowStageCreate');
  27 + windowStage.loadContent('testability/pages/Index', (err, data) => {
  28 + if (err.code) {
  29 + hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? '');
  30 + return;
  31 + }
  32 + hilog.info(0x0000, 'testTag', 'Succeeded in loading the content. Data: %{public}s',
  33 + JSON.stringify(data) ?? '');
  34 + });
  35 + }
  36 +
  37 + onWindowStageDestroy() {
  38 + hilog.info(0x0000, 'testTag', '%{public}s', 'TestAbility onWindowStageDestroy');
  39 + }
  40 +
  41 + onForeground() {
  42 + hilog.info(0x0000, 'testTag', '%{public}s', 'TestAbility onForeground');
  43 + }
  44 +
  45 + onBackground() {
  46 + hilog.info(0x0000, 'testTag', '%{public}s', 'TestAbility onBackground');
  47 + }
  48 +}
  1 +import hilog from '@ohos.hilog';
  2 +
  3 +@Entry
  4 +@Component
  5 +struct Index {
  6 + aboutToAppear() {
  7 + hilog.info(0x0000, 'testTag', '%{public}s', 'TestAbility index aboutToAppear');
  8 + }
  9 + @State message: string = 'Hello World'
  10 + build() {
  11 + Row() {
  12 + Column() {
  13 + Text(this.message)
  14 + .fontSize(50)
  15 + .fontWeight(FontWeight.Bold)
  16 + Button() {
  17 + Text('next page')
  18 + .fontSize(20)
  19 + .fontWeight(FontWeight.Bold)
  20 + }.type(ButtonType.Capsule)
  21 + .margin({
  22 + top: 20
  23 + })
  24 + .backgroundColor('#0D9FFB')
  25 + .width('35%')
  26 + .height('5%')
  27 + .onClick(()=>{
  28 + })
  29 + }
  30 + .width('100%')
  31 + }
  32 + .height('100%')
  33 + }
  34 + }
  1 +import hilog from '@ohos.hilog';
  2 +import TestRunner from '@ohos.application.testRunner';
  3 +import AbilityDelegatorRegistry from '@ohos.app.ability.abilityDelegatorRegistry';
  4 +
  5 +var abilityDelegator = undefined
  6 +var abilityDelegatorArguments = undefined
  7 +
  8 +async function onAbilityCreateCallback() {
  9 + hilog.info(0x0000, 'testTag', '%{public}s', 'onAbilityCreateCallback');
  10 +}
  11 +
  12 +async function addAbilityMonitorCallback(err: any) {
  13 + hilog.info(0x0000, 'testTag', 'addAbilityMonitorCallback : %{public}s', JSON.stringify(err) ?? '');
  14 +}
  15 +
  16 +export default class OpenHarmonyTestRunner implements TestRunner {
  17 + constructor() {
  18 + }
  19 +
  20 + onPrepare() {
  21 + hilog.info(0x0000, 'testTag', '%{public}s', 'OpenHarmonyTestRunner OnPrepare ');
  22 + }
  23 +
  24 + async onRun() {
  25 + hilog.info(0x0000, 'testTag', '%{public}s', 'OpenHarmonyTestRunner onRun run');
  26 + abilityDelegatorArguments = AbilityDelegatorRegistry.getArguments()
  27 + abilityDelegator = AbilityDelegatorRegistry.getAbilityDelegator()
  28 + var testAbilityName = abilityDelegatorArguments.bundleName + '.TestAbility'
  29 + let lMonitor = {
  30 + abilityName: testAbilityName,
  31 + onAbilityCreate: onAbilityCreateCallback,
  32 + };
  33 + abilityDelegator.addAbilityMonitor(lMonitor, addAbilityMonitorCallback)
  34 + var cmd = 'aa start -d 0 -a TestAbility' + ' -b ' + abilityDelegatorArguments.bundleName
  35 + var debug = abilityDelegatorArguments.parameters['-D']
  36 + if (debug == 'true')
  37 + {
  38 + cmd += ' -D'
  39 + }
  40 + hilog.info(0x0000, 'testTag', 'cmd : %{public}s', cmd);
  41 + abilityDelegator.executeShellCommand(cmd,
  42 + (err: any, d: any) => {
  43 + hilog.info(0x0000, 'testTag', 'executeShellCommand : err : %{public}s', JSON.stringify(err) ?? '');
  44 + hilog.info(0x0000, 'testTag', 'executeShellCommand : data : %{public}s', d.stdResult ?? '');
  45 + hilog.info(0x0000, 'testTag', 'executeShellCommand : data : %{public}s', d.exitCode ?? '');
  46 + })
  47 + hilog.info(0x0000, 'testTag', '%{public}s', 'OpenHarmonyTestRunner onRun end');
  48 + }
  49 +}
  1 +{
  2 + "module": {
  3 + "name": "entry_test",
  4 + "type": "feature",
  5 + "description": "$string:module_test_desc",
  6 + "mainElement": "TestAbility",
  7 + "deviceTypes": [
  8 + "phone",
  9 + "tablet"
  10 + ],
  11 + "deliveryWithInstall": true,
  12 + "installationFree": false,
  13 + "pages": "$profile:test_pages",
  14 + "abilities": [
  15 + {
  16 + "name": "TestAbility",
  17 + "srcEntry": "./ets/testability/TestAbility.ets",
  18 + "description": "$string:TestAbility_desc",
  19 + "icon": "$media:icon",
  20 + "label": "$string:TestAbility_label",
  21 + "exported": true,
  22 + "startWindowIcon": "$media:icon",
  23 + "startWindowBackground": "$color:start_window_background",
  24 + "skills": [
  25 + {
  26 + "actions": [
  27 + "action.system.home"
  28 + ],
  29 + "entities": [
  30 + "entity.system.home"
  31 + ]
  32 + }
  33 + ]
  34 + }
  35 + ]
  36 + }
  37 +}
  1 +{
  2 + "color": [
  3 + {
  4 + "name": "start_window_background",
  5 + "value": "#FFFFFF"
  6 + }
  7 + ]
  8 +}
  1 +{
  2 + "string": [
  3 + {
  4 + "name": "module_test_desc",
  5 + "value": "test ability description"
  6 + },
  7 + {
  8 + "name": "TestAbility_desc",
  9 + "value": "the test ability"
  10 + },
  11 + {
  12 + "name": "TestAbility_label",
  13 + "value": "test label"
  14 + }
  15 + ]
  16 +}
  1 +{
  2 + "src": [
  3 + "testability/pages/Index"
  4 + ]
  5 +}
  1 +{
  2 + "hvigorVersion": "2.4.2",
  3 + "dependencies": {
  4 + "@ohos/hvigor-ohos-plugin": "2.4.2"
  5 + }
  6 +}
This diff could not be displayed because it is too large.
  1 +// Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently.
  2 +export { appTasks } from '@ohos/hvigor-ohos-plugin';
  1 +#!/bin/bash
  2 +
  3 +# ----------------------------------------------------------------------------
  4 +# Hvigor startup script, version 1.0.0
  5 +#
  6 +# Required ENV vars:
  7 +# ------------------
  8 +# NODE_HOME - location of a Node home dir
  9 +# or
  10 +# Add /usr/local/nodejs/bin to the PATH environment variable
  11 +# ----------------------------------------------------------------------------
  12 +
  13 +HVIGOR_APP_HOME=$(dirname $(readlink -f $0))
  14 +HVIGOR_WRAPPER_SCRIPT=${HVIGOR_APP_HOME}/hvigor/hvigor-wrapper.js
  15 +warn() {
  16 + echo ""
  17 + echo -e "\033[1;33m`date '+[%Y-%m-%d %H:%M:%S]'`$@\033[0m"
  18 +}
  19 +
  20 +error() {
  21 + echo ""
  22 + echo -e "\033[1;31m`date '+[%Y-%m-%d %H:%M:%S]'`$@\033[0m"
  23 +}
  24 +
  25 +fail() {
  26 + error "$@"
  27 + exit 1
  28 +}
  29 +
  30 +# Determine node to start hvigor wrapper script
  31 +if [ -n "${NODE_HOME}" ];then
  32 + EXECUTABLE_NODE="${NODE_HOME}/bin/node"
  33 + if [ ! -x "$EXECUTABLE_NODE" ];then
  34 + fail "ERROR: NODE_HOME is set to an invalid directory,check $NODE_HOME\n\nPlease set NODE_HOME in your environment to the location where your nodejs installed"
  35 + fi
  36 +else
  37 + EXECUTABLE_NODE="node"
  38 + which ${EXECUTABLE_NODE} > /dev/null 2>&1 || fail "ERROR: NODE_HOME is not set and not 'node' command found in your path"
  39 +fi
  40 +
  41 +# Check hvigor wrapper script
  42 +if [ ! -r "$HVIGOR_WRAPPER_SCRIPT" ];then
  43 + fail "ERROR: Couldn't find hvigor/hvigor-wrapper.js in ${HVIGOR_APP_HOME}"
  44 +fi
  45 +
  46 +# start hvigor-wrapper script
  47 +exec "${EXECUTABLE_NODE}" \
  48 + "${HVIGOR_WRAPPER_SCRIPT}" "$@"
  1 +@if "%DEBUG%" == "" @echo off
  2 +@rem ##########################################################################
  3 +@rem
  4 +@rem Hvigor startup script for Windows
  5 +@rem
  6 +@rem ##########################################################################
  7 +
  8 +@rem Set local scope for the variables with windows NT shell
  9 +if "%OS%"=="Windows_NT" setlocal
  10 +
  11 +set DIRNAME=%~dp0
  12 +if "%DIRNAME%" == "" set DIRNAME=.
  13 +set APP_BASE_NAME=%~n0
  14 +set APP_HOME=%DIRNAME%
  15 +
  16 +@rem Resolve any "." and ".." in APP_HOME to make it shorter.
  17 +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
  18 +
  19 +set WRAPPER_MODULE_PATH=%APP_HOME%\hvigor\hvigor-wrapper.js
  20 +set NODE_EXE=node.exe
  21 +
  22 +goto start
  23 +
  24 +:start
  25 +@rem Find node.exe
  26 +if defined NODE_HOME goto findNodeFromNodeHome
  27 +
  28 +%NODE_EXE% --version >NUL 2>&1
  29 +if "%ERRORLEVEL%" == "0" goto execute
  30 +
  31 +echo.
  32 +echo ERROR: NODE_HOME is not set and no 'node' command could be found in your PATH.
  33 +echo.
  34 +echo Please set the NODE_HOME variable in your environment to match the
  35 +echo location of your NodeJs installation.
  36 +
  37 +goto fail
  38 +
  39 +:findNodeFromNodeHome
  40 +set NODE_HOME=%NODE_HOME:"=%
  41 +set NODE_EXE_PATH=%NODE_HOME%/%NODE_EXE%
  42 +
  43 +if exist "%NODE_EXE_PATH%" goto execute
  44 +echo.
  45 +echo ERROR: NODE_HOME is not set and no 'node' command could be found in your PATH.
  46 +echo.
  47 +echo Please set the NODE_HOME variable in your environment to match the
  48 +echo location of your NodeJs installation.
  49 +
  50 +goto fail
  51 +
  52 +:execute
  53 +@rem Execute hvigor
  54 +"%NODE_EXE%" %WRAPPER_MODULE_PATH% %*
  55 +
  56 +if "%ERRORLEVEL%" == "0" goto hvigorwEnd
  57 +
  58 +:fail
  59 +exit /b 1
  60 +
  61 +:hvigorwEnd
  62 +if "%OS%" == "Windows_NT" endlocal
  63 +
  64 +:end
  1 +{
  2 + "lockfileVersion": 1,
  3 + "ATTENTION": "THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.",
  4 + "specifiers": {
  5 + "@ohos/hypium@1.0.6": "@ohos/hypium@1.0.6"
  6 + },
  7 + "packages": {
  8 + "@ohos/hypium@1.0.6": {
  9 + "resolved": "https://repo.harmonyos.com/ohpm/@ohos/hypium/-/hypium-1.0.6.tgz",
  10 + "integrity": "sha512-bb3DWeWhYrFqj9mPFV3yZQpkm36kbcK+YYaeY9g292QKSjOdmhEIQR2ULPvyMsgSR4usOBf5nnYrDmaCCXirgQ=="
  11 + }
  12 + }
  13 +}
  1 +{
  2 + "license": "",
  3 + "devDependencies": {
  4 + "@ohos/hypium": "1.0.6"
  5 + },
  6 + "author": "",
  7 + "name": "peopledaily_harmony",
  8 + "description": "Please describe the basic information.",
  9 + "main": "",
  10 + "version": "1.0.0",
  11 + "dependencies": {}
  12 +}
  1 +/node_modules
  2 +/oh_modules
  3 +/.preview
  4 +/build
  5 +/.cxx
  6 +/.test
  1 +{
  2 + "apiType": 'stageMode',
  3 + "buildOption": {
  4 + },
  5 + "targets": [
  6 + {
  7 + "name": "default",
  8 + "runtimeOS": "HarmonyOS"
  9 + }
  10 + ]
  11 +}
  1 +// Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently.
  2 +module.exports = require('@ohos/hvigor-ohos-plugin').hspTasks
  1 +{
  2 + "name": "wdcomponent",
  3 + "version": "1.0.0",
  4 + "description": "Please describe the basic information.",
  5 + "main": "./src/main/ets/Index.ets",
  6 + "author": "",
  7 + "license": "Apache-2.0",
  8 + "dependencies": {
  9 + }
  10 +}
  1 +
  2 +export { PageViewModel } from "./viewmodel/PageViewModel"
  3 +
  4 +export { EmptyComponent } from "./components/EmptyComponent"
  5 +
  6 +export { ErrorComponent } from "./components/ErrorComponent"
  7 +
  8 +export { LoadingComponent } from "./components/LoadingComponent"
  9 +
  10 +export { PageComponent } from "./components/PageComponent"
  11 +
  12 +export { BottomNavigationComponent } from "./components/BottomNavigationComponent"
  13 +
  14 +export { TopNavigationComponent } from "./components/TopNavigationComponent"
  15 +
  16 +export { LabelComponent } from "./components/LabelComponent"
  1 +import { BottomNavi, CommonConstants } from 'wdConstant';
  2 +import { LazyDataSource, Logger } from 'wdKit';
  3 +import { TopNavigationComponent } from './TopNavigationComponent';
  4 +import { PageComponent } from './PageComponent';
  5 +import { BottomNavDTO } from '../repository/bean/BottomNavDTO';
  6 +import { PageViewModel } from '../Index';
  7 +
  8 +const TAG = 'BottomNavigationComponent';
  9 +
  10 +/**
  11 + * 底部页签导航栏/底导
  12 + */
  13 +@Component
  14 +export struct BottomNavigationComponent {
  15 + // 底导/顶导全部数据
  16 + @State @Watch('onBottomNavigationDataUpdated') bottomNavList: BottomNavDTO[] = []
  17 + // 底导当前选中/焦点下标
  18 + @Provide currentNavIndex: number = BottomNavi.NEWS;
  19 + // 底导TabsController
  20 + private navController: TabsController = new TabsController();
  21 + readonly ASPECT_RATIO_1_1: number = 1 / 1; // 底导图片宽高比
  22 + /**
  23 + * Component opacity value: 1.
  24 + */
  25 + readonly FULL_OPACITY: number = 1;
  26 + /**
  27 + * Component opacity value: 0.6.
  28 + */
  29 + readonly SIXTY_OPACITY: number = 0.6;
  30 +
  31 +
  32 + async aboutToAppear() {
  33 + Logger.info(TAG, `aboutToAppear currentNavIndex: ${this.currentNavIndex}`);
  34 + let bottomNav = await PageViewModel.getBottomNavData(getContext(this))
  35 + if (bottomNav) {
  36 + Logger.info(TAG, `aboutToAppear, bottomNav.length: ${bottomNav.length}`);
  37 + this.bottomNavList = bottomNav
  38 + }
  39 + }
  40 +
  41 + aboutToDisappear() {
  42 + Logger.info(TAG, `aboutToDisappear, this.currentNavIndex: ${this.currentNavIndex}`);
  43 + }
  44 +
  45 + build() {
  46 + Tabs({ barPosition: BarPosition.End, index: this.currentNavIndex, controller: this.navController }) {
  47 + ForEach(this.bottomNavList, (navItem: BottomNavDTO, index: number) => {
  48 + TabContent() {
  49 + Column() {
  50 + if (navItem.topNavChannelList && navItem.topNavChannelList.length == 0 && navItem.name == '我的') {
  51 + PageComponent({ compList: new LazyDataSource() }) // todo:我的页面组件数据列表
  52 + } else {
  53 + TopNavigationComponent({ topNavList: navItem.topNavChannelList })
  54 + }
  55 + }
  56 + }
  57 + .tabBar(this.tabBarBuilder(navItem, index))
  58 + });
  59 + }
  60 + .barHeight($r('app.float.bottom_navigation_barHeight'))
  61 + .barMode(BarMode.Fixed)
  62 + .onChange((index: number) => {
  63 + Logger.info(TAG, `onChange, index: ${index}`);
  64 + this.currentNavIndex = index;
  65 + // this.onBottomNavigationIndexChange()
  66 + })
  67 + }
  68 +
  69 + @Builder
  70 + tabBarBuilder(navItem: BottomNavDTO, index: number) {
  71 + Stack({ alignContent: Alignment.Bottom }) {
  72 + Image(this.currentNavIndex === index ? navItem.iconC : navItem.icon)
  73 + .height(CommonConstants.FULL_PARENT)
  74 + .padding({ bottom: 15, left: 10, right: 10, top: 2 })
  75 + .aspectRatio(this.ASPECT_RATIO_1_1)
  76 +
  77 + Text(navItem.name)
  78 + .margin({ bottom: $r('app.float.bottom_navigation_margin_bottom') })
  79 + .fontWeight(this.currentNavIndex === index ? FontWeight.Bold : FontWeight.Normal)
  80 + .textAlign(TextAlign.Center)
  81 + .fontSize($r('app.float.font_size_10'))
  82 + .fontColor(this.currentNavIndex === index ? Color.Red : Color.Gray)
  83 + .opacity(this.currentNavIndex === index ? this.FULL_OPACITY : this.SIXTY_OPACITY)
  84 + }
  85 + .height($r('app.float.bottom_navigation_barHeight'))
  86 + .hoverEffect(HoverEffect.Highlight)
  87 + // .justifyContent(FlexAlign.Center)
  88 + // .onClick(() => {
  89 + // Logger.info(TAG, `onClick, index: ${index}`);
  90 + // this.currentNavIndex = index ?? 0;
  91 + // this.navController.changeIndex(this.currentNavIndex);
  92 + // })
  93 + }
  94 +
  95 + // 底导切换函数
  96 + onBottomNavigationIndexChange() {
  97 + Logger.info(TAG, `onBottomNavigationIndexChange this.currentNavIndex: ${this.currentNavIndex}`);
  98 + // 请求顶导数据(参数):
  99 + }
  100 +
  101 + onBottomNavigationDataUpdated() {
  102 + // Logger.info(TAG, `onBottomNavigationDataUpdated currentNavIndex: ${this.currentNavIndex},length:${this.bottomNavItemList.length}`);
  103 + this.onBottomNavigationIndexChange()
  104 + }
  105 +}
  1 +import { CommonConstants } from 'wdConstant';
  2 +import { Logger } from 'wdKit';
  3 +
  4 +const TAG = 'EmptyComponent';
  5 +
  6 +/**
  7 + * 空数据/无数据
  8 + */
  9 +@Component
  10 +export struct EmptyComponent {
  11 + // private emptySize: SizeOptions = {};
  12 + @State emptyWidth: string | number = CommonConstants.FULL_PARENT;
  13 + @State emptyHeight: string | number = CommonConstants.FULL_PARENT;
  14 + /**
  15 + * The empty image width percentage setting.
  16 + */
  17 + readonly EMPTY_IMAGE_WIDTH: string = '50%';
  18 + /**
  19 + * The empty image height percentage setting.
  20 + */
  21 + readonly EMPTY_IMAGE_HEIGHT: string = '30%';
  22 + /**
  23 + * The empty data text component margin top.
  24 + */
  25 + readonly EMPTY_TIP_TEXT_MARGIN_TOP: string = '2%';
  26 + /**
  27 + * The empty data text opacity.
  28 + */
  29 + readonly TEXT_OPACITY: number = 0.4;
  30 +
  31 + build() {
  32 + this.noProgrammeData();
  33 + }
  34 +
  35 + /**
  36 + * 无数据,空白view组件
  37 + */
  38 + @Builder
  39 + noProgrammeData() {
  40 + Column() {
  41 + // Image($r('app.media.icon_no_content'))
  42 + // .width(this.EMPTY_IMAGE_WIDTH)
  43 + // .height(this.EMPTY_IMAGE_HEIGHT)
  44 + // .objectFit(ImageFit.Contain)
  45 + // // .border({ width: 1, color: Color.Red, radius: 6 })
  46 +
  47 + Text(this.buildNoDataTip())
  48 + .fontSize($r('app.float.normal_text_size'))
  49 + .fontColor('#B2B2B2')
  50 + .fontWeight(FontWeight.Normal)
  51 + .opacity(this.TEXT_OPACITY)
  52 + .margin({ top: this.EMPTY_TIP_TEXT_MARGIN_TOP })
  53 + .onClick((event: ClickEvent) => {
  54 + Logger.info(TAG, `noProgrammeData onClick event?.source: ${event.source}`);
  55 + })
  56 + }
  57 + .justifyContent(FlexAlign.Center)
  58 + .width(this.emptyWidth)
  59 + .height(this.emptyHeight)
  60 + }
  61 +
  62 + buildNoDataTip(): Resource | string {
  63 + Logger.info(TAG, "buildNoDataTip");
  64 + return $r('app.string.load_net_data_none')
  65 + }
  66 +}
  1 +import { CommonConstants } from 'wdConstant';
  2 +import { Logger } from 'wdKit';
  3 +
  4 +const TAG = 'ErrorComponent';
  5 +
  6 +/**
  7 + * failed失败/出错页面
  8 + */
  9 +@Component
  10 +export struct ErrorComponent {
  11 + // private emptySize: SizeOptions = {};
  12 + @State emptyWidth: string | number = CommonConstants.FULL_PARENT;
  13 + @State emptyHeight: string | number = CommonConstants.FULL_PARENT;
  14 + /**
  15 + * The empty image width percentage setting.
  16 + */
  17 + readonly EMPTY_IMAGE_WIDTH: string = '50%';
  18 + /**
  19 + * The empty image height percentage setting.
  20 + */
  21 + readonly EMPTY_IMAGE_HEIGHT: string = '30%';
  22 + /**
  23 + * The empty data text component margin top.
  24 + */
  25 + readonly EMPTY_TIP_TEXT_MARGIN_TOP: string = '2%';
  26 + /**
  27 + * The empty data text opacity.
  28 + */
  29 + readonly TEXT_OPACITY: number = 0.4;
  30 +
  31 + build() {
  32 + this.errorView();
  33 + }
  34 +
  35 + /**
  36 + * 失败view
  37 + */
  38 + @Builder
  39 + errorView() {
  40 + Column() {
  41 + // Image($r('app.media.ic_no_data'))
  42 + // .width(this.EMPTY_IMAGE_WIDTH)
  43 + // .height(this.EMPTY_IMAGE_HEIGHT)
  44 + // .objectFit(ImageFit.Contain)
  45 + // // .border({ width: 1, color: Color.Red, radius: 6 })
  46 +
  47 + Text(this.buildFailedTip())
  48 + .fontSize($r('app.float.normal_text_size'))
  49 + .fontColor(Color.Black)
  50 + .fontWeight(FontWeight.Normal)
  51 + .opacity(this.TEXT_OPACITY)
  52 + .margin({ top: this.EMPTY_TIP_TEXT_MARGIN_TOP })
  53 + .onClick((event: ClickEvent) => {
  54 + Logger.info(TAG, `errorView onClick event.source: ${event.source}`);
  55 + })
  56 + }
  57 + .justifyContent(FlexAlign.Center)
  58 + .width(this.emptyWidth)
  59 + .height(this.emptyHeight)
  60 + }
  61 +
  62 + buildFailedTip(): Resource | string {
  63 + Logger.info(TAG, "buildFailedTip");
  64 + return $r('app.string.load_net_data_failed')
  65 + }
  66 +}
  1 +import { CommonConstants } from 'wdConstant';
  2 +import { CompDTO } from '../repository/bean/CompDTO';
  3 +import { CompUtils } from '../utils/CompUtils';
  4 +
  5 +const TAG = 'LabelComponent';
  6 +
  7 +/**
  8 + * 标题/标签组件(暂时仅展示主标题,不展示子标题)
  9 + * Label-03
  10 + * 重磅推荐/精选/电视剧/电影/综艺/短剧/更多>/
  11 + */
  12 +@Entry
  13 +@Component
  14 +export struct LabelComponent {
  15 + @State compDTO: CompDTO = {} as CompDTO
  16 +
  17 + build() {
  18 + Row() {
  19 + Text(CompUtils.getLabelTitle(this.compDTO.extraData))
  20 + .width(CommonConstants.FULL_PARENT)
  21 + .padding({
  22 + left: $r('app.float.main_margin'),
  23 + right: $r('app.float.main_margin'),
  24 + top: $r('app.float.label_margin_top'),
  25 + bottom: $r('app.float.label_margin_bottom')
  26 + })
  27 + .fontSize($r('app.float.normal_text_size'))
  28 + .fontWeight(FontWeight.Bold)
  29 + .maxLines(1)// .backgroundColor(Color.Yellow)
  30 + .textOverflow({ overflow: TextOverflow.Ellipsis }) // 超出的部分显示省略号。
  31 + }
  32 + .width(CommonConstants.FULL_PARENT)
  33 + .justifyContent(FlexAlign.Start)
  34 + }
  35 +}
  1 +import { CommonConstants } from 'wdConstant';
  2 +import { Logger } from 'wdKit';
  3 +
  4 +const TAG = 'LoadingComponent';
  5 +
  6 +/**
  7 + * Loading/网络数据加载中
  8 + */
  9 +@Component
  10 +export struct LoadingComponent {
  11 + @State emptyWidth: string | number = CommonConstants.FULL_PARENT;
  12 + @State emptyHeight: string | number = CommonConstants.FULL_PARENT;
  13 + /**
  14 + * The empty image width percentage setting.
  15 + */
  16 + readonly EMPTY_IMAGE_WIDTH: string = '50%';
  17 + /**
  18 + * The empty image height percentage setting.
  19 + */
  20 + readonly EMPTY_IMAGE_HEIGHT: string = '30%';
  21 + /**
  22 + * The empty data text component margin top.
  23 + */
  24 + readonly EMPTY_TIP_TEXT_MARGIN_TOP: string = '2%';
  25 + /**
  26 + * The empty data text opacity.
  27 + */
  28 + readonly TEXT_OPACITY: number = 0.4;
  29 +
  30 + build() {
  31 + this.loadingView();
  32 + }
  33 +
  34 + /**
  35 + * loading
  36 + */
  37 + @Builder
  38 + loadingView() {
  39 + Column() {
  40 + // Image($r('app.media.ic_no_data'))
  41 + // .width(this.EMPTY_IMAGE_WIDTH)
  42 + // .height(this.EMPTY_IMAGE_HEIGHT)
  43 + // .objectFit(ImageFit.Contain)
  44 + // .border({ width: 1, color: Color.Red, radius: 6 })
  45 +
  46 + Text(this.buildLoadingTip())
  47 + .fontSize($r('app.float.normal_text_size'))
  48 + .fontColor(Color.Black)
  49 + .fontWeight(FontWeight.Normal)
  50 + .opacity(this.TEXT_OPACITY)
  51 + .margin({ top: this.EMPTY_TIP_TEXT_MARGIN_TOP })
  52 + .onClick((event: ClickEvent) => {
  53 + Logger.info(TAG, `loadingView onClick event.source: ${event.source}`);
  54 + })
  55 + }
  56 + .justifyContent(FlexAlign.Center)
  57 + .width(this.emptyWidth)
  58 + .height(this.emptyHeight)
  59 + }
  60 +
  61 + buildLoadingTip(): Resource | string {
  62 + Logger.info(TAG, "buildLoadingTip");
  63 + return $r('app.string.load_net_data_loading')
  64 + }
  65 +}
  1 +import { CommonConstants, CompStyle, ViewType } from 'wdConstant';
  2 +import { LazyDataSource, Logger } from 'wdKit';
  3 +import { CompDTO } from '../repository/bean/CompDTO';
  4 +import { PageViewModel } from '../viewmodel/PageViewModel';
  5 +import { EmptyComponent } from './EmptyComponent';
  6 +import { ErrorComponent } from './ErrorComponent';
  7 +import { LabelComponent } from './LabelComponent';
  8 +import { LoadingComponent } from './LoadingComponent';
  9 +
  10 +const TAG = 'PageComponent';
  11 +
  12 +@Component
  13 +export struct PageComponent {
  14 + @State viewType: number = ViewType.LOADED;
  15 + // Group数据及子组件数据
  16 + @State compList: LazyDataSource<CompDTO> = new LazyDataSource();
  17 + @State currentTopNavSelectedIndex: number = 0;
  18 +
  19 + build() {
  20 + if (this.viewType == ViewType.LOADING) {
  21 + LoadingComponent()
  22 + } else if (this.viewType == ViewType.ERROR) {
  23 + ErrorComponent()
  24 + } else if (this.viewType == ViewType.EMPTY) {
  25 + EmptyComponent()
  26 + } else {
  27 + List() {
  28 + LazyForEach(this.compList, (compDTO: CompDTO, compIndex: number) => {
  29 + ListItem() {
  30 + Column() {
  31 + this.componentBuilder(compDTO, compIndex)
  32 + }
  33 + }
  34 + })
  35 + }
  36 + .cachedCount(5)
  37 + .height(CommonConstants.FULL_PARENT)
  38 + }
  39 + }
  40 +
  41 + @Builder
  42 + componentBuilder(compDTO: CompDTO, compIndex: number) {
  43 + if (compDTO.compStyle === CompStyle.Label_03) {
  44 + LabelComponent({ compDTO: compDTO })
  45 + } else {
  46 + // todo:组件未实现 / Component Not Implemented
  47 + Text(compDTO.compStyle)
  48 + .width(CommonConstants.FULL_PARENT)
  49 + .padding(10)
  50 + // .backgroundColor(Color.Brown) // 展示本页未实现的compStyle
  51 + }
  52 + }
  53 +
  54 + async aboutToAppear() {
  55 + Logger.info(TAG, `aboutToAppear, this.pageId: ${this.viewType} this.currentTopNavSelectedIndex: ${this.currentTopNavSelectedIndex}`);
  56 + if (this.currentTopNavSelectedIndex === 1) { // 顶导tab的第0个item是【热点】,第1个item是【推荐】
  57 + this.compList.replaceAll()
  58 + let pageDto = await PageViewModel.getPageData2(getContext(this))
  59 + if (pageDto && pageDto.compList) {
  60 + this.compList.push(...pageDto.compList)
  61 + }
  62 + } else {
  63 + let pageDto = await PageViewModel.getPageData1(getContext(this))
  64 + if (pageDto && pageDto.compList) {
  65 + this.compList.push(...pageDto.compList)
  66 + }
  67 + }
  68 + }
  69 +}
  70 +
  1 +import { LazyDataSource, Logger } from 'wdKit';
  2 +import { CompDTO } from '../repository/bean/CompDTO';
  3 +import { TopNavDTO } from '../repository/bean/TopNavDTO';
  4 +import { PageComponent } from './PageComponent';
  5 +
  6 +const TAG = 'TopNavigationComponent';
  7 +
  8 +/**
  9 + * 顶部页签导航栏/顶导
  10 + */
  11 +@Component
  12 +export struct TopNavigationComponent {
  13 + // 顶导当前选中/焦点下标
  14 + @State currentTopNavSelectedIndex: number = 0;
  15 + // 顶导数据
  16 + @State @Watch('onTopNavigationDataUpdated') topNavList: TopNavDTO[] = []
  17 + @State compList: LazyDataSource<CompDTO> = new LazyDataSource();
  18 + readonly MAX_LINE: number = 1;
  19 +
  20 + build() {
  21 + Tabs() {
  22 + ForEach(this.topNavList, (navItem: TopNavDTO, index: number) => {
  23 + TabContent() {
  24 + PageComponent({ currentTopNavSelectedIndex: index })
  25 + }
  26 + .tabBar(this.tabBarBuilder(navItem, index))
  27 + }, (navItem: TopNavDTO) => JSON.stringify(navItem));
  28 + }
  29 + .barHeight($r('app.float.top_tab_bar_height'))
  30 + .barMode(BarMode.Scrollable)
  31 + .vertical(false)
  32 + .onChange((index: number) => {
  33 + Logger.info(TAG, `onChange index : ${index}`);
  34 + this.currentTopNavSelectedIndex = index;
  35 + })
  36 + }
  37 +
  38 + @Builder
  39 + tabBarBuilder(item: TopNavDTO, index: number) {
  40 + Column() {
  41 + Text(item.name)
  42 + .fontSize(this.currentTopNavSelectedIndex === index ? $r('app.float.selected_text_size') : $r('app.float.normal_text_size'))
  43 + .fontWeight(this.currentTopNavSelectedIndex === index ? FontWeight.Bold : FontWeight.Normal)
  44 + .fontColor(Color.Black)
  45 + .padding({ top: $r('app.float.top_tab_item_padding_top') })
  46 + .maxLines(this.MAX_LINE)
  47 + Divider()
  48 + .width(16)
  49 + .strokeWidth(2) // 分割线粗细度。
  50 + .padding({ top: 2 })
  51 + .color(Color.Red)
  52 + .opacity(this.currentTopNavSelectedIndex === index ? 1 : 0)
  53 + }
  54 + .hoverEffect(HoverEffect.Highlight)
  55 + .constraintSize({
  56 + minWidth: $r('app.float.top_tab_item_min_width'),
  57 + maxWidth: $r('app.float.top_tab_item_max_width')
  58 + })
  59 + // .backgroundColor(Color.Black)
  60 + .padding({
  61 + left: $r('app.float.top_tab_item_padding_horizontal'),
  62 + right: $r('app.float.top_tab_item_padding_horizontal'),
  63 + bottom: $r('app.float.top_tab_item_padding_bottom')
  64 + })
  65 + .id(`col_tabBar${index}`)
  66 + }
  67 +
  68 + aboutToAppear() {
  69 + Logger.info(TAG, `aboutToAppear this.topNavList : ${JSON.stringify(this.topNavList)}`);
  70 + }
  71 +
  72 + onTopNavigationDataUpdated() {
  73 + Logger.info(TAG, `onTopNavigationDataUpdated currentTopNavIndex: ${this.currentTopNavSelectedIndex},topNavList.length:${this.topNavList.length}`);
  74 + }
  75 +}
  1 +import { ResponseDTO, WDHttp } from 'wdNetwork';
  2 +import { NavigationBodyDTO } from './bean/NavigationBodyDTO';
  3 +import { PageDTO } from './bean/PageDTO';
  4 +
  5 +export class PageRepository {
  6 +
  7 + static fetchNavigationDataApi(url: string) {
  8 + return WDHttp.get<ResponseDTO<NavigationBodyDTO>>(url)
  9 + };
  10 +
  11 + static fetchPageData(url: string) {
  12 + return WDHttp.get<ResponseDTO<PageDTO>>(url)
  13 + };
  14 +}
  1 +import { Params } from './Params';
  2 +
  3 +// 事件对象
  4 +export interface Action {
  5 + type: string;
  6 + params?: Params; // 参数集合
  7 +}
  1 +import { TopNavDTO } from './TopNavDTO';
  2 +
  3 +/**
  4 + * 底导(包含顶导列表)数据
  5 + */
  6 +export interface BottomNavDTO {
  7 + backgroundUrl: string;
  8 + channelChooseActionUrl: string;
  9 + channelChooseCColor: string;
  10 + channelChooseColor: string;
  11 + channelMoreColor: string;
  12 + extraData: string;
  13 + homePageColor: string;
  14 + icon: string;
  15 + iconC: string;
  16 + id: number;
  17 + immersiveIconCUrl: string;
  18 + immersiveIconUrl: string;
  19 + immersiveNameCColor: string;
  20 + immersiveNameColor: string;
  21 + logoUrl: string;
  22 + morningAndEveningUrl: string;
  23 + name: string;
  24 + nameCColor: string;
  25 + nameColor: string;
  26 + nightIconCUrl: string;
  27 + nightIconUrl: string;
  28 + nightNameCColor: string;
  29 + nightNameColor: string;
  30 + noticeColor: string;
  31 + pageId?: string;
  32 + pageType?: string;
  33 + searchBothColor: string;
  34 + searchUrl: string;
  35 + sortValue: number;
  36 + statusBarColor: number;
  37 + topNavChannelList: TopNavDTO[];
  38 + topStyle: string;
  39 + type: string;
  40 +}
  1 +import { ContentDTO } from './ContentDTO';
  2 +
  3 +export interface CompDTO {
  4 + backgroundColor: string;
  5 + backgroundImgUrl: string;
  6 + cityCode: string;
  7 + compStyle: string;
  8 + compType: string;
  9 + // dataSourceRequest: any[];
  10 + districtCode: string;
  11 + extraData?: string;
  12 + hasAdInfo: number;
  13 + id: number;
  14 + imgSize: string;
  15 + innerUrl: string;
  16 + linkUrl: string;
  17 + // meddleDataList: any[];
  18 + name: string;
  19 + objectId: string; // 跳转页面id?
  20 + objectTitle: string; // comp标题
  21 + // objectType?: any; // 跳转类型,枚举:
  22 + operDataList: ContentDTO[]; // 运营数据列表【正常运营配置的强运营数据,部分推荐场景的配置(自动源兜底数据)】
  23 + // pageId?: any;
  24 + posterSize: string;
  25 + posterUrl: string;
  26 + provinceCode: string;
  27 + sortValue: number;
  28 + subType: string;
  29 +}
  1 +export interface ContentDTO {
  2 + cityCode: string;
  3 + coverSize: string;
  4 + coverType: number;
  5 + coverUrl: string;
  6 + description: string;
  7 + districtCode: string;
  8 + endTime: string;
  9 + hImageUrl: string;
  10 + heatValue: string;
  11 + innerUrl: string;
  12 + landscape: number;
  13 + // lengthTime?: any;
  14 + linkUrl: string;
  15 + openLikes: number;
  16 + openUrl: string;
  17 + pageId: string;
  18 + // playUrls: any[];
  19 + programAuth: string;
  20 + programId: string;
  21 + programName: string;
  22 + programSource: number;
  23 + programType: number;
  24 + provinceCode: string;
  25 + // rankingList: any[];
  26 + showTitleEd: string;
  27 + showTitleIng: string;
  28 + showTitleNo: string;
  29 + // sortValue?: any;
  30 + startTime: string;
  31 + subType: string;
  32 + subtitle: string;
  33 + title: string;
  34 + vImageUrl: string;
  35 + screenType: string;
  36 +}
  1 +import { ItemDTO } from './ItemDTO';
  2 +
  3 +/**
  4 + * 绑定到组件comp/view的数据Bean
  5 + */
  6 +@Observed
  7 +// export abstract class ItemBean<DTO> implements Mapper<DTO> {
  8 +export abstract class ItemBean {
  9 + action?: Action; // 事件行为
  10 + actionId?: string; // 点击事件id
  11 + pics?: Pic
  12 + // h5pics?: Pic;
  13 + landscapeCover?: string; // 横向低分辨封面图片
  14 + portraitCover?: string; // 竖向低分辨封面图片
  15 + highLandscapeCover?: string; // 横向高分辨封面图片
  16 + highPortraitCover?: string; // 竖向高分辨封面图片
  17 + lowResolutionV34?: string; // 低清竖图(3:4比例), 取图逻辑 3:4低清竖图-->3:4高清竖图-->低分辨率竖图-->高分辨率竖图
  18 + highResolutionV34?: string; // 高清竖图(3:4比例), 取图逻辑 3:4高清竖图-->3:4低清竖图-->高分辨率竖图-->低分辨率竖图
  19 + /**
  20 + * 是否被曝光
  21 + */
  22 + exposed: boolean;
  23 + /**
  24 + * 曝光位置
  25 + */
  26 + position: string;
  27 +
  28 + constructor(dto?: ItemDTO) {
  29 + if (dto) {
  30 + this.action = dto.action
  31 + this.actionId = dto.actionId
  32 + this.pics = dto.pics
  33 + // this.h5pics = dto.h5pics
  34 +
  35 + this.landscapeCover = !dto.pics ? "" : !dto.pics.lowResolutionH ? dto.pics.highResolutionH : dto.pics.lowResolutionH;
  36 + this.portraitCover = !dto.pics ? "" : !dto.pics.lowResolutionV ? dto.pics.highResolutionV : dto.pics.lowResolutionV;
  37 + this.highLandscapeCover = !dto.pics ? "" : !dto.pics.highResolutionH ? dto.pics.lowResolutionH : dto.pics.highResolutionH;
  38 + this.highPortraitCover = !dto.pics ? "" : !dto.pics.highResolutionV ? dto.pics.lowResolutionV : dto.pics.highResolutionV;
  39 +
  40 + this.lowResolutionV34 = !dto.pics ? "" : (!dto.pics.lowResolutionV34 ? dto.pics.lowResolutionV34 : (!dto.pics.highResolutionV34 ? dto.pics.highResolutionV34 : this.portraitCover));
  41 + this.highResolutionV34 = !dto.pics ? "" : (!dto.pics.highResolutionV34 ? dto.pics.highResolutionV34 : (!dto.pics.lowResolutionV34 ? dto.pics.lowResolutionV34 : this.highPortraitCover));
  42 + }
  43 + this.exposed = false
  44 + this.position = "0"
  45 + }
  46 +
  47 + public setAction(action: Action): void {
  48 + this.action = action
  49 + }
  50 +
  51 + public getAction(): Action {
  52 + return this.action ?? {} as Action
  53 + }
  54 +}
  1 +import { Action } from './Action';
  2 +
  3 +/**
  4 + * 组件comp/view对应的服务端数据
  5 + * DTO 数据传输实体类接口,所有数据传输层数据结构体需实现该接口
  6 + */
  7 +export interface ItemDTO {
  8 + action?: Action; // 事件对象
  9 + actionId?: string; // 点击事件id
  10 + // pics?: Pic // 图片
  11 +}
  1 +import { BottomNavDTO } from './BottomNavDTO';
  2 +
  3 +/**
  4 + * 导航Body数据
  5 + */
  6 +export interface NavigationBodyDTO {
  7 + backgroundColor: string;
  8 + bottomNavList: BottomNavDTO[];
  9 + // greyBottomNav: GreyBottomNav;
  10 + immersiveBackgroundColor: string;
  11 + nightBackgroundColor: string;
  12 +}
  1 +import { CompDTO } from './CompDTO';
  2 +
  3 +/**
  4 + * Page数据DTO
  5 + */
  6 +export interface PageDTO {
  7 + pageId: string; // 页面id
  8 + id: number; // 楼层id
  9 + name: string; // 名称
  10 + branchMark: boolean;
  11 + compList: CompDTO[]; // Components集合的布局信息
  12 +}
  1 +import { ExtraDTO } from './extra/ExtraDTO';
  2 +
  3 +// Params定义-----------根据不同Type类型可定制指定参数
  4 +export interface Params {
  5 + // 跳转目标页面ID
  6 + pageID: string;
  7 + path?: string; // 需要跳转/刷新的内部路径,这个路径可以是pageID,也可是compID
  8 + url?: string; // 需要跳转到的URL地址/H5打开链接
  9 + extra?: ExtraDTO; // 跳转时额外需要带的参数:map<String,String> 即仅有一层的json
  10 +}
  1 +/**
  2 + * 顶导
  3 + */
  4 +export interface TopNavDTO {
  5 + channelId: number;
  6 + channelStyle: number;
  7 + channelType: number;
  8 + defaultPermitted: number;
  9 + delPermitted: number;
  10 + fontCColor: string;
  11 + fontColor: string;
  12 + headlinesOn: number;
  13 + homeChannel: string;
  14 + iconCUrl: string;
  15 + iconCUrlSize: string;
  16 + iconUrl: string;
  17 + iconUrlSize: string;
  18 + localChannel: string;
  19 + moreChannel: string;
  20 + movePermitted: number;
  21 + myChannel: string;
  22 + name: string;
  23 + num: number;
  24 + pageId: number;
  25 + pageType: string;
  26 + underlineCColor: string;
  27 +}
  1 +import { ItemDTO } from '../ItemDTO';
  2 +import { LabelDTO } from './LabelDTO';
  3 +
  4 +// 附加字段集合,不同组件,额外附加参数不同
  5 +export interface ExtraDTO extends ItemDTO {
  6 + labels?: LabelDTO[];
  7 +}
  1 +import { ItemBean } from '../../ItemBean';
  2 +import { LabelDTO } from './LabelDTO';
  3 +
  4 +@Observed
  5 +export class LabelBean extends ItemBean {
  6 + titleIconUrl?: string;
  7 + title: string;
  8 +
  9 + constructor(dto: LabelDTO) {
  10 + super(dto);
  11 + this.titleIconUrl = dto.titleIconUrl;
  12 + this.title = dto.title;
  13 + }
  14 +}
  1 +import { ItemDTO } from '../ItemDTO';
  2 +
  3 +/**
  4 + * 标题 —— 标题(LABEL)
  5 + */
  6 +export interface LabelDTO extends ItemDTO {
  7 + titleIconUrl?: string; // icon图片/小图标
  8 + title: string; // 标题,如:重磅推荐/热门视频彩铃/更多下饭剧/4K超高清/更多>/更多动画
  9 +}
  1 +import { Logger } from 'wdKit';
  2 +import { LabelDTO } from '../repository/bean/extra/LabelDTO';
  3 +
  4 +const TAG: string = 'CompCornerUtil';
  5 +
  6 +/**
  7 + * 与组件布局(边距/间距/圆角半径)相关的数字
  8 + */
  9 +export class CompUtils {
  10 + /**
  11 + * The max lines.
  12 + */
  13 + public static readonly MAX_LINES_1: number = 1;
  14 + public static readonly MAX_LINES_2: number = 2;
  15 + public static readonly MAX_LINES_3: number = 3;
  16 +
  17 + /**
  18 + * 获取Label标题
  19 + *
  20 + * @param component 组件bean
  21 + * @return Label标题
  22 + */
  23 + static getLabelTitle(extraData?: string): string {
  24 + if (!extraData) {
  25 + return ""
  26 + }
  27 + let labelDTO = JSON.parse(extraData) as LabelDTO
  28 + if (!labelDTO) {
  29 + Logger.info(TAG, 'getLabelTitle, labels is null');
  30 + return ""
  31 + }
  32 +
  33 +
  34 + return labelDTO.title ?? "";
  35 + }
  36 +}
  1 +import { Logger, ResourcesUtils } from 'wdKit';
  2 +import { ResponseDTO, } from 'wdNetwork';
  3 +import { PageRepository } from '../repository/PageRepository';
  4 +import http from '@ohos.net.http';
  5 +import { NavigationBodyDTO } from '../repository/bean/NavigationBodyDTO';
  6 +import { BottomNavDTO } from '../repository/bean/BottomNavDTO';
  7 +import { PageDTO } from '../repository/bean/PageDTO';
  8 +
  9 +const TAG = 'PageViewModel';
  10 +
  11 +/**
  12 + * 处理返回后的数据
  13 + */
  14 +export class PageViewModel {
  15 + /**
  16 + * get Nav Data from Resource .
  17 + *
  18 + * @return BottomNavBean[] Nav Data List
  19 + */
  20 + static async getBottomNavData(context: Context): Promise<BottomNavDTO[]> {
  21 + Logger.info(TAG, `getBottomNavData start`);
  22 + let compRes: ResponseDTO<NavigationBodyDTO> | null = await ResourcesUtils.getResourcesJson<ResponseDTO<NavigationBodyDTO>>(context, 'bottom_nav.json');
  23 + if (!compRes || !compRes.data || !compRes.data.bottomNavList) {
  24 + Logger.info(TAG, `getBottomNavData compRes bottomNavList is empty`);
  25 + return []
  26 + }
  27 + Logger.info(TAG, `getBottomNavData getResourcesJsonSync compRes : ${JSON.stringify(compRes)}`);
  28 + return compRes.data.bottomNavList
  29 + }
  30 +
  31 + static getNavData(url: string): Promise<NavigationBodyDTO> {
  32 + return new Promise<NavigationBodyDTO>((success, error) => {
  33 + Logger.info(TAG, `getNavData start`);
  34 + PageRepository.fetchNavigationDataApi(url).then((navResDTO: ResponseDTO<NavigationBodyDTO>) => {
  35 + if (!navResDTO) {
  36 + Logger.error(TAG, 'getNavData then navResDTO is empty');
  37 + error('navResDTO is empty');
  38 + return
  39 + }
  40 + if (navResDTO.code != http.ResponseCode.OK) {
  41 + Logger.error(TAG, `getNavData then code:${navResDTO.code}, message:${navResDTO.message}`);
  42 + error('navResDTO Response Code is failure');
  43 + return
  44 + }
  45 + if (!navResDTO.data?.bottomNavList) {
  46 + error('navResDTO list is empty');
  47 + return
  48 + }
  49 + // let navResStr = JSON.stringify(navResDTO);
  50 + Logger.info(TAG, "getNavData then,navResDTO.timeStamp:" + navResDTO.timestamp);
  51 + let navigationBean = navResDTO.data
  52 + success(navigationBean);
  53 + }).catch((err: Error) => {
  54 + Logger.error(TAG, `fetchNavigationDataApi catch, error.name : ${err.name}, error.message:${err.message}`);
  55 + error(err);
  56 + })
  57 + })
  58 + }
  59 +
  60 + /**
  61 + * Get PageDTO data.
  62 + *
  63 + * @return {GroupDTO} compRes.data
  64 + */
  65 + static async getPageData1(context: Context): Promise<PageDTO> {
  66 + let compRes: ResponseDTO<PageDTO> | null = await ResourcesUtils.getResourcesJson<ResponseDTO<PageDTO>>(context, 'comp_list0.json');
  67 + if (!compRes || !compRes.data) {
  68 + Logger.info(TAG, `getCompList compRes is empty`);
  69 + return {} as PageDTO
  70 + }
  71 + Logger.info(TAG, `getCompList getResourcesJson compRes : ${JSON.stringify(compRes)}`);
  72 + return compRes.data
  73 + }
  74 +
  75 + /**
  76 + * Get Group data.
  77 + *
  78 + * @return {GroupDTO} compRes.data
  79 + */
  80 + static async getPageData2(context: Context): Promise<PageDTO> {
  81 + let compRes: ResponseDTO<PageDTO> | null = await ResourcesUtils.getResourcesJson<ResponseDTO<PageDTO>>(context, 'comp_list2.json');
  82 + if (!compRes || !compRes.data) {
  83 + Logger.info(TAG, `getCompList compRes is empty`);
  84 + return {} as PageDTO
  85 + }
  86 + Logger.info(TAG, `getCompList getResourcesJson compRes : ${JSON.stringify(compRes)}`);
  87 + return compRes.data
  88 + }
  89 +
  90 +
  91 + static getPageData(url: string): Promise<PageDTO> {
  92 + return new Promise<PageDTO>((success, error) => {
  93 + PageRepository.fetchPageData(url).then((resDTO: ResponseDTO<PageDTO>) => {
  94 + if (!resDTO) {
  95 + Logger.error(TAG, 'getPageData then resDTO is empty');
  96 + error("page data is empty");
  97 + return
  98 + }
  99 + if (resDTO.code != http.ResponseCode.OK || !resDTO.data) {
  100 + Logger.error(TAG, `getPageData then code:${resDTO.code}, message:${resDTO.message}`);
  101 + error(`get page data error code:${resDTO.code}, message:${resDTO.message}`);
  102 + return
  103 + }
  104 + Logger.info(TAG, "getPageData then,resDTO.timeStamp:" + resDTO.timestamp);
  105 + success(resDTO.data);
  106 + }).catch((err: Error) => {
  107 + Logger.error(TAG, `getPageData catch, error.name : ${err.name}, error.message:${err.message}`);
  108 + error(err);
  109 + })
  110 + })
  111 + }
  112 +}
  113 +
  114 +
  115 +
  116 +let pageViewModel = new PageViewModel();
  117 +
  118 +export default pageViewModel as PageViewModel;
  1 +{
  2 + "module": {
  3 + "name": "wdComponent",
  4 + "type": "shared",
  5 + "description": "$string:shared_desc",
  6 + "deviceTypes": [
  7 + "phone",
  8 + "tablet"
  9 + ],
  10 + "deliveryWithInstall": true
  11 + }
  12 +}
  1 +{
  2 + "color": [
  3 + {
  4 + "name": "white",
  5 + "value": "#FFFFFF"
  6 + },
  7 + {
  8 + "name": "color_333333",
  9 + "value": "#333333"
  10 + },
  11 + {
  12 + "name": "color_666666",
  13 + "value": "#666666"
  14 + },
  15 + {
  16 + "name": "color_999999",
  17 + "value": "#999999"
  18 + },
  19 + {
  20 + "name": "color_FE4B05",
  21 + "value": "#FE4B05"
  22 + }
  23 + ]
  24 +}
  1 +{
  2 + "float": [
  3 + {
  4 + "name": "font_size_10",
  5 + "value": "10fp"
  6 + },
  7 + {
  8 + "name": "font_size_11",
  9 + "value": "11fp"
  10 + },
  11 + {
  12 + "name": "font_size_12",
  13 + "value": "11fp"
  14 + },
  15 + {
  16 + "name": "font_size_14",
  17 + "value": "14fp"
  18 + },
  19 + {
  20 + "name": "font_size_16",
  21 + "value": "16fp"
  22 + },
  23 + {
  24 + "name": "normal_text_size",
  25 + "value": "16fp"
  26 + },
  27 + {
  28 + "name": "selected_text_size",
  29 + "value": "18fp"
  30 + },
  31 + {
  32 + "name": "font_size_24",
  33 + "value": "24fp"
  34 + },
  35 +
  36 + {
  37 + "name": "main_margin",
  38 + "value": "14vp"
  39 + },
  40 + {
  41 + "name": "margin_8",
  42 + "value": "8vp"
  43 + },
  44 + {
  45 + "name": "label_margin_top",
  46 + "value": "10vp"
  47 + },
  48 + {
  49 + "name": "margin_bottom_16",
  50 + "value": "16vp"
  51 + },
  52 + {
  53 + "name": "label_margin_bottom",
  54 + "value": "8vp"
  55 + },
  56 + {
  57 + "name": "single_row_03_item_width",
  58 + "value": "158vp"
  59 + },
  60 + {
  61 + "name": "single_row_03_item_height",
  62 + "value": "160vp"
  63 + },
  64 + {
  65 + "name": "single_row_03_img_height",
  66 + "value": "88vp"
  67 + },
  68 + {
  69 + "name": "image_border_radius",
  70 + "value": "8vp"
  71 + },
  72 + {
  73 + "name": "border_radius_6",
  74 + "value": "6vp"
  75 + },
  76 + {
  77 + "name": "bottom_navigation_margin_bottom",
  78 + "value": "4vp"
  79 + },
  80 + {
  81 + "name": "bottom_navigation_barHeight",
  82 + "value": "50vp"
  83 + },
  84 + {
  85 + "name": "top_tab_bar_height",
  86 + "value": "40vp"
  87 + },
  88 + {
  89 + "name": "top_tab_item_max_width",
  90 + "value": "300vp"
  91 + },
  92 + {
  93 + "name": "top_tab_item_min_width",
  94 + "value": "20vp"
  95 + },
  96 + {
  97 + "name": "top_tab_item_padding_horizontal",
  98 + "value": "7vp"
  99 + },
  100 + {
  101 + "name": "top_tab_item_padding_bottom",
  102 + "value": "5vp"
  103 + },
  104 + {
  105 + "name": "top_tab_item_padding_top",
  106 + "value": "2vp"
  107 + }
  108 + ]
  109 +}
  1 +{
  2 + "string": [
  3 + {
  4 + "name": "shared_desc",
  5 + "value": "基础自定义组件库"
  6 + },
  7 + {
  8 + "name": "footer_text",
  9 + "value": "已经到底了"
  10 + }
  11 + ]
  12 +}
  1 +/node_modules
  2 +/oh_modules
  3 +/.preview
  4 +/build
  5 +/.cxx
  6 +/.test
  1 +{
  2 + "apiType": 'stageMode',
  3 + "buildOption": {
  4 + },
  5 + "targets": [
  6 + {
  7 + "name": "default",
  8 + "runtimeOS": "HarmonyOS"
  9 + }
  10 + ]
  11 +}
  1 +// Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently.
  2 +module.exports = require('@ohos/hvigor-ohos-plugin').hspTasks
  1 +{
  2 + "name": "wdconstant",
  3 + "version": "1.0.0",
  4 + "description": "Please describe the basic information.",
  5 + "main": "./src/main/ets/Index.ets",
  6 + "author": "",
  7 + "license": "Apache-2.0",
  8 + "dependencies": {
  9 + }
  10 +}
  1 +export { CommonConstants } from './constants/CommonConstants';
  2 +
  3 +export { ConfigConstants } from './constants/ConfigConstants';
  4 +
  5 +// enum
  6 +export { BottomNavi } from './enum/BottomNavi';
  7 +
  8 +export { CompStyle } from './enum/CompStyle';
  9 +
  10 +export { CompType } from './enum/CompType';
  11 +
  12 +export { NetDataStatusType } from './enum/NetDataStatusType';
  13 +
  14 +export { ViewType } from './enum/ViewType';
  15 +
  16 +export { DurationEnum } from './enum/DurationEnum';
  1 +/**
  2 + * The constant of Common.
  3 + */
  4 +export class CommonConstants {
  5 + // offset
  6 + static readonly ZERO: number = 0;
  7 + static readonly NO_INDEX: number = -1;
  8 + static readonly NO_LENGTH: number = 0;
  9 +
  10 + /**
  11 + * 布局相关.
  12 + */
  13 + static readonly FULL_PARENT: string = '100%';
  14 + static readonly FULL_WIDTH: string = '100%';
  15 + static readonly FULL_HEIGHT: string = '100%';
  16 +
  17 + /**
  18 + * Component opacity value: 1.
  19 + */
  20 + static readonly FULL_OPACITY: number = 1;
  21 +}
  22 +;
  23 +
  1 +/**
  2 + * Config Constants.
  3 + */
  4 +export class ConfigConstants {
  5 + /**
  6 + * 应用id/appId
  7 + *
  8 + */
  9 + static readonly appId: string = "";
  10 + /**
  11 + * 终端id/terminalId
  12 + *
  13 + */
  14 + static readonly terminalId: string = "android";
  15 + /**
  16 + * 36_渠道编码(sappType)
  17 + *
  18 + */
  19 + // static readonly appType: string = "2"; // wap
  20 + static readonly appType: string = "3"; // 手机客户端App(安卓)
  21 +
  22 + static readonly clientType: string = "";
  23 + /**
  24 + * SourceID
  25 + *
  26 + */
  27 + static readonly sourceId: string = "";
  28 + /**
  29 + * 产品渠道应用对照关系:
  30 + */
  31 + static readonly appCode: string = "";
  32 + /**
  33 + * 基线代码和客户端应用版本号规范
  34 + */
  35 + static readonly ptvCode: string = "";
  36 + /**
  37 + * 省份code/province(02->上海)
  38 + */
  39 + static readonly province: string = "02";
  40 + /**
  41 + * 正在播放的节目ID
  42 + */
  43 + static playingContentId?: string = undefined
  44 + /**
  45 + * 设备Id/deviceId
  46 + * 设备Id或者能标识请求端的唯一标识
  47 + */
  48 + static readonly DEVICE_ID: string = "5bfed7be-0497-487f-990b-991e5b828a6e";
  49 + /**
  50 + * base url VOD
  51 + */
  52 + static readonly BASE_URL_VOD: string = "";
  53 + /**
  54 + * base url Live
  55 + */
  56 + static readonly BASE_URL_LIVE: string = "";
  57 + /**
  58 + * 获取用户信息的服务器
  59 + */
  60 + static readonly BASE_URL: string = "";
  61 + /**
  62 + * 内容列表路径
  63 + */
  64 + static readonly CONTENT_LIST_PATH: string = "/display/v4/static";
  65 + /**
  66 + * 电视台(直播)列表路径
  67 + */
  68 + static readonly LIVE_TV_PATH: string = "/live/v2/tv-data";
  69 + /**
  70 + * 临时的详情URL
  71 + */
  72 + static readonly DETAIL_URL = "https://pd-people-uat.pdnews.cn/h/contentTop/110?hiddenTopNavigation=true"
  73 +}
  1 +/**
  2 + * 常见图片宽/高比
  3 + */
  4 +export const enum AspectRatioEnum {
  5 + // 常见纵向比例
  6 + ASPECT_RATIO_2_3 = 2 / 3,
  7 + ASPECT_RATIO_3_4 = 3 / 4,
  8 + ASPECT_RATIO_4_5 = 4 / 5,
  9 + ASPECT_RATIO_5_7 = 5 / 7,
  10 + ASPECT_RATIO_9_16 = 9 / 16,
  11 + ASPECT_RATIO_10_16 = 10 / 16,
  12 + ASPECT_RATIO_9_21 = 9 / 21,
  13 +
  14 + // 正方形
  15 + ASPECT_RATIO_1_1 = 1 / 1,
  16 +
  17 + // 常见横向比例
  18 + ASPECT_RATIO_7_5 = 7 / 5,
  19 + ASPECT_RATIO_5_4 = 5 / 4,
  20 + ASPECT_RATIO_4_3 = 4 / 3,
  21 + ASPECT_RATIO_3_2 = 3 / 2,
  22 + ASPECT_RATIO_16_10 = 16 / 10,
  23 + ASPECT_RATIO_16_9 = 16 / 9,
  24 + ASPECT_RATIO_21_9 = 21 / 9,
  25 +
  26 + // 其他常见比例
  27 + ASPECT_RATIO_2_1 = 2 / 1, // banner图宽高比
  28 + ASPECT_RATIO_1_2 = 1 / 2,
  29 + ASPECT_RATIO_75_45 = 75 / 45, // 角标宽高比
  30 +}
  1 +/**
  2 + * 底部导航 Bottom navigation item的下标/索引
  3 + * 新闻 人民号、 视频、 服务、 我的
  4 + */
  5 +export const enum BottomNavi {
  6 + NEWS = 0,
  7 + PEOPLE,
  8 + VIDEO,
  9 + SERVICE,
  10 + MINE,
  11 +}
  1 +/**
  2 + * 组件Style/展示样式
  3 + */
  4 +export const enum CompStyle {
  5 + Label_03 = 'Label-03', // 标题卡:icon+文字
  6 + Carousel_Layout_01 = 'Carousel_Layout-01', // 通用轮播卡:视频、直播、活动、专题、榜单、外链
  7 + Carousel_Layout_02 = 'Carousel_Layout-02', // 直播轮播卡:直播
  8 + Single_Row_01 = 'Single_Row-01', // 三格方形小卡(排名):专题、活动
  9 + Single_Row_02 = 'Single_Row-02', // 通用横划卡:视频、直播、专题
  10 + Single_Row_03 = 'Single_Row-03', // 直播横划卡:直播
  11 + Single_Row_04 = 'Single_Row-04', // 三格方形小卡:专题、活动
  12 + Single_Row_05 = 'Single_Row-05', // 专题横划卡:视频、直播、专题、活动、榜单、外链
  13 + Single_Column_01 = 'Single_Column-01', // 大卡横屏视频:视频、直播
  14 + Single_Column_02 = 'Single_Column-02', // 活动卡:活动
  15 + Single_Column_03 = 'Single_Column-03', // 地域榜单:榜单
  16 + Single_Column_04 = 'Single_Column-04', // 大卡横屏(带背景):视频、直播
  17 + Single_Column_05 = 'Single_Column-05', // 海报图卡:/
  18 + Single_Column_06 = 'Single_Column-06', // 留言板卡:/
  19 + Grid_Layout_01 = 'Grid_Layout-01', // 横屏宫格卡:视频、直播
  20 + Grid_Layout_02 = 'Grid_Layout-02', // 竖屏宫格卡:视频、直播、榜单
  21 + Masonry_Layout_01 = 'Masonry_Layout-01', // 双列瀑布流/瀑布流卡:视频、直播、专题、活动
  22 +}
  1 +/**
  2 + * 组件Type/展示类型
  3 + */
  4 +export const enum CompType {
  5 + LABEL = 'LABEL', // 标题组件
  6 + CAROUSEL_LAYOUT = 'CAROUSEL_LAYOUT', // 轮播组件,即Banner/焦点图
  7 + SINGLE_ROW = 'SINGLE_ROW', // 单行组件
  8 + SINGLE_COLUMN = 'SINGLE_COLUMN', // 单列组件
  9 + GRID_LAYOUT = 'GRID_LAYOUT', // 网格组件
  10 + MASONRY_LAYOUT = 'MASONRY_LAYOUT', // 瀑布流组件
  11 +}
  1 +/**
  2 + * 时间跨度/延时枚举常量值
  3 + */
  4 +export const enum DurationEnum {
  5 + DURATION_MS_50 = 50, // 50毫秒
  6 + DURATION_MS_100 = 100, // 50毫秒
  7 + DURATION_MS_1000 = 1000, // 1秒/1000ms
  8 + DURATION_MS_1500 = 1500, // 1.5秒
  9 + DURATION_1 = 1000, // 1秒
  10 + DURATION_2 = 2000, // 2秒
  11 + DURATION_3 = 3000, // 3秒
  12 + DURATION_4 = 4000, // 4秒
  13 +}
  1 +/**
  2 + * 请求网络数据状态类型
  3 + */
  4 +export const enum NetDataStatusType {
  5 + // 已初始化,但尚未发出请求
  6 + INITIAL = 0,
  7 + // 请求已取消/或无需网络请求/或不关心请求结果/或调用方没有设置回调callback
  8 + CANCEL,
  9 + // 已发出请求,但请求尚未返回;
  10 + LOADING,
  11 + // 请求已失败返回;
  12 + FAILED,
  13 + // 请求已成功返回;
  14 + LOADED
  15 +}
  1 +/**
  2 + * view展示种类
  3 + */
  4 +export const enum ViewType {
  5 + // 已初始化,但尚未发出请求
  6 + INITIAL = 0,
  7 + // 加载中:已发出请求,但请求尚未返回;
  8 + LOADING,
  9 + // 数据加载失败(重试)/failure
  10 + ERROR,
  11 + // 结果为空/无数据/空view
  12 + EMPTY,
  13 + // 已加载结束/非失败/非空/可以是仅一页数据,即楼层数据列表PAGE_GROUP_LIST/
  14 + LOADED,
  15 + // 已加载的是tab导航数据(可嵌套page的楼层列表)
  16 + NAV_BAR
  17 +}
  1 +{
  2 + "module": {
  3 + "name": "wdConstant",
  4 + "type": "shared",
  5 + "description": "$string:shared_desc",
  6 + "deviceTypes": [
  7 + "phone",
  8 + "tablet"
  9 + ],
  10 + "deliveryWithInstall": true
  11 + }
  12 +}
  1 +{
  2 + "string": [
  3 + {
  4 + "name": "shared_desc",
  5 + "value": "description"
  6 + }
  7 + ]
  8 +}
  1 +/node_modules
  2 +/oh_modules
  3 +/.preview
  4 +/build
  5 +/.cxx
  6 +/.test
  1 +{
  2 + "apiType": 'stageMode',
  3 + "buildOption": {
  4 + },
  5 + "targets": [
  6 + {
  7 + "name": "default",
  8 + "runtimeOS": "HarmonyOS"
  9 + }
  10 + ]
  11 +}
  1 +// Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently.
  2 +module.exports = require('@ohos/hvigor-ohos-plugin').hspTasks
  1 +{
  2 + "license": "Apache-2.0",
  3 + "devDependencies": {},
  4 + "author": "",
  5 + "name": "wdkit",
  6 + "description": "Please describe the basic information.",
  7 + "main": "./src/main/ets/Index.ets",
  8 + "version": "1.0.0",
  9 + "dependencies": {}
  10 +}
  1 +export { Logger } from "./utils/Logger"
  2 +
  3 +export { ResourcesUtils } from './utils/ResourcesUtils'
  4 +
  5 +export { StringUtils } from './utils/StringUtils'
  6 +
  7 +export { CollectionUtils } from './utils/CollectionUtils';
  8 +
  9 +export { BasicDataSource } from './utils/BasicDataSource';
  10 +
  11 +export { LazyDataSource } from './utils/LazyDataSource'
  12 +
  1 +/**
  2 + * IDataSource处理数据侦听器的基本实现
  3 + */
  4 +export abstract class BasicDataSource<T> implements IDataSource {
  5 + private listeners: DataChangeListener[] = [];
  6 +
  7 + constructor() {
  8 + }
  9 +
  10 + // 获取数据总个数
  11 + public abstract totalCount(): number;
  12 +
  13 + // 获取索引对应的Item数据
  14 + public abstract getData(index: number): T | undefined;
  15 +
  16 + // 注册改变数据的控制器
  17 + public registerDataChangeListener(listener: DataChangeListener): void {
  18 + if (this.listeners.indexOf(listener) < 0) {
  19 + console.info('add DataChangeListener');
  20 + this.listeners.push(listener);
  21 + }
  22 + }
  23 +
  24 + // 注销改变数据的控制器
  25 + public unregisterDataChangeListener(listener: DataChangeListener): void {
  26 + const pos = this.listeners.indexOf(listener);
  27 + if (pos >= 0) {
  28 + console.info('remove DataChangeListener');
  29 + this.listeners.splice(pos, 1);
  30 + }
  31 + }
  32 +
  33 + // 通知控制器数据重新加载数据
  34 + public notifyDataReload(): void {
  35 + this.listeners.forEach(listener => {
  36 + listener.onDataReloaded();
  37 + })
  38 + }
  39 +
  40 + // 通知控制器数据增加
  41 + public notifyDataAdd(index: number): void {
  42 + this.listeners.forEach(listener => {
  43 + listener.onDataAdd(index);
  44 + })
  45 + }
  46 +
  47 + // 通知控制器数据位置变化
  48 + public notifyDataMove(from: number, to: number): void {
  49 + this.listeners.forEach(listener => {
  50 + listener.onDataMove(from, to);
  51 + })
  52 + }
  53 +
  54 + // 通知控制器数据删除
  55 + public notifyDataDelete(index: number): void {
  56 + this.listeners.forEach(listener => {
  57 + listener.onDataDelete(index);
  58 + })
  59 + }
  60 +
  61 + // 通知控制器数据变化
  62 + public notifyDataChange(index: number): void {
  63 + this.listeners.forEach(listener => {
  64 + listener.onDataChange(index);
  65 + })
  66 + }
  67 +}
  1 +export function add(a:number, b:number) {
  2 + return a + b;
  3 +}
  1 +import LinkList from '@ohos.util.List';
  2 +import HashMap from '@ohos.util.HashMap';
  3 +
  4 +/**
  5 + * CollectionUtils class.
  6 + */
  7 +
  8 +export class CollectionUtils {
  9 + /**
  10 + * The Array utils tag.
  11 + */
  12 + private static readonly TAG: string = 'CollectionUtils';
  13 +
  14 + /**
  15 + * Check collection is empty or not.
  16 + * @param collection any[]
  17 + * @returns {boolean} true(empty)
  18 + */
  19 + static isEmpty(collection?: any[]): boolean {
  20 + return !collection || collection.length === 0;
  21 + }
  22 +
  23 + // static isEmptyList<T>(list1?: LinkList<T>): boolean {
  24 + // return !list1 || list1.length === 0;
  25 + // }
  26 + //
  27 + // static isEmptyHashMap(obj?: HashMap<any, any>): boolean {
  28 + // if (!obj) {
  29 + // return true;
  30 + // }
  31 + // return obj.isEmpty();
  32 + // }
  33 + //
  34 + // static isEmptyMap(obj?: Map<any, any>): boolean {
  35 + // if (!obj) {
  36 + // return true;
  37 + // }
  38 + // return Object.keys(obj).length === 0 && obj.constructor === Object;
  39 + // }
  40 + //
  41 + // static isEmptyRecord(obj?: Record<string, string>): boolean {
  42 + // if (!obj) {
  43 + // return true;
  44 + // }
  45 + // return Object.keys(obj).length === 0 && obj.constructor === Object;
  46 + // }
  47 +
  48 + /**
  49 + * Check collection is empty or not.
  50 + * @param collection any[]
  51 + * @returns {boolean} true(not empty)
  52 + */
  53 + static isNotEmpty(collection?: any[]): boolean {
  54 + if (!collection) {
  55 + return false
  56 + }
  57 + return collection.length > 0;
  58 + }
  59 +
  60 + static getLength(collection?: any[]): number {
  61 + return CollectionUtils.isEmpty(collection) ? 0 : collection.length;
  62 + }
  63 +
  64 + static getElement(collection?: any[], index?: number): any {
  65 + if (CollectionUtils.isEmpty(collection) || index === undefined) {
  66 + return null;
  67 + }
  68 + return index >= 0 && index < collection.length ? collection[index] : null;
  69 + }
  70 +
  71 + static isArray(value: any): boolean {
  72 + if (typeof Array.isArray === 'function') {
  73 + return Array.isArray(value);
  74 + } else {
  75 + return Object.prototype.toString.call(value) === '[object Array]';
  76 + }
  77 + }
  78 +}
  79 +
  1 +/**
  2 + * 日期/时间工具
  3 + */
  4 +// let myDate = new Date();
  5 +// myDate.getTime() // 获取以毫秒为单位的时间值。
  6 +// myDate.getFullYear(); // 获取完整的年份(4位,1970-????)
  7 +// myDate.getMonth(); // 获取myDate月份(0-11,0代表1月)
  8 +// myDate.getDate(); // 获取myDate日期(1-31)
  9 +// myDate.getDay(); // 获取myDate星期X(0-6,0代表星期天)
  10 +// myDate.getTime(); // 获取myDate时间(从1970.1.1开始的毫秒数)
  11 +// myDate.getHours(); // 获取myDate小时数(0-23)
  12 +// myDate.getMinutes(); // 获取myDate分钟数(0-59)
  13 +// myDate.getSeconds(); // 获取myDate秒数(0-59)
  14 +// myDate.getMilliseconds(); // 获取myDate毫秒数(0-999)
  15 +// myDate.toLocaleDateString(); // 获取当前日期:使用当前或指定的区域设置将日期转换为字符串。
  16 +// myDate.toLocaleTimeString(); // 获取当前时间:使用当前或指定的区域设置将时间转换为字符串。
  17 +// myDate.toLocaleString(); // 获取日期与时间:使用当前或指定的区域设置将日期和时间转换为字符串
  18 +
  19 +// 日期时间的年月日时分秒以及毫秒的各个字段
  20 +export class Opt {
  21 + year: string = ''; // 年 小写y
  22 + month: string = ''; // 月 大写M
  23 + day: string = ''; // 日 小写d
  24 + hour: string = ''; // 时 大写H(24小时制)
  25 + // hh: string = ''; // 时 小写H(12小时制)
  26 + minute: string = ''; // 分 小写m
  27 + second: string = ''; // 秒 小写s
  28 + millisecond: string = ''; // 毫秒 大写S
  29 +}
  30 +
  31 +export class DateTimeUtils {
  32 + // 日期+时间格式
  33 + static readonly PATTERN_DATE_TIME_DEFAULT: string = 'yyyyMMddHHmmss'; // 年月日时分秒
  34 + static readonly PATTERN_DATE_TIME_HYPHEN: string = 'yyyy-MM-dd HH:mm:ss'; // 日期中包含连字符/中划线(HYPHEN),时间是以冒号(Colon)分割
  35 + static readonly PATTERN_DATE_TIME_HYPHEN_MS: string = 'yyyy-MM-dd HH:mm:ss.SSS'; // 日期中包含连字符/中划线(HYPHEN),时间是以冒号(Colon)分割
  36 + static readonly PATTERN_DATE_TIME_SLASH: string = 'yyyy/MM/dd HH:mm:ss'; // 日期中包含正斜杠(forward slash '/')
  37 + static readonly PATTERN_DATE_TIME_BACK_SLASH: string = 'yyyy\\MM\\dd HH:mm:ss'; // 日期中包含反斜杠(back slash '\')
  38 + static readonly PATTERN_DATE_TIME_DOT: string = 'yyyy.MM.dd HH:mm:ss'; // 日期中包含英文小圆点(DOT '.')
  39 + static readonly PATTERN_DATE_TIME_CN: string = 'yyyy年MM月dd日 HH:mm:ss'; // 日期中包含包含中文年月日
  40 + static readonly PATTERN_DATE_TIME_MS: string = 'yyyyMMddHHmmssSSS'; // 时间中包含毫秒
  41 + static readonly PATTERN_DATE_TIME_WITHOUT_SECOND: string = 'yyyyMMddHHmm'; // 时间中不包含秒
  42 + static readonly PATTERN_DATE_TIME_SIMPLIFY: string = 'MM/dd HH:mm'; // 精简的日期+时间(不包含年份和秒), 月/日 时:分
  43 +
  44 + // 仅日期格式(不包含时间)
  45 + static readonly PATTERN_DATE_DEFAULT: string = 'yyyyMMdd'; // 年月日
  46 + static readonly PATTERN_DATE_HYPHEN: string = 'yyyy-MM-dd'; // 日期中包含连字符/中划线(HYPHEN)
  47 + static readonly PATTERN_DATE_SLASH: string = 'yyyy/MM/dd'; // 日期中包含正斜杠(forward slash '/')
  48 + static readonly PATTERN_DATE_BACK_SLASH: string = 'yyyy\\MM\\dd'; // 日期中包含反斜杠(back slash '\')
  49 + static readonly PATTERN_DATE_DOT: string = 'yyyy.MM.dd'; // 日期中包含英文小圆点(DOT '.')
  50 + static readonly PATTERN_DATE_CN: string = 'yyyy年MM月dd日'; // 日期中包含包含中文年月日
  51 + static readonly PATTERN_DATE_SLASH_WITHOUT_YEAR: string = 'MM/dd'; // 日期中不包含年份
  52 + static readonly PATTERN_DATE_CN_WITHOUT_YEAR: string = 'MM月dd日'; // 日期中不包含年份,且month与day是中文
  53 +
  54 + // 仅时间格式(不包含日期)
  55 + static readonly PATTERN_TIME_DEFAULT: string = 'HHmmss'; // 时分秒
  56 + static readonly PATTERN_TIME_COLON: string = 'HH:mm:ss'; // 时间是以冒号(Colon)分割
  57 + static readonly PATTERN_TIME_MS: string = 'HHmmssSSS'; // 时间中包含毫秒
  58 + static readonly PATTERN_TIME_COLON_DOT_MS: string = 'HH:mm:ss.SSS'; // 时间是以冒号(Colon)与点号(DOT)分割,且包含毫秒
  59 + static readonly PATTERN_TIME_WITHOUT_SECOND: string = 'HHmm'; // 时间中不包含秒
  60 + static readonly PATTERN_TIME_COLON_WITHOUT_SECOND: string = 'HH:mm'; // 时间是以冒号(Colon)分割,且不包含秒
  61 + static readonly PATTERN_TIME_COLON_WITHOUT_HOUR: string = 'mm:ss'; // 时间是以冒号(Colon)分割,且不包含小时(分钟长度至少2位,可能是3位)
  62 +
  63 + static readonly RADIX: number = 60; // 时分秒的进制
  64 + static readonly MILLISECOND_PER_SECOND: number = 1000; // 1000毫秒每秒,秒与毫秒之间的转换进制
  65 +
  66 + // 周x
  67 + static readonly weeks1: string[] = ['周日', '周一', '周二', '周三', '周四', '周五', '周六'];
  68 + // 星期X
  69 + static readonly weeks2: string[] = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'];
  70 +
  71 + static readonly today: string = '今天';
  72 + static readonly yesterday: string = '昨天';
  73 + static readonly tomorrow: string = '明天';
  74 +
  75 + /**
  76 + * 获取当前日期:年月日
  77 + * 返回格式,默认如:yyyyMMdd,20230926
  78 + */
  79 + static getCurDate(format = DateTimeUtils.PATTERN_DATE_DEFAULT): string {
  80 + const DATETIME = new Date()
  81 + return DateTimeUtils.formatDate(DATETIME.getTime(), format)
  82 + }
  83 +
  84 + /**
  85 + * 获取当前时间:时分秒
  86 + * 返回格式,默认如:HHmmss,230559
  87 + */
  88 + static getCurTime(format = DateTimeUtils.PATTERN_TIME_DEFAULT): string {
  89 + const DATETIME = new Date()
  90 + return DateTimeUtils.formatDate(DATETIME.getTime(), format)
  91 + }
  92 +
  93 + /**
  94 + * 日期不足两位前面补充0
  95 + * @param value-数据值
  96 + */
  97 + static fill(value: number): string {
  98 + return (value > 9 ? '' : '0') + value
  99 + }
  100 +
  101 + /**
  102 + * 获取两个时间点的时间差
  103 + * @param milliseconds1
  104 + * @param milliseconds2
  105 + * @returns Duration
  106 + */
  107 + static getDuration(milliseconds1: number, milliseconds2: number): number {
  108 + let date1 = new Date(milliseconds1)
  109 + let date2 = new Date(milliseconds2)
  110 + let timeDiff = Math.abs(date2.getTime() - date1.getTime());
  111 + return timeDiff;
  112 + }
  113 +
  114 +
  115 + /**
  116 + * 格式化Duration时间
  117 + * @param duration 毫秒
  118 + * @returns 返回格式化后的Duration时间
  119 + */
  120 + static getFormattedDuration(duration: number): string {
  121 + // 也可以直接先除以1000转换为秒后再计算 // duration = duration/1000
  122 + // Math.floor 用于向下取整
  123 + let hour = Math.floor(duration / (1000 * 60 * 60))
  124 + // 用总毫秒数duration减去hour所对应的毫秒数差,再除以每分钟所占用的毫秒数
  125 + let minute = Math.floor((duration - hour * (1000 * 60 * 60)) / (1000 * 60));
  126 + // let second = Math.floor((duration - hour * (1000 * 60 * 60) - minute * (60 * 1000)) / 1000)
  127 + let second = Math.floor(duration / 1000) % 60; // 先除以1000,转换为秒;再对整分钟取余
  128 + if (hour > 0) {
  129 + return `${DateTimeUtils.fill(hour)}:${DateTimeUtils.fill(minute)}:${DateTimeUtils.fill(second)}`
  130 + }
  131 + return `${DateTimeUtils.fill(minute)}:${DateTimeUtils.fill(second)}`
  132 + }
  133 +
  134 + /**
  135 + * 格式化显示倒计时
  136 + * @param milliseconds 时间戳 毫秒
  137 + * @returns 返回格式化后的Duration时间
  138 + */
  139 + static getDurationToNow(milliseconds: number): string {
  140 + let nowDateTime = new Date();
  141 + let duration = milliseconds - nowDateTime.getTime();
  142 + if (duration < 0) {
  143 + duration = 0;
  144 + }
  145 + return DateTimeUtils.getFormattedDuration(duration)
  146 + }
  147 +
  148 + /**
  149 + * 根据日期/时间字符串反序列化对应的时间戳
  150 + * @param dateTimeString string 日期+时间字符串
  151 + * 列举字符串格式,如:
  152 + * 20231129,yyyyMMdd
  153 + * 20231126230559 yyyyMMddHHmmss
  154 + * 20231126230559729 yyyyMMddHHmmssSSS
  155 + * 2023-11-26 23:05:59.729, yyyy-MM-dd HH:mm:ss.SSS(先移除所有中划线和冒号及空格等非数字字符)
  156 + * @returns 转换后的时间戳:milliseconds 毫秒
  157 + */
  158 + static parseDate(dateTimeString?: string): number {
  159 + if (!dateTimeString) {
  160 + return 0
  161 + }
  162 + // 移除连字符/中划线(Hyphen/Strike)/移除冒号(Colon)/移除空白字符(包括空格、制表符、换行符等)/移除正斜杠(forward slash '/')/移除反斜杠(back slash '\')
  163 + // let regExp = new RegExp('(\d)(?=(\d{3})+\.)/g')
  164 + let regExpHyphen: RegExp = new RegExp('-', 'g');
  165 + let regExpSlash: RegExp = new RegExp('/', 'g');
  166 + let regExpBackSlash: RegExp = new RegExp(/\\/, 'g');
  167 + let regExpColon: RegExp = new RegExp(':', 'g');
  168 + let regExpBlank: RegExp = new RegExp('\s', 'g');
  169 + dateTimeString = dateTimeString.replace(regExpHyphen, '')
  170 + .replace(regExpSlash, '')
  171 + .replace(regExpBackSlash, '')
  172 + .replace(regExpColon, '')
  173 + .replace(regExpBlank, '');
  174 + if (dateTimeString.length < 8 || dateTimeString.length > 17) {
  175 + return 0
  176 + }
  177 + console.log("dateTimeString:" + dateTimeString)
  178 + // substring(startIndex: number, endIndex?: number): string:
  179 + // 返回从startIndex开始到endIndex(不包括)之间的子字符串。
  180 + // 如果省略endIndex,则返回从startIndex到字符串末尾的子字符串。
  181 + let year: number = Number.parseInt(dateTimeString.substring(0, 4));
  182 + console.log("year:" + year)
  183 + let month: number = Number.parseInt(dateTimeString.substring(4, 6)) - 1;
  184 + console.log("month:" + month)
  185 + let day: number = Number.parseInt(dateTimeString.substring(6, 8));
  186 + console.log("day:" + day)
  187 + if (dateTimeString.length < 10) {
  188 + return new Date(year, month, day).getTime();
  189 + }
  190 + let hours: number = Number.parseInt(dateTimeString.substring(8, 10));
  191 + console.log("hours:" + hours)
  192 + if (dateTimeString.length < 12) {
  193 + return new Date(year, month, day, hours).getTime();
  194 + }
  195 + let min: number = Number.parseInt(dateTimeString.substring(10, 12));
  196 + console.log("min:" + min)
  197 + if (dateTimeString.length < 14) {
  198 + return new Date(year, month, day, hours, min).getTime();
  199 + }
  200 + let sec: number = Number.parseInt(dateTimeString.substring(12, 14));
  201 + console.log("sec:" + sec)
  202 + if (dateTimeString.length < 17) {
  203 + return new Date(year, month, day, hours, min, sec).getTime();
  204 + }
  205 + let ms: number = Number.parseInt(dateTimeString.substring(14, 17));
  206 + console.log("ms:" + ms)
  207 + return new Date(year, month, day, hours, min, sec, ms).getTime();
  208 + }
  209 +
  210 + /**
  211 + * 把整数时间戳格式化为指定格式的日期+时间字符串
  212 + * @param timestamp:毫秒
  213 + * @param format 指定要格式化的pattern
  214 + * @returns 格式化后的字符串
  215 + */
  216 + static formatDate(timestamp: number, format = DateTimeUtils.PATTERN_DATE_HYPHEN): string {
  217 + let res = "";
  218 + try {
  219 + const date = new Date(timestamp);
  220 + const opt: Opt = {
  221 + year: date.getFullYear().toString(), // 年 小写y
  222 + month: (date.getMonth() + 1).toString(), // 月 大写M
  223 + day: date.getDate().toString(), // 日 小写d
  224 + hour: date.getHours().toString(), // 时 大写H(24小时制)
  225 + minute: date.getMinutes().toString(), // 分 小写m
  226 + second: date.getSeconds().toString(), // 秒 小写s
  227 + millisecond: date.getMilliseconds().toString() // 毫秒 大写S
  228 + };
  229 + const regKeys: string[] = ['y+', 'M+', 'd+', 'H+', 'm+', 's+', 'S+'];
  230 + for (let i = 0; i < regKeys.length; i++) {
  231 + const regKey = regKeys[i];
  232 + const reg = new RegExp(regKey);
  233 + let ret = reg.exec(format); // 使用 RegExp 的 match 或 exec 方法在目标字符串中查找匹配项
  234 + if (ret) {
  235 + switch (regKey) {
  236 + case 'y+':
  237 + format = format.replace(reg, ret[0].length <= opt.year.length ? opt.year : opt.year.padStart(ret[0].length, "0"));
  238 + break;
  239 + case 'M+':
  240 + format = format.replace(reg, ret[0].length < opt.month.length ? opt.month : opt.month.padStart(ret[0].length, "0"));
  241 + break;
  242 + case 'd+':
  243 + format = format.replace(reg, ret[0].length < opt.day.length ? opt.day : opt.day.padStart(ret[0].length, "0"));
  244 + break;
  245 + case 'H+':
  246 + format = format.replace(reg, ret[0].length < opt.hour.length ? opt.hour : opt.hour.padStart(ret[0].length, "0"));
  247 + break;
  248 + case 'm+':
  249 + format = format.replace(reg, ret[0].length < opt.minute.length ? opt.minute : opt.minute.padStart(ret[0].length, "0"));
  250 + break;
  251 + case 's+':
  252 + format = format.replace(reg, ret[0].length < opt.second.length ? opt.second : opt.second.padStart(ret[0].length, "0"));
  253 + break;
  254 + case 'S+':
  255 + format = format.replace(reg, ret[0].length < opt.millisecond.length ? opt.millisecond : opt.millisecond.padStart(ret[0].length, "0"));
  256 + break;
  257 + }
  258 + }
  259 + }
  260 + res = format;
  261 + } catch (error) {
  262 + console.error(`ERROR formatDate error: ${error}.`);
  263 + }
  264 + return res;
  265 + }
  266 +
  267 + /**
  268 + * 构造星期X/周X
  269 + * @param timestamp
  270 + * @returns
  271 + */
  272 + static buildDay(timestamp: number, weeks = this.weeks1): string {
  273 + try {
  274 + const date = new Date(timestamp);
  275 + let day = date.getDay()
  276 + let week = weeks[day];
  277 + return week
  278 + } catch (error) {
  279 + console.error(`ERROR formatDate error: ${error}.`);
  280 + }
  281 + }
  282 +
  283 + static startOfDay(argument: number): Date {
  284 + const _date = new Date(argument);
  285 + _date.setHours(0, 0, 0, 0);
  286 + return _date;
  287 + }
  288 +
  289 + static isSameDay(dateLeft: number, dateRight: number): boolean {
  290 + const dateLeftStartOfDay = this.startOfDay(dateLeft);
  291 + const dateRightStartOfDay = this.startOfDay(dateRight);
  292 + return +dateLeftStartOfDay === +dateRightStartOfDay;
  293 + }
  294 +
  295 + static addDays(argument: number, amount: number): Date {
  296 + const _date = new Date(argument);
  297 + if (amount == 0) {
  298 + return _date;
  299 + }
  300 + _date.setDate(_date.getDate() + amount);
  301 + return _date;
  302 + }
  303 +
  304 + static subDays(date: number, amount: number): Date {
  305 + return this.addDays(date, -amount);
  306 + }
  307 +
  308 + static isToday(date: number,): boolean {
  309 + return this.isSameDay(date, Date.now());
  310 + }
  311 +
  312 + static isYesterday(date: number): boolean {
  313 + return this.isSameDay(date, this.subDays(Date.now(), 1).getTime());
  314 + }
  315 +
  316 + static isTomorrow(date: number): boolean {
  317 + return this.isSameDay(date, this.addDays(Date.now(), 1).getTime());
  318 + }
  319 +}
  320 +
  321 +// const dateTimeUtils = new DateTimeUtils()
  1 +import util from '@ohos.util';
  2 +import deviceInfo from '@ohos.deviceInfo';
  3 +import { SPHelper } from './SPHelper';
  4 +
  5 +const TAG = 'DeviceUtil';
  6 +
  7 +/**
  8 + * 与(硬件)设备相关(不可改变或不可升级)属性或操作
  9 + */
  10 +export class DeviceUtil {
  11 + static async clientId() {
  12 + let uuid = await SPHelper.default.get("clientId", '');
  13 + if (uuid == '') {
  14 + uuid = util.generateRandomUUID();
  15 + await SPHelper.default.save("clientId", uuid);
  16 + }
  17 + return uuid.toString();
  18 + }
  19 +
  20 + /**
  21 + * 返回设备厂家名称
  22 + * HUAWEI
  23 + * @returns
  24 + */
  25 + static getManufacture(): string {
  26 + return deviceInfo.manufacture;
  27 + }
  28 +
  29 + /**
  30 + * 返回设备品牌名称
  31 + * HUAWEI MATE 40 PRO
  32 + * @returns
  33 + */
  34 + static getBrand(): string {
  35 + return deviceInfo.brand;
  36 + }
  37 +
  38 + /**
  39 + * 返回认证型号
  40 + * LIO-AL00
  41 + * @returns
  42 + */
  43 + static getProductModel(): string {
  44 + return deviceInfo.productModel;
  45 + }
  46 +
  47 + /**
  48 + * 返回产品版本
  49 + * OpenHarmony-3.2.6.5(Beta2)
  50 + * @returns
  51 + */
  52 + static getDisplayVersion(): string {
  53 + return deviceInfo.productModel;
  54 + }
  55 +}
  1 +import { BasicDataSource } from './BasicDataSource';
  2 +
  3 +/**
  4 + * 实现/BasicDataSource抽象类,用于懒数据加载
  5 + */
  6 +export class LazyDataSource<T> extends BasicDataSource<T> {
  7 + // private dataArray: Array<T> = new Array();
  8 + // private dataArray: Array<string> = new Array("0", "1", "2");
  9 + // private dataArray: string[] = ["0", "1", "2"];
  10 + private dataArray: T[] = [];
  11 +
  12 + constructor() {
  13 + super();
  14 + // for (let i = 0; i < 100; i++) {
  15 + // this.dataArray.push(i)
  16 + // }
  17 + }
  18 +
  19 + // 获取数据总个数
  20 + public totalCount(): number {
  21 + return this.dataArray.length;
  22 + }
  23 +
  24 + // 获取索引对应的Item数据
  25 + public getData(index: number): T {
  26 + return this.dataArray[index];
  27 + }
  28 +
  29 + // 获取索引对应的Item数据
  30 + public get(index: number): T {
  31 + return this.getData(index);
  32 + }
  33 +
  34 + // 获取所有数据
  35 + public getDataArray(): T[] {
  36 + return this.dataArray;
  37 + }
  38 +
  39 + // 增加/插入1个Item/数据,若index为undefined,则在数据尾部增加1个元素;否则,在指定索引(可为负/或大于数组长度)位置插入1个元素
  40 + public addItem(data: T, index?: number): void {
  41 + if (index == undefined) {
  42 + // 将新元素添加到数组的末尾
  43 + this.dataArray.push(data);
  44 + // this.dataArray.splice(this.dataArray.length, 0, data)
  45 + this.notifyDataAdd(this.dataArray.length - 1);
  46 + } else {
  47 + // 从数组中的index位置开始删除0个元素,并在同一位置插入((1个或多个))新元素,返回已删除的元素。
  48 + // 当index大于等于数组长度时,不删除任何数据,且data加在数组末尾
  49 + // 当index为负数时,其代表从数组后向前的索引位置
  50 + this.dataArray.splice(index, 0, data);
  51 + this.notifyDataAdd(index);
  52 + }
  53 + }
  54 +
  55 + // 在数据尾部增加1到多个元素
  56 + public push(...data: T[]): void {
  57 + this.dataArray.push(...data)
  58 + for (let index = this.dataArray.length - data.length; index < this.dataArray.length; index++) {
  59 + this.notifyDataAdd(index);
  60 + }
  61 + }
  62 +
  63 + // 增加一个同类型的LazyDataSource
  64 + public pushDataSource(data: LazyDataSource<T>): void {
  65 + this.push(...data.dataArray)
  66 + }
  67 +
  68 + // 在数据尾部增加1个元素
  69 + public addLastItem(data: T): void {
  70 + this.addItem(data)
  71 + }
  72 +
  73 + // 在数据开头插入1个元素
  74 + public addFirstItem(data: T): void {
  75 + // 在数组的开头插入(1个或多个)新元素
  76 + // this.dataArray.unshift(data)
  77 + // this.notifyDataAdd(0);
  78 + this.addItem(data, 0)
  79 + }
  80 +
  81 + // 在第2个元素位置,插入1个元素
  82 + public add2ndItem(data: T): void {
  83 + this.addItem(data, 1)
  84 + }
  85 +
  86 + // 在第3个元素位置,插入1个元素
  87 + public add3rdItem(data: T): void {
  88 + this.addItem(data, 2)
  89 + }
  90 +
  91 + // 在第4个元素位置,插入1个元素
  92 + public add4thItem(data: T): void {
  93 + this.addItem(data, 3)
  94 + }
  95 +
  96 + // 把from位置的item移动到to位置(暂不支持from/to为负数或大于等于数组长度)
  97 + public moveItem(from: number, to: number): void {
  98 + // 当from/to大于/等于数组长度时;
  99 + if (from >= this.dataArray.length) {
  100 + from = this.dataArray.length - 1;
  101 + }
  102 + if (to >= this.dataArray.length) {
  103 + to = this.dataArray.length - 1;
  104 + }
  105 + // 当from/to为负时;
  106 + let remainderFrom = from % this.dataArray.length
  107 + if (remainderFrom < 0) {
  108 + from = remainderFrom + this.dataArray.length
  109 + }
  110 + let remainderTo = to % this.dataArray.length
  111 + if (remainderTo < 0) {
  112 + to = remainderTo + this.dataArray.length
  113 + }
  114 +
  115 + // 1.把from位置元素提出暂存
  116 + let tempFrom: T = this.dataArray[from];
  117 + // 2.把to位置元素覆盖from位置元素,
  118 + let tempTo: T = this.dataArray[to];
  119 + this.updateItem(tempTo, from)
  120 + // 3.把暂存的from位置元素覆盖to位置元素
  121 + this.updateItem(tempFrom, to)
  122 + this.notifyDataMove(from, to);
  123 + }
  124 +
  125 + // 删除index指定索引位置的元素
  126 + public deleteItem(index?: number): void {
  127 + if (index == undefined) {
  128 + // 删除数组的最后1个元素(倒数第1个元素)
  129 + // this.dataArray.pop()
  130 + this.dataArray.splice(-1, 1)
  131 + this.notifyDataDelete(this.dataArray.length);
  132 + } else {
  133 + // 从数组中的index位置开始,删除1个元素
  134 + // 当index大于等于数组长度时,不删除任何数据
  135 + // 当index为负数时,其代表从数组后向前的索引位置
  136 + this.dataArray.splice(index, 1);
  137 + this.notifyDataDelete(index);
  138 + }
  139 + }
  140 +
  141 + // 删除最后1个元素
  142 + public pop(): void {
  143 + this.deleteItem()
  144 + }
  145 +
  146 + // 删除最后1个元素
  147 + public deleteLastItem(): void {
  148 + this.deleteItem()
  149 + }
  150 +
  151 + // 删除第1个元素
  152 + public deleteFirstItem(): void {
  153 + this.deleteItem(0)
  154 + }
  155 +
  156 + // 删除第1个元素
  157 + public delete1stItem(): void {
  158 + this.deleteItem(0)
  159 + }
  160 +
  161 + // 删除第2个元素
  162 + public delete2ndItem(): void {
  163 + this.deleteItem(1)
  164 + }
  165 +
  166 + // 删除第3个元素
  167 + public delete3rdItem(): void {
  168 + this.deleteItem(2)
  169 + }
  170 +
  171 + // 删除第4个元素
  172 + public delete4thItem(): void {
  173 + this.deleteItem(3)
  174 + }
  175 +
  176 + // 修改/更新index指定索引位置的元素
  177 + public updateItem(data: T, index?: number): void {
  178 + if (index == undefined || index >= this.dataArray.length) {
  179 + // 当不传index或index大于等于数组长度时,修改/更新数组的最后1个元素
  180 + this.dataArray.splice(this.dataArray.length - 1, 1, data);
  181 + this.notifyDataChange(this.dataArray.length);
  182 + } else {
  183 + // 从数组中的index位置开始,删除1个元素
  184 + // 当index为负数时,其代表从数组后向前的索引位置
  185 + this.dataArray.splice(index, 1, data);
  186 + this.notifyDataChange(index);
  187 + }
  188 + }
  189 +
  190 + // 修改/更新最后1个元素
  191 + public updateLastItem(data: T): void {
  192 + this.updateItem(data)
  193 + }
  194 +
  195 + // 修改/更新第1个元素
  196 + public updateFirstItem(data: T): void {
  197 + this.updateItem(data, 0)
  198 + }
  199 +
  200 + // 修改/更新第1个元素
  201 + public update2ndItem(data: T): void {
  202 + this.updateItem(data, 0)
  203 + }
  204 +
  205 + // 修改/更新第2个元素
  206 + public update1stItem(data: T): void {
  207 + this.updateItem(data, 1)
  208 + }
  209 +
  210 + // 修改/更新第3个元素
  211 + public update3rdItem(data: T): void {
  212 + this.updateItem(data, 2)
  213 + }
  214 +
  215 + // 修改/更新第4个元素
  216 + public update4thItem(data: T): void {
  217 + this.updateItem(data, 3)
  218 + }
  219 +
  220 + // 清空数组
  221 + public clear(): void {
  222 + this.replaceAll()
  223 + }
  224 +
  225 + // 把数据全部删除,再添加全部新元素
  226 + public replaceAll(...data: T[]): void {
  227 + // 从数组中的0位置开始删除dataArray.length个元素,并在同一位置插入((1个或多个))新元素,返回已删除的元素。
  228 + this.dataArray.splice(0, this.dataArray.length, ...data);
  229 + this.notifyDataReload()
  230 + }
  231 +
  232 + // 获取指定元素的下标
  233 + public getIndexOf(element: T): number {
  234 + for (let index = 0; index < this.dataArray.length; index++) {
  235 + if (this.dataArray[index] == element) {
  236 + return index
  237 + }
  238 + }
  239 + return -1
  240 + }
  241 +
  242 + isEmpty(): boolean {
  243 + return this.dataArray.length == 0
  244 + }
  245 +
  246 + isNotEmpty(): boolean {
  247 + return this.dataArray.length > 0
  248 + }
  249 +
  250 + sort(comparator: (firstValue: T, secondValue: T) => number): void {
  251 + this.dataArray.sort(comparator)
  252 + }
  253 +}
  1 +import hilog from '@ohos.hilog';
  2 +
  3 +/**
  4 + * Log level define
  5 + *
  6 + * @syscap SystemCapability.HiviewDFX.HiLog
  7 + */
  8 +enum LogLevel {
  9 + DEBUG = 3,
  10 + INFO = 4,
  11 + WARN = 5,
  12 + ERROR = 6,
  13 + FATAL = 7
  14 +}
  15 +
  16 +/**
  17 + * Common log for all features.
  18 + *
  19 + * @param {string} prefix Identifies the log tag.
  20 + */
  21 +export class Logger {
  22 + private static domain: number = 0xFF00;
  23 + private static prefix: string = 'PeopleDailyApp';
  24 + private static format: string = `%{public}s, %{public}s`;
  25 +
  26 + /**
  27 + * constructor.
  28 + *
  29 + * @param Prefix Identifies the log tag.
  30 + * @param domain Domain Indicates the service domain, which is a hexadecimal integer ranging from 0x0 to 0xFFFFF.
  31 + */
  32 + constructor(prefix: string = Logger.prefix, domain: number = Logger.domain) {
  33 + Logger.prefix = prefix;
  34 + Logger.domain = domain;
  35 + }
  36 +
  37 + static debug(...args: string[]) {
  38 + hilog.debug(Logger.domain, Logger.prefix, Logger.format, args);
  39 + }
  40 +
  41 + static info(...args: string[]) {
  42 + hilog.info(Logger.domain, Logger.prefix, Logger.format, args);
  43 + }
  44 +
  45 + static warn(...args: string[]) {
  46 + hilog.warn(Logger.domain, Logger.prefix, Logger.format, args);
  47 + }
  48 +
  49 + static error(...args: string[]) {
  50 + hilog.error(Logger.domain, Logger.prefix, Logger.format, args);
  51 + }
  52 +
  53 + static fatal(...args: string[]) {
  54 + hilog.fatal(Logger.domain, Logger.prefix, Logger.format, args);
  55 + }
  56 +
  57 + static isLoggable(level: LogLevel) {
  58 + hilog.isLoggable(Logger.domain, Logger.prefix, level);
  59 + }
  60 +}
  61 +
  62 +export default new Logger()
  1 +import buffer from '@ohos.buffer';
  2 +import { Logger } from './Logger';
  3 +
  4 +const TAG = "ResourcesUtils";
  5 +
  6 +// 默认针对entry/src/main/resources/rawfile目录下的文件:
  7 +const JSON_FILE_NAME = "agconnect-services.json";
  8 +
  9 +export class ResourcesUtils {
  10 + /**
  11 + * 获取资源字符串内容
  12 + * @param context
  13 + * @param filename 仅文件名(不包含路径,文件在src\main\resources\rawfile下),如:"agconnect-services.json",test.xml,
  14 + * @returns text 字符串
  15 + */
  16 + static getResourcesText(context: Context, filename: string): Promise<string> {
  17 + return new Promise((success, error) => {
  18 + Logger.info(TAG, "ResourcesUtils getResourcesText filename:" + filename);
  19 + context.resourceManager.getRawFileContent(filename).then((content: Uint8Array) => {
  20 + if (!content) {
  21 + Logger.warn(TAG, 'getResourcesText then content is empty');
  22 + error("file is empty");
  23 + return
  24 + }
  25 + try {
  26 + let text = buffer.from(content).toString("utf8");
  27 + if (text) {
  28 + Logger.info(TAG, "getResourcesText then text:" + text);
  29 + success(text);
  30 + } else {
  31 + Logger.warn(TAG, "getResourcesText then text is empty");
  32 + error("resources file text is empty");
  33 + }
  34 + } catch (err) {
  35 + // 转换异常
  36 + Logger.error(TAG, `getResourcesText catch err.: ${err}`);
  37 + }
  38 + }).catch((err: Error) => {
  39 + Logger.error(TAG, `getResourcesText getRawFileContent catch, error.name : ${err.name}, error.message:${err.message}`);
  40 + error(err);
  41 + })
  42 + })
  43 + }
  44 +
  45 + /**
  46 + * 获取资源文件并转为JSON
  47 + *
  48 + * @param appContext 上下文
  49 + * @param filename 仅文件名(不包含路径,文件在src\main\resources\rawfile下),如:"agconnect-services.json"
  50 + * SubscribeListData.json
  51 + * @returns JSON Object
  52 + *
  53 + * 调用方式:
  54 + * let compRes: MGHttp.ResponseDTO<BodyComponent> = await ResourcesUtils.getResourcesJson<MGHttp.ResponseDTO<BodyComponent>>(context, 'model/componentList.json');
  55 + */
  56 + static getResourcesJson<R>(context:Context, filename: string): Promise<R> {
  57 + Logger.info(TAG, `getResourcesJson filename: ${filename}`);
  58 + return new Promise<R>((resolve, reject) => {
  59 + ResourcesUtils.getResourcesText(context, filename)
  60 + .then((text: string) => {
  61 + try {
  62 + // let config: R = JSON.parse(text)
  63 + let config:R = JSON.parse(text) as R;
  64 + if (config) {
  65 + Logger.info(TAG, "getResourcesJson parse JSON file success.");
  66 + // Logger.info(TAG, `getResourcesJson config : ${JSON.stringify(config)}`);
  67 + resolve(config);
  68 + } else {
  69 + reject("getResourcesJson parse JSON file result is empty");
  70 + }
  71 + } catch (err) {
  72 + // json解析异常
  73 + Logger.error(TAG, `getResourcesJson catch parse failed.: ${err}`);
  74 + reject(err)
  75 + }
  76 + })
  77 + .catch((error:Error) => {
  78 + reject(error)
  79 + })
  80 + })
  81 + }
  82 +}
  1 +import data_preferences from '@ohos.data.preferences';
  2 +
  3 +/*
  4 +// SPHelper.default.get("key1", "defValue1").then((value1) => {
  5 +// this.message = value1.toString();
  6 +// })
  7 +
  8 +// let value2: string = await SPHelper.default.get("key2", "defValue2");
  9 +// this.message = result;
  10 +*
  11 +* 单例模式
  12 + */
  13 +export class SPHelper {
  14 + private static context: Context;
  15 + private static spFilename: string = '__SPHelper';
  16 +
  17 + static init(context: Context) {
  18 + SPHelper.context = context;
  19 + }
  20 +
  21 + static setSpFilename(spFilename: string) {
  22 + SPHelper.spFilename = spFilename;
  23 + }
  24 +
  25 + // 静态属性
  26 + static default: SPHelper = new SPHelper();
  27 +
  28 + // 私有构造函数
  29 + private constructor() {
  30 + }
  31 +
  32 + private async getVideoPreferences(): Promise<data_preferences.Preferences> {
  33 + let preferences: data_preferences.Preferences = await data_preferences.getPreferences(SPHelper.context, SPHelper.spFilename);
  34 + return preferences;
  35 + }
  36 +
  37 +
  38 + async save(key: string, value: data_preferences.ValueType) {
  39 + const preferences: data_preferences.Preferences = await this.getVideoPreferences();
  40 + await preferences.put(key, value)
  41 + await preferences.flush()
  42 + }
  43 +
  44 +
  45 + async get(key: string, defValue: data_preferences.ValueType): Promise<data_preferences.ValueType> {
  46 + const preferences: data_preferences.Preferences = await this.getVideoPreferences();
  47 + return await preferences.get(key, defValue);
  48 + }
  49 +
  50 + async has(key: string): Promise<boolean> {
  51 + const preferences: data_preferences.Preferences = await this.getVideoPreferences();
  52 + return await preferences.has(key);
  53 + }
  54 +
  55 +
  56 + async delete(key: string) {
  57 + const preferences: data_preferences.Preferences = await this.getVideoPreferences();
  58 + preferences.delete(key).then(async () => {
  59 + await preferences.flush();
  60 + }).catch((err: Error) => {
  61 + // Logger.error(TAG, 'Failed to delete the key. Cause: ' + err);
  62 + });
  63 + }
  64 +}
  1 +/**
  2 + * StringUtils class.
  3 + */
  4 +export class StringUtils {
  5 + /**
  6 + * The String utils tag.
  7 + */
  8 + private static readonly TAG: string = 'StringUtils';
  9 + // 评分-整数或浮点数
  10 + private static readonly SCORE_REG_EXP = RegExp(/^(\d+)(\.\d+)?$/);
  11 +
  12 + /**
  13 + * Check string is empty.
  14 + *
  15 + * @param {object} any
  16 + * @return {boolean} true(empty)
  17 + */
  18 + static isEmpty(...params: any): boolean {
  19 + if (params.length === 0) {
  20 + return true;
  21 + }
  22 + for (const param of params) {
  23 + if (!param) { // param === undefined || param === null || param === '';
  24 + return true;
  25 + }
  26 + }
  27 + return false;
  28 + }
  29 +
  30 + /**
  31 + * Check obj is not empty.
  32 + *
  33 + * @param {object} obj
  34 + * @return {boolean} true(not empty)
  35 + */
  36 + static isNotEmpty(obj: any): boolean {
  37 + // return (obj && obj !== '');
  38 + // 或
  39 + return (obj !== undefined && obj !== null && obj !== '');
  40 + }
  41 +
  42 +
  43 + static parseNumber(input: string): number {
  44 + // let input: string = '135' // 135
  45 + // let input: string = '135T' // NaN
  46 + // let input: string = 'ytr' // NaN
  47 + // let input: string = '' // 0
  48 + // let input: string = null // 0
  49 + // let input: string = undefined // NaN
  50 + const parsedInt = Number(input)
  51 + if (!isNaN(parsedInt)) {
  52 + return parsedInt
  53 + } else {
  54 + return 0
  55 + }
  56 + }
  57 +
  58 + static isScore(text: string): boolean {
  59 + return StringUtils.SCORE_REG_EXP.test(text);
  60 + }
  61 +}
  62 +
  63 +// export default new StringUtils();
  1 +{
  2 + "module": {
  3 + "name": "wdKit",
  4 + "type": "shared",
  5 + "description": "$string:shared_desc",
  6 + "deviceTypes": [
  7 + "phone",
  8 + "tablet"
  9 + ],
  10 + "deliveryWithInstall": true
  11 + }
  12 +}
  1 +{
  2 + "color": [
  3 + {
  4 + "name": "white",
  5 + "value": "#FFFFFF"
  6 + }
  7 + ]
  8 +}
  1 +{
  2 + "string": [
  3 + {
  4 + "name": "shared_desc",
  5 + "value": "description"
  6 + }
  7 + ]
  8 +}
  1 +/node_modules
  2 +/oh_modules
  3 +/.preview
  4 +/build
  5 +/.cxx
  6 +/.test
  1 +{
  2 + "apiType": 'stageMode',
  3 + "buildOption": {
  4 + },
  5 + "targets": [
  6 + {
  7 + "name": "default",
  8 + "runtimeOS": "HarmonyOS"
  9 + }
  10 + ]
  11 +}
  1 +// Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently.
  2 +module.exports = require('@ohos/hvigor-ohos-plugin').hspTasks
  1 +{
  2 + "lockfileVersion": 1,
  3 + "ATTENTION": "THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.",
  4 + "specifiers": {
  5 + "@ohos/axios@^2.1.1": "@ohos/axios@2.1.1"
  6 + },
  7 + "packages": {
  8 + "@ohos/axios@2.1.1": {
  9 + "resolved": "https://repo.harmonyos.com/ohpm/@ohos/axios/-/axios-2.1.1.har",
  10 + "integrity": "sha512-EQax257+eKKT0Rx7h6N6xvmKbDRWDjCCWOP2vyyktySFwvjtypXuXmQKEvRjmAalR6cqf8mbfhWmpg0bD9OQ3w=="
  11 + }
  12 + }
  13 +}
  1 +{
  2 + "name": "wdnetwork",
  3 + "version": "1.0.0",
  4 + "description": "Please describe the basic information.",
  5 + "main": "./src/main/ets/Index.ets",
  6 + "author": "",
  7 + "license": "Apache-2.0",
  8 + "dependencies": {
  9 + "@ohos/axios": "^2.1.1"
  10 + }
  11 +}
  1 +export { ResponseDTO } from "./bean/ResponseDTO"
  2 +
  3 +export { HttpRequest as WDHttp } from "./http/HttpRequest"
  1 +/**
  2 + * ResponseDTO
  3 + */
  4 +export interface ResponseDTO<T = string> {
  5 + success:boolean;
  6 +
  7 + // 服务请求响应值/微服务响应状态码”
  8 + code: number;
  9 +
  10 + // 服务请求响应说明
  11 + message: string;
  12 +
  13 + // 响应结果
  14 + data?: T;
  15 +
  16 + // 请求响应时间戳(unix格式)
  17 + timestamp?: number;
  18 +}
  1 +import type { AxiosError, AxiosInstance, AxiosResponse, InternalAxiosRequestConfig } from '@ohos/axios';
  2 +import axios, { HttpStatusCode } from '@ohos/axios';
  3 +
  4 +// import type ResponseDTO from '../models/ResponseDTO';
  5 +
  6 +// const key = 'xxxxyyyyzzz'
  7 +
  8 +// const apiBaseUrl = 'http://127.0.0.1:5566'
  9 +// const apiBaseUrl = "https://display-sc.miguvideo.com/display/v3/static";
  10 +// console.log("apiBaseUrl:" + apiBaseUrl);
  11 +// axios.defaults.baseURL = apiBaseUrl
  12 +
  13 +// 使跨域请求带上cookie等用户认证凭据
  14 +// axios.defaults.withCredentials = true;
  15 +
  16 +// 实例化axios
  17 +const instance: AxiosInstance = axios.create({
  18 + // axios请求基础URL(包括端口号)
  19 + // baseURL: apiBaseUrl,
  20 + // 单位毫秒
  21 + timeout: 15000,
  22 + // 跨域请求时,携带cookie等用户认证凭据
  23 + // withCredentials: true
  24 +});
  25 +
  26 +// 添加请求拦截器
  27 +instance.interceptors.request.use(
  28 + (config: InternalAxiosRequestConfig) => {
  29 + // 在发送请求之前
  30 + if (!config.headers["Content-Type"]) {
  31 + config.headers["Content-Type"] = "application/json;charset=utf-8";
  32 + }
  33 + // 公共请求参数
  34 + // config.params.key = key
  35 + return config;
  36 + },
  37 + (error: AxiosError) => {
  38 + // 请求错误
  39 + console.log(`全局请求失败拦截,message:${error.message}`)
  40 + return Promise.reject(error);
  41 + }
  42 +);
  43 +
  44 +// // GET /api/success
  45 +// {
  46 +// "code": 0,
  47 +// "message": "请求成功",
  48 +// "data": {
  49 +// "name": "管理员"
  50 +// }
  51 +// }
  52 +// // GET /api/fail
  53 +// {
  54 +// "code": -1,
  55 +// "message": "请求失败:XXX错误!",
  56 +// "data": null
  57 +// }
  58 +
  59 +// 添加响应拦截器
  60 +instance.interceptors.response.use(
  61 + // 响应拦截器response类型就是Axios.request<T = any, R = AxiosResponse<T>, D = any>中的泛型R
  62 + // 泛型 T 就是服务器返回数据的类型
  63 + // 泛型 R 就是这个泛型 T 数据经过 axios 包装一层得到的 response 对象的类型,而 request 方法的返回值是一个 Promise,其值就是成功态的 R,也就是 response对象。
  64 + (response: AxiosResponse) => {
  65 + // response为AxiosResponse类型,含有config\data\headers\request\status\statusText属
  66 + // console.dir(response)
  67 + // 正常响应,可对响应数据做通用处理
  68 + // 2xx 范围内的状态码都会触发该函数。
  69 + if (response.status === HttpStatusCode.Ok) {
  70 + // 直接返回response,当然你也可以只返回response.data
  71 + // return response;
  72 + // 也可以先解析服务器返回的状态码,可判断code处理通用逻辑
  73 + // const { code, message, data } = response.data
  74 + // if (code === 0) {
  75 + // // 将组件用的数据返回
  76 + // return data
  77 + // } else {
  78 + // // 处理业务错误。
  79 + // console.log(`处理业务,message:${message}`)
  80 + // return Promise.reject(new Error(message))
  81 + // }
  82 + // const data: ResponseBean<any> = response.data
  83 + // 改造返回的数据,即将AxiosResponse的data返回,服务端返回的数据
  84 + return response.data;
  85 + } else {
  86 + return Promise.reject(response);
  87 + }
  88 + },
  89 + (error: AxiosError) => {
  90 + // 异常响应
  91 + // console.log('全局响应失败拦截')
  92 + // console.log(error.request)
  93 + // console.log(error.response)
  94 + // 这里用来处理http常见错误,进行全局提示
  95 + let message = buildErrorMsg(error.response?.status);
  96 + // 错误消息可以使用全局弹框展示出来
  97 + console.log(`httpStatus:${error.response?.status}-${message},请检查网络或联系管理员!`)
  98 + return Promise.reject(error);
  99 + }
  100 +);
  101 +
  102 +export default instance;
  103 +
  104 +function buildErrorMsg(httpStatus: number):string {
  105 + let message = "";
  106 + switch (httpStatus) {
  107 + case HttpStatusCode.BadRequest:
  108 + message = "请求错误(400)";
  109 + break;
  110 + case HttpStatusCode.Unauthorized:
  111 + message = "未授权(或token 失效),请重新登录(401)";
  112 + // 可以触发退出的 action
  113 + // 可以做清空storage并跳转到登录页的操作
  114 + break;
  115 + case HttpStatusCode.Forbidden:
  116 + message = "拒绝访问(403)";
  117 + break;
  118 + case HttpStatusCode.NotFound:
  119 + message = "请求出错(404)";
  120 + // 请求地址错误
  121 + break;
  122 + case HttpStatusCode.RequestTimeout:
  123 + message = "请求超时(408)";
  124 + break;
  125 + case HttpStatusCode.InternalServerError:
  126 + message = "服务器错误(500)";
  127 + // 服务器故障
  128 + break;
  129 + case HttpStatusCode.NotImplemented:
  130 + message = "服务未实现(501)";
  131 + break;
  132 + case HttpStatusCode.BadGateway:
  133 + message = "网络错误(502)";
  134 + break;
  135 + case HttpStatusCode.ServiceUnavailable:
  136 + message = "服务不可用(503)";
  137 + break;
  138 + case HttpStatusCode.GatewayTimeout:
  139 + message = "网络超时(504)";
  140 + break;
  141 + case HttpStatusCode.HttpVersionNotSupported:
  142 + message = "HTTP版本不受支持(505)";
  143 + break;
  144 + default:
  145 + // 网络连接故障
  146 + message = `连接出错(${httpStatus})!`;
  147 + }
  148 + return message;
  149 +}
  1 +import type { AxiosError, AxiosRequestConfig} from '@ohos/axios';
  2 +import service from './AxiosRequest';
  3 +
  4 +export class HttpRequest {
  5 + // 加入泛型限定,返回数据类型为T,
  6 + static request<T = any>(config: AxiosRequestConfig): Promise<T> {
  7 + return new Promise<T>((resolve, reject) => {
  8 + service.request<any, T>(config)
  9 + .then((res:T) => {
  10 + resolve(res)
  11 + })
  12 + .catch((err:AxiosError) => {
  13 + reject(err)
  14 + })
  15 + })
  16 + // return service.request<any, T>(config)
  17 + }
  18 +
  19 + static get<T = any>(url: string, config?: AxiosRequestConfig): Promise<T> {
  20 + return service.get(url, config)
  21 + }
  22 +
  23 + static delete<T = any>(url: string, config?: AxiosRequestConfig): Promise<T> {
  24 + return service.delete(url, config)
  25 + }
  26 +
  27 + static post<T = any>(url: string, data?: object, config?: AxiosRequestConfig): Promise<T> {
  28 + return service.post(url, data, config)
  29 + }
  30 +
  31 + static put<T = any>(url: string, data?: object, config?: AxiosRequestConfig): Promise<T> {
  32 + return service.put(url, data, config)
  33 + }
  34 +}
  1 +{
  2 + "module": {
  3 + "name": "wdNetwork",
  4 + "type": "shared",
  5 + "description": "$string:shared_desc",
  6 + "deviceTypes": [
  7 + "phone",
  8 + "tablet"
  9 + ],
  10 + "deliveryWithInstall": true,
  11 + "requestPermissions": [
  12 + {
  13 + "name": "ohos.permission.INTERNET"
  14 + }
  15 + ]
  16 + }
  17 +}
  1 +{
  2 + "string": [
  3 + {
  4 + "name": "shared_desc",
  5 + "value": "description"
  6 + }
  7 + ]
  8 +}