<Go>6 项目:家庭收支记账软件
本文最后更新于:2023年6月27日 上午
6 项目:家庭收支记账软件
项目1:家庭收支记账软件
#需求分析
实现基于文本界面的家庭收支记账软件
该软件能记录家庭收入、支出,并能打印收支明细表
#项目设计
graph TD
A(登录菜单)-->Aa{密码}.->A
Aa--正确-->B(管理菜单)
B-->B1[1 查看账本]
B-->B2[2 添加条目]
B-->B3[3 删除条目]
B-->B4[4 恢复条目]
B-->B9[9 登出]-->A
B1-->B11[全部]
B2-->B21[进账]
B2-->B22[出账]
附录
家庭收支记账软件
main
package main
import (
menu "go_code/family_balance/menu"
)
func main() {
menu.Menu0()
}
data
package data
import (
"strconv"
)
type Ele struct {
Year int
Month int
Date int
Item string
Amount int
Abandon bool
}
func (e *Ele) String() string {
res := strconv.Itoa(e.Year) + "." + strconv.Itoa(e.Month) + "." + strconv.Itoa(e.Date)
for len(res) < 10 {
res += " "
}
res += "\t" + strconv.Itoa(e.Amount)
res += "\t" + e.Item
return res
}
menu
package menu
import (
"errors"
"fmt"
data "go_code/family_balance/data"
)
var (
skipMenu bool
pw string
datas []data.Ele
dateL int
)
func init() {
skipMenu = false
pw = "000000"
datas = make([]data.Ele, 0)
dateL = 0
}
func Menu0() {
for {
fmt.Println(`—————————————家庭收支记账软件—————————————`)
fmt.Println("\t\t1 登 录")
fmt.Println("\t\t9 退 出")
fmt.Print("请选择:")
i := 0
if _, e := fmt.Scan(&i); e != nil {
fmt.Println("输入有误")
continue
}
switch i {
case 1:
if login() {
menu()
} else {
fmt.Println("密码错误")
}
case 9:
return
default:
fmt.Println(`输入错误`)
}
fmt.Println("\n——————————————————————————")
}
}
func login() bool {
fmt.Println(`——————————————登 录——————————————`)
fmt.Print(`请输入密码:`)
word := ""
fmt.Scan(&word)
return word == pw
}
func showMenu() {
if skipMenu {
skipMenu = false
return
}
fmt.Println(`—————————————欢迎回来—————————————`)
fmt.Println("\t\t1 查看账本")
fmt.Println("\t\t2 添加条目")
fmt.Println("\t\t3 删除条目")
fmt.Println("\t\t9 退出")
}
func menu() {
n := 0
for {
showMenu()
fmt.Print("请选择:")
fmt.Scan(&n)
switch n {
case 1:
fmt.Println("==============查看账目==============")
fmt.Println("\n余额:", showAll())
case 2:
fmt.Println("==============添加条目==============")
add()
case 3:
fmt.Println("==============删除条目==============")
del()
case 4:
update()
case 9:
return
default:
}
}
}
func showAll() int {
if dateL <= 0 {
fmt.Println("当前没有账目")
return 0
}
count := 0
fmt.Println("序号", "\t日期 \t数额\t项目")
for i, v := range datas {
if v.Abandon {
continue
}
count += v.Amount
fmt.Println(i, "\t"+v.String())
}
return count
}
func add() {
w := " "
b := false
e := data.Ele{Abandon: false}
defer func() {
if recover() != nil {
fmt.Println("输入有误")
}
}()
fmt.Println(`支出(I)/收入(O):`)
fmt.Scan(&w)
if w == "i" || w == "I" {
b = true
} else if w == "O" || w == "o" {
b = false
} else {
panic(errors.New(""))
}
fmt.Print("\n输入日期(yyyy mm dd):")
fmt.Scan(&e.Year, &e.Month, &e.Date)
if b {
e.Item = "收入"
} else {
fmt.Print("\n输入用途:")
fmt.Scan(&e.Item)
}
fmt.Print("\n输入数额:")
fmt.Scan(&e.Amount)
if !b {
e.Amount = -e.Amount
}
datas = append(datas, e)
fmt.Println("\n添加成功!")
dateL++
fmt.Print("继续吗?(Y/N):")
fmt.Scan(&w)
if w == "y" || w == "Y" {
add()
}
}
func del() {
index := -1
defer func() {
if recover() != nil {
fmt.Println("输入有误")
}
}()
showAll()
fmt.Print("请输入要删除的条目序号:")
fmt.Scan(&index)
if !datas[index].Abandon {
dateL--
datas[index].Abandon = true
fmt.Println("成功")
} else {
panic(errors.New(""))
}
}
func update() {
index := -1
defer func() {
if recover() != nil {
fmt.Println("输入有误")
}
}()
showAll()
fmt.Print("请输入要更新的条目序号:")
fmt.Scan(&index)
if datas[index].Abandon {
datas[index].Abandon = false
fmt.Println("该条目已恢复")
dateL++
return
}
}
<Go>6 项目:家庭收支记账软件
https://i-melody.github.io/2022/06/20/Go/6 项目:家庭收支记账软件/