利用Python也能观看VIP视频

前面几天给大家分享了两篇关于文件下载的文章,可以帮助大家下载视频,没来得及看的小伙伴可以前往盘点4大下载神器,教你分分钟搞定文件下载,安利一款神奇——教你轻松下载百度网盘超大文件,今天继续给大家分享一篇实用的文章。

一、前言

在现在这个快节奏的社会,人们所面临的压力日渐增大,一般人们会利用听歌看视频来舒缓下紧张的情绪,众所周知,很多视频是需要收费,那么这个时候我们该怎样才能越过这个限制,免费看电影了。

相信大家对于VIP并不陌生,但是对着里面的技术还是颇有兴趣的。下面我就来讲解下最简单的实现原理。

首先给大家看一下软件的主界面,如图:

利用Python也能观看VIP视频

二、实现步骤

下面给大家讲解下实现步骤:

一、写界面

import tkinter as tk
import tkinter.messagebox
import webbrowser as wb
class player:
    def __init__(self):
        self.root= tk.Tk()   #初始化窗口
        self.root.title('VIP视频破解软件v1.0')  #窗口名称
        self.root.geometry("700x700")  #设置窗口大小
        #设置窗口是否可变,宽不可变,高可变,默认为True
        self.root.resizable(width=True,height=True)
        self.menu= tk.Menu(self.root)
        self.helpmenu = tk.Menu(self.menu, tearoff=0)
        self.helpmenu.add_command(label='帮助文档', command=self.about)
        self.helpmenu.add_command(label='作者信息', command=self.zzxx)
        self.menu.add_cascade(label='帮助(H)', menu=self.helpmenu)
        self.root.config(menu=self.menu)


        self.val= tk.StringVar(value='')
        self.label1=tk.Label(self.root, text='视频播放通道')
        self.label1.place(x=20,y=20,width=100,height=20)
        self.Radio=tk.IntVar(value=1)
        self.Radio1=tk.Radiobutton(self.root,variable=self.Radio,value=0,text='视频通道1')
        self.Radio2 = tk.Radiobutton(self.root, variable=self.Radio, value=1, text='视频通道2')
        self.Radio1.place(x=130,y=20,width=100,height=20)
        self.Radio2.place(x=250, y=20, width=100, height=20)


        self.val1=tk.StringVar(value='https://www.iqiyi.com/v_19rqpqcijk.html#vfrm=19-9-0-1')
        self.link= tk.Label(self.root, text='视频播放链接')
        self.link.place(x=20, y=60, width=100, height=20)
        self.movie = tk.Entry(self.root, textvariable=self.val1)
        self.movie.place(x=130, y=60, width=300, height=20)
        self.clean=tk.Button(self.root,text='清空',command=self.qk)
        self.clean.place(x=440,y=60,width=30,height=20)
        self.warn= tk.Label(self.root, text='将视频链接复制到框内,点击播放VIP视频')
        self.warn.place(x=50, y=90, width=400, height=20)
        self.val2=tk.StringVar
        self.start= tk.Button(self.root, text='播放VIP视频', command=self.Button)
        self.start.place(x=220, y=140, width=80, height=30)
        self.start1 = tk.Button(self.root, text='爱奇艺', command=self.openaqy)
        self.start1.place(x=100, y=200, width=70, height=30)
        self.start2 = tk.Button(self.root, text='腾讯视频', command=self.opentx)
        self.start2.place(x=200, y=200, width=80, height=30)
        self.start3 = tk.Button(self.root, text='优酷视频', command=self.openyq)
        self.start3.place(x=300, y=200, width=80, height=30)
        self.b1=tk.Button(self.root,text='技术博客,点我直达',command=self.refer)
        self.b1.place(x=200,y=600,width=140,height=40,anchor='nw')
        self.root.mainloop()

基本上没什么 好说的,都比较简单,我就挑重点说。

二、付费视频解析

打开爱奇艺或者其他的,只要是付费会员才能看的视频都可以,在这里我选这一部电影:

利用Python也能观看VIP视频

可以看出这是部付费电影,身为白嫖怪的我们当然受不了这个啦。

于是乎,受网络的影响,我找到了视频解析网站,哈哈哈。

1.http://17kyun.com/api.php?url=
2.https://api.kk06.top/?url=

这两个网站亲测可用,也不知道爱奇艺为啥对这个不管管,哈哈哈,咱也不敢问。不过温馨提示下,视频解析网站不一定是长期可以使用的,也许过一段时间就失效了,如果失效的话,大家也可以自行度娘找找看。

找到这两个宝贝就好办了,直接把付费电影的链接放在解析网站地址的后面,然后就是这幅画面:

利用Python也能观看VIP视频

我们就达到了目的,下面开始主程序的编写。

三、编写解析视频函数

def Button(self):
    a = 'http://17kyun.com/api.php?url=' if self.val1.get() else 'https://api.kk06.top/?url='  #Python骚操作:推倒式
    b = self.movie.get() 
    wb.open(a+b)  #打开浏览器进行播放

四、编写浏览各大主流网站的函数

def openaqy(self):
     wb.open('http://www.iqiyi.com')


 def opentx(self):
     wb.open('http://v.qq.com')


 def openyq(self):
     wb.open('http://www.youku.com/')

