欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

go语言项目 - 客户信息关系系统

程序员文章站 2022-03-03 11:03:05
学习一门语言最好的方式就是通过一个实际的例子。通过这个实例,不仅可以进一步巩固golang的相关基础技能,同时,也能让我们加强自己的逻辑能力,从一步步的调用函数,掌握参数传递和接收技巧。 项目2 客户信息关系系统 该项目很好的展示了基于面向对象的增删改查功能的实现。 任何一个项目在敲代码之前都要做好 ......

学习一门语言最好的方式就是通过一个实际的例子。通过这个实例,不仅可以进一步巩固golang的相关基础技能,同时,也能让我们加强自己的逻辑能力,从一步步的调用函数,掌握参数传递和接收技巧。

项目2 - 客户信息关系系统

该项目很好的展示了基于面向对象的增删改查功能的实现。

任何一个项目在敲代码之前都要做好需求分析

项目需求分析

  1. 模拟实现基于文本界面的《客户信息管理软件》

  2. 该软件能够实现对客户对象的插入,修改和删除(用切片实现),并能够打印客户明细表

项目总体架构

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的实例
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 (cm customer) getinfo() string  {
	info := fmt.sprintf("%v\t%v\t%v\t%v\t%v\t%v\t", cm.id, cm.name, cm.gender, cm.age, cm.phone, cm.email)
	return info
}

customerservice.go

package service

import "2020-04-08/customermanage/model"
//该customerservice 完成对customer的操作,包括增删改查
type customerservice struct {
	customers []model.customer
	//声明一个字段,表示当前切片含有多少个客户
	//该字段后面,还可以作为新客户的id + 1
	customerid int
}

//编写一个方法,可以返回*customerservice
func newcustomerservice() *customerservice  {
	//为了能够看到有客户在切片中,初始化一个客户
	customerservice := &customerservice{}
	customerservice.customerid = 1
	customer := model.newcustomer(1, "紫色飞猪","男",22,"00000000000","zisefeizhu@qq.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.customerid++
	customer.id = cs.customerid
	cs.customers = append(cs.customers, customer)
	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 {
			//找到
			index = i
		}
	}
	return index
}

//删除用户
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) getinfobyid(id int) model.customer  {
	i := id - 1
	return cs.customers[i]
}

//根据id修改客户信息
func (cs *customerservice) update(id int, customer model.customer) bool {
	for i := 0; i < len(cs.customers); i++ {
		if cs.customers[i].id == id {
			cs.customers[i].name = customer.name
			cs.customers[i].gender = customer.gender
			cs.customers[i].age = customer.age
			cs.customers[i].phone = customer.phone
			cs.customers[i].email = customer.email
		}
	}
	return true
}

customerview.go

package main

import (
	"2020-04-08/customermanage/model"
	"2020-04-08/customermanage/service"
	"fmt"
)

type customerview struct {
	//定义必要字段
	key string //接受用户输入
	loop bool  //表示是否循环的显示主菜单
	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.println("------------------客户列表------------------")
}

//得到用户的输入信息构成新的客户,并完成添加
func (cv *customerview) add() {
	fmt.println("------------------添加客户------------------")
	fmt.print("姓名:")
	name := ""
	fmt.scanln(&name)
	fmt.print("性别:")
	gender := ""
	fmt.scanln(&gender)
	fmt.print("年龄:")
	age := 0
	fmt.scanln(&age)
	fmt.print("电话:")
	phone := ""
	fmt.scanln(&phone)
	fmt.print("电邮:")
	email := ""
	fmt.scanln(&email)
	//构建一个新的customer实例
	//注意id号,没有让用户输入,id是唯一的,需要系统分配
	customer := model.newcustomer2(name, gender, age, phone, email)
	//调用
	if cv.customerservice.add(customer) {
		fmt.println("------------------添加完成------------------")
	} else {
		fmt.println("------------------添加失败------------------")
	}
}

