手把手教你利用Win7系统快速搭建属于自己的网站

前言

之前小编带大家搭建过一个服务器,但是一直没带大家搭建过网站,这就相当于食堂阿姨只给大家打了饭而没有打菜,今天小编就替阿姨给诸位小伙子加点菜。

一、开启IIS6服务

这个我相信大家都会了,控制面板—程序和功能—–打开或关闭Windows功能,如图:

手把手教你利用Win7系统快速搭建属于自己的网站

然后我们重启电脑,这样设置才能生效。

二、设置ASP父路径

打开IIS管理器,控制面板—-Internet信息服务管理器,然后就可以看到如下图:

手把手教你利用Win7系统快速搭建属于自己的网站

我们点击ASP,启用父路径,如图:

手把手教你利用Win7系统快速搭建属于自己的网站

三、添加网站目录

这一步大家都做过,想必小编不用多说了吧

手把手教你利用Win7系统快速搭建属于自己的网站

四、浏览网站

点击上图的浏览,即可进入浏览器并打开网站目录,如图:

手把手教你利用Win7系统快速搭建属于自己的网站

可以看到我们的网站目录中的文件都显示在浏览器中了,但是我们要的并不是这种效果 ,而是一些表单、表格、图片等的可以进行人机交互的界面的网站,那么这些怎么操作了,下面请看。

五、运行网站

这里小编要像大家推荐一个软件,它就是Sws,解压后将网站整个目录和软件放在同一目录,双击运行软件即可打开网站,如下:

手把手教你利用Win7系统快速搭建属于自己的网站

这里就是整个网站,我们已经使它成功在本地跑起来了。但是这个软件只能跑Asp的网站,如果想跑Php,就要使用Phpstudy了。

六、总结

网上有很多免费的源码,如果你会一点点网页编写的能力的话,那么你就能很轻松搭建一个属于自己的网站。

盘点3款高端大气上档次的黑客游戏

大家好,我是IT共享者,人称皮皮。

前言

每个人心中都有一个黑客梦,也都向往成为一个神秘的黑客,但是成为黑客不是一朝一夕,也不是光说就能实现的,需要我们有大量的计算机知识的积累以及应用,不然可能连黑客的边都摸不到;换言之,给黑客提鞋的资格都没有,比如说小编就是这样一个连提鞋资格都没有的骚年,心中无数次脑补黑客不穿鞋的画面以此来弥补心灵上的创伤。

黑客游戏

为什么要说黑客游戏?因为我们在成为黑客的道路上曲折离奇,如果让你一个劲的看文档的话,我相信没几个人能坚持吧;于是小编转念一想,通过玩游戏的方式是不是就有趣并且容易多了了,那是自然的,既能学习又能玩,一举两得,所以小编才想到这样学习黑客技能。那么常见的黑客游戏有哪些了?

下面我们来看看吧。

一、NotPron

他是一款解密类的黑客游戏,分为中英两个版本,中文版只有8关,而英文版有132关。

中文版:
http://deathball.net/notpron/china/notpron.htm

英文版:
http://deathball.net/notpron/levelone.htm

是不是有点恐怖的感觉?

二、Level Game

这个是一款非常有趣的黑客过关游戏,地址:http://www.levelgame.net/

只不过小编玩到第四关就懵逼了,这是什么情况,中间界面一直在闪烁。

三、s0urce

这是我见过的最棒的黑客游戏网站,地址:http://s0urce.io/,为什么说他最棒了?因为他可以手把手教我们完成某些黑客行为,并且不需要我们自己思考写太多代码,我们只需要根据他的提示,把那个提示的英文输进去,他就会自动生成一串代码进行补全,最后生成完整代码,如下:

这里我们需要选择箭头处的目标,然后会打开一个目标信息的方框,如下:

这个时候你可以选择发送下消息调侃下机器人,然后我们要输入黑客命令,选择Hack,然后选择端口,如图:

我们选择端口“Port A”,然后会出现一个命令窗口,如图:

当防火墙的进度条满格之后,就会弹出消息提示窗口,如图:

里面任务,相信当你玩通关了你的黑客技能不会太差。

四、总结

黑客游戏可以让你非常愉快的学习到黑客技能,不仅可以一边玩游戏还能对于黑客技术多一份了解,并且提高计算机英语水平,实在是一举三得。

一文带你解读​JavaScript的引用类型和函数对象

前言

相信做网站对JavaScript再熟悉不过了,它是一门脚本语言,不同于Python的是,它是一门浏览器脚本语言,而Python则是服务器脚本语言,我们不光要会Python,还要会JavaScript,因为它对做网页方面是有很大作用的。

1.引用类型

相当于Java中的类创建实例过程,比如我要创建个对象,可以这样做:

var ob = new Object();

其实它就是把JavaScript中的数据类型转换为Java中的类来进行操作。

2.函数对象

1).Arguments对象

