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/项目经理 对客户 设计阶段:技术人员(架构师 ...
随机推荐
- 安装CDH6.2 agent报错
界面报错信息提示如下: file /opt/cloudera/parcels/.flood/CDH-6.2.0-1.cdh6.2.0.p0.967373-el7.parcel...does not e ...
- Android菜鸟进字节跳动,居然是看了这个......
谈谈我的真实感受吧- 程序员真的是需要将终生学习贯彻到底的职业,一旦停止学习,离被淘汰,也就不远了. 金三银四.金九银十跳槽季,这是一个千年不变的话题,每到这个时候,很多人都会临阵磨枪,相信不快也光. ...
- “入职一年,那个被高薪挖来的Android开发被劝退了。”
其实,在很多小伙伴的想法中,是希望通过跳槽实现薪酬涨幅,可是跳槽不是冲动后决定,应该谨慎啊~ 01 我的学弟,最近向我吐槽,2020 年上半年入职一家公司,当时是高薪挖走的他,所谓钱到位,工作也是充满 ...
- 22javascript笔记(2)
JavaScript 1.js事件和作用域 js事件:html页面中每一个元素都可以产生某些触发js函数的事件.这些事件是可以被js侦测到的一种行为,并且js程序能应对这些事件. 常见的html事件 ...
- 基于RT1052 Aworks 内存扩容记录(一)
本文主要是通过迁移的思维,记录本人初次使用周立功的Aworks框架进行BSP开发 1. 首先阅读原理图 内存容量由32M扩容至64M. 2. 再则比较两颗芯片的参数 通过比较32M和64M SDRAM ...
- 【LeetCode】88. 合并两个有序数组
88. 合并两个有序数组 知识点:数组:排序:双指针: 题目描述 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 ...
- NOIP 模拟 $28\; \rm 遗忘之祭仪$
题解 \(by\;zj\varphi\) 直接贪心模拟即可,对于每个点,如果它未被覆盖,直接在这覆盖一次. 每个黑点只会被扫一次,所以总复杂度为 \(\mathcal O\rm (nm)\) Code ...
- NOIP 模拟 $25\; \rm queen$
题解 \(by\;zj\varphi\) 这是一道纯分类讨论,然后推式子的题,细节挺多,挺麻烦,但是很考验数学能力 不讲了,官方题解给的很清楚 Code: %: pragma GCC optimize ...
- NOIP 模拟 $24\; \rm graph$
题解 \(by\;zj\varphi\) 首先一个点能否选择的条件是 \(dis_{1,x}+dis_{x,n}=dis_{1,n}\) 正解是计算一条道路上的所有为 \(-1\) 边的选择范围,是个 ...
- 流媒体 Ubuntu部署srs、windows部署nginx
一.获取项目//码云克隆git clone https://gitee.com/winlinvip/srs.oschina.git srs//githubgit clone https://githu ...