陈剑华

Merge remote-tracking branch 'origin/main'

Showing 72 changed files with 3234 additions and 450 deletions

Too many changes to show.

To preserve performance only 72 of 72+ files are displayed.

@@ -20,3 +20,5 @@ export { DurationEnum } from './src/main/ets/enum/DurationEnum'; @@ -20,3 +20,5 @@ export { DurationEnum } from './src/main/ets/enum/DurationEnum';
20 export { ScreenType } from './src/main/ets/enum/ScreenType'; 20 export { ScreenType } from './src/main/ets/enum/ScreenType';
21 21
22 export { SpConstants } from './src/main/ets/constants/SpConstants'; 22 export { SpConstants } from './src/main/ets/constants/SpConstants';
  23 +
  24 +export { DisplayDirection } from './src/main/ets/constants/VideoConstants';
@@ -24,4 +24,6 @@ export class SpConstants{ @@ -24,4 +24,6 @@ export class SpConstants{
24 static SETTING_SUSPENSION_SWITCH = "setting_suspension_switch" //悬浮窗 开关 24 static SETTING_SUSPENSION_SWITCH = "setting_suspension_switch" //悬浮窗 开关
25 static SETTING_PUSH_SWITCH = "setting_push_switch" //推送 开关 25 static SETTING_PUSH_SWITCH = "setting_push_switch" //推送 开关
26 26
  27 + //未登录保存兴趣标签
  28 + static PUBLICVISUTORMODE_INTERESTTAGS = 'PublicVisitorMode_InterestTags'
27 } 29 }
  1 +export enum DisplayDirection {
  2 + VERTICAL,
  3 + VIDEO_HORIZONTAL
  4 +}
1 import { Action } from './Action'; 1 import { Action } from './Action';
2 interface dataObject { 2 interface dataObject {
  3 + operateType?: string
3 webViewHeight?: string 4 webViewHeight?: string
4 dataJson?: string 5 dataJson?: string
5 } 6 }
@@ -43,3 +43,5 @@ export { ErrorToastUtils } from './src/main/ets/utils/ErrorToastUtils' @@ -43,3 +43,5 @@ export { ErrorToastUtils } from './src/main/ets/utils/ErrorToastUtils'
43 export { EmitterUtils } from './src/main/ets/utils/EmitterUtils' 43 export { EmitterUtils } from './src/main/ets/utils/EmitterUtils'
44 44
45 export { EmitterEventId } from './src/main/ets/utils/EmitterEventId' 45 export { EmitterEventId } from './src/main/ets/utils/EmitterEventId'
  46 +
  47 +export { HWLocationUtils } from './src/main/ets/utils/HWLocationUtils'
  1 +import { Logger } from './Logger';
  2 +import { PermissionUtils } from './PermissionUtils';
  3 +import { abilityAccessCtrl, bundleManager, Permissions } from '@kit.AbilityKit';
  4 +import { BusinessError } from '@kit.BasicServicesKit';
  5 +import { geoLocationManager } from '@kit.LocationKit';
  6 +import { SPHelper } from './SPHelper';
  7 +
  8 +/**
  9 + * 系统定位服务实现
  10 + * */
  11 +export class HWLocationUtils {
  12 + //d定位相关
  13 + static LOCATION_CITY_NAME = "location_city_name" //定位
  14 + static LOCATION_CITY_CODE = "location_city_code" //定位
  15 +
  16 +
  17 + static LOCATION: Permissions = 'ohos.permission.LOCATION'
  18 + static APPROXIMATELY_LOCATION: Permissions = 'ohos.permission.APPROXIMATELY_LOCATION'
  19 +
  20 + private static getLocation() {
  21 + let requestInfo: geoLocationManager.LocationRequest = {
  22 + 'priority': geoLocationManager.LocationRequestPriority.FIRST_FIX,
  23 + 'scenario': geoLocationManager.LocationRequestScenario.UNSET,
  24 + distanceInterval: 0,
  25 + timeInterval: 60,
  26 + maxAccuracy: 0
  27 + };
  28 + geoLocationManager.on('locationChange', requestInfo, (data) => {
  29 + Logger.debug('location :' + JSON.stringify(data))
  30 + })
  31 + }
  32 +
  33 + private static getLocationData() {
  34 + return new Promise<Record<string, string | number>>((success, fail) => {
  35 + let requestInfo: geoLocationManager.LocationRequest = {
  36 + 'priority': geoLocationManager.LocationRequestPriority.FIRST_FIX,
  37 + 'scenario': geoLocationManager.LocationRequestScenario.DAILY_LIFE_SERVICE,
  38 + distanceInterval: 0,
  39 + timeInterval: 60,
  40 + maxAccuracy: 0
  41 + };
  42 + geoLocationManager.on('locationChange', requestInfo, (data) => {
  43 + Logger.debug('location :' + JSON.stringify(data)) //{"latitude":31.86870096,"longitude":117.3015341,"altitude":0,"accuracy":5000,"speed":0,"timeStamp":1713332445643,"direction":0,"timeSinceBoot":589519570869240,"additions":"","additionSize":0}
  44 + let record: Record<string, string | number> = {};
  45 + record['latitude'] = data.latitude
  46 + record['longitude'] = data.longitude
  47 + success(record)
  48 + })
  49 + })
  50 + }
  51 +
  52 + //开启定位服务
  53 + static async startLocationService() {
  54 + let grant = await PermissionUtils.checkPermissions(HWLocationUtils.APPROXIMATELY_LOCATION)
  55 + if (grant) {
  56 + HWLocationUtils.getCurrentLocation()
  57 + return
  58 + }
  59 + let context = getContext();
  60 + let requestGrant = await PermissionUtils.reqPermissionsFromUser([HWLocationUtils.APPROXIMATELY_LOCATION], context);
  61 + Logger.debug('location2 :' + requestGrant)
  62 + if (requestGrant) {
  63 + HWLocationUtils.getCurrentLocation()
  64 + } else {
  65 + PermissionUtils.openPermissionsInSystemSettings(context)
  66 + }
  67 + }
  68 +
  69 + private static getCurrentLocation() {
  70 + let requestInfo: geoLocationManager.CurrentLocationRequest = {
  71 + 'priority': geoLocationManager.LocationRequestPriority.FIRST_FIX,
  72 + 'scenario': geoLocationManager.LocationRequestScenario.DAILY_LIFE_SERVICE,
  73 + 'maxAccuracy': 0
  74 + };
  75 + try {
  76 + geoLocationManager.getCurrentLocation(requestInfo).then((result) => {
  77 + //{"latitude":31.8687047,"longitude":117.30152005,"altitude":0,"accuracy":5000,"speed":0,"timeStamp":1713331875766,"direction":0,"timeSinceBoot":588949694096931,"additions":"","additionSize":0}
  78 + Logger.debug('location' + JSON.stringify(result))
  79 + HWLocationUtils.getReverseGeoCodeRequest(result.latitude, result.longitude)
  80 + })
  81 + .catch((error: number) => {
  82 + Logger.debug('location' + JSON.stringify(error))
  83 + });
  84 + } catch (err) {
  85 + }
  86 + }
  87 +
  88 + private static getGeoCodeRequest(description: string) {
  89 + let requestInfo: geoLocationManager.GeoCodeRequest = { 'description': description };
  90 + geoLocationManager.getAddressesFromLocationName(requestInfo, (error, data) => {
  91 + if (data) {
  92 + Logger.debug('location :' + JSON.stringify(data))
  93 + }
  94 + //[{"latitude":31.898204927828598,"longitude":117.29702564819466,"locale":"zh","placeName":"安徽省合肥市瑶海区白龙路与北二环路辅路交叉口南20米","countryCode":"CN","countryName":"中国","administrativeArea":"安徽省","subAdministrativeArea":"合肥市","locality":"合肥市","subLocality":"瑶海区","roadName":"白龙路与北二环路辅路","subRoadName":"20","premises":"20","postalCode":"","phoneNumber":"18756071597","addressUrl":"","descriptionsSize":0,"isFromMock":false}]
  95 + })
  96 + }
  97 +
  98 + private static getReverseGeoCodeRequest(latitude: number, longitude: number) {
  99 + let requestInfo: geoLocationManager.ReverseGeoCodeRequest = {
  100 + "latitude": latitude,
  101 + "longitude": longitude,
  102 + "maxItems": 2
  103 + };
  104 + geoLocationManager.getAddressesFromLocation(requestInfo, (error, data) => {
  105 + if (error) {
  106 + Logger.debug('location :' + JSON.stringify(error))
  107 + }
  108 + if (data) {
  109 + Logger.debug('location :' + JSON.stringify(data))
  110 + if (data[0] && data[0].countryName) {
  111 + if (data[0].descriptionsSize && data[0].descriptions) {
  112 + let code = data[0].descriptions[1]
  113 + let cityCode = code.substring(0, 6)
  114 + let cityName = data[0].subAdministrativeArea;
  115 + if (cityName) {
  116 + SPHelper.default.save(HWLocationUtils.LOCATION_CITY_NAME, cityName)
  117 + }
  118 + if (cityCode) {
  119 + SPHelper.default.save(HWLocationUtils.LOCATION_CITY_NAME, cityCode)
  120 + }
  121 + }
  122 + }
  123 + }
  124 + })
  125 + }
  126 +
  127 +
  128 + //取消定位
  129 + static cancelLocation() {
  130 + // geoLocationManager.off('locationChange')
  131 + return new Promise<boolean>((success, fail) => {
  132 + geoLocationManager.off("locationChange", (data) => {
  133 + Logger.debug('location :' + JSON.stringify(data))
  134 + success(true)
  135 + })
  136 + })
  137 + }
  138 +}
