文件目录结构
- src - user - TbUserController.go --------------- user 模块控制器 - TbUserService.go ----------------- user 逻辑层 - TbUserDao.go -------------------- user 数据操作层 - TbUser.go ----------------------- user 数据模型层 - main.go --------------------------------- 入口文件
http.Server 是 golang 自带 http 服务类,http.Server{ Addr: ":8899" }
表示监听来自 localhost:8899 端口请求;s.ListenAndServe()
表示持续监听
import ( "net/http" "user" ) func main() { s := http.Server{ Addr: ":8899" } // 调用所有user模块 handle user.UserHandle() s.ListenAndServe() }
程序从 main.go 进入 user.UserHandle()
方法,我们从方法内部定义好路由 /login
与 LoginController()
方法绑定。使得请求 http://localhost:8899/login
调起 LoginController()
执行
import ( "encoding/json" "net/http" ) // 所有 user 模块 handle func UserHandle() { http.HandleFunc( "/login", LoginController ) } // 登陆控制器 func LoginController( w http.ResponseWriter, r *http.Request ) { username := r.FormValue( "un" ) // 接收参数 pwd := r.FormValue( "pwd" ) er := LoginService( username, pwd ) // 登陆逻辑 b, _ := json.Marshal( er ) // 结构转对象 w.Header().Set( "Content-Type", "application/json;charset=utf-8" ) w.Write( b ) }
将请求传递的 un
用户名 & pwd
密码,传入数据操作层进行数据库查询是否存在该用户,密码是否一致后。判断返回结果给页面
import "commons" // 登陆逻辑 func LoginService( un, pwd string ) ( er commons.EgoResult ) { u := SelBuUnPedDao( un, pwd ) // 数据操作层 if u != nil { er.Status = 200 }else{ er.Status = 400 } return er }
用 un
用户名 & pwd
密码 查询数据库
import ( "commons" "fmt" ) // 更加用户名,密码查询 func SelBuUnPedDao( un, pwd string ) *TbUser { sql := "select * from tb_user where username=? and password=? or email=? and password=? or phone=? and password=?" rows, err := commons.Dql( sql, un, pwd, un, pwd, un, pwd ) if err != nil { fmt.Println( err ) return nil } if rows.Next() { // 因为这里只有一个,多个需要for user := new( TbUser ) // TbUser 结构充当数传输类 rows.Scan( &user.Id, &user.Username, &user.Password, &user.Phone, &user.Email, &user.Created, &user.Updated ) commons.CloseConn() return user } return nil }
package user type TbUser struct { Id int64 Username string Password string Phone string Email string Created string Updated string }
package commons import ( "database/sql" _ "github.com/go-sql-driver/mysql" "fmt" ) var ( db *sql.DB stmt *sql.Stmt rows *sql.Rows ) func openConn() ( err error ) { db, err = sql.Open( "mysql", "root@tcp(localhost:3306)/packagist" ) if err != nil { fmt.Println( "数据库链接错误,", err ) return } return nil } func CloseConn() ( err error ) { if rows != nil { rows.Close() } if stmt != nil { stmt.Close() } if db != nil { db.Close() } return } // sql, 不定参数 func Dml( sql string, args ... interface{}) ( int64, error ) { err := openConn() if err != nil { fmt.Println( "执行 DML 出现错误" ) return 0, err } stmt, err = db.Prepare( sql ) if err != nil { fmt.Println( "预处理 DML 出现错误" ) return 0, err } // 此处需要 ... 表示切片,如果没有表示数组,会报错 ret, err := stmt.Exec( args ... ) if err != nil { fmt.Println( "执行 DML 出现错误" ) return 0, err } // 此处需要 ... 表示切片,如果没有表示数组,会报错 count, err := ret.RowsAffected() if err != nil { fmt.Println( "获取影响行数出现错误" ) return 0, err } CloseConn() return count, err } func Dql( sql string, args ... interface{}) ( *sql.Rows, error ) { err := openConn() if err != nil { fmt.Println( "执行 DML 出现错误" ) return nil, err } stmt, err = db.Prepare( sql ) if err != nil { fmt.Println( "预处理 DML 出现错误" ) return nil, err } // 此处需要 ... 表示切片,如果没有表示数组,会报错 rows, err := stmt.Query( args ... ) if err != nil { fmt.Println( "执行 DML 出现错误" ) return nil, err } // 此处没关闭, 调用时需要注意关闭 return rows, nil }
package commons type EgoResult struct { Status int }