<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 项目:家庭收支记账软件/
作者
Melody
发布于
2022年6月20日
许可协议