From f8fed835073369f39b44e77632fed83cc2ee3753 Mon Sep 17 00:00:00 2001 From: RockYang Date: Tue, 25 Jun 2024 18:59:27 +0800 Subject: [PATCH] feat: new UI for chat file manager is ready --- api/core/types/web.go | 1 + api/handler/chatimpl/chat_handler.go | 2 +- api/handler/upload_handler.go | 23 +++- api/main.go | 2 +- web/.env.development | 2 +- web/.env.production | 2 +- web/public/images/ext/doc.png | Bin 4901 -> 5208 bytes web/public/images/ext/ppt.png | Bin 3442 -> 12734 bytes web/public/images/ext/xls.png | Bin 3220 -> 4809 bytes web/src/assets/css/chat-plus.styl | 40 +++--- web/src/components/ChatPrompt.vue | 182 +++++++++++++++++++++------ web/src/components/FileList.vue | 114 +++++++++++++++++ web/src/components/FileSelect.vue | 37 ++---- web/src/store/system.js | 34 +++++ web/src/utils/libs.js | 17 +-- web/src/views/ChatPlus.vue | 43 +++++-- 16 files changed, 386 insertions(+), 113 deletions(-) create mode 100644 web/src/components/FileList.vue diff --git a/api/core/types/web.go b/api/core/types/web.go index 08f5ee90..aecf8e61 100644 --- a/api/core/types/web.go +++ b/api/core/types/web.go @@ -22,6 +22,7 @@ type WsMessage struct { Type WsMsgType `json:"type"` // 消息类别,start, end, img Content interface{} `json:"content"` } + type WsMsgType string const ( diff --git a/api/handler/chatimpl/chat_handler.go b/api/handler/chatimpl/chat_handler.go index bd6ab8d3..a99c2897 100644 --- a/api/handler/chatimpl/chat_handler.go +++ b/api/handler/chatimpl/chat_handler.go @@ -348,7 +348,7 @@ func (h *ChatHandler) sendMessage(ctx context.Context, session *types.ChatSessio } data = append(data, gin.H{ "type": "text", - "text": text, + "text": strings.TrimSpace(text), }) content = data } else { diff --git a/api/handler/upload_handler.go b/api/handler/upload_handler.go index af37f972..183606da 100644 --- a/api/handler/upload_handler.go +++ b/api/handler/upload_handler.go @@ -9,6 +9,7 @@ package handler import ( "geekai/core" + "geekai/core/types" "geekai/service/oss" "geekai/store/model" "geekai/store/vo" @@ -35,6 +36,12 @@ func (h *UploadHandler) Upload(c *gin.Context) { return } + logger.Info("upload file: %s", file.Name) + // cut the file name if it's too long + if len(file.Name) > 100 { + file.Name = file.Name[:90] + file.Ext + } + userId := h.GetLoginUserId(c) res := h.DB.Create(&model.File{ UserId: int(userId), @@ -54,10 +61,24 @@ func (h *UploadHandler) Upload(c *gin.Context) { } func (h *UploadHandler) List(c *gin.Context) { + var data struct { + Urls []string `json:"urls"` + } + if err := c.ShouldBindJSON(&data); err != nil { + resp.ERROR(c, types.InvalidArgs) + return + } + logger.Info(data) + userId := h.GetLoginUserId(c) var items []model.File var files = make([]vo.File, 0) - h.DB.Where("user_id = ?", userId).Find(&items) + session := h.DB.Session(&gorm.Session{}) + session = session.Where("user_id = ?", userId) + if len(data.Urls) > 0 { + session = session.Where("url IN ?", data.Urls) + } + session.Find(&items) if len(items) > 0 { for _, v := range items { var file vo.File diff --git a/api/main.go b/api/main.go index e26d07ff..b2c40dd6 100644 --- a/api/main.go +++ b/api/main.go @@ -255,7 +255,7 @@ func main() { }), fx.Invoke(func(s *core.AppServer, h *handler.UploadHandler) { s.Engine.POST("/api/upload", h.Upload) - s.Engine.GET("/api/upload/list", h.List) + s.Engine.POST("/api/upload/list", h.List) s.Engine.GET("/api/upload/remove", h.Remove) }), fx.Invoke(func(s *core.AppServer, h *handler.SmsHandler) { diff --git a/web/.env.development b/web/.env.development index ec9467e1..5a9770cd 100644 --- a/web/.env.development +++ b/web/.env.development @@ -6,4 +6,4 @@ VUE_APP_ADMIN_USER=admin VUE_APP_ADMIN_PASS=admin123 VUE_APP_KEY_PREFIX=ChatPLUS_DEV_ VUE_APP_TITLE="Geek-AI 创作系统" -VUE_APP_VERSION=v4.0.9 +VUE_APP_VERSION=v4.1.0 diff --git a/web/.env.production b/web/.env.production index 74545d1d..8afbdcae 100644 --- a/web/.env.production +++ b/web/.env.production @@ -2,4 +2,4 @@ VUE_APP_API_HOST= VUE_APP_WS_HOST= VUE_APP_KEY_PREFIX=ChatPLUS_ VUE_APP_TITLE="Geek-AI 创作系统" -VUE_APP_VERSION=v4.0.9 +VUE_APP_VERSION=v4.1.0 diff --git a/web/public/images/ext/doc.png b/web/public/images/ext/doc.png index 9e2c3696e7311068326e3851f8694644f8388fb6..465c78f2bf994ee7817e0b3172bfe1fe41eb8014 100644 GIT binary patch literal 5208 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 XOOo>%=Z*Z+Dg^G{($U0fScd->3@oh> literal 4901 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 Ef*88vSO5S3 literal 3442 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 diff --git a/web/public/images/ext/xls.png b/web/public/images/ext/xls.png index 1897bdc3a6fce9d7d30fa21fa5f0b81a3324b0da..c7893c98ec1603e7da10e878d69bc696d9a3a1af 100644 GIT binary patch literal 4809 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 diff --git a/web/src/assets/css/chat-plus.styl b/web/src/assets/css/chat-plus.styl index 61522fe7..4e32cb3e 100644 --- a/web/src/assets/css/chat-plus.styl +++ b/web/src/assets/css/chat-plus.styl @@ -252,25 +252,35 @@ $borderColor = #4676d0; border: 2px solid #21AA93 border-radius 10px padding 10px + background-color #F4F4F4 - - .prompt-input::-webkit-scrollbar { - width: 0; - height: 0; - } - - .prompt-input { + .input-inner { + display flex + flex-flow column width 100% - line-height: 24px - border none - font-size 14px - background none - resize: none - white-space: pre-wrap; /* 保持文本换行 */ - word-wrap: break-word; /* 允许单词换行 */ - overflow-wrap: break-word; /* 允许长单词换行,适用于现代浏览器 */ + + .file-list { + padding-bottom 10px + } + .prompt-input::-webkit-scrollbar { + width: 0; + height: 0; + } + + .prompt-input { + width 100% + line-height: 24px + border none + font-size 14px + background none + resize: none + white-space: pre-wrap; /* 保持文本换行 */ + word-wrap: break-word; /* 允许单词换行 */ + overflow-wrap: break-word; /* 允许长单词换行,适用于现代浏览器 */ + } } + .send-btn { width 32px margin-left 10px diff --git a/web/src/components/ChatPrompt.vue b/web/src/components/ChatPrompt.vue index fcd924e2..eda29117 100644 --- a/web/src/components/ChatPrompt.vue +++ b/web/src/components/ChatPrompt.vue @@ -6,6 +6,25 @@
+
+
+
+ +
+
+
+ +
+
+
{{file.name}}
+
+ {{GetFileType(file.ext)}} + {{FormatFileSize(file.size)}} +
+
+
+
+
{{ createdAt }} @@ -17,50 +36,87 @@
- @@ -92,10 +148,58 @@ export default defineComponent({ .chat-item { width 100% - position: relative; padding: 0 5px 0 0; overflow: hidden; + .file-list-box { + display flex + flex-flow column + .image { + display flex + flex-flow row + margin-right 10px + position relative + + .el-image { + border 1px solid #e3e3e3 + border-radius 10px + margin-bottom 10px + } + } + .item { + display flex + flex-flow row + border-radius 10px + background-color #ffffff + border 1px solid #e3e3e3 + padding 6px + margin-bottom 10px + + .icon { + .el-image { + width 40px + height 40px + } + } + .body { + margin-left 8px + font-size 14px + .title { + font-weight bold + line-height 24px + color #0D0D0D + } + .info { + color #B4B4B4 + + span { + margin-right 10px + } + } + } + } + } + .content { word-break break-word; padding: 6px 10px; @@ -149,4 +253,4 @@ export default defineComponent({ } - \ No newline at end of file + diff --git a/web/src/components/FileList.vue b/web/src/components/FileList.vue new file mode 100644 index 00000000..950788dd --- /dev/null +++ b/web/src/components/FileList.vue @@ -0,0 +1,114 @@ + + + + + \ No newline at end of file diff --git a/web/src/components/FileSelect.vue b/web/src/components/FileSelect.vue index 97fc847f..5690f700 100644 --- a/web/src/components/FileSelect.vue +++ b/web/src/components/FileSelect.vue @@ -1,5 +1,5 @@