GO语言——IO项目

2023-04-16 15:04:38 浏览数 (2)

1. util包

file.go

代码语言:javascript复制
// CreatFile
// @Title CreatFile
// @Description 创建文件
// @Param	name	string	"文件名"
// @Return *os.File "文件对象"
func CreatFile(name string) *os.File {
	file, err := os.Create(name)
	if err != nil {
		log.Fatalln(err)
	}
	return file
}

// ReadFile
// @Title ReadFile
// @Description 读取文件信息
// @Param	name	string	"文件名"
// @Return []string "结果切片"
func ReadFile(name string) []string {
	file, err := os.OpenFile(name, os.O_CREATE|os.O_RDONLY, 0666)
	defer func(file *os.File) {
		err := file.Close()
		if err != nil {
			log.Fatalln(err)
		}
	}(file)
	if err != nil {
		log.Fatalln(err)
	}
	reader := bufio.NewReader(file)
	result := make([]string,0)
	for {
		lineString, err := reader.ReadString('n')
		if err == io.EOF {
			break
		}
		lineString = strings.Trim(lineString,"n")
		result = append(result,lineString)
	}

	return result
}

// WriteFile
// @Title WriteFile
// @Description 写入文件
// @Param	name	string	"文件名"
// @Param	strS	[]string	"欲写入信息"
// @Return []string "结果切片"
func WriteFile(name string,strS []string) bool {
	file, err := os.OpenFile(name, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666)
	if err != nil {
		log.Fatalln(err)
	}
	defer func(file *os.File) {
		err := file.Close()
		if err != nil {
			log.Fatalln(err)
		}
	}(file)
	writer := bufio.NewWriter(file)
	for _, str := range strS {
		_, err := writer.WriteString(str "n")//将数据先写入缓存
		if err != nil {
			log.Fatalln(err)
		}
	}
	err = writer.Flush() //将缓存中的内容写入文件
	if err != nil {
		log.Fatalln(err)
	}
	return true
}

// AppendWriteFile
// 追加一条信息
func AppendWriteFile(name string,str string) bool {
	file, err := os.OpenFile(name, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0666)
	if err != nil {
		log.Fatalln(err)
	}
	defer func(file *os.File) {
		err := file.Close()
		if err != nil {
			log.Fatalln(err)
		}
	}(file)
	writer := bufio.NewWriter(file)
	_, err = writer.WriteString(str "n")
	if err != nil {
		log.Fatalln(err)
	}
	err = writer.Flush() //将缓存中的内容写入文件
	if err != nil {
		log.Fatalln(err)
	}
	return true
}

2. model包

代码语言:javascript复制
// User 用户
type User struct {
	UserNo   string // 编号(用户名)-学号|工号
	UserName string // 姓名
	Password string // 密码
	Level    int    // 权限 0-管理员|1-教师|2-学生
}

// IsStructureEmpty
// 通过反射判断结构体是否为空
func (x User) IsStructureEmpty() bool {
	return reflect.DeepEqual(x, User{})
}

3. dao包

user_dao.go

代码语言:javascript复制
// SelectUserByUserNo
// @Title SelectUserByUserNo
// @Description 通过学号|工号查询用户(0,1,2)
// @Param	UserNo	string	"学号|工号"
// @Return model.User "查询到结果"
func SelectUserByUserNo(UserNo string) model.User {
	contain := util.ReadFile("./user.txt")
	var user model.User
	var strS []string
	for _, u := range contain {
		strS = strings.Split(u, " ")
		if strS[0] == UserNo {
			strS := strings.Split(u, " ")
			user.UserNo = strS[0]
			user.UserName = strS[1]
			user.Password = strS[2]
			user.Level, _ = strconv.Atoi(strings.Trim(strS[3], "r"))
			return user
		}
	}
	return user
}

// SelectAllUser
// @Title SelectAllUser
// @Description 查询所有用户(0)
// @Return []model.User   "查询到结果切片"
func SelectAllUser() []model.User {
	contain := util.ReadFile("./user.txt")
	users := make([]model.User, 0)
	var user model.User
	for _, u := range contain {
		strS := strings.Split(u, " ")
		user.UserNo = strS[0]
		user.UserName = strS[1]
		user.Password = strS[2]
		user.Level, _ = strconv.Atoi(strings.Trim(strS[3], "r"))
		users = append(users, user)
	}
	return users
}

// InsertUser
// @Title InsertUser
// @Description 添加用户(0)
// @Param	user	model.User	"用户信息"
// @Return bool "插入成功与否"
func InsertUser(user model.User) bool {
	s := user.UserNo   " "   user.UserName   " "   user.Password   " "   strconv.Itoa(user.Level)
	return util.AppendWriteFile("./user.txt", s)
}

// DeleteUserByUserNo
// @Title DeleteUserByUserNo
// @Description 删除用户(0)
// @Param	UserNo	string	"学号|工号"
// @Return bool "删除成功与否"
func DeleteUserByUserNo(UserNo string) bool {
	users := SelectAllUser()
	strS := make([]string, 0)
	for _, user := range users {
		if user.UserNo == UserNo {
			continue
		}
		s := user.UserNo   " "   user.UserName   " "   user.Password   " "   strconv.Itoa(user.Level)
		strS = append(strS, s)
	}
	return util.WriteFile("./user.txt", strS)
}