这是个神奇的对象,无需指明参数就可以访问它,它无处不在,用好了将极大的提高你的工作效率。比如它可以检查函数中有多少个参数:

function aa() {
  console.log(arguments.length);
}


aa("fsdaf",324,42.434,'42342asff');
一文带你解读​JavaScript的引用类型和函数对象

2).Function对象

它可以十分方便的创建函数,并且有多种方法创建函数。

1)).对象实例化创建

var ff= new function(name,age,score,表达式)

2)). 函数关键字创建

function aa() {
  alert(111);
}
function aa(bb,cc) {
  alert(bb,cc);
}

Function有一个Length属性用来计算长度:

function aa() {
  alert(111);
}
aa.length

3).Constructor属性

看到这个长长的东西是不是感到特别陌生,它就是我们的构造函数,我们可以对此判断当前实例是否属于对象。

var aa=new Array()
if(aa.constructor==Array){
    console.log(11)
}
else{
    console.log(22)
}

4).Prototype属性

指对象的原型参数,实例化后的对象是没有Prototype属性的,只有对象本身才有这个属性。利用该属性创建的变量名和值并没有加入到实例对象中,只是创建了,如果你想访问它,可以使用:实例名.constructor.prototype来进行访问。

一文带你解读​JavaScript的引用类型和函数对象

一文带你解读​JavaScript的引用类型和函数对象

从上面可以看出,数组的实例化对象可以创建任意变量并且赋值,但是它的原型却不行,如果是数组本身那么就又可以了。而且要想访问原型的构造函数还得是对象本身,最后得到的结果也就是对象本身。可见虽然原型和构造函数换了个位置,但是意义完全不一样。

5).This 对象

其实就相当于Java中的This,Python 中的Self,可以看出它的重要性,无非就是指向一个实例对象。

一文带你解读​JavaScript的引用类型和函数对象

3.闭包

其实就是嵌套函数。

var aa= 10;
function s(cc,bb) {
  function sa() {
    return cc+bb;
  }
  return sa();
}

总结

这篇文章主要结束了JavaScript的引用类型、函数对象和闭包,下一篇文章继续给大家分享JavaScript知识,敬请期待!

一文带你解读​JavaScript的基本用法

前言

相信做网站对JavaScript再熟悉不过了,它是一门脚本语言,不同于Python的是,它是一门浏览器脚本语言,而Python则是服务器脚本语言,我们不光要会Python,还要会JavaScript,因为它对做网页方面是有很大作用的。

JavaScript的基本用法

1.如何使用Js脚本

1).引入Js文件

在头部标签中导入脚本标签并指明脚本文件路径

<head><script src="XXX.js"></script></head>

2).标签中使用

<body><script >javascript 语句</script></body>
<head><script >javascript 语句</script></head>

2.数据类型

JavaScript的数据类型分为:

string
number
boolean
array
object
null
undefined

3.注释

1).单行注释

以“//”开头,后面接注释语句,只能注释一行

2).多行注释

/* 注释语句,可注释多行 */

4.特殊符号

\n 换行
\t 制表符 
\b 空格 
\r 回车 
\f 换页符
\\ 反斜杠 
\' 单引号
\" 双引号
\0 x 八进制代码x表示的字符(n是0到7中的一个八进制数字)
\x x 十六进制代码x表示的字符(n是0到F 中的一个十六进制数字)
\u x 十六进制代码x表示的Unicode字符(n是0到F 中的一个十六进制数字)

5.变量声明

1).Var声明

var ss='fsdf'  外部声明的变量可在全局使用
var ss        也可以不声明值,也不会产生错误,唯一的遗憾是会产生变量提升

2).Const 声明

const ss=123   不存在变量提升,可生成块级作用域 ,常用于声明常量,声明后必须赋值

3).Let 声明

let ss=123   不存在变量提升,可生成块级作用域,常用于声明变量,

6.控制结构语句

1).If ……Else

var aa=12
if(aa>3){console.log(1)}
else{alert(1)}

可以看出与我们的Python语句略有不同。

2).Do…..While

var i=1
do
 {
 i++;
 console.log(i);
 }
while(i<5)

3).While

var i=1
while(i<5){
    i++;
    console.log(i)
}

4).For

for(let i=1;i<6;i++){
    console.log(i)
}

5).For….In…

#打印了document对象的所有方法
    for(y in document)
        {
            console.log(y)
        }

6.Break、Continue

break    立即终止循环
continue 退出当前循环进入下一个循环

7).标签语句

指的是标签后面的语句可由判断结果自行决定什么时候结束

var i=0
label:while(i<10){
    i++;
    if(i==5){
        break label;
}
    else{
        console.log(i)
}
}

8).With语句

相当于Python中的上下文管理器

var aa='fasdffsa'
        with(aa){
            console.log(aa)
        }

9).Switch语句

