Go第 13 章 :2-客户信息关系系统

news2024/11/24 3:26:55

Go第 13 章 :2-客户信息关系系统

13.1 项目需求分析

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

13.2 项目的界面设计

主菜单界面

请添加图片描述

添加客户界面

请添加图片描述

删除客户界面

请添加图片描述

客户列表界面

请添加图片描述

13.3 客户关系管理系统的程序框架图

请添加图片描述

13.4 项目功能实现-显示主菜单和完成退出软件功能

请添加图片描述

代码实现

customerManage/model/customer.go

package model


//声明一个 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,
	}
}

customerManage/service/customerService.go

package service

import "go_code/go_code/chapter13/customerManage/model"

type CustomerService struct{
	customers []model.Customer
	//声明一个字段,表示当前切片含有多少个客户
	//该字段后面,还可以作为新客户的 id+1
	customerNum int
}

customerManage/view/customerView.go

package main

import "fmt"

type customerView struct{
	//定义必要字段
	key string//接收客户输入...
	loop bool//表示是否循环的显示主菜单
	//customerService *service.CustomerService
}
//显示主菜单
func (this *customerView) mainMenu(){
	for {
		fmt.Println("--------客户信息管理软件--------")
		fmt.Println("        1、添加客户")
		fmt.Println("        2、修改客户")
		fmt.Println("        3、删除客户")
		fmt.Println("        4、客户列表")
		fmt.Println("        5、退出")
		fmt.Println()
		fmt.Println("        请选择(1-5):")

		fmt.Scanln(&this.key)

		switch this.key {
		case "1":
			fmt.Println("添加客户")
		case "2":
			fmt.Println("修改客户")
		case "3":
			fmt.Println("删除客户")
		case "4":
			fmt.Println("客户客户")
		case "5":
			this.loop=false
		default:
			fmt.Println("你的输入有误,请重新输入...")
		}

		if !this.loop{
			break
		}

		fmt.Println("你退出了客户管理系统...")

	}
}

func main(){
	//在 main 函数中,创建一个 customerView,并运行显示主菜单..
	customerView:=customerView{
		key:"",
		loop:true,
	}
	//显示主菜单
	customerView.mainMenu()
}

13.5 项目功能实现-完成显示客户列表的功能

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
customerManage/view/customerView.go

package main

import (
	"fmt"
	"go_code/go_code/chapter13/customerManage/service"
)

type customerView struct {
	//定义必要字段
	key  string //接收客户输入...
	loop bool   //表示是否循环的显示主菜单
	//增加一个字段 customerService
	customerService *service.CustomerService
}

//显示所有客户信息
func (this *customerView) list() {
	customers := this.customerService.List()
	//显示
	fmt.Println("--------客户列表--------------")
	fmt.Println("编号\t姓名\t性别\t年龄\t电话\t邮箱")
	for i := 0; i < len(customers);i++ {
		//fmt.Println(customers[i].Id,"\t", customers[i].Name...)
		fmt.Println(customers[i].GetInfo())
	}
	fmt.Println("--------客户列表完成-----------")
}

//显示主菜单
func (this *customerView) mainMenu() {
	for {
		fmt.Println("--------客户信息管理软件--------")
		fmt.Println("        1、添加客户")
		fmt.Println("        2、修改客户")
		fmt.Println("        3、删除客户")
		fmt.Println("        4、客户列表")
		fmt.Println("        5、退出")
		fmt.Println()
		fmt.Println("        请选择(1-5):")

		fmt.Scanln(&this.key)

		switch this.key {
		case "1":
			fmt.Println("添加客户")
		case "2":
			fmt.Println("修改客户")
		case "3":
			this.list()
		case "4":
			fmt.Println("客户客户")
		case "5":
			this.loop = false
		default:
			fmt.Println("你的输入有误,请重新输入...")
		}

		if !this.loop {
			break
		}

		fmt.Println("你退出了客户管理系统...")

	}
}

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

13.6 项目功能实现-添加客户的功能

请添加图片描述
请添加图片描述
请添加图片描述
customerManage/service/customerService.go
请添加图片描述
customerManage/service/customerView.go

package main

import (
	"fmt"
	"go_code/go_code/chapter13/customerManage/model"
	"go_code/go_code/chapter13/customerManage/service"
)

