前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【教程】Typecho Joe主题开启并修复壁纸相册不显示问题

【教程】Typecho Joe主题开启并修复壁纸相册不显示问题

作者头像
小锋学长生活大爆炸
发布于 2023-12-31 00:02:54
发布于 2023-12-31 00:02:54
38200
代码可运行
举报
运行总次数:0
代码可运行

转载请注明出处:小锋学长生活大爆炸[xfxuezhang.cn]

背景说明

Joe主题本身支持“壁纸”功能,其实就是相册。当时还在网上找了好久相册部署的开源项目,太傻了。

但是网上教程很少,一没说如何开启壁纸功能,二没说开启后为何不显示图片,三没说如何显示自定义图片。

通过层层深扒源码,我已经成功修复并实现了上述问题。所以,这个重任还是由我来吧。接下来将是非常详细的图文教程,小白有手就行。

开启壁纸

进入后台,创建独立页面

标题随便填,最关键的是模板要选“壁纸”

直接发布页面即可

发布后点上面这个提示进去页面

比如我的:https://xfxuezhang.cn/index.php/tuji.html

此时你会看到一直在转圈圈,你也不知道如何去添加图片

修复显示

SSH进入服务器后台,进到Joe主题下面的public目录。这个路径都是一样的,直接复制即可

代码语言:javascript
代码运行次数:0
运行
复制
cd /var/www/html/usr/themes/Joe/public/

打开route.php,直接替换里面的两个函数

代码语言:javascript
代码运行次数:0
运行
复制
vim route.php

function _getWallpaperType($self) 改成

代码语言:javascript
代码运行次数:0
运行
复制
/* 获取壁纸分类 已测试 √ */
function _getWallpaperType($self)
{
	header('Content-Type: application/json');

	$self->response->setStatus(200);
	$json = file_get_contents("http://cdn.apc.360.cn/index.php?c=WallPaper&a=getAllCategoriesV2&from=360chrome");
	$res = json_decode($json, TRUE);
	if ($res['errno'] == 0) {
		$self->response->throwJson([
			"code" => 1,
			"data" => $res['data']
		]);
	} else {
		$self->response->throwJson([
			"code" => 0,
			"data" => null
		]);
	}
}

function _getWallpaperList($self) 改成

代码语言:javascript
代码运行次数:0
运行
复制
/* 获取壁纸列表 已测试 √ */
function _getWallpaperList($self)
{
	header('Content-Type: application/json');

	$self->response->setStatus(200);
	$cid = $self->request->cid;
	$start = $self->request->start;
	$count = $self->request->count;
	$json = file_get_contents("http://wallpaper.apc.360.cn/index.php?c=WallPaper&a=getAppsByCategory&cid={$cid}&start={$start}&count={$count}&from=360chrome");
	$res = json_decode($json, TRUE);
	if ($res['errno'] == 0) {
		// 数据总数
        $total = $res['total'];
		$self->response->throwJson([
			"code" => 1,
			"data" => $res['data'],
			"total" => $total
		]);
	} else {
		$self->response->throwJson([
			"code" => 0,
			"data" => null
		]);
	}
	
}

保存后刷新页面,就可以惊喜的发现能成功显示360壁纸了

自定义图片

那如何让它显示我们自己的图片呢?Joe显示壁纸的代码是固定的,所以我们只需要按照360壁纸的接口来设计我们的服务api就行。

壁纸分类接口

先看壁纸分类,360接口示例:

http://cdn.apc.360.cn/index.php?c=WallPaper&a=getAllCategoriesV2&from=360chrome

实际有用的

代码语言:javascript
代码运行次数:0
运行
复制
{
    "errno": "0",
    "total": "1",
    "data": [
        {
            "id": "1",
            "name": "xxx"
        }
    ]
}

如果你有服务程序开着,那么就返回这种类型的数据就行。我不想单独再开个监听服务程序,所以后面会讲我的简单方法。

壁纸图片接口

对于根据分类获取图片的360接口:

http://wallpaper.apc.360.cn/index.php?c=WallPaper&a=getAppsByCategory&cid={

实际有用的:

代码语言:javascript
代码运行次数:0
运行
复制
{
  "errno": "0",
  "total": "1884",
  "data": [
    {
      "id": "1",
      "url": "http://xfxuezhang.cn/mypics/1/0366_PT1814-2_7E8DB7C0.jpg"
    },
  ]
}

