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

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 定义 登录、注册相关的方法
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)