Go项目-客户信息管理系统
Go项目-客户信息管理系统
项目开发流程
项目需求说明
- 模拟实现基于文本界面的《客户信息管理软件》。
- 该软件能够实现对客户对象的插入、修改和删除(用切片实现),并能够打印客户明细表
项目代码编写
编写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/