You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
275 lines
5.6 KiB
275 lines
5.6 KiB
<template> |
|
<BlogHeader /> |
|
<div id="article-create"> |
|
<h3>更新文章</h3> |
|
<form> |
|
<div class="form-elem"> |
|
<span>标题:</span> |
|
<input v-model="title" type="text" placeholder="输入标题" /> |
|
</div> |
|
|
|
<div class="form-elem"> |
|
<span>分类:</span> |
|
<span v-for="category in categories" :key="category.id"> |
|
<!--样式也可以通过 :style 绑定--> |
|
<button |
|
class="category-btn" |
|
:style="categoryStyle(category)" |
|
@click.prevent="chooseCategory(category)" |
|
> |
|
{{ category.title }} |
|
</button> |
|
</span> |
|
</div> |
|
|
|
<div class="form-elem"> |
|
<span>标签:</span> |
|
<input |
|
v-model="tags" |
|
type="text" |
|
placeholder="输入标签,用逗号分隔" |
|
/> |
|
</div> |
|
|
|
<div class="form-elem"> |
|
<div style="margin-bottom: 10px">正文:</div> |
|
<textarea |
|
v-model="body" |
|
placeholder="输入正文" |
|
rows="20" |
|
cols="100" |
|
></textarea> |
|
</div> |
|
|
|
<div class="form-elem"> |
|
<button v-on:click.prevent="submit">提交</button> |
|
<button |
|
v-on:click.prevent="deleteArticle" |
|
style="background-color: darkred; margin-left: 30px" |
|
> |
|
删除 |
|
</button> |
|
</div> |
|
</form> |
|
</div> |
|
<BlogFooter /> |
|
</template> |
|
|
|
<script> |
|
import BlogHeader from "@/components/BlogHeader.vue"; |
|
import BlogFooter from "@/components/BlogFooter.vue"; |
|
import authorization from "@/utils/authorization"; |
|
import $ from "jquery"; |
|
import { onMounted, ref } from "vue"; |
|
import { useRoute, useRouter } from "vue-router"; |
|
|
|
export default { |
|
name: "ArticleEdit", |
|
components: { BlogHeader, BlogFooter }, |
|
setup() { |
|
// 文章标题 |
|
let title = ref(""); |
|
// 文章内容 |
|
let body = ref(""); |
|
// 文章的分类 |
|
let selectedCategory = ref(null); |
|
// 标签 |
|
let tags = ref(""); |
|
// 文章id |
|
let articleID = ref(null); |
|
// 所有分类 |
|
let categories = ref([]); |
|
|
|
const route = useRoute(); |
|
const router = useRouter(); |
|
|
|
// 页面初始化时获取所有分类 |
|
|
|
onMounted(() => { |
|
$.ajax({ |
|
url: "http://127.0.0.1:6789/api/category", |
|
type: "GET", |
|
success(resp) { |
|
categories.value = resp; |
|
}, |
|
}); |
|
|
|
$.ajax({ |
|
url: |
|
"http://127.0.0.1:6789/api/article/" + |
|
route.params.id + |
|
"/", |
|
type: "GET", |
|
success(resp) { |
|
const data = resp; |
|
title.value = data.title; |
|
body.value = data.body; |
|
selectedCategory.value = data.category; |
|
tags.value = data.tags.join(","); |
|
articleID.value = data.id; |
|
console.log(tags.value); |
|
}, |
|
}); |
|
}); |
|
|
|
// 根据分类是否被选中,按钮的颜色发生变化 |
|
const categoryStyle = (category) => { |
|
if ( |
|
selectedCategory.value !== null && |
|
category.id === selectedCategory.value.id |
|
) { |
|
return { |
|
backgroundColor: "black", |
|
}; |
|
} |
|
return { |
|
backgroundColor: "lightgrey", |
|
color: "black", |
|
}; |
|
}; |
|
|
|
// 选取分类 |
|
const chooseCategory = (category) => { |
|
// 如果点击已选取的分类,则将 selectedCategory 置空 |
|
if ( |
|
selectedCategory.value !== null && |
|
selectedCategory.value.id === category.id |
|
) { |
|
selectedCategory.value = null; |
|
} else { |
|
selectedCategory.value = category; |
|
} |
|
}; |
|
|
|
// 点击提交按钮 |
|
const submit = () => { |
|
authorization().then((response) => { |
|
if (response[0]) { |
|
let data = { |
|
title: title.value, |
|
body: body.value, |
|
}; |
|
|
|
data.category_id = selectedCategory.value |
|
? selectedCategory.value.id |
|
: null; |
|
|
|
// 标签预处理 |
|
data.tags = tags.value |
|
// 用逗号分隔标签 |
|
.split(/[,,]/) |
|
// 剔除标签首尾空格 |
|
.map((x) => x.trim()) |
|
// 剔除长度为零的无效标签 |
|
.filter((x) => x.charAt(0) !== ""); |
|
|
|
const token = localStorage.getItem("access_blog"); |
|
$.ajax({ |
|
url: |
|
"http://127.0.0.1:6789/api/article/" + |
|
articleID.value + |
|
"/", |
|
type: "PUT", |
|
dataType: "json", // 传入json数据,需要写这三行 |
|
contentType:"application/json", |
|
data: JSON.stringify(data), |
|
headers: { |
|
Authorization: "Bearer " + token, |
|
}, |
|
success(resp) { |
|
router.push({ |
|
name: "detail", |
|
params: { id: resp.id }, |
|
}); |
|
}, |
|
error() { |
|
window.alert("令牌过期,请重新登录!"); |
|
}, |
|
}); |
|
} else { |
|
window.alert("令牌过期,请重新登录!"); |
|
} |
|
}); |
|
}; |
|
|
|
const deleteArticle = () => { |
|
authorization().then((response) => { |
|
const token = localStorage.getItem("access_blog"); |
|
if (response[0]) { |
|
$.ajax({ |
|
url: |
|
"http://127.0.0.1:6789/api/article/" + |
|
articleID.value + |
|
"/", |
|
type: "DELETE", |
|
headers: { |
|
Authorization: "Bearer " + token, |
|
}, |
|
success() { |
|
router.push({ |
|
name: "home", |
|
}); |
|
}, |
|
error() { |
|
window.alert("令牌过期,请重新登录!"); |
|
}, |
|
}); |
|
} else { |
|
alert("令牌过期,请重新登录。"); |
|
} |
|
}); |
|
}; |
|
|
|
return { |
|
categories, |
|
title, |
|
body, |
|
tags, |
|
selectedCategory, |
|
categoryStyle, |
|
articleID, |
|
submit, |
|
chooseCategory, |
|
deleteArticle, |
|
}; |
|
}, |
|
}; |
|
</script> |
|
|
|
<style scoped> |
|
.category-btn { |
|
margin-right: 10px; |
|
} |
|
#article-create { |
|
text-align: center; |
|
font-size: large; |
|
} |
|
form { |
|
text-align: left; |
|
padding-left: 100px; |
|
padding-right: 10px; |
|
padding-bottom: 50px; |
|
} |
|
.form-elem { |
|
padding: 10px; |
|
} |
|
.form-elem-1 { |
|
display: inline-block; |
|
padding: 10px; |
|
} |
|
input { |
|
height: 25px; |
|
padding-left: 10px; |
|
width: 50%; |
|
} |
|
button { |
|
height: 35px; |
|
cursor: pointer; |
|
border: none; |
|
outline: none; |
|
background: steelblue; |
|
color: whitesmoke; |
|
border-radius: 5px; |
|
width: 60px; |
|
} |
|
</style>
|
|
|