mirror of https://github.com/halo-dev/halo-admin
perf: categories in the post list filters supports showing whether there is a password or not (#541)
Signed-off-by: Ryan Wang <i@ryanc.cc>pull/544/head
parent
118b793e41
commit
e8bd5e262b
|
@ -6,6 +6,7 @@
|
||||||
v-model="categoryIdString"
|
v-model="categoryIdString"
|
||||||
placeholder="请选择上级目录,默认为顶级目录"
|
placeholder="请选择上级目录,默认为顶级目录"
|
||||||
treeDefaultExpandAll
|
treeDefaultExpandAll
|
||||||
|
@change="handleChange"
|
||||||
>
|
>
|
||||||
</a-tree-select>
|
</a-tree-select>
|
||||||
</template>
|
</template>
|
||||||
|
@ -23,26 +24,23 @@ export default {
|
||||||
type: Array,
|
type: Array,
|
||||||
required: false,
|
required: false,
|
||||||
default: () => []
|
default: () => []
|
||||||
}
|
|
||||||
},
|
},
|
||||||
computed: {
|
root: {
|
||||||
categoryTreeData() {
|
type: Object,
|
||||||
return [
|
required: false,
|
||||||
{
|
default: () => {
|
||||||
|
return {
|
||||||
id: 0,
|
id: 0,
|
||||||
title: '根目录',
|
title: '根目录',
|
||||||
value: '0',
|
value: '0',
|
||||||
pId: -1
|
pId: -1
|
||||||
},
|
|
||||||
...this.categories.map(category => {
|
|
||||||
return {
|
|
||||||
id: category.id,
|
|
||||||
title: category.name,
|
|
||||||
value: category.id.toString(),
|
|
||||||
pId: category.parentId
|
|
||||||
}
|
}
|
||||||
})
|
}
|
||||||
]
|
}
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
categoryTreeData() {
|
||||||
|
return [this.root, ...this.convertDataToTree(this.categories)]
|
||||||
},
|
},
|
||||||
categoryIdString: {
|
categoryIdString: {
|
||||||
get() {
|
get() {
|
||||||
|
@ -52,6 +50,52 @@ export default {
|
||||||
this.$emit('update:categoryId', value ? parseInt(value) : 0)
|
this.$emit('update:categoryId', value ? parseInt(value) : 0)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
handleChange() {
|
||||||
|
this.$emit('change')
|
||||||
|
},
|
||||||
|
|
||||||
|
convertDataToTree(categories) {
|
||||||
|
const hashMap = {}
|
||||||
|
const treeData = []
|
||||||
|
categories.forEach(
|
||||||
|
category =>
|
||||||
|
(hashMap[category.id] = {
|
||||||
|
...category,
|
||||||
|
title: category.name,
|
||||||
|
value: category.id.toString(),
|
||||||
|
pId: category.parentId,
|
||||||
|
children: []
|
||||||
|
})
|
||||||
|
)
|
||||||
|
categories.forEach(category => {
|
||||||
|
const current = hashMap[category.id]
|
||||||
|
if (category.parentId) {
|
||||||
|
hashMap[category.parentId].children.push(current)
|
||||||
|
} else {
|
||||||
|
treeData.push(current)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
// set hasPassword field for tree node
|
||||||
|
const setHasPasswordField = (categories, hasPassword = false) => {
|
||||||
|
categories.forEach(category => {
|
||||||
|
category.hasPassword = !!category.password || hasPassword
|
||||||
|
if (category.hasPassword) {
|
||||||
|
category.title = `${category.title}(加密)`
|
||||||
|
}
|
||||||
|
if (Object.hasOwn(category, 'postCount')) {
|
||||||
|
category.title = `${category.title} - ${category.postCount} 篇`
|
||||||
|
}
|
||||||
|
if (category.children && category.children.length) {
|
||||||
|
setHasPasswordField(category.children, category.hasPassword)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
setHasPasswordField(treeData)
|
||||||
|
return treeData
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
|
@ -25,17 +25,17 @@
|
||||||
</a-col>
|
</a-col>
|
||||||
<a-col :md="6" :sm="24">
|
<a-col :md="6" :sm="24">
|
||||||
<a-form-item label="分类目录:">
|
<a-form-item label="分类目录:">
|
||||||
<a-select
|
<CategorySelectTree
|
||||||
v-model="list.params.categoryId"
|
:categories="categories.data"
|
||||||
:loading="categories.loading"
|
:category-id.sync="list.params.categoryId"
|
||||||
allowClear
|
:root="{
|
||||||
placeholder="请选择分类"
|
id: 0,
|
||||||
@change="handleQuery()"
|
title: '全部',
|
||||||
>
|
value: '0',
|
||||||
<a-select-option v-for="category in categories.data" :key="category.id">
|
pId: -1
|
||||||
{{ category.name }}({{ category.postCount }})
|
}"
|
||||||
</a-select-option>
|
@change="handleQuery"
|
||||||
</a-select>
|
/>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</a-col>
|
</a-col>
|
||||||
|
|
||||||
|
@ -437,6 +437,7 @@
|
||||||
// components
|
// components
|
||||||
import PostSettingModal from './PostSettingModal.vue'
|
import PostSettingModal from './PostSettingModal.vue'
|
||||||
import TargetCommentListModal from '@/components/Comment/TargetCommentListModal'
|
import TargetCommentListModal from '@/components/Comment/TargetCommentListModal'
|
||||||
|
import CategorySelectTree from '@/components/Category/CategorySelectTree'
|
||||||
|
|
||||||
// libs
|
// libs
|
||||||
import { mixinDevice } from '@/mixins/mixin.js'
|
import { mixinDevice } from '@/mixins/mixin.js'
|
||||||
|
@ -447,7 +448,8 @@ export default {
|
||||||
name: 'PostListView',
|
name: 'PostListView',
|
||||||
components: {
|
components: {
|
||||||
PostSettingModal,
|
PostSettingModal,
|
||||||
TargetCommentListModal
|
TargetCommentListModal,
|
||||||
|
CategorySelectTree
|
||||||
},
|
},
|
||||||
mixins: [mixinDevice],
|
mixins: [mixinDevice],
|
||||||
props: {
|
props: {
|
||||||
|
@ -542,6 +544,9 @@ export default {
|
||||||
if (enableLoading) {
|
if (enableLoading) {
|
||||||
this.list.loading = true
|
this.list.loading = true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const { categoryId } = this.list.params
|
||||||
|
this.list.params.categoryId = categoryId === 0 ? undefined : categoryId
|
||||||
const response = await apiClient.post.list(this.list.params)
|
const response = await apiClient.post.list(this.list.params)
|
||||||
|
|
||||||
this.list.data = response.data.content
|
this.list.data = response.data.content
|
||||||
|
|
Loading…
Reference in New Issue