Janx 2 years ago
parent 104cd0fcf2
commit 91d7e734e3

@ -1,81 +1,81 @@
# 寻国记poetry-uiVue2
## 网站示例
[寻国记poetize.cn](https://poetize.cn)
## 技术栈
前端技术Vue2博客系统Vue3聊天室系统Element UIVue2Element-Plus UIVue3Naive UIVue3
后端技术JavaSpring Bootspring-boot-starter-mailMysqlMybatis-Plust-ioqiniu-java-sdk
## 网站简介
这是一个 Spring Boot + Vue2 + Vue3 的产物。
网站分两个模块:
- 博客系统:具有文章,留言,友链,时间线,后台管理等功能。
- 聊天室系统:具有朋友圈(时间线),好友,群等功能。
本网站搭建于阿里云采用前后端分离进行实现两个前端项目通过Nginx代理。
### 首页
![首页](首页.jpg)
### 推荐
![推荐](推荐.jpg)
### 留言
![留言](留言.jpg)
### 树洞
![树洞](树洞.jpg)
### 朋友圈(时间线)
![朋友圈(时间线)](朋友圈(时间线).jpg)
### 友链
![友链](友链.jpg)
### 聊天室
![聊天室](聊天室.jpg)
## 安装
```
npm install
```
## 启动
```
npm run serve
```
## 编译
```
npm run build
```
## 配置
全局搜索:$$$$
替换成自己自定义的内容因为Https无法跨域这些内容需要用自己的。
- 博客https://gitee.com/littledokey/poetize-vue2.git
- 聊天室https://gitee.com/littledokey/poetize-im-vue3.git
- 后端https://gitee.com/littledokey/poetize.git
## 欢迎进群
1. 交流(摸鱼)
2. 安装部署:互相帮助,争取每个人都零基础拥有自己的个人网站
3. 博客答疑:每段代码都是我自己写的,爱学习的小伙伴可以在这里提问,互相学习,互相进步
4. 隐藏功能介绍:博客隐藏了很多功能,除了最重要的文章浏览,聊天室,还有朋友圈,网站后台基本信息管理,用户管理,评论管理,留言管理,友链管理,建群,加群,加好友等等等等
5. 漏洞反馈欢迎提交BUG
6. 迭代升级:呼声高的功能可能会采纳,能力有限,时间有限,欢迎创作。
群名片七天有效,如果需要请加作者好友,然后拉进交流群
![个人名片](Sara.jpg)
## 欢迎关注作者B站
B站搜索用户【寻国记】博客介绍与搭建教程。
【挑战最美博客!个人博客网站食用教程。这是一个 SpringBoot 与 Vue 的产物,在此公开,一起学习,共同成长。】
## 网站示例
[寻国记poetize.cn](https://poetize.cn) master
[ROGINSHIN - 兴 ](https://www.roginx.ink/)
## 技术栈
前端技术Vue2博客系统Vue3聊天室系统Element UIVue2Element-Plus UIVue3Naive UIVue3
后端技术JavaSpring Bootspring-boot-starter-mailMysqlMybatis-Plust-ioqiniu-java-sdk
## 网站简介
这是一个 Spring Boot + Vue2 + Vue3 的产物。
网站分两个模块:
- 博客系统:具有文章,留言,友链,时间线,后台管理等功能。
- 聊天室系统:具有朋友圈(时间线),好友,群等功能。
本网站搭建于阿里云采用前后端分离进行实现两个前端项目通过Nginx代理。
### 首页
![首页](首页.jpg)
### 推荐
![推荐](推荐.jpg)
### 留言
![留言](留言.jpg)
### 树洞
![树洞](树洞.jpg)
### 朋友圈(时间线)
![朋友圈(时间线)](朋友圈(时间线).jpg)
### 友链
![友链](友链.jpg)
### 聊天室
![聊天室](聊天室.jpg)
## 安装
```
npm install
```
## 启动
```
npm run serve
```
## 编译
```
npm run build
```
## 配置
全局搜索:$$$$
替换成自己自定义的内容因为Https无法跨域这些内容需要用自己的。
- 博客https://gitee.com/littledokey/poetize-vue2.git
- 聊天室https://gitee.com/littledokey/poetize-im-vue3.git
- 后端https://gitee.com/littledokey/poetize.git
## 欢迎进群
1. 交流(摸鱼)
2. 安装部署:互相帮助,争取每个人都零基础拥有自己的个人网站
3. 博客答疑:每段代码都是我自己写的,爱学习的小伙伴可以在这里提问,互相学习,互相进步
4. 隐藏功能介绍:博客隐藏了很多功能,除了最重要的文章浏览,聊天室,还有朋友圈,网站后台基本信息管理,用户管理,评论管理,留言管理,友链管理,建群,加群,加好友等等等等
5. 漏洞反馈欢迎提交BUG
6. 迭代升级:呼声高的功能可能会采纳,能力有限,时间有限,欢迎创作。
群名片七天有效,如果需要请加作者好友,然后拉进交流群
![个人名片](Sara.jpg)
## 欢迎关注作者B站
B站搜索用户【寻国记】博客介绍与搭建教程。
【挑战最美博客!个人博客网站食用教程。这是一个 SpringBoot 与 Vue 的产物,在此公开,一起学习,共同成长。】
https://www.bilibili.com/video/BV1eM41167Ks/?share_source=copy_web

19836
package-lock.json generated

File diff suppressed because it is too large Load Diff

@ -12,14 +12,19 @@
"core-js": "^3.6.5",
"crypto-js": "^4.1.1",
"element-ui": "^2.4.5",
"imagesloaded": "^5.0.0",
"lg-thumbnail.js": "^1.2.0",
"lightgallery.js": "^1.4.0",
"markdown-it": "^12.2.0",
"masonry-layout": "^4.2.2",
"mavon-editor": "^2.9.1",
"node-sass": "^8.0.0",
"openssl": "^2.0.0",
"qs": "^6.10.3",
"useless-files-webpack-plugin": "^1.0.1",
"vue": "^2.6.11",
"vue-baberrage": "^3.2.4",
"vue-lazyload": "^1.3.3",
"vue-ripple-directive": "^2.0.1",
"vue-router": "^3.2.0",
"vuedraggable": "^2.24.3",

@ -1,80 +1,79 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
<meta charset="utf-8" />
<meta name="Robots" content="all" />
<meta name="KEYWords" content="janx,pixiv,博客,游戏,动漫"/>
<meta name="DEscription" content="Janxland,Janx,动漫,游戏,博客">
<meta name="baidu-site-verification" content="codeva-FAjK1LxybY" />
<meta content="webkit" name="renderer" />
<!-- <meta http-equiv="X-UA-Compatible" content="IE=edge"> -->
<meta name="force-rendering" content="webkit"/>
<meta name="referrer" content="no-referrer" />
<meta name="viewport" content="width=device-width,initial-scale=1.0" />
<link rel="icon" href="./poetize.jpg" sizes="16x16">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/firacode@6.2.0/distr/fira_code.min.css">
<link href="https://cdn.bootcdn.net/ajax/libs/animate.css/4.1.1/animate.min.css" rel="stylesheet">
<title>Roginx</title>
<!-- <script>
fetch('https://search.heweather.net/find?key=3180d3c43e524753ab8bcef69dba023a&group=cn&lang=zh&location=450800')
.then(function(response) {
return response.json();
})
.then(function(myJson) {
top.dominCN = myJson.HeWeather6[0].basic[0]
});
</script> -->
<script type="text/javascript">
window.jQuery || document.write("<script src='https://cdn.bootcdn.net/ajax/libs/jquery/3.6.3/jquery.min.js'>"+ "<"+"/script>");
</script>
<script type="text/javascript">
window.$.cookie || document.write("<script src='https://cdn.bootcdn.net/ajax/libs/jquery-cookie/1.4.1/jquery.cookie.min.js'>"+ "<"+"/script>");
</script>
<script src="https://cdn.bootcdn.net/ajax/libs/mobile-detect/1.4.5/mobile-detect.min.js"></script>
<script src="https://cdn.bootcss.com/animejs/2.2.0/anime.min.js"></script>
<!-- <script src="https://use.fontawesome.com/3eac4d4c53.js"></script> -->
<script src="https://cdn.bootcdn.net/ajax/libs/highlight.js/11.2.0/highlight.min.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/wow/1.1.2/wow.min.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/highlightjs-line-numbers.js/2.8.0/highlightjs-line-numbers.min.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/clipboard.js/2.0.8/clipboard.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/qiniu-js/3.4.1/qiniu.min.js"></script>
<!-- <script src="https://cdnjs.cloudflare.com/ajax/libs/qiniu-js/3.4.0/qiniu.min.js"></script> -->
<!-- lg插件 -->
<script src="./music-js/aes.js"></script>
<script src="./music-js/BigInt.js"></script>
<script src="./music-js/Barrett.js"></script>
<script src="./music-js/RSA.js"></script>
<script src="./music-js/163Api.js"></script>
<script src="./music-js/jsoup.js"></script>
<script src="./music-js/JMshake.js"></script>
<!-- 统计代码 https://analytics.apimoe.lol/ -->
<script defer src="https://analytics.apimoe.lol/pixel/CmhIWUSAeHp5v5Kq"></script>
<!-- /统计代码 -->
<style>
body {
margin: 0;
}
</style>
</head>
<body>
<div id="app"></div>
</body>
<!-- lg -->
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.7/lightgallery.min.js"></script>
<link href="https://cdn.jsdelivr.net/npm/lightgallery@2.7/css/lightgallery-bundle.min.css" rel="stylesheet"></link>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.7.1/plugins/thumbnail/lg-thumbnail.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.7.1/plugins/hash/lg-hash.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.7.1/plugins/rotate/lg-rotate.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.7.1/plugins/video/lg-video.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.7.1/plugins/zoom/lg-zoom.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.7.1/plugins/fullscreen/lg-fullscreen.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.7.1/plugins/autoplay/lg-autoplay.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.7.1/plugins/comment/lg-comment.min.js"></script>
<!-- <script src="https://cdn.jsdelivr.net/npm/lightgallery@2.7.1/plugins/share/lg-share.min.js"></script> -->
<!-- <script src="https://cdn.jsdelivr.net/npm/lightgallery@2.7.1/plugins/pager/lg-pager.min.js"></script> -->
<script>
new WOW().init();
</script>
</html>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
<meta http-equiv='content-language' content='zh-cn'>
<meta charset="utf-8" />
<meta name="Robots" content="all" />
<meta name="keywords" content="Janxland,Janx,Roginshin,roginx,人工智能,前端,后端,动漫,游戏,博客"/>
<meta name="description" content="Janxland,Janx,Roginshin,roginx,人工智能,动漫,游戏,博客">
<meta name="baidu-site-verification" content="codeva-FAjK1LxybY" />
<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">
<meta content="webkit" name="renderer" />
<!-- <meta http-equiv="X-UA-Compatible" content="IE=edge"> -->
<meta name="force-rendering" content="webkit"/>
<meta name="referrer" content="no-referrer" />
<meta name="viewport" content="width=device-width,initial-scale=1.0" />
<link rel="icon" href="./poetize.jpg" sizes="16x16">
<title>ROGINSHIN - 兴</title>
<script>
// fetch('https://search.heweather.net/find?key=3180d3c43e524753ab8bcef69dba023a&group=cn&lang=zh&location=450800')
// .then(function(response) {
// return response.json();
// })
// .then(function(myJson) {
// top.dominCN = myJson.HeWeather6[0].basic[0]
// });
</script>
<script type="text/javascript">
window.jQuery || document.write("<script src='https://cdn.bootcdn.net/ajax/libs/jquery/3.6.3/jquery.min.js'>"+ "<"+"/script>");
</script>
<script type="text/javascript">
window.$.cookie || document.write("<script src='https://cdn.bootcdn.net/ajax/libs/jquery-cookie/1.4.1/jquery.cookie.min.js'>"+ "<"+"/script>");
</script>
<script src="https://cdn.bootcdn.net/ajax/libs/mobile-detect/1.4.5/mobile-detect.min.js"></script>
<script src="https://cdn.bootcss.com/animejs/2.2.0/anime.min.js"></script>
<!-- <script src="https://use.fontawesome.com/3eac4d4c53.js"></script> -->
<script src="https://cdn.bootcdn.net/ajax/libs/highlight.js/11.2.0/highlight.min.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/wow/1.1.2/wow.min.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/highlightjs-line-numbers.js/2.8.0/highlightjs-line-numbers.min.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/clipboard.js/2.0.8/clipboard.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/qiniu-js/3.4.1/qiniu.min.js"></script>
<link href="https://cdn.bootcdn.net/ajax/libs/animate.css/4.1.1/animate.min.css" rel="stylesheet">
<!-- <script src="https://cdnjs.cloudflare.com/ajax/libs/qiniu-js/3.4.0/qiniu.min.js"></script> -->
<link rel="stylesheet" href="https://fastly.jsdelivr.net/npm/firacode@6.2.0/distr/fira_code.min.css">
<style>
body {
margin: 0;
}
</style>
</head>
<body>
<div id="app"></div>
<script src="./music-js/aes.js"></script>
<script src="./music-js/BigInt.js"></script>
<script src="./music-js/Barrett.js"></script>
<script src="./music-js/RSA.js"></script>
<script src="./music-js/163Api.js"></script>
<script src="./music-js/jsoup.js"></script>
<script src="./music-js/JMshake.js"></script>
<!-- lg -->
<script src="https://fastly.jsdelivr.net/npm/lightgallery@2.7/lightgallery.min.js"></script>
<link href="https://fastly.jsdelivr.net/npm/lightgallery@2.7/css/lightgallery-bundle.min.css" rel="stylesheet"></link>
<script src="https://fastly.jsdelivr.net/npm/lightgallery@2.7.1/plugins/thumbnail/lg-thumbnail.min.js"></script>
<script src="https://fastly.jsdelivr.net/npm/lightgallery@2.7.1/plugins/hash/lg-hash.min.js"></script>
<script src="https://fastly.jsdelivr.net/npm/lightgallery@2.7.1/plugins/rotate/lg-rotate.min.js"></script>
<script src="https://fastly.jsdelivr.net/npm/lightgallery@2.7.1/plugins/video/lg-video.min.js"></script>
<script src="https://fastly.jsdelivr.net/npm/lightgallery@2.7.1/plugins/zoom/lg-zoom.min.js"></script>
<script src="https://fastly.jsdelivr.net/npm/lightgallery@2.7.1/plugins/fullscreen/lg-fullscreen.min.js"></script>
<script src="https://fastly.jsdelivr.net/npm/lightgallery@2.7.1/plugins/autoplay/lg-autoplay.min.js"></script>
<script src="https://fastly.jsdelivr.net/npm/lightgallery@2.7.1/plugins/comment/lg-comment.min.js"></script>
<!-- <script src="https://fastly.jsdelivr.net/npm/lightgallery@2.7.1/plugins/share/lg-share.min.js"></script>
<script src="https://fastly.jsdelivr.net/npm/lightgallery@2.7.1/plugins/pager/lg-pager.min.js"></script> -->
<!-- <script src="https://fastly.jsdelivr.net/npm/masonry.js@3.1.5/dist/masonry.pkgd.min.js"></script> -->
<!-- <script src="https://fastly.jsdelivr.net/npm/vue-lazyload@3.0.0-rc.2/vue-lazyload.min.js"></script> -->
</body>
<script>
new WOW().init();
</script>
</html>

@ -1,253 +1,253 @@
var JMusicjsoup = {
getRecommends:function(callback){
$.ajax({
url:'/musicapi/apiqq/musichall/fcgi-bin/fcg_yqqhomepagerecommend.fcg',
data:{'g_tk':5381,'uin':0,'format':'json','inCharset':'utf-8','outCharset':'utf-8','notice':0,'platform':'h5','needNewCode':1,'_':1535537714744},
dataType:'json',
type:'get',
async:true,
success:function(data){
callback._setRecommend(data);
}
});
},
getNewsongs:function(num,callback){
//"{"limit":10}"
setV.d = '{"limit":'+num+'}';
var res = __getKeyton();
$.ajax({
url:'/mapi163/weapi/personalized/newsong',
// data:{'params':'ujh2NED7JxtOit8f2Vo/sp+bqzzC9urfBWjZD60xDdA=','encSecKey':'302d922dd30c10cc489121d1e5e956db50d5d3f8cf1f46dae2c501d88d378cb4b4b11d732efafb3c02c8e5b4e6f2633a5422bf8a0f902a10eb1627ee3665d1dbf370de4356b9a9348f0a3ff8ffb188e996d8e2f8878a95effac07ab1295ebb81ff06127e3e58d339a07d6c824128b58d2f60b60c284b7a55b70ea5e4e126136a'},
data:{'params':res[0],'encSecKey':res[1]},
dataType:'json',
type:'post',
async:true,
success:function(data){
callback._setNewsongs(data);
}
});
},
getLyric:function(id,callback){
setV.d = '{"id":"'+id+'","lv":0,"tv":0}';
var res = __getKeyton();
$.ajax({
url:'/mapi163/weapi/song/lyric',
data:{'params':res[0],'encSecKey':res[1]},
dataType:'json',
type:'post',
async:true,
success:function(data){
callback._setLyric(id,data);
}
});
},
getListsongs:function(callback){
$.ajax({
url:'/mapi163/weapi/v3/playlist/detail',
data:{'params':'KvByhpvz7lzKJlmmur31pyP9wun0SzssbTnXHQveNOPYvGMFH7w8U+0pcbpv3NX0','encSecKey':'be25f5794f940eebbde77dba783699e38bc12db41eadee670e69ebd16a3b29277817dd1795814de4c8264a28e5383da8620736d21275cc3b1f32797c4c63ca76db5dcae60fb21cc2b5d02741ed49fef00dcdaf3e16027de3c5ede1c7d8b8c182f1b0c5fedac846a5f511dbcda94936425b7a5df71dfd54cad47120e26d974b64'},
dataType:'json',
type:'post',
async:true,
success:function(data){
callback._setListsongs(data);
}
});
},
getKeywordsHot(){
//https://music.163.com/weapi/search/hot
//d = "{"type":1111}"
},
getKeywordsTips(key,callback){ //关键词
setV.d = '{"s":"'+key+'"}';
var res = __getKeyton();
$.ajax({
url:'/mapi163/weapi/search/suggest/keyword',
data:{'params':res[0],'encSecKey':res[1]},
dataType:'json',
type:'post',
async:true,
success:function(data){
if(callback!=null){
callback._setKeywordsTips(data);
}
}
});
},
getSearchRes(key,limit,offset,callback){
//"{"s":"神","limit":20,"offset":20,"type":1,"strategy":5,"queryCorrect":true}" 继续获取
setV.d = '{"s":"'+key+'","type":1,"limit":'+limit+',"offset":'+offset+',"strategy":5,"queryCorrect":true}';
var res = __getKeyton();
$.ajax({
url:'/mapi163/weapi/search/get/',
data:{'params':res[0],'encSecKey':res[1]},
dataType:'json',
type:'post',
async:true,
success:function(data){
if(callback!=null){
callback._setSearchRessong(data);
}
//data.result;//"songs"下直接取个数 songs[0].name song[0].ar[0].name
}
});
},
getSongInfo(id,callback){
setV.d ='{"id":"'+id+'","c":"[{\\"id\\":\\"'+id+'\\"}]"}';
var res = __getKeyton();
$.ajax({
url:'/mapi163/weapi/v3/song/detail',
data:{'params':res[0],'encSecKey':res[1]},
dataType:'json',
type:'post',
async:true,
success:function(data){
if(callback!=null){
if(data.code==200){
callback._setSongInfo(id,data); //songs:data.playlist.[tracks,name]
}
}
},
error:function(err){
console.log(err);
}
});
},
getPlayLists(key,limit,offset,callback){
//获得歌单内容
//https://music.163.com/weapi/v3/playlist/detail
//d:"{"id":"2358852380","n":1000}" 歌单ID
//"{"s":"神","limit":20,"offset":20,"type":1,"strategy":5,"queryCorrect":true}" 继续获取
setV.d = '{"limit":'+limit+',"offset":'+offset+',"s":"'+key+'","total":"true","type":"1000","csrf_token":""}';
var res = __getKeyton();
$.ajax({
url:'/mapi163/weapi/cloudsearch/get/web',
data:{'params':res[0],'encSecKey':res[1]},
dataType:'json',
type:'post',
async:true,
success:function(data){
console.error(data);
if(callback!=null){
callback._setSearchResplay(data); //songs:data.playlist.[tracks,name]
}
}
});
},
getPlayList(id,callback){
//获得歌单内容
//https://music.163.com/weapi/v3/playlist/detail
//d:"{"id":"2358852380","n":1000}" 歌单ID
setV.d = `{"id":"${id}","total":"True","limit":1000,"n":1000,"csrf_token":"09556b378da338d2c373d38422f901a6"}`;
var res = __getKeyton();
$.ajax({
url:'/mapi163/weapi/v3/playlist/detail',
// url:'/mapi163/weapi/middle/clientcfg/config/list?csrf_token=',
data:{'params':res[0],'encSecKey':res[1]},
dataType:'json',
type:'post',
async:true,
success:function(data){
if(callback!=null){
callback._setPlayList(data); //songs:data.playlist.[tracks,name]
}
}
});
},
getuserPlayList(id,callback){
//获得用户的所有歌单
//https://music.163.com/weapi/v3/playlist/detail
//d:"{"id":"2358852380","n":1000}" 歌单ID
//"{"s":"神","limit":20,"offset":20,"type":1,"strategy":5,"queryCorrect":true}" 继续获取
setV.d = '{\"uid\":\"'+id+'\",\"offset\":"0","limit":"1001"}';
var res = __getKeyton();
$.ajax({
url:'/mapi163/weapi/user/playlist',
data:{'params':res[0],'encSecKey':res[1]},
dataType:'json',
type:'post',
async:true,
success:function(data){
if(callback!=null){
callback._setuserPlayList(data); //songs:data.playlist.[tracks,name]
}
}
});
},
getCommentsByPlayList(id,callback){
//获得评论内容
//https://music.163.com/weapi/v1/resource/comments/get
//d:"{"resourceType":0,"resourceId":"2358852380","limit":15}" 歌单ID
setV.d = '{"resourceType":0,"resourceId":"'+id+'","limit":15}';
var res = __getKeyton();
$.ajax({
url:'/mapi163/weapi/v1/resource/comments/get',
data:{'params':res[0],'encSecKey':res[1]},
dataType:'json',
type:'post',
async:true,
success:function(data){
if(callback!=null){
callback._setPlayList(data); //songs:data.playlist.[tracks,name]
}
}
});
},
getMp3Url(id,callback){
setV.d = `{"ids":"[\\"${id}\\"]","level":"lossless","encodeType":"aac","csrf_token":"","br":"128000"}`;
//setV.d = "{\"ids\":\"[\\\""+id+"\\\"]\",\"br\":\"128000\"}";
var res = __getKeyton();
$.ajax({
url:'/mapi163/weapi/song/enhance/player/url',
type:'post',
dataType:'json',
async:true,
data:{'params':res[0],'encSecKey':res[1]},
success:function(data){
if(callback!=null){
callback._setMp3Url(id,data);
}
},
error:function(err){
}
});
},
getOnline(callback){
$.ajax({
url:'/userarea',
type:'post',
dataType:'json',
async:true,
data:{"type":"ONLINE"},
success:function(data){
if(data.status == 0){
if(callback!=null){
Jsonp.getUser(data.message,callback);
}
}
},
error:function(err){
}
});
},
getUser(id,callback){
$.ajax({
url:'/userarea',
type:'post',
dataType:'json',
async:true,
data:{"type":"USER","id":id},
success:function(data){
if(callback!=null){
callback._setUser(data);
}
},
error:function(err){
}
});
}
}
var JMusicjsoup = {
getRecommends:function(callback){
$.ajax({
url:'/musicapi/apiqq/musichall/fcgi-bin/fcg_yqqhomepagerecommend.fcg',
data:{'g_tk':5381,'uin':0,'format':'json','inCharset':'utf-8','outCharset':'utf-8','notice':0,'platform':'h5','needNewCode':1,'_':1535537714744},
dataType:'json',
type:'get',
async:true,
success:function(data){
callback._setRecommend(data);
}
});
},
getNewsongs:function(num,callback){
//"{"limit":10}"
setV.d = '{"limit":'+num+'}';
var res = __getKeyton();
$.ajax({
url:'/mapi163/weapi/personalized/newsong',
// data:{'params':'ujh2NED7JxtOit8f2Vo/sp+bqzzC9urfBWjZD60xDdA=','encSecKey':'302d922dd30c10cc489121d1e5e956db50d5d3f8cf1f46dae2c501d88d378cb4b4b11d732efafb3c02c8e5b4e6f2633a5422bf8a0f902a10eb1627ee3665d1dbf370de4356b9a9348f0a3ff8ffb188e996d8e2f8878a95effac07ab1295ebb81ff06127e3e58d339a07d6c824128b58d2f60b60c284b7a55b70ea5e4e126136a'},
data:{'params':res[0],'encSecKey':res[1]},
dataType:'json',
type:'post',
async:true,
success:function(data){
callback._setNewsongs(data);
}
});
},
getLyric:function(id,callback){
setV.d = '{"id":"'+id+'","lv":0,"tv":0}';
var res = __getKeyton();
$.ajax({
url:'/mapi163/weapi/song/lyric',
data:{'params':res[0],'encSecKey':res[1]},
dataType:'json',
type:'post',
async:true,
success:function(data){
callback._setLyric(id,data);
}
});
},
getListsongs:function(callback){
$.ajax({
url:'/mapi163/weapi/v6/playlist/detail',
data:{'params':'KvByhpvz7lzKJlmmur31pyP9wun0SzssbTnXHQveNOPYvGMFH7w8U+0pcbpv3NX0','encSecKey':'be25f5794f940eebbde77dba783699e38bc12db41eadee670e69ebd16a3b29277817dd1795814de4c8264a28e5383da8620736d21275cc3b1f32797c4c63ca76db5dcae60fb21cc2b5d02741ed49fef00dcdaf3e16027de3c5ede1c7d8b8c182f1b0c5fedac846a5f511dbcda94936425b7a5df71dfd54cad47120e26d974b64'},
dataType:'json',
type:'post',
async:true,
success:function(data){
callback._setListsongs(data);
}
});
},
getKeywordsHot(){
//https://music.163.com/weapi/search/hot
//d = "{"type":1111}"
},
getKeywordsTips(key,callback){ //关键词
setV.d = '{"s":"'+key+'"}';
var res = __getKeyton();
$.ajax({
url:'/mapi163/weapi/search/suggest/keyword',
data:{'params':res[0],'encSecKey':res[1]},
dataType:'json',
type:'post',
async:true,
success:function(data){
if(callback!=null){
callback._setKeywordsTips(data);
}
}
});
},
getSearchRes(key,limit,offset,callback){
//"{"s":"神","limit":20,"offset":20,"type":1,"strategy":5,"queryCorrect":true}" 继续获取
setV.d = '{"s":"'+key+'","type":1,"limit":'+limit+',"offset":'+offset+',"strategy":5,"queryCorrect":true}';
var res = __getKeyton();
$.ajax({
url:'/mapi163/weapi/search/get/',
data:{'params':res[0],'encSecKey':res[1]},
dataType:'json',
type:'post',
async:true,
success:function(data){
if(callback!=null){
callback._setSearchRessong(data);
}
//data.result;//"songs"下直接取个数 songs[0].name song[0].ar[0].name
}
});
},
getSongInfo(id,callback){
setV.d ='{"id":"'+id+'","c":"[{\\"id\\":\\"'+id+'\\"}]"}';
var res = __getKeyton();
$.ajax({
url:'/mapi163/weapi/v3/song/detail',
data:{'params':res[0],'encSecKey':res[1]},
dataType:'json',
type:'post',
async:true,
success:function(data){
if(callback!=null){
if(data.code==200){
callback._setSongInfo(id,data); //songs:data.playlist.[tracks,name]
}
}
},
error:function(err){
console.log(err);
}
});
},
getPlayLists(key,limit,offset,callback){
//获得歌单内容
//https://music.163.com/weapi/v3/playlist/detail
//d:"{"id":"2358852380","n":1000}" 歌单ID
//"{"s":"神","limit":20,"offset":20,"type":1,"strategy":5,"queryCorrect":true}" 继续获取
setV.d = '{"limit":'+limit+',"offset":'+offset+',"s":"'+key+'","total":"true","type":"1000","csrf_token":""}';
var res = __getKeyton();
$.ajax({
url:'/mapi163/weapi/cloudsearch/get/web',
data:{'params':res[0],'encSecKey':res[1]},
dataType:'json',
type:'post',
async:true,
success:function(data){
console.error(data);
if(callback!=null){
callback._setSearchResplay(data); //songs:data.playlist.[tracks,name]
}
}
});
},
getPlayList(id,callback){
//获得歌单内容
//https://music.163.com/weapi/v3/playlist/detail
//d:"{"id":"2358852380","n":1000}" 歌单ID
setV.d = `{"id":"${id}","total":"True","limit":1000,"n":1000,"csrf_token":"09556b378da338d2c373d38422f901a6"}`;
var res = __getKeyton();
$.ajax({
url:'/mapi163/weapi/v6/playlist/detail',
// url:'/mapi163/weapi/middle/clientcfg/config/list?csrf_token=',
data:{'params':res[0],'encSecKey':res[1]},
dataType:'json',
type:'post',
async:true,
success:function(data){
if(callback!=null){
callback._setPlayList(data); //songs:data.playlist.[tracks,name]
}
}
});
},
getuserPlayList(id,callback){
//获得用户的所有歌单
//https://music.163.com/weapi/v3/playlist/detail
//d:"{"id":"2358852380","n":1000}" 歌单ID
//"{"s":"神","limit":20,"offset":20,"type":1,"strategy":5,"queryCorrect":true}" 继续获取
setV.d = '{\"uid\":\"'+id+'\",\"offset\":"0","limit":"1001"}';
var res = __getKeyton();
$.ajax({
url:'/mapi163/weapi/user/playlist',
data:{'params':res[0],'encSecKey':res[1]},
dataType:'json',
type:'post',
async:true,
success:function(data){
if(callback!=null){
callback._setuserPlayList(data); //songs:data.playlist.[tracks,name]
}
}
});
},
getCommentsByPlayList(id,callback){
//获得评论内容
//https://music.163.com/weapi/v1/resource/comments/get
//d:"{"resourceType":0,"resourceId":"2358852380","limit":15}" 歌单ID
setV.d = '{"resourceType":0,"resourceId":"'+id+'","limit":15}';
var res = __getKeyton();
$.ajax({
url:'/mapi163/weapi/v1/resource/comments/get',
data:{'params':res[0],'encSecKey':res[1]},
dataType:'json',
type:'post',
async:true,
success:function(data){
if(callback!=null){
callback._setPlayList(data); //songs:data.playlist.[tracks,name]
}
}
});
},
getMp3Url(id,callback){
setV.d = `{"ids":"[\\"${id}\\"]","level":"lossless","encodeType":"aac","csrf_token":"","br":"128000"}`;
//setV.d = "{\"ids\":\"[\\\""+id+"\\\"]\",\"br\":\"128000\"}";
var res = __getKeyton();
$.ajax({
url:'/mapi163/weapi/song/enhance/player/url',
type:'post',
dataType:'json',
async:true,
data:{'params':res[0],'encSecKey':res[1]},
success:function(data){
if(callback!=null){
callback._setMp3Url(id,data);
}
},
error:function(err){
}
});
},
getOnline(callback){
$.ajax({
url:'/userarea',
type:'post',
dataType:'json',
async:true,
data:{"type":"ONLINE"},
success:function(data){
if(data.status == 0){
if(callback!=null){
Jsonp.getUser(data.message,callback);
}
}
},
error:function(err){
}
});
},
getUser(id,callback){
$.ajax({
url:'/userarea',
type:'post',
dataType:'json',
async:true,
data:{"type":"USER","id":id},
success:function(data){
if(callback!=null){
callback._setUser(data);
}
},
error:function(err){
}
});
}
}

@ -1,33 +1,33 @@
<template>
<div id="app">
<router-view/>
</div>
</template>
<script>
export default {
data() {
return {}
},
computed: {},
watch: {},
created() {
},
mounted() {
},
methods: {
}
}
</script>
<style scoped>
</style>
<template>
<div id="app">
<router-view/>
</div>
</template>
<script>
export default {
data() {
return {}
},
computed: {},
watch: {},
created() {
this.$store.commit("changePlaylist", this.$constant.playlists[Math.floor(Math.random() * this.$constant.playlists.length)]);
},
mounted() {
},
methods: {
}
}
</script>
<style scoped>
</style>

@ -1,83 +1,94 @@
:root {
/* 背景 */
--background: white;
--gradualBackground: linear-gradient(to right bottom, #ee7752, #e73c7e, #23a6d5, #23d5ab);
/* 字体 */
--fontColor: black;
/* 边框 */
--borderColor: rgba(0, 0, 0, 0.5);
/* 边框 */
--borderHoverColor: rgba(110, 110, 110, 0.4);
/* 文章字体 */
--articleFontColor: #1f1f1f;
/* 文章灰色字体 */
--articleGreyFontColor: #616161;
/* 评论背景颜色 */
--commentContent: #F7F9FE;
/* 主题背景 */
--themeBackground: orange;
/* 主题悬停背景 */
--gradualRed: linear-gradient(to right, #ff4b2b, #ff416c);
/* 水波纹 */
--rippleColor: rgba(0, 0, 0, 0.5);
/* 导航栏字体 */
--toolbarFont: #333333;
/* 导航栏背景 */
--toolbarBackground: rgba(255, 255, 255, 1);
/* 灰色字体 */
--greyFont: #797979;
--maxGreyFont: #595A5A;
/* footer背景 */
--gradientBG: linear-gradient(-90deg, #ee7752, #e73c7e, #23a6d5, #23d5ab);
/* 白色遮罩 */
--whiteMask: rgba(255, 255, 255, 0.3);
/* max白色遮罩 */
--maxWhiteMask: rgba(255, 255, 255, 0.5);
--maxMaxWhiteMask: rgba(255, 255, 255, 0.7);
/* mini白色遮罩 */
--miniWhiteMask: rgba(255, 255, 255, 0.15);
/* 透明 */
--transparent: rgba(0, 0, 0, 0);
/* mini黑色遮罩 */
--miniMask: rgba(0, 0, 0, 0.15);
/* 黑色遮罩 */
--mask: rgba(0, 0, 0, 0.3);
/* 半透明 */
--translucent: rgba(0, 0, 0, 0.5);
/* 深黑遮罩 */
--maxMask: rgba(0, 0, 0, 0.7);
--white: white;
--red: red;
--lightRed: #ff4b2b;
--maxLightRed: #ff416c;
--orangeRed: #EF794F;
--azure: #ECF7FE;
--blue: rgb(3, 169, 244);
--lightGray: #DDDDDD;
--maxLightGray: #EEEEEE;
--maxMaxLightGray: rgba(242, 242, 242, 0.5);
--lightGreen: #39c5bb;
--green: #67C23A;
--black: black;
--lightYellow: #F4E1C0;
--globalFont: SmileySans;
--commentURL: url(../file/comment.jpg);
--toTop: url(../file/top.jpg);
--bannerWave1: url(../file/bannerwave1.png) repeat-x;
--bannerWave2: url(../file/bannerwave2.png) repeat-x;
--verifyImage: url(../file/bg1.jpg);
--toolbar: url(../file/bg.jpg);
}
:root {
--color-body-bg: #ffffff;
--color-text: #000;
--color-primary: #335eea;
--color-primary-bg: #eaeffd;
--color-secondary: #7a7a7b;
--color-secondary-bg: #f5f5f7;
--color-navbar-bg: rgba(255, 255, 255, 0.86);
--color-primary-bg-for-transparent: rgba(189, 207, 255, 0.28);
--color-secondary-bg-for-transparent: rgba(209, 209, 214, 0.28);
--html-overflow-y: overlay;
/* 背景 */
--background: white;
--gradualBackground: linear-gradient(to right bottom, #ee7752, #e73c7e, #23a6d5, #23d5ab);
/* 字体 */
--fontColor: black;
/* 边框 */
--borderColor: rgba(0, 0, 0, 0.5);
/* 边框 */
--borderHoverColor: rgba(110, 110, 110, 0.4);
/* 文章字体 */
--articleFontColor: #1f1f1f;
/* 文章灰色字体 */
--articleGreyFontColor: #616161;
/* 评论背景颜色 */
--commentContent: #F7F9FE;
/* 主题背景 */
--themeBackground: orange;
--themeBackground-bg: rgb(253, 237, 208);
/* 主题悬停背景 */
--gradualRed: linear-gradient(to right, #ff4b2b, #ff416c);
/* 水波纹 */
--rippleColor: rgba(0, 0, 0, 0.5);
/* 导航栏字体 */
--toolbarFont: #333333;
/* 导航栏背景 */
--toolbarBackground: rgba(255, 255, 255, 1);
/* 灰色字体 */
--greyFont: #797979;
--maxGreyFont: #595A5A;
/* footer背景 */
--gradientBG: linear-gradient(-90deg, #ee7752, #e73c7e, #23a6d5, #23d5ab);
/* 白色遮罩 */
--whiteMask: rgba(255, 255, 255, 0.3);
/* max白色遮罩 */
--maxWhiteMask: rgba(255, 255, 255, 0.5);
--maxMaxWhiteMask: rgba(255, 255, 255, 0.7);
/* mini白色遮罩 */
--miniWhiteMask: rgba(255, 255, 255, 0.15);
/* 透明 */
--transparent: rgba(0, 0, 0, 0);
/* mini黑色遮罩 */
--miniMask: rgba(0, 0, 0, 0.15);
/* 黑色遮罩 */
--mask: rgba(0, 0, 0, 0.3);
/* 半透明 */
--translucent: rgba(0, 0, 0, 0.5);
/* 深黑遮罩 */
--maxMask: rgba(0, 0, 0, 0.7);
--white: white;
--red: red;
--lightRed: #ff4b2b;
--maxLightRed: #ff416c;
--orangeRed: #EF794F;
--azure: #ECF7FE;
--blue: rgb(3, 169, 244);
--lightGray: #DDDDDD;
--maxLightGray: #EEEEEE;
--maxMaxLightGray: rgba(242, 242, 242, 0.5);
--lightGreen: #39c5bb;
--green: #67C23A;
--black: black;
--lightYellow: #F4E1C0;
--globalFont: SmileySans;
--commentURL: url(../file/comment.jpg);
--toTop: url(../file/top.jpg);
--bannerWave1: url(../file/bannerwave1.png) repeat-x;
--bannerWave2: url(../file/bannerwave2.png) repeat-x;
--verifyImage: url(../file/bg1.jpg);
--toolbar: url(../file/bg.jpg);
}

@ -1,478 +1,479 @@
/* 通用css */
* {
box-sizing: border-box;
}
i{
user-select: none;
}
body {
color: var(--fontColor);
font-family: var(--globalFont), serif;
word-break: break-word;
}
@font-face {
font-family: SmileySans;
/* src: url(../fonts/SmileySans.otf); */
src: url(//qiniu.roginx.ink/cdn/fonts/%E9%92%89%E9%92%89%E8%BF%9B%E6%AD%A5%E4%BD%93.ttf);
font-display: swap;
}
/* 图片 */
.background-image {
width: 100vw;
height: 100vh;
/* 固定位置,不随滚动条滚动 */
position: fixed;
z-index: -1;
}
.background-image::before {
position: absolute;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, .2);
content: '';
}
.background-image-error {
background-color: var(--lightGreen);
width: 100vw;
height: 100vh;
/* 固定位置,不随滚动条滚动 */
position: fixed;
z-index: -1;
}
/* 模块化背景色及透明度 */
.background-opacity {
/*background: var(--background);*/
/*opacity: 0.88;*/
}
.my-el-image {
width: 100%;
height: 100%;
}
.my-el-image .image-slot {
width: 100%;
height: 100%;
}
/* 遮罩 */
.poem-image::before {
position: absolute;
width: 100%;
height: 100%;
background-color: var(--mask);
content: "";
}
.user-avatar {
cursor: pointer;
transition: all 0.3s;
user-select: none;
}
.user-avatar:hover {
transform: rotate(360deg);
}
/* 滚动条 */
::-webkit-scrollbar {
width: 8px;
height: 8px;
}
::-webkit-scrollbar-track {
background-color: rgba(73, 177, 245, 0.2);
}
::-webkit-scrollbar-thumb {
background-color: #49b1f5;
background-image: linear-gradient(
45deg,
rgba(255, 255, 255, 0.4) 25%,
transparent 25%,
transparent 50%,
rgba(255, 255, 255, 0.4) 50%,
rgba(255, 255, 255, 0.4) 75%,
transparent 75%,
transparent
);
border-radius: 1em;
}
.el-select-dropdown.el-popper ::-webkit-scrollbar {
display: none;
}
/* 选中样式 */
::selection {
background: var(--lightYellow);
color: var(--black);
}
/* 居中 */
.myCenter {
display: flex;
justify-content: center;
align-items: center;
}
.transformCenter {
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
}
/* 两边 */
.myBetween {
display: flex;
justify-content: space-between;
align-items: center;
}
/* 阴影 */
.shadow-box-mini {
box-shadow: 1px 1px 3px var(--mask);
}
.shadow-box {
box-shadow: 0 1px 20px -6px var(--borderColor);
transition: all 0.3s ease;
}
.shadow-box:hover {
box-shadow: 0 5px 10px 5px var(--borderHoverColor);
}
/* el弹出框样式 */
.el-message {
top: 80px !important;
border: 0;
}
.el-message * {
color: var(--white) !important;
font-weight: 600;
}
.el-message--success {
background: var(--themeBackground);
}
.el-message--warning {
background: var(--gradientBG);
}
.el-message--error {
background: var(--gradualRed);
}
/* 看板娘 */
#waifu-toggle, #waifu {
z-index: 100;
}
#waifu-tips {
border: unset;
animation: unset;
width: 200px;
min-height: 60px;
}
#waifu-tool {
right: -10px;
bottom: 20px;
top: unset;
}
#waifu #live2d {
height: 250px;
width: 250px;
}
/* 图标旋转 */
.iconRotate {
animation: rotate 2s linear infinite;
}
/* 树洞留言 */
.baberrage-item .baberrage-msg {
padding-right: 5px;
}
.baberrage-item .normal .baberrage-avatar img {
width: 100%;
height: 100%;
object-fit: cover;
}
.el-upload.el-upload--picture {
width: 100%;
}
.el-upload-dragger {
width: 100% !important;
height: 100px !important;
}
/* 导航栏 */
.toolbarDrawer {
position: relative;
background: var(--toolbar) center center / cover no-repeat;
letter-spacing: 3px;
}
.toolbarDrawer .el-drawer__header {
font-size: 22px;
color: var(--white);
text-align: center;
position: relative;
}
.toolbarDrawer::before {
position: absolute;
width: 100%;
height: 100%;
background-color: var(--mask);
content: "";
}
.small-menu {
color: var(--white);
font-size: 20px;
user-select: none;
position: relative;
}
.small-menu > li {
list-style: none;
height: 50px;
line-height: 50px;
cursor: pointer;
}
[ks-tag] {
position: relative
}
[ks-tag]:before,[ks-tag]:after {
position: absolute;
pointer-events: none
}
[ks-tag]:before {
width: 0;
height: 0;
opacity: 0;
content: '';
position: absolute;
transition: opacity .3s;
border: .5rem solid transparent
}
[ks-tag~=top]:before {
bottom: 100%;
border-top-color: rgba(0,0,0,.7)
}
[ks-tag~=bottom]:before {
top: 100%;
border-bottom-color: aliceblue;
}
[ks-tag~=top]:before,[ks-tag~=bottom]:before {
left: 50%;
transform: translateX(-50%)
}
[ks-tag=left]:before {
right: 100%;
border-left-color: rgba(0,0,0,.7)
}
[ks-tag=right]:before {
left: 100%;
border-right-color: rgba(0,0,0,.7)
}
[ks-tag=left]:before,[ks-tag=right]:before {
top: 50%;
transform: translateY(-50%)
}
[ks-tag~=top]:after {
bottom: 100%;
margin-bottom: 1rem
}
[ks-tag~=bottom]:after {
top: 100%;
margin-top: 1rem
}
[ks-tag=top]:after,[ks-tag=bottom]:after {
left: 50%;
transform: translateX(-50%)
}
[ks-tag=left]:after {
right: 100%;
margin-right: 1rem
}
[ks-tag=right]:after {
left: 100%;
margin-left: 1rem
}
[ks-tag=left]:after,[ks-tag=right]:after {
top: 50%;
transform: translateY(-50%)
}
[ks-tag~=left][ks-tag~=top]:after,[ks-tag~=left][ks-tag~=bottom]:after {
right: 0;
min-width: 4em
}
[ks-tag~=right][ks-tag~=top]:after,[ks-tag~=right][ks-tag~=bottom]:after {
left: 0;
min-width: 4em
}
[ks-text]:hover:before,[ks-text]:hover:after {
opacity: 1
}
[ks-text]:after {
opacity: 0;
z-index: 1;
color: #fff;
font-size: .85rem;
white-space: nowrap;
border-radius: .5rem;
padding: .25rem .5rem;
content: attr(ks-text);
transition: opacity .3s;
background: rgba(0,0,0,.7)
}
.mceTmpl{
position:relative;
user-select: none;
}
.check_label{
box-sizing: border-box;
width:100%;
display: block;
position: absolute;
width: 100%;
height: 120px;
opacity: 1;
bottom: 0;
left: 0;
background-image: linear-gradient(to bottom, rgba(255, 255, 255, 0) 0%, var(--background) 70%);
pointer-events: none;
}
.hideContext{
position: relative;
box-sizing: border-box;
width:100%;
max-height:120px;
min-height: 80px;
overflow: hidden;
transition:.3s;
}
.check_label::after{
content: '显示内容';
letter-spacing: .3em;
height: 1.2em;
background: #0000000a;
line-height: 1.2em;
bottom: 0px;
display: inline-block;
position: absolute;
left: 50%;
transform: translateX(-50%);
background-color: #333;
font-size: .8em;
color: #fff;
padding: 8px 14px;
border-radius: 4px;
box-shadow: 0px 2px 2px rgb(0 0 0 / 20%);
cursor: pointer;
pointer-events: auto;
}
.check_label:hover::after{
font-weight:550;
color:#FFF;
background: #000;
opacity: 1 !important;
transition:.3s;
}
.hideCheckInput{
display: none;
}
.hideCheckInput:checked ~ .check_label{
transition: .3s;
background-image: none;
}
.hideCheckInput:checked ~ .hideContext {
min-height: 300px;
max-height: unset;
transition: .3s;
}
.hideCheckInput:checked ~ .check_label::after{
content: '隐藏内容';
transition: 2s ease .5s;
opacity: 0;
}
.hideCheckInput:checked ~ .check_label:hover::after{
background: #000 !important;
animation:none;
transition: .4s !important;
}
.print{
width:1000px;
white-space:nowrap;
overflow:hidden;
-webkit-animation: dy 3s steps(60, end) infinite;
animation: dy 3s steps(50, end) infinite;
}
.spanFeather {
width: 100%;
overflow: hidden;
text-overflow: ellipsis;
}
@supports (-webkit-mask-image: inherit) or (mask-image: inherit) {
.spanFeather {
text-overflow: clip;
-webkit-mask-image: linear-gradient(
to right,
rgba(0, 0, 0, 1) calc(100% - 2em),
transparent
);
mask-image: linear-gradient(
to right,
rgba(0, 0, 0, 1) calc(100% - 2em),
transparent
);
}
}
@-webkit-keyframes dy{
from { width: 0;}
}
@keyframes dy{
from { width: 0;}
}
@media screen and (max-width: 400px) {
.el-dialog {
width: 75% !important;
}
}
/* 通用css */
* {
box-sizing: border-box;
}
i{
user-select: none;
}
body {
color: var(--fontColor);
font-family: var(--globalFont), serif;
word-break: break-word;
}
@font-face {
font-family: SmileySans;
/* src: url(../fonts/SmileySans.otf); */
src: url(//qiniu.roginx.ink/cdn/fonts/%E9%92%89%E9%92%89%E8%BF%9B%E6%AD%A5%E4%BD%93.ttf);
font-display: swap;
}
/* 图片 */
.background-image {
width: 100vw;
height: 100vh;
/* 固定位置,不随滚动条滚动 */
position: fixed;
z-index: -1;
}
.background-image::before {
position: absolute;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, .2);
content: '';
}
.background-image-error {
background-color: var(--lightGreen);
width: 100vw;
height: 100vh;
/* 固定位置,不随滚动条滚动 */
position: fixed;
z-index: -1;
}
/* 模块化背景色及透明度 */
.background-opacity {
/*background: var(--background);*/
/*opacity: 0.88;*/
}
.my-el-image {
width: 100%;
height: 100%;
}
.my-el-image .image-slot {
width: 100%;
height: 100%;
}
/* 遮罩 */
.poem-image::before {
position: absolute;
width: 100%;
height: 100%;
background-color: var(--mask);
content: "";
}
.user-avatar {
cursor: pointer;
transition: all 0.3s;
user-select: none;
}
.user-avatar:hover {
transform: rotate(360deg);
}
/* 滚动条 */
::-webkit-scrollbar {
width: 8px;
height: 8px;
}
::-webkit-scrollbar-track {
background-color: rgba(73, 177, 245, 0.2);
}
::-webkit-scrollbar-thumb {
background-color: #49b1f5;
background-image: linear-gradient(
45deg,
rgba(255, 255, 255, 0.4) 25%,
transparent 25%,
transparent 50%,
rgba(255, 255, 255, 0.4) 50%,
rgba(255, 255, 255, 0.4) 75%,
transparent 75%,
transparent
);
border-radius: 1em;
}
.el-select-dropdown.el-popper ::-webkit-scrollbar {
display: none;
}
/* 选中样式 */
::selection {
background: var(--lightYellow);
color: var(--black);
}
/* 居中 */
.myCenter {
display: flex;
justify-content: center;
align-items: center;
}
.transformCenter {
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
}
/* 两边 */
.myBetween {
display: flex;
justify-content: space-between;
align-items: center;
}
/* 阴影 */
.shadow-box-mini {
box-shadow: 1px 1px 3px var(--mask);
}
.shadow-box {
box-shadow: 0 1px 20px -6px var(--borderColor);
transition: all 0.3s ease;
}
.shadow-box:hover {
box-shadow: 0 5px 10px 5px var(--borderHoverColor);
}
/* el弹出框样式 */
.el-message {
top: 80px !important;
border: 0;
}
.el-message * {
color: var(--white) !important;
font-weight: 600;
}
.el-message--success {
background: var(--themeBackground);
}
.el-message--warning {
background: var(--gradientBG);
}
.el-message--error {
background: var(--gradualRed);
}
/* 看板娘 */
#waifu-toggle, #waifu {
z-index: 100;
}
#waifu-tips {
border: unset;
animation: unset;
width: 200px;
min-height: 60px;
}
#waifu-tool {
right: -10px;
bottom: 20px;
top: unset;
}
#waifu #live2d {
height: 250px;
width: 250px;
}
/* 图标旋转 */
.iconRotate {
animation: rotate 2s linear infinite;
}
/* 树洞留言 */
.baberrage-item .baberrage-msg {
padding-right: 5px;
}
.baberrage-item .normal .baberrage-avatar img {
width: 100%;
height: 100%;
object-fit: cover;
}
.el-upload.el-upload--picture {
width: 100%;
}
.el-upload-dragger {
width: 100% !important;
height: 100px !important;
}
/* 导航栏 */
.toolbarDrawer {
position: relative;
background: var(--toolbar) center center / cover no-repeat;
letter-spacing: 3px;
}
.toolbarDrawer .el-drawer__header {
font-size: 22px;
color: var(--white);
text-align: center;
position: relative;
}
.toolbarDrawer::before {
position: absolute;
width: 100%;
height: 100%;
background-color: var(--mask);
content: "";
}
.small-menu {
color: var(--white);
font-size: 20px;
user-select: none;
position: relative;
}
.small-menu > li {
list-style: none;
height: 50px;
line-height: 50px;
cursor: pointer;
}
[ks-tag] {
position: relative
}
[ks-tag]:before,[ks-tag]:after {
position: absolute;
pointer-events: none
}
[ks-tag]:before {
width: 0;
height: 0;
opacity: 0;
content: '';
position: absolute;
transition: opacity .3s;
border: .5rem solid transparent
}
[ks-tag~=top]:before {
bottom: 100%;
border-top-color: rgba(0,0,0,.7)
}
[ks-tag~=bottom]:before {
top: 100%;
border-bottom-color: aliceblue;
}
[ks-tag~=top]:before,[ks-tag~=bottom]:before {
left: 50%;
transform: translateX(-50%)
}
[ks-tag=left]:before {
right: 100%;
border-left-color: rgba(0,0,0,.7)
}
[ks-tag=right]:before {
left: 100%;
border-right-color: rgba(0,0,0,.7)
}
[ks-tag=left]:before,[ks-tag=right]:before {
top: 50%;
transform: translateY(-50%)
}
[ks-tag~=top]:after {
bottom: 100%;
margin-bottom: 1rem
}
[ks-tag~=bottom]:after {
top: 100%;
margin-top: 1rem
}
[ks-tag=top]:after,[ks-tag=bottom]:after {
left: 50%;
transform: translateX(-50%)
}
[ks-tag=left]:after {
right: 100%;
margin-right: 1rem
}
[ks-tag=right]:after {
left: 100%;
margin-left: 1rem
}
[ks-tag=left]:after,[ks-tag=right]:after {
top: 50%;
transform: translateY(-50%)
}
[ks-tag~=left][ks-tag~=top]:after,[ks-tag~=left][ks-tag~=bottom]:after {
right: 0;
min-width: 4em
}
[ks-tag~=right][ks-tag~=top]:after,[ks-tag~=right][ks-tag~=bottom]:after {
left: 0;
min-width: 4em
}
[ks-text]:hover:before,[ks-text]:hover:after {
opacity: 1
}
[ks-text]:after {
opacity: 0;
z-index: 1;
color: #fff;
font-size: .85rem;
white-space: nowrap;
border-radius: .5rem;
padding: .25rem .5rem;
content: attr(ks-text);
transition: opacity .3s;
background: rgba(0,0,0,.7)
}
.mceTmpl,tinytemplate{
position:relative;
user-select: none;
display: block;
}
.check_label{
box-sizing: border-box;
width:100%;
display: block;
position: absolute;
width: 100%;
height: 120px;
opacity: 1;
bottom: 0;
left: 0;
background-image: linear-gradient(to bottom, rgba(255, 255, 255, 0) 0%, var(--background) 100%);
pointer-events: none;
}
.hideContext{
position: relative;
box-sizing: border-box;
width:100%;
max-height:160px;
min-height: 100px;
overflow: hidden;
transition:.3s;
}
.check_label::after{
content: '显示内容';
letter-spacing: .3em;
height: 1.2em;
background: #0000000a;
line-height: 1.2em;
bottom: 0px;
display: inline-block;
position: absolute;
left: 50%;
transform: translateX(-50%);
background-color: #333;
font-size: .8em;
color: #fff;
padding: 8px 14px;
border-radius: 4px;
box-shadow: 0px 2px 2px rgb(0 0 0 / 20%);
cursor: pointer;
pointer-events: auto;
}
.check_label:hover::after{
font-weight:550;
color:#FFF;
background: #000;
opacity: 1 !important;
transition:.3s;
}
.hideCheckInput{
display: none;
}
.hideCheckInput:checked ~ .check_label{
transition: .3s;
background-image: none;
}
.hideCheckInput:checked ~ .hideContext {
min-height: 300px;
max-height: unset;
transition: .3s;
}
.hideCheckInput:checked ~ .check_label::after{
content: '隐藏内容';
transition: 2s ease .5s;
opacity: 0;
}
.hideCheckInput:checked ~ .check_label:hover::after{
background: #000 !important;
animation:none;
transition: .4s !important;
}
.print{
width:1000px;
white-space:nowrap;
overflow:hidden;
-webkit-animation: dy 3s steps(60, end) infinite;
animation: dy 3s steps(50, end) infinite;
}
.spanFeather {
width: 100%;
overflow: hidden;
text-overflow: ellipsis;
}
@supports (-webkit-mask-image: inherit) or (mask-image: inherit) {
.spanFeather {
text-overflow: clip;
-webkit-mask-image: linear-gradient(
to right,
rgba(0, 0, 0, 1) calc(100% - 2em),
transparent
);
mask-image: linear-gradient(
to right,
rgba(0, 0, 0, 1) calc(100% - 2em),
transparent
);
}
}
@-webkit-keyframes dy{
from { width: 0;}
}
@keyframes dy{
from { width: 0;}
}
@media screen and (max-width: 400px) {
.el-dialog {
width: 75% !important;
}
}

@ -0,0 +1,47 @@
{
"bookSourceComment": "",
"bookSourceGroup": "🎨漫画",
"bookSourceName": "🎨禁漫天堂(正文有问题)",
"bookSourceType": 0,
"bookSourceUrl": "https:\/\/jmcomic1.me\/",
"customOrder": 37,
"enabled": true,
"enabledExplore": true,
"exploreUrl": "总排行榜::\/albums?o=mv?page={{key}}\n月排行榜::\/albums?t=m&o=mv?page={{key}}\n周排行榜::\/albums?o=mv&t=w?page={{key}}\n日排行榜::\/albums?o=mv&t=t?page={{key}}\n最新A漫::\/albums?o=mr?page={{key}}\n同人::\/albums\/doujin?page={{key}}\n\n单行本::\/albums\/single?o=mr?page={{key}}\n短篇::\/albums\/short?page={{key}}\n其他::\/albums\/another?page={{key}}\n韩漫::\/albums\/hanman?page={{key}}\n美漫::\/albums\/meiman?page={{key}}\ncosplay::\/albums\/another\/sub\/cosplay?page={{key}}",
"lastUpdateTime": 1651214216611,
"respondTime": 180000,
"ruleBookInfo": {
"coverUrl": "class.thumb-overlay.2@tag.img@src",
"init": "",
"intro": "class.nav-tab-content@class.p-t-5 p-b-5@text",
"kind": "class.tag-block.3@text",
"name": "class.panel-heading.0@text"
},
"ruleContent": {
"content":"class.row thumb-overlay-albums",
"imageStyle": "Full"
},
"ruleExplore": {
"bookList": "class.col-xs-6 col-sm-6 col-md-4 col-lg-3 list-col",
"bookUrl": "tag.a.0@href",
"coverUrl": "tag.img@src",
"intro": "class.p-t-5 p-b-5.7@text",
"kind": "class.title-truncate@tag.a@text",
"name": "class.video-title title-truncate m-t-5@text"
},
"ruleSearch": {
"bookList": "class.list-col",
"bookUrl": "tag.a.0@href",
"realUrl":"class.img@data-original",
"coverUrl": "class.img@data-original",
"kind": "class.title-truncate tags p-b-5@tag.a@text",
"name": "tag.img@title"
},
"ruleToc": {
"chapterList": "class.btn-toolbar.0@tag.a||class.col btn btn-primary dropdown-toggle reading",
"chapterName": "text",
"chapterUrl": "tag.a@href"
},
"searchUrl": "https:\/jmcomic1.me\/search\/photos?search_query={{key}}&main_tag=0",
"weight": 0
}

@ -1,190 +1,195 @@
<template>
<div>
<!-- 两句诗 -->
<div class="my-animation-slide-top">
<twoPoem :isHitokoto="false"></twoPoem>
</div>
<div style="background: var(--background)" class="my-animation-slide-bottom">
<div class="about-wrap">
<h1 style="font-size: 40px;font-weight: 500;letter-spacing: 5px;">两只毛驴鸣翠柳</h1>
<!-- 对话框 -->
<div class="about-box">
<h4> {{$store.state.webInfo.webName}} 对话中...</h4>
<div v-if="sayShow" id="say-container"></div>
</div>
</div>
<!-- 页脚 -->
<myFooter></myFooter>
</div>
</div>
</template>
<script>
const twoPoem = () => import( "./common/twoPoem");
const myFooter = () => import( "./common/myFooter");
export default {
components: {
twoPoem,
myFooter
},
data() {
return {
sayShow: false,
sayContent: [
{
"talk": ["Hi, there👋", "这是一个 Vue2 Vue3 与 SpringBoot 结合的产物~"],
"reply": ["然后呢? 😃", "少废话! 🙄"]
}, {
"talk": ["😘",
"本站平时仅用于交流和学习新知识",
"如涉及侵权请联系站长删除对应资源,谢谢!!!"],
"reply": ["这个网站有什么用吗? 😂"]
}, {
"talk": ["拥有自己的独立网站难道不酷吗🚀",
"那就摸鱼吧👋",
"摸鱼大军请在聊天室集合🥝"],
"reply": []
}
],
sayIndex: 0
}
},
computed: {},
watch: {},
created() {
setTimeout(() => {
this.sayShow = true;
this.say();
}, 2000);
},
mounted() {
},
methods: {
answer(index, value) {
$(".say-select").remove();
let htmlStr = `<div class="say-right my-animation-slide-bottom"><span class="say-item-right">${value}</span></div>`;
let frag = document.createRange().createContextualFragment(htmlStr);
document.getElementById("say-container").appendChild(frag);
if (index === 0) {
setTimeout(() => {
this.say();
}, 500);
} else {
let htmlStr = `<div class="say-left my-animation-slide-bottom"><span class="say-item-left">👋 👋 👋</span></div>`;
let frag = document.createRange().createContextualFragment(htmlStr);
document.getElementById("say-container").appendChild(frag);
}
},
say() {
if (!this.$common.isEmpty(this.sayContent[this.sayIndex]) && !this.$common.isEmpty(this.sayContent[this.sayIndex].talk)) {
this.sayContent[this.sayIndex].talk.forEach((value, index, talk) => {
setTimeout(() => {
let htmlStr = `<div class="say-left my-animation-slide-bottom"><span class="say-item-left">${value}</span></div>`;
let frag = document.createRange().createContextualFragment(htmlStr);
document.getElementById("say-container").appendChild(frag);
if (talk.length === index + 1) {
if (!this.$common.isEmpty(this.sayContent[this.sayIndex].reply)) {
setTimeout(() => {
if (this.sayContent[this.sayIndex].reply.length === 2) {
let reply0 = this.sayContent[this.sayIndex].reply[0];
let reply1 = this.sayContent[this.sayIndex].reply[1];
let htmlStr = `<div class="say-left my-animation-slide-bottom"><span class="say-select">${reply0}</span><span class="say-select">${reply1}</span></div>`;
let frag = document.createRange().createContextualFragment(htmlStr);
document.getElementById("say-container").appendChild(frag);
document.getElementsByClassName("say-select")[0].onclick = () => {
this.answer(0, reply0);
}
document.getElementsByClassName("say-select")[1].onclick = () => {
this.answer(1, reply1);
}
} else if (this.sayContent[this.sayIndex].reply.length === 1) {
let reply0 = this.sayContent[this.sayIndex].reply[0];
let htmlStr = `<div class="say-left my-animation-slide-bottom"><span class="say-select">${reply0}</span></div>`;
let frag = document.createRange().createContextualFragment(htmlStr);
document.getElementById("say-container").appendChild(frag);
document.getElementsByClassName("say-select")[0].onclick = () => {
this.answer(0, reply0);
}
}
this.sayIndex += 1;
}, 500);
}
}
}, index * 500);
});
}
}
}
}
</script>
<style>
.about-wrap {
text-align: center;
width: 95%;
max-width: 800px;
margin: 0 auto;
padding: 40px 20px 80px;
}
.about-box {
min-height: 450px;
padding: 5px;
background-color: var(--maxMaxLightGray);
border-radius: 10px;
}
.say-item-left {
padding: 5px 12px;
border-radius: 1rem;
color: var(--maxGreyFont);
background-color: var(--lightGray);
}
.say-item-right {
padding: 5px 12px;
border-radius: 1rem;
color: var(--white);
background-color: var(--translucent);
}
.say-left {
display: flex;
justify-content: left;
margin: 15px;
}
.say-right {
display: flex;
justify-content: right;
margin: 15px;
}
.say-select {
cursor: pointer;
background: var(--black);
border-radius: 5px;
padding: 5px 10px;
margin-right: 12px;
margin-top: 20px;
color: var(--white);
border: 1px solid var(--black);
}
.say-select:hover {
border: 1px solid var(--themeBackground);
color: var(--themeBackground);
box-shadow: 0 0 5px var(--themeBackground);
}
</style>
<template>
<div>
<!-- 两句诗 -->
<div class="my-animation-slide-top">
<twoPoem :isHitokoto="false"></twoPoem>
</div>
<div style="background: var(--background)" class="my-animation-slide-bottom">
<div class="about-wrap">
<h1 style="font-size: 40px;font-weight: 500;letter-spacing: 5px;">关于博主</h1>
<!-- 对话框 -->
<div class="about-box">
<h4> {{$store.state.webInfo.webName}} 对话中...</h4>
<div v-if="sayShow" id="say-container"></div>
</div>
</div>
<!-- 页脚 -->
<myFooter></myFooter>
</div>
</div>
</template>
<script>
const twoPoem = () => import( "./common/twoPoem");
const myFooter = () => import( "./common/myFooter");
export default {
components: {
twoPoem,
myFooter
},
data() {
return {
sayShow: false,
sayContent: [
{
"talk": ["Hi, there👋", "这是一个 Vue2 与 SpringBoot 结合的产物~项目名为Ablaze"],
"reply": ["然后呢? 😃", "少废话! 🙄"]
}, {
"talk": ["😘",
"本站仅用于交流和学习新知识",
"如涉及侵权请联系站长删除对应资源,谢谢!!!"],
"reply": ["关于博主"]
}, {
"talk": ["博主目前是一位热爱技术的普通大一学生",
"主要学习方向是大数据与人工智能",
"当然嵌入式和单片机等硬件工程师方向也有在学啦,希望多多指教~"],
"reply": ["联系方式📞"]
},{
"talk": ["💌Mailjanxland@gmailjanxland@qq.com",
"QQ983341575",
"微信号janxland"],
"reply": ["了解完毕~"]
}
],
sayIndex: 0
}
},
computed: {},
watch: {},
created() {
setTimeout(() => {
this.sayShow = true;
this.say();
}, 2000);
},
mounted() {
},
methods: {
answer(index, value) {
$(".say-select").remove();
let htmlStr = `<div class="say-right my-animation-slide-bottom"><span class="say-item-right">${value}</span></div>`;
let frag = document.createRange().createContextualFragment(htmlStr);
document.getElementById("say-container").appendChild(frag);
if (index === 0) {
setTimeout(() => {
this.say();
}, 500);
} else {
let htmlStr = `<div class="say-left my-animation-slide-bottom"><span class="say-item-left">👋 👋 👋</span></div>`;
let frag = document.createRange().createContextualFragment(htmlStr);
document.getElementById("say-container").appendChild(frag);
}
},
say() {
if (!this.$common.isEmpty(this.sayContent[this.sayIndex]) && !this.$common.isEmpty(this.sayContent[this.sayIndex].talk)) {
this.sayContent[this.sayIndex].talk.forEach((value, index, talk) => {
setTimeout(() => {
let htmlStr = `<div class="say-left my-animation-slide-bottom"><span class="say-item-left">${value}</span></div>`;
let frag = document.createRange().createContextualFragment(htmlStr);
document.getElementById("say-container").appendChild(frag);
if (talk.length === index + 1) {
if (!this.$common.isEmpty(this.sayContent[this.sayIndex].reply)) {
setTimeout(() => {
if (this.sayContent[this.sayIndex].reply.length === 2) {
let reply0 = this.sayContent[this.sayIndex].reply[0];
let reply1 = this.sayContent[this.sayIndex].reply[1];
let htmlStr = `<div class="say-left my-animation-slide-bottom"><span class="say-select">${reply0}</span><span class="say-select">${reply1}</span></div>`;
let frag = document.createRange().createContextualFragment(htmlStr);
document.getElementById("say-container").appendChild(frag);
document.getElementsByClassName("say-select")[0].onclick = () => {
this.answer(0, reply0);
}
document.getElementsByClassName("say-select")[1].onclick = () => {
this.answer(1, reply1);
}
} else if (this.sayContent[this.sayIndex].reply.length === 1) {
let reply0 = this.sayContent[this.sayIndex].reply[0];
let htmlStr = `<div class="say-left my-animation-slide-bottom"><span class="say-select">${reply0}</span></div>`;
let frag = document.createRange().createContextualFragment(htmlStr);
document.getElementById("say-container").appendChild(frag);
document.getElementsByClassName("say-select")[0].onclick = () => {
this.answer(0, reply0);
}
}
this.sayIndex += 1;
}, 500);
}
}
}, index * 500);
});
}
}
}
}
</script>
<style>
.about-wrap {
text-align: center;
width: 95%;
max-width: 800px;
margin: 0 auto;
padding: 40px 20px 80px;
}
.about-box {
min-height: 450px;
padding: 5px;
background-color: var(--maxMaxLightGray);
border-radius: 10px;
}
.say-item-left {
padding: 5px 12px;
border-radius: 1rem;
color: var(--maxGreyFont);
background-color: var(--lightGray);
}
.say-item-right {
padding: 5px 12px;
border-radius: 1rem;
color: var(--white);
background-color: var(--translucent);
}
.say-left {
display: flex;
justify-content: left;
margin: 15px;
}
.say-right {
display: flex;
justify-content: right;
margin: 15px;
}
.say-select {
cursor: pointer;
background: var(--black);
border-radius: 5px;
padding: 5px 10px;
margin-right: 12px;
margin-top: 20px;
color: var(--white);
border: 1px solid var(--black);
}
.say-select:hover {
border: 1px solid var(--themeBackground);
color: var(--themeBackground);
box-shadow: 0 0 5px var(--themeBackground);
}
</style>

@ -0,0 +1,710 @@
<template>
<div>
<loader :loading="loading">
<!-- 加载页面 -->
<template slot="loader">
<div>
<zombie></zombie>
</div>
</template>
<!-- 内容页面 -->
<template slot="body">
<!-- 首页图片 -->
<el-image style="animation: header-effect 2s"
class="background-image"
:src="albumPoster"
fit="cover">
<div slot="error" class="image-slot background-image-error"></div>
</el-image>
<!-- 首页文字 -->
<div class="signature-wall myCenter my-animation-hideToShow">
<h1 class="playful">
<span v-for="(a, index) in albumTitle" :key="index">{{a}}</span>
</h1>
<div class="printer" @click="getGuShi()">
<printer :printerInfo="printerInfo">
<template slot="paper" slot-scope="scope">
<h3>
{{ scope.content }}<span class="cursor">|</span>
</h3>
</template>
</printer>
</div>
<div id="bannerWave1"></div>
<div id="bannerWave2"></div>
<i class="el-icon-arrow-down" @click="navigation('.page-container-wrap')"></i>
</div>
<div class="page-container-content" v-show="albumContent">
<div class="aurora-content" v-html="albumContent"></div>
</div>
<!-- 首页内容 -->
<div class="page-container-wrap" v-if="!$route.query.type">
<div class="grid grid-album" ref="grid">
<div class="grid-item grid-item-album" v-for="(item, index) in albumItems[0]" :href="item" target="_blank" :key="item"
:overtip="`+ ${albumItems[0].length-9}`"
:data-sub-html="albumItems[1][index]?`<a target=_blank href=/album?type=aurora&id=${articles[index].id}>${albumItems[1][index]}</a>`:'NO NOTE'"
data-fb-html='是否需要添加评论功能呢?'
>
<div class="imgbox" style="position: relative;overflow: hidden;display: flex;border-radius: 14px;">
<div class="imgAlt">
{{albumItems[1][index]}}
</div>
<img target="_blank" :title="albumItems[1][index]" onerror="this.src='https://cdn.seovx.com/d/?mom=302'" class="lazyload_images" :data-source="item.indexOf('qiniu.roginx.ink')!=-1?item+'-normal':item" v-lazy="checkImage(item,albumItems[1][index])" alt="">
</div>
<span @click.stop="routerAurora(articles[index].id)">{{albumItems[1][index]}}</span>
</div>
<div class="grid-sizer"></div>
</div>
<div class="pagination-wrap">
<div @click="pageArticles()" class="pagination" v-if="pagination.total !== articles.length">
下一页
</div>
<div v-else style="user-select: none">
~~到底啦~~
</div>
</div>
</div>
<div class="page-container-wrap" v-if="$route.query.type">
<div class="grid" ref="grid">
<a class="grid-item" v-for="(item, index) in albumItems[0]" :href="item" target="_blank" :key="item"
:overtip="`+ ${albumItems[0].length-9}`"
:data-sub-html="albumItems[1][index]||'NO NOTE'"
data-fb-html='是否需要添加评论功能呢?'
>
<div class="imgbox" style="position: relative;overflow: hidden;display: flex;border-radius: 14px;">
<div class="imgAlt">
{{albumItems[1][index]}}
</div>
<img target="_blank" :title="albumItems[1][index]" onerror="this.src='https://agentestudio.com/uploads/post/image/69/main_how_to_design_404_page.png'" class="lazyload_images" v-lazy="checkImage(item,albumItems[1][index])" alt="">
</div>
</a>
<div class="grid-sizer"></div>
</div>
<div class="pagination-wrap">
<div @click="pageArticles()" class="pagination" v-if="pagination.total !== articles.length">
下一页
</div>
<div v-else style="user-select: none">
~~到底啦~~
</div>
</div>
</div>
<!-- 页脚 -->
<div style="background: var(--background)">
<myFooter></myFooter>
</div>
</template>
</loader>
</div>
</template>
<script>
import Masonry from 'masonry-layout'
import imagesLoaded from 'imagesloaded'
import sourceHandle from '../utils/sourceHandle'
const loader = () => import( "./common/loader");
const zombie = () => import( "./common/zombie");
const printer = () => import( "./common/printer");
const myFooter = () => import( "./common/myFooter");
import jmcomic from '../assets/json/jmcomiccity.json'
export default {
components: {
loader,
zombie,
printer,
myFooter,
},
data() {
return {
loading: false,
albumLoading:true,
showAside: true,
albumTitle:"动态相册",
albumPoster:this.$constant.two_poem_image[0],
printerInfo: "你看对面的青山多漂亮",
pagination: {
current: 1,
size: 30,
total: 0,
searchKey: ""
},
guShi: {
"content": "",
"origin": "",
"author": "",
"category": ""
},
options: {
// Masonry
gutter: 10,
columnWidth: '.grid-item',
itemSelector: '.grid-item',
percentPosition: true,
},
routerMap:{
"aurora":this.getAurora,
"acg":this.getRandom,
"web":this.getWeb,
"dynamic":this.getDynamic
},
articles: [],
albumItems:[[],[]],
albumContent:undefined,
masonry: null,
dynamicGallery: undefined
};
},
watch: {
'$route.query': {
handler(newQuery, oldQuery) {
this.albumItems.length = 0;
this.getGuShi();
this.pagination.size = this.$route.query.type?10:30;
if(!this.$route.query.type){
this.getArticles();
} else {
try {
this.routerMap[this.$route.query.type]("");
} catch (error) {
console.log(error);
this.$message({
message: "错误的路由!",
type: "error"
});
}
}
},
immediate: true // handler
}
},
mounted() {
// this.$common.loadAssets([{type:"js",src:"https://fastly.jsdelivr.net/npm/lightgallery@2.7/lightgallery.min.js"}]);
},
updated(){
// this.albumLoading = true;
// this.masonry = new Masonry(this.$refs.grid, this.options);
// //
// imagesLoaded(this.$refs.grid, () => {
// this.albumLoading = false;
// this.masonry.layout();
// this.$nextTick(()=>{
// try {
// top.dynamicGallery?.destroy();
// } catch (error) {
// }
// top.dynamicGallery = lightGallery(this.$refs.grid,{
// plugins: [lgHash,lgRotate,lgVideo,lgZoom,lgFullscreen,lgAutoplay,lgComment],
// mode: 'lg-slide',
// cssEasing: 'ease',
// commentBox: true,
// fbComments: true,
// galleryId:1,
// speed: 300
// });
// })
// })
},
methods: {
checkImage(src,notice){
if(notice?.slice(0, 4)=="NSFW"&&!this.$route.query.NSFW)
return 'https://gd-hbimg.huaban.com/9d4628a3c336c8c816366d7f8b6a7937cd2b3b74c9bd4-KYmhYR_fw658webp'
else
return src.indexOf('qiniu.roginx.ink')!=-1?src+'-album':src
},
reInitGallery(){
this.$nextTick(()=>{
try {
top.dynamicGallery?.destroy();
} catch (error) {
}
top.dynamicGallery = lightGallery(this.$refs.grid,{
plugins: [lgHash,lgRotate,lgVideo,lgZoom,lgFullscreen,lgAutoplay,lgComment],
mode: 'lg-slide',
cssEasing: 'ease',
commentBox: true,
fbComments: true,
galleryId:1,
speed: 300
});
})
},
checkPicture(){
let thi = this;
this.albumLoading = true;
let masonryInterval;
this.masonry = new Masonry(this.$refs.grid, this.options);
this.reInitGallery();
masonryInterval = setInterval(() => {
this.masonry.layout();
this.masonry.getItemElements().forEach((item) => {
const img = item.querySelector('img');
if (img) {
if (!img.complete) {
//
img.onload = () => {
console.log("图片已加载");
if (img.naturalWidth < 160 || img.naturalHeight < 100) {
if(this.$route.query.type) this.masonry.remove(item);
}
};
} else if (img.naturalWidth < 160 || img.naturalHeight < 100) {
if(this.$route.query.type) this.masonry.remove(item);
}
}
});
}, 1250);
//
imagesLoaded(this.$refs.grid, () => {
this.masonry = new Masonry(this.$refs.grid, this.options);
this.albumLoading = false;
this.reInitGallery();
})
},
pageArticles() {
this.pagination.current = this.pagination.current + 1;
if(!this.$route.query.type){
this.getArticles();
} else {
try {
this.routerMap[this.$route.query.type]();
} catch (error) {
console.log(error);
this.$message({
message: "错误的路由!",
type: "error"
});
}
}
},
getWeb(){
// sourceHandle.ruleSearch(jmcomic,"").then((res)=>{
// let list = sourceHandle.selector(res,jmcomic.ruleSearch.bookList);
// console.log(list);
// list.toArray().forEach((item)=>{
// console.log(sourceHandle.getBookPreview(item,jmcomic.ruleSearch));
// });
// })
// sourceHandle.ruleBookInfo(jmcomic,"/album/439179/hana-bunny-raiden-shogun-starbucks-genshin-impact").then((res)=>{
// console.log(sourceHandle.getBookInfo(res,jmcomic.ruleBookInfo));
// })
// sourceHandle.ruleContent(jmcomic,"/photo/439179/").then((res)=>{
// let s = sourceHandle.getBookContent(res,jmcomic.ruleContent.content);
// console.log(s);
// $("#IFRAME").append(res);
// })
this.albumTitle = "网页图片加载中...";
return fetch('/api/scrape', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ url: this.$route.query.url || "https://www.roginx.ink/v/daily_picture.html" || "https://www.evacg.cc/" })
})
.then(response => response.text())
.then(html => {
html = html.replace(/<script.*?<\/script>/gs, '')// class
const doc = $(html);
let obj = [[],[]]
let images;
if(this.$route.query.selector){
obj[0] = sourceHandle.getAttr(doc,this.$route.query.selector);
obj[1] = obj[0];
} else {
images = doc.find("img").toArray();
obj[0] = images.map((image) => {
return image.getAttribute("data-src") || image.src;
});
obj[1] = images.map((image) => {
return image.alt;
});
}
this.albumTitle = $(html).filter('title').text();
this.albumPoster = obj[0][Math.floor(obj[0].length / 2)];
this.albumItems = obj;
setTimeout(() => {
this.checkPicture();
}, 1000);
return doc;
})
.catch(error => console.error(error));
},
getRandom(){
this.albumTitle = "网页图片加载中...";
let obj = [[],[]]
obj[0] = new Array(this.$route.query.num??20);
obj[1] = new Array(this.$route.query.num??20).fill("这是随机图片");
for(let index=0;index<obj[0].length;index++){
obj[0][index] = this.$route.query.api??this.$constant.ACGAPI[this.$route.query.cannel??0]+"?id="+index
}
this.albumTitle = "随机二次元图片";
this.albumPoster = this.$route.query.api??this.$constant.ACGAPI[this.$route.query.cannel??0];
this.albumItems = obj;
console.log(obj);
setTimeout(() => {
this.checkPicture();
}, 1000);
},
getAurora(){
this.albumTitle = "网页图片加载中...";
this.$http.get(`/aurora/get/work/pt/${this.$route.query.id}`)
.then((res) => {
if (!this.$common.isEmpty(res)) {
document.title = res.title;
this.albumTitle = res.title;
this.albumContent = res.content;
this.albumItems = JSON.parse(res.picture);
this.albumPoster = res.poster;
this.checkPicture();
this.$store.commit("pushPlaylist",res.content?.match(/playlist=(\d+)/)[1]);
}
})
.catch((error) => {
this.$message({
message: error.message,
type: "error"
});
});
},
getArticles() {
this.$http.get(`/aurora/search/works/pt?type=1&point=pt&start=${(this.pagination.current-1)*this.pagination.size}&num=${this.pagination.size}&keys=${this.pagination.searchKey}`)
.then((res) => {
if (!this.$common.isEmpty(res)) {
this.albumTitle = "图册集";
this.articles = this.articles.concat(res[0].filter(item=>{ return item.adm === 0}));
this.pagination.total = res[1].total;
let obj = [[],[]]
this.articles.forEach(article => {
obj[0].push(article.poster)
obj[1].push(article.title)
});
this.albumItems = obj;
this.checkPicture();
}
})
.catch((error) => {
this.$message({
message: error.message,
type: "error"
});
});
},
getDynamic() {
this.secret ? "": this.secret = prompt("请输入密码(可以猜一猜😀", "");
if(this.secret!="罗进兴") {
this.$message({
message: "密码错误啦!我将对你进行传送😆!",
type: "error"
});
setTimeout(() => {
window.location.href=`/album?type=aurora&id=196`
// window.location.href=`/album?type=aurora&id=${ Math.floor(Math.random() * 200) + 1}`
}, 3000);
return;
};
this.$http.post(this.$constant.baseURL + "/diary/listArticle", this.pagination)
.then((res) => {
if (!this.$common.isEmpty(res.data)) {
this.albumTitle = "动态相册";
this.articles = this.articles.concat(res.data.records);
this.pagination.total = res.data.total;
let obj = [[],[]]
this.articles.forEach(artcile => {
let items = JSON.parse(artcile.articleItems)
obj[0].push(...items[0])
obj[1].push(...items[1])
});
this.albumItems = obj;
this.checkPicture();
}
})
.catch((error) => {
this.$message({
message: error.message,
type: "error"
});
});
},
navigation(selector) {
let pageId = document.querySelector(selector);
window.scrollTo({
top: pageId.offsetTop,
behavior: "smooth"
});
},
getGuShi() {
let that = this;
let xhr = new XMLHttpRequest();
xhr.open('get', this.$constant.jinrishici);
xhr.onreadystatechange = function () {
if (xhr.readyState === 4) {
that.guShi = JSON.parse(xhr.responseText);
that.printerInfo = that.guShi.content;
}
};
xhr.send();
},
routerAurora(auroraId){
this.$router.push({ path: '/album', query: { ...this.$route.query,id:auroraId,type:'aurora' } })
// window.open(url)
}
}
}
</script>
<style>
.page-container-content{
background: var(--background);
padding: 25px 15px;
margin-top: -3px;
}
.page-container-content .aurora-content{
margin: auto;
max-width: 800px;
}
.grid{
display: flex;
flex-wrap: wrap;
margin-left: 10px;
background-color: var(--background);
animation: zoomIn 0.8s ease-in-out;
}
.grid.loadding .grid-item{
opacity: 0;
animation: zoomIn 0.8s ease-in-out;
}
.grid-item{
animation: zoomIn 0.8s ease-in-out;
display: block;
position: absolute;
width: calc(20% - 10px);
cursor: zoom-in;
margin-bottom: 12px;
min-width: 100px;
min-height: 80px;
overflow: hidden;
}
.grid-item-album{
background: none !important;
}
.grid-item-album span:hover{
color:var(--themeBackground);
transition: .3s;
}
.grid-item-album span {
transition: .3s;
cursor: pointer;
margin-top:6px;
margin-bottom: 15px;
line-height: 20px;
display: block;
color:var(--fontColor);
}
.grid-item .imgAlt{
cursor: pointer;
position: absolute;
width:100%;
height: 100%;
display: flex;
justify-content: center;
align-items: center;
text-align: center;
opacity: 0;
background-color: var(--mask);
color:white;
pointer-events:none;
transition: .3s;
}
.grid-item:hover .imgAlt{
opacity: 1;
transition: .3s;
}
.grid-item img{
background-color: var(--lightGray);
width: 100%;
height: 100%;
}
.grid-sizer{
width: 20%;
}
.grid-item--width2 { width: 160px; }
.grid-item--height2 { height: 140px; }
.signature-wall {
/* 向下排列 */
display: flex;
flex-direction: column;
position: relative;
user-select: none;
height: 100vh;
overflow: hidden;
}
.playful {
color: var(--white);
font-size: 40px;
}
.printer {
cursor: pointer;
color: var(--white);
background: var(--translucent);
border-radius: 10px;
padding-left: 10px;
padding-right: 10px;
}
#bannerWave1 {
height: 84px;
background: var(--bannerWave1);
position: absolute;
width: 200%;
bottom: 0;
z-index: 10;
animation: gradientBG 120s linear infinite;
}
#bannerWave2 {
height: 100px;
background: var(--bannerWave2);
position: absolute;
width: 400%;
bottom: 0;
z-index: 5;
animation: gradientBG 120s linear infinite;
}
/* 光标 */
.cursor {
margin-left: 1px;
animation: hideToShow 0.7s infinite;
font-weight: 200;
}
.el-icon-arrow-down {
font-size: 40px;
font-weight: bold;
color: var(--white);
position: absolute;
bottom: 60px;
animation: my-shake 1.5s ease-out infinite;
z-index: 15;
cursor: pointer;
}
.page-container-wrap {
background: var(--background);
position: relative;
transition: .5s;
}
.page-container {
display: flex;
justify-content: center;
width: 90%;
max-width: 1280px;
padding: 0 20px 40px 20px;
margin: 0 auto;
flex-direction: row;
}
.recent-posts {
width: 70%;
}
.announcement {
padding: 22px;
border: 1px dashed var(--lightGray);
color: var(--greyFont);
border-radius: 10px;
display: flex;
max-width: 780px;
margin: 40px auto 40px;
}
.announcement i {
color: var(--themeBackground);
font-size: 22px;
margin: auto 0;
animation: scale 0.8s ease-in-out infinite;
}
.announcement div div {
margin-left: 20px;
line-height: 30px;
}
.aside-content {
width: calc(30% - 40px);
user-select: none;
margin-top: 40px;
margin-right: 40px;
max-width: 300px;
float: right;
}
.pagination-wrap {
display: flex;
justify-content: center;
margin-top: 40px;
}
.pagination {
padding: 13px 15px;
border: 1px solid var(--lightGray);
border-radius: 3rem;
color: var(--greyFont);
width: 100px;
user-select: none;
cursor: pointer;
text-align: center;
}
.aside-content-myAside{
position: sticky;
top: 10px;
}
.pagination:hover {
border: 1px solid var(--themeBackground);
color: var(--themeBackground);
box-shadow: 0 0 5px var(--themeBackground);
}
@media screen and (max-width: 1100px) {
.recent-posts {
width: 100%;
}
.page-container {
width: 100%;
}
}
@media screen and (max-width: 1000px) {
.page-container {
/* 文章栏与侧标栏垂直排列 */
flex-direction: column;
}
.aside-content {
width: 100%;
max-width: unset;
float: unset;
margin: 40px auto 0;
}
}
@media screen and (max-width: 768px) {
.grid-item{
width: calc(50% - 10px);
}
.grid-sizer{
width: 50%;
}
h1 {
font-size: 35px;
}
}
</style>