type customerView struct {
	//定义必要字段
	key  string //接收客户输入...
	loop bool   //表示是否循环的显示主菜单
	//增加一个字段 customerService
	customerService *service.CustomerService
}

//显示所有客户信息
func (this *customerView) list() {
	customers := this.customerService.List()
	//显示
	fmt.Println("--------客户列表--------------")
	fmt.Println("编号\t姓名\t性别\t年龄\t电话\t邮箱")
	for i := 0; i < len(customers);i++ {
		//fmt.Println(customers[i].Id,"\t", customers[i].Name...)
		fmt.Println(customers[i].GetInfo())
	}
	fmt.Println("--------客户列表完成-----------")
}
//得到用户的输入,信息构建新的客户,并完成添加
func (this *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 号,没有让用户输入,id 是唯一的,需要系统分配
	custmoer:=model.NewCustomer2(name,gender,age,phone,email)
	//调用
	if this.customerService.Add(custmoer){
		fmt.Println("--------添加完成------------")
	}else{
		fmt.Println("--------添加失败------------")
	}
}

//显示主菜单
func (this *customerView) mainMenu() {
	for {
		fmt.Println("--------客户信息管理软件--------")
		fmt.Println("        1、添加客户")
		fmt.Println("        2、修改客户")
		fmt.Println("        3、删除客户")
		fmt.Println("        4、客户列表")
		fmt.Println("        5、退出")
		fmt.Println()
		fmt.Println("        请选择(1-5):")

		fmt.Scanln(&this.key)

		switch this.key {
		case "1":
			fmt.Println("添加客户")
		case "2":
			fmt.Println("修改客户")
		case "3":
			this.list()
		case "4":
			fmt.Println("客户客户")
		case "5":
			this.loop = false
		default:
			fmt.Println("你的输入有误,请重新输入...")
		}

		if !this.loop {
			break
		}

		fmt.Println("你退出了客户管理系统...")

	}
}

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

13.7 项目功能实现-完成删除客户的功能

请添加图片描述
请添加图片描述
customerManage/model/customer.go [没有变化]
customerManage/service/customerService.go
请添加图片描述

customerManage/view/customerView.go

func (this *customerView) delete() {
	flag:=false
	fmt.Println("--------删除客户------------")
	for {
		fmt.Println("请选择待删除客户编号(-1)退出:")
		id := -1
		fmt.Scanln(&id)
		if id == -1 {
			return //放弃删除操作
		}
		fmt.Println("确认是否删除(Y/N)")
		//这里同学们可以加入一个循环判断,直到用户输入y或者,才退出
		for {
			choice := ""
			fmt.Scanln(&choice)
			if choice == "y" || choice == "n" {
				if this.customerService.Delete(id) {
					fmt.Println("--------删除完成------------")
					flag=true
				} else {
					fmt.Println("--------删除失败,输入的id号不存在-")
				}
				break
			}
		}
		if flag{
			break
		}
	}
}

13.8 项目功能实现-完善退出确认功能(课后作业)

请添加图片描述

请添加图片描述

13.9 客户关系管理系统-课后练习

请添加图片描述

CustomerView.go

package main

import (
	"fmt"
	"go_code/go_code/chapter13/customerManage/model"
	"go_code/go_code/chapter13/customerManage/service"
)

type customerView struct {
	//定义必要字段
	key  string //接收客户输入...
	loop bool   //表示是否循环的显示主菜单
	//增加一个字段 customerService
	customerService *service.CustomerService
}

//显示所有客户信息
func (this *customerView) list() {
	customers := this.customerService.List()
	//显示
	fmt.Println("--------客户列表--------------")
	fmt.Println("编号\t姓名\t性别\t年龄\t电话\t邮箱")
	for i := 0; i < len(customers); i++ {
		//fmt.Println(customers[i].Id,"\t", customers[i].Name...)
		fmt.Println(customers[i].GetInfo())
	}
	fmt.Println("--------客户列表完成-----------")
}

