Files
yinghuoapi/frontend/src/components/layout
IanShaw027 ecfad788d9 feat(全栈): 实现简易模式核心功能
**功能概述**:
实现简易模式(Simple Mode),为个人用户和小团队提供简化的使用体验,隐藏复杂的分组、订阅、配额等概念。

**后端改动**:
1. 配置系统
   - 新增 run_mode 配置项(standard/simple)
   - 支持环境变量 RUN_MODE
   - 默认值为 standard

2. 数据库初始化
   - 自动创建3个默认分组:anthropic-default、openai-default、gemini-default
   - 默认分组配置:无并发限制、active状态、非独占
   - 幂等性保证:重复启动不会重复创建

3. 账号管理
   - 创建账号时自动绑定对应平台的默认分组
   - 如果未指定分组,自动查找并绑定默认分组

**前端改动**:
1. 状态管理
   - authStore 新增 isSimpleMode 计算属性
   - 从后端API获取并同步运行模式

2. UI隐藏
   - 侧边栏:隐藏分组管理、订阅管理、兑换码菜单
   - 账号管理页面:隐藏分组列
   - 创建/编辑账号对话框:隐藏分组选择器

3. 路由守卫
   - 限制访问分组、订阅、兑换码相关页面
   - 访问受限页面时自动重定向到仪表板

**配置示例**:
```yaml
run_mode: simple

run_mode: standard
```

**影响范围**:
- 后端:配置、数据库迁移、账号服务
- 前端:认证状态、路由、UI组件
- 部署:配置文件示例

**兼容性**:
- 简易模式和标准模式可无缝切换
- 不需要数据迁移
- 现有数据不受影响
2025-12-29 03:24:15 +08:00
..

Layout Components

Vue 3 layout components for the Sub2API frontend, built with Composition API, TypeScript, and TailwindCSS.

Components

1. AppLayout.vue

Main application layout with sidebar and header.

Usage:

<template>
  <AppLayout>
    <!-- Your page content here -->
    <h1>Dashboard</h1>
    <p>Welcome to your dashboard!</p>
  </AppLayout>
</template>

<script setup lang="ts">
import { AppLayout } from '@/components/layout'
</script>

Features:

  • Responsive sidebar (collapsible)
  • Fixed header at top
  • Main content area with slot
  • Automatically adjusts margin based on sidebar state

2. AppSidebar.vue

Navigation sidebar with user and admin sections.

Features:

  • Logo/brand at top
  • User navigation links:
    • Dashboard
    • API Keys
    • Usage
    • Redeem
    • Profile
  • Admin navigation links (shown only if user is admin):
    • Admin Dashboard
    • Users
    • Groups
    • Accounts
    • Proxies
    • Redeem Codes
  • Collapsible sidebar with toggle button
  • Active route highlighting
  • Icons using HTML entities
  • Responsive (mobile-friendly)

Used automatically by AppLayout - no need to import separately.


3. AppHeader.vue

Top header with user info and actions.

Features:

  • Mobile menu toggle button
  • Page title (from route meta or slot)
  • User balance display (desktop only)
  • User dropdown menu with:
    • Profile link
    • Logout button
  • User avatar with initials
  • Click-outside handling for dropdown
  • Responsive design

Usage with custom title:

<template>
  <AppLayout>
    <template #title> Custom Page Title </template>

    <!-- Your content -->
  </AppLayout>
</template>

Used automatically by AppLayout - no need to import separately.


4. AuthLayout.vue

Simple centered layout for authentication pages (login/register).

Usage:

<template>
  <AuthLayout>
    <!-- Login/Register form content -->
    <h2 class="mb-6 text-2xl font-bold">Login</h2>

    <form @submit.prevent="handleLogin">
      <!-- Form fields -->
    </form>

    <!-- Optional footer slot -->
    <template #footer>
      <p>
        Don't have an account?
        <router-link to="/register" class="text-indigo-600 hover:underline"> Sign up </router-link>
      </p>
    </template>
  </AuthLayout>
</template>

<script setup lang="ts">
import { AuthLayout } from '@/components/layout'

function handleLogin() {
  // Login logic
}
</script>

Features:

  • Centered card container
  • Gradient background
  • Logo/brand at top
  • Main content slot
  • Optional footer slot for links
  • Fully responsive

Route Configuration

To set page titles in the header, add meta to your routes:

// router/index.ts
const routes = [
  {
    path: '/dashboard',
    component: DashboardView,
    meta: { title: 'Dashboard' }
  },
  {
    path: '/api-keys',
    component: ApiKeysView,
    meta: { title: 'API Keys' }
  }
  // ...
]

Store Dependencies

These components use the following Pinia stores:

  • useAuthStore: For user authentication state, role checking, and logout
  • useAppStore: For sidebar state management and toast notifications

Make sure these stores are properly initialized in your app.


Styling

All components use TailwindCSS utility classes. Make sure your tailwind.config.js includes the component paths:

module.exports = {
  content: ['./index.html', './src/**/*.{vue,js,ts,jsx,tsx}']
  // ...
}

Icons

Components use HTML entity icons for simplicity:

  • 📈 Chart (Dashboard)
  • 🔑 Key (API Keys)
  • 📊 Bar Chart (Usage)
  • 🎁 Gift (Redeem)
  • 👤 User (Profile)
  • 🔌 Admin
  • 👥 Users
  • 📁 Folder (Groups)
  • 🌐 Globe (Accounts)
  • 🔄 Network (Proxies)
  • 🏷 Ticket (Redeem Codes)

You can replace these with your preferred icon library (e.g., Heroicons, Font Awesome) if needed.


Mobile Responsiveness

All components are fully responsive:

  • AppSidebar: Fixed positioning on desktop, hidden by default on mobile
  • AppHeader: Shows mobile menu toggle on small screens, hides balance display
  • AuthLayout: Adapts padding and card size for mobile devices

The sidebar uses Tailwind's responsive breakpoints (md:) to adjust behavior.