var aa=[1,2,3]
    switch(aa){
        case 1:console.log(1);
        break;
        case 2:console.log(2);
        break;
        case 3:console.log(3);
        break;
        default:console.log('fas');
}

10).For….of

for(let val of iterable){
console.log(val)
}

11).For each ….. in

var sum = 0;
var obj = {prop1: 5, prop2: 13, prop3: 8};
for each (var item in obj) {
  sum += item;
}
print(sum); // 输出"26",也就是5+13+8的值




obj.forEach(function(val,item,array){
      array[item]=val
})

总结

这篇文章主要结束了JavaScript的导入、数据类型、注释、变量和控制语句。下一篇文章,我们继续介绍JavaScript,敬请期待!

盘点JavaScript中5个常用的对象

大家好,我是IT共享者,人称皮皮。

前言

相信做网站对JavaScript再熟悉不过了,它是一门脚本语言,不同于Python的是,它是一门浏览器脚本语言,而Python则是服务器脚本语言,我们不光要会Python,还要会JavaScript,因为它对做网页方面是有很大作用的。

JavaScript对象

在JavaScript中有许多有用的对象,它们可以用来实现很多功能,除了我们之前接触到的,还有以下几种:

Date   日期
RegExp 正则
Error  错误

接下来我们就来具体了解下它们都有哪些用处:

1).Array对象

它就是我们熟知的数组对象了,它可以储存许多值并用下标访问,常见操作如下:

盘点JavaScript中5个常用的对象

2).Boolean对象

返回该对象的源代码。
b.toSource()




把逻辑值转换为字符串,并返回结果。
b.toString()




返回 Boolean 对象的原始值。
b.valueOf()

3).Date对象

这个对象主要对时间的操作,我们可以通过这个对象获取并且设置时间,如图:

盘点JavaScript中5个常用的对象

3).Math对象

这个对象就好比我们Python中的数学模块中的方法一样,两者了解一样即可,如图:

盘点JavaScript中5个常用的对象

4).Number对象

主要就是数字对象的一些操作,比较简单,方法不多,如图:

盘点JavaScript中5个常用的对象

5).String对象

主要是对字符串对象进行操作,比如字符串拼接,分割等,这是我们比较常用的对象,它的用法如下:

盘点JavaScript中5个常用的对象

总结

这篇文章主要介绍了JavaScript的对象知识。下一篇文章,我们继续介绍JavaScript,敬请期待!

一篇文章带你轻松获取女神家庭住址

前言

步入21世纪,我们的日常生活发生了巨大的改变,手机和电脑支配着我们的日常,不知不觉中,网聊开始慢慢逐渐兴起以致于现在成为大势所趋,我们在网上聊天经常会看到一些美女,但是我们一般问别人家庭住址的话肯定是不合适的,因为这会让别人觉得你这个人是不是有病,或者是犯罪分子;于是我们可以另辟蹊径,选择一种稳妥的方式来进行。

一、与女神开始对话

这是你要进行的第一步,如果你连和别人对话的机会都没有,那你基本没希望,如下:

首先要和别人联系,当好友间建立联系后,你就会和它建立网络连接,这个时候会发送和接收大量数据包,而且也会有各种协议,比如TCP UDP ICMP等,但是我们要拿的是TCP,只有知道了TCP你才能知道好友的设备的真正的IP地址,这样才可以准确获取到她的地理位置。

二、获取IP

1.使用系统任务管理器中的监视器

这里我们需要打开资源监视器,如下:

然后只监视QQ的网络信息,如下:

勾选好了后,我们给女神发送一个字节稍微大点的消息,比如图片,那就截个图吧,如下:

这个时候就得到了一些IP地址,满心欢喜的以为其中一个就是好友的设备所处的IP。结果都试了并不是,大失所望。其实这些都是虚假地址。

2.使用系统任务管理器中的监视器

再来看看使用咱们的CMD,我们来使用一个命令”netstat“,这个命令可以监听TCP和UDP的连接,下面来看看:

这里我们再次打开一个窗口,获取当前的网络连接,这里可以获取全部网络连接:

但是我们只需要TCP连接,所以在后面加个 ”-t“即可。

三、使用火绒剑

前两者的方法放在以前是可以获取到QQ好友的IP的,但是现在不行了,于是小编找到了一种好的方法,使用火绒剑安全软件辅助来查找到QQ好友IP。这里我们进入火绒官网,下载火绒剑安全软件。如下:

打开火绒安全,选择安全工具,如下:

点击火绒剑,如下:

这里我们设置监听QQ连接的相关功能,首先找到QQ进程,如下:

设置过滤条件,如下:

设置好后,和女神发语音,开启监控,如下:

下面的111开头的就是女神的真实IP,然后到网上一查,如下:

其实这个数据还是很准的,因为小编用的是大号和小号进行语音通话的,而且这个IP的确就是本人的外网IP,故该种获取IP方法很可靠。

