├── 推荐插件
├── 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 |
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 |
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 |
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 |
29 |
30 |
31 |
32 | links("SHOW_MIX"); ?>
33 |
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 .= '
32 | '. $archives->title .'
33 | '.date('n-d',$archives->created).'
34 | '; //输出文章日期和标题
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 |
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 |
29 |
30 |
31 |
32 |
33 | /s';
35 | $replacement = '
36 |
37 |
38 |
39 |
40 |
41 |
42 | ${4}
43 |
44 |
45 | ';
46 | $content = preg_replace($pattern, $replacement, $this->content);
47 | echo $content;
48 | ?>
49 |
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 |
29 |
30 |
31 |
32 |
项目
33 |
34 | Category
35 | 全部
36 | 网站
37 | 软件
38 | 小程序
39 | 设计
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 | vCards-一款typecho模板
54 | 网站
55 |
56 |
57 |
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 |
69 |
70 | comments()->to($comments); ?>
71 |
72 | allow('comment')): ?>
73 |
74 |
81 | user->hasLogin()): ?>
82 |
95 |
96 |
97 |
98 |
99 |
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 |
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 |
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 |
65 |
66 |
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 | [](https://github.com/jzwalk) | [](https://github.com/he0119) | [](https://github.com/Mejituu) | [](https://github.com/jrotty) | [](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 |
47 |
48 |
49 |
50 |
51 |
52 |
53 | ]*>/i';
55 | $replacement = '
';
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 | type="button" id="agree-btn" data-cid="cid; ?>" data-url="permalink(); ?>">
73 |
74 |
75 |
76 |
77 |
78 |
79 |
- THE END -
80 |
84 |
85 |
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 |
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 |
50 | author(); ?> 51 |
52 |55 |- created);?>
56 | - agent); ?> · agent); ?>
57 |
58 |