[GO Language Fundamentals] Go Project Actual Combat: Realizing Customer Information Relationship System (17)

demand analysis

  1. Simulate the realization of "Customer Information Management Software" based on the text interface.
  2. The software can insert, modify and delete customer objects (implemented by slices), and can print customer schedules

interface design

主菜单界面
	-----------------客户信息管理软件-----------------

                1 添 加 客 户
                2 修 改 客 户
                3 删 除 客 户
                4 客 户 列 表
                5 退           出

                请选择(1-5):_

添加客户界面
	---------------------添加客户---------------------
                姓名:张三
                性别:男
                年龄:18
                电话:13012345678
                邮箱:[email protected]

    ---------------------添加客户成功---------------------

修改客户界面
	---------------------修改客户---------------------
        请选择待修改客户编号(-1退出):1

                姓名(张三):
                性别(男):
                年龄(18):
                电话(13012345678):
                邮箱([email protected]):

    ---------------------添加客户成功---------------------

删除客户界面
	---------------------删除客户---------------------
    	请选择待删除客户编号(-1退出):1
    	确认是否删除(Y/N):y
    	---------------------删除完成---------------------

客户列表界面
	---------------------------客户列表---------------------------
    编号    姓名    性别    年龄    电话    邮箱


    ---------------------------客户列表完成---------------------------

Program frame diagram

customerView.go
1. 显示界面
2. 接收用户的输入
3. 根据用户的输入调用service方法
customerService.go
1. 完成对用户的各种操作
2. 对客户的增删改查
3. 会声明一个customer的切片
customer.go
1. 表示一个客户
2. 客户的各种字段(属性)

Code

  • customerManage/model/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 (this Customer) GetInfo()  string {
        info := fmt.Sprintf("%v\t%v\t%v\t%v\t%v\t%v\t", this.Id, 
            this.Name, this.Gender,this.Age, this.Phone, this.Email)
        return info

    }
  • customerManage/service/customerService.go
    package service
    import (
        "customerManage/model"
    )
    //该CustomerService, 完成对Customer的操作,包括
    //增删改查
    type CustomerService struct {
        customers []model.Customer
        //声明一个字段,表示当前切片含有多少个客户
        //该字段后面,还可以作为新客户的id+1
        customerNum int 
    }

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

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

    //添加客户到customers切片
    //!!!
    func (this *CustomerService) Add(customer model.Customer) bool {

        //我们确定一个分配id的规则,就是添加的顺序
        this.customerNum++
        customer.Id = this.customerNum
        this.customers = append(this.customers, customer)
        return true
    }

    //根据id删除客户(从切片中删除)
    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
    }

    //根据id查找客户在切片中对应下标,如果没有该客户,返回-1
    func (this *CustomerService) FindById(id int)  int {
        index := -1
        //遍历this.customers 切片
        for i := 0; i < len(this.customers); i++ {
            if this.customers[i].Id == id {
                //找到
                index = i
            }
        }
        return index
    }
  • customerManage/view/customerView.go
    package main

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

    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.Printf("\n-------------------------客户列表完成-------------------------\n\n")
    }

    //得到用户的输入,信息构建新的客户,并完成添加
    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是唯一的,需要系统分配
        customer := model.NewCustomer2(name, gender, age, phone, email)
        //调用
        if this.customerService.Add(customer) {
            fmt.Println("---------------------添加完成---------------------")
        } else {
            fmt.Println("---------------------添加失败---------------------")
        }
    }

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

    //退出软件 
    func (this *customerView) exit() {

        fmt.Println("确认是否退出(Y/N):")
        for {
            fmt.Scanln(&this.key)
            if this.key == "Y" || this.key == "y" || this.key == "N" || this.key == "n" {
                break
            }

            fmt.Println("你的输入有误,确认是否退出(Y/N):")
        }

        if this.key == "Y" || this.key == "y" {
            this.loop = false
        }

    }

    //显示主菜单
    func (this *customerView) mainMenu() {

        for {
            
            fmt.Println("-----------------客户信息管理软件-----------------")
            fmt.Println("                 1 添 加 客 户")
            fmt.Println("                 2 修 改 客 户")
            fmt.Println("                 3 删 除 客 户")
            fmt.Println("                 4 客 户 列 表")
            fmt.Println("                 5 退       出")
            fmt.Print("请选择(1-5):")

            fmt.Scanln(&this.key)
            switch this.key {
                case "1" :
                    this.add()
                case "2" :
                    fmt.Println("修 改 客 户")
                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()

    }

Guess you like

Origin blog.csdn.net/weixin_54707168/article/details/114006208