IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> GO Web编程---网上书店(4.1) 添加、删除、更新图书 -> 正文阅读

[大数据]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、更新图书

我们有专门更新图书的页面如下
在这里插入图片描述
只要在“修改”这个超链接,加上我们要用的信息

<td><a href="/toUpdateBookPage?bookId={{.ID}}">修改</a></td>

“/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,点击提交之后

<form action="/updateOraddBook" method="POST">
<input type="hidden" name="bookId" value="{{.ID}}" />
						<td><input name="title" type="text" value="{{.Title}}"/></td>
						<td><input name="price" type="text" value="{{.Price}}"/></td>
						<td><input name="author" type="text" value="{{.Author}}"/></td>
						<td><input name="sales" type="text" value="{{.Sales}}"/></td>
						<td><input name="stock" type="text" value="{{.Stock}}"/></td>

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, “”),传的值是空。
所以这两个页面就不一样了,其实是同一个文件

在这里插入图片描述

<div id="main">
			<form action="/updateOraddBook" method="POST">
				<table>
					<tr>
						<td>名称</td>
						<td>价格</td>
						<td>作者</td>
						<td>销量</td>
						<td>库存</td>
						<td colspan="2">操作</td>
					</tr>		
					<tr>
					{{if .}}	
						<input type="hidden" name="bookId" value="{{.ID}}" />
						<td><input name="title" type="text" value="{{.Title}}"/></td>
						<td><input name="price" type="text" value="{{.Price}}"/></td>
						<td><input name="author" type="text" value="{{.Author}}"/></td>
						<td><input name="sales" type="text" value="{{.Sales}}"/></td>
						<td><input name="stock" type="text" value="{{.Stock}}"/></td>
					{{else}}
						<td><input name="title" type="text" /></td>
						<td><input name="price" type="text" /></td>
						<td><input name="author" type="text" /></td>
						<td><input name="sales" type="text" /></td>
						<td><input name="stock" type="text" /></td>
					{{end}}	
						<td><input type="submit" value="提交"/></td>
					</tr>		
				</table>
			</form>
			
	
		</div>
		

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

总结

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

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

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-04-09 18:28:13  更:2022-04-09 18:31:28 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 3:42:41-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码