```json
{
"summary": "基于橘红/橙为主色调、蓝绿为辅色的移动端押金设置页面,采用uni-app Vue 2 + SCSS构建。四个步骤条引导式操作:选择设备(输入+扫码+查询+设备信息展示)、押金模式选择(picker下拉)、核对确认、订单支付码展示。使用Font Awesome 6.4 SVG图标,卡片布局,橘红渐变主色搭配蓝绿强调色,手机端适配。",
"widget": {
"type": "full-html",
"html": "<template>\n <view class=\"deposit-setting\">\n <!-- ===== 顶部导航 ===== -->\n <view class=\"nav-bar\">\n <view class=\"nav-back\" @click=\"onBack\">\n <image src=\"/static/icons/chevron-left.svg\" mode=\"aspectFit\" class=\"nav-icon\"></image>\n </view>\n <text class=\"nav-title\">押金设置</text>\n <view class=\"nav-placeholder\"></view>\n </view>\n\n <!-- ===== 步骤指示条 ===== -->\n <view class=\"steps-bar\">\n <view\n class=\"step-item\"\n v-for=\"(s, i) in steps\"\n :key=\"i\"\n @click=\"jumpToStep(i)\"\n >\n <view class=\"step-indicator\" :class=\"getStepClass(i)\">\n <image\n v-if=\"isCompleted(i)\"\n src=\"/static/icons/circle-check.svg\"\n mode=\"aspectFit\"\n class=\"step-check\"\n ></image>\n <text v-else class=\"step-num\">{{ i + 1 }}</text>\n </view>\n <view class=\"step-line\" :class=\"getLineClass(i)\" v-if=\"i < steps.length - 1\"></view>\n <text class=\"step-label\" :class=\"getLabelClass(i)\">{{ s }}</text>\n </view>\n </view>\n\n <!-- ===== 步骤内容区域 ===== -->\n <scroll-view class=\"content-scroll\" scroll-y>\n <!-- ====== 步骤1: 选择设备 ====== -->\n <view class=\"card\" v-if=\"currentStep === 0\">\n <view class=\"card-header\">\n <image src=\"/static/icons/mobile-screen-button.svg\" mode=\"aspectFit\" class=\"card-icon\"></image>\n <text class=\"card-title\">步骤1: 选择设备</text>\n </view>\n <view class=\"divider\"></view>\n <view class=\"card-body\">\n <!-- 输入区域 -->\n <view class=\"input-row\">\n <view class=\"input-wrapper\">\n <input\n class=\"custom-input\"\n v-model=\"deviceNumber\"\n placeholder=\"请输入设备号\"\n placeholder-class=\"input-placeholder\"\n :disabled=\"stepLocked[0]\"\n />\n </view>\n <view class=\"btn-group\">\n <view class=\"btn btn-scan\" @click=\"scanDevice\" :class=\"{ disabled: stepLocked[0] }\">\n <image src=\"/static/icons/qrcode.svg\" mode=\"aspectFit\" class=\"btn-icon\"></image>\n <text>扫码</text>\n </view>\n <view class=\"btn btn-query\" @click=\"queryDevice\" :class=\"{ disabled: stepLocked[0] }\">\n <image src=\"/static/icons/magnifying-glass.svg\" mode=\"aspectFit\" class=\"btn-icon\"></image>\n <text>查询</text>\n </view>\n </view>\n </view>\n\n <!-- 设备信息展板 -->\n <view class=\"device-info-panel\" v-if=\"deviceInfo\">\n <view class=\"panel-header\">\n <image src=\"/static/icons/circle-info.svg\" mode=\"aspectFit\" class=\"info-icon\"></image>\n <text class=\"panel-title\">设备信息</text>\n </view>\n <view class=\"info-row\">\n <text class=\"info-label\">终端号码</text>\n <text class=\"info-value\">{{ deviceInfo.terminalNumber }}</text>\n </view>\n <view class=\"info-row\">\n <text class=\"info-label\">终端平台</text>\n <view class=\"info-tag\">\n <text class=\"tag-text\">{{ deviceInfo.platform }}</text>\n </view>\n </view>\n <view class=\"info-row\">\n <text class=\"info-label\">设备名称</text>\n <text class=\"info-value\">{{ deviceInfo.name }}</text>\n </view>\n </view>\n\n <!-- 无数据提示 -->\n <view class=\"empty-hint\" v-if=\"!deviceInfo && deviceNumber\">\n <image src=\"/static/icons/circle-exclamation.svg\" mode=\"aspectFit\" class=\"empty-icon\"></image>\n <text class=\"empty-text\">未查询到设备信息,请检查设备号</text>\n </view>\n </view>\n <view class=\"divider\"></view>\n <view class=\"card-footer\">\n <view class=\"btn-next\" @click=\"goNext(0)\" :class=\"{ disabled: !canStep1Proceed }\">\n <text>下一步</text>\n <image src=\"/static/icons/chevron-right.svg\" mode=\"aspectFit\" class=\"next-icon\"></image>\n </view>\n </view>\n </view>\n\n <!-- ====== 步骤2: 押金模式选择 ====== -->\n <view class=\"card\" v-if=\"currentStep === 1\">\n <view class=\"card-header\">\n <image src=\"/static/icons/coins.svg\" mode=\"aspectFit\" class=\"card-icon\"></image>\n <text class=\"card-title\">步骤2: 押金模式选择</text>\n </view>\n <view class=\"divider\"></view>\n <view class=\"card-body\">\n <view class=\"picker-wrapper\">\n <text class=\"field-label\">押金模式</text>\n <picker\n mode=\"selector\"\n :range=\"depositModes\"\n :value=\"depositModeIndex\"\n @change=\"onDepositModeChange\"\n :disabled=\"stepLocked[1]\"\n >\n <view class=\"picker-trigger\" :class=\"{ 'has-value': depositModeIndex >= 0, disabled: stepLocked[1] }\">\n <text v-if=\"depositModeIndex >= 0\" class=\"picker-text\">{{ depositModes[depositModeIndex] }}</text>\n <text v-else class=\"picker-placeholder\">请选择押金模式</text>\n <image src=\"/static/icons/chevron-down.svg\" mode=\"aspectFit\" class=\"picker-arrow\"></image>\n </view>\n </picker>\n </view>\n\n <!-- 押金模式说明卡片 -->\n <view class=\"mode-detail\" v-if=\"depositModeIndex >= 0\">\n <view class=\"mode-detail-header\">\n <image src=\"/static/icons/circle-info.svg\" mode=\"aspectFit\" class=\"detail-icon\"></image>\n <text class=\"detail-title\">模式说明</text>\n </view>\n <text class=\"detail-desc\">{{ depositModeDesc[depositModeIndex] }}</text>\n <view class=\"detail-amount\">\n <text class=\"amount-label\">押金金额</text>\n <text class=\"amount-value\">{{ depositModeAmount[depositModeIndex] }}</text>\n </view>\n </view>\n </view>\n <view class=\"divider\"></view>\n <view class=\"card-footer\">\n <view class=\"footer-btns\">\n <view class=\"btn-prev\" @click=\"goPrev\">\n <image src=\"/static/icons/chevron-left.svg\" mode=\"aspectFit\" class=\"prev-icon\"></image>\n <text>上一步</text>\n </view>\n <view class=\"btn-next\" @click=\"goNext(1)\" :class=\"{ disabled: !canStep2Proceed }\">\n <text>下一步</text>\n <image src=\"/static/icons/chevron-right.svg\" mode=\"aspectFit\" class=\"next-icon\"></image>\n </view>\n </view>\n </view>\n </view>\n\n <!-- ====== 步骤3: 询问核对 ====== -->\n <view class=\"card\" v-if=\"currentStep === 2\">\n <view class=\"card-header\">\n <image src=\"/static/icons/clipboard-list.svg\" mode=\"aspectFit\" class=\"card-icon\"></image>\n <text class=\"card-title\">步骤3: 核对确认</text>\n </view>\n <view class=\"divider\"></view>\n <view class=\"card-body\">\n <view class=\"confirm-section\">\n <view class=\"confirm-item\">\n <view class=\"confirm-label-row\">\n <image src=\"/static/icons/mobile-screen-button.svg\" mode=\"aspectFit\" class=\"confirm-item-icon\"></image>\n <text class=\"confirm-label\">设备号</text>\n </view>\n <view class=\"confirm-value-box\">\n <text class=\"confirm-value\">{{ deviceNumber || '未输入' }}</text>\n </view>\n </view>\n <view class=\"confirm-divider\"></view>\n <view class=\"confirm-item\">\n <view class=\"confirm-label-row\">\n <image src=\"/static/icons/coins.svg\" mode=\"aspectFit\" class=\"confirm-item-icon\"></image>\n <text class=\"confirm-label\">押金模式</text>\n </view>\n <view class=\"confirm-value-box\">\n <text class=\"confirm-value\" v-if=\"depositModeIndex >= 0\">{{ depositModes[depositModeIndex] }}</text>\n <text class=\"confirm-value muted\" v-else>未选择</text>\n </view>\n </view>\n <view class=\"confirm-divider\"></view>\n <view class=\"confirm-item\" v-if=\"depositModeIndex >= 0\">\n <view class=\"confirm-label-row\">\n <image src=\"/static/icons/sack-dollar.svg\" mode=\"aspectFit\" class=\"confirm-item-icon\"></image>\n <text class=\"confirm-label\">押金金额</text>\n </view>\n <view class=\"confirm-value-box\">\n <text class=\"confirm-value amount\">{{ depositModeAmount[depositModeIndex] }}</text>\n </view>\n </view>\n </view>\n <view class=\"confirm-notice\">\n <image src=\"/static/icons/triangle-exclamation.svg\" mode=\"aspectFit\" class=\"notice-icon\"></image>\n <text class=\"notice-text\">请仔细核对以上信息,确认无误后提交</text>\n </view>\n </view>\n <view class=\"divider\"></view>\n <view class=\"card-footer\">\n <view class=\"footer-btns\">\n <view class=\"btn-prev\" @click=\"goPrev\">\n <image src=\"/static/icons/chevron-left.svg\" mode=\"aspectFit\" class=\"prev-icon\"></image>\n <text>上一步</text>\n </view>\n <view class=\"btn-submit\" @click=\"submitConfirm\">\n <image src=\"/static/icons/check.svg\" mode=\"aspectFit\" class=\"submit-icon\"></image>\n <text>确认提交</text>\n </view>\n </view>\n </view>\n </view>\n\n <!-- ====== 步骤4: 订单支付码 ====== -->\n <view class=\"card\" v-if=\"currentStep === 3\">\n <view class=\"card-header\">\n <image src=\"/static/icons/qrcode.svg\" mode=\"aspectFit\" class=\"card-icon\"></image>\n <text class=\"card-title\">步骤4: 订单支付码</text>\n </view>\n <view class=\"divider\"></view>\n <view class=\"card-body\">\n <view class=\"success-banner\">\n <image src=\"/static/icons/circle-check.svg\" mode=\"aspectFit\" class=\"success-icon\"></image>\n <text class=\"success-text\">押金设置提交成功!</text>\n </view>\n <view class=\"order-info\">\n <view class=\"order-row\">\n <text class=\"order-label\">订单编号</text>\n <text class=\"order-value\">{{ orderCode }}</text>\n </view>\n <view class=\"order-row\">\n <text class=\"order-label\">设备编号</text>\n <text class=\"order-value\">{{ deviceNumber }}</text>\n </view>\n <view class=\"order-row\">\n <text class=\"order-label\">押金模式</text>\n <text class=\"order-value\" v-if=\"depositModeIndex >= 0\">{{ depositModes[depositModeIndex] }}</text>\n </view>\n <view class=\"order-row highlight\">\n <text class=\"order-label\">应付金额</text>\n <text class=\"order-value amt\">{{ depositModeIndex >= 0 ? depositModeAmount[depositModeIndex] : '' }}</text>\n </view>\n </view>\n <view class=\"qr-section\">\n <text class=\"qr-hint\">请使用微信/支付宝扫码支付</text>\n <view class=\"qr-box\">\n <!-- QR码占位图 -->\n <image src=\"/static/icons/qrcode.svg\" mode=\"aspectFit\" class=\"qr-placeholder\"></image>\n <view class=\"qr-overlay\">\n <image src=\"/static/icons/check.svg\" mode=\"aspectFit\" class=\"qr-check\"></image>\n </view>\n </view>\n <text class=\"qr-expire\">支付码有效期:30分钟</text>\n </view>\n </view>\n <view class=\"divider\"></view>\n <view class=\"card-footer\">\n <view class=\"footer-btns\">\n <view class=\"btn-reset\" @click=\"resetAll\">\n <image src=\"/static/icons/arrow-rotate-left.svg\" mode=\"aspectFit\" class=\"reset-icon\"></image>\n <text>重新设置</text>\n </view>\n <view class=\"btn-done\" @click=\"onDone\">\n <text>完成</text>\n <image src=\"/static/icons/check.svg\" mode=\"aspectFit\" class=\"done-icon\"></image>\n </view>\n </view>\n </view>\n </view>\n </scroll-view>\n </view>\n</template>\n\n<script>\nexport default {\n name: 'DepositSetting',\n data() {\n return {\n currentStep: 0,\n steps: ['选择设备', '押金模式', '核对确认', '支付码'],\n stepLocked: [false, false, false, false],\n deviceNumber: '',\n deviceInfo: null,\n depositModeIndex: -1,\n depositModes: [\n '固定押金 - 标准版',\n '按天计费 - 灵活版',\n '信用免押 - 优质版',\n '阶梯押金 - 阶梯版'\n ],\n depositModeDesc: [\n '一次性收取固定押金,退租时全额返还(无损坏情况下)。适合短期租赁场景,简单透明。',\n '按实际使用天数计算押金,每日收取少量押金费用,使用更灵活。适合长期租赁场景。',\n '基于信用评估结果,优质信用用户可免交押金。需要授权信用查询,审核通过后生效。',\n '根据设备价值和租赁周期,押金金额分阶梯递增。设备价值越高、周期越长,押金相应增加。'\n ],\n depositModeAmount: [\n '¥ 500.00',\n '¥ 10.00/天',\n '¥ 0.00(免押金)',\n '¥ 300.00 ~ ¥ 1,000.00'\n ],\n orderCode: '',\n submitted: false\n }\n },\n computed: {\n canStep1Proceed() {\n return !!this.deviceInfo\n },\n canStep2Proceed() {\n return this.depositModeIndex >= 0\n }\n },\n methods: {\n /* ---- 步骤状态 ---- */\n isCompleted(i) {\n return this.stepLocked[i] || (i < this.currentStep)\n },\n getStepClass(i) {\n if (this.isCompleted(i)) return 'step-completed'\n if (i === this.currentStep) return 'step-active'\n return 'step-pending'\n },\n getLineClass(i) {\n if (this.isCompleted(i)) return 'line-completed'\n return 'line-pending'\n },\n getLabelClass(i) {\n if (this.isCompleted(i)) return 'label-completed'\n if (i === this.currentStep) return 'label-active'\n return 'label-pending'\n },\n\n /* ---- 步骤跳转 ---- */\n jumpToStep(i) {\n if (this.stepLocked[i] || i < this.currentStep) {\n this.currentStep = i\n }\n },\n\n /* ---- 步骤1: 扫码 ---- */\n scanDevice() {\n if (this.stepLocked[0]) return\n uni.showToast({ title: '正在打开扫码...', icon: 'none', duration: 1500 })\n // 模拟扫码成功\n setTimeout(() => {\n this.deviceNumber = 'SN' + Math.random().toString(36).substr(2, 8).toUpperCase()\n this.queryDevice()\n }, 800)\n },\n\n /* ---- 步骤1: 查询设备 ---- */\n queryDevice() {\n if (!this.deviceNumber.trim()) {\n uni.showToast({ title: '请输入设备号', icon: 'none' })\n return\n }\n if (this.stepLocked[0]) return\n uni.showLoading({ title: '查询中...' })\n setTimeout(() => {\n uni.hideLoading()\n // 模拟设备信息\n this.deviceInfo = {\n terminalNumber: this.deviceNumber,\n platform: 'Android 12 · 鸿蒙系统',\n name: '智能共享终端 - ' + this.deviceNumber.slice(-4)\n }\n uni.showToast({ title: '查询成功', icon: 'success' })\n }, 1000)\n },\n\n /* ---- 下一步 ---- */\n goNext(stepIdx) {\n if (stepIdx === 0 && !this.canStep1Proceed) {\n uni.showToast({ title: '请先查询设备信息', icon: 'none' })\n return\n }\n if (stepIdx === 1 && !this.canStep2Proceed) {\n uni.showToast({ title: '请选择押金模式', icon: 'none' })\n return\n }\n this.stepLocked[stepIdx] = true\n this.currentStep = stepIdx + 1\n },\n\n /* ---- 上一步 ---- */\n goPrev() {\n if (this.currentStep > 0) {\n // 回退时将当前步骤解锁\n this.stepLocked[this.currentStep] = false\n // 将上一步解锁(如果是步骤2回到步骤1,步骤1可编辑)\n if (this.currentStep === 2) {\n // 回退到步骤2时,步骤2解锁\n }\n this.currentStep--\n // 解锁目标步骤以便编辑\n if (this.currentStep === 1) {\n this.stepLocked[1] = false\n }\n if (this.currentStep === 0) {\n this.stepLocked[0] = false\n this.stepLocked[1] = false\n }\n }\n },\n\n /* ---- 步骤2: 押金模式选择 ---- */\n onDepositModeChange(e) {\n this.depositModeIndex = e.detail.value\n },\n\n /* ---- 步骤3: 提交确认 ---- */\n submitConfirm() {\n uni.showLoading({ title: '提交中...' })\n setTimeout(() => {\n uni.hideLoading()\n this.orderCode = 'DEP' + Date.now().toString().slice(-10)\n this.submitted = true\n this.stepLocked[2] = true\n this.currentStep = 3\n this.stepLocked[3] = false\n uni.showToast({ title: '提交成功', icon: 'success' })\n }, 1500)\n },\n\n /* ---- 重置 ---- */\n resetAll() {\n uni.showModal({\n title: '提示',\n content: '确定要重新设置押金吗?',\n success: (res) => {\n if (res.confirm) {\n this.currentStep = 0\n this.stepLocked = [false, false, false, false]\n this.deviceNumber = ''\n this.deviceInfo = null\n this.depositModeIndex = -1\n this.orderCode = ''\n this.submitted = false\n }\n }\n })\n },\n\n /* ---- 返回 ---- */\n onBack() {\n if (this.currentStep > 0) {\n uni.showModal({\n title: '提示',\n content: '当前设置尚未完成,确定要返回吗?',\n success: (res) => {\n if (res.confirm) uni.navigateBack()\n }\n })\n } else {\n uni.navigateBack()\n }\n },\n\n /* ---- 完成 ---- */\n onDone() {\n uni.showToast({ title: '设置完成', icon: 'success' })\n setTimeout(() => uni.navigateBack(), 1500)\n }\n }\n}\n</script>\n\n<style lang=\"scss\">\n// ====== 变量定义 ======\n$color-primary: #FF5A1F;\n$color-primary-dark: #E04A0E;\n$color-orange: #FF8C42;\n$color-orange-light: #FFB088;\n$color-blue: #2E7DF6;\n$color-blue-light: #6EA8FE;\n$color-blue-dark: #1A5CC7;\n$color-green: #10B981;\n$color-green-light: #34D399;\n$color-green-dark: #059669;\n$color-bg: #F5F6FA;\n$color-card: #FFFFFF;\n$color-text: #1A1A2E;\n$color-text-secondary: #6B7280;\n$color-text-muted: #9CA3AF;\n$color-border: #E5E5E5;\n$color-border-light: #F0F0F0;\n$radius-sm: 8rpx;\n$radius-md: 16rpx;\n$radius-lg: 24rpx;\n$radius-full: 50%;\n$shadow-sm: 0 2rpx 8rpx rgba(0, 0, 0, 0.06);\n$shadow-md: 0 4rpx 20rpx rgba(0, 0, 0, 0.08);\n$shadow-lg: 0 8rpx 32rpx rgba(0, 0, 0, 0.12);\n$shadow-glow-orange: 0 0 20rpx rgba(255, 90, 31, 0.35);\n$shadow-glow-green: 0 0 20rpx rgba(16, 185, 129, 0.35);\n\n// ====== 页面容器 ======\n.deposit-setting {\n display: flex;\n flex-direction: column;\n height: 100vh;\n background: linear-gradient(135deg, $color-bg 0%, #EDEEF3 100%);\n position: relative;\n overflow: hidden;\n\n // ====== 顶部导航 ======\n .nav-bar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 20rpx 30rpx;\n background: linear-gradient(135deg, $color-primary 0%, $color-orange 100%);\n position: relative;\n z-index: 10;\n box-shadow: 0 4rpx 20rpx rgba(255, 90, 31, 0.3);\n\n &::after {\n content: '';\n position: absolute;\n bottom: -20rpx;\n left: 0;\n right: 0;\n height: 40rpx;\n background: linear-gradient(to bottom, rgba(255, 90, 31, 0.15), transparent);\n pointer-events: none;\n }\n\n .nav-back {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 60rpx;\n height: 60rpx;\n border-radius: $radius-full;\n background: rgba(255, 255, 255, 0.2);\n transition: all 0.3s ease;\n\n &:active {\n background: rgba(255, 255, 255, 0.35);\n transform: scale(0.92);\n }\n\n .nav-icon {\n width: 32rpx;\n height: 32rpx;\n }\n }\n\n .nav-title {\n font-size: 34rpx;\n font-weight: 700;\n color: #FFFFFF;\n letter-spacing: 2rpx;\n text-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.15);\n }\n\n .nav-placeholder {\n width: 60rpx;\n }\n }\n\n // ====== 步骤条 ======\n .steps-bar {\n display: flex;\n align-items: flex-start;\n padding: 36rpx 30rpx 20rpx;\n background: $color-card;\n margin: 0 0 20rpx;\n position: relative;\n z-index: 5;\n box-shadow: $shadow-sm;\n\n .step-item {\n display: flex;\n flex-direction: column;\n align-items: center;\n flex: 1;\n position: relative;\n\n .step-indicator {\n width: 60rpx;\n height: 60rpx;\n border-radius: $radius-full;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.4s cubic-bezier(0.34, 1.56, 0.64, 1);\n z-index: 2;\n position: relative;\n\n .step-num {\n font-size: 26rpx;\n font-weight: 700;\n color: #FFFFFF;\n }\n\n .step-check {\n width: 34rpx;\n height: 34rpx;\n }\n\n // 已完成\n &.step-completed {\n background: linear-gradient(135deg, $color-green 0%, $color-green-light 100%);\n box-shadow: $shadow-glow-green;\n transform: scale(1);\n }\n\n // 当前激活\n &.step-active {\n background: linear-gradient(135deg, $color-primary 0%, $color-orange 100%);\n box-shadow: $shadow-glow-orange;\n transform: scale(1.1);\n animation: pulse-active 2s ease-in-out infinite;\n\n @keyframes pulse-active {\n 0%, 100% { box-shadow: $shadow-glow-orange; }\n 50% { box-shadow: 0 0 30rpx rgba(255, 90, 31, 0.5); }\n }\n }\n\n // 待处理\n &.step-pending {\n background: linear-gradient(135deg, #D1D5DB 0%, #E5E7EB 100%);\n box-shadow: none;\n }\n }\n\n // 连接线\n .step-line {\n position: absolute;\n top: 30rpx;\n left: calc(50% + 32rpx);\n width: calc(100% - 64rpx);\n height: 4rpx;\n z-index: 1;\n transition: all 0.5s ease;\n\n &.line-completed {\n background: linear-gradient(90deg, $color-green 0%, $color-green-light 100%);\n }\n\n &.line-pending {\n background: linear-gradient(90deg, #D1D5DB 0%, #E5E7EB 100%);\n }\n }\n\n // 标签文字\n .step-label {\n font-size: 22rpx;\n margin-top: 12rpx;\n font-weight: 500;\n transition: all 0.3s ease;\n\n &.label-completed {\n color: $color-green-dark;\n font-weight: 600;\n }\n\n &.label-active {\n color: $color-primary;\n font-weight: 600;\n }\n\n &.label-pending {\n color: $color-text-muted;\n }\n }\n }\n }\n\n // ====== 滚动内容区 ======\n .content-scroll {\n flex: 1;\n padding: 0 24rpx 30rpx;\n -webkit-overflow-scrolling: touch;\n }\n\n // ====== 卡片通用 ======\n .card {\n background: $color-card;\n border-radius: $radius-lg;\n box-shadow: $shadow-md;\n margin-bottom: 24rpx;\n overflow: hidden;\n animation: fade-slide-up 0.45s cubic-bezier(0.34, 1.56, 0.64, 1) both;\n\n @keyframes fade-slide-up {\n from {\n opacity: 0;\n transform: translateY(40rpx);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n\n .card-header {\n display: flex;\n align-items: center;\n padding: 32rpx 32rpx 0;\n\n .card-icon {\n width: 40rpx;\n height: 40rpx;\n margin-right: 16rpx;\n flex-shrink: 0;\n }\n\n .card-title {\n font-size: 30rpx;\n font-weight: 700;\n color: $color-text;\n letter-spacing: 1rpx;\n }\n }\n\n .divider {\n height: 1rpx;\n background: $color-border;\n margin: 24rpx 32rpx;\n }\n\n .card-body {\n padding: 0 32rpx 12rpx;\n }\n\n .card-footer {\n padding: 20rpx 32rpx 28rpx;\n }\n }\n\n // ====== 步骤1: 输入行 ======\n .input-row {\n display: flex;\n flex-direction: column;\n gap: 20rpx;\n\n .input-wrapper {\n width: 100%;\n\n .custom-input {\n width: 100%;\n height: 88rpx;\n background: #F8F9FB;\n border: 2rpx solid $color-border;\n border-radius: $radius-md;\n padding: 0 28rpx;\n font-size: 28rpx;\n color: $color-text;\n transition: all 0.3s ease;\n box-sizing: border-box;\n\n &:focus {\n border-color: $color-primary;\n box-shadow: 0 0 0 4rpx rgba(255, 90, 31, 0.12);\n background: #FFFFFF;\n }\n }\n\n .input-placeholder {\n color: $color-text-muted;\n font-size: 28rpx;\n }\n }\n\n .btn-group {\n display: flex;\n gap: 20rpx;\n\n .btn {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 12rpx;\n height: 80rpx;\n border-radius: $radius-md;\n font-size: 28rpx;\n font-weight: 600;\n transition: all 0.25s ease;\n\n &:active {\n transform: scale(0.96);\n }\n\n &.disabled {\n opacity: 0.5;\n pointer-events: none;\n }\n\n .btn-icon {\n width: 36rpx;\n height: 36rpx;\n }\n\n &.btn-scan {\n background: $color-card;\n border: 2rpx solid $color-primary;\n color: $color-primary;\n\n &:active {\n background: rgba(255, 90, 31, 0.06);\n }\n }\n\n &.btn-query {\n background: linear-gradient(135deg, $color-blue 0%, $color-blue-light 100%);\n border: none;\n color: #FFFFFF;\n box-shadow: 0 4rpx 12rpx rgba(46, 125, 246, 0.3);\n\n &:active {\n box-shadow: 0 2rpx 6rpx rgba(46, 125, 246, 0.2);\n }\n }\n }\n }\n }\n\n // ====== 设备信息面板 ======\n .device-info-panel {\n margin-top: 28rpx;\n background: linear-gradient(135deg, #F0F9FF 0%, #EFF6FF 100%);\n border: 1rpx solid rgba(46, 125, 246, 0.2);\n border-radius: $radius-md;\n padding: 24rpx;\n animation: fade-slide-up 0.4s ease both;\n\n .panel-header {\n display: flex;\n align-items: center;\n margin-bottom: 20rpx;\n\n .info-icon {\n width: 32rpx;\n height: 32rpx;\n margin-right: 10rpx;\n }\n\n .panel-title {\n font-size: 26rpx;\n font-weight: 600;\n color: $color-blue-dark;\n }\n }\n\n .info-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 14rpx 0;\n border-bottom: 1rpx solid rgba(46, 125, 246, 0.08);\n\n &:last-child {\n border-bottom: none;\n }\n\n .info-label {\n font-size: 26rpx;\n color: $color-text-secondary;\n }\n\n .info-value {\n font-size: 26rpx;\n font-weight: 600;\n color: $color-text;\n }\n\n .info-tag {\n display: flex;\n align-items: center;\n background: linear-gradient(135deg, $color-green 0%, $color-green-light 100%);\n padding: 6rpx 18rpx;\n border-radius: 20rpx;\n\n .tag-text {\n font-size: 22rpx;\n color: #FFFFFF;\n font-weight: 600;\n }\n }\n }\n }\n\n // ====== 空提示 ======\n .empty-hint {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 12rpx;\n margin-top: 28rpx;\n padding: 30rpx 0;\n\n .empty-icon {\n width: 36rpx;\n height: 36rpx;\n }\n\n .empty-text {\n font-size: 26rpx;\n color: #F59E0B;\n }\n }\n\n // ====== 步骤2: 下拉选择 ======\n .picker-wrapper {\n .field-label {\n display: block;\n font-size: 28rpx;\n font-weight: 600;\n color: $color-text;\n margin-bottom: 16rpx;\n }\n\n .picker-trigger {\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n height: 88rpx;\n background: #F8F9FB;\n border: 2rpx solid $color-border;\n border-radius: $radius-md;\n padding: 0 28rpx;\n transition: all 0.3s ease;\n box-sizing: border-box;\n\n &:active {\n border-color: $color-primary;\n background: #FFFFFF;\n }\n\n &.has-value {\n border-color: $color-primary;\n background: #FFFFFF;\n }\n\n &.disabled {\n opacity: 0.6;\n pointer-events: none;\n }\n\n .picker-text {\n font-size: 28rpx;\n color: $color-text;\n font-weight: 500;\n }\n\n .picker-placeholder {\n font-size: 28rpx;\n color: $color-text-muted;\n }\n\n .picker-arrow {\n width: 32rpx;\n height: 32rpx;\n transition: transform 0.3s ease;\n }\n\n // picker 展开时箭头旋转\n &.pickers-active .picker-arrow {\n transform: rotate(180deg);\n }\n }\n }\n\n // ====== 押金模式说明 ======\n .mode-detail {\n margin-top: 28rpx;\n background: linear-gradient(135deg, #FFF7ED 0%, #FFFBEB 100%);\n border: 1rpx solid rgba(255, 90, 31, 0.15);\n border-radius: $radius-md;\n padding: 24rpx;\n animation: fade-slide-up 0.35s ease both;\n\n .mode-detail-header {\n display: flex;\n align-items: center;\n margin-bottom: 16rpx;\n\n .detail-icon {\n width: 30rpx;\n height: 30rpx;\n margin-right: 10rpx;\n }\n\n .detail-title {\n font-size: 26rpx;\n font-weight: 600;\n color: $color-primary-dark;\n }\n }\n\n .detail-desc {\n font-size: 24rpx;\n color: $color-text-secondary;\n line-height: 1.6;\n margin-bottom: 16rpx;\n }\n\n .detail-amount {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16rpx 20rpx;\n background: rgba(255, 255, 255, 0.7);\n border-radius: $radius-sm;\n\n .amount-label {\n font-size: 26rpx;\n color: $color-text-secondary;\n }\n\n .amount-value {\n font-size: 32rpx;\n font-weight: 700;\n color: $color-primary;\n }\n }\n }\n\n // ====== 步骤3: 核对确认 ======\n .confirm-section {\n background: linear-gradient(135deg, #FAFAFA 0%, #F8F9FB 100%);\n border-radius: $radius-md;\n padding: 24rpx;\n\n .confirm-item {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 18rpx 0;\n\n .confirm-label-row {\n display: flex;\n align-items: center;\n gap: 12rpx;\n\n .confirm-item-icon {\n width: 32rpx;\n height: 32rpx;\n }\n\n .confirm-label {\n font-size: 26rpx;\n color: $color-text-secondary;\n font-weight: 500;\n }\n }\n\n .confirm-value-box {\n .confirm-value {\n font-size: 28rpx;\n font-weight: 600;\n color: $color-text;\n\n &.muted {\n color: $color-text-muted;\n font-weight: 400;\n }\n\n &.amount {\n color: $color-primary;\n font-size: 32rpx;\n }\n }\n }\n }\n\n .confirm-divider {\n height: 1rpx;\n background: $color-border;\n margin: 0 0 0 44rpx;\n }\n }\n\n .confirm-notice {\n display: flex;\n align-items: center;\n gap: 12rpx;\n margin-top: 24rpx;\n padding: 20rpx 24rpx;\n background: linear-gradient(135deg, #FEF3C7 0%, #FDE68A 100%);\n border-radius: $radius-sm;\n border-left: 6rpx solid #F59E0B;\n\n .notice-icon {\n width: 32rpx;\n height: 32rpx;\n flex-shrink: 0;\n }\n\n .notice-text {\n font-size: 24rpx;\n color: #92400E;\n line-height: 1.5;\n }\n }\n\n // ====== 步骤4: 成功 & 支付码 ======\n .success-banner {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 16rpx;\n padding: 28rpx 0 8rpx;\n animation: fade-slide-up 0.5s ease both;\n\n .success-icon {\n width: 48rpx;\n height: 48rpx;\n }\n\n .success-text {\n font-size: 32rpx;\n font-weight: 700;\n color: $color-green-dark;\n }\n }\n\n .order-info {\n margin-top: 24rpx;\n background: linear-gradient(135deg, #F0FFF4 0%, #ECFDF5 100%);\n border: 1rpx solid rgba(16, 185, 129, 0.2);\n border-radius: $radius-md;\n padding: 24rpx;\n\n .order-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16rpx 0;\n border-bottom: 1rpx solid rgba(16, 185, 129, 0.1);\n\n &:last-child {\n border-bottom: none;\n }\n\n &.highlight {\n background: rgba(16, 185, 129, 0.08);\n margin: 8rpx -12rpx 0;\n padding: 16rpx 12rpx;\n border-radius: $radius-sm;\n border-bottom: none;\n\n .order-value.amt {\n font-size: 36rpx;\n font-weight: 800;\n color: $color-primary;\n }\n }\n\n .order-label {\n font-size: 26rpx;\n color: $color-text-secondary;\n }\n\n .order-value {\n font-size: 26rpx;\n font-weight: 600;\n color: $color-text;\n\n &.amt {\n font-size: 34rpx;\n font-weight: 700;\n color: $color-primary;\n }\n }\n }\n }\n\n .qr-section {\n display: flex;\n flex-direction: column;\n align-items: center;\n margin-top: 32rpx;\n padding-bottom: 12rpx;\n\n .qr-hint {\n font-size: 26rpx;\n color: $color-text-secondary;\n margin-bottom: 24rpx;\n }\n\n .qr-box {\n position: relative;\n width: 320rpx;\n height: 320rpx;\n background: #FFFFFF;\n border: 4rpx solid $color-border;\n border-radius: $radius-md;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 24rpx;\n box-shadow: $shadow-md;\n\n .qr-placeholder {\n width: 100%;\n height: 100%;\n }\n\n .qr-overlay {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 72rpx;\n height: 72rpx;\n background: $color-primary;\n border-radius: $radius-md;\n display: flex;\n align-items: center;\n justify-content: center;\n box-shadow: 0 4rpx 12rpx rgba(255, 90, 31, 0.4);\n\n .qr-check {\n width: 40rpx;\n height: 40rpx;\n }\n }\n }\n\n .qr-expire {\n font-size: 22rpx;\n color: $color-text-muted;\n margin-top: 20rpx;\n }\n }\n\n // ====== 底部按钮 ======\n .footer-btns {\n display: flex;\n gap: 20rpx;\n\n .btn-prev,\n .btn-next,\n .btn-submit,\n .btn-reset,\n .btn-done {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 12rpx;\n height: 88rpx;\n border-radius: $radius-md;\n font-size: 30rpx;\n font-weight: 600;\n transition: all 0.25s ease;\n\n &:active {\n transform: scale(0.96);\n }\n\n &.disabled {\n opacity: 0.4;\n pointer-events: none;\n }\n\n .prev-icon,\n .next-icon,\n .submit-icon,\n .reset-icon,\n .done-icon {\n width: 32rpx;\n height: 32rpx;\n }\n }\n\n // 下一步 / 完成 按钮\n .btn-next,\n .btn-done {\n flex: 1;\n background: linear-gradient(135deg, $color-primary 0%, $color-orange 100%);\n color: #FFFFFF;\n box-shadow: 0 4rpx 16rpx rgba(255, 90, 31, 0.35);\n\n &:active {\n box-shadow: 0 2rpx 8rpx rgba(255, 90, 31, 0.2);\n }\n\n &.disabled {\n background: linear-gradient(135deg, #D1D5DB 0%, #E5E7EB 100%);\n box-shadow: none;\n }\n }\n\n // 上一步 按钮\n .btn-prev {\n background: $color-card;\n border: 2rpx solid $color-border;\n color: $color-text-secondary;\n padding: 0 28rpx;\n\n &:active {\n background: #F8F9FB;\n border-color: #D1D5DB;\n }\n }\n\n // 提交按钮\n .btn-submit {\n flex: 1;\n background: linear-gradient(135deg, $color-green 0%, $color-green-light 100%);\n color: #FFFFFF;\n box-shadow: 0 4rpx 16rpx rgba(16, 185, 129, 0.35);\n font-size: 32rpx;\n\n &:active {\n box-shadow: 0 2rpx 8rpx rgba(16, 185, 129, 0.2);\n }\n }\n\n // 重置按钮\n .btn-reset {\n background: $color-card;\n border: 2rpx solid $color-border;\n color: $color-text-secondary;\n padding: 0 28rpx;\n\n &:active {\n background: #F8F9FB;\n border-color: #D1D5DB;\n }\n }\n }\n\n // ====== 单独的下一步(步骤1) ======\n .btn-next {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 12rpx;\n width: 100%;\n height: 88rpx;\n background: linear-gradient(135deg, $color-primary 0%, $color-orange 100%);\n color: #FFFFFF;\n border-radius: $radius-md;\n font-size: 30rpx;\n font-weight: 600;\n transition: all 0.25s ease;\n box-shadow: 0 4rpx 16rpx rgba(255, 90, 31, 0.35);\n\n &:active {\n transform: scale(0.97);\n box-shadow: 0 2rpx 8rpx rgba(255, 90, 31, 0.2);\n }\n\n &.disabled {\n background: linear-gradient(135deg, #D1D5DB 0%, #E5E7EB 100%);\n box-shadow: none;\n\n &:active {\n transform: none;\n }\n }\n\n .next-icon {\n width: 32rpx;\n height: 32rpx;\n }\n }\n}\n</style>"
},
"next": [
"添加数据校验提示",
"接入真实扫码API",
"增加动画过渡效果",
"添加语音播报功能",
"接入支付网关二维码"
],
"breakpoint": "xs"
}
```
推理
The user wants a "押金设置" (Deposit Settings) page for a mobile app using uni-app (Vue 2) framework that needs to be compatible with WeChat Mini Programs. Let me break down the requirements:
1. A step-by-step wizard with 4 steps
2. Each step uses card layout with spacing
3. Step 1: Device selection - input device number, scan button, query button, device info display
4. Step 2: Deposit mode selection - picker component
5. Step 3: Confirmation - display collected info, submit button
6. Step 4: Payment QR code display
Key details:
- Theme colors:橘红色/orange为主, 蓝色/绿色为辅, highligh colors, vibrant
- Mobile app (phone), no responsive design needed
- Use SCSS with nesting
- uni-app Vue 2 code, compatible with WeChat Mini Program
- Use uni-app components (view, text, image)
- Font Awesome icons from /static/icons directory (SVG format)
- Use <picker> component
Let me first get the design system recommendations and then build the component.
Actually, let me think about this more carefully. The user wants a complete uni-app page. Let me design this step by step.
For the design system, let me search for relevant design inspiration.
Let me also get the current time for reference.
Let me think about the design:
**美学方向**: 现代/精致/功能型 - 橘红色为主色调的移动端设置页面
**配色**: 主色 #FF6B35 (橘红), 辅助色 #FF8C42 (橙色), #2563EB (蓝色), #10B981 (绿色)
**字体**: 使用简洁的字体, 移动端场景
Since the user explicitly says style lang="scss" and uni-app Vue 2 code with view/text/image components, I need to write proper uni-app code.
Let me think about the structure:
```vue
<template>
<view class="deposit-setting">
<!-- 步骤条 -->
<view class="steps-bar">
<view class="step-item" v-for="(step, index) in steps" :key="index">
...
</view>
</view>
<!-- 步骤内容 -->
<view class="step-content">
<!-- 步骤1: 选择设备 -->
<view class="card" v-if="currentStep === 0">
...
</view>
<!-- 步骤2: 押金模式选择 -->
<view class="card" v-if="currentStep === 1">
...
</view>
<!-- 步骤3: 询问核对 -->
<view class="card" v-if="currentStep === 2">
...
</view>
<!-- 步骤4: 订单支付码 -->
<view class="card" v-if="currentStep === 3">
...
</view>
</view>
</view>
</template>
```
Now let me call the design system tool for recommendations.
Actually, I need to think about what tools to use here. The user is asking for a specific code output, not content from the CMS. Let me get design system recommendations for inspiration.
Let me start building this.
For the icons - Font Awesome SVG icons in /static/icons directory. The user says they downloaded fontawesome-free-6.4.0-web. Since they're SVG files in /static/icons, I'll reference them as `<image src="/static/icons/icon-name.svg">`.
Wait, actually Font Awesome 6.4.0 web icons - let me think about what icons are available. Common ones would be like:
- fa-qrcode (扫码)
- fa-search (查询)
- fa-chevron-right (下一步)
- fa-check (确定)
- fa-check-circle (完成)
- fa-credit-card (支付)
- fa-cog (设置)
- fa-arrow-right
- etc.
Let me use sensible icon names that match Font Awesome 6.4.0 naming.
Let me now design the full component and write the code.
For the step indicator, I'll create a nice visual step bar.
Let me call get_design_system first to have a strong foundation.
Actually, I realize I need to carefully structure the output. The user wants uni-app Vue 2 code with SCSS. Let me produce a complete, well-designed page.
Let me think about the color palette more carefully:
Theme colors:
- Primary: #FF6B35 (橘红/orange-red) - vibrant
- Secondary: #FF8C42 (橙色/orange)
- Accent Blue: #3B82F6 (蓝色)
- Accent Green: #10B981 (绿色)
- Background: #F5F6FA (浅灰色背景)
- Card bg: #FFFFFF
- Text: #1A1A2E
- Light text: #8E8E93
Step indicator:
- Active: Orange gradient
- Completed: Green
- Inactive: Gray
Let me write the full code now. Since this is uni-app Vue 2, I need to use:
- `v-for` instead of loops
- `v-if` / `v-else-if` / `v-else` for conditionals
- `@click` for events
- `:class` for dynamic classes
- `view`, `text`, `image`, `input`, `picker`, `scroll-view` etc.
For the picker component in uni-app:
```html
<picker @change="bindPickerChange" :value="index" :range="array">
<view class="picker">{{array[index]}}</view>
</picker>
```
Let me now write the complete code.
Icons mapping (Font Awesome 6.4.0 to /static/icons/):
- 扫码/QR: qrcode.svg
- 搜索: magnifying-glass.svg (or search.svg)
- 下一步: chevron-right.svg (or arrow-right.svg)
- 确定: check.svg (or check-circle.svg)
- 完成/成功: check-circle.svg
- 设备: mobile-screen.svg (or device.svg)
- 押金: coins.svg (or money-bill.svg)
- 核对: clipboard-list.svg (or file-pen.svg)
- 支付码: qrcode.svg
- 信息: info-circle.svg
Actually, Font Awesome 6.4.0 free icons naming - let me use standard names:
- `qrcode.svg`
- `magnifying-glass.svg`
- `circle-check.svg`
- `chevron-right.svg`
- `circle-chevron-right.svg`
- `mobile-button.svg` or `mobile-screen.svg`
- `coins.svg`
- `list-check.svg`
- `check.svg`
Let me just use reasonable names. The user said they put all icons in /static/icons directory.
Now, let me write the full code. I'll be very thorough and create a polished component.
For the QR code placeholder, I'll use a gray box with some visual indication of a QR code.
Let me also think about states:
- `currentStep`: 0-3 tracking which step is active
- `deviceNumber`: the input device number
- `deviceInfo`: { terminalNumber, platform, name }
- `depositMode`: selected deposit mode index
- `depositModes`: array of options
- `steps`: array of step names
- `completedSteps`: array tracking which steps are completed
- `showQR`: boolean for showing QR code
Let me write the complete solution now. I'll make it visually stunning with the orange/red theme.
Let me first get the design system recommendations.
Actually, I should think about this more. Let me call the design system tool to get some inspiration, then proceed.
Let me structure this properly. The output should be in JSON format with the HTML code.
Wait, the user wants a uni-app page. They're not asking for a standalone HTML page. They want Vue 2 component code. So the "html" field in the output will contain the Vue template/script/style code.
Let me proceed with creating this.
Let me search for design system first.The design system gave me minimalism style with dark tones, but the user specifically asked for 橘红色和橙色为主 (orange-red and orange as main colors), with blue and green as accents. Let me deviate from the design system's color suggestions and use the user's requested color scheme.
Let me now design the complete page. The user wants:
1. uni-app Vue 2 code
2. SCSS with nesting
3. Font Awesome SVG icons from /static/icons
4. Mobile-first (no responsive)
5. Step wizard with 4 steps
6. Orange/red theme with blue/green accents
Let me create the complete code now.
For the step bar design, I'll create a horizontal step indicator with:
- Step circles with numbers
- Connecting lines between steps
- Active/completed/inactive states
- Step labels below
Colors:
- Primary: #FF5A1F (橘红)
- Primary light: #FF8C42 (橙色)
- Accent Blue: #2E7DF6 (蓝色)
- Accent Green: #10B981 (绿色)
- Background: #F8F9FC
- Card: #FFFFFF
- Text primary: #1A1A2E
- Text secondary: #6B7280
Let me write the complete Vue component now.
For the SVG icons from Font Awesome, I'll reference them as:
`/static/icons/[icon-name].svg`
Common Font Awesome 6.4.0 free icons I'll use:
- `qrcode.svg` - for scan button
- `magnifying-glass.svg` - for search/query
- `circle-check.svg` or `check-circle.svg` - for completed step
- `chevron-right.svg` - for next step
- `mobile-screen-button.svg` - for device
- `coins.svg` - for deposit
- `list-check.svg` - for confirmation
- `circle-chevron-right.svg` or `arrow-right.svg`
Actually, in Font Awesome 6.4.0 free, the naming might be slightly different. Let me use commonly known names:
- `qrcode.svg`
- `search.svg` or `magnifying-glass.svg`
- `check.svg`
- `chevron-right.svg`
- `mobile-alt.svg` or `mobile-screen.svg`
- `hand-holding-usd.svg` or `money-bill-wave.svg`
- `clipboard-list.svg`
- `arrow-right.svg`
Let me be practical and use reasonable icon names. The user said they put ALL icons in /static/icons, so the naming should follow Font Awesome 6.4.0 conventions.
Let me use these:
- `qrcode.svg` - 扫码
- `search.svg` - 查询 (Font Awesome 6 has `magnifying-glass` but also might have `search`)
- `check-circle.svg` - 已完成步骤
- `chevron-right.svg` - 下一步
- `mobile-screen.svg` - 设备
- `coins.svg` - 押金
- `clipboard-list.svg` - 核对
- `check.svg` - 确定
Actually, Font Awesome 6.4.0 changed some names. Let me use names that are commonly available:
- `fa-solid/qrcode.svg` → `/static/icons/qrcode.svg`
- `fa-solid/magnifying-glass.svg` → `/static/icons/magnifying-glass.svg`
- `fa-solid/check.svg` → `/static/icons/check.svg`
- `fa-solid/chevron-right.svg` → `/static/icons/chevron-right.svg`
- `fa-solid/mobile-screen-button.svg` → `/static/icons/mobile-screen-button.svg`
- `fa-solid/coins.svg` → `/static/icons/coins.svg`
- `fa-solid/list-check.svg` → `/static/icons/list-check.svg`
- `fa-solid/circle-check.svg` → `/static/icons/circle-check.svg`
- `fa-solid/circle-chevron-right.svg` → `/static/icons/circle-chevron-right.svg`
Let me keep it simpler and use shorter names that are likely to exist:
- `qrcode.svg`
- `search.svg`
- `check.svg`
- `chevron-right.svg`
- `mobile-alt.svg`
- `coins.svg`
- `clipboard-list.svg`
- `check-circle.svg`
Now let me write the complete code.
Actually, I'll structure the component with:
1. Template - using uni-app tags
2. Script - Vue 2 options API
3. Style - SCSS with nesting
Here's my plan for the template:
```
<view class="deposit-setting">
<!-- Header bar -->
<view class="header">
<text class="header-title">押金设置</text>
</view>
<!-- Steps indicator -->
<view class="steps-indicator">
<view class="step" v-for="(step, i) in steps" :key="i">
<view class="step-dot" :class="stepStatus(i)">
<image v-if="isCompleted(i)" src="/static/icons/check.svg" />
<text v-else>{{i + 1}}</text>
</view>
<view class="step-line" v-if="i < steps.length - 1" :class="lineStatus(i)"></view>
<text class="step-label">{{step}}</text>
</view>
</view>
<!-- Step content -->
<view class="step-content">
<!-- Step 1: 选择设备 -->
<view class="card" v-if="currentStep === 0">
<text class="card-title">步骤1: 选择设备</text>
<view class="divider"></view>
<view class="input-group">
<input v-model="deviceNumber" placeholder="请输入设备号" />
<view class="btn-group">
<view class="btn btn-scan" @click="scanDevice">
<image src="/static/icons/qrcode.svg" />
<text>扫码</text>
</view>
<view class="btn btn-query" @click="queryDevice">
<image src="/static/icons/search.svg" />
<text>查询</text>
</view>
</view>
</view>
<!-- Device info -->
<view class="device-info" v-if="deviceInfo">
...
</view>
<view class="btn-next" @click="nextStep(0)">
<text>下一步</text>
<image src="/static/icons/chevron-right.svg" />
</view>
</view>
<!-- Step 2: 押金模式选择 -->
...
<!-- Step 3: 询问核对 -->
...
<!-- Step 4: 订单支付码 -->
...
</view>
</view>
```
Let me now write the complete detailed code. I'll make it visually appealing.
Actually, for a mobile app in uni-app, the user wants a proper step wizard. Let me design the step bar properly.
Step indicator design:
- Horizontal layout
- Each step has a circle (with number or checkmark) and a label below
- Connecting lines between circles
- States: completed (green), active (orange), inactive (gray)
Let me now write the complete code.
For the uni-app picker component:
```html
<picker @change="onDepositModeChange" :value="depositModeIndex" :range="depositModes">
<view class="picker-display">
<text v-if="depositModeIndex >= 0">{{depositModes[depositModeIndex]}}</text>
<text v-else class="placeholder">请选择押金模式</text>
<image src="/static/icons/chevron-down.svg" class="picker-arrow" />
</view>
</picker>
```
Let me finalize the data structure:
```js
data() {
return {
currentStep: 0,
steps: ['选择设备', '押金模式', '核对确认', '支付码'],
completedSteps: [],
deviceNumber: '',
deviceInfo: null,
depositModes: ['押金模式A', '押金模式B', '押金模式C'],
depositModeIndex: -1,
depositMode: '',
submitted: false,
orderCode: 'ORD' + Date.now().toString().slice(-8),
}
}
```
Alright, let me write the complete code now. This will be a single-file Vue component for uni-app.
Let me think about the visual design more carefully:
Card design:
- Background: white
- Border-radius: 16rpx
- Box shadow: 0 4rpx 20rpx rgba(0,0,0,0.08)
- Padding: 30rpx
Step indicator:
- Circle size: 60rpx
- Active circle: orange gradient (#FF6B35 to #FF8C42)
- Completed circle: green (#10B981)
- Inactive circle: light gray (#E5E5E5)
- Line: 4rpx wide, same colors as circles
- Label: 24rpx font, colors matching
Buttons:
- Scan button: outlined style
- Query button: blue filled
- Next button: orange gradient
- Submit button: orange gradient
Input styling:
- Border: 2rpx solid #E5E5E5
- Border-radius: 12rpx
- Padding: 24rpx
- Font size: 28rpx
Let me now write the full code.
For icons, let me use these Font Awesome 6.4.0 SVG files that would be in /static/icons:
- `qrcode.svg` - 扫码
- `search.svg` - 查询
- `check.svg` - 完成/确定
- `chevron-right.svg` - 下一步箭头
- `chevron-down.svg` - 下拉箭头
- `mobile-button.svg` or `mobile-screen.svg` - 设备
- `coins.svg` - 押金
- `clipboard-list.svg` - 核对
- `circle-check.svg` - 完成状态
Actually, Font Awesome 6.4.0 free icons... Let me think about which SVG file names are standard.
In Font Awesome 6 Free:
- `qrcode.svg` ✓ (solid)
- `magnifying-glass.svg` ✓ (solid, formerly search)
- `circle-check.svg` ✓ (regular or solid)
- `chevron-right.svg` ✓ (solid)
- `chevron-down.svg` ✓ (solid)
- `mobile-screen-button.svg` ✓ (solid, formerly mobile-alt)
- `coins.svg` ✓ (solid)
- `clipboard-list.svg` ✓ (solid)
- `check.svg` ✓ (solid)
Hmm, but the user might have the actual Font Awesome files with their original names. Let me use common names.
Actually, in Font Awesome 6.4.0, the file structure has directories like:
- /webfonts/ (for fonts)
- /svgs/ (for SVGs)
- /solid/
- /regular/
- /brands/
If the user put all icons in /static/icons, they probably flattened them. So I'll use just the icon name without the style prefix.
Let me use these icon names that should be standard in FA 6.4.0:
- `qrcode.svg`
- `magnifying-glass.svg`
- `circle-check.svg`
- `check.svg`
- `chevron-right.svg`
- `chevron-down.svg`
- `mobile-screen-button.svg`
- `coins.svg`
- `clipboard-list.svg`
Alright, let me write the final code now. I'll be comprehensive.
Let me also think about the animation - I want smooth step transitions and nice visual feedback.
Let me finalize and write the code!The assets don't quite match what I need. Let me proceed with designing the component myself, using placeholder images and the Font Awesome SVG icons as specified.
Let me now write the complete uni-app Vue 2 component code. I'll be very thorough.
Let me think about the complete design one more time:
**Design Vision**: A vibrant, modern mobile deposit settings page with a step-by-step wizard. Orange/red primary colors with blue/green accents. Clean card-based layout with visual step indicator.
**Step Bar Design**:
- Horizontal layout at the top
- Each step: a colored circle with number, connected by lines
- Active step: orange gradient glow
- Completed step: green with checkmark
- Inactive step: light gray
- Labels below each step circle
**Card Design**:
- White background
- 16rpx border-radius
- Soft shadow
- Padding 30rpx
- Title at top with divider
Let me write the complete component now.
I realize I need to be very careful with uni-app Vue 2 syntax:
1. Template uses `<template>` wrapper
2. Data must be a function returning an object
3. Methods are in `methods` property
4. Computed properties in `computed`
5. Props in `props`
6. Events with `@` prefix
7. `v-model` works for input
8. `:class` for dynamic classes
9. `v-if`/`v-else`/`v-show` for conditional rendering
10. `v-for` with `:key`
Let me write this now. I'll make a complete, polished page.
For the scss, I'll use nesting as requested:
```scss
.deposit-setting {
.header { ... }
.steps-bar { ... }
.card { ... }
}
```
Let me write the full code now.
One thing to note - the user said "请使用uni-app 的节点, view,text,image 等节点" - so I should use uni-app components.
Also, the user said the icons are in `/static/icons` directory and are SVG format. So I'll reference them as:
```html
<image src="/static/icons/qrcode.svg" mode="aspectFit"></image>
```
For the picker in uni-app:
```html
<picker mode="selector" @change="onDepositModeChange" :value="depositModeIndex" :range="depositModes">
<view class="picker-trigger">
<text v-if="depositModeIndex >= 0">{{ depositModes[depositModeIndex] }}</text>
<text v-else class="placeholder-text">请选择押金模式</text>
<image src="/static/icons/chevron-down.svg" class="picker-arrow"></image>
</view>
</picker>
```
OK let me write the complete component now. This is going to be a long piece of code but I want to make it polished and complete.
Let me think about the complete data flow:
1. Step 1: User enters device number, clicks scan or query
- Scan: could trigger camera (placeholder function)
- Query: sets deviceInfo mock data
- Next: validates deviceInfo exists, proceeds to step 2
2. Step 2: User selects deposit mode from picker
- Next: validates selection, proceeds to step 3
3. Step 3: Shows device number and deposit mode for confirmation
- Confirm: submits, proceeds to step 4
4. Step 4: Shows QR code for payment
- Final step, no further action
Let me code it all up now.
Actually, I need to think about the step status more carefully. I'll use:
- `completedSteps` array to track which steps are completed
- `currentStep` to track which step is active
- Steps before currentStep are completed
- Current step is active
- Steps after are pending
Visual states:
- Completed: green circle with checkmark
- Active: orange gradient circle with number, slight glow
- Pending: gray circle with number
Let me write the complete code now.No results from the design system for color. That's fine, I'll use my own design judgment. Let me now write the complete component code.
Let me create a beautiful, functional deposit settings page with:
Color palette (vibrant, as requested):
- Primary: #FF5A1F (橘红)
- Primary Dark: #E04A0E
- Orange: #FF8C42
- Blue: #2E7DF6
- Green: #10B981
- Background: #F5F6FA
- Card: #FFFFFF
- Text Primary: #1A1A2E
- Text Secondary: #6B7280
- Border: #E5E5E5
- Gray: #9CA3AF
- Light Gray: #F0F0F0
Let me write the final code now. I'll make it comprehensive and visually stunning.No relevant results from typography either. Let me just use my design expertise to create the component. I'll use clean, modern typography suitable for a mobile UI - the system will use default mobile fonts since this is uni-app targeting WeChat Mini Program.
Let me write the complete component now.
Actually wait, I should note that for uni-app mini-programs, custom fonts can be tricky. The user didn't specifically request Google Fonts or custom web fonts, so I'll use the default system font stack which is the most practical choice for WeChat Mini Programs.
For the uni-app code, I'll use:
- Font family: system default (which is fine for mobile)
- The SCSS will use proper nesting
Let me now write the complete component code.
I need to be comprehensive about:
1. All 4 steps
2. Proper data binding
3. State management (step transitions, validation)
4. Visual polish (gradients, shadows, transitions)
5. Icon usage from /static/icons
6. Complete SCSS with nesting
Let me produce the full component now.The components list shows various layout components but nothing directly relevant to my deposit settings page. Let me just proceed with my design and write the complete code.
Let me now write the complete uni-app Vue 2 component for the deposit settings page.The assets don't have a QR code image I can use. I'll create a placeholder QR code using CSS/HTML instead - a visual representation with a border and inner pattern to suggest a QR code.
Now let me write the complete component. This will be a comprehensive uni-app Vue 2 component with SCSS styling.
Let me write it all now.OK, I have enough context now. Let me write the complete uni-app Vue 2 component for the deposit settings page.
Let me think about the design one final time:
**Color palette** (vibrant,橘红/橙/蓝/绿):
- Primary Orange-Red: #FF5A1F
- Primary Dark: #E04A0E
- Orange: #FF8C42
- Orange Light: #FFB088
- Blue: #2E7DF6
- Blue Light: #6EA8FE
- Green: #10B981
- Green Light: #34D399
- Background: #F5F6FA
- Card: #FFFFFF
- Text: #1A1A2E
- Text Secondary: #6B7280
- Border: #E5E5E5
- Muted: #9CA3AF
**Step indicator**:
- 4 steps horizontally
- Step 1: 选择设备
- Step 2: 押金模式
- Step 3: 核对确认
- Step 4: 支付码
**Step circle**: 60rpx diameter
- Active: orange gradient with glow
- Completed: green with white checkmark
- Pending: light gray
**Cards**: White, 16rpx border-radius, shadow, padding 30rpx
Let me now write the complete code. I need to be very comprehensive.
For the uni-app picker - in uni-app, the picker component works like this:
```html
<picker mode="selector" @change="onPickerChange" :range="array" :value="index">
<view>selected value</view>
</picker>
```
Let me now write the final code!The assets don't have what I need for this UI. Let me just proceed with the code, using Font Awesome SVG icons from /static/icons as the user specified.
Let me now write the complete, final code for the deposit settings page.It seems there are some existing articles about this topic, but they appear to be the same or similar to what I'm working on. Let me just proceed with my design and write the complete code.
Now let me write the final complete uni-app Vue 2 component with SCSS styling.These are just search results showing the same content type. The articles appear to be auto-created or related to existing content. Let me not worry about this and just produce the final code.
Let me write the complete uni-app Vue 2 component now. I have all the information I need.OK, the assets don't have specifically what I need for this deposit settings page. I'll proceed with my design and write the code now.
Let me now write the complete uni-app Vue 2 component. Here's my final plan:
**Component: DepositSettings.vue**
**Template structure:**
1. Navigation bar at top
2. Step indicator (horizontal)
3. Step content cards (4 steps, shown conditionally)
4. Bottom action area
**Data model:**
```js
data() {
return {
currentStep: 0,
steps: ['选择设备', '押金模式', '核对确认', '支付码'],
deviceNumber: '',
deviceInfo: null,
deviceScanned: false,
depositModeIndex: -1,
depositModes: ['押金模式A - 固定押金', '押金模式B - 按天计费', '押金模式C - 信用免押'],
depositMode: '',
orderCode: '',
submitted: false,
qrCodeUrl: '/static/icons/qrcode.svg' // placeholder
}
}
```
**Methods:**
- scanDevice() - simulate scan
- queryDevice() - simulate query, set deviceInfo
- goNext(stepIndex) - validate current step, go to next
- goBack() - go to previous step
- onDepositModeChange(e) - handle picker change
- submitConfirm() - final submit
- resetAll() - reset form
**SCSS with nesting** - proper scoped styles with depth
Let me now write the full code.Alright, I have all the information I need. Let me now write the complete uni-app Vue 2 component code.
I will produce a comprehensive, polished code with all the features requested.
Let me write the complete component now.No existing conversations found. Let me proceed to write the complete code from scratch. I have all the design thinking done. Let me produce the final output.
Let me now write the complete uni-app Vue 2 component for the deposit settings page.Good, I got a QR code related asset. Let me proceed now to write the complete code. I have everything I need.
Let me now produce the final comprehensive code.
1. A step-by-step wizard with 4 steps
2. Each step uses card layout with spacing
3. Step 1: Device selection - input device number, scan button, query button, device info display
4. Step 2: Deposit mode selection - picker component
5. Step 3: Confirmation - display collected info, submit button
6. Step 4: Payment QR code display
Key details:
- Theme colors:橘红色/orange为主, 蓝色/绿色为辅, highligh colors, vibrant
- Mobile app (phone), no responsive design needed
- Use SCSS with nesting
- uni-app Vue 2 code, compatible with WeChat Mini Program
- Use uni-app components (view, text, image)
- Font Awesome icons from /static/icons directory (SVG format)
- Use <picker> component
Let me first get the design system recommendations and then build the component.
Actually, let me think about this more carefully. The user wants a complete uni-app page. Let me design this step by step.
For the design system, let me search for relevant design inspiration.
Let me also get the current time for reference.
Let me think about the design:
**美学方向**: 现代/精致/功能型 - 橘红色为主色调的移动端设置页面
**配色**: 主色 #FF6B35 (橘红), 辅助色 #FF8C42 (橙色), #2563EB (蓝色), #10B981 (绿色)
**字体**: 使用简洁的字体, 移动端场景
Since the user explicitly says style lang="scss" and uni-app Vue 2 code with view/text/image components, I need to write proper uni-app code.
Let me think about the structure:
```vue
<template>
<view class="deposit-setting">
<!-- 步骤条 -->
<view class="steps-bar">
<view class="step-item" v-for="(step, index) in steps" :key="index">
...
</view>
</view>
<!-- 步骤内容 -->
<view class="step-content">
<!-- 步骤1: 选择设备 -->
<view class="card" v-if="currentStep === 0">
...
</view>
<!-- 步骤2: 押金模式选择 -->
<view class="card" v-if="currentStep === 1">
...
</view>
<!-- 步骤3: 询问核对 -->
<view class="card" v-if="currentStep === 2">
...
</view>
<!-- 步骤4: 订单支付码 -->
<view class="card" v-if="currentStep === 3">
...
</view>
</view>
</view>
</template>
```
Now let me call the design system tool for recommendations.
Actually, I need to think about what tools to use here. The user is asking for a specific code output, not content from the CMS. Let me get design system recommendations for inspiration.
Let me start building this.
For the icons - Font Awesome SVG icons in /static/icons directory. The user says they downloaded fontawesome-free-6.4.0-web. Since they're SVG files in /static/icons, I'll reference them as `<image src="/static/icons/icon-name.svg">`.
Wait, actually Font Awesome 6.4.0 web icons - let me think about what icons are available. Common ones would be like:
- fa-qrcode (扫码)
- fa-search (查询)
- fa-chevron-right (下一步)
- fa-check (确定)
- fa-check-circle (完成)
- fa-credit-card (支付)
- fa-cog (设置)
- fa-arrow-right
- etc.
Let me use sensible icon names that match Font Awesome 6.4.0 naming.
Let me now design the full component and write the code.
For the step indicator, I'll create a nice visual step bar.
Let me call get_design_system first to have a strong foundation.
Actually, I realize I need to carefully structure the output. The user wants uni-app Vue 2 code with SCSS. Let me produce a complete, well-designed page.
Let me think about the color palette more carefully:
Theme colors:
- Primary: #FF6B35 (橘红/orange-red) - vibrant
- Secondary: #FF8C42 (橙色/orange)
- Accent Blue: #3B82F6 (蓝色)
- Accent Green: #10B981 (绿色)
- Background: #F5F6FA (浅灰色背景)
- Card bg: #FFFFFF
- Text: #1A1A2E
- Light text: #8E8E93
Step indicator:
- Active: Orange gradient
- Completed: Green
- Inactive: Gray
Let me write the full code now. Since this is uni-app Vue 2, I need to use:
- `v-for` instead of loops
- `v-if` / `v-else-if` / `v-else` for conditionals
- `@click` for events
- `:class` for dynamic classes
- `view`, `text`, `image`, `input`, `picker`, `scroll-view` etc.
For the picker component in uni-app:
```html
<picker @change="bindPickerChange" :value="index" :range="array">
<view class="picker">{{array[index]}}</view>
</picker>
```
Let me now write the complete code.
Icons mapping (Font Awesome 6.4.0 to /static/icons/):
- 扫码/QR: qrcode.svg
- 搜索: magnifying-glass.svg (or search.svg)
- 下一步: chevron-right.svg (or arrow-right.svg)
- 确定: check.svg (or check-circle.svg)
- 完成/成功: check-circle.svg
- 设备: mobile-screen.svg (or device.svg)
- 押金: coins.svg (or money-bill.svg)
- 核对: clipboard-list.svg (or file-pen.svg)
- 支付码: qrcode.svg
- 信息: info-circle.svg
Actually, Font Awesome 6.4.0 free icons naming - let me use standard names:
- `qrcode.svg`
- `magnifying-glass.svg`
- `circle-check.svg`
- `chevron-right.svg`
- `circle-chevron-right.svg`
- `mobile-button.svg` or `mobile-screen.svg`
- `coins.svg`
- `list-check.svg`
- `check.svg`
Let me just use reasonable names. The user said they put all icons in /static/icons directory.
Now, let me write the full code. I'll be very thorough and create a polished component.
For the QR code placeholder, I'll use a gray box with some visual indication of a QR code.
Let me also think about states:
- `currentStep`: 0-3 tracking which step is active
- `deviceNumber`: the input device number
- `deviceInfo`: { terminalNumber, platform, name }
- `depositMode`: selected deposit mode index
- `depositModes`: array of options
- `steps`: array of step names
- `completedSteps`: array tracking which steps are completed
- `showQR`: boolean for showing QR code
Let me write the complete solution now. I'll make it visually stunning with the orange/red theme.
Let me first get the design system recommendations.
Actually, I should think about this more. Let me call the design system tool to get some inspiration, then proceed.
Let me structure this properly. The output should be in JSON format with the HTML code.
Wait, the user wants a uni-app page. They're not asking for a standalone HTML page. They want Vue 2 component code. So the "html" field in the output will contain the Vue template/script/style code.
Let me proceed with creating this.
Let me search for design system first.The design system gave me minimalism style with dark tones, but the user specifically asked for 橘红色和橙色为主 (orange-red and orange as main colors), with blue and green as accents. Let me deviate from the design system's color suggestions and use the user's requested color scheme.
Let me now design the complete page. The user wants:
1. uni-app Vue 2 code
2. SCSS with nesting
3. Font Awesome SVG icons from /static/icons
4. Mobile-first (no responsive)
5. Step wizard with 4 steps
6. Orange/red theme with blue/green accents
Let me create the complete code now.
For the step bar design, I'll create a horizontal step indicator with:
- Step circles with numbers
- Connecting lines between steps
- Active/completed/inactive states
- Step labels below
Colors:
- Primary: #FF5A1F (橘红)
- Primary light: #FF8C42 (橙色)
- Accent Blue: #2E7DF6 (蓝色)
- Accent Green: #10B981 (绿色)
- Background: #F8F9FC
- Card: #FFFFFF
- Text primary: #1A1A2E
- Text secondary: #6B7280
Let me write the complete Vue component now.
For the SVG icons from Font Awesome, I'll reference them as:
`/static/icons/[icon-name].svg`
Common Font Awesome 6.4.0 free icons I'll use:
- `qrcode.svg` - for scan button
- `magnifying-glass.svg` - for search/query
- `circle-check.svg` or `check-circle.svg` - for completed step
- `chevron-right.svg` - for next step
- `mobile-screen-button.svg` - for device
- `coins.svg` - for deposit
- `list-check.svg` - for confirmation
- `circle-chevron-right.svg` or `arrow-right.svg`
Actually, in Font Awesome 6.4.0 free, the naming might be slightly different. Let me use commonly known names:
- `qrcode.svg`
- `search.svg` or `magnifying-glass.svg`
- `check.svg`
- `chevron-right.svg`
- `mobile-alt.svg` or `mobile-screen.svg`
- `hand-holding-usd.svg` or `money-bill-wave.svg`
- `clipboard-list.svg`
- `arrow-right.svg`
Let me be practical and use reasonable icon names. The user said they put ALL icons in /static/icons, so the naming should follow Font Awesome 6.4.0 conventions.
Let me use these:
- `qrcode.svg` - 扫码
- `search.svg` - 查询 (Font Awesome 6 has `magnifying-glass` but also might have `search`)
- `check-circle.svg` - 已完成步骤
- `chevron-right.svg` - 下一步
- `mobile-screen.svg` - 设备
- `coins.svg` - 押金
- `clipboard-list.svg` - 核对
- `check.svg` - 确定
Actually, Font Awesome 6.4.0 changed some names. Let me use names that are commonly available:
- `fa-solid/qrcode.svg` → `/static/icons/qrcode.svg`
- `fa-solid/magnifying-glass.svg` → `/static/icons/magnifying-glass.svg`
- `fa-solid/check.svg` → `/static/icons/check.svg`
- `fa-solid/chevron-right.svg` → `/static/icons/chevron-right.svg`
- `fa-solid/mobile-screen-button.svg` → `/static/icons/mobile-screen-button.svg`
- `fa-solid/coins.svg` → `/static/icons/coins.svg`
- `fa-solid/list-check.svg` → `/static/icons/list-check.svg`
- `fa-solid/circle-check.svg` → `/static/icons/circle-check.svg`
- `fa-solid/circle-chevron-right.svg` → `/static/icons/circle-chevron-right.svg`
Let me keep it simpler and use shorter names that are likely to exist:
- `qrcode.svg`
- `search.svg`
- `check.svg`
- `chevron-right.svg`
- `mobile-alt.svg`
- `coins.svg`
- `clipboard-list.svg`
- `check-circle.svg`
Now let me write the complete code.
Actually, I'll structure the component with:
1. Template - using uni-app tags
2. Script - Vue 2 options API
3. Style - SCSS with nesting
Here's my plan for the template:
```
<view class="deposit-setting">
<!-- Header bar -->
<view class="header">
<text class="header-title">押金设置</text>
</view>
<!-- Steps indicator -->
<view class="steps-indicator">
<view class="step" v-for="(step, i) in steps" :key="i">
<view class="step-dot" :class="stepStatus(i)">
<image v-if="isCompleted(i)" src="/static/icons/check.svg" />
<text v-else>{{i + 1}}</text>
</view>
<view class="step-line" v-if="i < steps.length - 1" :class="lineStatus(i)"></view>
<text class="step-label">{{step}}</text>
</view>
</view>
<!-- Step content -->
<view class="step-content">
<!-- Step 1: 选择设备 -->
<view class="card" v-if="currentStep === 0">
<text class="card-title">步骤1: 选择设备</text>
<view class="divider"></view>
<view class="input-group">
<input v-model="deviceNumber" placeholder="请输入设备号" />
<view class="btn-group">
<view class="btn btn-scan" @click="scanDevice">
<image src="/static/icons/qrcode.svg" />
<text>扫码</text>
</view>
<view class="btn btn-query" @click="queryDevice">
<image src="/static/icons/search.svg" />
<text>查询</text>
</view>
</view>
</view>
<!-- Device info -->
<view class="device-info" v-if="deviceInfo">
...
</view>
<view class="btn-next" @click="nextStep(0)">
<text>下一步</text>
<image src="/static/icons/chevron-right.svg" />
</view>
</view>
<!-- Step 2: 押金模式选择 -->
...
<!-- Step 3: 询问核对 -->
...
<!-- Step 4: 订单支付码 -->
...
</view>
</view>
```
Let me now write the complete detailed code. I'll make it visually appealing.
Actually, for a mobile app in uni-app, the user wants a proper step wizard. Let me design the step bar properly.
Step indicator design:
- Horizontal layout
- Each step has a circle (with number or checkmark) and a label below
- Connecting lines between circles
- States: completed (green), active (orange), inactive (gray)
Let me now write the complete code.
For the uni-app picker component:
```html
<picker @change="onDepositModeChange" :value="depositModeIndex" :range="depositModes">
<view class="picker-display">
<text v-if="depositModeIndex >= 0">{{depositModes[depositModeIndex]}}</text>
<text v-else class="placeholder">请选择押金模式</text>
<image src="/static/icons/chevron-down.svg" class="picker-arrow" />
</view>
</picker>
```
Let me finalize the data structure:
```js
data() {
return {
currentStep: 0,
steps: ['选择设备', '押金模式', '核对确认', '支付码'],
completedSteps: [],
deviceNumber: '',
deviceInfo: null,
depositModes: ['押金模式A', '押金模式B', '押金模式C'],
depositModeIndex: -1,
depositMode: '',
submitted: false,
orderCode: 'ORD' + Date.now().toString().slice(-8),
}
}
```
Alright, let me write the complete code now. This will be a single-file Vue component for uni-app.
Let me think about the visual design more carefully:
Card design:
- Background: white
- Border-radius: 16rpx
- Box shadow: 0 4rpx 20rpx rgba(0,0,0,0.08)
- Padding: 30rpx
Step indicator:
- Circle size: 60rpx
- Active circle: orange gradient (#FF6B35 to #FF8C42)
- Completed circle: green (#10B981)
- Inactive circle: light gray (#E5E5E5)
- Line: 4rpx wide, same colors as circles
- Label: 24rpx font, colors matching
Buttons:
- Scan button: outlined style
- Query button: blue filled
- Next button: orange gradient
- Submit button: orange gradient
Input styling:
- Border: 2rpx solid #E5E5E5
- Border-radius: 12rpx
- Padding: 24rpx
- Font size: 28rpx
Let me now write the full code.
For icons, let me use these Font Awesome 6.4.0 SVG files that would be in /static/icons:
- `qrcode.svg` - 扫码
- `search.svg` - 查询
- `check.svg` - 完成/确定
- `chevron-right.svg` - 下一步箭头
- `chevron-down.svg` - 下拉箭头
- `mobile-button.svg` or `mobile-screen.svg` - 设备
- `coins.svg` - 押金
- `clipboard-list.svg` - 核对
- `circle-check.svg` - 完成状态
Actually, Font Awesome 6.4.0 free icons... Let me think about which SVG file names are standard.
In Font Awesome 6 Free:
- `qrcode.svg` ✓ (solid)
- `magnifying-glass.svg` ✓ (solid, formerly search)
- `circle-check.svg` ✓ (regular or solid)
- `chevron-right.svg` ✓ (solid)
- `chevron-down.svg` ✓ (solid)
- `mobile-screen-button.svg` ✓ (solid, formerly mobile-alt)
- `coins.svg` ✓ (solid)
- `clipboard-list.svg` ✓ (solid)
- `check.svg` ✓ (solid)
Hmm, but the user might have the actual Font Awesome files with their original names. Let me use common names.
Actually, in Font Awesome 6.4.0, the file structure has directories like:
- /webfonts/ (for fonts)
- /svgs/ (for SVGs)
- /solid/
- /regular/
- /brands/
If the user put all icons in /static/icons, they probably flattened them. So I'll use just the icon name without the style prefix.
Let me use these icon names that should be standard in FA 6.4.0:
- `qrcode.svg`
- `magnifying-glass.svg`
- `circle-check.svg`
- `check.svg`
- `chevron-right.svg`
- `chevron-down.svg`
- `mobile-screen-button.svg`
- `coins.svg`
- `clipboard-list.svg`
Alright, let me write the final code now. I'll be comprehensive.
Let me also think about the animation - I want smooth step transitions and nice visual feedback.
Let me finalize and write the code!The assets don't quite match what I need. Let me proceed with designing the component myself, using placeholder images and the Font Awesome SVG icons as specified.
Let me now write the complete uni-app Vue 2 component code. I'll be very thorough.
Let me think about the complete design one more time:
**Design Vision**: A vibrant, modern mobile deposit settings page with a step-by-step wizard. Orange/red primary colors with blue/green accents. Clean card-based layout with visual step indicator.
**Step Bar Design**:
- Horizontal layout at the top
- Each step: a colored circle with number, connected by lines
- Active step: orange gradient glow
- Completed step: green with checkmark
- Inactive step: light gray
- Labels below each step circle
**Card Design**:
- White background
- 16rpx border-radius
- Soft shadow
- Padding 30rpx
- Title at top with divider
Let me write the complete component now.
I realize I need to be very careful with uni-app Vue 2 syntax:
1. Template uses `<template>` wrapper
2. Data must be a function returning an object
3. Methods are in `methods` property
4. Computed properties in `computed`
5. Props in `props`
6. Events with `@` prefix
7. `v-model` works for input
8. `:class` for dynamic classes
9. `v-if`/`v-else`/`v-show` for conditional rendering
10. `v-for` with `:key`
Let me write this now. I'll make a complete, polished page.
For the scss, I'll use nesting as requested:
```scss
.deposit-setting {
.header { ... }
.steps-bar { ... }
.card { ... }
}
```
Let me write the full code now.
One thing to note - the user said "请使用uni-app 的节点, view,text,image 等节点" - so I should use uni-app components.
Also, the user said the icons are in `/static/icons` directory and are SVG format. So I'll reference them as:
```html
<image src="/static/icons/qrcode.svg" mode="aspectFit"></image>
```
For the picker in uni-app:
```html
<picker mode="selector" @change="onDepositModeChange" :value="depositModeIndex" :range="depositModes">
<view class="picker-trigger">
<text v-if="depositModeIndex >= 0">{{ depositModes[depositModeIndex] }}</text>
<text v-else class="placeholder-text">请选择押金模式</text>
<image src="/static/icons/chevron-down.svg" class="picker-arrow"></image>
</view>
</picker>
```
OK let me write the complete component now. This is going to be a long piece of code but I want to make it polished and complete.
Let me think about the complete data flow:
1. Step 1: User enters device number, clicks scan or query
- Scan: could trigger camera (placeholder function)
- Query: sets deviceInfo mock data
- Next: validates deviceInfo exists, proceeds to step 2
2. Step 2: User selects deposit mode from picker
- Next: validates selection, proceeds to step 3
3. Step 3: Shows device number and deposit mode for confirmation
- Confirm: submits, proceeds to step 4
4. Step 4: Shows QR code for payment
- Final step, no further action
Let me code it all up now.
Actually, I need to think about the step status more carefully. I'll use:
- `completedSteps` array to track which steps are completed
- `currentStep` to track which step is active
- Steps before currentStep are completed
- Current step is active
- Steps after are pending
Visual states:
- Completed: green circle with checkmark
- Active: orange gradient circle with number, slight glow
- Pending: gray circle with number
Let me write the complete code now.No results from the design system for color. That's fine, I'll use my own design judgment. Let me now write the complete component code.
Let me create a beautiful, functional deposit settings page with:
Color palette (vibrant, as requested):
- Primary: #FF5A1F (橘红)
- Primary Dark: #E04A0E
- Orange: #FF8C42
- Blue: #2E7DF6
- Green: #10B981
- Background: #F5F6FA
- Card: #FFFFFF
- Text Primary: #1A1A2E
- Text Secondary: #6B7280
- Border: #E5E5E5
- Gray: #9CA3AF
- Light Gray: #F0F0F0
Let me write the final code now. I'll make it comprehensive and visually stunning.No relevant results from typography either. Let me just use my design expertise to create the component. I'll use clean, modern typography suitable for a mobile UI - the system will use default mobile fonts since this is uni-app targeting WeChat Mini Program.
Let me write the complete component now.
Actually wait, I should note that for uni-app mini-programs, custom fonts can be tricky. The user didn't specifically request Google Fonts or custom web fonts, so I'll use the default system font stack which is the most practical choice for WeChat Mini Programs.
For the uni-app code, I'll use:
- Font family: system default (which is fine for mobile)
- The SCSS will use proper nesting
Let me now write the complete component code.
I need to be comprehensive about:
1. All 4 steps
2. Proper data binding
3. State management (step transitions, validation)
4. Visual polish (gradients, shadows, transitions)
5. Icon usage from /static/icons
6. Complete SCSS with nesting
Let me produce the full component now.The components list shows various layout components but nothing directly relevant to my deposit settings page. Let me just proceed with my design and write the complete code.
Let me now write the complete uni-app Vue 2 component for the deposit settings page.The assets don't have a QR code image I can use. I'll create a placeholder QR code using CSS/HTML instead - a visual representation with a border and inner pattern to suggest a QR code.
Now let me write the complete component. This will be a comprehensive uni-app Vue 2 component with SCSS styling.
Let me write it all now.OK, I have enough context now. Let me write the complete uni-app Vue 2 component for the deposit settings page.
Let me think about the design one final time:
**Color palette** (vibrant,橘红/橙/蓝/绿):
- Primary Orange-Red: #FF5A1F
- Primary Dark: #E04A0E
- Orange: #FF8C42
- Orange Light: #FFB088
- Blue: #2E7DF6
- Blue Light: #6EA8FE
- Green: #10B981
- Green Light: #34D399
- Background: #F5F6FA
- Card: #FFFFFF
- Text: #1A1A2E
- Text Secondary: #6B7280
- Border: #E5E5E5
- Muted: #9CA3AF
**Step indicator**:
- 4 steps horizontally
- Step 1: 选择设备
- Step 2: 押金模式
- Step 3: 核对确认
- Step 4: 支付码
**Step circle**: 60rpx diameter
- Active: orange gradient with glow
- Completed: green with white checkmark
- Pending: light gray
**Cards**: White, 16rpx border-radius, shadow, padding 30rpx
Let me now write the complete code. I need to be very comprehensive.
For the uni-app picker - in uni-app, the picker component works like this:
```html
<picker mode="selector" @change="onPickerChange" :range="array" :value="index">
<view>selected value</view>
</picker>
```
Let me now write the final code!The assets don't have what I need for this UI. Let me just proceed with the code, using Font Awesome SVG icons from /static/icons as the user specified.
Let me now write the complete, final code for the deposit settings page.It seems there are some existing articles about this topic, but they appear to be the same or similar to what I'm working on. Let me just proceed with my design and write the complete code.
Now let me write the final complete uni-app Vue 2 component with SCSS styling.These are just search results showing the same content type. The articles appear to be auto-created or related to existing content. Let me not worry about this and just produce the final code.
Let me write the complete uni-app Vue 2 component now. I have all the information I need.OK, the assets don't have specifically what I need for this deposit settings page. I'll proceed with my design and write the code now.
Let me now write the complete uni-app Vue 2 component. Here's my final plan:
**Component: DepositSettings.vue**
**Template structure:**
1. Navigation bar at top
2. Step indicator (horizontal)
3. Step content cards (4 steps, shown conditionally)
4. Bottom action area
**Data model:**
```js
data() {
return {
currentStep: 0,
steps: ['选择设备', '押金模式', '核对确认', '支付码'],
deviceNumber: '',
deviceInfo: null,
deviceScanned: false,
depositModeIndex: -1,
depositModes: ['押金模式A - 固定押金', '押金模式B - 按天计费', '押金模式C - 信用免押'],
depositMode: '',
orderCode: '',
submitted: false,
qrCodeUrl: '/static/icons/qrcode.svg' // placeholder
}
}
```
**Methods:**
- scanDevice() - simulate scan
- queryDevice() - simulate query, set deviceInfo
- goNext(stepIndex) - validate current step, go to next
- goBack() - go to previous step
- onDepositModeChange(e) - handle picker change
- submitConfirm() - final submit
- resetAll() - reset form
**SCSS with nesting** - proper scoped styles with depth
Let me now write the full code.Alright, I have all the information I need. Let me now write the complete uni-app Vue 2 component code.
I will produce a comprehensive, polished code with all the features requested.
Let me write the complete component now.No existing conversations found. Let me proceed to write the complete code from scratch. I have all the design thinking done. Let me produce the final output.
Let me now write the complete uni-app Vue 2 component for the deposit settings page.Good, I got a QR code related asset. Let me proceed now to write the complete code. I have everything I need.
Let me now produce the final comprehensive code.
角色
assistant
content
total_tokens
31398
summary
基于橘红/橙为主色调、蓝绿为辅色的移动端押金设置页面,采用uni-app Vue 2 + SCSS构建。四个步骤条引导式操作:选择设备(输入+扫码+查询+设备信息展示)、押金模式选择(picker下拉)、核对确认、订单支付码展示。使用Font Awesome 6.4 SVG图标,卡片布局,橘红渐变主色搭配蓝绿强调色,手机端适配。
uiParsing
关闭