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

  • 相关阅读:
    EJB
    Token
    FreeMarker
    solr
    maven学习四:maven集成jetty插件发布web项目 标签: maven
    代码生成器
    springIOplatform
    数据连接池
    freeMark模板引擎
    张萌作品集
  • 原文地址:https://www.cnblogs.com/liuzhanghao/p/15343838.html
Copyright © 2011-2022 走看看