├── .browserslistrc
├── .changeset
├── README.md
└── config.json
├── .commitlintrc.js
├── .dockerignore
├── .editorconfig
├── .gitattributes
├── .gitconfig
├── .gitee
└── ISSUE_TEMPLATE
│ ├── bug.yml
│ ├── config.yml
│ └── feature.yml
├── .github
├── CODEOWNERS
├── ISSUE_TEMPLATE
│ ├── bug-report.yml
│ ├── docs.yml
│ └── feature-request.yml
├── actions
│ └── setup-node
│ │ └── action.yml
├── commit-convention.md
├── config.yml
├── contributing.md
├── dependabot.yml
├── pull_request_template.md
├── release-drafter.yml
├── semantic.yml
└── workflows
│ ├── build.yml
│ ├── changeset-version.yml
│ ├── ci.yml
│ ├── codeql.yml
│ ├── deploy.yml
│ ├── draft.yml
│ ├── issue-close-require.yml
│ ├── issue-labeled.yml
│ ├── lock.yml
│ ├── release-tag.yml
│ ├── rerun.yml
│ ├── semantic-pull-request.yml
│ └── stale.yml
├── .gitignore
├── .gitpod.yml
├── .image
├── common
│ ├── ai-feature.png
│ ├── ai-preview.gif
│ ├── bpm-feature.png
│ ├── crm-feature.png
│ ├── erp-feature.png
│ ├── infra-feature.png
│ ├── mall-feature.png
│ ├── mall-preview.png
│ ├── project-vs.png
│ ├── ruoyi-vue-pro-architecture.png
│ ├── ruoyi-vue-pro-biz.png
│ ├── system-feature.png
│ ├── yudao-cloud-architecture.png
│ └── yudao-roadmap.png
├── demo
│ └── vben.png
├── wx-xingyu.png
├── 工作流设计器-bpmn.jpg
└── 工作流设计器-simple.jpg
├── .node-version
├── .npmrc
├── .prettierignore
├── .prettierrc.mjs
├── .stylelintignore
├── .vscode
├── extensions.json
├── global.code-snippets
├── launch.json
└── settings.json
├── 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
│ │ ├── upload.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
│ ├── 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
│ │ └── wx-xingyu.png
│ ├── src
│ │ ├── adapter
│ │ │ ├── component
│ │ │ │ └── index.ts
│ │ │ ├── form.ts
│ │ │ ├── style.css
│ │ │ └── vxe-table.ts
│ │ ├── api
│ │ │ ├── bpm
│ │ │ │ ├── category
│ │ │ │ │ └── index.ts
│ │ │ │ ├── definition
│ │ │ │ │ └── index.ts
│ │ │ │ ├── form
│ │ │ │ │ └── index.ts
│ │ │ │ ├── model
│ │ │ │ │ └── index.ts
│ │ │ │ ├── oa
│ │ │ │ │ └── leave
│ │ │ │ │ │ └── index.ts
│ │ │ │ ├── processExpression
│ │ │ │ │ └── index.ts
│ │ │ │ ├── processInstance
│ │ │ │ │ └── index.ts
│ │ │ │ ├── processListener
│ │ │ │ │ └── index.ts
│ │ │ │ ├── task
│ │ │ │ │ └── index.ts
│ │ │ │ └── userGroup
│ │ │ │ │ └── index.ts
│ │ │ ├── core
│ │ │ │ ├── auth.ts
│ │ │ │ └── index.ts
│ │ │ ├── crm
│ │ │ │ ├── business
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── status
│ │ │ │ │ │ └── index.ts
│ │ │ │ ├── clue
│ │ │ │ │ └── index.ts
│ │ │ │ ├── contact
│ │ │ │ │ └── index.ts
│ │ │ │ ├── contract
│ │ │ │ │ ├── config
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ └── index.ts
│ │ │ │ ├── customer
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── limitConfig
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ └── poolConfig
│ │ │ │ │ │ └── index.ts
│ │ │ │ ├── followup
│ │ │ │ │ └── index.ts
│ │ │ │ ├── operateLog
│ │ │ │ │ └── index.ts
│ │ │ │ ├── permission
│ │ │ │ │ └── index.ts
│ │ │ │ ├── product
│ │ │ │ │ ├── category
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ └── index.ts
│ │ │ │ ├── receivable
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── plan
│ │ │ │ │ │ └── index.ts
│ │ │ │ └── statistics
│ │ │ │ │ ├── customer.ts
│ │ │ │ │ ├── funnel.ts
│ │ │ │ │ ├── performance.ts
│ │ │ │ │ ├── portrait.ts
│ │ │ │ │ └── rank.ts
│ │ │ ├── index.ts
│ │ │ ├── infra
│ │ │ │ ├── api-access-log
│ │ │ │ │ └── index.ts
│ │ │ │ ├── api-error-log
│ │ │ │ │ └── index.ts
│ │ │ │ ├── codegen
│ │ │ │ │ └── index.ts
│ │ │ │ ├── config
│ │ │ │ │ └── index.ts
│ │ │ │ ├── data-source-config
│ │ │ │ │ └── index.ts
│ │ │ │ ├── demo
│ │ │ │ │ ├── demo01
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── demo02
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ └── demo03
│ │ │ │ │ │ ├── erp
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ │ ├── inner
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ │ └── normal
│ │ │ │ │ │ └── index.ts
│ │ │ │ ├── file-config
│ │ │ │ │ └── index.ts
│ │ │ │ ├── file
│ │ │ │ │ └── index.ts
│ │ │ │ ├── job-log
│ │ │ │ │ └── index.ts
│ │ │ │ ├── job
│ │ │ │ │ └── index.ts
│ │ │ │ └── redis
│ │ │ │ │ └── index.ts
│ │ │ ├── pay
│ │ │ │ ├── app
│ │ │ │ │ └── index.ts
│ │ │ │ ├── channel
│ │ │ │ │ └── index.ts
│ │ │ │ ├── demo
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── transfer
│ │ │ │ │ │ └── index.ts
│ │ │ │ ├── notify
│ │ │ │ │ └── index.ts
│ │ │ │ ├── order
│ │ │ │ │ └── index.ts
│ │ │ │ ├── refund
│ │ │ │ │ └── index.ts
│ │ │ │ ├── transfer
│ │ │ │ │ └── index.ts
│ │ │ │ └── wallet
│ │ │ │ │ ├── balance
│ │ │ │ │ └── index.ts
│ │ │ │ │ ├── rechargePackage
│ │ │ │ │ └── index.ts
│ │ │ │ │ └── transaction
│ │ │ │ │ └── index.ts
│ │ │ ├── request.ts
│ │ │ └── system
│ │ │ │ ├── area
│ │ │ │ └── index.ts
│ │ │ │ ├── dept
│ │ │ │ └── index.ts
│ │ │ │ ├── dict
│ │ │ │ ├── data
│ │ │ │ │ └── index.ts
│ │ │ │ └── type
│ │ │ │ │ └── index.ts
│ │ │ │ ├── login-log
│ │ │ │ └── index.ts
│ │ │ │ ├── mail
│ │ │ │ ├── account
│ │ │ │ │ └── index.ts
│ │ │ │ ├── log
│ │ │ │ │ └── index.ts
│ │ │ │ └── template
│ │ │ │ │ └── index.ts
│ │ │ │ ├── menu
│ │ │ │ └── index.ts
│ │ │ │ ├── notice
│ │ │ │ └── index.ts
│ │ │ │ ├── notify
│ │ │ │ ├── message
│ │ │ │ │ └── index.ts
│ │ │ │ └── template
│ │ │ │ │ └── index.ts
│ │ │ │ ├── oauth2
│ │ │ │ ├── client
│ │ │ │ │ └── index.ts
│ │ │ │ ├── open
│ │ │ │ │ └── index.ts
│ │ │ │ └── token
│ │ │ │ │ └── index.ts
│ │ │ │ ├── operate-log
│ │ │ │ └── index.ts
│ │ │ │ ├── permission
│ │ │ │ └── index.ts
│ │ │ │ ├── post
│ │ │ │ └── index.ts
│ │ │ │ ├── role
│ │ │ │ └── index.ts
│ │ │ │ ├── sms
│ │ │ │ ├── channel
│ │ │ │ │ └── index.ts
│ │ │ │ ├── log
│ │ │ │ │ └── index.ts
│ │ │ │ └── template
│ │ │ │ │ └── index.ts
│ │ │ │ ├── social
│ │ │ │ ├── client
│ │ │ │ │ └── index.ts
│ │ │ │ └── user
│ │ │ │ │ └── index.ts
│ │ │ │ ├── tenant-package
│ │ │ │ └── index.ts
│ │ │ │ ├── tenant
│ │ │ │ └── index.ts
│ │ │ │ └── user
│ │ │ │ ├── index.ts
│ │ │ │ └── profile
│ │ │ │ └── index.ts
│ │ ├── app.vue
│ │ ├── bootstrap.ts
│ │ ├── components
│ │ │ ├── content-wrap
│ │ │ │ ├── content-wrap.vue
│ │ │ │ └── index.ts
│ │ │ ├── cropper
│ │ │ │ ├── cropper-avatar.vue
│ │ │ │ ├── cropper-modal.vue
│ │ │ │ ├── cropper.vue
│ │ │ │ ├── index.ts
│ │ │ │ └── typing.ts
│ │ │ ├── dept-select-modal
│ │ │ │ ├── dept-select-modal.vue
│ │ │ │ └── index.ts
│ │ │ ├── description
│ │ │ │ ├── description.vue
│ │ │ │ ├── index.ts
│ │ │ │ ├── typing.ts
│ │ │ │ └── use-description.ts
│ │ │ ├── dict-tag
│ │ │ │ ├── dict-tag.vue
│ │ │ │ └── index.ts
│ │ │ ├── doc-alert
│ │ │ │ ├── doc-alert.vue
│ │ │ │ └── index.ts
│ │ │ ├── form-create
│ │ │ │ ├── components
│ │ │ │ │ ├── dict-select.vue
│ │ │ │ │ ├── use-api-select.tsx
│ │ │ │ │ └── use-images-upload.tsx
│ │ │ │ ├── helpers.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── rules
│ │ │ │ │ ├── data.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── use-dict-select.ts
│ │ │ │ │ ├── use-editor-rule.ts
│ │ │ │ │ ├── use-select-rule.ts
│ │ │ │ │ ├── use-upload-file-rule.ts
│ │ │ │ │ ├── use-upload-image-rule.ts
│ │ │ │ │ └── use-upload-images-rule.ts
│ │ │ │ └── typing.ts
│ │ │ ├── iframe
│ │ │ │ ├── iframe.vue
│ │ │ │ └── index.ts
│ │ │ ├── table-action
│ │ │ │ ├── icons.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── table-action.vue
│ │ │ │ └── typing.ts
│ │ │ ├── table-toolbar
│ │ │ │ ├── index.ts
│ │ │ │ └── table-toolbar.vue
│ │ │ ├── tinymce
│ │ │ │ ├── editor.vue
│ │ │ │ ├── helper.ts
│ │ │ │ ├── img-upload.vue
│ │ │ │ ├── index.ts
│ │ │ │ └── tinymce.ts
│ │ │ ├── upload
│ │ │ │ ├── file-upload.vue
│ │ │ │ ├── helper.ts
│ │ │ │ ├── image-upload.vue
│ │ │ │ ├── index.ts
│ │ │ │ ├── typing.ts
│ │ │ │ └── use-upload.ts
│ │ │ └── user-select-modal
│ │ │ │ ├── index.ts
│ │ │ │ └── user-select-modal.vue
│ │ ├── hooks
│ │ │ ├── index.ts
│ │ │ └── use-table-toolbar.ts
│ │ ├── layouts
│ │ │ ├── auth.vue
│ │ │ ├── basic.vue
│ │ │ ├── components
│ │ │ │ ├── help.vue
│ │ │ │ └── tenant-dropdown.vue
│ │ │ └── index.ts
│ │ ├── locales
│ │ │ ├── README.md
│ │ │ ├── index.ts
│ │ │ └── langs
│ │ │ │ ├── en-US
│ │ │ │ ├── page.json
│ │ │ │ └── utils.json
│ │ │ │ └── zh-CN
│ │ │ │ ├── page.json
│ │ │ │ └── utils.json
│ │ ├── main.ts
│ │ ├── plugins
│ │ │ └── form-create
│ │ │ │ └── index.ts
│ │ ├── preferences.ts
│ │ ├── router
│ │ │ ├── access.ts
│ │ │ ├── guard.ts
│ │ │ ├── index.ts
│ │ │ ├── routes
│ │ │ │ ├── core.ts
│ │ │ │ ├── index.ts
│ │ │ │ └── modules
│ │ │ │ │ ├── bpm.ts
│ │ │ │ │ ├── crm.ts
│ │ │ │ │ ├── dashboard.ts
│ │ │ │ │ ├── infra.ts
│ │ │ │ │ ├── leave.ts
│ │ │ │ │ ├── system.ts
│ │ │ │ │ └── vben.ts
│ │ │ └── tongji.ts
│ │ ├── store
│ │ │ ├── auth.ts
│ │ │ ├── dict.ts
│ │ │ └── index.ts
│ │ ├── utils
│ │ │ ├── constants.ts
│ │ │ ├── dict.ts
│ │ │ ├── formCreate.ts
│ │ │ ├── formatTime.ts
│ │ │ ├── index.ts
│ │ │ ├── rangePickerProps.ts
│ │ │ ├── routerHelper.ts
│ │ │ └── validator.ts
│ │ └── views
│ │ │ ├── _core
│ │ │ ├── README.md
│ │ │ ├── about
│ │ │ │ └── index.vue
│ │ │ ├── authentication
│ │ │ │ ├── code-login.vue
│ │ │ │ ├── forget-password.vue
│ │ │ │ ├── login.vue
│ │ │ │ ├── qrcode-login.vue
│ │ │ │ ├── register.vue
│ │ │ │ ├── social-login.vue
│ │ │ │ └── sso-login.vue
│ │ │ ├── fallback
│ │ │ │ ├── coming-soon.vue
│ │ │ │ ├── forbidden.vue
│ │ │ │ ├── internal-error.vue
│ │ │ │ ├── not-found.vue
│ │ │ │ └── offline.vue
│ │ │ └── profile
│ │ │ │ ├── index.vue
│ │ │ │ └── modules
│ │ │ │ ├── base-info.vue
│ │ │ │ ├── profile-user.vue
│ │ │ │ ├── reset-pwd.vue
│ │ │ │ └── user-social.vue
│ │ │ ├── ai
│ │ │ ├── chat
│ │ │ │ ├── index
│ │ │ │ │ └── index.vue
│ │ │ │ └── manager
│ │ │ │ │ └── index.vue
│ │ │ ├── image
│ │ │ │ ├── index
│ │ │ │ │ └── index.vue
│ │ │ │ └── manager
│ │ │ │ │ └── index.vue
│ │ │ ├── knowledge
│ │ │ │ └── knowledge
│ │ │ │ │ └── index.vue
│ │ │ ├── mindmap
│ │ │ │ ├── index
│ │ │ │ │ └── index.vue
│ │ │ │ └── manager
│ │ │ │ │ └── index.vue
│ │ │ ├── model
│ │ │ │ ├── apiKey
│ │ │ │ │ └── index.vue
│ │ │ │ ├── chatRole
│ │ │ │ │ └── index.vue
│ │ │ │ ├── model
│ │ │ │ │ └── index.vue
│ │ │ │ └── tool
│ │ │ │ │ └── index.vue
│ │ │ ├── music
│ │ │ │ ├── index
│ │ │ │ │ └── index.vue
│ │ │ │ └── manager
│ │ │ │ │ └── index.vue
│ │ │ ├── workflow
│ │ │ │ └── index.vue
│ │ │ └── write
│ │ │ │ ├── index
│ │ │ │ └── index.vue
│ │ │ │ └── manager
│ │ │ │ └── index.vue
│ │ │ ├── bpm
│ │ │ ├── category
│ │ │ │ ├── data.ts
│ │ │ │ ├── index.vue
│ │ │ │ └── modules
│ │ │ │ │ ├── form.vue
│ │ │ │ │ └── rename-form.vue
│ │ │ ├── form
│ │ │ │ ├── data.ts
│ │ │ │ ├── editor.vue
│ │ │ │ ├── index.vue
│ │ │ │ └── modules
│ │ │ │ │ └── form.vue
│ │ │ ├── group
│ │ │ │ ├── data.ts
│ │ │ │ ├── index.vue
│ │ │ │ └── modules
│ │ │ │ │ └── form.vue
│ │ │ ├── model
│ │ │ │ ├── form
│ │ │ │ │ ├── index.vue
│ │ │ │ │ └── modules
│ │ │ │ │ │ ├── basic-info.vue
│ │ │ │ │ │ └── form-design.vue
│ │ │ │ ├── index.vue
│ │ │ │ └── modules
│ │ │ │ │ └── category-draggable-model.vue
│ │ │ ├── oa
│ │ │ │ └── leave
│ │ │ │ │ ├── create.vue
│ │ │ │ │ ├── data.ts
│ │ │ │ │ ├── detail.vue
│ │ │ │ │ └── index.vue
│ │ │ ├── processExpression
│ │ │ │ ├── data.ts
│ │ │ │ ├── index.vue
│ │ │ │ └── modules
│ │ │ │ │ └── form.vue
│ │ │ ├── processInstance
│ │ │ │ ├── create
│ │ │ │ │ ├── index.vue
│ │ │ │ │ └── modules
│ │ │ │ │ │ └── form.vue
│ │ │ │ ├── data.ts
│ │ │ │ ├── detail
│ │ │ │ │ ├── index.vue
│ │ │ │ │ └── modules
│ │ │ │ │ │ ├── icons
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ │ └── time-line.vue
│ │ │ │ ├── index.vue
│ │ │ │ └── manager
│ │ │ │ │ ├── data.ts
│ │ │ │ │ └── index.vue
│ │ │ ├── processListener
│ │ │ │ ├── data.ts
│ │ │ │ ├── index.vue
│ │ │ │ └── modules
│ │ │ │ │ └── form.vue
│ │ │ └── task
│ │ │ │ ├── copy
│ │ │ │ ├── data.ts
│ │ │ │ └── index.vue
│ │ │ │ ├── done
│ │ │ │ ├── data.ts
│ │ │ │ └── index.vue
│ │ │ │ ├── manager
│ │ │ │ ├── data.ts
│ │ │ │ └── index.vue
│ │ │ │ └── todo
│ │ │ │ ├── data.ts
│ │ │ │ └── index.vue
│ │ │ ├── crm
│ │ │ ├── backlog
│ │ │ │ ├── data.ts
│ │ │ │ ├── index.vue
│ │ │ │ └── modules
│ │ │ │ │ ├── ClueFollowList.vue
│ │ │ │ │ ├── ContractAuditList.vue
│ │ │ │ │ ├── ContractRemindList.vue
│ │ │ │ │ ├── CustomerFollowList.vue
│ │ │ │ │ ├── CustomerPutPoolRemindList.vue
│ │ │ │ │ ├── CustomerTodayContactList.vue
│ │ │ │ │ ├── ReceivableAuditList.vue
│ │ │ │ │ └── ReceivablePlanRemindList.vue
│ │ │ ├── business
│ │ │ │ ├── data.ts
│ │ │ │ ├── index.vue
│ │ │ │ ├── modules
│ │ │ │ │ ├── detail.vue
│ │ │ │ │ └── form.vue
│ │ │ │ └── status
│ │ │ │ │ ├── data.ts
│ │ │ │ │ ├── index.vue
│ │ │ │ │ └── modules
│ │ │ │ │ └── form.vue
│ │ │ ├── clue
│ │ │ │ ├── data.ts
│ │ │ │ ├── index.vue
│ │ │ │ └── modules
│ │ │ │ │ ├── detail-info.vue
│ │ │ │ │ ├── detail.vue
│ │ │ │ │ ├── form.vue
│ │ │ │ │ └── transfer.vue
│ │ │ ├── contact
│ │ │ │ ├── index.vue
│ │ │ │ └── modules
│ │ │ │ │ └── detail.vue
│ │ │ ├── contract
│ │ │ │ ├── config
│ │ │ │ │ └── index.vue
│ │ │ │ ├── index.vue
│ │ │ │ └── modules
│ │ │ │ │ └── detail.vue
│ │ │ ├── customer
│ │ │ │ ├── data.ts
│ │ │ │ ├── index.vue
│ │ │ │ ├── limitConfig
│ │ │ │ │ └── index.vue
│ │ │ │ ├── modules
│ │ │ │ │ ├── detail.vue
│ │ │ │ │ └── form.vue
│ │ │ │ ├── pool
│ │ │ │ │ └── index.vue
│ │ │ │ └── poolConfig
│ │ │ │ │ └── index.vue
│ │ │ ├── permission
│ │ │ │ └── components
│ │ │ │ │ ├── PermissionForm.vue
│ │ │ │ │ ├── PermissionList.vue
│ │ │ │ │ └── TransferForm.vue
│ │ │ ├── product
│ │ │ │ ├── category
│ │ │ │ │ └── index.vue
│ │ │ │ ├── index.vue
│ │ │ │ └── modules
│ │ │ │ │ └── detail.vue
│ │ │ ├── receivable
│ │ │ │ ├── index.vue
│ │ │ │ ├── modules
│ │ │ │ │ └── detail.vue
│ │ │ │ └── plan
│ │ │ │ │ ├── index.vue
│ │ │ │ │ └── modules
│ │ │ │ │ └── detail.vue
│ │ │ └── statistics
│ │ │ │ ├── customer
│ │ │ │ └── index.vue
│ │ │ │ ├── funnel
│ │ │ │ └── index.vue
│ │ │ │ ├── performance
│ │ │ │ └── index.vue
│ │ │ │ ├── portrait
│ │ │ │ └── index.vue
│ │ │ │ └── rank
│ │ │ │ └── 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
│ │ │ ├── erp
│ │ │ ├── finance
│ │ │ │ ├── account
│ │ │ │ │ └── index.vue
│ │ │ │ ├── payment
│ │ │ │ │ └── index.vue
│ │ │ │ └── receipt
│ │ │ │ │ └── index.vue
│ │ │ ├── home
│ │ │ │ └── index.vue
│ │ │ ├── product
│ │ │ │ ├── category
│ │ │ │ │ └── index.vue
│ │ │ │ ├── product
│ │ │ │ │ └── index.vue
│ │ │ │ └── unit
│ │ │ │ │ └── index.vue
│ │ │ ├── purchase
│ │ │ │ ├── in
│ │ │ │ │ └── index.vue
│ │ │ │ ├── order
│ │ │ │ │ └── index.vue
│ │ │ │ ├── return
│ │ │ │ │ └── index.vue
│ │ │ │ └── supplier
│ │ │ │ │ └── index.vue
│ │ │ ├── sale
│ │ │ │ ├── customer
│ │ │ │ │ └── index.vue
│ │ │ │ ├── order
│ │ │ │ │ └── index.vue
│ │ │ │ ├── out
│ │ │ │ │ └── index.vue
│ │ │ │ └── return
│ │ │ │ │ └── index.vue
│ │ │ └── stock
│ │ │ │ ├── check
│ │ │ │ └── index.vue
│ │ │ │ ├── in
│ │ │ │ └── index.vue
│ │ │ │ ├── move
│ │ │ │ └── index.vue
│ │ │ │ ├── out
│ │ │ │ └── index.vue
│ │ │ │ ├── record
│ │ │ │ └── index.vue
│ │ │ │ ├── stock
│ │ │ │ └── index.vue
│ │ │ │ └── warehouse
│ │ │ │ └── index.vue
│ │ │ ├── infra
│ │ │ ├── apiAccessLog
│ │ │ │ ├── data.ts
│ │ │ │ ├── index.vue
│ │ │ │ └── modules
│ │ │ │ │ └── detail.vue
│ │ │ ├── apiErrorLog
│ │ │ │ ├── data.ts
│ │ │ │ ├── index.vue
│ │ │ │ └── modules
│ │ │ │ │ └── detail.vue
│ │ │ ├── build
│ │ │ │ └── index.vue
│ │ │ ├── codegen
│ │ │ │ ├── data.ts
│ │ │ │ ├── edit
│ │ │ │ │ └── index.vue
│ │ │ │ ├── index.vue
│ │ │ │ └── modules
│ │ │ │ │ ├── basic-info.vue
│ │ │ │ │ ├── column-info.vue
│ │ │ │ │ ├── generation-info.vue
│ │ │ │ │ ├── import-table.vue
│ │ │ │ │ └── preview-code.vue
│ │ │ ├── config
│ │ │ │ ├── data.ts
│ │ │ │ ├── index.vue
│ │ │ │ └── modules
│ │ │ │ │ └── form.vue
│ │ │ ├── dataSourceConfig
│ │ │ │ ├── data.ts
│ │ │ │ ├── index.vue
│ │ │ │ └── modules
│ │ │ │ │ └── form.vue
│ │ │ ├── demo
│ │ │ │ ├── demo01
│ │ │ │ │ ├── data.ts
│ │ │ │ │ ├── index.vue
│ │ │ │ │ └── modules
│ │ │ │ │ │ └── form.vue
│ │ │ │ ├── demo02
│ │ │ │ │ ├── data.ts
│ │ │ │ │ ├── index.vue
│ │ │ │ │ └── modules
│ │ │ │ │ │ └── form.vue
│ │ │ │ ├── demo03
│ │ │ │ │ ├── erp
│ │ │ │ │ │ ├── data.ts
│ │ │ │ │ │ ├── index.vue
│ │ │ │ │ │ └── modules
│ │ │ │ │ │ │ ├── demo03-course-form.vue
│ │ │ │ │ │ │ ├── demo03-course-list.vue
│ │ │ │ │ │ │ ├── demo03-grade-form.vue
│ │ │ │ │ │ │ ├── demo03-grade-list.vue
│ │ │ │ │ │ │ └── form.vue
│ │ │ │ │ ├── inner
│ │ │ │ │ │ ├── data.ts
│ │ │ │ │ │ ├── index.vue
│ │ │ │ │ │ └── modules
│ │ │ │ │ │ │ ├── demo03-course-form.vue
│ │ │ │ │ │ │ ├── demo03-course-list.vue
│ │ │ │ │ │ │ ├── demo03-grade-form.vue
│ │ │ │ │ │ │ ├── demo03-grade-list.vue
│ │ │ │ │ │ │ └── form.vue
│ │ │ │ │ └── normal
│ │ │ │ │ │ ├── data.ts
│ │ │ │ │ │ ├── index.vue
│ │ │ │ │ │ └── modules
│ │ │ │ │ │ ├── demo03-course-form.vue
│ │ │ │ │ │ ├── demo03-grade-form.vue
│ │ │ │ │ │ └── form.vue
│ │ │ │ └── general
│ │ │ │ │ ├── demo01
│ │ │ │ │ ├── index.vue
│ │ │ │ │ └── modules
│ │ │ │ │ │ └── form.vue
│ │ │ │ │ ├── demo02
│ │ │ │ │ ├── index.vue
│ │ │ │ │ └── modules
│ │ │ │ │ │ └── form.vue
│ │ │ │ │ └── demo03
│ │ │ │ │ ├── erp
│ │ │ │ │ ├── index.vue
│ │ │ │ │ └── modules
│ │ │ │ │ │ ├── demo03-course-form.vue
│ │ │ │ │ │ ├── demo03-course-list.vue
│ │ │ │ │ │ ├── demo03-grade-form.vue
│ │ │ │ │ │ ├── demo03-grade-list.vue
│ │ │ │ │ │ └── form.vue
│ │ │ │ │ ├── inner
│ │ │ │ │ ├── index.vue
│ │ │ │ │ └── modules
│ │ │ │ │ │ ├── demo03-course-form.vue
│ │ │ │ │ │ ├── demo03-course-list.vue
│ │ │ │ │ │ ├── demo03-grade-form.vue
│ │ │ │ │ │ ├── demo03-grade-list.vue
│ │ │ │ │ │ └── form.vue
│ │ │ │ │ └── normal
│ │ │ │ │ ├── index.vue
│ │ │ │ │ └── modules
│ │ │ │ │ ├── demo03-course-form.vue
│ │ │ │ │ ├── demo03-grade-form.vue
│ │ │ │ │ └── form.vue
│ │ │ ├── druid
│ │ │ │ └── index.vue
│ │ │ ├── file
│ │ │ │ ├── data.ts
│ │ │ │ ├── index.vue
│ │ │ │ └── modules
│ │ │ │ │ └── form.vue
│ │ │ ├── fileConfig
│ │ │ │ ├── data.ts
│ │ │ │ ├── index.vue
│ │ │ │ └── modules
│ │ │ │ │ └── form.vue
│ │ │ ├── job
│ │ │ │ ├── data.ts
│ │ │ │ ├── index.vue
│ │ │ │ ├── logger
│ │ │ │ │ ├── data.ts
│ │ │ │ │ ├── index.vue
│ │ │ │ │ └── modules
│ │ │ │ │ │ └── detail.vue
│ │ │ │ └── modules
│ │ │ │ │ ├── detail.vue
│ │ │ │ │ └── form.vue
│ │ │ ├── redis
│ │ │ │ ├── index.vue
│ │ │ │ └── modules
│ │ │ │ │ ├── commands.vue
│ │ │ │ │ ├── info.vue
│ │ │ │ │ └── memory.vue
│ │ │ ├── server
│ │ │ │ └── index.vue
│ │ │ ├── skywalking
│ │ │ │ └── index.vue
│ │ │ ├── swagger
│ │ │ │ └── index.vue
│ │ │ └── webSocket
│ │ │ │ └── index.vue
│ │ │ ├── iot
│ │ │ ├── device
│ │ │ │ ├── device
│ │ │ │ │ └── index.vue
│ │ │ │ └── group
│ │ │ │ │ └── index.vue
│ │ │ ├── home
│ │ │ │ └── index.vue
│ │ │ ├── plugin
│ │ │ │ └── index.vue
│ │ │ ├── product
│ │ │ │ ├── category
│ │ │ │ │ └── index.vue
│ │ │ │ └── product
│ │ │ │ │ └── index.vue
│ │ │ ├── rule
│ │ │ │ └── databridge
│ │ │ │ │ └── index.vue
│ │ │ └── thingmodel
│ │ │ │ └── index.vue
│ │ │ ├── mall
│ │ │ ├── home
│ │ │ │ └── index.vue
│ │ │ ├── product
│ │ │ │ ├── brand
│ │ │ │ │ └── index.vue
│ │ │ │ ├── category
│ │ │ │ │ └── index.vue
│ │ │ │ ├── comment
│ │ │ │ │ └── index.vue
│ │ │ │ ├── property
│ │ │ │ │ └── index.vue
│ │ │ │ └── spu
│ │ │ │ │ └── index.vue
│ │ │ ├── promotion
│ │ │ │ ├── article
│ │ │ │ │ ├── category
│ │ │ │ │ │ └── index.vue
│ │ │ │ │ └── index.vue
│ │ │ │ ├── banner
│ │ │ │ │ └── index.vue
│ │ │ │ ├── bargain
│ │ │ │ │ ├── activity
│ │ │ │ │ │ └── index.vue
│ │ │ │ │ └── record
│ │ │ │ │ │ └── index.vue
│ │ │ │ ├── combination
│ │ │ │ │ ├── activity
│ │ │ │ │ │ └── index.vue
│ │ │ │ │ └── record
│ │ │ │ │ │ └── index.vue
│ │ │ │ ├── coupon
│ │ │ │ │ ├── index.vue
│ │ │ │ │ └── template
│ │ │ │ │ │ └── index.vue
│ │ │ │ ├── discountActivity
│ │ │ │ │ └── index.vue
│ │ │ │ ├── diy
│ │ │ │ │ ├── page
│ │ │ │ │ │ └── index.vue
│ │ │ │ │ └── template
│ │ │ │ │ │ └── index.vue
│ │ │ │ ├── kefu
│ │ │ │ │ └── index.vue
│ │ │ │ ├── point
│ │ │ │ │ └── activity
│ │ │ │ │ │ └── index.vue
│ │ │ │ ├── rewardActivity
│ │ │ │ │ └── index.vue
│ │ │ │ └── seckill
│ │ │ │ │ ├── activity
│ │ │ │ │ └── index.vue
│ │ │ │ │ └── config
│ │ │ │ │ └── index.vue
│ │ │ ├── statistics
│ │ │ │ ├── member
│ │ │ │ │ └── index.vue
│ │ │ │ ├── product
│ │ │ │ │ └── index.vue
│ │ │ │ └── trade
│ │ │ │ │ └── index.vue
│ │ │ └── trade
│ │ │ │ ├── afterSale
│ │ │ │ └── index.vue
│ │ │ │ ├── brokerage
│ │ │ │ ├── record
│ │ │ │ │ └── index.vue
│ │ │ │ ├── user
│ │ │ │ │ └── index.vue
│ │ │ │ └── withdraw
│ │ │ │ │ └── index.vue
│ │ │ │ ├── config
│ │ │ │ └── index.vue
│ │ │ │ ├── delivery
│ │ │ │ ├── express
│ │ │ │ │ └── index.vue
│ │ │ │ ├── expressTemplate
│ │ │ │ │ └── index.vue
│ │ │ │ ├── pickUpOrder
│ │ │ │ │ └── index.vue
│ │ │ │ └── pickUpStore
│ │ │ │ │ └── index.vue
│ │ │ │ └── order
│ │ │ │ └── index.vue
│ │ │ ├── member
│ │ │ ├── config
│ │ │ │ └── index.vue
│ │ │ ├── group
│ │ │ │ └── index.vue
│ │ │ ├── level
│ │ │ │ └── index.vue
│ │ │ ├── point
│ │ │ │ └── record
│ │ │ │ │ └── index.vue
│ │ │ ├── signin
│ │ │ │ ├── config
│ │ │ │ │ └── index.vue
│ │ │ │ └── record
│ │ │ │ │ └── index.vue
│ │ │ ├── tag
│ │ │ │ └── index.vue
│ │ │ └── user
│ │ │ │ └── index.vue
│ │ │ ├── mp
│ │ │ ├── account
│ │ │ │ └── index.vue
│ │ │ ├── autoReply
│ │ │ │ └── index.vue
│ │ │ ├── draft
│ │ │ │ └── index.vue
│ │ │ ├── freePublish
│ │ │ │ └── index.vue
│ │ │ ├── material
│ │ │ │ └── index.vue
│ │ │ ├── menu
│ │ │ │ └── index.vue
│ │ │ ├── message
│ │ │ │ └── index.vue
│ │ │ ├── statistics
│ │ │ │ └── index.vue
│ │ │ ├── tag
│ │ │ │ └── index.vue
│ │ │ └── user
│ │ │ │ └── index.vue
│ │ │ ├── pay
│ │ │ ├── app
│ │ │ │ └── index.vue
│ │ │ ├── demo
│ │ │ │ ├── order
│ │ │ │ │ └── index.vue
│ │ │ │ └── transfer
│ │ │ │ │ └── index.vue
│ │ │ ├── notify
│ │ │ │ ├── data.ts
│ │ │ │ ├── index.vue
│ │ │ │ └── modules
│ │ │ │ │ └── detail.vue
│ │ │ ├── order
│ │ │ │ └── index.vue
│ │ │ ├── refund
│ │ │ │ ├── data.ts
│ │ │ │ ├── index.vue
│ │ │ │ └── modules
│ │ │ │ │ └── detail.vue
│ │ │ ├── transfer
│ │ │ │ └── index.vue
│ │ │ └── wallet
│ │ │ │ ├── balance
│ │ │ │ └── index.vue
│ │ │ │ └── rechargePackage
│ │ │ │ └── index.vue
│ │ │ ├── report
│ │ │ ├── goview
│ │ │ │ └── index.vue
│ │ │ └── jmreport
│ │ │ │ ├── bi.vue
│ │ │ │ └── index.vue
│ │ │ └── system
│ │ │ ├── area
│ │ │ ├── data.ts
│ │ │ ├── index.vue
│ │ │ └── modules
│ │ │ │ └── form.vue
│ │ │ ├── dept
│ │ │ ├── data.ts
│ │ │ ├── index.vue
│ │ │ └── modules
│ │ │ │ └── form.vue
│ │ │ ├── dict
│ │ │ ├── data.ts
│ │ │ ├── index.vue
│ │ │ └── modules
│ │ │ │ ├── data-form.vue
│ │ │ │ ├── data-grid.vue
│ │ │ │ ├── type-form.vue
│ │ │ │ └── type-grid.vue
│ │ │ ├── loginlog
│ │ │ ├── data.ts
│ │ │ ├── index.vue
│ │ │ └── modules
│ │ │ │ └── detail.vue
│ │ │ ├── mail
│ │ │ ├── account
│ │ │ │ ├── data.ts
│ │ │ │ ├── index.vue
│ │ │ │ └── modules
│ │ │ │ │ └── form.vue
│ │ │ ├── log
│ │ │ │ ├── data.ts
│ │ │ │ ├── index.vue
│ │ │ │ └── modules
│ │ │ │ │ └── detail.vue
│ │ │ └── template
│ │ │ │ ├── data.ts
│ │ │ │ ├── index.vue
│ │ │ │ └── modules
│ │ │ │ ├── form.vue
│ │ │ │ └── send-form.vue
│ │ │ ├── menu
│ │ │ ├── data.ts
│ │ │ ├── index.vue
│ │ │ └── modules
│ │ │ │ └── form.vue
│ │ │ ├── notice
│ │ │ ├── data.ts
│ │ │ ├── index.vue
│ │ │ └── modules
│ │ │ │ └── form.vue
│ │ │ ├── notify
│ │ │ ├── message
│ │ │ │ ├── data.ts
│ │ │ │ ├── index.vue
│ │ │ │ └── modules
│ │ │ │ │ └── detail.vue
│ │ │ ├── my
│ │ │ │ ├── data.ts
│ │ │ │ ├── index.vue
│ │ │ │ └── modules
│ │ │ │ │ └── detail.vue
│ │ │ └── template
│ │ │ │ ├── data.ts
│ │ │ │ ├── index.vue
│ │ │ │ └── modules
│ │ │ │ ├── form.vue
│ │ │ │ └── send-form.vue
│ │ │ ├── oauth2
│ │ │ ├── client
│ │ │ │ ├── data.ts
│ │ │ │ ├── index.vue
│ │ │ │ └── modules
│ │ │ │ │ └── form.vue
│ │ │ └── token
│ │ │ │ ├── data.ts
│ │ │ │ └── index.vue
│ │ │ ├── operatelog
│ │ │ ├── data.ts
│ │ │ ├── index.vue
│ │ │ └── modules
│ │ │ │ └── detail.vue
│ │ │ ├── post
│ │ │ ├── data.ts
│ │ │ ├── index.vue
│ │ │ └── modules
│ │ │ │ └── form.vue
│ │ │ ├── role
│ │ │ ├── data.ts
│ │ │ ├── index.vue
│ │ │ └── modules
│ │ │ │ ├── assign-data-permission-form.vue
│ │ │ │ ├── assign-menu-form.vue
│ │ │ │ └── form.vue
│ │ │ ├── sms
│ │ │ ├── channel
│ │ │ │ ├── data.ts
│ │ │ │ ├── index.vue
│ │ │ │ └── modules
│ │ │ │ │ └── form.vue
│ │ │ ├── log
│ │ │ │ ├── data.ts
│ │ │ │ ├── index.vue
│ │ │ │ └── modules
│ │ │ │ │ └── detail.vue
│ │ │ └── template
│ │ │ │ ├── data.ts
│ │ │ │ ├── index.vue
│ │ │ │ └── modules
│ │ │ │ ├── form.vue
│ │ │ │ └── send-form.vue
│ │ │ ├── social
│ │ │ ├── client
│ │ │ │ ├── data.ts
│ │ │ │ ├── index.vue
│ │ │ │ └── modules
│ │ │ │ │ └── form.vue
│ │ │ └── user
│ │ │ │ ├── data.ts
│ │ │ │ ├── index.vue
│ │ │ │ └── modules
│ │ │ │ └── detail.vue
│ │ │ ├── tenant
│ │ │ ├── data.ts
│ │ │ ├── index.vue
│ │ │ └── modules
│ │ │ │ └── form.vue
│ │ │ ├── tenantPackage
│ │ │ ├── data.ts
│ │ │ ├── index.vue
│ │ │ └── modules
│ │ │ │ └── form.vue
│ │ │ └── user
│ │ │ ├── data.ts
│ │ │ ├── index.vue
│ │ │ └── modules
│ │ │ ├── assign-role-form.vue
│ │ │ ├── dept-tree.vue
│ │ │ ├── form.vue
│ │ │ ├── import-form.vue
│ │ │ └── reset-password-form.vue
│ ├── tailwind.config.mjs
│ ├── tsconfig.json
│ ├── tsconfig.node.json
│ └── vite.config.mts
├── web-ele
│ ├── .env
│ ├── .env.analyze
│ ├── .env.development
│ ├── .env.production
│ ├── 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
│ │ └── wx-xingyu.png
│ ├── src
│ │ ├── adapter
│ │ │ ├── component
│ │ │ │ └── index.ts
│ │ │ ├── form.ts
│ │ │ └── vxe-table.ts
│ │ ├── api
│ │ │ ├── core
│ │ │ │ ├── auth.ts
│ │ │ │ └── index.ts
│ │ │ ├── index.ts
│ │ │ ├── infra
│ │ │ │ ├── api-access-log
│ │ │ │ │ └── index.ts
│ │ │ │ ├── api-error-log
│ │ │ │ │ └── index.ts
│ │ │ │ ├── codegen
│ │ │ │ │ └── index.ts
│ │ │ │ ├── config
│ │ │ │ │ └── index.ts
│ │ │ │ ├── data-source-config
│ │ │ │ │ └── index.ts
│ │ │ │ ├── demo
│ │ │ │ │ ├── demo01
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── demo02
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ └── demo03
│ │ │ │ │ │ ├── erp
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ │ ├── inner
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ │ └── normal
│ │ │ │ │ │ └── index.ts
│ │ │ │ ├── file-config
│ │ │ │ │ └── index.ts
│ │ │ │ ├── file
│ │ │ │ │ └── index.ts
│ │ │ │ ├── job-log
│ │ │ │ │ └── index.ts
│ │ │ │ ├── job
│ │ │ │ │ └── index.ts
│ │ │ │ └── redis
│ │ │ │ │ └── index.ts
│ │ │ ├── request.ts
│ │ │ └── system
│ │ │ │ ├── area
│ │ │ │ └── index.ts
│ │ │ │ ├── dept
│ │ │ │ └── index.ts
│ │ │ │ ├── dict
│ │ │ │ ├── data
│ │ │ │ │ └── index.ts
│ │ │ │ └── type
│ │ │ │ │ └── index.ts
│ │ │ │ ├── login-log
│ │ │ │ └── index.ts
│ │ │ │ ├── mail
│ │ │ │ ├── account
│ │ │ │ │ └── index.ts
│ │ │ │ ├── log
│ │ │ │ │ └── index.ts
│ │ │ │ └── template
│ │ │ │ │ └── index.ts
│ │ │ │ ├── menu
│ │ │ │ └── index.ts
│ │ │ │ ├── notice
│ │ │ │ └── index.ts
│ │ │ │ ├── notify
│ │ │ │ ├── message
│ │ │ │ │ └── index.ts
│ │ │ │ └── template
│ │ │ │ │ └── index.ts
│ │ │ │ ├── oauth2
│ │ │ │ ├── client
│ │ │ │ │ └── index.ts
│ │ │ │ ├── open
│ │ │ │ │ └── index.ts
│ │ │ │ └── token
│ │ │ │ │ └── index.ts
│ │ │ │ ├── operate-log
│ │ │ │ └── index.ts
│ │ │ │ ├── permission
│ │ │ │ └── index.ts
│ │ │ │ ├── post
│ │ │ │ └── index.ts
│ │ │ │ ├── role
│ │ │ │ └── index.ts
│ │ │ │ ├── sms
│ │ │ │ ├── channel
│ │ │ │ │ └── index.ts
│ │ │ │ ├── log
│ │ │ │ │ └── index.ts
│ │ │ │ └── template
│ │ │ │ │ └── index.ts
│ │ │ │ ├── social
│ │ │ │ ├── client
│ │ │ │ │ └── index.ts
│ │ │ │ └── user
│ │ │ │ │ └── index.ts
│ │ │ │ ├── tenant-package
│ │ │ │ └── index.ts
│ │ │ │ ├── tenant
│ │ │ │ └── index.ts
│ │ │ │ └── user
│ │ │ │ ├── index.ts
│ │ │ │ └── profile
│ │ │ │ └── index.ts
│ │ ├── app.vue
│ │ ├── bootstrap.ts
│ │ ├── components
│ │ │ ├── cropper
│ │ │ │ ├── cropper-avatar.vue
│ │ │ │ ├── cropper-modal.vue
│ │ │ │ ├── cropper.vue
│ │ │ │ ├── index.ts
│ │ │ │ └── typing.ts
│ │ │ ├── dict-tag
│ │ │ │ ├── dict-tag.vue
│ │ │ │ └── index.ts
│ │ │ ├── doc-alert
│ │ │ │ ├── doc-alert.vue
│ │ │ │ └── index.ts
│ │ │ ├── form-create
│ │ │ │ ├── components
│ │ │ │ │ ├── dict-select.vue
│ │ │ │ │ ├── use-api-select.tsx
│ │ │ │ │ └── use-images-upload.tsx
│ │ │ │ ├── helpers.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── rules
│ │ │ │ │ ├── data.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── use-dict-select.ts
│ │ │ │ │ ├── use-editor-rule.ts
│ │ │ │ │ ├── use-select-rule.ts
│ │ │ │ │ ├── use-upload-file-rule.ts
│ │ │ │ │ ├── use-upload-image-rule.ts
│ │ │ │ │ └── use-upload-images-rule.ts
│ │ │ │ └── typing.ts
│ │ │ ├── iframe
│ │ │ │ ├── iframe.vue
│ │ │ │ └── index.ts
│ │ │ ├── tinymce
│ │ │ │ ├── editor.vue
│ │ │ │ ├── helper.ts
│ │ │ │ ├── img-upload.vue
│ │ │ │ ├── index.ts
│ │ │ │ └── tinymce.ts
│ │ │ └── upload
│ │ │ │ ├── file-upload.vue
│ │ │ │ ├── helper.ts
│ │ │ │ ├── image-upload.vue
│ │ │ │ ├── index.ts
│ │ │ │ ├── typing.ts
│ │ │ │ └── use-upload.ts
│ │ ├── layouts
│ │ │ ├── auth.vue
│ │ │ ├── basic.vue
│ │ │ ├── components
│ │ │ │ ├── help.vue
│ │ │ │ └── tenant-dropdown.vue
│ │ │ └── index.ts
│ │ ├── locales
│ │ │ ├── README.md
│ │ │ ├── index.ts
│ │ │ └── langs
│ │ │ │ ├── en-US
│ │ │ │ ├── demos.json
│ │ │ │ ├── page.json
│ │ │ │ └── utils.json
│ │ │ │ └── zh-CN
│ │ │ │ ├── demos.json
│ │ │ │ ├── page.json
│ │ │ │ └── utils.json
│ │ ├── main.ts
│ │ ├── plugins
│ │ │ └── form-create
│ │ │ │ └── index.ts
│ │ ├── preferences.ts
│ │ ├── router
│ │ │ ├── access.ts
│ │ │ ├── guard.ts
│ │ │ ├── index.ts
│ │ │ ├── routes
│ │ │ │ ├── core.ts
│ │ │ │ ├── index.ts
│ │ │ │ └── modules
│ │ │ │ │ ├── dashboard.ts
│ │ │ │ │ ├── infra.ts
│ │ │ │ │ ├── system.ts
│ │ │ │ │ └── vben.ts
│ │ │ └── tongji.ts
│ │ ├── store
│ │ │ ├── auth.ts
│ │ │ ├── dict.ts
│ │ │ └── index.ts
│ │ ├── utils
│ │ │ ├── constants.ts
│ │ │ ├── dict.ts
│ │ │ ├── formCreate.ts
│ │ │ ├── formatTime.ts
│ │ │ ├── index.ts
│ │ │ ├── rangePickerProps.ts
│ │ │ ├── routerHelper.ts
│ │ │ └── validator.ts
│ │ └── views
│ │ │ ├── _core
│ │ │ ├── README.md
│ │ │ ├── about
│ │ │ │ └── index.vue
│ │ │ ├── authentication
│ │ │ │ ├── code-login.vue
│ │ │ │ ├── forget-password.vue
│ │ │ │ ├── login.vue
│ │ │ │ ├── qrcode-login.vue
│ │ │ │ ├── register.vue
│ │ │ │ ├── social-login.vue
│ │ │ │ └── sso-login.vue
│ │ │ ├── fallback
│ │ │ │ ├── coming-soon.vue
│ │ │ │ ├── forbidden.vue
│ │ │ │ ├── internal-error.vue
│ │ │ │ ├── not-found.vue
│ │ │ │ └── offline.vue
│ │ │ └── profile
│ │ │ │ ├── index.vue
│ │ │ │ └── modules
│ │ │ │ ├── base-info.vue
│ │ │ │ ├── profile-user.vue
│ │ │ │ ├── reset-pwd.vue
│ │ │ │ └── user-social.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
│ │ │ ├── infra
│ │ │ ├── apiAccessLog
│ │ │ │ ├── data.ts
│ │ │ │ ├── index.vue
│ │ │ │ └── modules
│ │ │ │ │ └── detail.vue
│ │ │ ├── apiErrorLog
│ │ │ │ ├── data.ts
│ │ │ │ ├── index.vue
│ │ │ │ └── modules
│ │ │ │ │ └── detail.vue
│ │ │ ├── build
│ │ │ │ └── index.vue
│ │ │ ├── codegen
│ │ │ │ ├── data.ts
│ │ │ │ ├── edit
│ │ │ │ │ └── index.vue
│ │ │ │ ├── index.vue
│ │ │ │ └── modules
│ │ │ │ │ ├── basic-info.vue
│ │ │ │ │ ├── column-info.vue
│ │ │ │ │ ├── generation-info.vue
│ │ │ │ │ ├── import-table.vue
│ │ │ │ │ └── preview-code.vue
│ │ │ ├── config
│ │ │ │ ├── data.ts
│ │ │ │ ├── index.vue
│ │ │ │ └── modules
│ │ │ │ │ └── form.vue
│ │ │ ├── dataSourceConfig
│ │ │ │ ├── data.ts
│ │ │ │ ├── index.vue
│ │ │ │ └── modules
│ │ │ │ │ └── form.vue
│ │ │ ├── druid
│ │ │ │ └── index.vue
│ │ │ ├── file
│ │ │ │ ├── data.ts
│ │ │ │ ├── index.vue
│ │ │ │ └── modules
│ │ │ │ │ └── form.vue
│ │ │ ├── fileConfig
│ │ │ │ ├── data.ts
│ │ │ │ ├── index.vue
│ │ │ │ └── modules
│ │ │ │ │ └── form.vue
│ │ │ ├── job
│ │ │ │ ├── data.ts
│ │ │ │ ├── index.vue
│ │ │ │ ├── logger
│ │ │ │ │ ├── data.ts
│ │ │ │ │ ├── index.vue
│ │ │ │ │ └── modules
│ │ │ │ │ │ └── detail.vue
│ │ │ │ └── modules
│ │ │ │ │ ├── detail.vue
│ │ │ │ │ └── form.vue
│ │ │ ├── redis
│ │ │ │ ├── index.vue
│ │ │ │ └── modules
│ │ │ │ │ ├── commands.vue
│ │ │ │ │ ├── info.vue
│ │ │ │ │ └── memory.vue
│ │ │ ├── server
│ │ │ │ └── index.vue
│ │ │ ├── skywalking
│ │ │ │ └── index.vue
│ │ │ ├── swagger
│ │ │ │ └── index.vue
│ │ │ └── webSocket
│ │ │ │ └── index.vue
│ │ │ └── system
│ │ │ ├── area
│ │ │ ├── data.ts
│ │ │ ├── index.vue
│ │ │ └── modules
│ │ │ │ └── form.vue
│ │ │ ├── dept
│ │ │ ├── data.ts
│ │ │ ├── index.vue
│ │ │ └── modules
│ │ │ │ └── form.vue
│ │ │ ├── dict
│ │ │ ├── data.ts
│ │ │ ├── index.vue
│ │ │ └── modules
│ │ │ │ ├── data-form.vue
│ │ │ │ ├── data-grid.vue
│ │ │ │ ├── type-form.vue
│ │ │ │ └── type-grid.vue
│ │ │ ├── loginlog
│ │ │ ├── data.ts
│ │ │ ├── index.vue
│ │ │ └── modules
│ │ │ │ └── detail.vue
│ │ │ ├── mail
│ │ │ ├── account
│ │ │ │ ├── data.ts
│ │ │ │ ├── index.vue
│ │ │ │ └── modules
│ │ │ │ │ └── form.vue
│ │ │ ├── log
│ │ │ │ ├── data.ts
│ │ │ │ ├── index.vue
│ │ │ │ └── modules
│ │ │ │ │ └── detail.vue
│ │ │ └── template
│ │ │ │ ├── data.ts
│ │ │ │ ├── index.vue
│ │ │ │ └── modules
│ │ │ │ ├── form.vue
│ │ │ │ └── send-form.vue
│ │ │ ├── menu
│ │ │ ├── data.ts
│ │ │ ├── index.vue
│ │ │ └── modules
│ │ │ │ └── form.vue
│ │ │ ├── notice
│ │ │ ├── data.ts
│ │ │ ├── index.vue
│ │ │ └── modules
│ │ │ │ └── form.vue
│ │ │ ├── notify
│ │ │ ├── message
│ │ │ │ ├── data.ts
│ │ │ │ ├── index.vue
│ │ │ │ └── modules
│ │ │ │ │ └── detail.vue
│ │ │ ├── my
│ │ │ │ ├── data.ts
│ │ │ │ ├── index.vue
│ │ │ │ └── modules
│ │ │ │ │ └── detail.vue
│ │ │ └── template
│ │ │ │ ├── data.ts
│ │ │ │ ├── index.vue
│ │ │ │ └── modules
│ │ │ │ ├── form.vue
│ │ │ │ └── send-form.vue
│ │ │ ├── oauth2
│ │ │ ├── client
│ │ │ │ ├── data.ts
│ │ │ │ ├── index.vue
│ │ │ │ └── modules
│ │ │ │ │ └── form.vue
│ │ │ └── token
│ │ │ │ ├── data.ts
│ │ │ │ └── index.vue
│ │ │ ├── operatelog
│ │ │ ├── data.ts
│ │ │ ├── index.vue
│ │ │ └── modules
│ │ │ │ └── detail.vue
│ │ │ ├── post
│ │ │ ├── data.ts
│ │ │ ├── index.vue
│ │ │ └── modules
│ │ │ │ └── form.vue
│ │ │ ├── role
│ │ │ ├── data.ts
│ │ │ ├── index.vue
│ │ │ └── modules
│ │ │ │ ├── assign-data-permission-form.vue
│ │ │ │ ├── assign-menu-form.vue
│ │ │ │ └── form.vue
│ │ │ ├── sms
│ │ │ ├── channel
│ │ │ │ ├── data.ts
│ │ │ │ ├── index.vue
│ │ │ │ └── modules
│ │ │ │ │ └── form.vue
│ │ │ ├── log
│ │ │ │ ├── data.ts
│ │ │ │ ├── index.vue
│ │ │ │ └── modules
│ │ │ │ │ └── detail.vue
│ │ │ └── template
│ │ │ │ ├── data.ts
│ │ │ │ ├── index.vue
│ │ │ │ └── modules
│ │ │ │ ├── form.vue
│ │ │ │ └── send-form.vue
│ │ │ ├── social
│ │ │ ├── client
│ │ │ │ ├── data.ts
│ │ │ │ ├── index.vue
│ │ │ │ └── modules
│ │ │ │ │ └── form.vue
│ │ │ └── user
│ │ │ │ ├── data.ts
│ │ │ │ ├── index.vue
│ │ │ │ └── modules
│ │ │ │ └── detail.vue
│ │ │ ├── tenant
│ │ │ ├── data.ts
│ │ │ ├── index.vue
│ │ │ └── modules
│ │ │ │ └── form.vue
│ │ │ ├── tenantPackage
│ │ │ ├── data.ts
│ │ │ ├── index.vue
│ │ │ └── modules
│ │ │ │ └── form.vue
│ │ │ └── user
│ │ │ ├── data.ts
│ │ │ ├── index.vue
│ │ │ └── modules
│ │ │ ├── assign-role-form.vue
│ │ │ ├── dept-tree.vue
│ │ │ ├── form.vue
│ │ │ ├── import-form.vue
│ │ │ └── reset-password-form.vue
│ ├── tailwind.config.mjs
│ ├── tsconfig.json
│ ├── tsconfig.node.json
│ └── vite.config.mts
└── web-naive
│ ├── .env
│ ├── .env.analyze
│ ├── .env.development
│ ├── .env.production
│ ├── index.html
│ ├── package.json
│ ├── postcss.config.mjs
│ ├── public
│ └── favicon.ico
│ ├── src
│ ├── adapter
│ │ ├── component
│ │ │ └── index.ts
│ │ ├── form.ts
│ │ ├── naive.ts
│ │ └── vxe-table.ts
│ ├── api
│ │ ├── core
│ │ │ ├── auth.ts
│ │ │ └── index.ts
│ │ ├── index.ts
│ │ ├── infra
│ │ │ ├── api-access-log
│ │ │ │ └── index.ts
│ │ │ ├── api-error-log
│ │ │ │ └── index.ts
│ │ │ ├── codegen
│ │ │ │ └── index.ts
│ │ │ ├── config
│ │ │ │ └── index.ts
│ │ │ ├── data-source-config
│ │ │ │ └── index.ts
│ │ │ ├── demo
│ │ │ │ ├── demo01
│ │ │ │ │ └── index.ts
│ │ │ │ ├── demo02
│ │ │ │ │ └── index.ts
│ │ │ │ └── demo03
│ │ │ │ │ ├── erp
│ │ │ │ │ └── index.ts
│ │ │ │ │ ├── inner
│ │ │ │ │ └── index.ts
│ │ │ │ │ └── normal
│ │ │ │ │ └── index.ts
│ │ │ ├── file-config
│ │ │ │ └── index.ts
│ │ │ ├── file
│ │ │ │ └── index.ts
│ │ │ ├── job-log
│ │ │ │ └── index.ts
│ │ │ ├── job
│ │ │ │ └── index.ts
│ │ │ └── redis
│ │ │ │ └── index.ts
│ │ ├── request.ts
│ │ └── system
│ │ │ ├── area
│ │ │ └── index.ts
│ │ │ ├── dept
│ │ │ └── index.ts
│ │ │ ├── dict
│ │ │ ├── data
│ │ │ │ └── index.ts
│ │ │ └── type
│ │ │ │ └── index.ts
│ │ │ ├── login-log
│ │ │ └── index.ts
│ │ │ ├── mail
│ │ │ ├── account
│ │ │ │ └── index.ts
│ │ │ ├── log
│ │ │ │ └── index.ts
│ │ │ └── template
│ │ │ │ └── index.ts
│ │ │ ├── menu
│ │ │ └── index.ts
│ │ │ ├── notice
│ │ │ └── index.ts
│ │ │ ├── notify
│ │ │ ├── message
│ │ │ │ └── index.ts
│ │ │ └── template
│ │ │ │ └── index.ts
│ │ │ ├── oauth2
│ │ │ ├── client
│ │ │ │ └── index.ts
│ │ │ ├── open
│ │ │ │ └── index.ts
│ │ │ └── token
│ │ │ │ └── index.ts
│ │ │ ├── operate-log
│ │ │ └── index.ts
│ │ │ ├── permission
│ │ │ └── index.ts
│ │ │ ├── post
│ │ │ └── index.ts
│ │ │ ├── role
│ │ │ └── index.ts
│ │ │ ├── sms
│ │ │ ├── channel
│ │ │ │ └── index.ts
│ │ │ ├── log
│ │ │ │ └── index.ts
│ │ │ └── template
│ │ │ │ └── index.ts
│ │ │ ├── social
│ │ │ ├── client
│ │ │ │ └── index.ts
│ │ │ └── user
│ │ │ │ └── index.ts
│ │ │ ├── tenant-package
│ │ │ └── index.ts
│ │ │ ├── tenant
│ │ │ └── index.ts
│ │ │ └── user
│ │ │ ├── index.ts
│ │ │ └── profile
│ │ │ └── index.ts
│ ├── app.vue
│ ├── bootstrap.ts
│ ├── components
│ │ ├── cropper
│ │ │ ├── cropper-avatar.vue
│ │ │ ├── cropper-modal.vue
│ │ │ ├── cropper.vue
│ │ │ ├── index.ts
│ │ │ └── typing.ts
│ │ ├── dict-tag
│ │ │ ├── dict-tag.vue
│ │ │ └── index.ts
│ │ ├── doc-alert
│ │ │ ├── doc-alert.vue
│ │ │ └── index.ts
│ │ ├── iframe
│ │ │ ├── iframe.vue
│ │ │ └── index.ts
│ │ ├── table-toolbar
│ │ │ ├── index.ts
│ │ │ └── table-toolbar.vue
│ │ └── upload
│ │ │ ├── file-upload.vue
│ │ │ ├── helper.ts
│ │ │ ├── image-upload.vue
│ │ │ ├── index.ts
│ │ │ ├── typing.ts
│ │ │ └── use-upload.ts
│ ├── layouts
│ │ ├── auth.vue
│ │ ├── basic.vue
│ │ ├── components
│ │ │ ├── help.vue
│ │ │ └── tenant-dropdown.vue
│ │ └── index.ts
│ ├── locales
│ │ ├── README.md
│ │ ├── index.ts
│ │ └── langs
│ │ │ ├── en-US
│ │ │ ├── page.json
│ │ │ └── utils.json
│ │ │ └── zh-CN
│ │ │ ├── page.json
│ │ │ └── utils.json
│ ├── main.ts
│ ├── preferences.ts
│ ├── router
│ │ ├── access.ts
│ │ ├── guard.ts
│ │ ├── index.ts
│ │ ├── routes
│ │ │ ├── core.ts
│ │ │ ├── index.ts
│ │ │ └── modules
│ │ │ │ ├── dashboard.ts
│ │ │ │ ├── infra.ts
│ │ │ │ ├── system.ts
│ │ │ │ └── vben.ts
│ │ └── tongji.ts
│ ├── store
│ │ ├── auth.ts
│ │ ├── dict.ts
│ │ └── index.ts
│ ├── utils
│ │ ├── constants.ts
│ │ ├── dict.ts
│ │ ├── formCreate.ts
│ │ ├── formatTime.ts
│ │ ├── index.ts
│ │ ├── rangePickerProps.ts
│ │ ├── routerHelper.ts
│ │ └── validator.ts
│ └── views
│ │ ├── _core
│ │ ├── README.md
│ │ ├── about
│ │ │ └── index.vue
│ │ ├── authentication
│ │ │ ├── code-login.vue
│ │ │ ├── forget-password.vue
│ │ │ ├── login.vue
│ │ │ ├── qrcode-login.vue
│ │ │ ├── register.vue
│ │ │ ├── social-login.vue
│ │ │ └── sso-login.vue
│ │ ├── fallback
│ │ │ ├── coming-soon.vue
│ │ │ ├── forbidden.vue
│ │ │ ├── internal-error.vue
│ │ │ ├── not-found.vue
│ │ │ └── offline.vue
│ │ └── profile
│ │ │ ├── index.vue
│ │ │ └── modules
│ │ │ ├── base-info.vue
│ │ │ ├── profile-user.vue
│ │ │ ├── reset-pwd.vue
│ │ │ └── user-social.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
│ │ ├── infra
│ │ ├── apiAccessLog
│ │ │ ├── data.ts
│ │ │ ├── index.vue
│ │ │ └── modules
│ │ │ │ └── detail.vue
│ │ ├── apiErrorLog
│ │ │ ├── data.ts
│ │ │ ├── index.vue
│ │ │ └── modules
│ │ │ │ └── detail.vue
│ │ ├── build
│ │ │ └── index.vue
│ │ ├── codegen
│ │ │ ├── data.ts
│ │ │ ├── edit
│ │ │ │ └── index.vue
│ │ │ ├── index.vue
│ │ │ └── modules
│ │ │ │ ├── basic-info.vue
│ │ │ │ ├── column-info.vue
│ │ │ │ ├── generation-info.vue
│ │ │ │ ├── import-table.vue
│ │ │ │ └── preview-code.vue
│ │ ├── config
│ │ │ ├── data.ts
│ │ │ ├── index.vue
│ │ │ └── modules
│ │ │ │ └── form.vue
│ │ ├── dataSourceConfig
│ │ │ ├── data.ts
│ │ │ ├── index.vue
│ │ │ └── modules
│ │ │ │ └── form.vue
│ │ ├── druid
│ │ │ └── index.vue
│ │ ├── file
│ │ │ ├── data.ts
│ │ │ ├── index.vue
│ │ │ └── modules
│ │ │ │ └── form.vue
│ │ ├── fileConfig
│ │ │ ├── data.ts
│ │ │ ├── index.vue
│ │ │ └── modules
│ │ │ │ └── form.vue
│ │ ├── job
│ │ │ ├── data.ts
│ │ │ ├── index.vue
│ │ │ ├── logger
│ │ │ │ ├── data.ts
│ │ │ │ ├── index.vue
│ │ │ │ └── modules
│ │ │ │ │ └── detail.vue
│ │ │ └── modules
│ │ │ │ ├── detail.vue
│ │ │ │ └── form.vue
│ │ ├── redis
│ │ │ ├── index.vue
│ │ │ └── modules
│ │ │ │ ├── commands.vue
│ │ │ │ ├── info.vue
│ │ │ │ └── memory.vue
│ │ ├── server
│ │ │ └── index.vue
│ │ ├── skywalking
│ │ │ └── index.vue
│ │ ├── swagger
│ │ │ └── index.vue
│ │ └── webSocket
│ │ │ └── index.vue
│ │ └── system
│ │ ├── area
│ │ ├── data.ts
│ │ ├── index.vue
│ │ └── modules
│ │ │ └── form.vue
│ │ ├── dept
│ │ ├── data.ts
│ │ ├── index.vue
│ │ └── modules
│ │ │ └── form.vue
│ │ ├── dict
│ │ ├── data.ts
│ │ ├── index.vue
│ │ └── modules
│ │ │ ├── data-form.vue
│ │ │ ├── data-grid.vue
│ │ │ ├── type-form.vue
│ │ │ └── type-grid.vue
│ │ ├── loginlog
│ │ ├── data.ts
│ │ ├── index.vue
│ │ └── modules
│ │ │ └── detail.vue
│ │ ├── mail
│ │ ├── account
│ │ │ ├── data.ts
│ │ │ ├── index.vue
│ │ │ └── modules
│ │ │ │ └── form.vue
│ │ ├── log
│ │ │ ├── data.ts
│ │ │ ├── index.vue
│ │ │ └── modules
│ │ │ │ └── detail.vue
│ │ └── template
│ │ │ ├── data.ts
│ │ │ ├── index.vue
│ │ │ └── modules
│ │ │ ├── form.vue
│ │ │ └── send-form.vue
│ │ ├── menu
│ │ ├── data.ts
│ │ ├── index.vue
│ │ └── modules
│ │ │ └── form.vue
│ │ ├── notice
│ │ ├── data.ts
│ │ ├── index.vue
│ │ └── modules
│ │ │ └── form.vue
│ │ ├── notify
│ │ ├── message
│ │ │ ├── data.ts
│ │ │ ├── index.vue
│ │ │ └── modules
│ │ │ │ └── detail.vue
│ │ ├── my
│ │ │ ├── data.ts
│ │ │ ├── index.vue
│ │ │ └── modules
│ │ │ │ └── detail.vue
│ │ └── template
│ │ │ ├── data.ts
│ │ │ ├── index.vue
│ │ │ └── modules
│ │ │ ├── form.vue
│ │ │ └── send-form.vue
│ │ ├── oauth2
│ │ ├── client
│ │ │ ├── data.ts
│ │ │ ├── index.vue
│ │ │ └── modules
│ │ │ │ └── form.vue
│ │ └── token
│ │ │ ├── data.ts
│ │ │ └── index.vue
│ │ ├── operatelog
│ │ ├── data.ts
│ │ ├── index.vue
│ │ └── modules
│ │ │ └── detail.vue
│ │ ├── post
│ │ ├── data.ts
│ │ ├── index.vue
│ │ └── modules
│ │ │ └── form.vue
│ │ ├── role
│ │ ├── data.ts
│ │ ├── index.vue
│ │ └── modules
│ │ │ ├── assign-data-permission-form.vue
│ │ │ ├── assign-menu-form.vue
│ │ │ └── form.vue
│ │ ├── sms
│ │ ├── channel
│ │ │ ├── data.ts
│ │ │ ├── index.vue
│ │ │ └── modules
│ │ │ │ └── form.vue
│ │ ├── log
│ │ │ ├── data.ts
│ │ │ ├── index.vue
│ │ │ └── modules
│ │ │ │ └── detail.vue
│ │ └── template
│ │ │ ├── data.ts
│ │ │ ├── index.vue
│ │ │ └── modules
│ │ │ ├── form.vue
│ │ │ └── send-form.vue
│ │ ├── social
│ │ ├── client
│ │ │ ├── data.ts
│ │ │ ├── index.vue
│ │ │ └── modules
│ │ │ │ └── form.vue
│ │ └── user
│ │ │ ├── data.ts
│ │ │ ├── index.vue
│ │ │ └── modules
│ │ │ └── detail.vue
│ │ ├── tenant
│ │ ├── data.ts
│ │ ├── index.vue
│ │ └── modules
│ │ │ └── form.vue
│ │ ├── tenantPackage
│ │ ├── data.ts
│ │ ├── index.vue
│ │ └── modules
│ │ │ └── form.vue
│ │ └── user
│ │ ├── data.ts
│ │ ├── index.vue
│ │ └── modules
│ │ ├── assign-role-form.vue
│ │ ├── dept-tree.vue
│ │ ├── form.vue
│ │ ├── import-form.vue
│ │ └── reset-password-form.vue
│ ├── tailwind.config.mjs
│ ├── tsconfig.json
│ ├── tsconfig.node.json
│ └── 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-alert.md
│ │ │ ├── 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-alert
│ │ │ ├── alert
│ │ │ │ └── index.vue
│ │ │ ├── confirm
│ │ │ │ └── index.vue
│ │ │ └── prompt
│ │ │ │ └── index.vue
│ │ ├── 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
├── lefthook.yml
├── 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
│ │ │ │ │ ├── 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
│ │ │ │ │ ├── time.ts
│ │ │ │ │ ├── to.ts
│ │ │ │ │ ├── tree.ts
│ │ │ │ │ ├── unique.ts
│ │ │ │ │ ├── update-css-variables.ts
│ │ │ │ │ ├── util.ts
│ │ │ │ │ ├── uuid.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-scroll.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
│ │ │ ├── alert
│ │ │ │ ├── AlertBuilder.ts
│ │ │ │ ├── alert.ts
│ │ │ │ ├── alert.vue
│ │ │ │ └── index.ts
│ │ │ ├── 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-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
│ │ │ │ ├── alert-dialog
│ │ │ │ ├── AlertDialog.vue
│ │ │ │ ├── AlertDialogAction.vue
│ │ │ │ ├── AlertDialogCancel.vue
│ │ │ │ ├── AlertDialogContent.vue
│ │ │ │ ├── AlertDialogDescription.vue
│ │ │ │ ├── AlertDialogOverlay.vue
│ │ │ │ ├── AlertDialogTitle.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
│ │ │ │ └── types.ts
│ │ ├── 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
│ │ │ │ │ └── verification
│ │ │ │ │ │ ├── index.vue
│ │ │ │ │ │ ├── typing.ts
│ │ │ │ │ │ ├── utils
│ │ │ │ │ │ ├── ase.ts
│ │ │ │ │ │ └── util.ts
│ │ │ │ │ │ ├── verify-points.vue
│ │ │ │ │ │ ├── verify-slide.vue
│ │ │ │ │ │ └── verify.css
│ │ │ │ ├── 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-viewer
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── index.vue
│ │ │ │ │ ├── style.scss
│ │ │ │ │ └── types.ts
│ │ │ │ ├── loading
│ │ │ │ │ ├── directive.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── loading.vue
│ │ │ │ │ └── spinner.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
│ │ │ │ ├── doc-link.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
│ │ │ │ │ ├── checkbox-item.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
│ │ │ └── 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
│ │ │ ├── bpm-approve.svg
│ │ │ ├── bpm-cancel.svg
│ │ │ ├── bpm-reject.svg
│ │ │ ├── bpm-running.svg
│ │ │ ├── cake.svg
│ │ │ ├── card.svg
│ │ │ └── download.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
│ │ │ ├── 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__
│ │ │ ├── find-menu-by-path.test.ts
│ │ │ ├── generate-menus.test.ts
│ │ │ ├── generate-routes-frontend.test.ts
│ │ │ └── merge-route-modules.test.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
│ │ ├── reset-routes.ts
│ │ └── unmount-global-loading.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
│ │ │ ├── params.ts
│ │ │ ├── status.ts
│ │ │ ├── table.ts
│ │ │ └── upload.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
│ │ │ ├── request-params-serializer
│ │ │ │ └── index.vue
│ │ │ ├── tabs
│ │ │ │ ├── index.vue
│ │ │ │ └── tab-detail.vue
│ │ │ ├── vue-query
│ │ │ │ ├── concurrency-caching.vue
│ │ │ │ ├── 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
├── 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
├── 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 |
--------------------------------------------------------------------------------
/.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 |
--------------------------------------------------------------------------------
/.gitee/ISSUE_TEMPLATE/config.yml:
--------------------------------------------------------------------------------
1 | blank_issues_enabled: false
2 | contact_links:
3 | - name: 项目开发文档
4 | url: https://doc.iocoder.cn/
5 | about: 提供项目启动、开发的相关文档
6 |
--------------------------------------------------------------------------------
/.github/dependabot.yml:
--------------------------------------------------------------------------------
1 | version: 2
2 | updates:
3 | - package-ecosystem: npm
4 | directory: '/'
5 | schedule:
6 | interval: daily
7 | groups:
8 | non-breaking-changes:
9 | update-types: [minor, patch]
10 |
11 | - package-ecosystem: github-actions
12 | directory: '/'
13 | schedule:
14 | interval: weekly
15 | groups:
16 | non-breaking-changes:
17 | update-types: [minor, patch]
18 |
--------------------------------------------------------------------------------
/.github/semantic.yml:
--------------------------------------------------------------------------------
1 | titleAndCommits: true
2 | types:
3 | - feat
4 | - fix
5 | - docs
6 | - chore
7 | - style
8 | - refactor
9 | - perf
10 | - test
11 | - build
12 | - ci
13 | - revert
14 |
--------------------------------------------------------------------------------
/.gitpod.yml:
--------------------------------------------------------------------------------
1 | ports:
2 | - port: 5555
3 | onOpen: open-preview
4 | tasks:
5 | - init: npm i -g corepack && pnpm install
6 | command: pnpm run dev:play
7 |
--------------------------------------------------------------------------------
/.image/common/ai-feature.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vben/5e090fc838d3081118d23b3446a8cab89f214fcb/.image/common/ai-feature.png
--------------------------------------------------------------------------------
/.image/common/ai-preview.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vben/5e090fc838d3081118d23b3446a8cab89f214fcb/.image/common/ai-preview.gif
--------------------------------------------------------------------------------
/.image/common/bpm-feature.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vben/5e090fc838d3081118d23b3446a8cab89f214fcb/.image/common/bpm-feature.png
--------------------------------------------------------------------------------
/.image/common/crm-feature.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vben/5e090fc838d3081118d23b3446a8cab89f214fcb/.image/common/crm-feature.png
--------------------------------------------------------------------------------
/.image/common/erp-feature.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vben/5e090fc838d3081118d23b3446a8cab89f214fcb/.image/common/erp-feature.png
--------------------------------------------------------------------------------
/.image/common/infra-feature.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vben/5e090fc838d3081118d23b3446a8cab89f214fcb/.image/common/infra-feature.png
--------------------------------------------------------------------------------
/.image/common/mall-feature.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vben/5e090fc838d3081118d23b3446a8cab89f214fcb/.image/common/mall-feature.png
--------------------------------------------------------------------------------
/.image/common/mall-preview.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vben/5e090fc838d3081118d23b3446a8cab89f214fcb/.image/common/mall-preview.png
--------------------------------------------------------------------------------
/.image/common/project-vs.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vben/5e090fc838d3081118d23b3446a8cab89f214fcb/.image/common/project-vs.png
--------------------------------------------------------------------------------
/.image/common/ruoyi-vue-pro-architecture.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vben/5e090fc838d3081118d23b3446a8cab89f214fcb/.image/common/ruoyi-vue-pro-architecture.png
--------------------------------------------------------------------------------
/.image/common/ruoyi-vue-pro-biz.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vben/5e090fc838d3081118d23b3446a8cab89f214fcb/.image/common/ruoyi-vue-pro-biz.png
--------------------------------------------------------------------------------
/.image/common/system-feature.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vben/5e090fc838d3081118d23b3446a8cab89f214fcb/.image/common/system-feature.png
--------------------------------------------------------------------------------
/.image/common/yudao-cloud-architecture.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vben/5e090fc838d3081118d23b3446a8cab89f214fcb/.image/common/yudao-cloud-architecture.png
--------------------------------------------------------------------------------
/.image/common/yudao-roadmap.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vben/5e090fc838d3081118d23b3446a8cab89f214fcb/.image/common/yudao-roadmap.png
--------------------------------------------------------------------------------
/.image/demo/vben.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vben/5e090fc838d3081118d23b3446a8cab89f214fcb/.image/demo/vben.png
--------------------------------------------------------------------------------
/.image/wx-xingyu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vben/5e090fc838d3081118d23b3446a8cab89f214fcb/.image/wx-xingyu.png
--------------------------------------------------------------------------------
/.image/工作流设计器-bpmn.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vben/5e090fc838d3081118d23b3446a8cab89f214fcb/.image/工作流设计器-bpmn.jpg
--------------------------------------------------------------------------------
/.image/工作流设计器-simple.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vben/5e090fc838d3081118d23b3446a8cab89f214fcb/.image/工作流设计器-simple.jpg
--------------------------------------------------------------------------------
/.node-version:
--------------------------------------------------------------------------------
1 | 22.1.0
2 |
--------------------------------------------------------------------------------
/.npmrc:
--------------------------------------------------------------------------------
1 | registry = "https://registry.npmmirror.com"
2 | public-hoist-pattern[]=lefthook
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 |
--------------------------------------------------------------------------------
/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/upload.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({
10 | url: 'https://unpkg.com/@vbenjs/static-source@0.1.7/source/logo-v1.webp',
11 | });
12 | // return useResponseError("test")
13 | });
14 |
--------------------------------------------------------------------------------
/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/routes/[...].ts:
--------------------------------------------------------------------------------
1 | export default defineEventHandler(() => {
2 | return `
3 |
Hello Vben Admin
4 | Mock service is starting
5 |
12 | `;
13 | });
14 |
--------------------------------------------------------------------------------
/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.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/.env.development:
--------------------------------------------------------------------------------
1 | # 端口号
2 | VITE_PORT=5666
3 |
4 | VITE_BASE=/
5 |
6 | # 请求路径
7 | VITE_BASE_URL=http://127.0.0.1:48080
8 | # 接口地址
9 | VITE_GLOB_API_URL=/admin-api
10 | # 文件上传类型:server - 后端上传, client - 前端直连上传,仅支持S3服务
11 | VITE_UPLOAD_TYPE=server
12 | # 是否打开 devtools,true 为打开,false 为关闭
13 | VITE_DEVTOOLS=false
14 |
15 | # 是否注入全局loading
16 | VITE_INJECT_APP_LOADING=true
17 |
18 | # 默认登录用户名
19 | VITE_APP_DEFAULT_USERNAME=admin
20 | # 默认登录密码
21 | VITE_APP_DEFAULT_PASSWORD=admin123
22 |
--------------------------------------------------------------------------------
/apps/web-antd/.env.production:
--------------------------------------------------------------------------------
1 | VITE_BASE=/
2 |
3 | # 请求路径
4 | VITE_BASE_URL=http://127.0.0.1:48080
5 | # 接口地址
6 | VITE_GLOB_API_URL=http://127.0.0.1:48080/admin-api
7 | # 文件上传类型:server - 后端上传, client - 前端直连上传,仅支持S3服务
8 | VITE_UPLOAD_TYPE=server
9 |
10 | # 是否开启压缩,可以设置为 none, brotli, gzip
11 | VITE_COMPRESS=none
12 |
13 | # 是否开启 PWA
14 | VITE_PWA=false
15 |
16 | # vue-router 的模式
17 | VITE_ROUTER_HISTORY=hash
18 |
19 | # 是否注入全局loading
20 | VITE_INJECT_APP_LOADING=true
21 |
22 | # 打包后是否生成dist.zip
23 | VITE_ARCHIVER=true
24 |
--------------------------------------------------------------------------------
/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/yudaocode/yudao-ui-admin-vben/5e090fc838d3081118d23b3446a8cab89f214fcb/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/wx-xingyu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vben/5e090fc838d3081118d23b3446a8cab89f214fcb/apps/web-antd/public/wx-xingyu.png
--------------------------------------------------------------------------------
/apps/web-antd/src/api/core/index.ts:
--------------------------------------------------------------------------------
1 | export * from './auth';
2 |
--------------------------------------------------------------------------------
/apps/web-antd/src/api/index.ts:
--------------------------------------------------------------------------------
1 | export * from './core';
2 |
--------------------------------------------------------------------------------
/apps/web-antd/src/api/pay/notify/index.ts:
--------------------------------------------------------------------------------
1 | import type { PageParam } from '@vben/request';
2 |
3 | import { requestClient } from '#/api/request';
4 |
5 | /** 获得支付通知明细 */
6 | export function getNotifyTaskDetail(id: number) {
7 | return requestClient.get(`/pay/notify/get-detail?id=${id}`);
8 | }
9 |
10 | /** 获得支付通知分页 */
11 | export function getNotifyTaskPage(params: PageParam) {
12 | return requestClient.get('/pay/notify/page', {
13 | params,
14 | });
15 | }
16 |
--------------------------------------------------------------------------------
/apps/web-antd/src/components/content-wrap/index.ts:
--------------------------------------------------------------------------------
1 | export { default as ContentWrap } from './content-wrap.vue';
2 |
--------------------------------------------------------------------------------
/apps/web-antd/src/components/cropper/index.ts:
--------------------------------------------------------------------------------
1 | export { default as CropperAvatar } from './cropper-avatar.vue';
2 | export { default as CropperImage } from './cropper.vue';
3 | export type { CropperType } from './typing';
4 |
--------------------------------------------------------------------------------
/apps/web-antd/src/components/dept-select-modal/index.ts:
--------------------------------------------------------------------------------
1 | export { default as DeptSelectModal } from './dept-select-modal.vue';
2 |
--------------------------------------------------------------------------------
/apps/web-antd/src/components/description/index.ts:
--------------------------------------------------------------------------------
1 | export { default as Description } from './description.vue';
2 | export * from './typing';
3 | export { useDescription } from './use-description';
4 |
--------------------------------------------------------------------------------
/apps/web-antd/src/components/dict-tag/index.ts:
--------------------------------------------------------------------------------
1 | export { default as DictTag } from './dict-tag.vue';
2 |
--------------------------------------------------------------------------------
/apps/web-antd/src/components/doc-alert/index.ts:
--------------------------------------------------------------------------------
1 | export { default as DocAlert } from './doc-alert.vue';
2 |
--------------------------------------------------------------------------------
/apps/web-antd/src/components/form-create/index.ts:
--------------------------------------------------------------------------------
1 | export { useApiSelect } from './components/use-api-select';
2 |
3 | export { useFormCreateDesigner } from './helpers';
4 |
--------------------------------------------------------------------------------
/apps/web-antd/src/components/form-create/rules/index.ts:
--------------------------------------------------------------------------------
1 | export { useDictSelectRule } from './use-dict-select';
2 | export { useEditorRule } from './use-editor-rule';
3 | export { useSelectRule } from './use-select-rule';
4 | export { useUploadFileRule } from './use-upload-file-rule';
5 | export { useUploadImageRule } from './use-upload-image-rule';
6 | export { useUploadImagesRule } from './use-upload-images-rule';
7 |
--------------------------------------------------------------------------------
/apps/web-antd/src/components/iframe/index.ts:
--------------------------------------------------------------------------------
1 | export { default as IFrame } from './iframe.vue';
2 |
--------------------------------------------------------------------------------
/apps/web-antd/src/components/table-action/icons.ts:
--------------------------------------------------------------------------------
1 | export const ACTION_ICON = {
2 | DOWNLOAD: 'lucide:download',
3 | UPLOAD: 'lucide:upload',
4 | ADD: 'lucide:plus',
5 | EDIT: 'lucide:edit',
6 | DELETE: 'lucide:trash',
7 | REFRESH: 'lucide:refresh-cw',
8 | SEARCH: 'lucide:search',
9 | FILTER: 'lucide:filter',
10 | MORE: 'lucide:ellipsis-vertical',
11 | VIEW: 'lucide:eye',
12 | COPY: 'lucide:copy',
13 | };
14 |
--------------------------------------------------------------------------------
/apps/web-antd/src/components/table-action/index.ts:
--------------------------------------------------------------------------------
1 | export * from './icons';
2 |
3 | export { default as TableAction } from './table-action.vue';
4 | export * from './typing';
5 |
--------------------------------------------------------------------------------
/apps/web-antd/src/components/table-toolbar/index.ts:
--------------------------------------------------------------------------------
1 | export { default as TableToolbar } from './table-toolbar.vue';
2 |
--------------------------------------------------------------------------------
/apps/web-antd/src/components/tinymce/index.ts:
--------------------------------------------------------------------------------
1 | export { default as Tinymce } from './editor.vue';
2 |
--------------------------------------------------------------------------------
/apps/web-antd/src/components/upload/index.ts:
--------------------------------------------------------------------------------
1 | export { default as FileUpload } from './file-upload.vue';
2 | export { default as ImageUpload } from './image-upload.vue';
3 |
--------------------------------------------------------------------------------
/apps/web-antd/src/components/upload/typing.ts:
--------------------------------------------------------------------------------
1 | export enum UploadResultStatus {
2 | DONE = 'done',
3 | ERROR = 'error',
4 | SUCCESS = 'success',
5 | UPLOADING = 'uploading',
6 | }
7 |
8 | export type UploadListType = 'picture' | 'picture-card' | 'text';
9 |
--------------------------------------------------------------------------------
/apps/web-antd/src/components/user-select-modal/index.ts:
--------------------------------------------------------------------------------
1 | export { default as UserSelectModal } from './user-select-modal.vue';
2 |
--------------------------------------------------------------------------------
/apps/web-antd/src/hooks/index.ts:
--------------------------------------------------------------------------------
1 | export * from './use-table-toolbar';
2 |
--------------------------------------------------------------------------------
/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/utils.json:
--------------------------------------------------------------------------------
1 | {
2 | "rangePicker": {
3 | "today": "Today",
4 | "last7Days": "Last 7 Days",
5 | "last30Days": "Last 30 Days",
6 | "yesterday": "Yesterday",
7 | "thisWeek": "This Week",
8 | "thisMonth": "This Month",
9 | "lastWeek": "Last Week",
10 | "lastMonth": "Last Month",
11 | "beginTime": "Begin Time",
12 | "endTime": "End Time"
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/apps/web-antd/src/locales/langs/zh-CN/utils.json:
--------------------------------------------------------------------------------
1 | {
2 | "rangePicker": {
3 | "today": "今天",
4 | "last7Days": "最近 7 天",
5 | "last30Days": "最近 30 天",
6 | "yesterday": "昨天",
7 | "thisWeek": "本周",
8 | "thisMonth": "本月",
9 | "lastWeek": "上周",
10 | "lastMonth": "上月",
11 | "beginTime": "开始时间",
12 | "endTime": "结束时间"
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/apps/web-antd/src/router/routes/modules/system.ts:
--------------------------------------------------------------------------------
1 | import type { RouteRecordRaw } from 'vue-router';
2 |
3 | const routes: RouteRecordRaw[] = [
4 | {
5 | path: '/system/notify-message',
6 | component: () => import('#/views/system/notify/my/index.vue'),
7 | name: 'MyNotifyMessage',
8 | meta: {
9 | title: '我的站内信',
10 | icon: 'ant-design:message-filled',
11 | hideInMenu: true,
12 | },
13 | },
14 | ];
15 |
16 | export default routes;
17 |
--------------------------------------------------------------------------------
/apps/web-antd/src/store/index.ts:
--------------------------------------------------------------------------------
1 | export * from './auth';
2 | export * from './dict';
3 |
--------------------------------------------------------------------------------
/apps/web-antd/src/utils/index.ts:
--------------------------------------------------------------------------------
1 | export * from './constants';
2 | export * from './dict';
3 | export * from './formatTime';
4 | export * from './formCreate';
5 | export * from './rangePickerProps';
6 | export * from './routerHelper';
7 | export * from './validator';
8 |
--------------------------------------------------------------------------------
/apps/web-antd/src/utils/validator.ts:
--------------------------------------------------------------------------------
1 | // 参数校验,对标 Hutool 的 Validator 工具类
2 |
3 | /** 手机号正则表达式(中国) */
4 | const MOBILE_REGEX = /(?:0|86|\+86)?1[3-9]\d{9}/;
5 |
6 | /**
7 | * 验证是否为手机号码(中国)
8 | *
9 | * @param value 值
10 | * @returns 是否为手机号码(中国)
11 | */
12 | export function isMobile(value?: null | string): boolean {
13 | if (!value) {
14 | return false;
15 | }
16 | return MOBILE_REGEX.test(value);
17 | }
18 |
--------------------------------------------------------------------------------
/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/bpm/oa/leave/detail.vue:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
7 |
8 |
请假详情
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/apps/web-antd/src/views/crm/business/modules/detail.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
7 |
8 |
--------------------------------------------------------------------------------
/apps/web-antd/src/views/crm/contact/modules/detail.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
7 |
8 |
--------------------------------------------------------------------------------
/apps/web-antd/src/views/crm/contract/modules/detail.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
7 |
8 |
--------------------------------------------------------------------------------
/apps/web-antd/src/views/crm/customer/modules/detail.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
7 |
8 |
--------------------------------------------------------------------------------
/apps/web-antd/src/views/crm/permission/components/PermissionForm.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
7 |
8 |
--------------------------------------------------------------------------------
/apps/web-antd/src/views/crm/permission/components/PermissionList.vue:
--------------------------------------------------------------------------------
1 |
10 |
11 |
12 |
15 |
16 |
--------------------------------------------------------------------------------
/apps/web-antd/src/views/crm/permission/components/TransferForm.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
7 |
8 |
--------------------------------------------------------------------------------
/apps/web-antd/src/views/crm/product/modules/detail.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
7 |
8 |
--------------------------------------------------------------------------------
/apps/web-antd/src/views/crm/receivable/modules/detail.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
7 |
8 |
--------------------------------------------------------------------------------
/apps/web-antd/src/views/crm/receivable/plan/modules/detail.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
7 |
8 |
--------------------------------------------------------------------------------
/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"]
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-ele/.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-ele/.env.development:
--------------------------------------------------------------------------------
1 | # 端口号
2 | VITE_PORT=5777
3 |
4 | VITE_BASE=/
5 |
6 | # 请求路径
7 | VITE_BASE_URL=http://127.0.0.1:48080
8 | # 接口地址
9 | VITE_GLOB_API_URL=/admin-api
10 | # 文件上传类型:server - 后端上传, client - 前端直连上传,仅支持S3服务
11 | VITE_UPLOAD_TYPE=server
12 | # 是否打开 devtools,true 为打开,false 为关闭
13 | VITE_DEVTOOLS=false
14 |
15 | # 是否注入全局loading
16 | VITE_INJECT_APP_LOADING=true
17 |
18 | # 默认登录用户名
19 | VITE_APP_DEFAULT_USERNAME=admin
20 | # 默认登录密码
21 | VITE_APP_DEFAULT_PASSWORD=admin123
22 |
--------------------------------------------------------------------------------
/apps/web-ele/.env.production:
--------------------------------------------------------------------------------
1 | VITE_BASE=/
2 |
3 | # 请求路径
4 | VITE_BASE_URL=http://127.0.0.1:48080
5 | # 接口地址
6 | VITE_GLOB_API_URL=http://127.0.0.1:48080/admin-api
7 | # 文件上传类型:server - 后端上传, client - 前端直连上传,仅支持S3服务
8 | VITE_UPLOAD_TYPE=server
9 |
10 | # 是否开启压缩,可以设置为 none, brotli, gzip
11 | VITE_COMPRESS=none
12 |
13 | # 是否开启 PWA
14 | VITE_PWA=false
15 |
16 | # vue-router 的模式
17 | VITE_ROUTER_HISTORY=hash
18 |
19 | # 是否注入全局loading
20 | VITE_INJECT_APP_LOADING=true
21 |
22 | # 打包后是否生成dist.zip
23 | VITE_ARCHIVER=true
24 |
--------------------------------------------------------------------------------
/apps/web-ele/postcss.config.mjs:
--------------------------------------------------------------------------------
1 | export { default } from '@vben/tailwind-config/postcss';
2 |
--------------------------------------------------------------------------------
/apps/web-ele/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vben/5e090fc838d3081118d23b3446a8cab89f214fcb/apps/web-ele/public/favicon.ico
--------------------------------------------------------------------------------
/apps/web-ele/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-ele/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-ele/public/wx-xingyu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vben/5e090fc838d3081118d23b3446a8cab89f214fcb/apps/web-ele/public/wx-xingyu.png
--------------------------------------------------------------------------------
/apps/web-ele/src/api/core/index.ts:
--------------------------------------------------------------------------------
1 | export * from './auth';
2 |
--------------------------------------------------------------------------------
/apps/web-ele/src/api/index.ts:
--------------------------------------------------------------------------------
1 | export * from './core';
2 |
--------------------------------------------------------------------------------
/apps/web-ele/src/app.vue:
--------------------------------------------------------------------------------
1 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/apps/web-ele/src/components/cropper/index.ts:
--------------------------------------------------------------------------------
1 | export { default as CropperAvatar } from './cropper-avatar.vue';
2 | export { default as CropperImage } from './cropper.vue';
3 | export type { CropperType } from './typing';
4 |
--------------------------------------------------------------------------------
/apps/web-ele/src/components/dict-tag/index.ts:
--------------------------------------------------------------------------------
1 | export { default as DictTag } from './dict-tag.vue';
2 |
--------------------------------------------------------------------------------
/apps/web-ele/src/components/doc-alert/index.ts:
--------------------------------------------------------------------------------
1 | export { default as DocAlert } from './doc-alert.vue';
2 |
--------------------------------------------------------------------------------
/apps/web-ele/src/components/form-create/index.ts:
--------------------------------------------------------------------------------
1 | export { useApiSelect } from './components/use-api-select';
2 |
3 | export { useFormCreateDesigner } from './helpers';
4 |
--------------------------------------------------------------------------------
/apps/web-ele/src/components/form-create/rules/index.ts:
--------------------------------------------------------------------------------
1 | export { useDictSelectRule } from './use-dict-select';
2 | export { useEditorRule } from './use-editor-rule';
3 | export { useSelectRule } from './use-select-rule';
4 | export { useUploadFileRule } from './use-upload-file-rule';
5 | export { useUploadImageRule } from './use-upload-image-rule';
6 | export { useUploadImagesRule } from './use-upload-images-rule';
7 |
--------------------------------------------------------------------------------
/apps/web-ele/src/components/iframe/index.ts:
--------------------------------------------------------------------------------
1 | export { default as IFrame } from './iframe.vue';
2 |
--------------------------------------------------------------------------------
/apps/web-ele/src/components/tinymce/index.ts:
--------------------------------------------------------------------------------
1 | export { default as Tinymce } from './editor.vue';
2 |
--------------------------------------------------------------------------------
/apps/web-ele/src/components/upload/index.ts:
--------------------------------------------------------------------------------
1 | export { default as FileUpload } from './file-upload.vue';
2 | export { default as ImageUpload } from './image-upload.vue';
3 |
--------------------------------------------------------------------------------
/apps/web-ele/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-ele/src/locales/README.md:
--------------------------------------------------------------------------------
1 | # locale
2 |
3 | 每个app使用的国际化可能不同,这里用于扩展国际化的功能,例如扩展 dayjs、antd组件库的多语言切换,以及app本身的国际化文件。
4 |
--------------------------------------------------------------------------------
/apps/web-ele/src/locales/langs/en-US/demos.json:
--------------------------------------------------------------------------------
1 | {
2 | "title": "Demos",
3 | "elementPlus": "Element Plus",
4 | "form": "Form",
5 | "vben": {
6 | "title": "Project",
7 | "about": "About",
8 | "document": "Document",
9 | "antdv": "Ant Design Vue Version",
10 | "naive-ui": "Naive UI Version",
11 | "element-plus": "Element Plus Version"
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/apps/web-ele/src/locales/langs/en-US/utils.json:
--------------------------------------------------------------------------------
1 | {
2 | "rangePicker": {
3 | "today": "Today",
4 | "last7Days": "Last 7 Days",
5 | "last30Days": "Last 30 Days",
6 | "yesterday": "Yesterday",
7 | "thisWeek": "This Week",
8 | "thisMonth": "This Month",
9 | "lastWeek": "Last Week",
10 | "lastMonth": "Last Month",
11 | "beginTime": "Begin Time",
12 | "endTime": "End Time"
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/apps/web-ele/src/locales/langs/zh-CN/demos.json:
--------------------------------------------------------------------------------
1 | {
2 | "title": "演示",
3 | "elementPlus": "Element Plus",
4 | "form": "表单演示",
5 | "vben": {
6 | "title": "项目",
7 | "about": "关于",
8 | "document": "文档",
9 | "antdv": "Ant Design Vue 版本",
10 | "naive-ui": "Naive UI 版本",
11 | "element-plus": "Element Plus 版本"
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/apps/web-ele/src/locales/langs/zh-CN/utils.json:
--------------------------------------------------------------------------------
1 | {
2 | "rangePicker": {
3 | "today": "今天",
4 | "last7Days": "最近 7 天",
5 | "last30Days": "最近 30 天",
6 | "yesterday": "昨天",
7 | "thisWeek": "本周",
8 | "thisMonth": "本月",
9 | "lastWeek": "上周",
10 | "lastMonth": "上月",
11 | "beginTime": "开始时间",
12 | "endTime": "结束时间"
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/apps/web-ele/src/router/routes/modules/system.ts:
--------------------------------------------------------------------------------
1 | import type { RouteRecordRaw } from 'vue-router';
2 |
3 | const routes: RouteRecordRaw[] = [
4 | {
5 | path: '/system/notify-message',
6 | component: () => import('#/views/system/notify/my/index.vue'),
7 | name: 'MyNotifyMessage',
8 | meta: {
9 | title: '我的站内信',
10 | icon: 'ant-design:message-filled',
11 | hideInMenu: true,
12 | },
13 | },
14 | ];
15 |
16 | export default routes;
17 |
--------------------------------------------------------------------------------
/apps/web-ele/src/store/index.ts:
--------------------------------------------------------------------------------
1 | export * from './auth';
2 | export * from './dict';
3 |
--------------------------------------------------------------------------------
/apps/web-ele/src/utils/index.ts:
--------------------------------------------------------------------------------
1 | export * from './constants';
2 | export * from './dict';
3 | export * from './formatTime';
4 | export * from './formCreate';
5 | export * from './rangePickerProps';
6 | export * from './routerHelper';
7 | export * from './validator';
8 |
--------------------------------------------------------------------------------
/apps/web-ele/src/utils/routerHelper.ts:
--------------------------------------------------------------------------------
1 | import { defineAsyncComponent } from 'vue';
2 |
3 | const modules = import.meta.glob('../views/**/*.{vue,tsx}');
4 | /**
5 | * 注册一个异步组件
6 | * @param componentPath 例:/bpm/oa/leave/detail
7 | */
8 | export const registerComponent = (componentPath: string) => {
9 | for (const item in modules) {
10 | if (item.includes(componentPath)) {
11 | // 使用异步组件的方式来动态加载组件
12 | return defineAsyncComponent(modules[item] as any);
13 | }
14 | }
15 | };
16 |
--------------------------------------------------------------------------------
/apps/web-ele/src/utils/validator.ts:
--------------------------------------------------------------------------------
1 | // 参数校验,对标 Hutool 的 Validator 工具类
2 |
3 | /** 手机号正则表达式(中国) */
4 | const MOBILE_REGEX = /(?:0|86|\+86)?1[3-9]\d{9}/;
5 |
6 | /**
7 | * 验证是否为手机号码(中国)
8 | *
9 | * @param value 值
10 | * @returns 是否为手机号码(中国)
11 | */
12 | export function isMobile(value?: null | string): boolean {
13 | if (!value) {
14 | return false;
15 | }
16 | return MOBILE_REGEX.test(value);
17 | }
18 |
--------------------------------------------------------------------------------
/apps/web-ele/src/views/_core/README.md:
--------------------------------------------------------------------------------
1 | # \_core
2 |
3 | 此目录包含应用程序正常运行所需的基本视图。这些视图是应用程序布局中使用的视图。
4 |
--------------------------------------------------------------------------------
/apps/web-ele/src/views/_core/about/index.vue:
--------------------------------------------------------------------------------
1 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/apps/web-ele/src/views/_core/authentication/qrcode-login.vue:
--------------------------------------------------------------------------------
1 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/apps/web-ele/src/views/_core/fallback/coming-soon.vue:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/apps/web-ele/src/views/_core/fallback/forbidden.vue:
--------------------------------------------------------------------------------
1 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/apps/web-ele/src/views/_core/fallback/internal-error.vue:
--------------------------------------------------------------------------------
1 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/apps/web-ele/src/views/_core/fallback/not-found.vue:
--------------------------------------------------------------------------------
1 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/apps/web-ele/src/views/_core/fallback/offline.vue:
--------------------------------------------------------------------------------
1 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/apps/web-ele/tailwind.config.mjs:
--------------------------------------------------------------------------------
1 | export { default } from '@vben/tailwind-config';
2 |
--------------------------------------------------------------------------------
/apps/web-ele/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 |
--------------------------------------------------------------------------------
/apps/web-ele/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-naive/.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-naive/.env.development:
--------------------------------------------------------------------------------
1 | # 端口号
2 | VITE_PORT=5888
3 |
4 | VITE_BASE=/
5 |
6 | # 请求路径
7 | VITE_BASE_URL=http://127.0.0.1:48080
8 | # 接口地址
9 | VITE_GLOB_API_URL=/admin-api
10 | # 文件上传类型:server - 后端上传, client - 前端直连上传,仅支持S3服务
11 | VITE_UPLOAD_TYPE=server
12 | # 是否打开 devtools,true 为打开,false 为关闭
13 | VITE_DEVTOOLS=false
14 |
15 | # 是否注入全局loading
16 | VITE_INJECT_APP_LOADING=true
17 |
18 | # 默认登录用户名
19 | VITE_APP_DEFAULT_USERNAME=admin
20 | # 默认登录密码
21 | VITE_APP_DEFAULT_PASSWORD=admin123
22 |
--------------------------------------------------------------------------------
/apps/web-naive/.env.production:
--------------------------------------------------------------------------------
1 | VITE_BASE=/
2 |
3 | # 请求路径
4 | VITE_BASE_URL=http://127.0.0.1:48080
5 | # 接口地址
6 | VITE_GLOB_API_URL=http://127.0.0.1:48080/admin-api
7 | # 文件上传类型:server - 后端上传, client - 前端直连上传,仅支持S3服务
8 | VITE_UPLOAD_TYPE=server
9 |
10 | # 是否开启压缩,可以设置为 none, brotli, gzip
11 | VITE_COMPRESS=none
12 |
13 | # 是否开启 PWA
14 | VITE_PWA=false
15 |
16 | # vue-router 的模式
17 | VITE_ROUTER_HISTORY=hash
18 |
19 | # 是否注入全局loading
20 | VITE_INJECT_APP_LOADING=true
21 |
22 | # 打包后是否生成dist.zip
23 | VITE_ARCHIVER=true
24 |
--------------------------------------------------------------------------------
/apps/web-naive/postcss.config.mjs:
--------------------------------------------------------------------------------
1 | export { default } from '@vben/tailwind-config/postcss';
2 |
--------------------------------------------------------------------------------
/apps/web-naive/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vben/5e090fc838d3081118d23b3446a8cab89f214fcb/apps/web-naive/public/favicon.ico
--------------------------------------------------------------------------------
/apps/web-naive/src/api/core/index.ts:
--------------------------------------------------------------------------------
1 | export * from './auth';
2 |
--------------------------------------------------------------------------------
/apps/web-naive/src/api/index.ts:
--------------------------------------------------------------------------------
1 | export * from './core';
2 |
--------------------------------------------------------------------------------
/apps/web-naive/src/components/cropper/index.ts:
--------------------------------------------------------------------------------
1 | export { default as CropperAvatar } from './cropper-avatar.vue';
2 | export { default as CropperImage } from './cropper.vue';
3 | export type { CropperType } from './typing';
4 |
--------------------------------------------------------------------------------
/apps/web-naive/src/components/dict-tag/index.ts:
--------------------------------------------------------------------------------
1 | export { default as DictTag } from './dict-tag.vue';
2 |
--------------------------------------------------------------------------------
/apps/web-naive/src/components/doc-alert/index.ts:
--------------------------------------------------------------------------------
1 | export { default as DocAlert } from './doc-alert.vue';
2 |
--------------------------------------------------------------------------------
/apps/web-naive/src/components/iframe/index.ts:
--------------------------------------------------------------------------------
1 | export { default as IFrame } from './iframe.vue';
2 |
--------------------------------------------------------------------------------
/apps/web-naive/src/components/table-toolbar/index.ts:
--------------------------------------------------------------------------------
1 | export { default as TableToolbar } from './table-toolbar.vue';
2 |
--------------------------------------------------------------------------------
/apps/web-naive/src/components/upload/index.ts:
--------------------------------------------------------------------------------
1 | export { default as FileUpload } from './file-upload.vue';
2 | export { default as ImageUpload } from './image-upload.vue';
3 |
--------------------------------------------------------------------------------
/apps/web-naive/src/components/upload/typing.ts:
--------------------------------------------------------------------------------
1 | export enum UploadResultStatus {
2 | DONE = 'done',
3 | ERROR = 'error',
4 | SUCCESS = 'success',
5 | UPLOADING = 'uploading',
6 | }
7 |
8 | export type UploadListType = 'picture' | 'picture-card' | 'text';
9 |
--------------------------------------------------------------------------------
/apps/web-naive/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-naive/src/locales/README.md:
--------------------------------------------------------------------------------
1 | # locale
2 |
3 | 每个app使用的国际化可能不同,这里用于扩展国际化的功能,例如扩展 dayjs、antd组件库的多语言切换,以及app本身的国际化文件。
4 |
--------------------------------------------------------------------------------
/apps/web-naive/src/locales/langs/en-US/utils.json:
--------------------------------------------------------------------------------
1 | {
2 | "rangePicker": {
3 | "today": "Today",
4 | "last7Days": "Last 7 Days",
5 | "last30Days": "Last 30 Days",
6 | "yesterday": "Yesterday",
7 | "thisWeek": "This Week",
8 | "thisMonth": "This Month",
9 | "lastWeek": "Last Week",
10 | "lastMonth": "Last Month",
11 | "beginTime": "Begin Time",
12 | "endTime": "End Time"
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/apps/web-naive/src/locales/langs/zh-CN/utils.json:
--------------------------------------------------------------------------------
1 | {
2 | "rangePicker": {
3 | "today": "今天",
4 | "last7Days": "最近 7 天",
5 | "last30Days": "最近 30 天",
6 | "yesterday": "昨天",
7 | "thisWeek": "本周",
8 | "thisMonth": "本月",
9 | "lastWeek": "上周",
10 | "lastMonth": "上月",
11 | "beginTime": "开始时间",
12 | "endTime": "结束时间"
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/apps/web-naive/src/router/routes/modules/system.ts:
--------------------------------------------------------------------------------
1 | import type { RouteRecordRaw } from 'vue-router';
2 |
3 | const routes: RouteRecordRaw[] = [
4 | {
5 | path: '/system/notify-message',
6 | component: () => import('#/views/system/notify/my/index.vue'),
7 | name: 'MyNotifyMessage',
8 | meta: {
9 | title: '我的站内信',
10 | icon: 'ant-design:message-filled',
11 | hideInMenu: true,
12 | },
13 | },
14 | ];
15 |
16 | export default routes;
17 |
--------------------------------------------------------------------------------
/apps/web-naive/src/store/index.ts:
--------------------------------------------------------------------------------
1 | export * from './auth';
2 | export * from './dict';
3 |
--------------------------------------------------------------------------------
/apps/web-naive/src/utils/index.ts:
--------------------------------------------------------------------------------
1 | export * from './constants';
2 | export * from './dict';
3 | export * from './formatTime';
4 | export * from './formCreate';
5 | export * from './rangePickerProps';
6 | export * from './routerHelper';
7 | export * from './validator';
8 |
--------------------------------------------------------------------------------
/apps/web-naive/src/utils/routerHelper.ts:
--------------------------------------------------------------------------------
1 | import { defineAsyncComponent } from 'vue';
2 |
3 | const modules = import.meta.glob('../views/**/*.{vue,tsx}');
4 | /**
5 | * 注册一个异步组件
6 | * @param componentPath 例:/bpm/oa/leave/detail
7 | */
8 | export const registerComponent = (componentPath: string) => {
9 | for (const item in modules) {
10 | if (item.includes(componentPath)) {
11 | // 使用异步组件的方式来动态加载组件
12 | return defineAsyncComponent(modules[item] as any);
13 | }
14 | }
15 | };
16 |
--------------------------------------------------------------------------------
/apps/web-naive/src/utils/validator.ts:
--------------------------------------------------------------------------------
1 | // 参数校验,对标 Hutool 的 Validator 工具类
2 |
3 | /** 手机号正则表达式(中国) */
4 | const MOBILE_REGEX = /(?:0|86|\+86)?1[3-9]\d{9}/;
5 |
6 | /**
7 | * 验证是否为手机号码(中国)
8 | *
9 | * @param value 值
10 | * @returns 是否为手机号码(中国)
11 | */
12 | export function isMobile(value?: null | string): boolean {
13 | if (!value) {
14 | return false;
15 | }
16 | return MOBILE_REGEX.test(value);
17 | }
18 |
--------------------------------------------------------------------------------
/apps/web-naive/src/views/_core/README.md:
--------------------------------------------------------------------------------
1 | # \_core
2 |
3 | 此目录包含应用程序正常运行所需的基本视图。这些视图是应用程序布局中使用的视图。
4 |
--------------------------------------------------------------------------------
/apps/web-naive/src/views/_core/about/index.vue:
--------------------------------------------------------------------------------
1 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/apps/web-naive/src/views/_core/authentication/qrcode-login.vue:
--------------------------------------------------------------------------------
1 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/apps/web-naive/src/views/_core/fallback/coming-soon.vue:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/apps/web-naive/src/views/_core/fallback/forbidden.vue:
--------------------------------------------------------------------------------
1 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/apps/web-naive/src/views/_core/fallback/internal-error.vue:
--------------------------------------------------------------------------------
1 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/apps/web-naive/src/views/_core/fallback/not-found.vue:
--------------------------------------------------------------------------------
1 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/apps/web-naive/src/views/_core/fallback/offline.vue:
--------------------------------------------------------------------------------
1 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/apps/web-naive/tailwind.config.mjs:
--------------------------------------------------------------------------------
1 | export { default } from '@vben/tailwind-config';
2 |
--------------------------------------------------------------------------------
/apps/web-naive/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 |
--------------------------------------------------------------------------------
/apps/web-naive/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 |
--------------------------------------------------------------------------------
/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/guide/in-depth/layout.md:
--------------------------------------------------------------------------------
1 | # 布局
2 |
--------------------------------------------------------------------------------
/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/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vben/5e090fc838d3081118d23b3446a8cab89f214fcb/docs/src/public/favicon.ico
--------------------------------------------------------------------------------
/docs/src/public/guide/devtools.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vben/5e090fc838d3081118d23b3446a8cab89f214fcb/docs/src/public/guide/devtools.png
--------------------------------------------------------------------------------
/docs/src/public/guide/loading.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vben/5e090fc838d3081118d23b3446a8cab89f214fcb/docs/src/public/guide/loading.png
--------------------------------------------------------------------------------
/docs/src/public/guide/locale.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vben/5e090fc838d3081118d23b3446a8cab89f214fcb/docs/src/public/guide/locale.png
--------------------------------------------------------------------------------
/docs/src/public/guide/login-expired.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vben/5e090fc838d3081118d23b3446a8cab89f214fcb/docs/src/public/guide/login-expired.png
--------------------------------------------------------------------------------
/docs/src/public/guide/login.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vben/5e090fc838d3081118d23b3446a8cab89f214fcb/docs/src/public/guide/login.png
--------------------------------------------------------------------------------
/docs/src/public/guide/preferences.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vben/5e090fc838d3081118d23b3446a8cab89f214fcb/docs/src/public/guide/preferences.png
--------------------------------------------------------------------------------
/docs/src/public/guide/qq.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vben/5e090fc838d3081118d23b3446a8cab89f214fcb/docs/src/public/guide/qq.png
--------------------------------------------------------------------------------
/docs/src/public/guide/qq_channel.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vben/5e090fc838d3081118d23b3446a8cab89f214fcb/docs/src/public/guide/qq_channel.png
--------------------------------------------------------------------------------
/docs/src/public/guide/report.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vben/5e090fc838d3081118d23b3446a8cab89f214fcb/docs/src/public/guide/report.png
--------------------------------------------------------------------------------
/docs/src/public/guide/test.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vben/5e090fc838d3081118d23b3446a8cab89f214fcb/docs/src/public/guide/test.png
--------------------------------------------------------------------------------
/docs/src/public/guide/update-notice.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yudaocode/yudao-ui-admin-vben/5e090fc838d3081118d23b3446a8cab89f214fcb/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/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/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json.schemastore.org/tsconfig",
3 | "extends": "@vben/tsconfig/node.json",
4 | "compilerOptions": {
5 | "moduleResolution": "bundler"
6 | },
7 | "include": ["src"],
8 | "exclude": ["node_modules"]
9 | }
10 |
--------------------------------------------------------------------------------
/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/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/create-icon.ts:
--------------------------------------------------------------------------------
1 | import { defineComponent, h } from 'vue';
2 |
3 | import { Icon } from '@iconify/vue';
4 |
5 | function createIconifyIcon(icon: string) {
6 | return defineComponent({
7 | name: `Icon-${icon}`,
8 | setup(props, { attrs }) {
9 | return () => h(Icon, { icon, ...props, ...attrs });
10 | },
11 | });
12 | }
13 |
14 | export { createIconifyIcon };
15 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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/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 './globals';
2 | export * from './vben';
3 |
--------------------------------------------------------------------------------
/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 interface TabDefinition extends RouteLocationNormalized {
4 | /**
5 | * 标签页的key
6 | */
7 | key?: string;
8 | }
9 |
--------------------------------------------------------------------------------
/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/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 FormField } from './form-field.vue';
2 | export { default as FormLabel } from './form-label.vue';
3 | export { default as Form } from './form.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/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/alert/index.ts:
--------------------------------------------------------------------------------
1 | export type {
2 | AlertProps,
3 | BeforeCloseScope,
4 | IconType,
5 | PromptProps,
6 | } from './alert';
7 | export { useAlertContext } from './alert';
8 | export { default as Alert } from './alert.vue';
9 | export {
10 | vbenAlert as alert,
11 | clearAllAlerts,
12 | vbenConfirm as confirm,
13 | vbenPrompt as prompt,
14 | } from './AlertBuilder';
15 |
--------------------------------------------------------------------------------
/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 './alert';
2 | export * from './drawer';
3 | export * from './modal';
4 |
--------------------------------------------------------------------------------
/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-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/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/alert-dialog/AlertDialogAction.vue:
--------------------------------------------------------------------------------
1 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/alert-dialog/AlertDialogCancel.vue:
--------------------------------------------------------------------------------
1 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/alert-dialog/AlertDialogOverlay.vue:
--------------------------------------------------------------------------------
1 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/packages/@core/ui-kit/shadcn-ui/src/ui/alert-dialog/index.ts:
--------------------------------------------------------------------------------
1 | export { default as AlertDialog } from './AlertDialog.vue';
2 | export { default as AlertDialogAction } from './AlertDialogAction.vue';
3 | export { default as AlertDialogCancel } from './AlertDialogCancel.vue';
4 | export { default as AlertDialogContent } from './AlertDialogContent.vue';
5 | export { default as AlertDialogDescription } from './AlertDialogDescription.vue';
6 | export { default as AlertDialogTitle } from './AlertDialogTitle.vue';
7 |
--------------------------------------------------------------------------------
/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/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/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/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/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/FormMessage.vue:
--------------------------------------------------------------------------------
1 |
10 |
11 |
12 |
18 |
19 |
--------------------------------------------------------------------------------
/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/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/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/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/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/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/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/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/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 TabsChrome } from './tabs-chrome/tabs.vue';
2 | export { default as Tabs } from './tabs/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 { LOGIN_PATH } from '@vben/constants';
19 | ```
20 |
--------------------------------------------------------------------------------
/packages/constants/src/core.ts:
--------------------------------------------------------------------------------
1 | /**
2 | * @zh_CN 登录页面 url 地址
3 | */
4 | export const LOGIN_PATH = '/auth/login';
5 |
6 | export interface LanguageOption {
7 | label: string;
8 | value: 'en-US' | 'zh-CN';
9 | }
10 |
11 | /**
12 | * Supported languages
13 | */
14 | export const SUPPORT_LANGUAGES: LanguageOption[] = [
15 | {
16 | label: '简体中文',
17 | value: 'zh-CN',
18 | },
19 | {
20 | label: 'English',
21 | value: 'en-US',
22 | },
23 | ];
24 |
--------------------------------------------------------------------------------
/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);
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 |
8 | export { default as Verification } from './verification/index.vue';
9 |
--------------------------------------------------------------------------------
/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-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/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 | * Custom height offset value (in pixels) to adjust content area sizing
13 | * when used with autoContentHeight
14 | * @default 0
15 | */
16 | heightOffset?: number;
17 | }
18 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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/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 | export * from './types';
3 |
--------------------------------------------------------------------------------
/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 LayoutContentSpinner } from './content-spinner.vue';
2 | export { default as LayoutContent } from './content.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/lock-screen/index.ts:
--------------------------------------------------------------------------------
1 | export { default as LockScreenModal } from './lock-screen-modal.vue';
2 | export { default as LockScreen } from './lock-screen.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 | id?: number;
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 PreferencesButton } from './preferences-button.vue';
2 | export { default as Preferences } from './preferences.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/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 { AsyncComponents, setupVbenVxeTable } from './init';
2 | export type { VxeTableGridOptions } from './types';
3 | export * from './use-vxe-grid';
4 |
5 | export { default as VbenVxeGrid } from './use-vxe-grid.vue';
6 | export type {
7 | VxeGridListeners,
8 | VxeGridProps,
9 | VxeTableInstance,
10 | VxeToolbarInstance,
11 | } from 'vxe-table';
12 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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';
2 | export { default as EmptyIcon } from './icons/empty-icon.vue';
3 | export * from './svg';
4 |
--------------------------------------------------------------------------------
/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/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 './tabbar';
3 | export * from './user';
4 |
--------------------------------------------------------------------------------
/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/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 { AppRouteRecordRaw, BasicUserInfo } from '@vben-core/typings';
2 |
3 | /** 用户信息 */
4 | interface UserInfo extends BasicUserInfo {
5 | /**
6 | * 首页地址
7 | */
8 | homePath: string;
9 | }
10 |
11 | /** 权限信息 */
12 | interface AuthPermissionInfo {
13 | user: UserInfo;
14 | roles: string[];
15 | permissions: string[];
16 | menus: AppRouteRecordRaw[];
17 | }
18 |
19 | export type { AuthPermissionInfo, UserInfo };
20 |
--------------------------------------------------------------------------------
/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/get-popup-container.ts:
--------------------------------------------------------------------------------
1 | /**
2 | * If the node is holding inside a form, return the form element,
3 | * otherwise return the parent node of the given element or
4 | * the document body if the element is not provided.
5 | */
6 | export function getPopupContainer(node?: HTMLElement): HTMLElement {
7 | return (
8 | node?.closest('form') ?? (node?.parentNode as HTMLElement) ?? document.body
9 | );
10 | }
11 |
--------------------------------------------------------------------------------
/packages/utils/src/helpers/index.ts:
--------------------------------------------------------------------------------
1 | export * from './find-menu-by-path';
2 | export * from './generate-menus';
3 | export * from './generate-routes-backend';
4 | export * from './generate-routes-frontend';
5 | export * from './get-popup-container';
6 | export * from './merge-route-modules';
7 | export * from './reset-routes';
8 | export * from './unmount-global-loading';
9 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
7 | # 对store进行加密的密钥,在将store持久化到localStorage时会使用该密钥进行加密
8 | VITE_APP_STORE_SECURE_KEY=please-replace-me-with-your-own-key
9 |
--------------------------------------------------------------------------------
/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/yudaocode/yudao-ui-admin-vben/5e090fc838d3081118d23b3446a8cab89f214fcb/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/params.ts:
--------------------------------------------------------------------------------
1 | import type { Recordable } from '@vben/types';
2 |
3 | import { requestClient } from '#/api/request';
4 |
5 | /**
6 | * 发起数组请求
7 | */
8 | async function getParamsData(
9 | params: Recordable,
10 | type: 'brackets' | 'comma' | 'indices' | 'repeat',
11 | ) {
12 | return requestClient.get('/status', {
13 | params,
14 | paramsSerializer: type,
15 | responseReturn: 'raw',
16 | });
17 | }
18 |
19 | export { getParamsData };
20 |
--------------------------------------------------------------------------------
/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/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 |
--------------------------------------------------------------------------------
/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/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 |
--------------------------------------------------------------------------------