parent
805057553b
commit
2eaf32e8d8
@ -0,0 +1,223 @@
|
|||||||
|
<template>
|
||||||
|
<el-card>
|
||||||
|
<el-form>
|
||||||
|
<el-form-item>
|
||||||
|
<el-row :gutter="20" style="width: 100%">
|
||||||
|
<el-col :span="20">
|
||||||
|
<span style="box-shadow: 1 0 1px #c0c4cc"
|
||||||
|
><el-input v-model="article.title" placeholder="请输入博客标题"
|
||||||
|
/></span>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="4">
|
||||||
|
<el-button
|
||||||
|
color="#626aef"
|
||||||
|
style="width: 100%; height: 100%"
|
||||||
|
@click="publishDialogVisible = true"
|
||||||
|
>发布文章</el-button
|
||||||
|
>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item>
|
||||||
|
<v-md-editor
|
||||||
|
v-model="article.content"
|
||||||
|
height="calc(100vh - 290px)"
|
||||||
|
placeholder="在vuepress主题中, 您可以使用tip功能噢~"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
<!-- 在弹窗中选择标签、分类、文章图片 -->
|
||||||
|
<el-dialog v-model="publishDialogVisible" title="后台权限设置" width="40%">
|
||||||
|
<el-form :model="article" label-position="left">
|
||||||
|
<!-- 文章分类 -->
|
||||||
|
<el-form-item label="文章分类">
|
||||||
|
<el-tag
|
||||||
|
type="success"
|
||||||
|
v-show="article.category"
|
||||||
|
:closable="true"
|
||||||
|
size="large"
|
||||||
|
@close="removeCategory"
|
||||||
|
>
|
||||||
|
{{ article.category }}
|
||||||
|
</el-tag>
|
||||||
|
<!-- 分类选项 -->
|
||||||
|
<el-popover
|
||||||
|
v-if="!article.category"
|
||||||
|
placement="bottom-start"
|
||||||
|
:width="400"
|
||||||
|
trigger="click"
|
||||||
|
:hide-after="50"
|
||||||
|
>
|
||||||
|
<div class="popover-title">分类</div>
|
||||||
|
<template #reference>
|
||||||
|
<el-button type="success" plain>添加分类</el-button>
|
||||||
|
</template>
|
||||||
|
<div class="popover-container">
|
||||||
|
<div
|
||||||
|
v-for="item of categoryList"
|
||||||
|
:key="item.id"
|
||||||
|
class="category-item"
|
||||||
|
@click="addCategory(item)"
|
||||||
|
>
|
||||||
|
{{ item.name }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</el-popover>
|
||||||
|
</el-form-item>
|
||||||
|
<!-- 文章标签 -->
|
||||||
|
<el-form-item label="文章标签">
|
||||||
|
<el-tag
|
||||||
|
v-for="item in article.tagList"
|
||||||
|
:key="item.id"
|
||||||
|
:closable="true"
|
||||||
|
size="large"
|
||||||
|
style="margin-right: 8px"
|
||||||
|
@close="removeTag(item)"
|
||||||
|
>
|
||||||
|
{{ item.name }}
|
||||||
|
</el-tag>
|
||||||
|
<!-- 标签选项 -->
|
||||||
|
<el-popover
|
||||||
|
v-if="article.tagList.length < 3"
|
||||||
|
placement="bottom-start"
|
||||||
|
:width="400"
|
||||||
|
trigger="click"
|
||||||
|
:hide-after="50"
|
||||||
|
>
|
||||||
|
<template #reference>
|
||||||
|
<el-button type="primary" plain>添加标签</el-button>
|
||||||
|
</template>
|
||||||
|
<div class="popover-title">标签</div>
|
||||||
|
<div class="popover-container">
|
||||||
|
<el-tag v-for="item of tagList" :key="item.id" class="tag-item" @click="addTag(item)">
|
||||||
|
{{ item.name }}
|
||||||
|
</el-tag>
|
||||||
|
</div>
|
||||||
|
</el-popover>
|
||||||
|
</el-form-item>
|
||||||
|
<!-- 文章封面 -->
|
||||||
|
<el-form-item label="上传封面">
|
||||||
|
<Upload :url="article.cover" :width="360" :height="180" @upload="upload" />
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
<template #footer>
|
||||||
|
<span class="dialog-footer">
|
||||||
|
<el-button color="#626AEF" plain @click="publishDialogVisible = false">取消</el-button>
|
||||||
|
<el-button color="#626AEF" @click="publishArticle"> 发布 </el-button>
|
||||||
|
</span>
|
||||||
|
</template>
|
||||||
|
</el-dialog>
|
||||||
|
</el-card>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { ref, onMounted } from 'vue'
|
||||||
|
import Upload from '@/components/Upload.vue'
|
||||||
|
// import axios from 'axios'
|
||||||
|
import { useRoute } from 'vue-router'
|
||||||
|
import axios from 'axios'
|
||||||
|
|
||||||
|
const route = useRoute()
|
||||||
|
const article = ref({
|
||||||
|
id: null,
|
||||||
|
cover: '',
|
||||||
|
title: '',
|
||||||
|
content: '',
|
||||||
|
tagList: [],
|
||||||
|
category: ''
|
||||||
|
})
|
||||||
|
const publishDialogVisible = ref(false) // 发布弹窗的可视与否
|
||||||
|
const categoryList = ref([
|
||||||
|
{
|
||||||
|
id: 1,
|
||||||
|
name: '工具'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 2,
|
||||||
|
name: 'Vue'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 3,
|
||||||
|
name: '面试'
|
||||||
|
}
|
||||||
|
])
|
||||||
|
const tagList = ref([
|
||||||
|
{
|
||||||
|
id: 1,
|
||||||
|
name: 'JS'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 2,
|
||||||
|
name: 'Linux'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 3,
|
||||||
|
name: 'Vite'
|
||||||
|
}
|
||||||
|
])
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
if (route.params.id) {
|
||||||
|
axios.get('/api/article/' + route.params.id).then((res) => {
|
||||||
|
console.log(res)
|
||||||
|
article.value = res.data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
const removeCategory = () => {
|
||||||
|
article.value.category = null
|
||||||
|
}
|
||||||
|
|
||||||
|
const addCategory = (item) => {
|
||||||
|
article.value.category = item.name
|
||||||
|
}
|
||||||
|
|
||||||
|
const addTag = (item) => {
|
||||||
|
if (
|
||||||
|
article.value.tagList.length < 3 &&
|
||||||
|
article.value.tagList.findIndex((it) => it.id === item.id) === -1
|
||||||
|
) {
|
||||||
|
article.value.tagList.push(item)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const removeTag = (item) => {
|
||||||
|
const idx = article.value.tagList.findIndex((it) => it.id === item.id)
|
||||||
|
article.value.tagList.splice(idx, 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
const publishArticle = () => {
|
||||||
|
publishDialogVisible.value = false
|
||||||
|
console.log(article.value)
|
||||||
|
}
|
||||||
|
|
||||||
|
const upload = (url) => {
|
||||||
|
// 将子组件Upload中获取的图片url赋值给article的cover
|
||||||
|
article.value.cover = url
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.popover-title {
|
||||||
|
text-align: center;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
.popover-container {
|
||||||
|
margin-top: 1rem;
|
||||||
|
height: 200px;
|
||||||
|
overflow-y: auto;
|
||||||
|
.category-item {
|
||||||
|
cursor: pointer;
|
||||||
|
padding: 0.6rem 0.5rem;
|
||||||
|
}
|
||||||
|
.category-item:hover {
|
||||||
|
background-color: #f0f9eb;
|
||||||
|
color: #67c23a;
|
||||||
|
}
|
||||||
|
.tag-item {
|
||||||
|
cursor: pointer;
|
||||||
|
margin-right: 8px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
Loading…
Reference in new issue