第一次作业:清算——前后端分离计算器(832401315)

发布时间:2026/10/3 7:30:14

第一次作业:清算——前后端分离计算器(832401315) 第一次作业清算——前后端分离计算器项目内容本作业所属课程2601_FZU-MU_SE作业要求第一次作业——前后端分离计算器系统作业目标掌握 HTTP API 交互、安全表达式解析、数据库持久化及前后端职责划分姓名孙梓焜福大学号832401315梅努斯学号24125261其他参考资料Python PEP 8、Google JavaScript Style Guide、Python Decimal 和 SQLite 文档Git 仓库与代码规范链接前端仓库frontend。后端仓库backend。前端代码规范codestyle.md。后端代码规范codestyle.md。公开访问地址清算计算器。目录第一次作业清算——前后端分离计算器Git 仓库与代码规范链接PSP 表成品展示1. 主界面2. 加法3. 减法4. 乘法5. 除法6. 小数7. 优先级8. 括号9. 一元负号10. 无效表达式11. 除零12. 刷新持久化13. 指定删除14. 搜索15. 主题16. 后端停止运行截图设计与实现过程需求与技术选择功能结构与架构API 设计数据库设计关键代码说明表达式解析前端请求历史插入与删除测试与部署个人经历与收获本次公网部署说明PSP 表作业要求在开发前估算、开发后记录实际用时。本次未提供个人计时记录因此如实标注未记录AI 辅助生成与验证不等同于个人开发用时。下表不满足完整 PSP 记录要求后续实际投入应另行记录。工作阶段预计用时分钟实际用时分钟需求分析未记录未记录系统设计未记录未记录前端开发未记录未记录后端 API 开发未记录未记录表达式解析模块未记录未记录数据库设计与历史模块未记录未记录前后端联调未记录未记录测试与修复未记录未记录部署未记录未记录博客编写未记录未记录合计未记录未记录成品展示以下图片来自本地项目真实运行。图片对应 Python 本地版的真实运行公开版沿用相同界面与 HTTP 接口。1. 主界面左侧输入和计算右侧展示历史按钮与键盘均可输入。2. 加法输入128后端返回 20并保存计算记录。3. 减法8-3的计算结果为 5。4. 乘法5*8的计算结果为 40也支持输入乘号 ×。5. 除法10/2的计算结果为 5也支持输入除号 ÷。6. 小数使用 Decimal 计算0.10.2得到 0.3。7. 优先级12*3先乘后加得到 7。8. 括号(12)*3先计算括号得到 9。9. 一元负号3*-2识别负数得到 -6一元正号也受支持。10. 无效表达式1缺少操作数后端返回错误页面展示错误信息而不产生新记录。11. 除零1/0返回“除数不能为零”不会入库。12. 刷新持久化刷新页面后输入和结果清空数据库历史仍然显示。13. 指定删除删除128的演示记录后重新查询数据库其他记录保留。14. 搜索输入0.1搜索后端返回匹配记录。另有每页 10 条的分页功能。15. 主题主题按钮可切换浅色和深色。主题当前不跨刷新保存。16. 后端停止停止后端并输入99后页面仍可输入但无法独立获得结果显示连接失败。运行截图以下真实运行截图展示表达式输入、后端计算结果、错误提示、数据库历史和主题切换。上方列出各功能的输入与预期行为。截图 1计算器功能与历史记录的运行展示。截图 2计算器功能与历史记录的运行展示。截图 3计算器功能与历史记录的运行展示。截图 4计算器功能与历史记录的运行展示。截图 5计算器功能与历史记录的运行展示。截图 6计算器功能与历史记录的运行展示。截图 7计算器功能与历史记录的运行展示。截图 8计算器功能与历史记录的运行展示。截图 9计算器功能与历史记录的运行展示。截图 10计算器功能与历史记录的运行展示。截图 11计算器功能与历史记录的运行展示。截图 12计算器功能与历史记录的运行展示。截图 13计算器功能与历史记录的运行展示。截图 14计算器功能与历史记录的运行展示。截图 15计算器功能与历史记录的运行展示。截图 16计算器功能与历史记录的运行展示。设计与实现过程需求与技术选择项目必须支持四则运算、复合表达式、持久化历史和按 ID 删除。采用原生 HTML/CSS/JavaScript 前端先实现 Python 标准库 HTTP 后端和 SQLite 数据库方便本地运行。公开版为了适配托管环境使用独立的服务端 TypeScript HTTP API、BigInt 有理数解析器和 D1 SQLite 数据库。前端计算始终通过 HTTP 请求后端两个 GitHub 仓库分别保存前端与后端源码后端 deployment/source.zip 包含完整公开部署源码。功能结构与架构清算计算器前端交互后端计算服务历史管理按钮与键盘输入结果与错误展示主题与表达式复用输入校验递归下降解析Decimal 运算SQLite 持久化搜索与分页按 ID 删除SQLitePython API浏览器前端SQLitePython API浏览器前端POST /api/calculateexpression校验、解析、计算参数化 INSERT记录 IDJSON 结果与时间GET /api/historySELECT历史记录JSON 列表前端没有数学求值函数。发送的请求只包含 expression结果由后端产生并写入数据库。接口失败时前端清空结果区并展示错误避免把上一条结果当成当前结果。API 设计方法路径请求响应POST/api/calculateexpression 字符串201结果、ID、时间GET/api/historypage、q200items、total、page、page_sizeDELETE/api/history/{id}记录 ID200成功404不存在GET/api/health无200服务存活错误统一包含success: false和 message。无效 JSON、表达式、页码使用 400Python 本地版数据库异常使用 500公开版使用 503 表示数据库暂时不可用。一条成功计算返回例如{success:true,id:1,expression:(12)*3,result:9,created_at:2026-10-02T00:00:0000:00}这里的时间仅用于说明响应结构。真实时间见截图和运行数据库。result 使用字符串保留十进制表示。数据库设计字段类型说明idINTEGER PRIMARY KEY AUTOINCREMENT唯一记录 IDexpressionTEXT NOT NULL输入表达式resultTEXT NOT NULL十进制结果字符串created_atTEXT NOT NULLUTC ISO 8601 时间SQLite 文件保存在后端 data 目录。后端重启后连接同一文件即可读取历史。浏览器不通过 LocalStorage 保存计算记录。所有数据库连接通过上下文管理器提交事务并关闭连接。关键代码说明表达式解析解析器采用以下递归下降文法expression : term ((|-) term)* term : factor ((*|/) factor)* factor : (|-) factor | number | ( expression )expression 先调用 term因此乘除优先于加减factor 处理括号和一元正负号因此能够识别3*-2。运算符循环让减法和除法保持左结合。解析后还检查所有 token 是否已消费拒绝缺少运算符或夹带其他文本。ifoperator/andright0:raiseCalculationError(除数不能为零)valuevalue*rightifoperator*elsevalue/right表达式最多 500 字符、递归深度最多 64 层有效位数为 28 位循环小数会舍入。没有 eval、exec 或任意代码执行。当前不支持幂、函数、隐式乘法、科学计数法。前端请求constdataawaitrequest(/api/calculate,{method:POST,headers:{Content-Type:application/json},body:JSON.stringify({expression:input.value}),});document.querySelector(#result).textContentdata.result;request 统一处理 HTTP 状态和后端 success 字段并设置 10 秒超时。按钮在请求期间禁用避免重复提交。用户表达式通过 textContent 展示避免作为 HTML 执行。历史插入与删除database.execute(INSERT INTO history(expression,result,created_at) VALUES(?,?,?),(expression.strip(),result,created_at),)database.execute(DELETE FROM history WHERE id?,(record_id,))参数化 SQL 将数据和 SQL 语句分离。删除操作由后端执行前端随后重新读取历史不仅隐藏页面元素。历史按 ID 倒序每页查询 10 条搜索使用 instr 做表达式子串匹配。测试与部署自动测试包含 7 个测试方法覆盖 11 个有效表达式、12 个无效输入以及 HTTP 校验、数据库重启持久化、指定删除、搜索、分页、CORS 预检、左结合和极端页码/编号。2026 年 10 月 2 日本地执行全部通过。浏览器另验证必做功能并保存上述 16 张截图。本轮复核还修复了 ± 按钮的含义未选中文本时对整个表达式取反再次点击恢复选中文本时对选中片段取反。前端只改变表达式文本结果仍由后端计算。本地运行分别在 backend 目录执行python src/server.py在 frontend 目录执行python -m http.server 5500 --bind 127.0.0.1访问 http://localhost:5500。公开部署已使用 Sites 完成在线访问。前端通过 HTTP JSON API 访问后端历史保存在 D1 SQLite 持久数据库GitHub Pages 前端使用 config.js 中的公开 API 地址后端允许 https://blue-jay-sun.github.io 来源。部署平台确认发布成功。本版本为公共演示历史无登录隔离所有访客共享同一个历史库。正式多用户系统可增加用户认证、独立历史和限流。个人经历与收获本项目使用 AI 辅助实现、检查和本地验证。以下总结来自项目实际设计与发现的问题不将自动执行时间当作个人开发时间。这次作业的关键是职责划分。前端只负责编辑表达式和展示响应后端承担解析、计算和持久化。停止后端时页面仍能输入但不能获得新结果这比仅检查目录是否分开更能说明实际架构。表达式处理采用三层文法加减层调用乘除层乘除层调用处理数字、括号和一元符号的层。由调用顺序保证优先级也能解释为什么 12*3 与 (12)*3 的结果不同。Decimal 改善十进制表示但循环小数仍需按明确精度舍入不能声称支持无限精度。复核中发现 ± 按钮原先只插入减号与用户理解的取反含义不一致后来改为对表达式或选中片段取反。后端还补上极大页码与编号的输入边界并显式关闭数据库连接。由此可见必做样例通过后仍需要检查边界和界面含义。历史是否持久化需要真实重启验证删除也需要回到数据库查询不能只从界面隐藏一行。跨域配置必须使用来源地址localhost 与 127.0.0.1 不同公开部署还需注意 HTTPS。下一步的改进可以是独立用户历史、科学运算和监控。后续需要继续通过运行样例理解接口、解析文法和数据库操作。本次公网部署说明部署采用 Sites无需 PythonAnywhere 账号。界面继续使用独立 HTML/CSS/JavaScript云端适配后端为 HTTP JSON APID1 SQLite 持久保存历史。Python 本地版仍保留。部署适配版使用 BigInt 有理数计算在最终结果处按 28 位有效数字舍入与 Python Decimal 每步舍入存在边界差异。发布状态已确认成功本地适配版的计算、读库、删除和健康检查通过。部署适配源码已放入 deployment/source.zip可下载检查完整路由、依赖、数据库迁移与界面。公开版在最终结果处舍入本地版每步舍入精度边界有所不同。
延伸阅读

更多相关文章

2026/10/3 7:25:14

在线教育机构7×24小时AI客服的落地拆解

在线教育的咨询高峰往往出现在晚间和周末——家长下班后才有时间问课程详情,学员深夜刷题时碰到技术问题需要即时解答。传统客服排班很难覆盖这些时段,而未及时响应直接导致转化率下滑。将AI智能体部署为全天候答疑客服,不是技术炫技&#xf…

2026/10/3 7:25:14

AI不是工具,它是影响力倍增器

《AI不是工具,它是影响力倍增器》——模型可以买,算力可以租,唯独“把它乘在什么上面”,没人能替你决定过去十年,AI比的是谁算得快;未来十年,比的是谁被放大得多。先讲一道算术题。两家公司&…

2026/10/3 10:45:25

Unity手游动态更换App图标:Android与iOS双端实现方案详解

1. 动态图标这件事,到底在解决什么问题做过手游运营的人大概都遇到过这种场景:春节要换喜庆图标,情人节要换粉色图标,跟某个品牌联名要换联名款图标,甚至某些渠道要求首发期间用特定图标。如果每次都要重新打包提审&am…

2026/10/3 10:45:25

AI工程从零到上线:提示词、Agent编排与评测体系全链路实战

上周有个做后端的朋友问我:他追了两个月的AI相关文章,Agent、RAG、提示词工程这些词都眼熟,但真要他从零给业务加一个AI功能,完全不知道从哪里下手。这个问题我太有共鸣了。我刚开始做AI工程时也是这个状态——看了无数教程、跑通…

2026/10/3 10:45:25

MATLAB实现HIO+ER相位恢复算法:从强度图重建目标相位

简介:压缩包提供基于ER(误差降低)与Fienup混合输入输出(HIO)算法的相位恢复MATLAB实现,适合图像处理、光学成像、X射线衍射等方向的研究者与学习者,用于从幅度信息反演缺失的相位。包内共6个文件…

2026/10/3 10:40:25

SpringBoot停车场管理系统:车位预约与计时收费核心实现

想动手做一个“智能停车场管理系统”作为毕业设计,或者单纯想在简历里加一个能讲的 Web 项目,这个选题其实挺经典的。Java SpringBoot 车位预约 计时收费,听起来不算花哨,但真要把逻辑理清、代码写干净、答辩能自圆其说&#x…

2026/10/2 8:16:46

东莞市品牌网站建设报价常见报错与解决

东莞品牌网站建设报价单背后:一份保姆级建站教程避坑实录 网站做好了没人访问,这大概是很多老板最头疼的事。花了大几万做的品牌站,上线后流量惨淡,比路边摊还冷清。别急着骂外包公司,很多“东莞品牌网站建设报价”里藏着不少猫腻,比如用模板站冒充定制…

2026/10/2 18:20:53

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/10/1 10:48:55

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/10/3 0:04:31

国内大学生必备的AI写作辅助软件是哪款?

国内高校学生在论文写作过程中,越来越依赖AI辅助工具提升效率,主流方案以本土化全流程工具为核心,结合通用大模型与专业插件,覆盖选题构思、框架搭建、初稿撰写、查重降重、格式调整等关键环节,本文将深入解析当前主流…

2026/10/3 0:04:31

Codex接入Jev模型完整指南:配置方法、本地部署与踩坑排查

最近不少人在讨论 Codex 搭配 Jev 这套玩法,我一开始没太当回事,直到自己把 Jev 接进 Codex跑了几轮编码任务之后,才明白那些说“直接起飞”的人是怎么想的。Codex 作为工具本身已经够能打了,但模型固定、上下文策略固定&#xff…

2026/10/3 0:04:31

GitHub 热门: NVIDIA/Model-Optimizer

👋 Hi,我擅长 AI 大模型应用落地、意识解码与 AI 开发工具链 。 💡 创业路上,用技术换时间,一起把 AI 变成生产力 🚀 >GitHub 热门: NVIDIA/Model-Optimizer 凌晨两点,你刚把跑通了的 Qwen3.…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