User 登录接口
文件目录结构
- src
- user
- TbUserController.go --------------- user 模块控制器
- TbUserService.go ----------------- user 逻辑层
- TbUserDao.go -------------------- user 数据操作层
- TbUser.go ----------------------- user 数据模型层
- main.go --------------------------------- 入口文件
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()
}
TbUserController - user 模块控制器
程序从 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 )
}
TbUserService.go - 登陆逻辑
将请求传递的 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
}
TbUserDao.go - 数据操作层
用 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
}
TbUser.go - 数据传输类
package user
type TbUser struct {
Id int64
Username string
Password string
Phone string
Email string
Created string
Updated string
}
DBUtils.go - 数据库工具类
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
}
EgoResult.go - 结果返回类
package commons
type EgoResult struct {
Status int
}