第四周内容回顾
8/30
import json
import hashlib
import os
if not os.path.exists(r'users'): # 判断存用户的文件夹是否存在
os.mkdir(r'users') # 不存在就创建,注意前面取反
def get_info():
'''获取用户名和密码'''
username = input('please input your username').strip() # 通过input获取用户名并且用strip来规避首位空格
password = input('please input your password').strip() # 通过input获取密码并且用strip来规避首位空格
if len(username) == 0 or len(password) == 0: # 判断用户名密码是不是只有空格或者是空的
print('username or password can not be none') # 提示不能为空
return False # 返回出False方便之后去判断
return username, password # 没问题就把用户名密码反出去
def check_user(username):
'''检查用户名是否重复'''
if username in os.listdir(r'users'): # 用os以列表展开后通过成员运算判断是否在列表里
return True # 在返回True
return False # 不在返回False
def coding(password):
'''加密功能'''
md5 = hashlib.md5() # 导入MD5加密模块
md5.update(password.encode('utf8')) # 把password加密
has_pwd = md5.hexdigest() # 获取到密文赋值
return has_pwd # 把密文反出去
def write_info(username, has_pwd):
'''写入文件的功能'''
user_dict = {'username': username, 'password': has_pwd} # 把获取的数据组成字典
info_add = os.path.join(r'users', username) # 路径合成
with open(info_add, 'w', encoding='utf8') as f: # 通过写入数据和刚才拼接的路径创建文件
json.dump(user_dict, f) # 用json模块把伪字典写入文件(序列化)
def register():
'''登录功能'''
res = get_info() # 函数结果或者把用户名密码赋给一个文本
if not res: # 返还结果False取反
return # 说明用户名或密码为空那就直接返回
username, password = res # 没问题就把用户名和密码赋值出来
if check_user(username): # 通过检查用户名看是否重复
print('username has been registered') # 重复给提示
return # 然后退出注册重新输入用户名
has_pwd = coding(password) # 用户名没问题就加密密码
write_info(username, has_pwd) # 把密码写入
print('register complete') # 提示注册成功
def read_info(username):
'''读取用户数据'''
info_add = os.path.join(r'users', username) # 拼接路径
with open(info_add, 'r', encoding='utf8') as f: # 通过只读打开
user_dict = json.load(f) # 反序列化后的字典赋值出来
return user_dict # 然后返还出这个字典
def login():
'''登录功能'''
res = get_info() # 一样赋值给文本
if not res: # 如果是空就是False取反后就执行
return # 返回重新登录
username, password = res # 没问题就把用户名和密码赋值出来
if not check_user(username): # 如果没有用户名
print('username has not registered yet') # 提示用户用户名不存在
return # 返回重新注册或者冲刑书用户名
has_pwd = coding(password) # 加密登录输入的密码
input_pwd = read_info(username).get('password') # 通过读取到的字典取值取到密文赋值出来
if has_pwd == input_pwd: # 比对两个密文是否一样
print('welcome') # 正确提示欢迎
else: # 不正确
print('password error') # 提示密码错误
func_dict = {'1': register, '2': login} # 把登录注册整体功能做成字典可以防止代码冗余
while True: # 做一个选择要求的循环
print('''
1register
2login
3quit
''') # 提示输入什么指令
choice = input('choose your order') # 要求用户输入指令
if choice in func_dict: # 因为前面字典的存在 只要一个if就能实现所有主体功能
func_name = func_dict.get(choice) # 把字典中的value赋值给功能名
func_name() # 功能名经由赋值变成了函数名加括号就能作为运行起来
elif choice == '3': # 增加的一个退出功能
print('Thanks for using') # 提示退出
break # 结束循环
else: # 其他指令输入
print('order error') # 提示指令有问题
8/31
面向对象
class Student:
school = '雄英学院'
def choose(self):
print('选课')
访问数据和功能
.__dict__
里面的功能属性通过句点符调用
对象的独有数据
def __init__(self, name, age, gender):
self.name = name
self.age = age
self.gender = gender
异常捕获
try:
被检测的代码
except 错误类型 as 变量名:
分支代码(变量名指代的就是错误的具体信息)
9/1
软件开发架构
c/s 就是分为消费者只通过店里专门制作的传送门到店里消费的c/s架构
c是客户端也就是想要去一家店消费的顾客 s是服务端也就是店 两者之间一一对应c只能用于去s
b/s 消费者随便去哪家店都行,然后逛去店里的b/s架构
而这里的b则是什么店都想去的客人 服务器与之前一样 但是现在两者之间因为b的差异而没有对应关系了
数据库本质和分类
数据库的本质就是一款c/s架构的软件
CURD 增删改查
分类
1.关系型数据库
具有固定的表结构 表与表之间可以通过外键建立关系
MySQL Oracle PostgreSQL MariaDB sqlite
2.非关系型数据库
没有固定的表结构 数据存储采用K:V键值对的形式
redis mongoDB memcache
mysql下载安装
官网找到之后注意一下下载的版本问题
解压之后添加一下环境变量
基本操作命令
1.服务端启动
mysqld
2.游客模式
mysql
3.账号密码登录
mysql -h ip地址 -P port号 -u用户名 -p密码
mysql -u用户名 -p密码
4.退出登录
exit
quit
系统服务制作与取消
# 制作
1.查看计算机系统服务列表
services.msc
2.管理员身份打开cmd
mysql --install
3.启动mysql服务端
net start mysql
# 卸载
1.停止服务端运行
net stop mysql
2.卸载系统服务
mysqld --remove
9/2
修改密码
set password=password('密码') # 修改当前登录用户的密码
重置密码
1.先停止正常的服务端
net stop mysql
2.再以跳过授权表的方式启动服务端
mysqld --skip-grant-tables
3.以管理员身份进入并重置指定用户的密码
update mysql.user set password=password(密码) where user='root' and host='localhost'; # 修改指定用户的密码(重置密码)
4.退出登录并停止服务
net stop mysql
5.再以正常的方式启动
net start mysql
配置文件
\s # 查看
之后拷贝my-default.ini重命名成my.ini
百度之后输入一串代码
基本SQL语句
# 针对库的
1.查
show databases;
show create database test_base;
2.增
creat database test_base;
3.改
alter database test_base charset='gbk';
4.删
drop database test_base;
# 针对表的
select database();
use test_base;
1.查
show tables;
show create table test_table;
desc test_table;
2.增
create table test_table(name char,pwd char);
3.改
alter table test_table modify name varchar(16);
4.删
drop table test_table;
# 针对记录
1.查
select * from test_table;
select name from test_table;
2.增
insert into test_table value('leo','123')('ace','123');
3.改
update test_table set pwd='666' where name='leo';
4.删
delete from test_table where name='leo' ;
delete from test_table ;
9/3
存储引擎
InnoDB
5.5版本之后的默认存储引擎
数据安全性高
MyISAM
5.5之前的版本默认存储引擎
安全性较于InnoDB低
但是存取速度优于InnoDB
memory
数据直接存储在内存里
blackhole
数据写进去直接消失
创建表的完整语法
create table 表名(
字段名 字段类型(宽度) 约束条件,
字段名 字段类型(宽度) 约束条件,
字段名 字段类型(宽度) 约束条件
)
字段类型
'整型'
tinyint
smallint
int
bigint
'浮点型'
float
double
decimal
精确度 float < double < decimal
'字符类型'
char(4)
最多可以存储4个字符 超过了报错 没有超过也按照四个字符存储(默认空格填充)
varchar(4)
最多可以存储4个字符 超过了报错 没有超过则按照实际有几个字符存几个
char:
优点 整存整取 速度块
缺点 浪费存储空间
varchar:
优点 节约存储空间
缺点 存取速度较于char慢点
'时间类型'
date # 年月日
time # 时分秒
datetime # 年月日时分秒
year # 年
'枚举与集合'
enum # 枚举
set # 集合
严格模式
# 查看严格模式
show variables like '%mode%';
# 修改严格模式
set global sql_mode = 'strict_trans_tables';
设置好退出客服端然后再进入 就完成了
宽度
对于数字不用加宽度限制
约束条件
unsigned # 无符号
zerofill # 0填充
not null # 不能为空
default # 默认值
unique # 唯一