第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定

手把手教你寫(xiě)第一個(gè) Golang 接口

標(biāo)簽:
Go 接口測(cè)試

图片描述

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() 方法,我们从方法内部定义好路由 /loginLoginController() 方法绑定。使得请求 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
}
點(diǎn)擊查看更多內(nèi)容
2人點(diǎn)贊

若覺(jué)得本文不錯(cuò),就分享一下吧!

評(píng)論

作者其他優(yōu)質(zhì)文章

正在加載中
感謝您的支持,我會(huì)繼續(xù)努力的~
掃碼打賞,你說(shuō)多少就多少
贊賞金額會(huì)直接到老師賬戶(hù)
支付方式
打開(kāi)微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊(cè)有機(jī)會(huì)得

100積分直接送

付費(fèi)專(zhuān)欄免費(fèi)學(xué)

大額優(yōu)惠券免費(fèi)領(lǐng)

立即參與 放棄機(jī)會(huì)
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)

舉報(bào)

0/150
提交
取消