diff --git a/common/constants.go b/common/constants.go index 212649a..06986e5 100644 --- a/common/constants.go +++ b/common/constants.go @@ -21,6 +21,7 @@ var Footer = "" var Logo = "" var TopUpLink = "" var ChatLink = "" +var ChatLink2 = "" var QuotaPerUnit = 500 * 1000.0 // $0.002 / 1K tokens var DisplayInCurrencyEnabled = true var DisplayTokenStatEnabled = true diff --git a/controller/misc.go b/controller/misc.go index e8dc843..1264f5d 100644 --- a/controller/misc.go +++ b/controller/misc.go @@ -31,6 +31,7 @@ func GetStatus(c *gin.Context) { "turnstile_site_key": common.TurnstileSiteKey, "top_up_link": common.TopUpLink, "chat_link": common.ChatLink, + "chat_link2": common.ChatLink2, "quota_per_unit": common.QuotaPerUnit, "display_in_currency": common.DisplayInCurrencyEnabled, "enable_batch_update": common.BatchUpdateEnabled, diff --git a/model/option.go b/model/option.go index 5a1b453..94b5bee 100644 --- a/model/option.go +++ b/model/option.go @@ -76,6 +76,7 @@ func InitOptionMap() { common.OptionMap["GroupRatio"] = common.GroupRatio2JSONString() common.OptionMap["TopUpLink"] = common.TopUpLink common.OptionMap["ChatLink"] = common.ChatLink + common.OptionMap["ChatLink2"] = common.ChatLink2 common.OptionMap["QuotaPerUnit"] = strconv.FormatFloat(common.QuotaPerUnit, 'f', -1, 64) common.OptionMap["RetryTimes"] = strconv.Itoa(common.RetryTimes) common.OptionMap["DataExportInterval"] = strconv.Itoa(common.DataExportInterval) @@ -241,6 +242,8 @@ func updateOptionMap(key string, value string) (err error) { common.TopUpLink = value case "ChatLink": common.ChatLink = value + case "ChatLink2": + common.ChatLink2 = value case "ChannelDisableThreshold": common.ChannelDisableThreshold, _ = strconv.ParseFloat(value, 64) case "QuotaPerUnit": diff --git a/web/src/App.js b/web/src/App.js index 02db609..e980397 100644 --- a/web/src/App.js +++ b/web/src/App.js @@ -57,6 +57,11 @@ function App() { } else { localStorage.removeItem('chat_link'); } + if (data.chat_link2) { + localStorage.setItem('chat_link2', data.chat_link2); + } else { + localStorage.removeItem('chat_link2'); + } // if ( // data.version !== process.env.REACT_APP_VERSION && // data.version !== 'v0.0.0' && diff --git a/web/src/components/OperationSetting.js b/web/src/components/OperationSetting.js index 88f2d92..efa4914 100644 --- a/web/src/components/OperationSetting.js +++ b/web/src/components/OperationSetting.js @@ -15,6 +15,7 @@ const OperationSetting = () => { GroupRatio: '', TopUpLink: '', ChatLink: '', + ChatLink2: '', // 添加的新状态变量 QuotaPerUnit: 0, AutomaticDisableChannelEnabled: '', ChannelDisableThreshold: 0, @@ -141,6 +142,9 @@ const OperationSetting = () => { if (originInputs['ChatLink'] !== inputs.ChatLink) { await updateOption('ChatLink', inputs.ChatLink); } + if (originInputs['ChatLink2'] !== inputs.ChatLink2) { + await updateOption('ChatLink2', inputs.ChatLink2); + } if (originInputs['QuotaPerUnit'] !== inputs.QuotaPerUnit) { await updateOption('QuotaPerUnit', inputs.QuotaPerUnit); } @@ -179,7 +183,7 @@ const OperationSetting = () => { placeholder='例如发卡网站的购买链接' /> { type='link' placeholder='例如 ChatGPT Next Web 的部署地址' /> + { const link_menu = [ {node: 'item', key: 'next', name: 'ChatGPT Next Web', onClick: () => {onOpenLink('next')}}, {node: 'item', key: 'ama', name: 'AMA 问天', value: 'ama'}, + {node: 'item', key: 'next-mj', name: 'ChatGPT Web & Midjourney', value: 'next-mj', onClick: () => {onOpenLink('next-mj')}}, {node: 'item', key: 'opencat', name: 'OpenCat', value: 'opencat'}, ]; @@ -150,7 +151,8 @@ const TokensTable = () => { {onOpenLink('next', record.key)}}, + {node: 'item', key: 'next', disabled: !localStorage.getItem('chat_link'), name: 'ChatGPT Next Web', onClick: () => {onOpenLink('next', record.key)}}, + {node: 'item', key: 'next-mj', disabled: !localStorage.getItem('chat_link2'), name: 'ChatGPT Web & Midjourney', onClick: () => {onOpenLink('next-mj', record.key)}}, {node: 'item', key: 'ama', name: 'AMA 问天(BotGrem)', onClick: () => {onOpenLink('ama', record.key)}}, {node: 'item', key: 'opencat', name: 'OpenCat', onClick: () => {onOpenLink('opencat', record.key)}}, ] @@ -285,6 +287,7 @@ const TokensTable = () => { } let encodedServerAddress = encodeURIComponent(serverAddress); const nextLink = localStorage.getItem('chat_link'); + const mjLink = localStorage.getItem('chat_link2'); let nextUrl; if (nextLink) { @@ -296,7 +299,7 @@ const TokensTable = () => { let url; switch (type) { case 'ama': - url = `ama://set-api-key?server=${encodedServerAddress}&key=sk-${key}`; + url = mjLink + `/#/?settings={"key":"sk-${key}","url":"${serverAddress}"}`; break; case 'opencat': url = `opencat://team/join?domain=${encodedServerAddress}&token=sk-${key}`; @@ -336,25 +339,28 @@ const TokensTable = () => { } let encodedServerAddress = encodeURIComponent(serverAddress); const chatLink = localStorage.getItem('chat_link'); + const mjLink = localStorage.getItem('chat_link2'); let defaultUrl; if (chatLink) { defaultUrl = chatLink + `/#/?settings={"key":"sk-${key}","url":"${serverAddress}"}`; - } else { - showError('管理员未设置聊天链接') - return } let url; switch (type) { case 'ama': url = `ama://set-api-key?server=${encodedServerAddress}&key=sk-${key}`; break; - case 'opencat': url = `opencat://team/join?domain=${encodedServerAddress}&token=sk-${key}`; break; - + case 'next-mj': + url = mjLink + `/#/?settings={"key":"sk-${key}","url":"${serverAddress}"}`; + break; default: + if (!chatLink) { + showError('管理员未设置聊天链接') + return; + } url = defaultUrl; }