tm_loginType.go 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  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 LoginTypeService struct {}
  14. //创建登录类型
  15. func (l *LoginTypeService) CreateLoginType(login typeManage.LoginType) (err error) {
  16. //查找是否有同名登录名称
  17. err = global.GVA_DB.Table("login_type").Where("login_name = ?", login.LoginName).First(&typeManage.LoginType{}).Error
  18. if !errors.Is(err, gorm.ErrRecordNotFound){
  19. //找到同名登录名称
  20. return errors.New("已存在相同登录方式,请勿重复添加")
  21. }
  22. //添加数据库记录
  23. err = global.GVA_DB.Table("login_type").Omit("create_time", "update_time").Create(&login).Error
  24. //更新redis
  25. UpdateLoginRedis(login)
  26. return err
  27. }
  28. //单个删除
  29. func (l *LoginTypeService) DeleteLoginType(login typeManage.LoginType) (err error) {
  30. //单个删除的时候实例化一个实体
  31. //为什么实例化一个实体,推测是以求保险
  32. //先用这个实体接收合适的id值所对应的记录,再直接删除这个实体,防止误操作
  33. var entity typeManage.LoginType
  34. //查询是否有这条记录存在
  35. err = global.GVA_DB.Table("login_type").Where("id = ?", login.Id).First(&entity).Error
  36. if errors.Is(err, gorm.ErrRecordNotFound) {
  37. return err
  38. }
  39. //先进行数据删除
  40. err = global.GVA_DB.Table("login_type").Delete(&entity).Error
  41. //删除redis
  42. DeleteLoginRedis(entity)
  43. return
  44. }
  45. //批量删除
  46. func (l *LoginTypeService) DeleteLoginTypesByIds(ids request.IdsReq) (err error) {
  47. err = global.GVA_DB.Table("login_type").Delete(&[]typeManage.LoginType{}, "id in ?", ids.Ids).Error
  48. //批量删除redis
  49. BulkDeletionLogin(ids.Ids)
  50. return err
  51. }
  52. //更改登录类型
  53. func (l *LoginTypeService) UpdateLoginType(login typeManage.LoginType) (err error) {
  54. err = global.GVA_DB.Table("login_type").Where("id != ? and login_name = ?", login.Id, login.LoginName).First(&typeManage.LoginType{}).Error
  55. if !errors.Is(err, gorm.ErrRecordNotFound) {
  56. return errors.New("已存在同名登录方式,修改失败")
  57. }
  58. //先进行数据更新
  59. err = global.GVA_DB.Table("login_type").Updates(&login).Error
  60. //更新redis
  61. UpdateLoginRedis(login)
  62. return
  63. }
  64. //通过id查询单个登录类型
  65. func (l *LoginTypeService) GetLoginTypeById(id int) (loginType typeManage.LoginType, err error) {
  66. err = global.GVA_DB.Table("login_type").Where("id = ?", id).First(&loginType).Error
  67. //更新redis
  68. UpdateLoginRedis(loginType)
  69. return
  70. }
  71. //条件查询
  72. func (l *LoginTypeService) GetLoginType(loginType typeManage.LoginType, info request.PageInfo, order string, desc bool) (list interface{}, total int64, err error) {
  73. //先求offset和limit
  74. limit := info.PageSize
  75. offset := (info.Page - 1) * info.PageSize
  76. //先更新游戏数量的值
  77. global.GVA_DB.Exec("update `login_type` lt set game_counts = (SELECT COUNT(gl.login_type) FROM game_list gl WHERE lt.login_name = gl.login_type);")
  78. //确定操作的model
  79. db := global.GVA_DB.Table("login_type").Model(&typeManage.LoginType{})
  80. var loginList []typeManage.LoginType
  81. //先过滤(查询条件)再排序
  82. if loginType.LoginName != "" {
  83. db.Where("login_name like ?", "%"+loginType.LoginName+"%")
  84. }
  85. //记录总数
  86. if err = db.Count(&total).Error;err != nil {
  87. //没有复合条件,直接返回
  88. return loginList, total, err
  89. } else {
  90. //如果有符合条件的,先分页,再排序
  91. db.Limit(limit).Offset(offset)
  92. if order != "" {
  93. //传入排序字段,为避免sql注入,需要一个数组
  94. var orderStr string
  95. orderMap := make(map[string]bool, 5)
  96. orderMap["login_name"] = true
  97. orderMap["display_sequence"] = true
  98. orderMap["game_counts"] = true
  99. orderMap["create_time"] = true
  100. orderMap["update_time"] = true
  101. //传入字符串在合法范围内
  102. if orderMap[order] {
  103. if desc {
  104. orderStr = order + " desc"
  105. } else {
  106. orderStr = order
  107. }
  108. } else {
  109. //传入排序字段非法
  110. err = fmt.Errorf("传入非法字段 %v", order)
  111. return loginList, total, err
  112. }
  113. err = db.Order(orderStr).Find(&loginList).Error
  114. } else {
  115. //未传入排序字段,默认按登录名称降序
  116. err = db.Order("login_name desc").Find(&loginList).Error
  117. }
  118. }
  119. return loginList, total, err
  120. }
  121. //更改redis记录
  122. func UpdateLoginRedis(login typeManage.LoginType) {
  123. ctx := context.Background()
  124. key := "typeManage:loginType"
  125. field := strconv.FormatInt(login.Id, 10)
  126. //序列化
  127. datas, _ := json.Marshal(login)
  128. global.GVA_REDIS.HSet(ctx, key, field, datas)
  129. }
  130. //删除redis记录
  131. func DeleteLoginRedis(login typeManage.LoginType) {
  132. //删除redis记录
  133. ctx := context.Background()
  134. key := "typeManage:loginType"
  135. field := strconv.FormatInt(login.Id, 10)
  136. global.GVA_REDIS.HDel(ctx, key, field)
  137. }
  138. //批量删除命令
  139. func BulkDeletionLogin(ids []int) {
  140. //批量删除redis
  141. ctx := context.Background()
  142. key := "typeManage:loginType"
  143. for i := range ids{
  144. delKey := strconv.Itoa(ids[i])
  145. global.GVA_REDIS.HDel(ctx, key, delKey)
  146. }
  147. }