@@ -101,4 +101,9 @@ export class SPHelper { @@ -101,4 +101,9 @@ export class SPHelper {
101 // preferences.clearSync() 101 // preferences.clearSync()
102 // preferences.flush() 102 // preferences.flush()
103 // } 103 // }
  104 +
  105 + public getPreferences(){
  106 + let preferences = data_preferences.getPreferences(SPHelper.context, SPHelper.spFilename);
  107 + return preferences;
  108 + }
104 } 109 }
@@ -26,6 +26,7 @@ export class Size { @@ -26,6 +26,7 @@ export class Size {
26 export class WindowModel { 26 export class WindowModel {
27 private windowStage?: window.WindowStage; 27 private windowStage?: window.WindowStage;
28 private windowClass?: window.Window; 28 private windowClass?: window.Window;
  29 + private isFullScreen: boolean = false
29 static shared: WindowModel = new WindowModel() 30 static shared: WindowModel = new WindowModel()
30 static TAG = "WindowModel"; 31 static TAG = "WindowModel";
31 32
@@ -129,7 +130,15 @@ export class WindowModel { @@ -129,7 +130,15 @@ export class WindowModel {
129 this.windowClass?.setWindowSystemBarProperties(systemBarProperties, (err: BusinessError) => { 130 this.windowClass?.setWindowSystemBarProperties(systemBarProperties, (err: BusinessError) => {
130 callback && callback(err) 131 callback && callback(err)
131 }) 132 })
  133 + }
  134 +
  135 + setWindowLayoutFullScreen(isFullScreen: boolean) {
  136 + this.isFullScreen = isFullScreen
  137 + this.windowClass?.setWindowLayoutFullScreen(isFullScreen)
  138 + }
132 139
  140 + getIsFullScreen(): boolean {
  141 + return this.isFullScreen
133 } 142 }
134 } 143 }
135 144
1 { 1 {
2 - "lockfileVersion": 1, 2 + "meta": {
  3 + "stableOrder": true
  4 + },
  5 + "lockfileVersion": 3,
3 "ATTENTION": "THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.", 6 "ATTENTION": "THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.",
4 "specifiers": { 7 "specifiers": {
5 - "@ohos/axios@^2.1.1": "@ohos/axios@2.2.0" 8 + "@ohos/axios@^2.1.1": "@ohos/axios@2.2.0",
  9 + "wdConstant@../wdConstant": "wdConstant@../wdConstant",
  10 + "wdKit@../wdKit": "wdKit@../wdKit"
6 }, 11 },
7 "packages": { 12 "packages": {
8 "@ohos/axios@2.2.0": { 13 "@ohos/axios@2.2.0": {
  14 + "name": "@ohos/axios",
  15 + "integrity": "sha512-v1QBWk6DfcN8wUW3D0ieFbHTR1taSI5cOgxp5l6B5cegXuNYhSc8ggKlAIXe6h/14LsfM+NW0ZGfSXcNEIM5yA==",
9 "resolved": "https://repo.harmonyos.com/ohpm/@ohos/axios/-/axios-2.2.0.har", 16 "resolved": "https://repo.harmonyos.com/ohpm/@ohos/axios/-/axios-2.2.0.har",
10 - "integrity": "sha512-v1QBWk6DfcN8wUW3D0ieFbHTR1taSI5cOgxp5l6B5cegXuNYhSc8ggKlAIXe6h/14LsfM+NW0ZGfSXcNEIM5yA==" 17 + "registryType": "ohpm"
  18 + },
  19 + "wdConstant@../wdConstant": {
  20 + "name": "wdconstant",
  21 + "resolved": "../wdConstant",
  22 + "registryType": "local"
  23 + },
  24 + "wdKit@../wdKit": {
  25 + "name": "wdkit",
  26 + "resolved": "../wdKit",
  27 + "registryType": "local"
11 } 28 }
12 } 29 }
13 } 30 }
@@ -2,7 +2,7 @@ @@ -2,7 +2,7 @@
2 * ResponseDTO 2 * ResponseDTO
3 */ 3 */
4 export interface ResponseDTO<T = string> { 4 export interface ResponseDTO<T = string> {
5 - success:boolean; 5 + success: boolean;
6 6
7 // 服务请求响应值/微服务响应状态码” 7 // 服务请求响应值/微服务响应状态码”
8 code: number; 8 code: number;
@@ -12,6 +12,7 @@ export interface ResponseDTO<T = string> { @@ -12,6 +12,7 @@ export interface ResponseDTO<T = string> {
12 12
13 // 响应结果 13 // 响应结果
14 data?: T; 14 data?: T;
  15 + totalCount?: number;
15 16
16 // 请求响应时间戳(unix格式) 17 // 请求响应时间戳(unix格式)
17 timestamp?: number; 18 timestamp?: number;
@@ -235,6 +235,25 @@ export class HttpUrlUtils { @@ -235,6 +235,25 @@ export class HttpUrlUtils {
235 static readonly SEARCH_RESULT_LIST_DATA_PATH: string = "/api/rmrb-search-api/zh/c/search"; 235 static readonly SEARCH_RESULT_LIST_DATA_PATH: string = "/api/rmrb-search-api/zh/c/search";
236 236
237 /** 237 /**
  238 + * 创作者详情接口
  239 + */
  240 + static readonly CREATOR_DETAIL_LIST_DATA_PATH: string = "/api/rmrb-contact/contact/zh/c/master/detailList";
  241 + /**
  242 + * 客态查询发布作品数量
  243 + */
  244 + static readonly ARTICLE_COUNT_HOTS_DATA_PATH: string = "/api/rmrb-content-search/zh/c/article/count";
  245 +
  246 + /**
  247 + * 客户端 客态主页页面-获取作品-从发布库获取该创作者下 稿件列表
  248 + */
  249 + static readonly ARTICLE_LIST_HOTS_DATA_PATH: string = "/api/rmrb-content-search/zh/c/article/articleList";
  250 +
  251 + /**
  252 + * 客户端 客态主页页面-获取影响力
  253 + */
  254 + static readonly CREATOR_INFLUENCE_HOTS_DATA_PATH: string = "/api/rmrb-bigdata-bi/zh/c/stats/creator/influence/info";
  255 +
  256 + /**
238 * 早晚报列表 257 * 早晚报列表
239 * 根据页面id获取页面楼层列表 258 * 根据页面id获取页面楼层列表
240 * https://pdapis.pdnews.cn/api/rmrb-bff-display-zh/display/zh/c/pageInfo?pageId=28927 259 * https://pdapis.pdnews.cn/api/rmrb-bff-display-zh/display/zh/c/pageInfo?pageId=28927
@@ -258,6 +277,10 @@ export class HttpUrlUtils { @@ -258,6 +277,10 @@ export class HttpUrlUtils {
258 * app启动页 兴趣偏好 277 * app启动页 兴趣偏好
259 */ 278 */
260 static readonly INTERESTS_HOTS_DATA_PATH: string = "/api/rmrb-user-center/user/zh/c/tag/queryTags"; 279 static readonly INTERESTS_HOTS_DATA_PATH: string = "/api/rmrb-user-center/user/zh/c/tag/queryTags";
  280 + /**
  281 + * 更新 兴趣偏好
  282 + */
  283 + static readonly INTERESTS_UPDATETAG_PATH: string = "/api/rmrb-user-center/user/zh/c/tag/updateUserTag";
261 284
262 285
263 private static _hostUrl: string = HttpUrlUtils.HOST_PRODUCT; 286 private static _hostUrl: string = HttpUrlUtils.HOST_PRODUCT;
@@ -663,6 +686,11 @@ export class HttpUrlUtils { @@ -663,6 +686,11 @@ export class HttpUrlUtils {
663 686
664 } 687 }
665 688
  689 + static getUpdateInterestsUrl() {
  690 + let url = HttpUrlUtils._hostUrl + HttpUrlUtils.INTERESTS_UPDATETAG_PATH;
  691 + return url;
  692 + }
  693 +
666 static getLiveDetailsUrl() { 694 static getLiveDetailsUrl() {
667 let url = HttpUrlUtils._hostUrl + HttpUrlUtils.LIVE_DETAILS_PATH 695 let url = HttpUrlUtils._hostUrl + HttpUrlUtils.LIVE_DETAILS_PATH
668 return url 696 return url
@@ -708,6 +736,26 @@ export class HttpUrlUtils { @@ -708,6 +736,26 @@ export class HttpUrlUtils {
708 return url 736 return url
709 } 737 }
710 738
  739 + static getCreatorDetailListDataUrl() {
  740 + let url = HttpUrlUtils._hostUrl + HttpUrlUtils.CREATOR_DETAIL_LIST_DATA_PATH
  741 + return url
  742 + }
  743 +
  744 + static getArticleCountHotsDataUrl() {
  745 + let url = HttpUrlUtils._hostUrl + HttpUrlUtils.ARTICLE_COUNT_HOTS_DATA_PATH
  746 + return url
  747 + }
  748 +
  749 + static getArticleListHotsDataUrl() {
  750 + let url = HttpUrlUtils._hostUrl + HttpUrlUtils.ARTICLE_LIST_HOTS_DATA_PATH
  751 + return url
  752 + }
  753 +
  754 + static getCreatorInfluenceInfoHotsDataUrl() {
  755 + let url = HttpUrlUtils._hostUrl + HttpUrlUtils.CREATOR_INFLUENCE_HOTS_DATA_PATH
  756 + return url
  757 + }
  758 +
711 // static getYcgCommonHeaders(): HashMap<string, string> { 759 // static getYcgCommonHeaders(): HashMap<string, string> {
712 // let headers: HashMap<string, string> = new HashMap<string, string>() 760 // let headers: HashMap<string, string> = new HashMap<string, string>()
713 // 761 //
1 { 1 {
2 - "lockfileVersion": 1, 2 + "meta": {
  3 + "stableOrder": true
  4 + },
  5 + "lockfileVersion": 3,
3 "ATTENTION": "THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.", 6 "ATTENTION": "THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.",
4 - "specifiers": {},  
5 - "packages": {} 7 + "specifiers": {
  8 + "wdBean@../../features/wdBean": "wdBean@../../features/wdBean",
  9 + "wdKit@../wdKit": "wdKit@../wdKit"
  10 + },
  11 + "packages": {
  12 + "wdBean@../../features/wdBean": {
  13 + "name": "wdbean",
  14 + "resolved": "../../features/wdBean",
  15 + "registryType": "local"
  16 + },
  17 + "wdKit@../wdKit": {
  18 + "name": "wdkit",
  19 + "resolved": "../wdKit",
  20 + "registryType": "local"
  21 + }
  22 + }
6 } 23 }
@@ -8,6 +8,7 @@ @@ -8,6 +8,7 @@
8 "version": "1.0.0", 8 "version": "1.0.0",
9 "dependencies": { 9 "dependencies": {
10 "wdKit": "file:../wdKit", 10 "wdKit": "file:../wdKit",
11 - "wdBean": "file:../../features/wdBean" 11 + "wdBean": "file:../../features/wdBean",
  12 + "wdNetwork": "file:../../commons/wdNetwork"
12 } 13 }
13 } 14 }
@@ -50,13 +50,17 @@ export function registerRouter() { @@ -50,13 +50,17 @@ export function registerRouter() {
50 50
51 Action2Page.register("JUMP_DETAIL_PAGE", (action: Action) => { 51 Action2Page.register("JUMP_DETAIL_PAGE", (action: Action) => {
52 if (action.params?.detailPageType == 2 || action.params?.detailPageType == 6) { 52 if (action.params?.detailPageType == 2 || action.params?.detailPageType == 6) {
  53 + if (action.params?.liveStyle === 0) {
53 return WDRouterPage.detailPlayLivePage 54 return WDRouterPage.detailPlayLivePage
  55 + } else {
  56 + return WDRouterPage.detailPlayVLivePage
  57 + }
54 } else if (action.params?.detailPageType == 7 || action.params?.detailPageType == 8) { 58 } else if (action.params?.detailPageType == 7 || action.params?.detailPageType == 8) {
55 return WDRouterPage.detailVideoListPage 59 return WDRouterPage.detailVideoListPage
56 - }else if(action.params?.detailPageType == 9){ 60 + } else if (action.params?.detailPageType == 9) {
57 //图集详情页 61 //图集详情页
58 return WDRouterPage.multiPictureDetailPage 62 return WDRouterPage.multiPictureDetailPage
59 - }else if(action.params?.detailPageType == 14 || action.params?.detailPageType == 15){ 63 + } else if (action.params?.detailPageType == 14 || action.params?.detailPageType == 15) {
60 //动态详情页 64 //动态详情页
61 return WDRouterPage.dynamicDetailPage 65 return WDRouterPage.dynamicDetailPage
62 } else if (action.params?.detailPageType == 17) { 66 } else if (action.params?.detailPageType == 17) {
@@ -14,6 +14,16 @@ export class WDRouterPage { @@ -14,6 +14,16 @@ export class WDRouterPage {
14 return `@bundle:${bundleInfo.name}/${"phone"}/${"ets/pages/MainPage"}` 14 return `@bundle:${bundleInfo.name}/${"phone"}/${"ets/pages/MainPage"}`
15 } 15 }
16 16
  17 + static getLoginBundleInfo() {
  18 + let bundleInfo = bundleManager.getBundleInfoForSelfSync(bundleManager.BundleFlag.GET_BUNDLE_INFO_DEFAULT)
  19 + return `@bundle:${bundleInfo.name}/${"wdLogin"}/${"ets/pages/login/LoginPage"}`
  20 + }
  21 +
  22 + static getSettingBundleInfo() {
  23 + let bundleInfo = bundleManager.getBundleInfoForSelfSync(bundleManager.BundleFlag.GET_BUNDLE_INFO_DEFAULT)
  24 + return `@bundle:${bundleInfo.name}/${"wdComponent"}/${"ets/components/page/SettingPage"}`
  25 + }
  26 +
17 27
18 url() { 28 url() {
19 let bundleInfo = bundleManager.getBundleInfoForSelfSync(bundleManager.BundleFlag.GET_BUNDLE_INFO_DEFAULT) 29 let bundleInfo = bundleManager.getBundleInfoForSelfSync(bundleManager.BundleFlag.GET_BUNDLE_INFO_DEFAULT)
@@ -43,6 +53,7 @@ export class WDRouterPage { @@ -43,6 +53,7 @@ export class WDRouterPage {
43 static detailPlayVodPage = new WDRouterPage("wdDetailPlayVod", "ets/pages/DetailPlayVodPage"); 53 static detailPlayVodPage = new WDRouterPage("wdDetailPlayVod", "ets/pages/DetailPlayVodPage");
44 // 直播详情页 54 // 直播详情页
45 static detailPlayLivePage = new WDRouterPage("wdDetailPlayLive", "ets/pages/DetailPlayLivePage"); 55 static detailPlayLivePage = new WDRouterPage("wdDetailPlayLive", "ets/pages/DetailPlayLivePage");
  56 + static detailPlayVLivePage = new WDRouterPage("wdDetailPlayLive", "ets/pages/DetailPlayVLivePage");
46 // 多图(图集)详情页 57 // 多图(图集)详情页
47 static multiPictureDetailPage = new WDRouterPage("phone", "ets/pages/detail/MultiPictureDetailPage"); 58 static multiPictureDetailPage = new WDRouterPage("phone", "ets/pages/detail/MultiPictureDetailPage");
48 // 音乐详情页 59 // 音乐详情页
@@ -96,4 +107,8 @@ export class WDRouterPage { @@ -96,4 +107,8 @@ export class WDRouterPage {
96 static broadcastPage = new WDRouterPage("phone", "ets/pages/broadcast/BroadcastPage"); 107 static broadcastPage = new WDRouterPage("phone", "ets/pages/broadcast/BroadcastPage");
97 //搜索主页 108 //搜索主页
98 static searchPage = new WDRouterPage("wdComponent", "ets/pages/SearchPage"); 109 static searchPage = new WDRouterPage("wdComponent", "ets/pages/SearchPage");
  110 + //搜索人民号主页
  111 + static searchCreatorPage = new WDRouterPage("wdComponent", "ets/pages/SearchCreatorPage");
  112 + //人民号主页
  113 + static peopleShipHomePage = new WDRouterPage("wdComponent", "ets/components/page/PeopleShipHomePage");
99 } 114 }
1 { 1 {
2 - "lockfileVersion": 1, 2 + "meta": {
  3 + "stableOrder": true
  4 + },
  5 + "lockfileVersion": 3,
3 "ATTENTION": "THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.", 6 "ATTENTION": "THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.",
4 - "specifiers": {},  
5 - "packages": {} 7 + "specifiers": {
  8 + "wdBean@../../features/wdBean": "wdBean@../../features/wdBean",
  9 + "wdConstant@../wdConstant": "wdConstant@../wdConstant",
  10 + "wdJsBridge@../wdJsBridge": "wdJsBridge@../wdJsBridge",
  11 + "wdKit@../wdKit": "wdKit@../wdKit",
  12 + "wdRouter@../wdRouter": "wdRouter@../wdRouter"
  13 + },
  14 + "packages": {
  15 + "wdBean@../../features/wdBean": {
  16 + "name": "wdbean",
  17 + "resolved": "../../features/wdBean",
  18 + "registryType": "local"
  19 + },
  20 + "wdConstant@../wdConstant": {
  21 + "name": "wdconstant",
  22 + "resolved": "../wdConstant",
  23 + "registryType": "local"
  24 + },
  25 + "wdJsBridge@../wdJsBridge": {
  26 + "name": "wdjsbridge",
  27 + "resolved": "../wdJsBridge",
  28 + "registryType": "local"
  29 + },
  30 + "wdKit@../wdKit": {
  31 + "name": "wdkit",
  32 + "resolved": "../wdKit",
  33 + "registryType": "local"
  34 + },
  35 + "wdRouter@../wdRouter": {
  36 + "name": "wdrouter",
  37 + "resolved": "../wdRouter",
  38 + "registryType": "local",
  39 + "dependencies": {
  40 + "wdKit": "file:../wdKit",
  41 + "wdBean": "file:../../features/wdBean"
  42 + }
  43 + }
  44 + }
6 } 45 }
@@ -41,6 +41,7 @@ export function performJSCallNative(data: Message, call: Callback) { @@ -41,6 +41,7 @@ export function performJSCallNative(data: Message, call: Callback) {
41 class AppInfo { 41 class AppInfo {
42 plat: string = '' 42 plat: string = ''
43 system: string = '' 43 system: string = ''
  44 + networkStatus: number = 1
44 // TODO 完善 45 // TODO 完善
45 } 46 }
46 47
@@ -52,6 +53,7 @@ function getAppPublicInfo(): string { @@ -52,6 +53,7 @@ function getAppPublicInfo(): string {
52 info.plat = 'Phone' 53 info.plat = 'Phone'
53 // 直接用Android,后续适配再新增鸿蒙 54 // 直接用Android,后续适配再新增鸿蒙
54 info.system = 'Android' 55 info.system = 'Android'
  56 + info.networkStatus = 1
55 let result = JSON.stringify(info) 57 let result = JSON.stringify(info)
56 return result; 58 return result;
57 } 59 }
@@ -13,6 +13,7 @@ export struct WdWebComponent { @@ -13,6 +13,7 @@ export struct WdWebComponent {
13 @Prop backVisibility: boolean = false 13 @Prop backVisibility: boolean = false
14 @Prop webUrl: string = '' 14 @Prop webUrl: string = ''
15 @Prop @Watch('onReloadStateChanged') reload: number = 0 15 @Prop @Watch('onReloadStateChanged') reload: number = 0
  16 + @Link isPageEnd: boolean
16 17
17 build() { 18 build() {
18 Column() { 19 Column() {
@@ -37,7 +38,6 @@ export struct WdWebComponent { @@ -37,7 +38,6 @@ export struct WdWebComponent {
37 .horizontalScrollBarAccess(false) 38 .horizontalScrollBarAccess(false)
38 .verticalScrollBarAccess(false) 39 .verticalScrollBarAccess(false)
39 .onPageBegin((event) => { 40 .onPageBegin((event) => {
40 - console.log(this.webUrl,"yzl")  
41 this.onPageBegin(event?.url); 41 this.onPageBegin(event?.url);
42 }) 42 })
43 .onPageEnd((event) => { 43 .onPageEnd((event) => {
@@ -86,18 +86,19 @@ export struct WdWebComponent { @@ -86,18 +86,19 @@ export struct WdWebComponent {
86 BridgeUtil.webViewLoadLocalJs(getContext(this), this.webviewControl) 86 BridgeUtil.webViewLoadLocalJs(getContext(this), this.webviewControl)
87 } 87 }
88 onPageEnd: (url?: string) => void = () => { 88 onPageEnd: (url?: string) => void = () => {
  89 + this.isPageEnd = true
89 Logger.debug(TAG, 'onPageEnd'); 90 Logger.debug(TAG, 'onPageEnd');
90 } 91 }
91 onLoadIntercept: (url?: string) => boolean = () => { 92 onLoadIntercept: (url?: string) => boolean = () => {
92 Logger.debug(TAG, 'onLoadIntercept return false'); 93 Logger.debug(TAG, 'onLoadIntercept return false');
93 return false 94 return false
94 } 95 }
  96 +
95 onReloadStateChanged() { 97 onReloadStateChanged() {
96 Logger.info(TAG, `onReloadStateChanged:::refresh, this.reload: ${this.reload}`); 98 Logger.info(TAG, `onReloadStateChanged:::refresh, this.reload: ${this.reload}`);
97 if (this.reload > 0) { 99 if (this.reload > 0) {
98 this.webviewControl.refresh() 100 this.webviewControl.refresh()
99 } 101 }
100 } 102 }
101 -  
102 } 103 }
103 104
@@ -12,9 +12,12 @@ const TAG = 'WdWebLocalComponent'; @@ -12,9 +12,12 @@ const TAG = 'WdWebLocalComponent';
12 @Component 12 @Component
13 export struct WdWebLocalComponent { 13 export struct WdWebLocalComponent {
14 webviewControl: BridgeWebViewControl = new BridgeWebViewControl() 14 webviewControl: BridgeWebViewControl = new BridgeWebViewControl()
  15 + onWebPrepared: () => void = () => {
  16 + }
15 @Prop backVisibility: boolean = false 17 @Prop backVisibility: boolean = false
16 @Prop webResource: Resource = {} as Resource 18 @Prop webResource: Resource = {} as Resource
17 @State webHeight: string | number = '100%' 19 @State webHeight: string | number = '100%'
  20 + @Link isPageEnd: boolean
18 21
19 build() { 22 build() {
20 Column() { 23 Column() {
@@ -80,7 +83,7 @@ export struct WdWebLocalComponent { @@ -80,7 +83,7 @@ export struct WdWebLocalComponent {
80 //webview 高度设置 83 //webview 高度设置
81 private setCurrentPageOperate: (data: Message) => void = (data) => { 84 private setCurrentPageOperate: (data: Message) => void = (data) => {
82 console.log("setCurrentPageOperate", JSON.stringify(data)) 85 console.log("setCurrentPageOperate", JSON.stringify(data))
83 - if (data.handlerName === H5CallNativeType.jsCall_currentPageOperate) { 86 + if (data.handlerName === H5CallNativeType.jsCall_currentPageOperate && data?.data?.operateType === '8') {
84 if (typeof this.webHeight === 'number') { 87 if (typeof this.webHeight === 'number') {
85 if (Number(data?.data?.webViewHeight) > this.webHeight) { 88 if (Number(data?.data?.webViewHeight) > this.webHeight) {
86 this.webHeight = Number(data?.data?.webViewHeight) 89 this.webHeight = Number(data?.data?.webViewHeight)
@@ -106,6 +109,8 @@ export struct WdWebLocalComponent { @@ -106,6 +109,8 @@ export struct WdWebLocalComponent {
106 } 109 }
107 onPageEnd: (url?: string) => void = () => { 110 onPageEnd: (url?: string) => void = () => {
108 Logger.debug(TAG, 'onPageEnd'); 111 Logger.debug(TAG, 'onPageEnd');
  112 + this.onWebPrepared()
  113 + this.isPageEnd = true
109 } 114 }
110 onLoadIntercept: (url?: string) => boolean = () => { 115 onLoadIntercept: (url?: string) => boolean = () => {
111 Logger.debug(TAG, 'onLoadIntercept return false'); 116 Logger.debug(TAG, 'onLoadIntercept return false');
@@ -37,7 +37,8 @@ export { @@ -37,7 +37,8 @@ export {
37 postExecuteCollectRecordParams, 37 postExecuteCollectRecordParams,
38 contentListParams, 38 contentListParams,
39 postInteractAccentionOperateParams, 39 postInteractAccentionOperateParams,
40 - postRecommendListParams 40 + postRecommendListParams,
  41 + contentListItem
41 } from './src/main/ets/bean/detail/MultiPictureDetailPageDTO'; 42 } from './src/main/ets/bean/detail/MultiPictureDetailPageDTO';
42 43
43 export { InteractParam, ContentBean } from './src/main/ets/bean/content/InteractParam'; 44 export { InteractParam, ContentBean } from './src/main/ets/bean/content/InteractParam';
@@ -122,3 +123,21 @@ export { LiveRoomBean,LiveRoomItemBean } from './src/main/ets/bean/live/LiveRoom @@ -122,3 +123,21 @@ export { LiveRoomBean,LiveRoomItemBean } from './src/main/ets/bean/live/LiveRoom
122 123
123 export { LiveRoomDataBean } from './src/main/ets/bean/live/LiveRoomDataBean'; 124 export { LiveRoomDataBean } from './src/main/ets/bean/live/LiveRoomDataBean';
124 125
  126 +export { LiveInfoDTO } from './src/main/ets/bean/detail/LiveInfoDTO';
  127 +
  128 +export { LiveDTO } from './src/main/ets/bean/peoples/LiveDTO';
  129 +
  130 +export { contentVideosDTO } from './src/main/ets/bean/content/contentVideosDTO';
  131 +
  132 +export { ContentExtDTO } from './src/main/ets/bean/peoples/ContentExtDTO';
  133 +
  134 +export { ContentShareDTO } from './src/main/ets/bean/peoples/ContentShareDTO';
  135 +
  136 +export {
  137 + PeopleShipUserDetailData,
  138 + ArticleCountData,
  139 + ArticleTypeData,
  140 + ArticleListData,
  141 + InfluenceData
  142 +} from './src/main/ets/bean/peoples/PeopleShipUserDetailData';
  143 +
@@ -6,9 +6,14 @@ @@ -6,9 +6,14 @@
6 */ 6 */
7 import { appStyleImagesDTO } from '../content/appStyleImagesDTO' 7 import { appStyleImagesDTO } from '../content/appStyleImagesDTO'
8 import {contentVideosDTO} from '../content/contentVideosDTO' 8 import {contentVideosDTO} from '../content/contentVideosDTO'
  9 +import { VlivesDTO } from '../peoples/VlivesDTO'
  10 +import { LiveDTO } from '../peoples/LiveDTO'
  11 +import { ContentExtDTO } from '../peoples/ContentExtDTO'
  12 +import { ContentShareDTO } from '../peoples/ContentShareDTO'
  13 +
9 export interface ArticleListDTO { 14 export interface ArticleListDTO {
10 listTitle: string; 15 listTitle: string;
11 - mainPicCount: string; 16 + mainPicCount: number;
12 videosCount: string; 17 videosCount: string;
13 voicesCount: string; 18 voicesCount: string;
14 landscape: number; 19 landscape: number;
@@ -20,7 +25,7 @@ export interface ArticleListDTO { @@ -20,7 +25,7 @@ export interface ArticleListDTO {
20 id: string; 25 id: string;
21 serialsId: string; 26 serialsId: string;
22 oldContentId: string; 27 oldContentId: string;
23 - type: string; 28 + type: number;
24 tenancy: string; 29 tenancy: string;
25 clientPubFlag: string; 30 clientPubFlag: string;
26 grayScale: string; 31 grayScale: string;
@@ -62,11 +67,12 @@ export interface ArticleListDTO { @@ -62,11 +67,12 @@ export interface ArticleListDTO {
62 joinActivity: string; 67 joinActivity: string;
63 userType: string; 68 userType: string;
64 content: object; 69 content: object;
65 - contentShare: []; 70 + contentShare: ContentShareDTO[];
66 contentLinkData: string; 71 contentLinkData: string;
67 - contentExt: []; 72 + contentExt: ContentExtDTO[];
68 contentVideos: contentVideosDTO[]; 73 contentVideos: contentVideosDTO[];
69 - contentPictures: []; 74 + appStyleVideos: contentVideosDTO[];
  75 + contentPictures: appStyleImagesDTO[];
70 contentPayments: string; 76 contentPayments: string;
71 contentPaymentStaffs: string; 77 contentPaymentStaffs: string;
72 contentTxt: []; 78 contentTxt: [];
@@ -78,7 +84,7 @@ export interface ArticleListDTO { @@ -78,7 +84,7 @@ export interface ArticleListDTO {
78 contentStatistics: string; 84 contentStatistics: string;
79 topicExistHeadImage: string; 85 topicExistHeadImage: string;
80 topicComps: string; 86 topicComps: string;
81 - live: string; 87 + live: LiveDTO;
82 statusInfo: string; 88 statusInfo: string;
83 askInfo: string; 89 askInfo: string;
84 askAttachmentList: string; 90 askAttachmentList: string;
@@ -87,5 +93,5 @@ export interface ArticleListDTO { @@ -87,5 +93,5 @@ export interface ArticleListDTO {
87 ttopicInteracts: string; 93 ttopicInteracts: string;
88 ttopic: string; 94 ttopic: string;
89 mlive: string; 95 mlive: string;
90 - vlives: string 96 + vlives: VlivesDTO[];
91 } 97 }
@@ -12,4 +12,5 @@ export interface ExtraDTO extends ItemDTO { @@ -12,4 +12,5 @@ export interface ExtraDTO extends ItemDTO {
12 sourcePage: string; 12 sourcePage: string;
13 relId: string; 13 relId: string;
14 relType: string; 14 relType: string;
  15 + liveStreamType?: number
15 } 16 }
@@ -21,6 +21,7 @@ export interface ContentDTO { @@ -21,6 +21,7 @@ export interface ContentDTO {
21 lengthTime?: object; 21 lengthTime?: object;
22 linkUrl: string; 22 linkUrl: string;
23 openLikes: number; 23 openLikes: number;
  24 + openComment?: number;
24 openUrl: string; 25 openUrl: string;
25 pageId: string; 26 pageId: string;
26 // playUrls: any[]; 27 // playUrls: any[];
@@ -18,5 +18,6 @@ export interface Params { @@ -18,5 +18,6 @@ export interface Params {
18 // 8.专辑竖屏详情页 18 // 8.专辑竖屏详情页
19 // 13.音频详情页 19 // 13.音频详情页
20 // 17.多图(图集)详情页 20 // 17.多图(图集)详情页
21 - detailPageType?:number; // 详情页类型 21 + detailPageType?: number; // 详情页类型
  22 + liveStyle?: number; // 直播类型:0横屏,1竖屏
22 } 23 }
@@ -160,7 +160,7 @@ export interface postExecuteCollectRecordParams { @@ -160,7 +160,7 @@ export interface postExecuteCollectRecordParams {
160 contentList: postExecuteCollectRecordParamsItem[] 160 contentList: postExecuteCollectRecordParamsItem[]
161 } 161 }
162 162
163 -interface contentListItem { 163 +export interface contentListItem {
164 contentId: string; 164 contentId: string;
165 contentType: number; 165 contentType: number;
166 } 166 }
1 export interface H5ReceiveDataExtraBean { 1 export interface H5ReceiveDataExtraBean {
2 creatorId: string; 2 creatorId: string;
3 isLogin: string; 3 isLogin: string;
  4 + networkStatus: number;
  5 + loadImageOnlyWifiSwitch: string
4 } 6 }
@@ -164,6 +164,7 @@ export interface LiveDetailsBean { @@ -164,6 +164,7 @@ export interface LiveDetailsBean {
164 //迁移id 164 //迁移id
165 oldNewsId: string 165 oldNewsId: string
166 reLInfo: ReLInfo 166 reLInfo: ReLInfo
  167 + rmhInfo: RmhInfo
167 } 168 }
168 169
169 export interface LiveInfo { 170 export interface LiveInfo {
@@ -171,12 +172,15 @@ export interface LiveInfo { @@ -171,12 +172,15 @@ export interface LiveInfo {
171 liveState: string 172 liveState: string
172 //2024-04-12 15:00:00 直播开始时间 173 //2024-04-12 15:00:00 直播开始时间
173 planStartTime: string 174 planStartTime: string
  175 + liveStyle: number;
174 vlive: Array<Vlive> 176 vlive: Array<Vlive>
175 - mlive:MLive 177 + mlive: MLive
176 } 178 }
  179 +
177 export interface MLive { 180 export interface MLive {
178 - mliveId:string 181 + mliveId: string
179 } 182 }
  183 +
180 export interface FullColumnImgUrls { 184 export interface FullColumnImgUrls {
181 url: string 185 url: string
182 } 186 }
@@ -186,8 +190,18 @@ export interface Vlive { @@ -186,8 +190,18 @@ export interface Vlive {
186 liveUrl: string 190 liveUrl: string
187 //直播回看地址,多路直播录制文件URL 191 //直播回看地址,多路直播录制文件URL
188 replayUri: string 192 replayUri: string
  193 + // 画面兼容 0-横屏流画面,1-竖屏流画面(仅竖屏直播使用)【前端使用, 可能竖屏模式但是直播流画面是横屏流,前端使用该字段】
  194 + liveStreamType: number | null
189 } 195 }
190 196
191 export interface ReLInfo { 197 export interface ReLInfo {
192 relId: string 198 relId: string
193 } 199 }
  200 +
  201 +export interface RmhInfo {
  202 + rmhName: string;
  203 + rmhHeadUrl: string;
  204 + rmhId: string;
  205 + userId: string;
  206 + userType: string;
  207 +}
  1 +export interface ContentExtDTO {
  2 + id: number;
  3 + contentId: number;
  4 + openLikes: number;
  5 + openComment: number;
  6 + openDownload: number;
  7 + likesStyle: number;
  8 + top: number;
  9 + joinActivity: number;
  10 + hotFlag: number;
  11 + preCommentFlag: number;
  12 + currentPoliticsFlag: number;
  13 + appStyle: number;
  14 + tenancy: number;
  15 + downloadFlag: number;
  16 + publishType: number;
  17 + payment: number;
  18 + deleted: number;
  19 + createUser: string;
  20 + createTime: string;
  21 + updateUser: string;
  22 + updateTime: string;
  23 + keyArticle: number;
  24 + toExamine: number;
  25 + bestNoticer: number;
  26 + commentDisplay: number;
  27 + imageQuality: number;
  28 + haveAdver: number;
  29 + openAudio: number;
  30 + withdrawNum: number;
  31 + menuShow: string;
  32 + recommendShow: string;
  33 + recommendSelf: string;
  34 + concentration: string;
  35 + objectPosId: string;
  36 + articleExistVote: number;
  37 + zhExpireTimeAi: number;
  38 + zhTagsAi: string;
  39 + appReadCountShow: number;
  40 +}
  1 +export interface ContentShareDTO {
  2 + id?: number;
  3 + shareSwitch: number;
  4 + contentId?: number;
  5 + sharePicture: string;
  6 + fullUrl: string;
  7 + shareTitle: string;
  8 + shareDescription: string;
  9 +}
  1 +export interface LiveDTO {
  2 + status: string;
  3 + previewType: number;
  4 + planStartTime: number;
  5 + tplId: number;
  6 + startTime: number;
  7 + endTime: number;
  8 + userOrigin: string;
  9 + liveStyle: number;
  10 + liveWay: number;
  11 + liveStreamType: number;
  12 + liveExperienceSwitch: boolean;
  13 + liveExperienceTime: number;
  14 + handAngleSwitch: boolean;
  15 + likeStyle: string;
  16 + liveType: string;
  17 + preDisplay: number;
  18 + playbackSwitch: boolean;
  19 + originalAddress: string;
  20 + provinceName: string;
  21 + liveRemindSwitch: boolean;
  22 + recordUrlFlag: number;
  23 + vr: number;
  24 + landscape: string;
  25 + recordUrl: string;
  26 + uri: string;
  27 +}
  1 +import { ArticleListDTO } from '../component/ArticleListDTO'
  2 +/**
  3 +* http://192.168.1.3:3300/project/3796/interface/api/188629
  4 +* 接口名称:客户端 客态主页页面-获取作品-从发布库获取该创作者下 稿件列表
  5 + * 接口路径:/contact/zh/c/master/detail
  6 + * 人民号-主页详情页面数据
  7 + */
  8 +export interface PeopleShipUserDetailData {
  9 + articleCreation: number;
  10 + attentionNum: number;
  11 + authIcon: string;
  12 + authId: number;
  13 + authPersonal: string;
  14 + authTitle: string;
  15 + avatarFrame: string;
  16 + banControl: number;
  17 + browseNum: number;
  18 + categoryAuth: string;
  19 + city: string;
  20 + cnContentPublish: number;
  21 + cnIsComment: number;
  22 + cnIsLike: number;
  23 + cnLiveCommentControl: number;
  24 + cnLiveGiftControl: number;
  25 + cnLiveLikeControl: number;
  26 + cnLivePublish: number;
  27 + cnLiveShareControl: number;
  28 + cnShareControl: number;
  29 + contentPublish: number;
  30 + creatorId: string;
  31 + district: string;
  32 + dynamicControl: number;
  33 + dynamicCreation: number;
  34 + fansNum: number;
  35 + headPhotoUrl: string;
  36 + honoraryIcon: string;
  37 + honoraryTitle: string;
  38 + introduction: string;
  39 + isAttention: number;
  40 + isComment: number;
  41 + isLike: number;
  42 + liveCommentControl: number;
  43 + liveGiftControl: number;
  44 + liveLikeControl: number;
  45 + livePublish: number;
  46 + liveShareControl: number;
  47 + liveSwitch: number;
  48 + mainControl: number;
  49 + originUserId: string;
  50 + pictureCollectionCreation: number;
  51 + posterShareControl: number;
  52 + province: string;
  53 + region: string;
  54 + registTime: number;
  55 + shareControl: number;
  56 + shareUrl: string;
  57 + subjectType: number;
  58 + userId: string;
  59 + userName: string;
  60 + userType: string;
  61 + videoCollectionCreation: number;
  62 + videoCreation: number;
  63 +}
  64 +
  65 +//article/count
  66 +/*
  67 + * 客户端 客态查询发布作品数量
  68 + * http://192.168.1.3:3300/project/3856/interface/api/190579
  69 + * 接口路径:/zh/c/article/count
  70 + * */
  71 +export interface ArticleCountData {
  72 + zbCount: number; //直播数量 (直播)
  73 + dtCount: number; //动态数量 (动态)
  74 + twCount: number; //图文数量 (文章)
  75 + ztCount: number; //组图数量 (图集)
  76 + spCount: number; // 视频数量 (视频)
  77 + publishCount: number; // 发布数量
  78 + serialsCount: number; //
  79 +}
  80 +
  81 +export class ArticleTypeData {
  82 + name?: string; //名称
  83 + type?: number; // 类型
  84 +
  85 + constructor(name?: string, type?: number) {
  86 + this.name = name;
  87 + this.type = type;
  88 + }
  89 +}
  90 +
  91 +export interface ArticleListData {
  92 + totalCount: number;
  93 + pageNum: number;
  94 + pageSize: number;
  95 + list: ArticleListDTO[];
  96 +}
  97 +
  98 +// 影响力
  99 +export interface InfluenceData {
  100 + creatorId: string;
  101 + influence: number;
  102 + influenceTotal: number;
  103 +}
  1 +export interface VlivesDTO {
  2 + id: number;
  3 + type: string;
  4 + // definition?: any;
  5 + // streamAppName?: any;
  6 + // streamName?: any;
  7 + pullStreamUrl: string;
  8 + // streamStatus?: any;
  9 + // shiftEnable?: any;
  10 + // clipEnable?: any;
  11 + // recordEnable?: any;
  12 + status: string;
  13 + liveId: number;
  14 + name: string;
  15 + // serialNum?: any;
  16 + streamWH: string;
  17 + recordUrl: string;
  18 + // playPreviewImageUri?: any;
  19 + // playPreviewImageFullUrl?: any;
  20 + // playPreviewImageBucket?: any;
  21 + showPad: boolean;
  22 + // liveStreamManagerId?: any;
  23 + // recordBucket?: any;
  24 + // recordUri?: any;
  25 +}
@@ -63,3 +63,9 @@ export { SpacialTopicPageComponent } from './src/main/ets/components/SpacialTopi @@ -63,3 +63,9 @@ export { SpacialTopicPageComponent } from './src/main/ets/components/SpacialTopi
63 63
64 export { LogoutViewModel } from "./src/main/ets/viewmodel/LogoutViewModel" 64 export { LogoutViewModel } from "./src/main/ets/viewmodel/LogoutViewModel"
65 65
  66 +export { ImageSwiperComponent } from "./src/main/ets/components/ImageSwiperComponent"
  67 +
  68 +export { newsSkeleton } from "./src/main/ets/components/skeleton/newsSkeleton"
  69 +
  70 +export { LiveCommentComponent } from "./src/main/ets/components/comment/view/LiveCommentComponent"
  71 +
@@ -6,8 +6,11 @@ @@ -6,8 +6,11 @@
6 "ATTENTION": "THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.", 6 "ATTENTION": "THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.",
7 "specifiers": { 7 "specifiers": {
8 "@ohos/axios@^2.1.1": "@ohos/axios@2.2.0", 8 "@ohos/axios@^2.1.1": "@ohos/axios@2.2.0",
  9 + "@ohos/lottie@2.0.0": "@ohos/lottie@2.0.0",
9 "wdBean@../wdBean": "wdBean@../wdBean", 10 "wdBean@../wdBean": "wdBean@../wdBean",
10 "wdConstant@../../commons/wdConstant": "wdConstant@../../commons/wdConstant", 11 "wdConstant@../../commons/wdConstant": "wdConstant@../../commons/wdConstant",
  12 + "wdDetailPlayApi@../wdDetailPlayApi": "wdDetailPlayApi@../wdDetailPlayApi",
  13 + "wdDetailPlayShortVideo@../wdDetailPlayShortVideo": "wdDetailPlayShortVideo@../wdDetailPlayShortVideo",
11 "wdJsBridge@../../commons/wdJsBridge": "wdJsBridge@../../commons/wdJsBridge", 14 "wdJsBridge@../../commons/wdJsBridge": "wdJsBridge@../../commons/wdJsBridge",
12 "wdKit@../../commons/wdKit": "wdKit@../../commons/wdKit", 15 "wdKit@../../commons/wdKit": "wdKit@../../commons/wdKit",
13 "wdLogin@../wdLogin": "wdLogin@../wdLogin", 16 "wdLogin@../wdLogin": "wdLogin@../wdLogin",
@@ -23,6 +26,12 @@ @@ -23,6 +26,12 @@
23 "resolved": "https://repo.harmonyos.com/ohpm/@ohos/axios/-/axios-2.2.0.har", 26 "resolved": "https://repo.harmonyos.com/ohpm/@ohos/axios/-/axios-2.2.0.har",
24 "registryType": "ohpm" 27 "registryType": "ohpm"
25 }, 28 },
  29 + "@ohos/lottie@2.0.0": {
  30 + "name": "@ohos/lottie",
  31 + "integrity": "sha512-jFEFYfuqGO323aMiwtzHmDGRJI0qTxjZD2Lzbn+LxRdoHSfu5OVu22I8gVm5ej019tCw3WOk547NHZ2GuWiNSg==",
  32 + "resolved": "https://repo.harmonyos.com/ohpm/@ohos/lottie/-/lottie-2.0.0.har",
  33 + "registryType": "ohpm"
  34 + },
26 "wdBean@../wdBean": { 35 "wdBean@../wdBean": {
27 "name": "wdbean", 36 "name": "wdbean",
28 "resolved": "../wdBean", 37 "resolved": "../wdBean",
@@ -33,6 +42,32 @@ @@ -33,6 +42,32 @@
33 "resolved": "../../commons/wdConstant", 42 "resolved": "../../commons/wdConstant",
34 "registryType": "local" 43 "registryType": "local"
35 }, 44 },
  45 + "wdDetailPlayApi@../wdDetailPlayApi": {
  46 + "name": "wddetailplayapi",
  47 + "resolved": "../wdDetailPlayApi",
  48 + "registryType": "local",
  49 + "dependencies": {
  50 + "wdPlayer": "file:../../features/wdPlayer",
  51 + "wdKit": "file:../../commons/wdKit",
  52 + "wdBean": "file:../../features/wdBean",
  53 + "wdRouter": "file:../../commons/wdRouter",
  54 + "wdNetwork": "file:../../commons/wdNetwork"
  55 + }
  56 + },
  57 + "wdDetailPlayShortVideo@../wdDetailPlayShortVideo": {
  58 + "name": "wddetailplayshortvideo",
  59 + "resolved": "../wdDetailPlayShortVideo",
  60 + "registryType": "local",
  61 + "dependencies": {
  62 + "@ohos/lottie": "2.0.0",
  63 + "wdPlayer": "file:../../features/wdPlayer",
  64 + "wdKit": "file:../../commons/wdKit",
  65 + "wdBean": "file:../../features/wdBean",
  66 + "wdRouter": "file:../../commons/wdRouter",
  67 + "wdNetwork": "file:../../commons/wdNetwork",
  68 + "wdDetailPlayApi": "file:../../features/wdDetailPlayApi"
  69 + }
  70 + },
36 "wdJsBridge@../../commons/wdJsBridge": { 71 "wdJsBridge@../../commons/wdJsBridge": {
37 "name": "wdjsbridge", 72 "name": "wdjsbridge",
38 "resolved": "../../commons/wdJsBridge", 73 "resolved": "../../commons/wdJsBridge",
1 -import { Logger } from 'wdKit'; 1 +import { AccountManagerUtils, Logger } from 'wdKit';
2 import { MultiPictureDetailViewModel } from '../viewmodel/MultiPictureDetailViewModel'; 2 import { MultiPictureDetailViewModel } from '../viewmodel/MultiPictureDetailViewModel';
3 -import { ContentDetailDTO } from 'wdBean'; 3 +import { ContentDetailDTO,batchLikeAndCollectResult,batchLikeAndCollectParams,postBatchAttentionStatusParams,
  4 + PhotoListBean,
  5 + ContentDTO, } from 'wdBean';
4 import media from '@ohos.multimedia.media'; 6 import media from '@ohos.multimedia.media';
5 import { OperRowListView } from './view/OperRowListView'; 7 import { OperRowListView } from './view/OperRowListView';
6 import { WDPlayerController } from 'wdPlayer/Index'; 8 import { WDPlayerController } from 'wdPlayer/Index';
  9 +import { ContentConstants } from '../constants/ContentConstants';
  10 +import { ProcessUtils } from '../utils/ProcessUtils';
7 11
8 const TAG = 'DynamicDetailComponent' 12 const TAG = 'DynamicDetailComponent'
9 @Preview 13 @Preview
@@ -19,8 +23,11 @@ export struct DynamicDetailComponent { @@ -19,8 +23,11 @@ export struct DynamicDetailComponent {
19 /** 23 /**
20 * 默认未关注 点击去关注 24 * 默认未关注 点击去关注
21 */ 25 */
22 - private followStatus: boolean = false; 26 + private followStatus: String = '0';
  27 + @State newsStatusOfUser: batchLikeAndCollectResult | undefined = undefined // 点赞、收藏状态
23 28
  29 + //跳转
  30 + private mJumpInfo: ContentDTO = {} as ContentDTO;
24 31
25 async aboutToAppear() { 32 async aboutToAppear() {
26 await this.getContentDetailData() 33 await this.getContentDetailData()
@@ -35,63 +42,63 @@ export struct DynamicDetailComponent { @@ -35,63 +42,63 @@ export struct DynamicDetailComponent {
35 //logo、日期 42 //logo、日期
36 Row() { 43 Row() {
37 Image($r('app.media.ic_article_rmh')) 44 Image($r('app.media.ic_article_rmh'))
38 - .width(80)  
39 - .height(28)  
40 - .margin({ left: 16 }) 45 + .width($r('app.float.margin_80'))
  46 + .height($r('app.float.margin_28'))
  47 + .margin({ left: $r('app.float.margin_16') })
41 Blank() 48 Blank()
42 Text("2023年03月14日 08:16") 49 Text("2023年03月14日 08:16")
43 .fontColor($r('app.color.color_B0B0B0')) 50 .fontColor($r('app.color.color_B0B0B0'))
44 - .fontSize(12)  
45 - .lineHeight(28)  
46 - .margin({ right: 16 }) 51 + .fontSize($r('app.float.font_size_12'))
  52 + .lineHeight($r('app.float.margin_28'))
  53 + .margin({ right: $r('app.float.margin_16') })
47 } 54 }
48 - .height(48) 55 + .height($r('app.float.margin_48'))
49 .width('100%') 56 .width('100%')
50 //分割线 57 //分割线
51 Image($r('app.media.ic_news_detail_division')) 58 Image($r('app.media.ic_news_detail_division'))
52 .width('100%') 59 .width('100%')
53 - .height(7)  
54 - .margin({left: 16, right: 16} ) 60 + .height($r('app.float.margin_7'))
  61 + .margin({left: $r('app.float.margin_16'), right: $r('app.float.margin_16')} )
55 //号主信息 62 //号主信息
56 Row() { 63 Row() {
57 //头像 64 //头像
58 Stack() { 65 Stack() {
59 Image(this.contentDetailData.rmhInfo?.rmhHeadUrl) 66 Image(this.contentDetailData.rmhInfo?.rmhHeadUrl)
60 .alt(this.contentDetailData.rmhInfo?.userType=='1'?$r('app.media.default_head'):$r('app.media.icon_default_head_mater')) 67 .alt(this.contentDetailData.rmhInfo?.userType=='1'?$r('app.media.default_head'):$r('app.media.icon_default_head_mater'))
61 - .width('32')  
62 - .height('32') 68 + .width($r('app.float.margin_32'))
  69 + .height($r('app.float.margin_32'))
63 .objectFit(ImageFit.Cover) 70 .objectFit(ImageFit.Cover)
64 - .borderRadius(16) 71 + .borderRadius($r('app.float.margin_16'))
65 Image($r('app.media.icon_border_test')) 72 Image($r('app.media.icon_border_test'))
66 - .width('48')  
67 - .height('48') 73 + .width($r('app.float.margin_48'))
  74 + .height($r('app.float.margin_48'))
68 .objectFit(ImageFit.Cover) 75 .objectFit(ImageFit.Cover)
69 - .borderRadius(24) 76 + .borderRadius($r('app.float.margin_24'))
70 } 77 }
71 - .width(48)  
72 - .height(48) 78 + .width($r('app.float.margin_48'))
  79 + .height($r('app.float.margin_48'))
73 .alignContent(Alignment.Center) 80 .alignContent(Alignment.Center)
74 Column(){ 81 Column(){
75 //昵称 82 //昵称
76 Text("this.contentDetailData.rmhInfo?.rmhName") 83 Text("this.contentDetailData.rmhInfo?.rmhName")
77 - .fontSize(14) 84 + .fontSize($r('app.float.font_size_14'))
78 .fontColor($r('app.color.color_222222')) 85 .fontColor($r('app.color.color_222222'))
79 .fontWeight(FontWeight.Medium) 86 .fontWeight(FontWeight.Medium)
80 - .margin({ left: 5 }) 87 + .margin({ left: $r('app.float.margin_5') })
81 //简介 88 //简介
82 Text("this.contentDetailData.rmhInfo?.rmhDesc") 89 Text("this.contentDetailData.rmhInfo?.rmhDesc")
83 - .fontSize(14) 90 + .fontSize($r('app.float.font_size_14'))
84 .fontColor($r('app.color.color_B0B0B0')) 91 .fontColor($r('app.color.color_B0B0B0'))
85 .fontWeight(FontWeight.Medium) 92 .fontWeight(FontWeight.Medium)
86 - .margin({ left: 5 }) 93 + .margin({ left: $r('app.float.margin_5') })
87 } 94 }
88 - if (!this.followStatus) { 95 + if (this.followStatus == '0') {
89 Text('关注') 96 Text('关注')
90 .width(60) 97 .width(60)
91 - .height(24) 98 + .height($r('app.float.margin_48'))
92 .textAlign(TextAlign.Center) 99 .textAlign(TextAlign.Center)
93 .fontSize($r('app.float.font_size_12')) 100 .fontSize($r('app.float.font_size_12'))
94 - .borderRadius($r('app.float.button_border_radius')) 101 + .borderRadius($r('app.float.vp_3'))
95 .backgroundColor($r('app.color.color_ED2800')) 102 .backgroundColor($r('app.color.color_ED2800'))
96 .fontColor($r('app.color.color_fff')) 103 .fontColor($r('app.color.color_fff'))
97 .onClick(() => { 104 .onClick(() => {
@@ -99,12 +106,12 @@ export struct DynamicDetailComponent { @@ -99,12 +106,12 @@ export struct DynamicDetailComponent {
99 }) 106 })
100 } else { 107 } else {
101 Text('已关注') 108 Text('已关注')
102 - .width(60)  
103 - .height(24) 109 + .width($r('app.float.margin_60'))
  110 + .height($r('app.float.margin_48'))
104 .borderWidth(1) 111 .borderWidth(1)
105 .textAlign(TextAlign.Center) 112 .textAlign(TextAlign.Center)
106 .fontSize($r('app.float.font_size_12')) 113 .fontSize($r('app.float.font_size_12'))
107 - .borderRadius($r('app.float.button_border_radius')) 114 + .borderRadius($r('app.float.vp_3'))
108 .borderColor($r('app.color.color_CCCCCC')) 115 .borderColor($r('app.color.color_CCCCCC'))
109 .fontColor($r('app.color.color_CCCCCC')) 116 .fontColor($r('app.color.color_CCCCCC'))
110 .onClick(() => { 117 .onClick(() => {
@@ -113,17 +120,325 @@ export struct DynamicDetailComponent { @@ -113,17 +120,325 @@ export struct DynamicDetailComponent {
113 } 120 }
114 } 121 }
115 .width('100%') 122 .width('100%')
  123 + //内容
  124 + Text("这里展示标题这里展示标题这里展示标题这里这里展示标题这里展示标题这里展示标题这里这里展示标题这里展示标题这里展示标题这里")
  125 + .fontColor($r('app.color.color_222222'))
  126 + .fontSize($r('app.float.font_size_18'))
  127 + .lineHeight($r('app.float.margin_25'))
  128 + .margin({ top: $r('app.float.margin_6')
  129 + ,left: $r('app.float.margin_16')
  130 + ,right: $r('app.float.margin_16') })
  131 + if(this.contentDetailData.photoList!= null && this.contentDetailData.photoList.length>0){
  132 + //附件内容:图片/视频
  133 + if(this.contentDetailData.newsType+"" == ContentConstants.TYPE_FOURTEEN){
  134 + GridRow({
  135 + columns: { sm: this.contentDetailData.photoList.length
  136 + , md: this.contentDetailData.photoList.length == 1?1:
  137 + this.contentDetailData.photoList.length == 4?2:
  138 + 3 },
  139 + breakpoints: { value: ['320vp', '520vp', '840vp'] }
  140 + }) {
  141 + ForEach(this.contentDetailData.photoList, (item: PhotoListBean, index: number) => {
  142 + GridCol() {
  143 + this.buildItemCard(this.contentDetailData.photoList[index],this.contentDetailData.photoList.length, index);
  144 + }
  145 + })
  146 + }
  147 + }else{
  148 + //附件内容:视频,只有一个
  149 + ForEach(this.contentDetailData.photoList, (item: PhotoListBean, index: number) => {
  150 + GridCol() {
  151 + this.buildItemCard(this.contentDetailData.photoList[index],this.contentDetailData.photoList.length, index);
  152 + }
  153 + })
  154 + }
  155 + }
  156 + //特别声明
  157 + Text("特别声明:本文为人民日报新媒体平台“人民号”作者上传并发布,仅代表作者观点。人民日报仅提供信息发布平台。")
  158 + .fontColor($r('app.color.color_CCCCCC'))
  159 + .fontSize($r('app.float.font_size_12'))
  160 + .lineHeight($r('app.float.margin_16'))
  161 + .margin({ top: $r('app.float.margin_16')
  162 + ,left: $r('app.float.margin_16')
  163 + ,right: $r('app.float.margin_16') })
  164 + //微信/朋友圈/微博
  165 + Row(){
  166 + Image($r('app.media.xxhdpi_pic_wechat'))
  167 + .width($r('app.float.margin_116'))
  168 + .height($r('app.float.margin_36'))
  169 + .objectFit(ImageFit.Cover)
  170 + Image($r('app.media.xxhdpi_pic_pyq'))
  171 + .width($r('app.float.margin_116'))
  172 + .height($r('app.float.margin_36'))
  173 + .margin({ left: $r('app.float.margin_4_negative')})
  174 + .objectFit(ImageFit.Cover)
  175 + Image($r('app.media.xxhdpi_pic_wb'))
  176 + .width($r('app.float.margin_116'))
  177 + .height($r('app.float.margin_36'))
  178 + .margin({ left: $r('app.float.margin_4_negative')})
  179 + .objectFit(ImageFit.Cover)
  180 + }
  181 + .margin({ top: $r('app.float.margin_24')})
  182 + //点赞
  183 + Row(){
  184 + Image($r('app.media.icon_like_selected_redheart'))
  185 + .width($r('app.float.margin_24'))
  186 + .height($r('app.float.margin_24'))
  187 + .objectFit(ImageFit.Cover)
  188 + Text("2.6万")
  189 + .fontColor($r('app.color.color_999999'))
  190 + .fontSize($r('app.float.font_size_16'))
  191 + .lineHeight($r('app.float.margin_20'))
  192 + .margin({ left: $r('app.float.margin_2')})
  193 + }
  194 + //评论组件/底部组件
  195 +
116 } 196 }
117 } 197 }
118 .backgroundColor('#FFFFFFFF') 198 .backgroundColor('#FFFFFFFF')
119 } 199 }
  200 + /**
  201 + * 请求(动态)详情页数据
  202 + * */
120 private async getContentDetailData() { 203 private async getContentDetailData() {
121 try { 204 try {
122 let data = await MultiPictureDetailViewModel.getDetailData(this.relId, this.contentId, this.relType) 205 let data = await MultiPictureDetailViewModel.getDetailData(this.relId, this.contentId, this.relType)
123 this.contentDetailData = data[0]; 206 this.contentDetailData = data[0];
  207 + this.makeJumpInfo
124 console.log('动态详情',JSON.stringify(this.contentDetailData)) 208 console.log('动态详情',JSON.stringify(this.contentDetailData))
125 } catch (exception) { 209 } catch (exception) {
126 console.log('请求失败',JSON.stringify(exception)) 210 console.log('请求失败',JSON.stringify(exception))
127 } 211 }
  212 + this.getBatchAttentionStatus
  213 + this.getInteractDataStatus
  214 + }
  215 +
  216 + // 查询当前登录用户点赞状态
  217 + private async getInteractDataStatus() {
  218 + //未登录
  219 + if(!AccountManagerUtils.isLoginSync() || this.contentDetailData?.openLikes != 1){
  220 + return
  221 + }
  222 + try {
  223 + const params: batchLikeAndCollectParams = {
  224 + contentList: [
  225 + {
  226 + contentId: this.contentDetailData?.newsId + '',
  227 + contentType: this.contentDetailData?.newsType + '',
  228 + }
  229 + ]
  230 + }
  231 + console.error(TAG, JSON.stringify(this.contentDetailData))
  232 + let data = await MultiPictureDetailViewModel.getInteractDataStatus(params)
  233 + console.error(TAG, '查询用户对作品点赞、收藏状态', JSON.stringify(data))
  234 + this.newsStatusOfUser = data[0];
  235 + Logger.info(TAG, `newsStatusOfUser:${JSON.stringify(this.newsStatusOfUser)}`)
  236 + } catch (exception) {
  237 + console.error(TAG, JSON.stringify(exception))
  238 + }
  239 + }
  240 +
  241 + /**
  242 + * 查询当前登录用户是否关注作品号主
  243 + * */
  244 + private async getBatchAttentionStatus() {
  245 + try {
  246 + const params: postBatchAttentionStatusParams = {
  247 + creatorIds: [{ creatorId: this.contentDetailData?.rmhInfo?.rmhId ?? '' }]
  248 + }
  249 + let data = await MultiPictureDetailViewModel.getBatchAttentionStatus(params)
  250 + this.followStatus = data[0]?.status;
  251 + Logger.info(TAG, `followStatus:${JSON.stringify(this.followStatus)}`)
  252 + } catch (exception) {
  253 +
  254 + }
  255 + }
  256 + @Builder
  257 + setItemImageStyle(picPath: string,topLeft: number,topRight: number,bottomLeft: number,bottomRight: number){
  258 + //四角圆角
  259 + Image(picPath)
  260 + .width(44).aspectRatio(1 / 1).margin(16).borderRadius({topLeft: topLeft, topRight: topRight, bottomLeft: bottomLeft, bottomRight: bottomRight})
  261 + }
  262 + /**
  263 + * 组件项
  264 + *
  265 + * @param programmeBean item 组件项, 上面icon,下面标题
  266 + */
  267 + @Builder
  268 + buildItemCard(item: PhotoListBean,len: number,index: number) {
  269 + Column() {
  270 + this.setItemImageRoundCorner(len, item, index)
  271 + Flex({ direction: FlexDirection.Row }) {
  272 + Image($r('app.media.icon_long_pic'))
  273 + .width(14)
  274 + .height(14)
  275 + .margin({right: 4})
  276 + Text('长图')
  277 + .fontSize(12)
  278 + .fontWeight(400)
  279 + .fontColor(0xffffff)
  280 + .fontFamily('PingFang SC')
  281 + }
  282 + .width(48)
  283 + .padding({bottom: 9})
  284 + }
  285 + .width('100%')
  286 + .onClick((event: ClickEvent) => {
  287 + if(this.contentDetailData.newsType+"" == ContentConstants.TYPE_FOURTEEN){
  288 + //fixme 跳转到查看图片页面(带页脚/下载按钮)
  289 + // this.mJumpInfo.objectType = ContentConstants.TYPE_
  290 + ProcessUtils.processPage(this.mJumpInfo)
  291 + }else{
  292 + //fixme 跳转到播放视频页面(点播)
  293 + this.mJumpInfo.objectType = ContentConstants.TYPE_VOD
  294 + ProcessUtils.processPage(this.mJumpInfo)
  295 + }
  296 + })
  297 + }
  298 +
  299 + //创建跳转信息
  300 + makeJumpInfo(){
  301 + this.mJumpInfo.pageId = 'dynamicDetailPage';
  302 + // this.mJumpInfo.from = 'dynamicDetailPage';
  303 + this.mJumpInfo.objectId = this.contentDetailData.newsId+"";
  304 + this.mJumpInfo.relType = this.contentDetailData.reLInfo?.relType+"";
  305 + this.mJumpInfo.relId = this.contentDetailData.reLInfo?.relId+"";
  306 + }
  307 +
  308 + //设置图片圆角
  309 + @Builder
  310 + setItemImageRoundCorner(len: number, item: PhotoListBean, index: number) {
  311 + if (len == 1) {
  312 + //四角圆角
  313 + this.setItemImageStyle(item.picPath, 4, 4, 4, 4);
  314 + } else if (len == 2) {
  315 + if (index == 0) {
  316 + //左边圆角
  317 + this.setItemImageStyle(item.picPath, 4, 0, 4, 0);
  318 + } else {
  319 + //右边圆角
  320 + this.setItemImageStyle(item.picPath, 0, 4, 0, 4);
  321 + }
  322 + } else if (3 == len) {
  323 + if (index == 0) {
  324 + //左边圆角
  325 + this.setItemImageStyle(item.picPath, 4, 0, 4, 0);
  326 + } else if (index == 1) {
  327 + //直角
  328 + this.setItemImageStyle(item.picPath, 0, 0, 0, 0);
  329 + } else {
  330 + //右边圆角
  331 + this.setItemImageStyle(item.picPath, 0, 4, 0, 4);
  332 + }
  333 + } else if (4 == len) {
  334 + if (index == 0) {
  335 + //左边圆角
  336 + this.setItemImageStyle(item.picPath, 4, 0, 4, 0);
  337 + } else if (index == 1) {
  338 + //右边圆角
  339 + this.setItemImageStyle(item.picPath, 0, 4, 0, 4);
  340 + } else if (index = 2) {
  341 + //左边圆角
  342 + this.setItemImageStyle(item.picPath, 4, 0, 4, 0);
  343 + } else {
  344 + //右边圆角
  345 + this.setItemImageStyle(item.picPath, 0, 4, 0, 4);
  346 + }
  347 + } else if (5 == len) {
  348 + if (index == 0) {
  349 + this.setItemImageStyle(item.picPath, 4, 0, 0, 0);
  350 + } else if (index == 1) {
  351 + //直角
  352 + this.setItemImageStyle(item.picPath, 0, 0, 0, 0);
  353 + } else if (index = 2) {
  354 + this.setItemImageStyle(item.picPath, 4, 4, 4, 4);
  355 + } else if (index = 3) {
  356 + this.setItemImageStyle(item.picPath, 0, 0, 4, 0);
  357 + } else {
  358 + this.setItemImageStyle(item.picPath, 0, 0, 0, 4);
  359 + }
  360 + } else if (6 == len) {
  361 + if (index == 0) {
  362 + this.setItemImageStyle(item.picPath, 4, 0, 0, 0);
  363 + } else if (index == 1) {
  364 + //直角
  365 + this.setItemImageStyle(item.picPath, 0, 0, 0, 0);
  366 + } else if (index = 2) {
  367 + this.setItemImageStyle(item.picPath, 0, 4, 0, 0);
  368 + } else if (index = 3) {
  369 + this.setItemImageStyle(item.picPath, 0, 0, 4, 0);
  370 + } else if (index = 4) {
  371 + //直角
  372 + this.setItemImageStyle(item.picPath, 0, 0, 0, 0);
  373 + } else {
  374 + //右边圆角
  375 + this.setItemImageStyle(item.picPath, 0, 0, 0, 4);
  376 + }
  377 + } else if (7 == len) {
  378 + if (index == 0) {
  379 + this.setItemImageStyle(item.picPath, 4, 0, 0, 0);
  380 + } else if (index == 1) {
  381 + //直角
  382 + this.setItemImageStyle(item.picPath, 0, 0, 0, 0);
  383 + } else if (index = 2) {
  384 + this.setItemImageStyle(item.picPath, 0, 4, 0, 0);
  385 + } else if (index = 3) {
  386 + //直角
  387 + this.setItemImageStyle(item.picPath, 0, 0, 0, 0);
  388 + } else if (index = 4) {
  389 + //直角
  390 + this.setItemImageStyle(item.picPath, 0, 0, 0, 0);
  391 + } else if (index = 5) {
  392 + this.setItemImageStyle(item.picPath, 0, 0, 0, 4);
  393 + } else {
  394 + this.setItemImageStyle(item.picPath, 0, 0, 4, 4);
  395 + }
  396 + } else if (8 == len) {
  397 + if (index == 0) {
  398 + this.setItemImageStyle(item.picPath, 4, 0, 0, 0);
  399 + } else if (index == 1) {
  400 + //直角
  401 + this.setItemImageStyle(item.picPath, 0, 0, 0, 0);
  402 + } else if (index = 2) {
  403 + this.setItemImageStyle(item.picPath, 0, 4, 0, 0);
  404 + } else if (index = 3) {
  405 + //直角
  406 + this.setItemImageStyle(item.picPath, 0, 0, 0, 0);
  407 + } else if (index = 4) {
  408 + //直角
  409 + this.setItemImageStyle(item.picPath, 0, 0, 0, 0);
  410 + } else if (index = 5) {
  411 + this.setItemImageStyle(item.picPath, 0, 0, 0, 4);
  412 + } else if (index = 6) {
  413 + this.setItemImageStyle(item.picPath, 0, 0, 4, 0);
  414 + } else {
  415 + this.setItemImageStyle(item.picPath, 0, 0, 0, 4);
  416 + }
  417 + } else {
  418 + if (index == 0) {
  419 + this.setItemImageStyle(item.picPath, 4, 0, 0, 0);
  420 + } else if (index == 1) {
  421 + //直角
  422 + this.setItemImageStyle(item.picPath, 0, 0, 0, 0);
  423 + } else if (index == 2) {
  424 + this.setItemImageStyle(item.picPath, 0, 4, 0, 0);
  425 + } else if (index == 3) {
  426 + //直角
  427 + this.setItemImageStyle(item.picPath, 0, 0, 0, 0);
  428 + } else if (index == 4) {
  429 + //直角
  430 + this.setItemImageStyle(item.picPath, 0, 0, 0, 0);
  431 + } else if (index == 5) {
  432 + //直角
  433 + this.setItemImageStyle(item.picPath, 0, 0, 0, 0);
  434 + } else if (index == 6) {
  435 + this.setItemImageStyle(item.picPath, 0, 0, 4, 0);
  436 + } else if (index == 7) {
  437 + //直角
  438 + this.setItemImageStyle(item.picPath, 0, 0, 0, 0);
  439 + } else {
  440 + this.setItemImageStyle(item.picPath, 0, 0, 0, 4);
  441 + }
  442 + }
128 } 443 }
129 } 444 }
@@ -2,6 +2,7 @@ import { Action, NewspaperListItemBean, NewspaperPositionItemBean, Params } from @@ -2,6 +2,7 @@ import { Action, NewspaperListItemBean, NewspaperPositionItemBean, Params } from
2 import { ExtraDTO } from 'wdBean/src/main/ets/bean/component/extra/ExtraDTO'; 2 import { ExtraDTO } from 'wdBean/src/main/ets/bean/component/extra/ExtraDTO';
3 import { StringUtils } from 'wdKit'; 3 import { StringUtils } from 'wdKit';
4 import { WDRouterRule } from 'wdRouter'; 4 import { WDRouterRule } from 'wdRouter';
  5 +import { newsSkeleton } from './skeleton/newsSkeleton';
5 6
6 @Component 7 @Component
7 export struct ENewspaperItemComponent { 8 export struct ENewspaperItemComponent {
@@ -11,13 +12,20 @@ export struct ENewspaperItemComponent { @@ -11,13 +12,20 @@ export struct ENewspaperItemComponent {
11 private startX: number = 0 12 private startX: number = 0
12 private startY: number = 0 13 private startY: number = 0
13 private itemBeanClicked: NewspaperPositionItemBean = {} as NewspaperPositionItemBean 14 private itemBeanClicked: NewspaperPositionItemBean = {} as NewspaperPositionItemBean
  15 + @State isShowSkeleton: boolean = true
14 16
15 build() { 17 build() {
16 Stack() { 18 Stack() {
  19 + newsSkeleton()
  20 + .visibility(this.isShowSkeleton ? Visibility.Visible : Visibility.None)
17 Image(this.newspaperListItemBean.pagePic) 21 Image(this.newspaperListItemBean.pagePic)
18 .width('100%') 22 .width('100%')
19 .aspectRatio(378 / 566) 23 .aspectRatio(378 / 566)
20 .objectFit(ImageFit.Fill) 24 .objectFit(ImageFit.Fill)
  25 + .onComplete(() => {
  26 + this.isShowSkeleton = false
  27 + })
  28 + .visibility(this.isShowSkeleton ? Visibility.None : Visibility.Visible)
21 29
22 Canvas(this.context) 30 Canvas(this.context)
23 .width('100%') 31 .width('100%')
@@ -62,7 +70,7 @@ export struct ENewspaperItemComponent { @@ -62,7 +70,7 @@ export struct ENewspaperItemComponent {
62 pageID: 'IMAGE_TEXT_DETAIL', 70 pageID: 'IMAGE_TEXT_DETAIL',
63 extra: { 71 extra: {
64 relType: this.itemBeanClicked.relType ?? '', 72 relType: this.itemBeanClicked.relType ?? '',
65 - relId: ''+this.itemBeanClicked.relId, 73 + relId: '' + this.itemBeanClicked.relId,
66 sourcePage: '5' 74 sourcePage: '5'
67 } as ExtraDTO 75 } as ExtraDTO
68 } as Params, 76 } as Params,
@@ -110,11 +110,11 @@ export struct ENewspaperPageComponent { @@ -110,11 +110,11 @@ export struct ENewspaperPageComponent {
110 }) 110 })
111 111
112 Row() { 112 Row() {
113 - Text(this.calendarDate) 113 + Text(this.calendarDate?.replace('-', '.')?.replace('-', '.'))
114 .fontSize($r('app.float.font_size_20')) 114 .fontSize($r('app.float.font_size_20'))
115 .fontColor($r('app.color.white')) 115 .fontColor($r('app.color.white'))
116 .fontFamily('BebasNeue_Regular') 116 .fontFamily('BebasNeue_Regular')
117 - .fontWeight(FontWeight.Bold) 117 + .fontWeight(FontWeight.Regular)
118 118
119 Image($r('app.media.icon_triangle')) 119 Image($r('app.media.icon_triangle'))
120 .width($r('app.float.border_radius_6')) 120 .width($r('app.float.border_radius_6'))
@@ -167,6 +167,7 @@ export struct ENewspaperPageComponent { @@ -167,6 +167,7 @@ export struct ENewspaperPageComponent {
167 .autoPlay(false) 167 .autoPlay(false)
168 .cachedCount(3) 168 .cachedCount(3)
169 .indicator(false) 169 .indicator(false)
  170 + .loop(false)
170 .displayCount(1) 171 .displayCount(1)
171 .margin({ top: 35, left: 10, right: 10 }) 172 .margin({ top: 35, left: 10, right: 10 })
172 .id('e_newspaper_content') 173 .id('e_newspaper_content')
@@ -191,12 +192,13 @@ export struct ENewspaperPageComponent { @@ -191,12 +192,13 @@ export struct ENewspaperPageComponent {
191 .id('e_newspaper_shadow') 192 .id('e_newspaper_shadow')
192 193
193 Row() { 194 Row() {
194 - Text('滑动查看下一版') 195 + Text(this.swiperIndex + 1 == this.newspaperListBean?.list?.length ? '已到底部,可以选择其他日期' : '滑动查看下一版')
195 .fontColor(Color.White) 196 .fontColor(Color.White)
196 .fontSize($r('app.float.font_size_14')) 197 .fontSize($r('app.float.font_size_14'))
197 Image($r('app.media.icon_next_page')) 198 Image($r('app.media.icon_next_page'))
198 .width($r('app.float.vp_16')) 199 .width($r('app.float.vp_16'))
199 .height($r('app.float.vp_16')) 200 .height($r('app.float.vp_16'))
  201 + .visibility(this.swiperIndex + 1 == this.newspaperListBean?.list?.length ? Visibility.None : Visibility.Visible)
200 } 202 }
201 .justifyContent(FlexAlign.Center) 203 .justifyContent(FlexAlign.Center)
202 .margin({ top: $r('app.float.margin_16') }) 204 .margin({ top: $r('app.float.margin_16') })
@@ -19,6 +19,7 @@ import { HttpUrlUtils } from 'wdNetwork/Index'; @@ -19,6 +19,7 @@ import { HttpUrlUtils } from 'wdNetwork/Index';
19 import { WDRouterPage, WDRouterRule } from 'wdRouter/Index'; 19 import { WDRouterPage, WDRouterRule } from 'wdRouter/Index';
20 import { MultiPictureDetailViewModel } from '../viewmodel/MultiPictureDetailViewModel'; 20 import { MultiPictureDetailViewModel } from '../viewmodel/MultiPictureDetailViewModel';
21 import { PageRepository } from '../repository/PageRepository'; 21 import { PageRepository } from '../repository/PageRepository';
  22 +import { detailedSkeleton } from './skeleton/detailSkeleton'
22 23
23 const TAG = 'ImageAndTextPageComponent' 24 const TAG = 'ImageAndTextPageComponent'
24 25
@@ -30,8 +31,13 @@ export struct ImageAndTextPageComponent { @@ -30,8 +31,13 @@ export struct ImageAndTextPageComponent {
30 @State recommendList: ContentDTO[] = [] 31 @State recommendList: ContentDTO[] = []
31 @State newsStatusOfUser: batchLikeAndCollectResult | undefined = undefined // 点赞、收藏状态 32 @State newsStatusOfUser: batchLikeAndCollectResult | undefined = undefined // 点赞、收藏状态
32 @State interactData: InteractDataDTO = {} as InteractDataDTO 33 @State interactData: InteractDataDTO = {} as InteractDataDTO
  34 + @State isPageEnd: boolean = false
  35 +
33 build() { 36 build() {
34 Column() { 37 Column() {
  38 + if (!this.isPageEnd) {
  39 + detailedSkeleton()
  40 + } else {
35 // 发布时间 41 // 发布时间
36 Row() { 42 Row() {
37 Image($r('app.media.icon_ren_min_ri_bao')) 43 Image($r('app.media.icon_ren_min_ri_bao'))
@@ -58,13 +64,16 @@ export struct ImageAndTextPageComponent { @@ -58,13 +64,16 @@ export struct ImageAndTextPageComponent {
58 } 64 }
59 .padding({ left: 15, right: 15 }) 65 .padding({ left: 15, right: 15 })
60 .backgroundColor(Color.White) 66 .backgroundColor(Color.White)
  67 + }
  68 +
61 69
62 Stack({ alignContent: Alignment.Bottom }) { 70 Stack({ alignContent: Alignment.Bottom }) {
63 Scroll(this.scroller) { 71 Scroll(this.scroller) {
64 Column() { 72 Column() {
65 ImageAndTextWebComponent({ 73 ImageAndTextWebComponent({
66 contentDetailData: this.contentDetailData, 74 contentDetailData: this.contentDetailData,
67 - action: this.action 75 + action: this.action,
  76 + isPageEnd: $isPageEnd
68 }) 77 })
69 Column() { 78 Column() {
70 if (this.recommendList.length > 0) { 79 if (this.recommendList.length > 0) {
@@ -77,7 +86,7 @@ export struct ImageAndTextPageComponent { @@ -77,7 +86,7 @@ export struct ImageAndTextPageComponent {
77 .width(CommonConstants.FULL_WIDTH) 86 .width(CommonConstants.FULL_WIDTH)
78 .height(CommonConstants.FULL_HEIGHT) 87 .height(CommonConstants.FULL_HEIGHT)
79 .padding({ bottom: 76 }) 88 .padding({ bottom: 76 })
80 - // .scrollBar(BarState.Off) 89 + .scrollBar(BarState.Off)
81 90
82 //底部交互区 91 //底部交互区
83 Row() { 92 Row() {
@@ -122,138 +131,6 @@ export struct ImageAndTextPageComponent { @@ -122,138 +131,6 @@ export struct ImageAndTextPageComponent {
122 .height(CommonConstants.FULL_HEIGHT) 131 .height(CommonConstants.FULL_HEIGHT)
123 } 132 }
124 133
125 - // build() {  
126 - // Column() {  
127 - // // 发布时间  
128 - // Row() {  
129 - // Image($r('app.media.icon_ren_min_ri_bao'))  
130 - // .width(70)  
131 - // .height(28)  
132 - // Text(this.contentDetailData[0]?.publishTime)  
133 - // .fontColor($r('app.color.color_B0B0B0'))  
134 - // .fontSize($r('app.float.font_size_13'))  
135 - // .height('100%')  
136 - // .align(Alignment.End)  
137 - // }  
138 - // .width(CommonConstants.FULL_WIDTH)  
139 - // .height(32)  
140 - // .padding({ left: 15, right: 15, })  
141 - // .justifyContent(FlexAlign.SpaceBetween)  
142 - // .backgroundColor(Color.White)  
143 - //  
144 - // Row() {  
145 - // Image($r('app.media.line'))  
146 - // .width('100%')  
147 - // .height(6)  
148 - // .objectFit(ImageFit.Cover)  
149 - // .margin({ top: 10 })  
150 - // }  
151 - // .padding({ left: 15, right: 15, })  
152 - // .backgroundColor(Color.White)  
153 - //  
154 - // Stack({ alignContent: Alignment.Bottom }) {  
155 - //  
156 - // List() {  
157 - // //详情展示区  
158 - // ListItem() {  
159 - // Column() {  
160 - // ImageAndTextWebComponent({  
161 - // contentDetailData: this.contentDetailData,  
162 - // action: this.action,  
163 - // })  
164 - // }.width(CommonConstants.FULL_WIDTH)  
165 - // // .height(CommonConstants.FULL_HEIGHT)  
166 - // }  
167 - //  
168 - // if (this.contentDetailData[0]?.openLikes === 1) {  
169 - // ListItem() {  
170 - // // 点赞  
171 - // Row() {  
172 - // Row() {  
173 - // if (this.newsStatusOfUser?.likeStatus === '1') {  
174 - // Image(this.contentDetailData[0]?.likesStyle === 1 ? $r('app.media.ic_like_check') : (this.contentDetailData[0]?.likesStyle === 2 ? $r('app.media.icon_prayer_active') : $r('app.media.icon_candle_active')))  
175 - // .width(24)  
176 - // .height(24)  
177 - // .margin({ right: 5 })  
178 - // } else {  
179 - // Image(this.contentDetailData[0]?.likesStyle === 1 ? $r('app.media.icon_like') : (this.contentDetailData[0]?.likesStyle === 2 ? $r('app.media.icon_prayer') : $r('app.media.icon_candle')))  
180 - // .width(24)  
181 - // .height(24)  
182 - // .margin({ right: 5 })  
183 - // }  
184 - // Text(`${this.interactData?.likeNum || 0}`)  
185 - // .fontSize(16)  
186 - // .fontColor(this.newsStatusOfUser?.likeStatus === '1' ? '#ED2800' : '#999999')  
187 - // .fontWeight(500)  
188 - // }.alignItems(VerticalAlign.Center)  
189 - // .onClick(() => {  
190 - // this.toggleLikeStatus()  
191 - // })  
192 - //  
193 - // }.width(CommonConstants.FULL_WIDTH).height(80)  
194 - // .justifyContent(FlexAlign.Center)  
195 - // }  
196 - // .border({  
197 - // width: { bottom: 5 },  
198 - // color: '#f5f5f5',  
199 - // })  
200 - // }  
201 - //  
202 - // // 相关推荐区  
203 - // ListItem() {  
204 - // RecommendList({ recommendList: this.recommendList })  
205 - // }  
206 - // }  
207 - // .width(CommonConstants.FULL_WIDTH)  
208 - // .height(CommonConstants.FULL_HEIGHT)  
209 - // .padding({ bottom: 56 })  
210 - // .scrollBar(BarState.Off)  
211 - // .edgeEffect(EdgeEffect.None)  
212 - //  
213 - // //底部交互区  
214 - // Row() {  
215 - // Image($r('app.media.icon_arrow_left'))  
216 - // .width(24)  
217 - // .height(24)  
218 - // .onClick((event: ClickEvent) => {  
219 - // router.back()  
220 - // })  
221 - //  
222 - // Row() {  
223 - // Image($r('app.media.icon_comment'))  
224 - // .width(24)  
225 - // .height(24)  
226 - // .margin({ right: 24 })  
227 - // .id('comment')  
228 - //  
229 - // Image($r('app.media.icon_star'))  
230 - // .width(24)  
231 - // .height(24)  
232 - // .margin({ right: 24 })  
233 - //  
234 - // Image($r('app.media.icon_listen'))  
235 - // .width(24)  
236 - // .height(24)  
237 - // .margin({ right: 24 })  
238 - //  
239 - // Image($r('app.media.icon_forward'))  
240 - // .width(24)  
241 - // .height(24)  
242 - //  
243 - // }  
244 - // }  
245 - // .width(CommonConstants.FULL_WIDTH)  
246 - // .height(56)  
247 - // .padding({ left: 15, right: 15, bottom: 50, top: 20 })  
248 - // .justifyContent(FlexAlign.SpaceBetween)  
249 - // .backgroundColor(Color.White)  
250 - // }  
251 - //  
252 - // }.width(CommonConstants.FULL_WIDTH).height(CommonConstants.FULL_HEIGHT)  
253 - // .backgroundColor(Color.White)  
254 - //  
255 - // }  
256 -  
257 private async getDetail() { 134 private async getDetail() {
258 let contentId: string = '' 135 let contentId: string = ''
259 let relId: string = '' 136 let relId: string = ''
@@ -15,8 +15,12 @@ import { BridgeWebViewControl } from 'wdJsBridge/Index'; @@ -15,8 +15,12 @@ import { BridgeWebViewControl } from 'wdJsBridge/Index';
15 export struct ImageAndTextWebComponent { 15 export struct ImageAndTextWebComponent {
16 action: Action = {} as Action 16 action: Action = {} as Action
17 @State reload: number = 0; 17 @State reload: number = 0;
  18 + @Link isPageEnd: boolean
18 @Prop @Watch('onDetailDataUpdated') contentDetailData: ContentDetailDTO [] = [] as ContentDetailDTO [] 19 @Prop @Watch('onDetailDataUpdated') contentDetailData: ContentDetailDTO [] = [] as ContentDetailDTO []
19 webviewControl: BridgeWebViewControl = new BridgeWebViewControl() 20 webviewControl: BridgeWebViewControl = new BridgeWebViewControl()
  21 + private h5ReceiveAppData: H5ReceiveDetailBean = { dataSource: '2' } as H5ReceiveDetailBean
  22 + private webPrepared = false;
  23 + private dataPrepared = false;
20 24
21 onDetailDataUpdated() { 25 onDetailDataUpdated() {
22 if (this.action) { 26 if (this.action) {
@@ -50,9 +54,14 @@ export struct ImageAndTextWebComponent { @@ -50,9 +54,14 @@ export struct ImageAndTextWebComponent {
50 54
51 } 55 }
52 56
53 - let h5ReceiveAppData: H5ReceiveDetailBean = { dataSource: '2' } as H5ReceiveDetailBean  
54 // TODO 对接user信息、登录情况 57 // TODO 对接user信息、登录情况
55 - let h5ReceiveDataExtraBean: H5ReceiveDataExtraBean = { creatorId: '', isLogin: '0' } as H5ReceiveDataExtraBean 58 + let h5ReceiveDataExtraBean: H5ReceiveDataExtraBean = {
  59 + creatorId: '',
  60 + isLogin: '0',
  61 + networkStatus: 1,
  62 + loadImageOnlyWifiSwitch: '2',
  63 +
  64 + } as H5ReceiveDataExtraBean
56 let h5ReceiveDataJsonBean: H5ReceiveDataJsonBean = { 65 let h5ReceiveDataJsonBean: H5ReceiveDataJsonBean = {
57 contentId: contentId, 66 contentId: contentId,
58 contentType: contentType 67 contentType: contentType
@@ -67,12 +76,10 @@ export struct ImageAndTextWebComponent { @@ -67,12 +76,10 @@ export struct ImageAndTextWebComponent {
67 response.code = 200 76 response.code = 200
68 response.success = true 77 response.success = true
69 h5ReceiveDataJsonBean.responseMap = response 78 h5ReceiveDataJsonBean.responseMap = response
70 - h5ReceiveAppData.dataJson = h5ReceiveDataJsonBean  
71 - h5ReceiveAppData.dataExt = h5ReceiveDataExtraBean  
72 - // TODO 暂延时1s,考虑业务流程再优化  
73 - setTimeout(() => {  
74 - this.sendContentData2H5(h5ReceiveAppData);  
75 - }, 2000) 79 + this.h5ReceiveAppData.dataJson = h5ReceiveDataJsonBean
  80 + this.h5ReceiveAppData.dataExt = h5ReceiveDataExtraBean
  81 + this.dataPrepared = true
  82 + this.trySendData2H5()
76 83
77 } 84 }
78 85
@@ -84,10 +91,26 @@ export struct ImageAndTextWebComponent { @@ -84,10 +91,26 @@ export struct ImageAndTextWebComponent {
84 webviewControl: this.webviewControl, 91 webviewControl: this.webviewControl,
85 webResource: $rawfile('apph5/index.html'), 92 webResource: $rawfile('apph5/index.html'),
86 backVisibility: false, 93 backVisibility: false,
  94 + onWebPrepared: this.onWebPrepared.bind(this),
  95 + isPageEnd: $isPageEnd
  96 +
87 }) 97 })
88 } 98 }
89 } 99 }
90 100
  101 + private trySendData2H5() {
  102 + if (!this.webPrepared || !this.dataPrepared) {
  103 + return
  104 + }
  105 + // 数据、web组件,都准备好了,开始塞详情数据
  106 + this.sendContentData2H5(this.h5ReceiveAppData)
  107 + }
  108 +
  109 + private onWebPrepared() {
  110 + this.webPrepared = true
  111 + this.trySendData2H5()
  112 + }
  113 +
91 private sendContentData2H5(h5ReceiveAppData: H5ReceiveDetailBean) { 114 private sendContentData2H5(h5ReceiveAppData: H5ReceiveDetailBean) {
92 Logger.debug('ImageAndTextWebComponent', 'jsCall_receiveAppData'); 115 Logger.debug('ImageAndTextWebComponent', 'jsCall_receiveAppData');
93 this.webviewControl.callHandle(NativeCallH5Type.jsCall_receiveAppData, 116 this.webviewControl.callHandle(NativeCallH5Type.jsCall_receiveAppData,
  1 +import { PhotoListBean } from 'wdBean/Index';
  2 +import { Logger } from 'wdKit/Index';
  3 +import { MultiPictureDetailItemComponent } from './MultiPictureDetailItemComponent';
  4 +import { display } from '@kit.ArkUI';
  5 +
  6 +const TAG = 'ImageSwiperComponent';
  7 +
  8 +@Component
  9 +export struct ImageSwiperComponent {
  10 + @Provide @Watch('onCurrentPageNumUpdated') currentPageNum: string = '01'
  11 + private scroller: Scroller = new Scroller()
  12 + @State swiperIndex: number = 0;
  13 + photoList: PhotoListBean[] = [];
  14 + private swiperController: SwiperController = new SwiperController()
  15 + private displayTool = display.getDefaultDisplaySync()
  16 + private screenWidth: number = 0
  17 + private picWidth: number = 0
  18 + @State picHeight: number = 0
  19 +
  20 + //watch监听页码回调
  21 + onCurrentPageNumUpdated(): void {
  22 + Logger.info(TAG, `currentPageNum:${this.currentPageNum}`,)
  23 + let _swiperIndex = Number.parseInt(this.currentPageNum)
  24 + Logger.info(TAG, `_swiperIndex:${_swiperIndex}`)
  25 + this.swiperIndex = _swiperIndex > 0 ? _swiperIndex - 1 : _swiperIndex
  26 + }
  27 +
  28 + aboutToAppear(): void {
  29 + //获取宽高尺寸
  30 + this.screenWidth = this.displayTool.width
  31 + // this.picWidth = this.screenWidth - vp2px(52)
  32 + this.picWidth = this.screenWidth
  33 + this.picHeight = this.picWidth * 578 / 375
  34 + }
  35 +
  36 + build() {
  37 + RelativeContainer() {
  38 + if (this.photoList && this.photoList?.length > 0) {
  39 + Swiper(this.swiperController) {
  40 + ForEach(this.photoList, (item: PhotoListBean) => {
  41 + MultiPictureDetailItemComponent({ MultiPictureDetailItem: item })
  42 + })
  43 + }
  44 + .index(this.swiperIndex)
  45 + .width('100%')
  46 + .height(px2vp(this.picHeight) + 32)
  47 + .vertical(false)
  48 + .autoPlay(false)
  49 + .cachedCount(3)
  50 + .indicator(false)
  51 + .displayCount(1)
  52 + .id('e_swiper_content')
  53 + .alignRules({
  54 + center: { anchor: "__container__", align: VerticalAlign.Center },
  55 + middle: { anchor: "__container__", align: HorizontalAlign.Center }
  56 + })
  57 + .onChange((index: number) => {
  58 + this.swiperIndex = index
  59 + })
  60 +
  61 + Row() {
  62 + Scroll(this.scroller) {
  63 + Row() {
  64 + Flex({
  65 + direction: FlexDirection.Column,
  66 + justifyContent: FlexAlign.Start
  67 + }) {
  68 + Text() {
  69 + Span(`${this.swiperIndex + 1}`)
  70 + .fontSize(24)
  71 + .fontFamily('PingFang SC-Medium')
  72 + .fontWeight(500)
  73 + .lineHeight(28)
  74 + Span(`/${this.photoList.length}`)
  75 + .fontSize(14)
  76 + .fontFamily('PingFang SC-Medium')
  77 + .fontWeight(500)
  78 + .lineHeight(19)
  79 + }.fontColor(Color.White).margin(4)
  80 + }
  81 + }
  82 + .width('100%')
  83 + .margin({
  84 + top: 8,
  85 + left: 18,
  86 + bottom: 24,
  87 + right: 18
  88 + })
  89 + }
  90 + .scrollable(ScrollDirection.Vertical)
  91 + .scrollBarWidth(0)
  92 + }
  93 + .id('e_swiper_titles')
  94 + .alignRules({
  95 + bottom: { anchor: "__container__", align: VerticalAlign.Bottom },
  96 + middle: { anchor: "__container__", align: HorizontalAlign.Center }
  97 + })
  98 + }
  99 + }
  100 + .width('100%')
  101 + .height('100%')
  102 + .backgroundColor(Color.Black)
  103 + .id('e_picture_container')
  104 + // 设置顶部绘制延伸到状态栏
  105 + // 设置底部绘制延伸到导航条
  106 + .expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.TOP, SafeAreaEdge.BOTTOM])
  107 + }
  108 +}
@@ -4,6 +4,7 @@ import { WdWebComponent } from 'wdWebComponent'; @@ -4,6 +4,7 @@ import { WdWebComponent } from 'wdWebComponent';
4 import router from '@ohos.router'; 4 import router from '@ohos.router';
5 import { CommonConstants } from 'wdConstant' 5 import { CommonConstants } from 'wdConstant'
6 import { BridgeWebViewControl } from 'wdJsBridge/Index'; 6 import { BridgeWebViewControl } from 'wdJsBridge/Index';
  7 +import { detailedSkeleton } from './skeleton/detailSkeleton'
7 8
8 const TAG = 'SpacialTopicPageComponent' 9 const TAG = 'SpacialTopicPageComponent'
9 10
@@ -13,14 +14,20 @@ export struct SpacialTopicPageComponent { @@ -13,14 +14,20 @@ export struct SpacialTopicPageComponent {
13 scroller: Scroller = new Scroller(); 14 scroller: Scroller = new Scroller();
14 action: Action = {} as Action 15 action: Action = {} as Action
15 @State webUrl: string = ''; 16 @State webUrl: string = '';
  17 + @State isPageEnd: boolean = false
  18 +
16 build() { 19 build() {
17 Column() { 20 Column() {
  21 + if (!this.isPageEnd) {
  22 + detailedSkeleton()
  23 + }
18 Stack({ alignContent: Alignment.Bottom }) { 24 Stack({ alignContent: Alignment.Bottom }) {
19 Column() { 25 Column() {
20 WdWebComponent({ 26 WdWebComponent({
21 webviewControl: this.webviewControl, 27 webviewControl: this.webviewControl,
22 webUrl: this.webUrl, 28 webUrl: this.webUrl,
23 backVisibility: false, 29 backVisibility: false,
  30 + isPageEnd:$isPageEnd
24 }) 31 })
25 } 32 }
26 .padding({ bottom: 56 }) 33 .padding({ bottom: 56 })
@@ -64,6 +71,8 @@ export struct SpacialTopicPageComponent { @@ -64,6 +71,8 @@ export struct SpacialTopicPageComponent {
64 .padding({ left: 15, right: 15, bottom: 20, top: 20 }) 71 .padding({ left: 15, right: 15, bottom: 20, top: 20 })
65 .justifyContent(FlexAlign.SpaceBetween) 72 .justifyContent(FlexAlign.SpaceBetween)
66 .backgroundColor(Color.White) 73 .backgroundColor(Color.White)
  74 +
  75 +
67 } 76 }
68 }.width(CommonConstants.FULL_WIDTH).height(CommonConstants.FULL_HEIGHT) 77 }.width(CommonConstants.FULL_WIDTH).height(CommonConstants.FULL_HEIGHT)
69 .backgroundColor(Color.White) 78 .backgroundColor(Color.White)
  1 +import { router } from '@kit.ArkUI'
  2 +import { NumberFormatterUtils, ToastUtils } from 'wdKit/Index'
  3 +
  4 +@Component
  5 +export struct LiveCommentComponent {
  6 + public clickCollect?: (isCollect: boolean) => void
  7 + public clickHeart?: (isHeart: boolean) => void
  8 + @State isCollect: boolean = false
  9 + @State isLike: boolean = false
  10 + @State heartNum: number = 0
  11 +
  12 + build() {
  13 + Row() {
  14 + Image($r('app.media.back_icon'))
  15 + .width(24)
  16 + .height(24)
  17 + .margin({
  18 + left: 16,
  19 + right: 12
  20 + })
  21 + .onClick(() => {
  22 + router.back()
  23 + })
  24 + Stack() {
  25 + Image($r('app.media.background_search'))
  26 + .interpolation(ImageInterpolation.High)
  27 + .width('100%')
  28 + .height(30)
  29 + TextArea({ placeholder: '说两句...' })
  30 + .backgroundColor(Color.Transparent)
  31 + .enabled(false)
  32 + .margin({
  33 + left: 5,
  34 + right: 20
  35 + })
  36 + }
  37 + .layoutWeight(1)
  38 + .onClick(() => {
  39 + ToastUtils.shortToast('依赖其它功能开发')
  40 + })
  41 +
  42 + Image(this.isCollect ? $r('app.media.ic_collect_check') : $r('app.media.iv_live_comment_collect_un'))
  43 + .width(24)
  44 + .height(24)
  45 + .margin({
  46 + left: 20,
  47 + right: 24
  48 + })
  49 + .onClick(() => {
  50 + this.isCollect = !this.isCollect
  51 + })
  52 + Image($r('app.media.iv_live_comment_share'))
  53 + .width(24)
  54 + .height(24)
  55 + .onClick(() => {
  56 + ToastUtils.shortToast('依赖其它功能开发')
  57 + })
  58 + Stack() {
  59 + Text(NumberFormatterUtils.formatNumberWithWan(this.heartNum))
  60 + .height(12)
  61 + .fontSize('8fp')
  62 + .fontWeight(500)
  63 + .fontColor(Color.White)
  64 + .backgroundImage($r('app.media.iv_live_comment_hert_num'))
  65 + .backgroundImageSize(ImageSize.Cover)
  66 + .margin({
  67 + left: 6,
  68 + bottom: 33
  69 + })
  70 + .padding({
  71 + left: 6,
  72 + right: 2
  73 + })
  74 + Image(this.isLike ? $r('app.media.iv_live_comment_hert_light') : $r('app.media.comment_like_normal'))
  75 + .width(24)
  76 + .height(24)
  77 + .margin({
  78 + right: 20,
  79 + })
  80 + }
  81 + .width(44)
  82 + .height(56)
  83 + .margin({
  84 + left: 24
  85 + })
  86 + .onClick(() => {
  87 + this.isLike = !this.isLike
  88 + })
  89 + }
  90 + .height(56)
  91 + .width('100%')
  92 + .backgroundColor(Color.White)
  93 + }
  94 +}
1 import { CompDTO, ContentDTO } from 'wdBean'; 1 import { CompDTO, ContentDTO } from 'wdBean';
2 import { CommonConstants } from 'wdConstant/Index'; 2 import { CommonConstants } from 'wdConstant/Index';
  3 +import { CollectionUtils, DateTimeUtils, Logger, StringUtils, ToastUtils } from 'wdKit/Index';
  4 +import PageViewModel from '../../viewmodel/PageViewModel';
3 5
4 const TAG = 'Zh_Grid_Layout-02'; 6 const TAG = 'Zh_Grid_Layout-02';
5 const FULL_PARENT: string = '100%'; 7 const FULL_PARENT: string = '100%';
@@ -11,19 +13,28 @@ let listSize: number = 2; @@ -11,19 +13,28 @@ let listSize: number = 2;
11 * Zh_Grid_Layout-02 13 * Zh_Grid_Layout-02
12 * 14 *
13 */ 15 */
14 -@Preview  
15 @Component 16 @Component
16 export struct ZhGridLayout02 { 17 export struct ZhGridLayout02 {
17 @State compDTO: CompDTO = {} as CompDTO 18 @State compDTO: CompDTO = {} as CompDTO
  19 + @State operDataList: ContentDTO[] = []
  20 + currentPage = 1
  21 + pageSize = 12
18 22
19 aboutToAppear() { 23 aboutToAppear() {
20 - if (this.compDTO.operDataList) {  
21 - listSize = this.compDTO.operDataList.length > 5 ? 2 : this.compDTO.operDataList.length;  
22 - } 24 + Logger.debug(TAG, 'aboutToAppear ' + this.compDTO.objectTitle)
  25 + this.currentPage = 1
  26 + PageViewModel.getLiveReviewUrl(this.currentPage, this.pageSize).then((liveReviewDTO) => {
  27 + this.operDataList = []
  28 + this.operDataList.push(...liveReviewDTO.list)
  29 + })
23 } 30 }
24 31
25 build() { 32 build() {
26 Column() { 33 Column() {
  34 +
  35 +
  36 + Scroll() {
  37 + Column() {
27 Row() { 38 Row() {
28 Image($r("app.media.redLine")) 39 Image($r("app.media.redLine"))
29 .width(3) 40 .width(3)
@@ -38,19 +49,40 @@ export struct ZhGridLayout02 { @@ -38,19 +49,40 @@ export struct ZhGridLayout02 {
38 .margin({ top: 8, bottom: 8 }) 49 .margin({ top: 8, bottom: 8 })
39 .width(CommonConstants.FULL_WIDTH) 50 .width(CommonConstants.FULL_WIDTH)
40 51
41 -  
42 GridRow({ 52 GridRow({
43 columns: { sm: listSize, md: 2 }, 53 columns: { sm: listSize, md: 2 },
44 breakpoints: { value: ['320vp', '520vp', '840vp'] } 54 breakpoints: { value: ['320vp', '520vp', '840vp'] }
45 }) { 55 }) {
46 - ForEach(this.compDTO.operDataList, (item: ContentDTO, index: number) => { 56 + ForEach(this.operDataList, (item: ContentDTO, index: number) => {
47 GridCol() { 57 GridCol() {
48 - this.buildItemCard(this.compDTO.operDataList[index]); 58 + this.buildItemCard(item);
49 } 59 }
50 }) 60 })
51 } 61 }
52 } 62 }
  63 +
  64 + }
  65 + .width("100%")
  66 + .height("100%")
  67 + // .layoutWeight(1)
  68 + .edgeEffect(EdgeEffect.None)
  69 + .scrollBar(BarState.Off)
  70 + .onReachStart(() => {
  71 + Logger.debug(TAG, 'onReachStart')
  72 + })
  73 + .onReachEnd(() => {
  74 + Logger.debug(TAG, 'onReachEnd')
  75 + this.addItems()
  76 + })
  77 + .nestedScroll({
  78 + scrollForward: NestedScrollMode.PARENT_FIRST,
  79 + scrollBackward: NestedScrollMode.SELF_FIRST
  80 + })
  81 + }
53 .width(CommonConstants.FULL_WIDTH) 82 .width(CommonConstants.FULL_WIDTH)
  83 + // .width("100%")
  84 + .height("100%")
  85 + // .layoutWeight(1)
54 .padding({ 86 .padding({
55 top: 14, 87 top: 14,
56 left: 16, 88 left: 16,
@@ -78,6 +110,15 @@ export struct ZhGridLayout02 { @@ -78,6 +110,15 @@ export struct ZhGridLayout02 {
78 } 110 }
79 .width('100%') 111 .width('100%')
80 } 112 }
  113 +
  114 + addItems() {
  115 + Logger.debug(TAG, 'addItems')
  116 + this.currentPage++
  117 + PageViewModel.getLiveReviewUrl(this.currentPage, this.pageSize).then((liveReviewDTO) => {
  118 + this.operDataList.push(...liveReviewDTO.list)
  119 + Logger.debug(TAG, 'addItems after: ' + this.operDataList.length)
  120 + })
  121 + }
81 } 122 }
82 123
83 124
@@ -56,6 +56,9 @@ export struct ZhGridLayout03 { @@ -56,6 +56,9 @@ export struct ZhGridLayout03 {
56 .textOverflow({ overflow: TextOverflow.Ellipsis }) 56 .textOverflow({ overflow: TextOverflow.Ellipsis })
57 } 57 }
58 .width('100%') 58 .width('100%')
  59 + .onClick((event: ClickEvent) => {
  60 + ProcessUtils.processPage(item)
  61 + })
59 } 62 }
60 } 63 }
61 64
@@ -16,7 +16,7 @@ export default struct MinePageMoreFunctionUI { @@ -16,7 +16,7 @@ export default struct MinePageMoreFunctionUI {
16 .fontColor($r('app.color.color_666666')) 16 .fontColor($r('app.color.color_666666'))
17 .fontSize('29lpx') 17 .fontSize('29lpx')
18 .margin({ left: "31lpx" }) 18 .margin({ left: "31lpx" })
19 - .fontWeight(600) 19 + .fontWeight('600lpx')
20 }.height('92lpx') 20 }.height('92lpx')
21 .width('100%') 21 .width('100%')
22 .justifyContent(FlexAlign.Center) 22 .justifyContent(FlexAlign.Center)
1 import { WDRouterRule, WDRouterPage } from 'wdRouter' 1 import { WDRouterRule, WDRouterPage } from 'wdRouter'
2 import MinePagePersonalFunctionsItem from '../../viewmodel/MinePagePersonalFunctionsItem' 2 import MinePagePersonalFunctionsItem from '../../viewmodel/MinePagePersonalFunctionsItem'
3 -import router from '@ohos.router'  
4 3
5 @Component 4 @Component
6 export default struct MinePagePersonFunctionUI { 5 export default struct MinePagePersonFunctionUI {
7 @Link personalData:MinePagePersonalFunctionsItem[] 6 @Link personalData:MinePagePersonalFunctionsItem[]
8 @Prop isLogin:boolean 7 @Prop isLogin:boolean
9 - @Consume('isLogin')@Watch('loginChange') loginState:Record<string,string>  
10 - loginChange(){  
11 - if(this.loginState){  
12 - this.isLogin=true  
13 - }  
14 - }  
15 8
16 build() { 9 build() {
17 Grid(){ 10 Grid(){
@@ -45,6 +38,15 @@ export default struct MinePagePersonFunctionUI { @@ -45,6 +38,15 @@ export default struct MinePagePersonFunctionUI {
45 }.onClick(()=>{ 38 }.onClick(()=>{
46 console.log(index+"") 39 console.log(index+"")
47 switch (item.msg){ 40 switch (item.msg){
  41 + case "评论":{
  42 + if(!this.isLogin){
  43 + WDRouterRule.jumpWithPage(WDRouterPage.loginPage)
  44 + return
  45 + }else {
  46 + WDRouterRule.jumpWithPage(WDRouterPage.mineHomePage)
  47 + }
  48 + break;
  49 + }
48 case "预约":{ 50 case "预约":{
49 if(!this.isLogin){ 51 if(!this.isLogin){
50 WDRouterRule.jumpWithPage(WDRouterPage.loginPage) 52 WDRouterRule.jumpWithPage(WDRouterPage.loginPage)
1 -import { Logger, UserDataLocal } from 'wdKit' 1 +import { Logger, StringUtils, UserDataLocal } from 'wdKit'
2 import { WDRouterPage, WDRouterRule } from 'wdRouter' 2 import { WDRouterPage, WDRouterRule } from 'wdRouter'
3 import MinePageDatasModel from '../../model/MinePageDatasModel' 3 import MinePageDatasModel from '../../model/MinePageDatasModel'
4 const TAG = "MinePageUserSimpleInfoUI" 4 const TAG = "MinePageUserSimpleInfoUI"
@@ -12,18 +12,13 @@ export default struct MinePageUserSimpleInfoUI { @@ -12,18 +12,13 @@ export default struct MinePageUserSimpleInfoUI {
12 @State levelHead:string = "" 12 @State levelHead:string = ""
13 @State levelId:number = 0 13 @State levelId:number = 0
14 14
15 -  
16 - @Consume('isLogin') @Watch('loginChange') loginState:Record<string,string>  
17 - loginChange(){  
18 - Logger.debug("isLogin",'MinePageUserSimpleInfoUI')  
19 - if(this.loginState){  
20 - this.isLogin=true  
21 - }  
22 - }  
23 loginStateChange(){ 15 loginStateChange(){
24 if(this.isLogin){ 16 if(this.isLogin){
25 this.getUserInfo() 17 this.getUserInfo()
26 this.getUserLevel() 18 this.getUserLevel()
  19 + }else{
  20 + this.headPhotoUrl = ""
  21 + this.levelHead = ""
27 } 22 }
28 } 23 }
29 24
@@ -31,17 +26,20 @@ export default struct MinePageUserSimpleInfoUI { @@ -31,17 +26,20 @@ export default struct MinePageUserSimpleInfoUI {
31 Row(){ 26 Row(){
32 //头像 27 //头像
33 Stack(){ 28 Stack(){
34 - Image(this.headPhotoUrl) 29 + Image(this.headPhotoUrl==""?$r('app.media.default_head'):this.headPhotoUrl)
35 .alt($r('app.media.default_head')) 30 .alt($r('app.media.default_head'))
36 .width('100lpx') 31 .width('100lpx')
37 .height('100lpx') 32 .height('100lpx')
38 .objectFit(ImageFit.Cover) 33 .objectFit(ImageFit.Cover)
39 .borderRadius(50) 34 .borderRadius(50)
  35 +
  36 + if(StringUtils.isNotEmpty(this.levelHead)){
40 Image(this.levelHead) 37 Image(this.levelHead)
41 .width('130lpx') 38 .width('130lpx')
42 .height('130lpx') 39 .height('130lpx')
43 .objectFit(ImageFit.Cover) 40 .objectFit(ImageFit.Cover)
44 .borderRadius(50) 41 .borderRadius(50)
  42 + }
45 }.width('130lpx') 43 }.width('130lpx')
46 .height('130lpx') 44 .height('130lpx')
47 .alignContent(Alignment.Center) 45 .alignContent(Alignment.Center)
  1 +import { StringUtils } from 'wdKit/Index'
  2 +import { HttpUrlUtils } from 'wdNetwork/Index'
  3 +import MinePageDatasModel from '../../../model/MinePageDatasModel'
  4 +import { FollowListDetailItem } from '../../../viewmodel/FollowListDetailItem'
  5 +import { FollowOperationRequestItem } from '../../../viewmodel/FollowOperationRequestItem'
  6 +
  7 +@Component
  8 +export struct FollowChildComponent{
  9 + @ObjectLink data: FollowListDetailItem
  10 + @State type:number = 0
  11 +
  12 + build() {
  13 + if(this.type == 0 ){
  14 + Column(){
  15 + Blank().height('27lpx')
  16 +
  17 + Row() {
  18 + Image(StringUtils.isEmpty(this.data.headPhotoUrl)?$r('app.media.default_head'):this.data.headPhotoUrl)
  19 + .objectFit(ImageFit.Auto)
  20 + .width('92lpx')
  21 + .height('92lpx')
  22 + .margin({right:'15lpx'})
  23 +
  24 + Column(){
  25 + Text(this.data.cnUserName)
  26 + .fontWeight('400lpx')
  27 + .fontSize('31lpx')
  28 + .lineHeight('38lpx')
  29 + .fontColor($r('app.color.color_222222'))
  30 + .maxLines(1)
  31 + Text(`粉丝${this.data.cnFansNum}`)
  32 + .fontColor($r('app.color.color_B0B0B0'))
  33 + .fontSize('23lpx')
  34 + .maxLines(1)
  35 + Text(`${this.data.introduction}`)
  36 + .fontColor($r('app.color.color_B0B0B0'))
  37 + .fontSize('23lpx')
  38 + .maxLines(2)
  39 + .textOverflow({ overflow: TextOverflow.Ellipsis })
  40 + }.layoutWeight(1)
  41 + .alignItems(HorizontalAlign.Start)
  42 +
  43 + if(this.data.status == "1"){
  44 + Row(){
  45 + Text(`已关注`)
  46 + .fontColor($r('app.color.color_CCCCCC'))
  47 + .fontSize('23lpx')
  48 + .fontWeight('500lpx')
  49 + .lineHeight('35lpx')
  50 + }.backgroundColor($r('app.color.color_F5F5F5'))
  51 + .borderRadius('6lpx')
  52 + .borderColor($r('app.color.color_F5F5F5'))
  53 + .borderWidth('2lpx')
  54 + .justifyContent(FlexAlign.Center)
  55 + .width('100lpx')
  56 + .height('46lpx')
  57 + .margin({left:'4lpx',top:'23lpx'})
  58 + .onClick(()=>{
  59 + this.followOperation()
  60 + // this.data.status = "0"
  61 + })
  62 + }else{
  63 + Row(){
  64 + Image($r('app.media.follow_icon'))
  65 + .margin({right:'4lpx'})
  66 + .width('23lpx')
  67 + .height('23lpx')
  68 + Text(`关注`)
  69 + .fontColor($r('app.color.color_ED2800'))
  70 + .fontSize('23lpx')
  71 + .fontWeight('500lpx')
  72 + .lineHeight('35lpx')
  73 + }.borderColor($r('app.color.color_1AED2800'))
  74 + .borderRadius('6lpx')
  75 + .borderWidth('2lpx')
  76 + .justifyContent(FlexAlign.Center)
  77 + .width('100lpx')
  78 + .height('46lpx')
  79 + .margin({left:'4lpx',top:'23lpx'})
  80 + .onClick(()=>{
  81 + this.followOperation()
  82 + // this.data.status = "1"
  83 + })
  84 + }
  85 + }.alignItems(VerticalAlign.Top)
  86 + .width('100%')
  87 + .layoutWeight(1)
  88 +
  89 + Divider().width('100%')
  90 + .height('2lpx')
  91 + .strokeWidth('1lpx')
  92 + .backgroundColor($r('app.color.color_EDEDED'))
  93 +
  94 + }.height('146lpx')
  95 + .justifyContent(FlexAlign.Center)
  96 + .onClick(()=>{
  97 + //跳转 人民号的 主页
  98 + })
  99 + }else if(this.type == 1 ){
  100 + Column(){
  101 + Column(){
  102 +
  103 + Row() {
  104 + Row(){
  105 + Image(StringUtils.isEmpty(this.data.headPhotoUrl)?$r('app.media.default_head'):this.data.headPhotoUrl)
  106 + .objectFit(ImageFit.Auto)
  107 + .width('92lpx')
  108 + .height('92lpx')
  109 + .margin({right:'15lpx'})
  110 + .borderRadius(50)
  111 + .borderWidth('1lpx')
  112 + .borderColor($r('app.color.color_0D000000'))
  113 +
  114 + Column(){
  115 + Text(this.data.cnUserName)
  116 + .fontWeight('400lpx')
  117 + .fontSize('31lpx')
  118 + .lineHeight('38lpx')
  119 + .fontColor($r('app.color.color_222222'))
  120 + .maxLines(1)
  121 + .margin({bottom:'12lpx'})
  122 + Row(){
  123 + Text(`粉丝${this.data.cnFansNum}`)
  124 + .fontColor($r('app.color.color_B0B0B0'))
  125 + .fontSize('23lpx')
  126 +
  127 + Image($r("app.media.point"))
  128 + .width('31lpx')
  129 + .height('31lpx')
  130 + .objectFit(ImageFit.Auto)
  131 +
  132 + Text(`${this.data.introduction}`)
  133 + .fontColor($r('app.color.color_B0B0B0'))
  134 + .fontSize('23lpx')
  135 + .layoutWeight(1)
  136 + .maxLines(1)
  137 + .textOverflow({ overflow: TextOverflow.Ellipsis })
  138 + }.width('100%')
  139 + }
  140 + .layoutWeight(1)
  141 + .alignItems(HorizontalAlign.Start)
  142 + }.layoutWeight(1)
  143 +
  144 + if(this.data.status == "1"){
  145 + Row(){
  146 + Text(`已关注`)
  147 + .fontColor($r('app.color.color_CCCCCC'))
  148 + .fontSize('23lpx')
  149 + .fontWeight('500lpx')
  150 + .lineHeight('35lpx')
  151 + }
  152 + .justifyContent(FlexAlign.Center)
  153 + .width('100lpx')
  154 + .height('46lpx')
  155 + .onClick(()=>{
  156 + this.followOperation()
  157 + })
  158 + }else{
  159 + Row(){
  160 + Image($r('app.media.follow_icon'))
  161 + .margin({right:'4lpx'})
  162 + .width('23lpx')
  163 + .height('23lpx')
  164 + Text(`关注`)
  165 + .fontColor($r('app.color.color_ED2800'))
  166 + .fontSize('23lpx')
  167 + .fontWeight('500lpx')
  168 + .lineHeight('35lpx')
  169 + }.borderColor($r('app.color.color_1AED2800'))
  170 + .borderRadius('6lpx')
  171 + .borderWidth('2lpx')
  172 + .justifyContent(FlexAlign.Center)
  173 + .width('100lpx')
  174 + .height('46lpx')
  175 + .onClick(()=>{
  176 + this.followOperation()
  177 + })
  178 + }
  179 + }
  180 + .width('100%')
  181 + .height('92lpx')
  182 + .justifyContent(FlexAlign.SpaceBetween)
  183 +
  184 + }.height('146lpx')
  185 + .justifyContent(FlexAlign.Center)
  186 + .onClick(()=>{
  187 + })
  188 +
  189 + Divider().width('100%')
  190 + .height('1lpx')
  191 + .strokeWidth('1lpx')
  192 + .backgroundColor($r('app.color.color_EDEDED'))
  193 + }.width('100%')
  194 +
  195 + }
  196 +
  197 + }
  198 +
  199 + followOperation(){
  200 + let item = new FollowOperationRequestItem(this.data.cnUserType,this.data.cnUserId,this.data.creatorId,HttpUrlUtils.getUserType(),HttpUrlUtils.getUserId(),this.data.status==="0" ? 1:0)
  201 + MinePageDatasModel.getFollowOperation(item,getContext(this)).then((value)=>{
  202 + if(value!=null){
  203 + if (value.code === 0 || value.code.toString() === "0") {
  204 + this.data.status = this.data.status ==="0"?"1":"0"
  205 + }
  206 + }
  207 + })
  208 + }
  209 +}
1 -import { Params } from 'wdBean';  
2 -import { LazyDataSource, StringUtils } from 'wdKit';  
3 -import { HttpUrlUtils } from 'wdNetwork';  
4 -import { WDRouterPage, WDRouterRule } from 'wdRouter'; 1 +import { LazyDataSource } from 'wdKit';
5 import MinePageDatasModel from '../../../model/MinePageDatasModel'; 2 import MinePageDatasModel from '../../../model/MinePageDatasModel';
6 import { FollowListDetailItem } from '../../../viewmodel/FollowListDetailItem' 3 import { FollowListDetailItem } from '../../../viewmodel/FollowListDetailItem'
7 import { FollowListDetailRequestItem } from '../../../viewmodel/FollowListDetailRequestItem'; 4 import { FollowListDetailRequestItem } from '../../../viewmodel/FollowListDetailRequestItem';
8 import { FollowListStatusRequestItem } from '../../../viewmodel/FollowListStatusRequestItem'; 5 import { FollowListStatusRequestItem } from '../../../viewmodel/FollowListStatusRequestItem';
9 -import { FollowOperationRequestItem } from '../../../viewmodel/FollowOperationRequestItem';  
10 import { MineFollowListDetailItem } from '../../../viewmodel/MineFollowListDetailItem'; 6 import { MineFollowListDetailItem } from '../../../viewmodel/MineFollowListDetailItem';
11 import { QueryListIsFollowedItem } from '../../../viewmodel/QueryListIsFollowedItem'; 7 import { QueryListIsFollowedItem } from '../../../viewmodel/QueryListIsFollowedItem';
12 import { ListHasNoMoreDataUI } from '../../reusable/ListHasNoMoreDataUI'; 8 import { ListHasNoMoreDataUI } from '../../reusable/ListHasNoMoreDataUI';
  9 +import { FollowChildComponent } from './FollowChildComponent';
13 10
14 const TAG = "FollowListDetailUI" 11 const TAG = "FollowListDetailUI"
15 @Component 12 @Component
16 export struct FollowListDetailUI{ 13 export struct FollowListDetailUI{
17 @State creatorDirectoryId:number = -1; 14 @State creatorDirectoryId:number = -1;
  15 + @State type:number = 0
18 @State data: LazyDataSource<FollowListDetailItem> = new LazyDataSource(); 16 @State data: LazyDataSource<FollowListDetailItem> = new LazyDataSource();
19 @State count:number = 0; 17 @State count:number = 0;
20 @State isLoading:boolean = false 18 @State isLoading:boolean = false
@@ -22,7 +20,6 @@ export struct FollowListDetailUI{ @@ -22,7 +20,6 @@ export struct FollowListDetailUI{
22 curPageNum:number = 1; 20 curPageNum:number = 1;
23 21
24 aboutToAppear(){ 22 aboutToAppear(){
25 - console.log("YCG","aboutToAppear==="+this.creatorDirectoryId);  
26 this.getNewPageData() 23 this.getNewPageData()
27 } 24 }
28 25
@@ -35,7 +32,7 @@ export struct FollowListDetailUI{ @@ -35,7 +32,7 @@ export struct FollowListDetailUI{
35 List({ space: 3 }) { 32 List({ space: 3 }) {
36 LazyForEach(this.data, (item: FollowListDetailItem, index: number = 0) => { 33 LazyForEach(this.data, (item: FollowListDetailItem, index: number = 0) => {
37 ListItem() { 34 ListItem() {
38 - ChildComponent({data: item}) 35 + FollowChildComponent({data: item,type:this.type})
39 } 36 }
40 .onClick(() => { 37 .onClick(() => {
41 }) 38 })
@@ -76,7 +73,8 @@ export struct FollowListDetailUI{ @@ -76,7 +73,8 @@ export struct FollowListDetailUI{
76 this.hasMore = false 73 this.hasMore = false
77 }else{ 74 }else{
78 value.list.forEach((value)=>{ 75 value.list.forEach((value)=>{
79 - this.data.push(new FollowListDetailItem(value.attentionHeadPhotoUrl,value.attentionUserName,value.fansNum,value.introduction,value.attentionCreatorId,"1",value.attentionUserId,value.attentionUserType,value.attentionUserId)) 76 +
  77 + this.data.push(new FollowListDetailItem(value.attentionHeadPhotoUrl,value.attentionUserName,value.fansNum+"",value.introduction,value.attentionCreatorId,"1",value.attentionUserId,value.attentionUserType,value.attentionUserId))
80 }) 78 })
81 this.data.notifyDataReload() 79 this.data.notifyDataReload()
82 this.count = this.data.totalCount() 80 this.count = this.data.totalCount()
@@ -149,111 +147,3 @@ export struct FollowListDetailUI{ @@ -149,111 +147,3 @@ export struct FollowListDetailUI{
149 } 147 }
150 148
151 } 149 }
152 -  
153 -@Component  
154 -struct ChildComponent {  
155 - @ObjectLink data: FollowListDetailItem  
156 -  
157 - build() {  
158 - Column(){  
159 - Blank().height('27lpx')  
160 -  
161 - Row() {  
162 - Image(StringUtils.isEmpty(this.data.headPhotoUrl)?$r('app.media.default_head'):this.data.headPhotoUrl)  
163 - .objectFit(ImageFit.Auto)  
164 - .width('92lpx')  
165 - .height('92lpx')  
166 - .margin({right:'15lpx'})  
167 -  
168 - Column(){  
169 - Text(this.data.cnUserName)  
170 - .fontWeight('400lpx')  
171 - .fontSize('31lpx')  
172 - .lineHeight('38lpx')  
173 - .fontColor($r('app.color.color_222222'))  
174 - .maxLines(1)  
175 - Text(`粉丝${this.data.cnFansNum}`)  
176 - .fontColor($r('app.color.color_B0B0B0'))  
177 - .fontSize('23lpx')  
178 - .maxLines(1)  
179 - Text(`${this.data.introduction}`)  
180 - .fontColor($r('app.color.color_B0B0B0'))  
181 - .fontSize('23lpx')  
182 - .maxLines(2)  
183 - .textOverflow({ overflow: TextOverflow.Ellipsis })  
184 - }.layoutWeight(1)  
185 - .alignItems(HorizontalAlign.Start)  
186 -  
187 - if(this.data.status == "1"){  
188 - Row(){  
189 - Text(`已关注`)  
190 - .fontColor($r('app.color.color_CCCCCC'))  
191 - .fontSize('23lpx')  
192 - .fontWeight('500lpx')  
193 - .lineHeight('35lpx')  
194 - }.backgroundColor($r('app.color.color_F5F5F5'))  
195 - .borderRadius('6lpx')  
196 - .borderColor($r('app.color.color_F5F5F5'))  
197 - .borderWidth('2lpx')  
198 - .justifyContent(FlexAlign.Center)  
199 - .width('100lpx')  
200 - .height('46lpx')  
201 - .margin({left:'4lpx',top:'23lpx'})  
202 - .onClick(()=>{  
203 - this.followOperation()  
204 - // this.data.status = "0"  
205 - })  
206 - }else{  
207 - Row(){  
208 - Image($r('app.media.follow_icon'))  
209 - .margin({right:'4lpx'})  
210 - .width('23lpx')  
211 - .height('23lpx')  
212 - Text(`关注`)  
213 - .fontColor($r('app.color.color_ED2800'))  
214 - .fontSize('23lpx')  
215 - .fontWeight('500lpx')  
216 - .lineHeight('35lpx')  
217 - }.borderColor($r('app.color.color_1AED2800'))  
218 - .borderRadius('6lpx')  
219 - .borderWidth('2lpx')  
220 - .justifyContent(FlexAlign.Center)  
221 - .width('100lpx')  
222 - .height('46lpx')  
223 - .margin({left:'4lpx',top:'23lpx'})  
224 - .onClick(()=>{  
225 - this.followOperation()  
226 - // this.data.status = "1"  
227 - })  
228 - }  
229 - }.alignItems(VerticalAlign.Top)  
230 - .width('100%')  
231 - .layoutWeight(1)  
232 -  
233 - Divider().width('100%')  
234 - .height('2lpx')  
235 - .strokeWidth('1lpx')  
236 - .backgroundColor($r('app.color.color_EDEDED'))  
237 -  
238 - }.height('146lpx')  
239 - .justifyContent(FlexAlign.Center)  
240 - .onClick(()=>{  
241 - //跳转 人民号的 主页  
242 - // let params: Params = {  
243 - // pageID: this.data.attentionUserId  
244 - // }  
245 - // WDRouterRule.jumpWithPage(WDRouterPage.otherNormalUserHomePagePage,params)  
246 - })  
247 - }  
248 -  
249 - followOperation(){  
250 - let item = new FollowOperationRequestItem(this.data.cnUserType,this.data.cnUserId,this.data.creatorId,HttpUrlUtils.getUserType(),HttpUrlUtils.getUserId(),this.data.status==="0" ? 1:0)  
251 - MinePageDatasModel.getFollowOperation(item,getContext(this)).then((value)=>{  
252 - if(value!=null){  
253 - if (value.code === 0 || value.code.toString() === "0") {  
254 - this.data.status = this.data.status ==="0"?"1":"0"  
255 - }  
256 - }  
257 - })  
258 - }  
259 -}  
@@ -23,7 +23,8 @@ export struct FollowSecondTabsComponent{ @@ -23,7 +23,8 @@ export struct FollowSecondTabsComponent{
23 23
24 if(this.data != null){ 24 if(this.data != null){
25 if(this.data[this.firstIndex].children == null || this.data[this.firstIndex].children.length == 0){ 25 if(this.data[this.firstIndex].children == null || this.data[this.firstIndex].children.length == 0){
26 - FollowListDetailUI({creatorDirectoryId:this.data[this.firstIndex].id}).layoutWeight(1) 26 + FollowListDetailUI({creatorDirectoryId:this.data[this.firstIndex].id,type:1})
  27 + .layoutWeight(1)
27 }else{ 28 }else{
28 this.FollowSecondUI() 29 this.FollowSecondUI()
29 } 30 }
@@ -184,7 +184,7 @@ export struct HomePageBottomComponent{ @@ -184,7 +184,7 @@ export struct HomePageBottomComponent{
184 this.hasMore = false 184 this.hasMore = false
185 }else{ 185 }else{
186 value.list.forEach((value)=>{ 186 value.list.forEach((value)=>{
187 - this.data_follow.push(new FollowListDetailItem(value.attentionHeadPhotoUrl,value.attentionUserName,value.fansNum,value.introduction,value.attentionCreatorId,"1",value.attentionUserId,value.attentionUserType,value.attentionUserId)) 187 + this.data_follow.push(new FollowListDetailItem(value.attentionHeadPhotoUrl,value.attentionUserName,value.fansNum+"",value.introduction,value.attentionCreatorId,"1",value.attentionUserId,value.attentionUserType,value.attentionUserId))
188 }) 188 })
189 this.data_follow.notifyDataReload() 189 this.data_follow.notifyDataReload()
190 this.count = this.data_follow.totalCount() 190 this.count = this.data_follow.totalCount()
@@ -116,7 +116,7 @@ export struct OtherHomePageBottomFollowComponent{ @@ -116,7 +116,7 @@ export struct OtherHomePageBottomFollowComponent{
116 this.hasMore = false 116 this.hasMore = false
117 }else{ 117 }else{
118 value.list.forEach((value)=>{ 118 value.list.forEach((value)=>{
119 - this.data_follow.push(new FollowListDetailItem(value.attentionHeadPhotoUrl,value.attentionUserName,value.fansNum,value.introduction,value.attentionCreatorId,"1",value.attentionUserId,value.cnUserType,value.cnUserId)) 119 + this.data_follow.push(new FollowListDetailItem(value.attentionHeadPhotoUrl,value.attentionUserName,value.fansNum+"",value.introduction,value.attentionCreatorId,"1",value.attentionUserId,value.cnUserType,value.cnUserId))
120 }) 120 })
121 this.data_follow.notifyDataReload() 121 this.data_follow.notifyDataReload()
122 this.count = this.data_follow.totalCount() 122 this.count = this.data_follow.totalCount()
@@ -4,11 +4,10 @@ import MinePageMoreFunctionModel from '../../viewmodel/MinePageMoreFunctionModel @@ -4,11 +4,10 @@ import MinePageMoreFunctionModel from '../../viewmodel/MinePageMoreFunctionModel
4 import MinePageDatasModel from '../../model/MinePageDatasModel' 4 import MinePageDatasModel from '../../model/MinePageDatasModel'
5 import MinePageUserSimpleInfoUI from '../mine/MinePageUserSimpleInfoUI' 5 import MinePageUserSimpleInfoUI from '../mine/MinePageUserSimpleInfoUI'
6 import MinePagePersonFunctionUI from '../mine/MinePagePersonFunctionUI' 6 import MinePagePersonFunctionUI from '../mine/MinePagePersonFunctionUI'
7 -import MinePageCardUI from '../mine/MinePageCardUI'  
8 -import MinePageCreatorFunctionUI from '../mine/MinePageCreatorFunctionUI'  
9 import MinePageMoreFunctionUI from '../mine/MinePageMoreFunctionUI' 7 import MinePageMoreFunctionUI from '../mine/MinePageMoreFunctionUI'
10 import { SPHelper, StringUtils } from 'wdKit' 8 import { SPHelper, StringUtils } from 'wdKit'
11 import { SpConstants } from 'wdConstant' 9 import { SpConstants } from 'wdConstant'
  10 +import dataPreferences from '@ohos.data.preferences';
12 11
13 const TAG = 'MinePageComponent'; 12 const TAG = 'MinePageComponent';
14 13
@@ -24,12 +23,29 @@ export struct MinePageComponent { @@ -24,12 +23,29 @@ export struct MinePageComponent {
24 @State creatorData:MinePageCreatorFunctionsItem[] = [] 23 @State creatorData:MinePageCreatorFunctionsItem[] = []
25 @State moreData:MinePageMoreFunctionModel[] = [] 24 @State moreData:MinePageMoreFunctionModel[] = []
26 scroller: Scroller = new Scroller() 25 scroller: Scroller = new Scroller()
  26 + preferences: dataPreferences.Preferences | null = null;
27 27
28 aboutToAppear(){ 28 aboutToAppear(){
29 this.getUserLogin() 29 this.getUserLogin()
30 this.getFunctionData() 30 this.getFunctionData()
  31 + this.addLoginStatusObserver()
31 } 32 }
32 33
  34 + async addLoginStatusObserver(){
  35 + this.preferences = await SPHelper.default.getPreferences();
  36 + let observer = (key: string) => {
  37 + if(key == SpConstants.USER_ID){
  38 + if(StringUtils.isEmpty(SPHelper.default.getSync(SpConstants.USER_ID,""))){
  39 + this.isLogin = false
  40 + }else {
  41 + this.isLogin = true
  42 + }
  43 + }
  44 + }
  45 + this.preferences.on('change', observer);
  46 + }
  47 +
  48 +
33 getFunctionData(){ 49 getFunctionData(){
34 //个人功能数据 50 //个人功能数据
35 this.personalData = MinePageDatasModel.getPersonalFunctionsData() 51 this.personalData = MinePageDatasModel.getPersonalFunctionsData()
@@ -13,6 +13,7 @@ import CustomRefreshLoadLayout from './CustomRefreshLoadLayout'; @@ -13,6 +13,7 @@ import CustomRefreshLoadLayout from './CustomRefreshLoadLayout';
13 import { CompParser } from '../CompParser'; 13 import { CompParser } from '../CompParser';
14 import { CompDTO } from 'wdBean'; 14 import { CompDTO } from 'wdBean';
15 import PageHelper from '../../viewmodel/PageHelper'; 15 import PageHelper from '../../viewmodel/PageHelper';
  16 +import { channelSkeleton } from '../skeleton/channelSkeleton'
16 17
17 const TAG = 'PageComponent'; 18 const TAG = 'PageComponent';
18 19
@@ -77,11 +78,13 @@ export struct PageComponent { @@ -77,11 +78,13 @@ export struct PageComponent {
77 refreshBean: new RefreshLayoutBean(this.pageModel.isVisiblePullUpLoad, this.pageModel.pullUpLoadImage, 78 refreshBean: new RefreshLayoutBean(this.pageModel.isVisiblePullUpLoad, this.pageModel.pullUpLoadImage,
78 this.pageModel.pullUpLoadText, this.pageModel.pullUpLoadHeight) 79 this.pageModel.pullUpLoadText, this.pageModel.pullUpLoadHeight)
79 }) 80 })
80 - } else { 81 + } else if (!this.pageModel.contentNeedScroll) {
81 NoMoreLayout() 82 NoMoreLayout()
82 } 83 }
83 } 84 }
84 } 85 }
  86 + // comp自己处理分页,这里设置EdgeEffect.None
  87 + .edgeEffect(this.pageModel.contentNeedScroll ? EdgeEffect.None : EdgeEffect.Spring)
85 .scrollBar(BarState.Off) 88 .scrollBar(BarState.Off)
86 .cachedCount(8) 89 .cachedCount(8)
87 .height(CommonConstants.FULL_PARENT) 90 .height(CommonConstants.FULL_PARENT)
@@ -95,10 +98,11 @@ export struct PageComponent { @@ -95,10 +98,11 @@ export struct PageComponent {
95 98
96 @Builder 99 @Builder
97 LoadingLayout() { 100 LoadingLayout() {
98 - CustomRefreshLoadLayout({  
99 - refreshBean: new RefreshLayoutBean(true,  
100 - $r('app.media.ic_pull_up_load'), $r('app.string.pull_up_load_text'), this.pageModel.pullDownRefreshHeight)  
101 - }) 101 + channelSkeleton()
  102 + // CustomRefreshLoadLayout({
  103 + // refreshBean: new RefreshLayoutBean(true,
  104 + // $r('app.media.ic_pull_up_load'), $r('app.string.pull_up_load_text'), this.pageModel.pullDownRefreshHeight)
  105 + // })
102 } 106 }
103 107
104 async aboutToAppear() { 108 async aboutToAppear() {
  1 +import router from '@ohos.router'
  2 +import { PeopleShipHomePageNavComponent } from '../peopleShipHomePage/PeopleShipHomeNavComponent'
  3 +import { PeopleShipHomePageTopComponent } from '../peopleShipHomePage/PeopleShipHomePageTopComponent'
  4 +import { Logger } from 'wdKit'
  5 +import { PeopleShipHomePageDataModel } from '../../viewmodel/PeopleShipHomePageDataModel'
  6 +import { PeopleShipHomeListComponent } from '../peopleShipHomePage/PeopleShipHomeListComponent'
  7 +import { QueryListIsFollowedItem } from '../../viewmodel/QueryListIsFollowedItem'
  8 +import { HttpUrlUtils } from 'wdNetwork/Index'
  9 +import { WDRouterPage, WDRouterRule } from 'wdRouter/Index'
  10 +import { PageRepository } from '../../repository/PageRepository'
  11 +import {
  12 + postInteractAccentionOperateParams,
  13 + PeopleShipUserDetailData,
  14 + ArticleCountData
  15 +} from 'wdBean'
  16 +
  17 +@Entry
  18 +@Component
  19 +struct PeopleShipHomePage {
  20 + // Todo 传入数据 后续在修改
  21 + creatorId: string = (router.getParams() as Record<string, string>)['creatorId'];
  22 + @State arr: number[] = []
  23 + // 页面详情数据
  24 + @Provide detailModel: PeopleShipUserDetailData = {} as PeopleShipUserDetailData
  25 + // 每个分类数量
  26 + @State articleModel: ArticleCountData = {} as ArticleCountData
  27 + // 总滑动空间
  28 + scroller: Scroller = new Scroller()
  29 + // 顶部透明度
  30 + @State topOpacity: number = 0
  31 + //发布数量
  32 + @State publishCount: number = 0
  33 + // 是否关注
  34 + @Provide isAttention: string = '0'
  35 + // 是否开始更新关注
  36 + @Provide @Watch('handleChangeAttentionStata') isLoadingAttention: boolean = false
  37 + //关注显示
  38 + @Prop attentionOpacity: boolean = false
  39 + @Provide topHeight: number = 400
  40 +
  41 + build() {
  42 +
  43 + Stack({ alignContent: Alignment.TopStart }) {
  44 + // 头部返回
  45 + PeopleShipHomePageNavComponent({
  46 + attentionOpacity: this.attentionOpacity,
  47 + topOpacity: this.topOpacity,
  48 + detailModel: this.detailModel
  49 + })
  50 + .height($r('app.float.top_bar_height'))
  51 + .zIndex(100)
  52 + .backgroundColor(Color.Transparent)
  53 +
  54 + if (this.detailModel && this.detailModel.userName) {
  55 + Scroll(this.scroller) {
  56 + Column() {
  57 + // 顶部相关
  58 + PeopleShipHomePageTopComponent({
  59 + creatorId: this.creatorId,
  60 + detailModel: this.detailModel,
  61 + publishCount: this.publishCount,
  62 + topHeight: this.topHeight
  63 + })
  64 + .width("100%")
  65 + .height(this.topHeight)
  66 + .backgroundColor(Color.White)
  67 +
  68 + // 列表
  69 + PeopleShipHomeListComponent({
  70 + publishCount: this.publishCount,
  71 + creatorId: this.creatorId
  72 + })
  73 +
  74 + }
  75 + .width("100%")
  76 + .justifyContent(FlexAlign.Start)
  77 + // .height(this.publishCount == 0 ? '100%' : '')
  78 + }
  79 + .edgeEffect(EdgeEffect.None)
  80 + .friction(0.6)
  81 + .backgroundColor(Color.White)
  82 + .scrollBar(BarState.Off)
  83 + .width('100%')
  84 + .height('100%')
  85 + .onScroll(() => {
  86 + // this.topOpacity = yOffset / (this.getDeviceHeight() * 0.2)
  87 + this.topOpacity = this.scroller.currentOffset().yOffset / 100
  88 + if (this.scroller.currentOffset().yOffset >= this.topHeight - 66) {
  89 + this.attentionOpacity = true
  90 + } else {
  91 + this.attentionOpacity = false
  92 + }
  93 + console.log(`全局请求失败拦截,message:${this.topOpacity}`)
  94 + // System.out.println("输出高度:"+ AttrHelper.vp2px(height,this));
  95 +
  96 + })
  97 + }
  98 +
  99 + }
  100 +
  101 + }
  102 +
  103 + async aboutToAppear() {
  104 +
  105 + try {
  106 + // 获取页面信息
  107 + this.detailModel = await PeopleShipHomePageDataModel.getPeopleShipHomePageDetailInfo(this.creatorId, '', '')
  108 + Logger.debug('PeopleShipHomePage', '获取页面信息', `${JSON.stringify(this.detailModel)}`)
  109 +
  110 + // 获取关注
  111 + let followList: QueryListIsFollowedItem[] = await PeopleShipHomePageDataModel.getHomePageFollowListStatusData(this.creatorId)
  112 + Logger.debug('PeopleShipHomePage', '获取关注信息', `${JSON.stringify(followList)}`)
  113 + this.findFollowStata(followList)
  114 +
  115 + } catch (exception) {
  116 +
  117 + }
  118 +
  119 +
  120 + }
  121 +
  122 + findFollowStata(followList: QueryListIsFollowedItem[]) {
  123 + if (followList.length > 0) {
  124 + let item: QueryListIsFollowedItem = followList[0]
  125 + Logger.debug('PeopleShipHomePage', '关注', `${JSON.stringify(item.status)}`)
  126 + this.isAttention = item.status
  127 + }
  128 + }
  129 +
  130 + handleChangeAttentionStata() {
  131 + if (!this.isLoadingAttention) {
  132 + return
  133 + }
  134 + // 未登录,跳转登录
  135 + if (!HttpUrlUtils.getUserId()) {
  136 + WDRouterRule.jumpWithPage(WDRouterPage.loginPage)
  137 + return
  138 + }
  139 + let status = 0
  140 + if (this.isAttention == '0') {
  141 + status = 1
  142 + }
  143 + const params: postInteractAccentionOperateParams = {
  144 + attentionUserType: this.detailModel.userType || '', //被关注用户类型(1 普通用户 2 视频号 3 矩阵号)
  145 + attentionUserId: this.detailModel.userId || '', // 被关注用户号主id
  146 + attentionCreatorId: this.creatorId || '', // 被关注用户号主id
  147 + // userType: 1,
  148 + // userId: HttpUrlUtils.getUserId(),
  149 + status: status,
  150 + }
  151 + PageRepository.postInteractAccentionOperate(params).then(res => {
  152 + if (this.isAttention == '1') {
  153 + this.isAttention = '0'
  154 + } else {
  155 + this.isAttention = '1'
  156 + }
  157 + this.isLoadingAttention = false
  158 + })
  159 + .catch(() => {
  160 + this.isLoadingAttention = false
  161 + })
  162 + }
  163 +}
  164 +
  1 +import { Logger, DisplayUtils} from 'wdKit'
  2 +import { PeopleShipHomePageDataModel } from '../../viewmodel/PeopleShipHomePageDataModel'
  3 +import {
  4 + ContentDTO,
  5 + ArticleListDTO,
  6 + LiveDTO,
  7 + LiveInfoDTO,
  8 + FullColumnImgUrlDTO,
  9 + VideoInfoDTO,
  10 + RmhInfoDTO,
  11 + contentListParams,
  12 + InteractDataDTO,
  13 + ArticleTypeData,
  14 + ArticleListData,
  15 + PeopleShipUserDetailData
  16 +} from 'wdBean'
  17 +import { CardParser } from '../CardParser'
  18 +import { PageRepository } from '../../repository/PageRepository'
  19 +import { RefreshLayoutBean } from '../page/RefreshLayoutBean'
  20 +import CustomRefreshLoadLayout from '../page/CustomRefreshLoadLayout'
  21 +import { ErrorComponent } from '../view/ErrorComponent';
  22 +import NoMoreLayout from '../page/NoMoreLayout';
  23 +import { LazyDataSource } from 'wdKit';
  24 +
  25 +const TAG = 'PeopleShipHomeArticleListComponent';
  26 +
  27 +@Component
  28 +export struct PeopleShipHomeArticleListComponent {
  29 + // @State arr: ContentDTO[] = []
  30 + @State arr: LazyDataSource<ContentDTO> = new LazyDataSource();
  31 + @State typeModel: ArticleTypeData = new ArticleTypeData()
  32 + @State creatorId: string = ''
  33 + @Consume detailModel: PeopleShipUserDetailData
  34 + @State private viewType: number = 1;
  35 + currentIndex: number = 0
  36 + @Link @Watch('onChange') currentTopSelectedIndex: number
  37 + @State private hasMore: boolean = true
  38 + @State currentPage: number = 1
  39 + @State private isLoading: boolean = false
  40 + @Consume topHeight: number
  41 +
  42 + build() {
  43 + if (this.viewType == 1) {
  44 + // LoadingComponent()
  45 + this.LoadingLayout()
  46 + } else if (this.viewType == 2) {
  47 + ErrorComponent()
  48 + } else {
  49 + this.ListLayout()
  50 + }
  51 +
  52 + }
  53 +
  54 + @Builder
  55 + LoadingLayout() {
  56 + CustomRefreshLoadLayout({
  57 + refreshBean: new RefreshLayoutBean(true,
  58 + $r('app.media.ic_pull_up_load'), $r('app.string.pull_up_load_text'), 20)
  59 + }).height(DisplayUtils.getDeviceHeight() - this.topHeight)
  60 + }
  61 +
  62 + @Builder
  63 + ListLayout() {
  64 +
  65 + List() {
  66 + // 下拉刷新
  67 +
  68 + LazyForEach(this.arr, (item: ContentDTO) => {
  69 + ListItem() {
  70 + CardParser({ contentDTO: item })
  71 + }.width("100%")
  72 + .backgroundColor(Color.Transparent)
  73 + }, (item: ContentDTO, index: number) => item.objectId + index.toString())
  74 +
  75 + // 加载更多
  76 + ListItem() {
  77 + if (!this.hasMore) {
  78 + NoMoreLayout()
  79 + }
  80 + }
  81 + }
  82 + .width("100%")
  83 + .height("100%")
  84 + .edgeEffect(EdgeEffect.Spring)
  85 + .nestedScroll({
  86 + scrollForward: NestedScrollMode.PARENT_FIRST,
  87 + scrollBackward: NestedScrollMode.SELF_FIRST
  88 + })
  89 +
  90 + .onReachEnd(() => {
  91 + if(!this.isLoading && this.hasMore){
  92 + //加载分页数据
  93 + this.getPeopleShipPageArticleList()
  94 + }
  95 + })
  96 + }
  97 +
  98 + aboutToAppear() {
  99 + if (this.currentIndex == this.currentTopSelectedIndex) {
  100 + this.currentPage = 1
  101 + this.getPeopleShipPageArticleList()
  102 + }
  103 + }
  104 +
  105 + onChange() {
  106 + if (this.currentIndex == this.currentTopSelectedIndex) {
  107 + this.currentPage = 1
  108 + this.getPeopleShipPageArticleList()
  109 + }
  110 + }
  111 +
  112 + private async getPeopleShipPageArticleList() {
  113 + Logger.info(`获取页面信息PeopleShipHomeArticleListComponent${this.typeModel.type}`)
  114 + if (this.isLoading) {
  115 + return
  116 + }
  117 + try {
  118 + this.isLoading = true
  119 + let listData: ArticleListData = await PeopleShipHomePageDataModel.getPeopleShipHomePageArticleListData(this.creatorId, this.currentPage, 20, this.typeModel.type)
  120 + Logger.debug(TAG, `获取页面信息, ${listData.list.length}`);
  121 +
  122 + if (listData && listData.list && listData.list.length > 0) {
  123 + this.viewType = 3;
  124 + if (listData.list.length === 20) {
  125 + this.currentPage++;
  126 + this.hasMore = true;
  127 + } else {
  128 + this.hasMore = false;
  129 + }
  130 + } else {
  131 + this.viewType = 1;
  132 + }
  133 + this.queryArticleContentInteractCount(listData)
  134 + Logger.debug(TAG, '展示的总数', `${this.arr.totalCount()}`)
  135 + }catch (exception) {
  136 + this.isLoading = false
  137 + if (this.arr.totalCount() == 0) {
  138 + this.viewType = 2
  139 + }
  140 + }
  141 +
  142 + }
  143 +
  144 + /**
  145 + * 查询点赞、收藏数量
  146 + */
  147 + private queryArticleContentInteractCount(listData: ArticleListData) {
  148 + if (listData && listData.list && listData.list.length > 0) {
  149 + const params: contentListParams = {
  150 + contentList: []
  151 + }
  152 + listData.list.map((item: ArticleListDTO) => {
  153 + params.contentList.push({
  154 + contentId: item.id,
  155 + contentType: item.type
  156 + })
  157 + });
  158 + PageRepository.getContentInteract(params).then(res => {
  159 + this.articleListDTOChangeContentDTO(listData, res.data ?? [])
  160 + }).catch(() => {
  161 + this.articleListDTOChangeContentDTO(listData, [])
  162 + })
  163 +
  164 + }
  165 + }
  166 +
  167 + private articleListDTOChangeContentDTO(listData: ArticleListData, listCom: InteractDataDTO[]) {
  168 + this.isLoading = false
  169 + if (listData.list.length) {
  170 + for (const element of listData.list) {
  171 + let contentDTO = {} as ContentDTO
  172 + contentDTO.appStyle = this.changeCommon(element.appStyle)
  173 + contentDTO.newsTitle = element.title;
  174 + contentDTO.newsSummary = element.description;
  175 + contentDTO.objectId = element.id;
  176 + // 评论数
  177 + const comModel = listCom.find((item) => {
  178 + return item.contentId == element.id
  179 + })
  180 + if (comModel) {
  181 + contentDTO.interactData = comModel
  182 + }
  183 + //1:小图卡,2:大图卡,3:无图卡(全标题),
  184 + // 4:三图卡,5:头图卡,6:小视频卡,7:作者卡,8:财经快讯卡,
  185 + // 9:时间轴卡,10:大专题卡,
  186 + // 11.无图卡(标题缩略),12.无图卡(标题缩略)-人民号,
  187 + // 13.单图卡,14.单图卡-人民号,
  188 + // 15.大图卡-人民号,16.三图卡-人民号,17.图集卡,18.图集卡-人民号,
  189 + // 19.动态图文卡-人民号,20.动态视频卡-人民号,
  190 + // 21 小视频卡-人民号
  191 + contentDTO.objectType = `${element.type}`;
  192 +
  193 + // contentDTO.productNum = element.productCount;
  194 + // if (master) {
  195 + // contentDTO.customWorkStatus = element.workStatus;
  196 + // }
  197 + // contentDTO.customSchedulePublishTime = element.contentPublishTasks.firstObject.schedulePublishTime;
  198 + contentDTO.fullColumnImgUrls = this.fullColumnImgUrls(element);
  199 +
  200 + let rmhInfo = this.convertToRmhInfoWithAccountModel()
  201 + if (rmhInfo) {
  202 + contentDTO.rmhInfo = rmhInfo;
  203 + }
  204 + let liveInfo = this.convertToProgramLiveInfoModel(element.live);
  205 + if (liveInfo) {
  206 + contentDTO.liveInfo = liveInfo;
  207 + if (element.vlives && element.vlives.length > 0) {
  208 + let vlivesModel = element.vlives[0]
  209 + if (vlivesModel.recordUrl && vlivesModel.recordUrl.length > 0) {
  210 + contentDTO.liveInfo.replayUri = vlivesModel.recordUrl
  211 + }
  212 + }
  213 + }
  214 +
  215 + let videInfo1 = this.convertToVideoInfo(element);
  216 + if (videInfo1) {
  217 + contentDTO.videoInfo = videInfo1
  218 + }
  219 + // contentDTO.shareInfo = [self.contentShare.firstObject convertToShareInfo];
  220 + // contentDTO.shareInfo.shareUrl = self.shareUrl;
  221 + if (element.createTime.length > 0) {
  222 + contentDTO.publishTime = this.convertPublishTimeWith(element.createTime);
  223 + } else if (element.updateTime.length > 0) {
  224 + contentDTO.publishTime = this.convertPublishTimeWith(element.updateTime);
  225 + } else if (element.firstPublishTime.length > 0) {
  226 + contentDTO.publishTime = this.convertPublishTimeWith(element.firstPublishTime);
  227 + } else if (element.publishTime.length > 0) {
  228 + contentDTO.publishTime = this.convertPublishTimeWith(element.publishTime);
  229 + }
  230 +
  231 +
  232 + //图集数量
  233 + contentDTO.photoNum = element.mainPicCount;
  234 +
  235 + if (element.contentExt && element.contentExt.length > 0) {
  236 + let extModel = element.contentExt[0];
  237 + contentDTO.openLikes = extModel.openLikes;
  238 + contentDTO.openComment = extModel.openComment;
  239 + }
  240 + // 页面
  241 + if (contentDTO.appStyle == '2' || contentDTO.appStyle == '13' || contentDTO.appStyle == '20') {
  242 + if (element.appStyleImages && element.appStyleImages.length > 0) {
  243 + contentDTO.coverUrl = element.appStyleImages[0].fullUrl
  244 + } else if (element.contentPictures && element.contentPictures.length > 0) {
  245 + contentDTO.coverUrl = element.contentPictures[0].fullUrl
  246 + }
  247 + }
  248 + // infoModel.api_isFollowListDataSource = YES;
  249 + // //infoModel.topicTemplate = [self.topicTemplate integerValue];
  250 + // //infoModel.objectLevel = self.topicType;
  251 + // //infoModel.pageId = self.pageId;
  252 + contentDTO.source = this.detailModel.userName;
  253 + // infoModel.opusAllowEdit = master && !([self.workStatus isEqualToString:@"2"] ||
  254 + // [self.workStatus isEqualToString:@"6"] ||
  255 + // [self.workStatus isEqualToString:@"5"] ||
  256 + // [self.workStatus isEqualToString:@"8"] ||
  257 + // !self.workStatus);
  258 + // infoModel.newsTag = [self convertNewsTagIsMaster:master];
  259 + // if (isSerial) {
  260 + // contentDTO.coverUrl = element.fullUrl;
  261 + // }
  262 +
  263 + this.arr.push(contentDTO)
  264 + }
  265 +
  266 + }
  267 +
  268 + // this.arr = listData.list
  269 + }
  270 +
  271 + //人民号主页
  272 + private convertToRmhInfoWithAccountModel() {
  273 + if (this.detailModel) {
  274 + let rmhInfo = {} as RmhInfoDTO
  275 + rmhInfo.rmhHeadUrl = this.detailModel.headPhotoUrl;
  276 + rmhInfo.rmhName = this.detailModel.userName;
  277 + rmhInfo.rmhId = this.detailModel.creatorId;
  278 + rmhInfo.userId = this.detailModel.userId;
  279 + rmhInfo.userType = this.detailModel.userType
  280 + rmhInfo.rmhDesc = this.detailModel.introduction;
  281 + rmhInfo.cnIsAttention = 0;
  282 + rmhInfo.cnIsComment = this.detailModel.isComment;
  283 + rmhInfo.cnIsLike = this.detailModel.cnIsLike;
  284 + rmhInfo.cnMainControl = this.detailModel.mainControl;
  285 + rmhInfo.cnShareControl = this.detailModel.shareControl;
  286 + rmhInfo.authIcon = this.detailModel.authIcon;
  287 + rmhInfo.authTitle = this.detailModel.authTitle;
  288 + // rmhInfo.honoraryIcon = this.detailModel.honoraryIcon;
  289 + // rmhInfo.honoraryTitle = this.detailModel.honoraryTitle;
  290 + rmhInfo.banControl = this.detailModel.banControl;
  291 + return rmhInfo
  292 + }
  293 + return null
  294 + }
  295 +
  296 + //视频信息转换
  297 + private convertToVideoInfo(model: ArticleListDTO) {
  298 +
  299 + if (model.appStyleVideos && model.appStyleVideos.length > 0) {
  300 + let firstModel = model.appStyleVideos[0]
  301 + let videoInfo: VideoInfoDTO = {} as VideoInfoDTO
  302 +
  303 + videoInfo.videoDuration = firstModel.duration
  304 + videoInfo.videoUrl = firstModel.url
  305 + videoInfo.videoLandscape = firstModel.landscape
  306 + videoInfo.firstFrameImageUri = firstModel.fullUrl
  307 + return videoInfo
  308 + }
  309 + else if (model.contentVideos && model.contentVideos.length > 0) {
  310 + let firstModel = model.contentVideos[0]
  311 + let videoInfo: VideoInfoDTO = {} as VideoInfoDTO
  312 + videoInfo.videoDuration = firstModel.duration
  313 + videoInfo.videoUrl = firstModel.url
  314 + videoInfo.videoLandscape = firstModel.landscape
  315 + videoInfo.firstFrameImageUri = firstModel.fullUrl
  316 + return videoInfo
  317 + }
  318 + return null
  319 + }
  320 +
  321 + // 直播信息转换
  322 + private convertToProgramLiveInfoModel(model: LiveDTO): LiveInfoDTO | null {
  323 + if (model) {
  324 + let liveInfo = {} as LiveInfoDTO
  325 + liveInfo.vrType = model.vr
  326 + liveInfo.liveState = model.status
  327 + liveInfo.liveLandscape = model.landscape
  328 + if (model.recordUrl && model.recordUrl.length > 0) {
  329 + liveInfo.replayUri = model.recordUrl
  330 + } else if (model.uri && model.uri.length > 0) {
  331 + liveInfo.replayUri = model.uri
  332 + }
  333 + return liveInfo
  334 + }
  335 + return null
  336 + }
  337 +
  338 + // 图片转换
  339 + private fullColumnImgUrls(model: ArticleListDTO) {
  340 + let imagesList: FullColumnImgUrlDTO[] = [] as FullColumnImgUrlDTO[]
  341 + if (model.appStyleImages && model.appStyleImages.length > 0) {
  342 + for (const element of model.appStyleImages) {
  343 + let imgUrl: FullColumnImgUrlDTO = {} as FullColumnImgUrlDTO
  344 + imgUrl.format = element.format
  345 + imgUrl.height = element.height
  346 + imgUrl.weight = element.weight
  347 + imgUrl.size = element.size
  348 + imgUrl.landscape = element.landscape
  349 + imgUrl.url = element.fullUrl
  350 + imgUrl.fullUrl = element.fullUrl
  351 + imagesList.push(imgUrl)
  352 + }
  353 + }
  354 + else if (model.contentPictures && model.contentPictures.length > 0) {
  355 + for (const element of model.contentPictures) {
  356 + let imgUrl: FullColumnImgUrlDTO = {} as FullColumnImgUrlDTO
  357 + imgUrl.format = element.format
  358 + imgUrl.height = element.height
  359 + imgUrl.weight = element.weight
  360 + imgUrl.size = element.size
  361 + imgUrl.landscape = element.landscape
  362 + imgUrl.url = element.fullUrl
  363 + imgUrl.fullUrl = element.fullUrl
  364 + imagesList.push(imgUrl)
  365 + }
  366 + }
  367 + return imagesList
  368 + }
  369 +
  370 + //时间转时间戳
  371 + private convertPublishTimeWith(time: string): string {
  372 + if (time.length) {
  373 + return `${new Date(time).getTime()}`
  374 + }
  375 + return `${new Date().getTime()}`
  376 + }
  377 +
  378 + private changeCommon(appStyle: number): string {
  379 + if (appStyle == 12) {
  380 + return '11'
  381 + }
  382 + if (appStyle == 14) {
  383 + return '13'
  384 + }
  385 + if (appStyle == 15) {
  386 + return '2'
  387 + }
  388 + if (appStyle == 16) {
  389 + return '4'
  390 + }
  391 + if (appStyle == 18) {
  392 + return '17'
  393 + }
  394 + if (appStyle == 21) {
  395 + return '6'
  396 + }
  397 + return `${appStyle}`
  398 + }
  399 +}
  1 +@Component
  2 +export struct PeopleShipHomeAttentionComponent {
  3 + @Consume isAttention: string
  4 + @Consume isLoadingAttention: boolean
  5 + build() {
  6 + Flex({ alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
  7 + Button({type: ButtonType.Normal, stateEffect: false } ) {
  8 + Stack() {
  9 + Image(this.isAttention == '0'? $r('app.media.home_attention_no_left') : $r('app.media.home_attention_left'))
  10 + .width('100%')
  11 + .height('100%')
  12 + .objectFit(ImageFit.Cover)
  13 + Row() {
  14 + if(this.isAttention == '0') {
  15 + if(this.isLoadingAttention) {
  16 + LoadingProgress()
  17 + .width(20)
  18 + .height(20)
  19 + .color($r('app.color.color_fff'))
  20 + }else {
  21 + Text('+ 关注')
  22 + .fontColor(Color.White)
  23 + .fontSize($r('app.float.vp_14'))
  24 + .fontWeight(500)
  25 + .margin({
  26 + right: '10vp'
  27 + })
  28 + }
  29 + }else {
  30 + if(this.isLoadingAttention) {
  31 + LoadingProgress()
  32 + .width(20)
  33 + .height(20)
  34 + .color( $r('app.color.color_CCCCCC'))
  35 + }else {
  36 + Text('已关注')
  37 + .fontSize($r('app.float.vp_14'))
  38 + .fontWeight(500)
  39 + .fontColor($r('app.color.color_CCCCCC'))
  40 + .margin({
  41 + right: '10vp'
  42 + })
  43 + }
  44 + }
  45 +
  46 + }
  47 + .justifyContent(FlexAlign.Center)
  48 + .alignItems(VerticalAlign.Center)
  49 + .width('100%')
  50 + .height('100%')
  51 + }
  52 + .width('100%')
  53 + .height('100%')
  54 + }
  55 + .backgroundColor(Color.Transparent)
  56 + .width(176)
  57 + .height(36)
  58 + .padding(0)
  59 + .fontColor(Color.Black)
  60 + .margin({
  61 + right: '-5vp'
  62 + })
  63 + .onClick(() => {
  64 + if(this.isLoadingAttention) {
  65 + return
  66 + }
  67 + this.isLoadingAttention = true
  68 + })
  69 +
  70 + Button({type: ButtonType.Normal, stateEffect: false}) {
  71 + Stack() {
  72 + Image($r('app.media.home_share_right_icon'))
  73 + .width('100%')
  74 + .height('100%')
  75 + .objectFit(ImageFit.Cover)
  76 + Row() {
  77 + Image($r('app.media.QR_code_icon'))
  78 + .width(16)
  79 + .height(16)
  80 + .objectFit(ImageFit.Cover)
  81 + .margin({
  82 + left: '10vp'
  83 + })
  84 + Text('分享名片')
  85 + .fontSize($r('app.float.vp_14'))
  86 + .fontColor($r('app.color.color_222222'))
  87 + .fontWeight(500)
  88 + .margin({ left: 5 })
  89 + }
  90 + .justifyContent(FlexAlign.Center)
  91 + .alignItems(VerticalAlign.Center)
  92 + .width('100%')
  93 + .height('100%')
  94 + }
  95 + .width('100%')
  96 + .height('100%')
  97 + }
  98 + .backgroundColor(Color.Transparent)
  99 + .width(176)
  100 + .height(36)
  101 + .padding(0)
  102 + .fontColor(Color.White)
  103 + .margin({
  104 + left: '-5vp'
  105 + })
  106 + .onClick(() => {
  107 +
  108 + })
  109 +
  110 + }
  111 +
  112 + }
  113 +}
  1 +import { DisplayUtils, Logger } from 'wdKit'
  2 +import { PeopleShipHomePageDataModel } from '../../viewmodel/PeopleShipHomePageDataModel'
  3 +import { PeopleShipHomeArticleListComponent } from './PeopleShipHomeArticleListComponent'
  4 +import { ArticleCountData, ArticleTypeData } from 'wdBean'
  5 +import CustomRefreshLoadLayout from '../page/CustomRefreshLoadLayout'
  6 +import { EmptyComponent } from '../view/EmptyComponent';
  7 +import { RefreshLayoutBean } from '../page/RefreshLayoutBean'
  8 +
  9 +@Component
  10 +export struct PeopleShipHomeListComponent {
  11 +
  12 + private controller: TabsController = new TabsController()
  13 +
  14 + @State tabArr: ArticleTypeData[] = []
  15 + @State creatorId: string = ''
  16 + // 发布数量
  17 + @Link publishCount: number
  18 + @State currentIndex: number = 0
  19 + @State private isLoading: boolean = false
  20 + @Consume topHeight: number
  21 +
  22 +
  23 + build() {
  24 + if (this.isLoading) {
  25 + this.LoadingLayout()
  26 + }
  27 + // 列表
  28 + else if(this.publishCount == 0) {
  29 + // 无数据展示
  30 + EmptyComponent().height(DisplayUtils.getDeviceHeight() - this.topHeight)
  31 + } else {
  32 + Tabs({ barPosition: BarPosition.Start, controller: this.controller}) {
  33 + ForEach(this.tabArr, (item: ArticleTypeData, index: number) => {
  34 + TabContent() {
  35 + PeopleShipHomeArticleListComponent({
  36 + typeModel: item,
  37 + creatorId: this.creatorId,
  38 + currentTopSelectedIndex: this.currentIndex,
  39 + currentIndex: index
  40 + })
  41 + }.tabBar(this.tabBuilder(index, item.name ?? ''))
  42 +
  43 + })
  44 +
  45 + }
  46 + .backgroundColor(Color.White)
  47 + .barWidth('100%')
  48 + .barHeight('44vp')
  49 + .vertical(false)
  50 + .height(DisplayUtils.getDeviceHeight() - 100)
  51 + .animationDuration(0)
  52 + .divider({
  53 + strokeWidth: '0.5vp',
  54 + color: $r('app.color.color_F5F5F5'),
  55 + startMargin: 0,
  56 + endMargin: 0
  57 + })
  58 + .onChange((index: number) => {
  59 + this.currentIndex = index
  60 + })
  61 + }
  62 +
  63 + }
  64 +
  65 + @Builder
  66 + LoadingLayout() {
  67 + CustomRefreshLoadLayout({
  68 + refreshBean: new RefreshLayoutBean(true,
  69 + $r('app.media.ic_pull_up_load'), $r('app.string.pull_up_load_text'), DisplayUtils.getDeviceHeight() - this.topHeight)
  70 + }).height(DisplayUtils.getDeviceHeight() - this.topHeight)
  71 + }
  72 +
  73 + @Builder tabBuilder(index: number, name: string) {
  74 + Column() {
  75 + Text(name)
  76 + .fontColor(this.currentIndex === index ? $r('app.color.color_222222') : $r('app.color.color_666666') )
  77 + .fontSize(18)
  78 + .fontWeight(this.currentIndex === index ? 500 : 400)
  79 + .lineHeight(22)
  80 + .height(22)
  81 + .margin({ top: 11, bottom: 1 })
  82 + Divider()
  83 + .width('15vp')
  84 + .strokeWidth(2)
  85 + .color('#CB0000')
  86 + .opacity(this.currentIndex === index ? 1 : 0)
  87 + }.width('100%')
  88 + }
  89 +
  90 + async aboutToAppear() {
  91 + try {
  92 + this.isLoading = true
  93 + // 1:点播(视频),2:直播,3:活动,4:广告,5:专题,6:链接,7:榜单,8:图文,9:组图,10:H5新闻,11:频道,12:组件 13:音频 14:动态图文 15:动态视频
  94 + let articleModel = await PeopleShipHomePageDataModel.getPeopleShipHomePageArticleCountData(1, this.creatorId)
  95 + Logger.debug('PeopleShipHomeListComponent', '获取页面信息', `${JSON.stringify(articleModel)}`)
  96 + this.updateTopBarData(articleModel)
  97 + this.isLoading = false
  98 + } catch (exception) {
  99 + this.isLoading = false
  100 + }
  101 + }
  102 +
  103 + // 设置顶部数据
  104 + updateTopBarData(articleModel: ArticleCountData) {
  105 + if (articleModel) {
  106 + this.publishCount = articleModel.publishCount
  107 + this.tabArr = []
  108 + if (articleModel.publishCount != 0) {
  109 + let model: ArticleTypeData = new ArticleTypeData('全部')
  110 + this.tabArr.push(model)
  111 + }
  112 + if (articleModel.twCount != 0) {
  113 + let model: ArticleTypeData = new ArticleTypeData('文章', 8)
  114 + this.tabArr.push(model)
  115 + }
  116 + if (articleModel.spCount != 0) {
  117 + let model: ArticleTypeData = new ArticleTypeData('视频', 1)
  118 + this.tabArr.push(model)
  119 + }
  120 + if (articleModel.zbCount != 0) {
  121 + let model: ArticleTypeData = new ArticleTypeData('直播', 2)
  122 + this.tabArr.push(model)
  123 + }
  124 + if (articleModel.dtCount != 0) {
  125 + let model: ArticleTypeData = new ArticleTypeData('动态', 4)
  126 + this.tabArr.push(model)
  127 + }
  128 + if (articleModel.ztCount != 0) {
  129 + let model: ArticleTypeData = new ArticleTypeData('图集', 9)
  130 + this.tabArr.push(model)
  131 + }
  132 + }
  133 + }
  134 +}
  1 +import router from '@ohos.router'
  2 +import { PeopleShipUserDetailData } from 'wdBean'
  3 +import { PeopleShipHomePageHeadComponent } from './PeopleShipHomePageHeadComponent'
  4 +
  5 +@Component
  6 +export struct PeopleShipHomePageNavComponent {
  7 + @Prop topOpacity: number
  8 + @Consume isAttention: string
  9 + @Consume isLoadingAttention: boolean
  10 + @Prop attentionOpacity: boolean
  11 +
  12 + // 页面详情数据
  13 + @Prop detailModel: PeopleShipUserDetailData = {} as PeopleShipUserDetailData
  14 +
  15 + build() {
  16 + Row() {
  17 + Stack({ alignContent: Alignment.TopStart }) {
  18 + Row()
  19 + .width('100%')
  20 + .height('100%')
  21 + .backgroundColor($r('app.color.white'))
  22 + .opacity(this.topOpacity)
  23 + Row() {
  24 +
  25 + Row() {
  26 + // 返回
  27 + Image((this.topOpacity > 0.5 ? $r('app.media.icon_arrow_left') : $r('app.media.icon_arrow_left_white')))
  28 + .width('24vp')
  29 + .height('24vp')
  30 + .objectFit(ImageFit.Auto)
  31 + .margin({ left: '10vp' })
  32 + .onClick(() => {
  33 + router.back()
  34 + })
  35 + // 头像
  36 + PeopleShipHomePageHeadComponent({
  37 + diameter: 30,
  38 + iconDiameter: 10,
  39 + headPhotoUrl: this.detailModel.headPhotoUrl,
  40 + authIcon: this.detailModel.authIcon
  41 + })
  42 + .margin({
  43 + left: '10vp',
  44 + })
  45 + .visibility((this.topOpacity > 0.5 ? Visibility.Visible : Visibility.Hidden))
  46 +
  47 + // 文字
  48 + Text(this.detailModel.userName)
  49 + .height('46vp')
  50 + .fontSize($r('app.float.vp_14'))
  51 + .fontColor($r('app.color.color_222222'))
  52 + .margin({
  53 + left: '6vp'
  54 + })
  55 + .visibility((this.topOpacity > 0.5 ? Visibility.Visible : Visibility.Hidden))
  56 +
  57 + if (this.isAttention == '0') {
  58 + // 关注
  59 + Button('+关注', { type: ButtonType.Normal, stateEffect: true })
  60 + .borderRadius(4)
  61 + .backgroundColor($r('app.color.color_ED2800'))
  62 + .width('54vp')
  63 + .height('24vp')
  64 + .onClick(() => {
  65 + if (this.isLoadingAttention){
  66 + return
  67 + }
  68 + this.isLoadingAttention = true
  69 + })
  70 + .margin({
  71 + left: '12vp',
  72 + })
  73 + .padding(0)
  74 + .fontSize($r('app.float.vp_12'))
  75 + .fontColor(Color.White)
  76 + .visibility((this.attentionOpacity ? Visibility.Visible : Visibility.Hidden))
  77 + } else {
  78 + Button('已关注', { type: ButtonType.Normal, stateEffect: true })
  79 + .borderRadius(4)
  80 + .backgroundColor($r('app.color.color_F5F5F5'))
  81 + .width('54vp')
  82 + .height('24vp')
  83 + .onClick(() => {
  84 + if (this.isLoadingAttention){
  85 + return
  86 + }
  87 + this.isLoadingAttention = true
  88 + })
  89 + .margin({
  90 + left: '12vp',
  91 + })
  92 + .padding(0)
  93 + .fontSize($r('app.float.vp_12'))
  94 + .fontColor($r('app.color.color_999999'))
  95 + .visibility((this.attentionOpacity ? Visibility.Visible : Visibility.Hidden))
  96 + }
  97 + }
  98 + .height('100%')
  99 + Blank()
  100 + // 分享
  101 + Image((this.topOpacity > 0.5 ? $r('app.media.icon_forward') : $r('app.media.icon_share')))
  102 + .width('24vp')
  103 + .height('24vp')
  104 + .objectFit(ImageFit.Auto)
  105 + .margin({ right: '10vp' })
  106 + .onClick(() => {
  107 +
  108 + })
  109 + }
  110 + .width('100%')
  111 + .height('100%')
  112 + .alignItems(VerticalAlign.Center)
  113 + .justifyContent(FlexAlign.SpaceBetween)
  114 + }
  115 + .zIndex(1000)
  116 + .width('100%')
  117 + .height('100%')
  118 + }
  119 + }
  120 +}
  1 +@Component
  2 +export struct PeopleShipHomePageAttestationComponent {
  3 + @Prop name: string
  4 + @Prop content: string
  5 + build() {
  6 + Row() {
  7 + Text(this.name)
  8 + .lineHeight('16vp')
  9 + .fontColor($r('app.color.color_ED2800'))
  10 + .fontSize($r('app.float.vp_11'))
  11 + .backgroundColor($r('app.color.color_1AED2800'))
  12 + .textAlign(TextAlign.Center)
  13 + .borderRadius('2vp')
  14 + .margin({
  15 + right: '4vp',
  16 + left: '16vp',
  17 + })
  18 + .padding({
  19 + top: '3vp',
  20 + bottom: '3vp',
  21 + right: '6vp',
  22 + left: '6vp'
  23 + })
  24 +
  25 + Text(this.content)
  26 + .lineHeight('22vp')
  27 + .fontSize($r('app.float.vp_12'))
  28 + .layoutWeight(1)
  29 + .fontColor($r('app.color.color_222222'))
  30 + .textAlign(TextAlign.Start)
  31 + .margin({
  32 + right: '16vp'
  33 + })
  34 + }
  35 + .width('100%')
  36 + .alignItems(VerticalAlign.Top)
  37 + }
  38 +}
  1 +@Component
  2 +export struct PeopleShipHomePageHeadComponent {
  3 + @State diameter: number = 30
  4 + @State iconDiameter: number = 10
  5 + @Prop headPhotoUrl: string = ''
  6 + @Prop authIcon: string = ''
  7 +
  8 + build() {
  9 + Stack({ alignContent: Alignment.BottomEnd }) {
  10 + // 头像
  11 + Image( this.headPhotoUrl.length > 0 ? this.headPhotoUrl : $r('app.media.home_page_header_authority') )
  12 + .width(this.diameter)
  13 + .height(this.diameter)
  14 + .borderRadius(this.diameter/2)
  15 + .borderWidth('1vp')
  16 + .borderStyle(BorderStyle.Solid)
  17 + .borderColor(Color.White)
  18 + .objectFit(ImageFit.Auto)
  19 + if(this.authIcon.length > 0 ) {
  20 + Image( this.authIcon )
  21 + .width(this.iconDiameter)
  22 + .height(this.iconDiameter)
  23 + .borderRadius(this.iconDiameter/2)
  24 + .objectFit(ImageFit.Auto)
  25 + .margin({
  26 + right: '-3vp'
  27 + })
  28 + }
  29 + }
  30 + }
  31 +}
  1 +import measure from '@ohos.measure'
  2 +import { DisplayUtils } from 'wdKit'
  3 +import { PeopleShipHomePageHeadComponent } from './PeopleShipHomePageHeadComponent'
  4 +import { PeopleShipHomePageAttestationComponent } from './PeopleShipHomePageAttestationComponent'
  5 +import { Logger } from 'wdKit'
  6 +import { PeopleShipHomePageDataModel } from '../../viewmodel/PeopleShipHomePageDataModel'
  7 +import { InfluenceData, PeopleShipUserDetailData } from 'wdBean'
  8 +import { PeopleShipHomeAttentionComponent } from './PeopleShipHomeAttentionComponent'
  9 +
  10 +
  11 +@Component
  12 +export struct PeopleShipHomePageTopComponent {
  13 + @State creatorId: string = ''
  14 + // 是否关注
  15 + // @Prop isAttention: string
  16 + @State introductionType: number = 0
  17 + @State heightComponent: number = 0
  18 + // 页面详情数据
  19 + @Prop @Watch('onIntroductionUpdated') detailModel: PeopleShipUserDetailData
  20 + @Prop publishCount: number
  21 + // 影响力
  22 + @State influenceTotal: number = 0
  23 + // 简介是否可以展开
  24 + @State isCollapse: boolean = true
  25 + @State maxLines: number = Infinity
  26 + @State collapseTxt: string = '…展开';
  27 + private subTxt: string = '';
  28 + @State content: string = ''
  29 + @State topFixedHeight: number = 320
  30 + @State lineInNum: number = 1
  31 + @Link topHeight: number
  32 + build() {
  33 + Column() {
  34 + Stack({ alignContent: Alignment.TopStart}) {
  35 + // 顶部图片
  36 + Image($r('app.media.home_page_bg'))
  37 + .width('100%')
  38 + .height('120vp')
  39 + .objectFit(ImageFit.Fill)
  40 + .backgroundColor(Color.Black)
  41 + // 头像和名称
  42 + Row() {
  43 + // 头像
  44 + PeopleShipHomePageHeadComponent({
  45 + diameter: 80,
  46 + iconDiameter: 20,
  47 + headPhotoUrl: this.detailModel.headPhotoUrl,
  48 + authIcon: this.detailModel.authIcon
  49 + }).margin({
  50 + left: '10vp',
  51 + bottom: '20vp'
  52 + })
  53 +
  54 +
  55 + // 文字
  56 + Text(this.detailModel.userName)
  57 + .height('50vp')
  58 + .fontSize($r('app.float.vp_22'))
  59 + .fontColor($r('app.color.color_222222'))
  60 + .fontWeight(500)
  61 + .textAlign(TextAlign.Start)
  62 + .textOverflow({overflow: TextOverflow.Ellipsis})
  63 + .maxLines(2)
  64 + .layoutWeight(1)
  65 + .margin({
  66 + left: '12vp',
  67 + bottom: '10vp',
  68 + right: '12vp'
  69 + })
  70 + }
  71 + .width('100%')
  72 + .height('100%')
  73 + .alignItems(VerticalAlign.Bottom)
  74 +
  75 + }
  76 + .width('100%')
  77 + .height('180vp')
  78 + .backgroundColor(Color.Transparent)
  79 + // 认证id:1蓝2黄,蓝v 只有官方认证,黄v有领域和身份认证
  80 + // 官方认证
  81 + if(this.detailModel.authId == 1 && this.detailModel.categoryAuth.length > 0) {
  82 + PeopleShipHomePageAttestationComponent({name: '官方认证', content: this.detailModel.categoryAuth})
  83 + .margin({
  84 + top: '10vp',
  85 + bottom: '10vp'
  86 + })
  87 + }
  88 + if(this.detailModel.authId == 2) {
  89 + if (this.detailModel.authTitle && this.detailModel.authTitle.length > 0 ){
  90 + PeopleShipHomePageAttestationComponent({name: '领域认证', content: this.detailModel.authTitle})
  91 + .margin({
  92 + top: '10vp',
  93 + bottom: '10vp'
  94 + })
  95 + }
  96 + if (this.detailModel.authPersonal && this.detailModel.authPersonal.length > 0 ){
  97 + PeopleShipHomePageAttestationComponent({name: '身份认证', content: this.detailModel.authPersonal})
  98 + .margin({
  99 + top: '10vp',
  100 + bottom: '10vp'
  101 + })
  102 + }
  103 + }
  104 +
  105 + // 简介
  106 + if(this.lineInNum > 3) {
  107 + Row() {
  108 + Text() {
  109 + Span(this.content)
  110 + .fontColor($r('app.color.color_222222'))
  111 +
  112 + Span(this.collapseTxt)
  113 + .onClick(()=>{
  114 + if(this.isCollapse){
  115 + this.maxLines = Infinity;
  116 + this.content = `简介:${this.detailModel.introduction}`
  117 + this.isCollapse = false;
  118 + this.collapseTxt = '收起';
  119 + this.topHeight = this.topFixedHeight + 21 * this.lineInNum
  120 +
  121 + }else{
  122 + this.isCollapse = true;
  123 + this.collapseTxt = '…展开';
  124 + this.content = this.subTxt;
  125 + this.topHeight = this.topFixedHeight + 21 * 3
  126 + }
  127 + })
  128 + .fontColor($r('app.color.color_B0B0B0'))
  129 +
  130 + }
  131 + .lineHeight('21vp')
  132 + .maxLines(this.maxLines)
  133 + .textOverflow({overflow: TextOverflow.Ellipsis})
  134 + .fontSize($r('app.float.vp_14'))
  135 + .key('home_page_introduction')
  136 + .margin({
  137 + left: '16vp',
  138 + right: '16vp',
  139 + bottom: '10vp'
  140 + })
  141 + }.width('100%')
  142 + .alignItems(VerticalAlign.Top)
  143 + }else {
  144 + Row() {
  145 + Text(`简介:${this.detailModel.introduction}`)
  146 + .fontSize($r('app.float.vp_14'))
  147 + .fontColor($r('app.color.color_222222'))
  148 + .lineHeight('21vp')
  149 + .maxLines(3)
  150 + .textOverflow({overflow: TextOverflow.Ellipsis})
  151 + .margin({
  152 + left: '16vp',
  153 + right: '16vp',
  154 + bottom: '10vp'
  155 + })
  156 + }.width('100%')
  157 + .alignItems(VerticalAlign.Top)
  158 + }
  159 +
  160 + // IP归属地
  161 + Text(`IP归属地:${this.detailModel.region}`)
  162 + .lineHeight('18vp')
  163 + .fontSize($r('app.float.vp_12'))
  164 + .fontColor($r('app.color.color_999999'))
  165 + .textAlign(TextAlign.Start)
  166 + .width('100%')
  167 + .alignSelf(ItemAlign.Start)
  168 + .margin({
  169 + right: '16vp',
  170 + left: '16vp',
  171 + })
  172 +
  173 + // 发布, 粉丝, 影响力
  174 + Row() {
  175 + // 发布
  176 + Text(this.computeShowNum(this.publishCount))
  177 + .fontSize($r('app.float.vp_20'))
  178 + .fontColor($r('app.color.color_222222'))
  179 + .lineHeight('22vp')
  180 + .textAlign(TextAlign.Center)
  181 + .fontWeight(600)
  182 + .margin({
  183 + right: '4vp',
  184 + left: '16vp'
  185 + })
  186 + Text('发布')
  187 + .fontSize($r('app.float.vp_12'))
  188 + .fontColor($r('app.color.color_666666'))
  189 + .align(Alignment.Center)
  190 + .height('22vp')
  191 +
  192 + // 粉丝
  193 + Text(this.computeShowNum(this.detailModel.fansNum))
  194 + .fontSize($r('app.float.vp_20'))
  195 + .fontColor($r('app.color.color_222222'))
  196 + .lineHeight('22vp')
  197 + .fontWeight(600)
  198 + .textAlign(TextAlign.Center)
  199 + .margin({
  200 + right: '4vp',
  201 + left: '12vp'
  202 + })
  203 + Text('粉丝')
  204 + .fontSize($r('app.float.vp_12'))
  205 + .fontColor($r('app.color.color_666666'))
  206 + .height('22vp')
  207 + .align(Alignment.Center)
  208 +
  209 + //影响力
  210 + Text(this.computeShowNum(this.influenceTotal))
  211 + .lineHeight('22vp')
  212 + .fontSize($r('app.float.vp_20'))
  213 + .fontColor($r('app.color.color_222222'))
  214 + .fontWeight(600)
  215 + .height('22vp')
  216 + .margin({
  217 + right: '4vp',
  218 + left: '12vp'
  219 + })
  220 + Text('影响力')
  221 + .fontSize($r('app.float.vp_12'))
  222 + .fontColor($r('app.color.color_666666'))
  223 + .height('22vp')
  224 + .align(Alignment.Center)
  225 +
  226 + }
  227 + .alignItems(VerticalAlign.Center)
  228 + .backgroundColor(Color.Transparent)
  229 + .width('100%')
  230 + .margin({
  231 + top: '16vp'
  232 + })
  233 +
  234 + // 分享-关注
  235 + PeopleShipHomeAttentionComponent()
  236 + .width('100%')
  237 + .margin({
  238 + top: '10vp',
  239 + bottom: '16vp'
  240 + })
  241 + Row()
  242 + .backgroundColor($r('app.color.color_F5F5F5'))
  243 + .width('100%')
  244 + .height('6vp')
  245 + }
  246 + .width('100%')
  247 + .height('100%')
  248 + }
  249 +
  250 + async aboutToAppear() {
  251 + try {
  252 + // 获取影响力
  253 + let infData: InfluenceData = await PeopleShipHomePageDataModel.getCreatorInfluenceInfoData(this.creatorId)
  254 + Logger.debug('PeopleShipHomePageTopComponent', '获取获取影响力信息', `${JSON.stringify(infData)}`)
  255 + this.influenceTotal = infData.influenceTotal
  256 + } catch (exception) {
  257 +
  258 + }
  259 + if (this.content.length == 0) {
  260 + this.onIntroductionUpdated()
  261 + }
  262 +
  263 + }
  264 +
  265 +
  266 +
  267 + // 不听减去2个字-一直到时3行
  268 + private compIntroductionTextHeights() {
  269 + let introduction = `简介:${this.detailModel.introduction}`
  270 + let lineInNum1 = this.getTextLineNum(introduction, DisplayUtils.getDeviceWidth() - 32, 21, $r('app.float.vp_14'))
  271 + while (lineInNum1 > 3 ) {
  272 + introduction = introduction.substring(0, introduction.length - 2);
  273 + lineInNum1 = this.getTextLineNum(introduction, DisplayUtils.getDeviceWidth() - 32, 21, $r('app.float.vp_14'))
  274 + }
  275 + introduction = introduction.substring(0, introduction.length - 3);
  276 + Logger.debug('PeopleShipHomePageTopComponent', '3行简介:', `${introduction}`)
  277 +
  278 + this.subTxt = introduction;
  279 + }
  280 +
  281 + // 获取文本几行
  282 + private getTextLineNum(text: string, constraintWidth: number, lineHeight: number, fontSize: number | string | Resource) {
  283 + let size = this.topMeasureText(text, constraintWidth, lineHeight, fontSize)
  284 + let height: number = Number(size.height)
  285 + return Math.ceil(px2vp(height)/lineHeight)
  286 + }
  287 +
  288 + private topMeasureText(text: string, constraintWidth: number, lineHeight: number, fontSize: number | string | Resource) {
  289 + return measure.measureTextSize({
  290 + textContent: text,
  291 + fontSize: fontSize,
  292 + lineHeight: lineHeight,
  293 + constraintWidth: constraintWidth,
  294 + })
  295 + }
  296 +
  297 + onIntroductionUpdated() {
  298 + if (this.content.length == 0 && this.detailModel.introduction ) {
  299 + this.lineInNum = this.getTextLineNum(`简介:${this.detailModel.introduction}`, DisplayUtils.getDeviceWidth() - 32, 21, $r('app.float.vp_14'))
  300 + if (this.lineInNum > 3) {
  301 + this.compIntroductionTextHeights()
  302 + this.content = this.subTxt
  303 + }
  304 + }
  305 + if (this.detailModel) {
  306 + this.topFixedHeight = 336
  307 + if(this.detailModel.authId == 1 && this.detailModel.categoryAuth.length > 0) {
  308 + this.topFixedHeight += this.getTextLineNum(this.detailModel.categoryAuth, DisplayUtils.getDeviceWidth() - 90, 22, $r('app.float.vp_12'))*22
  309 + }
  310 + else if(this.detailModel.authId == 2) {
  311 + if (this.detailModel.authTitle && this.detailModel.authTitle.length > 0 ){
  312 + this.topFixedHeight += this.getTextLineNum(this.detailModel.authTitle, DisplayUtils.getDeviceWidth() - 90, 22, $r('app.float.vp_12'))*22
  313 + }
  314 + if (this.detailModel.authPersonal && this.detailModel.authPersonal.length > 0 ){
  315 + if (this.detailModel.authTitle && this.detailModel.authTitle.length > 0 ){
  316 + this.topFixedHeight += 10
  317 + }
  318 + this.topFixedHeight += this.getTextLineNum(this.detailModel.authPersonal, DisplayUtils.getDeviceWidth() - 90, 22, $r('app.float.vp_12'))*22
  319 + }
  320 + }
  321 + this.lineInNum = this.getTextLineNum(`简介:${this.detailModel.introduction}`, DisplayUtils.getDeviceWidth() - 32, 21, $r('app.float.vp_14'))
  322 + if (this.lineInNum <= 3) {
  323 + this.topFixedHeight += (21 * this.lineInNum)
  324 + this.topHeight = this.topFixedHeight
  325 + }else {
  326 + this.topHeight = this.topFixedHeight + (this.isCollapse ? 21*3 : 21 * this.lineInNum )
  327 + }
  328 + }
  329 + }
  330 +
  331 + private computeShowNum(count: number) {
  332 + if(count >= 10000) {
  333 + return `${(count/10000).toFixed(1)}万`
  334 + }
  335 + return `${count}`
  336 + }
  337 +
  338 +}
  1 +/**
  2 + * 搜索活动 展示组件
  3 + */
  4 +import { ContentDTO } from 'wdBean/Index';
  5 +
  6 +@Component
  7 +export struct ActivityItemComponent {
  8 + @State contentDTO: ContentDTO = {} as ContentDTO;
  9 +
  10 + build() {
  11 + Row() {
  12 + Stack(){
  13 + Image(this.contentDTO.coverUrl)
  14 + .width('207lpx')
  15 + .height('276lpx')
  16 + .objectFit(ImageFit.Auto)
  17 + .borderRadius('7lpx')
  18 +
  19 + Row(){
  20 + Image(this.contentDTO.programType+"" === "1" ? $r('app.media.activity_is_start_icon') :$r('app.media.activity_not_begin_icon'))
  21 + .width('42lpx')
  22 + .height('35lpx')
  23 + .objectFit(ImageFit.Auto)
  24 + .interpolation(ImageInterpolation.Medium)
  25 +
  26 + Text(this.contentDTO.programType+"" === "1" ? "进行中" :"未开始")
  27 + .fontColor($r('app.color.white'))
  28 + .fontSize('21lpx')
  29 + .fontWeight('400lpx')
  30 + .lineHeight('31lpx')
  31 + .textAlign(TextAlign.Center)
  32 + }.margin({right:'19lpx',bottom:'13lpx'})
  33 + }.alignContent(Alignment.BottomEnd)
  34 +
  35 +
  36 + Column() {
  37 +
  38 + Row(){
  39 + // Text(){
  40 + // // backgroundColor 不生效
  41 + // Span(this.contentDTO.objectType == "new_collect" ? "征稿" : this.contentDTO.objectType == "vote" ? "投票":"")
  42 + // .fontColor($r('app.color.main_red'))
  43 + // .fontSize('23lpx')
  44 + // .fontWeight('400lpx')
  45 + // .lineHeight('31lpx')
  46 + // .padding({left:'10lpx',right:'10lpx',top:'6lpx',bottom:'6lpx'})
  47 + // .backgroundColor( "#FF0"/*$r('app.color.color_ED2800')*/)
  48 + // .borderRadius('10lpx')
  49 + // .margin({ right: '10lpx' })
  50 + //
  51 + // Span(this.contentDTO.newsTitle)
  52 + // .fontColor($r('app.color.color_222222'))
  53 + // .fontSize('33lpx')
  54 + // .fontWeight('400lpx')
  55 + // .lineHeight('48lpx')
  56 + // }.textAlign(TextAlign.Start)
  57 + // .maxLines(2)
  58 + // .textOverflow({ overflow: TextOverflow.Ellipsis })
  59 +
  60 + //TODO 这里的样式(objectType) 只写了两个,其他的需要扩展
  61 + Text(this.contentDTO.objectType == "new_collect" ? "征稿" : this.contentDTO.objectType == "vote" ? "投票":"")
  62 + .fontColor($r('app.color.white'))
  63 + .fontSize('23lpx')
  64 + .fontWeight('400lpx')
  65 + .lineHeight('31lpx')
  66 + .textAlign(TextAlign.Center)
  67 + .padding({left:'10lpx',right:'10lpx',top:'6lpx',bottom:'6lpx'})
  68 + .backgroundColor( $r('app.color.color_ED2800'))
  69 + .borderRadius('10lpx')
  70 + .margin({ right: '10lpx' })
  71 +
  72 +
  73 + Text(this.contentDTO.newsTitle)
  74 + .fontColor($r('app.color.color_222222'))
  75 + .fontSize('33lpx')
  76 + .fontWeight('400lpx')
  77 + .lineHeight('48lpx')
  78 + .textAlign(TextAlign.Start)
  79 + .maxLines(2)
  80 + .layoutWeight(1)
  81 + }
  82 + .margin({ bottom: '15lpx' })
  83 + .alignItems(VerticalAlign.Top)
  84 + .width('100%')
  85 +
  86 + Row() {
  87 + Image($r('app.media.time_icon'))
  88 + .width('27lpx')
  89 + .height('27lpx')
  90 + .objectFit(ImageFit.Auto)
  91 + .margin({ right: '4lpx' })
  92 + .interpolation(ImageInterpolation.Medium)
  93 +
  94 + Text("时间:" + this.contentDTO.startTime.split(" ")[0] + "~" + this.contentDTO.endTime.split(" ")[0])
  95 + .fontColor($r('app.color.color_999999'))
  96 + .fontSize('23lpx')
  97 + .fontWeight('400lpx')
  98 + .lineHeight('31lpx')
  99 + }
  100 +
  101 + Blank()
  102 +
  103 + Text(this.contentDTO.programType+"" === "1" ? "立即参与" : "立即查看")
  104 + .fontColor($r('app.color.white'))
  105 + .fontSize('23lpx')
  106 + .fontWeight('500lpx')
  107 + .lineHeight('38lpx')
  108 + .width('154lpx')
  109 + .height('54lpx')
  110 + .textAlign(TextAlign.Center)
  111 + .backgroundColor(this.contentDTO.programType+"" == "1" ? $r('app.color.color_ED2800') : $r('app.color.color_F07E47'))
  112 + .borderRadius('6lpx')
  113 +
  114 + }.alignItems(HorizontalAlign.Start)
  115 + .width('428lpx')
  116 + .height('276lpx')
  117 +
  118 + }.height('330lpx')
  119 + .justifyContent(FlexAlign.SpaceBetween)
  120 + .width('100%')
  121 + .padding({left:'31lpx',right:'31lpx'})
  122 + }
  123 +}
@@ -253,7 +253,8 @@ export struct SearchComponent { @@ -253,7 +253,8 @@ export struct SearchComponent {
253 if(StringUtils.isNotEmpty(this.searchText)){ 253 if(StringUtils.isNotEmpty(this.searchText)){
254 SearcherAboutDataModel.putSearchHistoryData(this.searchText) 254 SearcherAboutDataModel.putSearchHistoryData(this.searchText)
255 this.getSearchHistoryData() 255 this.getSearchHistoryData()
256 - ToastUtils.shortToast("插入一条搜索记录") 256 +
  257 + this.getSearchHotResData(this.searchText)
257 } 258 }
258 }else{ 259 }else{
259 router.back() 260 router.back()
  1 +import { SearchRmhDescription } from '../../viewmodel/SearchResultContentItem'
  2 +
  3 +@Component
  4 +export struct SearchCreatorComponent{
  5 + @ObjectLink item: SearchRmhDescription
  6 +
  7 + build() {
  8 + Column(){
  9 + Image(this.item.headerPhotoUrl)
  10 + .width('92lpx')
  11 + .alt($r('app.media.default_head'))
  12 + .height('92lpx')
  13 + .margin({bottom:'15lpx'})
  14 + .borderRadius(50)
  15 + Text(this.item.creatorName)
  16 + .fontSize('25lpx')
  17 + .fontWeight('400lpx')
  18 + .lineHeight('35lpx')
  19 + .constraintSize({maxWidth:'150lpx'})
  20 + .maxLines(1)
  21 + .textOverflow({ overflow: TextOverflow.Ellipsis })
  22 + }.alignItems(HorizontalAlign.Center)
  23 + .justifyContent(FlexAlign.Center)
  24 + }
  25 +}
1 import { ContentDTO, 1 import { ContentDTO,
2 contentListParams, 2 contentListParams,
3 - FullColumnImgUrlDTO, InteractDataDTO, RmhInfoDTO, VideoInfoDTO } from 'wdBean/Index' 3 + FullColumnImgUrlDTO, InteractDataDTO,
  4 + Params,
  5 + RmhInfoDTO, VideoInfoDTO } from 'wdBean/Index'
4 import { LiveInfoDTO } from 'wdBean/src/main/ets/bean/detail/LiveInfoDTO' 6 import { LiveInfoDTO } from 'wdBean/src/main/ets/bean/detail/LiveInfoDTO'
5 import { VoiceInfoDTO } from 'wdBean/src/main/ets/bean/detail/VoiceInfoDTO' 7 import { VoiceInfoDTO } from 'wdBean/src/main/ets/bean/detail/VoiceInfoDTO'
6 -import { LazyDataSource, StringUtils } from 'wdKit/Index' 8 +import { LazyDataSource, Logger, StringUtils, ToastUtils } from 'wdKit/Index'
  9 +import { WDRouterPage, WDRouterRule } from 'wdRouter/Index'
7 import SearcherAboutDataModel from '../../model/SearcherAboutDataModel' 10 import SearcherAboutDataModel from '../../model/SearcherAboutDataModel'
  11 +import { CreatorDetailRequestItem } from '../../viewmodel/CreatorDetailRequestItem'
8 import { SearchResultContentData } from '../../viewmodel/SearchResultContentData' 12 import { SearchResultContentData } from '../../viewmodel/SearchResultContentData'
9 import { SearchRmhDescription } from '../../viewmodel/SearchResultContentItem' 13 import { SearchRmhDescription } from '../../viewmodel/SearchResultContentItem'
10 import { CardParser } from '../CardParser' 14 import { CardParser } from '../CardParser'
11 import { ListHasNoMoreDataUI } from '../reusable/ListHasNoMoreDataUI' 15 import { ListHasNoMoreDataUI } from '../reusable/ListHasNoMoreDataUI'
  16 +import { ActivityItemComponent } from './ActivityItemComponent'
  17 +import { SearchCreatorComponent } from './SearchCreatorComponent'
12 18
13 const TAG = "SearchResultContentComponent" 19 const TAG = "SearchResultContentComponent"
14 20
@@ -18,7 +24,7 @@ export struct SearchResultContentComponent{ @@ -18,7 +24,7 @@ export struct SearchResultContentComponent{
18 @State searchType:string = "" 24 @State searchType:string = ""
19 @State data: LazyDataSource<ContentDTO> = new LazyDataSource(); 25 @State data: LazyDataSource<ContentDTO> = new LazyDataSource();
20 @State data_rmh: SearchRmhDescription[] = [] 26 @State data_rmh: SearchRmhDescription[] = []
21 - @State count:number = 0; 27 + @State count:number = -1;
22 @State isLoading:boolean = false 28 @State isLoading:boolean = false
23 @State hasMore:boolean = true 29 @State hasMore:boolean = true
24 curPageNum:number = 1; 30 curPageNum:number = 1;
@@ -50,15 +56,40 @@ export struct SearchResultContentComponent{ @@ -50,15 +56,40 @@ export struct SearchResultContentComponent{
50 this.isLoading = false 56 this.isLoading = false
51 }else{ 57 }else{
52 if(value.list[0].dataList!=null){ 58 if(value.list[0].dataList!=null){
53 - this.data_rmh = value.list[0].dataList 59 + let data_temp: SearchRmhDescription[] = []
  60 + data_temp = value.list[0].dataList
  61 +
54 //TODO 查询创作者详情接口 62 //TODO 查询创作者详情接口
  63 + let request = new CreatorDetailRequestItem()
  64 +
  65 + data_temp.forEach((data)=>{
  66 + request.creatorIdList.push(data.creatorId)
  67 + })
55 68
  69 + SearcherAboutDataModel.getCreatorDetailListData(request).then((value)=>{
  70 + if(value!=null && value.length>0){
  71 + data_temp.forEach((data)=>{
  72 + value.forEach((item)=>{
  73 + if(data.creatorId == item.creatorId){
  74 + data.headerPhotoUrl = item.headPhotoUrl.split("?")[0]
  75 + }
  76 + })
  77 + })
  78 + }
  79 + data_temp.forEach((data)=>{
  80 + this.data_rmh.push(data)
  81 + })
  82 +
  83 + }).catch((err:Error)=>{
  84 + console.log(TAG,JSON.stringify(err))
  85 + })
56 } 86 }
57 this.getInteractData(value) 87 this.getInteractData(value)
58 } 88 }
59 }).catch((err:Error)=>{ 89 }).catch((err:Error)=>{
60 console.log(TAG,JSON.stringify(err)) 90 console.log(TAG,JSON.stringify(err))
61 this.isLoading = false 91 this.isLoading = false
  92 + this.count = this.count===-1?0:this.count
62 }) 93 })
63 } 94 }
64 } 95 }
@@ -105,7 +136,7 @@ export struct SearchResultContentComponent{ @@ -105,7 +136,7 @@ export struct SearchResultContentComponent{
105 cityCode: value.data.cityCode, 136 cityCode: value.data.cityCode,
106 coverSize: "", 137 coverSize: "",
107 coverType: -1, 138 coverType: -1,
108 - coverUrl: value.data.appStyleImages.split("&&")[0], 139 + coverUrl: this.searchType=="activity"?value.data.zhChannelPageImg:value.data.appStyleImages.split("&&")[0],
109 description: value.data.description, 140 description: value.data.description,
110 districtCode: value.data.districtCode, 141 districtCode: value.data.districtCode,
111 endTime: value.data.endTime, 142 endTime: value.data.endTime,
@@ -122,7 +153,7 @@ export struct SearchResultContentComponent{ @@ -122,7 +153,7 @@ export struct SearchResultContentComponent{
122 programId: "", 153 programId: "",
123 programName: "", 154 programName: "",
124 programSource: -1, 155 programSource: -1,
125 - programType: -1, 156 + programType: Number.parseInt(value.data.status),
126 provinceCode: value.data.provinceCode, 157 provinceCode: value.data.provinceCode,
127 showTitleEd: value.data.showTitleEd, 158 showTitleEd: value.data.showTitleEd,
128 showTitleIng: value.data.showTitleIng, 159 showTitleIng: value.data.showTitleIng,
@@ -134,7 +165,7 @@ export struct SearchResultContentComponent{ @@ -134,7 +165,7 @@ export struct SearchResultContentComponent{
134 vImageUrl: "", 165 vImageUrl: "",
135 screenType: "", 166 screenType: "",
136 source: StringUtils.isEmpty(value.data.creatorName) ? value.data.sourceName : value.data.creatorName, 167 source: StringUtils.isEmpty(value.data.creatorName) ? value.data.sourceName : value.data.creatorName,
137 - objectId: "", 168 + objectId: value.data.id,
138 objectType: value.data.type, 169 objectType: value.data.type,
139 channelId: value.data.channelId, 170 channelId: value.data.channelId,
140 relId: value.data.relId, 171 relId: value.data.relId,
@@ -175,6 +206,7 @@ export struct SearchResultContentComponent{ @@ -175,6 +206,7 @@ export struct SearchResultContentComponent{
175 }).catch((err:Error)=>{ 206 }).catch((err:Error)=>{
176 console.log(TAG,"请求失败") 207 console.log(TAG,"请求失败")
177 this.isLoading = false 208 this.isLoading = false
  209 + this.count = this.count===-1?0:this.count
178 }) 210 })
179 } 211 }
180 212
@@ -186,42 +218,63 @@ export struct SearchResultContentComponent{ @@ -186,42 +218,63 @@ export struct SearchResultContentComponent{
186 Column(){ 218 Column(){
187 if (this.data_rmh!=null && this.data_rmh.length > 0) { 219 if (this.data_rmh!=null && this.data_rmh.length > 0) {
188 //List 220 //List
189 - List() { 221 + List({space:'8lpx'}) {
190 ForEach(this.data_rmh, (item: SearchRmhDescription, index: number) => { 222 ForEach(this.data_rmh, (item: SearchRmhDescription, index: number) => {
191 ListItem() { 223 ListItem() {
192 - Column(){  
193 - Image($r('app.media.default_head'))  
194 - .width('84lpx')  
195 - .height('84lpx')  
196 - .margin({bottom:'15lpx'})  
197 - Text(item.creatorName)  
198 - .fontSize('20lpx')  
199 - }.alignItems(HorizontalAlign.Center)  
200 - 224 + SearchCreatorComponent({item:item})
201 }.onClick(()=>{ 225 }.onClick(()=>{
202 //TODO 跳转 226 //TODO 跳转
203 }) 227 })
204 .width('150lpx') 228 .width('150lpx')
  229 + .height('100%')
  230 + })
  231 +
  232 + ListItem(){
  233 + Column(){
  234 + Text("查看更多")
  235 + .width('19lpx')
  236 + .fontSize('19lpx')
  237 + .fontWeight('400lpx')
  238 + .lineHeight('27lpx')
  239 + .fontColor($r('app.color.color_9E9E9E'))
  240 + }.borderRadius({topLeft:'4lpx',bottomLeft:'4lpx'})
  241 + .height('180lpx')
  242 + .width('77lpx')
  243 + .backgroundColor($r('app.color.color_EDEDED'))
  244 + .justifyContent(FlexAlign.Center)
  245 +
  246 + }.height('100%')
  247 + .margin({left:'23lpx'})
  248 + .onClick(()=>{
  249 + let params: Params = {
  250 + pageID: this.keywords
  251 + }
  252 + WDRouterRule.jumpWithPage(WDRouterPage.searchCreatorPage,params)
205 }) 253 })
206 } 254 }
207 .cachedCount(6) 255 .cachedCount(6)
208 - .edgeEffect(EdgeEffect.None) 256 + .edgeEffect(EdgeEffect.Spring)
209 .scrollBar(BarState.Off) 257 .scrollBar(BarState.Off)
210 .listDirection(Axis.Horizontal) 258 .listDirection(Axis.Horizontal)
211 .width('100%') 259 .width('100%')
212 - .height('150lpx')  
213 - .onReachEnd(()=>{  
214 - if(!this.isLoading){  
215 - //进入更多关注页  
216 - }  
217 - }) 260 + .height('219lpx')
  261 +
  262 + Divider()
  263 + .width('100%')
  264 + .height('12lpx')
  265 + .color($r('app.color.color_F5F5F5'))
  266 + .strokeWidth('12lpx')
218 } 267 }
219 //List 268 //List
220 List({ space: '6lpx' }) { 269 List({ space: '6lpx' }) {
221 LazyForEach(this.data, (item: ContentDTO, index: number) => { 270 LazyForEach(this.data, (item: ContentDTO, index: number) => {
222 ListItem() { 271 ListItem() {
223 Column(){ 272 Column(){
  273 + if(this.searchType == "activity"){
  274 + ActivityItemComponent({contentDTO:item})
  275 + }else{
224 CardParser({contentDTO:item}) 276 CardParser({contentDTO:item})
  277 + }
225 if(index != this.data.totalCount()-1 ){ 278 if(index != this.data.totalCount()-1 ){
226 Divider() 279 Divider()
227 .width('100%') 280 .width('100%')
@@ -245,7 +298,6 @@ export struct SearchResultContentComponent{ @@ -245,7 +298,6 @@ export struct SearchResultContentComponent{
245 }.cachedCount(6) 298 }.cachedCount(6)
246 .edgeEffect(EdgeEffect.None) 299 .edgeEffect(EdgeEffect.None)
247 .scrollBar(BarState.Off) 300 .scrollBar(BarState.Off)
248 - .margin({top:'23lpx',left:'23lpx',right:'23lpx'})  
249 .layoutWeight(1) 301 .layoutWeight(1)
250 .onReachEnd(()=>{ 302 .onReachEnd(()=>{
251 console.log(TAG,"触底了"); 303 console.log(TAG,"触底了");
  1 +import { EmptyComponent } from '../view/EmptyComponent'
  2 +
  3 +@Entry
  4 +@Component
  5 +export struct DefaultPage {
  6 + build() {
  7 + Row() {
  8 + EmptyComponent({ emptyType: 8 })
  9 + }
  10 + }
  11 +}
@@ -4,7 +4,7 @@ @@ -4,7 +4,7 @@
4 4
5 @Entry 5 @Entry
6 @Component 6 @Component
7 -export struct detailedSkeleton { 7 +export struct newsSkeleton {
8 @State quantity: Array<number> = [1, 2, 3,] 8 @State quantity: Array<number> = [1, 2, 3,]
9 9
10 build() { 10 build() {
@@ -23,7 +23,7 @@ export const enum WDViewDefaultType { @@ -23,7 +23,7 @@ export const enum WDViewDefaultType {
23 WDViewDefaultType_NoCollection, 23 WDViewDefaultType_NoCollection,
24 ///无历史记录 24 ///无历史记录
25 WDViewDefaultType_NoHistory, 25 WDViewDefaultType_NoHistory,
26 - ///网络失败 26 + ///网络失败 请稍后重试-倒计时
27 WDViewDefaultType_NetworkFailed, 27 WDViewDefaultType_NetworkFailed,
28 ///内容获取失败 28 ///内容获取失败
29 WDViewDefaultType_ContentFailed, 29 WDViewDefaultType_ContentFailed,
@@ -36,18 +36,25 @@ export const enum WDViewDefaultType { @@ -36,18 +36,25 @@ export const enum WDViewDefaultType {
36 ///该号主无法访问 36 ///该号主无法访问
37 WDViewDefaultType_NoVisitAccount, 37 WDViewDefaultType_NoVisitAccount,
38 ///暂无关注 38 ///暂无关注
39 - WDViewDefaultType_NoFollow 39 + WDViewDefaultType_NoFollow,
  40 + ///直播结束
  41 + WDViewDefaultType_NoLiveEnd,
  42 + /// 直播暂停
  43 + WDViewDefaultType_NoLiveSuspend,
  44 + /// 视频加载失败
  45 + WDViewDefaultType_NoVideo,
40 } 46 }
41 47
42 /** 48 /**
43 * 空数据/无数据 49 * 空数据/无数据
44 */ 50 */
  51 +@Preview
45 @Component 52 @Component
46 export struct EmptyComponent { 53 export struct EmptyComponent {
47 // private emptySize: SizeOptions = {}; 54 // private emptySize: SizeOptions = {};
48 @State emptyWidth: string | number = CommonConstants.FULL_PARENT; 55 @State emptyWidth: string | number = CommonConstants.FULL_PARENT;
49 @State emptyHeight: string | number = CommonConstants.FULL_PARENT; 56 @State emptyHeight: string | number = CommonConstants.FULL_PARENT;
50 - @State emptyType:number = WDViewDefaultType.WDViewDefaultType_Default 57 + @State emptyType: number = WDViewDefaultType.WDViewDefaultType_Default
51 /** 58 /**
52 * The empty image width percentage setting. 59 * The empty image width percentage setting.
53 */ 60 */
@@ -101,16 +108,62 @@ export struct EmptyComponent { @@ -101,16 +108,62 @@ export struct EmptyComponent {
101 let contentString: string = '暂无内容' 108 let contentString: string = '暂无内容'
102 if (this.emptyType === WDViewDefaultType.WDViewDefaultType_NoCollection) { 109 if (this.emptyType === WDViewDefaultType.WDViewDefaultType_NoCollection) {
103 contentString = '暂无收藏' 110 contentString = '暂无收藏'
  111 + } else if (this.emptyType === WDViewDefaultType.WDViewDefaultType_NoMessage) {
  112 + contentString = '暂无消息'
  113 + } else if (this.emptyType === WDViewDefaultType.WDViewDefaultType_NoComment) {
  114 + contentString = '暂无评论'
  115 + } else if (this.emptyType === WDViewDefaultType.WDViewDefaultType_NoSearchResult) {
  116 + contentString = '没有找到相关内容'
  117 + } else if (this.emptyType === WDViewDefaultType.WDViewDefaultType_NoNetwork) {
  118 + contentString = '网络出小差了,请检查网络后重试'
  119 + } else if (this.emptyType === WDViewDefaultType.WDViewDefaultType_ContentFailed) {
  120 + contentString = '获取内容失败请重试'
  121 + } else if (this.emptyType === WDViewDefaultType.WDViewDefaultType_NoCreation) {
  122 + contentString = '暂无作品'
  123 + } else if (this.emptyType === WDViewDefaultType.WDViewDefaultType_NoBooking) {
  124 + contentString = '暂无预约'
  125 + } else if (this.emptyType === WDViewDefaultType.WDViewDefaultType_NetworkFailed) {
  126 + contentString = '' // 前方拥堵,请耐心等待
  127 + } else if (this.emptyType === WDViewDefaultType.WDViewDefaultType_NoVisitAccount) {
  128 + contentString = '该号主暂时无法访问' // 前方拥堵,请耐心等待
  129 + }else if (this.emptyType === WDViewDefaultType.WDViewDefaultType_NoLiveEnd) {
  130 + contentString = '直播已结束' // 前方拥堵,请耐心等待
  131 + }else if (this.emptyType === WDViewDefaultType.WDViewDefaultType_NoLiveSuspend) {
  132 + contentString = '主播暂时离开,马上回来' // 前方拥堵,请耐心等待
  133 + }else if (this.emptyType === WDViewDefaultType.WDViewDefaultType_NoVideo) {
  134 + contentString = '获取内容失败请重试' // 前方拥堵,请耐心等待
104 } 135 }
  136 +
105 return contentString 137 return contentString
106 } 138 }
107 139
108 -  
109 buildNoDataTipImage(): Resource | string { 140 buildNoDataTipImage(): Resource | string {
110 Logger.info(TAG, "buildNoDataTip"); 141 Logger.info(TAG, "buildNoDataTip");
111 let imageString: Resource | string = $r('app.media.icon_no_content') 142 let imageString: Resource | string = $r('app.media.icon_no_content')
112 if (this.emptyType === WDViewDefaultType.WDViewDefaultType_NoCollection) { 143 if (this.emptyType === WDViewDefaultType.WDViewDefaultType_NoCollection) {
113 imageString = $r('app.media.icon_no_collection') 144 imageString = $r('app.media.icon_no_collection')
  145 + } else if (this.emptyType === WDViewDefaultType.WDViewDefaultType_NoMessage) {
  146 + imageString = $r('app.media.icon_no_message')
  147 + } else if (this.emptyType === WDViewDefaultType.WDViewDefaultType_NoComment) {
  148 + imageString = $r('app.media.icon_no_comment')
  149 + } else if (this.emptyType === WDViewDefaultType.WDViewDefaultType_NoSearchResult) {
  150 + imageString = $r('app.media.icon_no_result')
  151 + } else if (this.emptyType === WDViewDefaultType.WDViewDefaultType_NoNetwork) {
  152 + imageString = $r('app.media.icon_no_net')
  153 + } else if (this.emptyType === WDViewDefaultType.WDViewDefaultType_ContentFailed) {
  154 + imageString = $r('app.media.icon_no_content')
  155 + } else if (this.emptyType === WDViewDefaultType.WDViewDefaultType_NoCreation) {
  156 + imageString = $r('app.media.icon_no_appointmentMade')
  157 + } else if (this.emptyType === WDViewDefaultType.WDViewDefaultType_NoBooking) {
  158 + imageString = $r('app.media.icon_no_appointmentMade')
  159 + } else if (this.emptyType === WDViewDefaultType.WDViewDefaultType_NetworkFailed) {
  160 + imageString = $r('app.media.icon_no_net')
  161 + } else if (this.emptyType === WDViewDefaultType.WDViewDefaultType_NoVisitAccount) {
  162 + imageString = $r('app.media.icon_no_master1')
  163 + }else if (this.emptyType === WDViewDefaultType.WDViewDefaultType_NoLiveEnd) {
  164 + imageString = $r('app.media.icon_no_end')
  165 + }else if (this.emptyType === WDViewDefaultType.WDViewDefaultType_NoVideo) {
  166 + imageString = $r('app.media.icon_no_content')
114 } 167 }
115 return imageString 168 return imageString
116 } 169 }
@@ -7,6 +7,8 @@ import { SearchHotContentItem } from '../viewmodel/SearchHotContentItem'; @@ -7,6 +7,8 @@ import { SearchHotContentItem } from '../viewmodel/SearchHotContentItem';
7 import { SearchResultCountItem } from '../viewmodel/SearchResultCountItem'; 7 import { SearchResultCountItem } from '../viewmodel/SearchResultCountItem';
8 import { SearchResultContentData } from '../viewmodel/SearchResultContentData'; 8 import { SearchResultContentData } from '../viewmodel/SearchResultContentData';
9 import { contentListParams, InteractDataDTO } from 'wdBean/Index'; 9 import { contentListParams, InteractDataDTO } from 'wdBean/Index';
  10 +import { CreatorDetailRequestItem } from '../viewmodel/CreatorDetailRequestItem';
  11 +import { CreatorDetailResponseItem } from '../viewmodel/CreatorDetailResponseItem';
10 12
11 const TAG = "SearcherAboutDataModel" 13 const TAG = "SearcherAboutDataModel"
12 14
@@ -320,6 +322,37 @@ class SearcherAboutDataModel{ @@ -320,6 +322,37 @@ class SearcherAboutDataModel{
320 } 322 }
321 323
322 324
  325 + /**
  326 + * 获取关注详情 列表
  327 + */
  328 + getCreatorDetailListData(object:CreatorDetailRequestItem): Promise<CreatorDetailResponseItem[]> {
  329 + return new Promise<CreatorDetailResponseItem[]>((success, error) => {
  330 + Logger.info(TAG, `getCreatorDetailListData start`);
  331 + this.fetchCreatorDetailListData(object).then((navResDTO: ResponseDTO<CreatorDetailResponseItem[]>) => {
  332 + if (!navResDTO || navResDTO.code != 0) {
  333 + success([])
  334 + return
  335 + }
  336 + Logger.info(TAG, "getCreatorDetailListData then,SearchResultListResDTO.timeStamp:" + navResDTO.timestamp);
  337 + let navigationBean = navResDTO.data as CreatorDetailResponseItem[]
  338 + success(navigationBean);
  339 + }).catch((err: Error) => {
  340 + Logger.error(TAG, `getCreatorDetailListData catch, error.name : ${err.name}, error.message:${err.message}`);
  341 + success([])
  342 + })
  343 + })
  344 + }
  345 +
  346 + fetchCreatorDetailListData(object:CreatorDetailRequestItem) {
  347 + let url = HttpUrlUtils.getCreatorDetailListDataUrl()
  348 + let headers: HashMap<string, string> = HttpUrlUtils.getCommonHeaders();
  349 + return WDHttp.post<ResponseDTO<CreatorDetailResponseItem[]>>(url,object, headers)
  350 + };
  351 +
  352 +
  353 +
  354 +
  355 +
323 } 356 }
324 357
325 const searcherAboutDataModel = SearcherAboutDataModel.getInstance() 358 const searcherAboutDataModel = SearcherAboutDataModel.getInstance()
@@ -2,7 +2,6 @@ import router from '@ohos.router' @@ -2,7 +2,6 @@ import router from '@ohos.router'
2 import { Params } from 'wdBean'; 2 import { Params } from 'wdBean';
3 import { StringUtils } from 'wdKit'; 3 import { StringUtils } from 'wdKit';
4 import { WDRouterPage, WDRouterRule } from 'wdRouter'; 4 import { WDRouterPage, WDRouterRule } from 'wdRouter';
5 -import { CardParser } from '../components/CardParser';  
6 import { HomePageBottomComponent } from '../components/mine/home/HomePageBottomComponent'; 5 import { HomePageBottomComponent } from '../components/mine/home/HomePageBottomComponent';
7 import MinePageDatasModel from '../model/MinePageDatasModel'; 6 import MinePageDatasModel from '../model/MinePageDatasModel';
8 7
@@ -183,37 +182,14 @@ struct MineHomePage { @@ -183,37 +182,14 @@ struct MineHomePage {
183 182
184 Divider().width('100%').height('12lpx').color($r('app.color.color_F5F5F5')).strokeWidth('12lpx') 183 Divider().width('100%').height('12lpx').color($r('app.color.color_F5F5F5')).strokeWidth('12lpx')
185 184
186 - Column(){  
187 - Column() {  
188 - // 页签  
189 - Row({ space: 7 }) {  
190 - Scroll() {  
191 - Row() {  
192 - this.TabBuilder(0,"评论")  
193 - this.TabBuilder(1,"关注")  
194 - }  
195 - .justifyContent(FlexAlign.Start)  
196 - }  
197 - .align(Alignment.Start)  
198 - .scrollable(ScrollDirection.Horizontal)  
199 - .scrollBar(BarState.Off)  
200 - .width('90%')  
201 - .padding({left:'31lpx'})  
202 - }  
203 - .alignItems(VerticalAlign.Bottom)  
204 - .width('100%')  
205 - }  
206 - .alignItems(HorizontalAlign.Start)  
207 - .width('100%')  
208 -  
209 //tab 页面 185 //tab 页面
210 Tabs({controller: this.controller}) { 186 Tabs({controller: this.controller}) {
211 TabContent() { 187 TabContent() {
212 HomePageBottomComponent({style:0}) 188 HomePageBottomComponent({style:0})
213 - } 189 + }.tabBar(this.TabBuilder(0,"评论"))
214 TabContent() { 190 TabContent() {
215 HomePageBottomComponent({style:1}) 191 HomePageBottomComponent({style:1})
216 - } 192 + }.tabBar(this.TabBuilder(1,"关注"))
217 } 193 }
218 .backgroundColor($r('app.color.white')) 194 .backgroundColor($r('app.color.white'))
219 .animationDuration(0) 195 .animationDuration(0)
@@ -221,8 +197,6 @@ struct MineHomePage { @@ -221,8 +197,6 @@ struct MineHomePage {
221 this.currentIndex = index 197 this.currentIndex = index
222 }) 198 })
223 .vertical(false) 199 .vertical(false)
224 - .barHeight(0)  
225 - }  
226 }.width("100%") 200 }.width("100%")
227 } 201 }
228 .edgeEffect(EdgeEffect.None) 202 .edgeEffect(EdgeEffect.None)
@@ -232,8 +206,8 @@ struct MineHomePage { @@ -232,8 +206,8 @@ struct MineHomePage {
232 } 206 }
233 }.width('100%') 207 }.width('100%')
234 .layoutWeight(1) 208 .layoutWeight(1)
235 - }  
236 209
  210 + }
237 @Builder MineHomeTitleTransparent() { 211 @Builder MineHomeTitleTransparent() {
238 RelativeContainer() { 212 RelativeContainer() {
239 //标题栏目 213 //标题栏目
@@ -368,9 +342,9 @@ struct MineHomePage { @@ -368,9 +342,9 @@ struct MineHomePage {
368 this.currentIndex = index 342 this.currentIndex = index
369 this.controller.changeIndex(this.currentIndex) 343 this.controller.changeIndex(this.currentIndex)
370 }) 344 })
371 - .height('77lpx')  
372 - .width('70lpx')  
373 - .margin({right:'29lpx'}) 345 + .height('100%')
  346 + .width('100%')
  347 + .margin({right:'9lpx'})
374 } 348 }
375 349
376 /** 350 /**
@@ -172,42 +172,17 @@ struct OtherNormalUserHomePage { @@ -172,42 +172,17 @@ struct OtherNormalUserHomePage {
172 .width('100%') 172 .width('100%')
173 .backgroundColor($r('app.color.white')) 173 .backgroundColor($r('app.color.white'))
174 } 174 }
175 -  
176 //间隔符 175 //间隔符
177 Divider().width('100%').height('12lpx').color($r('app.color.color_F5F5F5')).strokeWidth('12lpx') 176 Divider().width('100%').height('12lpx').color($r('app.color.color_F5F5F5')).strokeWidth('12lpx')
178 177
179 - Column(){  
180 - Column() {  
181 - // 页签  
182 - Row({ space: 7 }) {  
183 - Scroll() {  
184 - Row() {  
185 - this.TabBuilder(0,"评论")  
186 - this.TabBuilder(1,"关注")  
187 - }  
188 - .justifyContent(FlexAlign.Start)  
189 - }  
190 - .align(Alignment.Start)  
191 - .scrollable(ScrollDirection.Horizontal)  
192 - .scrollBar(BarState.Off)  
193 - .width('90%')  
194 - .padding({left:'31lpx'})  
195 - }  
196 - .alignItems(VerticalAlign.Bottom)  
197 - .width('100%')  
198 - }  
199 - .backgroundColor($r('app.color.white'))  
200 - .alignItems(HorizontalAlign.Start)  
201 - .width('100%')  
202 -  
203 //tab 页面 178 //tab 页面
204 Tabs({controller: this.controller}) { 179 Tabs({controller: this.controller}) {
205 TabContent() { 180 TabContent() {
206 OtherHomePageBottomCommentComponent({curUserId:this.curUserId,levelHead:this.levelHead,commentNum:$commentNum}) 181 OtherHomePageBottomCommentComponent({curUserId:this.curUserId,levelHead:this.levelHead,commentNum:$commentNum})
207 - } 182 + }.tabBar(this.TabBuilder(0,"评论"))
208 TabContent() { 183 TabContent() {
209 OtherHomePageBottomFollowComponent({curUserId:this.curUserId}) 184 OtherHomePageBottomFollowComponent({curUserId:this.curUserId})
210 - } 185 + }.tabBar(this.TabBuilder(1,"关注"))
211 } 186 }
212 .backgroundColor($r('app.color.white')) 187 .backgroundColor($r('app.color.white'))
213 .animationDuration(0) 188 .animationDuration(0)
@@ -215,8 +190,6 @@ struct OtherNormalUserHomePage { @@ -215,8 +190,6 @@ struct OtherNormalUserHomePage {
215 this.currentIndex = index 190 this.currentIndex = index
216 }) 191 })
217 .vertical(false) 192 .vertical(false)
218 - .barHeight(0)  
219 - }  
220 }.width("100%") 193 }.width("100%")
221 } 194 }
222 .edgeEffect(EdgeEffect.None) 195 .edgeEffect(EdgeEffect.None)
@@ -327,9 +300,9 @@ struct OtherNormalUserHomePage { @@ -327,9 +300,9 @@ struct OtherNormalUserHomePage {
327 this.currentIndex = index 300 this.currentIndex = index
328 this.controller.changeIndex(this.currentIndex) 301 this.controller.changeIndex(this.currentIndex)
329 }) 302 })
330 - .height('77lpx')  
331 - .width('70lpx')  
332 - .margin({right:'29lpx'}) 303 + .height('100%')
  304 + .width('100%')
  305 + .margin({right:'9lpx'})
333 } 306 }
334 307
335 308