├── .browserslistrc
├── .changeset
├── README.md
└── config.json
├── .commitlintrc.js
├── .dockerignore
├── .editorconfig
├── .gitattributes
├── .gitconfig
├── .gitignore
├── .gitpod.yml
├── .husky
├── commit-msg
├── post-merge
└── pre-commit
├── .lintstagedrc.mjs
├── .node-version
├── .npmrc
├── .prettierignore
├── .prettierrc.mjs
├── .stylelintignore
├── CHANGELOG.md
├── LICENSE
├── README.md
├── apps
├── backend-mock
│ ├── .env
│ ├── README.md
│ ├── api
│ │ ├── auth
│ │ │ ├── codes.ts
│ │ │ ├── login.post.ts
│ │ │ ├── logout.post.ts
│ │ │ └── refresh.post.ts
│ │ ├── menu
│ │ │ └── all.ts
│ │ ├── status.ts
│ │ ├── system
│ │ │ ├── dept
│ │ │ │ ├── .post.ts
│ │ │ │ ├── [id].delete.ts
│ │ │ │ ├── [id].put.ts
│ │ │ │ └── list.ts
│ │ │ ├── menu
│ │ │ │ ├── list.ts
│ │ │ │ ├── name-exists.ts
│ │ │ │ └── path-exists.ts
│ │ │ └── role
│ │ │ │ └── list.ts
│ │ ├── table
│ │ │ └── list.ts
│ │ ├── test.get.ts
│ │ ├── test.post.ts
│ │ └── user
│ │ │ └── info.ts
│ ├── error.ts
│ ├── middleware
│ │ └── 1.api.ts
│ ├── nitro.config.ts
│ ├── package.json
│ ├── routes
│ │ └── [...].ts
│ ├── tsconfig.build.json
│ ├── tsconfig.json
│ └── utils
│ │ ├── cookie-utils.ts
│ │ ├── jwt-utils.ts
│ │ ├── mock-data.ts
│ │ └── response.ts
└── web-antd
│ ├── .env
│ ├── .env.analyze
│ ├── .env.development
│ ├── .env.production
│ ├── .env.test
│ ├── index.html
│ ├── package.json
│ ├── postcss.config.mjs
│ ├── public
│ ├── favicon.ico
│ └── tinymce
│ │ ├── icons
│ │ └── default
│ │ │ └── icons.min.js
│ │ ├── langs
│ │ ├── README.md
│ │ └── zh_CN.js
│ │ ├── license.md
│ │ ├── models
│ │ └── dom
│ │ │ └── model.min.js
│ │ ├── plugins
│ │ ├── accordion
│ │ │ └── plugin.min.js
│ │ ├── advlist
│ │ │ └── plugin.min.js
│ │ ├── anchor
│ │ │ └── plugin.min.js
│ │ ├── autolink
│ │ │ └── plugin.min.js
│ │ ├── autoresize
│ │ │ └── plugin.min.js
│ │ ├── autosave
│ │ │ └── plugin.min.js
│ │ ├── charmap
│ │ │ └── plugin.min.js
│ │ ├── code
│ │ │ └── plugin.min.js
│ │ ├── codesample
│ │ │ └── plugin.min.js
│ │ ├── directionality
│ │ │ └── plugin.min.js
│ │ ├── emoticons
│ │ │ ├── js
│ │ │ │ ├── emojiimages.js
│ │ │ │ ├── emojiimages.min.js
│ │ │ │ ├── emojis.js
│ │ │ │ └── emojis.min.js
│ │ │ └── plugin.min.js
│ │ ├── fullscreen
│ │ │ └── plugin.min.js
│ │ ├── help
│ │ │ ├── js
│ │ │ │ └── i18n
│ │ │ │ │ └── keynav
│ │ │ │ │ ├── ar.js
│ │ │ │ │ ├── bg_BG.js
│ │ │ │ │ ├── ca.js
│ │ │ │ │ ├── cs.js
│ │ │ │ │ ├── da.js
│ │ │ │ │ ├── de.js
│ │ │ │ │ ├── el.js
│ │ │ │ │ ├── en.js
│ │ │ │ │ ├── es.js
│ │ │ │ │ ├── eu.js
│ │ │ │ │ ├── fa.js
│ │ │ │ │ ├── fi.js
│ │ │ │ │ ├── fr_FR.js
│ │ │ │ │ ├── he_IL.js
│ │ │ │ │ ├── hi.js
│ │ │ │ │ ├── hr.js
│ │ │ │ │ ├── hu_HU.js
│ │ │ │ │ ├── id.js
│ │ │ │ │ ├── it.js
│ │ │ │ │ ├── ja.js
│ │ │ │ │ ├── kk.js
│ │ │ │ │ ├── ko_KR.js
│ │ │ │ │ ├── ms.js
│ │ │ │ │ ├── nb_NO.js
│ │ │ │ │ ├── nl.js
│ │ │ │ │ ├── pl.js
│ │ │ │ │ ├── pt_BR.js
│ │ │ │ │ ├── pt_PT.js
│ │ │ │ │ ├── ro.js
│ │ │ │ │ ├── ru.js
│ │ │ │ │ ├── sk.js
│ │ │ │ │ ├── sl_SI.js
│ │ │ │ │ ├── sv_SE.js
│ │ │ │ │ ├── th_TH.js
│ │ │ │ │ ├── tr.js
│ │ │ │ │ ├── uk.js
│ │ │ │ │ ├── vi.js
│ │ │ │ │ ├── zh_CN.js
│ │ │ │ │ └── zh_TW.js
│ │ │ └── plugin.min.js
│ │ ├── image
│ │ │ └── plugin.min.js
│ │ ├── importcss
│ │ │ └── plugin.min.js
│ │ ├── insertdatetime
│ │ │ └── plugin.min.js
│ │ ├── link
│ │ │ └── plugin.min.js
│ │ ├── lists
│ │ │ └── plugin.min.js
│ │ ├── media
│ │ │ └── plugin.min.js
│ │ ├── nonbreaking
│ │ │ └── plugin.min.js
│ │ ├── pagebreak
│ │ │ └── plugin.min.js
│ │ ├── preview
│ │ │ └── plugin.min.js
│ │ ├── quickbars
│ │ │ └── plugin.min.js
│ │ ├── save
│ │ │ └── plugin.min.js
│ │ ├── searchreplace
│ │ │ └── plugin.min.js
│ │ ├── table
│ │ │ └── plugin.min.js
│ │ ├── visualblocks
│ │ │ └── plugin.min.js
│ │ ├── visualchars
│ │ │ └── plugin.min.js
│ │ └── wordcount
│ │ │ └── plugin.min.js
│ │ ├── skins
│ │ ├── content
│ │ │ ├── dark
│ │ │ │ ├── content.js
│ │ │ │ └── content.min.css
│ │ │ ├── default
│ │ │ │ ├── content.js
│ │ │ │ └── content.min.css
│ │ │ ├── document
│ │ │ │ ├── content.js
│ │ │ │ └── content.min.css
│ │ │ ├── tinymce-5-dark
│ │ │ │ ├── content.js
│ │ │ │ └── content.min.css
│ │ │ ├── tinymce-5
│ │ │ │ ├── content.js
│ │ │ │ └── content.min.css
│ │ │ └── writer
│ │ │ │ ├── content.js
│ │ │ │ └── content.min.css
│ │ └── ui
│ │ │ ├── oxide-dark
│ │ │ ├── content.inline.js
│ │ │ ├── content.inline.min.css
│ │ │ ├── content.js
│ │ │ ├── content.min.css
│ │ │ ├── skin.js
│ │ │ ├── skin.min.css
│ │ │ ├── skin.shadowdom.js
│ │ │ └── skin.shadowdom.min.css
│ │ │ ├── oxide
│ │ │ ├── content.inline.js
│ │ │ ├── content.inline.min.css
│ │ │ ├── content.js
│ │ │ ├── content.min.css
│ │ │ ├── skin.js
│ │ │ ├── skin.min.css
│ │ │ ├── skin.shadowdom.js
│ │ │ └── skin.shadowdom.min.css
│ │ │ ├── tinymce-5-dark
│ │ │ ├── content.inline.js
│ │ │ ├── content.inline.min.css
│ │ │ ├── content.js
│ │ │ ├── content.min.css
│ │ │ ├── skin.js
│ │ │ ├── skin.min.css
│ │ │ ├── skin.shadowdom.js
│ │ │ └── skin.shadowdom.min.css
│ │ │ └── tinymce-5
│ │ │ ├── content.inline.js
│ │ │ ├── content.inline.min.css
│ │ │ ├── content.js
│ │ │ ├── content.min.css
│ │ │ ├── skin.js
│ │ │ ├── skin.min.css
│ │ │ ├── skin.shadowdom.js
│ │ │ └── skin.shadowdom.min.css
│ │ ├── themes
│ │ └── silver
│ │ │ └── theme.min.js
│ │ ├── tinymce.d.ts
│ │ └── tinymce.min.js
│ ├── src
│ ├── adapter
│ │ ├── component
│ │ │ └── index.ts
│ │ ├── form.ts
│ │ └── vxe-table.ts
│ ├── api
│ │ ├── common.d.ts
│ │ ├── core
│ │ │ ├── auth.ts
│ │ │ ├── captcha.ts
│ │ │ ├── index.ts
│ │ │ ├── menu.ts
│ │ │ ├── upload.ts
│ │ │ └── user.ts
│ │ ├── helper.ts
│ │ ├── index.ts
│ │ ├── monitor
│ │ │ ├── cache
│ │ │ │ └── index.ts
│ │ │ ├── logininfo
│ │ │ │ ├── index.ts
│ │ │ │ └── model.d.ts
│ │ │ ├── online
│ │ │ │ ├── index.ts
│ │ │ │ └── model.d.ts
│ │ │ └── operlog
│ │ │ │ ├── index.ts
│ │ │ │ └── model.d.ts
│ │ ├── request.ts
│ │ ├── system
│ │ │ ├── client
│ │ │ │ ├── index.ts
│ │ │ │ └── model.d.ts
│ │ │ ├── config
│ │ │ │ ├── index.ts
│ │ │ │ └── model.d.ts
│ │ │ ├── configurationManage
│ │ │ │ └── index.ts
│ │ │ ├── dept
│ │ │ │ ├── index.ts
│ │ │ │ └── model.d.ts
│ │ │ ├── dict
│ │ │ │ ├── dict-data-model.d.ts
│ │ │ │ ├── dict-data.ts
│ │ │ │ ├── dict-type-model.d.ts
│ │ │ │ └── dict-type.ts
│ │ │ ├── gpts
│ │ │ │ ├── index.ts
│ │ │ │ └── model.d.ts
│ │ │ ├── knowledgeBase
│ │ │ │ └── index.ts
│ │ │ ├── menu
│ │ │ │ ├── index.ts
│ │ │ │ └── model.d.ts
│ │ │ ├── message
│ │ │ │ ├── index.ts
│ │ │ │ └── model.d.ts
│ │ │ ├── model
│ │ │ │ ├── index.ts
│ │ │ │ └── model.d.ts
│ │ │ ├── notice
│ │ │ │ ├── index.ts
│ │ │ │ └── model.d.ts
│ │ │ ├── oss-config
│ │ │ │ ├── index.ts
│ │ │ │ └── model.d.ts
│ │ │ ├── oss
│ │ │ │ ├── index.ts
│ │ │ │ └── model.d.ts
│ │ │ ├── packagePlan
│ │ │ │ ├── index.ts
│ │ │ │ └── model.d.ts
│ │ │ ├── payOrder
│ │ │ │ ├── index.ts
│ │ │ │ └── model.d.ts
│ │ │ ├── plugin
│ │ │ │ ├── index.ts
│ │ │ │ └── model.d.ts
│ │ │ ├── post
│ │ │ │ ├── index.ts
│ │ │ │ └── model.d.ts
│ │ │ ├── profile
│ │ │ │ ├── index.ts
│ │ │ │ └── model.d.ts
│ │ │ ├── role
│ │ │ │ ├── index.ts
│ │ │ │ └── model.d.ts
│ │ │ ├── social
│ │ │ │ ├── index.ts
│ │ │ │ └── model.d.ts
│ │ │ ├── tenant-package
│ │ │ │ ├── index.ts
│ │ │ │ └── model.d.ts
│ │ │ ├── tenant
│ │ │ │ ├── index.ts
│ │ │ │ └── model.d.ts
│ │ │ ├── user
│ │ │ │ ├── index.ts
│ │ │ │ └── model.d.ts
│ │ │ └── voucher
│ │ │ │ ├── index.ts
│ │ │ │ └── model.d.ts
│ │ ├── tool
│ │ │ └── gen
│ │ │ │ ├── index.ts
│ │ │ │ └── model.d.ts
│ │ └── workflow
│ │ │ ├── category
│ │ │ ├── index.ts
│ │ │ └── model.d.ts
│ │ │ ├── definition
│ │ │ ├── index.ts
│ │ │ └── model.d.ts
│ │ │ ├── instance
│ │ │ ├── index.ts
│ │ │ └── model.d.ts
│ │ │ └── task
│ │ │ ├── index.ts
│ │ │ └── model.d.ts
│ ├── app.vue
│ ├── bootstrap.ts
│ ├── components
│ │ ├── cropper
│ │ │ ├── index.ts
│ │ │ └── src
│ │ │ │ ├── cropper-avatar.vue
│ │ │ │ ├── cropper-modal.vue
│ │ │ │ ├── cropper.vue
│ │ │ │ └── typing.ts
│ │ ├── description
│ │ │ ├── index.ts
│ │ │ └── src
│ │ │ │ ├── description.vue
│ │ │ │ ├── typing.ts
│ │ │ │ └── useDescription.ts
│ │ ├── dict
│ │ │ ├── index.ts
│ │ │ └── src
│ │ │ │ ├── data.tsx
│ │ │ │ └── index.vue
│ │ ├── global
│ │ │ ├── button.ts
│ │ │ └── index.ts
│ │ ├── table
│ │ │ ├── index.ts
│ │ │ └── src
│ │ │ │ ├── options-tag.vue
│ │ │ │ └── table-switch.vue
│ │ ├── tenant-toggle
│ │ │ ├── index.ts
│ │ │ └── src
│ │ │ │ └── index.vue
│ │ ├── tinymce
│ │ │ ├── index.ts
│ │ │ └── src
│ │ │ │ ├── editor.vue
│ │ │ │ ├── helper.ts
│ │ │ │ ├── img-upload.vue
│ │ │ │ └── tinymce.ts
│ │ ├── tree
│ │ │ ├── index.ts
│ │ │ └── src
│ │ │ │ ├── data.tsx
│ │ │ │ ├── helper.tsx
│ │ │ │ ├── hook.tsx
│ │ │ │ ├── menu-select-table.vue
│ │ │ │ └── tree-select-panel.vue
│ │ └── upload
│ │ │ ├── index.ts
│ │ │ └── src
│ │ │ ├── file-upload.vue
│ │ │ ├── helper.ts
│ │ │ ├── image-upload.vue
│ │ │ ├── typing.ts
│ │ │ └── use-upload.ts
│ ├── layouts
│ │ ├── auth.vue
│ │ ├── basic.vue
│ │ └── index.ts
│ ├── locales
│ │ ├── README.md
│ │ ├── index.ts
│ │ └── langs
│ │ │ ├── en-US
│ │ │ ├── component.json
│ │ │ ├── demos.json
│ │ │ ├── http.json
│ │ │ ├── menu.json
│ │ │ ├── page.json
│ │ │ └── pages.json
│ │ │ └── zh-CN
│ │ │ ├── component.json
│ │ │ ├── demos.json
│ │ │ ├── http.json
│ │ │ ├── menu.json
│ │ │ ├── page.json
│ │ │ └── pages.json
│ ├── main.ts
│ ├── preferences.ts
│ ├── router
│ │ ├── access.ts
│ │ ├── guard.ts
│ │ ├── index.ts
│ │ └── routes
│ │ │ ├── core.ts
│ │ │ ├── index.ts
│ │ │ ├── local.ts
│ │ │ ├── modules
│ │ │ ├── dashboard.ts
│ │ │ └── vben.ts
│ │ │ └── workflow-iframe.ts
│ ├── store
│ │ ├── auth.ts
│ │ ├── dict.ts
│ │ ├── index.ts
│ │ ├── notify.ts
│ │ └── tenant.ts
│ ├── utils
│ │ ├── dict.ts
│ │ ├── encryption
│ │ │ ├── crypto.ts
│ │ │ └── jsencrypt.ts
│ │ ├── file
│ │ │ ├── base64Conver.ts
│ │ │ ├── download.ts
│ │ │ └── index.ts
│ │ ├── modal.tsx
│ │ └── render.tsx
│ └── views
│ │ ├── _core
│ │ ├── README.md
│ │ ├── about
│ │ │ └── index.vue
│ │ ├── authentication
│ │ │ ├── code-login.vue
│ │ │ ├── forget-password.vue
│ │ │ ├── login.vue
│ │ │ ├── oauth-login.vue
│ │ │ ├── qrcode-login.vue
│ │ │ └── register.vue
│ │ ├── fallback
│ │ │ ├── coming-soon.vue
│ │ │ ├── forbidden.vue
│ │ │ ├── internal-error.vue
│ │ │ ├── not-found.vue
│ │ │ └── offline.vue
│ │ ├── oauth-common.ts
│ │ ├── profile
│ │ │ ├── components
│ │ │ │ ├── account-bind.vue
│ │ │ │ ├── base-setting.vue
│ │ │ │ ├── online-device.vue
│ │ │ │ └── secure-setting.vue
│ │ │ ├── index.vue
│ │ │ ├── mitt.ts
│ │ │ ├── profile-panel.vue
│ │ │ └── setting-panel.vue
│ │ └── social-callback
│ │ │ └── index.vue
│ │ ├── dashboard
│ │ ├── analytics
│ │ │ ├── analytics-trends.vue
│ │ │ ├── analytics-visits-data.vue
│ │ │ ├── analytics-visits-sales.vue
│ │ │ ├── analytics-visits-source.vue
│ │ │ ├── analytics-visits.vue
│ │ │ └── index.vue
│ │ └── workspace
│ │ │ └── index.vue
│ │ ├── demo
│ │ ├── demo
│ │ │ ├── api
│ │ │ │ ├── index.ts
│ │ │ │ └── model.d.ts
│ │ │ ├── data.ts
│ │ │ ├── demo-modal.vue
│ │ │ └── index.vue
│ │ └── tree
│ │ │ ├── api
│ │ │ ├── index.ts
│ │ │ └── model.d.ts
│ │ │ ├── data.ts
│ │ │ ├── index.vue
│ │ │ └── tree-modal.vue
│ │ ├── monitor
│ │ ├── admin
│ │ │ └── index.vue
│ │ ├── cache
│ │ │ ├── components
│ │ │ │ ├── command-chart.vue
│ │ │ │ ├── index.ts
│ │ │ │ ├── memory-chart.vue
│ │ │ │ └── redis-description.vue
│ │ │ └── index.vue
│ │ ├── logininfor
│ │ │ ├── data.tsx
│ │ │ ├── index.vue
│ │ │ └── login-info-modal.vue
│ │ ├── online
│ │ │ ├── data.ts
│ │ │ └── index.vue
│ │ ├── operlog
│ │ │ ├── data.tsx
│ │ │ ├── index.vue
│ │ │ └── operation-preview-drawer.vue
│ │ └── snailjob
│ │ │ └── index.vue
│ │ ├── system
│ │ ├── client
│ │ │ ├── client-drawer.vue
│ │ │ ├── data.tsx
│ │ │ ├── index.vue
│ │ │ └── secret-input.vue
│ │ ├── config
│ │ │ ├── config-modal.vue
│ │ │ ├── data.ts
│ │ │ └── index.vue
│ │ ├── configurationManage
│ │ │ └── index.vue
│ │ ├── dept
│ │ │ ├── data.ts
│ │ │ ├── dept-drawer.vue
│ │ │ └── index.vue
│ │ ├── dict
│ │ │ ├── data
│ │ │ │ ├── data.ts
│ │ │ │ ├── dict-data-drawer.vue
│ │ │ │ ├── index.vue
│ │ │ │ └── tag-style-picker.vue
│ │ │ ├── index.vue
│ │ │ ├── mitt.ts
│ │ │ └── type
│ │ │ │ ├── data.ts
│ │ │ │ ├── dict-type-modal.vue
│ │ │ │ └── index.vue
│ │ ├── gpts
│ │ │ ├── data.ts
│ │ │ ├── gpts-modal.vue
│ │ │ └── index.vue
│ │ ├── knowledgeBase
│ │ │ └── index.vue
│ │ ├── menu
│ │ │ ├── data.tsx
│ │ │ ├── index.vue
│ │ │ └── menu-drawer.vue
│ │ ├── message
│ │ │ ├── data.ts
│ │ │ ├── index.vue
│ │ │ └── message-modal.vue
│ │ ├── model
│ │ │ ├── data.ts
│ │ │ ├── index.vue
│ │ │ └── model-modal.vue
│ │ ├── notice
│ │ │ ├── data.ts
│ │ │ ├── index.vue
│ │ │ └── notice-modal.vue
│ │ ├── oss-config
│ │ │ ├── data.tsx
│ │ │ ├── index.vue
│ │ │ └── oss-config-drawer.vue
│ │ ├── oss
│ │ │ ├── data.tsx
│ │ │ ├── file-upload-modal.vue
│ │ │ ├── image-upload-modal.vue
│ │ │ └── index.vue
│ │ ├── packagePlan
│ │ │ ├── data.ts
│ │ │ ├── index.vue
│ │ │ └── packagePlan-modal.vue
│ │ ├── payOrder
│ │ │ ├── data.ts
│ │ │ ├── index.vue
│ │ │ └── payOrder-modal.vue
│ │ ├── plugin
│ │ │ ├── data.ts
│ │ │ ├── index.vue
│ │ │ └── plugin-modal.vue
│ │ ├── post
│ │ │ ├── data.ts
│ │ │ ├── index.vue
│ │ │ └── post-drawer.vue
│ │ ├── role-assign
│ │ │ ├── data.tsx
│ │ │ ├── index.vue
│ │ │ └── role-assign-drawer.vue
│ │ ├── role
│ │ │ ├── data.tsx
│ │ │ ├── index.vue
│ │ │ ├── role-auth-modal.vue
│ │ │ └── role-drawer.vue
│ │ ├── tenant
│ │ │ ├── data.tsx
│ │ │ ├── index.vue
│ │ │ └── tenant-drawer.vue
│ │ ├── tenantPackage
│ │ │ ├── data.ts
│ │ │ ├── index.vue
│ │ │ ├── tenant-package-drawer.vue
│ │ │ └── tree-item.tsx
│ │ ├── user
│ │ │ ├── data.tsx
│ │ │ ├── dept-tree.vue
│ │ │ ├── index.vue
│ │ │ ├── info.tsx
│ │ │ ├── user-drawer.vue
│ │ │ ├── user-import-modal.vue
│ │ │ ├── user-info-modal.vue
│ │ │ └── user-reset-pwd-modal.vue
│ │ └── voucher
│ │ │ ├── data.ts
│ │ │ ├── index.vue
│ │ │ └── voucher-modal.vue
│ │ ├── tool
│ │ └── gen
│ │ │ ├── code-preview-modal.vue
│ │ │ ├── data.tsx
│ │ │ ├── edit-gen.vue
│ │ │ ├── edit-steps
│ │ │ ├── basic-setting.vue
│ │ │ ├── basic.tsx
│ │ │ ├── gen-config.vue
│ │ │ ├── gen-data.tsx
│ │ │ └── index.ts
│ │ │ ├── index.vue
│ │ │ └── table-import-modal.vue
│ │ └── workflow
│ │ ├── category
│ │ ├── category-modal.vue
│ │ ├── data.ts
│ │ └── index.vue
│ │ ├── components
│ │ ├── apply-modal.vue
│ │ ├── approval-card.vue
│ │ ├── approval-content.vue
│ │ ├── approval-details.vue
│ │ ├── approval-modal.vue
│ │ ├── approval-panel.vue
│ │ ├── approval-rejection-modal.vue
│ │ ├── approval-timeline-item.vue
│ │ ├── approval-timeline.vue
│ │ ├── copy-component.vue
│ │ ├── flow-designer.vue
│ │ ├── flow-info-modal.vue
│ │ ├── flow-interfere-modal.vue
│ │ ├── helper.tsx
│ │ ├── index.ts
│ │ └── user-select-modal.vue
│ │ ├── leave
│ │ ├── api
│ │ │ ├── index.ts
│ │ │ └── model.d.ts
│ │ ├── data.tsx
│ │ ├── index.vue
│ │ ├── leave-description.vue
│ │ └── leave-form.vue
│ │ ├── processDefinition
│ │ ├── category-tree.vue
│ │ ├── constant.ts
│ │ ├── data.tsx
│ │ ├── index.vue
│ │ ├── process-definition-deploy-modal.vue
│ │ └── process-definition-modal.vue
│ │ ├── processInstance
│ │ ├── data.tsx
│ │ ├── index.vue
│ │ ├── instance-invalid-modal.vue
│ │ └── instance-variable-modal.vue
│ │ └── task
│ │ ├── allTaskWaiting.vue
│ │ ├── myDocument.vue
│ │ ├── taskCopyList.vue
│ │ ├── taskFinish.vue
│ │ └── taskWaiting.vue
│ ├── tailwind.config.mjs
│ ├── tsconfig.json
│ ├── tsconfig.node.json
│ ├── types
│ ├── directive.d.ts
│ └── global-components.d.ts
│ └── vite.config.mts
├── cspell.json
├── docs
├── .vitepress
│ ├── components
│ │ ├── demo-preview.vue
│ │ ├── index.ts
│ │ └── preview-group.vue
│ ├── config
│ │ ├── en.mts
│ │ ├── index.mts
│ │ ├── plugins
│ │ │ └── demo-preview.ts
│ │ ├── shared.mts
│ │ └── zh.mts
│ └── theme
│ │ ├── components
│ │ ├── site-layout.vue
│ │ └── vben-contributors.vue
│ │ ├── index.ts
│ │ ├── plugins
│ │ └── hm.ts
│ │ └── styles
│ │ ├── base.css
│ │ ├── index.ts
│ │ └── variables.css
├── package.json
├── src
│ ├── _env
│ │ ├── adapter
│ │ │ ├── component.ts
│ │ │ ├── form.ts
│ │ │ └── vxe-table.ts
│ │ └── node
│ │ │ └── adapter
│ │ │ ├── form.ts
│ │ │ └── vxe-table.ts
│ ├── commercial
│ │ ├── community.md
│ │ ├── customized.md
│ │ └── technical-support.md
│ ├── components
│ │ ├── common-ui
│ │ │ ├── vben-api-component.md
│ │ │ ├── vben-count-to-animator.md
│ │ │ ├── vben-drawer.md
│ │ │ ├── vben-ellipsis-text.md
│ │ │ ├── vben-form.md
│ │ │ ├── vben-modal.md
│ │ │ └── vben-vxe-table.md
│ │ ├── introduction.md
│ │ └── layout-ui
│ │ │ └── page.md
│ ├── demos
│ │ ├── vben-api-component
│ │ │ └── cascader
│ │ │ │ └── index.vue
│ │ ├── vben-count-to-animator
│ │ │ ├── basic
│ │ │ │ └── index.vue
│ │ │ └── custom
│ │ │ │ └── index.vue
│ │ ├── vben-drawer
│ │ │ ├── auto-height
│ │ │ │ ├── drawer.vue
│ │ │ │ └── index.vue
│ │ │ ├── basic
│ │ │ │ └── index.vue
│ │ │ ├── dynamic
│ │ │ │ ├── drawer.vue
│ │ │ │ └── index.vue
│ │ │ ├── extra
│ │ │ │ ├── drawer.vue
│ │ │ │ └── index.vue
│ │ │ └── shared-data
│ │ │ │ ├── drawer.vue
│ │ │ │ └── index.vue
│ │ ├── vben-ellipsis-text
│ │ │ ├── expand
│ │ │ │ └── index.vue
│ │ │ ├── line
│ │ │ │ └── index.vue
│ │ │ └── tooltip
│ │ │ │ └── index.vue
│ │ ├── vben-form
│ │ │ ├── api
│ │ │ │ └── index.vue
│ │ │ ├── basic
│ │ │ │ └── index.vue
│ │ │ ├── custom
│ │ │ │ └── index.vue
│ │ │ ├── dynamic
│ │ │ │ └── index.vue
│ │ │ ├── query
│ │ │ │ └── index.vue
│ │ │ └── rules
│ │ │ │ └── index.vue
│ │ ├── vben-modal
│ │ │ ├── auto-height
│ │ │ │ ├── index.vue
│ │ │ │ └── modal.vue
│ │ │ ├── basic
│ │ │ │ └── index.vue
│ │ │ ├── draggable
│ │ │ │ ├── index.vue
│ │ │ │ └── modal.vue
│ │ │ ├── dynamic
│ │ │ │ ├── index.vue
│ │ │ │ └── modal.vue
│ │ │ ├── extra
│ │ │ │ ├── index.vue
│ │ │ │ └── modal.vue
│ │ │ └── shared-data
│ │ │ │ ├── index.vue
│ │ │ │ └── modal.vue
│ │ └── vben-vxe-table
│ │ │ ├── basic
│ │ │ └── index.vue
│ │ │ ├── custom-cell
│ │ │ └── index.vue
│ │ │ ├── edit-cell
│ │ │ └── index.vue
│ │ │ ├── edit-row
│ │ │ └── index.vue
│ │ │ ├── fixed
│ │ │ └── index.vue
│ │ │ ├── form
│ │ │ └── index.vue
│ │ │ ├── mock-api.ts
│ │ │ ├── remote
│ │ │ └── index.vue
│ │ │ ├── table-data.ts
│ │ │ ├── tree
│ │ │ └── index.vue
│ │ │ └── virtual
│ │ │ └── index.vue
│ ├── en
│ │ ├── guide
│ │ │ ├── essentials
│ │ │ │ ├── build.md
│ │ │ │ ├── concept.md
│ │ │ │ ├── development.md
│ │ │ │ ├── external-module.md
│ │ │ │ ├── icons.md
│ │ │ │ ├── route.md
│ │ │ │ ├── server.md
│ │ │ │ ├── settings.md
│ │ │ │ └── styles.md
│ │ │ ├── in-depth
│ │ │ │ ├── access.md
│ │ │ │ ├── check-updates.md
│ │ │ │ ├── features.md
│ │ │ │ ├── layout.md
│ │ │ │ ├── loading.md
│ │ │ │ ├── locale.md
│ │ │ │ ├── login.md
│ │ │ │ ├── theme.md
│ │ │ │ └── ui-framework.md
│ │ │ ├── introduction
│ │ │ │ ├── changelog.md
│ │ │ │ ├── quick-start.md
│ │ │ │ ├── roadmap.md
│ │ │ │ ├── thin.md
│ │ │ │ ├── vben.md
│ │ │ │ └── why.md
│ │ │ ├── other
│ │ │ │ ├── faq.md
│ │ │ │ ├── project-update.md
│ │ │ │ └── remove-code.md
│ │ │ └── project
│ │ │ │ ├── changeset.md
│ │ │ │ ├── cli.md
│ │ │ │ ├── dir.md
│ │ │ │ ├── standard.md
│ │ │ │ ├── tailwindcss.md
│ │ │ │ ├── test.md
│ │ │ │ └── vite.md
│ │ └── index.md
│ ├── friend-links
│ │ └── index.md
│ ├── guide
│ │ ├── essentials
│ │ │ ├── build.md
│ │ │ ├── concept.md
│ │ │ ├── development.md
│ │ │ ├── external-module.md
│ │ │ ├── icons.md
│ │ │ ├── route.md
│ │ │ ├── server.md
│ │ │ ├── settings.md
│ │ │ └── styles.md
│ │ ├── in-depth
│ │ │ ├── access.md
│ │ │ ├── check-updates.md
│ │ │ ├── features.md
│ │ │ ├── layout.md
│ │ │ ├── loading.md
│ │ │ ├── locale.md
│ │ │ ├── login.md
│ │ │ ├── theme.md
│ │ │ └── ui-framework.md
│ │ ├── introduction
│ │ │ ├── changelog.md
│ │ │ ├── quick-start.md
│ │ │ ├── roadmap.md
│ │ │ ├── thin.md
│ │ │ ├── vben.md
│ │ │ └── why.md
│ │ ├── other
│ │ │ ├── faq.md
│ │ │ ├── project-update.md
│ │ │ └── remove-code.md
│ │ └── project
│ │ │ ├── changeset.md
│ │ │ ├── cli.md
│ │ │ ├── dir.md
│ │ │ ├── standard.md
│ │ │ ├── tailwindcss.md
│ │ │ ├── test.md
│ │ │ └── vite.md
│ ├── index.md
│ ├── public
│ │ ├── favicon.ico
│ │ ├── guide
│ │ │ ├── devtools.png
│ │ │ ├── loading.png
│ │ │ ├── locale.png
│ │ │ ├── login-expired.png
│ │ │ ├── login.png
│ │ │ ├── preferences.png
│ │ │ ├── qq.png
│ │ │ ├── qq_channel.png
│ │ │ ├── report.png
│ │ │ ├── test.png
│ │ │ └── update-notice.png
│ │ └── logos
│ │ │ ├── nitro.svg
│ │ │ ├── shadcn-ui.svg
│ │ │ ├── turborepo.svg
│ │ │ └── vite.svg
│ └── sponsor
│ │ └── personal.md
├── tailwind.config.mjs
└── tsconfig.json
├── eslint.config.mjs
├── internal
├── lint-configs
│ ├── commitlint-config
│ │ ├── index.mjs
│ │ └── package.json
│ ├── eslint-config
│ │ ├── build.config.ts
│ │ ├── package.json
│ │ ├── src
│ │ │ ├── configs
│ │ │ │ ├── command.ts
│ │ │ │ ├── comments.ts
│ │ │ │ ├── disableds.ts
│ │ │ │ ├── ignores.ts
│ │ │ │ ├── import.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── javascript.ts
│ │ │ │ ├── jsdoc.ts
│ │ │ │ ├── jsonc.ts
│ │ │ │ ├── node.ts
│ │ │ │ ├── perfectionist.ts
│ │ │ │ ├── prettier.ts
│ │ │ │ ├── regexp.ts
│ │ │ │ ├── test.ts
│ │ │ │ ├── turbo.ts
│ │ │ │ ├── typescript.ts
│ │ │ │ ├── unicorn.ts
│ │ │ │ └── vue.ts
│ │ │ ├── custom-config.ts
│ │ │ ├── index.ts
│ │ │ └── util.ts
│ │ └── tsconfig.json
│ ├── prettier-config
│ │ ├── index.mjs
│ │ └── package.json
│ └── stylelint-config
│ │ ├── index.mjs
│ │ └── package.json
├── node-utils
│ ├── build.config.ts
│ ├── package.json
│ ├── src
│ │ ├── __tests__
│ │ │ ├── hash.test.ts
│ │ │ └── path.test.ts
│ │ ├── constants.ts
│ │ ├── date.ts
│ │ ├── fs.ts
│ │ ├── git.ts
│ │ ├── hash.ts
│ │ ├── index.ts
│ │ ├── monorepo.ts
│ │ ├── path.ts
│ │ ├── prettier.ts
│ │ └── spinner.ts
│ └── tsconfig.json
├── tailwind-config
│ ├── build.config.ts
│ ├── package.json
│ ├── src
│ │ ├── index.ts
│ │ ├── module.d.ts
│ │ ├── plugins
│ │ │ └── entry.ts
│ │ └── postcss.config.ts
│ └── tsconfig.json
├── tsconfig
│ ├── base.json
│ ├── library.json
│ ├── node.json
│ ├── package.json
│ ├── web-app.json
│ └── web.json
└── vite-config
│ ├── build.config.ts
│ ├── package.json
│ ├── src
│ ├── config
│ │ ├── application.ts
│ │ ├── common.ts
│ │ ├── index.ts
│ │ └── library.ts
│ ├── index.ts
│ ├── options.ts
│ ├── plugins
│ │ ├── archiver.ts
│ │ ├── extra-app-config.ts
│ │ ├── importmap.ts
│ │ ├── index.ts
│ │ ├── inject-app-loading
│ │ │ ├── README.md
│ │ │ ├── default-loading-antd.html
│ │ │ ├── default-loading.html
│ │ │ └── index.ts
│ │ ├── inject-metadata.ts
│ │ ├── license.ts
│ │ ├── nitro-mock.ts
│ │ ├── print.ts
│ │ └── vxe-table.ts
│ ├── typing.ts
│ └── utils
│ │ └── env.ts
│ └── tsconfig.json
├── package.json
├── packages
├── @core
│ ├── README.md
│ ├── base
│ │ ├── README.md
│ │ ├── design
│ │ │ ├── package.json
│ │ │ ├── src
│ │ │ │ ├── css
│ │ │ │ │ ├── global.css
│ │ │ │ │ ├── nprogress.css
│ │ │ │ │ ├── transition.css
│ │ │ │ │ └── ui.css
│ │ │ │ ├── design-tokens
│ │ │ │ │ ├── dark.css
│ │ │ │ │ ├── default.css
│ │ │ │ │ └── index.ts
│ │ │ │ ├── index.ts
│ │ │ │ └── scss-bem
│ │ │ │ │ ├── bem.scss
│ │ │ │ │ └── constants.scss
│ │ │ ├── tsconfig.json
│ │ │ └── vite.config.mts
│ │ ├── icons
│ │ │ ├── build.config.ts
│ │ │ ├── package.json
│ │ │ ├── src
│ │ │ │ ├── create-icon.ts
│ │ │ │ ├── index.ts
│ │ │ │ └── lucide.ts
│ │ │ └── tsconfig.json
│ │ ├── shared
│ │ │ ├── build.config.ts
│ │ │ ├── package.json
│ │ │ ├── src
│ │ │ │ ├── cache
│ │ │ │ │ ├── __tests__
│ │ │ │ │ │ └── storage-manager.test.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── storage-manager.ts
│ │ │ │ │ └── types.ts
│ │ │ │ ├── color
│ │ │ │ │ ├── __tests__
│ │ │ │ │ │ └── convert.test.ts
│ │ │ │ │ ├── color.ts
│ │ │ │ │ ├── convert.ts
│ │ │ │ │ ├── generator.ts
│ │ │ │ │ └── index.ts
│ │ │ │ ├── constants
│ │ │ │ │ ├── dict-enum.ts
│ │ │ │ │ ├── globals.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── vben.ts
│ │ │ │ ├── global-state.ts
│ │ │ │ ├── store.ts
│ │ │ │ └── utils
│ │ │ │ │ ├── __tests__
│ │ │ │ │ ├── diff.test.ts
│ │ │ │ │ ├── dom.test.ts
│ │ │ │ │ ├── inference.test.ts
│ │ │ │ │ ├── letter.test.ts
│ │ │ │ │ ├── state-handler.test.ts
│ │ │ │ │ ├── tree.test.ts
│ │ │ │ │ ├── unique.test.ts
│ │ │ │ │ ├── update-css-variables.test.ts
│ │ │ │ │ ├── util.test.ts
│ │ │ │ │ └── window.test.ts
│ │ │ │ │ ├── cn.ts
│ │ │ │ │ ├── date.ts
│ │ │ │ │ ├── diff.ts
│ │ │ │ │ ├── dom.ts
│ │ │ │ │ ├── download.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── inference.ts
│ │ │ │ │ ├── letter.ts
│ │ │ │ │ ├── merge.ts
│ │ │ │ │ ├── nprogress.ts
│ │ │ │ │ ├── state-handler.ts
│ │ │ │ │ ├── to.ts
│ │ │ │ │ ├── tree.ts
│ │ │ │ │ ├── unique.ts
│ │ │ │ │ ├── update-css-variables.ts
│ │ │ │ │ ├── util.ts
│ │ │ │ │ └── window.ts
│ │ │ └── tsconfig.json
│ │ └── typings
│ │ │ ├── build.config.ts
│ │ │ ├── package.json
│ │ │ ├── src
│ │ │ ├── app.d.ts
│ │ │ ├── basic.d.ts
│ │ │ ├── helper.d.ts
│ │ │ ├── index.ts
│ │ │ ├── menu-record.ts
│ │ │ ├── tabs.ts
│ │ │ └── vue-router.d.ts
│ │ │ ├── tsconfig.json
│ │ │ └── vue-router.d.ts
│ ├── composables
│ │ ├── build.config.ts
│ │ ├── package.json
│ │ ├── src
│ │ │ ├── __tests__
│ │ │ │ └── use-sortable.test.ts
│ │ │ ├── index.ts
│ │ │ ├── use-is-mobile.ts
│ │ │ ├── use-layout-style.ts
│ │ │ ├── use-namespace.ts
│ │ │ ├── use-priority-value.ts
│ │ │ ├── use-scroll-lock.ts
│ │ │ ├── use-simple-locale
│ │ │ │ ├── README.md
│ │ │ │ ├── index.ts
│ │ │ │ └── messages.ts
│ │ │ └── use-sortable.ts
│ │ └── tsconfig.json
│ ├── preferences
│ │ ├── __tests__
│ │ │ ├── __snapshots__
│ │ │ │ └── config.test.ts.snap
│ │ │ ├── config.test.ts
│ │ │ └── preferences.test.ts
│ │ ├── build.config.ts
│ │ ├── package.json
│ │ ├── src
│ │ │ ├── config.ts
│ │ │ ├── constants.ts
│ │ │ ├── index.ts
│ │ │ ├── preferences.ts
│ │ │ ├── types.ts
│ │ │ ├── update-css-variables.ts
│ │ │ └── use-preferences.ts
│ │ └── tsconfig.json
│ └── ui-kit
│ │ ├── README.md
│ │ ├── form-ui
│ │ ├── __tests__
│ │ │ └── form-api.test.ts
│ │ ├── build.config.ts
│ │ ├── package.json
│ │ ├── postcss.config.mjs
│ │ ├── src
│ │ │ ├── components
│ │ │ │ └── form-actions.vue
│ │ │ ├── config.ts
│ │ │ ├── form-api.ts
│ │ │ ├── form-render
│ │ │ │ ├── context.ts
│ │ │ │ ├── dependencies.ts
│ │ │ │ ├── expandable.ts
│ │ │ │ ├── form-field.vue
│ │ │ │ ├── form-label.vue
│ │ │ │ ├── form.vue
│ │ │ │ ├── helper.ts
│ │ │ │ └── index.ts
│ │ │ ├── index.ts
│ │ │ ├── types.ts
│ │ │ ├── use-form-context.ts
│ │ │ ├── use-vben-form.ts
│ │ │ ├── vben-form.vue
│ │ │ └── vben-use-form.vue
│ │ ├── tailwind.config.mjs
│ │ └── tsconfig.json
│ │ ├── layout-ui
│ │ ├── build.config.ts
│ │ ├── package.json
│ │ ├── postcss.config.mjs
│ │ ├── src
│ │ │ ├── components
│ │ │ │ ├── index.ts
│ │ │ │ ├── layout-content.vue
│ │ │ │ ├── layout-footer.vue
│ │ │ │ ├── layout-header.vue
│ │ │ │ ├── layout-sidebar.vue
│ │ │ │ ├── layout-tabbar.vue
│ │ │ │ └── widgets
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── sidebar-collapse-button.vue
│ │ │ │ │ └── sidebar-fixed-button.vue
│ │ │ ├── hooks
│ │ │ │ └── use-layout.ts
│ │ │ ├── index.ts
│ │ │ ├── vben-layout.ts
│ │ │ └── vben-layout.vue
│ │ ├── tailwind.config.mjs
│ │ └── tsconfig.json
│ │ ├── menu-ui
│ │ ├── README.md
│ │ ├── build.config.ts
│ │ ├── package.json
│ │ ├── postcss.config.mjs
│ │ ├── src
│ │ │ ├── components
│ │ │ │ ├── collapse-transition.vue
│ │ │ │ ├── index.ts
│ │ │ │ ├── menu-badge-dot.vue
│ │ │ │ ├── menu-badge.vue
│ │ │ │ ├── menu-item.vue
│ │ │ │ ├── menu.vue
│ │ │ │ ├── normal-menu
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── normal-menu.ts
│ │ │ │ │ └── normal-menu.vue
│ │ │ │ ├── sub-menu-content.vue
│ │ │ │ └── sub-menu.vue
│ │ │ ├── hooks
│ │ │ │ ├── index.ts
│ │ │ │ ├── use-menu-context.ts
│ │ │ │ └── use-menu.ts
│ │ │ ├── index.ts
│ │ │ ├── menu.vue
│ │ │ ├── sub-menu.vue
│ │ │ ├── types.ts
│ │ │ └── utils
│ │ │ │ └── index.ts
│ │ ├── tailwind.config.mjs
│ │ └── tsconfig.json
│ │ ├── popup-ui
│ │ ├── build.config.ts
│ │ ├── package.json
│ │ ├── postcss.config.mjs
│ │ ├── src
│ │ │ ├── drawer
│ │ │ │ ├── __tests__
│ │ │ │ │ └── drawer-api.test.ts
│ │ │ │ ├── drawer-api.ts
│ │ │ │ ├── drawer.ts
│ │ │ │ ├── drawer.vue
│ │ │ │ ├── index.ts
│ │ │ │ └── use-drawer.ts
│ │ │ ├── index.ts
│ │ │ └── modal
│ │ │ │ ├── __tests__
│ │ │ │ └── modal-api.test.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── modal-api.ts
│ │ │ │ ├── modal.ts
│ │ │ │ ├── modal.vue
│ │ │ │ ├── use-modal-draggable.ts
│ │ │ │ └── use-modal.ts
│ │ ├── tailwind.config.mjs
│ │ └── tsconfig.json
│ │ ├── shadcn-ui
│ │ ├── build.config.ts
│ │ ├── components.json
│ │ ├── package.json
│ │ ├── postcss.config.mjs
│ │ ├── src
│ │ │ ├── components
│ │ │ │ ├── avatar
│ │ │ │ │ ├── avatar.vue
│ │ │ │ │ └── index.ts
│ │ │ │ ├── back-top
│ │ │ │ │ ├── back-top.vue
│ │ │ │ │ ├── backtop.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── use-backtop.ts
│ │ │ │ ├── breadcrumb
│ │ │ │ │ ├── breadcrumb-background.vue
│ │ │ │ │ ├── breadcrumb-view.vue
│ │ │ │ │ ├── breadcrumb.vue
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── types.ts
│ │ │ │ ├── button
│ │ │ │ │ ├── button-group.vue
│ │ │ │ │ ├── button.ts
│ │ │ │ │ ├── button.vue
│ │ │ │ │ ├── check-button-group.vue
│ │ │ │ │ ├── icon-button.vue
│ │ │ │ │ └── index.ts
│ │ │ │ ├── checkbox
│ │ │ │ │ ├── checkbox.vue
│ │ │ │ │ └── index.ts
│ │ │ │ ├── context-menu
│ │ │ │ │ ├── context-menu.vue
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── interface.ts
│ │ │ │ ├── count-to-animator
│ │ │ │ │ ├── count-to-animator.vue
│ │ │ │ │ └── index.ts
│ │ │ │ ├── dropdown-menu
│ │ │ │ │ ├── dropdown-menu.vue
│ │ │ │ │ ├── dropdown-radio-menu.vue
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── interface.ts
│ │ │ │ ├── expandable-arrow
│ │ │ │ │ ├── expandable-arrow.vue
│ │ │ │ │ └── index.ts
│ │ │ │ ├── full-screen
│ │ │ │ │ ├── full-screen.vue
│ │ │ │ │ └── index.ts
│ │ │ │ ├── hover-card
│ │ │ │ │ ├── hover-card.vue
│ │ │ │ │ └── index.ts
│ │ │ │ ├── icon
│ │ │ │ │ ├── icon.vue
│ │ │ │ │ └── index.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── input-captcha
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── input-captcha.vue
│ │ │ │ ├── input-password
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── input-password.vue
│ │ │ │ │ └── password-strength.vue
│ │ │ │ ├── logo
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── logo.vue
│ │ │ │ ├── pin-input
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── input.vue
│ │ │ │ │ └── types.ts
│ │ │ │ ├── popover
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── popover.vue
│ │ │ │ ├── render-content
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── render-content.vue
│ │ │ │ ├── scrollbar
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── scrollbar.vue
│ │ │ │ ├── segmented
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── segmented.vue
│ │ │ │ │ ├── tabs-indicator.vue
│ │ │ │ │ └── types.ts
│ │ │ │ ├── select
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── select.vue
│ │ │ │ ├── spine-text
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── spine-text.vue
│ │ │ │ ├── spinner
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── loading.vue
│ │ │ │ │ └── spinner.vue
│ │ │ │ └── tooltip
│ │ │ │ │ ├── help-tooltip.vue
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── tooltip.vue
│ │ │ ├── index.ts
│ │ │ └── ui
│ │ │ │ ├── accordion
│ │ │ │ ├── Accordion.vue
│ │ │ │ ├── AccordionContent.vue
│ │ │ │ ├── AccordionItem.vue
│ │ │ │ ├── AccordionTrigger.vue
│ │ │ │ └── index.ts
│ │ │ │ ├── avatar
│ │ │ │ ├── Avatar.vue
│ │ │ │ ├── AvatarFallback.vue
│ │ │ │ ├── AvatarImage.vue
│ │ │ │ ├── avatar.ts
│ │ │ │ └── index.ts
│ │ │ │ ├── badge
│ │ │ │ ├── Badge.vue
│ │ │ │ ├── badge.ts
│ │ │ │ └── index.ts
│ │ │ │ ├── breadcrumb
│ │ │ │ ├── Breadcrumb.vue
│ │ │ │ ├── BreadcrumbEllipsis.vue
│ │ │ │ ├── BreadcrumbItem.vue
│ │ │ │ ├── BreadcrumbLink.vue
│ │ │ │ ├── BreadcrumbList.vue
│ │ │ │ ├── BreadcrumbPage.vue
│ │ │ │ ├── BreadcrumbSeparator.vue
│ │ │ │ └── index.ts
│ │ │ │ ├── button
│ │ │ │ ├── Button.vue
│ │ │ │ ├── button.ts
│ │ │ │ ├── index.ts
│ │ │ │ └── types.ts
│ │ │ │ ├── card
│ │ │ │ ├── Card.vue
│ │ │ │ ├── CardContent.vue
│ │ │ │ ├── CardDescription.vue
│ │ │ │ ├── CardFooter.vue
│ │ │ │ ├── CardHeader.vue
│ │ │ │ ├── CardTitle.vue
│ │ │ │ └── index.ts
│ │ │ │ ├── checkbox
│ │ │ │ ├── Checkbox.vue
│ │ │ │ └── index.ts
│ │ │ │ ├── context-menu
│ │ │ │ ├── ContextMenu.vue
│ │ │ │ ├── ContextMenuCheckboxItem.vue
│ │ │ │ ├── ContextMenuContent.vue
│ │ │ │ ├── ContextMenuGroup.vue
│ │ │ │ ├── ContextMenuItem.vue
│ │ │ │ ├── ContextMenuLabel.vue
│ │ │ │ ├── ContextMenuPortal.vue
│ │ │ │ ├── ContextMenuRadioGroup.vue
│ │ │ │ ├── ContextMenuRadioItem.vue
│ │ │ │ ├── ContextMenuSeparator.vue
│ │ │ │ ├── ContextMenuShortcut.vue
│ │ │ │ ├── ContextMenuSub.vue
│ │ │ │ ├── ContextMenuSubContent.vue
│ │ │ │ ├── ContextMenuSubTrigger.vue
│ │ │ │ ├── ContextMenuTrigger.vue
│ │ │ │ └── index.ts
│ │ │ │ ├── dialog
│ │ │ │ ├── Dialog.vue
│ │ │ │ ├── DialogClose.vue
│ │ │ │ ├── DialogContent.vue
│ │ │ │ ├── DialogDescription.vue
│ │ │ │ ├── DialogFooter.vue
│ │ │ │ ├── DialogHeader.vue
│ │ │ │ ├── DialogOverlay.vue
│ │ │ │ ├── DialogScrollContent.vue
│ │ │ │ ├── DialogTitle.vue
│ │ │ │ ├── DialogTrigger.vue
│ │ │ │ └── index.ts
│ │ │ │ ├── dropdown-menu
│ │ │ │ ├── DropdownMenu.vue
│ │ │ │ ├── DropdownMenuCheckboxItem.vue
│ │ │ │ ├── DropdownMenuContent.vue
│ │ │ │ ├── DropdownMenuGroup.vue
│ │ │ │ ├── DropdownMenuItem.vue
│ │ │ │ ├── DropdownMenuLabel.vue
│ │ │ │ ├── DropdownMenuRadioGroup.vue
│ │ │ │ ├── DropdownMenuRadioItem.vue
│ │ │ │ ├── DropdownMenuSeparator.vue
│ │ │ │ ├── DropdownMenuShortcut.vue
│ │ │ │ ├── DropdownMenuSub.vue
│ │ │ │ ├── DropdownMenuSubContent.vue
│ │ │ │ ├── DropdownMenuSubTrigger.vue
│ │ │ │ ├── DropdownMenuTrigger.vue
│ │ │ │ └── index.ts
│ │ │ │ ├── form
│ │ │ │ ├── FormControl.vue
│ │ │ │ ├── FormDescription.vue
│ │ │ │ ├── FormItem.vue
│ │ │ │ ├── FormLabel.vue
│ │ │ │ ├── FormMessage.vue
│ │ │ │ ├── index.ts
│ │ │ │ ├── injectionKeys.ts
│ │ │ │ └── useFormField.ts
│ │ │ │ ├── hover-card
│ │ │ │ ├── HoverCard.vue
│ │ │ │ ├── HoverCardContent.vue
│ │ │ │ ├── HoverCardTrigger.vue
│ │ │ │ └── index.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── input
│ │ │ │ ├── Input.vue
│ │ │ │ └── index.ts
│ │ │ │ ├── label
│ │ │ │ ├── Label.vue
│ │ │ │ └── index.ts
│ │ │ │ ├── number-field
│ │ │ │ ├── NumberField.vue
│ │ │ │ ├── NumberFieldContent.vue
│ │ │ │ ├── NumberFieldDecrement.vue
│ │ │ │ ├── NumberFieldIncrement.vue
│ │ │ │ ├── NumberFieldInput.vue
│ │ │ │ └── index.ts
│ │ │ │ ├── pagination
│ │ │ │ ├── PaginationEllipsis.vue
│ │ │ │ ├── PaginationFirst.vue
│ │ │ │ ├── PaginationLast.vue
│ │ │ │ ├── PaginationNext.vue
│ │ │ │ ├── PaginationPrev.vue
│ │ │ │ └── index.ts
│ │ │ │ ├── pin-input
│ │ │ │ ├── PinInput.vue
│ │ │ │ ├── PinInputGroup.vue
│ │ │ │ ├── PinInputInput.vue
│ │ │ │ ├── PinInputSeparator.vue
│ │ │ │ └── index.ts
│ │ │ │ ├── popover
│ │ │ │ ├── Popover.vue
│ │ │ │ ├── PopoverContent.vue
│ │ │ │ ├── PopoverTrigger.vue
│ │ │ │ └── index.ts
│ │ │ │ ├── radio-group
│ │ │ │ ├── RadioGroup.vue
│ │ │ │ ├── RadioGroupItem.vue
│ │ │ │ └── index.ts
│ │ │ │ ├── resizable
│ │ │ │ ├── ResizableHandle.vue
│ │ │ │ ├── ResizablePanelGroup.vue
│ │ │ │ └── index.ts
│ │ │ │ ├── scroll-area
│ │ │ │ ├── ScrollArea.vue
│ │ │ │ ├── ScrollBar.vue
│ │ │ │ └── index.ts
│ │ │ │ ├── select
│ │ │ │ ├── Select.vue
│ │ │ │ ├── SelectContent.vue
│ │ │ │ ├── SelectGroup.vue
│ │ │ │ ├── SelectItem.vue
│ │ │ │ ├── SelectItemText.vue
│ │ │ │ ├── SelectLabel.vue
│ │ │ │ ├── SelectScrollDownButton.vue
│ │ │ │ ├── SelectScrollUpButton.vue
│ │ │ │ ├── SelectSeparator.vue
│ │ │ │ ├── SelectTrigger.vue
│ │ │ │ ├── SelectValue.vue
│ │ │ │ └── index.ts
│ │ │ │ ├── separator
│ │ │ │ ├── Separator.vue
│ │ │ │ └── index.ts
│ │ │ │ ├── sheet
│ │ │ │ ├── Sheet.vue
│ │ │ │ ├── SheetClose.vue
│ │ │ │ ├── SheetContent.vue
│ │ │ │ ├── SheetDescription.vue
│ │ │ │ ├── SheetFooter.vue
│ │ │ │ ├── SheetHeader.vue
│ │ │ │ ├── SheetOverlay.vue
│ │ │ │ ├── SheetTitle.vue
│ │ │ │ ├── SheetTrigger.vue
│ │ │ │ ├── index.ts
│ │ │ │ └── sheet.ts
│ │ │ │ ├── switch
│ │ │ │ ├── Switch.vue
│ │ │ │ └── index.ts
│ │ │ │ ├── tabs
│ │ │ │ ├── Tabs.vue
│ │ │ │ ├── TabsContent.vue
│ │ │ │ ├── TabsList.vue
│ │ │ │ ├── TabsTrigger.vue
│ │ │ │ └── index.ts
│ │ │ │ ├── textarea
│ │ │ │ ├── Textarea.vue
│ │ │ │ └── index.ts
│ │ │ │ ├── toggle-group
│ │ │ │ ├── ToggleGroup.vue
│ │ │ │ ├── ToggleGroupItem.vue
│ │ │ │ └── index.ts
│ │ │ │ ├── toggle
│ │ │ │ ├── Toggle.vue
│ │ │ │ ├── index.ts
│ │ │ │ └── toggle.ts
│ │ │ │ ├── tooltip
│ │ │ │ ├── Tooltip.vue
│ │ │ │ ├── TooltipContent.vue
│ │ │ │ ├── TooltipProvider.vue
│ │ │ │ ├── TooltipTrigger.vue
│ │ │ │ └── index.ts
│ │ │ │ └── tree
│ │ │ │ ├── index.ts
│ │ │ │ └── tree.vue
│ │ ├── tailwind.config.mjs
│ │ └── tsconfig.json
│ │ └── tabs-ui
│ │ ├── build.config.ts
│ │ ├── package.json
│ │ ├── postcss.config.mjs
│ │ ├── src
│ │ ├── components
│ │ │ ├── index.ts
│ │ │ ├── tabs-chrome
│ │ │ │ └── tabs.vue
│ │ │ ├── tabs
│ │ │ │ └── tabs.vue
│ │ │ └── widgets
│ │ │ │ ├── index.ts
│ │ │ │ ├── tool-more.vue
│ │ │ │ └── tool-screen.vue
│ │ ├── index.ts
│ │ ├── tabs-view.vue
│ │ ├── types.ts
│ │ ├── use-tabs-drag.ts
│ │ └── use-tabs-view-scroll.ts
│ │ ├── tailwind.config.mjs
│ │ └── tsconfig.json
├── constants
│ ├── README.md
│ ├── package.json
│ ├── src
│ │ ├── core.ts
│ │ └── index.ts
│ └── tsconfig.json
├── effects
│ ├── README.md
│ ├── access
│ │ ├── package.json
│ │ ├── src
│ │ │ ├── access-control.vue
│ │ │ ├── accessible.ts
│ │ │ ├── directive.ts
│ │ │ ├── index.ts
│ │ │ └── use-access.ts
│ │ └── tsconfig.json
│ ├── common-ui
│ │ ├── package.json
│ │ ├── src
│ │ │ ├── components
│ │ │ │ ├── api-component
│ │ │ │ │ ├── api-component.vue
│ │ │ │ │ └── index.ts
│ │ │ │ ├── captcha
│ │ │ │ │ ├── hooks
│ │ │ │ │ │ └── useCaptchaPoints.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── point-selection-captcha
│ │ │ │ │ │ ├── index.vue
│ │ │ │ │ │ └── point-selection-captcha-card.vue
│ │ │ │ │ ├── slider-captcha
│ │ │ │ │ │ ├── index.vue
│ │ │ │ │ │ ├── slider-captcha-action.vue
│ │ │ │ │ │ ├── slider-captcha-bar.vue
│ │ │ │ │ │ └── slider-captcha-content.vue
│ │ │ │ │ ├── slider-rotate-captcha
│ │ │ │ │ │ └── index.vue
│ │ │ │ │ └── types.ts
│ │ │ │ ├── code-mirror
│ │ │ │ │ ├── code-mirror.vue
│ │ │ │ │ ├── data.ts
│ │ │ │ │ └── index.ts
│ │ │ │ ├── col-page
│ │ │ │ │ ├── col-page.vue
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── types.ts
│ │ │ │ ├── count-to
│ │ │ │ │ ├── count-to.vue
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── types.ts
│ │ │ │ ├── ellipsis-text
│ │ │ │ │ ├── ellipsis-text.vue
│ │ │ │ │ └── index.ts
│ │ │ │ ├── icon-picker
│ │ │ │ │ ├── icon-picker.vue
│ │ │ │ │ ├── icons.ts
│ │ │ │ │ └── index.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── json-preview
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── json-preview.vue
│ │ │ │ ├── json-viewer
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── index.vue
│ │ │ │ │ ├── style.scss
│ │ │ │ │ └── types.ts
│ │ │ │ ├── loading
│ │ │ │ │ ├── directive.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── loading.vue
│ │ │ │ │ └── spinner.vue
│ │ │ │ ├── markdown
│ │ │ │ │ ├── editor.vue
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── preview.vue
│ │ │ │ ├── page
│ │ │ │ │ ├── __tests__
│ │ │ │ │ │ └── page.test.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── page.vue
│ │ │ │ │ └── types.ts
│ │ │ │ ├── resize
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── resize.vue
│ │ │ │ └── tippy
│ │ │ │ │ ├── directive.ts
│ │ │ │ │ └── index.ts
│ │ │ ├── index.ts
│ │ │ └── ui
│ │ │ │ ├── about
│ │ │ │ ├── about.ts
│ │ │ │ ├── about.vue
│ │ │ │ └── index.ts
│ │ │ │ ├── authentication
│ │ │ │ ├── auth-title.vue
│ │ │ │ ├── code-login.vue
│ │ │ │ ├── forget-password.vue
│ │ │ │ ├── index.ts
│ │ │ │ ├── login-expired-modal.vue
│ │ │ │ ├── login.vue
│ │ │ │ ├── qrcode-login.vue
│ │ │ │ ├── register.vue
│ │ │ │ ├── third-party-login.vue
│ │ │ │ └── types.ts
│ │ │ │ ├── dashboard
│ │ │ │ ├── analysis
│ │ │ │ │ ├── analysis-chart-card.vue
│ │ │ │ │ ├── analysis-charts-tabs.vue
│ │ │ │ │ ├── analysis-overview.vue
│ │ │ │ │ └── index.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── typing.ts
│ │ │ │ └── workbench
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── workbench-header.vue
│ │ │ │ │ ├── workbench-project.vue
│ │ │ │ │ ├── workbench-quick-nav.vue
│ │ │ │ │ ├── workbench-todo.vue
│ │ │ │ │ └── workbench-trends.vue
│ │ │ │ ├── fallback
│ │ │ │ ├── fallback.ts
│ │ │ │ ├── fallback.vue
│ │ │ │ ├── icons
│ │ │ │ │ ├── icon-403.vue
│ │ │ │ │ ├── icon-404.vue
│ │ │ │ │ ├── icon-500.vue
│ │ │ │ │ ├── icon-coming-soon.vue
│ │ │ │ │ ├── icon-offline.vue
│ │ │ │ │ └── warning.svg
│ │ │ │ └── index.ts
│ │ │ │ └── index.ts
│ │ └── tsconfig.json
│ ├── hooks
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── src
│ │ │ ├── index.ts
│ │ │ ├── use-app-config.ts
│ │ │ ├── use-content-maximize.ts
│ │ │ ├── use-design-tokens.ts
│ │ │ ├── use-hover-toggle.ts
│ │ │ ├── use-pagination.ts
│ │ │ ├── use-refresh.ts
│ │ │ ├── use-tabs.ts
│ │ │ └── use-watermark.ts
│ │ └── tsconfig.json
│ ├── layouts
│ │ ├── package.json
│ │ ├── src
│ │ │ ├── authentication
│ │ │ │ ├── authentication.vue
│ │ │ │ ├── form.vue
│ │ │ │ ├── icons
│ │ │ │ │ └── slogan.vue
│ │ │ │ ├── index.ts
│ │ │ │ ├── toolbar.vue
│ │ │ │ └── types.ts
│ │ │ ├── basic
│ │ │ │ ├── README.md
│ │ │ │ ├── content
│ │ │ │ │ ├── content-spinner.vue
│ │ │ │ │ ├── content.vue
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── use-content-spinner.ts
│ │ │ │ ├── copyright
│ │ │ │ │ ├── copyright.vue
│ │ │ │ │ └── index.ts
│ │ │ │ ├── footer
│ │ │ │ │ ├── footer.vue
│ │ │ │ │ └── index.ts
│ │ │ │ ├── header
│ │ │ │ │ ├── header.vue
│ │ │ │ │ └── index.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── layout.vue
│ │ │ │ ├── menu
│ │ │ │ │ ├── extra-menu.vue
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── menu.vue
│ │ │ │ │ ├── mixed-menu.vue
│ │ │ │ │ ├── use-extra-menu.ts
│ │ │ │ │ ├── use-mixed-menu.ts
│ │ │ │ │ └── use-navigation.ts
│ │ │ │ └── tabbar
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── tabbar.vue
│ │ │ │ │ └── use-tabbar.ts
│ │ │ ├── iframe
│ │ │ │ ├── iframe-router-view.vue
│ │ │ │ ├── iframe-view.vue
│ │ │ │ └── index.ts
│ │ │ ├── index.ts
│ │ │ └── widgets
│ │ │ │ ├── breadcrumb.vue
│ │ │ │ ├── check-updates
│ │ │ │ ├── check-updates.vue
│ │ │ │ └── index.ts
│ │ │ │ ├── color-toggle.vue
│ │ │ │ ├── global-search
│ │ │ │ ├── global-search.vue
│ │ │ │ ├── index.ts
│ │ │ │ └── search-panel.vue
│ │ │ │ ├── index.ts
│ │ │ │ ├── language-toggle.vue
│ │ │ │ ├── layout-toggle.vue
│ │ │ │ ├── lock-screen
│ │ │ │ ├── index.ts
│ │ │ │ ├── lock-screen-modal.vue
│ │ │ │ └── lock-screen.vue
│ │ │ │ ├── notification
│ │ │ │ ├── index.ts
│ │ │ │ ├── notification.vue
│ │ │ │ └── types.ts
│ │ │ │ ├── preferences
│ │ │ │ ├── blocks
│ │ │ │ │ ├── block.vue
│ │ │ │ │ ├── general
│ │ │ │ │ │ ├── animation.vue
│ │ │ │ │ │ └── general.vue
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── input-item.vue
│ │ │ │ │ ├── layout
│ │ │ │ │ │ ├── breadcrumb.vue
│ │ │ │ │ │ ├── content.vue
│ │ │ │ │ │ ├── copyright.vue
│ │ │ │ │ │ ├── footer.vue
│ │ │ │ │ │ ├── header.vue
│ │ │ │ │ │ ├── layout.vue
│ │ │ │ │ │ ├── navigation.vue
│ │ │ │ │ │ ├── sidebar.vue
│ │ │ │ │ │ ├── tabbar.vue
│ │ │ │ │ │ └── widget.vue
│ │ │ │ │ ├── number-field-item.vue
│ │ │ │ │ ├── select-item.vue
│ │ │ │ │ ├── shortcut-keys
│ │ │ │ │ │ └── global.vue
│ │ │ │ │ ├── switch-item.vue
│ │ │ │ │ ├── theme
│ │ │ │ │ │ ├── builtin.vue
│ │ │ │ │ │ ├── color-mode.vue
│ │ │ │ │ │ ├── radius.vue
│ │ │ │ │ │ └── theme.vue
│ │ │ │ │ └── toggle-item.vue
│ │ │ │ ├── icons
│ │ │ │ │ ├── content-compact.vue
│ │ │ │ │ ├── full-content.vue
│ │ │ │ │ ├── header-mixed-nav.vue
│ │ │ │ │ ├── header-nav.vue
│ │ │ │ │ ├── header-sidebar-nav.vue
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── mixed-nav.vue
│ │ │ │ │ ├── setting.vue
│ │ │ │ │ ├── sidebar-mixed-nav.vue
│ │ │ │ │ └── sidebar-nav.vue
│ │ │ │ ├── index.ts
│ │ │ │ ├── preferences-button.vue
│ │ │ │ ├── preferences-drawer.vue
│ │ │ │ ├── preferences.vue
│ │ │ │ └── use-open-preferences.ts
│ │ │ │ ├── theme-toggle
│ │ │ │ ├── index.ts
│ │ │ │ ├── theme-button.vue
│ │ │ │ └── theme-toggle.vue
│ │ │ │ └── user-dropdown
│ │ │ │ ├── index.ts
│ │ │ │ └── user-dropdown.vue
│ │ └── tsconfig.json
│ ├── plugins
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── src
│ │ │ ├── echarts
│ │ │ │ ├── echarts-ui.vue
│ │ │ │ ├── echarts.ts
│ │ │ │ ├── index.ts
│ │ │ │ └── use-echarts.ts
│ │ │ ├── motion
│ │ │ │ ├── index.ts
│ │ │ │ └── types.ts
│ │ │ └── vxe-table
│ │ │ │ ├── api.ts
│ │ │ │ ├── extends.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── init.ts
│ │ │ │ ├── style.css
│ │ │ │ ├── types.ts
│ │ │ │ ├── use-vxe-grid.ts
│ │ │ │ └── use-vxe-grid.vue
│ │ └── tsconfig.json
│ └── request
│ │ ├── package.json
│ │ ├── src
│ │ ├── index.ts
│ │ └── request-client
│ │ │ ├── index.ts
│ │ │ ├── modules
│ │ │ ├── downloader.test.ts
│ │ │ ├── downloader.ts
│ │ │ ├── interceptor.ts
│ │ │ ├── uploader.test.ts
│ │ │ └── uploader.ts
│ │ │ ├── preset-interceptors.ts
│ │ │ ├── request-client.test.ts
│ │ │ ├── request-client.ts
│ │ │ └── types.ts
│ │ └── tsconfig.json
├── icons
│ ├── README.md
│ ├── package.json
│ ├── src
│ │ ├── iconify-offline
│ │ │ ├── index.ts
│ │ │ └── menu-icons.ts
│ │ ├── iconify
│ │ │ └── index.ts
│ │ ├── icons
│ │ │ └── empty-icon.vue
│ │ ├── index.ts
│ │ └── svg
│ │ │ ├── icons
│ │ │ ├── antdv-logo.svg
│ │ │ ├── avatar-1.svg
│ │ │ ├── avatar-2.svg
│ │ │ ├── avatar-3.svg
│ │ │ ├── avatar-4.svg
│ │ │ ├── bell.svg
│ │ │ ├── cake.svg
│ │ │ ├── card.svg
│ │ │ ├── download.svg
│ │ │ ├── max-key.svg
│ │ │ ├── message.svg
│ │ │ ├── qq.svg
│ │ │ ├── topiam.svg
│ │ │ └── wechat.svg
│ │ │ ├── index.ts
│ │ │ └── load.ts
│ └── tsconfig.json
├── locales
│ ├── package.json
│ ├── src
│ │ ├── i18n.ts
│ │ ├── index.ts
│ │ ├── langs
│ │ │ ├── en-US
│ │ │ │ ├── authentication.json
│ │ │ │ ├── common.json
│ │ │ │ ├── preferences.json
│ │ │ │ └── ui.json
│ │ │ └── zh-CN
│ │ │ │ ├── authentication.json
│ │ │ │ ├── common.json
│ │ │ │ ├── preferences.json
│ │ │ │ └── ui.json
│ │ └── typing.ts
│ └── tsconfig.json
├── preferences
│ ├── package.json
│ ├── src
│ │ └── index.ts
│ └── tsconfig.json
├── stores
│ ├── package.json
│ ├── shim-pinia.d.ts
│ ├── src
│ │ ├── index.ts
│ │ ├── modules
│ │ │ ├── access.test.ts
│ │ │ ├── access.ts
│ │ │ ├── index.ts
│ │ │ ├── lock.test.ts
│ │ │ ├── lock.ts
│ │ │ ├── tabbar.test.ts
│ │ │ ├── tabbar.ts
│ │ │ ├── user.test.ts
│ │ │ └── user.ts
│ │ └── setup.ts
│ └── tsconfig.json
├── styles
│ ├── README.md
│ ├── package.json
│ ├── src
│ │ ├── antd
│ │ │ └── index.css
│ │ ├── ele
│ │ │ └── index.css
│ │ ├── global
│ │ │ └── index.scss
│ │ ├── index.ts
│ │ └── naive
│ │ │ └── index.css
│ └── tsconfig.json
├── types
│ ├── README.md
│ ├── global.d.ts
│ ├── package.json
│ ├── src
│ │ ├── index.ts
│ │ └── user.ts
│ └── tsconfig.json
└── utils
│ ├── README.md
│ ├── package.json
│ ├── src
│ ├── helpers
│ │ ├── __tests__
│ │ │ ├── enum-options.test.ts
│ │ │ ├── find-menu-by-path.test.ts
│ │ │ ├── generate-menus.test.ts
│ │ │ ├── generate-routes-frontend.test.ts
│ │ │ └── merge-route-modules.test.ts
│ │ ├── enum-options.ts
│ │ ├── find-menu-by-path.ts
│ │ ├── generate-menus.ts
│ │ ├── generate-routes-backend.ts
│ │ ├── generate-routes-frontend.ts
│ │ ├── get-popup-container.ts
│ │ ├── index.ts
│ │ ├── merge-route-modules.ts
│ │ ├── mitt.ts
│ │ ├── request.ts
│ │ ├── reset-routes.ts
│ │ ├── safe.ts
│ │ ├── tree.ts
│ │ ├── unmount-global-loading.ts
│ │ └── uuid.ts
│ └── index.ts
│ └── tsconfig.json
├── playground
├── .env
├── .env.analyze
├── .env.development
├── .env.production
├── __tests__
│ └── e2e
│ │ ├── auth-login.spec.ts
│ │ └── common
│ │ └── auth.ts
├── index.html
├── package.json
├── playwright.config.ts
├── postcss.config.mjs
├── public
│ └── favicon.ico
├── src
│ ├── adapter
│ │ ├── component
│ │ │ └── index.ts
│ │ ├── form.ts
│ │ └── vxe-table.ts
│ ├── api
│ │ ├── core
│ │ │ ├── auth.ts
│ │ │ ├── index.ts
│ │ │ ├── menu.ts
│ │ │ └── user.ts
│ │ ├── examples
│ │ │ ├── download.ts
│ │ │ ├── index.ts
│ │ │ ├── status.ts
│ │ │ └── table.ts
│ │ ├── index.ts
│ │ ├── request.ts
│ │ └── system
│ │ │ ├── dept.ts
│ │ │ ├── index.ts
│ │ │ ├── menu.ts
│ │ │ └── role.ts
│ ├── app.vue
│ ├── bootstrap.ts
│ ├── layouts
│ │ ├── auth.vue
│ │ ├── basic.vue
│ │ └── index.ts
│ ├── locales
│ │ ├── README.md
│ │ ├── index.ts
│ │ └── langs
│ │ │ ├── en-US
│ │ │ ├── demos.json
│ │ │ ├── examples.json
│ │ │ ├── page.json
│ │ │ └── system.json
│ │ │ └── zh-CN
│ │ │ ├── demos.json
│ │ │ ├── examples.json
│ │ │ ├── page.json
│ │ │ └── system.json
│ ├── main.ts
│ ├── preferences.ts
│ ├── router
│ │ ├── access.ts
│ │ ├── guard.ts
│ │ ├── index.ts
│ │ └── routes
│ │ │ ├── core.ts
│ │ │ ├── index.ts
│ │ │ └── modules
│ │ │ ├── dashboard.ts
│ │ │ ├── demos.ts
│ │ │ ├── examples.ts
│ │ │ ├── system.ts
│ │ │ └── vben.ts
│ ├── store
│ │ ├── auth.ts
│ │ └── index.ts
│ └── views
│ │ ├── _core
│ │ ├── README.md
│ │ ├── about
│ │ │ └── index.vue
│ │ ├── authentication
│ │ │ ├── code-login.vue
│ │ │ ├── forget-password.vue
│ │ │ ├── login.vue
│ │ │ ├── qrcode-login.vue
│ │ │ └── register.vue
│ │ └── fallback
│ │ │ ├── coming-soon.vue
│ │ │ ├── forbidden.vue
│ │ │ ├── internal-error.vue
│ │ │ ├── not-found.vue
│ │ │ └── offline.vue
│ │ ├── dashboard
│ │ ├── analytics
│ │ │ ├── analytics-trends.vue
│ │ │ ├── analytics-visits-data.vue
│ │ │ ├── analytics-visits-sales.vue
│ │ │ ├── analytics-visits-source.vue
│ │ │ ├── analytics-visits.vue
│ │ │ └── index.vue
│ │ └── workspace
│ │ │ └── index.vue
│ │ ├── demos
│ │ ├── access
│ │ │ ├── admin-visible.vue
│ │ │ ├── button-control.vue
│ │ │ ├── index.vue
│ │ │ ├── menu-visible-403.vue
│ │ │ ├── super-visible.vue
│ │ │ └── user-visible.vue
│ │ ├── active-icon
│ │ │ └── index.vue
│ │ ├── badge
│ │ │ └── index.vue
│ │ ├── breadcrumb
│ │ │ ├── lateral-detail.vue
│ │ │ ├── lateral.vue
│ │ │ └── level-detail.vue
│ │ ├── features
│ │ │ ├── clipboard
│ │ │ │ └── index.vue
│ │ │ ├── file-download
│ │ │ │ ├── base64.ts
│ │ │ │ └── index.vue
│ │ │ ├── full-screen
│ │ │ │ └── index.vue
│ │ │ ├── hide-menu-children
│ │ │ │ ├── children.vue
│ │ │ │ └── parent.vue
│ │ │ ├── icons
│ │ │ │ └── index.vue
│ │ │ ├── login-expired
│ │ │ │ └── index.vue
│ │ │ ├── menu-query
│ │ │ │ └── index.vue
│ │ │ ├── new-window
│ │ │ │ └── index.vue
│ │ │ ├── tabs
│ │ │ │ ├── index.vue
│ │ │ │ └── tab-detail.vue
│ │ │ ├── vue-query
│ │ │ │ ├── index.vue
│ │ │ │ ├── infinite-queries.vue
│ │ │ │ ├── paginated-queries.vue
│ │ │ │ ├── query-retries.vue
│ │ │ │ └── typing.ts
│ │ │ └── watermark
│ │ │ │ └── index.vue
│ │ └── nested
│ │ │ ├── menu-1.vue
│ │ │ ├── menu-2-1.vue
│ │ │ ├── menu-3-1.vue
│ │ │ └── menu-3-2-1.vue
│ │ ├── examples
│ │ ├── button-group
│ │ │ └── index.vue
│ │ ├── captcha
│ │ │ ├── point-selection-captcha.vue
│ │ │ ├── slider-captcha.vue
│ │ │ └── slider-rotate-captcha.vue
│ │ ├── count-to
│ │ │ └── index.vue
│ │ ├── doc-button.vue
│ │ ├── drawer
│ │ │ ├── auto-height-demo.vue
│ │ │ ├── base-demo.vue
│ │ │ ├── dynamic-demo.vue
│ │ │ ├── form-drawer-demo.vue
│ │ │ ├── in-content-demo.vue
│ │ │ ├── index.vue
│ │ │ └── shared-data-demo.vue
│ │ ├── ellipsis
│ │ │ └── index.vue
│ │ ├── form
│ │ │ ├── api.vue
│ │ │ ├── basic.vue
│ │ │ ├── custom-layout.vue
│ │ │ ├── custom.vue
│ │ │ ├── dynamic.vue
│ │ │ ├── merge.vue
│ │ │ ├── modules
│ │ │ │ └── two-fields.vue
│ │ │ ├── query.vue
│ │ │ └── rules.vue
│ │ ├── json-viewer
│ │ │ ├── data.ts
│ │ │ └── index.vue
│ │ ├── layout
│ │ │ └── col-page.vue
│ │ ├── loading
│ │ │ └── index.vue
│ │ ├── modal
│ │ │ ├── auto-height-demo.vue
│ │ │ ├── base-demo.vue
│ │ │ ├── blur-demo.vue
│ │ │ ├── drag-demo.vue
│ │ │ ├── dynamic-demo.vue
│ │ │ ├── form-modal-demo.vue
│ │ │ ├── in-content-demo.vue
│ │ │ ├── index.vue
│ │ │ ├── nested-demo.vue
│ │ │ └── shared-data-demo.vue
│ │ ├── motion
│ │ │ └── index.vue
│ │ ├── resize
│ │ │ └── basic.vue
│ │ ├── tippy
│ │ │ └── index.vue
│ │ └── vxe-table
│ │ │ ├── basic.vue
│ │ │ ├── custom-cell.vue
│ │ │ ├── edit-cell.vue
│ │ │ ├── edit-row.vue
│ │ │ ├── fixed.vue
│ │ │ ├── form.vue
│ │ │ ├── remote.vue
│ │ │ ├── table-data.ts
│ │ │ ├── tree.vue
│ │ │ └── virtual.vue
│ │ └── system
│ │ ├── dept
│ │ ├── data.ts
│ │ ├── list.vue
│ │ └── modules
│ │ │ └── form.vue
│ │ ├── menu
│ │ ├── data.ts
│ │ ├── list.vue
│ │ └── modules
│ │ │ └── form.vue
│ │ └── role
│ │ ├── data.ts
│ │ ├── list.vue
│ │ └── modules
│ │ └── form.vue
├── tailwind.config.mjs
├── tsconfig.json
├── tsconfig.node.json
└── vite.config.mts
├── pnpm-lock.yaml
├── pnpm-workspace.yaml
├── scripts
├── clean.mjs
├── deploy
│ ├── Dockerfile
│ ├── build-local-docker-image.sh
│ └── nginx.conf
├── preview
│ ├── 1.png
│ ├── 2.png
│ ├── 3.png
│ ├── 4.png
│ ├── 5.png
│ ├── 6.png
│ ├── 7.png
│ ├── 8.png
│ └── 9.png
├── turbo-run
│ ├── README.md
│ ├── bin
│ │ └── turbo-run.mjs
│ ├── build.config.ts
│ ├── package.json
│ ├── src
│ │ ├── index.ts
│ │ └── run.ts
│ └── tsconfig.json
├── vsh
│ ├── README.md
│ ├── bin
│ │ └── vsh.mjs
│ ├── build.config.ts
│ ├── package.json
│ ├── src
│ │ ├── check-circular
│ │ │ └── index.ts
│ │ ├── check-dep
│ │ │ └── index.ts
│ │ ├── code-workspace
│ │ │ └── index.ts
│ │ ├── index.ts
│ │ ├── lint
│ │ │ └── index.ts
│ │ └── publint
│ │ │ └── index.ts
│ └── tsconfig.json
└── 菜单图标替换sql
│ └── update_icon.sql
├── stylelint.config.mjs
├── tea.yaml
├── turbo.json
├── vben-admin.code-workspace
├── vitest.config.ts
└── vitest.workspace.ts
/.browserslistrc:
--------------------------------------------------------------------------------
1 | > 1%
2 | last 2 versions
3 | not dead
4 | not ie 11
5 |
--------------------------------------------------------------------------------
/.changeset/README.md:
--------------------------------------------------------------------------------
1 | # Changesets
2 |
3 | Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works with multi-package repos, or single-package repos to help you version and publish your code. You can find the full documentation for it [in our repository](https://github.com/changesets/changesets)
4 |
5 | We have a quick list of common questions to get you started engaging with this project in [our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md)
6 |
--------------------------------------------------------------------------------
/.changeset/config.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://unpkg.com/@changesets/config@3.0.0/schema.json",
3 | "changelog": [
4 | "@changesets/changelog-github",
5 | { "repo": "vbenjs/vue-vben-admin" }
6 | ],
7 | "commit": false,
8 | "fixed": [["@vben-core/*", "@vben/*"]],
9 | "snapshot": {
10 | "prereleaseTemplate": "{tag}-{datetime}"
11 | },
12 | "privatePackages": { "version": true, "tag": true },
13 | "linked": [],
14 | "access": "public",
15 | "baseBranch": "main",
16 | "updateInternalDependencies": "patch",
17 | "ignore": []
18 | }
19 |
--------------------------------------------------------------------------------
/.commitlintrc.js:
--------------------------------------------------------------------------------
1 | export { default } from '@vben/commitlint-config';
2 |
--------------------------------------------------------------------------------
/.dockerignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | .git
3 | .gitignore
4 | *.md
5 | dist
6 | .turbo
7 | dist.zip
8 |
--------------------------------------------------------------------------------
/.editorconfig:
--------------------------------------------------------------------------------
1 | root = true
2 |
3 | [*]
4 | charset=utf-8
5 | end_of_line=lf
6 | insert_final_newline=true
7 | indent_style=space
8 | indent_size=2
9 | max_line_length = 100
10 | trim_trailing_whitespace = true
11 | quote_type = single
12 |
13 | [*.{yml,yaml,json}]
14 | indent_style = space
15 | indent_size = 2
16 |
17 | [*.md]
18 | trim_trailing_whitespace = false
19 |
--------------------------------------------------------------------------------
/.gitattributes:
--------------------------------------------------------------------------------
1 | # https://docs.github.com/cn/get-started/getting-started-with-git/configuring-git-to-handle-line-endings
2 |
3 | # Automatically normalize line endings (to LF) for all text-based files.
4 | * text=auto eol=lf
5 |
6 | # Declare files that will always have CRLF line endings on checkout.
7 | *.{cmd,[cC][mM][dD]} text eol=crlf
8 | *.{bat,[bB][aA][tT]} text eol=crlf
9 |
10 | # Denote all files that are truly binary and should not be modified.
11 | *.{ico,png,jpg,jpeg,gif,webp,svg,woff,woff2} binary
--------------------------------------------------------------------------------
/.gitconfig:
--------------------------------------------------------------------------------
1 | [core]
2 | ignorecase = false
3 |
--------------------------------------------------------------------------------
/.gitpod.yml:
--------------------------------------------------------------------------------
1 | ports:
2 | - port: 5555
3 | onOpen: open-preview
4 | tasks:
5 | - init: corepack enable && pnpm install
6 | command: pnpm run dev:play
7 |
--------------------------------------------------------------------------------
/.husky/commit-msg:
--------------------------------------------------------------------------------
1 | echo Start running commit-msg hook...
2 |
3 | # Check whether the git commit information is standardized
4 | pnpm exec commitlint --edit "$1"
5 |
6 | echo Run commit-msg hook done.
7 |
--------------------------------------------------------------------------------
/.husky/post-merge:
--------------------------------------------------------------------------------
1 | # 每次 git pull 之后, 安装依赖
2 |
3 | pnpm install
4 |
--------------------------------------------------------------------------------
/.husky/pre-commit:
--------------------------------------------------------------------------------
1 | # update `.vscode/vben-admin.code-workspace` file
2 | pnpm vsh code-workspace --auto-commit
3 |
4 | # Format and submit code according to lintstagedrc.js configuration
5 | pnpm exec lint-staged
6 |
7 | echo Run pre-commit hook done.
8 |
--------------------------------------------------------------------------------
/.node-version:
--------------------------------------------------------------------------------
1 | 20.14.0
2 |
--------------------------------------------------------------------------------
/.npmrc:
--------------------------------------------------------------------------------
1 | registry = "https://registry.npmmirror.com"
2 | public-hoist-pattern[]=husky
3 | public-hoist-pattern[]=eslint
4 | public-hoist-pattern[]=prettier
5 | public-hoist-pattern[]=prettier-plugin-tailwindcss
6 | public-hoist-pattern[]=stylelint
7 | public-hoist-pattern[]=*postcss*
8 | public-hoist-pattern[]=@commitlint/*
9 | public-hoist-pattern[]=czg
10 |
11 | strict-peer-dependencies=false
12 | auto-install-peers=true
13 | dedupe-peer-dependents=true
14 |
--------------------------------------------------------------------------------
/.prettierignore:
--------------------------------------------------------------------------------
1 | dist
2 | dev-dist
3 | .local
4 | .output.js
5 | node_modules
6 | .nvmrc
7 | coverage
8 | CODEOWNERS
9 | .nitro
10 | .output
11 |
12 |
13 | **/*.svg
14 | **/*.sh
15 |
16 | public
17 | .npmrc
18 | *-lock.yaml
19 |
--------------------------------------------------------------------------------
/.prettierrc.mjs:
--------------------------------------------------------------------------------
1 | export { default } from '@vben/prettier-config';
2 |
--------------------------------------------------------------------------------
/.stylelintignore:
--------------------------------------------------------------------------------
1 | dist
2 | public
3 | __tests__
4 | coverage
5 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | ## 平台简介
2 | 后台管理
--------------------------------------------------------------------------------
/apps/backend-mock/.env:
--------------------------------------------------------------------------------
1 | PORT=5320
2 | ACCESS_TOKEN_SECRET=access_token_secret
3 | REFRESH_TOKEN_SECRET=refresh_token_secret
4 |
--------------------------------------------------------------------------------
/apps/backend-mock/README.md:
--------------------------------------------------------------------------------
1 | # @vben/backend-mock
2 |
3 | ## Description
4 |
5 | Vben Admin 数据 mock 服务,没有对接任何的数据库,所有数据都是模拟的,用于前端开发时提供数据支持。线上环境不再提供 mock 集成,可自行部署服务或者对接真实数据,由于 `mock.js` 等工具有一些限制,比如上传文件不行、无法模拟复杂的逻辑等,所以这里使用了真实的后端服务来实现。唯一麻烦的是本地需要同时启动后端服务和前端服务,但是这样可以更好的模拟真实环境。该服务不需要手动启动,已经集成在 vite 插件内,随应用一起启用。
6 |
7 | ## Running the app
8 |
9 | ```bash
10 | # development
11 | $ pnpm run start
12 |
13 | # production mode
14 | $ pnpm run build
15 | ```
16 |
--------------------------------------------------------------------------------
/apps/backend-mock/api/auth/codes.ts:
--------------------------------------------------------------------------------
1 | import { verifyAccessToken } from '~/utils/jwt-utils';
2 | import { unAuthorizedResponse } from '~/utils/response';
3 |
4 | export default eventHandler((event) => {
5 | const userinfo = verifyAccessToken(event);
6 | if (!userinfo) {
7 | return unAuthorizedResponse(event);
8 | }
9 |
10 | const codes =
11 | MOCK_CODES.find((item) => item.username === userinfo.username)?.codes ?? [];
12 |
13 | return useResponseSuccess(codes);
14 | });
15 |
--------------------------------------------------------------------------------
/apps/backend-mock/api/auth/logout.post.ts:
--------------------------------------------------------------------------------
1 | import {
2 | clearRefreshTokenCookie,
3 | getRefreshTokenFromCookie,
4 | } from '~/utils/cookie-utils';
5 |
6 | export default defineEventHandler(async (event) => {
7 | const refreshToken = getRefreshTokenFromCookie(event);
8 | if (!refreshToken) {
9 | return useResponseSuccess('');
10 | }
11 |
12 | clearRefreshTokenCookie(event);
13 |
14 | return useResponseSuccess('');
15 | });
16 |
--------------------------------------------------------------------------------
/apps/backend-mock/api/menu/all.ts:
--------------------------------------------------------------------------------
1 | import { verifyAccessToken } from '~/utils/jwt-utils';
2 | import { unAuthorizedResponse } from '~/utils/response';
3 |
4 | export default eventHandler(async (event) => {
5 | const userinfo = verifyAccessToken(event);
6 | if (!userinfo) {
7 | return unAuthorizedResponse(event);
8 | }
9 |
10 | const menus =
11 | MOCK_MENUS.find((item) => item.username === userinfo.username)?.menus ?? [];
12 | return useResponseSuccess(menus);
13 | });
14 |
--------------------------------------------------------------------------------
/apps/backend-mock/api/status.ts:
--------------------------------------------------------------------------------
1 | export default eventHandler((event) => {
2 | const { status } = getQuery(event);
3 | setResponseStatus(event, Number(status));
4 | return useResponseError(`${status}`);
5 | });
6 |
--------------------------------------------------------------------------------
/apps/backend-mock/api/system/dept/.post.ts:
--------------------------------------------------------------------------------
1 | import { verifyAccessToken } from '~/utils/jwt-utils';
2 | import {
3 | sleep,
4 | unAuthorizedResponse,
5 | useResponseSuccess,
6 | } from '~/utils/response';
7 |
8 | export default eventHandler(async (event) => {
9 | const userinfo = verifyAccessToken(event);
10 | if (!userinfo) {
11 | return unAuthorizedResponse(event);
12 | }
13 | await sleep(600);
14 | return useResponseSuccess(null);
15 | });
16 |
--------------------------------------------------------------------------------
/apps/backend-mock/api/system/dept/[id].delete.ts:
--------------------------------------------------------------------------------
1 | import { verifyAccessToken } from '~/utils/jwt-utils';
2 | import {
3 | sleep,
4 | unAuthorizedResponse,
5 | useResponseSuccess,
6 | } from '~/utils/response';
7 |
8 | export default eventHandler(async (event) => {
9 | const userinfo = verifyAccessToken(event);
10 | if (!userinfo) {
11 | return unAuthorizedResponse(event);
12 | }
13 | await sleep(1000);
14 | return useResponseSuccess(null);
15 | });
16 |
--------------------------------------------------------------------------------
/apps/backend-mock/api/system/dept/[id].put.ts:
--------------------------------------------------------------------------------
1 | import { verifyAccessToken } from '~/utils/jwt-utils';
2 | import {
3 | sleep,
4 | unAuthorizedResponse,
5 | useResponseSuccess,
6 | } from '~/utils/response';
7 |
8 | export default eventHandler(async (event) => {
9 | const userinfo = verifyAccessToken(event);
10 | if (!userinfo) {
11 | return unAuthorizedResponse(event);
12 | }
13 | await sleep(2000);
14 | return useResponseSuccess(null);
15 | });
16 |
--------------------------------------------------------------------------------
/apps/backend-mock/api/system/menu/list.ts:
--------------------------------------------------------------------------------
1 | import { verifyAccessToken } from '~/utils/jwt-utils';
2 | import { MOCK_MENU_LIST } from '~/utils/mock-data';
3 | import { unAuthorizedResponse, useResponseSuccess } from '~/utils/response';
4 |
5 | export default eventHandler(async (event) => {
6 | const userinfo = verifyAccessToken(event);
7 | if (!userinfo) {
8 | return unAuthorizedResponse(event);
9 | }
10 |
11 | return useResponseSuccess(MOCK_MENU_LIST);
12 | });
13 |
--------------------------------------------------------------------------------
/apps/backend-mock/api/test.get.ts:
--------------------------------------------------------------------------------
1 | export default defineEventHandler(() => 'Test get handler');
2 |
--------------------------------------------------------------------------------
/apps/backend-mock/api/test.post.ts:
--------------------------------------------------------------------------------
1 | export default defineEventHandler(() => 'Test post handler');
2 |
--------------------------------------------------------------------------------
/apps/backend-mock/api/user/info.ts:
--------------------------------------------------------------------------------
1 | import { verifyAccessToken } from '~/utils/jwt-utils';
2 | import { unAuthorizedResponse } from '~/utils/response';
3 |
4 | export default eventHandler((event) => {
5 | const userinfo = verifyAccessToken(event);
6 | if (!userinfo) {
7 | return unAuthorizedResponse(event);
8 | }
9 | return useResponseSuccess(userinfo);
10 | });
11 |
--------------------------------------------------------------------------------
/apps/backend-mock/error.ts:
--------------------------------------------------------------------------------
1 | import type { NitroErrorHandler } from 'nitropack';
2 |
3 | const errorHandler: NitroErrorHandler = function (error, event) {
4 | event.node.res.end(`[Error Handler] ${error.stack}`);
5 | };
6 |
7 | export default errorHandler;
8 |
--------------------------------------------------------------------------------
/apps/backend-mock/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@vben/backend-mock",
3 | "version": "0.0.1",
4 | "description": "",
5 | "private": true,
6 | "license": "MIT",
7 | "author": "",
8 | "scripts": {
9 | "build": "nitro build",
10 | "start": "nitro dev"
11 | },
12 | "dependencies": {
13 | "@faker-js/faker": "catalog:",
14 | "jsonwebtoken": "catalog:",
15 | "nitropack": "catalog:"
16 | },
17 | "devDependencies": {
18 | "@types/jsonwebtoken": "catalog:",
19 | "h3": "catalog:"
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/apps/backend-mock/routes/[...].ts:
--------------------------------------------------------------------------------
1 | export default defineEventHandler(() => {
2 | return `
3 |
Hello Vben Admin
4 | Mock service is starting
5 |
11 | `;
12 | });
13 |
--------------------------------------------------------------------------------
/apps/backend-mock/tsconfig.build.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "./tsconfig.json",
3 | "exclude": ["node_modules", "test", "dist", "**/*spec.ts"]
4 | }
5 |
--------------------------------------------------------------------------------
/apps/backend-mock/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "./.nitro/types/tsconfig.json"
3 | }
4 |
--------------------------------------------------------------------------------
/apps/web-antd/.env:
--------------------------------------------------------------------------------
1 | # 应用标题
2 | VITE_APP_TITLE=RuoYi AI
3 |
4 | # 应用命名空间,用于缓存、store等功能的前缀,确保隔离
5 | VITE_APP_NAMESPACE=vben-web-antd
6 |
--------------------------------------------------------------------------------
/apps/web-antd/.env.analyze:
--------------------------------------------------------------------------------
1 | # public path
2 | VITE_BASE=/
3 |
4 | # Basic interface address SPA
5 | VITE_GLOB_API_URL=/api
6 |
7 | VITE_VISUALIZER=true
8 |
--------------------------------------------------------------------------------
/apps/web-antd/postcss.config.mjs:
--------------------------------------------------------------------------------
1 | export { default } from '@vben/tailwind-config/postcss';
2 |
--------------------------------------------------------------------------------
/apps/web-antd/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ageerle/ruoyi-admin/ddec895453e402aa2dcfdd354f833d0194325619/apps/web-antd/public/favicon.ico
--------------------------------------------------------------------------------
/apps/web-antd/public/tinymce/langs/README.md:
--------------------------------------------------------------------------------
1 | This is where language files should be placed.
2 |
3 | Please DO NOT translate these directly, use this service instead: https://crowdin.com/project/tinymce
4 |
--------------------------------------------------------------------------------
/apps/web-antd/public/tinymce/license.md:
--------------------------------------------------------------------------------
1 | # Software License Agreement
2 |
3 | **TinyMCE** – [](https://github.com/tinymce/tinymce)
4 | Copyright (c) 2024, Ephox Corporation DBA Tiny Technologies, Inc.
5 |
6 | Licensed under the terms of [GNU General Public License Version 2 or later](http://www.gnu.org/licenses/gpl.html).
7 |
--------------------------------------------------------------------------------
/apps/web-antd/public/tinymce/skins/ui/oxide-dark/skin.shadowdom.min.css:
--------------------------------------------------------------------------------
1 | body.tox-dialog__disable-scroll{overflow:hidden}.tox-fullscreen{border:0;height:100%;margin:0;overflow:hidden;overscroll-behavior:none;padding:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox-shadowhost.tox-fullscreen,.tox.tox-tinymce.tox-fullscreen{left:0;position:fixed;top:0;z-index:1200}.tox.tox-tinymce.tox-fullscreen{background-color:transparent}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201}
2 |
--------------------------------------------------------------------------------
/apps/web-antd/public/tinymce/skins/ui/oxide/skin.shadowdom.min.css:
--------------------------------------------------------------------------------
1 | body.tox-dialog__disable-scroll{overflow:hidden}.tox-fullscreen{border:0;height:100%;margin:0;overflow:hidden;overscroll-behavior:none;padding:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox-shadowhost.tox-fullscreen,.tox.tox-tinymce.tox-fullscreen{left:0;position:fixed;top:0;z-index:1200}.tox.tox-tinymce.tox-fullscreen{background-color:transparent}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201}
2 |
--------------------------------------------------------------------------------
/apps/web-antd/public/tinymce/skins/ui/tinymce-5-dark/skin.shadowdom.min.css:
--------------------------------------------------------------------------------
1 | body.tox-dialog__disable-scroll{overflow:hidden}.tox-fullscreen{border:0;height:100%;margin:0;overflow:hidden;overscroll-behavior:none;padding:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox-shadowhost.tox-fullscreen,.tox.tox-tinymce.tox-fullscreen{left:0;position:fixed;top:0;z-index:1200}.tox.tox-tinymce.tox-fullscreen{background-color:transparent}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201}
2 |
--------------------------------------------------------------------------------
/apps/web-antd/public/tinymce/skins/ui/tinymce-5/skin.shadowdom.min.css:
--------------------------------------------------------------------------------
1 | body.tox-dialog__disable-scroll{overflow:hidden}.tox-fullscreen{border:0;height:100%;margin:0;overflow:hidden;overscroll-behavior:none;padding:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox-shadowhost.tox-fullscreen,.tox.tox-tinymce.tox-fullscreen{left:0;position:fixed;top:0;z-index:1200}.tox.tox-tinymce.tox-fullscreen{background-color:transparent}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201}
2 |
--------------------------------------------------------------------------------
/apps/web-antd/src/api/core/index.ts:
--------------------------------------------------------------------------------
1 | export * from './auth';
2 | export * from './menu';
3 | export * from './upload';
4 | export * from './user';
5 |
--------------------------------------------------------------------------------
/apps/web-antd/src/api/index.ts:
--------------------------------------------------------------------------------
1 | export * from './core';
2 |
--------------------------------------------------------------------------------
/apps/web-antd/src/api/monitor/cache/index.ts:
--------------------------------------------------------------------------------
1 | import { requestClient } from '#/api/request';
2 |
3 | export interface CommandStats {
4 | name: string;
5 | value: string;
6 | }
7 |
8 | export interface RedisInfo {
9 | [key: string]: string;
10 | }
11 |
12 | export interface CacheInfo {
13 | commandStats: CommandStats[];
14 | dbSize: number;
15 | info: RedisInfo;
16 | }
17 |
18 | /**
19 | *
20 | * @returns redis信息
21 | */
22 | export function redisCacheInfo() {
23 | return requestClient.get('/monitor/cache');
24 | }
25 |
--------------------------------------------------------------------------------
/apps/web-antd/src/api/monitor/logininfo/model.d.ts:
--------------------------------------------------------------------------------
1 | export interface LoginLog {
2 | infoId: string;
3 | tenantId: string;
4 | userName: string;
5 | status: string;
6 | ipaddr: string;
7 | loginLocation: string;
8 | browser: string;
9 | os: string;
10 | msg: string;
11 | loginTime: string;
12 | }
13 |
--------------------------------------------------------------------------------
/apps/web-antd/src/api/monitor/online/model.d.ts:
--------------------------------------------------------------------------------
1 | export interface OnlineUser {
2 | tokenId: string;
3 | deptName: string;
4 | userName: string;
5 | ipaddr: string;
6 | loginLocation: string;
7 | browser: string;
8 | os: string;
9 | loginTime: number;
10 | }
11 |
--------------------------------------------------------------------------------
/apps/web-antd/src/api/monitor/operlog/model.d.ts:
--------------------------------------------------------------------------------
1 | export interface OperationLog {
2 | operId: string;
3 | tenantId: string;
4 | title: string;
5 | businessType: number;
6 | businessTypes?: any;
7 | method: string;
8 | requestMethod: string;
9 | operatorType: number;
10 | operName: string;
11 | deptName: string;
12 | operUrl: string;
13 | operIp: string;
14 | operLocation: string;
15 | operParam: string;
16 | jsonResult: string;
17 | status: number;
18 | errorMsg: string;
19 | operTime: string;
20 | costTime: number;
21 | }
22 |
--------------------------------------------------------------------------------
/apps/web-antd/src/api/system/client/model.d.ts:
--------------------------------------------------------------------------------
1 | export interface Client {
2 | id: number;
3 | clientId: string;
4 | clientKey: string;
5 | clientSecret: string;
6 | grantTypeList: string[];
7 | grantType: string;
8 | deviceType: string;
9 | activeTimeout: number;
10 | timeout: number;
11 | status: string;
12 | }
13 |
--------------------------------------------------------------------------------
/apps/web-antd/src/api/system/config/model.d.ts:
--------------------------------------------------------------------------------
1 | export interface SysConfig {
2 | configId: number;
3 | configName: string;
4 | configKey: string;
5 | configValue: string;
6 | configType: string;
7 | remark: string;
8 | createTime: string;
9 | }
10 |
--------------------------------------------------------------------------------
/apps/web-antd/src/api/system/configurationManage/index.ts:
--------------------------------------------------------------------------------
1 | import { requestClient } from '#/api/request';
2 |
3 | enum Api {
4 | addConfig = '/chat/config/saveOrUpdate',
5 | listConfig = '/chat/config/list',
6 | // updateConfig = '/system/config',
7 | }
8 |
9 | export function listConfig() {
10 | return requestClient.get(Api.listConfig);
11 | }
12 |
13 | // export function updateConfig(data: any) {
14 | // return requestClient.put(Api.updateConfig, data);
15 | // }
16 |
17 | export function addConfig(data: any) {
18 | return requestClient.post(Api.addConfig, data);
19 | }
20 |
--------------------------------------------------------------------------------
/apps/web-antd/src/api/system/dept/model.d.ts:
--------------------------------------------------------------------------------
1 | export interface Dept {
2 | createBy: string;
3 | createTime: string;
4 | updateBy?: string;
5 | updateTime?: string;
6 | remark?: string;
7 | deptId: number;
8 | parentId: number;
9 | ancestors: string;
10 | deptName: string;
11 | orderNum: number;
12 | leader: string;
13 | phone: string;
14 | email: string;
15 | status: string;
16 | delFlag: string;
17 | parentName?: string;
18 | children?: Dept[];
19 | }
20 |
--------------------------------------------------------------------------------
/apps/web-antd/src/api/system/dict/dict-data-model.d.ts:
--------------------------------------------------------------------------------
1 | export interface DictData {
2 | createBy: string;
3 | createTime: string;
4 | cssClass: string;
5 | default: boolean;
6 | dictCode: number;
7 | dictLabel: string;
8 | dictSort: number;
9 | dictType: string;
10 | dictValue: string;
11 | isDefault: string;
12 | listClass: string;
13 | remark: string;
14 | status: string;
15 | updateBy?: any;
16 | updateTime?: any;
17 | }
18 |
--------------------------------------------------------------------------------
/apps/web-antd/src/api/system/dict/dict-type-model.d.ts:
--------------------------------------------------------------------------------
1 | export interface DictType {
2 | createTime: string;
3 | dictId: number;
4 | dictName: string;
5 | dictType: string;
6 | remark: string;
7 | status: string;
8 | }
9 |
--------------------------------------------------------------------------------
/apps/web-antd/src/api/system/notice/model.d.ts:
--------------------------------------------------------------------------------
1 | export interface Notice {
2 | noticeId: number;
3 | noticeTitle: string;
4 | noticeType: string;
5 | noticeContent: string;
6 | status: string;
7 | remark: string;
8 | createBy: number;
9 | createByName: string;
10 | createTime: string;
11 | }
12 |
--------------------------------------------------------------------------------
/apps/web-antd/src/api/system/oss-config/model.d.ts:
--------------------------------------------------------------------------------
1 | export interface OssConfig {
2 | ossConfigId: number;
3 | configKey: string;
4 | accessKey: string;
5 | secretKey: string;
6 | bucketName: string;
7 | prefix: string;
8 | endpoint: string;
9 | domain: string;
10 | isHttps: string;
11 | region: string;
12 | status: string;
13 | ext1: string;
14 | remark: string;
15 | accessPolicy: string;
16 | }
17 |
--------------------------------------------------------------------------------
/apps/web-antd/src/api/system/post/model.d.ts:
--------------------------------------------------------------------------------
1 | /**
2 | * @description: Post interface
3 | */
4 | export interface Post {
5 | postId: number;
6 | postCode: string;
7 | postName: string;
8 | postSort: number;
9 | status: string;
10 | remark: string;
11 | createTime: string;
12 | }
13 |
--------------------------------------------------------------------------------
/apps/web-antd/src/api/system/tenant-package/model.d.ts:
--------------------------------------------------------------------------------
1 | /**
2 | * @description 租户套餐
3 | * @param packageId id
4 | * @param packageName 名称
5 | * @param menuIds 菜单id 格式为[1,2,3] 返回为string 提交为数组
6 | * @param remark 备注
7 | * @param menuCheckStrictly 是否关联父节点
8 | * @param status 状态
9 | */
10 | export interface TenantPackage {
11 | packageId: string;
12 | packageName: string;
13 | menuIds: number[] | string;
14 | remark: string;
15 | menuCheckStrictly: boolean;
16 | status: string;
17 | }
18 |
--------------------------------------------------------------------------------
/apps/web-antd/src/api/system/tenant/model.d.ts:
--------------------------------------------------------------------------------
1 | export interface Tenant {
2 | accountCount: number;
3 | address?: string;
4 | companyName: string;
5 | contactPhone: string;
6 | contactUserName: string;
7 | domain?: string;
8 | expireTime?: string;
9 | id: number;
10 | intro: string;
11 | licenseNumber?: any;
12 | packageId: string;
13 | remark?: string;
14 | status: string;
15 | tenantId: string;
16 | }
17 |
--------------------------------------------------------------------------------
/apps/web-antd/src/api/workflow/definition/model.d.ts:
--------------------------------------------------------------------------------
1 | export interface ProcessDefinition {
2 | id: string;
3 | createTime: string;
4 | updateTime: string;
5 | tenantId: string;
6 | delFlag: string;
7 | flowCode: string;
8 | flowName: string;
9 | category: string;
10 | categoryName: string;
11 | version: string;
12 | isPublish: number;
13 | formCustom: string;
14 | formPath: string;
15 | activityStatus: number;
16 | listenerType?: any;
17 | listenerPath?: any;
18 | ext?: any;
19 | }
20 |
--------------------------------------------------------------------------------
/apps/web-antd/src/components/cropper/index.ts:
--------------------------------------------------------------------------------
1 | export { default as CropperAvatar } from './src/cropper-avatar.vue';
2 | export { default as CropperImage } from './src/cropper.vue';
3 | export type { Cropper } from './src/typing';
4 |
--------------------------------------------------------------------------------
/apps/web-antd/src/components/cropper/src/typing.ts:
--------------------------------------------------------------------------------
1 | import type Cropper from 'cropperjs';
2 |
3 | export interface CropendResult {
4 | imgBase64: string;
5 | imgInfo: Cropper.Data;
6 | }
7 |
8 | export type { Cropper };
9 |
--------------------------------------------------------------------------------
/apps/web-antd/src/components/description/index.ts:
--------------------------------------------------------------------------------
1 | export { default as Description } from './src/description.vue';
2 | export * from './src/typing';
3 | export { useDescription } from './src/useDescription';
4 |
--------------------------------------------------------------------------------
/apps/web-antd/src/components/dict/index.ts:
--------------------------------------------------------------------------------
1 | export { tagSelectOptions, tagTypes } from './src/data';
2 | export { default as DictTag } from './src/index.vue';
3 |
--------------------------------------------------------------------------------
/apps/web-antd/src/components/global/index.ts:
--------------------------------------------------------------------------------
1 | import type { App } from 'vue';
2 |
3 | import { Button as AButton } from 'ant-design-vue';
4 |
5 | import { GhostButton } from './button';
6 |
7 | /**
8 | * 全局组件注册
9 | */
10 | export function setupGlobalComponent(app: App) {
11 | app.use(AButton);
12 | // 表格操作列专用按钮
13 | app.component('GhostButton', GhostButton);
14 | }
15 |
--------------------------------------------------------------------------------
/apps/web-antd/src/components/table/index.ts:
--------------------------------------------------------------------------------
1 | export { default as OptionsTag } from './src/options-tag.vue';
2 | export { default as TableSwitch } from './src/table-switch.vue';
3 |
--------------------------------------------------------------------------------
/apps/web-antd/src/components/tenant-toggle/index.ts:
--------------------------------------------------------------------------------
1 | export { default as TenantToggle } from './src/index.vue';
2 |
--------------------------------------------------------------------------------
/apps/web-antd/src/components/tinymce/index.ts:
--------------------------------------------------------------------------------
1 | export { default as Tinymce } from './src/editor.vue';
2 |
--------------------------------------------------------------------------------
/apps/web-antd/src/components/tree/index.ts:
--------------------------------------------------------------------------------
1 | export { default as MenuSelectTable } from './src/menu-select-table.vue';
2 | export { default as TreeSelectPanel } from './src/tree-select-panel.vue';
3 |
--------------------------------------------------------------------------------
/apps/web-antd/src/components/upload/index.ts:
--------------------------------------------------------------------------------
1 | export { default as FileUpload } from './src/file-upload.vue';
2 | export { default as ImageUpload } from './src/image-upload.vue';
3 |
--------------------------------------------------------------------------------
/apps/web-antd/src/layouts/index.ts:
--------------------------------------------------------------------------------
1 | const BasicLayout = () => import('./basic.vue');
2 | const AuthPageLayout = () => import('./auth.vue');
3 |
4 | const IFrameView = () => import('@vben/layouts').then((m) => m.IFrameView);
5 |
6 | export { AuthPageLayout, BasicLayout, IFrameView };
7 |
--------------------------------------------------------------------------------
/apps/web-antd/src/locales/README.md:
--------------------------------------------------------------------------------
1 | # locale
2 |
3 | 每个app使用的国际化可能不同,这里用于扩展国际化的功能,例如扩展 dayjs、antd组件库的多语言切换,以及app本身的国际化文件。
4 |
--------------------------------------------------------------------------------
/apps/web-antd/src/locales/langs/en-US/demos.json:
--------------------------------------------------------------------------------
1 | {
2 | "title": "Demos",
3 | "antd": "Ant Design Vue",
4 | "vben": {
5 | "title": "Project",
6 | "about": "About",
7 | "document": "Document",
8 | "antdv": "Ant Design Vue Version",
9 | "naive-ui": "Naive UI Version",
10 | "element-plus": "Element Plus Version"
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/apps/web-antd/src/locales/langs/en-US/http.json:
--------------------------------------------------------------------------------
1 | {
2 | "apiRequestFailed": "Operation failed",
3 | "operationSuccess": "Operation Success",
4 | "successTip": "Success Tip",
5 | "errorTip": "Error Tip",
6 | "loginTimeout": "Login timeout, please log in again"
7 | }
8 |
--------------------------------------------------------------------------------
/apps/web-antd/src/locales/langs/en-US/page.json:
--------------------------------------------------------------------------------
1 | {
2 | "auth": {
3 | "login": "Login",
4 | "register": "Register",
5 | "codeLogin": "Code Login",
6 | "qrcodeLogin": "Qr Code Login",
7 | "forgetPassword": "Forget Password",
8 | "oauthLogin": "Oauth Login"
9 | },
10 | "dashboard": {
11 | "title": "Dashboard",
12 | "analytics": "Analytics",
13 | "workspace": "Workspace"
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/apps/web-antd/src/locales/langs/zh-CN/demos.json:
--------------------------------------------------------------------------------
1 | {
2 | "title": "演示",
3 | "antd": "Ant Design Vue",
4 | "vben": {
5 | "title": "项目",
6 | "about": "关于",
7 | "document": "文档",
8 | "antdv": "Ant Design Vue 版本",
9 | "naive-ui": "Naive UI 版本",
10 | "element-plus": "Element Plus 版本"
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/apps/web-antd/src/locales/langs/zh-CN/http.json:
--------------------------------------------------------------------------------
1 | {
2 | "apiRequestFailed": "请求出错,请稍候重试",
3 | "operationSuccess": "操作成功",
4 | "successTip": "成功提示",
5 | "errorTip": "错误提示",
6 | "loginTimeout": "登录超时, 请重新登录"
7 | }
8 |
--------------------------------------------------------------------------------
/apps/web-antd/src/locales/langs/zh-CN/page.json:
--------------------------------------------------------------------------------
1 | {
2 | "auth": {
3 | "login": "登录",
4 | "register": "注册",
5 | "codeLogin": "验证码登录",
6 | "qrcodeLogin": "二维码登录",
7 | "forgetPassword": "忘记密码",
8 | "oauthLogin": "第三方登录"
9 | },
10 | "dashboard": {
11 | "title": "概览",
12 | "analytics": "分析页",
13 | "workspace": "工作台"
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/apps/web-antd/src/locales/langs/zh-CN/pages.json:
--------------------------------------------------------------------------------
1 | {
2 | "common": {
3 | "add": "新增",
4 | "edit": "编辑",
5 | "delete": "删除",
6 | "more": "更多",
7 | "search": "搜索",
8 | "reset": "重置",
9 | "import": "导入",
10 | "export": "导出",
11 | "expand": "展开",
12 | "collapse": "收起",
13 | "info": "详情",
14 | "clear": "清空",
15 | "unlock": "解锁",
16 | "download": "下载",
17 | "sync": "同步",
18 | "refresh": "刷新",
19 | "generate": "生成",
20 | "downloadLoading": "下载中, 请稍后...",
21 | "preview": "预览"
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/apps/web-antd/src/router/routes/workflow-iframe.ts:
--------------------------------------------------------------------------------
1 | import type { RouteRecordRaw } from '@vben/types';
2 |
3 | /**
4 | * 该文件存放workflow表单的iframe内嵌路由
5 | * 不需要权限认证 少走两个接口😅
6 | */
7 | export const workflowIframeRoutes: RouteRecordRaw[] = [
8 | // 这里是iframe使用的 去掉外层的BasicLayout
9 | {
10 | name: 'WorkflowLeaveInner',
11 | path: '/workflow/leaveEdit/index/iframe',
12 | component: () => import('#/views/workflow/leave/leave-form.vue'),
13 | meta: {
14 | hideInTab: true,
15 | title: '请假申请',
16 | },
17 | },
18 | ];
19 |
--------------------------------------------------------------------------------
/apps/web-antd/src/store/index.ts:
--------------------------------------------------------------------------------
1 | export * from './auth';
2 | export * from './notify';
3 |
--------------------------------------------------------------------------------
/apps/web-antd/src/views/_core/README.md:
--------------------------------------------------------------------------------
1 | # \_core
2 |
3 | 此目录包含应用程序正常运行所需的基本视图。这些视图是应用程序布局中使用的视图。
4 |
--------------------------------------------------------------------------------
/apps/web-antd/src/views/_core/about/index.vue:
--------------------------------------------------------------------------------
1 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/apps/web-antd/src/views/_core/authentication/qrcode-login.vue:
--------------------------------------------------------------------------------
1 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/apps/web-antd/src/views/_core/fallback/coming-soon.vue:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/apps/web-antd/src/views/_core/fallback/forbidden.vue:
--------------------------------------------------------------------------------
1 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/apps/web-antd/src/views/_core/fallback/internal-error.vue:
--------------------------------------------------------------------------------
1 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/apps/web-antd/src/views/_core/fallback/not-found.vue:
--------------------------------------------------------------------------------
1 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/apps/web-antd/src/views/_core/fallback/offline.vue:
--------------------------------------------------------------------------------
1 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/apps/web-antd/src/views/_core/profile/mitt.ts:
--------------------------------------------------------------------------------
1 | import { mitt } from '@vben/utils';
2 |
3 | type Events = {
4 | updateProfile: void;
5 | };
6 |
7 | export const emitter = mitt();
8 |
--------------------------------------------------------------------------------
/apps/web-antd/src/views/monitor/admin/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
7 |
8 |
--------------------------------------------------------------------------------
/apps/web-antd/src/views/monitor/cache/components/index.ts:
--------------------------------------------------------------------------------
1 | export { default as CommandChart } from './command-chart.vue';
2 | export { default as MemoryChart } from './memory-chart.vue';
3 | export { default as RedisDescription } from './redis-description.vue';
4 |
--------------------------------------------------------------------------------
/apps/web-antd/src/views/monitor/snailjob/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/apps/web-antd/src/views/system/dict/mitt.ts:
--------------------------------------------------------------------------------
1 | import { mitt } from '@vben/utils';
2 |
3 | /**
4 | * dictType: string
5 | */
6 | type Events = {
7 | rowClick: string;
8 | };
9 |
10 | export const emitter = mitt();
11 |
--------------------------------------------------------------------------------
/apps/web-antd/src/views/tool/gen/edit-steps/index.ts:
--------------------------------------------------------------------------------
1 | export { default as BasicSetting } from './basic-setting.vue';
2 | export { default as GenConfig } from './gen-config.vue';
3 |
--------------------------------------------------------------------------------
/apps/web-antd/src/views/workflow/components/approval-timeline.vue:
--------------------------------------------------------------------------------
1 |
12 |
13 |
14 |
15 |
20 |
21 |
22 |
--------------------------------------------------------------------------------
/apps/web-antd/tailwind.config.mjs:
--------------------------------------------------------------------------------
1 | export { default } from '@vben/tailwind-config';
2 |
--------------------------------------------------------------------------------
/apps/web-antd/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json.schemastore.org/tsconfig",
3 | "extends": "@vben/tsconfig/web-app.json",
4 | "compilerOptions": {
5 | "baseUrl": ".",
6 | "paths": {
7 | "#/*": ["./src/*"]
8 | }
9 | },
10 | "references": [{ "path": "./tsconfig.node.json" }],
11 | "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue", "types/**/*.d.ts"]
12 | }
13 |
--------------------------------------------------------------------------------
/apps/web-antd/tsconfig.node.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json.schemastore.org/tsconfig",
3 | "extends": "@vben/tsconfig/node.json",
4 | "compilerOptions": {
5 | "composite": true,
6 | "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
7 | "noEmit": false
8 | },
9 | "include": ["vite.config.mts"]
10 | }
11 |
--------------------------------------------------------------------------------
/apps/web-antd/types/directive.d.ts:
--------------------------------------------------------------------------------
1 | import type { Directive } from 'vue';
2 |
3 | declare module 'vue' {
4 | export interface ComponentCustomProperties {
5 | /**
6 | * 判断权限: v-access:code=""
7 | * 判断角色 v-access:role=""
8 | * 需要VueOfficial插件版本 >= 2.1.8
9 | */
10 | vAccess: Directive;
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/apps/web-antd/types/global-components.d.ts:
--------------------------------------------------------------------------------
1 | export {};
2 |
3 | /* prettier-ignore */
4 | declare module 'vue' {
5 | export interface GlobalComponents {
6 | AButton: typeof import('ant-design-vue/es/button')['default'];
7 | GhostButton: typeof import('#/components/global/button')['GhostButton']
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/docs/.vitepress/components/index.ts:
--------------------------------------------------------------------------------
1 | export { default as DemoPreview } from './demo-preview.vue';
2 |
--------------------------------------------------------------------------------
/docs/.vitepress/theme/styles/base.css:
--------------------------------------------------------------------------------
1 | html.dark {
2 | color-scheme: dark;
3 | }
4 |
5 | .dark .VPContent {
6 | /* background-color: #14161a; */
7 | }
8 |
9 | .form-valid-error p {
10 | margin: 0;
11 | }
12 |
13 | /* 顶部导航栏选中项样式 */
14 | .VPNavBarMenuLink,
15 | .VPNavBarMenuGroup {
16 | border-bottom: 1px solid transparent;
17 | }
18 |
19 | .VPNavBarMenuLink.active,
20 | .VPNavBarMenuGroup.active {
21 | border-bottom-color: var(--vp-c-brand-1);
22 | }
23 |
--------------------------------------------------------------------------------
/docs/.vitepress/theme/styles/index.ts:
--------------------------------------------------------------------------------
1 | import '@vben/styles';
2 |
3 | import './variables.css';
4 | import './base.css';
5 |
--------------------------------------------------------------------------------
/docs/src/_env/node/adapter/form.ts:
--------------------------------------------------------------------------------
1 | export const useVbenForm = () => {};
2 | export const z = {};
3 | export type VbenFormSchema = any;
4 | export type VbenFormProps = any;
5 |
--------------------------------------------------------------------------------
/docs/src/_env/node/adapter/vxe-table.ts:
--------------------------------------------------------------------------------
1 | export type * from '@vben/plugins/vxe-table';
2 |
3 | export const useVbenVxeGrid = () => {};
4 |
--------------------------------------------------------------------------------
/docs/src/commercial/customized.md:
--------------------------------------------------------------------------------
1 | # 定制开发
2 |
3 | 我们提供基于 Vben Admin 的技术支持服务及定制开发,基本需求我们都可以满足。
4 |
5 | 详细需求可添加作者了解,并注明来意:
6 |
7 | - 通过邮箱联系开发者: [ann.vben@gmail.com](mailto:ann.vben@gmail.com)
8 | - 通过微信联系开发者:
9 |
10 |
11 |
12 | 我们会在第一时间回复您,定制费用根据需求而定。
13 |
--------------------------------------------------------------------------------
/docs/src/commercial/technical-support.md:
--------------------------------------------------------------------------------
1 | # 技术支持
2 |
3 | ## 问题反馈
4 |
5 | 在使用项目的过程中,如果遇到问题,你可以先详细阅读本文档,未找到解决方案时,可以通过以下方式获取技术支持:
6 |
7 | - 通过 [GitHub Issues](https://github.com/vbenjs/vue-vben-admin/issues)
8 | - 通过 [GitHub Discussions](https://github.com/vbenjs/vue-vben-admin/discussions)
9 |
--------------------------------------------------------------------------------
/docs/src/components/introduction.md:
--------------------------------------------------------------------------------
1 | # 介绍
2 |
3 | ::: info README
4 |
5 | 该文档介绍的是框架组件的使用方法、属性、事件等。如果你觉得现有组件的封装不够理想,或者不完全符合你的需求,大可以直接使用原生组件,亦或亲手封装一个适合的组件。框架提供的组件并非束缚,使用与否,完全取决于你的需求与自由。
6 |
7 | :::
8 |
9 | ## 布局组件
10 |
11 | 布局组件一般在页面内容区域用作顶层容器组件,提供一些统一的布局样式和基本功能。
12 |
13 | ## 通用组件
14 |
15 | 通用组件是一些常用的组件,比如弹窗、抽屉、表单等。大部分基于 `Tailwind CSS` 实现,可适用于不同 UI 组件库的应用。
16 |
--------------------------------------------------------------------------------
/docs/src/demos/vben-count-to-animator/basic/index.vue:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/docs/src/demos/vben-count-to-animator/custom/index.vue:
--------------------------------------------------------------------------------
1 |
4 |
5 |
12 |
13 |
--------------------------------------------------------------------------------
/docs/src/demos/vben-drawer/auto-height/index.vue:
--------------------------------------------------------------------------------
1 |
15 |
16 |
17 |
18 |
19 | Open
20 |
21 |
22 |
--------------------------------------------------------------------------------
/docs/src/demos/vben-drawer/basic/index.vue:
--------------------------------------------------------------------------------
1 |
6 |
7 |
8 | drawerApi.open()">Open
9 | drawer content
10 |
11 |
12 |
--------------------------------------------------------------------------------
/docs/src/demos/vben-drawer/extra/drawer.vue:
--------------------------------------------------------------------------------
1 |
6 |
7 | extra drawer content
8 |
9 |
--------------------------------------------------------------------------------
/docs/src/demos/vben-drawer/extra/index.vue:
--------------------------------------------------------------------------------
1 |
15 |
16 |
17 |
18 |
19 | Open
20 |
21 |
22 |
--------------------------------------------------------------------------------
/docs/src/demos/vben-ellipsis-text/tooltip/index.vue:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 | 住在我心里孤独的 孤独的海怪 痛苦之王 开始厌倦 深海的光 停滞的海浪
7 |
8 |
9 | 《秦皇岛》
住在我心里孤独的
孤独的海怪 痛苦之王
开始厌倦
10 | 深海的光 停滞的海浪
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/docs/src/demos/vben-modal/auto-height/index.vue:
--------------------------------------------------------------------------------
1 |
15 |
16 |
17 |
18 |
19 | Open
20 |
21 |
22 |
--------------------------------------------------------------------------------
/docs/src/demos/vben-modal/basic/index.vue:
--------------------------------------------------------------------------------
1 |
6 |
7 |
8 | modalApi.open()">Open
9 | modal content
10 |
11 |
12 |
--------------------------------------------------------------------------------
/docs/src/demos/vben-modal/draggable/index.vue:
--------------------------------------------------------------------------------
1 |
15 |
16 |
17 |
18 |
19 | Open
20 |
21 |
22 |
--------------------------------------------------------------------------------
/docs/src/demos/vben-modal/draggable/modal.vue:
--------------------------------------------------------------------------------
1 |
8 |
9 | modal content
10 |
11 |
--------------------------------------------------------------------------------
/docs/src/demos/vben-modal/extra/index.vue:
--------------------------------------------------------------------------------
1 |
15 |
16 |
17 |
18 |
19 | Open
20 |
21 |
22 |
--------------------------------------------------------------------------------
/docs/src/demos/vben-modal/extra/modal.vue:
--------------------------------------------------------------------------------
1 |
6 |
7 | extra modal content
8 |
9 |
--------------------------------------------------------------------------------
/docs/src/en/guide/in-depth/layout.md:
--------------------------------------------------------------------------------
1 | # Layout
2 |
--------------------------------------------------------------------------------
/docs/src/en/guide/introduction/changelog.md:
--------------------------------------------------------------------------------
1 | # CHANGE LOG
2 |
3 | TODO
4 |
--------------------------------------------------------------------------------
/docs/src/en/guide/introduction/roadmap.md:
--------------------------------------------------------------------------------
1 | # Roadmap
2 |
3 | TODO:
4 |
--------------------------------------------------------------------------------
/docs/src/en/guide/other/remove-code.md:
--------------------------------------------------------------------------------
1 | # Remove Code
2 |
3 | ## Remove Code
4 |
5 | In the corresponding application's `index.html` file, find the following code and delete it:
6 |
7 | ```html
8 |
9 |
18 | ```
19 |
--------------------------------------------------------------------------------
/docs/src/guide/in-depth/layout.md:
--------------------------------------------------------------------------------
1 | # 布局
2 |
--------------------------------------------------------------------------------
/docs/src/guide/in-depth/ui-framework.md:
--------------------------------------------------------------------------------
1 | # 组件库切换
2 |
3 | `Vue Admin` 支持你自由选择组件库,目前演示站点的默认组件库是 `Ant Design Vue`,与旧版本保持一致。同时框架还内置了 `Element Plus` 版本和 `Naive UI` 版本,你可以根据自己的喜好选择。
4 |
5 | ## 新增组件库应用
6 |
7 | 如果你想用其他别的组件库,你只需要按以下步骤进行操作:
8 |
9 | 1. 在`apps`内创建一个新的文件夹,例如`apps/web-xxx`。
10 | 2. 更改`apps/web-xxx/package.json`的`name`字段为`web-xxx`。
11 | 3. 移除其他组件库依赖及代码,并用你的组件库进行替换相应逻辑,需要改动的地方不多。
12 | 4. 调整`locales`内的语言文件。
13 | 5. 调整 `app.vue` 内的组件。
14 | 6. 自行适配组件库的主题,与 `Vben Admin` 契合。
15 | 7. 调整 `.env` 内的应用名
16 | 8. 在大仓根目录增加 `dev:xxx` 脚本
17 | 9. 执行 `pnpm install` 安装依赖
18 |
--------------------------------------------------------------------------------
/docs/src/guide/introduction/changelog.md:
--------------------------------------------------------------------------------
1 | # 更新日志
2 |
3 | TODO
4 |
--------------------------------------------------------------------------------
/docs/src/guide/introduction/roadmap.md:
--------------------------------------------------------------------------------
1 | # 路线图
2 |
3 | TODO:
4 |
--------------------------------------------------------------------------------
/docs/src/guide/other/remove-code.md:
--------------------------------------------------------------------------------
1 | # 移除代码
2 |
3 | ## 移除百度统计代码
4 |
5 | 在对应应用的 `index.html` 文件中,找到如下代码,删除即可:
6 |
7 | ```html
8 |
9 |
18 | ```
19 |
--------------------------------------------------------------------------------
/docs/src/guide/project/changeset.md:
--------------------------------------------------------------------------------
1 | # Changeset
2 |
3 | 项目内置了 [changeset](https://github.com/changesets/changesets) 作为版本管理工具。Changeset 是一个版本管理工具,它可以帮助我们更好的管理版本,生成 changelog,以及自动发布。
4 |
5 | 详细使用方式可查看官方文档,这里不再阐述。如果你不需要它,可以直接忽略。
6 |
7 | ## 命令行
8 |
9 | changeset 命令在项目中已经内置:
10 |
11 | ### 交互式填写变更集
12 |
13 | ```bash
14 | pnpm run changeset
15 | ```
16 |
17 | ### 统一提升版本号
18 |
19 | ```bash
20 | pnpm run version
21 | ```
22 |
--------------------------------------------------------------------------------
/docs/src/guide/project/tailwindcss.md:
--------------------------------------------------------------------------------
1 | # Tailwind CSS
2 |
3 | [Tailwind CSS](https://tailwindcss.com/) 是一个实用性优先的CSS框架,用于快速构建自定义设计。
4 |
5 | ## 配置
6 |
7 | 项目的配置文件位于 `internal/tailwind-config` 下,你可以在这里修改 Tailwind CSS 的配置。
8 |
9 | ::: tip 包使用 tailwindcss 的限制
10 |
11 | 当前只有对应的包下面存在 `tailwind.config.mjs` 文件才会启用 tailwindcss 的编译,否则不会启用 tailwindcss。如果你是纯粹的 SDK 包,不需要使用 tailwindcss,可以不用创建 `tailwind.config.mjs` 文件。
12 |
13 | :::
14 |
--------------------------------------------------------------------------------
/docs/src/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ageerle/ruoyi-admin/ddec895453e402aa2dcfdd354f833d0194325619/docs/src/public/favicon.ico
--------------------------------------------------------------------------------
/docs/src/public/guide/devtools.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ageerle/ruoyi-admin/ddec895453e402aa2dcfdd354f833d0194325619/docs/src/public/guide/devtools.png
--------------------------------------------------------------------------------
/docs/src/public/guide/loading.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ageerle/ruoyi-admin/ddec895453e402aa2dcfdd354f833d0194325619/docs/src/public/guide/loading.png
--------------------------------------------------------------------------------
/docs/src/public/guide/locale.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ageerle/ruoyi-admin/ddec895453e402aa2dcfdd354f833d0194325619/docs/src/public/guide/locale.png
--------------------------------------------------------------------------------
/docs/src/public/guide/login-expired.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ageerle/ruoyi-admin/ddec895453e402aa2dcfdd354f833d0194325619/docs/src/public/guide/login-expired.png
--------------------------------------------------------------------------------
/docs/src/public/guide/login.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ageerle/ruoyi-admin/ddec895453e402aa2dcfdd354f833d0194325619/docs/src/public/guide/login.png
--------------------------------------------------------------------------------
/docs/src/public/guide/preferences.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ageerle/ruoyi-admin/ddec895453e402aa2dcfdd354f833d0194325619/docs/src/public/guide/preferences.png
--------------------------------------------------------------------------------
/docs/src/public/guide/qq.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ageerle/ruoyi-admin/ddec895453e402aa2dcfdd354f833d0194325619/docs/src/public/guide/qq.png
--------------------------------------------------------------------------------
/docs/src/public/guide/qq_channel.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ageerle/ruoyi-admin/ddec895453e402aa2dcfdd354f833d0194325619/docs/src/public/guide/qq_channel.png
--------------------------------------------------------------------------------
/docs/src/public/guide/report.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ageerle/ruoyi-admin/ddec895453e402aa2dcfdd354f833d0194325619/docs/src/public/guide/report.png
--------------------------------------------------------------------------------
/docs/src/public/guide/test.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ageerle/ruoyi-admin/ddec895453e402aa2dcfdd354f833d0194325619/docs/src/public/guide/test.png
--------------------------------------------------------------------------------
/docs/src/public/guide/update-notice.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ageerle/ruoyi-admin/ddec895453e402aa2dcfdd354f833d0194325619/docs/src/public/guide/update-notice.png
--------------------------------------------------------------------------------
/docs/src/public/logos/shadcn-ui.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/docs/src/sponsor/personal.md:
--------------------------------------------------------------------------------
1 | # 赞助
2 |
3 | 如果你觉得这个项目对你有帮助,你可以帮作者买一杯咖啡表示支持!
4 |
5 | 
6 |
7 | 您的赞助将帮助我们:
8 |
9 | - 维持项目的基础设施,如服务器、域名、社群费用。
10 | - 支持开发者的贡献和加快新功能的开发。
11 |
12 | 感谢所有现有的和未来的赞助者,您的支持对我们来说至关重要,让我们一起推动项目继续前行。
13 |
--------------------------------------------------------------------------------
/docs/tailwind.config.mjs:
--------------------------------------------------------------------------------
1 | import tailwindcssConfig from '@vben/tailwind-config';
2 |
3 | export default {
4 | ...tailwindcssConfig,
5 | content: [
6 | ...tailwindcssConfig.content,
7 | '.vitepress/**/*.{js,mts,ts,vue}',
8 | 'src/demos/**/*.{js,mts,ts,vue}',
9 | 'src/**/*.md',
10 | ],
11 | };
12 |
--------------------------------------------------------------------------------
/docs/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json.schemastore.org/tsconfig",
3 | "extends": "@vben/tsconfig/web.json",
4 | "compilerOptions": {
5 | "baseUrl": ".",
6 | "paths": {
7 | "#/*": ["./src/_env/*"]
8 | }
9 | },
10 | "include": [
11 | ".vitepress/*.mts",
12 | ".vitepress/**/*.ts",
13 | ".vitepress/**/*.vue",
14 | "src/*.mts",
15 | "src/**/*.ts",
16 | "src/**/*.vue"
17 | ],
18 | "exclude": ["node_modules"]
19 | }
20 |
--------------------------------------------------------------------------------
/eslint.config.mjs:
--------------------------------------------------------------------------------
1 | // @ts-check
2 |
3 | import { defineConfig } from '@vben/eslint-config';
4 |
5 | export default defineConfig();
6 |
--------------------------------------------------------------------------------
/internal/lint-configs/eslint-config/build.config.ts:
--------------------------------------------------------------------------------
1 | import { defineBuildConfig } from 'unbuild';
2 |
3 | export default defineBuildConfig({
4 | clean: true,
5 | declaration: true,
6 | entries: ['src/index'],
7 | });
8 |
--------------------------------------------------------------------------------
/internal/lint-configs/eslint-config/src/configs/command.ts:
--------------------------------------------------------------------------------
1 | import createCommand from 'eslint-plugin-command/config';
2 |
3 | export async function command() {
4 | return [
5 | {
6 | // @ts-expect-error - no types
7 | ...createCommand(),
8 | },
9 | ];
10 | }
11 |
--------------------------------------------------------------------------------
/internal/lint-configs/eslint-config/src/configs/index.ts:
--------------------------------------------------------------------------------
1 | export * from './command';
2 | export * from './comments';
3 | export * from './disableds';
4 | export * from './ignores';
5 | export * from './import';
6 | export * from './javascript';
7 | export * from './jsdoc';
8 | export * from './jsonc';
9 | export * from './node';
10 | export * from './perfectionist';
11 | export * from './prettier';
12 | export * from './regexp';
13 | export * from './test';
14 | export * from './turbo';
15 | export * from './typescript';
16 | export * from './unicorn';
17 | export * from './vue';
18 |
--------------------------------------------------------------------------------
/internal/lint-configs/eslint-config/src/configs/prettier.ts:
--------------------------------------------------------------------------------
1 | import type { Linter } from 'eslint';
2 |
3 | import { interopDefault } from '../util';
4 |
5 | export async function prettier(): Promise {
6 | const [pluginPrettier] = await Promise.all([
7 | interopDefault(import('eslint-plugin-prettier')),
8 | ] as const);
9 | return [
10 | {
11 | plugins: {
12 | prettier: pluginPrettier,
13 | },
14 | rules: {
15 | 'prettier/prettier': 'error',
16 | },
17 | },
18 | ];
19 | }
20 |
--------------------------------------------------------------------------------
/internal/lint-configs/eslint-config/src/configs/regexp.ts:
--------------------------------------------------------------------------------
1 | import type { Linter } from 'eslint';
2 |
3 | import { interopDefault } from '../util';
4 |
5 | export async function regexp(): Promise {
6 | const [pluginRegexp] = await Promise.all([
7 | interopDefault(import('eslint-plugin-regexp')),
8 | ] as const);
9 |
10 | return [
11 | {
12 | plugins: {
13 | regexp: pluginRegexp,
14 | },
15 | rules: {
16 | ...pluginRegexp.configs.recommended.rules,
17 | },
18 | },
19 | ];
20 | }
21 |
--------------------------------------------------------------------------------
/internal/lint-configs/eslint-config/src/configs/turbo.ts:
--------------------------------------------------------------------------------
1 | import type { Linter } from 'eslint';
2 |
3 | import { interopDefault } from '../util';
4 |
5 | export async function turbo(): Promise {
6 | const [pluginTurbo] = await Promise.all([
7 | // @ts-expect-error - no types
8 | interopDefault(import('eslint-config-turbo')),
9 | ] as const);
10 |
11 | return [
12 | {
13 | plugins: {
14 | turbo: pluginTurbo,
15 | },
16 | },
17 | ];
18 | }
19 |
--------------------------------------------------------------------------------
/internal/lint-configs/eslint-config/src/util.ts:
--------------------------------------------------------------------------------
1 | export type Awaitable = Promise | T;
2 |
3 | export async function interopDefault(
4 | m: Awaitable,
5 | ): Promise {
6 | const resolved = await m;
7 | return (resolved as any).default || resolved;
8 | }
9 |
--------------------------------------------------------------------------------
/internal/lint-configs/eslint-config/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json.schemastore.org/tsconfig",
3 | "extends": "@vben/tsconfig/node.json",
4 | "include": ["src"],
5 | "exclude": ["node_modules"]
6 | }
7 |
--------------------------------------------------------------------------------
/internal/lint-configs/prettier-config/index.mjs:
--------------------------------------------------------------------------------
1 | export default {
2 | endOfLine: 'auto',
3 | overrides: [
4 | {
5 | files: ['*.json5'],
6 | options: {
7 | quoteProps: 'preserve',
8 | singleQuote: false,
9 | },
10 | },
11 | ],
12 | plugins: ['prettier-plugin-tailwindcss'],
13 | printWidth: 80,
14 | proseWrap: 'never',
15 | semi: true,
16 | singleQuote: true,
17 | trailingComma: 'all',
18 | };
19 |
--------------------------------------------------------------------------------
/internal/node-utils/build.config.ts:
--------------------------------------------------------------------------------
1 | import { defineBuildConfig } from 'unbuild';
2 |
3 | export default defineBuildConfig({
4 | clean: true,
5 | declaration: true,
6 | entries: ['src/index'],
7 | });
8 |
--------------------------------------------------------------------------------
/internal/node-utils/src/constants.ts:
--------------------------------------------------------------------------------
1 | enum UNICODE {
2 | FAILURE = '\u2716', // ✖
3 | SUCCESS = '\u2714', // ✔
4 | }
5 |
6 | export { UNICODE };
7 |
--------------------------------------------------------------------------------
/internal/node-utils/src/date.ts:
--------------------------------------------------------------------------------
1 | import dayjs from 'dayjs';
2 | import timezone from 'dayjs/plugin/timezone';
3 | import utc from 'dayjs/plugin/utc';
4 |
5 | dayjs.extend(utc);
6 | dayjs.extend(timezone);
7 |
8 | dayjs.tz.setDefault('Asia/Shanghai');
9 |
10 | const dateUtil = dayjs;
11 |
12 | export { dateUtil };
13 |
--------------------------------------------------------------------------------
/internal/node-utils/src/hash.ts:
--------------------------------------------------------------------------------
1 | import { createHash } from 'node:crypto';
2 |
3 | /**
4 | * 生产基于内容的 hash,可自定义长度
5 | * @param content
6 | * @param hashLSize
7 | */
8 | function generatorContentHash(content: string, hashLSize?: number) {
9 | const hash = createHash('md5').update(content, 'utf8').digest('hex');
10 |
11 | if (hashLSize) {
12 | return hash.slice(0, hashLSize);
13 | }
14 |
15 | return hash;
16 | }
17 |
18 | export { generatorContentHash };
19 |
--------------------------------------------------------------------------------
/internal/node-utils/src/path.ts:
--------------------------------------------------------------------------------
1 | import { posix } from 'node:path';
2 |
3 | /**
4 | * 将给定的文件路径转换为 POSIX 风格。
5 | * @param {string} pathname - 原始文件路径。
6 | */
7 | function toPosixPath(pathname: string) {
8 | return pathname.split(`\\`).join(posix.sep);
9 | }
10 |
11 | export { toPosixPath };
12 |
--------------------------------------------------------------------------------
/internal/node-utils/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json.schemastore.org/tsconfig",
3 | "extends": "@vben/tsconfig/node.json",
4 | "include": ["src"],
5 | "exclude": ["node_modules"]
6 | }
7 |
--------------------------------------------------------------------------------
/internal/tailwind-config/build.config.ts:
--------------------------------------------------------------------------------
1 | import { defineBuildConfig } from 'unbuild';
2 |
3 | export default defineBuildConfig({
4 | clean: true,
5 | declaration: true,
6 | entries: ['src/index', './src/postcss.config'],
7 | rollup: {
8 | emitCJS: true,
9 | },
10 | });
11 |
--------------------------------------------------------------------------------
/internal/tailwind-config/src/module.d.ts:
--------------------------------------------------------------------------------
1 | declare module '@tailwindcss/nesting' {
2 | export default any;
3 | }
4 |
--------------------------------------------------------------------------------
/internal/tailwind-config/src/postcss.config.ts:
--------------------------------------------------------------------------------
1 | import config from '.';
2 |
3 | export default {
4 | plugins: {
5 | ...(process.env.NODE_ENV === 'production' ? { cssnano: {} } : {}),
6 | // Specifying the config is not necessary in most cases, but it is included
7 | autoprefixer: {},
8 | // 修复 element-plus 和 ant-design-vue 的样式和tailwindcss冲突问题
9 | 'postcss-antd-fixes': { prefixes: ['ant', 'el'] },
10 | 'postcss-import': {},
11 | 'postcss-preset-env': {},
12 | tailwindcss: { config },
13 | 'tailwindcss/nesting': {},
14 | },
15 | };
16 |
--------------------------------------------------------------------------------
/internal/tailwind-config/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json.schemastore.org/tsconfig",
3 | "extends": "@vben/tsconfig/node.json",
4 | "include": ["src"],
5 | "exclude": ["node_modules"]
6 | }
7 |
--------------------------------------------------------------------------------
/internal/tsconfig/library.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json.schemastore.org/tsconfig",
3 | "display": "Web Application",
4 | "extends": "./base.json",
5 | "compilerOptions": {
6 | "jsx": "preserve",
7 | "lib": ["ESNext", "DOM", "DOM.Iterable"],
8 | "useDefineForClassFields": true,
9 | "moduleResolution": "bundler",
10 | "declaration": true,
11 | "noEmit": false
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/internal/tsconfig/node.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json.schemastore.org/tsconfig",
3 | "display": "Node Config",
4 | "extends": "./base.json",
5 | "compilerOptions": {
6 | "composite": false,
7 | "lib": ["ESNext"],
8 | "baseUrl": "./",
9 | "types": ["node"],
10 | "noImplicitAny": true
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/internal/tsconfig/web-app.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json.schemastore.org/tsconfig",
3 | "display": "Web Application",
4 | "extends": "./web.json",
5 | "compilerOptions": {
6 | "types": ["vite/client", "@vben/types/global"]
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/internal/tsconfig/web.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json.schemastore.org/tsconfig",
3 | "display": "Web Package",
4 | "extends": "./base.json",
5 | "compilerOptions": {
6 | "jsx": "preserve",
7 | "jsxImportSource": "vue",
8 | "lib": ["ESNext", "DOM", "DOM.Iterable"],
9 | "useDefineForClassFields": true,
10 | "moduleResolution": "bundler",
11 | "types": ["vite/client"],
12 | "declaration": false
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/internal/vite-config/build.config.ts:
--------------------------------------------------------------------------------
1 | import { defineBuildConfig } from 'unbuild';
2 |
3 | export default defineBuildConfig({
4 | clean: true,
5 | declaration: true,
6 | entries: ['src/index'],
7 | });
8 |
--------------------------------------------------------------------------------
/internal/vite-config/src/config/common.ts:
--------------------------------------------------------------------------------
1 | import type { UserConfig } from 'vite';
2 |
3 | async function getCommonConfig(): Promise {
4 | return {
5 | build: {
6 | chunkSizeWarningLimit: 2000,
7 | reportCompressedSize: false,
8 | sourcemap: false,
9 | },
10 | };
11 | }
12 |
13 | export { getCommonConfig };
14 |
--------------------------------------------------------------------------------
/internal/vite-config/src/index.ts:
--------------------------------------------------------------------------------
1 | export * from './config';
2 | export * from './options';
3 | export * from './plugins';
4 | export { loadAndConvertEnv } from './utils/env';
5 |
--------------------------------------------------------------------------------
/internal/vite-config/src/plugins/inject-app-loading/README.md:
--------------------------------------------------------------------------------
1 | # inject-app-loading
2 |
3 | 用于在应用加载时显示加载动画的插件,可自行选择加载动画的样式。
4 |
--------------------------------------------------------------------------------
/internal/vite-config/src/plugins/vxe-table.ts:
--------------------------------------------------------------------------------
1 | import type { PluginOption } from 'vite';
2 |
3 | import { lazyImport, VxeResolver } from 'vite-plugin-lazy-import';
4 |
5 | async function viteVxeTableImportsPlugin(): Promise {
6 | return [
7 | lazyImport({
8 | resolvers: [
9 | VxeResolver({
10 | libraryName: 'vxe-table',
11 | }),
12 | VxeResolver({
13 | libraryName: 'vxe-pc-ui',
14 | }),
15 | ],
16 | }),
17 | ];
18 | }
19 |
20 | export { viteVxeTableImportsPlugin };
21 |
--------------------------------------------------------------------------------
/internal/vite-config/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json.schemastore.org/tsconfig",
3 | "extends": "@vben/tsconfig/node.json",
4 | "include": ["src"],
5 | "exclude": ["node_modules"]
6 | }
7 |
--------------------------------------------------------------------------------
/packages/@core/README.md:
--------------------------------------------------------------------------------
1 | # @vben-core
2 |
3 | 系统一些比较基础的SDK和UI组件库,该目录后续完善后,可能会迁移出去或者发布到npm,请勿将任何业务逻辑和业务包放在该目录。
4 |
--------------------------------------------------------------------------------
/packages/@core/base/README.md:
--------------------------------------------------------------------------------
1 | # base
2 |
3 | 基础共享包,请勿引入 workspace 依赖
4 |
5 | -
6 |
--------------------------------------------------------------------------------
/packages/@core/base/design/src/design-tokens/index.ts:
--------------------------------------------------------------------------------
1 | import './default.css';
2 | import './dark.css';
3 |
4 | export {};
5 |
--------------------------------------------------------------------------------
/packages/@core/base/design/src/index.ts:
--------------------------------------------------------------------------------
1 | import './design-tokens';
2 |
3 | import './css/global.css';
4 | import './css/transition.css';
5 | import './css/nprogress.css';
6 | import './css/ui.css';
7 |
8 | export {};
9 |
--------------------------------------------------------------------------------
/packages/@core/base/design/src/scss-bem/constants.scss:
--------------------------------------------------------------------------------
1 | $namespace: 'vben' !default;
2 | $common-separator: '-' !default;
3 | $element-separator: '__' !default;
4 | $modifier-separator: '--' !default;
5 | $state-prefix: 'is' !default;
6 |
--------------------------------------------------------------------------------
/packages/@core/base/design/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json.schemastore.org/tsconfig",
3 | "extends": "@vben/tsconfig/web.json",
4 | "include": ["src"],
5 | "exclude": ["node_modules"]
6 | }
7 |
--------------------------------------------------------------------------------
/packages/@core/base/design/vite.config.mts:
--------------------------------------------------------------------------------
1 | import { defineConfig } from '@vben/vite-config';
2 |
3 | export default defineConfig(async () => {
4 | return {
5 | vite: {
6 | publicDir: 'src/scss-bem',
7 | },
8 | };
9 | });
10 |
--------------------------------------------------------------------------------
/packages/@core/base/icons/build.config.ts:
--------------------------------------------------------------------------------
1 | import { defineBuildConfig } from 'unbuild';
2 |
3 | export default defineBuildConfig({
4 | clean: true,
5 | declaration: true,
6 | entries: ['src/index'],
7 | });
8 |
--------------------------------------------------------------------------------
/packages/@core/base/icons/src/index.ts:
--------------------------------------------------------------------------------
1 | export * from './create-icon';
2 |
3 | export * from './lucide';
4 |
5 | export type { IconifyIcon as IconifyIconStructure } from '@iconify/vue';
6 | export {
7 | addCollection,
8 | addIcon,
9 | Icon as IconifyIcon,
10 | listIcons,
11 | } from '@iconify/vue';
12 |
13 | /**
14 | * 从@iconify/vue/dist/offline'导出的组件为离线ICON 不支持在线
15 | * 从@iconify/vue'导出的组件为在能找到本地图标为离线 否则会在线获取(适用性更强)
16 | */
17 |
--------------------------------------------------------------------------------
/packages/@core/base/icons/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json.schemastore.org/tsconfig",
3 | "extends": "@vben/tsconfig/web.json",
4 | "include": ["src"],
5 | "exclude": ["node_modules"]
6 | }
7 |
--------------------------------------------------------------------------------
/packages/@core/base/shared/build.config.ts:
--------------------------------------------------------------------------------
1 | import { defineBuildConfig } from 'unbuild';
2 |
3 | export default defineBuildConfig({
4 | clean: true,
5 | declaration: true,
6 | entries: [
7 | 'src/store',
8 | 'src/constants/index',
9 | 'src/utils/index',
10 | 'src/color/index',
11 | 'src/cache/index',
12 | 'src/global-state',
13 | ],
14 | });
15 |
--------------------------------------------------------------------------------
/packages/@core/base/shared/src/cache/index.ts:
--------------------------------------------------------------------------------
1 | export * from './storage-manager';
2 |
--------------------------------------------------------------------------------
/packages/@core/base/shared/src/cache/types.ts:
--------------------------------------------------------------------------------
1 | type StorageType = 'localStorage' | 'sessionStorage';
2 |
3 | interface StorageValue {
4 | data: T;
5 | expiry: null | number;
6 | }
7 |
8 | interface IStorageCache {
9 | clear(): void;
10 | getItem(key: string): null | T;
11 | key(index: number): null | string;
12 | length(): number;
13 | removeItem(key: string): void;
14 | setItem(key: string, value: T, expiryInMinutes?: number): void;
15 | }
16 |
17 | export type { IStorageCache, StorageType, StorageValue };
18 |
--------------------------------------------------------------------------------
/packages/@core/base/shared/src/color/color.ts:
--------------------------------------------------------------------------------
1 | import { TinyColor } from '@ctrl/tinycolor';
2 |
3 | export function isDarkColor(color: string) {
4 | return new TinyColor(color).isDark();
5 | }
6 |
7 | export function isLightColor(color: string) {
8 | return new TinyColor(color).isLight();
9 | }
10 |
--------------------------------------------------------------------------------
/packages/@core/base/shared/src/color/index.ts:
--------------------------------------------------------------------------------
1 | export * from './color';
2 | export * from './convert';
3 | export * from './generator';
4 |
--------------------------------------------------------------------------------
/packages/@core/base/shared/src/constants/index.ts:
--------------------------------------------------------------------------------
1 | export * from './dict-enum';
2 | export * from './globals';
3 | export * from './vben';
4 |
--------------------------------------------------------------------------------
/packages/@core/base/shared/src/store.ts:
--------------------------------------------------------------------------------
1 | export * from '@tanstack/vue-store';
2 |
--------------------------------------------------------------------------------
/packages/@core/base/shared/src/utils/cn.ts:
--------------------------------------------------------------------------------
1 | import type { ClassValue } from 'clsx';
2 |
3 | import { clsx } from 'clsx';
4 | import { twMerge } from 'tailwind-merge';
5 |
6 | function cn(...inputs: ClassValue[]) {
7 | return twMerge(clsx(inputs));
8 | }
9 |
10 | export { cn };
11 |
--------------------------------------------------------------------------------
/packages/@core/base/shared/src/utils/merge.ts:
--------------------------------------------------------------------------------
1 | import { createDefu } from 'defu';
2 |
3 | export { createDefu as createMerge, defu as merge } from 'defu';
4 |
5 | export const mergeWithArrayOverride = createDefu((originObj, key, updates) => {
6 | if (Array.isArray(originObj[key]) && Array.isArray(updates)) {
7 | originObj[key] = updates;
8 | return true;
9 | }
10 | });
11 |
--------------------------------------------------------------------------------
/packages/@core/base/shared/src/utils/unique.ts:
--------------------------------------------------------------------------------
1 | /**
2 | * 根据指定字段对对象数组进行去重
3 | * @param arr 要去重的对象数组
4 | * @param key 去重依据的字段名
5 | * @returns 去重后的对象数组
6 | */
7 | function uniqueByField(arr: T[], key: keyof T): T[] {
8 | const seen = new Map();
9 | return arr.filter((item) => {
10 | const value = item[key];
11 | return seen.has(value) ? false : (seen.set(value, item), true);
12 | });
13 | }
14 |
15 | export { uniqueByField };
16 |
--------------------------------------------------------------------------------
/packages/@core/base/shared/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json.schemastore.org/tsconfig",
3 | "extends": "@vben/tsconfig/library.json",
4 | "include": ["src"],
5 | "exclude": ["node_modules"]
6 | }
7 |
--------------------------------------------------------------------------------
/packages/@core/base/typings/build.config.ts:
--------------------------------------------------------------------------------
1 | import { defineBuildConfig } from 'unbuild';
2 |
3 | export default defineBuildConfig({
4 | clean: true,
5 | declaration: true,
6 | entries: ['src/index'],
7 | });
8 |
--------------------------------------------------------------------------------
/packages/@core/base/typings/src/index.ts:
--------------------------------------------------------------------------------
1 | export type * from './app';
2 | export type * from './basic';
3 | export type * from './helper';
4 | export type * from './menu-record';
5 | export type * from './tabs';
6 | export type * from './vue-router';
7 |
--------------------------------------------------------------------------------
/packages/@core/base/typings/src/tabs.ts:
--------------------------------------------------------------------------------
1 | import type { RouteLocationNormalized } from 'vue-router';
2 |
3 | export type TabDefinition = RouteLocationNormalized;
4 |
--------------------------------------------------------------------------------
/packages/@core/base/typings/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json.schemastore.org/tsconfig",
3 | "extends": "@vben/tsconfig/library.json",
4 | "include": ["src"],
5 | "exclude": ["node_modules"]
6 | }
7 |
--------------------------------------------------------------------------------
/packages/@core/base/typings/vue-router.d.ts:
--------------------------------------------------------------------------------
1 | /* eslint-disable no-restricted-imports */
2 | import type { RouteMeta as IRouteMeta } from '@vben-core/typings';
3 |
4 | import 'vue-router';
5 |
6 | declare module 'vue-router' {
7 | // eslint-disable-next-line @typescript-eslint/no-empty-object-type
8 | interface RouteMeta extends IRouteMeta {}
9 | }
10 |
--------------------------------------------------------------------------------
/packages/@core/composables/build.config.ts:
--------------------------------------------------------------------------------
1 | import { defineBuildConfig } from 'unbuild';
2 |
3 | export default defineBuildConfig({
4 | clean: true,
5 | declaration: true,
6 | entries: ['src/index'],
7 | });
8 |
--------------------------------------------------------------------------------
/packages/@core/composables/src/index.ts:
--------------------------------------------------------------------------------
1 | export * from './use-is-mobile';
2 | export * from './use-layout-style';
3 | export * from './use-namespace';
4 | export * from './use-priority-value';
5 | export * from './use-scroll-lock';
6 | export * from './use-simple-locale';
7 | export * from './use-sortable';
8 | export {
9 | useEmitAsProps,
10 | useForwardExpose,
11 | useForwardProps,
12 | useForwardPropsEmits,
13 | } from 'radix-vue';
14 |
--------------------------------------------------------------------------------
/packages/@core/composables/src/use-is-mobile.ts:
--------------------------------------------------------------------------------
1 | import { breakpointsTailwind, useBreakpoints } from '@vueuse/core';
2 |
3 | export function useIsMobile() {
4 | const breakpoints = useBreakpoints(breakpointsTailwind);
5 | const isMobile = breakpoints.smaller('md');
6 | return { isMobile };
7 | }
8 |
--------------------------------------------------------------------------------
/packages/@core/composables/src/use-simple-locale/README.md:
--------------------------------------------------------------------------------
1 | # Simple i18n
2 |
3 | Simple i18 implementation
4 |
--------------------------------------------------------------------------------
/packages/@core/composables/src/use-simple-locale/messages.ts:
--------------------------------------------------------------------------------
1 | export type Locale = 'en-US' | 'zh-CN';
2 |
3 | export const messages: Record> = {
4 | 'en-US': {
5 | cancel: 'Cancel',
6 | collapse: 'Collapse',
7 | confirm: 'Confirm',
8 | expand: 'Expand',
9 | reset: 'Reset',
10 | submit: 'Submit',
11 | },
12 | 'zh-CN': {
13 | cancel: '取消',
14 | collapse: '收起',
15 | confirm: '确认',
16 | expand: '展开',
17 | reset: '重置',
18 | submit: '提交',
19 | },
20 | };
21 |
22 | export const getMessages = (locale: Locale) => messages[locale];
23 |
--------------------------------------------------------------------------------
/packages/@core/composables/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json.schemastore.org/tsconfig",
3 | "extends": "@vben/tsconfig/library.json",
4 | "include": ["src"],
5 | "exclude": ["node_modules"]
6 | }
7 |
--------------------------------------------------------------------------------
/packages/@core/preferences/__tests__/config.test.ts:
--------------------------------------------------------------------------------
1 | import { describe, expect, it } from 'vitest';
2 |
3 | import { defaultPreferences } from '../src/config';
4 |
5 | describe('defaultPreferences immutability test', () => {
6 | // 创建快照,确保默认配置对象不被修改
7 | it('should not modify the config object', () => {
8 | expect(defaultPreferences).toMatchSnapshot();
9 | });
10 | });
11 |
--------------------------------------------------------------------------------
/packages/@core/preferences/build.config.ts:
--------------------------------------------------------------------------------
1 | import { defineBuildConfig } from 'unbuild';
2 |
3 | export default defineBuildConfig({
4 | clean: true,
5 | declaration: true,
6 | entries: ['src/index'],
7 | });
8 |
--------------------------------------------------------------------------------
/packages/@core/preferences/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json.schemastore.org/tsconfig",
3 | "extends": "@vben/tsconfig/web.json",
4 | "include": ["src", "__tests__"],
5 | "exclude": ["node_modules"]
6 | }
7 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/README.md:
--------------------------------------------------------------------------------
1 | # ui-kit
2 |
3 | 用于管理公共组件、不同UI组件库封装的组件
4 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/form-ui/build.config.ts:
--------------------------------------------------------------------------------
1 | import { defineBuildConfig } from 'unbuild';
2 |
3 | export default defineBuildConfig({
4 | clean: true,
5 | declaration: true,
6 | entries: [
7 | {
8 | builder: 'mkdist',
9 | input: './src',
10 | loaders: ['vue'],
11 | pattern: ['**/*.vue'],
12 | },
13 | {
14 | builder: 'mkdist',
15 | format: 'esm',
16 | input: './src',
17 | loaders: ['js'],
18 | pattern: ['**/*.ts'],
19 | },
20 | ],
21 | });
22 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/form-ui/postcss.config.mjs:
--------------------------------------------------------------------------------
1 | export { default } from '@vben/tailwind-config/postcss';
2 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/form-ui/src/form-render/index.ts:
--------------------------------------------------------------------------------
1 | export { default as Form } from './form.vue';
2 | export { default as FormField } from './form-field.vue';
3 | export { default as FormLabel } from './form-label.vue';
4 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/form-ui/src/index.ts:
--------------------------------------------------------------------------------
1 | export { setupVbenForm } from './config';
2 |
3 | export type {
4 | BaseFormComponentType,
5 | ExtendedFormApi,
6 | VbenFormProps,
7 | FormSchema as VbenFormSchema,
8 | } from './types';
9 |
10 | export * from './use-vben-form';
11 | // export { default as VbenForm } from './vben-form.vue';
12 | export * as z from 'zod';
13 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/form-ui/tailwind.config.mjs:
--------------------------------------------------------------------------------
1 | export { default } from '@vben/tailwind-config';
2 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/form-ui/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json.schemastore.org/tsconfig",
3 | "extends": "@vben/tsconfig/web.json",
4 | "include": ["src", "__tests__"],
5 | "exclude": ["node_modules"]
6 | }
7 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/layout-ui/build.config.ts:
--------------------------------------------------------------------------------
1 | import { defineBuildConfig } from 'unbuild';
2 |
3 | export default defineBuildConfig({
4 | clean: true,
5 | declaration: true,
6 | entries: [
7 | {
8 | builder: 'mkdist',
9 | input: './src',
10 | loaders: ['vue'],
11 | pattern: ['**/*.vue'],
12 | },
13 | {
14 | builder: 'mkdist',
15 | format: 'esm',
16 | input: './src',
17 | loaders: ['js'],
18 | pattern: ['**/*.ts'],
19 | },
20 | ],
21 | });
22 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/layout-ui/postcss.config.mjs:
--------------------------------------------------------------------------------
1 | export { default } from '@vben/tailwind-config/postcss';
2 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/layout-ui/src/components/index.ts:
--------------------------------------------------------------------------------
1 | export { default as LayoutContent } from './layout-content.vue';
2 | export { default as LayoutFooter } from './layout-footer.vue';
3 | export { default as LayoutHeader } from './layout-header.vue';
4 | export { default as LayoutSidebar } from './layout-sidebar.vue';
5 | export { default as LayoutTabbar } from './layout-tabbar.vue';
6 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/layout-ui/src/components/widgets/index.ts:
--------------------------------------------------------------------------------
1 | export { default as SidebarCollapseButton } from './sidebar-collapse-button.vue';
2 | export { default as SidebarFixedButton } from './sidebar-fixed-button.vue';
3 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/layout-ui/src/index.ts:
--------------------------------------------------------------------------------
1 | export type * from './vben-layout';
2 | export { default as VbenAdminLayout } from './vben-layout.vue';
3 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/layout-ui/tailwind.config.mjs:
--------------------------------------------------------------------------------
1 | export { default } from '@vben/tailwind-config';
2 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/layout-ui/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json.schemastore.org/tsconfig",
3 | "extends": "@vben/tsconfig/web.json",
4 | "include": ["src"],
5 | "exclude": ["node_modules"]
6 | }
7 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/menu-ui/README.md:
--------------------------------------------------------------------------------
1 | # 菜单组件
2 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/menu-ui/postcss.config.mjs:
--------------------------------------------------------------------------------
1 | export { default } from '@vben/tailwind-config/postcss';
2 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/menu-ui/src/components/index.ts:
--------------------------------------------------------------------------------
1 | export { default as MenuBadge } from './menu-badge.vue';
2 | export { default as MenuItem } from './menu-item.vue';
3 | export { default as Menu } from './menu.vue';
4 | export { default as SubMenu } from './sub-menu.vue';
5 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/menu-ui/src/components/normal-menu/index.ts:
--------------------------------------------------------------------------------
1 | export type * from './normal-menu';
2 | export { default as NormalMenu } from './normal-menu.vue';
3 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/menu-ui/src/components/normal-menu/normal-menu.ts:
--------------------------------------------------------------------------------
1 | import type { MenuRecordRaw } from '@vben-core/typings';
2 |
3 | interface NormalMenuProps {
4 | /**
5 | * 菜单数据
6 | */
7 | activePath?: string;
8 | /**
9 | * 是否折叠
10 | */
11 | collapse?: boolean;
12 | /**
13 | * 菜单项
14 | */
15 | menus?: MenuRecordRaw[];
16 | /**
17 | * @zh_CN 是否圆润风格
18 | * @default true
19 | */
20 | rounded?: boolean;
21 | /**
22 | * 主题
23 | */
24 | theme?: 'dark' | 'light';
25 | }
26 |
27 | export type { NormalMenuProps };
28 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/menu-ui/src/hooks/index.ts:
--------------------------------------------------------------------------------
1 | export * from './use-menu';
2 | export * from './use-menu-context';
3 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/menu-ui/src/index.ts:
--------------------------------------------------------------------------------
1 | export { default as MenuBadge } from './components/menu-badge.vue';
2 | export * from './components/normal-menu';
3 | export { default as Menu } from './menu.vue';
4 | export type * from './types';
5 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/menu-ui/tailwind.config.mjs:
--------------------------------------------------------------------------------
1 | export { default } from '@vben/tailwind-config';
2 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/menu-ui/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json.schemastore.org/tsconfig",
3 | "extends": "@vben/tsconfig/web.json",
4 | "include": ["src"],
5 | "exclude": ["node_modules"]
6 | }
7 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/popup-ui/build.config.ts:
--------------------------------------------------------------------------------
1 | import { defineBuildConfig } from 'unbuild';
2 |
3 | export default defineBuildConfig({
4 | clean: true,
5 | declaration: true,
6 | entries: [
7 | {
8 | builder: 'mkdist',
9 | input: './src',
10 | loaders: ['vue'],
11 | pattern: ['**/*.vue'],
12 | },
13 | {
14 | builder: 'mkdist',
15 | format: 'esm',
16 | input: './src',
17 | loaders: ['js'],
18 | pattern: ['**/*.ts'],
19 | },
20 | ],
21 | });
22 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/popup-ui/postcss.config.mjs:
--------------------------------------------------------------------------------
1 | export { default } from '@vben/tailwind-config/postcss';
2 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/popup-ui/src/drawer/index.ts:
--------------------------------------------------------------------------------
1 | export type * from './drawer';
2 | export { default as VbenDrawer } from './drawer.vue';
3 | export { setDefaultDrawerProps, useVbenDrawer } from './use-drawer';
4 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/popup-ui/src/index.ts:
--------------------------------------------------------------------------------
1 | export * from './drawer';
2 | export * from './modal';
3 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/popup-ui/src/modal/index.ts:
--------------------------------------------------------------------------------
1 | export type * from './modal';
2 | export { default as VbenModal } from './modal.vue';
3 | export { setDefaultModalProps, useVbenModal } from './use-modal';
4 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/popup-ui/tailwind.config.mjs:
--------------------------------------------------------------------------------
1 | export { default } from '@vben/tailwind-config';
2 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/popup-ui/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json.schemastore.org/tsconfig",
3 | "extends": "@vben/tsconfig/web.json",
4 | "include": ["src"],
5 | "exclude": ["node_modules"]
6 | }
7 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/components.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://shadcn-vue.com/schema.json",
3 | "style": "new-york",
4 | "typescript": true,
5 | "tailwind": {
6 | "config": "tailwind.config.mjs",
7 | "css": "src/assets/index.css",
8 | "baseColor": "slate",
9 | "cssVariables": true
10 | },
11 | "framework": "vite",
12 | "aliases": {
13 | "components": "@vben-core/shadcn-ui/components",
14 | "utils": "@vben-core/shared/utils"
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/postcss.config.mjs:
--------------------------------------------------------------------------------
1 | export { default } from '@vben/tailwind-config/postcss';
2 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/components/avatar/index.ts:
--------------------------------------------------------------------------------
1 | export { default as VbenAvatar } from './avatar.vue';
2 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/components/back-top/index.ts:
--------------------------------------------------------------------------------
1 | export { default as VbenBackTop } from './back-top.vue';
2 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/components/breadcrumb/index.ts:
--------------------------------------------------------------------------------
1 | export { default as VbenBreadcrumbView } from './breadcrumb-view.vue';
2 |
3 | export type * from './types';
4 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/components/breadcrumb/types.ts:
--------------------------------------------------------------------------------
1 | import type { Component } from 'vue';
2 |
3 | import type { BreadcrumbStyleType } from '@vben-core/typings';
4 |
5 | export interface IBreadcrumb {
6 | icon?: Component | string;
7 | isHome?: boolean;
8 | items?: IBreadcrumb[];
9 | path?: string;
10 | title?: string;
11 | }
12 |
13 | export interface BreadcrumbProps {
14 | breadcrumbs: IBreadcrumb[];
15 | showIcon?: boolean;
16 | styleType?: BreadcrumbStyleType;
17 | }
18 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/components/button/index.ts:
--------------------------------------------------------------------------------
1 | export type * from './button';
2 | export { default as VbenButtonGroup } from './button-group.vue';
3 | export { default as VbenButton } from './button.vue';
4 | export { default as VbenCheckButtonGroup } from './check-button-group.vue';
5 | export { default as VbenIconButton } from './icon-button.vue';
6 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/components/checkbox/index.ts:
--------------------------------------------------------------------------------
1 | export { default as VbenCheckbox } from './checkbox.vue';
2 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/components/context-menu/index.ts:
--------------------------------------------------------------------------------
1 | export { default as VbenContextMenu } from './context-menu.vue';
2 |
3 | export type * from './interface';
4 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/components/count-to-animator/index.ts:
--------------------------------------------------------------------------------
1 | export { default as VbenCountToAnimator } from './count-to-animator.vue';
2 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/components/dropdown-menu/index.ts:
--------------------------------------------------------------------------------
1 | export { default as VbenDropdownMenu } from './dropdown-menu.vue';
2 | export { default as VbenDropdownRadioMenu } from './dropdown-radio-menu.vue';
3 |
4 | export type * from './interface';
5 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/components/expandable-arrow/index.ts:
--------------------------------------------------------------------------------
1 | export { default as VbenExpandableArrow } from './expandable-arrow.vue';
2 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/components/full-screen/index.ts:
--------------------------------------------------------------------------------
1 | export { default as VbenFullScreen } from './full-screen.vue';
2 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/components/hover-card/index.ts:
--------------------------------------------------------------------------------
1 | export { default as VbenHoverCard } from './hover-card.vue';
2 | export type { HoverCardContentProps } from 'radix-vue';
3 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/components/icon/index.ts:
--------------------------------------------------------------------------------
1 | export { default as VbenIcon } from './icon.vue';
2 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/components/input-captcha/index.ts:
--------------------------------------------------------------------------------
1 | export { default as VbenInputCaptcha } from './input-captcha.vue';
2 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/components/input-password/index.ts:
--------------------------------------------------------------------------------
1 | export { default as VbenInputPassword } from './input-password.vue';
2 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/components/logo/index.ts:
--------------------------------------------------------------------------------
1 | export { default as VbenLogo } from './logo.vue';
2 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/components/pin-input/index.ts:
--------------------------------------------------------------------------------
1 | export { default as VbenPinInput } from './input.vue';
2 |
3 | export type * from './types';
4 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/components/popover/index.ts:
--------------------------------------------------------------------------------
1 | export { default as VbenPopover } from './popover.vue';
2 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/components/render-content/index.ts:
--------------------------------------------------------------------------------
1 | export { default as VbenRenderContent } from './render-content.vue';
2 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/components/scrollbar/index.ts:
--------------------------------------------------------------------------------
1 | export { default as VbenScrollbar } from './scrollbar.vue';
2 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/components/segmented/index.ts:
--------------------------------------------------------------------------------
1 | export { default as VbenSegmented } from './segmented.vue';
2 |
3 | export type * from './types';
4 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/components/segmented/types.ts:
--------------------------------------------------------------------------------
1 | interface SegmentedItem {
2 | label: string;
3 | value: string;
4 | }
5 |
6 | export type { SegmentedItem };
7 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/components/select/index.ts:
--------------------------------------------------------------------------------
1 | export { default as VbenSelect } from './select.vue';
2 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/components/spine-text/index.ts:
--------------------------------------------------------------------------------
1 | export { default as VbenSpineText } from './spine-text.vue';
2 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/components/spinner/index.ts:
--------------------------------------------------------------------------------
1 | export { default as VbenLoading } from './loading.vue';
2 | export { default as VbenSpinner } from './spinner.vue';
3 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/components/tooltip/index.ts:
--------------------------------------------------------------------------------
1 | export { default as VbenHelpTooltip } from './help-tooltip.vue';
2 | export { default as VbenTooltip } from './tooltip.vue';
3 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/index.ts:
--------------------------------------------------------------------------------
1 | export * from './components';
2 | export * from './ui';
3 | export { createContext, Slot, VisuallyHidden } from 'radix-vue';
4 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/accordion/Accordion.vue:
--------------------------------------------------------------------------------
1 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/accordion/index.ts:
--------------------------------------------------------------------------------
1 | export { default as Accordion } from './Accordion.vue';
2 | export { default as AccordionContent } from './AccordionContent.vue';
3 | export { default as AccordionItem } from './AccordionItem.vue';
4 | export { default as AccordionTrigger } from './AccordionTrigger.vue';
5 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/avatar/AvatarFallback.vue:
--------------------------------------------------------------------------------
1 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/avatar/AvatarImage.vue:
--------------------------------------------------------------------------------
1 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/avatar/index.ts:
--------------------------------------------------------------------------------
1 | export * from './avatar';
2 | export { default as Avatar } from './Avatar.vue';
3 | export { default as AvatarFallback } from './AvatarFallback.vue';
4 | export { default as AvatarImage } from './AvatarImage.vue';
5 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/badge/Badge.vue:
--------------------------------------------------------------------------------
1 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/badge/index.ts:
--------------------------------------------------------------------------------
1 | export * from './badge';
2 |
3 | export { default as Badge } from './Badge.vue';
4 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/breadcrumb/Breadcrumb.vue:
--------------------------------------------------------------------------------
1 |
6 |
7 |
8 |
11 |
12 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/breadcrumb/BreadcrumbItem.vue:
--------------------------------------------------------------------------------
1 |
8 |
9 |
10 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/breadcrumb/BreadcrumbLink.vue:
--------------------------------------------------------------------------------
1 |
12 |
13 |
14 |
19 |
20 |
21 |
22 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/breadcrumb/BreadcrumbList.vue:
--------------------------------------------------------------------------------
1 |
8 |
9 |
10 |
18 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/breadcrumb/BreadcrumbPage.vue:
--------------------------------------------------------------------------------
1 |
8 |
9 |
10 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/breadcrumb/BreadcrumbSeparator.vue:
--------------------------------------------------------------------------------
1 |
10 |
11 |
12 |
17 |
18 |
19 |
20 |
21 |
22 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/breadcrumb/index.ts:
--------------------------------------------------------------------------------
1 | export { default as Breadcrumb } from './Breadcrumb.vue';
2 | export { default as BreadcrumbEllipsis } from './BreadcrumbEllipsis.vue';
3 | export { default as BreadcrumbItem } from './BreadcrumbItem.vue';
4 | export { default as BreadcrumbLink } from './BreadcrumbLink.vue';
5 | export { default as BreadcrumbList } from './BreadcrumbList.vue';
6 | export { default as BreadcrumbPage } from './BreadcrumbPage.vue';
7 | export { default as BreadcrumbSeparator } from './BreadcrumbSeparator.vue';
8 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/button/index.ts:
--------------------------------------------------------------------------------
1 | export * from './button';
2 |
3 | export { default as Button } from './Button.vue';
4 |
5 | export type * from './types';
6 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/button/types.ts:
--------------------------------------------------------------------------------
1 | export type ButtonVariantSize =
2 | | 'default'
3 | | 'icon'
4 | | 'lg'
5 | | 'sm'
6 | | 'xs'
7 | | null
8 | | undefined;
9 |
10 | export type ButtonVariants =
11 | | 'default'
12 | | 'destructive'
13 | | 'ghost'
14 | | 'heavy'
15 | | 'icon'
16 | | 'link'
17 | | 'outline'
18 | | 'secondary'
19 | | null
20 | | undefined;
21 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/card/Card.vue:
--------------------------------------------------------------------------------
1 |
8 |
9 |
10 |
18 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/card/CardContent.vue:
--------------------------------------------------------------------------------
1 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/card/CardDescription.vue:
--------------------------------------------------------------------------------
1 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/card/CardFooter.vue:
--------------------------------------------------------------------------------
1 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/card/CardHeader.vue:
--------------------------------------------------------------------------------
1 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/card/CardTitle.vue:
--------------------------------------------------------------------------------
1 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/card/index.ts:
--------------------------------------------------------------------------------
1 | export { default as Card } from './Card.vue';
2 | export { default as CardContent } from './CardContent.vue';
3 | export { default as CardDescription } from './CardDescription.vue';
4 | export { default as CardFooter } from './CardFooter.vue';
5 | export { default as CardHeader } from './CardHeader.vue';
6 | export { default as CardTitle } from './CardTitle.vue';
7 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/checkbox/index.ts:
--------------------------------------------------------------------------------
1 | export { default as Checkbox } from './Checkbox.vue';
2 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/context-menu/ContextMenuGroup.vue:
--------------------------------------------------------------------------------
1 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/context-menu/ContextMenuPortal.vue:
--------------------------------------------------------------------------------
1 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/context-menu/ContextMenuShortcut.vue:
--------------------------------------------------------------------------------
1 |
8 |
9 |
10 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/context-menu/ContextMenuSub.vue:
--------------------------------------------------------------------------------
1 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/context-menu/ContextMenuTrigger.vue:
--------------------------------------------------------------------------------
1 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/dialog/Dialog.vue:
--------------------------------------------------------------------------------
1 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/dialog/DialogClose.vue:
--------------------------------------------------------------------------------
1 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/dialog/DialogFooter.vue:
--------------------------------------------------------------------------------
1 |
6 |
7 |
8 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/dialog/DialogHeader.vue:
--------------------------------------------------------------------------------
1 |
8 |
9 |
10 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/dialog/DialogOverlay.vue:
--------------------------------------------------------------------------------
1 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/dialog/DialogTrigger.vue:
--------------------------------------------------------------------------------
1 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/dropdown-menu/DropdownMenuGroup.vue:
--------------------------------------------------------------------------------
1 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/dropdown-menu/DropdownMenuShortcut.vue:
--------------------------------------------------------------------------------
1 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/dropdown-menu/DropdownMenuSub.vue:
--------------------------------------------------------------------------------
1 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/dropdown-menu/DropdownMenuTrigger.vue:
--------------------------------------------------------------------------------
1 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/form/FormControl.vue:
--------------------------------------------------------------------------------
1 |
8 |
9 |
10 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/form/FormDescription.vue:
--------------------------------------------------------------------------------
1 |
12 |
13 |
14 |
18 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/form/FormItem.vue:
--------------------------------------------------------------------------------
1 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/form/FormLabel.vue:
--------------------------------------------------------------------------------
1 |
13 |
14 |
15 |
18 |
19 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/form/FormMessage.vue:
--------------------------------------------------------------------------------
1 |
10 |
11 |
12 |
18 |
19 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/form/index.ts:
--------------------------------------------------------------------------------
1 | export { default as FormControl } from './FormControl.vue';
2 | export { default as FormDescription } from './FormDescription.vue';
3 | export { default as FormItem } from './FormItem.vue';
4 | export { default as FormLabel } from './FormLabel.vue';
5 | export { default as FormMessage } from './FormMessage.vue';
6 | export { FORM_ITEM_INJECTION_KEY } from './injectionKeys';
7 | export {
8 | Form,
9 | Field as FormField,
10 | FieldArray as FormFieldArray,
11 | } from 'vee-validate';
12 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/form/injectionKeys.ts:
--------------------------------------------------------------------------------
1 | import type { InjectionKey } from 'vue';
2 |
3 | // eslint-disable-next-line symbol-description
4 | export const FORM_ITEM_INJECTION_KEY = Symbol() as InjectionKey;
5 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/hover-card/HoverCard.vue:
--------------------------------------------------------------------------------
1 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/hover-card/HoverCardTrigger.vue:
--------------------------------------------------------------------------------
1 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/hover-card/index.ts:
--------------------------------------------------------------------------------
1 | export { default as HoverCard } from './HoverCard.vue';
2 | export { default as HoverCardContent } from './HoverCardContent.vue';
3 | export { default as HoverCardTrigger } from './HoverCardTrigger.vue';
4 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/input/index.ts:
--------------------------------------------------------------------------------
1 | export { default as Input } from './Input.vue';
2 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/label/index.ts:
--------------------------------------------------------------------------------
1 | export { default as Label } from './Label.vue';
2 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/number-field/NumberFieldContent.vue:
--------------------------------------------------------------------------------
1 |
8 |
9 |
10 |
18 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/number-field/index.ts:
--------------------------------------------------------------------------------
1 | export { default as NumberField } from './NumberField.vue';
2 | export { default as NumberFieldContent } from './NumberFieldContent.vue';
3 | export { default as NumberFieldDecrement } from './NumberFieldDecrement.vue';
4 | export { default as NumberFieldIncrement } from './NumberFieldIncrement.vue';
5 | export { default as NumberFieldInput } from './NumberFieldInput.vue';
6 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/pagination/index.ts:
--------------------------------------------------------------------------------
1 | export { default as PaginationEllipsis } from './PaginationEllipsis.vue';
2 | export { default as PaginationFirst } from './PaginationFirst.vue';
3 | export { default as PaginationLast } from './PaginationLast.vue';
4 | export { default as PaginationNext } from './PaginationNext.vue';
5 | export { default as PaginationPrev } from './PaginationPrev.vue';
6 | export {
7 | PaginationRoot as Pagination,
8 | PaginationList,
9 | PaginationListItem,
10 | } from 'radix-vue';
11 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/pin-input/PinInputSeparator.vue:
--------------------------------------------------------------------------------
1 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/pin-input/index.ts:
--------------------------------------------------------------------------------
1 | export { default as PinInput } from './PinInput.vue';
2 | export { default as PinInputGroup } from './PinInputGroup.vue';
3 | export { default as PinInputInput } from './PinInputInput.vue';
4 | export { default as PinInputSeparator } from './PinInputSeparator.vue';
5 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/popover/Popover.vue:
--------------------------------------------------------------------------------
1 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/popover/PopoverTrigger.vue:
--------------------------------------------------------------------------------
1 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/popover/index.ts:
--------------------------------------------------------------------------------
1 | export { default as Popover } from './Popover.vue';
2 | export { default as PopoverContent } from './PopoverContent.vue';
3 | export { default as PopoverTrigger } from './PopoverTrigger.vue';
4 | export { PopoverAnchor } from 'radix-vue';
5 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/radio-group/index.ts:
--------------------------------------------------------------------------------
1 | export { default as RadioGroup } from './RadioGroup.vue';
2 | export { default as RadioGroupItem } from './RadioGroupItem.vue';
3 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/resizable/index.ts:
--------------------------------------------------------------------------------
1 | export { default as ResizableHandle } from './ResizableHandle.vue';
2 | export { default as ResizablePanelGroup } from './ResizablePanelGroup.vue';
3 | export { SplitterPanel as ResizablePanel } from 'radix-vue';
4 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/scroll-area/index.ts:
--------------------------------------------------------------------------------
1 | export { default as ScrollArea } from './ScrollArea.vue';
2 | export { default as ScrollBar } from './ScrollBar.vue';
3 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/select/Select.vue:
--------------------------------------------------------------------------------
1 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/select/SelectItemText.vue:
--------------------------------------------------------------------------------
1 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/select/SelectLabel.vue:
--------------------------------------------------------------------------------
1 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/select/SelectValue.vue:
--------------------------------------------------------------------------------
1 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/separator/index.ts:
--------------------------------------------------------------------------------
1 | export { default as Separator } from './Separator.vue';
2 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/sheet/Sheet.vue:
--------------------------------------------------------------------------------
1 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/sheet/SheetClose.vue:
--------------------------------------------------------------------------------
1 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/sheet/SheetFooter.vue:
--------------------------------------------------------------------------------
1 |
6 |
7 |
8 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/sheet/SheetHeader.vue:
--------------------------------------------------------------------------------
1 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/sheet/SheetOverlay.vue:
--------------------------------------------------------------------------------
1 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/sheet/SheetTrigger.vue:
--------------------------------------------------------------------------------
1 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/sheet/index.ts:
--------------------------------------------------------------------------------
1 | export * from './sheet';
2 | export { default as Sheet } from './Sheet.vue';
3 | export { default as SheetClose } from './SheetClose.vue';
4 | export { default as SheetContent } from './SheetContent.vue';
5 | export { default as SheetDescription } from './SheetDescription.vue';
6 | export { default as SheetFooter } from './SheetFooter.vue';
7 | export { default as SheetHeader } from './SheetHeader.vue';
8 | export { default as SheetTitle } from './SheetTitle.vue';
9 |
10 | export { default as SheetTrigger } from './SheetTrigger.vue';
11 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/switch/index.ts:
--------------------------------------------------------------------------------
1 | export { default as Switch } from './Switch.vue';
2 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/tabs/Tabs.vue:
--------------------------------------------------------------------------------
1 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/tabs/index.ts:
--------------------------------------------------------------------------------
1 | export { default as Tabs } from './Tabs.vue';
2 | export { default as TabsContent } from './TabsContent.vue';
3 | export { default as TabsList } from './TabsList.vue';
4 | export { default as TabsTrigger } from './TabsTrigger.vue';
5 | export { TabsIndicator } from 'radix-vue';
6 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/textarea/index.ts:
--------------------------------------------------------------------------------
1 | export { default as Textarea } from './Textarea.vue';
2 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/toggle-group/index.ts:
--------------------------------------------------------------------------------
1 | export { default as ToggleGroup } from './ToggleGroup.vue';
2 | export { default as ToggleGroupItem } from './ToggleGroupItem.vue';
3 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/toggle/index.ts:
--------------------------------------------------------------------------------
1 | export * from './toggle';
2 | export { default as Toggle } from './Toggle.vue';
3 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/tooltip/Tooltip.vue:
--------------------------------------------------------------------------------
1 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/tooltip/TooltipProvider.vue:
--------------------------------------------------------------------------------
1 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/tooltip/TooltipTrigger.vue:
--------------------------------------------------------------------------------
1 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/tooltip/index.ts:
--------------------------------------------------------------------------------
1 | export { default as Tooltip } from './Tooltip.vue';
2 | export { default as TooltipContent } from './TooltipContent.vue';
3 | export { default as TooltipProvider } from './TooltipProvider.vue';
4 | export { default as TooltipTrigger } from './TooltipTrigger.vue';
5 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/tree/index.ts:
--------------------------------------------------------------------------------
1 | export { default as VbenTree } from './tree.vue';
2 | export type { FlattenedItem } from 'radix-vue';
3 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/tailwind.config.mjs:
--------------------------------------------------------------------------------
1 | export { default } from '@vben/tailwind-config';
2 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json.schemastore.org/tsconfig",
3 | "extends": "@vben/tsconfig/web.json",
4 | "compilerOptions": {
5 | "baseUrl": ".",
6 | "paths": {
7 | "@vben-core/shadcn-ui/*": ["./src/*"]
8 | }
9 | },
10 | "include": ["src"],
11 | "exclude": ["node_modules"]
12 | }
13 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/tabs-ui/build.config.ts:
--------------------------------------------------------------------------------
1 | import { defineBuildConfig } from 'unbuild';
2 |
3 | export default defineBuildConfig({
4 | clean: true,
5 | declaration: true,
6 | entries: [
7 | {
8 | builder: 'mkdist',
9 | input: './src',
10 | loaders: ['vue'],
11 | pattern: ['**/*.vue'],
12 | },
13 | {
14 | builder: 'mkdist',
15 | format: 'esm',
16 | input: './src',
17 | loaders: ['js'],
18 | pattern: ['**/*.ts'],
19 | },
20 | ],
21 | });
22 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/tabs-ui/postcss.config.mjs:
--------------------------------------------------------------------------------
1 | export { default } from '@vben/tailwind-config/postcss';
2 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/tabs-ui/src/components/index.ts:
--------------------------------------------------------------------------------
1 | export { default as Tabs } from './tabs/tabs.vue';
2 | export { default as TabsChrome } from './tabs-chrome/tabs.vue';
3 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/tabs-ui/src/components/widgets/index.ts:
--------------------------------------------------------------------------------
1 | export { default as TabsToolMore } from './tool-more.vue';
2 | export { default as TabsToolScreen } from './tool-screen.vue';
3 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/tabs-ui/src/index.ts:
--------------------------------------------------------------------------------
1 | export * from './components/widgets';
2 | export { default as TabsView } from './tabs-view.vue';
3 | export type { IContextMenuItem } from '@vben-core/shadcn-ui';
4 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/tabs-ui/tailwind.config.mjs:
--------------------------------------------------------------------------------
1 | export { default } from '@vben/tailwind-config';
2 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/tabs-ui/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json.schemastore.org/tsconfig",
3 | "extends": "@vben/tsconfig/web.json",
4 | "include": ["src"],
5 | "exclude": ["node_modules"]
6 | }
7 |
--------------------------------------------------------------------------------
/packages/constants/README.md:
--------------------------------------------------------------------------------
1 | # @vben/constants
2 |
3 | 用于多个 `app` 公用的常量,继承了 `@vben-core/shared/constants` 的所有能力。业务上有通用常量可以放在这里。
4 |
5 | ## 用法
6 |
7 | ### 添加依赖
8 |
9 | ```bash
10 | # 进入目标应用目录,例如 apps/xxxx-app
11 | # cd apps/xxxx-app
12 | pnpm add @vben/constants
13 | ```
14 |
15 | ### 使用
16 |
17 | ```ts
18 | import { DEFAULT_HOME_PATH } from '@vben/constants';
19 | ```
20 |
--------------------------------------------------------------------------------
/packages/constants/src/index.ts:
--------------------------------------------------------------------------------
1 | export * from './core';
2 | export * from '@vben-core/shared/constants';
3 |
--------------------------------------------------------------------------------
/packages/constants/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json.schemastore.org/tsconfig",
3 | "extends": "@vben/tsconfig/web.json",
4 | "include": ["src"],
5 | "exclude": ["node_modules"]
6 | }
7 |
--------------------------------------------------------------------------------
/packages/effects/README.md:
--------------------------------------------------------------------------------
1 | ## Effects 目录
2 |
3 | `effects` 目录专门用于存放与轻微耦合相关的代码和逻辑。如果你的包具有以下特点,建议将其放置在 `effects` 目录下:
4 |
5 | - **状态管理**:使用状态管理框架 `pinia`,并包含处理副作用(如异步操作、API 调用)的部分。
6 | - **用户偏好设置**:使用 `@vben-core/preferences` 处理用户偏好设置,涉及本地存储或浏览器缓存逻辑(如使用 `localStorage`)。
7 | - **导航和路由**:处理导航、页面跳转等场景,需要管理路由变化的逻辑。
8 | - **组件库依赖**:包含与特定组件库紧密耦合或依赖大型仓库的部分。
9 |
10 | 通过将相关代码归类到 `effects` 目录,可以使项目结构更加清晰,便于维护和扩展。
11 |
--------------------------------------------------------------------------------
/packages/effects/access/src/index.ts:
--------------------------------------------------------------------------------
1 | export { default as AccessControl } from './access-control.vue';
2 | export * from './accessible';
3 | export * from './directive';
4 | export * from './use-access';
5 |
--------------------------------------------------------------------------------
/packages/effects/access/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json.schemastore.org/tsconfig",
3 | "extends": "@vben/tsconfig/web.json",
4 | "include": ["src"],
5 | "exclude": ["node_modules"]
6 | }
7 |
--------------------------------------------------------------------------------
/packages/effects/common-ui/src/components/api-component/index.ts:
--------------------------------------------------------------------------------
1 | export { default as ApiComponent } from './api-component.vue';
2 |
--------------------------------------------------------------------------------
/packages/effects/common-ui/src/components/captcha/hooks/useCaptchaPoints.ts:
--------------------------------------------------------------------------------
1 | import type { CaptchaPoint } from '../types';
2 |
3 | import { reactive } from 'vue';
4 |
5 | export function useCaptchaPoints() {
6 | const points = reactive([]);
7 | function addPoint(point: CaptchaPoint) {
8 | points.push(point);
9 | }
10 |
11 | function clearPoints() {
12 | points.splice(0, points.length);
13 | }
14 | return {
15 | addPoint,
16 | clearPoints,
17 | points,
18 | };
19 | }
20 |
--------------------------------------------------------------------------------
/packages/effects/common-ui/src/components/captcha/index.ts:
--------------------------------------------------------------------------------
1 | export { default as PointSelectionCaptcha } from './point-selection-captcha/index.vue';
2 | export { default as PointSelectionCaptchaCard } from './point-selection-captcha/index.vue';
3 |
4 | export { default as SliderCaptcha } from './slider-captcha/index.vue';
5 | export { default as SliderRotateCaptcha } from './slider-rotate-captcha/index.vue';
6 | export type * from './types';
7 |
--------------------------------------------------------------------------------
/packages/effects/common-ui/src/components/code-mirror/index.ts:
--------------------------------------------------------------------------------
1 | export { default as CodeMirror } from './code-mirror.vue';
2 | export type { LanguageSupport } from './data';
3 |
--------------------------------------------------------------------------------
/packages/effects/common-ui/src/components/col-page/index.ts:
--------------------------------------------------------------------------------
1 | export { default as ColPage } from './col-page.vue';
2 | export * from './types';
3 |
--------------------------------------------------------------------------------
/packages/effects/common-ui/src/components/count-to/index.ts:
--------------------------------------------------------------------------------
1 | export { default as CountTo } from './count-to.vue';
2 | export * from './types';
3 |
--------------------------------------------------------------------------------
/packages/effects/common-ui/src/components/ellipsis-text/index.ts:
--------------------------------------------------------------------------------
1 | export { default as EllipsisText } from './ellipsis-text.vue';
2 |
--------------------------------------------------------------------------------
/packages/effects/common-ui/src/components/icon-picker/index.ts:
--------------------------------------------------------------------------------
1 | export { default as IconPicker } from './icon-picker.vue';
2 |
--------------------------------------------------------------------------------
/packages/effects/common-ui/src/components/json-preview/index.ts:
--------------------------------------------------------------------------------
1 | export { default as JsonPreview } from './json-preview.vue';
2 |
--------------------------------------------------------------------------------
/packages/effects/common-ui/src/components/json-preview/json-preview.vue:
--------------------------------------------------------------------------------
1 |
7 |
8 |
9 |
10 |
11 |
12 |
19 |
--------------------------------------------------------------------------------
/packages/effects/common-ui/src/components/json-viewer/index.ts:
--------------------------------------------------------------------------------
1 | export { default as JsonViewer } from './index.vue';
2 |
3 | export * from './types';
4 |
--------------------------------------------------------------------------------
/packages/effects/common-ui/src/components/loading/index.ts:
--------------------------------------------------------------------------------
1 | export * from './directive';
2 | export { default as Loading } from './loading.vue';
3 | export { default as Spinner } from './spinner.vue';
4 |
--------------------------------------------------------------------------------
/packages/effects/common-ui/src/components/markdown/index.ts:
--------------------------------------------------------------------------------
1 | export { default as MarkdownEditor } from './editor.vue';
2 | export { default as MarkdownPreviewer } from './preview.vue';
3 |
--------------------------------------------------------------------------------
/packages/effects/common-ui/src/components/page/index.ts:
--------------------------------------------------------------------------------
1 | export { default as Page } from './page.vue';
2 | export * from './types';
3 |
--------------------------------------------------------------------------------
/packages/effects/common-ui/src/components/page/types.ts:
--------------------------------------------------------------------------------
1 | export interface PageProps {
2 | title?: string;
3 | description?: string;
4 | contentClass?: string;
5 | /**
6 | * 根据content可见高度自适应
7 | */
8 | autoContentHeight?: boolean;
9 | headerClass?: string;
10 | footerClass?: string;
11 | }
12 |
--------------------------------------------------------------------------------
/packages/effects/common-ui/src/components/resize/index.ts:
--------------------------------------------------------------------------------
1 | export { default as VResize } from './resize.vue';
2 |
--------------------------------------------------------------------------------
/packages/effects/common-ui/src/index.ts:
--------------------------------------------------------------------------------
1 | export * from './components';
2 | export * from './ui';
3 | export { VbenAvatar } from '@vben-core/shadcn-ui';
4 |
--------------------------------------------------------------------------------
/packages/effects/common-ui/src/ui/about/about.ts:
--------------------------------------------------------------------------------
1 | import type { Component } from 'vue';
2 |
3 | interface AboutProps {
4 | description?: string;
5 | name?: string;
6 | title?: string;
7 | }
8 |
9 | interface DescriptionItem {
10 | content: Component | string;
11 | title: string;
12 | }
13 |
14 | export type { AboutProps, DescriptionItem };
15 |
--------------------------------------------------------------------------------
/packages/effects/common-ui/src/ui/about/index.ts:
--------------------------------------------------------------------------------
1 | export { default as About } from './about.vue';
2 |
--------------------------------------------------------------------------------
/packages/effects/common-ui/src/ui/authentication/auth-title.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/packages/effects/common-ui/src/ui/dashboard/analysis/index.ts:
--------------------------------------------------------------------------------
1 | export { default as AnalysisChartCard } from './analysis-chart-card.vue';
2 | export { default as AnalysisChartsTabs } from './analysis-charts-tabs.vue';
3 | export { default as AnalysisOverview } from './analysis-overview.vue';
4 |
--------------------------------------------------------------------------------
/packages/effects/common-ui/src/ui/dashboard/index.ts:
--------------------------------------------------------------------------------
1 | export * from './analysis';
2 | export type * from './typing';
3 | export * from './workbench';
4 |
--------------------------------------------------------------------------------
/packages/effects/common-ui/src/ui/dashboard/workbench/index.ts:
--------------------------------------------------------------------------------
1 | export { default as WorkbenchHeader } from './workbench-header.vue';
2 | export { default as WorkbenchProject } from './workbench-project.vue';
3 | export { default as WorkbenchQuickNav } from './workbench-quick-nav.vue';
4 | export { default as WorkbenchTodo } from './workbench-todo.vue';
5 | export { default as WorkbenchTrends } from './workbench-trends.vue';
6 |
--------------------------------------------------------------------------------
/packages/effects/common-ui/src/ui/fallback/fallback.ts:
--------------------------------------------------------------------------------
1 | interface FallbackProps {
2 | /**
3 | * 描述
4 | */
5 | description?: string;
6 | /**
7 | * @zh_CN 首页路由地址
8 | * @default /
9 | */
10 | homePath?: string;
11 | /**
12 | * @zh_CN 默认显示的图片
13 | * @default pageNotFoundSvg
14 | */
15 | image?: string;
16 | /**
17 | * @zh_CN 内置类型
18 | */
19 | status?: '403' | '404' | '500' | 'coming-soon' | 'offline';
20 | /**
21 | * @zh_CN 页面提示语
22 | */
23 | title?: string;
24 | }
25 | export type { FallbackProps };
26 |
--------------------------------------------------------------------------------
/packages/effects/common-ui/src/ui/fallback/index.ts:
--------------------------------------------------------------------------------
1 | export type * from './fallback';
2 | export { default as Fallback } from './fallback.vue';
3 |
--------------------------------------------------------------------------------
/packages/effects/common-ui/src/ui/index.ts:
--------------------------------------------------------------------------------
1 | export * from './about';
2 | export * from './authentication';
3 | export * from './dashboard';
4 | export * from './fallback';
5 |
--------------------------------------------------------------------------------
/packages/effects/common-ui/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json.schemastore.org/tsconfig",
3 | "extends": "@vben/tsconfig/web.json",
4 | "include": ["src"],
5 | "exclude": ["node_modules"]
6 | }
7 |
--------------------------------------------------------------------------------
/packages/effects/hooks/README.md:
--------------------------------------------------------------------------------
1 | # @vben/hooks
2 |
3 | 用于多个 `app` 公用的 hook,继承了 `@vben/hooks` 的所有能力。业务上有通用 hooks 可以放在这里。
4 |
5 | ## 用法
6 |
7 | ### 添加依赖
8 |
9 | ```bash
10 | # 进入目标应用目录,例如 apps/xxxx-app
11 | # cd apps/xxxx-app
12 | pnpm add @vben/hooks
13 | ```
14 |
15 | ### 使用
16 |
17 | ```ts
18 | import { useNamespace } from '@vben/hooks';
19 | ```
20 |
--------------------------------------------------------------------------------
/packages/effects/hooks/src/index.ts:
--------------------------------------------------------------------------------
1 | export * from './use-app-config';
2 | export * from './use-content-maximize';
3 | export * from './use-design-tokens';
4 | export * from './use-hover-toggle';
5 | export * from './use-pagination';
6 | export * from './use-refresh';
7 | export * from './use-tabs';
8 | export * from './use-watermark';
9 | export * from '@vben-core/composables';
10 |
--------------------------------------------------------------------------------
/packages/effects/hooks/src/use-refresh.ts:
--------------------------------------------------------------------------------
1 | import { useRouter } from 'vue-router';
2 |
3 | import { useTabbarStore } from '@vben/stores';
4 |
5 | export function useRefresh() {
6 | const router = useRouter();
7 | const tabbarStore = useTabbarStore();
8 |
9 | async function refresh() {
10 | await tabbarStore.refresh(router);
11 | }
12 |
13 | return {
14 | refresh,
15 | };
16 | }
17 |
--------------------------------------------------------------------------------
/packages/effects/hooks/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json.schemastore.org/tsconfig",
3 | "extends": "@vben/tsconfig/web.json",
4 | "compilerOptions": {
5 | "types": ["vite/client", "@vben/types/global"]
6 | },
7 | "include": ["src"],
8 | "exclude": ["node_modules"]
9 | }
10 |
--------------------------------------------------------------------------------
/packages/effects/layouts/src/authentication/index.ts:
--------------------------------------------------------------------------------
1 | export { default as AuthPageLayout } from './authentication.vue';
2 |
--------------------------------------------------------------------------------
/packages/effects/layouts/src/authentication/types.ts:
--------------------------------------------------------------------------------
1 | export type ToolbarType = 'color' | 'language' | 'layout' | 'theme';
2 |
--------------------------------------------------------------------------------
/packages/effects/layouts/src/basic/README.md:
--------------------------------------------------------------------------------
1 | ## layout
2 |
3 | ### header
4 |
5 | - 支持N个自定义插槽,命名方式:header-right-n,header-left-n
6 | - header-left-n ,排序方式:0-19 ,breadcrumb 21-x
7 | - header-right-n ,排序方式:0-49,global-search,51-59,theme-toggle,61-69,language-toggle,71-79,fullscreen,81-89,notification,91-149,user-dropdown,151-x
8 |
--------------------------------------------------------------------------------
/packages/effects/layouts/src/basic/content/content-spinner.vue:
--------------------------------------------------------------------------------
1 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/packages/effects/layouts/src/basic/content/index.ts:
--------------------------------------------------------------------------------
1 | export { default as LayoutContent } from './content.vue';
2 | export { default as LayoutContentSpinner } from './content-spinner.vue';
3 |
--------------------------------------------------------------------------------
/packages/effects/layouts/src/basic/copyright/index.ts:
--------------------------------------------------------------------------------
1 | export { default as Copyright } from './copyright.vue';
2 |
--------------------------------------------------------------------------------
/packages/effects/layouts/src/basic/footer/footer.vue:
--------------------------------------------------------------------------------
1 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/packages/effects/layouts/src/basic/footer/index.ts:
--------------------------------------------------------------------------------
1 | export { default as LayoutFooter } from './footer.vue';
2 |
--------------------------------------------------------------------------------
/packages/effects/layouts/src/basic/header/index.ts:
--------------------------------------------------------------------------------
1 | export { default as LayoutHeader } from './header.vue';
2 |
--------------------------------------------------------------------------------
/packages/effects/layouts/src/basic/index.ts:
--------------------------------------------------------------------------------
1 | export { default as BasicLayout } from './layout.vue';
2 |
--------------------------------------------------------------------------------
/packages/effects/layouts/src/basic/menu/index.ts:
--------------------------------------------------------------------------------
1 | export { default as LayoutExtraMenu } from './extra-menu.vue';
2 | export { default as LayoutMenu } from './menu.vue';
3 | export { default as LayoutMixedMenu } from './mixed-menu.vue';
4 | export * from './use-extra-menu';
5 | export * from './use-mixed-menu';
6 |
--------------------------------------------------------------------------------
/packages/effects/layouts/src/basic/tabbar/index.ts:
--------------------------------------------------------------------------------
1 | export { default as LayoutTabbar } from './tabbar.vue';
2 | export * from './use-tabbar';
3 |
--------------------------------------------------------------------------------
/packages/effects/layouts/src/iframe/iframe-view.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/packages/effects/layouts/src/iframe/index.ts:
--------------------------------------------------------------------------------
1 | export { default as IFrameRouterView } from './iframe-router-view.vue';
2 | export { default as IFrameView } from './iframe-view.vue';
3 |
--------------------------------------------------------------------------------
/packages/effects/layouts/src/index.ts:
--------------------------------------------------------------------------------
1 | export * from './authentication';
2 | export * from './basic';
3 | export * from './iframe';
4 | export * from './widgets';
5 |
--------------------------------------------------------------------------------
/packages/effects/layouts/src/widgets/check-updates/index.ts:
--------------------------------------------------------------------------------
1 | export { default as CheckUpdates } from './check-updates.vue';
2 |
--------------------------------------------------------------------------------
/packages/effects/layouts/src/widgets/global-search/index.ts:
--------------------------------------------------------------------------------
1 | export { default as GlobalSearch } from './global-search.vue';
2 |
--------------------------------------------------------------------------------
/packages/effects/layouts/src/widgets/index.ts:
--------------------------------------------------------------------------------
1 | export { default as Breadcrumb } from './breadcrumb.vue';
2 | export * from './check-updates';
3 | export { default as AuthenticationColorToggle } from './color-toggle.vue';
4 | export * from './global-search';
5 | export { default as LanguageToggle } from './language-toggle.vue';
6 | export { default as AuthenticationLayoutToggle } from './layout-toggle.vue';
7 | export * from './lock-screen';
8 | export * from './notification';
9 | export * from './preferences';
10 | export * from './theme-toggle';
11 | export * from './user-dropdown';
12 |
--------------------------------------------------------------------------------
/packages/effects/layouts/src/widgets/lock-screen/index.ts:
--------------------------------------------------------------------------------
1 | export { default as LockScreen } from './lock-screen.vue';
2 | export { default as LockScreenModal } from './lock-screen-modal.vue';
3 |
--------------------------------------------------------------------------------
/packages/effects/layouts/src/widgets/notification/index.ts:
--------------------------------------------------------------------------------
1 | export { default as Notification } from './notification.vue';
2 |
3 | export type * from './types';
4 |
--------------------------------------------------------------------------------
/packages/effects/layouts/src/widgets/notification/types.ts:
--------------------------------------------------------------------------------
1 | interface NotificationItem {
2 | avatar: string;
3 | date: string;
4 | isRead?: boolean;
5 | message: string;
6 | title: string;
7 | userId: number | string;
8 | }
9 |
10 | export type { NotificationItem };
11 |
--------------------------------------------------------------------------------
/packages/effects/layouts/src/widgets/preferences/blocks/block.vue:
--------------------------------------------------------------------------------
1 |
14 |
15 |
16 |
17 |
18 | {{ title }}
19 |
20 |
21 |
22 |
23 |
--------------------------------------------------------------------------------
/packages/effects/layouts/src/widgets/preferences/index.ts:
--------------------------------------------------------------------------------
1 | export { default as Preferences } from './preferences.vue';
2 | export { default as PreferencesButton } from './preferences-button.vue';
3 | export * from './use-open-preferences';
4 |
--------------------------------------------------------------------------------
/packages/effects/layouts/src/widgets/preferences/use-open-preferences.ts:
--------------------------------------------------------------------------------
1 | import { ref } from 'vue';
2 |
3 | const openPreferences = ref(false);
4 |
5 | function useOpenPreferences() {
6 | function handleOpenPreference() {
7 | openPreferences.value = true;
8 | }
9 |
10 | return {
11 | handleOpenPreference,
12 | openPreferences,
13 | };
14 | }
15 |
16 | export { useOpenPreferences };
17 |
--------------------------------------------------------------------------------
/packages/effects/layouts/src/widgets/theme-toggle/index.ts:
--------------------------------------------------------------------------------
1 | export { default as ThemeToggle } from './theme-toggle.vue';
2 |
--------------------------------------------------------------------------------
/packages/effects/layouts/src/widgets/user-dropdown/index.ts:
--------------------------------------------------------------------------------
1 | export { default as UserDropdown } from './user-dropdown.vue';
2 |
--------------------------------------------------------------------------------
/packages/effects/layouts/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json.schemastore.org/tsconfig",
3 | "extends": "@vben/tsconfig/web.json",
4 | "include": ["src"],
5 | "exclude": ["node_modules"]
6 | }
7 |
--------------------------------------------------------------------------------
/packages/effects/plugins/README.md:
--------------------------------------------------------------------------------
1 | # @vben/plugins
2 |
3 | 该目录用于存放项目中集成的第三方库及其相关插件。每个插件都包含了可重用的逻辑、配置和组件,方便在项目中进行统一管理和调用。
4 |
5 | ## 注意
6 |
7 | 所有的第三方插件都必须以 `subpath` 形式引入,例:
8 |
9 | 以 `echarts` 为例,引入方式如下:
10 |
11 | **packages.json**
12 |
13 | ```json
14 | "exports": {
15 | "./echarts": {
16 | "types": "./src/echarts/index.ts",
17 | "default": "./src/echarts/index.ts"
18 | }
19 | }
20 | ```
21 |
22 | **使用方式**
23 |
24 | ```ts
25 | import { useEcharts } from '@vben/plugins/echarts';
26 | ```
27 |
28 | 这样做的好处是,应用可以自行选择是否使用插件,而不会因为插件的引入及副作用而导致打包体积增大,只引入需要的插件即可。
29 |
--------------------------------------------------------------------------------
/packages/effects/plugins/src/echarts/echarts-ui.vue:
--------------------------------------------------------------------------------
1 |
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/packages/effects/plugins/src/echarts/index.ts:
--------------------------------------------------------------------------------
1 | export * from './echarts';
2 | export { default as EchartsUI } from './echarts-ui.vue';
3 | export * from './use-echarts';
4 |
--------------------------------------------------------------------------------
/packages/effects/plugins/src/motion/index.ts:
--------------------------------------------------------------------------------
1 | export * from './types';
2 |
3 | export {
4 | MotionComponent as Motion,
5 | MotionDirective,
6 | MotionGroupComponent as MotionGroup,
7 | MotionPlugin,
8 | } from '@vueuse/motion';
9 |
--------------------------------------------------------------------------------
/packages/effects/plugins/src/vxe-table/index.ts:
--------------------------------------------------------------------------------
1 | export { setupVbenVxeTable } from './init';
2 | export type { VxeTableGridOptions } from './types';
3 | export * from './use-vxe-grid';
4 | export { default as VbenVxeGrid } from './use-vxe-grid.vue';
5 | export type {
6 | VxeGridDefines,
7 | VxeGridListeners,
8 | VxeGridProps,
9 | VxeGridPropTypes,
10 | } from 'vxe-table';
11 |
--------------------------------------------------------------------------------
/packages/effects/plugins/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json.schemastore.org/tsconfig",
3 | "extends": "@vben/tsconfig/web.json",
4 | "include": ["src"],
5 | "exclude": ["node_modules"]
6 | }
7 |
--------------------------------------------------------------------------------
/packages/effects/request/src/index.ts:
--------------------------------------------------------------------------------
1 | export * from './request-client';
2 | export * from 'axios';
3 | export { stringify } from 'qs';
4 |
--------------------------------------------------------------------------------
/packages/effects/request/src/request-client/index.ts:
--------------------------------------------------------------------------------
1 | export * from './preset-interceptors';
2 | export * from './request-client';
3 | export type * from './types';
4 |
--------------------------------------------------------------------------------
/packages/effects/request/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json.schemastore.org/tsconfig",
3 | "extends": "@vben/tsconfig/web.json",
4 | "include": ["src"],
5 | "exclude": ["node_modules"]
6 | }
7 |
--------------------------------------------------------------------------------
/packages/icons/README.md:
--------------------------------------------------------------------------------
1 | # @vben/icons
2 |
3 | 用于多个 `app` 公用的图标文件,继承了 `@vben-core/icons` 的所有能力。业务上有通用图标可以放在这里。
4 |
5 | ## 用法
6 |
7 | ### 添加依赖
8 |
9 | ```bash
10 | # 进入目标应用目录,例如 apps/xxxx-app
11 | # cd apps/xxxx-app
12 | pnpm add @vben/icons
13 | ```
14 |
15 | ### 使用
16 |
17 | ```ts
18 | import { X } from '@vben/icons';
19 | ```
20 |
--------------------------------------------------------------------------------
/packages/icons/src/index.ts:
--------------------------------------------------------------------------------
1 | export * from './iconify-offline/index.js';
2 | export * from './iconify/index.js';
3 | export { default as EmptyIcon } from './icons/empty-icon.vue';
4 | export * from './svg/index.js';
5 | export { VbenIcon } from '@vben-core/shadcn-ui';
6 |
--------------------------------------------------------------------------------
/packages/icons/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json.schemastore.org/tsconfig",
3 | "extends": "@vben/tsconfig/web.json",
4 | "include": ["src"],
5 | "exclude": ["node_modules"]
6 | }
7 |
--------------------------------------------------------------------------------
/packages/locales/src/langs/en-US/common.json:
--------------------------------------------------------------------------------
1 | {
2 | "back": "Back",
3 | "backToHome": "Back To Home",
4 | "login": "Login",
5 | "logout": "Logout",
6 | "prompt": "Prompt",
7 | "cancel": "Cancel",
8 | "confirm": "Confirm",
9 | "reset": "Reset",
10 | "noData": "No Data",
11 | "refresh": "Refresh",
12 | "loadingMenu": "Loading Menu",
13 | "query": "Search",
14 | "search": "Search",
15 | "enabled": "Enabled",
16 | "disabled": "Disabled",
17 | "edit": "Edit",
18 | "delete": "Delete",
19 | "create": "Create",
20 | "yes": "Yes",
21 | "no": "No"
22 | }
23 |
--------------------------------------------------------------------------------
/packages/locales/src/langs/zh-CN/common.json:
--------------------------------------------------------------------------------
1 | {
2 | "back": "返回",
3 | "backToHome": "返回首页",
4 | "login": "登录",
5 | "logout": "退出登录",
6 | "prompt": "提示",
7 | "cancel": "取消",
8 | "confirm": "确认",
9 | "reset": "重置",
10 | "noData": "暂无数据",
11 | "refresh": "刷新",
12 | "loadingMenu": "加载菜单中",
13 | "query": "查询",
14 | "search": "搜索",
15 | "enabled": "已启用",
16 | "disabled": "已禁用",
17 | "edit": "修改",
18 | "delete": "删除",
19 | "create": "新增",
20 | "yes": "是",
21 | "no": "否"
22 | }
23 |
--------------------------------------------------------------------------------
/packages/locales/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json.schemastore.org/tsconfig",
3 | "extends": "@vben/tsconfig/web.json",
4 | "include": ["src"],
5 | "exclude": ["node_modules"]
6 | }
7 |
--------------------------------------------------------------------------------
/packages/preferences/src/index.ts:
--------------------------------------------------------------------------------
1 | import type { Preferences } from '@vben-core/preferences';
2 | import type { DeepPartial } from '@vben-core/typings';
3 |
4 | /**
5 | * 如果你想所有的app都使用相同的默认偏好设置,你可以在这里定义
6 | * 而不是去修改 @vben-core/preferences 中的默认偏好设置
7 | * @param preferences
8 | * @returns
9 | */
10 |
11 | function defineOverridesPreferences(preferences: DeepPartial) {
12 | return preferences;
13 | }
14 |
15 | export { defineOverridesPreferences };
16 |
17 | export * from '@vben-core/preferences';
18 |
--------------------------------------------------------------------------------
/packages/preferences/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json.schemastore.org/tsconfig",
3 | "extends": "@vben/tsconfig/web.json",
4 | "include": ["src"],
5 | "exclude": ["node_modules"]
6 | }
7 |
--------------------------------------------------------------------------------
/packages/stores/shim-pinia.d.ts:
--------------------------------------------------------------------------------
1 | // https://github.com/vuejs/pinia/issues/2098
2 | declare module 'pinia' {
3 | export function acceptHMRUpdate(
4 | initialUseStore: any | StoreDefinition,
5 | hot: any,
6 | ): (newModule: any) => any;
7 | }
8 |
9 | export {};
10 |
--------------------------------------------------------------------------------
/packages/stores/src/index.ts:
--------------------------------------------------------------------------------
1 | export * from './modules';
2 | export * from './setup';
3 | export { defineStore, storeToRefs } from 'pinia';
4 |
--------------------------------------------------------------------------------
/packages/stores/src/modules/index.ts:
--------------------------------------------------------------------------------
1 | export * from './access';
2 | export * from './lock';
3 | export * from './tabbar';
4 | export * from './user';
5 |
--------------------------------------------------------------------------------
/packages/stores/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json.schemastore.org/tsconfig",
3 | "extends": "@vben/tsconfig/web.json",
4 | "include": ["src", "shim-pinia.d.ts"]
5 | }
6 |
--------------------------------------------------------------------------------
/packages/styles/README.md:
--------------------------------------------------------------------------------
1 | # @vben/styles
2 |
3 | 用于多个 `app` 公用的样式文件,继承了 `@vben-core/design` 的所有能力。业务上有通用的样式文件可以放在这里。
4 |
5 | ## 用法
6 |
7 | ### 添加依赖
8 |
9 | ```bash
10 | # 进入目标应用目录,例如 apps/xxxx-app
11 | # cd apps/xxxx-app
12 | pnpm add @vben/styles
13 | ```
14 |
15 | ### 使用
16 |
17 | ```ts
18 | import '@vben/styles';
19 | ```
20 |
--------------------------------------------------------------------------------
/packages/styles/src/global/index.scss:
--------------------------------------------------------------------------------
1 | @use '@vben-core/design/bem' as *;
2 |
--------------------------------------------------------------------------------
/packages/styles/src/index.ts:
--------------------------------------------------------------------------------
1 | import '@vben-core/design';
2 |
--------------------------------------------------------------------------------
/packages/styles/src/naive/index.css:
--------------------------------------------------------------------------------
1 | .form-valid-error {
2 | .n-base-selection__state-border,
3 | .n-input__state-border,
4 | .n-radio-group__splitor {
5 | border: var(--n-border-error);
6 | }
7 |
8 | .n-radio-group .n-radio-button,
9 | .n-radio-group .n-radio-group__splitor {
10 | --n-button-border-color: rgb(255 56 96);
11 | }
12 |
13 | .n-radio__dot {
14 | --n-box-shadow: inset 0 0 0 1px rgb(255 56 96);
15 | }
16 |
17 | .n-checkbox-box__border {
18 | --n-border: 1px solid rgb(255 56 96);
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/packages/styles/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json.schemastore.org/tsconfig",
3 | "extends": "@vben/tsconfig/web.json",
4 | "include": ["src"],
5 | "exclude": ["node_modules"]
6 | }
7 |
--------------------------------------------------------------------------------
/packages/types/README.md:
--------------------------------------------------------------------------------
1 | # @vben/types
2 |
3 | 用于多个 `app` 公用的工具类型,继承了 `@vben-core/typings` 的所有能力。业务上有通用的类型定义可以放在这里。
4 |
5 | ## 用法
6 |
7 | ### 添加依赖
8 |
9 | ```bash
10 | # 进入目标应用目录,例如 apps/xxxx-app
11 | # cd apps/xxxx-app
12 | pnpm add @vben/types
13 | ```
14 |
15 | ### 使用
16 |
17 | ```ts
18 | // 推荐加上 type
19 | import type { SelectOption } from '@vben/types';
20 | ```
21 |
--------------------------------------------------------------------------------
/packages/types/src/index.ts:
--------------------------------------------------------------------------------
1 | export type * from './user';
2 | export type * from '@vben-core/typings';
3 |
--------------------------------------------------------------------------------
/packages/types/src/user.ts:
--------------------------------------------------------------------------------
1 | import type { BasicUserInfo } from '@vben-core/typings';
2 |
3 | /** 用户信息 */
4 | interface UserInfo extends BasicUserInfo {
5 | /**
6 | * 拓展使用
7 | */
8 | [key: string]: any;
9 | }
10 |
11 | export type { UserInfo };
12 |
--------------------------------------------------------------------------------
/packages/types/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json.schemastore.org/tsconfig",
3 | "extends": "@vben/tsconfig/web.json",
4 | "include": ["src"],
5 | "exclude": ["node_modules"]
6 | }
7 |
--------------------------------------------------------------------------------
/packages/utils/README.md:
--------------------------------------------------------------------------------
1 | # @vben/utils
2 |
3 | 用于多个 `app` 公用的工具包,继承了 `@vben-core/shared/utils` 的所有能力。业务上有通用的工具函数可以放在这里。
4 |
5 | ## 用法
6 |
7 | ### 添加依赖
8 |
9 | ```bash
10 | # 进入目标应用目录,例如 apps/xxxx-app
11 | # cd apps/xxxx-app
12 | pnpm add @vben/utils
13 | ```
14 |
15 | ### 使用
16 |
17 | ```ts
18 | import { isString } from '@vben/utils';
19 | ```
20 |
--------------------------------------------------------------------------------
/packages/utils/src/helpers/index.ts:
--------------------------------------------------------------------------------
1 | export * from './enum-options';
2 | export * from './find-menu-by-path';
3 | export * from './generate-menus';
4 | export * from './generate-routes-backend';
5 | export * from './generate-routes-frontend';
6 | export * from './get-popup-container';
7 | export * from './merge-route-modules';
8 | export * from './mitt';
9 | export * from './request';
10 | export * from './reset-routes';
11 | export * from './safe';
12 | export * from './tree';
13 | export * from './unmount-global-loading';
14 | export * from './uuid';
15 |
--------------------------------------------------------------------------------
/packages/utils/src/helpers/safe.ts:
--------------------------------------------------------------------------------
1 | /**
2 | * 跟后台逻辑一致
3 | * Number.isSafeInteger形参只能为Number类型 其他的直接返回false
4 | * @param str 数字
5 | * @returns 安全数内返回number类型 否则返回原字符串
6 | */
7 | export function safeParseNumber(str: string): number | string {
8 | const num = Number(str);
9 | return Number.isSafeInteger(num) ? num : str;
10 | }
11 |
--------------------------------------------------------------------------------
/packages/utils/src/index.ts:
--------------------------------------------------------------------------------
1 | export * from './helpers';
2 | export * from '@vben-core/shared/cache';
3 | export * from '@vben-core/shared/color';
4 | export * from '@vben-core/shared/utils';
5 | export { fileTypeFromBlob } from 'file-type';
6 |
--------------------------------------------------------------------------------
/packages/utils/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json.schemastore.org/tsconfig",
3 | "extends": "@vben/tsconfig/library.json",
4 | "compilerOptions": {
5 | "types": ["@vben-core/typings/vue-router"]
6 | },
7 | "include": ["src"],
8 | "exclude": ["node_modules"]
9 | }
10 |
--------------------------------------------------------------------------------
/playground/.env:
--------------------------------------------------------------------------------
1 | # 应用标题
2 | VITE_APP_TITLE=Vben Admin
3 |
4 | # 应用命名空间,用于缓存、store等功能的前缀,确保隔离
5 | VITE_APP_NAMESPACE=vben-web-play
6 |
--------------------------------------------------------------------------------
/playground/.env.analyze:
--------------------------------------------------------------------------------
1 | # public path
2 | VITE_BASE=/
3 |
4 | # Basic interface address SPA
5 | VITE_GLOB_API_URL=/api
6 |
7 | VITE_VISUALIZER=true
8 |
--------------------------------------------------------------------------------
/playground/.env.development:
--------------------------------------------------------------------------------
1 | # 端口号
2 | VITE_PORT=5555
3 |
4 | VITE_BASE=/
5 |
6 | # 接口地址
7 | VITE_GLOB_API_URL=/api
8 |
9 | # 是否开启 Nitro Mock服务,true 为开启,false 为关闭
10 | VITE_NITRO_MOCK=true
11 |
12 | # 是否打开 devtools,true 为打开,false 为关闭
13 | VITE_DEVTOOLS=false
14 |
15 | # 是否注入全局loading
16 | VITE_INJECT_APP_LOADING=true
17 |
--------------------------------------------------------------------------------
/playground/.env.production:
--------------------------------------------------------------------------------
1 | VITE_BASE=/
2 |
3 | # 接口地址
4 | VITE_GLOB_API_URL=https://mock-napi.vben.pro/api
5 |
6 | # 是否开启压缩,可以设置为 none, brotli, gzip
7 | VITE_COMPRESS=none
8 |
9 | # 是否开启 PWA
10 | VITE_PWA=false
11 |
12 | # vue-router 的模式
13 | VITE_ROUTER_HISTORY=hash
14 |
15 | # 是否注入全局loading
16 | VITE_INJECT_APP_LOADING=true
17 |
18 | # 打包后是否生成dist.zip
19 | VITE_ARCHIVER=true
20 |
--------------------------------------------------------------------------------
/playground/postcss.config.mjs:
--------------------------------------------------------------------------------
1 | export { default } from '@vben/tailwind-config/postcss';
2 |
--------------------------------------------------------------------------------
/playground/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ageerle/ruoyi-admin/ddec895453e402aa2dcfdd354f833d0194325619/playground/public/favicon.ico
--------------------------------------------------------------------------------
/playground/src/api/core/index.ts:
--------------------------------------------------------------------------------
1 | export * from './auth';
2 | export * from './menu';
3 | export * from './user';
4 |
--------------------------------------------------------------------------------
/playground/src/api/core/menu.ts:
--------------------------------------------------------------------------------
1 | import type { RouteRecordStringComponent } from '@vben/types';
2 |
3 | import { requestClient } from '#/api/request';
4 |
5 | /**
6 | * 获取用户所有菜单
7 | */
8 | export async function getAllMenusApi() {
9 | return requestClient.get('/menu/all');
10 | }
11 |
--------------------------------------------------------------------------------
/playground/src/api/core/user.ts:
--------------------------------------------------------------------------------
1 | import type { UserInfo } from '@vben/types';
2 |
3 | import { requestClient } from '#/api/request';
4 |
5 | /**
6 | * 获取用户信息
7 | */
8 | export async function getUserInfoApi() {
9 | return requestClient.get('/user/info');
10 | }
11 |
--------------------------------------------------------------------------------
/playground/src/api/examples/index.ts:
--------------------------------------------------------------------------------
1 | export * from './status';
2 | export * from './table';
3 |
--------------------------------------------------------------------------------
/playground/src/api/examples/status.ts:
--------------------------------------------------------------------------------
1 | import { requestClient } from '#/api/request';
2 |
3 | /**
4 | * 模拟任意状态码
5 | */
6 | async function getMockStatusApi(status: string) {
7 | return requestClient.get('/status', { params: { status } });
8 | }
9 |
10 | export { getMockStatusApi };
11 |
--------------------------------------------------------------------------------
/playground/src/api/examples/table.ts:
--------------------------------------------------------------------------------
1 | import { requestClient } from '#/api/request';
2 |
3 | export namespace DemoTableApi {
4 | export interface PageFetchParams {
5 | [key: string]: any;
6 | page: number;
7 | pageSize: number;
8 | }
9 | }
10 |
11 | /**
12 | * 获取示例表格数据
13 | */
14 | async function getExampleTableApi(params: DemoTableApi.PageFetchParams) {
15 | return requestClient.get('/table/list', { params });
16 | }
17 |
18 | export { getExampleTableApi };
19 |
--------------------------------------------------------------------------------
/playground/src/api/index.ts:
--------------------------------------------------------------------------------
1 | export * from './core';
2 | export * from './examples';
3 | export * from './system';
4 |
--------------------------------------------------------------------------------
/playground/src/api/system/index.ts:
--------------------------------------------------------------------------------
1 | export * from './dept';
2 | export * from './menu';
3 | export * from './role';
4 |
--------------------------------------------------------------------------------
/playground/src/layouts/index.ts:
--------------------------------------------------------------------------------
1 | const BasicLayout = () => import('./basic.vue');
2 | const AuthPageLayout = () => import('./auth.vue');
3 |
4 | const IFrameView = () => import('@vben/layouts').then((m) => m.IFrameView);
5 |
6 | export { AuthPageLayout, BasicLayout, IFrameView };
7 |
--------------------------------------------------------------------------------
/playground/src/locales/README.md:
--------------------------------------------------------------------------------
1 | # locale
2 |
3 | 每个app使用的国际化可能不同,这里用于扩展国际化的功能,例如扩展 dayjs、antd组件库的多语言切换,以及app本身的国际化文件。
4 |
--------------------------------------------------------------------------------
/playground/src/locales/langs/en-US/page.json:
--------------------------------------------------------------------------------
1 | {
2 | "auth": {
3 | "login": "Login",
4 | "register": "Register",
5 | "codeLogin": "Code Login",
6 | "qrcodeLogin": "Qr Code Login",
7 | "forgetPassword": "Forget Password",
8 | "sendingCode": "SMS Code is sending...",
9 | "codeSentTo": "Code has been sent to {0}"
10 | },
11 | "dashboard": {
12 | "title": "Dashboard",
13 | "analytics": "Analytics",
14 | "workspace": "Workspace"
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/playground/src/locales/langs/zh-CN/page.json:
--------------------------------------------------------------------------------
1 | {
2 | "auth": {
3 | "login": "登录",
4 | "register": "注册",
5 | "codeLogin": "验证码登录",
6 | "qrcodeLogin": "二维码登录",
7 | "forgetPassword": "忘记密码",
8 | "sendingCode": "正在发送验证码",
9 | "codeSentTo": "验证码已发送至{0}"
10 | },
11 | "dashboard": {
12 | "title": "概览",
13 | "analytics": "分析页",
14 | "workspace": "工作台"
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/playground/src/preferences.ts:
--------------------------------------------------------------------------------
1 | import { defineOverridesPreferences } from '@vben/preferences';
2 |
3 | /**
4 | * @description 项目配置文件
5 | * 只需要覆盖项目中的一部分配置,不需要的配置不用覆盖,会自动使用默认配置
6 | * !!! 更改配置后请清空缓存,否则可能不生效
7 | */
8 | export const overridesPreferences = defineOverridesPreferences({
9 | // overrides
10 | app: {
11 | name: import.meta.env.VITE_APP_TITLE,
12 | },
13 | });
14 |
--------------------------------------------------------------------------------
/playground/src/store/index.ts:
--------------------------------------------------------------------------------
1 | export * from './auth';
2 |
--------------------------------------------------------------------------------
/playground/src/views/_core/README.md:
--------------------------------------------------------------------------------
1 | # \_core
2 |
3 | 此目录包含应用程序正常运行所需的基本视图。这些视图是应用程序布局中使用的视图。
4 |
--------------------------------------------------------------------------------
/playground/src/views/_core/about/index.vue:
--------------------------------------------------------------------------------
1 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/playground/src/views/_core/authentication/qrcode-login.vue:
--------------------------------------------------------------------------------
1 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/playground/src/views/_core/fallback/coming-soon.vue:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/playground/src/views/_core/fallback/forbidden.vue:
--------------------------------------------------------------------------------
1 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/playground/src/views/_core/fallback/internal-error.vue:
--------------------------------------------------------------------------------
1 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/playground/src/views/_core/fallback/not-found.vue:
--------------------------------------------------------------------------------
1 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/playground/src/views/_core/fallback/offline.vue:
--------------------------------------------------------------------------------
1 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/playground/src/views/demos/access/admin-visible.vue:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
11 |
12 |
--------------------------------------------------------------------------------
/playground/src/views/demos/access/menu-visible-403.vue:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
11 |
12 |
--------------------------------------------------------------------------------
/playground/src/views/demos/access/super-visible.vue:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
11 |
12 |
--------------------------------------------------------------------------------
/playground/src/views/demos/access/user-visible.vue:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
11 |
12 |
--------------------------------------------------------------------------------
/playground/src/views/demos/active-icon/index.vue:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
11 |
12 |
--------------------------------------------------------------------------------
/playground/src/views/demos/breadcrumb/lateral-detail.vue:
--------------------------------------------------------------------------------
1 |
10 |
11 |
12 |
17 |
18 |
19 |
20 |
21 |
22 |
--------------------------------------------------------------------------------
/playground/src/views/demos/breadcrumb/level-detail.vue:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
11 |
12 |
--------------------------------------------------------------------------------
/playground/src/views/demos/features/hide-menu-children/parent.vue:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
11 |
12 |
13 | 打开子路由
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/playground/src/views/demos/features/menu-query/index.vue:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
11 |
12 |
--------------------------------------------------------------------------------
/playground/src/views/demos/features/new-window/index.vue:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
11 |
12 |
--------------------------------------------------------------------------------
/playground/src/views/demos/features/vue-query/typing.ts:
--------------------------------------------------------------------------------
1 | export interface IProducts {
2 | limit: number;
3 | products: {
4 | brand: string;
5 | category: string;
6 | description: string;
7 | discountPercentage: string;
8 | id: string;
9 | images: string[];
10 | price: string;
11 | rating: string;
12 | stock: string;
13 | thumbnail: string;
14 | title: string;
15 | }[];
16 | skip: number;
17 | total: number;
18 | }
19 |
--------------------------------------------------------------------------------
/playground/src/views/demos/nested/menu-1.vue:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/playground/src/views/demos/nested/menu-2-1.vue:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/playground/src/views/demos/nested/menu-3-1.vue:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/playground/src/views/demos/nested/menu-3-2-1.vue:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/playground/src/views/examples/modal/drag-demo.vue:
--------------------------------------------------------------------------------
1 |
17 |
18 | 鼠标移动到 header 上,可拖拽弹窗
19 |
20 |
--------------------------------------------------------------------------------
/playground/tailwind.config.mjs:
--------------------------------------------------------------------------------
1 | export { default } from '@vben/tailwind-config';
2 |
--------------------------------------------------------------------------------
/playground/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json.schemastore.org/tsconfig",
3 | "extends": "@vben/tsconfig/web-app.json",
4 | "compilerOptions": {
5 | "baseUrl": ".",
6 | "paths": {
7 | "#/*": ["./src/*"]
8 | }
9 | },
10 | "references": [{ "path": "./tsconfig.node.json" }],
11 | "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"]
12 | }
13 |
--------------------------------------------------------------------------------
/playground/tsconfig.node.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json.schemastore.org/tsconfig",
3 | "extends": "@vben/tsconfig/node.json",
4 | "compilerOptions": {
5 | "composite": true,
6 | "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
7 | "noEmit": false
8 | },
9 | "include": ["vite.config.mts"]
10 | }
11 |
--------------------------------------------------------------------------------
/playground/vite.config.mts:
--------------------------------------------------------------------------------
1 | import { defineConfig } from '@vben/vite-config';
2 |
3 | export default defineConfig(async () => {
4 | return {
5 | application: {},
6 | vite: {
7 | server: {
8 | proxy: {
9 | '/api': {
10 | changeOrigin: true,
11 | rewrite: (path) => path.replace(/^\/api/, ''),
12 | // mock代理目标地址
13 | target: 'http://localhost:5320/api',
14 | ws: true,
15 | },
16 | },
17 | },
18 | },
19 | };
20 | });
21 |
--------------------------------------------------------------------------------
/scripts/preview/1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ageerle/ruoyi-admin/ddec895453e402aa2dcfdd354f833d0194325619/scripts/preview/1.png
--------------------------------------------------------------------------------
/scripts/preview/2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ageerle/ruoyi-admin/ddec895453e402aa2dcfdd354f833d0194325619/scripts/preview/2.png
--------------------------------------------------------------------------------
/scripts/preview/3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ageerle/ruoyi-admin/ddec895453e402aa2dcfdd354f833d0194325619/scripts/preview/3.png
--------------------------------------------------------------------------------
/scripts/preview/4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ageerle/ruoyi-admin/ddec895453e402aa2dcfdd354f833d0194325619/scripts/preview/4.png
--------------------------------------------------------------------------------
/scripts/preview/5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ageerle/ruoyi-admin/ddec895453e402aa2dcfdd354f833d0194325619/scripts/preview/5.png
--------------------------------------------------------------------------------
/scripts/preview/6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ageerle/ruoyi-admin/ddec895453e402aa2dcfdd354f833d0194325619/scripts/preview/6.png
--------------------------------------------------------------------------------
/scripts/preview/7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ageerle/ruoyi-admin/ddec895453e402aa2dcfdd354f833d0194325619/scripts/preview/7.png
--------------------------------------------------------------------------------
/scripts/preview/8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ageerle/ruoyi-admin/ddec895453e402aa2dcfdd354f833d0194325619/scripts/preview/8.png
--------------------------------------------------------------------------------
/scripts/preview/9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ageerle/ruoyi-admin/ddec895453e402aa2dcfdd354f833d0194325619/scripts/preview/9.png
--------------------------------------------------------------------------------
/scripts/turbo-run/README.md:
--------------------------------------------------------------------------------
1 | # @vben/turbo-run
2 |
3 | turbo-run is a command line tool that allows you to run multiple commands in parallel.
4 |
--------------------------------------------------------------------------------
/scripts/turbo-run/bin/turbo-run.mjs:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env node
2 |
3 | import('../dist/index.mjs');
4 |
--------------------------------------------------------------------------------
/scripts/turbo-run/build.config.ts:
--------------------------------------------------------------------------------
1 | import { defineBuildConfig } from 'unbuild';
2 |
3 | export default defineBuildConfig({
4 | clean: true,
5 | declaration: true,
6 | entries: ['src/index'],
7 | });
8 |
--------------------------------------------------------------------------------
/scripts/turbo-run/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json.schemastore.org/tsconfig",
3 | "extends": "@vben/tsconfig/node.json",
4 | "include": ["src"],
5 | "exclude": ["node_modules"]
6 | }
7 |
--------------------------------------------------------------------------------
/scripts/vsh/README.md:
--------------------------------------------------------------------------------
1 | # @vben/vsh
2 |
3 | shell 脚本工具集合
4 |
--------------------------------------------------------------------------------
/scripts/vsh/bin/vsh.mjs:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env node
2 |
3 | import('../dist/index.mjs');
4 |
--------------------------------------------------------------------------------
/scripts/vsh/build.config.ts:
--------------------------------------------------------------------------------
1 | import { defineBuildConfig } from 'unbuild';
2 |
3 | export default defineBuildConfig({
4 | clean: true,
5 | declaration: true,
6 | entries: ['src/index'],
7 | });
8 |
--------------------------------------------------------------------------------
/scripts/vsh/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json.schemastore.org/tsconfig",
3 | "extends": "@vben/tsconfig/node.json",
4 | "include": ["src"],
5 | "exclude": ["node_modules"]
6 | }
7 |
--------------------------------------------------------------------------------
/stylelint.config.mjs:
--------------------------------------------------------------------------------
1 | export default {
2 | extends: ['@vben/stylelint-config'],
3 | root: true,
4 | };
5 |
--------------------------------------------------------------------------------
/tea.yaml:
--------------------------------------------------------------------------------
1 | # https://tea.xyz/what-is-this-file
2 | ---
3 | version: 1.0.0
4 | codeOwners:
5 | - '0xB33cc732DFc15Cd39eF50Fb165c876E24417E48f'
6 | quorum: 1
7 |
--------------------------------------------------------------------------------
/vitest.config.ts:
--------------------------------------------------------------------------------
1 | import Vue from '@vitejs/plugin-vue';
2 | import VueJsx from '@vitejs/plugin-vue-jsx';
3 | import { configDefaults, defineConfig } from 'vitest/config';
4 |
5 | export default defineConfig({
6 | plugins: [Vue(), VueJsx()],
7 | test: {
8 | environment: 'happy-dom',
9 | exclude: [...configDefaults.exclude, '**/e2e/**'],
10 | },
11 | });
12 |
--------------------------------------------------------------------------------
/vitest.workspace.ts:
--------------------------------------------------------------------------------
1 | import { defineWorkspace } from 'vitest/config';
2 |
3 | export default defineWorkspace(['vitest.config.ts']);
4 |
--------------------------------------------------------------------------------