// UpdateUserByUserNO
// @Title UpdateUserByUserNO
// @Description 修改用户信息(0,1,2)
// @Param	user	model.User	"用户信息"
// @Return bool "修改成功与否"
func UpdateUserByUserNO(user model.User) bool {
	users := SelectAllUser()
	strS := make([]string, 0)
	for _, user01 := range users {
		if user01.UserNo == user.UserNo {
			user01 = user
		}
		s := user01.UserNo   " "   user01.UserName   " "   user01.Password   " "   strconv.Itoa(user01.Level)
		strS = append(strS, s)
	}
	return util.WriteFile("./user.txt", strS)
}

4. service包

user_service.go

代码语言:javascript复制
func SelectUserByUserNo(userNo string) model.User {
	return dao.SelectUserByUserNo(userNo)
}
func SelectAllUser() []model.User {
	return dao.SelectAllUser()
}
func InsertUser(user model.User) bool {
	if !SelectUserByUserNo(user.UserNo).IsStructureEmpty() {
		return false
	} else {
		return dao.InsertUser(user)
	}
}
func DeleteUserByUserNo(userNo string) bool {
	if SelectUserByUserNo(userNo).IsStructureEmpty() {
		return false
	} else {
		return dao.DeleteUserByUserNo(userNo)
	}
}
func UpdateUserByUserNo(user model.User) bool {
	return dao.UpdateUserByUserNO(user)
}

5. controller包

user_controller.go

代码语言:javascript复制
// SelectUserByNo
// @Title SelectUserByNo
// @Description 查询用户信息(0)
func SelectUserByNo() {
	var StuNo string
	fmt.Print("请输入学号|工号:")
	_, err := fmt.Scan(&StuNo)
	if err != nil {
		log.Fatalln(err)
	}
	user := service.SelectUserByUserNo(StuNo)
	fmt.Println("查询结果:")
	if user.IsStructureEmpty() {
		fmt.Println("t未查询到该用户")
	} else {
		fmt.Printf("t[编号:%s,姓名:%s,密码:%s,权限%d]n", user.UserNo, user.UserName, user.Password, user.Level)
	}
}

// SelectALLUser
// @Title SelectALLUser
// @Description 查询所有用户信息(0)
func SelectALLUser() {
	users := service.SelectAllUser()
	fmt.Println("查询结果:")
	if len(users) == 0 {
		fmt.Println("t未查询到用户")
	} else {
		for _, user := range users {
			fmt.Printf("t[编号:%s,姓名:%s,密码:%s,权限%d]n", user.UserNo, user.UserName, user.Password, user.Level)
		}
	}
}

// InsertUser
// @Title InsertUser
// @Description 添加用户(0)
func InsertUser() {
	fmt.Println("请输入用户信息: ")
	var user model.User
	fmt.Print("学号/工号: ")
	_, err := fmt.Scan(&user.UserNo)
	fmt.Print("姓名: ")
	_, err = fmt.Scan(&user.UserName)
	fmt.Print("密码: ")
	_, err = fmt.Scan(&user.Password)
	fmt.Print("权限: ")
	_, err = fmt.Scan(&user.Level)
	if err != nil {
		log.Fatalln(err)
	}
	if service.InsertUser(user) {
		fmt.Println("添加成功!")
	} else {
		fmt.Println("添加失败,学号|工号已存在!")
	}
}

// DeleteUserByNo
// @Title DeleteUserByNo
// @Description 删除用户(0)
func DeleteUserByNo() {
	var userNo string
	fmt.Print("请输入学号/工号: ")
	_, err := fmt.Scan(&userNo)
	if err != nil {
		log.Fatalln(err)
	}
	if service.DeleteUserByUserNo(userNo) {
		fmt.Println("删除成功!")
	} else {
		fmt.Println("删除失败,学号|工号不存在!")
	}
}

