frontendgen

package
v1.0.4 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 19, 2026 License: MIT Imports: 9 Imported by: 0

Documentation

Overview

Package frontendgen 从 OpenAPI 3.0 规范生成前端 CRUD 代码 (composable/hooks、列表页、编辑抽屉、路由、国际化), 支持 vue-element / vue-vben / react-antd 三种目标框架。

本包由 gowind-uiapp 的 TypeScript 生成器移植而来, 以 testdata/golden 黄金样本保证行为一致。

Index

Constants

View Source
const (
	TypeComposable = "composable" // vue hooks 文件
	TypeHooks      = "hooks"      // react hooks 文件
	TypePage       = "page"
	TypeDrawer     = "drawer"
	TypeRouter     = "router"
	TypeLocale     = "locale"
)

生成的文件类型

View Source
const (
	ActionCreated   = "created"
	ActionOverwrite = "overwritten"
	ActionMerged    = "merged"
	ActionMergedNew = "merged-new" // 目标合并文件不存在,新建为独立片段文件
)

写盘动作

Variables

This section is empty.

Functions

func ExtractModuleName

func ExtractModuleName(service *ParsedService) string

ExtractModuleName 从服务描述中提取模块中文名,如 "角色管理服务" -> "角色"

func HasFullCrud

func HasFullCrud(service *ParsedService) bool

HasFullCrud 判断服务是否有完整 CRUD 操作

Types

type CrudOperation

type CrudOperation string

CrudOperation API 操作类型

const (
	OpList   CrudOperation = "list"
	OpGet    CrudOperation = "get"
	OpCreate CrudOperation = "create"
	OpUpdate CrudOperation = "update"
	OpDelete CrudOperation = "delete"
	OpOther  CrudOperation = "other"
)

type CrudPaths

type CrudPaths struct {
	List   *ParsedOperation
	Get    *ParsedOperation
	Create *ParsedOperation
	Update *ParsedOperation
	Delete *ParsedOperation
}

CrudPaths 服务的主要 list/get/create/update/delete 操作(每类取首个)

func GetCrudPaths

func GetCrudPaths(service *ParsedService) CrudPaths

GetCrudPaths 获取服务的主要 CRUD 路径

type FieldEntriesOptions

type FieldEntriesOptions struct {
	// SkipFields 要跳过的字段名列表(默认 ["id"])
	SkipFields []string
	// WithPlaceholder 生成 Placeholder 条目
	WithPlaceholder bool
	// WithRequired 生成 Required 校验提示条目
	WithRequired bool
	// SkipRequiredFields Required 跳过的字段名(默认 ["sortOrder","description","remark"])
	SkipRequiredFields []string
}

FieldEntriesOptions 字段条目构建选项(nil 切片表示使用默认值)

type Framework

type Framework string

Framework 目标前端框架

const (
	FrameworkVueElement Framework = "vue-element"
	FrameworkVueVben    Framework = "vue-vben"
	FrameworkReactAntd  Framework = "react"
)

func ParseFramework

func ParseFramework(s string) (Framework, bool)

ParseFramework 解析框架名(接受 vue-element/vue-vben/react-antd/react)

type GeneratedFile

type GeneratedFile struct {
	// Path 文件相对路径(相对前端项目 src 目录)
	Path string `json:"path"`
	// Content 文件内容
	Content string `json:"content"`
	// Description 文件描述
	Description string `json:"description"`
	// ServiceName 所属服务 tag 名
	ServiceName string `json:"serviceName"`
	// Type 文件类型(composable/hooks/page/drawer/router/locale)
	Type string `json:"type"`
}

GeneratedFile 生成的文件

func Generate

func Generate(opts Options) ([]GeneratedFile, error)

Generate 按选项生成前端代码文件

type MethodEntry

type MethodEntry struct {
	Method string // 小写 http 方法名
	Tags   []string
	// Description 操作描述
	Description string
	// OperationID operationId
	OperationID string
}

MethodEntry 路径下的 HTTP 方法与操作

type OpenApiTag

type OpenApiTag struct {
	Name        string
	Description string
}

OpenApiTag OpenAPI tag 定义

type Options

