栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Go语言

GO Web编程---网上书店(4.1) 添加、删除、更新图书

Go语言 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

GO Web编程---网上书店(4.1) 添加、删除、更新图书

上一篇讲了查询图书并且分页,那是在图书管理那里,那么我们接着讲图书的管理。

完成后项目结构

实现的功能如下:

1、删除图书

在bookhandler.go新加一个函数

//DeleteBook 删除图书
func DeleteBook(w http.ResponseWriter, r *http.Request) {
	//获取要删除的图书的id
	bookID := r.FormValue("bookId")
	//调用bookdao中删除图书的函数
	dao.DeleteBook(bookID)
	//调用GetBooks处理器函数再次查询一次数据库
	GetPageBooks(w, r)
}

代码的最后一行,在删除完一本图书之后,我们再调用上一篇讲的分页函数,这样重新显示该页面

在bookdao.go里新增删除图书DeleteBook()函数

//DeleteBook 根据图书的id从数据库中删除一本图书
func DeleteBook(bookID string) error {
	//写sql语句
	sqlStr := "delete from books where id = ?"
	//执行
	_, err := utils.Db.Exec(sqlStr, bookID)
	if err != nil {
		return err
	}
	return nil
}

也是非常的简单,调用sql语句就可以

2、更新图书

我们有专门更新图书的页面如下

只要在“修改”这个超链接,加上我们要用的信息

修改

