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
}
posted @ 2022-09-14 17:29  白色的番茄  阅读(228)  评论(0编辑  收藏  举报