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 }