简介:这是一份面向高校人机交互课程学习者的人机交互设计大作业完整资料包,适合正在完成课程项目、需要参考完整设计流程与文档规范的学生,也可作为团队协作类作业的模板参考。压缩包共收录22个文件,约17.62MB,以docx文档为主,辅以pptx演示文稿、md说明、html页面及pdf、xml等格式,覆盖需求分析、原型设计、规范说明与展示汇报等环节。内容围绕企业食堂订餐系统展开,包含需求分析文档、原型文件、演示模板以及代码规范、文件命名规范、git使用指南等协作资料,还附有模型和理论参考文档,便于读者理解从需求梳理到原型落地的完整思路。目前已有4538人学习下载,适合希望借鉴成熟作业结构、快速搭建项目框架并规范团队协作流程的同学参考使用。
1. 人机交互设计大作业:从一份 zip 到一个能跑起来的 Web 交互原型
很多同学拿到「人机交互设计大作业.zip」这个标题时,第一反应是去搜现成的模板,结果下载下来一堆跑不起来的半成品。我带的几届学生里,翻车最多的不是设计思路,而是环境跑不通、交互逻辑写死在静态页面里、答辩时演示卡死。这份大作业的本质,是让你用 Web 技术做一个可交互的原型,把「用户—界面—反馈」这条链路走通,而不是交一份 PPT 或几张效果图。它适合两类人:一是前端基础一般、但需要快速交付一个能演示的交互原型的同学;二是想把 HCI 理论(如尼尔森十大原则、Fitts 定律)落到真实代码里的开发者。下面我按「先立住技术选型,再动手复现,最后讲坑」的顺序,把这份大作业从零到可演示的路径拆开。
2. 技术选型:为什么 Web 是人机交互大作业的最优载体
2.1 交互原型的三条技术路线对比
做交互原型,常见路线有三条:桌面端 Qt/Electron、移动端原生、Web。大作业场景下,Web 的优势非常明显——跨平台、免安装、演示方便、生态成熟。我一般会让学生先看这张对比表再决定:
| 维度 | Web(HTML/CSS/JS) | Electron | 移动原生 |
|---|---|---|---|
| 环境搭建成本 | 低,浏览器即可 | 中,需 Node + 打包 | 高,需 SDK |
| 演示便利性 | 高,发链接即可 | 中,需安装包 | 低,需真机 |
| 交互反馈能力 | 中高,CSS 动画 + JS | 高 | 高 |
| 大作业适配度 | 高 | 中 | 低 |
选 Web 不是因为它最强,而是因为它在「有限时间 + 必须能演示」这个约束下最稳。热搜词里「web前端开发」「web网页设计」「web工程」高频出现,也说明大部分同学的实际技术栈就在这一侧。
2.2 最小可交互原型的目录结构
不要一上来就上 Vue/React,大作业的核心是交互逻辑,不是工程化。我建议先用原生三件套跑通,再按需引入框架。一个能直接交作业的目录结构如下:
hci-project/ ├── index.html # 主界面,承载交互区域 ├── css/ │ └── style.css # 布局与过渡动画 ├── js/ │ ├── main.js # 交互主逻辑,事件绑定 │ └── state.js # 状态管理,避免逻辑散落 └── assets/ └── icons/ # 图标资源,统一尺寸这个结构的好处是:state.js单独抽出来,答辩时你能清楚讲出「用户操作 → 状态变更 → 视图更新」这条链路,而不是一堆散乱的 DOM 操作。参数上,index.html里所有可交互元素必须带>// main.js document.addEventListener('click', (e) => { const target = e.target.closest('[data-action]'); if (!target) return; const action = target.dataset.action; // 根据 action 分发到不同处理函数 const handler = actions[action]; if (typeof handler === 'function') { handler(target, e); } else { console.warn(`未注册的 action: ${action}`); } }); // 所有交互动作注册在这里,新增功能只改这一处 const actions = { 'toggle-menu': (el) => { document.body.classList.toggle('menu-open'); }, 'submit-form': (el) => { const form = el.closest('form'); validateAndSubmit(form); } };
逻辑说明:closest('[data-action]')保证点击子元素也能找到最近的交互宿主;actions对象是唯一注册表,新增交互只需加一个键值对。参数上,>/* style.css */ .btn { transition: transform 0.15s ease, background-color 0.2s ease; } .btn:active { transform: scale(0.96); /* 按下时的物理反馈 */ } .btn[aria-busy="true"] { pointer-events: none; opacity: 0.6; cursor: wait; }
// 提交类操作的通用反馈封装 async function withFeedback(btn, task) { btn.setAttribute('aria-busy', 'true'); try { await task(); } finally { btn.removeAttribute('aria-busy'); } }参数说明:transform: scale(0.96)的 0.96 是经验值,太小看不出,太大显得夸张;aria-busy既服务无障碍,也方便用 CSS 选择器统一控制禁用态。withFeedback用try/finally保证异常时也能恢复按钮状态,这是容错的基本功。
3.2 约束与防错:把非法操作挡在发生之前
HCI 里的「约束」原则,落到代码就是输入校验和状态机。比如一个表单,不要在提交后才报错,而要在输入时就给出约束提示。常见做法是用input事件做实时校验,配合setCustomValidity。
const emailInput = document.querySelector('#email'); emailInput.addEventListener('input', () => { const value = emailInput.value.trim(); if (value && !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value)) { emailInput.setCustomValidity('邮箱格式不正确'); } else { emailInput.setCustomValidity(''); } });逻辑说明:setCustomValidity会触发浏览器原生的校验气泡,不用自己写提示层,省事且一致。参数上,正则只做基本格式约束,不要追求 RFC 完整实现,大作业够用即可。注意input事件在每次击键都触发,如果校验逻辑重,要加防抖,一般 200ms 足够。
3.3 用状态机管理多步骤交互
大作业里经常有多步骤流程,比如「选择 → 确认 → 完成」。用散落的布尔变量管理必然翻车。我一般会引入一个极简状态机:
// state.js const states = { IDLE: 'idle', SELECTED: 'selected', CONFIRMED: 'confirmed' }; let currentState = states.IDLE; function transition(next) { const allowed = { [states.IDLE]: [states.SELECTED], [states.SELECTED]: [states.CONFIRMED, states.IDLE], [states.CONFIRMED]: [states.IDLE] }; if (!allowed[currentState].includes(next)) { console.warn(`非法状态迁移: ${currentState} -> ${next}`); return false; } currentState = next; render(currentState); return true; }参数说明:allowed表定义了合法迁移路径,任何越界迁移都会被拦截并打日志。render是视图更新函数,根据当前状态切换界面。这样做的价值在于:答辩时你能画出状态图,讲清楚每个交互对应的状态迁移,而不是「点这里就变了」这种模糊描述。
4. 避坑与排查:大作业演示翻车的五个真实场景
4.1 现象:本地打开正常,换台电脑样式全乱
原因:用了绝对路径或本地字体文件,换环境后路径失效。解决:所有资源引用改为相对路径,字体用系统字体栈兜底,如font-family: system-ui, -apple-system, sans-serif;。演示前务必在另一台机器上完整走一遍。
4.2 现象:点击按钮偶尔没反应,刷新后又好了
原因:事件绑定在 DOM 渲染之前执行,或动态生成的元素没有绑定。解决:脚本放在</body>前,或用DOMContentLoaded包裹;动态元素一律走事件委托,不要单独绑定。
4.3 现象:动画卡顿,演示时像幻灯片
原因:用了top/left做动画,触发重排。解决:改用transform和opacity,这两个属性走合成层,不触发重排。参数上,动画时长控制在 150–300ms,超过 500ms 用户会觉得慢。
4.4 现象:表单提交后页面刷新,状态全丢
原因:<form>默认提交行为没阻止。解决:在提交处理里e.preventDefault(),然后用fetch或本地状态更新。注意preventDefault要放在处理函数第一行,避免后续逻辑被刷新打断。
4.5 现象:答辩时控制台报错,但界面看起来正常
原因:异步请求失败被catch吞掉,或console.error被忽略。解决:所有catch块至少console.error一次,演示前打开控制台走一遍全流程。我一般会让学生准备一个「演示检查清单」,逐项打勾。
5. 进阶技巧:用 Web 存储做交互状态持久化
大作业如果只做到「刷新就重置」,深度是不够的。一个能加分的技巧是用localStorage或sessionStorage持久化交互状态,让用户刷新后回到上次的位置。这在 HCI 里对应「用户控制与自由」原则。
// 状态持久化封装 const STORAGE_KEY = 'hci-state'; function saveState(state) { try { localStorage.setItem(STORAGE_KEY, JSON.stringify(state)); } catch (e) { console.warn('存储失败,可能是隐私模式', e); } } function loadState() { try { const raw = localStorage.getItem(STORAGE_KEY); return raw ? JSON.parse(raw) : null; } catch (e) { console.warn('读取失败,使用默认状态', e); return null; } } // 在状态迁移后调用 function transition(next) { // ... 迁移逻辑 saveState({ current: currentState, timestamp: Date.now() }); }参数说明:STORAGE_KEY加项目前缀避免和其他页面冲突;try/catch是必须的,隐私模式下localStorage会抛异常。timestamp可以用来做过期判断,比如超过 24 小时的状态自动丢弃。验证方法很简单:操作几步后刷新页面,看是否回到上次状态;再开一个无痕窗口,确认不会串数据。
另一个进阶点是键盘可达性。很多同学只做鼠标交互,答辩时老师用 Tab 键一走就露馅。给所有可交互元素加tabindex="0"和:focus-visible样式,回车键触发点击,这是 HCI 基本功,也是拉开分差的地方。
[data-action]:focus-visible { outline: 2px solid #2563eb; outline-offset: 2px; }最后说个我自己的习惯:每次改完交互逻辑,先不急着看界面,而是打开控制台把状态迁移日志过一遍,确认没有非法迁移和未注册 action。这个习惯帮我省下了至少三次答辩前的通宵排查。希望帮到你。
本文还有配套的精品资源,点击获取