Use when working with AntdAdmin UI components (Table, Form, Modal, Tabs) in QSCMF admin interfaces. Triggers include "Table列表", "Form表单", "Modal弹窗", "图片上传", "下拉选择", "富文本", "AntdAdmin" or issues like "搜索不工作", "上传失败", "Modal打不开". For Model/Controller/Migration use qscmf-backend instead.
Component-based admin UI framework for QSCMF built on Ant Design.
Core Pattern: Container pattern with fluent interface
use AntdAdmin\Component\Table;
$table = new Table();
$table->setMetaTitle('产品列表')
->setDataSource($products)
->columns(function (Table\ColumnsContainer $container) {
$container->text('id', 'ID')->setSearch(false);
$container->text('name', '名称');
$container->digit('price', '价格');
$container->dateTime('created_at', '创建时间');
$container->action('', '操作')->actions(function ($container) {
$container->edit();
$container->delete();
});
})
->actions(function (Table\ActionsContainer $container) {
$container->addNew();
})
->render();
use AntdAdmin\Component\Form;
use Qscmf\Core\Validator\Rule\Required;
use FormItem\ObjectStorage\Lib\Common;
$form = new Form();
$form->setMetaTitle('新增产品')
->setInitialValues($defaults)
->setSubmitRequest('post', U('add'))
->columns(function (Form\ColumnsContainer $container) {
$container->text('name', '名称')->addRule(new Required());
$container->digit('price', '价格');
$container->image('cover_id', '封面图')
->setUploadRequest(Common::genItemDataUrl('image'))
->setCrop('16/9');
})
->actions(function (Form\ActionsContainer $container) {
$container->button('提交')->submit();
})
->render();
use AntdAdmin\Component\Modal\Modal;
$modal = new Modal();
$modal->setTitle('编辑')
->setContent(new Form(...)) // or setUrl(U('edit'))
->setWidth('800px');
$container->button('添加')->modal($modal);
use AntdAdmin\Component\Tabs;
use AntdAdmin\Component\Form;
// Create forms for each tab
$basicForm = new Form();
$basicForm->columns(function ($container) {
$container->text('name', '名称');
$container->digit('price', '价格');
});
// Create tabs
$tabs = new Tabs();
$tabs->addTab('basic', '基本信息', $basicForm) // Direct content
->addTab('seo', 'SEO设置', null, U('seo')) // URL-based (lazy load)
->addTab('logs', '操作日志', null, U('logs')) // URL-based
->render();
Use cases:
All nested elements use containers with closures:
$table->columns(function (Table\ColumnsContainer $container) {
$container->text('field', 'Label');
});
All setter methods return $this for chaining:
$container->text('name', '名称')
->setWidth(200)
->setSearch(false);
ueditor only in Form, link only in Table$table->actions())addNew(), delete(), edit(), forbid(), resume()Display data? → Table
Add/Edit data? → Form
Need popup? → Modal
Multiple tabs? → Tabs
Short text? → text
Long text? → textarea
Number? → digit
Date? → date / dateTime
Choice? → select / radio / checkbox
Image? → image (setUploadRequest + setCrop)
File? → file (setUploadRequest)
Rich text? → ueditor (Form only!)
Money? → money
Simple CRUD? → Use shortcuts (addNew, delete, edit)
Custom link? → button()->link($url)
AJAX request? → button()->request($method, $url)
Modal popup? → button()->modal($modal)
Inline edit? → defaultEditMode() + editable()
// WRONG
$column = new Table\ColumnType\Text('id', 'ID');
// ✅ RIGHT
$table->columns(function ($container) {
$container->text('id', 'ID');
});
// WRONG
return $table;
// ✅ RIGHT
return $table->render();
// WRONG: Actions in columns
$table->columns(function ($container) {
$container->addNew(); // Wrong!
});
// ✅ RIGHT: Separate actions
$table->columns(...)
->actions(function ($container) {
$container->addNew(); // Right
});
// WRONG
$container->select('status', '状态')
->setFieldProps(['options' => [...]]);
// ✅ RIGHT
$container->select('status', '状态')
->setValueEnum([1 => '启用', 0 => '禁用']);
| Task | Use This Skill | |------|---------------| | Create Model, Migration | qscmf-backend | | Create Controller structure | qscmf-backend | | Design database schema | qscmf-backend | | Configure Table columns | qscmf-antd-admin (this) | | Setup Form validation | qscmf-antd-admin (this) | | Integrate Modal popup | qscmf-antd-admin (this) | | Configure image upload | qscmf-antd-admin (this) | | Setup action buttons | qscmf-antd-admin (this) |
dataIndex matches field name in datasetDataSource() is calledsetSearchUrl() must be set on tablesetSearch(false)->modal($modal) on buttonsetContent() or setUrl()setUploadRequest() is called with valid URLsetSubmitRequest() must be set->submit() actionMore troubleshooting: See troubleshooting.md
use Qscmf\Controller\QsListController;
use AntdAdmin\Component\Table;
class ProductController extends QsListController
{
public function index()
{
$list = D('Product')->getList(I('get.'));
$table = new Table();
$table->setMetaTitle('产品管理')
->setDataSource($list['data'])
->setPagination(new Table\Pagination($list['total'], $list['per_page']))
->columns(...)
->actions(...)
->render();
}
}
// Table expects array of arrays
$data = [
['id' => 1, 'name' => 'Product 1'],
['id' => 2, 'name' => 'Product 2'],
];
$table->setDataSource($data);
use FormItem\ObjectStorage\Lib\Common;
$container->image('cover_id', '封面图')
->setUploadRequest(Common::genItemDataUrl('image'))
->setCrop('16/9');
Located at /mnt/www/antd-admin/doc/:
Search for places (restaurants, cafes, etc.) via Google Places API proxy on localhost.
Interact with GitHub using the `gh` CLI. Use `gh issue`, `gh pr`, `gh run`, and `gh api` for issues, PRs, CI runs, and advanced queries.
Create or update AgentSkills. Use when designing, structuring, or packaging skills with scripts, references, and assets.
Start voice calls via the OpenClaw voice-call plugin.
Notion API for creating and managing pages, databases, and blocks.
Gemini CLI for one-shot Q&A, summaries, and generation.
Category:developer