• go案例:客户管理系统流程 mvc模式 分层设计


    下面是一个简要的客服系统,主要是演示分层计。。

    model : 数据部份:

    package model
    
    import "fmt"
    
    //声明一个结构体,表示一个客户信息
    type Customer struct{
        Id int
        Name string
        Gender string
        Age int
        Phone string
        Emaill string
    }
    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,
            }
    }
    
    func NewCustomer2(name string, gender string,
        age int, phone string,email string) Customer{
        return Customer{
            Name : name,
            Gender : gender,
            Age : age,
            Phone:phone,
        }
    }
    func (this Customer) GetInfo() string{
     info := fmt.Sprintf("%v	%v	%v	%v	%v	%v	",this.Id,
         this.Name,this.Gender,this.Age,this.Phone,this.Emaill)
     return info
    }
    View Code

    控制层,这儿名为服务层 customerService 代码如下:

    package model
    
    import "fmt"
    
    //声明一个结构体,表示一个客户信息
    type Customer struct{
        Id int
        Name string
        Gender string
        Age int
        Phone string
        Emaill string
    }
    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,
            }
    }
    
    func NewCustomer2(name string, gender string,
        age int, phone string,email string) Customer{
        return Customer{
            Name : name,
            Gender : gender,
            Age : age,
            Phone:phone,
        }
    }
    func (this Customer) GetInfo() string{
     info := fmt.Sprintf("%v	%v	%v	%v	%v	%v	",this.Id,
         this.Name,this.Gender,this.Age,this.Phone,this.Emaill)
     return info
    }
    View Code

    最后是视图层:第一个版本没有加注释,以后有空成全功能后在认真写好注释

    package main
    
    import (
        "fmt"
        "awesomeProject/service"
        "awesomeProject/model"
    )
    
    type customerView struct{
        key string
        loop bool
        customerService *service.CustomerService
    }
    //显示用户例表
    func(this *customerView) list(){
        customers:=this.customerService.List()
        fmt.Println("——————————————————客户例表————————————————————————————")
        fmt.Println("编号 	 姓名 	 	性别 	年龄 	电话 	邮箱")
        for i:=0; i < len(customers);i++{
            fmt.Println(customers[i].GetInfo())
        }
        fmt.Println("++++++++++++++客户列表完成+++++++++++++++")
    }
    //jo fi add
    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 :=model.NewCustomer2(name,gender,age, phone,email)
        this.customerService.Add(customer)
    }
    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不存在")
    
            }
        }
    
    
    }
    
    
    
    
    
    
    
    func(this *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.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.loop = false
            default:
                fmt.Println("输入有误 ")
            }//switch循环结束
            if !this.loop{
                break
            }//for
          }
        fmt.Println("你退出了客户系统")
    
    }//主函数
    
    func main(){
         customerView := customerView{
            key: "",
            loop : true,
        }
         customerView.customerService = service.NewcustomerService()
        customerView.mainMenu()
    }
    View Code

     在练习下一案例前先来复习一下文 件读取和数据库和进程,网络,下一个案例是完整的聊天室

    文件读取简单示例:

     1 package main
     2 
     3 import (
     4     "os"
     5     "fmt"
     6 )
     7 
     8 func main(){
     9     //打开文件
    10     file,err:=os.Open("d:/int1.txt")
    11     //如果错误有值的话进入if
    12     if err !=nil{
    13         fmt.Println("open file err=",err)
    14     }
    15     //输出语言内容
    16     fmt.Printf("file=%v",file)
    17     //关闭文 件
    18     err = file.Close()
    19     //如果关闭错误处理
    20     if err != nil{
    21         fmt.Println("close file err",err)
    22     }
    23 }

     golang  文 件中    一行一行读取,行读取器实现

     1 package main
     2 
     3 import (
     4     "os"
     5     "fmt"
     6     "bufio"
     7     "io"
     8 )
     9 
    10 func main(){
    11 //    读取文 件显示到终端,会用到os.Open,file.Close,bufio.NewReader(),reader.ReadString等方法:
    12 //现在以一个带缓存的读取文件方式,文 件若以流的方式读取文件,每次只读4096字节,也可以设置大小和特殏,比如读到回车
    13 //本例实现行读取器,就是一行一行的读
    14 file,err:=os.Open("d:/int1.txt")
    15 if err !=nil{
    16     fmt.Println("open file err=",err)
    17 }
    18 
    19   //关闭文件
    20   defer file.Close()
    21 //先得到一个文 件,在以文 件的流方法处理文 件,bufio和io二个包提前要导入,
    22     reader := bufio.NewReader(file)
    23     for{
    24     //    读到内容放放str,产生的错误放 在err
    25     str,err:=reader.ReadString('
    ')
    26     //有一种错误叫读到最后没有办法在读取了  io.EOF
    27     if err != io.EOF{
    28         break
    29     }
    30     fmt.Println(str)
    31     }
    32     fmt.Println("文 件读取结束")
    33 }

     一次性读取文 件的方法,可以使用 ioutil 包,不用显示打开文件

    package main
    
    import (
        "io/ioutil"
        "fmt"
    )
    //本案例没有明确的打开和关闭文件,可以用于较小文件读取
    func main(){
    //    ioutil.ReadFile(file)读取文 件不用打开和关闭,并且一次读取完
        file:= "d:/int1.txt"
        // 用ioutil方法读取文件
        content,err:=ioutil.ReadFile(file)
        //外理错误有值的情况。如果错误了会进入if
        if err !=nil{
            fmt.Println("读取错误,%v",err)
        }
        //最终打印,当然这儿打印的是句柄地址之类,比如:00 14 58 想要得到真的字符需要转换字符
        fmt.Println("%v",content)
    //    可以使用字符转义看到文件内容
    //    fmt.Println("$%v",string(content))
    }

     文 件读写示例:

    package main
    
    import (
        "io/ioutil"
        "fmt"
    )
    
    func main(){
        filePath1 :="d:/xsy.txt"
        filePath2 :="e:/kkk.txt"
        data,err :=ioutil.ReadFile(filePath1)
        if err !=nil{
            fmt.Printf("read file err=%v",err)
            return
        }
        err = ioutil.WriteFile(filePath2,data,0666)
        if err !=  nil{
            fmt.Printf("write file error=%v
    ",err)
        }
    }

    以下示例一下完整的读写拷贝过程

    package main
    
    import (
        "os"
        "fmt"
        "bufio"
        "io"
    )
    //定义一个函数可以通过传参完成复制拷贝文件
    func copyfile(dstFileName string, srcFileName string)(Writter int64,err error){
        //打开参数的文件
        srcFile,err:=os.Open(srcFileName)
        //处理错误逻辑
        if err !=nil{
            fmt.Printf("open err=%v",err)
        }
        //新建一个读文件句柄
        reader :=bufio.NewReader(srcFile)
        //定义模式
        dstFile,err := os.OpenFile(dstFileName,os.O_WRONLY | os.O_CREATE,0666)
        if err !=nil{
            //如果错误处理
            fmt.Printf("opne file err=%v",err)
            return
        }
        //写文件句柄
        writer :=bufio.NewWriter(dstFile)
        defer dstFile.Close()
        //io 的copy方法最终外理
        return io.Copy(writer,reader)
    }
    func main(){
        //得到二个文 件句柄
        srcFile :="d:/flower.jpg"
        dstFile :="e:/adc.jpg"
        //业务处理
        _, err := copyfile(srcFile,dstFile)
        if err == nil{
            fmt.Println("拷拷贝完成")
        }else{
            fmt.Println( "末知错误")
        }
    }
  • 相关阅读:
    IDE有毒
    Netbeans 8.2关于PHP的新特性
    什么是人格
    谁该赋予一款产品灵魂?
    自从升级到macOS后,整个人都不好了
    公司不是大家庭
    性能各个指标分析
    Sqlserver2012 alwayson部署攻略
    初探Backbone
    SQL Server AlwaysOn架构及原理
  • 原文地址:https://www.cnblogs.com/fgxwan/p/10111556.html
Copyright © 2020-2023  润新知