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
Ryan Wang 3 years ago committed by GitHub
parent 118b793e41
commit e8bd5e262b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -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…
Cancel
Save