Go-家庭收支记账系统

Itachi

项目开发流程说明

  • 需求分析和设计:在这个阶段,开发人员需要与客户或项目经理进行沟通,了解项目的需求和目标,然后制定相应的设计方案。
  • 代码编写:在这个阶段,开发人员根据需求和设计方案编写代码。在编写代码时,需要遵循一些编码规范和最佳实践,以确保代码的质量和可维护性。
  • 单元测试:在编写代码的同时,开发人员需要编写相应的单元测试代码,以确保代码的正确性和可靠性。
  • 集成测试:在编写完代码和单元测试之后,需要进行集成测试,以确保代码与其他组件的兼容性和正确性。
  • 部署和发布:在完成测试之后,需要将代码部署到生产环境中,并发布给用户使用。在部署和发布之前,需要进行一系列的准备工作,如编译、打包、配置等。
  • 维护和优化:在代码部署和发布之后,需要对代码进行维护和优化,以确保其稳定性和性能。

家庭收支记账系统

需求分析:

  • 模拟实现基于文本页面的《家庭记账软件》
  • 该软件能够记录家庭的收入、支出、并能够打印收支明细表

界面设计:

1685024973987

文件结构:在 myFamilyAccount.go 中编写家庭账目类,然后在 main.go 中引入该包即可

1685025130911

代码实现

先介绍 utils/myFamilyAccount.go 中的代码逻辑

家庭账目 - struct

首先声明一个家庭账目结构体

1
2
3
4
5
6
7
8
9
10
// FamilyAccount 定义家庭账目结构体
type FamilyAccount struct {
Key string // 操作选项
Loop bool // 控制是否退出
Balance float64 // 余额
Money float64 // 金额
Note string // 描述
Details string // 显示字符串拼接
Flag bool // 判断操作行为
}

收支明细 - func

使用 Flag 属性判断是否存在操作行为(收支记录),若有则打印,若没有则提示

1
2
3
4
5
6
7
8
9
// ShowDetails 显示明细
func (f *FamilyAccount) ShowDetails() {
fmt.Println("------当前收支明细记录------")
if f.Flag {
fmt.Println(f.Details)
} else {
fmt.Println("当前没有收支明细,快来存一笔吧~")
}
}

登记收入 - func

逐次录入收入金额、收入说明,并将收入金额计入余额;然后更新收支明细

1
2
3
4
5
6
7
8
9
10
11
12
// InCome 收入
func (f *FamilyAccount) InCome() {
fmt.Print("本次收入金额:")
fmt.Scanln(&f.Money)
f.Balance += f.Money
fmt.Print("本次收入说明:")
fmt.Scanln(&f.Note)
// 更新收支明细
f.Details += fmt.Sprintf("\n 收入\t %v\t\t %v\t\t%v",
f.Balance, f.Money, f.Note)
f.Flag = true // 有收支明细
}

登记支出 - func

首先输入支出金额,这里加入一个判断:若支出金额大于余额,则提示余额不足(这里可以直接退出,或进行其他操作)

若支出金额不大于余额,则登记支出说明、扣除金额、更新收支明细

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// Pay 支出
func (f *FamilyAccount) Pay() {
fmt.Print("本次支出金额:")
fmt.Scanln(&f.Money)
if f.Balance < f.Money {
fmt.Scanln("余额不足!")
//return
}
fmt.Print("本次支出说明:")
fmt.Scanln(&f.Note)
f.Balance -= f.Money
// 更新收支明细
f.Details += fmt.Sprintf("\n 支出\t %v\t\t %v\t\t%v",
f.Balance, f.Money, f.Note)
f.Flag = true // 有操作明细
}

退出系统 - func

退出系统前加入一个再次确认的逻辑判断,如果不输入规定的这两个字符 "Y" / "n" 则无限循环(这里可做优化)

然后对 Loop 属性置 false ,可停止打印菜单

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Exit 退出系统
func (f *FamilyAccount) Exit() {
fmt.Print("即将退出系统?Y/n:")
key := ""
for true {
fmt.Scanln(&key)
if key == "Y" || key == "n" {
break
}
fmt.Print("输入有误,请重新输入:")
}
if key == "Y" {
f.Loop = false
}
}

打印菜单 - func

这里总体为一个 for 循环,内部分为三部分:1.打印菜单;2.设置 key 选项;3.若 Loop 属性为 false 则退出打印

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// Menu 显示界面信息
func (f *FamilyAccount) Menu() {
for true {
// 打印菜单
fmt.Println("\n+-----家庭收支记账系统-----+")
fmt.Println("| 1. 收支明细 |")
fmt.Println("| 2. 登记收入 |")
fmt.Println("| 3. 登记支出 |")
fmt.Println("| 4. 退出系统 |")
fmt.Println("+--------------------------+")
fmt.Println("| 请输入(1~4) |")
fmt.Println("+--------------------------+")

// 接收选项并调用相应方法
fmt.Scanln(&f.Key)
switch f.Key {
case "1":
f.ShowDetails()
case "2":
f.InCome()
case "3":
f.Pay()
case "4":
f.Exit()
default:
fmt.Println("请输入正确选项!")
}

// 退出循环
if !f.Loop { // 在 4. 中赋值
break
}
}
}

工厂模式

这里写一个工厂模式用来实例化对象

1
2
3
4
5
6
7
8
9
10
11
12
// NewFamilyAccount 工厂模式
func NewFamilyAccount() *FamilyAccount {
return &FamilyAccount{
Key: "",
Loop: true,
Balance: 100, // 默认余额为 100
Money: 0,
Note: "",
Details: " 收支\t账户金额\t收支金额\t说明",
Flag: false,
}
}

main

1
2
3
4
5
6
7
8
9
10
package main

import "01-FamilyAccount/utils"

func main() {
// 通过工厂实例化对象
family := utils.NewFamilyAccount()
family.Menu()
}

结果截图

登记收入:1685026800825

登记支出:1685026839396

收支明细:1685026861845

  • 标题: Go-家庭收支记账系统
  • 作者: Itachi
  • 创建于 : 2023-05-25 22:10:18
  • 更新于 : 2023-05-25 23:13:46
  • 链接: https://blog.tarchi.top/go/go-project/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
 评论