新增百宝箱,优化首页

master
haitao 2 years ago
parent 27f51cfe06
commit afbcec3f5a

@ -26,6 +26,12 @@
- 优化:前端美化
- 优化:留言分类与资源整合
### 2023年4月1日更新
- 新增:百宝箱(收藏夹)
- 优化:首页
- 优化:前端美化
- 优化:资源整合
### 首页
![首页](首页.jpg)
@ -96,4 +102,4 @@ npm run build
B站搜索用户【寻国记】博客介绍与搭建教程。
【挑战最美博客!个人博客网站食用教程。这是一个 SpringBoot 与 Vue 的产物,在此公开,一起学习,共同成长。】
https://www.bilibili.com/video/BV1eM41167Ks/?share_source=copy_web
https://www.bilibili.com/video/BV1eM41167Ks/?share_source=copy_web

27
package-lock.json generated

@ -19,6 +19,7 @@
"vue-baberrage": "^3.2.4",
"vue-ripple-directive": "^2.0.1",
"vue-router": "^3.2.0",
"vue-seamless-scroll": "^1.1.23",
"vuex": "^3.4.0",
"vuex-persistedstate": "^4.0.0"
},
@ -4531,6 +4532,11 @@
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
"dev": true
},
"node_modules/comutils": {
"version": "1.1.19",
"resolved": "https://registry.npmmirror.com/comutils/-/comutils-1.1.19.tgz",
"integrity": "sha512-JxXB67juILiwhdLwOsYyjUqwWEhHdObI0EClOPk+JDtEuTbac59s0pxGpfCBnNNQ5JommifmcMGneW/4Cg7YWw=="
},
"node_modules/concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz",
@ -14630,6 +14636,14 @@
"resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-3.5.3.tgz",
"integrity": "sha512-FUlILrW3DGitS2h+Xaw8aRNvGTwtuaxrRkNSHWTizOfLUie7wuYwezeZ50iflRn8YPV5kxmU2LQuu3nM/b3Zsg=="
},
"node_modules/vue-seamless-scroll": {
"version": "1.1.23",
"resolved": "https://registry.npmmirror.com/vue-seamless-scroll/-/vue-seamless-scroll-1.1.23.tgz",
"integrity": "sha512-HBjUub8WwsKJzbFCrwKPDrZn4e+SSbkKgwWtjKtfLwesiFGwSsVxP44/Z6d3kpXy94qIFOiflJH6l0/9pj7SGA==",
"dependencies": {
"comutils": "^1.1.9"
}
},
"node_modules/vue-style-loader": {
"version": "4.1.3",
"resolved": "https://registry.npmmirror.com/vue-style-loader/-/vue-style-loader-4.1.3.tgz",
@ -19472,6 +19486,11 @@
}
}
},
"comutils": {
"version": "1.1.19",
"resolved": "https://registry.npmmirror.com/comutils/-/comutils-1.1.19.tgz",
"integrity": "sha512-JxXB67juILiwhdLwOsYyjUqwWEhHdObI0EClOPk+JDtEuTbac59s0pxGpfCBnNNQ5JommifmcMGneW/4Cg7YWw=="
},
"concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz",
@ -27876,6 +27895,14 @@
"resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-3.5.3.tgz",
"integrity": "sha512-FUlILrW3DGitS2h+Xaw8aRNvGTwtuaxrRkNSHWTizOfLUie7wuYwezeZ50iflRn8YPV5kxmU2LQuu3nM/b3Zsg=="
},
"vue-seamless-scroll": {
"version": "1.1.23",
"resolved": "https://registry.npmmirror.com/vue-seamless-scroll/-/vue-seamless-scroll-1.1.23.tgz",
"integrity": "sha512-HBjUub8WwsKJzbFCrwKPDrZn4e+SSbkKgwWtjKtfLwesiFGwSsVxP44/Z6d3kpXy94qIFOiflJH6l0/9pj7SGA==",
"requires": {
"comutils": "^1.1.9"
}
},
"vue-style-loader": {
"version": "4.1.3",
"resolved": "https://registry.npmmirror.com/vue-style-loader/-/vue-style-loader-4.1.3.tgz",

@ -19,6 +19,7 @@
"vue-baberrage": "^3.2.4",
"vue-ripple-directive": "^2.0.1",
"vue-router": "^3.2.0",
"vue-seamless-scroll": "^1.1.23",
"vuex": "^3.4.0",
"vuex-persistedstate": "^4.0.0"
},