五、菜单栏目

def about(self):
    abc='''
        经过测试 ,支持站点:


        爱奇艺 腾讯 优酷 土豆 芒果 乐视 搜狐 PPTV 华数TV 风行 咪咕 哔哩哔哩 ACfun 暴风 CCTV CNTV 
        范特西 9i广场舞 搜狐自媒体 M1905视频 看看视频 27盘 虎牙直播 全民直播 战旗直播 人人视频 爆米花 
        今日头条 天翼视频 糖豆视频 龙珠视频 快手视频 一直播 新浪视频 360小视频 熊猫TV 斗鱼TV 花椒直播 
        网易公开课 音悦台 秒拍网 美拍网 爱拍 凤凰视频 梨视频 微录客 人民微视频 17173视频 
        优米视频 m3u8 mp4视频 微博视频 YY视频 私有云资源
        '''
     tkinter.messagebox.showinfo(title='帮助文件', message=abc)
def zzxx(self):
     msg='''
        作者:皮皮
        V信: pycharm1314
        技术网站:http://pdcfighting.com/
        '''
     tkinter.messagebox.showinfo(title='联系方式', message=msg)

六、启动程序

启动类player() 即可

三、总结

本程序虽然难度不大,但是胜在实用,我们用简单的方法实现了相对复杂的技术,哈哈哈哈!

盘点4大下载神器,教你分分钟搞定文件下载

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

前几天给大家分享了一篇关于百度网盘的下载神器文章,安利一款神奇——教你轻松下载百度网盘超大文件,有读者反馈这个下载神奇下载小文件得心应手,但是下载大文件还是有些小吃力的,于是乎,皮皮给大家继续找了几个插件,一起跟着皮皮来盘点一下吧~

一、前言

平时我们在访问一些国外网站的时候难免会出现访问延迟甚至是下载到一半就无法下载的尴尬,比如我用360浏览器下载docker,如图:

看到这感人的速度,不禁让我流下了悔恨的泪水,如果当初我能知道几个下载神器中的一种,我也不会那么焦急地等待着。好在现在小编接触的软件比以前的多了,所以现在下载很多工具也就效率高了不少,下面小编就把自己曾经用过的觉得非常棒棒哒的下载工具分享给大家吧,记得点赞关注加收藏哦。

二、IDM

全称Internet Download Manager,是一个非常强大的软件,官方说可将下载速度提升至最多五倍,原先不信,自从用过之后我信了,而且觉得有过之而无不及。IDM不仅下载速度快而且支持断点续传,而且还支持代理服务器,ftp和http协议,防火墙,重定向,cookie,授权,音频和视频内容处理。我们下载后只需按照要求来安装它即可,IDM支持指定位置安装,下面我们来看看它长啥样吧,如图:

下面我们来使用它下载docker看看效果如何,如图:

我们从上面使用360浏览器下载的速度和这里使用IDM的速度一对比,差距可以说是再明显不过了,这也可以说明IDM的下载速度不是一般的快。不过这个软件有个致命伤,那就是有使用的时间限制,如果你用超过15天的话,你就会被它颁奖,授予你一个需要序列号才能使用的奖状,如图:

此时若是遇到这种情况莫要惊慌,小编已经给大家在网上找到了一个破解版的,也是相当好用,地址:

https://u062.com/f/7715018-484413622-ddb3ad(访问密码:123321)

下载下来后直接解压点击绿色安装然后点击IDM.exe就可以直接用了,如图:

这样就再也不用担心下载付费的问题了。另外,IDM也支持指定站点抓取,什么意思呢?就是它可以将目标网址中的一些图片视频以及其它文件抓取下来,你想抓取什么类型的文件都可以,如图:

可以说功能也是有够强大了。

三、XDM

全称Xtreme Download Manager,同样是一款牛逼的下载工具,具有和IDM 相同的功能,它可以保存和转换来自YouTube,Vimeo,Dailymotion,Google Video和成千上万个其它网站的流式视频并支持断点续传,支持HTTP,HTTPS,FTP,DASH,HLS,HDS协议,防火墙,代理服务器,PAC脚本,文件重定向,Cookie,授权,下载队列,调度程序等,并且它内置了视频转换器。说得这么牛逼我们来下载个试试看,地址:

https://u062.com/f/7715018-484413629-55a3ab(访问密码:6511)

这里小编分享的是一个msi的安装包,点击后无需安装直接就能安装好,第一次启动会显示英文界面,如图:

这里下面提示我们软件有更新,我们不用管它,下面我们把这个英文界面切换到中文界面,如图:

这样就可以直接汉化成功了,然后我们来添加一个下载任务,如图:

从这个速度可以看到,感觉比IDM还要快,简直就是视频下载必杀器一般的存在啊。

四、PDM

全称Persepolis Download Manager,也是一款十分强大的下载工具,这里小编提供有32位和64位两个版本,下载地址:

https://u062.com/f/7715018-484413736-d1c621(访问密码:6511)