//得到用户的输入,信息构建新的客户,并完成添加
func (this *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 号,没有让用户输入,id 是唯一的,需要系统分配
	custmoer := model.NewCustomer2(name, gender, age, phone, email)
	//调用
	if this.customerService.Add(custmoer) {
		fmt.Println("--------添加完成------------")
	} else {
		fmt.Println("--------添加失败------------")
	}
}
func (this *customerView) delete() {
	flag := false
	fmt.Println("--------删除客户------------")
	for {
		fmt.Println("请选择待删除客户编号(-1)退出:")
		id := -1
		fmt.Scanln(&id)
		if id == -1 {
			return //放弃删除操作
		}
		fmt.Println("确认是否删除(Y/N)")
		//这里同学们可以加入一个循环判断,直到用户输入y或者,才退出
		for {
			choice := ""
			fmt.Scanln(&choice)
			if choice == "y" || choice == "n" {
				if this.customerService.Delete(id) {
					fmt.Println("--------删除完成------------")
					flag = true
				} else {
					fmt.Println("--------删除失败,输入的id号不存在-")
				}
				break
			}
		}
		if flag {
			break
		}
	}
}
func (this *customerView) exit() {
	fmt.Println("确认是否退出(Y/N)")
	for {
		fmt.Scanln(&this.key)
		if this.key == "y" || this.key == "n" {
			break
		} else {
			fmt.Println("输入格式错误,请重新输入!")
		}
	}
	if this.key == "y" {
		this.loop = false
	}
}
func (this *customerView) update() {
	fmt.Println("----------------修改客户------------------")
	fmt.Println("客户id(-1退出):")
	id := -1
	fmt.Scanln(&id)
	if id == -1 {
		return // 放弃修改
	}

	//获取要修改的数据,并显示
	index := this.customerService.FindById(id)
	if index == -1 {
		fmt.Println("------------------客户id不存在------------------")
		return
	}
	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)

	fmt.Println("你确定要修改吗? y/n")
	choice := ""
	for {
		fmt.Scanln(&choice)
		if choice == "y" || choice == "n" {
			break
		}
		fmt.Println("你输入有误,请重新输入 y/n")
	}

	customer := model.NewCustomer2(name, gender, age, phone, email)

	//调用customerService.Update
	if this.customerService.Update(index, customer) {
		fmt.Println("------------------修改成功------------------")
	} else {
		fmt.Println("------------------修改失败------------------")
	}
}

//显示主菜单
func (this *customerView) mainMenu() {
	for {
		fmt.Println("--------客户信息管理软件--------")
		fmt.Println("        1、添加客户")
		fmt.Println("        2、修改客户")
		fmt.Println("        3、删除客户")
		fmt.Println("        4、客户列表")
		fmt.Println("        5、退出")
		fmt.Println()
		fmt.Println("        请选择(1-5):")

		fmt.Scanln(&this.key)

		switch this.key {
		case "1":
			this.add()
		case "2":
			this.update()
		case "3":
			this.delete()
		case "4":
			this.list()
		case "5":
			this.exit()
		default:
			fmt.Println("你的输入有误,请重新输入...")
		}

		if !this.loop {
			break
		}

		fmt.Println("你退出了客户管理系统...")

	}
}

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

CustomerService.go

package service

import (
	"go_code/go_code/chapter13/customerManage/model"
)

type CustomerService struct {
	customers []model.Customer
	//声明一个字段,表示当前切片含有多少个客户
	//该字段后面,还可以作为新客户的 id+1
	customerNum int
}

//编写一个方法,可以返回*CustmoerService
func NewCustomerService() *CustomerService {
	//为了能够看到有客户在切片中,我们初始化一个切片
	custmoerService := &CustomerService{}
	custmoerService.customerNum = 1
	custmoer := model.NewCustomer(1, "张三", "男",
		20, "112", "zhangsan@sohu.com")
	custmoerService.customers = append(custmoerService.customers, custmoer)
	return custmoerService
}

//返回客户切片
func (this *CustomerService) List() []model.Customer {
	return this.customers
}

//添加客户到切片
//!!!
func (this *CustomerService) Add(custmoer model.Customer) bool {
	this.customerNum++
	custmoer.Id = this.customerNum
	this.customers = append(this.customers, custmoer)
	return true
}
func (this *CustomerService) Delete(id int) bool {
	index := this.FindById(id)
	//如果index==-1,说明没有这个客户
	if index ==-1{
		return false
	}
	//如何从切片中删除一个元素
	this.customers=append(this.customers[:index],this.customers[index+1:]...)
	return true
}