File diff suppressed because it is too large Load Diff

@ -140,7 +140,6 @@ export default {
this.flag = false;
if(pageIndex-1>Math.ceil(this.anime.total / this.anime.limit)){ return;}
bangu_getCollection({subject_type:2,limit:num,offset:(pageIndex-1)*num},function(data){
console.log(data);
that.list.push(...data.data);
that.flag = true;
});

File diff suppressed because it is too large Load Diff

@ -1,409 +1,497 @@
<template>
<div class="shuoshuo-card">
<div class="shuoshuo-topper">
<img src="https://q1.qlogo.cn/g?b=qq&s=100&nk=983341575" alt="" class="shuoshuo-avatar">
<div class="shuoshuo-toptitle">
<span style="font-size:1.2em;color:var(--fontColor)">Janx</span>
<div class="shuoshuo-meta">
<span style="font-size:0.9em">{{source.createTime}}</span>
<span>
<svg viewBox="0 0 1024 1024" width="14" height="14" >
<path d="M14.656 512a497.344 497.344 0 1 0 994.688 0 497.344 497.344 0 1 0-994.688 0z"
fill="#FF0000"></path>
<path
d="M374.976 872.64c-48.299-100.032-22.592-157.44 14.421-211.37 40.448-58.966 51.115-117.611 51.115-117.611s31.659 41.386 19.115 106.005c56.149-62.72 66.816-162.133 58.325-200.405 127.317 88.746 181.59 281.002 108.181 423.381C1016 652.501 723.093 323.2 672.277 285.867c16.939 37.333 20.054 100.032-14.101 130.474-58.027-219.84-201.664-265.002-201.664-265.002 16.96 113.536-61.781 237.397-137.344 330.24-2.816-45.163-5.632-76.544-29.483-119.808-5.333 82.176-68.373 149.269-85.29 231.445-22.912 111.637 17.237 193.173 170.581 279.424z"
fill="#FFFFFF"></path>
</svg> {{source.articleEmotion}}
</span>
<span>
<svg viewBox="0 0 1024 1024" width="14" height="14" >
<path
d="M113.834667 291.84v449.194667a29.013333 29.013333 0 0 0 28.842666 29.013333h252.928v90.453333l160.597334-90.453333h252.928a29.013333 29.013333 0 0 0 29.013333-29.013333V291.84a29.013333 29.013333 0 0 0-29.013333-29.013333h-665.6a29.013333 29.013333 0 0 0-29.696 29.013333z"
fill="#FFDEAD"></path>
<path
d="M809.130667 262.826667h-665.6a29.013333 29.013333 0 0 0-28.842667 29.013333v40.106667a29.013333 29.013333 0 0 1 28.842667-29.013334h665.6a29.013333 29.013333 0 0 1 29.013333 29.013334V291.84a29.013333 29.013333 0 0 0-29.013333-29.013333z"
fill="#FFF3DB"></path>
<path
d="M556.202667 770.048h252.928a29.013333 29.013333 0 0 0 29.013333-29.013333V362.837333s-59.733333 392.533333-724.309333 314.709334v63.488a29.013333 29.013333 0 0 0 28.842666 29.013333h253.098667v90.453333z"
fill="#F2C182"></path>
<path
d="M619.008 632.32l101.888-35.157333-131.754667-76.117334 29.866667 111.274667zM891.904 148.992a61.44 61.44 0 0 0-84.138667 22.528l-19.968 34.133333 106.666667 61.610667 19.968-34.133333a61.781333 61.781333 0 0 0-22.528-84.138667z"
fill="#69BAF9"></path>
<path d="M775.338667 198.775467l131.669333 76.032-186.026667 322.218666-131.6864-76.032z"
fill="#F7FBFF"></path>
<path
d="M775.168 198.826667l-5.290667 9.216 59.221334 34.133333a34.133333 34.133333 0 0 1 12.458666 46.592l-139.946666 242.346667a34.133333 34.133333 0 0 1-46.762667 12.629333l-59.050667-34.133333-6.656 11.434666 88.746667 51.2L720.896 597.333333l186.026667-322.56z"
fill="#D8E3F0"></path>
<path
d="M616.448 622.592l2.56 9.728 101.888-35.157333-44.885333-25.941334-59.562667 51.370667zM891.904 148.992c-1.024 0-2.218667-0.853333-3.242667-1.536A61.610667 61.610667 0 0 1 887.466667 204.8l-19.968 34.133333-73.728-42.496-5.12 8.704 106.666666 61.610667 19.968-34.133333a61.781333 61.781333 0 0 0-23.381333-83.626667z"
fill="#599ED4"></path>
<path
d="M265.898667 417.621333H494.933333a17.066667 17.066667 0 1 0 0-34.133333H265.898667a17.066667 17.066667 0 1 0 0 34.133333zM265.898667 533.504H494.933333a17.066667 17.066667 0 0 0 0-34.133333H265.898667a17.066667 17.066667 0 0 0 0 34.133333z"
fill="#3D3D63"></path>
<path
d="M959.488 354.645333a99.84 99.84 0 0 0-23.722667-127.488 78.677333 78.677333 0 0 0-142.848-64.170666l-11.605333 20.138666a17.066667 17.066667 0 0 0-20.821333 7.168l-32.085334 55.466667H142.677333a46.250667 46.250667 0 0 0-45.909333 46.08v449.194667a46.08 46.08 0 0 0 45.909333 46.08h236.032v73.386666a17.066667 17.066667 0 0 0 8.362667 14.848 17.066667 17.066667 0 0 0 8.704 2.218667 17.066667 17.066667 0 0 0 8.362667-2.218667l156.672-88.234666h248.32a46.08 46.08 0 0 0 46.08-46.08V398.677333L921.6 283.306667a17.066667 17.066667 0 0 0-4.266667-21.504l1.877334-3.413334a65.365333 65.365333 0 0 1 10.410666 79.189334l-53.077333 91.989333a56.832 56.832 0 0 0 20.821333 77.653333 17.066667 17.066667 0 0 0 24.234667-6.314666 17.066667 17.066667 0 0 0-6.997333-23.04 23.04 23.04 0 0 1-8.362667-31.061334z m-138.410667 386.389334a11.946667 11.946667 0 0 1-11.946666 11.946666H556.202667a17.066667 17.066667 0 0 0-8.362667 2.218667l-134.997333 76.117333v-61.269333a17.066667 17.066667 0 0 0-17.066667-17.066667H142.677333a11.946667 11.946667 0 0 1-11.776-11.946666V291.84a11.946667 11.946667 0 0 1 11.776-11.946667h565.930667L574.464 512a17.066667 17.066667 0 0 0-1.706667 12.970667L597.333333 615.253333H265.898667a17.066667 17.066667 0 1 0 0 34.133334h352.938666a17.066667 17.066667 0 0 0 5.802667 0l102.4-35.328a17.066667 17.066667 0 0 0 9.216-7.509334l85.333333-147.968z m-204.8-184.661334l63.829334 36.864-49.322667 17.066667z m206.848-170.666666v1.365333l-108.373333 186.709333-102.4-59.050666L781.482667 221.866667l102.4 59.050666z m76.458667-161.28L887.466667 244.224l-76.970667-44.373333 11.264-19.797334a44.544 44.544 0 1 1 77.141333 44.544z"
fill="#3D3D63"></path>
</svg> {{source.likeCount}} 条评论
</span>
</div>
</div>
</div>
<div class="shuoshuo-container" v-html="source.articleContent">
</div>
<div class="shuoshuo-piclist" ref="imgList" :class="picClassname">
<!-- v-viewer.rebuild="{inline: false,'url': 'data-source',images:picList[0]}" -->
<a :href="item" v-for="item,index in picList[0]" v-show="(index<9)?true:false" :key="item"
:overtip="`+ ${picList[0].length-9}`"
:data-sub-html="picList[1][index]||'Have a good life!'"
data-fb-html='这里可以写些东西呢'
>
<div class="imgbox">
<img :click="clickPicture" :title="picList[1][index]" class="lazyload_images" :data-source="item" :src="item+'-poster'" alt="">
</div>
</a>
</div>
<div class="shuoshuo-tailer">
<span style="font-size:0.9em;line-height: 1.5em;">{{source.articleAddress}}</span>
<span style="font-size:0.9em;line-height: 1.5em;">{{source.articleDevice}}</span>
</div>
</div>
</template>
<script>
// const graffiti = () => import( "./graffiti");
const proPage = () => import( "../common/proPage");
import MarkdownIt from 'markdown-it';
// import 'lightgallery.js'
// import 'lg-thumbnail.js'
export default {
components: {
},
props: {
source: {
type: Number
},
userId: {
type: Number
}
},
data() {
return {
isGraffiti: false,
total: 0,
replyDialogVisible: false,
floorComment: {},
replyComment: {},
comments: [],
picList:[],
picClassname:"",
pagination: {
current: 1,
size: 10,
total: 0,
source: this.source,
floorCommentId: null
}
};
},
computed: {},
created() {
// this.getComments(this.pagination);
// this.getTotal();
this.checkPicList();
},
mounted() {
new lightGallery(this.$refs.imgList,{
plugins: [lgThumbnail,lgHash,lgRotate,lgVideo,lgZoom,lgFullscreen,lgAutoplay,lgComment],
mode: 'lg-slide',
cssEasing: 'ease',
commentBox: true,
fbComments: true,
galleryId:this.source.id,
speed: 300
});
},
methods: {
toPage(page) {
this.pagination.current = page;
window.scrollTo({
top: document.getElementById('comment-content').offsetTop
});
// this.getComments(this.pagination);
},
getTotal() {
this.$http.get(this.$constant.baseURL + "/comment/getCommentCount", {source: this.source})
.then((res) => {
if (!this.$common.isEmpty(res.data)) {
this.total = res.data;
}
})
.catch((error) => {
this.$message({
message: error.message,
type: "error"
});
});
},
toChildPage(floorComment) {
floorComment.childComments.current += 1;
let pagination = {
current: floorComment.childComments.current,
size: 5,
total: 0,
source: this.source,
floorCommentId: floorComment.id
}
// this.getComments(pagination, floorComment, true);
},
emoji(comments, flag) {
comments.forEach(c => {
c.commentContent = c.commentContent.replace(/\n/g, '<br/>');
c.commentContent = this.$common.faceReg(c.commentContent);
c.commentContent = this.$common.pictureReg(c.commentContent);
if (flag) {
if (!this.$common.isEmpty(c.childComments) && !this.$common.isEmpty(c.childComments.records)) {
c.childComments.records.forEach(cc => {
c.commentContent = c.commentContent.replace(/\n/g, '<br/>');
cc.commentContent = this.$common.faceReg(cc.commentContent);
cc.commentContent = this.$common.pictureReg(cc.commentContent);
});
}
}
});
},
// getComments(pagination, floorComment = {}, isToPage = false) {
// this.$http.post(this.$constant.baseURL + "/comment/listComment", pagination)
// .then((res) => {
// if (!this.$common.isEmpty(res.data) && !this.$common.isEmpty(res.data.records)) {
// if (this.$common.isEmpty(floorComment)) {
// this.comments = res.data.records;
// pagination.total = res.data.total;
// this.emoji(this.comments, true);
// } else {
// if (isToPage === false) {
// floorComment.childComments = res.data;
// } else {
// floorComment.childComments.total = res.data.total;
// floorComment.childComments.records = floorComment.childComments.records.concat(res.data.records);
// }
// this.emoji(floorComment.childComments.records, false);
// }
// }
// })
// .catch((error) => {
// this.$message({
// message: error.message,
// type: "error"
// });
// });
// },
addGraffitiComment(graffitiComment) {
this.submitComment(graffitiComment);
},
submitComment(commentContent) {
let comment = {
source: this.source,
commentContent: commentContent
};
this.$http.post(this.$constant.baseURL + "/comment/saveComment", comment)
.then((res) => {
this.$message({
type: 'success',
message: '保存成功!'
});
this.pagination = {
current: 1,
size: 10,
total: 0,
source: this.source,
floorCommentId: null
}
// this.getComments(this.pagination);
this.getTotal();
})
.catch((error) => {
this.$message({
message: error.message,
type: "error"
});
});
},
submitReply(commentContent) {
let comment = {
source: this.source,
floorCommentId: this.floorComment.id,
commentContent: commentContent,
parentCommentId: this.replyComment.id,
parentUserId: this.replyComment.userId
};
let floorComment = this.floorComment;
this.$http.post(this.$constant.baseURL + "/comment/saveComment", comment)
.then((res) => {
let pagination = {
current: 1,
size: 5,
total: 0,
source: this.source,
floorCommentId: floorComment.id
}
// this.getComments(pagination, floorComment);
this.getTotal();
})
.catch((error) => {
this.$message({
message: error.message,
type: "error"
});
});
this.handleClose();
},
replyDialog(comment, floorComment) {
this.replyComment = comment;
this.floorComment = floorComment;
this.replyDialogVisible = true;
},
handleClose() {
this.replyDialogVisible = false;
this.floorComment = {};
this.replyComment = {};
},
checkPicList(){
this.picList = JSON.parse(this.source.articleItems);
let classname = ["","pic1","pic2","pic3"];
if(this.picList[0].length<3)
this.picClassname = classname[this.picList[0].length]
else
this.picClassname = classname[3]
if(this.picList[0].length>9){ this.picClassname = classname[3] + " pic-overload"}
},
clickPicture(e){
//viewer
const viewer = this.$el.querySelector('.images').$viewer
//show
viewer.show()
}
}
}
</script>
<style scoped>
.shuoshuo-card{
display: flex;
flex-direction: column;
padding: 15px;
box-sizing: border-box;
box-shadow: 1px 1px 5px #66666655;
max-width: 720px;
animation-name: zoomIn;
margin:20px auto 20px auto;
border-radius: .5em;
}
.shuoshuo-topper{
display: flex;
flex-direction: row;
}
.shuoshuo-topper .shuoshuo-avatar{
width:64px;
height:64px;
}
.shuoshuo-container{
margin-top: .6em;
margin-bottom: .2em;
}
.shuoshuo-toptitle{
margin-left: 10px;
display: flex;
flex-direction: column;
justify-content: flex-end;
}
.shuoshuo-piclist{
width: 100%;
position: relative;
user-select: none;
margin:5px 0 5px 0;
}
.shuoshuo-piclist a {
list-style: none;
cursor: zoom-in;
}
.shuoshuo-piclist img{
width:100%;
margin: auto;
}
.pic1 a img{
max-height: 520px;
max-width: 100%;
width: unset;
}
.pic2 {
display: flex;
flex-direction: row;
flex-wrap: wrap;
width: 100%;
}
.pic2 a{
flex:1;
margin: 2px;
}
.pic3{
display: flex;
flex-direction: row;
flex-wrap: wrap;
width: 100%;
}
.pic3 a{
width:33.33%;
padding: 1px;
position: relative;
}
.pic3 .imgbox{
position: relative;
overflow: hidden;
padding-bottom: 56.25%;/*重要属性*/
}
.pic3 .imgbox img{
width: 100%;
position: absolute;
height: 100%;
object-fit: cover;
}
.pic3.pic-overload a:nth-child(9)::after {
content: attr(overtip);
display: flex;
font-size: 2.5em;
position: absolute;
justify-content: center;
align-items: center;
width: 100%;
color: #FFF;
height: 100%;
top: 0;
pointer-events: none;
background: #00000088;
}
.shuoshuo-meta{
display: flex;
flex-direction: row;
}
.shuoshuo-meta span{
margin-right: .8em;
}
.shuoshuo-topper span,.shuoshuo-tailer span{
display:block;
color:var(--greyFont);
}
@media screen and (max-width: 768px) {
.pic3 .imgbox{
position: relative;
overflow: hidden;
padding-bottom: 100%;/*重要属性*/
}
}
</style>
<template>
<div>
<div class="shuoshuo-card-noAccess" v-if="!access">
<font class="noAccess-font">你没有访问权限请尝试登录</font>
<input type="password" v-model="input_password" @input="access = Access()" placeholder="或许可以通过密码访问呢?" class="noAccess-password" >
</div>
<div class="shuoshuo-card" v-if="access">
<div class="shuoshuo-topper">
<img src="https://q1.qlogo.cn/g?b=qq&s=100&nk=983341575" alt="" class="shuoshuo-avatar">
<div class="shuoshuo-toptitle">
<span style="font-size:1.2em;color:var(--fontColor)">Janx</span>
<div class="shuoshuo-meta">
<span style="font-size:0.9em">{{source.createTime}}</span>
<span>
<svg viewBox="0 0 1024 1024" width="14" height="14" >
<path d="M14.656 512a497.344 497.344 0 1 0 994.688 0 497.344 497.344 0 1 0-994.688 0z"
fill="#FF0000"></path>
<path
d="M374.976 872.64c-48.299-100.032-22.592-157.44 14.421-211.37 40.448-58.966 51.115-117.611 51.115-117.611s31.659 41.386 19.115 106.005c56.149-62.72 66.816-162.133 58.325-200.405 127.317 88.746 181.59 281.002 108.181 423.381C1016 652.501 723.093 323.2 672.277 285.867c16.939 37.333 20.054 100.032-14.101 130.474-58.027-219.84-201.664-265.002-201.664-265.002 16.96 113.536-61.781 237.397-137.344 330.24-2.816-45.163-5.632-76.544-29.483-119.808-5.333 82.176-68.373 149.269-85.29 231.445-22.912 111.637 17.237 193.173 170.581 279.424z"
fill="#FFFFFF"></path>
</svg> {{source.articleEmotion}}
</span>
<span>
<svg viewBox="0 0 1024 1024" width="14" height="14" >
<path
d="M113.834667 291.84v449.194667a29.013333 29.013333 0 0 0 28.842666 29.013333h252.928v90.453333l160.597334-90.453333h252.928a29.013333 29.013333 0 0 0 29.013333-29.013333V291.84a29.013333 29.013333 0 0 0-29.013333-29.013333h-665.6a29.013333 29.013333 0 0 0-29.696 29.013333z"
fill="#FFDEAD"></path>
<path
d="M809.130667 262.826667h-665.6a29.013333 29.013333 0 0 0-28.842667 29.013333v40.106667a29.013333 29.013333 0 0 1 28.842667-29.013334h665.6a29.013333 29.013333 0 0 1 29.013333 29.013334V291.84a29.013333 29.013333 0 0 0-29.013333-29.013333z"
fill="#FFF3DB"></path>
<path
d="M556.202667 770.048h252.928a29.013333 29.013333 0 0 0 29.013333-29.013333V362.837333s-59.733333 392.533333-724.309333 314.709334v63.488a29.013333 29.013333 0 0 0 28.842666 29.013333h253.098667v90.453333z"
fill="#F2C182"></path>
<path
d="M619.008 632.32l101.888-35.157333-131.754667-76.117334 29.866667 111.274667zM891.904 148.992a61.44 61.44 0 0 0-84.138667 22.528l-19.968 34.133333 106.666667 61.610667 19.968-34.133333a61.781333 61.781333 0 0 0-22.528-84.138667z"
fill="#69BAF9"></path>
<path d="M775.338667 198.775467l131.669333 76.032-186.026667 322.218666-131.6864-76.032z"
fill="#F7FBFF"></path>
<path
d="M775.168 198.826667l-5.290667 9.216 59.221334 34.133333a34.133333 34.133333 0 0 1 12.458666 46.592l-139.946666 242.346667a34.133333 34.133333 0 0 1-46.762667 12.629333l-59.050667-34.133333-6.656 11.434666 88.746667 51.2L720.896 597.333333l186.026667-322.56z"
fill="#D8E3F0"></path>
<path
d="M616.448 622.592l2.56 9.728 101.888-35.157333-44.885333-25.941334-59.562667 51.370667zM891.904 148.992c-1.024 0-2.218667-0.853333-3.242667-1.536A61.610667 61.610667 0 0 1 887.466667 204.8l-19.968 34.133333-73.728-42.496-5.12 8.704 106.666666 61.610667 19.968-34.133333a61.781333 61.781333 0 0 0-23.381333-83.626667z"
fill="#599ED4"></path>
<path
d="M265.898667 417.621333H494.933333a17.066667 17.066667 0 1 0 0-34.133333H265.898667a17.066667 17.066667 0 1 0 0 34.133333zM265.898667 533.504H494.933333a17.066667 17.066667 0 0 0 0-34.133333H265.898667a17.066667 17.066667 0 0 0 0 34.133333z"
fill="#3D3D63"></path>
<path
d="M959.488 354.645333a99.84 99.84 0 0 0-23.722667-127.488 78.677333 78.677333 0 0 0-142.848-64.170666l-11.605333 20.138666a17.066667 17.066667 0 0 0-20.821333 7.168l-32.085334 55.466667H142.677333a46.250667 46.250667 0 0 0-45.909333 46.08v449.194667a46.08 46.08 0 0 0 45.909333 46.08h236.032v73.386666a17.066667 17.066667 0 0 0 8.362667 14.848 17.066667 17.066667 0 0 0 8.704 2.218667 17.066667 17.066667 0 0 0 8.362667-2.218667l156.672-88.234666h248.32a46.08 46.08 0 0 0 46.08-46.08V398.677333L921.6 283.306667a17.066667 17.066667 0 0 0-4.266667-21.504l1.877334-3.413334a65.365333 65.365333 0 0 1 10.410666 79.189334l-53.077333 91.989333a56.832 56.832 0 0 0 20.821333 77.653333 17.066667 17.066667 0 0 0 24.234667-6.314666 17.066667 17.066667 0 0 0-6.997333-23.04 23.04 23.04 0 0 1-8.362667-31.061334z m-138.410667 386.389334a11.946667 11.946667 0 0 1-11.946666 11.946666H556.202667a17.066667 17.066667 0 0 0-8.362667 2.218667l-134.997333 76.117333v-61.269333a17.066667 17.066667 0 0 0-17.066667-17.066667H142.677333a11.946667 11.946667 0 0 1-11.776-11.946666V291.84a11.946667 11.946667 0 0 1 11.776-11.946667h565.930667L574.464 512a17.066667 17.066667 0 0 0-1.706667 12.970667L597.333333 615.253333H265.898667a17.066667 17.066667 0 1 0 0 34.133334h352.938666a17.066667 17.066667 0 0 0 5.802667 0l102.4-35.328a17.066667 17.066667 0 0 0 9.216-7.509334l85.333333-147.968z m-204.8-184.661334l63.829334 36.864-49.322667 17.066667z m206.848-170.666666v1.365333l-108.373333 186.709333-102.4-59.050666L781.482667 221.866667l102.4 59.050666z m76.458667-161.28L887.466667 244.224l-76.970667-44.373333 11.264-19.797334a44.544 44.544 0 1 1 77.141333 44.544z"
fill="#3D3D63"></path>
</svg> {{source.likeCount}} 条评论
</span>
</div>
</div>
</div>
<div class="shuoshuo-container" v-html="source.articleContent">
</div>
<div class="shuoshuo-piclist" ref="imgList" :class="picClassname">
<!-- v-viewer.rebuild="{inline: false,'url': 'data-source',images:picList[0]}" -->
<a :href="item" target="_blank" v-for="item,index in picList[0]" v-show="(index<9)?true:false" :key="item"
:overtip="`+ ${picList[0].length-9}`"
:data-sub-html="picList[1][index]||'该图片没有图注呢'"
data-fb-html='是否需要添加评论功能呢?'
>
<div class="imgbox">
<img :click="clickPicture" target="_blank" :title="picList[1][index]" class="lazyload_images" :data-source="item.indexOf('qiniu.roginx.ink')!=-1?item+'-normal':item" :src="item.indexOf('qiniu.roginx.ink')!=-1?item+'-poster':item" alt="">
</div>
</a>
</div>
<div class="shuoshuo-tailer">
<span style="font-size:0.9em;line-height: 1.5em;">{{source.articleAddress}}</span>
<span style="font-size:0.9em;line-height: 1.5em;">{{source.articleDevice}}</span>
</div>
</div>
</div>
</template>
<script>
// const graffiti = () => import( "./graffiti");
const proPage = () => import( "../common/proPage");
import MarkdownIt from 'markdown-it';
// import 'lightgallery.js'
// import 'lg-thumbnail.js'
export default {
components: {
},
props: {
source: {
type: Number
},
userId: {
type: Number
}
},
data() {
return {
isGraffiti: false,
total: 0,
replyDialogVisible: false,
input_password:'',
access:this.Access(),
floorComment: {},
replyComment: {},
comments: [],
picList:[],
picClassname:"",
pagination: {
current: 1,
size: 10,
total: 0,
source: this.source,
floorCommentId: null
}
};
},
computed: {},
created() {
// this.getComments(this.pagination);
// this.getTotal();
this.checkPicList();
},
mounted() {
new lightGallery(this.$refs.imgList,{
plugins: [lgThumbnail,lgHash,lgRotate,lgVideo,lgZoom,lgFullscreen,lgAutoplay,lgComment],
mode: 'lg-slide',
cssEasing: 'ease',
commentBox: true,
fbComments: true,
galleryId:this.source.id,
speed: 300
});
},
methods: {
toPage(page) {
this.pagination.current = page;
window.scrollTo({
top: document.getElementById('comment-content').offsetTop
});
// this.getComments(this.pagination);
},
getTotal() {
this.$http.get(this.$constant.baseURL + "/comment/getCommentCount", {source: this.source})
.then((res) => {
if (!this.$common.isEmpty(res.data)) {
this.total = res.data;
}
})
.catch((error) => {
this.$message({
message: error.message,
type: "error"
});
});
},
toChildPage(floorComment) {
floorComment.childComments.current += 1;
let pagination = {
current: floorComment.childComments.current,
size: 5,
total: 0,
source: this.source,
floorCommentId: floorComment.id
}
// this.getComments(pagination, floorComment, true);
},
emoji(comments, flag) {
comments.forEach(c => {
c.commentContent = c.commentContent.replace(/\n/g, '<br/>');
c.commentContent = this.$common.faceReg(c.commentContent);
c.commentContent = this.$common.pictureReg(c.commentContent);
if (flag) {
if (!this.$common.isEmpty(c.childComments) && !this.$common.isEmpty(c.childComments.records)) {
c.childComments.records.forEach(cc => {
c.commentContent = c.commentContent.replace(/\n/g, '<br/>');
cc.commentContent = this.$common.faceReg(cc.commentContent);
cc.commentContent = this.$common.pictureReg(cc.commentContent);
});
}
}
});
},
// getComments(pagination, floorComment = {}, isToPage = false) {
// this.$http.post(this.$constant.baseURL + "/comment/listComment", pagination)
// .then((res) => {
// if (!this.$common.isEmpty(res.data) && !this.$common.isEmpty(res.data.records)) {
// if (this.$common.isEmpty(floorComment)) {
// this.comments = res.data.records;
// pagination.total = res.data.total;
// this.emoji(this.comments, true);
// } else {
// if (isToPage === false) {
// floorComment.childComments = res.data;
// } else {
// floorComment.childComments.total = res.data.total;
// floorComment.childComments.records = floorComment.childComments.records.concat(res.data.records);
// }
// this.emoji(floorComment.childComments.records, false);
// }
// }
// })
// .catch((error) => {
// this.$message({
// message: error.message,
// type: "error"
// });
// });
// },
addGraffitiComment(graffitiComment) {
this.submitComment(graffitiComment);
},
submitComment(commentContent) {
let comment = {
source: this.source,
commentContent: commentContent
};
this.$http.post(this.$constant.baseURL + "/comment/saveComment", comment)
.then((res) => {
this.$message({
type: 'success',
message: '保存成功!'
});
this.pagination = {
current: 1,
size: 10,
total: 0,
source: this.source,
floorCommentId: null
}
// this.getComments(this.pagination);
this.getTotal();
})
.catch((error) => {
this.$message({
message: error.message,
type: "error"
});
});
},
submitReply(commentContent) {
let comment = {
source: this.source,
floorCommentId: this.floorComment.id,
commentContent: commentContent,
parentCommentId: this.replyComment.id,
parentUserId: this.replyComment.userId
};
let floorComment = this.floorComment;
this.$http.post(this.$constant.baseURL + "/comment/saveComment", comment)
.then((res) => {
let pagination = {
current: 1,
size: 5,
total: 0,
source: this.source,
floorCommentId: floorComment.id
}
// this.getComments(pagination, floorComment);
this.getTotal();
})
.catch((error) => {
this.$message({
message: error.message,
type: "error"
});
});
this.handleClose();
},
replyDialog(comment, floorComment) {
this.replyComment = comment;
this.floorComment = floorComment;
this.replyDialogVisible = true;
},
handleClose() {
this.replyDialogVisible = false;
this.floorComment = {};
this.replyComment = {};
},
checkPicList(){
this.picList = JSON.parse(this.source.articleItems);
let classname = ["","pic1","pic2","pic3"];
if(this.picList[0].length<3)
this.picClassname = classname[this.picList[0].length]
else
this.picClassname = classname[3]
if(this.picList[0].length>9){ this.picClassname = classname[3] + " pic-overload"}
},
clickPicture(e){
//viewer
const viewer = this.$el.querySelector('.images').$viewer
//show
viewer.show()
},
Access(){
if(this.$store.state.currentUser?.id == 1) return true;
if(this.source.permission == 0 ) return true;
if(this.input_password==this.source.password&&this.source.password!="") return true
if(this.source.permission == 1 && !this.$common.isEmpty(this.$store.state.currentUser)) return true;
if(this.source.permission == 2 && this.input_password==this.source.password) return true;
return false;
}
}
}
</script>
<style scoped>
.shuoshuo-card-noAccess{
position: relative;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
padding: 15px;
box-sizing: border-box;
box-shadow: 1px 1px 5px #66666655;
max-width: 720px;
height: 300px;
animation-name: zoomIn;
margin:20px auto 20px auto;
border-radius: .5em;
background-color: var(--themeBackground);
}
.noAccess-font{
text-align: center;
width: 200px;
font-size: 16px;
line-height: 24px;
color:#FFF
}
.noAccess-password:placeholder-shown {
letter-spacing: 2px;
color: #FFF;
font-size: 12px;
font-family: SmileySans;
}
.noAccess-password:focus{
border-bottom: solid 2px #FFF;
transition: .3s;
}
.noAccess-password{
transition: .3s;
width: 200px;
font-size: 16px;
margin: 16px 0;
padding: 8px 0;
border:none;
border-bottom: solid 1px #ffffffbe;
letter-spacing: 8px;
text-align: center;
color: #FFF;
outline: none;
background: transparent;
z-index: 1;
}
.shuoshuo-card{
position: relative;
display: flex;
flex-direction: column;
padding: 15px;
box-sizing: border-box;
box-shadow: 1px 1px 5px #66666655;
max-width: 720px;
animation-name: zoomIn;
margin:20px auto 20px auto;
border-radius: .5em;
}
.permission-mask{
position: absolute;
width: 100%;
height: 100%;
z-index: 99999999999;
background-color: #FFF;
}
.shuoshuo-topper{
display: flex;
flex-direction: row;
}
.shuoshuo-topper .shuoshuo-avatar{
width:64px;
height:64px;
}
.shuoshuo-container{
margin-top: .6em;
margin-bottom: .2em;
letter-spacing: 1px;
line-height: 1.2em;
}
.shuoshuo-toptitle{
margin-left: 10px;
display: flex;
flex-direction: column;
justify-content: flex-end;
}
.shuoshuo-piclist{
width: 100%;
position: relative;
user-select: none;
margin:5px 0 5px 0;
}
.shuoshuo-piclist a {
list-style: none;
cursor: zoom-in;
}
.shuoshuo-piclist img{
width:100%;
margin: auto;
}
.pic1 a img{
max-height: 520px;
max-width: 100%;
width: unset;
}
.pic2 {
display: flex;
flex-direction: row;
flex-wrap: wrap;
width: 100%;
}
.pic2 a{
flex:1;
margin: 2px;
}
.pic3{
display: flex;
flex-direction: row;
flex-wrap: wrap;
width: 100%;
}
.pic3 a{
width:33.33%;
padding: 1px;
position: relative;
}
.pic3 .imgbox{
position: relative;
overflow: hidden;
padding-bottom: 75%;/*重要属性*/
}
>>> p:has( > iframe:only-child),p:has( > video:only-child){
position: relative;
width: 100%;
height: 0;
padding-bottom: 56.25%;
}
>>> p:has( > iframe:only-child) iframe, p:has( > video:only-child) video{
position: absolute;
top: 0;
left: 0;
width: 100%;
border: none;
height: 100%;
}
.pic3 .imgbox img{
width: 100%;
position: absolute;
height: 100%;
object-fit: cover;
}
.pic3.pic-overload a:nth-child(9)::after {
content: attr(overtip);
display: flex;
font-size: 2.5em;
position: absolute;
justify-content: center;
align-items: center;
width: 100%;
color: #FFF;
height: 100%;
top: 0;
pointer-events: none;
background: #00000088;
}
.shuoshuo-meta{
display: flex;
flex-direction: row;
}
.shuoshuo-meta span{
margin-right: .8em;
}
.shuoshuo-topper span,.shuoshuo-tailer span{
display:block;
color:var(--greyFont);
}
@media screen and (max-width: 768px) {
.pic3 .imgbox{
position: relative;
overflow: hidden;
padding-bottom: 100%;/*重要属性*/
}
}
</style>

@ -1,115 +1,115 @@
<template>
<div class="poem-container myCenter my-animation-hideToShow"
v-if="!$common.isEmpty(guShi.origin) || !$common.isEmpty(hitokoto.hitokoto)">
<!-- 背景图片 -->
<el-image class="my-el-image poem-image "
style="position: absolute;margin-top: -50px"
v-once
:src="$constant.random_backImage_miaomc+Math.floor(Math.random()*100)"
fit="cover">
<div slot="error" class="image-slot"></div>
</el-image>
<div class="poem-wrap">
<div><span>{{isHitokoto?hitokoto.from:guShi.origin}}</span></div>
<p class="poem">{{isHitokoto?hitokoto.hitokoto:guShi.content}}</p>
<p class="info" v-if="!isHitokoto || (isHitokoto && !$common.isEmpty(hitokoto.from_who))">
{{isHitokoto?hitokoto.from_who:guShi.author}}
</p>
</div>
</div>
</template>
<script>
export default {
props: {
isHitokoto: {
type: Boolean,
default: true
}
},
data() {
return {
guShi: {
"content": "...",
"origin": "...",
"author": "...",
"category": "..."
},
hitokoto: {
"hitokoto": "...",
"from": "...",
"from_who": "..."
}
};
},
created() {
if (this.isHitokoto) {
this.getHitokoto();
} else {
this.getGuShi();
}
},
methods: {
getGuShi() {
let that = this;
let xhr = new XMLHttpRequest();
xhr.open('get', this.$constant.jinrishici);
xhr.onreadystatechange = function () {
if (xhr.readyState === 4) {
that.guShi = JSON.parse(xhr.responseText);
}
};
xhr.send();
},
getHitokoto() {
let that = this;
let xhr = new XMLHttpRequest();
xhr.open('get', this.$constant.hitokoto);
xhr.onreadystatechange = function () {
if (xhr.readyState === 4) {
that.hitokoto = JSON.parse(xhr.responseText);
}
}
xhr.send();
}
}
};
</script>
<style scoped>
.poem-container {
padding: 90px 0 40px;
position: relative;
}
.poem-wrap {
border-radius: 10px;
z-index: 10;
text-align: center;
letter-spacing: 4px;
font-weight: 300;
width: 60%;
}
.poem-wrap div span {
padding: 5px 40px;
color: var(--white);
font-size: 1.8em;
border-radius: 5px;
}
.poem-wrap p {
width: 70%;
color: var(--white);
}
.poem-wrap p.poem {
margin: 40px auto;
font-size: 1.5em;
}
.poem-wrap p.info {
margin: 20px auto;
font-size: 1.1em;
}
</style>
<template>
<div class="poem-container myCenter my-animation-hideToShow"
v-if="!$common.isEmpty(guShi.origin) || !$common.isEmpty(hitokoto.hitokoto)">
<!-- 背景图片 -->
<el-image class="my-el-image poem-image "
style="position: absolute;margin-top: -50px"
v-once
:src="$constant.random_backImage_miaomc+'?id='+Math.floor(Math.random()*100)"
fit="cover">
<div slot="error" class="image-slot"></div>
</el-image>
<div class="poem-wrap">
<div><span>{{isHitokoto?hitokoto.from:guShi.origin}}</span></div>
<p class="poem">{{isHitokoto?hitokoto.hitokoto:guShi.content}}</p>
<p class="info" v-if="!isHitokoto || (isHitokoto && !$common.isEmpty(hitokoto.from_who))">
{{isHitokoto?hitokoto.from_who:guShi.author}}
</p>
</div>
</div>
</template>
<script>
export default {
props: {
isHitokoto: {
type: Boolean,
default: true
}
},
data() {
return {
guShi: {
"content": "...",
"origin": "...",
"author": "...",
"category": "..."
},
hitokoto: {
"hitokoto": "...",
"from": "...",
"from_who": "..."
}
};
},
created() {
if (this.isHitokoto) {
this.getHitokoto();
} else {
this.getGuShi();
}
},
methods: {
getGuShi() {
let that = this;
let xhr = new XMLHttpRequest();
xhr.open('get', this.$constant.jinrishici);
xhr.onreadystatechange = function () {
if (xhr.readyState === 4) {
that.guShi = JSON.parse(xhr.responseText);
}
};
xhr.send();
},
getHitokoto() {
let that = this;
let xhr = new XMLHttpRequest();
xhr.open('get', this.$constant.hitokoto);
xhr.onreadystatechange = function () {
if (xhr.readyState === 4) {
that.hitokoto = JSON.parse(xhr.responseText);
}
}
xhr.send();
}
}
};
</script>
<style scoped>
.poem-container {
padding: 90px 0 40px;
position: relative;
}
.poem-wrap {
border-radius: 10px;
z-index: 10;
text-align: center;
letter-spacing: 4px;
font-weight: 300;
width: 60%;
}
.poem-wrap div span {
padding: 5px 40px;
color: var(--white);
font-size: 1.8em;
border-radius: 5px;
}
.poem-wrap p {
width: 70%;
color: var(--white);
}
.poem-wrap p.poem {
margin: 40px auto;
font-size: 1.5em;
}
.poem-wrap p.info {
margin: 20px auto;
font-size: 1.1em;
}
</style>

@ -1,375 +1,375 @@
<template>
<div>
<el-image style="animation: header-effect 2s"
class="background-image"
v-once
:src="$constant.random_backImage_miaomc+Math.floor(Math.random()*100)"
fit="cover">
<div slot="error" class="image-slot background-image-error"></div>
</el-image>
<!-- 封面 -->
<div class="friend-head myCenter">
<h1 style="color: var(--white);z-index: 10;font-weight: 700;font-size: 45px">友人帐</h1>
</div>
<div class="friend-wrap">
<div class="friend-main">
<!-- 添加友链 -->
<div @click="clickLetter()" class="form-wrap">
<!-- 信封上面 -->
<img class="before-img" :src="$constant.friendLetterTop" style="width: 100%"/>
<!-- -->
<div class="envelope" style="animation: hideToShow 2s">
<div class="form-main">
<img :src="$constant.friendLetterMiddle" style="width: 100%"/>
<div>
<h3 style="text-align: center">有朋自远方来</h3>
<div>
<div class="myCenter form-friend">
<div class="user-title">
<div>名称</div>
<div>简介</div>
<div>封面</div>
<div>网址</div>
</div>
<div class="user-content">
<div>
<el-input v-model="friend.title"></el-input>
</div>
<div>
<el-input v-model="friend.introduction"></el-input>
</div>
<div>
<el-input v-model="friend.cover"></el-input>
</div>
<div>
<el-input v-model="friend.url"></el-input>
</div>
</div>
</div>
<div class="myCenter" style="margin-top: 20px">
<proButton :info="'提交'"
@click.native.stop="submitFriend()"
:before="$constant.before_color_2"
:after="$constant.after_color_2">
</proButton>
</div>
</div>
<div>
<img :src="$constant.friendLetterBiLi" style="width: 100%;margin: 5px auto"/>
</div>
<p style="font-size: 12px;text-align: center;color: #999">欢迎交换友链</p>
</div>
</div>
</div>
<img class="after-img" :src="$constant.friendLetterBottom" style="width: 100%"/>
</div>
<hr>
<h2>🥇友情链接</h2>
<card :resourcePathList="friendList" @clickResourcePath="clickFriend"></card>
</div>
</div>
<!-- 页脚 -->
<myFooter></myFooter>
</div>
</template>
<script>
const myFooter = () => import( "./common/myFooter");
const card = () => import( "./common/card");
const proButton = () => import( "./common/proButton");
export default {
components: {
myFooter,
card,
proButton
},
data() {
return {
pagination: {
current: 1,
size: 9999,
desc: false,
resourceType: "friendUrl"
},
friendList: [],
friend: {
title: "",
introduction: "",
cover: "",
url: ""
}
}
},
computed: {},
watch: {},
created() {
this.getFriends();
},
mounted() {
},
methods: {
clickLetter() {
if (document.body.clientWidth < 700) {
$(".form-wrap").css({"height": "1000px", "top": "-200px"});
} else {
$(".form-wrap").css({"height": "1150px", "top": "-200px"});
}
},
submitFriend() {
if (this.$common.isEmpty(this.$store.state.currentUser)) {
this.$message({
message: "请先登录!",
type: "error"
});
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",
});
return;
}
if (this.friend.introduction.trim() === "") {
this.$message({
message: "你还没写简介呢~",
type: "warning",
});
return;
}
if (this.friend.cover.trim() === "") {
this.$message({
message: "你还没设置封面呢~",
type: "warning",
});
return;
}
if (this.friend.url.trim() === "") {
this.$message({
message: "你还没写网址呢~",
type: "warning",
});
return;
}
this.$http.post(this.$constant.baseURL + "/webInfo/saveFriend", this.friend)
.then((res) => {
$(".form-wrap").css({"height": "447px", "top": "0"});
this.$message({
type: 'success',
message: '提交成功,待管理员审核!'
});
})
.catch((error) => {
this.$message({
message: error.message,
type: "error"
});
});
},
clickFriend(path) {
window.open(path);
},
getFriends() {
this.$http.post(this.$constant.baseURL + "/webInfo/listResourcePath", this.pagination)
.then((res) => {
if (!this.$common.isEmpty(res.data)) {
this.friendList = res.data.records;
}
})
.catch((error) => {
this.$message({
message: error.message,
type: "error"
});
});
}
}
}
</script>
<style scoped>
.friend-head {
height: 300px;
position: relative;
}
.friend-head::before {
position: absolute;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, .3);
content: '';
}
.friend-main {
max-width: 1200px;
margin: 40px auto;
border-radius: 10px;
padding: 40px;
background: rgba(255, 255, 255, .85);
}
.friend-main h2 {
font-size: 20px;
}
hr {
position: relative;
margin: 40px auto;
border: 2px dashed var(--lightGreen);
overflow: visible;
}
hr:before {
position: absolute;
top: -14px;
left: 5%;
color: var(--lightGreen);
content: '❄';
font-size: 30px;
line-height: 1;
transition: all 1s ease-in-out;
}
hr:hover:before {
left: calc(95% - 20px);
}
.form-wrap {
margin: 0 auto;
overflow: hidden;
width: 530px;
height: 447px;
position: relative;
top: 0;
transition: all 1s ease-in-out .3s;
z-index: 0;
cursor: pointer;
}
.before-img {
position: absolute;
bottom: 126px;
left: 0;
background-repeat: no-repeat;
width: 530px;
height: 317px;
z-index: -100;
}
.after-img {
position: absolute;
bottom: -2px;
left: 0;
background-repeat: no-repeat;
width: 530px;
height: 259px;
z-index: 100;
}
.friend-wrap {
padding: 0 20px;
color: var(--black);
}
.envelope {
position: relative;
margin: 0 auto;
transition: all 1s ease-in-out .3s;
padding: 200px 20px 20px;
}
.form-main {
background: var(--white);
margin: 0 auto;
border-radius: 10px;
overflow: hidden;
}
.user-title {
text-align: right;
user-select: none;
}
.user-content {
text-align: left;
}
.user-title div {
height: 55px;
line-height: 55px;
text-align: center;
}
.user-content > div {
height: 55px;
display: flex;
align-items: center;
}
.user-content >>> .el-input__inner {
border: none;
height: 35px;
background: var(--whiteMask);
}
.form-friend {
margin-top: 12px;
background-color: #eee;
border: #ddd 1px solid;
padding: 20px 0;
}
@media screen and (max-width: 700px) {
.form-wrap {
width: auto;
}
.before-img {
width: auto;
}
.after-img {
width: auto;
}
}
@media screen and (max-width: 500px) {
.friend-main {
padding: 40px 15px;
}
.friend-wrap {
padding: 0 10px
}
}
</style>
<template>
<div>
<el-image style="animation: header-effect 2s"
class="background-image"
v-once
:src="$constant.random_backImage_miaomc"
fit="cover">
<div slot="error" class="image-slot background-image-error"></div>
</el-image>
<!-- 封面 -->
<div class="friend-head myCenter">
<h1 style="color: var(--white);z-index: 10;font-weight: 700;font-size: 45px">友人帐</h1>
</div>
<div class="friend-wrap">
<div class="friend-main">
<!-- 添加友链 -->
<div @click="clickLetter()" class="form-wrap">
<!-- 信封上面 -->
<img class="before-img" :src="$constant.friendLetterTop" style="width: 100%"/>
<!-- -->
<div class="envelope" style="animation: hideToShow 2s">
<div class="form-main">
<img :src="$constant.friendLetterMiddle" style="width: 100%"/>
<div>
<h3 style="text-align: center">有朋自远方来</h3>
<div>
<div class="myCenter form-friend">
<div class="user-title">
<div>名称</div>
<div>简介</div>
<div>封面</div>
<div>网址</div>
</div>
<div class="user-content">
<div>
<el-input v-model="friend.title"></el-input>
</div>
<div>
<el-input v-model="friend.introduction"></el-input>
</div>
<div>
<el-input v-model="friend.cover"></el-input>
</div>
<div>
<el-input v-model="friend.url"></el-input>
</div>
</div>
</div>
<div class="myCenter" style="margin-top: 20px">
<proButton :info="'提交'"
@click.native.stop="submitFriend()"
:before="$constant.before_color_2"
:after="$constant.after_color_2">
</proButton>
</div>
</div>
<div>
<img :src="$constant.friendLetterBiLi" style="width: 100%;margin: 5px auto"/>
</div>
<p style="font-size: 12px;text-align: center;color: #999">欢迎交换友链</p>
</div>
</div>
</div>
<img class="after-img" :src="$constant.friendLetterBottom" style="width: 100%"/>
</div>
<hr>
<h2>🥇友情链接</h2>
<card :resourcePathList="friendList" @clickResourcePath="clickFriend"></card>
</div>
</div>
<!-- 页脚 -->
<myFooter></myFooter>
</div>
</template>
<script>
const myFooter = () => import( "./common/myFooter");
const card = () => import( "./common/card");
const proButton = () => import( "./common/proButton");
export default {
components: {
myFooter,
card,
proButton
},
data() {
return {
pagination: {
current: 1,
size: 9999,
desc: false,
resourceType: "friendUrl"
},
friendList: [],
friend: {
title: "",
introduction: "",
cover: "",
url: ""
}
}
},
computed: {},
watch: {},
created() {
this.getFriends();
},
mounted() {
},
methods: {
clickLetter() {
if (document.body.clientWidth < 700) {
$(".form-wrap").css({"height": "1000px", "top": "-200px"});
} else {
$(".form-wrap").css({"height": "1150px", "top": "-200px"});
}
},
submitFriend() {
if (this.$common.isEmpty(this.$store.state.currentUser)) {
this.$message({
message: "请先登录!",
type: "error"
});
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",
});
return;
}
if (this.friend.introduction.trim() === "") {
this.$message({
message: "你还没写简介呢~",
type: "warning",
});
return;
}
if (this.friend.cover.trim() === "") {
this.$message({
message: "你还没设置封面呢~",
type: "warning",
});
return;
}
if (this.friend.url.trim() === "") {
this.$message({
message: "你还没写网址呢~",
type: "warning",
});
return;
}
this.$http.post(this.$constant.baseURL + "/webInfo/saveFriend", this.friend)
.then((res) => {
$(".form-wrap").css({"height": "447px", "top": "0"});
this.$message({
type: 'success',
message: '提交成功,待管理员审核!'
});
})
.catch((error) => {
this.$message({
message: error.message,
type: "error"
});
});
},
clickFriend(path) {
window.open(path);
},
getFriends() {
this.$http.post(this.$constant.baseURL + "/webInfo/listResourcePath", this.pagination)
.then((res) => {
if (!this.$common.isEmpty(res.data)) {
this.friendList = res.data.records;
}
})
.catch((error) => {
this.$message({
message: error.message,
type: "error"
});
});
}
}
}
</script>
<style scoped>
.friend-head {
height: 300px;
position: relative;
}
.friend-head::before {
position: absolute;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, .3);
content: '';
}
.friend-main {
max-width: 1200px;
margin: 40px auto;
border-radius: 10px;
padding: 40px;
background: rgba(255, 255, 255, .85);
}
.friend-main h2 {
font-size: 20px;
}
hr {
position: relative;
margin: 40px auto;
border: 2px dashed var(--lightGreen);
overflow: visible;
}
hr:before {
position: absolute;
top: -14px;
left: 5%;
color: var(--lightGreen);
content: '❄';
font-size: 30px;
line-height: 1;
transition: all 1s ease-in-out;
}
hr:hover:before {
left: calc(95% - 20px);
}
.form-wrap {
margin: 0 auto;
overflow: hidden;
width: 530px;
height: 447px;
position: relative;
top: 0;
transition: all 1s ease-in-out .3s;
z-index: 0;
cursor: pointer;
}
.before-img {
position: absolute;
bottom: 126px;
left: 0;
background-repeat: no-repeat;
width: 530px;
height: 317px;
z-index: -100;
}
.after-img {
position: absolute;
bottom: -2px;
left: 0;
background-repeat: no-repeat;
width: 530px;
height: 259px;
z-index: 100;
}
.friend-wrap {
padding: 0 20px;
color: var(--black);
}
.envelope {
position: relative;
margin: 0 auto;
transition: all 1s ease-in-out .3s;
padding: 200px 20px 20px;
}
.form-main {
background: var(--white);
margin: 0 auto;
border-radius: 10px;
overflow: hidden;
}
.user-title {
text-align: right;
user-select: none;
}
.user-content {
text-align: left;
}
.user-title div {
height: 55px;
line-height: 55px;
text-align: center;
}
.user-content > div {
height: 55px;
display: flex;
align-items: center;
}
.user-content >>> .el-input__inner {
border: none;
height: 35px;
background: var(--whiteMask);
}
.form-friend {
margin-top: 12px;
background-color: #eee;
border: #ddd 1px solid;
padding: 20px 0;
}
@media screen and (max-width: 700px) {
.form-wrap {
width: auto;
}
.before-img {
width: auto;
}
.after-img {
width: auto;
}
}
@media screen and (max-width: 500px) {
.friend-main {
padding: 40px 15px;
}
.friend-wrap {
padding: 0 10px
}
}
</style>

