Go语言 客户管理系统功能完善

  • 项目功能实现-添加客户的功能
功能说明:
思路分析:
customerService文件是完成对客户完成增删改查的操作,所以我们要在该文件中编写Add方法将新的客户添加到customer切片中去,同时在customerView文件中编写add方法去调用customerService中的Add方法完成客户的添加

代码实现:

在Add方法中我们需要将customer切片当做参数传入,因为在上面操作中customer实例已经在customerView层中构建好了,因此我们现在需要做的就是将新的customer加到customer切片中去

func (this *CustomerService) Add(customers Customer) {
	this.customers = append(this.customers,customers)
	return true
}

接下来就是编写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 := ""

需要注意的是在构建新的customer实例时,id是唯一的,不能让客户输入,应当由系统分配,但在customer文件中我们返回的Customer实例是带id的,因此我们需要另一种创建Customer实例不带id的方法,只需做简单的修改,将含有的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,
	}
}

现在的问题是我们的customer是不带id的,在调用Add方法时需要给客户分配一个id,所以我们需要修改customerService文件中的Add方法,在该方法中我们要确定一个分配id的规则,就是添加的 顺序,要想实现该操作可以使用我们之前在CustomerService结构体中定义的customerNum字段,通过该变量不断自加赋值给id来实现

func (this *CustomerService) Add(customers model.Customer) {
	this.customerNum++
	customer.Id = this.customerNum
	this.customers = append(this.customers,customers)
	return true
}

然后再在customerView中做些修改

if this.customerService.Add(customer) {
		fmt.Println("---------------------添加完成---------------------")
	} else {
		fmt.Println("---------------------添加失败---------------------")
	}

运行后报错:undefined: customer,经检查代码后发现Add方法中传入的参数不是customers而是customer,传入的是model文件中的结构体变量而不是customers切片,运行后还是报错undefined: customers,检查代码后发现在append语句中拼接的也应是customer变量

  • 项目功能实现-完成删除客户的功能
功能说明:

思路分析:
在customerService添加一个Delete方法,并传入一个id参数,但我们在删除的时候需要查找id是否存在,因此我们还需要编写一个FindById方法,同时也传入一个id参数并返回id对应的切片下标,在此需要注意的是客户的id和对应的切片的下标不一定相等,然后和上面操作类似,在customerView文件中编写delete方法去调用customerService中的Delete方法完成客户的删除
代码实现:
在customerService编写FindById方法,根据id查找客户在切片中对应下标,如果没有该客户,返回-1,主题是通过for循环遍历customers切片
//根据id查找客户在切片中对应下标,如果没有该客户,返回-1
func (this *CustomerService) FindById(id int) int {
	index := -1
	for i := 0; i < len(this.customers); i++ {
		if this.customers[i].Id = id
		index = id
	}
	return index
}

然后编写Delete方法,根据id从切片中删除客户,通过一个index接收上个方法的返回值并用if语句判断,重点在于如何从切片在删除一个元素

//根据id从切片中删除客户
func (this *CustomerService) Delete(id int) bool {
	index := this.FindById(id)
	if index == -1 {
		return false
	}
	//从切片中删除一个元素
	this.customers = append(this.customers[:index], this.customers[index+1:]...)
	return true
}

接下来就是在customerView文件中编写delete方法,该函数得到用户输入的id,删除该id对应的客户

//得到用户输入的id,删除该id对应的客户
func (this *customerView) delete() {
	fmt.Println("---------------------删除客户---------------------")
	fmt.Println("请输入待删除的客户编号(-1表示退出):")
	id := -1
	fmt.Scanln(&id)
	if id == -1 {
		return
	}
	fmt.Println("确认是否删除(Y/N):")
	choice := ""
	fmt.Scanln(&choice)
	if choice == y && choice == Y {
		if this.customerService.Delete(id) {
			fmt.Println("---------------------删除完成---------------------")
		}else{
			fmt.Println("--------------删除失败,输入的id不存在--------------")
		}
	}
}

