├── 推荐插件 ├── DoubanBoard │ ├── cache │ │ └── .gitignore │ ├── assets │ │ ├── rating.png │ │ └── DoubanBoard.09.css │ └── Plugin.php ├── Links │ ├── nopic.png │ ├── Update_Mysql.sql │ ├── SQLite.sql │ ├── Mysql.sql │ ├── LICENSE │ ├── Update_SQLite.sql │ ├── README.md │ └── Action.php └── QPlayer2 │ ├── libs │ ├── cache │ │ ├── SQLite.sql │ │ ├── PgSQL.sql │ │ ├── MySQL.sql │ │ ├── Redis.php │ │ ├── Memcached.php │ │ ├── Cache.php │ │ └── Database.php │ ├── Config.php │ └── General_Config.php │ ├── LICENSE │ ├── README.md │ ├── assets │ └── QPlayer-plugin.js │ └── Action.php ├── vCards ├── screenshot.png ├── assets │ ├── img │ │ ├── cover.png │ │ ├── sj │ │ │ ├── 1.jpg │ │ │ ├── 2.jpg │ │ │ ├── 3.jpg │ │ │ ├── 4.jpg │ │ │ └── 5.jpg │ │ ├── header.jpg │ │ ├── tag │ │ │ └── tag.jpg │ │ ├── image_header.jpg │ │ └── logo-1.svg │ ├── icons │ │ ├── icomoon.woff │ │ ├── icomoon.woff2 │ │ ├── icon-up.svg │ │ ├── iconSearch.svg │ │ ├── icon-quote-dark.svg │ │ ├── icon-quote.svg │ │ ├── message-square.svg │ │ ├── say.svg │ │ ├── book.svg │ │ ├── logs.svg │ │ ├── user.svg │ │ ├── Travellings.svg │ │ ├── music.svg │ │ ├── image.svg │ │ ├── package.svg │ │ ├── icon-news.svg │ │ ├── users.svg │ │ ├── film.svg │ │ ├── icon-experience.svg │ │ ├── emoji │ │ │ ├── emoji-shocked-3.svg │ │ │ ├── emoji-sweating.svg │ │ │ ├── emoji-happy-2.svg │ │ │ ├── emoji-wink.svg │ │ │ ├── emoji-sad.svg │ │ │ ├── emoji-thinking.svg │ │ │ ├── emoji-laughing.svg │ │ │ ├── emoji-sad-2.svg │ │ │ ├── emoji-shocked.svg │ │ │ ├── emoji-angry.svg │ │ │ ├── emoji-shocked-2.svg │ │ │ ├── emoji-happy.svg │ │ │ ├── emoji-in-love.svg │ │ │ ├── emoji-in-love (1).svg │ │ │ ├── emoji-happy-3.svg │ │ │ ├── emoji-crazy.svg │ │ │ ├── emoji-bad.svg │ │ │ ├── emoji-nerd.svg │ │ │ └── emoji-pressure.svg │ │ ├── icon-app.svg │ │ ├── icon-education.svg │ │ └── icon-photo.svg │ ├── js │ │ └── mapbox.init.js │ ├── styles │ │ └── options.js │ └── owo │ │ └── OwO.min.css ├── page.php ├── page-Messages.php ├── page-Music.php ├── layout │ ├── sidebar.php │ └── footer.php ├── page-About.php ├── page-Links.php ├── page-Archives.php ├── page-Films.php ├── page-Photos.php ├── index.php ├── archive.php ├── page-Works.php ├── page-Cross.php ├── post.php ├── page-Say.php ├── page-More.php ├── 404.php └── page-Logs.php └── README.md /推荐插件/DoubanBoard/cache/.gitignore: -------------------------------------------------------------------------------- 1 | *.json 2 | !.gitignore -------------------------------------------------------------------------------- /vCards/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SuGradi/Typecho-vCards-theme/HEAD/vCards/screenshot.png -------------------------------------------------------------------------------- /推荐插件/Links/nopic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SuGradi/Typecho-vCards-theme/HEAD/推荐插件/Links/nopic.png -------------------------------------------------------------------------------- /vCards/assets/img/cover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SuGradi/Typecho-vCards-theme/HEAD/vCards/assets/img/cover.png -------------------------------------------------------------------------------- /vCards/assets/img/sj/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SuGradi/Typecho-vCards-theme/HEAD/vCards/assets/img/sj/1.jpg -------------------------------------------------------------------------------- /vCards/assets/img/sj/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SuGradi/Typecho-vCards-theme/HEAD/vCards/assets/img/sj/2.jpg -------------------------------------------------------------------------------- /vCards/assets/img/sj/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SuGradi/Typecho-vCards-theme/HEAD/vCards/assets/img/sj/3.jpg -------------------------------------------------------------------------------- /vCards/assets/img/sj/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SuGradi/Typecho-vCards-theme/HEAD/vCards/assets/img/sj/4.jpg -------------------------------------------------------------------------------- /vCards/assets/img/sj/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SuGradi/Typecho-vCards-theme/HEAD/vCards/assets/img/sj/5.jpg -------------------------------------------------------------------------------- /vCards/assets/img/header.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SuGradi/Typecho-vCards-theme/HEAD/vCards/assets/img/header.jpg -------------------------------------------------------------------------------- /vCards/assets/img/tag/tag.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SuGradi/Typecho-vCards-theme/HEAD/vCards/assets/img/tag/tag.jpg -------------------------------------------------------------------------------- /vCards/assets/icons/icomoon.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SuGradi/Typecho-vCards-theme/HEAD/vCards/assets/icons/icomoon.woff -------------------------------------------------------------------------------- /vCards/assets/icons/icomoon.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SuGradi/Typecho-vCards-theme/HEAD/vCards/assets/icons/icomoon.woff2 -------------------------------------------------------------------------------- /vCards/assets/img/image_header.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SuGradi/Typecho-vCards-theme/HEAD/vCards/assets/img/image_header.jpg -------------------------------------------------------------------------------- /推荐插件/DoubanBoard/assets/rating.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SuGradi/Typecho-vCards-theme/HEAD/推荐插件/DoubanBoard/assets/rating.png -------------------------------------------------------------------------------- /推荐插件/QPlayer2/libs/cache/SQLite.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE `%table%` ( 2 | `key` VARCHAR(32) NOT NULL PRIMARY KEY, 3 | `data` TEXT, 4 | `time` INT(10) DEFAULT NULL 5 | ); -------------------------------------------------------------------------------- /推荐插件/QPlayer2/libs/cache/PgSQL.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE "%table%" ( 2 | "key" CHAR(32) NOT NULL, 3 | "data" TEXT NOT NULL, 4 | "time" INT NOT NULL, 5 | PRIMARY KEY ("key") 6 | ); -------------------------------------------------------------------------------- /推荐插件/QPlayer2/libs/cache/MySQL.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE `%table%` ( 2 | `key` CHAR(32) NOT NULL, 3 | `data` MEDIUMTEXT NOT NULL, 4 | `time` INT(10) NOT NULL, 5 | PRIMARY KEY (`key`) 6 | ) ENGINE=MyISAM DEFAULT CHARSET=utf8; -------------------------------------------------------------------------------- /推荐插件/QPlayer2/libs/Config.php: -------------------------------------------------------------------------------- 1 | plugin('QPlayer2'); 12 | } 13 | } -------------------------------------------------------------------------------- /推荐插件/Links/Update_Mysql.sql: -------------------------------------------------------------------------------- 1 | ALTER TABLE `typecho_links` 2 | /* 3 | ADD `sort` varchar(50) DEFAULT NULL COMMENT 'links分类' AFTER `url`, 4 | ADD `image` varchar(200) DEFAULT NULL COMMENT 'links图片' AFTER `sort`, 5 | ADD `user` varchar(200) DEFAULT NULL COMMENT '自定义' AFTER `description`, 6 | */ 7 | ADD `email` varchar(50) DEFAULT NULL COMMENT 'links邮箱' AFTER `sort`, 8 | ADD `state` int(10) DEFAULT '1' COMMENT 'links状态' AFTER `user`; 9 | -------------------------------------------------------------------------------- /推荐插件/Links/SQLite.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE `typecho_links` ( 2 | `lid` INTEGER NOT NULL PRIMARY KEY, 3 | `name` varchar(50) DEFAULT NULL, 4 | `url` varchar(200) DEFAULT NULL, 5 | `sort` varchar(50) DEFAULT NULL, 6 | `email` varchar(50) DEFAULT NULL, 7 | `image` varchar(200) DEFAULT NULL, 8 | `description` varchar(200) DEFAULT NULL, 9 | `user` varchar(200) DEFAULT NULL, 10 | `state` int(10) DEFAULT '1', 11 | `order` int(10) DEFAULT '0' 12 | ); 13 | -------------------------------------------------------------------------------- /推荐插件/QPlayer2/libs/General_Config.php: -------------------------------------------------------------------------------- 1 | config = $config->general; 12 | } 13 | 14 | public function getBool($key) 15 | { 16 | return in_array($key, $this->config); 17 | } 18 | 19 | public function getBoolString($key) 20 | { 21 | return $this->getBool($key) ? 'true' : 'false'; 22 | } 23 | } -------------------------------------------------------------------------------- /推荐插件/Links/Mysql.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE `typecho_links` ( 2 | `lid` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'links表主键', 3 | `name` varchar(50) DEFAULT NULL COMMENT 'links名称', 4 | `url` varchar(200) DEFAULT NULL COMMENT 'links网址', 5 | `sort` varchar(50) DEFAULT NULL COMMENT 'links分类', 6 | `email` varchar(50) DEFAULT NULL COMMENT 'links邮箱', 7 | `image` varchar(200) DEFAULT NULL COMMENT 'links图片', 8 | `description` varchar(200) DEFAULT NULL COMMENT 'links描述', 9 | `user` varchar(200) DEFAULT NULL COMMENT '自定义', 10 | `state` int(10) DEFAULT '1' COMMENT 'links状态', 11 | `order` int(10) UNSIGNED DEFAULT '0' COMMENT 'links排序', 12 | PRIMARY KEY (`lid`) 13 | ) ENGINE=MYISAM DEFAULT CHARSET=%charset%; 14 | -------------------------------------------------------------------------------- /vCards/assets/icons/icon-up.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vCards/assets/icons/iconSearch.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vCards/page.php: -------------------------------------------------------------------------------- 1 | 2 | need('layout/header.php'); ?> 3 | need('layout/sidebar.php'); ?> 4 | 5 |
6 |
7 |
8 |
9 |

[ 10 | title() ?>] 11 |

