192. go 简单项目 1-家庭收支记账软件项目

项目目录结构

familyaccount/main/main.go

package main

import (
	utils "day01/familyaccount/utils"
	"fmt"
)

func main() {
	var name, pwd string
	fmt.Println("请输入要注册的用户名和密码, 用空格隔开")
	fmt.Scanf("%s %s
", &name, &pwd)
	a := utils.NewFamilyAccount(name, pwd)
	a.Menu()
}

familyaccount/utils/main.go

package untils

import (
	"fmt"
)

type Account struct {
	Title   string
	Income  float32
	Desc    string
	Balance float32
}

type AccountRecord struct { // 这个结构体名称应该和上面换下, 但是应经写了这么多了不想换了
	Name        string
	Pwd         string
	TotalAmount float32
	Records     []Account
	Loop        bool
	Key         string
}

func NewFamilyAccount(name, pwd string) (act *AccountRecord) {
	for {
		if len(pwd) < 6 {
			fmt.Println("密码不能小于6位")
			continue
		}
		act = &AccountRecord{
			Name:        name,
			Pwd:         pwd,
			TotalAmount: 0,
			Records:     []Account{},
			Loop:        true,
		}

		if UserMgr == nil {
			UserMgr = &UserManager{
				Users: []*AccountRecord{},
			}
		}
		UserMgr.Users = append(UserMgr.Users, act)
		return
	}
}

func (this *AccountRecord) Income() {
	defer func() {
		// 将异常处理掉, 不要让程序崩溃
		err := recover()
		if err != nil {
			fmt.Println("err=", err)
		}
	}()
	fmt.Println("请输入收入金额, 以及说明, 以空格隔开")
	var title string = "收入"
	var income float32
	var desc string
	_, err := fmt.Scanf("%f %s
", &income, &desc)
	if err != nil {
		panic(err)
	}
	if income < 0 {
		panic("你在开玩笑么")
	}
	this.TotalAmount += income
	account := Account{
		Title:   title,
		Balance: this.TotalAmount,
		Income:  income,
		Desc:    desc,
	}
	this.Records = append(this.Records, account)
	// 收入完之后打印
	this.Detail()
}

// Expenses 支出
func (this *AccountRecord) Expenses() {
	defer func() {
		// 将异常处理掉, 不要让程序崩溃
		err := recover()
		if err != nil {
			fmt.Println("err=", err)
		}
	}()
	fmt.Println("请输入支出金额以及说明,以空格隔开")
	var title string = "支出"
	var income float32
	var desc string

	_, err := fmt.Scanf("%f %s
", &income, &desc)
	if err != nil {
		panic(err)
	}
	if income < 0 {
		panic("你在开玩笑么")
	}
	if this.TotalAmount < income {
		panic(fmt.Sprintf("你想贷款么穷逼看看你的余额:%.2f", this.TotalAmount))

	}
	this.TotalAmount -= income
	account := Account{
		Title:   title,
		Balance: this.TotalAmount,
		Income:  income,
		Desc:    desc,
	}
	this.Records = append(this.Records, account)
	// 收入完之后打印
	this.Detail()
}

// Detail 详情
func (this *AccountRecord) Detail() {
	defer func() {
		// 将异常处理掉, 不要让程序崩溃
		err := recover()
		if err != nil {
			fmt.Println("err=", err)
		}
	}()
	fmt.Println("--------------------------当前收支明细几率--------------------------")
	fmt.Println("收支		 账户金额		 收支金额		 说 明	")
	for _, val := range this.Records {
		fmt.Printf("%v		 %v			 %v			 %v	
", val.Title, val.Balance, val.Income, val.Desc)
	}
	fmt.Println()
}

func (this *AccountRecord) Exit() {
	fmt.Println("你确定要退出么? y/n")
	choice := ""
	for {
		fmt.Scanln(&choice)
		if choice == "y" || choice == "n" {
			break
		}
		fmt.Println("输入错误,请重新输入 y/n")
	}
	if choice == "y" {
		fmt.Println("退出程序")
		this.Loop = false
	}
}

func (this *AccountRecord) CheckUser() (isLogin bool) {
	count := 3
	var name, pwd string
	isLogin = false
	for {
		fmt.Printf("请输入用户名以及密码使用空格隔开,你还有%d次机会
", count)
		_, err := fmt.Scanf("%s %s
", &name, &pwd)
		if err != nil {
			// fmt.Println("程序出错, 请不要着急, 联系工作人员")
			continue
		}
		if name == this.Name && this.Pwd == pwd {
			isLogin = true
			break
		} else {
			fmt.Println("输入错误, 请重新输入")
		}
		count -= 1
		if count <= 0 {
			fmt.Println("今日输入次数已耗尽, 请联系工作人员解锁")
			break
		}
	}
	return
}

func (this *AccountRecord) Menu() {
	key := this.Key
	// 如果用户名密码不匹配,直接退出程序
	isLogin := this.CheckUser()
	for isLogin {
		fmt.Println("--------------------家庭收支记账软件---------------------")
		fmt.Println("--------------------1. 收支明细---------------------")
		fmt.Println("--------------------2. 等级收入---------------------")
		fmt.Println("--------------------3. 等级支出---------------------")
		fmt.Println("--------------------4. 显示当前系统注册的用户---------------------")
		fmt.Println("--------------------5. 退出---------------------")
		fmt.Println("--------------------请选择(1-4): 1---------------------")
		fmt.Scanln(&key)
		if len(key) == 0 {
			key = "1"
		}
		switch key {
		case "1":
			fmt.Println("打印收支明细")
			this.Detail()
		case "2":
			this.Income()
		case "3":
			this.Expenses()
		case "4":
			UserMgr.ShowUser()
		case "5":
			this.Exit()
		default:
			fmt.Println("输入错误,请重新输入")
		}
		if !this.Loop {
			break
		}
		key = ""
	}
}

familyaccount/utils/userMgr.go

package main

import (
	utils "day01/familyaccount/utils"
	"fmt"
)

func main() {
	var name, pwd string
	fmt.Println("请输入要注册的用户名和密码, 用空格隔开")
	fmt.Scanf("%s %s
", &name, &pwd)
	a := utils.NewFamilyAccount(name, pwd)
	a.Menu()
}

总结:
整体来说, 项目接口让我弄得比较混乱, 其中应该设计一个User struct存放用户数据, UserManager struct 存放注册了哪些用户;
不应该将用户信息和AccountRecord放在一起, 通过AccountRecord和Account名称应该对调, User struct中一样有一个字段关联这个用户的账户信息. 个人设计不合理导致项目混乱记录一下

原文地址:https://www.cnblogs.com/liuzhanghao/p/15343838.html