Go项目-客户信息管理系统

Go项目-客户信息管理系统

项目开发流程

xHx5Pe.md.png

项目需求说明

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

项目代码编写

编写Customer.go

主要是用于表示一个客户的信息,包含结构体以及在其他地方如果调用它的工厂模式的方法

package model

import "fmt"

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

// 工厂模式返回Customer的结构体,在CustomerService里面使用
// 感觉就是新建一个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 (cu *Customer) GetInfo() string {
	return fmt.Sprintf("%v\t%v\t%v\t%v\t%v\t%v", cu.Id, cu.Name, cu.Gender, cu.Age, cu.Phone, cu.Email)
}

以及如果我们要返回一个客户的信息,操作也是在Customer的实例上进行的,因此后面的方法也要写在这个结构体的下面

完成对Customer结构体的操作的代码在CustomerService里面,定义另外一个结构体,里面包含一个切片,存储全部实例化的Customer

// 完成对Customer的操作,包括增删改查
type CustomerService struct {
	// 存储当前的客户
	Customers []model.Customer
	// 声明一个字段,表示当前切片含有多少个客户
	CustomerNum int
}

主界面 customerView.go

主菜单:

func (cv *CustomerView) MainMenu() {
	for {
		var username, password string
		fmt.Print("请输入用户名:")
		fmt.Scanln(&username)
		fmt.Print("请输入密码:")
		fmt.Scanln(&password)
		if cv.login(username, password) {
			break
		} else {
			fmt.Println("用户名或密码错误!")
		}
	}
	// 显示主菜单
	for cv.loop {
		fmt.Println("\n---------------------客户信息管理软件---------------------")
		fmt.Println("                         1 添加客户")
		fmt.Println("                         2 修改客户")
		fmt.Println("                         3 删除客户")
		fmt.Println("                         4 客户列表")
		fmt.Println("                         5 退    出")
		fmt.Print("请选择(1-5):")
		// 接收用户的输入
		fmt.Scanln(&cv.key)
		// 对用户的输入进行判断
		switch cv.key {
		case "1":
			cv.addCustomer()
		case "2":
			cv.changeCustomer()
		case "3":
			cv.deleteCustomer()
		case "4":
			cv.showCustomer()
		case "5":
			cv.exit()
		default:
			fmt.Println("请输入正确的选项------")
		}
	}
}

主菜单里面有的变量是需要定义在结构体中的

type CustomerView struct {
	key             string                   // 接收用户输入
	loop            bool                     // 表示是否循环的显示主菜单
	username        string                   // 用户的用户名
	password        string                   // 用户的密码
	customerService *service.CustomerService // 获取用户服务
}

同时也编写一个工厂模式的方法,方便main.go文件进行调用

func NewCustomerView() *CustomerView {
	return &CustomerView{
		key:             "",
		loop:            true,
		username:        "admin",
		password:        "password",
		customerService: service.NewCustomerService(),
	}
}

main.go:

package main

import (
	"Go-Projects/Customer-Management-System/view"
)

func main() {
	view.NewCustomerView().MainMenu()
}

完成增删改查的功能

要注意,全部的功能实现细节都应该是在customerService里面进行编写的,customerView.go 文件只负责调用,并对返回的结果进行判断等。

首先要对CustomerService进行初始化,也是相当于工厂模式了

// 初始化CustomerService
func NewCustomerService() *CustomerService {
	customerService := &CustomerService{} // 初始化
	customerService.CustomerNum = 0
	return customerService
}

展示客户列表

func (cv *CustomerView) showCustomer() {
	if cv.customerService.CustomerNum == 0 {
		fmt.Println("没有客户!")
		return
	}
	fmt.Println("\n-------------------------客户列表-------------------------")
	fmt.Println("编号\t姓名\t性别\t年龄\t电话\t电子邮件")
	for _, eachCustomer := range cv.customerService.ShowCustomerSlice() {
		fmt.Println(eachCustomer.GetInfo())
	}
}
func (cs *CustomerService) ShowCustomerSlice() []model.Customer {
	return cs.Customers
}

