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

相关文章
|
3天前
|
JavaScript Java Go
探索Go语言在微服务架构中的优势
在微服务架构的浪潮中,Go语言以其简洁、高效和并发处理能力脱颖而出。本文将深入探讨Go语言在构建微服务时的性能优势,包括其在内存管理、网络编程、并发模型以及工具链支持方面的特点。通过对比其他流行语言,我们将揭示Go语言如何成为微服务架构中的一股清流。
|
2天前
|
Ubuntu 编译器 Linux
go语言中SQLite3驱动安装
【11月更文挑战第2天】
16 7
|
8天前
|
网络协议 安全 Go
Go语言进行网络编程可以通过**使用TCP/IP协议栈、并发模型、HTTP协议等**方式
【10月更文挑战第28天】Go语言进行网络编程可以通过**使用TCP/IP协议栈、并发模型、HTTP协议等**方式
34 13
|
2天前
|
关系型数据库 Go 网络安全
go语言中PostgreSQL驱动安装
【11月更文挑战第2天】
18 5
|
2天前
|
SQL 关系型数据库 MySQL
go语言数据库中mysql驱动安装
【11月更文挑战第2天】
13 4
|
3天前
|
SQL 关系型数据库 MySQL
go语言中安装数据库驱动
【11月更文挑战第1天】
16 5
|
2天前
|
存储 设计模式 安全
Go语言中的并发编程:从入门到精通###
本文深入探讨了Go语言中并发编程的核心概念与实践技巧,旨在帮助读者从理论到实战全面掌握Go的并发机制。不同于传统的技术文章摘要,本部分将通过一系列生动的案例和代码示例,直观展示Go语言如何优雅地处理并发任务,提升程序性能与响应速度。无论你是Go语言初学者还是有一定经验的开发者,都能在本文中找到实用的知识与灵感。 ###
|
3天前
|
编译器 Go 开发者
go语言中导入相关包
【11月更文挑战第1天】
11 3
|
4天前
|
测试技术 Go
go语言中测试工具
【10月更文挑战第22天】
14 4
|
4天前
|
SQL 关系型数据库 MySQL
go语言中数据库操作
【10月更文挑战第22天】
15 4