go的web框架Iris和gorm搭建基礎版本的增刪改查

 

go語言 有很多優秀的web框架,於是乎,就自己動手 從零開始搭建一個demo,除了有些東西下載比較麻煩,其它的都很好弄,下面貼出我搭建的工程.在開始項目之前需要下載並安裝好go的環境以及iris還有gorm的環境.

一:首先貼出我的項目結構圖:

二:各分層情況代碼

   controlle層

package controllers

import (
	"github.com/kataras/iris/context"
	"github.com/spf13/cast"
	"iris_demo/models"
	"iris_demo/service"
	"log"
)

type UserController struct {
	Service service.UserService
}
func NewUserController() *UserController {
	return &UserController{Service:service.NewUserService()}
}
//查詢所有
func (self *UserController) GetList()(result *models.Result) {
	return self.Service.GetUserList()
}

//保存 and 修改
func (self *UserController) PostSaveUser(ctx context.Context)(result models.Result)  {
	user := new(models.User)
	err := ctx.ReadForm(user)
   if err != nil{
		log.Println(err)
		result.Msg = "數據有錯誤"
		return
	}
	return self.Service.PostSaveUser(*user)
}

//根據id查詢
func (self *UserController) GetUserById(ctx context.Context)(result models.Result)  {
	id := ctx.PostValue("id")
	if id == "" {
		result.Code = 400
		result.Msg = "缺少參數id"
		return
	}
	return self.Service.GetUserById(cast.ToUint(id))
}

//根據id刪除
func (self *UserController) PostDelUser(ctx context.Context)(result models.Result)  {
	id := ctx.PostValue("id")
	if id == "" {
		result.Code = 400
		result.Msg = "缺少參數id"
		return
	}
	return self.Service.DelUser(cast.ToUint(id))
}

service層

package service

import (
	"iris_demo/models"
	"iris_demo/repo"
)
type UserService interface {
	GetUserList () *models.Result
	PostSaveUser(user models.User) (result models.Result)
	GetUserById(id uint) (result models.Result)
	DelUser(id uint) (result models.Result)
}

type userService struct {}

func NewUserService() UserService{
	return &userService{}
}

var userRepo = repo.NewUserRepository()

func (self userService)GetUserList()  *models.Result{
	books := userRepo.GetUserList()
	result := new (models.Result)
	result.Data = books
	result.Code = 200
	result.Msg ="SUCCESS"
	return result
}
func (self userService) PostSaveUser(user models.User)(result models.Result){
	err := userRepo.SaveUser(user)
	if err != nil{
		result.Code = 400
		result.Msg = err.Error()
	}else{
		result.Code = 200
		result.Msg ="SUCCESS"
		user := userRepo.GetUserByName(user.Name)
		result.Data = user
	}
	return
}
func (self userService) GetUserById(id uint)(result models.Result){
	user,err := userRepo.GetUserById(id)
	if err!= nil{
		result.Code = 400
		result.Msg = err.Error()
	}else{
		result.Data = user
		result.Code = 200
		result.Msg ="SUCCESS"
	}
	return result
}
func (self userService) DelUser(id uint)(result models.Result){
	err := userRepo.DeleteUser(id)
	if err!= nil{
		result.Code = 400
		result.Msg = err.Error()
	}else{
		result.Code = 200
		result.Msg ="SUCCESS"
		list := userRepo.GetUserList()
		result.Data = list

	}
	return
}

Repository層

package repo

import (
	"iris_demo/datasource"
	"iris_demo/models"
)
type UserRepository interface {
	GetUserList() *[]models.User
	SaveUser(book models.User)(err error)
	GetUserById(id uint)(book models.User,err error)
	DeleteUser(id uint)(err error)
	GetUserByName(name string )*[]models.User
}
func NewUserRepository() UserRepository{
	return &userRepository{}
}
var db = datasource.GetDB()

type userRepository struct {}

func (self userRepository) GetUserList()*[]models.User{
	user:= new([]models.User)
	err:=db.Raw(`select * FROM user`).Scan(user).RowsAffected
	if err > 0 {
		return user
	}else{
		return nil
	}
}
func (self userRepository)GetUserByName(name string )*[]models.User{
	user:= new([]models.User)
	err:=db.Raw(`select * FROM user where user.name = ?`,name).Scan(user).RowsAffected
	if err > 0 {
		return user
	}else{
		return nil
	}
}


func (self userRepository) SaveUser(user models.User)(err error){
	if user.ID != 0{
		err := db.Save(&user).Error
		return err
	}else {
		err := db.Create(&user).Error
		return err
	}
}
func (self userRepository) GetUserById(id uint)(user models.User,err error){
	err = db.First(&user,id).Error
	return user,err
}
func (self userRepository) DeleteUser(id uint)(err error){
	user:= new(models.User)
	user.ID = id
	err = db.Unscoped().Delete(&user).Error
	return err
}

 入口main 方法

