tm_accountType.go 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. package typeManage
  2. import (
  3. "context"
  4. "encoding/json"
  5. "errors"
  6. "fmt"
  7. "gorm.io/gorm"
  8. "log-server/global"
  9. "log-server/model/common/request"
  10. "log-server/model/typeManage"
  11. "strconv"
  12. )
  13. type AccountTypeService struct {
  14. }
  15. //添加账号类型
  16. func (a *AccountTypeService) CreateAccountType(accountType typeManage.AccountType) (err error) {
  17. //首先检查数据库中是否有同名账号类型
  18. err = global.GVA_DB.Table("account_type").Where("type_name = ?", accountType.TypeName).First(&typeManage.AccountType{}).Error
  19. if !errors.Is(err, gorm.ErrRecordNotFound) {
  20. return errors.New("已存在相同账号类型,请勿重复添加")
  21. }
  22. //添加数据库记录
  23. err = global.GVA_DB.Table("account_type").Omit("create_time", "update_time").Create(&accountType).Error
  24. UpdateAccountRedis(accountType)
  25. return
  26. }
  27. //单个删除账号类型
  28. func (a *AccountTypeService) DeleteAccountType(accountType typeManage.AccountType) (err error) {
  29. //首先检查数据库中是否有这条记录
  30. //为了后端数据的安全,声明一个实体用来存储扫描到的记录
  31. //删除实体
  32. var entity typeManage.AccountType
  33. err = global.GVA_DB.Table("account_type").Where("id = ?", accountType.Id).First(&entity).Error
  34. if errors.Is(err, gorm.ErrRecordNotFound) {
  35. return err
  36. }
  37. //删除记录
  38. err = global.GVA_DB.Table("account_type").Delete(&entity).Error
  39. //删除redis记录
  40. DeleteAccountRedis(entity)
  41. return
  42. }
  43. //批量删除账号类型
  44. func (a *AccountTypeService) DeleteAccountTypesByIds(ids request.IdsReq) (err error) {
  45. err = global.GVA_DB.Table("account_type").Delete(&[]typeManage.AccountType{}, "id in ?", ids.Ids).Error
  46. //删除redis记录
  47. BulkDeletionAccount(ids.Ids)
  48. return err
  49. }
  50. //更改账号类型
  51. func (a *AccountTypeService) UpdateAccountType(accountType typeManage.AccountType) (err error) {
  52. //做业务逻辑判断
  53. //比如不能更改至同名账号类型,如果存在同名账号类型就直接返回错误
  54. //排错之后再更新
  55. err = global.GVA_DB.Table("account_type").Where("id != ? and type_name = ?", accountType.Id, accountType.TypeName).First(&typeManage.AccountType{}).Error
  56. if !errors.Is(err, gorm.ErrRecordNotFound) {
  57. return errors.New("已存在同名账号类型,无法更新")
  58. }
  59. //进行数据更新
  60. err = global.GVA_DB.Table("account_type").Updates(&accountType).Error
  61. //更新redis记录
  62. UpdateAccountRedis(accountType)
  63. return err
  64. }
  65. //通过id获取单条数据
  66. func (a *AccountTypeService) GetAccountTypeById(id int) (accountType typeManage.AccountType, err error){
  67. err = global.GVA_DB.Table("account_type").Where("id = ?", id).First(&accountType).Error
  68. //更新redis
  69. UpdateAccountRedis(accountType)
  70. return
  71. }
  72. //获取所有账号类型列表
  73. func (a *AccountTypeService) AccountTypeList(accountType typeManage.AccountType, info request.PageInfo, order string, desc bool) (list interface{}, total int64, err error){
  74. //accountType是传输过来的查询条件
  75. //info是传输过来的分页信息
  76. //order是传输过来的排序字段
  77. //desc是传输过来的升降序信息
  78. //获取limit和offset
  79. limit := info.PageSize
  80. offset := (info.Page - 1) * info.PageSize
  81. db := global.GVA_DB.Table("account_type").Model(&typeManage.AccountType{})
  82. var accountTypeList []typeManage.AccountType
  83. //先条件过滤
  84. if accountType.TypeName != "" {
  85. //条件过滤记录数
  86. db = db.Where("type_name like ?", "%" + accountType.TypeName + "%")
  87. }
  88. //查找数量并且校验是否出错,注意,即使count=0,Count也不会出错,出错的地方可能在于我条件筛选没有,然后我再count,然后出错?
  89. //非也非也,我即使条件查询没有,从逻辑上来说不该报错,而且实际业务表现上也没有报错,所以可能是为了防止其他错误出现稳一手
  90. //只要进行了条件筛选,就可以直接去查询count了,后续任何操作比如分页排序都无法也不能改变count,所以在条件查询之后、在分页和排序之前去操作count
  91. err = db.Count(&total).Error
  92. if err != nil{
  93. //如果出错直接返回
  94. return accountTypeList, total, err
  95. } else {
  96. //先分页再排序
  97. db = db.Limit(limit).Offset(offset)
  98. if order != ""{
  99. //传入排序字段,进行排序
  100. //定义orderStr存储完整的排序字段
  101. var orderStr string
  102. //为了避免sql注入,自己创建数组匹配
  103. orderMap := make(map[string]bool, 3)
  104. orderMap["type_name"] = true
  105. orderMap["create_time"] = true
  106. orderMap["update_time"] = true
  107. if orderMap[order] {
  108. //是好人,可以排序
  109. if desc {
  110. //传入desc,是降序
  111. orderStr = order + " desc"
  112. } else {
  113. //没有传入desc,是默认升序
  114. orderStr = order
  115. }
  116. } else {
  117. //传入非法字段,不能排序
  118. err = fmt.Errorf("传入非法字段 %v", order)
  119. return accountTypeList, total, err
  120. }
  121. //排序
  122. err = db.Order(orderStr).Find(&accountTypeList).Error
  123. } else {
  124. //没有传入排序字段,默认按照类型名称降序排序
  125. err = db.Order("type_name desc").Find(&accountTypeList).Error
  126. }
  127. }
  128. //是因为只有切片能排序,model没办法排序;还是说为了将数组返回至前端才find扫描至切片呢?
  129. return accountTypeList, total, err
  130. }
  131. //更改redis记录
  132. func UpdateAccountRedis(account typeManage.AccountType) {
  133. ctx := context.Background()
  134. key := "typeManage:accountType"
  135. field := strconv.FormatInt(account.Id, 10)
  136. //序列化
  137. datas, _ := json.Marshal(account)
  138. global.GVA_REDIS.HSet(ctx, key, field, datas)
  139. }
  140. //删除redis记录
  141. func DeleteAccountRedis(account typeManage.AccountType) {
  142. //删除redis记录
  143. ctx := context.Background()
  144. key := "typeManage:accountType"
  145. field := strconv.FormatInt(account.Id, 10)
  146. global.GVA_REDIS.HDel(ctx, key, field)
  147. }
  148. //批量删除命令
  149. func BulkDeletionAccount(ids []int) {
  150. //批量删除redis
  151. ctx := context.Background()
  152. key := "typeManage:accountType"
  153. for i := range ids{
  154. delKey := strconv.Itoa(ids[i])
  155. global.GVA_REDIS.HDel(ctx, key, delKey)
  156. }
  157. }