12 |
13 |
14 | content(); ?> 15 |
16 |
17 | need('layout/comments.php'); ?> 18 |
19 | need('layout/footer.php'); ?> -------------------------------------------------------------------------------- /推荐插件/QPlayer2/libs/cache/Redis.php: -------------------------------------------------------------------------------- 1 | redis = new \Redis(); 20 | $this->redis->connect($host, $port); 21 | } 22 | 23 | public function set($key, $data, $expire = 86400) 24 | { 25 | $this->redis->setex($this->getKey($key), $expire, $data); 26 | } 27 | 28 | public function get($key) 29 | { 30 | return $this->redis->get($this->getKey($key)); 31 | } 32 | 33 | public function uninstall() 34 | { 35 | $this->redis->del($this->redis->keys($this->prefix . '*')); 36 | } 37 | } -------------------------------------------------------------------------------- /vCards/assets/icons/icon-quote-dark.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /vCards/assets/js/mapbox.init.js: -------------------------------------------------------------------------------- 1 | mapboxgl.accessToken = 'pk.eyJ1IjoiYXJ0dGVtcGxhdGUiLCJhIjoiY2s0M3I5ZHgzMGEzNDNucXM1cDd0dzl3cSJ9.a2wjLlxz8LzWj9nIoGsshw'; 2 | var map = new mapboxgl.Map({ 3 | container: 'map', 4 | style: 'mapbox://styles/mapbox/light-v10', 5 | center: [-73.9751,40.7289], // starting position 6 | zoom: 13 // starting zoom 7 | }); 8 | 9 | // create the popup 10 | var popup = new mapboxgl.Popup({ offset: 40 }).setText( 11 | '756 Livingston Street, Brooklyn, NY 11201' 12 | ); 13 | 14 | // create DOM element for the marker 15 | var el = document.createElement('div'); 16 | el.id = 'marker'; 17 | 18 | // create the marker 19 | new mapboxgl.Marker(el) 20 | .setLngLat([-73.9751,40.7289]) 21 | .setPopup(popup) // sets a popup on this marker 22 | .addTo(map); 23 | 24 | // Add zoom and rotation controls to the map. 25 | map.addControl(new mapboxgl.NavigationControl(), 'bottom-right'); 26 | 27 | // disable map zoom when using scroll 28 | map.scrollZoom.disable(); -------------------------------------------------------------------------------- /vCards/assets/icons/icon-quote.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vCards/assets/icons/message-square.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vCards/assets/icons/say.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /推荐插件/Links/LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 懵仙兔兔 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /推荐插件/QPlayer2/LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Moeshin 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /vCards/assets/icons/book.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vCards/assets/icons/logs.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vCards/assets/icons/user.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /推荐插件/Links/Update_SQLite.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE `typecho_links_upgrade` ( 2 | `lid` INTEGER NOT NULL PRIMARY KEY, 3 | `name` varchar(50) DEFAULT NULL, 4 | `url` varchar(200) DEFAULT NULL, 5 | `sort` varchar(50) DEFAULT NULL, 6 | `email` varchar(50) DEFAULT NULL, 7 | `image` varchar(200) DEFAULT NULL, 8 | `description` varchar(200) DEFAULT NULL, 9 | `user` varchar(200) DEFAULT NULL, 10 | `state` int(10) DEFAULT '1', 11 | `order` int(10) DEFAULT '0' 12 | ); 13 | INSERT INTO `typecho_links_upgrade` (`lid`, `name`, `url`, `sort`, `email`, `image`, `description`, `user`, `state`, `order`) 14 | SELECT `lid`, `name`, `url`, NULL, NULL, NULL, `description`, NULL, NULL, `order` FROM `typecho_links`; 15 | DROP TABLE `typecho_links`; 16 | CREATE TABLE `typecho_links` ( 17 | `lid` INTEGER NOT NULL PRIMARY KEY, 18 | `name` varchar(50) DEFAULT NULL, 19 | `url` varchar(200) DEFAULT NULL, 20 | `sort` varchar(50) DEFAULT NULL, 21 | `email` varchar(50) DEFAULT NULL, 22 | `image` varchar(200) DEFAULT NULL, 23 | `description` varchar(200) DEFAULT NULL, 24 | `user` varchar(200) DEFAULT NULL, 25 | `state` int(10) DEFAULT '1', 26 | `order` int(10) DEFAULT '0' 27 | ); 28 | INSERT INTO `typecho_links` SELECT * FROM `typecho_links_upgrade`; 29 | DROP TABLE `typecho_links_upgrade`; 30 | -------------------------------------------------------------------------------- /vCards/page-Messages.php: -------------------------------------------------------------------------------- 1 | need('layout/header.php'); 10 | ?> 11 | need('layout/sidebar.php'); ?> 12 |
13 |
14 |
15 |
16 |

17 | title() ?> 18 |

19 |
20 | options->slimg && 'guanbi'==$this->options->slimg): ?> 21 | 22 | options->slimg && 'showoff'==$this->options->slimg): ?> 23 | 24 | 25 | 26 | 27 |
28 |
29 |
30 | need('layout/comments.php'); ?> 31 |
32 | need('layout/footer.php'); ?> -------------------------------------------------------------------------------- /vCards/assets/icons/Travellings.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vCards/page-Music.php: -------------------------------------------------------------------------------- 1 | 2 | need('layout/header.php'); 11 | ?> 12 | need('layout/sidebar.php'); ?> 13 |
14 |
15 |
16 |
17 |

18 | title() ?> 19 |

20 |
21 | options->slimg && 'guanbi'==$this->options->slimg): ?> 22 | 23 | options->slimg && 'showoff'==$this->options->slimg): ?> 24 | 25 | 26 | 27 | 28 |
29 |
30 |
31 | 32 |
33 | 34 | content(); ?> 35 | 36 |
37 |
38 | need('layout/footer.php'); ?> 39 | 40 | -------------------------------------------------------------------------------- /vCards/layout/sidebar.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /vCards/assets/icons/music.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vCards/page-About.php: -------------------------------------------------------------------------------- 1 | need('layout/header.php'); 10 | ?> 11 | need('layout/sidebar.php'); ?> 12 | 13 |
14 |
15 |
16 |
17 |

18 | title() ?> 19 |

20 |
21 | options->slimg && 'guanbi'==$this->options->slimg): ?> 22 | 23 | options->slimg && 'showoff'==$this->options->slimg): ?> 24 | 25 | 26 | 27 | 28 |
29 |
30 |
31 |
32 | content(); ?> 33 |
34 | 35 |
36 | 37 | 38 | need('layout/footer.php'); ?> -------------------------------------------------------------------------------- /推荐插件/QPlayer2/libs/cache/Memcached.php: -------------------------------------------------------------------------------- 1 | memcached = new \Memcached(); 21 | $this->memcached->addServer($host, $port); 22 | assert($this->memcached->getVersion() !== false); 23 | 24 | $key = $this->getIdKey(); 25 | $id = $this->memcached->get($key); 26 | if (!is_numeric($id)) { 27 | $this->memcached->set($key, $id = 0); 28 | } 29 | $this->prefixId = $id; 30 | } 31 | 32 | public function set($key, $data, $expire = 86400) 33 | { 34 | return $this->memcached->set($this->getKey($key), $data, $expire); 35 | } 36 | 37 | public function get($key) 38 | { 39 | return $this->memcached->get($this->getKey($key)); 40 | } 41 | 42 | protected function getKey($key) 43 | { 44 | return parent::getKey($key) . $this->prefixId; 45 | } 46 | 47 | private function getIdKey() { 48 | return $this->prefix . 'id'; 49 | } 50 | 51 | public function uninstall() 52 | { 53 | $this->memcached->increment($this->getIdKey()); 54 | } 55 | } -------------------------------------------------------------------------------- /vCards/assets/icons/image.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vCards/page-Links.php: -------------------------------------------------------------------------------- 1 | need('layout/header.php'); 10 | ?> 11 | need('layout/sidebar.php'); ?> 12 |
13 |
14 |
15 |
16 |

17 | title() ?> 18 |

19 |
20 | options->slimg && 'guanbi'==$this->options->slimg): ?> 21 | 22 | options->slimg && 'showoff'==$this->options->slimg): ?> 23 | 24 | 25 | 26 | 27 |
28 |
29 |
30 |
31 | 34 | content(); ?> 35 |
36 | need('layout/comments.php'); ?> 37 |
38 | need('layout/footer.php'); ?> 39 | 40 | -------------------------------------------------------------------------------- /vCards/page-Archives.php: -------------------------------------------------------------------------------- 1 | need('layout/header.php'); 10 | ?> 11 | need('layout/sidebar.php'); ?> 12 |
13 |
14 |
15 |

[归档页]

16 |
17 | widget('Widget_Contents_Post_Recent', 'pageSize=10000')->to($archives); 19 | $year=0; $mon=0; $i=0; $j=0; 20 | $output = '
'; 21 | while($archives->next()): 22 | $year_tmp = date('Y',$archives->created); 23 | $mon_tmp = date('m',$archives->created); 24 | $y=$year; $m=$mon; 25 | if ($mon != $mon_tmp && $mon > 0) $output .= '
'; 26 | if ($year != $year_tmp && $year > 0) $output .= '
'; 27 | if ($year != $year_tmp) { 28 | $year = $year_tmp; 29 | $output .= '

['. $year .'年]

'; 30 | } 31 | $output .= ''; //输出文章日期和标题 35 | endwhile; 36 | $output .= '
'; 37 | echo $output; 38 | ?> 39 |
40 | 41 | need('layout/footer.php'); ?> 42 | 43 | -------------------------------------------------------------------------------- /vCards/page-Films.php: -------------------------------------------------------------------------------- 1 | need('layout/header.php'); 10 | ?> 11 | need('layout/sidebar.php'); ?> 12 |
13 |
14 |
15 |
16 |

17 | title() ?> 18 |

19 |
20 | options->slimg && 'guanbi'==$this->options->slimg): ?> 21 | 22 | options->slimg && 'showoff'==$this->options->slimg): ?> 23 | 24 | 25 | 26 | 27 |
28 |
29 |
30 |
31 |

[已看]

32 |
33 |

[想看]

