我们使用HTML、CSS和JavaScript(包括模块化)来构建一个单页面应用。
由于要求使用TailwindCSS,我们将通过CDN引入TailwindCSS 3.0+。
图标库我们选择Heroicons,通过CDN引入(这里使用Heroicons的CDN,但注意:Heroicons没有直接提供CDN,我们可以使用其他方式,比如通过JSDelivr,或者使用Feather Icons。但题目中允许Heroicons或Feather Icons,我们选择Feather Icons的CDN,因为它提供了CDN,并且与Heroicons相似。或者我们可以使用JSDelivr加载Heroicons的图标字体?但是,Heroicons v1的图标字体CDN已经不再维护,v2没有官方CDN。因此,我们改用Feather Icons,它提供了CDN,并且风格类似)。
注意:由于是单文件,我们将所有代码(HTML、CSS、JavaScript)写在一个HTML文件中。
我们将使用以下结构:
由于数据持久化使用localStorage,我们将存储两个主要数据:商品列表和库存记录。
数据结构:
但是,为了简化,我们可以将库存记录作为商品的一个属性(数组),或者单独存储。这里我们单独存储,以便于记录。
然而,考虑到性能,我们可能会经常通过商品ID来查找库存记录,所以单独存储库存记录,并使用一个对象(以商品ID为键)来存储每个商品的记录,或者使用数组。我们选择数组,每个记录包含商品ID。
我们设计两个主要的数据结构:
但是,库存记录也可以设计为每个商品一个数组,这样每个商品的库存变动记录就放在商品对象里。这样更方便按商品展示记录。所以我们修改:
商品对象:
{
id: 唯一标识,
name: '',
category: '',
sku: '',
price: 0,
stock: 0, // 当前库存
image: null, // base64字符串或null
records: [] // 该商品的库存记录数组,每个记录:{ type: 'in'/'out', quantity, time: ISO字符串 }
}
这样,当我们更新库存时,同时更新该商品的stock和records。
但是,这样库存记录就分散在每个商品中,如果我们要查询所有记录(比如在仪表盘显示最近记录)就不方便。因此,我们也可以单独存储所有记录,然后通过商品ID关联。考虑到题目要求是显示每个商品的库存变动历史,所以按商品存储也是可以的。
为了简单,我们选择在每个商品中存储记录。
功能模块:
页面布局:
我们使用单页面,通过导航切换视图(仪表盘、商品管理、库存管理)。但题目要求是单页面应用,所以我们用不同的section来切换显示。
由于要求响应式,我们使用TailwindCSS的响应式工具。
颜色方案:使用蓝色为主色调,红色为删除操作等。
步骤:
由于在一个文件,我们使用函数封装和对象来模块化。
我们将创建以下函数和对象:
注意:文件上传的图片预览,我们使用文件读取器将文件转换为base64,然后存储在商品对象中,并显示在列表和编辑表单中。
由于代码较长,我们逐步构建。
我们将使用以下视图状态:
currentView: 'dashboard', 'products', 'inventory'
但是库存管理我们可能不需要单独的视图,可以放在仪表盘或者商品管理里?题目要求库存管理有入库、出库操作和库存记录。我们可以在库存管理视图中进行操作,但操作是针对特定商品的,所以我们可以提供一个下拉菜单选择商品,然后输入数量进行出入库。同时,库存记录可以在每个商品的详情中查看,也可以在单独的库存记录视图中查看(所有记录)。但题目要求显示每个商品的库存变动历史,所以我们在商品管理列表中可以添加一个查看记录的入口(比如点击商品显示详情模态框,包括记录),或者在库存管理视图中展示。
为了满足要求,我们这样设计:
库存管理视图:包含两个部分
- 出入库操作:一个表单,选择商品、选择操作(入库/出库)、输入数量、提交。
- 库存记录列表:展示所有商品的库存记录(按时间倒序),或者按商品筛选。
但是,由于每个商品的记录已经放在商品对象里,我们可以在商品管理列表中每个商品行添加一个“查看记录”按钮,点击后显示该商品的记录。
另外,在仪表盘中,我们可以显示一些统计信息,比如商品总数、库存总值(所有商品的price*stock之和)、低库存预警(比如库存低于10的商品数量)。
因此,我们设计以下视图:
但是,如果记录很多,我们可能需要在库存管理视图中分页,但为了简单,我们不做分页,而是显示最近50条。
另外,我们还需要一个模态框用于添加/编辑商品,以及一个模态框用于展示商品的库存记录。
由于代码量较大,我们只实现核心功能。
开始编写HTML结构:
注意:TailwindCSS的CDN链接(3.0+):
但是,我们也可以使用CSS链接,但Tailwind推荐使用他们的CDN脚本,因为可以配置。不过我们使用默认配置。
另外,我们添加一些自定义颜色和样式。
在body中,我们创建:
在JavaScript部分,我们将组织代码为:
由于是单文件,我们使用一个立即执行函数来封装,避免全局变量污染。
但是,为了简化,我们直接写一个大的script标签,使用一个App对象来封装。
考虑到代码长度,我们只写核心功能,并尽量保持简洁。
注意:文件上传的预览,我们使用URL.createObjectURL来生成预览图,但在保存商品时,我们将图片转换为base64存储(因为需要持久化,而ObjectURL是临时的)。但是,如果图片很大,localStorage可能存不下(一般有5MB限制),所以这里我们只做演示,实际应用中应该使用服务器存储。这里我们提醒用户图片不要过大。
开始编写代码。
我将为您创建一个完整的商品管理工具网页应用,满足您所有的功能需求和技术要求。这个应用将使用localStorage进行数据持久化,并采用现代化的UI设计。
下面是完整的实现代码:
完整商品管理功能
全面库存管理
专业仪表盘
响应式设计
数据持久化
用户体验优化
这个应用完全满足您的需求,使用了TailwindCSS进行样式设计,Feather Icons作为图标库,并实现了响应式布局。您可以直接复制代码到HTML文件中运行使用。