// UpdateUserByNo
// @Title UpdateUserByNo
// @Description 修改用户(0)|修改自己(1,2)
func UpdateUserByNo(myUser model.User) {
	var result bool
	if myUser.Level == 0 {
		var userNo string
		fmt.Print("学号/工号: ")
		_, err := fmt.Scan(&userNo)
		if err != nil {
			log.Fatalln(err)
		}
		user := service.SelectUserByUserNo(userNo)
		if user.IsStructureEmpty() {
			fmt.Println("未查询到该用户!")
			return
		}
		fmt.Println("请选择修改的内容:")
	out1:
		fmt.Println("1>姓名")
		fmt.Println("2>密码")
		fmt.Println("3>权限")
		fmt.Println("4>返回")
		var s string

		_, err = fmt.Scan(&s)
		switch s {
		case "1":
			fmt.Print("姓名: ")
			_, err = fmt.Scan(&user.UserName)
			result = service.UpdateUserByUserNo(user)
			break
		case "2":
			fmt.Print("密码: ")
			_, err = fmt.Scan(&user.Password)
			result = service.UpdateUserByUserNo(user)
			break
		case "3":
			fmt.Print("权限: ")
			_, err = fmt.Scan(&user.Level)
			result = service.UpdateUserByUserNo(user)
			break
		case "4":
			return
		default:
			fmt.Println("输入不合法,请重新选择")
			fmt.Println("------------------------")
			goto out1
		}
	} else {
		fmt.Println("请选择修改的内容:")
	out2:
		fmt.Println("1>密码")
		fmt.Println("2>返回")
		var s string
		_, err := fmt.Scan(&s)
		if err != nil {
			log.Fatalln(err)
		}
		switch s {
		case "1":
			fmt.Print("密码: ")
			_, err = fmt.Scan(&myUser.Password)
			result = service.UpdateUserByUserNo(myUser)
			break
		case "2":
			return
		default:
			fmt.Println("输入不合法,请重新选择")
			fmt.Println("------------------------")
			goto out2
		}
	}
	if result {
		fmt.Println("修改成功!")
	} else {
		fmt.Println("修改失败!")
	}
}

// Login
// @Title Login
// @Description 登录
func Login() model.User {
	var password string
	var userNo string
	fmt.Print("学号|工号: ")
	_, err := fmt.Scan(&userNo)
	if err != nil {
		log.Fatalln(err)
	}
	fmt.Print("密码: ")
	_, err = fmt.Scan(&password)
	if err != nil {
		log.Fatalln(err)
	}
	user := service.SelectUserByUserNo(userNo)
	if user.IsStructureEmpty() {
		fmt.Println("登录失败,学号|工号或密码错误。")
		return user
	}
	if user.Password == password {
		fmt.Println("登录成功")
		return user
	} else {
		fmt.Println("登录失败,学号|工号或密码错误。")
		return model.User{}
	}
}

6. main.go

代码语言:javascript复制
var User model.User

func init() {
	log.SetFlags(log.Lshortfile | log.Ltime | log.Ldate)
}
func main() {
	View()
}
func View() {
	fmt.Println("-------------欢迎来到教务管理系统-------------")
start:
	fmt.Println("1> 登录")
	fmt.Println("2> 退出")
	fmt.Println("-------------------------------------------")
	var s string
	_, err := fmt.Scan(&s)
	if err != nil {
		log.Fatalln(err)
	}
	switch s {
	case "1":
	Login:
		User = controller.Login()
		if User.IsStructureEmpty() {
			fmt.Println("-----------请重新输入-----------")
			goto Login
		}
		for {
			if User.Level == 0 {
				fmt.Println("---------------欢迎管理员进入---------------")
			admin:
				fmt.Println("请选择您要进行的操作:")
				fmt.Println("1>查询用户")
				fmt.Println("2>添加用户")
				fmt.Println("3>删除用户")
				fmt.Println("4>修改用户")
				fmt.Println("5>退出登录")
				var s1 string
				_, err = fmt.Scan(&s1)
				if err != nil {
					log.Fatalln(err)
				}
				switch s1 {
				case "1":
				Select:
					fmt.Println("1>查询所有用户")
					fmt.Println("2>查询指定学号|工号用户")
					fmt.Println("3>返回")
					var s2 string
					_, err = fmt.Scan(&s2)
					if err != nil {
						log.Fatalln(err)
					}
					switch s2 {
					case "1":
						controller.SelectALLUser()
						break
					case "2":
						controller.SelectUserByNo()
						break
					case "3":
						goto admin
					default:
						fmt.Println("输入非法,请重新输入!")
						goto Select
					}
				case "2":
					controller.InsertUser()
					break
				case "3":
					controller.DeleteUserByNo()
					break
				case "4":
					controller.UpdateUserByNo(User)
					break
				case "5":
					User = model.User{}
					goto start
				default:
					fmt.Println("输入不合法,请重新选择!")
					goto admin
				}
			}else {
				fmt.Println("---------------欢迎登录---------------")
			Common:
				fmt.Println("请选择您要进行的操作:")
				fmt.Println("1>修改密码")
				fmt.Println("2>退出登录")
				var s1 string
				_, err = fmt.Scan(&s1)
				if err != nil {
					log.Fatalln(err)
				}
				switch s1 {
				case "1":
					controller.UpdateUserByNo(User)
					break
				case "2":
					User = model.User{}
					goto start
				default:
					fmt.Println("输入不合法,请重新选择!")
					goto Common
				}
			}
		}
	case "2":
		fmt.Println("欢迎您的下次使用!")
		return
	default:
		fmt.Println("输入非法,请重新输入!")
		goto start
	}

}

7. user.txt文件

文件预设计:  user.txt : 用于储存用户信息    权限为0(管理员,账号密码需要手动录入)可进行: 对学生信息进行增删改查,无需密码即可删除学生|修改学生密码,账号默认密码123456    权限为1可进行: 本人密码的修改    权限为2可进行: 本人密码的修改     0000 admin admin 0     1002 tea01 123456 1     2001 stu01 123456 2

0 人点赞