客户信息管理系统

项目需求说明

  1. 模拟实现及语文本界面的《客户信息管理软件》。
  2. 该软件能够实现对客户对象的插入、修改和删除(用切片实现),并能够打印客户明细表。

    项目的界面设计

  3. 项目采用分级菜单方式。

    程序框架图

  4. 程序框架图:分析该模块有多少文件(类),和各个类之间的调用关系,程序员需要按照架构师的要求,进行分层设计。

    • CustomerView.go
      • 可以显示界面
      • 可以接受用户的输入
      • 根据用户的输入完成客户的管理,他是调用CustomerService方法。
      • CustomerService(处理业务逻辑)
        • 完成对用户的各种操作
        • 对客户的增加、删除、修改,显示
        • 会声明一个customer的切片
    • Customer(表示数据)
      • 表示客户信息
        • 客户各种字段
  5. 代码实现

    项目功能实现

    项目功能实现-显示主菜单和完成退出软件功能

  6. 功能说明

    • 当用户运行程序时,可以看到主菜单,当输入5时,可以退出该程序。
  7. 思路分析
    • 编写 customerView.go,另外可以把 customer.go 和 customerService.go 写上
  8. 代码实现 ```go //-customerManage/model/customer.go

package model

//声明一个 customer 结构体,表示一个客户信息 type Customer struct { Id int Name string Gender string Age int Phone string Email string }

//编写一个工厂模式, 返回一个 Customer 的实例

func NewCustomer(id int, name string, gender string, age int, phone string, email string) Customer { return Customer{ Id : id, Name : name, Gender : gender, Age : age, Phone : phone, Email : email, } }

  1. ```go
  2. //-customerManage/service/customerSerive.go
  3. package service
  4. import "GoProject/src/go_code/chapter13/project_case_01/customerManage/model"
  5. //该 CustomerService,完成对 Customer 的操作,包括增删改查
  6. type CustomerService struct {
  7. customers []model.Customer
  8. //声明一个字段,表示当前切片含有多少个客户
  9. //该字段后面,还可以作为新客户的 Id(customerNum + 1)
  10. customerNum int
  11. }
  1. //-customerManage/view/customerView
  2. package main
  3. import "fmt"
  4. type customerView struct {
  5. //定义必要的字段
  6. key string //接受用户的输入
  7. loop bool //表示是否循环的显示菜单
  8. }
  9. //显示主菜单
  10. func (cv *customerView) mainMenu() {
  11. for {
  12. fmt.Println("----------------客户信息管理软件----------------")
  13. fmt.Println(" 1 添 加 客 户")
  14. fmt.Println(" 2 修 改 客 户")
  15. fmt.Println(" 3 删 除 客 户")
  16. fmt.Println(" 4 客 户 列 表")
  17. fmt.Println(" 5 退 出")
  18. fmt.Println()
  19. fmt.Print(" 请选择(1-5):")
  20. fmt.Scanln(&cv.key)
  21. switch cv.key {
  22. case "1":
  23. fmt.Println("添 加 客 户")
  24. case "2":
  25. fmt.Println("修 改 客 户")
  26. case "3":
  27. fmt.Println("删 除 客 户")
  28. case "4":
  29. fmt.Println("客 户 列 表")
  30. case "5":
  31. cv.loop = false
  32. default:
  33. fmt.Println("你的输入有误,请重新输入...")
  34. }
  35. if !cv.loop {
  36. break
  37. }
  38. }
  39. fmt.Println("你退出了客户关系管理系统")
  40. }
  41. func main() {
  42. fmt.Println("ok")
  43. //在 main 主函数,创建一个 customerView,并运行显示主菜单...
  44. customerView := customerView{
  45. key : "",
  46. loop : true,
  47. }
  48. //显示主菜单..
  49. customerView.mainMenu()
  50. }