PDM是一款基于aria2的图形化工具,它的速度也很快,并且资源占用少,支持 HTTP / FTP / BT / Magnet 磁力链接等类型的文件下载;并且跨平台支持 Win、Mac、Linux,甚至在树莓派、NAS、路由器等设备上都能安装它。唯一的遗憾就是不支持HTTPS。PDM打开时为英文界面,不过我们可以把它改为中文界面,如图:

下面我们用它来下载下docker试试,如图:

可以看到,下载速度和上面的工具比起来要更快一些。

五、XDown

一款专业的文件下载与分享工具,支持浏览器(Chrome/FireFox/Edge )下载,torrent下载文件与做种,BitTorrent 内置tracker list设置,FTP/HTTP/HTTPS/HTTP2协议下载,断点续传,多IP轮询节点下载,磁力链接,全局限速,也是相当牛逼的一个工具,地址:

https://u062.com/f/7715018-484416754-72bcab(访问密码:6511)

下面来看下它是如何下载的吧,如下:

我们可以看到,速度比较慢,不过比360浏览器还是稍微快一点,可以说是这几款工具中表现最差的了,不过它也有它的过人之处,就是用它来下载种子文件还是很方便的,这点是其它几个工具比不了的。

六、总结

以上就是小编经常使用的几款下载工具了,不知道你用过哪几款呢?赶快都来试试吧。

Mysql查询语句进阶知识集锦

前言

上次咱们简单的学习了一下select的用法,一篇文章教会你进行Mysql数据库和数据表的基本操作,对数据库大概有了一些基本的了解。

咱们接着上次继续来看叭!

查询

数据如下

or查询

我们在上学时,会听到这样的话,某某某,你把谁谁谁或者谁谁谁叫过来。

这样子的话,我们我们要查询的,就是一个或(or)的关系了。

or查询只有满足一个条件即可

sql

-- 语法
SELECT * from student WHERE <条件> or <条件> ...;
-- 例如,查询姓名为张三的或者姓名为小刘的数据
SELECT * from student WHERE name="张三" or name="小刘";

执行结果

不等于(!=)查询

上述我们查询的,都是等于(=)操作,但是我们在上学时,还会有这种情况。

某个学生学习可好,背东西背的可快,放学的时候可能就人家一个人过了,这时候老师可能就说

除了某某某,其他学生本篇文章全部抄3遍,淦。。。

所以这时候就是反过来的查询的,只需要排除某个人即可!

sql

-- 语法
SELECT * from student WHERE <条件>;
-- 例如,查询姓名不是张三的其他人,排除张三
SELECT * from student WHERE name!="张三";

执行结果

in/not in查询

学生们还都是年轻人,年龄大概都在20来岁,这时候老师说,班长,把年龄在19,20,21的人统计一下!

根据上述我们学过的知识,可能你是这样婶的。

SELECT * from student WHERE age=19 or age=20 or age=21;

执行结果

通过三个or找到,其实这样也没错,但是还有一种更简单的。

sql

-- 语法
SELECT * from student WHERE <列名> in (值1,值2,...) ...;
-- 例如,需求同上
SELECT * from student WHERE age in (19,20,21);

执行结果

not in 就是不在这个范围的数据啦!

sql

-- 查询年龄不在19,20,21范围的数据
SELECT * from student WHERE age not in (19,20,21);

执行结果

between查询

between适合进行范围查询!

sql

-- 语法
select * fromwhere <列> between <开始范围> and <结束范围>;
-- 例如,查询年龄时20-22岁的学生
SELECT * from student WHERE age BETWEEN 20 and 22;

执行结果

同理,between还能用在时间上。

select * from <表名> where <时间列> between <开始时间> and <结束时间>

模糊查询(like)

假设现在数据如下,有三个姓张的。

老师可能突然有一天对你说,班长,把咱们姓张的列出来,我找他们谈点事,咋办???

我们只需要找,是以张开头的,后面是啥无所谓。

所以就要用到like模糊查询。

sql

-- 语法 %表示匹配一个或多个字符
select * fromwhere <列> like '[%]<字符串>[%]'
-- 例如,查询,以张开头的
SELECT * from student WHERE name like "张%";

执行结果

同理,这个%可以放在任意位置,他就是充当不确定的字符使用的,能够自动匹配一个或多个

例如

... WHERE name like "张%丰";
匹配:张三丰
WHERE name like "%鱼";
匹配:张甲鱼
WHERE name like "李%";
匹配:李四
...

限制(limit)

限制这个有点怪异,还是图片举例比较好。

数据如下

sql

-- 前两行
SELECT * from student LIMIT 2;

-- 从第2行开始后,再取4行
SELECT * from student LIMIT 2,4;
-- 同上,写法不同
SELECT * from student LIMIT 4 OFFSET 2

排序(order by)

不知道你有没有发现,我们之前查找的顺序都是正向的。

但是会有个问题,我们新增的数据,其实id是最大的,理论来说,应该要排在最前面。

所以,应该是倒序的是最好的。

sql

-- 语法
select * from <表名> order by <列> asc -- 从小到大排序
select * from <表名> order by <列> desc -- 从大到小排序
select * from <表名> order by <列1> desc,<列2> asc -- 先根据 列1 排序,如果数据相同,按照 列2 排序

例如

根据id正向排序