File diff suppressed because it is too large Load Diff

@ -1,411 +1,410 @@
<template>
<div>
<loader :loading="loading">
<!-- 加载页面 -->
<template slot="loader">
<div>
<zombie></zombie>
</div>
</template>
<!-- 内容页面 -->
<template slot="body">
<!-- 首页图片 -->
<el-image style="animation: header-effect 2s"
class="background-image"
v-once
:src="!$common.isEmpty($store.state.webInfo.backgroundImage)?$store.state.webInfo.backgroundImage:$constant.random_image+new Date()+Math.floor(Math.random()*10)"
fit="cover">
<div slot="error" class="image-slot background-image-error"></div>
</el-image>
<!-- 首页文字 -->
<div class="signature-wall myCenter my-animation-hideToShow">
<h1 class="playful">
<span v-for="(a, index) in $store.state.webInfo.webTitle" :key="index">{{a}}</span>
</h1>
<div class="printer" @click="getGuShi()">
<printer :printerInfo="printerInfo">
<template slot="paper" slot-scope="scope">
<h3>
{{ scope.content }}<span class="cursor">|</span>
</h3>
</template>
</printer>
</div>
<div id="bannerWave1"></div>
<div id="bannerWave2"></div>
<i class="el-icon-arrow-down" @click="navigation('.page-container-wrap')"></i>
</div>
<!-- 首页内容 -->
<div class="page-container-wrap">
<div class="page-container">
<div class="aside-content" v-if="showAside">
<myAside class="aside-content-myAside"></myAside>
</div>
<div class="recent-posts">
<div class="announcement background-opacity">
<i class="fa fa-volume-up" aria-hidden="true"></i>
<div>
<div v-for="(notice, index) in $store.state.webInfo.notices" :key="index">
{{ notice }}
</div>
</div>
</div>
<articleList :articleList="articles"></articleList>
<div class="pagination-wrap">
<div @click="pageArticles()" class="pagination" v-if="pagination.total !== articles.length">
下一页
</div>
<div v-else style="user-select: none">
~~到底啦~~
</div>
</div>
</div>
</div>
</div>
<!-- 页脚 -->
<div style="background: var(--background)">
<myFooter></myFooter>
</div>
</template>
</loader>
</div>
</template>
<script>
const loader = () => import( "./common/loader");
const zombie = () => import( "./common/zombie");
const printer = () => import( "./common/printer");
const articleList = () => import( "./articleList");
const myFooter = () => import( "./common/myFooter");
const myAside = () => import( "./myAside");
export default {
components: {
loader,
zombie,
printer,
articleList,
myFooter,
myAside
},
data() {
return {
loading: false,
showAside: true,
printerInfo: "你看对面的青山多漂亮",
pagination: {
current: 1,
size: 10,
total: 0,
searchKey: "玩客云"
},
guShi: {
"content": "",
"origin": "",
"author": "",
"category": ""
},
articles: []
};
},
created() {
this.getGuShi();
// this.getArticles();
},
mounted() {
// this.$store.commit("changePlaylist", 7463646845)
},
watch: {
//
"$route.query.searchKey": {
immediate: true,
handler() {
this.articles = [];
this.pagination.searchKey = this.$route.query.searchKey;
this.getArticles();
},
},
},
methods: {
pageArticles() {
this.pagination.current = this.pagination.current + 1;
this.getArticles();
},
getArticles() {
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);
this.pagination.total = res.data.total;
}
})
.catch((error) => {
this.$message({
message: error.message,
type: "error"
});
});
},
navigation(selector) {
let pageId = document.querySelector(selector);
window.scrollTo({
top: pageId.offsetTop,
behavior: "smooth"
});
},
getGuShi() {
let that = this;
let xhr = new XMLHttpRequest();
xhr.open('get', this.$constant.jinrishici);
xhr.onreadystatechange = function () {
if (xhr.readyState === 4) {
that.guShi = JSON.parse(xhr.responseText);
that.printerInfo = that.guShi.content;
}
};
xhr.send();
}
}
}
</script>
<style scoped>
.signature-wall {
/* 向下排列 */
display: flex;
flex-direction: column;
position: relative;
user-select: none;
height: 100vh;
overflow: hidden;
}
.playful {
color: var(--white);
font-size: 40px;
}
/*.playful span {*/
/* position: relative;*/
/* color: #5362f6;*/
/* text-shadow: 0.25px 0.25px #e485f8, 0.5px 0.5px #e485f8, 0.75px 0.75px #e485f8,*/
/* 1px 1px #e485f8, 1.25px 1.25px #e485f8, 1.5px 1.5px #e485f8, 1.75px 1.75px #e485f8,*/
/* 2px 2px #e485f8, 2.25px 2.25px #e485f8, 2.5px 2.5px #e485f8, 2.75px 2.75px #e485f8,*/
/* 3px 3px #e485f8, 3.25px 3.25px #e485f8, 3.5px 3.5px #e485f8, 3.75px 3.75px #e485f8,*/
/* 4px 4px #e485f8, 4.25px 4.25px #e485f8, 4.5px 4.5px #e485f8, 4.75px 4.75px #e485f8,*/
/* 5px 5px #e485f8, 5.25px 5.25px #e485f8, 5.5px 5.5px #e485f8, 5.75px 5.75px #e485f8,*/
/* 6px 6px #e485f8;*/
/* animation: scatter 1.75s infinite;*/
/* font-weight: normal;*/
/*}*/
/*.playful span:nth-child(2n) {*/
/* color: #ed625c;*/
/* text-shadow: 0.25px 0.25px #f2a063, 0.5px 0.5px #f2a063, 0.75px 0.75px #f2a063,*/
/* 1px 1px #f2a063, 1.25px 1.25px #f2a063, 1.5px 1.5px #f2a063, 1.75px 1.75px #f2a063,*/
/* 2px 2px #f2a063, 2.25px 2.25px #f2a063, 2.5px 2.5px #f2a063, 2.75px 2.75px #f2a063,*/
/* 3px 3px #f2a063, 3.25px 3.25px #f2a063, 3.5px 3.5px #f2a063, 3.75px 3.75px #f2a063,*/
/* 4px 4px #f2a063, 4.25px 4.25px #f2a063, 4.5px 4.5px #f2a063, 4.75px 4.75px #f2a063,*/
/* 5px 5px #f2a063, 5.25px 5.25px #f2a063, 5.5px 5.5px #f2a063, 5.75px 5.75px #f2a063,*/
/* 6px 6px #f2a063;*/
/* animation-delay: 0.3s;*/
/*}*/
/*.playful span:nth-child(3n) {*/
/* color: #ffd913;*/
/* text-shadow: 0.25px 0.25px #6ec0a9, 0.5px 0.5px #6ec0a9, 0.75px 0.75px #6ec0a9,*/
/* 1px 1px #6ec0a9, 1.25px 1.25px #6ec0a9, 1.5px 1.5px #6ec0a9, 1.75px 1.75px #6ec0a9,*/
/* 2px 2px #6ec0a9, 2.25px 2.25px #6ec0a9, 2.5px 2.5px #6ec0a9, 2.75px 2.75px #6ec0a9,*/
/* 3px 3px #6ec0a9, 3.25px 3.25px #6ec0a9, 3.5px 3.5px #6ec0a9, 3.75px 3.75px #6ec0a9,*/
/* 4px 4px #6ec0a9, 4.25px 4.25px #6ec0a9, 4.5px 4.5px #6ec0a9, 4.75px 4.75px #6ec0a9,*/
/* 5px 5px #6ec0a9, 5.25px 5.25px #6ec0a9, 5.5px 5.5px #6ec0a9, 5.75px 5.75px #6ec0a9,*/
/* 6px 6px #6ec0a9;*/
/* animation-delay: 0.15s;*/
/*}*/
/*.playful span:nth-child(5n) {*/
/* color: #555bff;*/
/* text-shadow: 0.25px 0.25px #e485f8, 0.5px 0.5px #e485f8, 0.75px 0.75px #e485f8,*/
/* 1px 1px #e485f8, 1.25px 1.25px #e485f8, 1.5px 1.5px #e485f8, 1.75px 1.75px #e485f8,*/
/* 2px 2px #e485f8, 2.25px 2.25px #e485f8, 2.5px 2.5px #e485f8, 2.75px 2.75px #e485f8,*/
/* 3px 3px #e485f8, 3.25px 3.25px #e485f8, 3.5px 3.5px #e485f8, 3.75px 3.75px #e485f8,*/
/* 4px 4px #e485f8, 4.25px 4.25px #e485f8, 4.5px 4.5px #e485f8, 4.75px 4.75px #e485f8,*/
/* 5px 5px #e485f8, 5.25px 5.25px #e485f8, 5.5px 5.5px #e485f8, 5.75px 5.75px #e485f8,*/
/* 6px 6px #e485f8;*/
/* animation-delay: 0.4s;*/
/*}*/
/*.playful span:nth-child(7n) {*/
/* color: #ff9c55;*/
/* text-shadow: 0.25px 0.25px #ff5555, 0.5px 0.5px #ff5555, 0.75px 0.75px #ff5555,*/
/* 1px 1px #ff5555, 1.25px 1.25px #ff5555, 1.5px 1.5px #ff5555, 1.75px 1.75px #ff5555,*/
/* 2px 2px #ff5555, 2.25px 2.25px #ff5555, 2.5px 2.5px #ff5555, 2.75px 2.75px #ff5555,*/
/* 3px 3px #ff5555, 3.25px 3.25px #ff5555, 3.5px 3.5px #ff5555, 3.75px 3.75px #ff5555,*/
/* 4px 4px #ff5555, 4.25px 4.25px #ff5555, 4.5px 4.5px #ff5555, 4.75px 4.75px #ff5555,*/
/* 5px 5px #ff5555, 5.25px 5.25px #ff5555, 5.5px 5.5px #ff5555, 5.75px 5.75px #ff5555,*/
/* 6px 6px #ff5555;*/
/* animation-delay: 0.25s;*/
/*}*/
.printer {
cursor: pointer;
color: var(--white);
background: var(--translucent);
border-radius: 10px;
padding-left: 10px;
padding-right: 10px;
}
#bannerWave1 {
height: 84px;
background: var(--bannerWave1);
position: absolute;
width: 200%;
bottom: 0;
z-index: 10;
animation: gradientBG 120s linear infinite;
}
#bannerWave2 {
height: 100px;
background: var(--bannerWave2);
position: absolute;
width: 400%;
bottom: 0;
z-index: 5;
animation: gradientBG 120s linear infinite;
}
/* 光标 */
.cursor {
margin-left: 1px;
animation: hideToShow 0.7s infinite;
font-weight: 200;
}
.el-icon-arrow-down {
font-size: 40px;
font-weight: bold;
color: var(--white);
position: absolute;
bottom: 60px;
animation: my-shake 1.5s ease-out infinite;
z-index: 15;
cursor: pointer;
}
.page-container-wrap {
background: var(--background);
position: relative;
transition: .5s;
}
.page-container {
display: flex;
justify-content: center;
width: 90%;
max-width: 1280px;
padding: 0 20px 40px 20px;
margin: 0 auto;
flex-direction: row;
}
.recent-posts {
width: 70%;
}
.announcement {
padding: 22px;
border: 1px dashed var(--lightGray);
color: var(--greyFont);
border-radius: 10px;
display: flex;
max-width: 780px;
margin: 40px auto 40px;
}
.announcement i {
color: var(--themeBackground);
font-size: 22px;
margin: auto 0;
animation: scale 0.8s ease-in-out infinite;
}
.announcement div div {
margin-left: 20px;
line-height: 30px;
}
.aside-content {
width: calc(30% - 40px);
user-select: none;
margin-top: 40px;
margin-right: 40px;
max-width: 300px;
float: right;
}
.pagination-wrap {
display: flex;
justify-content: center;
margin-top: 40px;
}
.pagination {
padding: 13px 15px;
border: 1px solid var(--lightGray);
border-radius: 3rem;
color: var(--greyFont);
width: 100px;
user-select: none;
cursor: pointer;
text-align: center;
}
.aside-content-myAside{
position: sticky;
top: 10px;
}
.pagination:hover {
border: 1px solid var(--themeBackground);
color: var(--themeBackground);
box-shadow: 0 0 5px var(--themeBackground);
}
@media screen and (max-width: 1100px) {
.recent-posts {
width: 100%;
}
.page-container {
width: 100%;
}
}
@media screen and (max-width: 1000px) {
.page-container {
/* 文章栏与侧标栏垂直排列 */
flex-direction: column;
}
.aside-content {
width: 100%;
max-width: unset;
float: unset;
margin: 40px auto 0;
}
}
@media screen and (max-width: 768px) {
h1 {
font-size: 35px;
}
}
</style>
<template>
<div>
<loader :loading="loading">
<!-- 加载页面 -->
<template slot="loader">
<div>
<zombie></zombie>
</div>
</template>
<!-- 内容页面 -->
<template slot="body">
<!-- 首页图片 -->
<el-image style="animation: header-effect 2s"
class="background-image"
:src="$store.state.webInfo.backgroundImage?$store.state.webInfo.backgroundImage:$constant.two_poem_image[0]"
fit="cover">
<div slot="error" class="image-slot background-image-error"></div>
</el-image>
<!-- 首页文字 -->
<div class="signature-wall myCenter my-animation-hideToShow">
<h1 class="playful">
<span v-for="(a, index) in $store.state.webInfo.webTitle" :key="index">{{a}}</span>
</h1>
<div class="printer" @click="getGuShi()">
<printer :printerInfo="printerInfo">
<template slot="paper" slot-scope="scope">
<h3>
{{ scope.content }}<span class="cursor">|</span>
</h3>
</template>
</printer>
</div>
<div id="bannerWave1"></div>
<div id="bannerWave2"></div>
<i class="el-icon-arrow-down" @click="navigation('.page-container-wrap')"></i>
</div>
<!-- 首页内容 -->
<div class="page-container-wrap">
<div class="page-container">
<div class="aside-content" v-if="showAside">
<myAside class="aside-content-myAside"></myAside>
</div>
<div class="recent-posts">
<div class="announcement background-opacity">
<i class="fa fa-volume-up" aria-hidden="true"></i>
<div>
<div v-for="(notice, index) in $store.state.webInfo.notices" :key="index">
{{ notice }}
</div>
</div>
</div>
<articleList :articleList="articles"></articleList>
<div class="pagination-wrap">
<div @click="pageArticles()" class="pagination" v-if="pagination.total !== articles.length">
下一页
</div>
<div v-else style="user-select: none">
~~到底啦~~
</div>
</div>
</div>
</div>
</div>
<!-- 页脚 -->
<div style="background: var(--background)">
<myFooter></myFooter>
</div>
</template>
</loader>
</div>
</template>
<script>
const loader = () => import( "./common/loader");
const zombie = () => import( "./common/zombie");
const printer = () => import( "./common/printer");
const articleList = () => import( "./articleList");
const myFooter = () => import( "./common/myFooter");
const myAside = () => import( "./myAside");
export default {
components: {
loader,
zombie,
printer,
articleList,
myFooter,
myAside
},
data() {
return {
loading: false,
showAside: true,
printerInfo: "你看对面的青山多漂亮",
pagination: {
current: 1,
size: 10,
total: 0,
searchKey: "玩客云"
},
guShi: {
"content": "",
"origin": "",
"author": "",
"category": ""
},
articles: []
};
},
created() {
this.getGuShi();
// this.getArticles();
},
mounted() {
},
watch: {
//
"$route.query.searchKey": {
immediate: true,
handler() {
this.articles = [];
this.pagination.searchKey = this.$route.query.searchKey;
this.getArticles();
},
},
},
methods: {
pageArticles() {
this.pagination.current = this.pagination.current + 1;
this.getArticles();
},
getArticles() {
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);
this.pagination.total = res.data.total;
}
})
.catch((error) => {
this.$message({
message: error.message,
type: "error"
});
});
},
navigation(selector) {
let pageId = document.querySelector(selector);
window.scrollTo({
top: pageId.offsetTop,
behavior: "smooth"
});
},
getGuShi() {
let that = this;
let xhr = new XMLHttpRequest();
xhr.open('get', this.$constant.jinrishici);
xhr.onreadystatechange = function () {
if (xhr.readyState === 4) {
that.guShi = JSON.parse(xhr.responseText);
that.printerInfo = that.guShi.content;
}
};
xhr.send();
}
}
}
</script>
<style scoped>
.signature-wall {
/* 向下排列 */
display: flex;
flex-direction: column;
position: relative;
user-select: none;
height: 100vh;
overflow: hidden;
}
.playful {
color: var(--white);
font-size: 40px;
}
/*.playful span {*/
/* position: relative;*/
/* color: #5362f6;*/
/* text-shadow: 0.25px 0.25px #e485f8, 0.5px 0.5px #e485f8, 0.75px 0.75px #e485f8,*/
/* 1px 1px #e485f8, 1.25px 1.25px #e485f8, 1.5px 1.5px #e485f8, 1.75px 1.75px #e485f8,*/
/* 2px 2px #e485f8, 2.25px 2.25px #e485f8, 2.5px 2.5px #e485f8, 2.75px 2.75px #e485f8,*/
/* 3px 3px #e485f8, 3.25px 3.25px #e485f8, 3.5px 3.5px #e485f8, 3.75px 3.75px #e485f8,*/
/* 4px 4px #e485f8, 4.25px 4.25px #e485f8, 4.5px 4.5px #e485f8, 4.75px 4.75px #e485f8,*/
/* 5px 5px #e485f8, 5.25px 5.25px #e485f8, 5.5px 5.5px #e485f8, 5.75px 5.75px #e485f8,*/
/* 6px 6px #e485f8;*/
/* animation: scatter 1.75s infinite;*/
/* font-weight: normal;*/
/*}*/
/*.playful span:nth-child(2n) {*/
/* color: #ed625c;*/
/* text-shadow: 0.25px 0.25px #f2a063, 0.5px 0.5px #f2a063, 0.75px 0.75px #f2a063,*/
/* 1px 1px #f2a063, 1.25px 1.25px #f2a063, 1.5px 1.5px #f2a063, 1.75px 1.75px #f2a063,*/
/* 2px 2px #f2a063, 2.25px 2.25px #f2a063, 2.5px 2.5px #f2a063, 2.75px 2.75px #f2a063,*/
/* 3px 3px #f2a063, 3.25px 3.25px #f2a063, 3.5px 3.5px #f2a063, 3.75px 3.75px #f2a063,*/
/* 4px 4px #f2a063, 4.25px 4.25px #f2a063, 4.5px 4.5px #f2a063, 4.75px 4.75px #f2a063,*/
/* 5px 5px #f2a063, 5.25px 5.25px #f2a063, 5.5px 5.5px #f2a063, 5.75px 5.75px #f2a063,*/
/* 6px 6px #f2a063;*/
/* animation-delay: 0.3s;*/
/*}*/
/*.playful span:nth-child(3n) {*/
/* color: #ffd913;*/
/* text-shadow: 0.25px 0.25px #6ec0a9, 0.5px 0.5px #6ec0a9, 0.75px 0.75px #6ec0a9,*/
/* 1px 1px #6ec0a9, 1.25px 1.25px #6ec0a9, 1.5px 1.5px #6ec0a9, 1.75px 1.75px #6ec0a9,*/
/* 2px 2px #6ec0a9, 2.25px 2.25px #6ec0a9, 2.5px 2.5px #6ec0a9, 2.75px 2.75px #6ec0a9,*/
/* 3px 3px #6ec0a9, 3.25px 3.25px #6ec0a9, 3.5px 3.5px #6ec0a9, 3.75px 3.75px #6ec0a9,*/
/* 4px 4px #6ec0a9, 4.25px 4.25px #6ec0a9, 4.5px 4.5px #6ec0a9, 4.75px 4.75px #6ec0a9,*/
/* 5px 5px #6ec0a9, 5.25px 5.25px #6ec0a9, 5.5px 5.5px #6ec0a9, 5.75px 5.75px #6ec0a9,*/
/* 6px 6px #6ec0a9;*/
/* animation-delay: 0.15s;*/
/*}*/
/*.playful span:nth-child(5n) {*/
/* color: #555bff;*/
/* text-shadow: 0.25px 0.25px #e485f8, 0.5px 0.5px #e485f8, 0.75px 0.75px #e485f8,*/
/* 1px 1px #e485f8, 1.25px 1.25px #e485f8, 1.5px 1.5px #e485f8, 1.75px 1.75px #e485f8,*/
/* 2px 2px #e485f8, 2.25px 2.25px #e485f8, 2.5px 2.5px #e485f8, 2.75px 2.75px #e485f8,*/
/* 3px 3px #e485f8, 3.25px 3.25px #e485f8, 3.5px 3.5px #e485f8, 3.75px 3.75px #e485f8,*/
/* 4px 4px #e485f8, 4.25px 4.25px #e485f8, 4.5px 4.5px #e485f8, 4.75px 4.75px #e485f8,*/
/* 5px 5px #e485f8, 5.25px 5.25px #e485f8, 5.5px 5.5px #e485f8, 5.75px 5.75px #e485f8,*/
/* 6px 6px #e485f8;*/
/* animation-delay: 0.4s;*/
/*}*/
/*.playful span:nth-child(7n) {*/
/* color: #ff9c55;*/
/* text-shadow: 0.25px 0.25px #ff5555, 0.5px 0.5px #ff5555, 0.75px 0.75px #ff5555,*/
/* 1px 1px #ff5555, 1.25px 1.25px #ff5555, 1.5px 1.5px #ff5555, 1.75px 1.75px #ff5555,*/
/* 2px 2px #ff5555, 2.25px 2.25px #ff5555, 2.5px 2.5px #ff5555, 2.75px 2.75px #ff5555,*/
/* 3px 3px #ff5555, 3.25px 3.25px #ff5555, 3.5px 3.5px #ff5555, 3.75px 3.75px #ff5555,*/
/* 4px 4px #ff5555, 4.25px 4.25px #ff5555, 4.5px 4.5px #ff5555, 4.75px 4.75px #ff5555,*/
/* 5px 5px #ff5555, 5.25px 5.25px #ff5555, 5.5px 5.5px #ff5555, 5.75px 5.75px #ff5555,*/
/* 6px 6px #ff5555;*/
/* animation-delay: 0.25s;*/
/*}*/
.printer {
cursor: pointer;
color: var(--white);
background: var(--translucent);
border-radius: 10px;
padding-left: 10px;
padding-right: 10px;
}
#bannerWave1 {
height: 84px;
background: var(--bannerWave1);
position: absolute;
width: 200%;
bottom: 0;
z-index: 10;
animation: gradientBG 120s linear infinite;
}
#bannerWave2 {
height: 100px;
background: var(--bannerWave2);
position: absolute;
width: 400%;
bottom: 0;
z-index: 5;
animation: gradientBG 120s linear infinite;
}
/* 光标 */
.cursor {
margin-left: 1px;
animation: hideToShow 0.7s infinite;
font-weight: 200;
}
.el-icon-arrow-down {
font-size: 40px;
font-weight: bold;
color: var(--white);
position: absolute;
bottom: 60px;
animation: my-shake 1.5s ease-out infinite;
z-index: 15;
cursor: pointer;
}
.page-container-wrap {
background: var(--background);
position: relative;
transition: .5s;
}
.page-container {
display: flex;
justify-content: center;
width: 90%;
max-width: 1280px;
padding: 0 14px 40px 14px;
margin: 0 auto;
flex-direction: row;
}
.recent-posts {
width: 70%;
}
.announcement {
padding: 22px;
border: 1px dashed var(--lightGray);
color: var(--greyFont);
border-radius: 10px;
display: flex;
max-width: 780px;
margin: 40px auto 40px;
}
.announcement i {
color: var(--themeBackground);
font-size: 22px;
margin: auto 0;
animation: scale 0.8s ease-in-out infinite;
}
.announcement div div {
margin-left: 20px;
line-height: 30px;
}
.aside-content {
width: calc(30% - 40px);
user-select: none;
margin-top: 40px;
margin-right: 40px;
max-width: 300px;
float: right;
}
.pagination-wrap {
display: flex;
justify-content: center;
margin-top: 40px;
}
.pagination {
padding: 13px 15px;
border: 1px solid var(--lightGray);
border-radius: 3rem;
color: var(--greyFont);
width: 100px;
user-select: none;
cursor: pointer;
text-align: center;
}
.aside-content-myAside{
position: sticky;
top: 10px;
}
.pagination:hover {
border: 1px solid var(--themeBackground);
color: var(--themeBackground);
box-shadow: 0 0 5px var(--themeBackground);
}
@media screen and (max-width: 1100px) {
.recent-posts {
width: 100%;
}
.page-container {
width: 100%;
}
}
@media screen and (max-width: 1000px) {
.page-container {
/* 文章栏与侧标栏垂直排列 */
flex-direction: column;
}
.aside-content {
width: 100%;
max-width: unset;
float: unset;
margin: 40px auto 0;
}
}
@media screen and (max-width: 768px) {
h1 {
font-size: 35px;
}
}
</style>

