增加了设计,后台功能模块设计
This commit is contained in:
45
.superdesign/README.md
Normal file
45
.superdesign/README.md
Normal file
@@ -0,0 +1,45 @@
|
||||
# 绿邻回收小程序 - 高保真原型 V1.1
|
||||
|
||||
此目录存放了“绿邻回收”项目当前最新的高保真HTML原型。
|
||||
|
||||
**版本**: `1.1`
|
||||
**更新日期**: `2025-08-12`
|
||||
**状态**: `已根据优化方案 V1.1 更新`
|
||||
|
||||
---
|
||||
|
||||
## 原型文件说明
|
||||
|
||||
### 1. C端 (居民端) 原型
|
||||
|
||||
- **文件**: [`c_end_prototype_v1.1.html`](c_end_prototype_v1.1.html)
|
||||
- **主题**: [`c_end_theme_v1.1.css`](c_end_theme_v1.1.css)
|
||||
- **查看方式**: 直接在浏览器中打开 `c_end_prototype_v1.1.html` 文件。
|
||||
- **核心更新**:
|
||||
- 优化了“我的卖品码”交互,改为点击全屏显示。
|
||||
- 增加了小站“营业中”的实时状态显示。
|
||||
- 丰富了交易记录和价格等静态数据,更具真实感。
|
||||
- 修复了CSS路径问题。
|
||||
|
||||
### 2. B端 (小站端) 原型
|
||||
|
||||
- **文件**: [`b_end_prototype_v1.1.html`](b_end_prototype_v1.1.html)
|
||||
- **主题**: [`b_end_theme_v1.1.css`](b_end_theme_v1.1.css)
|
||||
- **查看方式**: 直接在浏览器中打开 `b_end_prototype_v1.1.html` 文件。
|
||||
- **核心更新**:
|
||||
- 强化了库存预警机制,对达到阈值的品类给予醒目的视觉提示。
|
||||
- 增加了品类选择的交互逻辑,点击不同品类会高亮显示,并联动计算最终金额。
|
||||
- 实现了模拟的语音播报功能(需要浏览器支持)。
|
||||
|
||||
### 3. 优化方案文档
|
||||
|
||||
- **文件**: [`prototype_optimization_plan.md`](prototype_optimization_plan.md)
|
||||
- **内容**: 详细记录了本次原型优化的所有评估、分析和决策过程。
|
||||
|
||||
---
|
||||
|
||||
## 后续步骤
|
||||
|
||||
- **团队评审**: 相关干系人对本次更新后的原型进行评审。
|
||||
- **UI交付**: 基于此原型,UI/UX设计师可进行最终的视觉细节敲定和切图交付。
|
||||
- **开发对接**: 前端开发工程师可基于此原型作为参考,开始组件化开发。
|
||||
351
.superdesign/b_end_prototype_v1.1.html
Normal file
351
.superdesign/b_end_prototype_v1.1.html
Normal file
@@ -0,0 +1,351 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
|
||||
<title>B端小站原型</title>
|
||||
|
||||
<!-- Tailwind CSS for utility classes -->
|
||||
<script src="https://cdn.tailwindcss.com"></script>
|
||||
|
||||
<!-- Lucide Icons -->
|
||||
<script src="https://unpkg.com/lucide@latest/dist/umd/lucide.min.js"></script>
|
||||
|
||||
<!-- Link to the B-side theme -->
|
||||
<link rel="stylesheet" href="b_end_theme_v1.1.css">
|
||||
|
||||
<style>
|
||||
/* General Body Styling from C-End for consistency */
|
||||
body {
|
||||
background-color: #f0f2f5;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: flex-start;
|
||||
min-height: 100vh;
|
||||
padding-top: 2rem;
|
||||
padding-bottom: 2rem;
|
||||
font-family: var(--font-sans) !important;
|
||||
}
|
||||
|
||||
/* App container to simulate a phone screen */
|
||||
.app-container {
|
||||
width: 100%;
|
||||
max-width: 420px;
|
||||
height: 850px;
|
||||
background-color: var(--background);
|
||||
border-radius: var(--radius-xl);
|
||||
box-shadow: var(--shadow-2xl);
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
overflow: hidden;
|
||||
border: 8px solid #111;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.status-bar {
|
||||
height: 30px;
|
||||
background-color: #111;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
padding: 0 1rem;
|
||||
color: white;
|
||||
font-size: 0.8rem;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
.status-bar .camera-notch {
|
||||
width: 120px;
|
||||
height: 20px;
|
||||
background: #111;
|
||||
border-radius: 0 0 10px 10px;
|
||||
position: absolute;
|
||||
top: 8px;
|
||||
left: 50%;
|
||||
transform: translateX(-50%);
|
||||
}
|
||||
|
||||
.page {
|
||||
flex-grow: 1;
|
||||
overflow-y: auto;
|
||||
background-color: var(--background);
|
||||
animation: fadeIn 0.4s ease-out;
|
||||
display: none; /* Hidden by default */
|
||||
}
|
||||
.page.active {
|
||||
display: flex; /* Use flex for pages */
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
@keyframes fadeIn {
|
||||
from { opacity: 0; transform: translateY(10px); }
|
||||
to { opacity: 1; transform: translateY(0); }
|
||||
}
|
||||
|
||||
/* General purpose button style */
|
||||
.btn-press {
|
||||
transition: transform 0.1s ease;
|
||||
}
|
||||
.btn-press:active {
|
||||
transform: scale(0.97);
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<div class="app-container">
|
||||
<div class="status-bar">
|
||||
<span>10:00</span>
|
||||
<div class="camera-notch"></div>
|
||||
<div class="flex items-center space-x-1">
|
||||
<i data-lucide="bar-chart-2" class="w-4 h-4"></i>
|
||||
<i data-lucide="wifi" class="w-4 h-4"></i>
|
||||
<span>100%</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Main Content Area -->
|
||||
<main class="flex-grow overflow-hidden flex flex-col">
|
||||
|
||||
<!-- Screen: Workbench (Home) -->
|
||||
<div id="screen-workbench" class="page active p-4 space-y-6">
|
||||
<header class="flex justify-between items-center flex-shrink-0">
|
||||
<div>
|
||||
<h1 class="text-xl font-bold" style="color: var(--foreground);">工作台</h1>
|
||||
<p class="text-sm" style="color: var(--muted-foreground);">老李的社区回收站</p>
|
||||
</div>
|
||||
<button class="btn-press p-2 rounded-md" style="background-color: var(--secondary);"><i data-lucide="more-horizontal" class="w-5 h-5"></i></button>
|
||||
</header>
|
||||
|
||||
<div class="flex-grow flex flex-col justify-center space-y-8">
|
||||
<button onclick="showScreen('screen-scan')" class="btn-press w-full py-8 rounded-lg shadow-lg" style="background-color: var(--primary); color: var(--primary-foreground);">
|
||||
<div class="flex flex-col items-center justify-center">
|
||||
<i data-lucide="scan-line" class="w-12 h-12 mb-2"></i>
|
||||
<span class="text-2xl font-bold">开始回收</span>
|
||||
</div>
|
||||
</button>
|
||||
|
||||
<div class="p-4 rounded-lg" style="background-color: var(--card); border: 1px solid var(--border);">
|
||||
<h2 class="text-lg font-semibold mb-3">今日汇总</h2>
|
||||
<div class="grid grid-cols-3 gap-4 text-center">
|
||||
<div>
|
||||
<p id="summary-orders" class="text-3xl font-bold" style="color: var(--primary);">32</p>
|
||||
<p class="text-sm" style="color: var(--muted-foreground);">总单数</p>
|
||||
</div>
|
||||
<div>
|
||||
<p id="summary-weight" class="text-3xl font-bold" style="color: var(--primary);">150.5</p>
|
||||
<p class="text-sm" style="color: var(--muted-foreground);">总重量 (kg)</p>
|
||||
</div>
|
||||
<div>
|
||||
<p id="summary-amount" class="text-3xl font-bold" style="color: var(--primary);">¥210.00</p>
|
||||
<p class="text-sm" style="color: var(--muted-foreground);">总金额</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<footer class="space-y-3 flex-shrink-0">
|
||||
<button onclick="showScreen('screen-inventory')" class="btn-press w-full flex justify-between items-center p-4 rounded-lg" style="background-color: var(--secondary); color: var(--secondary-foreground);">
|
||||
<div class="flex items-center">
|
||||
<i data-lucide="boxes" class="w-6 h-6 mr-3"></i>
|
||||
<span class="text-lg font-medium">库存盘点</span>
|
||||
</div>
|
||||
<div class="flex items-center">
|
||||
<span class="text-sm font-semibold mr-2" style="color: var(--accent);">纸壳: 85%</span>
|
||||
<i data-lucide="chevron-right" class="w-5 h-5"></i>
|
||||
</div>
|
||||
</button>
|
||||
<button class="btn-press w-full flex justify-between items-center p-4 rounded-lg" style="background-color: var(--secondary); color: var(--secondary-foreground);">
|
||||
<div class="flex items-center">
|
||||
<i data-lucide="truck" class="w-6 h-6 mr-3"></i>
|
||||
<span class="text-lg font-medium">向上游交接</span>
|
||||
</div>
|
||||
<i data-lucide="chevron-right" class="w-5 h-5"></i>
|
||||
</button>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
<!-- Screen: Scan Customer Code -->
|
||||
<div id="screen-scan" class="page p-4 bg-black text-white">
|
||||
<header class="flex items-center flex-shrink-0">
|
||||
<button onclick="showScreen('screen-workbench')" class="btn-press p-2 rounded-full"><i data-lucide="arrow-left" class="w-6 h-6"></i></button>
|
||||
<h1 class="text-xl font-bold mx-auto">扫描识客</h1>
|
||||
<div class="w-8"></div>
|
||||
</header>
|
||||
<div class="flex-grow flex flex-col items-center justify-center space-y-4">
|
||||
<div class="w-64 h-64 border-4 border-dashed border-gray-400 rounded-lg flex items-center justify-center">
|
||||
<i data-lucide="scan" class="w-24 h-24 text-gray-400"></i>
|
||||
</div>
|
||||
<p class="text-lg">请对准用户的卖品码</p>
|
||||
<button onclick="showScreen('screen-details')" class="mt-8 px-6 py-2 bg-gray-700 rounded-md">模拟扫码成功</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Screen: Enter Details -->
|
||||
<div id="screen-details" class="page p-4">
|
||||
<header class="flex items-center mb-4 flex-shrink-0">
|
||||
<button onclick="showScreen('screen-scan')" class="btn-press p-2 rounded-full"><i data-lucide="arrow-left" class="w-6 h-6"></i></button>
|
||||
<h1 class="text-xl font-bold mx-auto">录入信息</h1>
|
||||
<div class="w-8"></div>
|
||||
</header>
|
||||
<main class="flex-grow space-y-6 overflow-y-auto pr-2">
|
||||
<div class="p-4 rounded-lg" style="background-color: var(--secondary);">
|
||||
<span style="color: var(--muted-foreground);">顾客:</span>
|
||||
<span class="text-lg font-bold">王大妈</span>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<h2 class="text-lg font-semibold mb-2">选择品类</h2>
|
||||
<div class="grid grid-cols-3 gap-3">
|
||||
<button class="category-btn btn-press p-4 text-lg font-medium rounded-lg border-2" style="border-color: var(--primary); color: var(--primary); background-color: var(--secondary);" data-price="1.2">纸壳</button>
|
||||
<button class="category-btn btn-press p-4 text-lg font-medium rounded-lg" style="background-color: var(--card); border:1px solid var(--border);" data-price="2.0">塑料瓶</button>
|
||||
<button class="category-btn btn-press p-4 text-lg font-medium rounded-lg" style="background-color: var(--card); border:1px solid var(--border);" data-price="1.1">报纸</button>
|
||||
<button class="category-btn btn-press p-4 text-lg font-medium rounded-lg" style="background-color: var(--card); border:1px solid var(--border);" data-price="0.8">金属</button>
|
||||
<button class="category-btn btn-press p-4 text-lg font-medium rounded-lg" style="background-color: var(--card); border:1px solid var(--border);" data-price="0.2">玻璃</button>
|
||||
<button class="category-btn btn-press p-4 text-lg font-medium rounded-lg" style="background-color: var(--card); border:1px solid var(--border);" data-price="0.1">其他</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<h2 class="text-lg font-semibold mb-2">输入重量 (kg)</h2>
|
||||
<input id="weight-input" type="number" value="12.5" class="w-full text-4xl font-bold p-4 text-center rounded-lg" style="background-color: var(--card); border: 1px solid var(--border); color: var(--foreground);" oninput="calculateAmount()">
|
||||
</div>
|
||||
|
||||
<div class="text-center">
|
||||
<h2 class="text-lg font-semibold mb-2">金额</h2>
|
||||
<p id="amount-display" class="text-5xl font-bold" style="color: var(--primary);">¥15.00</p>
|
||||
</div>
|
||||
</main>
|
||||
<footer class="mt-auto flex-shrink-0 pt-4">
|
||||
<button onclick="confirmTransaction()" class="btn-press w-full py-5 text-xl font-bold rounded-lg shadow-lg" style="background-color: var(--primary); color: var(--primary-foreground);">
|
||||
确认交易
|
||||
</button>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
<!-- Screen: Inventory -->
|
||||
<div id="screen-inventory" class="page p-4">
|
||||
<header class="flex items-center mb-6 flex-shrink-0">
|
||||
<button onclick="showScreen('screen-workbench')" class="btn-press p-2 rounded-full"><i data-lucide="arrow-left" class="w-6 h-6"></i></button>
|
||||
<h1 class="text-xl font-bold mx-auto">库存盘点</h1>
|
||||
<div class="w-8"></div>
|
||||
</header>
|
||||
<main class="space-y-5 overflow-y-auto">
|
||||
<div class="p-4 rounded-lg" style="background-color: var(--card); border: 1px solid var(--border);">
|
||||
<div class="flex justify-between items-center">
|
||||
<h3 class="text-lg font-semibold">纸壳</h3>
|
||||
<div class="flex items-center" style="color: var(--accent);">
|
||||
<i data-lucide="alert-triangle" class="w-5 h-5 mr-1"></i>
|
||||
<span class="font-semibold">库存警告</span>
|
||||
</div>
|
||||
</div>
|
||||
<p class="font-mono text-sm mt-1"><span class="font-bold text-lg" style="color: var(--accent);">255.0</span> / 300 kg</p>
|
||||
<div class="w-full h-4 rounded-full mt-2" style="background-color: var(--muted);">
|
||||
<div class="h-4 rounded-full" style="width: 85%; background-color: var(--accent);"></div>
|
||||
</div>
|
||||
<p class="text-xs mt-2" style="color: var(--accent);">库存已达阈值,请及时联系上游清运。</p>
|
||||
</div>
|
||||
|
||||
<div class="p-4 rounded-lg" style="background-color: var(--card); border: 1px solid var(--border);">
|
||||
<div class="flex justify-between items-baseline mb-1">
|
||||
<h3 class="text-lg font-semibold">塑料瓶</h3>
|
||||
<p class="font-mono text-sm"><span class="font-bold text-lg" style="color: var(--primary);">80.2</span> / 200 kg</p>
|
||||
</div>
|
||||
<div class="w-full h-4 rounded-full" style="background-color: var(--muted);">
|
||||
<div class="h-4 rounded-full" style="width: 40%; background-color: var(--primary);"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="p-4 rounded-lg" style="background-color: var(--card); border: 1px solid var(--border);">
|
||||
<div class="flex justify-between items-baseline mb-1">
|
||||
<h3 class="text-lg font-semibold">报纸</h3>
|
||||
<p class="font-mono text-sm"><span class="font-bold text-lg" style="color: var(--primary);">35.5</span> / 100 kg</p>
|
||||
</div>
|
||||
<div class="w-full h-4 rounded-full" style="background-color: var(--muted);">
|
||||
<div class="h-4 rounded-full" style="width: 35.5%; background-color: var(--primary);"></div>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
</div>
|
||||
|
||||
</main>
|
||||
</div>
|
||||
|
||||
<!-- Success Modal -->
|
||||
<div id="success-modal" class="fixed inset-0 bg-black bg-opacity-50 flex-col items-center justify-center" style="display: none; z-index: 999;">
|
||||
<div class="bg-white p-8 rounded-lg text-center shadow-xl transform scale-90 transition-transform duration-300">
|
||||
<i data-lucide="check-circle" class="w-20 h-20 mx-auto" style="color: var(--primary);"></i>
|
||||
<p id="success-message" class="text-2xl font-bold mt-4" style="color: var(--foreground);"></p>
|
||||
<p class="text-lg" style="color: var(--muted-foreground);">交易成功</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<script>
|
||||
lucide.createIcons();
|
||||
|
||||
function showScreen(screenId) {
|
||||
document.querySelectorAll('.page').forEach(screen => {
|
||||
screen.classList.remove('active');
|
||||
});
|
||||
document.getElementById(screenId).classList.add('active');
|
||||
}
|
||||
|
||||
let currentPricePerKg = 1.2;
|
||||
const categoryButtons = document.querySelectorAll('.category-btn');
|
||||
|
||||
categoryButtons.forEach(button => {
|
||||
button.addEventListener('click', () => {
|
||||
categoryButtons.forEach(btn => {
|
||||
btn.style.borderColor = 'var(--border)';
|
||||
btn.style.color = 'var(--foreground)';
|
||||
btn.style.backgroundColor = 'var(--card)';
|
||||
btn.classList.remove('border-2');
|
||||
btn.classList.add('border');
|
||||
});
|
||||
button.style.borderColor = 'var(--primary)';
|
||||
button.style.color = 'var(--primary)';
|
||||
button.style.backgroundColor = 'var(--secondary)';
|
||||
button.classList.add('border-2');
|
||||
|
||||
currentPricePerKg = parseFloat(button.dataset.price) || 0;
|
||||
calculateAmount();
|
||||
});
|
||||
});
|
||||
|
||||
function calculateAmount() {
|
||||
const weight = parseFloat(document.getElementById('weight-input').value) || 0;
|
||||
const amount = (weight * currentPricePerKg).toFixed(2);
|
||||
document.getElementById('amount-display').innerText = `¥${amount}`;
|
||||
}
|
||||
|
||||
function confirmTransaction() {
|
||||
const amountText = document.getElementById('amount-display').innerText;
|
||||
const amountValue = parseFloat(amountText.replace('¥', ''));
|
||||
|
||||
const modal = document.getElementById('success-modal');
|
||||
const message = document.getElementById('success-message');
|
||||
message.innerText = amountText;
|
||||
modal.style.display = 'flex';
|
||||
setTimeout(() => {
|
||||
modal.querySelector('div').style.transform = 'scale(1)';
|
||||
}, 10);
|
||||
|
||||
const utterance = new SpeechSynthesisUtterance(`收款成功, ${amountValue}元`);
|
||||
utterance.lang = 'zh-CN';
|
||||
speechSynthesis.speak(utterance);
|
||||
|
||||
setTimeout(() => {
|
||||
modal.querySelector('div').style.transform = 'scale(0.9)';
|
||||
setTimeout(() => {
|
||||
modal.style.display = 'none';
|
||||
showScreen('screen-workbench');
|
||||
}, 300);
|
||||
}, 2000);
|
||||
}
|
||||
|
||||
showScreen('screen-workbench');
|
||||
calculateAmount();
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
43
.superdesign/b_end_theme_v1.1.css
Normal file
43
.superdesign/b_end_theme_v1.1.css
Normal file
@@ -0,0 +1,43 @@
|
||||
:root {
|
||||
--background: oklch(0.98 0.01 90);
|
||||
--foreground: oklch(0.2 0.01 90);
|
||||
--card: oklch(1.0000 0 0);
|
||||
--card-foreground: oklch(0.2 0.01 90);
|
||||
--popover: oklch(1.0000 0 0);
|
||||
--popover-foreground: oklch(0.2 0.01 90);
|
||||
--primary: oklch(0.65 0.18 150);
|
||||
--primary-foreground: oklch(1 0 0);
|
||||
--secondary: oklch(0.9 0.03 150);
|
||||
--secondary-foreground: oklch(0.2 0.01 90);
|
||||
--muted: oklch(0.95 0 0);
|
||||
--muted-foreground: oklch(0.5 0 0);
|
||||
--accent: oklch(0.75 0.22 45); /* A more vibrant and friendly orange */
|
||||
--accent-foreground: oklch(0.2 0.01 90);
|
||||
--destructive: oklch(0.58 0.24 28);
|
||||
--destructive-foreground: oklch(1 0 0);
|
||||
--border: oklch(0.92 0.02 90);
|
||||
--input: oklch(0.92 0.02 90);
|
||||
--ring: oklch(0.65 0.18 150);
|
||||
--chart-1: oklch(0.65 0.18 150);
|
||||
--chart-2: oklch(0.75 0.18 55);
|
||||
--chart-3: oklch(0.6 0.2 250);
|
||||
--chart-4: oklch(0.7 0.15 110);
|
||||
--chart-5: oklch(0.5 0.05 90);
|
||||
--sidebar: oklch(0.98 0.01 90);
|
||||
--sidebar-foreground: oklch(0.2 0.01 90);
|
||||
--sidebar-primary: oklch(0.65 0.18 150);
|
||||
--sidebar-primary-foreground: oklch(1 0 0);
|
||||
--sidebar-accent: oklch(0.75 0.18 55);
|
||||
--sidebar-accent-foreground: oklch(0.2 0.01 90);
|
||||
--sidebar-border: oklch(0.92 0.02 90);
|
||||
--sidebar-ring: oklch(0.65 0.18 150);
|
||||
--font-sans: 'Inter', sans-serif;
|
||||
--font-serif: 'Merriweather', serif;
|
||||
--font-mono: 'JetBrains Mono', monospace;
|
||||
--radius: 0.5rem;
|
||||
--shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.05);
|
||||
--shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
|
||||
--shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
|
||||
--shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
|
||||
--spacing: 0.25rem;
|
||||
}
|
||||
@@ -12,7 +12,7 @@
|
||||
<script src="https://unpkg.com/lucide@latest/dist/umd/lucide.min.js"></script>
|
||||
|
||||
<!-- Link to our generated theme -->
|
||||
<link rel="stylesheet" href="design_iterations/recycle_theme_1.css">
|
||||
<link rel="stylesheet" href="recycle_theme_1.css">
|
||||
|
||||
<style>
|
||||
/* General Body Styling */
|
||||
@@ -232,23 +232,29 @@
|
||||
<!-- Home Page -->
|
||||
<div id="home-page" class="page">
|
||||
<div id="qr-code-button" class="card main-action-card">
|
||||
<h3 class="mb-2">我的卖品码</h3>
|
||||
<div class="mx-auto bg-white p-2 rounded-md w-32 h-32 mb-2 flex items-center justify-center">
|
||||
<img src="https://api.qrserver.com/v1/create-qr-code/?size=120x120&data=userID-12345" alt="QR Code">
|
||||
</div>
|
||||
<p class="text-sm opacity-90">点击展示二维码</p>
|
||||
<i data-lucide="qr-code" class="w-20 h-20 mx-auto mb-3"></i>
|
||||
<h3 class="mb-2">点此出示卖品码</h3>
|
||||
<p class="text-sm opacity-90">让站长扫一扫,轻松卖废品</p>
|
||||
</div>
|
||||
|
||||
<h2><i data-lucide="map-pin"></i>附近小站</h2>
|
||||
<div class="card">
|
||||
<div class="flex items-center justify-between">
|
||||
<div>
|
||||
<p class="font-bold text-lg text-gray-800">幸福社区回收站</p>
|
||||
<div class="flex items-center">
|
||||
<p class="font-bold text-lg text-gray-800">幸福社区回收站</p>
|
||||
<span class="ml-3 inline-flex items-center rounded-full bg-green-100 px-3 py-1 text-sm font-medium text-green-700">
|
||||
<svg class="mr-1.5 h-2 w-2 text-green-500" fill="currentColor" viewBox="0 0 8 8">
|
||||
<circle cx="4" cy="4" r="3" />
|
||||
</svg>
|
||||
营业中
|
||||
</span>
|
||||
</div>
|
||||
<p class="text-sm text-gray-500">营业时间: 08:00 - 20:00</p>
|
||||
</div>
|
||||
<div class="text-right">
|
||||
<p class="font-bold text-green-600">500米</p>
|
||||
<a href="#" class="text-sm text-blue-500">去这里 ></a>
|
||||
<p class="font-bold text-green-600">约500米</p>
|
||||
<a href="#" class="text-sm text-blue-500">地图导航 ></a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -258,22 +264,22 @@
|
||||
<div class="price-grid">
|
||||
<div class="price-item">
|
||||
<p class="font-bold">纸壳</p>
|
||||
<p class="price">1.2</p>
|
||||
<p class="price">1.25</p>
|
||||
<p class="unit">元/斤</p>
|
||||
</div>
|
||||
<div class="price-item">
|
||||
<p class="font-bold">塑料瓶</p>
|
||||
<p class="price">2.0</p>
|
||||
<p class="unit">元/斤</p>
|
||||
<p class="price">0.08</p>
|
||||
<p class="unit">元/个</p>
|
||||
</div>
|
||||
<div class="price-item">
|
||||
<p class="font-bold">铁皮</p>
|
||||
<p class="price">0.8</p>
|
||||
<p class="font-bold">旧报纸</p>
|
||||
<p class="price">1.10</p>
|
||||
<p class="unit">元/斤</p>
|
||||
</div>
|
||||
<div class="price-item">
|
||||
<p class="font-bold">旧衣服</p>
|
||||
<p class="price">0.5</p>
|
||||
<p class="price">0.50</p>
|
||||
<p class="unit">元/斤</p>
|
||||
</div>
|
||||
</div>
|
||||
@@ -294,17 +300,24 @@
|
||||
<div class="card divide-y divide-gray-200 p-0">
|
||||
<div class="p-4 flex justify-between items-center">
|
||||
<div>
|
||||
<p class="font-bold text-gray-800">卖纸壳</p>
|
||||
<p class="text-sm text-gray-500">12月21日 14:30</p>
|
||||
<p class="font-bold text-gray-800">卖纸壳 (5.2斤)</p>
|
||||
<p class="text-sm text-gray-500">今天 14:30</p>
|
||||
</div>
|
||||
<p class="font-bold text-green-600 text-xl">+ ¥6.00</p>
|
||||
<p class="font-bold text-green-600 text-xl">+ ¥6.50</p>
|
||||
</div>
|
||||
<div class="p-4 flex justify-between items-center">
|
||||
<div>
|
||||
<p class="font-bold text-gray-800">卖塑料瓶</p>
|
||||
<p class="text-sm text-gray-500">12月20日 10:15</p>
|
||||
<p class="font-bold text-gray-800">卖塑料瓶 (15个)</p>
|
||||
<p class="text-sm text-gray-500">昨天 10:15</p>
|
||||
</div>
|
||||
<p class="font-bold text-green-600 text-xl">+ ¥6.00</p>
|
||||
<p class="font-bold text-green-600 text-xl">+ ¥1.20</p>
|
||||
</div>
|
||||
<div class="p-4 flex justify-between items-center">
|
||||
<div>
|
||||
<p class="font-bold text-gray-800">卖旧报纸 (3.0斤)</p>
|
||||
<p class="text-sm text-gray-500">2025-08-10</p>
|
||||
</div>
|
||||
<p class="font-bold text-green-600 text-xl">+ ¥3.30</p>
|
||||
</div>
|
||||
<div class="p-4 text-center text-blue-500 cursor-pointer hover:bg-gray-50">
|
||||
查看更多
|
||||
@@ -16,7 +16,7 @@
|
||||
--muted-foreground: oklch(0.5000 0 0);
|
||||
|
||||
/* 强调色 - 温暖橙色 */
|
||||
--accent: oklch(0.7200 0.1500 50.0000);
|
||||
--accent: oklch(0.75 0.22 45); /* A more vibrant and friendly orange */
|
||||
--accent-foreground: oklch(1.0000 0 0);
|
||||
|
||||
/* 破坏性操作 - 柔和红色 */
|
||||
96
.superdesign/prototype_optimization_plan.md
Normal file
96
.superdesign/prototype_optimization_plan.md
Normal file
@@ -0,0 +1,96 @@
|
||||
# 绿邻回收小程序 - 原型优化方案 V1.1
|
||||
|
||||
> **文档状态**: 草稿
|
||||
> **版本**: 1.1
|
||||
> **日期**: 2025-08-12
|
||||
> **制定人**: Roo (AI产品经理)
|
||||
|
||||
---
|
||||
|
||||
## 1. 概述
|
||||
|
||||
本方案基于对 `V1.0` 原型(`recycle_c_end_1.html` & `station_prototype_1.html`)的评估,并严格对标PRD(V2.0)和初步设计文档(V1.0)中的核心要求,旨在提升原型质量,使其更精准地反映产品设计,为下一步的UI精修和开发提供清晰指引。
|
||||
|
||||
**核心优化原则**:
|
||||
- **紧扣PRD**: 确保原型与需求文档100%对齐。
|
||||
- **强化“适老化”**: 在现有基础上,进一步突出易用性和直观性。
|
||||
- **提升真实感**: 引入动态数据和状态变化,使原型更具说服力。
|
||||
|
||||
---
|
||||
|
||||
## 2. C端(居民端)原型优化 (`recycle_c_end_1.html`)
|
||||
|
||||
### 2.1. 【P0-最高优先级】“我的卖品码”交互流程调整
|
||||
|
||||
- **当前问题**: 首页直接展示小二维码,点击后放大,不符合“极致简化”原则。
|
||||
- **优化目标**: 遵循PRD,将首页核心区域设计为单一、超大、醒目的功能入口,降低用户决策成本。
|
||||
- **设计建议**:
|
||||
1. 移除首页卡片中的静态二维码图片。
|
||||
2. 将整个卡片区域(`.main-action-card`)作为一个巨大的点击按钮。
|
||||
3. 文案调整为更直接的行动指引,如将 `<h3>` 内容改为“点此出示卖品码”。
|
||||
4. 点击后,全屏模态框(`.qr-modal`)弹出,展示大二维码,效果不变。
|
||||
|
||||
### 2.2. 【P1-高优先级】增加小站“营业状态”
|
||||
|
||||
- **当前问题**: “附近小站”卡片仅显示营业时间,未展示实时状态。
|
||||
- **优化目标**: 让用户能一眼判断小站是否可以立即前往,避免白跑一趟。
|
||||
- **设计建议**:
|
||||
1. 在“幸福社区回收站”名称旁,增加一个状态标签。
|
||||
2. **状态一(营业中)**: 绿色小圆点 + “营业中”文字,字体为绿色。
|
||||
3. **状态二(休息中)**: 灰色小圆点 + “休息中”文字,字体为灰色。
|
||||
4. (可选)在原型中增加一个切换按钮,用于演示两种状态的变化。
|
||||
|
||||
### 2.3. 【P2-中优先级】数据动态化与真实感提升
|
||||
|
||||
- **当前问题**: 所有价格、余额均为写死。
|
||||
- **优化目标**: 模拟真实场景,让数据看起来是“活”的。
|
||||
- **设计建议**:
|
||||
1. **今日回收价**: 将价格设置为更真实、有小数点的数字,例如“纸壳: 1.25 元/斤”,“塑料瓶: 0.08 元/个”。
|
||||
2. **交易记录**:
|
||||
- 增加更多交易条目。
|
||||
- 丰富交易类型,如“卖塑料瓶”、“卖旧报纸”。
|
||||
- 使每笔交易的金额和时间都不同,增强真实性。
|
||||
|
||||
### 2.4. 【技术修正】修复CSS路径
|
||||
|
||||
- **当前问题**: HTML文件中引用的CSS路径为 `design_iterations/recycle_theme_1.css`,在当前文件结构下无法正确加载。
|
||||
- **修复方案**: 将 `<link>` 标签中的 `href` 修改为 `"recycle_theme_1.css"`。
|
||||
|
||||
---
|
||||
|
||||
## 3. B端(小站端)原型优化 (`station_prototype_1.html`)
|
||||
|
||||
### 3.1. 【P1-高优先级】强化库存预警机制
|
||||
|
||||
- **当前问题**: 库存进度条警告不明显,仅靠颜色区分。
|
||||
- **优化目标**: 当库存超过阈值(如80%)时,给予站长强烈的视觉提示,驱动其发起交接。
|
||||
- **设计建议**:
|
||||
1. 在“纸壳”库存项(当前为85%)的进度条旁边,增加一个醒目的**黄色感叹号图标** (`<i data-lucide="alert-triangle"></i>`)。
|
||||
2. 将“纸壳: 85%”的文字颜色改为强调色(`--accent-color`),使其更加突出。
|
||||
3. 在进度条下方增加一行小字提示:“库存已达阈值,请及时联系上游清运”。
|
||||
|
||||
### 3.2. 【P1-高优先级】细化回收品类选择
|
||||
|
||||
- **当前问题**: 品类选择按钮是静态的。
|
||||
- **优化目标**: 模拟真实选择品类的交互过程。
|
||||
- **设计建议**:
|
||||
1. 在JavaScript中增加逻辑:当点击不同的品类按钮时,高亮当前选中的按钮(如改变边框和背景色),并取消其他按钮的高亮。
|
||||
2. 将不同品类的单价预设在代码中,选择品类后,下方的“金额”能根据对应单价和重量自动重新计算。例如,纸壳1.2元/kg,塑料瓶2.0元/kg。
|
||||
|
||||
### 3.3. 【P2-中优先级】交易成功语音播报优化
|
||||
|
||||
- **当前问题**: 语音播报功能已实现,但可以更完善。
|
||||
- **优化目标**: 确保在所有设备和浏览器上都能获得最佳体验。
|
||||
- **设计建议**:
|
||||
1. 在调用 `speechSynthesis.speak()` 前,增加对 `speechSynthesis` API可用性的检查。
|
||||
2. 允许用户在界面上(例如,在设置或一个不显眼的角落)控制语音播报的开关。
|
||||
3. 语音内容可以更丰富,例如“支付宝到账5.8元”改为“绿邻回收,收款成功,5.8元”,强化品牌认知。
|
||||
|
||||
---
|
||||
|
||||
## 4. 下一步计划
|
||||
|
||||
1. **内部评审**: 与项目核心成员(特别是UI/UX设计师)一同评审此优化方案。
|
||||
2. **任务分配**: 根据评审结果,将具体的优化点分配给UI/UX设计师进行视觉细化。
|
||||
3. **原型更新**: 基于UI/UX的设计稿,更新HTML/CSS原型文件。
|
||||
4. **最终评审**: 对更新后的原型进行最终确认,确保所有优化点均已落实。
|
||||
Reference in New Issue
Block a user