SELECT * from student ORDER BY id ASC;

执行结果

根据id反向排序

SELECT * from student ORDER BY id desc;

执行结果

hhh,这样我们就把数据反过来了!!!

分组(groupby)

分组,这个可能是难为了一批人,其实分组的核心,在于理解这个压缩这个概念。

假设数据如下

性别有男有女,如果我想知道,男的有多少个,女的有多少个怎么办???我总不能数吧。。。

所以这时候,如果能吧,男的都拿出来,女的都拿出来,就像这样!

然后我对拿出来进行压缩成一条。

如果这个你懂了,那分组就懂了。

语法

SELECT <列>,COUNT(<列>) from student GROUP BY <列>;
-- 因为分组了某个列,所以就不能再展示其他列的信息了,因为压在一块了,显示不了
-- 但是可以通过count,sum等函数计算压缩的个数,或者总值

例如

统计男女各多少人

SELECT gender,COUNT(gender) from student GROUP BY gender;

执行结果

统计同一年龄多少人

SELECT age,COUNT(age) as "数量" from student GROUP BY age;

执行结果

注意:group by必须在where之后,order by之前。

总结

本篇主要讲述的是Mysql查询语法,再单表查询中,基本上就上述这么些的内容,但是从理论到事件,是需要时间的。

一定要勤加练习,什么是or查询,like查询注意事项,尤其是group by分组查询,一定要多多思考和联系。

如果在操作过程中有任何问题,记得下面留言,我们看到会第一时间解决问题。

不要轻易改变自己,因为你可能就是世界上那颗未加工的最亮的钻石。

我是码农星期八,如果觉得还不错,记得动手点赞一下哈。

感谢你的观看。

如果在操作过程中有任何问题,记得下面留言,我们看到会第一时间解决问题。

安利一款神奇——教你轻松下载百度网盘超大文件

前言

玩过百度网盘的都应该清楚它的强大,小编就是靠着百度网盘那强大的功能以及变态的存储空间才获得许多具有纪念价值的东西,比如某些Hacker资料,你懂的。

但是小编一直以来都有一个心结未解开,那就是为毛每次使用百度网盘下载文件的时候就非得下载百度网盘客户端才可以了,估计先不说浪费时间和占用电脑资源,至少小编也是不乐意这样做的,毕竟小编电脑可是只有60个G的存储空间了。

那么,我们该怎么样处理这个问题呢?简而言之就是如何在不下载客户端的情况下就可以下载这个大型的文件了,一起往下看看。

一、坑爹的下载制度

先来回顾下这个坑爹的画面:

看到这里小编尴尬癌都犯了,本想下载个黑客工具玩玩,过过瘾,奈何是这个样子,正巧不巧的自己的电脑又出了点意外,无法安装百度云客户端,目前还无法找出根本原因;但是小编是那么轻易认输的人吗?当然不是,于是乎,小编便找到了这么个神器,浏览器的一个脚本—-一般圈内人都叫它们油猴。

二、油猴脚本

油猴(Tampermonkey),这哥们我相信只要是玩过Google浏览器的同志都不会太陌生,它有着丰富的脚本资源,因而可以满足我们平时的网络需求,但是请注意,油猴脚本只能作用在Chromeium内核的浏览器上哦,小编所使用的360浏览器就是其中之一,其它的像什么QQ浏览器,UC浏览器等都是,随意选择一种即可;IE浏览器不是哦。

三、安装脚本

这里我们以360浏览器为主进行讲解,首先需要进入扩展管理界面,要想进入就得先点击管理图标,如下:

就是这个田子型的图标,点击它即可进入,然后我们点击加号按钮就可以进入扩展管理界面,如下:

这里我们在红色箭头处输入:‘tampermonkey’“,然后点击安装即可。安装成功是这个样子的,如图:

四、选择脚本库

虽然我们已经安装了油猴脚本,但是并不表示现在就可以随心所欲下载资源,进行各种骚操作了,我们还需要下载另一个脚本资源。不过在下载脚本资源之前,我们需要在某个库中查找,因为这些脚本资源目前都集中在库中,目前来说最出名的就是”GreasyFork “和”OpenUserJS “。小编选择的是”GreasyFork “,不因为别的,只是觉得这个网站的布局风格我很喜欢,于是果断选择了它,如图:

五、安装附加脚本

既然我们已经找到最合适的库了,那么接下来就是安装附加的脚本了,这里我们需要下载一个脚本,名为”网盘助手“,选择最新版本的网盘助手,如图:

点击进去,然后进行下载,如图:

这里我们可以在油猴的界面去查看当前下载的脚本的状态,如图:

可以看到,这里小编下载了两个脚本。

六、下载文件它就是解除

接下来就是最重要的时刻,做了那么多还不就是为下载文件做铺垫吗?那么我们该怎么做了?首先小编要说明的一点就是,你必须先把这个要下载的文件保存到百度网盘中才可以 ,那么废话不多说,保存我想大家都会,那就看网盘里有啥资源吧,我们随便选择一个资源,如图:

可以看到,选择了之后就会出现一些其它的选项,我们选择生成链接,然后会出现一个链接,如图:

我们点击这个链接,如图:

