zoukankan      html  css  js  c++  java
  • 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中一样有一个字段关联这个用户的账户信息. 个人设计不合理导致项目混乱记录一下

  • 相关阅读:
    jquery实现选项卡(两句即可实现)
    常用特效积累
    jquery学习笔记
    idong常用js总结
    织梦添加幻灯片的方法
    LeetCode "Copy List with Random Pointer"
    LeetCode "Remove Nth Node From End of List"
    LeetCode "Sqrt(x)"
    LeetCode "Construct Binary Tree from Inorder and Postorder Traversal"
    LeetCode "Construct Binary Tree from Preorder and Inorder Traversal"
  • 原文地址:https://www.cnblogs.com/liuzhanghao/p/15343838.html
Copyright © 2011-2022 走看看