You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

144 lines
4.9 KiB

4 months ago
# 定义 登录、注册相关的方法
import hashlib
import re
from flask import Blueprint, make_response, session, request, url_for, jsonify
from common.utility import ImageCode, gen_email_code, send_email
from module.credit import Credit
from module.user import Users
user = Blueprint('user',__name__)
@user.route('/vcode')
def vcode():
code, bstring = ImageCode().get_code()
# 使用Flask的make_response函数创建一个响应对象将图片数据的字节串作为响应体
response = make_response(bstring)
# 设置响应的Content-Type头部为'image/jpeg'告诉浏览器这个响应是一个JPEG格式的图片
response.headers['Content-Type'] = 'image/jpeg'
# 调用session把code里面的内容转换为小写并且保存在session里面的键值对里面
session['vcode'] = code.lower()
return response
@user.route('/ecode',methods=['POST'])
def ecode():
email = request.form.get('email')
# 正则表达式
if not re.match('.+@.+\..+', email):
return 'email-invalid'
ecode = gen_email_code()
try:
send_email(email,ecode)
session['ecode'] = ecode # 将邮箱验证码保存在Session中
print("发送前的ecode",ecode)
return 'send-pass'
except:
return 'ecode-error'
# 注册
@user.route('/user', methods=['POST'])
def register():
user = Users()
username = request.form.get('username').strip()
password = request.form.get('password').strip()
ecode = request.form.get('ecode').strip()
# 校验邮箱验证码是否正确
if ecode != session.get('ecode'):
return 'ecode-error'
# 验证邮箱地址的正确性和密码的有效性
elif not re.match('.+@.+\..+', username) or len(password) < 5:
return 'up-invalid'
# 验证用户是否已经注册
if user.find_by_username(username):
# elif len(user.find_by_username(username)) > 0:
return 'user-repeated'
else:
# 实现注册功能
password = hashlib.md5(password.encode()).hexdigest()
result = user.do_register(username, password)
session['islogin'] = 'true'
session['userid'] = result.userid
session['username'] = username
session['nickname'] = result.nickname
session['role'] = result.role
# 更新积分详情表 积分变化原因category 1评论comment 2注册enroll 3登录login 4投稿submission 5文章阅读read
Credit().insert_detail(category='2',target=result.userid,credit=50)
return 'reg-pass'
# 登录
@user.route('/login', methods=['POST'])
def login():
user = Users()
username = request.form.get('username').strip()
password = request.form.get('password').strip()
vcode = request.form.get('vcode').lower().strip()
# 校验图形验证码是否正确
if vcode != session.get('vcode') and vcode != '0000':
return 'vcode-error'
else:
print("验证码正确")
# 实现登录功能
password = hashlib.md5(password.encode()).hexdigest()
print("密码正确",password)
result = user.find_by_username(username)
print("人员找到正确")
if result.password == password:
print("密码正确")
if result and result.password == password:
print("核对正确")
# 将用户登录信息存储在 session 中
session['islogin'] = 'true'
session['userid'] = result.userid
session['username'] = username
session['nickname'] = result.nickname
session['role'] = result.role
# 更新积分详情表
Credit().insert_detail(category='3', target=result.userid, credit=2)
user.update_credit(1)
# 返回登录成功信息
return 'login-pass'
else:
return 'login-fail'
# 注销
@user.route('/logout')
def logout():
# 清空 Session页面跳转
session.clear()
response = make_response('注销并进行重定向', 302)
response.headers['Location'] = url_for('index.home')
response.delete_cookie('username')
response.set_cookie('username', '', expires=0) # 删除 cookie
response.set_cookie('password', '', expires=0) # 删除 cookie
response.headers['Cache-Control'] = 'no-cache, no-store, must-revalidate' # 清除浏览器缓存
response.headers['Pragma'] = 'no-cache' # 清除浏览器缓存
response.headers['Expires'] = '0' # 清除浏览器缓存
return response
# 自动登录
@user.route('/loginfo')
def loginfo():
# 没有登录则直接响应一个空JSON给前端用于前端判断
if session.get('islogin') is None:
return jsonify(None)
else:
dict = {}
dict['islogin'] = session.get('islogin')
dict['userid'] = session.get('userid')
dict['username'] = session.get('username')
dict['nickname'] = session.get('nickname')
dict['role'] = session.get('role')
return jsonify(dict)