@ -2,6 +2,7 @@
/* 背景 */
--background: white;
--gradualBackground: linear-gradient(to right bottom, #ee7752, #e73c7e, #23a6d5, #23d5ab);
--favoriteBg: #f7f9fe;
/* 字体 */
--fontColor: black;
@ -75,6 +76,8 @@
--globalFont: SmileySans;
--commentURL: url(../file/comment.jpg);
--springBg: url(../file/bg1.jpg);
--admireImage: url(../file/bg1.jpg);
--toTop: url(../file/top.jpg);
--bannerWave1: url(../file/bannerwave1.png) repeat-x;
--bannerWave2: url(../file/bannerwave2.png) repeat-x;

@ -16,11 +16,12 @@
<el-option key="11" label="聊天群头像" value="im/groupAvatar"></el-option>
<el-option key="12" label="群聊天图片" value="im/groupMessage"></el-option>
<el-option key="13" label="朋友聊天图片" value="im/friendMessage"></el-option>
<el-option key="14" label="Funny声音" value="funnyUrl"></el-option>
<el-option key="15" label="Funny封面" value="funnyCover"></el-option>
<el-option key="14" label="音乐声音" value="funnyUrl"></el-option>
<el-option key="15" label="音乐封面" value="funnyCover"></el-option>
<el-option key="16" label="Love.Cover" value="love/bgCover"></el-option>
<el-option key="17" label="Love.Man" value="love/manCover"></el-option>
<el-option key="18" label="Love.Woman" value="love/womanCover"></el-option>
<el-option key="19" label="收藏夹封面" value="favoritesCover"></el-option>
</el-select>
<el-button type="primary" icon="el-icon-search" @click="search()"></el-button>
<el-button type="primary" @click="addResources()"></el-button>

@ -20,6 +20,7 @@
<el-table :data="resourcePaths" border class="table" header-cell-class-name="table-header">
<el-table-column prop="id" label="ID" width="55" align="center"></el-table-column>
<el-table-column prop="title" label="标题" align="center"></el-table-column>
<el-table-column prop="classify" label="分类" align="center"></el-table-column>
<el-table-column prop="introduction" label="简介" align="center"></el-table-column>
<el-table-column label="封面" align="center">
<template slot-scope="scope">
@ -97,8 +98,12 @@
<div>
<div style="margin-bottom: 5px">标题</div>
<el-input maxlength="60" v-model="resourcePath.title"></el-input>
<div style="margin-top: 10px;margin-bottom: 5px">分类</div>
<el-input :disabled="!['lovePhoto', 'funny', 'favorites'].includes(resourcePath.type)"
maxlength="30" v-model="resourcePath.classify"></el-input>
<div style="margin-top: 10px;margin-bottom: 5px">简介</div>
<el-input maxlength="1000" v-model="resourcePath.introduction"></el-input>
<el-input :disabled="!['friendUrl', 'favorites'].includes(resourcePath.type)"
maxlength="1000" v-model="resourcePath.introduction"></el-input>
<div style="margin-top: 10px;margin-bottom: 5px">封面</div>
<div style="display: flex">
<el-input v-model="resourcePath.cover"></el-input>
@ -112,7 +117,8 @@
</div>
<div style="margin-top: 10px;margin-bottom: 5px">链接</div>
<div style="display: flex">
<el-input v-model="resourcePath.url"></el-input>
<el-input :disabled="!['friendUrl', 'funny', 'favorites'].includes(resourcePath.type)"
v-model="resourcePath.url"></el-input>
<div style="width: 66px;margin: 3.5px 0 0 10px">
<proButton :info="'上传文件'"
@click.native="addResourcePathUrl()"
@ -131,7 +137,8 @@
</el-option>
</el-select>
<div style="margin-top: 10px;margin-bottom: 5px">备注</div>
<el-input maxlength="1000" v-model="resourcePath.remark" type="textarea"></el-input>
<el-input :disabled="![].includes(resourcePath.type)"
maxlength="1000" v-model="resourcePath.remark" type="textarea"></el-input>
</div>
<div style="display: flex;margin-top: 30px" class="myCenter">
<proButton :info="'提交'"
@ -160,7 +167,8 @@
resourceTypes: [
{label: "友链", value: "friendUrl"},
{label: "恋爱图片", value: "lovePhoto"},
{label: "鬼畜", value: "funny"}
{label: "音乐", value: "funny"},
{label: "收藏夹", value: "favorites"}
],
pagination: {
current: 1,
@ -176,6 +184,7 @@
isUpdate: false,
resourcePath: {
title: "",
classify: "",
introduction: "",
cover: "",
url: "",
@ -209,9 +218,9 @@
if (this.addResourcePathDialog === false) {
return;
}
if (this.$common.isEmpty(this.resourcePath.type)) {
if (!['funny'].includes(this.resourcePath.type)) {
this.$message({
message: "请选择资源类型!",
message: "请选择有效资源类型!",
type: "error"
});
return;
@ -333,6 +342,7 @@
this.addResourcePathDialog = false;
this.resourcePath = {
title: "",
classify: "",
introduction: "",
cover: "",
url: "",

@ -13,7 +13,7 @@
<span v-else-if="scope.row.sortType === 1">普通分类</span>
</template>
</el-table-column>
<el-table-column prop="priority" label="导航栏分类优先级" align="center"></el-table-column>
<el-table-column prop="priority" label="分类优先级" align="center"></el-table-column>
<el-table-column prop="countOfSort" label="文章总数" align="center"></el-table-column>
<el-table-column label="操作" width="380" align="center">
<template slot-scope="scope">
@ -77,9 +77,9 @@
<el-input placeholder="请输入分类描述" v-model="sortForHttp.sortDescription">
<template slot="prepend">分类描述</template>
</el-input>
<el-input type="number" v-if="sortForHttp.sortType === 0" placeholder="请输入整数,数字小的在前面"
<el-input type="number" placeholder="请输入整数,数字小的在前面"
v-model="sortForHttp.priority">
<template slot="prepend">导航栏分类优先级</template>
<template slot="prepend">分类优先级</template>
</el-input>
</div>
@ -189,6 +189,7 @@
},
saveSortEdit() {
if (this.$common.isEmpty(this.sortForHttp.sortType) ||
this.$common.isEmpty(this.sortForHttp.priority) ||
this.$common.isEmpty(this.sortForHttp.sortName) ||
this.$common.isEmpty(this.sortForHttp.sortDescription)) {
this.$message({
@ -198,14 +199,6 @@
return;
}
if (this.sortForHttp.sortType === 0 && this.$common.isEmpty(this.sortForHttp.priority)) {
this.$message({
message: "导航栏分类必须输入优先级!",
type: "error"
});
return;
}
let url;
if (this.$common.isEmpty(this.sortForHttp.id)) {
url = "/webInfo/saveSort";

@ -20,6 +20,12 @@
<el-table-column prop="username" label="用户名" align="center"></el-table-column>
<el-table-column prop="phoneNumber" label="手机号" align="center"></el-table-column>
<el-table-column prop="email" label="邮箱" align="center"></el-table-column>
<el-table-column label="赞赏" width="100" align="center">
<template slot-scope="scope">
<el-input size="medium" maxlength="30" v-model="scope.row.admire"
@blur="changeUserAdmire(scope.row)"></el-input>
</template>
</el-table-column>
<el-table-column label="用户状态" align="center">
<template slot-scope="scope">
<el-tag :type="scope.row.userStatus === false ? 'danger' : 'success'"
@ -193,6 +199,38 @@
});
});
},
changeUserAdmire(user) {
if (!this.$common.isEmpty(user.admire)) {
this.$confirm('确认保存?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'success',
center: true
}).then(() => {
this.$http.get(this.$constant.baseURL + "/admin/user/changeUserAdmire", {
userId: user.id,
admire: user.admire
}, true)
.then((res) => {
this.$message({
message: "修改成功!",
type: "success"
});
})
.catch((error) => {
this.$message({
message: error.message,
type: "error"
});
});
}).catch(() => {
this.$message({
type: 'success',
message: '已取消保存!'
});
});
}
},
editUser(user) {
this.changeUser.id = user.id;
this.changeUser.userType = user.userType;

@ -14,7 +14,7 @@
</svg>
发现
</div>
<div class="recent-post-item shadow-box background-opacity wow"
<div class="recent-post-item shadow-box background-opacity"
v-for="(article, index) in articleList"
:key="index"
:class="{'my-animation-slide-top': index % 2 !== 0,'my-animation-slide-bottom': index % 2 === 0}"
@ -49,7 +49,12 @@
发布于 {{ article.createTime }}
</div>
<!-- 标题 -->
<h3>{{ article.articleTitle }}</h3>
<el-tooltip placement="top" effect="light">
<div slot="content">{{ article.articleTitle }}</div>
<h3>{{ article.articleTitle }}</h3>
</el-tooltip>
<!-- 信息 -->
<div class="post-meta" style="margin-bottom: 15px">
<span>

@ -88,14 +88,6 @@
return;
}
if (this.$common.isEmpty(this.$store.state.currentUser.email)) {
this.$message({
message: "请先绑定邮箱!",
type: "error"
});
return;
}
this.showPicture = true;
},
@ -121,14 +113,6 @@
return;
}
if (this.$common.isEmpty(this.$store.state.currentUser.email)) {
this.$message({
message: "请先绑定邮箱!",
type: "error"
});
return;
}
this.commentContent = "";
this.$emit("showGraffiti");
},
@ -141,18 +125,10 @@
return;
}
if (this.$common.isEmpty(this.$store.state.currentUser.email)) {
this.$message({
message: "请先绑定邮箱!",
type: "error"
});
return;
}
if (this.commentContent.trim() === "") {
this.$message({
message: "你还没写呢~",
type: "warning",
type: "warning"
});
return;
}

