Jekyll·利用腾讯云COS为博客添加相册模块

个人博客小站刚建站不久,想着除了主题里的功能外再添加上相册模块,于是半搜索半摸索把相册模块搞出来了,最后采用了利用腾讯云对象存储作图床的方案,在国内速度也快,不用上传图片还来修改代码,只负责上传图片就好。我参考了以下博文给hexo静态博客添加动态相册功能(用了他的头图🐶)

实现本模块需要两方面的设置:一是腾讯云对象存储;二是代码层添加相关页面;

腾讯云部分设置

腾讯云新用户使用对象存储每月有50G的免费额度,持续6个月。但是!不包括下行流量等其他消费,这只是存储额度,每月还是需要花点小钱的,对于个人博客来说花销不会很大。

  1. 登录腾讯云账号后选择菜单云产品->对象存储

  2. 点击使用,选择存储桶列表然后新建,输入名称,选择地域,其他一切默认就好

  3. 然后在存储桶里上传一些照片,此时复制访问域名到地址栏里看看是否可以访问(该访问域名代码层需要用到,很重要)

  4. 不出意外应该会如下图所示,因为没有设置相关权限,暂时无法直接访问

  5. 点击权限管理,然后如图所示选择添加即可,完成后再进行第三步操作应该没问题啦

  6. 最后再开启防盗链,这样别人就不能偷偷用你流量和图片还不用付钱啦,选择基础配置->防盗链设置进行编辑,如下图所示,重点是Referer,即只有这里填写的IP地址或域名才能使用,其他人无法访问

注意事项

  • 上传照片前,先在存储桶中建立一个文件夹,也就是你的相册名字,当然你也可以新建多个文件夹。
  • 但是有一点需要需要注意的是,不能直接上传一个文件夹,那样会出bug,见完文件夹后往里面上传照片,文件夹里面不能再新建文件夹了(除非你自己改造下面的相应代码)
  • 照片一定放在一个文件夹中,有文件夹又有单独的照片,相册是不会显示的(跟代码有关)