这样就弹出了下载链接了,我们选择好下载路径后直接点击下载,如图:

静静等待下载,一切大功告成。

七、总结

其实,像这样的神器在油猴中还有许多,这只是其中的一个而已,油猴上有很多优秀的脚本,好用到哭。

说说Python集合的那些事儿

大家好,我是IT共享者,人称皮皮。今天给大家来捋一捋Python集合。

一、什么是集合?

集合(set)和字典(dict)类似,它是一组 key 的集合,但不存储 value。集合的特性就是:key 不能重复。

二、集合常用操作

1. 创建集合

set 的创建可以使用 {} 也可以使用 set 函数:

s1 = {'a', 'b', 'c', 'a', 'd', 'b'}  # 使用 {}
print(s1)
(['a', 'c', 'b', 'd'])

s2 = set('helloworld')  # 使用 set(),接收一个字符串
print(s2)
set(['e', 'd', 'h', 'l', 'o', 'r', 'w'])
s3 = set(['.mp3', '.mp4', '.rmvb', '.mkv', '.mp3'])  # 使用 set(),接收一个列表
print(s3)
set(['.mp3', '.mkv', '.rmvb', '.mp4'])

说说Python集合的那些事儿

2. 遍历集合

s = {'a', 'b', 'c', 'a', 'd', 'b'}
for e in s:
    print(e)

说说Python集合的那些事儿

3. 添加元素

add() 方法可以将元素添加到 set 中,可以重复添加,但没有效果。

s = {'a', 'b', 'c', 'a', 'd', 'b'}
print(s)
set(['a', 'c', 'b', 'd'])
s.add('e')
print(s)
set(['a', 'c', 'b', 'e', 'd'])
s.add('a')
print(s)
set(['a', 'c', 'b', 'e', 'd'])
s.add(4)
print(s)
set(['a', 'c', 'b', 4, 'd', 'e'])

说说Python集合的那些事儿

4. 删除元素

remove() 方法可以删除集合中的元素, 但是删除不存在的元素,会抛出 KeyError,可改用 discard()

例子:

s = {'a', 'b', 'c', 'a', 'd', 'b'}
print(s)
set(['a', 'c', 'b', 'd'])
s.remove('a')  # 删除元素 'a'
print(s)
set(['c', 'b', 'd'])
s.remove('e')  # 删除不存在的元素,会抛出 KeyError

说说Python集合的那些事儿

s = {'a', 'b', 'c', 'a', 'd', 'b'}
print(s)
set(['a', 'c', 'b', 'd'])
s.remove('a')  # 删除元素 'a'
print(s)
set(['c', 'b', 'd'])
s.discard('e')  # 删除不存在的元素, 不会抛出 KeyError

说说Python集合的那些事儿

三、交集/并集/差集

Python 中的集合也可以看成是数学意义上的无序和无重复元素的集合,因此,我们可以对两个集合作交集、并集等。

看看例子:

s1 = {1, 2, 3, 4, 5, 6}
s2 = {3, 6, 9, 10, 12}
s3 = {2, 3, 4}
print(s1 & s2 ) # 交集
set([3, 6])
print(s1 | s2)  # 并集
set([1, 2, 3, 4, 5, 6, 9, 10, 12])
print(s1 - s2)  # 差集
set([1, 2, 4, 5])
print(s3.issubset(s1))  # s3 是否是 s1 的子集

print(s3.issubset(s2))  # s3 是否是 s2 的子集

print(s1.issuperset(s3))  # s1 是否是 s3 的超集

print(s1.issuperset(s2))  # s1 是否是 s2 的超集

说说Python集合的那些事儿

四、总结

本文主要介绍了Python的另外一种形式(集合),通过讲解集合中如何去创建集合,遍历集合,解释了两种常见的集合操作,添加元素和删除元素。最后通过一个小项目,介绍了集合之间中的三种关系。希望能够帮助大家更好的学习。

一篇文章教会你进行Mysql数据库和数据表的基本操作

通常情况下,我们都是通过mysql.exe(客户端),连接mysql服务的。

但是有个问题。

  • 第一个问题就是太丑了。
  • 第二个问题是因为这不会自动提示啊…,早都习惯了各种自动提示工具,在用这么Low的

安装

下一步下一步就可以了!!!

破解

管理员运行PatchNavicat

打开之后,游览到安装Navicat for MySQL的目录,完成即可。

新建查询

连接好之后,点击查询,再点击新建查询,就可以写SQL了。

关于Mysql的一些概念理解

需要先理清一个概念,Mysql不是数据库。

我们连接的是Mysql服务,不是数据库

所以当别人听到连接数据库时,其实指的是连接跑起来的Mysql服务。

数据库的理解

数据库可以理解为文件夹

通过show DATABASES;命令查看自己下面有哪些数据库

再切换到<mysql安装位置>\data下。

同样可以发现有这个几个文件夹

如果再<mysql安装位置>\data新建一个文件夹

再通过show DATABASES;命令查看当前有哪些数据库,可以发现确实多了刚才新建文件夹(数据库)。

所以就得出了一个结论,数据库其实就是一个文件夹。

数据表的理解

数据库相当于文件夹,那数据库里面放的,就是数据表了。

