在线客服系统源码开发实战总结:Golang实现CMS内容管理增删查改功能 ...

打印 上一主题 下一主题

主题 856|帖子 856|积分 2572

自己的客服系统做好了,官网页面也有了,但是没有介绍性的内容文章。网站被收录的太少,这样会导致网站的权重不高,搜索排名比较低。
因此要简单的加上一个小型的内容管理功能。
设计数据库

很简单的两张表,分类表和内容表
  1. DROP TABLE IF EXISTS `cms_cate`;
  2. CREATE TABLE `cms_cate` (
  3. `id` int(11) NOT NULL AUTO_INCREMENT,
  4. `cat_name` varchar(50) NOT NULL DEFAULT '' COMMENT '分类名称',
  5. `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP  COMMENT '创建时间',
  6. PRIMARY KEY (`id`) COMMENT '自增主键索引'
  7. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT 'CMS分类表';
  8. DROP TABLE IF EXISTS `cms_news`;
  9. CREATE TABLE `cms_news` (
  10. `id` int(11) NOT NULL AUTO_INCREMENT,
  11. `title` varchar(500) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '标题',
  12. `content` text COLLATE utf8mb4_general_ci COMMENT '内容',
  13. `cat_id` int(11) NOT NULL DEFAULT '0' COMMENT '分类ID',
  14. `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP  COMMENT '创建时间',
  15. PRIMARY KEY (`id`) COMMENT '自增主键索引'
  16. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT 'CMS内容表';
复制代码
编写数据库操作gorm Model部分

设计两个结构体
  1. type CmsCate struct {
  2.     Id        uint       `json:"id"`
  3.     CatName   string     `json:"cat_name"`
  4.     CreatedAt types.Time `json:"created_at"`
  5. }
  6. type CmsNews struct {
  7.     Id        uint       `json:"id"`
  8.     Title     string     `json:"title"`
  9.     Content   string     `json:"content"`
  10.     CreatedAt types.Time `json:"created_at"`
  11. }
复制代码
types.Time类型是我对time.Time类型的包装,用于在序列化为json的时候,可以格式化时间
  1. package types
  2. import (
  3.     "database/sql/driver"
  4.     "fmt"
  5.     "time"
  6. )
  7. type Time struct {
  8.     time.Time
  9. }
  10. func (t Time) MarshalJSON() ([]byte, error) {
  11.     localTime := t.Format("2006-01-02 15:04:05")
  12.     return []byte(fmt.Sprintf(`"%s"`, localTime)), nil
  13. }
  14. func (t Time) Value() (driver.Value, error) {
  15.     var zeroTime time.Time
  16.     if t.Time.UnixNano() == zeroTime.UnixNano() {
  17.         return nil, nil
  18.     }
  19.     return t.Time, nil
  20. }
  21. func (t *Time) Scan(v interface{}) error {
  22.     value, ok := v.(time.Time)
  23.     if ok {
  24.         *t = Time{Time: value}
  25.         return nil
  26.     }
  27.     return fmt.Errorf("can not convert %v to timestamp", v)
  28. }
复制代码
分类表和内容表的增删查改
DB就是*gorm.DB类型,这是在链接数据库的时候,已经赋值好的全局变量
  1. /*内容表*/
  2. //根据条件查询条数
  3. func CountCmsNews(query interface{}, args ...interface{}) uint {
  4.     var v uint
  5.     DB.Table("cms_news").Where(query, args...).Count(&v)
  6.     return v
  7. }
  8. //根据条件更新
  9. func (this *CmsNews) SaveCmsNews(query interface{}, args ...interface{}) error {
  10.     db := DB.Table("cms_news").Where(query, args...).Update(this)
  11.     return db.Error
  12. }
  13. //增加数据
  14. func (this *CmsNews) AddCmsNews() error {
  15.     return DB.Create(this).Error
  16. }
  17. //根据条件查询分页列表
  18. func FindCmsNews(page, pagesize int, query interface{}, args ...interface{}) []CmsNews {
  19.     offset := (page - 1) * pagesize
  20.     var res []CmsNews
  21.     DB.Table("cms_news").Where(query, args...).Order("id desc").Offset(offset).Limit(pagesize).Find(&res)
  22.     return res
  23. }
  24. //根据条件删除
  25. func DelCmsNews(query interface{}, args ...interface{}) error {
  26.     return DB.Where(query, args...).Delete(&CmsNews{}).Error
  27. }
  28. /*分类表*/
  29. //根据条件分类
  30. func (this *CmsCate) SaveCmsCate(query interface{}, args ...interface{}) error {
  31.     db := DB.Table("cms_cate").Where(query, args...).Update(this)
  32.     return db.Error
  33. }
  34. //增加分类
  35. func (this *CmsCate) AddCmsCate() error {
  36.     return DB.Create(this).Error
  37. }
  38. //根据条件查询分类列表
  39. func FindCmsCate(page, pagesize int, query interface{}, args ...interface{}) []CmsCate {
  40.     offset := (page - 1) * pagesize
  41.     var res []CmsCate
  42.     DB.Table("cms_cate").Where(query, args...).Order("id desc").Offset(offset).Limit(pagesize).Find(&res)
  43.     return res
  44. }
  45. //根据条件删除分类
  46. func DelCmsCate(query interface{}, args ...interface{}) error {
  47.     return DB.Where(query, args...).Delete(&CmsCate{}).Error
  48. }
复制代码
 
编写gin路由处理部分

gin路由入口
  1.     //系统相关
  2.     systemGroup := engine.Group("/system")
  3.     systemGroup.Use()
  4.     {
  5.         //分类列表
  6.         systemGroup.GET("/cmsCate", controller.GetCmsCate)
  7.         //删除分类
  8.         systemGroup.GET("/delCmsCate", controller.DelCmsCate)
  9.         //增加或编辑分类
  10.         systemGroup.POST("/cmsCate", controller.PostCmsCate)
  11.         //CMS内容列表
  12.         systemGroup.GET("/cmsNews", controller.GetCmsNews)
  13.         //增加或编辑内容
  14.         systemGroup.POST("/cmsNews", controller.PostCmsNews)
  15.         //删除内容
  16.         systemGroup.GET("/delCmsNews", controller.DelCmsNews)
  17.     }
复制代码
gin框架路由处理逻辑
返回参数部分,我进行了小的封装,可以参考去掉。
只看调用model部分的处理逻辑
 
[code]package controllerimport (    "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 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

东湖之滨

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表