GoWindGoWind
Home
Framework
GoWind Toolkit
  • Open Source

    • GoWind Admin (Admin Platform)
    • GoWind CMS (Content Management)
    • GoWind UBA (Behavior Analytics)
    • GoWind Shop (E-commerce)
    • GoWind Kanban (Kanban Boards)
    • GoWind Ledger (Personal Finance)
    • GoWind ShortPlay (Short Drama)
    • GoWind Ops (Operations Platform)
    • RushWind (Rust Ecosystem)
  • Open Core (Community + Enterprise)

    • GoWind OA (Office Collaboration)
    • GoWind ERP (Procure-to-Pay)
    • GoWind WMS (Warehousing)
  • Commercial

    • GoWind IM (Instant Messaging)
    • GoWind IoT (IoT Platform)
    • GoWind Edu (AI Education)
    • GoWind MES (Manufacturing Execution)
    • GoWind CDC (Data Pipeline)
    • GoWind SDP (Zero-Trust Gateway)
    • GoWind Quant (Quant Research)
    • GoWind Trade Radar (Export Sourcing)
    • GoWind Game Radar (Game Greenlight)
  • 简体中文
  • English
GitHub
Home
Framework
GoWind Toolkit
  • Open Source

    • GoWind Admin (Admin Platform)
    • GoWind CMS (Content Management)
    • GoWind UBA (Behavior Analytics)
    • GoWind Shop (E-commerce)
    • GoWind Kanban (Kanban Boards)
    • GoWind Ledger (Personal Finance)
    • GoWind ShortPlay (Short Drama)
    • GoWind Ops (Operations Platform)
    • RushWind (Rust Ecosystem)
  • Open Core (Community + Enterprise)

    • GoWind OA (Office Collaboration)
    • GoWind ERP (Procure-to-Pay)
    • GoWind WMS (Warehousing)
  • Commercial

    • GoWind IM (Instant Messaging)
    • GoWind IoT (IoT Platform)
    • GoWind Edu (AI Education)
    • GoWind MES (Manufacturing Execution)
    • GoWind CDC (Data Pipeline)
    • GoWind SDP (Zero-Trust Gateway)
    • GoWind Quant (Quant Research)
    • GoWind Trade Radar (Export Sourcing)
    • GoWind Game Radar (Game Greenlight)
  • 简体中文
  • English
GitHub
  • Introduction

    • GoWind CMS Product Introduction
    • GoWind CMS Installation Guide
  • Backend

    • CMS Backend Architecture Overview
    • CMS Backend Modules Overview
    • CMS Protobuf API Definitions
    • CMS Configuration and Deployment Guide
    • Backend Extension Mechanisms Guide
  • Frontend

    • CMS Frontend Architecture
    • CMS Frontend Modules Overview
  • Getting Started

    • Adding a Content Type, Full Stack in Practice
    • Multi-Client API Client Code Generation Tutorial
  • Core Tutorials

    • Content Multilingual Translation Tutorial
    • Content Publishing Workflow Tutorial
    • Section Editor in Practice
    • Headless API Multi-Client Integration in Practice
    • Frontend Application Development in Practice
  • Intermediate Tutorials

    • Multi-Site Management in Practice
    • Media Asset Management in Practice
    • Comment System Tutorial
    • Event Bus Architecture in Practice
    • Lua Script Extensions in Practice
  • Advanced Topics

    • Permission System in Practice
    • Dual-Client Login Security in Practice
    • Encryption and Security Toolkit Tutorial
    • Full-Text Search in Practice
    • Task Scheduling in Practice
    • Real-Time Message Push (SSE) in Practice
    • Performance Monitoring in Practice
    • Dictionary Management System Tutorial
  • Full-Stack Guides

    • Full-Stack Integration in Practice
    • Three-Service Deployment Tutorial

CMS Frontend Architecture

The GoWind CMS frontend consists of 1 admin console + 4 frontend applications. The admin console is based on Vue Vben Admin and shares the technical foundation with GoWind Admin; the four frontends use different tech stacks to consume the same Headless App API, achieving true "one backend, multiple clients".

1. Frontend Panorama

2. Admin Console

Tech Stack

TechnologyVersionDescription
Vue 33.xComposition API
Vben AdminlatestEnterprise admin framework
Ant Design Vue4.xUI component library
Vue QuerylatestServer state management
Pinia2.xClient state management
Vite5.xBuild tool
TypeScript5.xType safety

Directory Structure

