Go練習題(4)

在練習題3的基礎上

//一個用戶管理系統
/*需要提供的功能
1.添加用戶
2.刪除用戶
3.修改用戶信息
4.查詢用戶信息
*/

1.創建module
用戶管理放子包中
2.密碼明文,命令行輸入明文
密碼輸入 gopass
代碼的密碼用md5 並在驗證時計算md5值進行比較

使用go mod包管理 目錄結構爲
go mod init users
在這裏插入圖片描述

//main.go
package main

import (
	"fmt"
	"users/lib"
)

func main() {
	var (
		user string
		menu string
		id   int = 0
	)
	userinfo := map[int]map[string]string{}
	if !lib.Auth() {
		fmt.Println("您輸入的密碼錯誤,系統退出")
		return
	}
	for {
		//界面打印
		menu = `====================
歡迎使用用戶管理系統
====================
1.添加用戶
2.查找用戶
3.修改用戶
4.刪除用戶
5.退出程序
====================`
		fmt.Println(menu)
		//用戶選擇
		user = lib.Inputstring("請輸入指令:")
		fmt.Println("====================")
		if user == "1" {
			id++
			lib.Add(id, userinfo)
		} else if user == "2" {
			lib.Sel(userinfo)
		} else if user == "3" {
			lib.Change(userinfo)
		} else if user == "4" {
			lib.Del(userinfo)
		} else if user == "5" {
			break
		} else {
			fmt.Println("輸入有誤請重新輸入")
			continue
		}
	}
}
//add.go
package lib

import "fmt"

//添加用戶
func Add(id int, userinfo map[int]map[string]string) {
	Inputuser(id, userinfo)
	fmt.Println("[+]添加成功")
}
//auth.go
package lib

import (
	"crypto/md5"
	"fmt"

	"github.com/howeyc/gopass"
)

//定義密碼輸入次數

//使用系統前輸入密碼 超過3次則退出系統
func Auth() bool {
	const maxauth int = 3
	//密碼123 這裏用md5加密過後 庫即使被別人使用也無法判斷與原文的關係
	password := "202cb962ac59075b964b07152d234b70"
	for i := 1; i <= maxauth; i++ {
		// user := Inputstring("請輸入密碼:")
		fmt.Printf("請輸入密碼:")
		bytes, _ := gopass.GetPasswd()
		//這裏對輸入的密碼進行md5加密並且與常量比較
		//%x是小寫十六進制表示 Sprintf格式化返回一個字符串
		if fmt.Sprintf("%x", md5.Sum(bytes)) == password {
			return true
		} else {
			fmt.Printf("輸入錯誤請重新輸入,您還有%d次機會\n", maxauth-i)
		}
	}
	return false
}
//change.go
//修改用戶
package lib

import (
	"fmt"
	"strconv"
	"strings"
)

func Change(userinfo map[int]map[string]string) {
	if id, err := strconv.Atoi(Inputstring("請輸入修改的用戶id:")); err == nil {
		fmt.Println(strings.Repeat("-", 20))
		if user, ok := userinfo[id]; ok {
			fmt.Printf("name:%s\nbirthday:%s\ntel:%s\n", user["name"], user["birthday"], user["tel"])
			fmt.Println(strings.Repeat("-", 20))
			affirm := Inputstring("確認是否修改(Y/N):")
			if affirm == "Y" || affirm == "y" {
				Inputuser(id, userinfo)
			}
		} else {
			fmt.Println("用戶id不存在")
		}
	} else {
		fmt.Println("輸入錯誤")
	}
}
//del.go
//刪除用戶
package lib

import (
	"fmt"
	"strconv"
	"strings"
)

func Del(userinfo map[int]map[string]string) {
	if id, err := strconv.Atoi(Inputstring("請輸入刪除的用戶id:")); err == nil {
		fmt.Println(strings.Repeat("-", 20))
		if user, ok := userinfo[id]; ok {
			fmt.Printf("name:%s\nbirthday:%s\ntel:%s\n", user["name"], user["birthday"], user["tel"])
			fmt.Println(strings.Repeat("-", 20))
			affirm := Inputstring("確認是否刪除(Y/N):")
			if affirm == "Y" || affirm == "y" {
				delete(userinfo, id)
				fmt.Println("[-]刪除成功")
			}
		} else {
			fmt.Println("用戶id不存在")
		}
	} else {
		fmt.Println("輸入錯誤")
	}
}
//imput.go
package lib

import "fmt"

//因爲需要用戶輸入的比較多定義一個input函數
func Inputstring(input string) string {
	var userinput string
	fmt.Printf(input)
	fmt.Scan(&userinput)
	return userinput
}

func Inputuser(id int, userinfo map[int]map[string]string) {
	var (
		name     string
		birthday string
		tel      string
	)
	name = Inputstring("請輸入名字:")
	birthday = Inputstring("請輸入生日:")
	tel = Inputstring("請輸入聯繫方式:")
	userinfo[id] = map[string]string{
		"name":     name,
		"birthday": birthday,
		"tel":      tel,
	}
}
//sel.go
//查詢用戶
package lib

import (
	"fmt"
	"strings"
)

func Sel(userinfo map[int]map[string]string) {
	user := Inputstring("請輸入要查詢的信息:")
	fmt.Println(strings.Repeat("-", 20))
	for _, v := range userinfo {
		if strings.Contains(v["name"], user) || strings.Contains(v["birthday"], user) || strings.Contains(v["tel"], user) {
			fmt.Printf("name:%s\nbirthday:%s\ntel:%s\n", v["name"], v["birthday"], v["tel"])
			fmt.Println(strings.Repeat("-", 20))
		}
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章