目录
- 
- 第一节项目讲解
 - 第二节:项目创建+登录静态框架编写
 - 第三节:登录页静态表单编写
 - 第四节---内容页架构分析+底部栏组件
 - 第五节---底部栏组件切换
 - 第六节:首页静态页编写
 - 第七节:钱包+银行卡静态页
 - 第八节:个人中心静态页编写
 - 第九节:编辑资料+二维码生成
 - 第十节:支付页静态编写
 - 第十一节:邮箱认证服务开通流程
 - 第十二节:发送验证码+校验
 - 第十三节:云函数+云数据库基本使用
 - 第十四节:注册功能实现
 - 第十五节:登录+自动登录功能实现
 - 第十六节:添加银行卡功能实现
 - 第十七节:银行卡内容获取
 - 第十八节:个人数据获取
 - 第十九节:修改个人资料
 - 第二十节:流程梳理+支付事务编写
 - 主要流程
 - 第二十一节:支付功能走通
 - 第二十二节:交易信息查询
 - 第二十三节:上传头像
 - 第二十四节:Server端汇总数据实现
 - 第二十五节:WebView传值原理
 - 第二十六节:webView页面编写
 - 二十八七:分页功能
 
 
项目地址
https://gitee.com/cheng_yong_xu/managemoney
第一节项目讲解
项目介绍
这款专为个人财务管理而设计的强大应用。通过智能化的技术和用户友好的界面,我们致力于帮助您轻松管理
财务、掌握支出和收入,从而更好地规划您的财务未来。课程中内容包括页面搭建以及服务端编写。服务端完
全使用鸿蒙提供的serverless也就是端云-体化的能力。课程中这款应用部分页面采用webView ,可以详细了
解鸿蒙中使用webView相关注意点。

设计稿

第二节:项目创建+登录静态框架编写
登录页面设稿

新建项目






控制台添加项目









需要安装模拟器

根据设计搞写页面

Login页面
先写个Login页面,修改程序入口


删除一些初始化的文件,并引入一些资源(图片图标)
封装标题组件
            
            
              javascript
              
              
            
          
          // src/main/ets/components/TitleComponent.ets
@Component
export default struct TitleComponent {
  @Prop title: string
  isBack = false
  build() {
    Flex({ justifyContent: FlexAlign.SpaceBetween, alignItems: ItemAlign.Center }) {
      Image(this.isBack ? $r('app.media.Button_left') : "")
        .width(44)
        .height(44)
        .objectFit(ImageFit.ScaleDown)
      Text(this.title)
        .fontColor('rgb(1,23,73)')
        .fontWeight(700)
        .fontSize(20)
      Text('')
        .width(44)
        .height(44)
    }
    .padding({left:20, right: 20, top: 12, bottom: 12 })
  }
}
        Login
            
            
              javascript
              
              
            
          
          // src/main/ets/pages/Login.ets
import TitleComponent from '../components//TitleComponent'
@Entry
@Component
struct Login {
  @State message: string = '你好'
  build() {
    Flex({wrap: FlexWrap.Wrap, justifyContent: FlexAlign.Center}){
      // 标题
      TitleComponent({ title: '登录' })
      // 表单内容
      Column(){
        // 钱币Logo浮在上面层叠布局
        Stack(){
          Image($r('app.media.Login_icon'))
            .width(88)
            .height(88)
            .offset({ y: -44 })  // 向上偏移
        }
      }
      .width('90%')
      .height('100%')
      .borderRadius(20)
      .backgroundColor(Color.White)
      .margin({top:44})
      .padding({left:14, right:14})
    }
    .width('100%')
    .height('100%')
    .backgroundColor($r('app.color.base_background'))
  }
}
        效果

第三节:登录页静态表单编写
详细修改查看git分支 03 【第三节:登录页静态表单编写】
- 创建Input组件
 - 在Login页面中使用
 
效果

第四节---内容页架构分析+底部栏组件
详细修改查看git分支 04 【第四节---内容页架构分析+底部栏组件】

效果

第五节---底部栏组件切换
详细修改查看git分支 05 【第五节---底部栏组件切换】
效果

第六节:首页静态页编写
详细修改查看git分支 06 【第六节:首页静态页编写】
效果

第七节:钱包+银行卡静态页
详细修改查看git分支 07 【第七节:钱包+银行卡静态页】
钱包页面设计稿

银行卡静态页计稿

效果


第八节:个人中心静态页编写
详细修改查看git分支 08 【第八节:个人中心静态页编写】
设计稿

效果

第九节:编辑资料+二维码生成
详细修改查看git分支 09 【第九节:编辑资料+二维码生成】
效果


第十节:支付页静态编写
详细修改查看git分支 10【第十节:支付页静态编写】
设计稿

效果

第十一节:邮箱认证服务开通流程
按照官网流程走

官网指南里有文档

选择一个认证服务

下载文件agconnect- services.json

添加应用配置文件

配置SDK依赖


第十二节:发送验证码+校验
12 发送验证码+校验


验证登录




错误信息显示用户已经注册过了



新增存储区


第十三节:云函数+云数据库基本使用
查看云函数

在本地创建云函数



本地调试


查看云函数

可以看到日志