type Options struct {
	// Spec 已解析的 OpenAPI 规格(必填)
	Spec *Spec
	// Framework 目标框架(必填)
	Framework Framework
	// Tags 要生成的服务 tag 名列表;空 = 全部服务(按文档序)
	Tags []string
	// ServiceName 生成代码的服务名(默认 admin,用于 generated 导入路径)
	ServiceName string
	// ModulePathMap 文件名 -> 模块路径(如 role -> permission/role)
	ModulePathMap map[string]string
	// GenerateTypes 要生成的文件类型;空 = 全部类型
	// vue 框架: composable/page/drawer/router/locale;react: hooks/page/drawer/router/locale
	GenerateTypes []string
	// RouterModules 路由模块分组配置;为空且 AutoRouterModules 为 true 时自动检测
	RouterModules []RouterModuleConfig
	// AutoRouterModules RouterModules 为空时按 basePath 自动检测分组
	AutoRouterModules bool
}

Options 生成选项

type OrderedMap

type OrderedMap struct {
	// contains filtered or unexported fields
}

OrderedMap 保持插入序的 JSON 对象,渲染结果与 JS JSON.stringify(obj, null, 2) 逐字节一致(不转义非 ASCII 与 HTML 字符),供国际化文件生成使用。

func BuildActionMessagesEnUS

func BuildActionMessagesEnUS(modelName string) *OrderedMap

BuildActionMessagesEnUS 生成英文操作消息

func BuildActionMessagesZhCN

func BuildActionMessagesZhCN(moduleDesc string) *OrderedMap

BuildActionMessagesZhCN 生成中文操作消息(按钮、确认、成功/失败提示等)

func BuildButtonMessagesEnUS

func BuildButtonMessagesEnUS(moduleName string) *OrderedMap

BuildButtonMessagesEnUS 生成英文按钮消息(简化版,仅 create/update)

func BuildButtonMessagesZhCN

func BuildButtonMessagesZhCN(moduleDesc string) *OrderedMap

BuildButtonMessagesZhCN 生成中文按钮消息(简化版,仅 create/update)

func BuildFieldEntriesEnUS

func BuildFieldEntriesEnUS(fields []ParsedField, options *FieldEntriesOptions) *OrderedMap

BuildFieldEntriesEnUS 构建英文字段条目(保持字段文档序)

func BuildFieldEntriesZhCN

func BuildFieldEntriesZhCN(fields []ParsedField, options *FieldEntriesOptions) *OrderedMap

BuildFieldEntriesZhCN 构建中文字段条目(保持字段文档序)

func BuildStatusMapEnUS

func BuildStatusMapEnUS(enumValues []string) *OrderedMap

BuildStatusMapEnUS 生成状态枚举的英文映射,如 {ON: Active, OFF: Inactive}

func BuildStatusMapZhCN

func BuildStatusMapZhCN(enumValues []string) *OrderedMap

BuildStatusMapZhCN 生成状态枚举的中文映射,如 {ON: 启用, OFF: 禁用}

func NewOrderedMap

func NewOrderedMap() *OrderedMap

NewOrderedMap 创建有序对象

func (*OrderedMap) Get

func (m *OrderedMap) Get(key string) (any, bool)

Get 取值

func (*OrderedMap) Len

func (m *OrderedMap) Len() int

Len 键数量

func (*OrderedMap) MarshalJSON

func (m *OrderedMap) MarshalJSON() ([]byte, error)

MarshalJSON 实现 json.Marshaler,按键插入序渲染

func (*OrderedMap) Set

func (m *OrderedMap) Set(key string, val any) *OrderedMap

Set 追加键值(值: string 或 *OrderedMap)

func (*OrderedMap) String

func (m *OrderedMap) String() string

String 渲染为 JSON 文本(2 空格缩进,无尾随换行)

type ParsedField

type ParsedField struct {
	Name        string   `json:"name"`
	TsType      string   `json:"tsType"`
	Description string   `json:"description"`
	IsEnum      bool     `json:"isEnum"`
	EnumValues  []string `json:"enumValues"`
	Format      string   `json:"format"`
	IsArray     bool     `json:"isArray"`
	IsBoolean   bool     `json:"isBoolean"`
	IsDate      bool     `json:"isDate"`
	IsInteger   bool     `json:"isInteger"`
}

ParsedField 解析后的字段信息

func FindStatusField

func FindStatusField(service *ParsedService) *ParsedField

FindStatusField 查找服务中的状态枚举字段

type ParsedOperation

type ParsedOperation struct {
	Type        CrudOperation `json:"type"`
	Method      string        `json:"method"`
	Path        string        `json:"path"`
	Description string        `json:"description"`
	OperationID string        `json:"operationId"`
}

ParsedOperation 解析后的操作信息