运行后报错:cannot use assignment (index) = (i) as value,检查代码后发现是if语句的{}没有将index = i括起来,运行后发现无论输入多少id和任何字母都直接退出删除客户,检查代码后发现实因为错将||打成&&

  • 项目功能实现-完善退出确认功能
功能说明:
要求用户在退出时提示 " 确认是否退出 (Y/N) " ,用户必须输入 y/n, 否则循环提示。
思路分析:
编写 customerView.go,在家庭记账软件中实现过此功能,将其封装成方法
代码实现:
func (this *customerView) exit() {
	fmt.Println("你确定要退出吗? y/n")
	choice := ""
	for {
		fmt.Scanln(&choice)
		if choice == "y" || choice == "n" || choice == "Y" || choice == "N"{
			break
		}
		fmt.Println("你的输入有误,请重新输入 y/n")
	}
	if choice == "y" || choice == "Y" {
		this.loop = false
	}
}

  • 项目功能实现-完成修改客户功能
功能说明:
思路分析:
在customerService添加一个Update方法,同时传入新的customer结构体变量作为参数,这个customer应当含有id字段,并判断id对应的customer是否存在,通过append方法拼接新的用户到customers切片中去
func (this *CustomerService) Update(customer model.Customer) bool {
	index := this.FindById(customer.Id)
	if index == -1 {
		return false
	}
	this.customers = append(append(this.customers[:index], customer), this.customers[index+1:]...)
	return true
}
然后在 customerView文件中编写update函数,得到用户输入的信息,构建新的用户去覆盖旧的用户信息,和添加用户功能类似
//得到用户的输入,修改对应Id的客户
func (this *customerView) update() {
	fmt.Println("---------------修改客户---------------")
	fmt.Print("请选择修改客户的编号(-1退出):")
	id := -1
	fmt.Scanln(&id)
	if id == -1 {
		return
	}
 
	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 := model.NewCustomer(id, name, gender, age, phone, email)
	if this.customerService.Update(customer) {
		fmt.Println("---------------修改成功---------------")
	} else {
		fmt.Println("---------------修改失败---------------")
	}
}

但是通过这种方式修改用户信息不能完成“直接回车表示不修改功能”,于是我查找到了另一种方法

//修改客户
func (this *CustomerService) Change(id int, customer model.Customer) bool {
	index := this.FindById(id)
	if index == -1 {
		fmt.Println("该编号对应的客户不存在")
		return false
	}
	customer.Id = id
	if customer.Age != 0 {
		this.customers[index].Age = customer.Age
	}
	if customer.Name != "" {
		this.customers[index].Name = customer.Name
	}
	if customer.Gender != "" {
		this.customers[index].Gender = customer.Gender
	}
	if customer.Phone != "" {
		this.customers[index].Phone = customer.Phone
	}
	if customer.Email != "" {
		this.customers[index].Email = customer.Email
	}
	return true
}
//修改客户
func (this *customerView) change() {
	fmt.Println("------------------修改客户------------------")
	fmt.Print("请选择待修改客户编号(-1退出):")
	id := -1
	fmt.Scanln(&id)
	if id == -1 {
		return
	}
	oldCustomer := this.customerService.GetinfoById(id)
	fmt.Printf("姓名(%v):", oldCustomer.Name)
	name := ""
	fmt.Scanln(&name)
	fmt.Printf("性别(%v):", oldCustomer.Gender)
	gender := ""
	fmt.Scanln(&gender)
	fmt.Printf("年龄(%v):", oldCustomer.Age)
	age := 0
	fmt.Scanln(&age)
	fmt.Printf("电话(%v):", oldCustomer.Phone)
	phone := ""
	fmt.Scanln(&phone)
	fmt.Printf("邮箱(%v):", oldCustomer.Email)
	email := ""
	fmt.Scanln(&email)
 
	//构建一个新的Customer实例
	customer := model.NewCustomer(0, name, gender, age, phone, email)
	if this.customerService.Change(id, customer) {
		fmt.Println("------------------修改完成------------------\n")
	} else {
		fmt.Println("------------------修改失败------------------\n")
	}
}