@ -1,406 +1,429 @@
<template>
<div>
<loader :loading="loading">
<!-- 加载页面 -->
<template slot="loader">
<div>
<zombie></zombie>
</div>
</template>
<!-- 内容页面 -->
<template slot="body">
<!-- 首页图片 -->
<el-image style="animation: header-effect 2s"
class="background-image"
v-once
:src="$constant.background.view_random"
fit="cover">
<div slot="error" class="image-slot background-image-error"></div>
</el-image>
<!-- 首页文字 -->
<div class="signature-wall myCenter my-animation-hideToShow">
<h1 class="playful">
<span v-for="(a, index) in '💎我的空间💎'" :key="index">{{a}}</span>
</h1>
<div class="printer" @click="getGuShi()">
<printer :printerInfo="printerInfo">
<template slot="paper" slot-scope="scope">
<h3>
{{ scope.content }}<span class="cursor">|</span>
</h3>
</template>
</printer>
</div>
<div id="bannerWave1"></div>
<div id="bannerWave2"></div>
<i class="el-icon-arrow-down" @click="navigation('.page-container-wrap')"></i>
</div>
<!-- 首页内容 -->
<div class="page-container-wrap">
<div class="page-container">
<div class="aside-content" v-if="showAside">
<myAside class="aside-content-myAside"></myAside>
</div>
<div class="recent-posts" >
<div class="announcement background-opacity">
<i class="fa fa-volume-up" aria-hidden="true"></i>
<div>
<div v-for="(notice, index) in $store.state.webInfo.notices" :key="index">
{{ notice }}
</div>
</div>
</div>
<div ref="pictureList">
<shuoshuo v-for="item in articles" :key="item" :source = "item"></shuoshuo>
</div>
<!-- -->
<div class="pagination-wrap">
<div @click="pageArticles()" class="pagination" v-if="pagination.total !== articles.length">
下一页
</div>
<div v-else style="user-select: none">
~~到底啦~~
</div>
</div>
</div>
</div>
</div>
<!-- 页脚 -->
<div style="background: var(--background)">
<myFooter></myFooter>
</div>
</template>
</loader>
</div>
</template>
<script>
const loader = () => import( "./common/loader");
const zombie = () => import( "./common/zombie");
const printer = () => import( "./common/printer");
const shuoshuo = () => import( "./common/shuoshuo");
const myFooter = () => import( "./common/myFooter");
const myAside = () => import( "./myAside");
export default {
components: {
loader,
zombie,
printer,
myFooter,
shuoshuo,
myAside
},
data() {
return {
loading: false,
showAside: true,
printerInfo: "你看对面的青山多漂亮",
pagination: {
current: 1,
size: 10,
total: 0,
searchKey: ""
},
guShi: {
"content": "",
"origin": "",
"author": "",
"category": ""
},
articles: []
};
},
watch: {},
created() {
this.getGuShi();
this.getArticles();
},
mounted() {
this.$store.commit("changePlaylist", 370417370);
},
methods: {
pageArticles() {
this.pagination.current = this.pagination.current + 1;
this.getArticles();
},
getArticles() {
this.$http.post(this.$constant.baseURL + "/diary/listArticle", this.pagination)
.then((res) => {
if (!this.$common.isEmpty(res.data)) {
this.articles = this.articles.concat(res.data.records);
this.pagination.total = res.data.total;
}
})
.catch((error) => {
this.$message({
message: error.message,
type: "error"
});
});
},
navigation(selector) {
let pageId = document.querySelector(selector);
window.scrollTo({
top: pageId.offsetTop,
behavior: "smooth"
});
},
getGuShi() {
let that = this;
let xhr = new XMLHttpRequest();
xhr.open('get', this.$constant.jinrishici);
xhr.onreadystatechange = function () {
if (xhr.readyState === 4) {
that.guShi = JSON.parse(xhr.responseText);
that.printerInfo = that.guShi.content;
}
};
xhr.send();
}
}
}
</script>
<style scoped>
.signature-wall {
/* 向下排列 */
display: flex;
flex-direction: column;
position: relative;
user-select: none;
height: 100vh;
overflow: hidden;
}
.playful {
color: var(--white);
font-size: 40px;
}
/*.playful span {*/
/* position: relative;*/
/* color: #5362f6;*/
/* text-shadow: 0.25px 0.25px #e485f8, 0.5px 0.5px #e485f8, 0.75px 0.75px #e485f8,*/
/* 1px 1px #e485f8, 1.25px 1.25px #e485f8, 1.5px 1.5px #e485f8, 1.75px 1.75px #e485f8,*/
/* 2px 2px #e485f8, 2.25px 2.25px #e485f8, 2.5px 2.5px #e485f8, 2.75px 2.75px #e485f8,*/
/* 3px 3px #e485f8, 3.25px 3.25px #e485f8, 3.5px 3.5px #e485f8, 3.75px 3.75px #e485f8,*/
/* 4px 4px #e485f8, 4.25px 4.25px #e485f8, 4.5px 4.5px #e485f8, 4.75px 4.75px #e485f8,*/
/* 5px 5px #e485f8, 5.25px 5.25px #e485f8, 5.5px 5.5px #e485f8, 5.75px 5.75px #e485f8,*/
/* 6px 6px #e485f8;*/
/* animation: scatter 1.75s infinite;*/
/* font-weight: normal;*/
/*}*/
/*.playful span:nth-child(2n) {*/
/* color: #ed625c;*/
/* text-shadow: 0.25px 0.25px #f2a063, 0.5px 0.5px #f2a063, 0.75px 0.75px #f2a063,*/
/* 1px 1px #f2a063, 1.25px 1.25px #f2a063, 1.5px 1.5px #f2a063, 1.75px 1.75px #f2a063,*/
/* 2px 2px #f2a063, 2.25px 2.25px #f2a063, 2.5px 2.5px #f2a063, 2.75px 2.75px #f2a063,*/
/* 3px 3px #f2a063, 3.25px 3.25px #f2a063, 3.5px 3.5px #f2a063, 3.75px 3.75px #f2a063,*/
/* 4px 4px #f2a063, 4.25px 4.25px #f2a063, 4.5px 4.5px #f2a063, 4.75px 4.75px #f2a063,*/
/* 5px 5px #f2a063, 5.25px 5.25px #f2a063, 5.5px 5.5px #f2a063, 5.75px 5.75px #f2a063,*/
/* 6px 6px #f2a063;*/
/* animation-delay: 0.3s;*/
/*}*/
/*.playful span:nth-child(3n) {*/
/* color: #ffd913;*/
/* text-shadow: 0.25px 0.25px #6ec0a9, 0.5px 0.5px #6ec0a9, 0.75px 0.75px #6ec0a9,*/
/* 1px 1px #6ec0a9, 1.25px 1.25px #6ec0a9, 1.5px 1.5px #6ec0a9, 1.75px 1.75px #6ec0a9,*/
/* 2px 2px #6ec0a9, 2.25px 2.25px #6ec0a9, 2.5px 2.5px #6ec0a9, 2.75px 2.75px #6ec0a9,*/
/* 3px 3px #6ec0a9, 3.25px 3.25px #6ec0a9, 3.5px 3.5px #6ec0a9, 3.75px 3.75px #6ec0a9,*/
/* 4px 4px #6ec0a9, 4.25px 4.25px #6ec0a9, 4.5px 4.5px #6ec0a9, 4.75px 4.75px #6ec0a9,*/
/* 5px 5px #6ec0a9, 5.25px 5.25px #6ec0a9, 5.5px 5.5px #6ec0a9, 5.75px 5.75px #6ec0a9,*/
/* 6px 6px #6ec0a9;*/
/* animation-delay: 0.15s;*/
/*}*/
/*.playful span:nth-child(5n) {*/
/* color: #555bff;*/
/* text-shadow: 0.25px 0.25px #e485f8, 0.5px 0.5px #e485f8, 0.75px 0.75px #e485f8,*/
/* 1px 1px #e485f8, 1.25px 1.25px #e485f8, 1.5px 1.5px #e485f8, 1.75px 1.75px #e485f8,*/
/* 2px 2px #e485f8, 2.25px 2.25px #e485f8, 2.5px 2.5px #e485f8, 2.75px 2.75px #e485f8,*/
/* 3px 3px #e485f8, 3.25px 3.25px #e485f8, 3.5px 3.5px #e485f8, 3.75px 3.75px #e485f8,*/
/* 4px 4px #e485f8, 4.25px 4.25px #e485f8, 4.5px 4.5px #e485f8, 4.75px 4.75px #e485f8,*/
/* 5px 5px #e485f8, 5.25px 5.25px #e485f8, 5.5px 5.5px #e485f8, 5.75px 5.75px #e485f8,*/
/* 6px 6px #e485f8;*/
/* animation-delay: 0.4s;*/
/*}*/
/*.playful span:nth-child(7n) {*/
/* color: #ff9c55;*/
/* text-shadow: 0.25px 0.25px #ff5555, 0.5px 0.5px #ff5555, 0.75px 0.75px #ff5555,*/
/* 1px 1px #ff5555, 1.25px 1.25px #ff5555, 1.5px 1.5px #ff5555, 1.75px 1.75px #ff5555,*/
/* 2px 2px #ff5555, 2.25px 2.25px #ff5555, 2.5px 2.5px #ff5555, 2.75px 2.75px #ff5555,*/
/* 3px 3px #ff5555, 3.25px 3.25px #ff5555, 3.5px 3.5px #ff5555, 3.75px 3.75px #ff5555,*/
/* 4px 4px #ff5555, 4.25px 4.25px #ff5555, 4.5px 4.5px #ff5555, 4.75px 4.75px #ff5555,*/
/* 5px 5px #ff5555, 5.25px 5.25px #ff5555, 5.5px 5.5px #ff5555, 5.75px 5.75px #ff5555,*/
/* 6px 6px #ff5555;*/
/* animation-delay: 0.25s;*/
/*}*/
.printer {
cursor: pointer;
color: var(--white);
background: var(--translucent);
border-radius: 10px;
padding-left: 10px;
padding-right: 10px;
}
#bannerWave1 {
height: 84px;
background: var(--bannerWave1);
position: absolute;
width: 200%;
bottom: 0;
z-index: 10;
animation: gradientBG 120s linear infinite;
}
#bannerWave2 {
height: 100px;
background: var(--bannerWave2);
position: absolute;
width: 400%;
bottom: 0;
z-index: 5;
animation: gradientBG 120s linear infinite;
}
/* 光标 */
.cursor {
margin-left: 1px;
animation: hideToShow 0.7s infinite;
font-weight: 200;
}
.el-icon-arrow-down {
font-size: 40px;
font-weight: bold;
color: var(--white);
position: absolute;
bottom: 60px;
animation: my-shake 1.5s ease-out infinite;
z-index: 15;
cursor: pointer;
}
.page-container-wrap {
background: var(--background);
position: relative;
transition: .5s;
}
.page-container {
display: flex;
justify-content: center;
width: 90%;
max-width: 1280px;
padding: 0 20px 40px 20px;
margin: 0 auto;
flex-direction: row;
}
.recent-posts {
width: 70%;
}
.announcement {
padding: 22px;
border: 1px dashed var(--lightGray);
color: var(--greyFont);
border-radius: 10px;
display: flex;
max-width: 780px;
margin: 40px auto 40px;
}
.announcement i {
color: var(--themeBackground);
font-size: 22px;
margin: auto 0;
animation: scale 0.8s ease-in-out infinite;
}
.announcement div div {
margin-left: 20px;
line-height: 30px;
}
.aside-content {
width: calc(30% - 40px);
user-select: none;
margin-top: 40px;
margin-right: 40px;
max-width: 300px;
float: right;
}
.pagination-wrap {
display: flex;
justify-content: center;
margin-top: 40px;
}
.pagination {
padding: 13px 15px;
border: 1px solid var(--lightGray);
border-radius: 3rem;
color: var(--greyFont);
width: 100px;
user-select: none;
cursor: pointer;
text-align: center;
}
.aside-content-myAside{
position: sticky;
top: 10px;
}
.pagination:hover {
border: 1px solid var(--themeBackground);
color: var(--themeBackground);
box-shadow: 0 0 5px var(--themeBackground);
}
@media screen and (max-width: 1100px) {
.recent-posts {
width: 100%;
}
.page-container {
width: 100%;
}
}
@media screen and (max-width: 1000px) {
.page-container {
/* 文章栏与侧标栏垂直排列 */
flex-direction: column;
}
.aside-content {
width: 100%;
max-width: unset;
float: unset;
margin: 40px auto 0;
}
}
@media screen and (max-width: 768px) {
h1 {
font-size: 35px;
}
}
</style>
<template>
<div>
<loader :loading="loading">
<!-- 加载页面 -->
<template slot="loader">
<div>
<zombie></zombie>
</div>
</template>
<!-- 内容页面 -->
<template slot="body">
<!-- 首页图片 -->
<el-image style="animation: header-effect 2s"
class="background-image"
v-once
:lazy='true'
:src="$constant.background.bing_random"
fit="cover">
<div slot="error" class="image-slot background-image-error"></div>
</el-image>
<!-- 首页文字 -->
<div class="signature-wall myCenter my-animation-hideToShow">
<h1 class="playful">
<span v-for="(a, index) in '💎我的空间💎'" :key="index">{{a}}</span>
</h1>
<div class="printer" @click="getGuShi()">
<printer :printerInfo="printerInfo">
<template slot="paper" slot-scope="scope">
<h3>
{{ scope.content }}<span class="cursor">|</span>
</h3>
</template>
</printer>
</div>
<div id="bannerWave1"></div>
<div id="bannerWave2"></div>
<i class="el-icon-arrow-down" @click="navigation('.page-container-wrap')"></i>
</div>
<!-- 首页内容 -->
<div class="page-container-wrap">
<div class="page-container">
<div class="aside-content" v-if="showAside">
<myAside class="aside-content-myAside"></myAside>
</div>
<div class="recent-posts" >
<div class="announcement background-opacity">
<i class="fa fa-volume-up" aria-hidden="true"></i>
<div>
<div v-for="(notice, index) in $store.state.webInfo.notices" :key="index">
{{ notice }}
</div>
</div>
</div>
<div ref="pictureList">
<shuoshuo v-for="item in filterArticles()" :key="item" :source = "item"></shuoshuo>
</div>
<!-- -->
<div class="pagination-wrap">
<div @click="pageArticles()" class="pagination" v-if="pagination.total !== articles.length">
下一页
</div>
<div v-else style="user-select: none">
~~到底啦~~
</div>
</div>
</div>
</div>
</div>
<!-- 页脚 -->
<div style="background: var(--background)">
<myFooter></myFooter>
</div>
</template>
</loader>
</div>
</template>
<script>
const loader = () => import( "./common/loader");
const zombie = () => import( "./common/zombie");
const printer = () => import( "./common/printer");
const shuoshuo = () => import( "./common/shuoshuo");
const myFooter = () => import( "./common/myFooter");
const myAside = () => import( "./myAside");
export default {
components: {
loader,
zombie,
printer,
myFooter,
shuoshuo,
myAside
},
data() {
return {
loading: false,
showAside: true,
printerInfo: "你看对面的青山多漂亮",
pagination: {
current: 1,
size: 10,
total: 0,
searchKey: ""
},
guShi: {
"content": "",
"origin": "",
"author": "",
"category": ""
},
articles: []
};
},
watch: {},
created() {
this.getGuShi();
if (this.$common.isEmpty(this.$store.state.currentUser)) {
this.$message({
message: "登录后可查看更多",
type: "warning"
});
}
this.getArticles();
},
mounted() {
this.$store.commit("changePlaylist", 370417370);
},
methods: {
pageArticles() {
this.pagination.current = this.pagination.current + 1;
this.getArticles();
},
filterArticles(){
//
return this.articles;
if (this.$route.query.showAll)
return this.articles;
else if (!this.$common.isEmpty(this.$store.state.currentUser))
return this.articles.filter(obj => obj.permission < 2);
else
return this.articles.filter(obj => obj.permission < 1);
},
getArticles() {
this.$http.post(this.$constant.baseURL + "/diary/listArticle", this.pagination)
.then((res) => {
if (!this.$common.isEmpty(res.data)) {
this.articles = this.articles.concat(res.data.records);
this.pagination.total = res.data.total;
console.log(this.articles);
let obj = [[],[]]
this.articles.forEach(artcile => {
let items = JSON.parse(artcile.articleItems)
obj[0].push(...items[0])
obj[1].push(...items[1])
});
}
})
.catch((error) => {
this.$message({
message: error.message,
type: "error"
});
});
},
navigation(selector) {
let pageId = document.querySelector(selector);
window.scrollTo({
top: pageId.offsetTop,
behavior: "smooth"
});
},
getGuShi() {
let that = this;
let xhr = new XMLHttpRequest();
xhr.open('get', this.$constant.jinrishici);
xhr.onreadystatechange = function () {
if (xhr.readyState === 4) {
that.guShi = JSON.parse(xhr.responseText);
that.printerInfo = that.guShi.content;
}
};
xhr.send();
}
}
}
</script>
<style scoped>
.signature-wall {
/* 向下排列 */
display: flex;
flex-direction: column;
position: relative;
user-select: none;
height: 100vh;
overflow: hidden;
}
.playful {
color: var(--white);
font-size: 40px;
}
/*.playful span {*/
/* position: relative;*/
/* color: #5362f6;*/
/* text-shadow: 0.25px 0.25px #e485f8, 0.5px 0.5px #e485f8, 0.75px 0.75px #e485f8,*/
/* 1px 1px #e485f8, 1.25px 1.25px #e485f8, 1.5px 1.5px #e485f8, 1.75px 1.75px #e485f8,*/
/* 2px 2px #e485f8, 2.25px 2.25px #e485f8, 2.5px 2.5px #e485f8, 2.75px 2.75px #e485f8,*/
/* 3px 3px #e485f8, 3.25px 3.25px #e485f8, 3.5px 3.5px #e485f8, 3.75px 3.75px #e485f8,*/
/* 4px 4px #e485f8, 4.25px 4.25px #e485f8, 4.5px 4.5px #e485f8, 4.75px 4.75px #e485f8,*/
/* 5px 5px #e485f8, 5.25px 5.25px #e485f8, 5.5px 5.5px #e485f8, 5.75px 5.75px #e485f8,*/
/* 6px 6px #e485f8;*/
/* animation: scatter 1.75s infinite;*/
/* font-weight: normal;*/
/*}*/
/*.playful span:nth-child(2n) {*/
/* color: #ed625c;*/
/* text-shadow: 0.25px 0.25px #f2a063, 0.5px 0.5px #f2a063, 0.75px 0.75px #f2a063,*/
/* 1px 1px #f2a063, 1.25px 1.25px #f2a063, 1.5px 1.5px #f2a063, 1.75px 1.75px #f2a063,*/
/* 2px 2px #f2a063, 2.25px 2.25px #f2a063, 2.5px 2.5px #f2a063, 2.75px 2.75px #f2a063,*/
/* 3px 3px #f2a063, 3.25px 3.25px #f2a063, 3.5px 3.5px #f2a063, 3.75px 3.75px #f2a063,*/
/* 4px 4px #f2a063, 4.25px 4.25px #f2a063, 4.5px 4.5px #f2a063, 4.75px 4.75px #f2a063,*/
/* 5px 5px #f2a063, 5.25px 5.25px #f2a063, 5.5px 5.5px #f2a063, 5.75px 5.75px #f2a063,*/
/* 6px 6px #f2a063;*/
/* animation-delay: 0.3s;*/
/*}*/
/*.playful span:nth-child(3n) {*/
/* color: #ffd913;*/
/* text-shadow: 0.25px 0.25px #6ec0a9, 0.5px 0.5px #6ec0a9, 0.75px 0.75px #6ec0a9,*/
/* 1px 1px #6ec0a9, 1.25px 1.25px #6ec0a9, 1.5px 1.5px #6ec0a9, 1.75px 1.75px #6ec0a9,*/
/* 2px 2px #6ec0a9, 2.25px 2.25px #6ec0a9, 2.5px 2.5px #6ec0a9, 2.75px 2.75px #6ec0a9,*/
/* 3px 3px #6ec0a9, 3.25px 3.25px #6ec0a9, 3.5px 3.5px #6ec0a9, 3.75px 3.75px #6ec0a9,*/
/* 4px 4px #6ec0a9, 4.25px 4.25px #6ec0a9, 4.5px 4.5px #6ec0a9, 4.75px 4.75px #6ec0a9,*/
/* 5px 5px #6ec0a9, 5.25px 5.25px #6ec0a9, 5.5px 5.5px #6ec0a9, 5.75px 5.75px #6ec0a9,*/
/* 6px 6px #6ec0a9;*/
/* animation-delay: 0.15s;*/
/*}*/
/*.playful span:nth-child(5n) {*/
/* color: #555bff;*/
/* text-shadow: 0.25px 0.25px #e485f8, 0.5px 0.5px #e485f8, 0.75px 0.75px #e485f8,*/
/* 1px 1px #e485f8, 1.25px 1.25px #e485f8, 1.5px 1.5px #e485f8, 1.75px 1.75px #e485f8,*/
/* 2px 2px #e485f8, 2.25px 2.25px #e485f8, 2.5px 2.5px #e485f8, 2.75px 2.75px #e485f8,*/
/* 3px 3px #e485f8, 3.25px 3.25px #e485f8, 3.5px 3.5px #e485f8, 3.75px 3.75px #e485f8,*/
/* 4px 4px #e485f8, 4.25px 4.25px #e485f8, 4.5px 4.5px #e485f8, 4.75px 4.75px #e485f8,*/
/* 5px 5px #e485f8, 5.25px 5.25px #e485f8, 5.5px 5.5px #e485f8, 5.75px 5.75px #e485f8,*/
/* 6px 6px #e485f8;*/
/* animation-delay: 0.4s;*/
/*}*/
/*.playful span:nth-child(7n) {*/
/* color: #ff9c55;*/
/* text-shadow: 0.25px 0.25px #ff5555, 0.5px 0.5px #ff5555, 0.75px 0.75px #ff5555,*/
/* 1px 1px #ff5555, 1.25px 1.25px #ff5555, 1.5px 1.5px #ff5555, 1.75px 1.75px #ff5555,*/
/* 2px 2px #ff5555, 2.25px 2.25px #ff5555, 2.5px 2.5px #ff5555, 2.75px 2.75px #ff5555,*/
/* 3px 3px #ff5555, 3.25px 3.25px #ff5555, 3.5px 3.5px #ff5555, 3.75px 3.75px #ff5555,*/
/* 4px 4px #ff5555, 4.25px 4.25px #ff5555, 4.5px 4.5px #ff5555, 4.75px 4.75px #ff5555,*/
/* 5px 5px #ff5555, 5.25px 5.25px #ff5555, 5.5px 5.5px #ff5555, 5.75px 5.75px #ff5555,*/
/* 6px 6px #ff5555;*/
/* animation-delay: 0.25s;*/
/*}*/
.printer {
cursor: pointer;
color: var(--white);
background: var(--translucent);
border-radius: 10px;
padding-left: 10px;
padding-right: 10px;
}
#bannerWave1 {
height: 84px;
background: var(--bannerWave1);
position: absolute;
width: 200%;
bottom: 0;
z-index: 10;
animation: gradientBG 120s linear infinite;
}
#bannerWave2 {
height: 100px;
background: var(--bannerWave2);
position: absolute;
width: 400%;
bottom: 0;
z-index: 5;
animation: gradientBG 120s linear infinite;
}
/* 光标 */
.cursor {
margin-left: 1px;
animation: hideToShow 0.7s infinite;
font-weight: 200;
}
.el-icon-arrow-down {
font-size: 40px;
font-weight: bold;
color: var(--white);
position: absolute;
bottom: 60px;
animation: my-shake 1.5s ease-out infinite;
z-index: 15;
cursor: pointer;
}
.page-container-wrap {
background: var(--background);
position: relative;
transition: .5s;
}
.page-container {
display: flex;
justify-content: center;
width: 90%;
max-width: 1280px;
padding: 0 20px 40px 20px;
margin: 0 auto;
flex-direction: row;
}
.recent-posts {
width: 70%;
}
.announcement {
padding: 22px;
border: 1px dashed var(--lightGray);
color: var(--greyFont);
border-radius: 10px;
display: flex;
max-width: 780px;
margin: 40px auto 40px;
}
.announcement i {
color: var(--themeBackground);
font-size: 22px;
margin: auto 0;
animation: scale 0.8s ease-in-out infinite;
}
.announcement div div {
margin-left: 20px;
line-height: 30px;
}
.aside-content {
width: calc(30% - 40px);
user-select: none;
margin-top: 40px;
margin-right: 40px;
max-width: 300px;
float: right;
}
.pagination-wrap {
display: flex;
justify-content: center;
margin-top: 40px;
}
.pagination {
padding: 13px 15px;
border: 1px solid var(--lightGray);
border-radius: 3rem;
color: var(--greyFont);
width: 100px;
user-select: none;
cursor: pointer;
text-align: center;
}
.aside-content-myAside{
position: sticky;
top: 10px;
}
.pagination:hover {
border: 1px solid var(--themeBackground);
color: var(--themeBackground);
box-shadow: 0 0 5px var(--themeBackground);
}
@media screen and (max-width: 1100px) {
.recent-posts {
width: 100%;
}
.page-container {
width: 100%;
}
}
@media screen and (max-width: 1000px) {
.page-container {
/* 文章栏与侧标栏垂直排列 */
flex-direction: column;
}
.aside-content {
width: 100%;
max-width: unset;
float: unset;
margin: 40px auto 0;
}
}
@media screen and (max-width: 768px) {
h1 {
font-size: 35px;
}
}
</style>