项目功能实现-完成显示客户列表的功能

  1. 代码实现 ```go //-customerManage/model/customer.go package model

import “fmt”

//声明一个 customer 结构体,表示一个客户信息 type Customer struct { Id int Name string Gender string Age int Phone string Email string }

//编写一个工厂模式, 返回一个 Customer 的实例

func NewCustomer(id int, name string, gender string, age int, phone string, email string) Customer { return Customer{ Id : id, Name : name, Gender : gender, Age : age, Phone : phone, Email : email, } }

//返回用户的信息 func (customer *Customer) GetInfo() string { info := fmt.Sprintf(“%v\t%v\t%v\t%v\t%v\t%v”, customer.Id, customer.Name, customer.Gender, customer.Age, customer.Phone, customer.Email) return info }

  1. ```go
  2. //-customerManage/service/customerSerive.go
  3. package service
  4. import "GoProject/src/go_code/chapter13/project_case_01/customerManage/model"
  5. //该 CustomerService,完成对 Customer 的操作,包括增删改查
  6. type CustomerService struct {
  7. customers []model.Customer
  8. //声明一个字段,表示当前切片含有多少个客户
  9. //该字段后面,还可以作为新客户的 Id(customerNum + 1)
  10. customerNum int
  11. }
  12. //编写一个方法, 可以返回 *CustomerService
  13. func NewCustomerService() *CustomerService {
  14. //为了能够看到有客户在切片中,我们初始化一个客户
  15. customerService := &CustomerService{}
  16. customerService.customerNum = 1
  17. customer := model.NewCustomer(1, "张三", "男", 20, "112", "zs@souhu.com")
  18. customerService.customers = append(customerService.customers, customer)
  19. return customerService
  20. }
  21. //返回客户切片
  22. func (cs *CustomerService) List() []model.Customer {
  23. return cs.customers
  24. }
  1. //-customerManage/view/customerView
  2. package main
  3. import (
  4. "GoProject/src/go_code/chapter13/project_case_01/customerManage/service"
  5. "fmt"
  6. )
  7. type customerView struct {
  8. //定义必要的字段
  9. key string //接受用户的输入
  10. loop bool //表示是否循环的显示菜单
  11. //增加一个字段 customerService
  12. customerService *service.CustomerService
  13. }
  14. //显示所有的客户信息
  15. func (cv *customerView) list() {
  16. //首先,获取到当前所有的用户信息
  17. customers := cv.customerService.List()
  18. //显示
  19. fmt.Println("-------------------客户列表-------------------")
  20. fmt.Println("编号\t姓名\t性别\t年龄\t电话\t邮箱")
  21. for i := 0; i < len(customers); i++ {
  22. fmt.Println(customers[i].GetInfo())
  23. }
  24. fmt.Printf("\n-----------------客户列表完成------------------\n\n")
  25. }
  26. //显示主菜单
  27. func (cv *customerView) mainMenu() {
  28. for {
  29. fmt.Println("----------------客户信息管理软件----------------")
  30. fmt.Println(" 1 添 加 客 户")
  31. fmt.Println(" 2 修 改 客 户")
  32. fmt.Println(" 3 删 除 客 户")
  33. fmt.Println(" 4 客 户 列 表")
  34. fmt.Println(" 5 退 出")
  35. fmt.Println()
  36. fmt.Print(" 请选择(1-5):")
  37. fmt.Scanln(&cv.key)
  38. switch cv.key {
  39. case "1":
  40. fmt.Println("添 加 客 户")
  41. case "2":
  42. fmt.Println("修 改 客 户")
  43. case "3":
  44. fmt.Println("删 除 客 户")
  45. case "4":
  46. cv.list()
  47. case "5":
  48. cv.loop = false
  49. default:
  50. fmt.Println("你的输入有误,请重新输入...")
  51. }
  52. if !cv.loop {
  53. break
  54. }
  55. }
  56. fmt.Println("你退出了客户关系管理系统")
  57. }
  58. func main() {
  59. //fmt.Println("ok")
  60. //在 main 主函数,创建一个 customerView,并运行显示主菜单...
  61. customerView := customerView{
  62. key : "",
  63. loop : true,
  64. }
  65. //这里完成对 customerView 结构体的 customerService 字段的初始化
  66. customerView.customerService = service.NewCustomerService()
  67. //显示主菜单..
  68. customerView.mainMenu()
  69. }

