技术
web框架:Gin
数据库: MySQL
MySQL操作:Gorm
目录结构
├─ .gitignore
│ go.mod // 项目依赖
│ go.sum
│ main.go //主程序
│
├─assets // 静态资源
├─css
├─js
├─editormd
├─controller // 项目控制器
controller.go
├─dao // 数据库访问
dao.go
├─router // 路由
router.go
├─model // 生成数据库的结构体
model.go
├─templates // 模板文件
detail.html
header.html
index.html
login.html
post.html
postIndex.html
regiter.html
controller
controller\controller.go:
package controller
import (
"blog/dao"
"blog/model"
"fmt"
"html/template"
"log"
"strconv"
"github.com/gin-gonic/gin"
"github.com/russross/blackfriday/v2"
)
func RegisterUser(c *gin.Context) {
username := c.PostForm("username")
password := c.PostForm("password")
user := model.User{
Username: username,
Password: password,
}
dao.Mgr.RegisterUser(&user)
c.Redirect(301, "/")
}
func GoRegister(c *gin.Context) {
c.HTML(200, "register.html", nil)
}
func Login(c *gin.Context) {
username := c.PostForm("username")
password := c.PostForm("password")
fmt.Println(username)
u := dao.Mgr.Login(username)
if u.Username == "" {
c.HTML(200, "login.html", "用户名不存在")
fmt.Println("用户名不存在")
} else {
if u.Password != password {
c.HTML(200, "login.html", "密码错误")
fmt.Println("密码错误")
} else {
c.Redirect(301, "/")
fmt.Println("登陆成功")
}
}
}
func GoLogin(c *gin.Context) {
c.HTML(200, "login.html", nil)
}
func Index(c *gin.Context) {
c.HTML(200, "index.html", nil)
}
func ListUser(c *gin.Context) {
c.HTML(200, "userlist.html", nil)
}
// 操作博客
// 获取博客列表
func GetPostIndex(c *gin.Context) {
posts := dao.Mgr.GetAllPost()
c.HTML(200, "postIndex.html", posts)
}
// 添加博客
func AddPost(c *gin.Context) {
title := c.PostForm("title")
tag := c.PostForm("tag")
content := c.PostForm("content")
post := model.Post{
Title: title,
Tag: tag,
Content: content,
}
dao.Mgr.AddPost(&post)
c.Redirect(302, "/post_index")
}
// 跳转到添加博客
func GoAddPost(c *gin.Context) {
c.HTML(200, "post.html", nil)
}
// 显示博客详细
func PostDetail(c *gin.Context) {
s := c.Query("pid")
pid, err := strconv.Atoi(s)
if err != nil {
log.Fatal(err)
}
p := dao.Mgr.GetPost(pid)
content := blackfriday.Run([]byte(p.Content)) // blackfriday库:将markdown格式转化成html格式
c.HTML(200, "detail.html", gin.H{
"Title": p.Title,
"Content": template.HTML(content),
})
}
dao
dao\dao.go:
package dao
import (
"blog/model"
"log"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
type Manager interface {
RegisterUser(user *model.User)
Login(username string) model.User
// 博客操作
AddPost(post *model.Post) // 添加博客
GetAllPost() []model.Post // 获取多个博客
GetPost(pid int) model.Post // 获取单个博客
}
type manager struct {
db *gorm.DB
}
var Mgr Manager
func init() {
dsn := "root:960690@tcp(127.0.0.1:3306)/golang_db?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
})
if err != nil {
log.Fatal("Failed to init db:", err)
}
Mgr = &manager{
db: db}
db.AutoMigrate(&model.User{
})
db.AutoMigrate(&model.Post{
})
}
func (mgr *manager) RegisterUser(user *model.User) {
mgr.db.Create(user)
}
func (mgr *manager) Login(username string) model.User {
var user model.User
mgr.db.Where("username=?", username).First(&user)
return user
}
// 博客操作
func (mgr *manager) AddPost(post *model.Post) {
mgr.db.Create(post)
}
func (mgr *manager) GetAllPost(