灵韵 發表於 2025-4-15 09:46:00

结队编程 2352615肖翔匀 2352619许奕宸 2352635李成

<h1 id="四则运算练习系统技术实现详解">四则运算练习系统技术实现详解</h1>
<p>本文将详细介绍我们开发的四则运算练习系统的技术架构、核心功能实现和开发过程中的技术挑战与解决方案。这个系统采用前后端分离架构,为用户提供了一个交互式的数学练习平台,包含多种功能模块和精心设计的用户体验。</p>
<p>由于开发功能较多,我们邀请了第三位同学参与完成了错题本功能的开发<br>
2352615肖翔匀 软件架构设计,后端开发,页面开发<br>
2352619许奕宸 错题本的ui设计,错题本的功能开发<br>
2352635李成    四则运算页面设计,实现运算的功能,测试软件bug并修改</p>
<p>试用网站链接:https://calculator-mgkhyvko3-xiangyunxiaos-projects.vercel.app<br>
需要FQ才可以访问,作者没有国内的域名</p>
<h2 id="系统架构概述">系统架构概述</h2>
<h3 id="前端技术栈">前端技术栈</h3>
<ul>
<li><strong>HTML5/CSS3</strong>:构建响应式用户界面</li>
<li><strong>原生JavaScript</strong>:实现前端交互逻辑</li>
<li><strong>LocalStorage API</strong>:本地数据持久化存储</li>
</ul>
<h3 id="后端技术栈">后端技术栈</h3>
<ul>
<li><strong>Python</strong>:核心业务逻辑实现</li>
<li><strong>Flask</strong>:轻量级Web框架</li>
<li><strong>Flask-CORS</strong>:处理跨域资源共享</li>
</ul>
<h3 id="系统架构图">系统架构图</h3>
<pre><code>+------------------+      +------------------+      +------------------+
|                  |      |                  |      |                  |
|前端用户界面   | &lt;--&gt; |Flask Web服务器| &lt;--&gt; |数学题目生成器   |
|(HTML/JS/CSS)   |      |(server.py)   |      |(math_generator)|
|                  |      |                  |      |                  |
+------------------+      +------------------+      +------------------+
         ^                        ^                         ^
         |                        |                         |
         v                        v                         v
+------------------+      +------------------+      +------------------+
|                  |      |                  |      |                  |
|用户认证系统   |      |错题本管理系统   |      |每日打卡系统    |
|(auth.js)       |      |(wrong_problems)|      |(user.js)      |
|                  |      |                  |      |                  |
+------------------+      +------------------+      +------------------+
</code></pre>
<h2 id="核心模块详解">核心模块详解</h2>
<h3 id="1-数学题目生成器">1. 数学题目生成器</h3>
<p>数学题目生成器(<code>math_generator.py</code>)是系统的核心组件,负责生成四则运算题目。</p>
<h4 id="技术实现">技术实现</h4>
<ul>
<li><strong>随机数生成</strong>:使用Python的<code>random</code>模块生成随机数字和运算符</li>
<li><strong>运算符优先级处理</strong>:实现了乘除优先于加减的运算符优先级逻辑</li>
<li><strong>题目有效性验证</strong>:确保生成的题目答案为整数且在合理范围内</li>
<li><strong>题库预生成</strong>:系统启动时预生成1000道题目,提高响应速度</li>
<li><strong>种子控制</strong>:支持通过种子参数生成固定的题目集,用于套题功能</li>
</ul>
<pre><code class="language-python"># 核心题目生成算法示例
def generate_problem(self):
    while True:
      nums = self.generate_numbers()
      ops =
      
      # 处理运算符优先级
      try:
            mul_div_index = -1
            if '*' in ops or '/' in ops:
                mul_div_index = ops.index('*') if '*' in ops else ops.index('/')
            
            if mul_div_index == 0:
                result = self.operators](nums, nums)
                result = self.operators](result, nums)
            elif mul_div_index == 1:
                result = self.operators](nums, nums)
                result = self.operators](nums, result)
            else:
                result = self.operators](nums, nums)
                result = self.operators](result, nums)
      except:
            continue
      
      if self.is_valid_result(result):
            problem_str = f"{nums} {ops} {nums} {ops} {nums}"
            return problem_str, int(result)