Jekyll配置

  1. 在项目里添加一个相册目录album,然后添加index.html(根据代码层次可能略有差异,不知道的话先去了解各个模块的功能吧)。

  2. 然后_config.yml配置文件中的菜单栏里也加上相册模块

  3. 在相册页面的index.html添加如下代码,其中JS代码是重点,页面布局可以看个人喜好啦:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    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
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    <style type="text/css">
    			.main {
    			padding-bottom: 150px;
    			margin-top: 0px;
    			}
    			body {
    				background-size: 100%;
    				/*background-position: top left;*/
    			}
    			.imgbox{
    			 width: 100%;
    			 overflow: hidden;
    			}
    			.box{
    				visibility: visible;
    				overflow: auto; 
    				zoom: 1;
    			}
    			.box li{
    			float: left;
    			width: 25%;
    			position: relative;
    			overflow: hidden;
    			text-align: center;
    			list-style: none;
    			margin: 0;
    			/*display: inline;*/
    			padding: 0;
    			}
    			.box li span{
    			display: block;
    			font-size: 16px;
    			font-weight: 600;
    			font-family: fantasy;
    			-webkit-box-sizing: border-box;
    			box-sizing: border-box;
    			}
    			img.imgitem{
    				padding: unset;
    				padding: unset;
    				border: unset;
    				position: relative;
    				padding: 0px;
    				height: auto;
    				width: 100%;
    			}
    		.v{
    			width: 95%;
    			padding-top: 40px;
        		margin: 0 auto;
    		}
    		div#posts.posts-expand {
    			border: unset;
    			padding: unset;
    			margin-bottom: 10px;
    		}
    		.posts-expand .post-body img{
    			padding: 12px !important;
    		}
    		.box p{
    			display: block;
    			font-size: 12px;
    			font-family: 'SwisMedium';
    			-webkit-box-sizing: border-box;
    			box-sizing: border-box;
    			text-align: center;
    		}
    		.box span strong{
    			background: rgba(0,0,0,0.4);
    			padding: 20px;
    		}
    		.posts-expand .post-title {
    			display: none;
    		}
    		.title{
    			width: 40%;
    			margin: 0 auto;
    			text-align: center;
    		}
    		.title h2{
    			border: double;
    		    color: white;
    		    width: 70%;
    		    margin: 0 auto;
    		    background-color: tomato;
    		}
    		.title hr{
    			height:2px;
    		}
    		.btn-more-posts{
    			display: inline-block;
    			vertical-align: middle;
    			font: 85px/250px 'ChaletComprimeMilanSixty';
    			color: #000;
    			width: 100%;
    			text-align: center;
    			border: unset;
    			height: 400px;
    			background-color: #121212;
    			-webkit-box-sizing: border-box;
    			box-sizing: border-box;
    		}
    		@media (max-width: 767px){
    			.box li {
    			width: 100%;
    		}
    		.posts-expand .post-body img{
    			padding: 0px !important;
    		}
    		.box span {
    			border-right: unset;
    			font-size: 17px;
    		}
    		.box p{
    			border-right: unset;
    			font-size: 12px;
       		  
    		}
    		.posts-expand {
    			margin: unset;
    		}
    			div#comments.comments.v {
    			width: 96%;
    			padding-top: 50px;
    		}
    		}
    		@media (min-width: 1600px){
    			.container .main-inner{
    				width: 100%;
    			}
    		}
    		.footer{
    			background-color: #121212 !important;
    		}
    		.v .vwrap .vmark .valert .vcode {
    			background: #00050b !important;
    		}
    		.nav>li {
    			float: left;
    		}
    		.imgbox img{
    			width: 95%;
    		}
    		.container-fluid a{
    			border-bottom-style: none;
    			color: #555;
    		}
    		</style>
    		</head>
    		<nav class="navbar navbar-default" role="navigation">
    		<div class="container-fluid"> 
    		<div class="navbar-header">
    			<button type="button" class="navbar-toggle" data-toggle="collapse"
    					data-target="#example-navbar-collapse">
    				<span class="sr-only">切换导航</span>
    				<span class="icon-bar"></span>
    				<span class="icon-bar"></span>
    				<span class="icon-bar"></span>
    			</button>
    			<a class="navbar-brand" href="https://jiangsang.github.io/">Jianger's Blog</a>
    		</div>
    		<div class="collapse navbar-collapse" id="example-navbar-collapse">
    			<ul class="nav navbar-nav">
    				<li><a href="https://jiangsang.github.io/"><i class="menu-item-icon fa fa-fw fa-home"></i>首页</a></li>
    				<li><a href="https://jiangsang.github.io/about"><i class="menu-item-icon fa fa-fw fa-user"></i>关于</a></li>
    				<li><a href="https://jiangsang.github.io/archives/"><i class="menu-item-icon fa fa-fw fa-archive"></i>归档</a></li>
    				<li><a href="https://jiangsang.github.io/tags/"><i class="menu-item-icon fa fa-fw fa-tags"></i>标签</a></li>
    				<li><a href="https://jiangsang.github.io/life/"><i class="menu-item-icon fa fa-fw fa-apple"></i>生活</a></li>
    				<li class="active"><a href="https://jiangsang.github.io/life/"><i class="menu-item-icon fa fa-fw fa-camera-retro"></i>相册</a></li>
    			</ul>
    		</div>
    		</div>
    	</nav>
    		<div id="box" class="box"></div>
    		<script type="text/javascript">
    		function loadXMLDoc(xmlUrl) 
    		{
    			try //Internet Explorer
    			{
    				xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
    			}
    			catch(e)
    			{
    			  try //Firefox, Mozilla, Opera, etc.
    				{
    				  xmlDoc=document.implementation.createDocument("","",null);
    				}
    			  catch(e) {alert(e.message)}
    			}
       			
    			try 
    			{
    				  xmlDoc.async=false;
    				  xmlDoc.load(xmlUrl);
    			}
    			catch(e) {
    				try //Google Chrome  
    				  {  
    					var chromeXml = new XMLHttpRequest();
    					chromeXml.open("GET", xmlUrl, false);
    					chromeXml.send(null);
    					xmlDoc = chromeXml.responseXML.documentElement; 				
    					//alert(xmlDoc.childNodes[0].nodeName);
    					//return xmlDoc;    
    				  }  
    				  catch(e)  
    				  {  
    					  alert(e.message)  
    				  }  		  	
    			}
    			return xmlDoc; 
    		}
    		//xmllink就是你的相册存储桶的访问域名
    		xmllink="xxx";
    		xmlDoc=loadXMLDoc(xmllink);
    		var urls=xmlDoc.getElementsByTagName('Key');
    		var date=xmlDoc.getElementsByTagName('LastModified');
    		var showNum=12; //每个相册一次展示多少照片
    		if ((window.innerWidth)>1200) {wid=(window.innerWidth*3)/18;}
    		var box=document.getElementById('box');
    		var i=0;
    		var content=new Array();
    		var tmp=0;
    		var kkk=-1;
    		for (var t = 0; t < urls.length ; t++) {
    			var bucket=urls[t].innerHTML;
    			var length=bucket.indexOf('/');
    			if(length===bucket.length-1){
    				kkk++;
    				content[kkk]=new Array();
    				content[kkk][0]={'url':bucket,'date':date[t].innerHTML.substring(0,10)};
    				tmp=1;
    			}
    			else {
    				content[kkk][tmp++]={'url':bucket.substring(length+1),'date':date[t].innerHTML.substring(0,10)};
    			}
    		}
    		for (var i = 0; i < content.length; i++) {
    			var conBox=document.createElement("div");
    			conBox.id='conBox'+i;
    			conBox.style='display: inline-block;';
    			box.appendChild(conBox);
    			var item=document.createElement("div");
    			var title=content[i][0].url;
    			item.innerHTML="<div class=title style=margin-top:20px;><h2>"+title.substring(0,title.length-1)+"</h2><hr/></div>";
    			conBox.appendChild(item);
    			for (var j = 1; j < content[i].length && j < showNum+1; j++) {
    				var con=content[i][j].url;
    				var item=document.createElement("li");
    				item.innerHTML="<div class=imgbox id=imgbox><img class=imgitem src="+xmllink+'/'+title+con+" alt="+con+"></div><span>"+con.substring(0,con.length-4)+"</span><p>上传于"+content[i][j].date+"</p>";
    				conBox.appendChild(item);
    			}
    			if(content[i].length > showNum){
    				var moreItem=document.createElement("button");
    				moreItem.className="btn-more-posts";
    				moreItem.id="more"+i;
    				moreItem.value=showNum+1;
    				let cur=i;
    				moreItem.onclick= function (){
    					moreClick(this,cur,content[cur],content[cur][0].url);
    				}
    				moreItem.innerHTML="<span style=display:inline;><strong style=color:#f0f3f6;>加载更多</strong></span>";
    				conBox.appendChild(moreItem);
    			}
    		}
    

    再往cos存储桶里上传照片,就可以了!访问后效果如下

    相册布局界面

    主题有默认布局,如果不想要在默认布局的基础上放置内容页面需要在layout文件下添加布局代码album.html,然后album目录下的index.html需要添加layout:album代码,意思便是使用album布局喽

    这个很重要,每个人喜好不同,花点时间打造成自己喜欢的相册空间吧!

本文已结束 ❤ 感谢阅读
觉得文章不错,赞赏站长一包辣条( •̆ ᵕ •̆ )◞ ❤
0%