github.com/qiuhoude/go-web@v0.0.0-20220223060959-ab545e78f20d/blogweb_gin/models/article_model.go (about)

     1  package models
     2  
     3  import (
     4  	"fmt"
     5  	"github.com/qiuhoude/go-web/blogweb_gin/config"
     6  	"github.com/qiuhoude/go-web/blogweb_gin/database"
     7  	"github.com/qiuhoude/go-web/blogweb_gin/logs"
     8  	"log"
     9  	"strconv"
    10  	"sync"
    11  )
    12  
    13  type Article struct {
    14  	Id         int
    15  	Title      string
    16  	Tags       string
    17  	Short      string
    18  	Content    string
    19  	Author     string
    20  	Createtime int64
    21  	//Status int //Status=0为正常,1为删除,2为冻结
    22  }
    23  
    24  //---------添加文章-----------
    25  func AddArticle(article Article) (int64, error) {
    26  	i, err := insertArticle(article)
    27  	SetArticleRowsNum()
    28  	return i, err
    29  }
    30  
    31  //插入一篇文章
    32  func insertArticle(article Article) (int64, error) {
    33  	return database.ModifyDB("insert into article(title,tags,short,content,author,createtime) values(?,?,?,?,?,?)",
    34  		article.Title, article.Tags, article.Short, article.Content, article.Author, article.Createtime)
    35  }
    36  
    37  //-----------查询文章---------
    38  
    39  //根据页码查询文章
    40  func FindArticleWithPage(page int) ([]Article, error) {
    41  	page--
    42  	logs.Info.Println("---------->page", page)
    43  	//从配置文件中获取每页的文章数量
    44  	return QueryArticleWithPage(page, config.NUM)
    45  }
    46  
    47  /*
    48  分页查询数据库
    49  limit分页查询语句,
    50  	语法:limit m,n
    51  
    52  	m代表从多少位开始获取,与id值无关
    53  	n代表获取多少条数据
    54  */
    55  func QueryArticleWithPage(page, num int) ([]Article, error) {
    56  	sql := fmt.Sprintf("limit %d,%d", page*num, num)
    57  	return QueryArticlesWithCon(sql)
    58  }
    59  
    60  func QueryArticlesWithCon(sql string) ([]Article, error) {
    61  	sql = "select id,title,tags,short,content,author,createtime from article " + sql
    62  	rows, err := database.QueryDb(sql)
    63  	if err != nil {
    64  		return nil, err
    65  	}
    66  	var artList []Article
    67  	for rows.Next() {
    68  		id := 0
    69  		title := ""
    70  		tags := ""
    71  		short := ""
    72  		content := ""
    73  		author := ""
    74  		var createtime int64
    75  		createtime = 0
    76  		rows.Scan(&id, &title, &tags, &short, &content, &author, &createtime)
    77  		art := Article{id, title, tags, short, content, author, createtime}
    78  		artList = append(artList, art)
    79  	}
    80  	return artList, nil
    81  }
    82  
    83  //------翻页------
    84  
    85  //存储表的行数, 当文章新增或者删除时需要更新这个值
    86  var artcileRowsNum int = -1
    87  var rwmu sync.RWMutex // 读写锁
    88  
    89  var once sync.Once // 只会执行一次
    90  
    91  //var a = expvar.NewInt()
    92  
    93  //查询文章的总条数
    94  func QueryArticleRowNum() int {
    95  	row := database.QueryRowDb("select count(id) from article")
    96  	num := 0
    97  	row.Scan(&num)
    98  	return num
    99  }
   100  
   101  // 获取
   102  func GetArticleRowsNum() int {
   103  	// 先获取读锁
   104  	//rwmu.RLock()
   105  	//if artcileRowsNum != -1 {
   106  	//	rwmu.RUnlock()
   107  	//	return artcileRowsNum
   108  	//}
   109  	//rwmu.RUnlock()
   110  	//
   111  
   112  	// 如果没有初始化就获取一遍初始化
   113  	//rwmu.Lock()
   114  	//if artcileRowsNum == -1 {
   115  	//	loadArtcileRowsNum()
   116  	//}
   117  	//rwmu.Unlock()
   118  
   119  	// 只会执行一次
   120  	once.Do(loadArtcileRowsNum)
   121  	rwmu.RLock()
   122  	defer rwmu.RUnlock()
   123  	return artcileRowsNum
   124  }
   125  
   126  //设置页数
   127  func SetArticleRowsNum() {
   128  	rwmu.Lock()
   129  	defer rwmu.Unlock()
   130  	loadArtcileRowsNum()
   131  }
   132  
   133  func loadArtcileRowsNum() {
   134  	artcileRowsNum = QueryArticleRowNum()
   135  }
   136  
   137  //----------查询文章-------------
   138  
   139  func QueryArticleWithId(id int) Article {
   140  	row := database.QueryRowDb("select id,title,tags,short,content,author,createtime from article where id=" + strconv.Itoa(id))
   141  	title := ""
   142  	tags := ""
   143  	short := ""
   144  	content := ""
   145  	author := ""
   146  	var createtime int64
   147  	createtime = 0
   148  	row.Scan(&id, &title, &tags, &short, &content, &author, &createtime)
   149  	art := Article{id, title, tags, short, content, author, createtime}
   150  	return art
   151  }
   152  
   153  //----------修改数据----------
   154  
   155  func UpdateArticle(article Article) (int64, error) {
   156  	//数据库操作
   157  	return database.ModifyDB("update article set title=?,tags=?,short=?,content=? where id=?",
   158  		article.Title, article.Tags, article.Short, article.Content, article.Id)
   159  }
   160  
   161  //----------删除文章---------
   162  func DeleteArticle(artID int) (int64, error) {
   163  	i, err := deleteArticleWithArtId(artID)
   164  	SetArticleRowsNum()
   165  	return i, err
   166  }
   167  
   168  func deleteArticleWithArtId(artID int) (int64, error) {
   169  	return database.ModifyDB("delete from article where id=?", artID)
   170  }
   171  
   172  //查询标签,返回一个字段的列表
   173  func QueryArticleWithParam(param string) []string {
   174  	rows, err := database.QueryDb(fmt.Sprintf("select %s from article", param))
   175  	if err != nil {
   176  		log.Println(err)
   177  	}
   178  	var paramList []string
   179  	for rows.Next() {
   180  		arg := ""
   181  		rows.Scan(&arg)
   182  		paramList = append(paramList, arg)
   183  	}
   184  	return paramList
   185  }
   186  
   187  //--------------按照标签查询--------------
   188  /*
   189  通过标签查询首页的数据
   190  有四种情况
   191  	1.左右两边有&符和其他符号
   192  	2.左边有&符号和其他符号,同时右边没有任何符号
   193  	3.右边有&符号和其他符号,同时左边没有任何符号
   194  	4.左右两边都没有符号
   195  
   196  通过%去匹配任意多个字符,至少是一个
   197  */
   198  func QueryArticlesWithTag(tag string) ([]Article, error) {
   199  
   200  	sql := " where tags like '%&" + tag + "&%'"
   201  	sql += " or tags like '%&" + tag + "'"
   202  	sql += " or tags like '" + tag + "&%'"
   203  	sql += " or tags like '" + tag + "'"
   204  	logs.Info.Println(sql)
   205  	return QueryArticlesWithCon(sql)
   206  }