@ -1,331 +1,335 @@
<template>
<div>
<!-- 搜索框 -->
<div class="card-content0">
<form @submit.prevent="goSearch()">
<input type="text" v-model="searchKey" placeholder="搜索从这里开始...">
<button type="submit"></button>
</form>
</div>
<!-- 网站信息 -->
<div class="card-content1 shadow-box background-opacity">
<el-avatar style="margin-top: 20px" class="user-avatar" :size="120" :src="webInfo.avatar"></el-avatar>
<div class="web-name">{{webInfo.webName}}</div>
<div class="web-info">
<div class="blog-info-box">
<span>文章</span>
<span class="blog-info-num">{{ $store.getters.articleTotal }}</span>
</div>
<div class="blog-info-box">
<span>分类</span>
<span class="blog-info-num">{{ sortInfo.length }}</span>
</div>
</div>
<div class="more-cannal">
<a ks-text="Github" ks-tag="top" href="https://github.com/janxland" target="_blank" ><i class="fa fa-github" style="background-color: #000;" aria-hidden="true"></i></a>
<a ks-text="Twitter" ks-tag="top" href="" target="_blank"><i class="fa fa-twitter" style="background-color: #1d9bf0;" aria-hidden="true"></i></a>
<a ks-text="" ks-tag="top" href="" target="_blank"><i class="fa fa-wechat" style="background-color: #1aad19;" aria-hidden="true"></i></a>
<a ks-text="Bilibili" ks-tag="top" href="https://space.bilibili.com/11363292" target="_blank"><svg viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" style="background-color: #f25d8e"><path d="M777.514667 131.669333a53.333333 53.333333 0 0 1 0 75.434667L728.746667 255.829333h49.92A160 160 0 0 1 938.666667 415.872v320a160 160 0 0 1-160 160H245.333333A160 160 0 0 1 85.333333 735.872v-320a160 160 0 0 1 160-160h49.749334L246.4 207.146667a53.333333 53.333333 0 1 1 75.392-75.434667l113.152 113.152c3.370667 3.370667 6.186667 7.04 8.448 10.965333h137.088c2.261333-3.925333 5.12-7.68 8.490667-11.008l113.109333-113.152a53.333333 53.333333 0 0 1 75.434667 0z m1.152 231.253334H245.333333a53.333333 53.333333 0 0 0-53.205333 49.365333l-0.128 4.010667v320c0 28.117333 21.76 51.157333 49.365333 53.162666l3.968 0.170667h533.333334a53.333333 53.333333 0 0 0 53.205333-49.365333l0.128-3.968v-320c0-29.44-23.893333-53.333333-53.333333-53.333334z m-426.666667 106.666666c29.44 0 53.333333 23.893333 53.333333 53.333334v53.333333a53.333333 53.333333 0 1 1-106.666666 0v-53.333333c0-29.44 23.893333-53.333333 53.333333-53.333334z m320 0c29.44 0 53.333333 23.893333 53.333333 53.333334v53.333333a53.333333 53.333333 0 1 1-106.666666 0v-53.333333c0-29.44 23.893333-53.333333 53.333333-53.333334z" fill="#fff"></path></svg></a>
<a ks-text="QQ🐧" ks-tag="top" href="" target="_blank"><i class="fa fa-qq" style="background-color: #12b7f5;"></i></a>
<a ks-text="RSS" ks-tag="top" href="" target="_blank"><i class="fa fa-rss" style="background-color: #ff9800"></i></a>
</div>
<a class="collection-btn" @click="showTip()">
<i class="el-icon-star-off" style="margin-right: 2px"></i>朋友圈
</a>
</div>
<!-- 分类 -->
<div class="shadow-box background-opacity wow"
style="padding: 25px 25px 5px;border-radius: 10px;animation: zoomIn 0.8s ease-in-out">
<div class="card-content2-title">
<i class="el-icon-folder-opened card-content2-icon"></i>
<span>分类</span>
</div>
<div v-for="(sort, index) in sortInfo"
:key="index"
class="post-sort"
@click="$router.push({path: '/sort', query: {sortId: sort.id}})">
<div>
<span v-for="(s, i) in sort.sortName.split('')" :key="i">{{ s }}</span>
</div>
</div>
</div>
<!-- 推荐文章 -->
<div v-if="!$common.isEmpty(recommendArticles)"
style="padding: 25px;border-radius: 10px;margin-top: 40px;animation: zoomIn 0.8s ease-in-out"
class="shadow-box background-opacity wow">
<div class="card-content2-title">
<i class="el-icon-reading card-content2-icon"></i>
<span>推荐文章</span>
</div>
<div v-for="(article, index) in recommendArticles"
:key="index"
@click="$router.push({path: '/article', query: {id: article.id}})">
<div class="aside-post-detail">
<div class="aside-post-image">
<el-image class="my-el-image" :src="article.articleCover" fit="cover">
<div slot="error" class="image-slot">
<div class="error-aside-image">
{{article.username}}
</div>
</div>
</el-image>
</div>
<div class="aside-post-title">
{{ article.articleTitle }}
</div>
</div>
<div class="aside-post-date">
<i class="el-icon-date" style="color: var(--greyFont)"></i>{{ article.createTime }}
</div>
</div>
</div>
</div>
</template>
<script>
import {navigation} from '../utils/tools.js'
export default {
data() {
return {
pagination: {
current: 1,
size: 5,
recommendStatus: true
},
searchKey:"",
recommendArticles: []
}
},
computed: {
webInfo() {
return this.$store.state.webInfo;
},
sortInfo() {
return this.$store.state.sortInfo;
}
},
created() {
this.getRecommendArticles();
},
methods: {
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"
});
});
},
showTip() {
this.$router.push({path: '/weiYan'});
},
goSearch(){
this.$router.push({query: {searchKey:this.searchKey}})
this.$nextTick(()=>{
this.navigation('.page-container-wrap');
})
},
navigation(selector) {
let pageId = document.querySelector(selector);
window.scrollTo({
top: pageId.offsetTop,
behavior: "smooth"
});
},
}
}
</script>
<style scoped>
.card-content0{
}
.card-content0 {
transition: .3s;
background-color: var(--background);
}
.card-content0 input {
transition: .3s;
width: 100%;
height: 42px;
padding-left: 10px;
background-color: var(--background);
border: 2px solid #7BA7AB;
border-radius: 5px;
outline: none;
color: var(--fontColor);
}
.card-content0 button {
position: absolute;
top: 0;
right: 0px;
width: 42px;
height: 42px;
border: none;
background: #7BA7AB;
border-radius: 0 5px 5px 0;
cursor: pointer;
}
.card-content0 button:before {
transition: .3s;
content: "\f002";
font-family: FontAwesome;
font-size: 16px;
color: var(--fontColor);
}
.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;
margin: 10px 0;
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;
}
.more-cannal {
justify-content: space-around;
display: flex;
width: 80%;
margin-top:12px ;
}
.more-cannal svg, .more-cannal i{
text-align: center;
color: #FFF;
width: 2em;
padding: .5em;
border-radius: 1em;
}
.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;
}
.card-content2-icon {
color: var(--red);
margin-right: 5px;
animation: scale 1s ease-in-out infinite;
}
.aside-post-detail {
display: flex;
cursor: pointer;
}
.aside-post-image {
width: 40%;
border-radius: 0.2rem;
margin-right: 8px;
overflow: hidden;
}
.error-aside-image {
background: var(--themeBackground);
color: var(--white);
padding: 10px;
text-align: center;
width: 100%;
height: 100%;
}
.aside-post-title {
width: 60%;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
}
.aside-post-date {
margin-top: 8px;
margin-bottom: 20px;
color: var(--greyFont);
font-size: 12px;
}
.post-sort {
border-radius: 1rem;
margin-bottom: 15px;
line-height: 30px;
transition: all 0.3s;
}
.post-sort:hover {
background: var(--themeBackground);
padding: 2px 15px;
cursor: pointer;
color: var(--white);
}
</style>
<template>
<div>
<!-- 搜索框 -->
<div class="card-content0">
<form @submit.prevent="goSearch()">
<input type="text" v-model="searchKey" placeholder="搜索从这里开始...">
<button type="submit"></button>
</form>
</div>
<!-- 网站信息 -->
<div class="card-content1 shadow-box background-opacity">
<el-avatar style="margin-top: 20px" class="user-avatar" :size="120" :src="webInfo.avatar"></el-avatar>
<div class="web-name">{{webInfo.webName}}</div>
<div class="web-info">
<div class="blog-info-box">
<span>文章</span>
<span class="blog-info-num">{{ $store.getters.articleTotal }}</span>
</div>
<div class="blog-info-box">
<span>分类</span>
<span class="blog-info-num">{{ sortInfo.length }}</span>
</div>
</div>
<div class="more-cannal">
<a ks-text="Github" ks-tag="top" href="https://github.com/janxland" target="_blank" ><i class="fa fa-github" style="background-color: #000;" aria-hidden="true"></i></a>
<a ks-text="Twitter" ks-tag="top" href="" target="_blank"><i class="fa fa-twitter" style="background-color: #1d9bf0;" aria-hidden="true"></i></a>
<a ks-text="" ks-tag="top" href="https://u.wechat.com/MP9ZNUD9y1VsG3xlE103RVs" target="_blank"><i class="fa fa-wechat" style="background-color: #1aad19;" aria-hidden="true"></i></a>
<a ks-text="Bilibili" ks-tag="top" href="https://space.bilibili.com/11363292" target="_blank"><svg viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" style="background-color: #f25d8e"><path d="M777.514667 131.669333a53.333333 53.333333 0 0 1 0 75.434667L728.746667 255.829333h49.92A160 160 0 0 1 938.666667 415.872v320a160 160 0 0 1-160 160H245.333333A160 160 0 0 1 85.333333 735.872v-320a160 160 0 0 1 160-160h49.749334L246.4 207.146667a53.333333 53.333333 0 1 1 75.392-75.434667l113.152 113.152c3.370667 3.370667 6.186667 7.04 8.448 10.965333h137.088c2.261333-3.925333 5.12-7.68 8.490667-11.008l113.109333-113.152a53.333333 53.333333 0 0 1 75.434667 0z m1.152 231.253334H245.333333a53.333333 53.333333 0 0 0-53.205333 49.365333l-0.128 4.010667v320c0 28.117333 21.76 51.157333 49.365333 53.162666l3.968 0.170667h533.333334a53.333333 53.333333 0 0 0 53.205333-49.365333l0.128-3.968v-320c0-29.44-23.893333-53.333333-53.333333-53.333334z m-426.666667 106.666666c29.44 0 53.333333 23.893333 53.333333 53.333334v53.333333a53.333333 53.333333 0 1 1-106.666666 0v-53.333333c0-29.44 23.893333-53.333333 53.333333-53.333334z m320 0c29.44 0 53.333333 23.893333 53.333333 53.333334v53.333333a53.333333 53.333333 0 1 1-106.666666 0v-53.333333c0-29.44 23.893333-53.333333 53.333333-53.333334z" fill="#fff"></path></svg></a>
<a ks-text="QQ" ks-tag="top" href="tencent://AddContact/?fromId=50&fromSubId=1&subcmd=all&uin=983341575" target="_blank"><i class="fa fa-qq" style="background-color: #12b7f5;"></i></a>
<a ks-text="RSS" ks-tag="top" href="" target="_blank"><i class="fa fa-rss" style="background-color: #ff9800"></i></a>
</div>
<a class="collection-btn" @click="$router.push({path: '/izone'});">
<i class="el-icon-star-off" style="margin-right: 2px"></i>个人空间
</a>
<a class="collection-btn" @click="$router.push({path: '/album',query:{type:'dynamic'}});">
<i class="el-icon-star-off" style="margin-right: 2px"></i>动态相册
</a>
</div>
<!-- 分类 -->
<div class="shadow-box background-opacity wow"
style="padding: 25px 25px 5px;border-radius: 10px;animation: zoomIn 0.8s ease-in-out">
<div class="card-content2-title">
<i class="el-icon-folder-opened card-content2-icon"></i>
<span>分类</span>
</div>
<div v-for="(sort, index) in sortInfo"
:key="index"
class="post-sort"
@click="$router.push({path: '/sort', query: {sortId: sort.id}})">
<div>
<span v-for="(s, i) in sort.sortName.split('')" :key="i">{{ s }}</span>
</div>
</div>
</div>
<!-- 推荐文章 -->
<div v-if="!$common.isEmpty(recommendArticles)"
style="padding: 25px;border-radius: 10px;margin-top: 40px;animation: zoomIn 0.8s ease-in-out"
class="shadow-box background-opacity wow">
<div class="card-content2-title">
<i class="el-icon-reading card-content2-icon"></i>
<span>推荐文章</span>
</div>
<div v-for="(article, index) in recommendArticles"
:key="index"
@click="$router.push({path: '/article', query: {id: article.id}})">
<div class="aside-post-detail">
<div class="aside-post-image">
<el-image class="my-el-image" :src="article.articleCover" fit="cover">
<div slot="error" class="image-slot">
<div class="error-aside-image">
{{article.username}}
</div>
</div>
</el-image>
</div>
<div class="aside-post-title">
{{ article.articleTitle }}
</div>
</div>
<div class="aside-post-date">
<i class="el-icon-date" style="color: var(--greyFont)"></i>{{ article.createTime }}
</div>
</div>
</div>
</div>
</template>
<script>
import {navigation} from '../utils/tools.js'
export default {
data() {
return {
pagination: {
current: 1,
size: 5,
recommendStatus: true
},
searchKey:"",
recommendArticles: []
}
},
computed: {
webInfo() {
return this.$store.state.webInfo;
},
sortInfo() {
return this.$store.state.sortInfo;
}
},
created() {
this.getRecommendArticles();
},
methods: {
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"
});
});
},
showTip() {
this.$router.push({path: '/weiYan'});
},
goSearch(){
this.$router.push({query: {searchKey:this.searchKey}})
this.$nextTick(()=>{
this.navigation('.page-container-wrap');
})
},
navigation(selector) {
let pageId = document.querySelector(selector);
window.scrollTo({
top: pageId.offsetTop,
behavior: "smooth"
});
},
}
}
</script>
<style scoped>
.card-content0{
}
.card-content0 {
transition: .3s;
background-color: var(--background);
}
.card-content0 input {
transition: .3s;
width: 100%;
height: 42px;
padding-left: 10px;
background-color: var(--background);
border: 2px solid #7BA7AB;
border-radius: 5px;
outline: none;
color: var(--fontColor);
}
.card-content0 button {
position: absolute;
top: 0;
right: 0px;
width: 42px;
height: 42px;
border: none;
background: #7BA7AB;
border-radius: 0 5px 5px 0;
cursor: pointer;
}
.card-content0 button:before {
transition: .3s;
content: "\f002";
font-family: FontAwesome;
font-size: 16px;
color: var(--fontColor);
}
.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;
margin: 10px 0;
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;
}
.more-cannal {
justify-content: space-around;
display: flex;
width: 80%;
margin-top:12px ;
}
.more-cannal svg, .more-cannal i{
text-align: center;
color: #FFF;
width: 2em;
padding: .5em;
border-radius: 1em;
}
.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;
}
.collection-btn:last-child{
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;
}
.card-content2-icon {
color: var(--red);
margin-right: 5px;
animation: scale 1s ease-in-out infinite;
}
.aside-post-detail {
display: flex;
cursor: pointer;
}
.aside-post-image {
width: 40%;
border-radius: 0.2rem;
margin-right: 8px;
overflow: hidden;
}
.error-aside-image {
background: var(--themeBackground);
color: var(--white);
padding: 10px;
text-align: center;
width: 100%;
height: 100%;
}
.aside-post-title {
width: 60%;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
}
.aside-post-date {
margin-top: 8px;
margin-bottom: 20px;
color: var(--greyFont);
font-size: 12px;
}
.post-sort {
border-radius: 1rem;
margin-bottom: 15px;
line-height: 30px;
transition: all 0.3s;
}
.post-sort:hover {
background: var(--themeBackground);
padding: 2px 15px;
cursor: pointer;
color: var(--white);
}
</style>