“https://blog.csdn.net/toUpdateBookPage?bookId={{.ID}}”
1、需要在main中加入/toUpdateBookPage的路由,再进入控制器处理
2、?bookId={{.ID}就是我们要获得的有用的信息了
我们可以根据book.ID来从数据库获得book对象,然后更新图书信息之后,可以重新写入数据库

//去更新图书的页面
	http.HandleFunc("/toUpdateBookPage", controller.ToUpdateBookPage)

之后再bookcontroller里的函数就可以这么写了,跳转到book_edit.html

//ToUpdateBookPage 去更新或者添加图书的页面
func ToUpdateBookPage(w http.ResponseWriter, r *http.Request) {
	//获取要更新的图书的id
	bookID := r.FormValue("bookId")
	//调用bookdao中获取图书的函数
	book, _ := dao.GetBookByID(bookID)
	if book.ID > 0 {
		//在更新图书
		//解析模板
		t := template.Must(template.ParseFiles("views/pages/manager/book_edit.html"))
		//执行
		t.Execute(w, book)
	} else {
		//在添加图书
		//解析模板
		t := template.Must(template.ParseFiles("views/pages/manager/book_edit.html"))
		//执行
		t.Execute(w, "")
	}
}

book, _ := dao.GetBookByID(bookID)
在数据库中通过bookID查找到book,
如果存在这么一本书,那么久前往修改页面。
不存在:是为后面新增图书做的准备,与现在这个功能无关

bookdao新增 GetBookByID()函数

//GetBookByID 根据图书的id从数据库中查询出一本图书
func GetBookByID(bookID string) (*model.Book, error) {
	//写sql语句
	sqlStr := "select id,title,author,price,sales,stock,img_path from books where id = ?"
	//执行
	row := utils.Db.QueryRow(sqlStr, bookID)
	//创建Book
	book := &model.Book{}
	//为book中的字段赋值
	row.Scan(&book.ID, &book.Title, &book.Author, &book.Price, &book.Sales, &book.Stock, &book.ImgPath)
	return book, nil
}

在更新图书界面
bookedi.html,点击提交之后

main中添加路由

//更新或添加图书
	http.HandleFunc("/updateOraddBook", controller.UpdateOrAddBook)

UpdateOrAddBook ( ) 就可以用
bookID := r.PostFormValue(“bookId”)
来获取信息了

//UpdateOrAddBook 更新或添加图书
func UpdateOrAddBook(w http.ResponseWriter, r *http.Request) {
	//获取图书信息
	bookID := r.PostFormValue("bookId")
	title := r.PostFormValue("title")
	author := r.PostFormValue("author")
	price := r.PostFormValue("price")
	sales := r.PostFormValue("sales")
	stock := r.PostFormValue("stock")
	//将价格、销量和库存进行转换
	fPrice, _ := strconv.ParseFloat(price, 64)
	iSales, _ := strconv.ParseInt(sales, 10, 0)
	iStock, _ := strconv.ParseInt(stock, 10, 0)
	ibookID, _ := strconv.ParseInt(bookID, 10, 0)
	//创建Book
	book := &model.Book{
		ID:      int(ibookID),
		Title:   title,
		Author:  author,
		Price:   fPrice,
		Sales:   int(iSales),
		Stock:   int(iStock),
		ImgPath: "/static/img/default.jpg",
	}
	if book.ID > 0 {
		//在更新图书
		//调用bookdao中更新图书的函数
		dao.UpdateBook(book)
	} else {
		//在添加图书
		//调用bookdao中添加图书的函数
		dao.AddBook(book)
	}
	//调用GetBooks处理器函数再次查询一次数据库
	GetPageBooks(w, r)
}

那么更新图书就简单了,dao.UpdateBook(book)
传来了book对象,调用sql就可以了

//UpdateBook 根据图书的id更新图书信息
func UpdateBook(b *model.Book) error {
	//写sql语句
	sqlStr := "update books set title=?,author=?,price=?,sales=?,stock=? where id=?"
	//执行
	_, err := utils.Db.Exec(sqlStr, b.Title, b.Author, b.Price, b.Sales, b.Stock, b.ID)
	if err != nil {
		return err
	}
	return nil
}
3、新增图书

我们可以共用UpdateOrAddBook ( ) ,因为都是在编辑图书页面,只要在UpdateOrAddBook ( ) 增加判断就可以了

if book.ID > 0 {
		//在更新图书
		//调用bookdao中更新图书的函数
		dao.UpdateBook(book)
	} else {
		//在添加图书
		//调用bookdao中添加图书的函数
		dao.AddBook(book)
	}
	//调用GetBooks处理器函数再次查询一次数据库
	GetPageBooks(w, r)

如果之前就在数据库中有记录,1、那么就是更新书,调用dao.UpdateBook(book)在数据库中update
2、否则就是新增书,dao.AddBook(book)在数据库中insert

//AddBook 向数据库中添加一本图书
func AddBook(b *model.Book) error {
	//写sql语句
	slqStr := "insert into books(title,author,price,sales,stock,img_path) values(?,?,?,?,?,?)"
	//执行
	_, err := utils.Db.Exec(slqStr, b.Title, b.Author, b.Price, b.Sales, b.Stock, b.ImgPath)
	if err != nil {
		return err
	}
	return nil
}

注意到book_edit有一个有趣的点
bookhandle.go里的ToUpdateBookPage()(也就是上面那个)

if book.ID > 0 {
		//在更新图书
		//解析模板
		t := template.Must(template.ParseFiles("views/pages/manager/book_edit.html"))
		//执行
		t.Execute(w, book)
	} else {
		//在添加图书
		//解析模板
		t := template.Must(template.ParseFiles("views/pages/manager/book_edit.html"))
		//执行
		t.Execute(w, "")
	}

在更新书的时候:
t.Execute(w, book),带着book进入book_edit.html
在新增书的时候
t.Execute(w, “”),传的值是空。
所以这两个页面就不一样了,其实是同一个文件

{{if .}} {{else}} {{end}}
名称 价格 作者 销量 库存 操作

{{if .}}
如果传入book,就显示图书的信息
{{else}}
没传就是空白

总结

增删改查是最基本的数据库用法,在现实的应用中也是普遍的。
业务的逻辑大差不差,
都是在html页面点击超链接或者按钮,
它们都包含了路由的信息
(如/toUpdateBookPage还有必要的信息,如book的ID),通过main中的路由,找到对应的controller,再通过数据库的改动,实现目的

2022.4.8 01:40。 最近挺晚睡觉的,夜深人静适合思考

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/945086.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号