34 |
35 |
36 |
37 | need('layout/footer.php'); ?> -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![screenshot.png][1] 2 | ## 前言: 3 | 捣鼓一个自己的主题,这个想法我想每个博主都有,有这个想法是在我下定决心搭建一个属于自己的博客的时候,那时的我懂的也不是很多,也就了解一点点建站的知识,关于模板开发并未深入了解,然后就一直搁置,搁置好久,中途也尝试过,只因学业繁忙又搁置了,终于等到毕业了,每天无所事事,只好找点事情做做,于是开始了填坑之旅~ 4 | 由于本人第一次开发模板,也就是此模板是我第一个模板,还存在很多问题,还需时间优化~ 5 | 另外,如有任何建议和问题,请在issues留言~ 6 | 感谢! 7 | 8 | 注意:书单页并未完善,如需更改书本信息,请到源码文件修改 9 | 10 | !!! 请在基本设置-评论设置-关闭反垃圾 11 | 12 | 13 | ps:为了更好的食用,请务必搭配以下-推荐插件: 14 | #### https://github.com/AlanDecode/Typecho-Plugin-DoubanBoard (豆瓣插件,用于展示影单) 15 | #### https://github.com/MoePlayer/APlayer-Typecho 用于展示歌单) 16 | #### https://github.com/moeshin/QPlayer2-Typecho (悬浮歌单)--为了能跟本主题更好的适配,已跟主题一起打包 17 | #### https://github.com/typecho-fans/plugins/tree/master/Links (友情链接)--为了能跟本主题更好的适配,已跟主题一起打包 18 | 特别感谢以上优秀开源者~ 19 | 20 | 欢迎加入博友群:345494089 21 | ## 介绍: 22 | vCards一名取自网上开源的html模板的名字,当时看到这个模板的时候,它本身具有的简约个性便燃起了我开发模板的心,所以就选这套模板进行嵌套typecho模板,这也是我第一次开发模板,还有很多不足。 23 | 24 | ## 功能: 25 | 该模板具备基本博客功能,外加pjax、移动端启动页 26 | 基本配色为黑、白、蓝灰 27 | 现有的独立页面有:文章归档、动态、友链、留言、关于、书单、相册、影单、日志、语录收藏 28 | 29 | 后期计划会加入: 30 | 短代码样式 31 | 文章点赞√ 32 | 表情包支持√ 33 | 隐私回复 34 | 私密文章等等 35 | 36 | 37 | 38 | ## 页面演示: 39 | ![网页捕获_16-7-2021_122055_www.rz.sb.jpeg][2] 40 | ![网页捕获_16-7-2021_122213_www.rz.sb.jpeg][3] 41 | ![网页捕获_16-7-2021_122321_www.rz.sb.jpeg][4] 42 | 43 | 44 | 45 | 46 | [1]: https://cdn.jsdelivr.net/gh/irozhi/irils-imgs/usr/uploads/2021/07/2342695856.png 47 | [2]: https://cdn.jsdelivr.net/gh/irozhi/irils-imgs/usr/uploads/2021/07/1481835310.jpeg 48 | [3]: https://cdn.jsdelivr.net/gh/irozhi/irils-imgs/usr/uploads/2021/07/2944046976.jpeg 49 | [4]: https://cdn.jsdelivr.net/gh/irozhi/irils-imgs/usr/uploads/2021/07/1717459389.jpeg 50 | -------------------------------------------------------------------------------- /推荐插件/QPlayer2/README.md: -------------------------------------------------------------------------------- 1 | # QPlayer2 for Typecho 2 | 3 | 一款简洁小巧的 HTML5 底部悬浮音乐播放器 4 | 5 | ### 安装 6 | 7 | 1. [下载](https://github.com/moeshin/QPlayer2-Typecho/releases/latest) 或克隆此工程 8 | 2. 将文件夹重命名为 `QPlayer2`,并放到 Typecho 的插件目录,默认 `usr/plugins` 9 | 3. 在控制台启用插件 10 | 11 | 12 | 13 | ### 歌曲列表 14 | 15 | JSON 数组 16 | 17 | | 键名 | 说明 | 必须 | 18 | | ---- | ---- | ---- | 19 | | name | 歌曲名称 | 是 | 20 | | artist | 艺术家数组或文本 | 否 | 21 | | cover | 封面链接 | 否 | 22 | | lyrics | [歌词文本][0] | 否 | 23 | | provider | 提供器名称 | 否,默认 [`default`][1] | 24 | | lrc | 歌词链接,随提供器而定 | 否 | 25 | 26 | ```json 27 | [{ 28 | "name": "Nightglow", 29 | "artist": "蔡健雅", 30 | "audio": "https://cdn.jsdelivr.net/gh/moeshin/QPlayer-res/Nightglow.mp3", 31 | "cover": "https://cdn.jsdelivr.net/gh/moeshin/QPlayer-res/Nightglow.jpg", 32 | "lrc": "https://cdn.jsdelivr.net/gh/moeshin/QPlayer-res/Nightglow.lrc" 33 | }, { 34 | "name": "やわらかな光", 35 | "artist": "やまだ豊", 36 | "audio": "https://cdn.jsdelivr.net/gh/moeshin/QPlayer-res/やわらかな光.mp3", 37 | "cover": "https://cdn.jsdelivr.net/gh/moeshin/QPlayer-res/やわらかな光.jpg", 38 | "lyrics": "[00:00.00]请欣赏" 39 | }] 40 | ``` 41 | 42 | ### 鸣谢 43 | 44 | * [QPlayer](https://github.com/Jrohy/QPlayer) 45 | * [Meting](https://github.com/metowolf/Meting) 46 | * [APlayer-Typecho](https://github.com/MoePlayer/APlayer-Typecho) 47 | 48 | 49 | [0]: https://zh.wikipedia.org/zh-hans/LRC%E6%A0%BC%E5%BC%8F 50 | [1]: https://github.com/moeshin/QPlayer2#qplayerproviderdefault 51 | -------------------------------------------------------------------------------- /推荐插件/QPlayer2/libs/cache/Cache.php: -------------------------------------------------------------------------------- 1 | uninstall(); 20 | } 21 | 22 | /** 23 | * @throws Exception 24 | */ 25 | public function test() { 26 | $id = uniqid(); 27 | $this->set('test', $id, 60); 28 | if ($this->get('test') != $id) { 29 | throw new Exception('Cache test error!'); 30 | } 31 | } 32 | 33 | protected function getKey($key) { 34 | return $this->prefix . md5($key); 35 | } 36 | 37 | /** 38 | * @param string $type 39 | * @param string $host 40 | * @param int $port 41 | * @return Cache 42 | * @throws Exception 43 | */ 44 | public static function Build($type, $host, $port) 45 | { 46 | $type = ucfirst($type); 47 | if (!in_array($type, array('Database', 'Memcached', 'Redis'))) { 48 | throw new Exception("Cache type error: $type"); 49 | } 50 | include_once("$type.php"); 51 | $type = __NAMESPACE__ . '\\' . $type; 52 | return new $type($host, $port); 53 | } 54 | 55 | /** 56 | * @param $config 57 | * @return Cache 58 | * @throws Exception 59 | */ 60 | public static function BuildWithConfig($config) { 61 | return self::Build($config->cacheType, $config->cacheHost, $config->cachePort); 62 | } 63 | 64 | public static function UninstallWithConfig($config) { 65 | try { 66 | $cache = self::BuildWithConfig($config); 67 | $cache->uninstall(); 68 | } catch (Exception $e) { 69 | echo "
$e
"; 70 | } 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /vCards/assets/icons/package.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vCards/assets/icons/icon-news.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /vCards/assets/icons/users.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /推荐插件/QPlayer2/libs/cache/Database.php: -------------------------------------------------------------------------------- 1 | db = Typecho_Db::get(); 17 | $this->table = $this->db->getPrefix() . 'QPlayer2'; 18 | } 19 | 20 | public function set($key, $data, $expire = 86400) 21 | { 22 | $this->db->query($this->db->insert($this->table)->rows(array( 23 | 'key' => md5($key), 24 | 'data' => $data, 25 | 'time' => time() + $expire 26 | ))); 27 | } 28 | 29 | public function get($key) 30 | { 31 | // 回收过期数据 32 | $this->db->query($this->db->delete($this->table)->where('time <= ?', time())); 33 | 34 | $row = $this->db->fetchRow($this->db->select('data')->from($this->table)->where('key = ?', md5($key))); 35 | @$data = $row['data']; 36 | return $data; 37 | } 38 | 39 | /** 40 | * @throws Exception 41 | */ 42 | public function install() 43 | { 44 | $adapter = $this->db->getAdapterName(); 45 | switch (true) { 46 | case false !== strpos($adapter, 'Mysql'): 47 | $adapter = 'MySQL'; 48 | break; 49 | case false !== strpos($adapter, 'Pgsql'): 50 | $adapter = 'PgSQL'; 51 | break; 52 | case false !== strpos($adapter, 'SQLite'): 53 | $adapter = 'SQLite'; 54 | break; 55 | default: 56 | throw new Exception('Unknown db adapter: ' . $adapter); 57 | } 58 | $sql = file_get_contents(__DIR__ . "/$adapter.sql"); 59 | $this->db->query(str_replace('%table%', $this->table, $sql)); 60 | } 61 | 62 | public function uninstall() 63 | { 64 | $this->db->query("DROP TABLE IF EXISTS `$this->table`;"); 65 | } 66 | 67 | public function flush() 68 | { 69 | $this->db->truncate($this->table); 70 | } 71 | } -------------------------------------------------------------------------------- /vCards/page-Photos.php: -------------------------------------------------------------------------------- 1 | need('layout/header.php'); 10 | ?> 11 | need('layout/sidebar.php'); ?> 12 |
13 |
14 |
15 |
16 |

17 | title() ?> 18 |

19 |
20 | options->slimg && 'guanbi'==$this->options->slimg): ?> 21 | 22 | options->slimg && 'showoff'==$this->options->slimg): ?> 23 | 24 | 25 | 26 | 27 |
28 |
29 |
30 | 31 | 50 |
51 | need('layout/footer.php'); ?> -------------------------------------------------------------------------------- /vCards/assets/icons/film.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vCards/assets/icons/icon-experience.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /vCards/assets/icons/emoji/emoji-shocked-3.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /vCards/assets/icons/emoji/emoji-sweating.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /vCards/assets/icons/icon-app.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /vCards/index.php: -------------------------------------------------------------------------------- 1 | need('layout/header.php'); 13 | ?> 14 | need('layout/sidebar.php'); ?> 15 | 16 | 17 |
18 | 19 |
20 |
21 |

[首页]

22 |
23 | 24 | 25 |
26 | 27 | next()): ?> 28 |
29 |
30 |
31 | category('.'); ?> 32 |
33 |
34 | 35 | date('Y-m-d'); ?> 36 | 37 |
38 |
39 |

40 | sticky(); $this->title(15, '...') ?> 41 |

