根据个人项目所实现的出题逻辑,发现生成的题目计算起来相对困难,了解到Python
中内置函数eval()
可以用来实现题目结果的计算,于是结对项目复用时使用了Python
作为编程语言,根据eval
函数计算时的条件,我们使用了math
库作为初高中复杂计算的补充,计算结果的代码如下:
import math import random # 定义可以使用的函数及常量 functions = ('e', 'pi', 'sin', 'cos', 'tan', 'sqrt', 'radians') def calculate(expression): expression = expression.lower() # replace函数返回替换后的字符串 expression = expression.replace('%', '/100.0') expression = expression.replace('^', '**') expression = expression.replace('mod', '%') expression = expression.replace('rad', 'radians') for i in functions: if i in expression: expression = expression.replace(i, 'math.{}'.format(i)) try: return eval(expression) except ZeroDivisionError: print('zero can not be division') except Exception as e: print(e)
鉴于在个人项目中已经实现了数据库存储和查重,于是使用数据库中已经存在的众多题目作为题库,便于以后题目的增加,以实现更复杂的系统,并且减少了系统的耦合程度。根据数据库的设计的字段先后差异,对数据生成做了以下处理:
更换符号
原始(美化后的UniCode
)
// 操作符定义 var ( baseOperator = []string{"+", "-", "×", "÷", "()"} juniorOperator = []string{"√", "²"} highOperator = []string{"tan", "sin", "cos"} finalOperator = "=" )
现在(Python eval()
能识别的原始标志)
// 操作符定义 var ( baseOperator = []string{"+", "-", "*", "/", "()"} juniorOperator = []string{"sqrt", "^2"} highOperator = []string{"tan", "sin", "cos"} finalOperator = "=" )
去除了题目之前的空行
进行答案生成时,我们使用了Python
脚本进行自动处理并批量导入,核心代码如下:
with open(filename, 'r') as f: line = f.readline() while line: line = line[:-1] newline = line.replace("=", "") result = calculate(newline) if result: print(result) res = int(float(format(result, ".4f"))) tmp = [res] for _ in range(3): temp = random.uniform(0.1, 9.9) - 5 if temp == 0: temp = 0.1 tmp.append(res + temp) random.shuffle(tmp) index = tmp.index(res)
通过这样的方式,我们就获得了一个含有一个题目、三个错误答案、一个正确答案、一个正确答案的位置和年级的题目实体。
综上所述,对于个人项目,我们复用了题目的生成逻辑,新增了计算逻辑,但是为了保证用户良好的体验(避免长时间等待)、项目之间的低耦合以及便于以后的拓展,我们实现了类似题库的功能。
Web + Server
模式,了解了前后端的通信方式,解决了跨域(CROS
)问题,了解了http
通信的相关定义;React-Context
进行用户信息的多组件共享,后端使用Session
进行用户对象的存储,以此来解决登录之后修改自己密码的需求;Cookie - Session
状态组件有了更为严格的规范,由于没有及时的了解和关注,导致测试时使用了不同源Cookie
,使得测试失败,这警醒了我们,一定要注意技术栈的更新迭代一定要及时;