Quellcode durchsuchen

feat:修改系统默认的系统名称,增加readme说明文件,将代理地址提取到.env

韩洋 vor 1 Monat
Ursprung
Commit
d146338e55

+ 180 - 0
default/README.md

@@ -0,0 +1,180 @@
+# Linwit Token Web
+
+Linwit Token Web 是一个面向 AI Token 平台的前端单页应用,提供门户展示、用户控制台、模型浏览、渠道管理、API Key 管理、钱包充值、个人资料、Playground 调试以及系统设置等能力。
+
+项目基于 React、TypeScript 与 Rsbuild 构建,采用文件路由、服务端状态管理、统一 API 请求封装和功能模块化目录结构,适合作为 AI 网关、模型分发、Token 计费与平台管理类系统的前端入口。
+
+## 项目特点
+
+- 基于 React 19 与 TypeScript,使用函数式组件和 Hooks 开发。
+- 使用 TanStack Router 文件路由,路由结构清晰,支持认证守卫与嵌套路由布局。
+- 使用 TanStack Query 管理服务端状态,统一处理缓存、请求状态与数据刷新。
+- 使用 Axios 封装统一 API 请求实例,支持 Cookie 会话、请求去重与错误处理。
+- 使用 Zustand 管理本地认证状态和必要的客户端状态。
+- 使用 Tailwind CSS、Base UI、Hugeicons、Lucide 等构建现代化界面。
+- 支持 i18next 国际化,适合多语言平台扩展。
+- 使用 Rsbuild / Rspack 构建,开发体验和生产构建性能较好。
+
+## 技术栈
+
+| 分类 | 技术 |
+| --- | --- |
+| 基础框架 | React 19、TypeScript |
+| 构建工具 | Rsbuild、Rspack |
+| 路由 | TanStack Router |
+| 服务端状态 | TanStack Query |
+| 本地状态 | Zustand |
+| 请求库 | Axios |
+| UI 与样式 | Tailwind CSS、Base UI、shadcn 风格组件、Hugeicons、Lucide、Sonner |
+| 表单与校验 | React Hook Form、Zod、@hookform/resolvers |
+| 表格与虚拟列表 | TanStack Table、TanStack Virtual |
+| 国际化 | i18next、react-i18next、i18next-browser-languagedetector |
+| 图表 | VisActor VChart、React VChart、Recharts |
+| Markdown / 代码展示 | marked、shiki、CodeMirror、KaTeX |
+| 工程质量 | oxlint、oxfmt、knip |
+
+## 目录结构
+
+```text
+default
+├── public                 # 静态资源,如 logo、favicon、支付图标等
+├── scripts                # 工程脚本,如格式化、版权、国际化同步
+├── src                    # 应用源码
+│   ├── components         # 通用组件、布局组件、UI 基础组件
+│   ├── context            # 全局 React Context
+│   ├── features           # 业务功能模块
+│   ├── hooks              # 通用 Hooks
+│   ├── i18n               # 国际化配置与语言资源
+│   ├── lib                # API、工具函数、通用逻辑
+│   ├── routes             # TanStack Router 文件路由
+│   ├── stores             # Zustand 状态管理
+│   ├── styles             # 全局样式
+│   ├── main.tsx           # 应用入口
+│   └── routeTree.gen.ts   # 路由树生成文件
+├── index.html             # HTML 模板
+├── package.json           # 项目依赖与脚本
+├── rsbuild.config.ts      # Rsbuild 构建配置
+└── tsconfig*.json         # TypeScript 配置
+```
+
+## 主要模块
+
+- `src/routes`:应用路由入口,包含公开页面、认证页面和受保护后台页面。
+- `src/routes/_authenticated`:需要登录后访问的后台路由分组。
+- `src/features/auth`:登录、注册、找回密码等认证相关功能。
+- `src/features/dashboard`:控制台与概览相关功能。
+- `src/features/models`:模型展示、模型分组与模型相关页面。
+- `src/features/channels`:渠道管理相关功能。
+- `src/features/keys`:API Key 管理相关功能。
+- `src/features/pricing`:价格展示与计费相关页面。
+- `src/features/profile`:用户资料、账户设置与个人中心。
+- `src/features/playground`:模型调用体验与调试页面。
+- `src/features/system-settings`:系统配置与管理后台相关能力。
+
+## 应用入口与运行流程
+
+1. 浏览器加载 `index.html`,通过 `#root` 挂载 React 应用。
+2. `src/main.tsx` 创建 `QueryClient` 和 TanStack Router。
+3. 路由使用 `src/routeTree.gen.ts` 中生成的路由树。
+4. 应用外层注入 Query、主题、字体方向、路由等全局 Provider。
+5. 根路由检查系统初始化状态,未完成初始化时进入 `/setup`。
+6. 受保护路由会检查本地认证状态,并通过 `/api/user/self` 验证当前会话。
+
+## API 请求说明
+
+统一请求封装位于 `src/lib/api.ts`:
+
+- 默认使用同源接口,`baseURL` 为空。
+- 开启 `withCredentials`,用于携带 Cookie / Session。
+- 对并发 GET 请求进行去重,减少重复接口调用。
+- 统一处理业务错误、登录过期、401 状态和 toast 提示。
+- 基础接口如获取当前用户、系统状态等也集中在该文件中。
+
+开发环境接口代理在 `rsbuild.config.ts` 中配置,默认代理路径包括:
+
+- `/api`
+- `/mj`
+- `/pg`
+
+本地开发后端地址通过 `.env` 中的 `VITE_REACT_APP_SERVER_URL` 配置;未配置时默认使用 `http://localhost:3000`。
+
+## 常用命令
+
+项目使用 Bun 作为包管理器。
+
+```bash
+bun install
+```
+
+启动开发环境:
+
+```bash
+bun run dev
+```
+
+生产构建:
+
+```bash
+bun run build
+```
+
+类型检查:
+
+```bash
+bun run typecheck
+```
+
+代码检查:
+
+```bash
+bun run lint
+```
+
+格式化:
+
+```bash
+bun run format
+```
+
+同步国际化资源:
+
+```bash
+bun run i18n:sync
+```
+
+预览生产构建:
+
+```bash
+bun run preview
+```
+
+## 开发约定
+
+- 页面路由优先放在 `src/routes`,具体业务实现放在对应的 `src/features/<feature>` 中。
+- 通用组件放在 `src/components`,业务组件优先放在所属 feature 内。
+- 请求接口优先复用 `src/lib/api.ts` 中的统一 Axios 实例。
+- 服务端数据获取优先使用 TanStack Query。
+- 本地全局状态优先使用 Zustand,并按功能拆分 store。
+- 面向用户的文案应接入 i18n,避免直接写死在组件中。
+- 新增 TypeScript / TSX 代码后应执行类型检查和 lint 检查。
+- 不要手动修改 `src/routeTree.gen.ts`,它由 TanStack Router 插件生成。
+
+## 构建与部署
+
+- 构建入口:`src/main.tsx`
+- HTML 模板:`index.html`
+- 构建配置:`rsbuild.config.ts`
+- 生产输出目录:`dist`
+- SPA 部署时需要将前端路由回退到 `index.html`
+
+仓库中已包含 `netlify.toml`,用于在 Netlify 部署时将所有路径回退到 `/index.html`。
+
+## 适合阅读的关键文件
+
+- `src/main.tsx`:理解应用启动和全局 Provider。
+- `src/routes/__root.tsx`:理解根路由、初始化检查和全局错误边界。
+- `src/routes/_authenticated/route.tsx`:理解登录态校验和后台路由保护。
+- `src/components/layout/components/authenticated-layout.tsx`:理解后台整体布局。
+- `src/lib/api.ts`:理解接口请求、错误处理和会话逻辑。
+- `src/stores/auth-store.ts`:理解认证状态在前端如何保存与恢复。
+- `rsbuild.config.ts`:理解构建入口、路径别名、代理和生产构建配置。

