Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/MHSanaei/3x-ui.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAli Golzar <57574919+aliglzr@users.noreply.github.com>2025-08-31 19:33:50 +0300
committerGitHub <noreply@github.com>2025-08-31 19:33:50 +0300
commit4a0914cb1e271ab4f076cb1bd68c9f07cc025e92 (patch)
tree95a15ed4255736b0bc7edaa509951d62c9c0254a /web/controller
parent664269d513f4c122c9f5a713d3293777872d3353 (diff)
feat: add "Last Online" column to client list and modal (Closes #3402) (#3405)
* feat: persist client last online and expose API * feat(ui): show client last online in table and info modal * i18n: add “Last Online” across locales * chore: format timestamps as HH:mm:ss
Diffstat (limited to 'web/controller')
-rw-r--r--web/controller/api.go1
-rw-r--r--web/controller/inbound.go5
2 files changed, 6 insertions, 0 deletions
diff --git a/web/controller/api.go b/web/controller/api.go
index 636035ba..32af934e 100644
--- a/web/controller/api.go
+++ b/web/controller/api.go
@@ -47,6 +47,7 @@ func (a *APIController) initRouter(g *gin.RouterGroup) {
{"POST", "/resetAllClientTraffics/:id", a.inboundController.resetAllClientTraffics},
{"POST", "/delDepletedClients/:id", a.inboundController.delDepletedClients},
{"POST", "/onlines", a.inboundController.onlines},
+ {"POST", "/lastOnline", a.inboundController.lastOnline},
{"POST", "/updateClientTraffic/:email", a.inboundController.updateClientTraffic},
}
diff --git a/web/controller/inbound.go b/web/controller/inbound.go
index 851b4b6f..9ff2f302 100644
--- a/web/controller/inbound.go
+++ b/web/controller/inbound.go
@@ -340,6 +340,11 @@ func (a *InboundController) onlines(c *gin.Context) {
jsonObj(c, a.inboundService.GetOnlineClients(), nil)
}
+func (a *InboundController) lastOnline(c *gin.Context) {
+ data, err := a.inboundService.GetClientsLastOnline()
+ jsonObj(c, data, err)
+}
+
func (a *InboundController) updateClientTraffic(c *gin.Context) {
email := c.Param("email")