惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - Franky
N
Netflix TechBlog - Medium
宝玉的分享
宝玉的分享
Google DeepMind News
Google DeepMind News
腾讯CDC
G
Google Developers Blog
Martin Fowler
Martin Fowler
Microsoft Security Blog
Microsoft Security Blog
Recent Announcements
Recent Announcements
爱范儿
爱范儿
Engineering at Meta
Engineering at Meta
Microsoft Azure Blog
Microsoft Azure Blog
A
About on SuperTechFans
aimingoo的专栏
aimingoo的专栏
有赞技术团队
有赞技术团队
Jina AI
Jina AI
人人都是产品经理
人人都是产品经理
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
M
MIT News - Artificial intelligence
罗磊的独立博客
博客园 - 三生石上(FineUI控件)
美团技术团队
WordPress大学
WordPress大学
阮一峰的网络日志
阮一峰的网络日志

人人都是产品经理

为什么你的产品找不到差异化?90%的失败都卡在第一步上(下) – 人人都是产品经理, 3年从30万到1300万用户、获2200万美元融资,这个AI教育产品用“抽卡”破解了获客难题 – 人人都是产品经理, 园区招商系统怎么做才能真正帮到去化?我加了这一个功能,推广链接转发400次阅读过万 – 人人都是产品经理, AI大事件:OpenAI发完网络安全模型又搞药物研发,小鹏汽车要抓”DeepSeek时刻” – 人人都是产品经理, 电商不是卖货,是一场更残酷的产品经理实战 – 人人都是产品经理, 没想到,活动营销又回来了! – 人人都是产品经理, 为何All-in海外KOC:一场关于AI时代窗口期的豪赌 – 人人都是产品经理, 重新理解企业的内部协作 – 人人都是产品经理, 苹果的 AI 战略到底是什么? – 人人都是产品经理, 医疗智能体·第2讲——合规护城河:等保、PIPL与HIPAA的架构实战 – 人人都是产品经理, 向量知识库五步法:从“答非所问”到“精准回复” – 人人都是产品经理, 鸿蒙PC三方库构建总指挥HPKBUILD(sha)库为例 – 人人都是产品经理, 何时该用LLM?AI产品经理的LLM设计指南 – 人人都是产品经理, 医疗信息领域的需求方、决策方、准入方以及关注点(二) – 人人都是产品经理, 即梦涨价:一场被误读的「傲慢」 – 人人都是产品经理, 面试AI PM必答题:Hermes和OpenClaw的区别,如何讲清楚业务价值 – 人人都是产品经理, AI的下一张船票:世界模型——AI产品经理必须理解的技术拐点 – 人人都是产品经理, 小红书做GEO,怎么让AI信你?记住这 3 个重要信息 – 人人都是产品经理, 5 家印度 AI 初创公司,看看印度 AI 再做什么 – 人人都是产品经理, AI项目跨团队协作:产品技术业务如何不打架 – 人人都是产品经理, Agentic Workflow(智能体工作流):让AI从”答案生成器”变成”数字员工” – 人人都是产品经理, lycium_plusplus 项目全景解读:OpenHarmony 三方库构建的“大管家” – 人人都是产品经理, 从爆单救火到前置履约:两套预采策略,把生鲜大促履约效率拉满 – 人人都是产品经理, 什么时候该补货?我用一轮数据做了一个决定 – 人人都是产品经理, 从“机械兜底”到“动态分流”:AI客服重复进线治理的4大底层逻辑 – 人人都是产品经理, 抖音拼效率,红书拼洞察 – 人人都是产品经理, 全民狂欢与退潮——为什么龙虾这波热潮冷却得如此之快? – 人人都是产品经理, Stripe押注!MPP重塑全球支付 – 人人都是产品经理, 小红书GEO:AI引用你的内容,不是因为你对,而是因为你看起来可信 – 人人都是产品经理, 前百度副总裁押注办公Agent,日韩付费爆发,Manus迎来强劲对手 – 人人都是产品经理,
【案例+1】HarmonyOS官方模板优秀案例(第8期:阅读行业 · 电...
华为开发者联盟 · 2025-09-23 · via 人人都是产品经理

为支持开发者单独获取特定场景的页面和功能,本模板将功能完全自闭环的部分能力抽离出独立的行业组件模块,不依赖公共基础能力包,开发者可以单独集成,开箱即用,降低使用难度。

BookRead

├─BookRead/entry/src/main/ets

│ ├─entryability

│ │ └─EntryAbility.ets                     // 应用主入口能力

│ ├─entrybackupability

│ │ └─EntryBackupAbility.ets               // 应用备份恢复能力配置

│ └─pages

│ ├─BookHomePage.ets                       // 应用主页框架

│ └─Index.ets                              // 应用入口默认首页

├─BookRead/commons/common/src/main/ets

│ ├─api

│ │ └─BookApi.ets                          // 图书API调用

│ ├─comp

│ │ ├─AggregatedPaymentPicker.ets          // 集成支付选择器组件

│ │ ├─GlobalContext.ets                    // 全局上下文管理类

│ │ ├─TCInvoke.ets                         // 终端云服务调用封装

│ │ ├─TCLogger.ets                         // 终端云日志记录工具

│ │ ├─TCRouter.ets                         // 终端云路由导航管理

│ │ └─Toast.ets                            // 提示消息显示

│ ├─constant

│ │ └─Constants.ets                        // 常量定义文件

│ ├─model

│ │ ├─Book.ets                             // 图书数据模型

│ │ ├─BookSortInfo.ets                     // 图书排序信息模型

│ │ ├─BorrowInfo.ets                       // 借阅信息模型

│ │ ├─FeedbackRecordModel.ets              // 反馈记录模型

│ │ ├─Member.ets                           // 会员信息模型

│ │ ├─PaymentModels.ets                    // 支付相关信息模型

│ │ ├─PreferenceInfo.ets                   // 用户偏好设置模型

│ │ ├─ReadSet.ets                          // 阅读模型

│ │ └─UserInfoModel.ets                    // 用户信息模型

│ ├─ui

│ │ ├─BookCard.ets                         // 图书卡片组件

│ │ ├─CommonUI.ets                         // 基础UI组件

│ │ └─TSearch.ets                          // 搜索功能相关组件

│ ├─utils

│ │ ├─DialogUtil.ets                       // 全局弹窗工具类

│ │ ├─EpubUtils.ets                        // Epub格式相关工具方法

│ │ ├─FileUtils.ets                        // 文件操作工具类

│ │ ├─MathUtil.ets                         // 数学计算工具类

│ │ ├─TimeUtils.ets                        // 时间处理工具类

│ │ ├─UserInfoUtil.ets                     // 用户信息处理工具类

│ │ └─WindowUtils.ets                      // 窗口或界面尺寸相关工具

│ └─viewmodel

│   ├─MemberCenterVM.ets                   // 会员中心逻辑模型

│   ├─RechargeRecordVM.ets                 // 充值记录逻辑模型

│   └─RechargeVM.ets                       // 充值功能业务逻辑模型

├─BookRead/feature/book_home/src/main/ets

│ ├─comps

│ │ ├─BookListCard.ets                     // 图书列表卡片式展示组件

│ │ ├─BookSwiperCard.ets                   // 图书轮播图展示卡片

│ │ ├─BookViewCard.ets                     // 图书详情视图卡片

│ │ ├─BookWaterFlowCard.ets                // 图书瀑布流布局组件

│ │ └─HotRankCard.ets                      // 热门排行榜卡片

│ ├─viewModels

│ │ └─SearchViewModels.ets                 // 搜索功能逻辑模型

│ └─views

│   ├─BookListPage.ets                     // 图书列表页面

│   ├─BookViewListPage.ets                 // 带分类的图书列表视图页

│   └─SearchPage.ets                       // 全站搜索功能主页面

├─BookRead/feature/book_person/src/main/ets

│ ├─comp

│ │ ├─AccountCard.ets                      // 用户账户余额信息卡片

│ │ ├─ActivityCard.ets                     // 活动信息展示卡片

│ │ ├─CenterToolCard.ets                   // 个人中心工具卡片集

│ │ ├─FileSelect.ets                       // 文件选择器组件

│ │ ├─MembershipCard.ets                   // 会员身份展示卡片

│ │ ├─MyBalanceCard.ets                    // 余额信息展示卡片

│ │ ├─MyInfoCard.ets                       // 个人基本信息展示卡片

│ │ ├─OptionView.ets                       // 选项卡片组件

│ │ ├─SelectAvatarCard.ets                 // 头像选择器组件

│ │ ├─ServiceCard.ets                      // 服务入口卡片

│ │ ├─SignComp.ets                         // 签到卡片

│ │ └─UsrMsgCard.ets                       // 用户信息卡片

│ └─views

│   ├─AboutPage.ets                        // 关于我们信息页

│   ├─AccountPage.ets                      // 账户管理主页面

│   ├─ActivityPage.ets                     // 活动信息列表页

│   ├─DataCollectionPage.ets               // 用户数据采集页

│   ├─DataSharingPage.ets                  // 数据共享协议页

│   ├─FeedbackPage.ets                     // 意见反馈表单页

│   ├─FeedbackRecordPage.ets               // 反馈记录列表页

│   ├─IssueAndFeedbackPage.ets             // 问题反馈页面

│   ├─LibraryPage.ets                      // 我的书馆页面

│   ├─LoginPage.ets                        // 用户登录页

│   ├─MemberAgreementPage.ets              // 会员协议展示页

│   ├─MemberCenterPage.ets                 // 会员中心主界面

│   ├─PersonPage.ets                       // 个人中心主页

│   ├─PreferencePage.ets                   // 偏好设置页面

│   ├─PrivacyPage.ets                      // 隐私设置界面

│   ├─PrivacyPolicyPage.ets                // 隐私政策声明页

│   ├─ReadSettingPage.ets                  // 阅读设置页

│   ├─RechargePage.ets                     // 充值中心主界面

│   ├─RechargeRecordPage.ets               // 充值记录查询页

│   ├─WelfareCenter.ets                    // 福利中心页面

│   └─SettingPage.ets                      // 系统设置综合页面

├─BookRead/feature/book_read_kit/src/main/ets

│ ├─components

│ │ ├─BookCoverCard.ets                    // 图书封面展示组件

│ │ ├─ExpandableText.ets                   // 书评展示组件

│ │ ├─ReaderPage.ets                       // 阅读器核心页面

│ │ ├─ReaderTopCard.ets                    // 阅读器顶部控制栏

│ │ └─ShareBookCard.ets                    // 图书分享功能组件

│ ├─model

│ │ └─ReviewModels.ets                     // 图书数据模型

│ ├─pages

│ │ ├─MyReviewPage.ets                     // 我的评价页面

│ │ ├─WonderfulReviewPage.ets              // 精彩书评页面

│ │ ├─WriteCommentPage.ets                 // 写评论页面

│ │ └─WriteReviewPage.ets                  // 全部书评页面

│ ├─utils

│ │ └─ReviewdataUtil.ets                   // 书籍评论工具类

│ └─viewmodel

│   └─WriteReviewVM.ets                    // 书籍评论数据模型

├─BookRead/feature/book_shelf/src/main/ets

│ ├─comps

│ │ ├─DeleteBottomCard.ets                 // 书籍删除确认底部弹窗

│ │ └─ManageGroupBottomCard.ets            // 管理分组底部卡片

│ └─views

│   ├─BookGroupContent.ets                 // 书籍分组页

│   └─BookShelfPage.ets                    // 我的书架主界面

├─BookRead/feature/book_sort/src/main/ets

│ └─pages

│   └─BookSortPage.ets                     // 图书分类导航页面

├─BookRead/components/aggregated_payment/src/main/ets

│ ├─components

│ │ └─AggregatedPaymentPicker.ets          // 集成支付选择器组件

│ ├─model

│ │ └─PaymentModels.ets                    // 支付相关信息模型

│ └─views

│   ├─AggregatedPaymentVM.ets              // 支付组件数据模型

│   ├─MockApi.ets                          // 支付mock数据

│   ├─OrderInfoUtil.ets                    // 支付mock参数工具

│   └─SignUtils.ets                        // 支付mock签名工具

├─BookRead/components/base_common/src/main/ets

│ └─components

│   ├─ActionSheet.ets                      // 阅读器底部工具栏

│   └─UserInfo.ets                         // 阅读器用户信息

├─BookRead/components/incentive_ad/src/main/ets

│ ├─components

│ │ └─IncentiveAdvertising.ets             // 广告位广告类

│ └─viewmodel

│   └─RewardAdStatusHandler.ets            // 事件订阅

├─BookRead/components/reader_tool_bar/src/main/ets

│ └─components

│   └─PushKit.ets                          // 推送组件

├─BookRead/components/reader_tool_bar/src/main/ets

│ └─components

│   ├─ReaderToolBar.ets                    // 阅读器底部工具栏

│   └─SelectState.ets                      // 文本选择状态组件

└─BookRead/components/swiper_card/src/main/ets

  ├─components

  │ ├─BookSingleSwiper.ets                 // 单图书滑动展示组件

  │ ├─example.ets                          // 组件使用示例

  │ └─TUISwiper.ets                        // 通用滑动卡片组件

  └─model

    ├─Book.ets                             // 图书数据模型定义

    └─LazyDataVM.ets                       // 数据逻辑模型

async onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): Promise<void> {

  hilog.info(0x0000, ‘testTag’, ‘%{public}s’, ‘Ability onCreate’);

  // 获取Push Token

  try {

    const pushToken = await pushService.getToken();

    AppStorage.setOrCreate(‘PushToken’, pushToken)

    hilog.info(0x0000, ‘testTag’, ‘Succeeded in getting push token’);

  } catch (err) {

    let e: BusinessError = err as BusinessError;

    hilog.error(0x0000, ‘testTag’, ‘Failed to get push token: %{public}d %{public}s’, e.code, e.message);

  }

  if (want.action === ‘com.test.action’) {

    AppStorage.setOrCreate(‘takeMessage’, 1)

    const pushData: PushData = {

      pushContent: want.parameters?.pushContent as string,

      time: want.parameters?.time as string,

      read: false

    }

    AppStorage.setOrCreate(‘pushData’, pushData)

  }

  // 上报Push Token到服务端

  // axios.post(“http://localhost:8080/upload”, pushToken, {

  //   headers: {

  //     “Content-Type”: “application/json”

  //   }

  // })

  //   .then((response:AxiosResponse) => {

  //     console.log(“服务器响应:”, response.data);

  //   })

  //   .catch((err:BusinessError) => {

  //     console.error(“请求失败:”, err);

  //   });

}

