针对练习题4做出一些功能添加
1.用户管理
用户修改为struct,并且针对属性使用不同数据类型
ID int
Name string
birthday time.time
tel string
addr string
desc string
注意进行类型转换
2.添加修改数据的时候对用户名进行检验,用户名不能为空,且用户名必须唯一
a.添加用户
b.在添加用户 不能添加(用户名已存在)
c.修改一个用户名 => (用户名已存在)
d.用户名修改还是之前的 (修改成功)
3.在查询的时候,让用户输入排序属性,按照属性值从小到大排序显示
目录结构
//main.go
package main
import (
"fmt"
"github.com/strive-after/users/lib"
)
func main() {
var (
user string
menu string
id int = 0
)
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, lib.UserInfo)
} else if user == "2" {
lib.Sel(lib.UserInfo)
} else if user == "3" {
lib.Change(lib.UserInfo)
} else if user == "4" {
lib.Del(lib.UserInfo)
} else if user == "5" {
break
} else {
fmt.Println("输入有误请重新输入")
continue
}
}
}
//add.go
package lib
import "fmt"
//添加用户
func Add(id int,UserInfo map[int]User) {
Inputuser(id,UserInfo)
fmt.Println("[+]添加成功")
}
//auth.go
package lib
import (
"crypto/md5"
"fmt"
"time"
"github.com/howeyc/gopass"
)
//定义密码输入次数
//定义用户结构体
type User struct {
ID int
Name string
Birthday time.Time
Tel string
Addr string
Desc string
}
var UserInfo map[int]User = map[int]User{}
//使用系统前输入密码 超过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]User) {
if id, err := strconv.Atoi(Inputstring("请输入修改的用户id:")); err == nil {
fmt.Println(strings.Repeat("-", 20))
if user, ok := UserInfo[id]; ok {
fmt.Printf("ID:%d\nname:%s\nbirthday:%v\ntel:%s\naddr:%s\ndesc:%s\n",user.ID, user.Name,user.Birthday.Format("2006-1-2"),user.Tel,user.Addr,user.Desc)
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]User) {
if id, err := strconv.Atoi(Inputstring("请输入删除的用户id:")); err == nil {
fmt.Println(strings.Repeat("-", 20))
if user, ok := UserInfo[id]; ok {
fmt.Printf("ID:%d\nname:%s\nbirthday:%v\ntel:%s\naddr:%s\ndesc:%s\n",user.ID ,user.Name,user.Birthday.Format("2006-1-2"),user.Tel,user.Addr,user.Desc)
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("输入错误")
}
}
//input.go
package lib
import (
"fmt"
"strings"
"time"
)
//因为需要用户输入的比较多定义一个input函数
func Inputstring(input string) string {
var userinput string
fmt.Printf(input)
fmt.Scan(&userinput)
return userinput
}
func Inputuser(id int, UserInfo map[int]User) {
var (
Name string
Bir string
Tel string
Addr string
Desc string
)
START:
Name = Inputstring("请输入名字:")
Bir = Inputstring("请输入生日(如2006-1-2):")
Tel = Inputstring("请输入联系方式:")
Addr = Inputstring("请输入住址:")
Desc = Inputstring("请输入备注:")
if bir, err := time.Parse("2006-1-2",Bir);err == nil {
for k,v := range UserInfo {
if k == id {
break
}else if v.Name == Name {
fmt.Println("用户已存在,请重新输入")
fmt.Println(strings.Repeat("-", 20))
goto START
}
}
UserInfo[id] = User{
ID: id,
Name: Name,
Birthday:bir,
Tel: Tel,
Addr: Addr,
Desc: Desc,
}
}else {
fmt.Println("格式有误,请重新输入")
goto START
}
}
//查询用户
//sel.go
package lib
import (
"fmt"
"sort"
"strings"
)
func Sel(UserInfo map[int]User) {
user := Inputstring("请输入要查询的信息:")
list := make([]User,0)
fmt.Println(strings.Repeat("-", 20))
for _, v := range UserInfo {
if strings.Contains(v.Name, user) || strings.Contains(v.Desc, user) || strings.Contains(v.Addr, user) || strings.Contains(v.Tel, user) || strings.Contains(v.Birthday.Format("2006-01-02"), user) {
list = append(list,v)
}
}
users := Inputstring("请输入要排序的属性(ID,Name,Desc,Addr,Tel,Birthday):")
sort.Slice(list, func(i, j int) bool {
switch users {
case "ID":
return list[i].ID < list[j].ID
case "Name":
return list[i].Name < list[j].Name
case "Desc":
return list[i].Desc < list[j].Desc
case "Addr":
return list[i].Addr < list[j].Addr
case "Tel":
return list[i].Tel < list[j].Tel
case "Birthday":
return list[i].Birthday.Format("2006-1-2") < list[j].Birthday.Format("2006-1-2")
default:
return list[i].ID < list[j].ID
}
})
for _,v := range list {
fmt.Printf("ID:%d\nname:%s\nbirthday:%v\ntel:%s\naddr:%s\ndesc:%s\n", v.ID,v.Name,v.Birthday.Format("2006-1-2"),v.Tel,v.Addr,v.Desc)
fmt.Println(strings.Repeat("-", 20))
}
}