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.

1439 lines
43 KiB

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<div class="outside">
<!-- 组件的内容 -->
<!-- 网站信息 -->
<div class="card-content1 shadow-box background-opacity">
<el-avatar style="margin-top: 20px" class="user-avatar" :size="120" :src="currentUser.avatar"></el-avatar>
<div class="web-name">{{currentUser.username}}</div>
<div class="web-info">
<div class="blog-info-box">
<span>博客</span>
<span id="totalBlogNum" class="blog-info-num"></span>
</div>
<div class="blog-info-box">
<span>分类</span>
<span id="labelTotalNum" class="blog-info-num"></span>
</div>
<div class="blog-info-box">
<span>访问量</span>
<span class="blog-info-num">{{ webInfo.historyAllCount }}</span>
</div>
</div>
<a class="collection-btn" @click="showTip()">
<i class="el-icon-star-off" style="margin-right: 2px"></i>朋友圈
</a>
</div>
<div style="display: inline-block;position: absolute;left: 470px;top: 208px; width: fit-content">
<!-- 写博客按钮 -->
<button class="write-blog-btn" @click="showEditor = true">
写个人博客
</button>
<div style="text-align: center;display: inline-block">
<button class="publicBlog" @click="showPostEditor = true"> 写公开博客</button>
</div>
</div>
<!--公开文章框-->
<div id="editorPost" v-if="showPostEditor" style="background-color: #efe5fa;padding-bottom: 10px">
<div>
<el-tag effect="dark" class="my-tag">
<svg viewBox="0 0 1024 1024" width="20" height="20" style="vertical-align: -3px;">
<path d="M0 0h1024v1024H0V0z" fill="#202425" opacity=".01"></path>
<path
d="M682.666667 204.8h238.933333a34.133333 34.133333 0 0 1 34.133333 34.133333v648.533334a68.266667 68.266667 0 0 1-68.266666 68.266666h-204.8V204.8z"
fill="#FFAA44"></path>
<path
d="M68.266667 921.6a34.133333 34.133333 0 0 0 34.133333 34.133333h785.066667a68.266667 68.266667 0 0 1-68.266667-68.266666V102.4a34.133333 34.133333 0 0 0-34.133333-34.133333H102.4a34.133333 34.133333 0 0 0-34.133333 34.133333v819.2z"
fill="#11AA66"></path>
<path
d="M238.933333 307.2a34.133333 34.133333 0 0 0 0 68.266667h136.533334a34.133333 34.133333 0 1 0 0-68.266667H238.933333z m0 204.8a34.133333 34.133333 0 1 0 0 68.266667h409.6a34.133333 34.133333 0 1 0 0-68.266667H238.933333z m0 204.8a34.133333 34.133333 0 1 0 0 68.266667h204.8a34.133333 34.133333 0 1 0 0-68.266667H238.933333z"
fill="#FFFFFF"></path>
</svg>
文章信息
</el-tag>
<el-form :model="article" :rules="rules" ref="ruleForm" label-width="150px"
class="demo-ruleForm">
<el-form-item label="标题" prop="articleTitle">
<el-input maxlength="30" v-model="article.articleTitle"></el-input>
</el-form-item>
<el-form-item label="内容" prop="articleContent">
<mavon-editor ref="md" @imgAdd="imgAdd" v-model="article.articleContent"/>
</el-form-item>
<el-form-item label="是否启用评论" prop="commentStatus">
<el-tag :type="article.commentStatus === false ? 'danger' : 'success'"
disable-transitions>
{{article.commentStatus === false ? '否' : '是'}}
</el-tag>
<el-switch v-model="article.commentStatus"></el-switch>
</el-form-item>
<el-form-item label="是否推荐" prop="recommendStatus">
<el-tag :type="article.recommendStatus === false ? 'danger' : 'success'"
disable-transitions>
{{article.recommendStatus === false ? '否' : '是'}}
</el-tag>
<el-switch v-model="article.recommendStatus"></el-switch>
</el-form-item>
<el-form-item label="是否可见" prop="viewStatus">
<el-tag :type="article.viewStatus === false ? 'danger' : 'success'"
disable-transitions>
{{article.viewStatus === false ? '否' : '是'}}
</el-tag>
<el-switch v-model="article.viewStatus"></el-switch>
</el-form-item>
<el-form-item v-if="article.viewStatus === false" label="不可见时的访问密码" prop="password">
<el-input maxlength="30" v-model="article.password"></el-input>
</el-form-item>
<el-form-item v-if="article.viewStatus === false" label="密码提示" prop="tips">
<el-input maxlength="60" v-model="article.tips"></el-input>
</el-form-item>
<el-form-item label="封面" prop="articleCover">
<div style="display: flex">
<el-input v-model="article.articleCover"></el-input>
<el-image class="table-td-thumb"
lazy
style="margin-left: 10px"
:preview-src-list="[article.articleCover]"
:src="article.articleCover"
fit="cover"></el-image>
</div>
<uploadPicture :isAdmin="true" :prefix="'articleCover'" style="margin-top: 10px" @addPicture="addArticleCover"
:maxSize="2"
:maxNumber="1"></uploadPicture>
</el-form-item>
<el-form-item label="分类" prop="sortId">
<el-select v-model="article.sortId" placeholder="请选择分类">
<el-option
v-for="item in sorts"
:key="item.id"
:label="item.sortName"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="标签" prop="labelId">
<el-select v-model="article.labelId" placeholder="请选择标签">
<el-option
v-for="item in labelsTemp"
:key="item.id"
:label="item.labelName"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
</el-form>
<div class="myCenter" style="margin-bottom: 22px">
<el-button type="primary" @click="submitForm('ruleForm')">保存</el-button>
<el-button type="danger" @click="resetForm('ruleForm')">重置所有修改</el-button>
</div>
</div>
</div>
<!-- 编辑框 -->
<div id="editorArea" class="blog-editor" v-if="showEditor">
<textarea id ="areaTitle" class="blog-editor-title" v-model="blogContentTitle" placeholder="请输入博客标题..."></textarea>
<div class="labelSelect">
<label for="category">选择博客分类:</label>
<select id="category" name="category" v-model="selectedCategoryIndex">
<option v-for="(label, index) in blogLabels" :value="index" :key="index">{{ label }}</option>
</select>
</div>
<textarea id = "areaContent" class="blog-editor-content" v-model="blogContent" placeholder="请输入博客正文..."></textarea>
<div style="display: inline-block;margin-top: 17px">
<el-upload
class="upload-demo"
ref="upload"
multiple
drag
:action="$constant.qiniuUrl"
:on-change="handleChange"
:before-upload="beforeUpload"
:on-success="handleSuccess"
:on-error="handleError"
:on-remove="handleRemove"
:http-request="customUpload"
:list-type="listType"
:accept="accept"
:limit="maxNumber"
:auto-upload="false">
<div class="el-upload__text">
<svg viewBox="0 0 1024 1024" width="40" height="40">
<path
d="M666.2656 629.4528l-113.7664-112.4864c-20.7872-20.5824-54.3232-20.5312-75.1104 0.1024l-113.3056 112.4864c-20.8896 20.736-21.0432 54.528-0.256 75.4688 20.736 20.8896 54.528 21.0432 75.4688 0.256l22.6304-22.4256v189.5936c0 29.44 23.9104 53.3504 53.3504 53.3504s53.3504-23.9104 53.3504-53.3504v-189.5424l22.6816 22.4256a53.1456 53.1456 0 0 0 37.5296 15.4112c13.7728 0 27.4944-5.2736 37.9392-15.8208 20.6336-20.9408 20.4288-54.7328-0.512-75.4688z"
fill="#FFE37B"></path>
<path
d="M820.992 469.504h-5.376c-3.072-163.328-136.3456-294.8096-300.4416-294.8096S217.856 306.1248 214.784 469.504H209.408c-100.7104 0-182.3744 81.664-182.3744 182.3744s81.664 182.3744 182.3744 182.3744h209.7664V761.856c-30.208 5.5808-62.464-3.3792-85.6576-26.7264-37.3248-37.5808-37.0688-98.5088 0.512-135.7824l113.3056-112.4864c37.2224-36.9664 97.8432-37.0176 135.168-0.1536l113.7664 112.4864c18.2272 18.0224 28.3648 42.0864 28.5184 67.7376 0.1536 25.6512-9.728 49.8176-27.7504 68.0448a95.40096 95.40096 0 0 1-68.3008 28.5184c-5.9392 0-11.776-0.512-17.5104-1.5872v72.3456h209.7664c100.7104 0 182.3744-81.664 182.3744-182.3744S921.7024 469.504 820.992 469.504z"
fill="#8C7BFD"></path>
</svg>
<div>拖拽 / 点击上传封面</div>
</div>
<template v-if="listType === 'picture'">
<div slot="tip" class="el-upload__tip">
一次最多上传{{maxNumber}}张图片,且每张图片不超过{{maxSize}}M
</div>
</template>
<template v-else>
<div slot="tip" class="el-upload__tip">
一次最多上传{{maxNumber}}个文件,且每个文件不超过{{maxSize}}M
</div>
</template>
</el-upload>
<el-button type="success" style="font-size: 12px" @click="submitUpload">
上传
</el-button>
</div>
<div class="editor-btns">
<button class="cancel-btn" @click="cancelEdit">取消</button>
<button class="publish-btn" @click="saveBlog" v-if="showPublishBtn" >发布</button>
<button @click="updateBlog" class="publish-btn" v-if="showUpdateBtn">更新</button>
</div>
</div>
<br/><br/>
<!-- 推荐博客 -->
<div class="card-content2-title">
<i class="el-icon-reading card-content2-icon"></i>
<span style="font-size: 28px">我的个人博客</span>
</div>
<div v-if="!$common.isEmpty(articles)" class="blog-card-container">
<div v-for="(article, index) in articles.slice().reverse()" :key="index" class="blog-card">
<div class="blog-card-header">
<div class="author">{{ article.username }}</div>
<div class="title" >{{ article.articleTitle }}</div>
</div>
<div class="blog-card-cover" >
<img :src="'http://s6xqq8hhg.hd-bkt.clouddn.com/userAvatar/' + article.articleCover" alt="Cover Image" width="100%">
</div>
<div class="blog-card-content" >
{{ article.articleContent }}
</div>
<div class="blog-card-footer">
<div class="label">{{ article.labelName }}</div>
<div class="date"><i class="el-icon-date" style="color: var(--greyFont)"></i>发布于 {{ article.createTime }}</div>
<br/>
<div class="date">最近更新于 {{ article.updateTime }}</div>
<div class="actions">
<div class="delete-icon" @click="deleteArticle(article)">
<img src="../assets/file/delete.png" alt="Delete Icon" width="26px" height="26px">
</div>
<div class="update-icon" @click="updateArticle(article)">
<img src="../assets/file/update.png" alt="Update Icon" width="30px" height="30px">
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import axios from "axios";
import * as events from "events";
import upload from '../utils/ajaxUpload';
const uploadPicture = () => import( "./common/uploadPicture");
export default {
components: {
uploadPicture
},
avatar: {
type: String
},
// 组件的逻辑和配置
data() {
return {
id: this.$route.query.id,
article: {
articleTitle: "",
articleContent: "",
commentStatus: true,
recommendStatus: false,
viewStatus: true,
password: "",
tips: "",
articleCover: "",
sortId: null,
labelId: null
},
sorts: [],
labels: [],
labelsTemp: [],
rules: {
articleTitle: [
{required: true, message: '请输入标题', trigger: 'change'}
],
articleContent: [
{required: true, message: '请输入内容', trigger: 'change'}
],
commentStatus: [
{required: true, message: '是否启用评论', trigger: 'change'}
],
recommendStatus: [
{required: true, message: '是否推荐', trigger: 'change'}
],
viewStatus: [
{required: true, message: '是否可见', trigger: 'change'}
],
articleCover: [
{required: true, message: '封面', trigger: 'change'}
],
sortId: [
{required: true, message: '分类', trigger: 'change'}
],
labelId: [
{required: true, message: '标签', trigger: 'blur'}
]
},
pagination: {
current: 1,
size: 5,
recommendStatus: true
},
currentUser: this.$store.state.currentUser,
recommendArticles: [],
admires: [],
showAdmireDialog: false,
articleSearch: "",
showEditor: false,
showPostEditor: false,
showUpdateBtn: false,
showPublishBtn: true,
blogContent: "",
blogContentTitle:"",
blogLabelName: "",
articles: [] , // 存储文章列表
labelTotalNum: 0,
articleUp: {
id: 1,
articleTitle: "",
articleContent: "",
userId: 1,
username: "",
sortId: 1,
labelId: 0,
labelName: "研发",
articleCover: ""
},
file:"",
blogLabels:[],
selectedCategoryIndex: 0, // 默认选中第一个选项
}
},
computed: {
events() {
return events
},
webInfo() {
return this.$store.state.webInfo;
},
sortInfo() {
return this.$store.state.sortInfo;
}
},
watch: {
'article.sortId'(newVal, oldVal) {
if (oldVal !== null) {
this.article.labelId = null;
}
if (!this.$common.isEmpty(newVal) && !this.$common.isEmpty(this.labels)) {
this.labelsTemp = this.labels.filter(l => l.sortId === newVal);
}
}
},
created() {
this.getRecommendArticles();
this.getAdmire();
this.getUserArticles(); // 调用获取用户文章列表的方法
this.getUserArticleLabelTotalNum();// 调用获取用户文章的标签种类数的方法
this.getBlogLabels();//调用获取标签分类的方法
this.getSortAndLabel();
console.log('getUserArticleLabelTotalNum is called');
},
methods: {
imgAdd(pos, file) {
let suffix = "";
if (file.name.lastIndexOf('.') !== -1) {
suffix = file.name.substring(file.name.lastIndexOf('.'));
}
let key = "articlePicture" + "/" + this.$store.state.currentAdmin.username.replace(/[^a-zA-Z]/g, '') + this.$store.state.currentAdmin.id + new Date().getTime() + Math.floor(Math.random() * 1000) + suffix;
let storeType = localStorage.getItem("defaultStoreType");
let fd = new FormData();
fd.append("file", file);
fd.append("key", key);
fd.append("relativePath", key);
fd.append("type", "articlePicture");
fd.append("storeType", storeType);
if (storeType === "local") {
this.saveLocal(pos, fd);
} else if (storeType === "qiniu") {
this.saveQiniu(pos, fd);
}
},
saveLocal(pos, fd) {
this.$http.upload(this.$constant.baseURL + "/resource/upload", fd, true)
.then((res) => {
if (!this.$common.isEmpty(res.data)) {
let url = res.data;
this.$refs.md.$img2Url(pos, url);
}
})
.catch((error) => {
this.$message({
message: error.message,
type: "error"
});
});
},
saveQiniu(pos, fd) {
this.$http.get(this.$constant.baseURL + "/qiniu/getUpToken", {key: fd.get("key")}, true)
.then((res) => {
if (!this.$common.isEmpty(res.data)) {
fd.append("token", res.data);
this.$http.uploadQiniu(this.$constant.qiniuUrl, fd)
.then((res) => {
if (!this.$common.isEmpty(res.key)) {
let url = this.$constant.qiniuDownload + res.key;
let file = fd.get("file");
this.$common.saveResource(this, "articlePicture", url, file.size, file.type, "qiniu", true);
this.$refs.md.$img2Url(pos, url);
}
})
.catch((error) => {
this.$message({
message: error.message,
type: "error"
});
});
}
})
.catch((error) => {
this.$message({
message: error.message,
type: "error"
});
});
},
addArticleCover(res) {
this.article.articleCover = res;
},
getSortAndLabel() {
this.$http.get(this.$constant.baseURL + "/webInfo/listSortAndLabel")
.then((res) => {
if (!this.$common.isEmpty(res.data)) {
this.sorts = res.data.sorts;
this.labels = res.data.labels;
if (!this.$common.isEmpty(this.id)) {
this.getArticle();
}
}
})
.catch((error) => {
this.$message({
message: error.message,
type: "error"
});
});
},
getArticle() {
this.$http.get(this.$constant.baseURL + "/admin/article/getArticleById", {id: this.id}, true)
.then((res) => {
if (!this.$common.isEmpty(res.data)) {
this.article = res.data;
}
})
.catch((error) => {
this.$message({
message: error.message,
type: "error"
});
});
},
submitForm(formName) {
if (this.article.viewStatus === false && this.$common.isEmpty(this.article.password)) {
this.$message({
message: "文章不可见时必须输入密码!",
type: "error"
});
return;
}
this.$refs[formName].validate((valid) => {
if (valid) {
if (this.$common.isEmpty(this.id)) {
this.saveArticle(this.article, "/article/saveArticle")
} else {
this.article.id = this.id;
this.saveArticle(this.article, "/article/updateArticle")
}
} else {
this.$message({
message: "请完善必填项!",
type: "error"
});
}
});
},
resetForm(formName) {
this.$refs[formName].resetFields();
if (!this.$common.isEmpty(this.id)) {
this.getArticle();
}
},
saveArticle(value, url) {
this.$confirm('确认保存?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'success',
center: true
}).then(() => {
this.$http.post(this.$constant.baseURL + url, value, true)
.then((res) => {
this.$message({
message: "保存成功!",
type: "success"
});
// this.$router.push({path: '/postList'});
this.showPostEditor = false;
this.article.articleContent = "";
this.article.articleCover = "";
this.article.articleTitle = "";
this.article.sortId = "";
})
.catch((error) => {
this.$message({
message: error.message,
type: "error"
});
});
}).catch(() => {
this.$message({
type: 'success',
message: '已取消保存!'
});
});
},
submitUpload() {
this.$refs.upload.submit();
},
customUpload(options) {
let suffix = "";
if (options.file.name.lastIndexOf('.') !== -1) {
suffix = options.file.name.substring(options.file.name.lastIndexOf('.'));
}
let key = this.prefix + "/" + (!this.$common.isEmpty(this.$store.state.currentUser.username) ? (this.$store.state.currentUser.username.replace(/[^a-zA-Z]/g, '') + this.$store.state.currentUser.id) : (this.$store.state.currentAdmin.username.replace(/[^a-zA-Z]/g, '') + this.$store.state.currentAdmin.id)) + new Date().getTime() + Math.floor(Math.random() * 1000) + suffix;
if (this.storeType === "local") {
let fd = new FormData();
fd.append("file", options.file);
fd.append("key", key);
fd.append("relativePath", key);
fd.append("type", this.prefix);
fd.append("storeType", this.storeType);
this.articleUp.articleCover = fd;
console.log(this.articleUp.articleCover+"fd");
console.log(options.file+"options.file");
return this.$http.upload(this.$constant.baseURL + "/resource/upload", fd, this.isAdmin);
} else if (this.storeType === "qiniu") {
const xhr = new XMLHttpRequest();
xhr.open('get', this.$constant.baseURL + "/qiniu/getUpToken?key=" + key, false);
if (this.isAdmin) {
xhr.setRequestHeader("Authorization", localStorage.getItem("adminToken"));
} else {
xhr.setRequestHeader("Authorization", localStorage.getItem("userToken"));
}
try {
xhr.send();
const res = JSON.parse(xhr.responseText);
if (res !== null && res.hasOwnProperty("code") && res.code === 200) {
options.data = {
token: res.data,
key: key
};
return upload(options);
} else if (res !== null && res.hasOwnProperty("code") && res.code !== 200) {
return Promise.reject(res.message);
} else {
return Promise.reject("服务异常!");
}
} catch (e) {
return Promise.reject(e.message);
}
}
},
// 文件上传成功时的钩子
handleSuccess(response, file, fileList) {
let url;
if (this.storeType === "local") {
url = response.data;
} else if (this.storeType === "qiniu") {
url = this.$constant.qiniuDownload + response.key;
this.$common.saveResource(this, this.prefix, url, file.size, file.raw.type, "qiniu", this.isAdmin);
}
this.$emit("addPicture", url);
},
handleError(err, file, fileList) {
this.$message({
message: err,
type: "error"
});
},
// 上传文件之前的钩子,参数为上传的文件,若返回 false 或者返回 Promise 且被 reject则停止上传
beforeUpload(file) {
},
// 文件列表移除文件时的钩子
handleRemove(file, fileList) {
},
// 添加文件、上传成功和上传失败时都会被调用
handleChange(file, fileList) {
let flag = false;
if (file.size > this.maxSize * 1024 * 1024) {
this.$message({
message: "图片最大为" + this.maxSize + "M",
type: "warning"
});
flag = true;
}
if (flag) {
fileList.splice(fileList.size - 1, 1);
}
},
selectSort(sort) {
this.$emit("selectSort", sort);
},
selectArticle() {
this.$emit("selectArticle", this.articleSearch);
},
showAdmire() {
if (this.$common.isEmpty(this.$store.state.currentUser)) {
this.$message({
message: "请先登录!",
type: "error"
});
return;
}
this.showAdmireDialog = true;
},
getAdmire() {
this.$http.get(this.$constant.baseURL + "/webInfo/getAdmire")
.then((res) => {
if (!this.$common.isEmpty(res.data)) {
this.admires = res.data;
}
})
.catch((error) => {
this.$message({
message: error.message,
type: "error"
});
});
},
getRecommendArticles() {
this.$http.post(this.$constant.baseURL + "/article/listArticle", this.pagination)
.then((res) => {
if (!this.$common.isEmpty(res.data)) {
this.recommendArticles = res.data.records;
}
})
.catch((error) => {
this.$message({
message: error.message,
type: "error"
});
});
},
getUserArticleLabelTotalNum() {
const id = this.$store.state.currentUser.id; // 获取当前用户的ID
this.$http.get(`/admin/article/getUserArticleLabelTotalNum?id=${id}`) // 发送GET请求指定获取用户文章标签数量的接口地址并传递当前用户的ID作为参数
.then(response => {
const labelNum = response; // 获取标签数量
document.getElementById("labelTotalNum").innerText = labelNum;
this.labelTotalNum = labelNum;
console.log(labelNum); // 在控制台打印标签数量
console.log("label日志");
})
.catch(error => {
console.error('请求错误:', error);
});
},
getUserArticles() {
const id = this.$store.state.currentUser.id;
this.$http.get(`/admin/article/getArticleByUserId?id=${id}`)
.then(response => {
if (!this.$common.isEmpty(response.data)) {
this.articles = response.data;
const currentUser = this.$store.state.currentUser;
this.articles.forEach(article => {
console.log(article.articleCover)
article.username = currentUser.username;
article.labelName = this.blogLabels[article.labelId-1];
document.getElementById("totalBlogNum").innerText = this.articles.length;
this.getUserArticleLabelTotalNum();
// 发送请求获取博客封面图
this.$http.get(`http://s6xqq8hhg.hd-bkt.clouddn.com/userAvatar/${article.articleCover}`)
.then(response => {
console.log(response.data+"star");
// 在这里处理获取到的博客封面图
})
.catch(error => {
console.log(error);
});
});
}
})
.catch(error => {
this.$message({
message: error.message,
type: "error"
});
});
},
showTip() {
this.$router.push({path: '/weiYan'});
},
cancelEdit() {
// 取消编辑
this.showEditor = false;
this.showUpdateBtn = false;
this.showPublishBtn = true;
this.blogContent = "";
this.blogContentTitle = "";
},
saveBlog() {
let selectedIndex = this.selectedCategoryIndex+1;
console.log('选中的分类索引号为:' + selectedIndex);
const articleVO = {
userId:this.$store.state.currentUser.id,
articleContent: this.blogContent ,// 获取博客内容
articleTitle:this.blogContentTitle,
// 其他博客相关数据...
sortId:1,
labelId:selectedIndex,
articleCover:this.articleUp.articleCover
};
console.log(this.$store.state.currentUser)
console.log(this.articleUp.articleCover+"cover")
// console.log("index:"+document.getElementById('category').select)
this.$http.post('/article/saveArticle', articleVO)
.then(response => {
// 请求成功处理逻辑
console.log('博客保存成功!');
this.getUserArticles();
this.showEditor = false;
this.blogContent = "";
this.blogContentTitle = "";
this.$message({
message: '发布成功',
type: 'success'
});
})
.catch(error => {
// 请求失败处理逻辑
console.error('博客保存失败:', error);
this.$message({
message: '发布失败',
type: 'error'
});
});
},
deleteArticle(article){
// 发送异步请求删除文章
this.$http.get(`/article/deleteArticle?id=${article.id}`)
// .then(response => response.json())
.then(response => {
// 请求成功处理逻辑
console.log('博客删除成功!');
console.log(response)
this.getUserArticles()
this.getUserArticleLabelTotalNum()
})
.catch(error => {
// 请求失败处理逻辑
console.error('删除博客失败:', error);
});
},
updateArticle(article) {
this.showEditor = true;
this.showUpdateBtn = true;
this.showPublishBtn = false;
this.blogContentTitle = article.articleTitle;
this.blogContent = article.articleContent;
this.selectedCategoryIndex = article.labelId - 1; // 设置下拉框选中的索引值
this.articleUp.id = article.id;
// this.blogLabelName
// 判断是否找到了 #editorArea 元素
const editorArea = document.getElementById('editorArea');
if (editorArea) {
editorArea.scrollIntoView({ behavior: "smooth", block: "start" });
} else {
console.log("#editorArea not found");
}
},
updateBlog(){
this.blogContentTitle = document.getElementById('areaTitle').value
this.blogContent = document.getElementById('areaContent').value
// document.getElementById('category').
this.articleUp.articleContent = document.getElementById('areaContent').value
this.articleUp.articleTitle = document.getElementById('areaTitle').value
this.articleUp.username = this.$store.state.currentUser.username
this.articleUp.labelId = this.selectedCategoryIndex+1
//发送异步请求更新文章
this.$http.post('/article/updateArticle', this.articleUp)
.then(response => {
// 请求成功处理逻辑
console.log('博客更新成功!');
console.log(response)
this.getUserArticles()
this.getUserArticleLabelTotalNum()
this.$message({
message: '更新成功',
type: 'success'
});
this.showEditor = false;
this.showPublishBtn = true;
this.showUpdateBtn = false;
this.blogContent = "";
this.blogContentTitle = "";
})
.catch(error => {
// 请求失败处理逻辑
console.error('更新博客失败:', error);
this.$message({
message: '更新失败',
type: 'error'
});
this.showPublishBtn = true;
this.showUpdateBtn = false;
this.blogContent = "";
this.blogContentTitle = "";
});
},
getBlogLabels() {
const url = "/webInfo/listLabel";
console.log("gettingLabels");
// 发送GET请求
axios.get(url)
.then(response => {
console.log(response.data.data)
const labels = response.data.data;
this.blogLabels = Object.values(labels).map(label => label.labelName);
// 将标签数据赋值给blogLabels数组
// this.blogLabels = labels;
})
.catch(error => {
// 请求失败,处理错误
console.error(error);
});
},
handleFileChange() {
let file0 = this.$refs.fileInput.files[0];
this.file = file0;
console.log('上传的文件:', file0);
// 这里可以进行进一步的处理,比如上传文件到服务器等操作
}
}
}
</script>
<style scoped>
.outside{
background: linear-gradient(-45deg, #e8d8b9, #fae1d9, #a3e9eb, #bdbdf0, #eec1ea);
}
/* 组件的样式 */
.card-content1 {
background: linear-gradient(-45deg, #e8d8b9, #eccec5, #a3e9eb, #bdbdf0, #eec1ea);
background-size: 400% 400%;
animation: gradientBG 10s ease infinite;
display: flex;
flex-direction: column;
align-items: center;
border-radius: 10px;
position: relative;
/*color: var(--white);*/
overflow: hidden;
}
.card-content1 :not(:first-child) {
z-index: 10;
}
.web-name {
font-size: 30px;
font-weight: bold;
margin: 20px 0;
}
.web-info {
width: 80%;
display: flex;
flex-direction: row;
justify-content: space-around;
}
.blog-info-box {
display: flex;
flex-direction: column;
align-items: center;
justify-content: space-around;
font-size: 24px;
}
.blog-info-num {
margin-top: 12px;
}
.collection-btn {
position: relative;
margin-top: 12px;
background: var(--lightGreen);
cursor: pointer;
width: 65%;
height: 35px;
border-radius: 1rem;
text-align: center;
line-height: 35px;
color: var(--white);
overflow: hidden;
z-index: 1;
margin-bottom: 25px;
}
.collection-btn::before {
background: var(--gradualRed);
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
content: "";
transform: scaleX(0);
transform-origin: 0;
transition: transform 0.5s ease-out;
transition-timing-function: cubic-bezier(0.45, 1.64, 0.47, 0.66);
border-radius: 1rem;
z-index: -1;
}
.collection-btn:hover::before {
transform: scaleX(1);
}
.write-blog-btn {
//position: absolute;
//left: 470px;
//top: 197px;
//width: 160px;
//height: 63px;
margin-top: 7px;
background-color: var(--gradualRed);
color: #181313;
border-radius: 20px;
font-size: 24px;
font-weight: bold;
display: inline-block;
justify-content: center;
align-items: center;
cursor: pointer;
transition: all .2s ease-in-out;
border: 2px solid #1675b4; /* 添加边框 */
}
.write-blog-btn:hover {
transform: scale(1.1);
border: 2px solid #053246; /* 鼠标悬停时修改边框颜色 */
}
.write-blog-btn:hover {
transform: scale(1.1); /* 鼠标悬停时缩放 */
}
.blog-editor {
margin: 0 auto;
align-self: center;
width: 80%;
height: 830px;
background-color: #e7deef;
border-radius: 20px;
margin-top: 20px;
padding: 10px;
border: #5a0bb9 1px solid;
box-sizing: border-box;
}
.blog-editor-title {
display: block;
margin: 0 auto;
width: 40%;
height: 60px;
background-color: #ffffff;
border-radius: 20px;
padding: 10px;
box-sizing: border-box;
font-weight: bolder;
font-size: 23px;
text-align: center; /* 将文本居中对齐 */
font-family: "Microsoft YaHei";
}
.blog-editor-content {
display: block;
margin: 0 auto;
width: 100%;
height: 450px;
//resize: none;
//border: none;
//outline: none;
border-radius: 20px;
font-size: 30px;
font-weight: bold;
margin-top: 10px;
//font-family: "Microsoft YaHei";
}
.editor-btns {
display: inline-block;
float: right;
justify-content: flex-end;
margin-top: 16px;
}
.cancel-btn,
.publish-btn {
width: 100px;
height: 35px;
color: #fff;
border-radius: 10px;
cursor: pointer;
transition: all .2s linear;
font-size: 19px;
font-weight: bold;
margin-top: 170px;
}
.cancel-btn {
background-color: #ccc;
margin-right: 10px;
}
.publish-btn {
background-color: var(--gradualRed);
color: #1d1f21;
}
.cancel-btn:hover,
.publish-btn:hover {
transform: translateY(-2px);
}
.card-content1 {
background: linear-gradient(-45deg, #e8d8b9, #eccec5, #a3e9eb, #bdbdf0, #eec1ea);
background-size: 400% 400%;
animation: gradientBG 10s ease infinite;
display: flex;
flex-direction: column;
align-items: center;
border-radius: 10px;
position: relative;
/*color: var(--white);*/
overflow: hidden;
}
.card-content1 :not(:first-child) {
z-index: 10;
}
.web-name {
font-size: 30px;
font-weight: bold;
margin: 20px 0;
}
.web-info {
width: 80%;
display: flex;
flex-direction: row;
justify-content: space-around;
}
.blog-info-box {
display: flex;
flex-direction: column;
align-items: center;
justify-content: space-around;
}
.blog-info-num {
margin-top: 12px;
}
.collection-btn {
position: relative;
margin-top: 12px;
background: var(--lightGreen);
cursor: pointer;
width: 65%;
height: 35px;
border-radius: 1rem;
text-align: center;
line-height: 35px;
color: var(--white);
overflow: hidden;
z-index: 1;
margin-bottom: 25px;
}
.collection-btn::before {
background: var(--gradualRed);
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
content: "";
transform: scaleX(0);
transform-origin: 0;
transition: transform 0.5s ease-out;
transition-timing-function: cubic-bezier(0.45, 1.64, 0.47, 0.66);
border-radius: 1rem;
z-index: -1;
}
.collection-btn:hover::before {
transform: scaleX(1);
}
.card-content2-title {
font-size: 18px;
margin-bottom: 20px;
text-align: center;
}
.card-content2-icon {
color: var(--red);
margin-right: 5px;
animation: scale 1s ease-in-out infinite;
font-size: 30px;
}
.aside-post-detail {
display: flex;
cursor: pointer;
width: 70%;
//background-color: #1a252f;
}
.aside-post-image {
width: 200px;
border-radius: 0.2rem;
margin-right: 8px;
overflow: hidden;
font-size: 30px;
}
.error-aside-image {
display: inline-block;
background: var(--themeBackground);
color: var(--white);
padding: 10px;
text-align: center;
width: 100px;
height: 100%;
//background-color: #1abc9c;
}
.aside-post-title {
display: inline-block;
width: 360px;
text-align: center;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
background-color: rgb(236, 231, 153);
line-height: 30px; /* 假设容器高度为 30px */
text-indent: -15px; /* 负的半个 line-height */
padding-top: 3px;
border-radius: 5px;
font-size: 30px;
}
.aside-post-content {
display: inline-block;
width: 100%;
text-align: center;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
background-color: rgb(193, 236, 153);
line-height: 30px; /* 假设容器高度为 30px */
text-indent: -15px; /* 负的半个 line-height */
padding-top: 3px;
border-radius: 5px;
margin-left: 10px;
font-size: 20px;
}
.error-aside-image:hover,
.aside-post-title:hover,
.aside-post-content:hover,
.aside-post-label {
box-shadow: 0 0 5px rgba(0, 0, 0, 0.5);
}
.aside-post-label {
width: 300px;
display: inline-block;
background-color: #ffffff;
margin-top: 8px;
margin-bottom: 20px;
margin-left: 10px;
color: var(--greyFont);
font-size: 23px;
text-align: center;
background-color: #eebcf1;
}
.aside-post-date {
margin-top: 8px;
margin-bottom: 20px;
color: var(--greyFont);
font-size: 23px;
}
.recommend-aside-header-author {
display: inline-block;
text-align: center;
width: 100px;
font-size: 30px;
margin-right: 20px;
background-color: #c5fcf1;
margin-bottom: 10px;
}
.recommend-aside-header-title {
display: inline-block;
text-align: center;
width: 200px;
font-size: 30px;
background-color: #f5dedf;
margin-bottom: 10px;
}
.recommend-aside-header-content {
margin-left: 20px;
display: inline-block;
font-size: 30px;
text-align: center;
width: 609px;
background-color: #e1f7f8;
margin-bottom: 10px;
}
.recommend-aside-header-label {
margin-left: 42px;
display: inline-block;
font-size: 30px;
text-align: center;
width: 160px;
background-color: #e1f7f8;
margin-bottom: 10px;
}
.delete-icon {
//background-image: url(../assets/file/delete.jpg);
background-repeat: no-repeat;
background-size: contain;
width: 26px; /* 图标的宽度 */
height: 26px; /* 图标的高度 */
cursor: pointer;
margin-top: 4px;
margin-left: 3px;
}
.update-icon {
//background-image: url(../assets/file/delete.jpg);
background-repeat: no-repeat;
background-size: contain;
width: 29px; /* 图标的宽度 */
height: 26px; /* 图标的高度 */
cursor: pointer;
margin-top: 4px;
margin-left: 6px;
}
.labelSelect {
//margin: 30px;
padding: 4px;
//background-color: rgba(215, 188, 248, 0.64);
margin: 0 auto;
width: 100%;
display: inline-block;
text-align: center;
font-size: 23px;
}
select {
font-size: 20px; /* 修改select框的字体大小 */
padding: 8px; /* 添加一些内边距 */
border-radius: 10px; /* 圆角边框 */
border: 2px solid #ccc; /* 边框样式 */
background-color: #f5f5f5; /* 背景颜色 */
}
option {
font-size: 18px; /* 修改选项的字体大小 */
color: #333; /* 修改选项的字体颜色 */
}
.blog-card-container {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
}
.blog-card {
width: 31%;
margin: 20px auto;
background: linear-gradient(to bottom, #f3dcfc, #e5ddff);
box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2);
border-radius: 10px;
padding: 20px;
height: 550px;
}
.blog-card:hover {
transform: translateY(-5px); /* 鼠标悬停时微微抬起 */
}
.blog-card-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 10px;
}
.blog-card-cover {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 10px;
background-color: #e0d0f3;
}
.author {
font-weight: bold;
font-size: 16px;
}
.title {
font-size: 24px;
cursor: pointer;
color: #333; /* 标题颜色 */
}
.blog-card-content {
font-size: 18px;
line-height: 1.6;
overflow: auto; /* 使用滚动条来展示溢出的内容 */
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 3; /* 控制正文行数 */
-webkit-box-orient: vertical;
height: 60% /* 设置卡片内容的最大高度 */
}
.blog-card-content::-webkit-scrollbar {
width: 8px; /* 设置滚动条的宽度 */
}
.blog-card-content::-webkit-scrollbar-thumb {
background-color: purple; /* 设置滚动条滑块的颜色 */
border-radius: 4px; /* 设置滚动条滑块的圆角 */
}
.blog-card-content::-webkit-scrollbar-track {
background-color: lightgray; /* 设置滚动条轨道的背景颜色 */
border-radius: 4px; /* 设置滚动条轨道的圆角 */
}
.blog-card-footer {
display: flex;
justify-content: space-between;
align-items: center;
margin-top: 20px;
font-size: 14px;
color: #666; /* 页脚文字颜色 */
}
.label,
.date {
margin-right: 10px;
font-size: 17px;
display: inline-block;
}
.actions {
display: flex;
align-items: center;
}
.delete-icon,
.update-icon {
margin-left: 10px;
cursor: pointer;
}
.pictureUpload {
display: inline-block;
margin-top: 17px;
background-color: #d0c9f8; /* 设置按钮背景颜色 */
color: #fff; /* 设置文字颜色为白色 */
border: none; /* 移除边框 */
padding: 10px 20px; /* 调整内边距 */
font-size: 18px; /* 设置字体大小 */
border-radius: 10px; /* 添加圆角边框 */
cursor: pointer; /* 鼠标悬停时显示手型光标 */
transition: background-color 0.3s ease; /* 添加过渡效果 */
}
.pictureUpload:hover {
background-color: #b5a9f1; /* 鼠标悬停时修改背景颜色 */
}
.blog-card-cover img {
width: 100%; /* 设置图片宽度为容器宽度 */
height: 100px; /* 设置图片高度为容器高度 */
object-fit: contain;
}
.publicBlog {
margin-left: 10px;
//display: inline-block;
margin-top: 7px;
background-color: var(--gradualRed);
color: #181313;
border-radius: 20px;
font-size: 24px;
font-weight: bold;
display: inline-block;
justify-content: center;
align-items: center;
cursor: pointer;
transition: all .2s ease-in-out;
border: 2px solid #1675b4; /* 添加边框 */
}
.publicBlog:hover {
background-color: #2980b9;
}
</style>