diff --git a/CHANGELOG.md b/CHANGELOG.md index 71c479de..053c0855 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,8 +5,8 @@ - 功能优化:开启图形验证码功能的时候现检查是否配置了 API 服务,防止开启之后没法登录的 Bug。 - 功能优化:支持原生的 DeepSeek 推理模型 API,聊天 API KEY 支持设置完整的 API 路径,比如 https://api.geekai.pro/v1/chat/completions - 功能优化:支持 GPT-4o 图片编辑功能。 -- 功能新增:对话页面支持AI输出语音播报(TTS)。 -- 功能新增:支持 Goole 账号登录。 +- 功能新增:对话页面支持 AI 输出语音播报(TTS)。 +- 功能优化:替换瀑布流组件,优化用户体验。 ## v4.2.1 diff --git a/api/core/app_server.go b/api/core/app_server.go index 8b4d83ac..7302678b 100644 --- a/api/core/app_server.go +++ b/api/core/app_server.go @@ -112,19 +112,23 @@ func corsMiddleware() gin.HandlerFunc { return func(c *gin.Context) { method := c.Request.Method origin := c.Request.Header.Get("Origin") + + // 设置允许的请求源 if origin != "" { - // 设置允许的请求源 c.Header("Access-Control-Allow-Origin", origin) - c.Header("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE, UPDATE") - //允许跨域设置可以返回其他子段,可以自定义字段 - c.Header("Access-Control-Allow-Headers", "Authorization, Body-Length, Body-Type, Admin-Authorization,content-type") - // 允许浏览器(客户端)可以解析的头部 (重要) - c.Header("Access-Control-Expose-Headers", "Body-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers") - //设置缓存时间 - c.Header("Access-Control-Max-Age", "172800") - //允许客户端传递校验信息比如 cookie (重要) - c.Header("Access-Control-Allow-Credentials", "true") + } else { + c.Header("Access-Control-Allow-Origin", "*") } + + c.Header("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE, UPDATE") + //允许跨域设置可以返回其他子段,可以自定义字段 + c.Header("Access-Control-Allow-Headers", "Authorization, Body-Length, Body-Type, Admin-Authorization,content-type") + // 允许浏览器(客户端)可以解析的头部 (重要) + c.Header("Access-Control-Expose-Headers", "Body-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers") + //设置缓存时间 + c.Header("Access-Control-Max-Age", "172800") + //允许客户端传递校验信息比如 cookie (重要) + c.Header("Access-Control-Allow-Credentials", "true") if method == http.MethodOptions { c.JSON(http.StatusOK, "ok!") diff --git a/web/package.json b/web/package.json index 98515624..a7ea40e6 100644 --- a/web/package.json +++ b/web/package.json @@ -32,14 +32,13 @@ "pinia": "^2.1.4", "qrcode": "^1.5.3", "qs": "^6.11.1", - "@better-scroll/core": "^2.5.1", + "@better-scroll/core": "^2.5.1", "@better-scroll/mouse-wheel": "^2.5.1", "@better-scroll/observe-dom": "^2.5.1", "@better-scroll/pull-up": "^2.5.1", "@better-scroll/scroll-bar": "^2.5.1", "sortablejs": "^1.15.0", "three": "^0.128.0", - "v3-waterfall": "^1.3.3", "vant": "^4.5.0", "vue": "^3.2.13", "vue-router": "^4.0.15", diff --git a/web/src/assets/img/loading.gif b/web/src/assets/img/loading.gif new file mode 100644 index 00000000..a0fcc9e6 Binary files /dev/null and b/web/src/assets/img/loading.gif differ diff --git a/web/src/assets/img/371731933156_.pic.jpg b/web/src/assets/img/logo2.jpg similarity index 100% rename from web/src/assets/img/371731933156_.pic.jpg rename to web/src/assets/img/logo2.jpg diff --git a/web/src/store/sharedata.js b/web/src/store/sharedata.js index 9fc0eda8..4073a1ed 100644 --- a/web/src/store/sharedata.js +++ b/web/src/store/sharedata.js @@ -1,5 +1,82 @@ import {defineStore} from "pinia"; import Storage from "good-storage"; +import errorIcon from "@/assets/img/failed.png"; +import loadingIcon from "@/assets/img/loading.gif"; + +let waterfallOptions = { + // 唯一key值 + rowKey: "id", + // 卡片之间的间隙 + gutter: 10, + // 是否有周围的gutter + hasAroundGutter: true, + // 卡片在PC上的宽度 + width: 200, + // 自定义行显示个数,主要用于对移动端的适配 + breakpoints: { + 3840: { + // 4K下 + rowPerView: 8, + }, + 2560: { + // 2K下 + rowPerView: 7, + }, + 1920: { + // 2K下 + rowPerView: 6, + }, + 1600: { + // 2K下 + rowPerView: 5, + }, + 1366: { + // 2K下 + rowPerView: 4, + }, + 800: { + // 当屏幕宽度小于等于800 + rowPerView: 3, + }, + 500: { + // 当屏幕宽度小于等于500 + rowPerView: 2, + }, + }, + // 动画效果 + animationEffect: "animate__fadeInUp", + // 动画时间 + animationDuration: 1000, + // 动画延迟 + animationDelay: 300, + animationCancel: false, + // 背景色 + backgroundColor: "", + // imgSelector + imgSelector: "img_thumb", + // 是否跨域 + crossOrigin: true, + // 加载配置 + loadProps: { + loading: loadingIcon, + error: errorIcon, + ratioCalculator: (width, height) => { + const minRatio = 3 / 4; + const maxRatio = 4 / 3; + const curRatio = height / width; + if (curRatio < minRatio) { + return minRatio; + } else if (curRatio > maxRatio) { + return maxRatio; + } else { + return curRatio; + } + }, + }, + // 是否懒加载 + lazyload: true, + align: "center", +} export const useSharedStore = defineStore("shared", { state: () => ({ @@ -11,6 +88,7 @@ export const useSharedStore = defineStore("shared", { isLogin: false, chatListExtend: Storage.get("chat_list_extend", true), ttsModel: Storage.get("tts_model", ""), + waterfallOptions, }), getters: {}, actions: { diff --git a/web/src/views/Dalle.vue b/web/src/views/Dalle.vue index 2387d172..b48b4d73 100644 --- a/web/src/views/Dalle.vue +++ b/web/src/views/Dalle.vue @@ -11,8 +11,18 @@ @@ -24,7 +34,12 @@ @@ -36,7 +51,12 @@ @@ -48,9 +68,18 @@