ワンクリックで
cube-page-override
使用 cube-front 的 Section 机制覆盖/扩展页面组件。 当用户说"覆盖页面"、"扩展页面"、"自定义组件"、"修改框架组件"时使用。 Section 机制允许在不修改框架源码的情况下,覆盖搜索栏、表格、操作按钮等页面区块。
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
使用 cube-front 的 Section 机制覆盖/扩展页面组件。 当用户说"覆盖页面"、"扩展页面"、"自定义组件"、"修改框架组件"时使用。 Section 机制允许在不修改框架源码的情况下,覆盖搜索栏、表格、操作按钮等页面区块。
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
根据后端 NewLife.Cube 控制器定义,在前端项目创建页面组件。当用户说"新增页面"、"创建页面"、"添加功能页面"、"给 XX 模块加页面"时使用。
初始化一个新的前端项目,使用 cube-front 框架。 当用户说"初始化项目"、"创建新项目"、"搭建前端项目"、"使用 cube-front 初始化"时使用此技能。 自动配置布局、状态管理(Pinia)、路由、API请求库、多语言支持、容器化部署等核心功能,开箱即用。
在 cube-front 框架中新增、注册或切换页面布局。 当用户说"新增布局"、"自定义布局"、"修改布局"、"切换布局"、"使用 XXX 布局"时使用。 包含布局组件创建、框架注册、应用使用的完整流程。
LOV(List of Values)值集系统使用指南。涵盖后端配置、前端组件、API 封装、枚举自动注册全链路。当用户说"配置值集"、"使用LovSelect"、"添加LOV"、"值集选择"、"枚举下拉"、"使用LOV"时使用。
命令式弹窗的代码组织规范与最佳实践。 当用户问"弹窗怎么组织"、"弹窗放哪"、"弹窗目录结构"、"弹窗代码规范"、"新增弹窗怎么写"、"重构弹窗结构"时使用。 核心原则:Vue 组件 + openXxx.ts 打开函数作为"一对"放在一起,按业务归属就近放置。
(已迁移) 此技能已更名为 cube-add-page,请使用 cube-add-page 技能根据控制器创建前端页面。当你需要创建或修改 Cube 前端 API 文件时也请使用 cube-add-page。
| name | cube-page-override |
| description | 使用 cube-front 的 Section 机制覆盖/扩展页面组件。 当用户说"覆盖页面"、"扩展页面"、"自定义组件"、"修改框架组件"时使用。 Section 机制允许在不修改框架源码的情况下,覆盖搜索栏、表格、操作按钮等页面区块。 |
当用户需要修改/覆盖框架默认组件(如搜索栏、表格、分页),又不希望修改框架源码时使用。
┌─────────────────────────────────────────────────┐
│ 框架组件 │
│ ┌─────────┐ ┌─────────┐ ┌─────────────────┐ │
│ │ Header │ │ Content │ │ Footer │ │
│ └─────────┘ └─────────┘ └─────────────────┘ │
│ ↑ ↑ ↑ │
│ │ │ │ │
│ ┌───┴───┐ ┌───┴───┐ ┌───┴───┐ │
│ │Section│ │Section│ │Section│ │
│ │覆盖 │ │覆盖 │ │覆盖 │ │
│ └───────┘ └───────┘ └───────┘ │
└─────────────────────────────────────────────────┘
| 规则 | 说明 |
|---|---|
| 大写开头 | 文件名必须以大写字母开头,如 ListSearchBar.vue |
| PascalCase | 多个单词时首字母都大写,如 UserDetailHeader.vue |
| 禁止小写 | index.vue、form.vue 等小写开头的文件不会被扫描 |
| Section 名称 | 覆盖位置 | 用途 |
|---|---|---|
ListSearchBar.vue | 列表页面搜索栏 | 自定义搜索条件 |
ListToolbar.vue | 列表工具栏 | 添加自定义按钮 |
TableColumns.vue | 表格列配置 | 修改列定义 |
FormFields.vue | 表单字段 | 自定义表单控件 |
DetailHeader.vue | 详情页头部 | 自定义详情头部 |
Pagination.vue | 分页组件 | 自定义分页样式 |
1. 在应用的 views 目录下创建
apps/<app-name>/src/views/
└── User/
├── index.vue # 列表主页面
└── ListSearchBar.vue # 搜索栏覆盖组件
2. 编写 Section 组件
<template>
<div class="custom-search-bar">
<el-row :gutter="16">
<el-col :span="8">
<el-input
v-model="searchForm.name"
placeholder="请输入用户名"
clearable
/>
</el-col>
<el-col :span="8">
<el-select v-model="searchForm.status" placeholder="请选择状态">
<el-option label="启用" :value="1" />
<el-option label="禁用" :value="0" />
</el-select>
</el-col>
<el-col :span="8">
<el-button type="primary" @click="handleSearch">搜索</el-button>
<el-button @click="handleReset">重置</el-button>
<el-button type="success" @click="handleExport">导出</el-button>
</el-col>
</el-row>
</div>
</template>
<script setup lang="ts">
import { ref, reactive } from 'vue';
// 搜索表单
const searchForm = reactive({
name: '',
status: undefined as number | undefined,
});
// 搜索事件 - 触发父组件刷新
const emit = defineEmits<{
search: [form: typeof searchForm];
reset: [];
}>();
function handleSearch() {
emit('search', searchForm);
}
function handleReset() {
searchForm.name = '';
searchForm.status = undefined;
emit('reset');
}
function handleExport() {
// 自定义导出逻辑
console.log('导出数据');
}
</script>
<style scoped>
.custom-search-bar {
padding: 16px;
background: #fff;
border-radius: 4px;
}
</style>
<template>
<div class="custom-toolbar">
<el-space>
<el-button type="primary" @click="handleAdd">
<el-icon><Plus /></el-icon>
新增用户
</el-button>
<el-button @click="handleBatchImport">
<el-icon><Upload /></el-icon>
批量导入
</el-button>
<el-button type="danger" @click="handleBatchDelete">
<el-icon><Delete /></el-icon>
批量删除
</el-button>
</el-space>
</div>
</template>
<script setup lang="ts">
import { Plus, Upload, Delete } from '@element-plus/icons-vue';
function handleAdd() {
// 新增逻辑
}
function handleBatchImport() {
// 批量导入逻辑
}
function handleBatchDelete() {
// 批量删除逻辑
}
</script>
<style scoped>
.custom-toolbar {
padding: 12px 16px;
border-bottom: 1px solid #ebeef5;
}
</style>
Section 组件通过 defineEmits 与父组件通信:
// 定义事件
const emit = defineEmits<{
search: [form: object];
reset: [];
refresh: [];
open: [id: number];
}>();
// 触发事件
emit('search', searchForm);
emit('reset');
emit('refresh');
emit('open', 123);
Vite 插件会自动扫描并注册 Section 组件:
views/ 目录.vue 文件virtual:cube-front-sections 虚拟模块导出initApp() 时自动调用 registerPageSections() 注册确认 Section 是否生效:
pageSections 状态apps/<app-name>/src/views/User/
├── index.vue # 主页面(由后端路由提供)
├── ListSearchBar.vue # 覆盖搜索栏
├── ListToolbar.vue # 覆盖工具栏
└── TableColumns.vue # 覆盖表格列(如果支持)