onNewWant(want: Want, launchParam: AbilityConstant.LaunchParam): void {

  if (want.action === ‘com.test.action’) {

    AppStorage.setOrCreate(‘takeMessage’, 1)

    AppStorage.setOrCreate(‘coldBoot’, 1)

    const pushData: PushData = {

      pushContent: want.parameters?.pushContent as string,

      time: want.parameters?.time as string,

      read: false

    }

    AppStorage.setOrCreate(‘pushData’, pushData)

  }

}

n // 订阅方法,需要在每次展示广告前调用

public registerPPSReceiver(): void {

  if (this.subscriber) {

    this.unRegisterPPSReceiver();

  }

  // 订阅者信息

  const subscribeInfo: commonEventManager.CommonEventSubscribeInfo = {

    events: [‘com.huawei.hms.pps.action.PPS_REWARD_STATUS_CHANGED’],

    // publisherBundleName被设置为”com.huawei.hms.adsservice”,这意味着只有来自该包名的事件才会被订阅者接受和处理。

    // 如果没有明确声明publisherBundleName,那么订阅者可能会收到来自其它包名的伪造事件,从而导致安全性问题或误导。

    publisherBundleName: ‘com.huawei.hms.adsservice’

  };

  // 创建订阅者回调

  commonEventManager.createSubscriber(subscribeInfo, (err: BusinessError, commonEventSubscriber:

    commonEventManager.CommonEventSubscriber) => {

    if (err) {

      hilog.error(0x0000, ‘testTag’, `Failed to create subscriber. Code is ${err.code}, message is ${err.message}`);

      return;

    }

    hilog.info(0x0000, ‘testTag’, ‘Succeeded in creating subscriber’);

    this.subscriber = commonEventSubscriber;

    // 订阅公共事件回调

    if (!this.subscriber) {

      hilog.warn(0x0000, ‘testTag’, ‘Need create subscriber’);

      return;

    }

    commonEventManager.subscribe(this.subscriber, (err: BusinessError, commonEventSubscriber:

      commonEventManager.CommonEventData) => {

      if (err) {

        hilog.error(0x0000, ‘testTag’, `Failed to subscribe. Code is ${err.code}, message is ${err.message}`);

      } else {

        hilog.info(0x0000, ‘testTag’, ‘Succeeded in subscribing data’);

        const status: string = commonEventSubscriber?.parameters?.[KEY_REWARD_STATUS];

        switch (status) {

          case AdStatus.AD_OPEN:

            hilog.info(0x0000, ‘testTag’, ‘Status is onAdOpen’);

            break;

          case AdStatus.AD_CLICKED:

            hilog.info(0x0000, ‘testTag’, ‘Status is onAdClick’);

            break;

          case AdStatus.AD_CLOSED:

            hilog.info(0x0000, ‘testTag’, ‘Status is onAdClose’);

            this.unRegisterPPSReceiver();

            break;

          case AdStatus.AD_REWARDED:

            const rewardData: Record<string, string | number> = commonEventSubscriber?.parameters?.[KEY_REWARD_DATA];

            const rewardType: string = rewardData?.rewardType as string;

            const rewardAmount: number = rewardData?.rewardAmount as number;

            this.userInfoFromStorage.bookCoins += rewardAmount;

            AppStorage.setOrCreate(‘bookCoins’, this.userInfoFromStorage.bookCoins);

            this.bookFinish++

            AppStorage.set(‘bookFinished’, this.bookFinish);

            emitter.emit({ eventId:15 })

            hilog.info(0x0000, ‘testTag’, `Status is onAdReward. Type is ${rewardType}, Amount is ${rewardAmount}`);

            hilog.info(0x0000, ‘testTag’,

              `Status is userInfoFromStorage. Type is ${this.userInfoFromStorage.bookCoins}`);

            break;

          case AdStatus.AD_VIDEO_START:

            hilog.info(0x0000, ‘testTag’, ‘Status is onAdVideoStart’);

            break;

          case AdStatus.AD_COMPLETED:

            hilog.info(0x0000, ‘testTag’, ‘Status is onAdCompleted’);

            break;

          default:

            break;

        }

      }

    });

  });

}

将commons/lib_common/src/main/ets/httprequest/HttpRequestApi.ets文件中的mock接口替换为真实的服务器接口。

在commons/lib_common/src/main/ets/httprequest/HttpRequest.ets文件中将云侧开发者自定义的数据结构转换为端侧数据结构。