From 2eca2667d8e1af10799472c9923d511202f3b44a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=BC=A0=E6=96=87=E6=B6=9B?= <1909118034@qq.com>
Date: Thu, 20 Aug 2026 17:54:51 +0800
Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E5=AE=9E=E7=8E=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.gitignore | 26 +
App.vue | 5 +
api/auth.ts | 99 +
api/cashier.ts | 204 ++
components/ScreenPlayer/ScreenPlayer.vue | 94 +
config/index.ts | 44 +
config/terminal.ts | 7 +
docs/广告机实现方案.md | 104 +
index.html | 20 +
main.ts | 21 +
manifest.json | 18 +
mini.project.json | 11 +
mock/pay-checkout.ts | 47 +
mock/terminal.ts | 36 +
package.json | 7 +
pages.json | 18 +
pages/index/index.vue | 190 ++
scripts/alipay-es-compat.js | 93 +
services/terminal.ts | 31 +
static/cashier/bg-image.png | Bin 0 -> 878598 bytes
static/cashier/merchant-bg.png | Bin 0 -> 8535 bytes
static/css/remixicon.css | 2190 +++++++++++++++++
types/crypto-js.d.ts | 21 +
types/terminal.ts | 17 +
uni.promisify.adaptor.js | 13 +
uni.scss | 76 +
uni_modules/wot-design-uni/changelog.md | 1950 +++++++++++++++
.../components/common/AbortablePromise.ts | 28 +
.../components/common/abstracts/_config.scss | 7 +
.../common/abstracts/_function.scss | 89 +
.../components/common/abstracts/_mixin.scss | 385 +++
.../components/common/abstracts/variable.scss | 965 ++++++++
.../components/common/base64.ts | 29 +
.../components/common/canvasHelper.ts | 49 +
.../components/common/clickoutside.ts | 34 +
.../wot-design-uni/components/common/dayjs.ts | 148 ++
.../wot-design-uni/components/common/event.ts | 8 +
.../components/common/interceptor.ts | 43 +
.../wot-design-uni/components/common/props.ts | 51 +
.../wot-design-uni/components/common/util.ts | 747 ++++++
.../components/composables/useCell.ts | 13 +
.../components/composables/useChildren.ts | 113 +
.../components/composables/useCountDown.ts | 138 ++
.../components/composables/useLockScroll.ts | 39 +
.../components/composables/useParent.ts | 41 +
.../components/composables/usePopover.ts | 176 ++
.../components/composables/useQueue.ts | 52 +
.../components/composables/useRaf.ts | 37 +
.../components/composables/useTouch.ts | 43 +
.../components/composables/useTranslate.ts | 22 +
.../components/wd-action-sheet/index.scss | 204 ++
.../components/wd-action-sheet/types.ts | 121 +
.../wd-action-sheet/wd-action-sheet.vue | 155 ++
.../components/wd-backtop/index.scss | 25 +
.../components/wd-backtop/types.ts | 37 +
.../components/wd-backtop/wd-backtop.vue | 45 +
.../components/wd-badge/index.scss | 62 +
.../components/wd-badge/types.ts | 50 +
.../components/wd-badge/wd-badge.vue | 61 +
.../components/wd-button/index.scss | 336 +++
.../components/wd-button/types.ts | 141 ++
.../components/wd-button/wd-button.vue | 189 ++
.../components/wd-calendar-view/index.scss | 9 +
.../wd-calendar-view/month/index.scss | 162 ++
.../wd-calendar-view/month/month.vue | 389 +++
.../wd-calendar-view/month/types.ts | 20 +
.../wd-calendar-view/monthPanel/index.scss | 89 +
.../monthPanel/month-panel.vue | 374 +++
.../wd-calendar-view/monthPanel/types.ts | 48 +
.../components/wd-calendar-view/types.ts | 109 +
.../components/wd-calendar-view/utils.ts | 429 ++++
.../wd-calendar-view/wd-calendar-view.vue | 111 +
.../wd-calendar-view/year/index.scss | 153 ++
.../components/wd-calendar-view/year/types.ts | 20 +
.../components/wd-calendar-view/year/year.vue | 202 ++
.../wd-calendar-view/yearPanel/index.scss | 24 +
.../wd-calendar-view/yearPanel/types.ts | 38 +
.../wd-calendar-view/yearPanel/year-panel.vue | 135 +
.../components/wd-calendar/index.scss | 245 ++
.../components/wd-calendar/types.ts | 214 ++
.../components/wd-calendar/wd-calendar.vue | 443 ++++
.../components/wd-card/index.scss | 71 +
.../components/wd-card/types.ts | 30 +
.../components/wd-card/wd-card.vue | 37 +
.../components/wd-cell-group/index.scss | 56 +
.../components/wd-cell-group/types.ts | 41 +
.../wd-cell-group/wd-cell-group.vue | 45 +
.../components/wd-cell/index.scss | 188 ++
.../components/wd-cell/types.ts | 90 +
.../components/wd-cell/wd-cell.vue | 122 +
.../components/wd-checkbox-group/index.scss | 20 +
.../components/wd-checkbox-group/types.ts | 59 +
.../wd-checkbox-group/wd-checkbox-group.vue | 100 +
.../components/wd-checkbox/index.scss | 285 +++
.../components/wd-checkbox/types.ts | 68 +
.../components/wd-checkbox/wd-checkbox.vue | 177 ++
.../components/wd-circle/index.scss | 18 +
.../components/wd-circle/types.ts | 54 +
.../components/wd-circle/wd-circle.vue | 296 +++
.../components/wd-col-picker/index.scss | 243 ++
.../components/wd-col-picker/types.ts | 158 ++
.../wd-col-picker/wd-col-picker.vue | 511 ++++
.../components/wd-col/index.scss | 19 +
.../wot-design-uni/components/wd-col/types.ts | 15 +
.../components/wd-col/wd-col.vue | 79 +
.../components/wd-collapse-item/index.scss | 90 +
.../components/wd-collapse-item/types.ts | 48 +
.../wd-collapse-item/wd-collapse-item.vue | 171 ++
.../components/wd-collapse/index.scss | 55 +
.../components/wd-collapse/types.ts | 58 +
.../components/wd-collapse/wd-collapse.vue | 151 ++
.../components/wd-config-provider/types.ts | 1044 ++++++++
.../wd-config-provider/wd-config-provider.vue | 82 +
.../components/wd-count-down/index.scss | 15 +
.../components/wd-count-down/types.ts | 41 +
.../components/wd-count-down/utils.ts | 52 +
.../wd-count-down/wd-count-down.vue | 60 +
.../components/wd-count-to/index.scss | 7 +
.../components/wd-count-to/types.ts | 117 +
.../components/wd-count-to/wd-count-to.vue | 125 +
.../components/wd-curtain/index.scss | 85 +
.../components/wd-curtain/types.ts | 56 +
.../components/wd-curtain/wd-curtain.vue | 155 ++
.../wd-datetime-picker-view/index.scss | 0
.../wd-datetime-picker-view/types.ts | 123 +
.../wd-datetime-picker-view.vue | 504 ++++
.../components/wd-datetime-picker/index.scss | 245 ++
.../components/wd-datetime-picker/types.ts | 209 ++
.../wd-datetime-picker/wd-datetime-picker.vue | 763 ++++++
.../components/wd-divider/index.scss | 100 +
.../components/wd-divider/types.ts | 35 +
.../components/wd-divider/wd-divider.vue | 52 +
.../components/wd-drop-menu-item/index.scss | 66 +
.../components/wd-drop-menu-item/types.ts | 86 +
.../wd-drop-menu-item/wd-drop-menu-item.vue | 216 ++
.../components/wd-drop-menu/index.scss | 89 +
.../components/wd-drop-menu/types.ts | 38 +
.../components/wd-drop-menu/wd-drop-menu.vue | 121 +
.../components/wd-fab/index.scss | 116 +
.../wot-design-uni/components/wd-fab/types.ts | 66 +
.../components/wd-fab/wd-fab.vue | 252 ++
.../components/wd-floating-panel/index.scss | 64 +
.../components/wd-floating-panel/type.ts | 32 +
.../wd-floating-panel/wd-floating-panel.vue | 140 ++
.../components/wd-form-item/index.scss | 18 +
.../components/wd-form-item/types.ts | 16 +
.../components/wd-form-item/wd-form-item.vue | 65 +
.../components/wd-form/index.scss | 10 +
.../components/wd-form/types.ts | 85 +
.../components/wd-form/wd-form.vue | 209 ++
.../components/wd-gap/index.scss | 9 +
.../wot-design-uni/components/wd-gap/types.ts | 17 +
.../components/wd-gap/wd-gap.vue | 36 +
.../components/wd-grid-item/index.scss | 140 ++
.../components/wd-grid-item/types.ts | 74 +
.../components/wd-grid-item/wd-grid-item.vue | 166 ++
.../components/wd-grid/index.scss | 9 +
.../components/wd-grid/types.ts | 47 +
.../components/wd-grid/wd-grid.vue | 106 +
.../components/wd-icon/index.scss | 1226 +++++++++
.../components/wd-icon/types.ts | 21 +
.../components/wd-icon/wd-icon.vue | 53 +
.../components/wd-icon/wd-icons.ttf | Bin 0 -> 53948 bytes
.../components/wd-img-cropper/index.scss | 231 ++
.../components/wd-img-cropper/types.ts | 81 +
.../wd-img-cropper/wd-img-cropper.vue | 631 +++++
.../components/wd-img/index.scss | 19 +
.../wot-design-uni/components/wd-img/types.ts | 57 +
.../components/wd-img/wd-img.vue | 89 +
.../components/wd-index-anchor/index.scss | 35 +
.../components/wd-index-anchor/type.ts | 9 +
.../wd-index-anchor/wd-index-anchor.vue | 55 +
.../components/wd-index-bar/index.scss | 39 +
.../components/wd-index-bar/type.ts | 23 +
.../components/wd-index-bar/wd-index-bar.vue | 156 ++
.../components/wd-input-number/index.scss | 132 +
.../components/wd-input-number/types.ts | 81 +
.../wd-input-number/wd-input-number.vue | 200 ++
.../components/wd-input/index.scss | 338 +++
.../components/wd-input/types.ts | 195 ++
.../components/wd-input/wd-input.vue | 292 +++
.../components/wd-keyboard/constants.ts | 83 +
.../components/wd-keyboard/index.scss | 102 +
.../components/wd-keyboard/key/index.scss | 79 +
.../components/wd-keyboard/key/index.vue | 71 +
.../components/wd-keyboard/key/types.ts | 11 +
.../components/wd-keyboard/types.ts | 79 +
.../components/wd-keyboard/wd-keyboard.vue | 179 ++
.../components/wd-loading/index.scss | 37 +
.../components/wd-loading/types.ts | 31 +
.../components/wd-loading/wd-loading.vue | 90 +
.../components/wd-loadmore/index.scss | 39 +
.../components/wd-loadmore/types.ts | 30 +
.../components/wd-loadmore/wd-loadmore.vue | 68 +
.../components/wd-message-box/index.scss | 108 +
.../components/wd-message-box/index.ts | 94 +
.../components/wd-message-box/types.ts | 137 ++
.../wd-message-box/wd-message-box.vue | 290 +++
.../components/wd-navbar-capsule/index.scss | 66 +
.../components/wd-navbar-capsule/types.ts | 0
.../wd-navbar-capsule/wd-navbar-capsule.vue | 32 +
.../components/wd-navbar/index.scss | 93 +
.../components/wd-navbar/types.ts | 52 +
.../components/wd-navbar/wd-navbar.vue | 111 +
.../components/wd-notice-bar/index.scss | 68 +
.../components/wd-notice-bar/types.ts | 67 +
.../wd-notice-bar/wd-notice-bar.vue | 266 ++
.../components/wd-notify/index.scss | 34 +
.../components/wd-notify/index.ts | 61 +
.../components/wd-notify/types.ts | 62 +
.../components/wd-notify/wd-notify.vue | 84 +
.../components/wd-number-keyboard/index.scss | 78 +
.../wd-number-keyboard/key/index.scss | 81 +
.../wd-number-keyboard/key/index.vue | 73 +
.../wd-number-keyboard/key/types.ts | 11 +
.../components/wd-number-keyboard/types.ts | 79 +
.../wd-number-keyboard/wd-number-keyboard.vue | 146 ++
.../components/wd-overlay/index.scss | 17 +
.../components/wd-overlay/types.ts | 25 +
.../components/wd-overlay/wd-overlay.vue | 49 +
.../components/wd-pagination/index.scss | 57 +
.../components/wd-pagination/types.ts | 41 +
.../wd-pagination/wd-pagination.vue | 112 +
.../components/wd-password-input/index.scss | 124 +
.../components/wd-password-input/types.ts | 42 +
.../wd-password-input/wd-password-input.vue | 49 +
.../components/wd-picker-view/index.scss | 92 +
.../components/wd-picker-view/types.ts | 148 ++
.../wd-picker-view/wd-picker-view.vue | 361 +++
.../components/wd-picker/index.scss | 224 ++
.../components/wd-picker/types.ts | 179 ++
.../components/wd-picker/wd-picker.vue | 414 ++++
.../components/wd-popover/index.scss | 116 +
.../components/wd-popover/types.ts | 69 +
.../components/wd-popover/wd-popover.vue | 180 ++
.../components/wd-popup/index.scss | 84 +
.../components/wd-popup/types.ts | 98 +
.../components/wd-popup/wd-popup.vue | 133 +
.../components/wd-progress/index.scss | 68 +
.../components/wd-progress/types.ts | 44 +
.../components/wd-progress/wd-progress.vue | 197 ++
.../components/wd-radio-group/index.scss | 23 +
.../components/wd-radio-group/types.ts | 39 +
.../wd-radio-group/wd-radio-group.vue | 51 +
.../components/wd-radio/index.scss | 300 +++
.../components/wd-radio/types.ts | 51 +
.../components/wd-radio/wd-radio.vue | 118 +
.../components/wd-rate/index.scss | 24 +
.../components/wd-rate/types.ts | 89 +
.../components/wd-rate/wd-rate.vue | 128 +
.../components/wd-resize/index.scss | 27 +
.../components/wd-resize/types.ts | 6 +
.../components/wd-resize/wd-resize.vue | 144 ++
.../components/wd-row/index.scss | 10 +
.../wot-design-uni/components/wd-row/types.ts | 16 +
.../components/wd-row/wd-row.vue | 42 +
.../components/wd-search/index.scss | 148 ++
.../components/wd-search/types.ts | 102 +
.../components/wd-search/wd-search.vue | 201 ++
.../components/wd-segmented/index.scss | 101 +
.../components/wd-segmented/types.ts | 80 +
.../components/wd-segmented/wd-segmented.vue | 134 +
.../components/wd-select-picker/index.scss | 185 ++
.../components/wd-select-picker/types.ts | 105 +
.../wd-select-picker/wd-select-picker.vue | 451 ++++
.../components/wd-sidebar-item/index.scss | 96 +
.../components/wd-sidebar-item/types.ts | 31 +
.../wd-sidebar-item/wd-sidebar-item.vue | 116 +
.../components/wd-sidebar/index.scss | 25 +
.../components/wd-sidebar/types.ts | 47 +
.../components/wd-sidebar/wd-sidebar.vue | 63 +
.../components/wd-signature/index.scss | 30 +
.../components/wd-signature/types.ts | 115 +
.../components/wd-signature/wd-signature.vue | 282 +++
.../components/wd-skeleton/index.scss | 96 +
.../components/wd-skeleton/index.ts | 1 +
.../components/wd-skeleton/types.ts | 69 +
.../components/wd-skeleton/wd-skeleton.vue | 119 +
.../components/wd-slider/index.scss | 92 +
.../components/wd-slider/types.ts | 104 +
.../components/wd-slider/wd-slider.vue | 358 +++
.../components/wd-sort-button/index.scss | 89 +
.../components/wd-sort-button/types.ts | 43 +
.../wd-sort-button/wd-sort-button.vue | 69 +
.../components/wd-status-tip/index.scss | 37 +
.../components/wd-status-tip/types.ts | 65 +
.../wd-status-tip/wd-status-tip.vue | 70 +
.../components/wd-step/index.scss | 235 ++
.../components/wd-step/types.ts | 33 +
.../components/wd-step/wd-step.vue | 150 ++
.../components/wd-steps/index.scss | 10 +
.../components/wd-steps/types.ts | 59 +
.../components/wd-steps/wd-steps.vue | 37 +
.../components/wd-sticky-box/index.scss | 6 +
.../components/wd-sticky-box/types.ts | 20 +
.../wd-sticky-box/wd-sticky-box.vue | 155 ++
.../components/wd-sticky/index.scss | 9 +
.../components/wd-sticky/types.ts | 13 +
.../components/wd-sticky/wd-sticky.vue | 190 ++
.../components/wd-swipe-action/index.scss | 22 +
.../components/wd-swipe-action/types.ts | 40 +
.../wd-swipe-action/wd-swipe-action.vue | 294 +++
.../components/wd-swiper-nav/index.scss | 159 ++
.../components/wd-swiper-nav/types.ts | 42 +
.../wd-swiper-nav/wd-swiper-nav.vue | 37 +
.../components/wd-swiper/index.scss | 33 +
.../components/wd-swiper/types.ts | 264 ++
.../components/wd-swiper/wd-swiper.vue | 304 +++
.../components/wd-switch/index.scss | 58 +
.../components/wd-switch/types.ts | 58 +
.../components/wd-switch/wd-switch.vue | 83 +
.../components/wd-tab/index.scss | 16 +
.../wot-design-uni/components/wd-tab/types.ts | 30 +
.../components/wd-tab/wd-tab.vue | 88 +
.../components/wd-tabbar-item/index.scss | 55 +
.../components/wd-tabbar-item/types.ts | 51 +
.../wd-tabbar-item/wd-tabbar-item.vue | 99 +
.../components/wd-tabbar/index.scss | 60 +
.../components/wd-tabbar/types.ts | 73 +
.../components/wd-tabbar/wd-tabbar.vue | 91 +
.../components/wd-table-col/index.scss | 46 +
.../components/wd-table-col/types.ts | 54 +
.../components/wd-table-col/wd-table-col.vue | 149 ++
.../components/wd-table/index.scss | 162 ++
.../components/wd-table/types.ts | 67 +
.../components/wd-table/wd-table.vue | 284 +++
.../components/wd-tabs/index.scss | 299 +++
.../components/wd-tabs/types.ts | 107 +
.../components/wd-tabs/wd-tabs.vue | 439 ++++
.../components/wd-tag/index.scss | 115 +
.../wot-design-uni/components/wd-tag/types.ts | 81 +
.../components/wd-tag/wd-tag.vue | 148 ++
.../components/wd-text/index.scss | 37 +
.../components/wd-text/types.ts | 98 +
.../components/wd-text/wd-text.vue | 139 ++
.../components/wd-textarea/index.scss | 352 +++
.../components/wd-textarea/types.ts | 301 +++
.../components/wd-textarea/wd-textarea.vue | 283 +++
.../components/wd-toast/index.scss | 65 +
.../components/wd-toast/index.ts | 99 +
.../components/wd-toast/types.ts | 76 +
.../components/wd-toast/wd-toast.vue | 175 ++
.../components/wd-tooltip/index.scss | 66 +
.../components/wd-tooltip/types.ts | 107 +
.../components/wd-tooltip/wd-tooltip.vue | 141 ++
.../components/wd-transition/index.scss | 95 +
.../components/wd-transition/types.ts | 101 +
.../wd-transition/wd-transition.vue | 216 ++
.../components/wd-upload/index.scss | 175 ++
.../components/wd-upload/types.ts | 372 +++
.../components/wd-upload/utils.ts | 152 ++
.../components/wd-upload/wd-upload.vue | 705 ++++++
.../components/wd-video-preview/index.scss | 34 +
.../components/wd-video-preview/types.ts | 32 +
.../wd-video-preview/wd-video-preview.vue | 72 +
.../components/wd-watermark/index.scss | 18 +
.../components/wd-watermark/types.ts | 76 +
.../components/wd-watermark/wd-watermark.vue | 495 ++++
.../wot-design-uni/wot-design-uni.vue | 14 +
uni_modules/wot-design-uni/global.d.ts | 107 +
uni_modules/wot-design-uni/index.ts | 22 +
uni_modules/wot-design-uni/locale/index.ts | 41 +
.../wot-design-uni/locale/lang/ar-SA.ts | 131 +
.../wot-design-uni/locale/lang/de-DE.ts | 131 +
.../wot-design-uni/locale/lang/en-US.ts | 131 +
.../wot-design-uni/locale/lang/es-ES.ts | 131 +
.../wot-design-uni/locale/lang/fr-FR.ts | 131 +
.../wot-design-uni/locale/lang/ja-JP.ts | 131 +
.../wot-design-uni/locale/lang/ko-KR.ts | 131 +
.../wot-design-uni/locale/lang/pt-PT.ts | 131 +
.../wot-design-uni/locale/lang/ru-RU.ts | 131 +
.../wot-design-uni/locale/lang/th-TH.ts | 131 +
.../wot-design-uni/locale/lang/tr-TR.ts | 131 +
.../wot-design-uni/locale/lang/vi-VN.ts | 72 +
.../wot-design-uni/locale/lang/zh-CN.ts | 131 +
.../wot-design-uni/locale/lang/zh-HK.ts | 65 +
.../wot-design-uni/locale/lang/zh-TW.ts | 65 +
uni_modules/wot-design-uni/package.json | 94 +
uni_modules/wot-design-uni/readme.md | 152 ++
unocss/a-hua-unocss/class-name.scss | 505 ++++
unocss/a-hua-unocss/class-name.vue | 11 +
unocss/a-hua-unocss/index.d.ts | 72 +
unocss/a-hua-unocss/index.js | 1 +
unocss/a-hua-unocss/index.scss | 8 +
unocss/a-hua-unocss/index.uts | 73 +
unocss/a-hua-unocss/package.json | 25 +
unocss/vite.config.ts | 78 +
utils/auth.ts | 55 +
utils/checkout-return.ts | 40 +
utils/common.ts | 34 +
utils/device.ts | 40 +
utils/http.ts | 54 +
utils/merchant-context.ts | 226 ++
utils/request.ts | 120 +
utils/storage.ts | 94 +
utils/wxpay.ts | 137 ++
vite.config.ts | 127 +
397 files changed, 50438 insertions(+)
create mode 100644 .gitignore
create mode 100644 App.vue
create mode 100644 api/auth.ts
create mode 100644 api/cashier.ts
create mode 100644 components/ScreenPlayer/ScreenPlayer.vue
create mode 100644 config/index.ts
create mode 100644 config/terminal.ts
create mode 100644 docs/广告机实现方案.md
create mode 100644 index.html
create mode 100644 main.ts
create mode 100644 manifest.json
create mode 100644 mini.project.json
create mode 100644 mock/pay-checkout.ts
create mode 100644 mock/terminal.ts
create mode 100644 package.json
create mode 100644 pages.json
create mode 100644 pages/index/index.vue
create mode 100644 scripts/alipay-es-compat.js
create mode 100644 services/terminal.ts
create mode 100644 static/cashier/bg-image.png
create mode 100644 static/cashier/merchant-bg.png
create mode 100644 static/css/remixicon.css
create mode 100644 types/crypto-js.d.ts
create mode 100644 types/terminal.ts
create mode 100644 uni.promisify.adaptor.js
create mode 100644 uni.scss
create mode 100644 uni_modules/wot-design-uni/changelog.md
create mode 100644 uni_modules/wot-design-uni/components/common/AbortablePromise.ts
create mode 100644 uni_modules/wot-design-uni/components/common/abstracts/_config.scss
create mode 100644 uni_modules/wot-design-uni/components/common/abstracts/_function.scss
create mode 100644 uni_modules/wot-design-uni/components/common/abstracts/_mixin.scss
create mode 100644 uni_modules/wot-design-uni/components/common/abstracts/variable.scss
create mode 100644 uni_modules/wot-design-uni/components/common/base64.ts
create mode 100644 uni_modules/wot-design-uni/components/common/canvasHelper.ts
create mode 100644 uni_modules/wot-design-uni/components/common/clickoutside.ts
create mode 100644 uni_modules/wot-design-uni/components/common/dayjs.ts
create mode 100644 uni_modules/wot-design-uni/components/common/event.ts
create mode 100644 uni_modules/wot-design-uni/components/common/interceptor.ts
create mode 100644 uni_modules/wot-design-uni/components/common/props.ts
create mode 100644 uni_modules/wot-design-uni/components/common/util.ts
create mode 100644 uni_modules/wot-design-uni/components/composables/useCell.ts
create mode 100644 uni_modules/wot-design-uni/components/composables/useChildren.ts
create mode 100644 uni_modules/wot-design-uni/components/composables/useCountDown.ts
create mode 100644 uni_modules/wot-design-uni/components/composables/useLockScroll.ts
create mode 100644 uni_modules/wot-design-uni/components/composables/useParent.ts
create mode 100644 uni_modules/wot-design-uni/components/composables/usePopover.ts
create mode 100644 uni_modules/wot-design-uni/components/composables/useQueue.ts
create mode 100644 uni_modules/wot-design-uni/components/composables/useRaf.ts
create mode 100644 uni_modules/wot-design-uni/components/composables/useTouch.ts
create mode 100644 uni_modules/wot-design-uni/components/composables/useTranslate.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-action-sheet/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-action-sheet/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-action-sheet/wd-action-sheet.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-backtop/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-backtop/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-backtop/wd-backtop.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-badge/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-badge/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-badge/wd-badge.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-button/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-button/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-button/wd-button.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-calendar-view/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-calendar-view/month/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-calendar-view/month/month.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-calendar-view/month/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-calendar-view/monthPanel/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-calendar-view/monthPanel/month-panel.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-calendar-view/monthPanel/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-calendar-view/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-calendar-view/utils.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-calendar-view/wd-calendar-view.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-calendar-view/year/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-calendar-view/year/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-calendar-view/year/year.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-calendar-view/yearPanel/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-calendar-view/yearPanel/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-calendar-view/yearPanel/year-panel.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-calendar/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-calendar/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-calendar/wd-calendar.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-card/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-card/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-card/wd-card.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-cell-group/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-cell-group/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-cell-group/wd-cell-group.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-cell/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-cell/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-cell/wd-cell.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-checkbox-group/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-checkbox-group/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-checkbox-group/wd-checkbox-group.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-checkbox/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-checkbox/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-checkbox/wd-checkbox.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-circle/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-circle/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-circle/wd-circle.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-col-picker/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-col-picker/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-col-picker/wd-col-picker.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-col/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-col/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-col/wd-col.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-collapse-item/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-collapse-item/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-collapse-item/wd-collapse-item.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-collapse/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-collapse/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-collapse/wd-collapse.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-config-provider/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-config-provider/wd-config-provider.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-count-down/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-count-down/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-count-down/utils.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-count-down/wd-count-down.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-count-to/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-count-to/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-count-to/wd-count-to.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-curtain/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-curtain/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-curtain/wd-curtain.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-datetime-picker-view/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-datetime-picker-view/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-datetime-picker-view/wd-datetime-picker-view.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-datetime-picker/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-datetime-picker/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-datetime-picker/wd-datetime-picker.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-divider/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-divider/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-divider/wd-divider.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-drop-menu-item/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-drop-menu-item/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-drop-menu-item/wd-drop-menu-item.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-drop-menu/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-drop-menu/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-drop-menu/wd-drop-menu.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-fab/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-fab/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-fab/wd-fab.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-floating-panel/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-floating-panel/type.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-floating-panel/wd-floating-panel.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-form-item/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-form-item/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-form-item/wd-form-item.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-form/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-form/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-form/wd-form.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-gap/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-gap/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-gap/wd-gap.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-grid-item/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-grid-item/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-grid-item/wd-grid-item.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-grid/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-grid/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-grid/wd-grid.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-icon/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-icon/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-icon/wd-icon.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-icon/wd-icons.ttf
create mode 100644 uni_modules/wot-design-uni/components/wd-img-cropper/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-img-cropper/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-img-cropper/wd-img-cropper.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-img/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-img/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-img/wd-img.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-index-anchor/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-index-anchor/type.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-index-anchor/wd-index-anchor.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-index-bar/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-index-bar/type.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-index-bar/wd-index-bar.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-input-number/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-input-number/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-input-number/wd-input-number.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-input/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-input/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-input/wd-input.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-keyboard/constants.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-keyboard/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-keyboard/key/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-keyboard/key/index.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-keyboard/key/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-keyboard/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-keyboard/wd-keyboard.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-loading/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-loading/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-loading/wd-loading.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-loadmore/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-loadmore/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-loadmore/wd-loadmore.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-message-box/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-message-box/index.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-message-box/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-message-box/wd-message-box.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-navbar-capsule/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-navbar-capsule/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-navbar-capsule/wd-navbar-capsule.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-navbar/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-navbar/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-navbar/wd-navbar.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-notice-bar/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-notice-bar/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-notice-bar/wd-notice-bar.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-notify/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-notify/index.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-notify/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-notify/wd-notify.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-number-keyboard/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-number-keyboard/key/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-number-keyboard/key/index.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-number-keyboard/key/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-number-keyboard/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-number-keyboard/wd-number-keyboard.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-overlay/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-overlay/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-overlay/wd-overlay.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-pagination/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-pagination/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-pagination/wd-pagination.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-password-input/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-password-input/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-password-input/wd-password-input.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-picker-view/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-picker-view/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-picker-view/wd-picker-view.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-picker/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-picker/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-picker/wd-picker.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-popover/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-popover/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-popover/wd-popover.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-popup/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-popup/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-popup/wd-popup.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-progress/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-progress/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-progress/wd-progress.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-radio-group/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-radio-group/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-radio-group/wd-radio-group.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-radio/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-radio/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-radio/wd-radio.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-rate/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-rate/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-rate/wd-rate.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-resize/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-resize/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-resize/wd-resize.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-row/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-row/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-row/wd-row.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-search/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-search/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-search/wd-search.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-segmented/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-segmented/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-segmented/wd-segmented.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-select-picker/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-select-picker/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-select-picker/wd-select-picker.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-sidebar-item/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-sidebar-item/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-sidebar-item/wd-sidebar-item.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-sidebar/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-sidebar/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-sidebar/wd-sidebar.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-signature/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-signature/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-signature/wd-signature.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-skeleton/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-skeleton/index.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-skeleton/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-skeleton/wd-skeleton.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-slider/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-slider/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-slider/wd-slider.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-sort-button/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-sort-button/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-sort-button/wd-sort-button.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-status-tip/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-status-tip/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-status-tip/wd-status-tip.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-step/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-step/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-step/wd-step.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-steps/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-steps/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-steps/wd-steps.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-sticky-box/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-sticky-box/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-sticky-box/wd-sticky-box.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-sticky/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-sticky/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-sticky/wd-sticky.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-swipe-action/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-swipe-action/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-swipe-action/wd-swipe-action.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-swiper-nav/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-swiper-nav/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-swiper-nav/wd-swiper-nav.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-swiper/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-swiper/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-swiper/wd-swiper.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-switch/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-switch/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-switch/wd-switch.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-tab/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-tab/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-tab/wd-tab.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-tabbar-item/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-tabbar-item/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-tabbar-item/wd-tabbar-item.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-tabbar/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-tabbar/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-tabbar/wd-tabbar.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-table-col/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-table-col/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-table-col/wd-table-col.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-table/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-table/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-table/wd-table.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-tabs/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-tabs/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-tabs/wd-tabs.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-tag/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-tag/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-tag/wd-tag.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-text/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-text/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-text/wd-text.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-textarea/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-textarea/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-textarea/wd-textarea.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-toast/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-toast/index.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-toast/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-toast/wd-toast.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-tooltip/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-tooltip/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-tooltip/wd-tooltip.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-transition/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-transition/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-transition/wd-transition.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-upload/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-upload/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-upload/utils.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-upload/wd-upload.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-video-preview/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-video-preview/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-video-preview/wd-video-preview.vue
create mode 100644 uni_modules/wot-design-uni/components/wd-watermark/index.scss
create mode 100644 uni_modules/wot-design-uni/components/wd-watermark/types.ts
create mode 100644 uni_modules/wot-design-uni/components/wd-watermark/wd-watermark.vue
create mode 100644 uni_modules/wot-design-uni/components/wot-design-uni/wot-design-uni.vue
create mode 100644 uni_modules/wot-design-uni/global.d.ts
create mode 100644 uni_modules/wot-design-uni/index.ts
create mode 100644 uni_modules/wot-design-uni/locale/index.ts
create mode 100644 uni_modules/wot-design-uni/locale/lang/ar-SA.ts
create mode 100644 uni_modules/wot-design-uni/locale/lang/de-DE.ts
create mode 100644 uni_modules/wot-design-uni/locale/lang/en-US.ts
create mode 100644 uni_modules/wot-design-uni/locale/lang/es-ES.ts
create mode 100644 uni_modules/wot-design-uni/locale/lang/fr-FR.ts
create mode 100644 uni_modules/wot-design-uni/locale/lang/ja-JP.ts
create mode 100644 uni_modules/wot-design-uni/locale/lang/ko-KR.ts
create mode 100644 uni_modules/wot-design-uni/locale/lang/pt-PT.ts
create mode 100644 uni_modules/wot-design-uni/locale/lang/ru-RU.ts
create mode 100644 uni_modules/wot-design-uni/locale/lang/th-TH.ts
create mode 100644 uni_modules/wot-design-uni/locale/lang/tr-TR.ts
create mode 100644 uni_modules/wot-design-uni/locale/lang/vi-VN.ts
create mode 100644 uni_modules/wot-design-uni/locale/lang/zh-CN.ts
create mode 100644 uni_modules/wot-design-uni/locale/lang/zh-HK.ts
create mode 100644 uni_modules/wot-design-uni/locale/lang/zh-TW.ts
create mode 100644 uni_modules/wot-design-uni/package.json
create mode 100644 uni_modules/wot-design-uni/readme.md
create mode 100644 unocss/a-hua-unocss/class-name.scss
create mode 100644 unocss/a-hua-unocss/class-name.vue
create mode 100644 unocss/a-hua-unocss/index.d.ts
create mode 100644 unocss/a-hua-unocss/index.js
create mode 100644 unocss/a-hua-unocss/index.scss
create mode 100644 unocss/a-hua-unocss/index.uts
create mode 100644 unocss/a-hua-unocss/package.json
create mode 100644 unocss/vite.config.ts
create mode 100644 utils/auth.ts
create mode 100644 utils/checkout-return.ts
create mode 100644 utils/common.ts
create mode 100644 utils/device.ts
create mode 100644 utils/http.ts
create mode 100644 utils/merchant-context.ts
create mode 100644 utils/request.ts
create mode 100644 utils/storage.ts
create mode 100644 utils/wxpay.ts
create mode 100644 vite.config.ts
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..92a5931
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,26 @@
+.DS_Store
+node_modules
+/dist
+
+# local env files
+.env.local
+.env.*.local
+
+# Log files
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+
+# Editor directories and files
+.idea
+.vscode
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
+
+/package-lock.json
+.hbuilder
+unpackage
\ No newline at end of file
diff --git a/App.vue b/App.vue
new file mode 100644
index 0000000..dc14da3
--- /dev/null
+++ b/App.vue
@@ -0,0 +1,5 @@
+
diff --git a/api/auth.ts b/api/auth.ts
new file mode 100644
index 0000000..8af9668
--- /dev/null
+++ b/api/auth.ts
@@ -0,0 +1,99 @@
+import { APP_CONFIG } from '@/config';
+import { HttpStatusError, httpRequest, toFormUrlEncoded } from '@/utils/http';
+import { get, postForm } from '@/utils/request';
+
+export interface LoginResponse {
+ code: number | string;
+ msg?: string;
+ data?: {
+ token?: string;
+ expires_in?: number;
+ };
+}
+
+export type LoginPlatform = 'mp-weixin' | 'mp-alipay';
+
+export const resolveLoginPlatform = (): LoginPlatform => {
+ // #ifdef MP-ALIPAY
+ return 'mp-alipay';
+ // #endif
+
+ // #ifdef MP-WEIXIN
+ return 'mp-weixin';
+ // #endif
+
+ // #ifndef MP-WEIXIN
+ // #ifndef MP-ALIPAY
+ return 'mp-weixin';
+ // #endif
+ // #endif
+};
+
+/** 微信 code / 支付宝 authCode 都走同一登录接口 */
+export const loginByCode = async (code: string) => {
+ const response = await httpRequest({
+ url: `${APP_CONFIG.API_BASE_URL}/user/v3/login.code`,
+ method: 'POST',
+ data: toFormUrlEncoded({
+ code,
+ app_id: APP_CONFIG.APP_ID,
+ platform: resolveLoginPlatform()
+ }),
+ header: {
+ 'content-type': 'application/x-www-form-urlencoded'
+ }
+ });
+
+ if (response.statusCode < 200 || response.statusCode >= 300) {
+ throw new HttpStatusError('登录请求失败', response.statusCode, response.data);
+ }
+
+ return response.data;
+};
+
+/** @deprecated 使用 loginByCode */
+export const loginByWechatCode = loginByCode;
+
+export interface BindMobileResponse {
+ code: number | string;
+ msg?: string;
+ data?: {
+ token?: string;
+ expires_in?: number;
+ code?: string;
+ msg?: string;
+ mobile?: string;
+ };
+}
+
+/**
+ * 支付宝手机号绑定。
+ * encryptedData = my.getPhoneNumber 成功回调里 response.response(解密密文)
+ * 需登录态:走 postForm,自动带 Authorization: Bearer
+ */
+export const bindMobile = (encryptedData: string) => {
+ return postForm('user/v1/bind.mobile', {
+ encryptedData,
+ app_id: APP_CONFIG.APP_ID,
+ platform: resolveLoginPlatform()
+ });
+};
+
+export interface OpenInfoResult {
+ code: number | string;
+ msg?: string;
+ data?: {
+ user?: {
+ user_id?: number | string;
+ user_name?: string;
+ avatar?: string;
+ };
+ open?: {
+ user_id?: number | string;
+ open_id?: number | string;
+ };
+ };
+}
+
+/** 当前登录用户信息;有 user_id 视为已绑定过手机号/账号资料 */
+export const fetchOpenInfo = () => get('user/v1/open.info');
diff --git a/api/cashier.ts b/api/cashier.ts
new file mode 100644
index 0000000..7013603
--- /dev/null
+++ b/api/cashier.ts
@@ -0,0 +1,204 @@
+import { get, post, postForm } from '../utils/request';
+import { resolveLoginPlatform } from './auth';
+
+export interface MerchantConfigQuery {
+ merchant_id?: string;
+ scene?: string;
+}
+
+export interface CashierOrderPayload {
+ merchant_id?: string;
+ amount: string;
+ remark?: string;
+ house_id?: string;
+}
+
+export interface CashierOrderResult {
+ order_id: string;
+}
+
+export interface CashierPayResult {
+ timeStamp: string;
+ nonceStr: string;
+ package: string;
+ signType: string;
+ paySign: string;
+}
+
+export interface BoundMerchantInfo {
+ merchant_id?: string;
+ merchant_name?: string;
+ config?: {
+ score_name?: string;
+ };
+ merchant?: {
+ merchant_id?: string;
+ merchant_name?: string;
+ config?: {
+ score_name?: string;
+ };
+ };
+ supplier?: {
+ fee_rate?: string | number;
+ };
+ fee_rate?: string | number;
+}
+
+export interface SupplierInfo {
+ supplier_id?: string | number;
+ supplier_name?: string;
+ logo?: string;
+ fee_rate?: string | number;
+ supplier?: {
+ supplier_id?: string | number;
+ supplier_name?: string;
+ logo?: string;
+ fee_rate?: string | number;
+ };
+}
+
+export interface MerchantListItem {
+ merchant_id: string | number;
+ merchant_name: string;
+}
+
+export interface ApiResult {
+ code: number | string;
+ msg?: string;
+ data?: T;
+}
+
+export interface TradeQueryResult {
+ order_id?: number | string;
+ trade_no?: string;
+ pay_status?: number;
+ pay_type?: number;
+ total_money?: string;
+ reduce_money?: string;
+ real_money?: string;
+}
+
+export interface TradeListItem {
+ trade_no: string;
+ pay_status: number;
+ real_money: string;
+ merchant_id?: number | string;
+ create_time?: string;
+ wuye_money?: string;
+ pay_time?: string | null;
+ refund_time?: string | null;
+ pay_type?: number;
+ supplier_name?: string;
+}
+
+export interface TradeListQuery {
+ trade_no?: string;
+ page?: number | string;
+ limit?: number | string;
+}
+
+export interface PlatformScoreResult {
+ score?: string | number;
+}
+
+export interface ScoreRecordItem {
+ id?: string | number;
+ score?: string | number;
+ change_score?: string | number;
+ type?: string | number;
+ remark?: string;
+ create_time?: string;
+ [key: string]: unknown;
+}
+
+export interface ScoreRecordQuery {
+ page?: number | string;
+ limit?: number | string;
+}
+
+export interface CashTradeInfo {
+ trade_no?: string;
+ pay_status?: number;
+ pay_type?: number;
+ total_money?: string;
+ reduce_money?: string;
+ real_money?: string;
+ merchant_id?: number | string;
+ supplier_id?: number | string;
+ timeout?: number;
+ create_time?: string;
+}
+
+export interface CashTradeInfoResult {
+ trade?: CashTradeInfo;
+ body?: string;
+ subject?: string;
+}
+
+export interface CashTradePayPayload {
+ trade_no: string;
+ platform?: string;
+ remark?: string;
+}
+
+export interface CashTradePayResult {
+ trade_no?: string;
+ app_id?: string;
+ timestamp?: string;
+ nonce_str?: string;
+ package?: string;
+ sign_type?: string;
+ pay_sign?: string;
+}
+
+export const merchantConfig = (data: MerchantConfigQuery = {}) => get('v1/cashier/merchant', data);
+
+export const createCashierOrder = (data: CashierOrderPayload) =>
+ post>('v1/cashier/order/create', data);
+
+export const cashierPay = (data: { order_id: string }) => post>('v1/cashier/pay', data);
+
+export const cashierRecordList = (data: any = {}) => get('v1/cashier/records', data);
+
+export const tradeList = (data: TradeListQuery = {}) =>
+ get>('user/v1/trade.list', {
+ trade_no: data.trade_no != null ? data.trade_no : '',
+ page: data.page != null ? data.page : 1,
+ limit: data.limit != null ? data.limit : 10
+ });
+
+export const bindMerchantByUrl = (url: string) =>
+ get>('user/v1/bing.merchant', { url });
+
+export const supplierByUrl = (url: string) =>
+ get>('user/v1/supplier', { url });
+
+export const merchantListByUrl = (url: string) =>
+ get>('user/v1/merchant.list', { url });
+
+export const changeMerchant = (data: { merchant_id: string | number; url: string }) =>
+ postForm('user/v1/merchant.change', data);
+
+export const queryTrade = (tradeNo: string) =>
+ get>('user/v1/trade/query', { trade_no: tradeNo });
+
+export const cancelTrade = (tradeNo: string) =>
+ get('user/v1/trade/cancel', { trade_no: tradeNo });
+
+export const platformScore = () => get>('user/v1/platform.score');
+
+export const platformScoreRecord = (data: ScoreRecordQuery = {}) =>
+ get>('user/v1/platform.score.record', {
+ page: data.page != null ? data.page : 1,
+ limit: data.limit != null ? data.limit : 10
+ });
+
+export const cashTradeInfo = (tradeNo: string) =>
+ get>('user/v1/cash.trade.info', { trade_no: tradeNo });
+
+export const cashTradePay = (data: CashTradePayPayload) =>
+ post>('user/v1/cash.trade', {
+ trade_no: data.trade_no,
+ platform: data.platform != null ? data.platform : resolveLoginPlatform(),
+ remark: data.remark != null ? data.remark : ''
+ });
diff --git a/components/ScreenPlayer/ScreenPlayer.vue b/components/ScreenPlayer/ScreenPlayer.vue
new file mode 100644
index 0000000..ec0cb53
--- /dev/null
+++ b/components/ScreenPlayer/ScreenPlayer.vue
@@ -0,0 +1,94 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/config/index.ts b/config/index.ts
new file mode 100644
index 0000000..bdb7305
--- /dev/null
+++ b/config/index.ts
@@ -0,0 +1,44 @@
+// #ifdef MP-ALIPAY
+// const APP_ID = '123019';
+const APP_ID = '12317';
+// #endif
+// #ifdef MP-WEIXIN
+// const APP_ID = '123018';
+const APP_ID = '12316';
+// #endif
+// #ifndef MP-WEIXIN
+// #ifndef MP-ALIPAY
+// const APP_ID = '123018';
+const APP_ID = '12316';
+// #endif
+// #endif
+
+export const APP_CONFIG = {
+ API_BASE_URL: 'https://api.leapy.cn',
+ APP_ID,
+ RESOURCE_URL: 'https://resource.leapy.cn/staff/',
+ PROPERTY_IMG_URL: 'https://resource.leapy.cn/',
+ STORAGE_TOKEN_KEY: 'cashier:auth:token',
+ // 小程序代码可被反编译,密钥仅用于避免 token 明文落盘,不替代服务端的有效期与失效策略。
+ STORAGE_ENCRYPTION_KEY: 'cashier-storage-key-v1-32'
+} as const;
+
+export const PROPERTY_APP = {
+ APP_ID: 'wx42076f086669c49e',
+ /** 物业微信小程序对外名称,支付宝端引导复制用 */
+ WECHAT_NAME: '乐享云空间服务',
+ /** 物业支付宝小程序 appId,配置后支付宝端可跳转 */
+ ALIPAY_APP_ID: '',
+ BIND_HOUSE_PATH: 'pagesC/certification/index?from=cashier',
+ MINE_PATH: 'pages/mine/mine',
+ /** 物业抵扣金页(微信端入口) */
+ POINTS_PATH: 'pagesE/points/index',
+ WECHAT_APP_ID: 'wx02de0e1de9f4bda3'
+} as const;
+
+export const DEFAULT_MERCHANT = {
+ id: '',
+ name: '上海大观园',
+ background: 'https://dev.api.leapy.cn/upload/202606/26/e3ce560c144a106fa6e41af2118bc208.jpg',
+ accumulationRate: 0
+} as const;
diff --git a/config/terminal.ts b/config/terminal.ts
new file mode 100644
index 0000000..c8c5fde
--- /dev/null
+++ b/config/terminal.ts
@@ -0,0 +1,7 @@
+export const TERMINAL_CONFIG = {
+ /** 发布 APK 前切换为 false,并填写正式绑定域名。 */
+ useMock: true,
+ bindPageUrl: 'https://screen-dev.wallace.example.com/bind',
+ bindingPollIntervalMs: 10_000,
+ mockAutoBindAfterMs: 15_000
+} as const
diff --git a/docs/广告机实现方案.md b/docs/广告机实现方案.md
new file mode 100644
index 0000000..e1ed9ff
--- /dev/null
+++ b/docs/广告机实现方案.md
@@ -0,0 +1,104 @@
+# 华莱士门店电视广告机:一期实现方案
+
+## 一期目标
+
+交付一个 Android APK,安装在门店电视或广告屏上后始终横屏全屏运行。终端首次开机显示绑定二维码;门店通过小程序扫码完成设备与门店绑定;绑定完成后,终端按后台下发的顺序循环播放图片和视频广告。
+
+一期不做终端侧人工操作、广告编辑或门店管理,这些能力全部由后台或小程序承接。
+
+## 终端状态
+
+1. **初始化**:生成并持久化唯一设备标识 `sn`。Android App 优先读取 DCloud 的 `plus.device.uuid`;它不可用时才生成应用级随机编号并保存在本地。
+2. **待绑定**:二维码内容为完整 HTTPS 绑定链接,例如 `https://screen.example.com/bind?sn=WLS-xxx`。每 10 秒查询一次绑定状态。
+3. **拉取节目单**:绑定成功后,获取门店信息、终端授权信息和广告节目单。
+4. **播放中**:图片按 `duration` 停留,视频播放至结束;每项播放完毕后切换到下一项。
+5. **刷新节目单**:完整播放一轮后重新拉取节目单;后台也可在响应中返回 `refresh_interval`,用于定时刷新。
+6. **异常/离线**:保留最近一次有效节目单和媒体缓存;网络恢复后自动同步。没有可播放素材时显示简洁的门店品牌待机页。
+
+## 建议接口约定
+
+### 查询绑定状态
+
+`GET /screen/v1/devices/{sn}/binding`
+
+```json
+{
+ "code": 200,
+ "data": {
+ "bound": true,
+ "store_id": "WALLACE-001",
+ "token": "terminal-token"
+ }
+}
+```
+
+### 获取节目单
+
+`GET /screen/v1/playlists/current?sn={sn}`
+
+```json
+{
+ "code": 200,
+ "data": {
+ "revision": "20260820-01",
+ "refresh_interval": 300,
+ "items": [
+ {
+ "id": "creative-001",
+ "type": "image",
+ "url": "https://cdn.example.com/creative-001.jpg",
+ "duration": 8,
+ "checksum": "sha256..."
+ },
+ {
+ "id": "creative-002",
+ "type": "video",
+ "url": "https://cdn.example.com/creative-002.mp4"
+ }
+ ]
+ }
+}
+```
+
+规则:`type` 仅允许 `image`、`video`;图片的 `duration` 单位为秒且必须大于 0;视频由其实际时长决定切换。节目单必须携带版本号和素材校验值,便于终端判断是否需要下载更新。
+
+## 当前 Mock 实现
+
+- 配置位于 `config/terminal.ts`,当前 `useMock: true`。
+- 终端会生成 `WLS-` 前缀的 `sn`,并将 `bindPageUrl` 与 `sn` 拼成二维码内容。
+- 待绑定页提供“模拟完成绑定”按钮,且默认 15 秒后自动模拟绑定,方便电视端演示。
+- Mock 节目单为“图片 → 视频 → 图片”,完整播放一轮后重新读取节目单。
+- Mock 阶段二维码图片由公共二维码服务渲染;正式发布前应替换为内置二维码组件,避免依赖第三方二维码服务。
+- 后端就绪时,将 `useMock` 改为 `false`,并在 `services/terminal.ts` 的两个方法中接入绑定状态、节目单正式接口。
+
+## 终端实现划分
+
+- `services/device`:生成、读取和存储设备 `sn`;Android 优先使用系统稳定标识并派生应用设备号。
+- `services/binding`:绑定状态轮询、终端令牌管理和门店信息读取。
+- `services/playlist`:节目单请求、数据校验、版本比对和本地持久化。
+- `services/media-cache`:下载媒体、校验 checksum、清理过期缓存,并始终保留当前节目单。
+- `components/ScreenPlayer`:统一渲染图片、视频、加载失败占位和下一项预加载。
+- `pages/index`:按终端状态装配“待绑定”和“播放”两个状态视图,不提供业务导航。
+
+## 播放与可靠性规则
+
+1. 切换前预加载下一张图片或下一个视频,避免黑屏。
+2. 视频监听 `ended`、`error`、超时三种事件;失败时记录并跳过,不能阻塞整个节目单。
+3. 单个素材连续失败 3 次后,本轮播放忽略该素材;下一次节目单更新后重新尝试。
+4. 所有网络请求采用指数退避重试;无网络时继续播放已缓存内容。
+5. 进入播放页后隐藏状态栏和导航栏,禁用旋转回竖屏,按 16:9 容器等比裁切显示。
+6. 终端只展示必要状态:未绑定二维码、加载中、无可播放内容;不暴露接口地址、令牌或调试信息。
+
+## 实施顺序
+
+1. 对接绑定状态接口,完成设备号、二维码和轮询状态页。
+2. 对接节目单接口,完成图片/视频顺序播放和整轮刷新。
+3. 加入媒体预加载、离线缓存、失败跳过和网络恢复。
+4. 在目标电视设备上验证横屏全屏、自启动、断网恢复、连续播放和 APK 签名发布。
+
+## 需后台确认
+
+- 绑定二维码最终使用的正式域名/小程序跳转规则。
+- 设备与门店解绑、换店、禁用设备的接口和状态码。
+- 节目单素材 CDN、视频格式上限、有效期和审核策略。
+- 需要 Android 开机自启动和受控保活:APK 侧需由原生 Android Receiver/厂商白名单或 MDM 触发开机拉起;电视/机顶盒侧推荐纳入 MDM 的 kiosk(单应用)策略。仅申请 `RECEIVE_BOOT_COMPLETED` 权限不足以保证各品牌设备可自启动,必须在目标设备实测并按厂商策略配置。
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..170b24a
--- /dev/null
+++ b/index.html
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/main.ts b/main.ts
new file mode 100644
index 0000000..46a0a53
--- /dev/null
+++ b/main.ts
@@ -0,0 +1,21 @@
+import App from './App'
+
+// #ifndef VUE3
+import Vue from 'vue'
+import './uni.promisify.adaptor'
+Vue.config.productionTip = false
+App.mpType = 'app'
+const app = new Vue({
+ ...App
+})
+app.$mount()
+// #endif
+
+// #ifdef VUE3
+import { createSSRApp } from 'vue'
+
+export function createApp() {
+ const app = createSSRApp(App)
+ return { app }
+}
+// #endif
diff --git a/manifest.json b/manifest.json
new file mode 100644
index 0000000..22959e1
--- /dev/null
+++ b/manifest.json
@@ -0,0 +1,18 @@
+{
+ "name": "华莱士广告机",
+ "appid": "__UNI__8B0C3F7",
+ "description": "华莱士门店电视广告播放终端",
+ "versionName": "1.0.0",
+ "versionCode": "100",
+ "transformPx": false,
+ "app-plus": {
+ "usingComponents": true,
+ "fullscreen": true,
+ "screenOrientation": ["landscape-primary", "landscape-secondary"]
+ },
+ "quickapp": {},
+ "uniStatistics": {
+ "enable": false
+ },
+ "vueVersion": "3"
+}
diff --git a/mini.project.json b/mini.project.json
new file mode 100644
index 0000000..dfdf786
--- /dev/null
+++ b/mini.project.json
@@ -0,0 +1,11 @@
+{
+ "format": 2,
+ "compileOptions": {
+ "component2": true,
+ "enableAppxNg": true,
+ "transpile": {}
+ },
+ "developOptions": {
+ "skipTranspile": true
+ }
+}
diff --git a/mock/pay-checkout.ts b/mock/pay-checkout.ts
new file mode 100644
index 0000000..0964f55
--- /dev/null
+++ b/mock/pay-checkout.ts
@@ -0,0 +1,47 @@
+export interface PayCheckoutOrder {
+ orderId: string;
+ tradeNo: string;
+ amount: string;
+ merchantName: string;
+ orderDesc: string;
+ remark: string;
+ expireAt: number;
+ payChannel: 'wxpay';
+}
+
+// Static mock for embedded checkout page; replace with API later.
+export const MOCK_PAY_CHECKOUT_ORDER: PayCheckoutOrder = {
+ orderId: 'mock-order-20260702001',
+ tradeNo: 'GSP202607021430001234',
+ amount: '1.25',
+ merchantName: '江南米粉',
+ orderDesc: '消费者付款',
+ remark: '',
+ expireAt: Date.now() + 5 * 60 * 1000,
+ payChannel: 'wxpay'
+};
+
+export const buildMockOrderFromOptions = (options: Record = {}): PayCheckoutOrder => {
+ const amount = options.amount || MOCK_PAY_CHECKOUT_ORDER.amount;
+ const expireSeconds = Number(options.expire_seconds || 300);
+
+ return {
+ orderId: options.order_id || options.orderId || MOCK_PAY_CHECKOUT_ORDER.orderId,
+ tradeNo: options.trade_no || options.tradeNo || MOCK_PAY_CHECKOUT_ORDER.tradeNo,
+ amount,
+ merchantName: decodeQuery(options.merchant_name || options.merchantName) || MOCK_PAY_CHECKOUT_ORDER.merchantName,
+ orderDesc: decodeQuery(options.order_desc || options.orderDesc) || MOCK_PAY_CHECKOUT_ORDER.orderDesc,
+ remark: decodeQuery(options.remark) || '',
+ expireAt: Date.now() + (Number.isFinite(expireSeconds) ? expireSeconds : 300) * 1000,
+ payChannel: 'wxpay'
+ };
+};
+
+const decodeQuery = (value?: string) => {
+ if (!value) return '';
+ try {
+ return decodeURIComponent(value);
+ } catch (error) {
+ return value;
+ }
+};
diff --git a/mock/terminal.ts b/mock/terminal.ts
new file mode 100644
index 0000000..e5179f8
--- /dev/null
+++ b/mock/terminal.ts
@@ -0,0 +1,36 @@
+import type { Playlist, TerminalBinding } from '@/types/terminal'
+
+const MOCK_BOUND_KEY = 'wallace:screen:mock-bound'
+
+export const getMockBinding = (): TerminalBinding => ({
+ bound: Boolean(uni.getStorageSync(MOCK_BOUND_KEY)),
+ storeName: '华莱士·演示门店',
+ token: 'mock-terminal-token'
+})
+
+export const completeMockBinding = () => {
+ uni.setStorageSync(MOCK_BOUND_KEY, true)
+}
+
+export const mockPlaylist: Playlist = {
+ revision: 'mock-20260820-01',
+ items: [
+ {
+ id: 'mock-image-1',
+ type: 'image',
+ url: 'https://images.unsplash.com/photo-1562967914-608f82629710?auto=format&fit=crop&w=1920&q=85',
+ duration: 8
+ },
+ {
+ id: 'mock-video-1',
+ type: 'video',
+ url: 'https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.mp4'
+ },
+ {
+ id: 'mock-image-2',
+ type: 'image',
+ url: 'https://images.unsplash.com/photo-1550547660-d9450f859349?auto=format&fit=crop&w=1920&q=85',
+ duration: 8
+ }
+ ]
+}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..5d5f313
--- /dev/null
+++ b/package.json
@@ -0,0 +1,7 @@
+{
+ "name": "wallace-screen-app",
+ "description": "华莱士门店电视广告播放终端",
+ "dependencies": {
+ "crypto-js": "^4.2.0"
+ }
+}
diff --git a/pages.json b/pages.json
new file mode 100644
index 0000000..32e7972
--- /dev/null
+++ b/pages.json
@@ -0,0 +1,18 @@
+{
+ "pages": [
+ {
+ "path": "pages/index/index",
+ "style": {
+ "navigationStyle": "custom",
+ "enablePullDownRefresh": false,
+ "disableScroll": true,
+ "backgroundColor": "#111111"
+ }
+ }
+ ],
+ "globalStyle": {
+ "navigationStyle": "custom",
+ "backgroundColor": "#111111"
+ },
+ "uniIdRouter": {}
+}
diff --git a/pages/index/index.vue b/pages/index/index.vue
new file mode 100644
index 0000000..683b2d6
--- /dev/null
+++ b/pages/index/index.vue
@@ -0,0 +1,190 @@
+
+
+
+
+
+ 华莱士
+
+
+ 绑定门店后即可播放
+
+ 请使用华莱士小程序扫码绑定本门店电视
+ 设备编号:{{ deviceSn }}
+
+
+
+
+ 广告终端启动中
+ 正在读取终端状态
+
+
+
+ 暂时无法播放广告
+ {{ errorMessage || '请检查网络连接后重试' }}
+
+
+
+
+
+
+
+
+
diff --git a/scripts/alipay-es-compat.js b/scripts/alipay-es-compat.js
new file mode 100644
index 0000000..0d731a7
--- /dev/null
+++ b/scripts/alipay-es-compat.js
@@ -0,0 +1,93 @@
+/**
+ * 可选:手动对支付宝产物再跑一遍降级。
+ * 日常「运行/发行到支付宝」会由 vite.config.ts 的 alipayEsCompatPlugin 自动处理。
+ *
+ * 用法:node scripts/alipay-es-compat.js [dir...]
+ */
+const fs = require('fs');
+const path = require('path');
+
+function resolveTransformSync() {
+ try {
+ return require('esbuild').transformSync;
+ } catch (error) {
+ try {
+ const vitePath = require.resolve('vite');
+ const esbuildPath = require.resolve('esbuild', { paths: [path.dirname(vitePath)] });
+ return require(esbuildPath).transformSync;
+ } catch (inner) {
+ throw new Error('找不到 esbuild,请先通过 vite/uni 运行支付宝构建,或安装 esbuild');
+ }
+ }
+}
+
+const transformSync = resolveTransformSync();
+
+const TRANSFORM_OPTIONS = {
+ loader: 'js',
+ target: 'es2015',
+ sourcemap: false,
+ supported: {
+ arrow: false,
+ 'template-literal': false,
+ 'optional-chain': false,
+ 'nullish-coalescing': false,
+ 'optional-catch-binding': false,
+ 'object-rest-spread': false,
+ 'class-field': false
+ }
+};
+
+function walkJsFiles(dir, files = []) {
+ if (!fs.existsSync(dir)) return files;
+ for (const name of fs.readdirSync(dir)) {
+ const fullPath = path.join(dir, name);
+ if (fs.statSync(fullPath).isDirectory()) {
+ walkJsFiles(fullPath, files);
+ } else if (name.endsWith('.js')) {
+ files.push(fullPath);
+ }
+ }
+ return files;
+}
+
+function needsTransform(source) {
+ return (
+ source.includes('=>') ||
+ source.includes('`') ||
+ source.includes('?.') ||
+ source.includes('??') ||
+ /catch\s*\{/.test(source)
+ );
+}
+
+function transformFile(filePath) {
+ const source = fs.readFileSync(filePath, 'utf8');
+ if (!needsTransform(source)) return false;
+ const result = transformSync(source, TRANSFORM_OPTIONS);
+ if (!result.code || result.code === source) return false;
+ fs.writeFileSync(filePath, result.code, 'utf8');
+ return true;
+}
+
+function run(roots) {
+ let changed = 0;
+ for (const root of roots) {
+ const abs = path.resolve(__dirname, '..', root);
+ for (const file of walkJsFiles(abs)) {
+ try {
+ if (transformFile(file)) changed += 1;
+ } catch (error) {
+ console.warn('[alipay-es-compat] skip', file, error && error.message);
+ }
+ }
+ }
+ console.log(`[alipay-es-compat] transformed ${changed} file(s)`);
+}
+
+const cliRoots = process.argv.slice(2);
+run(
+ cliRoots.length
+ ? cliRoots
+ : ['unpackage/dist/dev/mp-alipay', 'unpackage/dist/build/mp-alipay']
+);
diff --git a/services/terminal.ts b/services/terminal.ts
new file mode 100644
index 0000000..fc506ef
--- /dev/null
+++ b/services/terminal.ts
@@ -0,0 +1,31 @@
+import { TERMINAL_CONFIG } from '@/config/terminal'
+import { completeMockBinding, getMockBinding, mockPlaylist } from '@/mock/terminal'
+import type { Playlist, TerminalBinding } from '@/types/terminal'
+
+const wait = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms))
+
+/** 正式接口接入点:切换 useMock 后在此替换为 uni.request。 */
+export const fetchTerminalBinding = async (_sn: string): Promise => {
+ if (!TERMINAL_CONFIG.useMock) {
+ throw new Error('尚未配置广告机绑定接口')
+ }
+
+ await wait(350)
+ return getMockBinding()
+}
+
+/** 正式接口接入点:按 sn 请求后台下发的图片/视频节目单。 */
+export const fetchTerminalPlaylist = async (_sn: string): Promise => {
+ if (!TERMINAL_CONFIG.useMock) {
+ throw new Error('尚未配置广告机节目单接口')
+ }
+
+ await wait(350)
+ return mockPlaylist
+}
+
+export const bindMockTerminal = async () => {
+ if (!TERMINAL_CONFIG.useMock) return
+ completeMockBinding()
+ await wait(150)
+}
diff --git a/static/cashier/bg-image.png b/static/cashier/bg-image.png
new file mode 100644
index 0000000000000000000000000000000000000000..7f8e638b103882ba07d0e0e96efa3fb06f4bb04b
GIT binary patch
literal 878598
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