frontend/admin/
├── apps/
│   └── admin/                  # CMS admin console app
│       ├── src/
│       │   ├── api/            # API layer
│       │   │   ├── client.ts   # ApiClient singleton
│       │   │   ├── index.ts    # Unified exports
│       │   │   ├── composables/ # Vue Query hooks
│       │   │   └── generated/  # Protobuf auto-generated code
│       │   ├── views/          # Page views
│       │   │   ├── content/    # Content management (posts/categories/tags/pages)
│       │   │   ├── site/       # Site management
│       │   │   ├── media/      # Media resources
│       │   │   ├── system/     # System administration (users/roles/permissions/dictionaries)
│       │   │   └── ...         # Other modules
│       │   ├── router/         # Router configuration
│       │   ├── store/          # Pinia state management
│       │   └── locales/        # i18n
│       └── ...
├── packages/                   # Monorepo shared packages
│   ├── @core/                  # Core utilities
│   ├── effects/                # Common effects
│   ├── preferences/            # Preferences
│   └── types/                  # Type definitions
├── pnpm-workspace.yaml
└── turbo.json

API Calling Pattern

The admin console uses the same Vue Query hooks pattern as GoWind Admin:

// api/composables/post.ts
import { apiClient } from '#/api/client';
import { makeUpdateMask, type PaginationQuery } from '#/transport/rest';

// List query hook
export function useListPosts(query: PaginationQuery) {
  return useQuery({
    queryKey: ['listPosts', query],
    queryFn: () => apiClient.postService.List(query.toRawParams()),
  });
}

// Create mutation
export function useCreatePost() {
  const queryClient = useQueryClient();
  return useMutation({
    mutationFn: (data: Post) => apiClient.postService.Create({ data }),
    onSuccess: () => queryClient.invalidateQueries({ queryKey: ['listPosts'] }),
  });
}

Core Feature Modules

ModuleDirectoryDescription
Post managementviews/content/post/Post CRUD + translation editing + section/block editor
Category managementviews/content/category/Category tree + translations
Tag managementviews/content/tag/Tag CRUD + translations
Page managementviews/content/page/Custom pages + translations
Site managementviews/site/Multi-site configuration
Media resourcesviews/media/Image/video/document management
System administrationviews/system/Users/roles/permissions/dictionaries

3. Comparison of the Four Frontends

Tech Stack Comparison

AspectReact (Next.js)Vue (Nuxt.js)TaroFlutter
LanguageTypeScriptTypeScriptTypeScriptDart
FrameworkNext.jsNuxt.jsTaro 4Flutter
UI libraryshadcn/ui—Taro UIMaterial
RenderingSSR + SSGSSRCSRNative rendering
State managementZustand / ContextPiniaTaro stateBLoC / Cubit
RoutingApp RouterNuxt RouterTaro Routergo_router
API generationOpenAPI GeneratorOpenAPI GeneratorOpenAPI Generatorswagger_parser + retrofit
i18nnext-intl@nuxtjs/i18nTaro i18nflutter_localizations
Target platformsPC WebPC WebMini-Program + H5Android/iOS/Web/Desktop

Applicable Scenarios

ScenarioRecommended VersionReason
Corporate website / blogReact (Next.js)SSR benefits SEO; rich ecosystem
Rapid prototypingVue (Nuxt.js)Great developer experience; convention over configuration
WeChat Mini-ProgramTaroOne codebase, multiple clients
Native mobile appFlutterTrue native experience, cross-platform

4. React Frontend in Detail (Next.js)

Directory Structure

frontend/app/react/
├── src/
│   ├── app/                    # Next.js App Router
│   │   ├── [locale]/           # i18n routes (/zh-CN, /en-US)
│   │   │   ├── page.tsx        # Home page
│   │   │   ├── posts/          # Post list + detail
│   │   │   ├── categories/     # Category list
│   │   │   ├── tags/           # Tag list
│   │   │   ├── about/          # About page
│   │   │   └── settings/       # Settings
│   │   └── layout.tsx          # Root layout
│   ├── components/             # React components
│   ├── lib/                    # Utility libraries
│   │   └── api/                # API client
│   ├── messages/               # i18n message files
│   │   ├── zh-CN.json
│   │   └── en-US.json
│   └── stores/                 # Zustand state management
├── messages/                   # Global i18n
├── .env.development            # Development environment variables
├── next.config.ts              # Next.js configuration
└── package.json

Environment Configuration

# .env.development
NEXT_PUBLIC_API_BASE_URL=http://localhost:6700/app/v1
NEXT_PUBLIC_DEFAULT_LOCALE=zh-CN

API Calling Example

// src/lib/api/post.ts
import { apiClient } from './client';

export async function getPosts(locale: string, page = 1, pageSize = 10) {
  const { data } = await apiClient.get('/posts', {
    params: { locale, page, pageSize },
  });
  return data;
}

export async function getPostBySlug(slug: string, locale: string) {
  const { data } = await apiClient.get(`/posts/${slug}`, {
    params: { locale },
  });
  return data;
}

Page Component Example

// src/app/[locale]/posts/[slug]/page.tsx
export default async function PostDetail({
  params: { locale, slug },
}: {
  params: { locale: string; slug: string };
}) {
  const post = await getPostBySlug(slug, locale);

  return (
    <article>
      <h1>{post.title}</h1>
      <div>{post.summary}</div>
      <div dangerouslySetInnerHTML={{ __html: post.content }} />
    </article>
  );
}

