From 635e6a8a1b45f734786233e2bbdc58fa4f27f165 Mon Sep 17 00:00:00 2001 From: abearxiong Date: Wed, 25 Feb 2026 01:26:01 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E8=BF=9C=E7=AB=AF?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E7=9A=84=E4=BF=9D=E5=AD=98=E5=92=8C=E5=8A=A0?= =?UTF-8?q?=E8=BD=BD=E5=8A=9F=E8=83=BD=EF=BC=8C=E4=BC=98=E5=8C=96=E4=BB=93?= =?UTF-8?q?=E5=BA=93=E5=8D=A1=E7=89=87=E6=98=BE=E7=A4=BA=E4=B8=BB=E9=A2=98?= =?UTF-8?q?=E5=92=8C=E5=8F=AF=E8=A7=81=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/auth/store.ts | 2 +- src/pages/config/page.tsx | 212 +++++++++++++++---------- src/pages/repo/components/RepoCard.tsx | 22 +-- src/pages/repo/page.tsx | 10 +- src/pages/repo/store/index.ts | 3 +- 5 files changed, 153 insertions(+), 96 deletions(-) diff --git a/src/pages/auth/store.ts b/src/pages/auth/store.ts index 524d1c3..3868caf 100644 --- a/src/pages/auth/store.ts +++ b/src/pages/auth/store.ts @@ -99,5 +99,5 @@ export const useLayoutStore = create((set, get) => ({ setLoginPageConfig: (config) => set((state) => ({ loginPageConfig: { ...state.loginPageConfig, ...config }, })), - links: [{ title: '首页', href: '/', key: 'home' }], + links: [{ title: '', href: '/', key: 'home' }], })); diff --git a/src/pages/config/page.tsx b/src/pages/config/page.tsx index e00a110..de30f2b 100644 --- a/src/pages/config/page.tsx +++ b/src/pages/config/page.tsx @@ -8,10 +8,13 @@ import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/comp import { Info } from 'lucide-react'; import { configSchema } from './store/schema'; import { toast } from 'sonner'; +import { useLayoutStore } from '../auth/store'; +import { useShallow } from 'zustand/shallow'; +import { queryLogin } from '@/modules/query'; export const ConfigPage = () => { const { config, setConfig, resetConfig } = useConfigStore(); - + const layoutStore = useLayoutStore(useShallow(state => ({ me: state.me }))) const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); const result = configSchema.safeParse(config); @@ -28,6 +31,42 @@ export const ConfigPage = () => { const handleChange = (field: keyof typeof config, value: string | boolean) => { setConfig({ [field]: value }); }; + const saveToRemote = async () => { + const _config = config; + const res = await queryLogin.post({ + path: 'config', + key: 'update', + data: { + key: 'cnb_center_config.json', + data: _config, + } + }); + if (res.code === 200) { + toast.success('保存到远端成功') + } else { + toast.error('保存到远端失败') + } + } + + const loadFromRemote = async () => { + const res = await queryLogin.post({ + path: 'config', + key: 'get', + data: { + key: 'cnb_center_config.json', + } + }) + if (res.code === 404) { + toast.error('远端配置不存在') + return; + } + if (res.code === 200) { + const config = res.data?.data as typeof config; + setConfig(config); + toast.success('获取远端配置成功') + } + } + return ( @@ -51,9 +90,9 @@ export const ConfigPage = () => {

用于访问 CNB API 的密钥。 - @@ -82,9 +121,9 @@ export const ConfigPage = () => {

用于身份验证的 Cookie 信息。 - @@ -103,83 +142,92 @@ export const ConfigPage = () => { /> -

- - handleChange('CNB_CORS_URL', e.target.value)} - placeholder="https://cors.example.com" - /> -
- -
- handleChange('ENABLE_CORS', checked === true)} - /> - -
- -
- - handleChange('AI_BASE_URL', e.target.value)} - placeholder="请输入 AI 基础地址" - /> -
- -
- - handleChange('AI_MODEL', e.target.value)} - placeholder="请输入 AI 模型名称" - /> -
- -
-
- - - - - - -

- 如果使用 CNB 的 AI,密钥和 API 密钥一样即可 -

-
-
+
+ + handleChange('CNB_CORS_URL', e.target.value)} + placeholder="https://cors.example.com" + />
- handleChange('AI_API_KEY', e.target.value)} - placeholder="请输入您的 AI API 密钥" - /> -
-
- - -
- - - -
+
+ handleChange('ENABLE_CORS', checked === true)} + /> + +
+ +
+ + handleChange('AI_BASE_URL', e.target.value)} + placeholder="请输入 AI 基础地址" + /> +
+ +
+ + handleChange('AI_MODEL', e.target.value)} + placeholder="请输入 AI 模型名称" + /> +
+ +
+
+ + + + + + +

+ 如果使用 CNB 的 AI,密钥和 API 密钥一样即可 +

+
+
+
+ handleChange('AI_API_KEY', e.target.value)} + placeholder="请输入您的 AI API 密钥" + /> +
+ +
+ + + {layoutStore.me && <> + + + + } +
+ + + +
); }; diff --git a/src/pages/repo/components/RepoCard.tsx b/src/pages/repo/components/RepoCard.tsx index aaa814b..da54e53 100644 --- a/src/pages/repo/components/RepoCard.tsx +++ b/src/pages/repo/components/RepoCard.tsx @@ -246,15 +246,19 @@ export function RepoCard({ repo, onStartWorkspace, onEdit, onIssue, onSettings, - {repo.topics && ( -
- {repo.topics.split(',').map((topic: string, idx: number) => ( - - {topic.trim()} - - ))} -
- )} +
+ {repo.topics && (<> + { + repo.topics.split(',').map((topic: string, idx: number) => ( + + {topic.trim()} + + )) + } + + )} + {repo.visibility_level} +
{repo.site && (
{ const { list, refresh, loading, editRepo, setEditRepo, workspaceList, showEditDialog, setShowEditDialog, showCreateDialog, setShowCreateDialog, startWorkspace, deleteItem, setSelectedSyncRepo, setSyncDialogOpen } = useRepoStore() const [searchQuery, setSearchQuery] = useState('') - + const navigate = useNavigate(); useEffect(() => { refresh({ showTips: false }) }, []) @@ -73,7 +74,10 @@ export const App = () => {
-

仓库列表

+

+ 仓库列表 + navigate({ to: '/config' })} /> +

共 {list.length} 个仓库

diff --git a/src/pages/repo/store/index.ts b/src/pages/repo/store/index.ts index c7ec674..43fba0e 100644 --- a/src/pages/repo/store/index.ts +++ b/src/pages/repo/store/index.ts @@ -20,7 +20,8 @@ interface Data { name: string; freeze: boolean; status: number; - visibility_level: string; + // Public, Private + visibility_level: string; flags: string; created_at: string; updated_at: string;