表内容

其实会发现,数据表Excel很相似。

Excel有啥数据表也有啥。

通常都是表头(蓝色框),表内容(红色框)

总结

数据库就是一个个文件夹

数据表是不能单独存在的,需要放在数据库中,xlsx举例使用。

数据库又分表头,表内容,,

数据库相关命令

查看当前Mysql下的数据库

命令

show DATABASES;

结果

使用数据库

使用数据库的意思就是。

数据库其实就是一个个文件夹,使用数据库就是进入这个数据库,相当于进入到这个文件夹里里面。

命令

use <数据库名字>;
# 例如 use <mysql> 进入mysql这个数据库,

在日常使用中,要操作哪个数据库里面的表,一定要use 这个数据库

创建数据库

命令

CREATE DATABASE <数据库名称> DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
# 示例,创建一个school数据库
CREATE DATABASE school DEFAULT CHARSET utf8 COLLATE utf8_general_ci;

执行结果

删除数据库

DROP <数据库名称>
# 示例,删除 school 数据库
DROP school

数据表相关命令

记得一定要use 数据库,进入数据库才能操作表。

创建表

格式

create table 表名(
    列名  列类型  [其他参数1 其他参数2 ...],
    列名  列类型  [其他参数1 其他参数2 ...]
...
)ENGINE=InnoDB DEFAULT CHARSET=utf8

其他参数包括有

  • 是否可以为空
  • not null — 不可空
    null — 可空
  • 默认值
  • defalut 2 — 默认2
  • 自增自增一般用在id上,并且只能有一个自增列,插入时不需要管这个列,会自动添加值。
  • auto_increment — 自增
    — 虽然自增加这一个关键字就行了,但是由于主键是不能为空的,所以要配合其他关键字
    not null auto_increment primary key
  • 主键主键,一种特殊的唯一索引,不允许有空值。如果主键使用单个列,则它的值必须唯一。如果是多列,则其组合必须唯一。

  • primary key(nid,num)
  • 外键
  • constraint fk_cc foreign key (color_id) references color(nid)

其他参数一一对应上就行了。

示例

创建一个老师表

create table teacher(
    id  int not null auto_increment PRIMARY key,
    teacher_name varchar(16) not null
)ENGINE=InnoDB DEFAULT CHARSET=utf8

查看数据库有哪些表

命令

show TABLES;

结果

删除表

drop table <表名>

清空表

delete from <表名>
truncate table <表名>

总结

其实这章讲的还是比较简单的,在使用Mysql时,一定要注意一个问题,就是sql后面一定要加一个;

这章主要讲的是数据库的操作数据表的操作。

如果在操作过程中有任何问题,记得下面留言,我们看到会第一时间解决问题。

敬往事一杯酒,自此不再回头。

Vue的学习笔记(下篇)

一、什么是Vue.js?

Vue 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用提供驱动。

前面几天我们已经分享了Vue的学习笔记(中篇)和Vue的学习笔记(上篇),今天我们一起来看看下篇。

二、Vue的v-for循环

(一)v-for循环普通数组

1.在data中定义普通数组;

data(){
return{
list: [1, 2, 3, 4, 5]
}
}

2.在html中使用v-for指令渲染;

<p v-for="(item, i) in list">索引值是:{{i}} --- 每一项的值是:{{item}}</p>

3.效果图如下图:

Vue的学习笔记(下篇)

(二)v-for循环对象数组

1.在data 中定义对象数组;

data(){
return{
        list: [
  { id: 1, name: 'zhan1' },
  { id: 2, name: 'zhan2' },
  { id: 3, name: 'zhan3' },
  { id: 4, name: 'zhan4' }
]
}
}

2.在html中使用v-for指令渲染:

<p v-for="(user, i) in list">Id:{{ user.id }} --- 名字:{{ user.name }} --- 索引值是:{{i}}</p>

3.效果图如下图:

Vue的学习笔记(下篇)

(三)v-for循环对象,在遍历对象的身上的键值对时候,除了有val、key,在第三个位置还有一个索引值。

1.在data定义一个对象;

data(){
return{
user: {
        id: 1,
        name: 'zhan',
        gender: '男'
   }
}
}

2.在html中使用v-for指令渲染:

<p v-for="(val, key, i) in user">值是:{{ val }} --- 键是:{{key}} -- 索引值是:{{i}}</p>

3.效果图如下图:

Vue的学习笔记(下篇)

(四)v-for迭代数字 ###在in后面我们放过普通数组、对象数组、对象,还可以放数字,如果使用v-for迭代数字的时候,前面的count值的从1开始。

1.在html中使用v-for指令渲染:

<p v-for="count in 5">这是第 {{ count }} 次循环</p>

2.效果图如下图:

Vue的学习笔记(下篇)

(五)v-for循环中key属性的使用

v-for 循环的时候,key 属性只能使用number获取string,在key使用的时候,必须使用v-bind属性绑定的形式,指定key的值,在组件中,使用v-for循环的时候,如果有v-for的同时,指定唯一的字符串/数字类型:key的值。

1.在data 中定义对象数组;

