首页/ mobileweb/ 某杰废品回收站/ 代码预览

💻 代码预览 · 某杰废品回收站

mw_life · 上传者 小草
← 返回详情
某杰废品回收站_H5/gen.py · 约 69122 字符
1#!/usr/bin/env python32# -*- coding: utf-8 -*-3"""生成某杰废品回收站 H5 项目所有文件(8页:index/category/detail/cart/order/orders/member/mine)"""4import os5import re67OUT = os.path.dirname(os.path.abspath(__file__))89CSS = """/* 某杰废品回收站 · 移动端 H5 样式 */10*{margin:0;padding:0;box-sizing:border-box}11body{font-family:-apple-system,"PingFang SC","Microsoft YaHei",sans-serif;background:#effaf6;color:#123b32;max-width:430px;margin:0 auto;min-height:100vh}12a{text-decoration:none;color:inherit}13ul{list-style:none}14:root{--primary:#059669;--primary-dark:#047857;--primary-light:#d1fae5;--secondary:#10b981;--accent:#0d9488;--dark:#064e3b;--gray:#8fc2b4;--light-gray:#e6f7f1;--green:#059669;--blue:#0284c7;--orange:#ea580c;--red:#dc2626;--gold:#ca8a04}15.header{background:linear-gradient(135deg,#047857,#059669);color:#fff;padding:12px 16px;display:flex;align-items:center;justify-content:space-between;position:sticky;top:0;z-index:100;box-shadow:0 2px 8px rgba(4,120,87,.3)}16.header .back{font-size:22px;cursor:pointer;width:32px}17.header h1{font-size:17px;font-weight:600;flex:1;text-align:center}18.header .right{width:32px;text-align:right;font-size:14px}19.tabbar{position:fixed;bottom:0;left:50%;transform:translateX(-50%);width:100%;max-width:430px;background:#fff;border-top:1px solid #eef3f1;display:flex;z-index:100;padding-bottom:env(safe-area-inset-bottom)}20.tabbar a{flex:1;text-align:center;padding:8px 0;color:#9aa8a4;font-size:11px}21.tabbar a.active{color:var(--primary)}22.tabbar a .icon{font-size:22px;display:block;margin-bottom:2px}23.card{background:#fff;border-radius:12px;margin:12px;padding:16px;box-shadow:0 1px 4px rgba(0,0,0,.05)}24.section-title{font-size:16px;font-weight:700;margin:16px 16px 8px;display:flex;justify-content:space-between;align-items:center}25.section-title span{font-size:12px;color:#9aa8a4;font-weight:400}26.btn{display:block;width:100%;padding:13px;border:none;border-radius:25px;font-size:15px;font-weight:600;cursor:pointer;text-align:center}27.btn-primary{background:linear-gradient(135deg,#047857,#059669);color:#fff}28.btn-gold{background:linear-gradient(135deg,#ca8a04,#eab308);color:#fff}29.btn-outline{background:#fff;border:1px solid var(--primary);color:var(--primary)}30.btn-blue{background:linear-gradient(135deg,#0d9488,#0284c7);color:#fff}31.badge{display:inline-block;padding:2px 8px;border-radius:10px;font-size:11px;font-weight:600}32.badge-hot{background:#fff1f0;color:#dc2626}33.badge-new{background:#eef2ff;color:var(--blue)}34.badge-sale{background:#fff7e6;color:var(--orange)}35.badge-org{background:#d1fae5;color:var(--primary-dark)}36.tag{display:inline-block;padding:2px 6px;border-radius:4px;font-size:11px;background:var(--light-gray);color:#0f766e;margin:2px 4px 0 0}37/* 首页 */38.location-bar{margin:12px 12px 0;background:#fff;border-radius:14px;padding:12px 14px;display:flex;align-items:center;gap:8px;font-size:13px;box-shadow:0 1px 4px rgba(0,0,0,.05)}39.location-bar .lb-ico{font-size:18px}40.location-bar .lb-city{font-weight:700}41.location-bar .lb-area{color:#9aa8a4;flex:1}42.location-bar .lb-chg{color:var(--primary);font-size:12px}43.banner{height:158px;margin:12px;border-radius:14px;background:linear-gradient(135deg,#064e3b,#059669,#10b981);color:#fff;display:flex;align-items:center;padding:20px;position:relative;overflow:hidden}44.banner .bn-title{font-size:22px;font-weight:800;letter-spacing:1px}45.banner .bn-sub{font-size:12px;opacity:.94;margin-top:6px;line-height:1.7}46.banner .bn-badge{display:inline-block;background:rgba(255,255,255,.22);padding:4px 12px;border-radius:14px;font-size:11px;margin-top:10px}47.banner .bn-emoji{position:absolute;right:10px;font-size:64px;opacity:.95}48.search-box{margin:12px;background:#fff;border-radius:22px;padding:11px 16px;display:flex;align-items:center;gap:8px;box-shadow:0 1px 4px rgba(0,0,0,.05)}49.search-box .s-ico{font-size:18px}50.search-box input{border:none;outline:none;flex:1;font-size:13px;color:#123b32}51.search-box .s-btn{background:linear-gradient(135deg,#047857,#059669);color:#fff;padding:6px 14px;border-radius:16px;font-size:12px;font-weight:700}52.cat-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;padding:0 12px}53.cat-grid a{background:#fff;border-radius:12px;padding:14px 4px;text-align:center;box-shadow:0 1px 4px rgba(0,0,0,.04)}54.cat-grid a .c-emoji{font-size:28px;display:block}55.cat-grid a .c-name{font-size:12px;margin-top:6px;color:#0f766e;font-weight:600}56.quick-grid{display:grid;grid-template-columns:repeat(5,1fr);gap:6px;padding:16px 10px;background:#fff;margin:12px;border-radius:14px}57.quick-grid a{text-align:center;font-size:11px;color:#0f766e}58.quick-grid a .qicon{width:44px;height:44px;margin:0 auto 5px;border-radius:50%;background:var(--primary-light);display:flex;align-items:center;justify-content:center;font-size:22px}59.price-news{background:#fff;border-radius:14px;margin:12px;padding:14px;box-shadow:0 1px 4px rgba(0,0,0,.05)}60.price-news .pn-head{display:flex;align-items:center;gap:8px;font-size:14px;font-weight:700}61.price-news .pn-head .pn-tag{background:#d1fae5;color:var(--primary-dark);font-size:11px;padding:2px 8px;border-radius:10px}62.price-news .pn-item{display:flex;align-items:center;gap:10px;padding:9px 0;border-bottom:1px solid #f1f9f6;font-size:12px}63.price-news .pn-item:last-child{border-bottom:none}64.price-news .pn-item .pn-name{flex:1}65.price-news .pn-item .pn-price{font-weight:700;color:var(--primary-dark)}66.price-news .pn-item .pn-chg.up{color:var(--red)}67.price-news .pn-item .pn-chg.down{color:var(--green)}68.seckill{background:#fff;border-radius:14px;margin:12px;overflow:hidden;box-shadow:0 1px 4px rgba(0,0,0,.05)}69.seckill .sk-head{background:linear-gradient(135deg,#dc2626,#ea580c);color:#fff;padding:10px 14px;display:flex;align-items:center;gap:10px}70.seckill .sk-head b{font-size:15px}71.seckill .sk-head .sk-time{display:flex;gap:3px;margin-left:auto}72.seckill .sk-head .sk-time i{background:rgba(255,255,255,.25);padding:2px 6px;border-radius:4px;font-size:13px;font-style:normal;font-weight:700}73.seckill .sk-body{display:flex;gap:10px;padding:12px;overflow-x:auto;scrollbar-width:none}74.seckill .sk-item{width:96px;flex-shrink:0;text-align:center}75.seckill .sk-item .sk-img{height:72px;border-radius:10px;background:var(--primary-light);display:flex;align-items:center;justify-content:center;font-size:36px}76.seckill .sk-item .sk-name{font-size:11px;margin-top:4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}77.seckill .sk-item .sk-price{color:var(--red);font-weight:800;font-size:14px;margin-top:2px}78.seckill .sk-item .sk-old{color:#b7d3c9;font-size:10px;text-decoration:line-through}79.goods-card{background:#fff;border-radius:14px;margin:10px 12px;padding:12px;display:flex;gap:12px;box-shadow:0 1px 4px rgba(0,0,0,.05)}80.goods-card .gc-img{width:92px;height:92px;border-radius:10px;background:linear-gradient(135deg,#d1fae5,#a7f3d0);display:flex;align-items:center;justify-content:center;font-size:44px;flex-shrink:0}81.goods-card .gc-body{flex:1;min-width:0}82.goods-card .gc-name{font-size:14px;font-weight:700}83.goods-card .gc-desc{font-size:11px;color:#8fc2b4;margin-top:3px}84.goods-card .gc-meta{font-size:10px;color:#a3cdc1;margin-top:3px}85.goods-card .gc-foot{display:flex;justify-content:space-between;align-items:center;margin-top:6px}86.goods-card .gc-price{color:var(--red);font-weight:800;font-size:17px}87.goods-card .gc-price small{font-size:11px;color:#8fc2b4;font-weight:400}88.goods-card .gc-add{background:linear-gradient(135deg,#047857,#059669);color:#fff;width:28px;height:28px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:17px;font-weight:700}89/* 品类/价目 */90.cat-tabs{display:flex;gap:8px;padding:0 12px;overflow-x:auto;padding-bottom:4px;scrollbar-width:none;position:sticky;top:0;z-index:99;background:#effaf6}91.cat-tab{padding:8px 14px;border:1px solid #c3e8dd;border-radius:20px;font-size:12px;cursor:pointer;background:#fff;white-space:nowrap;flex-shrink:0}92.cat-tab.sel{border-color:var(--primary);background:var(--primary-light);color:var(--primary-dark);font-weight:600}93.sort-bar{display:flex;gap:14px;padding:10px 12px;font-size:13px;color:#0f766e}94.sort-bar span.on{color:var(--primary);font-weight:700}95.cart-float{position:fixed;bottom:0;left:50%;transform:translateX(-50%);width:100%;max-width:430px;background:#fff;border-top:1px solid #eef3f1;display:flex;align-items:center;padding:10px 12px;padding-bottom:calc(10px + env(safe-area-inset-bottom));z-index:100;gap:10px;box-shadow:0 -2px 8px rgba(0,0,0,.06)}96.cart-float .cf-cart{display:flex;align-items:center;gap:6px;font-size:12px;color:#0f766e}97.cart-float .cf-cart .ico{font-size:24px;position:relative}98.cart-float .cf-cart .num{position:absolute;top:-6px;right:-10px;background:var(--red);color:#fff;border-radius:9px;font-size:9px;padding:1px 5px}99.cart-float .cf-total{flex:1;text-align:right;font-size:12px;color:#8fc2b4}100.cart-float .cf-total b{color:var(--red);font-size:18px}101.cart-float .cf-btn{background:linear-gradient(135deg,#047857,#059669);color:#fff;border-radius:20px;padding:11px 22px;font-size:14px;font-weight:600}102/* 详情 */103.detail-img{height:220px;background:linear-gradient(135deg,#d1fae5,#a7f3d0);display:flex;align-items:center;justify-content:center;font-size:84px;position:relative}104.detail-img .di-badge{position:absolute;top:12px;left:12px;background:rgba(0,0,0,.45);color:#fff;padding:4px 10px;border-radius:12px;font-size:11px}105.detail-price{background:#fff;margin:12px;border-radius:14px;padding:16px}106.detail-price .dp-num{font-size:26px;font-weight:800;color:var(--red)}107.detail-price .dp-num small{font-size:12px;color:#9aa8a4}108.detail-price .dp-meta{font-size:12px;color:#8fc2b4;margin-top:4px;line-height:1.7}109.detail-price .dp-row{display:flex;gap:8px;margin-top:10px}110.detail-price .dp-cell{flex:1;background:var(--light-gray);border-radius:10px;padding:8px;text-align:center;font-size:10px;color:#0f766e;line-height:1.5}111.rule-box{background:#fff;border-radius:14px;margin:12px;padding:16px}112.rule-box .rb-title{font-size:14px;font-weight:700;margin-bottom:10px;display:flex;align-items:center;gap:6px}113.rule-line{display:flex;gap:8px;font-size:12px;line-height:1.9;color:#2c5b50}114.rule-line b{flex-shrink:0}115.rule-line.ok b{color:var(--green)}116.rule-line.no b{color:var(--red)}117.spec-box{background:#fff;margin:12px;border-radius:14px;padding:16px}118.spec-box .sb-title{font-size:14px;font-weight:700;margin-bottom:10px}119.spec-row{display:flex;align-items:center;gap:10px;padding:8px 0;border-bottom:1px solid #f1f9f6}120.spec-row:last-child{border-bottom:none}121.spec-row .sr-label{width:70px;font-size:13px;color:#0f766e;flex-shrink:0}122.spec-row .sr-opts{display:flex;gap:8px;flex:1;flex-wrap:wrap}123.spec-opt{padding:6px 12px;border:1px solid #c3e8dd;border-radius:14px;font-size:12px;cursor:pointer;background:#fff}124.spec-opt.sel{border-color:var(--primary);background:var(--primary-light);color:var(--primary-dark);font-weight:600}125.spec-row .sr-num{display:flex;align-items:center;gap:8px;margin-left:auto}126.spec-row .sr-num i{width:26px;height:26px;border:1px solid #c3e8dd;border-radius:50%;display:flex;align-items:center;justify-content:center;font-style:normal;cursor:pointer}127/* 上门流程 */128.flow-box{background:#fff;border-radius:14px;margin:12px;padding:16px}129.flow-box .fb-title{font-size:14px;font-weight:700;margin-bottom:12px}130.flow-item{display:flex;gap:12px;position:relative;padding-bottom:16px}131.flow-item:last-child{padding-bottom:0}132.flow-item .fi-ico{width:34px;height:34px;border-radius:50%;background:var(--primary-light);display:flex;align-items:center;justify-content:center;font-size:17px;flex-shrink:0;z-index:1}133.flow-item::before{content:"";position:absolute;left:16px;top:34px;bottom:0;width:2px;background:#e0f2ec}134.flow-item:last-child::before{display:none}135.flow-item .fi-name{font-size:13px;font-weight:600}136.flow-item .fi-desc{font-size:11px;color:#8fc2b4;margin-top:2px;line-height:1.6}137.eval-card{background:#fff;border-radius:14px;margin:10px 12px;padding:12px;box-shadow:0 1px 4px rgba(0,0,0,.05)}138.eval-card .ev-head{display:flex;align-items:center;gap:8px;font-size:12px}139.eval-card .ev-avatar{width:28px;height:28px;border-radius:50%;background:var(--primary-light);display:flex;align-items:center;justify-content:center;font-size:14px}140.eval-card .ev-star{color:var(--gold);font-size:11px}141.eval-card .ev-text{font-size:12px;color:#2c5b50;line-height:1.7;margin-top:6px}142.buy-bar{position:fixed;bottom:0;left:50%;transform:translateX(-50%);width:100%;max-width:430px;background:#fff;border-top:1px solid #eef3f1;display:flex;align-items:center;padding:10px 12px;padding-bottom:calc(10px + env(safe-area-inset-bottom));z-index:100;gap:10px}143.buy-bar .bb-cart{display:flex;align-items:center;gap:6px;font-size:12px;color:#0f766e}144.buy-bar .bb-cart .ico{font-size:24px;position:relative}145.buy-bar .bb-cart .num{position:absolute;top:-6px;right:-10px;background:var(--red);color:#fff;border-radius:9px;font-size:9px;padding:1px 5px}146.buy-bar .bb-btn{flex:1;border-radius:20px;padding:11px;text-align:center;color:#fff;font-size:14px;font-weight:600}147.buy-bar .bb-btn.buy{background:linear-gradient(135deg,#ca8a04,#eab308)}148.buy-bar .bb-btn.now{background:linear-gradient(135deg,#047857,#059669)}149/* 清单 */150.cart-item{background:#fff;border-radius:14px;margin:10px 12px;padding:12px;display:flex;gap:12px;align-items:center;box-shadow:0 1px 4px rgba(0,0,0,.05)}151.ci-check{width:22px;height:22px;border-radius:50%;border:2px solid #b3dfd3;flex-shrink:0;display:flex;align-items:center;justify-content:center;color:#fff;font-size:12px;background:#fff}152.ci-check.on,.cart-item.checked .ci-check{background:var(--primary);border-color:var(--primary)}153.cart-item .ci-img{width:70px;height:70px;border-radius:10px;background:var(--primary-light);display:flex;align-items:center;justify-content:center;font-size:32px;flex-shrink:0}154.cart-item .ci-body{flex:1;min-width:0}155.cart-item .ci-name{font-size:13px;font-weight:700}156.cart-item .ci-spec{font-size:11px;color:#8fc2b4;margin-top:2px}157.cart-item .ci-foot{display:flex;justify-content:space-between;align-items:center;margin-top:6px}158.cart-item .ci-price{color:var(--red);font-weight:800}159.cart-item .ci-num{display:flex;align-items:center;gap:8px}160.cart-item .ci-num i{width:24px;height:24px;border:1px solid #c3e8dd;border-radius:50%;display:flex;align-items:center;justify-content:center;font-style:normal;font-size:13px}161.settle-bar{position:fixed;bottom:0;left:50%;transform:translateX(-50%);width:100%;max-width:430px;background:#fff;border-top:1px solid #eef3f1;display:flex;align-items:center;padding:10px 12px;padding-bottom:calc(10px + env(safe-area-inset-bottom));z-index:100;gap:10px}162.settle-bar .sb-all{display:flex;align-items:center;gap:6px;font-size:12px;color:#0f766e}163.settle-bar .sb-total{flex:1;text-align:right;font-size:12px;color:#8fc2b4}164.settle-bar .sb-total b{color:var(--red);font-size:18px}165.settle-bar .sb-btn{background:linear-gradient(135deg,#047857,#059669);color:#fff;border-radius:20px;padding:11px 26px;font-size:14px;font-weight:600}166.check-box{background:#fff;border-radius:14px;margin:12px;padding:16px}167.check-box .cb-row{display:flex;align-items:center;gap:10px;padding:10px 0;border-bottom:1px solid #f1f9f6;font-size:13px}168.check-box .cb-row:last-child{border-bottom:none}169.check-box .cb-label{width:86px;color:#0f766e;flex-shrink:0}170.check-box .cb-val{flex:1;text-align:right;color:#123b32}171.check-box .cb-val.dim{color:#a3cdc1}172.check-box .cb-val .opt{padding:5px 10px;border:1px solid #c3e8dd;border-radius:12px;font-size:12px;margin-left:6px}173.check-box .cb-val .opt.sel{border-color:var(--primary);background:var(--primary-light);color:var(--primary-dark)}174/* 结算 */175.pay-card{background:#fff;border-radius:14px;margin:12px;padding:16px}176.pay-card .pc-row{display:flex;align-items:center;gap:10px;padding:11px 0;border-bottom:1px solid #f1f9f6;font-size:13px}177.pay-card .pc-row:last-child{border-bottom:none}178.pay-card .pc-label{width:76px;color:#0f766e;flex-shrink:0}179.pay-card .pc-val{flex:1;color:#123b32}180.pay-card .pc-val.dim{color:#a3cdc1}181.pay-way{background:#fff;border-radius:14px;margin:12px;padding:16px}182.pay-way .pw-title{font-size:14px;font-weight:700;margin-bottom:8px}183.pay-way .pw-item{display:flex;align-items:center;gap:10px;padding:12px 0;border-bottom:1px solid #f1f9f6;font-size:14px}184.pay-way .pw-item:last-child{border-bottom:none}185.pay-way .pw-ico{font-size:24px}186.pay-way .pw-radio{margin-left:auto;width:20px;height:20px;border-radius:50%;border:2px solid #b3dfd3;display:flex;align-items:center;justify-content:center;color:#fff;font-size:11px}187.pay-way .pw-item.sel .pw-radio{background:var(--primary);border-color:var(--primary)}188/* 订单 */189.order-tabs{display:flex;background:#fff;border-bottom:1px solid #f1f9f6;position:sticky;top:0;z-index:99}190.order-tabs a{flex:1;text-align:center;padding:12px 4px;font-size:13px;color:#0f766e;position:relative}191.order-tabs a.active{color:var(--primary);font-weight:700}192.order-tabs a.active::after{content:"";position:absolute;bottom:0;left:25%;width:50%;height:3px;background:var(--primary);border-radius:3px}193.order-card{background:#fff;border-radius:14px;margin:10px 12px;padding:14px;box-shadow:0 1px 4px rgba(0,0,0,.05)}194.order-card .oc-head{display:flex;justify-content:space-between;font-size:12px;color:#9aa8a4;padding-bottom:10px;border-bottom:1px solid #f1f9f6}195.order-card .oc-head .st{color:var(--primary);font-weight:700}196.order-card .oc-goods{display:flex;gap:10px;padding:10px 0;align-items:center}197.order-card .oc-goods .og-img{width:52px;height:52px;border-radius:8px;background:var(--primary-light);display:flex;align-items:center;justify-content:center;font-size:24px}198.order-card .oc-goods .og-name{font-size:13px;font-weight:600;flex:1}199.order-card .oc-goods .og-price{font-size:12px;color:#9aa8a4}200.order-card .oc-foot{display:flex;justify-content:space-between;align-items:center;font-size:12px;color:#9aa8a4}201.order-card .oc-foot b{color:var(--red);font-size:15px}202.order-card .oc-ops{display:flex;gap:8px;margin-top:10px;justify-content:flex-end}203.order-card .oc-ops i{padding:6px 14px;border:1px solid #c3e8dd;border-radius:15px;font-style:normal;font-size:12px}204.order-card .oc-ops i.main{background:linear-gradient(135deg,#047857,#059669);color:#fff;border-color:transparent}205.call-bar{display:flex;gap:8px;margin:10px 12px}206.call-bar i{flex:1;text-align:center;padding:9px 0;border:1px solid #c3e8dd;border-radius:14px;font-style:normal;font-size:12px;color:#0f766e}207.call-bar i.main{background:var(--primary-light);color:var(--primary-dark);border-color:var(--primary);font-weight:600}208.status-line{background:#fff;border-radius:14px;margin:12px;padding:16px}209.status-line .sl-dot{display:flex;gap:12px;position:relative;padding-bottom:16px}210.status-line .sl-dot:last-child{padding-bottom:0}211.status-line .sl-c{width:14px;height:14px;border-radius:50%;background:#cfeae2;flex-shrink:0;margin-top:2px;position:relative;z-index:1}212.status-line .sl-dot.done .sl-c{background:var(--green)}213.status-line .sl-dot.now .sl-c{background:#f59e0b;box-shadow:0 0 0 4px #fef5e0}214.status-line .sl-dot::before{content:"";position:absolute;left:6px;top:16px;bottom:-2px;width:2px;background:#e0f2ec}215.status-line .sl-dot:last-child::before{display:none}216.status-line .sl-title{font-size:13px;font-weight:600}217.status-line .sl-time{font-size:11px;color:#9aa8a4;margin-top:2px}218.track-bar{background:#fff;border-radius:14px;margin:12px;padding:16px;display:flex;align-items:center;gap:12px}219.track-bar .tb-ico{font-size:30px}220.track-bar .tb-body{flex:1}221.track-bar .tb-body b{font-size:14px}222.track-bar .tb-body span{font-size:11px;color:#9aa8a4;display:block;margin-top:2px}223.track-bar .tb-btn{background:var(--primary-light);color:var(--primary-dark);padding:8px 14px;border-radius:16px;font-size:12px;font-weight:700}224.weigh-box{background:#fff;border-radius:14px;margin:12px;padding:16px}225.weigh-box .wb-title{font-size:14px;font-weight:700;margin-bottom:8px}226.weigh-row{display:flex;justify-content:space-between;font-size:12px;padding:7px 0;border-bottom:1px dashed #e6f7f1}227.weigh-row:last-child{border-bottom:none}228.weigh-row .wr-k{color:#0f766e}229.weigh-row .wr-v{font-weight:600}230/* 环保中心 */231.eco-card{background:linear-gradient(135deg,#064e3b,#047857,#10b981);margin:12px;border-radius:16px;color:#fff;padding:20px;position:relative;overflow:hidden}232.eco-card::after{content:"♻️";position:absolute;right:8px;top:6px;font-size:46px;opacity:.22}233.eco-card .ec-level{font-size:13px;opacity:.9}234.eco-card .ec-name{font-size:20px;font-weight:800;margin-top:2px}235.eco-card .ec-exp{font-size:11px;opacity:.85;margin-top:4px}236.eco-card .ec-bar{height:6px;background:rgba(255,255,255,.25);border-radius:3px;margin-top:14px;position:relative}237.eco-card .ec-bar i{display:block;height:100%;width:64%;background:linear-gradient(90deg,#a3e635,#facc15);border-radius:3px}238.assets{display:grid;grid-template-columns:repeat(4,1fr);gap:8px;padding:0 12px}239.asset-item{background:#fff;border-radius:12px;text-align:center;padding:12px 2px;box-shadow:0 1px 4px rgba(0,0,0,.05)}240.asset-item b{display:block;font-size:16px;color:var(--primary-dark)}241.asset-item span{font-size:10px;color:#9aa8a4}242.sign-btn{background:linear-gradient(135deg,#ca8a04,#eab308);color:#fff;border-radius:20px;padding:11px;text-align:center;font-size:14px;font-weight:700;margin:12px;cursor:pointer}243.sign-btn.done{background:#cfeae2;color:#6fa294}244.eco-report{background:#fff;border-radius:14px;margin:12px;padding:16px}245.eco-report .er-title{font-size:14px;font-weight:700;margin-bottom:10px}246.eco-report .er-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;text-align:center}247.eco-report .er-cell{background:var(--light-gray);border-radius:10px;padding:12px 4px}248.eco-report .er-cell b{display:block;font-size:17px;color:var(--primary-dark)}249.eco-report .er-cell span{font-size:10px;color:#7aa99c}250.eco-report .er-note{font-size:11px;color:#8fc2b4;margin-top:12px;line-height:1.8;background:#f6fdfa;border-radius:8px;padding:10px}251.mall-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;padding:0 12px}252.mall-item{background:#fff;border-radius:12px;padding:10px;text-align:center;box-shadow:0 1px 4px rgba(0,0,0,.05)}253.mall-item .mi-img{height:60px;border-radius:10px;background:var(--primary-light);display:flex;align-items:center;justify-content:center;font-size:30px}254.mall-item .mi-name{font-size:11px;margin-top:6px;font-weight:600}255.mall-item .mi-pts{font-size:11px;color:var(--orange);margin-top:3px;font-weight:700}256.badge-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:10px;padding:0 12px}257.badge-item{text-align:center}258.badge-item .bi-ico{width:54px;height:54px;margin:0 auto;border-radius:50%;background:linear-gradient(135deg,#facc15,#ca8a04);display:flex;align-items:center;justify-content:center;font-size:26px;color:#fff}259.badge-item.lock .bi-ico{background:#e2e8e6;color:#9aa8a4}260.badge-item .bi-name{font-size:10px;margin-top:6px;color:#2c5b50}261.vip-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:10px;padding:0 12px}262.vip-item{background:#fff;border-radius:12px;padding:14px;box-shadow:0 1px 4px rgba(0,0,0,.05)}263.vip-item .vi-emoji{font-size:26px}264.vip-item .vi-name{font-size:13px;font-weight:700;margin-top:4px}265.vip-item .vi-desc{font-size:10px;color:#8fc2b4;margin-top:2px;line-height:1.5}266/* 我的 */267.user-card{background:linear-gradient(135deg,#064e3b,#059669);margin:12px;border-radius:14px;color:#fff;padding:18px;display:flex;align-items:center;gap:12px}268.user-card .uc-avatar{width:56px;height:56px;border-radius:50%;background:rgba(255,255,255,.25);display:flex;align-items:center;justify-content:center;font-size:30px}269.user-card .uc-name{font-size:17px;font-weight:600}270.user-card .uc-level{font-size:12px;opacity:.9;margin-top:3px}271.order-entry{background:#fff;border-radius:12px;margin:12px;display:flex;padding:14px 0}272.order-entry a{flex:1;text-align:center;font-size:11px;color:#0f766e}273.order-entry a .oe-ico{font-size:22px;display:block;margin-bottom:4px;position:relative}274.order-entry a .oe-num{position:absolute;top:-6px;right:-8px;background:var(--red);color:#fff;border-radius:8px;font-size:9px;padding:1px 4px}275.menu-list{background:#fff;border-radius:12px;margin:12px;overflow:hidden}276.menu-list a{display:flex;align-items:center;justify-content:space-between;padding:14px 16px;border-bottom:1px solid #f1f9f6;font-size:14px}277.menu-list a:last-child{border-bottom:none}278.menu-list a .ml-l{display:flex;align-items:center;gap:10px}279.menu-list a .ml-l .ico{font-size:20px}280.menu-list a .ml-r{color:#ccc;font-size:12px}281.empty{text-align:center;color:#a3cdc1;font-size:13px;padding:40px 0}282"""283284DATA = """// 某杰废品回收站 · 演示数据285window.DATA = {286  categories: ["废纸类", "塑料类", "金属类", "旧衣物", "旧家电", "电子数码"],287  products: [288    { id: 1, img: "📦", name: "黄板纸箱", cat: "废纸类", price: 1.2, unit: "公斤", old: 1.0, sales: 86000, origin: "全市回收", tags: ["按斤计价", "量大加价"], desc: "快递纸箱、家电外箱,拆开压平更好称重,湿水霉变不收", hot: true, new: false },289    { id: 2, img: "📰", name: "旧报纸", cat: "废纸类", price: 1.5, unit: "公斤", old: 1.3, sales: 42000, origin: "全市回收", tags: ["按斤计价"], desc: "报纸、书刊杂志,干净无油污,捆扎整齐上门价更高", hot: false, new: false },290    { id: 3, img: "📚", name: "书本纸", cat: "废纸类", price: 1.4, unit: "公斤", old: 1.2, sales: 51000, origin: "全市回收", tags: ["毕业季加价"], desc: "课本、书籍、笔记本,需去掉塑料书皮与铁夹", hot: false, new: false },291    { id: 4, img: "🧴", name: "矿泉水瓶", cat: "塑料类", price: 2.2, unit: "公斤", old: 1.9, sales: 66000, origin: "全市回收", tags: ["去盖", "踩扁"], desc: "PET 透明饮料瓶,去瓶盖去标签踩扁后称重更划算", hot: true, new: false },292    { id: 5, img: "🪣", name: "塑料桶/盆", cat: "塑料类", price: 1.8, unit: "公斤", old: 1.6, sales: 28000, origin: "全市回收", tags: ["洗净"], desc: "PP/PE 硬质塑料桶盆,需清空洗净无残留", hot: false, new: false },293    { id: 6, img: "🧊", name: "泡沫箱", cat: "塑料类", price: 0.6, unit: "公斤", old: 0.5, sales: 19000, origin: "全市回收", tags: ["体积大"], desc: "生鲜泡沫箱、EPS 泡沫,体积大需提前预约大车", hot: false, new: false },294    { id: 7, img: "🔩", name: "废铁/铁皮", cat: "金属类", price: 2.6, unit: "公斤", old: 2.3, sales: 39000, origin: "全市回收", tags: ["高价", "当场结算"], desc: "铁管、铁皮、旧五金,需去除水泥与塑料附着物", hot: true, new: false },295    { id: 8, img: "🔶", name: "废铜线", cat: "金属类", price: 48.0, unit: "公斤", old: 44.0, sales: 12000, origin: "全市回收", tags: ["单价最高"], desc: "光亮铜线、紫铜件,剥皮纯铜价更高,当日现结", hot: true, new: false },296    { id: 9, img: "🥫", name: "易拉罐/铝", cat: "金属类", price: 12.0, unit: "公斤", old: 10.5, sales: 33000, origin: "全市回收", tags: ["踩扁"], desc: "铝制易拉罐、铝合金门窗料,踩扁后上门收取", hot: false, new: false },297    { id: 10, img: "🍳", name: "不锈钢餐具", cat: "金属类", price: 8.5, unit: "公斤", old: 7.5, sales: 21000, origin: "全市回收", tags: ["按材质"], desc: "不锈钢盆、锅、餐具,需区分 304 与 201 材质", hot: false, new: false },298    { id: 11, img: "👕", name: "旧衣服", cat: "旧衣物", price: 0.8, unit: "公斤", old: 0.6, sales: 74000, origin: "全市回收", tags: ["免费上门"], desc: "四季衣物、床单被罩,干净无破损,一袋式打包更方便", hot: true, new: false },299    { id: 12, img: "👟", name: "旧鞋子", cat: "旧衣物", price: 1.2, unit: "公斤", old: 1.0, sales: 26000, origin: "全市回收", tags: ["成双"], desc: "运动鞋、皮鞋,需成双成对无严重破损", hot: false, new: false },300    { id: 13, img: "🛏️", name: "旧棉被毛毯", cat: "旧衣物", price: 0.5, unit: "公斤", old: 0.4, sales: 15000, origin: "全市回收", tags: ["大件"], desc: "棉被、毛毯、羽绒服,需干燥无霉味", hot: false, new: false },301    { id: 14, img: "❄️", name: "旧空调", cat: "旧家电", price: 350, unit: "台", old: 300, sales: 8600, origin: "上门拆装", tags: ["一口价", "包拆装"], desc: "壁挂/柜机空调,含拆机搬运,含铜管按米另补", hot: true, new: false },302    { id: 15, img: "🧊", name: "旧冰箱", cat: "旧家电", price: 180, unit: "台", old: 150, sales: 7200, origin: "上门搬运", tags: ["一口价"], desc: "单门/双门冰箱均可,需提前清空食物并断电", hot: false, new: false },303    { id: 16, img: "🌀", name: "旧洗衣机", cat: "旧家电", price: 120, unit: "台", old: 100, sales: 9100, origin: "上门搬运", tags: ["一口价"], desc: "波轮/滚筒洗衣机,需放空余水便于搬运", hot: false, new: false },304    { id: 17, img: "📱", name: "旧手机", cat: "电子数码", price: 60, unit: "台", old: 45, sales: 24000, origin: "上门回收", tags: ["数据清除", "隐私保障"], desc: "智能机/功能机均可,现场抹除数据并出具隐私承诺单", hot: true, new: true },305    { id: 18, img: "💻", name: "旧电脑主机", cat: "电子数码", price: 150, unit: "台", old: 120, sales: 6800, origin: "上门回收", tags: ["含硬盘"], desc: "台式主机、笔记本、平板,硬盘可现场拆除留存", hot: false, new: true }306  ],307  priceNews: [308    { name: "废铜线", price: "48.0/公斤", chg: "+3%", dir: "up" },309    { name: "废铁", price: "2.6/公斤", chg: "+5%", dir: "up" },310    { name: "黄板纸", price: "1.2/公斤", chg: "-2%", dir: "down" },311    { name: "矿泉水瓶", price: "2.2/公斤", chg: "+1%", dir: "up" }312  ],313  seckills: [314    { img: "📦", name: "纸箱加价", price: "1.4", old: 1.2 },315    { img: "👕", name: "旧衣加价", price: "1.0", old: 0.8 },316    { img: "🥫", name: "铝罐加价", price: "13", old: 12 },317    { img: "🔩", name: "废铁加价", price: "2.9", old: 2.6 }318  ],319  flow: [320    { ico: "📝", name: "线上预约", desc: "选品类、填预估重量与地址,选上门时段(精确到 1 小时)" },321    { ico: "🚴", name: "回收员接单", desc: "LBS 就近派单,实时看回收员位置与预计到达时间" },322    { ico: "⚖️", name: "上门称重", desc: "蓝牙电子秤自动回传重量,杜绝缺斤短两与坐地压价" },323    { ico: "💰", name: "当场结算", desc: "金额实时显示,微信零钱 / 平台余额即时到账" },324    { ico: "🧾", name: "电子单据", desc: "生成含品类/重量/金额的电子清单,可保存可分享" }325  ],326  rulesOk: [327    "纸箱请拆开压平,去掉胶带与泡沫填充物",328    "瓶类请清空液体、去瓶盖与标签并踩扁",329    "衣物请清洗晾干后打包,一袋式混装按统货价",330    "家电请提前清空并断电,留出搬运通道"331  ],332  rulesNo: [333    "油漆桶、农药瓶等危险废弃物一律不回收",334    "医疗垃圾、注射器等涉疫物品不回收",335    "混入大量生活垃圾、建筑垃圾的统货不回收",336    "来源不明、涉嫌赃物的物品不回收并报警"337  ],338  evals: [339    { avatar: "🧑", name: "王女士 · 阳光小区", star: "★★★★★", text: "预约后 40 分钟就到了,称重当场给我看秤,废纸箱的钱直接微信到账,比楼下小贩高不少。" },340    { avatar: "👨‍🍳", name: "川味小馆 张老板", star: "★★★★★", text: "店里每天有纸箱和塑料桶,现在固定每周三预约,月结对账还有发票,省了我不少事。" },341    { avatar: "👩", name: "李同学 · 毕业季", star: "★★★★☆", text: "宿舍清仓一堆书和衣服,一袋式打包一次上门全收走,还送了环保积分换了纸巾。" }342  ],343  coupons: [344    { name: "新人首单加价券", val: "+10%", cond: "首单可用" },345    { name: "满量加价券", val: "+8%", cond: "满 50 公斤" },346    { name: "积分兑换券", val: "500分", cond: "换日用好物" }347  ],348  pointsMall: [349    { img: "🧻", name: "抽纸 3 包", pts: 500 },350    { img: "🧴", name: "洗衣液 1kg", pts: 1200 },351    { img: "🍚", name: "大米 2.5kg", pts: 2000 },352    { img: "🎟️", name: "10 元抵扣券", pts: 800 },353    { img: "🌱", name: "公益植树 1 棵", pts: 3000 },354    { img: "🧼", name: "洗洁精 500g", pts: 600 }355  ],356  medals: [357    { ico: "🏅", name: "首次回收", got: true },358    { ico: "🥈", name: "累计100kg", got: true },359    { ico: "🥇", name: "累计1吨", got: false },360    { ico: "🌳", name: "减碳达人", got: false }361  ],362  stores: [363    { name: "阳光北路回收站", dist: "0.8km", time: "07:00-20:00", addr: "阳光北路 128 号" },364    { name: "城东再生资源分拣中心", dist: "3.6km", time: "06:00-21:00", addr: "城东工业园 A 区" }365  ],366  orderStatus: [367    { title: "已预约 · 等待回收员接单", time: "13:05", done: true },368    { title: "已接单 · 回收员 李师傅 已确认", time: "13:12", done: true },369    { title: "回收员出发 · 距您 1.2km", time: "13:26", now: true },370    { title: "上门中 · 正在称重计价", time: "预计 13:45", done: false },371    { title: "已完成 · 款项即时到账", time: "待完成", done: false }372  ]373};374"""375376APP = """// 某杰废品回收站 · 交互逻辑377document.addEventListener('click', function (e) {378  var t = e.target.closest('[data-toast]');379  if (t) { toast(t.getAttribute('data-toast')); }380  var ct = e.target.closest('.cat-tab');381  if (ct) {382    var wrap = ct.parentElement;383    [].forEach.call(wrap.children, function (x) { x.classList.remove('sel'); });384    ct.classList.add('sel');385    var kw = ct.textContent;386    var cards = document.querySelectorAll('.goods-card');387    [].forEach.call(cards, function (c) {388      c.style.display = (kw === '全部' || c.getAttribute('data-cat') === kw) ? 'flex' : 'none';389    });390  }391  var so = e.target.closest('.sort-bar span');392  if (so) {393    var w2 = so.parentElement;394    [].forEach.call(w2.children, function (x) { x.classList.remove('on'); });395    so.classList.add('on');396  }397  var sp = e.target.closest('.spec-opt');398  if (sp) {399    var grp = sp.parentElement;400    [].forEach.call(grp.children, function (x) { x.classList.remove('sel'); });401    sp.classList.add('sel');402  }403  var sn = e.target.closest('.sr-num i');404  if (sn) {405    var b = sn.parentElement.querySelector('b');406    var v = parseInt(b.textContent) || 1;407    v = sn.textContent === '+' ? v + 1 : Math.max(1, v - 1);408    b.textContent = v;409  }410  var ci = e.target.closest('.ci-num i');411  if (ci) {412    var b = ci.parentElement.querySelector('b');413    var v = parseInt(b.textContent) || 1;414    v = ci.textContent === '+' ? v + 1 : Math.max(1, v - 1);415    b.textContent = v;416  }417  var ck = e.target.closest('.ci-check');418  if (ck) { ck.parentElement.classList.toggle('checked'); ck.classList.toggle('on'); }419  var opt = e.target.closest('.cb-val .opt');420  if (opt) {421    var grp = opt.parentElement;422    [].forEach.call(grp.children, function (x) { x.classList.remove('sel'); });423    opt.classList.add('sel');424  }425  var pw = e.target.closest('.pw-item');426  if (pw) {427    var box = pw.parentElement;428    [].forEach.call(box.children, function (x) { x.classList.remove('sel'); });429    pw.classList.add('sel');430  }431  var sg = e.target.closest('.sign-btn');432  if (sg && !sg.classList.contains('done')) { sg.classList.add('done'); sg.textContent = '今日已签到 +20 环保积分'; toast('签到成功,环保积分 +20'); }433  var cp = e.target.closest('.cc-btn');434  if (cp) { cp.textContent = '已领取'; cp.style.opacity = '.6'; toast('加价券已到账'); }435  var mg = e.target.closest('.mall-item');436  if (mg) { toast('兑换申请已提交,客服将联系发货'); }437});438// 加价活动倒计时439(function () {440  var box = document.querySelector('.sk-time');441  if (!box) return;442  var total = 3 * 3600 + 24 * 60 + 10;443  setInterval(function () {444    total--;445    if (total < 0) total = 86399;446    var h = Math.floor(total / 3600), m = Math.floor(total % 3600 / 60), s = total % 60;447    var z = function (n) { return n < 10 ? '0' + n : '' + n; };448    box.innerHTML = '<i>' + z(h) + '</i>:<i>' + z(m) + '</i>:<i>' + z(s) + '</i>';449  }, 1000);450})();451function toast(msg) {452  var d = document.createElement('div');453  d.style.cssText = 'position:fixed;left:50%;bottom:110px;transform:translateX(-50%);background:rgba(6,78,59,.92);color:#fff;padding:10px 20px;border-radius:20px;font-size:13px;z-index:999;max-width:80%;text-align:center';454  d.textContent = msg;455  document.body.appendChild(d);456  setTimeout(function () { d.remove(); }, 1800);457}458"""459460def page(title, active, body, tabbar):461    # 内联渲染脚本依赖 window.DATA,必须提取到 data.js 之后执行,462    # 否则脚本先于 data.js 运行会因 window.DATA 未定义而渲染空白。463    inline_scripts = re.findall(r'<script>(.*?)</script>', body, re.S)464    body_clean = re.sub(r'<script>.*?</script>', '', body, flags=re.S)465    inline_html = "".join("<script>" + s + "</script>" for s in inline_scripts)466    return """<!DOCTYPE html>467<html lang="zh-CN">468<head>469<meta charset="UTF-8"/>470<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"/>471<title>""" + title + """</title>472<link rel="stylesheet" href="style.css"/>473</head>474<body>475""" + body_clean + """476""" + tabbar + """477<script src="data.js"></script>478""" + inline_html + """479<script src="app.js"></script>480</body>481</html>"""482483def tabbar(active):484    items = [485        ("index.html", "🏠", "首页"),486        ("category.html", "💰", "回收价"),487        ("cart.html", "📋", "回收单"),488        ("member.html", "🌱", "环保"),489        ("mine.html", "👤", "我的"),490    ]491    h = '<nav class="tabbar">'492    for href, icon, name in items:493        cls = ' active' if name == active else ''494        h += '<a class="' + cls + '" href="' + href + '"><span class="icon">' + icon + '</span>' + name + '</a>'495    return h + '</nav>'496497def header(title, back=True, right=""):498    b = '<a class="back" onclick="history.back()">‹</a>' if back else '<span class="back"></span>'499    return '<header class="header">' + b + '<h1>' + title + '</h1><span class="right">' + right + '</span></header>'500501INDEX = """502<div class="location-bar">503  <span class="lb-ico">📍</span>504  <span class="lb-city">西安市</span>505  <span class="lb-area">雁塔区 · 阳光北路片区(可上门)</span>506  <span class="lb-chg" data-toast="已重新定位到当前位置">切换</span>507</div>508<div class="banner">509  <div>510    <div class="bn-title">某杰废品回收站</div>511    <div class="bn-sub">上门回收 · 当场称重 · 即时到账<br/>废纸/塑料/金属/旧衣/家电/数码全品类</div>512    <div class="bn-badge">🎁 新人首单加价 10%</div>513  </div>514  <div class="bn-emoji">♻️</div>515</div>516<div class="search-box" data-toast="拍照识别:上传照片自动匹配品类">517  <span class="s-ico">🔍</span>518  <input placeholder="搜品类,如 旧空调 / 易拉罐 / 纸箱…"/>519  <span class="s-btn">搜索</span>520</div>521<div class="cat-grid">522  <a href="category.html"><span class="c-emoji">📦</span><span class="c-name">废纸类</span></a>523  <a href="category.html"><span class="c-emoji">🧴</span><span class="c-name">塑料类</span></a>524  <a href="category.html"><span class="c-emoji">🔩</span><span class="c-name">金属类</span></a>525  <a href="category.html"><span class="c-emoji">👕</span><span class="c-name">旧衣物</span></a>526  <a href="category.html"><span class="c-emoji">❄️</span><span class="c-name">旧家电</span></a>527  <a href="category.html"><span class="c-emoji">📱</span><span class="c-name">电子数码</span></a>528</div>529<div class="quick-grid">530  <a href="cart.html"><div class="qicon">🚴</div>预约上门</a>531  <a data-toast="请输入预估重量,已为您估算收益"><div class="qicon">🧮</div>一键估价</a>532  <a href="category.html"><div class="qicon">💴</div>回收价目</a>533  <a href="member.html"><div class="qicon">🌱</div>环保积分</a>534  <a data-toast="已展示附近 2 个回收站"><div class="qicon">🏪</div>附近站点</a>535</div>536<div class="price-news">537  <div class="pn-head">📈 今日回收价 <span class="pn-tag">行情实时更新</span></div>538  <div id="priceList"></div>539</div>540<div class="seckill">541  <div class="sk-head"><b>⚡ 限时加价活动</b><div class="sk-time"><i>03</i>:<i>24</i>:<i>10</i></div></div>542  <div class="sk-body" id="skList"></div>543</div>544<div class="coupon-card" style="background:linear-gradient(135deg,#047857,#059669);margin:12px;border-radius:14px;padding:14px;display:flex;align-items:center;gap:12px;color:#fff">545  <div style="flex:1"><b style="font-size:17px;display:block">新人首单加价 10%</b><span style="font-size:11px;opacity:.9">首单专属 · 与满量加价可叠加</span></div>546  <div class="cc-btn" data-toast="加价券已到账" style="background:#fff;color:#047857;padding:8px 16px;border-radius:16px;font-size:12px;font-weight:700">立即领取</div>547</div>548<div class="section-title">🔥 高价回收品类 <span>当场称重现结</span></div>549<div class="goods-card" data-toast="已加入回收单">550  <div class="gc-img">🔶</div>551  <div class="gc-body">552    <div class="gc-name">废铜线 <span class="badge badge-hot">单价最高</span></div>553    <div class="gc-desc">光亮铜线、紫铜件,剥皮纯铜价更高,当日现结</div>554    <div class="gc-meta">月收 1.2 万公斤 · 全市回收 · 按斤计价/高价</div>555    <div class="gc-foot"><div class="gc-price">¥48<small> /公斤</small></div><div class="gc-add">+</div></div>556  </div>557</div>558<div class="section-title">♻️ 上门回收流程</div>559<div class="flow-box" style="margin-top:0">560  <div id="flowList"></div>561</div>562<div class="section-title">🏪 附近回收站 / 自提点</div>563<div id="storeList"></div>564<script>565  var pl = document.getElementById('priceList');566  var h0 = '';567  window.DATA.priceNews.forEach(function (x) {568    h0 += '<div class="pn-item"><span class="pn-name">' + x.name + '</span><span class="pn-price">' + x.price + '</span>'569      + '<span class="pn-chg ' + x.dir + '">' + x.chg + '</span></div>';570  });571  pl.innerHTML = h0;572  var sk = document.getElementById('skList');573  var h = '';574  window.DATA.seckills.forEach(function (x) {575    h += '<div class="sk-item"><div class="sk-img">' + x.img + '</div><div class="sk-name">' + x.name + '</div>'576      + '<div class="sk-price">¥' + x.price + '</div><div class="sk-old">原¥' + x.old + '</div></div>';577  });578  sk.innerHTML = h;579  var fl = document.getElementById('flowList');580  var h2 = '';581  window.DATA.flow.forEach(function (f) {582    h2 += '<div class="flow-item"><div class="fi-ico">' + f.ico + '</div><div>'583      + '<div class="fi-name">' + f.name + '</div><div class="fi-desc">' + f.desc + '</div></div></div>';584  });585  fl.innerHTML = h2;586  var sl = document.getElementById('storeList');587  var h3 = '';588  window.DATA.stores.forEach(function (s) {589    h3 += '<div class="goods-card"><div class="gc-img">🏪</div><div class="gc-body">'590      + '<div class="gc-name">' + s.name + ' <span class="tag">' + s.dist + '</span></div>'591      + '<div class="gc-desc">' + s.addr + ' · 营业 ' + s.time + '</div>'592      + '<div class="gc-foot"><div class="gc-add" data-toast="已发起导航" style="width:auto;height:auto;border-radius:14px;padding:6px 14px;font-size:12px">去这里</div></div></div></div>';593  });594  sl.innerHTML = h3;595</script>596"""597598CATEGORY = """599""" + header("回收价目表", back=False, right="🔍") + """600<div style="text-align:center;font-size:11px;color:#8fc2b4;padding:10px 0 0">价格随行情每日更新 · 上门实称实结算,不以预估价为准</div>601<div class="cat-tabs" style="margin-top:8px"></div>602<div class="sort-bar"><span class="on">综合排序</span><span>回收价从高</span><span>推荐优先</span></div>603<div id="catList"></div>604<div class="cart-float">605  <div class="cf-cart"><span class="ico">📋<span class="num">3</span></span>回收单</div>606  <div class="cf-total">预估 <b>¥86</b></div>607  <div class="cf-btn" data-toast="已跳转回收单">去预约</div>608</div>609<script>610  var ctw = document.querySelector('.cat-tabs');611  var h0 = '<div class="cat-tab sel">全部</div>';612  window.DATA.categories.forEach(function (c) {613    h0 += '<div class="cat-tab">' + c + '</div>';614  });615  ctw.innerHTML = h0;616  var cl = document.getElementById('catList');617  var h = '';618  window.DATA.products.forEach(function (b) {619    h += '<div class="goods-card" data-cat="' + b.cat + '"><div class="gc-img">' + b.img + '</div><div class="gc-body">'620      + '<div class="gc-name">' + b.name + (b.hot ? ' <span class="badge badge-hot">高价</span>' : '') + (b.new ? ' <span class="badge badge-new">新收</span>' : '') + '</div>'621      + '<div class="gc-desc">' + b.desc + '</div>'622      + '<div class="gc-meta">月收 ' + b.sales.toLocaleString() + ' · ' + b.origin + ' · ' + b.tags.join('/') + '</div>'623      + '<div class="gc-foot"><div class="gc-price">¥' + b.price + '<small> /' + b.unit + (b.old ? ' 涨' + b.old : '') + '</small></div>'624      + '<div class="gc-add" data-toast="已加入回收单">+</div></div></div></div>';625  });626  cl.innerHTML = h;627</script>628"""629630DETAIL = """631""" + header("品类详情") + """632<div class="detail-img"><div class="di-badge">📷 支持拍照识别品类</div>🔶</div>633<div class="detail-price">634  <div class="dp-num">¥48<small> /公斤</small> <span style="color:#059669;font-size:13px">会员加价 5%</span></div>635  <div class="dp-meta">废铜线 · 光亮紫铜价更高 · 上门实称实结算 · 当场现结</div>636  <div class="dp-row">637    <div class="dp-cell">📅 今日行情<br/>+3%</div>638    <div class="dp-cell">⚖️ 计价方式<br/>按公斤</div>639    <div class="dp-cell">🚴 上门时效<br/>1 小时内</div>640    <div class="dp-cell">💰 结算<br/>微信零钱</div>641  </div>642</div>643<div class="spec-box">644  <div class="sb-title">预估回收量</div>645  <div class="spec-row"><span class="sr-label">品类</span><div class="sr-opts"><div class="spec-opt sel">光亮铜线</div><div class="spec-opt">带皮铜线</div><div class="spec-opt">紫铜件</div></div></div>646  <div class="spec-row"><span class="sr-label">预估重量</span><div class="sr-opts"><div class="spec-opt sel">5 公斤</div><div class="spec-opt">10 公斤</div><div class="spec-opt">20 公斤+</div></div></div>647  <div class="spec-row"><span class="sr-label">数量</span><div class="sr-num"><i>-</i><b>1</b><i>+</i></div></div>648  <div style="font-size:11px;color:#8fc2b4;margin-top:10px">预估收益约 <b style="color:#dc2626">¥240</b>(以上门实称重量为准)</div>649</div>650<div class="rule-box">651  <div class="rb-title">✅ 回收标准</div>652  <div class="rule-line ok"><b>收:</b><span>纸箱请拆开压平,去掉胶带与泡沫填充物</span></div>653  <div class="rule-line ok"><b>收:</b><span>瓶类请清空液体、去瓶盖与标签并踩扁</span></div>654  <div class="rule-line ok"><b>收:</b><span>衣物请清洗晾干后打包,一袋式混装按统货价</span></div>655  <div class="rule-line ok"><b>收:</b><span>家电请提前清空并断电,留出搬运通道</span></div>656  <div class="rule-line no" style="margin-top:6px"><b>不收:</b><span>油漆桶、农药瓶等危险废弃物</span></div>657  <div class="rule-line no"><b>不收:</b><span>医疗垃圾、注射器等涉疫物品</span></div>658  <div class="rule-line no"><b>不收:</b><span>混入大量生活垃圾、建筑垃圾的统货</span></div>659  <div class="rule-line no"><b>不收:</b><span>来源不明、涉嫌赃物的物品(将报警处理)</span></div>660</div>661<div class="section-title">📋 上门回收流程</div>662<div class="flow-box" style="margin-top:0">663  <div id="flowList2"></div>664</div>665<div class="section-title">💬 回收用户评价(2360+)</div>666<div id="evalList"></div>667<div class="section-title">❤️ 猜你还想回收</div>668<div id="guessList" style="display:flex;gap:10px;overflow-x:auto;padding:0 12px;scrollbar-width:none"></div>669<div style="height:70px"></div>670<div class="buy-bar">671  <div class="bb-cart"><span class="ico">📋<span class="num">3</span></span>回收单</div>672  <div class="bb-btn buy" data-toast="已加入回收单">加入回收单</div>673  <div class="bb-btn now" data-toast="预约成功,回收员将尽快接单">立即预约</div>674</div>675<script>676  var fl = document.getElementById('flowList2');677  var h1 = '';678  window.DATA.flow.forEach(function (f) {679    h1 += '<div class="flow-item"><div class="fi-ico">' + f.ico + '</div><div>'680      + '<div class="fi-name">' + f.name + '</div><div class="fi-desc">' + f.desc + '</div></div></div>';681  });682  fl.innerHTML = h1;683  var el = document.getElementById('evalList');684  var h = '';685  window.DATA.evals.forEach(function (x) {686    h += '<div class="eval-card"><div class="ev-head"><div class="ev-avatar">' + x.avatar + '</div>'687      + '<div>' + x.name + '</div><div class="ev-star">' + x.star + '</div>'688      + '</div><div class="ev-text">' + x.text + '</div></div>';689  });690  el.innerHTML = h;691  var gl = document.getElementById('guessList');692  var h2 = '';693  window.DATA.products.slice(6, 10).forEach(function (b) {694    h2 += '<div class="sk-item" style="width:110px"><div class="sk-img" style="height:80px">' + b.img + '</div>'695      + '<div class="sk-name">' + b.name + '</div><div class="sk-price">¥' + b.price + '</div></div>';696  });697  gl.innerHTML = h2;698</script>699"""700701CART = """702""" + header("我的回收单") + """703<div style="text-align:center;font-size:11px;color:#8fc2b4;padding:12px 16px 0">预约后回收员上门实称,预估金额仅供参考,多退少补</div>704<div class="cart-item checked">705  <div class="ci-check">✓</div>706  <div class="ci-img">📦</div>707  <div class="ci-body">708    <div class="ci-name">黄板纸箱 <span class="badge badge-org">加价中</span></div>709    <div class="ci-spec">按公斤 · 预估 20 公斤</div>710    <div class="ci-foot"><div class="ci-price">¥1.4/公斤</div><div class="ci-num"><i>-</i><b>20</b><i>+</i></div></div>711  </div>712</div>713<div class="cart-item checked">714  <div class="ci-check">✓</div>715  <div class="ci-img">🧴</div>716  <div class="ci-body">717    <div class="ci-name">矿泉水瓶</div>718    <div class="ci-spec">按公斤 · 去掉瓶盖已踩扁</div>719    <div class="ci-foot"><div class="ci-price">¥2.2/公斤</div><div class="ci-num"><i>-</i><b>5</b><i>+</i></div></div>720  </div>721</div>722<div class="cart-item">723  <div class="ci-check"></div>724  <div class="ci-img">👕</div>725  <div class="ci-body">726    <div class="ci-name">旧衣服 <span class="badge badge-new">免费上门</span></div>727    <div class="ci-spec">按公斤 · 一袋式打包</div>728    <div class="ci-foot"><div class="ci-price">¥1.0/公斤</div><div class="ci-num"><i>-</i><b>15</b><i>+</i></div></div>729  </div>730</div>731<div class="coupon-card" style="margin-top:12px;background:linear-gradient(135deg,#047857,#059669);border-radius:14px;padding:14px;display:flex;align-items:center;gap:12px;color:#fff">732  <div style="flex:1"><b style="font-size:17px;display:block">满 50 公斤加价 8%</b><span style="font-size:11px;opacity:.9">当前 25 公斤 · 再攒 25 公斤可加价</span></div>733  <div class="cc-btn" data-toast="再凑 25 公斤即可享受加价" style="background:#fff;color:#047857;padding:8px 16px;border-radius:16px;font-size:12px;font-weight:700">去看看</div>734</div>735<div class="check-box">736  <div class="cb-row"><span class="cb-label">上门地址</span><span class="cb-val">阳光小区 3 栋 2 单元 1502 ›</span></div>737  <div class="cb-row"><span class="cb-label">楼层电梯</span><span class="cb-val"><span class="opt sel">🏢 有电梯</span><span class="opt">🪜 无电梯(加搬运费)</span></span></div>738  <div class="cb-row"><span class="cb-label">上门时段</span><span class="cb-val"><span class="opt sel">🌅 上午 9-12 点</span><span class="opt">🌇 下午 2-6 点</span><span class="opt">🌙 晚间 6-9 点</span></span></div>739  <div class="cb-row"><span class="cb-label">回收方式</span><span class="cb-val"><span class="opt sel">🚴 上门回收</span><span class="opt">🏪 自提点投递</span></span></div>740  <div class="cb-row"><span class="cb-label">备注</span><span class="cb-val dim">有大件纸箱 / 请带绳 ›</span></div>741</div>742<div style="height:80px"></div>743<div class="settle-bar">744  <div class="sb-all"><span class="ci-check on">✓</span>全选</div>745  <div class="sb-total">预估收益 <b>¥39</b><br/>实称实结</div>746  <div class="sb-btn" data-toast="已跳转确认预约">去预约</div>747</div>748"""749750ORDER = """751""" + header("确认预约") + """752<div class="pay-card">753  <div class="pc-row"><span class="pc-label">上门地址</span><span class="pc-val">阳光小区 3 栋 2 单元 1502 ›</span></div>754  <div class="pc-row"><span class="pc-label">上门时段</span><span class="pc-val">🌅 今天 上午 9:00-12:00</span></div>755  <div class="pc-row"><span class="pc-label">楼层情况</span><span class="pc-val">🏢 有电梯 · 1502 室</span></div>756  <div class="pc-row"><span class="pc-label">备注</span><span class="pc-val dim">有大件纸箱 / 请带绳 ›</span></div>757</div>758<div class="card" style="margin-top:-4px">759  <div style="display:flex;gap:10px;align-items:center;padding:6px 0"><div style="width:48px;height:48px;border-radius:8px;background:var(--primary-light);display:flex;align-items:center;justify-content:center;font-size:22px">📦</div><div style="flex:1;font-size:13px;font-weight:600">黄板纸箱 ×20 公斤</div><div style="font-size:12px;color:#9aa8a4">约 ¥28</div></div>760  <div style="display:flex;gap:10px;align-items:center;padding:6px 0"><div style="width:48px;height:48px;border-radius:8px;background:var(--primary-light);display:flex;align-items:center;justify-content:center;font-size:22px">🧴</div><div style="flex:1;font-size:13px;font-weight:600">矿泉水瓶 ×5 公斤</div><div style="font-size:12px;color:#9aa8a4">约 ¥11</div></div>761</div>762<div class="pay-card" style="margin-top:-4px">763  <div class="pc-row"><span class="pc-label">预估收益</span><span class="pc-val">¥39 ~ ¥52(区间估价)</span></div>764  <div class="pc-row"><span class="pc-label">新人加价</span><span class="pc-val" style="color:#dc2626">首单 +10% 已享</span></div>765  <div class="pc-row"><span class="pc-label">大件附加费</span><span class="pc-val dim">无(有电梯)</span></div>766  <div class="pc-row"><span class="pc-label">预计到账</span><span class="pc-val"><b style="font-size:19px;color:var(--red)">¥43</b> 起</span></div>767</div>768<div class="pay-way">769  <div class="pw-title">选择收款方式</div>770  <div class="pw-item sel"><span class="pw-ico">💚</span>微信零钱(当场到账)<div class="pw-radio">✓</div></div>771  <div class="pw-item"><span class="pw-ico">💰</span>平台余额(可提现)<div class="pw-radio"></div></div>772  <div class="pw-item"><span class="pw-ico">🌱</span>全额转环保积分(1元=10分)<div class="pw-radio"></div></div>773  <div class="pw-item"><span class="pw-ico">🎁</span>捐赠公益回收项目<div class="pw-radio"></div></div>774</div>775<div class="card" style="margin-top:-4px;font-size:12px;color:#2c5b50;line-height:1.9">776  ⚠️ 温馨提示:预估金额按您填写的重量测算,最终以上门实称重量 × 当日单价结算。称重全程可视化,如对价格有异议可现场申诉或拒绝交易。777</div>778<div style="height:80px"></div>779<div class="settle-bar">780  <div class="sb-total" style="text-align:left">预计得 <b>¥43</b> 起</div>781  <div class="sb-btn" data-toast="预约成功,正在为您就近派单">提交预约</div>782</div>783"""784785ORDERS = """786""" + header("回收订单") + """787<div class="order-tabs">788  <a class="active">进行中</a><a>已完成</a><a>已取消</a>789</div>790<div class="track-bar">791  <div class="tb-ico">🚴</div>792  <div class="tb-body"><b>回收员 李师傅 已出发</b><span>距您 1.2km · 预计 13:45 到达 · 已服务 1860 单</span></div>793  <div class="tb-btn" data-toast="已查看回收员实时位置">看位置</div>794</div>795<div class="order-card">796  <div class="oc-head"><span>预约单 2026-09-11 13:05 <span class="tag">单号 HS202609111305</span></span><span class="st">上门中</span></div>797  <div class="oc-goods"><div class="og-img">📦</div><div class="og-name">黄板纸箱 ×20 公斤<br/><span style="font-size:11px;color:#9aa8a4">按公斤 · 加价中</span></div><div class="og-price">约 ¥28</div></div>798  <div class="oc-goods"><div class="og-img">🧴</div><div class="og-name">矿泉水瓶 ×5 公斤</div><div class="og-price">约 ¥11</div></div>799  <div class="oc-foot"><span>共 2 类 · 预估收益</span><b>¥39 起</b></div>800  <div class="call-bar">801    <i data-toast="正在呼叫回收员 138****6688">📞 一键拨号</i>802    <i data-toast="已修改上门时间">🕐 改期</i>803    <i class="main" data-toast="已上传实物照片,等待核验">📷 上传照片</i>804  </div>805</div>806<div class="section-title">📡 订单实时进度</div>807<div class="status-line" id="statusList"></div>808<div class="weigh-box">809  <div class="wb-title">⚖️ 称重计价明细(蓝牙秤同步)</div>810  <div class="weigh-row"><span class="wr-k">黄板纸箱</span><span class="wr-v">20.6 公斤 × ¥1.40 = ¥28.84</span></div>811  <div class="weigh-row"><span class="wr-k">矿泉水瓶</span><span class="wr-v">5.2 公斤 × ¥2.20 = ¥11.44</span></div>812  <div class="weigh-row"><span class="wr-k">新人首单加价 10%</span><span class="wr-v" style="color:#dc2626">+ ¥4.03</span></div>813  <div class="weigh-row"><span class="wr-k">环保积分</span><span class="wr-v" style="color:#059669">+ 258 分</span></div>814  <div class="weigh-row" style="border-top:1px solid #e6f7f1;margin-top:4px;padding-top:8px"><span class="wr-k" style="font-weight:700">实付结算</span><span class="wr-v" style="color:#dc2626;font-size:15px">¥44.31</span></div>815</div>816<div class="order-card" style="margin-top:12px">817  <div class="oc-head"><span>预约单 2026-09-04 10:20</span><span class="st" style="color:#059669">已完成</span></div>818  <div class="oc-goods"><div class="og-img">👕</div><div class="og-name">旧衣服 ×15 公斤<br/><span style="font-size:11px;color:#9aa8a4">一袋式混装 · 统货价</span></div><div class="og-price">¥15.00</div></div>819  <div class="oc-foot"><span>已到账微信零钱 · 获得积分 150</span><b>¥15.00</b></div>820  <div class="oc-ops"><i class="main">去评价</i><i>再预约一次</i></div>821</div>822<script>823  var sl = document.getElementById('statusList');824  var h = '';825  window.DATA.orderStatus.forEach(function (t) {826    var cls = t.now ? 'now' : (t.done ? 'done' : '');827    h += '<div class="sl-dot ' + cls + '"><div class="sl-c"></div><div>'828      + '<div class="sl-title">' + t.title + '</div><div class="sl-time">' + (t.time || '待处理') + '</div></div></div>';829  });830  sl.innerHTML = h;831</script>832"""833834MEMBER = """835""" + header("环保中心", back=False, right="⚙️") + """836<div class="eco-card">837  <div class="ec-level">🌱 环保等级 · 白银回收达人</div>838  <div class="ec-name">你已累计回收 328 公斤</div>839  <div class="ec-exp">距离黄金达人还差 172 公斤 · 积分加成 +15%</div>840  <div class="ec-bar"><i></i></div>841</div>842<div class="assets">843  <div class="asset-item"><b>2586</b><span>环保积分</span></div>844  <div class="asset-item"><b>¥86</b><span>可提现</span></div>845  <div class="asset-item"><b>328</b><span>回收公斤</span></div>846  <div class="asset-item"><b>¥412</b><span>累计收益</span></div>847</div>848<div class="sign-btn">🌿 每日签到领 20 环保积分</div>849<div class="eco-report">850  <div class="er-title">🌍 我的环保贡献</div>851  <div class="er-grid">852    <div class="er-cell"><b>196</b><span>减碳 kg</span></div>853    <div class="er-cell"><b>11</b><span>相当于种树(棵)</span></div>854    <div class="er-cell"><b>1.2</b><span>节约木材(吨)</span></div>855  </div>856  <div class="er-note">你的 328 公斤回收物 ≈ 减少碳排放 196 公斤,相当于种下 11 棵树、节约 1.2 吨木材与 3.6 吨水。数据随每单回收自动累计,可生成专属环保账单。</div>857  <div class="btn btn-primary" style="margin-top:12px" data-toast="环保账单海报已生成,可保存分享">生成我的环保账单</div>858</div>859<div class="section-title">🎁 积分商城 <span>积分当钱花</span></div>860<div class="mall-grid" id="mallList"></div>861<div class="section-title">🏅 我的环保勋章</div>862<div class="badge-grid" id="medalList"></div>863<div class="section-title">🚀 邀好友一起回收</div>864<div class="vip-grid">865  <div class="vip-item" data-toast="邀请海报已生成"><div class="vi-emoji">📤</div><div class="vi-name">邀好友回收</div><div class="vi-desc">好友首单你得 10 元</div></div>866  <div class="vip-item" data-toast="片区团长计划已为你登记"><div class="vi-emoji">🏘️</div><div class="vi-name">社区团长</div><div class="vi-desc">拿片区业绩提成</div></div>867  <div class="vip-item" data-toast="企业大宗回收通道已开启"><div class="vi-emoji">🏭</div><div class="vi-name">企业大宗回收</div><div class="vi-desc">月结对账开发票</div></div>868  <div class="vip-item" data-toast="以旧换新活动已参与"><div class="vi-emoji">🔄</div><div class="vi-name">以旧换新</div><div class="vi-desc">旧家电抵新机券</div></div>869</div>870<div class="section-title">📚 回收小知识</div>871<div class="card" style="margin-top:0;font-size:12px;color:#2c5b50;line-height:2">872  · 纸箱去掉胶带能多卖 15%:胶带属杂质,会按扣重处理<br/>873  · 饮料瓶去盖踩扁,同样重量体积小一半,装袋更方便<br/>874  · 废旧手机务必现场抹除数据,正规平台会出具隐私承诺单<br/>875  · 废铜与废铝价格差 4 倍,分类存放别混在一起卖876</div>877<script>878  var ml = document.getElementById('mallList');879  var h = '';880  window.DATA.pointsMall.forEach(function (m) {881    h += '<div class="mall-item"><div class="mi-img">' + m.img + '</div><div class="mi-name">' + m.name + '</div><div class="mi-pts">' + m.pts + ' 分</div></div>';882  });883  ml.innerHTML = h;884  var bl = document.getElementById('medalList');885  var h2 = '';886  window.DATA.medals.forEach(function (m) {887    h2 += '<div class="badge-item' + (m.got ? '' : ' lock') + '"><div class="bi-ico">' + m.ico + '</div><div class="bi-name">' + m.name + '</div></div>';888  });889  bl.innerHTML = h2;890</script>891"""892893MINE = """894<div class="user-card">895  <div class="uc-avatar">🧑‍🌾</div>896  <div>897    <div class="uc-name">某杰·白银回收达人</div>898    <div class="uc-level">🌱 累计回收 328 公斤 · 累计收益 ¥412 · 减碳 196kg</div>899  </div>900</div>901<div class="order-entry">902  <a data-toast="1 单上门中"><span class="oe-ico">🚴</span>上门中<span class="oe-num">1</span></a>903  <a data-toast="暂无待接单"><span class="oe-ico">📝</span>待接单</a>904  <a data-toast="1 单待评价"><span class="oe-ico">⭐</span>待评价<span class="oe-num">1</span></a>905  <a data-toast="无售后"><span class="oe-ico">↩️</span>售后</a>906  <a data-toast="无异常"><span class="oe-ico">⚖️</span>称重记录</a>907</div>908<div class="menu-list">909  <a href="orders.html"><span class="ml-l"><span class="ico">🧾</span>我的回收订单</span><span class="ml-r">›</span></a>910  <a href="member.html"><span class="ml-l"><span class="ico">🌱</span>环保中心</span><span class="ml-r">›</span></a>911  <a data-toast="可提现余额 ¥86,T+1 到账"><span class="ml-l"><span class="ico">💰</span>我的钱包</span><span class="ml-r">¥86</span></a>912  <a data-toast="环保积分 2586"><span class="ml-l"><span class="ico">⭐</span>环保积分</span><span class="ml-r">2586</span></a>913  <a data-toast="3 张加价券可用"><span class="ml-l"><span class="ico">🎟️</span>加价券</span><span class="ml-r">3 张</span></a>914  <a data-toast="已保存 2 个上门地址"><span class="ml-l"><span class="ico">📍</span>上门地址</span><span class="ml-r">2 个</span></a>915  <a data-toast="已收藏 6 个品类"><span class="ml-l"><span class="ico">❤️</span>我的收藏</span><span class="ml-r">6</span></a>916  <a data-toast="已实名认证,可正常提现"><span class="ml-l"><span class="ico">🪪</span>实名认证</span><span class="ml-r">已认证</span></a>917  <a data-toast="邀请海报已生成"><span class="ml-l"><span class="ico">📤</span>邀请有礼</span><span class="ml-r">›</span></a>918  <a data-toast="客服在线 07:00-21:00"><span class="ml-l"><span class="ico">🎧</span>联系客服</span><span class="ml-r">400-555-6688</span></a>919</div>920"""921922README = """# 某杰废品回收站(移动端 H5)923924再生资源上门回收平台,功能对标爱回收 / 爱博绿 / 回收宝 / 穗回收等主流回收小程序,覆盖"线上预约—就近派单—上门称重—当场结算—碳积分"全链路。纯原生零依赖,移动端优先(390×844),可直接 file:// 打开。925926## 页面(8 页)927- index.html 首页:LBS 定位与可上门片区、拍照识别/模糊搜索、六大品类导航、快捷入口(预约上门/一键估价/回收价目/环保积分/附近站点)、今日回收价行情、限时加价活动、新人加价券、高价回收品类、上门回收流程、附近回收站与自提点928- category.html 回收价目:六大分类切换(废纸/塑料/金属/旧衣物/旧家电/电子数码)、回收价从高排序、品类卡(图/名/月收量/回收范围/加价标签/单价)、底部回收单浮条929- detail.html 品类详情:今日单价与会员加价、计价方式与上门时效、规格与预估重量(含预估收益)、回收标准(4 条收 / 4 条不收)、上门流程五步、用户评价、猜你想回收、加入回收单与立即预约930- cart.html 回收单:多品类勾选、预估重量调整、满量加价凑单提示、上门地址/楼层电梯/时段/回收方式/备注、全选提交931- order.html 确认预约:上门信息、品类清单、预估收益区间、新人加价、大件附加费、收款方式(微信零钱/平台余额/转环保积分/公益捐赠)、实称实结说明932- orders.html 回收订单:进行中/已完成/已取消 Tab、回收员实时位置与一键拨号、订单卡(改期/上传照片/申诉)、订单进度时间线、蓝牙秤称重计价明细、积分与到账933- member.html 环保中心:环保等级与成长值、积分/可提现/回收公斤/累计收益、每日签到、环保贡献报告(减碳量/相当于种树/节约木材)、积分商城、环保勋章墙、邀好友与社区团长/企业大宗回收/以旧换新、回收小知识934- mine.html 我的:用户卡、订单快捷入口(上门中/待接单/待评价/售后/称重记录)、钱包/积分/加价券/地址/收藏/实名认证/邀请/客服935936## 文件937- style.css 移动端优先样式(环保青绿主题)938- app.js 零依赖交互(加价活动倒计时/分类筛选/规格选择/数量步进/清单勾选/时段选择/收款方式/签到/领券/积分兑换/Toast)939- data.js 演示数据集中管理(18 个回收品类、行情、加价活动、上门流程、回收标准、评价、券、积分商城、勋章、站点、订单状态)940941## 说明942价格与文案为演示数据,实际回收价以上门实称重量 × 当日单价结算。943"""944945def main():946    files = {947        "index.html": page("首页 · 某杰废品回收站", "index", INDEX, tabbar("首页")),948        "category.html": page("回收价目表 · 某杰废品回收站", "category", CATEGORY, tabbar("回收价")),949        "detail.html": page("品类详情 · 某杰废品回收站", "detail", DETAIL, tabbar("回收价")),950        "cart.html": page("我的回收单 · 某杰废品回收站", "cart", CART, tabbar("回收单")),951        "order.html": page("确认预约 · 某杰废品回收站", "order", ORDER, tabbar("我的")),952        "orders.html": page("回收订单 · 某杰废品回收站", "orders", ORDERS, tabbar("我的")),953        "member.html": page("环保中心 · 某杰废品回收站", "member", MEMBER, tabbar("环保")),954        "mine.html": page("个人中心 · 某杰废品回收站", "mine", MINE, tabbar("我的")),955        "style.css": CSS,956        "data.js": DATA,957        "app.js": APP,958        "README.md": README,959    }960    for name, content in files.items():961        with open(os.path.join(OUT, name), "w", encoding="utf-8") as f:962            f.write(content)963        print("  +", name)964965if __name__ == "__main__":966    main()967