//得到用户的输入id,删除该id对应的客户
func (cv *customerview) delete()  {
	fmt.println("------------------删除客户------------------")
	fmt.print("请选择等待删除客户编号(-1退出):")
	id := -1
	fmt.scanln(&id)
	if id == -1 {
		return   //放弃删除操作
	}
	fmt.print("确认是否删除(y/n):")
	//这里可以加入一个循环判断,直到用户输入y或者n,才退出...
	choice := ""
	fmt.scanln(&choice)
	if choice == "y" || choice == "y" {
		//调用customerservice的delete方法
		if cv.customerservice.delete(id) {
			fmt.println("------------------删除完成------------------")
		} else {
			fmt.println("------------------删除失败,输入的id号不存在")
		}
	}
}

//得到用户的输入id,修改该id对应的客户
func (cv *customerview) update() {
	cv.list()
	fmt.println()
	fmt.println("------------------修改客户------------------")
	fmt.print("请选择等待修改客户编号(-1退出):")
	id := -1
	fmt.scanln(&id)
	if id == -1 {
		return   //放弃删除操作
	}
	fmt.print("确认是否修改(y/n):")
	//这里可以加入一个循环判断,直到用户输入y或者n,才退出...
	choice := ""
	fmt.scanln(&choice)
	if choice == "y" || choice == "y" {
		//调用customerservice的delete方法
		if cv.customerservice.findbyid(id) != -1 {
			customer := cv.customerservice.getinfobyid(id)
			fmt.printf("姓名(%v:)", customer.name)
			name := ""
			fmt.scanln(&name)
			fmt.printf("性别(%v):", customer.gender)
			gender := ""
			fmt.scanln(&gender)
			fmt.printf("年龄(%v):", customer.age)
			age := 0
			fmt.scanln(&age)
			fmt.printf("电话(%v):", customer.phone)
			phone := ""
			fmt.scanln(&phone)
			fmt.printf("邮箱(%v):", customer.email)
			email := ""
			fmt.scanln(&email)
			customer2 := model.newcustomer2(name, gender, age, phone, email)
			cv.customerservice.update(id, customer2)
			fmt.println("------------------修改完成------------------")
		} else {
			fmt.println("------------------修改失败,输入的id号不存在")
		}
	}
}

//退出
func (cv *customerview) logout()  {
	fmt.print("确认是否退出(y/n):")
	for {
		fmt.scanln(&cv.key)
		if cv.key == "y" || cv.key =="y" || cv.key =="n" || cv.key =="n" {
			break
		}
		fmt.print("你的输入有误,确认是否退出(y/n): ")
	}
	if cv.key == "y" || cv.key == "y" {
		cv.loop = false
	}
}


//显示主菜单
func (cv *customerview) mainmenu()  {
	for {
		fmt.println("------------------客户信息管理软件------------------")
		fmt.println("                  1 添加客户")
		fmt.println("                  2 修改客户")
		fmt.println("                  3 删除客户")
		fmt.println("                  4 客户列表")
		fmt.println("                  5 退    出")
		//fmt.println("请选择(1 - 5):")   换行
		fmt.print("请选择(1 - 5):")
		fmt.scanln(&cv.key)
		switch cv.key {
		case "1":
			//fmt.println("添 加 客 户")
			cv.add()
		case "2":
			//fmt.println("修 改 客 户")
			cv.update()
		case "3":
			cv.delete()
		case "4":
			//fmt.println("客 户 列 表")
			cv.list()
		case "5":
			//cv.loop = false
			cv.logout()
		default:
			fmt.print("你的输入有误,请重新输入...")
		}
		if !cv.loop {
			break
		}
	}
	fmt.println("你已经退出了客户关系系统...")
}

func main()  {
	//在main函数中,创建一个customerview,并运行显示主菜单
	customerview := customerview{
		key:  "",
		loop: true,
	}
	//完成对customerview结构体的customerservice字段的初始化
	customerview.customerservice = service.newcustomerservice()
	//显示主菜单
	customerview.mainmenu()
}

验证

------------------客户信息管理软件------------------
                  1 添加客户
                  2 修改客户
                  3 删除客户
                  4 客户列表
                  5 退    出
请选择(1 - 5):4
------------------客户列表------------------
编号	姓名	性别	年龄	电话	邮箱
1	紫色飞猪	男	22	00000000000	zisefeizhu@qq.com	
------------------客户列表------------------
------------------客户信息管理软件------------------
                  1 添加客户
                  2 修改客户
                  3 删除客户
                  4 客户列表
                  5 退    出
