From ad64dc89053e629f52b38ebc9d9c3b886af6390a Mon Sep 17 00:00:00 2001 From: NVWA Bot Date: Thu, 11 Dec 2025 16:35:43 +0000 Subject: [PATCH] Init applications --- .gitignore | 43 + AGENTS.md | 7 + apps/cat-admin-web/.gitignore | 25 + apps/cat-admin-web/components.json | 21 + apps/cat-admin-web/eslint.config.js | 23 + apps/cat-admin-web/index.html | 13 + apps/cat-admin-web/overview.md | 10 + apps/cat-admin-web/package.json | 81 ++ apps/cat-admin-web/src/App.tsx | 62 + .../src/components/auth-router.tsx | 70 ++ apps/cat-admin-web/src/components/layout.tsx | 39 + .../src/components/ui/accordion.tsx | 64 + .../src/components/ui/alert-dialog.tsx | 155 +++ .../cat-admin-web/src/components/ui/alert.tsx | 66 + .../src/components/ui/aspect-ratio.tsx | 11 + .../src/components/ui/avatar.tsx | 51 + .../cat-admin-web/src/components/ui/badge.tsx | 46 + .../src/components/ui/breadcrumb.tsx | 109 ++ .../src/components/ui/button.tsx | 59 + .../src/components/ui/calendar.tsx | 213 ++++ apps/cat-admin-web/src/components/ui/card.tsx | 92 ++ .../src/components/ui/carousel.tsx | 239 ++++ .../cat-admin-web/src/components/ui/chart.tsx | 353 ++++++ .../src/components/ui/checkbox.tsx | 32 + .../src/components/ui/collapsible.tsx | 31 + .../src/components/ui/command.tsx | 182 +++ .../src/components/ui/context-menu.tsx | 252 ++++ .../src/components/ui/dialog.tsx | 141 +++ .../src/components/ui/drawer.tsx | 135 +++ .../src/components/ui/dropdown-menu.tsx | 255 ++++ apps/cat-admin-web/src/components/ui/form.tsx | 167 +++ .../src/components/ui/hover-card.tsx | 44 + .../src/components/ui/input-otp.tsx | 75 ++ .../cat-admin-web/src/components/ui/input.tsx | 21 + .../cat-admin-web/src/components/ui/label.tsx | 24 + .../src/components/ui/menubar.tsx | 274 +++++ .../src/components/ui/navigation-menu.tsx | 168 +++ .../src/components/ui/pagination.tsx | 127 ++ .../src/components/ui/popover.tsx | 48 + .../src/components/ui/progress.tsx | 29 + .../src/components/ui/radio-group.tsx | 45 + .../src/components/ui/resizable.tsx | 54 + .../src/components/ui/scroll-area.tsx | 58 + .../src/components/ui/select.tsx | 183 +++ .../src/components/ui/separator.tsx | 28 + .../cat-admin-web/src/components/ui/sheet.tsx | 137 +++ .../src/components/ui/sidebar.tsx | 726 +++++++++++ .../src/components/ui/skeleton.tsx | 13 + .../src/components/ui/slider.tsx | 63 + .../src/components/ui/sonner.tsx | 23 + .../src/components/ui/switch.tsx | 31 + .../cat-admin-web/src/components/ui/table.tsx | 114 ++ apps/cat-admin-web/src/components/ui/tabs.tsx | 66 + .../src/components/ui/textarea.tsx | 18 + .../src/components/ui/toggle-group.tsx | 71 ++ .../src/components/ui/toggle.tsx | 45 + .../src/components/ui/tooltip.tsx | 61 + .../src/custom/redirect-to-login.ts | 15 + apps/cat-admin-web/src/hooks/use-auth.ts | 72 ++ apps/cat-admin-web/src/hooks/use-mobile.ts | 19 + apps/cat-admin-web/src/index.css | 185 +++ apps/cat-admin-web/src/index.tsx | 10 + apps/cat-admin-web/src/lib/config.ts | 22 + apps/cat-admin-web/src/lib/nvwa.ts | 16 + apps/cat-admin-web/src/lib/utils.ts | 6 + apps/cat-admin-web/src/pages/index.tsx | 11 + apps/cat-admin-web/src/pages/user/login.tsx | 273 +++++ .../cat-admin-web/src/pages/user/register.tsx | 216 ++++ apps/cat-admin-web/src/static/react.svg | 1 + apps/cat-admin-web/src/vite-env.d.ts | 12 + apps/cat-admin-web/tsconfig.app.json | 34 + apps/cat-admin-web/tsconfig.json | 19 + apps/cat-admin-web/tsconfig.node.json | 25 + apps/cat-admin-web/vite.config.ts | 59 + apps/cat-mini-app/.gitignore | 22 + apps/cat-mini-app/index.html | 20 + apps/cat-mini-app/overview.md | 12 + apps/cat-mini-app/package.json | 81 ++ apps/cat-mini-app/shims-uni.d.ts | 10 + apps/cat-mini-app/src/App.vue | 52 + .../src/components/uni-badge/uni-badge.vue | 268 ++++ .../uni-breadcrumb-item.vue | 126 ++ .../uni-breadcrumb/uni-breadcrumb.vue | 46 + .../src/components/uni-calendar/calendar.js | 544 +++++++++ .../src/components/uni-calendar/i18n/en.json | 12 + .../src/components/uni-calendar/i18n/index.js | 8 + .../components/uni-calendar/i18n/zh-Hans.json | 12 + .../components/uni-calendar/i18n/zh-Hant.json | 12 + .../uni-calendar/uni-calendar-item.vue | 187 +++ .../components/uni-calendar/uni-calendar.vue | 570 +++++++++ .../src/components/uni-calendar/util.js | 360 ++++++ .../src/components/uni-card/uni-card.vue | 270 +++++ .../src/components/uni-col/uni-col.vue | 317 +++++ .../uni-collapse-item/uni-collapse-item.vue | 402 ++++++ .../components/uni-collapse/uni-collapse.vue | 147 +++ .../src/components/uni-combox/uni-combox.vue | 284 +++++ .../src/components/uni-countdown/i18n/en.json | 6 + .../components/uni-countdown/i18n/index.js | 8 + .../uni-countdown/i18n/zh-Hans.json | 6 + .../uni-countdown/i18n/zh-Hant.json | 6 + .../uni-countdown/uni-countdown.vue | 278 +++++ .../uni-data-checkbox/uni-data-checkbox.vue | 849 +++++++++++++ .../components/uni-data-picker/keypress.js | 45 + .../uni-data-picker/uni-data-picker.uvue | 380 ++++++ .../uni-data-picker/uni-data-picker.vue | 560 +++++++++ .../uni-data-pickerview/loading.uts | 1 + .../uni-data-pickerview/uni-data-picker.js | 622 ++++++++++ .../uni-data-pickerview/uni-data-picker.uts | 693 +++++++++++ .../uni-data-pickerview.css | 76 ++ .../uni-data-pickerview.uvue | 69 ++ .../uni-data-pickerview.vue | 323 +++++ .../uni-data-select/uni-data-select.vue | 837 +++++++++++++ .../components/uni-dateformat/date-format.js | 200 +++ .../uni-dateformat/uni-dateformat.vue | 88 ++ .../uni-datetime-picker/calendar-item.vue | 177 +++ .../uni-datetime-picker/calendar.vue | 947 +++++++++++++++ .../uni-datetime-picker/i18n/en.json | 22 + .../uni-datetime-picker/i18n/index.js | 8 + .../uni-datetime-picker/i18n/zh-Hans.json | 22 + .../uni-datetime-picker/i18n/zh-Hant.json | 22 + .../uni-datetime-picker/time-picker.vue | 940 +++++++++++++++ .../uni-datetime-picker.vue | 1073 +++++++++++++++++ .../components/uni-datetime-picker/util.js | 421 +++++++ .../src/components/uni-drawer/keypress.js | 45 + .../src/components/uni-drawer/uni-drawer.vue | 183 +++ .../src/components/uni-easyinput/common.js | 54 + .../uni-easyinput/uni-easyinput.vue | 661 ++++++++++ .../src/components/uni-fab/uni-fab.vue | 491 ++++++++ .../src/components/uni-fav/i18n/en.json | 4 + .../src/components/uni-fav/i18n/index.js | 8 + .../src/components/uni-fav/i18n/zh-Hans.json | 4 + .../src/components/uni-fav/i18n/zh-Hant.json | 4 + .../src/components/uni-fav/uni-fav.vue | 161 +++ .../uni-file-picker/choose-and-upload-file.js | 287 +++++ .../uni-file-picker/uni-file-picker.vue | 660 ++++++++++ .../uni-file-picker/upload-file.vue | 325 +++++ .../uni-file-picker/upload-image.vue | 282 +++++ .../src/components/uni-file-picker/utils.js | 110 ++ .../uni-forms-item/uni-forms-item.vue | 632 ++++++++++ .../src/components/uni-forms/uni-forms.vue | 404 +++++++ .../src/components/uni-forms/utils.js | 293 +++++ .../src/components/uni-forms/validate.js | 486 ++++++++ .../src/components/uni-goods-nav/i18n/en.json | 6 + .../components/uni-goods-nav/i18n/index.js | 8 + .../uni-goods-nav/i18n/zh-Hans.json | 6 + .../uni-goods-nav/i18n/zh-Hant.json | 6 + .../uni-goods-nav/uni-goods-nav.vue | 231 ++++ .../uni-grid-item/uni-grid-item.vue | 127 ++ .../src/components/uni-grid/uni-grid.vue | 142 +++ .../src/components/uni-group/uni-group.vue | 134 ++ .../src/components/uni-icons/uni-icons.uvue | 91 ++ .../src/components/uni-icons/uni-icons.vue | 110 ++ .../src/components/uni-icons/uniicons.css | 664 ++++++++++ .../src/components/uni-icons/uniicons.ttf | Bin 0 -> 35824 bytes .../src/components/uni-icons/uniicons_file.ts | 664 ++++++++++ .../components/uni-icons/uniicons_file_vue.js | 649 ++++++++++ .../uni-indexed-list-item.vue | 144 +++ .../uni-indexed-list/uni-indexed-list.vue | 367 ++++++ .../src/components/uni-link/uni-link.vue | 128 ++ .../components/uni-list-ad/uni-list-ad.vue | 107 ++ .../uni-list-chat/uni-list-chat.scss | 58 + .../uni-list-chat/uni-list-chat.vue | 593 +++++++++ .../uni-list-item/uni-list-item.vue | 542 +++++++++ .../src/components/uni-list/uni-list.vue | 123 ++ .../src/components/uni-list/uni-refresh.vue | 65 + .../src/components/uni-list/uni-refresh.wxs | 87 ++ .../src/components/uni-load-more/i18n/en.json | 5 + .../components/uni-load-more/i18n/index.js | 8 + .../uni-load-more/i18n/zh-Hans.json | 5 + .../uni-load-more/i18n/zh-Hant.json | 5 + .../uni-load-more/uni-load-more.vue | 404 +++++++ .../components/uni-nav-bar/uni-nav-bar.vue | 382 ++++++ .../components/uni-nav-bar/uni-status-bar.vue | 30 + .../uni-notice-bar/uni-notice-bar.vue | 423 +++++++ .../uni-number-box/uni-number-box.vue | 232 ++++ .../components/uni-pagination/i18n/en.json | 5 + .../components/uni-pagination/i18n/es.json | 5 + .../components/uni-pagination/i18n/fr.json | 5 + .../components/uni-pagination/i18n/index.js | 12 + .../uni-pagination/i18n/zh-Hans.json | 5 + .../uni-pagination/i18n/zh-Hant.json | 5 + .../uni-pagination/uni-pagination.vue | 465 +++++++ .../components/uni-popup-dialog/keypress.js | 45 + .../uni-popup-dialog/uni-popup-dialog.vue | 330 +++++ .../uni-popup-message/uni-popup-message.vue | 143 +++ .../uni-popup-share/uni-popup-share.vue | 188 +++ .../src/components/uni-popup/i18n/en.json | 7 + .../src/components/uni-popup/i18n/index.js | 8 + .../components/uni-popup/i18n/zh-Hans.json | 7 + .../components/uni-popup/i18n/zh-Hant.json | 7 + .../src/components/uni-popup/keypress.js | 45 + .../src/components/uni-popup/popup.js | 26 + .../src/components/uni-popup/uni-popup.uvue | 90 ++ .../src/components/uni-popup/uni-popup.vue | 518 ++++++++ .../src/components/uni-rate/uni-rate.vue | 361 ++++++ .../src/components/uni-row/uni-row.vue | 190 +++ .../src/components/uni-scss/changelog.md | 8 + .../src/components/uni-scss/index.scss | 1 + .../src/components/uni-scss/package.json | 99 ++ .../src/components/uni-scss/readme.md | 4 + .../src/components/uni-scss/styles/index.scss | 7 + .../uni-scss/styles/setting/_border.scss | 3 + .../uni-scss/styles/setting/_color.scss | 66 + .../uni-scss/styles/setting/_radius.scss | 55 + .../uni-scss/styles/setting/_space.scss | 56 + .../uni-scss/styles/setting/_styles.scss | 167 +++ .../uni-scss/styles/setting/_text.scss | 24 + .../uni-scss/styles/setting/_variables.scss | 146 +++ .../uni-scss/styles/tools/functions.scss | 19 + .../src/components/uni-scss/theme.scss | 31 + .../src/components/uni-scss/variables.scss | 62 + .../components/uni-search-bar/i18n/en.json | 4 + .../components/uni-search-bar/i18n/index.js | 8 + .../uni-search-bar/i18n/zh-Hans.json | 4 + .../uni-search-bar/i18n/zh-Hant.json | 4 + .../uni-search-bar/uni-search-bar.vue | 309 +++++ .../components/uni-section/uni-section.vue | 167 +++ .../uni-segmented-control.vue | 146 +++ .../src/components/uni-steps/uni-steps.vue | 280 +++++ .../uni-swipe-action-item/bindingx.js | 302 +++++ .../components/uni-swipe-action-item/isPC.js | 12 + .../uni-swipe-action-item/mpalipay.js | 195 +++ .../uni-swipe-action-item/mpother.js | 260 ++++ .../components/uni-swipe-action-item/mpwxs.js | 84 ++ .../uni-swipe-action-item/render.js | 277 +++++ .../uni-swipe-action-item.vue | 348 ++++++ .../components/uni-swipe-action-item/wx.wxs | 349 ++++++ .../uni-swipe-action/uni-swipe-action.vue | 60 + .../uni-swiper-dot/uni-swiper-dot.vue | 218 ++++ .../src/components/uni-table/uni-table.vue | 460 +++++++ .../src/components/uni-tag/uni-tag.vue | 255 ++++ .../src/components/uni-tbody/uni-tbody.vue | 34 + .../src/components/uni-td/uni-td.vue | 95 ++ .../src/components/uni-th/filter-dropdown.vue | 511 ++++++++ .../src/components/uni-th/uni-th.vue | 295 +++++ .../src/components/uni-thead/uni-thead.vue | 137 +++ .../src/components/uni-title/uni-title.vue | 171 +++ .../components/uni-tooltip/uni-tooltip.vue | 109 ++ .../src/components/uni-tr/table-checkbox.vue | 179 +++ .../src/components/uni-tr/uni-tr.vue | 184 +++ .../uni-transition/createAnimation.js | 131 ++ .../uni-transition/uni-transition.vue | 292 +++++ .../src/custom/redirect-to-login.ts | 33 + apps/cat-mini-app/src/env.d.ts | 8 + apps/cat-mini-app/src/lib/config.ts | 21 + apps/cat-mini-app/src/lib/nvwa.ts | 16 + apps/cat-mini-app/src/main.css | 2 + apps/cat-mini-app/src/main.ts | 8 + apps/cat-mini-app/src/manifest.json | 72 ++ apps/cat-mini-app/src/pages.json | 28 + apps/cat-mini-app/src/pages/home.vue | 37 + apps/cat-mini-app/src/pages/user/login.vue | 214 ++++ apps/cat-mini-app/src/pages/user/register.vue | 213 ++++ apps/cat-mini-app/src/shime-uni.d.ts | 6 + apps/cat-mini-app/src/static/logo.png | Bin 0 -> 40584 bytes apps/cat-mini-app/src/uni.scss | 76 ++ apps/cat-mini-app/tsconfig.json | 15 + apps/cat-mini-app/vite.config.ts | 59 + database/common.ts | 7 + database/schema/auth.db.ts | 74 ++ database/schema/basic.db.ts | 14 + database/schema/project.db.ts | 38 + package.json | 13 + pnpm-lock.yaml | 836 +++++++++++++ pnpm-workspace.yaml | 3 + 265 files changed, 41557 insertions(+) create mode 100644 .gitignore create mode 100644 AGENTS.md create mode 100644 apps/cat-admin-web/.gitignore create mode 100644 apps/cat-admin-web/components.json create mode 100644 apps/cat-admin-web/eslint.config.js create mode 100644 apps/cat-admin-web/index.html create mode 100644 apps/cat-admin-web/overview.md create mode 100644 apps/cat-admin-web/package.json create mode 100644 apps/cat-admin-web/src/App.tsx create mode 100644 apps/cat-admin-web/src/components/auth-router.tsx create mode 100644 apps/cat-admin-web/src/components/layout.tsx create mode 100644 apps/cat-admin-web/src/components/ui/accordion.tsx create mode 100644 apps/cat-admin-web/src/components/ui/alert-dialog.tsx create mode 100644 apps/cat-admin-web/src/components/ui/alert.tsx create mode 100644 apps/cat-admin-web/src/components/ui/aspect-ratio.tsx create mode 100644 apps/cat-admin-web/src/components/ui/avatar.tsx create mode 100644 apps/cat-admin-web/src/components/ui/badge.tsx create mode 100644 apps/cat-admin-web/src/components/ui/breadcrumb.tsx create mode 100644 apps/cat-admin-web/src/components/ui/button.tsx create mode 100644 apps/cat-admin-web/src/components/ui/calendar.tsx create mode 100644 apps/cat-admin-web/src/components/ui/card.tsx create mode 100644 apps/cat-admin-web/src/components/ui/carousel.tsx create mode 100644 apps/cat-admin-web/src/components/ui/chart.tsx create mode 100644 apps/cat-admin-web/src/components/ui/checkbox.tsx create mode 100644 apps/cat-admin-web/src/components/ui/collapsible.tsx create mode 100644 apps/cat-admin-web/src/components/ui/command.tsx create mode 100644 apps/cat-admin-web/src/components/ui/context-menu.tsx create mode 100644 apps/cat-admin-web/src/components/ui/dialog.tsx create mode 100644 apps/cat-admin-web/src/components/ui/drawer.tsx create mode 100644 apps/cat-admin-web/src/components/ui/dropdown-menu.tsx create mode 100644 apps/cat-admin-web/src/components/ui/form.tsx create mode 100644 apps/cat-admin-web/src/components/ui/hover-card.tsx create mode 100644 apps/cat-admin-web/src/components/ui/input-otp.tsx create mode 100644 apps/cat-admin-web/src/components/ui/input.tsx create mode 100644 apps/cat-admin-web/src/components/ui/label.tsx create mode 100644 apps/cat-admin-web/src/components/ui/menubar.tsx create mode 100644 apps/cat-admin-web/src/components/ui/navigation-menu.tsx create mode 100644 apps/cat-admin-web/src/components/ui/pagination.tsx create mode 100644 apps/cat-admin-web/src/components/ui/popover.tsx create mode 100644 apps/cat-admin-web/src/components/ui/progress.tsx create mode 100644 apps/cat-admin-web/src/components/ui/radio-group.tsx create mode 100644 apps/cat-admin-web/src/components/ui/resizable.tsx create mode 100644 apps/cat-admin-web/src/components/ui/scroll-area.tsx create mode 100644 apps/cat-admin-web/src/components/ui/select.tsx create mode 100644 apps/cat-admin-web/src/components/ui/separator.tsx create mode 100644 apps/cat-admin-web/src/components/ui/sheet.tsx create mode 100644 apps/cat-admin-web/src/components/ui/sidebar.tsx create mode 100644 apps/cat-admin-web/src/components/ui/skeleton.tsx create mode 100644 apps/cat-admin-web/src/components/ui/slider.tsx create mode 100644 apps/cat-admin-web/src/components/ui/sonner.tsx create mode 100644 apps/cat-admin-web/src/components/ui/switch.tsx create mode 100644 apps/cat-admin-web/src/components/ui/table.tsx create mode 100644 apps/cat-admin-web/src/components/ui/tabs.tsx create mode 100644 apps/cat-admin-web/src/components/ui/textarea.tsx create mode 100644 apps/cat-admin-web/src/components/ui/toggle-group.tsx create mode 100644 apps/cat-admin-web/src/components/ui/toggle.tsx create mode 100644 apps/cat-admin-web/src/components/ui/tooltip.tsx create mode 100644 apps/cat-admin-web/src/custom/redirect-to-login.ts create mode 100644 apps/cat-admin-web/src/hooks/use-auth.ts create mode 100644 apps/cat-admin-web/src/hooks/use-mobile.ts create mode 100644 apps/cat-admin-web/src/index.css create mode 100644 apps/cat-admin-web/src/index.tsx create mode 100644 apps/cat-admin-web/src/lib/config.ts create mode 100644 apps/cat-admin-web/src/lib/nvwa.ts create mode 100644 apps/cat-admin-web/src/lib/utils.ts create mode 100644 apps/cat-admin-web/src/pages/index.tsx create mode 100644 apps/cat-admin-web/src/pages/user/login.tsx create mode 100644 apps/cat-admin-web/src/pages/user/register.tsx create mode 100644 apps/cat-admin-web/src/static/react.svg create mode 100644 apps/cat-admin-web/src/vite-env.d.ts create mode 100644 apps/cat-admin-web/tsconfig.app.json create mode 100644 apps/cat-admin-web/tsconfig.json create mode 100644 apps/cat-admin-web/tsconfig.node.json create mode 100644 apps/cat-admin-web/vite.config.ts create mode 100644 apps/cat-mini-app/.gitignore create mode 100644 apps/cat-mini-app/index.html create mode 100644 apps/cat-mini-app/overview.md create mode 100644 apps/cat-mini-app/package.json create mode 100644 apps/cat-mini-app/shims-uni.d.ts create mode 100644 apps/cat-mini-app/src/App.vue create mode 100644 apps/cat-mini-app/src/components/uni-badge/uni-badge.vue create mode 100644 apps/cat-mini-app/src/components/uni-breadcrumb-item/uni-breadcrumb-item.vue create mode 100644 apps/cat-mini-app/src/components/uni-breadcrumb/uni-breadcrumb.vue create mode 100644 apps/cat-mini-app/src/components/uni-calendar/calendar.js create mode 100644 apps/cat-mini-app/src/components/uni-calendar/i18n/en.json create mode 100644 apps/cat-mini-app/src/components/uni-calendar/i18n/index.js create mode 100644 apps/cat-mini-app/src/components/uni-calendar/i18n/zh-Hans.json create mode 100644 apps/cat-mini-app/src/components/uni-calendar/i18n/zh-Hant.json create mode 100644 apps/cat-mini-app/src/components/uni-calendar/uni-calendar-item.vue create mode 100644 apps/cat-mini-app/src/components/uni-calendar/uni-calendar.vue create mode 100644 apps/cat-mini-app/src/components/uni-calendar/util.js create mode 100644 apps/cat-mini-app/src/components/uni-card/uni-card.vue create mode 100644 apps/cat-mini-app/src/components/uni-col/uni-col.vue create mode 100644 apps/cat-mini-app/src/components/uni-collapse-item/uni-collapse-item.vue create mode 100644 apps/cat-mini-app/src/components/uni-collapse/uni-collapse.vue create mode 100644 apps/cat-mini-app/src/components/uni-combox/uni-combox.vue create mode 100644 apps/cat-mini-app/src/components/uni-countdown/i18n/en.json create mode 100644 apps/cat-mini-app/src/components/uni-countdown/i18n/index.js create mode 100644 apps/cat-mini-app/src/components/uni-countdown/i18n/zh-Hans.json create mode 100644 apps/cat-mini-app/src/components/uni-countdown/i18n/zh-Hant.json create mode 100644 apps/cat-mini-app/src/components/uni-countdown/uni-countdown.vue create mode 100644 apps/cat-mini-app/src/components/uni-data-checkbox/uni-data-checkbox.vue create mode 100644 apps/cat-mini-app/src/components/uni-data-picker/keypress.js create mode 100644 apps/cat-mini-app/src/components/uni-data-picker/uni-data-picker.uvue create mode 100644 apps/cat-mini-app/src/components/uni-data-picker/uni-data-picker.vue create mode 100644 apps/cat-mini-app/src/components/uni-data-pickerview/loading.uts create mode 100644 apps/cat-mini-app/src/components/uni-data-pickerview/uni-data-picker.js create mode 100644 apps/cat-mini-app/src/components/uni-data-pickerview/uni-data-picker.uts create mode 100644 apps/cat-mini-app/src/components/uni-data-pickerview/uni-data-pickerview.css create mode 100644 apps/cat-mini-app/src/components/uni-data-pickerview/uni-data-pickerview.uvue create mode 100644 apps/cat-mini-app/src/components/uni-data-pickerview/uni-data-pickerview.vue create mode 100644 apps/cat-mini-app/src/components/uni-data-select/uni-data-select.vue create mode 100644 apps/cat-mini-app/src/components/uni-dateformat/date-format.js create mode 100644 apps/cat-mini-app/src/components/uni-dateformat/uni-dateformat.vue create mode 100644 apps/cat-mini-app/src/components/uni-datetime-picker/calendar-item.vue create mode 100644 apps/cat-mini-app/src/components/uni-datetime-picker/calendar.vue create mode 100644 apps/cat-mini-app/src/components/uni-datetime-picker/i18n/en.json create mode 100644 apps/cat-mini-app/src/components/uni-datetime-picker/i18n/index.js create mode 100644 apps/cat-mini-app/src/components/uni-datetime-picker/i18n/zh-Hans.json create mode 100644 apps/cat-mini-app/src/components/uni-datetime-picker/i18n/zh-Hant.json create mode 100644 apps/cat-mini-app/src/components/uni-datetime-picker/time-picker.vue create mode 100644 apps/cat-mini-app/src/components/uni-datetime-picker/uni-datetime-picker.vue create mode 100644 apps/cat-mini-app/src/components/uni-datetime-picker/util.js create mode 100644 apps/cat-mini-app/src/components/uni-drawer/keypress.js create mode 100644 apps/cat-mini-app/src/components/uni-drawer/uni-drawer.vue create mode 100644 apps/cat-mini-app/src/components/uni-easyinput/common.js create mode 100644 apps/cat-mini-app/src/components/uni-easyinput/uni-easyinput.vue create mode 100644 apps/cat-mini-app/src/components/uni-fab/uni-fab.vue create mode 100644 apps/cat-mini-app/src/components/uni-fav/i18n/en.json create mode 100644 apps/cat-mini-app/src/components/uni-fav/i18n/index.js create mode 100644 apps/cat-mini-app/src/components/uni-fav/i18n/zh-Hans.json create mode 100644 apps/cat-mini-app/src/components/uni-fav/i18n/zh-Hant.json create mode 100644 apps/cat-mini-app/src/components/uni-fav/uni-fav.vue create mode 100644 apps/cat-mini-app/src/components/uni-file-picker/choose-and-upload-file.js create mode 100644 apps/cat-mini-app/src/components/uni-file-picker/uni-file-picker.vue create mode 100644 apps/cat-mini-app/src/components/uni-file-picker/upload-file.vue create mode 100644 apps/cat-mini-app/src/components/uni-file-picker/upload-image.vue create mode 100644 apps/cat-mini-app/src/components/uni-file-picker/utils.js create mode 100644 apps/cat-mini-app/src/components/uni-forms-item/uni-forms-item.vue create mode 100644 apps/cat-mini-app/src/components/uni-forms/uni-forms.vue create mode 100644 apps/cat-mini-app/src/components/uni-forms/utils.js create mode 100644 apps/cat-mini-app/src/components/uni-forms/validate.js create mode 100644 apps/cat-mini-app/src/components/uni-goods-nav/i18n/en.json create mode 100644 apps/cat-mini-app/src/components/uni-goods-nav/i18n/index.js create mode 100644 apps/cat-mini-app/src/components/uni-goods-nav/i18n/zh-Hans.json create mode 100644 apps/cat-mini-app/src/components/uni-goods-nav/i18n/zh-Hant.json create mode 100644 apps/cat-mini-app/src/components/uni-goods-nav/uni-goods-nav.vue create mode 100644 apps/cat-mini-app/src/components/uni-grid-item/uni-grid-item.vue create mode 100644 apps/cat-mini-app/src/components/uni-grid/uni-grid.vue create mode 100644 apps/cat-mini-app/src/components/uni-group/uni-group.vue create mode 100644 apps/cat-mini-app/src/components/uni-icons/uni-icons.uvue create mode 100644 apps/cat-mini-app/src/components/uni-icons/uni-icons.vue create mode 100644 apps/cat-mini-app/src/components/uni-icons/uniicons.css create mode 100644 apps/cat-mini-app/src/components/uni-icons/uniicons.ttf create mode 100644 apps/cat-mini-app/src/components/uni-icons/uniicons_file.ts create mode 100644 apps/cat-mini-app/src/components/uni-icons/uniicons_file_vue.js create mode 100644 apps/cat-mini-app/src/components/uni-indexed-list/uni-indexed-list-item.vue create mode 100644 apps/cat-mini-app/src/components/uni-indexed-list/uni-indexed-list.vue create mode 100644 apps/cat-mini-app/src/components/uni-link/uni-link.vue create mode 100644 apps/cat-mini-app/src/components/uni-list-ad/uni-list-ad.vue create mode 100644 apps/cat-mini-app/src/components/uni-list-chat/uni-list-chat.scss create mode 100644 apps/cat-mini-app/src/components/uni-list-chat/uni-list-chat.vue create mode 100644 apps/cat-mini-app/src/components/uni-list-item/uni-list-item.vue create mode 100644 apps/cat-mini-app/src/components/uni-list/uni-list.vue create mode 100644 apps/cat-mini-app/src/components/uni-list/uni-refresh.vue create mode 100644 apps/cat-mini-app/src/components/uni-list/uni-refresh.wxs create mode 100644 apps/cat-mini-app/src/components/uni-load-more/i18n/en.json create mode 100644 apps/cat-mini-app/src/components/uni-load-more/i18n/index.js create mode 100644 apps/cat-mini-app/src/components/uni-load-more/i18n/zh-Hans.json create mode 100644 apps/cat-mini-app/src/components/uni-load-more/i18n/zh-Hant.json create mode 100644 apps/cat-mini-app/src/components/uni-load-more/uni-load-more.vue create mode 100644 apps/cat-mini-app/src/components/uni-nav-bar/uni-nav-bar.vue create mode 100644 apps/cat-mini-app/src/components/uni-nav-bar/uni-status-bar.vue create mode 100644 apps/cat-mini-app/src/components/uni-notice-bar/uni-notice-bar.vue create mode 100644 apps/cat-mini-app/src/components/uni-number-box/uni-number-box.vue create mode 100644 apps/cat-mini-app/src/components/uni-pagination/i18n/en.json create mode 100644 apps/cat-mini-app/src/components/uni-pagination/i18n/es.json create mode 100644 apps/cat-mini-app/src/components/uni-pagination/i18n/fr.json create mode 100644 apps/cat-mini-app/src/components/uni-pagination/i18n/index.js create mode 100644 apps/cat-mini-app/src/components/uni-pagination/i18n/zh-Hans.json create mode 100644 apps/cat-mini-app/src/components/uni-pagination/i18n/zh-Hant.json create mode 100644 apps/cat-mini-app/src/components/uni-pagination/uni-pagination.vue create mode 100644 apps/cat-mini-app/src/components/uni-popup-dialog/keypress.js create mode 100644 apps/cat-mini-app/src/components/uni-popup-dialog/uni-popup-dialog.vue create mode 100644 apps/cat-mini-app/src/components/uni-popup-message/uni-popup-message.vue create mode 100644 apps/cat-mini-app/src/components/uni-popup-share/uni-popup-share.vue create mode 100644 apps/cat-mini-app/src/components/uni-popup/i18n/en.json create mode 100644 apps/cat-mini-app/src/components/uni-popup/i18n/index.js create mode 100644 apps/cat-mini-app/src/components/uni-popup/i18n/zh-Hans.json create mode 100644 apps/cat-mini-app/src/components/uni-popup/i18n/zh-Hant.json create mode 100644 apps/cat-mini-app/src/components/uni-popup/keypress.js create mode 100644 apps/cat-mini-app/src/components/uni-popup/popup.js create mode 100644 apps/cat-mini-app/src/components/uni-popup/uni-popup.uvue create mode 100644 apps/cat-mini-app/src/components/uni-popup/uni-popup.vue create mode 100644 apps/cat-mini-app/src/components/uni-rate/uni-rate.vue create mode 100644 apps/cat-mini-app/src/components/uni-row/uni-row.vue create mode 100644 apps/cat-mini-app/src/components/uni-scss/changelog.md create mode 100644 apps/cat-mini-app/src/components/uni-scss/index.scss create mode 100644 apps/cat-mini-app/src/components/uni-scss/package.json create mode 100644 apps/cat-mini-app/src/components/uni-scss/readme.md create mode 100644 apps/cat-mini-app/src/components/uni-scss/styles/index.scss create mode 100644 apps/cat-mini-app/src/components/uni-scss/styles/setting/_border.scss create mode 100644 apps/cat-mini-app/src/components/uni-scss/styles/setting/_color.scss create mode 100644 apps/cat-mini-app/src/components/uni-scss/styles/setting/_radius.scss create mode 100644 apps/cat-mini-app/src/components/uni-scss/styles/setting/_space.scss create mode 100644 apps/cat-mini-app/src/components/uni-scss/styles/setting/_styles.scss create mode 100644 apps/cat-mini-app/src/components/uni-scss/styles/setting/_text.scss create mode 100644 apps/cat-mini-app/src/components/uni-scss/styles/setting/_variables.scss create mode 100644 apps/cat-mini-app/src/components/uni-scss/styles/tools/functions.scss create mode 100644 apps/cat-mini-app/src/components/uni-scss/theme.scss create mode 100644 apps/cat-mini-app/src/components/uni-scss/variables.scss create mode 100644 apps/cat-mini-app/src/components/uni-search-bar/i18n/en.json create mode 100644 apps/cat-mini-app/src/components/uni-search-bar/i18n/index.js create mode 100644 apps/cat-mini-app/src/components/uni-search-bar/i18n/zh-Hans.json create mode 100644 apps/cat-mini-app/src/components/uni-search-bar/i18n/zh-Hant.json create mode 100644 apps/cat-mini-app/src/components/uni-search-bar/uni-search-bar.vue create mode 100644 apps/cat-mini-app/src/components/uni-section/uni-section.vue create mode 100644 apps/cat-mini-app/src/components/uni-segmented-control/uni-segmented-control.vue create mode 100644 apps/cat-mini-app/src/components/uni-steps/uni-steps.vue create mode 100644 apps/cat-mini-app/src/components/uni-swipe-action-item/bindingx.js create mode 100644 apps/cat-mini-app/src/components/uni-swipe-action-item/isPC.js create mode 100644 apps/cat-mini-app/src/components/uni-swipe-action-item/mpalipay.js create mode 100644 apps/cat-mini-app/src/components/uni-swipe-action-item/mpother.js create mode 100644 apps/cat-mini-app/src/components/uni-swipe-action-item/mpwxs.js create mode 100644 apps/cat-mini-app/src/components/uni-swipe-action-item/render.js create mode 100644 apps/cat-mini-app/src/components/uni-swipe-action-item/uni-swipe-action-item.vue create mode 100644 apps/cat-mini-app/src/components/uni-swipe-action-item/wx.wxs create mode 100644 apps/cat-mini-app/src/components/uni-swipe-action/uni-swipe-action.vue create mode 100644 apps/cat-mini-app/src/components/uni-swiper-dot/uni-swiper-dot.vue create mode 100644 apps/cat-mini-app/src/components/uni-table/uni-table.vue create mode 100644 apps/cat-mini-app/src/components/uni-tag/uni-tag.vue create mode 100644 apps/cat-mini-app/src/components/uni-tbody/uni-tbody.vue create mode 100644 apps/cat-mini-app/src/components/uni-td/uni-td.vue create mode 100644 apps/cat-mini-app/src/components/uni-th/filter-dropdown.vue create mode 100644 apps/cat-mini-app/src/components/uni-th/uni-th.vue create mode 100644 apps/cat-mini-app/src/components/uni-thead/uni-thead.vue create mode 100644 apps/cat-mini-app/src/components/uni-title/uni-title.vue create mode 100644 apps/cat-mini-app/src/components/uni-tooltip/uni-tooltip.vue create mode 100644 apps/cat-mini-app/src/components/uni-tr/table-checkbox.vue create mode 100644 apps/cat-mini-app/src/components/uni-tr/uni-tr.vue create mode 100644 apps/cat-mini-app/src/components/uni-transition/createAnimation.js create mode 100644 apps/cat-mini-app/src/components/uni-transition/uni-transition.vue create mode 100644 apps/cat-mini-app/src/custom/redirect-to-login.ts create mode 100644 apps/cat-mini-app/src/env.d.ts create mode 100644 apps/cat-mini-app/src/lib/config.ts create mode 100644 apps/cat-mini-app/src/lib/nvwa.ts create mode 100644 apps/cat-mini-app/src/main.css create mode 100644 apps/cat-mini-app/src/main.ts create mode 100644 apps/cat-mini-app/src/manifest.json create mode 100644 apps/cat-mini-app/src/pages.json create mode 100644 apps/cat-mini-app/src/pages/home.vue create mode 100644 apps/cat-mini-app/src/pages/user/login.vue create mode 100644 apps/cat-mini-app/src/pages/user/register.vue create mode 100644 apps/cat-mini-app/src/shime-uni.d.ts create mode 100644 apps/cat-mini-app/src/static/logo.png create mode 100644 apps/cat-mini-app/src/uni.scss create mode 100644 apps/cat-mini-app/tsconfig.json create mode 100644 apps/cat-mini-app/vite.config.ts create mode 100644 database/common.ts create mode 100644 database/schema/auth.db.ts create mode 100644 database/schema/basic.db.ts create mode 100644 database/schema/project.db.ts create mode 100644 package.json create mode 100644 pnpm-lock.yaml create mode 100644 pnpm-workspace.yaml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a8f6d1e --- /dev/null +++ b/.gitignore @@ -0,0 +1,43 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. +# database migration config +database/drizzle.config.ts +database/package.json + +# dependencies +node_modules +/.pnp +.pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/versions + +# testing +/coverage + +# production +apps/*/dist +apps/*/dist-nvwa + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# env files (can opt-in for committing if needed) +.env* + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts + +/src/generated/prisma diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..7f380cc --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,7 @@ +# Cat Shelter Management + +This project involves developing a cat shelter management system with two main components: a mini-program for customers to browse cat information, make reservations, and shop for cat supplies, and a web admin panel for managers to handle cat listings, queuing, and view reservation statuses. The mini-program serves as a mobile interface for pet enthusiasts to interact with the shelter, including viewing breeding cats, cat statuses, reserving kittens, and purchasing related products. The admin web allows staff to manage inventory, start queuing processes, and monitor appointments efficiently. + +## Applications +- [cat-mini-app] 猫舍小程序 (Mobile) +- [cat-admin-web] 管理端网页 (Desktop) diff --git a/apps/cat-admin-web/.gitignore b/apps/cat-admin-web/.gitignore new file mode 100644 index 0000000..2b87096 --- /dev/null +++ b/apps/cat-admin-web/.gitignore @@ -0,0 +1,25 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-nvwa +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/apps/cat-admin-web/components.json b/apps/cat-admin-web/components.json new file mode 100644 index 0000000..ba0c18c --- /dev/null +++ b/apps/cat-admin-web/components.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "new-york", + "rsc": false, + "tsx": true, + "tailwind": { + "config": "", + "css": "src/index.css", + "baseColor": "neutral", + "cssVariables": true, + "prefix": "" + }, + "iconLibrary": "lucide", + "aliases": { + "components": "@/components", + "utils": "@/lib/utils", + "ui": "@/components/ui", + "lib": "@/lib", + "hooks": "@/hooks" + } +} diff --git a/apps/cat-admin-web/eslint.config.js b/apps/cat-admin-web/eslint.config.js new file mode 100644 index 0000000..d94e7de --- /dev/null +++ b/apps/cat-admin-web/eslint.config.js @@ -0,0 +1,23 @@ +import js from '@eslint/js' +import globals from 'globals' +import reactHooks from 'eslint-plugin-react-hooks' +import reactRefresh from 'eslint-plugin-react-refresh' +import tseslint from 'typescript-eslint' +import { globalIgnores } from 'eslint/config' + +export default tseslint.config([ + globalIgnores(['dist']), + { + files: ['**/*.{ts,tsx}'], + extends: [ + js.configs.recommended, + tseslint.configs.recommended, + reactHooks.configs['recommended-latest'], + reactRefresh.configs.vite, + ], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + }, + }, +]) diff --git a/apps/cat-admin-web/index.html b/apps/cat-admin-web/index.html new file mode 100644 index 0000000..f828b81 --- /dev/null +++ b/apps/cat-admin-web/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite + React + TS + + +
+ + + diff --git a/apps/cat-admin-web/overview.md b/apps/cat-admin-web/overview.md new file mode 100644 index 0000000..29608d6 --- /dev/null +++ b/apps/cat-admin-web/overview.md @@ -0,0 +1,10 @@ +# 管理端网页 (cat-admin-web) + +面向管理员的桌面网页,用于管理猫咪的上架、下架、排队开启以及查看预约情况。 + +**Design style:** 专业简洁的管理界面,采用现代化的卡片布局和数据表格,便于管理员高效操作。 + +## Capabilities +- 猫咪管理: 上下架猫咪,管理猫咪的可售卖状态。 +- 排队管理: 开启猫咪排队功能。 +- 预约查看: 查看排队和预约的详细情况。 diff --git a/apps/cat-admin-web/package.json b/apps/cat-admin-web/package.json new file mode 100644 index 0000000..33f4894 --- /dev/null +++ b/apps/cat-admin-web/package.json @@ -0,0 +1,81 @@ +{ + "name": "template-frontend-react", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "nvwa:build-h5": "rm -rf dist-nvwa && tsc -b && NVWA_BUILD_DEBUG=true NVWA_ENABLE_SOURCE_LOCATION=true vite build && cp -r dist/ dist-nvwa/", + "dev": "vite", + "build": "tsc -b && vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "@hookform/resolvers": "^5.2.1", + "@nvwa-app/sdk-web": "^0.10.0", + "@radix-ui/react-accordion": "^1.2.12", + "@radix-ui/react-alert-dialog": "^1.1.15", + "@radix-ui/react-aspect-ratio": "^1.1.7", + "@radix-ui/react-avatar": "^1.1.10", + "@radix-ui/react-checkbox": "^1.3.3", + "@radix-ui/react-collapsible": "^1.1.12", + "@radix-ui/react-context-menu": "^2.2.16", + "@radix-ui/react-dialog": "^1.1.15", + "@radix-ui/react-dropdown-menu": "^2.1.16", + "@radix-ui/react-hover-card": "^1.1.15", + "@radix-ui/react-label": "^2.1.7", + "@radix-ui/react-menubar": "^1.1.16", + "@radix-ui/react-navigation-menu": "^1.2.14", + "@radix-ui/react-popover": "^1.1.15", + "@radix-ui/react-progress": "^1.1.7", + "@radix-ui/react-radio-group": "^1.3.8", + "@radix-ui/react-scroll-area": "^1.2.10", + "@radix-ui/react-select": "^2.2.6", + "@radix-ui/react-separator": "^1.1.7", + "@radix-ui/react-slider": "^1.3.6", + "@radix-ui/react-slot": "^1.2.3", + "@radix-ui/react-switch": "^1.2.6", + "@radix-ui/react-tabs": "^1.1.13", + "@radix-ui/react-toggle": "^1.1.10", + "@radix-ui/react-toggle-group": "^1.1.11", + "@radix-ui/react-tooltip": "^1.2.8", + "@tailwindcss/vite": "^4.1.12", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "cmdk": "^1.1.1", + "date-fns": "^4.1.0", + "embla-carousel-react": "^8.6.0", + "input-otp": "^1.4.2", + "lucide-react": "^0.542.0", + "next-themes": "^0.4.6", + "react": "^19.1.1", + "react-day-picker": "^9.9.0", + "react-dom": "^19.1.1", + "react-router-dom": "^7.1.3", + "react-hook-form": "^7.62.0", + "react-resizable-panels": "^3.0.5", + "recharts": "2.15.4", + "sonner": "^2.0.7", + "tailwind-merge": "^3.3.1", + "tailwindcss": "^4.1.12", + "vaul": "^1.1.2", + "zod": "^4.1.5" + }, + "devDependencies": { + "@eslint/js": "^9.33.0", + "@nvwa-app/vite-plugin": "^1.1.1", + "@types/node": "^24.3.0", + "@types/react": "^19.1.10", + "@types/react-dom": "^19.1.7", + "@vitejs/plugin-react-swc": "^4.0.0", + "eslint": "^9.33.0", + "vite-plugin-pages": "^0.32.0", + "eslint-plugin-react-hooks": "^5.2.0", + "eslint-plugin-react-refresh": "^0.4.20", + "globals": "^16.3.0", + "tw-animate-css": "^1.3.7", + "typescript": "~5.8.3", + "typescript-eslint": "^8.39.1", + "vite": "^7.1.2" + } +} diff --git a/apps/cat-admin-web/src/App.tsx b/apps/cat-admin-web/src/App.tsx new file mode 100644 index 0000000..8a2e51d --- /dev/null +++ b/apps/cat-admin-web/src/App.tsx @@ -0,0 +1,62 @@ +import { useEffect } from 'react' +import { BrowserRouter, useRoutes } from 'react-router-dom' +import type { RouteObject } from 'react-router-dom' +import { AuthRouter } from './components/auth-router' +import { Layout } from './components/layout' +import { setupIframeHoverInspector, setupIframeSourceLocationListener } from '@nvwa-app/sdk-web' +import LoginPage from './pages/user/login' +import RegisterPage from './pages/user/register' + +/** + * 应用路由配置 + * + * 配置三个主要路由: + * 1. /user/login - 登录页面(不需要 layout) + * 2. /user/register - 注册页面(不需要 layout) + * 3. /* - 通配符路由,匹配所有其他路径,使用 Layout 组件包裹 + * + * Layout 组件内部会根据 pathname 动态渲染对应的页面组件 + */ +const routes: RouteObject[] = [ + { + path: '/user/login', + element: , + }, + { + path: '/user/register', + element: , + }, + { + path: '/*', + element: ( + + + + ), + }, +] + +function Router() { + const element = useRoutes(routes) + return element +} + +function App() { + // 如果页面被嵌入 iframe,设置跨域通信监听器 + useEffect(() => { + const cleanup1 = setupIframeSourceLocationListener() + const cleanup2 = setupIframeHoverInspector() + return () => { + cleanup1?.() + cleanup2?.() + } + }, []) + + return ( + + + + ) +} + +export default App diff --git a/apps/cat-admin-web/src/components/auth-router.tsx b/apps/cat-admin-web/src/components/auth-router.tsx new file mode 100644 index 0000000..2baa0b4 --- /dev/null +++ b/apps/cat-admin-web/src/components/auth-router.tsx @@ -0,0 +1,70 @@ +import { useEffect, useState, type ReactNode } from 'react' +import { auth } from '@/lib/nvwa' +import { AUTH_REQUIRED } from '@/lib/config' +import redirectToLogin from '@/custom/redirect-to-login' + +type AuthRouterProps = { + children: ReactNode +} + +/** + * 认证路由守卫组件 + * 根据 AUTH_REQUIRED 配置决定是否需要登录 + * + * 行为说明: + * - 当 AUTH_REQUIRED=true 时:检查登录状态,未登录则跳转到登录页 + * - 当 AUTH_REQUIRED=false 时:不检查登录,直接渲染子组件 + */ +export function AuthRouter({ children }: AuthRouterProps) { + const [isLoading, setIsLoading] = useState(true) + const [isAuthenticated, setIsAuthenticated] = useState(null) + + useEffect(() => { + checkAuth() + }, []) + + const checkAuth = async () => { + // 如果不需要认证,直接通过 + if (!AUTH_REQUIRED) { + setIsAuthenticated(true) + setIsLoading(false) + return + } + + // 需要认证时,检查登录状态 + try { + const currentUser = await auth.currentUser() + if (currentUser) { + setIsAuthenticated(true) + } else { + // 未登录,跳转到登录页 + redirectToLogin() + return + } + } catch (error) { + // 获取用户信息失败,跳转到登录页 + redirectToLogin() + return + } finally { + setIsLoading(false) + } + } + + // 加载中状态 + if (isLoading) { + return ( +
+
加载中...
+
+ ) + } + + // 如果需要认证但未登录,redirectToLogin 会处理跳转,这里返回 null + if (AUTH_REQUIRED && !isAuthenticated) { + return null + } + + // 已认证或不需要认证,渲染子组件 + return <>{children} +} + diff --git a/apps/cat-admin-web/src/components/layout.tsx b/apps/cat-admin-web/src/components/layout.tsx new file mode 100644 index 0000000..c90a505 --- /dev/null +++ b/apps/cat-admin-web/src/components/layout.tsx @@ -0,0 +1,39 @@ +import { useRoutes } from 'react-router-dom' + +// vite-plugin-pages 会自动生成路由配置 +// @ts-expect-error - 动态导入,类型会在构建时生成 +import autoRoutes from "~react-pages" + +/** + * Layout 组件 + * + * 这个组件会包裹所有需要 layout 的页面(除了 /user/login 和 /user/register) + * 它使用 vite-plugin-pages 生成的路由配置来根据 pathname 动态渲染对应的页面组件 + * + * 用户可以在生成代码时自定义这个 Layout,添加侧边栏、导航栏等公共布局元素 + */ +const noLayoutRoutes = [ + '/user/login', + '/user/register', +] + +export function Layout() { + // 过滤掉登录和注册页面,因为它们不应该被 layout 包裹 + const layoutRoutes = autoRoutes.filter( + (route: any) => !noLayoutRoutes.includes(route.path) + ) + + // 使用 useRoutes 来渲染当前路径对应的组件 + const element = useRoutes(layoutRoutes) + + return ( +
+ {/* 这里可以添加侧边栏、导航栏等公共布局元素 */} + {/* 用户可以在生成代码时自定义这个 Layout */} + {element} +
+ ) +} + + + diff --git a/apps/cat-admin-web/src/components/ui/accordion.tsx b/apps/cat-admin-web/src/components/ui/accordion.tsx new file mode 100644 index 0000000..d21b65f --- /dev/null +++ b/apps/cat-admin-web/src/components/ui/accordion.tsx @@ -0,0 +1,64 @@ +import * as React from "react" +import * as AccordionPrimitive from "@radix-ui/react-accordion" +import { ChevronDownIcon } from "lucide-react" + +import { cn } from "@/lib/utils" + +function Accordion({ + ...props +}: React.ComponentProps) { + return +} + +function AccordionItem({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function AccordionTrigger({ + className, + children, + ...props +}: React.ComponentProps) { + return ( + + svg]:rotate-180", + className + )} + {...props} + > + {children} + + + + ) +} + +function AccordionContent({ + className, + children, + ...props +}: React.ComponentProps) { + return ( + +
{children}
+
+ ) +} + +export { Accordion, AccordionItem, AccordionTrigger, AccordionContent } diff --git a/apps/cat-admin-web/src/components/ui/alert-dialog.tsx b/apps/cat-admin-web/src/components/ui/alert-dialog.tsx new file mode 100644 index 0000000..935eecf --- /dev/null +++ b/apps/cat-admin-web/src/components/ui/alert-dialog.tsx @@ -0,0 +1,155 @@ +import * as React from "react" +import * as AlertDialogPrimitive from "@radix-ui/react-alert-dialog" + +import { cn } from "@/lib/utils" +import { buttonVariants } from "@/components/ui/button" + +function AlertDialog({ + ...props +}: React.ComponentProps) { + return +} + +function AlertDialogTrigger({ + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function AlertDialogPortal({ + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function AlertDialogOverlay({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function AlertDialogContent({ + className, + ...props +}: React.ComponentProps) { + return ( + + + + + ) +} + +function AlertDialogHeader({ + className, + ...props +}: React.ComponentProps<"div">) { + return ( +
+ ) +} + +function AlertDialogFooter({ + className, + ...props +}: React.ComponentProps<"div">) { + return ( +
+ ) +} + +function AlertDialogTitle({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function AlertDialogDescription({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function AlertDialogAction({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function AlertDialogCancel({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +export { + AlertDialog, + AlertDialogPortal, + AlertDialogOverlay, + AlertDialogTrigger, + AlertDialogContent, + AlertDialogHeader, + AlertDialogFooter, + AlertDialogTitle, + AlertDialogDescription, + AlertDialogAction, + AlertDialogCancel, +} diff --git a/apps/cat-admin-web/src/components/ui/alert.tsx b/apps/cat-admin-web/src/components/ui/alert.tsx new file mode 100644 index 0000000..1421354 --- /dev/null +++ b/apps/cat-admin-web/src/components/ui/alert.tsx @@ -0,0 +1,66 @@ +import * as React from "react" +import { cva, type VariantProps } from "class-variance-authority" + +import { cn } from "@/lib/utils" + +const alertVariants = cva( + "relative w-full rounded-lg border px-4 py-3 text-sm grid has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] grid-cols-[0_1fr] has-[>svg]:gap-x-3 gap-y-0.5 items-start [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current", + { + variants: { + variant: { + default: "bg-card text-card-foreground", + destructive: + "text-destructive bg-card [&>svg]:text-current *:data-[slot=alert-description]:text-destructive/90", + }, + }, + defaultVariants: { + variant: "default", + }, + } +) + +function Alert({ + className, + variant, + ...props +}: React.ComponentProps<"div"> & VariantProps) { + return ( +
+ ) +} + +function AlertTitle({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ) +} + +function AlertDescription({ + className, + ...props +}: React.ComponentProps<"div">) { + return ( +
+ ) +} + +export { Alert, AlertTitle, AlertDescription } diff --git a/apps/cat-admin-web/src/components/ui/aspect-ratio.tsx b/apps/cat-admin-web/src/components/ui/aspect-ratio.tsx new file mode 100644 index 0000000..3df3fd0 --- /dev/null +++ b/apps/cat-admin-web/src/components/ui/aspect-ratio.tsx @@ -0,0 +1,11 @@ +"use client" + +import * as AspectRatioPrimitive from "@radix-ui/react-aspect-ratio" + +function AspectRatio({ + ...props +}: React.ComponentProps) { + return +} + +export { AspectRatio } diff --git a/apps/cat-admin-web/src/components/ui/avatar.tsx b/apps/cat-admin-web/src/components/ui/avatar.tsx new file mode 100644 index 0000000..b7224f0 --- /dev/null +++ b/apps/cat-admin-web/src/components/ui/avatar.tsx @@ -0,0 +1,51 @@ +import * as React from "react" +import * as AvatarPrimitive from "@radix-ui/react-avatar" + +import { cn } from "@/lib/utils" + +function Avatar({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function AvatarImage({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function AvatarFallback({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +export { Avatar, AvatarImage, AvatarFallback } diff --git a/apps/cat-admin-web/src/components/ui/badge.tsx b/apps/cat-admin-web/src/components/ui/badge.tsx new file mode 100644 index 0000000..0205413 --- /dev/null +++ b/apps/cat-admin-web/src/components/ui/badge.tsx @@ -0,0 +1,46 @@ +import * as React from "react" +import { Slot } from "@radix-ui/react-slot" +import { cva, type VariantProps } from "class-variance-authority" + +import { cn } from "@/lib/utils" + +const badgeVariants = cva( + "inline-flex items-center justify-center rounded-md border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden", + { + variants: { + variant: { + default: + "border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90", + secondary: + "border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90", + destructive: + "border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60", + outline: + "text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground", + }, + }, + defaultVariants: { + variant: "default", + }, + } +) + +function Badge({ + className, + variant, + asChild = false, + ...props +}: React.ComponentProps<"span"> & + VariantProps & { asChild?: boolean }) { + const Comp = asChild ? Slot : "span" + + return ( + + ) +} + +export { Badge, badgeVariants } diff --git a/apps/cat-admin-web/src/components/ui/breadcrumb.tsx b/apps/cat-admin-web/src/components/ui/breadcrumb.tsx new file mode 100644 index 0000000..eb88f32 --- /dev/null +++ b/apps/cat-admin-web/src/components/ui/breadcrumb.tsx @@ -0,0 +1,109 @@ +import * as React from "react" +import { Slot } from "@radix-ui/react-slot" +import { ChevronRight, MoreHorizontal } from "lucide-react" + +import { cn } from "@/lib/utils" + +function Breadcrumb({ ...props }: React.ComponentProps<"nav">) { + return