Harmony OS5个人小项目——简单记账 (1)

57 阅读2分钟

一、项目功能

1、收入/支出记录:用户通过输入账单类型、金额,记录自己的消费,具体包括类别、金额、时间等。

2、今日明细记录查看:用户可查看当天所有的账目。

3、账单功能:为用户生成本月内每一天的收入支出情况。

4、统计功能:用户可以查看不同类别的收支统计情况,了解自己具体在不同类别中的支出或收入情况。

5、账户管理:用户可预先输入每月的预算,该app会根据每天收支情况和剩余金额等,提供剩余预算统计以及建议每日用度。

二、页面分布结构解读

1、首页:index.ets

2、明细查看页面:detailed.ets

3、收入/支出操作页面:addAccounts.ets

4、账单情况页面:bill.ets

5、类别收支统计页面: statistics.ets

6、账号管理页面:mine.ets

三、页面创建

创建结果如下: image.png

页面结构解读:

├──entry/src/main/ets // 代码区

│ ├──entryability

│ │ └──EntryAbility.ets // 程序入口类

│ ├──model

│ │ └──TaskModel.ets // 数据库操作类

│ ├──pages

│ │ └──bill.ets // 账单页面

│ │ └──detailed.ets // 明细页面

│ │ └──addAccounts.ets // 收入/支出操作页面

│ │ └──Index.ets // 首页

│ │ └──mine.ets // 我的信息页面

│ │ └──statistics.ets // 收支统计页面

│ └──viewmodel

│ │ └──classInfo.ets // 获取收支情况类别

│ │ └──detailedInfo.ets // 获取账单明细

│ └──views

│ │ └──amountOanel.ets // 明细金额弹出框

│ │ └──budgetPanel.ets //预算弹出框

四、首页布局

首页具体功能为:提供一个导航栏,分别为明细、账单、添加账目信息、收支统计、我的信息五个图标,分别用于跳转到各自页面进行操作。

具体代码如下:

@Entry
@Component
struct Index {
 
  build() {
    Column() {
      Row(){
        //明细图标:用于跳转到明细详情页
        Column(){
          Image($r('app.media.detailed'))
            .width(50)
          Text('明细')
            .fontSize(15)
        }
        .width(70)
        
        //账单图标:用于跳转到账单页
        Column(){
          Image($r('app.media.bill'))
            .width(45)
          Text('账单')
            .fontSize(15)
        }
        .width(70)
        
        //添加图标:用于添加一笔账目信息
        Column(){
          Button('+')
            .fontSize(60)
            .backgroundColor(Color.Pink)
            .borderColor(Color.Black)
            
        }
        .width(90)
        //存钱图标:用于跳转到存钱页面
        Column(){
          Image($r('app.media.statistics'))
            .width(40)
            .margin({bottom: 7})
          Text('统计')
            .fontSize(15)
            
        }
        .width(70)
        //我的图标:用于跳转到账号管理页面
        Column(){
          Image($r('app.media.mine'))
            .width(40)
          Text('我的')
            .fontSize(15)
        }
        .width(70)
        
      }
      .width('100%')
      .height(100)
      .position({x: 0,y: 690})
    }
    .width('100%')
    .height('100%')
    .backgroundImage($r('app.media.background'))
    .backgroundImageSize({width: 370, height: 750})
      }
      }

五、明细页面布局

该页面用于展示一天的收支的详细情况,首先为标题行,包括返回主页面的按钮以及该页面标题,然后通过List遍历当日所有的收支情况并显示在页面。

具体代码如下:

import detailedInfo from '../viewmodel/detailedInfo'
 
@Entry
@Component
struct Detailed {
 
  //明细
  details: detailedInfo[] = [
    new detailedInfo('购物',$r('app.media.img29'),6.00),
    new detailedInfo('运动',$r('app.media.img28'),10)
  ]
 
  //日期
  date = new Date();
 
  build() {
    Column(){
      //标题栏一行:包含返回按钮以及标题
      Row(){
        Image($r('app.media.back'))
          .width(50)
          .borderRadius(50)
        Text('今日账目明细')
          .fontSize(30)
      }
      .width('100%')
      .margin({bottom: 30})
      //显示日期:通过Date的函数获取日期,以年/月/日的形式展示
      Row(){
        Text(this.date.getFullYear()+'/'+this.date.getMonth()+'/'+this.date.getDate())
          .fontSize(20)
      }
      .width('100%')
      .justifyContent(FlexAlign.Start)
      .padding({left: 10, right: 10})
      .margin({bottom: 10})
      //明细列表
      Row(){
        List(){
          ForEach(
            this.details,
            (item: detailedInfo) => {
              ListItem(){
                Row(){
                  Row(){
                    Image(item.img)
                      .width(50)
                      .borderRadius(50)
                    Text(item.name)
                      .fontSize(25)
                      .margin({left: 10})
                  }
                  Text('¥' + item.amount.toFixed(2))
                    .fontSize(25)
                    .fontColor(Color.Red)
                }
                .width('100%')
                .padding({left: 10, right: 10})
                .margin({top: 10})
                .justifyContent(FlexAlign.SpaceBetween)
              }
            }
          )
        }
      }
      .width('90%')
      .backgroundColor(Color.White)
      .borderRadius(20)
      .shadow({radius: 20,color: Color.Black,offsetX: 0,offsetY: 0})
    }
    .width('100%')
    .height('100%')
    .backgroundColor('#ffbfe8fd')
  }
}