添加客户

对切片增加一个客户的实例,然后将记录的数量+1

func (cv *CustomerView) addCustomer() {
	id := cv.customerService.CustomerNum + 1
	var name, gender, phone, email string
	var age int
	fmt.Print("请输入姓名:")
	fmt.Scanln(&name)
	fmt.Print("请输入性别:")
	fmt.Scanln(&gender)
	fmt.Print("请输入年龄:")
	fmt.Scanln(&age)
	fmt.Print("请输入电话:")
	fmt.Scanln(&phone)
	fmt.Print("请输入电子邮件:")
	fmt.Scanln(&email)

	if cv.customerService.AddCustomer(*model.NewCustomer(id, name, gender, age, phone, email)) {
		fmt.Println("-------------------------添加成功-------------------------")
	} else {
		fmt.Println("-------------------------添加失败-------------------------")
	}
}
func (cs *CustomerService) AddCustomer(customer model.Customer) bool {
	cs.Customers = append(cs.Customers, customer)
	cs.CustomerNum += 1
	return true
}

删除客户

根据客户的ID寻找客户在切片中的位置,然后将它删除即可。

func (cv *CustomerView) changeCustomer() {
	var id int
	fmt.Print("请输入修改的ID号:")
	fmt.Scanln(&id)
	if cv.customerService.ChangeCustomer(id) {
		fmt.Println("-------------------------修改成功-------------------------")
	} else {
		fmt.Println("-------------------------添加失败-------------------------")
	}
}
func (cs *CustomerService) DeleteCustomer(id int) bool {
	for index, cus := range cs.Customers {
		if cus.Id == id {
			cs.Customers = append(cs.Customers[:index], cs.Customers[index+1:]...)
			cs.CustomerNum -= 1
			return true
		}
	}
	return false
}

修改客户

根据客户的ID寻找客户在切片中的位置,然后修改需要修改的字段即可。

func (cv *CustomerView) changeCustomer() {
	var id int
	fmt.Print("请输入修改的ID号:")
	fmt.Scanln(&id)
	if cv.customerService.ChangeCustomer(id) {
		fmt.Println("-------------------------修改成功-------------------------")
	} else {
		fmt.Println("-------------------------添加失败-------------------------")
	}
}
func (cs *CustomerService) ChangeCustomer(id int) bool {

	reader := bufio.NewReader(os.Stdin) // 标准输入输出

	for index, cus := range cs.Customers {
		if cus.Id == id {

			fmt.Printf("请输入修改的姓名(%v):", cus.Name)
			name, _ := reader.ReadString('\n')
			name = strings.TrimSpace(name)
			if len(name) != 0 {
				cs.Customers[index].Name = name
			}

			fmt.Printf("请输入修改的性别(%v):", cus.Gender)
			gender, _ := reader.ReadString('\n')
			gender = strings.TrimSpace(gender)
			if len(gender) != 0 {
				cs.Customers[index].Gender = gender
			}

			fmt.Printf("请输入修改的年龄(%v):", cus.Age)
			age, _ := reader.ReadString('\n')
			age = strings.TrimSpace(age)
			if len(age) != 0 {
				t, _ := strconv.ParseInt(age, 10, 64)
				cs.Customers[index].Age = int(t)
			}

			fmt.Printf("请输入修改的电话(%v):", cus.Phone)
			phone, _ := reader.ReadString('\n')
			phone = strings.TrimSpace(phone)
			if len(phone) != 0 {
				cs.Customers[index].Phone = phone
			}

			fmt.Printf("请输入修改的电子邮件(%v):", cus.Email)
			email, _ := reader.ReadString('\n')
			email = strings.TrimSpace(email)
			if len(email) != 0 {
				cs.Customers[index].Email = email
			}

			return true
		}
	}
	return false
}

