# 刷题宝 **Repository Path**: sunshinewithmoonlight/examFine ## Basic Information - **Project Name**: 刷题宝 - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-04-06 - **Last Updated**: 2025-05-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Vue 3 + Vite ## 部署命令 ``` npm run build && cd dist && wrangler pages deploy .&&cd .. cd backending && wrangler deploy&&cd .. ``` ## 云同步业务逻辑 在点击题目以显示解析时: ``` 如果(云同步服务"已启用"){ 前端先从后端获取KV的题目数据作为A 获取IndexedDB的题目数据作为B 如果(从A和B的题目解析都为空){ 通过AI服务获取题目解析, 将题目解析显示到页面, 存储到IndexedDB,异步上传更新到后端的对应题目数据。 }否则如果(A的题目解析为空){ 将B的题目解析显示到页面,B异步上传到后端。 }否则如果(B的题目解析为空){ 将A的题目解析显示到页面, A存储到IndexedDB }否则{ A存储到IndexedDB覆盖掉B的记录, 将A的题目解析显示到页面, } }否则如果(云同步服务"未启用"){ 获取IndexedDB的题目数据作为B 如果(B的题目解析为空){ 通过AI服务获取题目解析, 将题目解析显示到页面, 存储到IndexedDB, }否则{ 将题目解析显示到页面, } } ``` 注意:实现最开始的"前端先从后端获取KV的题目数据作为A"很重要。 ## Markdown表格支持功能完成情况 ### 功能需求 支持在添加试题时识别并正确处理Markdown表格格式,示例如下: ``` 113. 某人研究 p16 基因异常与否与脑胶质瘤分级的相关性时,得到如下资料: | 级别 | 基因正常 | 基因异常 | 合计 | |------|----------|----------|------| | I~II 级 | 9 | 3 | 12 | | III 级 | 7 | 11 | 18 | | IV 级 | 3 | 8 | 11 | | 合计 | 19 | 22 | 41 | 欲检验两者有无相关,宜选用的方法是 A. Z 检验 B. 秩和检验 C. 卡方检验 D. 直线回归与相关 E. 等级相关 ``` ### 已完成的功能改进 1. **Markdown表格识别与存储** - 修复了表格识别时将表格内容与"题干"标签连接的问题 - 重构了表格解析逻辑,将完整表格内容合并为一个字符串,并标记为"表格"类型 - 解决了CSV输出格式中缺少逗号分隔符的问题 2. **IndexedDB存储格式优化** - 之前存储格式问题(每行都添加"题干"标签): ```json { "detail": [ "题干", "某人研究 p16 基因异常与否与脑胶质瘤分级的相关性时,得到如下资料:题干", "| 级别 | 基因正常 | 基因异常 | 合计 |", "题干", // ... 更多表格行 ... ] } ``` - 修复后的存储格式(表格作为一个整体存储): ```json { "detail": [ "题干", "某人研究 p16 基因异常与否与脑胶质瘤分级的相关性时,得到如下资料:", "表格", "| 级别 | 基因正常 | 基因异常 | 合计 |\n|------|----------|----------|------|\n| I~II 级 | 9 | 3 | 12 |\n| III 级 | 7 | 11 | 18 |\n| IV 级 | 3 | 8 | 11 |\n| 合计 | 19 | 22 | 41 |", "题干", "欲检验两者有无相关,宜选用的方法是", // ... 选项部分 ... ] } ``` 3. **表格显示功能** - 实现了Markdown表格到TDesign表格组件的转换 - 创建了`parseMarkdownTable`函数将Markdown表格转换为TDesign表格组件所需的数据格式 - 修改了`extractQuestionInfo`函数以识别表格类型并进行适当处理 4. **表格显示样式** - 根据需求,设置了默认表格样式为: - 小尺寸(size="small") - 不显示斑马纹(stripe=false) - 不显示边框(bordered=false) - 移除了用户控制选项,保持界面简洁 5. **问题修复** - 解决了表格数据在IndexedDB中被截断的问题 - 修复了CSV格式转换中的错误 ## 测试建议 在测试时,请使用JavaScript而非HTML进行测试,以确保功能正常运行。 # 解决Cloudflare R2同步CORS错误 ## 问题描述 Safari浏览器在尝试同步数据时遇到以下跨域(CORS)错误: ``` [Error] Origin https://examfine.cshine.top is not allowed by Access-Control-Allow-Origin. Status code: 403 [Error] Fetch API cannot load https://c6ed7ec12a85de63275dd57559c95440.r2.cloudflarestorage.com/bucket/?list-type=2&max-keys=1&prefix=config.json due to access control checks. [Error] Failed to load resource: Origin https://examfine.cshine.top is not allowed by Access-Control-Allow-Origin. Status code: 403 (bucket, line 0) ``` ## 原因 您的Cloudflare R2存储桶没有配置正确的CORS(跨源资源共享)策略,导致网站无法从浏览器直接访问存储桶中的资源。 ## 解决方案 您需要在Cloudflare R2控制面板中为存储桶添加CORS策略。以下是步骤: 1. 登录Cloudflare控制面板 2. 进入"R2"部分 3. 找到并选择您的存储桶 4. 点击"设置" 5. 在"CORS Policy"部分,点击"Add CORS policy" 6. 在JSON编辑器中添加以下策略: ```json [ { "AllowedOrigins": ["https://examfine.cshine.top"], "AllowedMethods": ["GET", "HEAD", "PUT", "POST", "DELETE"], "AllowedHeaders": ["*"], "ExposeHeaders": ["ETag", "Content-Length", "Date"], "MaxAgeSeconds": 3600 } ] ``` 7. 点击"保存" ## 策略说明 - **AllowedOrigins**: 允许从哪个域名访问存储桶,这里设置为您的网站域名 - **AllowedMethods**: 允许的HTTP请求方法,包含所有可能需要的方法 - **AllowedHeaders**: 允许所有请求头,使应用程序能够发送任何需要的头部信息 - **ExposeHeaders**: 暴露给前端JavaScript的响应头,添加了常用的一些头部 - **MaxAgeSeconds**: 预检请求的缓存时间,设为1小时 ## 注意事项 - CORS策略更改可能需要几分钟才能生效 - 如果还有问题,可以尝试将AllowedOrigins设为`["*"]`测试是否解决问题,但生产环境应该限制为特定域名 - 确保您的Cloudflare R2访问凭证正确配置在应用程序中 配置完成后,您的Safari浏览器应该能够正常进行同步操作。