文章目录
👨💻作者简介: 大家好,我是上进小菜猪。内蒙古科技大学,计科。苟怀四方志,所在可游盘。技术很菜但不放弃,努力做全栈。 华为云专家,阿里云专家,华为内蒙古包头市HCSD负责人。
🛳️个人主页: 上进小菜猪的博客
📗系列专栏:本文写在《APP开发从0到1》专栏 ✉️如果文章知识点有错误的地方,请指正! 和大家一起学习一起进步🎈
🔥如果觉得博主的文章还不错的话,请👍三连支持👍一下博主哦
一,前言
又有一个需求哈:积分系统逻辑:每天只能答3次,取三次最高分计入总分。多余三次不计成绩。
模仿“学习强国”中挑战答题模块,进行软件模块化设计,将工科教学中选择题、判断题、填空题的题库以答题模式进行抽取,每天抽取5道题,有2次答错机会,没空一分,每次答题10分为满分,2次答错机会用完后按最高分登记成绩。
二,逻辑实现(数据库设计)
改变数据库基本结构:
增加time,为一个一个列表,每个列表下是一个字典集。如下图所示:
2.1,time.time详解
结构设计:time.time->{time,jifeng}
解释为实现2次答错机会用完后按最高分登记成绩。采用time1,time2,time3。代表某天最大的答题次数。
对应的{time,jifeng}为今天的日期和本次答题的积分。
三,后端实现【flask】
res={"username":session['username']}
上述代码解释:
session为当前用户的登录状态,存储在session里,我们需要先获取到他现在登录的账号。
find=db.mongo.find_one(res)
上述代码解释:
以username为主键,找到数据库里对应的那行,当前的find为现在找到的账户的全部json信息。
now = datetime.date.today()
上述代码解释:
引入datetime库。方便获取现在的日期,存储到之前设计的数据库里。
上述代码块解释:
设置一个flag=‘time’,然后设置一个遍历,每次循坏加一。强转为str类型。在find索引处进行一个拼接。爬虫的管用手法。单独写也行,就是麻烦一点。
now是现在日期,比如是:2022/4/14。
str(find[‘time’][flag+str(i)][0])是获取第X个数据库里的time.time->{time,jifeng}的time的值,并且注意要强转为str类型。
进行判断,如果俩者不相当的话,把当前的now赋值给现在遍历的不相等的timex的值。
如果相等的话,跳过,falg++,计数器,下面判断要用。【之前赋值flag1=0,如果出现不相当的情况,flag1=1。没有说明,今天答题已经上限了】
db.mongo.update_one({'username':find['username']},
{'$set':find
})
上述代码块解释:
功能:更新数据。已username为索引,找到现在的用户信息json。
吧现在更新完毕的find字典集,替换原来的数据字典集。
3.1,(情况一)今天答题已经上限了,不计入分数
上文的【之前赋值flag1=0,如果出现不相当的情况,flag1=1。没有说明,今天答题已经上限了】。
if(flag1==0):
return jsonify({"stayus":200,"mag":"今天答题已经上限了,本次不计入分数!"})
返回mag:今天答题已经上限了,本次不计入分数!
3.2,(情况二)今天未上限
这里是后改的,不是很简洁,因为一开始的思路有问题,其实可以合并的,但是懒的改了,功能已经实现了。
大题截图和思路如下:
重点代码分析:
其实 if(falg<3):和if(falg3 and flag11):是可以合并到一起的。当时是因为思路问题,
思路:
三次答题:
第一次,积分直接压入。
第二次:判断是否大于第一次,小于不操作,大于压入,积分减去第一次压入的值
第三次:确定第三次的分值最大,否则不操作。最大压入,减去max(第一次,第二次)。
注意:str和int类型的来回转换。
return jsonify({"stayus":200,"mag":"成功计入分数,"+"今天已经完成"+str(falg)+"次答题了。"})
前端提示次数,增加友好性。
四,全代码附上
@app.route("/jifeng",methods=['POST','GET'])
def jifeng():
res={"username":session['username']}# 以username为主键,找到数据库里对应的那行find=db.mongo.find_one(res)muqianjifen=find['jifeng']
now = datetime.date.today()jifeng=request.form.get('jifeng')#print(find['time'])maxjifen='0'flag='time'falg=0flag1=0foriin range(1,4):
falg=falg+1
#print(find['time'][flag+str(i)])
if(str(now)!=str(find['time'][flag+str(i)][0])):
flag1=1
find['time'][flag+str(i)][0]=str(now)
find['time'][flag+str(i)][1]=str(jifeng)break
else:
continue#print(find)
db.mongo.update_one({'username':find['username']},
{'$set':find
})#今天答题已经上限了,不计入分数
if(flag1==0):
return jsonify({"stayus":200,"mag":"今天答题已经上限了,本次不计入分数!"})#今天未上限
if(falg==3 and flag1==1):
if(int(find['time']['time3'][1])>int(find['time']['time2'][1])and int(find['time']['time3'][1])>int(find['time']['time1'][1])):
muqianjifen=int(muqianjifen)-max(int(find['time']['time2'][1]),int(find['time']['time1'][1]))+int(find['time']['time3'][1])
db.mongo.update_one({'username':find['username']},
{'$set':{"jifeng":str(muqianjifen)}})return jsonify({"stayus":200,"mag":"成功计入分数,"+"今天已经完成3次答题任务了哦。"})
if(falg<3):
if(falg==1):
muqianjifen=int(muqianjifen)+int(find['time']['time1'][1])
if(falg==2):
if(int(find['time']['time2'][1])>int(find['time']['time1'][1])):
muqianjifen=int(muqianjifen)-int(find['time']['time1'][1])+int(find['time']['time2'][1])
db.mongo.update_one({'username':find['username']},
{'$set':{"jifeng":str(muqianjifen)}})#print("+++",muqianjifen,"+++")return jsonify({"stayus":200,"mag":"成功计入分数,"+"今天已经完成"+str(falg)+"次答题了。"})falg=1
版权归原作者 上进小菜猪 所有, 如有侵权,请联系我们删除。