go案例:客戶管理系統流程 mvc模式 分層設計

下面是一個簡要的客服系統,主要是演示分層計。。golang

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\t%v\t%v\t%v\t%v\t%v\t",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\t%v\t%v\t%v\t%v\t%v\t",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("編號 \t 姓名 \t \t性別 \t年齡 \t電話 \t郵箱")
    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

 在練習下一案例前先來複習一下文 件讀取和數據庫和進程,網絡,下一個案例是完整的聊天室ide

文件讀取簡單示例:函數

 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  文 件中    一行一行讀取,行讀取器實現oop

 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('\n')
26     //有一種錯誤叫讀到最後沒有辦法在讀取了  io.EOF
27     if err != io.EOF{
28         break
29     }
30     fmt.Println(str)
31     }
32     fmt.Println("文 件讀取結束")
33 }

 一次性讀取文 件的方法,能夠使用 ioutil 包,不用顯示打開文件this

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))
}

 文 件讀寫示例:spa

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\n",err)
    }
}

如下示例一下完整的讀寫拷貝過程3d

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( "末知錯誤")
    }
}
相關文章
相關標籤/搜索