File diff suppressed because it is too large Load Diff

@ -1,64 +1,69 @@
import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
import ElementUI from 'element-ui'
import http from './utils/request'
import common from './utils/common'
import constant from './utils/constant'
import mavonEditor from 'mavon-editor'
//引入json配置
import EMOJI from './assets/json/emoji.json'
//引入js
//import './utils/live2d'
import './utils/title'
//引入css
import './assets/css/animation.css'
import './assets/css/index.css'
import './assets/css/tocbot.css'
import './assets/css/color.css'
import './assets/css/markdown-highlight.css'
import './assets/css/font-awesome.min.css'
import 'mavon-editor/dist/css/index.css'
//点击涟漪效果
import Ripple from 'vue-ripple-directive'
import {vueBaberrage} from 'vue-baberrage'
Ripple.color = 'var(--rippleColor)'
Vue.directive("ripple", Ripple)
Vue.use(ElementUI)
Vue.use(vueBaberrage)
Vue.use(mavonEditor)
Vue.use(store)
Vue.prototype.EMOJI = EMOJI
Vue.prototype.$http = http
Vue.prototype.$common = common
Vue.prototype.$constant = constant
Vue.config.productionTip = false
top.faceReg = common.faceReg;
// import 'viewerjs/dist/viewer.css'
// import VueViewer from 'v-viewer'
// Vue.use(VueViewer)
const app = new Vue({
router,
store,
render: h => h(App)
}).$mount('#app')
Vue.prototype.ipData = {}
fetch("//ip-api.com/json/?lang=zh-CN").then((e=>e.json())).then((e=>{
let a = JSON.stringify(e);
localStorage.setItem("ipData", a);
Vue.prototype.ipData = e;
Vue.prototype.$message({
type: 'success',
message: `欢迎IP:${e.query},来自${e.country}${e.regionName}${e.city}的朋友!`
});
}))
console.log('%c hello world! \n Print by Roginshin. ',
import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
import ElementUI from 'element-ui'
import http from './utils/request'
import common from './utils/common'
import constant from './utils/constant'
import mavonEditor from 'mavon-editor'
//引入json配置
import EMOJI from './assets/json/emoji.json'
//引入js
// import './utils/live2d'
import './utils/title'
//引入css
import './assets/css/animation.css'
import './assets/css/index.css'
import './assets/css/tocbot.css'
import './assets/css/color.css'
import './assets/css/markdown-highlight.css'
import './assets/css/font-awesome.min.css'
import 'mavon-editor/dist/css/index.css'
//点击涟漪效果
import Ripple from 'vue-ripple-directive'
import {vueBaberrage} from 'vue-baberrage'
import VueLazyload from 'vue-lazyload'
Vue.use(VueLazyload, {
lazyComponent: true,
loading: 'https://mybox-1257251314.cos.ap-chengdu.myqcloud.com/load.gif'
})
Ripple.color = 'var(--rippleColor)'
Vue.directive("ripple", Ripple)
Vue.use(ElementUI)
Vue.use(vueBaberrage)
Vue.use(mavonEditor)
Vue.use(store)
Vue.prototype.EMOJI = EMOJI
Vue.prototype.$http = http
Vue.prototype.$common = common
Vue.prototype.$constant = constant
Vue.config.productionTip = false
top.faceReg = common.faceReg;
// import 'viewerjs/dist/viewer.css'
// import VueViewer from 'v-viewer'
// Vue.use(VueViewer)
const app = new Vue({
router,
store,
render: h => h(App)
}).$mount('#app')
// Vue.prototype.ipData = {}
// fetch("/getIp",{
// mode: 'cors',
// }).then((e=>e.json())).then((e=>{
// let a = JSON.stringify(e);
// localStorage.setItem("ipData", a);
// Vue.prototype.ipData = e;
// Vue.prototype.$message({
// type: 'success',
// message: `欢迎IP:${e.query??'0.0.0.0'},来自${e.country??'中国'}${e.regionName??''}${e.city??''}的朋友!`
// });检机构都是差不多都是有这个
// }))
console.log('%c hello world! \n Print by Roginshin. ',
'background: #ed556a;line-height:50px;font-size:24px; color: #f6cec1');

@ -1,142 +1,150 @@
import Vue from 'vue'
import VueRouter from 'vue-router'
const originalPush = VueRouter.prototype.push;
VueRouter.prototype.push = function push(location) {
return originalPush.call(this, location).catch(err => err);
}
Vue.use(VueRouter)
const routes = [
{
path: '/',
component: () => import('../components/home'),
children: [{
path: "/",
name: "index",
component: () => import('../components/index')
}, {
path: "/sort",
name: "sort",
component: () => import('../components/sort')
}, {
path: "/article",
name: "article",
component: () => import('../components/article')
}, {
path: "/weiYan",
name: "weiYan",
component: () => import('../components/weiYan')
}, {
path: "/message",
name: "message",
component: () => import('../components/message')
}, {
path: "/friend",
name: "friend",
component: () => import('../components/friend')
},{
path: "/bangumi",
name: "bangumi",
component: () => import('../components/bangumi')
},{
path: "/izone",
name: "izone",
component: () => import('../components/izone')
}, {
path: "/about",
name: "about",
component: () => import('../components/about')
}, {
path: "/user",
name: "user",
component: () => import('../components/user')
}, {
path: "/letter",
name: "letter",
component: () => import('../components/letter')
}]
},
{
path: '/admin',
redirect: '/main',
meta: {requiresAuth: true},
component: () => import('../components/admin/admin'),
children: [{
path: '/main',
name: 'main',
component: () => import('../components/admin/main')
}, {
path: '/webEdit',
name: 'webEdit',
component: () => import('../components/admin/webEdit')
}, {
path: '/userList',
name: 'userList',
component: () => import('../components/admin/userList')
}, {
path: '/postList',
name: 'postList',
component: () => import('../components/admin/postList')
}, {
path: '/postShuoshuo',
name: 'postShuoshuo',
component: () => import('../components/admin/postShuoshuo')
}, {
path: '/postEdit',
name: 'postEdit',
component: () => import('../components/admin/postEdit')
}, {
path: '/sortList',
name: 'sortList',
component: () => import('../components/admin/sortList')
}, {
path: '/commentList',
name: 'commentList',
component: () => import('../components/admin/commentList')
}, {
path: '/treeHoleList',
name: 'treeHoleList',
component: () => import('../components/admin/treeHoleList')
}, {
path: '/resourceList',
name: 'resourceList',
component: () => import('../components/admin/resourceList')
}, {
path: '/resourcePathList',
name: 'resourcePathList',
component: () => import('../components/admin/resourcePathList')
}]
},
{
path: '/verify',
name: 'verify',
component: () => import('../components/admin/verify')
}
]
const router = new VueRouter({
mode: "history",
routes: routes,
scrollBehavior(to, from, savedPosition) {
return {x: 0, y: 0}
}
})
router.beforeEach((to, from, next) => {
if (to.matched.some(record => record.meta.requiresAuth)) {
if (!Boolean(localStorage.getItem("adminToken"))) {
next({
path: '/verify',
query: {redirect: to.fullPath}
});
} else {
next();
}
} else {
next();
}
})
export default router
import Vue from 'vue'
import VueRouter from 'vue-router'
const originalPush = VueRouter.prototype.push;
VueRouter.prototype.push = function push(location) {
return originalPush.call(this, location).catch(err => err);
}
Vue.use(VueRouter)
const routes = [
{
path: '/',
component: () => import('../components/home'),
children: [{
path: "/",
name: "index",
component: () => import('../components/index')
}, {
path: "/sort",
name: "sort",
component: () => import('../components/sort')
}, {
path: "/article",
name: "article",
component: () => import('../components/article')
}, {
path: "/weiYan",
name: "weiYan",
component: () => import('../components/weiYan')
}, {
path: "/message",
name: "message",
component: () => import('../components/message')
}, {
path: "/friend",
name: "friend",
component: () => import('../components/friend')
},{
path: "/bangumi",
name: "bangumi",
component: () => import('../components/bangumi')
},{
path: "/izone",
name: "izone",
component: () => import('../components/izone')
},{
path: "/album",
name: "album",
component: () => import('../components/album')
}, {
path: "/about",
name: "about",
component: () => import('../components/about')
}, {
path: "/user",
name: "user",
component: () => import('../components/user')
}, {
path: "/letter",
name: "letter",
component: () => import('../components/letter')
}]
},
{
path: '/admin',
redirect: '/main',
meta: {requiresAuth: true},
component: () => import('../components/admin/admin'),
children: [{
path: '/main',
name: 'main',
component: () => import('../components/admin/main')
}, {
path: '/webEdit',
name: 'webEdit',
component: () => import('../components/admin/webEdit')
}, {
path: '/userList',
name: 'userList',
component: () => import('../components/admin/userList')
}, {
path: '/postList',
name: 'postList',
component: () => import('../components/admin/postList')
}, {
path: '/postShuoshuo',
name: 'postShuoshuo',
component: () => import('../components/admin/postShuoshuo')
}, {
path: '/postEdit',
name: 'postEdit',
component: () => import('../components/admin/postEdit')
}, {
path: '/sortList',
name: 'sortList',
component: () => import('../components/admin/sortList')
}, {
path: '/commentList',
name: 'commentList',
component: () => import('../components/admin/commentList')
}, {
path: '/treeHoleList',
name: 'treeHoleList',
component: () => import('../components/admin/treeHoleList')
}, {
path: '/resourceList',
name: 'resourceList',
component: () => import('../components/admin/resourceList')
}, {
path: '/resourcePathList',
name: 'resourcePathList',
component: () => import('../components/admin/resourcePathList')
}]
},
{
path: '/verify',
name: 'verify',
component: () => import('../components/admin/verify')
},{
path: "/loveheart",
name: "loveheart",
component: () => import('../components/loveheart')
},
]
const router = new VueRouter({
mode: "history",
routes: routes,
scrollBehavior(to, from, savedPosition) {
return {x: 0, y: 0}
}
})
router.beforeEach((to, from, next) => {
if (to.matched.some(record => record.meta.requiresAuth)) {
if (!Boolean(localStorage.getItem("adminToken"))) {
next({
path: '/verify',
query: {redirect: to.fullPath}
});
} else {
next();
}
} else {
next();
}
})
export default router

@ -1,85 +1,88 @@
import Vue from 'vue'
import Vuex from 'vuex'
import createPersistedState from "vuex-persistedstate";
Vue.use(Vuex)
export default new Vuex.Store({
state: {
toolbar: {
visible: false,
enter: true
},
sortInfo: [],
currentUser: {},
currentAdmin: {},
webInfo: {
webName: "",
webTitle: [],
notices: [],
footer: "",
backgroundImage: "",
avatar: ""
},
playlist:3226523716
},
getters: {
articleTotal: state => {
if (state.sortInfo !== null && state.sortInfo.length !== 0) {
if (state.sortInfo.length === 1) {
return state.sortInfo[0].countOfSort;
} else {
return state.sortInfo.reduce((prev, curr) => {
if (typeof prev === "number") {
return prev + curr.countOfSort;
} else {
return prev.countOfSort + curr.countOfSort;
}
});
}
} else {
return 0;
}
},
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;
})
} else {
return [];
}
}
},
mutations: {
changePlaylist(state, playlist){
state.playlist = playlist
},
changeToolbarStatus(state, toolbarState) {
state.toolbar = toolbarState;
},
loadSortInfo(state, sortInfo) {
state.sortInfo = sortInfo;
},
loadCurrentUser(state, user) {
state.currentUser = user;
},
loadCurrentAdmin(state, user) {
state.currentAdmin = user;
},
loadWebInfo(state, webInfo) {
webInfo.webTitle = webInfo.webTitle.split('');
webInfo.notices = JSON.parse(webInfo.notices);
state.webInfo = webInfo;
}
},
actions: {},
modules: {},
plugins: [
createPersistedState({
storage: window.localStorage
})
]
})
import Vue from 'vue'
import Vuex from 'vuex'
import createPersistedState from "vuex-persistedstate";
import constant from '../utils/constant'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
toolbar: {
visible: false,
enter: true
},
sortInfo: [],
currentUser: {},
currentAdmin: {},
webInfo: {
webName: "",
webTitle: [],
notices: [],
footer: "",
backgroundImage: "",
avatar: ""
},
playlist:3217120394
},
getters: {
articleTotal: state => {
if (state.sortInfo !== null && state.sortInfo.length !== 0) {
if (state.sortInfo.length === 1) {
return state.sortInfo[0].countOfSort;
} else {
return state.sortInfo.reduce((prev, curr) => {
if (typeof prev === "number") {
return prev + curr.countOfSort;
} else {
return prev.countOfSort + curr.countOfSort;
}
});
}
} else {
return 0;
}
},
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;
})
} else {
return [];
}
}
},
mutations: {
pushPlaylist(state, playlist){
state.pushPlaylist = playlist
},
changePlaylist(state, playlist){
state.playlist = playlist
},
changeToolbarStatus(state, toolbarState) {
state.toolbar = toolbarState;
},
loadSortInfo(state, sortInfo) {
state.sortInfo = sortInfo;
},
loadCurrentUser(state, user) {
state.currentUser = user;
},
loadCurrentAdmin(state, user) {
state.currentAdmin = user;
},
loadWebInfo(state, webInfo) {
webInfo.webTitle = webInfo.webTitle.split('');
webInfo.notices = JSON.parse(webInfo.notices);
state.webInfo = webInfo;
}
},
actions: {},
modules: {},
plugins: [
createPersistedState({
storage: window.localStorage
})
]
})

