From 1fca021b38dae7bd6fa3c317f6997ecc9e0d2b05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=AF=BB=E6=AC=A2?= Date: Tue, 23 Apr 2024 10:42:08 +0800 Subject: [PATCH] =?UTF-8?q?:fire:=20=E9=87=8D=E6=9E=84=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=EF=BC=8C=E9=95=BF=E5=BE=97=E6=9B=B4=E5=A5=BD?= =?UTF-8?q?=E7=9C=8B=E4=B8=80=E4=BA=9B=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .editorconfig | 21 ++ app/index.go | 29 --- app/pages.go | 79 +++++++ config.yaml | 14 +- main.go | 22 +- router/router.go | 9 +- views/404.html | 78 +++++++ views/components.html | 138 ++++++++++++ views/footer.html | 10 + views/friend.html | 113 ++++++++++ views/group.html | 118 +++++++++++ views/head.html | 27 +++ views/index.html | 268 +++--------------------- views/notifications.html | 53 +++++ views/static/css/404.css | 429 ++++++++++++++++++++++++++++++++++++++ views/static/img/logo.png | Bin 0 -> 24491 bytes views/static/js/404.js | 1 + views/static/js/index.js | 14 ++ 18 files changed, 1144 insertions(+), 279 deletions(-) create mode 100644 .editorconfig delete mode 100644 app/index.go create mode 100644 app/pages.go create mode 100644 views/404.html create mode 100644 views/components.html create mode 100644 views/footer.html create mode 100644 views/friend.html create mode 100644 views/group.html create mode 100644 views/head.html create mode 100644 views/notifications.html create mode 100644 views/static/css/404.css create mode 100644 views/static/img/logo.png create mode 100644 views/static/js/404.js diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..f190a6b --- /dev/null +++ b/.editorconfig @@ -0,0 +1,21 @@ +root = true + +[*] +insert_final_newline = true +charset = utf-8 +trim_trailing_whitespace = true +indent_style = space +indent_size = 2 + +[{Makefile,go.mod,go.sum,*.go,.gitmodules}] +indent_style = tab +indent_size = 4 + +[*.md] +indent_size = 4 +trim_trailing_whitespace = false + +eclint_indent_style = unset + +[Dockerfile] +indent_size = 4 \ No newline at end of file diff --git a/app/index.go b/app/index.go deleted file mode 100644 index affe9b4..0000000 --- a/app/index.go +++ /dev/null @@ -1,29 +0,0 @@ -package app - -import ( - "fmt" - "github.com/gin-gonic/gin" - "go-wechat/config" - "go-wechat/service" - "net/http" -) - -// Index -// @description: 首页 -// @param ctx -func Index(ctx *gin.Context) { - var result = gin.H{ - "msg": "success", - } - // 取出所有好友列表 - friends, groups, err := service.GetAllFriend() - if err != nil { - result["msg"] = fmt.Sprintf("数据获取失败: %s", err.Error()) - } - result["friends"] = friends - result["groups"] = groups - result["vnc"] = config.Conf.Wechat.VncUrl - result["aiModels"] = config.Conf.Ai.Models - // 渲染页面 - ctx.HTML(http.StatusOK, "index.html", result) -} diff --git a/app/pages.go b/app/pages.go new file mode 100644 index 0000000..c1ab8b7 --- /dev/null +++ b/app/pages.go @@ -0,0 +1,79 @@ +package app + +import ( + "fmt" + "github.com/gin-gonic/gin" + "go-wechat/config" + "go-wechat/service" + "net/http" +) + +// Index +// @description: 首页 +// @param ctx +func Index(ctx *gin.Context) { + var result = gin.H{ + "msg": "success", + } + // 取出所有好友列表 + friends, groups, err := service.GetAllFriend() + if err != nil { + result["msg"] = fmt.Sprintf("数据获取失败: %s", err.Error()) + } + result["friendCount"] = len(friends) + result["groupCount"] = len(groups) + result["vnc"] = config.Conf.Wechat.VncUrl + result["isVnc"] = config.Conf.Wechat.VncUrl != "" + result["aiModels"] = config.Conf.Ai.Models + + // 渲染页面 + ctx.HTML(http.StatusOK, "index.html", result) +} + +// Friend +// @description: 好友列表 +// @param ctx +func Friend(ctx *gin.Context) { + var result = gin.H{ + "msg": "success", + } + + // 取出所有好友列表 + friends, _, err := service.GetAllFriend() + if err != nil { + result["msg"] = fmt.Sprintf("数据获取失败: %s", err.Error()) + } + result["friends"] = friends + result["vnc"] = config.Conf.Wechat.VncUrl + result["aiModels"] = config.Conf.Ai.Models + // 渲染页面 + ctx.HTML(http.StatusOK, "friend.html", result) +} + +// Group +// @description: 群组列表 +// @param ctx +func Group(ctx *gin.Context) { + var result = gin.H{ + "msg": "success", + } + // 取出所有好友列表 + _, groups, err := service.GetAllFriend() + if err != nil { + result["msg"] = fmt.Sprintf("数据获取失败: %s", err.Error()) + } + result["groups"] = groups + result["vnc"] = config.Conf.Wechat.VncUrl + result["aiModels"] = config.Conf.Ai.Models + + // 渲染页面 + ctx.HTML(http.StatusOK, "group.html", result) +} + +// PageNotFound +// @description: 404页面 +// @param ctx +func PageNotFound(ctx *gin.Context) { + // 渲染页面 + ctx.HTML(http.StatusOK, "404.html", nil) +} diff --git a/config.yaml b/config.yaml index 044a642..2153fd4 100644 --- a/config.yaml +++ b/config.yaml @@ -23,7 +23,7 @@ mysql: schema: public # postgres 专用 task: - enable: true + enable: false syncFriends: enable: false cron: '*/5 * * * *' # 五分钟一次 @@ -66,17 +66,19 @@ ai: personality: 你的名字叫张三,你是一个百科机器人,你的爱好是看电影,你的性格是开朗的,你的专长是讲故事,你的梦想是当一名童话故事作家。你对政治没有一点儿兴趣,也不会讨论任何与政治相关的话题,你甚至可以拒绝回答这一类话题。 models: - name: ChatGPT-4 - model: gpt-4-0613 - - name: 讯飞星火v3 - model: SparkDesk3 - - name: 讯飞星火随机 - model: SparkDesk + model: gpt-4 + - name: 讯飞星火v3.1 + model: SparkDesk-v3.1 + - name: 讯飞星火v3.5 + model: SparkDesk-v3.5 - name: 月之暗面-8k model: moonshot-v1-8k - name: 月之暗面-32k model: moonshot-v1-32k - name: 月之暗面-128k model: moonshot-v1-128k + - name: 跃问 + model: StepChat # 资源配置 # map[k]v结构,k 会变成全小写,所以这儿不能用大写字母 diff --git a/main.go b/main.go index fb9d3ec..5eb07dd 100644 --- a/main.go +++ b/main.go @@ -40,11 +40,23 @@ func main() { // 自定义模板引擎函数 app.SetFuncMap(template.FuncMap{ - "checkSwap": func(flag bool) string { - if flag { - return "swap-active" + "codeToChinese": func(code string) string { + switch code { + case "friend": + return "好友列表" + case "group": + return "群组列表" + case "index": + return "首页" + default: + return "其他页面" } - return "" + }, + "boolToChinese": func(flag bool) string { + if flag { + return "是" + } + return "否" }, }) @@ -58,7 +70,7 @@ func main() { return } // 404直接跳转到首页 - ctx.Redirect(302, "/index.html") + ctx.Redirect(302, "/404.html") }) app.NoMethod(func(ctx *gin.Context) { ctx.String(http.StatusMethodNotAllowed, "不支持的请求方式") diff --git a/router/router.go b/router/router.go index 33848da..7df7ae5 100644 --- a/router/router.go +++ b/router/router.go @@ -14,10 +14,11 @@ func Init(g *gin.Engine) { ctx.Redirect(302, "/index.html") }) - g.GET("/index.html", app.Index) // 首页 - g.GET("/test.html", func(ctx *gin.Context) { - ctx.HTML(200, "test.html", nil) - }) + g.GET("/index.html", app.Index) // 首页 + g.GET("/friend.html", app.Friend) // 好友列表 + g.GET("/group.html", app.Group) // 群组列表 + + g.GET("/404.html", app.PageNotFound) // 群组列表 // 接口 api := g.Group("/api") diff --git a/views/404.html b/views/404.html new file mode 100644 index 0000000..0ede84e --- /dev/null +++ b/views/404.html @@ -0,0 +1,78 @@ + + + + + + 看起来你好像迷路了~ + + + + + + + +
+