func (this *CustomerService)Update(index int,customer model.Customer)bool{
	this.customers[index].Name= customer.Name
	this.customers[index].Age= customer.Age
	this.customers[index].Gender= customer.Gender
	this.customers[index].Phone= customer.Phone
	this.customers[index].Email= customer.Email
	return true
}
//根据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 = i
		}
	}
	return index
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/157666.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SegFormer笔记(1)安装

一、代码地址github地址&#xff1a;https://github.com/NVlabs/SegFormer二、我的系统配置&#xff1a;1、硬件2、软件win10&#xff0c;vs2022&#xff0c;python3.7三、创建虚拟环境conda create -n MySegFormer python3.7 numpy conda activate MySegFormer python会显示如…

【知识图谱工具汇总】

一&#xff0c;图表示学习与计算框架 1&#xff09;PyTorch Geometric&#xff08;PyG&#xff09; 由德国多特蒙德工业大学研究者推出的基于PyTorch的几何深度学习扩展库。PyG在学术中是比较热门的框架&#xff0c;但是PyG对于异构图以及大规模的图的学习存在着较大的局限性…

【UE4 第一人称射击游戏】39-“M4A1”武器设置

上一篇&#xff1a;【UE4 第一人称射击游戏】38-拾取“M4A1”的提示信息步骤&#xff1a;在“AK47”文件夹中拷贝一份“Weapon_Base”拷贝到“M4A1”文件夹下&#xff0c;重命名为“Weapon_M4A1”打开“Weapon_M4A1”&#xff0c;新添加一个网格体组件骨架网格体选择“M4A1_wea…

Linux编辑器-gcc/g++使用

目录 背景&#xff1a; 预处理&#xff1a; 编译&#xff1a; 汇编&#xff1a; 连接&#xff1a; 静态连接&#xff1a; 动态连接&#xff1a; 自动化编程make/makefile&#xff1a; 背景&#xff1a; 我们知道任何一个c语言或者c文件想要生成一个可执行程序必须完成4个…

NotepadAttr

EntityMyPKAttr目录概述需求&#xff1a;设计思路实现思路分析1.Notepads2.EntityMyPK3.EntityMyPKAttr4.EntitiesMyPK5.EntityMyPKEntityMyPKAttrEntitiesMyPKWebContralBaseAtParaCashChartType参考资料和推荐阅读Survive by day and develop by night. talk for import biz …

JS面试题--JS函数式编程

JS函数式编程 实现apply、call、bind 01_call函数的实现 // apply/call/bind的用法 // js模拟它们的实现? 难度// 给所有的函数添加一个hycall的方法 同个原型链 Function.prototype.hycall function (thisArg, ...args) {// 在这里可以去执行调用的那个函数(foo)// 问题: …

亚马逊云科技:“云”筹帷幄,打造数据驱动型企业

数据对提高企业生产和资源配置的效率、优化经济结构的作用日益凸显。工业和信息化部发布的《“十四五”大数据产业发展规划》已明确将数据作为新时代重要的生产要素和国家基础性战略资源。埃森哲研究显示&#xff0c;到2022年&#xff0c;90%的企业战略明确将把数据作为关键的企…

前端面试题回顾——React重要知识

文章目录React相关问题1. 函数式组件与Class组件有什么不同&#xff1f;2. 说说React的fiber架构&#xff1f;3. 协调4. 虚拟DOM (Virtual DOM)React相关问题 1. 函数式组件与Class组件有什么不同&#xff1f; 答&#xff1a; ① 函数式组件不需要继承&#xff0c;直接 “fun…

数据结构基础——认识数据结构与算法

目录 &#x1f354;什么是数据结构&#xff1f; &#x1f32d;1.数据的逻辑结构 &#x1f32d;NUM 1 : 集合 &#x1f32d;NUM 2 : 线性结构 &#x1f32d;NUM 2 : 树形结构 &#x1f32d;NUM 4 :图结构&#xff08;网状结构&#xff09;…

浅谈反弹shell

目录反弹shell总结一、文件描述符二、重定向1、输入重定向2、输出重定向3、错误输出重定向4、exec 绑定重定向三、实现反弹shell的几种方式方法一&#xff1a; find 反弹ubuntu find反弹shell失败的问题任务计划反弹shell失败的问题方法二&#xff1a;使用python反弹&#xff0…

