跳到主要内容鸿蒙金融理财全栈项目:基础架构、数据安全与用户体验 | 极客日志TypeScriptPay大前端
鸿蒙金融理财全栈项目:基础架构、数据安全与用户体验
这篇文章围绕鸿蒙金融理财全栈项目,给出了分层架构设计思路,并落地了理财产品列表、个人理财、数据加密、身份认证、安全审计、无障碍设计、响应式布局和性能优化等核心能力。实现方式以工具类封装和页面拆分为主,强调金融场景下的安全、合规与体验平衡,为后续风险控制和合规审计扩展打下基础。
鸿蒙金融理财全栈项目:基础架构、数据安全与用户体验

内容承接与核心价值
这一篇承接前面的鸿蒙电商购物车项目架构,转到金融理财场景后,重点就不只是'能用',而是要同时把安全、合规、性能和体验一起做好。金融类应用的特点很明确:数据敏感、操作链路长、容错空间小,所以架构设计不能只看界面,还要把数据安全和用户体验放到同等重要的位置。
这部分的目标很清晰:
- 理解鸿蒙金融理财项目的整体架构设计;
- 搭建高可用、高安全、高可扩展的金融级应用骨架;
- 把数据加密、身份认证、安全审计这些关键能力落到实处;
- 兼顾无障碍设计、响应式布局和性能优化,让应用真正适合日常使用。
一、金融理财项目的架构基础
金融理财应用和普通业务应用最大的不同,在于它对稳定性和可信度的要求更高。用户不仅要看到界面,还要相信每一次请求、每一次展示、每一次操作都足够可靠。
1.1 项目特点
金融理财项目通常会有几个明显特征:
- 高安全:敏感数据必须加密,身份必须可验证;
- 高合规:操作流程要满足金融监管要求;
- 高可用:应用不能轻易卡顿、崩溃或中断;
- 高性能:页面切换、数据加载、状态反馈都要足够快。
1.2 分层架构设计
这里采用的是比较典型的分层思路,把职责拆开,避免所有逻辑都堆在页面里:
- 用户界面层:负责交互和页面渲染;
- 业务逻辑层:负责处理金融业务规则;
- 数据访问层:负责数据读取、保存和管理;
- 数据安全层:负责加密、认证和审计;
- 服务接口层:负责和后端服务通信。
这种结构的好处很直接:后面无论是加新功能,还是替换某一层实现,都不会牵一发而动全身。
二、金融理财项目的实战实现
2.1 页面入口与主框架
先看主页面。这里把金融理财应用拆成几个常见入口:理财产品、个人理财、风险评估、账户管理。主页面负责承接这些模块,同时给用户一个统一的视觉起点。
@Entry
@Component
struct MainPage {
@State selectedIndex: number = 0;
build() {
Column({ space: 0 }) {
Stack({ alignContent: . }) {
({ : }) {
()
.()
.(.)
.();
()
.()
.();
}
.()
.()
.()
.();
()
.()
.()
.(.)
.({ : });
}
.()
.()
.();
({ : ., : }) {
() { (); }.();
() { (); }.();
() { (); }.();
() { (); }.();
}
.()
.()
.()
.( {
. = index;
});
}
.()
.()
.();
}
}
Alignment
Center
Column
space
8
Text
'金融理财'
fontSize
24
fontWeight
FontWeight
Bold
textColor
'#000000'
Text
'安全、合规、高效的理财平台'
fontSize
14
textColor
'#666666'
width
'100%'
height
'auto'
padding
16
backgroundColor
'#F5F5F5'
Image
'common/icons/security.png'
width
60
height
60
objectFit
ImageFit
Cover
margin
top
8
width
'100%'
height
120
backgroundColor
'#F5F5F5'
Tabs
index
this
selectedIndex
vertical
false
TabContent
FinancialProductsPage
tabBar
'理财产品'
TabContent
PersonalFinancePage
tabBar
'个人理财'
TabContent
RiskAssessmentPage
tabBar
'风险评估'
TabContent
AccountManagementPage
tabBar
'账户管理'
width
'100%'
height
'100%'
backgroundColor
'#F5F5F5'
onChange
(index: number) =>
this
selectedIndex
width
'100%'
height
'100%'
backgroundColor
'#F5F5F5'
这个页面的思路并不复杂,但很实用:顶部先建立品牌感和安全感,下面用标签页承接各个业务入口,用户一眼就能知道自己当前在哪一块。
2.2 理财产品列表
理财产品页的关键不是'把数据摆出来',而是把信息层次排清楚。用户最关心的通常是产品名称、描述和预期收益率,所以这些信息要优先展示,按钮操作也要足够直接。
@Entry
@Component
struct FinancialProductsPage {
@State financialProducts: Array<financial.FinancialProduct> = [];
build() {
Column({ space: 16 }) {
ListComponent({
data: this.financialProducts,
renderItem: (item: financial.FinancialProduct, index: number) => {
Row({ space: 16 }) {
Image(item.avatarUrl)
.width(80)
.height(80)
.objectFit(ImageFit.Cover)
.borderRadius(8);
Column({ space: 8 }) {
Text(item.name)
.fontSize(16)
.fontWeight(FontWeight.Bold)
.textColor('#000000');
Text(item.description)
.fontSize(14)
.textColor('#666666')
.maxLines(2)
.textOverflow({ overflow: TextOverflow.Ellipsis });
Text(`预期收益率:${item.expectedReturnRate}%`)
.fontSize(16)
.fontWeight(FontWeight.Bold)
.textColor('#FF0000');
}
.layoutWeight(1);
ButtonComponent({
text: '查看详情',
onClick: () => {
router.pushUrl({
url: '/pages/FinancialProductDetailPage',
params: { productId: item.productId }
});
},
disabled: false
});
}
.width('100%')
.height('auto')
.padding(16)
.backgroundColor('#FFFFFF')
.borderRadius(8)
.margin({ bottom: 8 });
},
onItemClick: (item: financial.FinancialProduct, index: number) => {
router.pushUrl({
url: '/pages/FinancialProductDetailPage',
params: { productId: item.productId }
});
}
});
}
.width('100%')
.height('100%')
.padding(16)
.backgroundColor('#F5F5F5');
}
aboutToAppear() {
this.initFinancialProducts();
}
async initFinancialProducts(): Promise<void> {
this.financialProducts = await FinancialProductUtil.getInstance().getFinancialProducts();
}
}
这里有个小细节值得注意:列表项本身和按钮都能进入详情页,这样既照顾了习惯点卡片的用户,也照顾了习惯点按钮的用户。
三、业务逻辑层与数据访问封装
把金融业务能力封装成工具类,是比较稳妥的做法。页面只关心展示和交互,真正的数据请求和能力调用交给工具类,这样后续维护会轻松很多。
3.1 金融产品工具类
import financial from '@ohos.financial';
export class FinancialProductUtil {
private static instance: FinancialProductUtil | null = null;
private financialHelper: financial.FinancialHelper | null = null;
static getInstance(): FinancialProductUtil {
if (!FinancialProductUtil.instance) {
FinancialProductUtil.instance = new FinancialProductUtil();
}
return FinancialProductUtil.instance;
}
async init(): Promise<void> {
if (!this.financialHelper) {
this.financialHelper = financial.createFinancialHelper();
}
}
async getFinancialProducts(): Promise<Array<financial.FinancialProduct>> {
if (!this.financialHelper) {
return [];
}
const result = await this.financialHelper.getFinancialProducts();
return result;
}
async getFinancialProductDetail(productId: number): Promise<financial.FinancialProductDetail> {
if (!this.financialHelper) {
return null;
}
const result = await this.financialHelper.getFinancialProductDetail(productId);
return result;
}
}
3.2 个人理财工具类
import personal from '@ohos.personal';
export class PersonalFinanceUtil {
private static instance: PersonalFinanceUtil | null = null;
private personalHelper: personal.PersonalHelper | null = null;
static getInstance(): PersonalFinanceUtil {
if (!PersonalFinanceUtil.instance) {
PersonalFinanceUtil.instance = new PersonalFinanceUtil();
}
return PersonalFinanceUtil.instance;
}
async init(): Promise<void> {
if (!this.personalHelper) {
this.personalHelper = personal.createPersonalHelper();
}
}
async getPersonalFinanceData(): Promise<personal.PersonalFinanceData> {
if (!this.personalHelper) {
return null;
}
const result = await this.personalHelper.getPersonalFinanceData();
return result;
}
async purchaseFinancialProduct(productId: number, amount: number): Promise<personal.PurchaseFinancialProductResult> {
if (!this.personalHelper) {
return null;
}
const result = await this.personalHelper.purchaseFinancialProduct(productId, amount);
return result;
}
}
四、数据安全设计与实现
金融场景里,数据安全不是附加项,而是底座。用户注册、登录、购买、查看资产,这些行为背后都涉及敏感信息,任何一个环节处理不当,都可能放大风险。
4.1 数据加密
数据加密的重点在于:敏感内容在传输和存储前都要尽量避免明文暴露。下面把加密和解密能力封装成独立工具类,方便在不同业务场景复用。
import encryption from '@ohos.encryption';
export class DataEncryptionUtil {
private static instance: DataEncryptionUtil | null = null;
private encryptionHelper: encryption.EncryptionHelper | null = null;
static getInstance(): DataEncryptionUtil {
if (!DataEncryptionUtil.instance) {
DataEncryptionUtil.instance = new DataEncryptionUtil();
}
return DataEncryptionUtil.instance;
}
async init(): Promise<void> {
if (!this.encryptionHelper) {
this.encryptionHelper = encryption.createEncryptionHelper();
}
}
async encryptData(data: string): Promise<string> {
if (!this.encryptionHelper) {
return null;
}
const result = await this.encryptionHelper.encryptData(data);
return result;
}
async decryptData(encryptedData: string): Promise<string> {
if (!this.encryptionHelper) {
return null;
}
const result = await this.encryptionHelper.decryptData(encryptedData);
return result;
}
}
4.2 身份认证
身份认证是金融应用的另一条关键防线。只有确认'是谁在操作',后续的交易和数据展示才有意义。
import { IdentityAuthenticationUtil } from '../utils/IdentityAuthenticationUtil';
@Entry
@Component
struct IdentityAuthenticationPage {
@State authenticationResult: authentication.AuthenticationResult | null = null;
build() {
Column({ space: 16 }) {
Text('身份认证')
.fontSize(18)
.fontWeight(FontWeight.Bold)
.textColor('#000000');
ButtonComponent({
text: '进行身份认证',
onClick: async () => {
await this.authenticate();
},
disabled: false
});
if (this.authenticationResult) {
Text(`认证结果:${this.authenticationResult.success}`)
.fontSize(14)
.textColor('#000000');
Text(`认证方式:${this.authenticationResult.authenticationMethod}`)
.fontSize(14)
.textColor('#666666');
}
}
.width('100%')
.height('100%')
.padding(16)
.backgroundColor('#F5F5F5');
}
aboutToAppear() {
IdentityAuthenticationUtil.getInstance().init();
}
async authenticate(): Promise<void> {
this.authenticationResult = await IdentityAuthenticationUtil.getInstance().authenticate();
}
}
4.3 安全审计
审计能力的价值在于'可追溯'。金融系统里,很多问题并不是立刻暴露的,但只要操作日志足够完整,后面排查、回放、合规检查就会顺手很多。
import audit from '@ohos.audit';
export class SecurityAuditUtil {
private static instance: SecurityAuditUtil | null = null;
private auditHelper: audit.AuditHelper | null = null;
static getInstance(): SecurityAuditUtil {
if (!SecurityAuditUtil.instance) {
SecurityAuditUtil.instance = new SecurityAuditUtil();
}
return SecurityAuditUtil.instance;
}
async init(): Promise<void> {
if (!this.auditHelper) {
this.auditHelper = audit.createAuditHelper();
}
}
async recordOperationLog(operationLog: audit.OperationLog): Promise<void> {
if (!this.auditHelper) {
return;
}
await this.auditHelper.recordOperationLog(operationLog);
}
async getOperationLog(): Promise<Array<audit.OperationLog>> {
if (!this.auditHelper) {
return [];
}
const result = await this.auditHelper.getOperationLog();
return result;
}
}
五、用户体验设计与优化
金融应用经常给人一种'功能不少,但用起来很累'的印象,问题往往不在功能本身,而在体验细节。无障碍、布局适配、性能反馈,这些地方看似不显眼,实际决定了用户愿不愿意长期使用。
5.1 无障碍设计
无障碍能力要尽量做得自然,不要只停留在'有这个功能',而是要让更多用户真的能用起来。
@Entry
@Component
struct AccessibilityDesignPage {
build() {
Column({ space: 16 }) {
Text('无障碍设计')
.fontSize(18)
.fontWeight(FontWeight.Bold)
.textColor('#000000');
Text('我们的应用符合无障碍设计标准,确保所有用户都能正常使用。')
.fontSize(14)
.textColor('#666666');
ButtonComponent({
text: '启用无障碍功能',
onClick: async () => {
await this.enableAccessibility();
},
disabled: false
});
}
.width('100%')
.height('100%')
.padding(16)
.backgroundColor('#F5F5F5');
}
async enableAccessibility(): Promise<void> {
const accessibility = new accessibility.AccessibilityManager();
await accessibility.enableAccessibility();
promptAction.showToast({ message: '无障碍功能已启用' });
}
}
5.2 响应式布局
响应式布局在金融场景里尤其重要。用户可能在手机、平板甚至不同分辨率设备上查看资产信息,页面不能只适配一种屏幕。
@Entry
@Component
struct ResponsiveLayoutPage {
build() {
Column({ space: 16 }) {
Text('响应式布局')
.fontSize(18)
.fontWeight(FontWeight.Bold)
.textColor('#000000');
Text('我们的应用适配不同屏幕尺寸的设备,确保在任何设备上都能正常显示。')
.fontSize(14)
.textColor('#666666');
Row({ space: 16 }) {
Text('屏幕宽度:').fontSize(14).textColor('#000000');
Text(`${px2vp(display.getDefaultDisplaySync().width)}`)
.fontSize(14)
.textColor('#666666');
}
.width('100%')
.height('auto');
Row({ space: 16 }) {
Text('屏幕高度:').fontSize(14).textColor('#000000');
Text(`${px2vp(display.getDefaultDisplaySync().height)}`)
.fontSize(14)
.textColor('#666666');
}
.width('100%')
.height('auto');
}
.width('100%')
.height('100%')
.padding(16)
.backgroundColor('#F5F5F5');
}
}
5.3 性能优化
性能优化不一定是大改动,很多时候只是把初始化、请求和渲染拆开,避免页面一打开就把用户'卡住'。
import performance from '@ohos.performance';
export class PerformanceOptimizationUtil {
private static instance: PerformanceOptimizationUtil | null = null;
private performanceHelper: performance.PerformanceHelper | null = null;
static getInstance(): PerformanceOptimizationUtil {
if (!PerformanceOptimizationUtil.instance) {
PerformanceOptimizationUtil.instance = new PerformanceOptimizationUtil();
}
return PerformanceOptimizationUtil.instance;
}
async init(): Promise<void> {
if (!this.performanceHelper) {
this.performanceHelper = performance.createPerformanceHelper();
}
}
async optimizePerformance(): Promise<performance.PerformanceResult> {
if (!this.performanceHelper) {
return null;
}
const result = await this.performanceHelper.optimizePerformance();
return result;
}
}
六、项目配置与部署
项目做到这里,还需要把配置和部署链路走顺。金融类应用往往对权限和页面入口更敏感,所以 module.json5 里的配置不能马虎。
{
"module": {
"requestPermissions": [
],
"abilities": [
],
"widgets": [
],
"pages": [
]
}
}
开发完成后,在 DevEco Studio 中构建 HAP,再部署到鸿蒙设备上进行验证。测试时可以重点看这几件事:
- 理财产品列表是否正常展示;
- 个人理财数据是否准确加载;
- 风险评估和账户管理入口是否可用;
- 身份认证是否生效;
- 安全审计是否能记录操作;
- 无障碍和响应式布局是否在不同设备上表现正常;
- 页面切换和数据加载是否足够顺滑。
七、运行效果与结论
把整套链路跑通后,可以得到一个比较完整的金融理财应用骨架:
- 理财产品列表能展示名称、描述和预期收益率;
- 个人理财模块可以承载资产、收益、支出等数据;
- 风险评估和账户管理有了统一的入口;
- 身份认证、安全审计和数据加密把安全链路补齐;
- 无障碍、响应式布局和性能优化让应用更像一个成熟产品,而不只是一个能演示的 Demo。
八、总结与后续方向
这一篇完成的重点,不只是把页面搭出来,更重要的是把金融理财应用最核心的几条底线搭稳:架构分层要清楚,安全能力要独立,体验优化要前置考虑。对于金融类鸿蒙应用来说,这三件事缺一不可。
接下来的内容可以继续往风险控制、合规审计和产品创新方向推进,把这个项目从'基础可用'真正走向'面向上线'。
相关免费在线工具
- Base64 字符串编码/解码
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
- Base64 文件转换器
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
- Markdown转HTML
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
- HTML转Markdown
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
- JSON 压缩
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
- JSON美化和格式化
将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online