├── .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 | 10 | -------------------------------------------------------------------------------- /apps/web-antd/src/views/_core/authentication/qrcode-login.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 11 | -------------------------------------------------------------------------------- /apps/web-antd/src/views/_core/fallback/coming-soon.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 8 | -------------------------------------------------------------------------------- /apps/web-antd/src/views/_core/fallback/forbidden.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | -------------------------------------------------------------------------------- /apps/web-antd/src/views/_core/fallback/internal-error.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | -------------------------------------------------------------------------------- /apps/web-antd/src/views/_core/fallback/not-found.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | -------------------------------------------------------------------------------- /apps/web-antd/src/views/_core/fallback/offline.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | -------------------------------------------------------------------------------- /apps/web-antd/src/views/bpm/oa/leave/detail.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 12 | -------------------------------------------------------------------------------- /apps/web-antd/src/views/crm/business/modules/detail.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | -------------------------------------------------------------------------------- /apps/web-antd/src/views/crm/contact/modules/detail.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | -------------------------------------------------------------------------------- /apps/web-antd/src/views/crm/contract/modules/detail.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | -------------------------------------------------------------------------------- /apps/web-antd/src/views/crm/customer/modules/detail.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | -------------------------------------------------------------------------------- /apps/web-antd/src/views/crm/permission/components/PermissionForm.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | -------------------------------------------------------------------------------- /apps/web-antd/src/views/crm/permission/components/PermissionList.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 16 | -------------------------------------------------------------------------------- /apps/web-antd/src/views/crm/permission/components/TransferForm.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | -------------------------------------------------------------------------------- /apps/web-antd/src/views/crm/product/modules/detail.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | -------------------------------------------------------------------------------- /apps/web-antd/src/views/crm/receivable/modules/detail.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | -------------------------------------------------------------------------------- /apps/web-antd/src/views/crm/receivable/plan/modules/detail.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 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 | 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 | 10 | -------------------------------------------------------------------------------- /apps/web-ele/src/views/_core/authentication/qrcode-login.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 11 | -------------------------------------------------------------------------------- /apps/web-ele/src/views/_core/fallback/coming-soon.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 8 | -------------------------------------------------------------------------------- /apps/web-ele/src/views/_core/fallback/forbidden.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | -------------------------------------------------------------------------------- /apps/web-ele/src/views/_core/fallback/internal-error.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | -------------------------------------------------------------------------------- /apps/web-ele/src/views/_core/fallback/not-found.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | -------------------------------------------------------------------------------- /apps/web-ele/src/views/_core/fallback/offline.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 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 | 10 | -------------------------------------------------------------------------------- /apps/web-naive/src/views/_core/authentication/qrcode-login.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 11 | -------------------------------------------------------------------------------- /apps/web-naive/src/views/_core/fallback/coming-soon.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 8 | -------------------------------------------------------------------------------- /apps/web-naive/src/views/_core/fallback/forbidden.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | -------------------------------------------------------------------------------- /apps/web-naive/src/views/_core/fallback/internal-error.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | -------------------------------------------------------------------------------- /apps/web-naive/src/views/_core/fallback/not-found.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | -------------------------------------------------------------------------------- /apps/web-naive/src/views/_core/fallback/offline.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 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 | 7 | -------------------------------------------------------------------------------- /docs/src/demos/vben-count-to-animator/custom/index.vue: -------------------------------------------------------------------------------- 1 | 4 | 13 | -------------------------------------------------------------------------------- /docs/src/demos/vben-drawer/auto-height/index.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | 22 | -------------------------------------------------------------------------------- /docs/src/demos/vben-drawer/basic/index.vue: -------------------------------------------------------------------------------- 1 | 6 | 12 | -------------------------------------------------------------------------------- /docs/src/demos/vben-drawer/extra/drawer.vue: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /docs/src/demos/vben-drawer/extra/index.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | 22 | -------------------------------------------------------------------------------- /docs/src/demos/vben-ellipsis-text/tooltip/index.vue: -------------------------------------------------------------------------------- 1 | 4 | 15 | -------------------------------------------------------------------------------- /docs/src/demos/vben-modal/auto-height/index.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | 22 | -------------------------------------------------------------------------------- /docs/src/demos/vben-modal/basic/index.vue: -------------------------------------------------------------------------------- 1 | 6 | 12 | -------------------------------------------------------------------------------- /docs/src/demos/vben-modal/draggable/index.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | 22 | -------------------------------------------------------------------------------- /docs/src/demos/vben-modal/draggable/modal.vue: -------------------------------------------------------------------------------- 1 | 8 | 11 | -------------------------------------------------------------------------------- /docs/src/demos/vben-modal/extra/index.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | 22 | -------------------------------------------------------------------------------- /docs/src/demos/vben-modal/extra/modal.vue: -------------------------------------------------------------------------------- 1 | 6 | 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 | ![](https://unpkg.com/@vbenjs/static-source@0.1.7/source/sponsor.png) 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 | 14 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/alert-dialog/AlertDialogCancel.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 14 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/alert-dialog/AlertDialogOverlay.vue: -------------------------------------------------------------------------------- 1 | 6 | 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 | 14 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/avatar/AvatarImage.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 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 | 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 | 12 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/breadcrumb/BreadcrumbItem.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 18 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/breadcrumb/BreadcrumbList.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 21 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/breadcrumb/BreadcrumbPage.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 19 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/breadcrumb/BreadcrumbSeparator.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 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 | 21 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/card/CardContent.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 14 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/card/CardDescription.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 14 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/card/CardFooter.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 14 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/card/CardHeader.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 14 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/card/CardTitle.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 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 | 14 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/context-menu/ContextMenuPortal.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 14 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/context-menu/ContextMenuShortcut.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 18 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/context-menu/ContextMenuTrigger.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 16 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/dialog/Dialog.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 17 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/dialog/DialogClose.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 14 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/dialog/DialogFooter.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 16 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/dialog/DialogHeader.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 16 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/dialog/DialogOverlay.vue: -------------------------------------------------------------------------------- 1 | 9 | 12 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/dialog/DialogTrigger.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 14 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/dropdown-menu/DropdownMenuGroup.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 14 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/dropdown-menu/DropdownMenuShortcut.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 14 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/form/FormDescription.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 21 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/form/FormItem.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | 21 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/form/FormMessage.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 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 | 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 | 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 | 14 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/select/SelectLabel.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 16 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/select/SelectValue.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 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 | 14 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/sheet/SheetFooter.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 16 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/sheet/SheetHeader.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 12 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/sheet/SheetOverlay.vue: -------------------------------------------------------------------------------- 1 | 9 | 12 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/sheet/SheetTrigger.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 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 | 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 | 14 | -------------------------------------------------------------------------------- /packages/@core/ui-kit/shadcn-ui/src/ui/tooltip/TooltipTrigger.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 10 | -------------------------------------------------------------------------------- /playground/src/views/_core/authentication/qrcode-login.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 11 | -------------------------------------------------------------------------------- /playground/src/views/_core/fallback/coming-soon.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 8 | -------------------------------------------------------------------------------- /playground/src/views/_core/fallback/forbidden.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | -------------------------------------------------------------------------------- /playground/src/views/_core/fallback/internal-error.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | -------------------------------------------------------------------------------- /playground/src/views/_core/fallback/not-found.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | -------------------------------------------------------------------------------- /playground/src/views/_core/fallback/offline.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | -------------------------------------------------------------------------------- /playground/src/views/demos/access/admin-visible.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 12 | -------------------------------------------------------------------------------- /playground/src/views/demos/access/menu-visible-403.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 12 | -------------------------------------------------------------------------------- /playground/src/views/demos/access/super-visible.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 12 | -------------------------------------------------------------------------------- /playground/src/views/demos/access/user-visible.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 12 | -------------------------------------------------------------------------------- /playground/src/views/demos/active-icon/index.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 12 | -------------------------------------------------------------------------------- /playground/src/views/demos/breadcrumb/level-detail.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 12 | -------------------------------------------------------------------------------- /playground/src/views/demos/features/hide-menu-children/parent.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 18 | -------------------------------------------------------------------------------- /playground/src/views/demos/features/menu-query/index.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 12 | -------------------------------------------------------------------------------- /playground/src/views/demos/features/new-window/index.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 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 | 8 | -------------------------------------------------------------------------------- /playground/src/views/demos/nested/menu-2-1.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 8 | -------------------------------------------------------------------------------- /playground/src/views/demos/nested/menu-3-1.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 8 | -------------------------------------------------------------------------------- /playground/src/views/demos/nested/menu-3-2-1.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 8 | -------------------------------------------------------------------------------- /playground/src/views/examples/modal/drag-demo.vue: -------------------------------------------------------------------------------- 1 | 17 | 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 | --------------------------------------------------------------------------------