同样的, 如果你有服务程序开着,那么就返回这种类型的数据就行。我不想单独再开个监听服务程序,所以后面会讲我的简单方法。

替换自己的图片

超级简单的方法。直接在网站目录下创建一个文件夹,里面每个子目录就是一个分类,子目录名是cid,分类信息用image_types.json保存,图片信息用image_details_{cid}.json保存,而generate.py可以根据子目录自动生成image_details_{cid}.json。

举个栗子,我创建了mypics目录

代码语言:javascript
代码运行次数:0
运行
复制
mkdir /var/www/html/mypics

目录结构:

子目录1中的内容:

image_types.json

代码语言:javascript
代码运行次数:0
运行
复制
{
    "errno": "0",
    "total": "1",
    "data": [
        {
            "id": "1",
            "name": "涂料印花"
        }
    ]
}

generate.py

代码语言:javascript
代码运行次数:0
运行
复制
import os
import json

# 指定图片存放的目录
pics_directory = "./"

# 遍历pics_directory目录下的子目录
for cid in os.listdir(pics_directory):
    if not os.path.isdir(cid):
        continue
    print(f">> 正在处理:{cid}")
    # 构建JSON文件路径
    json_file_path = os.path.join(pics_directory, cid, f"image_details_{cid}.json")
    output_file = os.path.join(pics_directory, f"image_details_{cid}.json")

    # 获取子目录下的所有图片文件
    image_files = os.listdir(os.path.join(pics_directory, cid))

    # 构建JSON数据
    json_data = {
        "errno": "0",
        "total": str(len(image_files)),
        "data": [{"id": str(i + 1), "url": f"https://xfxuezhang.cn/mypics/{cid}/{image}"}
                 for i, image in enumerate(image_files)]
    }

    # 将JSON数据写入文件 
    with open(output_file, 'w') as json_file:
        json.dump(json_data, json_file, indent=2)

    print(f"Generated {output_file}")

执行generate.py生成image_details_1.json:

代码语言:javascript
代码运行次数:0
运行
复制
python generate.py

image_details_1.json

代码语言:javascript
代码运行次数:0
运行
复制
{
  "errno": "0",
  "total": "2",
  "data": [
    {
      "id": "1",
      "url": "http://xfxuezhang.cn/mypics/1/0366_PT1814-2_7E8DB7C0.jpg"
    },
    {
      "id": "3",
      "url": "http://xfxuezhang.cn/mypics/1/0366_PT1814-2_7E8DB7C0.jpg"
    },
  ]
}

最主要的!还要去修改route.php中的两个函数!

function _getWallpaperType($self) 改为

代码语言:javascript
代码运行次数:0
运行
复制
/* 获取壁纸分类 已测试 √ */
function _getWallpaperType($self)
{
	// 允许所有域的跨域请求
	header("Access-Control-Allow-Origin: *");
	header("Access-Control-Allow-Methods: GET, POST, OPTIONS");
	header("Access-Control-Allow-Headers: Content-Type");
	header("Access-Control-Max-Age: 86400");
	header('Content-Type: application/json');

	$self->response->setStatus(200);
	// $json = file_get_contents("http://cdn.apc.360.cn/index.php?c=WallPaper&a=getAllCategoriesV2&from=360chrome");
	$json = file_get_contents("http://xfxuezhang.cn/mypics/image_types.json");
	$res = json_decode($json, TRUE);
	if ($res['errno'] == 0) {
		$self->response->throwJson([
			"code" => 1,
			"data" => $res['data']
		]);
	} else {
		$self->response->throwJson([
			"code" => 0,
			"data" => null
		]);
	}
}

function _getWallpaperList($self) 改为

