Go练习题(5)

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


}
发布了112 篇原创文章 · 获赞 12 · 访问量 6681

猜你喜欢

转载自blog.csdn.net/weixin_45413603/article/details/104923867