user.go 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. package tables
  2. import (
  3. "Wine-Server/utils"
  4. "database/sql"
  5. )
  6. type UserTable struct {
  7. Id string
  8. First utils.TimeType
  9. Last utils.TimeType
  10. Vip bool
  11. Cash uint64
  12. MaxCost uint32
  13. BuyCount uint32
  14. BuyCost uint64
  15. RefundCount uint32
  16. RefundCost uint64
  17. }
  18. func CreateUserTable() error {
  19. SQL := "CREATE TABLE IF NOT EXISTS `user`(" +
  20. "`id` VARCHAR(64) PRIMARY KEY NOT NULL," +
  21. "`first` DATETIME DEFAULT CURRENT_TIMESTAMP," +
  22. "`last` DATETIME DEFAULT CURRENT_TIMESTAMP," +
  23. "`vip` BOOL DEFAULT FALSE," +
  24. "`cash` BIGINT UNSIGNED DEFAULT 0," +
  25. "`max_cost` INT UNSIGNED DEFAULT 0," +
  26. "`buy_count` INT UNSIGNED DEFAULT 0," +
  27. "`buy_cost` BIGINT UNSIGNED DEFAULT 0," +
  28. "`refund_count` INT UNSIGNED DEFAULT 0," +
  29. "`refund_cost` BIGINT UNSIGNED DEFAULT 0);"
  30. _, err := utils.Mysql.Exec(SQL)
  31. return err
  32. }
  33. func (row *UserTable) Insert() error {
  34. SQL := "INSERT INTO `user` (`id`,`max_cost`,`buy_count`,`buy_cost`) VALUES (?,?,?,?,?);"
  35. pre, err := utils.Mysql.Prepare(SQL)
  36. if err != nil {
  37. return err
  38. }
  39. _, err = pre.Exec(row.Id, row.MaxCost, row.BuyCount, row.BuyCost)
  40. return err
  41. }
  42. // Delete deprecated
  43. func (row *UserTable) Delete() error {
  44. SQL := utils.Format("DELETE FROM `user` WHERE `id`='%s';", row.Id)
  45. _, err := utils.Mysql.Exec(SQL)
  46. return err
  47. }
  48. func (row *UserTable) Update(args utils.JsonType) error {
  49. keys, values := utils.UnZip(args)
  50. SQL := utils.Format("UPDATE `user` SET %s WHERE `id`='%s';", 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 *UserTable) UpdateSelf() error {
  59. SQL := "UPDATE `user` SET `last`=?,`vip`=?,`cash`=?,`max_cost`=?,`buy_count`=?,`buy_cost`=?,`refund_count`=?,`refund_cost`=? WHERE `id`=?;"
  60. pre, err := utils.Mysql.Prepare(SQL)
  61. if err != nil {
  62. return err
  63. }
  64. _, err = pre.Exec(row.Last, row.Vip, row.Cash, row.MaxCost, row.BuyCount, row.BuyCost, row.RefundCount, row.RefundCost, row.Id)
  65. return err
  66. }
  67. func (row *UserTable) Get() error {
  68. SQL := "SELECT `first`,`last`,`vip`,`cash`,`max_cost`,`buy_count`,`buy_cost`,`refund_count`,`refund_cost` FROM `user` 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.First, &row.Last, &row.Vip, &row.Cash, &row.MaxCost,
  75. &row.BuyCount, &row.BuyCost, &row.RefundCount, &row.RefundCost,
  76. )
  77. return err
  78. }
  79. func UserQuery(id string, vip, limit, page int) (int, []utils.JsonType, error) {
  80. SQL := "none"
  81. if vip == -1 {
  82. SQL = utils.Format("SELECT COUNT(`id`) AS `total` FROM `user` WHERE `id` LIKE '%%%s%%';", id)
  83. } else {
  84. SQL = utils.Format(
  85. "SELECT COUNT(`id`) AS `total` FROM `user` WHERE `vip`=%d AND `id` LIKE '%%%s%%';", vip, id,
  86. )
  87. }
  88. total := 0
  89. err := utils.Mysql.QueryRow(SQL).Scan(&total)
  90. if err != nil {
  91. return 0, nil, err
  92. }
  93. if total == 0 {
  94. return 0, []utils.JsonType{}, err
  95. }
  96. if vip == -1 {
  97. SQL = utils.Format(
  98. "SELECT `id`,`first`,`last`,`vip`,`cash`,`max_cost`,`buy_count`,`buy_cost`,`refund_count`,`refund_cost` "+
  99. "FROM `user` WHERE `id` LIKE '%%%s%%' LIMIT %d OFFSET %d;", id, limit, (page-1)*limit,
  100. )
  101. } else {
  102. SQL = utils.Format(
  103. "SELECT `id`,`first`,`last`,`vip`,`cash`,`max_cost`,`buy_count`,`buy_cost`,`refund_count`,`refund_cost` "+
  104. "FROM `user` WHERE `vip`=%d AND `id` LIKE '%%%s%%' LIMIT %d OFFSET %d;", vip, id, limit, (page-1)*limit,
  105. )
  106. }
  107. var rows *sql.Rows
  108. res := make([]utils.JsonType, 0)
  109. rows, err = utils.Mysql.Query(SQL)
  110. if err != nil {
  111. return 0, nil, err
  112. }
  113. for rows.Next() {
  114. var tmp UserTable
  115. err = rows.Scan(
  116. &tmp.Id, &tmp.First, &tmp.Last, &tmp.Vip, &tmp.Cash, &tmp.MaxCost,
  117. &tmp.BuyCount, &tmp.BuyCost, &tmp.RefundCount, &tmp.RefundCost,
  118. )
  119. res = append(res, utils.JsonType{
  120. "id": tmp.Id, "first": tmp.First, "last": tmp.Last, "vip": tmp.Vip, "cash": tmp.Cash,
  121. "max_cost": tmp.MaxCost, "buy_count": tmp.BuyCount, "buy_cost": tmp.BuyCost,
  122. "refund_count": tmp.RefundCount, "refund_cost": tmp.RefundCost,
  123. })
  124. }
  125. _ = rows.Close()
  126. return total, res, nil
  127. }
  128. func UserQueryForAdmin(manager, id string, vip, limit, page int) (int, []utils.JsonType, error) {
  129. SQL := "none"
  130. if vip == -1 {
  131. SQL = utils.Format(
  132. "SELECT COUNT(u.`id`) FROM `user` AS u WHERE u.`id` LIKE '%%%s%%' AND u.`id` IN "+
  133. "(SELECT DISTINCT t.`payer` FROM `trade` AS t WHERE t.`manager`='%s');",
  134. id, manager,
  135. )
  136. } else {
  137. SQL = utils.Format(
  138. "SELECT COUNT(u.`id`) FROM `user` AS u WHERE u.`vip`=%d AND u.`id` LIKE '%%%s%%' "+
  139. "AND u.`id` IN (SELECT DISTINCT t.`payer` FROM `trade` AS t WHERE t.`manager`='%s'); ",
  140. vip, id, manager,
  141. )
  142. }
  143. total := 0
  144. err := utils.Mysql.QueryRow(SQL).Scan(&total)
  145. if err != nil {
  146. return 0, nil, err
  147. }
  148. if total == 0 {
  149. return 0, []utils.JsonType{}, err
  150. }
  151. if vip == -1 {
  152. SQL = utils.Format(
  153. "SELECT u.`id`,u.`first`,u.`last`,u.`vip`,u.`cash`,u.`max_cost`,u.`buy_count`,u.`buy_cost`,"+
  154. "u.`refund_count`,u.`refund_cost` FROM `user` AS u WHERE u.`id` LIKE '%%%s%%' AND u.`id` "+
  155. "IN (SELECT DISTINCT t.`payer` FROM `trade` AS t WHERE t.`manager`='%s') LIMIT %d OFFSET %d;",
  156. id, manager, limit, (page-1)*limit,
  157. )
  158. } else {
  159. SQL = utils.Format(
  160. "SELECT u.`id`,u.`first`,u.`last`,u.`vip`,u.`cash`,u.`max_cost`,u.`buy_count`,u.`buy_cost`,"+
  161. "u.`refund_count`,u.`refund_cost` FROM `user` AS u WHERE u.`vip`=%d AND u.`id` LIKE '%%%s%%' AND "+
  162. "u.`id` IN (SELECT t.`payer` FROM `trade` AS t WHERE t.`manager`='%s') LIMIT %d OFFSET %d;",
  163. vip, id, manager, limit, (page-1)*limit,
  164. )
  165. }
  166. var rows *sql.Rows
  167. res := make([]utils.JsonType, 0)
  168. rows, err = utils.Mysql.Query(SQL)
  169. if err != nil {
  170. return 0, nil, err
  171. }
  172. for rows.Next() {
  173. var tmp UserTable
  174. err = rows.Scan(
  175. &tmp.Id, &tmp.First, &tmp.Last, &tmp.Vip, &tmp.Cash, &tmp.MaxCost,
  176. &tmp.BuyCount, &tmp.BuyCost, &tmp.RefundCount, &tmp.RefundCost,
  177. )
  178. res = append(res, utils.JsonType{
  179. "id": tmp.Id, "first": tmp.First, "last": tmp.Last, "vip": tmp.Vip, "cash": tmp.Cash,
  180. "max_cost": tmp.MaxCost, "buy_count": tmp.BuyCount, "buy_cost": tmp.BuyCost,
  181. "refund_count": tmp.RefundCount, "refund_cost": tmp.RefundCost,
  182. })
  183. }
  184. _ = rows.Close()
  185. return total, res, nil
  186. }