在練習題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))
}
}
}