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/项目经理 对客户 设计阶段:技术人员(架构师 ...
随机推荐
- 学习Android Jetpack? 入门教程和进阶实战这里全都有!
前言 2018年谷歌I/O,Jetpack横空出世,官方介绍如下: Jetpack 是一套库.工具和指南,可帮助开发者更轻松地编写优质应用.这些组件可帮助您遵循最佳做法.让您摆脱编写样板代码的工作并简 ...
- 01 CTF从0到。。。。
无意间在前段时间接触到了CTF,感觉很有意思,就参加了个单位的短期培训,并且参加了比赛,也是无意混进了决赛.感觉自己不会的还很多!SO,开始写博客开始刷题,自己很菜,不会C,不会Python,不会汇编 ...
- 4、关于numpy.random.seed()的使用说明
定义:seed( ) 用于指定随机数生成时所用算法开始的整数值,如果使用相同的seed( )值,则每次生成的随即数都相同,如果不设置这个值,则系统根据时间来自己选择这个值,此时每次生成的随机数因时间差 ...
- Python Flask API实现方法-测试开发【提测平台】阶段小结(一)
微信搜索[大奇测试开],关注这个坚持分享测试开发干货的家伙. 本篇主要是对之前几次分享的阶阶段的总结,温故而知新,况且虽然看起来是一个小模块简单的增删改查操作,但其实涉及的内容点是非常的密集的,是非常 ...
- Linux搭建Ldap服务器
一,服务器安装 yum install -y openldap openldap-clients openldap-servers migrationtools 二,配置ldap服务器 2.1配置ld ...
- NOIP 模拟 $26\; \rm 神炎皇$
题解 \(by\;zj\varphi\) 一道 \(\varphi()\) 的题. 对于一个合法的数对,设它为 \((a*m,b*m)\) 则 \(((a+b)*m)|a*b*m^2\),所以 \(( ...
- Node + Selenium 报错 UnhandledPromiseRejectionWarning: Error: ECONNREFUSED connect ECONNREFUSED 127.0.0.1:5319
安装selenium-webdriver npm i selenium-webdriver 当前安装版本: "selenium-webdriver": "^4.0.0-a ...
- docker加速器,设置cdn
添加加速器 vim /etc/docker/daemon.json 添加如下内容 { "registry-mirrors": ["https://registry.doc ...
- Ratel:一直站在Android逆向巅峰的平头哥
本文来源:带动行业内卷,渣总义不容辞 字越少事儿越大,请关注github(可以点击阅读原文): https://github.com/virjarRatel 平头哥(ratel)是一个Android逆 ...
- C语言 Ubuntu系统 UTF-8 文字处理
关于UTF-8的规则:https://baike.baidu.com/item/UTF-8/481798?fr=aladdin 使用windows系统下的Ubuntu子系统,实现C语言对UTF-8编码 ...