0


【MUI+Flask+MongoDB+HBuilderX】APP开发之答题积分逻辑详解

文章目录

👨‍💻作者简介: 大家好,我是上进小菜猪。内蒙古科技大学,计科。苟怀四方志,所在可游盘。技术很菜但不放弃,努力做全栈。 华为云专家,阿里云专家,华为内蒙古包头市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
标签: MUI MongoDb falsk

本文转载自: https://blog.csdn.net/weixin_52908342/article/details/124163894
版权归原作者 上进小菜猪 所有, 如有侵权,请联系我们删除。

“【MUI+Flask+MongoDB+HBuilderX】APP开发之答题积分逻辑详解”的评论:

还没有评论