From f23d598328c4e1edaac9675f957e43a446e8280b Mon Sep 17 00:00:00 2001 From: zoujing Date: Wed, 16 Sep 2026 16:52:50 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E9=BE=99=E9=87=8C=E5=B0=8F=E7=A8=8B?= =?UTF-8?q?=E5=BA=8F=E7=AC=AC=E4=B8=80=E6=AC=A1=E4=B8=8A=E4=BC=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 6 + index.html | 23 + package.json | 35 + project.config.json | 17 + scripts/audit-css.mjs | 81 + scripts/build-icons.mjs | 133 + scripts/build-mock.mjs | 199 ++ scripts/verify-build.mjs | 88 + src/App.vue | 19 + src/api/benefit.js | 136 + src/api/content.js | 107 + src/api/index.js | 6 + src/api/user.js | 273 ++ src/app.css | 368 +++ src/components/AppDialog/index.vue | 76 + src/components/AppIcon/index.vue | 26 + src/components/AppNavBar/index.vue | 86 + src/components/AppStatusBar/index.vue | 20 + src/components/AppTabBar/index.vue | 47 + src/components/BenefitCard/index.vue | 187 ++ src/components/BenefitDialog/index.vue | 88 + src/components/ContentCard/index.vue | 73 + src/components/EmptyBox/index.vue | 20 + src/components/SectionTile/index.vue | 96 + src/config/env.js | 73 + src/constant/index.js | 109 + src/constant/token.js | 41 + src/main.js | 10 + src/manifest.json | 50 + src/mock/assets.json | 2294 ++++++++++++++++ src/mock/benefits.json | 380 +++ src/mock/catalog.json | 266 ++ src/mock/items.json | 3486 ++++++++++++++++++++++++ src/mock/sections.json | 85 + src/pages-sub/about/index.vue | 70 + src/pages-sub/account/cancel.vue | 88 + src/pages-sub/agreement/index.vue | 50 + src/pages-sub/catalog/index.vue | 119 + src/pages-sub/detail/index.vue | 288 ++ src/pages.json | 112 + src/pages/benefit/index.vue | 191 ++ src/pages/home/index.vue | 169 ++ src/pages/login/index.vue | 168 ++ src/pages/mine/index.vue | 303 ++ src/request/api/benefit.js | 23 + src/request/api/content.js | 24 + src/request/api/login.js | 43 + src/request/base/config.js | 78 + src/request/base/request.js | 97 + src/static/logo.png | Bin 0 -> 114292 bytes src/static/placeholder.png | Bin 0 -> 199 bytes src/store/index.js | 8 + src/store/modules/benefit.js | 112 + src/store/modules/user.js | 159 ++ src/styles/icons.scss | 74 + src/uni.scss | 43 + src/utils/index.js | 100 + src/utils/nav.js | 122 + vite.config.js | 37 + 59 files changed, 11482 insertions(+) create mode 100644 .gitignore create mode 100644 index.html create mode 100644 package.json create mode 100644 project.config.json create mode 100644 scripts/audit-css.mjs create mode 100644 scripts/build-icons.mjs create mode 100644 scripts/build-mock.mjs create mode 100644 scripts/verify-build.mjs create mode 100644 src/App.vue create mode 100644 src/api/benefit.js create mode 100644 src/api/content.js create mode 100644 src/api/index.js create mode 100644 src/api/user.js create mode 100644 src/app.css create mode 100644 src/components/AppDialog/index.vue create mode 100644 src/components/AppIcon/index.vue create mode 100644 src/components/AppNavBar/index.vue create mode 100644 src/components/AppStatusBar/index.vue create mode 100644 src/components/AppTabBar/index.vue create mode 100644 src/components/BenefitCard/index.vue create mode 100644 src/components/BenefitDialog/index.vue create mode 100644 src/components/ContentCard/index.vue create mode 100644 src/components/EmptyBox/index.vue create mode 100644 src/components/SectionTile/index.vue create mode 100644 src/config/env.js create mode 100644 src/constant/index.js create mode 100644 src/constant/token.js create mode 100644 src/main.js create mode 100644 src/manifest.json create mode 100644 src/mock/assets.json create mode 100644 src/mock/benefits.json create mode 100644 src/mock/catalog.json create mode 100644 src/mock/items.json create mode 100644 src/mock/sections.json create mode 100644 src/pages-sub/about/index.vue create mode 100644 src/pages-sub/account/cancel.vue create mode 100644 src/pages-sub/agreement/index.vue create mode 100644 src/pages-sub/catalog/index.vue create mode 100644 src/pages-sub/detail/index.vue create mode 100644 src/pages.json create mode 100644 src/pages/benefit/index.vue create mode 100644 src/pages/home/index.vue create mode 100644 src/pages/login/index.vue create mode 100644 src/pages/mine/index.vue create mode 100644 src/request/api/benefit.js create mode 100644 src/request/api/content.js create mode 100644 src/request/api/login.js create mode 100644 src/request/base/config.js create mode 100644 src/request/base/request.js create mode 100644 src/static/logo.png create mode 100644 src/static/placeholder.png create mode 100644 src/store/index.js create mode 100644 src/store/modules/benefit.js create mode 100644 src/store/modules/user.js create mode 100644 src/styles/icons.scss create mode 100644 src/uni.scss create mode 100644 src/utils/index.js create mode 100644 src/utils/nav.js create mode 100644 vite.config.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..cb6dae6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +node_modules +dist +unpackage +.DS_Store +*.log +.hbuilderx diff --git a/index.html b/index.html new file mode 100644 index 0000000..5574809 --- /dev/null +++ b/index.html @@ -0,0 +1,23 @@ + + + + + + 龙里文旅 + + + +
+ + + diff --git a/package.json b/package.json new file mode 100644 index 0000000..5ad26bd --- /dev/null +++ b/package.json @@ -0,0 +1,35 @@ +{ + "name": "longli-mp", + "version": "1.0.0", + "description": "龙里文旅 · 微信小程序(uni-app + Vue3 + Vite + Tailwind)", + "private": true, + "scripts": { + "postinstall": "node ./node_modules/weapp-tailwindcss/bin/weapp-tailwindcss.js patch", + "patch:tailwind": "node ./node_modules/weapp-tailwindcss/bin/weapp-tailwindcss.js patch", + "dev:mp-weixin": "node ./node_modules/@dcloudio/vite-plugin-uni/bin/uni.js -p mp-weixin --mode development", + "build:mp-weixin": "node ./node_modules/@dcloudio/vite-plugin-uni/bin/uni.js build -p mp-weixin --mode production", + "dev:h5": "node ./node_modules/@dcloudio/vite-plugin-uni/bin/uni.js", + "build:h5": "node ./node_modules/@dcloudio/vite-plugin-uni/bin/uni.js build", + "build:mock": "node ./scripts/build-mock.mjs", + "build:icons": "node ./scripts/build-icons.mjs" + }, + "dependencies": { + "@dcloudio/uni-app": "3.0.0-4070620250821001", + "@dcloudio/uni-components": "3.0.0-4070620250821001", + "@dcloudio/uni-h5": "3.0.0-4070620250821001", + "@dcloudio/uni-mp-weixin": "3.0.0-4070620250821001", + "pinia": "^3.0.3", + "vue": "^3.4.21" + }, + "devDependencies": { + "@dcloudio/uni-automator": "3.0.0-4070620250821001", + "@dcloudio/uni-cli-shared": "3.0.0-4070620250821001", + "@dcloudio/uni-stacktracey": "3.0.0-4070620250821001", + "@dcloudio/vite-plugin-uni": "3.0.0-4070620250821001", + "@tailwindcss/postcss": "^4.3.0", + "sass": "1.58.3", + "tailwindcss": "^4.3.0", + "vite": "5.2.8", + "weapp-tailwindcss": "^4.12.0" + } +} diff --git a/project.config.json b/project.config.json new file mode 100644 index 0000000..574cde1 --- /dev/null +++ b/project.config.json @@ -0,0 +1,17 @@ +{ + "appid": "wx23f86d809ae80259", + "projectname": "longli-mp", + "description": "龙里文旅 · 微信小程序", + "miniprogramRoot": "dist/dev/mp-weixin/", + "compileType": "miniprogram", + "libVersion": "3.5.0", + "setting": { + "urlCheck": false, + "es6": true, + "enhance": true, + "postcss": true, + "minified": true, + "bigPackageSizeSupport": true + }, + "condition": {} +} diff --git a/scripts/audit-css.mjs b/scripts/audit-css.mjs new file mode 100644 index 0000000..ce24f3c --- /dev/null +++ b/scripts/audit-css.mjs @@ -0,0 +1,81 @@ +/** + * 关键工具类抽查:把产物里指定类的实际声明打出来,用于人工核对数值是否与设计稿一致。 + * 用法:node scripts/audit-css.mjs [distDir] + */ +import fs from "node:fs"; +import path from "node:path"; + +const ROOT = path.resolve(process.argv[2] || "dist/build/mp-weixin"); +const css = fs.readFileSync(path.join(ROOT, "app.wxss"), "utf8"); + +/** 取出某个类选择器(含伪元素/伪类变体)的规则体 */ +function rule(cls, extra = "") { + const escaped = cls.replace(/[.*+?^${}()|[\]\\]/g, "\\$&").replace(/\\/g, "\\\\"); + const re = new RegExp(`\\.${escaped}${extra ? extra.replace(/[.*+?^${}()|[\]\\]/g, "\\$&") : ""}\\s*\\{([^}]*)\\}`, "g"); + const out = []; + let m; + while ((m = re.exec(css))) out.push(m[1].replace(/\s+/g, " ").trim()); + return out; +} + +/** 找任意「含该子串的选择器」的规则(用于看被重写后的名字) */ +function ruleByFragment(frag) { + const out = []; + const re = /([^{}@/]+)\{([^}]*)\}/g; + let m; + while ((m = re.exec(css))) { + if (m[1].includes(frag)) out.push([m[1].trim().slice(0, 90), m[2].replace(/\s+/g, " ").trim().slice(0, 260)]); + } + return out; +} + +const groups = [ + ["① 全局变量与骨架", ["page", "button"]], + ["② 刻度换算(验证 --spacing 与 rem2rpx)", []], + ["③ 自定义 @utility:页面底 / 渐变 / 遮罩", []], + ["④ 伪元素装饰", []], + ["⑤ 设计 Token 生成的原子", ["bg-brand", "text-ink2", "text-ink3", "rounded-card", "rounded-hero", "rounded-panel", "rounded-dialog", "shadow-elev2", "shadow-ccard", "shadow-wcard"]], + ["⑥ 字号刻度", ["text-hint", "text-cap", "text-body", "text-title", "text-h1", "text-display"]], + ["⑦ 组合类(自定义 radius token)", []], + ["⑧ 滤镜 / 背景模糊 / 文字阴影", []], +]; + +for (const [title] of groups) console.log(`\n===== ${title} =====`); + +console.log("--- page ---"); +rule("page").forEach((r) => console.log(" " + r.slice(0, 400))); +console.log("--- button::after ---"); +rule("button", ":after").forEach((r) => console.log(" " + r)); + +console.log("\n--- --spacing 定义 ---"); +ruleByFragment("--spacing:").slice(0, 3).forEach(([s, b]) => console.log(" " + s + " { " + b.slice(0, 120) + " }")); +console.log("--- 数值刻度样例 gap-2 / px-4 / h-14 / w-11 / py-3 ---"); +for (const c of ["gap-2", "px-4", "h-14", "w-11", "py-3", "h-7", "gap-3", "mt-auto"]) { + console.log(" ." + c + " -> " + (rule(c)[0] || "【缺】")); +} + +console.log("\n--- 自定义工具类 ---"); +for (const c of ["skin-home", "skin-detail", "grad-brand", "grad-cardside", "gradtext-accent", "gradtext-brand", "scrim-tile", "scrim-rec", "deco-notch", "deco-titledot", "deco-underline", "deco-hairline", "deco-handle", "deco-mark", "btn-reset", "grad-divider", "grad-call"]) { + const r = rule(c); + console.log(" ." + c + " -> " + (r.length ? r.join(" | ").slice(0, 220) : "【缺】")); +} +console.log(" 伪元素变体:"); +for (const frag of ["deco-notch:before", "deco-underline:after", "btn-reset:after"]) { + ruleByFragment(frag).forEach(([s, b]) => console.log(" " + s + " { " + b.slice(0, 150) + " }")); +} + +console.log("\n--- 组合 radius token(rounded-l-card / rounded-r-card / rounded-t-panel)---"); +for (const c of ["rounded-l-card", "rounded-r-card", "rounded-t-panel", "rounded-t-dialog"]) { + console.log(" ." + c + " -> " + (rule(c)[0] || "【缺】")); +} + +console.log("\n--- 滤镜 / 模糊 / 文字阴影 ---"); +ruleByFragment("grayscale").slice(0, 4).forEach(([s, b]) => console.log(" " + s + " { " + b.slice(0, 200) + " }")); +ruleByFragment("brightness").slice(0, 3).forEach(([s, b]) => console.log(" " + s + " { " + b.slice(0, 200) + " }")); +ruleByFragment("backdrop-blur").slice(0, 3).forEach(([s, b]) => console.log(" " + s + " { " + b.slice(0, 260) + " }")); +ruleByFragment("text-shadow").slice(0, 3).forEach(([s, b]) => console.log(" " + s + " { " + b.slice(0, 200) + " }")); +ruleByFragment("rotate").slice(0, 3).forEach(([s, b]) => console.log(" " + s + " { " + b.slice(0, 160) + " }")); + +console.log("\n--- --tw-* 变量兜底初始化(weapp-tailwindcss 注入)---"); +const idx = css.indexOf("--tw-border-style"); +console.log(" " + css.slice(css.lastIndexOf("}", idx) + 1, idx + 700).replace(/\s+/g, " ").slice(0, 700)); diff --git a/scripts/build-icons.mjs b/scripts/build-icons.mjs new file mode 100644 index 0000000..4f4be6b --- /dev/null +++ b/scripts/build-icons.mjs @@ -0,0 +1,133 @@ +/** + * 图标生成脚本:微信小程序不支持内联 ,因此把初设图里的 SVG symbol + * 编译成 WXSS 的 background-image(base64 data-uri),按「名称 + 色调」生成类名。 + * + * 用法:node scripts/build-icons.mjs + * 产出:src/styles/icons.scss + */ +import fs from "node:fs"; +import path from "node:path"; + +const ROOT = path.resolve(import.meta.dirname, ".."); +const OUT = path.join(ROOT, "src/styles/icons.scss"); + +/** 颜色 token(与 design-token.scss 保持一致) */ +const TONES = { + ink: "#14181C", + ink2: "#6B7280", + ink3: "#9CA3AF", + white: "#FFFFFF", + brand: "#00B578", + brandDeep: "#009A67", + accent: "#FF8A3D", + danger: "#E5484D", +}; + +/** stroke 型图标:24×24 线性图标,stroke-width 1.9 */ +const STROKE_ICONS = { + pin: '', + arrow: '', + chev: '', + back: '', + phone: + '', + copy: '', + gift: '', + home: '', + ticket: + '', + user: '', + check: '', + close: '', + doc: '', + shield: '', + info: '', + headset: + '', + logout: '', + trash: + '', + share: + '', + clock: '', + map: '', + food: '', + bed: '', + peak: '', + people: + '', +}; + +/** fill 型图标(实心) */ +const FILL_ICONS = { + wx: '', +}; + +/** 需要生成的「图标 × 色调」组合(只生成用得到的,控制体积) */ +const MATRIX = { + pin: ["ink3", "brand", "white"], + arrow: ["white", "brandDeep", "ink"], + chev: ["ink3", "white", "brand", "ink2"], + back: ["ink", "white", "brand"], + phone: ["white", "brandDeep"], + copy: ["brandDeep", "brand"], + gift: ["white", "brandDeep", "accent"], + home: ["ink3", "brand"], + ticket: ["ink3", "brand", "accent", "white", "ink2"], + user: ["ink3", "brand", "white", "ink2"], + check: ["white", "brand"], + close: ["ink3", "white"], + doc: ["ink2", "brand"], + shield: ["ink2", "white", "brand"], + info: ["ink2", "brand"], + headset: ["ink2", "brand"], + logout: ["ink2", "white"], + trash: ["ink2", "danger"], + share: ["white"], + clock: ["brand", "ink3", "white"], + map: ["brandDeep", "white"], + food: ["brandDeep", "accent", "white", "brand"], + bed: ["accent", "brand", "white", "brandDeep"], + peak: ["accent", "brand", "white"], + people: ["ink3", "brand", "white", "brandDeep"], + wx: ["white"], +}; + +const buildSvg = (name, body, color, type) => { + const style = + type === "fill" + ? `fill='${color}' stroke='none'` + : `fill='none' stroke='${color}' stroke-width='1.9' stroke-linecap='round' stroke-linejoin='round'`; + return `${body}`; +}; + +const toDataUri = (svg) => `data:image/svg+xml;base64,${Buffer.from(svg, "utf8").toString("base64")}`; + +const lines = [ + "/* 由 scripts/build-icons.mjs 生成,请勿手改 */", + "", + ".ai{display:block;flex:none;background-repeat:no-repeat;background-position:center;background-size:100% 100%}", + "", +]; + +let count = 0; +for (const [name, tones] of Object.entries(MATRIX)) { + const type = FILL_ICONS[name] ? "fill" : "stroke"; + const body = FILL_ICONS[name] || STROKE_ICONS[name]; + if (!body) throw new Error(`未定义的图标:${name}`); + for (const tone of tones) { + const color = TONES[tone]; + if (!color) throw new Error(`未定义的色调:${tone}`); + if (type === "stroke") { + // stroke 型图标 stroke-width 随字号缩放会变细,统一用 1.9 + } + const uri = toDataUri(buildSvg(name, body, color, type)); + lines.push(`.ai-${name}.t-${tone}{background-image:url("${uri}")}`); + count += 1; + } +} + +lines.push(""); +fs.writeFileSync(OUT, lines.join("\n"), "utf8"); +const kb = (fs.statSync(OUT).size / 1024).toFixed(1); +console.log(`icons.scss 已生成:${count} 条规则 / ${kb} KB`); diff --git a/scripts/build-mock.mjs b/scripts/build-mock.mjs new file mode 100644 index 0000000..7affa20 --- /dev/null +++ b/scripts/build-mock.mjs @@ -0,0 +1,199 @@ +/** + * 一次性数据构建脚本:把 DuohuaDiscovery 的 miniprogram_data.json + * 拆成小程序运行期使用的 mock 数据(字段与未来接口同构)。 + * + * 运行:node scripts/build-mock.mjs + */ +import fs from "node:fs"; +import path from "node:path"; + +const ROOT = path.resolve(import.meta.dirname, ".."); +const SRC = "/Users/gleen/OneFeel/YGChatCS/src/pages/DuohuaDiscovery/data/miniprogram_data.json"; +const OUT = path.join(ROOT, "src/mock"); + +const data = JSON.parse(fs.readFileSync(SRC, "utf8")); + +const SECTION_DEFINITIONS = [ + { + key: "tourism", + title: "龙里票根经济", + subtitle: "领取龙里旅游优惠", + coverImage: + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-001/01.jpg", + collections: ["attractions", "attraction_subprojects"], + supportAssetIds: ["tourism-overview-map", "tourism-guide-qr"], + }, + { + key: "lodging", + title: "旅居服务", + subtitle: "酒店 · 民宿别院 · 旅居公寓 · 露营基地", + collections: ["accommodations"], + supportAssetIds: ["lodging-location-schematic", "lodging-guide-qr"], + }, + { + key: "food", + title: "全域美食", + subtitle: "特色菜肴 · 地方小吃 · 甜品饮品", + collections: ["foods"], + supportAssetIds: ["food-guide-qr"], + }, + { + key: "specialties", + title: "龙里特产", + subtitle: "刺梨制品 · 地方食品 · 农产品", + collections: ["specialties"], + supportAssetIds: [], + }, +]; + +const COLLECTIONS = [ + { key: "attractions", label: "景点" }, + { key: "attraction_subprojects", label: "游乐演艺" }, + { key: "accommodations", label: "旅居" }, + { key: "foods", label: "美食" }, + { key: "specialties", label: "特产" }, +]; + +/** 一期 mock:源数据无营业时间字段,统一占位,待运营方按商户补充 */ +const MOCK_BUSINESS_HOURS = "09:00–22:00"; + +const DROP_FIELDS = [ + "issues", + "source", + "source_no", + "images", + "main_image_object_key", + "gallery_object_keys", + "local_relative_path", + "oss_object_key", + "sha256", + "source_file", + "source_page", + "pdf_image_name", + "pdf_x0", + "pdf_top", + "pdf_x1", + "pdf_bottom", + "conversion_note", + "color_mode", +]; + +const trim = (obj) => { + const out = {}; + for (const [k, v] of Object.entries(obj)) { + if (DROP_FIELDS.includes(k)) continue; + if (v === null || v === undefined || v === "") continue; + out[k] = v; + } + return out; +}; + +/** 电话归一:源数据里分隔符混用「—」「–」「-」,统一成半角连字符;另给纯数字供 makePhoneCall */ +const normalizeContact = (item) => { + const raw = item?.contact?.raw || ""; + if (!raw) return null; + const display = raw.replace(/[—–-~~\s]/g, "-").replace(/-+/g, "-").replace(/-$/, ""); + const dial = display.replace(/\D/g, ""); + return { raw, display, dial }; +}; + +/** 地址归一:源数据 address 是对象(含经纬度为 null),页面只用一个字符串;无地址返回空串(页面整行隐藏) */ +const normalizeAddress = (item) => { + const addr = item?.address; + if (!addr) return ""; + if (typeof addr === "string") return addr; + if (addr.raw || addr.normalized) return addr.raw || addr.normalized; + if (addr.township_or_street) { + return [addr.province, addr.prefecture, addr.county, addr.township_or_street].filter(Boolean).join(""); + } + return ""; +}; + +const items = {}; +const counts = {}; + +for (const { key } of COLLECTIONS) { + const list = Array.isArray(data[key]) ? data[key] : []; + let n = 0; + for (const raw of list) { + // 硬约束:过滤 enabled === false + if (raw.enabled === false) continue; + const item = trim(raw); + delete item.enabled; + delete item.address; + item.collection = key; + item.business_hours = item.business_hours || MOCK_BUSINESS_HOURS; + item.contact = normalizeContact(raw); + item.address_text = normalizeAddress(raw); + item.badge = item.subtype || item.category || item.type || ""; + items[raw.id] = item; + n += 1; + } + counts[key] = n; +} + +/** 分组目录:过滤 enabled=false / 空分组,按 type_order -> sort_within_type 排序 */ +const catalog = {}; +for (const { key } of COLLECTIONS) { + const groups = Array.isArray(data?.catalog_by_type?.[key]) ? data.catalog_by_type[key] : []; + catalog[key] = groups + .map((group) => { + const ids = (group.items || []) + .filter((it) => items[it.id]) + .sort((a, b) => (a.sort_within_type ?? 0) - (b.sort_within_type ?? 0)) + .map((it) => it.id); + return { + collection: key, + type_code: group.type_code, + type: group.type, + type_order: group.type_order ?? 0, + item_count: ids.length, + item_ids: ids, + }; + }) + .filter((group) => group.item_count > 0) + .sort((a, b) => a.type_order - b.type_order); +} + +const assets = (data.assets || []).map((a) => ({ + asset_id: a.asset_id, + entity_type: a.entity_type, + entity_id: a.entity_id, + entity_name: a.entity_name, + role: a.role, + sort_order: a.sort_order ?? 0, + oss_url: a.oss_url, + width_px: a.width_px, + height_px: a.height_px, + content_type: a.content_type, +})); + +const sections = SECTION_DEFINITIONS.map((def) => { + const groups = def.collections.flatMap((c) => + catalog[c].map((g) => ({ ...g, groupId: `${c}-${g.type_code}` })) + ); + const ids = groups.flatMap((g) => g.item_ids); + const first = items[ids[0]]; + return { + ...def, + group_count: groups.length, + item_count: ids.length, + group_ids: groups.map((g) => g.groupId), + }; +}); + +const write = (name, payload) => { + const file = path.join(OUT, name); + fs.writeFileSync(file, JSON.stringify(payload, null, 0) + "\n", "utf8"); + const kb = (fs.statSync(file).size / 1024).toFixed(1); + console.log(`${name.padEnd(16)} ${kb} KB`); +}; + +fs.mkdirSync(OUT, { recursive: true }); +write("sections.json", sections); +write("catalog.json", catalog); +write("items.json", items); +write("assets.json", assets); + +console.log("\n集合条数(已过滤 enabled=false):", counts); +console.log("items 总数:", Object.keys(items).length); diff --git a/scripts/verify-build.mjs b/scripts/verify-build.mjs new file mode 100644 index 0000000..b2106bd --- /dev/null +++ b/scripts/verify-build.mjs @@ -0,0 +1,88 @@ +/** + * 产物结构校验:把 dist 里所有 WXML 的 class 抽出来,回查是否都有对应 WXSS 规则。 + * 用途:Tailwind 改造后确认「模板写的类」与「编译出的样式」没有错配(尤其任意值类会被 + * weapp-tailwindcss 重写成安全类名,肉眼看不出来)。 + * 用法:node scripts/verify-build.mjs [distDir] + */ +import fs from "node:fs"; +import path from "node:path"; + +const ROOT = path.resolve(process.argv[2] || "dist/build/mp-weixin"); + +if (!fs.existsSync(ROOT)) { + console.error(`找不到构建产物目录:${ROOT}\n请先执行 npm run build:mp-weixin`); + process.exit(1); +} + +const cssFiles = []; +const wxmlFiles = []; +(function walk(dir) { + for (const entry of fs.readdirSync(dir, { withFileTypes: true })) { + const full = path.join(dir, entry.name); + if (entry.isDirectory()) walk(full); + else if (entry.name.endsWith(".wxss")) cssFiles.push(full); + else if (entry.name.endsWith(".wxml")) wxmlFiles.push(full); + } +})(ROOT); + +/* ---- 1. 收集 WXSS 中定义过的类名 ---- */ +const defined = new Set(); +let cssBytes = 0; +for (const file of cssFiles) { + const css = fs.readFileSync(file, "utf8"); + cssBytes += Buffer.byteLength(css); + // 选择器里的 .class,可能带反斜杠转义(如 .w-\[10px\]) + for (const m of css.matchAll(/\.((?:[A-Za-z0-9_-]|\\.)+)/g)) { + defined.add(m[1].replace(/\\/g, "")); + } +} + +/* ---- 2. 收集 WXML 里 class 属性用到的 token ---- */ +const used = new Map(); +let staticCount = 0; +let dynamicCount = 0; + +for (const file of wxmlFiles) { + const src = fs.readFileSync(file, "utf8"); + for (const m of src.matchAll(/class="([^"]*)"/g)) { + let value = m[1]; + if (value.includes("{{")) { + // 动态绑定:把三元/对象里的字符串字面量也捞出来一起校验 + dynamicCount += 1; + for (const lit of value.match(/'[^']*'|"[^"]*"/g) || []) value += ` ${lit.slice(1, -1)}`; + value = value.replace(/\{\{[^}]*\}\}/g, " "); + } else { + staticCount += 1; + } + for (const token of value.split(/\s+/)) { + const cls = token.trim(); + if (!cls) continue; + if (!used.has(cls)) used.set(cls, new Set()); + used.get(cls).add(path.relative(ROOT, file)); + } + } +} + +/* ---- 3. 校验 ---- */ +const missing = []; +for (const [cls, files] of used) { + if (!defined.has(cls)) missing.push([cls, [...files].slice(0, 3)]); +} + +console.log("产物目录 :", path.relative(process.cwd(), ROOT)); +console.log("wxss 文件 :", cssFiles.length, `(合计 ${(cssBytes / 1024).toFixed(1)} KB)`); +console.log("app.wxss :", `${(fs.statSync(path.join(ROOT, "app.wxss")).size / 1024).toFixed(1)} KB`); +console.log("wxml 文件 :", wxmlFiles.length); +console.log("class 静态处数 :", staticCount, " 动态处数 :", dynamicCount); +console.log("涉及 class :", used.size); +console.log(""); + +if (missing.length === 0) { + console.log("✅ 结构校验通过:所有 class 均有对应样式规则,0 错配"); +} else { + console.log(`❌ 有 ${missing.length} 个 class 找不到样式规则:`); + for (const [cls, files] of missing.slice(0, 80)) { + console.log(` .${cls} <- ${files.join(", ")}`); + } + process.exitCode = 1; +} diff --git a/src/App.vue b/src/App.vue new file mode 100644 index 0000000..aafaba6 --- /dev/null +++ b/src/App.vue @@ -0,0 +1,19 @@ + + + diff --git a/src/api/benefit.js b/src/api/benefit.js new file mode 100644 index 0000000..0658953 --- /dev/null +++ b/src/api/benefit.js @@ -0,0 +1,136 @@ +/** + * 权益数据访问层(唯一数据入口) + * --------------------------------------------------------------------------- + * 核心口径(v0.8 / v0.11): + * - 权益不绑定具体商品、可多次使用;使用只累加 use_count + last_used_at,不失效 + * - 状态机 4 态:available / claimed / expired / sold_out + * - 一期领取与使用记录写本地 storage;二期换成接口(src/request/api/benefit.js) + */ +import { USE_MOCK_CONTENT } from "@/config/env"; +import { BENEFIT_STATUS, STORAGE_KEYS } from "@/constant"; +import { clone } from "@/utils"; +import benefitsMock from "@/mock/benefits.json"; +import * as benefitApi from "@/request/api/benefit"; + +/** 本地权益状态:{ [id]: { claimed: true, use_count, last_used_at } } */ +const readLocalState = () => { + try { + return uni.getStorageSync(STORAGE_KEYS.BENEFIT_STATE) || {}; + } catch (e) { + return {}; + } +}; + +const writeLocalState = (state) => { + uni.setStorageSync(STORAGE_KEYS.BENEFIT_STATE, state || {}); +}; + +/** 合并基础数据与本地状态,得到「当前状态」 */ +const mergeState = (benefit, local) => { + const patch = local[benefit.id]; + const next = { ...benefit, ...(patch || {}) }; + if (benefit.status === BENEFIT_STATUS.SOLD_OUT || benefit.status === BENEFIT_STATUS.EXPIRED) { + next.status = benefit.status; + } else if (patch?.claimed) { + next.status = BENEFIT_STATUS.CLAIMED; + } + return next; +}; + +const allWithState = () => { + const local = readLocalState(); + return (benefitsMock || []).map((b) => mergeState(b, local)); +}; + +/** 权益中心:可领取 + 已抢光(不含我的权益) */ +export const getBenefitList = async (params = {}) => { + if (!USE_MOCK_CONTENT) return benefitApi.fetchBenefits(params); + let list = allWithState().filter( + (b) => b.status === BENEFIT_STATUS.AVAILABLE || b.status === BENEFIT_STATUS.SOLD_OUT + ); + if (params.type && params.type !== "all") { + list = list.filter((b) => b.type === params.type); + } + return clone(list); +}; + +/** 我的权益:claimed + expired */ +export const getMyBenefitList = async (params = {}) => { + if (!USE_MOCK_CONTENT) return benefitApi.fetchMyBenefits(params); + let list = allWithState().filter( + (b) => b.status === BENEFIT_STATUS.CLAIMED || b.status === BENEFIT_STATUS.EXPIRED + ); + if (params.tab === "usable") list = list.filter((b) => b.status === BENEFIT_STATUS.CLAIMED); + if (params.tab === "invalid") list = list.filter((b) => b.status === BENEFIT_STATUS.EXPIRED); + return clone(list); +}; + +/** 权益中心页头数据行文案 */ +export const getBenefitHeadline = async () => { + const list = allWithState(); + const available = list.filter((b) => b.status === BENEFIT_STATUS.AVAILABLE).length; + const claimed = list.filter((b) => b.status === BENEFIT_STATUS.CLAIMED).length; + return `本周上新 ${available} 项 · 已领取 ${claimed} 项 · 剩余名额充足`; +}; + +/** 我的权益数量统计(全部 / 可使用 / 已失效) */ +export const getMyBenefitCounts = async () => { + const list = (await getMyBenefitList()) || []; + return { + all: list.length, + usable: list.filter((b) => b.status === BENEFIT_STATUS.CLAIMED).length, + invalid: list.filter((b) => b.status === BENEFIT_STATUS.EXPIRED).length, + }; +}; + +/** 商家关联的到店权益 */ +export const getRelatedBenefits = async (entityId) => { + if (!USE_MOCK_CONTENT) return benefitApi.fetchRelatedBenefits(entityId); + const list = allWithState().filter( + (b) => b.related_entity_id === entityId && b.status !== BENEFIT_STATUS.EXPIRED + ); + return clone(list); +}; + +/** 领取权益:写本地状态,不改变可用性质 */ +export const claimBenefit = async (id) => { + if (!USE_MOCK_CONTENT) return benefitApi.claimBenefit(id); + const local = readLocalState(); + local[id] = { ...(local[id] || {}), claimed: true }; + writeLocalState(local); + return { id, status: BENEFIT_STATUS.CLAIMED }; +}; + +/** + * 记录一次使用:只累加次数与时间,**不使权益失效**(无幂等约束) + */ +export const useBenefit = async (id) => { + if (!USE_MOCK_CONTENT) return benefitApi.useBenefit(id); + const local = readLocalState(); + const prev = local[id] || { claimed: true }; + const next = { + ...prev, + claimed: true, + use_count: (prev.use_count || 0) + 1, + last_used_at: formatNow(), + }; + local[id] = next; + writeLocalState(local); + return { id, ...next }; +}; + +const formatNow = () => { + const d = new Date(); + const p = (n) => String(n).padStart(2, "0"); + return `${d.getFullYear()}-${p(d.getMonth() + 1)}-${p(d.getDate())} ${p(d.getHours())}:${p(d.getMinutes())}`; +}; + +export default { + getBenefitList, + getMyBenefitList, + getBenefitHeadline, + getMyBenefitCounts, + getRelatedBenefits, + claimBenefit, + useBenefit, +}; diff --git a/src/api/content.js b/src/api/content.js new file mode 100644 index 0000000..c090d29 --- /dev/null +++ b/src/api/content.js @@ -0,0 +1,107 @@ +/** + * 内容数据访问层(唯一数据入口) + * --------------------------------------------------------------------------- + * 页面只调用本文件,不直接 import mock。 + * USE_MOCK_CONTENT = true → 读 src/mock/*;false → 走 src/request/api/content.js。 + * mock 与接口字段同构,切换时调用方零改动。 + */ +import { USE_MOCK_CONTENT } from "@/config/env"; +import { clone, imageListOf, unique } from "@/utils"; +import sectionsMock from "@/mock/sections.json"; +import catalogMock from "@/mock/catalog.json"; +import itemsMock from "@/mock/items.json"; +import assetsMock from "@/mock/assets.json"; +import * as contentApi from "@/request/api/content"; + +/** + * 首页「精选推荐」运营位:一期写死 3 条(油画大草原 AAAA / 双龙镇·巫山峡谷 AAAA / 龙里辣子鸡), + * 二期由后端下发,页面无需改动。 + */ +const FEATURED_IDS = ["attraction-002", "attraction-003", "food-002"]; + +const allItems = () => Object.values(itemsMock); + +const buildGroups = (section) => { + if (!section) return []; + return section.collections.flatMap((collection) => { + const groups = catalogMock[collection] || []; + return groups.map((group) => ({ + ...group, + collection, + groupId: `${collection}-${group.type_code}`, + items: group.item_ids.map((id) => itemsMock[id]).filter(Boolean), + })); + }); +}; + +/** 板块列表(4 个);coverImage 缺失时用该板块首个条目的主图(只读字段,不拼路径) */ +export const getSections = async () => { + if (!USE_MOCK_CONTENT) return contentApi.fetchSections(); + return clone( + sectionsMock.map((section) => { + if (section.coverImage) return section; + const firstGroup = (catalogMock[section.collections[0]] || [])[0]; + const firstId = firstGroup?.item_ids?.[0]; + return { ...section, coverImage: itemsMock[firstId]?.main_image_url || "" }; + }) + ); +}; + +/** 板块详情:定义 + 分组(含条目)+ 素材 */ +export const getSection = async (sectionKey) => { + if (!USE_MOCK_CONTENT) return contentApi.fetchSection(sectionKey); + const section = sectionsMock.find((s) => s.key === sectionKey); + if (!section) return null; + const groups = buildGroups(section); + const supportAssets = (assetsMock || []).filter((a) => section.supportAssetIds.includes(a.entity_id)); + return clone({ ...section, groups, supportAssets }); +}; + +/** 条目详情 */ +export const getItem = async (collection, id) => { + if (!USE_MOCK_CONTENT) return contentApi.fetchItem(collection, id); + const item = itemsMock[id]; + if (!item) return null; + if (collection && item.collection !== collection) return null; + return clone({ ...item, images: imageListOf(item) }); +}; + +/** 同类型推荐(排除自身,最多 limit 条) */ +export const getRelatedItems = async (collection, typeCode, excludeId, limit = 3) => { + if (!USE_MOCK_CONTENT) return contentApi.fetchRelatedItems({ collection, type_code: typeCode, exclude_id: excludeId, limit }); + return clone( + allItems() + .filter((it) => it.collection === collection && it.type_code === typeCode && it.id !== excludeId) + .slice(0, limit) + ); +}; + +/** 首页精选推荐 */ +export const getFeaturedItems = async () => { + if (!USE_MOCK_CONTENT) return contentApi.fetchFeaturedItems(); + return clone(FEATURED_IDS.map((id) => itemsMock[id]).filter(Boolean)); +}; + +/** 首页「全域导览」通栏图(来源 assets,不拼路径) */ +export const getOverviewMapAsset = async () => { + if (!USE_MOCK_CONTENT) return contentApi.fetchAssets({ entity_id: "tourism-overview-map" }); + return clone((assetsMock || []).find((a) => a.entity_id === "tourism-overview-map") || null); +}; + +/** 板块头图轮播图集(主图优先,其次素材图) */ +export const getSectionBannerImages = async (sectionKey) => { + const section = await getSection(sectionKey); + if (!section) return []; + const urls = [section.coverImage, ...section.groups.flatMap((g) => g.items.map((it) => it.main_image_url))]; + return unique(urls.filter(Boolean)).slice(0, 3); +}; + +export default { + getSections, + getSection, + getItem, + getRelatedItems, + getFeaturedItems, + getOverviewMapAsset, + getSectionBannerImages, +}; diff --git a/src/api/index.js b/src/api/index.js new file mode 100644 index 0000000..c7c05d4 --- /dev/null +++ b/src/api/index.js @@ -0,0 +1,6 @@ +/** + * 数据访问统一出口:页面/组件一律从这里取数,不直接 import mock。 + */ +export * as contentApi from "./content"; +export * as benefitApi from "./benefit"; +export * as userApi from "./user"; diff --git a/src/api/user.js b/src/api/user.js new file mode 100644 index 0000000..d0d2508 --- /dev/null +++ b/src/api/user.js @@ -0,0 +1,273 @@ +/** + * 用户 / 登录数据访问层 + * --------------------------------------------------------------------------- + * 真实接口,链路照搬 YGChatCS 的 manager/LoginManager.js + hooks/useGoLogin.js。 + * 网关鉴权靠请求头 clientId = "2"(见 src/config/env.js),不再单独造 mock 用户。 + * + * 链路: + * 1. uni.login 拿 code + * → POST /auth/oauth2/token(Authorization: Basic custom:custom,form-urlencoded) + * body { openIdCode: [code], grant_type: "wechat", clientId, scope: "server" } + * → access_token / refresh_token 落 storage + * 2. GET /hotelBiz/user/checkUserHasBindPhone → { data: boolean } + * 3. 未绑定 → POST /hotelBiz/user/bindUserPhone { wechatPhoneCode, clientId } + * + * 边界说明(避免再造假数据): + * - 昵称 / 头像:后端无对应接口,改由用户主动提供(chooseAvatar + 昵称输入),只写本地 + * storage;不做任何「李龙 / 13888880000」式占位数据,未设置时页面自行显示兜底文案。 + * - 账户注销:后端暂无注销接口(参考项目也没有),一期只清本地登录态与权益记录。 + * - 协议正文:仍取本地定稿文本(USE_MOCK_CONTENT),真实接口已备好,就绪后翻开关即可。 + */ +import { CLIENT_ID, USE_MOCK_CONTENT, USE_MOCK_USER } from "@/config/env"; +import { + getRefreshToken, + getUserInfo, + removeAccessToken, + setAccessToken, + setRefreshToken, +} from "@/constant/token"; +import { clone } from "@/utils"; +import { ensureEnvReady } from "@/request/base/config"; +import * as loginApi from "@/request/api/login"; + +/** 仅 USE_MOCK_USER = true 的离线调试用;默认关闭 */ +const MOCK_USER = { + id: "longli-mock-user", + nickName: "", + avatarUrl: "", + phone: "", + phoneBound: false, +}; + +/** 调 wx.login 拿 code(真实链路的第一步) */ +export const getWxCode = () => + new Promise((resolve, reject) => { + uni.login({ + provider: "weixin", + onlyAuthorize: true, + success: (res) => { + if (res && res.code) resolve(res.code); + else reject(new Error("未获取到微信授权 code")); + }, + fail: () => reject(new Error("微信授权失败")), + }); + }); + +/** token 成对落盘(服务端每次都会回新的 refresh_token) */ +const saveToken = (res = {}) => { + setAccessToken(res.access_token); + setRefreshToken(res.refresh_token); +}; + +/** code / refresh_token 换 token,失败抛错由调用方 toast */ +const requestToken = async (params) => { + const res = await loginApi.oauthToken(params); + if (!res || !res.access_token) { + throw new Error((res && (res.message || res.msg)) || "登录失败"); + } + saveToken(res); + return res; +}; + +/** + * 微信一键登录:uni.login → OAuth token → 落盘 + * @returns {Promise<{ token: string, refreshToken: string, code: string, userInfo: object|null }>} + */ +export const wxLogin = async () => { + if (USE_MOCK_USER) { + return { token: `mock-token-${Date.now()}`, refreshToken: "", code: "", userInfo: clone(MOCK_USER) }; + } + + // 清掉可能过期的旧 token,避免请求头带上失效凭证 + removeAccessToken(); + // 确保 baseURL 已解析(冷启动与登录并发时共用同一个请求) + await ensureEnvReady(); + const code = await getWxCode(); + const res = await requestToken({ + // 实测:服务端要的是纯值 openIdCode=abc; + // 数组/重复键都会被网关拒(OAuth 2.0 Parameter: openIdCode),故这里直接传字符串 + openIdCode: code, + grant_type: "wechat", + clientId: CLIENT_ID, + scope: "server", + }); + + return { + token: res.access_token, + refreshToken: res.refresh_token || "", + code, + userInfo: getUserInfo(), + }; +}; + +/** + * 用 refresh_token 续期(冷启动 / 登录态过期时用) + * @returns {Promise} + */ +export const refreshAuthLogin = async () => { + if (USE_MOCK_USER) return true; + const refresh = getRefreshToken(); + if (!refresh) throw new Error("没有可用的 refresh_token"); + await requestToken({ + grant_type: "refresh_token", + refresh_token: refresh, + clientId: CLIENT_ID, + scope: "server", + }); + return true; +}; + +/** + * 是否已绑定手机号 + * @returns {Promise} + */ +export const checkUserPhone = async () => { + if (USE_MOCK_USER) return false; + // silent:绑定态探测属于后台同步,失败不弹 toast + const res = await loginApi.checkUserPhone({ silent: true }); + return !!(res && res.data); +}; + +/** + * 已绑定手机号(服务端返回脱敏号,取不到不抛错) + * @returns {Promise} + */ +export const getLoginUserPhone = async () => { + if (USE_MOCK_USER) return ""; + try { + const res = await loginApi.getLoginUserPhone({}, { silent: true }); + const data = res && res.data; + if (!data) return ""; + return typeof data === "string" ? data : data.phone || ""; + } catch (e) { + return ""; + } +}; + +/** + * 绑定手机号(getPhoneNumber 回调里的 code) + * @param {string} phoneCode e.detail.code + * @returns {Promise} + */ +export const bindUserPhone = async (phoneCode) => { + if (USE_MOCK_USER) return true; + if (!phoneCode) throw new Error("未获取到手机号授权 code"); + const res = await loginApi.bindUserPhone({ wechatPhoneCode: phoneCode, clientId: CLIENT_ID }); + return !!(res && res.data); +}; + +/** 头像 / 昵称:后端无接口,仅落本地(调用方负责写 storage) */ +export const updateProfile = async (patch) => clone(patch); + +/** + * 账户注销:后端暂无该接口,一期只清本地数据(由 store 侧落盘清理) + */ +export const cancelAccount = async () => ({ success: true }); + +/** 协议页标题 */ +export const getAgreementTitle = (type) => (type === "terms" ? "用户协议" : "隐私政策"); + +/** 本地定稿正文(一期用) */ +const AGREEMENT_TEXT = { + privacy: [ + { + type: "p", + text: "我们非常重视你的个人信息保护。本政策说明龙里文旅小程序如何收集、使用、存储与保护你的个人信息。", + }, + { type: "h5", text: "一、我们收集的信息" }, + { + type: "p", + text: "1. 微信授权信息:在你主动点击登录时,我们获取你的微信身份标识,仅用于建立与识别你的账号。", + }, + { type: "p", text: "2. 手机号:在你主动点击「微信一键绑定」时获取,仅用于领取权益、权益使用与账号找回。" }, + { type: "p", text: "3. 权益记录:你领取与使用权益的时间、权益编号,用于使用校验与纠纷处理。" }, + { type: "h5", text: "二、我们如何使用信息" }, + { type: "p", text: "仅在实现上述功能所必需的范围内使用,不会用于广告推送或向第三方出售。" }, + { type: "h5", text: "三、信息的存储与保护" }, + { type: "p", text: "数据存储于中国境内服务器,传输过程采用 HTTPS 加密。我们采取访问控制与最小权限原则保护你的数据。" }, + { type: "h5", text: "四、你的权利" }, + { type: "p", text: "你可以随时在「我的」页面修改头像与昵称;可以通过「账户注销」删除个人信息与权益记录。" }, + { type: "h5", text: "五、联系我们" }, + { type: "p", text: "如对本政策有疑问,请致电 0854-5630880。" }, + ], + terms: [ + { + type: "p", + text: "欢迎使用龙里文旅小程序。本协议是你与龙里文旅之间就使用本小程序服务所订立的约定,请仔细阅读并同意后使用。", + }, + { type: "h5", text: "一、服务内容" }, + { + type: "p", + text: "本小程序面向贵州省黔南布依族苗族自治州龙里县,提供景区、旅居、美食、特产的内容导览,以及票根权益的领取与使用服务。", + }, + { type: "h5", text: "二、账号与登录" }, + { + type: "p", + text: "你可通过微信一键登录使用本小程序,浏览内容无需登录;领取与使用权益需登录并绑定手机号。未注册的手机号将自动创建账号。", + }, + { type: "h5", text: "三、权益说明" }, + { + type: "p", + text: "权益不绑定具体商品,可多次使用。使用行为仅记录使用次数与时间,不会使权益失效。权益的适用范围与最终解释权归权益提供方所有。", + }, + { type: "h5", text: "四、免责声明" }, + { + type: "p", + text: "站内营业时间、价格、联系方式等信息可能发生变动,请以商户现场公示为准。", + }, + { type: "h5", text: "五、账号注销" }, + { + type: "p", + text: "你可以随时在「我的 → 账户注销」中删除个人信息与权益记录,注销完成后账号将无法恢复。", + }, + { type: "h5", text: "六、联系我们" }, + { type: "p", text: "如对本协议有疑问,请致电 0854-5630880。" }, + ], +}; + +/** + * 把接口返回的协议正文归一化成页面需要的 [{ type, text }] 结构。 + * 兼容三种形态:纯文本 / 富文本 HTML 字符串 / 已带 type 的数组。 + */ +const normalizeAgreement = (res) => { + const data = res && (res.data !== undefined ? res.data : res); + if (Array.isArray(data)) { + return data.map((node) => + typeof node === "string" + ? { type: "p", text: node } + : { type: node.type || "p", text: node.text || node.content || "" } + ); + } + const text = typeof data === "string" ? data : (data && (data.content || data.text)) || ""; + if (!text) return []; + // 逐段拆:HTML 里的标题标签转 h5,其余转 p + return text + .split(/<\/?(?:h[1-6]|p|div|br)[^>]*>/i) + .map((s) => s.replace(/<[^>]+>/g, "").trim()) + .filter(Boolean) + .map((s) => ({ type: /^[一二三四五六七八九十]+、/.test(s) ? "h5" : "p", text: s })); +}; + +/** 协议正文 */ +export const getAgreementContent = async (type = "privacy") => { + if (!USE_MOCK_CONTENT) { + const res = + type === "terms" ? await loginApi.getServiceAgreement() : await loginApi.getPrivacyAgreement(); + const list = normalizeAgreement(res); + if (list.length) return list; + } + return clone(AGREEMENT_TEXT[type] || AGREEMENT_TEXT.privacy); +}; + +export default { + getWxCode, + wxLogin, + refreshAuthLogin, + checkUserPhone, + getLoginUserPhone, + bindUserPhone, + updateProfile, + cancelAccount, + getAgreementContent, + getAgreementTitle, +}; diff --git a/src/app.css b/src/app.css new file mode 100644 index 0000000..1b62934 --- /dev/null +++ b/src/app.css @@ -0,0 +1,368 @@ +/* =========================================================================== + 龙里文旅 · 样式总入口(Tailwind CSS v4) + --------------------------------------------------------------------------- + ① @theme 设计 Token → 原子类(bg-brand / text-cap / rounded-card / shadow-elev2 …) + ② @utility 内置原子表达不了的复合样式(满屏渐变底 / 渐变填充 / 渐变字 / 伪元素装饰) + ③ base 元素级复位(page 字体、原生 button 复位) + 页面与组件的模板里只写工具类;除本文件与脚本生成的 icons.scss 外,没有别的样式文件。 + + 单位策略:设计稿 375px 基准,真机 1px = 2rpx。 + Tailwind 的 spacing 刻度(--spacing: .25rem)经 rem2rpx 后恰好 = 4px 逻辑像素, + 因此 gap-2 = 8px、p-4 = 16px 与设计稿 1:1;非 4 的倍数一律用 px 任意值(如 mt-[6px])。 + =========================================================================== */ + +@import "weapp-tailwindcss/index.css"; + +@source "./**/*.{vue,js,ts}"; +@source not "./uni_modules"; +@source not "../dist"; +@source not "../node_modules"; + +/* --------------------------------------------------------------------------- + ① 设计 Token + --------------------------------------------------------------------------- */ +@theme { + /* ---- 品牌色板 ---- */ + --color-brand: #00b578; + --color-brand-deep: #009a67; + --color-brand-soft: #e6f8f1; + --color-brand-line: #b9ebd8; + --color-brand-lite: #3fdfa8; + --color-brand-mint: #8cf0ce; + --color-info: #3e8bf0; + --color-info-soft: #eaf3fe; + --color-info-deep: #2c6fd0; + --color-accent: #ff8a3d; + --color-accent-deep: #c9550c; + --color-accent-soft: #fff2e9; + --color-ink: #14181c; + --color-ink2: #6b7280; + --color-ink3: #9ca3af; + --color-line: #eef1f4; + --color-line2: #e4e8ec; + --color-alt: #f5f7f9; + --color-danger: #e5484d; + + /* ---- 字阶(设计稿 7 级;零散字号用 text-[13.5px] 这类任意值) ---- */ + --text-hint: 10.5px; /* 弱提示 */ + --text-cap: 12.5px; /* 辅助说明 */ + --text-body: 14.5px; /* 正文 */ + --text-title: 17px; /* 区块标题 */ + --text-h3: 21px; /* 区块主标题 */ + --text-h1: 27px; /* 页面大标题 */ + --text-display: 29px; /* 首页 hero 标题 / 权益优惠价 */ + + /* ---- 圆角 ---- */ + --radius-img: 10px; + --radius-card: 18px; + --radius-tile: 20px; + --radius-hero: 22px; + --radius-dialog: 26px; + --radius-panel: 28px; + + /* ---- 景深 / 发光 ---- */ + --shadow-elev1: 0 1px 2px rgba(8, 30, 22, 0.04), 0 6px 18px rgba(8, 30, 22, 0.05); + --shadow-elev2: 0 2px 6px rgba(8, 30, 22, 0.05), 0 18px 40px rgba(8, 30, 22, 0.1); + --shadow-elev3: 0 4px 10px rgba(8, 30, 22, 0.06), 0 28px 60px rgba(8, 30, 22, 0.16); + --shadow-hero: 0 2px 6px rgba(8, 30, 22, 0.06), 0 20px 42px rgba(8, 30, 22, 0.16); + --shadow-tile: 0 2px 6px rgba(8, 30, 22, 0.05), 0 16px 34px rgba(8, 30, 22, 0.15); + --shadow-ccard: 0 1px 2px rgba(8, 30, 22, 0.04), 0 12px 26px rgba(255, 138, 61, 0.13), + inset 0 1px 0 rgba(255, 255, 255, 0.8); + --shadow-pan: 0 -10px 26px rgba(20, 24, 28, 0.1); + --shadow-block: 0 1px 2px rgba(8, 30, 22, 0.04), 0 12px 28px rgba(8, 30, 22, 0.07); + --shadow-wcard: 0 -10px 30px rgba(6, 34, 24, 0.18); + --shadow-dialog: 0 30px 64px rgba(3, 20, 15, 0.36); + --shadow-sheet: 0 -14px 40px rgba(3, 20, 15, 0.3); + --shadow-glowbrand: 0 12px 28px rgba(0, 181, 120, 0.3); + --shadow-glowaccent: 0 8px 20px rgba(255, 138, 61, 0.34); +} + +/* --------------------------------------------------------------------------- + ② 页面满屏底「浅色晨雾」:5 枚径向柔光晕 + 纵向薄荷天光 + --------------------------------------------------------------------------- */ +@utility skin-home { + background-color: #ffffff; + background-image: radial-gradient(64% 20% at 96% 0%, rgba(92, 178, 255, 0.26) 0%, rgba(92, 178, 255, 0) 64%), + radial-gradient(86% 26% at -6% 3%, rgba(0, 181, 120, 0.22) 0%, rgba(0, 181, 120, 0) 68%), + radial-gradient(78% 30% at 106% 44%, rgba(63, 223, 168, 0.18) 0%, rgba(63, 223, 168, 0) 70%), + radial-gradient(76% 24% at 8% 88%, rgba(63, 223, 168, 0.2) 0%, rgba(63, 223, 168, 0) 70%), + radial-gradient(58% 20% at 92% 74%, rgba(120, 214, 255, 0.14) 0%, rgba(120, 214, 255, 0) 72%), + linear-gradient( + 172deg, + #9ee0c9 0%, + #b4ead8 11%, + #c9eee1 24%, + #daf5ec 39%, + #e7f9f2 55%, + #f1fbf7 72%, + #f8fdfb 88%, + #ffffff 100% + ); +} + +@utility skin-benefit { + background-color: #ffffff; + background-image: radial-gradient(64% 18% at 96% 0%, rgba(92, 178, 255, 0.24) 0%, rgba(92, 178, 255, 0) 64%), + radial-gradient(88% 24% at -6% 1%, rgba(0, 181, 120, 0.2) 0%, rgba(0, 181, 120, 0) 68%), + radial-gradient(78% 26% at 106% 54%, rgba(63, 223, 168, 0.16) 0%, rgba(63, 223, 168, 0) 70%), + linear-gradient( + 172deg, + #9ee0c9 0%, + #b4ead8 11%, + #c9eee1 24%, + #daf5ec 39%, + #e7f9f2 55%, + #f1fbf7 72%, + #f8fdfb 88%, + #ffffff 100% + ); +} + +@utility skin-login { + background-color: #ffffff; + background-image: radial-gradient(66% 20% at 98% -2%, rgba(92, 178, 255, 0.28) 0%, rgba(92, 178, 255, 0) 64%), + radial-gradient(88% 26% at -8% 6%, rgba(0, 181, 120, 0.22) 0%, rgba(0, 181, 120, 0) 68%), + radial-gradient(80% 30% at 104% 58%, rgba(63, 223, 168, 0.2) 0%, rgba(63, 223, 168, 0) 70%), + radial-gradient(70% 26% at 2% 92%, rgba(120, 214, 255, 0.2) 0%, rgba(120, 214, 255, 0) 72%), + linear-gradient( + 172deg, + #9ee0c9 0%, + #b4ead8 11%, + #c9eee1 24%, + #daf5ec 39%, + #e7f9f2 55%, + #f1fbf7 72%, + #f8fdfb 88%, + #ffffff 100% + ); +} + +/* 详情页例外:长内容页不铺满屏渐变,用淡薄荷画布 + 3 枚柔光晕压低体量 */ +@utility skin-detail { + background-color: #fbfefd; + background-image: radial-gradient(72% 20% at 100% 14%, rgba(92, 178, 255, 0.16) 0%, rgba(92, 178, 255, 0) 68%), + radial-gradient(86% 24% at -8% 30%, rgba(0, 181, 120, 0.16) 0%, rgba(0, 181, 120, 0) 70%), + radial-gradient(78% 30% at 106% 80%, rgba(63, 223, 168, 0.13) 0%, rgba(63, 223, 168, 0) 72%), + linear-gradient(180deg, #f0faf5 0%, #f7fcfa 34%, #fbfefd 100%); +} + +/* --------------------------------------------------------------------------- + ② 渐变填充 + --------------------------------------------------------------------------- */ +@utility grad-brand { + background-image: linear-gradient(135deg, #3fdfa8 0%, #00b578 46%, #00875c 100%); +} +@utility grad-accent { + background-image: linear-gradient(135deg, #ffb067 0%, #ff8a3d 48%, #f1690f 100%); +} +@utility grad-brand-soft { + background-image: linear-gradient(135deg, #eafbf4 0%, #ffffff 58%, #edf6ff 100%); +} +@utility grad-cardside { + background-image: linear-gradient(148deg, #fff7f0 0%, #fffdfb 56%, #fff2e6 100%); +} +@utility grad-promo { + background-image: linear-gradient(152deg, #e7faf2 0%, #f7fdfa 34%, #ffffff 66%); +} +@utility grad-danger { + background-image: linear-gradient(135deg, #f2686c 0%, #d93a40 100%); +} +@utility grad-call { + background-image: linear-gradient(135deg, #00c583 0%, #00a46c 100%); +} +/* 地址条:品牌极淡染色 */ +@utility grad-address { + background-image: linear-gradient(180deg, rgba(0, 181, 120, 0.07) 0%, rgba(0, 181, 120, 0.035) 100%); +} +/* Tab 栏顶边渐变发丝线 / 登录页竖分隔线 */ +@utility grad-hairline { + background-image: linear-gradient( + 90deg, + transparent 0%, + rgba(0, 181, 120, 0.45) 28%, + rgba(62, 139, 240, 0.4) 72%, + transparent 100% + ); +} +@utility grad-divider { + background-image: linear-gradient(180deg, transparent 0%, rgba(0, 181, 120, 0.22) 50%, transparent 100%); +} + +/* --------------------------------------------------------------------------- + ② 图上压字遮罩(scrim) + 图卡文字锚顶部时遮罩必须顶部最重,锚底部时相反;这几条写法冗长且需成对使用, + 落成工具类比在模板里塞超长任意值可读得多。 + --------------------------------------------------------------------------- */ +@utility scrim-tile { + background-image: linear-gradient( + 180deg, + rgba(2, 22, 16, 0.86) 0%, + rgba(2, 22, 16, 0.62) 36%, + rgba(2, 22, 16, 0.22) 60%, + rgba(2, 22, 16, 0.72) 100% + ); +} +@utility scrim-tile-tall { + background-image: linear-gradient( + 180deg, + rgba(2, 22, 16, 0.8) 0%, + rgba(2, 22, 16, 0.5) 26%, + rgba(2, 22, 16, 0.16) 52%, + rgba(2, 22, 16, 0.7) 100% + ); +} +@utility scrim-hero { + background-image: linear-gradient( + 172deg, + rgba(4, 26, 19, 0.66) 0%, + rgba(4, 26, 19, 0.22) 40%, + rgba(4, 26, 19, 0.62) 100% + ); +} +@utility scrim-hd { + background-image: linear-gradient( + 180deg, + rgba(8, 26, 20, 0.34) 0%, + rgba(8, 26, 20, 0.12) 42%, + rgba(8, 26, 20, 0.9) 100% + ); +} +@utility scrim-map { + background-image: linear-gradient( + 96deg, + rgba(5, 30, 22, 0.76) 0%, + rgba(5, 30, 22, 0.4) 48%, + rgba(5, 30, 22, 0.04) 100% + ); +} +@utility scrim-dtop { + background-image: linear-gradient(180deg, rgba(4, 26, 19, 0.62) 0%, rgba(4, 26, 19, 0.2) 62%, transparent 100%); +} +@utility scrim-dbottom { + background-image: linear-gradient(0deg, rgba(6, 30, 22, 0.66) 0%, rgba(6, 30, 22, 0.24) 44%, transparent 100%); +} +@utility scrim-rec { + background-image: linear-gradient(0deg, rgba(6, 30, 22, 0.82) 0%, rgba(6, 30, 22, 0.3) 58%, transparent 100%); +} +@utility scrim-cover { + background-image: linear-gradient( + 105deg, + rgba(255, 247, 240, 0.97) 0%, + rgba(255, 247, 240, 0.24) 40%, + rgba(3, 26, 20, 0.46) 100% + ); +} + +/* --------------------------------------------------------------------------- + ② 渐变字(-webkit- 前缀必须保留:iOS 只认带前缀的 background-clip:text) + --------------------------------------------------------------------------- */ +@utility gradtext-brand { + background-image: linear-gradient(135deg, #3fdfa8 0%, #00b578 46%, #00875c 100%); + -webkit-background-clip: text; + background-clip: text; + color: transparent; +} +@utility gradtext-accent { + background-image: linear-gradient(135deg, #ffb067 0%, #ff8a3d 48%, #f1690f 100%); + -webkit-background-clip: text; + background-clip: text; + color: transparent; +} + +/* --------------------------------------------------------------------------- + ② 伪元素装饰(WXSS 支持 view 的 ::before/::after,但模板里写不出来,只能落成工具类) + --------------------------------------------------------------------------- */ + +/* 卡片标题前的渐变圆点(::before 是 flex 子项,需 flex:none 防止被压缩) */ +@utility deco-titledot { + &::before { + content: ""; + flex: none; + width: 8px; + height: 8px; + border-radius: 50%; + background-image: linear-gradient(135deg, #3fdfa8 0%, #00b578 46%, #00875c 100%); + box-shadow: 0 0 0 3px rgba(0, 181, 120, 0.13); + } +} + +/* 板块列表页左侧分组导航:选中态左侧竖条 */ +@utility deco-mark { + &::before { + content: ""; + position: absolute; + left: 0; + top: 19px; + width: 3px; + height: 26px; + border-radius: 0 3px 3px 0; + background: #00b578; + } +} + +/* 我的权益状态子分段:选中态下划线 */ +@utility deco-underline { + &::after { + content: ""; + position: absolute; + left: 0; + right: 0; + bottom: -0.5px; + height: 2px; + border-radius: 2px; + background: #00b578; + } +} + +/* Tab 栏顶部 1px 渐变线 */ +@utility deco-hairline { + &::before { + content: ""; + position: absolute; + left: 0; + right: 0; + top: 0; + height: 1px; + background-image: linear-gradient( + 90deg, + transparent 0%, + rgba(0, 181, 120, 0.45) 28%, + rgba(62, 139, 240, 0.4) 72%, + transparent 100% + ); + } +} + +/* --------------------------------------------------------------------------- + ② 原生 button 复位(用于 open-type 能力按钮:getPhoneNumber / chooseAvatar) + --------------------------------------------------------------------------- */ +@utility btn-reset { + padding: 0; + margin: 0; + line-height: normal; + border: none; + background-color: transparent; + background-image: none; + font-size: inherit; + color: inherit; + overflow: visible; + &::after { + border: none; + } +} + +/* --------------------------------------------------------------------------- + ③ 元素级复位 + --------------------------------------------------------------------------- */ +page { + font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif; + -webkit-font-smoothing: antialiased; + font-size: 14.5px; + color: #14181c; + background-color: #ffffff; +} + +/* 小程序原生 button 默认带 1px 边框(::after 伪元素),全站去掉 */ +button::after { + border: none; +} diff --git a/src/components/AppDialog/index.vue b/src/components/AppDialog/index.vue new file mode 100644 index 0000000..bc4aae9 --- /dev/null +++ b/src/components/AppDialog/index.vue @@ -0,0 +1,76 @@ + + + diff --git a/src/components/AppIcon/index.vue b/src/components/AppIcon/index.vue new file mode 100644 index 0000000..e654073 --- /dev/null +++ b/src/components/AppIcon/index.vue @@ -0,0 +1,26 @@ + + + diff --git a/src/components/AppNavBar/index.vue b/src/components/AppNavBar/index.vue new file mode 100644 index 0000000..c851fa2 --- /dev/null +++ b/src/components/AppNavBar/index.vue @@ -0,0 +1,86 @@ + + + diff --git a/src/components/AppStatusBar/index.vue b/src/components/AppStatusBar/index.vue new file mode 100644 index 0000000..d823eb9 --- /dev/null +++ b/src/components/AppStatusBar/index.vue @@ -0,0 +1,20 @@ + + + diff --git a/src/components/AppTabBar/index.vue b/src/components/AppTabBar/index.vue new file mode 100644 index 0000000..51541f9 --- /dev/null +++ b/src/components/AppTabBar/index.vue @@ -0,0 +1,47 @@ + + + diff --git a/src/components/BenefitCard/index.vue b/src/components/BenefitCard/index.vue new file mode 100644 index 0000000..463047b --- /dev/null +++ b/src/components/BenefitCard/index.vue @@ -0,0 +1,187 @@ + + + diff --git a/src/components/BenefitDialog/index.vue b/src/components/BenefitDialog/index.vue new file mode 100644 index 0000000..afe0e3b --- /dev/null +++ b/src/components/BenefitDialog/index.vue @@ -0,0 +1,88 @@ + + + diff --git a/src/components/ContentCard/index.vue b/src/components/ContentCard/index.vue new file mode 100644 index 0000000..c7cdeb4 --- /dev/null +++ b/src/components/ContentCard/index.vue @@ -0,0 +1,73 @@ + + + diff --git a/src/components/EmptyBox/index.vue b/src/components/EmptyBox/index.vue new file mode 100644 index 0000000..5015584 --- /dev/null +++ b/src/components/EmptyBox/index.vue @@ -0,0 +1,20 @@ + + + diff --git a/src/components/SectionTile/index.vue b/src/components/SectionTile/index.vue new file mode 100644 index 0000000..aea6875 --- /dev/null +++ b/src/components/SectionTile/index.vue @@ -0,0 +1,96 @@ + + + diff --git a/src/config/env.js b/src/config/env.js new file mode 100644 index 0000000..93e8aec --- /dev/null +++ b/src/config/env.js @@ -0,0 +1,73 @@ +/** + * 环境与全局配置 + * --------------------------------------------------------------------------- + * 约定(需求说明 §10.1): + * - 图片地址一律走数据字段(item.main_image_url / gallery_urls / benefit.image_url), + * 页面禁止硬编码 OSS 域名或拼接路径;本文件只保留兜底占位图与合法域名说明。 + * - 接口 baseURL 集中在此,多环境切换只改这一个文件。 + * + * 数据源分两个方向独立开关: + * - USE_MOCK_CONTENT:内容 / 权益。后端接口尚未提供,一期读 src/mock/*;api 层统一分流,页面无感。 + * - USE_MOCK_USER :登录 / 用户。走真实网关,不再单独造 mock。 + */ + +/** 内容 / 权益:仍读本地数据 */ +export const USE_MOCK_CONTENT = true; + +/** 登录 / 用户:走真实接口 */ +export const USE_MOCK_USER = false; + +/** + * 网关客户端标识。 + * 龙里文旅与 YGChatCS 的「朵朵」是同一个后端客户端(appId 同为 wx23f86d809ae80259), + * 请求头带 clientId: "2" 即可通过网关鉴权。 + */ +export const CLIENT_ID = "2"; + +/** 版本号:发版前递增;服务地址接口用它换当前环境的 httpUrl */ +export const VERSION = "1.0.0"; + +/** 生产网关(服务地址查询接口固定挂在这里) */ +export const BASE_URL_PRO = "https://biz.nianxx.cn"; + +/** 测试网关(拉不到服务地址时的兜底) */ +export const BASE_URL_DEV = "https://onefeel.brother7.cn/ingress"; + +/** 服务地址查询路径 */ +export const SERVICE_URL_PATH = "/hotelBiz/versionManager/getInfo"; + +/** + * 联调兜底开关:填了就用它当 baseURL,跳过服务地址接口。 + * 例:export const FORCE_BASE_URL = "https://onefeel.brother7.cn/ingress"; + */ +export const FORCE_BASE_URL = ""; + +/** 请求超时(ms) */ +export const REQUEST_TIMEOUT = 10000; + +/** + * 图片 CDN 说明性常量:仅用于「关于我们 / 文档」处的展示, + * 业务代码请勿用它拼接图片地址。 + * 提审前需在小程序后台把该域名加入 downloadFile 合法域名。 + */ +export const IMAGE_HOST = "one-feel-bucket.oss-cn-guangzhou.aliyuncs.com"; + +/** 本地占位图(仅 binderror 兜底;缺图可由数据层给出默认值) */ +export const PLACEHOLDER_IMAGE = "/static/placeholder.png"; + +const ENV = { + useMockContent: USE_MOCK_CONTENT, + useMockUser: USE_MOCK_USER, + baseUrl: FORCE_BASE_URL || BASE_URL_DEV, + timeout: REQUEST_TIMEOUT, + clientId: CLIENT_ID, + version: VERSION, +}; + +export const getEnvConfig = () => ENV; + +export const setBaseUrl = (url) => { + if (url) ENV.baseUrl = url; +}; + +export default ENV; diff --git a/src/constant/index.js b/src/constant/index.js new file mode 100644 index 0000000..a90cf90 --- /dev/null +++ b/src/constant/index.js @@ -0,0 +1,109 @@ +/** + * 全局常量:存储键、枚举、文案、事件名 + */ + +/** 本地存储键(统一前缀,避免与同宿主其它小程序冲突) */ +export const STORAGE_KEYS = { + ACCESS_TOKEN: "LONGLI_ACCESS_TOKEN", + REFRESH_TOKEN: "LONGLI_REFRESH_TOKEN", + USER_INFO: "LONGLI_USER_INFO", + BENEFIT_STATE: "LONGLI_BENEFIT_STATE", +}; + +/** 全局事件名 */ +export const NOTICE_EVENT_LOGOUT = "NOTICE_EVENT_LOGOUT"; +export const NOTICE_EVENT_LOGIN_SUCCESS = "NOTICE_EVENT_LOGIN_SUCCESS"; + +/** 权益状态机(4 态 · v0.8 起收敛,已删除 used 终态) */ +export const BENEFIT_STATUS = { + /** 可领取(尚未领取) */ + AVAILABLE: "available", + /** 已领取 · 可使用(可重复使用,无次数上限) */ + CLAIMED: "claimed", + /** 已失效(超过有效期) */ + EXPIRED: "expired", + /** 名额发完 */ + SOLD_OUT: "sold_out", +}; + +/** 权益类型 → 展示名(用于筛选 chip 与卡片类型行) */ +export const BENEFIT_TYPES = [ + { key: "all", label: "全部" }, + { key: "ticket", label: "景区游玩" }, + { key: "lodging", label: "住宿" }, + { key: "food", label: "餐饮" }, + { key: "specialty", label: "特产" }, +]; + +export const BENEFIT_TYPE_LABEL = { + ticket: "景区 / 游玩权益", + lodging: "住宿权益", + food: "餐饮权益", + specialty: "特产权益", + general: "通用权益", +}; + +/** 权益类型 → 卡片类型行图标 */ +export const BENEFIT_TYPE_ICON = { + ticket: "peak", + lodging: "bed", + food: "food", + specialty: "ticket", + general: "gift", +}; + +/** 我的权益状态子分段(全部 / 可使用 / 已失效) */ +export const BENEFIT_SUB_TABS = [ + { key: "all", label: "全部" }, + { key: "usable", label: "可使用" }, + { key: "invalid", label: "已失效" }, +]; + +/** 内容集合 → 详情页介绍标题(v0.9:按内容类型命名) */ +export const INTRO_TITLE = { + attractions: "景区介绍", + attraction_subprojects: "景区介绍", + accommodations: "酒店介绍", + foods: "美食介绍", + specialties: "特产介绍", +}; + +/** 集合 → 所属板块 key */ +export const SECTION_OF_COLLECTION = { + attractions: "tourism", + attraction_subprojects: "tourism", + accommodations: "lodging", + foods: "food", + specialties: "specialties", +}; + +/** 运营信息 */ +export const CUSTOMER_SERVICE_PHONE = "0854-5630880"; +export const CUSTOMER_SERVICE_TIME = "09:00 - 18:00"; +export const OPERATOR_NAME = "智念科技"; +export const APP_VERSION = "v1.0.0"; +export const APP_VERSION_FULL = "v1.0.0(Build 100)"; +export const REGION_TEXT = "贵州省黔南布依族苗族自治州龙里县"; + +/** 协议页更新/生效日期 */ +export const AGREEMENT_DATE = "2026 年 9 月 11 日"; + +/** Tab 配置(自绘 Tab 栏) */ +export const TABS = [ + { key: "home", label: "主页", icon: "home", path: "/pages/home/index" }, + { key: "benefit", label: "权益", icon: "ticket", path: "/pages/benefit/index" }, + { key: "mine", label: "我的", icon: "user", path: "/pages/mine/index" }, +]; + +/** 页面路径常量 */ +export const ROUTES = { + HOME: "/pages/home/index", + BENEFIT: "/pages/benefit/index", + MINE: "/pages/mine/index", + LOGIN: "/pages/login/index", + CATALOG: "/pages-sub/catalog/index", + DETAIL: "/pages-sub/detail/index", + AGREEMENT: "/pages-sub/agreement/index", + ABOUT: "/pages-sub/about/index", + ACCOUNT_CANCEL: "/pages-sub/account/cancel", +}; diff --git a/src/constant/token.js b/src/constant/token.js new file mode 100644 index 0000000..2c4536d --- /dev/null +++ b/src/constant/token.js @@ -0,0 +1,41 @@ +/** + * 登录态读写(access_token / refresh_token / 用户信息) + * 与 YGChatCS 的 constant/token.js 同构,只是键名换成 LONGLI_ 前缀。 + */ +import { STORAGE_KEYS } from "@/constant"; + +export const getAccessToken = () => uni.getStorageSync(STORAGE_KEYS.ACCESS_TOKEN) || ""; + +export const setAccessToken = (token) => { + uni.setStorageSync(STORAGE_KEYS.ACCESS_TOKEN, token || ""); +}; + +export const removeAccessToken = () => { + uni.removeStorageSync(STORAGE_KEYS.ACCESS_TOKEN); +}; + +export const getRefreshToken = () => uni.getStorageSync(STORAGE_KEYS.REFRESH_TOKEN) || ""; + +export const setRefreshToken = (token) => { + uni.setStorageSync(STORAGE_KEYS.REFRESH_TOKEN, token || ""); +}; + +export const removeRefreshToken = () => { + uni.removeStorageSync(STORAGE_KEYS.REFRESH_TOKEN); +}; + +export const getUserInfo = () => uni.getStorageSync(STORAGE_KEYS.USER_INFO) || null; + +export const setUserInfo = (info) => { + uni.setStorageSync(STORAGE_KEYS.USER_INFO, info || null); +}; + +export const removeUserInfo = () => { + uni.removeStorageSync(STORAGE_KEYS.USER_INFO); +}; + +export const clearLoginState = () => { + removeAccessToken(); + removeRefreshToken(); + removeUserInfo(); +}; diff --git a/src/main.js b/src/main.js new file mode 100644 index 0000000..9a41a1a --- /dev/null +++ b/src/main.js @@ -0,0 +1,10 @@ +import { createSSRApp } from "vue"; +import { createPinia } from "pinia"; +import App from "./App.vue"; +import "./app.css"; + +export function createApp() { + const app = createSSRApp(App); + app.use(createPinia()); + return { app }; +} diff --git a/src/manifest.json b/src/manifest.json new file mode 100644 index 0000000..963f03b --- /dev/null +++ b/src/manifest.json @@ -0,0 +1,50 @@ +{ + "name": "龙里文旅", + "appid": "", + "description": "龙里县全域文旅导览与票根权益小程序", + "versionName": "1.0.0", + "versionCode": "100", + "transformPx": false, + "app-plus": { + "usingComponents": true, + "nvueStyleCompiler": "uni-app", + "compilerVersion": 3, + "splashscreen": { + "alwaysShowBeforeRender": true, + "waiting": true, + "autoclose": true, + "delay": 0 + }, + "modules": {}, + "distribute": { + "android": { + "permissions": [] + }, + "ios": {}, + "sdkConfigs": {} + } + }, + "quickapp": {}, + "mp-weixin": { + "appid": "wx23f86d809ae80259", + "setting": { + "urlCheck": false, + "es6": true, + "minified": true, + "postcss": true, + "bigPackageSizeSupport": true + }, + "usingComponents": true, + "lazyCodeLoading": "requiredComponents", + "permission": {}, + "requiredPrivateInfos": [], + "darkmode": false + }, + "h5": { + "title": "龙里文旅", + "router": { + "mode": "hash" + } + }, + "vueVersion": "3" +} diff --git a/src/mock/assets.json b/src/mock/assets.json new file mode 100644 index 0000000..c2dce08 --- /dev/null +++ b/src/mock/assets.json @@ -0,0 +1,2294 @@ +[ + { + "asset_id": "asset-0001", + "content_type": "image/jpeg", + "entity_id": "attraction-001", + "entity_name": "龙里水乡旅游生态城", + "entity_type": "attraction", + "height_px": 490, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-001/01.jpg", + "role": "main", + "sort_order": 1, + "width_px": 1759 + }, + { + "asset_id": "asset-0002", + "content_type": "image/jpeg", + "entity_id": "attraction-001", + "entity_name": "龙里水乡旅游生态城", + "entity_type": "attraction", + "height_px": 624, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-001/02.jpg", + "role": "gallery", + "sort_order": 2, + "width_px": 1039 + }, + { + "asset_id": "asset-0003", + "content_type": "image/jpeg", + "entity_id": "attraction-001", + "entity_name": "龙里水乡旅游生态城", + "entity_type": "attraction", + "height_px": 612, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-001/03.jpg", + "role": "gallery", + "sort_order": 3, + "width_px": 873 + }, + { + "asset_id": "asset-0004", + "content_type": "image/jpeg", + "entity_id": "attraction-subproject-002", + "entity_name": "龙乡水里·贵秀", + "entity_type": "attraction_subproject", + "height_px": 787, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attraction_subprojects/attraction-subproject-002/01.jpg", + "role": "main", + "sort_order": 1, + "width_px": 1268 + }, + { + "asset_id": "asset-0005", + "content_type": "image/jpeg", + "entity_id": "attraction-subproject-002", + "entity_name": "龙乡水里·贵秀", + "entity_type": "attraction_subproject", + "height_px": 576, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attraction_subprojects/attraction-subproject-002/02.jpg", + "role": "gallery", + "sort_order": 2, + "width_px": 835 + }, + { + "asset_id": "asset-0006", + "content_type": "image/jpeg", + "entity_id": "attraction-015", + "entity_name": "莲花四季花海", + "entity_type": "attraction", + "height_px": 745, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-015/01.jpg", + "role": "main", + "sort_order": 1, + "width_px": 1080 + }, + { + "asset_id": "asset-0007", + "content_type": "image/jpeg", + "entity_id": "attraction-015", + "entity_name": "莲花四季花海", + "entity_type": "attraction", + "height_px": 541, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-015/02.jpg", + "role": "gallery", + "sort_order": 2, + "width_px": 573 + }, + { + "asset_id": "asset-0008", + "content_type": "image/jpeg", + "entity_id": "attraction-015", + "entity_name": "莲花四季花海", + "entity_type": "attraction", + "height_px": 384, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-015/03.jpg", + "role": "gallery", + "sort_order": 3, + "width_px": 570 + }, + { + "asset_id": "asset-0009", + "content_type": "image/jpeg", + "entity_id": "attraction-016", + "entity_name": "姊妹湖花海", + "entity_type": "attraction", + "height_px": 339, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-016/01.jpg", + "role": "main", + "sort_order": 1, + "width_px": 605 + }, + { + "asset_id": "asset-0010", + "content_type": "image/jpeg", + "entity_id": "attraction-016", + "entity_name": "姊妹湖花海", + "entity_type": "attraction", + "height_px": 314, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-016/02.jpg", + "role": "gallery", + "sort_order": 2, + "width_px": 605 + }, + { + "asset_id": "asset-0011", + "content_type": "image/png", + "entity_id": "tourism-guide-qr", + "entity_name": "旅游招商手册二维码(旅游指南)", + "entity_type": "support", + "height_px": 400, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/support/qr_codes/tourism-guide-qr.png", + "role": "qr_code", + "sort_order": 1, + "width_px": 400 + }, + { + "asset_id": "asset-0012", + "content_type": "image/jpeg", + "entity_id": "attraction-subproject-001", + "entity_name": "飞越丛林", + "entity_type": "attraction_subproject", + "height_px": 472, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attraction_subprojects/attraction-subproject-001/01.jpg", + "role": "main", + "sort_order": 1, + "width_px": 701 + }, + { + "asset_id": "asset-0013", + "content_type": "image/jpeg", + "entity_id": "attraction-subproject-001", + "entity_name": "飞越丛林", + "entity_type": "attraction_subproject", + "height_px": 469, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attraction_subprojects/attraction-subproject-001/02.jpg", + "role": "gallery", + "sort_order": 2, + "width_px": 700 + }, + { + "asset_id": "asset-0014", + "content_type": "image/jpeg", + "entity_id": "attraction-subproject-001", + "entity_name": "飞越丛林", + "entity_type": "attraction_subproject", + "height_px": 553, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attraction_subprojects/attraction-subproject-001/03.jpg", + "role": "gallery", + "sort_order": 3, + "width_px": 368 + }, + { + "asset_id": "asset-0015", + "content_type": "image/jpeg", + "entity_id": "attraction-014", + "entity_name": "龙湖花海", + "entity_type": "attraction", + "height_px": 451, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-014/01.jpg", + "role": "main", + "sort_order": 1, + "width_px": 969 + }, + { + "asset_id": "asset-0016", + "content_type": "image/jpeg", + "entity_id": "attraction-014", + "entity_name": "龙湖花海", + "entity_type": "attraction", + "height_px": 451, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-014/02.jpg", + "role": "gallery", + "sort_order": 2, + "width_px": 918 + }, + { + "asset_id": "asset-0017", + "content_type": "image/png", + "entity_id": "tourism-overview-map", + "entity_name": "龙里县全域旅游示意图", + "entity_type": "support", + "height_px": 3262, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/maps/tourism-overview-map.png", + "role": "map", + "sort_order": 1, + "width_px": 2037 + }, + { + "asset_id": "asset-0018", + "content_type": "image/jpeg", + "entity_id": "attraction-006", + "entity_name": "云从朵花温泉度假中心", + "entity_type": "attraction", + "height_px": 460, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-006/01.jpg", + "role": "main", + "sort_order": 1, + "width_px": 1291 + }, + { + "asset_id": "asset-0019", + "content_type": "image/jpeg", + "entity_id": "attraction-006", + "entity_name": "云从朵花温泉度假中心", + "entity_type": "attraction", + "height_px": 853, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-006/02.jpg", + "role": "gallery", + "sort_order": 2, + "width_px": 1516 + }, + { + "asset_id": "asset-0020", + "content_type": "image/jpeg", + "entity_id": "attraction-006", + "entity_name": "云从朵花温泉度假中心", + "entity_type": "attraction", + "height_px": 298, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-006/03.jpg", + "role": "gallery", + "sort_order": 3, + "width_px": 695 + }, + { + "asset_id": "asset-0021", + "content_type": "image/jpeg", + "entity_id": "attraction-006", + "entity_name": "云从朵花温泉度假中心", + "entity_type": "attraction", + "height_px": 361, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-006/04.jpg", + "role": "gallery", + "sort_order": 4, + "width_px": 601 + }, + { + "asset_id": "asset-0022", + "content_type": "image/jpeg", + "entity_id": "attraction-003", + "entity_name": "双龙镇·巫山峡谷", + "entity_type": "attraction", + "height_px": 467, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-003/01.jpg", + "role": "main", + "sort_order": 1, + "width_px": 800 + }, + { + "asset_id": "asset-0023", + "content_type": "image/jpeg", + "entity_id": "attraction-003", + "entity_name": "双龙镇·巫山峡谷", + "entity_type": "attraction", + "height_px": 467, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-003/02.jpg", + "role": "gallery", + "sort_order": 2, + "width_px": 763 + }, + { + "asset_id": "asset-0024", + "content_type": "image/jpeg", + "entity_id": "attraction-003", + "entity_name": "双龙镇·巫山峡谷", + "entity_type": "attraction", + "height_px": 229, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-003/03.jpg", + "role": "gallery", + "sort_order": 3, + "width_px": 385 + }, + { + "asset_id": "asset-0025", + "content_type": "image/jpeg", + "entity_id": "attraction-003", + "entity_name": "双龙镇·巫山峡谷", + "entity_type": "attraction", + "height_px": 228, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-003/04.jpg", + "role": "gallery", + "sort_order": 4, + "width_px": 385 + }, + { + "asset_id": "asset-0026", + "content_type": "image/jpeg", + "entity_id": "attraction-004", + "entity_name": "龙架山国家森林公园", + "entity_type": "attraction", + "height_px": 571, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-004/01.jpg", + "role": "main", + "sort_order": 1, + "width_px": 856 + }, + { + "asset_id": "asset-0027", + "content_type": "image/jpeg", + "entity_id": "attraction-004", + "entity_name": "龙架山国家森林公园", + "entity_type": "attraction", + "height_px": 309, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-004/02.jpg", + "role": "gallery", + "sort_order": 2, + "width_px": 693 + }, + { + "asset_id": "asset-0028", + "content_type": "image/jpeg", + "entity_id": "attraction-004", + "entity_name": "龙架山国家森林公园", + "entity_type": "attraction", + "height_px": 308, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-004/03.jpg", + "role": "gallery", + "sort_order": 3, + "width_px": 536 + }, + { + "asset_id": "asset-0029", + "content_type": "image/jpeg", + "entity_id": "attraction-004", + "entity_name": "龙架山国家森林公园", + "entity_type": "attraction", + "height_px": 308, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-004/04.jpg", + "role": "gallery", + "sort_order": 4, + "width_px": 536 + }, + { + "asset_id": "asset-0030", + "content_type": "image/jpeg", + "entity_id": "attraction-007", + "entity_name": "龙里大草原", + "entity_type": "attraction", + "height_px": 976, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-007/01.jpg", + "role": "main", + "sort_order": 1, + "width_px": 2170 + }, + { + "asset_id": "asset-0031", + "content_type": "image/jpeg", + "entity_id": "attraction-007", + "entity_name": "龙里大草原", + "entity_type": "attraction", + "height_px": 369, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-007/02.jpg", + "role": "gallery", + "sort_order": 2, + "width_px": 624 + }, + { + "asset_id": "asset-0032", + "content_type": "image/jpeg", + "entity_id": "attraction-007", + "entity_name": "龙里大草原", + "entity_type": "attraction", + "height_px": 456, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-007/03.jpg", + "role": "gallery", + "sort_order": 3, + "width_px": 696 + }, + { + "asset_id": "asset-0033", + "content_type": "image/jpeg", + "entity_id": "attraction-002", + "entity_name": "龙里油画大草原景区", + "entity_type": "attraction", + "height_px": 596, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-002/01.jpg", + "role": "main", + "sort_order": 1, + "width_px": 1158 + }, + { + "asset_id": "asset-0034", + "content_type": "image/jpeg", + "entity_id": "attraction-002", + "entity_name": "龙里油画大草原景区", + "entity_type": "attraction", + "height_px": 322, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-002/02.jpg", + "role": "gallery", + "sort_order": 2, + "width_px": 852 + }, + { + "asset_id": "asset-0035", + "content_type": "image/jpeg", + "entity_id": "attraction-002", + "entity_name": "龙里油画大草原景区", + "entity_type": "attraction", + "height_px": 265, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-002/03.jpg", + "role": "gallery", + "sort_order": 3, + "width_px": 423 + }, + { + "asset_id": "asset-0036", + "content_type": "image/jpeg", + "entity_id": "attraction-002", + "entity_name": "龙里油画大草原景区", + "entity_type": "attraction", + "height_px": 265, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-002/04.jpg", + "role": "gallery", + "sort_order": 4, + "width_px": 422 + }, + { + "asset_id": "asset-0037", + "content_type": "image/jpeg", + "entity_id": "attraction-009", + "entity_name": "贾托山风景区", + "entity_type": "attraction", + "height_px": 1017, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-009/01.jpg", + "role": "main", + "sort_order": 1, + "width_px": 1918 + }, + { + "asset_id": "asset-0038", + "content_type": "image/jpeg", + "entity_id": "attraction-009", + "entity_name": "贾托山风景区", + "entity_type": "attraction", + "height_px": 448, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-009/02.jpg", + "role": "gallery", + "sort_order": 2, + "width_px": 836 + }, + { + "asset_id": "asset-0039", + "content_type": "image/jpeg", + "entity_id": "attraction-009", + "entity_name": "贾托山风景区", + "entity_type": "attraction", + "height_px": 450, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-009/03.jpg", + "role": "gallery", + "sort_order": 3, + "width_px": 839 + }, + { + "asset_id": "asset-0040", + "content_type": "image/jpeg", + "entity_id": "attraction-010", + "entity_name": "孔雀寨景区", + "entity_type": "attraction", + "height_px": 342, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-010/01.jpg", + "role": "main", + "sort_order": 1, + "width_px": 423 + }, + { + "asset_id": "asset-0041", + "content_type": "image/jpeg", + "entity_id": "attraction-010", + "entity_name": "孔雀寨景区", + "entity_type": "attraction", + "height_px": 342, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-010/02.jpg", + "role": "gallery", + "sort_order": 2, + "width_px": 423 + }, + { + "asset_id": "asset-0042", + "content_type": "image/jpeg", + "entity_id": "attraction-010", + "entity_name": "孔雀寨景区", + "entity_type": "attraction", + "height_px": 342, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-010/03.jpg", + "role": "gallery", + "sort_order": 3, + "width_px": 424 + }, + { + "asset_id": "asset-0043", + "content_type": "image/jpeg", + "entity_id": "attraction-011", + "entity_name": "莲花湿地公园", + "entity_type": "attraction", + "height_px": 555, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-011/01.jpg", + "role": "main", + "sort_order": 1, + "width_px": 979 + }, + { + "asset_id": "asset-0044", + "content_type": "image/jpeg", + "entity_id": "attraction-011", + "entity_name": "莲花湿地公园", + "entity_type": "attraction", + "height_px": 522, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-011/02.jpg", + "role": "gallery", + "sort_order": 2, + "width_px": 942 + }, + { + "asset_id": "asset-0045", + "content_type": "image/jpeg", + "entity_id": "attraction-011", + "entity_name": "莲花湿地公园", + "entity_type": "attraction", + "height_px": 522, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-011/03.jpg", + "role": "gallery", + "sort_order": 3, + "width_px": 941 + }, + { + "asset_id": "asset-0046", + "content_type": "image/jpeg", + "entity_id": "attraction-012", + "entity_name": "龙门镇", + "entity_type": "attraction", + "height_px": 517, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-012/01.jpg", + "role": "main", + "sort_order": 1, + "width_px": 898 + }, + { + "asset_id": "asset-0047", + "content_type": "image/jpeg", + "entity_id": "attraction-012", + "entity_name": "龙门镇", + "entity_type": "attraction", + "height_px": 383, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-012/02.jpg", + "role": "gallery", + "sort_order": 2, + "width_px": 508 + }, + { + "asset_id": "asset-0048", + "content_type": "image/jpeg", + "entity_id": "attraction-012", + "entity_name": "龙门镇", + "entity_type": "attraction", + "height_px": 516, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-012/03.jpg", + "role": "gallery", + "sort_order": 3, + "width_px": 376 + }, + { + "asset_id": "asset-0049", + "content_type": "image/jpeg", + "entity_id": "attraction-012", + "entity_name": "龙门镇", + "entity_type": "attraction", + "height_px": 251, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-012/04.jpg", + "role": "gallery", + "sort_order": 4, + "width_px": 484 + }, + { + "asset_id": "asset-0050", + "content_type": "image/jpeg", + "entity_id": "attraction-008", + "entity_name": "十里刺梨沟景区", + "entity_type": "attraction", + "height_px": 419, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-008/01.jpg", + "role": "main", + "sort_order": 1, + "width_px": 638 + }, + { + "asset_id": "asset-0051", + "content_type": "image/jpeg", + "entity_id": "attraction-008", + "entity_name": "十里刺梨沟景区", + "entity_type": "attraction", + "height_px": 418, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-008/02.jpg", + "role": "gallery", + "sort_order": 2, + "width_px": 637 + }, + { + "asset_id": "asset-0052", + "content_type": "image/jpeg", + "entity_id": "attraction-008", + "entity_name": "十里刺梨沟景区", + "entity_type": "attraction", + "height_px": 417, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-008/03.jpg", + "role": "gallery", + "sort_order": 3, + "width_px": 638 + }, + { + "asset_id": "asset-0053", + "content_type": "image/jpeg", + "entity_id": "attraction-008", + "entity_name": "十里刺梨沟景区", + "entity_type": "attraction", + "height_px": 433, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-008/04.jpg", + "role": "gallery", + "sort_order": 4, + "width_px": 927 + }, + { + "asset_id": "asset-0054", + "content_type": "image/jpeg", + "entity_id": "attraction-013", + "entity_name": "赶场村", + "entity_type": "attraction", + "height_px": 705, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-013/01.jpg", + "role": "main", + "sort_order": 1, + "width_px": 938 + }, + { + "asset_id": "asset-0055", + "content_type": "image/jpeg", + "entity_id": "attraction-013", + "entity_name": "赶场村", + "entity_type": "attraction", + "height_px": 625, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-013/02.jpg", + "role": "gallery", + "sort_order": 2, + "width_px": 938 + }, + { + "asset_id": "asset-0056", + "content_type": "image/jpeg", + "entity_id": "attraction-013", + "entity_name": "赶场村", + "entity_type": "attraction", + "height_px": 624, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-013/03.jpg", + "role": "gallery", + "sort_order": 3, + "width_px": 837 + }, + { + "asset_id": "asset-0057", + "content_type": "image/jpeg", + "entity_id": "attraction-013", + "entity_name": "赶场村", + "entity_type": "attraction", + "height_px": 553, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-013/04.jpg", + "role": "gallery", + "sort_order": 4, + "width_px": 830 + }, + { + "asset_id": "asset-0058", + "content_type": "image/jpeg", + "entity_id": "attraction-005", + "entity_name": "龙里河大桥", + "entity_type": "attraction", + "height_px": 507, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-005/01.jpg", + "role": "main", + "sort_order": 1, + "width_px": 932 + }, + { + "asset_id": "asset-0059", + "content_type": "image/jpeg", + "entity_id": "attraction-005", + "entity_name": "龙里河大桥", + "entity_type": "attraction", + "height_px": 553, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-005/02.jpg", + "role": "gallery", + "sort_order": 2, + "width_px": 841 + }, + { + "asset_id": "asset-0060", + "content_type": "image/png", + "entity_id": "food-guide-qr", + "entity_name": "旅游招商手册二维码(美食指南)", + "entity_type": "support", + "height_px": 245, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/support/qr_codes/food-guide-qr.png", + "role": "qr_code", + "sort_order": 1, + "width_px": 245 + }, + { + "asset_id": "asset-0061", + "content_type": "image/jpeg", + "entity_id": "food-001", + "entity_name": "野生菌肉饼鸡", + "entity_type": "food", + "height_px": 730, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-001/01.jpg", + "role": "main", + "sort_order": 1, + "width_px": 972 + }, + { + "asset_id": "asset-0062", + "content_type": "image/jpeg", + "entity_id": "food-001", + "entity_name": "野生菌肉饼鸡", + "entity_type": "food", + "height_px": 334, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-001/02.jpg", + "role": "gallery", + "sort_order": 2, + "width_px": 500 + }, + { + "asset_id": "asset-0063", + "content_type": "image/jpeg", + "entity_id": "food-001", + "entity_name": "野生菌肉饼鸡", + "entity_type": "food", + "height_px": 312, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-001/03.jpg", + "role": "gallery", + "sort_order": 3, + "width_px": 466 + }, + { + "asset_id": "asset-0064", + "content_type": "image/jpeg", + "entity_id": "food-002", + "entity_name": "龙里辣子鸡", + "entity_type": "food", + "height_px": 543, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-002/01.jpg", + "role": "main", + "sort_order": 1, + "width_px": 472 + }, + { + "asset_id": "asset-0065", + "content_type": "image/jpeg", + "entity_id": "food-002", + "entity_name": "龙里辣子鸡", + "entity_type": "food", + "height_px": 275, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-002/02.jpg", + "role": "gallery", + "sort_order": 2, + "width_px": 495 + }, + { + "asset_id": "asset-0066", + "content_type": "image/jpeg", + "entity_id": "food-002", + "entity_name": "龙里辣子鸡", + "entity_type": "food", + "height_px": 258, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-002/03.jpg", + "role": "gallery", + "sort_order": 3, + "width_px": 494 + }, + { + "asset_id": "asset-0067", + "content_type": "image/jpeg", + "entity_id": "specialty-004", + "entity_name": "刺梨养生茶", + "entity_type": "specialty", + "height_px": 332, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/specialties/specialty-004/01.jpg", + "role": "main", + "sort_order": 1, + "width_px": 508 + }, + { + "asset_id": "asset-0068", + "content_type": "image/png", + "entity_id": "specialty-006", + "entity_name": "刺梨葛根面", + "entity_type": "specialty", + "height_px": 285, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/specialties/specialty-006/01.png", + "role": "main", + "sort_order": 1, + "width_px": 421 + }, + { + "asset_id": "asset-0069", + "content_type": "image/jpeg", + "entity_id": "specialty-005", + "entity_name": "刺梨膳食纤维片", + "entity_type": "specialty", + "height_px": 332, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/specialties/specialty-005/01.jpg", + "role": "main", + "sort_order": 1, + "width_px": 471 + }, + { + "asset_id": "asset-0070", + "content_type": "image/jpeg", + "entity_id": "specialty-008", + "entity_name": "龙哩邓氏辣子鸡", + "entity_type": "specialty", + "height_px": 313, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/specialties/specialty-008/01.jpg", + "role": "main", + "sort_order": 1, + "width_px": 619 + }, + { + "asset_id": "asset-0071", + "content_type": "image/jpeg", + "entity_id": "specialty-009", + "entity_name": "龙缘盛豆干", + "entity_type": "specialty", + "height_px": 302, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/specialties/specialty-009/01.jpg", + "role": "main", + "sort_order": 1, + "width_px": 404 + }, + { + "asset_id": "asset-0072", + "content_type": "image/jpeg", + "entity_id": "specialty-010", + "entity_name": "鱼稻香羊场大米", + "entity_type": "specialty", + "height_px": 258, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/specialties/specialty-010/01.jpg", + "role": "main", + "sort_order": 1, + "width_px": 316 + }, + { + "asset_id": "asset-0073", + "content_type": "image/jpeg", + "entity_id": "specialty-011", + "entity_name": "康吉金丝皇菊", + "entity_type": "specialty", + "height_px": 258, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/specialties/specialty-011/01.jpg", + "role": "main", + "sort_order": 1, + "width_px": 342 + }, + { + "asset_id": "asset-0074", + "content_type": "image/png", + "entity_id": "specialty-001", + "entity_name": "刺梨干", + "entity_type": "specialty", + "height_px": 326, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/specialties/specialty-001/01.png", + "role": "main", + "sort_order": 1, + "width_px": 326 + }, + { + "asset_id": "asset-0075", + "content_type": "image/jpeg", + "entity_id": "specialty-002", + "entity_name": "刺梨汁", + "entity_type": "specialty", + "height_px": 279, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/specialties/specialty-002/01.jpg", + "role": "main", + "sort_order": 1, + "width_px": 255 + }, + { + "asset_id": "asset-0076", + "content_type": "image/jpeg", + "entity_id": "specialty-003", + "entity_name": "刺梨原汁", + "entity_type": "specialty", + "height_px": 358, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/specialties/specialty-003/01.jpg", + "role": "main", + "sort_order": 1, + "width_px": 387 + }, + { + "asset_id": "asset-0077", + "content_type": "image/jpeg", + "entity_id": "specialty-007", + "entity_name": "千优谷刺梨果脯", + "entity_type": "specialty", + "height_px": 262, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/specialties/specialty-007/01.jpg", + "role": "main", + "sort_order": 1, + "width_px": 186 + }, + { + "asset_id": "asset-0078", + "content_type": "image/jpeg", + "entity_id": "food-005", + "entity_name": "醒狮豆腐圆子", + "entity_type": "food", + "height_px": 498, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-005/01.jpg", + "role": "main", + "sort_order": 1, + "width_px": 750 + }, + { + "asset_id": "asset-0079", + "content_type": "image/jpeg", + "entity_id": "food-005", + "entity_name": "醒狮豆腐圆子", + "entity_type": "food", + "height_px": 499, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-005/02.jpg", + "role": "gallery", + "sort_order": 2, + "width_px": 535 + }, + { + "asset_id": "asset-0080", + "content_type": "image/jpeg", + "entity_id": "food-007", + "entity_name": "湾滩河稻花鱼", + "entity_type": "food", + "height_px": 276, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-007/01.jpg", + "role": "main", + "sort_order": 1, + "width_px": 366 + }, + { + "asset_id": "asset-0081", + "content_type": "image/jpeg", + "entity_id": "food-007", + "entity_name": "湾滩河稻花鱼", + "entity_type": "food", + "height_px": 265, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-007/02.jpg", + "role": "gallery", + "sort_order": 2, + "width_px": 358 + }, + { + "asset_id": "asset-0082", + "content_type": "image/jpeg", + "entity_id": "food-007", + "entity_name": "湾滩河稻花鱼", + "entity_type": "food", + "height_px": 265, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-007/03.jpg", + "role": "gallery", + "sort_order": 3, + "width_px": 354 + }, + { + "asset_id": "asset-0083", + "content_type": "image/jpeg", + "entity_id": "food-007", + "entity_name": "湾滩河稻花鱼", + "entity_type": "food", + "height_px": 240, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-007/04.jpg", + "role": "gallery", + "sort_order": 4, + "width_px": 358 + }, + { + "asset_id": "asset-0084", + "content_type": "image/jpeg", + "entity_id": "food-009", + "entity_name": "烤全羊", + "entity_type": "food", + "height_px": 850, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-009/01.jpg", + "role": "main", + "sort_order": 1, + "width_px": 1080 + }, + { + "asset_id": "asset-0085", + "content_type": "image/jpeg", + "entity_id": "food-010", + "entity_name": "干锅马肉", + "entity_type": "food", + "height_px": 561, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-010/01.jpg", + "role": "main", + "sort_order": 1, + "width_px": 671 + }, + { + "asset_id": "asset-0086", + "content_type": "image/jpeg", + "entity_id": "food-010", + "entity_name": "干锅马肉", + "entity_type": "food", + "height_px": 272, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-010/02.jpg", + "role": "gallery", + "sort_order": 2, + "width_px": 377 + }, + { + "asset_id": "asset-0087", + "content_type": "image/jpeg", + "entity_id": "food-012", + "entity_name": "酸汤鱼", + "entity_type": "food", + "height_px": 436, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-012/01.jpg", + "role": "main", + "sort_order": 1, + "width_px": 433 + }, + { + "asset_id": "asset-0088", + "content_type": "image/jpeg", + "entity_id": "food-013", + "entity_name": "豆米火锅", + "entity_type": "food", + "height_px": 463, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-013/01.jpg", + "role": "main", + "sort_order": 1, + "width_px": 622 + }, + { + "asset_id": "asset-0089", + "content_type": "image/jpeg", + "entity_id": "food-017", + "entity_name": "炖鸡粉", + "entity_type": "food", + "height_px": 304, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-017/01.jpg", + "role": "main", + "sort_order": 1, + "width_px": 450 + }, + { + "asset_id": "asset-0090", + "content_type": "image/jpeg", + "entity_id": "food-016", + "entity_name": "辣鸡粉", + "entity_type": "food", + "height_px": 288, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-016/01.jpg", + "role": "main", + "sort_order": 1, + "width_px": 390 + }, + { + "asset_id": "asset-0091", + "content_type": "image/jpeg", + "entity_id": "food-022", + "entity_name": "洋芋粑粑", + "entity_type": "food", + "height_px": 417, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-022/01.jpg", + "role": "main", + "sort_order": 1, + "width_px": 629 + }, + { + "asset_id": "asset-0092", + "content_type": "image/jpeg", + "entity_id": "food-023", + "entity_name": "糯米糖", + "entity_type": "food", + "height_px": 426, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-023/01.jpg", + "role": "main", + "sort_order": 1, + "width_px": 659 + }, + { + "asset_id": "asset-0093", + "content_type": "image/jpeg", + "entity_id": "food-024", + "entity_name": "红糖糍粑", + "entity_type": "food", + "height_px": 296, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-024/01.jpg", + "role": "main", + "sort_order": 1, + "width_px": 449 + }, + { + "asset_id": "asset-0094", + "content_type": "image/jpeg", + "entity_id": "food-004", + "entity_name": "柴火鸡", + "entity_type": "food", + "height_px": 414, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-004/01.jpg", + "role": "main", + "sort_order": 1, + "width_px": 537 + }, + { + "asset_id": "asset-0095", + "content_type": "image/jpeg", + "entity_id": "food-004", + "entity_name": "柴火鸡", + "entity_type": "food", + "height_px": 594, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-004/02.jpg", + "role": "gallery", + "sort_order": 2, + "width_px": 480 + }, + { + "asset_id": "asset-0096", + "content_type": "image/jpeg", + "entity_id": "food-006", + "entity_name": "酸汤毛肚火锅", + "entity_type": "food", + "height_px": 380, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-006/01.jpg", + "role": "main", + "sort_order": 1, + "width_px": 634 + }, + { + "asset_id": "asset-0097", + "content_type": "image/jpeg", + "entity_id": "food-006", + "entity_name": "酸汤毛肚火锅", + "entity_type": "food", + "height_px": 378, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-006/02.jpg", + "role": "gallery", + "sort_order": 2, + "width_px": 620 + }, + { + "asset_id": "asset-0098", + "content_type": "image/jpeg", + "entity_id": "food-008", + "entity_name": "农家腊肉", + "entity_type": "food", + "height_px": 700, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-008/01.jpg", + "role": "main", + "sort_order": 1, + "width_px": 526 + }, + { + "asset_id": "asset-0099", + "content_type": "image/jpeg", + "entity_id": "food-008", + "entity_name": "农家腊肉", + "entity_type": "food", + "height_px": 526, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-008/02.jpg", + "role": "gallery", + "sort_order": 2, + "width_px": 331 + }, + { + "asset_id": "asset-0100", + "content_type": "image/jpeg", + "entity_id": "food-011", + "entity_name": "羊脚火锅", + "entity_type": "food", + "height_px": 450, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-011/01.jpg", + "role": "main", + "sort_order": 1, + "width_px": 646 + }, + { + "asset_id": "asset-0101", + "content_type": "image/jpeg", + "entity_id": "food-011", + "entity_name": "羊脚火锅", + "entity_type": "food", + "height_px": 353, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-011/02.jpg", + "role": "gallery", + "sort_order": 2, + "width_px": 507 + }, + { + "asset_id": "asset-0102", + "content_type": "image/jpeg", + "entity_id": "food-014", + "entity_name": "黄豆鸡", + "entity_type": "food", + "height_px": 810, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-014/01.jpg", + "role": "main", + "sort_order": 1, + "width_px": 1080 + }, + { + "asset_id": "asset-0103", + "content_type": "image/jpeg", + "entity_id": "food-003", + "entity_name": "特色烤香猪", + "entity_type": "food", + "height_px": 679, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-003/01.jpg", + "role": "main", + "sort_order": 1, + "width_px": 806 + }, + { + "asset_id": "asset-0104", + "content_type": "image/jpeg", + "entity_id": "food-021", + "entity_name": "手工丝娃娃", + "entity_type": "food", + "height_px": 304, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-021/01.jpg", + "role": "main", + "sort_order": 1, + "width_px": 455 + }, + { + "asset_id": "asset-0105", + "content_type": "image/jpeg", + "entity_id": "food-018", + "entity_name": "手搓冰粉", + "entity_type": "food", + "height_px": 303, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-018/01.jpg", + "role": "main", + "sort_order": 1, + "width_px": 423 + }, + { + "asset_id": "asset-0106", + "content_type": "image/jpeg", + "entity_id": "food-019", + "entity_name": "杨梅汤饮品", + "entity_type": "food", + "height_px": 378, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-019/01.jpg", + "role": "main", + "sort_order": 1, + "width_px": 462 + }, + { + "asset_id": "asset-0107", + "content_type": "image/jpeg", + "entity_id": "food-020", + "entity_name": "麻辣洋芋片", + "entity_type": "food", + "height_px": 283, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-020/01.jpg", + "role": "main", + "sort_order": 1, + "width_px": 426 + }, + { + "asset_id": "asset-0108", + "content_type": "image/jpeg", + "entity_id": "food-015", + "entity_name": "肉丝粉", + "entity_type": "food", + "height_px": 588, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-015/01.jpg", + "role": "main", + "sort_order": 1, + "width_px": 461 + }, + { + "asset_id": "asset-0109", + "content_type": "image/jpeg", + "entity_id": "accommodation-001", + "entity_name": "云河酒店", + "entity_type": "accommodation", + "height_px": 533, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-001/01.jpg", + "role": "main", + "sort_order": 1, + "width_px": 800 + }, + { + "asset_id": "asset-0110", + "content_type": "image/jpeg", + "entity_id": "accommodation-001", + "entity_name": "云河酒店", + "entity_type": "accommodation", + "height_px": 272, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-001/02.jpg", + "role": "gallery", + "sort_order": 2, + "width_px": 414 + }, + { + "asset_id": "asset-0111", + "content_type": "image/jpeg", + "entity_id": "accommodation-001", + "entity_name": "云河酒店", + "entity_type": "accommodation", + "height_px": 272, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-001/03.jpg", + "role": "gallery", + "sort_order": 3, + "width_px": 413 + }, + { + "asset_id": "asset-0112", + "content_type": "image/jpeg", + "entity_id": "accommodation-001", + "entity_name": "云河酒店", + "entity_type": "accommodation", + "height_px": 272, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-001/04.jpg", + "role": "gallery", + "sort_order": 4, + "width_px": 229 + }, + { + "asset_id": "asset-0113", + "content_type": "image/jpeg", + "entity_id": "accommodation-002", + "entity_name": "云从朵花温泉度假中心", + "entity_type": "accommodation", + "height_px": 350, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-002/01.jpg", + "role": "main", + "sort_order": 1, + "width_px": 527 + }, + { + "asset_id": "asset-0114", + "content_type": "image/jpeg", + "entity_id": "accommodation-002", + "entity_name": "云从朵花温泉度假中心", + "entity_type": "accommodation", + "height_px": 349, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-002/02.jpg", + "role": "gallery", + "sort_order": 2, + "width_px": 247 + }, + { + "asset_id": "asset-0115", + "content_type": "image/jpeg", + "entity_id": "accommodation-002", + "entity_name": "云从朵花温泉度假中心", + "entity_type": "accommodation", + "height_px": 184, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-002/03.jpg", + "role": "gallery", + "sort_order": 3, + "width_px": 279 + }, + { + "asset_id": "asset-0116", + "content_type": "image/jpeg", + "entity_id": "accommodation-002", + "entity_name": "云从朵花温泉度假中心", + "entity_type": "accommodation", + "height_px": 158, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-002/04.jpg", + "role": "gallery", + "sort_order": 4, + "width_px": 279 + }, + { + "asset_id": "asset-0117", + "content_type": "image/png", + "entity_id": "lodging-guide-qr", + "entity_name": "旅游招商手册二维码(旅居指南)", + "entity_type": "support", + "height_px": 245, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/support/qr_codes/lodging-guide-qr.png", + "role": "qr_code", + "sort_order": 1, + "width_px": 245 + }, + { + "asset_id": "asset-0118", + "content_type": "image/jpeg", + "entity_id": "accommodation-019", + "entity_name": "陌上轻雅酒店", + "entity_type": "accommodation", + "height_px": 157, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-019/01.jpg", + "role": "main", + "sort_order": 1, + "width_px": 235 + }, + { + "asset_id": "asset-0119", + "content_type": "image/jpeg", + "entity_id": "accommodation-019", + "entity_name": "陌上轻雅酒店", + "entity_type": "accommodation", + "height_px": 157, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-019/02.jpg", + "role": "gallery", + "sort_order": 2, + "width_px": 235 + }, + { + "asset_id": "asset-0120", + "content_type": "image/jpeg", + "entity_id": "accommodation-018", + "entity_name": "丫丫酒店", + "entity_type": "accommodation", + "height_px": 254, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-018/01.jpg", + "role": "main", + "sort_order": 1, + "width_px": 366 + }, + { + "asset_id": "asset-0121", + "content_type": "image/jpeg", + "entity_id": "accommodation-003", + "entity_name": "龙里南卓·瞰龙别院", + "entity_type": "accommodation", + "height_px": 209, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-003/01.jpg", + "role": "main", + "sort_order": 1, + "width_px": 331 + }, + { + "asset_id": "asset-0122", + "content_type": "image/jpeg", + "entity_id": "accommodation-003", + "entity_name": "龙里南卓·瞰龙别院", + "entity_type": "accommodation", + "height_px": 182, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-003/02.jpg", + "role": "gallery", + "sort_order": 2, + "width_px": 339 + }, + { + "asset_id": "asset-0123", + "content_type": "image/jpeg", + "entity_id": "accommodation-003", + "entity_name": "龙里南卓·瞰龙别院", + "entity_type": "accommodation", + "height_px": 182, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-003/03.jpg", + "role": "gallery", + "sort_order": 3, + "width_px": 255 + }, + { + "asset_id": "asset-0124", + "content_type": "image/jpeg", + "entity_id": "accommodation-003", + "entity_name": "龙里南卓·瞰龙别院", + "entity_type": "accommodation", + "height_px": 182, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-003/04.jpg", + "role": "gallery", + "sort_order": 4, + "width_px": 255 + }, + { + "asset_id": "asset-0125", + "content_type": "image/jpeg", + "entity_id": "accommodation-020", + "entity_name": "深高速·悠享公寓", + "entity_type": "accommodation", + "height_px": 247, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-020/01.jpg", + "role": "main", + "sort_order": 1, + "width_px": 335 + }, + { + "asset_id": "asset-0126", + "content_type": "image/jpeg", + "entity_id": "accommodation-020", + "entity_name": "深高速·悠享公寓", + "entity_type": "accommodation", + "height_px": 247, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-020/02.jpg", + "role": "gallery", + "sort_order": 2, + "width_px": 335 + }, + { + "asset_id": "asset-0127", + "content_type": "image/jpeg", + "entity_id": "accommodation-020", + "entity_name": "深高速·悠享公寓", + "entity_type": "accommodation", + "height_px": 246, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-020/03.jpg", + "role": "gallery", + "sort_order": 3, + "width_px": 334 + }, + { + "asset_id": "asset-0128", + "content_type": "image/jpeg", + "entity_id": "accommodation-021", + "entity_name": "太阳谷自得公寓", + "entity_type": "accommodation", + "height_px": 157, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-021/01.jpg", + "role": "main", + "sort_order": 1, + "width_px": 264 + }, + { + "asset_id": "asset-0129", + "content_type": "image/jpeg", + "entity_id": "accommodation-021", + "entity_name": "太阳谷自得公寓", + "entity_type": "accommodation", + "height_px": 157, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-021/02.jpg", + "role": "gallery", + "sort_order": 2, + "width_px": 263 + }, + { + "asset_id": "asset-0130", + "content_type": "image/jpeg", + "entity_id": "accommodation-017", + "entity_name": "多彩全球大酒店", + "entity_type": "accommodation", + "height_px": 175, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-017/01.jpg", + "role": "main", + "sort_order": 1, + "width_px": 262 + }, + { + "asset_id": "asset-0131", + "content_type": "image/jpeg", + "entity_id": "accommodation-017", + "entity_name": "多彩全球大酒店", + "entity_type": "accommodation", + "height_px": 175, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-017/02.jpg", + "role": "gallery", + "sort_order": 2, + "width_px": 262 + }, + { + "asset_id": "asset-0132", + "content_type": "image/jpeg", + "entity_id": "accommodation-017", + "entity_name": "多彩全球大酒店", + "entity_type": "accommodation", + "height_px": 175, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-017/03.jpg", + "role": "gallery", + "sort_order": 3, + "width_px": 262 + }, + { + "asset_id": "asset-0133", + "content_type": "image/jpeg", + "entity_id": "accommodation-017", + "entity_name": "多彩全球大酒店", + "entity_type": "accommodation", + "height_px": 175, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-017/04.jpg", + "role": "gallery", + "sort_order": 4, + "width_px": 233 + }, + { + "asset_id": "asset-0134", + "content_type": "image/jpeg", + "entity_id": "accommodation-011", + "entity_name": "24°坞别院", + "entity_type": "accommodation", + "height_px": 224, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-011/01.jpg", + "role": "main", + "sort_order": 1, + "width_px": 336 + }, + { + "asset_id": "asset-0135", + "content_type": "image/jpeg", + "entity_id": "accommodation-011", + "entity_name": "24°坞别院", + "entity_type": "accommodation", + "height_px": 227, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-011/02.jpg", + "role": "gallery", + "sort_order": 2, + "width_px": 318 + }, + { + "asset_id": "asset-0136", + "content_type": "image/jpeg", + "entity_id": "accommodation-011", + "entity_name": "24°坞别院", + "entity_type": "accommodation", + "height_px": 224, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-011/03.jpg", + "role": "gallery", + "sort_order": 3, + "width_px": 320 + }, + { + "asset_id": "asset-0137", + "content_type": "image/jpeg", + "entity_id": "accommodation-004", + "entity_name": "卢浮宫酒店", + "entity_type": "accommodation", + "height_px": 168, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-004/01.jpg", + "role": "main", + "sort_order": 1, + "width_px": 253 + }, + { + "asset_id": "asset-0138", + "content_type": "image/jpeg", + "entity_id": "accommodation-004", + "entity_name": "卢浮宫酒店", + "entity_type": "accommodation", + "height_px": 167, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-004/02.jpg", + "role": "gallery", + "sort_order": 2, + "width_px": 254 + }, + { + "asset_id": "asset-0139", + "content_type": "image/jpeg", + "entity_id": "accommodation-004", + "entity_name": "卢浮宫酒店", + "entity_type": "accommodation", + "height_px": 167, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-004/03.jpg", + "role": "gallery", + "sort_order": 3, + "width_px": 253 + }, + { + "asset_id": "asset-0140", + "content_type": "image/jpeg", + "entity_id": "accommodation-004", + "entity_name": "卢浮宫酒店", + "entity_type": "accommodation", + "height_px": 167, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-004/04.jpg", + "role": "gallery", + "sort_order": 4, + "width_px": 250 + }, + { + "asset_id": "asset-0141", + "content_type": "image/jpeg", + "entity_id": "accommodation-005", + "entity_name": "龙里伯爵钻石酒店", + "entity_type": "accommodation", + "height_px": 300, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-005/01.jpg", + "role": "main", + "sort_order": 1, + "width_px": 483 + }, + { + "asset_id": "asset-0142", + "content_type": "image/jpeg", + "entity_id": "accommodation-005", + "entity_name": "龙里伯爵钻石酒店", + "entity_type": "accommodation", + "height_px": 163, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-005/02.jpg", + "role": "gallery", + "sort_order": 2, + "width_px": 253 + }, + { + "asset_id": "asset-0143", + "content_type": "image/jpeg", + "entity_id": "accommodation-005", + "entity_name": "龙里伯爵钻石酒店", + "entity_type": "accommodation", + "height_px": 153, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-005/03.jpg", + "role": "gallery", + "sort_order": 3, + "width_px": 264 + }, + { + "asset_id": "asset-0144", + "content_type": "image/jpeg", + "entity_id": "accommodation-005", + "entity_name": "龙里伯爵钻石酒店", + "entity_type": "accommodation", + "height_px": 142, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-005/04.jpg", + "role": "gallery", + "sort_order": 4, + "width_px": 264 + }, + { + "asset_id": "asset-0145", + "content_type": "image/jpeg", + "entity_id": "accommodation-005", + "entity_name": "龙里伯爵钻石酒店", + "entity_type": "accommodation", + "height_px": 129, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-005/05.jpg", + "role": "gallery", + "sort_order": 5, + "width_px": 253 + }, + { + "asset_id": "asset-0146", + "content_type": "image/jpeg", + "entity_id": "accommodation-006", + "entity_name": "夜郎·云溪酒店", + "entity_type": "accommodation", + "height_px": 632, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-006/01.jpg", + "role": "main", + "sort_order": 1, + "width_px": 308 + }, + { + "asset_id": "asset-0147", + "content_type": "image/jpeg", + "entity_id": "accommodation-006", + "entity_name": "夜郎·云溪酒店", + "entity_type": "accommodation", + "height_px": 259, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-006/02.jpg", + "role": "gallery", + "sort_order": 2, + "width_px": 532 + }, + { + "asset_id": "asset-0148", + "content_type": "image/jpeg", + "entity_id": "accommodation-006", + "entity_name": "夜郎·云溪酒店", + "entity_type": "accommodation", + "height_px": 186, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-006/03.jpg", + "role": "gallery", + "sort_order": 3, + "width_px": 248 + }, + { + "asset_id": "asset-0149", + "content_type": "image/jpeg", + "entity_id": "accommodation-006", + "entity_name": "夜郎·云溪酒店", + "entity_type": "accommodation", + "height_px": 186, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-006/04.jpg", + "role": "gallery", + "sort_order": 4, + "width_px": 248 + }, + { + "asset_id": "asset-0150", + "content_type": "image/jpeg", + "entity_id": "accommodation-006", + "entity_name": "夜郎·云溪酒店", + "entity_type": "accommodation", + "height_px": 186, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-006/05.jpg", + "role": "gallery", + "sort_order": 5, + "width_px": 248 + }, + { + "asset_id": "asset-0151", + "content_type": "image/jpeg", + "entity_id": "accommodation-007", + "entity_name": "珑庭芳大酒店", + "entity_type": "accommodation", + "height_px": 220, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-007/01.jpg", + "role": "main", + "sort_order": 1, + "width_px": 341 + }, + { + "asset_id": "asset-0152", + "content_type": "image/jpeg", + "entity_id": "accommodation-007", + "entity_name": "珑庭芳大酒店", + "entity_type": "accommodation", + "height_px": 223, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-007/02.jpg", + "role": "gallery", + "sort_order": 2, + "width_px": 336 + }, + { + "asset_id": "asset-0153", + "content_type": "image/jpeg", + "entity_id": "accommodation-007", + "entity_name": "珑庭芳大酒店", + "entity_type": "accommodation", + "height_px": 221, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-007/03.jpg", + "role": "gallery", + "sort_order": 3, + "width_px": 335 + }, + { + "asset_id": "asset-0154", + "content_type": "image/jpeg", + "entity_id": "accommodation-008", + "entity_name": "维也纳国际酒店", + "entity_type": "accommodation", + "height_px": 159, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-008/01.jpg", + "role": "main", + "sort_order": 1, + "width_px": 291 + }, + { + "asset_id": "asset-0155", + "content_type": "image/jpeg", + "entity_id": "accommodation-008", + "entity_name": "维也纳国际酒店", + "entity_type": "accommodation", + "height_px": 181, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-008/02.jpg", + "role": "gallery", + "sort_order": 2, + "width_px": 231 + }, + { + "asset_id": "asset-0156", + "content_type": "image/jpeg", + "entity_id": "accommodation-008", + "entity_name": "维也纳国际酒店", + "entity_type": "accommodation", + "height_px": 165, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-008/03.jpg", + "role": "gallery", + "sort_order": 3, + "width_px": 237 + }, + { + "asset_id": "asset-0157", + "content_type": "image/jpeg", + "entity_id": "accommodation-008", + "entity_name": "维也纳国际酒店", + "entity_type": "accommodation", + "height_px": 159, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-008/04.jpg", + "role": "gallery", + "sort_order": 4, + "width_px": 227 + }, + { + "asset_id": "asset-0158", + "content_type": "image/jpeg", + "entity_id": "accommodation-008", + "entity_name": "维也纳国际酒店", + "entity_type": "accommodation", + "height_px": 139, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-008/05.jpg", + "role": "gallery", + "sort_order": 5, + "width_px": 237 + }, + { + "asset_id": "asset-0159", + "content_type": "image/jpeg", + "entity_id": "accommodation-008", + "entity_name": "维也纳国际酒店", + "entity_type": "accommodation", + "height_px": 139, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-008/06.jpg", + "role": "gallery", + "sort_order": 6, + "width_px": 237 + }, + { + "asset_id": "asset-0160", + "content_type": "image/jpeg", + "entity_id": "accommodation-009", + "entity_name": "问水温泉小镇闲悦阁酒店", + "entity_type": "accommodation", + "height_px": 171, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-009/01.jpg", + "role": "main", + "sort_order": 1, + "width_px": 274 + }, + { + "asset_id": "asset-0161", + "content_type": "image/jpeg", + "entity_id": "accommodation-009", + "entity_name": "问水温泉小镇闲悦阁酒店", + "entity_type": "accommodation", + "height_px": 172, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-009/02.jpg", + "role": "gallery", + "sort_order": 2, + "width_px": 258 + }, + { + "asset_id": "asset-0162", + "content_type": "image/jpeg", + "entity_id": "accommodation-009", + "entity_name": "问水温泉小镇闲悦阁酒店", + "entity_type": "accommodation", + "height_px": 172, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-009/03.jpg", + "role": "gallery", + "sort_order": 3, + "width_px": 258 + }, + { + "asset_id": "asset-0163", + "content_type": "image/jpeg", + "entity_id": "accommodation-009", + "entity_name": "问水温泉小镇闲悦阁酒店", + "entity_type": "accommodation", + "height_px": 172, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-009/04.jpg", + "role": "gallery", + "sort_order": 4, + "width_px": 243 + }, + { + "asset_id": "asset-0164", + "content_type": "image/jpeg", + "entity_id": "accommodation-012", + "entity_name": "纪龙酒店", + "entity_type": "accommodation", + "height_px": 183, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-012/01.jpg", + "role": "main", + "sort_order": 1, + "width_px": 275 + }, + { + "asset_id": "asset-0165", + "content_type": "image/jpeg", + "entity_id": "accommodation-012", + "entity_name": "纪龙酒店", + "entity_type": "accommodation", + "height_px": 183, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-012/02.jpg", + "role": "gallery", + "sort_order": 2, + "width_px": 275 + }, + { + "asset_id": "asset-0166", + "content_type": "image/jpeg", + "entity_id": "accommodation-012", + "entity_name": "纪龙酒店", + "entity_type": "accommodation", + "height_px": 184, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-012/03.jpg", + "role": "gallery", + "sort_order": 3, + "width_px": 245 + }, + { + "asset_id": "asset-0167", + "content_type": "image/jpeg", + "entity_id": "accommodation-012", + "entity_name": "纪龙酒店", + "entity_type": "accommodation", + "height_px": 184, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-012/04.jpg", + "role": "gallery", + "sort_order": 4, + "width_px": 207 + }, + { + "asset_id": "asset-0168", + "content_type": "image/jpeg", + "entity_id": "accommodation-013", + "entity_name": "西苑锦润酒店", + "entity_type": "accommodation", + "height_px": 226, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-013/01.jpg", + "role": "main", + "sort_order": 1, + "width_px": 341 + }, + { + "asset_id": "asset-0169", + "content_type": "image/jpeg", + "entity_id": "accommodation-013", + "entity_name": "西苑锦润酒店", + "entity_type": "accommodation", + "height_px": 226, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-013/02.jpg", + "role": "gallery", + "sort_order": 2, + "width_px": 339 + }, + { + "asset_id": "asset-0170", + "content_type": "image/jpeg", + "entity_id": "accommodation-013", + "entity_name": "西苑锦润酒店", + "entity_type": "accommodation", + "height_px": 112, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-013/03.jpg", + "role": "gallery", + "sort_order": 3, + "width_px": 167 + }, + { + "asset_id": "asset-0171", + "content_type": "image/jpeg", + "entity_id": "accommodation-013", + "entity_name": "西苑锦润酒店", + "entity_type": "accommodation", + "height_px": 112, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-013/04.jpg", + "role": "gallery", + "sort_order": 4, + "width_px": 167 + }, + { + "asset_id": "asset-0172", + "content_type": "image/jpeg", + "entity_id": "accommodation-013", + "entity_name": "西苑锦润酒店", + "entity_type": "accommodation", + "height_px": 111, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-013/05.jpg", + "role": "gallery", + "sort_order": 5, + "width_px": 167 + }, + { + "asset_id": "asset-0173", + "content_type": "image/jpeg", + "entity_id": "accommodation-013", + "entity_name": "西苑锦润酒店", + "entity_type": "accommodation", + "height_px": 111, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-013/06.jpg", + "role": "gallery", + "sort_order": 6, + "width_px": 167 + }, + { + "asset_id": "asset-0174", + "content_type": "image/jpeg", + "entity_id": "accommodation-015", + "entity_name": "安纳塔拉度假酒店", + "entity_type": "accommodation", + "height_px": 287, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-015/01.jpg", + "role": "main", + "sort_order": 1, + "width_px": 383 + }, + { + "asset_id": "asset-0175", + "content_type": "image/jpeg", + "entity_id": "accommodation-015", + "entity_name": "安纳塔拉度假酒店", + "entity_type": "accommodation", + "height_px": 287, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-015/02.jpg", + "role": "gallery", + "sort_order": 2, + "width_px": 215 + }, + { + "asset_id": "asset-0176", + "content_type": "image/jpeg", + "entity_id": "accommodation-015", + "entity_name": "安纳塔拉度假酒店", + "entity_type": "accommodation", + "height_px": 257, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-015/03.jpg", + "role": "gallery", + "sort_order": 3, + "width_px": 208 + }, + { + "asset_id": "asset-0177", + "content_type": "image/jpeg", + "entity_id": "accommodation-015", + "entity_name": "安纳塔拉度假酒店", + "entity_type": "accommodation", + "height_px": 257, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-015/04.jpg", + "role": "gallery", + "sort_order": 4, + "width_px": 208 + }, + { + "asset_id": "asset-0178", + "content_type": "image/jpeg", + "entity_id": "accommodation-015", + "entity_name": "安纳塔拉度假酒店", + "entity_type": "accommodation", + "height_px": 126, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-015/05.jpg", + "role": "gallery", + "sort_order": 5, + "width_px": 212 + }, + { + "asset_id": "asset-0179", + "content_type": "image/png", + "entity_id": "accommodation-014", + "entity_name": "广莱涵舍", + "entity_type": "accommodation", + "height_px": 176, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-014/01.png", + "role": "main", + "sort_order": 1, + "width_px": 486 + }, + { + "asset_id": "asset-0180", + "content_type": "image/jpeg", + "entity_id": "accommodation-014", + "entity_name": "广莱涵舍", + "entity_type": "accommodation", + "height_px": 175, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-014/02.jpg", + "role": "gallery", + "sort_order": 2, + "width_px": 262 + }, + { + "asset_id": "asset-0181", + "content_type": "image/jpeg", + "entity_id": "accommodation-014", + "entity_name": "广莱涵舍", + "entity_type": "accommodation", + "height_px": 175, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-014/03.jpg", + "role": "gallery", + "sort_order": 3, + "width_px": 262 + }, + { + "asset_id": "asset-0182", + "content_type": "image/jpeg", + "entity_id": "accommodation-010", + "entity_name": "顽乐尧轻奢露营基地", + "entity_type": "accommodation", + "height_px": 188, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-010/01.jpg", + "role": "main", + "sort_order": 1, + "width_px": 282 + }, + { + "asset_id": "asset-0183", + "content_type": "image/jpeg", + "entity_id": "accommodation-010", + "entity_name": "顽乐尧轻奢露营基地", + "entity_type": "accommodation", + "height_px": 189, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-010/02.jpg", + "role": "gallery", + "sort_order": 2, + "width_px": 251 + }, + { + "asset_id": "asset-0184", + "content_type": "image/jpeg", + "entity_id": "accommodation-010", + "entity_name": "顽乐尧轻奢露营基地", + "entity_type": "accommodation", + "height_px": 188, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-010/03.jpg", + "role": "gallery", + "sort_order": 3, + "width_px": 158 + }, + { + "asset_id": "asset-0185", + "content_type": "image/jpeg", + "entity_id": "accommodation-010", + "entity_name": "顽乐尧轻奢露营基地", + "entity_type": "accommodation", + "height_px": 187, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-010/04.jpg", + "role": "gallery", + "sort_order": 4, + "width_px": 151 + }, + { + "asset_id": "asset-0186", + "content_type": "image/jpeg", + "entity_id": "accommodation-010", + "entity_name": "顽乐尧轻奢露营基地", + "entity_type": "accommodation", + "height_px": 187, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-010/05.jpg", + "role": "gallery", + "sort_order": 5, + "width_px": 151 + }, + { + "asset_id": "asset-0187", + "content_type": "image/jpeg", + "entity_id": "accommodation-016", + "entity_name": "隐与·清风与落民宿", + "entity_type": "accommodation", + "height_px": 204, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-016/01.jpg", + "role": "main", + "sort_order": 1, + "width_px": 363 + }, + { + "asset_id": "asset-0188", + "content_type": "image/jpeg", + "entity_id": "accommodation-016", + "entity_name": "隐与·清风与落民宿", + "entity_type": "accommodation", + "height_px": 148, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-016/02.jpg", + "role": "gallery", + "sort_order": 2, + "width_px": 363 + }, + { + "asset_id": "asset-0189", + "content_type": "image/jpeg", + "entity_id": "accommodation-016", + "entity_name": "隐与·清风与落民宿", + "entity_type": "accommodation", + "height_px": 98, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-016/03.jpg", + "role": "gallery", + "sort_order": 3, + "width_px": 185 + }, + { + "asset_id": "asset-0190", + "content_type": "image/jpeg", + "entity_id": "accommodation-016", + "entity_name": "隐与·清风与落民宿", + "entity_type": "accommodation", + "height_px": 98, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-016/04.jpg", + "role": "gallery", + "sort_order": 4, + "width_px": 173 + }, + { + "asset_id": "asset-0191", + "content_type": "image/jpeg", + "entity_id": "lodging-location-schematic", + "entity_name": "龙里县酒店坐标示意图", + "entity_type": "support", + "height_px": 1294, + "oss_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/maps/lodging-location-schematic.jpg", + "role": "map", + "sort_order": 1, + "width_px": 953 + } +] \ No newline at end of file diff --git a/src/mock/benefits.json b/src/mock/benefits.json new file mode 100644 index 0000000..6f8f74e --- /dev/null +++ b/src/mock/benefits.json @@ -0,0 +1,380 @@ +[ + { + "id": "benefit-001", + "title": "龙里水乡单人票权益", + "type": "ticket", + "merchant_id": "attraction-001", + "merchant_name": "龙里水乡旅游生态城", + "image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-001/01.jpg", + "slogan": ["畅游龙里", "拥抱自然"], + "price": { "original": 128, "deal": 88, "spec": "单人票" }, + "scope_desc": "联盟景区 / 游玩商户", + "valid_from": "2026-09-12", + "valid_to": "2026-12-31", + "valid_days": 7, + "stock_total": 200, + "stock_left": 87, + "status": "available", + "rule_text": "该权益不绑定具体商品,可多次使用。本次操作仅记录一次使用,不会使权益失效。", + "use_count": 0, + "last_used_at": null, + "related_entity_id": "attraction-001" + }, + { + "id": "benefit-002", + "title": "龙里住宿周末双床房权益", + "type": "lodging", + "merchant_id": "accommodation-002", + "merchant_name": "云从朵花温泉度假中心", + "image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-002/01.jpg", + "slogan": ["住在龙里", "枕山入梦"], + "price": { "original": 468, "deal": 368, "spec": "双床房" }, + "scope_desc": "联盟住宿商户|周末可用", + "valid_from": "2026-09-12", + "valid_to": "2026-12-31", + "valid_days": 7, + "stock_total": 120, + "stock_left": 46, + "status": "available", + "rule_text": "该权益不绑定具体商品,可多次使用。本次操作仅记录一次使用,不会使权益失效。", + "use_count": 0, + "last_used_at": null, + "related_entity_id": "accommodation-002" + }, + { + "id": "benefit-003", + "title": "龙里餐饮 2-3 人餐权益", + "type": "food", + "merchant_id": "food-002", + "merchant_name": "龙里辣子鸡", + "image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-002/01.jpg", + "slogan": ["寻味龙里", "品味烟火"], + "price": { "original": 125, "deal": 99, "spec": "2-3 人餐" }, + "scope_desc": "联盟餐饮商户", + "valid_from": "2026-09-12", + "valid_to": "2026-12-31", + "valid_days": 7, + "stock_total": 300, + "stock_left": 152, + "status": "available", + "rule_text": "该权益不绑定具体商品,可多次使用。本次操作仅记录一次使用,不会使权益失效。", + "use_count": 0, + "last_used_at": null, + "related_entity_id": "food-002" + }, + { + "id": "benefit-004", + "title": "龙里刺梨礼盒特产权益", + "type": "specialty", + "merchant_id": "specialty-001", + "merchant_name": "龙里刺梨干", + "image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/specialties/specialty-001/01.png", + "slogan": ["带走龙里", "山野好物"], + "price": { "original": 158, "deal": 108, "spec": "刺梨礼盒" }, + "scope_desc": "联盟特产商户|产地直发", + "valid_from": "2026-09-12", + "valid_to": "2026-12-31", + "valid_days": 7, + "stock_total": 80, + "stock_left": 0, + "status": "sold_out", + "rule_text": "该权益不绑定具体商品,可多次使用。本次操作仅记录一次使用,不会使权益失效。", + "use_count": 0, + "last_used_at": null, + "related_entity_id": "specialty-001" + }, + { + "id": "benefit-005", + "title": "龙里水乡双人票权益", + "type": "ticket", + "merchant_id": "attraction-001", + "merchant_name": "龙里水乡旅游生态城", + "image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-001/02.jpg", + "slogan": ["畅游龙里", "拥抱自然"], + "price": { "original": 198, "deal": 148, "spec": "双人票" }, + "scope_desc": "联盟景区 / 游玩商户", + "valid_from": "2026-09-12", + "valid_to": "2026-12-31", + "valid_days": 7, + "stock_total": 150, + "stock_left": 63, + "status": "available", + "rule_text": "该权益不绑定具体商品,可多次使用。本次操作仅记录一次使用,不会使权益失效。", + "use_count": 0, + "last_used_at": null, + "related_entity_id": "attraction-001" + }, + { + "id": "benefit-006", + "title": "龙里餐饮 3-5 人餐权益", + "type": "food", + "merchant_id": "food-001", + "merchant_name": "野生菌肉饼鸡", + "image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-001/01.jpg", + "slogan": ["寻味龙里", "品味烟火"], + "price": { "original": 250, "deal": 199, "spec": "3-5 人餐" }, + "scope_desc": "联盟餐饮商户", + "valid_from": "2026-09-12", + "valid_to": "2026-12-31", + "valid_days": 7, + "stock_total": 300, + "stock_left": 128, + "status": "available", + "rule_text": "该权益不绑定具体商品,可多次使用。本次操作仅记录一次使用,不会使权益失效。", + "use_count": 0, + "last_used_at": null, + "related_entity_id": "food-001" + }, + { + "id": "benefit-007", + "title": "龙里餐饮 5-7 人套餐权益", + "type": "food", + "merchant_id": "food-002", + "merchant_name": "龙里辣子鸡", + "image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-002/02.jpg", + "slogan": ["寻味龙里", "品味烟火"], + "price": { "original": 375, "deal": 299, "spec": "5-7 人套餐" }, + "scope_desc": "联盟餐饮商户", + "valid_from": "2026-09-12", + "valid_to": "2026-12-31", + "valid_days": 7, + "stock_total": 200, + "stock_left": 91, + "status": "available", + "rule_text": "该权益不绑定具体商品,可多次使用。本次操作仅记录一次使用,不会使权益失效。", + "use_count": 0, + "last_used_at": null, + "related_entity_id": "food-002" + }, + { + "id": "benefit-008", + "title": "龙里餐饮 5-9 人套餐权益", + "type": "food", + "merchant_id": "food-001", + "merchant_name": "野生菌肉饼鸡", + "image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-001/02.jpg", + "slogan": ["寻味龙里", "品味烟火"], + "price": { "original": 500, "deal": 399, "spec": "5-9 人套餐" }, + "scope_desc": "联盟餐饮商户", + "valid_from": "2026-09-12", + "valid_to": "2026-12-31", + "valid_days": 7, + "stock_total": 160, + "stock_left": 74, + "status": "available", + "rule_text": "该权益不绑定具体商品,可多次使用。本次操作仅记录一次使用,不会使权益失效。", + "use_count": 0, + "last_used_at": null, + "related_entity_id": "food-001" + }, + { + "id": "benefit-009", + "title": "龙里餐饮 7-10 人套餐权益", + "type": "food", + "merchant_id": "food-002", + "merchant_name": "龙里辣子鸡", + "image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-002/01.jpg", + "slogan": ["寻味龙里", "品味烟火"], + "price": { "original": 625, "deal": 499, "spec": "7-10 人套餐" }, + "scope_desc": "联盟餐饮商户", + "valid_from": "2026-09-12", + "valid_to": "2026-12-31", + "valid_days": 7, + "stock_total": 120, + "stock_left": 58, + "status": "available", + "rule_text": "该权益不绑定具体商品,可多次使用。本次操作仅记录一次使用,不会使权益失效。", + "use_count": 0, + "last_used_at": null, + "related_entity_id": "food-002" + }, + { + "id": "benefit-010", + "title": "龙里餐饮 9-12 人套餐权益", + "type": "food", + "merchant_id": "food-001", + "merchant_name": "野生菌肉饼鸡", + "image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-001/01.jpg", + "slogan": ["寻味龙里", "品味烟火"], + "price": { "original": 750, "deal": 599, "spec": "9-12 人套餐" }, + "scope_desc": "联盟餐饮商户", + "valid_from": "2026-09-12", + "valid_to": "2026-12-31", + "valid_days": 7, + "stock_total": 100, + "stock_left": 41, + "status": "available", + "rule_text": "该权益不绑定具体商品,可多次使用。本次操作仅记录一次使用,不会使权益失效。", + "use_count": 0, + "last_used_at": null, + "related_entity_id": "food-001" + }, + { + "id": "benefit-011", + "title": "龙里餐饮 10-14 人套餐权益", + "type": "food", + "merchant_id": "food-002", + "merchant_name": "龙里辣子鸡", + "image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-002/02.jpg", + "slogan": ["寻味龙里", "品味烟火"], + "price": { "original": 1000, "deal": 799, "spec": "10-14 人套餐" }, + "scope_desc": "联盟餐饮商户", + "valid_from": "2026-09-12", + "valid_to": "2026-12-31", + "valid_days": 7, + "stock_total": 60, + "stock_left": 23, + "status": "available", + "rule_text": "该权益不绑定具体商品,可多次使用。本次操作仅记录一次使用,不会使权益失效。", + "use_count": 0, + "last_used_at": null, + "related_entity_id": "food-002" + }, + { + "id": "benefit-012", + "title": "龙里餐饮 10-16 人套餐权益", + "type": "food", + "merchant_id": "food-001", + "merchant_name": "野生菌肉饼鸡", + "image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-001/02.jpg", + "slogan": ["寻味龙里", "品味烟火"], + "price": { "original": 1250, "deal": 999, "spec": "10-16 人套餐" }, + "scope_desc": "联盟餐饮商户", + "valid_from": "2026-09-12", + "valid_to": "2026-12-31", + "valid_days": 7, + "stock_total": 40, + "stock_left": 12, + "status": "available", + "rule_text": "该权益不绑定具体商品,可多次使用。本次操作仅记录一次使用,不会使权益失效。", + "use_count": 0, + "last_used_at": null, + "related_entity_id": "food-001" + }, + { + "id": "benefit-013", + "title": "龙里刺梨原浆特产权益", + "type": "specialty", + "merchant_id": "specialty-002", + "merchant_name": "龙里刺梨汁", + "image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/specialties/specialty-002/01.jpg", + "slogan": ["带走龙里", "山野好物"], + "price": { "original": 99, "deal": 69, "spec": "刺梨原浆 2 瓶" }, + "scope_desc": "联盟特产商户|产地直发", + "valid_from": "2026-09-12", + "valid_to": "2026-12-31", + "valid_days": 7, + "stock_total": 200, + "stock_left": 118, + "status": "available", + "rule_text": "该权益不绑定具体商品,可多次使用。本次操作仅记录一次使用,不会使权益失效。", + "use_count": 0, + "last_used_at": null, + "related_entity_id": "specialty-002" + }, + { + "id": "benefit-101", + "title": "龙里水乡单人票权益", + "type": "ticket", + "merchant_id": "attraction-001", + "merchant_name": "龙里水乡旅游生态城", + "image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-001/01.jpg", + "slogan": ["畅游龙里", "拥抱自然"], + "price": { "original": 128, "deal": 88, "spec": "单人票" }, + "scope_desc": "龙里水乡旅游生态城", + "valid_from": "2026-09-12", + "valid_to": "2026-12-31", + "valid_days": 7, + "stock_total": 200, + "stock_left": 87, + "status": "claimed", + "rule_text": "该权益不绑定具体商品,可多次使用。本次操作仅记录一次使用,不会使权益失效。", + "use_count": 2, + "last_used_at": "2026-09-14 10:22", + "related_entity_id": "attraction-001" + }, + { + "id": "benefit-102", + "title": "龙里住宿双床房权益", + "type": "lodging", + "merchant_id": "accommodation-001", + "merchant_name": "云河酒店", + "image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-001/01.jpg", + "slogan": ["住在龙里", "枕山入梦"], + "price": { "original": 468, "deal": 368, "spec": "双床房" }, + "scope_desc": "云河酒店等联盟住宿商户", + "valid_from": "2026-09-12", + "valid_to": "2026-12-31", + "valid_days": 7, + "stock_total": 120, + "stock_left": 32, + "status": "claimed", + "rule_text": "该权益不绑定具体商品,可多次使用。本次操作仅记录一次使用,不会使权益失效。", + "use_count": 1, + "last_used_at": "2026-09-13 20:05", + "related_entity_id": "accommodation-001" + }, + { + "id": "benefit-103", + "title": "龙里餐饮 3-5 人餐权益", + "type": "food", + "merchant_id": "food-002", + "merchant_name": "龙里辣子鸡", + "image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-001/01.jpg", + "slogan": ["寻味龙里", "品味烟火"], + "price": { "original": 250, "deal": 199, "spec": "3-5 人餐" }, + "scope_desc": "龙里辣子鸡等餐饮商户", + "valid_from": "2026-09-12", + "valid_to": "2026-12-31", + "valid_days": 7, + "stock_total": 300, + "stock_left": 96, + "status": "claimed", + "rule_text": "该权益不绑定具体商品,可多次使用。本次操作仅记录一次使用,不会使权益失效。", + "use_count": 0, + "last_used_at": null, + "related_entity_id": "food-002" + }, + { + "id": "benefit-104", + "title": "龙里住宿大床房权益", + "type": "lodging", + "merchant_id": "accommodation-005", + "merchant_name": "龙里伯爵钻石酒店", + "image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-005/01.jpg", + "slogan": ["住在龙里", "枕山入梦"], + "price": { "original": 628, "deal": 468, "spec": "大床房" }, + "scope_desc": "龙里伯爵钻石酒店", + "valid_from": "2026-08-01", + "valid_to": "2026-08-31", + "valid_days": 7, + "stock_total": 60, + "stock_left": 0, + "status": "expired", + "rule_text": "该权益不绑定具体商品,可多次使用。本次操作仅记录一次使用,不会使权益失效。", + "use_count": 1, + "last_used_at": "2026-08-12 18:40", + "related_entity_id": "accommodation-005" + }, + { + "id": "benefit-201", + "title": "云河酒店到店住宿权益", + "type": "lodging", + "merchant_id": "accommodation-001", + "merchant_name": "云河酒店", + "image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-001/03.jpg", + "slogan": ["住在龙里", "枕山入梦"], + "price": { "original": 468, "deal": 368, "spec": "双床房" }, + "scope_desc": "云河酒店专享", + "valid_from": "2026-09-12", + "valid_to": "2026-12-31", + "valid_days": 7, + "stock_total": 60, + "stock_left": 28, + "status": "available", + "rule_text": "该权益不绑定具体商品,可多次使用。本次操作仅记录一次使用,不会使权益失效。", + "use_count": 0, + "last_used_at": null, + "related_entity_id": "accommodation-001" + } +] diff --git a/src/mock/catalog.json b/src/mock/catalog.json new file mode 100644 index 0000000..8d26b18 --- /dev/null +++ b/src/mock/catalog.json @@ -0,0 +1,266 @@ +{ + "accommodations": [ + { + "collection": "accommodations", + "item_count": 14, + "item_ids": [ + "accommodation-001", + "accommodation-002", + "accommodation-004", + "accommodation-005", + "accommodation-006", + "accommodation-007", + "accommodation-008", + "accommodation-009", + "accommodation-012", + "accommodation-013", + "accommodation-015", + "accommodation-017", + "accommodation-018", + "accommodation-019" + ], + "type": "酒店", + "type_code": "accommodation-hotel", + "type_order": 1 + }, + { + "collection": "accommodations", + "item_count": 4, + "item_ids": [ + "accommodation-003", + "accommodation-011", + "accommodation-014", + "accommodation-016" + ], + "type": "民宿别院", + "type_code": "accommodation-homestay", + "type_order": 2 + }, + { + "collection": "accommodations", + "item_count": 2, + "item_ids": [ + "accommodation-020", + "accommodation-021" + ], + "type": "旅居公寓", + "type_code": "accommodation-apartment", + "type_order": 3 + }, + { + "collection": "accommodations", + "item_count": 1, + "item_ids": [ + "accommodation-010" + ], + "type": "露营基地", + "type_code": "accommodation-camping", + "type_order": 4 + } + ], + "attraction_subprojects": [ + { + "collection": "attraction_subprojects", + "item_count": 1, + "item_ids": [ + "attraction-subproject-001" + ], + "type": "游乐体验", + "type_code": "subproject-recreation", + "type_order": 1 + }, + { + "collection": "attraction_subprojects", + "item_count": 1, + "item_ids": [ + "attraction-subproject-002" + ], + "type": "演艺体验", + "type_code": "subproject-performance", + "type_order": 2 + } + ], + "attractions": [ + { + "collection": "attractions", + "item_count": 3, + "item_ids": [ + "attraction-001", + "attraction-003", + "attraction-006" + ], + "type": "综合景区", + "type_code": "attraction-comprehensive", + "type_order": 1 + }, + { + "collection": "attractions", + "item_count": 8, + "item_ids": [ + "attraction-002", + "attraction-004", + "attraction-007", + "attraction-009", + "attraction-011", + "attraction-014", + "attraction-015", + "attraction-016" + ], + "type": "自然景观", + "type_code": "attraction-natural", + "type_order": 2 + }, + { + "collection": "attractions", + "item_count": 3, + "item_ids": [ + "attraction-008", + "attraction-010", + "attraction-013" + ], + "type": "乡村文旅", + "type_code": "attraction-rural-culture", + "type_order": 3 + }, + { + "collection": "attractions", + "item_count": 1, + "item_ids": [ + "attraction-012" + ], + "type": "主题小镇", + "type_code": "attraction-themed-town", + "type_order": 4 + }, + { + "collection": "attractions", + "item_count": 1, + "item_ids": [ + "attraction-005" + ], + "type": "地标观光", + "type_code": "attraction-landmark", + "type_order": 5 + } + ], + "foods": [ + { + "collection": "foods", + "item_count": 7, + "item_ids": [ + "food-001", + "food-002", + "food-004", + "food-007", + "food-008", + "food-010", + "food-014" + ], + "type": "特色菜肴", + "type_code": "food-featured-dish", + "type_order": 1 + }, + { + "collection": "foods", + "item_count": 4, + "item_ids": [ + "food-006", + "food-011", + "food-012", + "food-013" + ], + "type": "火锅汤锅", + "type_code": "food-hotpot", + "type_order": 2 + }, + { + "collection": "foods", + "item_count": 3, + "item_ids": [ + "food-015", + "food-016", + "food-017" + ], + "type": "粉面主食", + "type_code": "food-noodles-staple", + "type_order": 3 + }, + { + "collection": "foods", + "item_count": 2, + "item_ids": [ + "food-003", + "food-009" + ], + "type": "烧烤", + "type_code": "food-barbecue", + "type_order": 4 + }, + { + "collection": "foods", + "item_count": 6, + "item_ids": [ + "food-005", + "food-020", + "food-021", + "food-022", + "food-023", + "food-024" + ], + "type": "地方小吃", + "type_code": "food-local-snack", + "type_order": 5 + }, + { + "collection": "foods", + "item_count": 2, + "item_ids": [ + "food-018", + "food-019" + ], + "type": "甜品饮品", + "type_code": "food-dessert-drink", + "type_order": 6 + } + ], + "specialties": [ + { + "collection": "specialties", + "item_count": 7, + "item_ids": [ + "specialty-001", + "specialty-002", + "specialty-003", + "specialty-004", + "specialty-005", + "specialty-006", + "specialty-007" + ], + "type": "刺梨制品", + "type_code": "specialty-rosa-roxburghii", + "type_order": 1 + }, + { + "collection": "specialties", + "item_count": 2, + "item_ids": [ + "specialty-008", + "specialty-009" + ], + "type": "地方食品", + "type_code": "specialty-local-food", + "type_order": 2 + }, + { + "collection": "specialties", + "item_count": 2, + "item_ids": [ + "specialty-010", + "specialty-011" + ], + "type": "农产品", + "type_code": "specialty-agricultural", + "type_order": 3 + } + ] +} \ No newline at end of file diff --git a/src/mock/items.json b/src/mock/items.json new file mode 100644 index 0000000..07cf366 --- /dev/null +++ b/src/mock/items.json @@ -0,0 +1,3486 @@ +{ + "accommodation-001": { + "address_text": "贵州省黔南州龙里县云栖谷·双龙镇巫山峡谷旅游景区内9号院", + "badge": "度假酒店", + "business_hours": "09:00–22:00", + "category": "酒店", + "collection": "accommodations", + "contact": { + "dial": "08545716666", + "display": "0854-5716666", + "raw": "0854-5716666" + }, + "data_status": "已归类", + "description": "云河酒店位于黔南州龙里县双龙镇巫山峡谷旅游景区内,藏身海拔800米之上、云雾里的悬崖之巅。置身于云河酒店,又仿若身处云端之上的天空之城,能从另一个高度去看看脚下的土地与山河,并回归自然,感受质朴却有品质的生活。进入酒店青石瓦墙,飞檐翘角,仿佛误入了江南水乡的一隅。室内除了现代感十足的艺术品外,空间里不乏充满岁月感的旧物。", + "entity_type": "accommodation", + "facilities": [ + "景观空间", + "艺术陈设" + ], + "facts": [ + { + "label": "海拔", + "note": "以上", + "unit": "米", + "value": 800 + } + ], + "gallery_urls": [ + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-001/02.jpg", + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-001/03.jpg", + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-001/04.jpg" + ], + "id": "accommodation-001", + "main_image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-001/01.jpg", + "name": "云河酒店", + "room_types": [ + ], + "sort_order": 1, + "sort_within_type": 1, + "subtype": "度假酒店", + "tags": [ + "悬崖酒店", + "景区内", + "山景", + "江南风格" + ], + "type": "酒店", + "type_code": "accommodation-hotel", + "type_order": 1 + }, + "accommodation-002": { + "address_text": "贵州省黔南州龙里县龙山镇贵龙纵线比孟村鸡场堡组云从朵花温泉酒店", + "badge": "温泉度假酒店", + "business_hours": "09:00–22:00", + "category": "酒店", + "collection": "accommodations", + "contact": { + "dial": "085188515333", + "display": "0851-88515333", + "raw": "0851-88515333" + }, + "data_status": "已归类", + "description": "地处黔南州龙里县西南部,北接龙溪大道,南临朵花峡谷,依山傍水而建,是隐于闹市之中的一方清净地。云从朵花以朵花峡谷景观及富含微量元素的天然地下矿热水为依托,紧邻世界第一的高山峡谷景观斜拉桥——龙里河大桥,致力于打造黔中首个集特色体验、休闲娱乐、疗养保健、教育学习为核心的综合型山地温泉康养胜地。走进云从朵花,便是徜徉于绿意盎然中,见证人与自然的相得益彰。", + "entity_type": "accommodation", + "facilities": [ + "温泉", + "康养设施", + "休闲娱乐", + "教育学习" + ], + "facts": [ + ], + "gallery_urls": [ + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-002/02.jpg", + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-002/03.jpg", + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-002/04.jpg" + ], + "id": "accommodation-002", + "main_image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-002/01.jpg", + "name": "云从朵花温泉度假中心", + "room_types": [ + ], + "sort_order": 2, + "sort_within_type": 2, + "subtype": "温泉度假酒店", + "tags": [ + "温泉", + "康养", + "山地度假", + "私汤" + ], + "transport_note": "北接龙溪大道,南临朵花峡谷,紧邻龙里河大桥", + "type": "酒店", + "type_code": "accommodation-hotel", + "type_order": 1 + }, + "accommodation-003": { + "address_text": "贵州省黔南州龙里县龙山镇余下村余下组商业街1号楼2层", + "badge": "度假别院", + "business_hours": "09:00–22:00", + "category": "民宿别院", + "collection": "accommodations", + "contact": { + "dial": "085185848666", + "display": "0851-85848666", + "raw": "0851-85848666" + }, + "data_status": "已归类", + "description": "南卓·瞰龙别院隶属南方卓越集团旗下,是一家集餐饮、住宿、会议服务等为一体的综合性酒店。酒店设有网球、篮球、排球等体育项目,是旅居休闲放松和亲子交流陪伴的理想场所。在这里,春天可以观赏九龙潭两岸的桃花林;夏天桃子、杨梅成熟了,可以置身果林畅享最自然、最新鲜的果实;待到秋冬季来临,两岸银杏随风飘落,满地的金黄灿烂,美得让人陶醉。", + "entity_type": "accommodation", + "facilities": [ + "餐厅", + "会议服务", + "网球", + "篮球", + "排球", + "果园体验" + ], + "facts": [ + ], + "gallery_urls": [ + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-003/02.jpg", + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-003/03.jpg", + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-003/04.jpg" + ], + "id": "accommodation-003", + "main_image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-003/01.jpg", + "name": "龙里南卓·瞰龙别院", + "room_types": [ + ], + "sort_order": 15, + "sort_within_type": 3, + "subtype": "度假别院", + "tags": [ + "餐饮", + "住宿", + "会议", + "体育", + "亲子" + ], + "type": "民宿别院", + "type_code": "accommodation-homestay", + "type_order": 2 + }, + "accommodation-004": { + "address_text": "贵州省双龙航空港经济区贵龙大道与中铁大道交汇处贵阳卢浮宫金熙酒店", + "badge": "文化商务酒店", + "business_hours": "09:00–22:00", + "category": "酒店", + "collection": "accommodations", + "contact": { + "dial": "085188601777", + "display": "0851-88601777", + "raw": "0851-88601777" + }, + "data_status": "已归类", + "description": "卢浮宫酒店是一家集欧洲文化、商务、会议展览、休闲度假的酒店,酒店致力于将欧洲酒店的专业标准与中国底蕴深远的文化相结合,为宾客提供舒适、好客、物超所值的体验。酒店坐落于双龙航空港经济区,拥有轻奢舒适客房、全日制餐厅、法餐厅、宴会厅、商务中心、奢侈品展示、艺术长廊等,是商务及休闲度假人士放松身心的理想港湾。", + "entity_type": "accommodation", + "facilities": [ + "全日制餐厅", + "法餐厅", + "宴会厅", + "商务中心", + "奢侈品展示", + "艺术长廊" + ], + "facts": [ + ], + "gallery_urls": [ + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-004/02.jpg", + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-004/03.jpg", + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-004/04.jpg" + ], + "id": "accommodation-004", + "main_image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-004/01.jpg", + "name": "卢浮宫酒店", + "room_types": [ + ], + "sort_order": 3, + "sort_within_type": 4, + "subtype": "文化商务酒店", + "tags": [ + "欧洲文化", + "商务", + "会议展览", + "休闲度假" + ], + "type": "酒店", + "type_code": "accommodation-hotel", + "type_order": 1 + }, + "accommodation-005": { + "address_text": "贵州省黔南州龙里县环城路伯爵钻石广场", + "badge": "四星级酒店", + "business_hours": "09:00–22:00", + "category": "酒店", + "collection": "accommodations", + "contact": { + "dial": "08544977777", + "display": "0854-4977777", + "raw": "0854-4977777" + }, + "data_status": "已归类", + "description": "龙里伯爵钻石酒店是一家集住宿、餐饮、会议、休闲等为一体的豪华型四星级高档酒店。酒店分地下一层和地上七层,地处誉称为贵阳市后花园的龙里县中心地带伯爵钻石广场三号楼,周边与购物超市、银行、汽车站仅几步之遥,距高速路口仅几分钟、至贵阳龙洞保机场约25分钟、至贵阳市约35分钟的车程,交通十分便捷。", + "entity_type": "accommodation", + "facilities": [ + "餐饮", + "会议", + "休闲", + "购物配套" + ], + "facts": [ + { + "label": "星级", + "note": "", + "unit": "星", + "value": 4 + }, + { + "label": "地下楼层", + "note": "", + "unit": "层", + "value": 1 + }, + { + "label": "地上楼层", + "note": "", + "unit": "层", + "value": 7 + }, + { + "label": "至机场车程", + "note": "约", + "unit": "分钟", + "value": 25 + }, + { + "label": "至贵阳市车程", + "note": "约", + "unit": "分钟", + "value": 35 + } + ], + "gallery_urls": [ + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-005/02.jpg", + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-005/03.jpg", + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-005/04.jpg", + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-005/05.jpg" + ], + "id": "accommodation-005", + "main_image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-005/01.jpg", + "name": "龙里伯爵钻石酒店", + "room_types": [ + ], + "sort_order": 4, + "sort_within_type": 5, + "subtype": "四星级酒店", + "tags": [ + "住宿", + "餐饮", + "会议", + "休闲", + "县城中心" + ], + "transport_note": "距高速路口数分钟;至贵阳龙洞堡机场约25分钟;至贵阳市约35分钟", + "type": "酒店", + "type_code": "accommodation-hotel", + "type_order": 1 + }, + "accommodation-006": { + "address_text": "贵州省黔南州龙里县云栖谷·双龙镇58号楼", + "badge": "主题酒店", + "business_hours": "09:00–22:00", + "capacity_people": 34, + "category": "酒店", + "collection": "accommodations", + "contact": { + "dial": "08545164999", + "display": "0854-5164999", + "raw": "0854-5164999" + }, + "data_status": "已归类", + "description": "酒店以日韩风为主题,打造的17间不同文化风格客房,其中:8个精品标间、9个精品景观房,可同时接待34人。酒店三楼有一百平的休闲平台,适合朋友、家人、情侣聚会。休闲厅提供了一张大茶台,适合于谈工作、交流、各类聚会等服务,还可以提供私人定制服务,满足客人的需求。", + "entity_type": "accommodation", + "facilities": [ + "100平方米休闲平台", + "大茶台", + "私人定制服务" + ], + "facts": [ + { + "label": "精品标间", + "note": "", + "unit": "间", + "value": 8 + }, + { + "label": "精品景观房", + "note": "", + "unit": "间", + "value": 9 + }, + { + "label": "休闲平台面积", + "note": "", + "unit": "平方米", + "value": 100 + } + ], + "gallery_urls": [ + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-006/02.jpg", + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-006/03.jpg", + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-006/04.jpg", + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-006/05.jpg" + ], + "id": "accommodation-006", + "main_image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-006/01.jpg", + "name": "夜郎·云溪酒店", + "room_count": 17, + "room_types": [ + "精品标间", + "精品景观房" + ], + "sort_order": 5, + "sort_within_type": 6, + "subtype": "主题酒店", + "tags": [ + "日韩风", + "定制服务", + "聚会", + "景观房" + ], + "type": "酒店", + "type_code": "accommodation-hotel", + "type_order": 1 + }, + "accommodation-007": { + "address_text": "贵州省黔南州龙里县冠山街道金龙东路68号龙城明珠负1-18", + "badge": "高档酒店", + "business_hours": "09:00–22:00", + "category": "酒店", + "collection": "accommodations", + "contact": { + "dial": "08548938888", + "display": "0854-8938888", + "raw": "0854-8938888" + }, + "data_status": "已归类", + "description": "珑庭芳大酒店坐落于龙里县冠山街道金龙东路,酒店紧靠县政府、国税局、第三小学,地理位置优越,距政府机关、餐厅、购物中心和众多景点步行仅数分钟路程之遥。酒店按照高档酒店修建,以客人和员工合作伙伴为愿景、以服务之遵从服务之荣光为服务宗旨、典雅与精品设计的完美结合,满足不同客人的个性化服务与定制的精选,酒店的宗旨是:“心之所向、心归所属”。", + "entity_type": "accommodation", + "facilities": [ + "餐饮周边", + "购物周边", + "定制服务" + ], + "facts": [ + ], + "gallery_urls": [ + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-007/02.jpg", + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-007/03.jpg" + ], + "id": "accommodation-007", + "main_image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-007/01.jpg", + "name": "珑庭芳大酒店", + "room_types": [ + ], + "sort_order": 6, + "sort_within_type": 7, + "subtype": "高档酒店", + "tags": [ + "县城中心", + "商务", + "购物便利" + ], + "transport_note": "紧靠县政府、国税局、第三小学,步行可达餐厅、购物中心和多个景点", + "type": "酒店", + "type_code": "accommodation-hotel", + "type_order": 1 + }, + "accommodation-008": { + "address_text": "贵州省双龙航空港经济区中铁大道太阳谷1组团1区一期酒店1层1号", + "badge": "商务酒店", + "business_hours": "09:00–22:00", + "capacity_people": 300, + "category": "酒店", + "collection": "accommodations", + "contact": { + "dial": "085188686999", + "display": "0851-88686999", + "raw": "0851-88686999" + }, + "data_status": "已归类", + "description": "维也纳国际酒店坐落于双龙航空港经济区中铁生态城太阳谷中铁大道。距龙洞堡机场6.6公里、距公交车站只需要三分钟,交通十分便利。酒店拥有豪华单/标间、高级单/标间、家庭/行政套房、棋牌室等客房182间,集客房、多功能会议室、餐饮、健身房等于一体,大会议室可同时容纳300人,实为商务洽谈、旅游观光、休闲娱乐的上佳之选。", + "entity_type": "accommodation", + "facilities": [ + "多功能会议室", + "餐饮", + "健身房" + ], + "facts": [ + { + "label": "距龙洞堡机场", + "note": "", + "unit": "公里", + "value": 6.6 + }, + { + "label": "距公交车站", + "note": "", + "unit": "分钟", + "value": 3 + }, + { + "label": "大会议室容量", + "note": "", + "unit": "人", + "value": 300 + } + ], + "gallery_urls": [ + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-008/02.jpg", + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-008/03.jpg", + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-008/04.jpg", + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-008/05.jpg", + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-008/06.jpg" + ], + "id": "accommodation-008", + "main_image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-008/01.jpg", + "name": "维也纳国际酒店", + "room_count": 182, + "room_types": [ + "豪华单间", + "豪华标间", + "高级单间", + "高级标间", + "家庭套房", + "行政套房", + "棋牌室" + ], + "sort_order": 7, + "sort_within_type": 8, + "subtype": "商务酒店", + "tags": [ + "机场交通", + "会议", + "餐饮", + "健身" + ], + "transport_note": "距龙洞堡机场6.6公里;距公交车站约3分钟", + "type": "酒店", + "type_code": "accommodation-hotel", + "type_order": 1 + }, + "accommodation-009": { + "address_text": "贵州省黔南州龙里县云栖谷双龙镇中铁生态城中心三路问水温泉小镇", + "badge": "温泉小镇酒店", + "business_hours": "09:00–22:00", + "category": "酒店", + "collection": "accommodations", + "contact": { + "dial": "085188684777", + "display": "0851-88684777", + "raw": "0851-88684777" + }, + "data_status": "已归类", + "description": "问水温泉小镇闲悦阁酒店位于中铁国际生态城白晶谷,酒店拥有日式大床房、日式双床房等,房间设施设备一应俱全,整体设计素雅、轻松,让人感觉舒适自然,让每个到此进行温泉之旅的游客都留下美好安逸的体验。闲暇之余,邀上三五好友,陪同知心爱人,携家人来此,远离城市喧闹,在松衫下独享优雅之境!", + "entity_type": "accommodation", + "facilities": [ + "温泉小镇配套" + ], + "facts": [ + ], + "gallery_urls": [ + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-009/02.jpg", + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-009/03.jpg", + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-009/04.jpg" + ], + "id": "accommodation-009", + "main_image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-009/01.jpg", + "name": "问水温泉小镇闲悦阁酒店", + "room_types": [ + "日式大床房", + "日式双床房" + ], + "sort_order": 8, + "sort_within_type": 9, + "subtype": "温泉小镇酒店", + "tags": [ + "日式风格", + "温泉", + "大床房", + "双床房" + ], + "type": "酒店", + "type_code": "accommodation-hotel", + "type_order": 1 + }, + "accommodation-010": { + "address_text": "贵州省黔南州龙里县醒狮镇大岩村", + "badge": "露营基地", + "business_hours": "09:00–22:00", + "capacity_people": 4, + "category": "露营基地", + "collection": "accommodations", + "contact": { + "dial": "13078578788", + "display": "130-7857-8788", + "raw": "130-7857-8788" + }, + "data_status": "已归类", + "description": "顽乐尧轻奢露营基地位于醒狮镇大岩村小岩组,距离贵阳市区30分钟车程,基地内呈现接待、露营、体验三区分离,同时,在临水的一栋4层楼建筑中布局了咖啡馆、康乐室、音乐吧等业态,设立的宠物乐园、棋牌、台球、游泳池等多重设施能够满足不同年龄段游客需求,营地目前提供2人到4人的入住帐篷,价格从880元到1680元不等,冬季,顽乐尧推出围炉煮茶套餐,陶罐、铁壶、炉火等,与世界杯等体育赛事热点搭配起来,一壶热茶,度过寒冬。", + "entity_type": "accommodation", + "facilities": [ + "咖啡馆", + "康乐室", + "音乐吧", + "宠物乐园", + "棋牌", + "台球", + "游泳池", + "围炉煮茶" + ], + "facts": [ + { + "label": "距贵阳市区车程", + "note": "", + "unit": "分钟", + "value": 30 + }, + { + "label": "临水建筑", + "note": "", + "unit": "层", + "value": 4 + }, + { + "label": "帐篷入住人数", + "note": "", + "unit": "人", + "value": "2-4" + }, + { + "label": "价格区间", + "note": "源PDF标示,需上线前确认", + "unit": "元", + "value": "880-1680" + } + ], + "gallery_urls": [ + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-010/02.jpg", + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-010/03.jpg", + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-010/04.jpg", + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-010/05.jpg" + ], + "id": "accommodation-010", + "main_image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-010/01.jpg", + "name": "顽乐尧轻奢露营基地", + "room_types": [ + "2人帐篷", + "3人帐篷", + "4人帐篷" + ], + "sort_order": 21, + "sort_within_type": 10, + "subtype": "露营基地", + "tags": [ + "轻奢露营", + "亲子", + "宠物", + "泳池", + "咖啡馆" + ], + "transport_note": "距贵阳市区约30分钟车程", + "type": "露营基地", + "type_code": "accommodation-camping", + "type_order": 4 + }, + "accommodation-011": { + "address_text": "贵州省黔南州龙里县半卡苑与甲秀街交叉口西北方向", + "badge": "轻奢别院", + "business_hours": "09:00–22:00", + "category": "民宿别院", + "collection": "accommodations", + "contact": { + "dial": "085185848666", + "display": "0851-85848666", + "raw": "0851-85848666" + }, + "data_status": "已归类", + "description": "24°坞别院座落于有“中国院子”之称的双龙镇,位于龙里与贵阳的交通要道。酒店建筑装修风格借鉴古代屯堡建筑和院子相集合,兼具极致优雅舒适的服务及建筑风尚为一体,为顾客提供富有禅意、人文韵味的轻奢文化旅居体验。整体建筑由两个院落三层组成,26间不同文化风格客房分布在两个院落,其中:8个精品标间、15个精品单间、2个景观房、1个复式套房。设有多功能会议厅、会客厅、庭院、大堂吧。", + "entity_type": "accommodation", + "facilities": [ + "多功能会议厅", + "会客厅", + "庭院", + "大堂吧" + ], + "facts": [ + { + "label": "院落", + "note": "", + "unit": "个", + "value": 2 + }, + { + "label": "楼层", + "note": "", + "unit": "层", + "value": 3 + }, + { + "label": "精品标间", + "note": "", + "unit": "间", + "value": 8 + }, + { + "label": "精品单间", + "note": "", + "unit": "间", + "value": 15 + }, + { + "label": "景观房", + "note": "", + "unit": "间", + "value": 2 + }, + { + "label": "复式套房", + "note": "", + "unit": "间", + "value": 1 + } + ], + "gallery_urls": [ + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-011/02.jpg", + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-011/03.jpg" + ], + "id": "accommodation-011", + "main_image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-011/01.jpg", + "name": "24°坞别院", + "room_count": 26, + "room_types": [ + "精品标间", + "精品单间", + "景观房", + "复式套房" + ], + "sort_order": 16, + "sort_within_type": 11, + "subtype": "轻奢别院", + "tags": [ + "中式院落", + "屯堡风格", + "会议", + "禅意" + ], + "transport_note": "位于龙里与贵阳的交通要道", + "type": "民宿别院", + "type_code": "accommodation-homestay", + "type_order": 2 + }, + "accommodation-012": { + "address_text": "贵州省黔南州龙里县冠山街道兴龙路24号", + "badge": "商务酒店", + "business_hours": "09:00–22:00", + "capacity_people": 200, + "category": "酒店", + "collection": "accommodations", + "contact": { + "dial": "08545677666", + "display": "0854-5677666", + "raw": "0854-5677666" + }, + "data_status": "已归类", + "description": "纪龙酒店坐落于正大街与兴龙路交叉处,是一家集餐饮、住宿、会议于一体的商务型高端酒店。酒店毗邻各大商业街、银行、医院、超市,交通十分便利。酒店客房分为普通间、精致标间、豪华单间、豪华标间、商务三人间、商务套房等多种房型。餐厅设有包房、宴会厅,可同时容纳两百多人用餐,会议室可接待中小型会议,多媒体投影仪一应俱全。酒店的停车场有免费停车位,为您的爱车找到一个避风的港湾。", + "entity_type": "accommodation", + "facilities": [ + "包房", + "宴会厅", + "会议室", + "多媒体投影", + "免费停车" + ], + "facts": [ + { + "label": "餐厅容量", + "note": "", + "unit": "余人", + "value": 200 + } + ], + "gallery_urls": [ + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-012/02.jpg", + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-012/03.jpg", + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-012/04.jpg" + ], + "id": "accommodation-012", + "main_image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-012/01.jpg", + "name": "纪龙酒店", + "room_types": [ + "普通间", + "精致标间", + "豪华单间", + "豪华标间", + "商务三人间", + "商务套房" + ], + "sort_order": 9, + "sort_within_type": 12, + "subtype": "商务酒店", + "tags": [ + "餐饮", + "住宿", + "会议", + "免费停车" + ], + "transport_note": "毗邻商业街、银行、医院和超市", + "type": "酒店", + "type_code": "accommodation-hotel", + "type_order": 1 + }, + "accommodation-013": { + "address_text": "贵州省黔南州龙里县冠山街道金龙路龙城国际对面", + "badge": "休闲商务酒店", + "business_hours": "09:00–22:00", + "category": "酒店", + "collection": "accommodations", + "contact": { + "dial": "08548816666", + "display": "0854-8816666", + "raw": "0854-8816666" + }, + "data_status": "已归类", + "description": "西苑锦润酒店地处龙里繁华的龙城国际购物中心对面。酒店以东南亚休闲风情为主题,客房采用堪比豪华型酒店雅高系列优质床品,全套高端进口系列洗浴用品,100M高速光纤,全WiFi覆盖。从酒店到机场19公里、距贵广高铁站800米、酒店周边商业景点众多,酒店大门口有多条公交线路,出行方便,周边休闲、娱乐生活项目丰富。", + "entity_type": "accommodation", + "facilities": [ + "高端床品", + "进口洗浴用品", + "100M高速光纤", + "全WiFi覆盖" + ], + "facts": [ + { + "label": "距机场", + "note": "", + "unit": "公里", + "value": 19 + }, + { + "label": "距贵广高铁站", + "note": "", + "unit": "米", + "value": 800 + }, + { + "label": "光纤带宽", + "note": "", + "unit": "M", + "value": 100 + } + ], + "gallery_urls": [ + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-013/02.jpg", + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-013/03.jpg", + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-013/04.jpg", + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-013/05.jpg", + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-013/06.jpg" + ], + "id": "accommodation-013", + "main_image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-013/01.jpg", + "name": "西苑锦润酒店", + "room_types": [ + ], + "sort_order": 10, + "sort_within_type": 13, + "subtype": "休闲商务酒店", + "tags": [ + "东南亚风格", + "高铁站", + "商业中心", + "高速WiFi" + ], + "transport_note": "距机场19公里;距贵广高铁站800米;门口有多条公交线路", + "type": "酒店", + "type_code": "accommodation-hotel", + "type_order": 1 + }, + "accommodation-014": { + "address_text": "贵州省黔南州龙里县云栖谷双龙镇二期53号院", + "badge": "精品民宿", + "business_hours": "09:00–22:00", + "capacity_people": 28, + "category": "民宿别院", + "collection": "accommodations", + "contact": { + "dial": "08542626856", + "display": "0854-2626856", + "raw": "0854-2626856" + }, + "data_status": "已归类", + "description": "广莱涵舍坐落于贵州省黔南州龙里县双龙镇景区。目前一共有16间房,包场可接待28人,每间房都有独立卫浴,提供WIFI、洗漱及生活用品。每层楼都有约20平方的公共活动区域。另设有共享厨房,满足你对饮食的自我订制。在这里可以让你摆脱都市压力的束缚,让疲惫的心灵得到宝贵的歇息机会,更重要的是可以找寻到久违的归属感,遇见最美的自己!", + "entity_type": "accommodation", + "facilities": [ + "独立卫浴", + "WiFi", + "洗漱用品", + "生活用品", + "公共活动区", + "共享厨房" + ], + "facts": [ + { + "label": "公共活动区域", + "note": "约", + "unit": "平方米/层", + "value": 20 + } + ], + "gallery_urls": [ + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-014/02.jpg", + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-014/03.jpg" + ], + "id": "accommodation-014", + "main_image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-014/01.png", + "name": "广莱涵舍", + "room_count": 16, + "room_types": [ + ], + "sort_order": 17, + "sort_within_type": 14, + "subtype": "精品民宿", + "tags": [ + "包场", + "共享厨房", + "独立卫浴", + "双龙镇" + ], + "type": "民宿别院", + "type_code": "accommodation-homestay", + "type_order": 2 + }, + "accommodation-015": { + "address_text": "贵州省黔南州龙里县云栖谷双龙镇双龙航空港经济区中心三路中铁生态城", + "badge": "度假酒店", + "business_hours": "09:00–22:00", + "category": "酒店", + "collection": "accommodations", + "contact": { + "dial": "085182388888", + "display": "0851-82388888", + "raw": "0851-82388888" + }, + "data_status": "已归类", + "description": "安纳塔拉度假酒店位于双龙航空港经济区中铁国际生态城。酒店拥有雅致舒适的现代化客房,房内设施一应俱全,让您尽享便捷舒适。这里有餐厅和酒吧,为您提供别样的美味,定能让您的味蕾得到极大的满足;还有多功能厅和多媒体演示系统,适合举办各种活动。您还可以去酒店的室内/室外游泳池、健身室享受运动的畅快,累了之后还可以到按摩室、桑拿浴室、足浴、SPA放松身心。", + "entity_type": "accommodation", + "facilities": [ + "餐厅", + "酒吧", + "多功能厅", + "多媒体演示系统", + "室内泳池", + "室外泳池", + "健身室", + "按摩室", + "桑拿浴室", + "足浴", + "SPA" + ], + "facts": [ + ], + "gallery_urls": [ + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-015/02.jpg", + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-015/03.jpg", + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-015/04.jpg", + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-015/05.jpg" + ], + "id": "accommodation-015", + "main_image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-015/01.jpg", + "name": "安纳塔拉度假酒店", + "room_types": [ + ], + "sort_order": 11, + "sort_within_type": 15, + "subtype": "度假酒店", + "tags": [ + "餐厅", + "酒吧", + "会议", + "泳池", + "SPA" + ], + "type": "酒店", + "type_code": "accommodation-hotel", + "type_order": 1 + }, + "accommodation-016": { + "address_text": "贵州省黔南州龙里县醒狮镇大岩村山坡小寨组", + "badge": "金山级民宿", + "business_hours": "09:00–22:00", + "category": "民宿别院", + "collection": "accommodations", + "contact": { + "dial": "13985788408", + "display": "13985788408", + "raw": "13985788408" + }, + "data_status": "已归类", + "description": "藏于大岩村山林深处,是贵州省金山级民宿,依坡而建、伴樟而居,将布依村落肌理与中式禅意美学相融。原木搭建的院落错落有致,客房自带全景露台,晚风穿林而过,尽揽山间清景。院中设茶台、咖啡馆、多功能厅、展览室,闲时可煮茶读书;配套布依风味餐厅,甄选本地山珍,还原山野本味。闲暇可跟着村民体验大岩根雕、山间采摘,或沿森林步道漫步,沉浸式感受山居之趣,既有乡野的淳朴烟火,又有治愈人心的静谧,是藏在贵州山野里的诗意栖居地。", + "entity_type": "accommodation", + "facilities": [ + "全景露台", + "茶台", + "咖啡馆", + "多功能厅", + "展览室", + "布依风味餐厅", + "根雕体验", + "山间采摘", + "森林步道" + ], + "facts": [ + ], + "gallery_urls": [ + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-016/02.jpg", + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-016/03.jpg", + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-016/04.jpg" + ], + "id": "accommodation-016", + "main_image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-016/01.jpg", + "name": "隐与·清风与落民宿", + "room_types": [ + ], + "sort_order": 18, + "sort_within_type": 16, + "subtype": "金山级民宿", + "tags": [ + "山林", + "布依村落", + "中式禅意", + "全景露台", + "根雕体验" + ], + "type": "民宿别院", + "type_code": "accommodation-homestay", + "type_order": 2 + }, + "accommodation-017": { + "address_text": "龙里县谷脚镇万豪大道万豪商贸城总部1-2#", + "badge": "商务度假酒店", + "business_hours": "09:00–22:00", + "category": "酒店", + "collection": "accommodations", + "contact": { + "dial": "085188887999", + "display": "0851-88887999", + "raw": "0851-88887999" + }, + "data_status": "已归类", + "description": "多彩全球大酒店坐落于贵州省双龙镇万豪大道万豪商贸总部1.2#,临近贵阳中铁生态城,周边实验学校、双龙镇景区、龙里西高速路口。交通十分便利,距离龙洞堡机场9.9公里,龙里北高铁北站11公里,贵阳高铁北站26公里,距离龙里油画大草原景区19公里,十里刺梨沟景区16公里。是一家集住宿、餐饮、会议为一体的商务型度假酒店。", + "entity_type": "accommodation", + "facilities": [ + "餐饮", + "会议" + ], + "facts": [ + { + "label": "距龙洞堡机场", + "note": "", + "unit": "公里", + "value": 9.9 + }, + { + "label": "距龙里北站", + "note": "", + "unit": "公里", + "value": 11 + }, + { + "label": "距贵阳北站", + "note": "", + "unit": "公里", + "value": 26 + }, + { + "label": "距龙里油画大草原", + "note": "", + "unit": "公里", + "value": 19 + }, + { + "label": "距十里刺梨沟", + "note": "", + "unit": "公里", + "value": 16 + } + ], + "gallery_urls": [ + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-017/02.jpg", + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-017/03.jpg", + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-017/04.jpg" + ], + "id": "accommodation-017", + "main_image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-017/01.jpg", + "name": "多彩全球大酒店", + "room_types": [ + ], + "sort_order": 12, + "sort_within_type": 17, + "subtype": "商务度假酒店", + "tags": [ + "住宿", + "餐饮", + "会议", + "机场交通" + ], + "transport_note": "距龙洞堡机场9.9公里;距龙里北站11公里;距贵阳北站26公里;距龙里油画大草原19公里;距十里刺梨沟16公里", + "type": "酒店", + "type_code": "accommodation-hotel", + "type_order": 1 + }, + "accommodation-018": { + "address_text": "贵州省黔南州龙里县铁龙路", + "badge": "商务酒店", + "business_hours": "09:00–22:00", + "category": "酒店", + "collection": "accommodations", + "contact": { + "dial": "08545679888", + "display": "0854-5679888", + "raw": "0854-5679888" + }, + "data_status": "已归类", + "description": "酒店位于龙里县铁龙路,地处龙里县商业中心圈,地理位置优越,毗邻贵新高速、夏蓉高速等,紧邻龙里北站3公里,距离龙洞堡机场24公里。酒店设计风格简约而富有品质,酒店房间108间,本店房型选择多样化,配有商务房、电竞房、雅致房等等,拥有餐厅、自助洗衣房,为您打造舒适便捷的入住体验。", + "entity_type": "accommodation", + "facilities": [ + "餐厅", + "自助洗衣房" + ], + "facts": [ + { + "label": "距龙里北站", + "note": "", + "unit": "公里", + "value": 3 + }, + { + "label": "距龙洞堡机场", + "note": "", + "unit": "公里", + "value": 24 + } + ], + "gallery_urls": [ + ], + "id": "accommodation-018", + "main_image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-018/01.jpg", + "name": "丫丫酒店", + "room_count": 108, + "room_types": [ + "商务房", + "电竞房", + "雅致房" + ], + "sort_order": 13, + "sort_within_type": 18, + "subtype": "商务酒店", + "tags": [ + "县城商业中心", + "商务房", + "电竞房", + "自助洗衣" + ], + "transport_note": "距龙里北站3公里;距龙洞堡机场24公里;毗邻贵新高速和源PDF所写“夏蓉高速”", + "type": "酒店", + "type_code": "accommodation-hotel", + "type_order": 1 + }, + "accommodation-019": { + "address_text": "贵州省黔南州龙里县双龙镇中铁大道酒博园8栋", + "badge": "主题酒店", + "business_hours": "09:00–22:00", + "category": "酒店", + "collection": "accommodations", + "contact": { + "dial": "085188727788", + "display": "0851-88727788", + "raw": "0851-88727788" + }, + "data_status": "已归类", + "description": "酒店位于贵州省黔南布依族苗族自治州龙里县谷脚镇,距离双龙镇巫山峡谷旅游景区步行约两分钟。距离龙洞堡机场约6公里,乘车18分钟(酒店提供接送机服务)。以“钱缪家训”为文化核心,是以宋代八雅文化中的“琴棋书画诗酒茶花”中的“花雅”文化为主题,在酒店设计中融入“多彩贵州”理念,以“轻中式宋极简江南风”为特色,打造一方充满东方之美的“堂、廊、馆、房、飨、浣、境”宋“潮”空间。", + "entity_type": "accommodation", + "facilities": [ + "接送机服务", + "宋式主题空间" + ], + "facts": [ + { + "label": "步行至景区", + "note": "约", + "unit": "分钟", + "value": 2 + }, + { + "label": "距龙洞堡机场", + "note": "约", + "unit": "公里", + "value": 6 + }, + { + "label": "机场车程", + "note": "", + "unit": "分钟", + "value": 18 + } + ], + "gallery_urls": [ + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-019/02.jpg" + ], + "id": "accommodation-019", + "main_image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-019/01.jpg", + "name": "陌上轻雅酒店", + "room_types": [ + ], + "sort_order": 14, + "sort_within_type": 19, + "subtype": "主题酒店", + "tags": [ + "宋式美学", + "接送机", + "景区步行", + "双龙镇" + ], + "transport_note": "步行至双龙镇巫山峡谷景区约2分钟;距龙洞堡机场约6公里、车程18分钟", + "type": "酒店", + "type_code": "accommodation-hotel", + "type_order": 1 + }, + "accommodation-020": { + "address_text": "贵州省双龙航空经济区万豪大道旁悠山美墅组团G6组团27栋", + "badge": "酒店式公寓", + "business_hours": "09:00–22:00", + "category": "旅居公寓", + "collection": "accommodations", + "contact": { + "dial": "08545669118", + "display": "0854-5669118", + "raw": "0854-5669118" + }, + "data_status": "已归类", + "description": "悠享公寓座落于贵阳瑞士风情别墅区——深高速·悠山美墅内,是一所以“悠享旅居好生活”为服务理念的高端酒店式旅居短租公寓,由一栋洋房和一栋独栋别墅组成。洋房公寓共有40套,房型为3室2厅1厨2卫1洗衣房,均为高档精装修。公寓内配有电视机、冰箱、洗衣机、微波炉、热水器、地暖、麻将机等设备。别墅公寓是一栋四层独栋瑞士风情别墅,内设8间大床房,配套有电梯、会议室、宴会厅等,适合家庭聚会或小型商务活动。", + "entity_type": "accommodation", + "facilities": [ + "电视机", + "冰箱", + "洗衣机", + "微波炉", + "热水器", + "地暖", + "麻将机", + "电梯", + "会议室", + "宴会厅" + ], + "facts": [ + { + "label": "洋房公寓", + "note": "", + "unit": "套", + "value": 40 + }, + { + "label": "独栋别墅", + "note": "", + "unit": "层", + "value": 4 + }, + { + "label": "别墅大床房", + "note": "", + "unit": "间", + "value": 8 + } + ], + "gallery_urls": [ + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-020/02.jpg", + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-020/03.jpg" + ], + "id": "accommodation-020", + "main_image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-020/01.jpg", + "name": "深高速·悠享公寓", + "room_types": [ + "3室2厅1厨2卫1洗衣房", + "独栋别墅大床房" + ], + "sort_order": 19, + "sort_within_type": 20, + "subtype": "酒店式公寓", + "tags": [ + "短租", + "家庭聚会", + "商务活动", + "独栋别墅" + ], + "type": "旅居公寓", + "type_code": "accommodation-apartment", + "type_order": 3, + "unit_count": 40 + }, + "accommodation-021": { + "address_text": "贵州省双龙航空经济区万豪大道旁悠山美墅组团G6组团27栋", + "badge": "康养旅居公寓", + "business_hours": "09:00–22:00", + "category": "旅居公寓", + "collection": "accommodations", + "contact": { + "dial": "08545669118", + "display": "0854-5669118", + "raw": "0854-5669118" + }, + "data_status": "已归类", + "description": "太阳谷自得公寓康养旅居基地坐落于双龙航空港经济区中铁生态城太阳谷中铁大道。距龙洞堡机场6.8公里,距公交车站仅需要4分钟。基地拥有一室一厅、两室一厅两种户型共40间,房间含厨房可自行烹饪。基地设有餐厅、棋牌室、健身区、书画区、音影活动区、健康站,周边旅居生活配套齐全,环境优雅清新,是到贵州旅居的不二之选,给退休后的自己,一份向往的生活。", + "entity_type": "accommodation", + "facilities": [ + "厨房", + "餐厅", + "棋牌室", + "健身区", + "书画区", + "音影活动区", + "健康站" + ], + "facts": [ + { + "label": "距龙洞堡机场", + "note": "", + "unit": "公里", + "value": 6.8 + }, + { + "label": "距公交车站", + "note": "", + "unit": "分钟", + "value": 4 + } + ], + "gallery_urls": [ + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-021/02.jpg" + ], + "id": "accommodation-021", + "main_image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/accommodations/accommodation-021/01.jpg", + "name": "太阳谷自得公寓", + "room_count": 40, + "room_types": [ + "一室一厅", + "两室一厅" + ], + "sort_order": 20, + "sort_within_type": 21, + "subtype": "康养旅居公寓", + "tags": [ + "康养", + "可做饭", + "长住", + "健身", + "书画" + ], + "transport_note": "距龙洞堡机场6.8公里;距公交车站约4分钟", + "type": "旅居公寓", + "type_code": "accommodation-apartment", + "type_order": 3 + }, + "attraction-001": { + "address_text": "厦蓉高速龙里收费站左侧", + "badge": "综合旅游区", + "business_hours": "09:00–22:00", + "category": "综合景区", + "collection": "attractions", + "contact": { + "dial": "08545630880", + "display": "0854-5630880", + "raw": "0854—5630880" + }, + "data_status": "已归类", + "description": "龙里水乡旅游生态城位于厦蓉高速龙里收费站左侧,她以水域为载体、以建筑为特色,是以文化、体育、康养、研学、美食等多种业态融合打造的旅游综合休闲体验项目。", + "entity_type": "attraction", + "facts": [ + ], + "gallery_urls": [ + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-001/02.jpg", + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-001/03.jpg" + ], + "grade": "AAA", + "highlights": [ + "水域景观", + "综合休闲体验", + "文化体育康养多业态" + ], + "id": "attraction-001", + "main_image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-001/01.jpg", + "name": "龙里水乡旅游生态城", + "name_en": "Longli Water Town Tourism Eco-City", + "sort_order": 1, + "sort_within_type": 1, + "subtype": "综合旅游区", + "tags": [ + "水域", + "文化", + "体育", + "康养", + "研学", + "美食", + "亲子" + ], + "type": "综合景区", + "type_code": "attraction-comprehensive", + "type_order": 1 + }, + "attraction-002": { + "address_text": "龙里县城南10公里", + "badge": "草原湿地", + "business_hours": "09:00–22:00", + "category": "自然景观", + "collection": "attractions", + "contact": { + "dial": "08545633699", + "display": "0854-5633699", + "raw": "0854-5633699" + }, + "data_status": "已归类", + "description": "龙里油画大草原景区位于龙里县城南10公里,以湿地花海游览体验为主的山下片区,以登山体验步道为主体的山中片区,以草原游览体验观赏为主的山顶片区,是集休闲娱乐、运动养生、家庭度假、亲子体验观光旅游为一体的山地度假综合体。", + "entity_type": "attraction", + "facts": [ + { + "label": "距龙里县城", + "note": "", + "unit": "公里", + "value": 10 + } + ], + "gallery_urls": [ + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-002/02.jpg", + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-002/03.jpg", + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-002/04.jpg" + ], + "grade": "AAAA", + "highlights": [ + "山下湿地花海", + "山中登山步道", + "山顶草原观景" + ], + "id": "attraction-002", + "main_image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-002/01.jpg", + "name": "龙里油画大草原景区", + "name_en": "Longli Oil Painting Prairie", + "sort_order": 4, + "sort_within_type": 2, + "subtype": "草原湿地", + "tags": [ + "湿地花海", + "登山步道", + "草原", + "运动养生", + "家庭度假", + "亲子" + ], + "type": "自然景观", + "type_code": "attraction-natural", + "type_order": 2 + }, + "attraction-003": { + "address_text": "龙里县双龙镇·巫山峡谷旅游景区", + "badge": "峡谷度假区", + "business_hours": "09:00–22:00", + "category": "综合景区", + "collection": "attractions", + "contact": { + "dial": "085185588618", + "display": "0851-85588618", + "raw": "0851–85588618" + }, + "data_status": "已归类", + "description": "双龙镇·巫山峡谷旅游景区是以峡谷风光为主,包含双龙镇旅游休闲度假区及巫山峡谷旅游体验区,是集购物、康体、养生、娱乐、餐饮、客栈等多元业态体验为一体的综合式休闲度假中心。", + "entity_type": "attraction", + "facts": [ + ], + "gallery_urls": [ + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-003/02.jpg", + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-003/03.jpg", + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-003/04.jpg" + ], + "grade": "AAAA", + "highlights": [ + "巫山峡谷风光", + "双龙镇休闲度假", + "多业态综合体验" + ], + "id": "attraction-003", + "main_image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-003/01.jpg", + "name": "双龙镇·巫山峡谷", + "name_en": "Shuanglong Town · Wushan Valley", + "sort_order": 2, + "sort_within_type": 3, + "subtype": "峡谷度假区", + "tags": [ + "峡谷", + "文旅小镇", + "购物", + "康体", + "养生", + "娱乐", + "餐饮", + "客栈" + ], + "type": "综合景区", + "type_code": "attraction-comprehensive", + "type_order": 1 + }, + "attraction-004": { + "address_text": "距龙里县城1.5公里", + "badge": "森林公园", + "business_hours": "09:00–22:00", + "category": "自然景观", + "collection": "attractions", + "contact": { + "dial": "15085980170", + "display": "150-8598-0170", + "raw": "150-8598-0170" + }, + "data_status": "已归类", + "description": "龙架山国家森林公园是国家3A级旅游景区,距离龙里县城1.5公里,总规划面积6100.9公顷。公园依山傍水、环境优美,整个园区森林壮阔、林海苍翠、四季如画,春看花、夏感风、秋看叶、冬观雪,素有“省会贵阳市的后花园”的美誉。", + "entity_type": "attraction", + "facts": [ + { + "label": "距龙里县城", + "note": "", + "unit": "公里", + "value": 1.5 + }, + { + "label": "总规划面积", + "note": "", + "unit": "公顷", + "value": 6100.9 + } + ], + "gallery_urls": [ + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-004/02.jpg", + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-004/03.jpg", + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-004/04.jpg" + ], + "grade": "AAA", + "highlights": [ + "四季森林景观", + "依山傍水", + "贵阳市后花园" + ], + "id": "attraction-004", + "main_image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-004/01.jpg", + "name": "龙架山国家森林公园", + "name_en": "Longjia Mountain National Forest Park", + "sort_order": 5, + "sort_within_type": 4, + "subtype": "森林公园", + "tags": [ + "森林", + "登山", + "四季景观", + "生态" + ], + "type": "自然景观", + "type_code": "attraction-natural", + "type_order": 2 + }, + "attraction-005": { + "address_text": "龙里河大桥", + "badge": "桥梁观光", + "business_hours": "09:00–22:00", + "category": "地标观光", + "collection": "attractions", + "contact": { + "dial": "08547010666", + "display": "0854-7010666", + "raw": "0854-7010666" + }, + "data_status": "已归类", + "description": "全长1260米,为主跨528米的双塔双索面叠合梁斜拉桥,桥塔高265米、245米,桥面距谷底280米,是世界首座高山峡谷景观斜拉桥。桥面宽28米,双向四车道,设玻璃步道与人行道。大桥配备观光电梯、360°景观平台、528米玻璃步道,打造立体观光体验;还设有蹦极、攀岩、七彩滑道、火车咖啡馆、亲子迷宫等业态,集观景、休闲、极限运动于一体,可尽览朵花大峡谷与龙里大草原美景。", + "entity_type": "attraction", + "facts": [ + { + "label": "桥梁全长", + "note": "", + "unit": "米", + "value": 1260 + }, + { + "label": "主跨", + "note": "", + "unit": "米", + "value": 528 + }, + { + "label": "桥塔高度", + "note": "", + "unit": "米", + "value": [ + 265, + 245 + ] + }, + { + "label": "桥面距谷底", + "note": "", + "unit": "米", + "value": 280 + }, + { + "label": "桥面宽", + "note": "", + "unit": "米", + "value": 28 + }, + { + "label": "车道", + "note": "", + "unit": "车道", + "value": 4 + }, + { + "label": "玻璃步道长度", + "note": "", + "unit": "米", + "value": 528 + } + ], + "gallery_urls": [ + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-005/02.jpg" + ], + "highlights": [ + "高山峡谷斜拉桥", + "360°景观平台", + "528米玻璃步道", + "极限运动项目" + ], + "id": "attraction-005", + "main_image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-005/01.jpg", + "name": "龙里河大桥", + "name_en": "Longli River Bridge", + "sort_order": 16, + "sort_within_type": 5, + "subtype": "桥梁观光", + "tags": [ + "高山峡谷", + "玻璃步道", + "观光平台", + "蹦极", + "攀岩", + "极限运动", + "亲子" + ], + "type": "地标观光", + "type_code": "attraction-landmark", + "type_order": 5 + }, + "attraction-006": { + "address_text": "贵州省黔南州龙里县龙山镇贵龙纵线比孟村鸡场堡组云从朵花温泉酒店", + "badge": "温泉度假", + "business_hours": "09:00–22:00", + "category": "综合景区", + "collection": "attractions", + "contact": { + "dial": "085188515333", + "display": "0851-88515333", + "raw": "0851-88515333" + }, + "data_status": "已归类", + "description": "云从朵花是龙里首个综合性温泉度假酒店,获评国家3A级景区、贵州金汤级温泉度假地。酒店占地200亩,配有99间主楼客房、25栋野奢客房及48个特色汤池,集康养、休闲、商务于一体。温泉为天然矿热泉,出水温度71℃,富含氟、偏硅酸、锶等20余种微量元素,三项核心指标均超国家医疗标准,被誉为“蓝宝石”氟泉与“美人泉”偏硅酸泉,康养理疗效果极佳。酒店配套完善,野奢客房带私汤,依山揽景,是高端温泉度假优选。", + "entity_type": "attraction", + "facts": [ + { + "label": "占地面积", + "note": "", + "unit": "亩", + "value": 200 + }, + { + "label": "主楼客房", + "note": "", + "unit": "间", + "value": 99 + }, + { + "label": "野奢客房", + "note": "", + "unit": "栋", + "value": 25 + }, + { + "label": "特色汤池", + "note": "", + "unit": "个", + "value": 48 + }, + { + "label": "温泉出水温度", + "note": "", + "unit": "℃", + "value": 71 + }, + { + "label": "微量元素", + "note": "", + "unit": "余种", + "value": 20 + } + ], + "gallery_urls": [ + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-006/02.jpg", + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-006/03.jpg", + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-006/04.jpg" + ], + "grade": "AAA", + "highlights": [ + "天然矿热泉", + "野奢客房私汤", + "48个特色汤池", + "山地温泉康养" + ], + "id": "attraction-006", + "main_image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-006/01.jpg", + "name": "云从朵花温泉度假中心", + "name_en": "Yuncong Duohua Hot Spring Resort Center", + "sort_order": 3, + "sort_within_type": 6, + "subtype": "温泉度假", + "tags": [ + "温泉", + "康养", + "度假酒店", + "私汤", + "商务" + ], + "type": "综合景区", + "type_code": "attraction-comprehensive", + "type_order": 1 + }, + "attraction-007": { + "address_text": "贵州省黔南布依族苗族自治州龙里县龙山镇龙里大草原", + "badge": "高山草原", + "business_hours": "09:00–22:00", + "category": "自然景观", + "collection": "attractions", + "contact": { + "dial": "08548822759", + "display": "0854-8822759", + "raw": "0854-8822759" + }, + "data_status": "已归类", + "description": "龙里大草原属独特的高山台地草原,位于龙里县龙山镇。该景区气温常年在20℃左右,被誉为天然空调、绿色氧吧,是贵州东线和南线旅游的第一站。", + "entity_type": "attraction", + "facts": [ + { + "label": "常年气温", + "note": "约", + "unit": "℃", + "value": 20 + } + ], + "gallery_urls": [ + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-007/02.jpg", + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-007/03.jpg" + ], + "grade": "AAA", + "highlights": [ + "高山台地草原", + "常年约20℃", + "天然空调与绿色氧吧" + ], + "id": "attraction-007", + "main_image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-007/01.jpg", + "name": "龙里大草原", + "name_en": "Longli Prairie", + "sort_order": 6, + "sort_within_type": 7, + "subtype": "高山草原", + "tags": [ + "高山台地", + "草原", + "避暑", + "露营", + "生态" + ], + "type": "自然景观", + "type_code": "attraction-natural", + "type_order": 2 + }, + "attraction-008": { + "address_text": "贵州省黔南布依族苗族自治州龙里县谷脚镇茶香村", + "badge": "农业观光", + "business_hours": "09:00–22:00", + "category": "乡村文旅", + "collection": "attractions", + "contact": { + "dial": "08545662108", + "display": "0854-5662108", + "raw": "0854—5662108" + }, + "data_status": "已归类", + "description": "十里刺梨沟景区位于谷脚镇茶香村,以十里连片“维C之王”刺梨种植而得名,获“中国山地自行车最美赛道”称号。", + "entity_type": "attraction", + "facts": [ + ], + "gallery_urls": [ + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-008/02.jpg", + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-008/03.jpg", + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-008/04.jpg" + ], + "grade": "AAA", + "highlights": [ + "连片刺梨种植", + "山地自行车赛道", + "乡村观光" + ], + "id": "attraction-008", + "main_image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-008/01.jpg", + "name": "十里刺梨沟景区", + "name_en": "Shili Ciligou Scenic Area", + "sort_order": 12, + "sort_within_type": 8, + "subtype": "农业观光", + "tags": [ + "刺梨", + "山地自行车", + "乡村", + "花果观光" + ], + "type": "乡村文旅", + "type_code": "attraction-rural-culture", + "type_order": 3 + }, + "attraction-009": { + "address_text": "龙里县贾托山风景区", + "badge": "山岳观景", + "business_hours": "09:00–22:00", + "category": "自然景观", + "collection": "attractions", + "contact": { + "dial": "13639080804", + "display": "136-3908-0804", + "raw": "136-3908-0804" + }, + "data_status": "已归类", + "description": "贾托山景区海拔1775米,是龙里境内最高的山峰,在山顶上能看见龙里、贵定、都匀、贵阳等县市的风景,以梯田景观、康养度假为主,是一个非常值得一去的户外旅游观景台。", + "entity_type": "attraction", + "facts": [ + { + "label": "海拔", + "note": "", + "unit": "米", + "value": 1775 + } + ], + "gallery_urls": [ + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-009/02.jpg", + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-009/03.jpg" + ], + "grade": "AAA", + "highlights": [ + "龙里境内最高峰", + "梯田景观", + "多县市远眺", + "户外观景台" + ], + "id": "attraction-009", + "main_image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-009/01.jpg", + "name": "贾托山风景区", + "name_en": "Jiatuo Mountain Scenic Area", + "sort_order": 7, + "sort_within_type": 9, + "subtype": "山岳观景", + "tags": [ + "高山", + "梯田", + "观景台", + "康养", + "户外" + ], + "type": "自然景观", + "type_code": "attraction-natural", + "type_order": 2 + }, + "attraction-010": { + "address_text": "贵州省黔南布依族苗族自治州龙里县湾滩河镇孔雀寨", + "badge": "民族村寨", + "business_hours": "09:00–22:00", + "category": "乡村文旅", + "collection": "attractions", + "contact": { + "dial": "08545712001", + "display": "0854-5712001", + "raw": "0854—5712001" + }, + "data_status": "已归类", + "description": "孔雀寨景区位于湾滩河镇中部区域,距龙里县城49公里,全寨依山傍水,风景优美,地势开阔,清澈的湾滩河从寨前蜿蜒而过,是一个历史悠久、文化底蕴深厚、民风淳朴、民族风情浓郁的布依族村寨。", + "entity_type": "attraction", + "facts": [ + { + "label": "距龙里县城", + "note": "", + "unit": "公里", + "value": 49 + } + ], + "gallery_urls": [ + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-010/02.jpg", + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-010/03.jpg" + ], + "grade": "AAA", + "highlights": [ + "布依族传统村寨", + "湾滩河沿岸", + "民族文化体验" + ], + "id": "attraction-010", + "main_image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-010/01.jpg", + "name": "孔雀寨景区", + "name_en": "Peacock Village Scenic Area", + "sort_order": 13, + "sort_within_type": 10, + "subtype": "民族村寨", + "tags": [ + "布依族", + "村寨", + "湾滩河", + "民族风情", + "人文" + ], + "type": "乡村文旅", + "type_code": "attraction-rural-culture", + "type_order": 3 + }, + "attraction-011": { + "address_text": "厦蓉高速龙里收费站右侧", + "badge": "湿地公园", + "business_hours": "09:00–22:00", + "category": "自然景观", + "collection": "attractions", + "contact": { + "dial": "08545633329", + "display": "0854-5633329", + "raw": "0854-5633329" + }, + "data_status": "已归类", + "description": "龙里莲花湿地公园位于厦蓉高速龙里收费站右侧,她“湖光山色、江山如画”,公园依托朵花河沿河自然山水、田园风光,巧妙布局喷泉、石雕、步道,漫步园内,小桥流水、泉湖照影、鸟语花香,令人赏心悦目。", + "entity_type": "attraction", + "facts": [ + ], + "gallery_urls": [ + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-011/02.jpg", + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-011/03.jpg" + ], + "highlights": [ + "朵花河自然山水", + "田园湿地", + "喷泉石雕步道" + ], + "id": "attraction-011", + "main_image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-011/01.jpg", + "name": "莲花湿地公园", + "name_en": "Lotus Wetland Park", + "sort_order": 8, + "sort_within_type": 11, + "subtype": "湿地公园", + "tags": [ + "湿地", + "朵花河", + "田园", + "喷泉", + "步道" + ], + "type": "自然景观", + "type_code": "attraction-natural", + "type_order": 2 + }, + "attraction-012": { + "address_text": "贵州省黔南布依族苗族自治州龙里县龙门镇", + "badge": "主题小镇", + "business_hours": "09:00–22:00", + "category": "主题小镇", + "collection": "attractions", + "contact": { + "dial": "18985764435", + "display": "189-8576-4435", + "raw": "189-8576-4435" + }, + "data_status": "已归类", + "description": "龙门镇是贵州第一个以“武侠文化”为主题定位的小镇,独特的文化定位,不仅有利于丰富贵州的旅游文化主题,提供更独特的旅游体验,也有助于促进民间武术、养生文化的切磋与发扬,更能为贵州增添一张“侠文化”旅游名片。", + "entity_type": "attraction", + "facts": [ + ], + "gallery_urls": [ + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-012/02.jpg", + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-012/03.jpg", + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-012/04.jpg" + ], + "highlights": [ + "武侠文化主题", + "民间武术", + "养生文化" + ], + "id": "attraction-012", + "main_image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-012/01.jpg", + "name": "龙门镇", + "name_en": "Longmen Town", + "sort_order": 15, + "sort_within_type": 12, + "subtype": "主题小镇", + "tags": [ + "武侠文化", + "小镇", + "民间武术", + "养生文化" + ], + "type": "主题小镇", + "type_code": "attraction-themed-town", + "type_order": 4 + }, + "attraction-013": { + "address_text": "贵州省黔南布依族苗族自治州龙里县赶场村", + "badge": "民俗美食村", + "business_hours": "09:00–22:00", + "category": "乡村文旅", + "collection": "attractions", + "contact": { + "dial": "13984383678", + "display": "139-8438-3678", + "raw": "139-8438-3678" + }, + "data_status": "已归类", + "description": "赶场村定位为“贵州民俗文化好吃村”,其秉承“传承工匠精神,做好乡村美食”的宗旨,集合了贵州特色名小吃、特色美食、现场制作的优质土特产、少数民族文化演艺、非遗文化体验,以及400余间精品民宿客栈等,让游客在赶场村能“一村吃遍贵州,一村带走贵州”,体验“美食的世界,歌舞的海洋”。", + "entity_type": "attraction", + "facts": [ + { + "label": "精品民宿客栈", + "note": "", + "unit": "余间", + "value": 400 + } + ], + "gallery_urls": [ + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-013/02.jpg", + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-013/03.jpg", + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-013/04.jpg" + ], + "highlights": [ + "贵州民俗文化好吃村", + "非遗文化体验", + "少数民族演艺", + "精品民宿集群" + ], + "id": "attraction-013", + "main_image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-013/01.jpg", + "name": "赶场村", + "name_en": "Market Village", + "sort_order": 14, + "sort_within_type": 13, + "subtype": "民俗美食村", + "tags": [ + "贵州小吃", + "土特产", + "少数民族演艺", + "非遗", + "民宿" + ], + "type": "乡村文旅", + "type_code": "attraction-rural-culture", + "type_order": 3 + }, + "attraction-014": { + "address_text": "贵州省黔南布依族苗族自治州龙里县醒狮镇大岩村小岩组", + "badge": "花海观光", + "business_hours": "09:00–22:00", + "category": "自然景观", + "collection": "attractions", + "contact": { + "dial": "13985788408", + "display": "139-8578-8408", + "raw": "139-8578-8408" + }, + "data_status": "已归类", + "description": "龙湖花海生态观光园位于素有“根雕艺术之乡”美誉的龙里县醒狮镇大岩村小岩组,毗邻贵阳渔洞峡水库,与贵阳市永乐乡、东风镇、偏坡乡相接壤。距镇政府所在地4公里,距离省城贵阳市约20公里,平均海拔1150米。", + "entity_type": "attraction", + "facts": [ + { + "label": "距镇政府", + "note": "", + "unit": "公里", + "value": 4 + }, + { + "label": "距贵阳市", + "note": "约", + "unit": "公里", + "value": 20 + }, + { + "label": "平均海拔", + "note": "", + "unit": "米", + "value": 1150 + } + ], + "gallery_urls": [ + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-014/02.jpg" + ], + "highlights": [ + "花海生态观光", + "毗邻渔洞峡水库", + "根雕艺术之乡" + ], + "id": "attraction-014", + "main_image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-014/01.jpg", + "name": "龙湖花海", + "name_en": "Dragon Lake Flower Sea", + "sort_order": 9, + "sort_within_type": 14, + "subtype": "花海观光", + "tags": [ + "花海", + "生态观光", + "根雕艺术", + "水库", + "乡村" + ], + "type": "自然景观", + "type_code": "attraction-natural", + "type_order": 2 + }, + "attraction-015": { + "address_text": "龙里县城西南约3公里的莲花村", + "badge": "花海休闲", + "business_hours": "09:00–22:00", + "category": "自然景观", + "collection": "attractions", + "contact": { + "dial": "15934724198", + "display": "159-3472-4198", + "raw": "159-3472-4198" + }, + "data_status": "已归类", + "description": "莲花社区四季花海坐落于龙里县城西南约3公里的莲花村,景区以四季花卉观赏为核心,常年种植马鞭花、格桑花、三角梅等花卉,形成连绵的花海景观。园内配套设施丰富,设有29项无动力儿童游乐设施、露营基地及河滩烧烤区。游客可参与溯溪、垂钓等自然体验活动,节庆期间还能欣赏山歌对唱、加入篝火晚会等民俗项目。餐饮方面提供烤全羊、柴火鸡、龙里肉饼鸡等地方特色美食。", + "entity_type": "attraction", + "facts": [ + { + "label": "距龙里县城", + "note": "约,县城西南", + "unit": "公里", + "value": 3 + }, + { + "label": "无动力儿童游乐设施", + "note": "", + "unit": "项", + "value": 29 + } + ], + "gallery_urls": [ + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-015/02.jpg", + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-015/03.jpg" + ], + "highlights": [ + "四季花卉观赏", + "29项无动力儿童设施", + "露营与河滩烧烤", + "节庆民俗活动" + ], + "id": "attraction-015", + "main_image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-015/01.jpg", + "name": "莲花四季花海", + "name_en": "Lotus Four Seasons Sea of Flowers", + "sort_order": 10, + "sort_within_type": 15, + "subtype": "花海休闲", + "tags": [ + "花海", + "亲子", + "露营", + "烧烤", + "溯溪", + "垂钓", + "民俗" + ], + "type": "自然景观", + "type_code": "attraction-natural", + "type_order": 2 + }, + "attraction-016": { + "address_text": "贵州省黔南布依族苗族自治州龙里县龙里草原景区西侧200米", + "badge": "花海露营", + "business_hours": "09:00–22:00", + "category": "自然景观", + "collection": "attractions", + "contact": { + "dial": "13984899898", + "display": "139-8489-9898", + "raw": "139-8489-9898" + }, + "data_status": "已归类", + "description": "龙里姊妹湖花海位于贵州省黔南布依族苗族自治州龙里县龙里草原景区西侧200米,姊妹湖拥有浪漫的紫色花海和观赏日落的绝妙视角,吸引了许多户外爱好者过来游览和露营扎寨,在花的海洋里肆意奔跑、在自己临时搭建的小天地里晒太阳、玩桌游、搞烧烤,与朋友享受惬意时光,尽情享受姊妹湖花海带来的假日美好。", + "entity_type": "attraction", + "facts": [ + { + "label": "距龙里草原景区", + "note": "景区西侧", + "unit": "米", + "value": 200 + } + ], + "gallery_urls": [ + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-016/02.jpg" + ], + "highlights": [ + "紫色花海", + "日落观赏", + "露营烧烤" + ], + "id": "attraction-016", + "main_image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-016/01.jpg", + "name": "姊妹湖花海", + "name_en": "Sister Lake Flower Sea", + "sort_order": 11, + "sort_within_type": 16, + "subtype": "花海露营", + "tags": [ + "紫色花海", + "日落", + "露营", + "烧烤", + "户外" + ], + "type": "自然景观", + "type_code": "attraction-natural", + "type_order": 2 + }, + "attraction-subproject-001": { + "address_text": "厦蓉高速龙里收费站左侧龙里水乡旅游生态城内", + "badge": "森林探险", + "business_hours": "09:00–22:00", + "category": "游乐体验", + "collection": "attraction_subprojects", + "contact": { + "dial": "13885061295", + "display": "138-8506-1295", + "raw": "138-8506-1295" + }, + "data_status": "已归类", + "description": "建成的“飞越丛林”森林体育探险项目,是目前西南地区最大、设施最齐全的森林探险公园,“绿、蓝、橙、红、黑”五条树上线路囊括穿梭林间无限乐趣,适宜亲子、家庭、情侣、朋友全年龄人群畅玩体验,别具一格的“儿童蛛网”同孩子一起分享绝对安全的树上快乐时光。", + "entity_type": "attraction_subproject", + "facts": [ + ], + "gallery_urls": [ + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attraction_subprojects/attraction-subproject-001/02.jpg", + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attraction_subprojects/attraction-subproject-001/03.jpg" + ], + "highlights": [ + "五条树上线路", + "儿童蛛网", + "全年龄森林探险" + ], + "id": "attraction-subproject-001", + "main_image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attraction_subprojects/attraction-subproject-001/01.jpg", + "name": "飞越丛林", + "name_en": "Leaping over the Jungle", + "parent_id": "attraction-001", + "parent_name": "龙里水乡旅游生态城", + "sort_order": 1, + "sort_within_type": 1, + "subtype": "森林探险", + "tags": [ + "森林探险", + "树上线路", + "亲子", + "户外运动" + ], + "type": "游乐体验", + "type_code": "subproject-recreation", + "type_order": 1 + }, + "attraction-subproject-002": { + "address_text": "厦蓉高速龙里收费站左侧龙里水乡旅游生态城内", + "badge": "实景演艺", + "business_hours": "09:00–22:00", + "category": "演艺体验", + "collection": "attraction_subprojects", + "contact": { + "dial": "18685579499", + "display": "186-8557-9499", + "raw": "186-8557-9499" + }, + "data_status": "已归类", + "description": "《龙乡水里·贵秀》是龙里水乡旅游生态城打造的一场大型原创室内实景演艺秀。从生命起源、历史变迁、民风民俗、歌舞文化传承等极具贵州代表性的文化符号,以出其不意的艺术呈现方式注入:“序《文明曙光》、《山水传奇》、《奢香夫人》、《铁血忠魂》、《云顶霓裳》、《盛世贵州》”六幕场景,为你揭开夜郎故土的神秘面纱,领略贵黔大地波澜壮阔而又瑰丽多姿的山水与人文传奇。", + "entity_type": "attraction_subproject", + "facts": [ + ], + "gallery_urls": [ + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attraction_subprojects/attraction-subproject-002/02.jpg" + ], + "highlights": [ + "大型原创室内实景演艺", + "六幕贵州文化场景", + "民族歌舞" + ], + "id": "attraction-subproject-002", + "main_image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attraction_subprojects/attraction-subproject-002/01.jpg", + "name": "龙乡水里·贵秀", + "name_en": "Long Xiang Shuili Gui Show", + "parent_id": "attraction-001", + "parent_name": "龙里水乡旅游生态城", + "sort_order": 2, + "sort_within_type": 2, + "subtype": "实景演艺", + "tags": [ + "室内实景演艺", + "贵州文化", + "民俗", + "歌舞" + ], + "type": "演艺体验", + "type_code": "subproject-performance", + "type_order": 2 + }, + "food-001": { + "address_text": "", + "badge": "鸡类主菜", + "business_hours": "09:00–22:00", + "category": "特色菜肴", + "collection": "foods", + "contact": null, + "cooking_methods": [ + "慢火炖煮" + ], + "data_status": "已归类", + "description": "作为“舌尖上的非物质文化遗产”的肉饼鸡需用鲜香的鸡汤为底,选用五六月大的土鸡,慢火炖煮。除了炖鸡和肉饼带来属于肉类的鲜美,肉饼鸡的鲜还出于另一类食材——野生菌,根据不同的季节,所选用的野生菌也不同。这样的美味代表着龙里人民就地取材的美食智慧。", + "entity_type": "food", + "flavor": "鲜美", + "gallery_urls": [ + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-001/02.jpg", + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-001/03.jpg" + ], + "id": "food-001", + "ingredients": [ + "土鸡", + "肉饼", + "野生菌" + ], + "main_image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-001/01.jpg", + "name": "野生菌肉饼鸡", + "nutrition_facts": [ + ], + "origin_location": "龙里县", + "sort_order": 1, + "sort_within_type": 1, + "source_claim": "舌尖上的非物质文化遗产(源PDF原文表述)", + "subtype": "鸡类主菜", + "tags": [ + "鸡类主菜", + "土鸡", + "肉饼", + "野生菌" + ], + "type": "特色菜肴", + "type_code": "food-featured-dish", + "type_order": 1 + }, + "food-002": { + "address_text": "", + "badge": "鸡类主菜", + "business_hours": "09:00–22:00", + "category": "特色菜肴", + "collection": "foods", + "contact": null, + "cooking_methods": [ + "调味烹制" + ], + "data_status": "已归类", + "description": "龙里辣子鸡选用农家天然优质放养三黄鸡,配以辣椒、姜、葱等佐料调配而成,属纯天然食品,色、香、味俱全,肉质嫩脆、香辣可口,吃一次就会爱上!", + "entity_type": "food", + "flavor": "香辣、嫩脆", + "gallery_urls": [ + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-002/02.jpg", + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-002/03.jpg" + ], + "id": "food-002", + "ingredients": [ + "放养三黄鸡", + "辣椒", + "姜", + "葱" + ], + "main_image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-002/01.jpg", + "name": "龙里辣子鸡", + "nutrition_facts": [ + ], + "origin_location": "龙里县", + "sort_order": 2, + "sort_within_type": 2, + "subtype": "鸡类主菜", + "tags": [ + "鸡类主菜", + "放养三黄鸡", + "辣椒", + "姜", + "葱" + ], + "type": "特色菜肴", + "type_code": "food-featured-dish", + "type_order": 1 + }, + "food-003": { + "address_text": "", + "badge": "烧烤", + "business_hours": "09:00–22:00", + "category": "烧烤", + "collection": "foods", + "contact": null, + "cooking_methods": [ + "味料汤浸泡", + "炭火烤制", + "刷蜂蜜" + ], + "data_status": "已归类", + "description": "烤香猪选用上好鲜嫩的小香猪为原料,在特制的味料汤中稍做浸泡,然后放炭火上烤,边烤边上蜂蜜,烤熟后颜色金黄鲜红,即可食用。", + "entity_type": "food", + "flavor": "金黄鲜香", + "gallery_urls": [ + ], + "id": "food-003", + "ingredients": [ + "小香猪", + "蜂蜜" + ], + "main_image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-003/01.jpg", + "name": "特色烤香猪", + "nutrition_facts": [ + ], + "origin_location": "龙里县", + "sort_order": 15, + "sort_within_type": 3, + "subtype": "烧烤", + "tags": [ + "烧烤", + "小香猪", + "蜂蜜" + ], + "type": "烧烤", + "type_code": "food-barbecue", + "type_order": 4 + }, + "food-004": { + "address_text": "", + "badge": "鸡类主菜", + "business_hours": "09:00–22:00", + "category": "特色菜肴", + "collection": "foods", + "contact": null, + "cooking_methods": [ + "柴火或碳火猛火爆炒", + "炭火微炖" + ], + "data_status": "已归类", + "description": "柴火鸡制作过程使用柴火或碳火,经过猛火爆炒后,再用炭火微炖而成。用的食材原生态、接地气,开锅色泽红亮、油润,味辣鲜香,鸡肉糯而不柴,肥而不腻,柔香滋润,素菜入味。", + "entity_type": "food", + "flavor": "味辣鲜香、糯而不柴", + "gallery_urls": [ + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-004/02.jpg" + ], + "id": "food-004", + "ingredients": [ + "鸡肉", + "配菜" + ], + "main_image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-004/01.jpg", + "name": "柴火鸡", + "nutrition_facts": [ + ], + "origin_location": "龙里县", + "sort_order": 3, + "sort_within_type": 4, + "subtype": "鸡类主菜", + "tags": [ + "鸡类主菜", + "鸡肉", + "配菜" + ], + "type": "特色菜肴", + "type_code": "food-featured-dish", + "type_order": 1 + }, + "food-005": { + "address_text": "", + "badge": "地方小吃", + "business_hours": "09:00–22:00", + "category": "地方小吃", + "collection": "foods", + "contact": null, + "cooking_methods": [ + "豆腐制圆", + "回锅油炸" + ], + "data_status": "已归类", + "description": "“托于手中晃动而不松散,置于汤中久煮而不沉碎。”这是贵州食客对醒狮豆腐圆子至高的美誉。豆腐圆子是根据醒狮镇当地特种的优质黄豆打磨的豆腐制作而成,回锅油炸后味道外酥里嫩,加上地方特色辣椒拌折耳根更让人回味悠长。", + "entity_type": "food", + "flavor": "外酥里嫩", + "gallery_urls": [ + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-005/02.jpg" + ], + "id": "food-005", + "ingredients": [ + "醒狮镇黄豆", + "豆腐", + "辣椒", + "折耳根" + ], + "main_image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-005/01.jpg", + "name": "醒狮豆腐圆子", + "nutrition_facts": [ + ], + "origin_location": "龙里县", + "sort_order": 17, + "sort_within_type": 5, + "subtype": "地方小吃", + "tags": [ + "地方小吃", + "醒狮镇黄豆", + "豆腐", + "辣椒", + "折耳根" + ], + "type": "地方小吃", + "type_code": "food-local-snack", + "type_order": 5 + }, + "food-006": { + "address_text": "", + "badge": "火锅", + "business_hours": "09:00–22:00", + "category": "火锅汤锅", + "collection": "foods", + "contact": null, + "cooking_methods": [ + "酸汤涮烫" + ], + "data_status": "已归类", + "description": "拥有墨黑色光泽且纹路清晰的毛肚,在秘制红酸汤里烫好后口感脆嫩,配上酸汤鲜艳的色泽和浓郁的香气,让人垂涎欲滴!", + "entity_type": "food", + "flavor": "酸香、脆嫩", + "gallery_urls": [ + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-006/02.jpg" + ], + "id": "food-006", + "ingredients": [ + "毛肚", + "红酸汤" + ], + "main_image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-006/01.jpg", + "name": "酸汤毛肚火锅", + "nutrition_facts": [ + ], + "origin_location": "龙里县", + "sort_order": 8, + "sort_within_type": 6, + "subtype": "火锅", + "tags": [ + "火锅", + "毛肚", + "红酸汤" + ], + "type": "火锅汤锅", + "type_code": "food-hotpot", + "type_order": 2 + }, + "food-007": { + "address_text": "", + "badge": "鱼类主菜", + "business_hours": "09:00–22:00", + "category": "特色菜肴", + "collection": "foods", + "contact": null, + "cooking_methods": [ + "布依秘制酸汤烹饪" + ], + "data_status": "已归类", + "description": "优渥自然环境中缓慢生长、吃稻花长大的稻花鱼,营养含量高,肉质鲜嫩,特别是蛋白质含量是普通鱼的3-5倍,稻田里鲜活捕捉的稻花鱼,经布依人秘制的酸汤烹饪出来,汤鲜味美,令人垂涎。", + "entity_type": "food", + "flavor": "汤鲜、肉嫩", + "gallery_urls": [ + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-007/02.jpg", + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-007/03.jpg", + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-007/04.jpg" + ], + "id": "food-007", + "ingredients": [ + "稻花鱼", + "酸汤" + ], + "main_image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-007/01.jpg", + "name": "湾滩河稻花鱼", + "nutrition_facts": [ + { + "label": "蛋白质含量", + "note": "源PDF表述,未独立核验", + "unit": "", + "value": "普通鱼的3-5倍" + } + ], + "origin_location": "龙里县", + "sort_order": 4, + "sort_within_type": 7, + "subtype": "鱼类主菜", + "tags": [ + "鱼类主菜", + "稻花鱼", + "酸汤" + ], + "type": "特色菜肴", + "type_code": "food-featured-dish", + "type_order": 1 + }, + "food-008": { + "address_text": "", + "badge": "腌腊菜", + "business_hours": "09:00–22:00", + "category": "特色菜肴", + "collection": "foods", + "contact": null, + "cooking_methods": [ + "水煮", + "烹炒" + ], + "data_status": "已归类", + "description": "腊肉经过水煮,肥肉油亮,瘦肉酥香,令人垂涎欲滴。用这样的人间美味,搭配本土的折耳根,只需简单烹炒,便可出锅,诱人的肉质与浓郁的香味,会令所有的味蕾躁动起来。", + "entity_type": "food", + "flavor": "肥亮、酥香", + "gallery_urls": [ + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-008/02.jpg" + ], + "id": "food-008", + "ingredients": [ + "腊肉", + "折耳根" + ], + "main_image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-008/01.jpg", + "name": "农家腊肉", + "nutrition_facts": [ + ], + "origin_location": "龙里县", + "sort_order": 5, + "sort_within_type": 8, + "subtype": "腌腊菜", + "tags": [ + "腌腊菜", + "腊肉", + "折耳根" + ], + "type": "特色菜肴", + "type_code": "food-featured-dish", + "type_order": 1 + }, + "food-009": { + "address_text": "", + "badge": "烧烤", + "business_hours": "09:00–22:00", + "category": "烧烤", + "collection": "foods", + "contact": null, + "cooking_methods": [ + "烤制" + ], + "data_status": "已归类", + "description": "烤全羊外表金黄油亮,外皮焦黄发脆,肉质绵软鲜嫩,羊肉味清香扑鼻、香浓嫩滑、齿颊留香。", + "entity_type": "food", + "flavor": "外脆里嫩、香浓", + "gallery_urls": [ + ], + "id": "food-009", + "ingredients": [ + "羊肉" + ], + "main_image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-009/01.jpg", + "name": "烤全羊", + "nutrition_facts": [ + ], + "origin_location": "龙里县", + "sort_order": 16, + "sort_within_type": 9, + "subtype": "烧烤", + "tags": [ + "烧烤", + "羊肉" + ], + "type": "烧烤", + "type_code": "food-barbecue", + "type_order": 4 + }, + "food-010": { + "address_text": "", + "badge": "干锅", + "business_hours": "09:00–22:00", + "category": "特色菜肴", + "collection": "foods", + "contact": null, + "cooking_methods": [ + "干锅烹制" + ], + "data_status": "已归类", + "description": "马肉营养堪称丰富,每100克中,约含蛋白质19.6克,脂肪0.8克,含铁量比猪肉高5-6倍,比牛羊肉高3-4倍。长期食用马肉,还可防治动脉硬化和高血压等,有益于人体健康。", + "entity_type": "food", + "flavor": "香辣", + "gallery_urls": [ + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-010/02.jpg" + ], + "id": "food-010", + "ingredients": [ + "马肉" + ], + "main_image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-010/01.jpg", + "name": "干锅马肉", + "nutrition_facts": [ + { + "label": "蛋白质", + "note": "约,源PDF表述", + "unit": "克/100克", + "value": 19.6 + }, + { + "label": "脂肪", + "note": "源PDF表述", + "unit": "克/100克", + "value": 0.8 + }, + { + "label": "含铁量", + "note": "源PDF表述,未独立核验", + "unit": "", + "value": "猪肉的5-6倍;牛羊肉的3-4倍" + } + ], + "origin_location": "龙里县", + "sort_order": 6, + "sort_within_type": 10, + "subtype": "干锅", + "tags": [ + "干锅", + "马肉" + ], + "type": "特色菜肴", + "type_code": "food-featured-dish", + "type_order": 1 + }, + "food-011": { + "address_text": "", + "badge": "火锅", + "business_hours": "09:00–22:00", + "category": "火锅汤锅", + "collection": "foods", + "contact": null, + "cooking_methods": [ + "火锅" + ], + "data_status": "已归类", + "description": "一碗羊脚火锅,别样的香辣滋味,让你流连忘返。", + "entity_type": "food", + "flavor": "香辣", + "gallery_urls": [ + "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-011/02.jpg" + ], + "id": "food-011", + "ingredients": [ + "羊脚" + ], + "main_image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-011/01.jpg", + "name": "羊脚火锅", + "nutrition_facts": [ + ], + "origin_location": "龙里县", + "sort_order": 9, + "sort_within_type": 11, + "subtype": "火锅", + "tags": [ + "火锅", + "羊脚" + ], + "type": "火锅汤锅", + "type_code": "food-hotpot", + "type_order": 2 + }, + "food-012": { + "address_text": "", + "badge": "鱼类火锅", + "business_hours": "09:00–22:00", + "category": "火锅汤锅", + "collection": "foods", + "contact": null, + "cooking_methods": [ + "酸汤烹制" + ], + "data_status": "已归类", + "description": "酸爽过瘾,汤汁浓郁,贵州人情有独钟的味道——酸汤鱼,保准你吃过之后,也变成“三天不吃酸,走路打蹿蹿”。", + "entity_type": "food", + "flavor": "酸爽、汤汁浓郁", + "gallery_urls": [ + ], + "id": "food-012", + "ingredients": [ + "鱼", + "酸汤" + ], + "main_image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-012/01.jpg", + "name": "酸汤鱼", + "nutrition_facts": [ + ], + "origin_location": "龙里县", + "sort_order": 10, + "sort_within_type": 12, + "subtype": "鱼类火锅", + "tags": [ + "鱼类火锅", + "鱼", + "酸汤" + ], + "type": "火锅汤锅", + "type_code": "food-hotpot", + "type_order": 2 + }, + "food-013": { + "address_text": "", + "badge": "火锅", + "business_hours": "09:00–22:00", + "category": "火锅汤锅", + "collection": "foods", + "contact": null, + "cooking_methods": [ + "熬制汤底", + "火锅" + ], + "data_status": "已归类", + "description": "豆米火锅是一种健康的火锅。豆米含有蛋白质及多种人体必须的氨基酸和膳食纤维,加入浓浓的骨头汤融合豆米熬制的汤底,清香四溢,浓稠美味,可谓真正的养生火锅。", + "entity_type": "food", + "flavor": "清香、浓稠", + "gallery_urls": [ + ], + "id": "food-013", + "ingredients": [ + "豆米", + "骨头汤" + ], + "main_image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-013/01.jpg", + "name": "豆米火锅", + "nutrition_facts": [ + ], + "origin_location": "龙里县", + "sort_order": 11, + "sort_within_type": 13, + "subtype": "火锅", + "tags": [ + "火锅", + "豆米", + "骨头汤" + ], + "type": "火锅汤锅", + "type_code": "food-hotpot", + "type_order": 2 + }, + "food-014": { + "address_text": "", + "badge": "鸡类主菜", + "business_hours": "09:00–22:00", + "category": "特色菜肴", + "collection": "foods", + "contact": null, + "cooking_methods": [ + "小火慢浸", + "炸脆" + ], + "data_status": "已归类", + "description": "酥松的黄豆浸着满满的鸡汁,清香嫩爽的鸡肉散着淡淡的豆香,就着小火慢慢浸出来的鸡油细细地将黄豆与鸡骨头炸脆,黄豆吸入鸡汁,变得干脆清香,而鸡肉由于浸入炒豆香味而更加鲜嫩味美。", + "entity_type": "food", + "flavor": "豆香、鲜嫩", + "gallery_urls": [ + ], + "id": "food-014", + "ingredients": [ + "鸡肉", + "黄豆" + ], + "main_image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-014/01.jpg", + "name": "黄豆鸡", + "nutrition_facts": [ + ], + "origin_location": "龙里县", + "sort_order": 7, + "sort_within_type": 14, + "subtype": "鸡类主菜", + "tags": [ + "鸡类主菜", + "鸡肉", + "黄豆" + ], + "type": "特色菜肴", + "type_code": "food-featured-dish", + "type_order": 1 + }, + "food-015": { + "address_text": "", + "badge": "粉面", + "business_hours": "09:00–22:00", + "category": "粉面主食", + "collection": "foods", + "contact": null, + "cooking_methods": [ + "烩制" + ], + "data_status": "已归类", + "description": "新鲜猪肉加上现发黄豆芽、龙里糟辣椒及葱花等辅料烩制而成的鲜香特色肉丝粉深受龙里人喜爱,时隔两天总要吃上一碗肉丝粉来满足自身的味蕾需求。", + "entity_type": "food", + "flavor": "鲜香", + "gallery_urls": [ + ], + "id": "food-015", + "ingredients": [ + "猪肉", + "黄豆芽", + "龙里糟辣椒", + "葱花", + "米粉" + ], + "main_image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-015/01.jpg", + "name": "肉丝粉", + "nutrition_facts": [ + ], + "origin_location": "龙里县", + "sort_order": 12, + "sort_within_type": 15, + "subtype": "粉面", + "tags": [ + "粉面", + "猪肉", + "黄豆芽", + "龙里糟辣椒", + "葱花" + ], + "type": "粉面主食", + "type_code": "food-noodles-staple", + "type_order": 3 + }, + "food-016": { + "address_text": "", + "badge": "粉面", + "business_hours": "09:00–22:00", + "category": "粉面主食", + "collection": "foods", + "contact": null, + "cooking_methods": [ + "拌制" + ], + "data_status": "已归类", + "description": "辣鸡粉中的辣椒混着鸡肉,鸡肉拌着米粉,米粉粘着辣椒,环环相扣、精彩绝伦且回味无穷,鸡肉不干不柴,很入味,滋味更加浓郁纯粹。", + "entity_type": "food", + "flavor": "香辣、浓郁", + "gallery_urls": [ + ], + "id": "food-016", + "ingredients": [ + "鸡肉", + "辣椒", + "米粉" + ], + "main_image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-016/01.jpg", + "name": "辣鸡粉", + "nutrition_facts": [ + ], + "origin_location": "龙里县", + "sort_order": 13, + "sort_within_type": 16, + "subtype": "粉面", + "tags": [ + "粉面", + "鸡肉", + "辣椒", + "米粉" + ], + "type": "粉面主食", + "type_code": "food-noodles-staple", + "type_order": 3 + }, + "food-017": { + "address_text": "", + "badge": "粉面", + "business_hours": "09:00–22:00", + "category": "粉面主食", + "collection": "foods", + "contact": null, + "cooking_methods": [ + "炖煮" + ], + "data_status": "已归类", + "description": "鲜香浓郁的鸡汤搭配上软糯Q弹的米粉,加入香菇、小葱提味,口感丰富,浓香扑鼻,让人垂涎欲滴,一碗下肚还想再来一碗!", + "entity_type": "food", + "flavor": "鲜香、浓郁", + "gallery_urls": [ + ], + "id": "food-017", + "ingredients": [ + "鸡汤", + "米粉", + "香菇", + "小葱" + ], + "main_image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-017/01.jpg", + "name": "炖鸡粉", + "nutrition_facts": [ + ], + "origin_location": "龙里县", + "sort_order": 14, + "sort_within_type": 17, + "subtype": "粉面", + "tags": [ + "粉面", + "鸡汤", + "米粉", + "香菇", + "小葱" + ], + "type": "粉面主食", + "type_code": "food-noodles-staple", + "type_order": 3 + }, + "food-018": { + "address_text": "", + "badge": "甜品", + "business_hours": "09:00–22:00", + "category": "甜品饮品", + "collection": "foods", + "contact": null, + "cooking_methods": [ + "手搓", + "冰镇" + ], + "data_status": "已归类", + "description": "晶莹剔透的冰粉,甘甜的红糖浆,花香浓郁的腌制玫瑰,香糯的芋圆,各种水果丁,葡萄干、芝麻、花生碎,还可以加入米酒、小汤圆,最后加冰块、矿泉水,一碗下肚通体舒爽。", + "entity_type": "food", + "flavor": "甘甜、清凉", + "gallery_urls": [ + ], + "id": "food-018", + "ingredients": [ + "冰粉", + "红糖浆", + "腌制玫瑰", + "芋圆", + "水果丁", + "葡萄干", + "芝麻", + "花生碎", + "米酒", + "小汤圆" + ], + "main_image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-018/01.jpg", + "name": "手搓冰粉", + "nutrition_facts": [ + ], + "origin_location": "龙里县", + "sort_order": 23, + "sort_within_type": 18, + "subtype": "甜品", + "tags": [ + "甜品", + "冰粉", + "红糖浆", + "腌制玫瑰", + "芋圆" + ], + "type": "甜品饮品", + "type_code": "food-dessert-drink", + "type_order": 6 + }, + "food-019": { + "address_text": "", + "badge": "饮品", + "business_hours": "09:00–22:00", + "category": "甜品饮品", + "collection": "foods", + "contact": null, + "cooking_methods": [ + "熬制或冲调" + ], + "data_status": "已归类", + "description": "杨梅汤饮品不仅口感清凉爽口,酸甜浓郁,还具有很好的消暑解渴效果,深受人们的喜爱。", + "entity_type": "food", + "flavor": "酸甜、清凉", + "gallery_urls": [ + ], + "id": "food-019", + "ingredients": [ + "杨梅" + ], + "main_image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-019/01.jpg", + "name": "杨梅汤饮品", + "nutrition_facts": [ + ], + "origin_location": "龙里县", + "sort_order": 24, + "sort_within_type": 19, + "subtype": "饮品", + "tags": [ + "饮品", + "杨梅" + ], + "type": "甜品饮品", + "type_code": "food-dessert-drink", + "type_order": 6 + }, + "food-020": { + "address_text": "", + "badge": "休闲零食", + "business_hours": "09:00–22:00", + "category": "地方小吃", + "collection": "foods", + "contact": null, + "cooking_methods": [ + "传统工艺", + "烘焙" + ], + "data_status": "已归类", + "description": "麻辣洋芋片为了土豆片的脆爽口感,搭配传统的制作工艺和经典配方,保留了新鲜的美味,经过适合的温度,烘焙出飘香万里的土豆片,金黄诱人的表面,色香味俱全。", + "entity_type": "food", + "flavor": "麻辣、脆爽", + "gallery_urls": [ + ], + "id": "food-020", + "ingredients": [ + "土豆", + "麻辣调味" + ], + "main_image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-020/01.jpg", + "name": "麻辣洋芋片", + "nutrition_facts": [ + ], + "origin_location": "龙里县", + "sort_order": 18, + "sort_within_type": 20, + "subtype": "休闲零食", + "tags": [ + "休闲零食", + "土豆", + "麻辣调味" + ], + "type": "地方小吃", + "type_code": "food-local-snack", + "type_order": 5 + }, + "food-021": { + "address_text": "", + "badge": "地方小吃", + "business_hours": "09:00–22:00", + "category": "地方小吃", + "collection": "foods", + "contact": null, + "cooking_methods": [ + ], + "data_status": "已归类", + "entity_type": "food", + "gallery_urls": [ + ], + "id": "food-021", + "ingredients": [ + ], + "main_image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-021/01.jpg", + "name": "手工丝娃娃", + "nutrition_facts": [ + ], + "origin_location": "龙里县", + "sort_order": 19, + "sort_within_type": 21, + "subtype": "地方小吃", + "tags": [ + "地方小吃" + ], + "type": "地方小吃", + "type_code": "food-local-snack", + "type_order": 5 + }, + "food-022": { + "address_text": "", + "badge": "地方小吃", + "business_hours": "09:00–22:00", + "category": "地方小吃", + "collection": "foods", + "contact": null, + "cooking_methods": [ + ], + "data_status": "已归类", + "entity_type": "food", + "gallery_urls": [ + ], + "id": "food-022", + "ingredients": [ + "洋芋" + ], + "main_image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-022/01.jpg", + "name": "洋芋粑粑", + "nutrition_facts": [ + ], + "origin_location": "龙里县", + "sort_order": 20, + "sort_within_type": 22, + "subtype": "地方小吃", + "tags": [ + "地方小吃", + "洋芋" + ], + "type": "地方小吃", + "type_code": "food-local-snack", + "type_order": 5 + }, + "food-023": { + "address_text": "", + "badge": "糖点", + "business_hours": "09:00–22:00", + "category": "地方小吃", + "collection": "foods", + "contact": null, + "cooking_methods": [ + ], + "data_status": "已归类", + "entity_type": "food", + "gallery_urls": [ + ], + "id": "food-023", + "ingredients": [ + "糯米" + ], + "main_image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-023/01.jpg", + "name": "糯米糖", + "nutrition_facts": [ + ], + "origin_location": "龙里县", + "sort_order": 21, + "sort_within_type": 23, + "subtype": "糖点", + "tags": [ + "糖点", + "糯米" + ], + "type": "地方小吃", + "type_code": "food-local-snack", + "type_order": 5 + }, + "food-024": { + "address_text": "", + "badge": "糕点", + "business_hours": "09:00–22:00", + "category": "地方小吃", + "collection": "foods", + "contact": null, + "cooking_methods": [ + ], + "data_status": "已归类", + "entity_type": "food", + "gallery_urls": [ + ], + "id": "food-024", + "ingredients": [ + "红糖", + "糍粑" + ], + "main_image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/foods/food-024/01.jpg", + "name": "红糖糍粑", + "nutrition_facts": [ + ], + "origin_location": "龙里县", + "sort_order": 22, + "sort_within_type": 24, + "subtype": "糕点", + "tags": [ + "糕点", + "红糖", + "糍粑" + ], + "type": "地方小吃", + "type_code": "food-local-snack", + "type_order": 5 + }, + "specialty-001": { + "address_text": "", + "badge": "果干", + "business_hours": "09:00–22:00", + "category": "刺梨制品", + "collection": "specialties", + "contact": null, + "data_status": "已归类", + "entity_type": "specialty", + "gallery_urls": [ + ], + "id": "specialty-001", + "main_image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/specialties/specialty-001/01.png", + "name": "刺梨干", + "product_type": "果干", + "sort_order": 1, + "sort_within_type": 1, + "subtype": "果干", + "tags": [ + "刺梨制品", + "果干" + ], + "type": "刺梨制品", + "type_code": "specialty-rosa-roxburghii", + "type_order": 1 + }, + "specialty-002": { + "address_text": "", + "badge": "饮品", + "business_hours": "09:00–22:00", + "category": "刺梨制品", + "collection": "specialties", + "contact": null, + "data_status": "已归类", + "entity_type": "specialty", + "gallery_urls": [ + ], + "id": "specialty-002", + "main_image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/specialties/specialty-002/01.jpg", + "name": "刺梨汁", + "product_type": "饮品", + "sort_order": 2, + "sort_within_type": 2, + "subtype": "饮品", + "tags": [ + "刺梨制品", + "饮品" + ], + "type": "刺梨制品", + "type_code": "specialty-rosa-roxburghii", + "type_order": 1 + }, + "specialty-003": { + "address_text": "", + "badge": "饮品", + "business_hours": "09:00–22:00", + "category": "刺梨制品", + "collection": "specialties", + "contact": null, + "data_status": "已归类", + "entity_type": "specialty", + "gallery_urls": [ + ], + "id": "specialty-003", + "main_image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/specialties/specialty-003/01.jpg", + "name": "刺梨原汁", + "product_type": "饮品", + "sort_order": 3, + "sort_within_type": 3, + "subtype": "饮品", + "tags": [ + "刺梨制品", + "饮品" + ], + "type": "刺梨制品", + "type_code": "specialty-rosa-roxburghii", + "type_order": 1 + }, + "specialty-004": { + "address_text": "", + "badge": "茶饮", + "business_hours": "09:00–22:00", + "category": "刺梨制品", + "collection": "specialties", + "contact": null, + "data_status": "已归类", + "entity_type": "specialty", + "gallery_urls": [ + ], + "id": "specialty-004", + "main_image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/specialties/specialty-004/01.jpg", + "name": "刺梨养生茶", + "product_type": "茶饮", + "sort_order": 4, + "sort_within_type": 4, + "subtype": "茶饮", + "tags": [ + "刺梨制品", + "茶饮" + ], + "type": "刺梨制品", + "type_code": "specialty-rosa-roxburghii", + "type_order": 1 + }, + "specialty-005": { + "address_text": "", + "badge": "膳食纤维产品", + "business_hours": "09:00–22:00", + "category": "刺梨制品", + "collection": "specialties", + "contact": null, + "data_status": "已归类", + "entity_type": "specialty", + "gallery_urls": [ + ], + "id": "specialty-005", + "main_image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/specialties/specialty-005/01.jpg", + "name": "刺梨膳食纤维片", + "product_type": "膳食纤维产品", + "sort_order": 5, + "sort_within_type": 5, + "subtype": "膳食纤维产品", + "tags": [ + "刺梨制品", + "膳食纤维产品" + ], + "type": "刺梨制品", + "type_code": "specialty-rosa-roxburghii", + "type_order": 1 + }, + "specialty-006": { + "address_text": "", + "badge": "面食产品", + "business_hours": "09:00–22:00", + "category": "刺梨制品", + "collection": "specialties", + "contact": null, + "data_status": "已归类", + "entity_type": "specialty", + "gallery_urls": [ + ], + "id": "specialty-006", + "main_image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/specialties/specialty-006/01.png", + "name": "刺梨葛根面", + "product_type": "面食产品", + "sort_order": 6, + "sort_within_type": 6, + "subtype": "面食产品", + "tags": [ + "刺梨制品", + "面食产品" + ], + "type": "刺梨制品", + "type_code": "specialty-rosa-roxburghii", + "type_order": 1 + }, + "specialty-007": { + "address_text": "", + "badge": "果脯", + "brand": "千优谷", + "business_hours": "09:00–22:00", + "category": "刺梨制品", + "collection": "specialties", + "contact": null, + "data_status": "已归类", + "entity_type": "specialty", + "gallery_urls": [ + ], + "id": "specialty-007", + "main_image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/specialties/specialty-007/01.jpg", + "name": "千优谷刺梨果脯", + "product_type": "果脯", + "sort_order": 7, + "sort_within_type": 7, + "subtype": "果脯", + "tags": [ + "刺梨制品", + "果脯" + ], + "type": "刺梨制品", + "type_code": "specialty-rosa-roxburghii", + "type_order": 1 + }, + "specialty-008": { + "address_text": "", + "badge": "辣子鸡产品", + "brand": "龙哩邓氏", + "business_hours": "09:00–22:00", + "category": "地方食品", + "collection": "specialties", + "contact": null, + "data_status": "已归类", + "entity_type": "specialty", + "gallery_urls": [ + ], + "id": "specialty-008", + "main_image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/specialties/specialty-008/01.jpg", + "name": "龙哩邓氏辣子鸡", + "product_type": "辣子鸡产品", + "sort_order": 8, + "sort_within_type": 8, + "subtype": "辣子鸡产品", + "tags": [ + "地方食品", + "辣子鸡产品" + ], + "type": "地方食品", + "type_code": "specialty-local-food", + "type_order": 2 + }, + "specialty-009": { + "address_text": "", + "badge": "豆制品", + "brand": "龙缘盛", + "business_hours": "09:00–22:00", + "category": "地方食品", + "collection": "specialties", + "contact": null, + "data_status": "已归类", + "entity_type": "specialty", + "gallery_urls": [ + ], + "id": "specialty-009", + "main_image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/specialties/specialty-009/01.jpg", + "name": "龙缘盛豆干", + "product_type": "豆制品", + "sort_order": 9, + "sort_within_type": 9, + "subtype": "豆制品", + "tags": [ + "地方食品", + "豆制品" + ], + "type": "地方食品", + "type_code": "specialty-local-food", + "type_order": 2 + }, + "specialty-010": { + "address_text": "", + "badge": "大米", + "brand": "鱼稻香", + "business_hours": "09:00–22:00", + "category": "农产品", + "collection": "specialties", + "contact": null, + "data_status": "已归类", + "entity_type": "specialty", + "gallery_urls": [ + ], + "id": "specialty-010", + "main_image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/specialties/specialty-010/01.jpg", + "name": "鱼稻香羊场大米", + "product_type": "大米", + "sort_order": 10, + "sort_within_type": 10, + "subtype": "大米", + "tags": [ + "农产品", + "大米" + ], + "type": "农产品", + "type_code": "specialty-agricultural", + "type_order": 3 + }, + "specialty-011": { + "address_text": "", + "badge": "菊花茶", + "brand": "康吉", + "business_hours": "09:00–22:00", + "category": "农产品", + "collection": "specialties", + "contact": null, + "data_status": "已归类", + "entity_type": "specialty", + "gallery_urls": [ + ], + "id": "specialty-011", + "main_image_url": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/specialties/specialty-011/01.jpg", + "name": "康吉金丝皇菊", + "product_type": "菊花茶", + "sort_order": 11, + "sort_within_type": 11, + "subtype": "菊花茶", + "tags": [ + "农产品", + "菊花茶" + ], + "type": "农产品", + "type_code": "specialty-agricultural", + "type_order": 3 + } +} \ No newline at end of file diff --git a/src/mock/sections.json b/src/mock/sections.json new file mode 100644 index 0000000..d83d012 --- /dev/null +++ b/src/mock/sections.json @@ -0,0 +1,85 @@ +[ + { + "collections": [ + "attractions", + "attraction_subprojects" + ], + "coverImage": "https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com/longli/miniprogram/attractions/attraction-001/01.jpg", + "group_count": 7, + "group_ids": [ + "attractions-attraction-comprehensive", + "attractions-attraction-natural", + "attractions-attraction-rural-culture", + "attractions-attraction-themed-town", + "attractions-attraction-landmark", + "attraction_subprojects-subproject-recreation", + "attraction_subprojects-subproject-performance" + ], + "item_count": 18, + "key": "tourism", + "subtitle": "领取龙里旅游优惠", + "supportAssetIds": [ + "tourism-overview-map", + "tourism-guide-qr" + ], + "title": "龙里票根经济" + }, + { + "collections": [ + "accommodations" + ], + "group_count": 4, + "group_ids": [ + "accommodations-accommodation-hotel", + "accommodations-accommodation-homestay", + "accommodations-accommodation-apartment", + "accommodations-accommodation-camping" + ], + "item_count": 21, + "key": "lodging", + "subtitle": "酒店 · 民宿别院 · 旅居公寓 · 露营基地", + "supportAssetIds": [ + "lodging-location-schematic", + "lodging-guide-qr" + ], + "title": "旅居服务" + }, + { + "collections": [ + "foods" + ], + "group_count": 6, + "group_ids": [ + "foods-food-featured-dish", + "foods-food-hotpot", + "foods-food-noodles-staple", + "foods-food-barbecue", + "foods-food-local-snack", + "foods-food-dessert-drink" + ], + "item_count": 24, + "key": "food", + "subtitle": "特色菜肴 · 地方小吃 · 甜品饮品", + "supportAssetIds": [ + "food-guide-qr" + ], + "title": "全域美食" + }, + { + "collections": [ + "specialties" + ], + "group_count": 3, + "group_ids": [ + "specialties-specialty-rosa-roxburghii", + "specialties-specialty-local-food", + "specialties-specialty-agricultural" + ], + "item_count": 11, + "key": "specialties", + "subtitle": "刺梨制品 · 地方食品 · 农产品", + "supportAssetIds": [ + ], + "title": "龙里特产" + } +] \ No newline at end of file diff --git a/src/pages-sub/about/index.vue b/src/pages-sub/about/index.vue new file mode 100644 index 0000000..f06df1a --- /dev/null +++ b/src/pages-sub/about/index.vue @@ -0,0 +1,70 @@ + + + diff --git a/src/pages-sub/account/cancel.vue b/src/pages-sub/account/cancel.vue new file mode 100644 index 0000000..3117442 --- /dev/null +++ b/src/pages-sub/account/cancel.vue @@ -0,0 +1,88 @@ + + + diff --git a/src/pages-sub/agreement/index.vue b/src/pages-sub/agreement/index.vue new file mode 100644 index 0000000..1a4240b --- /dev/null +++ b/src/pages-sub/agreement/index.vue @@ -0,0 +1,50 @@ + + + diff --git a/src/pages-sub/catalog/index.vue b/src/pages-sub/catalog/index.vue new file mode 100644 index 0000000..565652f --- /dev/null +++ b/src/pages-sub/catalog/index.vue @@ -0,0 +1,119 @@ + + + diff --git a/src/pages-sub/detail/index.vue b/src/pages-sub/detail/index.vue new file mode 100644 index 0000000..3601ce9 --- /dev/null +++ b/src/pages-sub/detail/index.vue @@ -0,0 +1,288 @@ + + + diff --git a/src/pages.json b/src/pages.json new file mode 100644 index 0000000..c105a3b --- /dev/null +++ b/src/pages.json @@ -0,0 +1,112 @@ +{ + "easycom": { + "autoscan": true, + "custom": { + "^AppIcon$": "@/components/AppIcon/index.vue", + "^AppTabBar$": "@/components/AppTabBar/index.vue", + "^AppNavBar$": "@/components/AppNavBar/index.vue", + "^AppStatusBar$": "@/components/AppStatusBar/index.vue", + "^BenefitCard$": "@/components/BenefitCard/index.vue", + "^BenefitDialog$": "@/components/BenefitDialog/index.vue", + "^AppDialog$": "@/components/AppDialog/index.vue", + "^ContentCard$": "@/components/ContentCard/index.vue", + "^SectionTile$": "@/components/SectionTile/index.vue", + "^EmptyBox$": "@/components/EmptyBox/index.vue" + } + }, + "pages": [ + { + "path": "pages/home/index", + "style": { + "navigationStyle": "custom", + "navigationBarTitleText": "龙里文旅", + "enablePullDownRefresh": false + } + }, + { + "path": "pages/benefit/index", + "style": { + "navigationStyle": "custom", + "navigationBarTitleText": "权益", + "enablePullDownRefresh": false + } + }, + { + "path": "pages/mine/index", + "style": { + "navigationStyle": "custom", + "navigationBarTitleText": "我的", + "enablePullDownRefresh": false + } + }, + { + "path": "pages/login/index", + "style": { + "navigationStyle": "custom", + "navigationBarTitleText": "登录", + "enablePullDownRefresh": false + } + } + ], + "subPackages": [ + { + "root": "pages-sub", + "pages": [ + { + "path": "catalog/index", + "style": { + "navigationStyle": "custom", + "navigationBarTitleText": "板块", + "enablePullDownRefresh": false + } + }, + { + "path": "detail/index", + "style": { + "navigationStyle": "custom", + "navigationBarTitleText": "详情", + "enablePullDownRefresh": false + } + }, + { + "path": "agreement/index", + "style": { + "navigationStyle": "custom", + "navigationBarTitleText": "协议", + "enablePullDownRefresh": false + } + }, + { + "path": "about/index", + "style": { + "navigationStyle": "custom", + "navigationBarTitleText": "关于我们", + "enablePullDownRefresh": false + } + }, + { + "path": "account/cancel", + "style": { + "navigationStyle": "custom", + "navigationBarTitleText": "账户注销", + "enablePullDownRefresh": false + } + } + ] + } + ], + "preloadRule": { + "pages/home/index": { + "network": "all", + "packages": ["pages-sub"] + } + }, + "globalStyle": { + "navigationBarTextStyle": "black", + "navigationBarTitleText": "龙里文旅", + "navigationBarBackgroundColor": "#FFFFFF", + "backgroundColor": "#F5F7F9", + "backgroundColorTop": "#F5F7F9", + "backgroundColorBottom": "#F5F7F9" + } +} diff --git a/src/pages/benefit/index.vue b/src/pages/benefit/index.vue new file mode 100644 index 0000000..e423bdc --- /dev/null +++ b/src/pages/benefit/index.vue @@ -0,0 +1,191 @@ + + + diff --git a/src/pages/home/index.vue b/src/pages/home/index.vue new file mode 100644 index 0000000..18d7a04 --- /dev/null +++ b/src/pages/home/index.vue @@ -0,0 +1,169 @@ + + + diff --git a/src/pages/login/index.vue b/src/pages/login/index.vue new file mode 100644 index 0000000..2e7e3b7 --- /dev/null +++ b/src/pages/login/index.vue @@ -0,0 +1,168 @@ + + + diff --git a/src/pages/mine/index.vue b/src/pages/mine/index.vue new file mode 100644 index 0000000..8592474 --- /dev/null +++ b/src/pages/mine/index.vue @@ -0,0 +1,303 @@ + + + diff --git a/src/request/api/benefit.js b/src/request/api/benefit.js new file mode 100644 index 0000000..98f4777 --- /dev/null +++ b/src/request/api/benefit.js @@ -0,0 +1,23 @@ +import request from "../base/request"; + +/** + * 权益相关接口 + * 核心口径(v0.8/v0.11):权益不绑定具体商品、可多次使用; + * 领取与使用只累加次数,不改变可用状态,无幂等约束。 + */ + +/** 权益中心列表 */ +export const fetchBenefits = (params = {}) => request.get("/longli/benefit/list", params); + +/** 我的权益列表 */ +export const fetchMyBenefits = (params = {}) => request.get("/longli/benefit/mine", params); + +/** 领取权益 */ +export const claimBenefit = (id) => request.post("/longli/benefit/claim", { id }); + +/** 记录一次使用(只累加 use_count + last_used_at,不失效) */ +export const useBenefit = (id) => request.post("/longli/benefit/use", { id }); + +/** 商家关联的到店权益 */ +export const fetchRelatedBenefits = (entityId) => + request.get("/longli/benefit/related", { related_entity_id: entityId }); diff --git a/src/request/api/content.js b/src/request/api/content.js new file mode 100644 index 0000000..5161784 --- /dev/null +++ b/src/request/api/content.js @@ -0,0 +1,24 @@ +import request from "../base/request"; + +/** + * 内容(板块 / 目录 / 条目 / 素材)接口 + * 字段口径见 需求说明 §2 / §5 / §6 + */ + +/** 获取全部板块(4 个:票根经济 / 旅居服务 / 全域美食 / 龙里特产) */ +export const fetchSections = () => request.get("/longli/content/sections"); + +/** 获取板块详情(含分组与条目,已过滤 enabled=false 与空分组) */ +export const fetchSection = (sectionKey) => request.get("/longli/content/section", { key: sectionKey }); + +/** 获取条目详情 */ +export const fetchItem = (collection, id) => request.get("/longli/content/item", { collection, id }); + +/** 获取同类型推荐(排除自身) */ +export const fetchRelatedItems = (params) => request.get("/longli/content/related", params); + +/** 首页精选推荐(一期为运营固定位,二期由后端下发) */ +export const fetchFeaturedItems = () => request.get("/longli/content/featured"); + +/** 素材(导览图等) */ +export const fetchAssets = (params = {}) => request.get("/longli/content/assets", params); diff --git a/src/request/api/login.js b/src/request/api/login.js new file mode 100644 index 0000000..9d7d873 --- /dev/null +++ b/src/request/api/login.js @@ -0,0 +1,43 @@ +/** + * 登录 / 用户相关接口 + * --------------------------------------------------------------------------- + * 与 YGChatCS src/request/api/LoginApi.js 保持一致(同一后端客户端 clientId = 2)。 + * 取 token 走 OAuth2 客户端凭据 Basic custom:custom,请求体是 form-urlencoded。 + */ +import request from "../base/request"; + +/** 网关内置 OAuth2 客户端凭据(与 YGChatCS 相同,非用户凭据) */ +const BASIC_AUTH = "Basic Y3VzdG9tOmN1c3RvbQ=="; + +/** + * code 换 token + * @param {{ openIdCode: string[], grant_type: string, clientId: string, scope: string }} args + */ +export const oauthToken = (args) => + request.post("/auth/oauth2/token", args, { + header: { + Authorization: BASIC_AUTH, + "Content-Type": "application/x-www-form-urlencoded", + }, + silent: true, + }); + +/** + * 绑定手机号 + * @param {{ wechatPhoneCode: string, clientId: string }} args + */ +export const bindUserPhone = (args) => request.post("/hotelBiz/user/bindUserPhone", args); + +/** 检测当前登录用户是否已绑定手机号 → { data: boolean } */ +export const checkUserPhone = (config = {}) => + request.get("/hotelBiz/user/checkUserHasBindPhone", {}, config); + +/** 获取当前登录用户的手机号(脱敏) */ +export const getLoginUserPhone = (args = {}, config = {}) => + request.get("/hotelBiz/user/getLoginUserPhone", args, config); + +/** 服务协议原文 */ +export const getServiceAgreement = (args = {}) => request.get("/hotelBiz/mainScene/serviceAgreement", args); + +/** 隐私政策原文 */ +export const getPrivacyAgreement = (args = {}) => request.get("/hotelBiz/mainScene/privacyPolicy", args); diff --git a/src/request/base/config.js b/src/request/base/config.js new file mode 100644 index 0000000..bf7b012 --- /dev/null +++ b/src/request/base/config.js @@ -0,0 +1,78 @@ +/** + * 服务地址解析(参照 YGChatCS request/base/config.js) + * --------------------------------------------------------------------------- + * 启动时用版本号去生产网关换当前环境的 httpUrl: + * POST https://biz.nianxx.cn/hotelBiz/versionManager/getInfo { versionValue } + * → { code: 0, data: { httpUrl, wssUrl } } + * 换不到(版本未登记 / 网络异常)就退回内置测试网关,保证登录等真实接口仍可用。 + */ +import { + getEnvConfig, + setBaseUrl, + USE_MOCK_USER, + FORCE_BASE_URL, + BASE_URL_PRO, + BASE_URL_DEV, + SERVICE_URL_PATH, +} from "@/config/env"; +import request from "./request"; + +/** 对外暴露的版本号,发版前与 env.js 的 VERSION 同步 */ +export const VERSION = getEnvConfig().version; + +let envReady = false; +let envPromise = null; + +/** 是否已完成服务地址解析 */ +export const isEnvReady = () => envReady; + +/** + * 幂等确保服务地址已就绪:并发调用共用同一个请求。 + * 登录等真实接口在发请求前 await 它,避免拿不到 baseURL。 + */ +export const ensureEnvReady = () => { + if (envReady) return Promise.resolve(getEnvConfig().baseUrl); + if (!envPromise) { + envPromise = getEvnUrl().finally(() => { + envPromise = null; + }); + } + return envPromise; +}; + +const pickHttpUrl = (res) => { + if (!res || res.code !== 0 || !res.data) return ""; + return res.data.httpUrl || res.data.baseUrl || ""; +}; + +export const getEvnUrl = async () => { + const env = getEnvConfig(); + + // 手动钉死地址:跳过服务地址接口 + if (FORCE_BASE_URL) { + setBaseUrl(FORCE_BASE_URL); + envReady = true; + return env.baseUrl; + } + + // 登录也走 mock 时不需要真实服务地址 + if (USE_MOCK_USER) { + setBaseUrl(env.baseUrl || BASE_URL_DEV); + envReady = true; + return env.baseUrl; + } + + try { + const res = await request.post( + `${BASE_URL_PRO}${SERVICE_URL_PATH}`, + { versionValue: env.version }, + { noToken: true, silent: true } + ); + setBaseUrl(pickHttpUrl(res) || BASE_URL_DEV); + } catch (e) { + setBaseUrl(BASE_URL_DEV); + } + + envReady = true; + return getEnvConfig().baseUrl; +}; diff --git a/src/request/base/request.js b/src/request/base/request.js new file mode 100644 index 0000000..f722ce2 --- /dev/null +++ b/src/request/base/request.js @@ -0,0 +1,97 @@ +/** + * 统一请求封装(参照 YGChatCS 的 request 层,按本项目裁剪) + * - 自动拼 baseURL(http 开头则原样使用) + * - 自动带 clientId(网关鉴权靠它,本项目 = "2") + * - 自动带 Authorization: Bearer ;显式传 header.Authorization 时不覆盖(OAuth 取 token 用 Basic) + * - 424 视为登录失效:清 token → 广播退出 → 跳登录页 + */ +import { getEnvConfig } from "@/config/env"; +import { NOTICE_EVENT_LOGOUT } from "@/constant"; +import { clearLoginState, getAccessToken } from "@/constant/token"; +import { goLogin } from "@/utils/nav"; + +const defaultHeader = { + "Content-Type": "application/json", +}; + +/** 当前栈顶是否已是登录页(避免 424 时反复 stack 登录页) */ +const isOnLoginPage = () => { + try { + const pages = getCurrentPages(); + if (!pages || !pages.length) return false; + return pages[pages.length - 1].route === "pages/login/index"; + } catch (e) { + return false; + } +}; + +function request(url, args = {}, method = "POST", customConfig = {}) { + const { noToken = false, silent = false, token: explicitToken, ...rest } = customConfig; + const env = getEnvConfig(); + + let fullUrl = url; + if (!/^http/.test(url)) { + fullUrl = `${env.baseUrl}${url}`; + } + + const header = { + ...defaultHeader, + clientId: env.clientId, + ...(rest.header || {}), + }; + + if (noToken) { + delete header.Authorization; + } else if (!header.Authorization) { + const token = explicitToken || getAccessToken(); + if (token) header.Authorization = `Bearer ${token}`; + } + + const config = { + ...rest, + header, + method, + timeout: env.timeout, + data: args, + }; + + return new Promise((resolve, reject) => { + uni.request({ + url: fullUrl, + ...config, + success: (res) => { + const { statusCode = 0, data } = res; + + if (statusCode === 424) { + clearLoginState(); + uni.$emit(NOTICE_EVENT_LOGOUT); + if (!isOnLoginPage()) setTimeout(() => goLogin(), 500); + } + + if (statusCode >= 200 && statusCode < 300) { + resolve(data); + return; + } + + if (!silent) { + const msg = (data && (data.message || data.msg)) || `请求失败(${statusCode})`; + uni.showToast({ title: msg, icon: "none" }); + } + reject(res); + }, + fail: (err) => { + if (!silent) { + uni.showToast({ title: "网络异常,请稍后重试", icon: "none" }); + } + reject(err); + }, + }); + }); +} + +request.post = (url, args = {}, config = {}) => request(url, args, "POST", config); +request.get = (url, args = {}, config = {}) => request(url, args, "GET", config); +request.put = (url, args = {}, config = {}) => request(url, args, "PUT", config); +request.del = (url, args = {}, config = {}) => request(url, args, "DELETE", config); + +export default request; diff --git a/src/static/logo.png b/src/static/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..85fd05e613066bea9ccf431eb75ce7a4b4b1917f GIT binary patch literal 114292 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

g=I-Rbo2ywte+BIUwM%upyX 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

?w^eF?% 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 ({ + /** 权益中心列表 */ + centerList: [], + /** 我的权益列表(全部,筛选在 getter 完成) */ + myList: [], + /** 页头数据行文案 */ + headline: "", + /** 权益中心筛选类型 all | ticket | lodging | food | specialty */ + filterType: "all", + /** 我的权益子分段 all | usable | invalid */ + subTab: "all", + loading: false, + /** 缓存标记:分别标记两个列表是否已从服务端拉过(onShow 重复进入不再打接口) */ + centerLoaded: false, + mineLoaded: false, + }), + + getters: { + /** 权益中心:按类别筛选后的列表 */ + filteredCenter: (state) => + state.filterType === "all" + ? state.centerList + : state.centerList.filter((b) => b.type === state.filterType), + + /** 我的权益:按状态子分段筛选后的列表 */ + filteredMine: (state) => { + if (state.subTab === "usable") return state.myList.filter((b) => b.status === BENEFIT_STATUS.CLAIMED); + if (state.subTab === "invalid") return state.myList.filter((b) => b.status === BENEFIT_STATUS.EXPIRED); + return state.myList; + }, + + /** 我的权益数量角标(Tab3「我的权益」右栏数字) */ + usableCount: (state) => state.myList.filter((b) => b.status === BENEFIT_STATUS.CLAIMED).length, + + counts: (state) => ({ + all: state.myList.length, + usable: state.myList.filter((b) => b.status === BENEFIT_STATUS.CLAIMED).length, + invalid: state.myList.filter((b) => b.status === BENEFIT_STATUS.EXPIRED).length, + }), + }, + + actions: { + async loadCenter(force = false) { + if (this.centerLoaded && !force) return this.centerList; + this.loading = true; + try { + const [list, headline] = await Promise.all([ + benefitApi.getBenefitList(), + benefitApi.getBenefitHeadline(), + ]); + this.centerList = list || []; + this.headline = headline || ""; + this.centerLoaded = true; + } finally { + this.loading = false; + } + return this.centerList; + }, + + async loadMine(force = false) { + if (this.mineLoaded && !force) return this.myList; + const list = await benefitApi.getMyBenefitList(); + this.myList = list || []; + this.mineLoaded = true; + return this.myList; + }, + + async loadAll(force = false) { + await Promise.all([this.loadCenter(force), this.loadMine(force)]); + }, + + setFilterType(type) { + this.filterType = type; + }, + + setSubTab(tab) { + this.subTab = tab; + }, + + /** 领取权益 → 落本地,强制重拉两侧列表 */ + async claim(id) { + await benefitApi.claimBenefit(id); + await Promise.all([this.loadCenter(true), this.loadMine(true)]); + }, + + /** + * 记录一次使用(可多次使用,不失效,无幂等约束) + */ + async use(id) { + await benefitApi.useBenefit(id); + await Promise.all([this.loadCenter(true), this.loadMine(true)]); + }, + + reset() { + this.centerList = []; + this.myList = []; + this.headline = ""; + this.centerLoaded = false; + this.mineLoaded = false; + this.filterType = "all"; + this.subTab = "all"; + }, + }, +}); diff --git a/src/store/modules/user.js b/src/store/modules/user.js new file mode 100644 index 0000000..9eaeb12 --- /dev/null +++ b/src/store/modules/user.js @@ -0,0 +1,159 @@ +/** + * 用户状态:登录态、资料、手机号绑定 + * --------------------------------------------------------------------------- + * 登录链路走真实接口(见 src/api/user.js): + * login() → uni.login 换 code → OAuth token 落盘 → 同步手机号绑定态 + * bindPhone() → getPhoneNumber 回调的 code → 服务端绑定 → 回读脱敏手机号 + * 昵称 / 头像由用户主动设置,仅落本地 storage,不做假数据兜底。 + */ +import { defineStore } from "pinia"; +import { + clearLoginState, + getAccessToken, + getUserInfo, + setAccessToken, + setUserInfo, +} from "@/constant/token"; +import { NOTICE_EVENT_LOGIN_SUCCESS, NOTICE_EVENT_LOGOUT } from "@/constant"; +import * as userApi from "@/api/user"; + +export const useUserStore = defineStore("user", { + state: () => ({ + token: "", + userInfo: null, + /** 手机号绑定态请求中的并发保护 */ + phoneSyncing: false, + /** + * 本次登录会话内是否已从服务端同步过绑定态 + * 已同步 = 本地 phone / phoneBound 即为服务端结论,再进页面直接复用,不再打接口 + */ + phoneSynced: false, + }), + + getters: { + isLogin: (state) => !!state.token, + nickName: (state) => state.userInfo?.nickName || "", + avatarUrl: (state) => state.userInfo?.avatarUrl || "", + phone: (state) => state.userInfo?.phone || "", + phoneBound: (state) => !!state.userInfo?.phoneBound, + }, + + actions: { + /** 冷启动恢复本地登录态 */ + restore() { + this.token = getAccessToken(); + this.userInfo = getUserInfo(); + }, + + persist() { + setAccessToken(this.token); + setUserInfo(this.userInfo); + }, + + setSession({ token, userInfo }) { + this.token = token || ""; + this.userInfo = userInfo || null; + // 换了会话:绑定态需重新向服务端确认一次 + this.phoneSynced = false; + this.persist(); + }, + + /** + * 微信一键登录 + * @returns {Promise<{ token: string, refreshToken: string, code: string }>} + */ + async login() { + const res = await userApi.wxLogin(); + this.token = res.token || ""; + // 昵称/头像取自本地既有资料,服务端不下发该字段 + this.userInfo = { ...(this.userInfo || {}), ...(res.userInfo || {}) }; + this.persist(); + + // 新会话:绑定态必须重新确认一次(登录后同步,后续进页面不再重复打接口) + this.phoneSynced = false; + await this.syncPhone(); + uni.$emit(NOTICE_EVENT_LOGIN_SUCCESS); + return res; + }, + + /** + * 同步手机号绑定态 + * ----------------------------------------------------------------------- + * 调用时机:登录后一次、「我的」页 onShow。 + * 幂等:本次会话已成功同步过(`phoneSynced`)就直接复用本地态返回, + * **不再打 checkUserHasBindPhone / getLoginUserPhone** —— + * 否则每次切 Tab、从子页返回都会各打一~两个请求。 + * 失败静默:未登录或接口异常时不打扰用户,也不影响已登录状态; + * 异常时**不置** phoneSynced,留给下一次进入页面重试。 + * @param {boolean} force 需要强制刷新时传 true(如外部确认绑定态已变更) + * @returns {Promise} 是否已绑定 + */ + async syncPhone(force = false) { + if (!this.token || this.phoneSyncing) return this.phoneBound; + if (!force && this.phoneSynced) return this.phoneBound; + this.phoneSyncing = true; + try { + const bound = await userApi.checkUserPhone(); + if (!bound) { + this.userInfo = { ...(this.userInfo || {}), phone: "", phoneBound: false }; + this.phoneSynced = true; + this.persist(); + return false; + } + const phone = await userApi.getLoginUserPhone(); + this.userInfo = { + ...(this.userInfo || {}), + phone: phone || this.userInfo?.phone || "", + phoneBound: true, + }; + this.phoneSynced = true; + this.persist(); + return true; + } catch (e) { + // 未绑定 / 接口异常都按「未确认绑定」处理,不阻断页面 + return this.phoneBound; + } finally { + this.phoneSyncing = false; + } + }, + + /** + * 绑定手机号 + * @param {string} phoneCode getPhoneNumber 回调的 e.detail.code + */ + async bindPhone(phoneCode) { + const ok = await userApi.bindUserPhone(phoneCode); + if (!ok) throw new Error("绑定手机号失败"); + const phone = await userApi.getLoginUserPhone(); + this.userInfo = { ...(this.userInfo || {}), phone: phone || "", phoneBound: true }; + // 刚绑定完,本地即服务端结论,无需再同步 + this.phoneSynced = true; + this.persist(); + uni.$emit(NOTICE_EVENT_LOGIN_SUCCESS); + return this.userInfo; + }, + + /** 头像 / 昵称:仅本地保存 */ + async updateProfile(patch) { + const next = await userApi.updateProfile(patch); + this.userInfo = { ...(this.userInfo || {}), ...next }; + this.persist(); + }, + + /** 退出登录:清 token / 用户信息;权益状态由 benefit store 负责 */ + logout() { + this.token = ""; + this.userInfo = null; + this.phoneSyncing = false; + this.phoneSynced = false; + clearLoginState(); + uni.$emit(NOTICE_EVENT_LOGOUT); + }, + + async cancelAccount() { + const res = await userApi.cancelAccount(); + this.logout(); + return res; + }, + }, +}); diff --git a/src/styles/icons.scss b/src/styles/icons.scss new file mode 100644 index 0000000..b871e43 --- /dev/null +++ b/src/styles/icons.scss @@ -0,0 +1,74 @@ +/* 由 scripts/build-icons.mjs 生成,请勿手改 */ + +.ai{display:block;flex:none;background-repeat:no-repeat;background-position:center;background-size:100% 100%} + +.ai-pin.t-ink3{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPScjOUNBM0FGJyBzdHJva2Utd2lkdGg9JzEuOScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48cGF0aCBkPSJNMTIgMjFzNy02LjEgNy0xMWE3IDcgMCAxIDAtMTQgMGMwIDQuOSA3IDExIDcgMTF6Ii8+PGNpcmNsZSBjeD0iMTIiIGN5PSIxMCIgcj0iMi40Ii8+PC9zdmc+")} +.ai-pin.t-brand{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPScjMDBCNTc4JyBzdHJva2Utd2lkdGg9JzEuOScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48cGF0aCBkPSJNMTIgMjFzNy02LjEgNy0xMWE3IDcgMCAxIDAtMTQgMGMwIDQuOSA3IDExIDcgMTF6Ii8+PGNpcmNsZSBjeD0iMTIiIGN5PSIxMCIgcj0iMi40Ii8+PC9zdmc+")} +.ai-pin.t-white{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPScjRkZGRkZGJyBzdHJva2Utd2lkdGg9JzEuOScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48cGF0aCBkPSJNMTIgMjFzNy02LjEgNy0xMWE3IDcgMCAxIDAtMTQgMGMwIDQuOSA3IDExIDcgMTF6Ii8+PGNpcmNsZSBjeD0iMTIiIGN5PSIxMCIgcj0iMi40Ii8+PC9zdmc+")} +.ai-arrow.t-white{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPScjRkZGRkZGJyBzdHJva2Utd2lkdGg9JzEuOScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48cGF0aCBkPSJNNC41IDEyaDE1Ii8+PHBhdGggZD0iTTEzLjUgNmw2IDYtNiA2Ii8+PC9zdmc+")} +.ai-arrow.t-brandDeep{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPScjMDA5QTY3JyBzdHJva2Utd2lkdGg9JzEuOScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48cGF0aCBkPSJNNC41IDEyaDE1Ii8+PHBhdGggZD0iTTEzLjUgNmw2IDYtNiA2Ii8+PC9zdmc+")} +.ai-arrow.t-ink{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPScjMTQxODFDJyBzdHJva2Utd2lkdGg9JzEuOScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48cGF0aCBkPSJNNC41IDEyaDE1Ii8+PHBhdGggZD0iTTEzLjUgNmw2IDYtNiA2Ii8+PC9zdmc+")} +.ai-chev.t-ink3{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPScjOUNBM0FGJyBzdHJva2Utd2lkdGg9JzEuOScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48cGF0aCBkPSJNOS41IDUuNSAxNiAxMmwtNi41IDYuNSIvPjwvc3ZnPg==")} +.ai-chev.t-white{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPScjRkZGRkZGJyBzdHJva2Utd2lkdGg9JzEuOScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48cGF0aCBkPSJNOS41IDUuNSAxNiAxMmwtNi41IDYuNSIvPjwvc3ZnPg==")} +.ai-chev.t-brand{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPScjMDBCNTc4JyBzdHJva2Utd2lkdGg9JzEuOScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48cGF0aCBkPSJNOS41IDUuNSAxNiAxMmwtNi41IDYuNSIvPjwvc3ZnPg==")} +.ai-chev.t-ink2{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPScjNkI3MjgwJyBzdHJva2Utd2lkdGg9JzEuOScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48cGF0aCBkPSJNOS41IDUuNSAxNiAxMmwtNi41IDYuNSIvPjwvc3ZnPg==")} +.ai-back.t-ink{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPScjMTQxODFDJyBzdHJva2Utd2lkdGg9JzEuOScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48cGF0aCBkPSJNMTQuNSA1LjUgOCAxMmw2LjUgNi41Ii8+PC9zdmc+")} +.ai-back.t-white{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPScjRkZGRkZGJyBzdHJva2Utd2lkdGg9JzEuOScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48cGF0aCBkPSJNMTQuNSA1LjUgOCAxMmw2LjUgNi41Ii8+PC9zdmc+")} +.ai-back.t-brand{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPScjMDBCNTc4JyBzdHJva2Utd2lkdGg9JzEuOScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48cGF0aCBkPSJNMTQuNSA1LjUgOCAxMmw2LjUgNi41Ii8+PC9zdmc+")} +.ai-phone.t-white{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPScjRkZGRkZGJyBzdHJva2Utd2lkdGg9JzEuOScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48cGF0aCBkPSJNNC4yIDQuNGgzLjlsMS45IDQuOC0yLjQgMS41YTEyLjIgMTIuMiAwIDAgMCA1LjggNS44bDEuNS0yLjQgNC44IDEuOXYzLjlhMSAxIDAgMCAxLTEuMSAxQTE2LjggMTYuOCAwIDAgMSAzLjIgNS41YTEgMSAwIDAgMSAxLTEuMXoiLz48L3N2Zz4=")} +.ai-phone.t-brandDeep{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPScjMDA5QTY3JyBzdHJva2Utd2lkdGg9JzEuOScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48cGF0aCBkPSJNNC4yIDQuNGgzLjlsMS45IDQuOC0yLjQgMS41YTEyLjIgMTIuMiAwIDAgMCA1LjggNS44bDEuNS0yLjQgNC44IDEuOXYzLjlhMSAxIDAgMCAxLTEuMSAxQTE2LjggMTYuOCAwIDAgMSAzLjIgNS41YTEgMSAwIDAgMSAxLTEuMXoiLz48L3N2Zz4=")} +.ai-copy.t-brandDeep{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPScjMDA5QTY3JyBzdHJva2Utd2lkdGg9JzEuOScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48cmVjdCB4PSI5IiB5PSI5IiB3aWR0aD0iMTEiIGhlaWdodD0iMTEiIHJ4PSIyIi8+PHBhdGggZD0iTTUgMTUuNVY1LjVhMS41IDEuNSAwIDAgMSAxLjUtMS41aDEwIi8+PC9zdmc+")} +.ai-copy.t-brand{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPScjMDBCNTc4JyBzdHJva2Utd2lkdGg9JzEuOScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48cmVjdCB4PSI5IiB5PSI5IiB3aWR0aD0iMTEiIGhlaWdodD0iMTEiIHJ4PSIyIi8+PHBhdGggZD0iTTUgMTUuNVY1LjVhMS41IDEuNSAwIDAgMSAxLjUtMS41aDEwIi8+PC9zdmc+")} +.ai-gift.t-white{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPScjRkZGRkZGJyBzdHJva2Utd2lkdGg9JzEuOScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48cGF0aCBkPSJNMjAgMTJ2OC41SDRWMTIiLz48cGF0aCBkPSJNMi41IDcuNWgxOVYxMmgtMTl6Ii8+PHBhdGggZD0iTTEyIDcuNXYxMyIvPjxwYXRoIGQ9Ik0xMiA3LjVIOC42YTIuMyAyLjMgMCAxIDEgMC00LjZDMTEuNiAyLjkgMTIgNy41IDEyIDcuNXoiLz48cGF0aCBkPSJNMTIgNy41aDMuNGEyLjMgMi4zIDAgMSAwIDAtNC42QzEyLjQgMi45IDEyIDcuNSAxMiA3LjV6Ii8+PC9zdmc+")} +.ai-gift.t-brandDeep{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPScjMDA5QTY3JyBzdHJva2Utd2lkdGg9JzEuOScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48cGF0aCBkPSJNMjAgMTJ2OC41SDRWMTIiLz48cGF0aCBkPSJNMi41IDcuNWgxOVYxMmgtMTl6Ii8+PHBhdGggZD0iTTEyIDcuNXYxMyIvPjxwYXRoIGQ9Ik0xMiA3LjVIOC42YTIuMyAyLjMgMCAxIDEgMC00LjZDMTEuNiAyLjkgMTIgNy41IDEyIDcuNXoiLz48cGF0aCBkPSJNMTIgNy41aDMuNGEyLjMgMi4zIDAgMSAwIDAtNC42QzEyLjQgMi45IDEyIDcuNSAxMiA3LjV6Ii8+PC9zdmc+")} +.ai-gift.t-accent{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPScjRkY4QTNEJyBzdHJva2Utd2lkdGg9JzEuOScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48cGF0aCBkPSJNMjAgMTJ2OC41SDRWMTIiLz48cGF0aCBkPSJNMi41IDcuNWgxOVYxMmgtMTl6Ii8+PHBhdGggZD0iTTEyIDcuNXYxMyIvPjxwYXRoIGQ9Ik0xMiA3LjVIOC42YTIuMyAyLjMgMCAxIDEgMC00LjZDMTEuNiAyLjkgMTIgNy41IDEyIDcuNXoiLz48cGF0aCBkPSJNMTIgNy41aDMuNGEyLjMgMi4zIDAgMSAwIDAtNC42QzEyLjQgMi45IDEyIDcuNSAxMiA3LjV6Ii8+PC9zdmc+")} +.ai-home.t-ink3{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPScjOUNBM0FGJyBzdHJva2Utd2lkdGg9JzEuOScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48cGF0aCBkPSJNNCAxMS4yIDEyIDQuNGw4IDYuOHY4LjNhMSAxIDAgMCAxLTEgMWgtNC4ydi02SDkuMnY2SDVhMSAxIDAgMCAxLTEtMXoiLz48L3N2Zz4=")} +.ai-home.t-brand{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPScjMDBCNTc4JyBzdHJva2Utd2lkdGg9JzEuOScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48cGF0aCBkPSJNNCAxMS4yIDEyIDQuNGw4IDYuOHY4LjNhMSAxIDAgMCAxLTEgMWgtNC4ydi02SDkuMnY2SDVhMSAxIDAgMCAxLTEtMXoiLz48L3N2Zz4=")} +.ai-ticket.t-ink3{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPScjOUNBM0FGJyBzdHJva2Utd2lkdGg9JzEuOScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48cGF0aCBkPSJNMy41IDkuNmEyIDIgMCAwIDEgMi0yaDEzYTIgMiAwIDAgMSAyIDJ2MS4yYTEuNCAxLjQgMCAwIDAgMCAyLjh2MS4yYTIgMiAwIDAgMS0yIDJoLTEzYTIgMiAwIDAgMS0yLTJ2LTEuMmExLjQgMS40IDAgMCAwIDAtMi44eiIvPjxwYXRoIGQ9Ik0xMy42IDcuNnYyTTEzLjYgMTN2MiIvPjwvc3ZnPg==")} +.ai-ticket.t-brand{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPScjMDBCNTc4JyBzdHJva2Utd2lkdGg9JzEuOScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48cGF0aCBkPSJNMy41IDkuNmEyIDIgMCAwIDEgMi0yaDEzYTIgMiAwIDAgMSAyIDJ2MS4yYTEuNCAxLjQgMCAwIDAgMCAyLjh2MS4yYTIgMiAwIDAgMS0yIDJoLTEzYTIgMiAwIDAgMS0yLTJ2LTEuMmExLjQgMS40IDAgMCAwIDAtMi44eiIvPjxwYXRoIGQ9Ik0xMy42IDcuNnYyTTEzLjYgMTN2MiIvPjwvc3ZnPg==")} +.ai-ticket.t-accent{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPScjRkY4QTNEJyBzdHJva2Utd2lkdGg9JzEuOScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48cGF0aCBkPSJNMy41IDkuNmEyIDIgMCAwIDEgMi0yaDEzYTIgMiAwIDAgMSAyIDJ2MS4yYTEuNCAxLjQgMCAwIDAgMCAyLjh2MS4yYTIgMiAwIDAgMS0yIDJoLTEzYTIgMiAwIDAgMS0yLTJ2LTEuMmExLjQgMS40IDAgMCAwIDAtMi44eiIvPjxwYXRoIGQ9Ik0xMy42IDcuNnYyTTEzLjYgMTN2MiIvPjwvc3ZnPg==")} +.ai-ticket.t-white{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPScjRkZGRkZGJyBzdHJva2Utd2lkdGg9JzEuOScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48cGF0aCBkPSJNMy41IDkuNmEyIDIgMCAwIDEgMi0yaDEzYTIgMiAwIDAgMSAyIDJ2MS4yYTEuNCAxLjQgMCAwIDAgMCAyLjh2MS4yYTIgMiAwIDAgMS0yIDJoLTEzYTIgMiAwIDAgMS0yLTJ2LTEuMmExLjQgMS40IDAgMCAwIDAtMi44eiIvPjxwYXRoIGQ9Ik0xMy42IDcuNnYyTTEzLjYgMTN2MiIvPjwvc3ZnPg==")} +.ai-ticket.t-ink2{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPScjNkI3MjgwJyBzdHJva2Utd2lkdGg9JzEuOScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48cGF0aCBkPSJNMy41IDkuNmEyIDIgMCAwIDEgMi0yaDEzYTIgMiAwIDAgMSAyIDJ2MS4yYTEuNCAxLjQgMCAwIDAgMCAyLjh2MS4yYTIgMiAwIDAgMS0yIDJoLTEzYTIgMiAwIDAgMS0yLTJ2LTEuMmExLjQgMS40IDAgMCAwIDAtMi44eiIvPjxwYXRoIGQ9Ik0xMy42IDcuNnYyTTEzLjYgMTN2MiIvPjwvc3ZnPg==")} +.ai-user.t-ink3{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPScjOUNBM0FGJyBzdHJva2Utd2lkdGg9JzEuOScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48Y2lyY2xlIGN4PSIxMiIgY3k9IjguMiIgcj0iMy45Ii8+PHBhdGggZD0iTTQuNiAyMC42YTcuNCA3LjQgMCAwIDEgMTQuOCAwIi8+PC9zdmc+")} +.ai-user.t-brand{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPScjMDBCNTc4JyBzdHJva2Utd2lkdGg9JzEuOScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48Y2lyY2xlIGN4PSIxMiIgY3k9IjguMiIgcj0iMy45Ii8+PHBhdGggZD0iTTQuNiAyMC42YTcuNCA3LjQgMCAwIDEgMTQuOCAwIi8+PC9zdmc+")} +.ai-user.t-white{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPScjRkZGRkZGJyBzdHJva2Utd2lkdGg9JzEuOScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48Y2lyY2xlIGN4PSIxMiIgY3k9IjguMiIgcj0iMy45Ii8+PHBhdGggZD0iTTQuNiAyMC42YTcuNCA3LjQgMCAwIDEgMTQuOCAwIi8+PC9zdmc+")} +.ai-user.t-ink2{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPScjNkI3MjgwJyBzdHJva2Utd2lkdGg9JzEuOScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48Y2lyY2xlIGN4PSIxMiIgY3k9IjguMiIgcj0iMy45Ii8+PHBhdGggZD0iTTQuNiAyMC42YTcuNCA3LjQgMCAwIDEgMTQuOCAwIi8+PC9zdmc+")} +.ai-check.t-white{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPScjRkZGRkZGJyBzdHJva2Utd2lkdGg9JzEuOScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48cGF0aCBkPSJNNS41IDEyLjYgMTAgMTdsOC41LTkiLz48L3N2Zz4=")} +.ai-check.t-brand{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPScjMDBCNTc4JyBzdHJva2Utd2lkdGg9JzEuOScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48cGF0aCBkPSJNNS41IDEyLjYgMTAgMTdsOC41LTkiLz48L3N2Zz4=")} +.ai-close.t-ink3{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPScjOUNBM0FGJyBzdHJva2Utd2lkdGg9JzEuOScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48cGF0aCBkPSJNNi41IDYuNWwxMSAxMU0xNy41IDYuNWwtMTEgMTEiLz48L3N2Zz4=")} +.ai-close.t-white{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPScjRkZGRkZGJyBzdHJva2Utd2lkdGg9JzEuOScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48cGF0aCBkPSJNNi41IDYuNWwxMSAxMU0xNy41IDYuNWwtMTEgMTEiLz48L3N2Zz4=")} +.ai-doc.t-ink2{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPScjNkI3MjgwJyBzdHJva2Utd2lkdGg9JzEuOScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48cGF0aCBkPSJNNi41IDMuNWg3LjVsNC41IDQuNXYxMi41aC0xMnoiLz48cGF0aCBkPSJNMTQgMy41VjhoNC41Ii8+PHBhdGggZD0iTTkgMTNoNk05IDE2LjVoNC41Ii8+PC9zdmc+")} +.ai-doc.t-brand{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPScjMDBCNTc4JyBzdHJva2Utd2lkdGg9JzEuOScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48cGF0aCBkPSJNNi41IDMuNWg3LjVsNC41IDQuNXYxMi41aC0xMnoiLz48cGF0aCBkPSJNMTQgMy41VjhoNC41Ii8+PHBhdGggZD0iTTkgMTNoNk05IDE2LjVoNC41Ii8+PC9zdmc+")} +.ai-shield.t-ink2{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPScjNkI3MjgwJyBzdHJva2Utd2lkdGg9JzEuOScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48cGF0aCBkPSJNMTIgMy41IDE5LjUgNnY1LjZjMCA0LjYtMy42IDcuNi03LjUgOC45LTMuOS0xLjMtNy41LTQuMy03LjUtOC45VjZ6Ii8+PHBhdGggZD0iTTkuMiAxMi4ybDIuMiAyLjIgMy42LTMuNiIvPjwvc3ZnPg==")} +.ai-shield.t-white{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPScjRkZGRkZGJyBzdHJva2Utd2lkdGg9JzEuOScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48cGF0aCBkPSJNMTIgMy41IDE5LjUgNnY1LjZjMCA0LjYtMy42IDcuNi03LjUgOC45LTMuOS0xLjMtNy41LTQuMy03LjUtOC45VjZ6Ii8+PHBhdGggZD0iTTkuMiAxMi4ybDIuMiAyLjIgMy42LTMuNiIvPjwvc3ZnPg==")} +.ai-shield.t-brand{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPScjMDBCNTc4JyBzdHJva2Utd2lkdGg9JzEuOScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48cGF0aCBkPSJNMTIgMy41IDE5LjUgNnY1LjZjMCA0LjYtMy42IDcuNi03LjUgOC45LTMuOS0xLjMtNy41LTQuMy03LjUtOC45VjZ6Ii8+PHBhdGggZD0iTTkuMiAxMi4ybDIuMiAyLjIgMy42LTMuNiIvPjwvc3ZnPg==")} +.ai-info.t-ink2{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPScjNkI3MjgwJyBzdHJva2Utd2lkdGg9JzEuOScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSI4LjYiLz48cGF0aCBkPSJNMTIgMTF2NS4yIi8+PHBhdGggZD0iTTEyIDcuOGguMDEiLz48L3N2Zz4=")} +.ai-info.t-brand{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPScjMDBCNTc4JyBzdHJva2Utd2lkdGg9JzEuOScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSI4LjYiLz48cGF0aCBkPSJNMTIgMTF2NS4yIi8+PHBhdGggZD0iTTEyIDcuOGguMDEiLz48L3N2Zz4=")} +.ai-headset.t-ink2{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPScjNkI3MjgwJyBzdHJva2Utd2lkdGg9JzEuOScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48cGF0aCBkPSJNNC41IDE1di0zYTcuNSA3LjUgMCAwIDEgMTUgMHYzIi8+PHBhdGggZD0iTTQuNSAxMy42aDIuMnY1SDUuNmExLjEgMS4xIDAgMCAxLTEuMS0xLjF6Ii8+PHBhdGggZD0iTTE5LjUgMTMuNmgtMi4ydjVoMS4xYTEuMSAxLjEgMCAwIDAgMS4xLTEuMXoiLz48cGF0aCBkPSJNMTcuMyAxOC42di42YTIgMiAwIDAgMS0yIDJoLTIuOCIvPjwvc3ZnPg==")} +.ai-headset.t-brand{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPScjMDBCNTc4JyBzdHJva2Utd2lkdGg9JzEuOScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48cGF0aCBkPSJNNC41IDE1di0zYTcuNSA3LjUgMCAwIDEgMTUgMHYzIi8+PHBhdGggZD0iTTQuNSAxMy42aDIuMnY1SDUuNmExLjEgMS4xIDAgMCAxLTEuMS0xLjF6Ii8+PHBhdGggZD0iTTE5LjUgMTMuNmgtMi4ydjVoMS4xYTEuMSAxLjEgMCAwIDAgMS4xLTEuMXoiLz48cGF0aCBkPSJNMTcuMyAxOC42di42YTIgMiAwIDAgMS0yIDJoLTIuOCIvPjwvc3ZnPg==")} +.ai-logout.t-ink2{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPScjNkI3MjgwJyBzdHJva2Utd2lkdGg9JzEuOScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48cGF0aCBkPSJNMTUgMTJINCIvPjxwYXRoIGQ9Ik0xMS40IDguNCAxNSAxMmwtMy42IDMuNiIvPjxwYXRoIGQ9Ik0xNS41IDQuNWgzYTEgMSAwIDAgMSAxIDF2MTNhMSAxIDAgMCAxLTEgMWgtMyIvPjwvc3ZnPg==")} +.ai-logout.t-white{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPScjRkZGRkZGJyBzdHJva2Utd2lkdGg9JzEuOScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48cGF0aCBkPSJNMTUgMTJINCIvPjxwYXRoIGQ9Ik0xMS40IDguNCAxNSAxMmwtMy42IDMuNiIvPjxwYXRoIGQ9Ik0xNS41IDQuNWgzYTEgMSAwIDAgMSAxIDF2MTNhMSAxIDAgMCAxLTEgMWgtMyIvPjwvc3ZnPg==")} +.ai-trash.t-ink2{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPScjNkI3MjgwJyBzdHJva2Utd2lkdGg9JzEuOScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48cGF0aCBkPSJNNC41IDdoMTUiLz48cGF0aCBkPSJNOS41IDdWNC44aDVWNyIvPjxwYXRoIGQ9Ik02LjUgN2wuOSAxM2g5LjJsLjktMTMiLz48cGF0aCBkPSJNMTAuNSAxMC41djZNMTMuNSAxMC41djYiLz48L3N2Zz4=")} +.ai-trash.t-danger{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPScjRTU0ODREJyBzdHJva2Utd2lkdGg9JzEuOScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48cGF0aCBkPSJNNC41IDdoMTUiLz48cGF0aCBkPSJNOS41IDdWNC44aDVWNyIvPjxwYXRoIGQ9Ik02LjUgN2wuOSAxM2g5LjJsLjktMTMiLz48cGF0aCBkPSJNMTAuNSAxMC41djZNMTMuNSAxMC41djYiLz48L3N2Zz4=")} +.ai-share.t-white{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPScjRkZGRkZGJyBzdHJva2Utd2lkdGg9JzEuOScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48cGF0aCBkPSJNMTIgMTZWMy44Ii8+PHBhdGggZD0iTTguMiA3LjYgMTIgMy44bDMuOCAzLjgiLz48cGF0aCBkPSJNNSAxMy42VjE5YTEgMSAwIDAgMCAxIDFoMTJhMSAxIDAgMCAwIDEtMXYtNS40Ii8+PC9zdmc+")} +.ai-clock.t-brand{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPScjMDBCNTc4JyBzdHJva2Utd2lkdGg9JzEuOScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSI4LjYiLz48cGF0aCBkPSJNMTIgNy40djQuOGwzLjIgMS45Ii8+PC9zdmc+")} +.ai-clock.t-ink3{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPScjOUNBM0FGJyBzdHJva2Utd2lkdGg9JzEuOScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSI4LjYiLz48cGF0aCBkPSJNMTIgNy40djQuOGwzLjIgMS45Ii8+PC9zdmc+")} +.ai-clock.t-white{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPScjRkZGRkZGJyBzdHJva2Utd2lkdGg9JzEuOScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSI4LjYiLz48cGF0aCBkPSJNMTIgNy40djQuOGwzLjIgMS45Ii8+PC9zdmc+")} +.ai-map.t-brandDeep{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPScjMDA5QTY3JyBzdHJva2Utd2lkdGg9JzEuOScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48cGF0aCBkPSJNOSA0LjUgMy41IDYuNnYxM0w5IDE3LjRsNiAyLjEgNS41LTIuMXYtMTNMMTUgNi42eiIvPjxwYXRoIGQ9Ik05IDQuNXYxMi45TTE1IDYuNnYxMi45Ii8+PC9zdmc+")} +.ai-map.t-white{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPScjRkZGRkZGJyBzdHJva2Utd2lkdGg9JzEuOScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48cGF0aCBkPSJNOSA0LjUgMy41IDYuNnYxM0w5IDE3LjRsNiAyLjEgNS41LTIuMXYtMTNMMTUgNi42eiIvPjxwYXRoIGQ9Ik05IDQuNXYxMi45TTE1IDYuNnYxMi45Ii8+PC9zdmc+")} +.ai-food.t-brandDeep{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPScjMDA5QTY3JyBzdHJva2Utd2lkdGg9JzEuOScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48cGF0aCBkPSJNNi42IDMuNnY1TTkuNCAzLjZ2NSIvPjxwYXRoIGQ9Ik04IDMuNnYxNi44Ii8+PHBhdGggZD0iTTYuNiA4LjZoMi44Ii8+PHBhdGggZD0iTTE2LjQgMy42YzEuNyAwIDIuOCAxLjMgMi44IDMuMSAwIDEuOS0xLjEgMy4xLTIuOCAzLjFzLTIuOC0xLjItMi44LTMuMWMwLTEuOCAxLjEtMy4xIDIuOC0zLjF6Ii8+PHBhdGggZD0iTTE2LjQgOS44djEwLjYiLz48L3N2Zz4=")} +.ai-food.t-accent{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPScjRkY4QTNEJyBzdHJva2Utd2lkdGg9JzEuOScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48cGF0aCBkPSJNNi42IDMuNnY1TTkuNCAzLjZ2NSIvPjxwYXRoIGQ9Ik04IDMuNnYxNi44Ii8+PHBhdGggZD0iTTYuNiA4LjZoMi44Ii8+PHBhdGggZD0iTTE2LjQgMy42YzEuNyAwIDIuOCAxLjMgMi44IDMuMSAwIDEuOS0xLjEgMy4xLTIuOCAzLjFzLTIuOC0xLjItMi44LTMuMWMwLTEuOCAxLjEtMy4xIDIuOC0zLjF6Ii8+PHBhdGggZD0iTTE2LjQgOS44djEwLjYiLz48L3N2Zz4=")} +.ai-food.t-white{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPScjRkZGRkZGJyBzdHJva2Utd2lkdGg9JzEuOScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48cGF0aCBkPSJNNi42IDMuNnY1TTkuNCAzLjZ2NSIvPjxwYXRoIGQ9Ik04IDMuNnYxNi44Ii8+PHBhdGggZD0iTTYuNiA4LjZoMi44Ii8+PHBhdGggZD0iTTE2LjQgMy42YzEuNyAwIDIuOCAxLjMgMi44IDMuMSAwIDEuOS0xLjEgMy4xLTIuOCAzLjFzLTIuOC0xLjItMi44LTMuMWMwLTEuOCAxLjEtMy4xIDIuOC0zLjF6Ii8+PHBhdGggZD0iTTE2LjQgOS44djEwLjYiLz48L3N2Zz4=")} +.ai-food.t-brand{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPScjMDBCNTc4JyBzdHJva2Utd2lkdGg9JzEuOScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48cGF0aCBkPSJNNi42IDMuNnY1TTkuNCAzLjZ2NSIvPjxwYXRoIGQ9Ik04IDMuNnYxNi44Ii8+PHBhdGggZD0iTTYuNiA4LjZoMi44Ii8+PHBhdGggZD0iTTE2LjQgMy42YzEuNyAwIDIuOCAxLjMgMi44IDMuMSAwIDEuOS0xLjEgMy4xLTIuOCAzLjFzLTIuOC0xLjItMi44LTMuMWMwLTEuOCAxLjEtMy4xIDIuOC0zLjF6Ii8+PHBhdGggZD0iTTE2LjQgOS44djEwLjYiLz48L3N2Zz4=")} +.ai-bed.t-accent{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPScjRkY4QTNEJyBzdHJva2Utd2lkdGg9JzEuOScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48cGF0aCBkPSJNMy42IDE4LjZWNi40Ii8+PHBhdGggZD0iTTMuNiAxNWgxNi44djMuNiIvPjxwYXRoIGQ9Ik0yMC40IDE1di0yLjZhMS42IDEuNiAwIDAgMC0xLjYtMS42aC03VjE1Ii8+PGNpcmNsZSBjeD0iNy42IiBjeT0iMTIuMSIgcj0iMS43Ii8+PC9zdmc+")} +.ai-bed.t-brand{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPScjMDBCNTc4JyBzdHJva2Utd2lkdGg9JzEuOScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48cGF0aCBkPSJNMy42IDE4LjZWNi40Ii8+PHBhdGggZD0iTTMuNiAxNWgxNi44djMuNiIvPjxwYXRoIGQ9Ik0yMC40IDE1di0yLjZhMS42IDEuNiAwIDAgMC0xLjYtMS42aC03VjE1Ii8+PGNpcmNsZSBjeD0iNy42IiBjeT0iMTIuMSIgcj0iMS43Ii8+PC9zdmc+")} +.ai-bed.t-white{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPScjRkZGRkZGJyBzdHJva2Utd2lkdGg9JzEuOScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48cGF0aCBkPSJNMy42IDE4LjZWNi40Ii8+PHBhdGggZD0iTTMuNiAxNWgxNi44djMuNiIvPjxwYXRoIGQ9Ik0yMC40IDE1di0yLjZhMS42IDEuNiAwIDAgMC0xLjYtMS42aC03VjE1Ii8+PGNpcmNsZSBjeD0iNy42IiBjeT0iMTIuMSIgcj0iMS43Ii8+PC9zdmc+")} +.ai-bed.t-brandDeep{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPScjMDA5QTY3JyBzdHJva2Utd2lkdGg9JzEuOScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48cGF0aCBkPSJNMy42IDE4LjZWNi40Ii8+PHBhdGggZD0iTTMuNiAxNWgxNi44djMuNiIvPjxwYXRoIGQ9Ik0yMC40IDE1di0yLjZhMS42IDEuNiAwIDAgMC0xLjYtMS42aC03VjE1Ii8+PGNpcmNsZSBjeD0iNy42IiBjeT0iMTIuMSIgcj0iMS43Ii8+PC9zdmc+")} +.ai-peak.t-accent{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPScjRkY4QTNEJyBzdHJva2Utd2lkdGg9JzEuOScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48cGF0aCBkPSJNMi44IDE5LjIgOSA4LjRsMy42IDYuMiAyLjItMy40IDYuNCA4eiIvPjwvc3ZnPg==")} +.ai-peak.t-brand{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPScjMDBCNTc4JyBzdHJva2Utd2lkdGg9JzEuOScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48cGF0aCBkPSJNMi44IDE5LjIgOSA4LjRsMy42IDYuMiAyLjItMy40IDYuNCA4eiIvPjwvc3ZnPg==")} +.ai-peak.t-white{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPScjRkZGRkZGJyBzdHJva2Utd2lkdGg9JzEuOScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48cGF0aCBkPSJNMi44IDE5LjIgOSA4LjRsMy42IDYuMiAyLjItMy40IDYuNCA4eiIvPjwvc3ZnPg==")} +.ai-people.t-ink3{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPScjOUNBM0FGJyBzdHJva2Utd2lkdGg9JzEuOScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48Y2lyY2xlIGN4PSI5LjIiIGN5PSI4LjQiIHI9IjMuMiIvPjxwYXRoIGQ9Ik0zLjYgMTkuNGE1LjYgNS42IDAgMCAxIDExLjIgMCIvPjxwYXRoIGQ9Ik0xNS44IDUuNmEzLjIgMy4yIDAgMCAxIDAgNiIvPjxwYXRoIGQ9Ik0xNy40IDE0LjhhNS42IDUuNiAwIDAgMSAzIDQuNiIvPjwvc3ZnPg==")} +.ai-people.t-brand{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPScjMDBCNTc4JyBzdHJva2Utd2lkdGg9JzEuOScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48Y2lyY2xlIGN4PSI5LjIiIGN5PSI4LjQiIHI9IjMuMiIvPjxwYXRoIGQ9Ik0zLjYgMTkuNGE1LjYgNS42IDAgMCAxIDExLjIgMCIvPjxwYXRoIGQ9Ik0xNS44IDUuNmEzLjIgMy4yIDAgMCAxIDAgNiIvPjxwYXRoIGQ9Ik0xNy40IDE0LjhhNS42IDUuNiAwIDAgMSAzIDQuNiIvPjwvc3ZnPg==")} +.ai-people.t-white{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPScjRkZGRkZGJyBzdHJva2Utd2lkdGg9JzEuOScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48Y2lyY2xlIGN4PSI5LjIiIGN5PSI4LjQiIHI9IjMuMiIvPjxwYXRoIGQ9Ik0zLjYgMTkuNGE1LjYgNS42IDAgMCAxIDExLjIgMCIvPjxwYXRoIGQ9Ik0xNS44IDUuNmEzLjIgMy4yIDAgMCAxIDAgNiIvPjxwYXRoIGQ9Ik0xNy40IDE0LjhhNS42IDUuNiAwIDAgMSAzIDQuNiIvPjwvc3ZnPg==")} +.ai-people.t-brandDeep{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPScjMDA5QTY3JyBzdHJva2Utd2lkdGg9JzEuOScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48Y2lyY2xlIGN4PSI5LjIiIGN5PSI4LjQiIHI9IjMuMiIvPjxwYXRoIGQ9Ik0zLjYgMTkuNGE1LjYgNS42IDAgMCAxIDExLjIgMCIvPjxwYXRoIGQ9Ik0xNS44IDUuNmEzLjIgMy4yIDAgMCAxIDAgNiIvPjxwYXRoIGQ9Ik0xNy40IDE0LjhhNS42IDUuNiAwIDAgMSAzIDQuNiIvPjwvc3ZnPg==")} +.ai-wx.t-white{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nI0ZGRkZGRicgc3Ryb2tlPSdub25lJz48cGF0aCBkPSJNOC45IDMuNEM1LjIgMy40IDIuMiA1LjkgMi4yIDljMCAxLjggMSAzLjQgMi42IDQuNGwtLjcgMi40IDIuOC0xLjRjLjYuMiAxLjMuMyAyIC4zaC41YTUuNCA1LjQgMCAwIDEtLjItMS41YzAtMyAzLTUuMyA2LjgtNS4zaC41QzE2IDUuMyAxMi43IDMuNCA4LjkgMy40eiIvPjxwYXRoIGQ9Ik0xNS45IDguOGMtMy40IDAtNi4xIDItNi4xIDQuNCAwIDEuNS45IDIuOCAyLjMgMy42bC0uNiAxLjkgMi4zLTEuMWMuNS4xIDEuMS4yIDEuNi4yIDMuNCAwIDYuMS0yIDYuMS00LjZzLTIuNy00LjQtNS42LTQuNHoiLz48L3N2Zz4=")} diff --git a/src/uni.scss b/src/uni.scss new file mode 100644 index 0000000..0cd9dec --- /dev/null +++ b/src/uni.scss @@ -0,0 +1,43 @@ +/* =========================================================================== + uni-app 全局 SCSS 变量 + --------------------------------------------------------------------------- + ⚠️ 本文件会被自动注入到每个组件的