分类: 题库-更新日志

  • 个人题库-更新日志

    “面对生命的荒谬,
    最崇高的反抗是成为自己。”

    -《查拉图斯特拉如是说》

    不以物喜不以己悲

    主要更新了录入系统
    但在客户端并没有进行同步更新
    现在有了解析显示
    做错了题目如果有解析就有解析看

    更新简述 V2.01.7.01

    • 优化了部分代码
    • 优化了随机抽题逻辑
    • 添加了解析显示
    • #已知BUG
      移动版无法兼容图片加载

    未来更新目标

    V2.01.7.5

    可以通过服务器空中下载最新题库
    题库加密处理

    *取消的更新

    更新随机选择下连续选择题的支持

    V2.01.7.5+

    暂时不知道更新什么 收藏夹吧 这个大饼我画好久了
    还移动端兼容问题

    我很懒的

    We are not rich by what we possess but by what we can do without.

    我们的富有不是因为我们拥有的,而是因为我们能没有的。

    —— 康德

  • 个人题库-更新日志

    按住 W 开始寻思

    更新了一个激活码系统 分为静态激活码和动态激活码用户可以根据激活码激活已经在包内的题库 但是没有在包内的就激活不了

    更新简述 V2.01.7

    • 优化了部分代码
    • 新增了激活码激活题库的功能
    • #已知BUG
      移动版无法兼容图片加载

    未来更新目标

    V2.01.7.5

    可以通过服务器空中下载最新题库
    题库加密处理

    *取消的更新

    更新随机选择下连续选择题的支持

    V2.01.7.5+

    暂时不知道更新什么 收藏夹吧 这个大饼我画好久了
    还移动端兼容问题

    我很懒的

    Even the darkest night will end and the sun will rise.

    即使是最黑暗的夜晚也会结束,太阳终将升起。

    —— 《悲惨世界》维克多·雨果

  • 个人题库-更新日志

    记者问: “你为什么要攀登珠穆朗玛峰?”
    马洛里答: “因为山就在那里。”

    “Why do you want to climb Mount Everest?”
    “Because it is there.”

    每次重新打开都要输入一次用户名太麻烦了,优化了登入逻辑,现在会先验证用户是否存在,再去决定用户是否需要输入用户名。为了方便用户更改用户名,我把更改用户名的选项改在了设置下面。

    更新简述 V2.01.6.57

    • 优化了部分代码
    • 优化了登入逻辑
      现在不需要每次登录都重新输入一遍用户名
    • 优化了信号解耦
    • #已知BUG
      移动版无法兼容图片加载

    未来更新目标

    V2.01.6.6

    *推迟更新

    更新随机选择下连续选择题的支持

    V2.01.7

    可以通过服务器空中下载最新题库
    题库加密处理

    我很懒的

    Any idiot can face a crisis; it’s this day-to-day living that wears you out.

    任何傻瓜都能应对危机,真正折磨人的是日复一日的日常生活。

    —— 安东·契诃夫

    因为山就在那里

    乔治·马洛里 

  • 个人题库-更新日志

    “瀕死のリテラシー メカニカルに殺す
    濒危的读写能力 被机械扼杀殆尽”

    本来修复安卓端无法兼容图片显示的漏洞的,结构误打误撞把安卓端无法连接验证服务器的问题解决了,一下午修复,发现通用方法不能让移动端常规加载图片。

    更新简述 V2.01.6.4

    • 重构了节点架构
    • 重构了主要代码
    • 安卓端现在可以连接到验证服务器 不需要提交本地验证
    • 优化了信号解耦
    • #已知BUG
      移动版无法兼容图片加载

    未来更新目标

    V2.01.6.5

    更新随机选择下连续选择题的支持

    V2.01.7

    可以通过服务器空中下载最新题库
    题库加密处理

    我很懒的

    He allowed himself to be swayed by his conviction that human beings are not born once and for all on the day their mothers give birth to them.

    他坚信人是可以改变的,并非一生下来就定型了。

    —— 《霍乱时期的爱情》加西亚·马尔克斯

    碎碎念

    最近长时间没更新主要是把时间投入到大学生职业规划大赛了,院赛真的是简陋,第一版感觉自己太天马行空了,改的很务实。自己排练的时候也压着5分钟限制讲(我把很多重要的点都省略了)。结果比赛第一个上,没激光笔只能给放PPT的干比划,我要讲的要么没放出来,要么我还没讲完就跳下一页了。很多地方也没讲完(残念,最后遗憾离场。听到别人的讲述,我都觉得我写的都是 小~儿~科~(法国口音)。听完我觉得这不是职业规划大赛(成长赛道),是AI复制吹牛逼打草稿大赛(爽文赛道)。听的我想笑,严重超时都能拿第一。我除了笑笑我还能干什么,随他去吧。
    *图片是我拿B站大佬工程文件学习做的花海地铁
    Blender真的太好用了,你们知道吗

  • 个人题库-更新日志

    “All my friends are toxic”

    现在可以直接从下方输入栏输入答案,不用一次次点击选项了。
    新增的用户界面也是一个摆设而已,但请你记住你上册登录时用的名字。
    优化了部分代码。

    更新简述 V2.01.6.4

    • 兼容了含图片选择题
    • 更新了选择题输入逻辑
      现在可以从下方直接输入回答
    • 添加了一个没用的登录界面
    • 优化了部分代码
    • #已知BUG
      移动版无法兼容图片加载

    未来更新目标

    V2.01.6.5

    更新随机选择下连续选择题的支持

    V2.01.7

    可以通过服务器空中下载最新题库
    题库加密处理

    我很懒的

    不在沉默中爆发,就在沉默中灭亡。

    If we don’t burst out in silence, we will perish in silence.

    —— 《记念刘和珍君》鲁迅

    源码


    func pic_show(options_text):
    	var IMG_NODE = $Label_list/IMG
    	var start_index = options_text.find("img")  # 找到 "img" 的起始位置
    	if start_index != -1:
    		var IMGname = options_text.substr(start_index+3).strip_edges()  # 从img开始截取并去除空白
    		#print(IMGname)  # 输出
    		var IMG_path = exe_get_IMG()
    		IMG_path = IMG_path.path_join(IMGname)
    		if not FileAccess.file_exists(IMG_path):
    			print("文件不存在: ", IMG_path)
    			return null
    		# 直接加载纹理
    		var image = Image.new()
    		var error = image.load(IMG_path)
    		if image.get_width()/image.get_height() <0.95:
    			# 旋转90度
    			image.rotate_90(CLOCKWISE)  # 或者使用 COUNTERCLOCKWISE 取决于需求
    		texture = ImageTexture.new()
    		texture.set_image(image)
    		
    		if not texture:
    			print("无法加载纹理: ", IMG_path)
    			return
    		$Label_list/IMG/IMG.texture = texture
    		IMG_NODE.visible = true
    		IMG_path = exe_get_IMG()
    		#依旧屎山挪用,找到标注的文件位置。然后进行调取,新建一个图片显示器。
    GDScript

  • 个人题库分享

    食用指南


    这是主页,这些是已经实现/未来会更新的内容。
    开始/错题本:进入选择题库阶段 错题本进入的是错题文件夹
    录入:暂不可用(尚未更新完)
    检查完整性&收藏夹:暂未更新
    设置:隐私协议和背景设置 以后还会更新关于字体和颜色的主题管理

    点击左下角查看历史记录即可查看最近的历史记录(具体内容可查看下方图片)
    现在功能有限,不能单独删除,只能删除全部。
    题库选择界面左侧按钮为答题设置:
    随机顺序:随机顺序
    计时器:进入答题界面右上角有个计时器
    错题记录:本次做错的题目自动计入错题本文件夹
    点击右侧文本即可进入选定题库

    答题界面展示
    点击选项进行选择,后面会更新根据输入(键盘)进行快捷选择
    最近兼容了简答题,点击下方即可输入答案,详情见之前更新日志
    右上角会显示实时时间和计时器(如果开启)
    左上角会统计本次答题的基础信息:
    题库标签,答题进度,正确率等。

    自定义设置


    自定义背景设置:
    可以设置导入的背景以及更改现在已有的背景显示(水平翻转/关闭)

    程序第一次启动后会自动创建几个新的空文件夹
    其中自定义背景文件需要放入background文件夹
    (仅支持常见图片格式)
    bank文件夹下为自行导入题库(已禁用)
    export文件夹为导出题库位置(暂未更新)
    history文件夹为历史记录文件夹
    mistake_note为错题本文件夹

    资源下载


    “我们为代码负责,您为点击负责。”

    Think first.

    源码查看:
    GitHub

  • 个人题库-更新日志

    这是关于填空题的更新展示,使用的是简单的判断公式,如果输入和文本中已有的文本,且长度和答案相似则视为正确。这个BUG无伤大雅,懒得修了。

    更新简述 V2.01.6.2

    更新了简答题和填空题的兼容
    优化了部分代码

    未来更新目标

    V2.01.6.5

    更新对B型(同一选项不同题干的连续型选择题)以及含图题目

    V2.01.7

    可以通过服务器空中下载最新题库
    题库加密处理

    我很懒的

    《浮士德》——歌德

    “要每天每日去开拓生活和自由,然后才能作自由与生活的享受。”

  • 个人题库-更新日志 RegEx

    V2.01.6 2025-10-03更新:错题本更新,现在打开错题记录开关本次错误题目会在答题结束后计入错题题库存储在根目录mistake_note文件夹下

    	for problem in json_array:
    		var problem_id = problem["id"]
    		# 跳过占位符题目
    		if "占位符" in problem["question"]:
    			if not header_added:
    				# 添加文件头信息
    				var header_problem = problem.duplicate()
    				header_problem["question"] = "错题集合 - 源自: " + file_name_ + " - 导出时间: " + time() 
    				mistake_collection.append(header_problem)
    				header_added = true
    			continue
    		
    		# 如果是错题,添加到集合中
    		if problem_id in mistakes:
    			var mistake_problem = problem.duplicate()
    			# 添加错题次数信息
    			if mistake_count_dict.has(problem_id):
    				mistake_problem["mistake_count"] = mistake_count_dict[problem_id]
    			else:
    				mistake_problem["mistake_count"] = 1
    			mistake_collection.append(mistake_problem)
    	
    	if mistake_collection.size() <= 1:  # 只有文件头,没有实际错题
    		return
    	
    	# 生成文件名:原文件名_年月日_时分.json
    	var time_dict = Time.get_datetime_dict_from_system(false)
    	var filename_suffix = "%04d%02d%02d_%02d%02d" % [
    		time_dict["year"], time_dict["month"], time_dict["day"],
    		time_dict["hour"], time_dict["minute"]
    	]
    	
    	var mistake_filename = file_name_ + "_mistakes_" + filename_suffix + ".json"
    	var mistake_file_path = exe_get_mistake_note_file().path_join(mistake_filename)
    	
    	# 保存错题集合文件
    	var json_string = JSON.stringify(mistake_collection, "\t")
    	var file = FileAccess.open(mistake_file_path, FileAccess.WRITE)
    	if file:
    		file.store_string(json_string)
    		file.close()
    		print("错题集合已导出: ", mistake_file_path)
    		print("包含错题数量: ", mistake_collection.size() - 1)  # 减去文件头
    	else:
    		print("错题集合导出失败: ", mistake_file_path)
    GDScript

    其中占位符部分记录本次做题信息,包括校验码,防止恶意的题库泄露。

    if is_mistake_mode:
    			# 匹配格式:原文件名_mistakes_年月日_时分
    			var regex = RegEx.new()
    			regex.compile(".*_mistakes_\\d{8}_\\d{4}$")
    			should_show = regex.search(filename) != null
    		# 题库模式:不显示包含日期格式的文件
    		else:
    			# 排除包含日期格式的文件
    			var regex = RegEx.new()
    			regex.compile(".*_mistakes_\\d{8}_\\d{4}$")
    			should_show = regex.search(filename) == null
    GDScript

    RegEX 正则表达式的使用

    这个正则表达式的含义:

    • .* – 匹配任意字符(除了换行符)0次或多次
    • _mistakes_ – 匹配固定的文本 “mistakes
    • \\d{8} – 匹配8个数字(年月日:20231225)
    • _ – 匹配下划线
    • \\d{4} – 匹配4个数字(时分:0930)
    • $ – 匹配字符串的结尾

    所以这个正则表达式匹配的是:任意文本 + “mistakes” + 8位数字 + “_” + 4位数字 的文件名格式。

    常用的正则表达式符号:

    符号含义例子
    .匹配任意单个字符a.c 匹配 “abc”, “a c”, “a-c”
    *前一个字符0次或多次ab*c 匹配 “ac”, “abc”, “abbc”
    +前一个字符1次或多次ab+c 匹配 “abc”, “abbc”(不匹配”ac”)
    ?前一个字符0次或1次ab?c 匹配 “ac”, “abc”
    \d匹配数字\d+ 匹配 “123”, “45”
    \w匹配字母、数字、下划线\w+ 匹配 “hello”, “abc123”
    []匹配括号内的任意字符[abc] 匹配 “a”, “b”, “c”
    ^匹配字符串开头^Hello 匹配以”Hello”开头的字符串
    $匹配字符串结尾world$ 匹配以”world”结尾的字符串
    {n}匹配前一个字符n次\d{4} 匹配4位数字

    使用正则表达式 示例:

    # 1. 创建RegEx对象
    var regex = RegEx.new()
    
    # 2. 编译正则表达式模式
    regex.compile("你的模式")
    
    # 3. 使用它来搜索或匹配
    var result = regex.search("要搜索的文本")
    
    # 检查是否匹配成功
    if result:
        print("找到匹配!")
        print("匹配的内容:", result.get_string())
    else:
        print("没有找到匹配")

    使用了正则表达式简化了代码

    更新内容:

    使用了新的变量让原有题库选择界面兼容了错题本,简化了软件逻辑和页面用量。
    添加了 线下与线上两者验证方式,防止软件的随意盗用甚至是倒卖
    优化了设置细节,读取外部文件不再由Debug模式统一管理而是不同的_Host进行管理。使必要部分可以读取和修改外部文件。
    购买了正版验证配套验证服务。

    已知的BUG

    安卓版只能读取封装文件,使得不能进行做题历史记录和错题自动整理以及随意的背景更换。
    安卓版不支持HTTP协议传输,导致只能进行封装的线下验证。
    暂不支持IOS

    计划中的更新

    V2.01.X

    推出收藏夹模块
    兼容B型选择题、含图题目、填空题。

    V2.0X.Y

    社区功能
    考试模式

  • 个人题库-更新日志

    现在网络上面题库系统都太昂贵,所以我自己搓了一个。

    这是题库的核心,访问json文件,所有的题目都存在json内:

    class JsonQuestionBank:
        def __init__(self, file_path: str = 'questions.json'):
            self.file_path = file_path
            self.questions = self._load_questions()
            
        def _load_questions(self) -> List[Dict]:
            try:
                with open(self.file_path, 'r') as f:
                    return json.load(f)
            except (FileNotFoundError, json.JSONDecodeError):
                return []
        
        def _save_questions(self):
            with open(self.file_path, 'w') as f:
                json.dump(self.questions, f, indent=2)
        
        def add(self, question: str, tags: str, options: List[str], answer: str) -> int:
            """添加题目并返回ID"""
            q_id = len(self.questions) + 1
            self.questions.append({
                'id': q_id,
                'tags':tags,
                'question': question,
                'options': options,
                'answer': answer
            })
            self._save_questions()
            return q_id
        
        def get(self, q_id: int) -> Dict:
            """根据ID获取题目"""
            return next((q for q in self.questions if q['id'] == q_id), None)
        
        def get_random(self) -> Dict:
            """随机获取一道题"""
            return random.choice(self.questions) if self.questions else None
        
        def delete(self, q_id: int) -> bool:
            """删除题目"""
            for i, q in enumerate(self.questions):
                if q['id'] == q_id:
                    self.questions.pop(i)
                    self._save_questions()
                    return True
            return False
    Python

    这是核心访问部分,可交互性过低,只能实现命令行式的交互,我有额外写了一些增加交互性的代码。

    #while 循环 和 input堆砌的屎山

    这就是第一版可用版本了,交互性太低了。

    现在是已经更新的功能和版本

    • V0.1 2025/05/20 更新基础录入题目,随机答题,检查所有题干以及特定题干功能
    • V0.2 2025/06/02 更新支持含图片题目录入(仅一张),选定题目检查
    • 已知的BUG:插入图片可能引起颈椎病
    • V0.3-V1.4 2025/07/03 修复部分BUG 质量更新 处理后雨课堂题库导入 便捷题库自选
    • V2.0 2025/08/30 换源 还未更新录入部分对非含图片题库/B型选择题兼容更新随机答题
    • V2.01 2025/09/01 更新了实时时间和计时器更新了正确率和进度展示更新了可更换背景板雏形
    • V2.01.1 2025/09/02 添加历史答题历史记录
    • V2.01.2 2025/09/03 添加设置-更换背景
    • V2.01.3 2025/09/04 导出版本 完成APK初步完成
    • V2.01.5 2025/09/24 添加后台录入系统
    • 计划中的更新:错题本 收藏夹 双端同步

    我希望能开发一个人人都能便捷使用的题库系统,后面我还会继续分享我软件的更新历程。