package main

import (
	"flag"
	"github.com/kataras/iris"
	"iris_demo/conf"
	"iris_demo/route"
)

func main() {
	flag.Parse()
	app := newApp()
	route.InitRouter(app)
	err := app.Run(iris.Addr(":"+conf.Sysconfig.Port), iris.WithoutServerError(iris.ErrServerClosed))
	if err != nil {
		panic(err)
	}
}

func newApp() *iris.Application {
	app := iris.New()
	app.Configure(iris.WithOptimizations)
	app.AllowMethods(iris.MethodOptions)
	return app
}

model

  user

package models

type User struct {
	ID            uint       `gorm:"primary_key"`
	Name          string     `gorm:"type:varchar(20);not null;"`
	Age           string     `gorm:"type:varchar(10);not null;"`
	Sex           string     `gorm:"type:varchar(20);not null;"`
}


 Result

package models

type Result struct {
	Code   int
	Msg    string
	Data   interface{}
}

func NewResult(data interface{}, c int, m ...string) *Result {
	r := &Result{Data: data, Code: c}

	if e, ok := data.(error); ok {
		if m == nil {
			r.Msg = e.Error()
		}
	} else {
		r.Msg = "SUCCESS"
	}
	if len(m) > 0 {
		r.Msg = m[0]
	}

	return r
}

初始化表

package datasource

import (
	"iris_demo/models"
)
// 初始化表 如果不存在該表 則自動創建
func Createtable() {
	GetDB().AutoMigrate(
		&models.User{},
	)
}

數據庫連接

package datasource

import (
	_ "github.com/go-sql-driver/mysql"
	"github.com/jinzhu/gorm"
	"iris_demo/conf"
	"strings"
	"time"
)

var db *gorm.DB

func GetDB() *gorm.DB {
	return db
}

func init() {
	path := strings.Join([]string{conf.Sysconfig.DBUserName, ":", conf.Sysconfig.DBPassword, "@(", conf.Sysconfig.DBIp, ":", conf.Sysconfig.DBPort, ")/", conf.Sysconfig.DBName, "?charset=utf8&parseTime=true"}, "")
	var err error
	db, err = gorm.Open("mysql", path)
	if err !=nil{
		panic(err)
	}
	db.SingularTable(true)
	db.DB().SetConnMaxLifetime(1 * time.Second)
	db.DB().SetMaxIdleConns(20)   //最大打開的連接數
	db.DB().SetMaxOpenConns(2000) //設置最大閒置個數
	db.SingularTable(true)	//表生成結尾不帶s
	// 啓用Logger,顯示詳細日誌
	db.LogMode(true)
	Createtable();
}

 

 

路由設置

package route

import (
"github.com/kataras/iris"
"github.com/kataras/iris/mvc"
"iris_demo/controllers"
)

func InitRouter(app *iris.Application) {
	bathUrl := "/api"
	mvc.New(app.Party(bathUrl +"/user")).Handle(controllers.NewUserController())
}

 

 數據庫參數設置 config.json

{
  "Port": "端口",
  "DBUserName": "root",
  "DBPassword": "數據庫密碼",
  "DBIp": "數據庫地址",
  "DBPort": "3306",
  "DBName": "數據庫Name"
}

配置config

package conf

import (
	"github.com/json-iterator/go"
	"io/ioutil"
)

var Sysconfig = &sysconfig{}

func init() {
	//指定對應的json配置文件
	b, err := ioutil.ReadFile("config.json")
	if err != nil {
		panic("Sys config read err")
	}
	err = jsoniter.Unmarshal(b, Sysconfig)
	if err != nil {
		panic(err)
	}

}

type sysconfig struct {
	Port         string    `json:"Port"`
	DBUserName   string    `json:"DBUserName"`
	DBPassword   string    `json:"DBPassword"`
	DBIp         string    `json:"DBIp"`
	DBPort       string    `json:"DBPort"`
	DBName       string    `json:"DBName"`

}

啓動項目,第一次啓動會自動給我們創建表,我們可以通過控制檯看到日誌

三:測試

   添加數據

    

在查看數據庫,可以看到數據插入成功

  修改數據

數據庫

根據ID查詢

查詢所有(爲了看到效果 我在插入一條)

 

根據ID刪除數據(刪除之後 我們在查詢所有 會發現我們那條數據已經被刪除掉了)

查看數據庫發現只有一條了

 

到此,簡單的增刪改查已經全部完成.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章