commonSysService.go 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. package base
  2. import (
  3. "context"
  4. "fmt"
  5. "github.com/redis/go-redis/v9"
  6. "go_server/base/config"
  7. "go_server/base/core"
  8. "go_server/global"
  9. system2 "go_server/model/system"
  10. "gorm.io/gorm"
  11. "time"
  12. )
  13. var sysCommonService *SysCommonService
  14. // 业务库公共服务
  15. type SysCommonService struct {
  16. }
  17. func GetSysService() *SysCommonService {
  18. if sysCommonService == nil {
  19. sysCommonService = &SysCommonService{}
  20. }
  21. return sysCommonService
  22. }
  23. func (*SysCommonService) DB() *gorm.DB {
  24. return global.AMS_DB
  25. }
  26. func (*SysCommonService) CheckIsAdmin(userId int64) error {
  27. // 限制用户增加必须管理员才可以操作
  28. if userId != system2.AdminId {
  29. return fmt.Errorf("不允许操作")
  30. }
  31. return nil
  32. }
  33. func (*SysCommonService) Redis() redis.UniversalClient {
  34. return global.AMS_REDIS
  35. }
  36. func (s *SysCommonService) unique(a string) string {
  37. return fmt.Sprintf("ADMIN:UNIKEY:%s", a)
  38. }
  39. // 接口重复调用限制
  40. func (s *SysCommonService) RepeatFilter(serviceName string, timeSt time.Duration) bool {
  41. if err := s.Redis().Ping(context.Background()).Err(); err != nil {
  42. return true
  43. }
  44. // 尝试设置KEY
  45. nxBool, err := s.Redis().SetNX(context.Background(), s.unique(serviceName), true, timeSt).Result()
  46. if err != nil {
  47. return false
  48. }
  49. if !nxBool {
  50. return false
  51. }
  52. // 获取过期时间 -- 可用于验证码获取上 暂五使用场景
  53. _, err = s.Redis().TTL(context.Background(), s.unique(serviceName)).Result()
  54. if err != nil {
  55. return false
  56. }
  57. return true
  58. }
  59. // GetDB 获取数据库的所有数据库名
  60. func (s *SysCommonService) GetBizDbs() (alias map[string]string, err error) {
  61. return global.AMS_BIZ_ALIAS_DB_MAP, err
  62. }
  63. // GetTables 获取数据库的所有表名
  64. type Table struct {
  65. TableName string `json:"tableName" gorm:"column:table_name"`
  66. }
  67. func (s *SysCommonService) GetTables(dbAlias string) ([]Table, error) {
  68. var entities []Table
  69. sql := `select table_name as table_name from information_schema.tables where table_schema = ?`
  70. db, err := global.BizDBByAlias(dbAlias)
  71. if err != nil {
  72. return entities, err
  73. }
  74. core.Log.Infof("dbName:%s", db.Migrator().CurrentDatabase())
  75. err = db.Raw(sql, db.Migrator().CurrentDatabase()).Scan(&entities).Error
  76. return entities, err
  77. }
  78. // GetColumn 获取指定数据库和指定数据表的所有字段名,类型值等
  79. type Column struct {
  80. DataType string `json:"dataType" gorm:"column:data_type"`
  81. ColumnName string `json:"columnName" gorm:"column:column_name"`
  82. DataTypeLong string `json:"dataTypeLong" gorm:"column:data_type_long"`
  83. ColumnComment string `json:"columnComment" gorm:"column:column_comment"`
  84. PrimaryKey bool `json:"primaryKey" gorm:"column:primary_key"`
  85. }
  86. func (s *SysCommonService) GetColumn(dbAlias string, tableName string) (data []Column, err error) {
  87. var entities []Column
  88. sql := `
  89. SELECT
  90. c.COLUMN_NAME column_name,
  91. c.DATA_TYPE data_type,
  92. CASE c.DATA_TYPE
  93. WHEN 'longtext' THEN c.CHARACTER_MAXIMUM_LENGTH
  94. WHEN 'varchar' THEN c.CHARACTER_MAXIMUM_LENGTH
  95. WHEN 'double' THEN CONCAT_WS(',', c.NUMERIC_PRECISION, c.NUMERIC_SCALE)
  96. WHEN 'decimal' THEN CONCAT_WS(',', c.NUMERIC_PRECISION, c.NUMERIC_SCALE)
  97. WHEN 'int' THEN c.NUMERIC_PRECISION
  98. WHEN 'bigint' THEN c.NUMERIC_PRECISION
  99. ELSE ''
  100. END AS data_type_long,
  101. c.COLUMN_COMMENT column_comment,
  102. CASE WHEN kcu.COLUMN_NAME IS NOT NULL THEN 1 ELSE 0 END AS primary_key,
  103. c.ORDINAL_POSITION
  104. FROM
  105. INFORMATION_SCHEMA.COLUMNS c
  106. LEFT JOIN
  107. INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu
  108. ON
  109. c.TABLE_SCHEMA = kcu.TABLE_SCHEMA
  110. AND c.TABLE_NAME = kcu.TABLE_NAME
  111. AND c.COLUMN_NAME = kcu.COLUMN_NAME
  112. AND kcu.CONSTRAINT_NAME = 'PRIMARY'
  113. WHERE
  114. c.TABLE_NAME = ?
  115. AND c.TABLE_SCHEMA = ?
  116. ORDER BY
  117. c.ORDINAL_POSITION;`
  118. db, err := global.BizDBByAlias(dbAlias)
  119. if err != nil {
  120. return entities, err
  121. }
  122. core.Log.Infof("dbName:%s tableName:%s", db.Migrator().CurrentDatabase(), tableName)
  123. err = db.Raw(sql, tableName, db.Migrator().CurrentDatabase()).Scan(&entities).Error
  124. return entities, err
  125. }
  126. func (s *SysCommonService) CheckFileJob() bool {
  127. row, ok := GetLast[system2.FileJob](s.DB())
  128. if !ok {
  129. return true
  130. }
  131. return row.Status != config.FileJobRunning
  132. }
  133. // 新建一个运行中文件任务
  134. func (s *SysCommonService) NewFileJob(userId int64) (*system2.FileJob, error) {
  135. row, ok := GetOne[system2.Administrator](s.DB(), "id", userId)
  136. if !ok {
  137. return nil, fmt.Errorf("admin is not found")
  138. }
  139. // 创建文件生成任务
  140. newJob := &system2.FileJob{
  141. Path: "",
  142. Total: 0,
  143. Size: "",
  144. Status: config.FileJobRunning,
  145. Desc: "",
  146. CreateBy: fmt.Sprintf("%s:%d", row.Nickname, row.ID),
  147. }
  148. err := s.DB().Create(&newJob).Error
  149. return newJob, err
  150. }
  151. // 保存文件任务
  152. func (s *SysCommonService) SaveJob(job *system2.FileJob) error {
  153. _, ok := GetOne[system2.FileJob](s.DB(), "id", job.ID)
  154. if !ok {
  155. return fmt.Errorf("file job is not found")
  156. }
  157. err := s.DB().Save(&job).Error
  158. return err
  159. }