请选择(1 - 5):1
------------------添加客户------------------
姓名:jingxing
性别:女
年龄:21
电话:00000000000
电邮:jingxing@qq.com
------------------添加完成------------------
------------------客户信息管理软件------------------
                  1 添加客户
                  2 修改客户
                  3 删除客户
                  4 客户列表
                  5 退    出
请选择(1 - 5):2
------------------客户列表------------------
编号	姓名	性别	年龄	电话	邮箱
1	紫色飞猪	男	22	00000000000	zisefeizhu@qq.com	
2	jingxing	女	21	00000000000	jingxing@qq.com	
------------------客户列表------------------

------------------修改客户------------------
请选择等待修改客户编号(-1退出):2
确认是否修改(y/n):n
------------------客户信息管理软件------------------
                  1 添加客户
                  2 修改客户
                  3 删除客户
                  4 客户列表
                  5 退    出
请选择(1 - 5):2
------------------客户列表------------------
编号	姓名	性别	年龄	电话	邮箱
1	紫色飞猪	男	22	00000000000	zisefeizhu@qq.com	
2	jingxing	女	21	00000000000	jingxing@qq.com	
------------------客户列表------------------

------------------修改客户------------------
请选择等待修改客户编号(-1退出):2
确认是否修改(y/n):y
姓名(jingxing:)jingxing
性别(女):女
年龄(21):22
电话(00000000000):00000000000
邮箱(jingxing@qq.com):jingxing@qq.com
------------------修改完成------------------
------------------客户信息管理软件------------------
                  1 添加客户
                  2 修改客户
                  3 删除客户
                  4 客户列表
                  5 退    出
请选择(1 - 5):4
------------------客户列表------------------
编号	姓名	性别	年龄	电话	邮箱
1	紫色飞猪	男	22	00000000000	zisefeizhu@qq.com	
2	jingxing	女	22	00000000000	jingxing@qq.com	
------------------客户列表------------------
------------------客户信息管理软件------------------
                  1 添加客户
                  2 修改客户
                  3 删除客户
                  4 客户列表
                  5 退    出
请选择(1 - 5):3
------------------删除客户------------------
请选择等待删除客户编号(-1退出):-1
------------------客户信息管理软件------------------
                  1 添加客户
                  2 修改客户
                  3 删除客户
                  4 客户列表
                  5 退    出
请选择(1 - 5):3
------------------删除客户------------------
请选择等待删除客户编号(-1退出):2
确认是否删除(y/n):n
------------------客户信息管理软件------------------
                  1 添加客户
                  2 修改客户
                  3 删除客户
                  4 客户列表
                  5 退    出
请选择(1 - 5):3
------------------删除客户------------------
请选择等待删除客户编号(-1退出):2
确认是否删除(y/n):y
------------------删除完成------------------
------------------客户信息管理软件------------------
                  1 添加客户
                  2 修改客户
                  3 删除客户
                  4 客户列表
                  5 退    出
请选择(1 - 5):4
------------------客户列表------------------
编号	姓名	性别	年龄	电话	邮箱
1	紫色飞猪	男	22	00000000000	zisefeizhu@qq.com	
------------------客户列表------------------
------------------客户信息管理软件------------------
                  1 添加客户
                  2 修改客户
                  3 删除客户
                  4 客户列表
                  5 退    出
请选择(1 - 5):5
确认是否退出(y/n):n
------------------客户信息管理软件------------------
                  1 添加客户
                  2 修改客户
                  3 删除客户
                  4 客户列表
                  5 退    出
请选择(1 - 5):5
确认是否退出(y/n):y
你已经退出了客户关系系统...

总结

此项目带给我的最重要意义是:什么时候需要* 什么时候不需要*

当需要修改结构体的变量内容的时候,方法传入的结构体变量参数需要使用指针,也就是结构体的地址。需要修改map中的架构体的变量的时候也需要使用结构体地址作为map的value。如果仅仅是读取结构体变量,可以不使用指针,直接传递引用即可。*type 这里的type这个变量存放的东西是地址,这点需要明确,需要使用&type获取到地址。