四、总结

小编想在这里提醒大家的是,虽然该种方法可以获取IP,但是不要做坏事哦。

手把手教你使用Python打造一款摸鱼倒计界面

大家好,我是吴老板。

前言

前段时间在微博看到一段摸鱼人的倒计时模板,感觉还挺有趣的。


于是我用了一小时的时间写了个页面出来 摸鱼办地址 (当然是摸鱼的时间啦)。

模板是这样的:

摸鱼办公室

【摸鱼办公室】今天是 2021-11-30 星期二

你好,摸鱼人,工作再累,一定不要忘记摸鱼哦 ! 有事没事起身去茶水间去廊道去天台走走,别老在工位上坐着。多喝点水,钱是老板的,但命是自己的 !

距离 周末 放假还有 2 天

距离 元旦 放假还有 3 天

距离 过年 放假还有 34 天

距离 清明节 放假还有 97 天

距离 劳动节 放假还有 123 天

距离 端午节 放假还有 156 天

距离 中秋节 放假还有 255 天

距离 国庆节 放假还有 276 天


  • 由于前端是单页面服务,直接撸一个原始的 html 网页就行。
  • FastAPI 对于异步请求是一把好手、更轻、性能更佳。
  • 挂上一层 Nginx 让它看起来像那么回事儿。

实现过程

  • 首先要知道、除了静态文字之外的比如当前日期、距离节日放假的天数等都是动态返回的,我需要使用 Jinja2 模板进行动态绑定。
  • 我应该把重点放在时间的处理上。
  • 而且在这个模板中,有阳历的节日,也是阴历的节日,我需要转换。

初始化一个 FastAPI 对象并声明静态页面的模板目录 (Jinja2Templates)

# -*- coding: utf-8 -*-
import datetime
from fastapi import FastAPI, Request
from fastapi.responses import HTMLResponse
from fastapi.templating import Jinja2Templates
from zhdate import ZhDate as lunar_date

app = FastAPI(
    debug=False,
    title="My API",
    docs_url="/docs",
    openapi_url=f"/openapi.json"
)

templates = Jinja2Templates(directory="templates")

可以看到的是我用到了 zhdate 这个库、主要用于阴历和阳历之间的相互转换。用法如下

today = datetime.date.today()
print(today.year, today.month, today.day)
print("大年时间: ", lunar_date(today.year+1, 1, 1).to_datetime().date())
print("端午时间: ", lunar_date(today.year, 5, 5).to_datetime().date())
print("中秋时间: ", lunar_date(today.year, 8, 15).to_datetime().date())
print("元旦时间: ", f"{today.year+1}-01-01")
print("清明时间: ", f"{today.year}-04-05")
print("劳动时间: ", f"{today.year}-05-01")
print("国庆时间: ", f"{today.year}-10-01")

我们可以梳理一下:

  • 计算距离 大年、元旦 的天数时,要在年份上 +1
  • 计算距离 其他节日 的天数时,要判断天数差是否小于 0,如果是,则年份需要 +1,因为已经过去的节日对此没有意义
distance_big_year = (lunar_date(today.year + 1, 1, 1).to_datetime().date() - today).days

distance_5_5 = (lunar_date(today.year, 5, 5).to_datetime().date() - today).days
distance_5_5 = distance_5_5 if distance_5_5 > 0 else (
        lunar_date(today.year + 1, 5, 5).to_datetime().date() - today).days

distance_8_15 = (lunar_date(today.year, 8, 15).to_datetime().date() - today).days
distance_8_15 = distance_8_15 if distance_8_15 > 0 else (
        lunar_date(today.year + 1, 8, 15).to_datetime().date() - today).days

distance_year = (datetime.datetime.strptime(f"{today.year + 1}-01-01", "%Y-%m-%d").date() - today).days

distance_4_5 = (datetime.datetime.strptime(f"{today.year}-04-05", "%Y-%m-%d").date() - today).days
distance_4_5 = distance_4_5 if distance_4_5 > 0 else (
        datetime.datetime.strptime(f"{today.year + 1}-04-05", "%Y-%m-%d").date() - today).days

distance_5_1 = (datetime.datetime.strptime(f"{today.year}-05-01", "%Y-%m-%d").date() - today).days
distance_5_1 = distance_5_1 if distance_5_1 > 0 else (
        datetime.datetime.strptime(f"{today.year + 1}-05-01", "%Y-%m-%d").date() - today).days

distance_10_1 = (datetime.datetime.strptime(f"{today.year}-10-01", "%Y-%m-%d").date() - today).days
distance_10_1 = distance_10_1 if distance_10_1 > 0 else (
        datetime.datetime.strptime(f"{today.year + 1}-10-01", "%Y-%m-%d").date() - today).days

怎么样? 我的命名足够疯狂吧。

接下来需要计算一下距离周末的天数。

