fix(cms): 分类树防环——上级候选剔除自身子树,列表跳过自指向脏数据
与后端 checkParentValid 配套的前端侧防御(分类是自关联结构,成环会让分类树整个渲染不出来): - category-edit:新增 parentOptions 计算属性,修改分类时把「自己及自己的整棵子树」 从上级候选中剔除,避免在界面上就能选出环。 - index:parseData 先过滤掉 categoryId === parentId 的记录(toTreeData 遇到这类数据 会直接 throw,拖垮整个列表),并把被跳过的分类 id 提示给用户,让其去库里修正。
This commit is contained in:
@@ -195,8 +195,23 @@
|
||||
|
||||
/* 数据转为树形结构 */
|
||||
const parseData = (data: ArticleCategory[]) => {
|
||||
/*
|
||||
* 防御性过滤:分类是自关联结构,如果库里存在「自己指向自己」的脏数据,
|
||||
* toTreeData 会直接 throw,导致整个页面无法渲染(报 data error: {categoryId: x, parentId: x})。
|
||||
* 这里先剔除这类记录,只影响异常的那一行,不拖垮整个列表。
|
||||
*/
|
||||
const validData = (data ?? []).filter((d) => d.categoryId !== d.parentId);
|
||||
if (validData.length !== (data ?? []).length) {
|
||||
const badIds = (data ?? [])
|
||||
.filter((d) => d.categoryId === d.parentId)
|
||||
.map((d) => d.categoryId)
|
||||
.join('、');
|
||||
message.error(
|
||||
`分类 ${badIds} 的上级分类是它自己,已跳过显示,请在数据库中修正`
|
||||
);
|
||||
}
|
||||
return toTreeData({
|
||||
data: data.map((d) => {
|
||||
data: validData.map((d) => {
|
||||
return { ...d, key: d.categoryId, value: d.categoryId };
|
||||
}),
|
||||
idField: 'categoryId',
|
||||
|
||||
Reference in New Issue
Block a user