
一、前言
心晴驿站已正式上架华为应用市场,经过前十篇的迭代开发,项目已完成架构搭建、路由封装、组件化体系、隐私树洞、本地持久化存储、双量表心理测评、四大治愈游戏核心模块,产品核心业务能力已全部落地。
一款能够顺利上架、通过隐私审核与体验检测的鸿蒙应用,除了核心业务功能,还必须具备完善的用户数据管理、隐私操控能力、标准化设置中心、合规声明展示。很多功能完整的项目,往往因为缺少隐私清空入口、无版本说明、无合规页面,最终上架被驳回。
本篇作为项目业务收尾核心篇章,将完整落地个人中心 + 设置中心全套模块,实现测评数据可视化展示、一键清空隐私数据、隐私政策展示、版本信息、应用介绍等刚需合规能力,彻底补齐项目上架最后一块短板,完成全业务闭环。
二、模块功能规划与上架合规要求
2.1 核心功能清单
结合华为应用市场上架规范,本次个人中心与设置模块包含以下刚需功能:
-
用户数据看板:展示历史测评等级、情绪状态、测评分数,数据可视化回显;
-
隐私数据管控:一键清空所有本地测评数据、配置数据,完全由用户自主掌控;
-
标准化设置中心:包含基础配置、隐私入口、功能说明;
-
合规页面展示:隐私政策、应用介绍、版本信息展示;
-
友好无数据兜底:无测评记录时展示空态占位,UI整洁规范。
2.2 上架硬性合规规范
所有鸿蒙应用上架必须满足以下隐私规范,也是本篇重点落地内容:
-
用户产生的所有隐私数据,必须提供主动删除/一键清空入口;
-
应用必须展示版本信息、隐私协议、产品介绍,做到内容透明化;
-
禁止应用私自留存用户数据,用户清空后必须彻底销毁,无隐性残留;
-
页面逻辑完整,无死页面、无空白页面、无无效跳转。
三、模块整体架构设计
延续项目统一分层架构,个人中心模块依旧遵循数据解耦、视图复用、逻辑统一的开发思想:
-
数据层:复用第八篇 Preferences 存储工具与 StoreKey 常量,读取、清空用户数据;
-
逻辑层:封装数据读取、数据清空、弹窗提示、版本获取通用方法;
-
视图层:全局复用 WarmCard、EmptyPlaceholder、WarmButton 公共组件,统一UI风格;
-
路由层:基于全局路由工具,实现设置、隐私协议、关于页面无缝跳转。
四、通用工具方法封装
新增用户中心通用工具方法,用于读取用户测评数据、获取应用版本、统一数据格式化。
arkts
/**
* 用户中心通用工具
* 数据读取、版本获取、隐私清空方法
*/
import { getStoreData, clearAllStoreData } from '../utils/store_utils'
import StoreKey from '../constant/store_key'
import appInfo from '@ohos.appinfo'
/**
* 获取用户测评完整数据
*/
export async function getUserTestData() {
const score = await getStoreData<number>(StoreKey.PHQ9_SCORE, 0)
const level = await getStoreData<string>(StoreKey.TEST_LEVEL, '')
const desc = await getStoreData<string>(StoreKey.TEST_DESC, '')
return {
hasRecord: score > 0 && level,
score,
level,
desc
}
}
/**
* 清空用户所有隐私数据
*/
export async function clearUserPrivateData() {
await clearAllStoreData()
}
/**
* 获取应用版本号
*/
export async function getAppVersion() {
try {
const info = await appInfo.getApplicationInfo()
return info.versionName || '1.0.0'
} catch (e) {
return '1.0.0'
}
}
五、个人中心主页完整落地代码
实现用户情绪数据看板、空态兜底、跳转设置、底部导航联动,完全复用项目现有组件与架构。
arkts
/**
* 个人中心页面
* 数据可视化展示、设置入口、合规闭环
*/
import { WarmCard, WarmButton, EmptyPlaceholder } from '../components/common'
import { RouteUtils } from '../utils/route_utils'
import RoutePath from '../constant/route_const'
import { getUserTestData } from '../utils/user_utils'
@Entry
@Component
struct MinePage {
// 测评数据
@State hasRecord: boolean = false
@State testScore: number = 0
@State testLevel: string = ''
@State testDesc: string = ''
// 底部导航下标
@State currentTabIndex: number = 3
aboutToAppear() {
this.getUserData()
}
// 读取用户本地测评数据
async getUserData() {
const res = await getUserTestData()
this.hasRecord = res.hasRecord
this.testScore = res.score
this.testLevel = res.level
this.testDesc = res.desc
}
// 底部导航切换
onTabChange(index: number) {
this.currentTabIndex = index
switch (index) {
case 0:
RouteUtils.clearAllPush(RoutePath.INDEX_PAGE)
break
case 1:
RouteUtils.clearAllPush(RoutePath.EVAL_PAGE)
break
case 2:
RouteUtils.clearAllPush(RoutePath.GAME_PAGE)
break
case 3:
break
}
}
build() {
Column() {
// 头部个人信息卡片
this.UserHeadCard()
// 情绪测评数据看板
this.UserDataPanel()
// 功能入口列表
this.FunctionEntryList()
Blank().layoutWeight(1)
// 底部导航
TabBar({ currentIndex: this.currentTabIndex, onTabChange: this.onTabChange })
}
.width('100%')
.height('100%')
.padding({ left: 16, right: 16, top: 20 })
.backgroundColor('#F8FAFF')
}
// 头部卡片
@Builder
UserHeadCard() {
WarmCard() {
Column() {
Text('心晴驿站 · 个人中心')
.fontSize(18)
.fontWeight(FontWeight.Medium)
Text('守护你的每一份情绪与温柔')
.fontSize(13)
.fontColor('#999')
.margin({ top: 6 })
}
.width('100%')
.alignItems(HorizontalAlign.Start)
}
}
// 数据看板
@Builder
UserDataPanel() {
WarmCard({ title: '我的情绪测评记录' }) {
if (this.hasRecord) {
Column({ space: 12 }) {
Text(`综合得分:${this.testScore} 分`)
.fontSize(15)
Text(`情绪状态:${this.testLevel}`)
.fontSize(15)
.fontColor('#7FB8F7')
Text(this.testDesc)
.fontSize(13)
.fontColor('#666')
.lineHeight(22)
}
.width('100%')
.alignItems(HorizontalAlign.Start)
} else {
EmptyPlaceholder({ emptyText: '暂无测评记录,快去测测你的情绪状态吧~' })
}
}
.margin({ top: 16 })
}
// 功能入口
@Builder
FunctionEntryList() {
Column({ space: 12 }) {
WarmCard() {
Text('通用设置')
.fontSize(15)
.width('100%')
}
.onClick(() => RouteUtils.push(RoutePath.SETTING_PAGE))
WarmCard() {
Text('隐私政策')
.fontSize(15)
.width('100%')
}
.onClick(() => RouteUtils.push(RoutePath.PRIVACY_PAGE))
WarmCard() {
Text('关于我们')
.fontSize(15)
.width('100%')
}
.onClick(() => RouteUtils.push(RoutePath.ABOUT_PAGE))
}
.margin({ top: 16 })
}
}
六、设置中心与隐私清空核心页面
设置页面为项目隐私合规核心页面,重点实现一键清空用户隐私数据、数据重置能力,搭配弹窗二次确认,防止误操作。
arkts
/**
* 设置中心页面
* 隐私数据一键清空、合规核心功能
*/
import { WarmCard, WarmButton } from '../components/common'
import { RouteUtils } from '../utils/route_utils'
import { clearUserPrivateData } from '../utils/user_utils'
import promptAction from '@ohos.promptAction'
@Entry
@Component
struct SettingPage {
// 清空用户数据
async function clearAllData() {
// 二次确认弹窗
let res = await promptAction.showDialog({
title: '温馨提示',
message: '确定要清空所有本地测评数据与配置数据吗?清空后无法恢复!',
primaryButton: '取消',
secondaryButton: '确认清空'
})
if (res.index === 1) {
await clearUserPrivateData()
promptAction.showToast({ message: '数据已清空' })
// 返回个人中心刷新数据
RouteUtils.back()
}
}
build() {
Column() {
// 顶部标题
Row() {
Text('← 返回')
.fontSize(16)
.fontColor('#7FB8F7')
.onClick(() => RouteUtils.back())
Text('设置中心')
.layoutWeight(1)
.textAlign(TextAlign.Center)
.fontSize(17)
.fontWeight(FontWeight.Medium)
}
.width('100%')
.height(40)
// 隐私设置模块
WarmCard({ title: '隐私与数据管理' }) {
Column({ space: 10 }) {
Text('清空所有本地测评数据、个性化配置,数据清空后无任何残留')
.fontSize(12)
.fontColor('#999')
.lineHeight(20)
WarmButton({
text: '一键清空隐私数据',
primary: true,
onClick: () => this.clearAllData()
})
.margin({ top: 10 })
}
}
.margin({ top: 20 })
Blank().layoutWeight(1)
}
.width('100%')
.height('100%')
.padding(16)
.backgroundColor('#F8FAFF')
}
}
七、关于页面与版本信息落地
展示应用名称、版本号、产品介绍,完善应用合规信息展示,补齐上架信息完整性要求。
arkts
/**
* 关于我们页面
* 版本信息、产品介绍合规展示
*/
import { WarmCard } from '../components/common'
import { RouteUtils } from '../utils/route_utils'
import { getAppVersion } from '../utils/user_utils'
@Entry
@Component
struct AboutPage {
@State versionName: string = '1.0.0'
aboutToAppear() {
this.getVersion()
}
async getVersion() {
this.versionName = await getAppVersion()
}
build() {
Column() {
Row() {
Text('← 返回')
.fontSize(16)
.fontColor('#7FB8F7')
.onClick(() => RouteUtils.back())
Text('关于我们')
.layoutWeight(1)
.textAlign(TextAlign.Center)
.fontSize(17)
.fontWeight(FontWeight.Medium)
}
.width('100%')
.height(40)
WarmCard() {
Column({ space: 15 }) {
Text('心晴驿站')
.fontSize(20)
.fontWeight(FontWeight.Bold)
Text(`当前版本:${this.versionName}`)
.fontSize(14)
.fontColor('#666')
Text('产品介绍')
.fontSize(16)
.fontWeight(FontWeight.Medium)
.margin({ top: 10 })
Text('心晴驿站是一款轻量化治愈系心理工具应用,提供专业心理测评、私密情绪树洞、治愈解压游戏、白噪音冥想等功能。全程离线可用、高隐私零留存,专注为用户提供温柔、无负担的情绪陪伴体验。')
.fontSize(13)
.fontColor('#666')
.lineHeight(24)
}
.width('100%')
.alignItems(HorizontalAlign.Center)
}
.margin({ top: 20 })
Blank().layoutWeight(1)
}
.width('100%')
.height('100%')
.padding(16)
.backgroundColor('#F8FAFF')
}
}
八、隐私政策页面极简合规实现
上架应用必备页面,展示标准隐私说明,内容贴合项目离线、无采集、零留存的产品特性。
arkts
/**
* 隐私政策页面
* 上架合规必备页面
*/
import { RouteUtils } from '../utils/route_utils'
@Entry
@Component
struct PrivacyPage {
build() {
Column() {
Row() {
Text('← 返回')
.fontSize(16)
.fontColor('#7FB8F7')
.onClick(() => RouteUtils.back())
Text('隐私政策')
.layoutWeight(1)
.textAlign(TextAlign.Center)
.fontSize(17)
.fontWeight(FontWeight.Medium)
}
.width('100%')
.height(40)
Scroll() {
Column() {
Text('隐私政策')
.fontSize(18)
.fontWeight(FontWeight.Medium)
.width('100%')
Text(`
心晴驿站高度重视用户隐私与数据安全,本应用严格遵循隐私最小化原则,郑重说明如下:
1. 本应用全程离线运行,无任何网络上传、数据采集、信息上报行为。
2. 情绪树洞内容仅内存临时存储,退出页面立即销毁,无本地留存。
3. 测评数据仅保存在用户设备本地私有目录,仅用户本人可查看。
4. 所有用户数据支持一键彻底清空,无隐性缓存、无后台留存。
5. 本应用不获取手机设备信息、不获取隐私权限、不收集个人信息。
我们将持续守护用户隐私安全,为用户提供安全、纯净、无负担的治愈体验。`)
.fontSize(13)
.lineHeight(26)
.fontColor('#555')
.margin({ top: 15 })
}
.padding(5)
}
.margin({ top: 20 })
.layoutWeight(1)
}
.width('100%')
.height('100%')
.padding(16)
.backgroundColor('#F8FAFF')
}
}
九、模块核心亮点与上架合规总结
9.1 完整隐私管控闭环
从数据存储、数据展示、数据删除全链路闭环,用户可随时查看、随时清空个人隐私数据,完全满足华为应用市场隐私合规审核硬性标准,彻底杜绝「数据无法手动删除」的驳回问题。
9.2 页面信息完整合规
补齐版本信息、产品介绍、隐私政策三大必备页面,应用信息透明化,符合鸿蒙应用上架内容规范,无合规缺失项。
9.3 极致用户体验优化
增加空态兜底、二次确认弹窗、Toast提示,避免用户误操作,交互逻辑严谨、体验流畅,无功能BUG、无逻辑漏洞。
9.4 架构高度复用
全程复用全局组件、路由工具、存储工具,无冗余代码、无重复逻辑,页面简洁轻量化,低内存、低功耗,适配全机型。
十、开发踩坑复盘(上架关键避坑)
10.1 清空数据后页面数据不刷新
问题:一键清空数据后返回个人中心,旧数据依旧展示,需要手动刷新。
解决方案:清空数据后返回个人中心页面,页面重新声明周期加载,自动读取最新空数据,完成刷新。
10.2 无二次确认导致误操作投诉风险
问题:直接点击清空立即删除数据,用户容易误触,体验极差。
解决方案:增加系统弹窗二次确认,区分取消/确认操作,规避误操作问题。
10.3 缺少隐私页面导致上架驳回
问题:很多个人项目因无隐私政策页面、无合规说明,直接审核不通过。
解决方案:标配隐私政策页面,内容与项目实际逻辑完全匹配,不虚假、不套用模板。
10.4 版本号固定写死不规范
问题:硬编码版本号,后续迭代需要手动修改,维护麻烦且不规范。
解决方案:读取系统应用版本信息,动态渲染,适配后续版本迭代更新。
十一、本篇总结与下篇预告
本篇我们完整落地了心晴驿站个人中心、设置中心、合规页面全套功能,实现了用户数据可视化、隐私数据一键清空、版本展示、隐私政策、关于页面等上架刚需能力,彻底完成项目所有业务功能与合规体系闭环。
至此,心晴驿站项目架构、路由、组件、隐私功能、测评业务、治愈游戏、用户中心、合规体系全部开发完毕,项目整体达到完整上架、商用、参赛标准。
下篇预告(第十二篇) :项目全局适配、性能终极优化与上架打包全流程,详解多机型弹性适配、内存优化、功耗优化、冗余资源清理、APP签名打包、上架提审流程,完成项目从开发到正式上架的最后一公里。