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\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
}
控制层,这儿名为服务层 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
}
最后是视图层:第一个版本没有加注释,以后有空成全功能后在认真写好注释
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()
}
在练习下一案例前先来复习一下文 件读取和数据库和进程,网络,下一个案例是完整的聊天室
文件读取简单示例:
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('\n')
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\n",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( "末知错误")
}
}
go案例:客户管理系统流程 mvc模式 分层设计的更多相关文章
- 再谈MV*(MVVM MVP MVC)模式的设计原理—封装与解耦
精炼并增补于:界面之下:还原真实的MV*模式 图形界面的应用程序提供给用户可视化的操作界面,这个界面提供给数据和信息.用户输入行为(键盘,鼠标等)会执行一些应用逻辑,应用逻辑(application ...
- 20160410javaweb 开发小案例 --客户管理系统
客户管理系统---体验基于数据库javaweb的增删改查 添加客户 查询客户列表 修改客户信息 删除客户 条件查询客户信息 分页查询客户 javaee的经典三层架构--工厂类实现解耦 jsp+serv ...
- 利用MVC模式简单设计jsp分页效果
利用Mysql创建一个表Car 用Eclipse创建一个Dynamic Web Project 在lib目录下导入Mysql的jar包 创建如下文件 package com.bean; public ...
- 第十一章 Servlet MVC模式
内包含案例,基于jsp+servlet的:MVC模式计算器:MVC模式登陆 第十一章 Servlet MVC模式 模型-视图-控制器(model-view-controller),简称MVC.MVC是 ...
- Swing程序最佳架构设计—以业务对象为中心的MVC模式(转)
前言: 我打算写一系列关于Swing程序开发的文章.这是由于最近我在做一个Swing产品的开发.长期做JavaEE程序,让我有些麻木了.Swing是设计模式的典范,是一件优雅的艺术品,是一件超越时代的 ...
- MVC模式学习笔记
一.如何设计一个程序的结构,这是一门专门的学问,叫做“架构模式”(architectural pattern),属于编程的方法论. MVC模式就是架构模式的一种,我觉得它不仅适用于开发软件,也适用于其 ...
- Extjs MVC模式开发,循序渐进(一)
本文讲述extjs mvc的Helloworld,tabPanel,event,页面布局layout等内容. 本页包含:MVC模式案例(一)~MVC模式案例(六),从搭建extjs mvc到点击按钮生 ...
- MVC模式浅谈
MVC模式浅谈 一.MVC模式概述 模型-视图-控制器(MVC模式)是一种非常经典的软件架构模式,在UI框架和UI设计思路中扮演着非常重要的角色.从设计模式的角度来看,MVC模式是 一种复合模式,它将 ...
- MVC模式学习--雇员管理系统项目开发
1, 项目开发,使用原型开发, ① 开发流程: 需求分析->设计阶段->编码阶段->测试阶段->发布阶段/维护阶段 需求阶段:PM/项目经理 对客户 设计阶段:技术人员(架构师 ...
随机推荐
- Python3中dict字典的相关操作函数
字典对象的内建函数 1. clear() 清空字典. 例: >>> a = {1:3, 2:4} >>> a.clear() >>> a {} 2 ...
- 实战爬取Plati官网游戏实时最低价格-Python
需要修改url中的id_r="这个",这个id需要从Battlefield V (plati.ru)中获取,其实也是这个链接中的#s24235. 配合了e-mail推送,其实这个e ...
- Rancher v1.6.29 Docker单节点部署
前言: Docker镜像中心,有两个版本的rancher(1.X),镜像名称为:rancher/server,而rancher(2.X)的镜像名称是rancher/rancher 去daocloud官 ...
- Linux线程属性总结(一)
线程属性标识符:pthread_attr_t 包含在 pthread.h 头文件中. [c] view plaincopy //线程属性结构如下: typedef struct { int ...
- Golang语言系列-10-包
包 自定义包 package _0calc import ( "fmt" ) /* [Go语言的包] 在工程化的Go语言开发项目中,Go语言的源码复用是建立在包(package)基 ...
- Required request body is missing-请求接口报错
一.问题由来 自己目前在做一个小程序的后台,已经写好了项目中的很多的接口,同时也在进行一些修改,比如添加拦截器,统一校验一个固定的参数是否正确. 在自己添加拦截器之前,这些接口都可以正常访问,可是在添 ...
- epoll水平/边缘触发模式下阻塞/非阻塞EPOLLOUT事件触发条件及次数
在IO多路复用技术中,epoll默认的事件触发模式为Level_triggered(水平触发)模式,即当被监控的文件描述符上有可读/写事件发生时,epoll_wait()会通知处理程序去读写.如果这次 ...
- mysql悲观锁和乐观锁
悲观锁 查出来的数据必须是根据索引查出来的,不然锁表. # 语法 select * from table where id = 1 for update; 乐观锁 使用一个标识 cas 比较后替换 如 ...
- WebAPI 自定义过滤
自定义filter 类过滤 ------------------------------------------------------------------------- public class ...
- JavaWeb之JavaMail
时间:2016-12-19 11:58 --邮件协议1.收发邮件 发邮件是从客户端把邮件发送到服务器,收邮件是把邮件服务器的邮件下载到客户端 2.邮件协议概述 与HTTP协议相同, ...