42 | 43 | excerpt(20, '...');?> 44 | 45 |
46 | 47 | options->slimg && 'guanbi'==$this->options->slimg): ?> 48 | 49 | options->slimg && 'showoff'==$this->options->slimg): ?> 50 | 51 | 53 | 54 | 55 | 56 |
57 | 58 | 59 | 60 |
61 | 62 | 63 | 64 | 65 | 66 | 67 |
68 |
72 | 73 |
74 | pageLink('','next'); ?> 75 |
76 |    77 | pageLink(''); ?> 78 |
79 | 80 |
81 | 82 | 83 | need('layout/footer.php'); ?> -------------------------------------------------------------------------------- /vCards/assets/icons/emoji/emoji-happy-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /vCards/assets/icons/emoji/emoji-wink.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /vCards/assets/styles/options.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | (function () { 3 | document.addEventListener('DOMContentLoaded', function () { 4 | let TabItems = document.querySelectorAll('.options-tab li'); 5 | let Notice = document.querySelector('.options-notice'); 6 | let Version = document.querySelector('#theme-version'); 7 | let Form = document.querySelector('.options-contain > form'); 8 | let Content = document.querySelectorAll('.options-content'); 9 | TabItems.forEach(function (item) { 10 | item.addEventListener('click', function () { 11 | sessionStorage.setItem('options-current', item.getAttribute('data-current')); 12 | TabItems.forEach(function (_item) { 13 | return _item.classList.remove('active'); 14 | }); 15 | item.classList.add('active'); 16 | 17 | if (item.getAttribute('data-current') === 'options-notice') { 18 | Notice.style.display = 'block'; 19 | Form.style.display = 'none'; 20 | } else { 21 | Form.style.display = 'block'; 22 | Notice.style.display = 'none'; 23 | } 24 | 25 | Content.forEach(function (_item) { 26 | _item.style.display = 'none'; 27 | if (_item.classList.contains(item.getAttribute('data-current'))) _item.style.display = 'block'; 28 | }); 29 | }); 30 | }); 31 | /* 页面第一次进来 */ 32 | if (sessionStorage.getItem('options-current')) { 33 | if (sessionStorage.getItem('options-current') === 'options-notice') { 34 | Notice.style.display = 'block'; 35 | Form.style.display = 'none'; 36 | } else { 37 | Form.style.display = 'block'; 38 | Notice.style.display = 'none'; 39 | } 40 | 41 | TabItems.forEach(function (item) { 42 | if (item.getAttribute('data-current') === sessionStorage.getItem('options-current')) { 43 | item.classList.add('active'); 44 | Content.forEach(function (_item) { 45 | if (_item.classList.contains(sessionStorage.getItem('options-current'))) _item.style.display = 'block'; 46 | }); 47 | } 48 | }); 49 | } else { 50 | TabItems[0].classList.add('active'); 51 | Notice.style.display = 'block'; 52 | Form.style.display = 'none'; 53 | } 54 | 55 | }); 56 | })(); 57 | -------------------------------------------------------------------------------- /vCards/assets/icons/emoji/emoji-sad.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /vCards/assets/icons/emoji/emoji-thinking.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /vCards/archive.php: -------------------------------------------------------------------------------- 1 | 2 | need('layout/header.php'); ?> 3 | need('layout/sidebar.php'); ?> 4 | 5 |
6 |
7 |
8 |

9 | archiveTitle(array( 10 | 'category' => _t('分类【 %s 】下的文章'), 11 | 'search' => _t('包含关键字【 %s 】的文章'), 12 | 'tag' => _t('标签【 %s 】下的文章'), 13 | 'author' => _t('【%s 】发布的文章') 14 | ), '', ''); ?> 15 |

16 |
17 | 18 |
19 | 20 | have()): ?> 21 | next()): ?> 22 | 23 | 24 |
25 |
26 |
27 | category('.'); ?> 28 |
29 |
30 | 31 | date('Y-m-d'); ?> 32 | 33 |
34 |
35 |

36 | title(15, '...') ?> 37 |

38 | 39 | excerpt(20, '...');?> 40 | 41 |
42 | 43 | options->slimg && 'guanbi'==$this->options->slimg): ?> 44 | 45 | options->slimg && 'showoff'==$this->options->slimg): ?> 46 | 47 | 49 | 50 | 51 | 52 |
53 | 54 | 55 | 56 |
57 | 58 | 59 | 60 | 61 |
62 | 63 |

64 | 65 |

66 | 67 |
68 | 69 | 70 | pageNav('« 前一页', '后一页 »'); ?> 71 |
72 |
73 | 74 | 75 | need('layout/footer.php'); ?> -------------------------------------------------------------------------------- /vCards/assets/icons/emoji/emoji-laughing.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /vCards/page-Works.php: -------------------------------------------------------------------------------- 1 | need('layout/header.php'); 10 | ?> 11 | need('layout/sidebar.php'); ?> 12 |
13 |
14 |
15 |
16 |

17 | title() ?> 18 |