@ -1,164 +1,189 @@
import constant from "./constant";
import EMOJI from "../assets/json/emoji.json"
import CryptoJS from 'crypto-js';
export default {
mobile() {
let flag = navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i);
return flag && flag.length && flag.length > 0;
},
/**
* 判断是否为空
*/
isEmpty(value) {
if (typeof value === "undefined" || value === null || (typeof value === "string" && value.trim() === "") || (Array.prototype.isPrototypeOf(value) && value.length === 0) || (Object.prototype.isPrototypeOf(value) && Object.keys(value).length === 0)) {
return true;
} else {
return false;
}
},
/**
* 加密
*/
encrypt(plaintText) {
let options = {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
};
let key = CryptoJS.enc.Utf8.parse(constant.cryptojs_key);
let encryptedData = CryptoJS.AES.encrypt(plaintText, key, options);
return encryptedData.toString().replace(/\//g, "_").replace(/\+/g, "-");
},
/**
* 解密
*/
decrypt(encryptedBase64Str) {
let val = encryptedBase64Str.replace(/\-/g, '+').replace(/_/g, '/');
let options = {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
};
let key = CryptoJS.enc.Utf8.parse(constant.cryptojs_key);
let decryptedData = CryptoJS.AES.decrypt(val, key, options);
return CryptoJS.enc.Utf8.stringify(decryptedData);
},
/**
* 表情包转换
*/
faceReg(content) {
content = content.replace(/\[[^\[^\]]+\]/g, (word) => {
let arr = [];
EMOJI.forEach(element => {
arr = arr.concat(element.emote);
});
let index = arr.findIndex(function(item) {
return item.text === word;
});
if (index > -1) {
let url = arr[index].url
return '<img style="vertical-align: middle;width: 32px;height: 32px" src="' + url + '" title="' + word + '"/>';
} else {
return word;
}
});
return content;
},
/**
* 图片转换
*/
pictureReg(content) {
content = content.replace(/\<[^\<^\>]+\>/g, (word) => {
let index = word.indexOf(",");
if (index > -1) {
let arr = word.replace("<", "").replace(">", "").split(",");
return '<img style="border-radius: 5px;width: 100%;max-width: 250px;display: block" src="' + arr[1] + '" title="' + arr[0] + '"/>';
} else {
return word;
}
});
return content;
},
/**
* 字符串转换为时间戳
*/
getDateTimeStamp(dateStr) {
return Date.parse(dateStr.replace(/-/gi, "/"));
},
getDateDiff(dateStr) {
let publishTime = isNaN(Date.parse(dateStr.replace(/-/gi, "/")) / 1000) ? Date.parse(dateStr) / 1000 : Date.parse(dateStr.replace(/-/gi, "/")) / 1000;
let d_seconds,
d_minutes,
d_hours,
d_days,
timeNow = Math.floor(new Date().getTime() / 1000),
d,
date = new Date(publishTime * 1000),
Y = date.getFullYear(),
M = date.getMonth() + 1,
D = date.getDate(),
H = date.getHours(),
m = date.getMinutes(),
s = date.getSeconds();
//小于10的在前面补0
if (M < 10) {
M = '0' + M;
}
if (D < 10) {
D = '0' + D;
}
if (H < 10) {
H = '0' + H;
}
if (m < 10) {
m = '0' + m;
}
if (s < 10) {
s = '0' + s;
}
d = timeNow - publishTime;
d_days = Math.floor(d / 86400);
d_hours = Math.floor(d / 3600);
d_minutes = Math.floor(d / 60);
d_seconds = Math.floor(d);
if (d_days > 0 && d_days < 3) {
return d_days + '天前';
} else if (d_days <= 0 && d_hours > 0) {
return d_hours + '小时前';
} else if (d_hours <= 0 && d_minutes > 0) {
return d_minutes + '分钟前';
} else if (d_seconds < 60) {
if (d_seconds <= 0) {
return '刚刚发表';
} else {
return d_seconds + '秒前';
}
} else if (d_days >= 3) {
return Y + '-' + M + '-' + D + ' ' + H + ':' + m;
}
},
/**
* 保存资源
*/
saveResource(that, type, path, isAdmin = false) {
let resource = {
type: type,
path: path
};
that.$http.post(that.$constant.baseURL + "/resource/saveResource", resource, isAdmin)
.catch((error) => {
that.$message({
message: error.message,
type: "error"
});
});
}
}
import constant from "./constant";
import EMOJI from "../assets/json/emoji.json"
import CryptoJS from 'crypto-js';
export default {
mobile() {
let flag = navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i);
return flag && flag.length && flag.length > 0;
},
/**
* 判断是否为空
*/
isEmpty(value) {
if (typeof value === "undefined" || value === null || (typeof value === "string" && value.trim() === "") || (Array.prototype.isPrototypeOf(value) && value.length === 0) || (Object.prototype.isPrototypeOf(value) && Object.keys(value).length === 0)) {
return true;
} else {
return false;
}
},
/**
* 加密
*/
encrypt(plaintText) {
let options = {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
};
let key = CryptoJS.enc.Utf8.parse(constant.cryptojs_key);
let encryptedData = CryptoJS.AES.encrypt(plaintText, key, options);
return encryptedData.toString().replace(/\//g, "_").replace(/\+/g, "-");
},
/**
* 解密
*/
decrypt(encryptedBase64Str) {
let val = encryptedBase64Str.replace(/\-/g, '+').replace(/_/g, '/');
let options = {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
};
let key = CryptoJS.enc.Utf8.parse(constant.cryptojs_key);
let decryptedData = CryptoJS.AES.decrypt(val, key, options);
return CryptoJS.enc.Utf8.stringify(decryptedData);
},
/**
* 表情包转换
*/
faceReg(content) {
content = content.replace(/\[[^\[^\]]+\]/g, (word) => {
let arr = [];
EMOJI.forEach(element => {
arr = arr.concat(element.emote);
});
let index = arr.findIndex(function(item) {
return item.text === word;
});
if (index > -1) {
let url = arr[index].url
return '<img style="vertical-align: middle;width: 32px;height: 32px" src="' + url + '" title="' + word + '"/>';
} else {
return word;
}
});
return content;
},
loadAssets(assets) {
const head = document.getElementsByTagName('head')[0];
const loadAsset = (asset) => {
return new Promise((resolve, reject) => {
let element;
if (asset.type === 'js') {
element = document.createElement('script');
element.src = asset.src;
} else if (asset.type === 'css') {
element = document.createElement('link');
element.href = asset.src;
element.rel = 'stylesheet';
}
element.onload = () => {
console.log(`Loaded ${asset.type} file: ${asset.src}`);
resolve();
};
element.onerror = () => {
console.error(`Error loading ${asset.type} file: ${asset.src}`);
reject();
};
head.appendChild(element);
});
};
return Promise.all(assets.map(loadAsset));
},
/**
* 图片转换
*/
pictureReg(content) {
content = content.replace(/\<[^\<^\>]+\>/g, (word) => {
let index = word.indexOf(",");
if (index > -1) {
let arr = word.replace("<", "").replace(">", "").split(",");
return '<img style="border-radius: 5px;width: 100%;max-width: 250px;display: block" src="' + arr[1] + '" title="' + arr[0] + '"/>';
} else {
return word;
}
});
return content;
},
/**
* 字符串转换为时间戳
*/
getDateTimeStamp(dateStr) {
return Date.parse(dateStr.replace(/-/gi, "/"));
},
getDateDiff(dateStr) {
let publishTime = isNaN(Date.parse(dateStr.replace(/-/gi, "/")) / 1000) ? Date.parse(dateStr) / 1000 : Date.parse(dateStr.replace(/-/gi, "/")) / 1000;
let d_seconds,
d_minutes,
d_hours,
d_days,
timeNow = Math.floor(new Date().getTime() / 1000),
d,
date = new Date(publishTime * 1000),
Y = date.getFullYear(),
M = date.getMonth() + 1,
D = date.getDate(),
H = date.getHours(),
m = date.getMinutes(),
s = date.getSeconds();
//小于10的在前面补0
if (M < 10) {
M = '0' + M;
}
if (D < 10) {
D = '0' + D;
}
if (H < 10) {
H = '0' + H;
}
if (m < 10) {
m = '0' + m;
}
if (s < 10) {
s = '0' + s;
}
d = timeNow - publishTime;
d_days = Math.floor(d / 86400);
d_hours = Math.floor(d / 3600);
d_minutes = Math.floor(d / 60);
d_seconds = Math.floor(d);
if (d_days > 0 && d_days < 3) {
return d_days + '天前';
} else if (d_days <= 0 && d_hours > 0) {
return d_hours + '小时前';
} else if (d_hours <= 0 && d_minutes > 0) {
return d_minutes + '分钟前';
} else if (d_seconds < 60) {
if (d_seconds <= 0) {
return '刚刚发表';
} else {
return d_seconds + '秒前';
}
} else if (d_days >= 3) {
return Y + '-' + M + '-' + D + ' ' + H + ':' + m;
}
},
/**
* 保存资源
*/
saveResource(that, type, path, isAdmin = false) {
let resource = {
type: type,
path: path
};
that.$http.post(that.$constant.baseURL + "/resource/saveResource", resource, isAdmin)
.catch((error) => {
that.$message({
message: error.message,
type: "error"
});
});
}
}

