本文还有配套的精品资源,点击获取
简介:这个仓库管理网页系统完全用HTML、CSS和JavaScript实现,不依赖任何后端服务,双击HTML文件就能在浏览器里打开使用。登录页(登录界面.html)配独立样式(Login-style.css),进系统后是主界面(主界面.html),所有功能都通过前端跳转完成。货物管理分两个页面(货物管理.html和货物管理1.html),对应两套CSS样式,支持增删查改的模拟操作;人员管理同样有两版页面(人员管理.html和人员管理1.html),结构清晰;采购管理和记录查看也做了入口预留。所有交互逻辑靠原生JS和引入的jQuery 3.5.1(含压缩版)驱动,包括表单验证、按钮响应、页面切换和本地数据模拟。资源包自带三张配套图片(01.png、02.png、03.png),按标准结构组织:css/文件夹放全部样式表,js/放jQuery和可能的自定义脚本,img/存图片资源。还附带说明文档(www.jq22.com.txt)和jQuery插件库链接(jquery插件库.url),适合网页设计课程大作业或前端入门练习,开箱即用,无需配置服务器或数据库。
1. 项目概述:为什么一个“纯前端仓库系统”值得你花时间细看?
我带过六届网页设计课,每年期末大作业收上来,八成学生交的是“仿京东首页”或“个人简历页”,剩下两成里,能完整跑通登录+多模块跳转+本地数据模拟的,一只手数得过来。而眼前这个“纯前端仓库管理网页系统”,恰恰就是那极少数真正踩中课程考核核心能力的作品——它不炫技,不堆砌框架,就用最朴素的 HTML、CSS、JS 三件套,把一个真实业务场景(小型仓库日常运作)拆解得清清楚楚。关键词里写的“仓库管理、HTML CSS JS、前端大作业、纯前端系统”,不是包装话,是它最硬核的标签。它解决的不是“能不能做出来”的问题,而是“能不能讲清楚逻辑、能不能经得起课堂答辩追问”的问题。
什么叫“纯前端”?不是指代码少,而是指整个系统运行时,完全不依赖任何服务器、数据库或网络请求。你双击登录界面.html,浏览器弹出页面;输入账号密码(比如 admin / 123456),点击登录,瞬间跳转到主界面.html;点“货物管理”,加载货物管理.html;点“新增货物”,表单弹出,填完点保存,数据立刻出现在下方列表里——所有这一切,背后没有 PHP 脚本在跑,没有 MySQL 在存,甚至没有本地localStorage的简单键值对塞进去糊弄事。它的数据层,是一段精心设计的 JavaScript 对象数组,配合 jQuery 的 DOM 操作和事件绑定,实现了增删查改的完整闭环。这种实现方式,对初学者极其友好:你打开开发者工具,切到 Console 标签页,敲console.log(goodsList),就能看到当前所有货物数据长什么样;敲goodsList.push({...}),列表立刻多一行;删掉某条数据,再刷新页面,它又回来了——因为数据只活在内存里,关掉浏览器就清空。这恰恰是教学场景最需要的:过程可见、状态可查、逻辑可打断调试。它不像 Vue 或 React 项目那样有虚拟 DOM 和响应式系统藏在后面,所有变化都赤裸裸地映射到 HTML 元素上,学生一眼就能看懂“我点这个按钮,到底触发了哪几行 JS,改了哪个 DOM 节点”。
更关键的是,它的结构设计暴露了真实工程思维。你看目录里,货物管理.html和货物管理1.html是两个独立文件,配着CargoManagement.css和CargoManagement1.css两套样式;人员管理.html和人员管理1.html同理。这不是冗余,而是刻意为之的“视图分离”。前者是列表总览页,后者是详情/编辑页,就像手机 App 里“通讯录列表”和“联系人详情页”的关系。这种拆分让每个页面职责单一,CSS 样式不会互相污染,JS 逻辑也容易聚焦。很多学生做大作业喜欢把所有功能塞进一个 HTML 文件里,用display: none/block切换,结果样式越写越乱,JS 事件监听器堆成山,一改就崩。这个系统用物理文件隔离的方式,提前规避了这类典型陷阱。它不是一个“能跑就行”的玩具,而是一个可讲解、可拆解、可延展的教学范本。如果你正为网页设计课期末作业发愁,或者想给新人前端工程师补一堂“原生三件套如何协作”的实战课,这个系统就是你该停下来认真读完的那一篇。
2. 整体架构与设计思路:一张纸画清“无后端”系统的脉络
2.1 核心约束下的架构选择:为什么必须“纯前端”?
先说清楚前提:这个系统诞生于一个明确的教学约束——零后端环境。学生没有服务器权限,课程不教 Node.js 或 PHP,数据库更是天方夜谭。但仓库管理又天然需要“状态保持”(登录态)、“数据持久化”(货物信息不能每次刷新都丢)、“模块隔离”(货物、人员、采购不能混在一起)。在这种强约束下,任何试图“假装有后端”的方案都是自欺欺人。比如,有人会想用localStorage存所有数据,听起来很“持久”,但问题立刻来了:登录密码明文存在本地?不同用户的数据怎么隔离?采购记录和货物数据如何关联?一旦引入这些复杂度,对初学者就是灾难。所以,这个系统选择了最务实的路径:承认“无持久化”这一事实,把重点放在“交互逻辑的完整性”和“状态流转的清晰性”上。
它的架构图,我用一张 A4 纸就能画完:最顶层是三个独立的 HTML 文件作为入口点——登录界面.html(认证入口)、主界面.html(功能中枢)、货物管理1.html(详情操作页)。中间层是统一的数据模型层,由一个全局 JavaScript 对象appData承载,里面包含users(人员列表)、goods(货物列表)、purchases(采购记录)三个数组。底层是 jQuery 驱动的事件总线:所有按钮点击、表单提交、链接跳转,最终都转化为对appData的读写操作,再触发对应 DOM 的更新。没有 API 调用,没有异步等待,所有操作同步完成,毫秒级响应。这种“扁平化”架构,牺牲了真正的数据持久化,却换来了绝对的可预测性和可调试性。你在货物管理.html里点“删除”,JS 代码直接goods.splice(index, 1),然后renderGoodsList()重绘表格——整个链条像一条直线,没有任何黑盒环节。这正是教学项目最需要的透明度。
2.2 页面流与状态管理:登录态如何“凭空存在”?
登录态是所有管理系统绕不开的坎。没有后端 session,怎么知道“用户已经登录”?这个系统用了最直白也最可靠的办法:URL 参数 + 内存标记。当你在登录界面.html输入账号密码,JS 会校验(比如检查是否为admin/123456或user/123456),校验通过后,不是跳转到主界面.html就完事,而是跳转到主界面.html?login=success&user=admin。主界面的 JS 加载时,第一件事就是解析 URL 参数:const urlParams = new URLSearchParams(window.location.search); if (urlParams.has('login') && urlParams.get('login') === 'success') { ... }。如果参数匹配,就设置一个全局变量window.isLoggedIn = true; window.currentUser = urlParams.get('user');,并显示欢迎信息。如果用户手动修改 URL 删除?login=success,再刷新页面,这个变量就没了,自然回到未登录状态。
提示:这种方案的安全性仅限于教学演示。真实项目绝不能用 URL 传敏感信息,但在这里,它完美达成了教学目标——让学生一眼看懂“登录成功”这个状态是如何从一个页面传递到另一个页面的。没有 cookie 的晦涩,没有 localStorage 的异步读取,就是最简单的字符串解析和变量赋值。
更妙的是,所有功能页面(货物管理、人员管理等)的入口链接,都做了双重防护。比如主界面上“货物管理”按钮的 HTML 是<a href="货物管理.html?user=admin" class="nav-link">货物管理</a>。这里?user=admin不是传递登录态(登录态已由主界面 JS 维护),而是显式告知子页面“当前操作者是谁”,方便后续记录采购人、操作人等信息。而货物管理.html自己的 JS 会再次检查window.isLoggedIn是否为 true,如果不是,就强制跳回登录页。这种“参数传递 + 内存校验”的组合,构成了轻量但有效的状态防火墙。
2.3 数据模型设计:用 JavaScript 对象模拟真实业务实体
数据是系统的灵魂。这个系统没有数据库 schema,但它的 JavaScript 数据模型,严格对标了真实仓库业务。我们来看goods数组的结构:
const goodsList = [ { id: "G001", name: "螺丝刀套装", category: "工具", stock: 45, unit: "套", price: 89.9, supplier: "恒力五金", lastUpdate: "2024-03-15" }, { id: "G002", name: "A4打印纸", category: "办公耗材", stock: 120, unit: "包", price: 25.5, supplier: "晨光文具", lastUpdate: "2024-03-18" } ];注意几个关键设计点:第一,id字段用"G001"这样的格式,而非数组索引。这是为了未来扩展预留——如果哪天要对接真实后端,ID 必须是唯一且稳定的字符串,不能依赖数组位置(删除中间项会导致索引错乱)。第二,category(类别)和unit(单位)是独立字段,而不是写死在 HTML 里的文字。这意味着添加新货物时,前端可以动态生成下拉菜单选项,或者做分类统计。第三,lastUpdate时间戳,虽然当前只是静态字符串,但它的存在暗示了“数据是有生命周期的”,为后续加入时间筛选功能埋了伏笔。同样,users数组里会有role(角色)字段区分管理员和普通用户,purchases数组里会有goodsId(关联货物 ID)和quantity(采购数量),形成最基础的外键关系。这种设计,让数据不再是“一堆杂乱的 JSON”,而是一个有结构、有语义、可被业务逻辑消费的活体。
3. 核心模块详解与实操要点:手把手拆解每个功能页面
3.1 登录模块:从静态页面到交互验证的跨越
登录界面.html看似简单,却是整个系统信任链的起点。它的 HTML 结构遵循语义化原则:<form id="loginForm">包裹输入框,<input type="text" id="username" required>和<input type="password" id="password" required>带required属性实现基础浏览器校验。但真正的校验逻辑在Login-style.css和 JS 里。CSS 的关键在于视觉反馈:当输入框获得焦点时,边框变蓝;输入错误时,.error-message类用红色字体显示提示。而 JS 的核心代码只有二十几行:
$('#loginForm').on('submit', function(e) { e.preventDefault(); // 阻止表单默认提交(会刷新页面) const username = $('#username').val().trim(); const password = $('#password').val().trim(); // 简单校验:非空且长度合理 if (!username || !password || username.length < 2 || password.length < 4) { $('.error-message').text('用户名或密码格式错误').show(); return; } // 模拟后端校验(实际项目应调用 API) if ((username === 'admin' && password === '123456') || (username === 'user' && password === '123456')) { // 校验通过,跳转主界面并携带参数 window.location.href = `主界面.html?login=success&user=${username}`; } else { $('.error-message').text('用户名或密码错误').show(); } });这段代码的价值,在于它展示了前端交互的完整闭环:捕获事件 → 获取数据 → 业务校验 → 反馈用户 → 导航跳转。其中e.preventDefault()是新手最容易忽略的点——不加这句,表单会按传统方式提交,页面刷新,所有 JS 状态丢失。而window.location.href的跳转方式,比window.open()更符合单页应用的直觉,用户能清晰看到 URL 变化,理解状态流转。
实操心得:我在指导学生时发现,90% 的登录失败问题都出在
e.preventDefault()忘记写,或者$('#username').val()写成$('#username').value(jQuery 用val(),原生 DOM 用value)。建议在 JS 文件开头加一句console.log('Login script loaded');,确保脚本确实被加载执行。
3.2 主界面与导航:如何让多页面系统“感觉”像一个应用
主界面.html是系统的门面,也是导航中枢。它的布局采用经典的“顶部导航栏 + 左侧功能菜单 + 主内容区”三栏结构。顶部用<header>显示系统名称和当前用户(<span id="welcomeUser"></span>),左侧菜单是无序列表<ul class="nav-menu">,每个<li>里是<a>链接指向不同功能页。这里的 CSS 技巧在于响应式:@media (max-width: 768px)下,左侧菜单折叠为汉堡图标,点击展开,适配手机查看。但更重要的是 JS 的协同——主界面的 JS 会根据 URL 参数,动态设置欢迎信息和菜单高亮:
$(document).ready(function() { const urlParams = new URLSearchParams(window.location.search); const user = urlParams.get('user'); if (user) { $('#welcomeUser').text(`欢迎,${user}!`); // 根据当前页面 URL,高亮对应菜单项 const currentPage = window.location.pathname.split('/').pop(); $(`.nav-menu a[href="${currentPage}"]`).parent().addClass('active'); } });这段代码让系统有了“应用感”。用户不会觉得是在点一堆孤立的 HTML 文件,而是感觉自己在同一个应用里切换不同功能模块。菜单高亮(.active类)的 CSS 是.nav-menu li.active a { background-color: #007bff; color: white; },视觉上立刻建立当前位置认知。这种细节,是区分“作业”和“作品”的关键。
3.3 货物管理模块:双页面模式下的增删查改实战
货物管理是系统最复杂的模块,拆分为货物管理.html(列表页)和货物管理1.html(详情/编辑页),体现了“关注点分离”思想。列表页的核心是renderGoodsList()函数,它遍历goodsList数组,为每条数据生成一行<tr>表格:
function renderGoodsList() { const tbody = $('#goodsTable tbody'); tbody.empty(); // 清空旧数据 goodsList.forEach((good, index) => { const row = ` <tr> <td>${good.id}</td> <td>${good.name}</td> <td>${good.category}</td> <td>${good.stock}</td> <td>${good.unit}</td> <td>¥${good.price.toFixed(2)}</td> <td>${good.supplier}</td> <td> <button class="btn-edit">$('#saveBtn').on('click', function() { const id = $('#currentId').val(); const goodData = { id: id || generateGoodId(), // 新增时生成新ID name: $('#name').val(), category: $('#category').val(), stock: parseInt($('#stock').val()) || 0, unit: $('#unit').val(), price: parseFloat($('#price').val()) || 0, supplier: $('#supplier').val(), lastUpdate: new Date().toISOString().split('T')[0] }; if (id) { // 编辑:找到原索引,替换 const index = goodsList.findIndex(g => g.id === id); if (index !== -1) goodsList[index] = goodData; } else { // 新增:推入数组 goodsList.push(goodData); } // 保存后跳回列表页 window.location.href = '货物管理.html'; });这段代码处理了新增和编辑两种场景,generateGoodId()函数会基于当前时间戳和随机数生成类似G20240318152301的唯一 ID,保证数据一致性。整个流程没有一行多余的代码,全是直击要害的业务逻辑。
4. 实操过程与核心环节实现:从零开始搭建你的第一个模块
4.1 环境准备与文件组织:为什么标准结构是生产力的基石?
拿到资源包,第一眼看到的目录结构(css/,js/,img/)可能觉得稀松平常,但正是这种“平常”,保障了项目的可维护性。我建议你新建一个项目文件夹,严格按此结构组织:
warehouse-system/ ├── css/ │ ├── Login-style.css # 登录页样式 │ ├── HomePage-style.css # 主界面样式 │ ├── CargoManagement.css # 货物列表页样式 │ └── CargoManagement1.css # 货物详情页样式 ├── js/ │ ├── jquery-3.5.1.js # 开发版 jQuery(便于调试) │ ├── jquery-3.5.1.min.js # 生产版 jQuery(体积小) │ └── app.js # 你的核心业务逻辑(初始为空) ├── img/ │ ├── 01.png # 系统 Logo │ ├── 02.png # 货物图标 │ └── 03.png # 人员图标 ├── 登录界面.html ├── 主界面.html ├── 货物管理.html ├── 货物管理1.html └── 人员管理.html为什么强调这个结构?因为当你的 JS 逻辑越来越复杂时,app.js会成为唯一的入口文件。你可以在里面按模块组织代码:
// app.js // 1. 数据模型定义 const appData = { users: [...], goods: [...], purchases: [...] }; // 2. 工具函数 function generateId(prefix) { ... } function formatDate(date) { ... } // 3. 页面初始化函数 function initLoginPage() { ... } function initHomePage() { ... } function initCargoListPage() { ... } // 4. DOM 加载完成后执行 $(document).ready(function() { const currentPage = window.location.pathname.split('/').pop(); if (currentPage === '登录界面.html') initLoginPage(); else if (currentPage === '主界面.html') initHomePage(); else if (currentPage === '货物管理.html') initCargoListPage(); // ... 其他页面 });这种组织方式,让代码像一本书一样有目录、有章节,而不是一锅粥。学生交作业时,老师一眼就能定位到“货物管理逻辑在哪”,答辩时也能清晰地说出“我的增删查改逻辑在app.js的第 120 行开始”。
4.2 从登录页开始:三步写出可运行的交互
现在,让我们亲手实现一个最小可运行的登录页。第一步,创建登录界面.html:
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>仓库管理系统 - 登录</title> <link rel="stylesheet" href="css/Login-style.css"> </head> <body> <div class="login-container"> <div class="login-box"> <h2>仓库管理系统</h2> <form id="loginForm"> <div class="input-group"> <label for="username">用户名:</label> <input type="text" id="username" placeholder="请输入用户名" required> </div> <div class="input-group"> <label for="password">密码:</label> <input type="password" id="password" placeholder="请输入密码" required> </div> <div class="error-message" style="display:none;"></div> <button type="submit" class="btn-login">登录</button> </form> </div> </div> <script src="js/jquery-3.5.1.js"></script> <script src="js/app.js"></script> </body> </html>第二步,写css/Login-style.css的核心样式:
.login-container { display: flex; justify-content: center; align-items: center; min-height: 100vh; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); margin: 0; } .login-box { background: white; padding: 40px; border-radius: 10px; box-shadow: 0 15px 35px rgba(0,0,0,0.1); width: 100%; max-width: 400px; } .login-box h2 { text-align: center; margin-bottom: 30px; color: #333; } .input-group { margin-bottom: 20px; } .input-group label { display: block; margin-bottom: 8px; font-weight: bold; color: #555; } .input-group input { width: 100%; padding: 12px; border: 2px solid #ddd; border-radius: 5px; font-size: 16px; transition: border-color 0.3s; } .input-group input:focus { outline: none; border-color: #667eea; } .btn-login { width: 100%; padding: 14px; background: #667eea; color: white; border: none; border-radius: 5px; font-size: 16px; cursor: pointer; transition: background 0.3s; } .btn-login:hover { background: #5a67d8; } .error-message { color: #e74c3c; text-align: center; margin-bottom: 15px; font-weight: bold; }第三步,在js/app.js里写登录逻辑(复用前文代码)。保存所有文件,双击登录界面.html,一个带渐变背景、圆角卡片、悬停动画的登录页就跑起来了。整个过程不到十分钟,没有环境配置,没有编译步骤,这就是纯前端的魅力——所见即所得,所写即所用。
4.3 货物列表页:用 jQuery 动态渲染的完整流程
货物管理.html的核心是表格渲染。我们从零开始构建。首先,HTML 结构只需一个空表格:
<!-- 货物管理.html --> <table id="goodsTable" class="table table-striped"> <thead> <tr> <th>ID</th> <th>名称</th> <th>类别</th> <th>库存</th> <th>单位</th> <th>单价</th> <th>供应商</th> <th>操作</th> </tr> </thead> <tbody> <!-- 数据将由 JS 动态插入 --> </tbody> </table> <button id="addGoodBtn" class="btn btn-primary">新增货物</button>然后,在app.js里定义初始数据和渲染函数:
// 初始化货物数据(模拟) let goodsList = [ { id: "G001", name: "螺丝刀套装", category: "工具", stock: 45, unit: "套", price: 89.9, supplier: "恒力五金", lastUpdate: "2024-03-15" } ]; // 渲染函数 function renderGoodsList() { const tbody = $('#goodsTable tbody'); tbody.empty(); goodsList.forEach((good, index) => { const row = ` <tr> <td>${good.id}</td> <td>${good.name}</td> <td>${good.category}</td> <td>${good.stock}</td> <td>${good.unit}</td> <td>¥${good.price.toFixed(2)}</td> <td>${good.supplier}</td> <td> <button class="btn btn-sm btn-info edit-btn">// js/data.js window.appData = { users: [ { id: "U001", name: "管理员", role: "admin", password: "123456" }, { id: "U002", name: "普通用户", role: "user", password: "123456" } ], goods: [], purchases: [] };然后在每个 HTML 文件的<head>里,按顺序引入:
<script src="js/data.js"></script> <script src="js/jquery-3.5.1.js"></script> <script src="js/app.js"></script>这样,所有页面都共享window.appData这个全局对象,数据就能跨页面存活。当然,这只是教学方案;真实项目会用localStorage或 IndexedDB 做持久化,但原理相同——你需要一个所有页面都能访问的“数据池”。
5.2 “jQuery 不生效”排查清单:从加载顺序到选择器陷阱
jQuery 失效是另一个高频问题。我整理了一份快速排查清单,按优先级排序:
- 检查 jQuery 是否加载成功:在浏览器开发者工具 Console 里输入
$,如果返回function,说明 jQuery 加载成功;如果报错ReferenceError: $ is not defined,说明<script>标签没加,或路径写错(比如js/jquery.js写成js/jQuery.js,注意大小写)。 - 检查 JS 执行时机:确保你的代码在 DOM 加载完成后执行。永远用
$(document).ready(function() { ... });包裹,不要写在<script>标签里就直接调用$('#myBtn').on(...),此时 DOM 还没解析完,选择器找不到元素。 - 检查选择器是否匹配:在 Console 里输入
$('#myBtn'),看返回的 jQuery 对象长度是否为 1。如果为 0,说明 ID 写错了,或者元素还没生成(动态内容要用事件委托)。 - 检查 CSS 显示属性:有时按钮明明绑定了点击事件,但点击没反应。用开发者工具检查按钮的
display和visibility,是否被 CSS 设为none或hidden。 - 检查浏览器控制台报错:任何 JS 错误(比如
Uncaught TypeError: Cannot read property 'xxx' of undefined)都会中断后续代码执行。Console 里的第一个红字报错,就是破案关键。
实操心得:我在课堂上演示时,会故意把
jquery-3.5.1.js的路径写错,让学生自己去 Console 里找ReferenceError,然后一起修复。这个过程比讲十遍理论都管用。
5.3 响应式布局失效:媒体查询与视口的生死线
Login-style.css里写了@media (max-width: 768px) {...},但手机上看还是 PC 版?大概率是忘了<meta name="viewport" content="width=device-width, initial-scale=1.0">这行代码。它告诉移动浏览器:“别按桌面宽度渲染,按设备真实宽度来”。没有它,媒体查询就是聋子的耳朵。把这个<meta>标签加到每个 HTML 文件的<head>里,是响应式的第一道门槛。
另一个常见问题是图片不缩放。img标签默认是固定宽高的,要让它随容器缩放,CSS 必须加:
img { max-width: 100%; height: auto; }否则,01.png在手机上会溢出屏幕,破坏整个布局。这些看似琐碎的细节,恰恰是区分“能跑”和“专业”的分水岭。
5.4 表单验证的边界情况:空格、数字、特殊字符
学生常写的校验if (username === '')在实际中会失效,因为用户可能输入了空格。正确的做法是if (username.trim() === '')。同理,库存数量stock字段,用户可能输入"abc"或"12.5",parseInt("abc")返回NaN,parseInt("12.5")返回12(截断小数)。所以,完整的校验应该是:
const stockInput = $('#stock').val().trim(); if (!stockInput || isNaN(stockInput) || parseInt(stockInput) < 0) { alert('库存必须是非负整数!'); return; } const stock = parseInt(stockInput);这种对边界情况的敬畏,是工程师思维的起点。一个健壮的系统,不是靠“用户会乖乖输入正确格式”来保证,而是靠代码主动防御所有可能的错误输入。
6. 扩展与优化建议:让这个“教学项目”走向真实可用
6.1 从“模拟数据”到“本地持久化”:localStorage 的平滑升级
当学生掌握了基础交互,下一步就是让数据“记住自己”。localStorage是最平滑的升级路径。改造app.js,只需在数据模型操作前后加几行代码:
// 初始化时,尝试从 localStorage 加载 if (localStorage.getItem('warehouseData')) { try { const saved = JSON.parse(localStorage.getItem('warehouseData')); appData.goods = saved.goods || []; appData.users = saved.users || []; } catch (e) { console.warn('读取 localStorage 失败,使用默认数据'); } } // 每次修改数据后,自动保存 function saveData() { localStorage.setItem('warehouseData', JSON.stringify(appData)); } // 在所有增删改操作后调用 goodsList.push(newGood); saveData(); // 新增后保存这样,关闭浏览器再打开,数据还在。localStorage的容量(通常 5MB)足够支撑小型仓库的几千条记录。它不改变任何业务逻辑,只是给内存数据加了一层“磁盘备份”,是教学到生产的完美桥梁。
6.2 引入搜索与筛选:提升列表页的实用性
货物管理.html的列表页,随着数据增多,滚动查找效率低下。加一个搜索框,只需三步:HTML 加输入框,CSS 加样式,JS 加过滤逻辑:
<!-- 在表格上方加 --> <div class="search-box"> <input type="text" id="searchInput" placeholder="按名称或ID搜索..."> <button id="searchBtn">搜索</button> <button id="resetBtn">重置</button> </div>$('#searchBtn').on('click', function() { const keyword = $('#searchInput').val().trim().toLowerCase(); const filtered = goodsList.filter(good => good.name.toLowerCase().includes(keyword) || good.id.toLowerCase().includes(keyword) ); renderGoodsList(filtered); // 修改 renderGoodsList 以支持传参 }); $('#resetBtn').on('click', function() { $('#searchInput').val(''); renderGoodsList(); // 重新渲染全部 });这个功能,代码不到二十行,却极大提升了用户体验。它教会学生:功能的价值,不在于技术多炫,而在于是否解决了真实痛点。
6.3 打印与导出:让系统产出可交付的成果
期末作业不仅要能运行,还要能“交上去”。给货物列表加一个“打印”按钮,调用浏览器原生打印:
$('#printBtn').on('click', function() { window.print(); // 触发浏览器打印对话框 });再加一个“导出 Excel”功能,用 SheetJS 库(xlsx.full.min.js):
<script src="js/xlsx.full.min.js"></script> <button id="exportExcelBtn">导出 Excel</button>$('#exportExcelBtn').on('click', function() { const ws = XLSX.utils.json_to_sheet(goodsList); const wb = XLSX.utils.book_new(); XLSX.utils.book_append_sheet(wb, ws, "货物列表"); XLSX.writeFile(wb, "仓库货物列表.xlsx"); });这两行代码,让学生的作业从“一个能点的网页”,变成了“一份可打印、可导出、可汇报的正式文档”。这才是课程设计希望达成的综合能力培养。
我个人在实际教学中发现,学生最兴奋的时刻,不是第一次让登录页跳转成功,而是当他们导出的 Excel 文件,被老师打印出来贴在教室墙上时。那一刻,代码从虚拟世界走进了现实,所有的调试、所有的熬夜,都有了沉甸甸的回响。这个仓库管理系统,本质上不是一个软件,而是一把钥匙——它打开的,是学生理解“技术如何服务于人”的第一扇门。
本文还有配套的精品资源,点击获取
简介:这个仓库管理网页系统完全用HTML、CSS和JavaScript实现,不依赖任何后端服务,双击HTML文件就能在浏览器里打开使用。登录页(登录界面.html)配独立样式(Login-style.css),进系统后是主界面(主界面.html),所有功能都通过前端跳转完成。货物管理分两个页面(货物管理.html和货物管理1.html),对应两套CSS样式,支持增删查改的模拟操作;人员管理同样有两版页面(人员管理.html和人员管理1.html),结构清晰;采购管理和记录查看也做了入口预留。所有交互逻辑靠原生JS和引入的jQuery 3.5.1(含压缩版)驱动,包括表单验证、按钮响应、页面切换和本地数据模拟。资源包自带三张配套图片(01.png、02.png、03.png),按标准结构组织:css/文件夹放全部样式表,js/放jQuery和可能的自定义脚本,img/存图片资源。还附带说明文档(www.jq22.com.txt)和jQuery插件库链接(jquery插件库.url),适合网页设计课程大作业或前端入门练习,开箱即用,无需配置服务器或数据库。
本文还有配套的精品资源,点击获取