def get_week_day(date):
    week_day_dict = {
        0: '星期一',
        1: '星期二',
        2: '星期三',
        3: '星期四',
        4: '星期五',
        5: '星期六',
        6: '星期天',
    }
    day = date.weekday()
    return week_day_dict[day]

week_day_ = get_week_day(today)
print(f"今天是: {week_day_}") # 先获取今天是星期几

按照每周 5 个工作日计算,今天距离周末的天数就是

5 - today.weekday() # today.weekday() 今天距离周末

现在将所有的数据组装起来

time_ = [
    {"v_": distance_year, "title": "元旦"},  # 距离元旦
    {"v_": distance_big_year, "title": "过年"},  # 距离过年
    {"v_": distance_4_5, "title": "清明节"},  # 距离清明
    {"v_": distance_5_1, "title": "劳动节"},  # 距离劳动
    {"v_": distance_5_5, "title": "端午节"},  # 距离端午
    {"v_": distance_8_15, "title": "中秋节"},  # 距离中秋
    {"v_": distance_10_1, "title": "国庆节"},  # 距离国庆
]

至于为什么是 List 而不是 Dict,那是我需要做一个根据距离天数的排序,让最先放假的节日放于最前面, 这样看起来会舒服得多。

time_ = sorted(time_, key=lambda x: x['v_'], reverse=False)

接下来要写一个 路由,将数据传入到 html 页面中去。

@app.get("/", response_class=HTMLResponse)
async def readme(request: Request):
    return templates.TemplateResponse("readme.html",
                                      {"request": request, "time_": time_, "now_": now_, "week_day_": week_day_})

来看一下完整的代码 (main.py):

# -*- coding: utf-8 -*-
import datetime
from fastapi import FastAPI, Request
from fastapi.responses import HTMLResponse
from fastapi.templating import Jinja2Templates
from zhdate import ZhDate as lunar_date

app = FastAPI(
    debug=False,
    title="My API",
    docs_url=f"/docs",
    openapi_url=f"/openapi.json"
)

templates = Jinja2Templates(directory="templates")

today = datetime.date.today()

# print(today.year, today.month, today.day)
# print("大年时间: ", lunar_date(today.year+1, 1, 1).to_datetime().date())
# print("端午时间: ", lunar_date(today.year, 5, 5).to_datetime().date())
# print("中秋时间: ", lunar_date(today.year, 8, 15).to_datetime().date())
# print("元旦时间: ", f"{today.year+1}-01-01")
# print("清明时间: ", f"{today.year+1}-04-05")
# print("劳动时间: ", f"{today.year+1}-05-01")
# print("国庆时间: ", f"{today.year+1}-10-01")

distance_big_year = (lunar_date(today.year + 1, 1, 1).to_datetime().date() - today).days

distance_5_5 = (lunar_date(today.year, 5, 5).to_datetime().date() - today).days
distance_5_5 = distance_5_5 if distance_5_5 > 0 else (
        lunar_date(today.year + 1, 5, 5).to_datetime().date() - today).days

distance_8_15 = (lunar_date(today.year, 8, 15).to_datetime().date() - today).days
distance_8_15 = distance_8_15 if distance_8_15 > 0 else (
        lunar_date(today.year + 1, 8, 15).to_datetime().date() - today).days

distance_year = (datetime.datetime.strptime(f"{today.year + 1}-01-01", "%Y-%m-%d").date() - today).days

distance_4_5 = (datetime.datetime.strptime(f"{today.year}-04-05", "%Y-%m-%d").date() - today).days
distance_4_5 = distance_4_5 if distance_4_5 > 0 else (
        datetime.datetime.strptime(f"{today.year + 1}-04-05", "%Y-%m-%d").date() - today).days

distance_5_1 = (datetime.datetime.strptime(f"{today.year}-05-01", "%Y-%m-%d").date() - today).days
distance_5_1 = distance_5_1 if distance_5_1 > 0 else (
        datetime.datetime.strptime(f"{today.year + 1}-05-01", "%Y-%m-%d").date() - today).days

distance_10_1 = (datetime.datetime.strptime(f"{today.year}-10-01", "%Y-%m-%d").date() - today).days
distance_10_1 = distance_10_1 if distance_10_1 > 0 else (
        datetime.datetime.strptime(f"{today.year + 1}-10-01", "%Y-%m-%d").date() - today).days


def get_week_day(date):
    week_day_dict = {
        0: '星期一',
        1: '星期二',
        2: '星期三',
        3: '星期四',
        4: '星期五',
        5: '星期六',
        6: '星期天',
    }
    day = date.weekday()
    return week_day_dict[day]


# print("距离大年: ", distance_big_year)
# print("距离端午: ", distance_5_5)
# print("距离中秋: ", distance_8_15)
# print("距离元旦: ", distance_year)
# print("距离清明: ", distance_4_5)
# print("距离劳动: ", distance_5_1)
# print("距离国庆: ", distance_10_1)
# print("距离周末: ", 5 - today.weekday())