@ -1,56 +1,73 @@
export default {
baseURL: `//${window.location.host}/api`,
imBaseURL: "http://localhost:81",
webURL: `//${window.location.host}/api`,
// baseURL: "//127.0.0.1:8080/",
// imBaseURL: "https://poetize.cn/im",
// webURL: "https://poetize.cn",
live2d_path: "https://cdn.jsdelivr.net/gh/stevenjoezhang/live2d-widget@latest/",
cdnPath: "https://cdn.jsdelivr.net/gh/fghrsh/live2d_api/",
waifuPath: "/webInfo/getWaifuJson",
hitokoto: "https://v1.hitokoto.cn",
tocbot: "https://cdnjs.cloudflare.com/ajax/libs/tocbot/4.11.1/tocbot.min.js",
jinrishici: "https://v1.jinrishici.com/all.json",
random_backImage_miaomc:"//api.miaomc.cn/image/get?",
random_image: "//img.xjh.me/random_img.php?return=302",
random_avatar:function(name){
return `https://api.multiavatar.com/${name}.svg`
},
//前后端定义的密钥AES使用16位
cryptojs_key: "aoligeimeimaobin",
qiniuUrl: "//upload-z2.qiniup.com",
qiniuDownload: "//qiniu.roginx.ink/",
friendBG: "//api.ixiaowai.cn/api/api.php",
friendLetterTop: "https://cdn.cbd.int/hexo-butterfly-envelope/lib/before.png",
friendLetterBottom: "https://cdn.cbd.int/hexo-butterfly-envelope/lib/after.png",
friendLetterBiLi: "https://cdn.cbd.int/hexo-butterfly-envelope/lib/line.png",
friendLetterMiddle: "https://cdn.cbd.int//hexo-butterfly-envelope/lib/violet.jpg",
before_color_list: ["#ff4b2b", "#EF794F", "#67C23A", "orange", "rgb(131, 123, 199)", "#23d5ab"],
tree_hole_color: ["#ee7752", "#e73c7e", "#23a6d5", "#23d5ab", "rgb(131, 123, 199)", "#23d5ab"],
two_poem_image: ["https://kanokano.cn/wp-content/uploads/topimg/banner.webp",
"https://s1.ax1x.com/2022/12/04/zsKh5V.jpg"],
before_color_1: "black",
after_color_1: "linear-gradient(45deg, #f43f3b, #ec008c)",
before_color_2: "rgb(131, 123, 199)",
after_color_2: "linear-gradient(45deg, #f43f3b, #ec008c)",
background:{
bangumi:"//mybox-1257251314.cos.ap-chengdu.myqcloud.com/upload/2022/8/29/166176340045213.jpg",
izone:"//mybox-1257251314.cos.ap-chengdu.myqcloud.com/blog/3c5356cb1303.jpg",
day_random:"//api.dujin.org/bing/1920.php",
view_random:"//api.ixiaowai.cn/gqapi/gqapi.php"
},
pageColor: "#ee7752",
commentPageColor: "#23d5ab",
userId: 1,
source: 0,
export default {
baseURL: `//${window.location.host}/api`,
imBaseURL: "http://localhost:81",
webURL: `//${window.location.host}/api`,
// baseURL: "//127.0.0.1:8080/",
// imBaseURL: "https://poetize.cn/im",
// webURL: "https://poetize.cn",
live2d_path: "https://cdn.jsdelivr.net/gh/stevenjoezhang/live2d-widget@latest/",
cdnPath: "https://cdn.jsdelivr.net/gh/fghrsh/live2d_api/",
waifuPath: "/webInfo/getWaifuJson",
hitokoto: "https://v1.hitokoto.cn",
tocbot: "https://cdnjs.cloudflare.com/ajax/libs/tocbot/4.11.1/tocbot.min.js",
jinrishici: "https://v1.jinrishici.com/all.json",
random_backImage_miaomc:"//api.miaomc.cn/image/get",
random_image: "https://api.miaomc.cn/image/other/360pic",
random_avatar:function(name){
return `https://api.multiavatar.com/${name}.svg`
},
//前后端定义的密钥AES使用16位
cryptojs_key: "aoligeimeimaobin",
qiniuUrl: "//upload-z2.qiniup.com",
qiniuDownload: "//qiniu.roginx.ink/",
friendBG: "//api.ixiaowai.cn/api/api.php",
friendLetterTop: "https://cdn.cbd.int/hexo-butterfly-envelope/lib/before.png",
friendLetterBottom: "https://cdn.cbd.int/hexo-butterfly-envelope/lib/after.png",
friendLetterBiLi: "https://cdn.cbd.int/hexo-butterfly-envelope/lib/line.png",
friendLetterMiddle: "https://cdn.cbd.int//hexo-butterfly-envelope/lib/violet.jpg",
before_color_list: ["#ff4b2b", "#EF794F", "#67C23A", "orange", "rgb(131, 123, 199)", "#23d5ab"],
tree_hole_color: ["#ee7752", "#e73c7e", "#23a6d5", "#23d5ab", "rgb(131, 123, 199)", "#23d5ab"],
two_poem_image: ["https://kanokano.cn/wp-content/uploads/topimg/banner.webp",
"https://s1.ax1x.com/2022/12/04/zsKh5V.jpg"],
before_color_1: "black",
after_color_1: "linear-gradient(45deg, #f43f3b, #ec008c)",
before_color_2: "rgb(131, 123, 199)",
after_color_2: "linear-gradient(45deg, #f43f3b, #ec008c)",
playlists:[370417370,3217120394,8266245120,513207088,504069643,3226523716,124092915],
ACGAPI:[
"https://img.paulzzh.com/touhou/random",
"https://api.ucany.net/acg-pc.php",
"https://api.yimian.xyz/img",
"https://cdn.seovx.com/d/?mom=302",
"https://imgapi.cn/api.php?fl=dongman&gs=images",
],
PICAPI:[
"https://imgapi.cn/api.php?zd=mobile&fl=meizi&gs=images",
"https://api.btstu.cn/sjbz/api.php",
"https://api.ddkjt.com/api/img_1.php",
"https://api.ddkjt.com/api/img_2.php",
"https://api.ucany.net/wallpaper-pc.php",
"https://cdn.seovx.com/?mom=302",
"https://cdn.seovx.com/ha/?mom=302",
"https://source.unsplash.com/random",
"https://source.unsplash.com/user/erondu/1600x900",
"https://source.unsplash.com/user/tkirkgoz/1600x900"
],
background:{
bangumi:"//mybox-1257251314.cos.ap-chengdu.myqcloud.com/upload/2022/8/29/166176340045213.jpg",
izone:"//mybox-1257251314.cos.ap-chengdu.myqcloud.com/blog/3c5356cb1303.jpg",
day_random:"//api.dujin.org/bing/1920.php",
view_random:"//api.ixiaowai.cn/gqapi/gqapi.php",
bing_random:"//api.miaomc.cn/image/other/bing"
},
pageColor: "#ee7752",
commentPageColor: "#23d5ab",
userId: 1,
source: 0,
}

@ -1,323 +1,323 @@
/*
* Live2D Widget
* https://github.com/stevenjoezhang/live2d-widget
*/
import constant from "./constant";
// 注意live2d_path 参数应使用绝对路径
const live2d_path = constant.live2d_path;
// 加载 waifu.css live2d.min.js
if (screen.width > 768) {
Promise.all([
loadExternalResource(live2d_path + "waifu.css", "css"),
loadExternalResource(live2d_path + "live2d.min.js", "js")
]).then(() => {
initWidget({
waifuPath: constant.baseURL + constant.waifuPath,
cdnPath: constant.cdnPath
});
});
}
// 封装异步加载资源的方法
function loadExternalResource(url, type) {
return new Promise((resolve, reject) => {
let tag;
if (type === "css") {
tag = document.createElement("link");
tag.rel = "stylesheet";
tag.href = url;
} else if (type === "js") {
tag = document.createElement("script");
tag.src = url;
}
if (tag) {
tag.onload = () => resolve(url);
tag.onerror = () => reject(url);
document.head.appendChild(tag);
}
});
}
function initWidget(config) {
document.body.insertAdjacentHTML("beforeend", `<div id="waifu-toggle">
<span>看板娘</span>
</div>`);
const toggle = document.getElementById("waifu-toggle");
toggle.addEventListener("click", () => {
toggle.classList.remove("waifu-toggle-active");
if (toggle.getAttribute("first-time")) {
loadWidget(config);
toggle.removeAttribute("first-time");
} else {
localStorage.removeItem("waifu-display");
document.getElementById("waifu").style.display = "";
setTimeout(() => {
document.getElementById("waifu").style.bottom = 0;
}, 0);
}
});
if (localStorage.getItem("waifu-display") && Date.now() - localStorage.getItem("waifu-display") <= 86400000) {
toggle.setAttribute("first-time", true);
setTimeout(() => {
toggle.classList.add("waifu-toggle-active");
}, 0);
} else {
loadWidget(config);
}
}
function loadWidget(config) {
// 配置路径
let {waifuPath, cdnPath} = config;
if (!cdnPath.endsWith("/")) cdnPath += "/";
let modelList, idx = 0;
// 插入html
localStorage.removeItem("waifu-display");
localStorage.removeItem("waifu-text");
document.body.insertAdjacentHTML("beforeend", `<div id="waifu">
<div id="waifu-tips"></div>
<canvas id="live2d" width="800" height="800"></canvas>
<!-- 工具 -->
<div id="waifu-tool">
<span class="fa fa-lg fa-comment"></span>
<span class="fa fa-lg fa-street-view"></span>
<span class="fa fa-lg fa-mouse-pointer"></span>
<span class="fa fa-lg fa-times"></span>
</div>
</div>`);
setTimeout(() => {
document.getElementById("waifu").style.bottom = 0;
}, 0);
// 检测用户活动状态,并在空闲时显示消息
let userAction = false,
userActionTimer,
messageTimer,
messageArray = ["好久不见,日子过得好快呢……", "大坏蛋!你都多久没理人家了呀,嘤嘤嘤~", "嗨~快来逗我玩吧!", "拿小拳拳锤你胸口!", "记得把小家加入 Adblock 白名单哦!"];
window.addEventListener("mousemove", () => userAction = true);
window.addEventListener("keydown", () => userAction = true);
setInterval(() => {
if (userAction) {
userAction = false;
clearInterval(userActionTimer);
userActionTimer = null;
} else if (!userActionTimer) {
userActionTimer = setInterval(() => {
showMessage(randomSelection(messageArray), 6000, 9);
}, 20000);
}
}, 1000);
// 监听器
(function registerEventListener() {
document.querySelector("#waifu-tool .fa-comment").addEventListener("click", showHitokoto);
document.querySelector("#waifu-tool .fa-street-view").addEventListener("click", loadRandModel);
document.querySelector("#waifu-tool .fa-mouse-pointer").addEventListener("click", changeMouseAnimation);
document.querySelector("#waifu-tool .fa-times").addEventListener("click", () => {
localStorage.setItem("waifu-display", Date.now());
showMessage("愿你有一天能与重要的人重逢。", 2000, 11);
document.getElementById("waifu").style.bottom = "-500px";
setTimeout(() => {
document.getElementById("waifu").style.display = "none";
document.getElementById("waifu-toggle").classList.add("waifu-toggle-active");
}, 3000);
});
const devtools = () => {
};
console.log("%c", devtools);
devtools.toString = () => {
showMessage("哈哈,你打开了控制台,是想要看看我的小秘密吗?", 6000, 9);
};
window.addEventListener("copy", () => {
showMessage("你都复制了些什么呀,转载要记得加上出处哦!", 6000, 9);
});
window.addEventListener("visibilitychange", () => {
if (!document.hidden) showMessage("哇,你终于回来了~", 6000, 9);
});
localStorage.setItem("showMouseAnimation", "1");
document.querySelector("body").addEventListener("click", mouseAnimation);
})();
// 欢迎页
(function welcomeMessage() {
let text;
if (location.pathname === "/") { // 如果是主页
const now = new Date().getHours();
if (now > 5 && now <= 7) text = "早上好!一日之计在于晨,美好的一天就要开始了。";
else if (now > 7 && now <= 11) text = "上午好!工作顺利嘛,不要久坐,多起来走动走动哦!";
else if (now > 11 && now <= 13) text = "中午了,工作了一个上午,现在是午餐时间!";
else if (now > 13 && now <= 17) text = "午后很容易犯困呢,今天的运动目标完成了吗?";
else if (now > 17 && now <= 19) text = "傍晚了!窗外夕阳的景色很美丽呢,最美不过夕阳红~";
else if (now > 19 && now <= 21) text = "晚上好,今天过得怎么样?";
else if (now > 21 && now <= 23) text = ["已经这么晚了呀,早点休息吧,晚安~", "深夜时要爱护眼睛呀!"];
else text = "你是夜猫子呀?这么晚还不睡觉,明天起的来嘛?";
} else if (document.referrer !== "") {
const referrer = new URL(document.referrer),
domain = referrer.hostname.split(".")[1];
if (location.hostname === referrer.hostname) text = `欢迎阅读<span>「${document.title.split(" - ")[0]}」</span>`;
else if (domain === "baidu") text = `Hello来自 百度搜索 的朋友<br>你是搜索 <span>${referrer.search.split("&wd=")[1].split("&")[0]}</span> 找到的我吗?`;
else if (domain === "so") text = `Hello来自 360搜索 的朋友<br>你是搜索 <span>${referrer.search.split("&q=")[1].split("&")[0]}</span> 找到的我吗?`;
else if (domain === "google") text = `Hello来自 谷歌搜索 的朋友<br>欢迎阅读<span>「${document.title.split(" - ")[0]}」</span>`;
else text = `Hello来自 <span>${referrer.hostname}</span> 的朋友`;
} else {
text = `欢迎阅读<span>「${document.title.split(" - ")[0]}」</span>`;
}
showMessage(text, 7000, 8);
})();
// 初始化模型
(function initModel() {
let modelId = localStorage.getItem("modelId");
if (modelId === null) {
// 首次访问加载 指定模型 的 指定材质
modelId = 5; // 模型 ID
}
loadModel(modelId);
fetch(waifuPath)
.then(response => response.json())
.then(result => {
window.addEventListener("mouseover", event => {
for (let {selector, text} of result.mouseover) {
if (!event.target.matches(selector)) continue;
text = randomSelection(text);
text = text.replace("{text}", event.target.innerText);
showMessage(text, 4000, 8);
return;
}
});
window.addEventListener("click", event => {
for (let {selector, text} of result.click) {
if (!event.target.matches(selector)) continue;
text = randomSelection(text);
text = text.replace("{text}", event.target.innerText);
showMessage(text, 4000, 8);
return;
}
});
result.seasons.forEach(({date, text}) => {
const now = new Date(),
after = date.split("-")[0],
before = date.split("-")[1] || after;
if ((after.split("/")[0] <= now.getMonth() + 1 && now.getMonth() + 1 <= before.split("/")[0]) && (after.split("/")[1] <= now.getDate() && now.getDate() <= before.split("/")[1])) {
text = randomSelection(text);
text = text.replace("{year}", now.getFullYear());
messageArray.push(text);
}
});
});
})();
// 模型集合
async function loadModelList() {
const response = await fetch(`${cdnPath}model_list.json`);
modelList = await response.json();
}
// 载入模型
async function loadModel(modelId, message) {
localStorage.setItem("modelId", modelId);
showMessage(message, 4000, 10);
if (!modelList) await loadModelList();
// const target = randomSelection(modelList.models[modelId]);
const target = "HyperdimensionNeptunia/blanc_swimwear";
loadlive2d("live2d", `${cdnPath}model/${target}/index.json`);
}
// 换肤
async function loadRandModel() {
const modelId = localStorage.getItem("modelId");
if (!modelList) await loadModelList();
const target = randomSelection(modelList.models[modelId]);
loadlive2d("live2d", `${cdnPath}model/${target}/index.json`);
showMessage("我的新衣服好看嘛?", 4000, 10);
}
// 换人
async function loadOtherModel() {
let modelId = localStorage.getItem("modelId");
if (!modelList) await loadModelList();
const index = (++modelId >= modelList.models.length) ? 0 : modelId;
loadModel(index, modelList.messages[index]);
}
// 转换鼠标动画
function changeMouseAnimation() {
if (localStorage.getItem("showMouseAnimation") === "0") {
localStorage.setItem("showMouseAnimation", "1");
document.querySelector("body").addEventListener("click", mouseAnimation);
showMessage("哈哈,要牢记社会主义核心价值观哦!", 6000, 9);
} else {
localStorage.setItem("showMouseAnimation", "0");
document.querySelector("body").removeEventListener("click", mouseAnimation);
showMessage("今天你爱国了吗?", 6000, 9);
}
}
// 鼠标动画
function mouseAnimation(e) {
let list = new Array("富强", "民主", "文明", "和谐", "自由", "平等", "公正", "法治", "爱国", "敬业", "诚信", "友善");
let span = $("<span>").text(list[idx]);
idx = (idx + 1) % list.length;
let x = e.pageX, y = e.pageY;
span.css({
"z-index": 1000,
"top": y - 20,
"left": x,
"position": "absolute",
"pointer-events": "none",
"font-weight": "bold",
"color": "#ff6651"
});
$("body").append(span);
span.animate({"top": y - 180, "opacity": 0}, 1500, function () {
span.remove();
});
}
// 随机选择
function randomSelection(obj) {
return Array.isArray(obj) ? obj[Math.floor(Math.random() * obj.length)] : obj;
}
// 随机词
function showHitokoto() {
// 增加 hitokoto.cn 的 API
fetch(constant.hitokoto)
.then(response => response.json())
.then(result => {
const text = `这句一言来自 <span>「${result.from}」</span>,是 <span>${result.creator}</span> 在 hitokoto.cn 投稿的。`;
showMessage(result.hitokoto, 6000, 9);
setTimeout(() => {
showMessage(text, 4000, 9);
}, 6000);
});
}
// 显示消息
function showMessage(text, timeout, priority) {
if (!text || (localStorage.getItem("waifu-text") && localStorage.getItem("waifu-text") > priority)) return;
if (messageTimer) {
clearTimeout(messageTimer);
messageTimer = null;
}
text = randomSelection(text);
localStorage.setItem("waifu-text", priority);
const tips = document.getElementById("waifu-tips");
tips.innerHTML = text;
tips.classList.add("waifu-tips-active");
messageTimer = setTimeout(() => {
localStorage.removeItem("waifu-text");
tips.classList.remove("waifu-tips-active");
}, timeout);
}
}
/*
* Live2D Widget
* https://github.com/stevenjoezhang/live2d-widget
*/
import constant from "./constant";
// 注意live2d_path 参数应使用绝对路径
const live2d_path = constant.live2d_path;
// 加载 waifu.css live2d.min.js
if (screen.width > 768) {
Promise.all([
loadExternalResource(live2d_path + "waifu.css", "css"),
loadExternalResource(live2d_path + "live2d.min.js", "js")
]).then(() => {
initWidget({
waifuPath: constant.baseURL + constant.waifuPath,
cdnPath: constant.cdnPath
});
});
}
// 封装异步加载资源的方法
function loadExternalResource(url, type) {
return new Promise((resolve, reject) => {
let tag;
if (type === "css") {
tag = document.createElement("link");
tag.rel = "stylesheet";
tag.href = url;
} else if (type === "js") {
tag = document.createElement("script");
tag.src = url;
}
if (tag) {
tag.onload = () => resolve(url);
tag.onerror = () => reject(url);
document.head.appendChild(tag);
}
});
}
function initWidget(config) {
document.body.insertAdjacentHTML("beforeend", `<div id="waifu-toggle">
<span>看板娘</span>
</div>`);
const toggle = document.getElementById("waifu-toggle");
toggle.addEventListener("click", () => {
toggle.classList.remove("waifu-toggle-active");
if (toggle.getAttribute("first-time")) {
loadWidget(config);
toggle.removeAttribute("first-time");
} else {
localStorage.removeItem("waifu-display");
document.getElementById("waifu").style.display = "";
setTimeout(() => {
document.getElementById("waifu").style.bottom = 0;
}, 0);
}
});
if (localStorage.getItem("waifu-display") && Date.now() - localStorage.getItem("waifu-display") <= 86400000) {
toggle.setAttribute("first-time", true);
setTimeout(() => {
toggle.classList.add("waifu-toggle-active");
}, 0);
} else {
loadWidget(config);
}
}
function loadWidget(config) {
// 配置路径
let {waifuPath, cdnPath} = config;
if (!cdnPath.endsWith("/")) cdnPath += "/";
let modelList, idx = 0;
// 插入html
localStorage.removeItem("waifu-display");
localStorage.removeItem("waifu-text");
document.body.insertAdjacentHTML("beforeend", `<div id="waifu">
<div id="waifu-tips"></div>
<canvas id="live2d" width="800" height="800"></canvas>
<!-- 工具 -->
<div id="waifu-tool">
<span class="fa fa-lg fa-comment"></span>
<span class="fa fa-lg fa-street-view"></span>
<span class="fa fa-lg fa-mouse-pointer"></span>
<span class="fa fa-lg fa-times"></span>
</div>
</div>`);
setTimeout(() => {
document.getElementById("waifu").style.bottom = 0;
}, 0);
// 检测用户活动状态,并在空闲时显示消息
let userAction = false,
userActionTimer,
messageTimer,
messageArray = ["好久不见,日子过得好快呢……", "大坏蛋!你都多久没理人家了呀,嘤嘤嘤~", "嗨~快来逗我玩吧!", "拿小拳拳锤你胸口!", "记得把小家加入 Adblock 白名单哦!"];
window.addEventListener("mousemove", () => userAction = true);
window.addEventListener("keydown", () => userAction = true);
setInterval(() => {
if (userAction) {
userAction = false;
clearInterval(userActionTimer);
userActionTimer = null;
} else if (!userActionTimer) {
userActionTimer = setInterval(() => {
showMessage(randomSelection(messageArray), 6000, 9);
}, 20000);
}
}, 1000);
// 监听器
(function registerEventListener() {
document.querySelector("#waifu-tool .fa-comment").addEventListener("click", showHitokoto);
document.querySelector("#waifu-tool .fa-street-view").addEventListener("click", loadRandModel);
document.querySelector("#waifu-tool .fa-mouse-pointer").addEventListener("click", changeMouseAnimation);
document.querySelector("#waifu-tool .fa-times").addEventListener("click", () => {
localStorage.setItem("waifu-display", Date.now());
showMessage("愿你有一天能与重要的人重逢。", 2000, 11);
document.getElementById("waifu").style.bottom = "-500px";
setTimeout(() => {
document.getElementById("waifu").style.display = "none";
document.getElementById("waifu-toggle").classList.add("waifu-toggle-active");
}, 3000);
});
const devtools = () => {
};
console.log("%c", devtools);
devtools.toString = () => {
showMessage("哈哈,你打开了控制台,是想要看看我的小秘密吗?", 6000, 9);
};
window.addEventListener("copy", () => {
showMessage("你都复制了些什么呀,转载要记得加上出处哦!", 6000, 9);
});
window.addEventListener("visibilitychange", () => {
if (!document.hidden) showMessage("哇,你终于回来了~", 6000, 9);
});
localStorage.setItem("showMouseAnimation", "1");
document.querySelector("body").addEventListener("click", mouseAnimation);
})();
// 欢迎页
(function welcomeMessage() {
let text;
if (location.pathname === "/") { // 如果是主页
const now = new Date().getHours();
if (now > 5 && now <= 7) text = "早上好!一日之计在于晨,美好的一天就要开始了。";
else if (now > 7 && now <= 11) text = "上午好!工作顺利嘛,不要久坐,多起来走动走动哦!";
else if (now > 11 && now <= 13) text = "中午了,工作了一个上午,现在是午餐时间!";
else if (now > 13 && now <= 17) text = "午后很容易犯困呢,今天的运动目标完成了吗?";
else if (now > 17 && now <= 19) text = "傍晚了!窗外夕阳的景色很美丽呢,最美不过夕阳红~";
else if (now > 19 && now <= 21) text = "晚上好,今天过得怎么样?";
else if (now > 21 && now <= 23) text = ["已经这么晚了呀,早点休息吧,晚安~", "深夜时要爱护眼睛呀!"];
else text = "你是夜猫子呀?这么晚还不睡觉,明天起的来嘛?";
} else if (document.referrer !== "") {
const referrer = new URL(document.referrer),
domain = referrer.hostname.split(".")[1];
if (location.hostname === referrer.hostname) text = `欢迎阅读<span>「${document.title.split(" - ")[0]}」</span>`;
else if (domain === "baidu") text = `Hello来自 百度搜索 的朋友<br>你是搜索 <span>${referrer.search.split("&wd=")[1].split("&")[0]}</span> 找到的我吗?`;
else if (domain === "so") text = `Hello来自 360搜索 的朋友<br>你是搜索 <span>${referrer.search.split("&q=")[1].split("&")[0]}</span> 找到的我吗?`;
else if (domain === "google") text = `Hello来自 谷歌搜索 的朋友<br>欢迎阅读<span>「${document.title.split(" - ")[0]}」</span>`;
else text = `Hello来自 <span>${referrer.hostname}</span> 的朋友`;
} else {
text = `欢迎阅读<span>「${document.title.split(" - ")[0]}」</span>`;
}
showMessage(text, 7000, 8);
})();
// 初始化模型
(function initModel() {
let modelId = localStorage.getItem("modelId");
if (modelId === null) {
// 首次访问加载 指定模型 的 指定材质
modelId = 5; // 模型 ID
}
loadModel(modelId);
fetch(waifuPath)
.then(response => response.json())
.then(result => {
window.addEventListener("mouseover", event => {
for (let {selector, text} of result.mouseover) {
if (!event.target.matches(selector)) continue;
text = randomSelection(text);
text = text.replace("{text}", event.target.innerText);
showMessage(text, 4000, 8);
return;
}
});
window.addEventListener("click", event => {
for (let {selector, text} of result.click) {
if (!event.target.matches(selector)) continue;
text = randomSelection(text);
text = text.replace("{text}", event.target.innerText);
showMessage(text, 4000, 8);
return;
}
});
result.seasons.forEach(({date, text}) => {
const now = new Date(),
after = date.split("-")[0],
before = date.split("-")[1] || after;
if ((after.split("/")[0] <= now.getMonth() + 1 && now.getMonth() + 1 <= before.split("/")[0]) && (after.split("/")[1] <= now.getDate() && now.getDate() <= before.split("/")[1])) {
text = randomSelection(text);
text = text.replace("{year}", now.getFullYear());
messageArray.push(text);
}
});
});
})();
// 模型集合
async function loadModelList() {
const response = await fetch(`${cdnPath}model_list.json`);
modelList = await response.json();
}
// 载入模型
async function loadModel(modelId, message) {
localStorage.setItem("modelId", modelId);
showMessage(message, 4000, 10);
if (!modelList) await loadModelList();
// const target = randomSelection(modelList.models[modelId]);
const target = "HyperdimensionNeptunia/blanc_swimwear";
loadlive2d("live2d", `${cdnPath}model/${target}/index.json`);
}
// 换肤
async function loadRandModel() {
const modelId = localStorage.getItem("modelId");
if (!modelList) await loadModelList();
const target = randomSelection(modelList.models[modelId]);
loadlive2d("live2d", `${cdnPath}model/${target}/index.json`);
showMessage("我的新衣服好看嘛?", 4000, 10);
}
// 换人
async function loadOtherModel() {
let modelId = localStorage.getItem("modelId");
if (!modelList) await loadModelList();
const index = (++modelId >= modelList.models.length) ? 0 : modelId;
loadModel(index, modelList.messages[index]);
}
// 转换鼠标动画
function changeMouseAnimation() {
if (localStorage.getItem("showMouseAnimation") === "0") {
localStorage.setItem("showMouseAnimation", "1");
document.querySelector("body").addEventListener("click", mouseAnimation);
showMessage("哈哈,要牢记社会主义核心价值观哦!", 6000, 9);
} else {
localStorage.setItem("showMouseAnimation", "0");
document.querySelector("body").removeEventListener("click", mouseAnimation);
showMessage("今天你爱国了吗?", 6000, 9);
}
}
// 鼠标动画
function mouseAnimation(e) {
let list = new Array("富强", "民主", "文明", "和谐", "自由", "平等", "公正", "法治", "爱国", "敬业", "诚信", "友善");
let span = $("<span>").text(list[idx]);
idx = (idx + 1) % list.length;
let x = e.pageX, y = e.pageY;
span.css({
"z-index": 1000,
"top": y - 20,
"left": x,
"position": "absolute",
"pointer-events": "none",
"font-weight": "bold",
"color": "#ff6651"
});
$("body").append(span);
span.animate({"top": y - 180, "opacity": 0}, 1500, function () {
span.remove();
});
}
// 随机选择
function randomSelection(obj) {
return Array.isArray(obj) ? obj[Math.floor(Math.random() * obj.length)] : obj;
}
// 随机词
function showHitokoto() {
// 增加 hitokoto.cn 的 API
fetch(constant.hitokoto)
.then(response => response.json())
.then(result => {
const text = `这句一言来自 <span>「${result.from}」</span>,是 <span>${result.creator}</span> 在 hitokoto.cn 投稿的。`;
showMessage(result.hitokoto, 6000, 9);
setTimeout(() => {
showMessage(text, 4000, 9);
}, 6000);
});
}
// 显示消息
function showMessage(text, timeout, priority) {
if (!text || (localStorage.getItem("waifu-text") && localStorage.getItem("waifu-text") > priority)) return;
if (messageTimer) {
clearTimeout(messageTimer);
messageTimer = null;
}
text = randomSelection(text);
localStorage.setItem("waifu-text", priority);
const tips = document.getElementById("waifu-tips");
tips.innerHTML = text;
tips.classList.add("waifu-tips-active");
messageTimer = setTimeout(() => {
localStorage.removeItem("waifu-text");
tips.classList.remove("waifu-tips-active");
}, timeout);
}
}

@ -0,0 +1,144 @@
export default {
/**
* 从一个个书中获取属性
*/
getAttr(doc,str){
let selector = "";
top.testEle = doc;
let sq = str?.split("@");// 必然分出前面tag. 或class. 或id. 最后是 某个属性或者text html
for (let index = 0; index < sq.length-1; index++) {
let regex = /^(\w+)\.([\w\s-]+)(?:\.(\d+))?$/
let parm = sq[index].match(regex);
if(parm[1]=="tag"){
selector = selector + parm[2];
if(parm[3]) {
selector = selector + `:eq(${parm[3]})`
}
}
if(parm[1]=="class"){
selector = selector + `[class*='${parm[2]}']`
if(parm[3]) {
selector = selector + `:eq(${parm[3]})`
}
}
if(parm[2]=="id"){
selector = selector + `[id*='${parm[2]}']`
}
selector = selector + " ";
}
let res = undefined;
if(sq[sq.length-1]){
if(sq[sq.length-1]=="text"){
let result = $(doc).find(selector);
if(result.length>1) {
res = result.map(function(index, item) {
return $(item)?.text()
});
} else {
res = $(doc).find(selector)?.text()
}
} else {
let result = $(doc).find(selector);
if(result.length>1) {
res = result.map(function(index, item) {
return $(item)?.attr(sq[sq.length-1])
});
} else {
res = $(doc).find(selector)?.attr(sq[sq.length-1])
}
}
}
return res;
},
getBookPreview(doc,str){
return {
"bookItem": doc,
"bookUrl": this.getAttr(doc,str.bookUrl),
"realUrl": this.getAttr(doc,str.realUrl),
"coverUrl": this.getAttr(doc,str.coverUrl),
"kind": this.getAttr(doc,str.kind),
"name": this.getAttr(doc,str.name)
}
},
getBookContent(doc,str){
return {
"content":this.selector(doc,str),
}
},
getBookInfo(doc,str){
return {
"bookItem": doc,
"coverUrl": this.getAttr(doc,str.coverUrl),
// "init": "",
"intro": this.getAttr(doc,str.intro),
"kind": this.getAttr(doc,str.kind),
"name": this.getAttr(doc,str.name),
}
},
selector(doc,str){
let selector = "";
let sq = str.split("@");// 必然分出前面tag. 或class. 或id. 最后是 某个属性或者text html
for (let index = 0; index < sq.length; index++) {
let regex = /^(\w+)\.([\w\s-]+)(?:\.(\d+))?$/
let parm = sq[index].match(regex);
if(parm[1]=="tag"){
selector = selector + parm[2];
if(parm[3]) {
selector = selector + `:eq(${parm[3]})`
}
}
if(parm[1]=="class"){
selector = selector + `[class*='${parm[2]}']`
if(parm[3]) {
selector = selector + `:eq(${parm[3]})`
}
}
if(parm[2]=="id"){
selector = selector + `[id*='${parm[2]}']`
}
selector = selector + " ";
}
console.log("selector,",doc.find(selector));
return doc.find(selector);
},
//返回搜索页面
ruleSearch(source,key){
return fetch('/api/scrape', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ url: source.searchUrl.replace("{{key}}",key)??this.$route.query.url })
})
.then(response => response.text())
.then(html => {
const doc = $(html);
return doc;
})
.catch(error => console.error(error));
},
ruleBookInfo(source,key){
return fetch('/api/scrape', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ url: source.bookSourceUrl + key ?? this.$route.query.url })
})
.then(response => response.text())
.then(html => {
const doc = $(html);
return doc;
})
.catch(error => console.error(error));
},
ruleContent(source,key){
return fetch('/api/scrape', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ url: source.bookSourceUrl + key ?? this.$route.query.url })
})
.then(response => response.text())
.then(html => {
const doc = $(html);
return doc;
})
.catch(error => console.error(error));
}
}

@ -1,37 +1,61 @@
module.exports = {
devServer: {
// 代理配置
proxy: {
'/v': {
target: 'http://janxland.xyz/v/',
changeOrigin: true,
headers: {
Host: 'www.janxland.xyz'
},
pathRewrite: {
'/v': ''
}
},
'/api': {
target: 'http://janxland.xyz/ablaze/',
changeOrigin: true,
headers: {
Host: 'www.janxland.xyz'
},
pathRewrite: {
'/api': '/'
}
},
'/mapi163/weapi': {
target: 'http://janxland.xyz/',
changeOrigin: true,
headers: {
Host: 'www.janxland.xyz'
},
pathRewrite: {
'/mapi163/weapi': '/mapi163/weapi'
}
},
}
}
module.exports = {
devServer: {
// 代理配置
proxy: {
'/getIp': {
target: 'http://ip-api.com/json/?lang=zh-CN',
changeOrigin: true,
pathRewrite: {
'/getIp': ''
}
},
'/api/scrape': {
target: 'http://localhost:3000/scrape/',
changeOrigin: true,
headers: {
Host: 'aurora.roginx.ink'
},
pathRewrite: {
'/api/scrape': ''
}
},
'/api/aurora': {
target: 'http://aurora.roginx.ink/aurora/',
changeOrigin: true,
headers: {
Host: 'aurora.roginx.ink'
},
pathRewrite: {
'/api/aurora': ''
}
},
'/v': {
target: 'http://aurora.roginx.ink/v/',
changeOrigin: true,
headers: {
Host: 'aurora.roginx.ink'
},
pathRewrite: {
'/v': ''
}
},
'/api': {
target: 'http://aurora.roginx.ink/ablaze/',
changeOrigin: true,
headers: {
Host: 'aurora.roginx.ink'
},
pathRewrite: {
'/api': '/'
}
},
'/mapi163/weapi': {
target: 'http://aurora.roginx.ink/',
changeOrigin: true,
headers: {
Host: 'aurora.roginx.ink'
},
},
}
}
}

17363
yarn.lock

File diff suppressed because it is too large Load Diff
Loading…
Cancel
Save