From 2cff4ba9d66eda362dea150b75ecc3bfcc4b3198 Mon Sep 17 00:00:00 2001 From: goder-zhang Date: Wed, 4 Mar 2026 13:26:16 +0000 Subject: [PATCH] feat: fix time zone, modify custom assign trun --- cmd/server.go | 2 ++ controller/message.go | 2 +- controller/visitor.go | 2 +- docker_build.sh | 2 +- go.mod | 11 ++++++++++- go.sum | 12 ++++++++++++ models/messages.go | 12 +++++++++++- models/users.go | 19 +++++++++++++++++-- static/templates/setting_bottom.html | 6 +++--- 9 files changed, 58 insertions(+), 10 deletions(-) diff --git a/cmd/server.go b/cmd/server.go index c56cf6a..88af34e 100644 --- a/cmd/server.go +++ b/cmd/server.go @@ -11,6 +11,7 @@ import ( "net/http" "os" "path" + "time" "github.com/gin-gonic/gin" "github.com/spf13/cobra" @@ -35,6 +36,7 @@ func init() { serverCmd.PersistentFlags().BoolVarP(&daemon, "daemon", "d", false, "是否为守护进程模式") } func run() { + time.Local = time.FixedZone("UTC+8", 8*3600) if daemon == true { logFilePath := "" if dir, err := os.Getwd(); err == nil { diff --git a/controller/message.go b/controller/message.go index 476e9dc..72e75c6 100644 --- a/controller/message.go +++ b/controller/message.go @@ -372,7 +372,7 @@ func GetMessagesV2(c *gin.Context) { visitor = models.FindVisitorByVistorId(message.VisitorId) } var chatMessage ChatMessage - chatMessage.Time = message.CreatedAt.Format("2006-01-02 15:04:05") + chatMessage.Time = message.GetCreateTime() chatMessage.Content = message.Content chatMessage.MesType = message.MesType if message.MesType == "kefu" { diff --git a/controller/visitor.go b/controller/visitor.go index 95aceeb..944cde7 100644 --- a/controller/visitor.go +++ b/controller/visitor.go @@ -217,7 +217,7 @@ func GetVisitorMessage(c *gin.Context) { for _, message := range messages { item := make(map[string]interface{}) - item["time"] = message.CreatedAt.Format("2006-01-02 15:04:05") + item["time"] = message.GetCreateTime() item["content"] = message.Content item["mes_type"] = message.MesType item["visitor_name"] = message.VisitorName diff --git a/docker_build.sh b/docker_build.sh index 30cf5a1..97439df 100644 --- a/docker_build.sh +++ b/docker_build.sh @@ -1,6 +1,6 @@ #!/bin/bash RUN_NAME=aicss_service -DOCKER_TAG=test +DOCKER_TAG=prod set -e go mod tidy diff --git a/go.mod b/go.mod index fe3aeaf..8809eed 100644 --- a/go.mod +++ b/go.mod @@ -21,6 +21,7 @@ require ( github.com/satori/go.uuid v1.2.0 github.com/sirupsen/logrus v1.4.2 github.com/spf13/cobra v0.0.5 + github.com/spf13/viper v1.3.2 github.com/stretchr/testify v1.10.0 github.com/zh-five/xdaemon v0.1.1 go.uber.org/zap v1.27.1 @@ -29,6 +30,7 @@ require ( require ( github.com/davecgh/go-spew v1.1.1 // indirect + github.com/fsnotify/fsnotify v1.4.7 // indirect github.com/gin-contrib/sse v0.1.0 // indirect github.com/go-playground/locales v0.13.0 // indirect github.com/go-playground/universal-translator v0.17.0 // indirect @@ -40,6 +42,7 @@ require ( github.com/gorilla/context v1.1.1 // indirect github.com/gorilla/securecookie v1.1.1 // indirect github.com/gorilla/sessions v1.1.3 // indirect + github.com/hashicorp/hcl v1.0.0 // indirect github.com/inconshreveable/mousetrap v1.0.0 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/joho/godotenv v1.3.0 // indirect @@ -48,11 +51,17 @@ require ( github.com/konsorten/go-windows-terminal-sequences v1.0.2 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/leodido/go-urn v1.2.0 // indirect + github.com/magiconair/properties v1.8.0 // indirect github.com/mattn/go-isatty v0.0.12 // indirect + github.com/mitchellh/mapstructure v1.1.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.1 // indirect + github.com/pelletier/go-toml v1.2.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/rogpeppe/go-internal v1.12.0 // indirect + github.com/spf13/afero v1.1.2 // indirect + github.com/spf13/cast v1.3.0 // indirect + github.com/spf13/jwalterweatherman v1.0.0 // indirect github.com/spf13/pflag v1.0.3 // indirect github.com/tidwall/gjson v1.18.0 // indirect github.com/tidwall/match v1.1.1 // indirect @@ -62,9 +71,9 @@ require ( go.uber.org/multierr v1.10.0 // indirect golang.org/x/crypto v0.32.0 // indirect golang.org/x/mod v0.17.0 // indirect - golang.org/x/sync v0.10.0 // indirect golang.org/x/sys v0.29.0 // indirect golang.org/x/term v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/go.sum b/go.sum index 45ab052..7112c98 100644 --- a/go.sum +++ b/go.sum @@ -1,3 +1,4 @@ +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc= github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= @@ -23,6 +24,7 @@ github.com/emersion/go-smtp v0.13.0 h1:aC3Kc21TdfvXnuJXCQXuhnDXUldhc12qME/S7Y3Y9 github.com/emersion/go-smtp v0.13.0/go.mod h1:qm27SGYgoIPRot6ubfQ/GpiPy/g3PaZAVRxiO/sDUgQ= github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5 h1:Yzb9+7DPaBjB8zlTR87/ElzFsnQfuHnVUVqpZZIcV5Y= github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5/go.mod h1:a2zkGnVExMxdzMo3M0Hi/3sEU+cWnZpSni0O6/Yb/P0= +github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/gin-contrib/sessions v0.0.3 h1:PoBXki+44XdJdlgDqDrY5nDVe3Wk7wDV/UCOuLP6fBI= github.com/gin-contrib/sessions v0.0.3/go.mod h1:8C/J6cad3Il1mWYYgtw0w+hqasmpvy25mPkXdOgeB9I= @@ -72,6 +74,7 @@ github.com/gorilla/sessions v1.1.3 h1:uXoZdcdA5XdXF3QzuSlheVRUvjl+1rKY7zBXL68L9R github.com/gorilla/sessions v1.1.3/go.mod h1:8KCfur6+4Mqcc6S0FEfKuN15Vl5MgXW92AE8ovaJD0w= github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= @@ -107,6 +110,7 @@ github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/lib/pq v1.1.1 h1:sJZmqHoEaY7f+NPP8pgLB/WxulyR3fewgCM2qaSlBb4= github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/magiconair/properties v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDePerRcY= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= @@ -115,6 +119,7 @@ github.com/mattn/go-sqlite3 v1.14.0 h1:mLyGNKR8+Vv9CAU7PphKa2hkEqxxhn8i32J6FPj1/ github.com/mattn/go-sqlite3 v1.14.0/go.mod h1:JIl7NbARA7phWnGvh0LKTyg7S9BA+6gx71ShQilpsus= github.com/memcachier/mc v2.0.1+incompatible/go.mod h1:7bkvFE61leUBvXz+yxsOnGBQSZpBSPIMUQSmmSHvuXc= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= @@ -124,6 +129,7 @@ github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9 github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/openai/openai-go/v3 v3.17.0 h1:CfTkmQoItolSyW+bHOUF190KuX5+1Zv6MC0Gb4wAwy8= github.com/openai/openai-go/v3 v3.17.0/go.mod h1:cdufnVK14cWcT9qA1rRtrXx4FTRsgbDPW7Ia7SS5cZo= +github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= @@ -139,13 +145,17 @@ github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cobra v0.0.5 h1:f0B+LkLX6DtmRH1isoNA9VTtNUK9K8xYd28JNNfOv/s= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/viper v1.3.2 h1:VUFqw5KcqRf7i70GOzW7N+Q7+gxVBkSSqiXB12+JQ4M= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -209,6 +219,8 @@ golang.org/x/term v0.28.0 h1:/Ts8HFuMR2E6IP/jlo7QVLZHggjKQbhu/7H0LJFr3Gg= golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190624180213-70d37148ca0c/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/models/messages.go b/models/messages.go index 5964c9b..6ef71d4 100644 --- a/models/messages.go +++ b/models/messages.go @@ -27,6 +27,16 @@ type MessageKefu struct { CreateTime string `json:"create_time"` } +func (m *MessageKefu) GetCreateTime() string { + loc, _ := time.LoadLocation("Asia/Shanghai") + return m.CreatedAt.In(loc).Format("2006-01-02 15:04:05") +} + +func (m *Message) GetCreateTime() string { + loc, _ := time.LoadLocation("Asia/Shanghai") + return m.CreatedAt.In(loc).Format("2006-01-02 15:04:05") +} + func CreateMessage(kefu_id string, visitor_id string, content string, mes_type string) { DB.Exec("set names utf8mb4") v := &Message{ @@ -123,7 +133,7 @@ func FindMessageByPage(page uint, pagesize uint, query interface{}, args ...inte var messages []*MessageKefu DB.Table("message").Select("message.*,visitor.avator visitor_avator,visitor.name visitor_name,user.avator kefu_avator,user.nickname kefu_name").Offset(offset).Joins("left join user on message.kefu_id=user.name").Joins("left join visitor on visitor.visitor_id=message.visitor_id").Where(query, args...).Limit(pagesize).Order("message.id desc").Find(&messages) for _, mes := range messages { - mes.CreateTime = mes.CreatedAt.Format("2006-01-02 15:04:05") + mes.CreateTime = mes.GetCreateTime() } return messages } diff --git a/models/users.go b/models/users.go index 6933901..6d3da1e 100644 --- a/models/users.go +++ b/models/users.go @@ -87,8 +87,10 @@ func FindIdleUser() User { assignMutex.Lock() defer assignMutex.Unlock() - var users []User - DB.Where("name != ? and `status` = 1 and `is_online` = 1", "admin").Order("id desc").Find(&users) + users := FindOnlineUser() + if len(users) == 0 { + users = GetAllUsers() + } if len(users) == 0 { return User{} @@ -114,6 +116,19 @@ func FindIdleUser() User { return targetUser } +func GetAllUsers() []User { + var users []User + DB.Where("name != ? and `status` = 1", "admin").Order("is_online desc").Find(&users) + return users +} + +func FindOnlineUser() []User { + var users []User + DB.Where("name != ? and `status` = 1 and is_online = 1", "admin").Order("id desc").Find(&users) + + return users +} + func FindUserById(id interface{}) User { var user User DB.Select("user.*,role.name role_name,role.id role_id").Joins("join user_role on user.id=user_role.user_id").Joins("join role on user_role.role_id=role.id").Where("user.id = ?", id).First(&user) diff --git a/static/templates/setting_bottom.html b/static/templates/setting_bottom.html index e229abc..c93a302 100644 --- a/static/templates/setting_bottom.html +++ b/static/templates/setting_bottom.html @@ -332,7 +332,7 @@ A: 因二次结算导致,系统将按最终结果扣回或补发。`} // Toggle Status handleStatusChange(row) { let _this = this; - this.sendAjax("/kefu_status", "post", { + this.sendAjax("/aicss/kefu_status", "post", { username: row.name, status: row.status }, function(result) { @@ -355,7 +355,7 @@ A: 因二次结算导致,系统将按最终结果扣回或补发。`} this.$message.error("Password too short"); return; } - this.sendAjax("/admin_reset_pass", "post", this.resetPassForm, function(result) { + this.sendAjax("/aicss/admin_reset_pass", "post", this.resetPassForm, function(result) { _this.$message.success("Password reset successfully"); _this.resetPassDialog = false; }); @@ -376,7 +376,7 @@ A: 因二次结算导致,系统将按最终结果扣回或补发。`} this.$message.error("Username and password required"); return; } - this.sendAjax("/register", "post", this.createKefuForm, function(result) { + this.sendAjax("/aicss/register", "post", this.createKefuForm, function(result) { _this.$message.success("User created successfully"); _this.createKefuDialog = false; _this.getKefuList();