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/项目经理 对客户 设计阶段:技术人员(架构师 ...
随机推荐
- [TensorFlow2.0]-学习率 激活函数 损失函数
本人人工智能初学者,现在在学习TensorFlow2.0,对一些学习内容做一下笔记.笔记中,有些内容理解可能较为肤浅.有偏差等,各位在阅读时如有发现问题,请评论或者邮箱(右侧边栏有邮箱地址)提醒. 若 ...
- Docker部署netcore web实践
1. 新建一个netcore的项目 2. 我们到项目的生成输出目录下,创建一个Dockerfile文件 3. 编辑Dockerfile文件 备注:红线圈住的地方,就是你生成的netcore的程序名称 ...
- MyBatis学习06(动态SQL和缓存)
10.动态SQL 10.1 什么是动态SQL 动态SQL指的是根据不同的查询条件 , 生成不同的Sql语句. 官网描述: MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或 ...
- 【笔记】KNN之超参数
超参数 超参数 很多时候,对于算法来说,关于这个传入的参数,传什么样的值是最好的? 这就涉及到了机器学习领域的超参数 超参数简单来说就是在我们运行机器学习之前用来指定的那个参数,就是在算法运行前需要决 ...
- docker 安装prometheus和grafna
一.拉取镜像 docker pull prom/prometheus 二.配置 sudo mkdir /etc/prometheus/ sudo vim /etc/prometheus/prometh ...
- cobaltstrike 框架简述
关于cobalt strike,火起来也有好几年了,首先感谢大佬们慷慨相助愿意在网上分享和翻译相关资料,让这么好的渗透测试框架工具被更多人知道 那就来整理一下在使用这个框架的过程中我认为需要了解的小知 ...
- kubernetes/k8s CNI分析-容器网络接口分析
关联博客:kubernetes/k8s CSI分析-容器存储接口分析 kubernetes/k8s CRI分析-容器运行时接口分析 概述 kubernetes的设计初衷是支持可插拔架构,从而利于扩展k ...
- idea自定义 tags 删除
idea custom tags 添加后 如何去除 如何去除 custom tags 随便@一些字符串,这时候alt+enter弹出 Add xxx to custom tags, 这时候按有方向键进 ...
- STM32—驱动HC-SR04超声波测距模块
文章目录 超声波测距原理 HC-SR04工作原理 STM32实现驱动 1.引脚的配置 2.时序控制 3.时间差测量 4.如何将距离测出来 超声波测距原理 利用HC-SR04超声波测距模块可以实现比较精 ...
- Django ORM记录的增删改查结合web端
模版语法分配变量 在views.py文件中定义一个视图函数show_data: def show_data(request): # 定义一个字典 并将它展示在前端HTML文件 user_dic = { ...