@ -144,7 +144,7 @@
this.setCanvasStyle();
},
created() {
if (!this.$common.isEmpty(this.$store.state.currentUser) && !this.$common.isEmpty(this.$store.state.currentUser.email)) {
if (!this.$common.isEmpty(this.$store.state.currentUser)) {
this.getUpToken();
}
},
@ -275,7 +275,7 @@
if (this.preDrawAry.length < 1) {
this.$message({
message: "你还没画呢~",
type: "warning",
type: "warning"
});
return;
}

@ -15,9 +15,9 @@
</div>
<div class="card-body">
<el-tooltip placement="bottom-start" effect="light">
<div slot="content">{{resourcePath.introduction}}</div>
<div slot="content">{{resourcePath.title}}</div>
<div class="card-desc">
{{resourcePath.introduction}}
{{resourcePath.title}}
</div>
</el-tooltip>
<div class="card-time">

@ -19,7 +19,7 @@
<div>😃 {{treeHole.createTime}}</div>
<div @click="deleteTreeHole(treeHole.id)"
class="tree-hole-delete"
v-if="!$common.isEmpty($store.state.currentUser)">
v-if="!$common.isEmpty($store.state.currentUser) && $store.state.currentUser.id === treeHole.userId">
<svg viewBox="0 0 1024 1024" width="18" height="18" style="vertical-align: -2px;">
<path
d="M921.1392 155.392h-270.592v-48.2816c0-22.7328-18.432-41.1648-41.1648-41.1648H426.3424a41.1648 41.1648 0 0 0-41.1648 41.1648v48.2816H110.6432c-14.1312 0-25.6 11.4688-25.6 25.6s11.4688 25.6 25.6 25.6h810.496c14.1312 0 25.6-11.4688 25.6-25.6s-11.4688-25.6-25.6-25.6zM170.8032 260.0448v592.8448c0 50.8928 41.2672 92.16 92.16 92.16h500.6848c50.8928 0 92.16-41.2672 92.16-92.16V260.0448H170.8032z m249.1392 462.7968c0 14.1312-11.4688 25.6-25.6 25.6s-25.6-11.4688-25.6-25.6V443.0848c0-14.1312 11.4688-25.6 25.6-25.6s25.6 11.4688 25.6 25.6v279.7568z m243.1488 0c0 14.1312-11.4688 25.6-25.6 25.6s-25.6-11.4688-25.6-25.6V443.0848c0-14.1312 11.4688-25.6 25.6-25.6s25.6 11.4688 25.6 25.6v279.7568z"
@ -242,7 +242,7 @@
@media screen and (max-width: 1000px) {
.tree-hole-box {
width: auto;
width: calc(100% - 90px);
}
}

@ -0,0 +1,307 @@
<template>
<div>
<div class="favorite-container">
<!-- 封面 -->
<div class="favorite-header my-animation-slide-top">
<!-- 背景图片 -->
<video class="index-video" autoplay="autoplay" muted="muted" loop="loop"
:src="$constant.favoriteVideo">
</video>
<div style="position: absolute;left: 0;top: 0;padding: 20px">
<!-- 标题 -->
<div style="color: var(--white);margin: 10px">
<div>
记录
</div>
<div style="font-size: 36px;font-weight: bold;line-height: 2">
百宝箱
</div>
</div>
<div class="card-container">
<!-- 收藏夹 -->
<div @click="changeFavorite(1)"
class="card-item">
<div class="favorite-image"></div>
<div style="position: absolute;left: 0;top: 0;padding: 20px 25px 15px">
<div class="card-name">
收藏夹
</div>
<div class="card-desc">
poetize.cn 添加到您的收藏夹吧
</div>
</div>
</div>
</div>
</div>
</div>
<!-- 内容 -->
<div class="favorite-content my-animation-slide-bottom">
<!-- 收藏夹 -->
<div v-show="card === 1 && !$common.isEmpty(collects)">
<div v-for="(value, key) in collects" :key="key" style="margin-top: 20px">
<div class="collect-classify">
{{key}}
</div>
<div class="favorite-item-wrap">
<div v-for="(item, index) in value" :key="index" @click="toUrl(item.url)" class="favorite-item">
<div>
<el-avatar class="favorite-item-image" :size="60"
:src="item.cover">
</el-avatar>
</div>
<div style="width: calc(100% - 80px)">
<div class="favorite-item-title">
{{item.title}}
</div>
<div class="favorite-item-introduction">
{{item.introduction}}
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- 页脚 -->
<div style="background: var(--favoriteBg)">
<myFooter></myFooter>
</div>
</div>
</template>
<script>
const myFooter = () => import( "./common/myFooter");
export default {
components: {
myFooter
},
data() {
return {
card: null,
collects: {}
}
},
computed: {},
watch: {},
created() {
this.card = 1;
this.getCollect();
},
mounted() {
},
methods: {
toUrl(url) {
window.open(url);
},
changeFavorite(card) {
this.card = card;
if (card === 1) {
if (this.$common.isEmpty(this.collects)) {
this.getCollect();
}
}
},
getCollect() {
this.$http.get(this.$constant.baseURL + "/webInfo/listCollect")
.then((res) => {
if (!this.$common.isEmpty(res.data)) {
this.collects = res.data;
}
})
.catch((error) => {
this.$message({
message: error.message,
type: "error"
});
});
}
}
}
</script>
<style scoped>
.favorite-container {
padding: 25px;
background: var(--favoriteBg);
}
.favorite-header {
margin: 60px auto 30px;
height: 410px;
position: relative;
overflow: hidden;
border-radius: 20px;
max-width: 1200px;
}
.index-video {
width: 100%;
height: 100%;
object-fit: cover;
}
.favorite-image::before {
content: "";
position: absolute;
width: 100%;
height: 100%;
background-color: var(--translucent);
}
.card-container {
display: flex;
flex-wrap: wrap;
margin-top: 60px;
}
.card-item {
transition: all 0.3s;
position: relative;
width: 250px;
height: 120px;
border-radius: 20px;
animation: hideToShow 1s ease-in-out;
cursor: pointer;
overflow: hidden;
margin: 10px;
color: var(--white);
}
.card-item:hover {
transform: translateY(-6px);
}
.card-name {
font-weight: bold;
font-size: 25px;
}
.card-name:after {
top: 50px;
width: 22px;
left: 26px;
height: 2px;
background: var(--white);
content: "";
border-radius: 1px;
position: absolute;
}
.card-desc {
font-weight: bold;
margin-top: 15px;
}
.favorite-content {
margin: 0 auto;
max-width: 1200px;
}
.collect-classify {
font-size: 28px;
font-weight: bold;
margin-bottom: 10px;
}
.favorite-item-wrap {
display: flex;
flex-wrap: wrap;
margin-left: -10px;
}
.favorite-item {
transition: all 0.3s;
border-radius: 12px;
box-shadow: 0 8px 16px -4px #2c2d300c;
background: var(--background);
display: flex;
width: calc(100% / 4 - 20px);
max-width: 320px;
height: 90px;
overflow: hidden;
padding: 15px;
cursor: pointer;
margin: 10px;
}
.favorite-item:hover {
background: #425AEF;
color: var(--white);
}
.favorite-item:hover .favorite-item-image {
transition: all 0.6s;
width: 0 !important;
height: 0 !important;
opacity: 0;
margin-right: 0;
}
.favorite-item:hover div:nth-child(2) {
width: 100% !important;
}
.favorite-item-image {
margin-right: 20px;
transition: all 0.3s;
}
.favorite-item-title {
font-size: 19px;
font-weight: bold;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
margin-bottom: 5px;
}
.favorite-item-introduction {
opacity: 0.7;
font-weight: bold;
letter-spacing: 1px;
font-size: 14px;
line-height: 1.2;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
}
@media screen and (max-width: 620px) {
.card-container {
margin-top: 0;
}
}
@media screen and (max-width: 900px) {
.favorite-item {
width: calc(100% / 3 - 20px);
}
}
@media screen and (max-width: 700px) {
.favorite-item {
width: calc(100% / 2 - 20px);
}
}
@media screen and (max-width: 400px) {
.favorite-item {
width: calc(100% - 20px);
}
}
</style>

@ -138,18 +138,10 @@
return;
}
if (this.$common.isEmpty(this.$store.state.currentUser.email)) {
this.$message({
message: "请先绑定邮箱!",
type: "error"
});
return;
}
if (this.friend.title.trim() === "") {
this.$message({
message: "你还没写名称呢~",
type: "warning",
type: "warning"
});
return;
}
@ -157,7 +149,7 @@
if (this.friend.introduction.trim() === "") {
this.$message({
message: "你还没写简介呢~",
type: "warning",
type: "warning"
});
return;
}
@ -165,7 +157,7 @@
if (this.friend.cover.trim() === "") {
this.$message({
message: "你还没设置封面呢~",
type: "warning",
type: "warning"
});
return;
}
@ -173,7 +165,7 @@
if (this.friend.url.trim() === "") {
this.$message({
message: "你还没写网址呢~",
type: "warning",
type: "warning"
});
return;
}