Flink系列-4、Flink运行架构

版权声明&#xff1a;本文为博主原创文章&#xff0c;遵循 CC 4.0 BY-SA 版权协议&#xff0c;转载请附上原文出处链接和本声明。 大数据系列文章目录 官方网址&#xff1a;https://flink.apache.org/ 学习资料&#xff1a;https://flink-learning.org.cn/ 目录Flink基石Fli…

刚当上leader,我让组员去开会,他非说有更重要的会

☆ 职场上经常有那么一种情况就是组长喊组员开会&#xff0c;开周会&#xff0c;开晨会&#xff0c;开各种会&#xff0c;而更有一种常见的情况呢就是组长缺失威严&#xff0c;喊组员开会&#xff0c;组员不听话&#xff0c;说有更重要的会议&#xff0c;不想参加。 ☆ 本文将以…

VIT学习心得

来源&#xff1a;投稿 作者&#xff1a;橡皮 编辑&#xff1a;学姐 小声逼逼 在过去的两年里&#xff0c;Vision Transformer(ViT)是计算机视觉(cv)领域最有影响力的工作之一。「它推翻了2012年在Alex net中提出的CNN在CV领域的统治地位&#xff1a; 当能够获得足够多的预训练…

无接触式磁旋转编码器AS5040介绍

无接触式磁旋转编码器AS5040简介AS5040 是一款无接触式磁旋转编码器&#xff0c;用于精确测量整个360内的角度。此产品是一个片上系统&#xff0c;在单个封装内整合了集成式Hall 元件、模拟前端和数据信号处理功能。测量角度时&#xff0c;只需简单地配备1 个在芯片中心上方旋转…

Spring5的全细节回顾总结

概述&#xff1a; https://cntofu.com/book/95/33-what-new-in-the-spring-framework.md 这个不错。 轻量级javaee框架。 针对于bean的生命周期进行管理。 解决企业应用开发的复杂性。 核心&#xff1a; ​ IOC&#xff1a;控制反转&#xff0c;把创建对象的过程交给sprin…

第一天 Blender操作 | 大帅老猿threejs特训【超详细】

前言 这一天主要是基础理论的学习。 本人学习资料仓库 https://gitee.com/zhang_dezheng_hsr/three-demo.git YCY-TrainingCamp-S2: 在原有的文件上添加本人的学习记录 第一天 Blender操作 | 大帅老猿threejs特训【超详细】【我在掘金的同名文章】 一、大纲 二、THREE 基础概…

Linux查看某个应用的CPU/内存/网卡使用情况

1.查看CPU的使用率 # ps -ef | grep zabbix 进程号是1715 # top -p 1715 可以看到CPU的使用率是0 &#xff0c; 内存的使用率是0 2.查看内存真实使用了多少 #cat /proc/[pid]/status #cat /proc/1715/status VmPeak:进程所使用的虚拟内存的峰值 VmSize: 进程当前使用…

22.字符串初始化方法及赋值,字符串和指针总结

目录 初始化 1.字符数组初始化 2.指针指向文字常量区&#xff0c;初始化 3.指针指向堆区&#xff0c;堆区存放字符串 使用时赋值 1.字符数组&#xff0c;使用scanf或者strcpy 2.指针指向文字常量区 3.指针指向堆区&#xff0c;堆区存放字符串 初始化 1.字符数组初始化 …

各国家语言代码对照表

来源如下 Language Code Tablehttp://www.lingoes.cn/zh/translator/langcode.htm 详情如下 语言代码语言名称af南非语af-ZA南非语ar阿拉伯语ar-AE阿拉伯语(阿联酋)ar-BH阿拉伯语(巴林)ar-DZ阿拉伯语(阿尔及利亚)ar-EG阿拉伯语(埃及)ar-IQ阿拉伯语(伊拉克)ar-JO阿拉伯语(约旦…

万字详解 Linux 网络管理

万字详解 Linux 网络管理1.Linux处理数据包过程2.和网络相关的几个文件说明网卡配置文件ifcfg-*DNS配置文件/etc/resolv.conf&#xff08;CentOS6环境&#xff09;/etc/services3.网络接口配置和主机名ifconfigifcfghostname命令4.网关/路由5.网关/路由相关命令route命令配置永…