调试

可以看到data是个空数组
我们开始在数据库里添加数据

再次查询


第十四节:注册功能实现
分支 14 【第十四节:注册功能实现】
目前还没有了解怎么配置忽略文件导致git提交的变化太多,主要是一些包可以忽略
变化的是这4个文件

使用邮箱注册,注册成功会看到新增用户
注意你如果只有一个邮箱账号测试,现在认证服务,用户里把邮箱删了再运行注册代码

第十五节:登录+自动登录功能实现
分支15 第十五节:登录+自动登录功能实现
            
            
              javascript
              
              
            
          
          /**
   * 登录
   */
  async doLogin() {
    // 使用APPGallery connect 进行用户身份登录
    // 多使用try catch app开发程序崩溃直接闪退,使用try catch及时发现原因
    try {
      // 使用邮箱密码登录
      const credential = EmailAuthProvider.credentialWithPassword(this.email, this.password)
      // 执行登录
      const user = await agconnect.auth().signIn(credential)
      // 如果用户已经登录那么可以你直接进入app
      if (user) {
        this.goMain()
      }
    }catch(err){
      console.error(err, '登录失败')
    }
  }
  goMain () {
    try {
      router.replaceUrl({url: 'pages/MainPage/MainPage'})
    } catch (err) {
      console.log(err, '错误')
    }
  }
  /**
   * 判断当前用户是否登录
   * @returns
   */
  async checkIfLogin () {
    const user = await agconnect.auth().getCurrentUser()
    return user !== null
  }
  async onPageShow() {
    try {
      const ifLogin = await this.checkIfLogin()
      if (ifLogin) {
        // 已经登录
        this.goMain()
      }
    } catch (err) {
      console.log(err, '未登录')
    }
  }
        第十六节:添加银行卡功能实现
新建表

字段

注意: 这里amount 的类型,我设置错了,导致后面加减计算出现问题
创建云函数并添加配置文件,下载对应的包

上传云函数

端侧使用云函数
控制台查看数据

第十七节:银行卡内容获取
分支 17 第十七节:银行卡内容获取
云侧:编写查询数据库的代码
端侧:获取云测给的数据,渲染到页面
注意:云侧代码写完后接的上传云函数
效果

第十八节:个人数据获取
分支 18 第十八节:个人数据获取
云侧:编写查询数据库的代码
端侧:获取云测给的数据,渲染到页面
注意:云侧代码写完后接的上传云函数

第十九节:修改个人资料
分支19 第十九节:修改个人资料
第二十节:流程梳理+支付事务编写
主要流程
- 现在有两个用户分别称为用户A和用户B
 - 用户A和用户B都通过邮箱注册账号
 - 注册完后都可以去个人页面进行名称修改
 - 去钱包页面通过添加按钮进行银行卡的添加
 - 用户A和用户B都添加完银行卡后,去往用户A的个人页面
 - 打开A的二维码,进行扫码获取到用户的uid
 - 切换到B,在用户B主页-转账 把跳转参数修改为用户A的uid
 - 点击转账此时会显示支付弹框
 - 支付弹框内会显示A的姓名、邮箱、银行卡信息
 - 点击支付支付完成后回到主页
 - 此时、用户B的卡片余额会减少,切换到 数据页面 可以看到 最近联系人 支付记录 收入支出汇总
 - 切换到用户A 切换到 数据页面 可以看到 最近联系人 支付记录 收入支出汇总
 
添加支付记录表


第二十一节:支付功能走通
分支21 第二十一节:支付功能走通
如果你要本地调试请使用
            
            
              javascript
              
              
            
          
            const {payload, action} = event.body
        /**
- 本地调试不需要序列化
 - 远程需要序列化
*/
// const {payload, action} = JSON.parse(event.body)
const {payload, action} = event.body

 
注意: 只要修改云函数,必须上传云函数
如果使用
            
            
              javascript
              
              
            
          
          const {payload, action} = JSON.parse(event.body)
        在本地调试,会报错

第二十二节:交易信息查询
分支22 第二十二节:交易信息查询
查询两个用户的信息,分页,排序

第二十三节:上传头像
分支 23 第二十三节:上传头像
需要从文件里读取图片,转成base64

第二十四节:Server端汇总数据实现
分支 24 二十四节:Server端汇总数据实现

第二十五节:WebView传值原理
分支 25 第二十五节:WebView传值原理、页面编写
- 
在WebView里无法操作外部数据,所以我们需要将外部数据传给WebView所在的页面,再从页面传给WebView
 - 
使用vue,js不能用cdn,所以在项目中直接放的vue,js源码
 - 
我们不可以使用浏览器调试,所以调试的时候需要监听onConsole,才能在日志打印调试信息
 
第二十六节:webView页面编写
分支 25 第二十五节:WebView传值原理、页面编写
和我们正常的写前端页面是一样的
有个bug
由于在数据库设置字段的时候,amount设置成String类型
导致操作数据库,拿到amount进行加减的时候出现了字符加减的情况,
试图将amount设置成integer,但是在获取数据的时候拿不到amount,拿到的是null,不知道是为什么


二十八七:分页功能
分支 26 二十八七:分页功能
监听列表下拉刷新