自己的客服系統做好了,官網頁面也有了,但是沒有介紹性的內容文章,網站被收錄的太少,這樣會導致網站的權重不高,搜索排名比較低,
因此要簡單的加上一個小型的內容管理功能,
設計資料庫
很簡單的兩張表,分類表和內容表
DROP TABLE IF EXISTS `cms_cate`; CREATE TABLE `cms_cate` ( `id` int(11) NOT NULL AUTO_INCREMENT, `cat_name` varchar(50) NOT NULL DEFAULT '' COMMENT '分類名稱', `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間', PRIMARY KEY (`id`) COMMENT '自增主鍵索引' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT 'CMS分類表'; DROP TABLE IF EXISTS `cms_news`; CREATE TABLE `cms_news` ( `id` int(11) NOT NULL AUTO_INCREMENT, `title` varchar(500) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '標題', `content` text COLLATE utf8mb4_general_ci COMMENT '內容', `cat_id` int(11) NOT NULL DEFAULT '0' COMMENT '分類ID', `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間', PRIMARY KEY (`id`) COMMENT '自增主鍵索引' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT 'CMS內容表';
撰寫資料庫操作gorm Model部分
設計兩個結構體
type CmsCate struct { Id uint `json:"id"` CatName string `json:"cat_name"` CreatedAt types.Time `json:"created_at"` } type CmsNews struct { Id uint `json:"id"` Title string `json:"title"` Content string `json:"content"` CreatedAt types.Time `json:"created_at"` }
types.Time型別是我對time.Time型別的包裝,用于在序列化為json的時候,可以格式化時間
package types import ( "database/sql/driver" "fmt" "time" ) type Time struct { time.Time } func (t Time) MarshalJSON() ([]byte, error) { localTime := t.Format("2006-01-02 15:04:05") return []byte(fmt.Sprintf(`"%s"`, localTime)), nil } func (t Time) Value() (driver.Value, error) { var zeroTime time.Time if t.Time.UnixNano() == zeroTime.UnixNano() { return nil, nil } return t.Time, nil } func (t *Time) Scan(v interface{}) error { value, ok := v.(time.Time) if ok { *t = Time{Time: value} return nil } return fmt.Errorf("can not convert %v to timestamp", v) }
分類表和內容表的增刪查改
DB就是*gorm.DB型別,這是在鏈接資料庫的時候,已經賦值好的全域變數
/*內容表*/ //根據條件查詢條數 func CountCmsNews(query interface{}, args ...interface{}) uint { var v uint DB.Table("cms_news").Where(query, args...).Count(&v) return v } //根據條件更新 func (this *CmsNews) SaveCmsNews(query interface{}, args ...interface{}) error { db := DB.Table("cms_news").Where(query, args...).Update(this) return db.Error } //增加資料 func (this *CmsNews) AddCmsNews() error { return DB.Create(this).Error } //根據條件查詢分頁串列 func FindCmsNews(page, pagesize int, query interface{}, args ...interface{}) []CmsNews { offset := (page - 1) * pagesize var res []CmsNews DB.Table("cms_news").Where(query, args...).Order("id desc").Offset(offset).Limit(pagesize).Find(&res) return res } //根據條件洗掉 func DelCmsNews(query interface{}, args ...interface{}) error { return DB.Where(query, args...).Delete(&CmsNews{}).Error } /*分類表*/ //根據條件分類 func (this *CmsCate) SaveCmsCate(query interface{}, args ...interface{}) error { db := DB.Table("cms_cate").Where(query, args...).Update(this) return db.Error } //增加分類 func (this *CmsCate) AddCmsCate() error { return DB.Create(this).Error } //根據條件查詢分類串列 func FindCmsCate(page, pagesize int, query interface{}, args ...interface{}) []CmsCate { offset := (page - 1) * pagesize var res []CmsCate DB.Table("cms_cate").Where(query, args...).Order("id desc").Offset(offset).Limit(pagesize).Find(&res) return res } //根據條件洗掉分類 func DelCmsCate(query interface{}, args ...interface{}) error { return DB.Where(query, args...).Delete(&CmsCate{}).Error }
撰寫gin路由處理部分
gin路由入口
//系統相關 systemGroup := engine.Group("/system") systemGroup.Use() { //分類串列 systemGroup.GET("/cmsCate", controller.GetCmsCate) //洗掉分類 systemGroup.GET("/delCmsCate", controller.DelCmsCate) //增加或編輯分類 systemGroup.POST("/cmsCate", controller.PostCmsCate) //CMS內容串列 systemGroup.GET("/cmsNews", controller.GetCmsNews) //增加或編輯內容 systemGroup.POST("/cmsNews", controller.PostCmsNews) //洗掉內容 systemGroup.GET("/delCmsNews", controller.DelCmsNews) }
gin框架路由處理邏輯
回傳引數部分,我進行了小的封裝,可以參考去掉,
只看呼叫model部分的處理邏輯
package controller import ( "github.com/gin-gonic/gin" "kefu/models" "kefu/types" "strconv" ) type CmsCateForm struct { Id uint `form:"id" json:"id" uri:"id" xml:"id"` CateName string `form:"cate_name" json:"cate_name" uri:"cate_name" xml:"cate_name" binding:"required"` } //分類串列(暫不分頁) func GetCmsCate(c *gin.Context) { list := models.FindCmsCate(1, 1000, "") c.JSON(200, gin.H{ "code": types.ApiCode.SUCCESS, "msg": types.ApiCode.GetMessage(types.ApiCode.SUCCESS), "result": list, }) } //編輯CMS分類 func PostCmsCate(c *gin.Context) { var form CmsCateForm err := c.Bind(&form) if err != nil { c.JSON(200, gin.H{ "code": types.ApiCode.FAILED, "msg": types.ApiCode.GetMessage(types.ApiCode.INVALID), "result": err.Error(), }) return } modelCms := &models.CmsCate{ Id: form.Id, CatName: form.CateName, } //添加分類 if form.Id == 0 { err := modelCms.AddCmsCate() if err != nil { c.JSON(200, gin.H{ "code": types.ApiCode.FAILED, "msg": err.Error(), }) return } } else { //修改分類 err := modelCms.SaveCmsCate("id = ?", form.Id) if err != nil { c.JSON(200, gin.H{ "code": types.ApiCode.FAILED, "msg": err.Error(), }) return } } c.JSON(200, gin.H{ "code": types.ApiCode.SUCCESS, "msg": types.ApiCode.GetMessage(types.ApiCode.SUCCESS), }) } type CmsNewsForm struct { Id uint `form:"id" json:"id" uri:"id" xml:"id"` CateId string `form:"cate_id" json:"cate_id" uri:"cate_id" xml:"cate_id" binding:"required"` Content string `form:"content" json:"content" uri:"content" xml:"content" binding:"required"` Title string `form:"title" json:"title" uri:"title" xml:"title" binding:"required"` } //CMS內容串列 func GetCmsNews(c *gin.Context) { //分頁處理 page, _ := strconv.Atoi(c.Query("page")) if page <= 0 { page = 1 } pagesize, _ := strconv.Atoi(c.Query("pagesize")) if pagesize <= 0 || pagesize > 50 { pagesize = 10 } //判斷分類ID條件 catId := c.Query("cat_id") query := "1=1 " args := make([]interface{}, 0) if catId != "" { query += "and cat_id = ? " args = append(args, catId) } //分頁查詢 count := models.CountCmsNews(query, args...) list := models.FindCmsNews(page, pagesize, query, args...) c.JSON(200, gin.H{ "code": types.ApiCode.SUCCESS, "msg": types.ApiCode.GetMessage(types.ApiCode.SUCCESS), "result": gin.H{ "list": list, "count": count, "pagesize": pagesize, "page": page, }, }) } //編輯CMS內容 func PostCmsNews(c *gin.Context) { var form CmsNewsForm err := c.Bind(&form) if err != nil { c.JSON(200, gin.H{ "code": types.ApiCode.FAILED, "msg": types.ApiCode.GetMessage(types.ApiCode.INVALID), "result": err.Error(), }) return } modelCms := &models.CmsNews{ Id: form.Id, CatId: form.CateId, Title: form.Title, } //添加 if form.Id == 0 { err := modelCms.AddCmsNews() if err != nil { c.JSON(200, gin.H{ "code": types.ApiCode.FAILED, "msg": err.Error(), }) return } } else { //修改 err := modelCms.SaveCmsNews("id = ?", form.Id) if err != nil { c.JSON(200, gin.H{ "code": types.ApiCode.FAILED, "msg": err.Error(), }) return } } c.JSON(200, gin.H{ "code": types.ApiCode.SUCCESS, "msg": types.ApiCode.GetMessage(types.ApiCode.SUCCESS), }) } //洗掉分類 func DelCmsCate(c *gin.Context) { id := c.Query("id") err := models.DelCmsCate("id = ?", id) if err != nil { c.JSON(200, gin.H{ "code": types.ApiCode.FAILED, "msg": err.Error(), }) return } c.JSON(200, gin.H{ "code": types.ApiCode.SUCCESS, "msg": types.ApiCode.GetMessage(types.ApiCode.SUCCESS), }) } //洗掉內容 func DelCmsNews(c *gin.Context) { id := c.Query("id") err := models.DelCmsNews("id = ?", id) if err != nil { c.JSON(200, gin.H{ "code": types.ApiCode.FAILED, "msg": err.Error(), }) return } c.JSON(200, gin.H{ "code": types.ApiCode.SUCCESS, "msg": types.ApiCode.GetMessage(types.ApiCode.SUCCESS), }) }
可以使用介面測驗工具,對介面進行測驗

十年開發經驗程式員,離職全心創業中,歷時三年開發出的產品《唯一客服系統》
一款基于Golang+Vue開發的在線客服系統,軟體著作權編號:2021SR1462600,一套可私有化部署的網站在線客服系統,編譯后的二進制檔案可直接使用無需搭開發環境,下載zip解壓即可,僅依賴MySQL資料庫,是一個開箱即用的全渠道在線客服系統,致力于幫助廣大開發者/公司快速部署整合私有化客服功能, 開源地址:唯一客服(開源學習版) 官網地址:唯一客服官網轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/535961.html
標籤:Go