@ -43,10 +43,10 @@
fill="#2E66FF"></path>
</svg>
</span>
<span class="funny-title">{{index + 1}}号选手{{item.title}}</span>
<span class="funny-title">{{index + 1}}号选手{{item.classify}}</span>
</div>
<div class="process-wrap">
<el-collapse v-model="activeName" accordion @change="changeFunny(item.title)">
<el-collapse v-model="activeName" accordion @change="changeFunny(item.classify)">
<el-collapse-item title="笑梗不笑人" :name="index">
<div class="my-animation-slide-bottom"
style="display: flex;flex-flow: wrap;margin-left: 20px"
@ -57,7 +57,7 @@
@click.native="playSound(funny.url)"
:src="funny.cover">
</el-avatar>
<div class="funny-item-title">{{funny.introduction}}</div>
<div class="funny-item-title">{{funny.title}}</div>
</div>
</div>
</el-collapse-item>
@ -88,26 +88,26 @@
pagination: {
current: 1,
size: 9999,
order: "introduction",
order: "title",
desc: false,
resourceType: "funny",
searchKey: ""
classify: ""
},
activeName: 0,
audio: null,
funnys: [{
title: "",
classify: "",
count: null,
data: [{
title: "",
classify: "",
cover: "",
url: "",
introduction: ""
title: ""
}]
}],
funny: {
classify: "",
title: "",
introduction: "",
cover: "",
url: ""
}
@ -132,7 +132,7 @@
.then((res) => {
if (!this.$common.isEmpty(res.data)) {
this.funnys = res.data;
this.changeFunny(this.funnys[0].title);
this.changeFunny(this.funnys[0].classify);
}
})
.catch((error) => {
@ -147,13 +147,13 @@
.then((res) => {
if (!this.$common.isEmpty(res.data) && !this.$common.isEmpty(res.data.records)) {
this.funnys.forEach(funny => {
if (funny.title === this.pagination.searchKey) {
if (funny.classify === this.pagination.classify) {
funny.data = res.data.records;
this.$forceUpdate();
}
});
}
this.pagination.searchKey = "";
this.pagination.classify = "";
})
.catch((error) => {
this.$message({
@ -162,10 +162,10 @@
});
});
},
changeFunny(title) {
changeFunny(classify) {
this.funnys.forEach(funny => {
if (funny.title === title && this.$common.isEmpty(funny.data)) {
this.pagination.searchKey = title;
if (funny.classify === classify && this.$common.isEmpty(funny.data)) {
this.pagination.classify = classify;
this.listFunny();
}
});

@ -6,7 +6,7 @@
<div v-show="toolbar.visible"
@mouseenter="hoverEnter = true"
@mouseleave="hoverEnter = false"
:class="[{ enter: toolbar.enter }, { hoverEnter: hoverEnter && !toolbar.enter }]"
:class="[{ enter: toolbar.enter }, { hoverEnter: (hoverEnter || this.$route.path === '/favorite') && !toolbar.enter }]"
class="toolbar-content myBetween">
<!-- 网站名称 -->
<div class="toolbar-title">
@ -29,13 +29,14 @@
🏡 <span>首页</span>
</div>
</li>
<li v-for="(menu, index) in $store.getters.navigationBar"
@click="$router.push({path: '/sort', query: {sortId: menu.id, labelId: menu.labels[0].id}})"
:key="index">
<div class="my-menu">
📒 <span>{{ menu.sortName }}</span>
</div>
</li>
<!-- <li v-for="(menu, index) in $store.getters.navigationBar"-->
<!-- @click="$router.push({path: '/sort', query: {sortId: menu.id, labelId: menu.labels[0].id}})"-->
<!-- :key="index">-->
<!-- <div class="my-menu">-->
<!-- 📒 <span>{{ menu.sortName }}</span>-->
<!-- </div>-->
<!-- </li>-->
<!-- 爱情买卖 -->
<li @click="$router.push({path: '/love'})">
@ -44,16 +45,23 @@
</div>
</li>
<!-- 百宝箱 -->
<li @click="$router.push({path: '/favorite'})">
<div class="my-menu">
🧰 <span>百宝箱</span>
</div>
</li>
<!-- 聊天室 -->
<li @click="goIm()">
<div class="my-menu">
💬 <span>非礼勿言</span>
</div>
</li>
<!-- 鬼畜全明星 -->
<!-- 音乐 -->
<li @click="$router.push({path: '/funny'})">
<div class="my-menu">
🐔 <span>只因</span>
🎺 <span>曲乐</span>
</div>
</li>
<!-- 留言 -->
@ -161,13 +169,14 @@
🏡 <span>首页</span>
</div>
</li>
<li v-for="(menu, index) in $store.getters.navigationBar"
@click="smallMenu({path: '/sort', query: {sortId: menu.id, labelId: menu.labels[0].id}})"
:key="index">
<div>
📒 <span>{{ menu.sortName }}</span>
</div>
</li>
<!-- <li v-for="(menu, index) in $store.getters.navigationBar"-->
<!-- @click="smallMenu({path: '/sort', query: {sortId: menu.id, labelId: menu.labels[0].id}})"-->
<!-- :key="index">-->
<!-- <div>-->
<!-- 📒 <span>{{ menu.sortName }}</span>-->
<!-- </div>-->
<!-- </li>-->
<!-- 爱情买卖 -->
<li @click="smallMenu({path: '/love'})">
@ -176,16 +185,23 @@
</div>
</li>
<!-- 百宝箱 -->
<li @click="smallMenu({path: '/favorite'})">
<div>
🧰 <span>百宝箱</span>
</div>
</li>
<!-- 聊天室 -->
<li @click="goIm()">
<div>
💬 <span>非礼勿言</span>
</div>
</li>
<!-- 鬼畜全明星 -->
<!-- 音乐 -->
<li @click="smallMenu({path: '/funny'})">
<div>
🐔 <span>只因</span>
🎺 <span>曲乐</span>
</div>
</li>
<!-- 留言 -->
@ -266,6 +282,7 @@
root.style.setProperty("--articleFontColor", "#E4E4E4");
root.style.setProperty("--articleGreyFontColor", "#D4D4D4");
root.style.setProperty("--commentContent", "#D4D4D4");
root.style.setProperty("--favoriteBg", "#1e1e1e");
}
},
destroyed() {
@ -397,6 +414,7 @@
root.style.setProperty("--articleFontColor", "#E4E4E4");
root.style.setProperty("--articleGreyFontColor", "#D4D4D4");
root.style.setProperty("--commentContent", "#D4D4D4");
root.style.setProperty("--favoriteBg", "#1e1e1e");
} else {
root.style.setProperty("--background", "white");
root.style.setProperty("--fontColor", "black");
@ -405,6 +423,7 @@
root.style.setProperty("--articleFontColor", "#1F1F1F");
root.style.setProperty("--articleGreyFontColor", "#616161");
root.style.setProperty("--commentContent", "#F7F9FE");
root.style.setProperty("--favoriteBg", "#f7f9fe");
}
},
toTop() {

@ -40,7 +40,7 @@
<div class="page-container-wrap">
<div class="page-container">
<div class="aside-content" v-if="showAside">
<myAside></myAside>
<myAside @selectSort="selectSort"></myAside>
</div>
<div class="recent-posts">
<div class="announcement background-opacity">
@ -98,7 +98,8 @@
current: 1,
size: 10,
total: 0,
searchKey: ""
searchKey: "",
sortId: null
},
guShi: {
"content": "",
@ -121,13 +122,31 @@
},
methods: {
async selectSort(sort) {
this.pagination = {
current: 1,
size: 10,
total: 0,
searchKey: "",
sortId: sort.id
};
this.articles = [];
await this.getArticles();
this.$nextTick(() => {
document.querySelector('.recent-posts').scrollIntoView({
behavior: "smooth",
block: "start",
inline: "nearest"
});
});
},
pageArticles() {
this.pagination.current = this.pagination.current + 1;
this.getArticles();
},
getArticles() {
this.$http.post(this.$constant.baseURL + "/article/listArticle", this.pagination)
async getArticles() {
await this.$http.post(this.$constant.baseURL + "/article/listArticle", this.pagination)
.then((res) => {
if (!this.$common.isEmpty(res.data)) {
this.articles = this.articles.concat(res.data.records);

@ -113,7 +113,7 @@
<div class="card-content shadow-box-mini" @click="changeCard(1)">
<div>
<el-avatar :size="100"
:src="$constant.loveArticle">
:src="$constant.loveWeiYan">
</el-avatar>
</div>
<div class="card-right">
@ -160,24 +160,16 @@
</div>
<div class="card-container">
<div v-show="card === 1 && !$common.isEmpty(articles)">
<articleList :articleList="articles"></articleList>
<div class="pagination-wrap">
<div @click="pageArticles()" class="pagination" v-if="articlePagination.total !== articles.length">
下一页
</div>
<div v-else style="user-select: none">
~~到底啦~~
</div>
</div>
<div v-show="card === 1 && !$common.isEmpty(treeHoleList)">
<treeHole :treeHoleList="treeHoleList" @launch="launch" @deleteTreeHole="deleteTreeHole"></treeHole>
</div>
<div v-show="card === 2 && !$common.isEmpty(photoTitleList)">
<!-- 标签 -->
<div class="photo-title-warp" v-if="!$common.isEmpty(photoTitleList)">
<div v-for="(item, index) in photoTitleList" :key="index"
:class="{isActive: photoPagination.searchKey === item.title}"
@click="changePhotoTitle(item.title)">
<proTag :info="item.title+' '+item.count"
:class="{isActive: photoPagination.classify === item.classify}"
@click="changePhotoTitle(item.classify)">
<proTag :info="item.classify+' '+item.count"
:color="$constant.before_color_list[Math.floor(Math.random() * 6)]"
style="margin: 12px">
</proTag>
@ -185,7 +177,7 @@
</div>
<div class="photo-title">
{{photoPagination.searchKey}}
{{photoPagination.classify}}
</div>
<photo :resourcePathList="photoList"></photo>
@ -423,7 +415,7 @@
<script>
const articleList = () => import( "./articleList");
const treeHole = () => import( "./common/treeHole");
const comment = () => import( "./comment/comment");
const myFooter = () => import( "./common/myFooter");
const photo = () => import( "./common/photo");
@ -435,7 +427,7 @@
components: {
comment,
photo,
articleList,
treeHole,
myFooter,
proTag,
proButton,
@ -469,21 +461,20 @@
countdownTime: "",
timing: ""
},
articlePagination: {
weiYanPagination: {
current: 1,
size: 10,
total: 0,
sortId: this.$constant.loveSortId,
labelId: this.$constant.loveLabelId
userId: this.$constant.userId
},
photoPagination: {
current: 1,
size: 10,
total: 0,
resourceType: "lovePhoto",
searchKey: ""
classify: ""
},
articles: [],
treeHoleList: [],
photoTitleList: [],
photoList: [],
randomFamily: [],
@ -506,6 +497,8 @@
created() {
this.getAdminFamily();
this.card = 1;
this.getWeiYan();
},
mounted() {
@ -533,7 +526,7 @@
if (this.userLove.bgCover.trim() === "") {
this.$message({
message: "你还没设置背景封面呢~",
type: "warning",
type: "warning"
});
return;
}
@ -541,7 +534,7 @@
if (this.userLove.manCover.trim() === "") {
this.$message({
message: "你还没设置男生头像呢~",
type: "warning",
type: "warning"
});
return;
}
@ -549,7 +542,7 @@
if (this.userLove.womanCover.trim() === "") {
this.$message({
message: "你还没设置女生头像呢~",
type: "warning",
type: "warning"
});
return;
}
@ -557,7 +550,7 @@
if (this.userLove.manName.trim() === "") {
this.$message({
message: "你还没写男生昵称呢~",
type: "warning",
type: "warning"
});
return;
}
@ -565,7 +558,7 @@
if (this.userLove.womanName.trim() === "") {
this.$message({
message: "你还没写女生昵称呢~",
type: "warning",
type: "warning"
});
return;
}
@ -573,7 +566,7 @@
if (this.userLove.timing.trim() === "") {
this.$message({
message: "你还没设置计时时间呢~",
type: "warning",
type: "warning"
});
return;
}
@ -603,14 +596,6 @@
return;
}
if (this.$common.isEmpty(this.$store.state.currentUser.email)) {
this.$message({
message: "请先绑定邮箱!",
type: "error"
});
return;
}
this.$http.get(this.$constant.baseURL + "/family/getFamily")
.then((res) => {
if (!this.$common.isEmpty(res.data)) {
@ -639,7 +624,7 @@
size: 10,
total: 0,
resourceType: "lovePhoto",
searchKey: this.photoTitleList[0].title
classify: this.photoTitleList[0].classify
};
this.changePhoto();
}
@ -686,14 +671,14 @@
});
});
},
changePhotoTitle(title) {
if (title !== this.photoPagination.searchKey) {
changePhotoTitle(classify) {
if (classify !== this.photoPagination.classify) {
this.photoPagination = {
current: 1,
size: 10,
total: 0,
resourceType: "lovePhoto",
searchKey: title
classify: classify
};
this.photoList = [];
this.changePhoto();
@ -728,8 +713,8 @@
}
if (card === 1) {
if (this.$common.isEmpty(this.articles)) {
this.getArticles();
if (this.$common.isEmpty(this.treeHoleList)) {
this.getWeiYan();
}
} else if (card === 2) {
if (this.$common.isEmpty(this.photoTitleList)) {
@ -760,16 +745,29 @@
let countdown = this.$common.countdown(this.love.countdownTime);
this.countdownChange = countdown.d + "天" + countdown.h + "时" + countdown.m + "分" + countdown.s + "秒";
},
pageArticles() {
this.articlePagination.current = this.articlePagination.current + 1;
this.getArticles();
launch() {
if (this.weiYanPagination.total !== this.treeHoleList.length) {
this.weiYanPagination.current = this.weiYanPagination.current + 1;
this.getWeiYan();
} else {
this.$message({
message: "~~到底啦~~",
type: "warning"
});
}
},
getArticles() {
this.$http.post(this.$constant.baseURL + "/article/listArticle", this.articlePagination)
getWeiYan() {
this.$http.post(this.$constant.baseURL + "/weiYan/listWeiYan", this.weiYanPagination)
.then((res) => {
if (!this.$common.isEmpty(res.data)) {
this.articles = this.articles.concat(res.data.records);
this.articlePagination.total = res.data.total;
res.data.records.forEach(c => {
c.content = c.content.replace(/\n{2,}/g, '<div style="height: 12px"></div>');
c.content = c.content.replace(/\n/g, '<br/>');
c.content = this.$common.faceReg(c.content);
c.content = this.$common.pictureReg(c.content);
});
this.treeHoleList = this.treeHoleList.concat(res.data.records);
this.weiYanPagination.total = res.data.total;
}
})
.catch((error) => {
@ -778,6 +776,43 @@
type: "error"
});
});
},
deleteTreeHole(id) {
if (this.$common.isEmpty(this.$store.state.currentUser)) {
this.$message({
message: "请先登录!",
type: "error"
});
return;
}
this.$confirm('确认删除?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'success',
center: true
}).then(() => {
this.$http.get(this.$constant.baseURL + "/weiYan/deleteWeiYan", {id: id})
.then((res) => {
this.$message({
type: 'success',
message: '删除成功!'
});
this.weiYanPagination.current = 1;
this.getWeiYan();
})
.catch((error) => {
this.$message({
message: error.message,
type: "error"
});
});
}).catch(() => {
this.$message({
type: 'success',
message: '已取消删除!'
});
});
}
}
}
@ -1192,6 +1227,10 @@
.user-content >>> .el-input__inner {
width: 190px;
}
.card-container .tree-hole-container {
padding: 0;
}
}
@media screen and (max-width: 1150px) {

@ -87,7 +87,7 @@
if (this.messageContent.trim() === "") {
this.$message({
message: "你还没写呢~",
type: "warning",
type: "warning"
});
return;
}

@ -18,9 +18,52 @@
<i class="el-icon-star-off" style="margin-right: 2px"></i>朋友圈
</a>
</div>
<!-- 赞赏 -->
<div class="shadow-box-mini background-opacity wow admire-box"
v-if="!$common.isEmpty(admires)">
<div style="font-weight: bold;margin-bottom: 20px">🧨赞赏名单</div>
<div>
<vue-seamless-scroll :data="admires" style="height: 200px;overflow: hidden">
<div v-for="(item, i) in admires"
style="display: flex;justify-content: space-between"
:key="i">
<div style="display: flex">
<el-avatar style="margin-bottom: 10px" :size="36" :src="item.avatar"></el-avatar>
<div style="margin-left: 10px;height: 36px;line-height: 36px;overflow: hidden;max-width: 80px">
{{ item.username }}
</div>
</div>
<div style="height: 36px;line-height: 36px">
{{ item.admire }}
</div>
</div>
</vue-seamless-scroll>
</div>
<div class="admire-btn" @click="showAdmire()">
赞赏
</div>
</div>
<!-- 速览 -->
<div v-for="(sort, index) in sortInfo"
@click="selectSort(sort)"
:key="index"
:style="{background: $constant.sortColor[index % $constant.sortColor.length]}"
class="shadow-box-mini background-opacity wow"
style="position: relative;padding: 20px 25px 40px;border-radius: 10px;animation: hideToShow 1s ease-in-out;margin-top: 40px;cursor: pointer;color: var(--white)">
<div>速览</div>
<div class="sort-name">
{{sort.sortName}}
</div>
<div style="font-weight: bold;margin-top: 15px;white-space: nowrap;text-overflow: ellipsis;overflow: hidden">
{{sort.sortDescription}}
</div>
</div>
<!-- 分类 -->
<div class="shadow-box background-opacity wow"
style="padding: 25px 25px 5px;border-radius: 10px;animation: hideToShow 1s ease-in-out">
style="margin-top: 40px;padding: 25px 25px 5px;border-radius: 10px;animation: hideToShow 1s ease-in-out">
<div class="card-content2-title">
<i class="el-icon-folder-opened card-content2-icon"></i>
<span>分类</span>
@ -34,6 +77,7 @@
</div>
</div>
</div>
<!-- 推荐文章 -->
<div v-if="!$common.isEmpty(recommendArticles)"
style="padding: 25px;border-radius: 10px;margin-top: 40px;animation: hideToShow 1s ease-in-out"
@ -64,11 +108,32 @@
</div>
</div>
</div>
<!-- 微信 -->
<el-dialog title="赞赏"
:visible.sync="showAdmireDialog"
width="25%"
:append-to-body="true"
destroy-on-close
center>
<div>
<div class="admire-image"></div>
<div>
<div class="admire-content">1. 感谢老铁送来的666</div>
<div class="admire-content">2. 申请通过后会加博客交流群不需要加群或者退群后会定期清理好友强迫症福利</div>
</div>
</div>
</el-dialog>
</div>
</template>
<script>
import vueSeamlessScroll from "vue-seamless-scroll";
export default {
components: {
vueSeamlessScroll
},
data() {
return {
pagination: {
@ -76,7 +141,9 @@
size: 5,
recommendStatus: true
},
recommendArticles: []
recommendArticles: [],
admires: [],
showAdmireDialog: false
}
},
computed: {
@ -89,8 +156,37 @@
},
created() {
this.getRecommendArticles();
this.getAdmire();
},
methods: {
selectSort(sort) {
this.$emit("selectSort", sort);
},
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) => {
@ -120,7 +216,6 @@
display: flex;
flex-direction: column;
align-items: center;
margin-bottom: 40px;
border-radius: 10px;
position: relative;
/*color: var(--white);*/
@ -250,4 +345,64 @@
cursor: pointer;
color: var(--white);
}
.sort-name {
font-weight: bold;
font-size: 25px;
margin-top: 30px;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
}
.sort-name:after {
top: 98px;
width: 22px;
left: 26px;
height: 2px;
background: var(--white);
content: "";
border-radius: 1px;
position: absolute;
}
.admire-box {
background: var(--springBg) center center / cover no-repeat;
padding: 25px;
border-radius: 10px;
animation: hideToShow 1s ease-in-out;
margin-top: 40px;
}
.admire-btn {
padding: 13px 15px;
background: var(--maxLightRed);
border-radius: 3rem;
color: var(--white);
width: 100px;
user-select: none;
cursor: pointer;
text-align: center;
margin: 20px auto 0;
transition: all 1s;
}
.admire-btn:hover {
transform: scale(1.2);
}
.admire-image {
margin: 0 auto 10px;
border-radius: 10px;
height: 150px;
width: 150px;
background: var(--admireImage) center center / cover no-repeat;
}
.admire-content {
font-size: 12px;
color: var(--maxGreyFont);
line-height: 1.5;
margin: 5px;
}
</style>

@ -439,16 +439,6 @@
return true;
},
changeDialog(value) {
if (value === "修改头像") {
if (this.$common.isEmpty(this.currentUser.email)) {
this.$message({
message: "请先绑定邮箱!",
type: "error"
});
return;
}
}
if (value === "邮箱验证码") {
if (this.$common.isEmpty(this.email)) {
this.$message({

@ -103,14 +103,6 @@
return;
}
if (this.$common.isEmpty(this.$store.state.currentUser.email)) {
this.$message({
message: "请先绑定邮箱!",
type: "error"
});
return;
}
this.weiYanDialogVisible = true;
},
handleClose() {
@ -143,14 +135,6 @@
return;
}
if (this.$common.isEmpty(this.$store.state.currentUser.email)) {
this.$message({
message: "请先绑定邮箱!",
type: "error"
});
return;
}
this.$confirm('确认删除?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',

@ -32,6 +32,10 @@ const routes = [
path: "/love",
name: "love",
component: () => import('../components/love')
}, {
path: "/favorite",
name: "favorite",
component: () => import('../components/favorite')
}, {
path: "/message",
name: "message",

@ -42,11 +42,7 @@ export default new Vuex.Store({
},
navigationBar: state => {
if (state.sortInfo !== null && state.sortInfo.length !== 0) {
return state.sortInfo.filter(f => {
return f.sortType === 0;
}).sort((s1, s2) => {
return s1.priority - s2.priority;
})
return state.sortInfo.filter(f => f.sortType === 0);
} else {
return [];
}
@ -57,7 +53,9 @@ export default new Vuex.Store({
state.toolbar = toolbarState;
},
loadSortInfo(state, sortInfo) {
state.sortInfo = sortInfo;
if (sortInfo !== null && sortInfo.length !== 0) {
state.sortInfo = sortInfo.sort((s1, s2) => s1.priority - s2.priority);
}
},
loadCurrentUser(state, user) {
state.currentUser = user;

@ -20,7 +20,9 @@ export default {
qiniuUrl: "https://upload.qiniup.com",
qiniuDownload: "$$$$七牛云下载地址",
loveArticle: "https://s1.ax1x.com/2022/12/04/zsKgDs.jpg",
favoriteVideo: "$$$$自己找一个视频链接作为百宝箱的封面",
loveWeiYan: "https://s1.ax1x.com/2022/12/04/zsKgDs.jpg",
loveMessage: "https://s1.ax1x.com/2022/12/04/zsKgDs.jpg",
lovePhoto: "https://s1.ax1x.com/2022/12/04/zsKh5V.jpg",
loveLike: "https://cdn.cbd.int//hexo-butterfly-envelope/lib/violet.jpg",
@ -46,6 +48,13 @@ export default {
before_color_2: "rgb(131, 123, 199)",
after_color_2: "linear-gradient(45deg, #f43f3b, #ec008c)",
sortColor: ["linear-gradient(to right, #358bff, #15c6ff)",
"linear-gradient(to right, #18e7ae, #1eebeb)",
"linear-gradient(to right, #ff6655, #ffbf37)",
"linear-gradient(120deg, rgba(255, 39, 232, 1) 0%, rgba(255, 128, 0, 1) 100%)",
"linear-gradient(120deg, rgba(91, 39, 255, 1) 0%, rgba(0, 212, 255, 1) 100%)"
],
pageColor: "#ee7752",
commentPageColor: "#23d5ab",
userId: 1,

Loading…
Cancel
Save