GO语言——IO项目

简介: GO语言——IO项目

1. util包

file.go

// 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

// 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

// 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

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

// 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

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

相关文章
|
1天前
|
JSON 前端开发 Go
lucky - go 语言实现的快速开发平台
go 语言实现的快速开发平台,自动生成crud代码,前端页面通过json配置,无需编写前端代码。
8 0
|
2天前
|
存储 Java Go
Go 语言切片如何扩容?(全面解析原理和过程)
Go 语言切片如何扩容?(全面解析原理和过程)
12 2
|
2天前
|
负载均衡 Go 调度
使用Go语言构建高性能的Web服务器:协程与Channel的深度解析
在追求高性能Web服务的今天,Go语言以其强大的并发性能和简洁的语法赢得了开发者的青睐。本文将深入探讨Go语言在构建高性能Web服务器方面的应用,特别是协程(goroutine)和通道(channel)这两个核心概念。我们将通过示例代码,展示如何利用协程处理并发请求,并通过通道实现协程间的通信和同步,从而构建出高效、稳定的Web服务器。
|
2天前
|
算法 Go 分布式数据库
构建高可用的分布式数据库集群:使用Go语言与Raft共识算法
随着数据量的爆炸式增长,单一数据库服务器已难以满足高可用性和可扩展性的需求。在本文中,我们将探讨如何使用Go语言结合Raft共识算法来构建一个高可用的分布式数据库集群。我们不仅会介绍Raft算法的基本原理,还会详细阐述如何利用Go语言的并发特性和网络编程能力来实现这一目标。此外,我们还将分析构建过程中可能遇到的挑战和解决方案,为读者提供一个完整的实践指南。
|
2天前
|
消息中间件 Go API
基于Go语言的微服务架构实践
随着云计算和容器化技术的兴起,微服务架构成为了现代软件开发的主流趋势。Go语言,以其高效的性能、简洁的语法和强大的并发处理能力,成为了构建微服务应用的理想选择。本文将探讨基于Go语言的微服务架构实践,包括微服务的设计原则、服务间的通信机制、以及Go语言在微服务架构中的优势和应用案例。
|
2天前
|
安全 测试技术 数据库连接
使用Go语言进行并发编程
【5月更文挑战第15天】Go语言以其简洁语法和强大的并发原语(goroutines、channels)成为并发编程的理想选择。Goroutines是轻量级线程,由Go运行时管理。Channels作为goroutine间的通信机制,确保安全的数据交换。在编写并发程序时,应遵循如通过通信共享内存、使用`sync`包同步、避免全局变量等最佳实践。理解并发与并行的区别,有效管理goroutine生命周期,并编写测试用例以确保代码的正确性,都是成功进行Go语言并发编程的关键。
|
2天前
|
数据采集 监控 Java
Go语言并发编程:Goroutines和Channels的详细指南
Go语言并发编程:Goroutines和Channels的详细指南
11 3
|
2天前
|
数据采集 人工智能 搜索推荐
快速入门:利用Go语言下载Amazon商品信息的步骤详解
本文探讨了使用Go语言和代理IP技术构建高效Amazon商品信息爬虫的方法。Go语言因其简洁语法、快速编译、并发支持和丰富标准库成为理想的爬虫开发语言。文章介绍了电商网站的发展趋势,如个性化推荐、移动端优化和跨境电商。步骤包括设置代理IP、编写爬虫代码和实现多线程采集。提供的Go代码示例展示了如何配置代理、发送请求及使用goroutine进行多线程采集。注意需根据实际情况调整代理服务和商品URL。
快速入门:利用Go语言下载Amazon商品信息的步骤详解
|
2天前
|
存储 编译器 Go
Go语言学习12-数据的使用
【5月更文挑战第5天】本篇 Huazie 向大家介绍 Go 语言数据的使用,包含赋值语句、常量与变量、可比性与有序性
50 6
Go语言学习12-数据的使用
|
2天前
|
Java Go
一文带你速通go语言指针
Go语言指针入门指南:简述指针用于提升效率,通过地址操作变量。文章作者sharkChili是Java/CSDN专家,维护Java Guide项目。文中介绍指针声明、取值,展示如何通过指针修改变量值及在函数中的应用。通过实例解析如何使用指针优化函数,以实现对原变量的直接修改。作者还邀请读者加入交流群深入探讨,并鼓励关注其公众号“写代码的SharkChili”。
14 0