+ 2 - 2
default/index.html

@@ -7,8 +7,8 @@
     <meta name="google" content="notranslate" />
 
     <!-- Primary Meta Tags -->
-    <title>New API</title>
-    <meta name="title" content="New API" />
+    <title>灵慧云智Token管理平台</title>
+    <meta name="title" content="灵慧云智Token管理平台" />
     <meta
       name="description"
       content="Unified AI API gateway and admin dashboard."

+ 1 - 1
default/package.json

@@ -1,5 +1,5 @@
 {
-  "name": "newapi-web",
+  "name": "linwit-token-web",
   "version": "1.0.0",
   "private": false,
   "type": "module",

+ 1 - 1
default/rsbuild.config.ts

@@ -13,7 +13,7 @@ export default defineConfig(({ envMode }) => {
   const serverUrl =
     process.env.VITE_REACT_APP_SERVER_URL ||
     env.rawPublicVars.VITE_REACT_APP_SERVER_URL ||
-    'http://192.168.100.26:3000'
+    'http://localhost:3000'
 
   const isProd = envMode === 'production'
   const devProxy = Object.fromEntries(

+ 1 - 1
default/src/assets/logo.tsx

@@ -36,7 +36,7 @@ export function Logo({ className, ...props }: SVGProps<SVGSVGElement>) {
       className={cn('size-6', className)}
       {...props}
     >
-      <title>New API</title>
+      <title>灵慧云智Token管理平台</title>
       <path d='M15 6v12a3 3 0 1 0 3-3H6a3 3 0 1 0 3 3V6a3 3 0 1 0-3 3h12a3 3 0 1 0-3-3' />
     </svg>
   )

+ 2 - 2
default/src/components/layout/components/footer.tsx

@@ -134,7 +134,7 @@ function ProjectAttribution(props: { currentYear: number; inline?: boolean }) {
         rel='noopener noreferrer'
         className='text-foreground/70 hover:text-foreground font-medium transition-colors'
       >
-        {t('New API')}
+        {t('灵慧云智Token管理平台')}
       </a>
       . {t(NEW_API_FOOTER_ATTRIBUTION_KEY)}
     </span>
@@ -159,7 +159,7 @@ export function Footer(props: FooterProps) {
   } = useSystemConfig()
 
   const displayLogo = systemLogo || props.logo || '/logo.png'
-  const displayName = systemName || props.name || 'New API'
+  const displayName = systemName || props.name || '灵慧云智Token管理平台'
   const isDemoSiteMode = Boolean(demoSiteEnabled)
   const currentYear = new Date().getFullYear()
 

+ 1 - 1
default/src/components/layout/components/system-brand.tsx

@@ -51,7 +51,7 @@ export function SystemBrand(props: SystemBrandProps) {
   const { logo } = useSystemConfig()
 
   const variant = props.variant ?? 'sidebar'
-  const name = status?.system_name || props.defaultName || 'New API'
+  const name = status?.system_name || props.defaultName || '灵慧云智Token管理平台'
   const version =
     status?.version || props.defaultVersion || t('Unknown version')
 

+ 1 - 1
default/src/features/system-settings/site/index.tsx

@@ -27,7 +27,7 @@ import {
 const defaultSiteSettings: SiteSettings = {
   'theme.frontend': 'default',
   Notice: '',
-  SystemName: 'New API',
+  SystemName: '灵慧云智Token管理平台',
   Logo: '',
   Footer: '',
   About: '',

+ 1 - 1
default/src/lib/constants.ts

@@ -21,7 +21,7 @@ For commercial licensing, please contact support@quantumnous.com
  */
 
 // System Configuration Defaults
-export const DEFAULT_SYSTEM_NAME = 'New API'
+export const DEFAULT_SYSTEM_NAME = '灵慧云智Token管理平台'
 export const DEFAULT_LOGO = '/logo.png'
 
 // LocalStorage Keys