|
@@ -211,9 +211,6 @@ const tagForm = reactive({
|
|
|
const tagRules = {
|
|
const tagRules = {
|
|
|
name: [
|
|
name: [
|
|
|
{ required: true, message: '请输入标签名称', trigger: 'blur' }
|
|
{ required: true, message: '请输入标签名称', trigger: 'blur' }
|
|
|
- ],
|
|
|
|
|
- parent_id: [
|
|
|
|
|
- { required: true, message: '请选择上级标签', trigger: 'change' }
|
|
|
|
|
]
|
|
]
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -235,30 +232,39 @@ const filterTreeByType = (nodes: TagCategory[] = [], type: 'category' | 'label')
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// 加载标签分类树
|
|
// 加载标签分类树
|
|
|
-const loadCategoryTree = async () => {
|
|
|
|
|
|
|
+const loadCategoryTree = async (silent = false) => {
|
|
|
treeLoading.value = true
|
|
treeLoading.value = true
|
|
|
try {
|
|
try {
|
|
|
const response: any = await tagApi.getCategoryTree(true)
|
|
const response: any = await tagApi.getCategoryTree(true)
|
|
|
console.log('分类树响应:', response)
|
|
console.log('分类树响应:', response)
|
|
|
-
|
|
|
|
|
|
|
+ console.log('分类树响应结构:', {
|
|
|
|
|
+ hasCode: 'code' in response,
|
|
|
|
|
+ code: response.code,
|
|
|
|
|
+ hasData: 'data' in response,
|
|
|
|
|
+ dataType: typeof response.data,
|
|
|
|
|
+ isArray: Array.isArray(response.data)
|
|
|
|
|
+ })
|
|
|
|
|
+
|
|
|
// tree接口返回格式: { code: 200, message: '...', data: [...] }
|
|
// tree接口返回格式: { code: 200, message: '...', data: [...] }
|
|
|
// data是一个数组,包含所有根节点及其嵌套的children
|
|
// data是一个数组,包含所有根节点及其嵌套的children
|
|
|
const treeData = response.data || []
|
|
const treeData = response.data || []
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
// 过滤只显示type为category的节点
|
|
// 过滤只显示type为category的节点
|
|
|
const filtered = filterTreeByType(treeData, 'category')
|
|
const filtered = filterTreeByType(treeData, 'category')
|
|
|
console.log('过滤后的分类树:', filtered)
|
|
console.log('过滤后的分类树:', filtered)
|
|
|
categoryTree.value = filtered
|
|
categoryTree.value = filtered
|
|
|
} catch (error) {
|
|
} catch (error) {
|
|
|
console.error('加载分类树失败:', error)
|
|
console.error('加载分类树失败:', error)
|
|
|
- ElMessage.error('加载分类树失败')
|
|
|
|
|
|
|
+ if (!silent) {
|
|
|
|
|
+ ElMessage.error('加载分类树失败')
|
|
|
|
|
+ }
|
|
|
} finally {
|
|
} finally {
|
|
|
treeLoading.value = false
|
|
treeLoading.value = false
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// 加载标签列表
|
|
// 加载标签列表
|
|
|
-const loadTags = async () => {
|
|
|
|
|
|
|
+const loadTags = async (silent = false) => {
|
|
|
if (!selectedCategory.value) {
|
|
if (!selectedCategory.value) {
|
|
|
tags.value = []
|
|
tags.value = []
|
|
|
return
|
|
return
|
|
@@ -272,21 +278,23 @@ const loadTags = async () => {
|
|
|
page: currentPage.value,
|
|
page: currentPage.value,
|
|
|
page_size: pageSize.value
|
|
page_size: pageSize.value
|
|
|
})
|
|
})
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
console.log('标签列表响应(来自list):', response)
|
|
console.log('标签列表响应(来自list):', response)
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
// list接口返回格式: { code: 200, message: '...', data: [...], meta: {...} }
|
|
// list接口返回格式: { code: 200, message: '...', data: [...], meta: {...} }
|
|
|
const listData = response.data || []
|
|
const listData = response.data || []
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
// 筛选 type 为 label 的节点
|
|
// 筛选 type 为 label 的节点
|
|
|
const labelList = listData.filter((item: any) => item.type === 'label')
|
|
const labelList = listData.filter((item: any) => item.type === 'label')
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
console.log('过滤后的标签列表:', labelList)
|
|
console.log('过滤后的标签列表:', labelList)
|
|
|
tags.value = labelList
|
|
tags.value = labelList
|
|
|
total.value = response.meta?.total || labelList.length
|
|
total.value = response.meta?.total || labelList.length
|
|
|
} catch (error) {
|
|
} catch (error) {
|
|
|
console.error('加载标签列表失败:', error)
|
|
console.error('加载标签列表失败:', error)
|
|
|
- ElMessage.error('加载标签列表失败')
|
|
|
|
|
|
|
+ if (!silent) {
|
|
|
|
|
+ ElMessage.error('加载标签列表失败')
|
|
|
|
|
+ }
|
|
|
} finally {
|
|
} finally {
|
|
|
loading.value = false
|
|
loading.value = false
|
|
|
}
|
|
}
|
|
@@ -324,20 +332,26 @@ const handleSelectionChange = (selection: any[]) => {
|
|
|
|
|
|
|
|
// 状态切换
|
|
// 状态切换
|
|
|
const handleStatusChange = async (tag: any) => {
|
|
const handleStatusChange = async (tag: any) => {
|
|
|
|
|
+ const oldStatus = tag.status
|
|
|
|
|
+
|
|
|
try {
|
|
try {
|
|
|
const response = await tagApi.updateCategory(tag.id, { status: tag.status })
|
|
const response = await tagApi.updateCategory(tag.id, { status: tag.status })
|
|
|
- if (response.code === 200) {
|
|
|
|
|
|
|
+ if (response.code === 200 || response.code === '000000') {
|
|
|
ElMessage.success('标签状态更新成功')
|
|
ElMessage.success('标签状态更新成功')
|
|
|
} else {
|
|
} else {
|
|
|
ElMessage.error(response.message || '更新标签状态失败')
|
|
ElMessage.error(response.message || '更新标签状态失败')
|
|
|
// 恢复原状态
|
|
// 恢复原状态
|
|
|
- tag.status = tag.status === 1 ? 0 : 1
|
|
|
|
|
|
|
+ tag.status = oldStatus === 1 ? 0 : 1
|
|
|
|
|
+ return
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ // 刷新列表以确保数据同步
|
|
|
|
|
+ await loadTags(true)
|
|
|
} catch (error) {
|
|
} catch (error) {
|
|
|
console.error('更新标签状态失败:', error)
|
|
console.error('更新标签状态失败:', error)
|
|
|
ElMessage.error('更新标签状态失败')
|
|
ElMessage.error('更新标签状态失败')
|
|
|
// 恢复原状态
|
|
// 恢复原状态
|
|
|
- tag.status = tag.status === 1 ? 0 : 1
|
|
|
|
|
|
|
+ tag.status = oldStatus === 1 ? 0 : 1
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -367,14 +381,18 @@ const deleteTag = async (tag: any) => {
|
|
|
type: 'warning'
|
|
type: 'warning'
|
|
|
}
|
|
}
|
|
|
)
|
|
)
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
const response = await tagApi.deleteCategory(tag.id, true)
|
|
const response = await tagApi.deleteCategory(tag.id, true)
|
|
|
- if (response.code === 200) {
|
|
|
|
|
|
|
+ if (response.code === 200 || response.code === '000000') {
|
|
|
ElMessage.success('标签删除成功')
|
|
ElMessage.success('标签删除成功')
|
|
|
- loadTags()
|
|
|
|
|
} else {
|
|
} else {
|
|
|
ElMessage.error(response.message || '删除标签失败')
|
|
ElMessage.error(response.message || '删除标签失败')
|
|
|
|
|
+ return
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ // 刷新分类树和标签列表
|
|
|
|
|
+ await loadCategoryTree(true)
|
|
|
|
|
+ await loadTags(true)
|
|
|
} catch (error) {
|
|
} catch (error) {
|
|
|
if (error !== 'cancel') {
|
|
if (error !== 'cancel') {
|
|
|
console.error('删除标签失败:', error)
|
|
console.error('删除标签失败:', error)
|
|
@@ -387,31 +405,35 @@ const deleteTag = async (tag: any) => {
|
|
|
const saveTag = async () => {
|
|
const saveTag = async () => {
|
|
|
try {
|
|
try {
|
|
|
await tagFormRef.value.validate()
|
|
await tagFormRef.value.validate()
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
saving.value = true
|
|
saving.value = true
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
let response
|
|
let response
|
|
|
if (editingTag.value) {
|
|
if (editingTag.value) {
|
|
|
response = await tagApi.updateCategory(editingTag.value.id, tagForm)
|
|
response = await tagApi.updateCategory(editingTag.value.id, tagForm)
|
|
|
- if (response.code === 200) {
|
|
|
|
|
|
|
+ if (response.code === 200 || response.code === '000000') {
|
|
|
ElMessage.success('标签更新成功')
|
|
ElMessage.success('标签更新成功')
|
|
|
|
|
+ showCreateDialog.value = false
|
|
|
|
|
+ resetForm()
|
|
|
} else {
|
|
} else {
|
|
|
ElMessage.error(response.message || '标签更新失败')
|
|
ElMessage.error(response.message || '标签更新失败')
|
|
|
return
|
|
return
|
|
|
}
|
|
}
|
|
|
} else {
|
|
} else {
|
|
|
response = await tagApi.createCategory(tagForm)
|
|
response = await tagApi.createCategory(tagForm)
|
|
|
- if (response.code === 200) {
|
|
|
|
|
|
|
+ if (response.code === 200 || response.code === '000000') {
|
|
|
ElMessage.success('标签创建成功')
|
|
ElMessage.success('标签创建成功')
|
|
|
|
|
+ showCreateDialog.value = false
|
|
|
|
|
+ resetForm()
|
|
|
} else {
|
|
} else {
|
|
|
ElMessage.error(response.message || '标签创建失败')
|
|
ElMessage.error(response.message || '标签创建失败')
|
|
|
return
|
|
return
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
- showCreateDialog.value = false
|
|
|
|
|
- loadCategoryTree()
|
|
|
|
|
- loadTags()
|
|
|
|
|
|
|
+
|
|
|
|
|
+ // 刷新分类树和标签列表
|
|
|
|
|
+ await loadCategoryTree(true)
|
|
|
|
|
+ await loadTags(true)
|
|
|
} catch (error) {
|
|
} catch (error) {
|
|
|
console.error('保存标签失败:', error)
|
|
console.error('保存标签失败:', error)
|
|
|
ElMessage.error('保存标签失败')
|
|
ElMessage.error('保存标签失败')
|
|
@@ -477,7 +499,7 @@ const openEditCategoryDialog = async () => {
|
|
|
|
|
|
|
|
try {
|
|
try {
|
|
|
const response = await tagApi.getCategoryDetail(selectedCategory.value.id)
|
|
const response = await tagApi.getCategoryDetail(selectedCategory.value.id)
|
|
|
- if (response.code === 200) {
|
|
|
|
|
|
|
+ if (response.code === 200 || response.code === '000000') {
|
|
|
editingTag.value = response.data
|
|
editingTag.value = response.data
|
|
|
Object.assign(tagForm, {
|
|
Object.assign(tagForm, {
|
|
|
name: response.data.name,
|
|
name: response.data.name,
|
|
@@ -503,7 +525,7 @@ const deleteCategoryConfirm = async () => {
|
|
|
ElMessage.warning('请先选择一个分类')
|
|
ElMessage.warning('请先选择一个分类')
|
|
|
return
|
|
return
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
try {
|
|
try {
|
|
|
await ElMessageBox.confirm(
|
|
await ElMessageBox.confirm(
|
|
|
`确定要删除分类 "${selectedCategory.value.name}" 吗?此操作不可恢复。`,
|
|
`确定要删除分类 "${selectedCategory.value.name}" 吗?此操作不可恢复。`,
|
|
@@ -514,16 +536,19 @@ const deleteCategoryConfirm = async () => {
|
|
|
type: 'warning'
|
|
type: 'warning'
|
|
|
}
|
|
}
|
|
|
)
|
|
)
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
const response = await tagApi.deleteCategory(selectedCategory.value.id, true)
|
|
const response = await tagApi.deleteCategory(selectedCategory.value.id, true)
|
|
|
- if (response.code === 200) {
|
|
|
|
|
|
|
+ if (response.code === 200 || response.code === '000000') {
|
|
|
ElMessage.success('分类删除成功')
|
|
ElMessage.success('分类删除成功')
|
|
|
- loadCategoryTree()
|
|
|
|
|
selectedCategory.value = null
|
|
selectedCategory.value = null
|
|
|
tags.value = []
|
|
tags.value = []
|
|
|
} else {
|
|
} else {
|
|
|
ElMessage.error(response.message || '删除分类失败')
|
|
ElMessage.error(response.message || '删除分类失败')
|
|
|
|
|
+ return
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ // 刷新分类树
|
|
|
|
|
+ await loadCategoryTree(true)
|
|
|
} catch (error) {
|
|
} catch (error) {
|
|
|
if (error !== 'cancel') {
|
|
if (error !== 'cancel') {
|
|
|
console.error('删除分类失败:', error)
|
|
console.error('删除分类失败:', error)
|