data(){
return{
        list: [
  { id: 1, name: 'zhan1' },
  { id: 2, name: 'zhan2' },
  { id: 3, name: 'zhan3' },
  { id: 4, name: 'zhan4' }
]
}
}

2.在html中使用v-for指令渲染代码如下图:

Vue的学习笔记(下篇)

3.效果图如下图:

Vue的学习笔记(下篇)

三、Vue过滤器的基本使用

1.首先定义一个 Vue 全局的过滤器,名字叫做msgFormat,字符串的replace方法的第一个参数,除了可以写一个字符串之外,还可以定义一个正则。

2.在js的代码中,如以下代码:

Vue.filter('msgFormat', function (msg, arg, arg2) {
  return msg.replace(/day/g, arg + arg2)
})


Vue.filter('test', function (msg) {
  return msg + '========'
})

3.在html代码中,如以下代码:

<p>{{ msg | msgFormat('我', '123') | test }}</p>

4.在data中,定义一个msg:

data(){
return{
msg:'the day is cloudless'
}
}

5.效果图如下图:

Vue的学习笔记(下篇)

四、总结

1.vue中的v-for循环有普通数组、对象数组、对象、迭代数字、key属性的使用,这些用法的详解,希望对大家有所帮助。

2.vue过滤器的基本使用局部过滤器优先于全局过滤器被调用,一个表达式可以使用多个过滤器,过滤器之间需要用管道符“|”隔开,其执行顺序从左往右。

3.这些代码比较简单,希望对你有帮助!

Vue的学习笔记(中篇)

一、什么是Vue.js?

Vue 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用提供驱动。上篇文章我们讲述了基础,可以戳这里:Vue的学习笔记(上篇)。这篇文章我们继续捋一捋~

二、Vue中使用样式class

第一种使用方式,传递一个数组,这里的class需要使用v-bind的数据绑定;

<h1 :class="['thin', 'italic']">hello world1!</h1>

第二种使用方式,在数组中使用三元表达式;

<h1 :class="['thin', 'italic', flag?'active':'']">hello world2!</h1>

第三种使用方式,在数组中使用对象来代替三元表达式,来提高代码的可读性;

<h1 :class="['thin', 'italic', {'active':flag} ]">hello world3!</h1>

在为class使用v-bind绑定对象时候,对象的属性是一个类名,由于对象的属性可以带引号,也可以不带,属性的值是一个标识符;

<h1 :class="classObj">hello world!</h1>

在css的样式代码如下图:

在js的代码如下图

效果图如下图:

三、Vue中样式style:vue中样式是动态绑定style,对象是不需要键值对的集合。

第一种使用方式是将键值对的对象写在data中,直接的动态绑定;

<h1 :style="styleObj1">The first H!!</h1>

第二种使用方式是多个键值对对象,使用数组方式,依次写入;

<h1 :style="[ styleObj1, styleObj2 ]">The first H1!!</h1>

在js的代码如下图:

效果图如下图:

四、v-if和v-show的使用

v-if的特点:每次都会重新删除或创建元素,有较高的切换性能消耗。

v-show的特点:每次不会重新进行DOM的删除和创建操作,只是切换了元素的 display:none 样式,有较高的初始渲染消耗。

v-if和v-show的使用:

如果元素涉及到频繁的切换,最好不要使用 v-if, 而是使用 v-show,如果元素可能永远也不会被显示出来被用户看到,则使用v-if。

1.在html代码中,如以下的代码:

<input type="button" value="toggle" @click="flag=!flag">
<h3 v-if="flag">这是用v-if控制的元素</h3>
<h3 v-show="flag">这是用v-show控制的元素</h3>

2.在data中定义一个flag,如以下的代码;

data(){
      return{
        flag: false,
  }
}

3.效果图如下图:

五、总结

1.在vue中使用样式class,有三种方式传递一个数组、数组中的三元表达式、使用对象来代替三元表达式,在为class使用v-bind绑定对象,对象属性是一个类名,属性的值是一个标识符。

2.在vue中使用样式style,vue中样式动态绑定style,对象是不需要键值对的集合,有两种方式将键值对的对象写在data中直接的动态绑定、多个键值对对象,使用数组方式,依次写入。

3.vue-show本质是标签display设置为none,控制隐藏,vue-if是动态的向DOM树内添加或者删除DOM元素。

4.代码比较简单,希望对你有帮助!

Vue的学习笔记(上篇)

一、什么是Vue.js?

Vue 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用提供驱动。

二、什么是v-model指令?

v-model指令是:它负责监听用户输入事件,从而更新数据,并对一些极端场景进行一些特殊的处理。使用v-model指令,可以实现表单元素和Model中数据的双向数据绑定,v-model只能运用在表单元素中。

怎么使用v-model指令?

1、首先创建一个组件,在src/components/文件夹下新建一个day01.vue。

2、在day01.vue写p元素和input元素,在input元素使用v-model。

3、在App.vue导入这个day01.vue组件,然后在template中加入day标签。

代码如下图所示:

Vue的学习笔记(上篇)

效果图:

Vue的学习笔记(上篇)

三、使用v-model实现简单的加减乘除计算器

1、在template里实现页面布局;

2、在data定义n1和n2表示第一个数和第二个数,result表示结果、opt表示加减乘除;