参考文章:【Golang】客户信息管理系统_豆豆花的博客-CSDN博客

golang学习(十六):客户信息管理系统_今晚吃饭了嘛的博客-CSDN博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Web 开发的世界里,敏捷才是王道。使用更少的费用和资源来更快地完成网站和网络应用,从而获得更多的竞争优势。此外,他们不仅希望快速完成 Web 开发,对可用性和用户体验的要求也很高。这需要开发更多的功能和高级编程语言来开发网站功能,例如 Golang。如果您正在寻找用于 Web 编程、移动开发、微服务和 ERP 系统的强大工具,我们相信,您应该切换到 Golang 的原因是:1. 简单性如果 Python 是迄今为止容易学习的编程语言,那么 Golang 甚至更简单。学习 Go 语言要比学习 Python 快得多。一些开发人员声称 Golang 几乎和 JavaScript 一样简单。 2. 高级编译能力Golang 是一个编译执行语言,它能够直接将代码编译成可执行的二进制机器码。Golang 静态地将所有依赖库和模块编译到到一个二进制文件中。你不再需要在服务器上安装任何依赖项——你所需要做的就是上传一个编译的文件,你的应用就可以简单的运行了。 3. 并发和性能Golang 并发模型能够确保更高的性能(性能甚至 2x、3x 的提升)。大多数现代编程语言都支持并发,但是 Golang 采用了更节省资源的方法。Golang 提供更高性能的goroutine模型来支持多线程,goroutine能够更加节省 CPU 和内存资源。所以 Golang 更有助于降低成本和资源 4. 框架和库的本地支持Golang sdk 提供了功能丰富的 api,因此不用过多的依赖第三方库就能很好的使用 Golang。当然,如果你需要的话,你可以下载很多工具和框架(Golang 周围的社区已经很强大很完善了),但是常用的 API 都已经内置到 Golang 核心库中了。这样可以加快整个 Golang Web 开发过程的速度,并且使您无需寻找任何第三方依赖。 5.  IDE 和调试Golang 创作者在创建具有先进调试工具和插件的先进的集成开发环境方面做得很好。这可以说是编程中最关键的方面,因为 IDE 会严重阻碍或加速开发过程。今天,当敏捷性给软件公司带来竞争优势时,伟大的 IDE 和调试工具是一个非常重要的优势。 6. 清晰的语法、它包含零不必要的组件。Go是建立在实用的头脑中的:而不是必须深入研究语言结构,开发者现在可以自由地专注于开发本身。本质上Golang 是非常务实的。 本课程基于电商业务,采用前后端分离方式进行构建和讲解,后端主要包括:Gin+Go-Micro以及前端主要包括Vue。由于内容比较多,课程会分模块讲解,包括用户服务模块、商品服务模块、订单服务模块、消息服务模块、支付服务模块、后台管理系统模块、营销中心模块、物流系统模块、搜索中心模块、智能推荐模块等等。本课程内容为用户服务模块,全套课程将多种经过工业界验证的成熟技术解决方案呈现给大家,本套课程拒绝枯燥的理论,全程代码实操,通过项目驱动的方式,让大家能够真实体验Go语言在工业界开发过程,帮助大家建立Go语言开发思维,学习本套课程全部内容你完全可以自主开发一套高性能高可用高扩展的Go电商系统。本套案例集后端+前台+测试+运维一体,多方位的带你熟悉Go语言开发的全过程。本课程包含的技术:开发工具为:GOLAND、WebStormGin+Go-Micro Vue+Nodejs+jQuery+ElmentUIRedisRabbitMQ等等
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值