golang练手项目-客户信息管理系统-单机版
前言:
本项目是为了结合前期学习的知识的一个总结, 其中包含面向对象的思想,使用MVC架构实现 ,单机版。
最终效果
模拟实现基于文本界面的《客户信息管理软件》
该软件能够实现对客户对象的插入、修改和删除(用切片实现),并能够打印客户明细表。
项目采用分级菜单方式。 主菜单如下:
------------客户信息管理软件------------
1 添加客户
2 修改客户
3 删除客户
4 客户列表
5 退 出
请选择(1-5):
4
------------客 户 列 表------------
编号 姓名 性别 年龄 电话 邮箱
1 张三 男 20 112 zs@syuee.com
------------获 取 完 成------------
------------客户信息管理软件------------
1 添加客户
2 修改客户
3 删除客户
4 客户列表
5 退 出
请选择(1-5):
2
------------修 改 客 户------------
请选择待删除客户编号(-1退出):
------------客户信息管理软件------------
1 添加客户
2 修改客户
3 删除客户
4 客户列表
5 退 出
请选择(1-5):
2
------------修 改 客 户------------
请选择待删除客户编号(-1退出):
1
姓名(张三):<直接回车表示不修改>
性别(男):
年龄(20):21
电话(112):
电邮(zs@syuee.com):
------------修 改 完 成------------
------------客户信息管理软件------------
1 添加客户
2 修改客户
rayon@MBP customerMange %go run main.go
------------客户信息管理软件------------
1 添加客户
2 修改客户
3 删除客户
4 客户列表
5 退 出
请选择(1-5):
4
------------客 户 列 表------------
编号 姓名 性别 年龄 电话 邮箱
1 张三 男 20 112 zs@syuee.com
------------获 取 完 成------------
------------客户信息管理软件------------
1 添加客户
2 修改客户
3 删除客户
4 客户列表
5 退 出
请选择(1-5):
1
------------添 加 客 户------------
姓名:
李四
性别:
男
年龄:
23
电话:
010-12345
电邮:
dy@syuee.com
------------添 加 完 成------------
------------客户信息管理软件------------
1 添加客户
2 修改客户
3 删除客户
4 客户列表
5 退 出
请选择(1-5):
2
------------修 改 客 户------------
请选择待修改的客户编号(-1退出):
2
姓名(李四):<直接回车表示不修改>
性别(男):
年龄(23):24
电话(010-12345):
电邮(dy@syuee.com):
------------修 改 完 成------------
------------客户信息管理软件------------
1 添加客户
2 修改客户
3 删除客户
4 客户列表
5 退 出
请选择(1-5):
3
------------删 除 客 户------------
请选择待删除客户编号(-1退出):
1
确认是否删除(Y/N):
y
------------删 除 完 成------------
------------客户信息管理软件------------
1 添加客户
2 修改客户
3 删除客户
4 客户列表
5 退 出
请选择(1-5):
5
确认是否退出(Y/N):
y
您退出客户管理软件的使用...
代码实现
代码结构
├── customerMange
│ ├── go.mod
│ ├── main.go
│ ├── model
│ │ └── customer.go
│ ├── service
│ │ └── customerService.go
│ └── view
│ └── customerView.go
依赖管理文件-go.mod
module customermange
go 1.18
主函数-main.go
package main
import (
"customermange/service"
"customermange/view"
)
func main() {
//在main函数中, 创建一个customerView, 并运行显示主菜单
customerview := view.NewCustomerView("", true, service.NewCustomerService())
//这里完成对customerView结构体的customerService字段的初始化
//customerview.customerService =service.NewCustomerService()
//显示主菜单..
customerview.MainMenu()
}
用户视图层-customerView.go
package view
import (
"customermange/model"
"customermange/service"
"fmt"
)
type CustomerView struct {
//定义必要字段
key string //接收用户的输入...
loop bool //表示是否循环的显示菜单
//增加一个字段customerService
customerService *service.CustomerService
}
func NewCustomerView(key string, loop bool, customerService *service.CustomerService) CustomerView {
return CustomerView{
key: key,
loop: loop,
customerService: customerService,
}
}
//显示所有的客户信息
func (cv *CustomerView) list() {
//首先, 获取当前所有的客户信息(在切片中)
customers := cv.customerService.List()
fmt.Println("\n------------客 户 列 表------------")
fmt.Println("\n编号\t姓名\t性别\t年龄\t电话\t邮箱")
for i := 0; i < len(customers); i++ {
fmt.Println(customers[i].GetInfo())
}
fmt.Println("\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)
//构建一个新的Customer实例
//注意:id号, 没有让用户输入,
customer := model.NewCustomerTwo(name, gender, age, phone, email)
//调用
if cv.customerService.Add(customer) {
fmt.Println("------------添 加 完 成------------")
} else {
fmt.Println("------------添 加 失 败------------")
}
}
// 得到用户的输入id , 删除该id对应的客户
func (cv *CustomerView) Delete() {
successInfo := "------------删 除 完 成------------"
errorInfo := "------------该 id 不 存 在------------"
fmt.Println("------------删 除 客 户------------")
DELETEtag:
fmt.Println("请选择待删除客户编号(-1退出):")
id := -1
fmt.Scanln(&id)
if id == -1 {
return //放弃删除操作
}
//这里循环判断, 知道用户输入y或者n , 才退出 ..
fmt.Println("确认是否删除(Y/N):")
for {
choice := ""
fmt.Scanln(&choice)
if choice == "y" || choice == "n" {
//调用customerService的Delete方法
if cv.customerService.Delete(id) {
fmt.Println(successInfo)
} else {
fmt.Println(errorInfo)
goto DELETEtag
}
break
} else {
fmt.Println("输入有误,请重新输入(Y/N):")
}
}
}
// 得到用户的输入id , 删除该id对应的客户
func (cv *CustomerView) Update() {
fmt.Println("------------修 改 客 户------------")
fmt.Println("请选择待修改的客户编号(-1退出):")
id := -1
fmt.Scanln(&id)
if id == -1 {
return //放弃修改操作
}
customer := cv.customerService.List()[cv.customerService.FindById(id)]
fmt.Printf("姓名(%v):<直接回车表示不修改>", customer.Name)
name := ""
fmt.Scanln(&name)
if name != "" {
customer.Name = name
}
fmt.Printf("性别(%v):", customer.Gender)
gender := ""
fmt.Scanln(&gender)
if gender != "" {
customer.Gender = gender
}
fmt.Printf("年龄(%v):", customer.Age)
age := 0
fmt.Scanln(&age)
if age != 0 {
customer.Age = age
}
fmt.Printf("电话(%v):", customer.Phone)
phone := ""
fmt.Scanln(&phone)
if phone != "" {
customer.Phone = phone
}
fmt.Printf("电邮(%v):", customer.Email)
email := ""
fmt.Scanln(&email)
if email != "" {
customer.Email = email
}
cv.customerService.Update(customer)
fmt.Println("------------修 改 完 成------------")
}
//显示主菜单
func (cv *CustomerView) MainMenu() {
for {
fmt.Println("\n------------客户信息管理软件------------")
fmt.Println(" 1 添加客户")
fmt.Println(" 2 修改客户")
fmt.Println(" 3 删除客户")
fmt.Println(" 4 客户列表")
fmt.Println(" 5 退 出")
fmt.Println("请选择(1-5):")
fmt.Scanln(&cv.key)
switch cv.key {
case "1":
cv.add()
case "2":
cv.Update()
case "3":
cv.Delete()
case "4":
cv.list()
case "5":
cv.exit()
default:
fmt.Println("您的输入有误, 请重新输入...")
}
if !cv.loop {
break
}
}
fmt.Println("您退出客户管理软件的使用...")
}
//退出系统
func (cv *CustomerView) exit() {
choice := ""
for {
fmt.Println("确认是否退出(Y/N):")
fmt.Scanln(&choice)
if choice == "y" || choice == "n" || choice == "Y" || choice == "N" {
if choice == "y" || choice == "Y" {
cv.loop = false
return
}
return
}
}
}
操作控制层-customerService.go
package service
import (
"customermange/model"
)
//该CustomerService , 完成对Customer的操作, 包括
//增删改查
type CustomerService struct {
customers []model.Customer
//声明一个字段, 表示当前切片含有多少个客户
//该字段后面, 还可以作为新客户的id+1
customerNum int
}
//编写一个方法, 可以返回*
func NewCustomerService() *CustomerService {
//为了能够看到有客户在切片中, 我们初始化一个客户
customerService := &CustomerService{}
customerService.customerNum = 1
customer := model.NewCustomer(1, "张三", "男", 20, "112", "zs@syuee.com")
customerService.customers = append(customerService.customers, customer)
return customerService
}
//返回客户切片
func (cs *CustomerService) List() []model.Customer {
return cs.customers
}
//添加客户倒customers切片
func (cs *CustomerService) Add(customer model.Customer) bool {
// 我们确定一个分配id的规则就是添加的顺序
cs.customerNum++
customer.Id = cs.customerNum
cs.customers = append(cs.customers, customer)
return true
}
//根据id删除客户(从切片中删除)
func (cs *CustomerService) Delete(id int) bool {
index := cs.FindById(id)
//如果index == -1 , 说明没有这个客户
if index == -1 {
return false
}
//如何从切片中删除一个元素
cs.customers = append(cs.customers[:index], cs.customers[index+1:]...)
return true
}
func (cs *CustomerService) Update(c model.Customer) bool {
index := cs.FindById(c.Id)
//如果index == -1 , 说明没有这个客户
if index == -1 {
return false
}
cs.customers[index] = c
return true
}
//根据id查找客户在切片中对应下标, 如果没有该客户, 返回-1
func (cs *CustomerService) FindById(id int) int {
index := -1
//遍历cs.customers切片
for i := 0; i < len(cs.customers); i++ {
if cs.customers[i].Id == id {
//找到id
index = i
}
}
return index
}
模型定义层-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 NewCustomerTwo(name string, gender string, age int, phone string, email string) Customer {
return Customer{
Name: name,
Gender: gender,
Age: age,
Phone: phone,
Email: email,
}
}
//返回用户的信息
func (this Customer) GetInfo() string {
info := fmt.Sprintf("%v\t%v\t%v\t%v\t%v\t%v\t", this.Id, this.Name, this.Gender, this.Age, this.Phone, this.Email)
return info
}