《看图猜成语》程序使用说明
启动Idiom/flask下的venv虚拟环境,运行python manage.py runserver命令启动Flask。然后打开微信开发者工具并扫码登录,选择flask/weapp-idiom小程序,加载完成后进入小程序登录页面,如图1所示。单击“微信登录”提示微信授权,如图2所示。单击“允许”按钮,即可进入到小程序首页。如图3所示。
图1 登录页面
图2 微信授权
图3 小程序首页
单击“开始挑战”,进入答题页面,如图4所示。在答题页面,鼠标单击选项区的汉字,则会将该汉字填充到当前的答案框中。如要修改答案,可以单击答案中汉字,则该汉字退回到选项区。
图4 开始答题
如果填写4个汉字后,答案正确,则进入下一关,如图5所示。否则提示错误信息,如图6所示。
图5 答案正确
图6 答案错误
全部通关以后,提示通关信息如图7所示。单击“告诉朋友”按钮,即可分享好友,如图8所示。
图7 通过信息
图8 分享好友
单击“回到主页”,在主页点击“排行榜”即可查看比赛排行。如图9所示。
图9 排行榜
主要代码展示
from flask import Blueprint
from app.models import Member,Exam
from flask import jsonify,g,request
from flask_httpauth import HTTPTokenAuth
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
from app.libs.MemberService import MemberService
from app import db
from werkzeug.http import HTTP_STATUS_CODES
api = Blueprint('api', __name__)
# 设置Token验证
auth = HTTPTokenAuth(scheme='Bearer')
serializer = Serializer('mrsoft', expires_in=1800)
@auth.verify_token
def verify_token(token):
try:
data = serializer.loads(token) # 验证token
except:
return False
if 'user_id' in data:
g.user_id = data['user_id']
return True
return False
@auth.error_handler
def token_auth_error():
return error_response(401)
def error_response(status_code, message=None):
response = {
"code": status_code,
"msg": HTTP_STATUS_CODES.get(status_code),
"data": {}
}
return jsonify(response)
@api.route('/users/wx_login',methods=['POST'])
def wx_login():
req = request.values # 接受数据
# 接受数据
nickname = req['nickname'] if 'nickname' in req else ''
avatar = req['avatar'] if 'avatar' in req else ''
# 判断code 是否存在
code = req['code'] if 'code' in req else ''
if not code or len( code ) < 1:
result = {
"code": -1,
"msg": "需要微信授权code",
"data": {}
}
return jsonify(result)
# 根据code,获取openid
openid = MemberService.getWeChatOpenId( code )
if openid is None:
result = {
"code":-1,
"msg":"调用微信出错",
"data":{}
}
return jsonify(result)
# 如果用户存在,写入member表中
member = Member.query.filter_by(openid=openid).first()
if not member:
member = Member(
openid = openid,
nickname = nickname,
avatar = avatar,
sesion = sesion,
)
db.session.add(member)
db.session.commit()
sesionTotal = db.session.query(Exam).count()
token = serializer.dumps({'user_id': member.id}) # 生成token
# 返回结果
result = {
"code":1,
"msg":"登录成功",
"data":
{"userInfo":
{
"userId": member.id,
"nickName": member.nickname,
"avatar": member.avatar,
"sesion": member.sesion,
},
"sesionTotal":sesionTotal,
"token": token.decode(), # byte 转化为string
}
}
return jsonify(result)
@api.route('/exams',methods=["POST"])
@auth.login_required
def get_exam():
sesion = request.values['sesion']
try:
exam = Exam.query.filter_by(id=sesion).first()
result = {
"code": 1,
"data": {
"answer": exam.answer,
"candidates": exam.candidates.split(","),
"image": exam.pictureUrl
},
"message": "请求成功"
}
except:
result = {
"code": 0,
"data": {},
"message": "请求失败"
}
return jsonify(result)
@api.route('/exams/update_sesion',methods=["POST"])
@auth.login_required
def update():
sesion = int(request.values['sesion'])
userId = int(request.values['userId'])
# 更改用户关卡
try:
member = Member.query.filter_by(id=userId).first()
member.sesion = sesion
db.session.commit()
result = {
"code": 1,
"msg": "请求成功",
"data": {
"sesion": sesion
}
}
except:
result = {
"code": 0,
"msg": "更新失败",
"data": {}
}
return jsonify(result)
@api.route('/rank',methods=["POST"])
@auth.login_required
def get_rank():
'''
排行榜
'''
members = Member.query.order_by(Member.sesion.desc()).limit(10).all()
data = []
for item in members:
userInfo = {
"userId": item.id,
"nickname": item.nickname,
"avatar": item.avatar,
"sesion": item.sesion,
}
data.append(userInfo)
# 返回结果
result = {
"code":1,
"msg":"请求成功",
"data": data
}
return jsonify(result)