在练习题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))
}
}
}