3、在methods里处理自定义的方法,使用swith表达式实现加减乘除。

代码如下图所示:

Vue的学习笔记(上篇)

Vue的学习笔记(上篇)

效果图:

Vue的学习笔记(上篇)

四、实现跑马灯的效果

1、 给跑马灯滚动按钮,绑定一个点击事v-on或@;

2、 在按钮的事件处理函数中,写相关的业务逻辑代码:拿到 msg 字符串,然后调用字符串的 substring 来进行字符串的截取操作,把第一个字符截取出来,放到最后一个位置;

3、为了实现点击下按钮,自动截取的功能,放到一个定时器中去;

代码如下图所示:

Vue的学习笔记(上篇)

Vue的学习笔记(上篇)

效果图:

Vue的学习笔记(上篇)

五、总结

1、使用v-model 指令,实现表单元素和 Model 中数据的双向数据绑定,v-model只能运用在表单元素中。使用v-model实现简单的计算器,对v-model进一步的了解。

2、代码比较简单,希望可以帮助到你。

浅析装饰器的那些事儿

一、装饰器的简单定义

外层函数返回里层函数的引用,里层函数引用外层函数的变量。

二、装饰器的作用

通俗来讲装饰器的作用就是在不改变已有函数代码前提下,为该函数增加新的功能。

def run():
   print('我会跑')
fun()

现在我想在原有函数的基础上新增一个功能:我会唱歌。这个时候利用装饰器则轻松可以帮我们实现这个功能。

三、实例理解

(1)不传参的装饰器

def outer(fun):
   def inner():
      fun()  //fun是外层函数的变量,在inner里面用
   return inner //inner就是里层函数的引用

(2)传递参数的装饰器:

def func(fun):
   def add(*args,**kwarge):
      return fun(*args,**kwargs)
   return add

现在对于装饰器的基本格式有一定的了解,就可以直接写函数了。下面实现文章开头的 我会唱歌 的功能

def outer(fun):
    def inner(*args, **kwarge):
        print("我会唱歌")
        return fun(*args, **kwarge)
    return inner

四、如何使用装饰器

方法一:使用@符号+装饰器的名字   把它放在想要装饰函数的上一行即可
@outer
def run():
   print('我会跑')
   
run()




方法二:
def run():
    print('我会跑')


run=outer(run)   #就等价于@outer
run()


最终打印结果是:
我会唱歌
我会跑

如果我想知道fun 传递的参数是什么,在装饰器内部可以使用如下方式:

def outer(fun):
    a = 1
    def inner(*args, **kwarge): # args是一个数组,kwargs一个字典
        print(fun.__name__) #打印fun接收的函数的名字
        print("我会唱歌")
        return fun(*args, **kwarge)
    return inner

但是如果我们 print(run.__name__,6666666) 输出的结果是inner,并不是我们想要的run,这里的函数被warpTheFunction替代了。它重写了我们函数的名字和注释文档(docstring)。解决方法如下:

from functools import wraps


def outer(fun):
    @wraps(fun)
    def inner(*args, **kwargs):
        print(fun.__name__,11111111111)
        print("我会唱歌")
        return fun(*args, **kwargs)
    return inner


@outer
def run():
   print('我会跑')
   
 print(run.__name__,6666666)  //输出结果为 run 666666

五、自己实现装饰器

def subuser_keymanage(view_func):
    '''功能是实现用户管理权限的判定'''
    def _wrapper_view(request, *args, **kwargs):
        user = request.user #一个Customer对象,包含了用户名/密码等信息
        customer = user.customer.customer_id #用户的id
        select_status = get_curuser_permission(user=user, customer=customer)#调用函数返回的值有两种0和1
        if not select_status:#如果返回0表示没有权限,返回错误码
            return render_response(request, ErrorCode.FAILED)
        return view_func(request, *args, **kwargs)
    return _wrapper_view
@subuser_keymanage 
def generate_subuser_ak_sk(request):
    params = json.loads(request.body) #获取卡前端传递的参数
    user_id_only = params.get("user_id") #获取用户表示id值
    中间代码就忽略了......
    return render_response(request, ErrorCode.FAILED)

六、装饰器小结

通过装饰器很大程度上可以减少代码的复用,在代码规范中这一点是很重要的。

以上就是装饰器的基本知识,即便没有任何基础,按照作者的思路,套用固定的格式,不需要完全理解,只要按照流程一步一步就能写出高端大气上档次的装饰器了,恭喜你!

前方高能请注意:装饰器传参,三层嵌套函数一般用的比较少,其实也不难,一层一层看,跟上文讲的一样,仅作为知识的拓宽。

import logging
def use_logging(level):
    def decorator(func):
        def wrapper(*args, **kwargs):
            if level == "warn":
                logging.warn("%s is running" % func.__name__)
            elif level == "info":
                logging.info("%s is running" % func.__name__)
            return func(*args)
        return wrapper


    return decorator


@use_logging(level="warn")
def foo(name='foo'):
    print("i am %s" % name)


foo()
i am foo
WARNING:root:foo is running

如果在操作过程中有任何问题,记得下面留言,我们看到会第一时间解决问题。