项目
一、项目的结构
1. 三层架构:dao-service-controller
可以想象为一个金字塔
文件是最底层(这一层是不需要你写的),
向上是dao层,在上是service,最后是controller
dao: 数据持久层,直接作用于文件的那一层,在这一层写的函数可以直接的改动文件。 这一层调用file函数,比如Read() Creat() 等函数
service: 逻辑层,比如添加用户想要先看一下用户名是否存在, 如果不存在就添加,如果存在返回用户名已存在,就写到这一层, 这一层调用dao层的函数
controller: 控制层,最外面的一层,启动程序后,调用的是这一层函数,这一层里会进一步的向下(service-dao)调用
2. model包:放结构体
3. util包:放工具,例如读取文件函数ReadFile…
二、项目示例(用户)
1.util包(file)
创建一个文件
//创建文件
func CreatFile(name string) *os.File {
file, err := os.Create(name)
if err != nil {
log.Fatalln(err)
}
return file
}
读取文件信息
//读取文件信息
func ReadFile(name string) []string {
//打开文件
file,err1 := os.OpenFile(name, os.O_CREATE|os.O_RDONLY, 0666)
//关闭文件
defer func(file *os.File) {
err := file.Close()
if err != nil{
log.Fatal(err)
}
}(file)
if err1 != nil {
log.Fatal(err1)
}
//建立一个缓冲区
reader := bufio.NewReader(file)
result := make([]string,0)
for{
buf,err := reader.ReadString('\n')
if err == io.EOF{
break
}
buf = strings.Trim(buf,"\n")
result = append(result,buf)
}
return result
}
往文件中写内容
//往文件中写内容
func WriteFile(name string,str1 []string) bool {
file,err := os.OpenFile(name,os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666)
if err != nil {
log.Fatalln(err)
}
defer func(file *os.File) {
err := file.Close()
if err != nil {
log.Fatalln(err)
}
}(file)
writer := bufio.NewWriter(file)
for _,str := range str1{
_,err := writer.WriteString(str+"\n")
if err != nil {
log.Fatalln(err)
}
}
err1 := writer.Flush()
if err1 != nil {
log.Fatalln(err1)
}
return true
}
往文件中添加内容
//追加一条信息
func AppendWriteFile(name string,str string) bool {
file,err := os.OpenFile(name,os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0666)
if err != nil {
log.Fatalln()
}
defer func(file *os.File) {
err := file.Close()
if err != nil {
log.Fatalln(err)
}
}(file)
writer := bufio.NewWriter(file)
_, err1 := writer.WriteString(str+"\n")
if err1 != nil {
log.Fatalln(err)
}
err = writer.Flush()
if err != nil {
log.Fatalln(err)
}
return true
}
2.查找(根据编号查找用户)
dao层
func SelectUserByUserNo(UserNo string) model.User {
var user model.User
contains := util.ReadFile("./user.txt")
for _,c := range contains {
str := strings.Split(c," ")
if str[0] == UserNo{
user.UserNo = str[0]
user.UserName = str[1]
user.Password = str[2]
var err error
user.Level, err = strconv.Atoi(strings.Trim(str[3],"\r"))
if err != nil {
log.Fatalln(err)
}
return user
}
}
return user
}
service 层
func SelectUserByUserNo(UserNo string) model.User {
return dao.SelectUserByUserNo(UserNo)
}
controller层
func SelectUserByUserNo() {
var UserNo string
fmt.Println("请输入所查询的账号:")
_,err := fmt.Scan(&UserNo)
if err != nil{
log.Fatalln(err)
}
User := service.SelectUserByUserNo(UserNo)
fmt.Println("查询结果:")
if User.IsStructureEmpty() {
fmt.Println("未查询到结果!")
}else {
fmt.Printf("账号:%s,姓名:%s,密码:%s,权限:%d",User.UserNo,User.UserName,User.Password,User.Level)
}
}
3.添加
dao层
func InsertUser() {
fmt.Println("请输入所添加用户的信息:")
Lable:
var user model.User
fmt.Println("请输入账号:")
_,err := fmt.Scan(&user.UserNo)
if err != nil {
log.Fatalln(err)
}
users := service.SelectAllUser()
for _,users1 := range users{
if users1.UserNo == user.UserNo{
fmt.Println("该账号已存在,请重新输入!")
goto Lable
}
}
fmt.Println("请输入姓名:")
_,err = fmt.Scan(&user.UserName)
if err != nil {
log.Fatalln(err)
}
fmt.Println("请输入密码:")
_,err = fmt.Scan(&user.Password)
if err != nil {
log.Fatalln(err)
}
fmt.Println("请输入权限:")
_,err = fmt.Scan(&user.Level)
if err != nil {
log.Fatalln(err)
}
if service.InsertUser(user) {
fmt.Println("添加用户成功!")
}else{
fmt.Println("添加失败,该账号已存在!")
}
}
service层
func InsertUser(user model.User) bool {
if user.IsStructureEmpty(){
fmt.Println("未获取到信息!")
}
return dao.InsertUser(user)
}
controller层
func InsertUser() {
fmt.Println("请输入所添加用户的信息:")
Lable:
var user model.User
fmt.Println("请输入账号:")
_,err := fmt.Scan(&user.UserNo)
if err != nil {
log.Fatalln(err)
}
users := service.SelectAllUser()
for _,users1 := range users{
if users1.UserNo == user.UserNo{
fmt.Println("该账号已存在,请重新输入!")
goto Lable
}
}
fmt.Println("请输入姓名:")
_,err = fmt.Scan(&user.UserName)
if err != nil {
log.Fatalln(err)
}
fmt.Println("请输入密码:")
_,err = fmt.Scan(&user.Password)
if err != nil {
log.Fatalln(err)
}
fmt.Println("请输入权限:")
_,err = fmt.Scan(&user.Level)
if err != nil {
log.Fatalln(err)
}
if service.InsertUser(user) {
fmt.Println("添加用户成功!")
}else{
fmt.Println("添加失败,该账号已存在!")
}
}
4.删除(根据编号删除)
dao层
func DeleteUserByUserNo(UserNo string) bool {
strs := make([]string,0)
users := SelectAllUser()
for _,user := range users {
if user.UserNo == UserNo{
continue
}
s := user.UserNo+" "+user.UserName+" "+user.Password+" "+strconv.Itoa(user.Level)
strs = append(strs,s)
}
return util.WriteFile("./user.txt",strs)
}
service层
func DeleteUserByUserNo(UserNo string) bool {
return dao.DeleteUserByUserNo(UserNo)
}
controller层
func DeleteUserByUserNo() {
fmt.Println("请输入所删除用户的账号:")
var userNo string
_,err := fmt.Scan(&userNo)
if err != nil {
log.Fatalln(err)
}
if service.DeleteUserByUserNo(userNo){
fmt.Println("删除用户成功!")
}else{
fmt.Println("删除失败,该用户不存在!")
}
}
5.修改
dao层
func UpdateUserByUserNo(user model.User) bool {
strs := make([]string,0)
users := SelectAllUser()
for _,user1 := range users {
if user1.UserNo == user.UserNo{
user1 = user
}
s := user1.UserNo+" "+user1.UserName+" "+user1.Password+" "+strconv.Itoa(user1.Level)
strs = append(strs,s)
}
return util.WriteFile("./user.txt",strs)
}
service层
func UpdateUserByUserNo(user model.User) bool {
if user.IsStructureEmpty(){
fmt.Println("未获取到信息!")
}
return dao.UpdateUserByUserNo(user)
}
controller层
func UpdateUserByUserNo(myuser model.User) {
var result bool
if myuser.Level == 0 {
var userNo string
Lable:
fmt.Println("请输入所修改用户的账号:")
_,err := fmt.Scan(&userNo)
if err != nil {
log.Fatalln(err)
}
user := service.SelectUserByUserNo(userNo)
if user.IsStructureEmpty(){
fmt.Println("未查询到该账号,请重新输入!")
goto Lable
}
Lable1:
fmt.Println("请选择您的修改内容:")
fmt.Println("1 姓名:")
fmt.Println("2 密码:")
fmt.Println("3 权限:")
fmt.Println("4 返回:")
var s int
_,err = fmt.Scan(&s)
switch s {
case 1 :
fmt.Println("请重新输入姓名:")
_,err = fmt.Scan(&user .UserName)
if err != nil {
log.Fatalln(err)
}
result = service.UpdateUserByUserNo(user)
break
case 2 :
fmt.Println("请重新输入密码:")
_,err = fmt.Scan(&user.Password)
if err != nil {
log.Fatalln(err)
}
result = service.UpdateUserByUserNo(user)
break
case 3 :
fmt.Println("请重新输入权限:")
_,err = fmt.Scan(&user.Level)
if err != nil {
log.Fatalln(err)
}
result = service.UpdateUserByUserNo(user)
break
case 4 :
return
default:
fmt.Println("您的输入不正确,请重新输入!")
goto Lable1
}
if result == true {
fmt.Println("修改用户成功!")
}else {
fmt.Println("非常抱歉,修改失败!")
}
}else {
Lable2:
fmt.Println("请选择您的修改内容:")
fmt.Println("1 密码:")
fmt.Println("2 返回:")
var s int
_, err := fmt.Scan(&s)
if err != nil {
log.Fatalln(err)
}
switch s {
case 1 :
fmt.Println("请重新输入密码:")
_,err := fmt.Scan(&myuser.Password)
if err != nil {
log.Fatalln(err)
}
result = service.UpdateUserByUserNo(myuser)
break
case 2 :
return
default:
fmt.Println("您的输入不正确,请重新输入!")
goto Lable2
}
if result == true {
fmt.Println("修改用户成功!")
}else {
fmt.Println("非常抱歉,修改失败!")
}
}
}