404

+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + + + + + + + diff --git a/views/components.html b/views/components.html new file mode 100644 index 0000000..0d4f5b7 --- /dev/null +++ b/views/components.html @@ -0,0 +1,138 @@ + + + +{{define "ai"}} + +{{end}} + + + +{{define "chatRank"}} + +{{end}} + + +{{define "summary"}} + +{{end}} + + +{{define "welcome"}} + +{{end}} + + + +{{define "command"}} + +{{end}} diff --git a/views/footer.html b/views/footer.html new file mode 100644 index 0000000..0061ae6 --- /dev/null +++ b/views/footer.html @@ -0,0 +1,10 @@ + diff --git a/views/friend.html b/views/friend.html new file mode 100644 index 0000000..979b7f9 --- /dev/null +++ b/views/friend.html @@ -0,0 +1,113 @@ + + + + + + 好友列表 + + + + + + + + + + + +
+ {{ template "head.html" "friend" }} + +
+
+
+ + + + + + + + + + + + + + {{ range .friends }} + + + + + + + + + + {{ end }} + +
+ 微信Id + + 微信号 + 昵称 + + 最后活跃时间 + + 是否在通讯录 + + 是否启用AI + + 是否启用指令 +
+ {{ .Wxid }} + {{ + .CustomAccount }} + {{ + .Nickname }} + + {{ if eq .LastActive.IsNil true }} + 无数据 + {{ else }} + {{ .LastActive }} + {{ end }} + + {{ if eq .IsOk true }} + + {{ else }} + + {{ end }} + + {{ template "ai" . }} + + {{ if eq .EnableAi true }} + + {{ end }} + + {{ template "command" . }} +
+
+
+
+ + {{ template "footer.html" }} +
+ + + diff --git a/views/group.html b/views/group.html new file mode 100644 index 0000000..4feccec --- /dev/null +++ b/views/group.html @@ -0,0 +1,118 @@ + + + + + + 水群助手 + + + + + + + + + + + +
+ {{ template "head.html" "group" }} + +
+
+
+ + + + + + + + + + + + + + + {{ range .groups }} + + + + + + + + + + + {{ end }} + +
群名称 + + 最后活跃时间 + + 是否在通讯录 + + 是否启用AI + + 是否启用水群排行榜 + + 是否启用聊天记录总结 + + 是否启用迎新 + + 是否启用指令 +
+
{{ .Nickname }}
+
{{ .Wxid }}
+
+ {{ if eq .LastActive.IsNil true }} + 无数据 + {{ else }} + {{ .LastActive }} + {{ end }} + + {{ if eq .IsOk true }} + + {{ else }} + + {{ end }} + + {{ template "ai" . }} + + {{ if eq .EnableAi true }} + + {{ end }} + + {{ template "chatRank" . }} + + {{ template "summary" . }} + + {{ template "welcome" . }} + + {{ template "command" . }} +
+
+
+
+ + {{ template "footer.html" }} +
+ + diff --git a/views/head.html b/views/head.html new file mode 100644 index 0000000..ce5dbe4 --- /dev/null +++ b/views/head.html @@ -0,0 +1,27 @@ +
+ +
+
+

