diff --git a/main.go b/main.go index 6231d76..6c7255c 100644 --- a/main.go +++ b/main.go @@ -7,7 +7,6 @@ import ( "github.com/labstack/gommon/log" "github.com/robfig/cron/v3" "github.com/sirupsen/logrus" - "gorm.io/gorm" "io" "next-terminal/server/api" "next-terminal/server/config" @@ -15,11 +14,7 @@ import ( "os" ) -const Version = "v0.3.3" - -var ( - db *gorm.DB -) +const Version = "v0.3.4" func main() { err := Run() @@ -56,27 +51,20 @@ func Run() error { logrus.SetOutput(io.MultiWriter(writer1, writer2, writer3)) global.Config = config.SetupConfig() - db = config.SetupDB() - - //if global.Config.ResetPassword != "" { - // return ResetPassword() - //} - - if err := api.ReloadAccessSecurity(); err != nil { - return err - } global.Store = global.NewStore() global.Cron = cron.New(cron.WithSeconds()) //精确到秒 global.Cron.Start() + db := api.SetupDB() e := api.SetupRoutes(db) global.Cache = api.SetupCache() + if global.Config.ResetPassword != "" { + return api.ResetPassword() + } api.SetupTicker() - go handle.RunDataFix() - if global.Config.Server.Cert != "" && global.Config.Server.Key != "" { return e.StartTLS(global.Config.Server.Addr, global.Config.Server.Cert, global.Config.Server.Key) } else { diff --git a/server/api/command.go b/server/api/command.go index 72b841c..afffffc 100644 --- a/server/api/command.go +++ b/server/api/command.go @@ -22,7 +22,7 @@ func CommandCreateEndpoint(c echo.Context) error { item.ID = utils.UUID() item.Created = utils.NowJsonTime() - if err := model.CreateNewCommand(&item); err != nil { + if err := commandRepository.Create(&item); err != nil { return err } @@ -39,7 +39,7 @@ func CommandPagingEndpoint(c echo.Context) error { order := c.QueryParam("order") field := c.QueryParam("field") - items, total, err := model.FindPageCommand(pageIndex, pageSize, name, content, order, field, account) + items, total, err := commandRepository.Find(pageIndex, pageSize, name, content, order, field, account) if err != nil { return err } @@ -61,7 +61,9 @@ func CommandUpdateEndpoint(c echo.Context) error { return err } - model.UpdateCommandById(&item, id) + if err := commandRepository.UpdateById(&item, id); err != nil { + return err + } return Success(c, nil) } @@ -73,11 +75,11 @@ func CommandDeleteEndpoint(c echo.Context) error { if err := PreCheckCommandPermission(c, split[i]); err != nil { return err } - if err := model.DeleteCommandById(split[i]); err != nil { + if err := commandRepository.DeleteById(split[i]); err != nil { return err } // 删除资产与用户的关系 - if err := model.DeleteResourceSharerByResourceId(split[i]); err != nil { + if err := resourceSharerRepository.DeleteResourceSharerByResourceId(split[i]); err != nil { return err } } @@ -92,7 +94,7 @@ func CommandGetEndpoint(c echo.Context) (err error) { } var item model.Command - if item, err = model.FindCommandById(id); err != nil { + if item, err = commandRepository.FindById(id); err != nil { return err } return Success(c, item) @@ -106,12 +108,14 @@ func CommandChangeOwnerEndpoint(c echo.Context) (err error) { } owner := c.QueryParam("owner") - model.UpdateCommandById(&model.Command{Owner: owner}, id) + if err := commandRepository.UpdateById(&model.Command{Owner: owner}, id); err != nil { + return err + } return Success(c, "") } func PreCheckCommandPermission(c echo.Context, id string) error { - item, err := model.FindCommandById(id) + item, err := commandRepository.FindById(id) if err != nil { return err } diff --git a/server/api/credential.go b/server/api/credential.go index 0b29854..8fa8677 100644 --- a/server/api/credential.go +++ b/server/api/credential.go @@ -14,7 +14,7 @@ import ( func CredentialAllEndpoint(c echo.Context) error { account, _ := GetCurrentAccount(c) - items, _ := model.FindAllCredential(account) + items, _ := credentialRepository.FindByUser(account) return Success(c, items) } func CredentialCreateEndpoint(c echo.Context) error { @@ -53,7 +53,7 @@ func CredentialCreateEndpoint(c echo.Context) error { return Fail(c, -1, "类型错误") } - if err := model.CreateNewCredential(&item); err != nil { + if err := credentialRepository.Create(&item); err != nil { return err } @@ -69,7 +69,7 @@ func CredentialPagingEndpoint(c echo.Context) error { field := c.QueryParam("field") account, _ := GetCurrentAccount(c) - items, total, err := model.FindPageCredential(pageIndex, pageSize, name, order, field, account) + items, total, err := credentialRepository.Find(pageIndex, pageSize, name, order, field, account) if err != nil { return err } @@ -117,7 +117,9 @@ func CredentialUpdateEndpoint(c echo.Context) error { return Fail(c, -1, "类型错误") } - model.UpdateCredentialById(&item, id) + if err := credentialRepository.UpdateById(&item, id); err != nil { + return err + } return Success(c, nil) } @@ -129,11 +131,11 @@ func CredentialDeleteEndpoint(c echo.Context) error { if err := PreCheckCredentialPermission(c, split[i]); err != nil { return err } - if err := model.DeleteCredentialById(split[i]); err != nil { + if err := credentialRepository.DeleteById(split[i]); err != nil { return err } // 删除资产与用户的关系 - if err := model.DeleteResourceSharerByResourceId(split[i]); err != nil { + if err := resourceSharerRepository.DeleteResourceSharerByResourceId(split[i]); err != nil { return err } } @@ -147,7 +149,7 @@ func CredentialGetEndpoint(c echo.Context) error { return err } - item, err := model.FindCredentialById(id) + item, err := credentialRepository.FindById(id) if err != nil { return err } @@ -167,12 +169,14 @@ func CredentialChangeOwnerEndpoint(c echo.Context) error { } owner := c.QueryParam("owner") - model.UpdateCredentialById(&model.Credential{Owner: owner}, id) + if err := credentialRepository.UpdateById(&model.Credential{Owner: owner}, id); err != nil { + return err + } return Success(c, "") } func PreCheckCredentialPermission(c echo.Context, id string) error { - item, err := model.FindCredentialById(id) + item, err := credentialRepository.FindById(id) if err != nil { return err } diff --git a/server/api/job.go b/server/api/job.go index 4d72872..6f908f6 100644 --- a/server/api/job.go +++ b/server/api/job.go @@ -19,7 +19,7 @@ func JobCreateEndpoint(c echo.Context) error { item.ID = utils.UUID() item.Created = utils.NowJsonTime() - if err := model.CreateNewJob(&item); err != nil { + if err := jobService.Create(&item); err != nil { return err } return Success(c, "") @@ -34,7 +34,7 @@ func JobPagingEndpoint(c echo.Context) error { order := c.QueryParam("order") field := c.QueryParam("field") - items, total, err := model.FindPageJob(pageIndex, pageSize, name, status, order, field) + items, total, err := jobRepository.Find(pageIndex, pageSize, name, status, order, field) if err != nil { return err } @@ -52,8 +52,8 @@ func JobUpdateEndpoint(c echo.Context) error { if err := c.Bind(&item); err != nil { return err } - - if err := model.UpdateJobById(&item, id); err != nil { + item.ID = id + if err := jobRepository.UpdateById(&item); err != nil { return err } @@ -63,7 +63,7 @@ func JobUpdateEndpoint(c echo.Context) error { func JobChangeStatusEndpoint(c echo.Context) error { id := c.Param("id") status := c.QueryParam("status") - if err := model.ChangeJobStatusById(id, status); err != nil { + if err := jobService.ChangeStatusById(id, status); err != nil { return err } return Success(c, "") @@ -71,7 +71,7 @@ func JobChangeStatusEndpoint(c echo.Context) error { func JobExecEndpoint(c echo.Context) error { id := c.Param("id") - if err := model.ExecJobById(id); err != nil { + if err := jobService.ExecJobById(id); err != nil { return err } return Success(c, "") @@ -83,7 +83,7 @@ func JobDeleteEndpoint(c echo.Context) error { split := strings.Split(ids, ",") for i := range split { jobId := split[i] - if err := model.DeleteJobById(jobId); err != nil { + if err := jobRepository.DeleteJobById(jobId); err != nil { return err } } @@ -94,7 +94,7 @@ func JobDeleteEndpoint(c echo.Context) error { func JobGetEndpoint(c echo.Context) error { id := c.Param("id") - item, err := model.FindJobById(id) + item, err := jobRepository.FindById(id) if err != nil { return err } @@ -105,7 +105,7 @@ func JobGetEndpoint(c echo.Context) error { func JobGetLogsEndpoint(c echo.Context) error { id := c.Param("id") - items, err := model.FindJobLogs(id) + items, err := jobLogRepository.FindByJobId(id) if err != nil { return err } @@ -115,7 +115,7 @@ func JobGetLogsEndpoint(c echo.Context) error { func JobDeleteLogsEndpoint(c echo.Context) error { id := c.Param("id") - if err := model.DeleteJobLogByJobId(id); err != nil { + if err := jobLogRepository.DeleteByJobId(id); err != nil { return err } return Success(c, "") diff --git a/server/api/overview.go b/server/api/overview.go index 1fb31bc..aa21611 100644 --- a/server/api/overview.go +++ b/server/api/overview.go @@ -2,7 +2,7 @@ package api import ( "next-terminal/server/constant" - "next-terminal/server/model" + "next-terminal/server/repository" "github.com/labstack/echo/v4" ) @@ -25,14 +25,14 @@ func OverviewCounterEndPoint(c echo.Context) error { ) if constant.TypeUser == account.Type { countUser, _ = userRepository.CountOnlineUser() - countOnlineSession, _ = model.CountOnlineSession() - credential, _ = model.CountCredentialByUserId(account.ID) - asset, _ = model.CountAssetByUserId(account.ID) + countOnlineSession, _ = sessionRepository.CountOnlineSession() + credential, _ = credentialRepository.CountByUserId(account.ID) + asset, _ = assetRepository.CountByUserId(account.ID) } else { countUser, _ = userRepository.CountOnlineUser() - countOnlineSession, _ = model.CountOnlineSession() - credential, _ = model.CountCredential() - asset, _ = model.CountAsset() + countOnlineSession, _ = sessionRepository.CountOnlineSession() + credential, _ = credentialRepository.Count() + asset, _ = assetRepository.Count() } counter := Counter{ User: countUser, @@ -46,11 +46,11 @@ func OverviewCounterEndPoint(c echo.Context) error { func OverviewSessionPoint(c echo.Context) (err error) { d := c.QueryParam("d") - var results []model.D + var results []repository.D if d == "m" { - results, err = model.CountSessionByDay(30) + results, err = sessionRepository.CountSessionByDay(30) } else { - results, err = model.CountSessionByDay(7) + results, err = sessionRepository.CountSessionByDay(7) } if err != nil { return err diff --git a/server/api/property.go b/server/api/property.go index 3852249..f5e6310 100644 --- a/server/api/property.go +++ b/server/api/property.go @@ -11,7 +11,7 @@ import ( ) func PropertyGetEndpoint(c echo.Context) error { - properties := model.FindAllPropertiesMap() + properties := propertyRepository.FindAllMap() return Success(c, properties) } @@ -32,13 +32,15 @@ func PropertyUpdateEndpoint(c echo.Context) error { Value: value, } - _, err := model.FindPropertyByName(key) + _, err := propertyRepository.FindByName(key) if err != nil && errors.Is(err, gorm.ErrRecordNotFound) { - if err := model.CreateNewProperty(&property); err != nil { + if err := propertyRepository.Create(&property); err != nil { return err } } else { - model.UpdatePropertyByName(&property, key) + if err := propertyRepository.UpdateByName(&property, key); err != nil { + return err + } } } return Success(c, nil) diff --git a/server/api/resource-sharer.go b/server/api/resource-sharer.go index 6f9d9d4..77a5201 100644 --- a/server/api/resource-sharer.go +++ b/server/api/resource-sharer.go @@ -1,8 +1,6 @@ package api import ( - "next-terminal/server/model" - "github.com/labstack/echo/v4" ) @@ -21,7 +19,7 @@ type UR struct { func RSGetSharersEndPoint(c echo.Context) error { resourceId := c.QueryParam("resourceId") - userIds, err := model.FindUserIdsByResourceId(resourceId) + userIds, err := resourceSharerRepository.FindUserIdsByResourceId(resourceId) if err != nil { return err } @@ -34,7 +32,7 @@ func RSOverwriteSharersEndPoint(c echo.Context) error { return err } - if err := model.OverwriteUserIdsByResourceId(ur.ResourceId, ur.ResourceType, ur.UserIds); err != nil { + if err := resourceSharerRepository.OverwriteUserIdsByResourceId(ur.ResourceId, ur.ResourceType, ur.UserIds); err != nil { return err } @@ -47,7 +45,7 @@ func ResourceRemoveByUserIdAssignEndPoint(c echo.Context) error { return err } - if err := model.DeleteByUserIdAndResourceTypeAndResourceIdIn(ru.UserGroupId, ru.UserId, ru.ResourceType, ru.ResourceIds); err != nil { + if err := resourceSharerRepository.DeleteByUserIdAndResourceTypeAndResourceIdIn(ru.UserGroupId, ru.UserId, ru.ResourceType, ru.ResourceIds); err != nil { return err } @@ -60,7 +58,7 @@ func ResourceAddByUserIdAssignEndPoint(c echo.Context) error { return err } - if err := model.AddSharerResources(ru.UserGroupId, ru.UserId, ru.ResourceType, ru.ResourceIds); err != nil { + if err := resourceSharerRepository.AddSharerResources(ru.UserGroupId, ru.UserId, ru.ResourceType, ru.ResourceIds); err != nil { return err } diff --git a/server/api/routes.go b/server/api/routes.go index e907648..39b765f 100644 --- a/server/api/routes.go +++ b/server/api/routes.go @@ -1,9 +1,13 @@ package api import ( + "fmt" "github.com/patrickmn/go-cache" "github.com/sirupsen/logrus" + "gorm.io/driver/mysql" + "gorm.io/driver/sqlite" "gorm.io/gorm" + "gorm.io/gorm/logger" "net/http" "next-terminal/server/global" "next-terminal/server/log" @@ -40,6 +44,7 @@ var ( propertyService *service.PropertyService userService *service.UserService sessionService *service.SessionService + mailService *service.MailService ) func SetupRoutes(db *gorm.DB) *echo.Echo { @@ -47,7 +52,9 @@ func SetupRoutes(db *gorm.DB) *echo.Echo { InitRepository(db) InitService() - InitDBData() + if err := InitDBData(); err != nil { + logrus.WithError(err).Error("初始化数据异常") + } e := echo.New() e.HideBanner = true @@ -225,8 +232,9 @@ func InitRepository(db *gorm.DB) { func InitService() { jobService = service.NewJobService(jobRepository, jobLogRepository, assetRepository, credentialRepository) propertyService = service.NewPropertyService(propertyRepository) - userService = service.NewUserService(userRepository) + userService = service.NewUserService(userRepository, loginLogRepository) sessionService = service.NewSessionService(sessionRepository) + mailService = service.NewMailService(propertyRepository) } func InitDBData() (err error) { @@ -244,8 +252,11 @@ func InitDBData() (err error) { } sessionService.Fix() + if err := ReloadAccessSecurity(); err != nil { + return err + } nums, _ := numRepository.FindAll() - if nums == nil || len(nums) == 0 { + if nums == nil { for i := 0; i <= 30; i++ { if err := numRepository.Create(&model.Num{I: strconv.Itoa(i)}); err != nil { return err @@ -291,3 +302,44 @@ func SetupCache() *cache.Cache { }) return mCache } + +func SetupDB() *gorm.DB { + + var logMode logger.Interface + if global.Config.Debug { + logMode = logger.Default.LogMode(logger.Info) + } else { + logMode = logger.Default.LogMode(logger.Silent) + } + + fmt.Printf("当前数据库模式为:%v\n", global.Config.DB) + var err error + var db *gorm.DB + if global.Config.DB == "mysql" { + dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local", + global.Config.Mysql.Username, + global.Config.Mysql.Password, + global.Config.Mysql.Hostname, + global.Config.Mysql.Port, + global.Config.Mysql.Database, + ) + db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{ + Logger: logMode, + }) + } else { + db, err = gorm.Open(sqlite.Open(global.Config.Sqlite.File), &gorm.Config{ + Logger: logMode, + }) + } + + if err != nil { + logrus.WithError(err).Panic("连接数据库异常") + } + + if err := db.AutoMigrate(&model.User{}, &model.Asset{}, &model.AssetAttribute{}, &model.Session{}, &model.Command{}, + &model.Credential{}, &model.Property{}, &model.ResourceSharer{}, &model.UserGroup{}, &model.UserGroupMember{}, + &model.LoginLog{}, &model.Num{}, &model.Job{}, &model.JobLog{}, &model.AccessSecurity{}); err != nil { + logrus.WithError(err).Panic("初始化数据库表结构异常") + } + return db +} diff --git a/server/api/session.go b/server/api/session.go index b295873..1a8edaa 100644 --- a/server/api/session.go +++ b/server/api/session.go @@ -32,7 +32,7 @@ func SessionPagingEndpoint(c echo.Context) error { assetId := c.QueryParam("assetId") protocol := c.QueryParam("protocol") - items, total, err := model.FindPageSession(pageIndex, pageSize, status, userId, clientIp, assetId, protocol) + items, total, err := sessionRepository.Find(pageIndex, pageSize, status, userId, clientIp, assetId, protocol) if err != nil { return err @@ -67,7 +67,7 @@ func SessionPagingEndpoint(c echo.Context) error { func SessionDeleteEndpoint(c echo.Context) error { sessionIds := c.Param("id") split := strings.Split(sessionIds, ",") - err := model.DeleteSessionByIds(split) + err := sessionRepository.DeleteByIds(split) if err != nil { return err } @@ -83,7 +83,7 @@ func SessionConnectEndpoint(c echo.Context) error { session.Status = constant.Connected session.ConnectedTime = utils.NowJsonTime() - if err := model.UpdateSessionById(&session, sessionId); err != nil { + if err := sessionRepository.UpdateById(&session, sessionId); err != nil { return err } return Success(c, nil) @@ -116,7 +116,7 @@ func CloseSessionById(sessionId string, code int, reason string) { } global.Store.Del(sessionId) - s, err := model.FindSessionById(sessionId) + s, err := sessionRepository.FindById(sessionId) if err != nil { return } @@ -127,7 +127,7 @@ func CloseSessionById(sessionId string, code int, reason string) { if s.Status == constant.Connecting { // 会话还未建立成功,无需保留数据 - _ = model.DeleteSessionById(sessionId) + _ = sessionRepository.DeleteById(sessionId) return } @@ -138,7 +138,7 @@ func CloseSessionById(sessionId string, code int, reason string) { session.Code = code session.Message = reason - _ = model.UpdateSessionById(&session, sessionId) + _ = sessionRepository.UpdateById(&session, sessionId) } func SessionResizeEndpoint(c echo.Context) error { @@ -154,7 +154,7 @@ func SessionResizeEndpoint(c echo.Context) error { intHeight, _ := strconv.Atoi(height) - if err := model.UpdateSessionWindowSizeById(intWidth, intHeight, sessionId); err != nil { + if err := sessionRepository.UpdateWindowSizeById(intWidth, intHeight, sessionId); err != nil { return err } return Success(c, "") @@ -174,7 +174,7 @@ func SessionCreateEndpoint(c echo.Context) error { if constant.TypeUser == user.Type { // 检测是否有访问权限 - assetIds, err := model.FindAssetIdsByUserId(user.ID) + assetIds, err := resourceSharerRepository.FindAssetIdsByUserId(user.ID) if err != nil { return err } @@ -184,7 +184,7 @@ func SessionCreateEndpoint(c echo.Context) error { } } - asset, err := model.FindAssetById(assetId) + asset, err := assetRepository.FindById(assetId) if err != nil { return err } @@ -206,7 +206,7 @@ func SessionCreateEndpoint(c echo.Context) error { } if asset.AccountType == "credential" { - credential, err := model.FindCredentialById(asset.CredentialId) + credential, err := credentialRepository.FindById(asset.CredentialId) if err != nil { return err } @@ -221,7 +221,7 @@ func SessionCreateEndpoint(c echo.Context) error { } } - if err := model.CreateNewSession(session); err != nil { + if err := sessionRepository.Create(session); err != nil { return err } @@ -230,7 +230,7 @@ func SessionCreateEndpoint(c echo.Context) error { func SessionUploadEndpoint(c echo.Context) error { sessionId := c.Param("id") - session, err := model.FindSessionById(sessionId) + session, err := sessionRepository.FindById(sessionId) if err != nil { return err } @@ -280,7 +280,7 @@ func SessionUploadEndpoint(c echo.Context) error { return Fail(c, -1, ":) 您的IP已被记录,请去向管理员自首。") } - drivePath, err := model.GetDrivePath() + drivePath, err := propertyRepository.GetDrivePath() if err != nil { return err } @@ -304,7 +304,7 @@ func SessionUploadEndpoint(c echo.Context) error { func SessionDownloadEndpoint(c echo.Context) error { sessionId := c.Param("id") - session, err := model.FindSessionById(sessionId) + session, err := sessionRepository.FindById(sessionId) if err != nil { return err } @@ -337,7 +337,7 @@ func SessionDownloadEndpoint(c echo.Context) error { SafetyRuleTrigger(c) return Fail(c, -1, ":) 您的IP已被记录,请去向管理员自首。") } - drivePath, err := model.GetDrivePath() + drivePath, err := propertyRepository.GetDrivePath() if err != nil { return err } @@ -359,7 +359,7 @@ type File struct { func SessionLsEndpoint(c echo.Context) error { sessionId := c.Param("id") - session, err := model.FindSessionById(sessionId) + session, err := sessionRepository.FindById(sessionId) if err != nil { return err } @@ -419,7 +419,7 @@ func SessionLsEndpoint(c echo.Context) error { SafetyRuleTrigger(c) return Fail(c, -1, ":) 您的IP已被记录,请去向管理员自首。") } - drivePath, err := model.GetDrivePath() + drivePath, err := propertyRepository.GetDrivePath() if err != nil { return err } @@ -458,12 +458,12 @@ func SafetyRuleTrigger(c echo.Context) { Rule: constant.AccessRuleReject, } - _ = model.CreateNewSecurity(&security) + _ = accessSecurityRepository.Create(&security) } func SessionMkDirEndpoint(c echo.Context) error { sessionId := c.Param("id") - session, err := model.FindSessionById(sessionId) + session, err := sessionRepository.FindById(sessionId) if err != nil { return err } @@ -482,7 +482,7 @@ func SessionMkDirEndpoint(c echo.Context) error { SafetyRuleTrigger(c) return Fail(c, -1, ":) 您的IP已被记录,请去向管理员自首。") } - drivePath, err := model.GetDrivePath() + drivePath, err := propertyRepository.GetDrivePath() if err != nil { return err } @@ -498,7 +498,7 @@ func SessionMkDirEndpoint(c echo.Context) error { func SessionRmEndpoint(c echo.Context) error { sessionId := c.Param("id") - session, err := model.FindSessionById(sessionId) + session, err := sessionRepository.FindById(sessionId) if err != nil { return err } @@ -543,7 +543,7 @@ func SessionRmEndpoint(c echo.Context) error { SafetyRuleTrigger(c) return Fail(c, -1, ":) 您的IP已被记录,请去向管理员自首。") } - drivePath, err := model.GetDrivePath() + drivePath, err := propertyRepository.GetDrivePath() if err != nil { return err } @@ -560,7 +560,7 @@ func SessionRmEndpoint(c echo.Context) error { func SessionRenameEndpoint(c echo.Context) error { sessionId := c.Param("id") - session, err := model.FindSessionById(sessionId) + session, err := sessionRepository.FindById(sessionId) if err != nil { return err } @@ -584,7 +584,7 @@ func SessionRenameEndpoint(c echo.Context) error { SafetyRuleTrigger(c) return Fail(c, -1, ":) 您的IP已被记录,请去向管理员自首。") } - drivePath, err := model.GetDrivePath() + drivePath, err := propertyRepository.GetDrivePath() if err != nil { return err } @@ -600,7 +600,7 @@ func SessionRenameEndpoint(c echo.Context) error { func SessionRecordingEndpoint(c echo.Context) error { sessionId := c.Param("id") - session, err := model.FindSessionById(sessionId) + session, err := sessionRepository.FindById(sessionId) if err != nil { return err } diff --git a/server/api/ssh.go b/server/api/ssh.go index 1285a89..61de926 100644 --- a/server/api/ssh.go +++ b/server/api/ssh.go @@ -54,7 +54,7 @@ func SSHEndpoint(c echo.Context) (err error) { cols, _ := strconv.Atoi(c.QueryParam("cols")) rows, _ := strconv.Atoi(c.QueryParam("rows")) - session, err := model.FindSessionById(sessionId) + session, err := sessionRepository.FindById(sessionId) if err != nil { msg := Message{ Type: Closed, @@ -67,7 +67,7 @@ func SSHEndpoint(c echo.Context) (err error) { user, _ := GetCurrentAccount(c) if constant.TypeUser == user.Type { // 检测是否有访问权限 - assetIds, err := model.FindAssetIdsByUserId(user.ID) + assetIds, err := resourceSharerRepository.FindAssetIdsByUserId(user.ID) if err != nil { return err } @@ -91,7 +91,7 @@ func SSHEndpoint(c echo.Context) (err error) { ) recording := "" - propertyMap := model.FindAllPropertiesMap() + propertyMap := propertyRepository.FindAllMap() if propertyMap[guacd.EnableRecording] == "true" { recording = path.Join(propertyMap[guacd.RecordingPath], sessionId, "recording.cast") } @@ -145,7 +145,7 @@ func SSHEndpoint(c echo.Context) (err error) { } // 创建新会话 logrus.Debugf("创建新会话 %v", sess.ConnectionId) - if err := model.UpdateSessionById(&sess, sessionId); err != nil { + if err := sessionRepository.UpdateById(&sess, sessionId); err != nil { return err } diff --git a/server/api/tunnel.go b/server/api/tunnel.go index 975f1e5..db8c46e 100644 --- a/server/api/tunnel.go +++ b/server/api/tunnel.go @@ -42,12 +42,12 @@ func TunEndpoint(c echo.Context) error { configuration := guacd.NewConfiguration() - propertyMap := model.FindAllPropertiesMap() + propertyMap := propertyRepository.FindAllMap() var session model.Session if len(connectionId) > 0 { - session, err = model.FindSessionByConnectionId(connectionId) + session, err = sessionRepository.FindByConnectionId(connectionId) if err != nil { logrus.Warnf("会话不存在") return err @@ -65,7 +65,7 @@ func TunEndpoint(c echo.Context) error { configuration.SetParameter("width", width) configuration.SetParameter("height", height) configuration.SetParameter("dpi", dpi) - session, err = model.FindSessionById(sessionId) + session, err = sessionRepository.FindById(sessionId) if err != nil { CloseSessionById(sessionId, NotFoundSession, "会话不存在") return err @@ -143,7 +143,7 @@ func TunEndpoint(c echo.Context) error { configuration.SetParameter("port", strconv.Itoa(session.Port)) // 加载资产配置的属性,优先级比全局配置的高,因此最后加载,覆盖掉全局配置 - attributes, _ := model.FindAssetAttributeByAssetId(session.AssetId) + attributes, _ := assetRepository.FindAttrById(session.AssetId) if len(attributes) > 0 { for i := range attributes { attribute := attributes[i] @@ -195,7 +195,7 @@ func TunEndpoint(c echo.Context) error { } // 创建新会话 logrus.Debugf("创建新会话 %v", sess.ConnectionId) - if err := model.UpdateSessionById(&sess, sessionId); err != nil { + if err := sessionRepository.UpdateById(&sess, sessionId); err != nil { return err } } else { diff --git a/server/api/user-group.go b/server/api/user-group.go index a20d13d..650f0ac 100644 --- a/server/api/user-group.go +++ b/server/api/user-group.go @@ -4,7 +4,6 @@ import ( "strconv" "strings" - "next-terminal/server/global" "next-terminal/server/model" "next-terminal/server/utils" @@ -29,7 +28,7 @@ func UserGroupCreateEndpoint(c echo.Context) error { Name: item.Name, } - if err := model.CreateNewUserGroup(&userGroup, item.Members); err != nil { + if err := userGroupRepository.Create(&userGroup, item.Members); err != nil { return err } @@ -44,7 +43,7 @@ func UserGroupPagingEndpoint(c echo.Context) error { order := c.QueryParam("order") field := c.QueryParam("field") - items, total, err := model.FindPageUserGroup(pageIndex, pageSize, name, order, field) + items, total, err := userGroupRepository.Find(pageIndex, pageSize, name, order, field) if err != nil { return err } @@ -66,7 +65,7 @@ func UserGroupUpdateEndpoint(c echo.Context) error { Name: item.Name, } - if err := model.UpdateUserGroupById(&userGroup, item.Members, id); err != nil { + if err := userGroupRepository.Update(&userGroup, item.Members, id); err != nil { return err } @@ -78,7 +77,9 @@ func UserGroupDeleteEndpoint(c echo.Context) error { split := strings.Split(ids, ",") for i := range split { userId := split[i] - model.DeleteUserGroupById(userId) + if err := userGroupRepository.DeleteById(userId); err != nil { + return err + } } return Success(c, nil) @@ -87,12 +88,12 @@ func UserGroupDeleteEndpoint(c echo.Context) error { func UserGroupGetEndpoint(c echo.Context) error { id := c.Param("id") - item, err := model.FindUserGroupById(id) + item, err := userGroupRepository.FindById(id) if err != nil { return err } - members, err := model.FindUserGroupMembersByUserGroupId(id) + members, err := userGroupRepository.FindMembersById(id) if err != nil { return err } @@ -105,32 +106,3 @@ func UserGroupGetEndpoint(c echo.Context) error { return Success(c, userGroup) } - -func UserGroupAddMembersEndpoint(c echo.Context) error { - id := c.Param("id") - - var items []string - if err := c.Bind(&items); err != nil { - return err - } - - if err := model.AddUserGroupMembers(global.DB, items, id); err != nil { - return err - } - return Success(c, "") -} - -func UserGroupDelMembersEndpoint(c echo.Context) (err error) { - id := c.Param("id") - memberIdsStr := c.Param("memberId") - memberIds := strings.Split(memberIdsStr, ",") - for i := range memberIds { - memberId := memberIds[i] - err = global.DB.Where("user_group_id = ? and user_id = ?", id, memberId).Delete(&model.UserGroupMember{}).Error - if err != nil { - return err - } - } - - return Success(c, "") -} diff --git a/server/api/user.go b/server/api/user.go index a510f83..ed51513 100644 --- a/server/api/user.go +++ b/server/api/user.go @@ -34,7 +34,7 @@ func UserCreateEndpoint(c echo.Context) error { } if item.Mail != "" { - go model.SendMail(item.Mail, "[Next Terminal] 注册通知", "你好,"+item.Nickname+"。管理员为你注册了账号:"+item.Username+" 密码:"+password) + go mailService.SendMail(item.Mail, "[Next Terminal] 注册通知", "你好,"+item.Nickname+"。管理员为你注册了账号:"+item.Username+" 密码:"+password) } return Success(c, item) } @@ -89,14 +89,14 @@ func UserDeleteEndpoint(c echo.Context) error { return Fail(c, -1, "不允许删除自身账户") } // 将用户强制下线 - loginLogs, err := model.FindAliveLoginLogsByUserId(userId) + loginLogs, err := loginLogRepository.FindAliveLoginLogsByUserId(userId) if err != nil { return err } for j := range loginLogs { global.Cache.Delete(loginLogs[j].ID) - if err := model.Logout(loginLogs[j].ID); err != nil { + if err := userService.Logout(loginLogs[j].ID); err != nil { logrus.WithError(err).WithField("id:", loginLogs[j].ID).Error("Cache Deleted Error") return Fail(c, 500, "强制下线错误") } @@ -144,7 +144,7 @@ func UserChangePasswordEndpoint(c echo.Context) error { } if user.Mail != "" { - go model.SendMail(user.Mail, "[Next Terminal] 密码修改通知", "你好,"+user.Nickname+"。管理员已将你的密码修改为:"+password) + go mailService.SendMail(user.Mail, "[Next Terminal] 密码修改通知", "你好,"+user.Nickname+"。管理员已将你的密码修改为:"+password) } return Success(c, "") @@ -161,3 +161,37 @@ func UserResetTotpEndpoint(c echo.Context) error { } return Success(c, "") } + +func ReloadToken() error { + loginLogs, err := loginLogRepository.FindAliveLoginLogs() + if err != nil { + return err + } + + for i := range loginLogs { + loginLog := loginLogs[i] + token := loginLog.ID + user, err := userRepository.FindById(loginLog.UserId) + if err != nil { + logrus.Debugf("用户「%v」获取失败,忽略", loginLog.UserId) + continue + } + + authorization := Authorization{ + Token: token, + Remember: loginLog.Remember, + User: user, + } + + cacheKey := BuildCacheKeyByToken(token) + + if authorization.Remember { + // 记住登录有效期两周 + global.Cache.Set(cacheKey, authorization, RememberEffectiveTime) + } else { + global.Cache.Set(cacheKey, authorization, NotRememberEffectiveTime) + } + logrus.Debugf("重新加载用户「%v」授权Token「%v」到缓存", user.Nickname, token) + } + return nil +} diff --git a/server/config/db.go b/server/config/db.go deleted file mode 100644 index 3ef9428..0000000 --- a/server/config/db.go +++ /dev/null @@ -1,53 +0,0 @@ -package config - -import ( - "fmt" - "github.com/sirupsen/logrus" - "gorm.io/driver/mysql" - "gorm.io/driver/sqlite" - "gorm.io/gorm" - "gorm.io/gorm/logger" - "next-terminal/server/global" - "next-terminal/server/model" -) - -func SetupDB() *gorm.DB { - - var logMode logger.Interface - if global.Config.Debug { - logMode = logger.Default.LogMode(logger.Info) - } else { - logMode = logger.Default.LogMode(logger.Silent) - } - - fmt.Printf("当前数据库模式为:%v\n", global.Config.DB) - var err error - var db *gorm.DB - if global.Config.DB == "mysql" { - dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local", - global.Config.Mysql.Username, - global.Config.Mysql.Password, - global.Config.Mysql.Hostname, - global.Config.Mysql.Port, - global.Config.Mysql.Database, - ) - db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{ - Logger: logMode, - }) - } else { - db, err = gorm.Open(sqlite.Open(global.Config.Sqlite.File), &gorm.Config{ - Logger: logMode, - }) - } - - if err != nil { - logrus.WithError(err).Panic("连接数据库异常") - } - - if err := db.AutoMigrate(&model.User{}, &model.Asset{}, &model.AssetAttribute{}, &model.Session{}, &model.Command{}, - &model.Credential{}, &model.Property{}, &model.ResourceSharer{}, &model.UserGroup{}, &model.UserGroupMember{}, - &model.LoginLog{}, &model.Num{}, &model.Job{}, &model.JobLog{}, &model.AccessSecurity{}); err != nil { - logrus.WithError(err).Panic("初始化数据库表结构异常") - } - return db -} diff --git a/server/repository/access_security.go b/server/repository/access_security.go index 469675f..84e8a86 100644 --- a/server/repository/access_security.go +++ b/server/repository/access_security.go @@ -2,7 +2,6 @@ package repository import ( "gorm.io/gorm" - "next-terminal/server/global" "next-terminal/server/model" ) @@ -63,19 +62,19 @@ func (r AccessSecurityRepository) Find(pageIndex, pageSize int, ip, rule, order, } func (r AccessSecurityRepository) Create(o *model.AccessSecurity) error { - return global.DB.Create(o).Error + return r.DB.Create(o).Error } func (r AccessSecurityRepository) UpdateById(o *model.AccessSecurity, id string) error { o.ID = id - return global.DB.Updates(o).Error + return r.DB.Updates(o).Error } func (r AccessSecurityRepository) DeleteById(id string) error { - return global.DB.Where("id = ?", id).Delete(model.AccessSecurity{}).Error + return r.DB.Where("id = ?", id).Delete(model.AccessSecurity{}).Error } func (r AccessSecurityRepository) FindById(id string) (o *model.AccessSecurity, err error) { - err = global.DB.Where("id = ?", id).First(&o).Error + err = r.DB.Where("id = ?", id).First(&o).Error return } diff --git a/server/repository/asset.go b/server/repository/asset.go index e0b383c..845b3eb 100644 --- a/server/repository/asset.go +++ b/server/repository/asset.go @@ -169,7 +169,7 @@ func (r AssetRepository) DeleteById(id string) error { return r.DB.Where("id = ?", id).Delete(&model.Asset{}).Error } -func (r AssetRepository) CountAsset() (total int64, err error) { +func (r AssetRepository) Count() (total int64, err error) { err = r.DB.Find(&model.Asset{}).Count(&total).Error return } diff --git a/server/repository/command.go b/server/repository/command.go index a47112c..2dd8b22 100644 --- a/server/repository/command.go +++ b/server/repository/command.go @@ -3,7 +3,6 @@ package repository import ( "gorm.io/gorm" "next-terminal/server/constant" - "next-terminal/server/global" "next-terminal/server/model" ) @@ -68,13 +67,13 @@ func (r CommandRepository) Create(o *model.Command) (err error) { } func (r CommandRepository) FindById(id string) (o model.Command, err error) { - err = global.DB.Where("id = ?", id).First(&o).Error + err = r.DB.Where("id = ?", id).First(&o).Error return } -func (r CommandRepository) UpdateById(o *model.Command, id string) { +func (r CommandRepository) UpdateById(o *model.Command, id string) error { o.ID = id - global.DB.Updates(o) + return r.DB.Updates(o).Error } func (r CommandRepository) DeleteById(id string) error { diff --git a/server/repository/credential.go b/server/repository/credential.go index 25d5915..a5526db 100644 --- a/server/repository/credential.go +++ b/server/repository/credential.go @@ -15,7 +15,7 @@ func NewCredentialRepository(db *gorm.DB) *CredentialRepository { return credentialRepository } -func (r CredentialRepository) FindAllByUser(account model.User) (o []model.CredentialSimpleVo, err error) { +func (r CredentialRepository) FindByUser(account model.User) (o []model.CredentialSimpleVo, err error) { db := r.DB.Table("credentials").Select("DISTINCT credentials.id,credentials.name").Joins("left join resource_sharers on credentials.id = resource_sharers.resource_id") if account.Type == constant.TypeUser { db = db.Where("credentials.owner = ? or resource_sharers.user_id = ?", account.ID, account.ID) diff --git a/server/repository/job.go b/server/repository/job.go index 08086cb..518b3e5 100644 --- a/server/repository/job.go +++ b/server/repository/job.go @@ -2,7 +2,6 @@ package repository import ( "gorm.io/gorm" - "next-terminal/server/global" "next-terminal/server/model" "next-terminal/server/utils" ) @@ -64,19 +63,6 @@ func (r JobRepository) FindByFunc(function string) (o []model.Job, err error) { } func (r JobRepository) Create(o *model.Job) (err error) { - // - //if o.Status == constant.JobStatusRunning { - // j, err := getJob(o) - // if err != nil { - // return err - // } - // jobId, err := global.Cron.AddJob(o.Cron, j) - // if err != nil { - // return err - // } - // o.CronJobId = int(jobId) - //} - return r.DB.Create(o).Error } @@ -104,5 +90,5 @@ func (r JobRepository) DeleteJobById(id string) error { // return err // } //} - return global.DB.Where("id = ?", id).Delete(model.Job{}).Error + return r.DB.Where("id = ?", id).Delete(model.Job{}).Error } diff --git a/server/repository/num.go b/server/repository/num.go index 7309127..9792b89 100644 --- a/server/repository/num.go +++ b/server/repository/num.go @@ -2,7 +2,6 @@ package repository import ( "gorm.io/gorm" - "next-terminal/server/global" "next-terminal/server/model" ) @@ -21,6 +20,6 @@ func (r NumRepository) FindAll() (o []model.Num, err error) { } func (r NumRepository) Create(o *model.Num) (err error) { - err = global.DB.Create(o).Error + err = r.DB.Create(o).Error return } diff --git a/server/repository/property.go b/server/repository/property.go index d8320af..e77382e 100644 --- a/server/repository/property.go +++ b/server/repository/property.go @@ -1,11 +1,7 @@ package repository import ( - "github.com/jordan-wright/email" - "github.com/sirupsen/logrus" "gorm.io/gorm" - "net/smtp" - "next-terminal/server/constant" "next-terminal/server/guacd" "next-terminal/server/model" ) @@ -31,7 +27,7 @@ func (r PropertyRepository) Create(o *model.Property) (err error) { return } -func (r PropertyRepository) UpdatePropertyByName(o *model.Property, name string) error { +func (r PropertyRepository) UpdateByName(o *model.Property, name string) error { o.Name = name return r.DB.Updates(o).Error } @@ -65,26 +61,3 @@ func (r PropertyRepository) GetRecordingPath() (string, error) { } return property.Value, nil } - -func (r PropertyRepository) SendMail(to, subject, text string) { - propertiesMap := r.FindAllMap() - host := propertiesMap[constant.MailHost] - port := propertiesMap[constant.MailPort] - username := propertiesMap[constant.MailUsername] - password := propertiesMap[constant.MailPassword] - - if host == "" || port == "" || username == "" || password == "" { - logrus.Debugf("邮箱信息不完整,跳过发送邮件。") - return - } - - e := email.NewEmail() - e.From = "Next Terminal <" + username + ">" - e.To = []string{to} - e.Subject = subject - e.Text = []byte(text) - err := e.Send(host+":"+port, smtp.PlainAuth("", username, password, host)) - if err != nil { - logrus.Errorf("邮件发送失败: %v", err.Error()) - } -} diff --git a/server/repository/user_group.go b/server/repository/user_group.go index 64323c1..fc6afe3 100644 --- a/server/repository/user_group.go +++ b/server/repository/user_group.go @@ -2,7 +2,6 @@ package repository import ( "gorm.io/gorm" - "next-terminal/server/global" "next-terminal/server/model" "next-terminal/server/utils" ) @@ -56,7 +55,7 @@ func (r UserGroupRepository) Find(pageIndex, pageSize int, name, order, field st } func (r UserGroupRepository) FindById(id string) (o model.UserGroup, err error) { - err = global.DB.Where("id = ?", id).First(&o).Error + err = r.DB.Where("id = ?", id).First(&o).Error return } @@ -66,7 +65,7 @@ func (r UserGroupRepository) FindUserGroupIdsByUserId(userId string) (o []string return } -func (r UserGroupRepository) FindUserGroupMembersByUserGroupId(userGroupId string) (o []string, err error) { +func (r UserGroupRepository) FindMembersById(userGroupId string) (o []string, err error) { err = r.DB.Table("user_group_members").Select("user_id").Where("user_group_id = ?", userGroupId).Find(&o).Error return } @@ -112,9 +111,12 @@ func (r UserGroupRepository) Update(o *model.UserGroup, members []string, id str }) } -func (r UserGroupRepository) DeleteById(id string) { - r.DB.Where("id = ?", id).Delete(&model.UserGroup{}) - r.DB.Where("user_group_id = ?", id).Delete(&model.UserGroupMember{}) +func (r UserGroupRepository) DeleteById(id string) (err error) { + err = r.DB.Where("id = ?", id).Delete(&model.UserGroup{}).Error + if err != nil { + return err + } + return r.DB.Where("user_group_id = ?", id).Delete(&model.UserGroupMember{}).Error } func AddUserGroupMembers(tx *gorm.DB, userIds []string, userGroupId string) error { diff --git a/server/service/job.go b/server/service/job.go index 731f5a9..02827d6 100644 --- a/server/service/job.go +++ b/server/service/job.go @@ -6,7 +6,6 @@ import ( "fmt" "github.com/robfig/cron/v3" "github.com/sirupsen/logrus" - "next-terminal/server/api" "next-terminal/server/constant" "next-terminal/server/global" "next-terminal/server/model" @@ -28,7 +27,7 @@ func NewJobService(jobRepository *repository.JobRepository, jobLogRepository *re return &JobService{jobRepository: jobRepository, jobLogRepository: jobLogRepository, assetRepository: assetRepository, credentialRepository: credentialRepository} } -func (r JobService) ChangeJobStatusById(id, status string) error { +func (r JobService) ChangeStatusById(id, status string) error { job, err := r.jobRepository.FindById(id) if err != nil { return err @@ -259,7 +258,7 @@ func (r JobService) ExecJobById(id string) (err error) { func (r JobService) InitJob() error { jobs, _ := r.jobRepository.FindByFunc(constant.FuncCheckAssetStatusJob) - if jobs == nil || len(jobs) == 0 { + if jobs == nil { job := model.Job{ ID: utils.UUID(), Name: "资产状态检测", @@ -277,7 +276,7 @@ func (r JobService) InitJob() error { } else { for i := range jobs { if jobs[i].Status == constant.JobStatusRunning { - err := r.ChangeJobStatusById(jobs[i].ID, constant.JobStatusRunning) + err := r.ChangeStatusById(jobs[i].ID, constant.JobStatusRunning) if err != nil { return err } @@ -288,37 +287,32 @@ func (r JobService) InitJob() error { return nil } -// TODO 可能存在循环引用 -func (r UserService) ReloadToken() error { - loginLogs, err := r.loginLogRepository.FindAliveLoginLogs() +func (r JobService) Create(o *model.Job) (err error) { + + if o.Status == constant.JobStatusRunning { + j, err := getJob(o, &r) + if err != nil { + return err + } + jobId, err := global.Cron.AddJob(o.Cron, j) + if err != nil { + return err + } + o.CronJobId = int(jobId) + } + + return r.jobRepository.Create(o) +} + +func (r JobService) DeleteJobById(id string) error { + job, err := r.jobRepository.FindById(id) if err != nil { return err } - - for i := range loginLogs { - loginLog := loginLogs[i] - token := loginLog.ID - user, err := r.userRepository.FindById(loginLog.UserId) - if err != nil { - logrus.Debugf("用户「%v」获取失败,忽略", loginLog.UserId) - continue + if job.Status == constant.JobStatusRunning { + if err := r.ChangeStatusById(id, constant.JobStatusNotRunning); err != nil { + return err } - - authorization := api.Authorization{ - Token: token, - Remember: loginLog.Remember, - User: user, - } - - cacheKey := api.BuildCacheKeyByToken(token) - - if authorization.Remember { - // 记住登录有效期两周 - global.Cache.Set(cacheKey, authorization, api.RememberEffectiveTime) - } else { - global.Cache.Set(cacheKey, authorization, api.NotRememberEffectiveTime) - } - logrus.Debugf("重新加载用户「%v」授权Token「%v」到缓存", user.Nickname, token) } - return nil + return r.jobRepository.DeleteJobById(id) } diff --git a/server/service/mail.go b/server/service/mail.go new file mode 100644 index 0000000..b0fc156 --- /dev/null +++ b/server/service/mail.go @@ -0,0 +1,40 @@ +package service + +import ( + "github.com/jordan-wright/email" + "github.com/sirupsen/logrus" + "net/smtp" + "next-terminal/server/constant" + "next-terminal/server/repository" +) + +type MailService struct { + propertyRepository *repository.PropertyRepository +} + +func NewMailService(propertyRepository *repository.PropertyRepository) *MailService { + return &MailService{propertyRepository: propertyRepository} +} + +func (r MailService) SendMail(to, subject, text string) { + propertiesMap := r.propertyRepository.FindAllMap() + host := propertiesMap[constant.MailHost] + port := propertiesMap[constant.MailPort] + username := propertiesMap[constant.MailUsername] + password := propertiesMap[constant.MailPassword] + + if host == "" || port == "" || username == "" || password == "" { + logrus.Debugf("邮箱信息不完整,跳过发送邮件。") + return + } + + e := email.NewEmail() + e.From = "Next Terminal <" + username + ">" + e.To = []string{to} + e.Subject = subject + e.Text = []byte(text) + err := e.Send(host+":"+port, smtp.PlainAuth("", username, password, host)) + if err != nil { + logrus.Errorf("邮件发送失败: %v", err.Error()) + } +} diff --git a/server/service/user.go b/server/service/user.go index 25a4ed1..43b03d9 100644 --- a/server/service/user.go +++ b/server/service/user.go @@ -13,8 +13,8 @@ type UserService struct { loginLogRepository *repository.LoginLogRepository } -func NewUserService(userRepository *repository.UserRepository) *UserService { - return &UserService{userRepository: userRepository} +func NewUserService(userRepository *repository.UserRepository, loginLogRepository *repository.LoginLogRepository) *UserService { + return &UserService{userRepository: userRepository, loginLogRepository: loginLogRepository} } func (r UserService) InitUser() (err error) { diff --git a/web/src/components/asset/Asset.js b/web/src/components/asset/Asset.js index fb1e328..4da5233 100644 --- a/web/src/components/asset/Asset.js +++ b/web/src/components/asset/Asset.js @@ -13,7 +13,6 @@ import { Menu, Modal, notification, - PageHeader, Row, Select, Space, @@ -27,7 +26,7 @@ import qs from "qs"; import AssetModal from "./AssetModal"; import request from "../../common/request"; import {message} from "antd/es"; -import {getHeaders, isEmpty, itemRender} from "../../utils/utils"; +import {getHeaders, isEmpty} from "../../utils/utils"; import dayjs from 'dayjs'; import { DeleteOutlined, @@ -881,7 +880,7 @@ class Asset extends Component {