修改的时候回车表示对这个字段不修改,因此要调一个reader的包来完成这个工作,自己无法作出这种判断。

完整源代码

.
├── Customer-Management-System
│ ├── main
│ │ └── main.go
│ ├── model
│ │ └── customer.go
│ ├── service
│ │ └── customerService.go
│ └── view
│ └── customerView.go

main.go

package main

import (
	"Go-Projects/Customer-Management-System/view"
)

func main() {
	view.NewCustomerView().MainMenu()
}

customer.go

package model

import "fmt"

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

// 工厂模式返回Customer的结构体,在CustomerService里面使用
// 感觉就是新建一个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 (cu *Customer) GetInfo() string {
	return fmt.Sprintf("%v\t%v\t%v\t%v\t%v\t%v", cu.Id, cu.Name, cu.Gender, cu.Age, cu.Phone, cu.Email)
}

customerService.go

package service

import (
	"Go-Projects/Customer-Management-System/model"
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

// 完成对Customer的操作,包括增删改查
type CustomerService struct {
	// 存储当前的客户
	Customers []model.Customer
	// 声明一个字段,表示当前切片含有多少个客户
	CustomerNum int
}

// 初始化CustomerService
func NewCustomerService() *CustomerService {
	customerService := &CustomerService{} // 初始化
	customerService.CustomerNum = 0
	return customerService
}

func (cs *CustomerService) ShowCustomerSlice() []model.Customer {
	return cs.Customers
}

func (cs *CustomerService) AddCustomer(customer model.Customer) bool {
	cs.Customers = append(cs.Customers, customer)
	cs.CustomerNum += 1
	return true
}

func (cs *CustomerService) DeleteCustomer(id int) bool {
	for index, cus := range cs.Customers {
		if cus.Id == id {
			cs.Customers = append(cs.Customers[:index], cs.Customers[index+1:]...)
			cs.CustomerNum -= 1
			return true
		}
	}
	return false
}

func (cs *CustomerService) ChangeCustomer(id int) bool {

	reader := bufio.NewReader(os.Stdin) // 标准输入输出

	for index, cus := range cs.Customers {
		if cus.Id == id {

			fmt.Printf("请输入修改的姓名(%v):", cus.Name)
			name, _ := reader.ReadString('\n')
			name = strings.TrimSpace(name)
			if len(name) != 0 {
				cs.Customers[index].Name = name
			}

			fmt.Printf("请输入修改的性别(%v):", cus.Gender)
			gender, _ := reader.ReadString('\n')
			gender = strings.TrimSpace(gender)
			if len(gender) != 0 {
				cs.Customers[index].Gender = gender
			}

			fmt.Printf("请输入修改的年龄(%v):", cus.Age)
			age, _ := reader.ReadString('\n')
			age = strings.TrimSpace(age)
			if len(age) != 0 {
				t, _ := strconv.ParseInt(age, 10, 64)
				cs.Customers[index].Age = int(t)
			}

			fmt.Printf("请输入修改的电话(%v):", cus.Phone)
			phone, _ := reader.ReadString('\n')
			phone = strings.TrimSpace(phone)
			if len(phone) != 0 {
				cs.Customers[index].Phone = phone
			}

			fmt.Printf("请输入修改的电子邮件(%v):", cus.Email)
			email, _ := reader.ReadString('\n')
			email = strings.TrimSpace(email)
			if len(email) != 0 {
				cs.Customers[index].Email = email
			}

			return true
		}
	}
	return false
}

customerView.go

package view

import (
	"Go-Projects/Customer-Management-System/model"
	"Go-Projects/Customer-Management-System/service"
	"fmt"
)

type CustomerView struct {
	key             string                   // 接收用户输入
	loop            bool                     // 表示是否循环的显示主菜单
	username        string                   // 用户的用户名
	password        string                   // 用户的密码
	customerService *service.CustomerService // 获取用户服务
}

func NewCustomerView() *CustomerView {
	return &CustomerView{
		key:             "",
		loop:            true,
		username:        "admin",
		password:        "password",
		customerService: service.NewCustomerService(),
	}
}

func (cv *CustomerView) login(username, password string) bool {
	if username == cv.username && password == cv.password {
		return true
	}
	return false
}

func (cv *CustomerView) addCustomer() {
	id := cv.customerService.CustomerNum + 1
	var name, gender, phone, email string
	var age int
	fmt.Print("请输入姓名:")
	fmt.Scanln(&name)
	fmt.Print("请输入性别:")
	fmt.Scanln(&gender)
	fmt.Print("请输入年龄:")
	fmt.Scanln(&age)
	fmt.Print("请输入电话:")
	fmt.Scanln(&phone)
	fmt.Print("请输入电子邮件:")
	fmt.Scanln(&email)

	if cv.customerService.AddCustomer(*model.NewCustomer(id, name, gender, age, phone, email)) {
		fmt.Println("-------------------------添加成功-------------------------")
	} else {
		fmt.Println("-------------------------添加失败-------------------------")
	}
}

func (cv *CustomerView) changeCustomer() {
	var id int
	fmt.Print("请输入修改的ID号:")
	fmt.Scanln(&id)
	if cv.customerService.ChangeCustomer(id) {
		fmt.Println("-------------------------修改成功-------------------------")
	} else {
		fmt.Println("-------------------------添加失败-------------------------")
	}
}

func (cv *CustomerView) deleteCustomer() {
	var id int
	fmt.Print("请输入删除的ID号:")
	fmt.Scanln(&id)
	if cv.customerService.DeleteCustomer(id) {
		fmt.Println("-------------------------删除成功-------------------------")
	} else {
		fmt.Println("-------------------------删除失败-------------------------")
	}
}

func (cv *CustomerView) showCustomer() {
	if cv.customerService.CustomerNum == 0 {
		fmt.Println("没有客户!")
		return
	}
	fmt.Println("\n-------------------------客户列表-------------------------")
	fmt.Println("编号\t姓名\t性别\t年龄\t电话\t电子邮件")
	for _, eachCustomer := range cv.customerService.ShowCustomerSlice() {
		fmt.Println(eachCustomer.GetInfo())
	}
}

func (cv *CustomerView) exit() {
	var choice byte
	for {
		fmt.Print("确定退出?(y/n):")
		fmt.Scanf("%c\n", &choice)
		if choice == 'y' {
			cv.loop = false
			break
		} else if choice == 'n' {
			break
		} else {
			fmt.Println("输入有误!!请重新输入")
		}
	}
}

func (cv *CustomerView) MainMenu() {
	for {
		var username, password string
		fmt.Print("请输入用户名:")
		fmt.Scanln(&username)
		fmt.Print("请输入密码:")
		fmt.Scanln(&password)
		if cv.login(username, password) {
			break
		} else {
			fmt.Println("用户名或密码错误!")
		}
	}
	// 显示主菜单
	for cv.loop {
		fmt.Println("\n---------------------客户信息管理软件---------------------")
		fmt.Println("                         1 添加客户")
		fmt.Println("                         2 修改客户")
		fmt.Println("                         3 删除客户")
		fmt.Println("                         4 客户列表")
		fmt.Println("                         5 退    出")
		fmt.Print("请选择(1-5):")
		// 接收用户的输入
		fmt.Scanln(&cv.key)
		// 对用户的输入进行判断
		switch cv.key {
		case "1":
			cv.addCustomer()
		case "2":
			cv.changeCustomer()
		case "3":
			cv.deleteCustomer()
		case "4":
			cv.showCustomer()
		case "5":
			cv.exit()
		default:
			fmt.Println("请输入正确的选项------")
		}
	}
}

Go项目-客户信息管理系统
https://zhangzhao219.github.io/2022/11/03/Go/Go-Project-Customer-Management-System/
作者
Zhang Zhao
发布于
2022年11月3日
许可协议