项目功能实现-添加客户功能

  1. 代码实现 ```go //-customerManage/model/customer.go package model

import “fmt”

//声明一个 customer 结构体,表示一个客户信息 type Customer struct { Id int Name string Gender string Age int Phone string Email string }

//编写一个工厂模式, 返回一个 Customer 的实例

func NewCustomer(id int, name string, gender string, age int, phone string, email string) Customer { return Customer{ Id : id, Name : name, Gender : gender, Age : age, Phone : phone, Email : email, } }

//第二种创建 Customer 实例方法,不带 id func NewCustomer2 (name string, gender string, age int, phone string, email string) Customer { return Customer{ Name : name, Gender : gender, Age : age, Phone : phone, Email : email, } }

//返回用户的信息 func (customer *Customer) GetInfo() string { info := fmt.Sprintf(“%v\t%v\t%v\t%v\t%v\t%v”, customer.Id, customer.Name, customer.Gender, customer.Age, customer.Phone, customer.Email) return info }

  1. ```go
  2. //-customerManage/service/customerSerive.go
  3. package service
  4. import "GoProject/src/go_code/chapter13/project_case_01/customerManage/model"
  5. //该 CustomerService,完成对 Customer 的操作,包括增删改查
  6. type CustomerService struct {
  7. customers []model.Customer
  8. //声明一个字段,表示当前切片含有多少个客户
  9. //该字段后面,还可以作为新客户的 Id(customerNum + 1)
  10. customerNum int
  11. }
  12. //编写一个方法, 可以返回 *CustomerService
  13. func NewCustomerService() *CustomerService {
  14. //为了能够看到有客户在切片中,我们初始化一个客户
  15. customerService := &CustomerService{}
  16. customerService.customerNum = 1
  17. customer := model.NewCustomer(1, "张三", "男", 20, "112", "zs@souhu.com")
  18. customerService.customers = append(customerService.customers, customer)
  19. return customerService
  20. }
  21. //返回客户切片
  22. func (cs *CustomerService) List() []model.Customer {
  23. return cs.customers
  24. }
  25. //添加客户到 customer 切片
  26. //!!!
  27. func (cs *CustomerService) Add(customer model.Customer) bool {
  28. //我们确定一个分配 id 规则,就是添加顺序
  29. cs.customerNum ++
  30. customer.Id = cs.customerNum
  31. cs.customers = append(cs.customers, customer)
  32. return true
  33. }
  1. //-customerManage/view/customerView
  2. package main
  3. import (
  4. "GoProject/src/go_code/chapter13/project_case_01/customerManage/model"
  5. "GoProject/src/go_code/chapter13/project_case_01/customerManage/service"
  6. "fmt"
  7. )
  8. type customerView struct {
  9. //定义必要的字段
  10. key string //接受用户的输入
  11. loop bool //表示是否循环的显示菜单
  12. //增加一个字段 customerService
  13. customerService *service.CustomerService
  14. }
  15. //显示所有的客户信息
  16. func (cv *customerView) list() {
  17. //首先,获取到当前所有的用户信息
  18. customers := cv.customerService.List()
  19. //显示
  20. fmt.Println("-------------------客户列表-------------------")
  21. fmt.Println("编号\t姓名\t性别\t年龄\t电话\t邮箱")
  22. for i := 0; i < len(customers); i++ {
  23. fmt.Println(customers[i].GetInfo())
  24. }
  25. fmt.Printf("\n-----------------客户列表完成------------------\n\n")
  26. }
  27. //得到用户的输入信息,构建新的客户,并完成添加
  28. func (cv *customerView) add() {
  29. fmt.Println("-------------------添加客户-------------------")
  30. fmt.Println("姓名:")
  31. name := ""
  32. fmt.Scanln(&name)
  33. fmt.Println("性别:")
  34. gender := ""
  35. fmt.Scanln(&gender)
  36. fmt.Println("年龄:")
  37. age := 0
  38. fmt.Scanln(&age)
  39. fmt.Println("电话号码:")
  40. phone := ""
  41. fmt.Scanln(&phone)
  42. fmt.Println("邮箱:")
  43. email := ""
  44. fmt.Scanln(&email)
  45. //构建一个新的 Customer 实例
  46. //注意:id 号没有让用户输入,id 是唯一的,需要系统分配
  47. //id := cv.customerService.customerNum
  48. customer := model.NewCustomer2(name, gender, age, phone, email)
  49. //调用
  50. if cv.customerService.Add(customer) {
  51. fmt.Printf("-------------------添加成功-------------------\n\n")
  52. } else {
  53. fmt.Printf("-------------------添加失败-------------------\n\n")
  54. }
  55. }
  56. //显示主菜单
  57. func (cv *customerView) mainMenu() {
  58. for {
  59. fmt.Println("----------------客户信息管理软件----------------")
  60. fmt.Println(" 1 添 加 客 户")
  61. fmt.Println(" 2 修 改 客 户")
  62. fmt.Println(" 3 删 除 客 户")
  63. fmt.Println(" 4 客 户 列 表")
  64. fmt.Println(" 5 退 出")
  65. fmt.Println()
  66. fmt.Print(" 请选择(1-5):")
  67. fmt.Scanln(&cv.key)
  68. switch cv.key {
  69. case "1":
  70. cv.add()
  71. case "2":
  72. fmt.Println("修 改 客 户")
  73. case "3":
  74. fmt.Println("删 除 客 户")
  75. case "4":
  76. cv.list()
  77. case "5":
  78. cv.loop = false
  79. default:
  80. fmt.Println("你的输入有误,请重新输入...")
  81. }
  82. if !cv.loop {
  83. break
  84. }
  85. }
  86. fmt.Println("你退出了客户关系管理系统")
  87. }
  88. func main() {
  89. //fmt.Println("ok")
  90. //在 main 主函数,创建一个 customerView,并运行显示主菜单...
  91. customerView := customerView{
  92. key : "",
  93. loop : true,
  94. }
  95. //这里完成对 customerView 结构体的 customerService 字段的初始化
  96. customerView.customerService = service.NewCustomerService()
  97. //显示主菜单..
  98. customerView.mainMenu()
  99. }

