mirror of https://github.com/halo-dev/halo-admin
feat: support new categories in post settings (#489)
Signed-off-by: Ryan Wang <i@ryanc.cc>pull/491/head
parent
6f2a1244f1
commit
f07d90add2
@ -0,0 +1,152 @@
|
|||||||
|
<template>
|
||||||
|
<a-modal v-model="modalVisible" :afterClose="onClose" :width="512" destroyOnClose title="新建分类">
|
||||||
|
<a-form-model
|
||||||
|
ref="categoryForm"
|
||||||
|
:label-col="{ span: 4 }"
|
||||||
|
:model="form.model"
|
||||||
|
:rules="form.rules"
|
||||||
|
:wrapper-col="{ span: 20 }"
|
||||||
|
labelAlign="left"
|
||||||
|
>
|
||||||
|
<a-form-model-item help="* 页面上所显示的名称" label="名称:" prop="name">
|
||||||
|
<a-input ref="nameInput" v-model="form.model.name" />
|
||||||
|
</a-form-model-item>
|
||||||
|
<a-form-model-item help="* 一般为单个分类页面的标识,最好为英文" label="别名:" prop="slug">
|
||||||
|
<a-input v-model="form.model.slug" />
|
||||||
|
</a-form-model-item>
|
||||||
|
<a-form-model-item label="上级目录:" prop="parentId">
|
||||||
|
<category-select-tree :categories="list.data" :category-id.sync="form.model.parentId" />
|
||||||
|
</a-form-model-item>
|
||||||
|
<a-form-model-item help="* 在分类页面可展示,需要主题支持" label="封面图:" prop="thumbnail">
|
||||||
|
<AttachmentInput v-model="form.model.thumbnail" title="选择封面图" />
|
||||||
|
</a-form-model-item>
|
||||||
|
<a-form-model-item help="* 分类密码" label="密码:" prop="password">
|
||||||
|
<a-input-password v-model="form.model.password" autocomplete="new-password" />
|
||||||
|
</a-form-model-item>
|
||||||
|
<a-form-model-item help="* 分类描述,需要主题支持" label="描述:" prop="description">
|
||||||
|
<a-input v-model="form.model.description" :autoSize="{ minRows: 3 }" type="textarea" />
|
||||||
|
</a-form-model-item>
|
||||||
|
</a-form-model>
|
||||||
|
|
||||||
|
<template #footer>
|
||||||
|
<ReactiveButton
|
||||||
|
:errored="form.errored"
|
||||||
|
:loading="form.saving"
|
||||||
|
erroredText="保存失败"
|
||||||
|
loadedText="保存成功"
|
||||||
|
text="保存"
|
||||||
|
type="primary"
|
||||||
|
@callback="handleSavedCallback"
|
||||||
|
@click="handleCreate"
|
||||||
|
></ReactiveButton>
|
||||||
|
<a-button @click="modalVisible = false">关闭</a-button>
|
||||||
|
</template>
|
||||||
|
</a-modal>
|
||||||
|
</template>
|
||||||
|
<script>
|
||||||
|
import CategorySelectTree from '@/components/Category/CategorySelectTree'
|
||||||
|
import apiClient from '@/utils/api-client'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'CategoryCreateModal',
|
||||||
|
components: {
|
||||||
|
CategorySelectTree
|
||||||
|
},
|
||||||
|
props: {
|
||||||
|
visible: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
list: {
|
||||||
|
data: [],
|
||||||
|
loading: false
|
||||||
|
},
|
||||||
|
form: {
|
||||||
|
model: {},
|
||||||
|
saving: false,
|
||||||
|
errored: false,
|
||||||
|
rules: {
|
||||||
|
name: [
|
||||||
|
{ required: true, message: '* 分类名称不能为空', trigger: ['change'] },
|
||||||
|
{ max: 255, message: '* 分类名称的字符长度不能超过 255', trigger: ['change'] }
|
||||||
|
],
|
||||||
|
slug: [{ max: 255, message: '* 分类别名的字符长度不能超过 255', trigger: ['change'] }],
|
||||||
|
thumbnail: [{ max: 1023, message: '* 封面图链接的字符长度不能超过 1023', trigger: ['change'] }],
|
||||||
|
description: [{ max: 100, message: '* 分类描述的字符长度不能超过 100', trigger: ['change'] }]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
modalVisible: {
|
||||||
|
get() {
|
||||||
|
return this.visible
|
||||||
|
},
|
||||||
|
set(value) {
|
||||||
|
this.$emit('update:visible', value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
created() {
|
||||||
|
this.handleListCategories()
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
modalVisible(value) {
|
||||||
|
if (value) {
|
||||||
|
this.$nextTick(() => {
|
||||||
|
this.$refs.nameInput.focus()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
async handleListCategories() {
|
||||||
|
try {
|
||||||
|
this.list.loading = true
|
||||||
|
|
||||||
|
const { data } = await apiClient.category.list({})
|
||||||
|
this.list.data = data
|
||||||
|
} catch (e) {
|
||||||
|
this.$log.error('Failed to get categories', e)
|
||||||
|
} finally {
|
||||||
|
this.list.loading = false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
handleCreate() {
|
||||||
|
this.$refs.categoryForm.validate(async valid => {
|
||||||
|
if (valid) {
|
||||||
|
try {
|
||||||
|
this.form.saving = true
|
||||||
|
|
||||||
|
await apiClient.category.create(this.form.model)
|
||||||
|
} catch (e) {
|
||||||
|
this.form.errored = true
|
||||||
|
this.$log.error('Failed to create category', e)
|
||||||
|
} finally {
|
||||||
|
setTimeout(() => {
|
||||||
|
this.form.saving = false
|
||||||
|
}, 400)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
handleSavedCallback() {
|
||||||
|
if (this.form.errored) {
|
||||||
|
this.form.errored = false
|
||||||
|
} else {
|
||||||
|
this.form.model = {}
|
||||||
|
this.handleListCategories()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
onClose() {
|
||||||
|
this.$emit('close')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
Loading…
Reference in new issue