| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 |
- package base
- import (
- "context"
- "fmt"
- "github.com/redis/go-redis/v9"
- "go_server/base/config"
- "go_server/base/core"
- "go_server/global"
- system2 "go_server/model/system"
- "gorm.io/gorm"
- "time"
- )
- var sysCommonService *SysCommonService
- // 业务库公共服务
- type SysCommonService struct {
- }
- func GetSysService() *SysCommonService {
- if sysCommonService == nil {
- sysCommonService = &SysCommonService{}
- }
- return sysCommonService
- }
- func (*SysCommonService) DB() *gorm.DB {
- return global.AMS_DB
- }
- func (*SysCommonService) CheckIsAdmin(userId int64) error {
- // 限制用户增加必须管理员才可以操作
- if userId != system2.AdminId {
- return fmt.Errorf("不允许操作")
- }
- return nil
- }
- func (*SysCommonService) Redis() redis.UniversalClient {
- return global.AMS_REDIS
- }
- func (s *SysCommonService) unique(a string) string {
- return fmt.Sprintf("ADMIN:UNIKEY:%s", a)
- }
- // 接口重复调用限制
- func (s *SysCommonService) RepeatFilter(serviceName string, timeSt time.Duration) bool {
- if err := s.Redis().Ping(context.Background()).Err(); err != nil {
- return true
- }
- // 尝试设置KEY
- nxBool, err := s.Redis().SetNX(context.Background(), s.unique(serviceName), true, timeSt).Result()
- if err != nil {
- return false
- }
- if !nxBool {
- return false
- }
- // 获取过期时间 -- 可用于验证码获取上 暂五使用场景
- _, err = s.Redis().TTL(context.Background(), s.unique(serviceName)).Result()
- if err != nil {
- return false
- }
- return true
- }
- // GetDB 获取数据库的所有数据库名
- func (s *SysCommonService) GetBizDbs() (alias map[string]string, err error) {
- return global.AMS_BIZ_ALIAS_DB_MAP, err
- }
- // GetTables 获取数据库的所有表名
- type Table struct {
- TableName string `json:"tableName" gorm:"column:table_name"`
- }
- func (s *SysCommonService) GetTables(dbAlias string) ([]Table, error) {
- var entities []Table
- sql := `select table_name as table_name from information_schema.tables where table_schema = ?`
- db, err := global.BizDBByAlias(dbAlias)
- if err != nil {
- return entities, err
- }
- core.Log.Infof("dbName:%s", db.Migrator().CurrentDatabase())
- err = db.Raw(sql, db.Migrator().CurrentDatabase()).Scan(&entities).Error
- return entities, err
- }
- // GetColumn 获取指定数据库和指定数据表的所有字段名,类型值等
- type Column struct {
- DataType string `json:"dataType" gorm:"column:data_type"`
- ColumnName string `json:"columnName" gorm:"column:column_name"`
- DataTypeLong string `json:"dataTypeLong" gorm:"column:data_type_long"`
- ColumnComment string `json:"columnComment" gorm:"column:column_comment"`
- PrimaryKey bool `json:"primaryKey" gorm:"column:primary_key"`
- }
- func (s *SysCommonService) GetColumn(dbAlias string, tableName string) (data []Column, err error) {
- var entities []Column
- sql := `
- SELECT
- c.COLUMN_NAME column_name,
- c.DATA_TYPE data_type,
- CASE c.DATA_TYPE
- WHEN 'longtext' THEN c.CHARACTER_MAXIMUM_LENGTH
- WHEN 'varchar' THEN c.CHARACTER_MAXIMUM_LENGTH
- WHEN 'double' THEN CONCAT_WS(',', c.NUMERIC_PRECISION, c.NUMERIC_SCALE)
- WHEN 'decimal' THEN CONCAT_WS(',', c.NUMERIC_PRECISION, c.NUMERIC_SCALE)
- WHEN 'int' THEN c.NUMERIC_PRECISION
- WHEN 'bigint' THEN c.NUMERIC_PRECISION
- ELSE ''
- END AS data_type_long,
- c.COLUMN_COMMENT column_comment,
- CASE WHEN kcu.COLUMN_NAME IS NOT NULL THEN 1 ELSE 0 END AS primary_key,
- c.ORDINAL_POSITION
- FROM
- INFORMATION_SCHEMA.COLUMNS c
- LEFT JOIN
- INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu
- ON
- c.TABLE_SCHEMA = kcu.TABLE_SCHEMA
- AND c.TABLE_NAME = kcu.TABLE_NAME
- AND c.COLUMN_NAME = kcu.COLUMN_NAME
- AND kcu.CONSTRAINT_NAME = 'PRIMARY'
- WHERE
- c.TABLE_NAME = ?
- AND c.TABLE_SCHEMA = ?
- ORDER BY
- c.ORDINAL_POSITION;`
- db, err := global.BizDBByAlias(dbAlias)
- if err != nil {
- return entities, err
- }
- core.Log.Infof("dbName:%s tableName:%s", db.Migrator().CurrentDatabase(), tableName)
- err = db.Raw(sql, tableName, db.Migrator().CurrentDatabase()).Scan(&entities).Error
- return entities, err
- }
- func (s *SysCommonService) CheckFileJob() bool {
- row, ok := GetLast[system2.FileJob](s.DB())
- if !ok {
- return true
- }
- return row.Status != config.FileJobRunning
- }
- // 新建一个运行中文件任务
- func (s *SysCommonService) NewFileJob(userId int64) (*system2.FileJob, error) {
- row, ok := GetOne[system2.Administrator](s.DB(), "id", userId)
- if !ok {
- return nil, fmt.Errorf("admin is not found")
- }
- // 创建文件生成任务
- newJob := &system2.FileJob{
- Path: "",
- Total: 0,
- Size: "",
- Status: config.FileJobRunning,
- Desc: "",
- CreateBy: fmt.Sprintf("%s:%d", row.Nickname, row.ID),
- }
- err := s.DB().Create(&newJob).Error
- return newJob, err
- }
- // 保存文件任务
- func (s *SysCommonService) SaveJob(job *system2.FileJob) error {
- _, ok := GetOne[system2.FileJob](s.DB(), "id", job.ID)
- if !ok {
- return fmt.Errorf("file job is not found")
- }
- err := s.DB().Save(&job).Error
- return err
- }
|