项目功能实现-完成删除客户的功能

  1. 代码实现 ```go //-customerManage/model/customer.go package model

import “fmt”

//声明一个 customer 结构体,表示一个客户信息 type Customer struct { Id int Name string Gender string Age int Phone string Email string }

//编写一个工厂模式, 返回一个 Customer 的实例

func NewCustomer(id int, name string, gender string, age int, phone string, email string) Customer { return Customer{ Id : id, Name : name, Gender : gender, Age : age, Phone : phone, Email : email, } }

//第二种创建 Customer 实例方法,不带 id func NewCustomer2 (name string, gender string, age int, phone string, email string) Customer { return Customer{ Name : name, Gender : gender, Age : age, Phone : phone, Email : email, } }

//返回用户的信息 func (customer *Customer) GetInfo() string { info := fmt.Sprintf(“%v\t%v\t%v\t%v\t%v\t%v”, customer.Id, customer.Name, customer.Gender, customer.Age, customer.Phone, customer.Email) return info }

  1. ```go
  2. //-customerManage/service/customerSerive.go
  3. package service
  4. import "GoProject/src/go_code/chapter13/project_case_01/customerManage/model"
  5. //该 CustomerService,完成对 Customer 的操作,包括增删改查
  6. type CustomerService struct {
  7. customers []model.Customer
  8. //声明一个字段,表示当前切片含有多少个客户
  9. //该字段后面,还可以作为新客户的 Id(customerNum + 1)
  10. customerNum int
  11. }
  12. //编写一个方法, 可以返回 *CustomerService
  13. func NewCustomerService() *CustomerService {
  14. //为了能够看到有客户在切片中,我们初始化一个客户
  15. customerService := &CustomerService{}
  16. customerService.customerNum = 1
  17. customer := model.NewCustomer(1, "张三", "男", 20, "112", "zs@souhu.com")
  18. customerService.customers = append(customerService.customers, customer)
  19. return customerService
  20. }
  21. //返回客户切片
  22. func (cs *CustomerService) List() []model.Customer {
  23. return cs.customers
  24. }
  25. //添加客户到 customer 切片
  26. //!!!
  27. func (cs *CustomerService) Add(customer model.Customer) bool {
  28. //我们确定一个分配 id 规则,就是添加顺序
  29. cs.customerNum ++
  30. customer.Id = cs.customerNum
  31. cs.customers = append(cs.customers, customer)
  32. return true
  33. }
  34. //根据 id 查找客户再切片中国对应的下标,如果没有该客户,返回 -1。
  35. func (cs *CustomerService) FindById(id int) int {
  36. index := -1
  37. //遍历
  38. for i := 0; i < len(cs.customers); i++ {
  39. if cs.customers[i].Id == id {
  40. //找到
  41. index = i
  42. }
  43. }
  44. return index
  45. }
  46. //根据 id 删除客户(从切片中删除)
  47. func (cs *CustomerService) Delete(id int) bool {
  48. index := cs.FindById(id)
  49. //如果 index == -1, 说明没有这个客户
  50. if index == -1 {
  51. return false
  52. }
  53. //如何从切片中删除一个元素
  54. cs.customers = append(cs.customers[:index], cs.customers[index + 1:]...)
  55. return true
  56. }
  1. //-customerManage/view/customerView
  2. package main
  3. import (
  4. "GoProject/src/go_code/chapter13/project_case_01/customerManage/model"
  5. "GoProject/src/go_code/chapter13/project_case_01/customerManage/service"
  6. "fmt"
  7. )
  8. type customerView struct {
  9. //定义必要的字段
  10. key string //接受用户的输入
  11. loop bool //表示是否循环的显示菜单
  12. //增加一个字段 customerService
  13. customerService *service.CustomerService
  14. }
  15. //显示所有的客户信息
  16. func (cv *customerView) list() {
  17. //首先,获取到当前所有的用户信息
  18. customers := cv.customerService.List()
  19. //显示
  20. fmt.Println("-------------------客户列表-------------------")
  21. fmt.Println("编号\t姓名\t性别\t年龄\t电话\t邮箱")
  22. for i := 0; i < len(customers); i++ {
  23. fmt.Println(customers[i].GetInfo())
  24. }
  25. fmt.Printf("\n-----------------客户列表完成------------------\n\n")
  26. }
  27. //得到用户的输入信息,构建新的客户,并完成添加
  28. func (cv *customerView) add() {
  29. fmt.Println("-------------------添加客户-------------------")
  30. fmt.Println("姓名:")
  31. name := ""
  32. fmt.Scanln(&name)
  33. fmt.Println("性别:")
  34. gender := ""
  35. fmt.Scanln(&gender)
  36. fmt.Println("年龄:")
  37. age := 0
  38. fmt.Scanln(&age)
  39. fmt.Println("电话号码:")
  40. phone := ""
  41. fmt.Scanln(&phone)
  42. fmt.Println("邮箱:")
  43. email := ""
  44. fmt.Scanln(&email)
  45. //构建一个新的 Customer 实例
  46. //注意:id 号没有让用户输入,id 是唯一的,需要系统分配
  47. //id := cv.customerService.customerNum
  48. customer := model.NewCustomer2(name, gender, age, phone, email)
  49. //调用
  50. if cv.customerService.Add(customer) {
  51. fmt.Printf("-------------------添加成功-------------------\n\n")
  52. } else {
  53. fmt.Printf("-------------------添加失败-------------------\n\n")
  54. }
  55. }
  56. //得到用户的输入 id,删除该 id 对应的客户
  57. func (cv *customerView) delete() {
  58. fmt.Println("-------------------删除客户-------------------")
  59. fmt.Print("请选择待删除客户编号(-1退出):")
  60. id := -1
  61. fmt.Scanln(&id)
  62. if id == -1 {
  63. return //放弃删除
  64. }
  65. fmt.Print("确认是否删除(Y/N):")
  66. choice := ""
  67. fmt.Scanln(&choice)
  68. if choice == "y" || choice == "Y" {
  69. //调用 customerService 的 Delete 方法
  70. if cv.customerService.Delete(id) {
  71. fmt.Printf("-------------------删除完成-------------------\n\n")
  72. } else {
  73. fmt.Printf("-----------删除失败,输入 id 号不存在------------\n\n")
  74. }
  75. }
  76. }
  77. //显示主菜单
  78. func (cv *customerView) mainMenu() {
  79. for {
  80. fmt.Println("----------------客户信息管理软件----------------")
  81. fmt.Println(" 1 添 加 客 户")
  82. fmt.Println(" 2 修 改 客 户")
  83. fmt.Println(" 3 删 除 客 户")
  84. fmt.Println(" 4 客 户 列 表")
  85. fmt.Println(" 5 退 出")
  86. fmt.Println()
  87. fmt.Print(" 请选择(1-5):")
  88. fmt.Scanln(&cv.key)
  89. switch cv.key {
  90. case "1":
  91. cv.add()
  92. case "2":
  93. fmt.Println("修 改 客 户")
  94. case "3":
  95. cv.delete()
  96. case "4":
  97. cv.list()
  98. case "5":
  99. cv.loop = false
  100. default:
  101. fmt.Println("你的输入有误,请重新输入...")
  102. }
  103. if !cv.loop {
  104. break
  105. }
  106. }
  107. fmt.Println("你退出了客户关系管理系统")
  108. }
  109. func main() {
  110. //fmt.Println("ok")
  111. //在 main 主函数,创建一个 customerView,并运行显示主菜单...
  112. customerView := customerView{
  113. key : "",
  114. loop : true,
  115. }
  116. //这里完成对 customerView 结构体的 customerService 字段的初始化
  117. customerView.customerService = service.NewCustomerService()
  118. //显示主菜单..
  119. customerView.mainMenu()
  120. }

