From 15607996e6332407dd8031ffb658c9d50bf6e6b2 Mon Sep 17 00:00:00 2001 From: RedwindA Date: Thu, 5 Jun 2025 20:42:56 +0800 Subject: [PATCH 1/8] fix: change RedisHDelObj to use Del instead of HDel --- common/redis.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/redis.go b/common/redis.go index 49d3ec78..50030d2a 100644 --- a/common/redis.go +++ b/common/redis.go @@ -97,7 +97,7 @@ func RedisHDelObj(key string) error { SysLog(fmt.Sprintf("Redis HDEL: key=%s", key)) } ctx := context.Background() - return RDB.HDel(ctx, key).Err() + return RDB.Del(ctx, key).Err() } func RedisHSetObj(key string, obj interface{}, expiration time.Duration) error { From 098c1e8829c21122ebe39a0aca56d8a2721b4eac Mon Sep 17 00:00:00 2001 From: RedwindA Date: Thu, 5 Jun 2025 21:17:57 +0800 Subject: [PATCH 2/8] refactor: rename RedisHDelObj to RedisDelKey and update references --- common/redis.go | 4 ++-- model/token_cache.go | 2 +- model/user_cache.go | 5 +++-- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/common/redis.go b/common/redis.go index 50030d2a..ba35331a 100644 --- a/common/redis.go +++ b/common/redis.go @@ -92,9 +92,9 @@ func RedisDel(key string) error { return RDB.Del(ctx, key).Err() } -func RedisHDelObj(key string) error { +func RedisDelKey(key string) error { if DebugEnabled { - SysLog(fmt.Sprintf("Redis HDEL: key=%s", key)) + SysLog(fmt.Sprintf("Redis DEL Key: key=%s", key)) } ctx := context.Background() return RDB.Del(ctx, key).Err() diff --git a/model/token_cache.go b/model/token_cache.go index 0fe02fea..b2e0c951 100644 --- a/model/token_cache.go +++ b/model/token_cache.go @@ -19,7 +19,7 @@ func cacheSetToken(token Token) error { func cacheDeleteToken(key string) error { key = common.GenerateHMAC(key) - err := common.RedisHDelObj(fmt.Sprintf("token:%s", key)) + err := common.RedisDelKey(fmt.Sprintf("token:%s", key)) if err != nil { return err } diff --git a/model/user_cache.go b/model/user_cache.go index bc412e77..d74877bd 100644 --- a/model/user_cache.go +++ b/model/user_cache.go @@ -3,11 +3,12 @@ package model import ( "encoding/json" "fmt" - "github.com/gin-gonic/gin" "one-api/common" "one-api/constant" "time" + "github.com/gin-gonic/gin" + "github.com/bytedance/gopkg/util/gopool" ) @@ -57,7 +58,7 @@ func invalidateUserCache(userId int) error { if !common.RedisEnabled { return nil } - return common.RedisHDelObj(getUserCacheKey(userId)) + return common.RedisDelKey(getUserCacheKey(userId)) } // updateUserCache updates all user cache fields using hash From c4f664f376d42f61e3fef56e6e153ecfad44ccd8 Mon Sep 17 00:00:00 2001 From: RedwindA Date: Sun, 8 Jun 2025 01:16:27 +0800 Subject: [PATCH 3/8] =?UTF-8?q?=F0=9F=8E=A8=20feat(channel):=20add=20endpo?= =?UTF-8?q?int=20to=20retrieve=20models=20by=20tag?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- controller/channel.go | 41 +++++++++++++++++++++++++++++++++++++++++ router/api-router.go | 1 + 2 files changed, 42 insertions(+) diff --git a/controller/channel.go b/controller/channel.go index a31e1f47..a4ef87c3 100644 --- a/controller/channel.go +++ b/controller/channel.go @@ -623,3 +623,44 @@ func BatchSetChannelTag(c *gin.Context) { }) return } + +func GetTagModels(c *gin.Context) { + tag := c.Query("tag") + if tag == "" { + c.JSON(http.StatusBadRequest, gin.H{ + "success": false, + "message": "tag不能为空", + }) + return + } + + channels, err := model.GetChannelsByTag(tag, false) // Assuming false for idSort is fine here + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{ + "success": false, + "message": err.Error(), + }) + return + } + + var longestModels string + maxLength := 0 + + // Find the longest models string among all channels with the given tag + for _, channel := range channels { + if channel.Models != "" { + currentModels := strings.Split(channel.Models, ",") + if len(currentModels) > maxLength { + maxLength = len(currentModels) + longestModels = channel.Models + } + } + } + + c.JSON(http.StatusOK, gin.H{ + "success": true, + "message": "", + "data": longestModels, + }) + return +} diff --git a/router/api-router.go b/router/api-router.go index 1720ff57..6251c8a2 100644 --- a/router/api-router.go +++ b/router/api-router.go @@ -105,6 +105,7 @@ func SetApiRouter(router *gin.Engine) { channelRoute.GET("/fetch_models/:id", controller.FetchUpstreamModels) channelRoute.POST("/fetch_models", controller.FetchModels) channelRoute.POST("/batch/tag", controller.BatchSetChannelTag) + channelRoute.GET("/tag/models", controller.GetTagModels) } tokenRoute := apiRouter.Group("/token") tokenRoute.Use(middleware.UserAuth()) From 18f82f120cc44fd391be11332dc87d84005922ec Mon Sep 17 00:00:00 2001 From: RedwindA Date: Sun, 8 Jun 2025 01:16:39 +0800 Subject: [PATCH 4/8] =?UTF-8?q?=F0=9F=90=9B=20fix(EditTagModal):=20add=20f?= =?UTF-8?q?etchTagModels=20function=20to=20retrieve=20models=20based=20on?= =?UTF-8?q?=20tag?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/src/pages/Channel/EditTagModal.js | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/web/src/pages/Channel/EditTagModal.js b/web/src/pages/Channel/EditTagModal.js index 52dd4bbb..1b370297 100644 --- a/web/src/pages/Channel/EditTagModal.js +++ b/web/src/pages/Channel/EditTagModal.js @@ -194,6 +194,24 @@ const EditTagModal = (props) => { }, [originModelOptions, inputs.models]); useEffect(() => { + const fetchTagModels = async () => { + if (!tag) return; + setLoading(true); + try { + const res = await API.get(`/api/channel/tag/models?tag=${tag}`); + if (res?.data?.success) { + const models = res.data.data ? res.data.data.split(',') : []; + setInputs((inputs) => ({ ...inputs, models: models })); + } else { + showError(res.data.message); + } + } catch (error) { + showError(error.message); + } finally { + setLoading(false); + } + }; + setInputs({ ...originInputs, tag: tag, @@ -201,7 +219,8 @@ const EditTagModal = (props) => { }); fetchModels().then(); fetchGroups().then(); - }, [visible]); + fetchTagModels().then(); // Call the new function + }, [visible, tag]); // Add tag to dependency array const addCustomModels = () => { if (customModel.trim() === '') return; From 07f141e8c825bb05bdcfa1a9b125961b46616fc0 Mon Sep 17 00:00:00 2001 From: "Apple\\Apple" Date: Sun, 8 Jun 2025 12:14:49 +0800 Subject: [PATCH 5/8] =?UTF-8?q?=F0=9F=8E=A8=20fix:=20Import=20Semi=20UI=20?= =?UTF-8?q?CSS=20explicitly=20to=20resolve=20missing=20component=20styles?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add explicit import of '@douyinfe/semi-ui/dist/css/semi.css' in index.js - Ensures Semi Design components render with proper styling - Resolves issue where Semi components appeared unstyled after dependency updates This change addresses the style loading issue that occurred after adding antd dependency and updating the build configuration. The explicit import ensures consistent style loading regardless of plugin behavior changes. --- web/src/index.js | 1 + 1 file changed, 1 insertion(+) diff --git a/web/src/index.js b/web/src/index.js index 0f57f5a1..ef8a3a07 100644 --- a/web/src/index.js +++ b/web/src/index.js @@ -1,6 +1,7 @@ import React from 'react'; import ReactDOM from 'react-dom/client'; import { BrowserRouter } from 'react-router-dom'; +import '@douyinfe/semi-ui/dist/css/semi.css'; import { UserProvider } from './context/User'; import 'react-toastify/dist/ReactToastify.css'; import { StatusProvider } from './context/Status'; From 5040235919df1cefd5c34d60ffbf0998c988b929 Mon Sep 17 00:00:00 2001 From: "Apple\\Apple" Date: Sun, 8 Jun 2025 12:23:54 +0800 Subject: [PATCH 6/8] =?UTF-8?q?=F0=9F=92=84=20style(Logs):=20Add=20rounded?= =?UTF-8?q?=20corners=20to=20image=20view=20button=20in=20MjLogsTable?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add rounded-full class to "查看图片" (View Image) button for consistent UI styling - All other buttons in both MjLogsTable.js and TaskLogsTable.js already have rounded corners applied - Ensures uniform button styling across the log tables interface --- web/src/components/table/MjLogsTable.js | 3 ++- web/src/components/table/TaskLogsTable.js | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/web/src/components/table/MjLogsTable.js b/web/src/components/table/MjLogsTable.js index 48513eb1..b4cf046e 100644 --- a/web/src/components/table/MjLogsTable.js +++ b/web/src/components/table/MjLogsTable.js @@ -462,7 +462,7 @@ const LogsTable = () => { percent={text ? parseInt(text.replace('%', '')) : 0} showInfo={true} aria-label='drawing progress' - style={{ minWidth: '200px' }} + style={{ minWidth: '160px' }} /> } @@ -483,6 +483,7 @@ const LogsTable = () => { setModalImageUrl(text); setIsModalOpenurl(true); }} + className="!rounded-full" > {t('查看图片')} diff --git a/web/src/components/table/TaskLogsTable.js b/web/src/components/table/TaskLogsTable.js index 4e329d29..91ccc06c 100644 --- a/web/src/components/table/TaskLogsTable.js +++ b/web/src/components/table/TaskLogsTable.js @@ -395,7 +395,7 @@ const LogsTable = () => { percent={text ? parseInt(text.replace('%', '')) : 0} showInfo={true} aria-label='task progress' - style={{ minWidth: '200px' }} + style={{ minWidth: '160px' }} /> ) } From e0ff3b6f28c451a4dd9517982645b0462684c490 Mon Sep 17 00:00:00 2001 From: "Apple\\Apple" Date: Sun, 8 Jun 2025 12:38:03 +0800 Subject: [PATCH 7/8] =?UTF-8?q?=E2=9C=A8=20feat(token):=20auto-generate=20?= =?UTF-8?q?default=20token=20names=20when=20user=20input=20is=20empty?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When creating tokens, if the user doesn't provide a token name (empty or whitespace-only), the system will now automatically generate a name using the format "default-xxxxxx" where "xxxxxx" is a 6-character random alphanumeric string. This enhancement ensures that all created tokens have meaningful names and improves the user experience by removing the requirement to manually input token names for quick token creation scenarios. Changes: - Modified token creation logic to detect empty token names - Added automatic fallback to "default" base name when user input is missing - Maintained existing behavior for multiple token creation with random suffixes - Ensured consistent naming pattern across single and batch token creation --- web/src/pages/Token/EditToken.js | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/web/src/pages/Token/EditToken.js b/web/src/pages/Token/EditToken.js index 946164da..71f611bd 100644 --- a/web/src/pages/Token/EditToken.js +++ b/web/src/pages/Token/EditToken.js @@ -219,9 +219,15 @@ const EditToken = (props) => { let successCount = 0; // 记录成功创建的令牌数量 for (let i = 0; i < tokenCount; i++) { let localInputs = { ...inputs }; - if (i !== 0) { - // 如果用户想要创建多个令牌,则给每个令牌一个序号后缀 - localInputs.name = `${inputs.name}-${generateRandomSuffix()}`; + + // 检查用户是否填写了令牌名称 + const baseName = inputs.name.trim() === '' ? 'default' : inputs.name; + + if (i !== 0 || inputs.name.trim() === '') { + // 如果创建多个令牌(i !== 0)或者用户没有填写名称,则添加随机后缀 + localInputs.name = `${baseName}-${generateRandomSuffix()}`; + } else { + localInputs.name = baseName; } localInputs.remain_quota = parseInt(localInputs.remain_quota); From b197dfb95dc795b1026b89c5b4fe6f3895db6f09 Mon Sep 17 00:00:00 2001 From: RedwindA Date: Sun, 8 Jun 2025 13:23:59 +0800 Subject: [PATCH 8/8] =?UTF-8?q?=F0=9F=90=9B=20fix(EditTagModal):=20add=20i?= =?UTF-8?q?nfo=20banner=20to=20clarify=20modelList=20behavior?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/src/pages/Channel/EditTagModal.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/web/src/pages/Channel/EditTagModal.js b/web/src/pages/Channel/EditTagModal.js index 1b370297..695ed2b4 100644 --- a/web/src/pages/Channel/EditTagModal.js +++ b/web/src/pages/Channel/EditTagModal.js @@ -366,6 +366,11 @@ const EditTagModal = (props) => {
{t('模型')} +