菜单添加标签
This commit is contained in:
@@ -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',
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -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;
|
||||||
/** 排序 */
|
/** 排序 */
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
@@ -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": "启用",
|
||||||
|
|||||||
@@ -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'));
|
||||||
|
|||||||
Reference in New Issue
Block a user