代码语言:javascript
代码运行次数:0
运行
复制
/* 获取壁纸列表 已测试 √ */
function _getWallpaperList($self)
{
	// 允许所有域的跨域请求
	header("Access-Control-Allow-Origin: *");
	header("Access-Control-Allow-Methods: GET, POST, OPTIONS");
	header("Access-Control-Allow-Headers: Content-Type");
	header("Access-Control-Max-Age: 86400");
	header('Content-Type: application/json');

	$self->response->setStatus(200);
	$cid = $self->request->cid;
	$start = $self->request->start;
	$count = $self->request->count;
	// $json = file_get_contents("http://wallpaper.apc.360.cn/index.php?c=WallPaper&a=getAppsByCategory&cid={$cid}&start={$start}&count={$count}&from=360chrome");
	$json = file_get_contents("http://xfxuezhang.cn/mypics/image_details_{$cid}.json");
	$res = json_decode($json, TRUE);
	if ($res['errno'] == 0) {
		// 数据总数
        $total = $res['total'];
		// 对数据进行分割
		$startIndex = $start;
		$endIndex = $startIndex + $count;
		$slicedData = array_slice($res['data'], $startIndex, $count);

		$self->response->throwJson([
			"code" => 1,
			"data" => $slicedData,
			"total" => $total
		]);
	} else {
		$self->response->throwJson([
			"code" => 0,
			"data" => null
		]);
	}
	
}

改完保存后,去刷新壁纸页面,就可以看到已经顺便变成我们自己的图了

后续修改

之后要调整内容,就只需要在mypics目录下放个子目录,然后手动将这个子目录信息写到image_types.json,然后直接执行generate.py就可以了。

进阶加速方法

图片会占用大量内存,如果资金充足可以买一个CDN。另一种方法是加上缓存。对于Typecho可以用这个插件:

GitHub - gogobody/TpCache: 一个 typecho 缓存插件

注意需要开启php-redis,比如我的是php8.1版本:

代码语言:javascript
代码运行次数:0
运行
复制
sudo apt install php8.1-redis

然后安装redis:

代码语言:javascript
代码运行次数:0
运行
复制
sudo apt install redis-server -y

