åæåç»ï¼ä¸ä¸åæ们å®æäºç¨æ·ç®¡ç模åçCURD(å¢å æ¹æ¥)åè½ï¼åè½å±é¢ï¼æ ç大è§ï¼ä½æä¸ä¸ªç»ææ§ç缺é·æ¾èæè§ï¼é£å°±æ¯é¡¹ç®ç»æè¿åº¦è¦åï¼é¡¹ç®çè¦åæ§(Coupling)ï¼ä¹å«è¦å度ï¼è¿èè¨ä¹ï¼æ¨¡åä¹é´çå ³ç³»ï¼æ¯å¯¹é¡¹ç®ç»æä¸å模åé´ç¸äºè系紧å¯ç¨åº¦çä¸ç§éåãè¦åç强弱åå³äºæ¨¡åé´è°ç¨çå¤ææ§ãè°ç¨æ¨¡åä¹é´çæ¹å¼ä»¥åéè¿å½æ°æè æ¹æ³ä¼ éæ°æ®å¯¹è±¡çå¤å°ã模åé´çè¦å度æ¯æ模åä¹é´çä¾èµå ³ç³»ï¼å æ¬å å«å ³ç³»ãæ§å¶å ³ç³»ãè°ç¨å ³ç³»ãæ°æ®ä¼ éå ³ç³»ä»¥åä¾èµå ³ç³»ã项ç®æ¨¡åçç¸äºä¾èµè¶å¤ï¼å ¶è¦åæ§è¶å¼ºï¼åæ¶è¡¨æå ¶ç¬ç«æ§è¶å·®ï¼æå é¾ä»¥ç»´æ¤ã
项ç®ç»æä¼å
ç®åIrisBlog项ç®çé®é¢å°±æ¯ç¬ç«æ§å¤ªå·®ï¼æªè³ç®å为æ¢ï¼é¡¹ç®ç»æå¦ä¸ï¼
.
âââ README.md
âââ assets
â âââ css
â â âââ style.css
â âââ js
â âââ axios.js
â âââ vue.js
âââ favicon.ico
âââ go.mod
âââ go.sum
âââ main.go
âââ model
â âââ model.go
âââ mytool
â âââ mytool.go
âââ tmp
â âââ runner-build
âââ views
âââ admin
â âââ user.html
âââ index.html
âââ test.html
ä¸æèç¥ï¼å端页é¢(views)以åéææ件(assets)çå·¥ç¨åå°å¯ï¼ä¸åéè¦è¿è¡åå±æä½ï¼ä½æ¯å¨å端ï¼è½ç¶æ¨¡åå±(model.go)åå·¥å ·å±(mytool.go)å·²ç»å离åºä¸»æ¨¡åï¼ä½ä¸»è¦ä¸å¡ä»£ç è¿æ¯éä¸å¨å ¥å£æ件main.goä¸ï¼
package main
import (
"IrisBlog/model"
"IrisBlog/mytool"
"fmt"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
"github.com/kataras/iris/v12"
)
func main() {
db, err := gorm.Open("mysql", "root:root@(localhost)/irisblog?charset=utf8mb4&parseTime=True&loc=Local")
if err != nil {
fmt.Println(err)
panic("æ æ³è¿æ¥æ°æ®åº")
}
fmt.Println("è¿æ¥æ°æ®åºæå")
//åæ°æ¨¡å¼
db.SingularTable(true)
// å建é»è®¤è¡¨
db.AutoMigrate(&model.User{})
// é»è¾ç»æåå
³éæ°æ®åº
defer func() {
_ = db.Close()
}()
app := newApp(db)
app.HandleDir("/assets", iris.Dir("./assets"))
app.Favicon("./favicon.ico")
app.Listen(":5000")
}
func newApp(db *gorm.DB) *iris.Application {
app := iris.New()
tmpl := iris.HTML("./views", ".html")
// Set custom delimeters.
tmpl.Delims("${", "}")
// Enable re-build on local template files changes.
tmpl.Reload(true)
app.RegisterView(tmpl)
app.Delete("/admin/user_action/", func(ctx iris.Context) {
ID := ctx.URLParamIntDefault("id", 0)
db.Delete(&model.User{}, ID)
ret := map[string]string{
"errcode": "0",
"msg": "å é¤ç¨æ·æå",
}
ctx.JSON(ret)
})
app.Put("/admin/user_action/", func(ctx iris.Context) {
ID := ctx.PostValue("id")
Password := ctx.PostValue("password")
user := &model.User{}
db.First(&user, ID)
user.Password = mytool.Make_password(Password)
db.Save(&user)
ret := map[string]string{
"errcode": "0",
"msg": "æ´æ°å¯ç æå",
}
ctx.JSON(ret)
})
app.Post("/admin/user_action/", func(ctx iris.Context) {
username := ctx.PostValue("username")
password := ctx.PostValue("password")
fmt.Println(username, password)
md5str := mytool.Make_password(password)
user := &model.User{Username: username, Password: md5str}
res := db.Create(user)
if res.Error != nil {
fmt.Println(res.Error)
ret := map[string]string{
"errcode": "1",
"msg": "ç¨æ·åä¸è½éå¤",
}
ctx.JSON(ret)
return
}
ret := map[string]string{
"errcode": "0",
"msg": "ok",
}
ctx.JSON(ret)
})
return app
}
å ¥å£æ件main.goæ¿è½½äºå¤ªå¤ä¸å¡ï¼æ¢éè¦è´è´£æ°æ®åºç»æä½çå建ï¼åå¾æå¿æ¨¡æ¿ç渲æåæ¥å£é»è¾çç¼åï¼è¯´ç½äºï¼æ³¥æ²ä¿±ä¸ï¼æ²æ¸£æ³èµ·ã
äºå®ä¸ï¼åè¿æ ·æææ代ç é½å å°ä¸ä¸ªæ件ä¸ï¼è¿ä¼å¸¦æ¥åä½é®é¢ï¼æ¯å¦ï¼å½ä½ è±äºä¸æ´å¤©çæ¶é´ï¼å¥½ä¸å®¹æå®æäºä¸æ®µä¸å¡é»è¾ï¼ä¹éè¿äºæ¬å°æµè¯ï¼åå¤ç¬¬äºå¤©æ交线ä¸æµè¯ï¼ä½æ¯ç¬¬äºå¤©ä¸çæ¶å´åç°è¿ä¸ªé»è¾è«åå ¶å¦å°å¼å§æ¥éäºï¼è¿é常æ¯å 为æåäºå¨ä½ èµ°åä¿®æ¹äºä½ ç¼åæè ä¾èµçé£ä¸ªæ¨¡åï¼å½æ ¹ç»åºï¼å¹¶ä¸å®å ¨æ¯åä½çé®é¢ï¼é¡¹ç®ç»æä¹æ¯å ç´ ä¹ä¸ã
å¤ä¸ªç ååæ¶ä¿®æ¹äºåä¸ä¸ªæºä»£ç æ件ãè½ç¶å¨è§æ¨¡ç¸å¯¹è¾å°ã人åè¾å°ç项ç®ä¸ï¼è¿ç§é®é¢æ许并ä¸ä¸¥éï¼ä½æ¯éç项ç®çå¢é¿ï¼ç å人åçå¢å ï¼è¿ç§æ¯å¤©æ©ä¸åä¸çæ¶é½è¦ç»åä¸éççè¦å°±ä¼è¶æ¥è¶å¤ï¼çè³ä¼ä¸¥éå°è®©æçå¢éå¨é¿è¾¾æ°å¨çæ¶é´å é½ä¸è½åå¸ä¸ä¸ªç¨³å®ç项ç®çæ¬ï¼å 为æ¯ä¸ªäººé½å¨ä¸åå°ä¿®æ¹èªå·±ç代ç ï¼ä»¥éåºå ¶ä»äººææ交çåæ´ï¼å¨èå¤å§ï¼æ¶æ§å¾ªç¯ã
æ以æä»¬å¿ é¡»æä¸å¡åç¬æ½ç¦»åºæ¥ï¼æ¯å¦ç¨æ·ç®¡çå ¶å®æ¯åå°æ¨¡ååè½ï¼åªæç¹å®ç管çåæå¯è½å¨å ¶é¡µé¢è¿è¡æä½ï¼æ以æ们å¯ä»¥åç¬å建ä¸ä¸ªæ§å¶å±ï¼
mkdir handler
cd hanler
éåç¼ååå°æ§å¶é»è¾admin.go:
package handler
import (
"github.com/kataras/iris/v12"
)
//ç¨æ·ç®¡ç页é¢æ¨¡æ¿
func Admin_user_page(ctx iris.Context) {
ctx.View("/admin/user.html")
}
è¿éæç¨æ·ç®¡ç页é¢ç解æå½æ°åç¬æ½ç¦»å¨handlerå ä¸ï¼æ³¨æå½æ°çé¦åæ¯è¦è¿è¡å¤§åå¤çï¼å 为é¦åæ¯å°åå½æ°æ¯ç§æå½æ°ï¼åªè½å¨å å 使ç¨ï¼æ æ³è¢«å«çå è°ç¨ã
éåæ¹é å ¥å£æ件main.goé»è¾:
app.Get("/admin/user/", handler.Admin_user_page)
è·¯ç±å¹é æ¶ï¼åªéè¦å¼å ¥handlerå ä¸çAdmin_user_pageå½æ°å°±å¯ä»¥äºã
éåï¼å¯¹è·¯ç±è¿è¡åç»ä¼åï¼åå±ä¸ä¸ªä¸å¡ç模åç»å®å¨åä¸ä¸ªåç»ä¸ï¼
adminhandler := app.Party("/admin")
{
adminhandler.Use(iris.Compression)
adminhandler.Get("/user/", handler.Admin_user_page)
adminhandler.Get("/userlist/", handler.Admin_userlist)
adminhandler.Delete("/user_action/", handler.Admin_userdel)
adminhandler.Put("/user_action/", handler.Admin_userupdate)
adminhandler.Post("/user_action/", handler.Admin_useradd)
}
å¦æ¤ï¼ä¸å¡åè·¯ç±è§£æ就彻åºåå¼äºï¼ç»æä½å建å½æ°ä¹æ¸ ç½äºä¸å°ï¼
func newApp(db *gorm.DB) *iris.Application {
app := iris.New()
tmpl := iris.HTML("./views", ".html")
tmpl.Delims("${", "}")
tmpl.Reload(true)
app.RegisterView(tmpl)
adminhandler := app.Party("/admin")
{
adminhandler.Use(iris.Compression)
adminhandler.Get("/user/", handler.Admin_user_page)
adminhandler.Get("/userlist/", handler.Admin_userlist)
adminhandler.Delete("/user_action/", handler.Admin_userdel)
adminhandler.Put("/user_action/", handler.Admin_userupdate)
adminhandler.Post("/user_action/", handler.Admin_useradd)
}
return app
}
æ°æ®å±ç»æä¼å
ä¸å¡å±è¿è¡äºæåï¼ä½æ¯æ°æ®å±è¿éæå¨å ¥å£æ件ä¸main.go:
package main
import (
"IrisBlog/handler"
"IrisBlog/model"
"fmt"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
"github.com/kataras/iris/v12"
)
func main() {
db, err := gorm.Open("mysql", "root:root@(localhost)/irisblog?charset=utf8mb4&parseTime=True&loc=Local")
if err != nil {
fmt.Println(err)
panic("æ æ³è¿æ¥æ°æ®åº")
}
fmt.Println("è¿æ¥æ°æ®åºæå")
//åæ°æ¨¡å¼
db.SingularTable(true)
// å建é»è®¤è¡¨
db.AutoMigrate(&model.User{})
// é»è¾ç»æåå
³éæ°æ®åº
defer func() {
_ = db.Close()
}()
app := newApp(db)
app.HandleDir("/assets", iris.Dir("./assets"))
app.Favicon("./favicon.ico")
app.Listen(":5000")
}
è¿éçå«ä¹æ¯ï¼ä¸æ¦è¿å ¥å ¥å£é»è¾ï¼å°±ç«å»åå§åæ°æ®åºï¼éåæ§è¡ä¸å¡ä»£ç ï¼å½ä¸å¡æ§è¡å®æ¯åï¼å©ç¨å»¶è¿å½æ°deferå ³éæ°æ®åºé¾æ¥ã
è¿ç§é»è¾çå¼ç«¯æ¯ï¼ä¸æ¦æ°æ®åºæå¡ææï¼æ´ä¸ªé¡¹ç®æå¡ä¹ä¼åå½±åï¼åè ï¼å¾å¤çº¯éæå页é¢å¹¶ä¸éè¦æ°æ®åºé¾æ¥ï¼æ¯ä¸æ¬¡é½é¾æ¥æ°æ®åºï¼æ¾ç¶æ¯ç»è添足ã
æ以åç¬å»ºç«æ°æ®å ï¼
mkdir database
cd database
建ç«æ°æ®å±é»è¾database.go:
package database
import (
"IrisBlog/model"
"fmt"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
)
func Db() *gorm.DB {
db, err := gorm.Open("mysql", "root:root@(localhost)/irisblog?charset=utf8mb4&parseTime=True&loc=Local")
if err != nil {
fmt.Println(err)
panic("æ æ³è¿æ¥æ°æ®åº")
}
fmt.Println("è¿æ¥æ°æ®åºæå")
//åæ°æ¨¡å¼
db.SingularTable(true)
// å建é»è®¤è¡¨
db.AutoMigrate(&model.User{})
return db
}
è¿éæ们æ建å½æ°Db()ï¼å®è¿åä¸ä¸ªæ°æ®åºæä½çç»æä½æéï¼ä¸é¨ç¨æ¥æ§è¡æ°æ®åºæä½ï¼éè¦æ³¨æçæ¯ï¼å é¤å½æ°å ä¹åç延ådeferå ³éé¾æ¥å½æ°ï¼å¦åé¾æ¥å¨å½æ°ä½å å°±å ³éäºï¼è°ç¨æ¹å°±æ æ³ä½¿ç¨æ°æ®åºäºã
è°ç¨ä¸ï¼ç´æ¥è°ç¨databaseå ä¸çDb()ï¼å°±å¯ä»¥ç´æ¥ä½¿ç¨æ°æ®åºæéäºï¼
//ç¨æ·å表æ¥å£
func Admin_userlist(ctx iris.Context) {
db := database.Db()
var users []model.User
res := db.Find(&users)
// é»è¾ç»æåå
³éæ°æ®åº
defer func() {
_ = db.Close()
}()
ctx.JSON(res)
}
éåï¼ç»§ç»ä¼åå ¥å£æ件ï¼
package main
import (
"IrisBlog/handler"
"github.com/kataras/iris/v12"
)
func main() {
app := newApp()
app.HandleDir("/assets", iris.Dir("./assets"))
app.Favicon("./favicon.ico")
app.Listen(":5000")
}
func newApp() *iris.Application {
app := iris.New()
tmpl := iris.HTML("./views", ".html")
tmpl.Delims("${", "}")
tmpl.Reload(true)
app.RegisterView(tmpl)
adminhandler := app.Party("/admin")
{
adminhandler.Use(iris.Compression)
adminhandler.Get("/user/", handler.Admin_user_page)
adminhandler.Get("/userlist/", handler.Admin_userlist)
adminhandler.Delete("/user_action/", handler.Admin_userdel)
adminhandler.Put("/user_action/", handler.Admin_userupdate)
adminhandler.Post("/user_action/", handler.Admin_useradd)
}
}
è¿éä¼åäºmainå½æ°ï¼ä½¿å ¶é»è¾æ´å ç®æåæ¸ æ°ã
æåï¼ä¼åæ°æ®å±é»è¾database.go:
package database
import (
"IrisBlog/model"
"fmt"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
_ "github.com/jinzhu/gorm/dialects/sqlite"
)
const db_type int = 1
func sqlite3() *gorm.DB {
db, err := gorm.Open("sqlite3", "/tmp/IrisBlog.db")
if err != nil {
fmt.Println(err)
panic("æ æ³è¿æ¥æ°æ®åº")
}
fmt.Println("è¿æ¥sqlite3æ°æ®åºæå")
return db
}
func mysql() *gorm.DB {
db, err := gorm.Open("mysql", "root:root@(localhost)/irisblog?charset=utf8mb4&parseTime=True&loc=Local")
if err != nil {
fmt.Println(err)
panic("æ æ³è¿æ¥æ°æ®åº")
}
fmt.Println("è¿æ¥mysqlæ°æ®åºæå")
return db
}
func Db() *gorm.DB {
switch db_type {
case 0:
db := mysql()
//åæ°æ¨¡å¼
db.SingularTable(true)
// å建é»è®¤è¡¨
db.AutoMigrate(&model.User{})
return db
case 1:
db := sqlite3()
//åæ°æ¨¡å¼
db.SingularTable(true)
// å建é»è®¤è¡¨
db.AutoMigrate(&model.User{})
return db
default:
panic("æªç¥çæ°æ®åº")
}
}
è¿éæ们åå«å°è£ mysqlåsqlite3æ°æ®åºæéå½æ°ï¼ç¶åéè¿switchè¯å¥æ¥æ ¹æ®ä¸åçå¼åç¯å¢èè¿è¡åæ¢åæ§å¶ã
è³æ¤ï¼é¡¹ç®ç»æçé¦æ¬¡ç»ææ§ä¼åå°±å®æäºï¼ä¼ååçç»æå¦ä¸ï¼
âââ README.md
âââ assets
â âââ css
â â âââ style.css
â âââ js
â âââ axios.js
â âââ vue.js
âââ database
â âââ database.go
âââ favicon.ico
âââ go.mod
âââ go.sum
âââ handler
â âââ admin.go
âââ main.go
âââ model
â âââ model.go
âââ mytool
â âââ mytool.go
âââ tmp
â âââ runner-build
âââ views
âââ admin
â âââ user.html
âââ index.html
âââ test.html
ç»è¯
为ä»ä¹æ们ä¸å¼å§ä¸ç´æ¥éç¨ä½è¦åé«å èç项ç®æ¶æï¼å 为å«äººçç»éªå¹¶ä¸æ¯æ们çç»éªï¼åªæçæ£ç»åè¿ææ¯çå®çå¼åç»éªï¼é¡¹ç®å¼å没ææ åçæ¡ï¼åªæéæ©ï¼ç¶åæ¿æ åæï¼åªæå°è¯è¿è¦æ¶©çæå®ä¹åï¼ä¸ä¸æ¬¡æä¼ååºæ£ç¡®çéæ©ã该项ç®å·²å¼æºå¨Githubï¼https://github.com/zcxey2911/IrisBlog ï¼ä¸åå ±è§ï¼ååå ±åã