{{ codeToChinese . }}

+
+
+
diff --git a/views/index.html b/views/index.html index 06fb6df..53988cc 100644 --- a/views/index.html +++ b/views/index.html @@ -1,247 +1,45 @@ - + + - - 水群助手 + + 水群助手 - - + + - - + + - + - -
- - {{ if ne .msg "success" }} - - {{ end }} - -
- -
- - - - - - - - - - - - - - - - {{ range .friends }} - - - - - - - - - - {{ end }} - -
微信Id微信号昵称最后活跃时间是否在通讯录是否启用AI是否启用指令
{{ .Wxid }}{{ .CustomAccount }}{{ .Nickname }} - {{ if eq .LastActive.IsNil true }} - 无数据 - {{ else }} - {{ .LastActive }} - {{ end }} - - {{ if eq .IsOk true }} -
- 是 -
- {{ else }} -
- 否 -
- {{ end }} -
- - {{ if .EnableAi }} -
- - {{ end }} -
- -
-
- - -
- - - - - - - - - - - - - - - - - - - {{ range .groups }} - - - - - - - - - - - - - {{ end }} - -
群Id昵称最后活跃时间是否在通讯录是否启用AI是否启用水群排行榜是否启用聊天记录总结是否启用迎新是否启用指令操作
{{ .Wxid }}{{ .Nickname }} - {{ if eq .LastActive.IsNil true }} - 无数据 - {{ else }} - {{ .LastActive }} - {{ end }} - - {{ if eq .IsOk true }} -
- 是 -
- {{ else }} -
- 否 -
- {{ end }} -
- - - {{ if .EnableAi }} -
- - {{ end }} -
- - - - - - - - - - - -
-
- - {{ if ne .vnc "" }} - -
-
- -
-
- {{ end }} -
+ +
+ {{ template "head.html" "index"}} +
+
+
+
+
+
好友数量
+
{{ .friendCount }}
+
+
+
群组数量
+
{{ .groupCount }}
+
+
+
是否配置VNC
+
{{ boolToChinese .isVnc }}
+
+
+
+
- - - -
成员列表
- - - - - - - - - - - - - - - - -
微信Id昵称是否群成员是否群主加群时间最后活跃时间退群时间是否跳过水群排行榜
- - -
- - \ No newline at end of file diff --git a/views/notifications.html b/views/notifications.html new file mode 100644 index 0000000..0366289 --- /dev/null +++ b/views/notifications.html @@ -0,0 +1,53 @@ + +
+
+ +
+
+
+
+ +
+
+