然后就是常规插件的开启方法,大家都会的。可以参考我的设置:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-12-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
demo2动态加载显示商品详情页
/* 要求:实现 头像+昵称(多余7位用...)           商品图片(根据商品实际的图片的大小进行动态的展示。按照一定的比例进行展示。)           产品简介。产品简介在商品图片的下边。并跟随商品图片的大小进行动态的收缩或者是展示。 考虑:实现功能之后,是否要做占位图 进行图片的占位??! */ 难点:动态的加载。 实现:首先创建ui 然后请求数据 最后在主线程进行赋值 并且刷新ui 即可实现。 // // ACShowDetailVC.m // demo2详情动态加载展开
用户1219438
2018/02/01
8890
demo2动态加载显示商品详情页
它们的定义UIAlertView
code4App有很多伟大的上方UI特效代码,,好牛逼啊,这效果,太炫了,哇,怎么自己写不出来.事实上,再炫的特效,都是依据苹果系统的框架而来,假设我们了解系统框架实现的原理,也就能写出属于自己自己定义的控件,加上各种各样的动画.
全栈程序员站长
2022/07/06
9590
它们的定义UIAlertView
实践-小效果 V
关键效果设置:在改变tableHeaderView的高度后,再手动调用下 Tb 的 setTableHeaderView方法。
進无尽
2018/09/12
1.2K0
实践-小效果 V
iOS点击TableView的cell显示弹出动画
最近使用豌豆荚一览的app时看到它的点击cell后弹出界面的动画很帅,所以自己琢磨着实现了一个,效果如下:
Cloudox
2022/05/13
1.6K0
iOS点击TableView的cell显示弹出动画
iOS动画小知识:定点缩放弹窗(利用锚点anchorPoint进行实现)包含完整demo
每一个UIView内部都默认关联着一个CALayer, UIView有frame、bounds和center三个属性,CALayer也有类似的属性,分别为frame、bounds、position、anchorPoint。
公众号iOS逆向
2022/08/22
2.1K0
iOS动画小知识:定点缩放弹窗(利用锚点anchorPoint进行实现)包含完整demo
iOS百度地图开发之路径规划
路线规划 示例程序 使用百度地图SDK版本为2.9.1。 需要将改 代码: #import <MapKit/MapKit.h> #import <BaiduMapAPI_Map/BMKMapView.h> #import <BaiduMapAPI_Location/BMKLocationService.h> #import <BaiduMapAPI_Search/BMKSearchComponent.h> #import <BaiduMapAPI_Map/BMKPolylineView.h> #impor
hrscy
2018/08/30
1.3K0
iOS百度地图开发之路径规划
实践-小效果 Ⅳ
设置一个UIImageView为倒立的同等控件,设置这个UIImageView的layer的mask为一个渐变图层,效果就出来了。
進无尽
2018/09/12
7260
实践-小效果 Ⅳ
ios textView跟随键盘的移动
实现效果: textview 能够跟随键盘的移动而移动 效果图如下: 下边贴上主要的代码: 1.创建textview @interface ViewController ()<UITextViewDe
用户1219438
2018/02/01
1.8K0
ios textView跟随键盘的移动
iOS点击查看大图的动画效果
对于图片来说,除了表情包,几乎都会被点击查看大图。今天就讲解一个查看和收起大图的动画效果,先直接看效果图:
Cloudox
2021/11/23
1.9K0
iOS点击查看大图的动画效果
【iOS】今日头条的转场动画设置+手势控制
最近公司有个需求,做一个今日头条的用户动态的进入和退出的动画效果,并且退场时,可以自己点击退出,也可以手势下滑退出。头条的效果如下:
MapleYe
2020/03/31
1.9K0
【iOS】今日头条的转场动画设置+手势控制
iOS 一款轻量级的AlertView
系统有AlertController,如果设计师要求不高能满足需求了,但是如果设计师要单独设计一个对话框,在用AlertController就显得有点吃力了,自定义一款吧,GitHub上有很多优秀的开源,杀鸡焉用牛刀,那些大神封装的代码量太多了,出现了个bug自己改要看很久,太多时间浪费在这上面没有必要。还是自己定义一个。
赵哥窟
2019/02/25
7300
iOS 一款轻量级的AlertView
类似3D效果_CGAffineTransformScale
1️⃣CGAffineTransformMakeTranslation (相对平移)假设是一个视图,那么它的起始位置 x 会加上tx , y 会加上 ty 2️⃣CGAffineTransform
Dwyane
2018/05/22
1.2K0
iOS开发-RAC+MVVM练手项目 图床App写在前面准备工作界面设计首页历史关于后记
前段时间闲着无聊和盆友就搞了个图床站Chevereto-Free,忽然发现居然有API提供,而且很简单,只需要一个KEY就可以
gwk_iOS
2018/08/23
1K0
iOS开发-RAC+MVVM练手项目 图床App写在前面准备工作界面设计首页历史关于后记
iOS CALayer 简单介绍
总结:能看到的都是uiview,uiview能显示在屏幕上是因为它内部的一个层calyer层。
用户1219438
2018/08/06
7360
iOS CALayer 简单介绍
《Motion Design for iOS》(十七)
是时候写一些代码了。让我们先添加一个简单的UIView对象到屏幕上并设置它的圆角。我们要把它添加到我们的主窗口上时因为它是一个快速的例子,但在真实的app界面中你需要添加到管理当前界面的视图控制器中。
Cloudox
2021/11/23
1.1K0
《Motion Design for iOS》(十七)
iOS 支付宝首页拖放按钮效果实现
将所有按钮放在viewcontroller的_buttonArray集合中,同时赋值给按钮中
大师级码师
2021/10/29
5510
仿window阿里旺旺登陆界面,打印机吐纸动画效果---转自Bison的技术博客
偶然的机会发现window的阿里旺旺的登陆效果蛮有意思的,于是就模仿着做了一下打印机吐纸的动画效果 看起来很神奇的东西,实现起来却不难,下面我给大家看下主要的源码。 - (void)createUI{ UIImageView *backimageView=[[UIImageView alloc]init]; backimageView.image =[UIImage imageNamed:@"1.png"]; backimageView.frame = CGRectMake(50
Bison
2018/07/06
4870
iOS利用锚点实现定点缩放弹窗
demo下载地址:https://download.csdn.net/download/u011018979/16092830
公众号iOS逆向
2021/07/29
1.7K0
绘制图形的视图方式为_三角函数图象的平移变换
A view (an object whose class is UIView or a subclass of UIView) knows how to draw itself into a rectangular area of the interface.
全栈程序员站长
2022/08/04
6670
绘制图形的视图方式为_三角函数图象的平移变换
UI篇-关于单个页面屏幕旋转要注意的问题
有时候,我们会需要在整个项目中,使某一个ViewController支持屏幕旋转,而其他的ViewController并不能自动旋转。这是一个很常见的需求,下面就屏幕旋转相关问题做个小结。
進无尽
2018/09/12
3.7K0
UI篇-关于单个页面屏幕旋转要注意的问题
相关推荐
demo2动态加载显示商品详情页
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验