now_ = f"{today.year}{today.month}{today.day}日"
week_day_ = get_week_day(today)
time_ = [
    {"v_": 5 - 1 - today.weekday(), "title": "周末"},  # 距离周末
    {"v_": distance_year, "title": "元旦"},  # 距离元旦
    {"v_": distance_big_year, "title": "过年"},  # 距离过年
    {"v_": distance_4_5, "title": "清明节"},  # 距离清明
    {"v_": distance_5_1, "title": "劳动节"},  # 距离劳动
    {"v_": distance_5_5, "title": "端午节"},  # 距离端午
    {"v_": distance_8_15, "title": "中秋节"},  # 距离中秋
    {"v_": distance_10_1, "title": "国庆节"},  # 距离国庆
]

time_ = sorted(time_, key=lambda x: x['v_'], reverse=False)


@app.get("/", response_class=HTMLResponse)
async def readme(request: Request):
    return templates.TemplateResponse("readme.html",
                                      {"request": request, "time_": time_, "now_": now_, "week_day_": week_day_})


if __name__ == '__main__':
    import uvicorn

    uvicorn.run(app='main:app', host="0.0.0.0", port=8080, reload=True)

最后就到了 html 页面部分了,来看一下主要的传值。

<center>
    【摸鱼办公室】今天是 {{ now_ }} {{ week_day_ }}
    <br><br>
    {% for v_ in time_ %}
        <p> 距离 {{ v_.title }} 放假还有 {{ v_.v_ }} 天</p>
    {% else %}
        <p>沒有任何值</p>
    {% endfor %}

</center>

这样整个的路由构造和页面编写就算是完成了。

最后通过 Nginx 部署到我的站点上。

摸鱼办预览地址

代码已经上传至 摸鱼办

https://github.com/PY-GZKY/moyu

你可能会有更多的想法、可以在评论区讨论、一切为了摸鱼。

小伙伴们,快快用实践一下吧!如果在学习过程中,有遇到任何问题,欢迎加我好友,我拉你进Python学习交流群共同探讨学习。

终于有人将MySQL的安装讲明白了

前言

在日常开发中,存储数据的最常用的方式便是数据库了,其中最为著名的便是MySQL数据库,因它简便易于上手而且可扩展性强大,跨平台使得它广为使用,今天我们就来具体聊聊它的安装。

一、安装过程

我们所使用的是MySQL 5.7版本,这个版本算是挺不错的。下面我们来介绍下这个版本的具体安装过程吧。

1.解压安装

因为官网目前下载不了,为了大家安装过程中方便,我们下载一个免安装版mysql,下载好后将这个压缩包文件解压到指定的磁盘下,比如我想解压到E盘的mysql文件夹中。如图:

2.配置环境变量

为了让mysql 可以在任意目录运行,我们可以将mysql的bin目录添加到环境变量,如图:

3.修改配置文件

在mysql目录下创建一个my.ini配置文件,修改配置:

[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8
[mysqld]
#设置3306端口
port = 3306
# 设置mysql的安装目录
basedir="E:\mysql\mysql-5.7.11-winx64"
# 设置mysql数据库的数据的存放目录
datadir="E:\mysql\mysql-5.7.11-winx64\data"
# 允许最大连接数
max_connections=200
# 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB

4.安装mysql

以管理员身份运行命令提示符,输入mysqld install命令(注意是mysqld而不是mysql)回车,即可安装MySQL,提示:Service successfully installed,则表示安装成功,如下图所示:

移除服务:mysqld remove

5.启动mysql服务

在命令提示符下执行命令,

启动mysql:net start mysql
停止:net stop mysql

发现启动不了,如图:

这是怎么回事了,哦~原来是因为还没有初始化,那么我们现在来进行初始化,

执行指令:mysqld --initialize-insecure --user=mysql,
mysqld --initialize-insecure:自动生成无密码的root用户,
mysqld --initialize:自动生成带随机密码的root用户,
mysqld --initialize --user=mysql --console:生成随机密码并显示在控制台窗口,

data文件夹不为空是不能执行这个命令的(删掉data文件即可),

执行mysqld –initialize-insecure –user=mysql命令会自动新建data文件夹。执行结果如图:

可以看到执行成功了,再次启动mysql服务,启动成功。如图:

6.进入mysql,修改登陆密码确保安全

第一次进入mysql 是没有密码就可以登陆了,我们可以设置登陆密码,更改root密码,输入:

update mysql.user set password=password("123321") where user = "root";

因为新版mysql数据库下没有password字段,所以需要使用如下命令:

update mysql.user set authentication_string=password('123321') where user='root';
刷新权限:flush privileges;

这是必须的,不然操作没有效果。

也可以这样修改密码:

set password = password('123456');

这样就将root用户的密码设置为了 123456了,下面我们退出mysql再重新进去,顺带说下退出命令:

退出mysql:quit;

接下来在进入mysql,如图:

这样root用户就有了密码,它的密码就是123321.

整个安装过程就完成了,是不是很简单了。

另外,为了提高交互效果,我们还可以一个软件——-sqlyong,它可以和mysql建立链接。安装好了之后是这样的一幅画面:

然后将先前的root用户和密码输入然后点连接即可进入:

这样就大功告成了。

四、总结

这篇文章主要讲解了MySQL数据库的安装,希望对大家的学习有帮助。

网页结构的简介和Xpath语法的入门教程

相信很多小伙伴已经听说过Xpath,之前小编也写过一篇关于Xpath的文章,感兴趣的小伙伴可以戳这篇文章如何利用Xpath抓取京东网商品信息以及Python网络爬虫四大选择器(正则表达式、BS4、Xpath、CSS)总结。今天小编继续给大家介绍一些Xpath知识点,希望对大家的学习有帮助。

1、Xpath让我们可以使用一种类似于Windows下的文件路径的方式,让我们可以定位到HTML或者XML结构中的具体元素。Xpath本身包含标一些准函数库,可以让我们的Xpath语法更加强大。

2、在HTML结构中,有一定的层级关系,主要的关系包括:父节点、子节点、同胞节点(兄弟节点)、先辈节点、后代节点。

一般的,像类似于<head>这种结构,称之为一个节点。如上图,根据层次关系,我们可以知道<body>节点是<nav>的父节点,相应的,<nav>节点是<body>节点的子节点。同胞节点又叫兄弟节点,一般的处于同级层次的节点叫同胞节点,如上图中的<nav>节点和第一个<div>节点、177~181行的<li>标签都是属于同胞节点。先辈节点又叫祖先节点,一般的,一个节点的上层以上的节点均称为先辈节点,所以父节点也是属于先辈节点的一种。基于此,我们又可以称<body>节点是<nav>的先辈节点。相对应的,一个节点的下层以下的节点均称为后代节点,所以子节点也是属于后代节点的一种。基于此,我们又可以称<nav>节点是<body>节点的后代节点。

3、理解这些节点之间的关系之后,可以方便我们更好的理解Xpath语法,下表是部分常用的Xpath语法。

表达式

详解

//@class

选取所有名为class的属性

/article

选取根元素article

//div

选取所有div子元素

article

选取所有article元素的所有子节点

article/a

选取所有属于article的子元素的a元素

article//div

选取所有属于article元素的后代的div元素

这里特别强调“/”和“//”的区别,“/”一般代表的某个元素的子节点,而不是全部的后代节点;而“//”一般代表的某个元素的后代节点,范围比“/”代表的要更加广泛一些。@符号后边时常跟着class,代表选取名为class属性的节点,比较常见。

4、下面针对具体的网页源码,让大家了解一下网页结构。

如上图中的红色框框中,class为属性,而等于号后边的“grid-5”即为属性值,有的时候节点内不只是一个属性,如上图中的196行中,就有两个属性。

5、为了更加方便的定位到div或者其他节点下的标签,我们需要继续进一步的进行定位锁定,下表是部分常用的Xpath语法。

表达式

详解

//div[@lang]

选取所有拥有lang属性的div元素

//div[@lang=’eng’]

选取所有拥有lang属性为eng的div元素

/article/div[1]

选取属于article子元素的第一个div元素

/article/div[last()]

选取属于article子元素的最后一个div元素

/div/*

选取属于div元素的所有子节点

//*

选取所有元素

//div/a | //div/p

选取所有div元素的a和p元素

掌握了Xpath语法知识之后,我们就可以通过Xpath语法来进行编写Xpath表达式,以提取网页上的目标数据。

千里之行,始于足下。如果想学好Xpath,更是需要勤加使用。

一文解读JavaScript中的文档对象(DOM)

大家好,我是IT共享者,人称皮皮。

前言

相信做网站对JavaScript再熟悉不过了,它是一门脚本语言,不同于Python的是,它是一门浏览器脚本语言,而Python则是服务器脚本语言,我们不光要会Python,还要会JavaScript,因为它对做网页方面是有很大作用的。

1.文档对象(DOM)

1).Document对象

这是我们用的最普遍的一个文档对象了,专门用来操作DOM节点时用。

1)).获取元素

document.getElementById()           #通过id查找HTML元素
document.getElementsByName()        #通过name查找HTML元素
document.getElementsByTagName()     #通过标签名查找HTML元素
document.getElementsByClassName()   #通过类名查找HTML元素 
document.querySelector(".h")        #第一个类名为 "h" 的元素
document.querySelectorAll("div.no, div#h") #所有class为"no"或者id为"h"的div元素
document.body          #获取body标签
document.documentElement   #获取html标签

2)).获取网页内容

document.cookie        #网页cookie
document.domain        #文档的域名
document.lastModified  #文档被最后修改的日期和时间
document.referrer      #载入当前文档的文档的URL
document.title         #当前文档的标题
document.URL           #当前文档的URL
document.doctype       #当前文档的doctype
document.baseURI       #当前文档的绝对URI
document.documentMode   #浏览器使用的模式
document.documentURI    #文档的URI
document.implementation #DOM实现
document.inputEncoding  #文档的编码(字符集)
document.readyState     #文档的(加载)状态
document.strictErrorChecking    #是否强制执行错误检查

3)).文档写入

document.write('hello world')   向文档写入文本
document.writeln('hello world') 向文档写入文本并换行

4)).获取集合

document.all        #所有html元素
document.anchors    #所有Anchor引用
document.forms      #所有的表单引用
document.images     #所有的图片引用
document.links      #所有的超链接引用
document.scripts    #所有的脚本引用
document.embeds     #所有的流媒体引用

5)).获取节点

childNodes          #获取子节点的集合 ,返回数组 ,并把换行和空格也当成是节点信息。
children            #获取子节点的集合 ,返回数组   
firstChild          #获取第一个子元素  并把换行和空格也当成是节点信息
firstElementChild   #获取第一个子节点
lastChild           #获取最后一个子节点 并把换行和空格也当成是节点信息
lastElementChild    #获取最后一个子节点
parentNode          #获取父节点
parentElement       #获取父节点(IE)
offsetParent        #获取所有父节点  对应的值是body下的所有节点信息
previousSibling         #获取上一个兄弟节点  匹配字符,包括换行和空格,而不是节点
previousElementSibling  #获取上一个兄弟节点  直接匹配节点
nextSibling             #获取下一个兄弟节点  匹配字符,包括换行和空格,而不是节点
nextElementSibling      #获取下一个兄弟节点  直接匹配节点
ownerDocument           #元素的根节点

这里我们获取到了所有的Div元素,我们可以针对性的获取一个ID下的Div的子元素以及它的兄弟和父,子元素,如下:

6)).创建节点

我们可以自定义节点并添加值,不过要将它添加到文档中去,所以必须添加节点,一般和下方的增加节点配套使用。

document.createElement(标签)  #创建HTML元素
document.createTextNode(文本) #给文档添加文本
document.createComment(文本)  #创建一个注释节点
document.createDocumentFragment() #创建文档粉碎节点

7)).增加节点

appendChild(节点) #节点被添加到元素的末尾
insertBefore(a,b) #a节点会插入b节点的前面

8)).删除节点

removeChild(节点名)  #被移除的节点仍在文档中,只是文档中已没有其位置了

9)).替换节点

replaceChild(插入的节点,被替换的节点)

10)).复制节点

a.cloneChild() #复制a节点,复制出来的节点作为返回值为true时,则a元素后代也一并复制。否则,仅复制a元素本身

11)).节点属性

#节点类型 nodeType 有三种情况
#1.元素节点  2.属性节点  3.文本节点


#节点名称 nodeName 


#节点值 nodeValue 
#元素节点没节点值,为null 
#文本节点的节点值就是文本
#属性节点的节点值就是该属性值


#节点属性获取
a.width
a['width']
a.gerAttribute(属性名)  返回指定的属性值
a.gerAttributeNode(属性名) 返回指定的属性节点
节点属性设置
a.width=400
a['width']=400
a.attributes['width']=400
a.setAttribute('width',400) 添加指定的属性
a.setAttributeNode(b) 添加指定的属性节点


#节点属性删除
a.removeChild(子节点)    从元素中移除子节点
a.removeAttribute(属性)  从元素中移除指定属性
a.removeAttributeNode(属性) 移除指定的属性节点,并返回被移除的节点


a.id 获取当前元素的id
a.className  获取当前元素的class
a.classList  获取当前元素的class列表


a.accessKey='w'    设置或返回元素的快捷键
a.namespaceURI     返回指定节点的命名空间的 URI
a.dir              设置或返回元素的内容是否可编辑
a.normalize()      合并元素中相邻的文本节点,并移除空的文本节点
a.tabIndex='3'     设置或返回元素的tab键控制次序
a.tagName          返回元素的标签名
a.textContent      设置或返回节点及其子代的文本内容
a.title            设置或返回元素的标题属性
a.item(num)        返回节点列表中位于指定下标的节点
a.length           返回节点列表中的节点数

12)).获取元素文本

a.innerHTML  获取或者设置对象内的HTML
a.innerText  获取或者设置对象内的文本
a.outerHTML  获取或者设置对象外的HTML
a.outerText  获取或者设置对象外的文本
a.value      获取或者设置表单元素的值

总结

这篇文章主要介绍了JavaScript的文档对象。下一篇文章,我们继续介绍JavaScript,敬请期待!