diff --git a/cmd/server/app/network/controller/agentcontroller/file.go b/cmd/server/app/network/controller/agentcontroller/file.go deleted file mode 100644 index e0bbd755dea8793a9d70d70f2d3e3e257ed8ee24..0000000000000000000000000000000000000000 --- a/cmd/server/app/network/controller/agentcontroller/file.go +++ /dev/null @@ -1,141 +0,0 @@ -/* - * Copyright (c) KylinSoft Co., Ltd. 2024.All rights reserved. - * PilotGo licensed under the Mulan Permissive Software License, Version 2. - * See LICENSE file for more details. - * Author: linjieren - * Date: Thu Jul 25 16:18:53 2024 +0800 - */ -package agentcontroller - -import ( - "net/http" - "strconv" - "strings" - - "gitee.com/openeuler/PilotGo/cmd/server/app/agentmanager" - "gitee.com/openeuler/PilotGo/cmd/server/app/service/auditlog" - batchservice "gitee.com/openeuler/PilotGo/cmd/server/app/service/batch" - userservice "gitee.com/openeuler/PilotGo/cmd/server/app/service/user" - "gitee.com/openeuler/PilotGo/sdk/logger" - "gitee.com/openeuler/PilotGo/sdk/response" - "github.com/gin-gonic/gin" - uuidservice "github.com/google/uuid" -) - -func GetAgentRepo(c *gin.Context) { - uuid := c.Query("uuid") - agent := agentmanager.GetAgent(uuid) - if agent == nil { - response.Fail(c, nil, "获取uuid失败!") - return - } - - repos, err := agent.GetRepoSource() - if err != nil { - response.Fail(c, nil, err.Error()) - return - } - response.Success(c, repos, "获取到repo源") -} - -// TODO: 去除,移至插件 -func ConfigFileBroadcastToAgents(c *gin.Context) { - fd := &struct { - Username string `json:"userName,omitempty"` - - FileBroadcast_BatchId []int `json:"filebroadcast_batches"` - FileBroadcast_Path string `json:"filebroadcast_path"` - FileBroadcast_FileName string `json:"filebroadcast_name"` - FileBroadcast_Text string `json:"filebroadcast_file"` - }{} - if err := c.Bind(fd); err != nil { - response.Fail(c, nil, "parameter error") - return - } - - batchIds := fd.FileBroadcast_BatchId - UUIDs := batchservice.BatchIds2UUIDs(batchIds) - - path := fd.FileBroadcast_Path - filename := fd.FileBroadcast_FileName - text := fd.FileBroadcast_Text - - if len(path) == 0 { - response.Fail(c, nil, "路径为空,请检查配置文件路径") - return - } - if len(filename) == 0 { - response.Fail(c, nil, "文件名为空,请检查配置文件名字") - return - } - if len(text) == 0 { - response.Fail(c, nil, "文件内容为空,请重新检查文件内容") - return - } - - u, err := userservice.GetUserByEmail(fd.Username) - if err != nil { - response.Fail(c, nil, err.Error()) - return - } - log := &auditlog.AuditLog{ - LogUUID: uuidservice.New().String(), - ParentUUID: "", - Module: auditlog.ModuleMachine, - Status: auditlog.StatusOK, - UserID: u.ID, - Action: "配置文件下发", - } - auditlog.Add(log) - - statuscodes := []string{} - for _, uuid := range UUIDs { - log_s := &auditlog.AuditLog{ - LogUUID: uuidservice.New().String(), - ParentUUID: log.LogUUID, - Module: auditlog.ModuleMachine, - Status: auditlog.StatusOK, - UserID: u.ID, - Action: "rpm软件包卸载", - Message: "agentuuid:" + uuid, - } - auditlog.Add(log_s) - - agent := agentmanager.GetAgent(uuid) - if agent == nil { - message := "获取uuid失败" + path + "/" + filename + strconv.Itoa(http.StatusBadRequest) - auditlog.UpdateMessage(log_s, "agentuuid:"+uuid+message) - auditlog.UpdateStatus(log_s, auditlog.StatusFailed) - statuscodes = append(statuscodes, strconv.Itoa(http.StatusBadRequest)) - continue - } - - _, Err, err := agent.UpdateFile(path, filename, text) - if len(Err) != 0 || err != nil { - message := Err + path + "/" + filename + strconv.Itoa(http.StatusBadRequest) - auditlog.UpdateMessage(log_s, "agentuuid:"+uuid+message) - auditlog.UpdateStatus(log_s, auditlog.StatusFailed) - statuscodes = append(statuscodes, strconv.Itoa(http.StatusBadRequest)) - continue - } else { - message := "配置文件下发成功" + path + "/" + filename + strconv.Itoa(http.StatusOK) - auditlog.UpdateMessage(log_s, "agentuuid:"+uuid+message) - statuscodes = append(statuscodes, strconv.Itoa(http.StatusOK)) - } - } - - status := auditlog.BatchActionStatus(statuscodes) - if err := auditlog.UpdateStatus(log, status); err != nil { - logger.Error("failed to update father log status: %s", err.Error()) - } - - switch strings.Split(status, ",")[2] { - case "0.00": - response.Fail(c, nil, "配置文件下发失败") - return - case "1.00": - response.Success(c, nil, "配置文件下发完成") - default: - response.Success(c, nil, "配置文件下发部分完成") - } -} diff --git a/cmd/server/app/network/controller/agentcontroller/repo.go b/cmd/server/app/network/controller/agentcontroller/repo.go new file mode 100644 index 0000000000000000000000000000000000000000..d426965a4ffb8af224159ea77a705a936be7f01c --- /dev/null +++ b/cmd/server/app/network/controller/agentcontroller/repo.go @@ -0,0 +1,30 @@ +/* + * Copyright (c) KylinSoft Co., Ltd. 2024.All rights reserved. + * PilotGo licensed under the Mulan Permissive Software License, Version 2. + * See LICENSE file for more details. + * Author: linjieren + * Date: Thu Jul 25 16:18:53 2024 +0800 + */ +package agentcontroller + +import ( + "gitee.com/openeuler/PilotGo/cmd/server/app/agentmanager" + "gitee.com/openeuler/PilotGo/sdk/response" + "github.com/gin-gonic/gin" +) + +func GetAgentRepo(c *gin.Context) { + uuid := c.Query("uuid") + agent := agentmanager.GetAgent(uuid) + if agent == nil { + response.Fail(c, nil, "获取uuid失败!") + return + } + + repos, err := agent.GetRepoSource() + if err != nil { + response.Fail(c, nil, err.Error()) + return + } + response.Success(c, repos, "获取到repo源") +} diff --git a/cmd/server/app/network/controller/agentcontroller/rpm.go b/cmd/server/app/network/controller/agentcontroller/rpm.go index e78a5e2d652a24f933c372a8cb1f9f0662dbb38a..ccedb132034f57e400fe1d69030ef2b8e0151c79 100644 --- a/cmd/server/app/network/controller/agentcontroller/rpm.go +++ b/cmd/server/app/network/controller/agentcontroller/rpm.go @@ -9,19 +9,15 @@ package agentcontroller import ( "fmt" - "net/http" - "strconv" - "strings" + "time" "gitee.com/openeuler/PilotGo/cmd/server/app/agentmanager" "gitee.com/openeuler/PilotGo/cmd/server/app/network/jwt" "gitee.com/openeuler/PilotGo/cmd/server/app/service/auditlog" "gitee.com/openeuler/PilotGo/pkg/global" "gitee.com/openeuler/PilotGo/pkg/utils" - "gitee.com/openeuler/PilotGo/sdk/logger" "gitee.com/openeuler/PilotGo/sdk/response" "github.com/gin-gonic/gin" - uuidservice "github.com/google/uuid" ) type RPMS struct { @@ -105,87 +101,61 @@ func InstallRpmHandler(c *gin.Context) { response.Fail(c, nil, "user token error:"+err.Error()) return } - log := &auditlog.AuditLog{ - LogUUID: uuidservice.New().String(), - ParentUUID: "", - Module: auditlog.ModuleMachine, - Status: auditlog.StatusOK, - UserID: u.ID, - Action: "rpm软件包安装", - } - auditlog.Add(log) - StatusCodes := make([]string, 0) + logId, _ := auditlog.Add(&auditlog.AuditLog{ + Action: "软件包安装-" + rpm.RPM, + Module: auditlog.RPMInstall, + User: u.Username, + Batches: "", + CreateTime: time.Now().Format("2006-01-02 15:04:05"), + }) + var codeMap = make(map[string]struct{}) for _, uuid := range rpm.UUIDs { agent := agentmanager.GetAgent(uuid) - log_s := &auditlog.AuditLog{ - LogUUID: uuidservice.New().String(), - ParentUUID: log.LogUUID, - Module: auditlog.ModuleMachine, - Status: auditlog.StatusOK, - UserID: u.ID, - Action: "rpm软件包安装", - Message: "agentuuid:" + uuid, - } - auditlog.Add(log_s) + if agent == nil { - message := "获取uuid失败" + rpm.RPM + strconv.Itoa(http.StatusBadRequest) - auditlog.UpdateMessage(log_s, "agentuuid:"+uuid+message) - auditlog.UpdateStatus(log_s, auditlog.StatusFailed) - StatusCodes = append(StatusCodes, strconv.Itoa(http.StatusBadRequest)) continue } + subLogId, _ := auditlog.AddSubLog(&auditlog.SubLog{ + LogId: logId, + ActionObject: "软件包安装:" + agent.IP, + UpdateTime: time.Now().Format("2006-01-02 15:04:05"), + }) info, err := agent.AgentOverview() if err != nil { - auditlog.UpdateMessage(log_s, "agentuuid:"+uuid+err.Error()) - auditlog.UpdateStatus(log_s, auditlog.StatusFailed) - logger.Error("%v", err.Error()) - StatusCodes = append(StatusCodes, strconv.Itoa(http.StatusBadRequest)) + auditlog.UpdateSubLog(subLogId, auditlog.StatusFail, "获取agent主机基础信息失败") + codeMap[uuid] = struct{}{} continue } if info.SysInfo.Platform == "NestOS For Container" { - logger.Error("Install rpm is not supported on NestOS For Container") - message := "Install rpm is not supported on NestOS For Container" + rpm.RPM + strconv.Itoa(http.StatusBadRequest) - auditlog.UpdateMessage(log_s, "agentuuid:"+uuid+message) - StatusCodes = append(StatusCodes, strconv.Itoa(http.StatusBadRequest)) + auditlog.UpdateSubLog(subLogId, auditlog.StatusFail, "Install rpm is not supported on NestOS For Container") + codeMap[uuid] = struct{}{} continue } _, Err, err := agent.InstallRpm(rpm.RPM) if err != nil || len(Err) != 0 { - message := Err + rpm.RPM + strconv.Itoa(http.StatusBadRequest) - auditlog.UpdateMessage(log_s, "agentuuid:"+uuid+message) - auditlog.UpdateStatus(log_s, auditlog.StatusFailed) - StatusCodes = append(StatusCodes, strconv.Itoa(http.StatusBadRequest)) + auditlog.UpdateSubLog(subLogId, auditlog.StatusFail, Err) + codeMap[uuid] = struct{}{} continue } else { - message := rpm.RPM + strconv.Itoa(http.StatusOK) - auditlog.UpdateMessage(log_s, "agentuuid:"+uuid+message) - StatusCodes = append(StatusCodes, strconv.Itoa(http.StatusOK)) + auditlog.UpdateSubLog(subLogId, auditlog.StatusSuccess, rpm.RPM+"安装成功") } } - status := auditlog.BatchActionStatus(StatusCodes) - if err := auditlog.UpdateStatus(log, status); err != nil { - logger.Error("%v", err.Error()) - } global.SendRemindMsg( global.MachineSendMsg, fmt.Sprintf("用户 %s 执行 %s 软件包安装, machines: %v", u.Username, rpm.RPM, rpm.UUIDs), ) - switch strings.Split(status, ",")[2] { - case "0.00": - response.Fail(c, nil, "软件包安装失败") - return - case "1.00": - response.Success(c, nil, "软件包安装成功") - return - default: - response.Success(c, nil, "软件包安装部分成功") + if len(codeMap) == 0 { + auditlog.UpdateLog(logId, auditlog.StatusSuccess) + } else { + auditlog.UpdateLog(logId, auditlog.StatusFail) } + response.Success(c, nil, "软件包安装指令下发成功") } func RemoveRpmHandler(c *gin.Context) { @@ -210,85 +180,54 @@ func RemoveRpmHandler(c *gin.Context) { response.Fail(c, nil, "user token error:"+err.Error()) return } - log := &auditlog.AuditLog{ - LogUUID: uuidservice.New().String(), - ParentUUID: "", - Module: auditlog.ModuleMachine, - Status: auditlog.StatusOK, - UserID: u.ID, - Action: "rpm软件包卸载", - } - auditlog.Add(log) - StatusCodes := make([]string, 0) + logId, _ := auditlog.Add(&auditlog.AuditLog{ + Action: "软件包卸载-" + rpm.RPM, + Module: auditlog.RPMRemove, + User: u.Username, + Batches: "", + CreateTime: time.Now().Format("2006-01-02 15:04:05"), + }) + + var codeMap = make(map[string]struct{}) for _, uuid := range rpm.UUIDs { agent := agentmanager.GetAgent(uuid) - log_s := &auditlog.AuditLog{ - LogUUID: uuidservice.New().String(), - ParentUUID: log.LogUUID, - Module: auditlog.ModuleMachine, - Status: auditlog.StatusOK, - UserID: u.ID, - Action: "rpm软件包卸载", - Message: "agentuuid:" + uuid, - } - auditlog.Add(log_s) if agent == nil { - message := "获取uuid失败" + rpm.RPM + strconv.Itoa(http.StatusBadRequest) - auditlog.UpdateMessage(log_s, "agentuuid:"+uuid+message) - auditlog.UpdateStatus(log_s, auditlog.StatusFailed) - StatusCodes = append(StatusCodes, strconv.Itoa(http.StatusBadRequest)) continue } + subLogId, _ := auditlog.AddSubLog(&auditlog.SubLog{ + LogId: logId, + ActionObject: "软件包卸载:" + agent.IP, + UpdateTime: time.Now().Format("2006-01-02 15:04:05"), + }) info, err := agent.AgentOverview() if err != nil { - auditlog.UpdateMessage(log_s, "agentuuid:"+uuid+err.Error()) - auditlog.UpdateStatus(log_s, auditlog.StatusFailed) - logger.Error("%v", err.Error()) - StatusCodes = append(StatusCodes, strconv.Itoa(http.StatusBadRequest)) + auditlog.UpdateSubLog(subLogId, auditlog.StatusFail, "获取agent主机基础信息失败") + codeMap[uuid] = struct{}{} continue } if info.SysInfo.Platform == "NestOS For Container" { - logger.Error("Remove rpm is not supported on NestOS For Container") - message := "Remove rpm is not supported on NestOS For Container" + rpm.RPM + strconv.Itoa(http.StatusBadRequest) - auditlog.UpdateMessage(log_s, "agentuuid:"+uuid+message) - StatusCodes = append(StatusCodes, strconv.Itoa(http.StatusBadRequest)) + auditlog.UpdateSubLog(subLogId, auditlog.StatusFail, "Install rpm is not supported on NestOS For Container") + codeMap[uuid] = struct{}{} continue } _, Err, err := agent.RemoveRpm(rpm.RPM) if len(Err) != 0 || err != nil { - message := Err + rpm.RPM + strconv.Itoa(http.StatusBadRequest) - auditlog.UpdateMessage(log_s, "agentuuid:"+uuid+message) - auditlog.UpdateStatus(log_s, auditlog.StatusFailed) - StatusCodes = append(StatusCodes, strconv.Itoa(http.StatusBadRequest)) + auditlog.UpdateSubLog(subLogId, auditlog.StatusFail, Err) + codeMap[uuid] = struct{}{} continue } else { - message := rpm.RPM + strconv.Itoa(http.StatusOK) - auditlog.UpdateMessage(log_s, "agentuuid:"+uuid+message) - StatusCodes = append(StatusCodes, strconv.Itoa(http.StatusOK)) + auditlog.UpdateSubLog(subLogId, auditlog.StatusSuccess, rpm.RPM+"卸载成功") } } - status := auditlog.BatchActionStatus(StatusCodes) - if err := auditlog.UpdateStatus(log, status); err != nil { - logger.Error("%v", err.Error()) - } - - global.SendRemindMsg( - global.MachineSendMsg, - fmt.Sprintf("用户 %s 执行 %s 软件包卸载, machines: %v", u.Username, rpm.RPM, rpm.UUIDs), - ) - - switch strings.Split(status, ",")[2] { - case "0.00": - response.Fail(c, nil, "软件包卸载失败") - return - case "1.00": - response.Success(c, nil, "软件包卸载成功") - default: - response.Success(c, nil, "软件包卸载部分成功") + if len(codeMap) == 0 { + auditlog.UpdateLog(logId, auditlog.StatusSuccess) + } else { + auditlog.UpdateLog(logId, auditlog.StatusFail) } + response.Success(c, nil, "软件包卸载指令下发成功") } diff --git a/cmd/server/app/network/controller/agentcontroller/service.go b/cmd/server/app/network/controller/agentcontroller/service.go index e0eb2df4f2034de5da5503d7f71292a6be63ffaa..1315d7a9d54e9109f3ad58d934f6758cd5ef9f7e 100644 --- a/cmd/server/app/network/controller/agentcontroller/service.go +++ b/cmd/server/app/network/controller/agentcontroller/service.go @@ -9,11 +9,8 @@ package agentcontroller import ( "gitee.com/openeuler/PilotGo/cmd/server/app/agentmanager" - "gitee.com/openeuler/PilotGo/cmd/server/app/network/jwt" - "gitee.com/openeuler/PilotGo/cmd/server/app/service/auditlog" "gitee.com/openeuler/PilotGo/sdk/response" "github.com/gin-gonic/gin" - uuidservice "github.com/google/uuid" ) type AgentService struct { @@ -63,33 +60,14 @@ func ServiceStartHandler(c *gin.Context) { return } - u, err := jwt.ParseUser(c) - if err != nil { - response.Fail(c, nil, "user token error:"+err.Error()) - return - } - log := &auditlog.AuditLog{ - LogUUID: uuidservice.New().String(), - ParentUUID: "", - Module: auditlog.ModuleMachine, - Status: auditlog.StatusOK, - UserID: u.ID, - Action: "ServiceStart", - } - auditlog.Add(log) - agent := agentmanager.GetAgent(agentservice.UUID) if agent == nil { - auditlog.UpdateMessage(log, "agentuuid:"+agentservice.UUID+"获取uuid失败") - auditlog.UpdateStatus(log, auditlog.StatusFailed) response.Fail(c, nil, "获取uuid失败") return } service_start, Err, err := agent.ServiceStart(agentservice.Service) if len(Err) != 0 || err != nil { - auditlog.UpdateMessage(log, "agentuuid:"+agentservice.UUID+err.Error()) - auditlog.UpdateStatus(log, auditlog.StatusFailed) response.Fail(c, gin.H{"error": Err}, "Failed!") return } @@ -103,33 +81,15 @@ func ServiceStopHandler(c *gin.Context) { return } - u, err := jwt.ParseUser(c) - if err != nil { - response.Fail(c, nil, "user token error:"+err.Error()) - return - } - log := &auditlog.AuditLog{ - LogUUID: uuidservice.New().String(), - ParentUUID: "", - Module: auditlog.ModuleMachine, - Status: auditlog.StatusOK, - UserID: u.ID, - Action: "ServiceStop", - } - auditlog.Add(log) - agent := agentmanager.GetAgent(agentservice.UUID) if agent == nil { - auditlog.UpdateMessage(log, "agentuuid:"+agentservice.UUID+"获取uuid失败") - auditlog.UpdateStatus(log, auditlog.StatusFailed) response.Fail(c, nil, "获取uuid失败") return } service_stop, Err, err := agent.ServiceStop(agentservice.Service) if len(Err) != 0 || err != nil { - auditlog.UpdateMessage(log, "agentuuid:"+agentservice.UUID+err.Error()) - auditlog.UpdateStatus(log, auditlog.StatusFailed) + response.Fail(c, nil, "服务停止失败:%v"+Err) return } response.Success(c, gin.H{"service_stop": service_stop}, "Success") @@ -142,33 +102,14 @@ func ServiceRestartHandler(c *gin.Context) { return } - u, err := jwt.ParseUser(c) - if err != nil { - response.Fail(c, nil, "user token error:"+err.Error()) - return - } - log := &auditlog.AuditLog{ - LogUUID: uuidservice.New().String(), - ParentUUID: "", - Module: auditlog.ModuleMachine, - Status: auditlog.StatusOK, - UserID: u.ID, - Action: "ServiceRestart", - } - auditlog.Add(log) - agent := agentmanager.GetAgent(agentservice.UUID) if agent == nil { - auditlog.UpdateMessage(log, "agentuuid:"+agentservice.UUID+"获取uuid失败") - auditlog.UpdateStatus(log, auditlog.StatusFailed) response.Fail(c, nil, "获取uuid失败") return } service_restart, Err, err := agent.ServiceRestart(agentservice.Service) if len(Err) != 0 || err != nil { - auditlog.UpdateMessage(log, "agentuuid:"+agentservice.UUID+err.Error()) - auditlog.UpdateStatus(log, auditlog.StatusFailed) response.Fail(c, gin.H{"error": Err}, "Failed!") return } diff --git a/cmd/server/app/network/controller/agentcontroller/sysctl.go b/cmd/server/app/network/controller/agentcontroller/sysctl.go index 45fe4c924de02a8ace2b4e2d5381d7ff312edf0a..ed01be06b7580d0cf23977b3a9de7a53056aa2a6 100644 --- a/cmd/server/app/network/controller/agentcontroller/sysctl.go +++ b/cmd/server/app/network/controller/agentcontroller/sysctl.go @@ -9,11 +9,8 @@ package agentcontroller import ( "gitee.com/openeuler/PilotGo/cmd/server/app/agentmanager" - "gitee.com/openeuler/PilotGo/cmd/server/app/network/jwt" - "gitee.com/openeuler/PilotGo/cmd/server/app/service/auditlog" "gitee.com/openeuler/PilotGo/sdk/response" "github.com/gin-gonic/gin" - uuidservice "github.com/google/uuid" ) func SysInfoHandler(c *gin.Context) { @@ -36,36 +33,15 @@ func SysInfoHandler(c *gin.Context) { func SysctlChangeHandler(c *gin.Context) { uuid := c.Query("uuid") args := c.Query("args") - //username := c.Query("userName") - //userDeptName := c.Query("userDept") - - u, err := jwt.ParseUser(c) - if err != nil { - response.Fail(c, nil, "user token error:"+err.Error()) - return - } - log := &auditlog.AuditLog{ - LogUUID: uuidservice.New().String(), - Module: auditlog.ModuleMachine, - Status: auditlog.StatusOK, - UserID: u.ID, - Action: "SysctlChange", - Message: "agentuuid:" + uuid, - } - auditlog.Add(log) agent := agentmanager.GetAgent(uuid) if agent == nil { - auditlog.UpdateMessage(log, "agentuuid:"+uuid+"获取uuid失败") - auditlog.UpdateStatus(log, auditlog.StatusFailed) response.Fail(c, nil, "获取uuid失败") return } sysctl_change, err := agent.ChangeSysctl(args) if err != nil { - auditlog.UpdateMessage(log, "agentuuid:"+uuid+"修改内核运行时参数失败") - auditlog.UpdateStatus(log, auditlog.StatusFailed) response.Fail(c, gin.H{"error": err}, "修改内核运行时参数失败!") return } diff --git a/cmd/server/app/network/controller/auditloghandler.go b/cmd/server/app/network/controller/auditloghandler.go index 002229d4e7d7437f1ae641a631ef60a62a672e2b..861d9064bb0e8af059e11b3cf06b301371f1e91a 100644 --- a/cmd/server/app/network/controller/auditloghandler.go +++ b/cmd/server/app/network/controller/auditloghandler.go @@ -30,47 +30,3 @@ func AuditLogAllHandler(c *gin.Context) { } response.DataPagination(c, data, int(total), query) } - -// 根据模块名字查询日志 -func ModuleLogHandler(c *gin.Context) { - var moduleName string - if c.Bind(&moduleName) != nil { - response.Fail(c, nil, "parameter error") - return - } - loglist, err := auditlog.GetByModule(moduleName) - if err != nil { - response.Fail(c, gin.H{"status": false}, err.Error()) - return - } - response.Success(c, loglist, "模块审计日志查询成功!") -} - -// 查询所有父日志为空的日志 -func LogAllHandler(c *gin.Context) { - query := &response.PaginationQ{} - err := c.ShouldBindQuery(query) - if err != nil { - response.Fail(c, gin.H{"status": false}, err.Error()) - return - } - - num := query.PageSize * (query.Page - 1) - total, data, err := auditlog.GetParentLog(num, query.PageSize) - if err != nil { - response.Fail(c, gin.H{"status": false}, err.Error()) - return - } - response.DataPagination(c, data, int(total), query) -} - -// 查询其子日志 -func GetAuditLogByIdHandler(c *gin.Context) { - parent_uuid := c.Query("uuid") - data, err := auditlog.GetAuditLogById(parent_uuid) - if err != nil { - response.Fail(c, nil, err.Error()) - return - } - response.Success(c, data, "审计子日志查询成功!") -} diff --git a/cmd/server/app/network/controller/batch.go b/cmd/server/app/network/controller/batch.go index bf2dafa1d34ae6b8683126b46a8bd7d06d8e4ff3..e4ab172a64cdbae8980711916e62d5a110a28285 100644 --- a/cmd/server/app/network/controller/batch.go +++ b/cmd/server/app/network/controller/batch.go @@ -10,6 +10,8 @@ package controller import ( "fmt" "strconv" + "strings" + "time" "gitee.com/openeuler/PilotGo/cmd/server/app/network/jwt" "gitee.com/openeuler/PilotGo/cmd/server/app/service/auditlog" @@ -19,7 +21,6 @@ import ( "gitee.com/openeuler/PilotGo/sdk/common" "gitee.com/openeuler/PilotGo/sdk/response" "github.com/gin-gonic/gin" - "github.com/google/uuid" ) // 添加批次 @@ -35,19 +36,24 @@ func CreateBatchHandler(c *gin.Context) { response.Fail(c, nil, "user token error:"+err.Error()) return } - log := &auditlog.AuditLog{ - LogUUID: uuid.New().String(), - ParentUUID: "", - Module: auditlog.ModuleBatch, - Status: auditlog.StatusOK, - UserID: u.ID, - Action: "创建批次", - } - auditlog.Add(log) - params.Manager = u.Email + logId, _ := auditlog.Add(&auditlog.AuditLog{ + Action: "批次创建", + Module: auditlog.BatchCreate, + User: u.Username, + Batches: "", + CreateTime: time.Now().Format("2006-01-02 15:04:05"), + }) + subLogId, _ := auditlog.AddSubLog(&auditlog.SubLog{ + LogId: logId, + ActionObject: "批次创建:" + params.Name, + UpdateTime: time.Now().Format("2006-01-02 15:04:05"), + }) + + params.Manager = u.Email if err := batch.CreateBatch(params); err != nil { - auditlog.UpdateStatus(log, auditlog.StatusFailed) + auditlog.UpdateLog(logId, auditlog.StatusFail) + auditlog.UpdateSubLog(subLogId, auditlog.StatusFail, "创建批次失败:"+err.Error()) response.Fail(c, nil, err.Error()) return } @@ -56,6 +62,8 @@ func CreateBatchHandler(c *gin.Context) { global.ServerSendMsg, fmt.Sprintf("用户 %s 创建批次 %s", u.Username, params.Name), ) + auditlog.UpdateLog(logId, auditlog.StatusSuccess) + auditlog.UpdateSubLog(subLogId, auditlog.StatusSuccess, "操作成功") response.Success(c, nil, "批次入库成功") } @@ -107,7 +115,8 @@ func BatchInfoHandler(c *gin.Context) { // 删除批次 func DeleteBatchHandler(c *gin.Context) { batchdel := struct { - BatchID []int `json:"BatchID"` + BatchID []int `json:"BatchID"` + Batches []string `json:"Batches"` }{} if err := c.Bind(&batchdel); err != nil { response.Fail(c, nil, "parameter error") @@ -123,18 +132,23 @@ func DeleteBatchHandler(c *gin.Context) { response.Fail(c, nil, "user token error:"+err.Error()) return } - log := &auditlog.AuditLog{ - LogUUID: uuid.New().String(), - ParentUUID: "", - Module: auditlog.ModuleBatch, - Status: auditlog.StatusOK, - UserID: u.ID, - Action: "删除批次", - } - auditlog.Add(log) + + logId, _ := auditlog.Add(&auditlog.AuditLog{ + Action: "批次删除", + Module: auditlog.BatchDelete, + User: u.Username, + Batches: "", + CreateTime: time.Now().Format("2006-01-02 15:04:05"), + }) + subLogId, _ := auditlog.AddSubLog(&auditlog.SubLog{ + LogId: logId, + ActionObject: "批次删除:" + strings.Join(batchdel.Batches, ","), + UpdateTime: time.Now().Format("2006-01-02 15:04:05"), + }) if err := batch.DeleteBatch(batchdel.BatchID); err != nil { - auditlog.UpdateStatus(log, auditlog.StatusFailed) + auditlog.UpdateLog(logId, auditlog.StatusFail) + auditlog.UpdateSubLog(subLogId, auditlog.StatusFail, "删除批次失败:"+err.Error()) response.Fail(c, gin.H{"status": false}, err.Error()) return } @@ -143,6 +157,8 @@ func DeleteBatchHandler(c *gin.Context) { global.ServerSendMsg, fmt.Sprintf("用户 %s 删除批次 %v", u.Username, batchdel.BatchID), ) + auditlog.UpdateLog(logId, auditlog.StatusSuccess) + auditlog.UpdateSubLog(subLogId, auditlog.StatusSuccess, "操作成功") response.Success(c, nil, "批次删除成功") } @@ -164,19 +180,24 @@ func UpdateBatchHandler(c *gin.Context) { response.Fail(c, nil, "user token error:"+err.Error()) return } - log := &auditlog.AuditLog{ - LogUUID: uuid.New().String(), - ParentUUID: "", - Module: auditlog.ModuleBatch, - Status: auditlog.StatusOK, - UserID: u.ID, - Action: "编辑批次", - } - auditlog.Add(log) + + logId, _ := auditlog.Add(&auditlog.AuditLog{ + Action: "批次编辑", + Module: auditlog.BatchEdit, + User: u.Username, + Batches: "", + CreateTime: time.Now().Format("2006-01-02 15:04:05"), + }) + subLogId, _ := auditlog.AddSubLog(&auditlog.SubLog{ + LogId: logId, + ActionObject: "批次编辑:" + batchinfo.BatchName, + UpdateTime: time.Now().Format("2006-01-02 15:04:05"), + }) err = batch.UpdateBatch(batchinfo.BatchId, batchinfo.BatchName, batchinfo.Description) if err != nil { - auditlog.UpdateStatus(log, auditlog.StatusFailed) + auditlog.UpdateLog(logId, auditlog.StatusFail) + auditlog.UpdateSubLog(subLogId, auditlog.StatusFail, "批次编辑失败:"+err.Error()) response.Fail(c, gin.H{"status": false}, "update batch failed: "+err.Error()) return } @@ -185,6 +206,8 @@ func UpdateBatchHandler(c *gin.Context) { global.ServerSendMsg, fmt.Sprintf("用户 %s 更新批次 %s", u.Username, batchinfo.BatchName), ) + auditlog.UpdateLog(logId, auditlog.StatusSuccess) + auditlog.UpdateSubLog(subLogId, auditlog.StatusSuccess, "操作成功") response.Success(c, nil, "批次修改成功") } @@ -214,7 +237,7 @@ func BatchMachineInfoHandler(c *gin.Context) { response.DataPagination(c, data, int(total), p) } -// 一次性获取素有批次,供下拉列表选择 +// 一次性获取所有批次,供下拉列表选择 func SelectBatchHandler(c *gin.Context) { batch, err := batch.SelectBatch() if err != nil { diff --git a/cmd/server/app/network/controller/depart.go b/cmd/server/app/network/controller/depart.go index d01fa250795751b3972d55a7f58dbad97b00dbb3..e01d6fc9802256e42d22da5b2960c89d588dc7c4 100644 --- a/cmd/server/app/network/controller/depart.go +++ b/cmd/server/app/network/controller/depart.go @@ -9,6 +9,7 @@ package controller import ( "strconv" + "time" "gitee.com/openeuler/PilotGo/cmd/server/app/network/jwt" "gitee.com/openeuler/PilotGo/cmd/server/app/service/auditlog" @@ -16,7 +17,6 @@ import ( "gitee.com/openeuler/PilotGo/pkg/utils/message/net" "gitee.com/openeuler/PilotGo/sdk/response" "github.com/gin-gonic/gin" - "github.com/google/uuid" ) type NewDepart struct { @@ -87,22 +87,30 @@ func AddDepartHandler(c *gin.Context) { response.Fail(c, nil, "user token error:"+err.Error()) return } - log := &auditlog.AuditLog{ - LogUUID: uuid.New().String(), - ParentUUID: "", - Module: auditlog.ModuleDepart, - Status: auditlog.StatusOK, - UserID: u.ID, - Action: "添加部门信息", - } - auditlog.Add(log) + + logId, _ := auditlog.Add(&auditlog.AuditLog{ + Action: "部门添加", + Module: auditlog.DepartAdd, + User: u.Username, + Batches: "", + CreateTime: time.Now().Format("2006-01-02 15:04:05"), + }) + subLogId, _ := auditlog.AddSubLog(&auditlog.SubLog{ + LogId: logId, + ActionObject: "部门添加:" + newDepart.DepartName, + UpdateTime: time.Now().Format("2006-01-02 15:04:05"), + }) err = depart.AddDepart(&newDepart) if err != nil { - auditlog.UpdateStatus(log, auditlog.StatusFailed) + auditlog.UpdateLog(logId, auditlog.StatusFail) + auditlog.UpdateSubLog(subLogId, auditlog.StatusFail, "部门添加失败:"+err.Error()) response.Fail(c, nil, err.Error()) return } + auditlog.UpdateLog(logId, auditlog.StatusSuccess) + auditlog.UpdateSubLog(subLogId, auditlog.StatusSuccess, "操作成功") + response.Success(c, nil, "部门信息入库成功") } @@ -119,22 +127,29 @@ func DeleteDepartDataHandler(c *gin.Context) { response.Fail(c, nil, "user token error:"+err.Error()) return } - log := &auditlog.AuditLog{ - LogUUID: uuid.New().String(), - ParentUUID: "", - Module: auditlog.ModuleDepart, - Status: auditlog.StatusOK, - UserID: u.ID, - Action: "删除部门信息", - } - auditlog.Add(log) + + logId, _ := auditlog.Add(&auditlog.AuditLog{ + Action: "部门删除", + Module: auditlog.DepartDelete, + User: u.Username, + Batches: "", + CreateTime: time.Now().Format("2006-01-02 15:04:05"), + }) + subLogId, _ := auditlog.AddSubLog(&auditlog.SubLog{ + LogId: logId, + ActionObject: "部门删除:" + DelDept.DepartName, + UpdateTime: time.Now().Format("2006-01-02 15:04:05"), + }) err = depart.DeleteDepart(&DelDept) if err != nil { - auditlog.UpdateStatus(log, auditlog.StatusFailed) + auditlog.UpdateLog(logId, auditlog.StatusFail) + auditlog.UpdateSubLog(subLogId, auditlog.StatusFail, "部门删除失败:"+err.Error()) response.Fail(c, nil, err.Error()) return } + auditlog.UpdateLog(logId, auditlog.StatusSuccess) + auditlog.UpdateSubLog(subLogId, auditlog.StatusSuccess, "操作成功") response.Success(c, nil, "部门删除成功") } @@ -151,21 +166,29 @@ func UpdateDepartHandler(c *gin.Context) { response.Fail(c, nil, "user token error:"+err.Error()) return } - log := &auditlog.AuditLog{ - LogUUID: uuid.New().String(), - ParentUUID: "", - Module: auditlog.ModuleDepart, - Status: auditlog.StatusOK, - UserID: u.ID, - Action: "修改部门信息", - } - auditlog.Add(log) + + logId, _ := auditlog.Add(&auditlog.AuditLog{ + Action: "修改部门名称", + Module: auditlog.DepartEdit, + User: u.Username, + Batches: "", + CreateTime: time.Now().Format("2006-01-02 15:04:05"), + }) + subLogId, _ := auditlog.AddSubLog(&auditlog.SubLog{ + LogId: logId, + ActionObject: "修改部门名称" + new.DepartName, + UpdateTime: time.Now().Format("2006-01-02 15:04:05"), + }) err = depart.UpdateDepart(new.DepartID, new.DepartName) if err != nil { - auditlog.UpdateStatus(log, auditlog.StatusFailed) + auditlog.UpdateLog(logId, auditlog.StatusFail) + auditlog.UpdateSubLog(subLogId, auditlog.StatusFail, "部门名称修改失败:"+err.Error()) response.Fail(c, nil, err.Error()) return } + auditlog.UpdateLog(logId, auditlog.StatusSuccess) + auditlog.UpdateSubLog(subLogId, auditlog.StatusSuccess, "操作成功") + response.Success(c, nil, "部门更新成功") } diff --git a/cmd/server/app/network/controller/plugin.go b/cmd/server/app/network/controller/plugin.go index 31f4716605aefdc6cc5ab1fe9079dbcf44b5720a..0aed48d95a825d1420ff445d765992bdc0bcc2c2 100644 --- a/cmd/server/app/network/controller/plugin.go +++ b/cmd/server/app/network/controller/plugin.go @@ -16,15 +16,12 @@ import ( "time" eventSDK "gitee.com/openeuler/PilotGo-plugins/event/sdk" - "gitee.com/openeuler/PilotGo/cmd/server/app/network/jwt" - "gitee.com/openeuler/PilotGo/cmd/server/app/service/auditlog" "gitee.com/openeuler/PilotGo/cmd/server/app/service/plugin" commonSDK "gitee.com/openeuler/PilotGo/sdk/common" "gitee.com/openeuler/PilotGo/sdk/logger" "gitee.com/openeuler/PilotGo/sdk/response" "gitee.com/openeuler/PilotGo/sdk/utils/httputils" "github.com/gin-gonic/gin" - uuidservice "github.com/google/uuid" ) // 查询插件清单 @@ -65,24 +62,8 @@ func AddPluginHandler(c *gin.Context) { return } - u, err := jwt.ParseUser(c) - if err != nil { - response.Fail(c, nil, "user token error:"+err.Error()) - return - } - log := &auditlog.AuditLog{ - LogUUID: uuidservice.New().String(), - ParentUUID: "", - Module: auditlog.ModulePlugin, - Status: auditlog.StatusOK, - UserID: u.ID, - Action: "Add Plugin", - } - auditlog.Add(log) - p, err := plugin.AddPlugin(¶m) if err != nil { - auditlog.UpdateStatus(log, auditlog.StatusFailed) response.Fail(c, nil, "add plugin failed:"+err.Error()) return } @@ -126,23 +107,8 @@ func TogglePluginHandler(c *gin.Context) { return } - u, err := jwt.ParseUser(c) - if err != nil { - response.Fail(c, nil, "user token error:"+err.Error()) - return - } - log := &auditlog.AuditLog{ - LogUUID: uuidservice.New().String(), - ParentUUID: "", - Module: auditlog.ModulePlugin, - Status: auditlog.StatusOK, - UserID: u.ID, - Action: "Toggle Plugin", - } - auditlog.Add(log) - logger.Info("toggle plugin:%s to enable %d", param.UUID, param.Enable) - if err = plugin.TogglePlugin(param.UUID, param.Enable); err != nil { + if err := plugin.TogglePlugin(param.UUID, param.Enable); err != nil { response.Fail(c, nil, "toggle plugin error:"+err.Error()) return } @@ -169,21 +135,6 @@ func UnloadPluginHandler(c *gin.Context) { return } - u, err := jwt.ParseUser(c) - if err != nil { - response.Fail(c, nil, "user token error:"+err.Error()) - return - } - log := &auditlog.AuditLog{ - LogUUID: uuidservice.New().String(), - ParentUUID: "", - Module: auditlog.ModulePlugin, - Status: auditlog.StatusOK, - UserID: u.ID, - Action: "Unload Plugin", - } - auditlog.Add(log) - // 发布“插件卸载”事件 msgData := commonSDK.MessageData{ MsgType: eventSDK.MsgPluginRemove, @@ -215,7 +166,6 @@ func UnloadPluginHandler(c *gin.Context) { } func PluginGatewayHandler(c *gin.Context) { - // TODO name := c.Param("plugin_name") p, err := plugin.GetPlugin(name) if err != nil { @@ -223,21 +173,6 @@ func PluginGatewayHandler(c *gin.Context) { return } - u, err := jwt.ParseUser(c) - if err != nil { - response.Fail(c, nil, "user token error:"+err.Error()) - return - } - log := &auditlog.AuditLog{ - LogUUID: uuidservice.New().String(), - ParentUUID: "", - Module: auditlog.ModulePlugin, - Status: auditlog.StatusOK, - UserID: u.ID, - Action: "parse Plugin", - } - auditlog.Add(log) - s := strings.Replace(p.Url, "/plugin/"+name, "", 1) ishttp, err := httputils.ServerIsHttp(s) if err != nil { diff --git a/cmd/server/app/network/controller/pluginWebsocketProxy.go b/cmd/server/app/network/controller/pluginWebsocketProxy.go index 9b4c2e4296ef480c04bde97e429c72d3f671424c..3a442bc11a0ca5e168e77fe4dc267a3fdcc9694a 100644 --- a/cmd/server/app/network/controller/pluginWebsocketProxy.go +++ b/cmd/server/app/network/controller/pluginWebsocketProxy.go @@ -16,13 +16,10 @@ import ( "sync" "time" - "gitee.com/openeuler/PilotGo/cmd/server/app/network/jwt" - "gitee.com/openeuler/PilotGo/cmd/server/app/service/auditlog" "gitee.com/openeuler/PilotGo/cmd/server/app/service/plugin" "gitee.com/openeuler/PilotGo/sdk/logger" "gitee.com/openeuler/PilotGo/sdk/utils/httputils" "github.com/gin-gonic/gin" - uuidservice "github.com/google/uuid" "github.com/gorilla/websocket" ) @@ -89,11 +86,6 @@ func PluginWebsocketGatewayHandler(c *gin.Context) { return } - if err := clientAuthentication(c); err != nil { - c.String(http.StatusUnauthorized, err.Error()) - return - } - target_addr := strings.Replace(strings.Split(p.Url, "//")[1], "/plugin/"+name, "", 1) targetURL_str := fmt.Sprintf("ws://%s/ws/proxy", target_addr) ishttp, err := httputils.ServerIsHttp("http://" + target_addr) @@ -215,20 +207,3 @@ func transferMessages(_srcConn, _dstConn *websocket.Conn, _err_ch chan error, _w } } } - -func clientAuthentication(_ctx *gin.Context) error { - u, err := jwt.ParseUser(_ctx) - if err != nil { - return fmt.Errorf("user token error: %s", err.Error()) - } - log := &auditlog.AuditLog{ - LogUUID: uuidservice.New().String(), - ParentUUID: "", - Module: auditlog.ModulePlugin, - Status: auditlog.StatusOK, - UserID: u.ID, - Action: "parse Plugin", - } - auditlog.Add(log) - return nil -} diff --git a/cmd/server/app/network/controller/pluginapi/tag.go b/cmd/server/app/network/controller/pluginapi/tag.go index efec840e2ce7915f18edb7cca8e7d2d49887bf17..5b5ba1c3e7d957ff03c84a9733c7b65109328361 100644 --- a/cmd/server/app/network/controller/pluginapi/tag.go +++ b/cmd/server/app/network/controller/pluginapi/tag.go @@ -8,12 +8,9 @@ package pluginapi import ( - "gitee.com/openeuler/PilotGo/cmd/server/app/network/jwt" - "gitee.com/openeuler/PilotGo/cmd/server/app/service/auditlog" "gitee.com/openeuler/PilotGo/cmd/server/app/service/tag" "gitee.com/openeuler/PilotGo/sdk/response" "github.com/gin-gonic/gin" - "github.com/google/uuid" ) // 插件返回tag数据 @@ -25,26 +22,9 @@ func GetTagHandler(c *gin.Context) { response.Fail(c, gin.H{"status": false}, err.Error()) return } - - u, err := jwt.ParseUser(c) - if err != nil { - response.Fail(c, nil, "user token error:"+err.Error()) - return - } - log := &auditlog.AuditLog{ - LogUUID: uuid.New().String(), - ParentUUID: "", - Module: auditlog.ModulePlugin, - Status: auditlog.StatusOK, - UserID: u.ID, - Action: "publish tags", - } - auditlog.Add(log) - //TODO:获取到了tag数据开始使用 + //获取到机器标签 data, err := tag.RequestTag(uuidTags.UUIDS) if err != nil { - auditlog.UpdateMessage(log, "agentuuid:"+err.Error()) - auditlog.UpdateStatus(log, auditlog.StatusFailed) response.Fail(c, nil, "user token error:"+err.Error()) return } diff --git a/cmd/server/app/network/controller/role.go b/cmd/server/app/network/controller/role.go index 7fa89c1257e27912a2c81126485a2d2a37c65514..e9096ba9954d6be4c38a95e793e48799a52796f4 100644 --- a/cmd/server/app/network/controller/role.go +++ b/cmd/server/app/network/controller/role.go @@ -8,13 +8,14 @@ package controller import ( + "time" + "gitee.com/openeuler/PilotGo/cmd/server/app/network/jwt" "gitee.com/openeuler/PilotGo/cmd/server/app/service/auditlog" "gitee.com/openeuler/PilotGo/cmd/server/app/service/plugin" roleservice "gitee.com/openeuler/PilotGo/cmd/server/app/service/role" "gitee.com/openeuler/PilotGo/sdk/response" "github.com/gin-gonic/gin" - "github.com/google/uuid" ) // 获取所有角色 @@ -56,29 +57,13 @@ func AddRoleHandler(c *gin.Context) { return } - u, err := jwt.ParseUser(c) - if err != nil { - response.Fail(c, nil, "user token error:"+err.Error()) - return - } - log := &auditlog.AuditLog{ - LogUUID: uuid.New().String(), - ParentUUID: "", - Module: auditlog.ModuleRole, - Status: auditlog.StatusOK, - UserID: u.ID, - Action: "添加角色", - } - auditlog.Add(log) - userRole := &roleservice.Role{ Name: params.Role, Description: params.Description, } - err = roleservice.AddRole(userRole) + err := roleservice.AddRole(userRole) if err != nil { - auditlog.UpdateStatus(log, auditlog.StatusFailed) response.Fail(c, nil, err.Error()) return } @@ -95,24 +80,8 @@ func DeleteRoleHandler(c *gin.Context) { return } - u, err := jwt.ParseUser(c) - if err != nil { - response.Fail(c, nil, "user token error:"+err.Error()) - return - } - log := &auditlog.AuditLog{ - LogUUID: uuid.New().String(), - ParentUUID: "", - Module: auditlog.ModuleRole, - Status: auditlog.StatusOK, - UserID: u.ID, - Action: "删除角色", - } - auditlog.Add(log) - - err = roleservice.DeleteRole(params.RoleId) + err := roleservice.DeleteRole(params.RoleId) if err != nil { - auditlog.UpdateStatus(log, auditlog.StatusFailed) response.Fail(c, nil, "有用户绑定此角色,不可删除") return } @@ -130,24 +99,8 @@ func UpdateRoleInfoHandler(c *gin.Context) { return } - u, err := jwt.ParseUser(c) - if err != nil { - response.Fail(c, nil, "user token error:"+err.Error()) - return - } - log := &auditlog.AuditLog{ - LogUUID: uuid.New().String(), - ParentUUID: "", - Module: auditlog.ModuleRole, - Status: auditlog.StatusOK, - UserID: u.ID, - Action: "修改角色信息", - } - auditlog.Add(log) - - err = roleservice.UpdateRoleInfo(params.Role, params.Description) + err := roleservice.UpdateRoleInfo(params.Role, params.Description) if err != nil { - auditlog.UpdateStatus(log, auditlog.StatusFailed) response.Fail(c, nil, err.Error()) return } @@ -172,21 +125,28 @@ func RolePermissionChangeHandler(c *gin.Context) { response.Fail(c, nil, "user token error:"+err.Error()) return } - log := &auditlog.AuditLog{ - LogUUID: uuid.New().String(), - ParentUUID: "", - Module: auditlog.ModuleRole, - Status: auditlog.StatusOK, - UserID: u.ID, - Action: "修改角色权限", - } - auditlog.Add(log) + + logId, _ := auditlog.Add(&auditlog.AuditLog{ + Action: "角色权限变更", + Module: auditlog.RoleChange, + User: u.Username, + Batches: "", + CreateTime: time.Now().Format("2006-01-02 15:04:05"), + }) + subLogId, _ := auditlog.AddSubLog(&auditlog.SubLog{ + LogId: logId, + ActionObject: "角色权限变更:" + params.Role, + UpdateTime: time.Now().Format("2006-01-02 15:04:05"), + }) err = roleservice.UpdateRolePermissions(params.Role, params.Buttons, params.Menus, params.PluginPermissions) if err != nil { - auditlog.UpdateStatus(log, auditlog.StatusFailed) + auditlog.UpdateLog(logId, auditlog.StatusFail) + auditlog.UpdateSubLog(subLogId, auditlog.StatusFail, "角色权限变更失败:"+err.Error()) response.Fail(c, nil, err.Error()) return } + auditlog.UpdateLog(logId, auditlog.StatusSuccess) + auditlog.UpdateSubLog(subLogId, auditlog.StatusSuccess, "操作成功") response.Success(c, nil, "角色权限变更成功") } diff --git a/cmd/server/app/network/controller/script.go b/cmd/server/app/network/controller/script.go index 0b6279b8115fdc3e5d845683615bd4029f646efd..f907bfd2d35f15d8fe501deadeeaa9c73e7c2aad 100644 --- a/cmd/server/app/network/controller/script.go +++ b/cmd/server/app/network/controller/script.go @@ -11,6 +11,7 @@ import ( "fmt" "strconv" "strings" + "time" "gitee.com/openeuler/PilotGo/cmd/server/app/network/jwt" "gitee.com/openeuler/PilotGo/cmd/server/app/service/auditlog" @@ -20,7 +21,6 @@ import ( "gitee.com/openeuler/PilotGo/sdk/logger" "gitee.com/openeuler/PilotGo/sdk/response" "github.com/gin-gonic/gin" - "github.com/google/uuid" ) // 存储脚本文件 @@ -37,31 +37,38 @@ func AddScriptHandler(c *gin.Context) { response.Fail(c, nil, "user token error:"+err.Error()) return } - log := &auditlog.AuditLog{ - LogUUID: uuid.New().String(), - ParentUUID: "", - Module: auditlog.ModuleMachine, - Status: auditlog.StatusOK, - UserID: u.ID, + + logId, _ := auditlog.Add(&auditlog.AuditLog{ Action: "创建脚本", - } - auditlog.Add(log) + Module: auditlog.ScriptAdd, + User: u.Username, + Batches: "", + CreateTime: time.Now().Format("2006-01-02 15:04:05"), + }) + subLogId, _ := auditlog.AddSubLog(&auditlog.SubLog{ + LogId: logId, + ActionObject: "创建脚本:" + script.Name, + UpdateTime: time.Now().Format("2006-01-02 15:04:05"), + }) cmds, err := scriptservice.GetDangerousCommandsInBlackList() if err != nil { - logger.Error("fail to create script(dangerous commands list): %s", err.Error()) - response.Fail(c, nil, "internal error occurred while retrieving dangerous commands") + auditlog.UpdateLog(logId, auditlog.StatusFail) + auditlog.UpdateSubLog(subLogId, auditlog.StatusFail, "创建高危命令脚本失败:"+err.Error()) + response.Fail(c, nil, "创建失败") return } positions, matchedCommands := global.FindDangerousCommandsPos(script.Content, cmds) if len(positions) > 0 { - logger.Error("Matched Commands: %v", matchedCommands) - response.Fail(c, nil, "Dangerous commands detected in script: "+strings.Join(matchedCommands, "\n")) + auditlog.UpdateLog(logId, auditlog.StatusFail) + auditlog.UpdateSubLog(subLogId, auditlog.StatusFail, "脚本中检测到高危命令") + response.Fail(c, nil, "脚本中检测到高危命令: "+strings.Join(matchedCommands, "\n")) return } if err := scriptservice.AddScript(script); err != nil { - logger.Error("fail to create script: %s", err.Error()) + auditlog.UpdateLog(logId, auditlog.StatusFail) + auditlog.UpdateSubLog(subLogId, auditlog.StatusFail, "创建脚本失败:"+err.Error()) response.Fail(c, nil, fmt.Sprintf("脚本文件添加失败: %s", err.Error())) return } @@ -70,6 +77,8 @@ func AddScriptHandler(c *gin.Context) { global.ServerSendMsg, fmt.Sprintf("用户 %s 创建脚本 %s", u.Username, script.Name), ) + auditlog.UpdateLog(logId, auditlog.StatusSuccess) + auditlog.UpdateSubLog(subLogId, auditlog.StatusSuccess, "操作成功") response.Success(c, nil, "成功") } @@ -87,15 +96,6 @@ func UpdateScriptHandler(c *gin.Context) { response.Fail(c, nil, "user token error:"+err.Error()) return } - log := &auditlog.AuditLog{ - LogUUID: uuid.New().String(), - ParentUUID: "", - Module: auditlog.ModuleMachine, - Status: auditlog.StatusOK, - UserID: u.ID, - Action: "更新脚本", - } - auditlog.Add(log) cmds, err := scriptservice.GetDangerousCommandsInBlackList() if err != nil { @@ -140,15 +140,6 @@ func DeleteScriptHandler(c *gin.Context) { response.Fail(c, nil, "user token error:"+err.Error()) return } - log := &auditlog.AuditLog{ - LogUUID: uuid.New().String(), - ParentUUID: "", - Module: auditlog.ModuleMachine, - Status: auditlog.StatusOK, - UserID: u.ID, - Action: "删除脚本", - } - auditlog.Add(log) var script_name string _script, err := scriptservice.GetScriptByID(req_body.ScriptID) @@ -162,7 +153,7 @@ func DeleteScriptHandler(c *gin.Context) { global.MachineSendMsg, fmt.Sprintf("用户 %s 删除脚本 %s %s", u.Username, script_name, req_body.Version), ) - + if err := scriptservice.DeleteScript(req_body.ScriptID, req_body.Version); err != nil { logger.Error("fail to delete script: %s", err.Error()) response.Fail(c, nil, err.Error()) @@ -184,15 +175,6 @@ func RunScriptHandler(c *gin.Context) { response.Fail(c, nil, "user token error:"+err.Error()) return } - log := &auditlog.AuditLog{ - LogUUID: uuid.New().String(), - ParentUUID: "", - Module: auditlog.ModuleMachine, - Status: auditlog.StatusOK, - UserID: u.ID, - Action: "执行脚本", - } - auditlog.Add(log) batch := &common.Batch{} if body.BatchID < 1 && len(body.MachineUUIDs) == 0 { diff --git a/cmd/server/app/network/controller/user.go b/cmd/server/app/network/controller/user.go index 199582a1be09f9183336d643bdeaea773be0f914..6e316fb527422b8452cf00c810e36efe6585a22c 100644 --- a/cmd/server/app/network/controller/user.go +++ b/cmd/server/app/network/controller/user.go @@ -24,10 +24,8 @@ import ( "gitee.com/openeuler/PilotGo/pkg/global" "gitee.com/openeuler/PilotGo/pkg/utils/message/net" commonSDK "gitee.com/openeuler/PilotGo/sdk/common" - "gitee.com/openeuler/PilotGo/sdk/logger" "gitee.com/openeuler/PilotGo/sdk/response" "github.com/gin-gonic/gin" - "github.com/google/uuid" "github.com/tealeg/xlsx" ) @@ -64,25 +62,8 @@ func RegisterHandler(c *gin.Context) { } } - u, err := jwt.ParseUser(c) - if err != nil { - response.Fail(c, nil, "user token error:"+err.Error()) - return - } - - log := &auditlog.AuditLog{ - LogUUID: uuid.New().String(), - ParentUUID: "", - Module: auditlog.ModuleUser, - Status: auditlog.StatusOK, - UserID: u.ID, - Action: "添加用户", - } - auditlog.Add(log) - - err = userservice.Register(user) + err := userservice.Register(user) if err != nil { - auditlog.UpdateStatus(log, auditlog.StatusFailed) response.Fail(c, nil, err.Error()) return } @@ -124,15 +105,6 @@ func LoginHandler(c *gin.Context) { response.Fail(c, nil, err.Error()) return } - log := &auditlog.AuditLog{ - LogUUID: uuid.New().String(), - ParentUUID: "", - Module: auditlog.ModuleUser, - Status: auditlog.StatusOK, - UserID: u.ID, - Action: "用户登录", - } - auditlog.Add(log) // 发布“用户登录”事件 msgData := commonSDK.MessageData{ MsgType: eventSDK.MsgUserLogin, @@ -156,14 +128,12 @@ func LoginHandler(c *gin.Context) { departName, departId, roleId, err := userservice.Login(&user) if err != nil { - auditlog.UpdateStatus(log, auditlog.StatusFailed) response.Fail(c, nil, err.Error()) return } token, err := jwt.GenerateUserToken(*u) if err != nil { - auditlog.UpdateStatus(log, auditlog.StatusFailed) response.Fail(c, nil, err.Error()) return } @@ -183,15 +153,6 @@ func Logout(c *gin.Context) { response.Fail(c, nil, "user token error:"+err.Error()) return } - log := &auditlog.AuditLog{ - LogUUID: uuid.New().String(), - ParentUUID: "", - Module: auditlog.ModuleUser, - Status: auditlog.StatusOK, - UserID: u.ID, - Action: "用户退出", - } - auditlog.Add(log) // 发布“用户退出”事件 msgData := commonSDK.MessageData{ MsgType: eventSDK.MsgUserLogout, @@ -286,24 +247,8 @@ func UpdatePasswordHandler(c *gin.Context) { return } - u, err := jwt.ParseUser(c) - if err != nil { - response.Fail(c, nil, "user token error:"+err.Error()) - return - } - log := &auditlog.AuditLog{ - LogUUID: uuid.New().String(), - ParentUUID: "", - Module: auditlog.ModuleUser, - Status: auditlog.StatusOK, - UserID: u.ID, - Action: "修改密码", - } - auditlog.Add(log) - - err = userservice.UpdatePassword(user.Email, user.Password) + err := userservice.UpdatePassword(user.Email, user.Password) if err != nil { - auditlog.UpdateStatus(log, auditlog.StatusFailed) response.Fail(c, nil, err.Error()) return } @@ -318,24 +263,8 @@ func ResetPasswordHandler(c *gin.Context) { return } - u, err := jwt.ParseUser(c) - if err != nil { - response.Fail(c, nil, "user token error:"+err.Error()) - return - } - log := &auditlog.AuditLog{ - LogUUID: uuid.New().String(), - ParentUUID: "", - Module: auditlog.ModuleUser, - Status: auditlog.StatusOK, - UserID: u.ID, - Action: "重置密码", - } - auditlog.Add(log) - - err = userservice.ResetPassword(user.Email) + err := userservice.ResetPassword(user.Email) if err != nil { - auditlog.UpdateStatus(log, auditlog.StatusFailed) response.Fail(c, nil, err.Error()) return } @@ -353,36 +282,10 @@ func DeleteUserHandler(c *gin.Context) { return } - u, err := jwt.ParseUser(c) - if err != nil { - response.Fail(c, nil, "user token error:"+err.Error()) - return - } - log := &auditlog.AuditLog{ - LogUUID: uuid.New().String(), - ParentUUID: "", - Module: auditlog.ModuleUser, - Status: auditlog.StatusOK, - UserID: u.ID, - Action: "删除用户", - } - auditlog.Add(log) - for _, ps := range fd.Deldatas { - log_s := &auditlog.AuditLog{ - LogUUID: uuid.New().String(), - ParentUUID: log.LogUUID, - Module: auditlog.ModuleUser, - Status: auditlog.StatusOK, - UserID: u.ID, - Action: "删除用户", - Message: "用户:" + strings.Split(ps, "/")[0], - } - auditlog.Add(log_s) err := userservice.DeleteUser(strings.Split(ps, "/")[0]) if err != nil { - auditlog.UpdateStatus(log_s, auditlog.StatusFailed) statuscodes = append(statuscodes, strconv.Itoa(http.StatusBadRequest)) continue } @@ -391,10 +294,6 @@ func DeleteUserHandler(c *gin.Context) { } status := auditlog.BatchActionStatus(statuscodes) - if err := auditlog.UpdateStatus(log, status); err != nil { - logger.Error("%s", err.Error()) - } - switch strings.Split(status, ",")[2] { case "0.00": response.Fail(c, nil, "用户删除失败") @@ -413,24 +312,9 @@ func UpdateUserHandler(c *gin.Context) { response.Fail(c, nil, "parameter error") return } - u, err := jwt.ParseUser(c) - if err != nil { - response.Fail(c, nil, "user token error:"+err.Error()) - return - } - log := &auditlog.AuditLog{ - LogUUID: uuid.New().String(), - ParentUUID: "", - Module: auditlog.ModuleUser, - Status: auditlog.StatusOK, - UserID: u.ID, - Action: "修改用户信息", - } - auditlog.Add(log) - err = userservice.UpdateUser(user) + err := userservice.UpdateUser(user) if err != nil { - auditlog.UpdateStatus(log, auditlog.StatusFailed) response.Fail(c, nil, err.Error()) return } @@ -446,21 +330,6 @@ func ImportUser(c *gin.Context) { } UserExit := make([]string, 0) - u, err := jwt.ParseUser(c) - if err != nil { - response.Fail(c, nil, "user token error:"+err.Error()) - return - } - log := &auditlog.AuditLog{ - LogUUID: uuid.New().String(), - ParentUUID: "", - Module: auditlog.ModuleUser, - Status: auditlog.StatusOK, - UserID: u.ID, - Action: "批量导入用户", - } - auditlog.Add(log) - name := file.Filename c.SaveUploadedFile(file, name) xlFile, err := xlsx.OpenFile(name) @@ -470,9 +339,6 @@ func ImportUser(c *gin.Context) { } UserExit, err = userservice.ReadFile(xlFile, UserExit) if err != nil { - auditlog.UpdateStatus(log, auditlog.StatusFailed) - auditlog.UpdateMessage(log, strings.Join(UserExit, ";")) - println(log) response.Fail(c, gin.H{"UserExit": UserExit}, err.Error()) return } @@ -481,8 +347,6 @@ func ImportUser(c *gin.Context) { response.Success(c, nil, "导入用户信息成功") return } else { - auditlog.UpdateStatus(log, auditlog.StatusFailed) - auditlog.UpdateMessage(log, strings.Join(UserExit, ";")) response.Fail(c, gin.H{"UserExit": UserExit}, "以上用户已经存在") } } diff --git a/cmd/server/app/network/httpserver.go b/cmd/server/app/network/httpserver.go index 75ea0bbf4336b342198dc6ddd226df65094ef278..117ee1bb03994e1a166b2c9d869989859a1e1af1 100644 --- a/cmd/server/app/network/httpserver.go +++ b/cmd/server/app/network/httpserver.go @@ -316,9 +316,7 @@ func registerAPIs(router *gin.Engine) { AuditLog := tokenApi.Group("/log") // 审计日志 { - AuditLog.GET("/log_all", controller.LogAllHandler) - // TODO: 界面未调用该接口 - AuditLog.GET("/log_child", controller.GetAuditLogByIdHandler) + AuditLog.GET("/log_all", controller.AuditLogAllHandler) } plugin := tokenApi.Group("") // 插件管理 diff --git a/cmd/server/app/service/auditlog/auditlog.go b/cmd/server/app/service/auditlog/auditlog.go index f2c8980fbe8fef9dfbdf64de68f5b5da1e065f0c..52ab59454bb9acf23a66906d098e241d1a620005 100644 --- a/cmd/server/app/service/auditlog/auditlog.go +++ b/cmd/server/app/service/auditlog/auditlog.go @@ -17,25 +17,30 @@ import ( // 日志执行操作状态 const ( - StatusOK = "OK" - StatusFailed = "failed" + StatusSuccess = "成功" + StatusFail = "失败" ) // 日志记录归属模块 const ( - ModuleUser = "user" // 登录 注销(父日志没有创建者和部门信息) 添加 删除 修改密码 重置密码 修改用户信息 - ModuleRole = "role" // 角色权限 编辑角色 删除角色 添加角色 - ModulePlugin = "plugin" // null - ModuleBatch = "batch" // 添加批次 删除批次 编辑批次 - ModuleMachine = "machine" // null - ModuleDepart = "depart" - //LogTypeRPM = "软件包安装/卸载" // rpm安装 rpm卸载 - //LogTypeService = "运行服务" // null - //LogTypeSysctl = "配置内核参数" // null - //LogTypeBroadcast = "配置文件下发" // 配置文件下发 + BatchCreate = "系统/创建批次" + BatchDelete = "系统/删除批次" + BatchEdit = "系统/编辑批次" + + DepartAdd = "系统/部门添加" + DepartDelete = "系统/部门删除" + DepartEdit = "系统/部门更名" + + RPMInstall = "系统/软件包安装" + RPMRemove = "系统/软件包卸载" + + RoleChange = "角色管理/权限变更" + + ScriptAdd = "自定义脚本/创建脚本" ) type AuditLog = dao.AuditLog +type SubLog = dao.SubLog // 单机操作成功状态:是否成功,机器数量,成功率 const ( @@ -57,35 +62,24 @@ func BatchActionStatus(StatusCodes []string) (status string) { return } -func Add(log *dao.AuditLog) error { +func Add(log *dao.AuditLog) (int, error) { + return log.Record() +} +func AddSubLog(log *dao.SubLog) (int, error) { return log.Record() } // 修改日志的操作状态 -func UpdateStatus(log *dao.AuditLog, status string) error { - return log.UpdateStatus(status) +func UpdateLog(logId int, status string) error { + return dao.UpdateLogStatus(logId, status) } // 添加message信息 -func UpdateMessage(log *dao.AuditLog, message string) error { - return log.UpdateMessage(message) +func UpdateSubLog(subLogId int, status, message string) error { + return dao.UpdateSubLogMessage(subLogId, status, message) } // 分页查询 func GetAuditLogPaged(offset, size int) (int64, []AuditLog, error) { return dao.GetAuditLogPaged(offset, size) } - -// 查询子日志 -func GetAuditLogById(logUUId string) ([]dao.AuditLog, error) { - return dao.GetAuditLogById(logUUId) -} - -// 查询父日志为空的记录 -func GetParentLog(offset, size int) (int64, []AuditLog, error) { - return dao.GetParentLog(offset, size) -} - -func GetByModule(name string) ([]dao.AuditLog, error) { - return dao.GetAuditLogByModule(name) -} diff --git a/cmd/server/app/service/batch/batch.go b/cmd/server/app/service/batch/batch.go index 7e0fcc171084ff474b87cce1632a15418b3fcfef..6fb25f52c4bde084831e165a3da929798931a89a 100644 --- a/cmd/server/app/service/batch/batch.go +++ b/cmd/server/app/service/batch/batch.go @@ -118,10 +118,10 @@ func GetBatchPaged(offset, size int) (int64, []Batch, error) { // 删除批次 func DeleteBatch(ids []int) error { - for _, value := range ids { - err := dao.DeleteBatch(value) + for _, batchId := range ids { + err := dao.DeleteBatch(batchId) if err != nil { - logger.Error(err.Error()) + logger.Error("%v", err.Error()) return err } } @@ -162,7 +162,7 @@ func GetBatchMachines(offset, size, batchid int) (int64, []dao.MachineNode, erro for _, macId := range machineIdlist { MacInfo, err := dao.MachineInfo(int(macId.MachineNodeID)) if err != nil { - logger.Error(err.Error()) + logger.Error("%v", err.Error()) } machinesInfo = append(machinesInfo, MacInfo) } diff --git a/cmd/server/app/service/depart/depart.go b/cmd/server/app/service/depart/depart.go index f752876fb52f8ec14c945fe97aa2503ee9ee016c..109b609ff0d0d2f15665675a25e60691f6b19754 100644 --- a/cmd/server/app/service/depart/depart.go +++ b/cmd/server/app/service/depart/depart.go @@ -18,7 +18,8 @@ import ( type DepartNode = dao.DepartNode type DeleteDeparts struct { - DepartID int `json:"DepartID"` + DepartID int `json:"DepartID"` + DepartName string `json:"departName"` } type AddDepartNode struct { @@ -268,7 +269,7 @@ func MachineList(DepId int) ([]dao.Res, error) { func ReturnSpecifiedDepart(id int, res *[]int) { temp, err := dao.SubDepartId(id) if err != nil { - logger.Error(err.Error()) + logger.Error("%v", err.Error()) } if len(temp) == 0 { return diff --git a/cmd/server/app/service/internal/dao/auditlogdao.go b/cmd/server/app/service/internal/dao/auditlogdao.go index 46fa7c19c3eef1d803f5e549a68d09fa28ba7614..1f618ddef0bd123150c3224585ebabf997ccf787 100644 --- a/cmd/server/app/service/internal/dao/auditlogdao.go +++ b/cmd/server/app/service/internal/dao/auditlogdao.go @@ -9,69 +9,52 @@ package dao import ( "gitee.com/openeuler/PilotGo/pkg/dbmanager/mysqlmanager" - "gorm.io/gorm" ) type AuditLog struct { - gorm.Model - LogUUID string `gorm:"not null;unique" json:"log_uuid"` - ParentUUID string `gorm:"type:varchar(60)" json:"parent_uuid"` - Module string `gorm:"type:varchar(30);not null" json:"module"` - Status string `gorm:"type:varchar(30);not null" json:"status"` - UserID uint `gorm:"not null" json:"user_id"` - Action string `gorm:"not null" json:"action"` - Message string `gorm:"type:text" json:"message"` - Isempty int + ID int `gorm:"primary_key;AUTO_INCREMENT" json:"id"` + Action string `json:"action"` //执行动作 + Status string `json:"status"` //整个任务的状态 + Module string `json:"module"` //所属模块 + User string `json:"user"` //创建用户 + Batches string `json:"batches"` //处理批次 + CreateTime string `json:"createTime"` //发生时间 + LogChild []SubLog `gorm:"foreignKey:LogId;references:ID" json:"SubLog"` +} + +type SubLog struct { + ID int `gorm:"primary_key;AUTO_INCREMENT" json:"id"` + LogId int `gorm:"index" json:"logId"` + ActionObject string `json:"action"` //执行动作+对象 + UpdateTime string `json:"updateTime"` //执行结果更新时间 + Status string `json:"status"` //执行状态 + Message string `json:"message"` //日志详情 } // 存储日志 -func (p *AuditLog) Record() error { - return mysqlmanager.MySQL().Save(p).Error +func (p *AuditLog) Record() (int, error) { + err := mysqlmanager.MySQL().Save(p).Error + return p.ID, err } -// 修改日志的操作状态 -func (p *AuditLog) UpdateStatus(status string) error { - return mysqlmanager.MySQL().Model(&p).Where("log_uuid=?", p.LogUUID).Update("status", status).Error +func (sl *SubLog) Record() (int, error) { + err := mysqlmanager.MySQL().Save(sl).Error + return sl.ID, err } -func (p *AuditLog) UpdateMessage(message string) error { - return mysqlmanager.MySQL().Model(&p).Where("log_uuid=?", p.LogUUID).Update("message", message).Error +// 修改日志的操作状态 +func UpdateLogStatus(logId int, status string) error { + return mysqlmanager.MySQL().Model(&AuditLog{}).Where("id=?", logId).Update("status", status).Error +} +func UpdateSubLogMessage(subLogId int, status string, message string) error { + return mysqlmanager.MySQL().Model(&SubLog{}).Where("id=?", subLogId). + Updates(SubLog{Status: status, Message: message}).Error } // 分页查询 func GetAuditLogPaged(offset, size int) (int64, []AuditLog, error) { var count int64 var auditlogs []AuditLog - err := mysqlmanager.MySQL().Model(AuditLog{}).Order("id desc").Offset(offset).Limit(size).Find(&auditlogs).Offset(-1).Limit(-1).Count(&count).Error + err := mysqlmanager.MySQL().Model(AuditLog{}).Order("id desc").Preload("LogChild").Offset(offset).Limit(size).Find(&auditlogs).Offset(-1).Limit(-1).Count(&count).Error return count, auditlogs, err } - -// 查询子日志 -func GetAuditLogById(logUUId string) ([]AuditLog, error) { - var list []AuditLog - err := mysqlmanager.MySQL().Order("created_at desc").Where("parent_uuid=?", logUUId).Find(&list).Error - return list, err -} - -// 查询父日志为空的记录 -func GetParentLog(offset, size int) (int64, []AuditLog, error) { - var count int64 - var auditlogs []AuditLog - rows := mysqlmanager.MySQL().Raw("SELECT count(*) FROM audit_log WHERE parent_uuid = ''").Scan(&count) - if rows.Error != nil { - return 0, nil, rows.Error - } - sql := "select id,log_uuid,parent_uuid,module,status,user_id,action,message,exists(select 1 from audit_log t2 where t2.parent_uuid=t1.log_uuid) as isempty from audit_log t1 where t1.parent_uuid='' order by id desc limit ? offset ?;" - rows = mysqlmanager.MySQL().Raw(sql, size, offset).Scan(&auditlogs) - if rows.Error != nil { - return count, nil, rows.Error - } - return count, auditlogs, nil -} - -// 根据模块名字查询日志 -func GetAuditLogByModule(name string) ([]AuditLog, error) { - var Log []AuditLog - err := mysqlmanager.MySQL().Where("module = ?", name).Find(&Log).Error - return Log, err -} diff --git a/cmd/server/app/service/internal/dao/batchmanagerdao.go b/cmd/server/app/service/internal/dao/batchmanagerdao.go index e00ffaf0c01e4abffc5791a2c620453aa16fdeda..ba2e8ef565768a042cc808a6a4891499b4f0d1f6 100644 --- a/cmd/server/app/service/internal/dao/batchmanagerdao.go +++ b/cmd/server/app/service/internal/dao/batchmanagerdao.go @@ -59,9 +59,9 @@ func IsExistID(id int) (bool, error) { return batch.ID != 0, err } -func DeleteBatch(departid int) error { +func DeleteBatch(id int) error { var batch Batch - return mysqlmanager.MySQL().Where("id=?", departid).Delete(&batch).Error + return mysqlmanager.MySQL().Where("id=?", id).Delete(&batch).Error } func UpdateBatch(BatchID int, BatchName string, Descrip string) error { diff --git a/frontend/package-lock.json b/frontend/package-lock.json deleted file mode 100644 index 5b9efc828b13de35c19cc298e83e1d6c2d8a1330..0000000000000000000000000000000000000000 --- a/frontend/package-lock.json +++ /dev/null @@ -1,2328 +0,0 @@ -{ - "name": "frontend", - "version": "0.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "frontend", - "version": "0.0.0", - "dependencies": { - "@micro-zoe/micro-app": "^1.0.0-rc.3", - "@types/js-cookie": "^3.0.6", - "amfe-flexible": "^2.2.1", - "axios": "^1.6.1", - "crypto-js": "^4.1.1", - "echarts": "^5.4.3", - "element-plus": "^2.9.1", - "file-saver": "^2.0.5", - "js-cookie": "^3.0.5", - "pinia": "^2.1.7", - "pinia-plugin-persistedstate": "^3.2.1", - "sass": "^1.69.5", - "vue": "^3.3.4", - "vue-router": "^4.2.5", - "xlsx": "^0.18.5", - "xterm": "^5.1.0", - "xterm-addon-attach": "^0.8.0", - "xterm-addon-fit": "^0.7.0" - }, - "devDependencies": { - "@tsconfig/node18": "^18.2.2", - "@types/node": "^20.9.0", - "@types/postcss-pxtorem": "^6.1.0", - "@vitejs/plugin-vue": "^4.4.0", - "@vue/tsconfig": "^0.4.0", - "npm-run-all2": "^6.1.1", - "postcss-pxtorem": "^6.1.0", - "typescript": "~5.2.0", - "vite": "^4.4.11", - "vue-tsc": "^1.8.19" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmmirror.com/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.23.3", - "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.23.3.tgz", - "integrity": "sha512-uVsWNvlVsIninV2prNz/3lHCb+5CJ+e+IUBfbjToAHODtfGYLfCFuY4AU7TskI+dAKk+njsPiBjq1gKTvZOBaw==", - "license": "MIT", - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@ctrl/tinycolor": { - "version": "3.6.1", - "resolved": "https://registry.npmmirror.com/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz", - "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/@element-plus/icons-vue": { - "version": "2.3.1", - "resolved": "https://registry.npmmirror.com/@element-plus/icons-vue/-/icons-vue-2.3.1.tgz", - "integrity": "sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg==", - "peerDependencies": { - "vue": "^3.2.0" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.18.20.tgz", - "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", - "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.18.20.tgz", - "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", - "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", - "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", - "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", - "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", - "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", - "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", - "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", - "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", - "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", - "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", - "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", - "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", - "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", - "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", - "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", - "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", - "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", - "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", - "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@floating-ui/core": { - "version": "1.6.8", - "resolved": "https://registry.npmmirror.com/@floating-ui/core/-/core-1.6.8.tgz", - "integrity": "sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==", - "dependencies": { - "@floating-ui/utils": "^0.2.8" - } - }, - "node_modules/@floating-ui/dom": { - "version": "1.6.12", - "resolved": "https://registry.npmmirror.com/@floating-ui/dom/-/dom-1.6.12.tgz", - "integrity": "sha512-NP83c0HjokcGVEMeoStg317VD9W7eDlGK7457dMBANbKA6GJZdc7rjujdgqzTaz93jkGgc5P/jeWbaCHnMNc+w==", - "dependencies": { - "@floating-ui/core": "^1.6.0", - "@floating-ui/utils": "^0.2.8" - } - }, - "node_modules/@floating-ui/utils": { - "version": "0.2.8", - "resolved": "https://registry.npmmirror.com/@floating-ui/utils/-/utils-0.2.8.tgz", - "integrity": "sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==" - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "license": "MIT" - }, - "node_modules/@micro-zoe/micro-app": { - "version": "1.0.0-rc.3", - "resolved": "https://registry.npmmirror.com/@micro-zoe/micro-app/-/micro-app-1.0.0-rc.3.tgz", - "integrity": "sha512-f6PBW8XjHESERlfHLd/2yoQRXbMoXK8C5aG8yZZBR5iV07Rkj+T7qBuZqdDnL1MW+zsuWpSgeYsZe9kpK+9e4Q==", - "license": "MIT" - }, - "node_modules/@popperjs/core": { - "name": "@sxzz/popperjs-es", - "version": "2.11.7", - "resolved": "https://registry.npmmirror.com/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz", - "integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" - } - }, - "node_modules/@tsconfig/node18": { - "version": "18.2.2", - "resolved": "https://registry.npmmirror.com/@tsconfig/node18/-/node18-18.2.2.tgz", - "integrity": "sha512-d6McJeGsuoRlwWZmVIeE8CUA27lu6jLjvv1JzqmpsytOYYbVi1tHZEnwCNVOXnj4pyLvneZlFlpXUK+X9wBWyw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/js-cookie": { - "version": "3.0.6", - "resolved": "https://registry.npmmirror.com/@types/js-cookie/-/js-cookie-3.0.6.tgz", - "integrity": "sha512-wkw9yd1kEXOPnvEeEV1Go1MmxtBJL0RR79aOTAApecWFVu7w0NNXNqhcWgvw2YgZDYadliXkl14pa3WXw5jlCQ==", - "license": "MIT" - }, - "node_modules/@types/lodash": { - "version": "4.17.13", - "resolved": "https://registry.npmmirror.com/@types/lodash/-/lodash-4.17.13.tgz", - "integrity": "sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg==" - }, - "node_modules/@types/lodash-es": { - "version": "4.17.12", - "resolved": "https://registry.npmmirror.com/@types/lodash-es/-/lodash-es-4.17.12.tgz", - "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==", - "dependencies": { - "@types/lodash": "*" - } - }, - "node_modules/@types/node": { - "version": "20.9.0", - "resolved": "https://registry.npmmirror.com/@types/node/-/node-20.9.0.tgz", - "integrity": "sha512-nekiGu2NDb1BcVofVcEKMIwzlx4NjHlcjhoxxKBNLtz15Y1z7MYf549DFvkHSId02Ax6kGwWntIBPC3l/JZcmw==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.4", - "resolved": "https://registry.npmmirror.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", - "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/postcss-pxtorem": { - "version": "6.1.0", - "resolved": "https://registry.npmmirror.com/@types/postcss-pxtorem/-/postcss-pxtorem-6.1.0.tgz", - "integrity": "sha512-kHsYTjQgllOfhi3J+xunjMKUZ3APARV/JYeOOcIVLhvPVS162S8Ir8LsZwioFFyYCSnQp+aisupiSaRWVwKyDA==", - "dev": true, - "dependencies": { - "postcss": "^8.2.6" - } - }, - "node_modules/@types/web-bluetooth": { - "version": "0.0.16", - "resolved": "https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz", - "integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==" - }, - "node_modules/@vitejs/plugin-vue": { - "version": "4.4.1", - "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-4.4.1.tgz", - "integrity": "sha512-HCQG8VDFDM7YDAdcj5QI5DvUi+r6xvo9LgvYdk7LSkUNwdpempdB5horkMSZsbdey9Ywsf5aaU8kEPw9M5kREA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "peerDependencies": { - "vite": "^4.0.0", - "vue": "^3.2.25" - } - }, - "node_modules/@volar/language-core": { - "version": "1.10.10", - "resolved": "https://registry.npmmirror.com/@volar/language-core/-/language-core-1.10.10.tgz", - "integrity": "sha512-nsV1o3AZ5n5jaEAObrS3MWLBWaGwUj/vAsc15FVNIv+DbpizQRISg9wzygsHBr56ELRH8r4K75vkYNMtsSNNWw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@volar/source-map": "1.10.10" - } - }, - "node_modules/@volar/source-map": { - "version": "1.10.10", - "resolved": "https://registry.npmmirror.com/@volar/source-map/-/source-map-1.10.10.tgz", - "integrity": "sha512-GVKjLnifV4voJ9F0vhP56p4+F3WGf+gXlRtjFZsv6v3WxBTWU3ZVeaRaEHJmWrcv5LXmoYYpk/SC25BKemPRkg==", - "dev": true, - "license": "MIT", - "dependencies": { - "muggle-string": "^0.3.1" - } - }, - "node_modules/@volar/typescript": { - "version": "1.10.10", - "resolved": "https://registry.npmmirror.com/@volar/typescript/-/typescript-1.10.10.tgz", - "integrity": "sha512-4a2r5bdUub2m+mYVnLu2wt59fuoYWe7nf0uXtGHU8QQ5LDNfzAR0wK7NgDiQ9rcl2WT3fxT2AA9AylAwFtj50A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@volar/language-core": "1.10.10", - "path-browserify": "^1.0.1" - } - }, - "node_modules/@vue/compiler-core": { - "version": "3.3.8", - "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.3.8.tgz", - "integrity": "sha512-hN/NNBUECw8SusQvDSqqcVv6gWq8L6iAktUR0UF3vGu2OhzRqcOiAno0FmBJWwxhYEXRlQJT5XnoKsVq1WZx4g==", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.23.0", - "@vue/shared": "3.3.8", - "estree-walker": "^2.0.2", - "source-map-js": "^1.0.2" - } - }, - "node_modules/@vue/compiler-dom": { - "version": "3.3.8", - "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.3.8.tgz", - "integrity": "sha512-+PPtv+p/nWDd0AvJu3w8HS0RIm/C6VGBIRe24b9hSyNWOAPEUosFZ5diwawwP8ip5sJ8n0Pe87TNNNHnvjs0FQ==", - "license": "MIT", - "dependencies": { - "@vue/compiler-core": "3.3.8", - "@vue/shared": "3.3.8" - } - }, - "node_modules/@vue/compiler-sfc": { - "version": "3.3.8", - "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.3.8.tgz", - "integrity": "sha512-WMzbUrlTjfYF8joyT84HfwwXo+8WPALuPxhy+BZ6R4Aafls+jDBnSz8PDz60uFhuqFbl3HxRfxvDzrUf3THwpA==", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.23.0", - "@vue/compiler-core": "3.3.8", - "@vue/compiler-dom": "3.3.8", - "@vue/compiler-ssr": "3.3.8", - "@vue/reactivity-transform": "3.3.8", - "@vue/shared": "3.3.8", - "estree-walker": "^2.0.2", - "magic-string": "^0.30.5", - "postcss": "^8.4.31", - "source-map-js": "^1.0.2" - } - }, - "node_modules/@vue/compiler-ssr": { - "version": "3.3.8", - "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.3.8.tgz", - "integrity": "sha512-hXCqQL/15kMVDBuoBYpUnSYT8doDNwsjvm3jTefnXr+ytn294ySnT8NlsFHmTgKNjwpuFy7XVV8yTeLtNl/P6w==", - "license": "MIT", - "dependencies": { - "@vue/compiler-dom": "3.3.8", - "@vue/shared": "3.3.8" - } - }, - "node_modules/@vue/devtools-api": { - "version": "6.5.1", - "resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.5.1.tgz", - "integrity": "sha512-+KpckaAQyfbvshdDW5xQylLni1asvNSGme1JFs8I1+/H5pHEhqUKMEQD/qn3Nx5+/nycBq11qAEi8lk+LXI2dA==", - "license": "MIT" - }, - "node_modules/@vue/language-core": { - "version": "1.8.22", - "resolved": "https://registry.npmmirror.com/@vue/language-core/-/language-core-1.8.22.tgz", - "integrity": "sha512-bsMoJzCrXZqGsxawtUea1cLjUT9dZnDsy5TuZ+l1fxRMzUGQUG9+Ypq4w//CqpWmrx7nIAJpw2JVF/t258miRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@volar/language-core": "~1.10.5", - "@volar/source-map": "~1.10.5", - "@vue/compiler-dom": "^3.3.0", - "@vue/shared": "^3.3.0", - "computeds": "^0.0.1", - "minimatch": "^9.0.3", - "muggle-string": "^0.3.1", - "vue-template-compiler": "^2.7.14" - }, - "peerDependencies": { - "typescript": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@vue/reactivity": { - "version": "3.3.8", - "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.3.8.tgz", - "integrity": "sha512-ctLWitmFBu6mtddPyOKpHg8+5ahouoTCRtmAHZAXmolDtuZXfjL2T3OJ6DL6ezBPQB1SmMnpzjiWjCiMYmpIuw==", - "license": "MIT", - "dependencies": { - "@vue/shared": "3.3.8" - } - }, - "node_modules/@vue/reactivity-transform": { - "version": "3.3.8", - "resolved": "https://registry.npmmirror.com/@vue/reactivity-transform/-/reactivity-transform-3.3.8.tgz", - "integrity": "sha512-49CvBzmZNtcHua0XJ7GdGifM8GOXoUMOX4dD40Y5DxI3R8OUhMlvf2nvgUAcPxaXiV5MQQ1Nwy09ADpnLQUqRw==", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.23.0", - "@vue/compiler-core": "3.3.8", - "@vue/shared": "3.3.8", - "estree-walker": "^2.0.2", - "magic-string": "^0.30.5" - } - }, - "node_modules/@vue/runtime-core": { - "version": "3.3.8", - "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.3.8.tgz", - "integrity": "sha512-qurzOlb6q26KWQ/8IShHkMDOuJkQnQcTIp1sdP4I9MbCf9FJeGVRXJFr2mF+6bXh/3Zjr9TDgURXrsCr9bfjUw==", - "license": "MIT", - "dependencies": { - "@vue/reactivity": "3.3.8", - "@vue/shared": "3.3.8" - } - }, - "node_modules/@vue/runtime-dom": { - "version": "3.3.8", - "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.3.8.tgz", - "integrity": "sha512-Noy5yM5UIf9UeFoowBVgghyGGPIDPy1Qlqt0yVsUdAVbqI8eeMSsTqBtauaEoT2UFXUk5S64aWVNJN4MJ2vRdA==", - "license": "MIT", - "dependencies": { - "@vue/runtime-core": "3.3.8", - "@vue/shared": "3.3.8", - "csstype": "^3.1.2" - } - }, - "node_modules/@vue/server-renderer": { - "version": "3.3.8", - "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.3.8.tgz", - "integrity": "sha512-zVCUw7RFskvPuNlPn/8xISbrf0zTWsTSdYTsUTN1ERGGZGVnRxM2QZ3x1OR32+vwkkCm0IW6HmJ49IsPm7ilLg==", - "license": "MIT", - "dependencies": { - "@vue/compiler-ssr": "3.3.8", - "@vue/shared": "3.3.8" - }, - "peerDependencies": { - "vue": "3.3.8" - } - }, - "node_modules/@vue/shared": { - "version": "3.3.8", - "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.3.8.tgz", - "integrity": "sha512-8PGwybFwM4x8pcfgqEQFy70NaQxASvOC5DJwLQfpArw1UDfUXrJkdxD3BhVTMS+0Lef/TU7YO0Jvr0jJY8T+mw==", - "license": "MIT" - }, - "node_modules/@vue/tsconfig": { - "version": "0.4.0", - "resolved": "https://registry.npmmirror.com/@vue/tsconfig/-/tsconfig-0.4.0.tgz", - "integrity": "sha512-CPuIReonid9+zOG/CGTT05FXrPYATEqoDGNrEaqS4hwcw5BUNM2FguC0mOwJD4Jr16UpRVl9N0pY3P+srIbqmg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@vueuse/core": { - "version": "9.13.0", - "resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-9.13.0.tgz", - "integrity": "sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==", - "dependencies": { - "@types/web-bluetooth": "^0.0.16", - "@vueuse/metadata": "9.13.0", - "@vueuse/shared": "9.13.0", - "vue-demi": "*" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@vueuse/core/node_modules/vue-demi": { - "version": "0.14.10", - "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.10.tgz", - "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", - "hasInstallScript": true, - "bin": { - "vue-demi-fix": "bin/vue-demi-fix.js", - "vue-demi-switch": "bin/vue-demi-switch.js" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "@vue/composition-api": "^1.0.0-rc.1", - "vue": "^3.0.0-0 || ^2.6.0" - }, - "peerDependenciesMeta": { - "@vue/composition-api": { - "optional": true - } - } - }, - "node_modules/@vueuse/metadata": { - "version": "9.13.0", - "resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-9.13.0.tgz", - "integrity": "sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@vueuse/shared": { - "version": "9.13.0", - "resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-9.13.0.tgz", - "integrity": "sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==", - "dependencies": { - "vue-demi": "*" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@vueuse/shared/node_modules/vue-demi": { - "version": "0.14.10", - "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.10.tgz", - "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", - "hasInstallScript": true, - "bin": { - "vue-demi-fix": "bin/vue-demi-fix.js", - "vue-demi-switch": "bin/vue-demi-switch.js" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "@vue/composition-api": "^1.0.0-rc.1", - "vue": "^3.0.0-0 || ^2.6.0" - }, - "peerDependenciesMeta": { - "@vue/composition-api": { - "optional": true - } - } - }, - "node_modules/adler-32": { - "version": "1.3.1", - "resolved": "https://registry.npmmirror.com/adler-32/-/adler-32-1.3.1.tgz", - "integrity": "sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==", - "license": "Apache-2.0", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/amfe-flexible": { - "version": "2.2.1", - "resolved": "https://registry.npmmirror.com/amfe-flexible/-/amfe-flexible-2.2.1.tgz", - "integrity": "sha512-L2VfvDzoETBjhRptg5u/IUuzHSuxm22JpSRb404p/TBGeRfwWmmNEbB+TFPIP/sS/+pbM18bCFH9QnMojLuPNw==" - }, - "node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/async-validator": { - "version": "4.2.5", - "resolved": "https://registry.npmmirror.com/async-validator/-/async-validator-4.2.5.tgz", - "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==" - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" - }, - "node_modules/axios": { - "version": "1.6.1", - "resolved": "https://registry.npmmirror.com/axios/-/axios-1.6.1.tgz", - "integrity": "sha512-vfBmhDpKafglh0EldBEbVuoe7DyAavGSLWhuSm5ZSEKQnHhBf0xAAwybbNH1IkrJNGnS/VG4I5yxig1pCEXE4g==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.0", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "license": "MIT", - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cfb": { - "version": "1.2.2", - "resolved": "https://registry.npmmirror.com/cfb/-/cfb-1.2.2.tgz", - "integrity": "sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==", - "license": "Apache-2.0", - "dependencies": { - "adler-32": "~1.3.0", - "crc-32": "~1.2.0" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/codepage": { - "version": "1.15.0", - "resolved": "https://registry.npmmirror.com/codepage/-/codepage-1.15.0.tgz", - "integrity": "sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==", - "license": "Apache-2.0", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "license": "MIT" - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/computeds": { - "version": "0.0.1", - "resolved": "https://registry.npmmirror.com/computeds/-/computeds-0.0.1.tgz", - "integrity": "sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmmirror.com/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "license": "Apache-2.0", - "bin": { - "crc32": "bin/crc32.njs" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypto-js": { - "version": "4.1.1", - "resolved": "https://registry.npmmirror.com/crypto-js/-/crypto-js-4.1.1.tgz", - "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==" - }, - "node_modules/csstype": { - "version": "3.1.2", - "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", - "license": "MIT" - }, - "node_modules/dayjs": { - "version": "1.11.13", - "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.13.tgz", - "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==" - }, - "node_modules/de-indent": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/de-indent/-/de-indent-1.0.2.tgz", - "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", - "dev": true, - "license": "MIT" - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/echarts": { - "version": "5.4.3", - "resolved": "https://registry.npmmirror.com/echarts/-/echarts-5.4.3.tgz", - "integrity": "sha512-mYKxLxhzy6zyTi/FaEbJMOZU1ULGEQHaeIeuMR5L+JnJTpz+YR03mnnpBhbR4+UYJAgiXgpyTVLffPAjOTLkZA==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "2.3.0", - "zrender": "5.4.4" - } - }, - "node_modules/element-plus": { - "version": "2.9.1", - "resolved": "https://registry.npmmirror.com/element-plus/-/element-plus-2.9.1.tgz", - "integrity": "sha512-9Agqf/jt4Ugk7EZ6C5LME71sgkvauPCsnvJN12Xid2XVobjufxMGpRE4L7pS4luJMOmFAH3J0NgYEGZT5r+NDg==", - "dependencies": { - "@ctrl/tinycolor": "^3.4.1", - "@element-plus/icons-vue": "^2.3.1", - "@floating-ui/dom": "^1.0.1", - "@popperjs/core": "npm:@sxzz/popperjs-es@^2.11.7", - "@types/lodash": "^4.14.182", - "@types/lodash-es": "^4.17.6", - "@vueuse/core": "^9.1.0", - "async-validator": "^4.2.5", - "dayjs": "^1.11.13", - "escape-html": "^1.0.3", - "lodash": "^4.17.21", - "lodash-es": "^4.17.21", - "lodash-unified": "^1.0.2", - "memoize-one": "^6.0.0", - "normalize-wheel-es": "^1.2.0" - }, - "peerDependencies": { - "vue": "^3.2.0" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmmirror.com/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/esbuild": { - "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.18.20.tgz", - "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.18.20", - "@esbuild/android-arm64": "0.18.20", - "@esbuild/android-x64": "0.18.20", - "@esbuild/darwin-arm64": "0.18.20", - "@esbuild/darwin-x64": "0.18.20", - "@esbuild/freebsd-arm64": "0.18.20", - "@esbuild/freebsd-x64": "0.18.20", - "@esbuild/linux-arm": "0.18.20", - "@esbuild/linux-arm64": "0.18.20", - "@esbuild/linux-ia32": "0.18.20", - "@esbuild/linux-loong64": "0.18.20", - "@esbuild/linux-mips64el": "0.18.20", - "@esbuild/linux-ppc64": "0.18.20", - "@esbuild/linux-riscv64": "0.18.20", - "@esbuild/linux-s390x": "0.18.20", - "@esbuild/linux-x64": "0.18.20", - "@esbuild/netbsd-x64": "0.18.20", - "@esbuild/openbsd-x64": "0.18.20", - "@esbuild/sunos-x64": "0.18.20", - "@esbuild/win32-arm64": "0.18.20", - "@esbuild/win32-ia32": "0.18.20", - "@esbuild/win32-x64": "0.18.20" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "license": "MIT" - }, - "node_modules/file-saver": { - "version": "2.0.5", - "resolved": "https://registry.npmmirror.com/file-saver/-/file-saver-2.0.5.tgz", - "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==", - "license": "MIT" - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/follow-redirects": { - "version": "1.15.3", - "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.3.tgz", - "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/frac": { - "version": "1.1.2", - "resolved": "https://registry.npmmirror.com/frac/-/frac-1.1.2.tgz", - "integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==", - "license": "Apache-2.0", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", - "dev": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmmirror.com/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "license": "MIT", - "bin": { - "he": "bin/he" - } - }, - "node_modules/hosted-git-info": { - "version": "7.0.1", - "resolved": "https://registry.npmmirror.com/hosted-git-info/-/hosted-git-info-7.0.1.tgz", - "integrity": "sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA==", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^10.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/immutable": { - "version": "4.3.4", - "resolved": "https://registry.npmmirror.com/immutable/-/immutable-4.3.4.tgz", - "integrity": "sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==", - "license": "MIT" - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" - }, - "node_modules/js-cookie": { - "version": "3.0.5", - "resolved": "https://registry.npmmirror.com/js-cookie/-/js-cookie-3.0.5.tgz", - "integrity": "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==", - "license": "MIT", - "engines": { - "node": ">=14" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-parse-even-better-errors": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", - "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/lines-and-columns": { - "version": "2.0.4", - "resolved": "https://registry.npmmirror.com/lines-and-columns/-/lines-and-columns-2.0.4.tgz", - "integrity": "sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" - }, - "node_modules/lodash-unified": { - "version": "1.0.3", - "resolved": "https://registry.npmmirror.com/lodash-unified/-/lodash-unified-1.0.3.tgz", - "integrity": "sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==", - "peerDependencies": { - "@types/lodash-es": "*", - "lodash": "*", - "lodash-es": "*" - } - }, - "node_modules/lru-cache": { - "version": "10.0.1", - "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-10.0.1.tgz", - "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", - "dev": true, - "license": "ISC", - "engines": { - "node": "14 || >=16.14" - } - }, - "node_modules/magic-string": { - "version": "0.30.5", - "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.5.tgz", - "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/memoize-one": { - "version": "6.0.0", - "resolved": "https://registry.npmmirror.com/memoize-one/-/memoize-one-6.0.0.tgz", - "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==" - }, - "node_modules/memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmmirror.com/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", - "dev": true, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/muggle-string": { - "version": "0.3.1", - "resolved": "https://registry.npmmirror.com/muggle-string/-/muggle-string-0.3.1.tgz", - "integrity": "sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==", - "dev": true, - "license": "MIT" - }, - "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/normalize-package-data": { - "version": "6.0.0", - "resolved": "https://registry.npmmirror.com/normalize-package-data/-/normalize-package-data-6.0.0.tgz", - "integrity": "sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^7.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-wheel-es": { - "version": "1.2.0", - "resolved": "https://registry.npmmirror.com/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz", - "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==" - }, - "node_modules/npm-run-all2": { - "version": "6.1.1", - "resolved": "https://registry.npmmirror.com/npm-run-all2/-/npm-run-all2-6.1.1.tgz", - "integrity": "sha512-lWLbkPZ5BSdXtN8lR+0rc8caKoPdymycpZksyDEC9MOBvfdwTXZ0uVhb7bMcGeXv2/BKtfQuo6Zn3zfc8rxNXA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.2.1", - "cross-spawn": "^7.0.3", - "memorystream": "^0.3.1", - "minimatch": "^9.0.0", - "pidtree": "^0.6.0", - "read-pkg": "^8.0.0", - "shell-quote": "^1.7.3" - }, - "bin": { - "npm-run-all": "bin/npm-run-all/index.js", - "npm-run-all2": "bin/npm-run-all/index.js", - "run-p": "bin/run-p/index.js", - "run-s": "bin/run-s/index.js" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0", - "npm": ">= 8" - } - }, - "node_modules/parse-json": { - "version": "7.1.1", - "resolved": "https://registry.npmmirror.com/parse-json/-/parse-json-7.1.1.tgz", - "integrity": "sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.21.4", - "error-ex": "^1.3.2", - "json-parse-even-better-errors": "^3.0.0", - "lines-and-columns": "^2.0.3", - "type-fest": "^3.8.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse-json/node_modules/type-fest": { - "version": "3.13.1", - "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-3.13.1.tgz", - "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "dev": true, - "license": "MIT" - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pidtree": { - "version": "0.6.0", - "resolved": "https://registry.npmmirror.com/pidtree/-/pidtree-0.6.0.tgz", - "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", - "dev": true, - "license": "MIT", - "bin": { - "pidtree": "bin/pidtree.js" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/pinia": { - "version": "2.1.7", - "resolved": "https://registry.npmmirror.com/pinia/-/pinia-2.1.7.tgz", - "integrity": "sha512-+C2AHFtcFqjPih0zpYuvof37SFxMQ7OEG2zV9jRI12i9BOy3YQVAHwdKtyyc8pDcDyIc33WCIsZaCFWU7WWxGQ==", - "license": "MIT", - "dependencies": { - "@vue/devtools-api": "^6.5.0", - "vue-demi": ">=0.14.5" - }, - "funding": { - "url": "https://github.com/sponsors/posva" - }, - "peerDependencies": { - "@vue/composition-api": "^1.4.0", - "typescript": ">=4.4.4", - "vue": "^2.6.14 || ^3.3.0" - }, - "peerDependenciesMeta": { - "@vue/composition-api": { - "optional": true - }, - "typescript": { - "optional": true - } - } - }, - "node_modules/pinia-plugin-persistedstate": { - "version": "3.2.1", - "resolved": "https://registry.npmmirror.com/pinia-plugin-persistedstate/-/pinia-plugin-persistedstate-3.2.1.tgz", - "integrity": "sha512-MK++8LRUsGF7r45PjBFES82ISnPzyO6IZx3CH5vyPseFLZCk1g2kgx6l/nW8pEBKxxd4do0P6bJw+mUSZIEZUQ==", - "license": "MIT", - "peerDependencies": { - "pinia": "^2.0.0" - } - }, - "node_modules/pinia/node_modules/vue-demi": { - "version": "0.14.6", - "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.6.tgz", - "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==", - "hasInstallScript": true, - "license": "MIT", - "bin": { - "vue-demi-fix": "bin/vue-demi-fix.js", - "vue-demi-switch": "bin/vue-demi-switch.js" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "@vue/composition-api": "^1.0.0-rc.1", - "vue": "^3.0.0-0 || ^2.6.0" - }, - "peerDependenciesMeta": { - "@vue/composition-api": { - "optional": true - } - } - }, - "node_modules/postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-pxtorem": { - "version": "6.1.0", - "resolved": "https://registry.npmmirror.com/postcss-pxtorem/-/postcss-pxtorem-6.1.0.tgz", - "integrity": "sha512-ROODSNci9ADal3zUcPHOF/K83TiCgNSPXQFSbwyPHNV8ioHIE4SaC+FPOufd8jsr5jV2uIz29v1Uqy1c4ov42g==", - "dev": true, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "license": "MIT" - }, - "node_modules/read-pkg": { - "version": "8.1.0", - "resolved": "https://registry.npmmirror.com/read-pkg/-/read-pkg-8.1.0.tgz", - "integrity": "sha512-PORM8AgzXeskHO/WEv312k9U03B8K9JSiWF/8N9sUuFjBa+9SF2u6K7VClzXwDXab51jCd8Nd36CNM+zR97ScQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/normalize-package-data": "^2.4.1", - "normalize-package-data": "^6.0.0", - "parse-json": "^7.0.0", - "type-fest": "^4.2.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/rollup": { - "version": "3.29.4", - "resolved": "https://registry.npmmirror.com/rollup/-/rollup-3.29.4.tgz", - "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", - "dev": true, - "license": "MIT", - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=14.18.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/sass": { - "version": "1.69.5", - "resolved": "https://registry.npmmirror.com/sass/-/sass-1.69.5.tgz", - "integrity": "sha512-qg2+UCJibLr2LCVOt3OlPhr/dqVHWOa9XtZf2OjbLs/T4VPSJ00udtgJxH3neXZm+QqX8B+3cU7RaLqp1iVfcQ==", - "license": "MIT", - "dependencies": { - "chokidar": ">=3.0.0 <4.0.0", - "immutable": "^4.0.0", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "bin": { - "sass": "sass.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmmirror.com/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/shell-quote": { - "version": "1.8.1", - "resolved": "https://registry.npmmirror.com/shell-quote/-/shell-quote-1.8.1.tgz", - "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmmirror.com/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmmirror.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true, - "license": "CC-BY-3.0" - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmmirror.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.16", - "resolved": "https://registry.npmmirror.com/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", - "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", - "dev": true, - "license": "CC0-1.0" - }, - "node_modules/ssf": { - "version": "0.11.2", - "resolved": "https://registry.npmmirror.com/ssf/-/ssf-0.11.2.tgz", - "integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==", - "license": "Apache-2.0", - "dependencies": { - "frac": "~1.1.2" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tslib": { - "version": "2.3.0", - "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz", - "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", - "license": "0BSD" - }, - "node_modules/type-fest": { - "version": "4.7.1", - "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-4.7.1.tgz", - "integrity": "sha512-iWr8RUmzAJRfhZugX9O7nZE6pCxDU8CZ3QxsLuTnGcBLJpCaP2ll3s4eMTBoFnU/CeXY/5rfQSuAEsTGJO4y8A==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typescript": { - "version": "5.2.2", - "resolved": "https://registry.npmmirror.com/typescript/-/typescript-5.2.2.tgz", - "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", - "devOptional": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true, - "license": "MIT" - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmmirror.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/vite": { - "version": "4.5.0", - "resolved": "https://registry.npmmirror.com/vite/-/vite-4.5.0.tgz", - "integrity": "sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.18.10", - "postcss": "^8.4.27", - "rollup": "^3.27.1" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - }, - "peerDependencies": { - "@types/node": ">= 14", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/vue": { - "version": "3.3.8", - "resolved": "https://registry.npmmirror.com/vue/-/vue-3.3.8.tgz", - "integrity": "sha512-5VSX/3DabBikOXMsxzlW8JyfeLKlG9mzqnWgLQLty88vdZL7ZJgrdgBOmrArwxiLtmS+lNNpPcBYqrhE6TQW5w==", - "license": "MIT", - "dependencies": { - "@vue/compiler-dom": "3.3.8", - "@vue/compiler-sfc": "3.3.8", - "@vue/runtime-dom": "3.3.8", - "@vue/server-renderer": "3.3.8", - "@vue/shared": "3.3.8" - }, - "peerDependencies": { - "typescript": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/vue-router": { - "version": "4.2.5", - "resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-4.2.5.tgz", - "integrity": "sha512-DIUpKcyg4+PTQKfFPX88UWhlagBEBEfJ5A8XDXRJLUnZOvcpMF8o/dnL90vpVkGaPbjvXazV/rC1qBKrZlFugw==", - "license": "MIT", - "dependencies": { - "@vue/devtools-api": "^6.5.0" - }, - "funding": { - "url": "https://github.com/sponsors/posva" - }, - "peerDependencies": { - "vue": "^3.2.0" - } - }, - "node_modules/vue-template-compiler": { - "version": "2.7.15", - "resolved": "https://registry.npmmirror.com/vue-template-compiler/-/vue-template-compiler-2.7.15.tgz", - "integrity": "sha512-yQxjxMptBL7UAog00O8sANud99C6wJF+7kgbcwqkvA38vCGF7HWE66w0ZFnS/kX5gSoJr/PQ4/oS3Ne2pW37Og==", - "dev": true, - "license": "MIT", - "dependencies": { - "de-indent": "^1.0.2", - "he": "^1.2.0" - } - }, - "node_modules/vue-tsc": { - "version": "1.8.22", - "resolved": "https://registry.npmmirror.com/vue-tsc/-/vue-tsc-1.8.22.tgz", - "integrity": "sha512-j9P4kHtW6eEE08aS5McFZE/ivmipXy0JzrnTgbomfABMaVKx37kNBw//irL3+LlE3kOo63XpnRigyPC3w7+z+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@volar/typescript": "~1.10.5", - "@vue/language-core": "1.8.22", - "semver": "^7.5.4" - }, - "bin": { - "vue-tsc": "bin/vue-tsc.js" - }, - "peerDependencies": { - "typescript": "*" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/wmf": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/wmf/-/wmf-1.0.2.tgz", - "integrity": "sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==", - "license": "Apache-2.0", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/word": { - "version": "0.3.0", - "resolved": "https://registry.npmmirror.com/word/-/word-0.3.0.tgz", - "integrity": "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==", - "license": "Apache-2.0", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/xlsx": { - "version": "0.18.5", - "resolved": "https://registry.npmmirror.com/xlsx/-/xlsx-0.18.5.tgz", - "integrity": "sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==", - "license": "Apache-2.0", - "dependencies": { - "adler-32": "~1.3.0", - "cfb": "~1.2.1", - "codepage": "~1.15.0", - "crc-32": "~1.2.1", - "ssf": "~0.11.2", - "wmf": "~1.0.1", - "word": "~0.3.0" - }, - "bin": { - "xlsx": "bin/xlsx.njs" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/xterm": { - "version": "5.1.0", - "resolved": "https://registry.npmmirror.com/xterm/-/xterm-5.1.0.tgz", - "integrity": "sha512-LovENH4WDzpwynj+OTkLyZgJPeDom9Gra4DMlGAgz6pZhIDCQ+YuO7yfwanY+gVbn/mmZIStNOnVRU/ikQuAEQ==", - "deprecated": "This package is now deprecated. Move to @xterm/xterm instead." - }, - "node_modules/xterm-addon-attach": { - "version": "0.8.0", - "resolved": "https://registry.npmmirror.com/xterm-addon-attach/-/xterm-addon-attach-0.8.0.tgz", - "integrity": "sha512-k8N5boSYn6rMJTTNCgFpiSTZ26qnYJf3v/nJJYexNO2sdAHDN3m1ivVQWVZ8CHJKKnZQw1rc44YP2NtgalWHfQ==", - "deprecated": "This package is now deprecated. Move to @xterm/addon-attach instead.", - "peerDependencies": { - "xterm": "^5.0.0" - } - }, - "node_modules/xterm-addon-fit": { - "version": "0.7.0", - "resolved": "https://registry.npmmirror.com/xterm-addon-fit/-/xterm-addon-fit-0.7.0.tgz", - "integrity": "sha512-tQgHGoHqRTgeROPnvmtEJywLKoC/V9eNs4bLLz7iyJr1aW/QFzRwfd3MGiJ6odJd9xEfxcW36/xRU47JkD5NKQ==", - "deprecated": "This package is now deprecated. Move to @xterm/addon-fit instead.", - "peerDependencies": { - "xterm": "^5.0.0" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "license": "ISC" - }, - "node_modules/zrender": { - "version": "5.4.4", - "resolved": "https://registry.npmmirror.com/zrender/-/zrender-5.4.4.tgz", - "integrity": "sha512-0VxCNJ7AGOMCWeHVyTrGzUgrK4asT4ml9PEkeGirAkKNYXYzoPJCLvmyfdoOXcjTHPs10OZVMfD1Rwg16AZyYw==", - "license": "BSD-3-Clause", - "dependencies": { - "tslib": "2.3.0" - } - } - } -} diff --git a/pkg/dbmanager/db.go b/pkg/dbmanager/db.go index 28e900860f81d1df7a43d4d9ca635d9f95d26731..ddd647d56c17a4e0927bd5318e493a08456c84ec 100644 --- a/pkg/dbmanager/db.go +++ b/pkg/dbmanager/db.go @@ -54,6 +54,7 @@ func MysqldbInit(conf *options.MysqlDBInfo) error { mysqlmanager.MySQL().AutoMigrate(&batch.Batch{}) mysqlmanager.MySQL().AutoMigrate(&batch.BatchMachines{}) mysqlmanager.MySQL().AutoMigrate(&auditlog.AuditLog{}) + mysqlmanager.MySQL().AutoMigrate(&auditlog.SubLog{}) mysqlmanager.MySQL().AutoMigrate(&configmanage.ConfigFiles{}) mysqlmanager.MySQL().AutoMigrate(&configmanage.HistoryConfigFiles{}) mysqlmanager.MySQL().AutoMigrate(&script.Script{}, &script.HistoryVersion{}, &script.DangerousCommands{})