wine.go 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. package tables
  2. import (
  3. "Wine-Server/utils"
  4. "database/sql"
  5. )
  6. type WineTable struct {
  7. Id uint16
  8. Name string
  9. Price uint16
  10. Degree uint16
  11. Density uint16
  12. Picture string
  13. Time utils.TimeType
  14. Describe string
  15. Deleted bool
  16. Order uint32
  17. Income uint64
  18. }
  19. func CreateWineTable() error {
  20. SQL := "CREATE TABLE IF NOT EXISTS `wine`(" +
  21. "`id` SMALLINT UNSIGNED PRIMARY KEY," +
  22. "`name` VARCHAR(16) NOT NULL," +
  23. "`price` SMALLINT UNSIGNED DEFAULT 9999," +
  24. "`degree` SMALLINT UNSIGNED DEFAULT 0," +
  25. "`density` SMALLINT UNSIGNED DEFAULT 1000," +
  26. "`picture` VARCHAR(128) NOT NULL," +
  27. "`time` DATETIME DEFAULT CURRENT_TIMESTAMP," +
  28. "`describe` VARCHAR(256) DEFAULT ''," +
  29. "`order` INT UNSIGNED DEFAULT 0," +
  30. "`income` BIGINT UNSIGNED DEFAULT 0," +
  31. "`deleted` TINYINT(1) DEFAULT 0);"
  32. _, err := utils.Mysql.Exec(SQL)
  33. return err
  34. }
  35. func (row *WineTable) Insert() error {
  36. SQL := "INSERT INTO `wine` (`id`,`name`,`price`,`degree`,`density`,`picture`,`describe`) VALUES (?,?,?,?,?,?,?);"
  37. pre, err := utils.Mysql.Prepare(SQL)
  38. if err != nil {
  39. return err
  40. }
  41. _, err = pre.Exec(row.Id, row.Name, row.Price, row.Degree, row.Density, row.Picture, row.Describe)
  42. return err
  43. }
  44. func (row *WineTable) Delete() error {
  45. row.Deleted = true
  46. return row.UpdateSelf()
  47. }
  48. func (row *WineTable) Update(args utils.JsonType) error {
  49. keys, values := utils.UnZip(args)
  50. SQL := utils.Format("UPDATE `wine` SET %s WHERE `id`=%d;", utils.SqlFields(keys), row.Id)
  51. pre, err := utils.Mysql.Prepare(SQL)
  52. if err != nil {
  53. return err
  54. }
  55. _, err = pre.Exec(values...)
  56. return err
  57. }
  58. func (row *WineTable) UpdateSelf() error {
  59. SQL := "UPDATE `wine` SET `name`=?,`price`=?,`degree`=?,`density`=?,`picture`=?,`describe`=?,`order`=?,`income`=?,`deleted`=? WHERE `id`=?;"
  60. pre, err := utils.Mysql.Prepare(SQL)
  61. if err != nil {
  62. return err
  63. }
  64. _, err = pre.Exec(row.Name, row.Price, row.Degree, row.Density, row.Picture, row.Describe, row.Order, row.Income, row.Deleted, row.Id)
  65. return err
  66. }
  67. func (row *WineTable) Get() error {
  68. SQL := "SELECT `name`,`price`,`degree`,`density`,`picture`,`describe`,`time`,`order`,`income`,`deleted` FROM `wine` WHERE `id`=?;"
  69. pre, err := utils.Mysql.Prepare(SQL)
  70. if err != nil {
  71. return err
  72. }
  73. err = pre.QueryRow(row.Id).Scan(
  74. &row.Name, &row.Price, &row.Degree, &row.Density, &row.Picture,
  75. &row.Describe, &row.Time, &row.Order, &row.Income, &row.Deleted,
  76. )
  77. return err
  78. }
  79. func extractJson(wine WineTable) utils.JsonType {
  80. return utils.JsonType{
  81. "id": wine.Id, "name": wine.Name, "time": wine.Time, "price": wine.Price,
  82. "degree": wine.Degree, "density": wine.Density, "describe": wine.Describe,
  83. "picture": utils.Format("%s/%s", utils.ServerPrefix, wine.Picture),
  84. }
  85. }
  86. func WinesQuery(cond string, limit, page int) (int, []utils.JsonType, error) {
  87. SQL, like := "none", utils.Format("%%%s%%", cond)
  88. if page == 1 {
  89. SQL = "SELECT COUNT(`id`) AS `total` FROM `wine` " +
  90. "WHERE (`id`=10100 OR `deleted`=FALSE) AND (`name` LIKE ? OR `describe` LIKE ?);"
  91. } else {
  92. SQL = "SELECT COUNT(`id`) AS `total` FROM `wine` WHERE `deleted`=FALSE AND (`name` LIKE ? OR `describe` LIKE ?);"
  93. }
  94. pre, err := utils.Mysql.Prepare(SQL)
  95. if err != nil {
  96. return 0, nil, err
  97. }
  98. total := 0
  99. err = pre.QueryRow(like, like).Scan(&total)
  100. if err != nil {
  101. return 0, nil, err
  102. }
  103. if page == 1 {
  104. SQL = "SELECT `id`,`name`,`time`,`price`,`degree`,`density`,`picture`,`describe` FROM `wine` " +
  105. "WHERE (`id`=10100 OR `deleted`=FALSE) AND (`name` LIKE ? OR `describe` LIKE ?) LIMIT ? OFFSET ?;"
  106. } else {
  107. SQL = "SELECT `id`,`name`,`time`,`price`,`degree`,`density`,`picture`,`describe` FROM `wine` " +
  108. "WHERE `deleted`=FALSE AND (`name` LIKE ? OR `describe` LIKE ?) LIMIT ? OFFSET ?;"
  109. }
  110. pre, err = utils.Mysql.Prepare(SQL)
  111. if err != nil {
  112. return 0, nil, err
  113. }
  114. var rows *sql.Rows
  115. res := make([]utils.JsonType, 0)
  116. rows, err = pre.Query(like, like, limit, (page-1)*limit)
  117. if err != nil {
  118. return 0, nil, err
  119. }
  120. for rows.Next() {
  121. tmp := WineTable{}
  122. _ = rows.Scan(&tmp.Id, &tmp.Name, &tmp.Time, &tmp.Price, &tmp.Degree, &tmp.Density, &tmp.Picture, &tmp.Describe)
  123. res = append(res, extractJson(tmp))
  124. }
  125. _ = rows.Close()
  126. return total, res, nil
  127. }
  128. func WinesDelete(ids []uint16) error {
  129. SQL := utils.Format("UPDATE `wine` SET `deleted`=TRUE WHERE `id` IN (%s);", utils.SqlUint16ListJoin(ids))
  130. _, err := utils.Mysql.Exec(SQL)
  131. return err
  132. }
  133. func WineQueryMaxId() (uint16, error) {
  134. SQL := "SELECT MAX(`id`) FROM `wine`;"
  135. var max uint16
  136. err := utils.Mysql.QueryRow(SQL).Scan(&max)
  137. if err != nil {
  138. return 0, err
  139. }
  140. return max, nil
  141. }
  142. func WinesQueryByIdOrName(cond string) ([]utils.JsonType, error) {
  143. like := utils.Format("%%%s%%", cond)
  144. SQL := "SELECT `id`,`name` FROM `wine` WHERE `id`!=10100 AND (`id` LIKE ? OR `name` LIKE ?) LIMIT 10;"
  145. rows, err := utils.Mysql.Query(SQL, like, like)
  146. if err != nil {
  147. return nil, err
  148. }
  149. res := make([]utils.JsonType, 0)
  150. for rows.Next() {
  151. tid, tna := "", ""
  152. _ = rows.Scan(&tid, &tna)
  153. res = append(res, utils.JsonType{"id": tid, "name": tna})
  154. }
  155. _ = rows.Close()
  156. return res, nil
  157. }