</code></pre>
<p><img src="https://img2024.cnblogs.com/blog/3606942/202504/3606942-20250415094400966-1510587805.png" alt="" loading="lazy"></p>
<h3 id="2-web服务器">2. Web服务器</h3>
<p>系统使用Flask框架(<code>server.py</code>)构建轻量级Web服务器,提供RESTful API接口。</p>
<h4 id="主要api端点">主要API端点</h4>
<table>
<thead>
<tr>
<th>端点</th>
<th>方法</th>
<th>功能描述</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>/generate_problems</code></td>
<td>GET</td>
<td>生成指定数量的题目</td>
</tr>
<tr>
<td><code>/get_random_problem</code></td>
<td>GET</td>
<td>获取随机题目(用于每日打卡)</td>
</tr>
<tr>
<td><code>/get_problem_sets</code></td>
<td>GET</td>
<td>获取套题列表及完成状态</td>
</tr>
<tr>
<td><code>/add_wrong_problem</code></td>
<td>POST</td>
<td>添加错题记录</td>
</tr>
<tr>
<td><code>/get_wrong_problems</code></td>
<td>GET</td>
<td>获取用户错题列表</td>
</tr>
<tr>
<td><code>/mark_set_completed</code></td>
<td>POST</td>
<td>标记套题为已完成</td>
</tr>
</tbody>
</table>
<h3 id="3-用户认证系统">3. 用户认证系统</h3>
<p>用户认证系统(<code>auth.js</code>和<code>user.js</code>)实现了用户注册、登录和会话管理功能。</p>
<h4 id="技术实现-1">技术实现</h4>
<ul>
<li><strong>本地存储</strong>:使用浏览器的LocalStorage API存储用户数据</li>
<li><strong>会话管理</strong>:维护用户登录状态和当前会话信息</li>
<li><strong>数据加密</strong>:实际应用中应加密存储密码(当前为演示版本)</li>
</ul>
<p><img src="https://img2024.cnblogs.com/blog/3606942/202504/3606942-20250415094417242-322045002.png" alt="" loading="lazy"></p>
<pre><code class="language-javascript">// 用户登录逻辑示例
login(username, password) {
    // 检查用户是否存在
    if (!this.users) {
      return { success: false, message: '用户不存在' };
    }

    // 检查密码是否正确
    if (this.users.password !== password) {
      return { success: false, message: '密码错误' };
    }

    // 设置当前用户
    this.currentUser = this.users;
    localStorage.setItem(CURRENT_USER_KEY, JSON.stringify(this.currentUser));
    return { success: true, message: '登录成功', user: this.currentUser };
}
</code></pre>
<h3 id="4-错题本系统">4. 错题本系统</h3>
<p>错题本系统(<code>wrong_problems.js</code>)是一个重要的学习辅助功能,帮助用户记录和复习错误的题目。</p>
<p><img src="https://img2024.cnblogs.com/blog/3606942/202504/3606942-20250415094439310-274580728.png" alt="" loading="lazy"></p>
<h4 id="技术实现-2">技术实现</h4>
<ul>
<li><strong>错题存储</strong>:服务器端存储用户错题记录</li>
<li><strong>状态管理</strong>:跟踪错题的练习状态(未练习、已练习、已掌握)</li>
<li><strong>排序功能</strong>:支持按时间、难度等多种方式排序错题</li>
<li><strong>批量操作</strong>:支持选择多道题目进行批量练习或删除</li>
</ul>
<p><img src="https://img2024.cnblogs.com/blog/3606942/202504/3606942-20250415094450363-816421146.png" alt="" loading="lazy"></p>
<h3 id="5-每日打卡系统">5. 每日打卡系统</h3>
<p>每日打卡系统(<code>user.js</code>中的<code>DailyCheckManager</code>类)实现了用户每日签到和运势功能。</p>
<h4 id="技术实现-3">技术实现</h4>
<ul>
<li><strong>日期处理</strong>:使用JavaScript的Date API处理日期和时间</li>
<li><strong>连续打卡计算</strong>:计算用户连续打卡天数</li>
<li><strong>随机运势生成</strong>:生成随机的运势和宜忌项目</li>
<li><strong>每日挑战题</strong>:每次打卡随机生成一道挑战题</li>
</ul>
<p><img src="https://img2024.cnblogs.com/blog/3606942/202504/3606942-20250415094508448-403326979.png" alt="" loading="lazy"></p>
<pre><code class="language-javascript">// 连续打卡天数计算逻辑
getConsecutiveDays() {
    if (!this.isLoggedIn()) {
      return 0;
    }

    const userId = this.getUserId();
    if (!this.dailyChecks || this.dailyChecks.length === 0) {
      return 0;
    }

    // 获取打卡记录并排序
    const checkDates = [...this.dailyChecks].sort();
    let consecutiveDays = 1;
    let currentDate = new Date(checkDates);

    // 从最近的日期开始,向前检查是否连续
    for (let i = checkDates.length - 2; i &gt;= 0; i--) {
      const prevDate = new Date(checkDates);
      const diffDays = Math.floor((currentDate - prevDate) / (1000 * 60 * 60 * 24));
      
      if (diffDays === 1) {
            consecutiveDays++;
            currentDate = prevDate;
      } else if (diffDays &gt; 1) {
            break;
      }
    }

    return consecutiveDays;
}
</code></pre>
<h2 id="前端界面设计">前端界面设计</h2>
<h3 id="响应式布局">响应式布局</h3>
<p>系统采用响应式设计,适配不同尺寸的设备:</p>
<ul>
<li><strong>Flexbox布局</strong>:灵活的容器布局,自适应不同屏幕尺寸</li>
<li><strong>媒体查询</strong>:针对不同设备尺寸优化显示效果</li>
<li><strong>相对单位</strong>:使用相对单位(如em、%)确保界面比例协调</li>
</ul>
<h3 id="用户交互设计">用户交互设计</h3>
<ul>
<li><strong>即时反馈</strong>:答题后立即显示正确/错误反馈</li>
<li><strong>进度指示</strong>:显示当前进度和完成情况</li>
<li><strong>动画效果</strong>:使用CSS过渡和动画增强用户体验</li>
<li><strong>键盘支持</strong>:支持键盘输入和提交,提高操作效率</li>
</ul>
<h3 id="主题配色">主题配色</h3>
<ul>
<li><strong>主色调</strong>:使用绿色(#4CAF50)作为主色调,传达积极、成长的理念</li>
<li><strong>对比色</strong>:使用红色(#f44336)作为错误提示,形成明确对比</li>
<li><strong>中性色</strong>:使用灰色调(#f5f5f5, #333)作为背景和文字,提供舒适阅读体验</li>
</ul>
<h2 id="数据流与状态管理">数据流与状态管理</h2>
<h3 id="前端状态管理">前端状态管理</h3>
<p>系统使用原生JavaScript管理前端状态,主要包括:</p>
<ol>
<li><strong>用户状态</strong>:登录状态、当前用户信息</li>
<li><strong>练习状态</strong>:当前题目、答题进度、正确率</li>
<li><strong>错题状态</strong>:错题列表、练习状态、难度标记</li>
</ol>
<h3 id="数据持久化">数据持久化</h3>
<ul>
<li><strong>LocalStorage</strong>:存储用户信息、打卡记录和错题状态</li>
<li><strong>服务器存储</strong>:存储题目集、错题记录和完成情况</li>
</ul>
<h3 id="模块间通信">模块间通信</h3>
<ul>
<li><strong>事件监听</strong>:使用事件监听机制实现模块间通信</li>
<li><strong>回调函数</strong>:通过回调函数处理异步操作结果</li>
<li><strong>状态共享</strong>:关键状态(如用户ID)在模块间共享</li>
</ul>
<h2 id="技术挑战与解决方案">技术挑战与解决方案</h2>
<h3 id="1-题目生成质量控制">1. 题目生成质量控制</h3>
<p><strong>挑战</strong>:生成的题目需要保证答案为整数且难度适中。</p>
<p><strong>解决方案</strong>:</p>
<ul>
<li>实现了严格的题目验证逻辑,确保答案为整数且在合理范围内</li>
<li>对除法运算特殊处理,确保能够整除</li>
<li>预生成大量题目并筛选,提高题目质量</li>
</ul>
<h3 id="2-用户数据安全性">2. 用户数据安全性</h3>
<p><strong>挑战</strong>:确保用户数据安全存储和传输。</p>
<p><strong>解决方案</strong>:</p>
<ul>
<li>使用LocalStorage存储用户数据,避免跨站点脚本攻击</li>
<li>实际生产环境中应实现密码加密存储和HTTPS传输</li>
<li>服务器端实现会话管理和权限控制</li>
</ul>
<h3 id="3-离线功能支持">3. 离线功能支持</h3>
<p><strong>挑战</strong>:在网络不稳定情况下保证基本功能可用。</p>
<p><strong>解决方案</strong>:</p>
<ul>
<li>本地题目生成逻辑作为后备方案</li>
<li>本地存储关键数据,减少对服务器依赖</li>
<li>实现错误重试机制,提高系统稳定性</li>
</ul>
<h2 id="性能优化">性能优化</h2>
<h3 id="前端优化">前端优化</h3>
<ul>
<li><strong>资源压缩</strong>:压缩CSS和JavaScript文件减少加载时间</li>
<li><strong>延迟加载</strong>:非关键资源延迟加载,提高首屏渲染速度</li>
<li><strong>事件委托</strong>:使用事件委托减少事件监听器数量</li>
<li><strong>DOM操作优化</strong>:批量DOM操作,减少重排和重绘</li>
</ul>
<h3 id="后端优化">后端优化</h3>
<ul>
<li><strong>题目预生成</strong>:系统启动时预生成题目,减少实时计算</li>
<li><strong>缓存机制</strong>:缓存常用数据,减少重复计算</li>
<li><strong>异步处理</strong>:使用异步处理非阻塞操作,提高并发性能</li>
</ul>
<h2 id="未来扩展计划">未来扩展计划</h2>
<ol>
<li><strong>云同步</strong>:实现用户数据云端同步,支持多设备使用</li>
<li><strong>智能推荐</strong>:基于用户错题和练习情况,智能推荐练习内容</li>
<li><strong>社交功能</strong>:添加排行榜和好友挑战功能,增强社交互动</li>
<li><strong>更多题型</strong>:扩展支持分数、小数、代数等更多数学题型</li>
<li><strong>数据分析</strong>:实现练习数据可视化分析,帮助用户了解学习进度</li>
</ol>
<h2 id="总结">总结</h2>
<p>四则运算练习系统采用前后端分离架构,结合Python和JavaScript技术栈,实现了一个功能完善、用户友好的数学练习平台。系统包含题目生成、用户认证、错题管理和每日打卡等核心功能模块,通过精心的界面设计和交互优化,为用户提供了良好的学习体验。</p>
<p>在开发过程中,我们解决了题目质量控制、用户数据安全和离线功能支持等技术挑战,并通过多种优化手段提高了系统性能。未来,我们计划进一步扩展系统功能,提供更丰富的学习内容和更智能的学习体验。</p><br><br>
来源:https://www.cnblogs.com/I14514/p/18826161
頁: [1]
查看完整版本: 结队编程 2352615肖翔匀 2352619许奕宸 2352635李成