菜单添加标签

This commit is contained in:
liu
2026-08-11 10:46:08 +08:00
parent 1890c5882b
commit 1b8a0f2d0b
7 changed files with 36 additions and 1 deletions
@@ -30,6 +30,7 @@ return new class extends Migration
$table->increments('id'); $table->increments('id');
$table->integer('category_id')->default(0)->comment('所属分类ID'); $table->integer('category_id')->default(0)->comment('所属分类ID');
$table->string('title', 100)->comment('导航标题'); $table->string('title', 100)->comment('导航标题');
$table->json('tag')->comment('导航标签');
$table->integer('image_id')->comment('导航图标信息'); $table->integer('image_id')->comment('导航图标信息');
$table->string('link', 500)->nullable()->default('')->comment('跳转链接'); $table->string('link', 500)->nullable()->default('')->comment('跳转链接');
$table->unsignedTinyInteger('status')->default(0)->comment('状态:0=启用,1=禁用'); $table->unsignedTinyInteger('status')->default(0)->comment('状态:0=启用,1=禁用');
@@ -18,6 +18,7 @@ class SysCategoryItemFormRequest extends BaseFormRequest
'title' => 'required|string|max:100', 'title' => 'required|string|max:100',
'image_id' => ['required', 'integer', new Exists(SysFileModel::class, 'id')], 'image_id' => ['required', 'integer', new Exists(SysFileModel::class, 'id')],
'link' => 'nullable|string|max:500', 'link' => 'nullable|string|max:500',
'tag' => 'nullable|array',
'status' => 'nullable|integer|in:0,1', 'status' => 'nullable|integer|in:0,1',
'sort' => 'nullable|integer', 'sort' => 'nullable|integer',
]; ];
@@ -18,6 +18,7 @@ class SysCategoryItemModel extends Model
'status' => 'int', 'status' => 'int',
'sort' => 'int', 'sort' => 'int',
'image_id' => 'int', 'image_id' => 'int',
'tag' => 'array',
]; ];
protected $fillable = [ protected $fillable = [
@@ -25,6 +26,7 @@ class SysCategoryItemModel extends Model
'title', 'title',
'image_id', 'image_id',
'link', 'link',
'tag',
'status', 'status',
'sort', 'sort',
]; ];
+2
View File
@@ -11,6 +11,8 @@ export interface ICategoryItem {
image: ISysFileInfo | string; image: ISysFileInfo | string;
/** 跳转链接 */ /** 跳转链接 */
link?: string; link?: string;
/** 导航标签(字符串数组) */
tag?: string[];
/** 状态:0=启用,1=禁用 */ /** 状态:0=启用,1=禁用 */
status: number; status: number;
/** 排序 */ /** 排序 */
+2
View File
@@ -28,6 +28,8 @@ export default {
"system.category.item.image.required": "Item icon is required", "system.category.item.image.required": "Item icon is required",
"system.category.item.link": "Redirect Link", "system.category.item.link": "Redirect Link",
"system.category.item.link.placeholder": "Enter redirect link", "system.category.item.link.placeholder": "Enter redirect link",
"system.category.item.tag": "Tags",
"system.category.item.tag.placeholder": "Type and press Enter to add a tag",
"system.category.item.status": "Status", "system.category.item.status": "Status",
"system.category.item.status.required": "Status is required", "system.category.item.status.required": "Status is required",
"system.category.item.status.normal": "Active", "system.category.item.status.normal": "Active",
+2
View File
@@ -28,6 +28,8 @@ export default {
"system.category.item.image.required": "导航图标不能为空", "system.category.item.image.required": "导航图标不能为空",
"system.category.item.link": "跳转链接", "system.category.item.link": "跳转链接",
"system.category.item.link.placeholder": "请输入跳转链接", "system.category.item.link.placeholder": "请输入跳转链接",
"system.category.item.tag": "标签",
"system.category.item.tag.placeholder": "输入后按回车添加标签",
"system.category.item.status": "状态", "system.category.item.status": "状态",
"system.category.item.status.required": "状态不能为空", "system.category.item.status.required": "状态不能为空",
"system.category.item.status.normal": "启用", "system.category.item.status.normal": "启用",
+26 -1
View File
@@ -1,5 +1,5 @@
import XinTable from '@/components/XinTable'; import XinTable from '@/components/XinTable';
import { Badge, Button, Image, Space, Typography } from 'antd'; import { Badge, Button, Image, Space, Tag, Typography } from 'antd';
import { LeftOutlined } from '@ant-design/icons'; import { LeftOutlined } from '@ant-design/icons';
import type { ICategoryItem } from '@/domain/iCategoryItem'; import type { ICategoryItem } from '@/domain/iCategoryItem';
import type { XinTableColumn } from '@/components/XinTable/typings'; import type { XinTableColumn } from '@/components/XinTable/typings';
@@ -98,6 +98,29 @@ export default function CategoryItemPage() {
placeholder: t('system.category.item.link.placeholder'), placeholder: t('system.category.item.link.placeholder'),
}, },
}, },
{
title: t('system.category.item.tag'),
dataIndex: 'tag',
valueType: 'select',
colProps: { span: 24 },
hideInSearch: true,
fieldProps: {
mode: 'tags',
placeholder: t('system.category.item.tag.placeholder'),
},
render: (value: string[] | string | null) => {
if (!value) return '-';
const tags = Array.isArray(value) ? value : [value];
if (tags.length === 0) return '-';
return (
<Space size={[4, 4]} wrap>
{tags.map((tag) => (
<Tag key={tag} color="blue">{tag}</Tag>
))}
</Space>
);
},
},
{ {
title: t('system.category.item.status'), title: t('system.category.item.status'),
dataIndex: 'status', dataIndex: 'status',
@@ -188,12 +211,14 @@ export default function CategoryItemPage() {
if (mode === 'create') { if (mode === 'create') {
await Create('/system/category/item', { await Create('/system/category/item', {
...values, ...values,
tag: values.tag ?? [],
category_id: currentCategory.id, category_id: currentCategory.id,
}); });
window.$message?.success(t('system.category.item.createSuccess')); window.$message?.success(t('system.category.item.createSuccess'));
} else { } else {
await Update('/system/category/item/' + defaultValue?.id, { await Update('/system/category/item/' + defaultValue?.id, {
...values, ...values,
tag: values.tag ?? [],
category_id: currentCategory.id, category_id: currentCategory.id,
}); });
window.$message?.success(t('system.category.item.updateSuccess')); window.$message?.success(t('system.category.item.updateSuccess'));