type ParsedService

type ParsedService struct {
	// TagName 服务标签名(如 RoleService)
	TagName string `json:"tagName"`
	// Description 服务描述
	Description string `json:"description"`
	// KebabName kebab-case 服务路径名(如 role)
	KebabName string `json:"kebabName"`
	// CamelName camelCase 服务名(如 role)
	CamelName string `json:"camelName"`
	// PascalName PascalCase 服务名(如 Role)
	PascalName string `json:"pascalName"`
	// ModelName 服务主模型名(如 Role)
	ModelName string `json:"modelName"`
	// ModelCamelName camelCase 模型名(如 role)
	ModelCamelName string `json:"modelCamelName"`
	// ClientGetterName ApiClient 上的 Service Client getter 名(如 roleService)
	ClientGetterName string `json:"clientGetterName"`
	// TypePrefix 生成代码中的类型前缀(如 permissionservicev1)
	TypePrefix string `json:"typePrefix"`
	// BasePath API 路径前缀(如 /admin/v1/roles)
	BasePath string `json:"basePath"`
	// Operations 该服务支持的操作(按文档序)
	Operations []ParsedOperation `json:"operations"`
	// Fields 主模型字段(按 schema 属性文档序)
	Fields []ParsedField `json:"fields"`
}

ParsedService 解析后的服务信息

func ExtractServices

func ExtractServices(spec *Spec) []*ParsedService

ExtractServices 从 OpenAPI 规范中提取所有服务(按首次出现的 tag 文档序)

type PathEntry

type PathEntry struct {
	Path    string
	Methods []*MethodEntry
}

PathEntry 单个 API 路径(方法按文档序)

type Property

type Property struct {
	Name        string
	Type        string
	Format      string
	Description string
	Enum        []string
	// ItemsType 数组元素类型(type: array 时)
	ItemsType string
}

Property schema 属性

type RouterModuleConfig

type RouterModuleConfig struct {
	// ModuleKey 模块标识(如 permission, system)
	ModuleKey string `json:"moduleKey"`
	// ModuleDisplayName 模块中文名
	ModuleDisplayName string `json:"moduleDisplayName"`
	// ModuleIcon 模块图标
	ModuleIcon string `json:"moduleIcon,omitempty"`
	// ModuleOrder 模块排序(0 = 框架默认值)
	ModuleOrder int `json:"moduleOrder,omitempty"`
	// Authority 权限标识列表
	Authority []string `json:"authority,omitempty"`
	// ServiceTags 该模块包含的服务 tag 名列表
	ServiceTags []string `json:"serviceTags"`
}

RouterModuleConfig 路由模块分组配置

func DetectRouterModules

func DetectRouterModules(services []*ParsedService) []RouterModuleConfig

DetectRouterModules 按 basePath 第三段启发式检测路由模块分组 (与 GUI 的 autoDetectRouterModules 逻辑一致)。

分组规则: basePath(如 /admin/v1/roles)去空段后取第 3 段('roles'), 再取连字符前缀作为 groupKey,并归并到常见业务模块。

type Schema

type Schema struct {
	Properties []*Property
}

Schema 组件 schema(属性按文档序)

type Spec

type Spec struct {
	Tags    []OpenApiTag
	Paths   []*PathEntry
	Schemas map[string]*Schema
}

Spec 解析后的 OpenAPI 规范。为与 TypeScript 版行为一致, paths、methods、properties 均按 YAML 文档序保存(Go map 无序)。

func ParseOpenAPIYAML

func ParseOpenAPIYAML(data []byte) (*Spec, error)

ParseOpenAPIYAML 解析 OpenAPI 3.0 YAML/JSON 文本

type WriteResult

type WriteResult struct {
	// Path 写入的绝对/相对路径(outDir + 文件相对路径)
	Path string `json:"path"`
	// Action created / overwritten / merged / merged-new
	Action string `json:"action"`
	// Bytes 写入字节数
	Bytes int `json:"bytes"`
}

WriteResult 单个文件的写盘结果

func WriteFiles

func WriteFiles(files []GeneratedFile, outDir string) ([]WriteResult, error)

WriteFiles 将生成文件写入目标目录。

普通文件创建或覆盖;vue-vben 的 page.*/menu.* 国际化片段是「合并式片段」: 目标 locales/langs/{lang}/page.json(或 menu.json)已存在时按键合并写回(merged), 不存在时新建独立片段文件(merged-new)。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL