Files
webs/power_leasing/README.md
2025-09-26 16:40:38 +08:00

293 lines
8.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Power Leasing - 电商系统
一个基于 Vue 2 + Element UI 的轻量级电商系统,包含商品展示、购物车、结算等完整功能。
## 🚀 功能特性
### 核心功能
- **商品列表页面** - 展示所有商品,支持添加到购物车
- **商品详情页面** - 商品详细信息展示,数量选择
- **购物车页面** - 商品管理、数量修改、删除
- **结算页面** - 订单摘要、收货信息填写、订单提交
### 技术特点
- 轻量级架构,不依赖 Vuex 状态管理
- 使用 localStorage 持久化购物车数据
- 响应式设计,支持移动端
- 完整的无障碍访问支持
- 错误处理和用户反馈
## 🏗️ 项目结构
```
src/
├── components/ # 公共组件
│ ├── header.vue # 顶部导航栏(含面包屑导航)
│ └── content.vue # 内容容器
├── Layout/ # 布局组件
│ └── idnex.vue # 主布局
├── views/ # 页面组件
│ ├── productList/ # 商品列表
│ │ └── index.vue
│ ├── productDetail/ # 商品详情
│ │ └── index.vue
│ ├── cart/ # 购物车
│ │ └── index.vue
│ └── checkout/ # 结算页面
│ └── index.vue
├── utils/ # 工具函数
│ ├── productService.js # 商品数据服务
│ ├── cartManager.js # 购物车管理
│ ├── navigation.js # 导航配置
│ └── routeTest.js # 路由测试工具
├── router/ # 路由配置
│ ├── index.js # 主路由文件
│ └── routes.js # 路由配置文件
├── store/ # 状态管理(轻量使用)
│ └── index.js
├── App.vue # 根组件
└── main.js # 入口文件
```
## 🔧 技术栈
- **前端框架**: Vue 2.6.14
- **UI 组件库**: Element UI 2.15.14
- **路由**: Vue Router 3.5.1
- **状态管理**: Vuex 3.6.2(轻量使用)
- **样式**: SCSS + CSS Grid/Flexbox
- **构建工具**: Vue CLI 5.0
## 🧭 路由配置
### 完整路由列表
| 路径 | 名称 | 描述 | 权限 |
|------|------|------|------|
| `/productList` | 商品列表 | 浏览所有可用商品 | all |
| `/product/:id` | 商品详情 | 查看商品详细信息 | all |
| `/cart` | 购物车 | 管理购物车商品 | all |
| `/checkout` | 订单结算 | 完成订单结算 | all |
### 路由特性
- **嵌套路由**: 所有页面都在 Layout 组件内渲染
- **动态路由**: 商品详情页支持动态 ID 参数
- **路由守卫**: 自动设置页面标题和权限检查
- **错误处理**: 404 页面自动重定向到商品列表
- **面包屑导航**: 自动生成页面导航路径
### 路由文件结构
```
src/router/
├── index.js # 主路由文件,包含路由守卫和错误处理
└── routes.js # 路由配置文件,按功能模块组织
```
## 📱 页面说明
### 1. 商品列表页面 (`/productList`)
- 网格布局展示所有商品
- 商品卡片包含图片、标题、描述、价格
- 支持点击查看详情
- 一键添加到购物车
### 2. 商品详情页面 (`/product/:id`)
- 商品图片和详细信息展示
- **自定义数量选择器**美观的加减按钮设计支持1-99数量范围
- 数量选择器特性:
- 减号按钮(-减少数量最小值为1时自动禁用
- 数量输入框:支持直接输入,实时验证范围
- 加号按钮(+增加数量最大值为99时自动禁用
- 悬停效果和焦点状态
- 响应式设计,移动端适配
- 添加到购物车功能
- 返回商品列表
### 3. 购物车页面 (`/cart`)
- 购物车商品列表
- 数量修改和删除功能
- 实时计算总价和商品数量
- 清空购物车功能
- 跳转到结算页面
### 4. 结算页面 (`/checkout`)
- 订单摘要展示
- 收货信息表单(姓名、电话、地址、备注)
- 表单验证
- 订单提交功能
## 🛠️ 安装和运行
```bash
# 安装依赖
npm install
# 开发环境运行
npm run serve
# 生产环境构建
npm run build
# 代码检查
npm run lint
```
## 🧪 路由测试
项目包含完整的路由测试工具,可以在浏览器控制台中运行:
```javascript
// 导入测试工具
import { runFullTest } from './src/utils/routeTest'
// 运行完整测试
runFullTest()
// 或者单独测试
import { testRoutes, testNavigation } from './src/utils/routeTest'
testRoutes()
testNavigation()
```
## 🔍 问题修复记录
### 页面重复渲染问题
**问题描述**: 页面出现重复渲染,显示两次相同内容
**根本原因**:
1. 路由配置存在冲突 - 两个相同路径的路由
2. Layout 组件嵌套问题 - 多层 router-view 嵌套
3. Vue 版本不匹配 - header.vue 使用了 Vue 3 语法
**解决方案**:
1. 修复路由配置,移除重复路由
2. 简化 Layout 组件结构,避免多层嵌套
3. 将 header.vue 改为 Vue 2 语法
4. 优化组件渲染逻辑
### 路由配置完善
**新增功能**:
1. 完整的路由配置文件 (`routes.js`)
2. 导航配置工具 (`navigation.js`)
3. 路由测试工具 (`routeTest.js`)
4. 面包屑导航支持
5. 路由守卫和错误处理
### 具体修复内容
- `src/router/index.js`: 清理重复路由,添加电商页面路由
- `src/router/routes.js`: 新增路由配置文件
- `src/utils/navigation.js`: 新增导航配置工具
- `src/utils/routeTest.js`: 新增路由测试工具
- `src/components/header.vue`: Vue 3 → Vue 2 语法转换,添加面包屑导航
- `src/components/content.vue`: 简化组件,移除不必要的 router-view
- 新增完整的电商页面组件
## 🎨 设计原则
- **DRY 原则**: 避免代码重复,提取公共组件和工具函数
- **KISS 原则**: 保持代码简单易懂
- **SOLID 原则**: 单一职责,开闭原则
- **YAGNI 原则**: 只实现当前需要的功能
- **无障碍访问**: 支持键盘导航和屏幕阅读器
## 🔢 数量选择器组件
### 组件特性
- **现代化设计**:圆角边框、阴影效果、悬停状态
- **交互反馈**:按钮点击动画、焦点状态高亮
- **数量验证**自动限制范围1-99输入验证
- **无障碍支持**包含aria-label属性支持键盘操作
- **响应式布局**:移动端和桌面端自适应
### 使用方法
```vue
<template>
<div class="quantity-selector">
<button
class="quantity-btn minus-btn"
@click="handleDecreaseQuantity"
:disabled="quantity <= 1"
aria-label="减少数量"
>
<span class="btn-icon"></span>
</button>
<input
type="number"
class="quantity-input"
v-model.number="quantity"
:min="1"
:max="99"
aria-label="数量输入"
/>
<button
class="quantity-btn plus-btn"
@click="handleIncreaseQuantity"
:disabled="quantity >= 99"
aria-label="增加数量"
>
<span class="btn-icon">+</span>
</button>
</div>
</template>
```
### 样式定制
支持以下CSS类名和状态
- `.quantity-selector`:主容器样式
- `.quantity-btn`:按钮基础样式
- `.minus-btn` / `.plus-btn`:减号/加号按钮
- `.quantity-input`:数量输入框
- `.btn-icon`:按钮图标样式
- 悬停状态、焦点状态、禁用状态
## 📱 响应式设计
- 使用 CSS Grid 和 Flexbox 布局
- 移动端优先的响应式设计
- 支持触摸操作和手势
- 适配不同屏幕尺寸
## 🔒 数据安全
- 购物车数据本地存储
- 表单验证和错误处理
- 用户输入过滤和清理
- 安全的订单提交流程
## 🚀 未来优化
- [ ] 用户登录注册系统
- [ ] 订单历史记录
- [ ] 商品搜索和筛选
- [ ] 支付集成
- [ ] 商品评价系统
- [ ] 库存管理
- [ ] 后台管理系统
## 📝 更新日志
### v1.2.0 - 数量选择器组件优化 (2024)
- ✨ 新增自定义数量选择器组件替换Element UI数字输入框
- 🎨 现代化UI设计圆角边框、阴影效果、悬停状态
- 🔧 功能增强支持1-99数量范围实时验证
- ♿ 无障碍优化添加aria-label属性支持键盘操作
- 📱 响应式设计:移动端和桌面端自适应
- 🐛 修复:移除重复代码,优化组件结构
- 📚 文档更新:添加组件使用说明和样式定制指南
## 📄 许可证
MIT License
## 🤝 贡献
欢迎提交 Issue 和 Pull Request
---
**注意**: 这是一个演示项目,商品数据为静态数据,实际使用时需要连接后端 API。