分类 WEB开发 下的文章

[scode type="red"]有问题请在下方评论留言,看到我会一一回复。[/scode]
具体的HTML知识可以自行百度,在这里只给大家快速入门,短时间内搭建一个你的第一个个人网站。

先看代码

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>网页标题</title>
</head>
<body>
网页内容
</body>
</html>

新建一个文件,名为dome,文件类型html,将上述代码写入,保存,在浏览器打开。
dome.html

对比上述代码和运行结果,不难发现,<title>网页标题</title> 里面的文字就是网页名称。<body>网页内容</body>网页内容就是你的网页中的内容。

小小进阶-背景

我们虽然写出来了最基本的网页,但是只有文字,显得过于单调。我们可以为网页添加一个背景。
就像这个样子:
进阶-背景0
我们来看代码:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>网页标题</title>
<style type="text/css">
body {
    background: fixed;
    background-position: top;
    background-repeat: no-repeat;
    background-size: cover;
    background-image: url(https://cn.bing.com/th?id=OHR.SchlossGluecksburg_ZH-CN4079837227_UHD.jpg);
}
</style>
</head>
<body>
网页内容
</body>
</html>

此处使用CSS,具体知识自行百度,代码background-image: url(https://cn.bing.com/th?id=OHR.SchlossGluecksburg_ZH-CN4079837227_UHD.jpg);中有一个链接 https://cn.bing.com/th?id=OHR.SchlossGluecksburg_ZH-CN4079837227_UHD.jpg为图片链接,您可以切换成自己喜欢的链接。

偶尔闲着,写写文章

文件下载

[button color="info" icon="" url="https://zai.ink/usr/uploads/2022/04/1568826707.zip" type="round"]iOS档案馆应用支持.zip[/button]

文件解析

什么工具生成的我不知道,iOS开发我也不太懂,在这里简单的给大家解析一下这个文件。
上述文件下载,将zip解压,得到iOS档案馆应用支持.mobileconfig这个文件。右击,随便找个文本编辑器打开,在这里我用Sublime给大家简单的打开看一下。
图0
前面的一大串没什么用,我也看不懂,但到了<key>Icon</key>这组数值的时候,可以看到以Icon为键的数值是一个base64编码的值,通过键名很容易猜测到只是一张图片,在这一大串看不懂的代码前,加上data:image/png;base64, 在浏览器中打开,就可以看到这是一张经过base64编码的图片。同理,可以找一张自己的图片,编码以后放进去。
图1
继续往下走:图2
看这个键<key>Label</key> 应该是标签的解释。
<key>URL</key>顾名思义就是你要封装的url地址。
下面还有一些,自己慢慢捉摸吧,我也用不到。。。

在WEB开发过程中,存储密码常用的加密方法就是使用MD5不可逆加密,也就是说当用户将密码交给我们存储的时候,我们不需要看到他们的密码,只需要保存加密以后的密文即可。

问题

MD5不可逆,但只要有足够的算力+PB级的数据库,这个时候MD5加密就变得具有可破解性,这是很危险的,一但用户数据在存储、备份等操作过程或由于系统安全原因造成造成意外用户信息泄漏,不仅会降低企业信誉还可能要承担一定的法律责任。

解决

其实解决上述方法,在搜集的过程中我也见到了各种奇葩的操作,比如把服务器IP作为数据值掺杂在密文中。或者把明文加密成32字符十六进制数以后,将前十六位和后十六位拆分开,将他们分布加密成32字符十六进制数后再合并,接着重新走一遍MD5加密。此种方法以此类推,我们还可以在拆分以后分别加入一些用户的信息,也就是在字符串前/后每次加入自定义字符串,例如用户的UID/注册时间,然后将他们与密码加密后的值组合,再次进行MD5加密,这样得到的是一个少数规则的密文,没有足够的数据库来支撑破解。

总结

思路就是这个思路,总的来说想要安全存储用户数据,就要先写一个自己的加密协议,利用MD5不断的重复加密,在加密过程中使用我们的规则进行打乱,得到密文存入数据库。

如何得到用户密码?

得不到。

如何校验用户密码是否正确?

用户输入密码递交表单,将数据传递到服务器,经过我们的加密得到的数值等于数据库存放的数据,密码正确,否则错误。

原因

已知QQ互联APP IDAPP Key填写正确,回调地址无误。
本地测试一切正常,拿到用户那边测试的时候却出现报错,报错如下:

-1
client request's parameters are invalid, invalid openid

这种bug的出现是随机性的,且本地测试环境一切正常,多番查找原因无果,只能重写。
重写以后故障依旧,仔细阅读官方开发文档以后得到下面解决方法:

解决

在回调文件中我们要定义两次$qc= new qc(),第一次用于获取正确的access_token 和openid,而第二次用于保证正确传输access_token和openid以保证api的正常使用,否则报错client request's parameters are invalid, invalid openid
最简单的方法就是在第一次new QC()之后,立即获取access_token和openid,并立即重新使用获取到的access_token和openid来重新定义QC()类,以防止变量丢失或被覆盖。
核心回调代码示例:

$qc = new QC();
$acs = $qc->qq_callback();
$oid = $qc->get_openid();
$qc = new QC($acs,$oid);
$uinfo = $qc->get_user_info();

去年iOSIPA发起了开发者计划,每位开发者都可申请到WEB托管试用服务。在今年一月份,iOSIPA又开放了IPA文件全自动转换Plist API简直直呼WOC!
今天就来给大家讲一下这个API如何去调用,引用到自己的网站上面,实现实时生成实时调用,并且调用完毕即可销毁,彻底摆脱对Plist文件的依赖!

V2.0版本

新增支持下载中显示应用图标功能。
具体调用方式为:
https://api.ipa.cm/v2.php?iosipaurl=此处填写IPA下载链接&appname=此处填写APP名称&appico=此处填写APP图标

以下为使用教程:

参数

一个Plist文件最重要的参数莫过于 1.应用名称(其实这个也不算很重要) 2.应用IPA下载直链。有了这两者的参数就可以进行调用API
总结一下,重要参数两个,分别为:
1.应用名称
2.应用IPA下载直链

例子

假如应用名称为:QQ,应用IPA下载直链为https://zai.ink/QQ.ipa(务必使用HTTPS加密协议!)
先来看官方给出的调用例子:https://api.ipa.cm/?iosipaurl=此处填写IPA下载链接&appname=此处填写APP名称
那么此处的调用方式就是:https://api.ipa.cm/?iosipaurl=https://zai.ink/QQ.ipa&appname=QQ

谁在用?

iOSIPA软件网。ANTIA软件网。

[scode type="red"]新年带给我记忆最深的莫过于雪花灯笼以及烟花,春节将至,怎么样让你的网站充满新年气息呐?挂个灯笼来个雪花再配上喜气洋洋的背景最有年的味道了。[/scode]

具体实现代码:


<!--全站雪花-->
<script type="text/javascript">
    function snowFall(snow) {
        snow = snow || {};
        this.maxFlake = snow.maxFlake || 200;  
        this.flakeSize = snow.flakeSize || 10; 
        this.fallSpeed = snow.fallSpeed || 1; 
    }
    requestAnimationFrame = window.requestAnimationFrame ||
        window.mozRequestAnimationFrame ||
        window.webkitRequestAnimationFrame ||
        window.msRequestAnimationFrame ||
        window.oRequestAnimationFrame ||
        function(callback) { setTimeout(callback, 1000 / 60); };
 
    cancelAnimationFrame = window.cancelAnimationFrame ||
        window.mozCancelAnimationFrame ||
        window.webkitCancelAnimationFrame ||
        window.msCancelAnimationFrame ||
        window.oCancelAnimationFrame;
    snowFall.prototype.start = function(){
        snowCanvas.apply(this);
        createFlakes.apply(this);
        drawSnow.apply(this)
    }
    function snowCanvas() {
        var snowcanvas = document.createElement("canvas");
        snowcanvas.id = "snowfall";
        snowcanvas.width = window.innerWidth;
        snowcanvas.height = document.body.clientHeight;
        snowcanvas.setAttribute("style", "position:absolute; top: 0; left: 0; z-index: 1; pointer-events: none;");
        document.getElementsByTagName("body")[0].appendChild(snowcanvas);
        this.canvas = snowcanvas;
        this.ctx = snowcanvas.getContext("2d");
        window.onresize = function() {
            snowcanvas.width = window.innerWidth;
            /* snowcanvas.height = window.innerHeight */
        }
    }
    function flakeMove(canvasWidth, canvasHeight, flakeSize, fallSpeed) {
        this.x = Math.floor(Math.random() * canvasWidth);  
        this.y = Math.floor(Math.random() * canvasHeight); 
        this.size = Math.random() * flakeSize + 2; 
        this.maxSize = flakeSize; 
        this.speed = Math.random() * 1 + fallSpeed; 
        this.fallSpeed = fallSpeed; 
        this.velY = this.speed;
        this.velX = 0;
        this.stepSize = Math.random() / 30; 
        this.step = 0
    }
    flakeMove.prototype.update = function() {
        var x = this.x,
            y = this.y;
        this.velX *= 0.98;
        if (this.velY <= this.speed) {
            this.velY = this.speed
        }
        this.velX += Math.cos(this.step += .05) * this.stepSize;
 
        this.y += this.velY;
        this.x += this.velX;
        if (this.x >= canvas.width || this.x <= 0 || this.y >= canvas.height || this.y <= 0) {
            this.reset(canvas.width, canvas.height)
        }
    };
    flakeMove.prototype.reset = function(width, height) {
        this.x = Math.floor(Math.random() * width);
        this.y = 0;
        this.size = Math.random() * this.maxSize + 2;
        this.speed = Math.random() * 1 + this.fallSpeed;
        this.velY = this.speed;
        this.velX = 0;
    };
    flakeMove.prototype.render = function(ctx) {
        var snowFlake = ctx.createRadialGradient(this.x, this.y, 0, this.x, this.y, this.size);
        snowFlake.addColorStop(0, "rgba(255, 255, 255, 0.9)");  
        snowFlake.addColorStop(.5, "rgba(255, 255, 255, 0.5)"); 
        snowFlake.addColorStop(1, "rgba(255, 255, 255, 0)"); 
        ctx.save();
        ctx.fillStyle = snowFlake;
        ctx.beginPath();
        ctx.arc(this.x, this.y, this.size, 0, Math.PI * 2);
        ctx.fill();
        ctx.restore();
    };
    function createFlakes() {
        var maxFlake = this.maxFlake,
            flakes = this.flakes = [],
            canvas = this.canvas;
        for (var i = 0; i < maxFlake; i++) {
            flakes.push(new flakeMove(canvas.width, canvas.height, this.flakeSize, this.fallSpeed))
        }
    }
    function drawSnow() {
        var maxFlake = this.maxFlake,
            flakes = this.flakes;
        ctx = this.ctx, canvas = this.canvas, that = this;
        ctx.clearRect(0, 0, canvas.width, canvas.height);
        for (var e = 0; e < maxFlake; e++) {
            flakes[e].update();
            flakes[e].render(ctx);
        }
        this.loop = requestAnimationFrame(function() {
            drawSnow.apply(that);
        });
    }
    var snow = new snowFall({maxFlake:500});
    snow.start();
</script>   

怎么使用?

直接将代码复制到网站</body></html>中间</body>这里放上面的代码</html>,保存即可。

这是我自己琢磨出来的方法,大家可以借鉴一下,至于不换域名站点迁移在这里简单的说一下方法是:

不换域名迁移站点

直接备份web和数据库文件,然后恢复备份至新的服务器,将数据库文件导入到新服务器的数据库,最后修改 application/database.php中的数据库信息修改成新的数据库信息即可,在这里就不多赘述。

站点换域名(可不迁移)

今天的话主要是和大家讲一讲网站建成一段时间后,想更换域名的话,如何操作更换域名才能避免网站报错。

问题

我的话手里有个网站是基于鲶鱼Blog做的,起初内容几百个文章,换过一次域名,用的方法是:导出数据库文件,使用文本编辑器(记事本就可以),搜索域名进行替换。
但是随着内容达到了几千以后再用这种方法进行替换就会出现报错: error

排除了许多问题都没有解决,经过不断的尝试,终于找到了方法,记录在这里分享给大家吧。

解决

方法很简单,只需要

  1. 删除数据库表:catfishBlog_options
  2. 删除网站application/install.lock文件
  3. 使用新域名访问网站内并且安装即可。

end

这样子的话就成功的解决了更换域名的问题,还需要补充一点的是,一些网站的配置信息(比如是否开启伪静态什么的)都会恢复到系统设置,需要重新设置才可以生效。