GoWeb 书城项目
生活随笔
收集整理的這篇文章主要介紹了
GoWeb 书城项目
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
數據庫
連接數據庫信息
grant all on *.* to 'root'@'%' identified by 'root';創建書城數據庫
create database bookstore0612 charset utf8;創建用戶表
create table users( id int primary key auto_increment, username varchar(100) not null unique, password varchar(100) not null, email varchar(100) );處理登錄注冊
utils/db.go
package utilsimport ("database/sql"_ "github.com/go-sql-driver/mysql" )var (Db *sql.DBerr error )func init() {Db, err = sql.Open("mysql", "root:root@tcp(10.0.0.51:3306)/bookstore0612")if err != nil {panic(err.Error())} }model/user.go
package model//User 結構體 type User struct {ID intUsername stringPassword stringEmail string }dao/userdao.go
package daoimport ("bookstore0612/model""bookstore0612/utils" )//CheckUserNameAndPassword 根據用戶名和密碼從數據庫中查詢一條記錄 func CheckUserNameAndPassword(username string, password string) (*model.User, error) {//寫sql語句sqlStr := "select id,username,password,email from users where username = ? and password = ?"//執行row := utils.Db.QueryRow(sqlStr, username, password)user := &model.User{}row.Scan(&user.ID, &user.Username, &user.Password, &user.Email)return user, nil } //CheckUserName 根據用戶名和密碼從數據庫中查詢一條記錄 func CheckUserName(username string) (*model.User, error) {//寫sql語句sqlStr := "select id,username,password,email from users where username = ?"//執行row := utils.Db.QueryRow(sqlStr, username)user := &model.User{}row.Scan(&user.ID, &user.Username, &user.Password, &user.Email)return user, nil }//SaveUser 向數據庫中插入用戶信息 func SaveUser(username string, password string, email string) error {//寫sql語句sqlStr := "insert into users(username,password,email) values(?,?,?)"//執行_, err := utils.Db.Exec(sqlStr, username, password, email)if err != nil {return err}return nil }dao/userdao_test.go
package daoimport ("fmt""testing" )func TestUser(t *testing.T) {fmt.Println("測試userdao中的函數")t.Run("驗證用戶名或密碼:", testLogin)t.Run("驗證用戶名:", testRegist)//t.Run("保存用戶:", testSave) }func testLogin(t *testing.T) {user, _ := CheckUserNameAndPassword("admin", "123456")fmt.Println("獲取用戶信息是:", user) } func testRegist(t *testing.T) {user, _ := CheckUserName("admin")fmt.Println("獲取用戶信息是:", user) } func testSave(t *testing.T) {SaveUser("admin3", "123456", "admin3@wuxing.com") }完成登錄注冊功能
main.go
package mainimport ("bookstore0612/controller""html/template""net/http" )// IndexHandler 去首頁 func IndexHandler(w http.ResponseWriter, r *http.Request) {//解析模板t := template.Must(template.ParseFiles("views/index.html"))//執行t.Execute(w, "") } func main() {//設置處理靜態資源http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("views/static/"))))http.Handle("/pages/", http.StripPrefix("/pages/", http.FileServer(http.Dir("views/pages/"))))http.HandleFunc("/main", IndexHandler)//去登陸http.HandleFunc("/login", controller.Login)//去注冊http.HandleFunc("/regist", controller.Regist)http.ListenAndServe(":8080", nil) }controller/userhandler.go
package controllerimport ("bookstore0612/dao""html/template""net/http" )//Login 處理用戶登陸函數 func Login(w http.ResponseWriter, r *http.Request) {//獲取用戶名和密碼username := r.PostFormValue("username")password := r.PostFormValue("password")//調用userdao中驗證用戶名和密碼的方法user, _ := dao.CheckUserNameAndPassword(username, password)if user.ID > 0 {//用戶名和密碼正確t := template.Must(template.ParseFiles("views/pages/user/login_success.html"))t.Execute(w, "")} else {//用戶名或密碼不正確t := template.Must(template.ParseFiles("views/pages/user/login.html"))t.Execute(w, "用戶名或密碼不正確!")} } //Regist 處理用戶注冊函數 func Regist(w http.ResponseWriter, r *http.Request) {//獲取用戶名和密碼username := r.PostFormValue("username")password := r.PostFormValue("password")email := r.PostFormValue("email")//調用userdao中驗證用戶名和密碼的方法user, _ := dao.CheckUserName(username)if user.ID > 0 {//用戶名已經存在t := template.Must(template.ParseFiles("views/pages/user/regist.html"))t.Execute(w, "用戶名已存在!")} else {//用戶名可用,將用戶保存到數據庫中dao.SaveUser(username, password, email)t := template.Must(template.ParseFiles("views/pages/user/regist_success.html"))t.Execute(w, "")} }通過發送Ajax驗證用戶名
//發送Ajax請求驗證用戶名是否存在//給輸入用戶名的文本框綁定change事件$("#username").change(function(){//獲取用戶輸入的用戶名var username = $(this).val();//設置請求地址var url = "/checkUserName";//設置請求參數var param = {"username":username};//發送Ajax請求$.post(url,param,function(res){//將顯示提示信息的span元素顯示$("#msg").show();//將響應信息設置到span元素中$("#msg").html(res);});}); <div class="tit"><h1>注冊尚硅谷會員</h1><span class="errorMsg" id="msg">{{.}}</span></div> //通過Ajax請求驗證用戶名是否可用http.HandleFunc("/checkUserName", controller.CheckUserName) //CheckUserName 通過發送Ajax驗證用戶名是否可用 func CheckUserName(w http.ResponseWriter, r *http.Request) {//獲取用戶輸入的用戶名username := r.PostFormValue("username")//調用userdao中驗證用戶名和密碼的方法user, _ := dao.CheckUserName(username)if user.ID > 0 {//用戶名已經存在w.Write([]byte("用戶名已存在!"))} else {//用戶名可用w.Write([]byte("<font style='color:green'>用戶名可用! </font>"))} }獲取所有圖書
創建表
create table books( id int primary key auto_increment, title varchar(100) not null, author varchar(100) not null, price double(11,2) not null, sales int not null, stock int not null, img_path varchar(100) );插入數據
INSERT INTO books (title, author ,price, sales , stock , img_path) VALUES('解憂雜貨店','東野圭吾',27.20,100,100,'static/img/default.jpg'); INSERT INTO books (title, author ,price, sales , stock , img_path) VALUES('邊城','沈從文',23.00,100,100,'static/img/default.jpg'); INSERT INTO books (title, author ,price, sales , stock , img_path) VALUES('中國哲學史','馮友蘭',44.5,100,100,'static/img/default.jpg'); INSERT INTO books (title, author ,price, sales , stock , img_path) VALUES('忽然七日',' 勞倫',19.33,100,100,'static/img/default.jpg'); INSERT INTO books (title, author ,price, sales , stock , img_path) VALUES('蘇東坡傳','林語堂',19.30,100,100,'static/img/default.jpg'); INSERT INTO books (title, author ,price, sales , stock , img_path) VALUES('百年孤獨','馬爾克斯',29.50,100,100,'static/img/default.jpg'); INSERT INTO books (title, author ,price, sales , stock , img_path) VALUES('扶桑','嚴歌苓',19.8,100,100,'static/img/default.jpg'); INSERT INTO books (title, author ,price, sales , stock , img_path) VALUES('給孩子的詩','北島',22.20,100,100,'static/img/default.jpg'); INSERT INTO books (title, author ,price, sales , stock , img_path) VALUES('為奴十二年','所羅門',16.5,100,100,'static/img/default.jpg'); INSERT INTO books (title, author ,price, sales , stock , img_path) VALUES('平凡的世界','路遙',55.00,100,100,'static/img/default.jpg'); INSERT INTO books (title, author ,price, sales , stock , img_path) VALUES('悟空傳','今何在',14.00,100,100,'static/img/default.jpg'); INSERT INTO books (title, author ,price, sales , stock , img_path) VALUES('硬派健身','斌卡',31.20,100,100,'static/img/default.jpg'); INSERT INTO books (title, author ,price, sales , stock , img_path) VALUES('從晚清到民國','唐德剛',39.90,100,100,'static/img/default.jpg'); INSERT INTO books (title, author ,price, sales , stock , img_path) VALUES('三體','劉慈欣',56.5,100,100,'static/img/default.jpg'); INSERT INTO books (title, author ,price, sales , stock , img_path) VALUES('看見','柴靜',19.50,100,100,'static/img/default.jpg'); INSERT INTO books (title, author ,price, sales , stock , img_path) VALUES('活著','余華',11.00,100,100,'static/img/default.jpg'); INSERT INTO books (title, author ,price, sales , stock , img_path) VALUES('小王子','安托萬',19.20,100,100,'static/img/default.jpg'); INSERT INTO books (title, author ,price, sales , stock , img_path) VALUES('我們仨','楊絳',11.30,100,100,'static/img/default.jpg'); INSERT INTO books (title, author ,price, sales , stock , img_path) VALUES('生命不息,折騰不止','羅永浩',25.20,100,100,'static/img/default.jpg'); INSERT INTO books (title, author ,price, sales , stock , img_path) VALUES('皮囊','蔡崇達',23.90,100,100,'static/img/default.jpg'); INSERT INTO books (title, author ,price, sales , stock , img_path) VALUES('恰到好處的幸福','畢淑敏',16.40,100,100,'static/img/default.jpg'); INSERT INTO books (title, author ,price, sales , stock , img_path) VALUES('大數據預測','埃里克',37.20,100,100,'static/img/default.jpg'); INSERT INTO books (title, author ,price, sales , stock , img_path) VALUES('人月神話','布魯克斯',55.90,100,100,'static/img/default.jpg'); INSERT INTO books (title, author ,price, sales , stock , img_path) VALUES('C語言入門經典','霍爾頓',45.00,100,100,'static/img/default.jpg'); INSERT INTO books (title, author ,price, sales , stock , img_path) VALUES('數學之美','吳軍',29.90,100,100,'static/img/default.jpg'); INSERT INTO books (title, author ,price, sales , stock , img_path) VALUES('Java編程思想','埃史爾',70.50,100,100,'static/img/default.jpg'); INSERT INTO books (title, author ,price, sales , stock , img_path) VALUES('設計模式之禪','秦小波',20.20,100,100,'static/img/default.jpg'); INSERT INTO books (title, author ,price, sales , stock , img_path) VALUES('圖解機器學習','杉山將',33.80,100,100,'static/img/default.jpg'); INSERT INTO books (title, author ,price, sales , stock , img_path) VALUES('艾倫圖靈傳','安德魯',47.20,100,100,'static/img/default.jpg'); INSERT INTO books (title, author ,price, sales , stock , img_path) VALUES('教父','馬里奧普佐',29.00,100,100,'static/img/default.jpg');book.go
package model//Book 結構體 type Book struct {Id intTitle stringAuthor stringPrice float64Sales intStock intImgPath string }bookdao.go
package daoimport ("bookstore0612/model""bookstore0612/utils" )// GetBooks 獲取數據庫中所有的圖書 func GetBooks() ([]*model.Book, error) {// 寫sqlsqlStr := "select id,title,author,price,sales,stock,img_path from books"//執行rows, err := utils.Db.Query(sqlStr)if err != nil {return nil, err}var books []*model.Bookfor rows.Next() {book := &model.Book{}//給book中的字段賦值rows.Scan(&book.Id, &book.Title, &book.Author, &book.Price, &book.Sales, &book.Stock, &book.ImgPath)//將book添加到books中books = append(books, book)}return books, nil }測試
package daoimport ("fmt""testing" )func TestMain(m *testing.M) {fmt.Println("測試bookdao中的方法")m.Run() }func TestUser(t *testing.T) {//fmt.Println("測試userdao中的函數")//t.Run("驗證用戶名或密碼:", testLogin)//t.Run("驗證用戶名:", testRegist)//t.Run("保存用戶:", testSave) }func testLogin(t *testing.T) {user, _ := CheckUserNameAndPassword("admin", "123456")fmt.Println("獲取用戶信息是:", user) } func testRegist(t *testing.T) {user, _ := CheckUserName("admin")fmt.Println("獲取用戶信息是:", user) } func testSave(t *testing.T) {SaveUser("admin3", "123456", "admin3@wuxing.com") }func TestBook(t *testing.T) {fmt.Println("測試bookdao中的相關函數")t.Run("測試獲取所有圖書", testGetBooks) }func testGetBooks(t *testing.T) {books, _ := GetBooks()//遍歷得到每一本圖書for k, v := range books {fmt.Printf("第%v本圖書的信息是: %v\n", k + 1, v)} }manager.html
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>后臺管理</title> <link type="text/css" rel="stylesheet" href="/static/css/style.css" > <style type="text/css">h1 {text-align: center;margin-top: 200px;} </style> </head> <body><div id="header"><img class="logo_img" alt="" src="/static/img/logo.gif" ><span class="wel_word">后臺管理系統</span><div><a href="/getBooks">圖書管理</a><a href="/">返回商城</a></div></div><div id="main"><h1>歡迎管理員進入后臺管理系統</h1></div><div id="bottom"><span>尚硅谷書城.Copyright ©2015</span></div> </body> </html>main.go
...//獲取所有圖書http.HandleFunc("/getBooks", controller.GetBooks) ...bookhandler.go
package controllerimport ("bookstore0612/dao""html/template""net/http" )//GetBooks 獲取所有圖書 func GetBooks(w http.ResponseWriter, r *http.Request) {//調用bookdao中獲取所有圖書的函數books, _ := dao.GetBooks()//解析模板文件t := template.Must(template.ParseFiles("views/pages/manager/book_manager.html"))//執行t.Execute(w, books) }book_manager.html
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>圖書管理</title> <link type="text/css" rel="stylesheet" href="/static/css/style.css" > </head> <body><div id="header"><img class="logo_img" alt="" src="/static/img/logo.gif" ><span class="wel_word">圖書管理系統</span><div><a href="/pages/manager/book_manager.html">圖書管理</a><a href="/">返回商城</a></div></div><div id="main"><table><tr><td>名稱</td><td>價格</td><td>作者</td><td>銷量</td><td>庫存</td><td colspan="2">操作</td></tr>{{range .}}<tr><td>{{.Title}}</td><td>{{.Price}}</td><td>{{.Author}}</td><td>{{.Sales}}</td><td>{{.Stock}}</td><td><a href="/pages/manager/book_edit.html">修改</a></td><td><a href="#">刪除</a></td></tr>{{end}}<tr><td></td><td></td><td></td><td></td><td></td><td></td><td><a href="/pages/manager/book_edit.html">添加圖書</a></td></tr></table></div><div id="bottom"><span>尚硅谷書城.Copyright ©2015</span></div> </body> </html>添加圖書
book_edit.html
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>編輯圖書</title> <link type="text/css" rel="stylesheet" href="/static/css/style.css" > <style type="text/css">h1 {text-align: center;margin-top: 200px;}h1 a {color:red;}input {text-align: center;} </style> </head> <body><div id="header"><img class="logo_img" alt="" src="/static/img/logo.gif" ><span class="wel_word">編輯圖書</span><div><a href="/pages/manager/book_manager.html">圖書管理</a><a href="/">返回商城</a></div></div><div id="main"><form action="/addBook" method="POST"><table><tr><td>名稱</td><td>價格</td><td>作者</td><td>銷量</td><td>庫存</td><td colspan="2">操作</td></tr> <tr><td><input name="title" type="text" value=""/></td><td><input name="price" type="text" value=""/></td><td><input name="author" type="text" value=""/></td><td><input name="sales" type="text" value=""/></td><td><input name="stock" type="text" value=""/></td><td><input type="submit" value="提交"/></td></tr> </table></form></div><div id="bottom"><span>五行哥書城.Copyright ©2015</span></div> </body> </html>main.go
//添加圖書http.HandleFunc("/addBook", controller.AddBook)bookhandler.go
// AddBook添加圖書 func AddBook(w http.ResponseWriter, r *http.Request) {//獲取圖書信息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)//創建Bookbook := &model.Book{Title: title,Author: author,Price: fPrice,Sales: int(iSales),Stock: int(iStock),ImgPath: "/static/img/default.jpg",}//調用bookdao中添加圖書的函數dao.AddBook(book)//調用GetBooks函數再查詢一次GetBooks(w, r)}bookdao.go
// AddBook 向數據庫中添加一本圖書 func AddBook(b *model.Book) error {//寫sqlsqlStr := "insert into books(title,author,price,sales,stock,img_path) values(?,?,?,?,?,?)"//執行sql_, err := utils.Db.Exec(sqlStr,b.Title,b.Author,b.Price,b.Sales,b.Stock,b.ImgPath)if err != nil {return err}return nil }刪除圖書
book_manager.html
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>圖書管理</title> <link type="text/css" rel="stylesheet" href="/static/css/style.css" > <script src="/static/script/jquery-1.7.2.js"></script> <script>$(function() {//給刪除圖書的超鏈接綁定事件$(".deleteBook").click(function() {//獲取書名var title = $(this).attr("id");// var flag = confirm("確定要刪除["+title+"] 這本圖書嗎?");// if (!flag){// //取消默認行為// return false;// }return confirm("確定要刪除["+title+"] 這本圖書嗎?");});}); </script> </head> <body><div id="header"><img class="logo_img" alt="" src="/static/img/logo.gif" ><span class="wel_word">圖書管理系統</span><div><a href="/pages/manager/book_manager.html">圖書管理</a><a href="/">返回商城</a></div></div><div id="main"><table><tr><td>名稱</td><td>價格</td><td>作者</td><td>銷量</td><td>庫存</td><td colspan="2">操作</td></tr>{{range .}}<tr><td>{{.Title}}</td><td>{{.Price}}</td><td>{{.Author}}</td><td>{{.Sales}}</td><td>{{.Stock}}</td><td><a href="/pages/manager/book_edit.html">修改</a></td><td><a id="{{.Title}}" class="deleteBook" href="/deleteBook?bookId={{.Id}}">刪除</a></td></tr>{{end}}<tr><td></td><td></td><td></td><td></td><td></td><td></td><td><a href="/pages/manager/book_edit.html">添加圖書</a></td></tr></table></div><div id="bottom"><span>五行哥書城.Copyright ©2015</span></div> </body> </html>main.go
//刪除圖書http.HandleFunc("/deleteBook", controller.DeleteBook)bookhandler.go
// DeleteBook 刪除圖書 func DeleteBook(w http.ResponseWriter, r *http.Request) {//獲取要刪除的圖書的idbookID := r.FormValue("bookId")//調用bookdao中刪除圖書函數dao.DeleteBook(bookID)//調用GetBooks函數再查詢一次GetBooks(w, r)}bookdao.go
//DeleteBook 根據圖書的id從數據庫中刪除圖書 func DeleteBook(bookID string) error {//寫sqlsqlStr := "delete from books where id = ?"//執行_, err := utils.Db.Exec(sqlStr, bookID)if err != nil {return err}return nil }修改圖書
分頁功能
首頁圖書顯示
總結
以上是生活随笔為你收集整理的GoWeb 书城项目的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 女解码高手王小云 十年破译五部顶级密码
- 下一篇: EMC存储 CLARiiON or VN