通知标题

+

+ 通知内容,通知内容,通知内容,通知内容,通知内容,通知内容,通知内容,通知内容

+
+
+ +
+
+
+
+
+
+ + + diff --git a/views/static/css/404.css b/views/static/css/404.css new file mode 100644 index 0000000..b920fdf --- /dev/null +++ b/views/static/css/404.css @@ -0,0 +1,429 @@ +body { + background-color: #FF7F2E; + font-family: "Concert One", cursive; + margin: 0; + overflow: hidden; + padding: 0; +} + +/*/////////////////// rules */ +/*/////////////////// scene */ +.text { + left: 50%; + position: absolute; + top: 50%; + transform: translate(-50%, -50%); + color: rgba(19, 36, 44, 0.1); + font-size: 30em; + text-align: center; + top: 40%; +} + +.container { + left: 50%; + position: absolute; + top: 50%; + transform: translate(-50%, -50%); + height: 300px; + width: 500px; +} +.container:after { + position: absolute; + content: ""; + background-color: rgba(19, 36, 44, 0.1); + border-radius: 12px; + bottom: 40px; + height: 12px; + left: 80px; + width: 350px; + z-index: -1; +} + +/*/////////////////// caveman */ +.caveman { + height: 300px; + position: absolute; + width: 250px; +} + +.caveman:nth-child(1) { + right: 20px; +} + +.caveman:nth-child(2) { + left: 20px; + transform: rotateY(180deg); +} + +.head { + position: absolute; + background-color: #13242C; + border-radius: 50px; + height: 140px; + left: 60px; + top: 25px; + width: 65px; +} +.head:after, .head:before { + content: ""; + position: absolute; + background-color: #13242C; + border-radius: 10px; + height: 20px; + width: 7px; +} +.head:after { + left: 35px; + top: -8px; + transform: rotate(20deg); +} +.head:before { + left: 30px; + top: -8px; + transform: rotate(-20deg); +} +.head .eye { + left: 50%; + position: absolute; + transform: translateX(-50%); + background-color: #EAB08C; + border-radius: 50px; + height: 16px; + left: 45%; + top: 40px; + width: 48px; +} +.head .eye:after, .head .eye:before { + content: ""; + position: absolute; + top: 50%; + transform: translateY(-50%); + background-color: #13242C; + border-radius: 50%; + height: 5px; + width: 5px; +} +.head .eye:after { + left: 5px; +} +.head .eye:before { + right: 9px; +} +.head .eye .nose { + left: 50%; + position: absolute; + top: 50%; + transform: translate(-50%, -50%); + background-color: #D9766C; + border-left: 8px solid rgba(19, 36, 44, 0.1); + border-radius: 10px; + box-sizing: border-box; + height: 35px; + left: 45%; + top: 12px; + width: 15px; +} + +.shape { + left: 50%; + position: absolute; + transform: translateX(-50%); + border-radius: 50%; + height: 140px; + overflow: hidden; + top: 70px; + width: 140px; +} +.shape .circle { + position: absolute; + border-radius: 50%; + height: 60px; + width: 60px; +} +.shape .circle:after, .shape .circle:before { + content: ""; + position: absolute; + border-radius: 50%; + height: 20px; + width: 20px; +} +.shape .circle:after { + left: 50px; + top: 10px; +} +.shape .circle:before { + left: 60px; + top: 45px; +} +.shape .circle:nth-child(1) { + left: -12px; + top: 80px; +} +.shape .circle:nth-child(2) { + right: 10px; + top: 0px; + transform: rotate(90deg); +} +.shape .circle:nth-child(2):after { + left: 65px; + top: 10px; +} +.shape .circle:nth-child(2):before { + display: none; +} + +.caveman:nth-child(1) .shape { + background-color: #D13433; +} +.caveman:nth-child(1) .shape .circle { + background-color: #932422; +} +.caveman:nth-child(1) .shape .circle:after, .caveman:nth-child(1) .shape .circle:before { + background-color: #932422; +} + +.caveman:nth-child(2) .shape { + background-color: #932422; +} +.caveman:nth-child(2) .shape .circle { + background-color: #D13433; +} +.caveman:nth-child(2) .shape .circle:after, .caveman:nth-child(2) .shape .circle:before { + background-color: #D13433; +} + +.arm-right { + position: absolute; + background-color: #EAB08C; + border-left: 8px solid rgba(19, 36, 44, 0.1); + border-radius: 50px; + box-sizing: border-box; + height: 180px; + left: 135px; + top: 80px; + transform-origin: 30px 30px; + width: 60px; + z-index: 1; +} +.arm-right .club { + position: absolute; + border-bottom: 110px solid #601513; + border-left: 10px solid transparent; + border-right: 10px solid transparent; + height: 0; + left: -60px; + top: 120px; + transform: rotate(70deg); + width: 20px; +} +.arm-right .club:after, .arm-right .club:before { + position: absolute; + content: ""; + background-color: #601513; + border-radius: 50%; + left: 0; +} +.arm-right .club:after { + height: 20px; + width: 20px; + top: -10px; +} +.arm-right .club:before { + height: 40px; + width: 40px; + left: -10px; + top: 90px; +} + +.leg { + position: absolute; + border-radius: 10px; + height: 55px; + top: 200px; + width: 10px; +} +.leg:after { + position: absolute; + content: ""; + border-radius: 50%; + height: 10px; + left: -5px; + top: 15px; + width: 10px; +} +.leg .foot { + position: absolute; + border-radius: 25px 25px 0 0; + height: 25px; + left: -38px; + top: 30px; + width: 50px; +} +.leg .foot:after, .leg .foot:before, .leg .foot .fingers, .leg .foot .fingers:after { + position: absolute; + background-color: #EAB08C; + border-radius: 50%; + bottom: 0px; + height: 15px; + transform-origin: bottom; + width: 15px; +} +.leg .foot:after { + left: -6px; + content: ""; +} +.leg .foot:before { + left: 8px; + transform: scale(0.6); + content: ""; +} +.leg .foot .fingers { + left: 15px; + transform: scale(0.6); +} +.leg .foot .fingers:after { + left: 11px; + content: ""; +} + +.leg:nth-child(1) { + background-color: #B2524D; + left: 95px; +} +.leg:nth-child(1):after { + background-color: #B2524D; +} +.leg:nth-child(1) .foot { + background-color: #B2524D; +} +.leg:nth-child(1) .foot:after { + background-color: #B2524D; +} +.leg:nth-child(1) .foot:before { + display: none; +} + +.leg:nth-child(2) { + background-color: #D9766C; + left: 115px; +} +.leg:nth-child(2):after { + background-color: #D9766C; +} +.leg:nth-child(2) .foot { + background-color: #D9766C; +} + +/*/////////////////// animation */ +.caveman:nth-child(1) .arm-right { + animation: arm-anima 1.2s infinite cubic-bezier(0.55, 0.01, 0.16, 1.34); +} + +.caveman:nth-child(2) .arm-right { + animation: arm-anima 1.2s infinite cubic-bezier(0.55, 0.01, 0.16, 1.34); + animation-delay: 0.6s; +} + +@keyframes arm-anima { + 0% { + transform: rotate(0); + } + 100% { + transform: rotate(-360deg); + } +} +.caveman:nth-child(2) .head { + animation: head-anima 1.2s infinite cubic-bezier(0.55, 0.01, 0.16, 1.34); +} + +.caveman:nth-child(1) .head { + animation: head-anima 1.2s infinite cubic-bezier(0.55, 0.01, 0.16, 1.34); + animation-delay: 0.6s; +} + +@keyframes head-anima { + 0% { + top: 25px; + } + 42% { + top: 25px; + } + 45% { + top: 50px; + } + 100% { + top: 25px; + } +} +.caveman:nth-child(2) .eye:after, +.caveman:nth-child(2) .eye:before { + animation: eye-anima 1.2s infinite cubic-bezier(0.55, 0.01, 0.16, 1.34); +} + +.caveman:nth-child(1) .eye:after, +.caveman:nth-child(1) .eye:before { + animation: eye-anima 1.2s infinite cubic-bezier(0.55, 0.01, 0.16, 1.34); + animation-delay: 0.6s; +} + +@keyframes eye-anima { + 0% { + height: 5px; + } + 42% { + height: 5px; + } + 45% { + height: 1px; + } + 100% { + height: 5px; + } +} +.container:after { + animation: shadow-anima 1.2s infinite cubic-bezier(0.55, 0.01, 0.16, 1.34); + animation-delay: 0.1s; +} + +@keyframes shadow-anima { + 0% { + width: 350px; + left: 80px; + } + 25% { + width: 450px; + left: 80px; + } + 50% { + width: 350px; + left: 80px; + } + 75% { + width: 450px; + left: 0px; + } + 100% { + width: 350px; + left: 80px; + } +} +/*/////////////////////// credit ////*/ +#link { + bottom: 20px; + color: #000; + opacity: 0.2; + display: flex; + align-items: center; + position: absolute; + left: 50%; + transform: translateX(-50%); +} + +#link p { + margin: 0; + margin-left: 5px; +} + +#link:hover { + opacity: 1; +} \ No newline at end of file diff --git a/views/static/img/logo.png b/views/static/img/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..00ad1a0a1dac89934f736a7211604900e863d795 GIT binary patch literal 24491 zcmV*BKyJT@P)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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 O0000