19 |
20 | options->slimg && 'guanbi'==$this->options->slimg): ?> 21 | 22 | options->slimg && 'showoff'==$this->options->slimg): ?> 23 | 24 | 25 | 26 | 27 |
28 |
29 |
30 | 31 |
32 | 项目 33 | 41 | 42 |
43 | 44 | 45 | 58 |
59 | need('layout/footer.php'); ?> -------------------------------------------------------------------------------- /vCards/assets/icons/emoji/emoji-sad-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /vCards/assets/icons/emoji/emoji-shocked.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /vCards/assets/icons/emoji/emoji-angry.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /vCards/assets/icons/emoji/emoji-shocked-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /vCards/assets/icons/emoji/emoji-happy.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /推荐插件/QPlayer2/assets/QPlayer-plugin.js: -------------------------------------------------------------------------------- 1 | (function () { 2 | var q = QPlayer; 3 | var $ = q.$; 4 | var plugin = q.plugin = { 5 | version: '1.0.0', 6 | setList: function (list) { 7 | var length = list.length; 8 | if (length === 0) { 9 | return; 10 | } 11 | var asyncList = {}; 12 | var asyncTotal = 0; 13 | var asyncCount = 0; 14 | var asyncOffset = 0; 15 | var isComplete = false; 16 | function complete() { 17 | if (!isComplete || asyncCount !== asyncTotal) { 18 | return; 19 | } 20 | var keys = Object.keys(asyncList); 21 | keys.sort(); 22 | var length = keys.length; 23 | for (var i = 0; i < length; ++i) { 24 | var key = keys[i]; 25 | var array = asyncList[key]; 26 | var len = array.length; 27 | var index = parseInt(key) + asyncOffset; 28 | splice(list, index, 1, array); 29 | asyncOffset += len - 1; 30 | } 31 | q.list = list; 32 | } 33 | for (var i = 0; i < length; ++i) { 34 | var current = list[i]; 35 | if (!(current.type && !current.provider)) { 36 | continue; 37 | } 38 | ++asyncTotal; 39 | (function (i) { 40 | $.ajax({ 41 | url: plugin.api, 42 | data: current, 43 | success: function (array) { 44 | if (!Array.isArray(array)) { 45 | return; 46 | } 47 | asyncList[i] = array; 48 | }, 49 | complete: function () { 50 | ++asyncCount; 51 | complete(); 52 | } 53 | }); 54 | })(i); 55 | } 56 | isComplete = true; 57 | complete(); 58 | } 59 | }; 60 | function splice(source, start, deleteCount, dest) { 61 | var dLength = Array.isArray(dest) ? dest.length : 0; 62 | var sLength = source.length; 63 | if (start > sLength) { 64 | start = sLength; 65 | } else if (start < 0) { 66 | start = 0; 67 | } 68 | if (deleteCount < 0) { 69 | deleteCount = 0; 70 | } 71 | if (start + deleteCount > sLength) { 72 | deleteCount = sLength - start; 73 | } 74 | var offset = dLength - deleteCount; 75 | var length = sLength + offset; 76 | var i; 77 | if (offset > 0) { 78 | for (i = length - 1; i > start + offset - 1; --i) { 79 | source[i] = source[i - offset]; 80 | } 81 | } else if (offset < 0) { 82 | for (i = start + dLength; i < sLength; ++i) { 83 | source[i] = source[i - offset]; 84 | } 85 | } 86 | source.length = length; 87 | for (i = 0; i < dLength; ++i) { 88 | source[start + i] = dest[i]; 89 | } 90 | } 91 | })(); -------------------------------------------------------------------------------- /vCards/assets/icons/emoji/emoji-in-love.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /vCards/assets/icons/emoji/emoji-in-love (1).svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /vCards/assets/owo/OwO.min.css: -------------------------------------------------------------------------------- 1 | .OwO { 2 | position: relative; 3 | -webkit-user-select: none; 4 | -moz-user-select: none; 5 | -ms-user-select: none; 6 | user-select: none 7 | } 8 | 9 | .OwO:hover .OwO-logo { 10 | color: #444 11 | } 12 | 13 | .OwO.OwO-open .OwO-logo { 14 | border-radius: 4px 4px 0 0; 15 | border-bottom: none; 16 | color: #444 17 | } 18 | 19 | .OwO.OwO-open .OwO-body { 20 | display: block; 21 | z-index: 1; 22 | position: sticky; 23 | } 24 | 25 | .OwO.OwO-up .OwO-body { 26 | top: inherit; 27 | bottom: 21px; 28 | border-radius: 4px 4px 4px 0 29 | } 30 | 31 | .OwO.OwO-up .OwO-body .OwO-bar .OwO-packages li:nth-child(1) { 32 | border-radius: 0 33 | } 34 | 35 | .OwO.OwO-up.OwO-open .OwO-logo { 36 | border: 1px solid #ddd; 37 | border-radius: 0 0 4px 4px; 38 | border-top: none 39 | } 40 | 41 | .OwO .OwO-logo { 42 | position: relative; 43 | display: inline-block; 44 | color: #888; 45 | background: #fff; 46 | border: 1px solid #ddd; 47 | border-radius: 4px; 48 | font-size: 13px; 49 | padding: 2px 5px; 50 | cursor: pointer; 51 | height: 22px; 52 | box-sizing: border-box; 53 | z-index: 2; 54 | line-height: 16px 55 | } 56 | 57 | .OwO .OwO-logo:hover span { 58 | display: inline-block; 59 | } 60 | 61 | .OwO .OwO-body { 62 | display: none; 63 | width: 400px; 64 | background: #fff; 65 | border: 1px solid #ddd; 66 | margin-top: -1px; 67 | border-radius: 0 4px 4px 4px 68 | } 69 | 70 | .OwO .OwO-body .OwO-items { 71 | -webkit-user-select: none; 72 | -moz-user-select: none; 73 | -ms-user-select: none; 74 | user-select: none; 75 | display: none; 76 | padding: 10px; 77 | margin: 0; 78 | overflow: scroll; 79 | font-size: 0; 80 | overflow-x: hidden; 81 | } 82 | 83 | .OwO .OwO-body .OwO-items .OwO-item { 84 | list-style-type: none; 85 | background: #f7f7f7; 86 | padding: 5px 10px; 87 | border-radius: 5px; 88 | display: inline-block; 89 | font-size: 12px; 90 | line-height: 14px; 91 | margin: 0 10px 12px 0; 92 | cursor: pointer; 93 | -webkit-transition: .3s; 94 | transition: .3s 95 | } 96 | 97 | .OwO .OwO-body .OwO-items .OwO-item:hover { 98 | background: #eee; 99 | box-shadow: 0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.2),0 1px 5px 0 rgba(0,0,0,.12); 100 | } 101 | 102 | .OwO .OwO-body .OwO-items-emoji .OwO-item { 103 | font-size: 20px; 104 | line-height: 19px 105 | } 106 | 107 | .OwO .OwO-body .OwO-items-image .OwO-item { 108 | max-width: calc(25% - 10px); 109 | box-sizing: border-box 110 | } 111 | 112 | .OwO .OwO-body .OwO-items-image .OwO-item img { 113 | max-width: 30px; 114 | } 115 | 116 | .OwO .OwO-body .OwO-items-show { 117 | display: block 118 | } 119 | 120 | .OwO .OwO-body .OwO-bar { 121 | width: 100%; 122 | height: 30px; 123 | border-top: 1px solid #ddd; 124 | background: #fff; 125 | border-radius: 0 0 4px 4px; 126 | color: #444; 127 | overflow: hidden; 128 | } 129 | 130 | .OwO .OwO-body .OwO-bar .OwO-packages { 131 | margin: 0; 132 | padding: 0; 133 | font-size: 0 134 | } 135 | 136 | .OwO .OwO-body .OwO-bar .OwO-packages li { 137 | list-style-type: none; 138 | display: inline-block; 139 | line-height: 30px; 140 | font-size: 14px; 141 | padding: 0 10px; 142 | cursor: pointer; 143 | margin-right: 3px 144 | } 145 | 146 | .OwO .OwO-body .OwO-bar .OwO-packages li:nth-child(1) { 147 | border-radius: 0 0 0 3px 148 | } 149 | 150 | .OwO .OwO-body .OwO-bar .OwO-packages li:hover { 151 | background: #eee 152 | } 153 | 154 | .OwO .OwO-body .OwO-bar .OwO-packages .OwO-package-active { 155 | background: #eee; 156 | -webkit-transition: .3s; 157 | transition: .3s 158 | } 159 | 160 | -------------------------------------------------------------------------------- /vCards/assets/icons/emoji/emoji-happy-3.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /vCards/assets/icons/emoji/emoji-crazy.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /vCards/assets/icons/emoji/emoji-bad.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /vCards/assets/icons/icon-education.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /vCards/assets/icons/emoji/emoji-nerd.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /vCards/assets/icons/emoji/emoji-pressure.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /vCards/page-Cross.php: -------------------------------------------------------------------------------- 1 | need('layout/header.php'); 10 | ?> 11 | need('layout/sidebar.php'); ?> 12 |
13 |
14 |
15 |

[动态]

16 |
17 | authorId) { 20 | if ($comments->authorId == $comments->ownerId) { 21 | $group = '博主'; 22 | $commentClass .= ' comment-by-author'; //如果是文章作者的评论添加 .comment-by-author 样式 23 | } else { 24 | $group = '游客'; 25 | $commentClass .= ' comment-by-user'; //如果是评论作者的添加 .comment-by-user 样式 26 | } 27 | } 28 | $commentLevelClass = $comments->_levels > 0 ? ' comment-child' : ' comment-parent'; //评论层数大于0为子级,否则是父级 29 | ?> 30 |
  • 41 |
    42 |
    43 | 44 | 45 | 46 | 47 | 48 |
    49 |
    50 | author(); ?> 51 |
    52 |
    53 | content); ?> 54 | 58 |
    59 | 60 |
    61 |
    62 |
    63 | children) { ?> 64 |
    65 | threadedComments($options); ?> 66 |
    67 | 68 |
  • 69 | 70 | comments()->to($comments); ?> 71 | 72 | allow('comment')): ?> 73 |
    74 |
    75 | 76 | 77 | 78 | 79 | 80 |
    81 | user->hasLogin()): ?> 82 |
    83 | 84 | 89 | 90 | 91 | 92 | 93 | 94 |
    95 | 96 |
    97 | 98 | 99 |
    100 | have()): ?> 101 |
    102 | listComments(); ?> 103 |
    104 | 107 | 108 |

    allow('comment')): ?> 暂无动态 >_< 动态已关闭 >_<

    109 | 110 |
    111 | 112 | 113 | 124 |
    125 | need('layout/footer.php'); ?> 126 | 127 | 128 | -------------------------------------------------------------------------------- /推荐插件/DoubanBoard/Plugin.php: -------------------------------------------------------------------------------- 1 | footer = array('DoubanBoard_Plugin', 'footer'); 35 | Helper::addRoute("route_DoubanBoard","/DoubanBoard","DoubanBoard_Action",'action'); 36 | } 37 | 38 | /** 39 | * 禁用插件方法,如果禁用失败,直接抛出异常 40 | * 41 | * @static 42 | * @access public 43 | * @return void 44 | * @throws Typecho_Plugin_Exception 45 | */ 46 | public static function deactivate() 47 | { 48 | Helper::removeRoute("route_DoubanBoard"); 49 | } 50 | /** 51 | * 获取插件配置面板 52 | * 53 | * @access public 54 | * @param Typecho_Widget_Helper_Form $form 配置面板 55 | * @return void 56 | */ 57 | public static function config(Typecho_Widget_Helper_Form $form){ 58 | echo '使用方式
    59 | 已读书单列表:<div data-status="read" class="douban-book-list doubanboard-list"></div>
    60 | 在读书单列表:<div data-status="reading" class="douban-book-list doubanboard-list"></div>
    61 | 想读书单列表:<div data-status="wish" class="douban-book-list doubanboard-list"></div>
    62 | 已看电影列表:<div data-status="watched" class="douban-movie-list doubanboard-list"></div>
    63 | 在看电影列表:<div data-status="watching" class="douban-movie-list doubanboard-list"></div>
    64 | 想看电影列表:<div data-status="wish" class="douban-movie-list doubanboard-list"></div>
    65 | 单部电影:<div data-type="movie" class="douban-single" data-id="电影 ID" data-rating="你的评分"></div>
    66 | 单部书籍:<div data-type="book" class="douban-single" data-id="书籍 ID" data-rating="你的评分"></div>
    67 | 更多介绍:Typecho-Plugin-DoubanBoard'; 68 | $ID = new Typecho_Widget_Helper_Form_Element_Text('ID', NULL, '', _t('豆瓣 ID'), _t('填写豆瓣ID')); 69 | $form->addInput($ID); 70 | $PageSize = new Typecho_Widget_Helper_Form_Element_Text('PageSize', NULL, '12', _t('每次加载的数量'), _t('填写每次加载的数量,不填默认为 10。注意:豆瓣限制最多取得 100 条数据。')); 71 | $form->addInput($PageSize); 72 | $ValidTimeSpan = new Typecho_Widget_Helper_Form_Element_Text('ValidTimeSpan', NULL, '86400', _t('缓存过期时间'), _t('填写缓存过期时间,单位秒。默认 24 小时。')); 73 | $form->addInput($ValidTimeSpan); 74 | $loadJQ= new Typecho_Widget_Helper_Form_Element_Checkbox('loadJQ', array(''=>_t('配置是否引入 JQuery:勾选则引入不勾选则不引入
    ')),array('jq'), _t('基本设置')); 75 | $form->addInput($loadJQ); 76 | } 77 | /** 78 | * 个人用户的配置面板 79 | * 80 | * @access public 81 | * @param Typecho_Widget_Helper_Form $form 82 | * @return void 83 | */ 84 | public static function personalConfig(Typecho_Widget_Helper_Form $form){} 85 | 86 | /** 87 | * 在底部输出所需 JS 88 | * 89 | * @access public 90 | * @param Typecho_Widget_Helper_Form $form 91 | * @return void 92 | */ 93 | public static function footer() 94 | { 95 | echo ''; 98 | echo ''; 99 | 100 | if (!empty(Helper::options()->plugin('DoubanBoard')->loadJQ) && in_array('jq', Helper::options()->plugin('DoubanBoard')->loadJQ)) 101 | { 102 | echo ''; 105 | } 106 | echo ''; 109 | 110 | echo ''; 113 | } 114 | } 115 | -------------------------------------------------------------------------------- /推荐插件/Links/README.md: -------------------------------------------------------------------------------- 1 | 2 | TF Logo 3 | 4 | 5 | Links v1.2.3 - 社区维护版 6 | ====================== 7 |

    —— 功能强大的友情链接管理插件,支持模板/内容调用/图文混合模式/自定义数据扩展等。

    8 | 9 |

    10 | 使用说明 • 11 | 版本历史 • 12 | 贡献作者 • 13 | 附注/链接 • 14 | 授权协议 15 |

    16 | 17 | --- 18 | 19 | ## 使用说明 20 | 21 | 22 | 23 | 65 | 66 |
    24 | 25 | ###### 本版本友情链接插件支持以下功能: 26 | ###### 1、自建独立数据表,干净无上限的添加友情链接信息。 27 | ###### 2、两种调用方式:函数方式,用于主题模板侧边栏等嵌入位置显示;HTML标签方式,用于独立页面等编辑内容显示。 28 | ###### 3、三种输出模式:文字友链、图片友链和图文混合友链,可自定义源码。 29 | ###### 4、管理面板:支持友链的分类,拖拽排序及启用禁用等。 30 | ###### 5、可根据邮箱解析Gravatar头像作为友链图片。 31 | ###### 6、可添加自定义数据,方便用户做个性化扩展。 32 | 33 | **使用方法**: 34 | ##### 1. 下载本插件,放在 `usr/plugins/` 目录中,确保文件夹名为 Links; 35 | ##### 2. 激活插件,点击菜单-管理-友情链接,在面板右侧填写各项信息依次添加; 36 | ##### 3. 在主题sidebar.php文件种的适当位置写入`links(); ?>`即可显示。 37 | 38 | **注意事项**: 39 | * ##### 以上调用函数内支持用英文逗号隔开4个参数,即`$this->links( "模式", "数目", "分类", "尺寸" )`,赋值如下表: 40 | 41 | |参数|可用值|缺省值|说明| 42 | |---|:---:|:---:|:---:| 43 | |模式|SHOW_TEXT
    SHOW_IMG
    SHOW_MIX|SHOW_TEXT|仅输出文字
    仅输出图片
    图片+文字| 44 | |数目|整数|0
    (不限制)|输出链接条数| 45 | |分类|分类名|ALL
    (所有)|输出单类链接| 46 | |尺寸|整数|32
    (像素)|输出图片大小| 47 | 48 | ##### 模板函数带参数调用实例—— 49 | ###### 图文混合链接 - `links("SHOW_MIX"); ?>` 50 | ###### 十个文字链接 - `links("SHOW_TEXT", 10); ?>` 51 | ###### 指定分类链接 - `links("SHOW_TEXT", 0, "testsort"); ?>` 52 | ###### 指定图片尺寸 - `links("SHOW_IMG", 0, "ALL", 64); ?>` 53 | 54 | * ##### 想在文章或页面内容中展示友情链接则需在编辑器内写入HTML代码:``,同样支持上表参数。 55 | 56 | ##### HTML代码带参数调用实例—— 57 | ###### 图文混合链接 - `SHOW_MIX` 58 | ###### 十个文字链接 - `SHOW_TEXT` 59 | ###### 指定分类链接 - ``或`` 60 | ###### 指定图片尺寸 - `SHOW_IMG`或`SHOW_IMG` 61 | 62 | * ##### 新版插件可以直接在启用-禁用链接旁的原生设置面板中自定义各输出模式源码规则并指定默认图片尺寸。 63 | 64 |
    67 | 68 | ## 版本历史 69 | 70 | * v1.2.3 (20-6-30 [@jzwalk](https://github.com/jzwalk)) 71 | * 在[@Mejituu](https://github.com/Mejituu)维护版基础上修复优化,合并1个微调版改动: 72 | * 友链添加rel=noopener标签加强安全性([@he0119](https://github.com/he0119/typecho-links))。 73 | * Action使用加盐地址,文本字段入库过滤XSS加强安全性([@jzwalk](https://github.com/jzwalk)); 74 | * 修复自动获取邮箱头像Api失效问题,增加图片尺寸参数支持([@jzwalk](https://github.com/jzwalk)); 75 | * 增加原生设置选项,方便修改源码规则和默认图片尺寸等([@jzwalk](https://github.com/jzwalk))。 76 | * v1.2.2 (20-03-11 [@Mejituu](https://github.com/Mejituu)) 77 | * 修复一个小BUG。 78 | * v1.2.1 (20-02-16 [@Mejituu](https://github.com/Mejituu)) 79 | * 修复邮箱头像解析问题; 80 | * 优化逻辑问题。 81 | * v1.2.0 (20-02-16 [@Mejituu](https://github.com/Mejituu)) 82 | * 增加友链禁用功能; 83 | * 增加友链邮箱功能; 84 | * 增加友链邮箱解析头像链接功能; 85 | * 修正数据表占用大小问题。 86 | * v1.1.3 (20-02-08 [@Mejituu](https://github.com/Mejituu)) 87 | * 修复已存在表激活失败、表检测失败。 88 | * v1.1.2 (19-08-26 [@jrotty](https://github.com/jrotty)) 89 | * 修复Action越权漏洞。 90 | * v1.1.1 (14-12-14 [@Hanny](http://www.imhan.com)) 91 | * 修正兼容Typecho 1.0。 92 | * v1.1.0 (13-12-08 [@Hanny](http://www.imhan.com)) 93 | * 修正兼容Typecho 0.9。 94 | * v1.0.4 (10-06-30 [@Hanny](http://www.imhan.com)) 95 | * 修正数据表前缀问题; 96 | * 源码规则支持所有数据表字段。 97 | * v1.0.3 (10-06-20 [@Hanny](http://www.imhan.com)) 98 | * 修改图片链接支持方式; 99 | * 增加链接分类功能; 100 | * 增加自定义数据; 101 | * 增加多种输出模式; 102 | * 增加较详细的帮助文档; 103 | * 增加页面标签调用方式。 104 | * v1.0.2 (10-05-16 [@Hanny](http://www.imhan.com)) 105 | * 增加SQLite支持。 106 | * v1.0.1 (09-12-27 [@Hanny](http://www.imhan.com)) 107 | * 增加链接描述显示; 108 | * 增加首页链接数量限制功能; 109 | * 增加图片链接功能。 110 | * v1.0.0 (09-12-12 [@Hanny](http://www.imhan.com)) 111 | * 实现基本功能,包括添加,删除,修改和排序等。 112 | 113 | ## 贡献作者 114 | 115 | [![jzwalk](https://avatars1.githubusercontent.com/u/252331?v=3&s=100)](https://github.com/jzwalk) | [![he0119](https://avatars1.githubusercontent.com/u/5219550?v=3&s=100)](https://github.com/he0119) | [![Mejituu](https://avatars1.githubusercontent.com/u/36153418?v=3&s=100)](https://github.com/Mejituu) | [![jrotty](https://avatars1.githubusercontent.com/u/16165576?v=3&s=100)](https://github.com/jrotty) | [![Hanny](https://secure.gravatar.com/avatar/?d=mp&s=100)](http://www.imhan.com) 116 | :---:|:---:|:---:|:---:|:---: 117 | [jzwalk](https://github.com/jzwalk) (2020) | [he0119](https://github.com/he0119) (2020) | [Mejituu](https://github.com/Mejituu) (2020) | [jrotty](https://github.com/jrotty) (2019) | [Hanny](http://www.imhan.com) (2009) 118 | 119 | *为避免作者栏显示过长,插件信息仅选取登记2个署名,如有异议可协商修改。 120 | 121 | ## 附注/链接 122 | 123 | 本社区维护版已包含以下各版本功能并做优化调整: 124 | 125 | * [微调版(he0119)](https://github.com/he0119/typecho-links) - 添加noopener外链标记。 126 | * [维护版(Mejituu)](https://github.com/Mejituu/Links) - 修复激活报错,新增邮箱配置及多项优化。 127 | * [修复版(jrotty)](https://qqdie.com/archives/links-typecho-plugin.html) - 修复Action越权漏洞。 128 | * [原版](http://www.imhan.com/archives/typecho-links) - 实现多种格式友链数据输出。 129 | 130 | 欢迎社区成员继续贡献代码参与更新。 131 | 132 | ## 授权协议 133 | 134 | 沿用维护版声明的[MIT](https://github.com/Mejituu/Links/blob/master/LICENSE)开源协议。(要求提及出处。) 135 | 136 | > Links原作未附协议声明,原作者保留所有权利。 © [Hanny](http://www.imhan.com) 137 | -------------------------------------------------------------------------------- /vCards/post.php: -------------------------------------------------------------------------------- 1 | cid) { 6 | // 调用点赞函数,传入文章的 cid,然后通过 exit 输出点赞数量 7 | exit(agree($this->cid)); 8 | } 9 | // 如果点赞的文章 cid 不是本篇文章的 cid 就输出 error 不再往下执行 10 | exit('error'); 11 | } 12 | 13 | ?> 14 | 15 | 16 | need('layout/header.php'); ?> 17 | 18 | need('layout/sidebar.php'); ?> 19 |
    20 |
    21 |
    22 |
    23 | category('.'); ?> 24 |
    25 |
    26 | 27 | date('Y-m-d'); ?> 28 | 29 |
    30 |
    31 |

    32 | title() ?> 33 |

    34 | 35 |
    36 | options->slimg && 'guanbi'==$this->options->slimg): ?> 37 | 38 | options->slimg && 'showoff'==$this->options->slimg): ?> 39 | 40 | 41 | 42 | 43 | 44 |
    45 | 46 |
    47 | 48 |
    49 | 50 |
    51 | 52 |
    53 | ]*>/i'; 55 | $replacement = ''.$this->title.''; 56 | $content = preg_replace($pattern, $replacement, $this->content); 57 | echo $content; 58 | ?> 59 |
    60 | 61 |

    62 | 63 | tags(', ', true, 'none'); ?> 64 |

    65 |
    66 | 67 | 68 | 69 |
    70 | hidden?array('agree' => 0, 'recording' => true):agreeNum($this->cid); ?> 71 | 76 |
    77 | 78 | 79 |
    - THE END -
    80 | 84 | 85 |
    86 |
    87 |

    非特殊说明,本博所有文章均为博主原创。

    88 | 89 |
    90 |
    91 | 92 | 93 | 94 | 95 |
    96 | 上一篇: 97 | theNext('%s','没有了'); ?> 98 |
    99 | 100 | 101 | 102 | 103 | 104 |
    105 | 下一篇: 106 | thePrev('%s','没有了'); ?> 107 |
    108 | 109 | 110 |
    111 | need('layout/comments.php'); ?> 112 |
    113 | 114 | 115 | 146 | 147 | need('layout/footer.php'); ?> 148 | 149 | -------------------------------------------------------------------------------- /vCards/layout/footer.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |
    © 2021 RZ.SB
    10 |
    11 |
    12 |
    13 | 14 | 15 | 16 | 17 | 18 | 19 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 |
    33 | 57 | 58 | 59 | 60 | 61 | 63 | 64 | 65 | 67 | 68 | 69 | 70 |
    71 | 72 | 73 | 74 | 75 | 112 | 113 | 114 | 115 | 116 | 121 | 122 | 123 | 124 | 137 | 138 | 139 | 140 | 141 | 142 | footer(); ?> 143 | 144 | 145 | -------------------------------------------------------------------------------- /推荐插件/DoubanBoard/assets/DoubanBoard.09.css: -------------------------------------------------------------------------------- 1 | .doubanboard-list{ 2 | display: flex; 3 | flex-flow: row wrap; 4 | justify-content: flex-start; 5 | margin-top: 1em; 6 | width: calc(100% + 15px); 7 | margin-left: -15px; 8 | } 9 | .doubanboard-list,.doubanboard-list *{ 10 | box-sizing: border-box; 11 | } 12 | .doubanboard-item { 13 | position: relative; 14 | cursor: pointer; 15 | box-shadow: 0 0 4px rgba(0, 0, 0, 0.3); 16 | transition: ease all 0.3s; 17 | overflow: hidden; 18 | background: #f7fbf7; 19 | display: flex; 20 | flex-flow: column nowrap; 21 | justify-content: flex-start; 22 | border: none!important; 23 | display: block; 24 | margin-left: 15px; 25 | margin-bottom: 15px; 26 | } 27 | .doubanboard-item:hover{ 28 | box-shadow: 0 4px 6px rgba(0, 0, 0, 0.3); 29 | } 30 | .doubanboard-thumb { 31 | width: 100%; 32 | /* customize this for diffrent style */ 33 | padding-top: 141%; 34 | background-repeat: no-repeat; 35 | background-size: cover; 36 | } 37 | .doubanboard-title,.doubanboard-title a{ 38 | margin: 8px 0!important; 39 | font-size: 1.2em!important; 40 | overflow: hidden!important; 41 | text-overflow: ellipsis!important; 42 | white-space: nowrap !important; 43 | text-align: center !important; 44 | color: #202020 !important; 45 | font-weight: 700 !important; 46 | border:none !important; 47 | } 48 | /* detail panel */ 49 | .doubanboard-info{ 50 | position: absolute; 51 | top:0; 52 | left: 0; 53 | width: 100%; 54 | height: 100%; 55 | overflow: auto; 56 | -webkit-overflow-scrolling: touch; 57 | transition: all 0.3s; 58 | background-color: #f7fbf7; 59 | color: black; 60 | font-size: 0.9em; 61 | line-height: 1.3em; 62 | transform: translateY(100%); 63 | padding: 0.5em; 64 | font-size: 16px; 65 | font-weight: 400; 66 | } 67 | .doubanboard-info::-webkit-scrollbar{ 68 | background: none; 69 | width: 4px; 70 | height: 6px; 71 | border-radius:2px; 72 | } 73 | .doubanboard-info::-webkit-scrollbar-thumb{ 74 | background: rgba(0,0,0,0.2); 75 | border-radius:2px; 76 | line-height: 1.15; 77 | font-size: 1em; 78 | } 79 | .doubanboard-info::-webkit-scrollbar-thumb:hover{ 80 | background: rgba(0,0,0,0.6); 81 | } 82 | .doubanboard-info-show > .doubanboard-info{ 83 | transform: translateY(0); 84 | } 85 | /* special for douban */ 86 | .doubanboard-info>.doubanboard-info-basic{ 87 | white-space: nowrap!important; 88 | overflow: hidden; 89 | text-overflow: ellipsis; 90 | } 91 | /* loadmore button (span) */ 92 | .douban-loadmore{ 93 | display: block; 94 | padding: 0.3em; 95 | background: black; 96 | color: white; 97 | transition:0.2s; 98 | margin: 20px auto!important; 99 | width: 6em; 100 | text-align: center; 101 | cursor: pointer; 102 | } 103 | .douban-loadmore:hover{ 104 | background: rgba(0,0,0,0.6); 105 | } 106 | 107 | /* media query for responsive design */ 108 | @media screen and (max-width: 767.5px){ 109 | .doubanboard-item{ 110 | width: calc(33.333333333% - 15px); 111 | } 112 | } 113 | @media screen and (min-width:767.5px){ 114 | .doubanboard-item{ 115 | width: calc(25% - 15px); 116 | } 117 | } 118 | @media screen and (max-width:450px){ 119 | .doubanboard-item{ 120 | width: calc(50% - 15px); 121 | } 122 | } 123 | 124 | .douban-single{ 125 | max-width: 100%; 126 | height: 230px; 127 | box-shadow: 0 0 4px rgba(0, 0, 0, 0.3); 128 | border-radius: 8px; 129 | overflow: hidden; 130 | position: relative; 131 | } 132 | .douban-single-img{ 133 | position: absolute; 134 | left: 0; 135 | top: 0; 136 | width: 22%; 137 | height: 100%; 138 | float: left; 139 | background-size: cover; 140 | background-position: center center; 141 | } 142 | .douban-single-info{ 143 | position: absolute; 144 | width: 76%; 145 | height: 100%; 146 | top: 0; 147 | right: 0; 148 | margin-left: 24%; 149 | overflow-y: auto; 150 | -webkit-overflow-scrolling: touch; 151 | padding: 0.2em 0.5em 0.5em 0; 152 | font-size: 16px; 153 | font-weight: 400; 154 | line-height: 1.4; 155 | } 156 | .douban-single-info::-webkit-scrollbar{ 157 | background: none; 158 | width: 4px; 159 | height: 6px; 160 | border-radius:2px; 161 | } 162 | .douban-single-info::-webkit-scrollbar-thumb{ 163 | background: rgba(0,0,0,0.2); 164 | border-radius:2px; 165 | line-height: 1.15; 166 | font-size: 1em; 167 | } 168 | .douban-single-info::-webkit-scrollbar-thumb:hover{ 169 | background: rgba(0,0,0,0.6); 170 | } 171 | .douban-single-summary{ 172 | margin-top: 0.3em; 173 | display: inline-block; 174 | } 175 | .douban-single-title{ 176 | font-size: 1.3em; 177 | color: #1abc9c; 178 | text-decoration: none; 179 | padding: 0; 180 | margin: 0; 181 | border:none!important; 182 | } 183 | .douban-single-rating{ 184 | background-image: url(/usr/plugins/DoubanBoard/assets/rating.png); 185 | display: inline-block; 186 | width: 75px; 187 | height: 15px; 188 | } 189 | .douban-single-meta{ 190 | font-size: 0.8em; 191 | font-size: 0.8em; 192 | display: inline-block; 193 | margin: 0.5em 0; 194 | opacity: 0.5; 195 | } 196 | @media screen and (max-width:767px){ 197 | .douban-single{ 198 | height: 160px; 199 | } 200 | .douban-single-img{ 201 | width: 32%; 202 | } 203 | .douban-single-info{ 204 | margin-left: 35%; 205 | width: 65%; 206 | } 207 | } -------------------------------------------------------------------------------- /vCards/assets/icons/icon-photo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /vCards/page-Say.php: -------------------------------------------------------------------------------- 1 | need('layout/header.php'); 10 | ?> 11 | 12 | need('layout/sidebar.php'); ?> 13 |
    14 |
    15 |
    16 |
    17 |

    18 | title() ?> 19 |

    20 |
    21 | options->slimg && 'guanbi'==$this->options->slimg): ?> 22 | 23 | options->slimg && 'showoff'==$this->options->slimg): ?> 24 | 25 | 26 | 27 | 28 |
    29 |
    30 |
    31 | 32 | authorId) { 35 | if ($comments->authorId == $comments->ownerId) { 36 | $group = '博主'; 37 | $commentClass .= ' comment-by-author'; //如果是文章作者的评论添加 .comment-by-author 样式 38 | } else { 39 | $group = ''; 40 | $commentClass .= ' comment-by-user'; //如果是评论作者的添加 .comment-by-user 样式 41 | } 42 | } 43 | $commentLevelClass = $comments->_levels > 0 ? ' comment-child' : ' comment-parent'; //评论层数大于0为子级,否则是父级 44 | ?> 45 | 46 | 47 | 48 | 49 |
  • 59 | 60 | 61 |
    62 | 63 | 64 | 65 | 66 |
    67 |
    68 |
    69 |
    70 |

    content); ?>

    71 |

    72 |
    73 |
    74 |
    75 |
    76 |
    77 | 78 | 79 | 80 | children) { ?> 81 |
    82 | threadedComments($options); ?> 83 |
    84 | 85 | 86 | 87 | 88 |
  • 89 | 90 | 91 | 92 | 93 | allow('comment')): ?> 94 | 95 | 96 |
    97 | comments()->to($comments); ?> 98 |
    99 |
    100 | 101 | 102 | cancelReply(); ?> 103 | 104 | 105 |
    106 | 107 | 108 |
    109 | user->hasLogin()): ?> 110 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 |
    123 |
    124 | 125 | have()): ?> 126 | 127 |
    128 | listComments(); ?> 129 |
    130 | 133 | 134 | 135 |

    136 | 137 |
    138 | 139 | 140 |
    141 | 142 | 143 | 154 | need('layout/footer.php'); ?> -------------------------------------------------------------------------------- /推荐插件/QPlayer2/Action.php: -------------------------------------------------------------------------------- 1 | request; 21 | 22 | $do = $request->get('do'); 23 | if ($do == 'flush') { 24 | $config = Config::getConfig(); 25 | try { 26 | if ($config->cacheType == 'none') { 27 | echo _t('没有配置缓存!'); 28 | } else { 29 | Cache::BuildWithConfig($config)->flush(); 30 | echo _t('操作成功!'); 31 | } 32 | echo _t('5 秒后自动关闭!'); 33 | echo ''; 34 | } catch (Exception $e) { 35 | throw new Exception(_t('操作失败!'), 0, $e); 36 | } 37 | return; 38 | } 39 | 40 | $server = $request->get('server'); 41 | $type = $request->get('type'); 42 | $id = $request->get('id'); 43 | 44 | if (!$this->test($server, $type, $id)) { 45 | http_response_code(403); 46 | die(); 47 | } 48 | 49 | include_once 'libs/Meting.php'; 50 | $m = new Metowolf\Meting($server); 51 | $m->format(true); 52 | 53 | $config = Config::getConfig(); 54 | $cookie = $config->cookie; 55 | if ($server == 'netease' && !empty($cookie)) { 56 | $m->cookie($cookie); 57 | } 58 | 59 | $cache = $config->cacheType == 'none' ? null : Cache::BuildWithConfig($config); 60 | $key = $server . $type . $id; 61 | if ($cache != null) { 62 | $data = $cache->get($key); 63 | } 64 | if (empty($data)) { 65 | $arg2 = null; 66 | $expire = 7200; 67 | switch ($type) { 68 | case 'audio': 69 | $type = 'url'; 70 | $arg2 = $config->bitrate; 71 | $expire = 1200; 72 | break; 73 | case 'cover': 74 | $type = 'pic'; 75 | $arg2 = 64; 76 | $expire = 86400; 77 | break; 78 | case 'lrc': 79 | $type = 'lyric'; 80 | $expire = 86400; 81 | break; 82 | case 'artist': 83 | $arg2 = 50; 84 | break; 85 | } 86 | $data = $m->$type($id, $arg2); 87 | $data = json_decode($data, true); 88 | switch ($type) { 89 | case 'url': 90 | case 'pic': 91 | $url = $data['url']; 92 | if (empty($url)) { 93 | if ($server != 'netease') { 94 | http_response_code(403); 95 | die(); 96 | } 97 | $url = 'https://music.163.com/song/media/outer/url?id=' . $id . '.mp3'; 98 | } else { 99 | $url = preg_replace('/^http:/', 'https:', $url); 100 | } 101 | $data = $url; 102 | break; 103 | case 'lyric': 104 | $data = $data['lyric'] . "\n" . $data['tlyric']; 105 | break; 106 | default: 107 | $url = Typecho_Common::url('action/QPlayer2', Helper::options()->index); 108 | $array = array(); 109 | foreach ($data as $v) { 110 | $prefix = $url . '?server=' . $v['source']; 111 | $array []= array( 112 | 'name' => $v['name'], 113 | 'artist' => implode(' / ', $v['artist']), 114 | 'audio' => $prefix . '&type=audio&id=' . $v['url_id'], 115 | 'cover' => $prefix . '&type=cover&id=' . $v['pic_id'], 116 | 'lrc' => $prefix . '&type=lrc&id=' . $v['lyric_id'], 117 | 'provider' => 'default' 118 | ); 119 | } 120 | $data = json_encode($array); 121 | } 122 | if ($cache != null) { 123 | $cache->set($key, $data, $expire); 124 | } 125 | } 126 | switch ($type) { 127 | case 'url': 128 | case 'pic': 129 | case 'audio': 130 | case 'cover': 131 | $this->response->redirect($data); 132 | break; 133 | case 'lrc': 134 | case 'lyric': 135 | header("Content-Type: text/plain"); 136 | break; 137 | default: 138 | header("Content-Type: application/json"); 139 | break; 140 | } 141 | echo $data; 142 | } 143 | 144 | private function test($server, $type, $id) 145 | { 146 | if (!in_array($server, array('netease', 'tencent', 'baidu', 'xiami', 'kugou'))) { 147 | return false; 148 | } 149 | if (!in_array($type, array('audio', 'cover', 'lrc', 'song', 'album', 'artist', 'playlist'))) { 150 | return false; 151 | } 152 | if (empty($id)) { 153 | return false; 154 | } 155 | return true; 156 | } 157 | } -------------------------------------------------------------------------------- /vCards/page-More.php: -------------------------------------------------------------------------------- 1 | need('layout/header.php'); 10 | ?> 11 | need('layout/sidebar.php'); ?> 12 |
    13 |
    14 |
    15 |

    [更多]

    16 |
    17 | options->BooksUrl && $this->options->FilmsUrl && $this->options->MusicUrl && $this->options->PhotosUrl && $this->options->WorksUrl && $this->options->SayUrl && $this->options->LogsUrl && $this->options->LinksUrl && $this->options->AboutUrl): ?> 18 |
    19 | options->more_page) && in_array('Books', $this->options->more_page)): ?> 20 | 21 | 31 | 32 | 33 | options->more_page) && in_array('Films', $this->options->more_page)): ?> 34 | 35 | 45 | 46 | 47 | options->more_page) && in_array('Music', $this->options->more_page)): ?> 48 | 49 | 59 | 60 | 61 | options->more_page) && in_array('Photos', $this->options->more_page)): ?> 62 | 63 | 73 | 74 | 75 | options->more_page) && in_array('Works', $this->options->more_page)): ?> 76 | 77 | 87 | 88 | 89 | options->more_page) && in_array('Say', $this->options->more_page)): ?> 90 | 91 | 101 | 102 | 103 | options->more_page) && in_array('Logs', $this->options->more_page)): ?> 104 | 105 | 115 | 116 | 117 | options->more_page) && in_array('Links', $this->options->more_page)): ?> 118 | 119 | 129 | 130 | 131 | options->more_page) && in_array('About', $this->options->more_page)): ?> 132 | 133 | 143 | 144 |
    145 | 146 | 147 |
    148 | need('layout/footer.php'); ?> 149 | 150 | -------------------------------------------------------------------------------- /vCards/assets/img/logo-1.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /vCards/404.php: -------------------------------------------------------------------------------- 1 | 2 | need('header.php'); ?> 3 | need('sidebar.php'); ?> 4 | 5 |
    6 |
    7 |
    8 | 9 | 10 | 11 | 151 | 152 | 153 |
    154 |

    4

    155 |
    156 |
    157 |
    158 |
    159 |
    160 |
    161 |
    162 |
    163 |
    164 |
    165 |
    166 |
    167 | 168 |
    169 |
    170 |
    171 |
    172 |
    173 |
    174 |
    175 |
    176 |
    177 |
    178 |
    179 |
    180 |

    4

    181 |

    Uh Oh! Page not found!

    182 |
    183 | 184 | 185 | 186 | 222 | 223 | 224 | 225 | 226 | 227 |
    228 |
    229 | 230 | 231 | need('footer.php'); ?> -------------------------------------------------------------------------------- /vCards/page-Logs.php: -------------------------------------------------------------------------------- 1 | need('layout/header.php'); 10 | ?> 11 | need('layout/sidebar.php'); ?> 12 |
    13 |
    14 |
    15 |
    16 |

    17 | title() ?> 18 |

    19 |
    20 | options->slimg && 'guanbi'==$this->options->slimg): ?> 21 | 22 | options->slimg && 'showoff'==$this->options->slimg): ?> 23 | 24 | 25 | 26 | 27 |
    28 |
    29 |
    30 | authorId) { 33 | if ($comments->authorId == $comments->ownerId) { 34 | $group = '博主'; 35 | $commentClass .= ' comment-by-author'; //如果是文章作者的评论添加 .comment-by-author 样式 36 | } else { 37 | $group = ''; 38 | $commentClass .= ' comment-by-user'; //如果是评论作者的添加 .comment-by-user 样式 39 | } 40 | } 41 | $commentLevelClass = $comments->_levels > 0 ? ' comment-child' : ' comment-parent'; //评论层数大于0为子级,否则是父级 42 | ?> 43 | 65 |
  • 75 | 76 | 77 |
    78 |
    79 |
    80 |
    81 |
    author(); ?>
    82 | date('Y-m-d H:i'); ?> 83 |

    content); ?>

    84 |
    85 | 86 |
    87 |
    88 |
    89 | 90 | 91 | 92 | children) { ?> 93 |
    94 | threadedComments($options); ?> 95 |
    96 | 97 | 98 | 99 | 100 |
  • 101 | 102 | 103 | 104 | 105 | allow('comment')): ?> 106 | 107 | 108 |
    109 | comments()->to($comments); ?> 110 |
    111 |
    112 | 113 | 114 | cancelReply(); ?> 115 | 116 | 117 |
    118 | 119 | 120 |
    121 | user->hasLogin()): ?> 122 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 |
    135 |
    136 | 137 | have()): ?> 138 | 139 |
    140 | listComments(); ?> 141 |
    142 | 145 | 146 | 147 |

    148 | 149 |
    150 | 151 | 152 | 153 |
    154 | 155 | 156 | 167 | 168 | 169 | 170 | need('layout/footer.php'); ?> 171 | 172 | 173 | -------------------------------------------------------------------------------- /推荐插件/Links/Action.php: -------------------------------------------------------------------------------- 1 | request->OEM == 'tf') { 14 | $link = array( 15 | 'name' => 'Typecho Fans', 16 | 'url' => 'https://typecho-fans.github.io', 17 | 'email' => 'typechoer@126.com', 18 | 'image' => 'https://typecho-fans.github.io/text-logo.svg', 19 | 'description' => 'Typecho非官方粉丝群开源作品社区' 20 | ); 21 | } else { 22 | if (Links_Plugin::form('insert')->validate()) { 23 | $this->response->goBack(); 24 | } 25 | $link = $this->request->from('lid', 'email', 'image', 'url', 'state'); 26 | /** 过滤XSS */ 27 | $link['name'] = $this->request->filter('xss')->name; 28 | $link['sort'] = $this->request->filter('xss')->sort; 29 | $link['description'] = $this->request->filter('xss')->description; 30 | $link['user'] = $this->request->filter('xss')->user; 31 | } 32 | $link['order'] = $this->db->fetchObject($this->db->select(array('MAX(order)' => 'maxOrder'))->from($this->prefix.'links'))->maxOrder + 1; 33 | 34 | /** 插入数据 */ 35 | $link['lid'] = $this->db->query($this->db->insert($this->prefix.'links')->rows($link)); 36 | 37 | /** 设置高亮 */ 38 | $this->widget('Widget_Notice')->highlight('link-'.$link['lid']); 39 | 40 | /** 提示信息 */ 41 | $this->widget('Widget_Notice')->set(_t('友链%s已经被增加', 42 | ' '.$link['name'].' '), null, 'success'); 43 | 44 | /** 转向原页 */ 45 | $this->response->redirect(Typecho_Common::url('extending.php?panel=Links%2Fmanage-links.php', $this->options->adminUrl)); 46 | } 47 | 48 | public function updateLink() 49 | { 50 | if (Links_Plugin::form('update')->validate()) { 51 | $this->response->goBack(); 52 | } 53 | 54 | /** 取出数据 */ 55 | $link = $this->request->from('lid', 'email', 'image', 'url', 'state'); 56 | /** 过滤XSS */ 57 | $link['name'] = $this->request->filter('xss')->name; 58 | $link['sort'] = $this->request->filter('xss')->sort; 59 | $link['description'] = $this->request->filter('xss')->description; 60 | $link['user'] = $this->request->filter('xss')->user; 61 | 62 | /** 更新数据 */ 63 | $this->db->query($this->db->update($this->prefix.'links')->rows($link)->where('lid = ?', $link['lid'])); 64 | 65 | /** 设置高亮 */ 66 | $this->widget('Widget_Notice')->highlight('link-'.$link['lid']); 67 | 68 | /** 提示信息 */ 69 | $this->widget('Widget_Notice')->set(_t('友链%s已经被更新', 70 | ' '.$link['name'].' '), null, 'success'); 71 | 72 | /** 转向原页 */ 73 | $this->response->redirect(Typecho_Common::url('extending.php?panel=Links%2Fmanage-links.php', $this->options->adminUrl)); 74 | } 75 | 76 | public function deleteLink() 77 | { 78 | $lids = $this->request->filter('int')->getArray('lid'); 79 | $deleteCount = 0; 80 | if ($lids && is_array($lids)) { 81 | foreach ($lids as $lid) { 82 | if ($this->db->query($this->db->delete($this->prefix.'links')->where('lid = ?', $lid))) { 83 | $deleteCount ++; 84 | } 85 | } 86 | } 87 | /** 提示信息 */ 88 | $this->widget('Widget_Notice')->set($deleteCount > 0 ? _t('友链已经删除') : _t('没有友链被删除'), null, 89 | $deleteCount > 0 ? 'success' : 'notice'); 90 | 91 | /** 转向原页 */ 92 | $this->response->redirect(Typecho_Common::url('extending.php?panel=Links%2Fmanage-links.php', $this->options->adminUrl)); 93 | } 94 | 95 | public function enableLink() 96 | { 97 | $lids = $this->request->filter('int')->getArray('lid'); 98 | $enableCount = 0; 99 | if ($lids && is_array($lids)) { 100 | foreach ($lids as $lid) { 101 | if ($this->db->query($this->db->update($this->prefix.'links')->rows(array('state' => '1'))->where('lid = ?', $lid))) { 102 | $enableCount ++; 103 | } 104 | } 105 | } 106 | /** 提示信息 */ 107 | $this->widget('Widget_Notice')->set($enableCount > 0 ? _t('友链已经启用') : _t('没有友链被启用'), null, 108 | $enableCount > 0 ? 'success' : 'notice'); 109 | 110 | /** 转向原页 */ 111 | $this->response->redirect(Typecho_Common::url('extending.php?panel=Links%2Fmanage-links.php', $this->options->adminUrl)); 112 | } 113 | 114 | public function prohibitLink() 115 | { 116 | $lids = $this->request->filter('int')->getArray('lid'); 117 | $prohibitCount = 0; 118 | if ($lids && is_array($lids)) { 119 | foreach ($lids as $lid) { 120 | if ($this->db->query($this->db->update($this->prefix.'links')->rows(array('state' => '0'))->where('lid = ?', $lid))) { 121 | $prohibitCount ++; 122 | } 123 | } 124 | } 125 | /** 提示信息 */ 126 | $this->widget('Widget_Notice')->set($prohibitCount > 0 ? _t('友链已经禁用') : _t('没有友链被禁用'), null, 127 | $prohibitCount > 0 ? 'success' : 'notice'); 128 | 129 | /** 转向原页 */ 130 | $this->response->redirect(Typecho_Common::url('extending.php?panel=Links%2Fmanage-links.php', $this->options->adminUrl)); 131 | } 132 | 133 | public function sortLink() 134 | { 135 | $links = $this->request->filter('int')->getArray('lid'); 136 | if ($links && is_array($links)) { 137 | foreach ($links as $sort => $lid) { 138 | $this->db->query($this->db->update($this->prefix.'links')->rows(array('order' => $sort + 1))->where('lid = ?', $lid)); 139 | } 140 | } 141 | } 142 | 143 | public function getMd5() 144 | { 145 | $this->response->throwJson(md5($this->request->email)); 146 | } 147 | 148 | public function action() 149 | { 150 | Helper::security()->protect(); 151 | Typecho_Widget::widget('Widget_User')->pass('administrator'); 152 | $this->db = Typecho_Db::get(); 153 | $this->prefix = $this->db->getPrefix(); 154 | $this->options = Typecho_Widget::widget('Widget_Options'); 155 | $this->on($this->request->is('do=insert'))->insertLink(); 156 | $this->on($this->request->is('do=update'))->updateLink(); 157 | $this->on($this->request->is('do=delete'))->deleteLink(); 158 | $this->on($this->request->is('do=enable'))->enableLink(); 159 | $this->on($this->request->is('do=prohibit'))->prohibitLink(); 160 | $this->on($this->request->is('do=sort'))->sortLink(); 161 | $this->on($this->request->is('do=md5'))->getMd5(); 162 | $this->response->redirect($this->options->adminUrl); 163 | } 164 | } 165 | --------------------------------------------------------------------------------