5. Flutter Frontend in Detail

The Flutter version has the most polished architecture design and is worth referencing for all versions.

Architecture: Feature-First + BLoC

frontend/app/flutter_app/lib/
├── core/                       # Core layer
│   ├── constants/              # Constants
│   ├── network/                # Network layer (dio + retrofit)
│   ├── storage/                # Local storage (sqflite)
│   ├── router/                 # Router configuration (go_router)
│   ├── theme/                  # Theme (light/dark)
│   └── l10n/                   # i18n
├── features/                   # Feature modules (Feature-First)
│   ├── home/                   # Home
│   │   ├── data/               # Data layer (API + Model)
│   │   ├── domain/             # Domain layer (Repository + Entity)
│   │   └── presentation/       # Presentation layer (BLoC + Widget)
│   ├── explore/                # Explore
│   ├── post_detail/            # Post detail
│   ├── post_list/              # Post list
│   ├── category/               # Categories
│   ├── tag/                    # Tags
│   ├── search/                 # Search
│   ├── bookmark/               # Bookmarks
│   ├── profile/                # Profile
│   └── settings/               # Settings
└── main.dart                   # App entry point

BLoC State Management

// features/post_detail/presentation/bloc/post_detail_bloc.dart
class PostDetailBloc extends Bloc<PostDetailEvent, PostDetailState> {
  final PostRepository repository;

  PostDetailBloc(this.repository) : super(PostDetailInitial()) {
    on<FetchPostDetail>(_onFetchPostDetail);
  }

  Future<void> _onFetchPostDetail(
    FetchPostDetail event,
    Emitter<PostDetailState> emit,
  ) async {
    emit(PostDetailLoading());
    try {
      final post = await repository.getPost(
        id: event.postId,
        locale: event.locale,
      );
      emit(PostDetailLoaded(post));
    } catch (e) {
      emit(PostDetailError(e.toString()));
    }
  }
}

Retrofit API Generation

The Flutter version auto-generates the API client from the OpenAPI documents via swagger_parser:

// Auto-generated API client
@RestApi(baseUrl: '/app/v1')
abstract class PostApi {
  factory PostApi(Dio dio, {String baseUrl}) = _PostApi;

  @GET('/posts')
  Future<ListPostResponse> listPosts({
    @Query('locale') String? locale,
    @Query('page') int? page,
    @Query('pageSize') int? pageSize,
  });

  @GET('/posts/{id}')
  Future<Post> getPost(
    @Path('id') int id, {
    @Query('locale') String? locale,
  });
}

6. Frontend API Integration

All four frontends consume the same App API and follow the same calling conventions:

Unified API Calling Conventions

Pagination Parameters

All list endpoints use the unified pagination protocol:

GET /app/v1/posts?page=1&pageSize=10&orderBy=createdAt&orderDesc=true&search=keyword

Multilingual Handling

Frontends specify the language via the locale parameter or the URL path:

MethodExampleApplicable Scenario
Query parameter/posts?locale=zh-CNAPI calls
URL path/zh-CN/posts/hello-worldReact/Vue frontend routes
HeaderAccept-Language: en-USTaro / Flutter

7. i18n Architecture

Admin Console

The admin console uses the built-in i18n system of Vben Admin, supporting Chinese and English:

src/locales/
├── zh-CN/          # Chinese
│   ├── content.json
│   ├── site.json
│   └── system.json
└── en-US/          # English
    ├── content.json
    ├── site.json
    └── system.json

Frontend Applications

Versioni18n SolutionMessage File Location
Reactnext-intlsrc/messages/zh-CN.json, en-US.json
Vue@nuxtjs/i18nlocales/zh-CN.json, en-US.json
TaroTaro i18nsrc/i18n/zh-CN.ts, en-US.ts
Flutterflutter_localizationslib/l10n/app_zh.arb, app_en.arb

8. Reuse Relationship with the GoWind Admin Frontend

The admin console frontend reuses GoWind Admin heavily:

Shared PartsDescription
Monorepo architectureAlso uses pnpm workspace + turbo
Vben Admin frameworkFully shared
API layer architectureVue Query hooks pattern
System administration modulesUsers/roles/permissions/dictionaries/menus etc. fully reused
Theme and i18nShared light/dark themes, i18n
CMS-Specific PartsDescription
Content management modulesPosts/categories/tags/pages (unique to the Admin)
Site management modulesMulti-site/navigation/site settings
Media resource modulesImage/video/document management
Section/block editorSectionType-based content building

9. Related Documentation

  • CMS Backend Architecture Overview
  • CMS Protobuf API Definitions
  • Frontend Application Development in Practice
  • Headless API Multi-Client Integration in Practice
  • GoWind Admin Frontend Architecture — shared admin console foundation
Edit this page
Last Updated:: 11/3/26, 2:14 PM
Contributors: Bobo
Next
CMS Frontend Modules Overview