<template>
<div>
<!-- banner -->
<div class="home-banner">
<div class="banner-container">
<!-- 联系方式 -->
<h1 class="blog-title animated zoomIn">
星之卡比
</h1>
<!-- 一言 -->
<div class="blog-intro">
{{ obj.output }} <span class="typed-cursor">|</span>
</div>
<!-- 联系方式 -->
<div class="blog-contact">
<a
class="iconfont iconqq"
target="_blank"
href="http://wpa.qq.com/msgrd?v=3&uin=1192176811&site=qq&menu=yes"
/>
<a
target="_blank"
href="https://github.com/X1192176811"
class="ml-5 mr-5 iconfont icongithub"
/>
<a
target="_blank"
href="https://gitee.com/feng_meiyu"
class="iconfont icongitee-fill-round"
/>
</div>
</div>
<!-- 向下滚动 -->
<div class="scroll-down" @click="scrollDown">
<v-icon color="#fff" class="scroll-down-effects">
mdi-chevron-down
</v-icon>
</div>
</div>
<!-- 主页文章 -->
<v-row class="home-container">
<v-col md="9" cols="12">
<v-card
class="animated zoomIn article-card"
style="border-radius: 12px 8px 8px 12px"
v-for="(item, index) of articleList"
:key="item.id"
>
<!-- 文章封面图 -->
<div :class="isRight(index)">
<router-link :to="'/articles/' + item.id">
<v-img
class="on-hover"
width="100%"
height="100%"
:src="item.articleCover"
/>
</router-link>
</div>
<!-- 文章信息 -->
<div class="article-wrapper">
<div style="line-height:1.4">
<router-link :to="'/articles/' + item.id">
{{ item.articleTitle }}
</router-link>
</div>
<div class="article-info">
<!-- 是否置顶 -->
<span v-if="item.isTop == 1">
<span style="color:#ff7242">
<i class="iconfont iconzhiding" /> 置顶
</span>
<span class="separator">|</span>
</span>
<!-- 发表时间 -->
<v-icon size="14">mdi-calendar-month-outline</v-icon>
{{ item.createTime | date }}
<span class="separator">|</span>
<!-- 文章分类 -->
<router-link :to="'/categories/' + item.categoryId">
<v-icon size="14">mdi-inbox-full</v-icon>
{{ item.categoryName }}
</router-link>
<span class="separator">|</span>
<!-- 文章标签 -->
<router-link
style="display:inline-block"
:to="'/tags/' + tag.id"
class="mr-1"
v-for="tag of item.tagDTOList"
:key="tag.id"
>
<v-icon size="14">mdi-tag-multiple</v-icon>{{ tag.tagName }}
</router-link>
</div>
<!-- 文章内容 -->
<div class="article-content">
{{ item.articleContent }}
</div>
</div>
</v-card>
<!-- 无限加载 -->
<infinite-loading >
<div slot="no-more" />
</infinite-loading>
</v-col>
<!-- 博主信息 -->
<v-col md="3" cols="12" class="d-md-block d-none">
<div class="blog-wrapper">
<v-card class="animated zoomIn blog-card mt-5">
<div class="author-wrapper">
<!-- 博主头像 -->
<v-avatar size="110">
<img class="author-avatar" :src="blogInfo.avatar" />
</v-avatar>
<div style="font-size: 1.375rem">{{ blogInfo.nickname }}</div>
<div style="font-size: 0.875rem;">{{ blogInfo.intro }}</div>
</div>
<!-- 博客信息 -->
<div class="blog-info-wrapper">
<div class="blog-info-data">
<router-link to="/archives">
<div style="font-size: 0.875rem">文章</div>
<div style="font-size: 1.25rem">
{{ blogInfo.articleCount }}
</div>
</router-link>
</div>
<div class="blog-info-data">
<router-link to="/categories">
<div style="font-size: 0.875rem">分类</div>
<div style="font-size: 1.25rem">
{{ blogInfo.categoryCount }}
</div>
</router-link>
</div>
<div class="blog-info-data">
<router-link to="/tags">
<div style="font-size: 0.875rem">标签</div>
<div style="font-size: 1.25rem">{{ blogInfo.tagCount }}</div>
</router-link>
</div>
</div>
<!-- 收藏按钮 -->
<a class="collection-btn" @click="tip = true">
<v-icon color="#fff" size="18" class="mr-1">mdi-bookmark</v-icon>
加入书签
</a>
<div class="card-info-social">
<a
class="iconfont iconqq"
target="_blank"
href="http://wpa.qq.com/msgrd?v=3&uin=1192176811&site=qq&menu=yes"
/>
<a
target="_blank"
href="https://github.com/X1192176811"
class="ml-5 mr-5 iconfont icongithub"
/>
<a
target="_blank"
href="https://gitee.com/feng_meiyu"
class="iconfont icongitee-fill-round"
/>
</div>
</v-card>
<!-- 网站信息 -->
<v-card class="blog-card animated zoomIn mt-5 big">
<div class="web-info-title">
<v-icon size="18">mdi-bell</v-icon>
公告
</div>
<div style="font-size:0.875rem">
{{ blogInfo.notice }}
</div>
</v-card>
<!-- 网站信息 -->
<v-card class="blog-card animated zoomIn mt-5">
<div class="web-info-title">
<v-icon size="18">mdi-chart-line</v-icon>
网站资讯
</div>
<div class="web-info">
<div style="padding:4px 0 0">
运行时间:<span class="float-right">{{ time }}</span>
</div>
<div style="padding:4px 0 0">
总访问量:<span class="float-right">
{{ blogInfo.viewsCount }}
</span>
</div>
</div>
</v-card>
</div>
</v-col>
</v-row>
<!-- 提示消息 -->
<v-snackbar v-model="tip" top color="#49b1f5" :timeout="2000">
按CTRL+D 键将本页加入书签
</v-snackbar>
</div>
</template>
<script>
import EasyTyper from "easy-typer-js";
export default {
created() {
this.init();
// this.getBlogInfo();
this.timer = setInterval(this.runTime, 1000);
},
data: function() {
return {
tip: false,
time: "",
obj: {
output: "",
isEnd: false,
speed: 300,
singleBack: false,
sleep: 0,
type: "rollback",
backSpeed: 40,
sentencePause: true
},
articleList: [],
blogInfo: {},
current: 1
};
},
methods: {
// 初始化
init() {
document.title = this.$route.meta.title;
// 一言Api进行打字机循环输出效果
fetch("https://v1.hitokoto.cn?c=i")
.then(res => {
return res.json();
})
.then(({ hitokoto }) => {
this.initTyped(hitokoto);
});
},
initTyped(input, fn, hooks) {
const obj = this.obj;
// eslint-disable-next-line no-unused-vars
const typed = new EasyTyper(obj, input, fn, hooks);
},
scrollDown() {
window.scrollTo({
behavior: "smooth",
top: document.documentElement.clientHeight
});
},
runTime() {
var timeold =
new Date().getTime() - new Date("December 12,2019").getTime();
var msPerDay = 24 * 60 * 60 * 1000;
var daysold = Math.floor(timeold / msPerDay);
var str = "";
var day = new Date();
str += daysold + "天";
str += day.getHours() + "时";
str += day.getMinutes() + "分";
str += day.getSeconds() + "秒";
this.time = str;
},
// getBlogInfo() {
// this.axios.get("/api/").then(({ data }) => {
// this.blogInfo = data.data;
// this.$store.commit("checkBlogInfo", data.data);
// });
// },
// infiniteHandler($state) {
// let md = require("markdown-it")();
// this.axios
// .get("/api/articles", {
// params: {
// current: this.current
// }
// })
// .then(({ data }) => {
// if (data.data.length) {
// // 去除markdown标签
// data.data.forEach(item => {
// item.articleContent = md
// .render(item.articleContent)
// .replace(/<\/?[^>]*>/g, "")
// .replace(/[|]*\n/, "")
// .replace(/&npsp;/gi, "");
// });
// this.articleList.push(...data.data);
// this.current++;
// $state.loaded();
// } else {
// $state.complete();
// }
// });
// }
},
computed: {
isRight() {
return function(index) {
if (index % 2 == 0) {
return "article-cover left-radius";
}
return "article-cover right-radius";
};
}
}
};
</script>
<style lang="stylus">
.typed-cursor
opacity: 1
animation: blink 0.7s infinite
@keyframes blink
0%
opacity: 1
50%
opacity: 0
100%
opacity: 1
</style>
<style scoped>
.home-banner {
position: absolute;
top: -60px;
left: 0;
right: 0;
height: 100vh;
background: url("../../assets/img/bg.png")
center center / cover no-repeat;
background-color: #49b1f5;
background-attachment: fixed;
text-align: center;
color: #fff !important;
animation: header-effect 1s;
}
.banner-container {
margin-top: 43vh;
line-height: 1.5;
color: #eee;
}
.blog-contact a {
color: #fff !important;
}
.card-info-social {
line-height: 40px;
text-align: center;
font-size: 1.5rem;
margin: 6px 0 -6px;
}
.left-radius {
border-radius: 8px 0 0 8px !important;
order: 0;
}
.right-radius {
border-radius: 0 8px 8px 0 !important;
order: 1;
}
.article-wrapper {
font-size: 14px;
}
@media (min-width: 760px) {
.blog-title {
font-size: 2.5rem;
}
.blog-intro {
font-size: 1.5rem;
}
.blog-contact {
display: none;
}
.home-container {
max-width: 1200px;
margin: calc(100vh - 48px) auto 28px auto;
padding: 0 5px;
}
.article-card {
display: flex;
align-items: center;
height: 280px;
width: 100%;
margin-top: 20px;
}
.article-cover {
overflow: hidden;
height: 100%;
width: 45%;
}
.on-hover {
transition: all 0.6s;
}
.article-card:hover .on-hover {
transform: scale(1.1);
}
.article-wrapper {
padding: 0 2.5rem;
width: 55%;
}
.article-wrapper a {
font-size: 1.5rem;
transition: all 0.3s;
}
}
@media (max-width: 759px) {
.blog-title {
font-size: 26px;
}
.blog-contact {
font-size: 1.25rem;
line-height: 2;
}
.home-container {
width: 100%;
margin: calc(100vh - 66px) auto 0 auto;
}
.article-card {
margin-top: 1rem;
}
.article-cover {
border-radius: 8px 8px 0 0 !important;
height: 230px !important;
width: 100%;
}
.article-cover div {
border-radius: 8px 8px 0 0 !important;
}
.article-wrapper {
padding: 1.25rem 1.25rem 1.875rem;
}
.article-wrapper a {
font-size: 1.25rem;
transition: all 0.3s;
}
}
.scroll-down {
cursor: pointer;
position: absolute;
bottom: 0;
width: 100%;
}
.scroll-down i {
font-size: 2rem;
}
.article-wrapper a:hover {
color: #8e8cd8;
}
.article-info {
font-size: 95%;
color: #858585;
line-height: 2;
margin: 0.375rem 0;
}
.article-info a {
font-size: 95%;
color: #858585 !important;
}
.article-content {
line-height: 2;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
}
.blog-wrapper {
position: sticky;
top: 10px;
}
.blog-card {
line-height: 2;
padding: 1.25rem 1.5rem;
}
.author-wrapper {
text-align: center;
}
.blog-info-wrapper {
display: flex;
justify-self: center;
padding: 0.875rem 0;
}
.blog-info-data {
flex: 1;
text-align: center;
}
.blog-info-data a {
text-decoration: none;
}
.collection-btn {
text-align: center;
z-index: 1;
font-size: 14px;
position: relative;
display: block;
background-color: #49b1f5;
color: #fff !important;
height: 32px;
line-height: 32px;
transition-duration: 1s;
transition-property: color;
}
.collection-btn:before {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
z-index: -1;
background: #ff7242;
content: "";
transition-timing-function: ease-out;
transition-duration: 0.5s;
transition-property: transform;
transform: scaleX(0);
transform-origin: 0 50%;
}
.collection-btn:hover:before {
transition-timing-function: cubic-bezier(0.45, 1.64, 0.47, 0.66);
transform: scaleX(1);
}
.author-avatar {
transition: all 0.5s;
}
.author-avatar:hover {
transform: rotate(360deg);
}
.web-info {
padding: 0.25rem;
font-size: 0.875rem;
}
.scroll-down-effects {
color: #eee !important;
text-align: center;
text-shadow: 0.1rem 0.1rem 0.2rem rgba(0, 0, 0, 0.15);
line-height: 1.5;
display: inline-block;
text-rendering: auto;
-webkit-font-smoothing: antialiased;
animation: scroll-down-effect 1.5s infinite;
}
@keyframes scroll-down-effect {
0% {
top: 0;
opacity: 0.4;
filter: alpha(opacity=40);
}
50% {
top: -16px;
opacity: 1;
filter: none;
}
100% {
top: 0;
opacity: 0.4;
filter: alpha(opacity=40);
}
}
.big i {
color: #f00;
animation: big 0.8s linear infinite;
}
@keyframes big {
0%,
100% {
transform: scale(1);
}
50% {
transform: scale(1.2);
}
}
</style>