项目功能实现-完善退出确认功能

  1. 代码实现 ```go //-customerManage/view/customerView package main

import ( “GoProject/src/go_code/chapter13/project_case_01/customerManage/model” “GoProject/src/go_code/chapter13/project_case_01/customerManage/service” “fmt” )

type customerView struct { //定义必要的字段 key string //接受用户的输入 loop bool //表示是否循环的显示菜单 //增加一个字段 customerService customerService *service.CustomerService

}

//显示所有的客户信息 func (cv *customerView) list() { //首先,获取到当前所有的用户信息 customers := cv.customerService.List() //显示 fmt.Println(“—————————-客户列表—————————-“) fmt.Println(“编号\t姓名\t性别\t年龄\t电话\t邮箱”) for i := 0; i < len(customers); i++ { fmt.Println(customers[i].GetInfo()) } fmt.Printf(“\n————————-客户列表完成—————————\n\n”) }

//得到用户的输入信息,构建新的客户,并完成添加 func (cv *customerView) add() { fmt.Println(“—————————-添加客户—————————-“) fmt.Println(“姓名:”) name := “” fmt.Scanln(&name) fmt.Println(“性别:”) gender := “” fmt.Scanln(&gender) fmt.Println(“年龄:”) age := 0 fmt.Scanln(&age) fmt.Println(“电话号码:”) phone := “” fmt.Scanln(&phone) fmt.Println(“邮箱:”) email := “” fmt.Scanln(&email)

  1. //构建一个新的 Customer 实例
  2. //注意:id 号没有让用户输入,id 是唯一的,需要系统分配
  3. //id := cv.customerService.customerNum
  4. customer := model.NewCustomer2(name, gender, age, phone, email)
  5. //调用
  6. if cv.customerService.Add(customer) {
  7. fmt.Printf("-------------------添加成功-------------------\n\n")
  8. } else {
  9. fmt.Printf("-------------------添加失败-------------------\n\n")
  10. }

}

//得到用户的输入 id,删除该 id 对应的客户 func (cv *customerView) delete() { fmt.Println(“—————————-删除客户—————————-“) fmt.Print(“请选择待删除客户编号(-1退出):”) id := -1 fmt.Scanln(&id) if id == -1 { return //放弃删除 } fmt.Print(“确认是否删除(Y/N):”) choice := “” fmt.Scanln(&choice) if choice == “y” || choice == “Y” { //调用 customerService 的 Delete 方法 if cv.customerService.Delete(id) { fmt.Printf(“—————————-删除完成—————————-\n\n”) } else { fmt.Printf(“—————-删除失败,输入 id 号不存在——————\n\n”) } }

}

//退出软件 func (cv *customerView) exit() { fmt.Printf(“确认是否退出(Y/N):”) choice := “” for { fmt.Scanln(&choice) if choice == “Y” || choice == “y” || choice == “N” || choice == “n” { break } fmt.Println(“你的输入有误,确认是否退出(Y/N):”) }

  1. if choice == "Y" || choice == "y" {
  2. cv.loop = false
  3. }

}

//显示主菜单

func (cv *customerView) mainMenu() { for { fmt.Println(“————————客户信息管理软件————————“) fmt.Println(“ 1 添 加 客 户”) fmt.Println(“ 2 修 改 客 户”) fmt.Println(“ 3 删 除 客 户”) fmt.Println(“ 4 客 户 列 表”) fmt.Println(“ 5 退 出”) fmt.Println() fmt.Print(“ 请选择(1-5):”) fmt.Scanln(&cv.key) switch cv.key { case “1”: cv.add() case “2”: fmt.Println(“修 改 客 户”) case “3”: cv.delete() case “4”: cv.list() case “5”: cv.exit() default: fmt.Println(“你的输入有误,请重新输入…”) } if !cv.loop { break } } fmt.Println(“你退出了客户关系管理系统”) }

func main() { //fmt.Println(“ok”) //在 main 主函数,创建一个 customerView,并运行显示主菜单… customerView := customerView{ key : “”, loop : true, } //这里完成对 customerView 结构体的 customerService 字段的初始化 customerView.customerService = service.NewCustomerService() //显示主菜单.. customerView.mainMenu() }

  1. <a name="6a84ed3c"></a>
  2. ### 项目功能实现-完成修改客户的功能
  3. 1. 代码实现
  4. ```go
  5. //-customerManage/service/customerSerive.go
  6. package service
  7. import (
  8. "GoProject/src/go_code/chapter13/project_case_01/customerManage/model"
  9. "fmt"
  10. )
  11. //该 CustomerService,完成对 Customer 的操作,包括增删改查
  12. type CustomerService struct {
  13. customers []model.Customer
  14. //声明一个字段,表示当前切片含有多少个客户
  15. //该字段后面,还可以作为新客户的 Id(customerNum + 1)
  16. customerNum int
  17. }
  18. //编写一个方法, 可以返回 *CustomerService
  19. func NewCustomerService() *CustomerService {
  20. //为了能够看到有客户在切片中,我们初始化一个客户
  21. customerService := &CustomerService{}
  22. customerService.customerNum = 1
  23. customer := model.NewCustomer(1, "张三", "男", 20, "112", "zs@souhu.com")
  24. customerService.customers = append(customerService.customers, customer)
  25. return customerService
  26. }
  27. //返回客户切片
  28. func (cs *CustomerService) List() []model.Customer {
  29. return cs.customers
  30. }
  31. //添加客户到 customer 切片
  32. //!!!
  33. func (cs *CustomerService) Add(customer model.Customer) bool {
  34. //我们确定一个分配 id 规则,就是添加顺序
  35. cs.customerNum ++
  36. customer.Id = cs.customerNum
  37. cs.customers = append(cs.customers, customer)
  38. return true
  39. }
  40. //根据 id 查找客户再切片中国对应的下标,如果没有该客户,返回 -1。
  41. func (cs *CustomerService) FindById(id int) int {
  42. index := -1
  43. //遍历
  44. for i := 0; i < len(cs.customers); i++ {
  45. if cs.customers[i].Id == id {
  46. //找到
  47. index = i
  48. }
  49. }
  50. return index
  51. }
  52. //根据 id 删除客户(从切片中删除)
  53. func (cs *CustomerService) Delete(id int) bool {
  54. index := cs.FindById(id)
  55. //如果 index == -1, 说明没有这个客户
  56. if index == -1 {
  57. return false
  58. }
  59. //如何从切片中删除一个元素
  60. cs.customers = append(cs.customers[:index], cs.customers[index + 1:]...)
  61. return true
  62. }
  63. //根据 id 更新客户
  64. func (cs *CustomerService) Update(id int) bool {
  65. index := cs.FindById(id)
  66. //如果 index == -1, 说明没有这个客户
  67. if index == -1 {
  68. return false
  69. }
  70. fmt.Printf("姓名(%v):", cs.customers[index].Name)
  71. name := ""
  72. fmt.Scanln(&name)
  73. if name != "" {
  74. //fmt.Println()
  75. cs.customers[index].Name = name
  76. }
  77. fmt.Printf("性别(%v):", cs.customers[index].Gender)
  78. gender := ""
  79. fmt.Scanln(&gender)
  80. if gender != "" {
  81. //fmt.Println()
  82. cs.customers[index].Gender = gender
  83. }
  84. fmt.Printf("年龄(%v):", cs.customers[index].Age)
  85. age := 0
  86. fmt.Scanln(&age)
  87. if age != 0 {
  88. //fmt.Println()
  89. cs.customers[index].Age = age
  90. }
  91. fmt.Printf("电话(%v):", cs.customers[index].Phone)
  92. phone := ""
  93. fmt.Scanln(&phone)
  94. if phone != "" {
  95. //fmt.Println()
  96. cs.customers[index].Phone = phone
  97. }
  98. fmt.Printf("邮箱(%v):", cs.customers[index].Email)
  99. email := ""
  100. fmt.Scanln(&email)
  101. if email != "" {
  102. //fmt.Println()
  103. cs.customers[index].Email = email
  104. }
  105. return true
  106. }
  1. //-customerManage/view/customerView
  2. package main
  3. import (
  4. "GoProject/src/go_code/chapter13/project_case_01/customerManage/model"
  5. "GoProject/src/go_code/chapter13/project_case_01/customerManage/service"
  6. "fmt"
  7. )
  8. type customerView struct {
  9. //定义必要的字段
  10. key string //接受用户的输入
  11. loop bool //表示是否循环的显示菜单
  12. //增加一个字段 customerService
  13. customerService *service.CustomerService
  14. }
  15. //显示所有的客户信息
  16. func (cv *customerView) list() {
  17. //首先,获取到当前所有的用户信息
  18. customers := cv.customerService.List()
  19. //显示
  20. fmt.Println("\n-------------------客户列表-------------------")
  21. fmt.Println("编号\t姓名\t性别\t年龄\t电话\t邮箱")
  22. for i := 0; i < len(customers); i++ {
  23. fmt.Println(customers[i].GetInfo())
  24. }
  25. fmt.Printf("\n-----------------客户列表完成------------------\n\n")
  26. }
  27. //得到用户的输入信息,构建新的客户,并完成添加
  28. func (cv *customerView) add() {
  29. fmt.Println("\n-------------------添加客户-------------------")
  30. fmt.Println("姓名:")
  31. name := ""
  32. fmt.Scanln(&name)
  33. fmt.Println("性别:")
  34. gender := ""
  35. fmt.Scanln(&gender)
  36. fmt.Println("年龄:")
  37. age := 0
  38. fmt.Scanln(&age)
  39. fmt.Println("电话号码:")
  40. phone := ""
  41. fmt.Scanln(&phone)
  42. fmt.Println("邮箱:")
  43. email := ""
  44. fmt.Scanln(&email)
  45. //构建一个新的 Customer 实例
  46. //注意:id 号没有让用户输入,id 是唯一的,需要系统分配
  47. //id := cv.customerService.customerNum
  48. customer := model.NewCustomer2(name, gender, age, phone, email)
  49. //调用
  50. if cv.customerService.Add(customer) {
  51. fmt.Printf("\n-------------------添加成功-------------------\n\n")
  52. } else {
  53. fmt.Printf("\n-------------------添加失败-------------------\n\n")
  54. }
  55. }
  56. //得到用户的输入 id,删除该 id 对应的客户
  57. func (cv *customerView) delete() {
  58. fmt.Println("\n-------------------删除客户-------------------")
  59. fmt.Print("请选择待删除客户编号(-1退出):")
  60. id := -1
  61. fmt.Scanln(&id)
  62. if id == -1 {
  63. return //放弃删除
  64. }
  65. fmt.Print("确认是否删除(Y/N):")
  66. choice := ""
  67. fmt.Scanln(&choice)
  68. if choice == "y" || choice == "Y" {
  69. //调用 customerService 的 Delete 方法
  70. if cv.customerService.Delete(id) {
  71. fmt.Printf("\n-------------------删除完成-------------------\n\n")
  72. } else {
  73. fmt.Printf("\n-----------删除失败,输入 id 号不存在------------\n\n")
  74. }
  75. }
  76. }
  77. //得到用户的输入 id,修改该 id 对应的客户信息
  78. func (cv *customerView) update() {
  79. fmt.Println("\n-------------------修改客户-------------------")
  80. fmt.Print("请选择待修改客户编号(-1退出):")
  81. id := -1
  82. fmt.Scanln(&id)
  83. if id == -1 {
  84. return //放弃修改
  85. }
  86. if cv.customerService.Update(id) {
  87. fmt.Printf("\n-------------------删除完成-------------------\n\n")
  88. } else {
  89. fmt.Printf("\n-----------修改失败,输入 id 号不存在------------\n\n")
  90. }
  91. }
  92. //退出软件
  93. func (cv *customerView) exit() {
  94. fmt.Printf("确认是否退出(Y/N):")
  95. choice := ""
  96. for {
  97. fmt.Scanln(&choice)
  98. if choice == "Y" || choice == "y" || choice == "N" || choice == "n" {
  99. break
  100. }
  101. fmt.Println("你的输入有误,确认是否退出(Y/N):")
  102. }
  103. if choice == "Y" || choice == "y" {
  104. cv.loop = false
  105. }
  106. }
  107. //显示主菜单
  108. func (cv *customerView) mainMenu() {
  109. for {
  110. fmt.Println("----------------客户信息管理软件----------------")
  111. fmt.Println(" 1 添 加 客 户")
  112. fmt.Println(" 2 修 改 客 户")
  113. fmt.Println(" 3 删 除 客 户")
  114. fmt.Println(" 4 客 户 列 表")
  115. fmt.Println(" 5 退 出")
  116. fmt.Println()
  117. fmt.Print(" 请选择(1-5):")
  118. fmt.Scanln(&cv.key)
  119. switch cv.key {
  120. case "1":
  121. cv.add()
  122. case "2":
  123. //fmt.Println("修 改 客 户")
  124. cv.update()
  125. case "3":
  126. cv.delete()
  127. case "4":
  128. cv.list()
  129. case "5":
  130. cv.exit()
  131. default:
  132. fmt.Println("你的输入有误,请重新输入...")
  133. }
  134. if !cv.loop {
  135. break
  136. }
  137. }
  138. fmt.Println("你退出了客户关系管理系统")
  139. }
  140. func main() {
  141. //fmt.Println("ok")
  142. //在 main 主函数,创建一个 customerView,并运行显示主菜单...
  143. customerView := customerView{
  144. key : "",
  145. loop : true,
  146. }
  147. //这里完成对 customerView 结构体的 customerService 字段的初始化
  148. customerView.customerService = service.NewCustomerService()
  149. //显示主菜单..
  150. customerView.mainMenu()
  151. }

课程来源